今度は、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インストール
- buildroot-2022.11.tar.gzを選んでダウンロード
- ファイルを~/BBB_Workspace/Downloads に移動して解凍
$ cd ~/BBB_Workspace/Downloads $ mv ~/Downloads/buildroot-2022.11.tar.gz . $ tar -zxvf buildroot-2022.11.tar.gz // 解凍
Buildroot menuconfig
- ~/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
- make menuconfigでmenuconfigにはる。
- 【注意】一旦menuconfigに入ったらターミナルの大きさ変更をしないこと。 変更したらmenuconfigがクラッシュすることがあります。 クラッシュしたら、設定値が勝手に書き換えられてしまうので、また最初のmake distcleanから始めてください。 例:TargetはARM Little Endianですが、x386等に変わっていたので、他の設定も変わっている可能性が高いです。
- Toolchainにはいる
- Toolchain Typeに入りで、『External toolchain』を選択して戻る。
- Toolchainの下のToolchainに入り『Linaro ARM 2018.05』を選択して戻る。(2018.05がない場合、表示されている、Linaro ARM 20xx.xx選択)
- Toolchain originに入り、『Toolchain to be downloaded and installed』を選択して戻る
- 【失敗情報】
- 『その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というファイルが作成されてビルドすることが出来ました。
- System configuration/System hostname で『ichiri』と入力(何でも構いません)
- 同じページでEnable root login with password にチェックを入れる
- Root passwordに 『root』と入力(何でも構いません)
- 同じページで、Run a getty (login prompt) after bootにチェックを入れる
- Run a getty (login prompt) after bootに入り、/TTY port => 『ttyS0』に変更(BBBの固定値)
- Run a getty (login prompt) after boot/Baudrate も『115200』に変更
- Linux Kernelのチェックを外す (既にビルドしたので、まずはここではKernelをビルドにさせない)
- Target packages/Network applications/OpenSSHを追加
- Buildloaders/U-BOOTのチェック外す(既にビルドしたので、ここではU-BOOTもビルドしない)
- 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が繋がりました。
# ssh ichiri@192.168.27.1
では、『exit』で抜けて、BBBのssh serverの設定をします。
OpenSSH server
『PermitRootLogin yes』を設定しないと、『Permission Denied』で接続出来ません。
# 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だけでも出来ることが分かりました。
$ ssh root@192.168.27.2
Buildroot でLinux とU-BOOTも同時にビルド
先程は、ルートFSだけ作りましたが、今回はKernelもU-BOOTも同時にビルドします。 make menuconfigから、
- Kernelに入る
- Linux kernelにチェック
- 最新のKernel Versionを選択。 私の場合は、『Latest CIP RT SLTS version (5.10.145-cip17-rt7)』にしました。
- Kernel configuration にはいり、『Using an in-tree defconfig file』にチェックを入れ戻る。
- Decfconfig nameに、_defconfigを除いた『omap2plus』をいれる。
- Kernel binary formatを、『uImage』にする。
- load addressに、Kernelビルド時にも使用した『0x80008000』を入れる。
- Build a Device Tree blob / 『Use a device tree present in the kernel』にチェックを入れる
- DTB is built by kernel itselfの下の行にあるIn-tree Device Tree Source file namesに入り『am335x-boneblack』以外は消す。
- Build Device Tree with overlay supportにチェックを入れるのは、dtbビルド時に-@をdtcに受け渡す。
- Bootloadersに入る
- U-BOOTを選択
- U-BOOT Version選択
- 既に表示されている『2022.04』を選択(だめな場合は、カスタムで『2022.11』を入れてみる)
- U-Boot configurationで、Using an in-tree board defconfig fileを選択
- U-Boot configurationで、『am335x_evm』と入れる。 エラーになった場合は、『am335x_boneblack』で再試行。
- U-Boot needs dtcにチエックを入れる (Device Tree Compiler)
- U-Boot binary formatで『u-boot.img』を選択
- U-Boot SPL/TPL binary image name(s)に『spl/u-boot-spl.bin』の代わりに『MLO』と入力する
- U-BOOTを選択
ビルドが終わったら、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
エラーで止まった。 どうも既にインストールしたLinaro-7.5.0-2019.12とBuildrootで選択できるLinaro-arm-2018.5の間で問題になっているので、まずBuildrootのmake menuconfigでToolchainをLinaro-arm-2018.5をやめて、Custom Toolchainに変更したが、やはり下のエラーでとまった。
今度は、make menuconfigはLinaro-arm-2018.5に戻し、.stamp_configuredが存在しなかったので、touch .stamp_configured で作成して実行してみた。 すると上記のエラーは無くなったが、いろいろPermission deniedになっている。 最初の行でenp4s0のファイルにアクセスしようとしているので、uBuntu PCのルートディレクトリにアクセスしようとしてPermission deniedになっている可能性あり。 main.cの1207行目を見てみる。
./ でmain.cを探してみたが、あまり対象になりそうなmain.cがなかったので、別を模索。
エラーメッセージの上の方を探していくと、以下の様なNo such file or directoryのエラーがあった。 よく見るとディレクトリに/bin/binとなっていたので、manuconfigのToolchainでディレクトリ指定部から/binを削除して再度実行。
今度は、以下のように前回と同じ様なエラーなので、また対象のファイルがないので、touch .stamp_target_installedを作成して実行。
更に進んだけど、以下の様にエラーでとまったので、今度も同じ様に、touch /busybox-1.35.0/.stamp_build。
更に進んだけど、またエラーで止まった。 今度はBuildroot からBusyBoxをビルドしようとしていて、BusyBoxをビルドしようをしている時、PATH=…./gcc-linaro-7.5.0-…./binとなっているので、.bashrcに設定したBusyBoxとLinux Kernelをビルドするための、gcc-linaroのパスから/binを削除して再度実行。
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}
コメント