UEFIなPCをPXE BootさせてkickstartでCentOS 7をインストール

# はじめに

表題詐欺のようで恐縮ですが、事細かに書いていないので、これを見たり打ったりしただけでは表題を達成できませんのでご了承下さい。

# 要点
　UEFIなPCを使った結果、ざっとググった結果ではうまくいかず、ずいぶん時間がかかってしまったという話。具体的には以下の通り。

- PCのUEFI設定にセキュアブートがある場合、設定の変更が必要
- PXE起動に必要な情報を配信できるDHCPサーバーが必要
- 既存のDHCPサーバーがPXE起動に必要な情報を配信できない場合でも共存できる
- PXE起動で読み込むイメージはUEFI向けのものが必要 
- Kickstartのディスク構成にUEFI向けの記述が必要

# 環境

|項目|内容|
|---|---|
|インストール対象PC|Intel NUC7CJYH|
|インストール対象PCのIPアドレス|192.168.100.101|
|起動用、配信用サーバーIPアドレス|192.168.100.1|
|PXE起動用DHCPサーバー|dhcp-4.2.5-68.el7.centos.1.x86_64|
|PXE起動用TFTPサーバー|tftp-server-5.2-22.el7.x86_64|
|PXE起動用イメージ置き場|/var/lib/tftpboot|
|CentOSインストールISO配信用ftpサーバー|vsftpd-3.0.2-22.el7.x86_64|
|CentOSインストールISOマウントポイント|/var/ftp/centos7|
|Kickstartファイル置き場|/var/ftp/pub/kickstart|

# UEFIなPCに必要な設定

まず最初に出たエラーメッセージがこちら。

