github的双重验证

最近github需要双重身份验证才能登录并上传代码。操作流程如下:

首先,登录GitHub后,打开Settings,点击左侧Password and authentication,设置Two-factor authentication为enabled。会弹出一个界面,上面有个二维码。

然后,在google浏览器中安装插件“身份验证器”,使用该插件给二维码截图,再点击插件,即可返回一串数字,填入网页中,即可完成验证。

Rocky 9系统对XFS磁盘进行配额

1. 安装quota软件

若没有xfs_quota命令,则安装quota软件:

dnf install quota

2. 关闭SeLinux安全机制

临时关闭
setenforce 0

永久关闭
perl -p -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3. 挂载磁盘时添加配额参数

mount -o remount,usrquota,prjquota /dev/sdb1 /home

或修改 /etc/fstab 文件永久生效(需要重新挂载目标分区才能生效):

/dev/sdb1 /home xfs defaults,usrquota,prjquota 0 0
# 注意有3种quota方式,usrquota给用户限额,grpquota给用户组限额,prjquota给文件夹限额。注意后两者是互斥的,只能选一种,当修改磁盘配额方式后,重启服务器服务器才能生效,而重新挂载分区是不行的。

然后使用mount命令查看挂载分区是否支持磁盘配额:

mount | grep home
/dev/sdb1 on /home type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)

4. 开机时设置配额参数

虽然添加了挂载参数,使用mount命令检测时,其挂载方式依然是noquota。在使用xfs_quota进行配额时会失败,提示:

xfs_quota: cannot set limits: Function not implemented

此时,需要进行开机的配置设置,修改启动配置文件/etc/default/grub内容如下:

GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M rhgb quiet rootflags=uquota,pquota"
主要添加了rootflags=uquota,pquota参数。

然后,重新生成启动文件:

对于Legacy启动
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.orig && grub2-mkconfig -o /boot/grub2/grub.cfg

对于UEFI启动
cp /boot/efi/EFI/rocky/grub.cfg /boot/efi/EFI/rocky/grub.cfg.orig && grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg

然后重启后,再检测mount参数。

5. 使用xfs_quota命令对分区进行配额

对user01用户的/home分区进行配额。软限制为3G,硬限制为3.5G。

xfs_quota -x -c 'limit bsoft=3000m bhard=3500m user01' /home
xfs_quota -x -c report /home

-x 允许执行管理员指令
-c 输入执行的指令

6. 使用xfs_quota命令对目录进行配额

对user01、user02、user03等多个用户的家目录进行配额。软限制为3G,硬限制为3.5G。按如下步骤进行:

第一步,生成/etc/projects文件
echo "1000:/home/user01
1000:/home/user02
1002:/home/user03" > /etc/projects
以上/etc/projects文件中设置了两个project编号。project编号是一个数字,可以随便给一个。其中1000对应两个文件夹,1002对应一个文件夹。后续设置好后,这1000对应的两个文件夹一起共享一个配额,而1002对应的文件夹独享一个配额。

第二步,生成/etc/projid文件
echo "user01_3G:1000
user03_3G:1002" > /etc/projid
该/etc/projid文件设置一个好记的project名称(随便取名,推荐取得有意义些),对应这project编号。

第三步,让project名称生效
xfs_quota -x -c 'project -s user01_3G' /home
xfs_quota -x -c 'project -s user03_3G' /home
命令行project的参数-s表示读取/etc/projects文件内容,标记目标文件夹进行配额。每当对/etc/projects文件内容进行修改后,则需要重新运行相应的命令,使修改生效。

第四步,设置project名称对应的磁盘配额。
xfs_quota -x -c 'limit -p bsoft=3000m bhard=3500m user01_3G' /home
xfs_quota -x -c 'limit -p bsoft=3000m bhard=3500m user03_3G' /home
命令行limit的参数-p表示使用project方式进行配额。若配额限制为0,则表示不进行配额限制。

7. 查看配额信息

查看磁盘配额及使用量:

xfs_quota -x -c report /home

查看磁盘分区和目录是否有quota设置:

xfs_quota -x -c print

查看磁盘配额的使用量:

xfs_quota -x -c "df -h"

在Rocky 9.2 Linux系统部署SGE

