今回はStarFive Technology製のRISC-Vシングルボードコンピューター
RISC-VとVisionFive 2
RISC-V
本連載でも2018年ぐらいから、RISC-Vの記事を何度か取り上げていました。
- 第505回:
「オープン規格の新しい命令セットアーキテクチャRISC-V入門 ツールチェインを用意する」 - 第587回:
「RISC-Vベースの “AIoTカメラ” 」であるM5StickVをUbuntuで使う - 第603回:
「RISC-VのDebianイメージをQEMUで動かす」
さて、RISC-Vはマイコン向けが今もっとも人気のある分野ではあるのですが、昔からより高性能なボードも出ていました。その最たるものがSiFiveの
Raspberry Piクラスの価格とサイズやペリフェラルで、そこそこの性能のSoCが載ったシングルボードコンピューターが欲しいという要望
今回紹介する
軽くスペックも紹介しておきましょう。詳細は公式のドキュメントにあるQuick Start Guide
- CPU:StarFive JH7110 (U74 4 Core 1.
5GHz) RV64GC - LPDDR4 SDRAM 2GiB/
4GiB/ 8GiB 2800Mbps - QSPI Flash
(ブートローダー用) - microSDカードスロット
(TFカードスロット) - eMMCソケット
- M.
2 M-key NVMeコネクター (2280サイズが入る) - 1000BASE-T x 2ポート
- USB 3.
0 x 4ポート - USB-C給電ポート
- MIPI CSI/
DSI - GPIO Headers
- Video Processing Unit/
GPU - HDMI
いわゆる
もうひとつのポイントはこの手のボードにありがちな
VisionFive 2は2023年2月時点ではUbuntuに対応していません。ただし、すでに前世代のVisionFiveは対応済みですし、2022年11月25日のUbuntu Weekly Topicsでも紹介しているように、なにがしかの対応は行われる可能性が高いです。
今回はまずStarFiveが提供している公式のDebianイメージを使ってみましょう。また、その前にQSPI Flashに格納されるブートローダーを更新する手順も説明します。
必要な機材一覧
まずはDebianを動かす上で、必要な機材をまとめておきましょう。太字は
- 給電用のUSB-Cケーブル
- USB-C経由のACアダプター
(5V、最低3A以上) - 32GB以上のmicroSDカード
- Ethernetケーブル
- シリアルコンソールケーブル
- HDMIケーブル・
HDMIディスプレイ - USBキーボード・
マウス - スペーサー
- ファン
VisionFive 2はUSB-Cケーブルで給電します。よって少なくとも片方のコネクタがUSB-Cである必要があります。USB PDにも対応しているので、その手の電源コネクター付きポータブルバッテリーとかを繋ぐのも良いかもしれません。なお、最低3A以上とは書いてあるものの、実際の消費電力が15W超えることはほぼないようです。電源に関する詳細はデータシートの
給電機材とmicroSD以外は、VisionFive 2の操作をどうするかで、必要な機材が変わってきます。直接操作するならHDMIケーブル・
なお、初期ファームウェアはHDMIに画面を正しく表示できないかもしれません。この場合は、Ethernetかシリアルコンソールケーブルが必要になります。また、QSPI Flashに書かれているブートローダーが何らかの理由で壊れてしまった場合は、シリアルコンソールケーブルでのみ復旧できます。
これらのことを踏まえると、最低でもEthernetケーブルさえあれば最初のうちはなんとかなります。ちなみにむき出しの基盤を地面に置くのは危ないので必要な機材にあるスペーサーも用意したほうが良いでしょう。特にM.
ファンについては、負荷をかけるならあったほうが良さそうです。軽く動かしてみる程度ならなくても問題ありません。
ブートローダー等の更新
準備ができたらVisionFive 2からDebianを起動したいところですが、先にブートローダーを更新しておきましょう。古いブートローダーは、新しいDebianをうまく起動できないためです。
ブートローダーはU-Bootが使われています。U-Boot本体
まず上記のサイトから次の3ファイルをダウンロードしておいてください。
sdcard.
img u-boot-spl.
bin. normal. out visionfive2_
fw_ payload. img
最初がブートローダーを書き込むツール類が一式入ったイメージです。Buildrootで構築されたシンプルなLinux環境となっています。2番目がSPL、3番目がU-Boot本体で、このふたつをQSPI Flashに書き込むことになります。
sdcard.
はmicroSDカードに書き込んでおきましょう。デスクトップ環境があるなら第488回で紹介しているEtcherが定番ですし、CLIで良ければ次のように書き込みます。なお、/dev/デバイス名
の部分は環境によって異なる」
$ sudo dd if=sdcard.img of=/dev/デバイス名 bs=1M status=progress $ sudo sync
microSDカードをVisionFive 2に接続します。次にLANケーブルをコネクターのどちらか好きなほうに接続しましょう。もう片方のコネクターは未接続でOKです。LANケーブルの反対側はDHCPでアドレスを取得できるスイッチ等に接続しておいてください。あとでSSH接続することになるため、接続元のPCと同じネットワークにつないでおく必要がああります。あとはUSB-Cケーブルを接続すれば、電源が入ります。
なお、この時点ではHDMIには何も出力されないので注意してください。起動の流れを見たければシリアルコンソールケーブルが必要ですが、今回はそちらも使いません[3]。
うまく電源が入ったら、リセットボタンそばの赤LED
さて、VisionFive 2にSSHログインしたいわけですが、IPアドレスを知る必要があります。残念ながらsdcard.
はmDNS等が動いていません。しかしながら幸いイーサネットのコネクター部分にQRコードのシールが貼ってあり、ここに両方のMACアドレスが記載されています。というわけで、スマートフォンのカメラか何かでQRコードを読み取ってみましょう。いろいろ長い文字列が表示されるものの、末尾に
もしルーター等のDHCPサーバーのログが見られるなら、このMACアドレスからIPアドレスを確認できます。確認できないようなら、同じサブネットに所属するIPアドレスに順番にpingを打って、そこから類推してもいいでしょう。具体的には手元のマシンから次のように実行します。
$ for i in $(seq 254); do ping -c 1 -q -W 1 198.51.100.$i > /dev/null && echo 198.51.100.$i; done 198.51.100.1 198.51.100.81 $ ping -c 1 198.51.100.81 PING 198.51.100.81 (198.51.100.81) 56(84) bytes of data. 64 bytes from 198.51.100.81: icmp_seq=1 ttl=64 time=0.499 ms --- 198.51.100.81 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.499/0.499/0.499/0.000 ms $ ip neigh show to 198.51.100.81 198.51.100.81 dev enp5s0 lladdr 6c:cf:39:00:32:5b STALE
ここで198.
」198.
」198.
」198.
」
反応があったIPアドレスにもう一度pingを打って、ip neigh
」
$ ssh root@198.51.100.81 root@198.51.100.81's password: # uname -a Linux buildroot 5.15.0 #1 SMP Thu Jan 19 04:09:45 CST 2023 riscv64 GNU/Linux # cat /etc/os-release NAME=Buildroot VERSION=VF2_v2.8.0 ID=buildroot VERSION_ID=2021.11 PRETTY_NAME="Buildroot 2021.11"
パスワードはstarfive
」
# cat /proc/mtd dev: size erasesize name mtd0: 00020000 00001000 "spl" mtd1: 00300000 00001000 "uboot" mtd2: 00100000 00001000 "data" # dd if=/dev/mtd0 status=none | strings | grep "U-Boot SPL" U-Boot SPL 2021.10 (Dec 19 2022 - 17:24:44 +0800) # dd if=/dev/mtd1 status=none | strings | grep "U-Boot 20" U-Boot 2021.10 (Dec 19 2022 - 17:24:44 +0800)
QSPI Flashはmtd0からmtd2までの3パーティションに分割されています。このうち最初にSPLが、2番目にU-Boot本体
まずは接続元のマシンからVisionFive 2に、先ほどダウンロードしたイメージをコピーしておきます。
$ scp u-boot-spl.bin.normal.out visionfive2_fw_payload.img root@198.51.100.81:
ここからは公式のドキュメントに従ってアップグレードしていきましょう。今回使用するのはBuildroot環境であり、最新のsdcard.
は最初からflashcp
コマンドがインストールされています。
# flashcp --version flashcp (mtd-utils) 2.1.3
よってあとは、先ほどコピーしたファイルをQSPI Flashに書き込むだけです。SPLは/dev/
に、U-Boot本体は/dev/
に書き込みます。
# flashcp -v u-boot-spl.bin.normal.out /dev/mtd0 Erasing blocks: 32/32 (100%) Writing data: 127k/127k (100%) Verifying data: 127k/127k (100%) # flashcp -v visionfive2_fw_payload.img /dev/mtd1 Erasing blocks: 683/683 (100%) Writing data: 2731k/2731k (100%) Verifying data: 2731k/2731k (100%)
SPLはサイズが小さいのですぐに完了しますが、U-Boot本体は20倍以上のサイズなのでそれなりの時間がかかります。その間、誤って電源を切らないように注意しましょう。改めてデータ内部の文字列を見てみると、新しいバイナリに更新されていることがわかります。
# dd if=/dev/mtd0 status=none | strings | grep "U-Boot SPL" U-Boot SPL 2021.10 (Jan 19 2023 - 04:09:41 +0800) # dd if=/dev/mtd1 status=none | strings | grep "U-Boot 20" U-Boot 2021.10 (Jan 19 2023 - 04:09:41 +0800)
これでブートローダーの更新は完了です。あとはreboot
コマンドやリセットボタンで再起動して、問題なく起動することを確認しましょう。電源が再度入ったあと数秒すると緑LEDが間欠的に点滅しますし、数十秒も待てば先ほどと同じようにsshログインできるようになっているはずです。
ちなみにこのBuildroot環境は、HDMIに何も出力しませんが、使えないというわけではありません。rootのホームディレクトリにあるrun_
」
# cat run_weston.sh #!/bin/sh export XDG_RUNTIME_DIR=/root export LANG="en_US.UTF-8" export XCOMPOSEFILE=/root/.config/XCompose weston --tty=1
スクリプトの内容はこれだけです。これを単に実行するだけでWestonが立ち上がりますので、HDMIディスプレイやUSBキーボード・
Debianをインストールする
次にStarFiveが提供しているVisionFive 2向けのDebianを、公式のQuick Start Guideのインストール手順に従ってインストールしてみましょう。
先ほどsdcard.
を書き込んだmicroSDでもいいですし、別のmicroSDでもかまわないので、ダウンロードしたイメージを書き込みましょう。これもEtcher等を使うのがおすすめですが、CLI操作なら次のように実行します。繰り返しになりますが、/dev/デバイス名
の部分は環境によって異なる」
$ bzcat starfive-jh7110-VF2_515_v2.5.0-69.img.bz2 | sudo dd of=/dev/デバイス名 bs=4M status=progress
これもかなり時間がかかります。システムのメモリ容量によってはうまく動かないかもしれません。別の方法としてはbzcat
コマンドとパイプを使わずに、bunzip2
コマンドで一旦展開してからそれをdd
コマンドで書き込むという方法もあります。
microSDカードを準備できたら、それをVision Five 2に接続して、電源をいれます。先ほどと同じように数十秒でsshログインできるようになるはずです。ただし同じIPアドレスに対してSSHサーバーの鍵が変わってしまうためWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
」
$ ssh-keygen -f "$HOME/.ssh/known_hosts" -R "IPアドレス"
また、DebianはmDNSが動いているため、IPアドレスを調べなくても
$ ssh user@starfive.local
Debian環境はsudo
コマンド利用可能な、user
」starfive
」root
アカウントのパスワードもstarfive
」
Debian環境にはXfceがインストールされているため、HDMIディスプレイとUSBキーボード・
実際に使ってみるとわかりますが、比較的軽量な部類に入るXfceですら、もっさりとした動作です。これはmicroSDという低速なストレージを使っていることもありますが、そもそもCPU/
$ uname -a Linux starfive 5.15.0-starfive #1 SMP Mon Dec 19 07:56:37 EST 2022 riscv64 GNU/Linux $ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux bookworm/sid" NAME="Debian GNU/Linux" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" $ cat /etc/debian_version bookworm/sid
カーネルは5./proc/
を見ると、正しく4コアとして認識されていることがわかります。
# cat /proc/cpuinfo processor : 0 hart : 2 isa : rv64imafdc mmu : sv39 isa-ext : uarch : sifive,u74-mc processor : 1 hart : 1 isa : rv64imafdc mmu : sv39 isa-ext : uarch : sifive,u74-mc processor : 2 hart : 3 isa : rv64imafdc mmu : sv39 isa-ext : uarch : sifive,u74-mc processor : 3 hart : 4 isa : rv64imafdc mmu : sv39 isa-ext : uarch : sifive,u74-mc
amd64なCPUと比べると拡張機能等が少ないため大変シンプルな出力です。
リポジトリの設定
Debianイメージはsnapshot.
$ cat /etc/apt/sources.list deb https://snapshot.debian.org/archive/debian-ports/20220616T194833Z unstable main
そのままでも良いのですが、リポジトリの鍵更新の都合で、次のようにエラーになってしまいます。
$ sudo apt udpate Hit:1 https://snapshot.debian.org/archive/debian-ports/20220616T194833Z unstable InRelease Err:1 https://snapshot.debian.org/archive/debian-ports/20220616T194833Z unstable InRelease The following signatures were invalid: EXPKEYSIG E852514F5DF312F6 Debian Ports Archive Automatic Signing Key (2022) <ftpmaster@ports-master.debian.org> Reading package lists... Done Building dependency tree... Done Reading state information... Done 1 package can be upgraded. Run 'apt list --upgradable' to see it. W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://snapshot.debian.org/archive/debian-ports/20220616T194833Z unstable InRelease: The following signatures were invalid: EXPKEYSIG E852514F5DF312F6 Debian Ports Archive Automatic Signing Key (2022) <ftpmaster@ports-master.debian.org> W: Failed to fetch https://snapshot.debian.org/archive/debian-ports/20220616T194833Z/dists/unstable/InRelease The following signatures were invalid: EXPKEYSIG E852514F5DF312F6 Debian Ports Archive Automatic Signing Key (2022) <ftpmaster@ports-master.debian.org> W: Some index files failed to download. They have been ignored, or old ones used instead.
そこでリポジトリを日付指定のスナップショットではなく、最新のsidにしてしまいましょう。
$ sudo mv /etc/apt/sources.list{,.d/snapshot.conf.disabled} $ echo "deb http://deb.debian.org/debian-ports unstable main" | sudo tee /etc/apt/sources.list
さらにリポジトリの公開鍵も更新しておきます。これはいくつか方法があるのですが、最新のkeyringパッケージを取得してインストールするのがかんたんです。
$ wget https://deb.debian.org/debian-ports/pool/main/d/debian-ports-archive-keyring/debian-ports-archive-keyring_2023.02.01_all.deb $ sudo apt install ./debian-ports-archive-keyring_2023.02.01_all.deb $ sudo apt update $ sudo apt full-upgrade
最後の更新時はおそらく800個以上のパッケージが更新され、600MB以上のダウンロードが必要になります。心してかかってください。アップグレードが完了したらsudo reboot
」
また、ブートローダー等を更新するためにはflashcp
コマンドが必要になります。Debianだと最初からは入っていないようなのでsudo apt install mtd-utils
」
他にもたとえばPCIeデバイスを見るなら、次のように実行します。
$ sudo apt install pciutils $ lspci 00:00.0 PCI bridge: PLDA XpressRich-AXI Ref Design (rev 02) 01:00.0 USB controller: VIA Technologies, Inc. VL805/806 xHCI USB 3.0 Controller (rev 01)
ベンチマークを計測する
せっかくだからベンチマークもとってみましょう。第724回
もちろんこれらはDebianでも利用可能です。次のようにパッケージをインストールしましょう。
$ sudo apt install fio jq p7zip-full
p7zipでシングルスレッドの性能を計測してみます。
$ 7z b -mmt1 7-Zip 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=C,Utf16=off,HugeFiles=on,64 bits,4 CPUs LE) LE CPU Freq: 64000000 64000000 64000000 - - - 512000000 - - RAM size: 7927 MB, # CPU hardware threads: 4 RAM usage: 435 MB, # Benchmark threads: 1 Compressing | Decompressing Dict Speed Usage R/U Rating | Speed Usage R/U Rating KiB/s % MIPS MIPS | KiB/s % MIPS MIPS 22: 908 100 885 884 | 17148 100 1465 1464 23: 871 100 889 888 | 16845 100 1459 1458 24: 840 100 904 903 | 16474 100 1449 1446 25: 808 100 924 923 | 16069 100 1432 1430 ---------------------------------- | ------------------------------ Avr: 100 901 900 | 100 1451 1450 Tot: 100 1176 1175
Alder LakeのCore i9-12900のP-Core/
fioに関しては設定が複雑なので第749回を参照してください。ここでは計測結果だけ示します。
$ jq -r '.jobs[] | [.jobname, if .read.bw > 0 then .read.bw, .read.iops | round else .write.bw, .write.iops | round end] | @tsv' \ results.json | column -t --table-columns JOB,KB/s,IOPS --table-right KB/s,IOPS JOB KB/s IOPS SEQ1MQ8T1-Read 22888 22 SEQ1MQ8T1-Write 11930 12 SEQ128KQ32T1-Read 22811 178 SEQ128KQ32T1-Write 11951 93 RND4KQ32T16-Read 8138 2035 RND4KQ32T16-Write 2378 595 RND4KQ1T11-Read 6482 1621 RND4KQ1T1-Write 2117 529
今回使用したのはTranscendの64GB、class 10/
ベンチマークを取るならhttp://
」
まずはgit
コマンドをインストールして、ソースコードをcloneします。
$ sudo apt install git $ git clone https://github.com/ThomasKaiser/sbc-bench.git $ cd sbc-bench/
「-h
」
$ ./sbc-bench.sh -h Usage: sbc-bench.sh [-c] [-g] [-G] [-h] [-m] [-P] [-t $degree] [-T $degree] [-s] ############################################################################ Use sbc-bench.sh for the following tasks: sbc-bench.sh invoked without arguments runs a standard benchmark sbc-bench.sh -c also executes cpuminer stress tester (NEON/SSE/AVX) sbc-bench.sh -g graphs 7-zip MIPS for every cpufreq OPP sbc-bench.sh -G Geekbench mode, ensures benchmark is properly monitored sbc-bench.sh -h displays this help text sbc-bench.sh -j Jeff Geerling mode. Don't use if you're not him sbc-bench.sh -k Kernel info: version number and vendor/BSP check sbc-bench.sh -m [$seconds] provides CLI monitoring (5 sec default interval) sbc-bench.sh -P Phoronix mode, ensures benchmark is properly monitored sbc-bench.sh -r Review mode: generate insights via benchmarking sbc-bench.sh -s also executes stockfish stress tester (NEON/SSE/AVX/RAM) sbc-bench.sh -t [$degree] runs thermal test waiting to cool down to this value sbc-bench.sh -T [$degree] runs thermal test heating up to this value The environment variable MODE can be set to either extensive or unattended prior to benchmark execution. Exporting MaxKHz will also be honored, see here for details: https://github.com/ThomasKaiser/sbc-bench#unattended-execution With a Netio powermeter accessible you can export Netio=address/socket to sbc-bench defining address and socket this device is plugged into. Requires XML API enabled and read-only access w/o password. Use this only with -g to draw efficiency graphs since results will be slightly tampered by this mode. ############################################################################
たとえば-c
」
$ sudo ./sbc-bench.sh -c WARNING: This tool is meant to run only on Debian Stretch, Buster, Bullseye or Ubuntu Bionic, Focal, Jammy, Kinetic. When executed on Debian GNU/Linux bookworm/sid results are partially meaningless. Press [ctrl]-[c] to stop or [enter] to continue. Average load and/or CPU utilization too high (too much background activity). Waiting... Too busy for benchmarking: 08:11:51 up 3:05, 2 users, load average: 0.15, 0.04, 0.01, cpu: 0% Too busy for benchmarking: 08:11:56 up 3:05, 2 users, load average: 0.14, 0.04, 0.01, cpu: 0% Too busy for benchmarking: 08:12:01 up 3:05, 2 users, load average: 0.13, 0.04, 0.01, cpu: 0% Too busy for benchmarking: 08:12:06 up 3:05, 2 users, load average: 0.12, 0.04, 0.01, cpu: 0% Too busy for benchmarking: 08:12:11 up 3:05, 2 users, load average: 0.11, 0.04, 0.01, cpu: 0% Too busy for benchmarking: 08:12:16 up 3:05, 2 users, load average: 0.10, 0.03, 0.01, cpu: 0% sbc-bench v0.9.23 Installing needed tools: apt -f -qq -y install gcc make build-essential lm-sensors sysstat curl lshw mbw, tinymembench, ramlat, mhz (can't build cpuminer) Done. Checking cpufreq OPP. Done (results will be available in 10-16 minutes). Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Executing 7-zip benchmark. Done. (/usr/local/src/cpuminer-multi/cpuminer missing or not executable). Done. Checking cpufreq OPP again. Done (12 minutes elapsed). Memory performance memcpy: : 864.6 MB/s memset: : 762.6 MB/s 7-zip total scores (3 consecutive runs): 3998,4180,4082, single-threaded: 1194 OpenSSL results: type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 7890.50k 8696.23k 9010.94k 9089.02k 9117.70k 9125.89k aes-128-cbc 7862.50k 8708.78k 9021.27k 9102.34k 9112.23k 9095.57k aes-192-cbc 6889.01k 7514.01k 7737.34k 7794.69k 7809.71k 7809.71k aes-192-cbc 6879.35k 7513.32k 7732.22k 7790.59k 7809.71k 7809.71k aes-256-cbc 6079.53k 6588.97k 6759.25k 6803.46k 6823.94k 6815.74k aes-256-cbc 6122.47k 6600.96k 6769.07k 6813.35k 6826.67k 6826.67k Full results uploaded to http://ix.io/4owG
Debianのsidには対応していない旨が表示されますが、特に問題なく動くと思っていただいてかまいません。Too busy for
」
あとは必要なパッケージをインストールしてテストを実施するのでしばらく放置しておくと、上記のようにResults.
にまとまっていますので、そちらと比較してみるのもいいかもしれません。
たとえばRaspberry Piの3B+と4から代表的な結果を抽出し、今回の計測結果と比較すると次のようになります。
Device | Clock | Kernel | 7-zip multi/ |
AES | memcpy | memset |
---|---|---|---|---|---|---|
RasPi 3B+ | 1. |
4. |
3240/ |
36600 | 1130 | 1530 |
RasPi 4 | 1. |
5. |
5790/ |
36260 | 2330 | 3120 |
VisionFive2 | 1. |
5. |
4090/ |
6820 | 860 | 760 |
前提条件がいろいろ異なるため単純な比較は難しいですが、CPUだけだとRasPi 3B+よりはよい性能が出ているものの、メモリーの速度が厳しいように見えます。特にLPDDR4で2800Mbpsまで出るはずのVisionFive 2がLPDDR2なRasPi 3B+に比べてこの結果だとすると、そのあたりに速度が出ない要因がありそうです。