恢复 ext4 超级块

tlv*_*nce 57 filesystems ext4 data-recovery superblock

最近,我的外部硬盘驱动器机箱出现故障(硬盘驱动器本身在另一个机箱中通电)。然而,结果是,它的 EXT4 文件系统似乎已损坏。

该驱动器具有单个分区并使用 GPT 分区表(带有标签ears)。

fdisk -l /dev/sdb 显示:

   Device Boot      Start         End      Blocks   Id  System
     /dev/sdb1          1  1953525167   976762583+  ee  GPT
Run Code Online (Sandbox Code Playgroud)

testdisk 显示分区完好无损:

1 P MS Data                     2049 1953524952 1953522904 [ears]
Run Code Online (Sandbox Code Playgroud)

...但分区无法挂载:

$ sudo mount /dev/sdb1 a
mount: you must specify the filesystem type
$ sudo mount -t ext4 /dev/sdb1 a 
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
Run Code Online (Sandbox Code Playgroud)

fsck 报告无效的超级块:

$ sudo fsck.ext4 /dev/sdb1            
e2fsck 1.42 (29-Nov-2011)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

e2fsck报告类似的错误:

$ sudo e2fsck /dev/sdb1        
Password: 
e2fsck 1.42 (29-Nov-2011)
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

dumpe2fs 还:

$ sudo dumpe2fs /dev/sdb1                      
dumpe2fs 1.42 (29-Nov-2011)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

mke2fs -n(注意, -n) 返回超级块:

$ sudo mke2fs -n /dev/sdb1       
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61054976 inodes, 244190363 blocks
12209518 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
7453 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848
Run Code Online (Sandbox Code Playgroud)

...但是为每个块尝试“e2fsck -b [block]”失败:

$ sudo e2fsck -b 71663616 /dev/sdb1 
e2fsck 1.42 (29-Nov-2011)
e2fsck: Invalid argument while trying to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,这些是创建文件系统时超级块所在的位置,这并不一定意味着它们仍然完好无损。


如果有人可以解密日志,我还进行了testdisk 深入搜索。它提到了许多条目,例如:

recover_EXT2: s_block_group_nr=1/7452, s_mnt_count=6/20,
s_blocks_per_group=32768, s_inodes_per_group=8192
recover_EXT2: s_blocksize=4096
recover_EXT2: s_blocks_count 244190363
recover_EXT2: part_size 1953522904
recover_EXT2: "e2fsck -b 32768 -B 4096 device" may be needed
Run Code Online (Sandbox Code Playgroud)

使用这些值运行 e2fsck 给出:

e2fsck: Bad magic number in super-block while trying to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

我在所有超级块中尝试过 testdisk.log

for i in $(grep e2fsck testdisk.log | uniq | cut -d " " -f 4); do
   sudo e2fsck -b $i -B 4096 /dev/sdb1
done
Run Code Online (Sandbox Code Playgroud)

...都带有相同的e2fsck错误消息。


在我最后一次尝试中,我尝试了不同的文件系统偏移量。对于每个偏移量i,其中i是 31744、32768、1048064、1049088 之一:

$ sudo losetup -v -o $i /dev/loop0 /dev/sdb
Run Code Online (Sandbox Code Playgroud)

...运行testdisk /dev/loop0,我没有发现任何有趣的东西。


我已经相当详尽了,但是有没有办法在不求助于低级文件恢复工具 ( foremost/ photorec) 的情况下恢复文件系统?

tlv*_*nce 20

不幸的是,我无法恢复文件系统,不得不求助于较低级别的数据恢复技术(在 Ubuntu 的数据恢复wiki 条目中有很好的总结),其中Sleuth Kit被证明是最有用的。

为了清洁起见,标记为已回答。


Jar*_*nen 13

这可能已经过时了,但有一些建议:

如果您绝对确定原始块大小为 4096,如 所述testdisk,您可以使用 重写磁盘上的超级块mke2fs -S。来自男人:

   -S    Write  superblock and group descriptors only.  This is useful if all
          of the superblock and backup superblocks are corrupted, and a  last-
          ditch  recovery method is desired.  It causes mke2fs to reinitialize
          the superblock and group descriptors, while not touching  the  inode
          table and the block and inode bitmaps.  The e2fsck program should be
          run immediately after this option is used, and there is no guarantee
          that  any  data  will be salvageable.  It is critical to specify the
          correct filesystem blocksize when using this option, or there is  no
          chance of recovery.
Run Code Online (Sandbox Code Playgroud)

如果您不确定正确的块大小,请使用mke2fs -n -b 2048 /dev/sdb1并尝试此命令提供的所有超级块备份,然后相同但使用最后一个块大小 1024。