QEMU 기반 가상 머신에 사용하기 위해 RAW 디스크 이미지를 설정할 때 QEMU는 GRUB을 로드하지만 GRUB은 부팅을 위해 운영 체제 메뉴를 로드하지 않기 때문에 좌절감을 느꼈습니다. 저는 GRUB이 crug.cfg 파일을 찾을 수 없어야 한다는 결론에 도달했습니다. 이로 인해 MBR 이후 간격에서 잘못된 내용을 인코딩했다고 믿게 되었습니다. 이 격차의 내용을 검사할 수 있는 도구가 있습니까?
VM 이미지에 GRUB를 설치하는 방법은 다음과 같습니다.
# Disk Image
fallocate -l $((4*1024*1024*1024)) "$file"
DEV=$(sudo losetup --show --nooverlap --find "$file")
# Partition Table
sudo parted "$DEV" mklabel msdos
sudo parted "$DEV" mkpart primary fat16 1MiB 101MiB
sudo parted "$DEV" mkpart primary ext4 102MiB 100%
sudo parted "$DEV" set 1 boot on
sudo mkfs.vfat "${DEV}p1"
sudo mkfs.ext4 -E lazy_journal_init=1 -E lazy_itable_init=1 -E discard "${DEV}p2"
# Mounting, installing base packages, configuration, etc..
# ...
# Bootloader
sudo mkdir "$mountpoint/boot/grub"
sudo install "$grub_default_file" "$mountpoint/etc/default/grub"
sudo arch-chroot "$mountpoint" grub-install --boot-directory="/boot/grub" --target=i386-pc "$DEV"
sudo arch-chroot "$mountpoint" grub-mkconfig -o "/boot/grub/grub.cfg"
수정된 버전에서는 $grub_default_file
QEMU의 직렬 콘솔에서 볼 수 있도록 직렬 출력을 열도록 몇 가지 사소한 변경만 수행했습니다.
GRUB_CMDLINE_LINUX="quiet console=tty0 console=ttyS0,38400n8"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=38400 --unit=0 --word=8 --parity=no --stop=1"
제가 지금까지 확인한 내용은 다음과 같습니다.
- MBR에는 grub이 디스크 이미지에 자체적으로 설치되었음을 나타내는 "GRUB" 문자열이 포함되어 있습니다.
- 파티션 테이블에 MBR 이후 간격이 충분히 큽니다.
- 첫 번째 파티션에는 부팅 플래그가 설정되어 있습니다.
- 첫 번째 파티션은
vfat
파일 시스템 입니다. - 첫 번째 파티션에는
/grub/grub.cfg
관련 파일이 포함되어 있습니다. - 이
grub.cfg
파일에는 첫 번째 및 두 번째 파티션에 대한 올바른 UUID가 포함되어 있습니다.
실제로 확인할 수 없는 유일한 링크는 grub에서 구성 파일이 포함된 파티션을 찾는 것입니다. 어쩌면 내가 잘못된 시작 플래그를 설정했을 수도 있습니다. 어쩌면 내가 잘못된 파일 시스템 유형을 선택했을 수도 있습니다. MBR/MBR 이후 간격에서 grub이 파티션 위치를 잘못 인코딩했을 수 있습니다. 디버깅이 상당히 어렵습니다.
$ sudo dd if=zonemanager bs=$((2048*512)) count=1 | strings | grep -i grub
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00742499 s, 141 MB/s
GRUB
$ sudo parted /dev/loop1
GNU Parted 3.2
Using /dev/loop1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop1: 8388608s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 2048s 206847s 204800s primary fat16 boot, lba
2 208896s 8388607s 8179712s primary ext4
$ sudo file -s /dev/loop1
/dev/loop1: DOS/MBR boot sector
$ sudo file -s /dev/loop1p1
/dev/loop1p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors 4, root entries )
$ sudo lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
loop1
├─loop1p1 vfat 58D5-B48F 45.1M 55% /mnt/boot
└─loop1p2 ext4 0014f737-33b7-4dba-be4a-2b186e2e46a0 2.1G 39% /mnt
$ grep 58D5-B48F /mnt/boot/grub/grub.cfg
search --no-floppy --fs-uuid --set=root 58D5-B48F
search --no-floppy --fs-uuid --set=root 58D5-B48F
search --no-floppy --fs-uuid --set=root 58D5-B48F
search --no-floppy --fs-uuid --set=root 58D5-B48F
search --no-floppy --fs-uuid --set=root 58D5-B48F
search --no-floppy --fs-uuid --set=root 58D5-B48F
$ grep 0014f737-33b7-4dba-be4a-2b186e2e46a0 /mnt/boot/grub/grub.cfg
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-0014f737-33b7-4dba-be4a-2b186e2e46a0' {
linux /vmlinuz-linux root=UUID=0014f737-33b7-4dba-be4a-2b186e2e46a0 rw quiet console=tty0 console=ttyS0,38400n8 quiet
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-0014f737-33b7-4dba-be4a-2b186e2e46a0' {
menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-0014f737-33b7-4{
linux /vmlinuz-linux root=UUID=0014f737-33b7-4dba-be4a-2b186e2e46a0 rw quiet console=tty0 console=ttyS0,38400n8 quiet
menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-fal{
linux /vmlinuz-linux root=UUID=0014f737-33b7-4dba-be4a-2b186e2e46a0 rw quiet console=tty0 console=ttyS0,38400n8 quiet
실수 #1: 대신에 grub-install --boot-directory
이어야 합니다 ./boot
/boot/grub
현재 조사 #1: grub.cfg
이를 알려진 작동 QEMU VM과 비교했습니다. 장치의 UUID 외에 두 가지 차이점만 있습니다.
set root=(hd0,1)
- 추가 매개변수
search
피복재
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275//disk@0,msdos1' --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 0959-F5DD
작동 안함
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root ECB4-BE7A
현재 조사 #2: Grub Shell에 있는 동안 초기 사용자 공간을 찾아 부팅할 수 있습니다.
GNU GRUB version 2.02
Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists possible
device or file completions.
grub> set pager=1
grub> echo $feature_platform_search_hint
y
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1) (fd0)
grub> ls (hd0,msdos1)/
vmlinuz-linux initramfs-linux.img initramfs-linux-fallback.img grub/
grub> set root=(hd0,msdos1)
grub> linux /vmlinuz-linux root=UUID=0014f737-33b7-4dba-be4a-2b186e2e46a0 rw quiet console=tty0 console=ttyS0,38400n8 quiet
grub> initrd /initramfs-linux.img
grub> boot
Starting version 242.32-2-arch
또한 이 configfile
명령을 사용하면 실제로 메뉴가 로드됩니다!
grub> configfile /grub/grub.cfg
그래서 이것은 어떤 이유로 grub이 구성 파일을 찾을 수 없다고 믿게 만듭니다.
실수 #2: 올바른 이미지 파일을 부팅합니다.
작동 중인 VM과 작동하지 않는 VM 사이의 변수를 제거하기 위해 작동하지 않는 VM을 원시 디스크 이미지에서 qcow2 이미지로 변환했습니다. 나는 시스템 장치를 복원한 적이 없기 때문에 지난 몇 시간 동안 이 이미지를 부팅해 왔습니다. "실수 #1" 이후의 모든 것은 붉은 청어입니다. 그래도 훌륭한 학습 보조 자료이므로 그대로 두겠습니다.