クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

PXEでDiskless Linux (CentOS)クライアントを実現する(LegacyBIOS編)

PXE でディスクレスBootします

電力事情で、自分の部屋にクーラを設置できない、かえるのクーの助手の「井戸中 聖」です。ひたすら暑いです。

お盆休みは、夏休みの自由研究でディスクレスLinuxクライアントの構築を行いました。

この3日間まるまる使って人海戦術総当たり戦による研究でした。技術のなさは「体力」で補えることがよくわかりました。

f:id:AssistantOfKoo:20200816040219j:plain   f:id:AssistantOfKoo:20200816041205j:plain  f:id:AssistantOfKoo:20200816041111j:plain

さて、自由研究の成果発表なのですが、長くなりそうなので3回にわけて行います。

レガシーBIOSモードによるPXE起動ですが、こちらはサーバ構築を含めて(DHCPではまった件を省いて)2~3時間で完了しました。

やっかいだったのが、「UEFIモードのPXE」と、結構最近のモードらしい「UEFIモードのHTTP/UFI」でした。ネットの記事を読みまくって実行するのですが、まったく歯がたちません。エラーメッセージも表示されないので、どこがおかしいのかさえ分かりません。そんなときは総当たり戦です。

f:id:AssistantOfKoo:20200816095948p:plain

苦労の甲斐あって、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 の機能が必要です

f:id:AssistantOfKoo:20200816020023g:plain(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に設定します。

f:id:AssistantOfKoo:20200816100024p:plain f:id:AssistantOfKoo:20200816100042p:plain

クライアント機のBoot

DHCPの取得中/取得の英語メッセージのあとに、PXELINUXのbootが起動し、Linuxが起動していきます。CrashRecovery..がFailするほかはほぼOKで起動していきます。

f:id:AssistantOfKoo:20200816100232p:plain f:id:AssistantOfKoo:20200816100245p:plain 

f:id:AssistantOfKoo:20200816100308p:plain f:id:AssistantOfKoo:20200816100318p:plain

初回の認証確認をGUIできいてきました。原因はわかりませんが、初回のSetPasswordでフリーズしてしまいます。

クライアントを再起動してみます。設定したパスワードでログインできます。

日本語の環境を選択しておきます。

これで、ディスクレスクライアントをPXE(レガシーBIOS)で起動できるようになりました!!

これでノードクラスタが100台でも200台でも大丈夫(のはず)です。

f:id:AssistantOfKoo:20200816040457p:plain