今天,我在家用服务器上安装了一块新硬盘,使用 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