Compact Flash内に小さなオリジナル組み込みLinuxを作る。 Linuxの起動プロセスを理解し、システムをsourceからbuildする 手順を解説します。 目次: - Linuxのブートプロセスを知る - 1CF Linuxの仕様 - Linux作りの概要 - kernelのbuild (次ページで解説) - userlandのbuild (次ページで解説) - CFへの作り込み (次ページで解説) Linuxのブートプロセスを知る =========================== BIOS -> boot loader -> kernel --------------+-> /sbin/init -> login | | initrd -> /linuxrc -+ 1) BIOS FDやHDの先頭セクタを読み実行します。 2) boot loader kernelとinitrd(root file systemが入った初期RAMDISK)を指定し、 実行を移します。initrdが無い場合は通常のファイルシステムを利用します。 3a) kernel initrdが指定されていればマウントし、内部に含まれる/linuxrcに沿って 処理を実行。その後/sbin/initを実行。 3b) initrd 初期RAMDISK。kernelが起動時に利用するrootファイルシステムのイメージ。 内容は通常のLinuxのrootファイルシステムをとても簡単化した小さなツリー。 kernelが起動時にマウントし、shell scriptである/linuxrcファイルを 実行。必要なデバイスドライバをロードし、終了まぎわに、利用するファイル システム(HD,NFS,CD-ROM,CF上)をマウントし、/sbin/initを実行に移す。 4) init inittabの内容にそって、Run Levelを決定し、各種デーモン起動などの 処理を行う。 5) login consoleにloginプロンプトを出します まとめ: 起動プロセスを見ていくとLinuxは以下の3つの部分から成り立っていると気が付く。 逆にこれらを準備できれば、Linuxが作れるはず。 - Boot loader 既存のオープンソースなものが使える - kernel (+initrd) LinuxにははじめからKernelを作れる仕組みがある。 - user land (Linuxのカーネル以外の部分) 今回発見した半自動的にuser landが生成できるツールを利用する。 実は案外簡単にオリジナル組み込みLinuxが作れるかも(^_^) さらに! Linuxの起動はinirdを利用する2段階bootにすることにより、HD以外(CD-ROM, NFS等)からのbootが簡単に行えるようになっているので、そのような応用も 考えられる。そして、initrdの中に運用時のファイルシステムを構築してしま えば、RAMDISKだけで運用するシステムになる。 1CF Linuxの仕様 =============== - サイズが小さい 通常のdistributionを利用すると100MB程度にはなってしまう。 kernelもuser landもソースからコンパイルし、必要な機能だけを実現する。 - HDと同様の使用感 RAMDISK運用にするとシステムのメンテナンスが面倒なので、まずはHDと同様に 読み書きできる形でCFを利用する。 - CFの書込み制限対応 CF上にswapファイルを作らない。 /tmp,/varなど書き換えが多い場所はRAMDISK上に作る。 ファイルのaccess time(atime)は更新しないようにする。 - クロスコンパイル環境不要 Hightech社 MicroPCを題材とします。その他 CFつきIntel互換CPUを持った PCであれば同様に作業を行えます。クロスコンパイルを必要とせず、圧縮ファイル システムやRAMDISK上にシステムを持たない構成にすることにより、簡単にTry&Error 作業が行えます。組み込みシステムづくりの導入としては最適です。 Linux作りの概要 =============== Linuxを構成する"Boot loader","kernel","user land"をそれぞれ準備し、 Compact Flash上に書き込む。CFからbootし起動するように/etc以下の準備、 CFの書き換え制限に対応するような変更を行う。 - Boot loader GRUBを使用。 カーネルを入れ替えて行う試験が多いので、liloのように入れ替えたら再設定が 必要な(inodeでカーネルの位置を理解しているので)ものは面倒。GRUBはファイ ルシステムを理解するので変更がいらない。 - Linux kernel Linuxの作業環境(RedHat,Debian GNU/Linux等)上で普通にソースからの コンパイルが可能。kernel.org から必要なバージョンのソースを入手しコン パイルを行う。ドライバ類はモジュール化しない。 - user land "BusyBox"を中心として各種コマンド類をbuild。それらルートファイルシステムを 半自動的に生成する便利なツール"ptxdist"を利用。 GRUB (http://www.gnu.org/software/grub/) Linux Kernel (http://www.kernel.org/) ptxdist (http://www.pengutronix.de/software/ptxdist_en.html) 開発環境: - PC メモリ適当、HD適当、Clock適当(当然多くて早い方が良いです) Eden/667MHz + 256MBメモリのPCにて、kernel+userlandコンパイル に5〜6時間かかります。 - Linux(RedHat, Debian等)。gcc等の開発環境のインストレーションも必要。 - Internet接続