SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|

2006-11-27(Mon) WRAPでRHEL4

  非常に久しぶりのエントリ。別にネタがなかったワケでもないのだが、電車の中でもソースを読みたいほどに、お仕事が面白い状態が続いたので、ブログを書く時間が取れなかった。

  久々にWRAPでRHEL4を動かすプロジェクトを進捗(というか完遂?)したので、とりあえず覚え書き。

  PC Engines WRAPにはSC1100という266MHz駆動のx86互換CPUが載っている。ただし、RHELは4からi686プラットフォーム以上が動作対象となったのがちょっとした壁だ。SC1100はMMX-Pentium相当であるから、i586相当なのである。

  それから、記憶装置も壁。WRAPにはCFスロットしか付いていないので、HDDは載らない。あまり大きなルートファイルシステムは載せられないのである。

  ちゅーわけで、必然的に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

  RHEL4のソースRPMにはi686用のビルドオプションしかないので、まずはi686でソースビルド。

/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の下にコピー。

  SC1100は非力なので、タイマ割り込みの間隔が1/1000だとオーバヘッドが(たぶん)大きい。RHEL3と同じ1/100に変更するパッチを作る。

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

  あと、nfsroot.cには非常にベタなバグがあるので、そのパッチも。

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
  };

  この記述はlinux-2.6.0-wrap.patchとして保存して、/usr/src/redhat/SOURCESの下に置く。次はspecファイルの修正。ざっと以下のとおり。

*** 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

  vmlinuz-2.6.9-5.ELをコンパクトフラッシュの/bootの下にコピー。/boot/grub/grub.confの設定行を修正する。

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

  ……と、実はルートファイルシステムはNFS上に確保するのであった。ここからはNFSサーバの設定。NFSサーバは玄箱にやらせる予定……だが、当面はWinXP内のcoLinuxにやらせるのである。

  レスキューモードで立ち上げて、Linuxの2GパーティションをそっくりVFATにes4.imgとして書き出し、それをcoLinuxのイメージファイルにする。

<block_device index="11" path="\DosDevices\d:\es4.img" enabled="true" />

  で、そいつをcoLinux上の/home/wrap/rootにマウントしたら、NFSでexportする。

# 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を供給する。

  GRUBが上がり2.6.9-42.0.3.ELカーネルを選択する……

  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.

  ……ネットワークデバイスをちゃんと3つ認識しつつ……

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:

  ……またキターッ!! が、Read-only? remountに失敗? あ、コレか?

Remounting root filesystem in read-write mode:  mount: no such partition found

  一瞬、理由がわからなかったが、なんのことはない。原因はコレだ。

LABEL=/1                /                       ext3    defaults        1 1

  NFSを使う場合はこう書く必要があるらしい。

/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  ]

  今度はkudzuも起動して、HAL daemonで止まった……が、この時点でsshdが上がっているのだ。ノートPCからsshでアクセスすると……


  ……これにて完了!!

本日のツッコミ(全1件) [ツッコミを入れる]

matzjiro [Warp奮闘日記面白いですね。わたしもPcEngineで遊んでみようと思います。OSは素直にPyramidLinux..]