“分区恢复 HOWTO” - Jean-Daniel Dodin
修订 V4.1 - 2008-11-24 - 修订者:jdd
修复标题(wiki 必须获取 HOWTO 的确切名称)
修订 v4 - 2008-08-29 - 修订者:jdd
重大更新 - 首个完整的修订 wiki 版本
修订 v3.7 - 2008-05-30 - 修订者:rm
小幅更新 - 大量细小的标点符号、拼写、用法和语法错误 :-)
修订 v3.6 - 2008-05-25 - 修订者:jdd
重大更新 - LDP wiki - 增加关于逻辑分区的说明
修订 v3.5 - 2003-10-31 - 修订者:jdd
重大更新 - 新许可证 - 一些地址修复 - vi 的使用 :-)
修订 v3.4 - 2002-08-22 - 修订者:jdd
小幅更新,仅与 docbook 相关
修订 v3.3 - 2001-11-17 - 修订者:jdd
小幅更新 - docbook & 修订历史 - emacs 的使用。
修订 v3.2 - 2001-09-25 - 修订者:jdd
重大更新。
哇!我的磁盘空了!我的 Linux 没了!如果您遇到或担心有一天会遇到这样的问题,请阅读本文...
本 HOWTO 仅解决“分区表丢失”问题。可能出现这种情况的情况包括:
您无法访问您的计算机,并显示“未找到操作系统”消息;
您已安装新的系统(即 MS Windows),并且看不到 Linux,并且 MS Windows 占用了磁盘的所有容量;
您刚刚使用 fdisk 错误地对错误的驱动器进行了分区(例如,在更换硬盘驱动器的过程中)。
在这里,您将了解到,如果您知道正确的方法并执行它,Linux 通常可以安全地从这些问题中恢复。MS Windows 也可以,但它更依赖运气。
我们将首先了解在问题发生之前您可以做些什么来简化未来的恢复,以及在问题发生之后您必须做些什么来恢复。为了防止擦除磁盘,能做的很少;通常这是由自动 MS Windows 或 Linux 安装程序的不良程序或用户的错误造成的 - 除了小心之外,没有什么可以防止这种情况发生,但您已经很小心了,不是吗?
也可能是由于使用了 MS-DOS/Windows fdisk 造成的。尽可能避免使用它,但您可能无法避免。
我已经多次在我的计算机和其他人的计算机上这样做过,并且大多数时候都恢复了 Linux,有时也恢复了 MS Windows。祝您好运!
如果您目前没有任何问题,如果您出于好奇或只是为了寻求信息而阅读本文,并且您正在运行 Linux 系统,请立即执行以下操作
打开 root 终端或 xterm;
键入/sbin/fdisk -l(最后一个字符是 l,代表 Lima)。然后执行fdisk -u -l;
您将很高兴看到计算机上所有磁盘上所有当前分区的列表。第二个列表以扇区为单位代替柱面单位,这有时是必要的。
将其写在纸上(或执行“/sbin/fdisk -l | lpr”和“/sbin/fdisk -u -l | lpr”进行打印),并将其保存在安全的地方以备将来使用。如果您不是系统管理员,则您不必担心此问题,可以停止阅读本文。
本 HOWTO 的版权归 Jean-Daniel Dodin 所有,版权所有 (c) 2000-2008。自 2003 年 11 月起,许可证为 LGPL。
对于任何人因阅读本 HOWTO 而对任何计算机造成的任何损害,我概不负责。如果您造成任何损害,那是您的错,而不是我的错!分区磁盘时请小心,不要犯任何错误,因为这可能是致命的!备份所有重要数据,并检查您所做的一切都是正确的!此处描述的内容在我的计算机上有效,但在您的计算机上可能有效,也可能无效。尽管它应该对每个人都有效,但我无法保证任何事情。这是您收到的最后一个警告:备份重要数据!或者,简而言之:使用风险自负!
您需要知道,如果您的硬盘驱动器出现任何重大问题,您需要停止以写入模式使用它,至少在您了解正在发生的事情之前。那里的信息非常不稳定...
如果有一天早上醒来,您的计算机显示“无法加载,未安装系统”,您绝不能开始重新安装所有东西。
如果您安装了 MS Windows,我不能保证您可以恢复您的数据,但很可能您可以恢复所有 Linux 内容,前提是它没有位于磁盘结构的太低的位置(靠近磁盘的开头)。这是因为一些 MS Windows 病毒会擦除第一个磁盘柱面,无论上面有什么。但是,我从未尝试过此类病毒,也无法确定。无论如何,尝试恢复。
您还必须知道,我向您提供所有这些信息仅用于此目的 - 信息目的。对于您因使用此信息而可能导致的数据问题,我和其他任何人都无法承担责任,只有您自己承担责任。世界上有太多不同的系统,任何人都不可能保证任何事情。我只能祝您好运,并希望您像我一样,乐于恢复数据。
硬盘驱动器由从 0 到最大值编号的扇区组成。
例如,dmesg 给出的信息如下
hdb: ST34321A, 4103MB w/128kB Cache, CHS=523/255/63 |
CHS 代表柱面、磁头、扇区。
523*255*63=8401995 个 512 字节的扇区,因此为 4103 MB。这只是一个逻辑映射;它不一定与磁盘封面上写的内容相同(总大小除外)。
扇区的真实大小对我们来说并不重要,因为我们不想修改任何内容,而只是希望恢复到以前的状态。对于我们来说,fdisk 给出的默认大小是合适的。
系统看到的大小直接取决于 BIOS(基本输入/输出系统 - PC 的 ROM)的工作。BIOS 中指示的硬盘驱动器模式至关重要。在新磁盘上,最好使用 BIOS 自动硬盘驱动器识别并选择“是”。无论如何,在此级别的任何修改都可能破坏磁盘的所有数据,因此如果没有必要的原因,请不要随意操作。
这可能就是您的磁盘已经使用的模式,所以不要害怕。
现在的磁盘非常大 - 500 GB 的驱动器并不少见 - 因此将所有内容都打包在一个分区中并不是很方便。只有 MS Windows 这样做,如果您使用 Linux,也许是因为您意识到另一个效率有多低。
因此,硬盘驱动器通常被切割成一些称为“分区”的部分(有关详细信息,请参阅 分区 HOWTO,另请阅读 Web 或磁盘上的 README.fdisk - 位置会有所不同)。
让我们看一下我自己的fdisk -l :
Disk /dev/hdb: 255 heads, 63 sectors, 523 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hdb1 1 153 1228941 83 Linux /dev/hdb2 154 166 104422+ 82 Linux swap /dev/hdb3 * 167 291 1004062+ 83 Linux /dev/hdb4 295 523 1839442+ 5 Extended /dev/hdb5 295 422 1028128+ 83 Linux /dev/hdb6 423 523 811251 6 FAT16 |
打印输出的一部分。这是我的第二个硬盘驱动器,用于猜测和尝试。(第一个太简单,没什么意思。)
/dev/hdb 是我的第二个 ide 磁盘(主接口上的从盘),
/dev/hdb1 是第一个主分区,从第一个 (1) 块运行到块 153。
可以有四个这样的主分区。如果想要超过 4 个,则其中一个必须重新用作“扩展”分区(不一定是第四个),并且所有其他分区都是“逻辑”分区,并且位于扩展分区内部。请注意,分区号 5 和分区号 4 具有相同的起始位置。数字 5 是逻辑分区,数字 4 是扩展分区。逻辑分区的编号始终从 5 开始,即使只有 2 个主分区也是如此。
这是fdisk -u -l另一个磁盘的列表
Disque /dev/hda : 240 têtes, 63 secteurs, 2584 cylindres Unités = secteurs sur 1 * 512 octets Périphérique Amorce Début Fin Blocs Id Système /dev/hda1 * 63 10357199 5178568+ c Win95 FAT32 (LBA) /dev/hda2 15452640 39070079 11808720 83 Linux /dev/hda3 10357200 15150239 2396520 f Win95 Etdue (LBA) /dev/hda4 15150240 15452639 151200 84 Lecteur C: caché OS/2 /dev/hda5 10357263 10463039 52888+ 83 Linux /dev/hda6 10463103 10780559 158728+ 82 Echange Linux /dev/hda7 10780623 15150239 2184808+ 6 FAT16 Les entrées de la table de partitions ne suivent pas l'ordre du disque. |
不要担心法语部分,我是法国人...查看您自己的磁盘列表。当然,数字会更大。
问题在于,所有已安装的操作系统都必须共享磁盘,并且由于在启动时,BIOS 仅扫描第一个磁盘,因此在此磁盘的开头必须有一个所谓的“分区表”。此分区表位于主引导记录 (MBR) 中,与引导加载程序并排。
任何操作系统对 MBR 的任何误用都会导致问题。当尝试安装任何系统时,在类似“自动分区?”的问题上回答“是”很可能会导致问题...MS Windows 尤其如此,尤其是由特殊制造商的 PC 制作的自定义 MS Windows 安装(当不包含真正的“Windows”CD 时,例如许多笔记本电脑)。但对于某些发行版附带的一些“智能”(不太智能!)Linux 安装程序来说也是如此(希望在 2008 年以后不再是这种情况)。
请注意!遵循此处给出的解释将导致您恢复到以前的系统,丢失所有最近的更改(如果有)!您必须做出选择...
如果您手头有以下物品,一切都很简单
能够通过自身启动 Linux 并提供 fdisk 的磁盘(软盘、USB 密钥或 CD) - 任何发行版的大多数救援磁盘都可以做到这一点;
一张纸,上面写着fdisk -l和fdisk -u -l内容。
只需
启动 Linux;
启动fdisk /dev/hda(或任何需要救援的磁盘);
使用 fdisk 删除(d 选项)损坏磁盘上的所有现有分区;
使用 fdisk 创建纸上提到的所有主分区 (1 - 4);
为它们指定适当的标签(t 选项):82 用于 Linux 交换分区,83 用于 Linux 主分区(L 给出列表),5 是扩展分区,必须在创建逻辑分区之前完成,c 是 MS Windows FAT32,f 是 MS Windows 扩展分区,而 6 是 MS Windows FAT16。
创建任何逻辑分区。
在我的 SUSE 安装以及我必须为其他人执行此操作的任何时候,这都产生了良好的结果。
但是,我说过一些 fdisk 可能会基于扇区而不是柱面来切割分区。所以fdisk -u -l纸张的版本。
为了使用fdisk -u -l列表,必须启动fdisk -u:-) 。在我看来,使用扇区限制是一个非常糟糕的主意,但它可能有一些我不知道的实际用途。问题是,使用柱面限制,即使您没有纸张也很容易猜测。使用扇区限制,猜测就更多了...
fdisk 是一个小型且非常智能的程序。还有许多其他类型的 fdisk,但我始终更喜欢最基本的那个。(我指的是 Linux 的,当然,不是其他的....)
请注意,在您点击 w 并回车之前,fdisk 不会将任何内容写入磁盘。如果您担心出错,请点击 q(退出)或 Ctrl C (^C)以安全退出,而无需保存更改。
当您的新分区表写入后,启动您的 Linux。您可能无法像往常一样执行此操作:lilo/grub 也可能已损坏,因此您可能需要启动软盘或 CD。选择“启动已安装的分区”选项。
如果您习惯使用 lilo 启动,一旦您以 root 身份登录,请键入“lilo”并回车以重新安装您喜欢的引导加载程序。现在,我不确定 GRUB 是否也同样容易,但应该也不会非常困难。
您的 Linux 应该都在这里;测试一下。另外,尝试启动 MS Windows(如果适用)。如果您无法启动,则有(非常小的)机会您可以从 Linux 读取数据,可能是通过原始的扇区到扇区的读取。如果您可以确定您的数据所在的磁盘扇区,则可以使用 dd 将其复制到文件中。这对于纯文本来说是明智的。此恢复不在本迷你 HOWTO 的范围之内。
这是当以前的情况无法使用时,因为缺少 fdisk 纸张,或者如果它因使用过时的纸张而无法工作时。
警告
您只能尝试主分区,而不用担心。逻辑分区使用磁盘的普通扇区来存储其自己的管理数据,因此,每次您使用 fdisk 写入一些逻辑分区时,您都会写入一些扇区,从而擦除数据内容(如果有)。仍然有机会那里没有任何数据或数据不重要,但是,您进行此类尝试的频率越低越好。
首先,请注意,只要您不写入磁盘(fdisk 除外),您就不会擦除您的数据,因此您可以使用逐块尝试。也就是说,您需要知道分区的开头才能启动它。例如,如果 153 不合适,请尝试 154,依此类推。
这可能很累,但是,如果您大致记得 Linux 分区的大小,则有机会成功。
hdparm -g /dev/hda1/dev/hda1 :
geometry = 2432/255/63, sectors = 4192902, start = 63
您需要进行一些单位转换。“块”通常长度为 1K。“扇区”是磁盘扇区,通常为 512 字节。但通常磁盘分区工具以柱面为单位工作。(此处,255*63=16065 个扇区。)使用此信息,您可以构建新的分区表。
如果您知道 Linux 分区的开始位置,但不知道结束位置,您仍然可以挂载它,并了解其结构。正确设置分区表起始位置,并将结束位置设置为非常大的值。查看您是否正确猜测
e2fsck -n /dev/hd?? |
您甚至可以挂载分区并检查大小
mount -r /dev/hd?? /mnt df -T |
由于舍入问题,这不会直接告诉您下一个分区从哪里开始。但它可以帮助您接近。务必使用“-n”和“-r”标志,将系统视为只读!!!
某些发行版将分区信息记录在一个文件中。当然,当您需要它时,您可能无法访问此文件。但是,以防万一
SuSE: /var/lib/YaST/install.inf |
(如果您知道其他位置,请通过电子邮件发送给本文档的维护者)
但是,如果您仍然可以访问互联网或手头有“gpart”,则有一种更好的方法。gpart 在大多数发行版中都可用,网址为 http://freshmeat.net/ 或直接从 http://www.stud.uni-hannover.de/user/76201/gpart 获取。
请注意,gpart 不是 gparted - GNOME 分区编辑器。
“gpart - 猜测 PC 型硬盘驱动器分区”正如其手册页的第一行所述(man gpart)。并继续说
“gpart 尝试猜测硬盘驱动器上的分区。如果主分区表丢失、被覆盖或损坏,则分区仍然存在于磁盘上,但操作系统无法访问它们。”
这正是我们所需要的。gpart 是一个非常有用的工具。
问题如下:任何分区的第一个块都会被标记。但如果未被覆盖,则永远不会“取消标记”。因此,旧磁盘上存在许多“第一个分区块”,gpart 尝试尽力猜测哪个是好的。实际上,尝试起来并不太困难;gpart 不会在磁盘上写入任何内容。
这是 gpart 在之前看到的磁盘 hdb 上的结果
root@charles:/home/jdd > gpart /dev/hdb Begin scan... Possible partition(Linux ext2), size(1200Mb), offset(0Mb) Possible partition(Windows NTFS), size(1200Mb), offset(1200Mb) Possible partition(Linux ext2), size(1004Mb), offset(2402Mb) Possible partition(Windows NTFS), size(1600Mb), offset(4102Mb) End scan. Checking partitions... * Warning: partition(OS/2 HPFS, NTFS, QNX or Advanced UNIX) ends beyond disk end . Partition(Linux ext2 filesystem): primary Partition(OS/2 HPFS, NTFS, QNX or Advanced UNIX): primary Partition(Linux ext2 filesystem): primary Partition(OS/2 HPFS, NTFS, QNX or Advanced UNIX): invalid primary Ok. Guessed primary partition table: Primary partition(1) type: 131(0x83)(Linux ext2 filesystem) size: 1200mb #s(2457880) s(63-2457942) chs: (0/1/1)-(152/254/61)d (0/1/1)-(152/254/61)r Primary partition(2) type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX) size: 1200mb #s(2457880) s(2457944-4915823) chs: (152/254/63)-(305/253/60)d (152/254/63)-(305/253/60)r Primary partition(3) type: 131(0x83)(Linux ext2 filesystem) size: 1004mb #s(2056256) s(4919781-6976036) chs: (306/61/49)-(434/60/47)d (306/61/49)-(434/60/47)r Primary partition(4) type: 000(0x00)(unused) size: 0mb #s(0) s(0-0) chs: (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r |
如您所见,可以恢复主分区,但对于扩展分区,仍有待完成。
DOS 分区被标记为“Windows NTFS”,因为它们是在尝试安装 MS Windows 2000 时创建的(2000 年非常糟糕的体验!)。“无效”分区实际上是扩展分区。
有了这个,可以使用 fdisk 并尝试重新创建分区表。(请记住,鉴于原始分区表已丢失,这是无风险的。)
gpart 每周更新一次 ,因此新版本可能比我所知的更强大。
扩展分区信息分散在磁盘上,而不是与主分区一起存储。恢复这些信息通常需要更多的工作。过程是
扫描第一个分区的起始位置(使用 gpart 的 -k 选项);
使用真实起始位置和伪造的结束位置创建临时主分区条目。(如果没有任何可用的主分区,这可能会导致您删除实际的主分区 - 如果您不重复使用已删除分区的扇区,则这是无风险的);
使用“e2fsk -n", "mount -r”,和“df”来确定真实的终点。写下此值(警告:阅读每个提到的程序的手册页,并使用只读选项;在所有分区都位于正确位置之前,您不想写入磁盘);
对每个要恢复的分区重复此过程;
构建完整的新正确的分区表。
如果您的硬盘驱动器有错误,您可能在挂载、检查或使用数据时遇到真正的麻烦。(驱动器读取错误会妨碍您。)Gpart 甚至可能找不到它。但是,如果您知道分区的起始位置,则可以轻松地将数据复制到存储在不同驱动器上的临时文件中。在此过程中,具有读取错误的扇区通常会被设置为零
将分区数据复制到文件中。您必须知道分区的起始块;
dd if=/dev/hd?? of=/tmp/recover_hd?? bs=512 skip=XXXX count=YYY |
XXX 是扇区起始位置,YYY 是扇区计数(可以猜测)。
将文件作为循环文件系统挂载。
mount -r -t ext2 -o loop /tmp/recover_hd?? /mnt/recover |
使用dd_rescue如果磁盘确实严重损坏。
Partition Magic 是一款商业(和专有)软件产品,考虑到其用途很少,因此价格并不便宜(在法国约为一百美元),但在世界各地享有很高的声誉。但是,我从未使用过它,也不会对其进行评价。据说它能够对分区执行任何操作,包括恢复分区。
Ralf 的原始分区恢复迷你 HOWTO 主要基于 Partition Magic 的使用,因此我认为如果您在 Linux 分区上有重要数据并且 Linux 能力较弱,这是一个非常好的解决方案。但是,现在有更新版本的 Partition Magic,我认为您最好阅读手册。
PartedMagic 是任何分区工作的首选工具,包括恢复。极其出色的产品(当然是开源的)。无论如何请阅读 HOWTO,因为您可能需要它来防止灾难,但 pmagic 上有所有工具,这是有史以来最好的恢复 CD...
本 HOWTO 的作者是 Jean-Daniel Dodin。可以通过 我的掩码电子邮件 或简单地在 Google 上搜索“Jean-Daniel Dodin”来联系我 :-)。
我的网站是 [http://www.dodin.net]。
我要感谢 Rolf Klausen,他编写了之前的分区恢复迷你 HOWTO。即使我几乎完全重写了它,但他首先提出了这个好主意。
Linux 社区的每一位其他成员,以及所有支持 Linux 并为 Linux 编写文档和程序的人,以及 LDP 的所有作者,以及几乎所有参与与 Linux 相关的任何事情的人。特别是 Linus B. Torvalds - 他是王者!!!
我还要感谢 Michail Brzitwa(请参阅文本中的网站)编写 gpart!
Bryce Nesbitt <bryce at obviously dot com> 做得非常好,“Linux 自己的信息”来自他,以及一些小的改进。