Interface)はOSとファームウェアの間の橋渡しを行うインターフェースの仕様です。今回はQEMU/KVMで,このUEFIをサポートしたファームウェアを使用する方法を紹介します。UEFIとQEMU/KVMとOVMFいわゆる「PC/AT互換機」とも呼ばれるIntel系CPUを搭載したPCでは,電源投入後からハードウェアの初期化,ブートローダーの起動などを「BIOS」と呼ばれるファームウェアが担っていました(※1⁠)⁠。UEFIはこのBIOSを置き換えるための仕様で,機能の強化や起動の高速化,業界団体による標準化などが行われています。ここ数年のx86マシンであればほぼすべてUEFIファームウェアに置き換わっていますし,ARMプラットフォームでもよく使われるU-Bootが最近UEFIをサポートするようになりました。本連載の読者の皆様も,一度ぐらいはUEFIファームウェアに触れていることでしょう。System)は,ハードウェアの入出力を担当するファームウェアの総称で,特定の仕様・規格や製品を指す用語ではありません。BIOS」と呼んだりもします。本記事では「BIOS」は原則として「UEFIには対応していない古いBIOS(レガシーBIOS⁠)⁠」の意味で使うことにします。Ubuntuも11.10ぐらいからUEFIによる起動をサポートするようになりました。初期の頃は,インストーラーがUEFIシステムパーティションを壊してしまうなど,いろいろと問題もあったのです。現在サポートしているリリースであれば,基本的には問題なくUEFIシステム上にUbuntuをインストールできるようになっています。UEFIファームウェアの実装の違いやデバイス・他のOSとの相性の違いによって,Ubuntuをうまくインストールできない,インストールできたとしてもいくつかのデバイスが動かない,といった場合があることも事実です(※2⁠)⁠。UEFIに限ったことではありませんが,Ubuntuをインストールする場合はあらかじめシステム上のデータのバックアップをとり,何かあったら復元できるようにしておきましょう。BIOS」を有効化するなどの方法を使えば回避できる場合もあります。設定の変更によって今度は他のOSが起動しなくなるリスクもあります。普段は他のOSで生活し,Ubuntuは仮想マシン上でのみ使用している方もいることでしょう。その場合はおそらくUEFIではなくBIOSを用いたインストールになるはずです。仮想マシン上でもUEFIの恩恵を受けたい場合は,仮想マシンの設定を明示的に変更する必要があります。VirtualBoxであれば,2009年にリリースされた3.1の頃からEFIファームウェアを使った起動ができるようです(※3⁠)⁠。QEMU/KVMの場合は,その本体にはUEFIファームウェアは含まれていません。その代わり「-bios」オプションで使用するファームウェアを指定できます。Firmware)を指定すれば,UEFIブートできるというわけです。support」であり,ドキュメントから「experimental」が消える様子もないため,どこまできちんと使えるかは実際に試してみないとわかりません。現実問題として,ゲストのDebian/Ubuntuが起動しなくなるという問題もあるようです。LTSとした上でQEMU/KVMを用いる時に,ゲストOSをUEFIファームウェアを用いて起動する方法を紹介します。OVMFのインストールと基本的な使い方QEMU/KVM標準のBIOSファームウェアは「SeaBIOS」です。seabiosパッケージから提供されていますし,QEMUをインストールすれば自動的にこのパッケージがインストールされます。menu=on」オプションを付けて起動すると,F12キーでBISOメニュー画面が表示されます(※4⁠)⁠。1.9.0からはF12キーではなく,ESCキーになるようです。メニューと言ってもブートデバイスの選択のみメニューはシンプルですがSeaBIOSそのものの設定項目は多彩で,ブートスプラッシュ画像などはQEMUの「-boot」オプション経由でも指定できます。従来のBIOSの話はこれくらいにしておいて,UEFIファームウェアをインストールしましょう。Ubuntuだとovmfパッケージをインストールするだけです。ovmfOVMFはUEFIファームウェアのFLOSSな実装です。UEFIの前身であるEFIを開発していたIntelが,EFI仕様の「好ましい実装」としてTianoCoreを開発していました。IIによるサンプルアプリケーションのひとつがOVMFです。どちらもBSDライセンスで提供されています(※5⁠)⁠。IIの最新のソースコードをダウンロードしてきて,自前のOVMFファイルを作成することも可能です。※5ファイルによって二条項だったり三条項だったり四条項だったりします。FATまわりでDFSGに準拠していないライセンスのコードが存在するため,コンポーネントはmultiverseになっています。IIでは修正されているようです。QEMU/KVMでOVMFを指定する方法はいくつか存在します。手っ取り早いのは「-bios」オプションにファームウェアのファイル名を渡す方法です。ESCキーでUEFIメニューブート順やブートデバイスの指定だけでなく,言語の変更やネットワーク設定,セキュアブートの設定など,UEFIらしくさまざまな機能に対応しています。「-bios」オプションでファームウェアを指定するだけだと,設定は保存されません。一度QEMUプロセスを終了すると,リセットされてしまいます。UEFIファームウェアの設定画面の内容を保存したかったら,「⁠-pflash」オプションでファームウェアを指定する必要があります。この場合,設定内容は指定したファイルの変数領域(0x00000から0x20000まで)に書き込まれることになります。よって,あらかじめファイルをコピーしておきましょう。./OVMF.fdこの状態でUEFIの設定インターフェースを開き,何がしかの設定を行った上で保存してQEMUを終了してください。OVMF.fdのバイナリダンプを確認するとオリジナルのそれと変わっていることがわかるかと思います。OVMF.fdは前半に変数データを保存するNVRAM領域を,後半にファームウェアのコード本体を記録しています。よってOVMF.fd全体をコピーするのではなく,不変なコード領域は共有し,NVRAM領域だけインスタンスごとに保存したいところです。実はovmfパッケージは,コード領域とNVRAM領域がそれぞれ別になったファイルも用意されています。それを使えば,サイズの小さいNVRAM領域だけ流用することも可能です。if=pflash,format=raw,file=sample.fd後述するvirt-managerなどは,このようなオプションを自動的に付加する作りになっています。Shell」と呼ばれるシェル環境が用意されています。Shellが立ち上がるはずです。このシェルは,おもにUEFIアプリケーションのデバッグに使われるものですが,ブートローダーが起動する前のハードウェアの状態や設定の確認,スクリプトの実行なども行えます。-b」で使用できるコマンド一覧が表示されますので,一度遊んでみるといいでしょう。「-b」オプションは,実行結果が画面上を流れすぎてしまうことを抑止するオプションです。Shell上のたいていのコマンドで使用できます。