服务器管理

dd 命令刻录系统启动盘

若系统已自动挂载 U 盘,可以命令 [root@A ~]$ fdisk -l 查看 U 盘挂载设备号,如 /dev/sdb,但由于 Linux 中每个设备文件可能对应多个设备号,如主/次设备号,实际自动挂载的可能只是其中的一个设备号,如 /dev/sdb1,再以命令 [root@A ~]$ umount /dev/sdb1 卸载 U 盘;若系统未自动挂载 U 盘,同样可由 fdisk 命令查看 U 盘对应的设备号,如 /dev/sdb;

以命令 [root@A ~]$ mkfs.vfat /dev/sdb -I 格式化 U 盘;

最后以命令 [root@A ~]$ dd if=~/CentOS-7-x86_64-Minimal-xxxx.iso of=/dev/sdb 即可将 ~/CentOS-7-x86_64-Minimal-xxxx.iso 系统文件内容刻录入设备 /dev/sdb 对应的 U 盘。


系统安装注意事项

安装程序引导错误

在安装 CentOS 7.x 系统时,可能出现报错 “No controller found”,无法继续安装进程,此为安装程序引导错误。此时,可按下 Ctrl + Alt + Delete 组合键重启机器。待重新进入 “Install CentOS 7” 等安装选项选择界面时,按方向键选择该选项后按下 e 键,进入选项编辑页面,将该页面中的 “LABEL=CentOS\x207\x20x86_64” 修改为 “LABEL=CentOS\x207\x20x8” 后按下 Ctrl + x 组合键,而后安装程序仍会报告上述错误,但可继续进入后序安装进程,自此即可正常安装系统了。

系统目录空间配置

考虑到在使用过程中,计算节点的 /home 目录需由主节点的 /home 目录远程挂载而来,其原始 /home 目录无法被用户使用,可在安装系统时,将 /home 目录的空间设置小些,而将系统根目录设置得适当大些。

针对当前需求,推荐的手动分区目录配置为:

  • /home: 50 GiB
  • /boot: 1 GiB
  • /boot/efi: 200 MiB
  • swap: 48 GiB

剩余空间均分配给根目录 / 即可。


SSH 免密登录

以下实现主机 A 到主机 B 的免密登录:

  • 在主机 A 下生成公钥/私钥对:执行 [user@A ~]$ ssh-keygen -t rsa 后,连按三次回车键即可。
  • 把主机 A 下生成的公钥复制远程传输到主机 B 上,并添加到其 $HOME/.ssh/authorized_keys 文件中:执行 [user@A ~]$ ssh-copy-id -i .ssh/id_rsa.pub user@B 即可。

注:设置主机 B 上的 $HOME/.ssh/authorized_keys 文件权限为 600 。


设置系统免密登录

以命令 [root@A ~]$ systemctl stop firewalld.service 关闭防火墙;以命令 [root@A ~]$ systemctl disable firewalld.service 禁用防火墙。

以命令 [root@A ~]$ setenforce 0 关闭 SELinux;修改 /etc/selinux/config 文件:SELINUX=disabled, 以禁用 SELinux 。


CentOS minimal 首次安装后连接网络

CentOS minimal 首次初始安装后是无法自动成功联网的,需手动配置网卡。即进入目录 /etc/sysconfig/network-scripts,对于多网口的机器,在该目录下会存在多个以 ifcfg- 开头的配置文件,在修改除 ifcfg-lo 以外的其他配置文件中的 ONBOOT 选项为 yes 后重启机器即可。


安装额外的 yum 源

EPEL 源

EPEL,即 Extra Packages for Enterprise Linux,是为企业级 Linux 提供的一组高质量的额外软件包。

命令 [root@A ~]$ yum install epel-release 安装 rpm 包,命令 [root@A ~]$ yum clean all && yum makecache 更新软件源。

有时由于软件源设置问题,使用上述命令安装时可能提示找不到安装包,可换用命令 [root@A ~]$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 安装。


ELRepo 源

ELRepo 包含了一些硬件相关的驱动程序,比如显卡、声卡驱动。可以如下命令进行安装:

1
2
[root@A ~]$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@A ~]$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

注意将第二条命令中的版本号 7.0-2 修改为自己机器相应的数字。


Nux Dextop 源

Nux Dextop 是类似 CentOS、RHEL、ScientificLinux 等的第三方 RPM 仓库。Nux Dextop 库依赖于 EPEL 库,所以要先安装 EPEL 库。可通过如下命令进行安装:

1
2
[root@A ~]$ rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root@A ~]$ rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

由于 Nux Dextop 仓库可能会与其他第三方库有冲突,所以建议默认情况下禁用该仓库,即将文件 /etc/yum.repos.d/nux-dextop.repo 中的 enable=1 全部修改为 enabled=0 便可。

如需调用 Nux Dextop 仓库,可显式启用该仓库,如可以命令 [root@A ~]$ yum --enablerepo=nux-dextop install fuse-exfat 调用该仓库安装 fuse-exfat。


系统软件安装

必要安装

  • gcc-gfortran: [root@A ~]$ yum install gcc-gfortran
  • gcc-c++: [root@A ~]$ yum install gcc-c++.x86_64
  • autojump: 命令 [root@A ~]$ yum install autojump 安装,命令 [root@A ~]$ yum install autojump-zsh.noarch 添加对 zsh 的支持。
  • HDF5 库:[root@A ~]$ yum install hdf5-devel
  • htop: [root@A ~]$ yum install htop
  • vim: [root@A ~]$ yum install vim
  • tmux: [root@A ~]$ yum install tmux
  • iostat: [root@A ~]$ yum install sysstat.x86_64
  • locate: [root@A ~]$ yum install mlocate
  • zsh: [root@A ~]$ yum install zsh
  • fc-list: [root@A ~]$ yum install fontconfig

可选安装

  • Xpm 库:[root@A ~]$ yum install libXpm-devel.x86_64
  • ifconfig: [root@A ~]$ yum install net-tools.x86_64
  • GNU Parallel: [root@A ~]$ yum install parallel.noarch
  • eog: [root@A ~]$ yum install eog.x86_64
  • Xt 库:[root@A ~]$ yum install libXt-devel.x86_64
  • xauth: [root@A ~]$ yum install xauth (当 ssh -X 远程登录报错 X11 forwarding request failed on channel 0 时)
  • xwindow 图形界面:[root@A ~]$ yum -y groupinstall "X Window System"
  • GNU m4 宏处理器:[root@A ~]$ yum install m4.x86_64
  • ghostscript: [root@A ~]$ yum install ghostscript.x86_64
  • mail: [root@A ~]$ yum install mailx
  • GFortran 静态库: [root@A ~]$ yum install libgfortran-static
  • ntfs 磁盘格式支持: [root@A ~]$ yum install ntfs-3g
  • exfat 磁盘格式支持: [root@A ~]$ yum install fuse-exfat(需先安装 Nux Dextop 软件源)

GPU 节点安装

  • nl 库:[root@A ~]$ yum install libnl-devel.x86_64

修改主机名

hostnamectl set-hostname seislab 命令修改主机名为 seislab 。


修改系统时区

先用 timedatectl set-timezone Asia/Shanghai 命令更新时区为亚洲上海时区,再用 timedatectl set-local-rtc 1 命令将硬件时钟与系统时钟调整一致。


添加用户到 sudoer 列表

以下实现将 user 用户添加到 sudoer 列表:

  • 进入 root 账户,在命令行键入:[root@A ~]$ visudo,打开 sudoer 的配置文件。
  • 向下查找到 root ALL=(ALL) ALL 内容行,在下一行参照新建行内容 user ALL=(ALL) ALL,保存后退出,该内容允许 user 用户组中的用户在所有(第一个 ALL)可登录的主机上以任意(第二个 ALL)用户身份执行任意(第三个 ALL)命令。

也可以参照该配置文件中的样例,用 Cmnd_Alias 定义一些命令组别名(命令需使用绝对路径,别名需全部大写),用已定义的命令组替换掉最后一个 ALL,即仅允许用户执行限定的若干个命令。如 test ALL=LOCATE, STORAGE 意指只允许 test 用户组成员执行 LOCATE 和 STORAGE 命令组中的命令。


挂载本地磁盘

查看本地已挂载磁盘文件系统格式

以命令 [root@A ~]$ lsblk 查看磁盘分区关系。

以命令 [root@A ~]$ blkid 查看本地已挂载磁盘文件系统格式,如 ntfs 或 ext4 等。

格式化本地磁盘

命令 [root@A ~]$ mkfs -t ext4 /dev/sdb 以 ext4 文件格式格式化本地磁盘 /dev/sdb。

挂载本地磁盘

命令 [root@A ~]$ mount /dev/sdb /shdisk/lab 将本地磁盘 /dev/sdb 挂载至 /shdisk/sdb 目录下。

