LuckFox Pico Miniでbuildrootを使ってみる

buildrootのカスタマイズ

buildrootは起動後にライブラリやアプリケーションを追加することができません。
ライブラリやアプリケーションの追加を行うためには、buildrootのイメージを作り直す必要が有ります。
こちらに その手順が公開されていますが、一部分かりにくい個所が有りますので、順を追って説明します。
今回はpython arrowパッケージを追加します。
ちなみに標準で提供されているイメージでは、以下の様にエラーとなります。


ubuntu22.04のノートPCをbuildrootのカスタマイズに使用しました。

◇依存関係のインストール
$ sudo apt update

$ sudo apt install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync

◇SDKのダウンロード
WiKiではgitee(中国版のgithub)からダウンロードすることになっていますが、githubにも同じ内容が公開されています。
githubの方がダウンロードが早いです。
SDKは不定期に更新されていますので、しばらく使わなかったときはcloneしなおした方がいいです。
$ git clone https://github.com/LuckfoxTECH/luckfox-pico.git

◇環境変数の追加
$ cd $HOME/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/

$ source env_install_toolchain.sh
sed: /home/nop/.bash_profile を読み込めません: そのようなファイルやディレクトリ はありません

$HOME/.bash_profileが無い環境では上記のエラーになります。
このスクリプトの正体は以下の内容です。
#!/bin/bash

# command to install toolchain in the "dirname" which you Specified.
# source ./env_install_toolchain.sh dirname
INSTALL_TARGET_DIR=
toolchain_cross=`pwd`
toolchain_cross=$(basename ${toolchain_cross})
if [ -n "$1" ]; then
        if [ -d "$1" ]; then
                INSTALL_TARGET_DIR=$1
                build_toolchain_path="${INSTALL_TARGET_DIR}/$toolchain_cross/bin"
        else
                echo "error: not found dir $1"
                echo "command format: source $0 [dirname]"
                echo "     [dirname] is optional"
                return 1
        fi
else
        build_toolchain_path="${PWD}/bin"
fi

# default 1
selectopt=1

case $selectopt in
        0)
                if [ -n "$INSTALL_TARGET_DIR" ]; then
                        sudo cp -rfa $PWD $INSTALL_TARGET_DIR
                fi
                sudo echo "export PATH=$build_toolchain_path/:\$PATH" >> /etc/profile
                source /etc/profile
                ;;
        1)
                if [ -n "$INSTALL_TARGET_DIR" ]; then
                        cp -rfa $PWD $INSTALL_TARGET_DIR
                fi
                cmdsed="sed -i '/^export PATH.*${toolchain_cross}\/bin/d' \$HOME\/.bashrc"
                eval $cmdsed
                echo "export PATH=$build_toolchain_path:\$PATH" >> $HOME/.bashrc
                source $HOME/.bashrc
                cmdsed="sed -i '/^export PATH.*${toolchain_cross}\/bin/d' \$HOME\/.bash_profile"
                eval $cmdsed
                echo "export PATH=$build_toolchain_path:\$PATH" >> $HOME/.bash_profile
                source $HOME/.bash_profile
                ;;
        *)
                echo "Please check input."
                ;;
esac


$HOMEにある.bashrc .bash_profileを見事に書き換えるので、一度だけ実行すればOKです。
以下の内容をこれらの末尾に追加します。
export PATH=/home/nop/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH

◇sourceディレクトリの作成
SDK をダウンロードした直後には、「buildroot-2023.02.6」ディレクトリが存在しません。
$ cd $HOME/luckfox-pico

$ ls sysdrv/source/buildroot
ls: 'sysdrv/source/buildroot' にアクセスできません: そのようなファイルやディレクトリはありません

SDK を一度コンパイルする必要があります。
以下のコマンドを実行するとbuildrootの下にluckfox用のファイル(luckfox_pico_defconfig)が作られま す。
$ cd $HOME/luckfox-pico

$ ./build.sh lunch
You're building on Linux
  Lunch menu...pick the Luckfox Pico hardware version:
  ?? Luckfox Pico 硬件版本:
                [0] RV1103_Luckfox_Pico
                [1] RV1103_Luckfox_Pico_Mini_A
                [2] RV1103_Luckfox_Pico_Mini_B
                [3] RV1103_Luckfox_Pico_Plus
                [4] RV1106_Luckfox_Pico_Pro_Max
                [5] RV1106_Luckfox_Pico_Ultra
                [6] RV1106_Luckfox_Pico_Ultra_W
                [7] custom
