基于用闪存为储存的固态硬盘(Solid State Drive,SSD),与基于用磁性盘片为储存的传统硬盘(Hard Disk Drive,HDD)相比较,固态硬盘具有:(1)无噪音(2)耐震动(3)数据读写速度快(4)低耗电等等的优势。又随着各家闪存制造商陆续推出更多更便宜且高容量的闪存内存,在未来传统硬盘被固态硬盘所取代将是趋势。
然因闪存内存不像磁性盘片具有可重复覆写的好处,因此固态硬盘装置内都需要执行一个所谓的FTL(Flash Translation Layer)程序,以维持随时都有闲置的区块(free blocks)可以储存新写入的数据。而在一个闲置区块被用于储存客户端的写入数据时,又必须检查闲置区块数量是否足够。如果不足,则又需要进行所谓的垃圾回收(Garbage Collection,GC)让闲置区块个数,得以足够以应付未来从客户端写入的新数据。
我们知道,较早期的计算机文件系统(File System)对于被删除的文件之处理,仅仅在文件配制表(File Allocation Table)上,将被删除文件所使用的丛集(cluster),标示成「未使用状态」,这些丛集所相对应的逻辑区块地址(Logic Block Address,LBA)上所储存之数据并未被移除,这样的操作方式对可重复覆写的传统硬盘而言是合理适当的,但对不可重复覆写固态硬盘而言却是不适当的,而且会需要垃圾回收之处理。因此在较新ATAPI(ATA Packet Interface)命令规范标准,或是NVMe(NVM express)规范标准里,都加入了数据集管理(Dataset Management)命令,让较先进的计算机文件系统,可以对固态硬盘下达「将某些逻辑区块地址上的数据丢弃」,以减少固态硬盘垃圾回收的处理。不但如此,数据集管理命令也降低了固态硬盘的写入放大值(Write Amplification Index),使得固态硬盘的使用寿命得以延长。
然则,数据集管理命令为固态硬盘带来了好处,但也带来了不易被察觉的严重问题-逻辑物理块映射表不正确!底下让我们来描述逻辑物理块映射表不正确的问题,是如何发生及问题发生时的症状。
为了简化问题的描述,我们假设
1 一个物理块区块拥有4个页面
2 逻辑区块地址(LBA) 和物理区块地址(PBA) 的映射表,内容为一个数对,分别代表物理区块码(block number)与页码(page number),数对(0,0)则代表无数据
3 固态硬盘有16个逻辑区块地址
因为闪存内存不具有「重复覆写」的特性,一个逻辑区块地址的数据,存放在闪存内存的哪个位置是不固定的,因此固态硬盘里,皆存在着逻辑物理映射表(L2P Table)。这个映像表的功能,是让FTL程序查出某个逻辑区块地址之数据被储存在闪存的哪个位置(包含闪存物理区块码(block number)、页码(page number)、偏移量(offset)等)。这一个映像表需要储存一份在闪存内存里,让固态硬盘在断电后再次供电运作时,才能得知***数据在哪里。对读写速度要求高的固态硬盘,会配置足够的动态随机存取内存(Dynamic Random Access Memory,DRAM)存放这个映像表,让FTL程序可以更快速查询或更新映射表。因此固态硬盘在开始供电当下,会将储存在闪存内存里的逻辑物理映射表读到DRAM,如 Fig. 1 所示。(图中,页面标示为 FFFFFFFF代表此页面处于抹除状态;页面标示为 XXXXXXXX 代表此页面曾经被写入数据但事后被其他实体地址数据所取代或被数据集管理指令所丢弃而成为无效数据)
接下来,客户端删除文件,下达了数据集管理指令给固态硬盘,指示将 LBA1~2的数据删除,并且又下了写LBA13的指令。一般做法,固态硬盘将会执行下列步骤(Fig. 2、Fig. 3 图示说明):
1. 将LBA1、2 在映射表 (DRAM) 里更新为 (0,0)
2. 要求一个闲置的物理块区块,假设取物理区块4, 将LBA13的数据写入物理块区4,更新LBA13的逻辑物理块映像表格。
3. 发现闲置的物理块区块个数不足(少于3),启动垃圾回收,将物理区块3上的有效数据(LBA3 数据)写至物理区块4,更新LBA3的逻辑物理块映像表格,并将物理区块3 回收为闲置块(Free Block)。
如果在固态硬盘执行垃圾回收之后,计算机系统出现不稳状况突然间失去电源供应,固态硬盘将在下次电源恢复时,执行下列步骤(Fig. 4、Fig. 5 图式说明):
1. 将储存在闪存内存里的逻辑物理块映射表读到DRAM。
2. 读取区块4每一页面内容,并根据页面内容所纪录对应的逻辑区块地址,更改DRAM上的逻辑物理块映射表。
比较 Fig. 5 与Fig. 3 映射表(DRAM) 的内容会发现,逻辑区块地址1、2上的物理块对应地址有差异。也就是逻辑物理块映射表的正确性以经有错误了(Fig. 5标示为红色部分)!
Fig. 5 的逻辑物理块映射表显示,逻辑区块地址1、2数据存在于物理块区块3。实际上物理区块3已经是一个闲置区块,不存在任何数据。这样子的错误映像对FTL程序而言是一种严重的错误。事后,如果固态硬盘继续使用下去,当别的逻辑区块数据写入物理区块3之后,读取逻辑区块地址1、2会读到别的逻辑区块地址之数据。随着时间的经过,不同时间读又会有不同数据写入物理区块3,读取逻辑区块地址1、2数据还会随着时间的不同而改变。或许读者会问,既然逻辑区块地址1、2的数据已经被客户端下达数据集管理指令删除了,读到甚么数据并不重要。但读者要知道,一个储存装置必须要有数据完整(data integrity)的特性,读取的数据如果会随着时间的变动而变动,该装置就称不上拥有数据完整的特性。读者也许还会续问,既然逻辑区块地址1、2的数据已经被客户端下达数据集管理指令给删除了,客户端就不会再去读取这些地址的数据了。要知道,客户端系统不胜枚举,客户端的程序不会再去读取这些地址的数据是无法保证的。例如储存装置被用于组成独立硬盘冗余阵列(Redundant Array of Independent Disks, RAID), 其中一个硬盘发生了我们所描述的问题,这些被数据集管理指令删除的数据就会被读取.
逻辑物理块映射表与数据的一致性一直都是固态硬盘设计上存在的问题。市场上充斥着成千成百的固态硬盘产品,对那些不曾思考过这个问题的设计商,质量堪忧。一般的固态硬盘买家多以访问速度快慢做为购买的考虑因素。但聪明的读者在选购固态硬盘时应该花点时间了解该产品的设计商,是否如大心电子,有固态硬盘领先的技术质量。