astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

初めてのPXEブート

どうもお久しぶりです、元バンドマンの新米エンジニアgucciです。
最初のブログ投稿からはや4ヶ月も経ってしまいました。
さらに振り返ると、ちょうど1年ほど前にエンジニアになるべくプログラミングスクールに通い始め、
そこからもう1年が経ったのだなぁとしみじみ思います。

さて、そんな私が今回ご紹介するのは「PXEブートサーバを構築しよう!」です。
これは入社してすぐに研修でやったものの一つで、とても勉強になったのでご紹介させていただきます。
私のように文系出身でサーバなどの基礎知識がなかったり、
Linuxのコンソールにあまり触れたことがなかったりするけど、
それでも「エンジニアになろうかしら!」と思っているそんなあなたにうってつけです。
ぜひ、今回ご紹介するPXEブートサーバの構築を試してみてください。
また、途中で登場する用語やコマンドなどの意味を調べながらやっていくと、より自分の身につくと思うのでおすすめです。

PXEブートサーバとは

さて、ここまでおすすめしておいてそもそもPXEとはなんなのかを説明していませんでした。
PXEとは、

Preboot eXecution Environment(PXE、ピー・エックス・イー、ピクシー)は、コンピュータのブート環境のひとつ。インテルの策定したネットワークブートの規格である。ネットワークブートを利用することにより、ストレージをもたないクライアントコンピュータや、ストレージに別のOSが導入されているクライアントコンピュータがサーバ上のOSイメージを使用して起動できる。
(wikipedia先生より)

とのこと。
これを利用することで一体なにができるかと簡単に言うと、CDやUSBからOSをインストールするのではなく、
PCとPCをLANケーブルで接続してネットワーク経由でOSのインストールができる!ということです。
たとえば、CDドライブが壊れてしまった古いパソコンへ新しいOSをインストールしたり、
一度に大量のPCへ接続してOSをインストールしたりすることができるようになります。
PXEを利用してPCのプログラムを起動することができるサーバを「PXEブートサーバ」と言います。

今回はVirtual Boxという仮想マシンを用いてPXEブートサーバを構築しましょう。
HostマシンとTargetマシンはどちらもVirtual Boxで作れるので、わざわざPCを複数用意する必要はありません。
無料ですべて行えるのでご安心を。

一番簡単にPXEを構築できる方法をご紹介するので、色々と足りない設定や説明などあるかもしれませんがご容赦ください。
ではさっそく挑戦してみましょう!

Host機をVirtual Boxで作成

Virtual BoxというのはOracleが開発している仮想化ソフトのことで、使用しているPC上に仮想的なPCを作成し、別のOSをインストール・実行することができます。
こちらは何かと便利なのでPCに入れておいて損はないかと思われます。
今回使用するOSはUbuntuというフリーのLinuxディストリビューションの1つです。
こちらのUbuntu18.04.1LTSを用いてやっていきましょう。

VIrutlal Boxをインストールして新規マシンを作成し、Ubuntuをインストールする方法はたくさんネットに載っているのでそちらをご参考ください。
必要に応じて設定は変更すべきですが、PXEブートサーバをお試しで作ることが目的なので基本的にはデフォルトの設定のまま突き進んで問題ありません。

Ubuntuのインストーラはこちらから、ubuntu-18.04.1-live-server-amd64.isoをダウンロードしてください。

インストールが完了して「Reboot Now」を叩けばVMが再起動してUbuntuが起動してくれます。
それでは、本題のPXEブートサーバを構築していきましょう!

PXEブートサーバとはどういう仕組み?

そもそもPCは起動時にBIOSなどの起動デバイスで設定された順番にデバイスを読み込んでいきます。
基本設定ではHDDが先に読み込まれますが、このBIOSの設定を変更することでCDなどの光学ドライブやUSBから起動させることができるようになります。
BIOSの設定によりPXEから起動することで、ネットワーク起動が実現できるわけです。

しかし、マシンの中にインストーラを用意して接続しただけだと、
どこからそのマシンに接続して、
どうやってファイルを転送をして、
どこにインストーラがあるのか、
マシンにはわかりません。それを設定してあげるのが今回のゴールです。

PXEブートサーバは以下の流れにより実現できます。

