今年4月にリリースされたubuntu 24.04 LTSを使いHPC Clusterを構築する
この記事は未完成です。完成まで少しお待ちください。
今年4月にリリースされたUbuntu 24.04 LTSを使いHPC Clusterを構築します。この記事を書くに至った理由は次のとおりです。
私のお客様でHPC Clusterをお使いの方は何人かいらっしゃいますが、その中にCentOS 6.3の時代にHPC Clusterを構築させていただいて、毎年ノードを追加しながら25ノードのクラスタまで成長した事例があります。今年度1ノードを追加する際にOSも最新のものにアップグレードすることになりました。現地でスクラッチからHPC Clusterを構築するのは、時間もかかりますし、予期しないトラブルへの対処も難しいことから、私の作業場で小規模なHPC Clusterを構築して動作検証を行い、そのOSクローンを行ったUSBを使い、現地でノード数を拡大するという手順を採用しました。この記事では私の作業場での小規模HPC Cluster構築の手順を実際の体験に基づいて記述していきます。この方法で構築した26台のHPC Clusterがお客様の大学で順調に稼働しており、日夜計算が流されています。HPC Clusterを構築したい読者の役に立つよう、最短手数でのクラスタ構築の解説を行います。
この記事では4台のPCを使ってHPC Clusterを構築します(HPC Cluster構成図参照)。
HPC Clusterではノード(HPC Clusterを構成するコンピュータ)間でファイルの共有、ユーザ情報の共有、ジョブスケジューラ(空いているノードに計算を流すソフトウェア)、プログラムのソースコードを高速に実行できるバイナリコードに変換するコンパイラ、複数ノードを使う並列プログラムを実行可能にするMPIライブラリなどが必要になります。
この記事では、ファイル共有はNFS、ユーザ情報の共有はNIS、ジョブスケジューラはSlurm、コンパイラとMPIライブラリはIntel oneAPIを使用します。
各ノードにUbuntu 24.04をインストールして、各種の設定を行う必要がありますが、個別に行なっていては時間がかかり過ぎていつ終わるか分かりません。この記事ではHead NodeにUbuntu 24.04と必要なソフトウェアパッケージを全てインストールして、それをSystem Clonerを使って、USBメモリにクローンします。Compute Nodeでは、USBメモリから立ち上げて、USBメモリの内容をCompute Nodeのシステムディスクにクローンして、/etc/hostnameとIPアドレスをCompute Node様に書き換えます。これを3台のCompute Nodeで行い、Head Nodeからsshで全てのノードで必要なサービスを立ち上げます。これでHPC Clusterが完成します。この手順をこの後具体的に詳しく解説していきます。
Head Node/Compute Node 01にUbuntu 24.04 Serverをインストールする
ここからUbuntu 24.04 ServerのisoイメージをダウンロードしてUSBメモリなどに書き込んで、そのUSBメモリからブートします。ダウンロードしたisoイメージをUSBメモリに書き込むコマンドは、Linux上では
dd if=ubuntu-24.04-live-server-amd64.iso of=USBメモリのデバイス名(/dev/sdbなど) bs=1M
の様になります。
インストールは特に難しい点はありませんが、LVMを使わない様にすることと、OpenSSH Serverをインストールする点に注意してください。
インストール後の初期設定
インストールが終わりリブートすると、ハードウェアの構成によっては
と表示され90秒待たされる場合があります。リブート時に毎回待たされて時間の無駄ですので、その場合は
sudo systemctl disable systemd-networkd-wait-online.service
sudo systemctl mask systemd-networkd-wait-online.service
を実行すると、待たされることがなくなります。
ログインすると比較的長めのメッセージが毎回表示されますので、これをなくすために、
sudo chmod -x /etc/update-motd.d/*
を実行します。
TimezoneをAsia/Tokyoにする
現在のTimezoneは
hpc@node01:~$ date
Fri Jul 26 11:22:42 PM UTC 2024
hpc@node01:~$
これをAsia/Tokyoにするには
sudo timedatectl set-timezone Asia/Tokyo
を実行します。
hpc@node01:~$ sudo timedatectl set-timezone Asia/Tokyo
[sudo] password for hpc:
hpc@node01:~$ date
Sat Jul 27 08:29:46 AM JST 2024
hpc@node01:~$
時刻をNTPサーバと同期する
systemd-timesyncdを使用してNTPサーバと時刻同期を行います。
sudo timedatectl set-ntp true
/etc/systemd/timesyncd.confの最後に
[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp.ubuntu.com
を付け加えて
sudo systemctl restart systemd-timesyncd
を実行します。
その結果、時刻がNTPサーバと同期しているか確かめるにはtimedatectl statusを実行します。
hpc@node01:~$ timedatectl status
Local time: Sat 2024-07-27 08:48:15 JST
Universal time: Fri 2024-07-26 23:48:15 UTC
RTC time: Fri 2024-07-26 23:48:15
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
hpc@node01:~$
•Local time: 現地時間(JST)。
•Universal time: 協定世界時(UTC)。
•RTC time: リアルタイムクロックの時間。
•Time zone: 設定されているタイムゾーン(Asia/Tokyo)。
•System clock synchronized: システムクロックがNTPサーバと同期されているかどうか(yesと表示されているので同期されています)。
•NTP service: NTPサービスの状態(activeと表示されているのでアクティブです)。
•RTC in local TZ: リアルタイムクロックがローカルタイムゾーンに設定されているかどうか(noと表示されていますが、通常これは問題ありません)。
すべての設定が正しく行われ、NTPサーバと時刻が同期されていることが確認できました。これでシステムの時刻は自動的に正確に保たれます。
公開鍵認証を設定する
Ubuntu 24.04で公開鍵認証を使用することの主なメリットは次の通りです:
1. セキュリティの向上:
•パスワード認証に比べて、公開鍵認証は非常に強力でセキュリティが高いです。パスワードは簡単に推測されたり、ブルートフォース攻撃にさらされたりする可能性がありますが、公開鍵は複雑で推測が困難です。
2. ブルートフォース攻撃の防止:
•パスワード認証を使用すると、ブルートフォース攻撃でパスワードを試行されるリスクがあります。公開鍵認証を使用することで、このリスクを大幅に軽減できます。
3.利便性:
•公開鍵認証を使用すると、一度設定すればパスワードを毎回入力する必要がなくなります。これにより、サーバーへのアクセスが迅速かつ効率的になります。
4. 自動化のサポート:
•スクリプトや自動化ツールを使用してサーバーにアクセスする場合、公開鍵認証は非常に便利です。パスワードを入力する必要がないため、自動化されたプロセスが中断されることなく実行されます。
Ubuntu 24.04において、SSH公開鍵認証を設定することで、これらのメリットを享受し、セキュアで効率的なサーバー管理を実現することができます。
公開鍵認証の設定
ssh-keygen -t rsa
を入力し表示される質問には全てenterを入力します。
hpc@node01:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hpc/.ssh/id_rsa): Created directory '/home/hpc/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hpc/.ssh/id_rsa
Your public key has been saved in /home/hpc/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:WyrNcTa6RZdPey6Ax+wJX4bDK8jtPxwtvbANUf7Furw hpc@node01
The key's randomart image is:
+---[RSA 3072]----+
| |
| . |
| o . |
| ... o|
| S *=o=.o.|
| o Xoo&o*..|
| ..*o.* /oo.|
| .ooo O *o |
| ...o..Eo.|
+----[SHA256]-----+
hpc@node01:~$
生成された~/.ssh/id_rsa.pubを~/.ssh/authorized_keysにコピーして、authorized_kaysファイルの属性をオーナーのみのrwに変更します。
hpc@node01:~$ cd ~/.ssh
hpc@node01:~/.ssh$ cp id_rsa.pub authorized_keys
hpc@node01:~/.ssh$ chmod og-r authorized_keys
SSH設定ファイルの変更
/etc/ssh/sshd_configファイルで、以下の行を確認(そうなっていない場合は以下の様に変更する)または追加します。
#include/etc/ssh/sshd_config.d/*.conf
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
/etc/ssh/ssh_configファイルで
# StrictHostKeyChecking ask
を
StrictHostKeyChecking no
に変更します。
変更を反映させるために
sudo systemctl restart ssh
を実行します。設定変更を確認するため、ssh localhostを実行します。
hpc@node01:~$ ssh localhost
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
Last login: Sat Jul 27 10:07:25 2024 from 192.168.11.4
hpc@node01:~$
パスワードなしでログインできましたので、公開鍵認証の動作確認が取れました。
rootでも公開鍵認証を設定する
HPC(高性能計算)クラスターで、Ubuntu 24.04を使用してrootでの公開鍵認証を必要とする理由は次の通りです:
1. セキュリティの強化: ルートアカウントでのパスワード認証は、ブルートフォース攻撃やパスワード盗難によるリスクが高まります。公開鍵認証を使用することで、パスフレーズがない限り、鍵の紛失や盗難があっても第三者が容易にアクセスすることは困難になります。
2. 自動化: HPCクラスターでは、ジョブのスケジューリングやノードの管理など、多くのタスクが自動化されることが一般的です。公開鍵認証を使用することで、スクリプトや自動化ツールがルート権限を必要とする操作を安全に実行できるようになります。
3. アクセス制御: 公開鍵認証を使用することで、特定のマシンやユーザーに対するアクセス制御がより厳密に行えます。特定の公開鍵を持つユーザーのみがルートアクセスできるように設定することが可能です。
4. 管理の一元化: クラスター全体のルートアクセス管理を中央集権化することで、セキュリティポリシーの一貫性を保ち、管理が簡素化されます。公開鍵認証を使用すると、クラスター全体のルートキーの一元管理が容易になります。
5. ログインの迅速化: パスワードを入力する必要がないため、公開鍵認証によりログインが迅速に行えるようになります。これにより、管理者や自動化スクリプトの作業効率が向上します。
6. セッションのセキュアな確立: 公開鍵認証により、セッションが確立される際にデータが暗号化されるため、セキュアな接続が保証されます。これにより、ネットワーク経由の通信が盗聴されるリスクが減少します。
これらの理由から、HPCクラスターでのrootアカウントの管理には公開鍵認証が推奨されます。これにより、セキュリティを強化し、効率的な管理と自動化を実現することができます。
rootでの公開鍵認証の設定
sudo -iでrootになり、ssh-keygen -t rsaで鍵ファイルを作成します。/root/.ssh/id_rsa.pubを/root/.ssh/authorized_keyにコピーし、属性をオーナーのみのrwに設定します。
sudo -i
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub >>/root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
/etc/ssh/sshd_configファイルを編集します。以下の行を見つけて変更または追加します。
PermitRootLogin yes
PubkeyAuthentication yes
設定を反映させるためにSSHサービスを再起動します。
systemctl restart ssh
rootのままssh localhostを実行してログインできるか確認します。
root@node01:~# ssh localhost
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@node01:~#
rootでのsshも公開鍵認証を使ってパスワード無しでログインできることが確認できました。これで他ノードのシステム設定などを容易に行うことができます。
Ethernetデバイス名をeth0, eth1...に変更する
デフォルトでは
hpc@node01:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 84:47:09:2d:bd:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.3/24 metric 100 brd 192.168.11.255 scope global dynamic enp2s0
valid_lft 151227sec preferred_lft 151227sec
inet6 2400:2410:25c1:400:8647:9ff:fe2d:bd14/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86376sec preferred_lft 14376sec
inet6 fe80::8647:9ff:fe2d:bd14/64 scope link
valid_lft forever preferred_lft forever
3: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 84:47:09:2d:bd:16 brd ff:ff:ff:ff:ff:ff
4: wlp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 90:e8:68:c1:fc:29 brd ff:ff:ff:ff:ff:ff
の様に、enp2s0、enp3s0となっているEthernetデバイス名を、eth0, eth1となる様に変更します。
1. ネットワーク名予測法の無効化:
/etc/default/grubファイル中の、下記の行を見つけ
GRUB_CMDLINE_LINUX=""
を以下の様に変更します。
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
変更を保存して、grubの設定を更新します。
sudo update-grub
2. ネットワーク設定の変更:
元からあった/etc/netplan/50-cloud-init.yamlを名称変更します。
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak
次に、ネットワークインターフェースの設定ファイルを更新します。eth0をクラスタ内部通信用の192.168.10.1/24に、eth1をdhcpにするためには、/etc/netplan/01-netcfg.yamlファイルに
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.10.1/24
dhcp4: no
eth1:
dhcp4: yes
を書き込みます。
3. 設定の適用:
変更を保存して、grubの変更とnetplanの設定を適用するためリブートします。
sudo reboot
これで、eth0は静的IPアドレス192.168.10.1/24を持ち、eth1はDHCPでIPアドレスを取得するように設定されます。
hpc@node01:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:5f:67:c1:72:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 20:7b:d2:25:a9:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.9/24 metric 100 brd 192.168.11.255 scope global dynamic eth1
valid_lft 172782sec preferred_lft 172782sec
4: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ac:82:47:4a:4f:66 brd ff:ff:ff:ff:ff:ff
altname wlp3s0
hpc@node01:~$
インストールされているパッケージを最新にする
基本設定の最後に、現在インストールされているパッケージを最新にしておきます。
sudo apt update
sudo apt upgrade -y
カーネルがアップグレードされるとリブートが必要になりますのでリブートします。
HPC Clusterに必要なパッケージをインストールする
node01の立ち上げ後、必要なパッケージをインストールしていきます。全ノード共通で必要なパッケージは、nfs-kernel-server、nis、autofs、そしてslurm-wlmです。これに加えて、Intel oneAPIのパッケージも必要ですが、これはnode01のみにインストールし、他のノードではNFSを通じて共有します。そのため、ここではIntel oneAPIのインストールは行いません。もちろん、Intel oneAPIを全ノードにインストールすることも可能ですが、将来的なアップデートの際に全ノードで更新作業が必要になり、大容量のため時間と手間がかかることを避けるために、node01にのみインストールし、NFSを利用して共有する方法を選びます。
sudo apt install nfs-kernel-server nis autofs slurm-wlm -y
不要なサービスを停止する
systen_clonerで他のノードにコピーするためのUSBメモリを作成する前に、HPC Clusterで不要なサービスを停止しておきます。現在実行中のサービスのリストはsystemctl list-units --type=service --state=runningで見ることができます。
hpc@node01:~$ systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
autofs.service loaded active running Automounts filesystems on demand
bolt.service loaded active running Thunderbolt system service
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
fsidd.service loaded active running NFS FSID Daemon
fwupd.service loaded active running Firmware update daemon
getty@tty1.service loaded active running Getty on tty1
ModemManager.service loaded active running Modem Manager
multipathd.service loaded active running Device-Mapper Multipath Device Controller
munge.service loaded active running MUNGE authentication service
nfs-blkmap.service loaded active running pNFS block layout mapping daemon
nfs-idmapd.service loaded active running NFSv4 ID-name mapping service
nfs-mountd.service loaded active running NFS Mount Daemon
nfsdcld.service loaded active running NFSv4 Client Tracking Daemon
nscd.service loaded active running Name Service Cache Daemon
polkit.service loaded active running Authorization Manager
rpc-statd.service loaded active running NFS status monitor for NFSv2/3 locking.
rpcbind.service loaded active running RPC bind portmap service
rsyslog.service loaded active running System Logging Service
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-networkd.service loaded active running Network Configuration
systemd-resolved.service loaded active running Network Name Resolution
systemd-timesyncd.service loaded active running Network Time Synchronization
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
thermald.service loaded active running Thermal Daemon Service
udisks2.service loaded active running Disk Manager
unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
upower.service loaded active running Daemon for power management
user@1000.service loaded active running User Manager for UID 1000
wpa_supplicant.service loaded active running WPA supplicant
Legend: LOAD → Reflects whether the unit definition was properly loaded.
ACTIVE → The high-level unit activation state, i.e. generalization of SUB.
SUB → The low-level unit activation state, values depend on unit type.
32 loaded units listed.
hpc@node01:~$
この中でHPC Clusterに不要なサービスは
1. ModemManager.service
•モデム管理サービス。HPC クラスターには通常不要です。
2. packagekit.service
•パッケージ管理サービス。自動更新を行うためのもので、手動で管理している場合は不要です。
3. polkit.service
•権限管理サービス。HPC クラスターでは、特に必要でない場合は無効にできます。
4. thermald.service
•熱管理デーモン。特定のハードウェアや環境でのみ必要です。
5. udisks2.service
•ディスク管理サービス。HPC クラスターでは手動でディスクを管理することが多いため不要です。
6. upower.service
•電源管理デーモン。デスクトップ環境向けで、HPC クラスターでは通常不要です。
7. wpa_supplicant.service
•無線ネットワークのサポート。HPC クラスターが有線ネットワークのみを使用している場合は不要です。
不要なサービスを停止してリブートしても起動しない様にするには
sudo systemctl stop ModemManager.service
sudo systemctl disable ModemManager.service
sudo systemctl stop packagekit.service
sudo systemctl disable packagekit.service
sudo systemctl stop polkit.service
sudo systemctl disable polkit.service
sudo systemctl stop thermald.service
sudo systemctl disable thermald.service
sudo systemctl stop udisks2.service
sudo systemctl disable udisks2.service
sudo systemctl stop upower.service
sudo systemctl disable upower.service
sudo systemctl stop wpa_supplicant.service
sudo systemctl disable wpa_supplicant.service
を実行します。その結果
hpc@node01:~$ systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
autofs.service loaded active running Automounts filesystems on demand
bolt.service loaded active running Thunderbolt system service
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
fsidd.service loaded active running NFS FSID Daemon
fwupd.service loaded active running Firmware update daemon
getty@tty1.service loaded active running Getty on tty1
multipathd.service loaded active running Device-Mapper Multipath Device Controller
munge.service loaded active running MUNGE authentication service
nfs-blkmap.service loaded active running pNFS block layout mapping daemon
nfs-idmapd.service loaded active running NFSv4 ID-name mapping service
nfs-mountd.service loaded active running NFS Mount Daemon
nfsdcld.service loaded active running NFSv4 Client Tracking Daemon
nscd.service loaded active running Name Service Cache Daemon
packagekit.service loaded active running PackageKit Daemon
polkit.service loaded active running Authorization Manager
rpc-statd.service loaded active running NFS status monitor for NFSv2/3 locking.
rpcbind.service loaded active running RPC bind portmap service
rsyslog.service loaded active running System Logging Service
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running User Login Management
systemd-networkd.service loaded active running Network Configuration
systemd-resolved.service loaded active running Network Name Resolution
systemd-timesyncd.service loaded active running Network Time Synchronization
systemd-udevd.service loaded active running Rule-based Manager for Device Events and Files
unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
user@1000.service loaded active running User Manager for UID 1000
Legend: LOAD → Reflects whether the unit definition was properly loaded.
ACTIVE → The high-level unit activation state, i.e. generalization of SUB.
SUB → The low-level unit activation state, values depend on unit type.
28 loaded units listed.
hpc@node01:~$
となります。
System Clonerのインストール
System Clonerはこの記事のような各種のCluster構築や、お客様からご注文いただいたHPCサーバやGPUサーバなどにOSと必要なパッケージをインストーする作業を短時間で容易に行うことを目的として、私が約25年前に開発し、OSの進化と多様化に伴い、System Clonerも進化してきました。その特徴は、OSが専有している領域しかコピーしないので、短時間でクローンが終わり、かつシステムディスクより小容量のUSBメモリなどでも(OSが専有している容量より大きければ)クローンが可能です。操作は簡単でクローン先のデバイスを識別できる1文字を入力するだけです。今回の26台のクラスタの全ノードにクローンする作業も、短時間で誤りなく行うことができました。RedHat系OS用とDebian系OS用の2種類があります。今回はUbuntu 24.04ですのでDebian系用のSystem Clonerをインストールします。System Clonerはbinary executable fileです。clone2sdがSATA HDD/SSD (USBメモリもSATA SSDとして認識される)用、clone2nvmeがNVMe SSD (M.2, U.2など)用です。/usr/local/sbinにインストールします。rootでしか実行できません。
hpc@node01:~$ which clone2sd
hpc@node01:~$ sudo which clone2sd
/usr/local/sbin/clone2sd
hpc@node01:~$ which clone2nvme
hpc@node01:~$ sudo which clone2nvme
/usr/local/sbin/clone2nvme
hpc@node01:~$
node02~node04へのnode01のクローンのやり方
System Clonerでnode01のOSをUSBメモリにクローンして、そのUSBメモリでnode02を立ち上げnode02のSSD/HDDにUSBメモリをクローンします。その際、IPアドレスとhostnameをnode02様に変更する必要があります。System Clonerでのクローンが終わってからエディタで修正する方法もありますが、自動的に行う方が便利で間違いを防げます。
change_node_and_ip_after_cloneというラッパーを作り、
change_node_and_ip_after_clone clone2sd a 2
の様に使うことにします。USBメモリから立ち上げてUSBメモリの内容をノードのSSD/HDDである/dev/sdaにクローンした後、hostnameをnode02にIPアドレスを192.168.10.2に変更するコマンドです。その内容は
#!/bin/bash
if [ "$#" -lt 3 ]; then
echo "Usage: $0 <command> <command_params> <new_number>"
exit 1
fi
COMMAND=$1
shift
COMMAND_PARAMS=$1
shift
NEW_NUMBER=$(printf "%02d" $1)
# Execute the provided command with its parameters
$COMMAND $COMMAND_PARAMS
# Update /mnt/etc/hostname
sudo sed -i "s/node[0-9]\+/node${NEW_NUMBER}/" /mnt/etc/hostname
# Update /mnt/etc/netplan/01-netcfg.yaml
sudo sed -i "s/192.168.10.[0-9]\+/192.168.10.${NEW_NUMBER}/" /mnt/etc/netplan/01-netcfg.yaml
# Remove eth1 from /mnt/etc/netplan/01-netcfg.yaml
sudo sed -i '/eth1:/,/dhcp4: yes/d' /mnt/etc/netplan/01-netcfg.yaml
echo "Executed '$COMMAND $COMMAND_PARAMS', updated /mnt/etc/hostname and /mnt/etc/netplan/01-netcfg.yaml with node${NEW_NUMBER}, 192.168.10.${NEW_NUMBER}, and removed eth1"
の様になります。このコマンドも/usr/local/sbinに入れておきます。
node01のOSの内容をUSBメモリにクローンしてBaseUSBを作る
OSがインストールされているのは/dev/nvme0n1になります。
hpc@node01:~$ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 3.2G 2.0M 3.2G 1% /run efivarfs 192K 59K 129K 32% /sys/firmware/efi/efivars /dev/nvme0n1p2 938G 6.8G 884G 1% / tmpfs 16G 0 16G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/nvme0n1p1 300M 6.2M 294M 3% /boot/efi tmpfs 3.2G 12K 3.2G 1% /run/user/1000 hpc@node01:~$
使用している容量は/が6.8G, /boot/efiが6.2Mですので、クローンするUSBメモリの容量は8GB以上あれば十分です。
USBメモリをnode01に差込、デバイス名を確認します。
sudo fdisk -l /dev/sd*
実行してみると
hpc@node01:~$ sudo fdisk -l /dev/sd*
Disk /dev/sda: 115.63 GiB, 124160966656 bytes, 242501888 sectors
Disk model: USB DISK 3.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 24A6C1ED-A5CB-4CA7-9C91-E6CF299881DA
Device Start End Sectors Size Type
/dev/sda1 2048 616447 614400 300M EFI System
/dev/sda2 616448 242501854 241885407 115.3G Linux filesystem
Disk /dev/sda1: 300 MiB, 314572800 bytes, 614400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Disk /dev/sda2: 115.34 GiB, 123845328384 bytes, 241885407 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
hpc@node01:~$
となり/dev/sdaがUSBメモリと分かります。
このUSBにOSをクローンするコマンドは
sudo clone2sd a
になります。実際に実行して時間を測ってみると
hpc@node01:~$ sudo time clone2sd a
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Creating new GPT entries in memory.
The operation has completed successfully.
The operation has completed successfully.
mkfs.fat 4.2 (2021-01-31)
mke2fs 1.47.0 (5-Feb-2023)
/dev/sda2 contains a ext4 file system
last mounted on / on Tue Jul 16 10:52:17 2024
Proceed anyway? (y,N) y
Creating filesystem with 30235675 4k blocks and 7561216 inodes
Filesystem UUID: 3978af07-6ed3-441b-900d-43107ca16f3b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
rsync -a --exclude=/snap/* --exclude=/tmp/* --exclude=/run/* --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/mnt/* / /mnt
117
117
559
559
modprobe: FATAL: Module efivars not found in directory /lib/modules/6.8.0-39-generic
chroot /mnt grub-install /dev/sda
Installing for x86_64-efi platform.
grub-install: warning: EFI variables cannot be set on this system.
grub-install: warning: You will have to complete the GRUB setup manually.
Installation finished. No error reported.
chroot /mnt update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0-39-generic
chroot /mnt update-grub
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.0-39-generic
Found initrd image: /boot/initrd.img-6.8.0-39-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
6.81user 17.19system 2:11.41elapsed 18%CPU (0avgtext+0avgdata 30080maxresident)k
83061inputs+14417648outputs (1major+693182minor)pagefaults 0swaps
hpc@node01:~$
と2分11秒でクローンが終わりました。出来上がったUSBメモリを以降はBase USBと呼びます。
BaseUSBの取り出し
sudo umount_clone
を実行してから取り出してください。
BaseUSBからnode02のシステムディスクにクローンする
node02にBaseUSBを差し込み、BIOSでUSBメモリからブートする様に設定して、ブートします。ブートしたら、システムディスクのデバイス名をdf -hなどで確認します。
root@node01:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 777M 1.4M 775M 1% /run
efivarfs 128K 95K 29K 77% /sys/firmware/efi/efivars
/dev/sdb2 113G 6.8G 101G 7% /
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sdb1 300M 6.2M 294M 3% /boot/efi
tmpfs 777M 12K 777M 1% /run/user/1000
tmpfs 777M 12K 777M 1% /run/user/0
root@node01:~#
上記からシステムディスクは/dev/sdbであることがわかります。/dev/sdbがあれば/dev/sdaもありますので、node02では/dev/sdaが内蔵SSD/HDDになります。そこでBaseUSBを/dev/sdaにクローンして、hostnameをnode02に変更し、IPアドレスを192.168.10.2に変更します。このためのコマンドは"change_node_and_ip_after_clone clone2sd a 2"になります。これを実行して時間を計測してみましょう。
3分50秒でクローンが終わりました。node02~node04はamazonで¥15,0000で購入した非力なPCなのでSSDの速度が遅く時間がかかった様です。
リブートして内蔵SSD/HDDから立ち上げ、node01からsshでログインしてみましょう。node01の/etc/hostsは
127.0.0.1 localhost 192.168.10.1 node01 192.168.10.2 node02 192.168.10.3 node03 192.168.10.4 node04の
の内容です。
hpc@node01:~$ ssh node02 Last login: Sun Jul 28 16:37:43 2024 from 192.168.10.1 hpc@node02:~$ exit logout Connection to node02 closed. hpc@node01:~$ sudo -i root@node01:~# ssh node02 Last login: Sun Jul 28 15:58:21 2024 from 192.168.10.1 root@node02:~#
node01からnode02にユーザ:hpc, root共にログインできることが確認できました。node03, node04でも同様にクローンを繰り返します。
全ノードの動作確認(BaseUSB)
クローンが終了後各ノードをリブートし、以降はnode01でrootで作業をします。各ノードが正しく設定されているか確認しましょう。
root@node01:~# for node in `seq -f "node%02g" 1 4`;do ssh $node 'hostname;ip address|grep inet';done node01 inet 127.0.0.1/8 scope host lo inet 192.168.10.1/24 brd 192.168.10.255 scope global eth0 inet 192.168.11.9/24 metric 100 brd 192.168.11.255 scope global dynamic eth1 node02 inet 127.0.0.1/8 scope host lo inet 192.168.10.2/24 brd 192.168.10.255 scope global eth0 node03 inet 127.0.0.1/8 scope host lo inet 192.168.10.3/24 brd 192.168.10.255 scope global eth0 node04 inet 127.0.0.1/8 scope host lo inet 192.168.10.4/24 brd 192.168.10.255 scope global eth0 root@node01:~#
node01~node04のhostnameとIPアドレスが正しく設定されていることが確認できました。
IPマスカレード
HPC(High-Performance Computing)クラスタでのIPマスカレードの必要性は、主にネットワークのセキュリティと管理のために役立ちます。以下に、HPCクラスタでIPマスカレードが必要となる主な理由を説明します。
1. プライベートIPアドレスの保護
HPCクラスタ内のノードは、通常プライベートIPアドレスを使用します。これにより、外部ネットワークからの直接アクセスを防ぎ、セキュリティを高めることができます。IPマスカレードを使用すると、プライベートIPアドレスを持つノードが外部ネットワークと通信するときに、クラスタのゲートウェイのパブリックIPアドレスに変換されるため、内部のアドレスを隠すことができます。
2. ネットワーク管理の簡略化
複数のノードがインターネットにアクセスする必要がある場合、各ノードに対して個別のパブリックIPアドレスを割り当てるのは非効率です。IPマスカレードを使用することで、クラスタ全体が1つのパブリックIPアドレスを共有して外部ネットワークと通信することができ、ネットワーク管理が簡単になります。
3. セキュリティの強化
IPマスカレードにより、外部から内部ネットワークへの直接アクセスを制限することができます。これにより、外部からの攻撃に対する防御が強化されます。クラスタのノードは外部に対して一つのパブリックIPアドレスを使うため、外部の攻撃者が特定のノードを標的にするのが難しくなります。
4. ネットワークアドレスの有効利用
多くのプライベートIPアドレスを使用することで、限られたパブリックIPアドレス空間を効率的に利用できます。IPマスカレードを使用すると、一つのパブリックIPアドレスで多数のプライベートIPアドレスを持つデバイスがインターネットにアクセスできるようになります。
5. トラフィック制御
IPマスカレードを使用することで、クラスタのゲートウェイを通じてすべての外部トラフィックを制御できます。これにより、トラフィックの監視や制限、フィルタリングを行いやすくなります。例えば、特定のノードからのトラフィックを優先したり、特定のプロトコルをブロックすることができます。
まとめ
HPCクラスタでIPマスカレードを使用することは、セキュリティ、管理の簡便性、ネットワーク資源の効率的な利用に大きく貢献します。これにより、クラスタ全体のパフォーマンスとセキュリティが向上し、安定した運用が可能になります。
node01でeth1をインターネット接続用、eth0をクラスタ内部用としてIPマスカレードを設定するには
1. 必要なパッケージのインストール
まず、必要なパッケージをインストールします。
sudo apt update
sudo apt install iptables-persistent
2. IPマスカレードの設定
iptablesを使用してIPマスカレードを設定します。
iptables設定スクリプトの作成
まず、iptablesの設定を行うスクリプトを作成します。/etc/iptables/rules.v4に次の内容を書き込みます。
*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o eth1 -j MASQUERADE COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -i eth0 -o eth1 -j ACCEPT -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT
3. sysctl.confの設定
カーネルのIPフォワーディングを有効にするために、/etc/sysctl.confを編集します。
次の行を見つけてコメントを外します(または存在しない場合は追加します)。
net.ipv4.ip_forward=1
設定を有効にするために、次のコマンドを実行します。
sudo sysctl -p
node02~node04でnode01のIPマスカレードを利用するには
node02~node04でデフォルトゲートウェイをnode01のIPアドレス192.168.10.1に設定します。これだけだと名前解決ができないので、DNSも設定します。大学などのDNSがある組織ではDNSのIPアドレスは組織のものに設定します。自前のDNSがない場合は、8.8.8.8, 8.8.4.4などのgoogleのDNSのIPアドレスを設定すればいいでしょう。ここでは後者の方法を使います。
1. 現在の設定内容の確認
まず、現在の/etc/netplan/01-netcfg.yamlの内容を確認します。
root@node01:~# ssh node02 cat /etc/netplan/01-netcfg.yaml network: version: 2 ethernets: eth0: addresses: - 192.168.10.2/24 dhcp4: no root@node01:~#
2. ファイルを編集してデフォルトゲートウェイとDNSを追加
次に、デフォルトゲートウェイとDNSサーバーを追加するためにファイルを編集します。SSH経由でsedコマンドを使用して編集することもできますが、ここでは直接echoコマンドを使用して内容を一括して置き換える方法を紹介します。
ssh root@node02 "echo 'network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.10.2/24
dhcp4: no
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
routes:
- to: default
via: 192.168.10.1' > /etc/netplan/01-netcfg.yaml"
結果を確認すると
root@node01:~# ssh node02 cat /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.10.2/24
dhcp4: no
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
routes:
- to: default
via: 192.168.10.1
root@node01:~#
となり無事書き換えが終わりました。
3. 設定の適用
ファイルを編集した後、netplan applyコマンドを実行して設定を適用します。
ssh node02 netplan apply
4. 動作確認
apt updateとtimedatectlで外部サーバーとの接続を確認します。
root@node01:~# ssh node02 apt update WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Hit:2 http://jp.archive.ubuntu.com/ubuntu noble InRelease Get:3 http://jp.archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] Get:4 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [256 kB] Hit:5 http://jp.archive.ubuntu.com/ubuntu noble-backports InRelease Get:6 http://jp.archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [300 kB] Get:7 http://security.ubuntu.com/ubuntu noble-security/main Translation-en [60.5 kB] Get:8 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [208 kB] Get:9 http://security.ubuntu.com/ubuntu noble-security/restricted Translation-en [40.7 kB] Get:10 http://jp.archive.ubuntu.com/ubuntu noble-updates/main Translation-en [77.2 kB] Get:11 http://jp.archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [208 kB] Get:12 http://jp.archive.ubuntu.com/ubuntu noble-updates/restricted Translation-en [40.7 kB] Fetched 1,443 kB in 2s (701 kB/s) Reading package lists... Building dependency tree... Reading state information... All packages are up to date. root@node01:~# ssh node02 timedatectl Local time: Tue 2024-07-30 11:09:30 JST Universal time: Tue 2024-07-30 02:09:30 UTC RTC time: Tue 2024-07-30 02:09:30 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no root@node01:~#
問題なく接続できていることがわかります。
node02~node04(ノード数可変)にデフォルトゲートウェイとDNSを設定するスクリプト
node02で行った手順をnode03とnode04でも繰り返します。node数が少ないと手動での設定も可能ですが、node数が10を超えると、時間と労力が増え、間違いの可能性も増えます。自動的に行うスクリプトが必須となります。
以下のscriptを/usr/local/sbin/set_gw_and_dnsに書き込みchmod 700 /usr/local/sbin/set_gw_and_dnsを行います。
#!/bin/bash # ノードのスタートとエンド START=2 END=4 # ノードプレフィックス NODE_PREFIX="node" # 基本のIPアドレス部分(プレフィックス) IP_PREFIX="192.168.10." # ノードの設定を変更 for i in `seq $START $END`; do NODE=$(printf "${NODE_PREFIX}%02d" $i) IP="${IP_PREFIX}${i}" echo Processing $NODE ssh root@$NODE "echo 'network: version: 2 ethernets: eth0: addresses: - ${IP}/24 dhcp4: no nameservers: addresses: - 8.8.8.8 - 8.8.4.4 routes: - to: default via: 192.168.10.1' > /etc/netplan/01-netcfg.yaml && netplan apply" done
このスクリプトを使うと
node02~node04までのデフォルトゲートウェイとDNSを自動的に変更し設定を適用します。scriptの最初のSTARTとENDを書き換えれば、何ノードでも一気に変更可能です。
ヘッドノードを除く全ノードでsshでコマンド実行するclsshと、ヘッドノードから他の全ノードにファイルをコピーするclscpを用意する
以降の作業で、ヘッドノードを除く全ノードでsshでコマンド実行することと、ヘッドノードから他の全ノードにファイルをコピーすることが頻発しますので、clsshとclscpコマンドを作っておきます。
/usr/local/sbin/clsshは
#!/bin/bash # 対象ノードの最初と最後を設定 START=2 END=4 # ノードプレフィックスを設定 NODE_PREFIX=node for node in `seq -f "$NODE_PREFIX%02g" $START $END`;do echo ssh $node $* ssh $node $* done
/usr/local/sbin/clscpは
#!/bin/bash # 対象ノードの最初と最後を設定 START=2 END=4 # ノードプレフィックスを設定 NODE_PREFIX=node # 変数の初期化 all_params=("$@") last_param="${all_params[-1]}" other_params=("${all_params[@]:0:${#all_params[@]}-1}") param_count=$# for node in `seq -f "$NODE_PREFIX%02g" $START $END`;do if [ $param_count -eq 1 ]; then echo scp $1 $node:$1 scp $1 $node:$1 else echo scp ${other_params[@]} $node:$last_param scp ${other_params[@]} $node:$last_param fi done
NISの設定
このHPC ClusterではNISを使って全ノードでユーザ情報を共有します。CentOS6.3時代からNISを使ってきましたので、同じやり方でできるものはそのまま使うということで、NISの使用を継続します。
NISのマスターサーバがnode01でスレーブサーバがnode02になります。node03とそれ以降はクライアントになります。
Ubuntu 24.04のHPCクラスターでNIS(Network Information Service)を使用することには、いくつかの利点と欠点があります。
利点
1.集中管理:
•NISを使用すると、ユーザーアカウントやパスワード、ホスト名などの情報を集中管理できます。これにより、管理が簡素化されます。
2.一貫性:
•全てのノードで同じユーザー情報を使用するため、ユーザーがどのノードにログインしても同じ環境が提供されます。
3. スケーラビリティ:
•NISは複数のノードにまたがる大規模なクラスターでも効率的に動作します。
4. 容易なセットアップ:
•NISの設定は比較的簡単であり、既存のネットワーク環境に容易に導入できます。
欠点
1. セキュリティ:
•NISはセキュリティ面での脆弱性があります。パスワード情報が暗号化されていない形でネットワークを流れるため、盗聴されるリスクがあります。しかし、パスワードを使用しないのでこの問題は解消されます。
2.信頼性:
•NISサーバがダウンすると、全てのNISクライアントが影響を受け、ユーザー認証が行えなくなります。このクラスタではスレーブサーバを用意して、サーバダウンのリスクを分散します。
3. スケーラビリティの限界:
•非常に大規模なクラスターや、複雑なネットワーク構成ではNISの性能が問題になることがあります。
4. 新しい技術との互換性:
•NISは古い技術であり、LDAPやKerberosなどのより新しいディレクトリサービスに比べて機能が限定されています。
node01でNISのマスターサーバを設定する
NISのパッケージは全ノードですでにインストール済みですので設定のみを行います。
1. NISドメインネームの設定
/etc/defaultdomainにNISの任意のdomain nameを書き込みます。ここではhpcdiyとします。
sudo echo hpcdiy >/etc/defaultdomain
2. /etc/yp.confと/etc/nsswitch.confを編集
/etc/yp.conf
# # yp.conf Configuration file for the ypbind process. You can define # NIS servers manually here if they can't be found by # broadcasting on the local net (which is the default). # # See the manual page of ypbind for the syntax of this file. # # IMPORTANT: For the "ypserver", use IP addresses, or make sure that # the host is in /etc/hosts. This file is only interpreted # once, and if DNS isn't reachable yet the ypserver cannot # be resolved and ypbind won't ever bind to the server. # ypserver ypserver.network.com ypserver node01 ypserver node02
/etc/nsswitch.conf
# /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. passwd: files systemd nis group: files systemd nis shadow: files systemd nis gshadow: files systemd hosts: files dns nis networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
3. /etc/ypserv.securenetを編集して192.168.10.0/24からのアクセスのみ許可
# # securenets This file defines the access rights to your NIS server # for NIS clients. This file contains netmask/network # pairs. A clients IP address needs to match with at least # one of those. # # One can use the word "host" instead of a netmask of # 255.255.255.255. Only IP addresses are allowed in this # file, not hostnames. # # Always allow access for localhost, IPv4 and IPv6 255.0.0.0 127.0.0.0 host ::1 # This lines gives access to everybody. PLEASE ADJUST! # allow connections from local network 192.168.10.0/24 255.255.255.0 192.168.10.0
4. NIS Master Serverに必要な、ypserv, ypxfrd, yppasswdd, NIS Clientに必要なypbindをenableとrestart
sudo systemctl enable ypserv ypxfrd yppasswdd ypbind
sudo systemctl restart ypserv ypxfrd yppasswdd ypbind
5. ypinit -mを行いNISデータベースを作成
hpc@node01:~$ sudo /usr/lib/yp/ypinit -m [sudo] password for hpc: At this point, we have to construct a list of the hosts which will run NIS servers. node01 is in the list of NIS server hosts. Please continue to add the names for the other hosts, one per line. When you are done with the list, type a . next host to add: node01 next host to add: node02 next host to add: The current list of NIS servers looks like this: node01 node02 Is this correct? [y/n: y] y We need a few minutes to build the databases... Building /var/yp/hpcdiy/ypservers... Running /var/yp/Makefile... gmake[1]: Entering directory '/var/yp/hpcdiy' Updating passwd.byname... Updating passwd.byuid... Updating group.byname... Updating group.bygid... Updating hosts.byname... Updating hosts.byaddr... Updating rpc.byname... Updating rpc.bynumber... Updating services.byname... Updating services.byservicename... Updating netid.byname... Updating protocols.bynumber... Updating protocols.byname... Updating netgroup... Updating netgroup.byhost... Updating netgroup.byuser... Updating shadow.byname... gmake[1]: Leaving directory '/var/yp/hpcdiy' node01 has been set up as a NIS master server. Now you can run ypinit -s node01 on all slave server. hpc@node01:~$
6. 動作確認
ypcat passwdで動作確認
hpc@node01:~$ ypcat passwd hpc:x:1000:1000:hpc:/home/hpc:/bin/bash slurm:x:64030:64030::/nonexistent:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin hpc@node01:~$
と問題なく動作しています。
node02以降をNISのClientにする
1. NIS Clientに必要なファイル/etc/defaultdomain, /etc/yp.conf, /etc/nsswitch.confをclscpで配信する
clscp /etc/defaultdomain /etc/yp.conf /etc/nsswitch.conf /etc
2. NIS Clientに必要なサービスypbindをclsshでenableにしてrestartする
clssh 'systemctl enable ypbind;systemctl restart ypbind'
3. clssh ypcat passwdを実行して動作確認する
root@node01:~# clssh ypcat passwd
ssh node02 ypcat passwd
hpc:x:1000:1000:hpc:/home/hpc:/bin/bash
slurm:x:64030:64030::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ssh node03 ypcat passwd
hpc:x:1000:1000:hpc:/home/hpc:/bin/bash
slurm:x:64030:64030::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ssh node04 ypcat passwd
hpc:x:1000:1000:hpc:/home/hpc:/bin/bash
slurm:x:64030:64030::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
root@node01:~#
全ノードでNISが動作している確認ができました。
以下作成中