分区恢复

修订历史
修订 12008-11-24 09:27:50修订者:jdd
主要修改 wiki 中的标题

目录
1. 修订历史
2. 开始
2.1. 内容概要
2.2. 现在该做什么?
2.3. 法律声明
2.4. 现在我需要知道什么?
3. 技术信息
3.1. 磁盘
3.2. 分区
3.3. 为什么会出现问题?
4. 解决问题
4.1. 简单情况
4.2. 不太简单的情况
4.3. 富人的情况
4.4. PMagic
5. 参考资料
5.1. 作者
5.2. 最新版本

“分区恢复 HOWTO” - Jean-Daniel Dodin


1. 修订历史

修订 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 没了!如果您遇到或担心有一天会遇到这样的问题,请阅读本文...


2. 开始

2.1. 内容概要

本 HOWTO 仅解决“分区表丢失”问题。可能出现这种情况的情况包括:

  • 您无法访问您的计算机,并显示“未找到操作系统”消息;

  • 您已安装新的系统(即 MS Windows),并且看不到 Linux,并且 MS Windows 占用了磁盘的所有容量;

  • 您刚刚使用 fdisk 错误地对错误的驱动器进行了分区(例如,在更换硬盘驱动器的过程中)。

在这里,您将了解到,如果您知道正确的方法并执行它,Linux 通常可以安全地从这些问题中恢复。MS Windows 也可以,但它更依赖运气。

我们将首先了解在问题发生之前您可以做些什么来简化未来的恢复,以及在问题发生之后您必须做些什么来恢复。为了防止擦除磁盘,能做的很少;通常这是由自动 MS Windows 或 Linux 安装程序的不良程序或用户的错误造成的 - 除了小心之外,没有什么可以防止这种情况发生,但您已经很小心了,不是吗?

也可能是由于使用了 MS-DOS/Windows fdisk 造成的。尽可能避免使用它,但您可能无法避免。

我已经多次在我的计算机和其他人的计算机上这样做过,并且大多数时候都恢复了 Linux,有时也恢复了 MS Windows。祝您好运!


2.2. 现在该做什么?

如果您目前没有任何问题,如果您出于好奇或只是为了寻求信息而阅读本文,并且您正在运行 Linux 系统,请立即执行以下操作

  • 打开 root 终端或 xterm;

  • 键入/sbin/fdisk -l(最后一个字符是 l,代表 Lima)。然后执行fdisk -u -l;

您将很高兴看到计算机上所有磁盘上所有当前分区的列表。第二个列表以扇区为单位代替柱面单位,这有时是必要的。

  • 将其写在纸上(或执行“/sbin/fdisk -l | lpr”和“/sbin/fdisk -u -l | lpr”进行打印),并将其保存在安全的地方以备将来使用。如果您不是系统管理员,则您不必担心此问题,可以停止阅读本文。


2.3. 法律声明

本 HOWTO 的版权归 Jean-Daniel Dodin 所有,版权所有 (c) 2000-2008。自 2003 年 11 月起,许可证为 LGPL。

对于任何人因阅读本 HOWTO 而对任何计算机造成的任何损害,我概不负责。如果您造成任何损害,那是您的错,而不是我的错!分区磁盘时请小心,不要犯任何错误,因为这可能是致命的!备份所有重要数据,并检查您所做的一切都是正确的!此处描述的内容在我的计算机上有效,但在您的计算机上可能有效,也可能无效。尽管它应该对每个人都有效,但我无法保证任何事情。这是您收到的最后一个警告:备份重要数据!或者,简而言之:使用风险自负!


2.4. 现在我需要知道什么?

需要知道,如果您的硬盘驱动器出现任何重大问题,您需要停止以写入模式使用它,至少在您了解正在发生的事情之前。那里的信息非常不稳定...

如果有一天早上醒来,您的计算机显示“无法加载,未安装系统”,您绝不能开始重新安装所有东西

