PXE boot を VitualBox(ubuntu) で試す

#何がやりたい？
PXEブート用のサーバーが必要となったものの、Mac上に直接、tftpとdhcpを構築するのも良いのですが、上手く動いているのかどうかの切り分けが大変なため、VirtualBox上でサーバー側とクライアント側の両方をMac上で構築することで、まず最初に、PXEブートが動作することを確認してから、外部デバイス向けのPXEブート用サーバーを構築します。

##Topology
外部デバイスと接続するインタフェースは、USBの有線LANアダプタを接続しています。

<img width="607" alt="topology.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/dd1c520f-645d-86c9-499b-3fa944a71a75.png">

##Ubuntu(PXE Server)のインストール
まず最初に、VirtualBox上に、Ubuntuのサーバー(16.04.4)をインストールします。
次に、各ネットワークアダプタを設定します。

####HostのMacに接続されているインターネットと繋がるインタフェース
<img width="770" alt="server_na1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/d27acbc0-762e-d168-34cd-cdf758691a33.png">

####Macのターミナルを開いて、SSH経由でUbuntuにログインするためのインタフェース
<img width="770" alt="server_na2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/48d9cc81-1a05-71f4-01ed-20ae6722c59d.png">

####外部デバイスと繋がるインタフェース
<img width="770" alt="server_na3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/2d5c0156-1542-7aa5-8206-e5d80217424a.png">

####もう一台のVirtualBox上で作成するクライアントと繋がるインタフェース
<img width="770" alt="server_na4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/c3c0bd46-e775-fb6d-91e7-9579fd45cb19.png">

##Ubuntuインストール後の状態を確認

Ubuntuのバージョンを確認

```text
hoge@ubuntu:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

ネットワークアダプタの確認

```text
hoge@ubuntu:~$ lshw -short -class network
WARNING: you should run this program as super-user.
H/W path    Device      Class       Description
===============================================
/0/100/3    enp0s3      network     82540EM Gigabit Ethernet Controller
/0/100/8    enp0s8      network     82540EM Gigabit Ethernet Controller
/0/100/9    enp0s9      network     82540EM Gigabit Ethernet Controller
/0/100/a    enp0s10     network     82540EM Gigabit Ethernet Controller
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.
hoge@ubuntu:~$
```


##インタフェースの設定
設定ファイルを開いて、末尾に追加

```text:設定ファイル
sudo vi /etc/network/interfaces
```

```text:追加する内容
# ===== SSH from host =====
auto enp0s8
iface enp0s8 inet static
address 192.168.98.10
netmask 255.255.255.0
network 192.168.98.0
broadcast 192.168.98.255

# ===== USB ether port =====
auto enp0s9
iface enp0s9 inet static
address 192.168.99.1
netmask 255.255.255.0
network 192.168.99.0
broadcast 192.168.99.255

# ===== Internal Network =====
auto enp0s10
iface enp0s10 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
```

`enp0s8`に`192.168.98.10`を指定していますが、下記の通り、Mac側で確認した内容に合わせた手動アドレスとしています。

```text:Mac側の状態
$ ifconfig
vboxnet0 (23):
  inet address  192.168.98.1
  netmask       255.255.255.0
  broadcast     192.168.98.255
  flags         UP BROADCAST RUNNING PROMISC SIMPLEX MULTICAST
  mtu           1500
```
Ubuntuのインストールが完了したら、先に`enp0s8`の部分だけを追加して、後は、Macのターミナルを開いて、SSH経由で接続してから設定しても良いかと。

##DHCPサーバの設定

###DHCPのインストール

```text:インストール
sudo apt install -y isc-dhcp-server
```

DHCPを動作させるインタフェースを指定する

```text:設定ファイル
sudo vi /etc/default/isc-dhcp-server
```

```text:修正する箇所
INTERFACES="enp0s9 enp0s10"
```

DHCPの設定ファイルを開いて、末尾に必要な内容を追記する

```text:設定ファイル
sudo vi /etc/dhcp/dhcpd.conf
```

```text:追加する内容
default-lease-time 1800;
max-lease-time 3600;
ddns-update-style none;

subnet 192.168.0.0 netmask 255.255.255.0 {
  option routers 192.168.0.1;
  option subnet-mask 255.255.255.0;
  range 192.168.0.100 192.168.0.110;
  option domain-name "private.exmaple.com";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  filename "./ubuntu/pxelinux.0";
}

subnet 192.168.99.0 netmask 255.255.255.0 {
  option routers 192.168.99.1;
  option subnet-mask 255.255.255.0;
  range 192.168.99.100 192.168.99.110;
  option domain-name "private.exmaple.com";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  filename "image_name.iso";
}
```
不要な設定もあると思いますので、適宜削除してください。
不要かどうかは、PXE Clicentが起動するか、起動しないかで切り分けてください。

###DHCPの起動

```text:コマンド
sudo systemctl enable isc-dhcp-server
sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server
```


##tftpサーバの設定

###TFTPのインストール

```text:インストール
sudo apt-get install -y tftpd-hpa
```

PXEクライアントとして起動させるためのイメージをダウンロードして展開

```text:コマンド
cd /var/lib/tftpboot
sudo mkdir ubuntu
cd ubuntu
sudo wget http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/installer-amd64/current/images/netboot/netboot.tar.gz
sudo tar xvzf netboot.tar.gz
```
外部デバイスで起動したいイメージが`image_name.iso`だとすると、`/var/lib/tftpboot`配下に置いておくこと。

###TFTPの起動

```text:コマンド
sudo systemctl restart tftpd-hpa.service
sudo systemctl status tftpd-hpa.service
```
##PXE Clientの準備
動作確認用のPXE Clientを新規の仮想マシンとして作成します。
また、各設定は下記の通りです。
####[一般]-[基本]
<img width="773" alt="client_setting1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/4e961262-1e65-7876-483f-17d0451dd8e2.png">

####[システム]-[マザーボード]
ここがポイントで、`起動順序`の`ネットワーク`を有効にして、一番上に移動させること。
<img width="772" alt="client_setting2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/1f9b46f8-5c79-81c7-bceb-9c6ffaad6ce9.png">

####[ネットワーク]-[アダプター1]
先に構築しているPXE Serverと内部インタフェースで接続するための設定
<img width="770" alt="client_na1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/bbe7cbe7-8d25-a465-751c-11ce5f975c1d.png">

##PXE Clientの起動
電源を入れれば、下記のような画面が表示されるはず。

無事に起動すれば、ちょっとお試しで、イメージ保管先を示す`./ubuntu/pxelinux.0`を`./pxelinux.0`に変更すると起動しなくなることが確認できますので、dhcpでイメージファイルの情報を渡して、実際のイメージファイルはtftpで取得していることが分かる。

<img width="639" alt="client_boot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/d028bbde-37ae-6617-fdf6-123e793d7768.png">

<img width="567" alt="client_boot2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228223/7e1d50b8-c8d7-4eea-6ea2-b97c568610c5.png">

これで、外部デバイスからもPXEブートできるはず。