カーネルをはじめ、GPLウェアのソースコードはこのあたりから入手できる。カーネルコンフィグも同梱されていて良心的。<アーカイブをほどくと、NasFirmware/marvell/nas_firm_tgl/linux-2.6.16_lsp.1.7.8とかの深いディレクトリが掘られていたりするが、以下ここからの相対表記で。よく見ると、家庭用モデルのTeraStation Liveも同じページを指しているので、やはりカーネルなんかも共通なのかもしれない。
まずはクロスコンパイル環境。ホストとして手元のノートPCに入っていた古いDebian (3.1) を使うことにした。たぶん、NetBSDのEMUL_LINUXとか、Windows (cygwin併用) とかでも大丈夫だろうが。
動作中に/proc/versionあたりを覗いてみると、カーネルはgcc version 3.4.4 (release) (CodeSourcery ARM 2005q3-2) なるコンパイラで作られたらしい。ぐぐる。この辺のSourcery G++ Lite Editionが無償で使える。ライセンスが明示されないのが気になるが、中身はgcc、binutilsなどおなじみのGNU toolchainなので、当然GPLということだろう。一応バージョンも合わせておいた。ホスト環境としてはGNU/Linux、Windows、Solarisが選べる。ターゲットは、ARM EABI (ちなみにユーザーランドはARM GNU Linux) を選択する。tar.bz2なので適当な場所 (たとえば/usr/local/sourcery) に展開。
カーネルイメージにu-Bootのヘッダを追加するのにmkimageなるコマンドが必要となるが、これはu-Bootのキットの中に含まれている。単体でコンパイルすることも難しくはない。
もとのカーネルコンフィグはbuffalo/以下にいくつかあって、ファイル名からして一番それらしいbuffalo_tshtgl_arm_110.configがたぶん純正のカーネルのそれ (こいつを使って試しにコンパイルしてみると、大体似たようなサイズのカーネルができた。コンパイル環境を文字列として埋め込んだりしたものを圧縮する、とかしているので、完全に一致させるのは難しい)。
実は1つ罠があって、このカーネルを使って起動してもEM MODEになってしまう。カーネルをコンパイルした日時が埋め込まれていて、そいつがユーザーランドの日付より新しいとダメ。埋め込んでいるのは、buffalo/drivers/buffalocore.cあたりで__DATE__とか__TIME__とかを参照している部分なので、これを固定文字列にしてしまうか、ユーザーランド側の/etc/linkstation_releaseを編集すればよい。私は前者の方法をとった。
というところで…
% cp buffalo/buffalo_tshtgl_arm_110.config .config % make ARCH=arm menuconfig
File Systems -> Network FilesystemsのあたりにNFS server supportとか言うのがあるのでこいつを有効にし、その他NFSv3サポートとか、USBのヘンなデバイスドライバとか、お好みに応じて編集する。また、モジュールなどの上書きを防ぐため、バージョン文字列を変えておいたほうがよい。General setup -> Local versionあたり。できたコンフィグを保存してメニューを終了。
% make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j4 all uImage
という感じ。-jはお好み。結構大きくしてもコンパイルにかかる時間は短くなっていくので、デスクトップPCでは32とかにしてる。
結果はTeraStationに転送する。モジュール群は、findで*.koをかき集めてもいいが、
% make CROSS_COMPILE=arm-none-eabi- INSTALL_MOD_PATH=/tmp/hogehoge modules_install
とかで/tmp/hogehoge/lib/modules/2.6....とかのディレクトリができて、そこにコピーされるのでこいつをtarとかで固めるのが楽。TeraStationの/lib/modules/2.6....におく。カーネルイメージはメッセージの通りarch/arm/boot/uImageにできているので、これを/bootにコピー。
早速新しいカーネルを起動。シリアルコンソールを有効にし、端末をつないでreboot。Restarting system.というあたりがLinuxが最後に出すメッセージ。しばらくディスクとかの認識のメッセージが出て、Hit any key to stop autoboot: というカウントダウンが2度ある。1度目はtftpブートのためのものなのでスルーし、2度目のカウントダウンで何かを押すとu-Bootのプロンプト (「Marvell>> 」)が出る。
Marvell>> setenv kernel uImage Marvell>> boot
これで新しいカーネルが起動するはず。正常起動を確認したら、/boot/uImageを/boot/uImage.buffaloにリネームすればよい。
mountdとかのユーザーランドのファイルも必要となるが、これは気が向いたら。
コメントする