grub.cfgでISOイメージを動的に生成するためのメニュー項目

grub.cfgでISOイメージを動的に生成するためのメニュー項目

Linuxイメージが.isoファイルとして保存されるマルチブートハイブリッドEFI +レガシーUSBスティックを作成しています。 grub.cfgにシステムを手動で追加したり、イメージを追加したりするたびに何かをやり直すのを避けたかったので、USBドライブ上のファイルを繰り返しながら各ファイルのメニュー項目を作成してロードしました。 grub.cfgで実行したいものと同じbashは次のとおりです。

for iso in "/boot/iso/*.iso"
do
  menuentry "$iso" --class os {
    loopback loop $iso
    linux (loop)/casper/vmlinuz
    initrd (loop)/casper/initrd.lz
  }
done

ただし、GRUBシェルは自分が依存するファイル名拡張子(ワイルドカード)を実行していないようです。似たような出力をls (hd0,gpt3)/boot/isoキャプチャしてみましたが、確かにサポートもなく、追加する予定もありません。

たぶんforループでメニューを作成したいという考えを完全に失ったかもしれませんが、これを達成するモジュールがあることを願っています。また、for iso in a.iso b.isoいくつかのブロックが実際に期待どおりに作成されましたが、その中の変数は置き換えられていないことも確認しました。menuentry$iso

私の質問は、各.isoファイルのメニュー項目をどのように生成しますか?

ベストアンサー1

GRUBシェルが明らかになったするワイルドカード拡張はサポートされていますが、GRUBのregexpモジュールを初めてロードする場合にのみ可能です。引用符に注意することも重要です。

変数をパラメータとして指定して渡すこともできますmenuentry(メニュー項目を関数として考えます)。その後、通貨に変換され、次のようにsetparams設定されます。$1, $2, $3次のコマンドは、イメージのファイル名をハードコードせずにLinux Mintイメージを正常に起動します。

insmod regexp

for iso in /boot/iso/*.iso
do
  menuentry $iso $iso {
    echo "Booting from $2"
    loopback loop $2
    linux (loop)/casper/vmlinuz file=/cdrom/preseed/linuxmint.seed boot=casper iso-scan/filename=$2
    initrd (loop)/casper/initrd.lz
  }
done

私も見つけました。マルチブートUSBプロジェクト、そうです。正確に私が達成しようとしたことは私の努力を無駄にしました。

おすすめ記事