开机自动挂载

  • 假以命令 [root@A ~]$ blkid 查看到本地磁盘 /dev/sdb 的 UUID(即 Universally Unique IDentifier,通用唯一识别符)值为 b0c3c256-60de-47d7-b10a-674b86bdc913,及其 Type(即文件系统类型)值为 ext4;
  • 以 root 身份打开并在文件 /etc/fstab 中添加行内容「 UUID=b0c3c256-60de-47d7-b10a-674b86bdc913 /shdisk/sdb ext4 defaults 0 0 」即可实现,在系统开机后,自动将本地磁盘 /dev/sdb 挂载至 /shdisk/sdb 目录下。
  • 而后可以命令 [root@A ~]$ mount -a 检查各项参数是否有误。

这里,/etc/fstab 文件中的第五列为转储参数(0 表示不备份,1 表示需要备份,一般根分区需要备份);第六列为自检顺序(0 表示不自检,非 0 即表示需要自检,1 表示根分区自检,2 表示其他分区自检)。


挂载 ntfs 硬盘并指定访问权限

CentOS 系统默认不支持 ntfs 文件系统,需先行以命令 [root@A ~]$ yum install ntfs-3g 安装额外驱动 ntfs-3g。若提示找不到安装包,则需先按前述小节命令安装 EPEL 软件源。

若需指定挂载目录为 GID 为 1005 的用户组和 UID 为 1010 的用户所有,且访问权限为 750,则可以如下命令将硬盘 /dev/sdb 挂载在目录 /data 下:

1
[root@A ~]$ mount -t ntfs -o rw,auto,umask=027,uid=1010,gid=1005 /dev/sdb /data

其中,访问权限设置选项 umask 采用八进制记法,对应关系如下:

Octal Binary Permission
0 000 rwx
1 001 rw-
2 010 r-x
3 011 r–
4 100 -wx
5 101 -w-
6 110 –x
7 111

如设置访问权限为 750,即 -rwxr-x—,则应取 umask=027。


挂载远程目录

以主机 B(ip 为 192.18.1.2)挂载远程主机 A(ip 为 192.18.1.1)的共享目录 /data/share 为例:

服务端

  • [root@A ~]$ yum install nfs-utils rpcbind 安装 nfs-utils 和 rpcbind 服务;
  • [root@A ~]$ chkconfig nfs on 设置 nfs 服务开机自启,[root@A ~]$ chkconfig rpcbind on 设置 rpcbind 服务开机自启;
  • [root@A ~]$ service rpcbind start 启动 rpcbind 服务,[root@A ~]$ service nfs start 启动 nfs 服务,注意这两条命令的执行顺序;
  • 在文件 /etc/exports 中添加内容 /data/share 192.18.1.2(rw,no_root_squash,no_subtree_check)
  • [root@A ~]$ exportfs -a 使配置文件生效;
  • [root@A ~]$ showmount -e 查看是否共享成功。

客户端

  • [root@B ~]$ yum install nfs-utils rpcbind 安装 nfs-utils 和 rpcbind 服务;
  • [root@A ~]$ chkconfig nfs on 设置 nfs 服务开机自启,[root@A ~]$ chkconfig rpcbind on 设置 rpcbind 服务开机自启;
  • [root@A ~]$ service rpcbind start 启动 rpcbind 服务,[root@A ~]$ service nfs start 启动 nfs 服务,注意这两条命令的执行顺序;
  • [root@B ~]$ showmount -e 192.18.1.1 查看是否检测到服务端的共享
  • [root@B ~]$ mkdir /data/share 创建映射目录;
  • 在文件 /etc/fstab 中添加内容 192.18.1.1:/data/share /data/share nfs rw,defaults 0 0
  • 当前启动下,执行手动挂载 [root@B ~]$ mount -t nfs 192.18.1.1:/data/share /data/share

常见问题

  1. 若出现由于服务端偶然宕机而导致客户端执行 df 或 ls 等与远程挂载目录相关的操作时终端卡死的情况,可以在服务端依次执行如下命令手动重启 rpcbind 和 nfs 服务解决:
1
2
3
4
[root@A ~]$ service rpcbind stop
[root@A ~]$ service nfs stop
[root@A ~]$ service rpcbind start
[root@A ~]$ service nfs start

有时候使用命令 [root@A ~]$ service rpcbind restart && service nfs restart 重启服务也可解决该问题。

  1. 若在上一问题中,服务端暂时无法登陆,则在客户端以命令 [root@A ~]$ umount -fl /data/share 强制卸载该远程目录即可( -f 即强制卸载;-l 为延迟卸载。仅 -f 可能提示目录繁忙,-l 即等待目录不繁忙时再卸载)。
  2. 若在服务端启动 nfs 服务时出现问题,有可能是该服务节点的本地磁盘未挂载,可手动挂载后再重新启动 nfs 服务。
  3. 若远程挂载过程中出现 mount.nfs: access denied by server while mounting (null) 告警,可能是先前自动挂载失败导致的,需先 umount 掉该挂载目录后再重新尝试远程挂载。
  4. 若在挂载远程目录时,出现 mount.nfs: requested NFS version or transport protocol is not supported 告警时,可能是由于远程服务器的 nfs 服务未正常启动,可登陆至目标服务器上进行 nfs 服务重启。若重启失败并报错 “A dependency job for nfs-server.service failed. See ‘journalctl -xe’ for details.”,则可以命令 [root@A ~]$ journalctl -xe 查看出错原因。若发现本地磁盘自动挂载失败,则重新手动挂载该磁盘后再重启 nfs 服务即可。
  5. 若在客户端使用 showmount 检测共享失败并提示 RPC: Port mapper failure - Unable to receive: errno 113 (No route to host),可能是服务端未关闭防火墙,在关闭防火墙(如设置系统免密登录节所示)后重试。

设置磁盘配额

默认情况下,采用 vfsv0 格式设置磁盘配额,允许设置的最大磁盘空间配额需小于 4T。

挂载磁盘

通过 blkid 可以查询到要设置配额的磁盘设备的 UUID,假定其值为 2c0e8c3b-ffba-484e-90bf-f34e55c888f6,假定挂载点为 /data,假定磁盘格式为 ext4,以 root 身份打开并在文件 /etc/fstab 中添加行内容「 UUID=2c0e8c3b-ffba-484e-90bf-f34e55c888f6 /data ext4 usrquota,grpquota,defaults 0 0 」即可实现开机启用磁盘配额设置。

假定该磁盘的设备号为 /dev/sda,可以命令 [root@A ~]$ mount -o remount,usrquota,grpquota /dev/sda /data 重新挂载该磁盘。采用命令 [root@A ~]$ mount | grep sda 可检查 quota 挂载选项是否生效。

若只需设置用户磁盘配额,在以上设置中去掉 grpquota 关键字即可。

启用磁盘配额

先以命令 [root@A ~]$ quotacheck -cvug /dev/sda 检测文件系统并生成磁盘配额设置文件。若只需设置用户磁盘配额,去掉「g」选项即可。

再以命令 [root@A ~]$ quotaon -p /dev/sda 启用磁盘配额功能。

设置磁盘配额

以命令 [root@A ~]$ edquota -u test 可打开配置文件为 test 用户设置用户磁盘配额。

以命令 [root@A ~]$ edquota -g test 可打开配置文件为 test 用户组设置用户组磁盘配额。

以命令 [root@A ~]$ edquota -p test -u user1 user2 ... 可将用户 test 的磁盘配额设置应用到其他用户。

以命令 [root@A ~]$ repquota -as 可查看所有已使用磁盘的用户的磁盘使用情况,其中第二列的两个字符若为 +,则分别表示已超出空间限制和文件限制。

其他问题

  1. 若要测试磁盘空间配额设置效果,可使用 dd 命令,如 [user@A quotaDir]$ dd if=/dev/zero of=test.a bs=2M count=3 即在测试目录 quotaDir 下生成一个 2M × 3 = 6M 大小的文件 test.a。
  2. 若要设置 4T 及以上的磁盘空间配额,需采用 vfsv1 格式。在挂载磁盘时需在挂载选项中加入 jqfmt=vfsv1,并需在启用磁盘配额使用 quotacheck 和 quotaon 命令时加入 -F vfsv1 选项,还需在设置磁盘配额使用 edquota 命令时加入 -F vfsv1 选项。如此设置,即可为用户配额磁盘空间 4T 以上。
  3. 此设置方法仅对于 ext4 等格式磁盘有效,对于 xfs 格式磁盘可使用 xfs_quota 命令设置配额。

设置内网静态 IP

为了提高集群系统安全性,可以设置机群间通过内网连接,通过为各个节点主机的互连网口设置静态 IP 实现。与此同时,还需要所有节点连接在同一台以太网交换机上,才能保证机群间可以互连互通。这里假设某主机与交换机连接的以太网端口设备号为 em4,则可通过创建或修改 /etc/sysconfig/network-scripts/ifcfg-em4 文件内容如下而为之设置静态 IP:

