Sharp PDA - [06] SL-C3000 debian 化(etch)

はじめに

SL-C3000 の使用頻度が減ってきたので、フラッシュの内容、マイクロドライブの内容を全てバックアップして、X-Window を入れてみようと思う。

手軽に環境を変えるには、Pocket Workstation、pdaXrom。titchy などを入れるのが良いと思う。
ここでは、そういうものを使わずにやってみようと思う。
ゴールとして、Kernel 2.6 の新しいものを入れる。debian で apt-get できるようにする。x-window でマルチウインドウ環境とする。

debian 化の方法

最近では、玄人志向の玄箱 (NAS) を debian 化する方法などが、web で紹介されているので同じような方法をとることにする。
本体のデータをバックアップした後、メンテナンスカーネルから起動し、きれいさっぱり、フラッシュの内容(/dev/mtdblock2、dev/mtdblock3)を消去する(dd を使って)。
そして、fdisk を起動し、パーティションを全部削除したあと、以下のようにパーティションを区切った。
SL-C3000 だけど、6GB マイクロドライブに換装済み。画面は debian 化が完了し、telnet で windows からログインし、fdisk を起動した時の画面。
hda1 はルート、hda2 はホーム、hda3 はスワップ

Deb_fdisk

kernel 2.6.21 のソースコードを入手し、SL-C3000 のコンフィギュレーション(spitz) でカーネルのパラメータを設定する。
make zImage でカーネルを作成し、make modules でモジュールも作成する。このとき、カーネルのサイズが 1264kb を超えないように注意する。
超えると、zaurus のフラッシュ上のカーネルの隣の領域(メンテナンスカーネルの領域) を壊してしまう。
作成したモジュールも modules.tar にアーカイブしておく(zaurus にインストールするため)。
そして通常のアップデート手順で kernel をアップデートする。
このままだと、ルートファイルシステムがないので、kernel panic になって停止する。
なお、カーネルコマンドラインパラメータに fbcon=rotate:1 という記述を追加しないと、液晶の左が上、液晶の左が下になり、90度回転してしまう。
なお、debian 化したあとの dmesg は dmesg のページに追加した。

次に、ルートファイルシステムを作る。
カーネルコマンドラインを console=ttyS0,115200n8 console=tty1 root=/dev/hda1 rw rootfstype=ext3 fbcon=rotate:1 のようにして、
root=/dev/hda1 rw rootfstype=ext3 とすることで、mtdblock を使わず直接 HDD を読みに行くようにする(もちろんマイクロドライブをカーネルがマウントできるようにモジュール化しない)。 /dev/mtdblock2 を消さなくても良かった。
debian の設定ファイルを母艦から持っていこうとしたが、面倒なので debootstrap というのを使用する。
debootstrap コマンドを使うと、chroot した Debian 環境を容易に構築できるとある。パラメータに --arch arm を指定すると、arm 用のバイナリが用意される。

やり方は、ここを参考にした。

ここから debootstrap をダウンロードして展開する。
ファイルのダウンロード、ルートファイルシステムのベース構築は、母艦 (i386環境) で行い、次にできたルートファイルシステムのベースを zaurus に持っていって zaurus 上で再び実行する。その理由は、母艦で debootstrap を実行すると、ファイルのダウンロード、展開が行われ、次に新しく作ったルートファイルシステムに chroot しようとする。母艦とターゲットのアーキテクチャーが違うので chroot に失敗し debootstrap の実行が終了してしまう。

