組込みLinux Beaglebone blackでやってみる その10 Buildroot

今度は、Buildrootを使ってビルドしてみます。 今までは、個別にU-BOOTのビルド、Linux Kernelのビルド、BusyBoxと手作業でルートFSをビルド、Linux Kernelモジュールインストール、アプリケーション?機能?(dropbear)の組込みをしました。 Buildrootはこれらを一括して実行してくれます。 しかも、ntp, ngix, openvpn, apache, dropbear, wireshark,opcuaなどチェックを入れるだけで組み込んでくれます。 OpenWRTは用途限定Wirelessルータ用、Yoctoは高機能版、BuildrootはYoctoより簡単な組込み版の様です。 Yoctoも組込みでも使われるようですが難しいらしいので、まずBuildrootでやってみます。

『その10』の次はBBBでデバイスドライバ作成に挑戦しようと思います。

Buildrootインストール

Index of /downloads/
$ cd ~/BBB_Workspace/Downloads
$ mv ~/Downloads/buildroot-2022.11.tar.gz .
$ tar -zxvf buildroot-2022.11.tar.gz    // 解凍

Buildroot menuconfig

  1. ~/BBB_Workspace/Downloads/buildroot-2022.11/configs/beaglebone_defconfig がBBB用のdefconfigなので、beaglebone_defconfigを付けてmakeします
$ cd ~/BBB_Workspace/Downloads/buildroot-2022.11
$ make beaglebone_defconfig    //2 分くらい
$ make manuconfig 
  1. make menuconfigでmenuconfigにはる。
    • 【注意】一旦menuconfigに入ったらターミナルの大きさ変更をしないこと。 変更したらmenuconfigがクラッシュすることがあります。 クラッシュしたら、設定値が勝手に書き換えられてしまうので、また最初のmake distcleanから始めてください。 例:TargetはARM Little Endianですが、x386等に変わっていたので、他の設定も変わっている可能性が高いです。
  2. Toolchainにはいる
  3. Toolchain Typeに入りで、『External toolchain』を選択して戻る。
  4. Toolchainの下のToolchainに入り『Linaro ARM 2018.05』を選択して戻る。(2018.05がない場合、表示されている、Linaro ARM 20xx.xx選択)
  5. Toolchain originに入り、『Toolchain to be downloaded and installed』を選択して戻る
  6. 【失敗情報】
    • 『その9』まで使っていた既にインストールしているgcc-linaro-7.5.0-2019.12… を使おうとパスも設定して実行していろいろ試してみましたが、エラーでビルド出来ませんでした。
    • gcc-linaro-7.5.0-2019.12…で失敗した後、Linaro ARM 2018.05を選択し直して、ビルド(make)を開始したらgcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xzがダウンロードされ、gcc-linaro-7.3.1-2018.05-linux-manifest.txtというファイルが作成されてビルドすることが出来ました。
  7. System configuration/System hostname で『ichiri』と入力(何でも構いません)
  8. 同じページでEnable root login with password にチェックを入れる
  9. Root passwordに 『root』と入力(何でも構いません)
  10. 同じページで、Run a getty (login prompt) after bootにチェックを入れる
  11. Run a getty (login prompt) after bootに入り、/TTY port => 『ttyS0』に変更(BBBの固定値)
  12. Run a getty (login prompt) after boot/Baudrate も『115200』に変更
  13. Linux Kernelのチェックを外す (既にビルドしたので、まずはここではKernelをビルドにさせない)
  14. Target packages/Network applications/OpenSSHを追加
  15. Buildloaders/U-BOOTのチェック外す(既にビルドしたので、ここではU-BOOTもビルドしない)
  16. Save でmenuconfigから抜ける

ビルド

  • makeをすると1分ほど画面が止まり、いろいろなLibraryをダウンロードしてビルドが始まります。
  • Linux Kernelビルドを入れていないのですが、初回は何故かビルドに3.5時間かかりました。 Linaroも新しくダウンロードしたりしているからかもしれません。
make -j4
make[2]: warning: -j1 forced in submake: resetting jobserver mode.
// 強制的に-j1になったので、Buildrootでは、私のPCの時は-j4の効果はないので今後はmakeのみで実行。

3.5時間かかって終了。 U-BOOTは既に別でビルドしていて、MLOもあるので、Buildrootで作らない指定にしいていました。 なので、MLOを作れなかったと表示されていますが、別に問題ありません。 

./output/imagesを見てみると、ちゃんとルートFSとuEnv.txtが出来ていますね。 しかし必要なのはrootfs.tarだけです。 このrootfs.tarにBusyBoxで作ったコマンド群とルートFSに必要なディレクトリやファイル群が出来ています。 また、OpenSSHなどのPackageもインストールされています。

