一般的なLinuxディストリビューションから起動可能なisoファイルを作成したいと思います。 grubブートローダを作成しようとしています。まず、 grub.cfg を使用してテンプレートを作成し、最初にgrub-mkconfig
次の設定を追加します。
set default=0
set timeout=5
menuentry "LinuxTest" {
set root=(hd0)
linux /boot/bzImage root=/dev/sda1
}
それから私はgrub-mkrescue -o /path/to/file.iso /path/to/linux/files
しかし、実行しようとすると、「エラー:不明なファイルシステム」と表示されます。
これを行うために私は何を間違っていたかしませんでしたか?
答え1
2番目の画像のテキストをコピーします。
grub> ls
(proc) (hd0) (cd) (cd,apple4) (cd,apple3) (cd,apple2) (cd,apple1) (cd,gpt4) (cd,gpt3) (cd,gpt2) (cd,gpt1)
grub> _
BIOS以外のUEFI:システムは常に現在のブートメディアを(hd0)
GRUBとして予約しているわけではありません。この場合、ブートメディアがとして認識されているように見えることがあります(cd)
。
非常に単純なGRUB構成フラグメントは、単一のパーティション化されていないデバイスとして読み取ろうとします(hd0)
が、パーティション化されていない空のディスクのように見えるか、GRUBのGPTパーティション検出モジュールが認識しないパーティションのように見えます。
GRUB 構成フラグメントはそれ自体一貫性もありません。 Linuxカーネルがこれを処理すると仮定すると(hd0)
(/dev/sda
とにかく保証されません!)、これはパスを含むファイルシステムがset root=(hd0)
あることを示します。/dev/sda
/boot/bzImage
一方、Linuxカーネルブートパラメータはパーティション化をroot=/dev/sda1
推奨し、/dev/sda
ルートファイルシステムは最初のパーティションにあります。
パーティション化されておらず、/dev/sda
ディスク/イメージ全体を含む単一のファイルシステムのみを含めたり、パーティション化したりして/dev/sda1
最初のパーティションにすることはできません。
grub-mkrescue
教育的な経験のために、結果のISOイメージをループデバイスに接続し、次の場所で検出されたパーティションの内容を調べることをお勧めします。
ls /dev/loop*
sudo losetup -P --show -f /path/to/file.iso
ls /dev/loop* # you might see more than one new device!
file -s /dev/loop* # to identify the filesystem types within
このコマンドはスタイルループデバイス名をlosetup
出力しますが、実際に含まれるパーティションのループデバイスも作成します。 X位置の数字を記録し、次のいずれかのコマンドで/dev/loopX
置き換えます。X
試してみてくださいfdisk -l /dev/loopX
:単一のISOファイルに見えるものには、実際には次の有効なGPTパーティションテーブルが含まれています(パーティションサイズは異なる場合があります)。
# fdisk -l /dev/loop0
Disk /dev/loop0: 13,22 MiB, 13867008 bytes, 27084 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7FB1CA87-86D8-4C32-A49D-F5CEB184C045
Device Start End Sectors Size Type
/dev/loop0p1 64 251 188 94K Microsoft basic data
/dev/loop0p2 252 6011 5760 2,8M EFI System
/dev/loop0p3 6012 26435 20424 10M Apple HFS/HFS+
/dev/loop0p4 26436 27035 600 300K Microsoft basic data
これは、単に古いISO-9660イメージではないからです。ハイブリッドISO-9660/ハードディスクイメージ。これはLinux関連のISOイメージで非常に一般的なトリックです。
このコマンドを使用してfdisk /dev/loopX
パーティションに関する追加情報を取得すると、「Microsoft基本データ」パーティションの名前がそれぞれ「Microsoft基本データ」と「Microsoft基本データ」と表示され、非表示のために存在することを示します。 ISO-9660ファイルシステムメタデータなどは、「ハードディスクイメージ」ビューの「非表示」から削除する必要があります。i
fdisk
Gap0
Gap1
EFIシステムパーティションにはFATファイルシステムファミリが含まれていますefi/boot/bootx64.efi
。
Apple HFS +パーティションには、GRUBモジュールの完全なセットを含むディレクトリ階層と、EFIシステムパーティションのファイルと同じファイルを含むディレクトリなど、いくつかの追加ファイルを含むコピーが/path/to/linux/files
含まれています。boot/grub/
System/Library/CoreServices/
boot.efi
SystemVersion.plist
bootx64.efi
bootx64.efi
/はboot.efi
、基本的にMBR、GPT、および従来のmacOSパーティションをサポートする64ビットUEFIアーキテクチャ用のGRUBです。 (デフォルトでboot/grub/x86_64-efi/part_*.mod
可能であれば、すべてのGRUBモジュールファイルをアルファベット順にロードするように設定されています。)
ISO-9660ファイルシステムタグがに設定されていることがisoinfo -i /path/to/file.iso
わかるため、少なくともGRUB構成フラグメントを次のように設定する必要があります。grub-mkrescue
ISOIMAGE
set default=0
set timeout=5
menuentry "LinuxTest" {
search --label --set root "ISOIMAGE"
linux /bzImage root=/dev/sda
}
これにより、GRUBはラベルでファイルシステムを検索し、それ以降のすべてのファイルパス参照の新しいルートにする必要があります。
最初の写真では、ファイルがディレクトリではなくISO-9660ファイルシステムのルートにbzImage
あることがわかるため、パス名も変更する必要があります。/boot
最後に、カーネルのルートファイルシステムパラメータは難しいかもしれません。 initramfsを使用しないため、ルートファイルシステムを指定する方法にはいくつかの制限があります。ファイルシステムラベルではなく、/dev/*
名前、PARTUUID=
構文、またはPARTLABEL=
構文のみを使用できます。
ルートファイルシステムの内容はディスク装置全体からISO-9660ファイルシステムにアクセスできますが、PARTUUID=
残念ながらPARTLABEL=
。
これにアクセスする別の方法は、3番目のパーティションでHFS +ファイルシステムを使用することです(コマンドが示すPARTLABEL=HFSPLUS
ように)。しかし、カーネルイメージにApple HFS +ファイルシステムサポートを含める先見の明があるかどうか疑問です。i
fdisk /dev/loopX
GRUBls
コマンドはCD /イメージに加えてシステムにHDDもあるため、システムに含まれるストレージドライバbzImage
とシステムがドライバを検索する順序に応じて動作する場合と動作しない可能root=/dev/sda
性がありますroot=/dev/sdb
。
これは、ブータブルメディアのワンタイム、クラックで十分ですが、複数のシステムで動作する必要がある場合は、より強力なソリューションが必要です。この場合は、grub-mkrescue
意図しない目的で使用しないでください。まず、USBスティック/ハードドライブの起動とCD-ROM / DVDの起動(必要な場合)用に別々の画像を設定することをお勧めします。ハードドライブからのブートとCD / DVDメディアからのブートの違いに慣れている場合は、両方を実行するイメージに混在させるのが簡単になります。