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프로젝트, 그렇죠정확하게내가 달성하려고 했던 것이 나의 노력을 쓸모없게 만들었습니다.

관련 정보