起動

Linux kernelのuImageとデバイスツリーのam335x_boneblack.dtbとU-BOOTのuboot.imgとMLOとブートスクリプトのboot.scrは既に、TFTP用ディレクトリとmicroSDに入っているので、使うのは今回作ったルートFS用のrootfs.tarファイルだけです。 

このrootfs.tarを『その8』で作っているNFS用ディレクトリに解凍展開します。 その前に、今まで作ったルートFSのバックアップを作っておきます。

$ cd /srv/nfs/bbb
$ sudo cp -r * /srv/nfs/bb_bak
$ sudo rm -r *
$ cd ~/BBB_Workspace/Downloads/buildroot-2022.11/output/images
$ sudo tar -xf rootfs.tar -C /srv/nfs/bbb/ 

『その8』(TFTPとNFS)の方法で起動すると無事立ち上がりました。

  • メッセージを見るとBuildrootで選択したsshもインストールされssh用の秘密鍵を生成して、sshdが立ち上がっているのが分かります。
  • by ichiriとかichiri loginは、それぞれBuildrootのmenuconfigで書いた内容が反映されているので、Buildrootで作ったBusyBoxルートFSで立ち上がっているのがわかります。
  • しかし、何で3時間半もビルドにかかったのか解りません。 今までBusyBoxのビルドは5分くらいで終わったのですが。 そういえばKernelモジュールのインストールしていないのに立ち上がったということは、Kernelモジュールもビルドして組み込んでいるのかな。 しかし、Kernelバージョンも指定していないし、Kernelで何が組み込まれて何がモジュールかBuildrootにはわからないはずだし。 ここはまだ不明です。

OpenSSH client

BBBからuBuntuにsshが繋がりました。

BBB側
# ssh ichiri@192.168.27.1

では、『exit』で抜けて、BBBのssh serverの設定をします。

OpenSSH server

『PermitRootLogin yes』を設定しないと、『Permission Denied』で接続出来ません。

BBB側
# cd /etc/ssh
# vi sshd_config
// #PermitRootLogin prohibit-passwordの下に以下を記述
PermitRootLogin yes

// 以下を実行してsshdを再起動します。
# /etc/init.d/S50sshd restart

上記を設定したらuBuntuからBBBのssh serverに無事繋がりました。 OpenSSHの代わりにDropbearもBuildrootで組み込めるので、容量を小さくしたい時にまた検討したいと思いますが、OpenSSHだけでも出来ることが分かりました。

uBuntu側
$ ssh root@192.168.27.2

Buildroot でLinux とU-BOOTも同時にビルド

先程は、ルートFSだけ作りましたが、今回はKernelもU-BOOTも同時にビルドします。 make menuconfigから、

  1. Kernelに入る
    1. Linux kernelにチェック
    2. 最新のKernel Versionを選択。 私の場合は、『Latest CIP RT SLTS version (5.10.145-cip17-rt7)』にしました。
    3. Kernel configuration にはいり、『Using an in-tree defconfig file』にチェックを入れ戻る。
    4. Decfconfig nameに、_defconfigを除いた『omap2plus』をいれる。
    5. Kernel binary formatを、『uImage』にする。
    6. load addressに、Kernelビルド時にも使用した『0x80008000』を入れる。
    7. Build a Device Tree blob / 『Use a device tree present in the kernel』にチェックを入れる
    8. DTB is built by kernel itselfの下の行にあるIn-tree Device Tree Source file namesに入り『am335x-boneblack』以外は消す。
    9. Build Device Tree with overlay supportにチェックを入れるのは、dtbビルド時に-@をdtcに受け渡す。
  2. Bootloadersに入る
    1. U-BOOTを選択
      1. U-BOOT Version選択
      2. 既に表示されている『2022.04』を選択(だめな場合は、カスタムで『2022.11』を入れてみる)
      3. U-Boot configurationで、Using an in-tree board defconfig fileを選択
      4. U-Boot configurationで、『am335x_evm』と入れる。 エラーになった場合は、『am335x_boneblack』で再試行。
      5. U-Boot needs dtcにチエックを入れる (Device Tree Compiler)
      6. U-Boot binary formatで『u-boot.img』を選択
      7. U-Boot SPL/TPL binary image name(s)に『spl/u-boot-spl.bin』の代わりに『MLO』と入力する

ビルドが終わったら、zImage not foundとでるが、uImageを作っているのでこのエラーは無視できる。

