CentOS 8 ネットワークブート環境の構築

研究室の計算用サーバでCentOS 7をネットワークブート(PXEブート)させて使用していますが、 CentOS 8へ更新し再構築をするため、ネットワークブート環境の構築手順をメモしたのでついでに公開します。

CentOS 7との違い

sshd用の鍵生成を行うコマンドが/usr/sbin/sshd-keygenから/usr/libexec/openssh/sshd-keygenに変わりました。また、暗号化方式ごとに生成コマンドを実行する必要があります。

諸注意

  • ブート用サーバもCentOS 8を使用します。
  • ブート用サーバはSELinux, Firewallはどちらも無効化しています。必要に応じて有効化してください。
  • クライアント用rootfsはreadonlyとしています。
    • 一応起動できますが、var以下に書き込めないためエラーが生じます。
    • 研究室ではoverlayfsを用いて一部ディレクトリの上にtmpfsを重ねることで問題を回避しています。
    • readonly-rootパッケージを用いて対策することも可能だと思います。
  • とりあえず起動できる状態までの手順です。必要に応じてカスタムしてください。

クライアント用rootfsの構築

# 初期化
rpm --root /srv/client/rootfs --initdb
dnf -y --downloadonly --downloaddir=`pwd` reinstall centos-release
rpm --root /srv/client/rootfs -ivh --nodeps centos-release-*.rpm
dnf -y --installroot /srv/client/rootfs reinstall centos-release

# 各パッケージのインストール
dnf -y --installroot /srv/client/rootfs groupinstall "Server"
dnf -y --installroot /srv/client/rootfs install nfs-utils kernel

# uid/gidの修正 (rpmのバグでクライアント用rootfsのuid/gidがサーバ側のユーザ情報を元に設定される問題へのワークアラウンド)
chroot /srv/client/rootfs bash -c "rpm -aq | xargs rpm --setugids"

# SELinuxの無効化 (石川さんごめんなさい)
sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/g' /srv/client/rootfs/etc/selinux/config
# 鍵生成
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen rsa
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen ecdsa
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen ed25519
# /tmp のRAMDISK化
chroot /srv/client/rootfs systemctl enable tmp.mount
# パスワードの設定
chroot /srv/client/rootfs passwd root

PXEブートのためのDHCP, TFTPサーバ構築

事前にclient用LAN向けIPを192.168.11.1/24と設定しておく。

# Dnsmasq (DNS, DHCPやTFTPのサーバ), PXELINUX (SYSLINUX)
dnf install dnsmasq syslinux

# TFTP用フォルダの作成
mkdir -p /srv/client/tftp/pxelinux.cfg
# PXELINUXをtftp用フォルダにコピー
cp /usr/share/syslinux/{pxelinux.0,ldlinux.c32,menu.c32,libutil.c32} /srv/client/tftp/

# Dnsmasqの設定
cat > /etc/dnsmasq.d/tftp.conf << EOS
# dhcp
listen-address=192.168.11.1
dhcp-range=192.168.11.2,192.168.11.128,24h

# tftp
enable-tftp
tftp-root=/srv/client/tftp
dhcp-boot=pxelinux.0
EOS

# PXELINUXのブート設定
cat > /srv/client/tftp/pxelinux.cfg/default << EOS
UI menu.c32
PROMPT 0

TIMEOUT 50
DEFAULT linux

LABEL linux
        MENU LABEL Linux
        LINUX vmlinuz
        APPEND root=nfs:192.168.11.1:/srv/client/rootfs,vers=4.2 ro
        INITRD initramfs-pxeboot.img
EOS

# カーネルのコピー
cp /srv/client/rootfs/boot/vmlinuz-* /srv/client/tftp/vmlinuz

# initramfsの生成 (カーネルのバージョンについては適時修正)
mount --bind /proc /srv/client/rootfs/proc
# クライアントのハードウェア構成によってはネットワークデバイスのドライバ追加が必要 (--add-drivers igb など)
chroot /srv/client/rootfs dracut --force --add nfs /boot/initramfs-pxeboot.img 4.18.0-147.5.1.el8_1.x86_64
umount /srv/client/rootfs/proc

cp /srv/client/rootfs/boot/initramfs-pxeboot.img /srv/client/tftp/
chmod a+r /srv/client/tftp/initramfs-pxeboot.img

rootfs公開用NFSサーバの設定

dnf -y install nfs-utils

echo '/srv/client/rootfs 192.168.11.0/24(ro,async,no_root_squash)' >> /etc/exports
echo 'RPCNFSDARGS="-V 4.2"' >> /etc/sysconfig/nfs
systemctl enable --now rpcbind
systemctl enable --now nfs-server

更新履歴

  • (2020/02/25) dracutによるinitramfs生成時には/devのマウントは必要ないため削除しました.
  • (2020/02/26) centos-releaseのreinstallを追加.uid/gidの修正を追加.