Milk-V Duo 64Mでbuildrootを使ってみる

buildrootのインストール

AliExpressで気になるLinuxボードを見つけました。
Milk-V Duoと言う製品で、こちらが製品のホームページです。
Milk-V DuoにはDuo(CV1800B)/Duo256M(SG2002)/DuoS(SG2000)の3つの製品が有りますが、今回、 Duo(CV1800B)とDuo256M(SG2002)を同時に入手しました。
こちらがパッケージですが、まるでガムです。



どちらもEthernet機能のないモデルです。
Duo 256Mはピンクのレジストでした。



Luckkfox-Picoと比べてみました。


Milk-V Duo 64Mに使われているSoCはCVITECのCV1800Bで、CPUはC906@1GHz+C906@700MHzの2コアです。
C906はT-HEAD Semicondactor(Alibabaの子会社)のXuanTieシリーズのRISC-VのCPUです。
XuanTieシリーズについてはこ ちらに詳しく紹介されています。
Raspberry Pi、OrangePi、NanoPi、LuckfoxPicoなど、今までArmのCPUばかり使ってきました。
RISC-VのCPUはESP32Cシリーズに使われていますが、このCPUを使ったLinuxボードは初めてです。
2コアですがLinuxで使用するのは@1GHzのコアだけです。



Milk-Vで利用できるOSイメージがいくつか公開されています。
公式のイメージはbuildrootで、こちらか ら各バージョンのイメージをダウンロードすることができます。
buildrootについては色々なところに紹介されていますので、細かい説明は割愛しますが、
ubuntuやdebianなどでは起動後に普通にできるこれらの事が全くできません。
・ユーザーやグループの追加、削除
・デバイスの追加、削除
・ライブラリやアプリケーションの更新、追加、削除

これらを行うためには一旦、イメージを作り直して、作り直したイメージを使って再起動する必要が有ります。
組み込み用途を前提にしたLinuxなので、一旦動いてしまえば、変更する必要が無いという前提です。

今回使用したのはv1.1.1の「milkv-duo-v1.1.1-2024-0528.img」のイメージです。
2024年10月時点の最新はv1.1.3ですが、v1.1.2からRNDISがCDC-NCMに変更されました。
CDC-NCMを使ったネットワーク共有の方法が分かりません。
CDC-NCMを使ったネットワーク共有の方法が分かったら、イメージを最新に更新する予定です。

SDカードへの書き込みはrufusを使いましたが、イメージファイルが圧縮されていないので、SDカードへの書き込みは結構時間が掛かります。
SDカードが準備できたら、USB-TTL変換アダプターを本体のデバッグポートに接続します。
GPIOのピン配置はこち らに公開されていますが、デバッグポートはピン番号16(TX)、17(RX)です。
USB-TTLアダプターをWindowsマシンに接続し、TeraTermを起動してから、ボードのUSB経由で電源を供給します。
ずらずらとブートメッセージが表示され、パスワード無しでいきなりログインします。

ボードのUSB経由で電源を供給する代わりに、USB-TTLアダプターの5Vからピン番号39(VSYS)に5Vを供給しても起動します。
この場合は、USB-TTLアダプターの5V、TX、RXを、Milk-Vのピン番号39、17、16に接続して、
USB-TTLアダプターをWindowsマシンに接続し、TeraTermを起動してからUSB-TTLアダプターのGNDをMilk-Vの GNDピンに接続します。


提供されているbuildrootのバージョンは2021.05です。
少し古いのが気になります。


提供されているbuildrootはRNDIS機能が最初から有効になっていて、USBポートに対して「192.168.42.1」のIPアドレ ス がアサインされます。
WindowsやLinuxホストのIPアドレスを同じセグメントに変更することで、USBポートを使ったネットワークが使えるようになります。


Swapは登録されていません。


パーテイションはこのように作られています。
16GのSDカードを使いましたが、アサインされているパーテイションは1G程度です。


pipは最初から登録されていますが、Swapが無いのでOut of memoryで落ちます。


