GNU parted が MBR の最初の 440 バイトにデータを書き込むのはなぜですか?

GNU parted が MBR の最初の 440 バイトにデータを書き込むのはなぜですか?

私の理解では、MBRは512バイトです。最初の440バイト与えるまたは取る1つの少し バイト(実装によって異なります)には、ブートローダー/ブートストラップ コード領域が含まれます。残りのバイトには、パーティション テーブルに関する情報が含まれます。

ディスクの MBR をゼロにすると...

# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512

次に、fdiskパーティション テーブルを書き込みます/dev/sdX...

# Create a 2GiB partition starting at 2048 (default).
fdisk /dev/sdX

...
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier ...
...

(fdisk) n
(fdisk) p
(fdisk) 1
(fdisk) 2048
(fdisk) +2G
(fdisk) w

そして最初の 440 バイトを読み戻します...

dd if=/dev/sdX bs=1 count=440

最初の440バイトはすべてゼロのままです。fdiskそれらには触れませんでした。これは、私が上に投稿したリンクに基づくと理にかなっています。fdiskパーティション情報を書き込んでいるため、最初のバイトに触れる必要はありません440

次の6バイトはゼロではありません。これらのバイトは現代の標準MBRのディスク署名

$ dd if=/dev/sdX bs=1 count=6 skip=440 | hexdump -e '4/1 "%02x " "\n"'
9a 29 97 e7

これまでのところ、MBR のレイアウト方法を理解していると、それは理にかなっています。最初の440バイトはfdiskブートローダの領域であり、fdiskパーティション テーブルのみに関係するため、無視されます。

しかし、それはparted私を困惑させています。

同じディスクの MBR を再度ゼロにすると...

# Zero out the MBR
dd if=/dev/zero of=/dev/sdX bs=1 count=512

次に、parted を使用してディスク ラベルを作成します (fdisk上記のように自動的に実行されるようです)...

parted /dev/sdX mklabel msdos

そして最初の440バイトを読み戻します...

$ dd if=/dev/sdX bs=1 count=440 | hexdump -e '16/1 "%02x " "\n"'
fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ゼロ以外のバイトがあります。これは、MBRがどのようにレイアウトされるべきか、そしてGNU partedが何であるかについての私の現在の理解では意味をなさないようです。達成するはず

GNU Parted は、パーティション テーブルを作成および操作するためのプログラムです。

parted最初のバイトにデータを書き込むのはなぜですか440? これらのバイトはブートローダ用ではありませんか? parted はこれらのバイトをそのままにしておくべきではないですかfdisk?

答え1

私はそう思うだろうないのみ1つから知らせarmこの動作は、ディスク上にブートローダーが存在することで問題が発生する可能性がある一部の環境では特に問題になるようです。

問題は、parted 自体が (そして黙って) コードをそこに置くため、組み込みシステムは有効なブートローダ コードがあると判断し、問題なくハングしてしまうことです。

...そして...

このコードの追加を回避し、fdisk のように動作させる parted のオプションはありますか?

この行動parted意図的なpartedメーリングリストのユーザーが次のように質問しています。

問題は、parted が MBR の最初から次のコードを生成していることです。

...

このコードの目的は何ですか? なぜそこに配置されているのですか?

そして答えは次のようです:

これは、BIOS システムの起動に通常使用される MBR ブート コードです。x86 以外のシステムで問題が発生する場合は、これをゼロにする必要があります (または、パーティション分割後にシステム ブートローダーを書き込む必要があります)。

は、汎用ブートローダをディスクに書き込むように設計されているようですmklabel。少なくとも、のラベルがmsdos使用されている場合はそうです。仮定するそれは理にかなっています。しかし、 および から見るとfdisksyslinuxパーティション マネージャーがブートローダー セクターを変更するというのは少し異常なようです。

それ思われるpartedすべきのようにないゼロ以外のデータが存在する場合、それらのセクターを上書きします。

いいえ、書き込まれないのは、すでに何かが存在する場合のみです (例: 0x00 以外)。したがって、SDK で最初にブートローダーを書き込んでからパーティション分割すれば、parted はそれをそのまま残します。

しかし、それはない私が見ている動作。 からゴミを書き込んで を/dev/urandom実行するとparted mklabel、ゼロ以外のデータは確実に上書きされます。

mbr.sファイルをアセンブルするlibpartedパートドレポ、それらのバイトがどこから来ているのかがわかります。

$ as86 -b /dev/stdout mbr.s | hexdump -e '16/1 "%02x " "\n"'
fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0
fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00
00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75
f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b
4c 02 cd 13 ea 00 7c 00 00 eb fe

あれはその通りpartedディスク上で生成されると思われるバイトシーケンス。

関連情報