VirtualBoxの仮想マシンをディスクレス化させる
必要に迫られたわけでもなかったのだけれど、DHCP サーバのことを調べてたらネットワークブートは DHCP が関係しているということがわかったので、興味本位でネットワークブート・ディスクレス環境を作ってみようと思ったわけで。
環境
サーバ(PXE Server)
ディレクトリ構成
# TFTP でダウンロードするファイルを置くディレクトリ /private/tftpboot/linux-install/centos # NFS でエクスポートするディレクトリ. ## ディレクトリツリー等 /private/var/nfs/pxeboot/centos/root ## スナップショット保存ディレクトリ. /private/var/nfs/pxeboot/centos/snapshot
クライアント(PXE Client)
- VirtualBox 3.0.12
- Cent0S 5.4 (kernel 2.6.18-164.el5)
OSイメージ作成用環境
- クライアントと同じ
ネットワーク構成
Mac のインターネット共有を有効にする。共有する接続経路に en1、相手のコンピュータが使用するポートに en0 を選択する。
| |en1 (192.168.1.???/24) +------------+ | PXE Server | | (Mac) | +------------+ |en0 (192.168.2.1/24) | |eth0 (192.168.2.???/24) +---------------+ | PXE Client | | (Virtual Box) | +---------------+
サーバ設定
TFTP サーバ
設定ファイルは /System/Library/LaunchDaemons/tftp.plist。初期状態から特に変更なし。launchctl で TFTP サーバを起動させる。
# launchctl load -w /System/Library/LaunchDaemons/tftp.plist
DHCP サーバ
Mac インターネット共有機能を有効にした際に有効になるDHCPサーバを使用する。設定ファイルは /etc/bootpd.plist。インターネット共有が有効の時にのみ存在する。インターネット共有を無効にすると消えてしまう。中身はこんな感じ。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Subnets</key> <array> <dict> <key>_creator</key> <string>com.apple.nat</string> <key>allocate</key> <true/> <key>dhcp_domain_name_server</key> <string>192.168.2.1</string> <!-- ↓ 追加 ↓ --> <key>dhcp_option_66</key> <data> MTkyLjE2OC4yLjE= </data> <key>dhcp_option_67</key> <data> L2xpbnV4LWluc3RhbGwvY2VudG9zL3B4ZWxpbnV4LjA= </data> <!-- ↑ 追加 ↑ --> <key>dhcp_router</key> <string>192.168.2.1</string> <key>lease_max</key> <integer>86400</integer> <key>lease_min</key> <integer>86400</integer> <key>name</key> <string>192.168.2</string> <key>net_address</key> <string>192.168.2.0</string> <key>net_mask</key> <string>255.255.255.0</string> <key>net_range</key> <array> <string>192.168.2.2</string> <string>192.168.2.254</string> </array> </dict> </array> <key>bootp_enabled</key> <false/> <key>detect_other_dhcp_server</key> <integer>1</integer> <key>dhcp_enabled</key> <array> <string>en0</string> </array> <key>reply_threshold_seconds</key> <integer>4</integer> </dict> </plist>
標準の設定から2つ項目を追加した。追加した項目は dhcp_option_66 と dhcp_option_67。dhcp_option_66 は TFTPサーバ名の設定、dhcp_option_67 はブートファイル名の設定。設定する値を Base64 エンコードしたものを設定ファイルに書く。
OSイメージの作成
環境準備
OSイメージを作成する為の環境を用意する。ハードウェア構成はネットワークブートさせるマシンと同じにしておく。
ディスクレス環境の OS のイメージを system-config-netboot を使って作成するのでインストールする。また、system-config-netboot のインストール時には依存パッケージとして指定されていないが busybox-anaconda が必要になるのでこれもインストールする。
# yum install system-config-netboot # yum install busybox-anaconda
ディレクトリツリーのコピー
# mkdir -p /nfs/centos/root # rsync -a --exclude='/proc/*' --exclude='/sys/*' --exclude='/nfs' / /nfs/centos/root
NFSの設定
system-config-netboot では NFS でエクスポートされているディレクトリに対して作業するようだ。
/etc/exports
/nfs/centos/root 192.168.2.0/255.255.255.0(ro,sync,no_root_squash) /nfs/centos/snapshot 192.168.2.0/255.255.255.0(rw,sync,no_root_squash)
NFS サーバ起動
# service portmap start # service nfs start
OSイメージの作成
system-config-netboot を立ち上げる (X が使える環境から)。適宜穴を埋めて OS イメージを作成する。/tftpboot/linux-install/centos/ の下に vmlinuz と initrd.img が作成される。
OSイメージをホストマシンに配置する
ホストマシンから。
# rsync -a -e ssh 192.168.2.9:/nfs/centos/ /private/var/nfs/pxeboot/centos # scp 192.168.2.9:/tftpboot/linux-install/centos/initrd.img /private/tftpboot/linux-install/centos # scp 192.168.2.9:/tftpboot/linux-install/centos/vmlinuz /private/tftpboot/linux-install/centos # scp 192.168.2.9:/tftpboot/linux-install/pxelinux.0 /private/tftpboot/linux-install/centos
initrd.img → Linuxが起動する際に一時的に利用されるファイル・システムのイメージ
vmlinuz → カーネル本体
pxelinux.0 → ブートローダー