KVM/QEMU/libvirtとは
私は RHEL8(x86_64)上にKVM仮想化機能を利用して仮想マシンを作成しています。
KVM (Kernel-based Virtual Machine) はCPUがサポートする仮想化支援機能(Intel VT-x、AMD AMD-V)を QEMU に対して提供する役割を持ちます。
QEMU は仮想マシンのエミュレーション機能を提供する役割を持ちます。エミュレーションでは仮想マシンのCPU、メモリ、I/Oデバイスなどの機能を仮想的に実現します。
KVMがなくてもQEMUの機能を使ってCPUなどをエミュレートすることはできるようですが、KVMを使うことで処理速度が劇的に向上します。だってハードウェアを使って処理を高速化するんだもの。
QEMUプロセスはqemu-system-<アーキテクチャ>
という名前のプログラムです。具体的にはqemu-system-x86_64
などです。ただ、RHELではこのプログラムはなくて代わりに/usr/libexec/qemu-kvm
というプログラムが動作するらしいです。KVMで仮想マシンを実行して psコマンドを実行するとこのプロセス名になります。名前を見てご想像通り異なるアーキテクチャのマシンをエミュレートしたりもできるようです。
次に、libvirt は仮想化アプリケーションやハイパーバイザを操作するための抽象化レイヤを提供するソフトウェアです。virsh、virt-installなどのコマンドラインは libvirt のコマンドです。
qemu-system-<アーキテクチャ>
コマンドを使うと仮想マシンを起動時に複雑なオプションを指定しないといけないですが、libvirt はそれらを楽にしてくれます。virsh start コマンドを使って仮想マシンを起動すると、内部で仮想マシンの設定(xml)に従った複雑なqemu-system-<アーキテクチャ>
コマンドラインを実行してくれているそうです。
で、いよいよ本題です。
とある事情で RHEL8(x86_64) 上で ARM64(aarch64) 仮想マシンを実行したくなりました。QEMUを使うとこれを実現できるそうです。ということで、やってみましたのでここに備忘録します。
この手順を実施するとRHEL(x86_64)上の仮想マシンマネージャー(virt-manager)を使って、GUI上でARM64(aarch64) の仮想マシン作成や実行を行うことができました。
ただし、他サイトの情報を参考にしつつ、自分なりの理解で試行錯誤した結果動作したよ、という内容なのでなんの保障もありませんが、そのあたりは自己責任です。
前提条件
RHEL8ドキュメント - 仮想化の設定および設定 に従って仮想化の環境構築は実施済みで、
仮想マシンマネージャー(virt-manager)を使ってx86_64の仮想マシンが作成可能であることとします。
構築手順
1. QEMUソース入手と展開
以下サイトからダウンロードして、任意の場所に展開します。
筆者は 9.0.2 をダウンロードしました。
wget https://download.qemu.org/qemu-9.0.2.tar.xz
tar zvJf qemu-9.0.2.tar.xz
cd qemu-9.0.2
2. QEMUビルド
QEMUソースをビルドして aarch64用のエミュレータプログラムを生成します。
./configuration --target-list=aarch64-softmmu
make
ビルドに成功するとbuildディレクトリに実行ファイルなどが生成されます。
build/qemu-bundle/root/bin/qemu-upstream/ 配下
3. qemu-system-aarch64 のコピー
buildディレクトリに生成されたqemu-system-aarch64
を/usr/loca/bin
配下にコピーします。
cd build/qemu-bundle/root/bin/qemu-upstream/
cp -pi qemu-system-aarch64 /usr/local/bin/
これにより仮想マシンマネージャー(virt-manager)がプログラムを認識して、
仮想マシン作成画面でアーキテクチャ aarch64 が選択できるようになりました。
ただ、これだと aarch64用 UEFIファームウェアのバイナリが見つからないために、
一部のインストールオプションが利用できないようです。
ISOファイルを使ってインストールしたいのでこれでは困りました。
4. aarch64用UEFIファームウェアのインストール
ここはちょっと自信がありませんが、
結論からいうと以下からrpmをダウンロードしてインストールしました。
https://www.kraxel.org/repos/jenkins/edk2/edk2.git-aarch64-0-20220719.209.gf0064ac3af.EOL.no.nore.updates.noarch.rpm
rpm -ivh edk2.git-aarch64-0-20220719.209.gf0064ac3af.EOL.no.nore.updates.noarch.rpm
ただ、入手元サイトの妥当性を確認していないのでソース配布元からソース入手してビルドしたほうが良い??
https://github.com/tianocore/edk2
まあでもこれで、仮想マシンマネージャー(virt-manager)で選択できなかったインストールオプションが使用可能となり、警告メッセージも表示されなくなりました。
RHEL社(要ログイン)のRHELパッケージをedk2-aarch64
で検索したらrpmがありました。こちらを使ったほうが入手元としては確実かと。
ただ、aarch64の仮想マシンを作成して、最後に完了しようとすると以下のようなエラー画面が出てしまいました。
5. efi-virtio.rom をコピー
efi-virtio.rom がないといっているようなのですが、このファイルはQEMUのbuildディレクトリに生成されているようで、これを /usr/loca/share/qemu/配下にコピーすることで解決するようです。
cd build/qemu-bundle/root/bin/qemu-upstream/share/qemu/
mkdir /usr/local/share/qemu
cp -pi efi-virtio.rom /usr/local/share/qemu/
6. aarch64仮想マシン起動
これで無事に仮想マシンマネージャー(virt-manager)から仮想マシンの作成ができ、
仮想マシン一覧からaarch64仮想マシンを起動できましたとさ。
AlmaLinux 9.4 (aarch64)のインストール画面
ただ、仮想マシンマネージャー(virt-manager)で仮想マシンの設定を確認するとシリアルコンソールが作成されており、テキストモードでのインストールしかできないようです。仮想マシンマネージャー(virt-manager)でビデオデバイスを作成してみたのですがうまく動作しませんでした。
他サイトを見ると、qemu-system-aarch64 で起動するときは -nographic オプションで起動している方が多いようなので、そういうものなのかもしれません。
VNC接続したらGUIでインストールすることができました。
今回はここまで。
参考