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(これは小さなバイナリディストリビューションであるため、Bodhi-linuxを選択しました)からgrub(およびgrub以外は何もありません)をインストールすると、すべて正常に機能します。 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
この種のパーティションのモジュール(DOS/MBRパーティションラベルを想定しています)は、デフォルトではgrubによってcore.imgにインストールされていないようです。
以下を使用して、必要なモジュールもインストールします。
grub-install --modules part_msdos --root-directory=. /dev/loop0
次に、grubはパーティションテーブル、ファイルシステム、したがってmnt/mydrive/boot
に含まれるインストールを読み取ることができるはずです。
その結果、grubコマンドls
は次のように出力されます。
(hd0) (hd0,msdos1) (hd0)
Gilesが指摘したように、これはx86アーキテクチャにのみ適用されることに注意してください。
適切な順序を知りたい場合は、カーネルをインストールする前に、QEMUにホストシステムをインストールする必要があります。このアプローチは、起動プロセスについて学習するのとは直感に反しているように見えますが、唯一の有効な方法です。説明させてください:
任意のOSの実行中のシステムには、少なくとも3つの部分があります。
コンピューターは2つのモードで動作します。
すべてのx86プロセッサは、どれほど洗練されていても、どれだけ高速に動作しても、これら2つのモードの何らかの形で動作します。詳細については、リンクしたWikiPediaの記事の右側にあるリストを参照してください。
Grubを正しくインストールしたときにコピーされたファイルを見ると、Stageというテキストを含むファイルがあります。 3つあるはずです。Stage1*、Stage1_5 *、およびStage2 *
boot.img
をロードします。ディスクに接続し、最後にcore.img
をロードするように構成されていますcore.img
を使用して、一般にBootSectorと呼ばれるセクター0〜62をロードします。慣例により、これらのセクターには何も含まれていないため、それらに配置されたアイテムが自動的に上書きまたは更新されることはありません。GNU Grub を参照してください
さて、これが直感に反すると言う理由:これがどのように機能するかについてのステップ3から始めて、これがどのようにGrubに関連するかを理解することはできません 。 Stage1.5が完了すると、Stage_2はレスキュープロンプトに送信します。カーネルと初期値RAMディスクがある場合は、圧縮されていない場合はセットアップするデバイスがありません。この場合はhd0
。また、Grubが報告しているエラーは正しいです。
エラー:そのようなデバイスはありません
hd0
にセットアップするOSがないため、正しいです。したがって、GrubStage_2に「ロードする必要のあるOSです」と伝えるOSはありません。そのため、OSをビルドまたはインストールしてからカーネルをインストールし、最後にブートローダーをインストールすることで、逆方向に作業する必要があります。この場合、LiveCDのISOイメージをCDROMとしてロードするようにQEMUを構成してから、仮想ディスクhd0
にOSをインストールしてから、ブートローダーを構成する必要があります。 LiveCDのリストについては、 DistroWatch Major Distributions を参照してください。膨張が少ない方が快適だと感じる場合は、ソースベースのディストリビューションを試してください Gentooなど 。