自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

Ubuntu 16.04 LTS でPXE Bootサーバ環境構築

Ubuntu 16.04 LTSでPXE Boot環境構築を作ってみたのでその際の手順を残しておく。

構築手順

環境

Ubuntu 16.04を用いて環境構築する。 1台のUbuntu 16.04サーバ上にTFTPサーバ、DHCPサーバを立ち上げ、PXEブートできるようにブートに必要なファイルも設置する。 RedHat系だとFTPが必要だと思うが、UbuntuならTFTPで良い。

PXEでインストールしたいサーバが起動時にDHCPIPアドレスを取得後、TFTPでブートに必要なファイルにアクセスしてブートプロセスを走らせるようにする。

なお、本手順で作成する環境はBIOS環境に対応したもので、UEFIでは別な設定が必要となる。

OS Ubuntu 16.04 LTS 4.4.0-21-generic
TFTPサーバソフトウェア tftpd-hpa 5.2+20150808-1ubuntu1.16.04.1
DHCPサーバ isc-dhcp-server,isc-dhcp-common,isc-dhcp-client 4.3.3-5ubuntu12.7

TFTPサーバの設定

まずTFTPサーバを構築する。

必要なパッケージをインストールする。

$ sudo apt install -y inetutils-inetd tftpd-hpa

/etc/default/tftpd-hpaができているので、以下のように修正する。 -lで単体で起動可能とし、-sでプロセスが起動時に/var/lib/tftpbootchrootするようになる。

--- /etc/default/tftpd-hpa.org  20xx-xx-xx 16:03:10.385093931 +0900
+++ /etc/default/tftpd-hpa      20xx-xx-xx 16:11:23.956043875 +0900
@@ -3,4 +3,6 @@
 TFTP_USERNAME="tftp"
 TFTP_DIRECTORY="/var/lib/tftpboot"
 TFTP_ADDRESS=":69"
-TFTP_OPTIONS="--secure"
+TFTP_OPTIONS="-l -s"

設定変更出来たら tftpd-hpa サービスを起動する。

$ sudo systemctl restart tftpd-hpa

DHCPサーバの設定

続いてDHCPサーバを設定する。

必要なパッケージをインストールする。

$ sudo apt install -y isc-dhcp-server

/etc/dhcp/dhcpd.confを以下のように書き直す。 subnet xxx...{ }のセクションの中で、利用するIPアドレスの範囲やDNSサーバ名等を記述する必要があるので環境に応じて書き換える。 他にも必要な設定はありそうだがとりあえずはこれで試すことはできる。

default-lease-time 1800;
max-lease-time 3600;
ddns-update-style none;
subnet 10.1.0.0 netmask 255.255.255.0 {
  option domain-name "private.exmaple.jp";
  option domain-name-servers 10.1.0.7, 10.1.0.7;
  range                      10.1.0.130 10.1.0.135;
  option routers 10.1.0.254;
  filename "pxelinux.0";
}

設定ファイルを作成したらisc-dhcp-serverサービスを起動する。

$ sudo systemctl start isc-dhcp-server

pxelinuxの設定

最後にPXEブートできるように、pxelinuxを使うための必要なファイルをTFTPのディレクトリ以下に設置する。

まずはUbuntuPXEブートを行うために必要なファイル群を取得する。ここでは /tmp に保存しているが好きな場所に置けば良い。

$ wget http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/installer-amd64/current/images/netboot/netboot.tar.gz -P /tmp

取得したファイルを展開する。

$ mkdir /tmp/ubuntu16.04-netboot

$ cd /tmp

