カーネルパッチは、2.6.28のものを作ってらっしゃる方がいるので(「HDL-GXR 対応 linux カーネルパッチの使い方」参照)、コンパイルはできるのだが、これをブートさせるのにはシリアルコンソールを繋いで、u-bootにカーネルパラメータを与えなければならない(と思う)。
UARTの口は基盤にスルーホールがあいていて、繋げば即いけるかと思わせるがそうでもなく、TTL-CMOSレベル変換回路がないとダメである。あいにく持っておらず、通販で買おうにも注文して届くのに時間が掛かる。待ってられない!
ということで、シリアルコンソールがなくても無理矢理カーネル2.6.28をブートさせちまおう、という手順の記録。
1. 用意する物
- クロスコンパイルするDebian Squeezeが動いてるPC(※VirtualPCでもいいし、下のPCと同じでもいい)
- Lenny化したHDL-GXR
- Linuxが動いているPC(失敗した時用)
- USB-SATA接続キット(失敗した時用)
2. クロスコンパイル環境を作る
セルフコンパイルするならこの手順飛ばして可。
Squeezeが動いてるPCで、/etc/apt/sources.list にemdebianを追加する。
(追加)
deb http://www.emdebian.org/debian/ squeeze main
# aptitude install emdebian-archive-keyring
# aptitude update
uboot-mkimage libc6-dev-armel-cross gcc-4.3-arm-linux-gnueabi \
binutils-arm-linux-gnueabi
カーネルソース、パッチをダウンロードして、パッチを当てる。
# tar xvfz linux-2.6.28.tar.gz
# wget -O hdl-gxr.diff \
"http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?plugin=attach&refer=%C6%FC%B5%AD%2F2008-12-09%2FHDL-GXR%20%C2%D0%B1%FE%20linux%20%A5%AB%A1%BC%A5%CD%A5%EB%A5%D1%A5%C3%A5%C1&openfile=hdl-gxr.diff"
# wget -O hdl-gxr-config \
"http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?plugin=attach&refer=%C6%FC%B5%AD%2F2008-12-11%2FHDL-GXR%20%C2%D0%B1%FE%20linux%20%A5%AB%A1%BC%A5%CD%A5%EB%A5%D1%A5%C3%A5%C1%A4%CE%BB%C8%A4%A4%CA%FD&openfile=dot.config"
# cd linux-2.6.28
# patch -p1 < ../hdl-gxr.diff
# cp ../hdl-gxr-config ./.config
4. カーネルソースをいじくる
u-bootが渡してくるカーネルオプションを無視して、カーネルに埋め込んだオプションを使うようにしてしまう。
arch/arm/kernel/setup.c の 608行目あたり、parse_tag_cmdline()の中を書き換える。
static int __init parse_tag_cmdline(const struct tag *tag)
{
// strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
strlcpy(default_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
return 0;
}
設定をいろいろする。
必ず設定するのは、
Boot options ->をconsole=ttyS0,115200 root=/dev/sda3 ro mem=128Mとする。(ここが4.で渡されるカーネルオプションになる。と思う)。
Default kernel command string
もしSqueeze化するなら、
General setup ->をオフにする。
Create deprecated sysfs files
.configで
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/sda3 ro mem=128M"(下3つはSqueeze化するときは必要)となる。
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
# CONFIG_SYSFS_DEPRECATED_V2 is not set
5. コンパイルして、HDL-GXRに新しいカーネルを入れる
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=(どこか) make modules_install
※これで、arch/arm/boot/uImage と、(どこか)/lib/modules/以下のファイルを、HDL-GXRに持っていく。
例えば、
# mkdir -p /opt/arm/boot
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/opt/arm make modules_install
# cp -p arch/arm/boot/uImage /opt/arm/boot/uImage.new
# cp -p System.map /opt/arm/boot/
# cp -p .config /opt/arm/boot/config-2.6.28.hdl-gxr
# cd /opt/arm/boot
# tar cvfz ../kern.tgz .
# cd /opt/arm
# tar cvfz lib.tgz lib
で、/opt/arm/kern.tgz, /opt/arm/lib.tgz をHDL-GXRにscpなりで持って行く
出来たカーネルとモジュールを、それぞれHDL-GXRのsda1,sda3に配置する。
Lennyの動いてるHDL-GXRなら、
# mv /boot/uImage.gxr /boot/uImage.gxr.bak (念のため現在のカーネルをバックアップ)
# mv /boot/uImage.new /boot/uImage.gxr (新しいカーネルを配置)
# tar xvfz lib.tgz -C / (さっき作ったモジュールを展開)
リブートして、うまくいけば、2.6.28のカーネルで起動するはず。
失敗した時は、HDL-GXRのディスクを取り外してLinuxが動いているPCにつなぎ、sda1 をマウントして、バックアップしておいた uImage.gxr.bak を uImage.gxr に戻せば、2.6.12のカーネルで起動できる。
▼レンタルサーバー・VPS比較表を見る▼