PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり)



VirtualBox Version 5.2.20 r125813 (Qt5.6.3)、CentOS Linux release 7.6.1810 (Core)を用いて、PXEによるインストーラーの起動までを試した。
PXEサーバー、PXEクライアントともに、VirtualBoxの仮想マシン。
作業開始時点のPXEサーバーの状態は、Minimal ISOをインストールした直後とする。
SELinuxはEnforcing、firewalldはstopしないで必要なだけ開放した。
基本的に、Redhatの公式ドキュメントのやり方を踏襲した。

PXEについて

PXEは、ネットワークブートを実現する仕組み。
OSやインストーラーを、ネットワーク経由で起動できる。
Kickstartと組み合わせることで、Linux OSのインストールを自動化できる。

PXEに必要なサーバーは、下記の3つ。

  • DHCPサーバー - IPアドレス付与、TFTPサーバーとブートローダーの場所を教える 
  • TFTPサーバー - ブートローダーを提供、インストールソースの場所を教える 
  • ファイルサーバー(HTTP、FTP、NFSなど) - インストールソースを提供 

PXEクライアントは、これら3つのサーバーとやり取りし、ネットワーク経由でのOSやインストーラーの起動に必要な情報を順次取得していく。

下図はイメージ。
青はサーバー、緑は設定ファイルまたはブートに必要なリソースで、PXEサーバーを構築するために編集や配置を行うもの。

ネットワーク設定

ネットワーク構成は下図のようにした。

VirtualBoxのゲストOSとして2台のサーバーを作り、それぞれPXEサーバー、PXEクライアントとした。
PXEサーバーには、Minimal ISOでCentOS Linux release 7.6.1810 (Core)をインストールした。

PXEサーバーは、NICを2つ設定し、1つはブリッジアダプター、もう1つは内部ネットワークとして設定した。
ブリッジアダプターはホストOSと同じネットワークに所属し、家庭のルーターからDHCPでIPアドレスが動的に割り当てられる。
ホストからsshで接続するために設定した。
内部ネットワークは、PXEクライアントと通信するために設定した。
内部ネットワークに所属するNICは、IPアドレスを固定とし、PXEクライアントのNICにIPアドレスを割り当てるDHCPサーバーとしても機能する。

PXEクライアントには、内部ネットワークに所属するNICを1つ設定した。
このNICには、PXEサーバーからIPアドレスが動的に割り当てられる。

PXEサーバーで下記コマンドを実行して、ブリッジアダプターのNICを起動。

nmcli con up enp0s3

DHCPでIPが割り当てられたので、ip aコマンドでIPを確認し、以後、ホストOSからsshで接続して作業した。
下記コマンドで、ブリッジアダプター(enp0s3)と内部ネットワーク(enp0s8)をさらに設定。

# ブリッジアダプターと内部ネットワークが、OS起動時にアクティブになるようにする
nmcli con mod enp0s3 connection.autoconnect yes
nmcli con mod enp0s8 connection.autoconnect yes

# 内部ネットワークのNICのIPアドレスを固定
nmcli con mod enp0s8 ipv4.addresses 192.168.11.77/24
nmcli con mod enp0s8 ipv4.method manual
# 内部ネットワークのNICを起動
nmcli con up enp0s8

DHCPサーバーの設定

下記コマンドでインストール。

yum -y install dhcp

/etc/dhcp/dhcpd.confの末尾に下記を追加(Redhatの公式ドキュメントの設定例をコピペ)

option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;

subnet 192.168.11.0 netmask 255.255.255.0 {
 option routers 192.168.11.77;
 range 192.168.11.10 192.168.11.15;

 class "pxeclients" {
   match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
   next-server 192.168.11.77;

   if option architecture-type = 00:07 {
     filename "uefi/shim.efi";
     } else {
     filename "pxelinux/pxelinux.0";
   }
 }
}

上記の設定は、下記を行っている。

  • 192.168.11.0のネットワークに、DHCP機能を提供
  • 192.168.11.10〜192.168.11.15のIPアドレスを動的に割り当て
  • next-server 192.168.11.77で、TFTPサーバーのIPアドレスを提供 
  • filename "pxelinux/pxelinux.0";で、TFTPサーバー上のpxelinux.0の場所を提供  


DHCPサーバーの起動、OS起動時に起動させるよう設定

systemctl start dhcpd
systemctl enable dhcpd

補足

systemctl status dhcpd を実行すると、No subnet declaration for enp0s3というエラーが出ていた。
dhcpd.confに、enp0s8のネットワークの設定のみ記述され、enp0s3のネットワークの定義がないことが原因。 
このドキュメントに従い、/etc/sysconfig/dhcpd に DHCPDARGS=enp0s8; を追記し、systemctl restart dhcpd を実行し、再度確認したが、改善されなかった。
上記エラーと一緒に、Ignoring requests on enp0s3.と出ているので、enp0s3のDHCPリクエストは無視されるようだし、これが望んだ動きでないなら〜しろ(和訳)と出ているが、望んだ動きだし、起動はしているので、無視することにした。

補足2

dhcpd.confの内容について補足。
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";は、PXEクライアントのみにDHCP機能を提供するために設定していると思われる。
if option architecture-type = 00:07は、UEFI(BIOSの後継仕様)の場合はpxelinux.0の代わりにshim.efiを使うように分岐させていると思われる。
本投稿はpxelinux.0しか配置していないため、動作しない。

dhcpd.confのドキュメントにdhcpd.confの構文が詳しいので、機会があれば勉強したい。
UEFI対応のKickstartサーバー構成手順も参考になりそう。

TFTPサーバーの設定

インストール

下記コマンドでインストール、起動、OS起動時に起動させるよう設定、ファイアウォールを開放。

