PXE でディスクレスBootします
電力事情で、自分の部屋にクーラを設置できない、かえるのクーの助手の「井戸中 聖」です。ひたすら暑いです。
お盆休みは、夏休みの自由研究でディスクレスLinuxクライアントの構築を行いました。
この3日間まるまる使って人海戦術総当たり戦による研究でした。技術のなさは「体力」で補えることがよくわかりました。
さて、自由研究の成果発表なのですが、長くなりそうなので3回にわけて行います。
レガシーBIOSモードによるPXE起動ですが、こちらはサーバ構築を含めて(DHCPではまった件を省いて)2~3時間で完了しました。
やっかいだったのが、「UEFIモードのPXE」と、結構最近のモードらしい「UEFIモードのHTTP/UFI」でした。ネットの記事を読みまくって実行するのですが、まったく歯がたちません。エラーメッセージも表示されないので、どこがおかしいのかさえ分かりません。そんなときは総当たり戦です。
苦労の甲斐あって、UEFIモードのPXEでも、HTTP/UFIでもbootすることができました。
今回はLegacyBIOSモードによる設定です。(UEFIモードは次の記事の予定です。)
ほぼ
様の手順のとおりでできました。
環境は以下のとおり
サーバ:仮想環境の CentOS 8.2 SELinuxはOFF
クライアント:pxe機能をもったマザーボードのPC
このサーバをホストOSの空きLANポートにブリッジ接続し、10.0.0.1 のアドレスにしてPXE起動のサーバにしました。スイッチは手元に適切な機器がなかったのでクライアントと直接接続しました。
※LANスイッチ/ルータを使用する場合はDHCP機能なしのものか、DHCPの設定をOFFして使用してください。わたくしはこれで半日はまりました。
サーバにはdhcp, tftp の機能が必要です
(puti se note 様)
PXEブートとは? PXE ブートの仕組み - puti se note
手順トレースは以下の通りです
tftpサーバ機能をインストールし、Firewallポートを開けます。※定義をcopy & pasteするときは未定義文字の巻き込みに注意ください。
# dnf -y install tftp-server
# systemctl enable --now tftp.socket
# firewall-cmd --add-service=tftp --permanent
# firewall-cmd --reload
DHCPのインストールをして設定をします。
# dnf -y install dhcp-server
# vi /etc/dhcp/dhcpd.conf ※以下新規作成
option domain-name "srv.world";
option domain-name-servers pxe_server.srv.world;
default-lease-time 600;
max-lease-time 7200;authoritative;
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 10.0.0.0 netmask 255.255.255.0 {
range dynamic-bootp 10.0.0.200 10.0.0.254;
option broadcast-address 10.0.0.255;
option routers 10.0.0.1;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
# PXE servers hostname or IP address
next-server 10.0.0.1;
filename "pxelinux.0";
}
}
# systemctl enable --now dhcpd ※このタイミングではエラーになります。
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload
BOOT用のファイルを準備します。
# dnf -y install syslinux
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# cp /usr/share/syslinux/{menu.c32,vesamenu.c32,ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/
# mkdir /var/lib/tftpboot/pxelinux.cfg
# vi /var/lib/tftpboot/pxelinux.cfg/default
default centos8
label centos8
kernel centos8/vmlinuz
append initrd=centos8/initrd.img root=nfs:10.0.0.1:/var/lib/tftpboot/centos8/root rw selinux=0
# dnf -y install dracut-network nfs-utils
InfiniBandの実験もしたいので"Infiniband Support"も入れておきます。
# dnf group -y install "Server with GUI" "Infiniband Support" --releasever=8 --installroot=/var/lib/tftpboot/centos8/root/
ルートパスワードをshadowファイルに設定します。
# python3 -c 'import crypt,getpass; \
print(crypt.crypt(getpass.getpass(), \
crypt.mksalt(crypt.METHOD_SHA512)))'
パスワードを入力。
$6$gr...これで生成されたパスワード暗号.....をshadowのrootに設定
# vi /var/lib/tftpboot/centos8/root/etc/shadow
----------------------------------------------
root:$6$gr...これで生成されたパスワード暗号.....:18358:0:99999:7:::
----------------------------------------------
# vi /var/lib/tftpboot/centos8/root/etc/locale.conf
LANG="en_US.UTF-8"
# vi /var/lib/tftpboot/centos8/root/etc/hostname
localhost.localdomain
# vi /etc/exports
/var/lib/tftpboot/centos8/root 10.0.0.0/24(rw,no_root_squash)
# systemctl enable --now nfs-server
# firewall-cmd --add-service=nfs --permanent
# firewall-cmd --reload
# wget -P /var/lib/tftpboot/centos8/ http://mirror.centos.org/centos/8/BaseOS/x86_64/os/images/pxeboot/vmlinuz http://mirror.centos.org/centos/8/BaseOS/x86_64/os/images/pxeboot/initrd.img
pxe_serverのアドレスを 10.0.0.1/24 に設定してシャットダウン
pxe_serverの接続をNATからブリッジ(専用接続ポート:インターネット接続なし)に変更
pxe_serverをboot
デーモンの起動状態を確認
# systemctl status dhcpd
# systemctl status tftp
起動、再起動のコマンドはこちら
# systemctl start dhcpd
# systemctl start tftp
# systemctl restart dhcpd
# systemctl restart tftp
nfs可能になっているか確認
# exportfs
/var/lib/tftpboot/centos8/root 10.0.0.0/24
クライアント機の起動モードの設定
クライアント機のBoot OptionでPXE(Legacy BIOS)を指定します。
わたくしのPCではBoot/CSM=Enable, Launch PXE OpROM Policy=Legacy only, Launch Strage OpROM Policy=Legacy onlyに設定します。
クライアント機のBoot
DHCPの取得中/取得の英語メッセージのあとに、PXELINUXのbootが起動し、Linuxが起動していきます。CrashRecovery..がFailするほかはほぼOKで起動していきます。
初回の認証確認をGUIできいてきました。原因はわかりませんが、初回のSetPasswordでフリーズしてしまいます。
クライアントを再起動してみます。設定したパスワードでログインできます。
日本語の環境を選択しておきます。
これで、ディスクレスクライアントをPXE(レガシーBIOS)で起動できるようになりました!!
これでノードクラスタが100台でも200台でも大丈夫(のはず)です。