LinuxはMBRパーティションテーブルがあるかどうかをどうやって知ることができますか?

LinuxはMBRパーティションテーブルがあるかどうかをどうやって知ることができますか?

msdosパーティションテーブルMBRが55 AA(16進数)で終わるので、この問題は簡単だと思うかもしれません。ただし、パーティションテーブルなしでFAT32でフォーマットされたディスクも55 AAで終わるためではありません。

次のようにディスクをフォーマットします。

mkfs.vfat -F32 /dev/sdX

これらのディスクにはパーティションテーブルがなく、LinuxとWindowsの両方で認識されます。最初の512バイトは55AAで終わります。

Linuxは55 AAで終わっても、そのようなディスクに有効なパーティションテーブルがないことをどうやって知ることができますか?

答え1

これがブロックデバイスの最初のセクタであり、0x55 0xAAで終わっても、LinuxカーネルはこれがMBRではないことをどうやって知ることができますか?

答えはコードにあります:https://elixir.bootlin.com/linux/latest/source/block/partitions/msdos.c#L616

まず、そのセクタのデータをパーティションテーブルとして解釈し、次にFATメタデータとして解釈しようとします。 2番目のケースでは、ブロックデバイス用のパーティションは作成されません。これは経験的な方法であるため、PBRに存在しないパーティションテーブルが誤って検出されるいくつかの極端なケースがあります。


元のDOSブートプロセスは次のように動作します。

最初のセクタには、マスターブートレコード、パーティションテーブル、および小さなコードフラグメントが含まれています。最新システムのこのコードは、より複雑なブートローダを呼び出します。この時点で、パーティションテーブルエントリを見て、最初のアクティブ(起動可能)パーティションの最初のセクタの実行を開始します。

最初のセクターはFATパーティションのブートレコードです(https://wiki.osdev.org/FAT#Boot_Record)には小さなコードスニペットも含まれています。これはDOSに必要なフルブートローダです(これはIO.SYSファイルとMSDOS.SYSファイルをロードすることです)。

パーティションブートレコードとマスターブートレコードの署名は両方とも0x55 0xAAです。フロッピーディスクなどのリムーバブルドライブでは、スペースを無駄にするためにパーティションテーブルを持つことは意味がないため、ディスクはFATパーティションとそのブートレコードで始まります。ローダーコードはMBRのようにオフセット0から始まり、BIOSには影響しません。そこにあるすべてを実行するだけです。

もちろん、PBRはMBRと構造が異なり、FATファイルシステムの特性を説明しています。

答え2

Linuxはどのように知っていますか

ここでは用語について明確にする必要があります。Linuxこの場合は?

  • Linux(または他のオペレーティングシステムの起動プロセス):mkfs.vfatフォーマットされたディスクするMBRブートセクタとエントリが1つしかないパーティションテーブルで始まります。〜する起動時に実行されます。確認してみるman mkfs.vfat部分--mbr=no

    セクター 0 (MBR 自体を含む) から始まり、ディスク装置全体にわたるパーティションのディスク署名で (偽) MBR 表を入力します。 Microsoft Windows システムでリムーバブルでないディスクを使用する場合と、パーティション化されていないディスク全体をフォーマットする場合にのみ必要です。ディスク署名とパーティションテーブルの位置は、最初のFATセクタの終わり(ブートコードの場所)と重なるため、追加のスペースは使用されません。

    • Linuxパーティショニングツールもこのテーブルを検出します。fallocate -l 100M fatimg; mkfs.vfat -F32 fatimg; echo print all | parted fatimg
  • しかし、現代にはバグがあるようで、mkfs.vfat少なくとも--mbr=noファイル形式を指定するときは通常無視されます。
  • Linuxカーネルパーティションスキャンは、予想されるMBRテーブル、つまりディスクの先頭にのみ興味があります。
  • Linuxでパーティションを見つけたら、マウントツールがファイルシステムを調べてVFATを確認するのは簡単です。 VFATファイルシステムかどうか返品MBRレコードを含む:関連なし。ファイルシステムドライバは関係ありません。

答え3

必ず知っておくべきことはLinuxではなくBIOSです。

BIOSはブートセクタ(ディスクの最初のセクタ)をロードし、それを実行します(ユーザーが作成した署名があります)。ブートセクタの最後の部分には4つのパーティションがあります。ブートコードはアクティブパーティションを見つけ、それをメモリにロードして実行します(ブートセクタはメモリの正確な場所にあると予想されるため、実際のセクタのコピーもあり、そこにジャンプします)。新しいブートセクタはオペレーティングシステムをブートしたり、MBRと非常に似ている可能性がありますが、この場合はセカンダリパーティションテーブルであるため、再帰的に実行されます。 GRUBは、より多くのコードを保存するために(セカンダリGRUBコードをロードするために)ディスクセクタが512バイト(フロッピーディスクセクタサイズ)より大きいことを利用してブートセクタを変更します。

これがコードの実行方法です。

Linux(およびLinux)のプログラムはMBRのテーブル構造(そして見てわかるように、他のパーティションテーブルフォーマットは単なる慣例である)を知っているので、ハードディスクでは最初のセクタになければならず、すべてのパーティションテーブルフォーマットは拡張テーブルにパーティションが必要です。最終的には拡張テーブルへの追加リンクが必要です。

プログラムやカーネルが認識しないと編集できません。ただし、BIOSが起動できる可能性があります(または起動セクタのコードがこれを実行できることをお勧めします)。私たちは古いプログラムについて話しており、メモリが非常に限られているので、あまりにも多くのロジックを期待しないでください。最悪のシナリオ:「再起動するには、任意のキーを押してください。」

関連情報