1
2
3
4
5
6
7
8
9
10
11
12
13
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
IPADDR=10.1.1.101
NETMASK=255.255.255.0
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=em4
UUID=0c456270-971d-4b3a-a4e9-c5a58d1cd814
DEVICE=em4
ONBOOT=yes
PROXY_METHOD=none
BROWSER_ONLY=no

其中,IPADDR 即为该主机指定的静态 IP 地址,UUID 为 em4 端口的通用唯一标识码,其值可通过命令 [user@A ~]$ nmcli con show 查询。在端口标识码未知时,也可通过 HWADDR 字段指定主机端口的 Mac 地址来绑定端口。通过命令 [user@A ~]$ ip address 可查看主机的网络连接情况,在名称为 em4 的连接中,link/ether 字段后面的以冒号连接的内容即主机端口的 Mac 地址。

需要注意的是,静态 IP 地址的各节数值均不得大于 255,且无前置 0;若意欲实现多个主机间的互连,还需在不同主机上将 IPADDR 的前三个字段设置为相同值,且第四个字段不能为 0;若意欲在作业调度系统中使用内网静态 IP,可能需要将静态 IP 设置到第一个网络端口上。


安装 Pbs Pro 作业调度系统

准备

机器

假设如下两台机器(CentOS 7 系统):

主机名 主机 IP
pbsmaster 192.18.1.1
pbsslave 192.18.1.2

修改两台机器的 /etc/hosts 文件,确保两台机器可以 ssh 互相访问。

安装包

此处下载安装包 pbspro-14.1.0.tar.gz 。

制作 RPM 包

先提前安装依赖包:

1
2
3
$ yum -y install rpm-build
$ yum -y install gcc autoconf automake libtool hwloc-devel
$ yum -y install libX11-devel libXt-devel libedit-devel libical-devel ncurses-devel postgresql-devel python-devel python-devel tcl-devel tk-devel swig expat-devel openssl-devel libXext libXft

执行以下命令,在 /root/rpmbuild/RPMS/x86_64 目录下生成 pbspro-[ client | debuginfo | execution | server ]-14.1.0-0.x86_64.rpm 包:

1
2
3
4
$ mkdir -p /root/rpmbuild/SOURCES/
$ mv pbspro-14.1.0.tar.gz /root/rpmbuild/SOURCES/
$ cd /root/rpmbuild/SOURCES && tar zxvf pbspro-14.1.0.tar.gz
$ cd /root/rpmbuild/SOURCES/pbspro-14.1.0 && rpmbuild -ba pbspro.spec

安装

安装 Master

登录至 Master 节点,命令 [root@pbsmaster /root/rpmbuild/RPMS/x86_64]$ yum install -y pbspro-server-14.1.0-0.x86_64.rpm (或者 [root@pbsmaster /root/rpmbuild/RPMS/x86_64]$ rpm -ivh pbspro-server-14.1.0-0.x86_64.rpm )安装作业调度系统,修改 /etc/pbs.conf 文件:

1
2
PBS_SERVER=pbsmaster
PBS_START_MOM=1

安装 Slave

登录至 Slave 节点,命令 [root@pbsslave /root/rpmbuild/RPMS/x86_64]$ yum install -y pbspro-execution-14.1.0-0.x86_64.rpm (或者 [root@pbsslave /root/rpmbuild/RPMS/x86_64]$ rpm -ivh pbspro-execution-14.1.0-0.x86_64.rpm )安装作业调度系统,修改 /etc/pbs.conf 文件:

1
2
PBS_SERVER=pbsmaster
PBS_START_MOM=1

修改 /var/spool/pbs/mom_priv/config 文件:

1
2
$clienthost pbsmaster
$restrict_user_maxsysid 999

启动 pbs

以命令 $ /etc/init.d/pbs start 分别在 pbsmaster 和 pbsslave 节点上启动 pbs,以命令 [root@pbsmaster ~]$ qmgr -c 'create node pbsslave' 在 pbsmaster 主节点上将 pbsslave 节点加入集群。


PBS Pro 队列管理

PBS 队列主要分为两种:路由队列(route)和执行队列(execution)。前者只用于向其他队列移动作业(move jobs);后者用于运行作业。

以下示例中,以 pbsmaster 为 PBS 主节点。

创建队列

以如下命令创建一个执行队列 exec_queue:

1
2
3
4
[root@pbsmaster ~]$ qmgr -c 'create queue exec_queue'
[root@pbsmaster ~]$ qmgr -c 'set queue exec_queue queue_type = execution'
[root@pbsmaster ~]$ qmgr -c 'set queue exec_queue enabled = True'
[root@pbsmaster ~]$ qmgr -c 'set queue exec_queue started = True'

如果要创建一个路由队列,设置 queue_type = route 即可。另外,设置 enable = True 表示允许该队列接收作业,设置 started = True 表示允许该队列里的作业执行。

可以命令 [root@pbsmaster ~]$ qmgr -c 'delete queue exec_queue' 删除已创建的队列 exec_queue。

创建节点

以命令 [root@pbsmaster ~]$ qmgr -c 'create node vnode1' 创建一个节点 vnode1。

以命令 [root@pbsmaster ~]$ qmgr -c 'delete node vnode1' 删除已创建的节点 vnode1。

以命令 [root@pbsmaster ~]$ qmgr -c 'set node vnode1 queue = exec_queue' 将已创建的节点 vnode1 添加到已创建的队列 exec_queue 中。

记录配置

以如下命令将当前 PBS 配置导出到 /tmp/ 目录下:

1
2
[root@pbsmaster ~]$ qmgr -c 'print server' > /tmp/server.out
[root@pbsmaster ~]$ qmgr -c 'print node @default' > /tmp/nodes.out

可以如下命令从 /tmp/ 目录下读取并重新配置 PBS 队列:

1
2
[root@pbsmaster ~]$ qmgr < /tmp/server.out
[root@pbsmaster ~]$ qmgr < /tmp/nodes.out

其他设置

以命令 [root@pbsmaster ~]$ qmgr -c 'set node vnode1 state = offline' 将节点 vnode1 下线,系统不再向该节点分派作业。重新设置该节点 state 为 free 即可恢复正常使用。


安装并配置 InfiniBand

事前准备

首先,在官网下载系统对应版本的驱动安装包( tgz 压缩包即可)。注意操作系统子版本号和机器架构的选择。在下载页面底部,勾选接受 EULA 协议之后方可开始下载。

再以命令 [root@A ~]$ lspci | grep Mellanox 验证主机是否已安装 Mellanox 网络适配器 HCA/NIC,若屏幕输出

1
02:00.0 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5]

类似内容即表示该网络适配器已正确安装。若此处验证失败,则后序启动子网管理器 opensmd 也将失败,且通过命令 ip address 亦不能看到名称为 ib0 的 InfiniBand 网络连接。InfiniBand 网卡未正确安装可能导致此处验证失败。

驱动安装

解压 tgz 安装包后,在解压目录下,以命令 [root@A ~]$ ./mlnxofedinstall 开始安装驱动。

在安装过程中,程序首先会检查操作系统版本的一致性,若这里检查失败,可参考「常见问题」给出的解决方案。其次,程序还会检查软件依赖(包括 perl、gtk2、atk、cairo、gcc-gfortran、libxml2-python、tcsh、lsof、tcl 和 tk),并会自动给出所缺依赖的安装命令,根据提示安装依赖后再重新安装驱动即可。

待驱动安装完成后,以如下命令启动 openibd 并设为开机自启:

1
2
[root@A ~]$ service openibd start
[root@A ~]$ chkconfig openibd on

再以如下命令启动子网管理器 opensmd 并设为开机自启:

1
2
[root@A ~]$ service opensmd start
[root@A ~]$ chkconfig opensmd on

最后,以命令 [root@A ~]$ ibstat 检查 HCA 端口状态,若 State 栏为 Active 则表示驱动安装正常。主机与 InfiniBand 交换机连接不正常可能导致 State 栏为 Down。

网络 IPoIB 配置

在 ibstat 驱动安装检查正常后方可进行网络配置。

首先以如下内容创建文件 /etc/sysconfig/network-scripts/ifcfg-ib0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CONNECTED_MODE=no
TYPE=InfiniBand
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.18.2.1
NETMASK=255.255.255.0
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV4_DNS_PRIORITY=100
IPV6INIT=no
NAME=ib0
DEVICE=ib0
HWADDR=20:00:07:D2:FE:80:00:00:00:00:00:00:98:03:9B:03:00:16:4C:46
ONBOOT=yes

