proxy dhcpを使ってネットワークブートする方法.

概要

ネットワークブートは一般にdhcpの機能として提供されます.dhcpのサーバの動作は以下の手順を踏みます.
1. 対象のマシンを起動させるときに,ネットワークブートを選択します.
2. ネットワークブートを選択すると,dhcpサーバをブロードキャストアドレスに問い合わせて探します.
3. dhcpサーバは対象のマシンにipアドレスを割り当てると同時に,ネットワークブートする際に必要なイメージの場所を通知します(このとき使用されるのはtftpサーバのアドレスです.).
4. 対象のマシンは通知されたipアドレスを用いてネットワークに接続し,ブートイメージを指定されたtftpサーバから落として起動します.
5. これ以降は,使用するブートイメージによって動作が変わります.

さて,上述したとおり,ネットワークブートではdhcpサーバの設定を変更することが必須となるわけですが,ネットワーク管理者でない限り,dhcpサーバの設定をいじれることは稀です.ではもうどうしようもないのかというとそんなことはなくて,proxy dhcpという方法があります.これは,proxy dhcpサーバという,ネットワークブートの機能だけをもたせたサーバをたてることで,ネットワークブートを行います.このサーバはipアドレスなどの割当は本物のdhcpサーバにお願いし,ブートに関する処理だけをproxy dhcp側で分離して行うものです.

今回の例では,以下のようなディレクトリ構成を想定しています.
– /srv/tftpディレクトリをtftpでの公開ディレクトリとする
– /srv/tftp/pxelinux.0という名前でpxelinuxのブートローダのイメージを配置しておく.
– /srv/tftp/debianディレクトリにカーネルといろいろを格納しておく.
– /srv/tftp/pxelinux.cfgディレクトリにpxelinuxの設定を置く.

やり方

proxy dhcpとして使える有名なソフトはdnsmasqというものです.これは標準レポジトリでインストールすることができます.dnsmasq自体は,汎用のdhcpサーバとして使える上に,tftpサーバの役割も持っています.ここでは,dnsmasqのproxy dhcpとtftpサーバの機能のみを利用することにします.そのために以下の設定を/etc/dnsmasq.confに加えます.

port=0はproxy dhcpとして使用することを意味しています.次のenable-tftpはtftpサーバを有効にする設定です.tftp-rootはtftpサーバのルートディレクトリを示します.ここでは/srv/tftp以下をtftpサーバで公開することになります.dhcp-rangeはproxy dhcpの適用範囲となるホストをネットワークアドレスで指定します.最後の,pxe-serviceですが,最初のx86PCは絶対に必要なおまじないだと考えましょう.次の”pxelinux”は単にラベルなので好きに指定して良いです.最後のpxelinuxはブートイメージを表します.この名前の最後には自動的に’.0’が末尾に追加されることになるので,実際に指定されるファイルの絶対アドレスは/srv/tftp/pxelinux.0となります.ここではネットワークブートにpxelinuxを使用するので,ブートするイメージはpxelinux.0です(このファイルはネット上から適当にダウンロードした後に,事前に/srv/tftpディレクトリを作ってコピーしておきます).

さて,この設定を行ったらdnsmasqを再起動します.次に必要なのはpxelinuxの設定です.この設定ファイルは/srv/tftp/pxelinux.cfgディレクトリにまとめます(存在しなければ作ってください).このディレクトリの位置は(おそらく)pxelinux.0と同じ階層である必要があるのかなと思います.このディレクトリ内のファイル名にはMACアドレスかipアドレス,そしてdefaultが使えます.例えばネットワークブートするマシンのMACアドレスがac-1f-6b-0a-XX-XXの場合には,pxelinux.cfgの中に,”01-ac-1f-6b-0a-XX-XX”というファイルを作ると,pxelinux.0はこのファイルを読み出すように働きます.もし,pxelinux.cfgの中に該当するMACアドレスのファイルがなければ,次にipアドレスで合致するファイルを探し,それもなければ”default”という名前のファイルを読み出します.

