dnsmasqはTFTPサーバ内蔵してるので、設定で有効にしてあげれば、DHCP + PXE + TFTPでネットワークブート&インストールするための環境を簡単に構築できます。
前提
こちらの手順とかをベースにdnsmasqはインストール済みとします。特にDHCP部分。
登場人物は全部CentOSになってるので、ほかのプラットフォームは読み替えてください
設定
TFTP有効化
例によって/etc/dnsmasq.conf
に設定ファイルあるけど分かりやすくするために/etc/dnsmasq.d/
以下に個別の設定ファイルを作る。
# cat /etc/dnsmasq.d/pxe-tftp.conf enable-tftp dhcp-boot=pxelinux.0 tftp-root=/var/lib/tftpboot
TFTPを有効にするにはenable-tftp
を記述。
tftp-root
は、コメントアウトされてるデフォルト設定は/var/ftpd
だけどコンテキストの具合がアレなので/var/lib/tftpboot
にしています。
(某所でtftp-server
もインストールして構築したけど不要でしたテヘペロ)
ブートローダーの設定
まずディレクトリ作成とアクセス権
# mkdir -p /var/lib/tftpboot # chown nobody:nobody /var/lib/tftpboot/ # chcon -u system_u /var/lib/tftpboot/ # chcon -t tftpdir_rw_t /var/lib/tftpboot/
yumでsyslinux
をインストール
# yum install syslinux
syslinuxパッケージに含まれるファイルをリンク
# ln -s /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
カーネルの設定
これはインストールに使うDVD ISOから取得する。
今回はCentOS 7 1908 MinimalのISOから持ってきた。
ISOのマウント
※ ネットワークインストールでも使うので、httpdとかで見えるとこにマウントしておくと良い
# mount -t iso9660 -o loop /mnt/archive/iso/CentOS-7-x86_64-Minimal-1908.iso /var/www/html/centos7-1908/
vmlinuz
とinitrd.img
の配置
※ SELinuxの設定がうまく行かない場合はcp
すると楽…
# ln -s /var/www/html/centos7-1908/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
設定ファイル
PXEブートしてきたクライアントマシンが参照するファイル。この内容に従って起動される。
ファイル名は「とりあえず」default
にする。
※ アクセス元IPアドレスやMACアドレスで、マシンごとの設定を行うことができる。個別設定が無い場合にdefault
というファイル名にアクセスする動作になる。
# mkdir /var/lib/tftpboot/pxelinux.cfg # cat /var/lib/tftpboot/pxelinux.cfg/default default install label install kernel vmlinuz append initrd=initrd.img inst.ks=http://192.168.0.19/ks/dhcp-client.cfg
ポイントはinst.ks=
の部分。
kickstartインストール用のファイルのURLを書いている。これはTFTPサーバと同じサーバでなくても構わない(PXEブートしたクライアントからアクセスできれば良い)
PXEでなくCDブートでkickstartインストールするときはこれを手入力してる(よね?)はずの内容を書いている。
全体のファイル構成はこんな感じ。
# tree /var/lib/tftpboot/ /var/lib/tftpboot/ ├── initrd.img -> /var/www/html/centos7-1908/images/pxeboot/initrd.img ├── pxelinux.0 -> /usr/share/syslinux/pxelinux.0 ├── pxelinux.cfg │ └── default └── vmlinuz -> /var/www/html/centos7-1908/images/pxeboot/vmlinuz 1 directory, 4 files
dnsmasqのリスタートとfirewalld設定
# systemctl restart dnsmasq # firewall-cmd --add-service=tftp --permanent --zone=internal # firewall-cmd --reload
これで、これからOSをインストールしたいマシンを無造作にパワーオンすれば、上記で言えばhttp://192.168.0.19/ks/dhcp-client.cfg
にkickstartファイルを参照しに行き、ここでは省略するけどkickstartファイルではcdrom
インストールではなくurl --url http://192.168.0.19/centos7-1908/
みたいにISOの中身を直接アクセスできるようにしておけば、メシでも食ってる間に完全無人インストールができるようになる。
IPアドレスやMACアドレスで設定を変える方法はまた別途…
(syslinuxに含まれる/usr/share/syslinux/menu.c32
を使えば簡単にできる)
ポイントとして、dnsmasq動かしてるサーバ側でtail -f /var/log/messages
しておくと、PXEブートしてきたクライアントにどんなアドレスをリースしたりどのファイルにアクセスしてるかだいたい出力されるので、最初はログを眺めながら実行するとわかりやすい。
参考
あと16年前()に自分で書いたやつも
当時はUSBとかの外付けCD-ROMドライブ持ってなかったし買ったら負けみたいな風潮が…(ない)