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
このあたりで、クライアント側 NIC の MAC アドレスを調べてどこかにメモしておく。IP アドレスや vblade のスロット番号あたりも、決めておく必要あり。
net boot の用意 (サーバ側)
$ 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 かな。