2014年02月25日

Debian Squeeze化した玄箱に最新の2.6系カーネルを入れる

Squeezeにするまでの手順は、簡単に言うと、Lennyを入れてしかる後Squeezeにアップグレードすればよろしい。
(ここ http://siruko.com/kuro/debian.htmlなどを参考にさせて頂いた)

Squeezeになったものは、カーネルのバージョンは2.6.25。これでUSB無線LANを使おうとカーネルをコンパイルしたりしたのだがどうにもラチがあかず、最新のカーネルにすることにした。
なかなかうまくいかずに試行錯誤して、どうやら出来たので手順をメモしておく。

1. カーネルをコンパイルする

セルフコンパイル環境も玄箱上に作ってあるが、時間が掛かって仕方ないので、クロスコンパイルで行うことにする。セルフコンパイルの時は、1-3.から、CROSS_COMPILE=powerpc-linux-gnu- を削除して読み替えればよい。

1-1. クロスコンパイルするマシンを用意

aptの使える手頃なLinuxがある場合はそれを使っていいが、手元になかったので、Oracle VM VirtualBoxを使って仮想マシンにDebian Squeezeをインストールした。
- Oracle VM VirtualBox
- Debian Squeeze
玄箱に合わせてSqueezeを選択。ネットワークインストールでデスクトップ環境を外して最小限インストール(どうせコンパイルするだけなのでデスクトップいらないし)にしたが、この辺はお好み。

1-2. クロスコンパイル環境を用意

/etc/apt/sources.list に以下の1行を追加
deb http://www.emdebian.org/debian/ squeeze main
したら、updateしてツールを入れる。
# aptitude install emdebian-archive-keyring
# aptitude update
# aptitude install build-essential ncurses-dev \
libc6-dev-powerpc-cross gcc-4.3-powerpc-linux-gnu \
binutils-powerpc-linux-gnu uboot-mkimage

1-3. カーネルをビルド
1-3-1. ソースを展開してconfigを生成
2014/02/25で2.6系の最新は2.6.39.4だったのでこれを使う。
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.bz2
tar jxvf linux-2.6.39.4.tar.bz2
cd linux-2.6.39.4
ARCH=powerpc make linkstation_defconfig

1-3-2. .config を編集

MTDのため、.configが以下になるようにするらしい。
面倒なので、viで.configを書き換える。662行目あたりから
#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
CONFIG_MTD_PHYSMAP=y
# CONFIG_MTD_PHYSMAP_COMPAT is not set
# CONFIG_MTD_PHYSMAP_OF is not set
# CONFIG_MTD_INTEL_VR_NOR is not set
# CONFIG_MTD_PLATRAM is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
CONFIG_MTD_PHYSMAP=y
CONFIG_MTD_PHYSMAP_COMPAT=y
CONFIG_MTD_PHYSMAP_START=0xffc00000
CONFIG_MTD_PHYSMAP_LEN=0x400000
CONFIG_MTD_PHYSMAP_BANKWIDTH=1
と変更。
ARCH=powerpc make menuconfig

で該当箇所を変更しても可。

1-3-3. ビルド

カーネルとモジュールをビルドし、出来上がりを、仮に /opt/ppc/ (どこでもいいけど) 以下に入れておく。
# ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- make uImage modules
# ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- INSTALL_MOD_PATH=/opt/ppc make modules_install
# scripts/dtc/dtc -f -I dts -O dtb -o /opt/ppc/boot/kuroboxHD.dtb \
-V 16 arch/powerpc/boot/dts/kuroboxHD.dts
- ※玄箱HGは、
scripts/dtc/dtc -f -I dts -O dtb -o /opt/ppc/boot/kuroboxHG.dtb \
-V 16 arch/powerpc/boot/dts/kuroboxHG.dts
だと思われる。

mkdir -p /opt/ppc/boot
cp -p arch/powerpc/boot/uImage /opt/ppc/boot/vmlinux.UBoot
cp -p System.map /opt/ppc/boot/
出来たカーネルとモジュールを玄箱に入れるので、tarで固めておく。
pushd /opt/ppc/
tar cvfz kuro-kern.tgz boot
tar cvfz kuro-lib.tgz lib
popd

2. 玄箱のブート環境を整備する

玄箱のHDDは、次のパーティションだと仮定する。
/dev/sda1 MontaVista Linuxの(オリジナルの)/パーティション
/dev/sda2 swap
/dev/sda3 Debian Squeezeの/パーティション
Debian Squeeze化した状態では、起動は、"sda1の /boot/loader.o から /boot/vmlinuz.bin が走る"ことになっていると思われるが、これを"/boot/uloader-2.4.17_mvl21-sandpoint.o から /boot/u-boot-1.2.0-hd.ram.bin から /boot/vmlinux.UBoot"になるようにする。

2-1. 必要なファイルの入手

玄箱/玄箱HG 用 ubuntu 12.04 LTS imageより、kuro-bootsel2.20080419.tar.gzubuntu-precise-installer.zip を頂戴してくる。

2-2. ブート用のファイルを配置

ubuntu-precise-installer.zip を解凍して、次のファイルを玄箱の sda1:/boot に置く。
u-boot-1.2.0-hd.ram.bin
uloader-2.4.17_mvl21-sandpoint.o
※玄箱HGでは
u-boot-1.2.0-hg.ram.bin
uloader-2.4.17_mvl21.o
のはず。
Debian Squeezeが動いているなら、scpなりで転送して、
# mount /dev/hda1 /mnt
# cp u-boot-1.2.0-hd.ram.bin /mnt/boot
# cp uloader-2.4.17_mvl21-sandpoint.o /mnt/boot
など。玄箱からHDDを取り出して、Linuxマシンにマウントしても可。
このU-BOOTは、rootが/dev/sda3、コンソールの玄箱側192.168.0.151、nc側192.168.0.150 とのこと。

次に、kuro-bootsel2.20080419.tar.gz を玄箱MontaVista上で解凍して、install.shを実行。
あるいは、玄箱Debian上で解凍して、install.shの内容を手作業で実行。
# mount /dev/hda1 /mnt
# mkdir -p /mnt/boot/tools
# cp kuro_swread kuro_morse /mnt/boot/tools/
# cp kuro_bootsel2.sh /mnt/etc/init.d/
# chmod 755 /mnt/etc/init.d/kuro_bootsel2.sh
# pushd /mnt/etc/rc.d/rcS.d
# ln -s ../init.d/kuro_bootsel2.sh S15kuro_bootsel2.sh
# popd
# cp kuro_boot.conf /mnt/etc/

2-3. kuro_bootsel2.sh を変更

/etc/init.d/kuro_bootsel2.sh を次のように変更。
101行目から
if [ ! -f $2 ]; then
/bin/echo "Kernel does not exist."
/boot/tools/kuro_morse F $AVR
return 0;
fi
init_avr

# if [ ! -f $2 ]; then
# /bin/echo "Kernel does not exist."
# /boot/tools/kuro_morse F $AVR
# return 0;
# fi
if [ -f $2 ]; then
/sbin/insmod $1 kernel=$2 $3
else
echo /sbin/insmod $1 $2 $3
/sbin/insmod $1 $2 $3
echo /sbin/init 6
/sbin\/init 6
fi
init_avr
とする。

(している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "101,105 s/^./#/" -e "110 s/^./#/" ... と同じである。)

2-4. kuro_boot.conf を変更

sda1:/etc/kuro_boot.conf を、uloaderを起こしに行くように書き換える。念のため古いバージョンは取っておいた方がいいかもしれない。
# cp kuro_boot.conf kuro_boot.conf.org
# vi kuro_boot.conf
# kuro_bootsel config file (2008-04-01)
#
# "bootdefault"
# 1: Linux, 2-9: See below
bootdefault=2

(略)

# Menu entry No.2
#
menu2="Debian"
loader2="-f /boot/uloader-2.4.17_mvl21-sandpoint.o"
kernel2='uboot=/boot/u-boot-1.2.0-hd.ram.bin'
option2=''
(している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "s/^#bootdefault=1$/bootdefault=2/" ... と同じである。)

配置したファイル名を書く。玄箱HGなら、
loader2="-f /boot/uloader-2.4.17_mvl21.o"
kernel2='uboot=/boot/u-boot-1.2.0-hg.ram.bin'
のはず。

3. カーネルとモジュールを配置

先ほど作ったカーネルとモジュールを、玄箱に持ってきて配置する。
カーネルは sda1 の /boot へ。
モジュールは sda3 の /lib/moduels へ。

kuro-kern.tgz と kuro-lib.tgz を玄箱に持って行って、
※Debian Squeeze 上なら
# mount /dev/hda1 /mnt
# tar xvfz kuro-kern.tgz -C /mnt
# umount /mnt
# tar xvfz kuro-lib.tgz -C /
玄箱からHDDを取り出していれば、sda1とsda3をそれぞれマウントして展開。

4. fstab を変更

カーネルを2.6.25から2.6.39に変えると、ハードディスクの見え方が /dev/hda から /dev/sda になる。sda3:/etc/fstab に書いてあるのは/dev/hdaなので、変更する。
hdaとsdaを両方書いておけば、ない方は失敗するだけなので、古いカーネルでブートした時もマウントされるようになる。
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda2 none swap sw 0 0
/dev/hda3 / ext3 defaults,noatime,errors=remount-ro 0 0
/dev/sda2 none swap sw 0 0
/dev/sda3 / ext3 defaults,noatime,errors=remount-ro 0 0


5. 祈りながらリブート

イーサネットの口がついたLinuxマシンがあれば、netcatをインストールしてコンソールを見られる。
玄箱のイーサとマシンのイーサを繋いで、玄箱のスイッチをクロス側にして、
# aptitude install netcat
# ifconfig eth0 192.168.0.150 netmask 255.255.255.0 up
# nc -v -v -n -u -s 192.168.0.150 -p 6666 192.168.0.151 6666
として、玄箱を再起動。
うまくできていれば、コンソール出力が出てきて、玄箱がブートするはずである。

出力こんな感じ。
# nc -v -v -n -u -s 192.168.0.150 -p 6666 192.168.0.151 6666
Connection to 192.168.0.151 6666 port [udp/*] succeeded!

U-Boot 1.2.0 (Mar 26 2009 - 17:24:32) LinkStation / KuroBox
stdin : nc
stdout: nc
stderr: nc
IDE: Bus 0: OK
Device 0: Model: TRANSCEND Firm: Ser#: 0507070840470450
Type: Removable Hard Disk
Capacity: 3907.9 MB = 3.8 GB (8003520 x 512)
Boot in 01 seconds ('s' to stop)...
Loading 0:1:boot/vmlinux.UBoot

1937671 bytes read

2387 bytes read
## Booting image at 00800000 ...
Image Name: Linux-2.6.39.4
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 1937607 Bytes = 1.8 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
Booting using flat device tree at 0x7f0000
Using Buffalo Linkstation machine description
Linux version 2.6.39.4 (root@yakisoba.usoinfo.info) (gcc version 4.3.5 (Debian 4.3.5-4) ) #4 Tue Feb 25 11:33:17 JST 2014
bootconsole [udbg0] enabled
Adding PCI host bridge /soc10x/pci@fec00000
PCI host bridge /soc10x/pci@fec00000 (primary) ranges:
IO 0x00000000fe000000..0x00000000febfffff -> 0x0000000000000000
MEM 0x0000000080000000..0x00000000efffffff -> 0x0000000080000000
BUFFALO Network Attached Storage Series
(C) 2002-2005 BUFFALO INC.
Zone PFN ranges:

(略)


いけなくなった場合、EMモードで立ち上げるか玄箱からハードディスクを外してLinuxマシンでマウントし、sda1:/etc/kuro_boot.conf の2番を古いものに書き換えて起動し直せば、2.6.25のカーネルで立ち上げられる。
menu2="Debian"
loader2="-f /boot/loader.o"
kernel2=/boot/vmlinux.bin
option2='cmdline="root=/dev/hda3"'

ようやく玄箱で無線LAN(GW-US54Mini2)がrt73usbで使えるようになった。
しかし、どうも通信が不安定で、ディレイがひどく大きくなったりする。USBハブを挟んでいるのが原因かと思って直結にしてみたが、あまり状況は改善されない。CPUパワーはそんなに食っているようには見えないけど、WPAを使っているせいかなあ。。。現状、使えるとは言いにくい。

フロントのUSBの端子を引き出して、直結。
P2250121s.jpg
[追記]
無線LANが不安定なのは、省電力機能がどうも悪さをしている模様であった。
# iwconfig wlan0 power off
で、遅延もパケットロスもなくなった。
/etc/network/interfaces に、post-up /sbin/iwconfig wlan0 power off と書いて、解決。
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
post-up /sbin/iwconfig wlan0 power off
address 192.168.128.x
network 192.168.128.0
netmask 255.255.255.0
broadcast 192.168.128.255
gateway 192.168.128.1
これで無線LAN内蔵の省電力Debianサーバーの出来上がりだ!
posted by usoinfo at 16:17 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする