4. 解决问题

请注意!按照这里给出的解释进行操作将导致您恢复到之前的系统状态,丢失所有最近的更改(如果有)!您必须选择...

4.1. 简单的情况

如果您手头有以下工具,一切都很简单

只需

  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 在之前看到的磁盘 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...