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

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

我不小心用 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 上。

相关内容