目前,最新版本的SGE版本是8.1.9版本,其软件较旧,在Rocky 9.2 Linux系统上使用其高版本的GCC进行编译基本不会成功。于是采用特别提供repo源进行安装,即采用某些高人已经编译好的rpm软件进行安装。

1. 设置各节点的主机名

部署SGE前,需要设置好各个节点的主机名,需要修改3个文件。以设置node1主机为例:

echo 'NETWORKING=yes
HOSTNAME=node1' > /etc/sysconfig/network
echo 'node1' > /proc/sys/kernel/hostname
echo 'node1' > /etc/hostname

然后在各节点上设置主机名和其IP映射信息:

echo '10.0.0.1 node1
10.0.0.2 node2
10.0.0.3 node3
10.0.0.4 node4
10.0.0.5 node5
10.0.0.6 node6
10.0.0.7 node7
10.0.0.8 node8' > /etc/hosts

2. 在管理节点上安装SGE软件

首先,开放防火墙端口。

sudo firewall-cmd --add-port=992/udp --permanent
sudo firewall-cmd --add-port=6444/tcp --permanent
sudo firewall-cmd --add-port=6445/tcp --permanent
sudo systemctl restart firewalld.service

然后,安装SGE软件可能依赖的一些系统软件。

sudo dnf -y install csh java-1.8.0-openjdk java-1.8.0-openjdk-devel gcc ant automake hwloc-devel openssl-devel libdb-devel pam-devel libXt-devel motif-devel ncurses-libs ncurses-devel ant-junit junit javacc libdb-utils jemalloc munge-libs

继续,正式安装SGE软件,采用loveshack编译的SGE

sudo wget https://copr.fedorainfracloud.org/coprs/loveshack/SGE/repo/epel-9/loveshack-SGE-epel-9.repo -P /etc/yum.repos.d
sudo dnf -y install gridengine gridengine-devel gridengine-execd gridengine-drmaa4ruby gridengine-qmon
# 需要强制安装gridengine-qmaster,正常安装保存血少libdb4,而Rocky9默认安装libdb5。
sudo dnf -y download gridengine-qmaster
sudo rpm -ivh --nodeps gridengine-qmaster-8.1.9-6.el9.x86_64.rpm
sudo chown -R chenlianfu:chenlianfu /opt/sge

最后,在管理节点上部署SGE的qmaster服务。

cd /opt/sge
./install_qmaster
# 安装到靠后时,启动了Grid Engine qmasster服务,然后可以提供部署SGE的节点主机名信息,按y和Enter键使用一个文件来提供主机信息,输入文件路径/etc/hosts提供加入到SGE集群系统的主机信息。有利于后续在各计算节点上部署execd服务。

3. 在计算节点上部署SGE软件

首先安装SGE依赖的系统软件,然后部署SGE的execd服务。

sudo dnf -y install csh java-1.8.0-openjdk java-1.8.0-openjdk-devel gcc ant automake hwloc-devel openssl-devel libdb-devel pam-devel libXt-devel motif-devel ncurses-libs ncurses-devel ant-junit junit javacc libdb-utils jemalloc munge-libs

cd /opt/sge
./install_execd
# 全程按Enter键直到完毕即可。

4. 启动SGE软件

部署完毕后,若需要使用SGE软件,则执行如下命令载入SGE的环境变量信息:

source /opt/sge/default/common/settings.sh

或将该信息添加到~/.bashrc从而永久生效:

echo 'source /opt/sge/default/common/settings.sh' >> ~/.bashrc
source ~/.bashrc

启动SGE软件方法:

sudo /opt/sge/default/common/sgemaster restart   # 控制节点启动
sudo /opt/sge/default/common/sgeexecd restaart   # 计算节点启动

查看SGE软件运行日志文件:

Qmaster:      /opt/sge/default/spool/qmaster/messages
Exec daemon:  /opt/sge/default/spool/<hostname>/messages

我通过编写一个程序:keep_SGE,使用root用户或无密码sudo权限运行后能自动维持管理节点或计算节点的SGE服务。再继续通过例行任务流程,能使集群中服务器再SGE系统中的稳定性。

sudo mkdir /root/bin
sudo wget http://chenlianfu.com/public/bin/keep_SGE -P /root/bin/
sudo echo -e "1\t*\t*\t*\t*\t/root/bin/keep_SGE" > crontab.txt
sudo crontab crontab.txt
sduo rm crontab.txt

