[玄箱PRO]カーネル構築
入手から1ヶ月以上、過ぎてしまいましたが、ようやくカーネルを構築し終わって、起動までこぎつけました。クロスコンパイル環境を整えるのに2週間、さらにカーネルをちゃんとコンパイルして起動できるようになるまでに2週間かかってしまった。現状で、とりあえず、起動は出てきていて外部からSSHアクセスはできるようになっていますが、RTCがうまく機能していない(ので起動時に時計の修正が必要)のと、ルート(/)をXFSにすると一部のディレクトリが読めずに起動できないところが難点。とりあえず、今回はクロスコンパイル環境の整備とカーネル構築について書いていきます。
前、書いたところまでは、かなりメモを取りながら書いていたので、失敗も含めて詳細に書いていましたが、カーネル構築環境の構築とカーネル自体の構築の際にはあまりメモを取らなかったので、うまくいった部分のみ記載しています。
玄箱開発環境の用意(2)
さて、カーネル構築用にクロスコンパイル環境が必要になるので、まずはそれを作ります。
なお、コンパイル済みのものを持ってきて使うというのが一般的です。まぁ、ようは興味本位でちゃんとRPMにしたいというだけなのですが。コンパイル済みのものを使うのであれば、GNU Toolchainからダウンロードしてきます。
私は昔作ったクロスコンパイル環境構築用RPM-SPECファイルを捜し出してきて今のバージョンにあわせて修正して使いました。なお、余談ですが、以前これらに付いて書いていたRIMにあったページはRIMでのサーバ障害により消滅しました。一応、復帰してリカバーしたファイルがあるらしいのですが、面倒なので復帰しません。
SPECファイルはこんな感じ:Xce.spec(44,139 bytes)
前のときにはx86_64でも作れたのですが、今はうまくいっていません。まぁ、いいか。
開発環境のRPM (i686バイナリ):
- ベース:ディレクトリなど(3,046 bytes)
- binutils:アセンブラ、ローダなど(3,531,924 bytes)
- gcc:c,c++のみ(15,420,059 bytes)
- glibc:GNU libc(12,330,419 bytes)
- カーネルヘッダ:ヘッダファイル(2,346,306 bytes)
まずは、これらの5つのRPMパッケージをインストールします。
それと、玄箱PROはブートローダにu-Bootを用いているので、カーネルを作った際にuBoot形式のuImageを作る必要があります。これに必要なu-Bootイメージ作成ツール(mkimage)が必要になります。これは、mkimageのx86用バイナリを持ってきてパスが通っているところに置いておしまい。
おまけ:SRPMからの構築
- Xce-1.1-3tsorg.nosrc.rpm(509,364 bytes)
SRPMから作るには、
rpmbuild --rebuild --define='cross_target armv5tel-redhat-linux-gnueabi' --define='target_model <b style="color:black;background-color:#ffff66">kuroboxpro</b>' --target=i686 Xce-1.1-3tsorg.nosrc.rpmといった感じで作ります。
cross_targetには、開発対象となる「cpu名-プラットフォーム-OS」を指定します。target_modelには、カーネルソースのarch/*/configs/の中にあるファイルの_defconfigをのぞいた部分を指定します。たぶん、これらを指定すれば、他の環境用のクロスコンパイラも作成できるはずです。なお、ファイルサイズの都合上、上記のSRPMファイルはnosrcにしてあり、私が作ったパッチ以外は、含まれていません。必要なファイルはFedora-ARMのサイトSRPMパッケージに含まれているので、ここから、binutils,gcc,glibcを入れてください。また、下のカーネルパッチに書いてあるMarvel SATA Adapter関連の3つのパッチも必要です。
カーネルの構築(2)
カーネルはFC6にあわせて2.6.20をベースにしています。(2.6.22はコンパイルできても玄箱で起動できなかった…)
2.6.20カーネルを持ってきて必要なパッチを当てます。カーネルの本体はLinkstationWikiのSourceForgeのサイトからsvnで持ってきました。
まずは、以下のパッチをあてます。
ビルドに必要なパッチ:
- kernel-2.6.20-arm9.patch:純カーネルとLinkstationWikiのarm9カーネルの差分(LinkstationWikiからカーネルを持ってきていれば不要)(2,904,637 bytes)
- Marvell SATA Adapter用パッチ(1):LinkstationWikiのではうまく動かないので(外部サイト)
- Marvell SATA Adapter用パッチ(2):(外部サイト)
- Marvell SATA Adapter用パッチ(3):(外部サイト)
- Marvell用パッチの修正:上のパッチだけではうまくコンパイルできないので(1,460 bytes)
- NANDドライバパッチ:NANDフラッシュにアクセスするためのパッチをもともと玄箱に付いていたlinux-2.6.12_lsp.1.10.3から流用して修正(20,382 bytes)
んで、以下のconfigファイルを用いてビルドします。まずは、このconfigファイルを.configというファイル名でカーネルツリーのトップに配置します。
- 玄箱PRO用設定ファイル(27,733 bytes)
玄箱PRO専用です。あ、上のパッチ類も玄箱PRO以外では動かない可能性大です。なお、カーネルサイズの関係からNFSをカーネルモジュールに回してあります。ですので、カーネル単体で、NFSブートはできません。NFSブートするには(他のものをモジュールに回して)NFS関連をカーネル本体に入れるか、initrd(これもu-Boot用にmkimageで作る)を使う必要があります。勘違いでした。ただ、いろいろモジュールに回してあるのは本当です。詳細は設定ファイルを見てください。
さて、実際のカーネルの構築です。カーネルをクロスコンパイルするには、アーキテクチャとクロスコンパイラの接頭文字列を指定する必要があります。.configからの読み込みは以下のような感じ:
$ make ARCH=arm CROSS_COMPILE=armv5tel-redhat-linux-gnueabi- oldconfig
CROSS_COMPILE=のところは接頭文字列なので、最後はハイフン(-)で終わります。
このあと、実際のカーネルの構築を行います。
カーネルのビルド:
$ make ARCH=arm CROSS_COMPILE=armv5tel-redhat-linux-gnueabi- uImage
できあがったカーネル:uImage.tsorg (新版に伴い公開停止)
※ 右クリックから保存しないと大変なことになるかも。
カーネルモジュールの作成:
$ make ARCH=arm CROSS_COMPILE=armv5tel-redhat-linux-gnueabi- modules
モジュールのインストール:
$ mkdir ../newroot-2.6.20 $ make ARCH=arm CROSS_COMPILE=armv5tel-redhat-linux-gnueabi- INSTALL_MOD_PATH=../newroot-2.6.20 modules_install KERNELRELEASE=2.6.20
モジュールのインストールは、直接/lib/modules/に入れるわけにはいかないので、インストール先を指定します。モジュールは玄箱のルートディレクトリに配置し直します。
できあがったモジュール:上のカーネルバイナリ用モジュール (新版に伴い公開停止)
えーっと、長くなったので、今日のところはここまで。次回は、玄箱上のディスクへのシステムのコピーと新カーネルからの起動について書くつもりです。
参考サイト一覧:
Posted by TechStrom on Saturday, September 01, 2007