HDL-GXR に Debian をインストールしてみようの巻 (試行錯誤編・その 1)

※注意: 以下の手順では実機での動作確認ができていません。
今回は debootstrap 編です。


さてさて、とりあえず入手した LANDISK ですが、ハードウェアはとりあえず動く様子。ただすでに Debian がインストールされているので、Web ブラウザなどを利用する「正攻法での hack」は通用しません。
とりあえず、中身は SATA の HDD が入った ARM のボードなので、HDD を取り外して PC につなぎ、基本的にはそちらから環境を作ってやればいいやと。
そのためにいろいろと下調べをしたのですが、基本的にはパーティションを切りなおして mkfs かけてから、OS の環境を作り直せばよいらしいということがわかりました。
しかし、ちょっとこまった。うちには Linux のインストールされたマシンが(ps3 くらいしか)ないわけですよ。まぁここで颯爽と KNOPPIX の登場なわけですが。


さて、HDL-GXR シリーズはブートローダとして u-boot を採用しており、こいつが 1 番目のパーティション(Linux 上からは /dev/sda1 で見えます)からカーネルと initrd を読み込み、その後 / として 2 番目のパーティション(/dev/sda2)を root filesystem としてマウントする設定になっているらしいので、そちらにあわせる形で。カーネルパーティションは 256MB 程度あればよいようで、一応 /dev/sda3 に swap を 380MB ほど確保して、残りをシステムやデータ格納用としてまとめてしまいます。
kernel 類は EXT2 パーティションにして、root filesystem はパフォーマンスなどの面から XFS にしようかとも思ったのですが、ARM Linux ではデータ破壊が起こることがあるらしく、怖かったのでおとなしく EXT3 にしときました。(スレッドをざっとながめただけで検証はしていませんが、万一の場合に怖いので安パイをと…。)
カーネルイメージや initrd、カーネルモジュール類は、どうやら既にインストールされているものには独自パッチがあてられているらしいので、フォーマットの前にとりあえず保全と言うことで USB メモリなどに固めて保存しておいて、フォーマット後に書き戻すということをやっておきました。
そういえば、後から思うわけですが、fdisk でパーティション切るときには電卓が必須ですね。日本語ロケールだと 1GB = 10 億バイト計算になっているようですけど、LANG=C だと 1GB = 2^30 バイトっぽい、のでしょうか? ちょっとはまりましたのでお気をつけください(?)

注: 以下デバイス名は異なる場合があります。適宜読み替えてください。

# mount /media/sdd1
# tar Ccvjf /media/sdd1 /media/sde1/backup/boot.tar.bz2 .
# mount /media/sdd2
# tar Ccvjf /media/sdd2 /media/sde2/backup/modules.tar.bz2 lib/modules
    (ほかにも必要に応じてバックアップなど)

# umount /media/sdd1
# umount /media/sdd2
# fdisk /dev/sdd
...
# mke2fs -c /dev/sdd1
# mke2fs -c -j /dev/sdd2
# mkswap /dev/sdd3
# vi /etc/fstab
    (マウントパラメータの変更、noauto だけにする)

# mount /media/sdd1
# tar Cxvjf /media/sdd1 /media/sde1/backup/boot.tar.bz2
# mount /media/sdd2
# tar Cxvjf /media/sdd2 /media/sde1/backup/modules.tar.bz2

パーティションができた後、Debian のインストールを行いますが、ベースシステムのインストールは debootstrap というツールにより行うことができます。
本来は実機と同じアーキテクチャでやるべきなのでしょうが、今回は稼動している同等のハードウェアがなかったため、x86 の上でクロスプラットフォームでやりました。クロスプラットフォームでの debootstrap については、http://wiki.debian.org/EmDebian/CrossDebootstrap などに詳しいです。
この場合押さえておくべきポイントとしては、

  • first stage については、正しい --arch パラメータと、--foreign パラメータを指定すること。ここでパッケージのダウンロードや展開が行われます。
  • second stage については、binary compatibility が必要。なぜならば、ここでパッケージの設定が行われるため、バイナリを実際に走らせる必要がある。上記ドキュメント では、qemu の user-level emulation と Linux の binfmt-support を利用してこれを実現しています。

なのでとりあえず、first stage について debootstrap を行います。

# debootstrap --arch arm --foreign etch /media/sdd2 http://ftp.jp.debian.org/debian/

次に second stage です。KNOPPIX 5.3.1 DVD の場合、qemu はデフォルトでインストールされていますが、chroot 環境での user emulation に対応するパッケージはパッチのみ提供されているのでソースから自力でビルドする必要があります。手順やパッチのリンクは http://wiki.debian.org/QemuUserEmulation にあります。
まず /etc/apt/sources.list でソースパッケージの apt line を有効にしてやります。さらに不要なパッケージソースをコメントアウトしてやらないと、apt-get update で拾ってくるパッケージリストがあまりにも多くて、apt がエラーを吐いてしまいます。
apt-get source でソースを取得したら、パッチをあててビルドします。(…と、ここでは簡単に書いてますが、実際は一部手動でいじる必要があったりして、1 時間ほど試行錯誤しました。このへんは後でまとめます。)
パッケージがうまくビルドできたら、インストールしてバイナリ互換性が実現できているかを試してみます。これも上記 DebianWiki のページを参考にすれば OK かと。

# apt-get install binfmt-support
# dpkg -i qemu-user-static*.deb
# mkdir -p /media/sdd2/usr/lib/qemu-binfmt
# cp /usr/bin/qemu-arm-static /media/sdd2/usr/lib/qemu-binfmt/arm
# mount -t proc proc /media/sdd2/proc
# LANG=C chroot /media/sdd2
    (エラーがでずに chroot 環境に入れたら成功!)

# debootstrap/debootstrap --second-stage
    (ここでパッケージが設定されます)

これでベースシステムがインストールできました。
せっかく KNOPPIX でネットワークなどがつながる環境にありますので、必要に応じてベース環境の設定を行っておくのがよいでしょう。


今日はここまで。