pxe boot from AoE

ずいぶん長く手こずっていたけど、ようやく上手くいったので記録代わりにメモ。後で追記するかも。

環境の用意

ストレージ用のネットワークとして、ルータで区切ってクローズドな Gigabit LAN を用意した。
OS イメージの実体を置くサーバは、RAID5 + LVM2 の箱を使う。

net boot の用意 (クライアント側)

NIC の機能では AoE の boot はできないので、gpxe に頼る。NIC から chainloading させるために tftp 用のイメージを使うけど、一応 USB 版も用意しておいた。

$ mkdir gpxe
$ cd gpxe
$ git clone git://git.etherboot.org/scm/gpxe.git
$ sudo aptitude install syslinux mtools
$ make
$ dd if=bin/gpxe.usb of=/dev/sdX
$ sudo cp bin/undionly.kpxe /var/lib/tftpboot

このあたりで、クライアント側 NICMAC アドレスを調べてどこかにメモしておく。IP アドレスや vblade のスロット番号あたりも、決めておく必要あり。

net boot の用意 (サーバ側)

起動時に AoE の参照先を教えるため DHCP を設置。

$ sudo aptitude install dhcp3-server
$ sudo vi /etc/dhcp3/dhcpd.conf
host aoeclient {
  hardware ethernet xx:xx:xx:xx:xx:xx;
  fixed-address n.n.n.n;
  if exists user-class and option user-class = "gPXE" {
    filename "";
    option root-path "aoe:eX.X";
  } else {
    filename "undionly.kpxe";
  }
}
$ sudo /etc/init.d/dhcp3-server restart

ストレージサーバ (AoE target) の用意

$ sudo modprobe aoe
$ sudo aptitude install aoetools vblade
$ sudo lvcreate -L 8G -n ${LVM-LV} ${LVM-VG}
$ sudo vbladed X X ethX /dev/${LVM-VG}/${LVM-LV}
$ sudo aoe-discover
$ sudo aoe-stat

わけると面倒なので、パーティションは最大サイズで 1つだけ作成する。

$ sudo fdisk /dev/etherd/eX.X

作成したパーティションが見えずにしばらくハマったけど、udev を再起動すると見えるようになった。

$ sudo /etc/init.d/udev stop
$ sudo /etc/init.d/udev start
$ sudo aoe-stat

ディスクイメージの用意

ストレージサーバ上で、debootstrap と chroot を使ってあれこれ作業。filesystem は軟弱に ext3 を使った。

$ sudo mke2fs -j /dev/etherd/eX.Xp1
$ sudo mount /dev/etherd/eX.Xp1 /mnt
$ sudo debootstrap --components=main,contrib,non-free sid /mnt http://${MIRROR_SITE}/debian
$ sudo chroot /mnt

ここからは chroot 内での作業。

# mount -t proc proc /proc
# mount -t sysfs none /sys
# apt-get install sudo aoetools grub locales console-setup linux-image-2.6.*
# vi /etc/default/console-setup
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"
# /etc/init.d/console-setup restart
# dpkg-reconfigure locales
# tzselect
# adduser ${USER}
# passwd ${USER}
# vi /etc/sudoers
# vi /etc/fstab
proc			/proc	proc	defaults	0	0
/dev/etherd/eX.X	/	ext3	noatime		0	1
# vi /etc/initramfs-tools/hooks/aoetools
#!/bin/sh
 
set  -e
 
PREREQ=""
 
prereqs()
{
        echo "$PREREQ"
}
 
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
. /usr/share/initramfs-tools/hook-functions
 
[ -x /sbin/aoe-discover ] && copy_exec /sbin/aoe-discover /sbin
manual_add_modules aoe
# vi /etc/initramfs-tools/scripts/local-top/aoetools
#!/bin/sh
 
set -e
 
PREREQ=""
 
prereqs()
{
        echo "$PREREQ"
}
 
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
case $ROOT in
/dev/etherd/e*)
        INTERFACES=`awk -F: '/eth[0-9]*:/ { print $1 }' < /proc/net/dev`
        for i in $INTERFACES; do
                echo Bringing up interface $i for AoE
                ifconfig $i up
        done
        sleep 5
        modprobe aoe
        aoe-discover
        ;;
esac
# update-initramfs -u -k all
# mkdir /boot/grub
# cp -r /usr/lib/grub/${ARCH}/. /boot/grub
# ln /dev/etherd/eX.X /dev/sda
# ln /dev/etherd/eX.Xp0 /dev/sda1
# vi /boot/grub/device.map
(hd0) /dev/sda
# grub
> root (hd0,0)
> setup (hd0)
> quit
# vi /boot/grub/menu.lst
title Debian
  root (hd0,0)
  kernel /vmlinuz ro root=/dev/etherd/eX.Xp1 vga=791
  initrd /initrd.img

これで一通り完了のはず。クライアントから gpxe で無事起動できたので、次は nfs home かな。