成功すると、先ほどと同じ./output/images/に全てのファイルが生成されています。 rootfs.tarは上記のように解凍しますが、それ以外のファイルは『その8』のように、それぞれのディレクトリやmicroSDにいれて試してみてください。

これで立ち上がったので、これで完了です。 因みに~/.ssh/configは書き換えられてしまっているので、PermitRootLogin yesの再度設定が必要です。

おしまい

(メモ)

4回目を実行したら、何故かarm-linux-gnueabihf-gccが無いといわれた。 実際arm-linux-gnueabihf-gccがあるのは、./output/host/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc なので、見に行っている場所が異なる。 menuconfig の、Toolchain originで『Pre-installed toolchain』に設定してみたけど同じ。

make[2]: /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/host/bin/arm-linux-gnueabihf-gcc: Command not found
make[2]: *** [Makefile:132: cap_alloc.o] Error 127
make[1]: *** [package/pkg-generic.mk:293: /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/libcap-2.65/.stamp_built] Error 2

Custom toolchainを選択してやってみる。

Toochain pathを『./output/host/opt/ext-toolchain/』にする。

Toolchain prefixも$(ARCH)-linux-gnueabihf にする。

//今度はこのエラーになった
Unable to detect the toolchain sysroot, Buildroot cannot use this toolchain.

結局解決せず、『 make clean』して、menuconfigの設定をやり直して、BuildrootのリストにあるLInaro-ARM 2018.05とlinux-cip-5.10.145-cip17-rt7を選択して再実行したら1時間20分でビルド出来た。(メモリを8GBにしたから少し速くなったのかもしれない。) ssh設定やり直さないといけない。

トラブル 最新Linux6.0 (未解決) 5.15 rtは動作した

多分、BBBのデバイスツリーやドライバがLinux6に対応していないのだと思います。 解決策は、menuconfigでBuildrootがリストアップしている、CIP版の5.15 rtを選択するとすんなりビルド出来ました。

>>> uboot 2022.04 Installing to target
>>> uboot 2022.04 Installing to images directory
cp -dpf /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/uboot-2022.04/u-boot.img /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/images/
cp -dpf /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/uboot-2022.04/MLO /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/images/
>>> linux 6.0.9 Downloading
wget --passive-ftp -nd -t 3 -O '/home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/.linux-6.0.9.tar.xz.l7gvaH/output' 'https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.9.tar.xz' 
--2022-12-21 17:55:53--  https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.9.tar.xz
Resolving cdn.kernel.org (cdn.kernel.org)... 2a04:4e42:15::432, 151.101.89.176
Connecting to cdn.kernel.org (cdn.kernel.org)|2a04:4e42:15::432|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133911648 (128M) [application/x-xz]
Saving to: ‘/home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/.linux-6.0.9.tar.xz.l7gvaH/output’

/home/ichiri/BBB_Workspace/Downloads/buildroot-202 100%[===============================================================================================================>] 127.71M  5.22MB/s    in 29s     

2022-12-21 17:56:27 (4.47 MB/s) - ‘/home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/.linux-6.0.9.tar.xz.l7gvaH/output’ saved [133911648/133911648]

linux-6.0.9.tar.xz: OK (sha256: 6114a208e82739b4a1ab059ace35262be2a83be34cd1ae23cb8a09337db831c7)
>>> linux 6.0.9 Extracting
xzcat /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/dl/linux/linux-6.0.9.tar.xz | tar --strip-components=1 -C /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/linux-6.0.9   -xf -
>>> linux 6.0.9 Patching

Applying 0001-keep-jtag-clock-alive-for-debugger.patch using patch: 
can't find file to patch at input line 9
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|This patch keeps the debugSS clock alive, it clocks the JTAG macro and enables
|access to the SoC via JTAG after the kernel booted.
|
|Signed-off-by: Lothar Felten <lothar.felten@gmail.com>
|---
|diff -Naur linux-orig/arch/arm/mach-omap2/omap_hwmod_33xx_data.c linux-52c4aa7cdb93d61f8008f380135beaf7b8fa6593/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
|--- linux-orig/arch/arm/mach-omap2/omap_hwmod_33xx_data.c	2015-10-02 17:30:56.000000000 +0200
|+++ linux-52c4aa7cdb93d61f8008f380135beaf7b8fa6593/arch/arm/mach-omap2/omap_hwmod_33xx_data.c	2016-08-15 11:28:55.017617612 +0200
--------------------------
No file to patch.  Skipping patch.
1 out of 1 hunk ignored
make[1]: *** [package/pkg-generic.mk:251: /home/ichiri/BBB_Workspace/Downloads/buildroot-2022.11/output/build/linux-6.0.9/.stamp_patched] Error 1
make: *** [Makefile:84: _all] Error 2

