本シリーズでは Linux, BusyBox, uClibc を活用し、Linuxシステムを手作りしてみます。
本シリーズの目的は次の3つです。
- 手作りしていくことで BootLoader, Linux Kernel, ルートファイルシステム の関係を理解する。
- FD, CD, Network のそれぞれからブートさせるための知識をひとまとめにする。
- LinuxKernelのDebugシーンで役立つよう、ホストマシンでkernelコンパイル→Networkブートでターゲットマシンでロード、KGDBを組み込んでホストマシンからgdbでLinuxKernelのライブデバッグを実現する。
組み込みシステムは特に意識しません。クロスコンパイルも使いません。
x86(32bit)マシンにセットアップしたCentOS5.5上でのx86(32biti)用のgccをそのまま使い、VMware上で動かしてみます。後半はBuildrootを使ってgccツールチェインをホストマシンから分離しています。
各ツールや作業ステップの細かい解説は行いません。関連書籍やURLを随時紹介していきますので、それらを参照していただくか自分で適宜調べてみてください。本ページの最後にシリーズ全体での参考資料を挙げています。
なお、より本格的にLinuxシステムを手作りするドキュメントとしては "Linux From Scratch" があります。
- Welcome to Linux From Scratch!
- Linux From Scratch (日本語版, Version 6.6 (2011/04末時点の201003020版) )
- @IT:ソースファイルからLinux環境を構築しよう!(1/3)
LFSでは用意するソフトウェアの数が多いです。
本シリーズではユーザーランドのソフトウェアについてBusyBoxを使って「手抜き」しており、その他ディレクトリや"/etc"ファイルに付いてもBuildrootにお任せしています。その分、FD/CD-ROM/ネットワークブートなどの起動方法のバリエーションをまとめることに注力しています。
用途や段階に応じて本シリーズとLFSを使い分けてください。
本シリーズで紹介するKernel+ユーザーランドの起動バリエーションを「元ネタ」として、実務や趣味のhackで活用していただければ幸いです。
想定読者レベル:
- INT 80h を使ってkernelのシステムコールを直接呼ぶタイプの "Hello, World!" をアセンブラで作成できる。
- システムコールの実体とCランタイムライブラリの関係を理解していないと、BusyBox + uClibc環境の構築時のトラブル対処が難しいと思われる。
- gccを使わず、binutilsのツールだけで "printf()" Cランタイムライブラリを使った"Hello, World!"を動的リンク・静的リンクのそれぞれで作成できる。
- gccとbinutilsの関係、オブジェクトファイルと最終的な実行ファイルの関係、unixにおける動的リンク・静的リンクの違いを理解していないと、BusyBox + uClibc環境の構築時のトラブル対処が難しいと思われる。
- リンカスクリプトを自分で作成し、生成された実行ファイルが上手く動作しない場合はobjdumpやreadelfなどのツールでELFを解析して自分で原因を特定できること。
- クロスコンパイル環境の構築もそうですが、本シリーズで扱うように開発ツールセットをホストマシン環境から切り離す場合、リンカスクリプトやリンク時のオプション一つで実行ファイルが動かなくなります。そうしたトラブルに対処するためにはELFをある程度自分で解析できる必要があります。
- シェルスクリプトとMakefileを読める・書ける。
- kernel, BusyBox, uClibc, Buildrootの全てでシェルスクリプトとMakefileが活用されているため、トラブル対処に必須の技能です。
- LinuxKernelの解説本やOS自作本を読んで、最低一度はMBRの起動からKernelの最初のプロセスの開始までを追ったことがある。
- 本シリーズではこの辺の知識は前提条件としており、解説していません。
本シリーズの環境:
VMware : Workstation 7.1.2
VMwareホスト: Windows 7 SP1 (x86 32bit)
VMwareゲスト:
開発マシン("ホストマシン"):
CentOS 5.5 (x86, 32bit)
gcc-4.1.2-48.el5
libgcc-4.1.2-48.el5
binutils-2.17.50.0.6-14.el5
ターゲットマシン:
(空), 128MB, 1プロセッサ, 1GB HDD, CD-ROM, FDD
開発マシン上でkernelやユーザーランドをビルドし、ターゲットマシン上で起動してみます。
開発マシンとターゲットマシンは同じVMwareのNAT環境内にあります。
シリーズ全体で参考にさせて頂いた資料をここでまとめておきます。
Embedded UNIXの西田亙氏の一連の記事に大いに啓発されました。
参考ムック:
- CQ出版社, インターフェース増刊 Embedded UNIX
- Vol.1 : 「Linuxシステム縮小化計画 第1回 BusyBoxによるLinux基本環境の構築」西田亙
- Vol.2 : 「Linuxシステム縮小化計画 第2回 Linuxカーネルイメージのしくみとルートファイルシステム」西田亙
- Vol.6 : 「ゼロから始める組み込みLinuxシステム構築」西田亙
Vol.1, Vol.2 が kernel-2.4.x とその時代のBusyBox、Vol.6がkernel-2.6を扱っています。
参考書籍:
"Embedded Linux Primer"が包括的かつ意外と詳しくて助かりました。
プレーンテキスト形式でダウンロード
コメント