ディスクレスサーバを構築する

DHCPサーバーとtftpサーバーを設定する」の続きです。
PXEブート用にカーネルを構築することとsyslinuxの設定、ルートファイルシステムの作成を行います。
ディスクレスでブートさせるパソコンはATOM330を搭載した45CTDというマザーボードです。

ルートファイルシステムの作成

NFSで共有されているディスクをマウントしてルートファイルシステムを展開します。
こちらはRaspberry Piではなく適当なamd64マシンで展開しました。
nfsの共有領域をマウントしてdebootstrapでファイルシステムを作成します。

# mkdir -p /mnt/nfs
# mount -o nolock 192.168.10.13:/mnt/zMANA/nfs /mnt/nfs
# apt-get install debootstrap
# debootstrap --arch amd64 wheezy /mnt/nfs http://ftp.riken.jp/Linux/debian/debian

hostsなんかも書き込んで置いた方がよさそうです。

# nano -w /mnt/nfs/etc/hostname
45CTD
# /mnt/nfs/etc/hosts
127.0.0.1       localhost 45CTD

chrootしてrootユーザーのパスワードを設定しておきます。

# mount -t proc none /mnt/nfs/proc
# chroot /mnt/nfs/ /bin/bash
$ passwd

カーネルの再構築

適当に走っていたamd64カーネルでPXEブートしようとしたらファイルシステムが認識できなくてカーネルパニックがおきてしまいました。
カーネルコンフィグを確認するとNFSのサポートがモジュールになっていたのでその辺をビルトインに変更して再構築します。
こちらもRaspberry Piではなく適当なamd64マシンで再構築しています。

# apt-get install linux-source-3.2
# sudo -s
# cd /usr/src
# tar jxvf linux-source-3.2.tar.bz2
# cd ./linux-source-3.2

コンフィグファイルは標準のものを流用して一部変更します。

# cp /boot/config-3.2.0-4-amd64 ./.config
# make oldconfig
# nano -w ./.config

とりあえず以下の設定に変更を加えました。

CONFIG_UNIX=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=n
CONFIG_IP_PNP_RARP=n

CONFIG_NFS_FS=y
CONFIG_ROOT_NFS=y

make menuconfigでNICのドライバを片っ端からビルトインにします。

# make menuconfig

設定変更がおわったらカーネルをmakeします。

# make
# cp arch/x86/bzImage ./vmlinuz-3.2.0-4-amd64-nb

元のカーネルがvmlinuz-3.2.0-4-amd64だったのでファイル名をネットワークブート対応ということでvmlinuz-3.2.0-4-amd64-nbにしてみました。
カーネルができあがったらvmlinuz-3.2.0-4-amd64-nbを適当な方法でRaspberry Piに転送します。

PXEブートの設定

ここからまたRaspberry Piでの作業です。syslinuxを入れてtftpのディレクトリに配置して設定ファイルを記述します。

# apt-get install syslinux-common
# cp /usr/lib/syslinux/pxelinux.0 /srv/tftp
# cp /usr/lib/syslinux/menu.c32 /srv/tftp
# cp /usr/lib/syslinux/vesamenu.c32 /srv/tftp
# mkdir -p /srv/tftp/pxelinux.cfg
# touch /srv/tftp/pxelinux.cfg/default
# nano -w /srv/tftp/pxelinux.cfg/default
DEFAULT linux

LABEL linux
KERNEL Linux/boot/vmlinuz-3.2.0-4-amd64-nb
APPEND root=/dev/nfs nfsroot=192.168.10.13:/mnt/zMANA/nfs/Linux rw ip=dhcp
IPAPPEND 0
# mkdir -p /srv/tftp/boot
# cp ~/vmlinuz-3.2.0-4-amd64-nb /srv/tftp/boot

ちなみに/srv/tftp/pxelinux.cfg/defaultを/srv/tftp/pxelinux.cfg/%MACアドレス%にするとアクセスしてきたマシンのNICに割り当てられているMACアドレスごとに違う設定を与えることができるようです。

DHCPサーバの設定2

45CTDのNICに対して固定IPアドレスを振る設定とpxelinux.0を読み込ませる設定を追加します。

# nano -w /etc/dhcp/dhcpd.conf
host 45CTD {
   hardware ethernet %MACアドレス%;
   fixed-address 192.168.10.21;
   filename "pxelinux.0";
}
# /etc/init.d/isc-dhcp-server start

いざ電源ON

ここまでできたら実機の電源を入れてみます。
DHCPからIPが降ってきて/srv/tftp/pxelinux.cfg/defaultを読み込んだ後カーネルをロードしてブートが始まれば成功です。
余ってるファイルサーバーのディスクを利用してlxcでいくつかコンテナを作成してLinuxの実験を行える環境ができました。