Ubuntu 16.04 / Debian 8: PXEブートサーバをインストールしてネットワークインストール環境を整える

tftpdとdhcpdを用いてPXEブートサーバを立ち上げる手順を記載します。

インストール可能なOSはDebian 8とUbuntu 16.04です。

自動インストールも可能にします。

 

1 環境

PXEブートサーバのIPアドレスは192.168.11.66です。

MACアドレス08:00:27:6c:29:8bと52:54:00:01:14:cbのマシンをPXEブートさせます。

2 PXEブートとは

BIOSでBOOTP/TFTPBOOTプロトコルを用いて、ネットワーク越しにOSイメージを読み込む仕組みです。ここでは特にインストールについて焦点を絞っています。

PXEブートは複数台の実マシンにOSをインストールするのに向いています。

ここでは仮想環境を用いていますが、仮想環境をお使いの場合はクローンやストレージファイルのコピーをすれば良いでしょう。

3 tftpdインストールと起動

Ubuntu 16.04ではtftpd-hpaを、Debian 8ではatftpdをインストールします。

Ubuntu 16.04デフォルトでは/var/lib/tftpbootが、Debian 8デフォルトでは/srv/tftpがtftpdのディレクトリとして公開されます。

以降では/var/lib/tftpbootと/srv/tftpを${tftpboot_dir}と表記します。

$ sudo apt-get install -y tftpd-hpa # atftpd on Debian 8
$ sudo systemctl enable tftpd-hpa # atftpd on Debian 8
$ sudo systemctl restart tftpd-hpa # atftpd on Debian 8

4 isc-dhcp-serverのインストールと起動

aptでisc-dhcp-serverをインストールします。

$ sudo apt-get install -y isc-dhcp-server

DHCPサーバからPXEブートで読むファイル名をfilenameで指定します。

hostディレクティブ内でfilenameを使うことで、MACアドレス毎に読むファイルを変更することもできます。

$ sudo su -c 'cat <<EOF > /etc/dhcp/dhcpd.conf
subnet 192.168.11.0 netmask 255.255.255.0 {
  option domain-name "hiroom2.com";
  option domain-name-servers 192.168.11.2, 192.168.11.1;
  option routers 192.168.11.1;
  filename "pxelinux.0";
}

host debian-8-pxeboot {
  hardware ethernet 08:00:27:6c:29:8b;
  fixed-address 192.168.11.129;
}

host ubuntu-16.04-pxeboot {
  hardware ethernet 52:54:00:01:14:cb;
  fixed-address 192.168.11.128;
}
EOF
'

systemctlでisc-dhcp-serverを起動します。

$ sudo systemctl enable isc-dhcp-server
$ sudo systemctl restart isc-dhcp-server

5 ネットブートイメージの取得

Debian 8のネットブートイメージを取得し、${tftpboot_dir}に置きます。

$ wget -q http://ftp.riken.jp/Linux/debian/debian/dists/jessie/main/installer-amd64/current/images/netboot/netboot.tar.gz -O debian-8-netboot.tar.gz
$ mkdir debian-8-netboot
$ tar zxf debian-8-netboot.tar.gz -C debian-8-netboot
$ sudo cp -a debian-8-netboot/debian-installer ${tftpboot_dir}

Ubuntu 16.04のネットブートイメージを取得し、${tftpboot_dir}に置きます。

$ wget -q http://ftp.riken.jp/Linux/ubuntu/dists/xenial/main/installer-amd64/current/images/netboot/netboot.tar.gz -O ubuntu-16.04-netboot.tar.gz
$ mkdir ubuntu-16.04-netboot
$ tar zxf ubuntu-16.04-netboot.tar.gz -C ubuntu-16.04-netboot
$ sudo cp -a ubuntu-16.04-netboot/ubuntu-installer ${tftpboot_dir}

6 pxelinuxの設定

pxelinuxパッケージを利用せずに、ネットブートイメージに梱包されるpxelinuxを用います。

 

