研究室の計算用サーバで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