gparted を使用してパーティション テーブルを消去しましたが、パーティションを復元する方法はありますか?

gparted を使用してパーティション テーブルを消去しましたが、パーティションを復元する方法はありますか?

gparted を使用して「デバイス > パーティション テーブルの作成...」をクリックして適用し、NTFS (Windows) パーティション テーブルを消去しましたが、NTFS パーティションを回復する方法はありますか?

このコマンドを使用してみるgpart /dev/sda と、次の出力が得られました。

Begin scan...
End scan.

Checking partitions...
Ok.

Guessed primary partition table:
Primary partition(1)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(2)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(3)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(4)
type: 000(0x00)(unused)
size: 0mb #s(0) s(0-0)
chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

この出力はどういう意味ですか? 回復する方法はありますか?

答え1

パーティション テーブルを回復できる可能性はありますが、次の 2 つの条件を満たす必要があります。

  1. マシンを再起動していません。
  2. テーブルが変更された時点でドライブは使用中でした。

これは、カーネルがパーティション レイアウトをメモリ内に保持することによって機能します。パーティションが使用中の場合、パーティションの開始位置を知る必要があるため、使用されなくなるまで新しいテーブルの再読み込みを拒否します。

これを行う方法:

に移動します/sys/block/sda。その中に、各パーティションのディレクトリ ( sda1、など) があります。それぞれのディレクトリ内には、および(つまり)sda2というファイルがあります。これらの開始位置とサイズを正確に使用してパーティション テーブルを再作成すると、問題はありません。startsize/sys/block/sda/sda1/start

パーティション タイプは保持されないことに注意してください。Linux はこの情報を気にしません。したがって、再作成後に、パーティション タイプが何に設定されていたか (NTFS など) を覚えておく必要があります。


オリジナルディスク:

# fdisk -l /dev/sdc

ディスク /dev/sdc: 8006 MB、8006926336 バイト、15638528 セクタ
単位 = 1 セクター * 512 = 512 バイト
セクターサイズ(論理/物理):512バイト/512バイト
I/O サイズ (最小/最適): 512 バイト / 512 バイト
ディスク識別子: 0x000ce29c

   デバイス ブート 開始 終了 ブロック ID システム
/dev/sdc1 2048 2099199 1048576 83 Linux
/dev/sdc2 2099200 15638527 6769664 83 Linux
# マウント | grep sdc
/mnt/tmp 上の /dev/sdc2 タイプ xfs (rw)
# cat /mnt/tmp/world
こんにちは

パーティションテーブルの消去

# fdisk /dev/sdc
fdisk (util-linux 2.22.2) へようこそ。

変更は、書き込むことを決定するまで、メモリ内にのみ残ります。
書き込みコマンドを使用する前に注意してください。


コマンド(ヘルプの場合はm):d
パーティション番号(1-4):1
パーティション1が削除されました

コマンド(ヘルプの場合はm):d
選択されたパーティション 2
パーティション2が削除されました

コマンド(ヘルプの場合はm):p

ディスク /dev/sdc: 8006 MB、8006926336 バイト、15638528 セクタ
単位 = 1 セクター * 512 = 512 バイト
セクターサイズ(論理/物理):512バイト/512バイト
I/O サイズ (最小/最適): 512 バイト / 512 バイト
ディスク識別子: 0x000ce29c

   デバイス ブート 開始 終了 ブロック ID システム

コマンド(ヘルプの場合はm):w
パーティション テーブルが変更されました。

ioctl() を呼び出してパーティション テーブルを再読み取りします。

警告: パーティション テーブルの再読み取りに失敗しました。エラー 16: デバイスまたはリソースがビジーです。
カーネルは古いテーブルをまだ使用しています。新しいテーブルは
次回の再起動時またはpartprobe(8)またはkpartx(8)を実行した後
ディスクを同期しています。

まだマウントされていてアクセス可能であることに注意してください。

# cat /mnt/tmp/world
こんにちは

オフセットを取得する

# cd /sys/class/block/sdc

# ls
alignment_offset デバイス@ events_poll_msecs 電源/ ro スレーブ/
bdi@ 破棄アラインメント ext_range キュー/ sdc1/ 統計
機能イベントホルダー/範囲sdc2/サブシステム@
dev events_async 飛行中の取り外し可能なサイズ uevent

# sdc1/開始
2048

# 猫 sdc1/サイズ
2097152

# sdc2/開始
2099200

# 猫 sdc2/サイズ
13539328

パーティションテーブルを復元する

# fdisk /dev/sdc
fdisk (util-linux 2.22.2) へようこそ。

変更は、書き込むことを決定するまで、メモリ内にのみ残ります。
書き込みコマンドを使用する前に注意してください。


コマンド(ヘルプの場合はm): n
パーティションタイプ:
   p プライマリ (プライマリ 0、拡張 0、フリー 4)
   拡張
選択(デフォルトp):p
パーティション番号(1~4、デフォルト1):1
最初のセクター (2048-15638527、デフォルト 2048): 2048
最後のセクター、+セクターまたは+サイズ{K,M,G} (2048-15638527、デフォルト 15638527): +2097151
タイプLinux、サイズ1GiBのパーティション1が設定されています

コマンド(ヘルプの場合はm): n
パーティションタイプ:
   p プライマリ (プライマリ 1、拡張 0、フリー 3)
   拡張
選択(デフォルトp):p
パーティション番号(1~4、デフォルト2): 2
最初のセクター (2099200-15638527、デフォルト 2099200): 2099200
最後のセクター、+セクターまたは+サイズ{K,M,G} (2099200-15638527、デフォルト 15638527): +13539327
タイプLinux、サイズ6.5GiBのパーティション2が設定されています

コマンド(ヘルプの場合はm):p

ディスク /dev/sdc: 8006 MB、8006926336 バイト、15638528 セクタ
単位 = 1 セクター * 512 = 512 バイト
セクターサイズ(論理/物理):512バイト/512バイト
I/O サイズ (最小/最適): 512 バイト / 512 バイト
ディスク識別子: 0x000ce29c

   デバイス ブート 開始 終了 ブロック ID システム
/dev/sdc1 2048 2099199 1048576 83 Linux
/dev/sdc2 2099200 15638527 6769664 83 Linux

コマンド(ヘルプの場合はm):w
パーティション テーブルが変更されました。

ioctl() を呼び出してパーティション テーブルを再読み取りします。

警告: パーティション テーブルの再読み取りに失敗しました。エラー 16: デバイスまたはリソースがビジーです。
カーネルは古いテーブルをまだ使用しています。新しいテーブルは
次回の再起動時またはpartprobe(8)またはkpartx(8)を実行した後
ディスクを同期しています。

!!最後のセクターを指定するときは、サイズ - 1 を使用することに注意してください。!!

検証

ドライブをアンマウントし、 を実行してpartprobeカーネルに新しいテーブルを取得するように指示し、再度マウントしてファイルにアクセスできることを確認しましょう。

# /mnt/tmp/ をアンマウントする

# パーツプローブ /dev/sdc

# /dev/sdc2 /mnt/tmp をマウントします

# cat /mnt/tmp/world
こんにちは

答え2

使ってみてもいいかもしれませんテストディスクパーティション テーブルを回復します。Testdisk はディスクの表面を読み取り、パーティションの開始位置と終了位置を特定しようとします。

答え3

parted大まかな場所がわかっている場合は、ファイルシステムの開始位置と長さを嗅ぎ回ることができる rescue コマンドがあります。

答え4

NTFS ディスクのサイズがわかっている場合は、fdisk または parted を使用してこれらをリセットできる可能性がありますが、運が悪いと思います。

関連情報