pxelinux.0 PXEブート用のバイナリ
ldlinux.c32 pxelinux.0が利用するライブラリ
pxelinux.cfg/default syslinux.cfgへのシンボリックリンク
boot-screens/syslinux.cfg pxelinux.0の設定
boot-screens/menu.cfg 起動メニューの設定
boot-screens/vesamenu.c32 VESA描画用バイナリ
boot-screens/libcom32.c32 vesamenu.c32が利用するライブラリ
boot-screens/libutil.c32 vesamenu.c32が利用するライブラリ
debian-installer Debian 8のネットブートイメージ
ubuntu-installer Ubuntu 16.04のネットブートイメージ

 

boot-screens/syslinux.cfgとboot-screens/menu.cfgは新規に追加します。

それ以外のものはUbuntu 16.04のものを利用します。

$ sudo cp ubuntu-16.04-netboot/ubuntu-installer/amd64/pxelinux.0 ${tftpboot_dir}/
$ sudo cp ubuntu-16.04-netboot/ubuntu-installer/amd64/boot-screens/ldlinux.c32 ${tftpboot_dir}/
$ sudo mkdir ${tftpboot_dir}/boot-screens
$ sudo cp ubuntu-16.04-netboot/ubuntu-installer/amd64/boot-screens/libcom32.c32 ${tftpboot_dir}/boot-screens
$ sudo cp ubuntu-16.04-netboot/ubuntu-installer/amd64/boot-screens/libutil.c32 ${tftpboot_dir}/boot-screens
$ sudo cp ubuntu-16.04-netboot/ubuntu-installer/amd64/boot-screens/vesamenu.c32 ${tftpboot_dir}/boot-screens
$ sudo mkdir ${tftpboot_dir}/pxelinux.cfg
$ cd ${tftpboot_dir}/pxelinux.cfg
$ sudo ln -s ../boot-screens/syslinux.cfg default

6.1 boot-screens/syslinux.cfg

boot-screens/menu.cfgを読み込みます。キーを押さない場合、10秒後に一番上(Debian 8の自動インストール)が開始します。

$ sudo su -c "cat <<EOF > ${tftpboot_dir}/boot-screens/syslinux.cfg
path boot-screens
include boot-screens/menu.cfg
default boot-screens/vesamenu.c32
prompt 0
timeout 100
EOF
"

6.2 boot-screens/menu.cfg

以下のメニューを表示します。

  • Debian 8を自動インストール
  • Ubuntu 16.04を自動インストール
  • Debian 8をインストール(通常のインストール)
  • Ubuntu 16.04をインストール(通常のインストール)
$ sudo su -c "cat <<EOF > ${tftpboot_dir}/boot-screens/menu.cfg
menu hshift 13
menu width 49
menu margin 8
menu tabmsg

menu title Installer boot menu
label auto-debian-8
  menu label ^Debian 8 automated install
        kernel debian-installer/amd64/linux
        append auto=true priority=critical vga=788 initrd=debian-installer/amd64/initrd.gz preseed/url=tftp://192.168.11.66/preseed/debian-8-preseed.cfg
label auto-ubuntu-16.04
        menu label ^Ubuntu 16.04 automated install
        kernel ubuntu-installer/amd64/linux
        append auto=true priority=critical vga=788 initrd=ubuntu-installer/amd64/initrd.gz preseed/url=tftp://192.168.11.66/preseed/ubuntu-16.04-preseed.cfg preseed/interactive=false
menu begin debian-8
        menu title Debian 8
        label mainmenu
                menu label ^Back..
                menu exit
        include debian-installer/amd64/boot-screens/menu.cfg
menu end
menu begin ubuntu-16.04
        menu title Ubuntu 16.04
        label mainmenu
                menu label ^Back..
                menu exit
        include ubuntu-installer/amd64/boot-screens/menu.cfg
menu end
EOF
"

ここでは自動インストールにpreseedという仕組みを用います。

7 preseedの設定