Which would you like? [0~7][default:0]: 1
  Lunch menu...pick the boot medium:
  ????媒介:
                [0] SD_CARD
Which would you like? [0][default:0]: 0
  Lunch menu...pick the system version:
  ??系?版本:
                [0] Buildroot(Support Rockchip official features)
                [1] Ubuntu(Support for the apt package management tool)
Which would you like? [0~1][default:0]: 0
[build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk boards...
[build.sh:info] Running build_select_board succeeded.


$ ./build.sh

終わるまでに30分ぐらい掛かります。

$ ls -l sysdrv/source/buildroot/buildroot-2023.02.6
合計 992
-rw-rw-r--    1 nop nop 520134 10月 16  2023 CHANGES
-rw-rw-r--    1 nop nop  18767 10月 16  2023 COPYING
-rw-rw-r--    1 nop nop  30025 10月 16  2023 Config.in
-rw-rw-r--    1 nop nop 158670 10月 16  2023 Config.in.legacy
-rw-rw-r--    1 nop nop  77828 10月 16  2023 DEVELOPERS
-rw-rw-r--    1 nop nop  46619 10月 16  2023 Makefile
-rw-rw-r--    1 nop nop   2292 10月 16  2023 Makefile.legacy
-rw-rw-r--    1 nop nop   1075 10月 16  2023 README
drwxrwxr-x    2 nop nop   4096 10月 16  2023 arch
drwxrwxr-x   82 nop nop   4096 10月 16  2023 board
drwxrwxr-x   25 nop nop   4096 10月 16  2023 boot
drwxrwxr-x    2 nop nop  20480 11月 10  2023 configs
drwxr-xr-x   73 nop nop   4096  5月 15 21:05 dl
drwxr-xr-x    5 nop nop   4096 10月 16  2023 docs
drwxrwxr-x   20 nop nop   4096 10月 16  2023 fs
drwxrwxr-x    3 nop nop   4096 10月 16  2023 linux
drwxrwxr-x    6 nop nop   4096  5月 15 22:10 output

◇buildrootのホーム
以下のディレクトリがbuildrootのホームディレクトリになります。
$ cd $HOME/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/

◇defconfigの作成
buildrootのカスタマイズで使用するひな形定義を作成します。
luckfox_picoとluckfox_pico_w用のファイルが追加されています。
$ make list-defconfigs | grep luckfox
  luckfox_pico_defconfig              - Build for luckfox_pico
  luckfox_pico_w_defconfig            - Build for luckfox_pico_w

$ make luckfox_pico_defconfig
#
# configuration written to /home/nop/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/.config

◇buildrootのカスタマイズ
ここからがカスタマイズの本番になります。
$ make menuconfig

この画面が表示されます。
ここからはメニューを使ったカスタマイズを行います。


/を入力すると検索画面が表示されます。


検索する文字を入力します。


検索結果が表示されます。
カッコ内の番号(1)を入力します。


該当するメニュー項目にジャンプします。
この機能が素晴らしいです。


スペースで有効/無効を切り替えます。


<Save>で変更を保存します。


保存先はデフォルトのままでOKです。


保存終了。


後はひたすら<Exit>で抜けます。


◇buildrootのビルド
初回実行時は必要なパッケージのダウンロードを行うためかなり時間がかかります。
corei7のマシンで60分ぐらいかかりました。
2回目以降は比較的早く終わります。
$ make savedefconfig

$ make

◇イメージの作成
output/imageに新しいイメージができます。
$ cd $HOME/luckfox-pico

2回目以降は念のため消しておきます
$ rm -r output/image/

$ ./build.sh lunch
You're building on Linux
  Lunch menu...pick the Luckfox Pico hardware version:
  ?? Luckfox Pico 硬件版本:
                [0] RV1103_Luckfox_Pico
                [1] RV1103_Luckfox_Pico_Mini_A
                [2] RV1103_Luckfox_Pico_Mini_B
                [3] RV1103_Luckfox_Pico_Plus
                [4] RV1106_Luckfox_Pico_Pro_Max
                [5] RV1106_Luckfox_Pico_Ultra
                [6] RV1106_Luckfox_Pico_Ultra_W
                [7] custom
Which would you like? [0~7][default:0]: 1
  Lunch menu...pick the boot medium:
  ????媒介:
                [0] SD_CARD
Which would you like? [0][default:0]: 0
  Lunch menu...pick the system version:
  ??系?版本:
                [0] Buildroot(Support Rockchip official features)
                [1] Ubuntu(Support for the apt package management tool)
Which would you like? [0~1][default:0]: 0
[build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk boards...
[build.sh:info] Running build_select_board succeeded.

$ ./build.sh

$ ls -l output/image/
合計 510172
-rw-rw-r-- 1 nop nop   2928128  5月 16 21:15 boot.img
-rw-rw-r-- 1 nop nop    256448  5月 16 21:14 download.bin
-rw-rw-r-- 1 nop nop     32768  5月 16 21:15 env.img
-rw-rw-r-- 1 nop nop    182272  5月 16 21:14 idblock.img
-rw-rw-r-- 1 nop nop  47915008  5月 16 21:15 oem.img
-rw-rw-r-- 1 nop nop 205565952  5月 16 21:15 rootfs.img
-rw-rw-r-- 1 nop nop      1312  5月 16 21:15 sd_update.txt
-rw-rw-r-- 1 nop nop      1255  5月 16 21:15 tftp_update.txt
-rw-rw-r-- 1 nop nop    262144  5月 16 21:14 uboot.img
-rw-rw-r-- 1 nop nop 267405898  5月 16 21:15 update.img
-rw-rw-r-- 1 nop nop   9999360  5月 16 21:15 userdata.img

◇イメージの書き込み
output/imageの全てのファイルをwindowsマシンに転送し、書き込みツール(SocToolKit.exe)を使ってSDカード に書き込みま す。
書き込む時にはupdate.imgは書き込み対象から除外する必要が有ります。
Linux版の書き込みツール(SocToolKit.exe)が有ればいいのですが、どうもないみたいです。

◇新しいイメージで起動
新しいイメージを書き込んだSDカードをMiniボードに装着し、Miniボードに給電します。
プロンプトがいきなり変わり焦りました。
確認しましたが間違いなくbuildrootです。


追加したarrowライブラリが使えるようになります。


buildrootには多数のパッケージが準備されていて、ほとんど困ることは有りませんが、どうにもならないときは、
独自のパッケージ(Custom Package)を新しく追加することができます。
英語のサイトですが、独自パッケージの追加は、こ ちらこ ちらが参考になります。

buildrootのパッケージ検索機能は非常に強力です。
この様なパッケージを見つけました。


削除するかどうかの選択です。
調べたら非推奨パッケージになっていました。


?で詳細情報を表示することができます。
ソースが完全に削除されたので、他のライブラリを探せと書いてあります。




buildrootにはコンパイラーは含まれていません。
追加することもできません。
理由はこ ちらに記載されています。
C言語のアプリはホスト側でクロスコンパイルして、バイナリーだけを送り込むことになります。




google driveで提供されているbuildrootでは、python pipが使えません。


buildrootのパッケージにはpython-pipが有ります。
そこで、このパッケージを有効にして新しいイメージを作りました。




新しいイメージで起動して、pipのバージョンを表示してみましたが、このコマンドでハングします。


しばらくするとOut of memoryでFailしました。


Swap領域が無いことが原因です。


こちらに Memの空き領域を増やすヒントが有りました。
以下のディレクトリにボード毎のBoardConfigファイルが有ります。
$ ls $HOME/luckfox-pico/project/cfg/BoardConfig_IPC
BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra-IPC.mk
BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Ultra-IPC.mk
BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico-IPC.mk
BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk
BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_B-IPC.mk
BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk
BoardConfig-SD_CARD-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico-IPC.mk
BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Mini_A-IPC.mk
BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Mini_B-IPC.mk
BoardConfig-SD_CARD-Ubuntu-RV1103_Luckfox_Pico_Plus-IPC.mk
BoardConfig-SD_CARD-Ubuntu-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Mini_B-IPC.mk
BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk
BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IPC.mk
rv1103-spi_nor-post.sh
rv1106-spi_nor-post.sh

今回使っているのはMini-Aなので、以下のファイルを編集します。
この領域はカメラが使用する領域で、今回カメラを使う予定は無いので、この領域を小さくします。
$ vi $HOME/luckfox-pico/project/cfg/BoardConfig_IPC/BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk


# Config CMA size in environment
#export RK_BOOTARGS_CMA_SIZE="24M"
export RK_BOOTARGS_CMA_SIZE="1M"

新しいカーネルをビルドして、新しいカーネルで起動してみました。
Memの空き領域が20Mほど増えました。


これでpipが動くようになります。
timeコマンドで時間を計測しています。


こちらの 記事で/dev/mmcblk1p8は未使用という情報を見つけました。
そこで、このパーテイションにSwap領域を作ってみました。
$ mkswap /dev/mmcblk1p8
Setting up swapspace version 1, size = 54726455296 bytes

$ swapon /dev/mmcblk1p8
[  161.850393] Adding 8446684k swap on /dev/mmcblk1p8.  Priority:-2 extents:1 ac[root@luckfox root]$ ross:8446684k SS

$ free
              total        used        free      shared  buff/cache   available
Mem:          57588       14304       17984         612       25300       38848
Swap:       8446684           0     8446684

無事にSwap領域が作られたので、RK_BOOTARGS_CMA_SIZEを元に戻したカーネルで改めてSwapを作ってみました。


Memの空き領域は小さくなりますが、Swapができたので、この状態でもpipが動くようになります。


/dev/mmcblk1p8のパーティションはSDカードの一番最後の領域で、パーティション・サイズはマイクロSDカードのサイズに依存して 変わります。
こちらが16GのSDカードを使った時のSWAPサイズです。
16GのSDカードで8GのSwapが確保できるので、8GのSDカードではSwapは確保できないことになります。
$ mkswap /dev/mmcblk1p8
Setting up swapspace version 1, size = 8649404416 bytes

$ swapon /dev/mmcblk1p8
[   38.344758] Adding 8446684k swap on /dev/mmcblk1p8.  Priority:-2 ex[root@luckfox root]$ tents:1 across:8446684k SS

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          33.2M       14.0M        2.8M      612.0K       16.5M       15.8M
Swap:          8.1G           0        8.1G

こちらが64GのSDカードを使った時のSWAPサイズです。
mmcblk1p8のサイズは、単純にSDカード容量から8Gを引いた残りと言うわけでは無さそうです。
$ mkswap /dev/mmcblk1p8
Setting up swapspace version 1, size = 54726455296 bytes

$ swapon /dev/mmcblk1p8
[  105.830584] Adding 53443804k swap on /dev/mmcblk1p8.  Priority:-2 extents:1 across:53443804k SS

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          33.2M       24.9M        1.4M      612.0K        6.9M        4.8M
Swap:         51.0G           0       51.0G

BoardConfigファイルを眺めていたらこのような記述に気が付きました。
export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs),-(media)"
どうもこれがパーテイション・サイズを決めているようです。
この状態では/dev/rootは6Gのサイズとなります。


そこで、以下の様に変更してみました。
$ vi $HOME/luckfox-pico/project/cfg/BoardConfig_IPC/BoardConfig-SD_CARD-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk


#export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs),-(media)"
export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),10G(rootfs),-(media)"

カーネルをビルドして新しいカーネルで起動すると、/dev/rootが10Gになりました。


当然末尾のmmcblk1p8パーテイションは小さくなるので、この状態でSwapを作ると、Swap領域は小さくなります。
$ mkswap /dev/mmcblk1p8
Setting up swapspace version 1, size = 4354437120 bytes

$ swapon /dev/mmcblk1p8
[  480.012544] Adding 4252380k swap on /dev/mmcblk1p8.  Priority:-2 [root@luckfox roextentot]$ s:1 across:4252380k SS

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          56.2M       13.0M        6.3M      616.0K       37.0M       38.9M
Swap:          4.1G           0        4.1G

/etc/fstabに以下を追加すると、起動時にSwap領域を自動的にマウントします。




buildrootをカスタマイズしたらデバイスファイルが無くなってしまいました。
これがカスタマイズ前のデバイスファイルです。


これがカスタマイズ後のデバイスファイルです。


各種ライブラリを使いたくてpython-pipを有効にしましたが、デバイスファイルが無くなっては、pipを使う意味が無くなります。
この問題が解決するまで、buildrootのカスタマイズは止めましょう。

続く....