如果您安装了 MS Windows,我不能保证您可以恢复您的数据,但很可能您可以恢复所有 Linux 内容,前提是它没有位于磁盘结构的太低的位置(靠近磁盘的开头)。这是因为一些 MS Windows 病毒会擦除第一个磁盘柱面,无论上面有什么。但是,我从未尝试过此类病毒,也无法确定。无论如何,尝试恢复。

您还必须知道,我向您提供所有这些信息仅用于此目的 - 信息目的。对于您因使用此信息而可能导致的数据问题,我和其他任何人都无法承担责任,只有您自己承担责任。世界上有太多不同的系统,任何人都不可能保证任何事情。我只能祝您好运,并希望您像我一样,乐于恢复数据。


3. 技术信息

3.1. 磁盘

硬盘驱动器由从 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 自动硬盘驱动器识别并选择“是”。无论如何,在此级别的任何修改都可能破坏磁盘的所有数据,因此如果没有必要的原因,请不要随意操作。

这可能就是您的磁盘已经使用的模式,所以不要害怕。


3.2. 分区

现在的磁盘非常大 - 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.

不要担心法语部分,我是法国人...查看您自己的磁盘列表。当然,数字会更大。


3.3. 为什么会出现问题?

问题在于,所有已安装的操作系统都必须共享磁盘,并且由于在启动时,BIOS 仅扫描第一个磁盘,因此在此磁盘的开头必须有一个所谓的“分区表”。此分区表位于主引导记录 (MBR) 中,与引导加载程序并排。

任何操作系统对 MBR 的任何误用都会导致问题。当尝试安装任何系统时,在类似“自动分区?”的问题上回答“是”很可能会导致问题...MS Windows 尤其如此,尤其是由特殊制造商的 PC 制作的自定义 MS Windows 安装(当不包含真正的“Windows”CD 时,例如许多笔记本电脑)。但对于某些发行版附带的一些“智能”(不太智能!)Linux 安装程序来说也是如此(希望在 2008 年以后不再是这种情况)。


4. 解决问题

请注意!遵循此处给出的解释将导致您恢复到以前的系统,丢失所有最近的更改(如果有)!您必须做出选择...


4.1. 简单情况

如果您手头有以下物品,一切都很简单

  • 能够通过自身启动 Linux 并提供 fdisk 的磁盘(软盘、USB 密钥或 CD) - 任何发行版的大多数救援磁盘都可以做到这一点;

  • 一张纸,上面写着fdisk -lfdisk -u -l内容。

只需

  1. 启动 Linux;

  2. 启动fdisk /dev/hda(或任何需要救援的磁盘);

  3. 使用 fdisk 删除(d 选项)损坏磁盘上的所有现有分区;

  4. 使用 fdisk 创建纸上提到的所有主分区 (1 - 4);

  5. 为它们指定适当的标签(t 选项):82 用于 Linux 交换分区,83 用于 Linux 主分区(L 给出列表),5 是扩展分区,必须在创建逻辑分区之前完成,c 是 MS Windows FAT32,f 是 MS Windows 扩展分区,而 6 是 MS Windows FAT16。

  6. 创建任何逻辑分区。

在我的 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 的范围之内。


4.2. 不太简单的情况

4.2.1. 手动操作

这是当以前的情况无法使用时,因为缺少 fdisk 纸张,或者如果它因使用过时的纸张而无法工作时。

警告

您只能尝试分区,而不用担心。逻辑分区使用磁盘的普通扇区来存储其自己的管理数据,因此,每次您使用 fdisk 写入一些逻辑分区时,您都会写入一些扇区,从而擦除数据内容(如果有)。仍然有机会那里没有任何数据或数据不重要,但是,您进行此类尝试的频率越低越好。

首先,请注意,只要您不写入磁盘(fdisk 除外),您就不会擦除您的数据,因此您可以使用逐块尝试。也就是说,您需要知道分区的开头才能启动它。例如,如果 153 不合适,请尝试 154,依此类推。

这可能很累,但是,如果您大致记得 Linux 分区的大小,则有机会成功。


4.2.2. Linux 自己的信息和其他技巧

4.2.2.1. 内核

