我如何测试以查看是否所有写入硬盘的内容都与其4k扇区对齐?


9

我正在将Linux与4个使用4k扇区的硬盘一起使用。我的文件系统和原始设备之间有几层:磁盘> Linux Raid 5> dm-crypt> LVM。

我发现的每个资源都说明了如何设置每一层,以确保该层顶部的写入将与4k扇区边界对齐。但是,我还没有发现任何可以解释如何验证对硬盘驱动器的写入实际上是在4k边界上发生的事情。

我对重新检查设置以使用逻辑来确定其是否正确对齐不感兴趣。我想检查对磁盘进行写操作时实际发生的情况。

如何记录或查看对硬盘进行的写入的地址和大小,以便验证它们是否正确对齐?

Answers:


2

不久前问我自己同样的问题,然后简单地执行以下操作:

用外壳几次将一个非常不寻常的字符串写入文件(类似于“ WackaWacka”),然后用十六进制转储(使用od)简单地搜索磁盘的实际内容,并检查是否存储了字符串的第一次出现恰好在4k块的开头

提示:不要使用编辑器-它可能会创建您不知道的临时文件,其中也可能包含字符串。这样做:

 $ for i in 1 2 3 4 5 ...
 >  do
 >   echo "WackaWacka!"
 >  done > mytestfile

因此.sh_history可能包含搜索字符串,但不能连续5次;-)

然后,只需搜索:

 # sync
 # od -c /dev/sda | grep 'W   a   c   k   a'

好吧,最好在相当空的磁盘上完成操作,以免读取千兆字节的数据;-)


1
由于dm-crypt是堆栈中的一层,因此该解决方案是不够的,因为这些字符将不会写入磁盘。
Brian Pellin

那很糟。我只能想到的其他解决方案是显式更改文件中的一个4k块,并检查是否仅更改了磁盘上一个物理块的内容(或者是否影响了两个连续的块),并且这仅在未压缩数据的情况下有效通过加密层。不过,必须知道,文件存储在哪个磁盘块上,并且在大型磁盘上搜索任何更改可能很困难。
ktf

2

编写一个4k的块,并观察使用iostat(“ Blk_read”,“ Blk_wrtn”列)读取/写入多少数据。如果数据未对齐,则写入将首先触发读取,并且将触发超过4k的写入。

你需要小心不要测量任何元数据更新,但...或者只是淹没出来通过制作4K写入1000 ....所以一定要确保没有其他扫描磁盘或举行公开的文件(我想lsof会足够?),然后打开一个新文件,等待,运行iostat,将4k写入文件,同步写入(或等待一会儿?),然后iostat再次检查。

这似乎为我提供了合理的输出:

iostat  -d /dev/hdb3
dd if=/dev/urandom of=/mount/path/ofhdb3/tmptest bs=4k count=10000 conv=fdatasync
iostat  -d /dev/hdb3

Note iostat的手册页声称报告了512字节的块,而我看到仅写入了80000个附加块,而没有读取任何块。如果您的对齐方式不正确,您将看到类似的读取次数(因为要写入未对齐的4k,需要读取受影响的两个块,对其进行变异并写回)。实际上,对齐很重要的唯一原因是避免进行此类读取(因此,这正是您要查找的内容:写入工作负载是否会触发读取?)


您是否知道iostat是否报告操作系统对块设备进行的读取/写入次数,或者该数字基于驱动器报告它已读取和写入了多少块?
布莱恩·佩林

我怀疑它来自操作系统块设备抽象,而不是直接来自驱动器,但我不确定。我也不确定它是在dm-crypt层的“上方”还是“下方”。
PT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.