CentOS 7: 自動インストールのPXE Bootサーバをインストールする

この記事では自動インストールのPXE Bootサーバをインストールして、PXE Bootサーバにネットワーク接続されたマシンにCentOS 7を自動でインストールします。 クライアントのメモリサイズを1536MBより大きくする必要があります

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

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

  • SERVER_IPADDRはPXE BootサーバのIPアドレスです。
  • DHCP_SUBNETはDHCPで配布するネットワークアドレスです。
  • DHCP_NETMASKはDHCPで配布するサブネットです。
  • DHCP_DOMAINはDHCPで配布するドメインです。
  • DHCP_DNSはDHCPで配布するDNSです。
  • DHCP_ROUTERはDHCPで配布するゲートウェイです。
  • DHCP_CLIENT_HOSTNAMEはクライアントのホスト名です。
  • DHCP_CLIENT_IPADDRはクライアントに配布するIPアドレスです。
  • DHCP_CLIENT_MACADDRはクライアントのMACアドレスです。
  • KICKSTART_LANGUAGEはKickstartで設定する言語です。
  • KICKSTART_KEYMAPはKickstartで設定するキーボードレイアウトです。
  • KICKSTART_TIMEZONEはKickstartで設定するタイムゾーンです。
  • MIRROR_URLはネットワークインストールで使用するリポジトリのURLです。

変数とは無関係にPreseedは以下の設定を実行します。

  • rootユーザのパスワードはcentosです。
  • ユーザ名がcentos、パスワードがcentosのユーザを作成します。
  • パスワードはこちらの手順でハッシュ化しています。
  • GNOMEデスクトップ環境のパッケージをインストールします。
  • この記事ではcentos-7-ks.cfgというファイルを作成していますが、"cdrom"をコメントアウトすれば/root/anaconda-ks.cfgも使えます。
#!/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=centos-7-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
[ -z "${KICKSTART_LANGUAGE}" ] && KICKSTART_LANGUAGE=en_US.UTF-8
[ -z "${KICKSTART_KEYMAP}" ] && KICKSTART_KEYMAP=jp
[ -z "${KICKSTART_TIMEZONE}" ] && KICKSTART_TIMEZONE=Asia/Tokyo

# The mirror.centos.org is slow. You should use your country mirror server.
# e.g.) MIRROR_URL=http://ftp.riken.jp/Linux/centos/7/os/x86_64
[ -z "${MIRROR_URL}" ] && \
  MIRROR_URL=http://mirror.centos.org/centos-7/7/os/x86_64

tftp_server_install()
{
  sudo yum 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 yum 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 yum 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
}

syslinux_install()
{
  sudo yum 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 50
EOF

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

menu title automated install boot menu
label centos-7-automated-install
  menu label ^CentOS 7 automated install
  kernel vmlinuz
  append vga=788 initrd=initrd.img ip=dhcp inst.repo=${MIRROR_URL} \
    ks=nfs:${SERVER_IPADDR}:/var/lib/nfsroot/centos-7-ks.cfg
menu end
EOF
}

kickstart_install()
{
  root_passwd=$(python -c "
import crypt
print(crypt.crypt(\"centos\", crypt.mksalt(crypt.METHOD_SHA512)))
")
  user_passwd=$(python -c "
import crypt
print(crypt.crypt(\"centos\", crypt.mksalt(crypt.METHOD_SHA512)))
")

  cat <<EOF | sudo tee /var/lib/nfsroot/centos-7-ks.cfg
%pre
if [ -b /dev/vda ]; then
  echo "ignoredisk --only-use=vda" > /tmp/drive-ks.cfg
  echo "bootloader --location=mbr --boot-drive=vda" >> /tmp/drive-ks.cfg
else
  echo "ignoredisk --only-use=sda" > /tmp/drive-ks.cfg
  echo "bootloader --location=mbr --boot-drive=sda" >> /tmp/drive-ks.cfg
fi
%end

%post
# Using "firstboot --disable" does not work correctly?
systemctl disable initial-setup-graphical
systemctl disable initial-setup-text
%end

%include /tmp/drive-ks.cfg
auth --enableshadow --passalgo=sha512
graphical
firstboot --disable
eula --agreed
keyboard --vckeymap=${KICKSTART_KEYMAP} --xlayouts='${KICKSTART_KEYMAP}'
lang ${KICKSTART_LANGUAGE}
network --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network --hostname=${DHCP_CLIENT_HOSTNAME}
rootpw --iscrypted ${root_passwd}
timezone ${KICKSTART_TIMEZONE} --isUtc
user --groups=wheel --name=centos --password=${user_passwd} --iscrypted
xconfig  --startxonboot
autopart --type=lvm
clearpart --none --initlabel
reboot

%packages
@^gnome-desktop-environment
@base
@core
@desktop-debugging
@development
@dial-up
@directory-client
@fonts
@gnome-apps
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@java-platform
@multimedia
@network-file-system-client
@networkmanager-submodules
@print-client
@x11
%end

%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
EOF
}

pxeboot_main()
{
  tftp_server_install
  dhcp_install
  nfs_utils_install
  syslinux_install
  kickstart_install
}

pxeboot_main

2 自動インストールを実行する

この記事ではKVMの仮想マシンにCentOS 7を自動インストールします。KVM以外の環境でもPXE Boot(あるいはBOOTP)を有効にすることでネットワークインストールが可能になります。BIOSの設定等をご確認ください。

virt-managerのBoot device orderでNICを有効にします。CDROMが空で、Diskに何もインストールしていない状態です。DiskにOSがインストールされている場合はオーダを変更する必要があります。

0001_BootDeviceOrder.png

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

0002_iPXE.png

syslinuxのメニュー画面が立ち上がります。5秒後に"CentOS 7 automated install"が自動選択されます。

0003_syslinux.png

自動インストールが開始されます。

0004_AutomatedInstall.png

自動インストール完了後に自動で再起動され、インストールされたCentOS 7が起動します。

0005_AutomatedInstalledCentOS.png