J4125ミニPCのVMware ESXi上に自宅用DNSサーバとして構築した、 Alpine Linux 仮想マシンが再起動後 grub がコケて 起動不能 の事態に。 edge レポジトリ参照にしていたことから grub が アップデート され、必要な手作業がなされぬまま再起動してしまったためで、リリースノートの解説に沿って復旧させます。
再起動後にgrubがコケるまで
以前、この仮想マシンを構築した当時は、Alpine Linux 3.17でした。
その後に導入したNetdataのパッケージを新しくするために、edgeレポジトリを有効にしました。
その後、数ヶ月してメンテナンスがてら、パッケージマネージャから何気なく更新(ここでgrubも更新される)、
|
1 2 |
$ sudo apk update $ sudo apk upgrade |
その時再起動すれば良いものを数日放置して、手動再起動するとgrubメニュー出ずにBIOS画面へ飛ばされるように。
Alpine Linux 3.20リリースノートに全て書いてある
ヘッドレス仮想マシンで運用している自宅DNSサーバが起動不能になったことから、さあ大変。ルータにDNSを担ってもらいつつ、grub辺りで何があったのか調べてみると、Alpine Linux 3.20(アルファリリース)のリリースノートにその答えは明記されていました。
grubが大きく変わったことから、更新後再起動する前に必ずブートローダを再インストールしなさい、と言う注意書きとその手順(EFI項参照)、さらに今回のようにブートローダそのままで再起動してしまった場合の暫定復旧方法(Short-term work-around項参照)までしっかり提示されていました。
そこでまず、適当なISOから仮想マシンを起動、暫定対策の後にシステムを再起動した上で、新しいブートローダをインストール、という手順で進めます。
Alpine LinuxインストールISOから起動
仮想マシンを一旦シャットダウンさせ、Alpine LinuxのインストールISOがまだ残っていたので、仮想光学ドライブに登録して起動させます。
起動後、仮想ディスクのパーティション構成を確認、
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
~# sudo fdisk -l Found valid GPT with protective MBR; using GPT Disk /dev/sda: 8388608 sectors, 0 Logical sector size: 512 Disk identifier (GUID): bc9951ab-42e0-5f4a-b3e1-40cecc912bb1 Partition table holds up to 128 entries First usable sector is 2048, last usable sector is 8388574 Number Start (sector) End (sector) Size Name 1 2048 329727 160M 2 329728 1378303 512M 3 1378304 8386559 3422M ~# blkid /dev/sda1: UUID="2BAD-1E21" TYPE="vfat" /dev/sda2: UUID="ee67db8b-17d1-49f0-83b5-b1376c3adf5f" TYPE="swap" /dev/sda3: UUID="2a767c7f-c2e3-4e67-96fc-412bd16685a3" TYPE="ext4" |
ルート / とブート /boot/efi パーティションをマウントポイントへマウントし、 chroot でマウントしたシステムへ入ります。Apline Linuxのバージョンは確かに 3.20-alpha でした。
|
1 2 |
~# cat /etc/alpine-release 3.20.0_alpha20231219 |
grub.cfgの巻き戻し
リリースノートの説明通り、 /boot/grub/ には古い grub.cfg が残されていたので、新旧入れ替え(新しいのもリネーム保存)。
これで chroot を抜け、仮想マシンを再起動すれば、ひとまず正常に起動するようになります。
再起動後のブートローダ再インストール
再起動後、SSHターミナルから入り直して、恒久対策へ進みます。
上述のリリースノートにある、
|
1 2 3 |
# grub-install --target=$target --efi-directory=$efi_directory --bootloader-id=alpine \ --boot-directory=/boot --no-nvram # install -D $efi_directory/EFI/alpine/grub$fwa.efi $efi_directory/EFI/boot/boot$fwa.efi |
を元に、変数を以下のように書き換えて実行します。
- $target : x86_64-efi
- $efi_directory : /boot/efi
- $fwa : x64
実行前後で efi ファイルが確かに変わりました
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
~ # ls -l /boot/efi/EFI/*/*.efi -rwxr-xr-x 1 root root 135168 Jan 18 2023 /boot/efi/EFI/alpine/grubx64.efi -rwxr-xr-x 1 root root 135168 Jan 18 2023 /boot/efi/EFI/boot/bootx64.efi ~ # ~ # grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=alpine --boot-directory=/boot --no-nvram Installing for x86_64-efi platform. Installation finished. No error reported. ~ # ~ # install -D /boot/efi/EFI/alpine/grubx64.efi /boot/efi/EFI/boot/bootx64.efi ~ # ~ # ls -l /boot/efi/EFI/*/*.efi -rwxr-xr-x 1 root root 143360 Feb 21 12:48 /boot/efi/EFI/alpine/grubx64.efi -rwxr-xr-x 1 root root 143360 Feb 21 12:48 /boot/efi/EFI/boot/bootx64.efi |
新旧入れ替えた grub.cfg を元に戻して、最後に再起動。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
~ # ls -l /boot/grub drwxr-xr-x 2 root root 4096 Jan 18 2023 fonts -rw-r--r-- 1 root root 3501 Feb 21 11:33 grub.cfg -rw-r--r-- 1 root root 3501 Jan 8 10:03 grub.cfg.backup -rw------- 1 root root 3718 Feb 21 11:32 grub.cfg.new12 -rw-r--r-- 1 root root 1024 Jan 18 2023 grubenv drwxr-xr-x 2 root root 20480 Feb 21 12:48 x86_64-efi ~ # ~ # cp /boot/grub/grub.cfg.new12 /boot/grub/grub.cfg ~ # ls -l /boot/grub drwxr-xr-x 2 root root 4096 Jan 18 2023 fonts -rw------- 1 root root 3718 Feb 21 12:50 grub.cfg -rw-r--r-- 1 root root 3501 Jan 8 10:03 grub.cfg.backup -rw------- 1 root root 3718 Feb 21 11:32 grub.cfg.new12 -rw-r--r-- 1 root root 1024 Jan 18 2023 grubenv drwxr-xr-x 2 root root 20480 Feb 21 12:48 x86_64-efi ~ # ~ # reboot |
おわりに
以前、 edge レポジトリを有効にした際、安定版も有効なままにしていたので、この機にedgeのみ有効に訂正。
|
1 2 3 4 5 6 |
#/media/cdrom/apks #http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/main #http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/community http://ftp.udx.icscoe.jp/Linux/alpine/edge/main http://ftp.udx.icscoe.jp/Linux/alpine/edge/community #http://ftp.udx.icscoe.jp/Linux/alpine/edge/testing |
今後は、パッケージ更新ではgrub関連の更新があるか、実行前に確認するよう心がけたいと思います。
|
1 2 3 |
~$ sudo apk update ~$ apk -u list # 更新可能パッケージの一覧表示 ~$ sudo apk upgrade |







