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


Answers:


26

是的,您可以使用/sys文件系统执行此操作。

/sys是由内核和内核驱动程序动态生成的伪造文件系统。
在这种情况下,您可以转到/sys/block/sda驱动器上的每个分区,然后会看到一个目录。您需要在这些文件夹中有2个特定文件,start并且sizestart包含距驱动器开头的偏移量,并且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


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


1
有时,当我支持一个问题时,它的意思是“嘿,这很方便”。您的投票更像是“这救了我的皮肤”。谢谢!
Alex Hirzel

我没有/dev/sdb/start。是否已重命名为ext_range?内核:4.8.15-1-MANJARO
汤姆·黑尔

@TomHale是/sys/block/sdb/start,不是/dev/sdb/start
Patrick

抱歉,我引用了错误的目录。我在stat那里,但没有start
汤姆·黑尔

重新创建分区时,我建议使用usind,fdisk因为它允许直接输入扇区数,并且可以在写入磁盘之前检查值。我成功地恢复了磁盘,方法是:创建第一个分区,接受它,然后输入“ + size”(从上方)作为结束,start从/ sys 输入第二个分区...并再次“ + size”,依此类推...写入新表之前分区的大小。祝好运!
约尔格Gottschlich

11

我编写了一个脚本来帮助解决此问题,没有担保。(但是我在虚拟机上进行了测试)

运行以下脚本,其中第一个参数的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

1
确保对sfdisk使用“ -u B”开关,请注意,如果sfdisk以块大小计(请检查“单位=块数”),则可能必须调整repart.sfdisk中的值(通常将它们除以2)。 “ sudo sfdisk -u B -l / dev / sda”中的“ 1024个字节”),而不是512个字节(如今通常为1024个字节)。
弗洛里安2014年

1
我一开始误读:Id = 5表示分区类型5,即sda4,而不是sda5。此外,在我的情况下,ls -d / sys / block / sda / sda *仅提供sda1和sda5,因此似乎缺少该容器。
wau 2015年

你不应该解析ls; 使用查找代替
cat

4

您是否尝试过testdisk?即使重新启动后,它也可以扫描磁盘并恢复丢失的分区表。

它可以为Debian预先打包,也可以为Ubuntu打包。可能还有其他发行版。

如果要引导gparted CD,可能值得检查一下它是否已预先安装。


是他做的。只需检查OP(askUbuntu)的链接
Marco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.