設定ファイルには例えば以下のようなことを書きます.

まずdefault debianですが,これは”debian”という名前のファイル,もしくはlabelを最初に読み出すことを指示します.例えばブート時にメニューを表示したいときには,menu.c32をpxelinux.0と同じディレクトリに持ってきておいて,default menu.c32とすれば,メニューを表示させることができます(現在は,menu.c32を使用する際に,libutil.c32もコピーしておく必要があります).ここでは,defaultの次の行にある,LABEL debian以下の設定を標準で呼び出すことを表しています.次の,kernel debian/vmlinuzはカーネルとしてdebian/vmlinuzを読み出せという指示です.このアドレスは,tftpのルートから見たディレクトリを指します.ですから,今回の場合は,/srv/tftp/debian/vmlinuzのことです.次のappendの行は様々な設定を行うためのものです.ここの部分の各オプションは次の意味を持ちます.

  • root : ブートしたあとのルートとなるデバイスを指定します.ディスクレスサーバの場合は/dev/nfsです.
  • initrd : initramfsのイメージを指定します.
  • net.ifnames : ネットワークカードの名前を認識した順でeth0, eth1, .., ethnという形で/dev/以下に割り当てます.ネットワークカードのデバイス名がわかっている場合はこのオプションは必要ありません.
  • nfsroot : nfsでルートシステムをマウントする際に指定します.ここではipアドレス172.20.24.21の/srv/nfsrootというディレクトリがマウントされます.
  • ip : ipアドレスの割り当て方を指定します.dhcpで割り当てる場合はip=dhcpとします.静的な場合は,ip=<ipアドレス>:<ネットワークブートの接続先サーバのipアドレス>:<デフォルトゲートウェイ>:<サブネットマスク>:<ホスト名>:<使用するネットワークデバイス>という形で指定します.後ろの方を省略する場合は,指定したいところまで記述してそれ以降を単に書かなければ良いです.例えばip=172.20.24.10:172.20.24.21だけでもOKです.
  • init : おそらく一番最初に起動するプロセスのことではないでしょうか.昔はinitというプロセスが一番最初に呼び出されて動いてましたが,今はsystemdを使うのが一般的です.
  • rw : ディスクへの読み書きを許可します.異常が出る可能性も充分あるので,roにしたほうが良いかもしれません.
  • quiet : 忘れました.

こんな感じの設定を各設定ファイルに書きます.もしすべてのマシンで同じ設定でブートするのであれば,pxelinux.cfgにはdefaultファイルのみを作ればいいです.さて,上記の設定を見れば分かる通り,カーネルとinitramfsのイメージだけは必ず用意する必要があります.iniramfsのイメージの作り方は,まずinitramfs.confを作ります.例を示します.

特に特筆すべき事はありませんが,一つだけ.DEVICEオプションには使用するネットワークデバイスを指定できます.さて,この設定ファイルを作ったら,

を実行します.ここで,-dオプションはinitramfs.confの場所を指定します.また-oオプションは出力ファイル名のことです.これを実行すると大量にエラーが出ますが,あまり気にする必要はありません.最後に,vmlinuzを実行中のリナックスからとってきます.ホストのカーネルイメージは/boot以下にあります.例えば,/boot/vmlinuz-4.9.0-amd64みたいな感じです.これをvmlinuzにして/srv/tftp/debian/以下にコピーします.

さてここまでをまとめるとディレクトリ構造は以下の通りとなります.

最後に,必要なものがあります.それはldlinux.c32というファイルです.これは/usr/lib/syslinux/modules/bios/ldlinux.c32というところにあります.これをpxelinux.0があるディレクトリにコピーします(sudo apt install syslinuxを事前にしておくこと).

以上により必要な処理は終わりです.ネットワークブートをして動作を確認します.

内容についてどう思いますか?
  • いいね (3)
  • だめ (0)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA