概要
PXEブートを利用して Linux OS を インストールする。
同じ環境を用意(後述)すれば、誰でも動作確認まで到達できる手順を作る。
とにかくすぐにやってみたい、という方は、 " [1] 準備 " へ進んでください。
--
この手順のメリット
・既存のDHCPサーバと共存できます。
自宅だと、Wi-FiルータやケーブルモデムのDHCP機能を使っている場合が多いと思われますが、
その場合には、PXEテスト中にネットワークを切り離したり、別のスイッチングハブに接続したりするのがとても面倒です。
この手順だと、ProxyDHCPを利用するため、既存のDHCPサーバは動かしたままでOKです。
PXEブートの環境
この手順では、
自宅など、"Wi-Fiルーター" や "ケーブルモデム" 等の DHCPサーバーが既に稼働している環境 での使用を想定して、Alma Linux を使って必要なサーバーをセットアップします。
概要図は以下の通り。
注意事項
宅内での動作テストができるところまでを前提としているため、セキュリティは非常に甘くなっております。
実際の運用をお考えの方は、必要に応じてFirewall等の設定の見直しを行うなど、ご自身のご判断において設定変更等をお願いいたします。
利用したソフトやバージョンについて
とにかく書いてあるまま操作すれば動作する組み合わせとしました。
例えば、以下のような条件がありますが、
選択肢が1つ違うだけで、コンフィグの書き方が異なったり、追加の作業が必要になったりと、動作が確認できるまで、自分はかなり時間を要してしまいました。
そこで今回は太字にしてある条件に決め打ちすることで、できるだけ簡単にPXEブートを体験できるようにするのが目標です。
<項目> | <選択肢 A> | <選択肢 B> |
---|---|---|
PXEプログラム | syslinux(pxelinux.0) | iPXE |
iPXEプログラム | BIOS向け (undionly.kpxe) | UEFI向け (ipxe.efi) |
Operating System | Linux | WindowsPE (Windows10/11) |
Linux | Redhat系 | Ubuntu,その他 |
Architecture | 64bit | 32bit |
PXEブートの処理の流れについて
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
No | 必要な情報 | 受診方法 | 送信元 | 値 (IPアドレス/ファイル名) |
---|---|---|---|---|
1 | IPアドレス | 既存のDHCPサーバから受け取る | WiFiルータ、ケーブルモデム等 | 192.168.2.*** (既存のDHCPサーバのリース範囲から割当) |
2 | tftpサーバのIPアドレス | 作成するDHCPサーバから受け取る | dnsmasq | 192.168.2.222(この手順の場合) |
3 | PXEプログラムの名前 | 作成するDHCPサーバから受け取る | dnsmasq | pxelinux.0 |
4 | PXEプログラムの本体 | 作成するtftpサーバから受け取る | isc-tftpd | pxelinux.0 |
5 | PXEプログラムが表示させるMenuファイル | 作成するtftpサーバから受け取る | isc-tftpd | /var/lib/tftpboot/pxelinux.cfg/default |
6 | Linuxインストーラの起動ファイル | 作成するhttpサーバから受け取る | isc-tftpd | /var/lib/tftpboot/centos/initrd.img /var/lib/tftpboot/centos/vmlinuz |
7 | Linuxインストーラからインストールされるファイル | 外部WEBサーバから受け取る | ミラーサイト | /var/lib/tftpboot/pxelinux.cfg/default の "Label 1" に記載するミラーサーバーのURLからダウンロード |
7' | Linuxインストーラからインストールされるファイル | 作成するhttpサーバから受け取る | Nginx | /usr/share/nginx/html/centos7/ に、コピーしたISOファイルの中身 |
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
検証環境
Windows / VMwareのバージョン
Host OS | VMware | Virtual Machine |
---|---|---|
Windows10 22H2 | VMware Workstation 17.5.1 Player | 【VM 1】 2x vCPU / 2G RAM / 20GB Strage |
^ | ^ | 【VM 2】 2x vCPU / 2G RAM / 20GB Strage |
Virtual Machine について
OS | Role | バージョン | 説明 | |
---|---|---|---|---|
【VM 1】 | Almalinux | Server(CUI) | 9.3 | PXEサーバを立ち上げる環境 |
$ uname -a
Linux alma 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 7 14:54:22 EST 2023 x86_64 x86_64 x86_64 GNU/Linux
OS | Role | バージョン | 説明 | |
---|---|---|---|---|
【VM 2】 | CentOS | --- | 7.9 | PXE経由でインストーラを立ち上げるOS |
アプリの一覧
機能 | アプリ名 | 使ったバージョン | 備考 |
---|---|---|---|
TFTP Server | isc-tftpd | tftp-server-5.2-37.e19.x86_64 | |
HTTP Server | Nginx | nginx-1:1.20.1-14.el9_2.1.alma.1.x86_64 | |
DHCP Server | dnsmasq | dnsmasq-2.85-14.el9_3.1.x86_64 | ※ Proxy DHCPとして動作させる |
PXE boot | syslinux | syslinux-6.04-0.20.el9.x86_64 |
設定ファイルの一覧
機能 | アプリ名 | コンフィグのファイル名(フルパス) |
---|---|---|
TFTP Server | isc-tftpd | --- |
HTTP Server | Nginx | /etc/nginx/nginx.conf |
DHCP Server | dnsmasq | /etc/dnsmasq.d/pxeboot.conf |
PXE boot | syslinux (pxelinux.0) | /var/lib/tftpboot/pxelinux.cfg/default |
作業フォルダの一覧
機能 | サーバアプリ | 作業フォルダ(デフォルト) | この手順で作るサブフォルダ |
---|---|---|---|
TFTP Server | isc-tftpd | /var/lib/tftpboot/ | /var/lib/tftpboot/centos/ |
HTTP Server | Nginx | /usr/share/nginx/html/ | /usr/share/nginx/html/centos7/ |
PXEファイルの説明
PXE | ファイル名 | バージョン |
---|---|---|
syslinux | pxelinux.0 | BIOS向け。今回はこれを使います。 |
上の強化版。今回は使いません。 | ||
iPXEのBIOS版。今回は使いません。 | ||
iPXEのUEFI版。今回は使いません。 |
[1] 準備
[1-1] OSインストール
- Alma Linux 9.3
マルチユーザーモード/CUI で isoからインストール。
ファイル直リンク(10GB)
https://ftp.riken.jp/Linux/almalinux/9.3/isos/x86_64/AlmaLinux-9.3-x86_64-dvd.iso
rikenのmirror site
インストール時の設定
デバイス | 概要 |
---|---|
メモリ | 2 GB |
プロセッサ | 2 |
ネットワークアダプタ | ブリッジ(自動) |
インストール概要
「ソフトウェアの選択」では「サーバー」にチェックを入れる。
※「GUI使用」ではないので注意。
※ 右側の「選択した環境用のその他のソフトウェア」にはチェックを入れない。
ネットワーク設定
項目 | 値 |
---|---|
IPアドレス | 192.168.2.222 |
Netmask | 255.255.255.0 |
Gateway | 192.168.2.1 |
ネームサーバー | 192.168.2.1 |
※各設定はテスト用。 ---> 各自の環境にあわせて変更してください。
※IPv6は無効にする。
[1-2] 共通の設定や準備
- OSをアップデート/アップグレード
sudo dnf update
sudo dnf upgrade
- よく使うツールをインストール (自分用:不要な方はスキップして下さい:この手順では使いません)
sudo dnf install nmap wget traceroute
- ファイアウォールを無効にする(宅内のみの利用を想定しているため)
#サービスを停止する
sudo systemctl stop firewalld.service
#再起動時に、サービスが起動しないように無効化しておく
sudo systemctl disable firewalld.service
- selinuxを無効にする
状態を確認する(デフォルト値の Enforcing が表示される)
$ getenforce
Enforcing
# 一旦、元ファイルのバックアップを取っておきます。
sudo cp /etc/selinux/config /etc/selinux/config.bak
以下のように書き換える (以下2つのどちらのパターンでもOK)
(sedで置き換える場合)
# 置き換え
sudo sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
# 確認
sudo cat /etc/selinux/config
(viで直接編集する場合)
sudo vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=permissive
一度、サーバを再起動する(下記のいずれかでOK)
sudo init 6
or
sudo shutdown -r now
or
sudo reboot
再起動したら、状態を確認する(Permissiveと表示されればOK)
$ getenfoce
Permissive
[2] PXEブート機能
[2-1] TFTP Server (isc-tftpd)
■ tftpd の設定
- tfptdをインストールする。確認に使えるよう tftp もインストールしておく。
sudo dnf install tftp tftp-server
インストール済み:
tftp-5.2-37.el9.x86_64
tftp-server-5.2-37.el9.x86_64
サービス起動&自動起動の設定~状態の確認
sudo systemctl start tftp.service
sudo systemctl enable tftp.service
sudo systemctl status tftp.service
[2-2] HTTP Server (nginx)
■ httpd の設定
- 今回は nginx をインストールする。
(基本的な機能しか使わないので、ApacheでもOK)
sudo dnf install nginx
インストール済み:
almalinux-logos-httpd-90.5.1-1.1.el9.noarch
nginx-1:1.20.1-14.el9_2.1.alma.1.x86_64
nginx-core-1:1.20.1-14.el9_2.1.alma.1.x86_64
nginx-filesystem-1:1.20.1-14.el9_2.1.alma.1.noarch
サービス起動&自動起動の設定~状態の確認
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
[2-3] DHCP Server (dnsmasq)
※DHCPサーバは dnsmasq を使う
→ dnsmasq は Proxy DHCP として機能できる
→ Proxy DHCP とは、IPリースは既存のルーター等に任せて、
PXEブートに必要な tfpサーバの情報の配布だけを担当できる。
このため、宅内のモデムやWi‐Fiルータと共存できる。
(ネットワークの切り替え不要!)
インストール
$ sudo dnf install dnsmasq
インストール済み:
dnsmasq-2.85-14.el9_3.1.x86_64
dnsmasq の設定ファイルを作成する
- 以下のディレクトリに新規でファイルを作る。
sudo vi /etc/dnsmasq.d/pxeboot.conf
- ファイルの中身
注意点 :
-- interface は、環境に合わせてを必ず追加する
-- dhcp-range は、今回の Proxy DHCP 利用に合わせて "ネットワークアドレス表記" と "proxy" になる。(この設定が最も混乱した。。)
-- IPアドレスは環境に合わせて変更する
-- dhcp-boot は、pxelinux.0 を利用する。
port=0
log-dhcp
interface=lo, ens160
dhcp-range=192.168.2.0,proxy
dhcp-boot=pxelinux.0,192.168.2.222
pxe-service=x86PC,"Network Boot",pxelinux,192.168.2.222
【参考1】
- interface名の調べ方
nmcli コマンドで調べられる。
→この例の場合は、ens160 が対象のデバイス名
$ nmcli
ens160**: 接続済み から ens160
"VMware VMXNET3"
ethernet (vmxnet3), 00:0C:XX:XX:XX:XX, hw, mtu 1500
ip4 デフォルト
inet4 192.168.2.222/24
route4 192.168.2.0/24 metric 100
route4 default via 192.168.2.1 metric 100
lo: 接続済み (外部) から lo
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
inet4 127.0.0.1/8
inet6 ::1/128
route6 ::1/128 metric 256
DNS configuration:
servers: 192.168.2.1 8.8.8.8
interface: ens160
[3] syslinuxを準備する
sudo dnf install syslinux
インストール済み:
mtools-4.0.26-4.el9_0.x86_64
syslinux-6.04-0.20.el9.x86_64
syslinux-nonlinux-6.04-0.20.el9.noarch
今回は以下のファイルを使います。
ファイル名 | 説明 |
---|---|
pxelinux.0 | ブートローダファイル |
ldlinux.c32 | pxelinux.0 の依存ファイル |
menu.c32 | キャラクタベースメニューを表示するファイル |
libutil.c32 | menu.c32 の依存ファイル |
reboot.c32 | 再起動を実行するファイル |
libcom32.c32 | reboot.c32 の依存ファイル |
# TFTPサーバのルートにコピーする
sudo cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
#sudo cp /usr/share/syslinux/lpxelinux.0 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/libutil.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/reboot.c32 /var/lib/tftpboot/
sudo cp /usr/share/syslinux/libcom32.c32 /var/lib/tftpboot/
[4] 起動ファイルの準備
[4-1] CentOS 7 をインターネット経由でインストールする場合
- 新規ディレクトリを作成する
- wgetコマンドで起動に必要なファイルをダウンロードする
sudo mkdir -p /var/lib/tftpboot/centos
cd /var/lib/tftpboot/centos
sudo wget http://mirror.centos.org/centos/7/os/x86_64/images/pxeboot/initrd.img
sudo wget http://mirror.centos.org/centos/7/os/x86_64/images/pxeboot/vmlinuz
mirror site list
[4-2] CentOS 7 を ローカルドライブからインストールする場合
- ISOファイルをLinux上にダウンロードする
ファイル直リンク(4.4 GB)
# 今回は作業しているユーザー(user)のホームディレクトリにダウンロードしてみます。
cd /home/user/
# ダウンロード開始
wget https://ftp.riken.jp/Linux/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
少し時間がかかるので、一旦ここで休憩しましょう('ω')**
rikenのmirror site
https://ftp.riken.jp/Linux/centos/7.9.2009/isos/x86_64/
- ISOファイルの中身をローカルにコピーする
# ISOマウント用のフォルダを作る ※フォルダ名は /mnt など何でもよい。
# AlmaLinuxでは /media という場所があるので、今回はその中にフォルダを作る。
sudo mkdir /media/centos
sudo mount /home/user/CentOS-7-x86_64-DVD-2009.iso /media/centos/
# httpd (nginx) のルートに、centosイメージを置く場所を作る
#cd /usr/share/nginx/html/
#sudo mkdir centos7
sudo mkdir /usr/share/nginx/html/centos7
# ISOイメージの中身を、httpdルートの中の centos7 フォルダへコピーする
sudo cp -rfv /media/centos/* /usr/share/nginx/html/centos7/
[5] PXEメニューファイルの作成
以下の、 フォルダ名とファイル名は固定 です。(そういう仕様)
/var/lib/tftpboot/pxelinux.cfg/default
# フォルダを作成
sudo mkdir /var/lib/tftpboot/pxelinux.cfg
# ファイルを作成
sudo vi /var/lib/tftpboot/pxelinux.cfg/default
参考にしたページ
https://reintech.io/blog/installing-configuring-pxe-boot-server-almalinux-9
CentOS 7 インストール用のメニュー
default menu.c32
prompt 0
timeout 300
ONTIMEOUT local
menu title PXE Boot Menu
label 1
menu label ^1) Install CentOS 7 via the Intrenet
kernel centos/vmlinuz
append initrd=centos/initrd.img method=http://ftp.riken.jp/Linux/centos/7/os/x86_64/ ip=dhcp
label 2
menu label ^2) Install CentOS 7 via local drive
kernel centos/vmlinuz
append initrd=centos/initrd.img method=http://192.168.2.222/centos7 devfs=nomount
label 3
menu label ^3) Boot from local drive
localboot 0
ファイル中に書かれているURLのソース
[6] AlmaLinuxのサービス起動の確認
以下2つのポートだけ開いているのが確認できたらOKです
(tftpd と dhcpd は見えなくてOK)
$ nmap localhost
Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-23 20:58 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00017s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
[7] PXEブート確認用のVMの準備
今回は Virtual Machine をもう1台作ります。
スペックは、作業中のAlmaLinuxのVMと同じにしてください。
(空いているハードウェアがあれば、物理的なPCでもOKです)
デバイス | 概要 |
---|---|
メモリ | 2 GB |
プロセッサ | 2 |
ネットワークアダプタ | ブリッジ(自動) |
[8] PXEブートを試す
- まず、共通のメニューが表示されます
[8-1] Networkインストール
- メニューから「1) Install CentOS 7 via the Intrenet」を選択してEnterキーを押します。
ファイルをインターネット経由でダウンロードするため、少し時間がかかります。
この画面が表示されたら成功です!
[8-2] ローカルインストール
- メニューから「2) Install CentOS 7 via local drive」を選択してEnterキーを押します。
- このパターンでは、ローカルにコピーしたファイルからロードするため、1分程度で起動するはずです。
この画面が表示されたら成功です! (インターネット経由と同じ画面)
[9] インストール完了
ここまで出来たらすべて完了です。お疲れ様でした!
[10] まとめ
だいたいどういう流れで動作するのかが、体験できました。
作成する過程で、問題が出た時の原因の切り分にかなり時間を要しましたので、
一度、動作した状態からならば、この先のアレンジがしやすくなると考えています。
- UEFI から起動
- Ubuntu をインストール
- Windows10/11 をインストール (そのためには、まず Windows PE を起動させる)
等、また機会がありましたらやってみたいと思います。
- 再度、PXEサーバをイチから作りたくなった時のための備忘録として書き始めましたが、どなたかのご参考にもなれば幸いです。
ここまで読んでいただきありがとうございました。
素朴な疑問に答えるコーナー
PXEサーバー側は AlmaLinux で、ブートさせるクライアント側は CentOS7 なのはナゼ ?
PXEサーバー側
なるべく最新のディストリビューションでサーバーを作りたかったからで、
私が使いやすいと思ったRedhat系にしました。
Rocky Linux も候補に挙がりましたが、私の環境では dnf / yum を使った時のレスポンスが、Alma の方が安定して速度が出たからです。ご利用のNW環境によっても変わるかもしれません。
クライアント側
同じAlma Linuxのバージョン(執筆時の最新版9.3)にしたかったですが、
ブートさせる設定を作る手順で一手間増えてしまう※ ため、より簡単に試せるCentOS7にしました。
CentOS7 はちょうど執筆時頃(2024年の春)にサポートが終了することも把握していましたが、手に入りやすいことや、PXEブートさせるまでの設定がシンプルになるため選定しました。
これは、この手順では、PXEブートを実際に体感していただくことを主目的としたためです。
※どう一手間かかるか気になる方はやってみてください。。
CentOS7よりも面倒なんです。
参考にさせていただいた記事等
主に以下のサイトを参考にさせていただきました。
どれもPXE(iPXE)ブートでのOSを解説されたページですが、特にお世話になった部分ごとに分けてご紹介させていただきます。
■ PXEブートの仕組みや全体の流れについて ■
https://qiita.com/Yuhkih/items/c7cc9978ee107784c97f
https://qiita.com/sandopan65/items/22922bbf5bc806962e13
■ dnsmasqを使ったProxy DHCPの設定 ■
https://zappy.hatenablog.jp/entry/2018/05/31/190434
https://qiita.com/arachan@github/items/c16a475b958ac761743a
■ syslinux (pxelinux.0) での menu ファイルの作り方 ■
https://reintech.io/blog/installing-configuring-pxe-boot-server-almalinux-9
http://www.mikitechnica.com/14-centos72-pxe.html
■ 作業全体の説明 や syslinux関連ファイルの解説 ■
https://amaneku.hatenadiary.com/entry/2020/02/15/011947