delphij's Chaos

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

12 Jul 2020

geli(8)的HMAC设计

读到哪算哪的先记一笔。

geli(8)在启用了数据完整性检测的时候采取的设计是将HMAC数据保存在同一扇区中,换言之它在保存数据时,物理扇区(通常是512字节)中占用了32字节来保存HMAC数据。

这样做的考虑是每个扇区可以独立地读写和验证(如果把HMAC数据保存在临近的扇区中,例如每17个扇区一组,将HMAC数据全部保存到其中一个扇区中,则HMAC数据和扇区数据可能会有不同步的问题),代价是会浪费一些存储空间。这个空间的计算如下:

假如磁盘物理上是512字节的扇区,geli提供4096字节的扇区的介质的话,我们浪费的空间是:

  • 每个扇区可以保存 512 - 32 = 480 字节的数据
  • 4096/480=8.533333,向上取整需要9个扇区
  • 480*9-4096=224,即浪费掉了224个字节。

实践上,因为原本需要8个扇区存放的数据需要9个扇区来放,因此空间开销是1/9(大约11%)。

如果可以牺牲独立验证(即,一组扇区中如果有一个坏掉了就认为整组扇区都坏了,而不在意其中具体是哪个坏了),则一个潜在的替代方案是将整组的HMAC数据保存在同一个扇区内,这样一来所需的额外开销是1/16,即使用17个扇区来保存16个扇区的数据(假设扇区尺寸是512。如果扇区尺寸是4k,则是129个扇区可以保存128个扇区的数据)。

这一替代方案的优点是不改变数据扇区的尺寸,并且空间开销小一些(1/17,或1/129)。