如何读取/dev/sda 的内存(内核)分区表?

Oli*_*nde 17 linux partition kernel block-device

我不小心用 GParted 覆盖了我的 /dev/sda 分区表(AskUbuntu 上的完整故事)。由于我还没有重新启动并且我的文件系统仍然完全可用,我被告知我可能能够从内核内存中恢复分区表。那可能吗?如果是这样,我如何恢复它并恢复它?

在此处输入图片说明

phe*_*mer 28

是的,您可以使用/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
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的/sys/block/sda

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200
Run Code Online (Sandbox Code Playgroud)


我已经对此进行了测试,以验证在正在运行的系统上修改分区表后信息是否准确

  • 有时,当我为一个问题点赞时,它的意思是“嘿,这很方便”。你的赞成更像是“这拯救了我的皮肤”。谢谢! (2认同)

小智 12

我制作了一个脚本来帮助解决这个问题,没有 WARRANTY。(但我在我的虚拟机上测试过)

运行以下脚本,第一个参数为损坏的 HD,如下所示:

user@host:~$ ./repart.sh sda
Run Code Online (Sandbox Code Playgroud)

内容repart.sh

user@host:~$ ./repart.sh sda
Run Code Online (Sandbox Code Playgroud)

输出是 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
Run Code Online (Sandbox Code Playgroud)

您必须将type,从 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
Run Code Online (Sandbox Code Playgroud)

应用此更改

cat repart.sfdisk | sfdisk -f /dev/sda
Run Code Online (Sandbox Code Playgroud)

重读分区表

partprobe 
/sbin/blockdev --rereadpt
Run Code Online (Sandbox Code Playgroud)

重新安装 grub

grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)