だからカーネルとinitrdをコンパイルしました。その後、イメージを作成してgrubをインストールして実際にディスクからイメージをロードするにはどうすればよいですか?私の目標は、USBから起動可能なlivecdを作成するためにそれを使用しないことです。これに関する記事がたくさんあるからです。私の目標は、イメージを作成してから(dd if=/dev/zero of=linux.img ...
全体のイメージを生成するために必要なものがわかっている)単純にddを使用してそのイメージをディスクの最初のセクターに書き込んでからそこから起動することです。しかし、私のカーネルとinitrdはimgからどこに行きましたか?すぐ後ろ?ディスクにはパーティションがありません。これはカスタムカーネルで、最小限のbusybox設定を削除しました。したがって、/boot パーティションは必要なく、1 つ以上のファイルがないため、他のパーティションには「ファイル」は存在しません。
MBRが512バイトであることがわかっているので、grub
最初のセクタで512バイトを上書きするとします。しかし、イメージにgrubをどのようにインストールしますか?動作することができますかgrub-install linux.img
? / bootにあるので、通常の設定でカーネルとinitrdをロードする場所を知っていますが、grub
この「イメージ」には見ているパーティションはありません/boot
。ただルートをそれ自体に設定しますか?
どんな助けでも大変感謝します。
initrd生成プロセス:https://pastebin.com/ti9LXakx
initrdの現在のinitスクリプト:
#!/bin/sh
mount -t sysfs sysfs /sys
mount -t proc proc /proc
mount -t devtmpfs udev /dev
exec /bin/sh
答え1
512バイトはGRUBと比較して小さすぎます。クラシックBIOSブートMBRパーティションディスクでは、GRUBはまた、一般的に使用されていないブロック #1..#2047に自分の一部を配置します。最新のオペレーティングシステムでは正確に配置します。最初のパーティションの先頭は 1 です。ブロック#2048のディスクの先頭からMiBです。通常、GRUBコアイメージに構築するために選択した機能とGRUBモジュールにロードする機能に応じて、約100個のブロックを使用できます。一部ファイルシステム)。
また、MBRブロック(ブロック#0)から512バイトをすべて取得することもできません。 MBRブロックの末尾にある少なくとも2バイトは署名によって占められ、BIOSにディスクが起動可能であることを知らせます。
GRUBには、構成ファイル、カーネル、およびinitrdを検索するディスク/パーティション/論理ボリューム/暗号化ボリュームのデフォルトの期待があります。一種のファイルシステムが含まれます。。ディスクの連続ブロックを読み込んでカーネルとinitramfsを読み取ろうとすると、これは古代のLILOブートローダが行ったものと似ています。
簡単に言えば、パーティションテーブルを省略することはあなたが考える利点ではありません。カスタム構成では、できるGRUB がブロック #A.. #B をカーネルに、#(B+1).. #C を initramfs ファイルに読み込むようにします。しかし、これは何の理由もなくあなたの人生をより困難にするだけです。
Live CDについて言及したので、CD-ROM / DVDに書き込むとき、または仮想マシンで仮想CDとして使用するときに画像を操作するには、HDD画像とMBRの両方で動作するハイブリッド画像を作成する必要があります。ブートローダーとEl Toritoブート拡張を含む有効なISO9660 CD / DVDイメージ - これには、イメージの異なる場所に別々のブートローダーが必要です。
UEFI互換性が欲しいなら… 「学んだことを忘れなければならない」
UEFIではシステムファームウェアFATファイルシステム(FAT32が推奨されていますが、最新バージョンのUEFIでは他の形式のFATも許可されています)とそのファイルシステムで特定の名前のファイルであるブートローダが見つかると予想されます。ファイルシステムはすでにUEFI起動可能性のファームウェア要件を満たしているため、カーネル、initramfs、およびブートローダの設定を通常のファイルとして保存することもできます。
イメージを作成するには、losetup
それをデバイスにバインドして/dev/loop<device_number>
から物理ディスクのように使用できます。イメージにパーティションテーブルが含まれている場合は、losetup -P
自動的に作成されたパーティションデバイス形式を使用して、/dev/loop<device_number>p<partition_number>
イメージファイル内のすべてのパーティションに簡単にアクセスできます。