CuBox に Debian Wheezy をインストールしたのでその作業メモ。
基本は Debian on CuBox – SolidRun CuBox Wiki の流れだが、私の環境ではうまく動かなかったため少し変更した。
うまくいかなかったのは次の 2 つの問題があったため。
- インストール途中で kernel panic になる問題
- インストール後 Debian の起動が途中で止まる問題
どちらも udevd の問題 (udevd と kernel の相性の問題?) のように見えたが深くは追っていない。
1 つ目の問題は udevd プロセスを kill することで回避可能だった。
2 つ目の問題はカーネルのバージョンを上げることで発生しなくなった。
ホストの環境は Debian Sid。
microSD カード (8GB) に Debian をインストールした。
カーネルのビルド
Building Linux Kernel – SolidRun CuBox Wiki や
Cubox with kernel 3.3.1 and Ubuntu Core 12.04 beta 2 – SolidRun CuBox Wikiを参考にして CuBox 用の kernel をビルドする。
rabeeh 氏が公開している CuBox 用カーネルソースを利用させて頂く。
$ git clone git://github.com/rabeeh/linux.git
$ cd linux
.config を生成する。
$ export ARCH=arm
$ export CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
$ make cubox_defconfig
HDMI 出力を使う予定はないので RAM を 1GB フルに使えるように設定を変更する。
$ vi .config
CONFIG_UIO_DOVE_VMETA_MEM_SIZE=256 -> 0 に変更
CONFIG_DOVE_GPU_MEM_SIZE=64 -> 0 に変更
ビルド。
$ make KALLSYMS_EXTRA_PASS=1 uImage
$ make modules
$ mkdir ../modules
$ INSTALL_MOD_PATH=../modules/ make modules_install
$ cd ../modules
$ tar czf ../modules.tar.gz *
以上で arch/arm/boot/uImage と modules.tar.gz が生成される。
boot.scr も生成しておく。
$ vi boot.script
echo ======== Setting bootargs ========
setenv bootargs ‘console=ttyS0,115200n8 root=/dev/mmcblk0p2’
echo ======== Loading kernel ========
mmcinfo
ext2load mmc 0:1 0x00200000 /uImage
echo ======== Booting kernel ========
bootm
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n “boot.script” -d boot.script boot.scr
インストーラの準備
Debian インストール USB メモリを作成する。
まず Debian のインストーラをダウンロードして uImage 形式に変換する。
$ sudo apt-get install uboot-mkimage
$ wget http://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/initrd.gz
$ mkimage -A arm -O linux -T ramdisk -C gzip -n “netboot image” -a 0x1a000000 -e 0x1a000000 -d initrd.gz uImage.initrd
同梱の microSD に入っている Ubuntu の /boot/boot.scr, /boot/uImage を取り出し、先程作成した uImage.initrd と共に USB メモリのルートにコピーする。
そして、前の手順で生成した uImage と modules.tar.gz, boot.scr を USB メモリの /debian/ 配下に置く。
USB メモリの内容はこんな感じ。
/boot.scr <- インストーラ用 boot.scr /uImage <- インストーラ用カーネル /uImage.initrd <- インストーラ initrd /debian/boot.scr <- Debian 用 boot.scr /debian/uImage <- Debian 用カーネル /debian/modules.tar.gz <- Debian 用モジュール
Debian のインストール
空の microSD カード (8GB) と Debian インストール用 USB メモリを CuBox に挿入して電源を投入する。
シリアルコンソールで U-Boot のプロンプトに入り、次のコマンドを入力する。
usb start
fatload usb 0:1 0x16000000 uImage
fatload usb 0:1 0x18000000 uImage.initrd
setenv bootargs console=ttyS0,115200 useNandHal=single
bootm 0x16000000 0x18000000
しばらく (2 分間ほど) udevd のエラーメッセージが流れ、その後インストーラが起動する。
udevd[88]: unable to receive ctrl connection: Function not implemented
udevd[88]: unable to receive ctrl connection: Function not implemented
…
そのままインストール作業を進めると途中に次のメッセージが出て止まってしまう。
kernel panic – not syncing: out of memory and no killable processes
起動時に出た udevd のエラーが怪しいと睨み udevd のプロセスを kill してみたところインストールを最後まで進めることが出来た。
なので、インストーラ起動直後に udevd の kill をしておく。
<Go Back> を選択
Execute a shell
# ps
# kill 88
# ps
# exit
あとは普通のインストール作業。以下メモ。
Continue the install without loading kernel modules? -> Yes
ファイルシステムは ext2 か ext3 にする。 ext4 は U-Boot が対応していないためブートできない。
#1 primary 199.2 MB
Use as : Ext3
Mount point: /boot
Bootable flag: on
#2 primary 7.7 GB
Use as : Ext3
Mount point: /
Bootable flag: off
Continue without installing a kernel? -> Yes
[*] SSH server
You will need to boot manually with the kernel on partition /dev/mmcblk0p1
and root=/dev/mmcblk0p2 passed as a kernel argument.
“Finish the installation” まできたら <Go Back> を選択しシェルに入る。
そして USB メモリの debian/ ディレクトリに置いてある boot.scr, uImage, modules.tar.gz を microSD カードにコピーする。
Excecute a shell
# mount /dev/sda1 /mnt
# cp /mnt/debian/boot.scr /mnt/debian/uImage /target/boot/
# cp /mnt/debian/modules.tar.gz /target/
# sync
# exit
電源を切り、起動確認。
起動した。root でログイン。
# cd /
# tar pxvzf modules.tar.gz
# tune2fs -c 0 -o journal_data_writeback /dev/mmcblk0p1
あとは煮るなり焼くなり。