EeePC 900-x に CentOS5.3 をPXEブートでインストール #1

自宅サーバにしてるThinkpad t23の液晶パネルが完全死亡したので、EeePC 900-xに移行しました。
EeePC 900-xいいね。小さい、省電力、SSD、安い。自宅サーバにぴったりだ。
入れるOSは今使ってるのと同じCentOS5.3。900-xには光学ドライブなんてついてないので、普通はUSB外付けドライブからブートしてインストールするんだろうけど、今回は気合でPXEブートでインストールしてみた。いや、外付けドライブを持っていないわけではないんだけど、単にやってみたかったんだ。
CentOSに900-xのNICドライバが入っていないので、正直めんどくさいよ。動かしたいだけだったらここからの作業はお勧めしない。おとなしく外付けドライブ使いましょう。

  • 構成

pxeサーバ(現サーバ): thinkpad23, CentOS5.3, 192.168.11.10
インストール先(新サーバ): EeePC 900-X
ブロードバンドルータを中心にした、192.168.11.0/24 なLAN内でやってます。

  • 前準備

現サーバの方は、カーネルが既に2回ほど上がっているので、一番古いカーネル(最初にDVDインストールイメージにはいってたやつ)で再起動しておく。
新サーバはBIOSの設定を変更。OnBoard LAN Boot ROM: Disable > Enable。Boot Booster,Quick Boot: Enable > Disable。ブートデバイスシーケンスの先頭をネットワークブートに変更。

  • pxeサーバの準備

dhcpdとかtftpdいれたりとか。この辺はググればいくらでも出てくるので書かない。
tftpの公開ディレクトリは以下のようにした。

/tftpboot/
|-- CentOS-5.3
|-- pxelinux.0
|-- pxelinux.cfg
|   `-- default
`-- syslinux
    `-- menu.c32

menu.c32は/usr/lib/syslinux/にあるのをコピってます。ブート画面がテキストのメニューになるので素敵です。
pxelinux.cfg/defaultはこんな感じ。ローカルブート出来るようにてしておくと、後々便利。

default syslinux/menu.c32

label CentOS-5.3
  kernel CentOS-5.3/vmlinuz
  append load initrd=CentOS-5.3/initrd-atl2plus_inst.img devfs=CentOS-5.3/nomount end

label Local
  LOCALBOOT 0

インストールイメージは、現サーバ作成時に使ったDVDイメージをt23の内臓ドライブからマウントして、apacheで公開。

# mkdir /mnt/iso
# mount -o loop -t iso9660 /dev/cdrom /mnt/iso
# cat<<EOT > /etc/httpd/conf.d/pxeboot.conf
>Alias   /CentOS-5.3 "/mnt/iso"
><Directory /mnt/iso>
>    Options MultiViews Indexes FollowSymLinks
>    Order deny,allow
>    Deny from all
>    Allow from 192.168.11.0/24 127.0.0.1
></Directory>
>EOT
# service httpd restart
  • initrdの準備

普通なら、ここで

# cp /mnt/iso/images/pxeboot/{initrd.img,vmlinuz} /tftpboot/CentOS-5.3/

とやって、クライアントをブートさせれば終了〜。なんだけど、initrdに900-XのNICのドライバが入ってないので、作り直さないといけない。
900-xのNICは、Attansic L2。ドライバのソースはここに落ちてる > http://ubuntuforums.org/showthread.php?t=429845
まずは、現サーバ上でインストール。

# cd /usr/local/src/
# unzip L2-linux-driver
# cd L2-linux-driver/
# make && make install

次に、DVDに入ってるpxeブート用のinitrdを展開。

# cd /usr/local/src
# mkdir -p myimages/initrd_pxeboot
# cd myimages/initrd_pxeboot
# gzip -dc /mnt/iso/images/pxeboot/initrd.img | cpio -iuvmd
# ls
bin  dev  etc  init  modules  proc  sbin  selinux  sys  tmp  var

んで、中を弄る。ここは結構ハマった。最近のinitrdって造りが大分昔と違うので、ググっても役に立たない情報ばかり。結局、職場の先輩に助けを求めたら一瞬で調べてくれた。
まず、modules/modules.cgzの中にドライバが閉じ込められてるらしいので、これも展開。

# gzip -dc modules/modules.cgz | cpio -iuvmd
~ snip ~
2.6.18-128.el5/i686/atp870u.ko
2.6.18-128.el5/i686/bnx2.ko
24300 blocks
#

この中に、さっきコンパイルしたドライバを追加する。

# cp /lib/modules/`uname -r`/kernel/drivers/net/atl2/atl2.ko ./`uname -r`/i686/

で、固めなおす。

# find `uname -r` |  cpio --quiet -c -o | gzip -c > modules/modules.cgz
# rm -rf `uname -r`

コンフィグを編集する。編集するのはmodules/{module-info,modules.alias}の2つ。
modules-infoの方は大した内容じゃない。

# cat <<EOT >> modules/module-info
>atl2
>        eth
>        "Attansic L2 ethernet driver"
>EOT
#

modules.aliasはPCIのid(?)を書きこまないといけないので、それを調べて。

# depmod -a
# modinfo atl2
~ snip ~
alias:          pci:v00001969d00002048sv*sd*bc*sc*i*
~ snip ~
# echo 'alias pci:v00001969d00002048sv*sd*bc*sc*i* atl2' >> modules/modules.alias

これで工事は終わり。
固めて、tftpの公開ディレクトリにつっこみます。カーネルも。

# find . | cpio --quiet -c -o| gzip -c > /tftpboot/CentOS-5.3/initrd-atl2plus_inst.img
# cp /mnt/iso/images/pxeboot/vmlinuz /tftpboot/CentOS-5.3/

お疲れ様(というか疲れた)。これで準備は完了。
ブロードバンドルータDHCP機能をoffって、新サーバを起動したらブートメニューが出るので、CentOS-5.3を選択。インストーラが起動するので、現サーバに置いたパッケージをHTTPで引っ張ってインストールです。

だがしかし、実はこれで終わりではない。新サーバにインストールしたOSには当然atl2ドライバが入って無いので、起動してもnetworkが立ち上がらないのだ。改めてインストールする必要がある。
ここでも、当然ながら外付け光学ドライブは使わない。ここで使ってしまっては負けだ。
続く。