Fedora 25: NFSを使ったシンクライアントのPXE Bootサーバをインストールする

この記事ではNFSを使ったシンクライアントのPXE Bootサーバをインストールし、PXEBootサーバにネットワーク接続されたマシンでFedora 25を起動します。クライアントにFedora 25をインストールする必要はありません。

1 PXE Bootサーバをインストールする

以下のスクリプトでPXE Bootサーバをインストールします。環境に合わせて変数を変更してください。

  • SERVER_IPADDRはPXE BootサーバのIPアドレスです。
  • DHCP_SERVER_INTERFACESv4はPXE Bootサーバのネットワークインターフェース名です。DHCPはこのネットワークインターフェースで配布されます。
  • DHCP_SUBNETはDHCPで配布するネットワークアドレスです。
  • DHCP_NETMASKはDHCPで配布するサブネットです。
  • DHCP_DNSはDHCPで配布するDNSです。
  • DHCP_ROUTERはDHCPで配布するゲートウェイです。
  • DHCP_CLIENT_HOSTNAMEはクライアントのホスト名です。
  • DHCP_CLIENT_IPADDRはクライアントに配布するIPアドレスです。
  • DHCP_CLIENT_MACADDRはクライアントのMACアドレスです。

変数とは無関係にNFSのルートファイルシステムに以下の設定を実行します。

  • rootユーザのパスワードはfedoraです。
  • ユーザ名がfedora、パスワードがfedoraのユーザを作成します。
#!/bin/sh

set -e

# Change the following variable to yours.
[ -z "${SERVER_IPADDR}" ] && \
  SERVER_IPADDR=$(hostname -I | awk '{ print $1 }')
[ -z "${DHCP_SUBNET}" ] && DHCP_SUBNET=192.168.11.0
[ -z "${DHCP_NETMASK}" ] && DHCP_NETMASK=255.255.255.0
[ -z "${DHCP_DOMAIN}" ] && DHCP_DOMAIN=hiroom2.com
[ -z "${DHCP_DNS}" ] && DHCP_DNS="192.168.11.2, 192.168.11.1"
[ -z "${DHCP_ROUTER}" ] && DHCP_ROUTER=192.168.11.1
[ -z "${DHCP_CLIENT_HOSTNAME}" ] && \
  DHCP_CLIENT_HOSTNAME=fedora-25-pxeboot-client
[ -z "${DHCP_CLIENT_IPADDR}" ] && DHCP_CLIENT_IPADDR=192.168.11.254
[ -z "${DHCP_CLIENT_MACADDR}" ] && DHCP_CLIENT_MACADDR=52:54:00:5e:7a:a4

if [ -z "${MIRROR_URL}" ]; then
  F25=https://dl.fedoraproject.org/pub/fedora/linux/releases/25
  MIRROR_URL=${F25}/Workstation/x86_64/os/
fi

tftp_server_install()
{
  sudo dnf install -y tftp-server
  sudo firewall-cmd --add-service=tftp --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable tftp
  sudo systemctl restart tftp
}

dhcp_install()
{
  sudo dnf install -y dhcp

  cat <<EOF | sudo tee /etc/dhcp/dhcpd.conf
subnet ${DHCP_SUBNET} netmask ${DHCP_NETMASK} {
  option domain-name "${DHCP_DOMAIN}";
  option domain-name-servers ${DHCP_DNS};
  option routers ${DHCP_ROUTER};
  next-server ${SERVER_IPADDR};
  filename "pxelinux.0";
}

host ${DHCP_CLIENT_HOSTNAME} {
  hardware ethernet ${DHCP_CLIENT_MACADDR};
  fixed-address ${DHCP_CLIENT_IPADDR};
}
EOF

  sudo firewall-cmd --add-service=dhcp --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable dhcpd
  sudo systemctl restart dhcpd
}

nfs_utils_install()
{
  sudo dnf install -y nfs-utils
  sudo firewall-cmd --add-service=nfs --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable nfs
  sudo systemctl restart nfs

  sudo mkdir /var/lib/nfsroot
  cat <<EOF | sudo tee /etc/exports
/var/lib/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
EOF
  sudo exportfs -ra

  sudo mkdir /var/lib/nfsroot/proc
  sudo mount -o bind /proc /var/lib/nfsroot/proc
  # shellcheck disable=SC2086
  sudo dnf group install -y --releasever=25 \
       --installroot=/var/lib/nfsroot "Fedora Workstation"

  # https://bugzilla.redhat.com/show_bug.cgi?id=1374427
  sudo restorecon /var/lib/nfsroot/etc/passwd* /var/lib/nfsroot/usr/bin/passwd

  sudo systemd-nspawn -D /var/lib/nfsroot sh -c "
# Set root password and create user.
yes fedora | passwd
useradd -m -s /bin/bash fedora
yes fedora | passwd fedora

# Locale setting.
echo LANG=\"en_US.UTF-8\" | tee /etc/locale.conf
"
}

syslinux_install()
{
  sudo dnf install -y syslinux

  cd /var/lib/tftpboot
  sudo cp /usr/share/syslinux/pxelinux.0 .
  sudo cp -a /usr/share/syslinux .

  sudo wget -q ${MIRROR_URL}/isolinux/initrd.img
  sudo wget -q ${MIRROR_URL}/isolinux/vmlinuz

  sudo mkdir pxelinux.cfg
  cat <<EOF | sudo tee pxelinux.cfg/default
path syslinux
include menu.cfg
default syslinux/vesamenu.c32
prompt 0
timeout 10
EOF

  cat <<EOF | sudo tee menu.cfg
menu hshift 13
menu width 49
menu margin 8
menu tabmsg

menu title Thin client boot menu
label fedora-25-thin-client
  menu label ^Fedora 25 thin client
  kernel vmlinuz
  append vga=788 initrd=initrd.img ip=dhcp \
    root=/dev/nfs nfsroot=${SERVER_IPADDR}:/var/lib/nfsroot rw selinux=0
menu end
EOF
}

pxeboot_main()
{
  tftp_server_install
  dhcp_install
  nfs_utils_install
  syslinux_install
}

pxeboot_main

2 NFSを使ったFedora 25シンクライアントを起動する

この記事ではKVMの仮想マシンにFedora 25シンクライアントを起動します。KVM以外の環境でもPXE Boot(あるいはBOOTP)を有効にすることでFedora 25シンクライアントを起動できます。BIOSの設定等をご確認ください。

virt-managerのBoot device orderでNICを有効にし、一番上にします。

0001_BootDeviceOrder.png

iPXEが立ち上がり、DHCPリクエストを送信します。PXE Bootサーバから応答があり、TFTPでブートイメージをダウンロードして起動します。

0002_iPXE.png

syslinuxのメニュー画面が立ち上がります。1秒後に"Fedora 25 thin client"が自動選択されます。

0003_syslinux.png

Fedora 25シンクライアントが起動します。

0004_BootFedora.png

ログイン画面が表示されます。

0005_Login.png