我不小心用GParted覆盖了/ dev / sda分区表(AskUbuntu上的全文)。由于我还没有重启,并且我的文件系统仍然可以正常使用,因此我被告知我可以从内核内存中恢复分区表。那可能吗?如果是这样,如何恢复并还原它?
我不小心用GParted覆盖了/ dev / sda分区表(AskUbuntu上的全文)。由于我还没有重启,并且我的文件系统仍然可以正常使用,因此我被告知我可以从内核内存中恢复分区表。那可能吗?如果是这样,如何恢复并还原它?
Answers:
是的,您可以使用/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
我已经对此进行了测试,以在修改正在运行的系统上的分区表后验证信息是否正确
/dev/sdb/start
。是否已重命名为ext_range
?内核:4.8.15-1-MANJARO
/sys/block/sdb/start
,不是/dev/sdb/start
stat
那里,但没有start
。
fdisk
因为它允许直接输入扇区数,并且可以在写入磁盘之前检查值。我成功地恢复了磁盘,方法是:创建第一个分区,接受它,然后输入“ + size”(从上方)作为结束,start
从/ sys 输入第二个分区...并再次“ + size”,依此类推...写入新表之前分区的大小。祝好运!
我编写了一个脚本来帮助解决此问题,没有担保。(但是我在虚拟机上进行了测试)
运行以下脚本,其中第一个参数的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