尝试打开分区时的短读

dot*_*hen 9 partition ext4 fsck corruption

在我运行 Kubuntu Linux 13.04 的个人家用计算机上,我无法安装一个我非常珍视的分区。我的备份策略是每月执行一次备份,所以我从 8 月开始备份 :)。有没有办法恢复这个驱动器上的个人文件?

该驱动器是一个 1.5 年历史的 1000 GiB 西部数据绿色驱动器,home 安装在/dev/sdc2,文件系统根在/dev/sdc6,媒体文件在/dev/sdc3. 因此,当然sdc2会是一个去!据我所知,在驱动器的使用寿命期间没有停电或其他此类事件。我通过运行 Kubuntu LiveCD 设法获得了这些信息:

kubuntu@kubuntu:~$ sudo fdisk -l

Disk /dev/sdc: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes                                                                                                                                                                                                       Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00008044

  Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *        4094    88066047    44030977    5  Extended
/dev/sdc2        88066048  1419266047   665600000   83  Linux
/dev/sdc3      1419266048  1953523711   267128832   83  Linux
/dev/sdc5            4096     6146047     3070976   82  Linux swap / Solaris
/dev/sdc6         6148096    47106047    20478976   83  Linux
/dev/sdc7        47108096    88066047    20478976   83  Linux


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 debugfs -c /dev/sdc2 
debugfs 1.42.5 (29-Jul-2012)

/dev/sdc2: Attempt to read block from filesystem resulted in short read while opening filesystem
debugfs:  quit


kubuntu@kubuntu:~$ sudo fsck /dev/sdc2
fsck from util-linux 2.20.1
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:~$ 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)

帮助我 Unix & Linux,你是我们唯一的希望。

Iva*_*sov 16

(我知道这是一个老问题,我自己遇到了这个问题,并且在没有 FS 的情况下恢复了生命ddrescue,所以我会与其他遇到此问题的人分享经验)

Ext文件系统存储超级块的备份——在这种情况下。

首先,确定备份的位置(确保您有 -n 选项!否则这将用新的文件系统擦除文件系统):

mke2fs -n /dev/sdxx
Run Code Online (Sandbox Code Playgroud)

这是FS创建例程的测试运行(即无写入)。如果它正在创建文件系统,它将让您知道它将放置超级块备份的位置的偏移量。如果您知道 FS 块大小不是 4096,则还必须指定参数-b {blocksize}以获得正确的数字。

对于 4096 大小的块,第一个备份超级块将位于32768. 如果以下操作失败并显示有关错误超级块/短读的相同错误消息,请尝试从列表中选择下一个超级块备份mke2fs给您。

接下来,您可以像这样使用备份超级块挂载文件系统

mount -o sb=32768 /dev/sdxx /mnt/sdxx
Run Code Online (Sandbox Code Playgroud)

然后从文件管理器浏览 FS,复制未损坏的文件等。

或者,要实际修复 FS,您可以fsck像这样使用备份超级块运行

e2fsck -fy -b 32768 /dev/sdxx
Run Code Online (Sandbox Code Playgroud)

-f使得它扫描磁盘,即使它不是脏,-y答案是肯定的关于固定的东西所有的查询。这-b除了指定备份超级块之外,选项还将使用备份中的信息更新原始超级块。

在此之后,您应该恢复您的文件系统。

如果 e2fsck 无法写入主超级块 如果超级块由于位于坏扇区而损坏,e2fsck则将完成运行,尝试更新超级块,并显示以下错误消息:

Error writing block 1 (Attempt to write block from filesystem resulted in short write)
Run Code Online (Sandbox Code Playgroud)

显然,主超级块没有更新,整个e2fsck运行都是徒劳的。

您需要通过向其写入零来提示磁盘重新映射该扇区。感谢@Keith 指出这一点:如果输入错误下一个命令可能会造成很多混乱,因此在运行前请三重检查。这是魔法:

dd if=/dev/zero of=/dev/sdxx bs=4096 count=1 seek=0
Run Code Online (Sandbox Code Playgroud)

这会将 1 个 4096 大小的零块写入sdxx偏移量 0 处。如果您是这种情况,请不要忘记考虑不同的块大小。

之后,您将能够写入超级块(它将位于对您透明的不同物理扇区)。现在,您e2fsck再次运行上面的命令,它应该会成功写入超级块,允许您正常挂载 FS。

不言而喻现在您应该将关键数据备份到另一个物理驱动器,如果您仍然计划使用文件系统,请运行

e2fsck -fccy /dev/sdxx
Run Code Online (Sandbox Code Playgroud)

PS Kudos to @Nemo on this find:如果你的 FS 的超级块的所有备份都被损坏,mke2fs/mkfs-S选项将重新创建超级块和组描述符,就像创建一个新的文件系统一样,不涉及任何其他内容. 但是你绝对必须确保你的块大小是正确的,并且手册页说你应该e2fsck在它之后运行,并且不能保证数据被留下用于救援。阅读手册页并在此答案上加分。


Tim*_*imo 5

可能仍有希望,但您的驱动器似乎存在硬件问题(我对dmesg输出中读取错误的解释)。

您应该尝试将可从该分区恢复的内容复制到另一个驱动器上(以尽量减少磁盘访问)。使用ddrescue它,它可能需要一段时间,但如果不是所有分区的可恢复数据,它可能会获得大部分。

如果可能,请从另一张光盘、Live CD 启动,或将驱动器连接到另一台具有自己的 Linux 引导的计算机。我这样做的原因是读取错误ddrescue可能会影响其他分区的磁盘访问速度。

获得该副本后,我们将其称为原始副本,作为另一张光盘上的文件,制作该副本的副本。然后尝试对该副本进行文件系统检查。如果该恢复打乱了副本,您可以从原始副本开始,然后再试一次。