我应该对“克隆多重声明的块<y>”回答是吗?运行 e2fsck 时?

joh*_*est 11 ext4 lvm fsck e2fsck

当运行 e2fsck -cck /dev/mapper/xxx 我被提示

   has 487 multiply-claimed block(s), shared with 84 file(s): 
    ... (inode #221446306, mod time Tue Feb 20 19:48:38 2018) 
    ... (inode #221446305, mod time Tue Feb 20 19:48:32 2018) 
    ... (inode #221446304, mod time Tue Feb 20 19:48:38 2018) 
    ... (inode #221446303, mod time Tue Feb 20 19:48:12 2018) 
    ... (inode #221446302, mod time Tue Feb 20 19:59:04 2018) 
    ... (inode #221446300, mod time Tue Feb 20 19:47:52 2018) 
Clone multiply-claimed blocks<y>?
Run Code Online (Sandbox Code Playgroud)

继续选择“是”可能会产生什么后果。会不会完全丢失数据?如果继续没有结果是什么?

Ste*_*itt 15

多重声明的块是被多个文件使用的块,当它们不应该被使用时。这样做的一个后果是,对受影响块之一中这些文件之一的更改也将显示为对共享块的文件的更改,这不是您想要的。(硬链接是一个不同的场景,这里没有显示。)

如果这里有数据丢失,它已经发生了,不会轻易逆转;但它可能会变得更糟......

如果您对fsck问题回答“否” ,则文件系统将保持不一致状态。如果您回答“是”,fsck则将复制共享块,以便将它们重新分配到单个文件中——这里涉及 84 个文件,每个块将被复制 83 次。这将避免未来的数据丢失,因为如您所料,对文件的更改将仅限于每个单独的文件。但是,克隆块可能涉及覆盖其他块中的数据,这些块当前似乎未使用,但可能包含您想要保留的数据。

因此,传统的数据恢复建议适用:如果您认为需要从文件系统中恢复数据,请不要接触它;在另一个磁盘上制作它的副本,然后处理它以恢复数据。这里可能需要的场景如下。文件 A 和 B 曾经是分开的,但是在某处发生了一些损坏之后,文件 B 现在与文件 A 共享块。如果没有任何东西覆盖文件 B 的旧块,数据仍然存在,但不再可访问。只要没有任何东西覆盖这些块,它们就可以被恢复(可能需要相当多的努力)。但是一旦它们被覆盖,它们就消失了;在这里,从文件 A 克隆共享块可能会覆盖旧数据......

总之,如果您有备份,或者您知道数据可以轻松恢复,请回答“是”。否则,停止fsck,将文件系统复制到其他地方,如果您需要系统备份并运行,请fsck再次运行并回答“是”(并从副本中恢复数据)。如果数据很重要并且需要恢复,请将文件系统复制到其他地方,但不要管原来的文件系统——如果您需要系统备份和运行,请制作另一个副本并在运行后运行系统fsck