Ubuntu 16.04 LTSでPXE Boot環境構築を作ってみたのでその際の手順を残しておく。
構築手順
環境
Ubuntu 16.04を用いて環境構築する。 1台のUbuntu 16.04サーバ上にTFTPサーバ、DHCPサーバを立ち上げ、PXEブートできるようにブートに必要なファイルも設置する。 RedHat系だとFTPが必要だと思うが、UbuntuならTFTPで良い。
PXEでインストールしたいサーバが起動時にDHCPでIPアドレスを取得後、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/tftpboot
へchrootするようになる。
--- /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のディレクトリ以下に設置する。
まずはUbuntuでPXEブートを行うために必要なファイル群を取得する。ここでは /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ブート環境構築手順について書いた。 よくわからないままやって各ディレクトリ内のファイルが何をしているかとかが良くわからなくなったが、ファイルを消してみたりディレクトリ構成を変えてみたりしながら、どの処理で何が必要がだいたいつかめてきた。
参考
- Ubuntu 16.04 / Debian 8: PXEブートサーバをインストールしてネットワークインストール環境を整える - Narrow Escape
- Linux 初期 RAM ディスク (initrd) の概要 - IBM developerWorks
- PXELINUX - Syslinux Wiki
- Linux_技術文書_pxelinuxを使用した Red Hat Linuxインストール方法 シリアルコンソール対応 | HPE 日本
- 30.2. ネットワークブートの設定 - Red Hat Customer Portal
- Syslinux - ArchWiki
- TFTP - Community Ubuntu Documentation
- isc-dhcp-server - Community Ubuntu Documentation
- Installation/Netboot - Community Ubuntu Documentation
- UEFI/PXE-netboot-install - Ubuntu Wiki