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 エンコードしたものを設定ファイルに書く。

NFS サーバ

NFSの設定ファイルを編集する。
/etc/exports

/private/var/nfs/pxeboot/centos/root -ro -maproot=root -network 192.168.2.0 -mask 255.255.255.0
/private/var/nfs/pxeboot/centos/snapshot -maproot=root -network 192.168.2.0 -mask 255.255.255.0


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 → ブートローダ


クライアント

仮想マシンの設定
  1. 仮想マシンを新規に作成する。仮想ハードディスクのチェックボタンを外す*1
  2. 起動順序の優先順位をネットワークが先頭にくるように変更する。
  3. ネットワークの割当てはブリッジアダプタ、名前に en0 を選択する。
起動

起動ボタンを押す。祈る。

結果

起動はしたものの、

ログイン後すぐにエラーが発生し何もできなかった...。

とりあえず起動したし。思いつきで始めたことだし。ま、いいか。

*1:外さなくてもいいけど、ディスクレス環境をうたうならね