/ dev / sdaのメモリ内(カーネル)パーティションテーブルを読み取る方法


14

誤って/ Part / sdaパーティションテーブルをGParted で上書きしましたAskUbuntuの全容)。まだリブートしておらず、ファイルシステムは完全に使用可能なので、カーネル内のメモリからパーティションテーブルを回復できる可能性があると言われました。それは可能ですか?もしそうなら、どのようにそれを回復し、復元しますか?

ここに画像の説明を入力してください

回答:


25

はい、/sysファイルシステムでこれを行うことができます。

/sysカーネルとカーネルドライバーによって動的に生成される偽のファイルシステムです。
この特定のケースでは、に移動でき/sys/block/sda、ドライブ上の各パーティションのディレクトリが表示されます。そこあなたが必要とするこれらのフォルダで2つの固有のファイルがある、startsizestartドライブの先頭からのオフセットが含まれ、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
質問に賛成票を投じると、「これは便利だった」という意味になることがあります。あなたの賛成票は、「これが私の肌を救った」ようなものです。ありがとう!
アレックスヒルゼル

がありません/dev/sdb/start。名前が変更されましたext_rangeか?カーネル:4.8.15-1-MANJARO
トム・ヘイル

@TomHaleで/sys/block/sdb/startはない/dev/sdb/start
パトリック

申し訳ありませんが、間違ったディレクトリを引用しました。ありますが、statありませんstart
トム・ヘイル

パーティションを再作成するときfdiskは、セクターの数を直接入力でき、ディスクに書き込む前に値を確認できるため、usindをお勧めします。ディスクを正常に復元しました。最初のパーティションを作成し、存在を受け入れ、最後に「+ size」(上から)を入力startし、2番目のパーティションを/ sys ...から入力し、「+ size」を再度入力します。新しいテーブルを書き込む前のパーティションのサイズ。幸運を!
ヨルクゴットシュリッチ

10

NO WARRANTYを使用して、この問題の解決に役立つスクリプトを作成しました。(ただし、仮想マシンでテストしました)

最初のパラメーターで破損したHDを使用して、次のスクリプトを実行します:$ ./repart.sh sda

#!/bin/bash

HARDDISK=$1

PARTITIONS=$(ls -d /sys/block/${HARDDISK}/${HARDDISK}?/)

echo "unit: sectors" 
for i in $PARTITIONS; do
    DEVICE=$(basename $i)
    START=$(cat $i/start)
    SIZE=$(cat $i/size)
    echo "/dev/$DEVICE : start=$START, size=$SIZE, type=XX" 
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

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

この変更を適用する

cat repart.sfdisk | sfdisk -f /dev/sda

パーティションテーブルの再読み込み

partprobe 
/sbin/blockdev --rereadpt

GRUBを再インストールする

grub-install /dev/sda

1
sfdiskが「-u B」スイッチを使用していることを確認し、注意してください。sfdiskがブロックサイズでカウントする場合は、repart.sfdiskの値を調整する必要があります(通常は2で割る)(「Units = blocks for 「sudo sfdisk -u B -l / dev / sda」の「1024バイト」)、512バイト(通常は最近では1024バイト)以外。
フロリアン14

1
最初は誤解しました。Id= 5とは、パーティションタイプ5のことで、sda5ではなくsda4です。さらに、私の場合、ls -d / sys / block / sda / sda *はsda1とsda5のみを提供するため、コンテナーが欠落しているようです。
ワウ

lsを解析しないでください。代わりにfindを使用してください

3

testdiskを試しましたか?再起動した後でも、ディスクをスキャンして失われたパーティションテーブルを回復できます。

DebianおよびおそらくUbuntu向けにあらかじめパッケージ化されています。おそらく他のディストリビューション。

gparted CDを起動する場合は、おそらくその上にプリインストールされているかどうかを確認する価値があります。


はい、彼はしました。OP(askUbuntu)のリンクを確認してください。
マルコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.