这是我的设置:没有分区,只有 LUKS1,然后是 XFS。
为了确认,磁盘的设置如下:磁盘安装,luksFormat,luksOpen,mkfs.xfs,安装,开始使用。
首先,坏块应使用多大的块大小?似乎:
lsblk -o NAME,PHY-SeC /dev/sdb
结果:4096
我在物理设备上运行了坏块,即:
badblocks -b 4096 /dev/sdb -sv
它发现了三个坏块。
现在我需要尝试理清 LUKS 和 XFS 的组合,以确定哪些文件可能已损坏。
LUKS1 接头尺寸是多少?
这里存在相互矛盾的信息。
cryptsetup luksDump /dev/sdb
有效负载偏移量显示为 4096,但是它的块大小是多少?
也许我可以得到 XFS 文件系统的大小(以块为单位):
xfs_info /dev/mapper/my_data:
blocks=976754134
(在“数据”行下)
badblocks 告诉我块的总数:
badblocks -b 4096 /dev/sdb -sv
Checking blocks 0 to 976754645
所以 976754645 + 1 = 976754646 磁盘上的块总数(如果这是正确的)。
976754646(坏块)- 976754134(xfs_info)= 512 个块,位于磁盘开头,用于 LUKS1 标头。
然而从这里开始:
https://www.smartmontools.org/wiki/BadBlockHowto
它说 LUKS 标头是 16 MB? (也不会是 MiB 吗?)我知道 LUKS2 标头是 16 MiB,但不确定 LUKS1 标头。从我上面的测试来看,它似乎是 2 MiB,但是cryptsetup convert
如果磁盘开头没有 16 MiB 可用空间,那么类似的东西怎么可能工作呢?与 smartmontools 文章一起出现cryptsetup convert
似乎意味着有效负载偏移的块大小为 4096。
但我无法弄清楚它如何适合磁盘,因此继续假设 4096 计数(有效负载偏移)* 512 字节块大小 = 2 MiB LUKS1 标头偏移。
2 MiB 偏移量 / 4096 块大小 = 磁盘上的前 512 个块用于 LUKS1 标头。因此,似乎我需要从 badblocks 的输出中减去 512,以进行翻译磁盘块进入文件系统块。
例如,badblocks 告诉我块 #512 是坏的,这将是 XFS 文件系统中的块 #0,等等。
我现在有了每个坏块的 XFS 块号。
现在,对于每个坏块,我执行以下操作:
xfs_db -c 'blockget -b <xfs block number>' /dev/mapper/my_data
它会告诉我索引节点号。但这里有一件奇怪的事情:我注意到输出看起来像这样:
xfs_db -c 'blockget -b 21512351' /dev/mapper/my_data
setting block 3/3847384 to data
setting inode to 7589729572 for block 3/3847384
inode 7589729572 block 21512351 at offset 34534
这到底是什么block 3/3847384
意思呢?
我记录这些索引节点号并重新挂载文件系统。
接下来,在文件系统上我执行以下操作:
find /mnt/my_data -inum <inode>
它给了我受这些坏块影响的文件。
接下来,为了测试我执行以下操作:
dd if=/path/to/file of=/dev/null iflag=direct status=progress
然而,这并没有给我找到的文件带来任何错误,而且我在坏驱动器上执行的最后一次 rsync 显示了一个完全不同的文件,其中有 io 错误,我能使用 dd 进行重现,如上所示。
那么...我的错误在哪里? LUKS 标头大小是否错误?我需要减去某种额外的偏移量吗?