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。