这里,为主机手动配置静态 InfiniBand IP。其中,IPADDR 项可自由指定,HWADDR 应设为主机的 InfiniBand Mac 地址。若意欲实现多个主机间的互连,需在不同主机上将 IPADDR 的前三个字段设置为相同值,且第四个字段不能为 0。以命令 [user@A ~]$ ip address 可查看主机的网络连接情况,在名称为 ib0 的连接中,link/infiniband 字段后面的以冒号连接的内容即主机的 InfiniBand Mac 地址。为不同主机配置网络时,只需修改这两项的内容即可。

配置完成后再以如下命令重启网络接口 ib0:

1
2
[root@A ~]$ ifdown ib0
[root@A ~]$ ifup ib0

至此,已完成所有安装配置工作,即可在 InfiniBand 内网中通过 InfiniBand IP 访问不同主机。

常见问题

  1. 在驱动安装过程中若操作系统一致性检查失败,并报错系统 kernel 版本不匹配,可在安装包解压目录以命令 [root@A ~/software/MLNX_OFED_LINUX-x.x-x.x.x.x-rhel7.3-x86_64]$ ./mlnx_add_kernel_support.sh -m ./ --make-tgz 重新生成主机系统 kernel 对应的安装包。新安装包自动生成在目录 /tmp/ 下。
  2. 若在启动 openibd 服务时,出现如下告警:
1
2
3
4
5
6
7
8
Please close all isert sessions and unload 'ib_isert' module.
Please make sure module 'rpcrdma' is not in use and unload it.
Please make sure module 'ib_srpt' is not in use and unload it.

Error: Cannot unload the Infiniband driver stack due to the above issue(s)!

To unload the blocking modules, you can run:
# modprobe -rv ib_isert rpcrdma ib_srpt

以如上所示命令 [root@A ~]$ modprobe -rv ib_isert rpcrdma ib_srpt 卸载 ib_isert、rpcrdma 和 ib_srpt 模块后再重新启动即可。

  1. 若启动 opensmd 服务失败,并使用命令 [root@A ~]$ ibstat 查看 InfiniBand 网络驱动状态时显示 Link layer: Ethernet,说明 Mellanox 网卡端口模式不对,先使用命令 [root@A ~]$ mst status 查看该网卡对应的设备号,如 /dev/mst/mt4119_pciconf0,再以命令 [root@A ~]$ mlxconfig -d /dev/mst/mt4119_pciconf0 set LINK_TYPE_P1=1 LINK_TYPE_P2=2 将连接模式修改为 1 (即 InfiniBand 模式,2 为 Ethernet 模式),并重启机器生效。
  2. 以命令 [root@A ~]$ /usr/sbin/ofed_uninstall.sh 即可卸载已完成安装的驱动。

安装 NVIDIA 显卡驱动及 cuda 库

前期准备

在 NVIDIA 官网分别下载 NVIDIA 显卡驱动 cuda 库 安装程序 run 文件。对于 CentOS 7 系统,显卡驱动下载 Linux 64-bit 对应版本即可,若下载 Linux 64-bit RHEL 7 对应版本可能会安装失败。

可先行以命令 [root@A ~]$ yum install --enablerepo=epel dkms 安装 DKMS (Dynamic Kernel Module Support) 模块,它可在 kernel 更新后自动为我们重装驱动。

执行安装

  • /usr/lib/modprobe.d/dist-blacklist.conf 中以 # 注释掉原有内容行 blacklist nvidiafb ,添加新建内容行 blacklist nouveau,以禁用 Linux 自带显卡驱动 nouveau 。
  • 以命令 [root@A ~]$ mv /boot/initramfs-$(uname -r).img /root/initramfs-$(uname -r).img.bak 备份原 initramfs 文件,再以命令 [root@A ~]$ dracut -v /boot/initramfs-$(uname -r).img $(uname -r) 更新 initramfs 文件。
  • 关机重启后,以命令 [root@A ~]$ lsmod | grep nouveau 查看是否成功将 nouveau 禁用。若未成功禁用,检查 disk-blacklist.conf 中的设置,从头开始依次重试。
  • 以命令 [root@A ~]$ yum install kernel-devel 安装与系统版本对应的 kernel source。若不能找到对应的安装版本,可在添加第三方软件源,执行 [root@A ~]$ yum update 进行更新后,从头开始重试;再或从网络上下载对应版本的 kernel-devel 的 RPM 包,如可从此处下载 kernel-devel-3.10.0-514.el7.x86_64.rpm,并以命令 [root@A ~]$ rpm -Uvh kernel-devel-3.10.0-514.el7.x86_64.rpm 安装。
  • 在给下载的显卡驱动安装文件添加可执行权限后,即可以管理员权限运行安装。若报错 kernel source tree,可以在添加 --kernel-source-path=/usr/src/kernels/$(uname -r)/ 选项后运行。若报错 nvidia.ko,可以在添加 -k $(uname -r) 选项后运行。
  • 在给下载的 cuda 库安装文件添加可执行权限后,即可以管理员权限运行安装。

安装字体

查看系统字体

以命令 [user@A ~]$ fc-list 查看所有已安装的系统字体;以命令 [user@A ~]$ fc-list :lang=zh 查看系统中的中文字体,注意冒号前面的空格。

安装额外的字体

  • 以管理员身份将字体文件拷贝到 /usr/share/fonts/ 目录下;
  • [root@A ~]$ cd /usr/share/fonts
  • [root@A /usr/share/fonts]$ mkfontscale (若找不到该命令,可以命令 [root@A /usr/share/fonts] yum install mkfontscale 安装);
  • [root@A /usr/share/fonts]$ mkfontdir

修改系统登录提示(欢迎)信息

Linux 系统 SSH 的欢迎信息可以通过修改 /etc/motd 的内容来进行自定义。

但是 /etc/motd 只支持纯文本的欢迎信息。想要实现彩色效果,可以通过修改 /etc/profile.d/motd.sh 来实现,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

echo "==================================================="

# ATTENTION:
echo -en "\033[01;31m"
echo -e "ATTENTION:"

# 1. submitting your job at: seislab1, seislab2
echo -en "\033[00m"
echo -en " 1. submitting your job at: "
echo -en "\033[01;32m"
echo -e "seislab1, seislab2"

# 2. GPU test at: seislab0
echo -en "\033[00m"
echo -en " 2. GPU test at: "
echo -en "\033[01;32m"
echo -e "seislab0"

#
echo -e "\033[00m"

~/.bashrc、/etc/bashrc 和 /etc/profile

  • ~/.bashrc 为用户终端环境设置,仅影响当前用户;/etc/bashrc 和 /etc/profile 为系统终端环境设置,影响所有用户。

  • 系统登录时,/etc/profile 最先被加载,而后它调用了 /etc/bashrc 以及 ~/.bashrc。

  • /etc/profile 对所有 shell 生效,/etc/bashrc 和 ~/.bashrc 仅对 bash 生效。


创建、修改、删除及限制用户

本节涉及到的命令的调用格式均为:

1
[root@A ~]$ command [option] username

创建用户

创建新用户时使用 useradd 或 adduser 命令,其常用选项有:

  • -c “comment”:指定一段注释性描述;
  • -d directory:指定用户 HOME 目录,若该目录不存在,可同时使用 -m 选项以创建之;
  • -g group:指定用户所属用户组;
  • -G group:为用户添加附加组,group 设置为 "" 即删除该用户所有附加组;
  • -s shell:指定用户的默认登录 SHELL;
  • -e YYYY-MM-DD:指定用户账号失效的绝对时间;
  • -u userid:指定用户的用户 ID,可同时使用 -o 选项以重复使用其他用户的 ID 号。

修改用户

修改用户账号时使用 usermod 或 groupmod 命令,常用选项与 useradd 命令一致。以下例中使用该命令修改旧用户名 test 为新用户名 love:

  • 修改用户信息及 HOME 目录:[root@A ~]$ usermod -l love -d /home/love -m test
  • 修改用户组信息:[root@A ~]$ groupmod -n love test

删除用户

以命令 [root@A ~]$ userdel -rf test 删除用户 test 。

限制用户

可以命令 passwd 限制用户账号的使用,其常用选项有:

  • -l:锁定登录密码,即禁止账号使用;
  • -u:解锁登录密码,即解禁账号使用;
  • -d:删除登录密码,即无登录密码,在某些系统中可以直接登录;
  • -f:强制下次登录时修改密码。

设置用户密码规则

设置密码有效期

与默认用户的密码有效期相关的设置参数保存在 /etc/login.defs 文件中,如需变更默认设置,打开该文件修改相关参数的值即可。这里的设置只对新创建的用户生效。文件中的其中相关参数有:

  • PASS_MAX_DAYS:用户两次修改密码的最长间隔天数,超过期限后将强制用户修改密码;
  • PASS_MIN_DAYS:用户两次修改密码的最短间隔天数,设置为 0 则表示用户可以在任意时刻修改密码;
  • PASS_WARN_AGE:用户密码过期前给出警告的天数。

