为什么我可以放心,GNU Parted 在缩小分区后没有损坏任何一位?

为什么我可以放心,GNU Parted 在缩小分区后没有损坏任何一位?

我缩小了根分区,看起来不错。但我现在正在考虑至少覆盖备份副本(外部驱动器、rsync、每周备份)中最重要的文件,以确保我的文件在收缩过程中不会损坏。这可能是浪费时间(并且可能会导致更多的碎片)。

我可以通过与备份中的文件进行 CRC 比较(例如使用 md5sum)来检查在收缩期间移动文件后文件是否正常,正如一位 unser 在他的回答中善意地说的那样。

但具体来说,我想对 GNU Parted 使用的算法进行简短的解释,以确保在缩小分区之前将信息从磁盘的一个扇区移动到另一个扇区时不会发生数据损坏。是否有这样的算法,或者程序盲目地复制字节?我想读一个简单的解释。

答案1

为什么我可以放心,GNU Parted 在缩小分区后没有损坏任何一位?

事实上, gparted man页面清楚地表明(在 下NOTES):

Editing partitions has the potential to cause LOSS of DATA.
......
You are advised to BACKUP your DATA before using the gparted application.

调整分区大小后重新启动系统并运行fsck。如果没有发现任何错误,则操作成功并且数据完好无损。
过去gparted在调整分区大小时曾出现数据损坏的问题,即使它没有报告任何错误(例如,请参阅他们论坛上的这个帖子以及链接的警告)。


调整大小时,(g)partedmoves the END position of partition NUMBER. It does not modify any filesystem present in the partition.下面,gparted使用fs特定的工具来增大/缩小文件系统。
您可以根据在线获取每个操作的详细信息手动的:

  • To view more information, click Details. The application displays more details about operations.

  • To view more information about the steps in each operation, click the arrow button beside each step.

让我们看看收缩ext4分区时它实际上做了什么(跳过calibrate&fsck步骤):

shrink file system  00:00:02    ( SUCCESS )

resize2fs -p /dev/sdd1 409600K

Resizing the filesystem on /dev/sdd1 to 409600 (1k) blocks.
Begin pass 3 (max = 63)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/sdd1 is now 409600 (1k) blocks long.

resize2fs 1.42.12 (29-Aug-2014)

正如您所看到的,gparted什么也不做,它只是resize2fs -p使用指定的设备和新的大小作为参数进行调用。如果您对算法感兴趣,可以看看resize2fs.c。简而言之:

Resizing a filesystem consists of the following phases:

1.  Adjust superblock and write out new parts of the inode table
2.  Determine blocks which need to be relocated, and copy the
    contents of blocks from their old locations to the new ones.
3.  Scan the inode table, doing the following:
       a.  If blocks have been moved, update the block
              pointers in the inodes and indirect blocks to
              point at the new block locations.
       b.  If parts of the inode table need to be evacuated,
              copy inodes from their old locations to their
              new ones.
       c.  If (b) needs to be done, note which blocks contain
              directory information, since we will need to
              update the directory information.
4.  Update the directory blocks with the new inode locations.
5.  Move the inode tables, if necessary.

文件系统大小调整应该是一个安全的操作,根据其中一位作者的说法,特德·曹:

resize2fs 的设计目的是,即使有人在操作时按下大红色开关,也不会损坏数据。这是一个明确的设计目标。

但像所有代码一样,不是无错误。调整大小完成
后,缩小分区:fsgparted

shrink partition from 500.00 MiB to 400.00 MiB  00:00:00    ( SUCCESS )

old start: 2048
old end: 1026047
old size: 1024000 (500.00 MiB)
new start: 2048
new end: 821247

new size: 819200 (400.00 MiB)

底线:在更改分区/文件系统之前始终备份数据,并fsck在更改后运行。

答案2

有几个实用程序以类似的方式运行,您可以使用它们:md5sum, sha1sum... sha512sum

在您当前的分区上:

find . -type f -print0 | xargs -0 md5sum > /var/tmp/checksum.lst

然后在你的备份目录中:

< /var/tmp/checksum.lst md5sum -c 

您可以替换md5sum为任何其他命令。尽管md5sumsha1sum不再安全(例如,可以伪造不同的文件并给出相同的哈希值),但较长哈希值的额外计算时间并不能让您对文件是否相同有更多的信心。

相关内容