先日DHCPとmatchboxというOSSを利用してNetbootを行ったので、その時のメモを残しておきます。
私はネットワーク初心者なため、この記事はあまり有用なものではないと思います。
また一般的にはNetbootを行う際はDHCPによるIPの払い出しは行わないと思います…。
実現したいこと
物理マシンの電源を入れてしばらく待つと自動でUbuntu Serverがインストールされて利用可能状態になっていること
環境について
今回は学習目的(興味本位)で、物理マシンと仮想マシンの両方で同一手法によるNetbootを試してみました。
基本的にここで説明している手順は実験環境2で利用したものになっています。(IPアドレスなど)
実験環境1 (物理マシン)
- Thinkpad 2台(研究室の備品を借りたため執筆時に手元にないため型番はわかりません…)
ネットワークアドレスを192.168.10.0/24とし、サーバー役に192.168.10.150を割り当てました。
サーバ役にはOSとしてUbuntu Desktop 22.04を用いました。
実験環境2 (仮想マシン)
ハイパーバイザーとしてProxmoxを利用し、そのうえにVMを2つ立てて検証しました。
- DHCPサーバ(10.10.10.12/24)
- OS: Ubuntu Server 22.04
- CPU: 4 cores
- RAM: 4GB
- HDD: 32GB
- クライアント(dhcp)
- CPU: 4 cores
- RAM: 6GB
- HDD: 32GB
DHCPサーバを準備する
DHCPサーバーとしてisc-dhcp-serverを利用しました。
インストール
以下のコマンドでインストールしました。
|
|
設定
dhcpd.conf
を作成し、以下のように記述しました。
|
|
|
|
コンフィグファイルについては、多少のネットワークの知識があれば読み解けるようになっていると思います。
また、今回はBIOSのみを想定しています。UEFIの場合はもう少し別の設定を入れる必要があります。
|
|
この部分はDHCPのDiscoverにあるOption 60を見て送信元がPXEかiPXEか判定しています。
filename で指定しているURLは後述するmatchboxのURLです。
設定の上書き
|
|
isc-dhcp-serverは/etc/dhcp/dhcpd.conf
を参照しているため、手元のdhcpd.confで上書きしておきます。
起動
|
|
起動後、以下コマンドで起動できているか確認します。
|
|
active になっていれば問題なく設定ができています。
TFTPサーバを準備する
PXEからiPXEにチェーンロードするために、後述するundionly.kpxeというバイナリを提供する必要があります。
PXEはTFTPによるファイルの取得が行えるため、TFTPサーバを用意します。DHCPサーバと別に用意してもいいですが、今回はDHCPサーバと兼任させることにしました。
インストール
|
|
インストール出来れば、設定ファイルが作成されるので確認します。
|
|
デフォルトでは/srv/tftp/
をもとにファイルを提供するようなので、作成していない場合はこのディレクトリを作成しておきます。
|
|
起動
|
|
undionly.kpxe を準備する
undionly.kpxeはPXEからiPXEにチェーンロードするために必要になるバイナリです。
ダウンロード
|
|
TFTPのディレクトリに配置する
|
|
matchboxを準備する
matchboxは公式サイトで以下のように説明されています。
Matchbox is a service that matches bare-metal machines to profiles that PXE boot and provision clusters.
Matchboxは、ベアメタルマシンと、PXEブートとクラスタのプロビジョニングを行うプロファイルをマッチングするサービスです。(DeepL翻訳)
よくわからなかったので、matchboxが提供するエンドポイントにリクエストを送信すると事前定義したプロファイルに基づき、対応したネットブート設定を吐き出してくれるサービスと私は認識しました。
インストール
matchboxのGitHubから最新のリリースを取得します
|
|
解凍すると、その中にmatchboxという名前のバイナリがあるので、適当にパスを通してください。
基本ディレクトリの作成
matchboxでは以下のディレクトリをデフォルトで利用するので、作成しておきましょう。
- /var/lib/matchbox/
- /var/lib/matchbox/assets/
- /var/lib/matchbox/groups/
- /var/lib/matchbox/profiles/
グループの作成
グループではプロファイルに一致させるためのセレクターなどを記述します。
今回はMACアドレスをベースにマッチングを行いました。
/var/lib/matchbox/groups/
にnode-1.json
を作成します。
|
|
matchboxではこのグループにマッチした場合、profile
というキーをもとに/var/lib/matchbox/profiles/
内にあるプロファイルを自動選択します。
プロファイルの作成
プロファイルではネットブートについて定義します。
/var/lib/matchbox/profiles/
にinstall-node-1.json
を作成します。
|
|
Ubuntuを起動する場合は引数に、ip=dhcp
を指定する必要があります。
Ubuntu起動後にcloud-initによる自動化を図る場合は、autoinstall
とds=nocloud-net;s=http://10.10.10.12/assets/
を引数に指定する必要があります。
注意点ですが、ds=nocloud-net;s={URL}
でURLを指定する場合は、最後が/
で終わっている必要があります。
また、URL先にはcloud-initの仕様としてmeta-data
とuser-data
が格納されている必要があります。
- 参考: Ubuntu Manpage: casper
- 参考: Netbooting the server installer on amd64 | Ubuntu
- 参考: Bug #1848018 “[solved] PXE boot/nfsboot broken; Eoan Ermine; 19...” : Bugs : casper package : Ubuntu
- 参考: pxe - Deploying Ubuntu 22.04 with PXEBoot using Syslinux - Super User
assetsの用意
先ほど作成したプロファイルに記述があったisoファイルと、その中にあるvmlinuz、initrdを取り出してassetsディレクトリに用意しておきます。
|
|
ISOのダウンロードとマウント
|
|
必要なファイルをコピー
|
|
これで準備は終わりです。
cloud-init のデータを用意する
cloud-initによる自動化を行うため、user-dataを作成します。
|
|
|
|
パスワードはubuntu
です。
また、meta-dataも作成しておきます。
meta-dataの中身は空っぽのままで大丈夫です。
|
|
これら二つを/var/lib/matchbox/assets/
直下に移動しておきます。
|
|
複数のディストリビューションなどをインストールする場合は、別ディレクトリに移動すべきですが今回はUbuntuのみを想定しているので問題ありません。
matchboxを起動する
|
|
クライアントを起動する
すべての準備が終わったので、ターゲットとなるクライアントPCの電源を入れます。
全行程が問題なく終わっていれば、PXEからiPXEにチェーンロードします。
その後、Ubuntuが起動し、cloud-initが走ります。
しばらく待つと、ubuntu-serverというホスト名でUbuntuが起動しているはずです。
もし、ISOファイル取得中にno space left on device
と表示され処理が中断された場合は、メモリが足りません。
VMの場合は割り当てを増やしましょう。
[余談] 奇妙なバグが起きた
今回はUbuntu20.04, 22.04でNetbootが正しく行えるかチェックしました。
Ubuntu20.04は物理マシンも仮想マシンもどちらも正常にNetboot + cloud-initを完了することができました。
しかし、Ubuntu22.04では物理マシンのみNetboot + cloud-initを完了することができました。
仮想マシンでUbuntu22.04を起動した場合、Netbootまでは正常に動作しましたが、cloud-initを行う段階においてds=nocloud-net
で指定しているURLにリクエストを送信しないというバグが発生しました。
できる範囲で調査は行ったのですが、原因らしい原因は見つけることができませんでした。
また、物理マシンにおいてもUbuntu22.04はcloud-initによる設定がUbuntu20.04のときよりも処理に時間が掛かっていました。
時間がなかったため、時間の測定などは十分に行えていないので検証すべき点はたくさんあります…。
おわりに
以上がDHCPサーバとmatchboxを使ってUbuntuをNetbootしたときのメモ書きです。
Ubuntu 20.04では正常に動作したものが22.04で動作しなかったのは少モヤモヤしますが、やりたいことは実現できたのでよかったです。
原因はいつか解明したいと思います。