![DSC_0069s.jpg](https://qiita-image-store.s3.amazonaws.com/0/155025/ad0dbf3c-0827-4e20-b2ea-65c57c6b3001.jpeg)

　IPv4でPXEブートを選択した後に表示され、Authorizationという単語が見えたので、きっとTFTPサーバー側のパーミッションか何かの問題だろう、と思っていたが、PC側のセキュアブートという機能の影響だった。

![DSC_0075s.jpg](https://qiita-image-store.s3.amazonaws.com/0/155025/ac8bc84d-190f-8e56-f3b0-838f5ee6a13c.jpeg)

　チェックが入り有効になっていたSecure Bootという項目のチェックを外し、機能を無効化したところ、同じエラーは出ないようになった。

# PXE起動に必要な情報を配信できるDHCPサーバーが必要

　ルーターがDHCPサーバーを兼ねている環境だったので、まずはルーターの設定を変更しようと思った。DHCPサーバーが配信する情報のうち、PXE起動に必要な情報は以下の通り。

|項目|内容|
|---|---|
|next-server|起動イメージファイルを提供するサーバーのIPアドレス|
|filename|最初に読み込む起動イメージファイル|

　これらの項目が指定できないDHCPサーバー（家庭向けのルーターなど）ではPXE起動に必要な情報を配信できない。このため、別途DHCPサーバーが必要となる。しかし何らかの理由で既存のDHCPサーバーを止められない場合、共存できる設定が必要になる。

# 既存DHCPサーバーとの共存

## 共存の考え方

1. 既存DHCPサーバーはPXE起動による配信要求には応答しない
1. 追加DHCPサーバーは特定の条件に合致する配信要求にしか応答しない
1. 追加DHCPサーバーはすでに配信されたIPアドレスと重複するものを配信しない

　だと思うのだけど、1を実現する方法がわからなかった。1なしでうまくできてしまっている。何度やってもうまくいくので、うまくいく理由があるのだと思うけれど、今回は追求せず。

## 共存のための要件

- PXE起動に使用するNICのMACアドレスがわかっていること

　MACアドレスが事前にわからないケースが想像できないが、DHCPサーバーにMACアドレスに紐づいた処理をさせることで、共存の考え方の2,3を実現した。

```/etc/dhcp/dhcpd.conf（の一部）
subnet 192.168.100.0 netmask 255.255.255.0 {
        option routers          192.168.100.1;
        option subnet-mask      255.255.255.0;
        option domain-name-servers 192.168.100.1;
        deny                    unknown-clients;
}
host pc01 {
        hardware ethernet xx:xx:xx:xx:xx:xx;
        fixed-address 192.168.100.11;
}
```
　こうすることで、設定ファイル内でhostとして記載したMACアドレス以外からの要求をunknown-clientsからのものと解釈し、応答しないようになった。

　この例では要求元MACアドレスに対し、IPアドレスを固定して配信している。rangeを設定し、その範囲内のIPアドレスを配信することもできると思うが未検証。

# PXE起動で読み込むイメージはUEFI向けのものが必要

　よくある情報は、pxelinux.0を起動イメージとして用いるものだったが、これはUEFIに対応していない。UEFIに対応したイメージ（BOOTX64.EFI）を用いる必要がある。従来のBIOSとの混在環境に適応した設定は以下のようになった。

```/etc/dhcp/dhcpd.conf
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16;

subnet 192.168.100.0 netmask 255.255.255.0 {
        option routers          192.168.100.1;
        option subnet-mask      255.255.255.0;
        option domain-name-servers 192.168.100.1;
        deny                    unknown-clients;
        class "pxeclients" {
                match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
                next-server 192.168.100.1;

                if option arch = 00:06 {
                        filename "BOOTIA32.EFI";
                } else if option arch = 00:07 {
                        filename "BOOTX64.EFI";
                } else {
                        filename "pxelinux.0";
                }
        }
}
host pc01 {
        hardware ethernet xx:xx:xx:xx:xx:xx;
        fixed-address 192.168.100.101;
}
```

　BOOTX64.EFIは、インストールイメージISOをマウントした場合、./EFI/BOOTにあった。そのほかにもいくつかのファイルがあったので、TFTPで配信するためのディレクトリにまるっとコピーした。

なおgrub.cfgはこうした。

```/var/lib/tftpboot/grub.cfg
set timeout=60
menuentry 'CentOS 7' {
 echo 'Network status:'
 net_ls_cards
 net_ls_addr
 
 linuxefi /centos7/vmlinuz inst.repo=ftp://192.168.100.1/centos7 devfs=nomount ks=ftp://192.168.100.1/pub/kickstart/centos7.cfg
 initrdefi /centos7/initrd.img
}
```

# Kickstartのディスク構成にUEFI向けの記述が必要

　諸々の設定を済ませ、無事インストール画面が出るようになったので、Kickstartの応答ファイルをネットを調べつつ作ったところ、ディスクの構成でエラーとなった。

　UEFIのPCの場合、/boot/efiというパーティションが必要なようだった。これを反映し、最終的にはこうなった。

```/var/ftp/pub/kickstart/centos7.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use network installation
url --url="ftp://ftp.riken.jp/Linux/centos/7/os/x86_64"
# Use graphical install
graphical
# Use text mode install
#text
# Run the Setup Agent on first boot
firstboot --disable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8
# SELinux configuration
selinux disabled

# Network information
network  --bootproto=dhcp --device=enp0s3 --ipv6=auto --activate

# Root password
rootpw --iscrypted 暗号化したルートのパスワード
# System timezone
timezone Asia/Tokyo --isUtc
user --groups=wheel --name=同時に作るユーザー名 --password=暗号化したパスワード --iscrypted --gecos="username"
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitioning information
ignoredisk --only-use=sda
clearpart --all --initlabel --drives sda
part /boot --fstype="xfs" --ondisk=sda --size=1024 --label=boot
#UEFI環境で必要な部分はじまり
part /boot/efi --fstype="xfs" --ondisk=sda --size=1024 --label=bootefi
#UEFI環境で必要な部分おわり
part pv.01 --fstype="lvmpv" --ondisk=sda --size=1024 --grow
volgroup vg_root --pesize=4096 pv.01
logvol swap  --fstype="swap" --size=8192 --name=lv_swap --vgname=vg_root
logvol /  --fstype="xfs" --grow --size=1024 --name=lv_root --vgname=vg_root

%packages
@^virtualization-host-environment
@gnome-desktop
@debugging
@network-file-system-client
vim
virt-manager
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end
```

# 参考リンク

adsaria mood 2008-01-21 PXEサーバの設定
http://d.hatena.ne.jp/adsaria/20080121/1200878022

のぴぴのメモ KickStartその２(ks.cfg設定ファイルの説明)
http://nopipi.hatenablog.com/?page=1470147625