如果您只是破坏了自己的分区表,但尚未重新启动 Linux:不要重新启动!您仍然可以检索存储在内核中的分区信息

cat /proc/partitions给出

主设备号

次设备号

#块数

名称

3

0

19535040

hda

3

1

2096451

hda1

3

2

4980150

hda2

3

3

1

hda3 <--- 这标记一个扩展分区

3

5

4980118

hda5

3

6

4972086

hda6


4.2.2.2. hdparm

hdparm -g /dev/hda1/dev/hda1 :

geometry = 2432/255/63, sectors = 4192902, start = 63

您需要进行一些单位转换。“块”通常长度为 1K。“扇区”是磁盘扇区,通常为 512 字节。但通常磁盘分区工具以柱面为单位工作。(此处,255*63=16065 个扇区。)使用此信息,您可以构建新的分区表。


4.2.2.3. 我知道分区的开始位置,但不知道结束位置。

如果您知道 Linux 分区的开始位置,但不知道结束位置,您仍然可以挂载它,并了解其结构。正确设置分区表起始位置,并将结束位置设置为非常大的值。查看您是否正确猜测

e2fsck -n /dev/hd??

您甚至可以挂载分区并检查大小

mount -r /dev/hd?? /mnt
df -T

由于舍入问题,这不会直接告诉您下一个分区从哪里开始。但它可以帮助您接近。务必使用“-n”和“-r”标志,将系统视为只读!!!


4.2.2.4. 存储分区信息的其他位置

某些发行版将分区信息记录在一个文件中。当然,当您需要它时,您可能无法访问此文件。但是,以防万一

SuSE: /var/lib/YaST/install.inf

(如果您知道其他位置,请通过电子邮件发送给本文档的维护者)


4.2.2.5. gpart

但是,如果您仍然可以访问互联网或手头有“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 每周更新一次 ,因此新版本可能比我所知的更强大。


4.2.2.6. 恢复扩展分区内的分区

扩展分区信息分散在磁盘上,而不是与主分区一起存储。恢复这些信息通常需要更多的工作。过程是

  1. 扫描第一个分区的起始位置(使用 gpart 的 -k 选项);

  2. 使用真实起始位置和伪造的结束位置创建临时主分区条目。(如果没有任何可用的主分区,这可能会导致您删除实际的主分区 - 如果您不重复使用已删除分区的扇区,则这是无风险的);

  3. 使用“e2fsk -n", "mount -r”,和“df”来确定真实的终点。写下此值(警告:阅读每个提到的程序的手册页,并使用只读选项;在所有分区都位于正确位置之前,您不想写入磁盘);

  4. 对每个要恢复的分区重复此过程;

  5. 构建完整的新正确的分区表。


4.2.2.7. 如果您的硬盘驱动器有错误

如果您的硬盘驱动器有错误,您可能在挂载、检查或使用数据时遇到真正的麻烦。(驱动器读取错误会妨碍您。)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如果磁盘确实严重损坏。


4.3. 富人的情况

Partition Magic 是一款商业(和专有)软件产品,考虑到其用途很少,因此价格并不便宜(在法国约为一百美元),但在世界各地享有很高的声誉。但是,我从未使用过它,也不会对其进行评价。据说它能够对分区执行任何操作,包括恢复分区。

Ralf 的原始分区恢复迷你 HOWTO 主要基于 Partition Magic 的使用,因此我认为如果您在 Linux 分区上有重要数据并且 Linux 能力较弱,这是一个非常好的解决方案。但是,现在有更新版本的 Partition Magic,我认为您最好阅读手册。


4.4. PMagic

PartedMagic 是任何分区工作的首选工具,包括恢复。极其出色的产品(当然是开源的)。无论如何请阅读 HOWTO,因为您可能需要它来防止灾难,但 pmagic 上有所有工具,这是有史以来最好的恢复 CD...


5. 参考资料

5.1. 作者

本 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 自己的信息”来自他,以及一些小的改进。


5.2. 最新版本

本 HOWTO 的最新版本将在 tldp wiki 上找到