f:id:astamuse:20181024084353j:plain

簡単に例えると、

  1. DHCPサーバがどこに接続するのか住所を指定

  2. TFTPサーバがファイルを転送してくれる配達員

  3. HTTPサーバが実際にインストーラが置いてある倉庫

といったイメージがわかりやすいかと思います。
これらのサーバをそれぞれ設定することで、PXEブートサーバが構築できるのです。

PXEブートサーバの構築

それでは、VMにインストールしたUbuntuを使って実際に各サーバを設定してきましょう!

Ubuntuを起動後、まずはパッケージのupdateから。

$ sudo apt update
$ sudo apt upgrade

まず、DHCPサーバをインストールします。

$ sudo apt install isc-dhcp-server

次に、 TFTPサーバをインストールします。

$ sudo apt install tftpd-hpa

そして、HTTPサーバとして使用するapache2をインストールします。

$ sudo apt install apache2

最後に、Ubuntuのインストーラのisoイメージをダウンロードしましょう。
今回は手軽にPXEブートを体験するために、liveCD用installerではなく通常のCD用installerを使います。

$ sudo wget http://cdimage.ubuntu.com/releases/18.04.1/release/ubuntu-18.04.1-server-amd64.iso

これで、必要な材料は揃いました。
ここからは、諸々の設定と適切な配置を行なっていきます。

DHCPの設定を編集していきましょう。

$ sudo vi /etc/dhcp/dhcpd.conf

エディターが開かれると思うので、

option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

をコメントアウトして、 一番下に下記を足します。

subnet 10.0.2.0 netmask 255.255.255.0 {
              range 10.0.2.91  10.0.2.99;
              filename "pxelinux.0";
}

次に、ダウンロードしたisoイメージを適切な場所に配置します。
isoイメージを展開してあげる必要があるので、そのためのディレクトリを作って、

$ sudo mkdir /mnt/ubuntu

展開します。

$ sudo mount -o loop,ro ubuntu-18.04.1-server-amd64.iso /mnt/ubuntu/

この展開したisoイメージの中に、
TFTPサーバに配置するnetbootのファイルと、HTTPサーバに配置するinstallのファイルが入っているので、それらを配置してあげましょう。

TFTPサーバにnetbootのファイルをセット。

