CuBox に Debian Wheezy をインストール

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

あとは煮るなり焼くなり。