自宅用に新しくサーバ機を調達したが、毎回 OS インストール用の DVD や USB メモリを用意するのが面倒なので、PXE (Preboot eXecution Environment) ブートによるネットワークインストールを試してみることにした。
前提
今回は以下のような条件の下で進める。
- ネットワーク上で既に DHCP サーバが動いている
- PXE サーバ (DHCP, TFTP) は Mac の上に Vagrant で構築する
- Mac は有線 LAN でつながっている
(Wi-Fi だとうまくいかなかった) - インストールするパッケージは、Ubuntu の Web サーバからダウンロードする
(ISO の中身を http で配信しようとしたがうまくいかなかった)
仮想マシンの用意
まずはじめに、Vagrant を用いて Mac の上に PXE サーバを構築する。
Vagrant で Ubuntu 12.04 LTS Server 64bit の仮想マシンを作成する。
$ mkdir ~/pxe-server
$ cd ~/pxe-server
$ vagrant init ubuntu/precise64
ホスト (Mac) の NIC (en0) にブリッジ接続するように、設定を書き換える。
$ vi Vagrantfile
# 下の1行を追記
config.vm.network :public_network, :bridge => "en0"
作成した仮想マシンを起動し、コンソールに接続する。
$ vagrant up
$ vagrant ssh
※ うまく起動しない場合は下記のページが参考になる。
- vagrant upの実行が終わらない話 – $shibayu36->blog;
Proxy DHCP サーバの構築
ブートローダの情報をサーバ機に通知するために DHCP サーバを構築する。いくつか方法があるが、今回はネットワーク上で既に稼働中の DHCP 環境に影響を与えずに PXE ブートを実現するため、Proxy DHCP にする。デーモンは pxe-pdhcp を使用させていただく。
先ほど Vagrant で作成した仮想マシンに、まず Subversion をインストールする。
$ sudo apt-get install -y git
pxe-pdhcp のソースコードをもらってきて make する。
$ cd
$ git clone https://github.com/frsyuki/pxe-pdhcp.git
$ cd pxe-pdhcp
$ make
pxe-pdhcp を起動する。${PXE_IPADDR} の部分には、仮想マシンのブリッジ接続側の IP アドレス ($ ifconfig eth1 で確認) を指定する。
$ sudo ~/pxe-pdhcp/pxe-pdhcp -l 0.0.0.0 -b 255.255.255.255 -t ${PXE_IPADDR} -d pxelinux.0 &
TFTP サーバの構築
ブートローダ (pxelinux.0) などをサーバ機に転送するため、TFTP サーバを仮想マシン上に構築する。
tftpd-hpa をインストールする。
$ sudo apt-get install -y inetutils-inetd tftpd-hpa
設定ファイルを以下のように書き換える。
$ sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/vagrant/tftp/" # 変更
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -vvv" # /var/log/syslog にログを吐き出す
RUN_DAEMON="yes"
tftpd 用のディレクトリを作成する。
$ mkdir ~/tftp
設定を反映するために tftpd を再起動する。
$ sudo service tftpd-hpa restart
ディスクイメージの用意
ブートローダなどのファイル群を TFTP サーバ上に配置する。
仮想マシン上に Ubuntu の ISO イメージを保存する。
$ mkdir ~/iso
$ wget -P ~/iso http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/trusty/ubuntu-14.04.2-server-amd64.iso
保存した ISO イメージをマウントする。
$ sudo mkdir /mnt/iso
$ sudo mount -r -t iso9660 -o loop ~/iso/ubuntu-14.04.2-server-amd64.iso /mnt/iso
ファイルを TFTP サーバのディレクトリにコピーする。
$ sudo cp -r /mnt/iso/install/netboot/* ~/tftp/
以上で PXE サーバの準備が整った。
OS のインストール
OS をインストールするマシンの電源を入れ、ネットワークインストールを選択すると、DHCP で IP アドレスが振られたあと自動的にブートローダが転送される。そのとき仮想マシンの pxe-pdhcp を起動したコンソールに、
Aug 26 15:39:02: DEBUG: pxe-pdhcp.c: got a non-DHCPDISCOVER dhcp packet
Aug 26 15:41:25: DEBUG: pxe-pdhcp.c: dhcp_reply start
Aug 26 15:41:25: DEBUG: pxe-pdhcp.c: got a DHCPDISCOVER on dhcp
Aug 26 15:41:25: DEBUG: pxe-pdhcp.c: dhcp_reply end
のように出力があれば、ブートローダの転送ができている。その後インストール画面が表示されるので、あとはいつも通りインストールを進めれば良い。
なお、OS をインストールする側も VirtualBox で試すなら、新たに仮想マシンを作成してブリッジアダプターを設定し、起動画面で F12 のあとに l キーを押せば PXE ブートできる。
また機会があれば、オリジナルのインストールイメージを作って、全自動インストールを実現してみたい。
参考ページ
- PXEInstallServer – Ubuntu documentation
- PXE には3種類ある – 古橋貞之の日記
- VirtualBox の内部ネットワークで PXE サーバ構築 – Going My Linux Way
- config.vm.network – VagrantDocs
コメント