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