web-dev-qa-db-ja.com

sfdiskを使用したおおよそのパーティションテーブルバックアップ

いくつかの論理パーティションを拡張パーティションに変換したかったので、次のようにしました この受け入れられた答え 。しかし、現在のパーティションテーブルをバックアップする段階で、私は混乱して、書かれたものの代わりに次のように入力しました。

sfdisk -f /dev/sda > /mnt/parts.txt

その結果、次のようになりました。

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1          0+    304-    304-   2441214+  82  Linux swap / Solaris
/dev/sda2   *    304+    565-    262-   2097152   83  Linux
/dev/sda3        565+   4486-   3921-  31495168   83  Linux
/dev/sda4       4486+  30401-  25916- 208163840    5  Extended
/dev/sda5       4486+  24026-  19540- 156954624   83  Linux

ご覧のとおり、単位はシリンダーとブロックであり、セクターを使用した正しいエクスポートと比較すると、おそらく精度が低下します。

問題は、パーティションテーブルが壊れたため、この不完全な(またはそれでしょうか?)バックアップを悪用する必要があることです。

これまで、1つのブロックが2つのセクターであることを知って、セクターを1つの単位として使用してパーティションテーブルを書き直そうとしました(シリンダーはどこにもつながりません)(一般的かどうかはわかりませんが、セクターでパーティションテーブルをエクスポートするとわかります) 1セクター= 512バイト、1ブロック= 1024バイト...)。

root@debian:/home/user# sfdisk -u S /dev/sda
Checking that no-one is using this disk right now ...
OK

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2       4882430   9076733    4194304  83  Linux
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4      72067070 488394749  416327680  83  Linux
Input in the following format; absent fields get a default value.
<start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
Usually you only need to specify <start> and <size> (and perhaps <type>).

/dev/sda1 :1 4882429 S
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2 :4882430 4194304 L *
/dev/sda2   *   4882430   9076733    4194304  83  Linux
/dev/sda3 :9076734 62990336
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4 :72067070 416327680 E
/dev/sda4      72067070 488394749  416327680   5  Extended
/dev/sda5 :72067071 313909248
/dev/sda5      72067071 385976318  313909248  83  Linux
/dev/sda6 :
/dev/sda6     385976320 488394749  102418430  83  Linux
/dev/sda7 :
No room for more
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2   *   4882430   9076733    4194304  83  Linux
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4      72067070 488394749  416327680   5  Extended
/dev/sda5      72067071 385976318  313909248  83  Linux
/dev/sda6     385976320 488394749  102418430  83  Linux
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 3 does not start at a cylinder boundary
Warning: partition 3 does not end at a cylinder boundary
Warning: partition 4 does not start at a cylinder boundary
Warning: partition 4 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Warning: partition [6] does not start at a cylinder boundary
Warning: partition [6] does not end at a cylinder boundary
Warning: partition 6 does not end at a cylinder boundary
Do you want to write this to disk? [ynq] y
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

それは言う:シリンダー境界でのパーティションの開始/停止はありません。これが何を意味するのかわかりませんが、+-、つまり、数値は四捨五入されています。元のエクスポートでは、これは正常であると思います。

また、同じ誤ったコマンドを発行して、出力が同じかどうかを確認しました。

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1          0+    303-    304-   2441214+  82  Linux swap / Solaris
/dev/sda2   *    303+    565-    262-   2097152   83  Linux
/dev/sda3        565+   4485-   3921-  31495168   83  Linux
/dev/sda4       4485+  30401-  25916- 208163840    5  Extended
/dev/sda5       4485+  24025-  19540- 156954624   83  Linux
/dev/sda6      24025+  30401-   6376-  51209215   83  Linux

近いですが、まったく同じではありません。また、gpartedはパーティションファイルシステムを認識していないようです(すべてが「不明」です)。

また、/ dev/sda1を304シリンダーの大きさにし、303シリンダーで終了させるにはどうすればよいでしょうか。


私は解決策に近づいていると思いますが、おそらく何かを誤って計算したか、間違っているために、必要な正確な数値を取得できません。しかし、どの組み合わせが機能するかを確認するために1つずつ変更することはできません(できますが、bashのコーディングと処理に時間がかかり、何が問題だったのかわかりません)。

このディスクにとって最も重要なものの最近のバックアップがありますが、ファイルを再インストールしてコピーせずに修正できれば、それは素晴らしいことです。

4
GeoffreyFrogeye

これは手作業で修正するのが難しいでしょう。書き込んだパーティションテーブルが壊れていることを除いて、このディスクのデータをこれ以上変更していないことを願っています。

Sfdisk、fdiskなどを使用してパーティションテーブルのバックアップを作成することをお勧めします(誤って間違ったコマンドを入力しない場合:))。しかし、追加の保険のために、ddを使用してドライブのブートセクターをバックアップするのが好きです。

Sda1がブロック1から始まることを確信していますか、それは推測でしたか? MBRと(プライマリ)パーティションテーブルを保持するために必要なのはそれだけなので、ディスクの先頭で1ブロックだけが使用されるのが一般的でしたが、最近では、パーティションソフトウェアがより多くのスペースを予約するのが一般的です。 1番目のパーティションの開始セクターが63であることは珍しいことではありません。また、パーティション分割ソフトウェア(gparted、IIRC)がドライブの開始時にメガバイトを予約し、後続のすべてのパーティションをメガバイト境界に強制することも確認しました。

古いシステムでは、パーティションがシリンダー境界で開始および停止することが重要でした。 IOW、ディスクの開始時のパーティション化されていない領域は整数のシリンダーである必要があり、後続の各プライマリパーティションも同様である必要があります。通常、ディスクの端にも未割り当てのスペースがあります。しかし、それは一般的に何年もの間問題ではありませんでした、しかしあなたが興味を持っている場合に備えて、多くのパーティション分割ソフトウェアはまだそれについて言及しています。 :)

ただし、パーティションdoは、セクター境界で開始および停止する必要があります。これにより、最初のリストのブロック指向データの分析がはるかに簡単になります。したがって、2441214 +ブロックはonly2441214.5ブロック= 4882429セクター= 2499803648バイトを参照できます。

ただし、これを手動で修正するのではなく、 testdisk のようなツールの使用を真剣に検討する必要があります。すでにディストリビューションにインストールされている場合もありますが、そうでない場合は、リポジトリにインストールする必要があります。

3
PM 2Ring