$ sudo tar -zxvf netboot.tar.gz -C ubuntu16.04-netboot
./
./ubuntu-installer/
./ubuntu-installer/amd64/
./ubuntu-installer/amd64/pxelinux.0
./ubuntu-installer/amd64/pxelinux.cfg/
./ubuntu-installer/amd64/pxelinux.cfg/default
./ubuntu-installer/amd64/initrd.gz
./ubuntu-installer/amd64/boot-screens/
./ubuntu-installer/amd64/boot-screens/libutil.c32
./ubuntu-installer/amd64/boot-screens/splash.png
./ubuntu-installer/amd64/boot-screens/ldlinux.c32
./ubuntu-installer/amd64/boot-screens/rqtxt.cfg
./ubuntu-installer/amd64/boot-screens/f9.txt
./ubuntu-installer/amd64/boot-screens/f4.txt
./ubuntu-installer/amd64/boot-screens/exithelp.cfg
./ubuntu-installer/amd64/boot-screens/vesamenu.c32
./ubuntu-installer/amd64/boot-screens/f2.txt
./ubuntu-installer/amd64/boot-screens/f10.txt
./ubuntu-installer/amd64/boot-screens/f8.txt
./ubuntu-installer/amd64/boot-screens/libcom32.c32
./ubuntu-installer/amd64/boot-screens/f6.txt
./ubuntu-installer/amd64/boot-screens/f7.txt
./ubuntu-installer/amd64/boot-screens/syslinux.cfg
./ubuntu-installer/amd64/boot-screens/f3.txt
./ubuntu-installer/amd64/boot-screens/adtxt.cfg
./ubuntu-installer/amd64/boot-screens/stdmenu.cfg
./ubuntu-installer/amd64/boot-screens/f1.txt
./ubuntu-installer/amd64/boot-screens/txt.cfg
./ubuntu-installer/amd64/boot-screens/prompt.cfg
./ubuntu-installer/amd64/boot-screens/menu.cfg
./ubuntu-installer/amd64/boot-screens/f5.txt
./ubuntu-installer/amd64/linux
./pxelinux.0
./pxelinux.cfg
./ldlinux.c32
./version.info

続いて、展開したファイルの中から、pxelinuxの利用に必要なものを取得して/var/lib/tftpboot配下に設置する。

そのために/var/lib/tftpboot配下に必要なディレクトリを作成する。

$ mkdir -p /var/lib/tftpboot/{ubuntu/{xenial,preseed},boot-screens,pxelinux.cfg}

pxelinux.0, ldlinux.c32/var/lib/tftpboot直下に設置する。

$ sudo cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/pxelinux.0 /var/lib/tftpboot/

$ sudo cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/boot-screens/ldlinux.c32 /var/lib/tftpboot/

libcom32.c32, libutil.c32,vesamenu.c32/var/lib/tftpboot/boot-screens配下に設置する。

$ sudo cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/boot-screens/libcom32.c32 /var/lib/tftpboot/boot-screens

$ sudo cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/boot-screens/libutil.c32 /var/lib/tftpboot/boot-screens

$ sudo cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/boot-screens/vesamenu.c32 /var/lib/tftpboot/boot-screens

/var/lib/tftpboot/boot-screens直下にsyslinux.cfgというファイルを以下のような内容で作成する。

path boot-screens
include boot-screens/menu.cfg
default boot-screens/vesamenu.c32
prompt 0
timeout 100

続いて、/var/lib/tftpboot/boot-screens直下にmenu.cfgというファイルを以下のような内容で作成する。 これはインストーラ起動時のメニュー画面を表す。

menu hshift 13
menu width 49
menu margin 8
menu tabmsg

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

/var/lib/tftpboot/pxelinux.cfg/default というファイルを /var/lib/tftpboot/boot-screens/syslinux.cfgシンボリックリンクリンクで作成する。

$ cd /var/lib/tftpboot/pxelinux.cfg

$ sudo ln -s ../boot-screens/syslinux.cfg default

Ubuntuインストーラ起動、及びインストールに必要なファイルの準備

