はじめまして!
tozumiと申します。いつもnoteに競馬とか勝手に作った競馬収支管理コマンドとかを載せてます。Qiitaでは初めて記事を書きます。最初からbusyboxなんて書いてしまってよいのかだいぶ不安です。
自己紹介
- 大学3年生(4月から4年)
- 都内の情報系の学科
- だらしなさすぎて2年の必修を再履中(これを落とすと留年確定でヒヤヒヤしている)
- あと普通に4年生になっても週4くらいで大学に通うことになりそうで滅!
- 1月から開発系のアルバイトが始まるのでとても楽しみにしているが、特に院進の予定はない
今回のテーマ:BusyBoxをソースコードからビルドしてみよう
やったことは簡単です。ただ自分のPCにBusyBoxをソースコードからビルドしてみました。
もともと自分のPCはUbuntuを入れています。正直どうやって入れたかはあまり覚えていません(多分USBをなんかさして色々やったような・・・)
最近はaptとかパッケージ管理コマンドを使って色々インストールしていたのですが、「ビルドの流れを理解するためには、一度自分でソースコードからビルドしてみるのがよい」と書いてあったので、本の流れに沿ってビルドしてみました。
そもそもBusyBoxとは?
主に組み込みLinuxで使われるオープンソースの万能コマンドのこと
BusyBoxの中にはさまざまなアプリケーションの機能が集約されている
ノーマルなLinuxではコマンド(ls,cdなど)が1個ずつ別な実行ファイルに入っている(はず。ノーマルなんて言っていいのかわかりませんが。)
それに対してBusyBoxは1つの実行ファイルに100以上のコマンドが入っているというものだそうです。
ビルドの流れについて勉強してみました。というか、本に書いてありました。
太字がうまく設定できなくなりました…読みづらくてごめんなさい
- Fetch(ソースコードtarballをインターネットやローカルから取得する)
- Unpack(取得したtarballを展開してソースコードを取り出す)
- Patch(ソースコードのバグを修正したり機能を追加したりすること。=何らかの修正を加えること)
- Configure(ビルドを行うための設定。ソースコードを機械語に変換するコンパイラを指している?Linuxではmakeが活用されており、Makefileというファイルにソースファイルをどのようにビルドするかを予め指定しておくことでmakeコマンドのみで各々のファイルに対してコンパイラが起動してくれるらしい)
- Build(makeコマンドを実行してビルドを行う)
- Install(ビルドしてできたファイルを特定のディレクトリにコピーする操作のこと。この段階ではルートには含まれない。 make install)
- Package(ここはよくわかりません。組み込み用のYoctoについて書いてある本なのでチョットわからないです。パッケージファイル(rpmとか)を作るってことだと思います)
ようやく本題!BusyBoxをビルドしてみる
手順としてはソースコードをインターネットから引っ張ってくる、展開する、ソースファイルからMakefileがあるか確かめる、ビルド方法を確認みたいな流れでした。
まずは https://busybox.net/downloads にアクセスする。
そこでtarball(tar.bz2ファイル)をダウンロードする。
→今回私は1.37.0を使いました。
wget https://busybox.net/downloads/busybox-1.37.0.tar.bz2
次にtarballを展開します。tarコマンドのオプションは未だに覚えられません。
tar xf busybox-1.37.0.tar.bz2
ここで展開できたらカレントディレクトリをbusybox-1.37.0に移動してください。
そこでlsコマンドを実行してMakefileがあるか確かめます。まぁ見つかるはずです。
次にとうとうビルドを行います。ただ、本にも書いてありましたがビルド方法はOSSによって異なるので必ずドキュメントを確認するそうです。
BusyBoxではINSTALLというドキュメントがありlessコマンド(以外でももちろんOK)でそれを確認します。そうするとビルドの手順は・・・
1. make menuconfig
2. make
3. make install
このように書いてありました。
本に従ったので今回は2までやります。
この1の make menuconfigというのがConfigureにあたります。
本に沿って進めると、特にメニューをいじらずに保存して抜けるとありますが・・・
事件!
このあとmakeコマンドでビルドを始めたのですが、謎のエラーが発生しました。make[1]: *** [scripts/Makefile.build:198: networking/tc.o] エラー 1 <br>
make: *** [Makefile:744: networking] エラー 2
残念ながら私は初心者。何が起きているのか、とりあえず見当をつけてみます。
・networking/tcでなにかがおかしい。
・おそらくエラーは2つなのか?
見当だけつけてもね。答えは出ないので、AIに聞きました。やっぱりエラー解決には心強いです。自分の見当も伝えることでアドバイスもくれるし。
AIからそのまま引用すると
BusyBox の tc が参照している “CBQ(qdisc)” 用の定義が、いまの Ubuntu 側のカーネルヘッダに無い(or 有効になってない) ので、TCA_CBQ_MAX や struct tc_cbq_* が未定義になって落ちています。
Linux カーネルの ネットワーク帯域・遅延・優先度 を制御するための「設定ツール」
????トラフィック制御か?そうなのか?
チョットまだまだ勉強不足な分野でした。
今回は手動でビルドしてみるのが目的だったので、AIの指示にしたがって修正しました。(もちろんセキュリティに問題はないのか!?と確認もしています。怖いけど)
あ、修正するときはmake menuconfigにもう一度入りました。
この修正が終わったら、再びmakeコマンドを叩きます。
いろんな文字の羅列がずらーっと表示されますが、最終的にはBusyBoxのUsageが出てきたのでおそらく大成功です。
最後に
勝手なイメージで、現代ほどコンピュータが発展していなかった頃はlinuxを起動するのにもとんでもない苦労があったのではと思っていましたが、今回のbusyboxはなるほどなと思いました。(簡単とは言いません。)一通りソースコードを持ってきてフェッチして〜の流れを学べたので、やり方を忘れたらこの記事を見ます。
あと、これだけでlinuxが起動できるわけではないんですね。とりあえずQENU?かな?そういうエミュレータでビルドしてその中にbusyboxがすでに入っているのか、そこで入れ直さなければいけないのが、確かめてみます。
参考
以下の本が大変参考になりました。基礎からの「Linuxカーネル」 平田豊・著 工学社
Monoist 組み込みLinuxで際立つ「BusyBox」の魅力
https://monoist.itmedia.co.jp/mn/articles/0802/04/news114.html