Linuxが個別のブートパーティションをどのように扱うかについて興味があります。私は実際にこれを行うことに興味がありますではありませんが、これが内部でどのように機能するか知りたいのですが。
2つのパーティションsda1
とsda2
があるハードドライブsda
について考えてみます。 sda2
がLinux OSを含むroot
パーティション/
であるとしましょう。
私の理解では、ブートローダーGRUB2
は/boot
にマウントされています。ただし、ディレクトリ/boot
が別のパーティションsda2
にある場合、/
が実際にマウントされる前にこれがどのように発生する可能性がありますか?
この場合、BIOS、マスターブートレコード、およびGRUB(またはファイル/boot
))間の相互作用はどのように成功しますか?/boot
のデータはこの初期段階で実際に/
ファイルシステムにマウントされていませんか?
注: この質問 はルートパーティションのマウントを扱いますが、個別のブートパーティションについては説明しません。
ここにあなたの理解の問題があります:
私の理解では、ブートローダーGRUB2は/ bootにマウントされています。
GRUBはブート時に「マウント」されません。 GRUB isinstalledto /boot
、and isloadedマスターブートレコードのコードから。MBR/BIOS(GPT/UEFIではない)を備えたGNU/Linuxディストリビューションを想定した、最新のブートプロセスの簡単な概要は次のとおりです。
/boot
パーティション(マスターブートレコードにGRUBをインストールすると判別される)を見つけて、解析します。ファイルシステム情報。次に、ステージ2 GRUBをロードします(ここで簡略化が行われます)。/
の下に/new_root
をマウントし(おそらく暗号的にロック解除します)、udevを開始し、resume-from-swapを開始します。pivot_root
ユーティリティを使用して/new_root
を実際の/
として設定します。init
が始まります。パーティションがマウントされ、デーモンが起動し、システムが起動します。カーネルはステップ7でのみロードされることに注意してください。このため、ステップ7までマウントの概念はありません。 GRUBがすでに使用している場合でも、ステップ9で/boot
を再度マウントする必要があるのはこのためです。
また、GRUBのWikipediaページの GRUB 2セクション を参照することもできます。
Linux(カーネル)は、ブートパーティションの数を気にしません。ディスクからカーネルをロードするのはブートローダーの仕事(例:grub
、grub2
、lilo
)であり、これらのツールはカーネルが配置されている場所の数を気にしません。彼らは特定の場所のみを気にします。
例として、私のブートパーティションは/dev/md1
です。これは、物理パーティション/dev/sde1
と/dev/sdf1
によってサポートされるmdadm RAIDミラーです。必要に応じて、これらを個別にマウントすることができます。つまり、同じデータが含まれているはずですが、技術的には2つのブートパーティションがあると見なされます。
私にとって/ bootに2つのパーティションがあることは可用性の問題ですが、同じように/ bootパーティションが異なる場合もあります。次のステップは、ブートローダーがどのように知るかです。方法は次のとおりです。
menuentry 'Linux 3.10.17 (sde) kernel-3.10.17-g' {
root=hd0,1
linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3
initrd /boot/initrd-3.10.17-g
}
menuentry 'Linux 3.10.17 (sdf) kernel-3.10.17-g' {
root=hd1,1
linux /boot/kernel-3.10.17-g domdadm dolvm root=/dev/md3
initrd /boot/initrd-3.10.17-g
}
これはgrub2
構成の抜粋であり、エントリが参照するブートパーティションを確立するroot=hd0,1
とroot=hd1,1
のみが異なることに注意してください。
ここで何が起こっているのかを理解できるように、ブーツを歩きます。
grub2
)は、カーネルを含むデバイスとパーティションを認識するように設定されています。 Grub2はこのパーティションに直接アクセスし、カーネルをメモリにロードします。ブートローダーはあなたが持っているブートパーティションの数を気にしません、それはそれらがどこにあるかを気にするだけで、あなたはそれにその情報を伝えなければなりません。
カーネルは、ブートパーティションがいくつあるかを気にしません。これは、ブートパーティションを表示する必要がないためです(たとえば、新しいカーネルを追加する場合にのみ使用可能にする必要があります)。
質問1
私の理解では、ブートローダーGRUB2は/ bootにマウントされています。ただし、/ bootディレクトリが別のパーティションsda2にある場合、/が実際にマウントされる前にこれがどのように発生する可能性がありますか?
あなたが理解しているのはここだとは思いません。 GNU GRUBウィキペディアのページ から:
抜粋
コンピューターの電源がオンになると、コンピューターの [〜#〜] bios [〜#〜] は、構成されたプライマリブート可能デバイス(通常はコンピューターのハードディスク)を検出し、初期 をロードして実行しますbootstrapマスターブートレコード (MBR)からのプログラム。 MBRはハードディスクの最初の セクター であり、番号は0です(セクターのカウントは0から始まります)。長い間、セクターのサイズは512バイトでしたが、2009年以降、セクターサイズが4096バイトのハードディスクが利用可能で、 Advanced Format ディスクと呼ばれています。 2013年10月の時点でも、このようなハードディスクは 512eエミュレーション を使用することにより、512バイトのセクターで引き続きアクセスされます。
GRUBバージョン2 では、次のようになります。
抜粋
コンピュータを起動する
電源をオンにすると、次のことが起こります。
- ハードウェアが初期化し、CPUをリアルモード(仮想メモリなし)に設定し、固定位置0xFFFF0(CPU回路にハードワイヤード)にジャンプします。
- したがって、ROMまたはその場所にマッピングされたフラッシュメモリに保存されているBIOSコードが実行されます。
- BIOSコードはBIOS構成データを調べて、どちらが起動デバイスであるかを確認します。通常、このBIOS構成データは、電源をオンにした直後に特別なキーシーケンスを押すことで編集でき、BIOS構成プログラムが実行されます。特に、通常はここで起動デバイスを選択できます。
- BIOSコードは、ブートデバイスのMBRをRAMにロードします。 MBRは512バイトに過ぎないことに注意してください。ロードされたデータはもちろん、grub-installプログラムが実行されたときにgrub-installが動的に作成してそこに書き込んだプログラムとデータです。
- BIOSコードは、ロードされたMBRの開始アドレスにジャンプします(つまり、電源投入以降、Grubコードが初めて実行されます)。
- GrubのMBRコードは、アドレスがMBRブロックに組み込まれている単一のセクターをロードします。次に、そのセクターの(address、len)ペアをループして、すべてのデータをディスクからメモリに読み込みます(つまり、ファイル
/boot/grub/core.img
のコンテンツまたはその「埋め込み」コピーを読み込みます)。次に、MBRコードはロードされたコードにジャンプします。つまり、core.img
でプログラムを「実行」します。- 「Grubのインストール」セクションで説明されているように、未加工のディスクブロックアドレスを埋め込むこのトリックにより、
core.img
をパーティション内ではなく、ファイルシステムとしてまったくフォーマットされていないスペースに格納できます( 「埋め込み」)。この場合、core.img
が変更されても、新しいバージョンが同じ場所に「埋め込まれている」限り、MBRコードを更新する必要はありません。- あるいは、
core.img
が実際のファイルシステム内にあり、Grubがそのファイルシステム用のドライバーがなくてもcore.img
ファイルの内容を読み取ることができます。ただし、この場合、core.img
を変更すると、ファイルの最初のブロックにディスク上の新しいアドレスが割り当てられる可能性があります。これが発生した場合は、この新しい場所を指すようにMBRを更新する必要があります。それにもかかわらず、core.img
は通常grub-installを実行することで更新されるため、これは通常問題にはなりません。- 理論的には、
core.img
がMBRとは異なるデバイス上にあり、新しいハードウェアが追加されている場合、Grubによって生成されたMBRレコードがcore.img
ファイルを正しくロードできない可能性があります。core.img
の最初のセクターが見つかるデバイスIDはMBRに固定されており、検索されません。ただし、これに対する解決策はありません。 Grubの「search」コマンドに相当するものを512バイトのMBRに埋め込む方法はありません。ただし、この問題は起こりそうにありません。通常、core.img
はMBRと同じデバイスに埋め込まれます。また、core.img
がロードされると、search.modを使用して、すべての/boot/grub
ファイルを見つけることができるため、ハードウェアの再配置の影響を受けません。- 実行された
core.img
コードは、それに組み込まれている(core.img
にリンクされている)すべてのモジュールを初期化します。これらのモジュールの1つは、ディレクトリ/boot/grub
が存在するファイルシステムを読み取ることができるファイルシステムドライバーになります。- また、組み込みコマンドのセット(set、unset、ls、insmod)も登録します。
- 「構成ファイル」が
core.img
にリンクされている場合、これは非常に単純な組み込みスクリプトパーサーに渡されて処理されます。構成ファイル内のスクリプトコマンドは、組み込みまたはリンクされたコマンドのみを呼び出すことができます。単純なシナリオ(ローカルドライブから典型的なデスクトップコンピューターを起動するなど)では、構成ファイルは必要ありません。この機能は、pxe、リモートnfs、または/boot/grub
がLVMデバイス上にある場合のブートなどに使用されます。Core.img
はファイル“/boot/grub/normal.mod”
をディスクから動的にロードし、そのエントリ関数にジャンプします。この手順では、適切なファイルシステムドライバーを設定する必要があることに注意してください(つまり、組み込み)。
注:起動するOS /カーネルを選択する一般的なGRUB2メニューが表示された場合、システムの/boot/grub
ディレクトリを参照していますこの点。