如何确定使用 LUKS 和 XFS 的磁盘上哪些文件受到坏块影响?

如何确定使用 LUKS 和 XFS 的磁盘上哪些文件受到坏块影响?

这是我的设置:没有分区,只有 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 标头大小是否错误?我需要减去某种额外的偏移量吗?

相关内容