PXEにより、VirtualBoxでCentOS 7のインストーラーを起動した(図で解説あり)
Follow @venividivici830
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の公式ドキュメントのやり方を踏襲した。
OSやインストーラーを、ネットワーク経由で起動できる。
Kickstartと組み合わせることで、Linux OSのインストールを自動化できる。
PXEに必要なサーバーは、下記の3つ。
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を起動。
DHCPでIPが割り当てられたので、ip aコマンドでIPを確認し、以後、ホストOSからsshで接続して作業した。
下記コマンドで、ブリッジアダプター(enp0s3)と内部ネットワーク(enp0s8)をさらに設定。
/etc/dhcp/dhcpd.confの末尾に下記を追加(Redhatの公式ドキュメントの設定例をコピペ)
上記の設定は、下記を行っている。
DHCPサーバーの起動、OS起動時に起動させるよう設定
dhcpd.confに、enp0s8のネットワークの設定のみ記述され、enp0s3のネットワークの定義がないことが原因。
このドキュメントに従い、/etc/sysconfig/dhcpd に DHCPDARGS=enp0s8; を追記し、systemctl restart dhcpd を実行し、再度確認したが、改善されなかった。
上記エラーと一緒に、Ignoring requests on enp0s3.と出ているので、enp0s3のDHCPリクエストは無視されるようだし、これが望んだ動きでないなら〜しろ(和訳)と出ているが、望んだ動きだし、起動はしているので、無視することにした。
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サーバー構成手順も参考になりそう。
ここでは、ホスト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されるとする。
下記コマンドで、./var/lib/tftpboot以下にファイルが展開されるので、./var/lib/tftpboot/pxelinux.0を、/var/lib/tftpboot/pxelinuxにコピー。
続いて、ブートイメージファイルを格納するサブディレクトリーを作成し、ブートイメージファイルをそのディレクトリーにコピー。
補足
vmlinuz、initrd.imgが何者なのか理解できていないが、下記が参考になりそう。
GRUBの設定ファイルの違い
Linuxがブートするまで
1.4.9 ブート・ローダー構成ファイルについて
それぞれPXE設定ファイルのinst.repo、kernel、initrdで設定する。
pxelinux/ ディレクトリー内に pxelinux.cfg/ ディレクトリーを作成し、pxelinux.cfg/ ディレクトリーに default という名前の設定ファイルを追加。
これが、デフォルトのPXE設定ファイルになる。
よって、/var/share/installation_sourceを作成し、NFSをインストール、設定、ファイアウォールを設定し、NFSでexportした。
そして、インストールソースを配置した。
インストールソースは、インストールソースの説明としてredhatの公式ドキュメントに下記の記述があるので、ISOイメージをmountしたディレクトリーなども使えるようだ。
以上により、OSを再起動しても、上記すべての設定がリセットされず、PXEサーバーとして機能できる
ネットワークにチェックを入れ、一番上に持ってくる。
仮想マシンを起動させると、処理が進み、下記の画面に行き着いた。
boot:プロンプトに、PXE設定ファイルで設定したlabel(centos7.6.1810)を入力してEnterしてもいいし、defaultをcentos7.6.1810に設定しているので何も入力せずEnterしてもいいし、時間が経てばdefaultが起動するので放っておいてもいい。
なお、prompt 0と設定しておけば、すぐに起動する様子。
インストーラーが起動した。

PXEブートで楽をする
PXEBOOT/BOOTP/DHCPあたりのことをまとめておく
NFSサーバーの設定
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/defaultdefaultファイルに下記を記載
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キーワード PXEPXEブートで楽をする
PXEBOOT/BOOTP/DHCPあたりのことをまとめておく
NFSサーバーの設定
NFS3のファイアウォールの設定で参考。PXEはNFS3でmountを試みるようで、はまった。NFSサーバーの設定
コメント
コメントを投稿