不小心做了dd / dev / sda


35

我使用将ISO映像写入硬盘sudo dd if=image.iso of=/dev/sda。我的意思是/dev/sdc,现在运行sudo fdisk -l时在/ dev / sda上只返回一个分区,而应该是6。是否可以恢复我的数据?

我还没有关闭(重启)计算机。


24
dd再次显示出其丑陋的“数据驱逐舰”面子:-(它已经覆盖了驱动器(相当于ISO文件的大小)的头端。这是有数据丢失。你有一个相当新的备份不能丢失的文件吗?否则,您必须准备工作以修复分区表和文件系统,最好是使用Testdisk 在克隆副本上进行修复,如果失败,则更艰苦的工作来恢复“隐藏”的文件数据您可以使用PhotoRec来实现此目的。请参阅此链接cgsecurity.org
sudodus

6
驱动器是gpt分区的,它具有在驱动器末尾备份分区表的优点。只有达到ISO大小的驱动器的开始被完全覆盖并丢失。然后,根据分区的大小,您也许可以恢复某些或大多数其他分区。
oldfred

10
@sudodus dd再次显示了其丑陋的'Data Destroyer'面孔” -除非与它无关dd,否则与直接以root用户访问磁盘设备有关。任何其他工具都可能具有相同的效果。cat image.iso > /dev/sda会产生完全相同的效果。或者pv ...。或者,在某种程度上,甚至vi /dev/sda。实际上,这使我想起了Linus Torvalds尝试使用其硬盘驱动器设备(而不是调制解调器设备)拨入网络,并通过拨入握手覆盖驱动器开始的故事。与无关dd
marcelm '17

4
您的.iso文件到底有多大?您打扰了dd,还是完成了?
marcelm '17

4
@marcelm,您是对的。但是在现实生活中,人们正在使用dd这种方式(用于此目的),所以我认为“数据破坏者”警告是相关的,尽管完全正确的警告应该更长:“不要使用像sudo dd if=image.iso of=/dev/sdx克隆到大众的命令行使用可以帮助您识别和选择正确的目标设备并具有最终检查点的工具,以便您可以再次检查是否将从iso文件克隆到正确的目标设备,例如StartupDiskCreator,Disks,mkusb ,Win32DiskImager。”
sudodus

Answers:


65

由于您的计算机仍在开机,因此您很有可能保存内容。

首先,sysfs公开内核在分区表的内存视图中。现在,您的内核尚未重新读取磁盘的表,并且它会记住您的分区。在内部/sys/block/sda/,每个分区应该有一个目录。每个此类子目录都包含一个文件start和一个文件size,分别代表分区的位置和大小(以扇区为单位)。运行fdisk,然后使用其sysfs目录中的信息重新创建每个分区(顺序!)。请注意,您还必须创建一个新的分区表。确保新分区表与之前的分区表相同。您可以在中检查/sys/block/sda。如果你看到sda1最多sda7虽然您只有6个分区,但您可能拥有MBR,否则可能是GPT。您还需要为这些分区设置标志和类型。查看/etc/fstab并尝试收集有关您拥有的分区类型的信息,然后查看Wikipedia将其转换为分区方案的代码。

由于您似乎可以使用文件系统,因此文件系统的dd大多数重要部分都位于最前面,因此您可能没有覆盖其中的任何文件系统。检查/etc/fstab以查看哪些分区对应于系统的哪个部分,然后使用dd复制的数据量来估算所需的数量。如果您只重写了文件系统的一部分,那么好的产品fsck 也许可以修复它(但是您丢失了很多数据)。

你很可能重写了/boot。您必须重新安装内核(带有aptitude)和重新安装GRUB2(带有grub-install)(这同时破坏了第一阶段和第二阶段)。GRUB2在中配置了文件/etc,因此您无需手动重新创建任何文件。


15
/sys/block/sda/*/{start,end}使用此信息检查并重新创建分区”:您能否对此进行一点扩展?这不是一件微不足道的操作,它似乎是您本来很好的答案的重点。
terdon

输出比较容易解释,键入这些在shell提示与每个后一个RETURN ...............: ,sudo parted,,unit sprint allquit
哈努哈利

3
发现任何有价值的信息后,将其复制到另一个驱动器(例如USB记忆棒)。如果任何分区恢复步骤均无法正常进行,则您需要记录仍在运行的计算机中的内存。另外,在运行中的计算机仍在工作时将您最有价值和/或较小的文件(包括.bashrc主目录中的类似文件和其他点文件,以及/etc除真实数据外的所有文件)复制到另一个磁盘上。tar.gz是用于复制整个目录的一种很好的格式(因为它保留了权限和内容)。
彼得·科德斯

他可能还需要重新格式化/ boot的格式,当不确定内核对分区布局的看法时,这很危险……
rackandboneman

1
@rackandboneman内核拒绝重新读取具有已安装分区的磁盘上的分区表。这样重新格式化/boot是完全“安全的”(对这种情况进行其他形式的模数转换),因为内核对任何事情都不确定。
HTNW

21

很抱歉读到你的运气不好

我想您目前没有备份,很抱歉读到有关您的运气不好的信息

sudo dd if=image.iso of=/dev/sdx

您在其中使用驱动器号x=的位置,a从而覆盖了存储许多重要数据的硬盘驱动器的开头。

您不是第一个人,恐怕不是受此问题影响的最后个人。dd建议在许多网站上都这样使用。这是一种功能强大但危险的方法,因为它可以毫无疑问地完成您要执行的操作。因此,它通常被称为“数据破坏者”。

@marcelm评论,这个昵称不公平。他说对了,直接以root用户身份写入设备文件会带来风险。因此请注意,通过写入相应的设备文件,您可以轻松覆盖驱动器并破坏有价值的数据/dev/sdx。(更安全的工具在此答案的末尾列出。)

恢复分区表,文件系统和/或文件内容

  • 尽量减少对驱动器的操作,最重要的是,不要对驱动器进行任何写操作,因为它会由于覆盖数据而使情况变得更糟,这些数据仍然可以恢复。

  • 如果您的数据很有价值,则应使用克隆的副本,而不是原始(部分覆盖)的驱动器。看到此链接,向下滚动到“分区表的高级修复,文件系统和/或文件恢复”

    修复Pendrive的分区表和文件系统

  • 如果您有GUID分区表GPT,则驱动器末尾有分区表的备份/dev/sda,并且您可以使用工具从该备份表中还原主分区表gdisk。有关man gdisk详细信息,请参见手册。

  • 您可以使用Testdisk从以下位置恢复分区表和文件系统:

    http://cgsecurity.org

    阅读CGSecurity网站上的说明以及@ElderGeek提供的链接,安装时断电后分区消失了

  • 您还可以根据@CSM提供的链接,使用gpart / gparted设法恢复分区表和文件系统,

    HOWTO:将丢失的分区还原到已删除或损坏的分区表

  • PhotoRec:如果无法恢复分区表和文件系统,您仍然可以恢复一些文件数据。前端文件(可能是1-1.5 GB)已被覆盖并丢失,但驱动器该部分后面的文件仍然存在。来自http://cgsecurity.org的 PhotoRec 是一种工具,可以在没有文件系统的情况下“从驱动器表面”恢复数据。常用文件类型开头的典型数据用于标识。

    以下链接提供有关PhotoRec的详细信息,

    https://www.cgsecurity.org/wiki/PhotoRec

    您应将文件保存到单独驱动器中的分区。

    无法恢复目录结构,通常也无法恢复文件名(而不是权限和所有权),并且存在一些问题,当文件碎片化时,PhotoRec可以恢复很多文件(不仅照片,以及许多其他常见文件类型)。但是,这是很大的工作,要遍历大量未排序的文件来确定什么是真正重要的文件,您应该重命名为有意义的文件名,这是一项艰巨的工作。

使用Ubuntu创建USB启动驱动器的更安全工具

将来,请使用一个工具来帮助您识别和选择正确的目标设备并具有最终检查点,以便您可以再次检查是否将从iso文件克隆到正确的目标设备,例如

  • 在Ubuntu中:Ubuntu Startup Disk Creator(在Ubuntu 16.04 LTS和更高版本中),
  • 在Linux中:

    • 磁盘别名gnome-disks
    • mkusb
  • 在Windows中:Win32DiskImager

您还可以使用提供最终检查点的提取工具,例如


1
我可以为cgsecurity的Testdisk担保,它比我过去尝试过的其他替代方案要好得多,在那里Testdisk是唯一能够挽救任何有用信息的方案。但是要小心,这个小笨蛋默认会尝试在驱动器本身上恢复分区!xx
hanshenrik

1
+1。我也可以担保testdisk。另外,也可以使用一个包装器脚本来防止dd将其写入/ sda / sdb /,这也是一个好主意。
WinEunuuchs2Unix

19

通过您的dd命令,将覆盖/ dev / sda的分区表和所有数据,直到image.iso的大小为止。

因此,最好的办法是还原分区表(具有正确的大小),至少在/ dev / sda末尾恢复分区。


1
如果您想知道如何获得准确的尺寸,请参阅此答案的第二段。
wizzwizz4

16

缺少从备份还原的方法,无法完全恢复。DD已覆盖分区表和设备的某些数据。


19
我想我应该扔掉所有的灾难恢复备份。
stumblebee '17

23
@Baaing Cow,当然,这是一个答案,当然,无法恢复数据。这就是您覆盖数据时的含义:数据已消失。
psusi

22
@ ChaiT.Rex这似乎是一个神话,至少在过去十年中制造的PC上可能会找到的任何设备上,都是如此。
David Schwartz

19
@ ChaiT.Rex仅适用于未完全覆盖的磁盘,其中仅擦除了部分磁盘。但是,如果整个磁盘已被擦除或覆盖,则无法恢复数据。是否有专家。
托马斯·沃德

8
@BaaingCow如您所知,必须有一种还原数据的方法,请给我们启发。许多人会愿意为您的技术付钱!
蒂姆(Tim)

9

如果你开车被划分为独立的//home分区,以及 /home分区是以后/的分区,那么你就可以恢复你的数据。列出大多数分区所在位置的MBR已被覆盖。但是,gparted可以恢复您的/home分区。

Ubuntu论坛上的这篇文章 提供了一些有关如何做的想法。我发现通过搜索“ gparted恢复分区”。

找到丢失的分区(可能位于扩展分区中)后,应将其添加为分区表中的唯一分区。

完成此操作后,您将必须重新安装Linux,并告知将恢复的分区保留为/home


2

Testdisk抢救

在反复复制和粘贴说明并将其更改为USB 后,我可以亲自为Testdisk担保保存数据。只有一次我忘记更改它,然后我进入了垃圾箱。/dev/sdb/dev/sdd/dev/sdb

将系统设置为永不写入 /dev/sda

我强烈建议创建一个包装器脚本:防止dd破坏SSD或HDD。这样可确保dd永远不会写入/dev/sda或可能写入/dev/sdb任何大容量存储设备。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.