用 gdisk 覆盖了启动磁盘的分区表;如何恢复?

用 gdisk 覆盖了启动磁盘的分区表;如何恢复?

今天,我在家用服务器上安装了一块新硬盘,使用 gdisk 对其进行格式化(大于 2 TB),设置更改并写入。然后我注意到我选择了错误的磁盘,事实上我只是覆盖了启动磁盘上的分区表。

一旦我重新启动系统,分区表的更改就会被写入,并且我相对确定,除非我能够将分区表恢复到以前的状态,否则它将无法启动。

有什么方法可以恢复旧的分区表,或者至少恢复足够的分区表以便安全重启?

在我覆盖表之前,我有来自 gdisk 的“p”输出:

Command (? for help): p
Disk /dev/sdh: 125045424 sectors, 59.6 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D0127C61-1349-42D1-A03F-46F604F3DD6C
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 2048-sector boundaries
Total free space is 4717 sectors (2.3 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       119883775   57.2 GiB    8300  Linux filesystem
   5       119885824       125044735   2.5 GiB     8200  Linux swap

一些并发症:

  • 该磁盘以前是在 MBR 中进行分区的,并且 - 未经确认 - 我不认为这台特定的 PC 支持 UEFI/从 GPT 启动。

  • 我不确定此打印输出是否包含重建分区表所需的所有信息。是否有可能某些分区隐藏在这里?或者缺少其他重要信息?我知道 - 例如 - 因为 gdisk/GPT 没有“可引导”标志,所以此打印输出不包含它。

  • 我已经尝试使用 fdisk 将这些分区写回,但我不知道如何让 fdisk 创建编号为“5”的分区。我想,如果我的交换分区从 sdh5“移动”到 sdh2,这不会奇迹般地起作用。

我发现了类似的问题,恢复运行系统中仍然存在的分区表关于使用覆盖分区表dd。但就我而言,由于我使用 gdisk (+ fdisk) 编写新表,因此我不确定 /sys/block 中的信息是否完全准确。

答案1

今天我终于有机会好好解决这个问题,幸运的是,解决方案(大部分)比我担心的更简单。

对我有帮助的是更多地了解我的发行版(Debian)如何在引导安装中设置磁盘分区(http://www.linuxbsdos.com/2011/02/15/debian-6-installation-and-disk-partitioning-guide/),以及如何在磁盘上创建和指定逻辑分区(http://tldp.org/HOWTO/Partition/fdisk_partitioning.html#mixed)。

在阅读了那里的注释并重新检查后,我回到了fdisk并:

  • 重写 MBR(o)以重新开始。
  • 创建 ( n) 一个p主分区‘1’,其中“sdh1”扇区如 gdisk 的输出所示 (2048 - 119883775)。
  • 创建 ( n) 一个e扩展分区“2”,从第一个可用扇区开始并跨越磁盘的其余部分 (119883776 - ...)。
  • 创建 ( n) 一个l逻辑分区‘5’,其中“sdh5”扇区如 gdisk 的输出所示 (119885824 - 125044735)。
  • 将分区‘5’上的类型(t)更改为交换(类型代码‘82’)。
  • a切换“sdh1”上的可启动标志( )。
  • 写下我的更改(w)并退出。

我重新启动以测试此分区表,但系统没有启动。因此,我不得不拔下磁盘并将其安装在另一台电脑上。但幸运的是,我忘记做的只是:

  • 将 grub 重新安装到(现在已重新格式化的)MBR。将磁盘安装到我的另一台 PC 上后,我使用grub-install --root-directory=/path/to/mount/point /dev/sdX(其中 sdX 是另一台 PC 上安装的磁盘的设备文件)。
    • 如果我在重新启动机器之前这样做了,我想结果就会是这样grub-install --root-directory=/ /dev/sdh

磁盘上的 grub 配置仍然正常,因此只需重新安装 grub 本身即可。重新插入磁盘并启动后,到目前为止一切似乎都运行正常。

我从中学到的一个重要教训是,扩展分区的 /sys/block 数据有点误导。“sdh2”的 /sys/block/.../size 信息仅声称有 2 个块,不包括分区的实际大小,而这是将“sdh5”(我的逻辑/交换分区)放入其中所必需的。

编辑为了确保万无一失,fdisk -l我的磁盘上的当前输出(重新启动后,现在标记为“sdi”,而不是之前的“sdh”)是:

Disk /dev/sdi: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders, total 125045424 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: <...>

   Device Boot      Start         End      Blocks   Id  System
/dev/sdi1   *        2048   119883775    59940864   83  Linux
/dev/sdi2       119883776   125045423     2580824    5  Extended
/dev/sdi5       119885824   125044735     2579456   82  Linux swap / Solaris

相关内容