トラブル Pre-installed linaro-7.5.0-2019.12 (未解決)

解決作は、menuconfigでBuildroot推奨のlinaro2018を選択したらすんなり出来たのですが、今後のデバッグで必要になるかもしれないので、実施履歴を残しておきます。

  • 【動かなかった時の設定】Toolchain/Toolchain originでPre-Installedを選択
  • 【動かなかった時の設定】Toolchain/Toolchain pathを設定  /home/ichiri/BBB_Workspace/Udemy-buiSetting up default-jre (2:1.11-72) …ld/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

画像に alt 属性が指定されていません。ファイル名: image-33.png

エラーで止まった。 どうも既にインストールしたLinaro-7.5.0-2019.12とBuildrootで選択できるLinaro-arm-2018.5の間で問題になっているので、まずBuildrootのmake menuconfigでToolchainをLinaro-arm-2018.5をやめて、Custom Toolchainに変更したが、やはり下のエラーでとまった。

画像に alt 属性が指定されていません。ファイル名: image-34.png

今度は、make menuconfigはLinaro-arm-2018.5に戻し、.stamp_configuredが存在しなかったので、touch .stamp_configured で作成して実行してみた。  すると上記のエラーは無くなったが、いろいろPermission deniedになっている。 最初の行でenp4s0のファイルにアクセスしようとしているので、uBuntu PCのルートディレクトリにアクセスしようとしてPermission deniedになっている可能性あり。 main.cの1207行目を見てみる。

画像に alt 属性が指定されていません。ファイル名: image-35.png

./ でmain.cを探してみたが、あまり対象になりそうなmain.cがなかったので、別を模索。

画像に alt 属性が指定されていません。ファイル名: image-37.png

エラーメッセージの上の方を探していくと、以下の様なNo such file or directoryのエラーがあった。 よく見るとディレクトリに/bin/binとなっていたので、manuconfigのToolchainでディレクトリ指定部から/binを削除して再度実行。

画像に alt 属性が指定されていません。ファイル名: image-36.png

今度は、以下のように前回と同じ様なエラーなので、また対象のファイルがないので、touch .stamp_target_installedを作成して実行。

画像に alt 属性が指定されていません。ファイル名: image-38.png

更に進んだけど、以下の様にエラーでとまったので、今度も同じ様に、touch /busybox-1.35.0/.stamp_build。

画像に alt 属性が指定されていません。ファイル名: image-39.png

更に進んだけど、またエラーで止まった。 今度はBuildroot からBusyBoxをビルドしようとしていて、BusyBoxをビルドしようをしている時、PATH=…./gcc-linaro-7.5.0-…./binとなっているので、.bashrcに設定したBusyBoxとLinux Kernelをビルドするための、gcc-linaroのパスから/binを削除して再度実行。

画像に alt 属性が指定されていません。ファイル名: image-40.png
画像に alt 属性が指定されていません。ファイル名: image-41.png

Toolchain/Toolchain relative binary pathにbinが設定されていた。(*Toolchain relative binary pathはToolchainー>Toolchainー>Custom toolchainを選択しないと表示されない。 TOOLCHAIN_EXTERNAL_REL_BIN_PATH

これが2つ上の図の後半くらいで/bin/binとなって問題を引き起こしていたので、今後Linux KernelやU-BOOTビルドで問題にならないように、Toolchain/Toolchain relative binary pathからbinを取っておく。 .bashrcはもとに戻して、gcc-linaro……/binに戻しておく。

Buildroot uEnv.txt

uEnv.txtを作ってくれていますが使わず、『その8』で作ったboot.scrをそのまま使っています。

uEnv.txtを見ると以下の様になっていますが、既にビルドしたU−BOOTの変数をprintenvで見てみると、loadimageとloadftd変数は登録されていないので、そもそもこのuEnv.txtでは動作しません。 また、kernel イメージはuImageを使います。 このuEnv.txtで為になるのはif文の使い方くらいですね。

bootpart=0:1
devtype=mmc
bootdir=
bootfile=zImage
bootpartition=mmcblk0p2
console=ttyS0,115200n8
loadaddr=0x82000000
fdtaddr=0x88000000
set_mmc1=if test $board_name = A33515BB; then setenv bootpartition mmcblk1p2; fi
set_bootargs=setenv bootargs console=${console} root=/dev/${bootpartition} rw rootfstype=ext4 rootwait
uenvcmd=run set_mmc1; run set_bootargs;run loadimage;run loadfdt;printenv bootargs;bootz ${loadaddr} - ${fdtaddr}

コメント