2014年03月08日

シリアルコンソールがなくても、HDL-GXRのカーネルを2.6.28に入れ替える

Lenny化したHDL-GXRであるが、Squeezeにするためには、カーネルが2.6.26以降でなくてはならない。OLP2.0のカーネルは2.6.12なので、カーネルを入れ替える必要がある。

カーネルパッチは、2.6.28のものを作ってらっしゃる方がいるので(「HDL-GXR 対応 linux カーネルパッチの使い方」参照)、コンパイルはできるのだが、これをブートさせるのにはシリアルコンソールを繋いで、u-bootにカーネルパラメータを与えなければならない(と思う)。
UARTの口は基盤にスルーホールがあいていて、繋げば即いけるかと思わせるがそうでもなく、TTL-CMOSレベル変換回路がないとダメである。あいにく持っておらず、通販で買おうにも注文して届くのに時間が掛かる。待ってられない!
ということで、シリアルコンソールがなくても無理矢理カーネル2.6.28をブートさせちまおう、という手順の記録。

1. 用意する物
  1. クロスコンパイルするDebian Squeezeが動いてるPC(※VirtualPCでもいいし、下のPCと同じでもいい)
  2. Lenny化したHDL-GXR
  3. Linuxが動いているPC(失敗した時用)
  4. USB-SATA接続キット(失敗した時用)
時間が掛かってもいいなら、HDL-GXR単体だけでも可能。

2. クロスコンパイル環境を作る
セルフコンパイルするならこの手順飛ばして可。
Squeezeが動いてるPCで、/etc/apt/sources.list にemdebianを追加する。# vi /etc/apt/sources.list

(追加)
deb http://www.emdebian.org/debian/ squeeze main

# aptitude install emdebian-archive-keyring
# aptitude update
次いで、コンパイルに必要なツールをインストール。# aptitude install build-essential ncurses-dev \
uboot-mkimage libc6-dev-armel-cross gcc-4.3-arm-linux-gnueabi \
binutils-arm-linux-gnueabi
3. カーネルにパッチを当てる
カーネルソース、パッチをダウンロードして、パッチを当てる。# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz
# 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()の中を書き換える。// arch/arm/kernel/setup.c L.608

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;
}
ソースを変更したら、カーネルのconfigをいじる。
# ARCH=arm make menuconfig
設定をいろいろする。
必ず設定するのは、
Boot options ->
Default kernel command string
console=ttyS0,115200 root=/dev/sda3 ro mem=128Mとする。(ここが4.で渡されるカーネルオプションになる。と思う)。
もしSqueeze化するなら、
General setup ->
Create deprecated sysfs files
をオフにする。
.configで
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/sda3 ro mem=128M"
CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
# CONFIG_SYSFS_DEPRECATED_V2 is not set
(下3つはSqueeze化するときは必要)となる。

5. コンパイルして、HDL-GXRに新しいカーネルを入れる
# ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make uImage modules
# 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なら、# tar xvfz kern.tgz -C /boot (さっき作ったカーネルを展開)
# 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-2-6-28.png
失敗した時は、HDL-GXRのディスクを取り外してLinuxが動いているPCにつなぎ、sda1 をマウントして、バックアップしておいた uImage.gxr.bak を uImage.gxr に戻せば、2.6.12のカーネルで起動できる。
posted by usoinfo at 14:56 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]