イントロダクション
別のスレでも話題にしていますが、buildrootってなんでしょう。
これは僕のような人間に必要な組込みlinuxを簡単に作るための
仕組みです。yocto projectっていう似たようなものもあります。
聞いたことがある方もいらっしゃると思います。
私が、buildrootに興味を持ったのはlightmpdの作者のdigififan
さんの一言がきっかけです。その後、buildrootについては僕に
直接質問してね、とお声がけくださったのもdigififanさんです。
しかし、お忙しい方ですし、できる限りお手を煩わすわけに
はいきません。だから、自分で本家のマニュアルと格闘しネット
で情報を集め、どうしてもわからないところだけdigififanさんに
お伺いしました。今日の私があるのもdigififanさんのおかげ
です。
前置きが長くなりましたが、これからbbb(bbg)用の
mpdを組み込んだ、lightmpdのような完全にメモリ上で動く
システムをいっしょに作っていきましょう。digififanさんが
せっかくbuildroot用のコンフィグを公開するよ、といってくだ
さっているのに、buildrootってなんじゃ、それ?みたいでは
面白くありません。
inthedark(サル)のようなやつでも簡単につくることができる
ようにbuildrootの開発陣が日夜バージョンアップを続けてくだ
さってます。ありがたく使わせて頂きましょう。
buildrootはlinuxの環境ならどれでも動きます。ただ、ホスト
であるlinuxの機能も使うことがありますので、できるだけ
メジャーなubuntu,arch,debianなどをホストにしてそこにbuild
rootを落としてきてください。私のように仮想環境(vmware)
などの上にlinux環境を整えられてもかまいません。できるだけ
マシンパワーのあるやつの方がビルドが速く済みますので
やる気が持続しやすくなります。
buildrootは安定版とgit版があります。
安定版は今はbuildroot-2016.11.1.tar.gzです。3か月に一度
安定版は更新されます。
私はgit版を使ってます。なぜって?それは私が新しいもの好き
だからです。buildrootの開発陣が毎日のように改良を重ねて
くれています。それが反映されているのがgit版です。mpdも
本家でバージョンアップされれば、buildrootのgit版は、2,3
日中にこのmpdのバージョンアップ版を落としてビルドしてくれ
ます。だから、私はbuildを始める前に必ず、git pullします。
これで私のbuildrootの環境はいつでも最新になります。ただ、
バグもあるかもしれませんのでビルドが途中で止まったりする
こともあるかもしれませんが私のように怖いもの知らずには
ピッタリです。
buildrootを落として来たら適当なディレクトリ(皆さんの
ホームディレクトリでよい。ユーザーもルートではなく、
一般のユーザーでログインした環境で作れます。)に展開
してください。buildrootなんちゃらというディレクトリが
できているはずです。これが皆さんがこれから作業する場所になります。
今回はここまで。
どこまで続くかわかりませんが(途中でねをあげるかもしれま
せんが)お付き合いいただける方は、お付き合いを。
こんばんは
何がなんだか分からないまま、buildrootの環境だけは作っていました。(HDDが壊れたのを機会にメインをUbuntuに切り替えています。)
そろそろチュートリアルでも見ながら少しずついじってみようを思っていましたので、非常に楽しみにしています。
moctさん
お読みいただき恐縮です。柄にもないことやろうとしておりますがなんとかやれるところまでやってみようと思います。
いつか皆さんから教えていただける日がくるのを楽しみにして
おります。
inthedark
4つの呪文
buildroot、自分のホームディレクトリに展開できましたでしょうか。
えっ、git版どうして落としたらいいかわからないって?buildrootのダウンロートサイトにちゃんと書いてありますからね。gitが何かわからなくてもそこに書いてある呪文をとなえれば最新のgit版buildrootが落とせますんで。
これ以降はgit版buildrootで、/home/inthedark/buildrootにソースが展開されているものとして話を進めます。
buildrootを操作するにあたり、4つの呪文をとりあえず覚えてください。ただし、これを唱える場所を間違えますと、効果がありません。違う場所で唱えるとどうなるかって?それは
make するルールがありません。
と怒られるだけです。その唱える場所とは私のなら
/home/inthedark/buildrootです。
$cd ~/buildroot
ここから必ず呪文を唱えてください。基本はここに立ち返ることを覚えておいてください。
それでは4つの呪文を順次簡単に解説します。
$make menuconfig
この呪文はbuildrootの核です。カーネルのバージョンは?クロスコンパイラは何を使う?
どういうアーキテクチャのものを作りたい?ブートローダはどうする?などなど様々な設定をメニュー形式で行えます。この呪文を唱えてメニューが表示できませんというエラーが出た場合、エラーメッセージにあるプログラムがホストシステムにありませんので、ubuntuならapt-getして素直にインストールしてください。それでメニューが立ち上がるはずです。
あとこの呪文を唱えて一通り設定が終わりexitしますとbuildrootディレクトリに.configファイルができます。ドットファイルですから通常は見えません。どうしたら見えるかって?
例えばファイルマネージャーで見えるようにするにはbuildrootディレクトリを開き、ctrl+H するだけです。この.configファイルがdigififanさんが公開されるであろうファイルです。
公開して頂いたファイルをbuildrootディレクトリにコピーして置き換えて再度この呪文を唱えてやれば、digififanさんのbuildrootでの設定がみられるというわけです。
$ make busybox-menuconfig
この呪文は今回私がみなさんと作ろうとしているルートファイルシステムの根幹をなすものです。busyboxって何?とか言わないでください。皆さんは、インターネットという最強の武器をすでに手にしておられます。興味のある方は自分で調べましょう。簡単にいうと’10徳ナイフ’みたいなものです。ここでルートファイルシステムで使いたい基本的なコマンドなどを設定します。pgrepなんかも必要であればここで組込みの指示をします。
$ make linux-menuconfig
これは毎度おなじみ、カーネルのビルドをしたことがある方はすでに見飽きていると思いますがこの呪文を唱えますとあのメニューが立ち上がります。ここでカーネルオプションをいじり倒します。
$ make distclean
これは、ビルドを改めてやり直したいなど、きれいに最初からスタートしたい場合に唱える呪文です。これをすればbuildrootは最初に展開した状態に戻ります。
今回はここまで。
次回からいよいよbbb用の設定を具体的にサルはどうしているか?を見ていきます。
make menuconfig サルはこうやっている その1
これからいよいよbuildrootの設定をしていきましょう。
もちろん、サルの設定は一つの例にすぎません。皆さんのbuildrootに対する敷居を低くするのを目的でやっていることですから、この設定が最良などとはいうつもりはありませんのでその辺は誤解のないようにお願いします。
さて、いつもの呪文を唱えましょう。
$ cd ~/buildroot
$ make menuconfig
さあ無事にメニューが立ち上がったでしょうか?ここから、bbb(g)用の設定をサルが
どうやっているか見ていきましょう。(ほとんどはスペースキーで選択できます。
それが効かないときはエンターキーで)
Target Options --> Target Architecture --> (X) ARM (little endian)
Target Architecture Variant --> (X) coretex-A8
Floating point strategy --> (X) NEON
それ以外の項目はbuildrootが最適なものを選んでくれていますので変更しておりません。
これ以降もサルが設定をした箇所のみ見ていきます。
Toolchain --> (X) External toolchain
これを選んで元に戻ると、Toolchain(Linaro ARM 2016.11)というのが表示されていると
思います。これを使ってビルドするということです。
System configuration --> (BBG) System hostname
(Welcome to BBGmpd) System banner
Init system --> (X) BusyBox
これをルートファイルシステムで使うということです。systemVやsystemdも選ぶ
ことができます。機会があったら挑戦してみてください。
[*] Run a getty (login prompt) after boot --> (/dev/ttyO0) TTY port
Baudrate-->(X)115200
シリアルコンソールから起動を確認する
場合設定する
[*] Install timezone info
(Asia/Tokyo) default local time(NEW)
(/home/inthedark/buildroot/board/am335x/rootfs-overlay)Root filesystem overlay
directories
これは何なのかはおいおい解説します。boardディレクトリはすでにありますが、am335x
以降のディレクトリは自分でmkdirします。
Kernel --> [*] Linux Kernel
Kernel version --> ここに入ると様々な選択項目が出てきますね。
() Latest version(4.9.4)
これを選ぶとkernel.orgから4.9.4のソースをbuildrootが
とってきてビルドしてくれます。
() Custom version
何らかの理由で上記以外のものがいいならここを選択して
()Kernel version(NEW)で4.4.39とか入力しておくとこの
バージョンをとってきてビルドしてくれます。
()Custom tarball
これを選んで()URL of custom kernel tarball(NEW)で
http://repo.ieero.com/botic/pool/main/l/linux-upstream/linux-upstream_4.8.13-botic7-rc3.orig.tar.gz" target="_blank">http://repo.ieero.com/botic/pool/main/l/linux-upstream/linux-upstream_4.8.13-botic7-rc3.orig.tar.gz
とか入力しておくと、ここのサイトからtarballを取って
来てくれます。
()Custom Git repository
これを選んで()URL of custom repository(NEW)に
https://github.com/raspberrypi/linux.git" target="_blank">https://github.com/raspberrypi/linux.gitと入力し
()Custom repository vesion(NEW) で rpi-4.9.yと入力すると
指定されたカーネルソースを取って来てくれます。
これは皆さんがお好きに選んでください。
(/home/inthedark/BBG)Custom kernel patches(NEW)
これは取ってきたカーネルのソースにあてたいバッチを置いてあるディレクトリを
指定します。サルはBBGディレクトリにrtパッチやxmosのパッチなどを入れております。
こうしておくとbuildrootはこのディレクトリにあるpatchファイルに従ってパッチを自動
であててビルドしてくれます。
(omap2plus)Defconfig name
これは一応ビルドが通るdefconfigを指定しておきます。
[*] Build a Device Tree Blob (DTB)
(am335x-bonegreen am335x-boneblack-botic) Device Tree Source file names (NEW)
これを入力しておくとdtbファイルをビルドしてくれます。
今回はここまで。
やはり疲れますなあ。やらなきゃよかったかな。
> やはり疲れますなあ。やらなきゃよかったかな。
愛読しております。頑張ってください。
のんびりやってください。
make menuconfig サルはこうやっている その2
前回までの話、どうだったでしょうか?ついてこれてますかね。もうギブアップ?
構わず続きをいってみましょう。
$ cd ~/buildroot
$ make menuconfig
前回もいいましたが私が選択した例のみを記述していきます。
buildrootがはじめから[*]を入れてくれているものはそのままです。(気にいらなければ
チェックを外せばいいだけです)
Target package
ここから皆さんが今から作るものに組み込みたいものを選んでいきます。
Audio and video applications --> [*]alsa-utils --> [*] aplay/arecord(NEW)
--> [*]mpd ---> [*] audiofile (NEW)
[*] dsd(NEW)
[*] flac
[*] curl
--> [*] upmpdcli(upnpレンダラーにしたいとき)
もし、nfsを使いたい場合は
Filesystem and flash utilities --> [*] nfs-utils
この辺は説明するときりがないので止めときます。
System tools --> [*] htop
Filesystem images
[*] cpio the root filesystem (for use as an initial RAM filesystem)
Compression method --> (X) gzip
サルが作っていいるものはcpio形式でルートファイルシステムがramに読み込まれ
展開されるものを使っています。lightmpdはromfsです。
[*] tar the root filesystem --->チェックを外す。これはsdカードなどにシステムを
作る場合のものです。サルはメモリ上ですべてが
動くシステムを作るわけですからここは必要なし。
Bootloaders --> [*] U-Boot
Build system --> (X) Kconfig
(am335x_boneblack)Board defconfig
U-Boot binary format --> [*] u-boot.bin --> チェックを外す
[*] u-boot.img
[*] Install U-Boot SPL binary image(NEW)
(MLO)U-Boot SPL binary image name
元から入力されているspl/u-boot-spl.binをMLOに修正
以上でmake menuconfigの設定は終了です。どうです?簡単でしょう?
これを何もわからないところからやれ!といわれてできる人はbuildrootなど使わなくても
いい人ではないですかね。
今回はここまで。
次回はmake busybox-menuconfigです。
inthedarkさん。
buildrootのことは全然知らなかったもので、3ヶ月ごとに安定板がでるというのも驚きでした。そっちを使っていても十分新しいわけですね(小さいシステムだから可能ということでしょうか)。それをmpd専用に使うのは確かに合理的に感じました。話の流れを中断するのもあれなので、もしも良ければ後ほど、質問などさせていただけると有難いです。
make busybox-menuconfig サルはこうやっている
どんどん行きましょう。
それでは、最初に呪文詠唱を忘れずに。
$ cd ~/buildroot
$ make busybox-menuconfig
Networking Utilties --> [*] Enable IPv6 support (チェックを外す)
[*] ntpd
[*] Make ntpd usable as a NTP server(チェックを外す)
[*] telnet (チェックを外す)
[ ] telnetd(もし作成したシステムにtelnetでログインしたければ
チェック)
[*] tftp (チェックを外す)
[*] wget (チェックを外す)
[*] udhcp client(udhcpc) (チェックを外す)
Process Utilities --> [*] pgrep
他にも自分がいらないな、と思ったものがあればどんどんチェックを外して試してみて
ください。いい勉強になると思います。
今回はここまで。
次回は、make linux-menuconfigです。(手抜きをします。)
yoさん
自分のペースでやってますので。どれくらい需要があるのか
わかりませんが、自分もネットの情報には日ごろお世話に
なってますので、ご恩返しのつもりでやってます。
気長にお付き合いください。
inthedark
ca2さん
はじめまして。どれくらい役に立てるかわかりませんが
よければお付き合いください。
安定版でもgit版でもどちらでもいいと思います。
digififanさんは安定版を使っておられると思います。(想像
ですが)。組込み用のシステムで自分の目的に特化したもの
をつくる、ということにはbuildrootは威力を発揮します。
私がここで書いていることなんていうのはbuildrootのほんの
一端でしかありません。奥が深いソフトだと思います。
楽しいですから機会がありましたら実際に使って動かして
みてください。ca2さんはプログラムもなさるようですし、
私よりもっと面白いシステムが自分でお作りになれると思い
ます。
inthedark
make linux-menuconfig サルはこうやっている
さて今回は表題のことを書く前に知っておいていただきたいことがありますので、まずは
buildrootディレクトリをファイルマネージャーで眺めてみましょう。
buildrootを展開したときには以下のような構成になっていると思いますが、どうですか。
arch board boot configs docs fs linux package support system toolchain
そして一度でもmake busybox-menuconfig や make linux- menuconfig を唱えますと
dl output というディレクトリが増えているはずです。
dlはbuildrootがネットからとってきた(もちろん、menuconfigで指示されたものですよ)ソース
を集めるために作られます。実際に見てみてください。busybox-1.26.0.tar.gzなんてファイルが
存在してますよね。
そして、outputはサルがこれから作るシステムのイメージなどの出力がされる場所です。
このoutputの中を見てみますと
build host images staging target
といったディレクトリができていると思います。
buildはdlでとってきたソースを各パッケージごとに展開しビルドをする場所です。
もちろん実行するのはbuildrootですが。make busybox-menuconfigを実行し設定を完了
すると、busybox-1.26.0(安定版とは違うかも)というディレクトリができているはず
ですのでその中身を見ていただければお分かりになると思います。
これから解説します、make linux-menuconfigを実行しますと、linux-4.4.39とか自分が
指定したバージョンのカーネルソースの展開されたディレクトリができているでしょ。
imagesはサルがbuildrootに作るように指示した、zImage MLO uboot.img am335x-bonegreen
rootfs.cpio.gzなどが最終的に出力される場所です。これをsdカードにコピーすればいいわけ
です。
targetは実際に作ったルートファイルシステムが展開されて中身を見れるようになっています。
実際どんなふうにできたかを確認できるわけです。
それではmake linux-menuconfigの解説ですが、カーネルオプションの中身については今回の
趣旨から外れますし、私は専門家ではありませんのでいちいち解説などできません。
そこで今回はどこかのシステムから拝借したconfig.gzを使ってやる超手抜き方法でやって
みたいと思います。
それではlightmpd bbb版からとってきたconfig.gzを使わせて頂きましょう。config.gzの
取り出し方がわからないって?そういう時は、ググってくださいね。config.gzを例えば
/home/inthedark/BBGにおいているものと仮定します。
$ cd ~/buildroot
$ make linux-menuconfig(この時点で、/home/inthedark/BBGにあるカーネルパッチが反映
される。)
exitでmenuconfigをいったん終了させます。
$ zcat ../BBG/config.gz > output/build/linux-4.4.39/.config
$ make linux-menuconfig
こうすることでlightmpdのコンフィグが反映されたメニューが表示されます。
そして設定を自分色に染めていただき、exitしてください。
その他にやるべきことがなければ、(なければですよ)
$ ccache make -j8 2>&1 | tee build.log
とやるとbuild.logにログを残しながらビルドが始まります。buildrootがサルの指示したカーネル
、mpd、gcc、などソースを取ってきてビルドしてくれます。ccacheなんかもビルドが
速くなるおまじないですから自分の環境にあわせて試してみてください。
ビルドが終わると、上記で説明したoutputディレクトリにファイルができているはずです。
上記でできたrootfs.cpio.gzがルートファイルシステムです。これを、u-bootが読み込める
形式 uInitrdに変換しないといけません。これがyoさんにもお話したおまじないです。
$ cd ~/buildroot
$ output/build/uboot-2017.01/tools/mkimage -A arm -O linux -T ramdisk -C gzip -d
output/images/rootfs.cpio.gz output/images/uInitrd
これまでお話してきたことがこのシステムを作る一連の大きな流れとなります。
大体全体像をつかんでいただけましたでしょうか?最初はだれでももたつきますが、反復
されれば自然と作業スピードはあがります。
実際、私は今まで説明してきたことをほとんど自分で調べ上げました。だからみなさんより
たくさんの時間がかかっております。このスレを読まれた皆さんは私などよりずっと最短
距離を走ることができたはずです。さあ、buildrtootの入り口までは案内しました。
あとは、入り口を通り、新たな世界を体験しに行くか、それとも面倒くさい、やめるわと
なるか、それは皆さん次第です。
もちろん、今までの説明だけで動くシステムが作れるか?といえば、世の中そんなに甘く
はありません。自分にあった環境をbuildrootにつくってもらうためにしなければならない
ことは他にもあります。あと、仕組みの理解も。
今回はここまで。
次回以降、ここからが面倒くさいなあ、と思いながら、buildroot tipsのようなものを
紹介していきたいと思います。ホント、疲れる。
サルのbuildroot tips その1
前回までの内容で以下のような方々は、自分の力でbuildrootを操れるようになって
いくはずです。
(1)linuxにお詳しい方
(2)プログラムが組める方
(3)本家マニュアル(英語)をすらすら読める方
そういう方々は サルのbuildroot tipsなんか読んでないで実際にbuildrootを動かして
みてください。
以前、こういう実験が行われたそうです。アフリカの子供たちと日本の高齢者にipadを
渡しました。なんの説明もしません。ただ渡しただけです。どうなったと思います?
アフリカの子供たちは30分もしないうちに電源を入れ、ipadを触り始めたそうです。
一方、日本の高齢者は3時間たっても電源すら入れられなかったといいます。
サルからできるアドバイスを一つ。buildrootに対するときはアフリカの子供たちのよう
になってください。理屈はいいんです、知識がなくてもいいんです。とにかくいじり
倒します。こうやったら壊れるんじゃないか?、こんなの理屈にあわねーからできないね!
そうじゃありません。サルは恐れを知りません。ぶつくさ言ってないで呪文をとなえます。
buildrootの中身をみます。c言語、そんなの知らねーよ。でも、カーネルのソースを
みます。スクリプトファイルを見ます。中身をこじ開け、とにかく見るんです。
エラーメッセージもちゃんと見ます。何を自分に忠告してくれているのかに注意を払い
ます。これがbuildroot攻略の早道です。
他人がこうしてくれない、こんな機能をもったものを作ってくれない。サルは文句をいう
前に自分でつくります。そのためならなんでもやります。lightmpd の boticizedがその
証明です。自分でつくってみてはじめて、digififanさん、donuts.shop73さん、yoさんの
苦労がちょっとはわかります。こういった方々の偉大さがわかります。(骨身にしみます)
感謝の念はわいてきますが、文句などいう筋合いはありません。本当に私たちは恵まれた
世界の住人なんです。しかも、皆さんはbuildrootなんて強力な武器を持つことができます
。しかもタダで。自分でやってみましょうよ。
それでは、サルからbuildroot tipsを一つ。ただし、これ以降の話は気が向いたらやりますが
途中でやめるかもしれません。あしからず。
4つの呪文、覚えてますか?その中に make distcleanというのがありましたよね。
あれを唱えるとbuildrootは落として来て展開したときの状態に戻るというお話をしました。
そうすると、以前お話した、output dlといったディレクトリは全部消去されます。
dlって何が集まってるディレクトリでしたか?buildrootがネットからとってきたソース
が入れられる場所です。もったいないと思いませんか。buildrootはdlが消えてしまって
いたら、またソースをネットからダウンロードします。これはビルド時間の遅延を招き
ます。だからmake distcleanをする前にdlをbuildrootディレクトリの外へ退避します。
例えば、/home/inthedark/dlといった場所に。それから make distclean します。
そのあと
$ cd ~/buildroot
$ ln -s ../dl
こうしてシンボリックリンクを作っておきます。これでbuildrootは、dlにあるものは
もうダウンロードをしないで、dlにあるソースを展開、ビルドすることから始めて
くれます。サルは、git版を使ってますが、git pull でbuildrootを最新にしたあと
自分が作るシステムに必要なパッケージソースがバージョンアップされていれば、
buildrootはdlにあるものと比較してその新しいパッケージソースだけダウンロードして
くれます。
賢いでしょ、buildroot。
今回は、ここまで。
いつまでもあると思うな、親と金とサルのbuildroot tips
inthedarkさん。いちおうccashe make..までしてみて、makeが通るところまで確認しました。(設定はinthedarkさんが書いた部分をなぞっただけなので、機能追加などはほぼしてない状態です。)
設定項目が多いので、まっさらな状態から始めるとすると相当大変ですね。BBB(G)用にまとめてもらって本当に有難いです。menuconfigで一度設定した
buildroot/.config
buildroot/output/build/busybox-*/.config
buildroot/output/build/linux-*/.config
あたりは、ある程度使いまわせる感じでしょうか。パッケージなどは「/」を押すと検索できるんですね(sshfsなども有りました)。
ca2さん
お付き合い頂き誠に恐縮です。
.configはおっしゃる通りです。保存しておいて指定箇所に
コピーすれば最初から設定する手間が省けます。
/もおっしゃるとおりです。カーネルのmenuconfigと同じです。
sshfsなどに限らずbuildrootがサポートしてくれている
パッケージは結構あります。そういうものをビルドして
自分のシステムに組み込めるようになったらなお楽しい
です。
これからも時間があれば色々いじって遊んでみてください。
面白い発見があればどうか このサルめに教えてください。
inthedark
inthedark さん
本日、昼頃からWindows10への仮想PCソフトのインストールから作業を始め、ubuntu16.04LTS上にgit版buildrootを展開し、inthedarkさんのチュートリアルをなぞりながらmake linux-menuconfig後のビルドまでをやってみました。
エラーが出てはその指示に従いパッケージをインストールしたり、作業を進めるうえで不明な点はググることで簡単に対処方法が見つかりました。
まだ作業手順をなぞっただけなので、メニュー設定の内容などはこれから勉強していきたいと思います。(ここからが本番)
Linuxはたいして詳しくない私にも自分でビルドしてみるというきっかけを与えてくださり大変感謝しております。
auのCMではありませんが「やってみよう」の精神は大事ですね。
サルのbuildroot tips その2
さて今回いよいよbuildrootの本丸ともいえるお話をします。
それが rootfs-overlay と呼ばれる機能です。
順を追って説明しましょう。
皆さんの中にはもうすでに、ccache make -j8とかやって最終的にエラーもなくビルド
された方がいらっしゃることと思います。そういう方がいらっしゃったら、
~/buildroot/output/target
このディレクトリを見てみてください。ここにあるディレクトリ群がサルが作っている
メモリ上に展開されるルートファイルシステムの中身です。
その中にある、/etc/init.dをファイルマネージャーで見てみてください。
S01loggingとか、SXXというスクリプトファイルが並んでますよね。ピンと来られる方も
いらっしゃると思いますが、システムの起動時にS01から始まって順番にこれらが実行
されていくわけです。
ここにあるものはbuildrootが親切にもすでに作ってくれています。しかし
buildrootは起動時に実行する必要があるすべてのパッケージについてSXXのスクリプト
ファイルを作ってくれるわけではないのです。そういうときどうするか?
そのときは自分で作るしかないわけです。
さあどうしましょう?自分で作ったはいいがこの作ったSXXのスクリプト
ファイル、ccacheのおまじないを唱えてビルドしている間に自動的に組み込んでくれない
かなあって思いませんか?その望みをかなえてくれるのが、rootfs-overlayという
機能です。
以前make-menuconfigについてお話しているなかで
(/home/inthedark/buildroot/board/am335x/rootfs-overlay)Root filesystem overlay
directories
という部分について触れましたね。覚えてますか?上のかっこ書きにあるディレクトリ
は別にこうしなければならないわけではありません。本家のマニュアルに設定例みたい
なものがあってそこの真似をしているだけです。
例えば、/home/inthedark/buildroot/board/am335x/rootfs-overlayというディレクトリ
を作りここにtargetの中にあるルートファイルシステムと同じディレクトリ構成をつく
っておくんです。
rootfs-overlay/etc/init.dという具合に。そして、init.dの中に優先度を設定したい
SXXchrtなんてスクリプトを作ったとしましょう。そのスクリプトをrootfs-overlay/
etc/init.dの中にコピーしておくんです。このようにしてから、ccacheとおまじないを
唱えてやると、buildrootはサルのルートファイルシステムの/etc/init.dディレクトリ
にSXXchrtというスクリプトファイルを作りこんでくれるのです。
この機能は覚えておくと非常に便利です。様々な応用ができますので。こういうディレクトリ
をこのディレクトリの下に作って欲しいとか、buildrootが作ってくれたSXXスクリプト
ファイルが気に入らないから自分で作り直したものを使いたいとかいうときにね。
今回はここまで。
さあ、次があるかな?
kensさん
はじめまして。お付き合い頂き恐縮です。
自分が勉強し始めたときはほんと不安でした。
しかし、自分で作ったmpdを組み込んだ完全にメモリ上で
動くシステムから音が出てきたときは感動したものです。
ぜひ、みなさんの中から一人でも二人でもそういう感動を
味わえる人が出てくれば、こんなにうれしいことはあり
ません。
いつまで喋れるかわかりませんが、お付き合い頂ければ
幸いです。
inthedark
サルのbuildroot tips その3
さあ、もうそろそろ自分でシステムを作っていく喜びに目覚めた方がチラホラ
いらっしゃるんではないでしょうか? えっ、もっと教えろ?
まあ、そういう甘えん坊みたいな方もいらっしゃるでしょうから、tipsを1つ。
サルの作っている完全にメモリで動くシステムは、cpio形式のルートファイルシステム
だというお話をチラっとですがしたと思います。
調べていただければわかることなんですが、なんでしょうね、cpio形式って。
lightmpdはromfsという形式を採用していらっしゃいます。これは私も詳しいことを
説明できる専門家ではないんですけど、romfsはメモリ上にカーネルが解釈できるファイル
システムをあらかじめ作成し、そこにルートファイルシステム(romfs)を展開する
というものです。
しかし、サルが使っているcpio形式でつくられたルートファイルシステムは、メモリに
カーネルが解釈できるファイルシステムを作る必要がなく、そのままメモリに読み込まれ
展開できるというものなんだそうです。
サルが作っているルートファイルシステムはbuildrootで作成すると
~/buildroot/output/images
に出力されます。rootfs.cpio.gzという名前のファイルです。もちろん、ビルドが
無事通っていたらの話ですが。
buildrootは親切ですから、このrootfs.cpio.gzというファイルの中身は一体どうなって
いるのかは、
~/buildroot/output/target
を見てもらえれば確認できるんですけど、このできてしまったcpioの中身を修正したい
と思ったときどうしたらいいですかね。例えば、buildrootがせっかく
/etc/init.d/SXX~みないなスクリプトファイルを作ってくれたけどこれいらないや!
っていうことで消去したいなあ、なんてことがあればどうしましょう?
rootfs.cpio.gzを展開して修正を加え、またrootfs.cpio.gzに戻す
これをしなければなりません。
ということで皆さんの調べる手間を省いてしんぜましょう。
以下の呪文を覚えてください。
$ cd ~/buildroot/output
$ mkdir rootfs
$ cd rootfs
$ fakeroot
# zcat ../images/rootfs.cpio.gz | cpio -id
これで、rootfsディレクトリにbuildrootで作ったルートファイルシステムが展開
されます。そしたら、中身を修正し放題です。修正し終わったあと元に戻します。
# find . | cpio --quiet -o -H newc | gzip -9 > ../rootfs.cpio.gz
# exit
$
これで、修正後のrootfs.cpio.gzがoutputディレクトリにできますね。
今回はここまで。
さあ、次は何をしゃべろうかな。
サルのbuildroot tips その4
サルが作っている完全メモリで動くシステムは、mpdで音を鳴らすことを目的
としてます。lightmpdと同じです。make-menuconfigのTarget packagesで指定
してやれば、mpdはビルドしてくれます。
それならいっそ、mpdにパッチをあててビルドして欲しいですよね。
rtパッチとか、dsdパッチとか。こういうときbuildrootではどうしたらいいんですかね。
あとrt optionを付け加えるときどうしたらいいんですかね。
皆さんが一番知りたいであろうtipsについてお話しましょう。
ファイルマネージャーで~/buildroot/packageディレクトリの中を見てみてください。
ここにはbuildrootがサポートしているパッケージの簡単に言えばビルドをするための
手順書が書かれたものが集まっています。この中にmpdというディレクトリがあります
のでその中身をみてください。
0001-なんて番号が振られたpatchファイルがあるでしょ。そうです、ピンと来られる方も
多い思いますが、ここにrtパッチやdsdパッチを置いておくんです。そうするとbuildrootは
mpdをビルドするとき、ここに置かれているパッチをあててビルドしてくれます。
0001-と番号をふってあるのはこの順番にパッチをあててください、とbuildrootにお願い
するためのものです。パッチのあてる順番を間違えるとエラーになる場合などに有効です
よね。
そしてmpd.mkというファイルがあるでしょ。それをエディタで開いてみてください。
最初の方に、
MPD_VERSION_MAJOR = 0.20
MPD_VERSION = $(MPD_VERSION_MAJOR).2
MPD_SOURCE = mpd-$(MPD_VERSION).tar.xz
MPD_SITE = http://www.musicpd.org/download/mpd/" target="_blank">http://www.musicpd.org/download/mpd/$(MPD_VERSION_MAJOR)
という部分があるでしょ。
もうくどくど説明しなくてもわかりますよね。
buildrootにhttp://www.musicpd.org/download/mpd/" target="_blank">http://www.musicpd.org/download/mpd/$(MPD VERSION MAJOR)から
mpd-0.20.2をとってきてくださいと指示しているわけです。
エディタで下の方にスクロールしていってください。
mpdをビルドしたことがある方はみたことがある文字がたくさん並んでるでしょ。
--enable-alsaとかね。そう、ここでrt optionを指定するんです。
例えばサルは、mpd.mkファイルの下の方に、
endef
MPD_CONF_OPTS += --enable-rtopt <---- (サルが追加したrtoption)
MPD_POST_INSTALL_TARGET_HOOKS += MPD_INSTALL_EXTRA_FILES
って加えてます。
あと、追加で大判ぶるまいしておきましょう。
mpd-0.19の方がいい、これとってきてよ!ってbulldrootにお願いするときはどうしたら
いいですか?
MPD_VERSION_MAJOR = 0.19
MPD_VERSION = $(MPD_VERSION_MAJOR).21
これで、mpd-0.19.21.tar.xzを取ってきてくれます。
ただし、これをやったときは注意が必要です。このまま、ccacheとやると途中でエラー
となります。mpd-0.19.21.tar.xzのhash値をmpdディレクトリにあるmpd.hashファイルに
登録しておいてやらないといけません。hash値を求める方法は?
$ sha256sum ~/dl/mpd-0.19.21.tar.xz
これで求められた数値をmpd.hashに登録しておいてあげてください。
# Locally calculated after checking pgp signature
sha256 552a87d71c2981baeddf28c1856a7e071ea0236dd38bc75ec25d58529605ff77 mpd-0.20.2.tar.xz
sha256 8305b8bc026f4b6bde28b8dd09bfdddbe5590acf36358eed4d083a396e301730 mpd-0.19.21.tar.xz
こうすることでビルドが通るはずです。
今回はここまで。
まあ、これで大方システムを作るのに必要なことは伝授できたかな。
サルのbuildroot tips 最終回
最後に皆さんにプレゼントしたいと思います。
それが、uEnv.txtです。
私が、buildrootでシステムを作り始めたころ、お手本といえば(今でもですが)
lightmpdでした。lightmpd BBB版についているuEnv.txtが僕の教材です。
自分でも色々調べましたが、digififanさんは色々解説してくださいました。
しかし、これはあくまでも、romfsをロードするためのものであって私の作って
いるinitramfs(cpio)をロードするためのものではありません。確かに、このuEnv.txt
に修正を加えなくても私のシステムはロードできました。
ただ、起動メッセージをシリアルコンソールで眺めていても
unpack initramfs
みたいな表示がありません。
どうしたものかと思いました。こんなことdigififanさんにお聞きするなんてずうずうしい
ことはできません。(少なくともサルには)
そこで自分で考えました。その中身がこれです。
#
verify=no
#
#kernel_file=uImage
kernel_file=/boot/zImage
initrd_file=/boot/uInitrd
console=ttyO0,115200n8
mmcdev=0
mmcpart=1
loadkernel=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${kernel_file}
loadinitrd=load mmc ${mmcdev}:${mmcpart} ${rdaddr} ${initrd_file}; setenv initrd_size ${filesize}
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} /boot/dtbs/${fdtfile}
boot_ftd=run loadkernel; run loadinitrd; run loadfdt
ramrootfstype=ext2
#ramroot=/dev/ram0 rw ramdisk_size=65536
#ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr} ${rdaddr} ${fdtaddr}
#ramboot=echo Booting from ramdisk ...; run ramargs; bootz ${loadaddr} ${rdaddr} ${fdtaddr}
uenvcmd=run boot_ftd; run ramboot
lightmpd BBB版のものでいらないと思ったものをコメントアウトしました。
これで起動すると、unpack initramfsのような表示が確認できるようになりました。
このときはうれしかったなあ。
さあ、いかがだったでしょうか。自分で作る意欲が湧いてきたでしょうか?
サルはrpiも自分でシステムを作っております。(rpiB rpiB+ rpi2B3台ともね。)
私は、lightmpdも、volmioも、runeも、picoreplayerも それぞれ特徴があって好きです。
しかもタダで使わせてもらえるわけですから、こんな贅沢な話はありません。
これは音が悪いだのと、批評だけしているうちは楽なもんです。だから、サルは自分で
作ってみようと思いました。buildrootはサルのような人間にもシステムを作れる可能性
を与えてくれました。buildrootの開発陣には感謝の念を禁じえません。
この掲示板で言いたい放題いわせていただける機会を与えてくださったyoさんに感謝
いたします。ありがとうございました。
最後に lightmpd,volimioなど、日々開発を続けておられる方々に敬意を表してしめくくり
たいと思います。
inthedark(サル)
inthedark さん
連載ありがとうございました。大変な力作ですね。buildroot の何たるかはよく分かりました。
これは自分専用のコンパクトなmpdシステムを作るのに最適な開発環境ですね。ライブラリを管理する機能はないが、mpdを指定して必要なライブラリを自動的に組み込むことができるようなので、
Target packages --->
Audio and video applications --->
mpdを動かすシステムを構築するいう意味ではライブリ管理してもらえることになりそうです。
linuxでmpdを使った音楽プレーヤを作成する時、
- カーネルをどう構成するか(カーネルのビルド)
- rootfsをどう構成するか(ディストリビューションの選択)
- mpdをどう構成するか(mpdのビルド)
に分かれます。今まで2番目の「rootfsをどう構成するか」についてはディストリビューションの選択位しか選択の余地が無かったのですが、buildrootを使えば、これを自在に構成できるということのようです。lightmpdの凄いところはこれに目をつけて、Gaucheと組み合わせて、多機種に展開させたというところですね。改めてよく分かりました。
比較的簡単にromfsのシステムを構築できるようだから、Boticized arch linuxシステムもこれに入れ換えるという手はあるかな。
おっしゃるように、「buildrootはサルのような人間にもシステムを作れる可能性を与えてくれました」(なかなか高級なサルだと思いますが^^;;;) ということだと思います。
とりあえず、折角の力作を消滅させるといけないので、しっかり掲示板のバックアップをとっておきました(^^)。
inthedarkさん。mpd.mkのくだりは、まさに知りたいと思っていたことでした。貴重ないろいろなTipsありがとうございます。
それにしても、たとえばsshdをmenuconfigで選択しておけば、S50sshdだとかを用意してちゃんと起動処理までしてくれるんですね。こうなると普通のboticの初期設定のように、network/interfacesなりmpd.confなりをoverlayで設定すれば動きそうな雰囲気があります。週末になれば(たぶん)まとまった時間がとれるので、とにかく実機で動くか試そうと思います。
yoさん ca2さん
最後までお付き合いいただき恐縮です。
こういうものは勢いがあるときにいっきにやらないと続かない
ものなので根を詰めて書きました。乱筆ですがご容赦を。
私が口で幾ら言っても、実際にいじらない限りbuildrootの
すごさは伝わらないと思いますのでここからは皆さんが実際に
体験することが大事です。(buildrootに限ったことではありませんが)
皆さんの食わず嫌いを緩和することが今回の目的です。
英語が苦手だし、分厚いマニュアル読むの嫌だし、linuxあんまり
詳しくないし、色々な理由をつけて自分の可能性をつぶして
いく(年を取ればとるほどこの傾向が強くなりますが)
これはやはりもったいないと思いますんで。すでに相当の知識
をお持ちなら自分で勝手に勉強していくわけですから、ほっとけ
ばいいんですが、そうじゃない人の中にも様々な可能性が眠って
いるんじゃないかと考えています。
これをきっかけに、自分の可能性にアクセスする人が一人でも
出てくれば成功じゃないでしょうかね。
digififanさんがbuildrootのrootfsイメージの作り方を公開
されています。まだ暫定版ですが。書いてある通りに実行
して頂ければ、romfsができますのでお時間があり、興味が
ある方はやってみてください。(エラーがでることがあるかも
しれませんが、落ち着いて)
inthedark
inthedark さん
素晴らしいタイミングでdigififanさんの情報が公開されましたね。それも BBB Boticを意識した形で。ここでlightmpdのboticizeって大騒ぎしたのが良かったですかね。
早速試してみて、先程、
yo@ubuntu:~/digifi/beaglebone/buildroot-2016.11.1$ ls output/images/
rootfs.cpio rootfs.cramfs rootfs.romfs
を確認したところです。
Core i5 1.8MノートPCで2H位かかりました。VmwarePlayerのディスクを8GB位消費。
ちょっと実機でやるのは無理ですね。
これをベースにいろいろ遊んでみるつもりです。
inthedark さんの情報とアドバイスなしにはここまでこれなかったでしょうから、大感謝です。
こんばんは。しばらく公開されたlightmpdのdefconfigを元にしてbuildrootで色々試してました。いくつか便利かと思ったことを書こうと思います(一部は別のところにも書きました)。だいたいはマニュアルから引っ張ってきてます。
1. 環境変数(.bashrcなどに記入)についてですが、
export BR2_DL_DIR=(dlを置きたい場所)
export CCACHE_DIR=(tmpfsを使ってるなら/tmp?(再起動すると消えるが、それが良いのかは不明…))
の様に設定できるかもしれません。BR2_DL_DIRについては設定しておくと、buildrootがこっちをダウンロードの場所として優先する模様。
また、標準だとソース・ファイルをwgetするとき3回試すんですが、繰り返してもうまく行かない方が多い気がするので、.configで
BR2_WGET="wget --passive-ftp -nd -t 1"
の様に1回にしてます。
2. make の引数について、マニュアル(https://buildroot.org/downloads/manual/manual.html#_advanced_usage" target="_blank">https://buildroot.org/downloads/manual/manual.html#_advanced_usage)の 8.12.5 にいろいろ書いてあります。
たとえば、一度ccache makeしたプロジェクトで、mpdだけ新しく更新したいという場面は多いと思います。ただ、buildrootは一気に全部作ることを想定してるので、厳密な手順としては make clean して ccache make しなくてはなりません。
しかしそれは面倒なので、次善の方法としてはmake cleanの代わりにmpdだけ消す:
make mpd-dirclean
をしてからccache makeすることもできます。そうすればmpdについては一から作成されます。mpd更新くらいなら、だいたいはこれで大丈夫かと。
3. mpdなどを新しくするとき、mpd.hashを正しく設定しないとエラーになりますが、そのチェックを飛ばすこともできます。具体的には:
none xxx mpd-0.20.4.tar.xz
の様に指定できます。
4. TopDirにlocal.mkというファイルを作って、たとえばlinux-kernelやmpdなら
LINUX_OVERRIDE_SRCDIR = kernelのあるディレクトリ
MPD_OVERRIDE_SRCDIR = mpdのソースのあるディレクトリ
のように設定すると、ソース・ファイルを拾って展開するかわりに、指定の場所からコピー(rsync)してくれます。この場合、パッチは自動では当たりません。最新のパッケージで、いろいろ操作が必要なときは便利かもしれません。
5. overlayの話がすでに出てますが、
BR2_ROOTFS_POST_FAKEROOT_SCRIPT
BR2_ROOTFS_POST_IMAGE_SCRIPT
あたりも設定すると作業を完全に自動化できて便利かもしれません。
POST_FAKEROOT はrootfs.romfsが作成される直前(たとえば、不要ファイルの削除などできる)、
POST_IMAGE は作成後に実行される模様です(mkimageしたりもできる)。
ca2さん
こんばんわ。夜分貴重なtipsありがとうございます。
工夫次第で色々使い勝手が良くなるものですね。
またお気づきになられた点などございましたら
お時間の許す限りで結構ですので書き残して頂ければ
とおもいます。
inthedark