Linuxブートプロセスを理解するために、grubをディスクイメージファイルに入れ、qemuでブートしようとしました。まだカーネルイメージをドライブに入れていません。ただグラブです。私は以下を使用してgrubをインストールしました。
kpartx -av mydrive.img
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 mnt/mydrive/
cd mnt/mydrive/boot
grub-install --no-floppy --boot-directory=. -v /dev/loop0
起動順序を段階的に進めたいので、 grub でカーネルが欠落していると主張し、カーネルをインストールして X までエントリを追加して問題を解決したいと思います。
今は理解
エラー:該当するデバイスがありません
しかし予想される
エラー:設定ファイルがありません。
構造メッセージを作成してls
提供してください。
(hd0) (fd0)
質問:*grubが探しているデバイスは何ですか?これはホストシステムを意味しますか? [一部解決済み、UUIDが仮想ファイルシステムのUUIDと同じ] * Grubがデバイスを見つけられないのはなぜですか?
VM内のlive-cdからgrub(grubのみインストール)をインストールすると(小さなバイナリディストリビューションであるため、Bodhi-linuxを選択しました)、すべてがうまく機能します。 qemuはブートパーティションに外部で使用されているものとは異なるuuidを提供しますか?
以下は、仮想ドライブのパーティションテーブルです。
Disk mydrive.img: 264 MB, 264241152 byte
32 huvuden, 63 sektorer/spår, 256 cylindrar, totalt 516096 sektorer
Enheter = sektorer av 1 · 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Diskidentifierare: 0xebe6ebdb
Enhet Start Början Slut Block Id System
mydrive.img1 2048 516095 257024 83 Linux
答え1
grubはデフォルトでこのパーティションタイプのモジュールをインストールしないようです(DOS / MBRパーティションラベルであると仮定します)。core.img。
次のコマンドを使用して必要なモジュールをインストールすることもできます。
grub-install --modules part_msdos --root-directory=. /dev/loop0
その後、grubはパーティションテーブル、ファイルシステム、およびmnt/mydrive/boot
。
したがって、grubコマンドはls
次のように出力する必要があります。
(hd0) (hd0,msdos1) (hd0)
答え2
Gilesが指摘したように、これはx86アーキテクチャにのみ適用されます。
背景
正しい順序を知りたい場合は、カーネルをインストールする前にQEMUにホストシステムをインストールする必要があります。このアプローチは、起動プロセスを理解する上で直観に反するように見えるかもしれませんが、唯一の有効なアプローチです。説明します。
すべてのオペレーティングシステムの実行システムは、少なくとも3つの部分で構成されています。
- カーネル
- 荷物を載せる人
- 最終起動オペレーティングシステム。
コンピュータは2つのモードで動作します。
すべてのx86プロセッサは、実行速度がいくら複雑であっても高速であっても、これら2つのモードのいずれかの形式で動作します。詳細については、私がリンクしたWikipediaの記事の右側にあるリストをご覧ください。
どのように動作しますか?
- すべてのコンピュータはリアルモードで起動します。
- リアルモードでは、BIOS設定の確認、すべてのデバイス接続の確認、クロックタイミング制御などの操作を実行できます。
- リアルモードがチェックを完了すると、コントロールはブートローダとも呼ばれるローダに転送されます。ブートローダは、PC制御をリアルモードから保護モードに切り替えるのに十分なコードセグメントをロードし、名前が示すように正確に実行します。一部のブートローダは「引き継ぎ」の開始時にこの転送を実装し、一部は最後に実装しますが、ほとんどは段階的に実行します。 ガイドを見る。
- ブートローダがロードフェーズを完了すると、オペレーティングシステムは次の再起動までPCが「永続保護モード」になり、他のすべてのタスクを安全かつ効率的に処理できるようになりました。
これはGrubとどのような関係がありますか?
Grubが正しくインストールされたときにコピーされたファイルを見ると、Stage.というテキストを含むファイルを見ることができます。 3つあるはずです。 Stage1*、Stage1_5*、Stage2*
- Stage1ロードは
boot.img
MBR / EFIに組み込まれています。ディスクに接続し、最後にロードするように構成されています。core.img
core.img
Stage1_5は、BootSectorと呼ばれるセクタ0-62をロードするためによく使用されます。通常、これらのセクターには何も含まれていないため、そのセクター内の項目は上書きまたは自動的に更新されません。- Stage_2が起動すると、最初の62セクタとカーネルパスが決まります。 Stage_2はカーネルとヘルプファイルを最も自然にロードします。初期RAMディスク記憶を入力してください。その後、RAMディスクとカーネルを解凍し、システムをセットアップし、選択したLinuxオペレーティングシステムに制御を転送するために使用されます。
バラよりGNUグラップ
今私がこれを言う理由は直観に反しています。「これはどのように機能しますか?」のステップ3から始めて、「これはGrubとどのような関係がありますか?」では作業できません。。 Stage1.5が完了すると、Stage_2はカーネルや初期RAMディスク(存在する場合)などの回復プロンプトを送信します。この場合、解凍後にデバイスを設定する必要はありませんhd0
。 Grubが報告したバグも正確です。
エラー:該当するデバイスがありません
hd0
そうです。設定するオペレーティングシステムがないので、Grub Stage_2に「いいえ、私がロードする必要があるオペレーティングシステムです」と言うオペレーティングシステムがないからです。まず、オペレーティングシステムをインストールしてからカーネルをインストールし、最後にブートローダをインストールします。あなたの場合は、LiveCDのISOイメージをCDROMにマウントするようにQEMUを設定し、仮想ディスクにオペレーティングシステムをインストールしてhd0
ブートローダを設定する必要があります。 LiveCDのリストについては、以下を参照してください。DistroWatchのメジャーリリース。膨らみが少ない方が便利な場合は、ソースベースのディストリビューションをお試しください。Gentooのように。