こちら
にSwapを有効にする手順が公開されていますので、この手順に従ってSwapを有効にします。
[root@milkv-duo]~# fallocate -l 256M /mnt/swapfile
[root@milkv-duo]~# chmod 600 /mnt/swapfile
[root@milkv-duo]~# mkswap /mnt/swapfile
Setting up swapspace version 1, size = 256 MiB (268431360 bytes)
no label, UUID=d7f63f90-9062-4477-94d2-558d16cd5ff3
[root@milkv-duo]~# swapon /mnt/swapfile

Swapが256Mになりました。


これでpipが動くようになります。


ただし、この状態では再起動するとSwapが無くなってしまいます。
こちらに起動 時にSwapを有効にする方法が公開されていますので、この手順に従って起動時にSwapを有効にします。
これで再起動しても、起動時にSwapが有効になります。
[root@milkv-duo]~# echo "/mnt/swapfile swap swap defaults 0 0" >> /etc/fstab && sync
[root@milkv-duo]~# free -h
              total        used        free      shared  buff/cache   available
Mem:          28.3M       13.6M        5.1M        4.0K        9.6M       12.1M
Swap:        255.8M        1.8M      254.1M



RNDISを使ったネットワーク共有についてはこ ちらで紹介しています。
外部にネットワークが通る様に変更し、pip本体をアップデートしてみました。
なぜか以下のエラーになりました。


調べてみるとpipの[Errno 28] No space left on deviceは様々な原因で発生するようです。
ディスクの容量の問題のこともあれば、ファイルの個数のせいで発生することもあるらしいです。
以下の様に/tmpが小さいのが気になります。


そこで、環境変数"TMPDIR"を設定 して、再実行してみました。
pip本体が20.0.2から24.2にアップデートされました。
やはり/tmpが小さすぎるようです。
デフォルトでアサインされている/tmpのパーテイションサイズが小さすぎます。
アップデートは約16分掛かりました。


特にSwapを使い切っている訳でも無さそうです。


Adafruit-PlatformDetectをインストールしてみました。


Adafruit-PlatformDetectは動作中のLinuxのチップとボードを自動判定するライブラリです。
以下のスクリプト(platformdetect.py)で、このライブラリの動作を確認することができます。
from adafruit_platformdetect import Detector
detector = Detector()
print("Chip id: ", detector.chip.id)
print("Board id: ", detector.board.id)

Milk-V Duoを識別しました。
[root@milkv-duo]~# vi platformdetect.py
[root@milkv-duo]~# python3 ./platformdetect.py
Chip id:  CV1800B
Board id:  MILKV_DUO



さて、ここまで使って、このボードは大変遅いことに気が付きました。
私は同じ64MメモリのLuckFox Pico Miniボードを持っています。
LuckFox Pico MiniとMilk-V Duoとのカタログスペックの比較です。

LuckFox Pico Mini Milk-V Duo
SoC Rockchip RV1103 CVITEC CV1800B
CPU Coretex-A7@1.2GHz C906@1GHz
Memory 64MB 64MB

動作環境の比較です。

LuckFox Pico Mini Milk-V Duo
OS buildroot 2023.02.6 buildroot 2021.05
Swap 8.1G 256M
RNDIS Driver Remote NDIS based Internet Sharing Device Remote NDIS Compatible Device

実測値の比較です。
Swapサイズの違いは有りますが、Milk-Vは処理がものすごく遅いです。

@python3 -m pip --version
pipのバージョンを表示するだけでネットワークは使いません。
ネットワークを使わないので、RNDISドライバーの違いは関係ないことが分かります。

Apython3 -m pip install -U pip
RNDISネットワークを使ってpip本体を更新します。

Bpython3 -m pip install Adafruit-PlatformDetect
RNDISネットワークを使ってAdafruit-PlatformDetectをインストールします。


LuckFox Pico Mini Milk-V Duo
@ 5.76秒 1分47.68秒
A 35.17秒 16分29.27秒
B 11.89秒 5分29.36秒

続く....