It has been 530 days since the last update, the content of the article may be outdated.

node2的系统崩溃了,需要安装新系统,决定更换成ubuntu,但是替换后的兼容稳定性,运算效率等都是未知数,并且我没有配置集群的经验。这次使用node02实践一下,争取可以形成生产力

配置和选型

  • 集群系统: node00, node01, node03, node04 CentOS release 6.7 (Final)
  • node02 新系统:ubuntu 20.04 LTS (待加入集群)
  • 权限:超级用户
  • 集群主节点node00: 共享主目录,磁盘挂载节点
  • 登录节点node01: 登录节点,NIS通信服务器
  • SSD Samsung 870 EVO SATA 2.5 1TB

系统安装和配置

这里准备了官网下载的ubuntu 20.04 LTS桌面版,使用rufus-3.18.1877制作U盘启动:<点击查看大图>

插入node02,开机,按DEL进入启动选项-> boot ->U盘启动。
安装系统,选择新系统安装,覆盖掉原来的引导选项,分区大小如下

plaintext
100G  /
100G [SWAP]
4G /boot
剩下700+G /home

这些信息回被写入/etc/fstab,你也可以使用lsblk命令查看磁盘的分区。

系统初始化登录时填写机器名为node02,这个操作实际上是将其写入/etc/hostname,这个别名设置会在后续节点通讯的别名设置中用到。
初始的高级权限用户可以是lirui,并设置密码;进入系统以后,为root账户设置密码,创建用户,安装vim

plaintext
lirui@node02:~ $ sudo passwd root
<输入新密码>
<重复输入新密码>
密码已更新

<切换root用户>
lirui@node02:~ $ su root
<输入密码>
root@node02:/home/lirui #

<创建用户`hjh`,本次不需要大量新建用户,这里仅创建我的账户用来做管理,权限是一般权限>
root@node02:/home/lirui # useradd -u 516 hjh -c 'jiheng hu' -m -s /bin/bash <UID最好和其他节点的id一致>
root@node02:/home/lirui # groupmod -g 516 hjh
root@node02:/home/lirui # cat /etc/passwd
······
hjh:x:516:1001:jiheng hu:/home/hjh:/bin/bash
······

<安装`vim`>
root@node02:/ # apt update
root@node02:/ # apt install vim

网络设置

按照目前的网络架构,一个网卡enp6s0连入校园网,具有公网IP地址;另一个网卡enp7s0链接局域网路由器,其包括node00~node05以及两个磁盘阵列共八台机器组成的局域网。
安装net-tools并查看网络信息:

plaintext
lirui@node02:~/桌面$ sudo apt update
lirui@node02:~/桌面$ sudo apt install net-tools
lirui@node02:~/桌面$ ifconfig
enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 222.146.88.88 netmask 255.255.255.0 broadcast 222.146.88.255
······

enp7s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet <局域网未连接-乱码> netmask <局域网未连接-乱码> broadcast <局域网未连接-乱码>
······

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
······

可以看到,enp6s0已自动获取公网IP 222.146.88.88 <这里为了安全,我虚构了IP>。enp7s0则是无法连接状态。此时,需要配置网络和固定公网IP和局域网IP,直接在桌面上打开网络设置:

  • enp6s0配置
    直接把自动获取的ip地址进行固定即可,更换ip会导致联网失败:
IPv4方式 地址 子网掩码 网关<ip末字段改成254即可> DNS服务器<科大使用的DNS服务器>
手动 222.146.88.88 255.255.255.0 222.146.88.254 202.38.64.56, 202.38.64.17
  • enp7s0配置
    这个网卡连接局域网,按照集群结构,node02节点的局域网ip为192.168.1.102<这个是本节点机器的网络身份,各节点通过在/etc/hosts进行别名定义来使用别名互相访问>:
IPv4方式 地址 子网掩码 网关 DNS服务器
手动 192.168.1.102 255.255.255.0 192.168.1.1 192.168.1.1

这样网络就设置好了,使用ifconfig查看:

