私の理解では、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
使用されている場合はそうです。仮定するそれは理にかなっています。しかし、 および から見るとfdisk
、syslinux
パーティション マネージャーがブートローダー セクターを変更するというのは少し異常なようです。
それ思われる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
ディスク上で生成されると思われるバイトシーケンス。