まず必要なディレクトリを作成する。 特にディレクトリ名やディレクトリ構成は何でも良いので、ここでは/var/lib/tftpboot以下にubuntu/xenial/{ubuntu-installer/amd64,preseed}というディレクトリを作成し、各ディレクトリ以下に必要なファイルを設置する。 ここの設定が/var/lib/tftpboot/boot-screens/menu.cfgの内容と一致してある必要があるので、ここを変更する場合はmenu.cfgも変更する必要がある。

$ mkdir -p /var/lib/tftpboot/ubuntu/xenial/{ubuntu-installer/amd64,preseed}

initrd イメージとカーネル/var/lib/tftpboot/ubuntu/xenial/ubuntu-installer/amd64直下に設置する。

$ cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/initrd.gz /var/lib/tftpboot/ubuntu/xenial/ubuntu-installer/amd64

$ cp -pr /tmp/ubuntu16.04-netboot/ubuntu-installer/amd64/linux /var/lib/tftpboot/ubuntu/xenial/ubuntu-installer/amd64

自動インストール用に/var/lib/tftpboot/ubuntu/xenial/preseed/preseed.cfg を作成して設置する。 内容は以下のような感じであればいける。

### Localization
d-i debian-installer/locale string en_US
d-i console-keymaps-at/keymap select jp
d-i console-setup/ask_detect boolean false

# Keyboard selection.
d-i keyboard-configuration/layoutcode string jp
d-i keyboard-configuration/modelcode jp106

### Network configuration
## For DHCP
d-i netcfg/choose_interface select auto
d-i netcfg/disable_autoconfig boolean false
d-i netcfg/get_domain string localdomain
d-i netcfg/get_hostname string localhost

### Apt setup
d-i mirror/country string manual
#d-i mirror/http/hostname string archive.ubuntu.com
d-i mirror/http/hostname string ja.archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

### Clock and time zone setup
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean true
#d-i clock-setup/ntp-server string 0.pool.ntp.org
d-i clock-setup/ntp-server string ntp.nict.jp

### Partitioning
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/device_remove_lvm_span boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/disk string /dev/sda
#d-i partman-auto/disk string /dev/vda
d-i partman-auto/method string lvm
d-i partman-lvm/confirm boolean true
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-basicfilesystems/no_swap boolean false
d-i partman-auto-lvm/no_boot boolean true
d-i partman-auto-lvm/new_vg_name string main
d-i partman-auto/choose_recipe select root-boot
d-i partman-auto/expert_recipe string \
    root-boot :: \
        500 1000 1000000000 xfs \
            $defaultignore{ } \
            $lvmok{ } lv_name{ root } \
            $primary{ } $bootable{ } method{ format } \
            format{ } use_filesystem{ } filesystem{ xfs } \
            mountpoint{ / } \
        .
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk

### Base system installation
d-i base-installer/install-recommends boolean false
d-i base-installer/kernel/image string linux-generic
d-i base-installer/kernel/image string linux-server

### Account setup
d-i passwd/root-login boolean true
d-i passwd/make-user boolean true
d-i passwd/root-password-crypted password **************************************************************************************************
d-i passwd/user-fullname string hogehoge
d-i passwd/username string hogehoeg
d-i passwd/user-password-crypted password **************************************************************************************************
d-i user-setup/allow-password-weak boolean true
d-i passwd/user-default-groups string sudo
d-i user-setup/encrypt-home boolean false

### Package selection
tasksel tasksel/first multiselect none
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select none
d-i pkgsel/update-policy select none
popularity-contest popularity-contest/participate boolean false
d-i pkgsel/updatedb boolean true

### Boot loader installation
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true

### Finishing up the installation
# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note1

確認

PXE Boot をさせ、そのままインストールが進められればOK。

まとめ

Ubuntu16.04でのPXEブート環境構築手順について書いた。 よくわからないままやって各ディレクトリ内のファイルが何をしているかとかが良くわからなくなったが、ファイルを消してみたりディレクトリ構成を変えてみたりしながら、どの処理で何が必要がだいたいつかめてきた。

参考