Debian/Ubuntuのインストーラの入力を予め設定ファイルに記載できる仕組みです。

ここでは${tftpboot_dir}/preseedディレクトリに設定ファイルを格納します。

$ sudo mkdir ${tftpboot_dir}/preseed 

7.1 Ubuntu 16.04用のpreseed

rootのパスワードはubuntuです。ユーザubuntuを追加し、パスワードをubuntuにします。

unity、ubuntu-desktop、openssh-serverをインストールします。

$ sudo su -c "cat <<EOF > ${tftpboot_dir}/preseed/ubuntu-16.04-preseed.cfg
d-i debian-installer/locale string en_US
d-i debian-installer/language string en
d-i debian-installer/country string JP
d-i keyboard-configuration/xkb-keymap select jp106
d-i passwd/user-fullname string
d-i passwd/username string ubuntu
d-i passwd/root-password password ubuntu
d-i passwd/root-password-again password ubuntu
d-i passwd/user-password password ubuntu
d-i passwd/user-password-again password ubuntu
d-i user-setup/allow-password-weak boolean true
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i mirror/country string manual
d-i mirror/http/hostname string http://jp.archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string
d-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean true
d-i time/zone string Asia/Tokyo
d-i partman/confirm boolean true
d-i partman/choose_partition select finish
d-i partman/confirm_nooverwrite boolean true
d-i partman-auto/disk string /dev/[sv]da
d-i partman-auto/method string lvm
d-i partman-auto/choose_recipe select atomic
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-partitioning/confirm_write_new_label boolean true
d-i grub-installer/grub2_instead_of_grub_legacy boolean true
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/[sv]da
d-i pkgsel/update-policy select none
d-i pkgsel/include string unity ubuntu-desktop openssh-server
d-i finish-install/reboot_in_progress note
EOF
" 

7.2 Debian 8用のpreseed

rootのパスワードはdebianです。ユーザdebianを追加し、パスワードをdebianにします。

gnome、openssh-serverをインストールします。

$ sudo su -c "cat <<EOF > ${tftpboot_dir}/preseed/debian-8-preseed.cfg
d-i debian-installer/locale string en_US
d-i debian-installer/language string en
d-i debian-installer/country string JP
d-i keyboard-configuration/xkb-keymap select jp106
d-i passwd/user-fullname string
d-i passwd/username string debian
d-i passwd/root-password password debian
d-i passwd/root-password-again password debian
d-i passwd/user-password password debian
d-i passwd/user-password-again password debian
d-i user-setup/allow-password-weak boolean true
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.jp.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean true
d-i time/zone string Asia/Tokyo
d-i partman/confirm boolean true
d-i partman/choose_partition select finish
d-i partman/confirm_nooverwrite boolean true
d-i partman-auto/disk string /dev/[sv]da
d-i partman-auto/method string lvm
d-i partman-auto/choose_recipe select atomic
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-partitioning/confirm_write_new_label boolean true
d-i grub-installer/grub2_instead_of_grub_legacy boolean true
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev string /dev/[sv]da
d-i pkgsel/update-policy select none
d-i pkgsel/include string gnome openssh-server
d-i finish-install/reboot_in_progress note
EOF
"

8 起動

virt-managerの場合、Boot device orderでNICが有効なことを確認します。

ディスクが空の場合はNICの順序はディスクの下でも構いません。

0001_KVM-PXEBoot.png

VirtualBoxの場合、起動順序でネットワークが有効なことを確認します。

ハードディスクや光学が空の場合は順序が下でも構いません。

0002_VirtualBox-PXEBoot.png

実マシンの場合はBIOSの設定でPXEブートの項目を確認して下さい。

起動するとDHCPからアドレスを分配された後、PXEブートが開始します。

0003_PXEBoot.png

先ほど作成したmenu.cfgによるメニューが表示されます。

0004_Menu.png

キーを押さない場合、Debian 8の自動インストールが始まります。

0005_AutomatedInstall.png