debootstrap の一番新しいバージョンで、ファイルの最後が i386.udeb になっているものを取得し展開する。展開は ar -x ファイル名。
展開すると、data.tar.gz が出てくるので、さらに tar xfz data.tar.gz で展開する。
展開すると、カレントディレクトリに usr/lib/debootstrap と usr/sbin/debootstrap が作成される(これが debootstrap の実行に必要なファイル)。
そして、mkdir で debroot1st (今回作成するルート) を作成し、以下のようにして、debootstrap を実行する(# はルートで作業することを意味します)。
include オプションは構築する最小限のルートファイルシステムに指定したモジュールを追加することを意味する(ar が含まれる binutils と wget を追加)。

#export DEBOOTSTRAP_DIR=作業ディレクトリパス/usr/lib/debootstrap
#export PATH=$PATH:作業ディレクトリパス/usr/sbin
#debootstrap --include=binutils --arch arm etch 作業ディレクトリパス/debroot1st http://ftp.jp.debian.org/debian

しばらくすると、chroot に失敗したというメッセージを出して終了する。
次に zaurus 上で debootstrap を実行するために準備をする。

arm 環境で実行するための debootstrap を展開する(ファイルの最後が arm.udeb になっているもの)。
ar -x debootstrap-udeb_1.0.3_arm.udeb とすると data.tar.gz ができるので、debroot1st フォルダに移動し、tar xfz ../data.tar.gz で展開する。
すると、debroot1st/usr/lib/debootstrap と debroot1st/usr/sbin/debootstrap ができる(これを zaurus 上で実行する)。
このときに、debroot1st/etc/fstab、etc/resolv.conf、etc/network/interfaces、などのファイルをネットワーク接続のため編集しておくのが良いだろう。
できた debroot1st/ 内のファイルを tar cf ../debroot1st.tar * というふうにアーカイブにして、sd カードなどにコピーする。
sd 上には、カーネルのモジュールもアーカイブにして入れておくといいだろう。
そして、メンテナンスカーネルを起動し、/hdd1 にマイクロドライブのパーティションをマウント、/mnt/card に sd をマウントし、debroot1st.tar を /hdd1 内に展開する。
debroot1st.tar 内には、ar がないので、メンテナンスカーネル上のルートファイルシステムから ar をコピーして、hdd1/bin に入れる。
また、hdd1/dev には console 、tty1 がないのでこれもこの段階でコピーしておく。
さらに、この次に新しいカーネルで起動するが、設定が完全に終了していないので、hdd1/sbin/init が実行されないように、mv init init.org として 移動し、代わりに cp /hdd1/bin/bash /hdd1/sbin/init とする(念のため cp /hdd1/bin/bash /hdd1/sbin/bash も実行)。
これはいらないかもしれないが、chroot /hdd1 として /hdd1 をルートにしてから、ldconfig をする。
そのあと、reboot コマンドでリブートする。

リブートすると新しいカーネルで起動し、最初のプロセスとして bash が実行され、プロンプトが表示される(init をとばしてシェルを直接実行)。
プロンプトが表示されないときは、カーネルが最初に起動すべきシェルが実行できないか、/dev/console がないため kernel panic になる。
この段階で基本的なコマンドが使える、ためしに debootstrap や ar を実行し、コマンドが使用できるか確認する。
dpkg -i --force-depends -i /var/cache/apt/archives/* で、cache に残っている deb ファイルをインストールする。
起動後は、zaurus 用のキーマップがされていないため、/ キーや、= キーなど一部のキーが入力できないので非常に困る。
タブキーの補間が使えるので ..tabキーを打つと ../ と補間がされるので、補間された / を使ってパス入力はなんとかする。
dpkg の実行で PATH が定義されていないため、実行に失敗する場合は、以下の内容のファイルを母艦で作成し sd で zaurus 上に もって行って、環境変数をエクスポートする。
そのためには、sd が使えるようにしてから下記内容を入力し p ファイルを sd へコピーする(適当に p ファイルとする)。
echo export PATH=/usr/sbin:/usr/bin:/sbin:/bin > p
zaurus 上で、/ に移動し、/mnt/card を作成する。
/dev に sd 用のデバイスファイルがないので作成する。
#mknod mmcblk0 b 254 0
#mknod mmcblk0p1 b 254 1
そして、sd を /mnt/card にマウントし、sd 上の p ファイルを zaurus 上にコピーする。
chmod 755 a で、実行権限をつけたあと、. ./p で環境変数をエクスポートする(一番最初の . に注意)。
そのあと、dpkg を実行するとうまくいくと思う。
日付、時刻の設定がされていないので怒られるがここではスルーする(この環境は捨てるので)。
dpkg の実行が終わると、一通りのコマンドが使えるようになっていると思うので、ネットワークの設定をする。

母艦のファイルをコピーしてくるか、母艦上でファイルを編集し、sd カードで zaurus 上にコピーする(/ や : のキー入力ができないため)。

/etc/fstab(以下内容。内容は適時変更)
proc /proc proc defaults 0 0
/dev/hda1       /               ext3    defaults,noatime,errors=remount-ro 0 0
/dev/hda2       /home           ext3    defaults,noatime 0 0
/dev/hda3       swap            swap    defaults 0 0

/etc/hostname(以下内容。内容は適時変更)
zaurus

/etc/network/interfaces(以下内容。内容は適時変更)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

/etc/resolv.conf(以下内容。内容は適時変更)
nameserver 192.168.0.1

/etc/apt/sources.list(以下内容。内容は適時変更)
deb http://ftp.jp.debian.org/debian etch main contrib non-free

そして、ネットワークを使えるようにする(私は Buffalo の CF 型有線 LAN カード(LPC-CF-ClT) を使用。
今は、/sbin/init を変更し、シェルを直接実行実行しているため、rm init、mv init.org init として元に戻しておく。
そして、reboot すると debian 環境でブートし、ネットワークが使える状態になる。

Deb_boot

問題点
ログイン後、root のパスワード入力を求められるが、リブートし、ログインするためにパスワードのチェンジの要求がされる。
apt-get を実行すると、coreutils がないと言って怒られる。
これは、#dpkg -i /var/cache/apt/archives/coreutils_5.97-5.3_arm.deb をインストールすると解決する。
パスワードのチェンジ要求があるのは、無理やりインストールしたからなのか、日付の設定をしないで、deb パッケージを入れたからなのかはわからない。
これで、debian で apt-get できる環境が構築できたので、この環境上で再び debootstrap を実行して、 できたルートファイルシステムを使うことにする。
この段階では、zaurus 上で debootstrap を実行しても正常に終了するので、気分的にも zaurus 上で動いている debian 環境で debootstrap して できたルートファイルシステムを使うのが安心するような気がする。
最後に、/lib/modules にカーネルモジュールを展開し、apt-get update、apt-get install udev などとして、udev でデバイスファイルを管理するようにしていったんこの作業を終わる。