收缩无分区文件系统

收缩无分区文件系统

我想通过将该磁盘(源)的完整文件系统克隆到基于相同容量的附加磁盘(目标)的虚拟块设备(devicemapper/cryptsetup)来加密磁盘上的数据。我已经在目标磁盘上设置了 LUKS 设备。

源磁盘已初始化为无分区文件系统。这意味着我需要将该文件系统缩小 2MiB(4096 块即 4096 字节)以考虑额外的 LUKS2 标头,然后将dd数据从源磁盘上的文件系统传输到 LUKS 设备。

我做了一个

resize2fs /dev/sda <newsize>

<newsize>总块数为负 4096,这似乎按预期工作。

然而,由于源磁盘是无分区的,dd仍然会复制整个磁盘 - 包括文件系统已缩小的 4096 个块。

我现在的问题是:我可以安全地假设resize2fs操作中的空闲块位于物理设备(源)的末尾,从而count=<newsize> bs=4096作为参数传递给 dd 吗?这会克隆/复制完整的文件系统吗?还是还有其他我没有考虑到的陷阱?

额外问题:为了仔细检查,是否已经有一个工具可以按块计算磁盘的 md5sum(而不是按文件系统的文件计算)?

答案1

我现在的问题是:我可以安全地假设 resize2fs 操作中的空闲块位于物理设备的末尾吗

是的,这就是您需要做出的假设,即使它是一个分区并且您要缩小它。

从而count=<newsize> bs=4096作为参数传递给dd?

我们可能会。

dd有点奇怪dd count=N bs=M不是意味着将复制 N*M 字节,只是它将发出 N 次读取,每次读取 M 字节,并为每次写入相应的写入。读取返回的字节数可能少于请求的字节数,在这种情况下,总的读取和写入将小于您想要的值。

在实践中,我从未见过 Linux 块设备返回部分读取,所以它应该可以工作。您应该检查输出,它应该显示类似“N+M 记录”之类的内容,其中第一个数字是读取的完整块的数量,第二个数字是读取的部分块的数量。 GNU dd 还应该警告不完整的读取。

无论如何,您不妨使用head -c $(( nblocks * 4096 )).

看:dd 与 cat —— 如今 dd 仍然有意义吗?dd什么时候适合复制数据? (或者,read() 和 write() 何时是部分的)

(无论如何,在根据互联网上陌生人的帖子进行任何操作之前,请仔细检查您的数字。这是您的文件系统,您不想因为别人的拼写错误而弄乱它。您可能已经知道这一点,但无论如何。)

为了仔细检查,是否已经有一个工具可以按块计算磁盘的 md5sums

您应该能够运行md5sum /dev/sdx, 或head -c $bytes /dev/sdx | md5sum.

MD5 应该可以很好地检查意外损坏或截断的副本,但请注意,一般来说,它被认为是损坏的。可以轻松创建具有相同哈希值的不同文件。对于严格使用,请改用 SHA-2 哈希值,即sha256sumsha512sum

相关内容