ネットワークブート時にクライアントにパッチを当てる - VIVER CORE Server

VIVER COREには、ブートパラメータでpostboot=というパラメータを渡すと、をダウンロードしてルートファイルシステムに展開するという機能があります。プロトコルにはHTTP、FTP、TFTP、rsyncが使えます。HTTP、FTP、TFTPの場合には、tar/cpio + gzip/bzip2/lzmaが使えます(拡張子で判別)。
セミコロンで区切って複数のパッチを当てることもできます。半角スペースで区切ると、区切られたURLの中からランダムで選ばれ(負荷分散用)、そのURLのダウンロードに失敗したときには他のURLを試します(冗長化用)。これはrooturl=と同じです。

このpostbootを使って、ネットワークブート時にクライアントにパッチを当ててみます。バージョン0.0.4でrsyncに対応したので、postbootでもrsyncが使えます。

VIVER CORE Serverをダウンロード

何はともあれまずダウンロード。これ以降はすべてVIVER CORE Serverパッケージの中で作業を行います。

wget http://syuki.skr.jp/core/release/viver-core-server-0.0.4.i386.tar.gz
tar zxvf viver-core-server-0.0.5.i386.tar.gz
cd viver-core-server-0.0.5.i386

Debain etchをインストール

ネットワークブート用にDebain etchでもインストールしてみます。前回のように仮想アプライアンスを使ってもOKです。

今回はrsyncを使うので、インストール先をVIVER CORE Serverの中の./script/rsync/viverにします。./script/rsync/viverはデフォルトで作成&設定済みです。
せっかくなのでdebootstrapの全自動インストールスクリプトも使ってみます。

./script/install-debootstrap
sudo ./script/debootstrap --arch i386 etch ./rsync/viver http://ftp.jp.debian.org/debian


カーネルモジュールをインストールしておきます。

sudo cp -a /lib/modules/`uname -r` ./rsync/viver/lib/modules/

postbootを作る

「/var/www/にコンテンツを置いて、lighttpdをインストールする」というパッチを作ってみます。
今回はrsyncを使うので、まずはrsync用にディレクトリを一つ作ります。ここにファイルを配置していきます。

mkdir ./rsync/patch

# デフォルトの設定ファイルを変更
vi ./rsync/rsyncd.conf

## 以下を追記
# [patch]
#     path = ./rsync/patch


パッチの中に「/run」というファイルがあると、それが実行されるようになっています。というわけで、./rsync/patch/runにlighttpdをインストールするスクリプトを書きます。

#!/bin/sh
echo "installing lighttpd"
echo "Yes" | aptitude install -y lighttpd

もちろん実際はこんなテキトーな事をやっていけませんが!とりあえず気にしない気にしない :-p


実行権限を付けるのを忘れずに。

chmod 0700 ./rsync/patch/run


./rsync/patch/以下にファイルを置いていきます。/var/www/以下にコンテンツを適当に配置してください。

$ find ./rsync/patch
rsync/patch/
rsync/patch/run
rsync/patch/var
rsync/patch/var/www
rsync/patch/var/www/index.html
rsync/patch/var/www/test.html

tftpbootを用意

カーネルとinitramfsを用意します。今使っているカーネルが使えるので、カーネルの再構築は必要ありません。initramfsの作成にはmkviverrdコマンドが使えます。

# initramfsを作る
./mkviverrd \
    ./tftpboot/viver-core.img \
    ./skel/viver-core-skel.i386.tar.gz \
    `uname -r`

# カーネルをコピーしてくる
cp /boot/vmlinuz-`uname -r` ./tftpboot/

ブートパラメータを書く

./tftpboot/pxelinux.cfg/defaultにブートパラメータを書きます。

default viver
prompt 0

label viver
kernel vmlinuz-2.6.19.7-vs2.2.0.3-vcore12
append initrd=viver-core.img rootsize=350m rooturl=rsync://192.168.0.2:9100/viver postboot=rsync[-v]://192.168.0.2:9100/patch

kernelは先ほどコピーしてきたカーネルの名前に、192.168.0.2(2カ所)は自ホストのIPアドレスに変えてください。
rsyncサーバーは9100番ポートで起動します。
postbootのrsyncは-vオプション付きにしてみました。

サーバーを起動する

ではサーバーを起動します。rsyncのバイナリはパッケージに入っていないので、インストールされていることを確認してください。

sudo ./script/start-rsyncd
sudo ./script/start-tftpd
sudo ./script/start-pxe-pdhcp eth0

以上で準備完了です。近隣のマシンをPXEでブートすると、ディストリビューションのブートプロセスが始まる前にlighttpdがインストールされるはずです。
そして起動したクライアントにHTTPでアクセスすると、./rsync/patch/var/wwwに配置しておいたhtmlが見えるはずです。