QemuとKvmを使って仮想マシンでRaspberry Pi OSを実行する方法
ラズベリーパイには多くのオペレーティングシステムがありますが、公式のものはRaspberry Pi OSです。このオペレーティングシステムはarmアーキテクチャ用に作られており、主なラズベリーパイストレージデバイスとして使用されるSDカードに簡単にインストールできます。時には、物理的なラズベリーパイのマシンを持っていなくても、いくつかのテストを実行したり、アプリケーションを試したりしたい場合があります。このチュートリアルでは、QemuとKvm(カーネル仮想マシン)を使用して、Raspberry Pi OSシステムの仮想マシンを作成する方法を見ていきます。
このチュートリアルでは、あなたが学ぶことができる:
- QEMUとKVMのインストール方法
- 最新のRaspberry Pi OSバージョン(Buster)をダウンロードして、その整合性を確認する方法
- 仮想マシンでRaspberry Pi OSを実行する方法
QemuとKvmを使って仮想マシンでRaspberry Pi OSを実行する方法
使用されるソフトウェア要件と規約
qemuをインストールする
Qemuは、公式ウェブサイトに定義されているように、「汎用のオープンソースのマシンエミュレーターおよび仮想化ソフトウェア」です。これを使用して、あらゆる種類のマシンのオペレーティングシステムを実行できます。Linuxでは、通常、カーネルに含まれている完全仮想化ソリューションであるkvmと組み合わせて使用されます。我々のRaspberry Pi OSを仮想化するためには、好きなディストリビューションにインストールし、qemu-system-armパッケージも一緒にインストールする必要があります。このパッケージは、ARMシステム用のシステムエミュレーターを提供します。Qemuとkvmは、主要なLinuxディストリビューションのソフトウェアリポジトリで入手可能です。Fedoraにインストールするには、dnfパッケージマネージャーを使用できます。
sudo dnf install @virtualization qemu-system-arm
ここでは 仮想化 パッケージグループをインストールしました(@ プレフィックスに注意してください):それは Fedora における仮想化に必要なすべてを含んでいますが、qemu-system-arm パッケージは別途インストールしました。
DebianおよびDebianベースのディストリビューションでは、以下のコマンドを実行して、リモートリポジトリとディストリビューションを同期し、システムに必要なパッケージをインストールすることができます:
sudo apt-get update && sudo apt-get install qemu-system-arm qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon virt-manager
最新のRaspberry Pi OSイメージをダウンロードして確認する
私たちは公式のRaspberry PiサイトからRaspberry Pi OSの最新リリースをダウンロードできます。基本的に、システムの3つのバージョンの中から選ぶことができます。いくつかはより最小限のもので、他はより多くのパッケージセットとすでにインストールされたグラフィカルデスクトップを提供してきます。ダウンロードリンクは以下の通りです:
- ラズベリーパイOS Lite
- デスクトップ付きのラズベリー・パイOS
- デスクトップと追加パッケージ付きのラズベリー・パイOS
このチュートリアルでは、Raspberry Pi OSの「lite」バージョンを使用します。ウェブブラウザを使ってダウンロードする場合は、上記のリンクのいずれかをクリックするだけです。代わりにコマンドラインからダウンロードしたい場合は、wgetやcurlのようなツールを使用できます:
Using wget
wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-01-12/2021-01-11-raspios-buster-armhf-lite.zip
Using curl
curl -O https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-01-12/2021-01-11-raspios-buster-armhf-lite.zip
上記の2つのコマンドのいずれかを実行することで、画像は現在の作業ディレクトリにダウンロードされます。ダウンロードが完了したら、画像のsha256sumをウェブサイトに提供されたものと比較することで、その完全性を確認できます。
私たちの場合、ハッシュ値はd49d6fab1b8e533f7efc40416e98ec16019b9c034bc89c59b83d0921c2aefeefであるべきです。これを確認するために、以下のコマンドを実行できます:
sha256sum 2021-01-11-raspios-buster-armhf-lite.zip
上記のコマンドは、私たちの場合、以下の結果を返します:
49d6fab1b8e533f7efc40416e98ec16019b9c034bc89c59b83d0921c2aefeef 2021-01-11-raspios-buster-armhf-lite.zip
2つのハッシュ値が一致しているので、問題ありません。今やるべきことは、画像を抽出することです。なぜなら、それは圧縮された状態だからです。これを行うために、次のコマンドを実行できます。
unzip 2021-01-11-raspios-buster-armhf-lite.zip
公式システムイメージに含まれているカーネルはQemuから直接起動できないため、この正確な目的のために構築された一連のカーネルを含むgitリポジトリをクローンする必要があります。次のセクションではこれを行う方法を見ていきます。
GitHubからqemu-readyカーネルを取得する
GitHubからクローンする必要があるリポジトリはdhruvvyas90/qemu-rpi-kernelです。私たちがやるべきことは、次のコマンドを実行することだけです:
git clone https://github.com/dhruvvyas90/qemu-rpi-kernel
クローンプロセスは完了するまでにしばらく時間がかかる場合があります。それはあなたのインターネット接続の速度によります。リポジトリがクローンされたら、準備完了です。こちらがその内容です:
ls qemu-rpi-kernel
kernel-qemu-3.10.25-wheezy README.md
kernel-qemu-4.14.79-stretch tools
kernel-qemu-4.19.50-buster versatile-pb-buster-5.4.51.dtb
kernel-qemu-4.4.34-jessie versatile-pb-buster.dtb
kernel-qemu-5.4.51-buster versatile-pb.dtb
native-emuation
最新のRaspberry Pi OSを模倣したいので、必要なファイルはkernel-qemu-4.19.50-busterとversatile-pb-buster.dtbです。最初のものは実際のカーネルイメージで、2つ目はデバイスツリーブロブです。このファイルの目的は何ですか?
Raspberry Piボードのシステムに利用可能なハードウェアを説明するために、DTS(デバイスツリーソース)ファイルが使用されます;それらのファイルのコンパイル版はDTBと呼ばれ、.dtb拡張子のファイルに保存されます。私たちの場合、kernel-qemu-5.4.51-busterを使用し、versatile-pb-buster-5.4.51.dtbファイルを併用することもできます。
ラズベリーパイOSのエミュレーション
必要なファイルがすべて揃ったので、ようやくRaspberry Pi OSイメージを仮想化できます。ここでは作業ディレクトリがシステムイメージをダウンロードした場所と同じであると仮定しています。実際のコマンドを実行する前に、DebianのみでデフォルトのNATブリッジネットワークを起動する必要があります。これは自動的には起動しないため、次のコマンドを実行する必要があります:
sudo virsh --connect=qemu:///system net-start default
自動的に開始するには、次のコマンドを実行できます:
sudo virsh --connect=qemu://system net-autostart default
さて、仮想マシンを構築するために、次のコマンドを実行する必要があります:
sudo virt-install \
--name rpios \
--arch armv6l \
--machine versatilepb \
--cpu arm1176 \
--vcpus 1 \
--memory 256 \
--import \
--disk 2021-01-11-raspios-buster-armhf-lite.img,format=raw,bus=virtio \
--network bridge,source=virbr0,model=virtio \
--video vga \
--graphics spice \
--boot 'dtb=qemu-rpi-kernel/versatile-pb-buster.dtb,kernel=qemu-rpi-kernel/kernel-qemu-4.19.50-buster,kernel_args=root=/dev/vda2 panic=1' \
--events on_reboot=destroy
virt-viewerウィンドウが表示されるはずです。そこでは、Raspberry Pi OSが起動する様子を視覚化できるはずです。
仮想マシンを構築するために使用した virt-install コマンドのオプションを簡単に見てみましょう。一部はかなり明白ですが、他は少しわかりにくいものもあります。
まず最初に、--nameオプションを使用しました:これを用いることで、仮想マシンインスタンスの名前を設定することができます(名前は一意である必要があります)。次に使用したオプションは--archです:これはゲストシステムのために非ネイティブなCPUアーキテクチャを要求する必要があります;これを使用しない場合、ホストのアーキテクチャが仮定されます。
--machineオプションを使用して、エミュレートするマシンの種類をqemuに渡します。この場合、versatilepbを使用しました。--cpuオプションを使用して、ゲストに公開されるCPUモデルと機能を設定します。ここでは、arm1176を使用しました。なぜなら、Raspberry Piはarmアーキテクチャに基づいているからです。
--vcpusオプションは、ゲストマシンの仮想CPUの数を設定するために必要であり、この場合は1つのみです。容易に推測できるように、代わりに--memoryオプションが使用され、ゲストに割り当てるメモリを設定します。
--import オプションは非常に重要です。これは、アプリケーションに OS インストールをスキップさせ、既存のイメージの周りにゲストを構築するように指示するために使用されます。このイメージは後に --disk オプションで指定されます。
ゲストをホストネットワークに接続するために、--networkを使用します。この場合、libvirtによってデフォルトで作成されるvirbr0ブリッジを介して接続します。--videoオプションを使用して、ゲストに接続するビデオデバイスの種類を指定し、--graphicsでは、ゲストのグラフィカルディスプレイへのアクセス方法を指定します。この場合、同名のプロトコルを使用するためにspiceを使用しました。
--bootオプションを使うことで、使用するdtbとカーネルファイルを指定することが可能ですが、kernel_argsを使ってカーネルコマンドラインも指定することができます。最後に、--eventsオプションを使ってゲストのイベント値を指定します。この場合、on_rebootイベントに対して破棄します。
仮想マシンが起動すると、virt-managerアプリケーションを通じてグラフィカルに管理することもできます。これで私たちは仮想化されたRaspberry Pi OSを楽しむことができます!
結論
このチュートリアルでは、実際のRaspberry Piハードウェアを使用せずに、qemuとkvmを使って生のRaspberry Pi OSイメージを実行する方法を見ました。システムイメージのダウンロードと検証方法、抽出方法、イメージをqemuでブートするために必要なカーネルとdtbファイルを含むgitリポジトリをクローンする方法、そしてシステムの仮想化を開始するために実行すべき実際のコマンドについて見ました。
