설정
주인
OS: Manjaro XFCE x86_64
Apps: packer (plugins: virtualbox-iso),
손님
OS: Arch Linux
Hypervisor: Virtualbox
Architecture: x64
Packer를 사용하여 Vagrant 상자를 만들었습니다.
내 목표는 VMbox가 Docker 컨테이너 애플리케이션과 같은 애플리케이션을 실행하도록 하는 것입니다. 하지만 애플리케이션에는 파티션을 사용해야 하기 때문에 일부 위험을 피하기 위해 Docker를 사용할 수 없습니다. Vagrant Box는 사용자 정의 가상 머신입니다.
이렇게 하면 다른 사람들도 귀하와 동일한 운영 체제 설정을 가질 수 있습니다.
Virtualbox용으로 하나 만들었지만 아직 완전히 구현되지 않았습니다. VM을 현대화하고 싶어서 UEFI를 사용하고 싶지만 VM용으로 구축하는 방법을
잘 모르겠습니다 .
이것이 내가 이 문제를 겪는 이유입니다:
UEFI fails to load properly. BdsDxe: failed to load Boot0001 "UEFI VBOX Harddisk"
내 상자에 제공된 부팅 순서를 확인하는 것이 virtualbox에서 찾을 수 있는 것과 일치하지 않는다는 것을 알았기 때문에 그 이유가 궁금했습니다.
Virtualbox에는 두 가지 옵션만 있습니다. 첫 번째는 찾을 수 없는 하드 디스크 부팅이고, 두 번째는 일종의 네트워크 부팅을 활성화하는 것입니다.
Vagrant Box를 만드는 과정에서 efibootmgr
내 디스크가 부팅 순서로 무엇을 제공해야 하는지 알아보기 위해 전화를 걸었습니다.
efibootmgr의 출력
SE_bastille-installer-box.virtualbox-iso.archlinux: ==> bootloader.sh: Check boots..
SE_bastille-installer-box.virtualbox-iso.archlinux: BootCurrent: 0001
SE_bastille-installer-box.virtualbox-iso.archlinux: Timeout: 0 seconds
SE_bastille-installer-box.virtualbox-iso.archlinux: BootOrder: 0005,0000,0002,0003,0004
SE_bastille-installer-box.virtualbox-iso.archlinux: Boot0000* UiApp FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
SE_bastille-installer-box.virtualbox-iso.archlinux: Boot0002* UEFI VBOX HARDDISK PciRoot(0x0)/Pci(0xf,0x0)/SCSI(0,0){auto_created_boot_option}
SE_bastille-installer-box.virtualbox-iso.archlinux: Boot0003* UEFI PXEv4 (MAC:0800277E9510) PciRoot(0x0)/Pci(0x3,0x0)/MAC(0800277e9510,1)/IPv4(0.0.0.00.0.0.0,0,0){auto_created_boot_option}
SE_bastille-installer-box.virtualbox-iso.archlinux: Boot0004 EFI Internal Shell FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(7c04a583-9e3e-4f1c-ad65-e05268d0b4d1)
SE_bastille-installer-box.virtualbox-iso.archlinux: Boot0005* GRUB HD(1,GPT,1e8f8680-99c0-4c28-b83a-eb601805d4c4,0x800,0x96000)/File(\EFI\GRUB\grubx64.efi)
다음은 부트로더를 빌드하는 스크립트입니다. 스크립트/bootloader.sh
#!/usr/bin/env bash
. /root/vars.sh
NAME_SH=bootloader.sh
# stop on errors
set -eu
echo "==> ${NAME_SH}: Installing grub packages.."
/usr/bin/arch-chroot ${ROOT_DIR} /usr/bin/pacman --noconfirm -S edk2-ovmf efibootmgr grub os-prober >/dev/null
echo "==> ${NAME_SH}: Pre-configure grub.."
/usr/bin/arch-chroot ${ROOT_DIR} sed -i 's/#GRUB_DISABLE_OS_PROBER/GRUB_DISABLE_OS_PROBER/' /etc/default/grub
echo "==> ${NAME_SH}: Installing grub.."
/usr/bin/arch-chroot ${ROOT_DIR} grub-install --target=x86_64-efi --efi-directory=${ESP_DIR} --bootloader-id=GRUB &>/dev/null
/usr/bin/arch-chroot ${ROOT_DIR} grub-mkconfig -o /boot/grub/grub.cfg &>/dev/null
echo "==> ${NAME_SH}: Check boots.."
if [[ $PACKER_BUILDER_TYPE == "virtualbox-iso" ]]; then
/usr/bin/arch-chroot ${ROOT_DIR} efibootmgr --delete-bootnum --bootnum 1
fi
/usr/bin/arch-chroot ${ROOT_DIR} efibootmgr
EFI 파일은 셸에서 찾을 수 있으므로 최소한 올바른 작업을 수행하고 있습니다.
작동하도록 부팅 옵션을 추가할 수 있지만 상자가 작동하도록 하고 싶습니다.. 음.. 상자에서 꺼낸 후!
내가 뭘 잘못했나요?
답변1
분명히 이 문제는 너무 흔해서 Arch Linux 위키 문제 해결 페이지에 나타납니다.https://wiki.archlinux.org/title/GRUB#Default/fallback_boot_path
스크립트/bootloader.sh
...
echo "==> ${NAME_SH}: Installing grub.."
/usr/bin/arch-chroot ${ROOT_DIR} grub-install --target=x86_64-efi --efi-directory=${ESP_DIR} --bootloader-id=GRUB --removeable &>/dev/null
...