Linux Kernel 2.6.29 to 2.6.32 on OBS600

目的

OpenBlocks600においてDebianをKernel 2.6.29で動かしているが、NFSクライアントでSegmentation Faultがでる。どうにも解消できないため、Kernelを2.6.32に上げてみる。 SSD/Linuxのネイティブビルドだと時間がかかりそうなので、VMWareイメージを使ってMacでKernelをコンパイルする。Flashに焼く用のSSD/Linux uImageと、CFにおいてu-Bootから起動する用のuImageをつくる。CFブート用のuImageをFlashに焼くこともできるが、不具合があったときの復旧のすべがtftpbootしかないため設定が面倒である。

手順

1.SSD/Linux i386版のVMWareイメージをMacOSXで動かす。 SSD/Linux i386版のVMWareイメージをプラットホームのWebからダウンロードする。ハードディスクイメージとフロッピーディスクイメージが必要。フロッピーディスクイメージからブートする。VMWareイメージはVirtualBoxでも動くので、MacOSXでも無償で動かせる。

2.VMWareイメージから起動したSSD/Linux i386を設定する。 root/rootでログインして、IPアドレスの取得はdhclient eth0が楽。

3.VMWareのSSD/Linux側ファイルの変更 ~root/.bash_profile

if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi
export PATH=$PATH:/usr/cross/mipsel/bin:/usr/cross/powerpc/bin:/usr/cross/x86_64/bin
export CVSROOT=:pserver:anoncvs@cvs.plathome.co.jp:/cvs/ssdlinux
export HOSTTYPE MACHTYPE SHELL

4.VMWareのSSD/Linux側ファイルの変更 /etc/mk.conf

#       $ssdlinux: mk.conf.in,v 1.6 2010/04/20 01:49:07 kimura Exp $
#DESTDIR?=	/home/dest
#RELEASEDIR?=	/home/release
#RCS_LOCALID?=	ssdlinux
SSDCVSTAG?=
#SSDCVSDATE?=	20020420


# alternate kernel config which instead of 
# mkdist/kernel/dot.config.* if required 
#KERNEL_CONFIG?=	/usr/src/my_kernel_config
KERNEL_CONFIG?=	/usr/src/my_kernel_config
KERNEL_MAJOR=2
KERNEL_MINOR=6
KERNEL_PATCHLEVEL=32


# Cross Compile for OpenBlockS
CROSS_BUILD?=	powerpc
DESTDIR?=	/home/dest-powerpc
RELEASEDIR?=	/home/release-powerpc


# OPENBLOCKS    'obs50','obs200','obs266','obs600' or 'none'
OPENBLOCKS?=	obs600


HAVE_CVS?=	yes
DEVELOPTOOLS?=	yes
USE_PAM?=	yes
USE_PCMCIA?=	yes
USE_EXT3FS?=	yes
IPV6?=		no


SSDVERSION=	0.5


# MTA		'sendmail' or 'postfix'
MTA?=		sendmail

5.SSD/Linux最新版ソースの取得 VMWareのSSD/Linux側で下記のコマンドを実行する。

# cd /usr
# cvs login
CVS password: anoncvs
# cvs co -P src

6.Linux Kernel .configファイルのコピー、カスタマイズ VMWareのSSD/Linux側で下記のコマンドを実行する。

# cp -p /usr/src/mkdist/kernel/2.6.32/dot.config.powerpc-obs600 /usr/src/my_kernel_config

AUTOFSを有効にしたいので、/usr/src/my_kernel_configに下記の行を追記する。

CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m

7.SSD/Linuxソースツリーのコンパイル VMWareのSSD/Linux側で下記のコマンドを実行する。

# cd /usr/src
# bmake -DNOCLEAN build

8.ファームウェアの作成 VMWareのSSD/Linux側で下記のコマンドを実行する。

# date; pushd /usr/src/distrib/powerpc-obs600/cfboot/; bmake clean; bmake; date
# date; pushd /usr/src/distrib/powerpc-obs600/standard/; bmake clean; bmake; date
# cd /tmp
# mkdir /tmp/2632
# cp -p /usr/src/distrib/powerpc-obs600/cfboot/treeboot/uImage.initrd-cfboot /tmp/2632/
# cp -p /usr/src/distrib/powerpc-obs600/standard/treeboot/uImage.initrd /tmp/2632/
# cp -p /home/dest-powerpc/System.map /tmp/2632/
# cp -p /home/dest-powerpc/System.map.2632 /tmp/2632/
# (cd /home/dest-powerpc; tar cf /tmp/2632/kern.tar lib/modules/2.6.32)
# tar zcf 2632.tgz 2632

uImage.initrd-cfbootがCFに置く用、uImage.initrdがFlashに焼く用である。

9.ファームウェアをOBS600にとりこむ。 なんとかして2632.tgzをOBS600へ送る。デバイスファイルの問題があるので、ramdiskからブートしたSSD/Linuxを使うとよい。ファイルの受けわたしはどこかのftpサーバを介するのが楽。 OBS600側で下記のコマンドを実行する。/tmpに2632.tgzを置いた場合の例。

# cd /tmp
# tar zxf 2632.tgz
# mount LABEL=/ /mnt
# cp -p 2632/uImage.initrd-cfboot /mnt/
# cp -p 2632/System.map /mnt/
# cp -p 2632/System.map.2632 /mnt/
# (cd /mnt; tar zxf /tmp/2632/kern.tar)
# (cd /mnt; find lib/modules/ -type f -name "*.ko.gz" | xargs gzip -d)
# depmod -b /mnt -a
# flashcfg -f 2632/uImage.initrd
# flashcfg -c cf
# shutdown -r now

これで、CF上のDebianはCFのKernelで起動する。本体のボタンを押しながら電源を入れれば、Flash上のSSD/Linuxが起動する。 ここまでの作業でLinux Kernel 2.6.29→2.6.32の更新ができているはずである。ここまでやったらさすがにNFSクライアントもSegmentation Faultすることなくmountできた。AUTOFSもだいじょうぶ。めでたしめでたし。