无论是为了防止数据泄露,还是更改硬盘格式,我们通常会进行格式化操作。在Windows或Linux shell中对SSD进行格式化(format)时,往往需要几分钟甚至几十分钟,这个时间通常与硬盘容量成正比。那么在这段时间里,SSD到底做了些什么操作呢?
为更好地理解本文,这里需要介绍一些SSD的工作原理。熟悉NVMe协议的读者可跳过此部分。
-
NVMe over PCIe数据传输原理
如图所示,主机和SSD控制器(下文统一称为“控制器”)通过队列对(Queue Pair)进行管理命令(Admin Command)和IO命令(I/O Command)的交互。主机将命令提交到发布队列(Submission Queue),控制器从发布队列中获取命令,执行完成后将命令完成消息提交到完成队列(Completion Queue),主机从完成队列获取命令完成消息,认为此命令执行完成。
-
LBA格式
如上图所示,硬盘格式主要体现在三个方面:
1、Sector Size:图中LBA n Data区域,表示硬盘进行读写操作时的逻辑块大小(通常为512或4096字节);
2、Metadata Size:表示主机允许携带的元数据大小以及Metadata的传输方式(如图所示,Extend Buffer传输和Separate Buffer传输);
3、PI(Protection Information):指是否有PI以及其在Metadata中的位置(在Metadata的起始字节还是末尾字节)。协议要求在1.0及以后的版本中,PI信息需放在Metadata的末尾字节。
在Linux下使用nvme list命令可以查看系统中的NVMe设备信息,其中红框标注的字段表示当前硬盘的LBA格式:
(1)Sector Size = 512B,Metadata Size = 0,没有PI数据;
(2)Sector Size = 4096B,Metadata Size = 0,没有PI数据。
了解上述基础知识后,我们来具体看看控制器执行format时到底做了哪些操作。
1、命令参数的校验
(1)目标NSID:是否支持FFFFFFFF NSID、目标NSID是否有效。
(2)目标LBA格式:在命令中,目标格式以数组下标的形式提供给控制器,由LBAFU和LBAFL共同组成,指向特定的目标格式。
主机通过Identify命令从Namespace Identify数据结构中获取名字空间支持的目标格式。最多支持64种格式,根据命令中组成的数组索引,可以在该结构中找到目标格式规定的Sector Size和Metadata Size。
(3)PI信息:PI信息通过Metadata传输,因此支持PI信息的前提是支持Metadata。
2、停止IO调度
如下图所示的IO流程中,控制器在第3步时不再从发布队列中获取新的IO命令,但已经在控制器内存中的命令仍会继续执行。
3、将用户区数据全部落盘
IO数据经过主机内存和控制器内存这两个易失性存储后,才会写入非易失性存储NAND颗粒。在实际的固件应用中,控制器会先将主机下发的数据临时保存在控制器内存中,只有在满足一个PU(Program Unit)时,才会统一将数据刷新(FLUSH)到NAND颗粒中。在格式化时,如果主机下发的数据不满足一个PU,就需要补充虚拟数据(dummy)以达到一个PU的大小,然后再进行数据落盘。
4、下发全盘擦除命令,将所有用户数据擦除干净。
5、使用新的格式重新初始化相关硬件和数据结构。
6、根据新的format格式修改Namespace Identify数据结构,如NSZE、NCAP和格式索引等属性。
例如,当旧格式Sector Size为512字节,新格式为4096字节时,NSZE和NCAP描述的是以Sector Size为粒度的数量,因此需要将NSZE和NCAP分别除以8。
7、恢复IO调度,控制器将重新从命令发布队列中获取IO命令,并提交format结果到命令完成队列。
在主机端执行format操作如下:
首先,使用Identify命令查看支持的lbaf格式以及当前使用的格式。如下图所示,目前格式为Sector Size=4096,Metadata Size=0。
nvme list命令显示也符合上述描述:
接着,输入nvme format命令,指定nsid=1,格式索引为0(代表Sector Size=512,Metadata Size=0),切换成功后,日志(log)显示相应信息:
最后,再次使用Identify命令查看支持的lbaf格式及当前使用的格式,如下图所示,显示目前格式为Sector Size=512,Metadata Size=0:
通过使用Format NVM命令,可以在SSD所支持的不同格式之间切换,实现低级格式化的功能。由于格式化操作会擦除盘上原有的数据,因此在执行格式化之前,务必将所有的重要数据进行备份,以防数据丢失。
标签:Sector,控制器,格式化,NVMe,命令,格式,SSD,Size,Metadata From: https://blog.csdn.net/2301_78093850/article/details/143238505