ext(4?) 文件系统是否本质上以更容易损坏的方式存储较新的数据?

dot*_*hen 7 ext4 corruption

我最近有一个损坏的 ext4 文件系统抛出这些错误:

kubuntu@kubuntu:~$ sudo mount -t ext4 /dev/sdc2 c1
mount: wrong fs type, bad option, bad superblock on /dev/sdc2,
  missing codepage or helper program, or other error
  In some cases useful info is found in syslog - try
  dmesg | tail  or so

kubuntu@kubuntu:~$ sudo fsck.ext4 -v /dev/sdc2
e2fsck 1.42.5 (29-Jul-2012)
    fsck.ext4: Attempt to read block from filesystem resulted in short read while trying to open /dev/sdc2
Could this be a zero-length partition?

kubuntu@kubuntu:~$ dmesg | tail
[ 2684.532855] Descriptor sense data with sense descriptors (in hex):
[ 2684.532858]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 2684.532876]         05 3f c8 b0 
[ 2684.532885] sd 5:0:0:0: [sdc]  
[ 2684.532893] Add. Sense: Unrecovered read error - auto reallocate failed
[ 2684.532898] sd 5:0:0:0: [sdc] CDB: 
[ 2684.532902] Read(10): 28 00 05 3f c8 b0 00 00 08 00
[ 2684.532917] end_request: I/O error, dev sdc, sector 88066224
[ 2684.532927] Buffer I/O error on device sdc2, logical block 22
[ 2684.532973] ata6: EH complete
Run Code Online (Sandbox Code Playgroud)

使用 恢复分区后e2fsck -f -b 32768,我注意到磁盘上最旧的文件大部分都被保留了下来,而且大部分未恢复的文件都是最新的文件,因此没有备份。

丢失最新文件并保留最旧文件是 ext4 固有的特性,还是只是运气不好?是否有任何文件系统在损坏时往往会丢失旧文件并保留新文件?

dir*_*rkt 2

部分答案:

文件系统上的超级块已变得不可读。超级块是最重要的块,因为它包含文件系统如何设置的信息。

所有较新的文件系统都使用所谓的日志:新的或更改的块首先写入某个连续区域,并最终替换“正常”区域中的块。这使得恢复变得更容易:恢复程序查看日志,检查故障之前完成了哪些事务,然后可以将文件系统恢复到与上次成功事务一致的状态。这也意味着恢复后最新的更改会丢失,但通常这些只是很小的更改。

很难说出你的情况发生了什么,因为你没有提供有关恢复过程如何进行的信息。文件系统包含超级块的副本,因此您应该能够使用副本而不是损坏的副本,从副本访问日志,并将文件系统恢复到与问题发生之前几乎相同的状态。

正如您所说,您丢失了相当多的新文件,我的猜测是恢复程序无法恢复超级块,因此做出了一些假设,因此或由于其他原因找不到日志,所以您丢失了日志中的所有更改,而不仅仅是最后一个不完整的事务。

一般来说,较新的文件系统(如 ext4)比较旧的文件系统(如 ext2 或 FAT)更擅长恢复(可能在恢复期间需要一些手动输入)。如果这些被损坏,您就会丢失所有被损坏的东西。在日志文件系统中,几乎总是可以回到某个一致的状态,该状态与问题发生时的状态相距不远。因此,该主题的问题的答案是“完全不是,恰恰相反”。

您可以使用挂载选项来影响写入日志和提交事务的频率和方式,这样您就可以用增加的恢复机会来换取性能。