若要修改已有用户的密码有效期,对于以上三个参数可分别通过命令 [root@A ~]$ chage { -M | -m | -W } numberDays userName 进行修改。

另可通过命令 [root@A ~]$ chage -d 0 userName 强制用户下次登录后修改密码。

设置密码复杂度

备份设置

在修改密码复杂度规则之前,可先通过命令 [root@A ~]$ authconfig --savebackup=backupName 备份当前的默认规则,并以 backupName 命令此次备份,该命令将在 /var/lib/authconfig/backup-backupName 目录下备份相关配置文件。

通过命令 [root@A ~]$ authconfig --restorebackup=backupName 即可恢复之前名为 backupName 的备份。

规则设置

用户密码复杂度可通过命令 [root@A ~]$ authconfig [options] --update 来设置,其中 options 可选以下参数:

  • --passminlen=<number>:用户密码的最短长度;
  • --passminclass=<number>:用户密码包含的字符类别(小写字母、大写字母、数字或特殊字符)的最小类别数目;
  • --passmaxrepeat=<number>:用户密码包含的连续相同字符的最大字符个数;
  • --passmaxclassrepeat=<number>:用户密码包含的连续同类字符的最大字符个数;
  • --enablereqlower:用户密码中必须包含至少一个小写字母;
  • --enablerequpper:用户密码中必须包含至少一个大写字母;
  • --enablereqdigit:用户密码中必须包含至少一个数字;
  • --enablereqother:用户密码中必须包含至少一个特殊字符。

如可通过命令 [root@A ~]$ authconfig --passminlen=8 --passmaxrepeat=3 --enablereqlower --enablereqother --update 设置用户密码必须是含有至少一个小写字母和至少一个特殊字符、且最多不超过 3 个连续相同字符的不少于 8 位的字符串。

认证设置

密码认证行为准则的设置有多种方法,最方便的当属 authconfig 工具的 faillock 选项,但低版本的 authconfig 可能不支持该选项。这时我们可以通过直接编辑 /etc/pam.d/ 目录下的服务模块设置文件来修改密码认证行为准则。对于本地 tty 终端登录,需要修改配置的是该目录下的 login 文件;对于远程 ssh 登录,则需要编辑该目录下的 sshd 文件。而实现用户连续登录密码认证失败账户锁定的效果,需要用到的 PAM 模块是 faillock.sopam_tally2.so 模块。

authconfig 工具

通过命令 [root@A ~]$ authconfig --enablefaillock --faillockargs="deny=5 unlock_time=600" --update 可启用用户连续登录密码认证失败账户锁定功能,该命令指定用户在登录时密码连续输入错误 5 次即锁定该用户 600 s,超过锁定期限后用户方可使用正确密码登入。其中,failllockargs 还支持的参数有:

  • even_deny_root:root 账户也可在连续登录密码认证失败时被锁定;
  • root_unlock_time=1800:设置 root 账户的锁定时间为 1800 s,锁定时间可与普通用户不同;
  • fail_interval=900:设置用户连续登录失败次数的计时长度为 900 s,即用户在该时间内连续登录失败达到限制次数则被锁定。

通过命令 [root@A ~]$ faillock --user userName 可查看用户登录失败记录。

在用户被锁定后,可通过命令 [root@A ~]$ faillock --user userName --reset 即时解锁用户登录。

faillock.so 模块

这里针对远程 ssh 登录,设置用户在登录时密码连续输入错误 5 次即锁定该用户 600 s。打开配置文件 /etc/pam.d/sshd 并自第二行起插入如下内容(中间用到的 pam_unix.so 模块虽与认证设置无关,但不可缺少):

1
2
3
4
auth       required     pam_faillock.so preauth  deny=5 unlock_time=600
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=600
auth sufficient pam_faillock.so authsucc deny=5 unlock_time=600

该文件保存修改后即时生效。该模块同样支持 even_deny_rootroot_unlock_time=1800fail_interval=900 等选项。

现在亦可通过 faillock 命令查看用户登录失败记录或即时解锁用户登录。

pam_tally2.so 模块

由上可见 faillock.so 模块的设置方式略显复杂,若采用 pam_tally2.so 模块设置,在配置文件 /etc/pam.d/sshd 的第二行插入如下内容即可:

1
auth       required     pam_tally2.so onerr=fail deny=5 unlock_time=600

该文件保存修改后即时生效。该模块可支持 even_deny_rootroot_unlock_time=1800 等选项。

此时可通过命令 [root@A ~]$ pam_tally2 --user userName 查看用户登录失败记录,通过命令 [root@A ~]$ pam_tally2 --user userName --reset 即时解锁用户登录。

其他设置

可通过编辑 /etc/security/pwquality.conf 进行一些额外的密码复杂度设置,如:

  • dcredit = -2:用户密码中必须包含至少 2 个数字,且不做数字字符加分;
  • lcredit = 0:用户密码中不必包含小写字母,即使含有小写字母也不做小写字母加分;
  • ucredit = 2:用户密码中含有不超过 2 个大写字母时,每个大写字母可加一分,也即最多大写字母加分不超过 2;
  • ocredit = 4:用户密码中含有不超过 4 个特殊字符时,每个特殊字符可加一分,也即最多特殊字符加分不超过 4;
  • minlen = 12:用户密码的复杂度不小于 12,即总字符个数加上各项字符加分不小于 12;
  • difok = 5:用户密码中至少有 5 个字符不存在于旧密码中;
  • badwords = denywords1 denywords2 denywords3:用户密码中不能包含的字符片断;
  • gecoscheck = 1:启用 GECOS 字段检查,即密码中不能包含用户 GECOS 信息字段(/etc/passwd 中用户信息的第 5 个字段)中的字符串。

该文件保存修改后即时生效。

对于以上设置,如:密码 pPNN13% 的复杂度为 7 (总字符个数)+ 0 (数字字符加分)+ 0 (小写字母加分)+ 2 (大写字母加分)+ 1 (特殊字符加分)= 10 < 12 不合规,密码 dkst@Feb.1st 的复杂度为 12 (总字符个数)+ 0 (数字字符加分)+ 0 (小写字母加分)+ 1 (大写字母加分)+ 2 (特殊字符加分)= 15 > 12 合规。


利用 fail2ban 防止暴力攻击

fail2ban 是一款防止暴力入侵的服务器防御软件。它基于系统安全日志文件,检测并禁止恶意来访的 IP 地址。

在安装 EPEL 软件源库之后,即可以命令 [root@A ~]$ yum install fail2ban 安装该软件。

fail2ban 的所有配置文件均保存在 /etc/fail2ban/ 目录下,主配置文件为 jail.conf。在使用命令 [root@A /etc/fail2ban]$ cp jail.conf jail.local 复制该文件后,再在 jail.local 做自定义的修改,常用的配置参数有:

  • ignoreip: 忽略的 IP 地址列表,该列表中的 IP 地址不会被禁止;
  • bantime: 检测到的恶意 IP 地址被禁止访问的时间,超过该时间后会自动解禁,设为 -1 则表示永久封禁;
  • findtime: 检测时使用的时窗长度,即在该时间长度内检查 IP 地址的登录记录;
  • maxretry: 最大尝试登录次数,来访 IP 地址登录失败次数超过该数值时则被禁止。

一言言之,除 ignoreip 中的地址以外的其他来访 IP 地址,若在 findtime 内有超过 maxretry 次登录失败,则会被禁止在接下来的 bantime 内登入 。

fail2ban 可用于多种服务,如 sshd、apache 等。若要启用针对某一服务的访问 IP 地址检测,需在 jail.local 文件中该服务关键字段内加入 enabled = true 语句即可。如:

1
2
3
# SSH servers
[sshd]
enabled = true

即可启用针对 sshd 服务的访问检测,再使用命令 [root@A ~]$ service fail2ban restart 重启 fail2ban 即可生效。

通过命令 [root@A ~]$ fail2ban-client status 即可查看软件服务状态。通过命令 [root@A ~]$ fail2ban-client status sshd 可查看详细的关于 sshd 服务的状态,其中会给出当前被禁止的 IP 地址列表。

通过命令 [root@A ~]$ fail2ban-client set sshd unbanip 192.18.1.101 可解除对 192.18.1.101 地址的禁止。


发送广播消息

mesg 命令

  • 语法:[root@A ~]$ mesg [ny]
  • 功能:设置终端机的写入权限
  • 参数:n/y 允许/不允许系统用户将信息直接显示在屏幕上

write 命令

  • 语法:[user@A ~]$ write 用户名 [终端串口]
  • 功能:向系统某一用户发送消息

wall 命令

  • 语法:[root@A ~]$ wall < 文件名
  • 功能:向系统所有已登录用户发送文件内容

