我不小心使用dd
并写入了外部磁盘的前 208MB。我写的是它自己的一个分区(Debian Nestinstaller),所以我现在看到的不是我的旧(现已损坏)的 ext4 分区,而是另一个较小的分区。这限制了我可以遵循的工具和建议。
我的计划是重新创建分区表testdisk
,然后使用备份超级块修复所有内容,如下所述这里。我会丢失前 208MB,但与其中的其他 300GB 数据相比,这还算可以。像下面这样:
mke2fs -n /dev/sdb1 # doesn't work because sdb1 is the 208MB new partition
testdisk ... # used this to create new correct partition table
mke2fs -n /dev/sdb1 # now works fine, get backup superblock positions
e2fsck -b backup_position -y /dev/sdb1 # returns many errors hence the -y
然而,我已经无法挽回任何东西了。我曾经testdisk
编写一个与以前的分区表相匹配的新分区表。当我运行 e2fsck 时,我收到许多不同的错误。之后我得到了一个文件系统,但它完全是空的,没有文件。
Lost+Found 目录充满了文件(我认为是已恢复的文件),但我需要恢复目录树,而不仅仅是文件。我需要文件名和以前的目录才能知道这些文件是什么(显微镜图像、质谱数据等。如果没有名称和它们所在的目录,它们就没有任何意义)。
我得到了另一个完全相同的硬盘,并制作了整个硬盘的副本,dd
这样我就可以在不丢失任何内容的情况下尝试恢复。有什么建议吗?
答案1
我终于设法解决了这个问题。只是为了记录,这是我的做法。我找到的部分解决方案这里它涉及了解用于创建文件系统的设置(我很确定我没有更改默认值)。
基本上,我首先必须修复分区表以反映我实际拥有的分区表(我用于testdisk
此,但是parted
, cfdisk
orfdisk
也应该可以正常工作)。我刚刚删除了错误的分区,并用单个 ext4 类型分区替换,该分区覆盖了具有正确 CHS 值的整个磁盘。
其余部分主要来自开始时的链接(详细信息请阅读),但基本上我跑去mke2fs -n /dev/xxx
寻找超级块备份的位置。然后使用最接近磁盘末尾的最后一个备份(仅磁盘开头的备份被dd覆盖)来运行fsck。这会产生很多错误,但 fsck 有一个-y
选项(与 不同-a
)。
$ sudo e2fsck -a -b backup_block_number /dev/xxx
我认为这不起作用,因为我看不到任何文件,但实际上它们都已保存到该lost+found
目录中。
所以最后我挽救了大部分文件,同时保留了它们的文件名和目录结构。希望这可以帮助其他人在未来。
答案2
好的,这适用于从 MegaRAID 阵列中意外启动的驱动器中恢复。我的 RAID 控制器初始化了 RAID 中的所有驱动器,而不仅仅是我正在重建的 RAID6 阵列的驱动器。哎哟!至少我做了一个快速初始化,而不是一个缓慢的初始化 - 缓慢的初始化将驱动器擦除为零。
快速初始化会擦除驱动器开头和结尾的 10M。因此,我在整个驱动器上有一个 ext4 分区(在 Linux 下)和一个驱动器 RAID0,有一些机会。由于驱动器是 6TB 驱动器,而且上面几乎有 5TB,我都出汗了 - 这是我正在重组的 RAID6 阵列的备份!
顺便说一句,我没有犯错 - LSI MegaRAID 不应该在我的其他驱动器组中初始化驱动器 - 但它确实如此。请注意,我应该做的是从外壳中删除该驱动器,并在我拥有新安排的 RAID6 驱动器组后重新导入它。愚蠢的我。真是傻死我了......
好吧,幸运的是,LSI MegaRaid 对 RAID0 驱动器没有什么特别的作用(如果有的话,我想不确定是否有多个)。这是我修复它的方法。操作系统=Fedora F22。驱动器=一个大的ext4分区,用parted完成。首先,我将驱动器快照到一个全新的、完全相同型号的驱动器,在一个带有几个备用托架插槽的备用服务器中::十小时后它完成了......
$ dd if=/dev/sdb of=/dev/sdc bs=64M conv=notrunc
89424+1 records in
89424+1 records out
6001175126016 bytes (6.0 TB) copied, 35130.2 s, 171 MB/s
那是我的黄金后盾。
笔记 -我的驱动器是/dev/sdb
- 您需要将您的驱动器设置为您要尝试恢复的任何驱动器。不要搞砸驱动器,否则你会陷入更加混乱的境地......
然后,我做了以下事情。
(1)从机器上删除快照(这又不是傻事,我可以向你保证 - 如果我失败了,当我在本地急诊室检查时,一个人将被送往磁盘恢复医院!)。
(2)用驱动器重新启动FC22机器。运行parted,重做分区(在我的例子中,删除损坏的分区,写入新的0%到100% ext4分区)。您必须确切地知道原始分区在哪里,以及它们的确切类型 - 下一步取决于此 - 如果没有,请在此停止。你不会成功的。使用testdisk
和photorec
或类似的方法,或者对于真正重要的大型驱动器,将其发送出去。
(3) 跑 mke2fs -n /dev/sdb1
(别忘了-n
,否则你可以走开……)
对我来说,结果如下:
$ mke2fs -n /dev/sdb1
$ mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 1464843008 4k blocks and 183107584 inodes
Filesystem UUID: 1ac318a6-7953-42d5-8d7b-0597c54e1935
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
就是这样,那是所有备用超级块所在的地方……我们知道第一个和最后一个是垃圾,但中间的应该没问题。 (请注意,您可以 mkfs.ext4 -n /dev/sdb1
非常小心并获得相同的结果)。
(4) 运行e2fsck -y -b 102400000 /dev/sdb1
。您将需要-y
,因为需要很多“是”来修复由丢失的磁盘前端造成的混乱......并选择中间您喜欢的任何超级块......大约 30 分钟后在我的例子中,沉默(使用另一个终端和“顶部”来观察进度,或闪烁的磁盘灯),一个可安装的分区,目录中几乎所有内容都完好无损/lost+found
。
无论如何,我希望这会有所帮助 - 如果您仔细阅读本文,那么我祝您好运。感谢上面写的人。你把我从真正令人作呕的结局中救了出来......