delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

31 Dec 2009

文件系统与大扇区

大扇区(超过旧式标准的512字节扇区)是改善硬件工艺或访问方式以后的一种直接提高存储密度的方法。对于磁介质来说,其盘片被分成若干的磁道(通常是同心圆)、每个磁道分成若干的扇区或称扇段,扇区是磁盘读写时的最小操作单元。对于基于闪存的存储设备而言,扇区则是一种模拟传统磁盘的概念。

对于磁盘来说,由于它是一种机械和电子一体化设备,由于各种原因的限制,其寻址和持续读写的可靠性方面都有一定的限制,例如,马达维持同样的转速,且磁头能够稳定在同一个位置,并将数据可靠地连续读写,可能只能持续8KiB或16KiB,为了提高可靠性,我们往往会需要在这之后重新校准设备。另一方面,对于随机写入的情形,较小的数据块有时会更为有利,同时,避免对磁介质的不必要的反复覆写,也有助于提高其使用寿命。因此,在磁道的基础上又引入了扇区的概念。

现代磁盘的设计中,扇区除了用户可见的部分之外,其前后还有一定的空隙用于定位和校验。这些空隙和其附近的介质一样可以用来保存数据,只是制造商和操作系统的撰写者通常不推荐使用这些空间。软盘上的这些空隙在DOS时代可以通过对控制器直接编程并改变扇区尺寸的方式强制覆写,并用类似的方法读出,从而起到一定的保密效果。

随着制造工艺的改善,现今的硬盘在十年前就早已不必受限于512字节的限制。由于在每个扇区前后都需要添加一些信息会浪费一部分空间并增加潜在的定位开销,因此硬盘制造商开始推出4KiB扇区的磁盘。这种磁盘在系统检测时会仍然汇报扇区尺寸是512字节,但物理扇区则是4KiB,并保持现有的512字节编址方式不便,从而与现有的BIOS保持兼容。

另一种已经存在一段时间的大扇区是Flash设备。这类设备采用的方法类似,不过其大扇区更多地是出于制造和避免不必要的擦写而不是提高存储密度考虑。

最后一种大扇区是RAID。许多RAID级别是一次性操作一整个stripe的,此时这种stripe也可以视为一种大扇区。

对于大扇区的支持主要是操作系统,特别是文件系统的责任,而应用程序只需确保自己操作的记录尽量是对齐的整块(例如,16K的记录,在文件中的偏移量都是从16K的整数倍开始)。文件系统需要保证应用程序对于磁盘的这种预期是能够满足的,换言之,文件系统的数据结构不应在磁盘上导致新的不对齐问题,这类不对齐可能是由于分区格式引起,也可能是文件系统本身的设计问题,如果存在这样的问题,操作系统中都需要予以纠正:例如,传统上从第63个512字节逻辑扇区开始的分区,可以牺牲掉一个512字节单元来换取对齐4KiB物理扇区的目的,由于对齐写入和读出操作需要的实际物理操作要少一半左右,因此这样做能够显著地改善性能并提高设备的使用寿命。

FreeBSD 9-CURRENT中目前已经支持通过GEOM子系统的stripe信息来描述磁盘或RAID的物理扇区尺寸以及GEOM相对于物理扇区的偏移量。新的ahci(4)驱动目前已经能够提供相关的GEOM信息给更上层的驱动程序了。