VirtualBoxのEFI有効な仮想マシンにインストールしたLinuxを一発で起動する

さて、うまいくかない、と思っていた VirtualBox 上の EFI 有効な仮想マシンでの jessie の起動の件ですが、

#結局、 jessie が、 VirtualBox の EFI 有効な仮想マシンで正しく起動しない件は、解消できずにいたり。

[From jessie と EFI/UEFI と VirtualBox と… - Soukaku's HENA-CHOKO Blog]

うまくいく方法が見つかったというか、どうも調べ足りなかったらしく、既に方法があったので、落ち穂拾い的エントリーを書いておく。

仮想マシンでEFIを有効化

そもそも、VirtualBox の場合、 EFI を有効化した仮想マシンの NVRAM にインストールした OS (この場合は、Debian )が用意する EFI 用のブートローダの在り処が記録されないという不具合?があるようで、 NVRAM にブートローダ情報がない場合に強制的に読みに行く場所に指定した名前でブートローダを置けば解消する、と。

1. NVRAMが読み込めない、又は読み込めてもNVRAMにOSの登録がない場合は、ESPの EFI/boot/bootx64.efi ファイルを読みに行く。
ubuntuのインストールでは作成されないディレクトリであり、当然ながら bootx64.efi ファイルも無い。

[From Ubuntu日本語フォーラム / ubuntuでのUEFIについて]

#目を通した記憶はあるんですよね、この情報…。う〜ん…。


新規インストール時に対応するには

さて、Debianをふつーに Graphical Install でインストールした場合、インストールプロセス完了後に即再起動となりますが、このタイミングでは 仮想マシンの NVRAM にブートルーダの情報が残っているので、問題なく起動してきます。

起動してきたら、次のような操作を、 root 権限で行います。

root@jessie:~# cd /boot/efi/EFI
root@jessie:/boot/efi/EFI# ls -l
合計 4
drwx------ 2 root root 4096 12月 30 12:02 debian
root@jessie:/boot/efi/EFI# mkdir boot
root@jessie:/boot/efi/EFI# cp -p debian/grubx64.efi boot/bootx64.efi
root@jessie:/boot/efi/EFI# ls -l boot/* debian/*
-rwx------ 1 root root 119808 12月 31 05:12 boot/bootx64.efi
-rwx------ 1 root root 119808 12月 31 05:12 debian/grubx64.efi

コピーが終わったら、仮想マシンを電源OFFした後、再度仮想マシンの電源を ON にして、問題なく Debian が起動することを確認しましょう。

なお、expert モードでインストールした時は、インストールプロセスが全て終了した後、Shell を起動、そこで /target 以下にマウントされているハードディスク内のファイル操作して、ブートローダのコピーをすることも出来ます。

インストール直後の再起動時の設定し忘れた時は…

EFI ShellからOS起動(Debian jessieの場合)

ブートローダの設定を忘れたとか、実はブートローダのコピーしたけど typo したまま仮想マシンを OFF にしてしまったという時は、次回起動時は EFI Shell が起動して終わってしまうので、ここから一度 OS を起動するか、直接 EFI Shell でブートローダのコピーやファイル名/ディレクトリ名の修正を行う必要があります。
もし、EFI Shell から OS を起動したければ、以下のようにコマンドを投入していけば OK。

FS0:
cd EFI/debian
grubx64.efi

OS が起動してきたら、新規インストール時と同様に対処するか、typo しているところを修正しましょう。

EFI Shell 上で、ブートローダのコピーをする場合は、以下のとおり。( EFI Shell でも rm とか mv が使えるので、typo の修正は可能。)

FS0:
cd EFI/
mkdir boot
cp debian/grubx86.efi boot/bootx64.efi

これで、仮想マシン OFF → ON で問題なく起動できるようになっていればOK。

RHEL/CentOSの場合は?

RHEL/CentOS の場合、 /boot/efi/EFI/redhat の下にブートローダがあるんですが、単純に boot ディレクトリ作って、という方法がうまく行かなかったので、違う方法で対処しています。

[root@cent ~]# ls -l /boot/efi/EFI/redhat/*
-rwx------. 1 root root    866 12月 31 16:06 2015 /boot/efi/EFI/redhat/grub.conf
-rwx------. 1 root root 254248  7月 24 11:43 2015 /boot/efi/EFI/redhat/grub.efi

\EFI\redhat\grub.efi” と1行だけ書いた startup.sh というファイルを指定の場所に配置すると、EFI Shell は一度表示されるものの、OS の起動シーケンスに移行するので、この方法で対処。
#おそらく、もっとスマートな対処方法があるとは思うのだけど…。

CentOS が起動している状態であれば vi などで /boot/efi ディレクトリに statup.nsh を配置。

[root@cent ~]# ls -l /boot/efi
合計 8
drwx------. 3 root root 4096 12月 31 07:48 2015 EFI
-rwx------. 1 root root   21 12月 31 16:55 2015 startup.nsh
[root@cent ~]# more /boot/efi/startup.nsh
\EFI\redhat\grub.efi

EFI Shell 上で作成するのであれば、

FS0:
edit startup.nsh

と実行してファイルを作成してください。( edit コマンドを使った場合は、編集後 Ctrl+q で保存してコマンド終了。)

まぁ、面倒くさい対応しなくちゃいけないのは、 VirtualBox の仮想マシンで EFI を有効化した時だけの話なので、EFI を有効にしないという方法もあるんですけどね。

トラックバック(2)

さて、四苦八苦していた VirtualBox で EFI を有効にした仮想マシン上にインストールした Debian を一発で起動させる件。 前のエントリー... 続きを読む

さて、前のバージョンで、 VirtualBox の仮想マシンをEFI 有効にして Debian のインストールをすると、モードによってはインストール直後... 続きを読む

コメントする