$ sudo cp -r /mnt/ubuntu/install/netboot/* /var/lib/tftpboot/

HTTPサーバにinstallのファイルをセット。

$ sudo ln -s /mnt/ubunu /var/www/html/

上はコピーをしていて、下はリンクを貼っています。
こういったコマンドの意味も、ぜひ調べながらやってみてくださいね。

最後に、
PXEブートサーバに静的なIPアドレスを設定します。

$ ifconfig と叩くと、enp0s3に現在設定されているIPアドレスが表示されるかと思います。
このIPアドレスをこちらで指定する静的なIPアドレスに設定してあげます。
どこの住所なのかを予めしっかりと決めてあげるということですね。

$ sudo vi /etc/netplan/50-cloud-init.yaml

エディターが開かれるので、下記のように編集してください。

network:
     ethernets:
             enp0s3:
                        addresses: [10.0.2.7/24]
                        gateway4: 10.0.2.1
                        dhcp4: false
                        nameservers:
                                 addresses: [10.0.2.1]
           version: 2

この設定を反映させるために、

$ sudo netplan apply

と叩いてあげましょう。 もう一度ifconfigを叩くと、10.0.2.7に変わっていることがわかると思います。

3つのサーバを立ち上げましょう!

$ sudo systemctl start tftpd-hpa
$ sudo systemctl start isc-dhcp-server 
$ sudo systemctl start apache2

これで…PXEブートサーバの準備はバッチリです!

TargetマシンとBIOSの設定

PXEブートさせるTargetマシンをVirtual Boxで新規に作成しましょう。
作成したVMのBIOS設定を変更します。
設定ボタンを押し「システム」へ行くと、「起動順序」という項目があると思います。
ここの項目で、ネットワークにチェックを入れて一番上に移動させてください。
この設定により、起動時にネットワークからブートさせることができます。

ネットワークアダプタの変更

作成した2つのVM機の両マシン間で通信を行うために再び設定ボタンを押して「ネットワーク」へ行きましょう。
ここの割り当てを内部ネットワークにどちらのマシンも切り替えます。
名前や高度な設定はデフォルトのままでOKです。

これで…全ての準備が整いました!

Let's PXEブート

それでは、TargetマシンのVMを立ち上げてみましょう。
おねがい!動いて!

f:id:astamuse:20181024103741p:plain

やりました!
インストールを叩いてどんどん進んで行きましょう!
「Configure the network」画面まできたら、設定したnameserverのアドレスを入れます。

f:id:astamuse:20181024104201p:plain

次に、hostnameを求められるので、PXEブートサーバを構築したUbuntuのマシンの名前を入力します。
そして、「Choose a mirror of the Ubuntu archive」の画面では、一番上のenter information manuallyを選択します。
ここで、apache2で立てたHTTPサーバの場所を教えてあげます。
今回は静的なIPアドレスに10.0.2.7を設定したので、

f:id:astamuse:20181024104615p:plain

次の画面では、

f:id:astamuse:20181024104905p:plain

/var/www/html/配下にリンクを貼った/ubuntu/を入れてあげます。
isoイメージをマウントしてあるubuntuというディレクトリのリンクが貼ってあるので、これによりisoイメージを実行できるというわけです。
この次の画面は空っぽのままでEnterを押してください。
次の画面にインストーラが遷移すれば、もう安心です!
インストーラに従ってインストールを進めていけば無事にTargetマシンにUbuntu18.04.1がインストールされます!

最後までインストールが終わりenterを押すと再起動が始まってまたPXEブートが始まってしまうので、
一度マシンをシャットダウンしてBIOSの設定を直しましょう。HDDから読みこむように設定を直して、起動すると…!

イエス!PXEブート成功!おめでとうございます!
お疲れ様でした!

ついでにあと少し

ここまでで今回のゴールには到達しました。 なので、ここからはちょっとした付け足しみたいなものです。

その1

〜PXEブートでUbuntuをインストールしたTargetのマシンをそのまま使いたい場合〜

現在の設定だと、
パッケージをインストールしようとした際、インストール時に指定したPXEブートサーバのhttp://10.0.2.7/ubuntu/を見に行ってしまいます。
$ sudo apt updateをしても失敗してしまうはずです。
そこで、パッケージの参照先を正しく指定し直しましょう。

$ sudo vi /etc/apt/source.list

この中を以下に書き換えてあげましょう。

deb http://jp.archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://jp.archive.ubuntu.com/ubuntu/ bionic universe
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://jp.archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse

これで、再度$sudo apt updateを行うと無事にパッケージがインストールされるはずです。

その2

〜仮想マシンではなく、実際のマシンに対してPXEブートを行いたい場合〜

最近のノートPCはNIC(LANケーブルを挿す穴)が搭載されていないことが多いですが、
デスクトップであったりNICが搭載されているノートPCと、 同様にTargetのマシンがあれば実マシンでのPXEブートが可能です。
その際、TargetマシンのBIOSの設定とPXEブートサーバを構築したVMマシンの設定を変更する必要があります。
TargetマシンのBIOS画面の起動方法は調べる必要がありますが、一般的にはPC起動時にF2キーを連打するとBIOS画面が起動できます。
BIOS画面が起動できたら、PXE(もしくはNetwork)を一番最初に起動するようにしてあげましょう。
PXEブートサーバを構築したVMマシンの設定は、「ネットワーク」をブリッジアダプターに変更します。
これで、実マシンに対するPXEブートができるはずです。

最後に

いかがだったでしょうか?
PXEブートサーバの構築方法だけでも色々とありますので、他のやり方もネットを参考にしながら試してみると面白いと思います。
また、Ubuntuのversionも変わって行くと各パッケージの仕様も色々と変わって行くので、
トライ&エラーを繰り返しながら動かしてみてください。 長々とお付き合いいただきありがとうございました。 それでは、良きPXEブートライフを!

アスタミューゼでは、エンジニア・デザイナーを募集しています。 ご興味のある方は是非、こちらのバナーから気軽にご応募ください。 お待ちしております!

Copyright © astamuse company, ltd. all rights reserved.