关机/重启

shutdown 命令

  • 语法:[root@A ~]$ shutdown [-t sec] [-hkr] time "WARNING INFO."
  • 参数:
    • h: 停止所有系统服务后立即关机;
    • k: 只发送警告信息,实际不执行关机操作;
    • r: 停止所有系统服务后重新启动。
  • 实例:
    • shutdown -h now: 立即关机;
    • shutdown -h 20:30: 在下一个 20:30 时刻关机;
    • shutdown +5 "System will shutdown after 5 minutes: 向所有登入用户发送警告,在 5 分钟后关机。

另外,可以命令 [root@A ~]$ shutdown -a 取消已经提交的定时关机命令。

reboot 命令

  • 语法:[root@A ~]$ reboot [-w]
  • 参数:w 仅做测试,执行一个重开机模拟,并不真正将系统重启。

pip 指定安装目录

临时方法

安装模块 modulename 到目录 /path/to/directory 可以使用命令:[user@A ~]$ pip install --target=/path/to/directory modulename

此方法会直接在目标目录创建 module 文件夹,因此调用前只需将该目录加入 PYTHONPATH 系统环境变量即可。

永久方法

若经常需要安装一些额外的 python 函数包到目录 /path/to/directory,则可以修改用户 HOME 目录下 .pip/pip.conf(若不存在则创建),加入以下内容:

1
2
[install]
install-option=--prefix=/path/to/directory

此方法会根据安装 module 版本的不同,在目标目录下进一步创建其他子文件夹,最终在子文件夹下创建 module 文件夹,因此调用前需将子文件夹目录加入到 PYTHONPATH 系统环境变量中。


强制踢出已登录用户

以下实现踢出已登录用户 user:

  • 先使用 w 命令查看用户 user 登录的 TTY 端口号,此处假设端口号为 pts/4;
  • 再使用命令 [root@A ~]$ pkill -kill -t pts/4 踢出。
  • 最后使用命令 [root@A ~]$ pkill -u user 杀死该用户的所有进程。

查看系统信息

  • 查看系统版本号:[user@A ~]$ cat /etc/centos-release
  • 查看系统内核版本号:[user@A ~]$ uname -r
  • 查看操作系统位数:[user@A ~]$ getconf LONG_BIT
  • 查看系统日志:[root@A ~]$ vim /var/log/messages
  • 查看系统字体:[user@A ~]$ fc-list
  • 查看系统中文字体:[user@A ~]$ fc-list :lang=zh
  • 查看系统网卡的 UUID:[user@A ~]$ nmcli con show
  • 查看系统网络 Mac 地址:[user@A ~]$ nmcli device show
  • 查看系统登录日志:
    • 查看系统中所有用户的历史登录信息统计:[root@A ~]$ lastlog
    • 查看近期系统用户成功登入的登录信息:[root@A ~]$ last
    • 查看近期尝试登入失败的登录信息:[root@A ~]$ lastb

查看 CPU 温度

以命令 [root@A ~]$ yum install lm_sensors.x86_64 安装 lm_sensors 工具。

再以 [root@A ~]$ sh -c "yes|sensors-detect" 检测传感器后,即可以命令 [user@A ~]$ sensors 查看 CPU 温度了。


查看机器硬件信息

主机型号

以命令 [root@A ~]$ dmidecode | grep -A8 "System Information$" 查看主机型号信息,其中 Manufacturer 字段即为制造商(品牌方),Product Name 为具体型号。

CPU

以命令 [user@A ~]$ lscpu 查看 CPU 信息,其中 Model name 字段为 CPU 型号,NUMA node(s) 字段为 CPU 个数,Core(s) per socket 字段为每个 CPU 的物理核数,CPU(s) 字段为总逻辑核数。

内存

以命令 [root@A ~]$ dmidecode | grep -A16 "Memory Device$" 查看内存信息,输出信息的每一段对应于一个内存插槽,其中 Manufacturer 为制造商,Type 为内存类型,Size 为内存大小,Speed 为数据传输速度。

硬盘

可先命令 [root@A ~]$ lsblk 查看磁盘的分区和挂载情况。

以命令 [root@A ~]$ yum install smartmontools 安装 smartctl 工具。

若设备 /dev/sda 对应的是单个磁盘,可以命令 [root@A ~]$ smartctl --all /dev/sda 查看设备 /dev/sda 的磁盘信息。

若该设备为 RAID 磁盘阵列,则应以命令 [root@A ~]$ smartctl --all /dev/sda -d megaraid,N 查看该阵列中第 N 块磁盘的信息,其中 N 为 SCSI 总线号,即代表该阵列中的第 N 块磁盘(自 0 计起)。

需指出的是,在该工具给出的信息中, Vendor 实为该磁盘的制造(加工生产)商,可能与磁盘的供货(贴标销售)商不同;Device ModelProduct 字段为磁盘型号;User Capacity 为磁盘空间大小;Rotation Rate 为机械磁盘的转速;Form Factor 为磁盘尺寸大小;Transport protocol 为磁盘接口协议。

阵列卡

以命令 [user@A ~]$ lspci -v | grep RAID 查看阵列卡信息,RAID bus controller 字段即为阵列卡型号。

Infiniband 卡

以命令 [user@A ~]$ lspci -v | grep Mellanox 查看 Infiniband 卡信息,其中 Infiniband controller 字段即为 Infiniband 卡型号。

以太网网卡

以命令 [user@A ~]$ lspci -v | grep Ethernet 查看以太网网卡信息,Ethernet controller 字段即为以太网网卡型号,每个该字段各对应一个网卡。


xz 压缩或解压

使用 xz -z dir 命令压缩目录 dir,使用 xz -d file 命令解压文件 file。在解压以 .tar.xz 结尾的文件时,可以调用 tar -l xz -cxvf 命令。


rpm 查看系统安装包安装目录

先用 rpm -qa | grep libname 命令查询 libname 安装包得到该包完整名字 libname-version.arch ,再用 rpm -ql libname-version.arch 命令查看该包安装位置。


查看已安装的软件包

  • 以 rpm 包安装的:[root@A ~]$ rpm -qa | grep packagename
  • 以 deb 包安装的:[root@A ~]$ dpkg -l | grep packagename
  • 以 yum 命令安装的:[root@A ~]$ yum list installed | grep packagename

一次性定时任务 at

安装启动

以命令 [root@A ~]$ yum install at 安装 at 后台工具。

以命令 [root@A ~]$ service atd start 启动 atd 服务。

检查运行状态

以命令 [user@A ~]$ service atd status 查看 at 的守护进程 atd 是否正在运行。若显示 “Active: active (running)” 则表示已成功启动。

黑白名单

黑名单文件为 _/etc/at.deny_,白名单文件为 _/etc/at.allow_,并遵循如下规则:

  • 当系统中存在白名单文件时,黑名单文件将被忽略,只有写入白名单的用户才可以运行 at 命令;
  • 当系统中只有黑名单文件中,被写入名单的用户不能运行 at 命令,且黑名单对 root 无效;
  • 如果两个文件都不存在时,只有 root 用户可以运行 at 命令。

at 命令

以命令 [user@A ~]$ at <time> 启动 at 命令行,并输入要执行的任务命令集合,按 [ctrl + d] 结束输入,at 命令会提示该任务的系统编号为 ##;这里,<time> 格式可以为:

  • HH:MM,如 02:30
  • HH:MM YYYY-MM-DD,如 08:00 2018-10-10
  • HH:MM [am | pm] [month] [date],如 08:00 Oct 1
  • HH:MM [am | pm] + number [minutes | hours | days | weeks],如 08:00 + 1 days
  • now + number [minutes | hours | days | weeks],如 now + 5 minutes

以命令 [user@A ~]$ at -l 查看所有等待执行的 at 任务;

以命令 [user@A ~]$ at -c ## 查看 ## 号 at 任务的任务详情;

以命令 [user@A ~]$ at -d ## 删除正在等待执行的 ## 号 at 任务。


磁盘分区管理工具 fdisk

为例,以如下系列命令删除磁盘 /dev/sdb 的原有分区并创建一个新的分区:

[root@A ~]$ fdisk /dev/sdb

WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): m
Command action
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
q quit without saving changes
s create a new empty Sun disklabel
w write table to disk and exit

Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 is deleted

Command (m for help): p

Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes, 7814037168 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
Disk label type: gpt

# Start End Size Type Name
1 34 32767 16M Microsoft reser Microsoft reserved partition

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): p

Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes, 7814037168 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
Disk label type: gpt

# Start End Size Type Name

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-7814037134, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-7814037134, default 7814037134):
Created partition 1

Command (m for help): p

Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes, 7814037168 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
Disk label type: gpt

# Start End Size Type Name
1 2048 7814037134 3.7T Linux filesyste

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


软 RAID 磁盘管理

RAID 简介