plaintext
enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 222.146.88.88 netmask 255.255.255.0 broadcast 222.146.88.255
······

enp7s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.102 netmask 255.255.255.0 broadcast 192.168.1.255
······

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
······

或者,此处的配置也可以在/etc/netplan/01-network-manager-all.yaml中进行修改并使用sudo netplan apply命令生效。

开启远程服务

安装openssh服务:

plaintext
root@node02:/etc# apt install ssh
<远程服务会默认开启,并且开机自启动>
查看ssh服务状态,发现是active的状态:
root@node02:/etc# service ssh status
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-06-17 21:54:34 CST; 13h ago
······
<远程访问记录>
6月 17 22:01:10 node02 sshd[11139]: Accepted password for hjh from 192.168.1.101 port 59088 ssh2
6月 17 22:01:10 node02 sshd[11139]: pam_unix(sshd:session): session opened for user hjh(uid=516) by (uid=0)

root@node02:/etc# service ssh [restart][stop]

可以使用ssh user@ip来访问其他服务器。节点间登录可以使用局域网ip和公网ip,但是外部登录必须使用公网ip:

plaintext
<访问node01>
[hjh@node02] ~ $ssh hjh@192.168.1.101

<通过node01访回>
[hjh@node01] ~ $ssh hjh@192.168.1.102

<通过XSHELL等工具远程登录必须使用公网IP>
Xshell 7 (Build 0122)
[C:\~]$ ssh hjh@222.146.88.88

集群中各节点在局域网中都有自己的ip地址,如192.168.1.101,可以使用ssh命令登录到对应的ip来实现切换。但是节点间每次切换都需要输入ip,较为不方便,所以需要设置别名访问。

节点别名通信

设置别名的原理就是,每个节点都保留一个清单,约定好每台机器的别名和对应的ip地址,做法如下:
每台机器给自己取号名字,放在/etc/hostname中,比如node01node02node05dataserver1,这个不是必须,但是决定了当前节点命令行的显示,如[hjh@node02][rootrui@node02][user@dataserver2] ;
每台机器需要知道其他机器的别名,设置如下的别名列表,并各自保存在/etc/hosts

plaintext
[hjh@node02] ~ $ cat /etc/hosts
192.168.1.100 node00
192.168.1.101 node01
192.168.1.102 node02
192.168.1.103 node03
192.168.1.104 node04
192.168.1.105 node05
192.168.1.201 dataserver1
192.168.1.106 dataserver2

这个方法,你甚至可以将非局域网内的服务器加进去,进行别名访问。
从此,无论是互相登录,文件系统的共享,还是用户信息通讯,都可使用node02这样的别名来代替IP地址

plaintext
<访问node01>
[hjh@node02] ~ $ssh hjh@node01

<通过node01访回>
[hjh@node01] ~ $ssh node02 <省略用户名的写法需要目标服务器有当前用户存在>

文件系统挂载,节点磁盘共享

这一步的目的是在node02上也可以访问替他节点的磁盘,需要设置文件共享系统。
安装nfs-kernel-server服务:

plaintext
$su root
# apt install nfs-kernel-server

作为客户端的文件共享设置

nfs-kernel-server服务也是S/C模式,这里只使用客户端配置,需要挂载来自node00和磁盘阵列的文件系统。
超级权限编辑/etc/fstab,文末追加如下内容

plaintext
### nfs mount infos
dataserver1:/data00 /data00 nfs default 0 0
dataserver2:/home/d1 /data04 nfs default 0 0
node00:/data01 /data01 nfs default 0 0
node00:/data02 /data02 nfs default 0 0
node00:/data03 /data03 nfs default 0 0

这里计划挂载了两个磁盘阵列和三个来自node00的磁盘。
创建挂载点sudo mkdir /data00 /data01 /data02 /data03 /data04
使用命令sudo mount -a生效,查看磁盘挂载情况:

