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


Table of Contents

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ユーザのパスワードはdebianです。
  • ユーザ名がdebian、パスワードがdebianのユーザを作成します。
  • task-gnome-desktopパッケージとopenssh-serverパッケージをインストールします。

#!/bin/shset -e# Change the following variable to yours.[ -z “${SERVER_IPADDR}” ] && SERVER_IPADDR=$(hostname -I | awk ‘{ print $1 }’)[ -z “${DHCP_SERVER_INTERFACESv4}” ] && DHCP_SERVER_INTERFACESv4=ens3[ -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=debian-9-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:a4atftpd_install(){ sudo apt install -y atftpd sudo systemctl enable atftpd sudo systemctl restart atftpd}isc_dhcp_server_install(){ sudo apt install -y isc-dhcp-server sudo sed -e ‘s/^#DHCPDv4_CONF=/DHCPDv4_CONF=/g’ -e ‘s/^#DHCPDv4_PID=/DHCPDv4_PID=/g’ -e “s/INTERFACESv4=””/INTERFACESv4=”${DHCP_SERVER_INTERFACESv4}”/g” -i /etc/default/isc-dhcp-server cat <<EOF | sudo tee /etc/dhcp/dhcpd.confsubnet ${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 systemctl restart isc-dhcp-server}nfs_kernel_server_install(){ # Set NFS server. sudo apt install -y nfs-kernel-server debootstrap systemd-container sudo mkdir /srv/nfs4 echo “/srv/nfs4 *(rw,sync,no_root_squash,no_subtree_check)” | sudo tee /etc/exports sudo exportfs -ra # Create root filesystem. URL=$(grep “^deb .* stretch main” /etc/apt/sources.list | awk ‘{ print $2 }’) sudo debootstrap stretch /srv/nfs4 “${URL}” # Get debconf from server for locale and keyboard. sudo apt install -y debconf-utils systemd-container sudo debconf-get-selections | grep locale | sudo tee /srv/nfs4/debconf.txt sudo debconf-get-selections | grep keyboard-configuration | sudo tee -a /srv/nfs4/debconf.txt sudo systemd-nspawn -D /srv/nfs4 sh -c “apt update -yapt upgrade -y# Set debconf to client for locale and keyboard.cat debconf.txt | debconf-set-selectionsapt install –reinstall -y locales keyboard-configurationrm -f debconf.txt# Install kernel and create initrd.apt install -y initramfs-tools linux-image-amd64cat <<EOF > /etc/initramfs-tools/initramfs.confMODULES=netbootBUSYBOX=autoKEYMAP=nCOMPRESS=gzipDEVICE=NFSROOT=${SERVER_IPADDR}:/srv/nfs4BOOT=nfsEOFupdate-initramfs -tu# Install GNOME desktop and OpenSSH server.apt install -y task-gnome-desktop openssh-server# Set root password and create user.yes debian | passwduseradd -m -s /bin/bash debianyes debian | passwd debian# systemd needs /etc/fstab entry too while using nfsroot.echo ‘${SERVER_IPADDR}:/srv/nfs4 / nfs defaults 0 0’ > /etc/fstab# Generate /etc/resolv.conf with dhclient.rm -f /etc/resolv.confcat <<EOF > /lib/systemd/system/dhclient.service[Unit]Description=Run dhclient to generate /etc/resolv.confAfter=network.target[Service]ExecStart=/sbin/dhclientExecReload=/sbin/dhclient[Install]WantedBy=multi-user.targetEOFln -s /lib/systemd/system/dhclient.service /etc/systemd/system/multi-user.target.wants/dhclient.service”}pxelinux_install(){ cd /srv/tftp sudo apt install -y pxelinux syslinux sudo ln -s /usr/lib/syslinux/modules/bios sudo ln -s /usr/lib/PXELINUX/pxelinux.0 sudo ln -s /usr/lib/syslinux/modules/bios/ldlinux.c32 sudo ln -s /srv/nfs4/vmlinuz sudo ln -s /srv/nfs4/initrd.img sudo mkdir pxelinux.cfg cat <<EOF | sudo tee pxelinux.cfg/defaultpath biosinclude menu.cfgdefault bios/vesamenu.c32prompt 0timeout 10EOF cat <<EOF | sudo tee menu.cfgmenu hshift 13menu width 49menu margin 8menu tabmsgmenu title Thin client boot menulabel debian-9-thin-client menu label ^Debian 9 thin client kernel vmlinuz append vga=788 initrd=initrd.img ip=dhcp nfsroot=${SERVER_IPADDR}:/srv/nfs4 rwmenu endEOF}pxeboot_main(){ atftpd_install isc_dhcp_server_install nfs_kernel_server_install pxelinux_install}pxeboot_main

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

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

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

0001_BootDeviceOrder.png

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

0002_iPXE.png

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

0003_syslinux.png

D
ebian 9シンクライアントが起動します。

0004_BootDebian.png

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

0005_Login.png

Android | Linux | SDL - Narrow Escape