5. 使用SGE软件

部署完毕SGE后,会生成一个默认主机用户组@allhosts,它包含所有的执行节点;生成一个默认的all.q队列名,它包含所有节点所有计算资源。默认的队列包含的计算资源是最大的。 通过使用命令qconf -mq queuename来对队列进行配置。修改hostlist来配置该队列可以使用执行主机;修改slots来配置各台执行主机可使用的线程数。从而对队列的计算资源进行设置。

使用qconf命令对SGE进行配置:

qconf -ae hostname
    添加执行主机
qconf -de hostname
    删除执行主机
qconf -sel
    显示执行主机列表

qconf -ah hostname
    添加管理主机
qconf -dh hostname
    删除管理主机
qconf -sh
    显示管理主机列表

qconf -as hostname
    添加提交主机
qconf -ds hostname
    删除提交主机
qconf -ss
    显示提交主机列表

qconf -ahgrp groupname
    添加主机用户组
qconf -mhgrp groupname
    修改主机用户组
qconf -shgrp groupname
    显示主机用户组成员
qconf -shgrpl
    显示主机用户组列表

qconf -aq queuename
    添加集群队列
qconf -dq queuename
    删除集群队列
qconf -mq queuename
    修改集群队列配置
qconf -sq queuename
    显示集群队列配置
qconf -sql
    显示集群队列列表

qconf -ap PE_name
    添加并行化环境
qconf -mp PE_name
    修改并行化环境
qconf -dp PE_name
    删除并行化环境
qconf -sp PE_name
    显示并行化环境
qconf -spl
    显示并行化环境名称列表

qstat -f
    显示执行主机状态
qstat -u user
    查看用户的作业
qhost
    显示执行主机资源信息

使用qsub提交作业

qsub简单示例:
$ qsub -V -cwd -o stdout.txt -e stderr.txt run.sh

其中run.sh中包含需要运行的程序,其内容示例为如下三行:
#!/bin/bash
#$ -S /bin/bash
perl -e 'print "abc\n";print STDERR "123\n";'

qsub的常用参数:
-V
    将当前shell中的环境变量输出到本次提交的任务中。
-cwd
    在当前工作目录下运行程序。默认设置下,程序的运行目录是当前用户在其计算节点的家目录。
-o
    将标准输出添加到指定文件尾部。默认输出文件名是$job_name.o$job_id。
-e
    将标准错误输出添加到指定文件尾部。默认输出文件名是$job_name.e$job_id。
-q
    指定投递的队列,若不指定,则会尝试寻找最小负荷且有权限的队列开始任务。
-S
    指定运行run.sh中命令行的软件,默认是tcsh。推荐使用bash,设置该参数的值为 /bin/bash 即可,或者在run.sh文件首部添加一行#$ -S /bin/bash。若不设置为bash,则会在标准输出中给出警告信息:Warning: no access to tty (Bad file descriptor)。
-hold_jid
    后接多个使用逗号分隔的job_id,表示只有在这些job运行完毕后,才开始运行此任务。
-N
    设置任务名称。默认的job name为qsub的输入文件名。
-p
    设置任务优先级。其参数值范围为 -1023 ~ 1024 ,该值越高,越优先运行。但是该参数设置为正数需要较高的权限,系统普通用户不能设置为正数。
-j y|n
    设置是否将标准输出和标准错误输出流合并到 -o 参数结果中。
-pe
    设置并行化环境。

任务提交后的管理:

$ qstat -f
    查看当前用户在当前节点提交的所有任务,任务的状态有4中情况:qw,等待状态,刚提交任务的时候是该状态,一旦有计算资源了会马上运行;hqw,该任务依赖于其它正在运行的job,待前面的job执行完毕后再开始运行,qsub提交任务的时候使用-hold_jid参数则会是该状态;Eqw,投递任务出错;r,任务正在运行;s,被暂时挂起,往往是由于优先级更高的任务抢占了资源;dr,节点挂掉后,删除任务就会出现这个状态,只有节点重启后,任务才会消失。

$ qstat -j jobID
    按照任务id查看

$ qstat -u user
    按照用户查看

$ qdel -j jobID
    删除任务