plaintext
$df -h
文件系统 大小 已用 可用 已用% 挂载点
/dev/sda3 375G 11G 346G 3% /
/dev/sda1 9.3G 187M 8.7G 3% /boot
node00:/data03 3.6T 3.0T 465G 87% /data03
node00:/data01 11T 9.7T 88G 100% /data01
node00:/data02 3.6T 3.3T 175G 95% /data02
dataserver1:/data00 131T 121T 3.7T 98% /data00
dataserver2:/home/d1 328T 244T 84T 75% /data04

作为服务器的文件共享设置

本实践只涉及到挂载其他节点的共享文件系统,如果需要将本节点的文件系统共享出去,需要做如下设置:
修改exportfs配置文件/etc/exports,这里使用dataserver2节点(磁盘阵列)作为展示:

plaintext
user@user-RS540-E9-RS36-E:~$ cat /etc/exports 
······
/home/d1 192.168.1.1/24(rw,no_root_squash,async,no_subtree_check)

这里的意思是将dataserver2节点挂载在/home/d1下的300TB磁盘阵列共享出去,后面是网关/掩模(权限设置)。
使用sudo exportfs -ra命令执行生效,即可用上述的方法在其他节点挂载这个共享资源。
详细可以参考从零开始挂载磁盘阵列的操作实践。

注意:以下关于NIS的内容已经不再适用,请移步集群节点用户系统同步-NIS处查阅。— 2023-11-18

以下内容可以忽略

NIS用户同步

在完成集群节点间的通信和/home主目录共享以后,发现为在本节点(node02)上注册的用户,无法通过其他节点登录进来,或者无法再本节点切换到该用户下:
报错: su: 用户 qyliu 不存在
这是因为,node02作为分子节点,虽然已经挂载了主节点node00的主目录,但是管理用户信息的如/etc/passwd等配置文件并没有同步,在node00下注册的用户无法登陆node02节点。
这里要使用NIS服务来进行用户信息的共享,使得宿主节点(node00)用户即使不存在子节点(如node02)的/etc/passwd文件信息上,也可以登录进来。
NIS是使用S/C模式实现,也就是宿主和客户端模式:
NIS服务的应用结构分为NIS服务端和NIS客户端两种角色,NIS服务端集中维护用户的帐号信息(数据库)供NIS客户机进行查询,用户登录任何一台NIS客户端设备都会从NIS服务端进行登录认证,可实现用户帐号的集中管理。

在本案例中,node00做我NIS服务器,node01/node03/node04都已经完成了NIS通信,所以仅对新加入的node02进行NIS客户端安装和配置,也就是客户端的配置。
别问我怎么知道大师兄怎么配置的,不听的百度+去老系统里面翻配置文件,才确定了他10年前的做法。

  1. node02联科大校园网:

    bash
    hjh@node02 /etc$ wget --post-data="name=user&password=passwd&cmd=set&type=1&exp=0" http://wlt.ustc.edu.cn/cgi-bin/ip -O -
  2. 安装NIS相关服务:

    bash
    hjh@node02 /etc$ su root
    root@node02 /etc# apt install nis

    会弹出图形界面,此处作为客户端需要填写server的domian为 lirui,这个操作是新建/etc/defaultdomian并写入lirui。
    如果没有图形界面弹出,则手动添加:

    plaintext
    #echo lirui>/etc/defaultdomain

    /etc/yp.conf 中追加:domain lirui server node01:

    plaintext
    #echo domain lirui server node01>>/etc/yp.conf

修改/etc/default/nis,做如下修改:

plaintext
# Are we a NIS server and if so what kind (values: false, slave, master)?
NISSERVER=false
# Are we a NIS client?
NISCLIENT=true

# NIS master server. If this is configured on a slave server then ypinit
# will be run each time NIS is started.
NISMASTER=node01
  1. 做如下修改:
    备份/etc/nsswitch.conf,修改内容如下:
    plaintext
    #passwd:         files systemd
    passwd: files nis
    #group: files systemd
    group: files nis
    #shadow: files
    shadow: files nis
    gshadow: files

    #hosts: files mdns4_minimal [NOTFOUND=return] dns
    hosts: files dns nis

重启ypserv服务:

plaintext
# service ypbind restart

发现qyliu已经可以登录node02了,
如果在node01ssh node02提示 NASTY警告,删除/home/qyliu/.ssh/known_hosts文件中的node02的过期指纹,重新登录会提示保留指纹,ok

主目录共享

登录node02以后会提示找不到/home/qyliu 主目录,因为node02挂载了本地磁盘分区作为/home目录:
df -h 查看挂载信息:

plaintext
/dev/sdb3             1.9G  251M  1.5G   15% /boot
/dev/sdb4 783G 183M 743G 1% /home
dataserver1:/data00 131T 121T 3.7T 98% /data00
dataserver2:/home/d1 328T 242T 86T 74% /data04
node00:/data01 11T 9.7T 88G 100% /data01
node00:/data02 3.6T 3.3T 175G 95% /data02
node00:/data03 3.6T 3.0T 465G 87% /data03

这时需要共享主目录操作,超级权限编辑/etc/fstab

plaintext
······
<注释掉本地/home挂载点>
# /home was on /dev/sdb4 during installation
#UUID=e47e7003-f0ef-49a3-88c0-6f422c8c430a /home ext4 defaults 0 2
······
<挂载共享的文件系统作为/home>
node00:/home /home nfs defaults 0 0

命令行执行sudo mount -a

df -h 发现已经挂载了node00:/home :

plaintext
/dev/sdb3             1.9G  251M  1.5G   15% /boot
node00:/home 74G 29G 42G 41% /home
dataserver1:/data00 131T 121T 3.7T 98% /data00
dataserver2:/home/d1 328T 242T 86T 74% /data04
node00:/data01 11T 9.7T 88G 100% /data01
node00:/data02 3.6T 3.3T 175G 95% /data02
node00:/data03 3.6T 3.0T 465G 87% /data03

登出用户,重新进入node02

plaintext
[qyliu@node01] ~ $ ssh node02
[qyliu@node02] ~ $

发现qyliunode02下面可以直接进入node01的主目录,实际上都是node00:/home的内容,这些节点都会对其同步修改。

至此,已经全部完成了节点的文件挂载、共享和用户信息通信。

生产环境

安装netcdfhdf5-helpersNCL

plaintext
# apt install netcdf-bin
# apt install hdf5-helpers
# apt install ncl-ncarg

以下内容可以忽略

使用的NCL来自于node01 用户主目录下的NCL,直接运行会报错,提示共享出问题,缺少SSL相关依赖libssl.so.10

plaintext
[qyliu@node02] ~ $which ncl
/home/hjh/ncl/bin/ncl

[qyliu@node02] ~ $ncl
ncl: error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory

查看 Linux Ubuntu 20.04LTS 自带 openssl 的版本为 1.1.1f:

plaintext
[qyliu@node02] ~ $openssl 
OpenSSL> version
OpenSSL 1.1.1f 31 Mar 2020

下载安装 libssl-dev即可解决 (最简单推荐此方法,不会对系统本身依赖openssl产生任何影响)

plaintext
root@node02:/home/hjh# apt install libssl-dev

踩坑

  1. 在没有设置好网络的情况下,卸载了本地/home, 远程修改了/etc/netplan/0*.xml网络配置文件,导致网络中断,无法共享远程/home,本地也无法登录桌面
    解决办法是登录界面按ALT+CTRL+F2进如命令行模式,挂载本地的/home,即可登录本地,进一步设好网络。
    教训:一定要先设置好网络再进行各项操作,远程不要修改网络相关设置。

  2. 完成最后一步,在修改libssl.so.10依赖时,系统崩了,之前就各种提示内核转储,这下彻底登不上了,从安装系统开始。
    经验:系统坏了没办法,我也不会修复,找新蓝科的来试图修复,连recovery模式都进不去。我自己重装了系统,避免以后爆雷,我自己安装的系统十分顺畅。