GRUB 소개
GRUB(GRand Unified Bootloader)[그러브]는 Linux 기반 운영체제의 부팅을 위해 사용되는 부트로더 시스템이다. 거의 대부분의 Linux 기반 운영체제를 포함하여 Windows 부트로더인 Windows Boot Manager를 로드하는 기능 또한 수행할 수 있어 부트로더 중 가장 먼저 실행되어 활용할 수 있다.
여기선 Ubuntu 설치 이미지에 포함된 GRUB 부트로더를 가져와 설치하고 부트 메뉴를 구성한 뒤 iso 파일을 로드하거나 다른 부트로더를 로드하는 과정에 대해서 설명한다.
Windows 부트로더(bootmgr)에서는 리눅스 부팅을 위한 GRUB로의 Chainloading을 지원하지 않으므로 GRUB가 1차 부트로더가 되어야 한다.
GRUB 설치
Rufus의 UEFI:NTFS 부트로더가 설치된 USB는 처음에 UEFI_NTFS 파티션이 로드가 되고 그 뒤 본 파티션에서 efi/boot/bootx64.efi 및 efi/boot/grubx64.efi 파일을 로드한다. GRUB 부트로더를 실행하기 위한 절차이며, 이 문서에서는 Ubuntu ISO 파일에 포함되어 있는 GRUB 바이너리를 설치한다. 2023년 3월 6일 기준 최신 Ubuntu 버전은 22.04.2이다. ubuntu-22.04.2-live-server-amd64.iso 파일을 다운로드 한 뒤 압축 프로그램으로 파일을 압축해제하면, GRUB 부트로더를 추출할 수 있는데, 아래 경로의 파일을 복사하여 USB의 동일한 경로에 붙여 넣는다. 해당 GRUB의 버전은 2.06이다.
├─boot │ └─grub │ │ grub.cfg │ │ │ ├─fonts │ │ unicode.pf2 │ │ │ ├─i386-pc │ │ * │ │ │ └─x86_64-efi │ * │ └─efi └─boot bootx64.efi grubx64.efi
grub.cfg
이제 GRUB 부팅이 가능한 상태다. 하지만 부트 메뉴를 구성하지 않았기 때문에 grub.cfg 파일을 수정하여 메뉴를 구성할 수 있다. boot/grub/grub.cfg 파일이 GRUB의 부팅 메뉴 구성 파일이며, 해당 파일을 GRUB 문법에 맞게 수정하여 Linux 배포판 별 ISO 파일을 로드하거나 Windows 부트 매니저를 로드하는 등의 작업을 할 수 있다.
if loadfont /boot/grub/font.pf2 ; then set gfxmode=auto insmod efi_gop insmod efi_uga insmod gfxterm terminal_output gfxterm fi if [ $grub_platform = pc ] ; then set menu_color_normal=black/light-gray set menu_color_highlight=white/magenta fi if [ $grub_platform = efi ] ; then set menu_color_normal=black/light-gray set menu_color_highlight=white/red fi set default=3 set timeout=-1 menuentry 'Master bootloader' {true} if [ $grub_platform = pc ] ; then menuentry 'This system has been booted to the Legacy BIOS platform with USB.' {true} fi if [ $grub_platform = efi ] ; then menuentry 'This system has been booted to the EFI platform with USB.' {true} fi menuentry '--------------------------------------------------------------' {true} menuentry 'Chainloading Windows Boot Manager' { chainloader /EFI/BOOT/bootmgfw.efi } menuentry 'Boot ubuntu-18.04.6-desktop-amd64' { set iso_path='/iso/ubuntu-18.04.6-desktop-amd64.iso' loopback loop $iso_path linux (loop)/casper/vmlinuz boot=/casper file=/preseed/ubuntu.seed iso-scan/filename=$iso_path noeject noprompt splash -- initrd (loop)/casper/initrd } menuentry 'Install ubuntu-18.04.6-server-amd64' { set iso_path='/iso/ubuntu-18.04.6-server-amd64.iso' loopback loop $iso_path set gfxpayload=keep linux (loop)/install/vmlinuz boot=/install file=/preseed/ubuntu-server.seed iso-scan/filename=$iso_path noeject noprompt splash -- initrd (loop)/install/initrd.gz } menuentry 'Boot ubuntu-20.04-desktop-amd64' { set iso_path='/iso/ubuntu-20.04-desktop-amd64.iso' search --set -f $iso_path loopback loop $iso_path linux (loop)/casper/vmlinuz boot=/casper file=/preseed/ubuntu.seed iso-scan/filename=$iso_path noeject noprompt splash -- initrd (loop)/casper/initrd } menuentry 'Install ubuntu-20.04-server-amd64' { set iso_path='/iso/ubuntu-20.04-legacy-server-amd64.iso' search --set -f $iso_path # set gfxpayload=keep loopback loop $iso_path linux (loop)/install/vmlinuz boot=/install file=/preseed/ubuntu-server.seed iso-scan/filename=$iso_path noeject noprompt splash -- initrd (loop)/install/initrd.gz } menuentry '--------------------------------------------------------------' {true} menuentry 'System Firmware Settings' { fwsetup } menuentry 'System Reboot' { reboot } menuentry 'System Shutdown' { halt } menuentry 'Exit GRUB' { exit }