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ファイルには、最初と2番目のパーティションの正しい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に加えて、2つの違いしかありません。

  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をrawディスクイメージからqcow2イメージに変換しました。私はシステムデバイスを復元したことがないので、ここ数時間この画像を起動してきました。 「間違い#1」以降のすべては赤ニシンです。それでも素晴らしい学習補助資料なのでそのままにします。

ベストアンサー1

おすすめ記事