zaki work log

作業ログやら生活ログやらなんやら

dnsmasqを使ったDHCP/PXE/TFTPでネットワークブートとインストール

dnsmasqはTFTPサーバ内蔵してるので、設定で有効にしてあげれば、DHCP + PXE + TFTPでネットワークブート&インストールするための環境を簡単に構築できます。

前提

こちらの手順とかをベースにdnsmasqはインストール済みとします。特にDHCP部分。

zaki-hmkc.hatenablog.com

登場人物は全部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/

yumsyslinuxをインストール

# 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/

vmlinuzinitrd.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.cfgkickstartファイルを参照しに行き、ここでは省略するけど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ブートしてきたクライアントにどんなアドレスをリースしたりどのファイルにアクセスしてるかだいたい出力されるので、最初はログを眺めながら実行するとわかりやすい。

f:id:zaki-hmkc:20200130223953p:plain


参考

www.atmarkit.co.jp

あと16年前()に自分で書いたやつも

jp-z.jp

当時はUSBとかの外付けCD-ROMドライブ持ってなかったし買ったら負けみたいな風潮が…(ない)