ARM64仮想マシン on RHEL KVM(x86_64)

# 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ドキュメント - 仮想化の設定および設定 に従って仮想化の環境構築は実施済みで、

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_virtualization/index


仮想マシンマネージャー(virt-manager)を使ってx86_64の仮想マシンが作成可能であることとします。

# 構築手順

## 1. QEMUソース入手と展開
以下サイトからダウンロードして、任意の場所に展開します。

https://www.qemu.org/download/

筆者は 9.0.2 をダウンロードしました。
```shell
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用のエミュレータプログラムを生成します。
```shell
./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```配下にコピーします。
```shell
cd build/qemu-bundle/root/bin/qemu-upstream/
cp -pi qemu-system-aarch64 /usr/local/bin/
```

これにより仮想マシンマネージャー(virt-manager)がプログラムを認識して、
仮想マシン作成画面でアーキテクチャ aarch64 が選択できるようになりました。

ただ、これだと aarch64用 UEFIファームウェアのバイナリが見つからないために、
一部のインストールオプションが利用できないようです。

![スクリーンショット 2024-09-03 195544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/b618c439-2d38-2c4b-f003-939ec9cc3d25.png)

ISOファイルを使ってインストールしたいのでこれでは困りました。

## 4. aarch64用UEFIファームウェアのインストール

ここはちょっと自信がありませんが、
結論からいうと以下からrpmをダウンロードしてインストールしました。
```shell
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)で選択できなかったインストールオプションが使用可能となり、警告メッセージも表示されなくなりました。

:::note info
RHEL社（要ログイン）のRHELパッケージを```edk2-aarch64```で検索したらrpmがありました。こちらを使ったほうが入手元としては確実かと。

:::

![スクリーンショット 2024-09-03 201006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/a146ce98-d516-189f-4959-aa6fe0a0e87c.png)

ただ、aarch64の仮想マシンを作成して、最後に完了しようとすると以下のようなエラー画面が出てしまいました。

![スクリーンショット 2024-09-03 201230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/74057f74-0877-8d73-58a6-313344e58216.png)

## 5. efi-virtio.rom をコピー

efi-virtio.rom がないといっているようなのですが、このファイルはQEMUのbuildディレクトリに生成されているようで、これを /usr/loca/share/qemu/配下にコピーすることで解決するようです。
```shell
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)のインストール画面
![スクリーンショット 2024-09-03 202621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/e0ff24a2-a4e5-58b7-e6a3-56aac5a1fcea.png)

ただ、仮想マシンマネージャー(virt-manager)で仮想マシンの設定を確認するとシリアルコンソールが作成されており、テキストモードでのインストールしかできないようです。仮想マシンマネージャー(virt-manager)でビデオデバイスを作成してみたのですがうまく動作しませんでした。

他サイトを見ると、qemu-system-aarch64 で起動するときは -nographic オプションで起動している方が多いようなので、そういうものなのかもしれません。

VNC接続したらGUIでインストールすることができました。
今回はここまで。


参考

https://ideal-reality.com/computer/linux/qemu_uefi_build/