RAID(即 Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种磁盘管理技术,是由多个独立的高性能磁盘驱动器组成的磁盘系统,从而提供比单个磁盘更高的存储性能和数据冗余的技术。

RAID 主要利用镜像(即 Mirroring,将原始数据完整复制到多个磁盘上)、数据条带(即 Data stripping,将数据分片保存在不同磁盘上)和数据校验(即 Data parity,利用冗余数据进行数据错误检测和修复,冗余数据通常采用海明码或 XOR 操作等算法来计算获得)三大技术来获取高性能、可靠性、容错能力和扩展性。

由于所采用技术组合的不同,实际应用中存在着多种 RAID 等级,如 RAID0、RAID1、RAID3、RAID5、RAID6 和 RAID10 等。根据实现方法的不同,又可以分为软 RAID、硬 RAID 和混合 RAID 三种:软 RAID 由操作系统和 CPU 来完成,没有独立的 RAID 控制/处理芯片和 I/O 处理芯片,效率较低;硬 RAID 由完全由专门的 RAID 控制/处理芯片、I/O 处理芯片和阵列缓冲来实现,不占用 CPU 资源,但成本较高;混合 RAID 有 RAID 控制/处理芯片,但没有 I/O 处理芯片,同时也需要 CPU 和驱动程序来完成,性能和成本都介于软 RAID 和硬 RAID 之间。

创建软 RAID 阵列

在 Linux 系统上,软 RAID 磁盘的管理可以借助 mdadm 命令来实现。以下利用 mdadm 工具以磁盘 /dev/sdf 为热备份磁盘,将磁盘 /dev/sdb、/dev/sdc、/dev/sdd 和 /dev/sde 按 RAID5 的方式组合为一个磁盘阵列:

  • 以命令 [root@A ~]$ mdadm -C -v /dev/md5 -l5 -n4 /dev/sd[bcde] -x1 /dev/sdf 开始创建磁盘阵列,其中:-C 表示创建新的磁盘阵列,-v 表示列出相关信息,-l5 表示 RAID5 模式,-n4 表示采用 4 块磁盘制作阵列,-x1 表示采用 1 块磁盘作热备份;
  • 以命令 [user@A ~]$ cat /proc/mdstat 查看磁盘阵列制作进程,待有进度条的输出内容行消失即表示创建完成;
  • 以命令 [root@A ~]$ mdadm -D /dev/md5 即可查看新建磁盘阵列的详细信息;
  • 以命令 [root@A ~]$ mdadm -Dvs > /etc/mdadm.conf 命令保存当前阵列配置信息;
  • 以命令 [root@A ~]$ mkfs.ext4 /dev/md5 对新建磁盘阵列进行格式化。

至此,磁盘阵列即已成功创建,再以 mount 命令挂载后即可使用。

软 RAID 日常管理

以命令 [root@A ~]$ mdadm /dev/md5 -r /dev/sde 从 RAID 磁盘阵列 /dev/md5 中删除损坏的磁盘 /dev/sde。

以命令 [root@A ~]$ mdadm /dev/md5 -a /dev/sde 向 RAID 磁盘阵列 /dev/md5 中增加新的磁盘 /dev/sde,这里的新增磁盘会用作热备份磁盘。

以命令 [root@A ~]$ mdadm -G /dev/md5 -n4 设置使用 4 块工作磁盘,即将上述热备份磁盘 /dev/sde 转为工作磁盘。

以命令 [root@A ~]$ mdadm -S /dev/md5 停止 RAID 磁盘阵列 /dev/md5。

以命令 [root@A ~]$ mdadm -A /dev/md5 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf 重新装配 RAID 磁盘阵列 /dev/md5,或以命令 [root@A ~]$ mdadm -As 自动根据配置文件 /etc/mdadm.conf 装配阵列。


功能强大的 LD_PRELOAD 变量

LD_PRELOAD 是 Linux 系统的一个环境变量,它可以定义一个程序运行前优先加载的动态链接库,主要是用来有选择性地载入不同动态链接库中的相同函数。

一般情况下,动态链接库的加载顺序为:LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib > /usr/lib。

为了实现某些功能,可以重定义第三方库中的一些函数,编译为动态链接库,并将 LD_PRELOAD 设置为此自定义动态链接库。此时,程序在运行时,会优先调用自定义库文件中覆写的第三方库同名函数。此处可见详细示例。

另外,在安装某些软件(如 anaconda)时,如需指定其他路径的第三方库而不使用自身提供的同名库(如 hdf5),可将 LD_PRELOAD 设置为需指定路径的库文件,即可强制安装程序调用指定路径的库文件。


创建新用户时的默认规则配置

/etc/login.defs 配置文件

通过该文件可以定义在创建新用户时的一些默认设置,其中:

  • MAIL_DIR 字段:系统邮件文件存放位置;
  • PASS_MAX_DAYS 字段:用户密码持续有效天数;
  • PASS_MIN_DAYS 字段:用户密码允许修改的最短间隔天数;
  • PASS_MIN_LEN 字段:允许设置的密码最小长度;
  • PASS_WARN_AGE 字段:自系统给出提醒到密码完全失效的间隔天数;
  • UID_MIN 字段:允许设置的最小用户 ID;
  • UID_MAX 字段:允许设置的最大用户 ID;
  • GID_MIN 字段:允许设置的最小用户组 ID;
  • GID_MAX 字段:允许设置的最大值用户组 ID;
  • CREATE_HOME 字段:是否创建用户 HOME 目录,yes 表示创建。

/etc/default/useradd 配置文件

通过该文件可以定义在使用 useradd 或 adduser 命令创建新用户时的一系列创建规则,其中:

  • HOME 字段:用户 HOME 目录的所在目录;
  • INACTIVE 字段:是否启用账号过期停权,-1 表示不启用;
  • EXPIRE 字段:账号失效日期,为空表示不启用;
  • SHELL 字段:默认 SHELL 类型,需指明全路径;
  • SKEL 字段:创建用户 HOME 目录时拷贝的初始启动文件的存放位置。

用户账号信息系统文件

/etc/passwd 文件

该文件记录了用户的一些基本属性,一行记录对应于一个用户,每行记录又以 : 分隔为 7 个字段,分别为:

用户名:登录密码:用户 ID :用户组 ID :注释性描述信息: HOME 目录:登录 SHELL

“用户名”中不能有分隔符 : ,不宜超过 8 个字符,不宜包含字符 . ,不宜以字符 -+ 开头。

“登录密码”为密码加密字符串。出于安全考虑,在采用了 shadow 技术的现代 Linux 系统中,本文件中该字段一般设为字符 x*

“用户 ID”相同而用户名不同的多个用户,系统视为同一个用户,对系统中的文件拥有相同的访问权限,但可以有不同的登录密码、不同的 HOME 目录和不同的登录 SHELL 等。

“注释性描述信息”可以记录一些与用户相关的个人信息,没有实际用途。

“登录 SHELL”也可以指定为某特定的程序,即用户只能运行该指定程序,程序运行结束后自动退出登录。

另外,该文件中还记录了一些伪用户的信息,它们的登录 SHELL 为空,即不能登录。它们的存在主要是为了方便系统管理,满足相应的系统进程支文件所有者属性的要求。

/etc/shadow 文件

该文件记录了与用户密码相关的信息,同样地,一行记录对应于一个用户,每行记录又以 : 分隔为 8 个字段,分别为:

用户名:登录密码:最后修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

“用户名”与 /etc/passwd 文件中保持一致,唯一地表征一个单独的用户。

“最后修改时间”为最后一次修改用户登录密码的时间,其值为自 1970 年 1 月 1 日起算的天数。

“最小时间间隔”指定两次修改登录密码的最小间隔天数。

“最大时间间隔”指定登录密码持续有效的最大天数。

“警告时间”指定自系统给出提醒到密码完全失效的间隔天数。

“不活动时间”指定账号保持有效的用户连续不登录的最大天数。

“失效时间”指定用户账号失效的时间,其值为自 1970 年 1 月 1 日起算的天数。

/etc/group 文件

该文件记录了用户组的相关信息,一行记录对应于一个用户组,每行记录又以 : 分隔为 4 个字段,分别为:

用户组名:用户组密码:用户组 ID :组内用户列表

“用户组名”由字母或数字构成,不应重复。

“用户组密码”为密码加密字符串。出于安全考虑,在采用了 shadow 技术的现代 Linux 系统中,本文件中该字段一般设为字符 x*

“组内用户列表”中,多个用户以逗号 , 分隔。


批量创建用户

准备文件

先参照 /etc/passwd 文件的格式,创建一个文本用户文件 user.txt,如:

1
2
user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash

再创建一个密码对照文件 passwd.txt,如:

1
2
user001:明码密文
user002:明码密文

创建用户

  • [root@A ~]$ newusers < user.txt:从用户文件 user.txt 中导入数据,创建用户;
  • [root@A ~]$ pwunconv:取消 shadow password 功能,将 /etc/shadow 中的用户密码写入 /etc/passwd 中,删除 /etc/shadow 文件,方便下一步的密码转换;
  • [root@A ~]$ chpasswd < passwd.txt:按照默认的加密方式,将用户密码加密后写入 /etc/passwd 的密码栏;
  • [root@A ~]$ pwconv:重新启用 shadow password 功能,创建 /etc/shadow 文件,删除 /etc/passwd 中的用户密码。

journalctl 查看系统日志

可以命令 [root@A ~]$ journalctl -n 10 查看最新的 10 条日志。

可以命令 [root@A ~]$ journalctl -u NetworkManager 查看与 NetworkManager 服务相关的日志。

可以命令 [root@A ~]$ journal -p err..alert 的方式查看指定优先级的日志信息。这里最后一个参数也可以用 ‘3..1’ 代替。具体的对应关系是:

1
0:emerg; 1:alert; 2:crit; 3:err; 4:warning; 5:notice; 6:info; 7:debug

可以命令 [root@A ~]$ journalctl --since today --until "20 min ago" 查看自今日零时起至 20 分钟前的所有日志。这里的时间参数也可换成 ‘2021-11-20’、‘“2 hour ago”’ 等形式。

可以命令 [root@A ~]$ journalctl _UID=1020 查看与 UID 为 1020 的用户有关的日志。

可以命令 [root@A ~]$ journalctl -k 查看系统内核日志。

可以命令 [root@A ~]$ journalctl -f 实时查看日志更新。


CentOS 7 / Redhat 开放指定网络端口

下文中以 55555/tcp 为例,即指定网络端口号为 55555,指定网络协议为 tcp。

查看已开放端口

[root@A ~]$ firewall-cmd --zone=public --list-port

开放指定端口

1
2
[root@A ~]$ firewall-cmd --zone=public --add-port=55555/tcp --permanent
[root@A ~]$ firewall-cmd --reload

关闭指定端口

1
2
[root@A ~]$ firewall-cmd --zone=public --remove-port=55555/tcp --permanent
[root@A ~]$ firewall-cmd --reload

查看指定端口状态

[root@A ~]$ firewall-cmd --zone=public --query-port=55555/tcp


nginx 安装

准备工作

首先,以如下命令安装依赖:

1
2
[root@A ~]$ yum install gcc-g++ autoconf automake libtool make cmake
[root@A ~]$ yum install zlib openssl pcre-devel

然后,自官网下载源码安装包 nginx-1.xx.x (不带 Windows 的稳定版即可),并以命令 [root@A ~]$ tar -zpxvf nginx-1.xx.x.tar.gz 解压之。

最后,以如下命令创建 nginx 用户并修改该用户默认属性:

1
2
3
[root@A ~]$ groupadd nginx
[root@A ~]$ useradd -g nginx -M nginx
[root@A ~]$ chsh -s /sbin/nologin nginx

编译安装

在安装包的解压目录 nginx-1.xx.x 下,运行如下脚本将 nginx 安装至 /data/software/nginx 目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

./configure --prefix=/data/software/nginx \
--pid-path=/data/software/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
--group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

make -j
make install

管理测试

可以命令 [root@A ~]$ /data/software/nginx/sbin/nginx -v 查看 nginx 的安装版本。

nginx 的配置文件为 /data/software/nginx/conf/nginx.conf,通过修改该文件相应内容,即可自定义配置 nginx(如修改默认监听端口,重启 nginx 服务方可生效)。

可以命令 [root@A ~]$ /data/software/nginx/sbin/nginx -t 验证 nginx 配置。

可以命令 [root@A ~]$ /data/software/nginx/sbin/nginx 首次启动 nginx 服务。

可以命令 [root@A ~]$ /data/software/nginx/sbin/nginx -s reload 重启 nginx 服务。

可以命令 [root@A ~]$ /data/software/nginx/sbin/nginx -s stop 停止 nginx 服务。

在启动 nginx 服务后,可以如下命令进行 localhost 测试(以默认端口号 80 为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[user@A ~]$ curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[user@A ~]$

在目标服务器(以 IP 地址 192.18.1.101,端口号 80 为例)上启动 nginx 服务,并关闭 SELinux 和防火墙后,在其他可访问目标服务器的主机上,浏览器打开 http://192.18.1.101:80 即可访问目标服务器的 nginx 测试页面。


常见问题总结

CentOS 系统启动时在进度条页面卡死

有时 CentOS 系统由于各种问题在启动时长时间卡死在进度条页面,可在该页面先按 「F5」键查看系统启动项,检查是否有系统应用或服务未正常启动。再重启机器至选择启动系统页面时按「e」键修改启动选项,将以 linux16 开头的行中 ro 替换为 rw init=/sysroot/bin/sh,再按「Ctrl-x」键即可启动单用户模式。进入后执行命令 chroot /sysroot 即可获取 root 权限,修改有问题的系统启动项后重启即可。

pbsnodes 工作异常

在调用 pbsnodes 命令时出现异常,可能是由于某些 PBS 节点的 pbs 服务未正常启动,可登陆至该节点以命令 [root@A ~]$ service pbs start 重启 pbs 服务即可。

多用户组用户的组间切换

多用户组用户在登录时默认登录到初始登录用户组,通过命令 [user@A ~]$ newgrp groupname 即可切换到附加用户组。

PGI 社区免费版 License 过期

修改 PGI 社区免费版安装目录下的 license.dat 文件中 FEATURE 行的日期为将来的某一日期即可。

OpenMPI 提供的 mpirun 在运行时不同节点的运行环境变量不同

使用「-x <arg0>」运行选项将当前主机的环境变量分发给其他主机,如 [user@A ~]$ mpirun -x LD_LIBRARY_PATH ...

安装 NVIDIA 高版本(Linux 418.43 以上)驱动后,nvprof 工具由于内部错误无法工作

在安装 NVIDIA GPU 高版本(Windows 419.17 或 Linux 418.43 以上)驱动后,Cuda 并行代码分析工具 nvprof 或 nvvp 在分析代码性能时,出现由于内部错误引起的报错信息:

ERR_NVGPUCTRPERM The user running <tool_name/application_name> does not have permission to access NVIDIA GPU Performance Counters on the target device.

这是由于 NVIDIA 公司提高了驱动的安全等级,默认禁止普通用户访问 NVIDIA GPU 性能工具,即不允许普通用户进行代码性能分析,root 用户可正常使用 nvprof 和 nvvp 等代码性能分析工具。

根据此处的官方提示,对于 Linux 系统,可在通过命令 [root@A ~]$ modprobe -r vidia_uvm nvidia_drm nvidia_modeset nvidia-vgpu-vfio nvidia 卸载依赖的 NVIDIA 模块(若警告提示未安装某模块时,可在 -r 选项后面的模块列表里去掉相应模块后重新尝试卸载)后,再通过命令 [root@A ~]$ modprobe nvidia NVreg_RestrictProfilingToAdminUsers=0 即可设置允许普通用户使用 NVIDIA GPU 性能工具。

上述设置仅在当次系统启动下生效,当系统发生重启时自动失效。

在文件 /etc/rc.d/rc.local 中追加行内容 modprobe -r vidia_uvm nvidia_drm nvidia_modeset nvidia-vgpu-vfio nvidia 即可使机器在重启时自动执行此命令,再在文件夹 /etc/modprobe.d/ 下创建文件 custom.conf 并写入行内容 options nvidia "NVreg_RestrictProfilingToAdminUsers=0" 即可默认设置允许普通用户使用 NVIDIA GPU 性能工具。如此设置则系统重启后仍有效。

updatedb 报错 “ `/var/lib/mlocate/mlocate.db’ is locked ”

这可能是由于先前的 updatedb 命令被异常中止引起的。在执行命令 [root@A ~]$ rm /var/lib/mlocate/mlocate.db 删除中间文件之后,即可正常运行 updatedb 命令更新文件信息数据库。

报错 “curl#60 - “Peer’s Certificate issuer is not recognized.””

在使用 yumwgetcurl 等网络下载工具时报如上错误,这是因为系统不能正常进行 CA 验证,可能系统中未安装相关验证工具,可通过命令 [root@A ~]$ yum install ca-certificates 进行安装。如仍未解决问题,可参考这里的解决方案。

PBS 作业系统中设置 ulimit 限制

用户不能直接在 PBS 作业脚本中通过 ulimit 命令设置内存限制(报错 “Operation not permitted”),可由 root 账户在各个计算节点修改 /PathToPBSHome/lib/init.d/limits.pbs_mom 文件,注释其中的判断条件 if ... fi ,保存后重启 PBS 服务即可使其中的设置命令生效。

---------- 文结至此 静待下章 ----------