我必须将磁盘映像从文件复制到外部卡。不幸的是,Ubuntu 在重启时切换了磁盘 - sda 是笔记本电脑硬盘,sdb 是卡;重启后 sda 是卡,sdb 是硬盘。我照做了dd if=image.dd of=/dev/sdb
,因为上次是正确的。映像大小为 4 GB,所以我想我覆盖了硬盘的前 4 GB。映像包含最少的 ubuntu。
现在我被无响应的系统困住了。笔记本电脑已打开,终端已启动,我还打开了 nautilus,但它崩溃了;在此之前,我检查了我的数据/home
没有受到影响(至少我希望它没有受到影响,但我的文件在那里)。我丢失了多少数据?只有操作系统?
我现在没有 Ubuntu 映像。我需要从中恢复数据/home
。我现在能做什么?我应该避免什么 - 我知道我不应该关闭或重新启动笔记本电脑,但我可以暂停它吗?我可以注销(锁定)吗?
我可以把笔记本电脑带回家并重新安装 Ubuntu,但我需要这些/home
文件。我能以某种方式重建分区表吗?我也有事故前后的分区信息。
答案1
首先,了解分区和文件系统之间的区别。在这个答案中,我将非常准确地使用这些术语,因此我想确保您理解其中的区别:
- A分割描述硬盘上的一组扇区。也就是说,分区可以是扇区 2048 到 1126439,也可以是扇区 4198440 到 15628053134。分区在分区表中定义,分区表是包含这些扇区号和其他一些分区元数据(如类型代码和名称)的简单数据结构。两种常见的分区表类型是主引导记录 (MBR)和GUID 分区表 (GPT)。前者是四五年前占主导地位的分区表类型;但随着 Windows 8 的推出以及从基于 BIOS 的计算机快速转向基于 EFI 的计算机,GPT 的受欢迎程度急剧上升。正如稍后所述,您使用的分区表对于您的问题至关重要。
- A文件系统是一种更复杂的数据结构,通常位于分区内(或有时是另一个容器,例如 LVM 设置中的逻辑卷,甚至是文件,如下载的
.iso
映像文件中的文件)。文件系统使计算机能够定位、读取、写入和以其他方式操作单个文件。Ubuntu 上的常见文件系统包括 ext2/3/4fs、Btrfs、XFS 和 JFS。其他一些文件系统(如 FAT)通常用于跨平台目的。NTFS 是 Windows 的本机文件系统,HFS+ 是 macOS 的本机文件系统(尽管 Apple 正在过渡到 APFS)。如果您的计算机以 EFI 模式启动,则第一个分区很可能包含 FAT 文件系统;但该文件系统也很小,因此将被完全覆盖并且无法恢复。(幸运的是,可以重新创建这个 EFI 系统分区。)
条款分割和文件系统有时可以互换使用,但区别对于您的情况很重要。最终,您最感兴趣的是文件系统数据,但要访问文件系统,必须知道其起点,而该起点通常由分区数据提供。
鉴于您当前的情况,有几种可能的方法来恢复分区表和/或找到至少某些分区的起点:
- 使用 GPT 备份数据-- GPT 和 MBR 都将分区表数据存储在磁盘的开头,而您的意外已将其删除;但 GPT 还将此数据的备份存储在磁盘的末尾。因此,您应该能够使用 GPT 备份来恢复整个分区表。(请注意,这将不是恢复您覆盖的其余数据;很可能至少一个文件系统已损坏。)据我所知,这种恢复的最佳 Linux 工具是我自己开发的
gdisk
,它是 Ubuntu 的标准配置。请参阅这一页了解详情。简而言之,您将gdisk
在磁盘上启动,如果它询问您,请告诉它使用 GPT。gdisk
可能此时恢复所有内容,但您可能需要键入r
以进入恢复和转换菜单,然后分别使用b
和/或c
读取备份元数据和分区表。您可以使用p
查看gdisk
当前看到的分区表。当您确信它已恢复时,键入w
以保存更改。但一定要小心!一旦输入w
,gdisk
将覆盖主 GPT 数据和备份 GPT 数据,因此如果您在恢复正确的分区之前执行此操作,您将没有第二次恢复的机会!如果您不确定,请输入 退出程序而不保存更改q
。然后您可以进行更多研究并重试。 - 使用 Linux 的内存分区数据-- 只要您不重新启动或使用与分区相关的某些命令,Linux 内核就会维护一个分区列表,包括它们的起始点和大小。您可以从目录
/sys/block/{disk}/{part}/
中的start
和size
文件中读取此信息。例如,/sys/block/sda/sda1/start
的起始点为/dev/sda1
,/sys/block/sda/sda1/size
大小为/dev/sda1
。您可以使用此信息重新创建分区表。您可以提取所有分区的信息(例如,cat /sys/block/sda/sda*/start
和cat /sys/block/sda/sda*/size
以获取 上所有分区的起始点和大小/dev/sda
),然后使用fdisk
、gdisk
或parted
重新创建与内核记录相匹配的分区。(警告:某些分区工具(如 GParted)会在创建新分区时创建新的文件系统。您必须不是执行此操作;您希望创建新分区而不修改所创建分区内容的任何字节。)请注意,您仍然需要填写内核未记录的元数据,例如分区类型代码。还请注意,内核记录每个分区的起点和大小(长度),但许多分区工具要求输入起点和终点,后者是起点加上大小减 1。请务必了解您的分区工具想要什么并输入正确的值。 - 使用 TestDisk-- 如果你的计算机使用 MBR 并且你已重新启动,或者上述方法失败,则可以使用测试磁盘恢复与您的文件系统匹配的分区。TestDisk 的工作原理是扫描整个磁盘以查找文件系统数据结构。然后它可以修改您的分区表,或创建一个新的分区表,其中包含与它找到的文件系统匹配的分区。请注意,TestDisk 可能会因您的第一个或两个分区而失败;但是,这种方法可能适用于恢复从您意外覆盖的区域末尾开始的分区。
- 盲目行事-- 磁盘上的第一个分区通常始于一个相当可预测的位置。特别是,扇区 2048 是最近(过去四五年)分区的磁盘的常见起点。较旧的磁盘通常具有从扇区 63 开始的第一个分区。某些磁盘(特别是在 macOS 中使用 GPT 分区的磁盘)具有从扇区 40 开始的第一个分区。因此,如果您知道足够多的信息,您可能能够正确猜出第一个分区从哪里开始。但是,鉴于您已经擦除了磁盘的前 4GB,这些知识可能毫无价值;许多磁盘的第一个分区很小(1MiB 到 1GiB),因此您很可能已经完全覆盖了整个第一个分区,并且覆盖了第二个分区。但是,如果您知道第一个分区的具体大小远大于此,或者它填满了整个磁盘,那么知道起点可能会使文件系统级恢复工具能够恢复文件系统的一些数据;或者您可能能够恢复完整的第二个分区。这种方法显然是非常冒险的,但如果你足够拼命,你可能会成功。
总体而言,如果您使用 GPT,则最好;在这种情况下,您的备份 GPT 数据应该是完整的,并且您应该能够恢复整个分区表。但即使在这种情况下,文件系统数据也可能被部分或完全擦除,至少对于第一个或两个分区而言。恢复前 4GB(您意外擦除的区域)中的任何数据将是不可能的。如果分区开始于该擦除区域内,但延伸到远远超出该区域的范围,您可能能够使用fsck
(或其他操作系统中的类似工具)来恢复文件系统,或至少恢复大部分文件系统。有一些高级fsck
选项可能有助于您完成此任务,但我不是使用它们的专家。还请注意,这fsck
实际上是文件系统特定工具(例如)的前端e2fsck
,并且这些工具的文件系统特定选项在恢复文件系统时可能很重要。
如果您尚未重新启动,您可以尝试使用普通的文件级命令(例如tar
或)备份风险最大的文件系统cp
。Linux 可能会尝试从磁盘的覆盖部分读取文件系统数据,从而导致混乱并完全挂起计算机。在最坏的情况下,混乱甚至可能导致损坏数据写入受损区域之外,从而使情况变得更糟。因此,这种方法并非没有风险。即便如此,将重要的用户数据备份到外部驱动器可能还是值得冒险的。
另一种数据恢复方法是使用照片录制。此工具搜索磁盘,与 TestDisk 非常相似,但 PhotoRec 搜索的是常见文件类型。因此,即使文件系统数据结构严重损坏,它也可以用于恢复文件。如果分区从磁盘损坏的前 4GB 开始,但超出了该区域,此工具可能会很有用。如果fsck
无法很好地恢复文件系统以进行安装,PhotoRec 至少可以从中恢复一些文件。但请注意,PhotoRec 在恢复文件名和目录结构方面做得很差。您将留下一堆名称错误的文件,您必须手动搜索才能找出您得到了什么。
如果你以 EFI 模式启动,你的 ESP 几乎肯定已经消失了。如果你可以恢复分区表,你可以在 ESP 上创建一个新的 FAT 文件系统,然后使用引导修复使 Ubuntu 恢复可启动状态。从概念上讲,Windows 也可以进行类似的修复程序,但我对此并不熟悉。如果您使用 Windows 进行双启动,则应在 Windows 论坛上询问此问题。我建议先恢复 Windows 引导加载程序,然后使用 Ubuntu 中的引导修复。如果您反过来做,计算机最终将直接启动到 Windows。这个问题可以修复,但最好不要出现。
如果您以 BIOS 模式启动,您的引导加载程序也会被破坏。一旦您的 Ubuntu 分区恢复,Boot Repair 就可以恢复 GRUB。根据 Windows 的位置(如果您双启动),您可能需要使用 Windows 技术和工具恢复其引导加载程序。
答案2
假设(当您可以启动时,比如从 Live 媒体启动)您发现/home
分区的大小与以前相同,您应该能够/
在它以前占用的相同空间中重新创建该分区,使用“保存 /home 文件夹”选项重新安装 Ubuntu,重新安装您添加的软件包,然后从上次中断的地方继续操作。
为了保险起见,您可能希望使用不同的用户名进行安装,这将在 /home 中创建一个新的用户文件夹。完成后,您可以将未隐藏的文件和文件夹从旧用户文件夹复制到新用户文件夹。
如果分区表确实被覆盖,那么你的工作就更困难了——你需要使用文件恢复软件重新安装 Ubuntu 之前恢复前一个用户文件夹中的文件。数据应该仍然完好无损,但读取数据的“路线图”已丢失,您必须重新创建该地图。在最佳条件下,这是一个不确定的前景,但第一条规则是:关闭计算机并保持关闭状态,直到您准备好从 Live 媒体重新启动(或移除硬盘并将其连接到另一台计算机)以开始恢复过程。对于您的问题,正在运行的计算机不太可能覆盖驱动器上剩余的任何内容——但如果关闭电源,它不能。
引用评论:
通常,每次我安装 unix 系统时,我都会为 /home/ 创建单独的分区 - 我不记得为什么这次没有这样做。
假设您安装此系统时没有单独的 /home,您的个人数据是否与操作系统文件混合在一起,很大程度上取决于您安装 Ubuntu 后更新了多少次。每次替换操作系统中的文件时,新文件都会写入可用空间,然后删除旧文件。然后,其他文件可以写入通过删除旧操作系统文件而释放的空间。这意味着您保留安装的时间越长,您的文件与操作系统的混合程度就会越高。
根据我现在了解的情况,我建议您需要法医恢复工具才有机会恢复可能与系统文件混合的文件 - 而这些文件通常超出了普通用户的能力。