PXE・Kickstartの構築:Rocky Linux 9のUEFI無人インストール
EdwardMoon
この記事では、UEFI x86_64クライアントがPXE/TFTPで署名付きshim・GRUBとカーネルを取得し、HTTPでRocky LinuxのインストールツリーとKickstartファイルを読み込む構成を扱います。UEFI HTTP Bootと従来のBIOSではブートファイルとDHCPの分岐が異なり、別の構築が必要なため、以下の例には含めません。
Rocky Linux 9.8系を例にしますが、メディアのカーネル、initrd、パッケージツリーは必ず同じリリースにそろえてください。DHCPはネットワーク全体に影響するため、既存の本番DHCPと重ならない隔離VLANで先に試験します。
構成要素
| 構成要素 | 役割 | 運用基準 |
|---|---|---|
| DHCP | IP、起動ファイル、サーバーの通知 | 既存DHCPと競合させない |
| TFTP/PXE | UEFI shim、GRUB、カーネル、initrdの配信 | 起動用ファイルだけを提供する |
| HTTP | インストールツリーとks.cfgの配信 | アクセスログを残し、公開範囲を最小化する |
| Kickstart | Anacondaへの応答の自動化 | 検証、バージョン管理、秘密情報の分離 |
手順1:ISOを検証し、インストールツリーを準備する
# 先に公式Rocky 9.8 x86_64 DVD ISOを現在のディレクトリへダウンロードします。
curl --fail --location --remote-name https://download.rockylinux.org/pub/rocky/9.8/isos/x86_64/CHECKSUM
test -f Rocky-9.8-x86_64-dvd.iso
sha256sum --check --ignore-missing CHECKSUM
# 上記検査で対象DVD ISOのOKを確認してから進めます。
sudo dnf install -y httpd rsync dnsmasq tcpdump
sudo install -d -m 0755 /mnt/rocky9 /var/www/html/rocky/9.8
sudo mount -o loop,ro Rocky-9.8-x86_64-dvd.iso /mnt/rocky9
# 次の対象は新たに用意した9.8専用インストールツリーです。既存ファイルは--deleteで削除される場合があります。
sudo rsync -aH --delete /mnt/rocky9/ /var/www/html/rocky/9.8/
sudo restorecon -RFv /var/www/html/rocky
公式HTTPSサイトのCHECKSUMで、9.8のDVD ISOそのものの項目が一致することを確認します。別のファイルだけがOKでも、このISOを検証したことにはなりません。組織の供給網方針で署名検証が必要なら、Rockyが配布する署名と信頼済みの公式鍵も検証してください。ISOは読み取り専用でマウントし、インストールツリー全体を保持します。
手順2:HTTPサービスを構成する
演習専用NIC ens192にサーバーアドレス192.0.2.10/24を事前設定し、その接続をfirewalldのinternalゾーンへ割り当てます。ゲートウェイ、DNS、NIC名は実際の隔離VLANに合わせます。サービスを許可する前に、firewall-cmd --get-zone-of-interface=ens192がinternalを返すことを確認してください。本番NICをこの演習用ゾーンへ移動しないでください。
sudo dnf install -y httpd
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --zone=internal --add-service=http
sudo firewall-cmd --reload
curl --fail --head http://192.0.2.10/rocky/9.8/.treeinfo
sudo journalctl -u httpd --since '-10 min' --no-pager
手順3:TFTPの起動ファイルを配置する
検証した同じDVD ISOの署名付きUEFIファイルを使用します。shimは同じディレクトリのgrubx64.efiを読み込み、GRUBは同じリリースのカーネルとinitrdを使います。別途tftp.socketを起動せず、次の手順のdnsmasqにUDP 69を担当させます。
sudo install -d -m 0755 /var/lib/tftpboot/rocky9
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/shimx64.efi
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/grubx64.efi /var/lib/tftpboot/grubx64.efi
sudo install -m 0644 /mnt/rocky9/images/pxeboot/vmlinuz /var/lib/tftpboot/rocky9/vmlinuz
sudo install -m 0644 /mnt/rocky9/images/pxeboot/initrd.img /var/lib/tftpboot/rocky9/initrd.img
sudo restorecon -RFv /var/lib/tftpboot
ls -l /var/lib/tftpboot/{shimx64.efi,grubx64.efi,rocky9/vmlinuz,rocky9/initrd.img}
メディアに該当パスがない、またはファイル名が異なる場合はコピーを中止し、ISOのアーキテクチャと内容を確認します。Secure Bootでは、shim、GRUB、カーネルの署名チェーンとファームウェアの信頼ストアが一致する必要があります。
手順4:DHCP・TFTPを設定する
次の内容を/etc/dnsmasq.d/pxe.confへ保存し、既存のdnsmasq設定と重複していないか確認します。DHCP architectureの7と9をUEFI x86_64として扱い、他のアーキテクチャには起動ファイルを通知しません。
sudoedit /etc/dnsmasq.d/pxe.conf
次は専用の演習VLAN向けの設定です。本番ネットワークにDHCPが存在する場合は適用せず、既存DHCPの管理者がアーキテクチャ別のbootfileとnext-serverを設定してください。
port=0
interface=ens192
bind-interfaces
dhcp-range=192.0.2.100,192.0.2.180,255.255.255.0,12h
dhcp-option=3,192.0.2.1
dhcp-option=6,192.0.2.53
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
dhcp-boot=tag:efi64,shimx64.efi
log-dhcp
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
sudo firewall-cmd --permanent --zone=internal --add-service=tftp
sudo firewall-cmd --reload
sudo journalctl -u dnsmasq -f
手順5:ブートメニューを作成する
UEFI GRUBメニュー
次のメニューをTFTPルートの/var/lib/tftpboot/grub.cfgに保存します。試験時はdnsmasqログかパケットキャプチャで、GRUBが実際に要求したパスも確認してください。
sudoedit /var/lib/tftpboot/grub.cfg
sudo restorecon -RFv /var/lib/tftpboot
set timeout=5
menuentry 'Install Rocky Linux 9.8 with Kickstart' {
linuxefi /rocky9/vmlinuz ip=dhcp inst.repo=http://192.0.2.10/rocky/9.8/ inst.ks=http://192.0.2.10/ks/rocky9.cfg
initrdefi /rocky9/initrd.img
}
GRUBのコマンドはメディアの実際の起動設定に基づいて確認します。ファームウェアとGRUBの組み合わせによってはlinuxとinitrdを使う場合もあるため、同じ種類のVMで先に起動試験を行います。
手順6:最小権限のKickstartを作成する
次の例を/var/www/html/ks/rocky9.cfgに保存します。opsadminのパスワードハッシュは必ず実際のハッシュへ変更し、HTTPアクセスをインストール用VLANに制限してください。プレースホルダーのままでは正常に管理者ログインできません。
sudo install -d -m 0755 /var/www/html/ks
sudoedit /var/www/html/ks/rocky9.cfg
text
url --url=http://192.0.2.10/rocky/9.8/
lang ko_KR.UTF-8
keyboard kr
timezone Asia/Seoul --utc
network --bootproto=dhcp --device=link --activate
rootpw --lock
user --name=opsadmin --groups=wheel --iscrypted --password='$6$REPLACE_WITH_A_REAL_HASH'
ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
autopart --type=lvm
selinux --enforcing
firewall --enabled --service=ssh
reboot
%packages
@^minimal-environment
chrony
%end
%post --log=/root/ks-post.log
systemctl enable chronyd
%end
clearpart --allは指定ディスクのデータを削除します。サーバーモデルごとのディスク名とWWNを確認し、空の試験用VMで検証してから使ってください。例のパスワードハッシュは実際の強固なハッシュに置き換え、公開WebサーバーやGitに秘密情報を置かないでください。
手順7:Kickstartの構文を検証する
sudo dnf install -y pykickstart
ksvalidator -v RHEL9 /var/www/html/ks/rocky9.cfg
curl --fail http://192.0.2.10/ks/rocky9.cfg | head
curl --fail http://192.0.2.10/rocky/9.8/.treeinfo | head
sudo restorecon -RFv /var/www/html/ks
手順8:UEFI VMでインストールを試験する
- 空のディスクを接続したUEFI VMを専用VLANに作成する。
- DHCP offerのアドレス、next-server、bootfileをパケットキャプチャで確認する。
- カーネル引数のinst.repoとinst.ksに対応する応答を確認する。
- インストール中はAnacondaログとHTTPアクセスログを併せて見る。
- 再起動後にSELinux、ファイアウォール、時刻同期、管理者アカウントを検証する。
sudo tcpdump -ni ens192 -vvv 'port 67 or port 68 or port 69'
sudo tail -f /var/log/httpd/access_log /var/log/httpd/error_log
# インストーラー画面のシェルで確認
ip address
cat /proc/cmdline
curl --fail http://192.0.2.10/ks/rocky9.cfg
journalctl -b --no-pager | tail -200
手順9:インストール後に検証する
cat /etc/rocky-release
uname -r
sudo dnf upgrade --refresh -y
sudo systemctl --failed --no-pager
getenforce
sudo firewall-cmd --list-all
chronyc tracking
sudo journalctl -p err -b --no-pager
構築後はインストール結果を再現可能なビルド成果物として管理します。ISOのチェックサム、Kickstartのバージョン、起動ファイルのハッシュ、試験したファームウェアの種類、成功したインストールの記録をまとめて保管してください。
セキュリティと運用上の注意
- Kickstart URLへは、必要なインストールVLANからだけアクセスできるようにする。
- 登録トークンやSSH秘密鍵をファイルへ直接書かない。
- HTTPアクセスログで異常な大量リクエストを監視する。
- TFTPは起動ファイルの配信だけに使い、インストールパッケージはHTTPで提供する。
- 本番DHCPの変更は、レビューとロールバック計画を経て実施する。
- インストール作業のない時間帯はPXE経路を遮断する。
公式資料と関連記事
- RHEL 9自動インストールの公式資料
- RHEL 9のUEFI HTTPインストールの準備
- RHEL 9のKickstart起動方法
- Rocky Linux 9.8インストールガイド
- Ansible自動化運用ガイド
まとめ
PXE・Kickstartの構築では、DHCP、ブート転送、HTTPインストールツリー、検証済みKickstartを一連の流れとして設計します。このUEFI x86_64例ではPXE/TFTPとHTTPツリーの連携を確認します。ISOチェックサム、構文検査、空のVMへのインストール、導入後のセキュリティ確認をすべて通過してから、無人インストールを本番で使用してください。