目次: Linux
OpenSBI + Linuxの環境まで動いたので、次はLinuxのディストリビューションに挑みます。ディストリビューションはDebianにします。以前はUnofficialでしたがDebian 13(Trixie)から正式にRISC-Vをサポートする(riscv64 is now an official architecture - debian-riscv)そうです。良いですね。
DebianのドキュメントにStarFive VisionFive V1用のインストール手順がある(Installing Debian On StarFive VisionFive V1 - Debian Wiki)ので、非常に参考になります。
RISC-Vサポート予定とされているDebian 13(Trixie)は現時点だとTesting版のはずですが、RISC-V向けのパッケージが存在しないものがあって(※)動かなさそうだったので、今回はUnstable版(sid)を使用しています。
今回の実験環境はこんな感じです。
(※)例えばlibcbor0.10はRISC-V版が存在しません。openssh-client -> libfido2-1 -> libcbor0.10の依存を持つ、OpenSSHクライアントがインストールできません。
Debianを動作させるにはDebianのルートファイルシステムが必要です。debootstrapというコマンドで作成できて超便利です。
$ apt-get install qemu-user-static binfmt-support debootstrap systemd-container rsync wget $ sudo debootstrap --arch=riscv64 unstable /path/to/riscv-chroot https://deb.debian.org/debian I: Target architecture can be executed I: Retrieving InRelease I: Checking Release signature I: Valid Release signature (key id 4CB50190207B4758A3F73A796ED0E7B82643E131) I: Retrieving Packages I: Validating Packages I: Resolving dependencies of required packages... I: Resolving dependencies of base packages... I: Checking component main on https://deb.debian.org/debian... I: Retrieving adduser 3.137 I: Validating adduser 3.137 I: Retrieving apt 2.9.7 I: Validating apt 2.9.7 ... I: Configuring tasksel-data... I: Configuring libc-bin... I: Configuring ca-certificates... I: Base system installed successfully.
このとき依存パッケージ、特にQEMU(qemu-user-static)をインストールし忘れていると、E: Unable to execute target architectureとメッセージが出て止まります。
作成したDebian rootfsをQEMUからNFSでマウントします。サーバー側の設定例はこんな感じです。insecureを指定しているなど、セキュリティ完全無視の設定なので実験が終わったら設定を消してください。
#### /etc/exports
/path/to/debian_rootfs *(rw,no_root_squash,no_subtree_check,insecure)
設定を反映するにはexportfsコマンドを使います。何も出力されませんが、エラーがでなければ良いです。
# apt-get install nfs-kernel-server nfs-common # exportfs -a
手動でマウントする場合はこんな感じです。
# sudo mount -t nfs -o nolock 192.168.1.1:/path/to/debian_rootfs rootfs
オプションnolockを付けている理由は、portmapやnfslockのようなデーモンなしでもマウントできるようにするためです。busyboxからマウントするときは便利です。
QEMUの起動引数はたくさんありますがまずはネットワークデバイスの設定をします。netdevでQEMUの外とのネットワーク接続を定義し、deviceでQEMUの中のネットワークデバイスを定義します。カーネル引数はappendに指定します。rootfsをNFSでマウントするためのオプションは、下記の3つです。
NFS v4でも動きそうに思うんですけど、私の環境はなぜかNFS v3じゃないと動作しませんでした。これに気づくまでかなり時間を浪費しました……。
$ qemu-system-riscv64 \ -machine virt \ -bios none \ -nographic \ -chardev stdio,id=con,mux=on \ -serial chardev:con \ -mon chardev=con,mode=readline \ -netdev user,id=netdev0 \ -device virtio-net-device,netdev=netdev0 \ -kernel ../../opensbi/build/platform/generic/firmware/fw_payload.bin \ -append "root=/dev/nfs nfsroot=192.168.1.1:/path/to/debian_rootfs,v3 ip=on nfsrootdebug rw" \ -m 2g \ -smp 4 \ -s \ ... [ 2.312617] ALSA device list: [ 2.313060] No soundcards found. [ 2.534757] VFS: Mounted root (nfs filesystem) readonly on device 0:20. [ 2.541726] devtmpfs: mounted [ 2.708101] Freeing unused kernel image (initmem) memory: 2260K [ 2.710000] Run /sbin/init as init process [ 4.808617] systemd[1]: systemd 256.4-2 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT +LIBARCHIVE) [ 4.811613] systemd[1]: Detected virtualization qemu. [ 4.812465] systemd[1]: Detected architecture riscv64. Welcome to Debian GNU/Linux trixie/sid! [ 4.857724] systemd[1]: Hostname set to <qemu>. ... Debian GNU/Linux trixie/sid qemu ttyS0 qemu login:
うまくいけばログイン画面が拝めるはずです。
ログインユーザーを作成する方法が良くわからなかったため、Debianのrootfsを別のinitramfsからマウントして無理やりuseraddしてユーザーを追加しました。本来どうするものなんでしょうね……?
自分でQEMUをビルドしていると、netdev user,...に対してnetwork backend 'user' is not compiledエラーが出る場合があります。その時はQEMUビルド時のconfigureのログを確認してください。
$ ./qemu-system-riscv64 -netdev user,id=a qemu-system-riscv64: -netdev user,id=a: network backend 'user' is not compiled into this binary #### configureのログ(NGパターン) Network backends AF_XDP support : NO slirp support : NO ## ★slirpが使えない★ vde support : NO netmap support : NO #### configureのログ(OKパターン) Network backends AF_XDP support : NO slirp support : YES 4.8.0 ## ★slirpが使える★ vde support : NO netmap support : NO
QEMUはnetdev user,...の実装にslirpを使っているようで、slirp supportがNOになっているとnetdev user,...が機能しません。libslirp-devをインストール(apt-get install libslirp-dev)してから、QEMUのconfigureと再ビルドをしてください。
< | 2024 | > | ||||
<< | < | 08 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日: