slurm的部署
找学生配了一周多,无果。各种启动失败,直到看到了 这篇文章。他说是配置的版本太多,有点乱。等有空了研究一下。整体配置流程如下:
基本环境以及文档说明 #
集群架构 #
控制结点 192.168.91.141
slurmdb结点:与控制节点共用
计算结点:c1 192.168.91.130,c2 192.168.91.131
准备工作 #
- 修改/etc/hosts文件,使得各个主机可以使用主机名互相访问,在每个主机上都要修改
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.91.141 sms
192.168.91.130 c1
192.168.91.131 c2
-
配置主机到计算结点的信任关系
从sms到c1如下,到c2同理
# 在主机 A 中产生相应的私钥和公钥(id_rsa 和 id_rsa.pub)
ssh-keygen -t rsa
# 在主机 A 中添加自己的私钥
cd .ssh/
ssh-add id_rsa
# 备注: 如果提示 Could not open a connection to your authentication agent,终端做如下操作:
ssh-agent bash
ssh-add id_rsa
# 将主机 A 中的公钥 id_rsa.pub 拷贝到主机 B 的 .ssh目录下
scp id_rsa.pub c1:~/.ssh/
# 备注:如果提示没有文件目录,则再主机B上执行
ssh-keygen -t rsa
# 在主机 A 上远程执行命令,在主机 B 上生成认证文件
ssh c1 'cat .ssh/id_rsa.pub >> .ssh/authorized_keys'
- 设置主机名
hostnamectl set-hostname ${hostname} # 每个主机改主机名,sms,c1,c2
- 安装epel(所有结点)
yum install -y epel-release
yum repolist # 查看有无epel.repo 无则要重新安装
- 关闭防火墙以及selinux(所有节点)
systemctl stop firewalld
systemctl disable firewalld.service
vi /etc/selinux/config
# 修改SELINUX=enforcing为SELINUX=disabled
setenforce 0
配置nfs服务 #
nfs服务用来在客户机上挂载主机上的目录
NFS服务所需软件及主要配置文件: #
安装NFS服务,需要安装两个软件,分别是:
- RPC主程序:rpcbind NFS 其实可以被视为一个 RPC 服务,因为启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! (在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的!)。
- NFS主程序:nfs-utils 就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件。
NFS的相关文件: #
- 主要配置文件:/etc/exports 这是 NFS 的主要配置文件了。该文件是空白的,有的系统可能不存在这个文件,主要手动建立。NFS的配置一般只在这个文件中配置即可。
- NFS 文件系统维护指令:/usr/sbin/exportfs 这个是维护 NFS 分享资源的指令,可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享。
- 分享资源的登录档:/var/lib/nfs/*tab 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。
- 客户端查询服务器分享资源的指令:/usr/sbin/showmount 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。showmount 可以用来察看 NFS 分享出来的目录资源。
服务端安装NFS服务步骤: #
第一步:安装NFS和rpc。
yum install -y nfs-utils #安装nfs服务
yum install -y rpcbind #安装rpc服务
第二步:启动服务和设置开启启动:
注意:先启动rpc服务,再启动nfs服务。
systemctl start rpcbind #先启动rpc服务
systemctl enable rpcbind #设置开机启动
systemctl start nfs-server # 启动nfs服务
systemctl enable nfs-server
第三步:配置共享文件目录,编辑配置文件:
首先创建共享目录,然后在/etc/exports配置文件中编辑配置即可。
vi /etc/exports
/opt 192.168.91.0/24(rw)
systemctl reload nfs #重新加载NFS服务,使配置文件生效
配置文件说明:
格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数) 如上,共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户,权限为只读。 请注意,NFS客户端地址与权限之间没有空格。 NFS输出保护需要用到kerberos加密(none,sys,krb5,krb5i,krb5p),格式sec=XXX none:以匿名身份访问,如果要允许写操作,要映射到nfsnobody用户,同时布尔值开关要打开,setsebool nfsd_anon_write 1 sys:文件的访问是基于标准的文件访问,如果没有指定,默认就是sys, 信任任何发送过来用户名 krb5:客户端必须提供标识,客户端的表示也必须是krb5,基于域环境的认证 krb5i:在krb5的基础上做了加密的操作,对用户的密码做了加密,但是传输的数据没有加密 krb5p:所有的数据都加密
NFS客户端挂载配置: #
**第一步:**使用showmount命令查看nfs服务器共享信息。输出格式为“共享的目录名称 允许使用客户端地址”。
showmount -e 192.168.91.141
#################################
# Export list for 192.168.91.141:
# /opt 192.168.91.0
################################
showmount命令的用法;
参数 | 作用 |
---|---|
-e | 显示NFS服务器的共享列表 |
-a | 显示本机挂载的文件资源的情况NFS资源的情况 |
-v | 显示版本号 |
**第二步,**在客户端创建目录,并挂载共享目录。
vim /etc/fstab #在该文件中挂载,使系统每次启动时都能自动挂载
192.168.91.141:/opt /opt nfs defaults 0 0
mount -a #使得文件/etc/fstab生效
第三步,检查
df -Th
#############################################
# Filesystem Type Size Used Avail Use% Mounted on
# devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
# tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
# tmpfs tmpfs 1.9G 13M 1.9G 1% /run
# tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
# /dev/sda3 xfs 18G 4.6G 14G 26% /
# /dev/sda1 xfs 297M 163M 134M 55% /boot
# tmpfs tmpfs 378M 36K 378M 1% /run/user/0
# 192.168.91.142:/opt nfs4 18G 6.0G 12G 34% /opt
##############################################
nis 配置 #
https://blog.csdn.net/davidzxyang97/article/details/118995358
nis用于管理服务器集群的账户信息。想象一下公司有100名工程师和1000台服务器, 每个工程师都有唯一的帐号和对应的密码,现在希望每个工程师都能用自己的账号登陆所有的服务器。如果手动配置的话就需要操作100 * 1000次,工作量非常大。
nis的作用就是把所有工程师的帐号密码都存在nis的master上,其余的999台服务器作为client。当工程师登陆client时,从master处获取帐号和密码。因此在nis配置好后,每次新增用户时只需要在master上配置即可,最终的工作量可以减少为100 * 1。
sms配置 #
-
安装以及设置
yum install ypserv ypbind nfs-utils rpcbind -y #安装软件包 nisdomainname nisserver # 设置nis域名 echo 'NISDOMAIN=nisserver' >> /etc/sysconfig/network # 开机自动设置 echo '/bin/nisdomainname nisserver' >> /etc/rc.d/rc.local # 开机自动加入nis域 # 启动 systemctl start rpcbind systemctl start yppasswdd systemctl start ypserv /usr/lib64/yp/ypinit -m # 初始化数据库 # 按Ctrl + D,再按y确认
-
添加用户
useradd slurm # 添加slurm要用到的slurm账户 passwd slurm # 设置密码 cd /var/yp make # 更新数据库(每次更新账户信息后都需要更新数据库)
client配置 #
yum install authconfig\* sssd\* krb5\* autofs ypbind -y nisdomainname nisserver # 设置nis域名 echo 'NISDOMAIN=nisserver' >> /etc/sysconfig/network # 开机自动设置 echo '/bin/nisdomainname nisserver' >> /etc/rc.d/rc.local # 开机自动加入nis域 authconfig-tui # 用图形界面配置NIS # 第一个界面左边选择Use NIS,右边保持默认,然后next # 输入nis的域名(nisserver)和master的IP地址(192.168.91.141),选择OK # 启动服务 systemctl start rpcbind systemctl start yppasswdd systemctl start ypserv yptest # 测试 id slurm # 测试
munge 配置 #
-
安装
yum install munge munge-libs munge-devel -y # 所有结点安装
-
主节点生成munge.key
create-munge-key scp /etc/munge/munge.key root@c1:/etc/munge/ scp /etc/munge/munge.key root@c2:/etc/munge/
-
各个结点设置文件权限以及所有者、开机自启动
chown munge.munge /etc/munge/munge.key systemctl enable --now munge
-
测试
systemctl status munge munge -n munge -n | unmunge munge -n | ssh c1 # 管理Node进行测试 remunge
安装slurm #
如无特殊说明均在管理结点运行
-
编译安装包
yum -y install mariadb mariadb-devel mariadb-server hwloc-libs hwloc-devel hdf5-devel pam-devel perl-ExtUtils-MakeMaker python3 readline-devel rpm-build# 安装依赖 wget https://download.schedmd.com/slurm/slurm-22.05.6.tar.bz2 #其他版本的下载链接在https://www.schedmd.com/downloads.php rpmbuild -ta slurm-22.05.6.tar.bz2 # 编译 # 备注: 如提示缺少库、包等,请安装对应的包后再执行上面命令。 # 如所依赖的包安装的不全,上述命令即使没有报错,能生成RPM包,也有可能所需的功能没有。 cd /root/rpmbuild/RPMS/x86_64/ ls #查看生成的RPM文件 ########################################## # slurm-22.08.2-1.el7.x86_64.rpm # slurm-libpmi-22.08.2-1.el7.x86_64.rpm # slurm-slurmctld-22.08.2-1.el7.x86_64.rpm # slurm-contribs-22.08.2-1.el7.x86_64.rpm # slurm-openlava-22.08.2-1.el7.x86_64.rpm # slurm-slurmd-22.08.2-1.el7.x86_64.rpm # slurm-devel-22.08.2-1.el7.x86_64.rpm # slurm-pam_slurm-22.08.2-1.el7.x86_64.rpm # slurm-slurmdbd-22.08.2-1.el7.x86_64.rpm # slurm-example-configs-22.08.2-1.el7.x86_64.rpm # slurm-perlapi-22.08.2-1.el7.x86_64.rpm # slurm-torque-22.08.2-1.el7.x86_64.rpm ############################################## # 设置slurm的yum软件仓库 mkdir -p /opt/src/slurm # 建立YUM仓库目录 cp /root/rpmbuild/RPMS/x86_64/*.rpm /opt/src/slurm/ # 复制前面生成的RPM文件到 /opt/src/slurm/ 目录 cd /opt/src/slurm/ # 建立YUM仓库RPM文件索引 createrepo . cat >/etc/yum.repos.d/slurm.repo<<EOF [slurm] name=slurm baseurl=file:///opt/src/slurm gpgcheck=0 enable=1 EOF scp /etc/yum.repos.d/slurm.repo root@c1:/etc/yum.repos.d/ scp /etc/yum.repos.d/slurm.repo root@c2:/etc/yum.repos.d/# 为其它节点设置YUM仓库 # 管理结点 yum -y install slurm slurm-perlapi slurm-slurmdbd slurm-slurmctld # 计算结点 cd /opt/src/slurm/ yum -y install slurm slurm-perlapi slurm-slurmd
-
配置mariadb(MySQL)数据库
Slurm支持将账户信息等记录到简单的纯文本文件中、或直接存入数据库(MySQL或MariaDB等)、或对于多集群的某个安全管理账户信息的服务。该文档采用将记账信息等存储到数据库方式。
systemctl start mariadb mysql # 生成slurm用户,以便该用户操作slurm_acct_db数据库,其密码是123456 create user 'slurm'@'sms' identified by '123456'; # 生成账户数据库slurm_acct_db create database slurm_acct_db; # 赋予slurm从本机sms采用密码123456登录具备操作slurm_acct_db数据下所有表的全部权限 grant all on slurm_acct_db.* TO 'slurm'@'sms' identified by '123456' with grant option; # 赋予slurm从system0采用密码123456登录具备操作slurm_acct_db数据下所有表的全部权限 grant all on slurm_acct_db.* TO 'slurm'@'system0' identified by '123456' with grant option; # 生成作业信息数据库slurm_jobcomp_db create database slurm_jobcomp_db; # 赋予slurm从本机sms采用密码123465登录具备操作slurm_jobcomp_db数据下所有表的全部权限 grant all on slurm_jobcomp_db.* TO 'slurm'@'sms' identified by '123456' with grant option; # 赋予slurm从system0采用密码123456登录具备操作slurm_jobcomp_db数据下所有表的全部权限 grant all on slurm_jobcomp_db.* TO 'slurm'@'system0' identified by '123456' with grant option; \q # 退出 systemctl enable --now mariadb #启动服务
-
配置
Slurm配置文件主要在 /etc/slurm/ 目录下。
- 主配置文件:/etc/slurm/slurm.conf(如不采用configless模式,则需要其他用户可读) :
内容模板可访问 https://slurm.schedmd.com/configurator.html 填写相应信息生成,然后修改:
# slurm.conf file generated by configurator.html. # Put this file on all nodes of your cluster. # See the slurm.conf man page for more information. ClusterName=MyCluster SlurmctldHost=sms MpiDefault=none ProctrackType=proctrack/cgroup ReturnToService=1 SlurmctldPidFile=/var/run/slurmctld.pid SlurmctldPort=6817 SlurmdPidFile=/var/run/slurmd.pid SlurmdPort=6818 SlurmdSpoolDir=/var/spool/slurmd SlurmUser=slurm StateSaveLocation=/var/spool/slurmctld SwitchType=switch/none TaskPlugin=task/affinity InactiveLimit=0 KillWait=30 MinJobAge=300 SlurmctldTimeout=120 SlurmdTimeout=300 Waittime=0 SchedulerType=sched/backfill SelectType=select/cons_tres AccountingStorageHost=sms AccountingStoragePass=/var/run/munge/munge.socket.2 AccountingStorageType=accounting_storage/slurmdbd AccountingStorageUser=slurm JobCompHost=sms JobCompPass=123456 JobCompType=jobcomp/mysql JobCompUser=slurm JobAcctGatherFrequency=30 JobAcctGatherType=jobacct_gather/linux SlurmctldDebug=info SlurmctldLogFile=/var/log/slurmctld.log SlurmdDebug=info SlurmdLogFile=/var/log/slurmd.log NodeName=c[1-2] NodeAddr=192.168.91.[130-131] CPUs=1 State=UNKNOWN PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
- 数据存储方式配置文件 /etc/slurm/slurmdbd.conf :
# 认证信息 AuthType=auth/munge # 认证方式,该处采用munge进行认证 AuthInfo=/var/run/munge/munge.socket.2 # 为了与slurmctld控制节点通信的其它认证信息 # slurmDBD信息 DbdHost=sms # 数据库节点名 DbdAddr=sms # 数据库IP地址 SlurmUser=slurm # 用户数据库操作的用户 MessageTimeout=60 # 允许以秒为单位完成往返通信的时间,默认为10秒 DebugLevel=debug5 # 调试信息级别, DefaultQOS=normal # 默认QOS LogFile=/var/log/slurm/slurmdbd.log # slurmdbd守护进程日志文件绝对路径 PidFile=/var/run/slurmdbd.pid # slurmdbd守护进程存储进程号文件绝对路径 # Database信息,详细解释参见前面slurm.conf中的 StorageType=accounting_storage/mysql # 数据存储类型 StorageHost=sms # 存储数据库节点名 StorageLoc=slurm_acct_db # 存储位置 StoragePort=3306 # 存储数据库服务端口号 StorageUser=slurm # 存储数据库用户名 StoragePass=123456 # 存储数据库密码
- cgroup资源限制 /etc/slurm/cgroup.conf
CgroupAutomount=yes # Cgroup自动挂载。Slurm cgroup插件需要挂载有效且功能正常的cgroup子系统于 /sys/fs/cgroup/<subsystem_name>。当启动时,插件检查该子系统是否可用。如不可用,该插件将启动失败,直到CgroupAutomount设置为yes。在此情形侠,插件首先尝试挂载所需的子系统。 CgroupMountpoint=/sys/fs/cgroup # 设置cgroup挂载点,该目录应该是可写的,可以含有每个子系统挂载的cgroups。默认在/sys/fs/cgroup。 # CgroupPlugin= # 设置与cgroup子系统交互采用的插件。其值可以为cgroup/v1(支持传统的cgroup v1接口)或autodetect(根据系统提供的cgroup版本自动选择)。默认为autodetect。 ConstrainCores=no # 如设为yes,则容器允许将CPU核作为可分配资源子集,该项功能使用cpuset子系统。由于HWLOC 1.11.5版本中修复的错误,除了task/cgroup外,可能还需要task/affinity插件才能正常运行。默认为no。 ConstrainDevices=no # 如设为yes,则容器允许将基于GRES的设备作为可分配资源,这使用设备子系统。默认为no。 ConstrainRAMSpace=no # 如设为yes,则通过将内存软限制设置为分配的内存,并将硬限制设置为分配的内存AllowedRAMSpace来限制作业的内存使用。默认值为no,在这种情况下,如ConstrainSwapSpace设为“yes”,则作业的内存限制将设置为其交换空间(SWAP)限制。 #注意:在使用ConstrainRAMSpace时,如果一个作业步中所有进程使用的总内存大于限制,那么内核将触发内存不足(Out Of Memory,OOM)事件,将杀死作业步中的一个或多个进程。作业步状态将被标记为OOM,但作业步本身将继续运行,作业步中的其它进程也可能继续运行。这与OverMemoryKill的行为不同,后者将终止/取消整个作业步。不同之处还在于,JobAcctGather轮询系统在每个进程的基础上检查内存使用情况。
- 配置文件目录权限
mkdir /etc/slurm # 如果节点没有/etc/slurm则手动建立一下 chown slurm.slurm /etc/slurm/slurmdbd.conf chmod 600 /etc/slurm/slurmdbd.conf chown root /etc/slurm/slurm.conf mkdir /var/spool/slurmctld chown slurm.slurm /var/spool/slurmctld mkdir /var/spool/slurmctld chown slurm: /var/spool/slurmctld chmod 755 /var/spool/slurmctld touch /var/log/slurmctld.log chown slurm: /var/log/slurmctld.log touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
-
启动服务
systemctl enable slurmdbd systemctl restart slurmdbd systemctl status slurmdbd systemctl enable slurmctld systemctl restart slurmctld systemctl status sllurmctld sacctmgr add cluster MyCluster
-
复制配置文件到计算结点,启动服务
scp /etc/slurm/slurm.conf root@c1:/etc/slurm/slurm.conf scp /etc/slurm/cgroup.conf root@c1:/etc/slurm/cgroup.conf scp /etc/slurm/slurm.conf root@c2:/etc/slurm/slurm.conf scp /etc/slurm/cgroup.conf root@c2:/etc/slurm/cgroup.conf # 每个计算结点,如果显示路径不存在则mkdir /etc/slurm systemctl restart slurmd systemctl status slurmd systemctl enable slurmd