Grub2 이후의 MBR 격차를 설명할 수 있나요?

Grub2 이후의 MBR 격차를 설명할 수 있나요?

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_fileQEMU의 직렬 콘솔에서 볼 수 있도록 직렬 출력을 열도록 몇 가지 사소한 변경만 수행했습니다.

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"

제가 지금까지 확인한 내용은 다음과 같습니다.

  1. MBR에는 grub이 디스크 이미지에 자체적으로 설치되었음을 나타내는 "GRUB" 문자열이 포함되어 있습니다.
  2. 파티션 테이블에 MBR 이후 간격이 충분히 큽니다.
  3. 첫 번째 파티션에는 부팅 플래그가 설정되어 있습니다.
  4. 첫 번째 파티션은 vfat파일 시스템 입니다.
  5. 첫 번째 파티션에는 /grub/grub.cfg관련 파일이 포함되어 있습니다.
  6. 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 외에 두 가지 차이점만 있습니다.

  1. set root=(hd0,1)
  2. 추가 매개변수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" 이후의 모든 것은 붉은 청어입니다. 그래도 훌륭한 학습 보조 자료이므로 그대로 두겠습니다.

관련 정보