恢复 ext4 超级块

恢复 ext4 超级块

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

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

fdisk -l /dev/sdb显示:

   Device Boot      Start         End      Blocks   Id  System
     /dev/sdb1          1  1953525167   976762583+  ee  GPT

testdisk显示分区完好:

1 P MS Data                     2049 1953524952 1953522904 [ears]

...但是分区无法挂载:

$ 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,

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

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

dumpe2fs还:

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

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

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

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

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


我也跑过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

使用这些值运行 e2fsck 给出:

e2fsck: Bad magic number in super-block while trying to open /dev/sdb1

我尝试了所有超级块testdisk.log

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

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


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

$ sudo losetup -v -o $i /dev/loop0 /dev/sdb

...而跑步testdisk /dev/loop0,我没有发现任何有趣的东西。


我已经相当详尽了,但是有吗反正不借助低级文件恢复工具(foremost/ photorec)来恢复文件系统?

答案1

不幸的是,我无法恢复文件系统,不得不求助于较低级别的数据恢复技术(Ubuntu 的数据恢复维基条目),其中侦探套件事实证明最有用。

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

答案2

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

如果您完全确定原始块大小是 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.

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

答案3

如前所述,可能已经过时,但 fdisk (AFAIK) 不支持 GPT 磁盘。您需要使用parted或其他一些工具。

我刚刚测试了运行 Debian squeeze(内核 2.6.32-5-486)的虚拟机,并使用 parted 将虚拟磁盘格式化为 GPT ...

# parted /dev/sde
(parted) mklabel GPT
(parted) mkpart part1 0 10G
(parted) quit
# fdisk -l /dev/sde
.
WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.
.
Disk /dev/sde: 85.9 GB, 85899345920 bytes
 255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
. 
   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1       10444    83886079+  ee  GPT

这是 fdisk 版本 2.17.2 (util-linux-ng)。

mkfs 和 fsck 应该可以选择“真实”分区,但是为了检查 GPT 分区表没有损坏,您应该使用 GNU parted。

答案4

  • 制作棒的完整图像(在我的例子中,是 Micro SD 卡)。

  • 将图像恢复到新的 MicroSD 卡。

  • 跑步

    fsck.ext4 -f /dev/sdXY
    

    (其中sdXY替换为新MicroSD卡的实际设备名称)

    如果询问是否应该修复错误,请回答“是”。

  • 完成后,它对我来说再次工作得很好。

相关内容