Ubuntu Weekly Recipe

第603回 RISC-VのDebianイメージをQEMUで動かす

この記事を読むのに必要な時間:およそ 9.5 分

第505回「オープン規格の新しい命令セットアーキテクチャRISC-V入門 ツールチェインを用意する」ではRISC-Vシミュレーターであるspikeを使ってRISC-Vバイナリを実行しました。今回はRISC-V対応QEMUを使って,RISC-Vの仮想マシン上でDebianを起動してみましょう。

ツールチェインとDebianのRISC-V対応状況

RISC-V対応のLinuxシステムを作るためには,単にコンパイラがRISC-Vに対応しているだけではなく,そのコンパイラを用いてカーネルやユーザーランドの各種ツールのRISC-Vバイナリを作る必要があります。さらに実機がない場合は,QEMUのような仮想マシンエミュレーターも必要です。spikeを使ってカーネルを実行することは可能ではありますが,今回は他のアーキテクチャーと同様にQEMUを使います。

2020年1月時点で,Linuxシステムを構築するために最低限必要なツールのほとんどがRISC-Vに対応しています。少なくとも次のバージョンであればRISC-VベースのLinuxシステムを構築することが可能です。

  • binutils:2.28以上
  • GCC:7.0以上
  • glibc:2.27以上
  • Linux:4.19以上
  • QEMU:2.12以上
  • dpkg:1.19.0.5以上
  • U-Boot:2018.11以上

そしてこれらはすべて,最新のDebianにも取り込まれています。よってDebianのルートファイルシステムであれば,比較的簡単に構築できるのです。

もちろん登場したばかりのアーキテクチャーであるため,新しければ新しいほど安定して動く可能性が高くなります。またLinuxシステムとして使うためには当然のことながら上記以外にも必要なソフトウェアがたくさんあります。これらも必要に応じて順次RISC-V対応が行われていくことでしょう。

Debianでは公式でサポートしているCPUアーキテクチャー(やカーネル)以外にもPorts(移植版)と呼ばれる公式ではないサポートアーキテクチャーが存在します。公式リポジトリに存在するパッケージは,Ports向けのアーキテクチャでビルドされ,Debian Ports用のリポジトリで公開されるのです。このため,Portsにあげられているアーキテクチャーであればapt経由でパッケージをインストールできます。

RISC-V向けのアーキテクチャーとしてはriscv64がPortsに登録されています。これはRISC-Vで言うところの「RV64GCU」であり「RV64IMAFDCU」の省略形です。第505回の「RISC-Vの拡張性」で取り上げたように64ビットアーキテクチャーの基本整数・整数の乗算除算・アトミック・単精度の浮動小数点・倍精度の浮動小数点それぞれの命令と,16ビット幅の命令をサポートしていることがわかります。最後のUは「The RISC-V Instruction Set Manual」「Volume II: Privileged Architecture」に記載があるように,ユーザーモードをサポートしていることを意味します。

残念ながらUbuntuはRISC-Vをサポートしていません。もし今後サポートすることになるとしても,ricsv64がDebianの公式サポートアーキテクチャーになることが前提となるでしょう。riscv64ではまだビルドできないソフトウェアもそれなりにあることから,何か大きな力が働かない限りは,当面はUbuntuでサポートすることはなさそうです。

ただしUbuntu上でRISC-Vのバイナリをビルドしたり,QEMUでRISC-V版のDebianを動かすことは可能です。そこで今回はUbuntu上で,Debianイメージの作成と起動までを説明します。

構築環境の準備

Ubuntu上でRISC-V環境を構築するためにはUbuntu 19.10以降が必要です。これはQEMU上でRISC-Vを動かすためのファームウェアとしてOpenSBIを使用しており※1⁠,このOpenSBIのパッケージが19.10からしか提供されていないためです。またQEMU自身も18.04のバージョンだと少し古いのでRISC-Vのバイナリをうまく動かせません。もちろんOpenSBIやQEMUの最新版を手動でインストールしても良いのですが,それよりはより新しいUbuntuを用意したほうが楽でしょう。

※1
いわゆる「BIOS」のようなもので,RISC-Vでは「Supervisor Binary Interface(SBI⁠⁠」と呼ぶようです。

今回はより新しい環境を求めて,2020年4月にリリース予定のUbuntu 20.04 LTSの開発版を使うことにします。ただし今回紹介する手順は19.10でも動くことを確認済みです。

20.04を実機にインストールしても良いのですが,いかんせん開発版であることから,仮想マシン上にインストールしたほうが安心です※2⁠。そこで第590回「Windows/macOS/Linuxで使える仮想マシン管理ツール『multipass⁠⁠」を使用しましょう。multipassならUbuntuだけでなくWindowsやmacOSでも使えますし,すぐに20.04の実行環境を用意できます。

※2
仮想環境と言えば本連載で何回か紹介しているLXDもありますが,今回の用途には不向きです。ルートファイルシステムを作成する際に,qemu-user-staticでバイナリ単位のエミュレーションを行います。これはbinfmtによってどのアーキテクチャーのバイナリかを判断しています。しかしながらbinfmtはLinuxの名前空間に対応していないためルートファイルシステムをうまく作れません。ちなみに同様の理由でLXDでは,ホストと異なるアーキテクチャーのコンテナの起動を非サポートにしたようです。もしamd64アーキテクチャーでarmhfコンテナを動かしたいなら,LXDではなくLXCを使う必要があるでしょう。さらにQEMU用のイメージファイルを作成する際にループデバイスを使うのですが,これも非特権コンテナだといろいろ設定が必要になります。素直に仮想マシンを使うことをおすすめします。

まずはmultipassをインストールします。

$ sudo snap install multipass --classic

ちなみに第590回で紹介したあと,2019年12月に初の正式版である1.0.0がリリースされました。標準で作成されるユーザーが「multipass」から「ubuntu」になるなど,細かいところに変更はありますが,原則として第590回で紹介した使用方法がそのまま使えるはずです。

次に20.04のインスタンスを「riscv」の名前で作成します。

$ multipass launch -n riscv -d 40G -m 4G daily:20.04

ルートファイルシステムを作る都合上,ストレージのサイズは40GBと多めにとっています。また,仮想マシン上でRISC-VのQEMUイメージを起動することから,メモリーも4GBに設定しておきました。

しばらく時間が必要ですが,無事にインスタンスが起動したらログインしておきましょう。

$ multipass shell riscv

ここから先の手順はすべて,riscvインスタンス内で実行したものとします。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。