yum -y install xinetd
systemctl start xinetd
systemctl enable xinetd

yum -y install tftp-server
systemctl start tftp
systemctl enable tftp

firewall-cmd --add-service=tftp --permanent --zone=public 

pxelinux.0、vmlinuz、initrd.imgの配置  

pxelinux.0、vmlinuz、initrd.imgは、インストーラーの起動に必要であり、完全インストール DVD の ISO イメージファイルから取得できる。 

ここでは、ホストOSの共有フォルダー「dvd」に、Download CenstOSからダウンロードしたDVD ISO、CentOS-7-x86_64-DVD-1810.isoが格納されているとする。
そして、ホストOSの共有フォルダーを、/mnt/host_os_shared_folderにmountすることで、CentOS-7-x86_64-DVD-1810.isoを読み込むとする。
共有フォルダーの設定については、このページを参照。
CentOS-7-x86_64-DVD-1810.isoは、/mnt/dvdにmountされるとする。

mkdir /mnt/host_os_shared_folder
mount -t vboxsf dvd /mnt/host_os_shared_folder
mkdir /mnt/dvd
mount -t iso9660 /mnt/host_os_shared_folder/CentOS-7-x86_64-DVD-1810.iso /mnt/dvd -o loop,ro

下記コマンドで、./var/lib/tftpboot以下にファイルが展開されるので、./var/lib/tftpboot/pxelinux.0を、/var/lib/tftpboot/pxelinuxにコピー。

rpm2cpio /mnt/dvd/Packages/syslinux-tftpboot-4.05-15.el7.noarch.rpm | cpio -dimv
mkdir /var/lib/tftpboot/pxelinux
cp ./var/lib/tftpboot/pxelinux.0 /var/lib/tftpboot/pxelinux/

続いて、ブートイメージファイルを格納するサブディレクトリーを作成し、ブートイメージファイルをそのディレクトリーにコピー。

mkdir -p /var/lib/tftpboot/pxelinux/images/CentOS7.6.1810/
cp /mnt/dvd/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/images/CentOS7.6.1810/

補足
vmlinuz、initrd.imgが何者なのか理解できていないが、下記が参考になりそう。
GRUBの設定ファイルの違い
Linuxがブートするまで
1.4.9 ブート・ローダー構成ファイルについて

PXE設定ファイルの記載

インストールソースと、vmlinuz、initrd.imgの場所を記載する。
それぞれPXE設定ファイルのinst.repo、kernel、initrdで設定する。

pxelinux/ ディレクトリー内に pxelinux.cfg/ ディレクトリーを作成し、pxelinux.cfg/ ディレクトリーに default という名前の設定ファイルを追加。
これが、デフォルトのPXE設定ファイルになる。

mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
vi /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
defaultファイルに下記を記載
default centos7.6.1810
prompt 1
timeout 600

display boot.msg

label centos7.6.1810
  menu label ^Install system
  menu default
  kernel images/CentOS7.6.1810/vmlinuz
  append initrd=images/CentOS7.6.1810/initrd.img ip=dhcp inst.repo=nfs:192.168.11.77:/var/share/installation_source

NFSサーバーの設定

上で、PXE設定ファイルにおいて、インストールソースは、/var/share/installation_sourceに、NFSで公開するように設定した。
よって、/var/share/installation_sourceを作成し、NFSをインストール、設定、ファイアウォールを設定し、NFSでexportした。
そして、インストールソースを配置した。

yum -y install nfs-utils
systemctl start nfs-server
systemctl enable nfs-server

firewall-cmd --add-service=nfs --permanent --zone=public 
firewall-cmd --add-service={nfs3,mountd,rpc-bind} --permanent --zone=public 
firewall-cmd reload

vi /etc/exports
# 下記を追記
# /var/share/installation_source 192.168.11.0/24

# インストールソースを配置
mkdir -p /var/share/installation_source
cp /mnt/host_os_shared_folder/CentOS-7-x86_64-DVD-1810.iso /var/share/installation_source/

インストールソースは、インストールソースの説明としてredhatの公式ドキュメントに下記の記述があるので、ISOイメージをmountしたディレクトリーなども使えるようだ。

  • インストール可能なツリー (インストールプログラムのイメージ、パッケージ群、リポジトリーデータおよび有効な .treeinfo ファイルを含むディレクトリー構成)
  • DVD (システムの DVD ドライブにある物理的なディスク)
  • Red Hat Enterprise Linux の完全インストール用 DVD の ISO イメージ (ハードドライブまたはインストールシステムでアクセスできるネットワーク上の場所)


以上により、OSを再起動しても、上記すべての設定がリセットされず、PXEサーバーとして機能できる
shutdown -r now 

PXEクライアントの設定とPXEによるインストーラー起動

PXEクライアントマシンのブート順序をPXE優先にした。
ネットワークにチェックを入れ、一番上に持ってくる。
仮想マシンを起動させると、処理が進み、下記の画面に行き着いた。
boot:プロンプトに、PXE設定ファイルで設定したlabel(centos7.6.1810)を入力してEnterしてもいいし、defaultをcentos7.6.1810に設定しているので何も入力せずEnterしてもいいし、時間が経てばdefaultが起動するので放っておいてもいい。
なお、prompt 0と設定しておけば、すぐに起動する様子。
インストーラーが起動した。




















参考

PXEとは

Linuxキーワード PXE
PXEブートで楽をする
PXEBOOT/BOOTP/DHCPあたりのことをまとめておく

NFSサーバーの設定

NFS3のファイアウォールの設定で参考。PXEはNFS3でmountを試みるようで、はまった。
NFSサーバーの設定


コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする