SVX日記
2006-11-27(Mon) WRAPでRHEL4
久々にWRAPでRHEL4を動かすプロジェクトを進捗(というか完遂?)したので、とりあえず覚え書き。
PC Engines WRAPにはSC1100という266MHz駆動のx86互換CPUが載っている。ただし、RHELは4からi686プラットフォーム以上が動作対象となったのがちょっとした壁だ。SC1100はMMX-Pentium相当であるから、i586相当なのである。
ちゅーわけで、必然的にRHEL4の純正カーネルは載らない。では、RHEL4を動かすことはできないかといえばさにあらず。カーネルは別に用意すればいいのだ。しかし、全然違うカーネルを使ったんじゃ、RHELを使っている気分にならない。ここはRHEL4のソースRPMから「最低限の変更」でWRAP上で動くカーネルをビルドするのである。
まずは、母艦を用意。母艦にはいつも持ち歩いている愛用の赤いノートPCを使うのだが、このノートPCは非常に環境を成熟させてあるので、下手に壊すと仕事もプライベートも大変なことになる。バックアップは取らないまでも(!?)、慎重に作業を行う。
RHEL ES 4のインストールDVDから起動。6Gほど浮いているDドライブを開放して、2GをLinux用に確保する。残りの4GはVFAT(FAT32)にしてWinXP環境と相互に読み書きできるようにするつもり。
基本的にLinuxは超デフォルトインストール。ただし英語環境、ネットワークは使わない、GRUBのインストール先はパーティションの先頭でForceLBA32を有効、サーバに必要なパッケージ以外に、開発環境も入れる(デフォルト?)。
インストールが完了したら、再度インストールディスクを使いrescueモードで起動。4GをVFATでフォーマットしつつ、Linuxパーティション先頭にある512バイトのGRUBをddでVFAT領域に書き出す。
今度はWinXPを立ち上げる。ddで書き出したGRUBをC:\grub.lnxとして配置して、C:\boot.iniに「C:\grub.lnx="Red Hat Enterprise Linux ES 4"」を追加する。これでLinuxでもブートできるマルチブート環境の完成である。つい先日までGRUBに詳しくなかったので、この作業の意味がわからなくて設定する気が起きなかったオイラだが、今ではよく理解できているので、気分よくマルチブートできるオイラである。
次にLinuxを立ち上げたらカーネルをコンパイルするので、某所から手に入れたカーネルソースである「kernel-2.6.9-42.0.3.EL.src.rpm」をDドライブに配置しておく。置いたらLinuxでブートである。
Linuxでブートしたら、VFATのDドライブをマウントし、/usr/src/redhatからシンボリックリンクを張る。カーネルのコンパイルには2Gじゃちょっと心もとないからだ。4Gの作業領域を確保したら、カーネルソースを展開しよう。
# rpm -ivh kernel-2.6.9-42.0.3.EL.src.rpm
/usr/src/redhat/SPECS # rpmbuild --target=i686 -bp kernel-2.6.spec
/usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 # make menuconfig
Processor type and features --->
Processor family (Pentium-MMX) --->
(X) Pentium-MMX
Device Drivers --->
Networking support --->
Ethernet (10 or 100Mbit) --->
<*> National Semiconductor DP8381x series PCI Ethernet support
Networking options --->
[*] IP: kernel level autoconfiguration
Character devices --->
Watchdog Cards --->
<M> National Semiconductor SCx200 Watchdog
I2C support --->
I2C Hardware Bus support --->
<M> NatSemi SCx200 ACCESS.bus
File systems --->
Network File Systems --->
<*> NFS file system support
[*] Root file system on NFS (NEW)
カスタマイズの結果は/usr/src/redhat/BUILD/kernel-2.6.9/linuxの下に.configとして記録されるので、これをkernel-2.6.9-i586.configとして/usr/src/redhat/SOURCESの下にコピー。
diff -r -c linux-2.6.9/include/asm-i386/param.h linux-2.6.9-wrap/include/asm-i386/param.h
*** linux-2.6.9/include/asm-i386/param.h 2004-10-19 06:53:24.000000000 +0900
--- linux-2.6.9-wrap/include/asm-i386/param.h 2006-11-26 02:15:49.688947304 +0900
***************
*** 2,8 ****
#define _ASMi386_PARAM_H
#ifdef __KERNEL__
! # define HZ 1000 /* Internal kernel timer frequency */
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
#endif
--- 2,8 ----
#define _ASMi386_PARAM_H
#ifdef __KERNEL__
! # define HZ 100 /* Internal kernel timer frequency */
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
#endif
diff -r -c linux-2.6.9/fs/nfs/nfsroot.c linux-2.6.9-wrap/fs/nfs/nfsroot.c
*** linux-2.6.9/fs/nfs/nfsroot.c 2006-11-26 02:07:09.743990952 +0900
--- linux-2.6.9-wrap/fs/nfs/nfsroot.c 2006-11-26 02:45:57.976045880 +0900
***************
*** 125,130 ****
--- 125,131 ----
Opt_nointr, Opt_posix, Opt_noposix, Opt_cto, Opt_nocto, Opt_ac,
Opt_noac, Opt_lock, Opt_nolock, Opt_v2, Opt_v3, Opt_udp, Opt_tcp,
Opt_broken_suid,
+ Opt_acl, Opt_noacl,
/* Error token */
Opt_err
};
*** kernel-2.6.spec 2006-12-27 14:52:16.000000000 +0900
--- kernel-2.6.spec.my 2007-01-05 14:13:22.000000000 +0900
***************
*** 41,47 ****
%define KVERREL %{PACKAGE_VERSION}-%{PACKAGE_RELEASE}
# groups of related archs
! %define all_x86 i686
# Override generic defaults with per-arch defaults
--- 41,47 ----
%define KVERREL %{PACKAGE_VERSION}-%{PACKAGE_RELEASE}
# groups of related archs
! %define all_x86 i686 i586
# Override generic defaults with per-arch defaults
***************
*** 58,63 ****
--- 58,68 ----
%define buildhugemem 0
%endif
+ %ifnarch i586
+ %define buildsmp 0
+ %define buildhugemem 0
+ %endif
+
# Second, per-architecture exclusions (ifarch)
%ifarch %{all_x86}
***************
*** 200,205 ****
--- 205,211 ----
Source11: genkey
Source12: modsign_exclude
+ Source21: kernel-%{kversion}-i586.config
Source22: kernel-%{kversion}-i686.config
Source23: kernel-%{kversion}-i686-smp.config
Source24: kernel-%{kversion}-i686-hugemem.config
***************
*** 1303,1308 ****
--- 1309,1315 ----
Patch10001: linux-2.6.9-exports.patch
Patch10002: linux-2.6.9-slab-update.patch
Patch10003: linux-2.6.9-pci-ids.patch
+ Patch10004: linux-2.6.0-wrap.patch
# empty final patch file to facilitate testing of kernel patches
Patch20000: linux-kernel-test.patch
***************
*** 3234,3239 ****
--- 3241,3249 ----
# patch for pci ids
%patch10003 -p1
+ # patch for wrap
+ %patch10004 -p1
+
# make sure the kernel has the sublevel we know it has. This looks weird
# but for -pre and -rc versions we need it since we only want to use
# the higher version when the final kernel is released.
/usr/src/redhat/SPECS # rpmbuild --target=i586 -ba kernel-2.6.spec
余計なモジュールもすべてコンパイルされるのでかなり時間がかかるが「最低限の変更でRHEL4をWRAP上で動かす」という趣旨なので楽しんで待つ。無事に完了すると/usr/src/redhat/RPMS/i586の下にkernel-2.6.9-42.0.3.EL.i586.rpmができているはずだ。ここからカーネル本体を取り出す。
/root/kernel # rpm2cpio /usr/src/redhat/RPMS/i586/kernel-2.6.9-42.0.3.EL.i586.rpm | cpio -div
title Red Hat Enterprise Linux (2.6.9-42.0.3.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-42.0.3.EL ro root=/dev/nfs nfsroot=/home/wrap/root ip=192.168.4.1:192.168.5.129:192.168.4.17:255.255.255.0:wrap-x1:eth1:off console=ttyS0,38400
<block_device index="11" path="\DosDevices\d:\es4.img" enabled="true" />
# mount /dev/cobd11 /home/wrap/root
# vi /etc/exports
/home/wrap/root *(rw,no_root_squash)
# service nfs start
ウチのWinXPはルーティングサービスを有効にしているので、ルートをちゃんと設定してやれば外部からcoLinuxのNFSに接続することができる。以下は順に、WRAPに付加するIPアドレス、NFSサーバ(coLinuxの仮想)のIPアドレス、ゲートウェイ(WinXPの物理)のIPアドレス、ネットマスク、WRAPのホスト名、WRAPのネットワークデバイス名、自動設定(無効)であり、この内容はカーネルのドキュメント/usr/src/linux/Documentation/nfsroot.txtにすべて書いてある通りだ。
ip=192.168.4.1:192.168.5.129:192.168.4.17:255.255.255.0:wrap-x1:eth1:off
さて、あとは起動のみ。WRAPの真ん中のイーサポートとノートPCとをクロスケーブルで接続、WRAPのシリアルポートとノートPCをUSBシリアル変換ケーブル経由でこれもクロスケーブルで接続、WRAPの電源ジャックにACアダプタから12Vを供給する。
Booting 'Red Hat Enterprise Linux ES (2.6.9-42.0.3.EL)'
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz-2.6.9-42.0.3.EL ro root=/dev/hda1 console=ttyS0,38400
[Linux-bzImage, setup=0x1400, size=0x19813a]
Linux version 2.6.9-42.0.3.EL (root@localhost.localdomain) (gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)) #1 Sun Nov 26 14:16:00 JST 2006
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 0000000008000000 (usable)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
natsemi eth0: NatSemi DP8381[56] at 0x80000000 (0000:00:0e.0), 00:0d:b9:04:ad:9c, IRQ 10, port TP.
natsemi eth1: NatSemi DP8381[56] at 0x80040000 (0000:00:0f.0), 00:0d:b9:04:ad:9d, IRQ 9, port TP.
natsemi eth2: NatSemi DP8381[56] at 0x80080000 (0000:00:10.0), 00:0d:b9:04:ad:9e, IRQ 11, port TP.
eth1: DSPCFG accepted after 0 usec.
eth1: link up.
eth1: Setting full-duplex based on negotiated link capability.
IP-Config: Complete:
device=eth1, addr=192.168.4.1, mask=255.255.255.0, gw=192.168.4.17,
host=wrap-x1, domain=, nis-domain=(none),
bootserver=192.168.5.129, rootserver=192.168.5.129, rootpath=
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
Looking up port of RPC 100003/2 on 192.168.5.129
Looking up port of RPC 100005/1 on 192.168.5.129
VFS: Mounted root (nfs filesystem) readonly.
Freeing unused kernel memory: 172k freed
Warning: unable to open an initial console.
SELinux: Disabled at runtime.
SELinux: Unregistering netfilter hooks
……eth1の設定も完了し「Warning: unable to open an initial console.」で止まった……これ、どっかで見たことある……そうそう、coLinuxにWBEL4を入れた時だッ!! NFS上のルートファイルシステムをcoLinux上からイジる。
wbel4-co:/home/wrap/root/dev # mknod -m 600 console c 5 1
wbel4-co:/home/wrap/root/dev # mknod -m 666 null c 1 3
wbel4-co:/home/wrap/root/dev # mknod -m 666 zero c 1 5
Welcome to Red Hat Enterprise Linux ES
Press 'I' to enter interactive startup.
Starting udev: [ OK ]
Initializing hardware... storage network audio done[ OK ]
Configuring kernel parameters: [ OK ]
Setting clock (localtime): Sat Jan 1 00:00:54 JST 2000 [ OK ]
Setting hostname localhost.localdomain: [ OK ]
Remounting root filesystem in read-write mode: mount: no such partition found
<中略>
Setting network parameters: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: Device eth0 has different MAC address than expected, ignoring.
[FAILED]
touch: cannot touch `/var/lock/subsys/network': Read-only file system
Starting system logger:
Remounting root filesystem in read-write mode: mount: no such partition found
LABEL=/1 / ext3 defaults 1 1
/dev/nfs / ext3 defaults 1 1
Starting sshd:[ OK ]
Starting xinetd: [ OK ]
Starting sendmail: make: Warning: File `Makefile' has modification time 1.5e+08 s in the future
make: warning: Clock skew detected. Your build may be incomplete.
[ OK ]
Starting sm-client: [ OK ]
Starting console mouse services: [ OK ]
Starting crond: [ OK ]
Starting xfs: [ OK ]
Starting anacron: [ OK ]
Starting atd: [ OK ]
Starting system message bus: [ OK ]
Starting cups-config-daemon: [ OK ]
Starting HAL daemon: [ OK ]
Warp奮闘日記面白いですね。わたしもPcEngineで遊んでみようと思います。OSは素直にPyramidLinux にして + iptable + ipset + ulog でルータとログ解析が用途です。セットアップの参考にさせてもらいます。