集群管理#
本章介绍使用 NVIDIA Base Command Manager (BCM) 进行集群管理。运行集群管理器的集群向外部世界导出集群管理接口,任何旨在与集群通信的应用程序都可以使用该接口。
概念#
本节介绍使用集群管理器进行集群管理的一些核心概念。
设备#
集群管理器基础设施中的设备代表集群的组件。设备可以是以下任何类型
头节点
物理节点
机箱
以太网交换机
InfiniBand 交换机
配电单元
通用设备
设备可以有多个属性(例如机架位置、主机名和交换机端口),可以设置这些属性来配置设备。使用集群管理器,可以对设备执行操作(例如,开机)。可以对设备执行的属性更改和操作取决于设备的类型。例如,可以将新文件系统挂载到节点,但不能挂载到以太网交换机。
每个由集群管理器管理的设备都具有与其关联的设备状态。表 3 描述了设备最重要的状态。所有设备都启用了状态跟踪。
表 3. 集群管理器设备状态
设备状态 |
设备处于 |
是否由 BCM 监控? |
---|---|---|
[ UP ] |
运行 |
已监控 |
[ DOWN ] |
宕机 |
已监控 |
[ CLOSED ] (UP) |
运行 |
基本忽略 |
[ CLOSED ] (DOWN) |
宕机 |
基本忽略 |
有关这些状态和其他状态的更详细描述,请参阅 Bright Cluster Manager 管理员手册的 第 5.5 节。
[ DOWN ] 和 [ CLOSED ] (DOWN) 状态有一个重要的区别。在 [ DOWN ] 的情况下,设备已宕机,但通常旨在可用,因此通常表示故障。在 [ CLOSED ] (DOWN) 的情况下,设备已宕机,但旨在不可用,并且通常表示管理员有意关闭了设备,并希望忽略该设备。
软件镜像#
软件镜像是计算节点上本地文件系统内容的蓝图。实际上,软件镜像是头节点上的一个目录,其中包含完整的 Linux 文件系统。
在 DGX SuperPOD 中,所有由 (意味着所有管理节点和 DGX 节点) 管理的节点共享相同的基本操作系统 (OS),其中 DGX 节点包含 DGX Base OS 的自定义项。
当非计算节点启动时,节点配置系统 使用与该节点类别关联的软件镜像(第 2.1.3 节)设置节点。通常,这是默认软件镜像的副本,称为 default-image。DGX 节点使用 DGX OS 镜像的副本进行配置,该副本通过镜像名称中的 dgx- 前缀标识。
节点完全启动后,可以指示节点将其本地文件系统与软件镜像重新同步。此过程可用于在 无需重启节点 的情况下分发对软件镜像的更改。
也可以 锁定 软件镜像,以便在软件镜像解锁之前,任何节点都无法获取该镜像。
可以使用常规 Linux 工具和命令(例如 apt 和 chroot)更改软件镜像。有关更改软件镜像和进行镜像包管理的更多详细信息,请参见 Bright Cluster Manager 管理员手册的第 11 章。
节点类别#
集群管理器中可以应用于节点的设置集合称为节点的配置。管理员通常使用 Base View 或 cmsh 前端工具配置节点,并且配置在内部通过数据库进行管理。
节点类别是一组共享相同配置的计算节点。节点类别提高了效率,使管理员能够
并发配置大量节点。例如,使用特定的磁盘布局设置一组节点。
并发操作大量节点。例如,对整个类别执行重启。
DGX SuperPOD 上安装的 BCM 的默认节点类别显示在 表 4 中。
表 4. 默认节点类别
系统类型 |
节点类别 |
描述 |
---|---|---|
登录 |
slogin |
login-image |
计算 |
dgxnodes |
dgxos-image |
其他 |
默认 |
default-image |
可以通过访问 分区模式 的基本对象并将 defaultcategory 的值设置为另一个现有类别来更改默认类别。登录或计算以外的系统类型会自动放置在默认节点类别中。
节点通常根据其硬件规格或要执行的任务划分为类别。节点是否应放置在单独的类别中取决于这些节点的配置(例如:监控设置、磁盘布局、角色分配)是否与其他节点不同。
节点从其所属的类别继承值。每个值都被视为节点的默认属性值,并且可以通过为特定节点指定节点属性值来覆盖。
节点类别的一个配置属性值是其 软件镜像。但是,节点类别和软件镜像之间没有一对一对应的要求。多个节点类别可以使用相同的软件镜像,反之亦然,一个可变镜像(它是可变的,因为它可以通过节点设置更改)可以在同一节点类别中使用。
软件镜像的参数可以被类别设置覆盖。但是,默认情况下,可以覆盖软件镜像参数的类别设置是未设置的。
节点组#
节点组由为方便起见而分组在一起的节点组成。DGX SuperPOD 上 BCM 的默认节点组分配显示在 表 5 中。
表 5. 默认节点组分配
节点组 |
成员 |
---|---|
su1 |
dgx001..dgx020 |
su2 |
dgx021..dgx040 |
登录 |
slogin1, slogin2 |
节点组可以包含各种节点的任意组合,无论它们是头节点还是计算节点,也无论它们属于哪个类别。一个节点一次可以属于零个或多个节点组。也就是说,一个节点可以属于多个节点组。
节点组用于一次对整个节点组执行操作。由于节点组内的节点不一定共享相同的配置,因此不能使用节点组进行配置更改。
节点组的一个重要用途是在 配置角色配置 的 nodegroups 属性中,其中指定了可以配置节点配置的节点组列表。
角色#
角色是可以由节点执行的任务。通过将特定角色分配给节点,管理员可以在该节点上激活角色代表的功能。例如,通过将相应的角色分配给节点,可以将节点转变为配置节点或存储节点。
角色可以分配给单个节点或节点类别。一旦分配,角色将隐式分配给类别内的所有节点。
配置覆盖 是一组角色,可以将其分配给集群内指定的节点组。这使得可以在各种节点组合中配置许多配置参数。
某些角色允许设置参数,这些参数会影响角色的行为。例如,Slurm 客户端角色(将节点转变为 Slurm 客户端)使用参数来控制节点在 Slurm 中如何配置,包括队列和 GPU 数量。
当角色已使用一组特定参数分配给节点类别时,可以覆盖这些参数。这可以通过使用不同的参数将角色重新分配给单个节点来完成。这样分配的角色将覆盖已分配给节点类别的角色。角色级别分配的角色也覆盖默认配置覆盖分配的角色。
角色具有与其关联的优先级设置。在类别级别分配的角色具有固定的优先级 250,而在节点级别分配的角色具有固定的优先级 750。配置覆盖优先级是可变的,但默认设置为 500。例如,在节点级别分配的角色将覆盖在类别级别分配的角色。在节点级别分配的角色也覆盖默认配置覆盖分配的角色。
角色可以从另一个实体导入,例如角色、类别或配置覆盖。角色分配的示例在 Bright Cluster Manager 管理手册的 5.2.2 和 5.2.3 节中给出。
身份验证#
更改管理密码#
注意
有关如何设置或更改常规用户密码的讨论,请参见 :ref: user-management。
cm-change-passwd
命令用于管理以下密码
头节点:允许 root 用户登录到头节点。
软件镜像:允许 root 用户登录到使用该镜像运行的计算节点,并存储在镜像文件中。
节点安装程序:允许 root 用户在节点安装程序(精简的操作系统 (OS))运行时登录到节点。节点安装程序阶段为节点启动时的最终操作系统做准备。有关节点安装程序的更多信息,请参见 Bright Cluster Manager 管理员手册的 第 5.4 节。
MySQL:允许 root 用户登录到 MySQL 服务器。
它有一个对话框,提示管理员应更改哪些密码(如果有)。
1[root©headnode ~]# cm-change-passwd
2With this utility you can easily change the following passwords:
3* root password of head node
4* root password of slave images
5* root password of node-installer
6* root password of mysql
7
8Note: if this cluster has a high-availability setup with 2 head
9 nodes, be sure to run this script on both head nodes.
10
11Change password for root on head node? [y/N]: y
12Changing password for root on head node.
13Changing password for user root.
14New password:
15Retype new password:
16passwd: all authentication tokens updated successfully.
17
18Change password for root in default-image [y/N]: y Changing password for root in default-image.
19Changing password for user root. New password:
20Retype new password:
21passwd: all authentication tokens updated successfully.
22
23Change password for root in node-installer? [y/N]: y
24Changing password for root in node-installer.
25Changing password for user root. New password:
26Retype new password:
27passwd: all authentication tokens updated successfully.
28
29Change password for MYSQL root user? [y/N]: y
30Changing password for MYSQL root user.
31Old password:
32New password:
33Re-enter new password:
对于 HA 配置,当软件镜像的 root 密码更改时,密码会自动复制到另一个头节点。这允许 root 用户登录到使用该镜像运行的常规节点。
对于其余密码情况(头节点 root 密码、MySQL root 密码和节点安装程序 root 密码),最好通过在该头节点上重新运行脚本将密码“复制”到另一个头节点。
此外,对于计算节点使用的软件镜像密码:为计算节点设置的新密码仅在节点本身的镜像更新后才在节点上生效,例如使用 imageupdate 命令。或者,可以通过重启节点以获取新镜像来使新密码在节点上生效。
LDAP root 密码是在安装期间设置的随机字符串。更改此密码不是使用 cm-change-password 完成的。可以按照 Bright Cluster Manager 管理员手册的 附录 I 中的说明进行更改。
如果管理员已将集群密码存储在 Base View 前端,则也应在那里修改密码(图 2)。
ssh 登录#
头节点、软件镜像和节点安装程序的标准系统登录 root 密码可以使用 cm-change-passwd 命令 (2.2.1) 设置。相比之下,默认情况下,从头节点到计算节点的 ssh 登录设置为无密码
对于非 root 用户,如果挂载了包含这些用户的授权密钥的 /home 目录,则 ssh 无密码登录有效。/home 目录默认挂载在头节点以及计算节点上,因此默认情况下,从头节点到计算节点以及从计算节点到头节点的无密码登录都有效。
对于 root 用户,从头节点到计算节点的 ssh 无密码登录应始终有效,因为授权密钥存储在 /root 中。默认情况下,从计算节点到头节点的登录配置为请求密码,作为安全考虑。
可以限制用户进行 ssh 登录
在计算节点上,使用 usernodelogin 或 User node login 设置。
在头节点上,通过修改 sshd 配置。例如,要仅允许 root 用户登录,可以在 /etc/ssh/sshd_config 中将 AllowUsers 的值设置为 root。有关更多信息,请参见 sshd_config man page。
证书#
PEM 证书和 CMDaemon 前端身份验证#
虽然集群中的节点接受普通的 ssh 登录,但集群管理器接受使用 X509v3 证书的公钥身份验证。使用 X509v3 证书的公钥身份验证意味着,向集群管理器进行身份验证的用户必须出示其公钥证书,并且还必须有权访问与该证书对应的私钥。
集群管理器对证书使用 PEM 格式。在此格式中,证书和私钥以纯文本形式存储在两个单独的 PEM 编码文件中,分别以 .pem 和 .key 结尾。
使用 cmsh 和向 CMDaemon 进行身份验证#
默认情况下,为 root 用户创建一个管理员证书,用于 cmsh 前端与集群管理器进行交互。因此,证书和相应的私钥在新安装的集群管理器集群的头节点上找到,位于
/root/.cm/admin.pem
/root/.cm/admin.key
当 cmsh 前端以 root 用户身份访问证书和密钥对时,默认情况下会使用此对,因此提示进行身份验证不是安全要求。默认情况下访问证书和密钥的逻辑在第 4.4.2.6 节中详细说明。
使用 Base View 和向集群管理器进行身份验证#
当管理员使用 Base View 前端时,除非身份验证已存储在浏览器中,或者除非使用基于证书的身份验证,否则将使用用户名密码身份验证(图 2)进行集群登录。
- 可以使用 PKCS#12 证书文件执行基于证书的身份验证。这可以从 PEM 格式证书生成。例如,对于 root 用户,可用于生成 admin.pfx 文件的 openssl 命令是
openssl pkcs12 -export -in ~/.cm/admin.pem -inkey ~/.cm/admin.key -out ~/.cm/admin.pfx
在 Chrome 中,可以使用 chrome://settings/certificates 上的导入向导将文件保存到浏览器中。
- 对于 Firefox,等效的点击路径是
about:preferences#privacy>证书>查看证书>您的证书>导入。
然后,浏览器无需用户名/密码组合即可访问 Base View 前端。
如果管理员证书和密钥被替换,则必须使用替换项重新生成原始管理员证书签名的任何其他证书,否则它们将不再起作用。
有关证书生成的常规信息,包括非管理员证书的生成和使用,在 4.4 中进行了更详细的描述。
配置文件#
向 CMDaemon 验证身份的证书包含配置文件。
配置文件确定证书持有者可以执行哪些集群管理操作。管理员证书是使用 admin 配置文件创建的,admin 配置文件是一个内置配置文件,可以执行所有集群管理操作。从这个意义上讲,它类似于 unix 系统上的 root 帐户。可以使用不同的配置文件创建其他证书,使证书所有者可以访问集群管理功能的预定义子集 (4.4)。
Base View GUI#
本节介绍 Base View 的基础知识,Base View 是集群管理器的 Web 应用程序前端。在 BCM 发布时,Base View 支持在 Firefox、Google Chrome、Edge 和 Safari 的最新两个公开可用的桌面版本上运行。不支持在移动设备上运行的浏览器。
集群管理 GUI 服务#
在 DGX SuperPOD 中,GUI 界面作为 Web 服务在端口 8081 上从头节点提供给浏览器。其直接 URL 采用以下形式
https://<主机名或 IP 地址>:8081/base-view
提供此服务的集群管理器软件包是 base-view。
Base View 登录窗口#
图 2 显示了 Base View 的登录对话框窗口。使用此窗口管理集群上的 Base View 服务。在 DGX SuperPOD 部署时,至少有一个登录可用:root 用户,密码是在 DGX SuperPOD 安装期间选择的(通常记录在安装前的现场勘测中)。
图 2. Base View 登录
Base View 连接时的默认显示#
默认情况下,会显示一个概览窗口(图 3)。它显示了 占用率、已用内存、已用 CPU 周期、节点状态和其他集群详细信息。它对应于点击路径“集群”>“分区 base”。
图 3. 集群概览
集群管理 Shell#
本节介绍集群管理 shell cmsh 的基础知识。这是集群管理的命令行界面 (CLI)。由于 cmsh 和 Base View 提供对相同集群管理功能的访问。 cmsh 前端允许使用它运行命令,并且可以在批处理模式下使用。虽然 cmsh 命令通常使用程序员熟悉的构造,但它的设计目的是有效地管理集群,而不是试图成为一种良好或完整的编程语言。对于集群管理编程,请使用 Python 绑定 而不是在批处理模式下使用 cmsh。通常,cmsh 是从头节点上的交互式会话(例如,通过 ssh)调用的,但它也可以用于从外部管理集群。
调用 cmsh#
从头节点,可以按如下方式调用 cmsh
1[root©dgxsuperpod ~]# cmsh
2\[dgxsuperpod]%
默认情况下,它使用默认集群管理器端口连接到本地管理网络接口的 IP 地址。如果像前面的示例中那样连接失败,但使用 cmsh localhost 进行了连接,则管理接口很可能未启动。在这种情况下,启动管理接口允许 cmsh 连接到 CMDaemon。不带参数运行 cmsh 会启动交互式集群管理会话。要返回到 unix shell,请输入 quit 或 ctrl-d
1[dgxsuperpod]% quit
2[root©dgxsuperpod ~]#
cmsh 中的批处理模式和管道#
-c
标志允许在批处理模式下使用 cmsh。可以使用分号分隔命令
1[root©dgxsuperpod ~]# cmsh -c "main showprofile; device status apc01" admin
2apc01 ............... [ UP ]
3[root©dgxsuperpod ~]#
或者,可以将命令通过管道传递到 cmsh
1[root©dgxsuperpod ~]# echo device status I cmsh
2device status
3apc01 ............... [ UP ]
4dgxsuperpod ......... [ UP ]
5dgx001 .............. [ UP ]
6dgx002 ...............[ UP ]
7switch01 .............[ UP ]
cmsh 的 Dotfiles 和 /etc/cmshrc 文件#
与 unix shell 类似,cmsh 在启动时(在批处理模式和交互模式下)都会读取 dotfiles(如果存在)。在以下 dotfiles 列表中,路径较短的文件中的设置将覆盖路径较长的文件中的设置
∼/.cm/cmsh/.cmshrc
∼/.cm/.cmshrc
∼/.cmshrc
如果用户没有 dotfile 并且 /etc/cmshrc 文件存在,则会读取该文件并使用其设置。如果 /etc/cmshrc 存在,则会使用其设置,但值可以被用户 dotfiles 覆盖,这是标准的 Unix 行为。
在 cmsh 中定义命令别名#
在定义命令别名时,读取设置非常方便。命令别名可用于缩写较长的命令。例如,将以下内容放在 .cmshrc 中将允许使用 lv 作为 device list virtualnode 的别名
1alias lv device list virtualnode
除了在 dotfiles 中定义别名外,还可以在 cmsh 中使用 alias 命令创建别名。可以在 cmsh 中运行前面的示例以创建 lv 别名。在 cmsh 中运行 alias 命令会列出现有别名。可以使用 export 命令从 cmsh 中导出别名以及其他 cmsh dot 设置
1[dgxsuperpod]% export > /root/mydotsettings
可以通过从 cmsh 中运行 run 命令将 dot 设置导入 cmsh
1[dgxsuperpod]% run /root/mydotsettings
cmsh 中的内置别名#
以下别名是内置别名,未在任何 .cmshrc 或 cmshrc 文件中定义
1[headnode]% alias
2alias - goto -
3alias .. exit
4alias / home
5alias ? help
6alias ds device status
7alias ls list
含义是
goto -: 转到 cmsh 的上一级目录
exit: 上移一级目录,如果已在顶级目录,则退出 cmsh。
home: 转到顶级目录。
help: 显示当前级别的帮助文本。
device status: 显示可以在设备模式下访问的设备的状态。
list: 列出所有模式的状态。
cmsh 中的自动别名#
cmsh 脚本是一个文件,其中包含一系列在 cmsh 会话中运行的 cmsh 命令。
目录 .cm/cmsh/ 可以放置一个带有 .cmsh 后缀和任意前缀的 cmsh 脚本。然后,前缀将自动成为 cmsh 中的别名。
在以下示例中
文件 tablelist.cmsh 提供了别名 tablelist,用于使用
|
符号作为分隔符列出设备。文件 dfh.cmsh 提供了别名 dfh,用于执行 Linux shell 命令
df -h
。
1[root©dgxsuperpod ~]# cat /root/.cm/cmsh/tablelist.cmsh
2list -d "|"
3[root©dgxsuperpod ~]# cat /root/.cm/cmsh/dfh.cmsh
4!df -h
5[root©dgxsuperpod ~]# cmsh
6[dgxsuperpod]% device
7[dgxsuperpod->device]% alias | egrep ‘(tablelist|dfh)’
8alias dfh run /root/.cm/cmsh/dfh.cmsh
9alias tablelist run /root/.cm/cmsh/tablelist.cmsh
10[dgxsuperpod->device]% list
11Type Hostname (key) MAC Category Ip
12---------------------- ---------------- ------------------ ---------------- ---------------
13HeadNode dgxsuperpod FA:16:3E:B4:39:DB 10.141.255.254
14PhysicalNode dgx001 FA:16:3E:D5:87:71 default 10.141.0.1
15PhysicalNode dgx002 FA:16:3E:BE:05:FE default 10.141.0.2
16[dgxsuperpod->device]% tablelist
17Type |Hostname (key) |MAC |Category |Ip
18----------------------|----------------|------------------|----------------|---------------
19HeadNode |dgxsuperpod |FA:16:3E:B4:39:DB | |10.141.255.254
20PhysicalNode |dgx001 |FA:16:3E:D5:87:71 |default |10.141.0.1
21PhysicalNode |dgx002 |FA:16:3E:BE:05:FE |default |10.141.0.2
22[dgxsuperpod->device]% dfh
23Filesystem Size Used Avail Use% Mounted on
24devtmpfs 1.8G 0 1.8G 0% /dev
25tmpfs 1.9G 0 1.9G 0% /dev/shm
26tmpfs 1.9G 33M 1.8G 2% /run
27tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
28/dev/vdb1 25G 17G 8.7G 66% /
29tmpfs 374M 0 374M 0% /run/user/0
cmsh 会话无需重启即可使别名生效。
cmsh 脚本中的默认参数#
在 cmsh 脚本中,可以使用参数 $1、$2 等来传递参数。如果传递的参数为空,则参数所取的值也保持为空。但是,如果参数格式带有 -<value> 形式的后缀,则当传递的参数为空时,<value> 是参数采用的默认值。
1[root©dgxsuperpod ~]# cat .cm/cmsh/encrypt-node-disk.cmsh home
2device use ${1-dgx001}
3set disksetup /root/my-encrypted-node-disk.xml set revision ${2-test}
4commit
脚本可以在没有参数(参数值为空)的情况下运行,在这种情况下,它将参数的默认值 dgx001 设为
[root©dgxsuperpod ~]# cmsh [dgxsuperpod]% encrypt-node-disk [dgxsuperpod->device[dgx001]]%
脚本可以在带有参数(此处为 dgx002)的情况下运行,在这种情况下,它将参数的传递值 dgx002 设为
1[root©dgxsuperpod ~]# cmsh
2[dgxsuperpod]% encrypt-node-disk dgx002
3[dgxsuperpod->device[dgx002]]%
cmsh 选项#
选项用法信息通过 cmsh –h
显示
1Usage:
2cmsh [options] [hostname[:port]] cmsh [options] -c <command>
3cmsh [options] -f <filename>
4Options:
5--help|-h
6 Display this help
7--noconnect|-u
8 Start unconnected
9--controlflag| -z
10 ETX in non-interactive mode
11--color <yes/no>
12 Define usage of colors
13--spool <directory>
14 Alternative /var/spool/cmd
15--tty| -t
16 Pretend a TTY is available
17--noredirect| -r
18 Do not follow redirects
19--norc| -n
20 Do not load cmshrc file on start-up
21--noquitconfirmation| -Q
22 Do not ask for quit confirmation
23--echo| -x
24 Echo all commands
25--quit|-q
26 Exit immediately after error
27--disablemultiline|-m
28 Disable multiline support
29--hide-events
30 Hide all events by default
31--disable-events
32 Disable all events by default
33Arguments:
34hostname
35 The hostname or IP to connect to
36command
37 A list of cmsh commands to execute
38filename
39 A file which contains a list of cmsh commands to execute
40Examples:
41cmsh run in interactive mode
42cmsh -c device status run the device status command and exit
43cmsh --hide-events -c device status run the device status command and exit, without
44showing any events that arrive during this time cmsh -f some.file -q -x run and echo the commands from some.file, exit
cmsh(8) 还有一个主页,它比帮助文本更广泛。但是,它不涵盖模式和交互行为。
cmsh 中的级别、模式、帮助和命令语法#
cmsh 的顶层是在不带任何选项输入 cmsh 时所处的级别。
为了避免命令过多而使用户不知所措,集群管理功能已分组并放置在单独的 cmsh 模式级别中。模式级别和级别的关联对象构成了顶层下可用的层次结构。
存在与使用此层次结构进行管理相关的面向对象的术语。要执行集群管理功能,管理员需要通过 cmsh 下降到适当的模式和对象,并执行与该模式或对象相关的操作。
例如,在用户模式下,可以添加或删除表示用户实例的对象 userthree。在对象 userthree 中,管理员可以管理其属性。属性可以是密码 password123 或主目录 /home/userthree 等数据。
在 cmsh 顶层键入 help 会显示顶层命令。
1alias ......................... Set aliases
2category ...................... Enter category mode
3cert .......................... Enter cert mode
4cloud ......................... Enter cloud mode
5cmjob ......................... Enter cmjob mode
6color ......................... Manage console text color settings
7configuration overlay ......... Enter configuration overlay mode
8connect ....................... Connect to cluster
9delimiter ..................... Display/set delimiter
10device ........................ Enter device mode
11disconnect .................... Disconnect from cluster
12edgesight...................... Enter edgesight mode
13etcd .......................... Enter etcd mode
14events ........................ Manage events
15exit .......................... Exit from current object or mode
16export ........................ Display list of aliases current list formats
17fspart ....................... Enter fspart mode
18group ......................... Enter group mode
19groupingsyntax ................ Manage the default grouping syntax
20help .......................... Display this help
21hierarchy .................... Enter hierarchy mode
22history ....................... Display command history
23keyvaluestore ................ Enter keyvaluestore mode
24kubernetes .................... Enter kubernetes mode
25list .......................... List state for all modes
26main .......................... Enter main mode
27modified ...................... List modified objects
28monitoring .................... Enter monitoring mode
29network ....................... Enter network mode
30nodegroup ..................... Enter nodegroup mode
31partition ..................... Enter partition mode
32process ....................... Enter process mode
33profile ....................... Enter profile mode
34quit .......................... Quit shell
35quitconfirmation .............. Manage the status of quit confirmation
36rack .......................... Enter rack mode
37refresh ....................... Refresh all modes
38run ........................... Execute cmsh commands from specified file
39session ....................... Enter session mode
40softwareimage ................. Enter softwareimage mode
41task .......................... Enter task mode
42time .......................... Measure time of executing command
43unalias ....................... Unset aliases
44unmanagednodeconfiguration .... Enter unmanagednodeconfiguration mode
45user .......................... Enter user mode
46watch ......................... Execute a command periodically, showing output
47wlm ........................... Enter wlm mode
cmsh 内的所有级别都提供这些顶层命令。将命令作为 help 的参数传递可以获得其详细信息
1[myheadnode]% help run
2Name: run - Execute all commands in the given file(s)
3Usage: run [OPTIONS] <filename> [<filename2> …]
4Options: -x, --echo
5 Echo all commands
6 -q, --quit
7 Exit immediately after error
8[myheadnode]%
在一般情况下,在任何模式级别或对象内调用 help,不带参数,都会提供两个列表:#. 在标题 To: 下:顶层命令列表。#. 在调用它的级别标题下:可以在该级别使用的命令列表。
例如,进入会话模式,然后键入 help 会首先显示标题为 Top 的输出,其次显示标题为 session 的输出
1[myheadnode]% session
2[myheadnode->session]% help
3============================ Top =============================
4alias ......................... Set aliases
5category ...................... Enter category mode
6ceph .......................... Enter ceph mode
7...
8========================== session ===========================
9id ....................... Display current session id
10killsession .............. Kill a session
11list ..................... Provide overview of active sessions
12[myheadnode->session]%
使用对象#
cmsh 中的模式与称为对象的关联数据分组一起工作。例如,设备模式与设备对象一起工作,网络模式与网络对象一起工作。用于处理对象的命令在所有模式中都具有相似的行为。并非所有命令都存在于每个模式中,也并非所有命令都与显式对象一起运行(表 7)。
表 7. 命令和对象
命令 |
描述 |
---|---|
|
使用指定的对象。即:使指定的对象成为当前对象 |
|
创建对象并使用它 |
|
分配新对象 |
|
取消分配对象 |
|
清除对象的值 |
|
克隆对象并使用它 |
|
将对对象进行的本地更改提交到 CMDaemon |
|
撤消对对象进行的本地更改 |
|
列出当前级别的所有对象 |
|
对 list 命令的显示顺序进行排序 |
|
为 list 输出设置格式偏好 |
|
对多个对象执行一组命令 |
|
显示对象的所有属性 |
|
交换(交换)两个对象的名称 |
|
显示对象的指定属性 |
|
设置对象的指定属性 |
|
为对象的指定属性设置默认值。 |
|
为多值属性的对象属性追加值 |
|
为多值属性的对象属性中删除值 |
|
列出具有未提交的本地更改的对象 |
|
列出依赖于该对象的对象 |
|
对对象的属性执行验证检查 |
|
从当前对象或模式级别退出 |
本节通过几个示例演示了如何使用这些命令处理对象。
use 和 exit#
1[dgxsuperpod->device]% use dgx001
2[dgxsuperpod->device[dgx001]]% status
3dgx001 ............. [ UP ]
4[dgxsuperpod->device[dgx001]]% exit
5[dgxsuperpod->device]%
在前面的示例中,从设备模式内发出的 use dgx001 使 dgx001 成为当前对象。提示符会相应地更改。然后,不带参数的 status 命令仅返回 dgx001 的状态信息,因为使对象成为当前对象会使该模式级别内的后续命令仅应用于该对象。最后,exit 命令退出当前对象级别。
add、commit 和 remove#
本节中介绍的命令具有许多与之相关的隐式概念。因此,首先给出一个说明性会话作为示例。然后解释会话中发生的事情,使读者熟悉命令和相关概念。
1[dgxsuperpod->device]% add physicalnode dgx100 10.141.0.100 [dgxsuperpod->device*[dgx100*]]% commit
2[dgxsuperpod->device[dgx100]]% category add test-category [dgxsuperpod->category*[test-category*]]% commit
3[dgxsuperpod->category[test-category]]% remove test-category
4[dgxsuperpod->category*]% commit
5Successfully removed 1 Categories
6Successfully committed 0 Categories
7[dgxsuperpod->category]% device remove dgx100
8[dgxsuperpod->category]% device
9[dgxsuperpod->device*]% commit
10Successfully removed 1 Devices Successfully committed 0 Devices [dgxsuperpod->device]%
add
:此命令在其关联的模式内创建一个对象,并且在 cmsh 中,提示符会下降到刚刚创建的对象级别。因此,在前面示例的开头,在设备模式内,添加了一个名为 dgx100 的新对象。对于此对象,可以设置类型 (physicalnode) 和 IP 地址 (10.141.0.100) 等属性。当执行 add 命令时,节点对象级别 ([dgx100*]) 会自动从设备模式下降到该级别。执行后,实现的状态是已创建具有某些属性的对象。但是,它仍处于临时、修改状态,尚未持久化。提示符中的星号标记是有用的修改状态提醒,每个星号表示一个标记对象,该对象具有未保存的修改属性。在本例中,未保存的属性是 IP 地址设置、节点名称和节点类型。
add
命令——语法注意事项
在大多数模式下,add 命令仅接受一个参数,即要创建的对象的名称。但是,在设备模式下,还需要一个额外的对象类型,在本例中为 physicalnode,作为参数,并且还可以指定一个可选的额外 IP 参数。在设备模式下对 help add 的响应给出了详细信息
1[myheadnode->device]% help add
2Name:
3add - Create a new device of the given type with specified hostname. The IP address may also be set.
4Usage:
5add <type> <hostname> [IP address]
6Arguments:
7type
8chassis, genericdevice, gpuunit, litenode, cloudnode, physicalnode, headnode, powerdistributionunit, racksensor, ethernetswitch, ibswitch, myrinetswitch
commit
:此命令是保存执行命令后所做任何更改的进一步步骤。在本例中,在第二行中,它保存了 dgx100 对象及其属性。如果已保存该模式级别及以下级别的设置,则提示符的星号标记将消失。
如果命令之前声明了模式,则可以直接从该级别访问顶层模式,例如类别模式。因此,在运行 add 命令之前声明模式类别允许添加指定的类别 test-category。同样,当执行 add 命令时,类别模式内的 test-category 对象级别会自动下降到该级别。
commit -w|--wait
:默认情况下,commit 命令不会等待状态更改完成。这意味着提示符会立即变为可用。这意味着更改是否已发生并不明显,如果使用 cmsh 编写脚本来克隆软件映像 (2.1.2),则会导致问题。-w|--wait
commit 命令的选项通过等待任何相关的后台任务(例如克隆软件映像)完成,然后再使提示符可用,从而解决了此问题。
remove
:此命令删除其关联模式内的指定对象。成功执行后,如果提示符位于对象级别,则提示符会向上移动一级。尚未执行删除;这只是一个建议的删除。这由星号标记指示,该标记保持可见,直到执行 commit 命令并且保存 test-category 删除。如果非本地模式与命令关联,则 remove 命令还可以删除非本地模式中的对象。这在示例中进行了说明,其中从类别模式内,在运行 dgx100 的 remove 命令之前声明了设备模式。建议的删除已配置但未永久化,但在本例中,类别模式中未显示星号标记,因为更改是在设备模式中。要下降到设备模式,请执行模式命令“device”。星号标记出现以提醒管理员该模式仍存在未提交的更改(要删除的节点)。commit 命令将删除对象所在的任何模式——星号标记的不存在不会改变 commit 的有效性。
remove -d|--data
:默认情况下,remove
命令删除对象,而不是表示的数据。例如,如果在 softwareimage 模式下,使用 remove(不带选项)命令删除了软件映像。就集群管理器而言,映像在运行 commit 后被删除。但是,该软件映像目录中的数据不会被删除。-d| --data
remove 命令的选项安排删除指定映像的目录中的数据,以及删除其关联的对象。remove -a|--all
:默认情况下,remove 命令不会删除软件映像修订版。-a| --all option
remove 命令的选项还会删除所有软件映像修订版。
clone、modified 和 swap#
在前面的示例中创建的节点对象 dgx100 可以按如下方式克隆到 dgx101
1[dgxsuperpod->device]% clone dgx100 dgx101
2Warning: The Ethernet switch settings were not cloned, and have to be set manually [dgxsuperpod->device*[dgx101*]]% exit
3[dgxsuperpod->device*]% modified
4State Type Name
5------ ------------------------ -----------------------------------
6+ Device dgx101
7[dgxsuperpod->device*]% commit
8[dgxsuperpod->device]%
9[dgxsuperpod->device]% remove dgx100
10[dgxsuperpod->device*]% commit
11[dgxsuperpod->device]%
modified 命令用于检查哪些对象具有未提交的更改,并且使用 commit 保存了被视为已修改的新对象 dgx101。然后使用 remove 命令删除设备 dgx100。commit 执行删除。modified 命令对应于未保存实体图标图 11 的功能。前面示例中 modified 命令的输出中 State 列中的 + 条目表示该对象是新添加的对象,但尚未提交。同样,~ 条目表示在提交时要删除的对象,而空白条目表示对象已被修改,但未涉及添加或删除。克隆对象是复制完全配置的对象的便捷方法。克隆设备对象时,cmsh 将尝试使用多种启发式方法自动分配新的 IP 地址。在前面的示例中,dgx101 被分配了 IP 地址 10.141.0.101。该尝试尽了最大努力,但不保证对象配置正确。因此,集群管理员应检查结果。有时,对象可能被错误命名或物理交换。例如,dgx001 与机架中的 dgx002 物理交换,或者硬件设备 eth0 被内核错误命名,应为 eth1。在这种情况下,使用集群管理器前端交换它们的名称可能比更改物理设备或调整内核配置更方便。这相当于将所有属性从一个名称交换到另一个名称。例如,如果头节点上的两个接口必须交换名称,则可以按如下方式完成
1[dgxsuperpod->device]% use dgxsuperpod
2[dgxsuperpod->device[dgxsuperpod]]% interfaces
3[dgxsuperpod->device[dgxsuperpod]->interfaces]% list
4Type Network device name IP Network
5------------ -------------------- ---------------- --------------
6physical eth0 [dhcp] 10.150.4.46 externalnet
7physical eth1 [prov] 10.141.255.254 internalnet
8[headnode->device[dgxsuperpod]->interfaces]% swap eth0 eth1; commit [headnode->device[dgxsuperpod]->interfaces]% list
9Type Network device name IP Network
10------------ -------------------- ---------------- --------------
11physical eth0 [prov] 10.141.255.254 internalnet
12physical eth1 [dhcp] 10.150.4.46 externalnet
13[dgxsuperpod->device[dgxsuperpod]->interfaces]% exit; exit
get、set 和 refresh#
get
命令用于从对象检索指定的属性,而 set 用于设置它
1[dgxsuperpod->device]% use dgx101
2[dgxsuperpod->device[dgx101]]% get category test-category
3[dgxsuperpod->device[dgx101]]% set category default [dgxsuperpod->device*[dgx101*]]% get category default
4[dgxsuperpod->device*[dgx101*]]% modified
5State Type Name
6------ ------------------------ -------------------------------
7 Device dgx101
8[dgxsuperpod->device*[dgx101*]]% refresh
9[dgxsuperpod->device[dgx101]]% modified
10No modified objects of type device
11[dgxsuperpod->device[dgx101]]% get category test-category
12[dgxsuperpod->device[dgx101]]%
在这里,通过使用 get 命令检索 dgx101 对象的 category 属性。然后使用 set 命令更改属性。使用 get 确认属性的值已更改,并且 modified 命令再次确认 dgx101 具有本地未提交的更改。refresh 命令撤消所做的更改,并且对应于查看未保存实体时基本视图中的还原按钮(图 11)。然后,modified 命令确认不存在本地更改。最后,get 命令再次确认未发生本地更改。属性可以采用的可能值包括字符串和布尔值
可以将字符串设置为任何对象的修订标签
1[dgxsuperpod->device[dgx101]]% set revision "changed on 10th May"
2[dgxsuperpod->device*[dgx101*]]% get revision
3[dgxsuperpod->device*[dgx101*]]% changed on 10th May 2011
当使用带有输入文本的 shell 脚本来标记和跟踪向 cmsh 发送命令时的修订版时,这可能很有用。如何在 2.4.1 中介绍如何从 shell 向 cmsh 发送命令。对于布尔值,值 yes、1、on 和 true 彼此等效,它们的相反值 no、0、off 和 false 也是如此。这些值不区分大小写。
clear#
1[dgxsuperpod->device]% set dgx101 mac 00:11:22:33:44:55
2[dgxsuperpod->device*]% get dgx101 mac
300:11:22:33:44:55
4[dgxsuperpod->device*]% clear dgx101 mac
5[dgxsuperpod->device*]% get dgx101 mac
600:00:00:00:00:00
7[dgxsuperpod->device*]%
get
和 cite>set 命令用于查看和设置 dgx101 的 MAC 地址,而无需运行 use
命令使 dgx101 成为当前对象。clear
命令然后取消设置属性的值。clear 的结果取决于它作用的属性类型。对于字符串属性,分配空字符串,而对于 MAC 地址,分配特殊值 00:00:00:00:00:00。
list、format 和 sort#
list 命令用于列出模式中的对象。该命令有很多选项。可以通过运行 help list 查看当前模式有效的选项。f|–format 选项在所有模式下都可用,并接受格式字符串作为参数。该字符串指定为每个对象打印哪些属性,以及在输出行中用于显示每个属性的字符数。在以下示例中,请求设备模式的对象列表,显示每个设备对象的 hostname、switchports 和 ip 属性。
1[headnode->device]% list -f hostname:14,switchports:15,ip
2hostname (key) switchports ip
3-------------- --------------- --------------------
4apc01 10.142.254.1
5headnode switch01:46 10.142.255.254
6dgx001 switch01:47 10.142.0.1
7dgx002 switch01:45 10.142.0.2
8switch01 10.142.253.1
9[headnode->device]%
运行不带参数的 list 命令使用模式的当前格式字符串。运行不带参数的 format 命令会显示当前格式字符串,并显示所有可用属性,包括每个属性的描述
1[headnode->device]% format
2Current list printing format:
3-----------------------------
4type:22, hostname:[16-32], mac:18, category:[16-32], ip:15, network:[14-32], status:[16-32]
5Valid fields:
6-------------
7activation : Date on which node was defined
8additionalhostnames: List of additional hostnames that should resolve to the interfaces IP address
9allownetworkingrestart : Allow node to update ifcfg files and restart networking
10banks : Number of banks
11...
format 命令的打印规范使用分隔符 : 分隔参数和参数列的宽度值。例如,可以使用以下命令设置宽度为 10
1[headnode->device]% format hostname:10
2[headnode->device]% list
3hostname (
4----------
5apc01
6headnode
7dgx001
8dgx002
9switch01
可以使用方括号设置宽度范围,从最小值到最大值。从适合列中所有字符的范围中选择可能的单个最小宽度。如果列中的字符数超过最大值,则选择最大值。例如
1[headnode->device]% format hostname:[10-14]
2[headnode->device]% list
3hostname (key)
4--------------
5apc01
6headnode
7dgx001
8dgx002
9switch01
要查看的参数可以从有效字段列表中选择,方法是运行不带任何选项的 format 命令,如前所示。format
命令可以将由逗号分隔列表中的多个参数组成的字符串作为参数。每个参数都采用冒号分隔的宽度规范。
1[headnode->device]% format hostname:[10-14],switchports:14,ip:20
2[headnode->device]% list
3hostname (key) switchports ip
4-------------- -------------- --------------------
5apc01 10.142.254.1
6headnode switch01:46 10.142.255.254
7dgx001 switch01:47 10.142.0.1
8dgx002 switch01:45 10.142.0.2
9switch01 10.142.253.1
不带参数的 format 命令的输出显示当前的列表打印格式字符串,带有空格。通常,format 命令中使用的字符串可以使用引号 ("
) 括起来设置
1[headnode->device]% format "hostname:[16-32], network:[14-32], status:[16-32]"
或者删除空格
1[headnode->device]% format hostname:[16-32],network:[14-32],status:[16-32]
可以使用 -r|–reset 选项恢复默认参数设置
1[headnode->device]% format -r
2[headnode->device]% format I head -3
3Current list printing format:
4-----------------------------
5type:22, hostname:[16-32], mac:18, category:[16-32], ip:15, network:[14-32], status:[16-32]
6[headnode->device]%
当运行 list 命令时,sort 命令按字母顺序对指定参数的输出进行排序。排序根据传递给 sort 命令的参数的优先级进行
1[headnode->device]% sort type mac
2[headnode->device]% list -f type:15,hostname:15,mac
3type hostname (key) mac
4--------------- --------------- --------------------
5HeadNode headnode 08:0A:27:BA:B9:43
6PhysicalNode dgx002 00:00:00:00:00:00
7PhysicalNode log001 52:54:00:DE:E3:6B
8[headnode->device]% sort type hostname
9[headnode->device]% list -f type:15,hostname:15,mac
10type hostname (key) mac
11--------------- --------------- --------------------
12HeadNode headnode 08:0A:27:BA:B9:43
13PhysicalNode log001 52:54:00:DE:E3:6B
14PhysicalNode dgx002 00:00:00:00:00:00
15[headnode->device]% sort mac hostname
16[headnode->device]% list -f type:15,hostname:15,mac
17type hostname (key) mac
18--------------- --------------- --------------------
19PhysicalNode dgx002 00:00:00:00:00:00
20HeadNode headnode 08:0A:27:BA:B9:43
21PhysicalNode log001 52:54:00:DE:E3:6B
前面的 sort 命令也可以使用 list 命令的 -s|–sort 选项指定
1[headnode->device]% list -f type:15,hostname:15,mac --sort type,mac
2[headnode->device]% list -f type:15,hostname:15,mac --sort type,hostname
3[headnode->device]% list -f type:15,hostname:15,mac --sort mac,hostname
append 和 removefrom#
当处理对象的可以一次采用多个值的属性(值列表)时,可以使用 append 和 removefrom 命令分别向列表追加和从列表中删除元素。如果追加了多个元素,则应以空格分隔它们。set 命令也可以用于立即分配新列表,覆盖现有列表。在以下示例中,值被追加到设备 dgx001 的 powerdistributionunits 属性并从中删除。
powerdistributionunits 属性表示特定设备连接到的配电单元上的端口列表。当对节点执行电源操作时,此信息是相关的。
1[dgxsuperpod->device]% use dgx001
2[dgxsuperpod->device[dgx001]]% get powerdistributionunits
3apc01:1
4[...device[dgx001]]% append powerdistributionunits apc01:5
5[...device*[dgx001*]]% get powerdistributionunits
6apc01:1 apc01:5
7[...device*[dgx001*]]% append powerdistributionunits apc01:6
8[...device*[dgx001*]]% get powerdistributionunits
9apc01:1 apc01:5 apc01:6
10[...device*[dgx001*]]% removefrom powerdistributionunits apc01:5 [...device*[dgx001*]]% get powerdistributionunits
11apc01:1 apc01:6
12[...device*[dgx001*]]% set powerdistributionunits apc01:1 apc 01:02 [...device*[dgx001*]]% get powerdistributionunits
13apc01:1 apc01:2
Bright Cluster Manager 管理员手册的第 4 章提供了有关电源设置和操作的更多信息。
usedby#
仅当其他对象没有对其的引用时,才有可能删除特定对象。为了帮助管理员发现依赖于(“使用”)指定对象的对象列表,可以使用 usedby 命令。在以下示例中,请求了依赖于设备 apc01 的对象。powerdistributionunits 的 usedby 属性指示设备对象 dgx001 和 dgx002 包含对对象 apc01 的引用(“使用”)。此外,apc01 设备本身也显示为处于 up 状态,表明 apc01 对自身的依赖性。如果要删除设备,则首先必须删除对其的两个引用,然后必须使用 close 命令将设备置于 CLOSED 状态。
1[dgxsuperpod->device]% usedby apc01
2Device used by the following:
3Type Name Parameter
4---------------- ---------- ----------------------
5Device apc01 Device is up
6Device dgx001 powerDistributionUnits
7Device dgx002 powerDistributionUnits
8[dgxsuperpod->device]%
validate#
每当提交对对象的更改时,集群管理基础架构都会检查要提交的对象的一致性。如果一个或多个一致性要求未满足,则 cmsh 会报告必须在提交更改之前解决的冲突。validate 命令允许在不提交本地更改的情况下检查对象的一致性。
1[dgxsuperpod->device]% use dgx001
2[dgxsuperpod->device[dgx001]]% clear category
3[dgxsuperpod->device*[dgx001*]]% commit
4Code Field Message
5----- ------------------------ ---------------------------
61 category The category should be set
7[dgxsuperpod->device*[dgx001*]]% set category default
8[dgxsuperpod->device*[dgx001*]]% validate
9All good
10[dgxsuperpod->device*[dgx001*]]% commit
11[dgxsuperpod->device[dgx001]]%
show#
show 命令用于显示特定对象的参数和值。例如,对于对象 dgx001,显示的属性是
1[dgxsuperpod->device[dgx001]]% show
2Parameter Value
3--------------------------------------- ------------------------------------
4Activation Thu, 03 Aug 2017 15:57:42 CEST
5BMC Settings <submode>
6Block devices cleared on next boot
7Category default
8...
9Data node no
10Default gateway 10.141.255.254 (network: internalnet)
11...
12Software image default-image
13Static routes <0 in submode>
14...
assign 和 unassign#
assign 和 unassign 命令类似于 add 和 remove。从系统管理员的角度来看,assign 和 add 之间的区别在于,assign 从现有名称的选择中设置具有可设置属性的对象,而 add 设置具有可设置属性的对象,其中包括要给定的名称。这使得 assign 适用于无法使用特定对象选择的多个版本的情况。
例如
如果要将节点配置为使用特定的 Slurm 设置运行,则可以使用 assign 命令为该节点分配 slurmclient 角色。该节点不能同时使用其他 Slurm 设置分配另一个 slurmclient 角色。只能更改分配的 Slurm 客户端角色中的设置。
如果要将节点配置为使用添加的接口 eth3 和 eth4 运行,则可以使用 add 命令将两个物理接口都添加到该节点。
assign 命令当前在 cmsh 中使用的唯一位置是在角色子模式中,该子模式在类别模式、configurationoverlay 模式或设备模式下可用。在角色中,assign 用于分配角色对象,以便为类别、配置覆盖或设备提供与该角色关联的属性。
import#
import 命令是一个高级命令,在角色中工作。它用于在实体之间克隆角色。节点继承其所属类别和配置覆盖中的所有角色。
1[root©headnode ~]# cmsh
2[headnode]% device roles dgx001
3[headnode->device[dgx001]->roles]% list
4Name (key)
5-------------------------------
6[category:default] cgroupsupervisor
7[category:default] slurmclient
如果仅针对 dgx001,需要在 slurmclient 中对默认角色进行小幅更改,则可以从类别或覆盖导入角色。导入角色会复制对象并将重复值分配给 dgx001。
这与仅将 slurmclient 角色分配给 dgx001 不同,因为导入提供来自类别或覆盖的值,而分配提供未设置的值。
运行 import 后,就像 assign 一样,在 dgx001 级别对角色进行的更改将保留在该节点级别,并且在类别级别或覆盖级别 slurmclient 角色中所做的更改不会自动由 dgx001 slurmclient 角色继承。
1[headnode->device[dgx001]->roles]% import<TAB><TAB>
2cephmds cloudgateway elasticsearch
3...and other available roles including slurmclient...
4[headnode->device[dgx001]->roles]% import --overlay slurm-client slurmclient
5[headnode->device*[dgx001*]->roles*]% list
6Name (key)
7-------------------------------
8[category:default] cgroupsupervisor
9slurmclient
10[headnode->device*[dgx001*]->roles*]% set slurmclient queues dgx1q
11[headnode->device*[dgx001*]->roles*]% commit
以上显示,在键入 import 后,使用 Tab 补全提示角色列表,并且配置覆盖级别的设置被引入到 dgx001 的 slurmclient 角色中。然后,节点级别的 slurmclient 值会覆盖任何覆盖级别或类别级别的设置,正如新的列表输出所建议的那样。然后,dgx001 的 Slurm 客户端设置与覆盖级别的设置相同。唯一的变化是为 dgx001 配置了一个特殊的队列 dgx1q。
角色模式下的 import
命令可以复制任何两个实体之间的任何角色。可以使用选项从类别 (-c|--category
)、节点 (-n|--node
) 或覆盖 (-o|--overla``y), 如其帮助文本 (``help import
) 中所示。
高级 cmsh 功能#
本节介绍 cmsh 的一些高级功能。
CLI 编辑#
来自 readline 库的 CLI 编辑和历史记录功能可用。http://tiswww.case.edu/php/chet/readline/rluserman.html 提供了完整的按键绑定列表。对于熟悉使用 readline 运行的 bash shell 的用户,cmsh 中 readline 提供的最有用和最熟悉的功能可能是
命令和参数的 Tab 补全。
能够使用 <ctrl>-r 或使用向上和向下箭头键从命令历史记录中选择较早的命令。
历史记录和时间戳#
cmsh 中的 history 命令显式显示 cmsh 命令历史记录作为列表。history 命令的 --timestamps|-t
选项显示带有时间戳的命令历史记录。
1[headnode->device[dgx001]]% history | tail -3
2use dgx001
3history
4history | tail -3
5[headnode->device[dgx001]]% history -t | tail -3
6Thu Dec 3 15:15:18 2015 history
7Thu Dec 3 15:15:43 2015 history | tail -3
8Thu Dec 3 15:15:49 2015 history -t | tail -3
此历史记录保存在 cmsh 用户目录中的文件 .cm/.cmshhistory 中。文件中的时间戳采用 unix 纪元时间格式,可以使用标准 date 实用程序转换为人类友好的格式。
1[root@dgxsuperpod ~]# tail -2 .cm/.cmshhistory 1615412046
2device list
3[root@dgxsuperpod ~]# date -d ©1615412046
4Wed Mar 10 22:34:06 CET 2021
混合 cmsh 和 Unix Shell 命令#
管理员通常需要在执行集群管理任务时能够执行 unix shell 命令。因此,集群管理器 shell cmsh 允许用户在命令前缀为 ! 字符时在子 shell 中执行命令
1[dgxsuperpod]% !hostname -f
2dgxsuperpod.cm.cluster
3[dgxsuperpod]%
单独执行 !
命令将启动交互式登录子 shell。通过退出子 shell,用户将返回到 cmsh 提示符。除了简单地从 cmsh 中执行命令外,OS shell 命令的输出也可以在 cmsh 中使用。这通过使用大多数 unix shell 中可用的旧式“反引号语法”来完成。
1[dgxsuperpod]% device use `hostname`
2[dgxsuperpod->device[dgxsuperpod]]% status
3dgxsuperpod ................ [ UP ]
4[dgxsuperpod->device[dgxsuperpod]]%
输出重定向#
与 unix shell 一样,cmsh 也支持通过常用运算符(如“>”、“”>>”和“|”)将输出重定向到 shell。
1[dgxsuperpod]% device list > devices
2[dgxsuperpod]% device status >> devices
3[dgxsuperpod]% device list | grep dgx001
4Type Hostname (key) MAC (key) Category
5-------------- -------------- ------------------- ----------
6PhysicalNode dgx001 00:E0:81:2E:F7:96 default
输入重定向#
cmsh 可以进行输入重定向。与往常一样,输入可以是字符串或文件。例如,对于一个文件 runthis,其中存储了一些命令
1[root©dgxsuperpod ~]# cat runthis
2device
3get dgx001 ip
可以使用重定向运算符运行命令,如下所示
1[root©dgxsuperpod ~]# cmsh < runthis
2device
3get dgx001 ip
410.141.0.1
使用 -f 选项运行文件可以避免回显命令
1[root©dgxsuperpod ~]# cmsh -f runthis
210.141.0.1
ssh#
ssh 命令从 cmsh 的设备模式内运行。如果从 cmsh 内启动 ssh 会话,则它会清除屏幕并连接到指定的节点。从 ssh 会话退出会将用户返回到 cmsh 启动点。
1[headnode]% device ssh dgx001
2<screen is cleared>
3<some MOTD text and login information is displayed>
4[root©dgx001 ~]# exit
5Connection to dgx001 closed.
6[headnode]% device use headnode
7[headnode->device[headnode]]% #now let us connect to the head node from the head node object
8[headnode->device[headnode]]% ssh
9<screen is cleared>
10<some MOTD text and login information is displayed>
11[root©headnode ~]# exit
12logout
13Connection to headnode closed.
14[headnode->device[headnode]]%
在 cmsh 中运行 ssh 的替代方法是在 cmsh 中的任何位置使用 !ssh 在子 shell 中启动它。
time#
cmsh 中的 time 命令是标准 unix time 命令的简化版本。time 命令将其参数作为要在 cmsh 中执行的第二个命令。执行 time 命令时,将执行第二个命令。在 time 命令执行完成后,将显示第二个命令执行所花费的时间。
1[headnode->device]% time ds dgx001
2dgx001 .................. [ UP ]
3time: 0.108s
watch#
cmsh 中的 watch
命令是标准 unix watch 命令的简化版本。watch
命令将其参数作为要在 cmsh 中执行的第二个命令。执行 watch 命令时,默认情况下每两秒执行一次第二个命令,并显示该第二个命令的输出。
可以使用 --interval|-n
选项设置 watch 命令的重复间隔。运行中的 watch 命令可以使用 <Ctrl>-c 中断。
1[headnode->device]% watch newnodes
2screen clears
3Every 2.0s: newnodes Thu Dec 3 13:01:45 2015
4No new nodes currently available.
5[headnode->device]% watch -n 3 status -n dgx001,dgx002
6screen clears
7Every 3.0s: status -n dgx001,dgx002 Thu Jun 30 17:53:21 2016
8dgx001 ...............[ UP ]
9dgx002 ...............[ UP ]
foreach#
通常情况下,能够并行地在多个对象上执行 cmsh 命令是很方便的。foreach 命令在多种 cmsh 模式下都可用以实现此目的。foreach 命令接受一个以空格分隔的对象名称列表(对象的键)和一个必须用括号括起来的命令列表。然后,foreach 命令将迭代遍历这些对象,并在每次迭代中对迭代对象执行命令列表。
foreach 命令的基本语法:foreach <对象1> <对象2> · · · ( <命令1>; <命令2> · · · )
1[dgxsuperpod->device]% foreach dgx001 dgx002 (get hostname; status)
2dgx001
3dgx001 ............. [ UP ]
4dgx002
5dgx002 ............. [ UP ]
6[dgxsuperpod->device]%
通过 foreach 命令,可以同时对对象组执行 set 命令,或者对对象组执行操作。在许多情况下,range 命令 (2.4.4.12) 提供了另一种替代方案。foreach 命令的高级选项:可以从帮助页面查看 foreach 命令的高级选项。
1[root©headnode ~]# cmsh -c "device help foreach"
这些选项可以分为:分组选项(list,type)、添加选项、条件选项和循环选项。
1-n|--nodes, -g| --group, -c| --category, -r| --rack, -h| --chassis, -e| --overlay,-l| --role, -m| --image, -u| --union, -i| --intersection
2-t| --type chassis| genericdevice| gpuunit| litenode| cloudnode| node| physicalnode| headnode| powerdistributionunit| racksensor| ethernetswitch| ibswitch| myrinetswitch| unmanagednode
前文显示了两种分组选项的形式。第一种形式使用被分组对象的列表,而第二种形式使用被分组对象的类型。这些选项根据使用的 cmsh 模式而变得可用。例如,在 cmsh 的设备模式下,foreach 命令有许多可用的分组选项。如果使用分组选项指定了对象,则可以循环遍历指定的对象。
例如,对于列表形式,–-category|-c
选项接受节点类别参数(或多个类别),而 –-node|-n
选项接受节点列表参数。节点列表 (2.4.4.10) 也可以使用以下更详细的语法:<node>,…,<node>,<node>..<node>
1[demo->device]% foreach -c default (status)
2dgx001 ............. [ DOWN ]
3dgx002 ............. [ DOWN ]
4[demo->device]% foreach -g rack8 (status)
5...
6[demo->device]% foreach -n dgx001,dgx008..dgx016,dgx032 (status)
7...
8[demo->device]%
对于类型形式,使用 -t|--type
选项,此选项的字面值必须是 node、cloudnode、virtualnode 等之一。如果使用多个分组选项,则默认情况下会执行并集操作。两种分组选项形式通常也用于 foreach 以外的命令中进行节点选择。 clone -o|--clone
:此选项允许在循环中克隆 (2.4.3.3) 对象。在以下示例中,从设备模式下,dgx001 用作基础对象,从中克隆 dgx022 到 dgx024 的其他节点。
1[headnode->device]% foreach --clone dgx001 -n dgx022..dgx024 () [headnode->device*]% list | grep node
2Type Hostname (key) Ip
3------------ -------------- -----------
4PhysicalNode dgx001 10.141.0.1
5PhysicalNode dgx022 10.141.0.22
6PhysicalNode dgx023 10.141.0.23
7PhysicalNode dgx024 10.141.0.24
8[headnode->device*]% commit
克隆的对象是占位符示意图和设置,其中某些设置(例如 IP 地址)的不同值由启发式方法决定。此时,对象克隆到其他节点的操作不会复制 dgx001 的软件磁盘镜像。 clone -a|--add
:如果指定设备类型的设备不存在,此选项将创建该设备。有效类型显示在帮助输出中,包括 physicalnode、headnode 和 ibswitch。
条件选项: -s|--status, -q|--quitonunknown
–-status|-s
选项允许根据设备状态 (2.1.1) 过滤节点。
1[headnode->device]% foreach -n dgx001..dgx004 --status UP (get IP)
210.141.0.1
310.141.0.3
由于 –status 选项也是一个分组选项,因此当运行多个分组选项时,默认情况下并集操作也适用于它。–-quitonunknown|-q
选项允许在检测到未知命令时退出 foreach 循环。循环选项: *, --verbose|-v
通配符 *
与 foreach 一起使用时,表示 list 命令为该模式列出的所有对象。它在没有分组选项的情况下使用。
1[myheadnode->device]% foreach * (get ip; status)
210.141.253.1
3switch01 ............ [ DOWN ]
410.141.255.254
5myheadnode .......... [ UP ]
610.141.0.1
7dgx001 .............. [ CLOSED ]
810.141.0.2
9dgx002 .............. [ CLOSED ]
10[myheadnode->device]%
另一个示例,通过在类别模式下运行 listnodes 命令,列出每个类别的所有节点。
1[headnode->category]% foreach * (get name; listnodes)
2default
3Type Hostname MAC Category Ip Network Status
4------------- --------- ------------------ --------- ---------- ------------ --------
5PhysicalNode dgx001 FA:16:3E:79:4B:77 default 10.141.0.1 internalnet [ UP ]
6PhysicalNode dgx002 FA:16:3E:41:9E:A8 default 10.141.0.2 internalnet [ UP ]
7PhysicalNode dgx003 FA:16:3E:C0:1F:E1 default 10.141.0.3 internalnet [ UP ]
–-verbose|-v
选项在正在运行的循环期间显示带有时间戳的循环标头,这有助于调试。
节点列表语法#
节点列表规范(如在 foreach 规范和其他地方使用的)可以是多种类型。以下是一些示例。
adhoc(使用逗号或空格)
示例:dgx001,dgx003,dgx005,dgx006
sequential(使用两个点或方括号)
示例:dgx001..dgx004 或等效地:dgx00[1-4],即:dgx001,dgx002,dgx003,dgx004
sequential 扩展展开(仅适用于方括号)
示例:node[001-002]s[001-005],即:dgx001s001,dgx001s002,dgx001s003,dgx001s004,dgx001s005,dgx002s001,dgx002s002,dgx002s003,dgx002s004,dgx002s005
基于机架
这旨在提示节点位于哪个机架中。因此:示例:r[1-2]n[01-03]
,即:r1n01,r1n02,r1n03,r2n01,r2n02,r2n03
这可能暗示有两个机架 r1 和 r2,每个机架有三个节点。示例:rack[1-2]dgx0[1-3]
,即:rack1dgx01,rack1dgx02,rack1dgx03,rack2dgx01,rack2dgx02,rack2dgx03
与前一个示例类似,但适用于命名更详细的节点。
sequential 排除(否定)
示例:dgx001..dgx005,-dgx002..dgx003,即:dgx001,dgx004,dgx005
sequential 步长(每 <步长> 步)
示例:dgx00[1..7:2]
,即:dgx001,dgx003,dgx005,dgx007
混合列表
方括号和两个点的输入规范不能在同一个参数中同时使用。除此之外,规范可以混合使用:示例:r1n001..r1n003,r2n003
,即:r1n001,r1n002,r1n003,r2n003
示例:r2n003,r[3-5]n0[01-03]
,即:r2n003,r3n001,r3n002,r3n003,r4n001,r4n002,\ r4n003,r5n001,r5n002,r5n003
示例:node[001-100],-node[004-100:4]
,即:100 个节点中的每个节点,除了每第四个节点。
包含节点列表的文件的路径
示例:*~/some/filepath/<包含节点列表的文件>* 插入符号 (^) 是 cmsh 中用于节点列表规范的特殊字符。它表示后面的字符串是要读取的文件路径。
groupingsyntax#
groupingsyntax 指的是点和方括号的用法。换句话说,它是如何标记分组以便将其接受为列表的语法。以这种方式指定的列表可以用于输入或输出目的。 groupingsyntax 命令使用以下选项设置分组语法。
bracket:方括号规范。
dot:两个点规范。
auto:默认值。设置 auto 意味着
点或方括号规范都接受作为输入。
点规范用于输出。
可以通过将其添加到 .cmshrc
点文件或 /etc/cmshrc (2.4.1) 中,使选择的 groupingsyntax 选项持久化。
1[root©headnode ~]# cat .cm/cmsh/.cmshrc
2groupingsyntax auto
range#
range 命令提供了一个交互式选项,用于在节点分组上执行基本的 foreach 命令。当选择分组选项后,cmsh 提示符会在大括号 ({}
) 内指示所选范围。
1[headnode->device]% range -n dgx0[01-24]
2[headnode->device{-n dgx001..024}]%
在前面的示例中,在设备级别应用的命令将应用于 24 个节点对象的范围。继续前面的会话—如果可以使用 -c
选项选择类别。如果默认类别只有三个节点,则显示的输出可能如下所示。
1[headnode->device{-n dgx001..024}]% range -c default
2[headnode->device{-c default}]% ds
3dgx001 [ UP ] state flapping
4dgx002 [ UP ]
5dgx003 [ UP ]
6Values can be set at device mode level for the selected grouping.
7[headnode->device{-c default}]% get revision
8[headnode->device{-c default}]% set revision test
9[headnode->device{-c default}]% get revision
10test test test
值也可以在子模式中设置。但是,无法停留在子模式中进行完全交互。必须使用分号(同一行上的新命令语句延续)语法进入子模式来完成设置,如下所示。
1[headnode->device{-c default}]% roles; assign pbsproclient; commit
2The range command can be regarded as a modal way to carry out an implicit foreach on the grouping object. Many administrators should find it easier than a foreach:
3[headnode->device{-c default}]% get ip
410.141.0.1
510.141.0.2
610.141.0.3
7[headnode->device{-c default}]% ..
8[headnode->device]% foreach -c default (get ip)
910.141.0.1
1010.141.0.2
1110.141.0.3
命令可以在 range 内运行。但是,即使可以这样做,在 range 内运行 pexec 命令通常也不是集群管理员的意图。
1[headnode->device]% range -n node[001-100]
2[headnode->device{-n node[001-100]]]% pexec -n node[001-100] hostname
上面启动了 100 个 pexec
命令,每个命令在 100 个节点中的每个节点上运行。range 命令的更多选项可以在该命令的帮助文本中看到(输出已截断)。
1[root©headnode ~]# cmsh -c "device help range"
2Name: range - Set a range of several devices to execute future commands on
3Usage: range [OPTIONS] * (command)
4range [OPTIONS] <device> [<device> ...] (command)
5Options: --show Show the current range
6--clear Clear the range
7-v, --verbose Show header before each element
8...
bookmark#
书签可以是
使用 bookmark 命令设置。
使用 goto 命令访问。
书签在 cmsh 中使用 bookmark 命令的参数设置,如下所示。
用户可以将当前位置设置为书签。
通过不使用任何参数。这与不为其设置名称相同。
通过使用任意参数。这与为其设置任意名称相同。
除了任何用户定义的书签名称外,cmsh 还会自动设置特殊名称:“-”。这始终是用户刚刚从 cmsh 层次结构中访问的上一个位置。
可以使用 -l|--list
选项列出所有已设置的书签。访问书签:可以使用 goto 命令访问书签。goto 命令可以接受以下参数:空白(无参数)、任何任意书签名称或 “-”。然后访问与所选参数对应的书签。
“-” 书签不需要以 goto
开头。
1[dgxsuperpod]% device use dgx001
2[dgxsuperpod->device[dgx001]]% bookmark
3[dgxsuperpod->device[dgx001]]% bookmark -l
4Name Bookmark
5---------------- ------------------------
6 home;device;use dgx001;
7- home;
8[dgxsuperpod->device[dgx001]]% home
9[dgxsuperpod]% goto
10[dgxsuperpod->device[dgx001]]% goto -
11[dgxsuperpod]% goto
12[dgxsuperpod->device[dgx001]]% bookmark dn1
13[dgxsuperpod->device[dgx001]]% goto -
14[dgxsuperpod]% goto dn1
15[dgxsuperpod->device[dgx001]]%
16Saving bookmarks, and making them persistent: bookmarks can be saved to a file, such as mysaved, with the -s|--save option, as follows:
17[dgxsuperpod]% bookmark -s mysaved
可以通过设置 .cmshrc 文件 (2.4.1.2) 以在每次启动新的 cmsh 会话时加载先前保存的书签文件,从而使书签持久化。bookmark 命令使用 -x|–load 选项加载已保存的书签文件。
1[rootheadnode ~]# cat .cm/cmsh/.cmshrc
2bookmark -x mysaved
rename#
可以在分区模式下,在与 Base View 或 cmsh 中节点前缀关联的节点基本名称字段中,全局重命名节点。但是,使用 rename 命令也可以进行更细粒度的批量重命名,并且通常避免了求助于脚本机制。通过示例可以最好地说明 rename 的用法。
这些示例首先使用节点的默认基本名称和默认节点数字(填充的后缀数字长度)3。然后可以进行作为前缀更改的简单重命名,如下所示。
1[headnode->device]% rename dgx001..dgx003 test
2Renamed: dgx001 to test1
3Renamed: dgx002 to test2
4Renamed: dgx003 to test3
rename 从 1 开始启动自己的编号,独立于原始编号。更改使用 commit
命令提交。如果节点数量足够大到需要,则会发生零填充。例如,如果重命名十个节点
1[headnode->device]% rename node[001-010] test
2Renamed: dgx001 to test01
3Renamed: dgx002 to test02
4...
5Renamed: dgx009 to test09
6Renamed: dgx010 to test10
然后,每个数字后缀使用两位数字,以匹配最后一个数字的大小。字符串格式化可用于指定填充数字字段中的位数。
1[headnode->device]% rename node[001-003] test%04d
2Renamed: dgx001 to test0001
3Renamed: dgx002 to test0002
4Renamed: dgx003 to test0003
可以方便地精确指定目标名称。它需要精确的名称映射。也就是说,它假定源列表大小和目标列表大小匹配。
1[headnode->device]% rename node[001-005] test0[1,2,5-7]
2Renamed: dgx001 to test01
3Renamed: dgx002 to test02
4Renamed: dgx003 to test05
5Renamed: dgx004 to test06
6Renamed: dgx005 to test07
主机名在应用之前按字母顺序排序,但根据使用的列表方法,存在一些例外情况。可以使用 --dry-run
选项来显示设备将如何重命名。或者,refresh 命令可以在 commit 命令提交更改之前清除一组提议的更改,尽管 refresh 也会删除其他待处理的更改。精确的名称映射可用于将各个服务器分配给几个人。
1[root©headnode ~]# cmsh
2[headnode]% device
3[headnode->device]% rename node[001-004] userone, usertwo, userthree, userfour
4Renamed: dgx001 to userone
5Renamed: dgx002 to usertwo
6Renamed: dgx003 to userthree
7Renamed: dgx004 to userfour
8[headnode->device]% commit
可以使用冒号 (:) 跳过多个节点。一个例子可能是跳过两个,以便可以将双服务器分隔为左/右。
1[root©headnode ~]# cmsh
2[headnode]% device
3[headnode->device]% rename node[001-100:2] left[001-050]
4Renamed: dgx001 to left001
5Renamed: dgx003 to left002
6...
7Renamed: dgx097 to left049
8Renamed: dgx099 to left050
9[headnode->device]% rename node[002-100:2] right[001-050]
10Renamed: dgx002 to right001
11Renamed: dgx004 to right002
12...
13Renamed: dgx098 to right049
14Renamed: dgx100 to right050
15[headnode->device]% commit
在脚本中使用 CMDaemon 环境变量#
在设备模式下,environment 命令显示了可以传递给特定设备的脚本的 CMDaemon 环境变量。
1[dgxsuperpod->device]% environment dgx001
2Key Value
3---------------------------------------------- ----------------------------------
4CMD_ACTIVE_MASTER_IP 10.141.255.254
5CMD_CATEGORY default
6CMD_CLUSTERNAME dgxsuperpod
7CMD_DEVICE_TYPE ComputeNode
8CMD_ENVIRONMENT_CACHE_EPOCH_MILLISECONDS 1615465821582
9...
可以使用 -—export|-e 选项准备环境变量以在 Bash 脚本中使用。
1[dgxsuperpod->device]% environment -e dgx001
2export CMD_ENVIRONMENT_CACHE_UPDATES=4
3export CMD_CATEGORY=default
4export CMD_SOFTWAREIMAGE=default-image
5export CMD_DEVICE_TYPE=ComputeNode
6export CMD_ROLES=
7export CMD_FSMOUNT__SLASH_home_FILESYSTEM=nfs
8...
使用 cmsh 将表格转换为 JSON#
通过使用分隔符规范选项 -d {}
,可以将表格条目列表转换为 JSON 表示形式。默认情况下,使用的缩进值为 2
。可以通过将值放在大括号内来设置其他值。
1[headnode->device]% list -f hostname,ip,mac,status
2hostname (key) ip mac status
3-------------------- -------------------- -------------------- --------------------
4dgx001 10.141.0.1 FA:16:3E:95:80:9F [ UP ]
5headnode 10.141.255.254 FA:16:3E:D3:56:E0 [ UP ]
6[headnode->device]% color off; list -f hostname,ip,mac,status -d
7[
8"hostname (key)": "headnode", "ip": "10.141.255.254",
9"mac": "FA:16:3E:D3:56:E0",
10"status": "[ UP ]"
11"hostname (key)": "dgx001",
12"ip": "10.141.0.1",
13"mac": "FA:16:3E:95:80:9F",
14"status": "[ UP ]"
15]
16[headnode->device]%
需要关闭颜色设置以删除默认的控制台着色。如果要从 bash shell 运行命令,可以使用以下方法获得相同的输出。
1[root©headnode ~]# cmsh --color=no -c "device; list -f hostname,ip,mac,status -d {}"