我不小心用 GParted 覆盖了我的 /dev/sda 分区表(完整故事请参见 AskUbuntu)。由于我还没有重新启动并且我的文件系统仍然完全可用,因此我被告知我可能能够从内核内存中恢复分区表。那可能吗?如果是这样,我该如何恢复并恢复它?
答案1
是的,您可以使用/sys
文件系统来做到这一点。
/sys
是由内核和内核驱动程序动态生成的假文件系统。
在这种特定情况下,您可以转到/sys/block/sda
驱动器上的每个分区,您将看到一个目录。您需要的这些文件夹中有 2 个特定文件,start
以及size
.start
包含距驱动器开头的偏移量,并且size
是分区的大小。只需删除分区并使用与 中找到的完全相同的开始和大小重新创建它们/sys
。
例如,这就是我的驱动器的样子:
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 133119 65536 83 Linux
/dev/sda2 * 133120 134340607 67103744 7 HPFS/NTFS/exFAT
/dev/sda3 134340608 974675967 420167680 8e Linux LVM
/dev/sda4 974675968 976773167 1048600 82 Linux swap / Solaris
这就是我所拥有的/sys/block/sda
:
sda1/
start: 2048
size: 131072
sda2/
start: 133120
size: 134207488
sda3/
start: 134340608
size: 840335360
sda4/
start: 974675968
size: 2097200
我已经对此进行了测试,以验证在修改正在运行的系统上的分区表后信息是否准确
答案2
我编写了一个脚本来帮助解决这个问题没有保修。 (但我在我的虚拟机上测试过)
运行以下脚本,第一个参数为损坏的 HD,如下所示:
user@host:~$ ./repart.sh sda
内容repart.sh
:
#!/bin/bash
echo "unit: sectors"
for i in /sys/block/$1/$1?/; do
printf '/dev/%s : start=%d, size=%d, type=XX\n' "$(basename $i)" "$(<$i/start)" "$(<$i/size)"
done
输出是 sfdisk 格式。但警告,必须修改此文件才能使用。在扩展分区类型 = 5 时,使用所有逻辑空间加上扩展分区开始与第一个逻辑分区开始之间的空间来增加大小。
unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX
你必须改变类型,从 XX 到分区类型的编号。放在可启动的在第一行进行分区。
unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82
应用此更改
cat repart.sfdisk | sfdisk -f /dev/sda
重新读取分区表
partprobe
/sbin/blockdev --rereadpt
重新安装grub
grub-install /dev/sda
答案3
你有没有尝试过测试盘?即使您重新启动后,它也可以扫描磁盘并恢复丢失的分区表。
它可以为 Debian 预先打包,并且可能也为 Ubuntu 提供。可能是其他发行版。
如果您正在启动 gparted CD,则可能值得检查一下是否已预安装在该 CD 上。