在 Microsoft Azure 上部署 RHEL 9
获取 RHEL 系统镜像并在 Azure 上创建 RHEL 实例
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 公有云平台上的 RHEL 简介 复制链接链接已复制到粘贴板!
公有云平台将计算资源作为服务提供。除了使用内部硬件,您可以将您的 IT 工作负载,包括 Red Hat Enterprise Linux (RHEL)系统,作为公有云实例运行。
1.1. 在公有云中使用 RHEL 的好处 复制链接链接已复制到粘贴板!
RHEL 作为公共云平台上的云实例与内部物理系统或虚拟机(VM)的 RHEL 相比有以下优点:
灵活精细地分配资源
RHEL 的云实例作为虚拟机在云平台上运行,这通常意味着由云服务提供商维护远程服务器集群。因此,给实例分配硬件资源(如特定类型的 CPU 或存储)发生在软件层面上,可轻松自定义。
与本地 RHEL 系统相比,您也不会受物理主机功能的限制。相反,您可以根据云提供商提供的选择,从各种功能中进行选择。
空间及成本效率
您不需要拥有任何内部服务器来托管您的云工作负载。这可避免与物理硬件关联的空间、电源和维护要求。
相反,在公有云平台上,您可以直接向云提供商支付使用云实例的费用。成本通常基于分配给实例的硬件以及您使用的时间。因此,您可以根据要求优化成本。
软件控制的配置
云实例的整个配置都作为数据保存在云平台上,并由软件控制。因此,您可以轻松地创建、删除、克隆或迁移实例。云实例也在云提供商控制台中远程操作,默认连接到远程存储。
另外,您可以随时将云实例的当前状态备份为快照。之后,您可以加载快照,将实例恢复到保存的状态。
与主机分离和软件兼容性
与本地虚拟机类似,云实例上的 RHEL 客户机操作系统运行在虚拟化内核上。这个内核与主机操作系统以及用来连接实例的 客户端 系统分开。
因此,任何操作系统都可以安装在云实例上。这意味着,在 RHEL 公有云实例中,您可以运行无法在本地操作系统上使用的特定于 RHEL 的应用程序。
另外,即使实例的操作系统变得不稳定或被破坏,您的客户端系统也不会受到任何影响。
1.2. RHEL 的公有云用例 复制链接链接已复制到粘贴板!
在公有云上部署会带来许多好处,但可能并非是每种场景中最有效的解决方案。如果您要评估是否将 RHEL 部署迁移到公共云,请考虑您的用例是否将从公共云的好处中受益。
有益的用例
部署公有云实例对于灵活地增加和减少部署的活跃计算能力(也称为 扩展 和 缩减)非常有效。因此,在以下情况下,建议在公有云上使用 RHEL:
- 具有高峰值工作负载和一般性能要求的集群。在资源成本方面,根据您的需求扩展和缩减可能非常高效。
- 快速设置或扩展集群。这可避免设置本地服务器的高前期成本。
- 云实例不受本地环境中发生的情况的影响。因此,您可以使用它们进行备份和恢复。
有潜在问题的用例
- 您正在运行一个无法调整的现有环境。与您当前的主机平台相比,自定义云实例以适应现有部署的特定需求可能并不划算。
- 您有预算方面的硬限制。在本地数据中心中维护您的部署通常具有更大的灵活性,但与公有云相比,您对最大资源成本有更多的控制。
后续步骤
1.3. 迁移到公有云时的常见关注 复制链接链接已复制到粘贴板!
将 RHEL 工作负载从本地环境移到公有云平台可能会带来有关涉及的变化的担忧。以下是最常见的问题。
作为云实例,我的 RHEL 是否与本地虚拟机工作不同?
在大部分方面,公有云平台上的 RHEL 实例的工作方式与本地主机上的 RHEL 虚拟机相同,如内部服务器。主要例外包括:
- 公有云实例使用特定于提供商的控制台接口,而不是私有编排接口,来管理云资源。
- 某些功能(如嵌套虚拟化)可能无法正常工作。如果特定功能对部署至关重要,请提前检查该功能与您选择的公有云提供商的兼容性。
与本地服务器相比,我的数据在公有云中是否保持安全?
RHEL 云实例中的数据归您所有,您的公共云提供商对齐没有任何访问权限。此外,主要的云提供商支持传输中的数据加密,这提高了将虚拟机迁移到公共云时数据的安全性。
RHEL 公共云实例的一般安全性如下:
- 您的公有云供应商负责云 hypervisor 的安全性
- 红帽在您的实例中提供 RHEL 客户机操作系统的安全功能
- 您可以在云基础架构中管理特定的安全设置和实践
我的地理区域对 RHEL 公有云实例的功能有何影响?
无论您所在的地理位置如何,您都可以在公有云平台上使用 RHEL 实例。因此,您可以在与内部服务器相同的区域中运行实例。
但是,在物理上较远的区域中托管您的实例可能会在操作它们时造成高延迟。此外,取决于公有云提供商,某些区域可能会提供额外的功能或更具成本效益。在创建 RHEL 实例前,请查看您选择的云提供商提供的托管区域的属性。
1.4. 为公有云部署获取 RHEL 复制链接链接已复制到粘贴板!
要在公有云环境中部署 RHEL 系统,您需要:
根据您的需求和当前市场提供的,为您的使用案例选择最佳云提供商。
当前认证的运行 RHEL 实例的云提供商有:
- Amazon Web Services (AWS)
- Google Cloud
- 注意
本文档专门讨论在 Microsoft Azure 上部署 RHEL。
- 在您选择的云平台上创建 RHEL 云实例。如需更多信息,请参阅 创建 RHEL 云实例的方法。
- 要让您的 RHEL 部署保持最新状态,请使用 红帽更新基础设施 (RHUI)。
1.5. 创建 RHEL 云实例的方法 复制链接链接已复制到粘贴板!
要在公有云平台上部署 RHEL 实例,您可以使用以下方法之一:
| 创建 RHEL 的系统镜像,并将其导入到云平台。
|
| 直接从云提供商市场购买 RHEL 实例。
|
有关使用各种方法在 Microsoft Azure 上部署 RHEL 实例的详细信息,请参阅本文档中的以下章节。
第 2 章 创建 VHD 镜像并将其自动上传到 Microsoft Azure 云 复制链接链接已复制到粘贴板!
您可以使用 RHEL 镜像构建器创建 .vhd 镜像,该镜像将自动被上传到 Microsoft Azure Cloud 服务提供商的 Blob 存储中。
先决条件
- 有对系统的 root 访问权限。
- 您有访问 RHEL web 控制台的 RHEL 镜像构建器界面的权限。
- 您创建了蓝图。请参阅 在 web 控制台界面中创建一个 RHEL 镜像构建器蓝图。
- 您已创建了 Microsoft 存储帐户。
- 您有一个可写入 Blob Storage。
步骤
- 在 RHEL 镜像构建器仪表盘中,选择要使用的蓝图。
- 点 选项卡。
点 创建自定义的
.vhd镜像。Create image 向导将打开。
-
从 Type 下拉菜单中选择
Microsoft Azure (.vhd)。 - 选中 Upload to Azure 复选框,来将镜像上传到 Microsoft Azure Cloud。
- 输入 Image Size ,并点 。
-
从 Type 下拉菜单中选择
在 Upload to Azure 页面行,输入以下信息:
在 Authentication 页面上,输入:
- 您的 存储帐户 名称。您可以在 Microsoft Azure 门户中 中的 Storage account 页面上找到它。
- 您的 存储访问密钥 :您可以在 Access Key 存储页面上找到它。
- 点击 。
在 Authentication 页面上,输入:
- 镜像名称。
- 存储容器.它是您将镜像上传到的 blob 容器。您可以在 Microsoft Azure 门户 的 Blob service 部分中找到它。
- 点击 。
在 Review 页面上,点 。RHEL 镜像构建器和上传进程启动。
访问推送到 Microsoft Azure Cloud 的镜像。
- 访问 Microsoft Azure 门户网站。
- 在搜索栏中,输入"storage account",然后从列表中单击 Storage accounts。
- 在搜索栏中输键入"Images",然后在 Services 下选择第一个条目。您将被重定向到 镜像仪表盘。
- 在导航面板上,单击 Containers。
-
查找您创建的容器。容器中是您使用 RHEL 镜像构建器创建并推送的
.vhd文件。
验证
验证您能否创建虚拟机镜像并启动它。
- 在搜索栏中,输入镜像帐户,并单击列表中的 Images。
- 单击 。
- 从下拉列表中,选择您之前使用的资源组。
- 输入镜像的名称。
- 对于 OS type,请选择 Linux。
- 对于 VM generation,请选择 Gen 2。
- 在 Storage Blob 下,点 ,并点存储账户和容器,直到您到达 VHD 文件。
- 点页面末尾的 Select。
- 选择一个帐户类型,例如 Standard SSD。
- 点 ,然后点 。等待几分钟,以便创建镜像。
要启动虚拟机,请按照以下步骤执行:
- 点 。
- 从标题的菜单栏中,单击 。
- 输入虚拟机的名称。
- 完成 Size 和 Administrator account 部分。
点 ,然后点 。您可以查看部署进度。
部署完成后,单击虚拟机名称,以检索使用 SSH 连接的实例的公用 IP 地址。
- 打开一个终端,创建一个 SSH 连接来连接到虚拟机。
要在 Microsoft Azure 上部署 Red Hat Enterprise Linux 9 (RHEL 9) 镜像,请遵循以下信息。本章:
- 讨论您选择镜像的选项
- 列出或引用主机系统和虚拟机(VM)的系统要求。
- 提供从 ISO 镜像创建自定义虚拟机、将其上传到 Azure 以及启动 Azure 虚拟机实例的流程
您可以从 ISO 镜像创建自定义的虚拟机,但红帽建议您使用 Red Hat Image Builder 产品来创建自定义的镜像以用于特定的云供应商。使用 Image Builder,您可以创建并上传 Azure 磁盘镜像(VHD 格式)。如需更多信息,请参阅 生成自定义 RHEL 系统镜像。
有关您可以在 Azure 上安全使用的红帽产品列表,请参阅 Microsoft Azure 上的红帽。
先决条件
- 注册一个红帽客户门户网站(Red Hat Customer Portal) 帐户。
- 注册一个 Microsoft Azure 帐户。
3.1. Azure 上的 Red Hat Enterprise Linux 镜像选项 复制链接链接已复制到粘贴板!
下表列出了 Microsoft Azure 上 RHEL 9 的镜像选择,并指出了镜像选项的区别。
| 镜像选项 | 订阅 | 示例情境 | 注意事项 |
|---|---|---|---|
| 部署红帽黄金镜像。 | 使用您现有的红帽订阅。 | 在 Azure 上选择红帽黄金镜像。有关黄金镜像以及如何在 Azure 上访问它们的详情,请参阅 红帽云访问参考指南。 | 订阅包括了红帽产品的成本;您需要向 Microsoft 支付其他费用。 |
| 部署一个移至 Azure 的自定义镜像。 | 使用您现有的红帽订阅。 | 上传自定义镜像并附加您的订阅。 | 订阅包括了红帽产品的成本;您需要向 Microsoft 支付其他实例的费用。 |
| 部署一个包含 RHEL 的现有 Azure 镜像。 | Azure 镜像包括一个红帽产品。 | 使用 Azure 控制台,在创建虚拟机时,选择一个 RHEL 镜像,或者从 Azure Marketplace 中选择一个虚拟机。 | 按照 随用随付 模式按小时向 Microsoft 付费。这样的镜像名为 "按需"。Azure 通过支持协议提供对按需镜像的支持。 红帽提供了镜像的更新。Azure 通过红帽更新基础架构(RHUI)提供更新。 |
3.2. 理解基础镜像 复制链接链接已复制到粘贴板!
本节包括使用预配置的基础镜像及其配置设置的信息。
3.2.1. 使用自定义基础镜像 复制链接链接已复制到粘贴板!
要手动配置虚拟机(VM),首先创建一个基础(起步)虚拟机镜像。然后,您可以修改配置设置,并添加 VM 在云上操作所需的软件包。您可在上传镜像后为特定应用程序进行额外的配置更改。
要准备 RHEL 的云镜像,请按照以下部分中的说明操作。要准备 RHEL 的 Hyper-V 云镜像,请参阅 从 Hyper-V Manager 准备基于红帽的虚拟机。
3.2.2. 所需的系统软件包 复制链接链接已复制到粘贴板!
要创建并配置 RHEL 的基础镜像,主机系统必须安装了以下软件包。
| 软件包 | 软件仓库 | 描述 |
|---|---|---|
| libvirt | rhel-9-for-x86_64-appstream-rpms | 用于管理平台虚拟化的开源 API、守护进程和管理工具 |
| virt-install | rhel-9-for-x86_64-appstream-rpms | 用于构建虚拟机的命令行工具 |
| libguestfs | rhel-9-for-x86_64-appstream-rpms | 用于访问和修改虚拟机文件系统的库 |
| guestfs-tools | rhel-9-for-x86_64-appstream-rpms |
虚拟机的系统管理工具;包括 |
3.2.3. Azure VM 配置设置 复制链接链接已复制到粘贴板!
Azure 虚拟机(VM)必须具有以下配置设置。其中一些设置会在初始创建虚拟机期间启用。为 Azure 置备虚拟机镜像时会设置其他设置。在进行操作时请记住这些设置。如有必要,请参阅它们。
| 设置 | 建议 |
|---|---|
| SSH | 必须启用 SSH 来提供 Azure 虚拟机的远程访问。 |
| dhcp | 应该为 dhcp 配置主虚拟适配器(仅限 IPv4)。 |
| 交换空间 |
不要在安装过程中在操作系统(OS)磁盘或存储磁盘上创建专用 |
| NIC |
为主虚拟网络适配器选择 |
| encryption | 对于自定义镜像,使用 Network Bound Disk Encryption(NBDE)在 Azure 上进行全磁盘加密。 |
3.2.4. 在 Azure 上使用 cloud-init 配置 swap 空间 复制链接链接已复制到粘贴板!
要将 swap 空间用于 Microsoft Azure 上的 Red Hat Enterprise Linux (RHEL)虚拟机(VM),您需要在临时磁盘上创建交换分区。仅使用临时磁盘来创建交换分区,而不是操作系统(OS)磁盘或数据(存储)磁盘。由于虚拟机被删除后,临时磁盘也会被删除,因此交换分区也会被删除。
您可以使用 cloud-init 工具在临时磁盘上配置交换分区。临时磁盘是虚拟机的本地存储,而资源磁盘则挂载到虚拟机本身上。两种存储类型都临时存储。删除、移动、停止或失败会导致临时存储在临时或资源磁盘中的数据丢失。
不要将临时磁盘用于持久数据。当虚拟机停止或移动时,所有内容(包括交换分区)都会被删除。
先决条件
-
您已在虚拟机上安装了
cloud-init工具。 您已在 Windows Azure Linux Agent (WALA)中设置
/etc/waagent.conf文件中的参数禁用了 swap 配置:ResourceDisk.Format=n ResourceDisk.EnableSwap=n ResourceDisk.SwapSizeMB=0- 您在虚拟机上有一个临时磁盘。
步骤
- 登录到虚拟机。
创建并编辑
/etc/cloud/cloud.cfg.d/00-azure-swap.cfg配置文件,并将以下cloud-init配置添加到文件中:# vi /etc/cloud/cloud.cfg.d/00-azure-swap.cfg#cloud-config disk_setup: ephemeral0: table_type: gpt layout: [66, [33,82]] overwrite: true fs_setup: - device: ephemeral0.1 filesystem: ext4 - device: ephemeral0.2 filesystem: swap mounts: - ["ephemeral0.1", "/mnt"] - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service", "0", "0"]此配置:
-
使用 GPT 分区表对临时磁盘(
ephemeral0)进行分区。 -
创建两个分区: 66% 用于文件系统(挂载在
/mnt中)和 33% 用于交换空间。 -
将第一个分区格式化为
ext4,第二个分区格式化为swap。 在引导时配置两个分区的自动挂载。
注意分区布局
[66, [33,82]]将 66% 的磁盘分配给第一个分区,将 33% 分配到第二个分区。第二个分区规格中的82表示 Linux swap 分区类型。您可以根据您的要求调整这些百分比。
-
使用 GPT 分区表对临时磁盘(
验证配置文件是否有任何错误:
# cloud-init devel schema --config-file /etc/cloud/cloud.cfg.d/00-azure-swap.cfg如果配置有效,命令不会返回错误。
验证
重启虚拟机后,请通过验证
/etc/fstab文件中的活跃交换空间、交换使用情况和交换分区条目来检查交换分区是否已配置并激活。检查活跃 swap 空间:
$ swapon -s输出应显示来自
ephemeral0.2的交换分区:Filename Type Size Used Priority /dev/ephemeral0.2 partition 8388604 0 -2检查 swap 用法:
$ free -h输出应该在
Swap行中显示 swap 空间:total used free shared buffered/cache available Mem: 7.8Gi 1.2Gi 5.8Gi 16MiB 800MiB 6.3Gi Swap: 8.0Gi 0B 8.0Gi验证
/etc/fstab文件中是否存在 swap 分区:$ grep swap /etc/fstab输出应包含 swap 分区的条目,例如:
/dev/ephemeral0.2 none swap sw,nofail,x-systemd.requires=cloud-init.service 0 0
3.2.5. 从 ISO 镜像创建基础镜像 复制链接链接已复制到粘贴板!
以下流程列出了创建自定义 ISO 镜像的步骤和初始配置要求。配置了镜像后,您可以使用镜像作为模板来创建额外的虚拟机实例。
先决条件
- 确保已为虚拟化启用主机机器。有关信息和流程,请参阅在 RHEL 9 中启用虚拟化。
步骤
- 从 红帽客户门户网站 下载最新的 Red Hat Enterprise Linux 9 DVD ISO 镜像。
创建并启动基本 Red Hat Enterprise Linux 虚拟机。具体步骤请参阅 创建虚拟机。
如果使用命令行创建虚拟机,请确保将默认内存和 CPU 设置为您所需的容量。将您的虚拟网络接口设置为 virtio。
例如,以下命令使用
rhel-9.0-x86_64-kvm.qcow2镜像创建一个kvmtest虚拟机:# virt-install \ --name kvmtest --memory 2048 --vcpus 2 \ --disk rhel-9.0-x86_64-kvm.qcow2,bus=virtio \ --import --os-variant=rhel9.0如果使用 web 控制台创建虚拟机,请按照 使用 web 控制台创建虚拟机 中的步骤操作,并注意以下几点:
- 不要选择 Immediately Start VM 。
- 将 Memory 大小更改为你希望的设置。
- 在开始安装前,请确保将 Virtual Network Interface Settings 中的 Model 更改为 virtio,并将您的 vCPU 更改为您想要的虚拟机容量设置。
查看以下额外的安装选择和修改。
- 选择带有 standard RHEL 选项的 Minimal Install。
对于 Installation Destination,选择 Custom Storage Configuration。使用以下配置信息进行选择。
- 确保 /boot 至少 500 MB。但是,1 GB 或更多就足够了。
- 对于文件系统,在 boot 和 root 分区中使用 xfs、ext4 或 ext3。
-
在安装过程中,从 OS 磁盘中删除 swap 空间。部署后,在临时磁盘上使用
cloud-init来配置交换空间。
- 在 Installation Summary 屏幕中,选择 Network and Host Name。将 Ethernet 切换到 On。
安装开始:
-
创建
root密码. - 创建管理用户帐户。
-
创建
- 安装完成后,重启虚拟机并登录到 root 帐户。
-
以
root身份登录后,您就可以配置镜像了。
3.3. 为 Microsoft Azure 配置自定义基础镜像 复制链接链接已复制到粘贴板!
要使用特定设置在 Azure 中部署 RHEL 9 虚拟机,您可以为虚拟机创建自定义基础镜像。以下小节描述了 Azure 所需的其他配置更改。
3.3.1. 安装 Hyper-V 设备驱动程序 复制链接链接已复制到粘贴板!
Microsoft 提供了网络和存储设备驱动程序,作为其 Hyper-V 软件包的 Linux 集成服务(LIS)的一部分。在将虚拟机镜像配置为 Azure虚拟机(VM)之前, Hyper-V 可能需要在其上安装 Hyper-V 设备驱动程序。使用 lsinitrd | grep hv 命令来验证是否已安装了驱动程序。
流程
输入以下
grep命令,来确定是否已安装了所需的 Hyper-V 设备驱动程序:# lsinitrd | grep hv在以下示例中安装了所有必需的驱动程序。
# lsinitrd | grep hv drwxr-xr-x 2 root root 0 Aug 12 14:21 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/hv -rw-r--r-- 1 root root 31272 Aug 11 08:45 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/hv/hv_vmbus.ko.xz -rw-r--r-- 1 root root 25132 Aug 11 08:46 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/net/hyperv/hv_netvsc.ko.xz -rw-r--r-- 1 root root 9796 Aug 11 08:45 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/scsi/hv_storvsc.ko.xz如果没有安装所有驱动程序,请完成剩余的步骤。
注意环境中可能存在
hv_vmbus驱动程序。即使存在这个驱动程序,请完成以下步骤。-
在
/etc/dracut.conf.d中创建一个名为hv.conf的文件。 在
hv.conf文件中添加以下驱动程序参数。add_drivers+=" hv_vmbus " add_drivers+=" hv_netvsc " add_drivers+=" hv_storvsc " add_drivers+=" nvme "注意请注意引号前后的空格,例如
add_drivers+=" hv_vmbus "。这样可确保在环境中存在其他 Hyper-V 驱动程序时载入唯一驱动程序。重新生成
initramfs镜像。# dracut -f -v --regenerate-all
验证
- 重启机器。
-
运行
lsinitrd | grep hv命令来验证是否已安装了驱动程序。
3.3.2. 进行 Microsoft Azure 部署所需的配置更改 复制链接链接已复制到粘贴板!
在将自定义基础镜像部署到 Azure 之前,您必须执行额外的配置更改,以确保虚拟机(VM)可以在 Azure 中正常工作。
流程
- 登录到虚拟机。
注册虚拟机并启用 Red Hat Enterprise Linux 9 软件仓库。
# subscription-manager register Installed Product Current Status: Product Name: Red Hat Enterprise Linux for x86_64 Status: Subscribed确保安装了
cloud-init和hyperv-daemons软件包。# dnf install cloud-init hyperv-daemons -y创建与 Azure 服务集成所需的
cloud-init配置文件:要启用对 Hyper-V Data Exchange Service(KVP)的日志记录,请创建
/etc/cloud/cloud.cfg.d/10-azure-kvp.cfg配置文件,并将以下行添加到该文件中。reporting: logging: type: log telemetry: type: hyperv要将 Azure 添加为数据源,请创建
/etc/cloud/cloud.cfg.d/91-azure_datasource.cfg配置文件,并将以下行添加到该文件中。datasource_list: [ Azure ] datasource: Azure: apply_network_config: False要在临时磁盘上配置交换空间,请创建
/etc/cloud/cloud.cfg.d/00-azure-swap.cfg配置文件并添加以下行。重要临时磁盘是临时存储。因此,当虚拟机被取消或移动时,存储的数据(包括交换空间)将会丢失。将临时磁盘仅用于临时数据,如交换空间。
#cloud-config disk_setup: ephemeral0: table_type: gpt layout: [66, [33,82]] overwrite: true fs_setup: - device: ephemeral0.1 filesystem: ext4 - device: ephemeral0.2 filesystem: swap mounts: - ["ephemeral0.1", "/mnt"] - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service", "0", "0"]
要确保特定内核模块自动被阻止加载,请编辑或创建
/etc/modprobe.d/blocklist.conf文件,并将以下行添加到该文件中。blacklist nouveau blacklist lbm-nouveau blacklist floppy blacklist amdgpu blacklist skx_edac blacklist intel_cstate修改
udev网络设备规则:如果存在,请删除以下持久性网络设备规则。
# rm -f /etc/udev/rules.d/70-persistent-net.rules # rm -f /etc/udev/rules.d/75-persistent-net-generator.rules # rm -f /etc/udev/rules.d/80-net-name-slot-rules要确保在 Azure 上的加速网络按预期工作,请创建一个新的网络设备规则
/etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules,并将以下行添加到其中。SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add", ENV{NM_UNMANAGED}="1"
将
sshd服务设置为自动启动。# systemctl enable sshd # systemctl is-enabled sshd修改内核引导参数:
打开
/etc/default/grub文件,并确保GRUB_TIMEOUT行有以下值:GRUB_TIMEOUT=10如果存在的话,从
GRUB_CMDLINE_LINUX行的末尾删除以下选项。rhgb quiet确保
/etc/default/grub文件包含具有所有指定选项的以下行:GRUB_CMDLINE_LINUX="loglevel=3 crashkernel=auto console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300" GRUB_TIMEOUT_STYLE=countdown GRUB_TERMINAL="serial console" GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"注意如果您没有在 HDD 上运行工作负载,请将
elevator=none添加到GRUB_CMDLINE_LINUX行的末尾。这会将 I/O 调度程序设置为none,这可以提高基于 SSD 的系统上的 I/O 性能。重新生成
grub.cfg文件。在基于 BIOS 的机器上:
在 RHEL 9.2 及更早版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg在 RHEL 9.3 及更高版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
在基于 UEFI 的机器上:
在 RHEL 9.2 及更早版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg在 RHEL 9.3 及更高版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline警告对于基于 BIOS 和 UEFI 的机器,重建
grub.cfg的路径是一样的。实际的grub.cfg只在 BIOS 路径中存在。UEFI 路径有一个 stub 文件,不能使用grub2-mkconfig命令修改或重新创建。如果您的系统对
grub.cfg使用非默认位置,请相应地调整命令。
配置 Windows Azure Linux 代理(
WALinuxAgent):安装并启用
WALinuxAgent软件包。# dnf install WALinuxAgent -y # systemctl enable waagent要在 WALinuxAgent 中禁用交换配置(在使用
cloud-init管理交换时必需),请编辑/etc/waagent.conf文件中的以下行。Provisioning.DeleteRootPassword=y ResourceDisk.Format=n ResourceDisk.EnableSwap=n ResourceDisk.SwapSizeMB=0注意通过在 WALinuxAgent 中禁用 swap,您可以启用
cloud-init来管理临时磁盘上的交换配置。
为 Azure 置备准备虚拟机:
从 Red Hat Subscription Manager 取消注册虚拟机。
# subscription-manager unregister清理现有置备详情。
# waagent -force -deprovision注意这个命令会产生警告,这是预期的,因为 Azure 会自动处理虚拟机的置备。
清理 shell 历史记录并关闭虚拟机。
# export HISTSIZE=0 # poweroff
3.4. 将镜像转换为固定 VHD 格式 复制链接链接已复制到粘贴板!
所有 Microsoft Azure VM 镜像都必须是固定的 VHD 格式。镜像必须在将镜像转换为 VHD 之前被对齐到 1 MB 边界。要将镜像从 qcow2 转换为固定的 VHD 格式,并对齐图像,请参阅以下流程。转换镜像后,您可以将其上传到 Azure。
流程
将镜像从
qcow2转换为raw格式。$ qemu-img convert -f qcow2 -O raw <image-name>.qcow2 <image-name>.raw创建一个具有以下内容的 shell 脚本:
#!/bin/bash MB=$((1024 * 1024)) size=$(qemu-img info -f raw --output json "$1" | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}') rounded_size=$((($size/$MB + 1) * $MB)) if [ $(($size % $MB)) -eq 0 ] then echo "Your image is already aligned. You do not need to resize." exit 1 fi echo "rounded size = $rounded_size" export rounded_size运行脚本。本例使用名称
align.sh。$ sh align.sh <image-xxx>.raw- 如需显示 "Your image is already aligned.You do not need to resize.",执行以下步骤。
- 如果显示了一个值,代表您的镜像没有被对齐。
使用以下命令来将文件转换为固定的
VHD格式:示例使用 qemu-img 版本 2.12.0。
$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd转换后,
VHD文件就可以上传到 Azure。如果
raw镜像不一致,请完成以下步骤使其保持一致。在运行验证脚本时,使用显示的舍入值来调整
raw文件的大小。$ qemu-img resize -f raw <image-xxx>.raw <rounded-value>将
raw镜像文件转换为VHD格式。示例使用 qemu-img 版本 2.12.0。
$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd转换后,
VHD文件就可以上传到 Azure。
3.5. 安装 Azure CLI 复制链接链接已复制到粘贴板!
完成以下步骤来安装 Azure 命令行界面(Azure CLI 2.1)。Azure CLI 2.1 是一个基于 Python 的工具,用来在 Azure 中创建和管理虚拟机。
先决条件
- 在使用 Azure CLI 之前,您需要具有 Microsoft Azure 帐户。
- Azure CLI 安装需要 Python 3.x。
流程
导入 Microsoft 软件仓库密钥。
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc创建本地 Azure CLI 存储库条目。
$ sudo sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'更新
dnf软件包索引。$ dnf check-update检查您的 Python 版本(
python --version),并根据需要安装 Python 3.x。$ sudo dnf install python3安装 Azure CLI。
$ sudo dnf install -y azure-cli运行 Azure CLI。
$ az
3.6. 在 Azure 中创建资源 复制链接链接已复制到粘贴板!
在上传 VHD 文件并创建 Azure 镜像之前,请完成以下流程来创建所需的 Azure 资源。
步骤
使用 Azure 验证您的系统并登录。
$ az login注意如果在您的环境中有浏览器,则 CLI 会打开浏览器到 Azure 登录页面。如需更多信息和选项,请参阅使用 Azure CLI 登录。
在 Azure 区域中创建资源组。
$ az group create --name <resource-group> --location <azure-region>例如:
[clouduser@localhost]$ az group create --name azrhelclirsgrp --location southcentralus { "id": "/subscriptions//resourceGroups/azrhelclirsgrp", "location": "southcentralus", "managedBy": null, "name": "azrhelclirsgrp", "properties": { "provisioningState": "Succeeded" }, "tags": null }创建存储帐户。有关有效 SKU 值的更多信息,请参阅 SKU Types。
$ az storage account create -l <azure-region> -n <storage-account-name> -g <resource-group> --sku <sku_type>例如:
[clouduser@localhost]$ az storage account create -l southcentralus -n azrhelclistact -g azrhelclirsgrp --sku Standard_LRS { "accessTier": null, "creationTime": "2017-04-05T19:10:29.855470+00:00", "customDomain": null, "encryption": null, "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Storage/storageAccounts/azrhelclistact", "kind": "StorageV2", "lastGeoFailoverTime": null, "location": "southcentralus", "name": "azrhelclistact", "primaryEndpoints": { "blob": "https://azrhelclistact.blob.core.windows.net/", "file": "https://azrhelclistact.file.core.windows.net/", "queue": "https://azrhelclistact.queue.core.windows.net/", "table": "https://azrhelclistact.table.core.windows.net/" }, "primaryLocation": "southcentralus", "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "secondaryEndpoints": null, "secondaryLocation": null, "sku": { "name": "Standard_LRS", "tier": "Standard" }, "statusOfPrimary": "available", "statusOfSecondary": null, "tags": {}, "type": "Microsoft.Storage/storageAccounts" }获取存储帐户连接字符串。
$ az storage account show-connection-string -n <storage-account-name> -g <resource-group>例如:
[clouduser@localhost]$ az storage account show-connection-string -n azrhelclistact -g azrhelclirsgrp { "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...==" }通过复制连接字符串并将其粘贴到以下命令来导出连接字符串。这个字符串将您的系统连接到存储帐户。
$ export AZURE_STORAGE_CONNECTION_STRING="<storage-connection-string>"例如:
[clouduser@localhost]$ export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="创建存储容器。
$ az storage container create -n <container-name>例如:
[clouduser@localhost]$ az storage container create -n azrhelclistcont { "created": true }创建虚拟网络。
$ az network vnet create -g <resource group> --name <vnet-name> --subnet-name <subnet-name>例如:
[clouduser@localhost]$ az network vnet create --resource-group azrhelclirsgrp --name azrhelclivnet1 --subnet-name azrhelclisubnet1 { "newVNet": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "dhcpOptions": { "dnsServers": [] }, "etag": "W/\"\"", "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1", "location": "southcentralus", "name": "azrhelclivnet1", "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "resourceGuid": "0f25efee-e2a6-4abe-a4e9-817061ee1e79", "subnets": [ { "addressPrefix": "10.0.0.0/24", "etag": "W/\"\"", "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1/subnets/azrhelclisubnet1", "ipConfigurations": null, "name": "azrhelclisubnet1", "networkSecurityGroup": null, "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "resourceNavigationLinks": null, "routeTable": null } ], "tags": {}, "type": "Microsoft.Network/virtualNetworks", "virtualNetworkPeerings": null } }
3.7. 上传并创建 Azure 镜像 复制链接链接已复制到粘贴板!
完成以下步骤,将 VHD 文件上传到容器,并创建 Azure 自定义镜像。
系统重启后,导出的存储连接字符串不会保留。如果以下步骤中的任何命令失败,请再次导出连接字符串。
流程
将
VHD文件上传到存储容器。它可能需要几分钟时间。要获取存储容器的列表,请输入az storage container list命令。$ az storage blob upload \ --account-name <storage-account-name> --container-name <container-name> \ --type page --file <path-to-vhd> --name <image-name>.vhd例如:
[clouduser@localhost]$ az storage blob upload \ --account-name azrhelclistact --container-name azrhelclistcont \ --type page --file rhel-image-{ProductNumber}.vhd --name rhel-image-{ProductNumber}.vhd Percent complete: %100.0获取上传的
VHD文件的 URL,以便在下面的步骤中使用。$ az storage blob url -c <container-name> -n <image-name>.vhd例如:
$ az storage blob url -c azrhelclistcont -n rhel-image-9.vhd "https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-9.vhd"创建 Azure 自定义镜像。
$ az image create -n <image-name> -g <resource-group> -l <azure-region> --source <URL> --os-type linux注意虚拟机的默认 hypervisor 系列为 V1。您可以通过包含
--hyper-v-generation V2选项来(可选)指定 V2 管理程序生成。第二代虚拟机使用基于 UEFI 的引导架构。如需有关第 2 代虚拟机的信息,请参阅 对 Azure 上第 2 代虚拟机的支持。命令可能会返回错误"Only blobs formatted as VHDs can be imported."此错误可能意味着在转换为
VHD之前,镜像与最接近的 1 MB 边界不一致。例如:
$ az image create -n rhel9 -g azrhelclirsgrp2 -l southcentralus --source https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-9.vhd --os-type linux
3.8. 在 Azure 中创建并启动虚拟机 复制链接链接已复制到粘贴板!
以下步骤提供从镜像创建 managed-disk Azure 虚拟机的最低命令选项。如需了解更多选项,请参阅az vm create。
流程
输入以下命令来创建虚拟机。
$ az vm create \ -g <resource-group> -l <azure-region> -n <vm-name> \ --vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 \ --os-disk-name <simple-name> --admin-username <administrator-name> \ --generate-ssh-keys --image <path-to-image>注意选项
--generate-ssh-keys创建私钥/公钥对。私钥和公钥文件创建在您系统上的~/.ssh中。公钥被添加到--admin-username选项所指定的用户的虚拟机上的authorized_keys文件中。如需更多信息,请参阅其他身份验证方法 。示例:
[clouduser@localhost]$ az vm create \ -g azrhelclirsgrp2 -l southcentralus -n rhel-azure-vm-1 \ --vnet-name azrhelclivnet1 --subnet azrhelclisubnet1 --size Standard_A2 \ --os-disk-name vm-1-osdisk --admin-username clouduser \ --generate-ssh-keys --image rhel9 { "fqdns": "", "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Compute/virtualMachines/rhel-azure-vm-1", "location": "southcentralus", "macAddress": "", "powerState": "VM running", "privateIpAddress": "10.0.0.4", "publicIpAddress": "<public-IP-address>", "resourceGroup": "azrhelclirsgrp2"请注意
publicIpAddress。在以下步骤中,您需要这个地址来登录到虚拟机。启动 SSH 会话并登录到虚拟机。
[clouduser@localhost]$ ssh -i /home/clouduser/.ssh/id_rsa clouduser@<public-IP-address>. The authenticity of host ',<public-IP-address>' can't be established. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '<public-IP-address>' (ECDSA) to the list of known hosts. [clouduser@rhel-azure-vm-1 ~]$
如果您看到用户提示,则代表成功部署了 Azure 虚拟机。
现在,您可以进到 Microsoft Azure 门户网站,并检查审计日志和资源的属性。您可以在此门户中直接管理虚拟机。如果要管理多个虚拟机,您应该使用 Azure CLI。Azure CLI 为您在 Azure 中的资源提供了一个强大的接口。在 CLI 中输入 az --help,或参阅 Azure CLI 命令参考 来了解更多有关您在 Microsoft Azure 中管理虚拟机的命令。
3.9. 其他验证方法 复制链接链接已复制到粘贴板!
虽然使用 Azure 生成的密钥对不是必须的,但为了提高安全性,推荐使用。以下示例演示了使用两个 SSH 验证方法。
示例 1: 这些命令选项可在不生成公钥文件的情况下提供一台新虚拟机。它们允许使用密码的 SSH 身份验证。
$ az vm create \
-g <resource-group> -l <azure-region> -n <vm-name> \
--vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 \
--os-disk-name <simple-name> --authentication-type password \
--admin-username <administrator-name> --admin-password <ssh-password> --image <path-to-image>
$ ssh <admin-username>@<public-ip-address>
示例 2: 这些命令选项提供了一个新的 Azure 虚拟机,并允许使用现有的公钥文件的 SSH 身份验证。
$ az vm create \
-g <resource-group> -l <azure-region> -n <vm-name> \
--vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 \
--os-disk-name <simple-name> --admin-username <administrator-name> \
--ssh-key-value <path-to-existing-ssh-key> --image <path-to-image>
$ ssh -i <path-to-existing-ssh-key> <admin-username>@<public-ip-address>
3.10. 附加红帽订阅 复制链接链接已复制到粘贴板!
使用 subscription-manager 命令,您可以注册并将红帽订阅附加到 RHEL 实例。
先决条件
- 您必须已启用您的订阅。
流程
注册您的系统。
# subscription-manager register附加您的订阅。
- 您可以使用激活码来附加订阅。如需更多信息,请参阅创建红帽客户门户网站激活码。
- 另外,您可以使用订阅池(池 ID)的 ID 手动附加订阅。请参阅 将基于主机的订阅附加到 hypervisor。
可选: 要在 Red Hat Hybrid Cloud Console 中收集有关实例的各种系统指标,您可以使用 红帽 Lightspeed 注册实例。
# insights-client register --display-name <display_name_value>有关 Red Hat Lightspeed 配置的更多信息,请参阅 Red Hat Lightspeed 的客户端配置指南。
3.11. 对 Azure 黄金镜像设置自动注册 复制链接链接已复制到粘贴板!
要在 Micorsoft Azure 上更快、更舒适地部署 RHEL 9 虚拟机(VM),您可以将 RHEL 9 的黄金镜像设置为自动注册到 Red Hat Subscription Manager(RHSM)。
先决条件
RHEL 9 黄金镜像可在 Microsoft Azure 中提供。具体说明请参阅 在 Azure 上使用黄金镜像。
注意Microsoft Azure 帐户一次只能附加到一个红帽帐户。因此,将其附加到您的红帽帐户之前,请确保其他用户不需要访问 Azure 帐户。
步骤
- 使用 Gold Image 在 Azure 实例中创建 RHEL 9 虚拟机。具体步骤请参阅在 Azure 中创建和启动虚拟机。
- 启动创建的虚拟机。
在 RHEL 9 虚拟机中,启用自动注册。
# subscription-manager config --rhsmcertd.auto_registration=1启用
rhsmcertd服务。# systemctl enable rhsmcertd.service禁用
redhat.repo存储库。# subscription-manager config --rhsm.manage_repos=0- 关闭虚拟机,并将它保存为 Azure 上的受管镜像。具体说明请查看 如何创建虚拟机的受管镜像或 VHD。
- 使用受管的镜像创建虚拟机。他们将自动订阅 RHSM。
验证
在使用上述说明创建的 RHEL 9 虚拟机中,通过执行
subscription-manager identity命令来验证系统是否已注册到 RHSM。在成功注册的系统上,这会显示系统的 UUID。例如:# subscription-manager identity system identity: fdc46662-c536-43fb-a18a-bbcb283102b7 name: 192.168.122.222 org name: 6340056 org ID: 6340056
3.12. 为 Microsoft Azure 实例配置 kdump 复制链接链接已复制到粘贴板!
如果在 RHEL 实例中发生内核崩溃,您可以使用 kdump 服务来确定崩溃的原因。如果您的实例在内核意外终止时 kdump 被正确配置,则 kdump 会生成一个转储文件,称为崩溃转储或 vmcore 文件。然后,您可以分析文件,以查找崩溃发生的原因并调试您的系统。
要使 kdump 在 Microsoft Azure 实例上工作,您可能需要调整 kdump 保留的内存和 vmcore 目标,以适应虚拟机大小和 RHEL 版本。
先决条件
您可以使用支持
kdump的 Microsoft Azure 环境:- Standard_DS2_v2 VM
- 标准 NV16as v4
- 标准 M416-208s v2
- 标准 M416ms v2
-
您在系统上具有
root权限。 -
您的系统满足
kdump配置和目标的要求。详情请查看支持的 kdump 配置和目标。
流程
确保
kdump和其他必要的软件包已安装在您的系统上。# dnf install kexec-tools验证崩溃转储文件的默认位置是否在
kdump配置文件中设置了,并且/var/crash文件是否可用。# grep -v "#" /etc/kdump.conf path /var/crash core_collector makedumpfile -l --message-level 7 -d 31根据 RHEL 虚拟机(VM)实例的大小和版本,决定是否需要一个具有更多可用空间的
vmcore目标,如/mnt/crash。为此,请使用下表。Expand 表 3.4. 已在 Azure 上使用 GEN2 虚拟机 测试了的虚拟机大小 RHEL 版本 标准 DS1 v2 (1 vCPU, 3.5GiB) 标准 NV16as v4 (16 vCPU, 56 GiB) 标准 M416-208s v2 (208 vCPU, 5700 GiB) 标准 M416ms v2 (416 vCPU, 11400 GiB) RHEL 9.0 - RHEL 9.3
default
default
目标
目标
-
Default 表示
kdump使用默认的内存和默认的kdump目标可以正常工作。默认的kdump目标为/var/crash。 -
Target 表示
kdump可以使用默认内存按预期工作。但是,您可能需要分配一个具有更多可用空间的目标。
-
Default 表示
如果您的实例需要它,请分配一个具有更多可用空间的目标,如
/mnt/crash。为此,请编辑/etc/kdump.conf文件并替换默认路径。$ sed s/"path /var/crash"/"path /mnt/crash"选项 path
/mnt/crash代表kdump在文件系统中保存崩溃转储文件的路径。有关更多选项,比如将崩溃转储文件写入不同的分区,直接写入设备或将其保存到远程机器,请参阅 配置 kdump 目标。
如果您的实例需要它,请将崩溃内核的大小增加到足够大,以便
kdump能够通过添加相应的引导参数来捕获vmcore。例如,对于标准 M416-208s v2 虚拟机,足够的大小为 512 MB,因此引导参数应为
crashkernel=512M。打开 GRUB 配置文件,并将
crashkernel=512M添加到引导参数行中。# vi /etc/default/grub GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300 crashkernel=512M"更新 GRUB 配置文件。
在 RHEL 9.2 及更早版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg在 RHEL 9.3 及更高版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
- 重启虚拟机,来向虚拟机分配单独的内核崩溃内存。
验证
确保
kdump处于活跃状态且正在运行。# systemctl status kdump ● kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor prese> Active: active (exited) since Fri 2024-02-09 10:50:18 CET; 1h 20min ago Process: 1252 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCES> Main PID: 1252 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 16975) Memory: 512B CGroup: /system.slice/kdump.service
第 4 章 在 Microsoft Azure 上配置红帽高可用性集群 复制链接链接已复制到粘贴板!
要创建一个集群,其中当节点出现故障时,RHEL 节点会自动重新分发其工作负载,请使用 Red Hat High Availability Add-On。此类高可用性(HA)集群也可以托管在公有云平台上,包括 Microsoft Azure。在 Azure 上创建 RHEL HA 集群与在非云环境中创建 HA 集群类似,只是有一些细节不同。
要使用 Azure 虚拟机(VM)实例作为集群节点在 Azure 上配置 Red Hat HA 集群,请参阅以下部分。这些部分中的流程假定您要为 Azure 创建一个自定义镜像。您可以使用多个选项来获取用于集群的 RHEL 9 镜像。如需有关 Azure 镜像选项的信息,请参阅 Azure 上的 Red Hat Enterprise Linux Image 选项 。
以下部分提供:
- 为 Azure 设置环境的先决条件的流程。建立环境后,您可以创建并配置 Azure 虚拟机实例。
- 特定于 HA 集群创建的流程,其将 Azure 上的单个节点转换为 HA 集群的节点。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离和安装 Azure 网络资源代理的步骤。
先决条件
- 注册 红帽客户门户网站帐户 。
- 注册具有管理员特权的 Microsoft Azure 帐户。
- 您需要安装 Azure 命令行界面(CLI)。如需更多信息,请参阅安装 Azure CLI。
4.1. 在公有云平台上使用高可用性集群的好处 复制链接链接已复制到粘贴板!
高可用性(HA)集群是一组连接在一起来运行特定工作负载的计算机(称为 节点)。HA 集群的目的是在硬件或软件出现故障时提供冗余功能。如果 HA 集群中的节点失败,Pacemaker 集群资源管理器会将工作负载分发到其他节点,且集群中运行的服务不会出现明显停机时间。
您还可以在公有云平台上运行 HA 集群。在这种情况下,您要将云中的虚拟机(VM)实例用作单独的集群节点。在公有云平台上使用 HA 集群有以下优点:
- 提高了可用性:如果出现虚拟机故障,工作负载会被快速重新分发到其他节点,因此运行的服务不会中断。
- 可扩展性:在需求高时启动额外的节点,在需求低时,停止它们。
- 节约成本:采用现收现付计价时,您只需为正在运行的节点支付费用。
- 简化管理:有些公有云平台提供管理界面,以便更轻松地配置 HA 集群。
要在 Red Hat Enterprise Linux (RHEL)系统上启用 HA,红帽提供了一个高可用性附加组件。高可用性附加组件提供了在 RHEL 系统上创建 HA 集群的所有必要组件。这些组件包括高可用性服务管理和集群管理工具。
4.2. 在 Azure 中创建资源 复制链接链接已复制到粘贴板!
完成以下流程来创建区域、资源组、存储帐户、虚拟网络和可用性集。您需要这些资源来在 Microsoft Azure 上建立集群。
流程
使用 Azure 验证您的系统并登录。
$ az login注意如果在您的环境中有浏览器,则 CLI 会打开浏览器到 Azure 登录页面。
例如:
[clouduser@localhost]$ az login To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code FDMSCMETZ to authenticate. [ { "cloudName": "AzureCloud", "id": "Subscription ID", "isDefault": true, "name": "MySubscriptionName", "state": "Enabled", "tenantId": "Tenant ID", "user": { "name": "clouduser@company.com", "type": "user" } } ]在 Azure 区域中创建资源组。
$ az group create --name resource-group --location azure-region例如:
[clouduser@localhost]$ az group create --name azrhelclirsgrp --location southcentralus { "id": "/subscriptions//resourceGroups/azrhelclirsgrp", "location": "southcentralus", "managedBy": null, "name": "azrhelclirsgrp", "properties": { "provisioningState": "Succeeded" }, "tags": null }创建存储帐户。
$ az storage account create -l azure-region -n storage-account-name -g resource-group --sku sku_type --kind StorageV2例如:
[clouduser@localhost]$ az storage account create -l southcentralus -n azrhelclistact -g azrhelclirsgrp --sku Standard_LRS --kind StorageV2 { "accessTier": null, "creationTime": "2017-04-05T19:10:29.855470+00:00", "customDomain": null, "encryption": null, "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Storage/storageAccounts/azrhelclistact", "kind": "StorageV2", "lastGeoFailoverTime": null, "location": "southcentralus", "name": "azrhelclistact", "primaryEndpoints": { "blob": "https://azrhelclistact.blob.core.windows.net/", "file": "https://azrhelclistact.file.core.windows.net/", "queue": "https://azrhelclistact.queue.core.windows.net/", "table": "https://azrhelclistact.table.core.windows.net/" }, "primaryLocation": "southcentralus", "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "secondaryEndpoints": null, "secondaryLocation": null, "sku": { "name": "Standard_LRS", "tier": "Standard" }, "statusOfPrimary": "available", "statusOfSecondary": null, "tags": {}, "type": "Microsoft.Storage/storageAccounts" }获取存储帐户连接字符串。
$ az storage account show-connection-string -n storage-account-name -g resource-group例如:
[clouduser@localhost]$ az storage account show-connection-string -n azrhelclistact -g azrhelclirsgrp { "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...==" }通过复制连接字符串并将其粘贴到以下命令来导出连接字符串。这个字符串将您的系统连接到存储帐户。
$ export AZURE_STORAGE_CONNECTION_STRING="storage-connection-string"例如:
[clouduser@localhost]$ export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="创建存储容器。
$ az storage container create -n container-name例如:
[clouduser@localhost]$ az storage container create -n azrhelclistcont { "created": true }创建虚拟网络。所有群集节点必须位于同一个虚拟网络中。
$ az network vnet create -g resource group --name vnet-name --subnet-name subnet-name例如:
[clouduser@localhost]$ az network vnet create --resource-group azrhelclirsgrp --name azrhelclivnet1 --subnet-name azrhelclisubnet1 { "newVNet": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "dhcpOptions": { "dnsServers": [] }, "etag": "W/\"\"", "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1", "location": "southcentralus", "name": "azrhelclivnet1", "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "resourceGuid": "0f25efee-e2a6-4abe-a4e9-817061ee1e79", "subnets": [ { "addressPrefix": "10.0.0.0/24", "etag": "W/\"\"", "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1/subnets/azrhelclisubnet1", "ipConfigurations": null, "name": "azrhelclisubnet1", "networkSecurityGroup": null, "provisioningState": "Succeeded", "resourceGroup": "azrhelclirsgrp", "resourceNavigationLinks": null, "routeTable": null } ], "tags": {}, "type": "Microsoft.Network/virtualNetworks", "virtualNetworkPeerings": null } }创建可用性集。所有集群节点都必须处于相同的可用性集。
$ az vm availability-set create --name MyAvailabilitySet --resource-group MyResourceGroup例如:
[clouduser@localhost]$ az vm availability-set create --name rhelha-avset1 --resource-group azrhelclirsgrp { "additionalProperties": {}, "id": "/subscriptions/.../resourceGroups/azrhelclirsgrp/providers/Microsoft.Compute/availabilitySets/rhelha-avset1", "location": "southcentralus", "name": “rhelha-avset1", "platformFaultDomainCount": 2, "platformUpdateDomainCount": 5, [omitted]
4.3. 高可用性所需的系统软件包 复制链接链接已复制到粘贴板!
流程假设您要为使用 Red Hat Enterprise Linux 的 Azure HA 创建一个虚拟机镜像。要成功完成这个过程,必须安装以下软件包。
| 软件包 | 软件仓库 | 描述 |
|---|---|---|
| libvirt | rhel-9-for-x86_64-appstream-rpms | 用于管理平台虚拟化的开源 API、守护进程和管理工具 |
| virt-install | rhel-9-for-x86_64-appstream-rpms | 用于构建虚拟机的命令行工具 |
| libguestfs | rhel-9-for-x86_64-appstream-rpms | 用于访问和修改虚拟机文件系统的库 |
| guestfs-tools | rhel-9-for-x86_64-appstream-rpms |
虚拟机的系统管理工具;包括 |
4.4. Azure VM 配置设置 复制链接链接已复制到粘贴板!
Azure 虚拟机(VM)必须具有以下配置设置。其中一些设置会在初始创建虚拟机期间启用。为 Azure 置备虚拟机镜像时会设置其他设置。在进行操作时请记住这些设置。如有必要,请参阅它们。
| 设置 | 建议 |
|---|---|
| SSH | 必须启用 SSH 来提供 Azure 虚拟机的远程访问。 |
| dhcp | 应该为 dhcp 配置主虚拟适配器(仅限 IPv4)。 |
| 交换空间 |
不要在安装过程中在操作系统(OS)磁盘或存储磁盘上创建专用 |
| NIC |
为主虚拟网络适配器选择 |
| encryption | 对于自定义镜像,使用 Network Bound Disk Encryption(NBDE)在 Azure 上进行全磁盘加密。 |
4.5. 安装 Hyper-V 设备驱动程序 复制链接链接已复制到粘贴板!
Microsoft 提供了网络和存储设备驱动程序,作为其 Hyper-V 软件包的 Linux 集成服务(LIS)的一部分。在将虚拟机镜像配置为 Azure虚拟机(VM)之前, Hyper-V 可能需要在其上安装 Hyper-V 设备驱动程序。使用 lsinitrd | grep hv 命令来验证是否已安装了驱动程序。
流程
输入以下
grep命令,来确定是否已安装了所需的 Hyper-V 设备驱动程序:# lsinitrd | grep hv在以下示例中安装了所有必需的驱动程序。
# lsinitrd | grep hv drwxr-xr-x 2 root root 0 Aug 12 14:21 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/hv -rw-r--r-- 1 root root 31272 Aug 11 08:45 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/hv/hv_vmbus.ko.xz -rw-r--r-- 1 root root 25132 Aug 11 08:46 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/net/hyperv/hv_netvsc.ko.xz -rw-r--r-- 1 root root 9796 Aug 11 08:45 usr/lib/modules/3.10.0-932.el9.x86_64/kernel/drivers/scsi/hv_storvsc.ko.xz如果没有安装所有驱动程序,请完成剩余的步骤。
注意环境中可能存在
hv_vmbus驱动程序。即使存在这个驱动程序,请完成以下步骤。-
在
/etc/dracut.conf.d中创建一个名为hv.conf的文件。 在
hv.conf文件中添加以下驱动程序参数。add_drivers+=" hv_vmbus " add_drivers+=" hv_netvsc " add_drivers+=" hv_storvsc " add_drivers+=" nvme "注意请注意引号前后的空格,例如
add_drivers+=" hv_vmbus "。这样可确保在环境中存在其他 Hyper-V 驱动程序时载入唯一驱动程序。重新生成
initramfs镜像。# dracut -f -v --regenerate-all
验证
- 重启机器。
-
运行
lsinitrd | grep hv命令来验证是否已安装了驱动程序。
4.6. 进行 Microsoft Azure 部署所需的配置更改 复制链接链接已复制到粘贴板!
在将自定义基础镜像部署到 Azure 之前,您必须执行额外的配置更改,以确保虚拟机(VM)可以在 Azure 中正常工作。
流程
- 登录到虚拟机。
注册虚拟机并启用 Red Hat Enterprise Linux 9 软件仓库。
# subscription-manager register Installed Product Current Status: Product Name: Red Hat Enterprise Linux for x86_64 Status: Subscribed确保安装了
cloud-init和hyperv-daemons软件包。# dnf install cloud-init hyperv-daemons -y创建与 Azure 服务集成所需的
cloud-init配置文件:要启用对 Hyper-V Data Exchange Service(KVP)的日志记录,请创建
/etc/cloud/cloud.cfg.d/10-azure-kvp.cfg配置文件,并将以下行添加到该文件中。reporting: logging: type: log telemetry: type: hyperv要将 Azure 添加为数据源,请创建
/etc/cloud/cloud.cfg.d/91-azure_datasource.cfg配置文件,并将以下行添加到该文件中。datasource_list: [ Azure ] datasource: Azure: apply_network_config: False要在临时磁盘上配置交换空间,请创建
/etc/cloud/cloud.cfg.d/00-azure-swap.cfg配置文件并添加以下行。重要临时磁盘是临时存储。因此,当虚拟机被取消或移动时,存储的数据(包括交换空间)将会丢失。将临时磁盘仅用于临时数据,如交换空间。
#cloud-config disk_setup: ephemeral0: table_type: gpt layout: [66, [33,82]] overwrite: true fs_setup: - device: ephemeral0.1 filesystem: ext4 - device: ephemeral0.2 filesystem: swap mounts: - ["ephemeral0.1", "/mnt"] - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service", "0", "0"]
要确保特定内核模块自动被阻止加载,请编辑或创建
/etc/modprobe.d/blocklist.conf文件,并将以下行添加到该文件中。blacklist nouveau blacklist lbm-nouveau blacklist floppy blacklist amdgpu blacklist skx_edac blacklist intel_cstate修改
udev网络设备规则:如果存在,请删除以下持久性网络设备规则。
# rm -f /etc/udev/rules.d/70-persistent-net.rules # rm -f /etc/udev/rules.d/75-persistent-net-generator.rules # rm -f /etc/udev/rules.d/80-net-name-slot-rules要确保在 Azure 上的加速网络按预期工作,请创建一个新的网络设备规则
/etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules,并将以下行添加到其中。SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION=="add", ENV{NM_UNMANAGED}="1"
将
sshd服务设置为自动启动。# systemctl enable sshd # systemctl is-enabled sshd修改内核引导参数:
打开
/etc/default/grub文件,并确保GRUB_TIMEOUT行有以下值:GRUB_TIMEOUT=10如果存在的话,从
GRUB_CMDLINE_LINUX行的末尾删除以下选项。rhgb quiet确保
/etc/default/grub文件包含具有所有指定选项的以下行:GRUB_CMDLINE_LINUX="loglevel=3 crashkernel=auto console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300" GRUB_TIMEOUT_STYLE=countdown GRUB_TERMINAL="serial console" GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"注意如果您没有在 HDD 上运行工作负载,请将
elevator=none添加到GRUB_CMDLINE_LINUX行的末尾。这会将 I/O 调度程序设置为none,这可以提高基于 SSD 的系统上的 I/O 性能。重新生成
grub.cfg文件。在基于 BIOS 的机器上:
在 RHEL 9.2 及更早版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg在 RHEL 9.3 及更高版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
在基于 UEFI 的机器上:
在 RHEL 9.2 及更早版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg在 RHEL 9.3 及更高版本中:
# grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline警告对于基于 BIOS 和 UEFI 的机器,重建
grub.cfg的路径是一样的。实际的grub.cfg只在 BIOS 路径中存在。UEFI 路径有一个 stub 文件,不能使用grub2-mkconfig命令修改或重新创建。如果您的系统对
grub.cfg使用非默认位置,请相应地调整命令。
配置 Windows Azure Linux 代理(
WALinuxAgent):安装并启用
WALinuxAgent软件包。# dnf install WALinuxAgent -y # systemctl enable waagent要在 WALinuxAgent 中禁用交换配置(在使用
cloud-init管理交换时必需),请编辑/etc/waagent.conf文件中的以下行。Provisioning.DeleteRootPassword=y ResourceDisk.Format=n ResourceDisk.EnableSwap=n ResourceDisk.SwapSizeMB=0注意通过在 WALinuxAgent 中禁用 swap,您可以启用
cloud-init来管理临时磁盘上的交换配置。
为 Azure 置备准备虚拟机:
从 Red Hat Subscription Manager 取消注册虚拟机。
# subscription-manager unregister清理现有置备详情。
# waagent -force -deprovision注意这个命令会产生警告,这是预期的,因为 Azure 会自动处理虚拟机的置备。
清理 shell 历史记录并关闭虚拟机。
# export HISTSIZE=0 # poweroff
4.7. 创建 Azure 活动目录应用程序 复制链接链接已复制到粘贴板!
完成以下流程来创建 Azure 活动目录(AD)应用程序。Azure AD 应用程序为集群中所有节点的 HA 操作授权并自动化访问权限。
先决条件
- Azure 命令行界面(CLI) 已安装在您的系统上。
- 您是 Microsoft Azure 订阅的管理员或所有者。您需要此授权来创建 Azure AD 应用程序。
流程
在 HA 集群的任何节点上,登录到您的 Azure 帐户。
$ az login为 Azure 隔离代理的自定义角色创建一个
json配置文件。使用以下配置,但将 <subscription-id> 替换为您的订阅 ID。{ "Name": "Linux Fence Agent Role", "description": "Allows to power-off and start virtual machines", "assignableScopes": [ "/subscriptions/<subscription-id>" ], "actions": [ "Microsoft.Compute/*/read", "Microsoft.Compute/virtualMachines/powerOff/action", "Microsoft.Compute/virtualMachines/start/action" ], "notActions": [], "dataActions": [], "notDataActions": [] }为 Azure 隔离代理定义自定义角色。使用上一步中创建的
json文件进行此操作。$ az role definition create --role-definition azure-fence-role.json { "assignableScopes": [ "/subscriptions/<my-subscription-id>" ], "description": "Allows to power-off and start virtual machines", "id": "/subscriptions/<my-subscription-id>/providers/Microsoft.Authorization/roleDefinitions/<role-id>", "name": "<role-id>", "permissions": [ { "actions": [ "Microsoft.Compute/*/read", "Microsoft.Compute/virtualMachines/powerOff/action", "Microsoft.Compute/virtualMachines/start/action" ], "dataActions": [], "notActions": [], "notDataActions": [] } ], "roleName": "Linux Fence Agent Role", "roleType": "CustomRole", "type": "Microsoft.Authorization/roleDefinitions" }- 在 Azure web 控制台界面中,选择 Virtual Machine → 点左侧菜单中的 Identity 。
- 选择 On → 点Save → 点 Yes 确认。
- 点 Azure role assignments → Add role assignment。
-
选择角色所需的Scope,如
Resource Group。 - 选择所需的 Resource Group。
- 可选:如果需要,请修改 订阅。
- 选择 Linux Fence Agent Role 角色。
- 点击 Save。
验证
显示 Azure AD 可见的节点。
# fence_azure_arm --msi -o list node1, node2, [...]如果这个命令输出集群中的所有节点,则 AD 应用程序已成功配置。
4.8. 将镜像转换为固定 VHD 格式 复制链接链接已复制到粘贴板!
所有 Microsoft Azure VM 镜像都必须是固定的 VHD 格式。镜像必须在将镜像转换为 VHD 之前被对齐到 1 MB 边界。要将镜像从 qcow2 转换为固定的 VHD 格式,并对齐图像,请参阅以下流程。转换镜像后,您可以将其上传到 Azure。
流程
将镜像从
qcow2转换为raw格式。$ qemu-img convert -f qcow2 -O raw <image-name>.qcow2 <image-name>.raw创建一个具有以下内容的 shell 脚本:
#!/bin/bash MB=$((1024 * 1024)) size=$(qemu-img info -f raw --output json "$1" | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}') rounded_size=$((($size/$MB + 1) * $MB)) if [ $(($size % $MB)) -eq 0 ] then echo "Your image is already aligned. You do not need to resize." exit 1 fi echo "rounded size = $rounded_size" export rounded_size运行脚本。本例使用名称
align.sh。$ sh align.sh <image-xxx>.raw- 如需显示 "Your image is already aligned.You do not need to resize.",执行以下步骤。
- 如果显示了一个值,代表您的镜像没有被对齐。
使用以下命令来将文件转换为固定的
VHD格式:示例使用 qemu-img 版本 2.12.0。
$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd转换后,
VHD文件就可以上传到 Azure。如果
raw镜像不一致,请完成以下步骤使其保持一致。在运行验证脚本时,使用显示的舍入值来调整
raw文件的大小。$ qemu-img resize -f raw <image-xxx>.raw <rounded-value>将
raw镜像文件转换为VHD格式。示例使用 qemu-img 版本 2.12.0。
$ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd转换后,
VHD文件就可以上传到 Azure。
4.9. 上传并创建 Azure 镜像 复制链接链接已复制到粘贴板!
完成以下步骤,将 VHD 文件上传到容器,并创建 Azure 自定义镜像。
系统重启后,导出的存储连接字符串不会保留。如果以下步骤中的任何命令失败,请再次导出连接字符串。
流程
将
VHD文件上传到存储容器。它可能需要几分钟时间。要获取存储容器的列表,请输入az storage container list命令。$ az storage blob upload \ --account-name <storage-account-name> --container-name <container-name> \ --type page --file <path-to-vhd> --name <image-name>.vhd示例:
[clouduser@localhost]$ az storage blob upload \ --account-name azrhelclistact --container-name azrhelclistcont \ --type page --file rhel-image-{ProductNumber}.vhd --name rhel-image-{ProductNumber}.vhd Percent complete: %100.0获取上传的
VHD文件的 URL,以便在下面的步骤中使用。$ az storage blob url -c <container-name> -n <image-name>.vhd示例:
$ az storage blob url -c azrhelclistcont -n rhel-image-9.vhd "https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-9.vhd"创建 Azure 自定义镜像。
$ az image create -n <image-name> -g <resource-group> -l <azure-region> --source <URL> --os-type linux注意虚拟机的默认 hypervisor 系列为 V1。您可以通过包含
--hyper-v-generation V2选项来(可选)指定 V2 管理程序生成。第二代虚拟机使用基于 UEFI 的引导架构。如需有关第 2 代虚拟机的信息,请参阅 对 Azure 上第 2 代虚拟机的支持。命令可能会返回错误"Only blobs formatted as VHDs can be imported."此错误可能意味着在转换为
VHD之前,镜像与最接近的 1 MB 边界不一致。示例:
$ az image create -n rhel9 -g azrhelclirsgrp2 -l southcentralus --source https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-9.vhd --os-type linux
4.10. 安装 Red Hat HA 软件包和代理 复制链接链接已复制到粘贴板!
在所有节点上完成以下步骤。
流程
启动一个 SSH 终端会话,并使用管理员名称和公共 IP 地址连接到虚拟机。
$ ssh administrator@PublicIP要获取 Azure 虚拟机的公共 IP 地址,请在 Azure 门户网站中打开虚拟机属性,或者输入以下 Azure CLI 命令。
$ az vm list -g <resource_group> -d --output table例如:
[clouduser@localhost ~] $ az vm list -g azrhelclirsgrp -d --output table Name ResourceGroup PowerState PublicIps Location ------ ---------------------- -------------- ------------- -------------- node01 azrhelclirsgrp VM running 192.98.152.251 southcentralus在红帽注册虚拟机。
$ sudo -i # subscription-manager register禁用所有软件仓库。
# subscription-manager repos --disable=*启用 RHEL 9 服务器 HA 软件仓库。
# subscription-manager repos --enable=rhel-9-for-x86_64-highavailability-rpms更新所有软件包。
# dnf update -y安装红帽高可用性附加组件软件包,以及来自高可用性渠道中的 Azure 隔离代理。
# dnf install pcs pacemaker fence-agents-azure-arm用户
hacluster在最后一步中的 pcs 和 pacemaker 安装过程中创建。在所有群集节点上为hacluster创建密码。所有节点都使用相同的密码。# passwd hacluster如果安装了
firewalld.service,请在 RHEL Firewall 中添加high availability服务。# firewall-cmd --permanent --add-service=high-availability # firewall-cmd --reload启动
pcs服务,并使其在引导时启动。# systemctl start pcsd.service # systemctl enable pcsd.service Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
验证
确保
pcs服务正在运行。# systemctl status pcsd.service pcsd.service - PCS GUI and remote configuration interface Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2018-02-23 11:00:58 EST; 1min 23s ago Docs: man:pcsd(8) man:pcs(8) Main PID: 46235 (pcsd) CGroup: /system.slice/pcsd.service └─46235 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
4.11. 创建集群 复制链接链接已复制到粘贴板!
完成以下步骤以创建节点集群。
流程
在其中一个节点上,输入以下命令来验证 pcs 用户
hacluster。在该命令中,指定集群中的每个节点的名称。# pcs host auth <hostname1> <hostname2> <hostname3>示例:
[root@node01 clouduser]# pcs host auth node01 node02 node03 Username: hacluster Password: node01: Authorized node02: Authorized node03: Authorized创建集群。
# pcs cluster setup <cluster_name> <hostname1> <hostname2> <hostname3>示例:
[root@node01 clouduser]# pcs cluster setup new_cluster node01 node02 node03 [...] Synchronizing pcsd certificates on nodes node01, node02, node03... node02: Success node03: Success node01: Success Restarting pcsd on the nodes in order to reload the certificates... node02: Success node03: Success node01: Success
验证
启用集群。
[root@node01 clouduser]# pcs cluster enable --all node02: Cluster Enabled node03: Cluster Enabled node01: Cluster Enabled启动集群。
[root@node01 clouduser]# pcs cluster start --all node02: Starting Cluster... node03: Starting Cluster... node01: Starting Cluster...
4.12. 隔离(fencing)概述 复制链接链接已复制到粘贴板!
如果与集群中某个节点通信失败,那么集群中的其他节点必须能够限制或释放对故障集群节点可访问的资源的访问。这无法通过通过联系集群节点本身来实现,因为集群节点可能没有响应。反之,必须提供一个外部的方法来实现。这个方法为称为隔离(fencing)。
不响应的节点可能仍然在访问数据。确定您的数据是安全的唯一方法是使用 STONITH 隔离节点。STONITH 是"Shoot The Other Node In The Head"的缩写,它保护您的数据不受有问题的节点或并发访问的影响。使用 STONITH 可以确保,在允许从另一个节点访问数据前确定节点真正离线。
4.13. 创建隔离设备 复制链接链接已复制到粘贴板!
完成以下步骤来配置隔离。在集群中的任何节点中完成这些命令
先决条件
您需要将集群属性stonith-enabled 设为 true。
流程
识别每个 RHEL 虚拟机的 Azure 节点名称。您可以使用 Azure 节点名称来配置隔离设备。
# fence_azure_arm \ -l <AD-Application-ID> -p <AD-Password> \ --resourceGroup <MyResourceGroup> --tenantId <Tenant-ID> \ --subscriptionId <Subscription-ID> -o list例如:
[root@node01 clouduser]# fence_azure_arm \ -l e04a6a49-9f00-xxxx-xxxx-a8bdda4af447 -p z/a05AwCN0IzAjVwXXXXXXXEWIoeVp0xg7QT//JE= --resourceGroup azrhelclirsgrp --tenantId 77ecefb6-cff0-XXXX-XXXX-757XXXX9485 --subscriptionId XXXXXXXX-38b4-4527-XXXX-012d49dfc02c -o list node01, node02, node03,查看 Azure ARM STONITH 代理的选项。
# pcs stonith describe fence_azure_arm例如:
# pcs stonith describe fence_apc Stonith options: password: Authentication key password_script: Script to run to retrieve password警告对于提供方法选项的隔离代理,请不要指定循环值,因为它不被支持,并可能导致数据崩溃。
有些隔离设备只能隔离一个节点,其他设备则可能隔离多个节点。您创建隔离设备时指定的参数取决于您的隔离设备的支持和要求。
您可以在创建隔离设备时使用
pcmk_host_list参数,以指定由该隔离设备控制的所有机器。在创建隔离设备时,您可以使用
pcmk_host_map参数将主机名映射到包含隔离设备的规范。创建隔离设备。
# pcs stonith create clusterfence fence_azure_arm- 要确保即时和完全的隔离,请在所有群集节点上禁用 ACPI Soft-Off。有关禁用 ACPI Soft-Off 的详情,请参考 禁用 ACPI 以用于集成的隔离设备。
验证
测试其他其中一个节点的隔离代理。
# pcs stonith fence azurenodename例如:
[root@node01 clouduser]# pcs status Cluster name: newcluster Stack: corosync Current DC: node01 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum Last updated: Fri Feb 23 11:44:35 2018 Last change: Fri Feb 23 11:21:01 2018 by root via cibadmin on node01 3 nodes configured 1 resource configured Online: [ node01 node03 ] OFFLINE: [ node02 ] Full list of resources: clusterfence (stonith:fence_azure_arm): Started node01 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled启动上一步中隔离的节点。
# pcs cluster start <hostname>检查状态以验证节点已启动。
# pcs status例如:
[root@node01 clouduser]# pcs status Cluster name: newcluster Stack: corosync Current DC: node01 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum Last updated: Fri Feb 23 11:34:59 2018 Last change: Fri Feb 23 11:21:01 2018 by root via cibadmin on node01 3 nodes configured 1 resource configured Online: [ node01 node02 node03 ] Full list of resources: clusterfence (stonith:fence_azure_arm): Started node01 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
4.14. 创建 Azure 内部负载均衡器 复制链接链接已复制到粘贴板!
Azure 内部负载均衡器会删除对健康探测请求没有做出响应的集群节点。
执行以下步骤来创建 Azure 内部负载均衡器。每个步骤都引用特定的 Microsoft 流程,并包含用于自定义 HA 负载均衡器的设置。
先决条件
流程
- 创建基本负载均衡器。为 IP 地址分配类型选择 Internal load balancer、Basic SKU 和 Dynamic。
- 创建后端地址池。将后端池与在 HA 中创建 Azure 资源时创建的可用性集关联。不要设置任何目标网络 IP 配置。
- 创建健康探测。对于健康探测,选择 TCP 并输入端口 61000。您可以使用不会影响到另一个服务的 TCP 端口号。对于某些 HA 产品应用(如 SAP HANA 和 SQL Server),您可能需要与 Microsoft 合作以确定要使用的正确端口。
- 创建负载均衡规则。要创建负载均衡规则,默认值会预先填充。确保将 Floating IP (direct server return) 设置为 Enabled。
4.15. 配置负载均衡资源代理 复制链接链接已复制到粘贴板!
创建健康探测后,您必须配置 负载均衡 资源代理。此资源代理运行一个服务,它回答来自 Azure 负载均衡器的健康探测请求,并删除不回答请求的集群节点。
流程
在所有节点上安装
nmap-ncat资源代理。# dnf install nmap-ncat resource-agents-cloud在单个节点上执行以下步骤。
创建
pcs资源和组。将负载均衡器 FrontendIP 用于 IPaddr2 地址。# pcs resource create resource-name IPaddr2 ip="10.0.0.7" --group cluster-resources-group配置
负载平衡资源代理。# pcs resource create resource-loadbalancer-name azure-lb port=port-number --group cluster-resources-group
验证
运行
pcs status来查看结果。[root@node01 clouduser]# pcs status输出示例:
Cluster name: clusterfence01 Stack: corosync Current DC: node02 (version 1.1.16-12.el7_4.7-94ff4df) - partition with quorum Last updated: Tue Jan 30 12:42:35 2018 Last change: Tue Jan 30 12:26:42 2018 by root via cibadmin on node01 3 nodes configured 3 resources configured Online: [ node01 node02 node03 ] Full list of resources: clusterfence (stonith:fence_azure_arm): Started node01 Resource Group: g_azure vip_azure (ocf::heartbeat:IPaddr2): Started node02 lb_azure (ocf::heartbeat:azure-lb): Started node02 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
第 5 章 使用安全引导在 Azure 上配置 RHEL 复制链接链接已复制到粘贴板!
安全引导是统一可扩展固件接口(UEFI)规范中一种机制,可在引导时控制程序的执行。安全引导会在引导时验证引导装载程序及其组件的数字签名,以确保只执行可信和授权的程序,并防止未经授权的程序加载。
为 Azure 平台上公开的 RHEL 镜像启用安全引导。默认情况下,它具有带有 Microsoft 证书的允许签名数据库(db)。Microsoft Azure 允许在 Azure Compute Gallery 中注册新镜像版本时,将自定义证书添加到 UEFI 安全引导变量中。
5.1. 了解云上的 RHEL 安全引导 复制链接链接已复制到粘贴板!
安全引导是统一可扩展固件接口(UEFI)的一项功能,可确保在引导时只执行可信和数字签名的程序和组件,如引导装载程序和内核。安全引导根据硬件中存储的可信密钥验证数字签名,如果它检测到任何由不受信任的实体签名的组件,则会中止引导过程。这可以防止恶意软件破坏操作系统。
安全引导是配置机密虚拟机(CVM)的基本组件,因为它保证引导链中只存在可信实体。它通过定义的接口提供对特定设备路径的身份验证访问,这样可确保只使用最新的配置,同时永久覆盖之前的配置。另外,当 Red Hat Enterprise Linux 内核启用安全引导机制时,它会进入 lockdown 模式,这样可确保只加载由可信供应商签名的内核模块。因此,安全引导提高了操作系统引导序列的安全性。
5.1.1. 安全引导组件 复制链接链接已复制到粘贴板!
安全引导机制包括固件、签名数据库、加密密钥、引导装载程序、硬件模块和操作系统。以下是 UEFI 可信变量的组件:
-
密钥交换密钥数据库(KEK):公钥交换,以在 RHEL 操作系统和虚拟机固件之间建立信任。您还可以使用这些密钥更新允许签名数据库(
db)和禁止签名数据库(dbx)。 - 平台密钥数据库(PK):一个自签名的单密钥数据库,用于在虚拟机固件和云平台之间建立信任。PK 还更新 KEK 数据库。
-
允许签名数据库(
db):维护证书或二进制哈希列表的数据库,以检查是否允许二进制文件在系统上引导。另外,来自db的所有证书都会导入到 RHEL 内核的.platform密钥环中。此功能允许您在锁定模式下添加和加载签名的第三方内核模块。 -
禁止签名数据库(
dbx):维护禁止在系统上引导的证书或二进制哈希列表的数据库。
针对 dbx 数据库和安全引导高级目标(SBAT)机制的二进制文件检查。SBAT 允许您通过保持签名二进制文件的证书保持有效的证书来撤销特定二进制文件的旧版本。
5.1.2. Cloud 上 RHEL 的安全引导阶段 复制链接链接已复制到粘贴板!
当 RHEL 实例以 Unified Kernel Image (UKI)模式引导并启用了安全引导时,RHEL 实例会按照以下顺序与云服务基础架构进行交互:
- 初始化 :当 RHEL 实例引导时,云托管固件最初引导并实施安全引导机制。
- 变量存储初始化 :固件会从变量存储初始化 UEFI 变量,这是一个专用的存储区域,用于固件需要管理引导过程和运行时操作的信息。当 RHEL 实例首次启动时,存储会从与虚拟机镜像关联的默认值初始化。
引导装载程序 :引导时,固件会加载第一个阶段引导装载程序。对于 x86 UEFI 环境中的 RHEL 实例,第一个阶段引导装载程序是 shim。shim 引导装载程序验证并加载引导过程的下一阶段,并作为 UEFI 和 GRUB 之间的桥接。
-
RHEL 中的 shim x86 二进制文件目前由
Microsoft 公司 UEFI CA 2011Microsoft 证书签名,以便 RHEL 实例可以在启用了安全引导模式的不同硬件和虚拟平台上引导,其中 Allowed 签名数据库(db)包含默认的 Microsoft 证书。 -
shim 二进制文件使用 Red Hat Secure Boot CA 扩展可信证书列表,以及可选的 Machine Owner Key (
MOK)。
-
RHEL 中的 shim x86 二进制文件目前由
-
UKI: shim 二进制文件加载 RHEL UKI (
kernel-uki-virt软件包)。UKI 由相应证书签名,即 x86_64 架构上的红帽安全引导签名 504,可在redhat-sb-certs软件包中找到。此证书由红帽安全引导 CA 签名,因此通过检查。 -
UKI 附加组件 :要使用 UKI
cmdline扩展,RHEL 内核将根据 shim 提供的db、MOK和证书检查其签名,以确保扩展由操作系统供应商 RHEL 或用户签名。
当 RHEL 内核以安全引导模式引导时,它会进入 锁定模式。输入 lockdown 后,RHEL 内核会将 db 密钥添加到 .platform 密钥环中,并将 MOK 密钥添加到 .machine 密钥环中。在内核构建过程中,标准 RHEL 内核模块(如 kernel-modules-core、kernel-modules、kernel-modules-extra )使用由私钥和公钥组成的临时密钥签名。完成每个内核构建后,私钥变得过时,以签署第三方模块。db 和 MOK 的证书可用于此目的。
5.2. 使用安全引导在 Azure 上配置 RHEL 虚拟机 复制链接链接已复制到粘贴板!
要确保 Azure 云平台上的 Red Hat Enterprise Linux 实例有一个安全的操作系统引导过程,请使用安全引导(Secure Boot)。当注册自定义 RHEL Azure 镜像时,镜像由安全引导的预存储统一固件接口(UEFI)变量组成。这可让从 RHEL 镜像启动的所有实例都使用带有第一次引导时所需的变量的安全引导机制。
Microsoft Azure 支持使用受信任的启动虚拟机的安全引导。这些虚拟机提供安全机制来保护对 rootkits 和 bootkits 的影响,同时提供了其他功能,如 Virtual Trusted Platform Manager (vTPM)。使用 GUI 创建实例时,您可以在 Configure security features 设置中找到 Enable secure 引导选项。
先决条件
已安装这些软件包:
-
python3 -
openssl -
efivar -
keyutils -
python3-virt-firmware
-
-
已安装
azure-cli工具。详情请参阅在 Linux 上安装 Azure CLI。
流程
使用
openssl工具生成自定义证书custom_db.cer:$ openssl req -quiet \ -newkey rsa:4096 \ -nodes -keyout custom_db.key \ -new -x509 \ -sha256 -days 3650 \ -subj "/CN=Signature Database key/" \ --outform DER \ -out custom_db.cer将证书转换为
base64编码的格式:$ echo base64 -w0 custom_db.cer MIIFIjCCAwqgAwIBAgITNf23J4k0d8c0NR ....创建并编辑
azure-example-template.jsonAzure Resource Manager (ARM)文件,以注册新的 Azure Compute Gallery 镜像版本:$ vi azure-example-template.json { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Compute/galleries/images/versions", "apiVersion": "2023-07-03", "name": "<your compute gallery/your image definition/version>", "location": "<location of the VHD>", "properties": { "storageProfile": { "osDiskImage": { "source": { "id": "<your-storage-account-id>", "uri": "<url-with-the-vhd>" }, "hostCaching": "ReadOnly" } }, "securityProfile": { "uefiSettings": { "signatureTemplateNames": [ "MicrosoftUefiCertificateAuthorityTemplate" ], "additionalSignatures": { "db": [ { "type": "x509", "value": [ "<base64 of custom_db.cer>" ] } ] } } } } } ] }使用
azure-cli工具注册镜像版本:$ az deployment group create --name <example-deployment> \ --resource-group <example-resource-group> \ --template-file <example-template.json>- 从 Azure 门户重启实例。
验证
检查新创建的 RHEL 实例是否启用了安全引导机制:
$ mokutil --sb-state SecureBoot enabled使用
keyctl工具验证自定义证书的内核密钥环:$ sudo keyctl list %:.platform keys in keyring: ... 586621657: ---lswrv 0 0 asymmetric: Signature Database key: f064979641c24e1b935e402bdbc3d5c4672a1acc ...
第 6 章 使用 Intel TDX 在公有云平台上配置 RHEL 复制链接链接已复制到粘贴板!
Intel Trust Domain Extensions (TDX)是安全类型 Confidential Virtual Machine (CVM),它为虚拟机提供了一个安全且隔离的环境。这种方法是对前一个技术(Intel Software Guard Extensions (SGX))的推进。
SGX 通过创建安全内存区域(称为 enclaves)提供虚拟机与 hypervisor 和云服务供应商的隔离。存储在 enclaves 中的应用程序代码可以访问存储在 enclaves 中的内存和数据,使其无法访问外部实体。
TDX 创建硬件隔离虚拟机,名为受信任的域(TD)。它确保仅虚拟机访问其内存和 TD 虚拟机与虚拟机管理器(VMM)、虚拟机监控程序、其他虚拟机和主机隔离。这可确保使用来自 hypervisor、CPU 和 TD 虚拟机的资源,通过维护数据机密和完整性来保持安全。
SGX 和 TDX 的主要区别在于,SGX 在应用程序级别上工作,而 TDX 通过限制 hypervisor 访问来在虚拟化级别上工作。
在公共云平台上部署 Red Hat Enterprise Linux (RHEL)之前,请仔细检查相应的云服务供应商,以获取特定 RHEL 实例类型的支持状态和认证。
6.1. 了解 Intel TDX 安全引导过程 复制链接链接已复制到粘贴板!
- 初始化和测量 :启用 TDX 的 hypervisor 设置虚拟机的初始状态。这个 hypervisor 将固件二进制文件加载到虚拟机内存中,并设置初始注册状态。Intel 处理器测量虚拟机的初始状态,并提供验证虚拟机初始状态的详细信息。
- firmware : 虚拟机启动 UEFI 固件。固件可能包含有状态或无状态的虚拟可信平台模块(vTPM)实现。有状态 vTPM 在虚拟机重启和迁移之间维护持久加密状态,而无状态 vTPM 会为每个虚拟机会话生成一个新的加密状态,而无需持久性。虚拟机特权级别(VMPL)技术将 vTPM 与客户机隔离。VMPL 在不同虚拟机组件和 hypervisor 之间提供硬件强制的特权隔离。
- vTPM :根据有状态 vTPM 的云服务供应商,UEFI 固件可能会执行远程测试来解密 vTPM 的持久状态。vTPM 还收集有关引导过程的数据,如安全引导状态、用于签名引导工件或 UEFI 二进制哈希的证书。
shim :当 UEFI 固件完成初始化过程时,它会搜索扩展的固件接口(EFI)系统分区。然后,UEFI 固件从那里验证并执行第一个阶段引导装载程序。对于 RHEL,这是
shim。shim程序允许非 Microsoft 操作系统从 EFI 系统分区加载第二阶段引导装载程序。-
shim使用红帽证书来验证第二阶段引导装载程序(grub)或 Red Hat Unified Kernel Image (UKI)。 -
GRUB或UKI解压缩、验证并执行 Linux 内核及 initramfs 以及内核命令行。这个过程可确保在可信和安全的环境中载入 Linux 内核。
-
initramfs :在 initramfs 中,如果完全磁盘加密技术,vTPM 信息会自动解锁加密的 root 分区。
-
当根卷可用时,
initramfs会在其中传输执行流。
-
当根卷可用时,
- attestation : VM 租户可以访问系统,并可执行远程测试,以确保访问的虚拟机是未修改的虚拟机(CVM)。attestation 基于 Intel 处理器和 vTPM 的信息执行。这个过程确认 RHEL 实例和 Intel 处理器的初始 CPU 和内存状态的真实性和可靠性。
- TEE :此过程创建受信任的执行环境(TEE),以确保引导虚拟机处于可信和安全的环境中。
6.2. 使用 Intel TDX 在 Azure 上配置 RHEL VM 复制链接链接已复制到粘贴板!
通过使用 Intel TDX,您可以创建称为可信域(TD)的硬件辅助隔离虚拟机。它确保只有虚拟机有权访问其资源,而仍无法访问虚拟机监控程序和主机。
先决条件
-
已安装
openssh和openssh-clients软件包。 - 已安装 Azure CLI 工具。详情请参阅 在 Linux 上安装 Azure CLI。
- 您已从支持的 Azure 实例类型启动 RHEL 实例。详情请参阅 Azure 机密虚拟机选项。
流程
使用
azure cli工具登录到 Azure:$ az login为所选可用区创建 Azure 资源组:
$ az group create --name <example_resource_group> --location westeurope部署启用了 TDX 的 RHEL 实例,例如
Standard_DC2eds_v5实例类型:$ az vm create --resource-group <example_resource_group> \ --name <example_rhel_instance> \ --image <"RedHat:rhel-cvm:9_5_cvm:latest"> \ --size <Standard_DC2eds_v5> \ --admin-username <example_azure_user> \ --generate-ssh-keys \ --security-type ConfidentialVM \ --os-disk-security-encryption-type DiskWithVMGuestState连接到 RHEL 实例:
$ ssh <example_azure_user>@<example_ip_address_of_the_instance>
验证
检查内核日志以验证 TDX 的状态:
$ dmesg | grep -i tdx... [ 0.733613] Memory Encryption Features active: Intel TDX [ 4.320222] systemd[1]: Detected confidential virtualization tdx. [ 5.977432] systemd[1]: Detected confidential virtualization tdx. ...检查 RHEL 实例配置的元数据:
$ az vm show --resource-group <example_resource_group> \ --name <example_rhel_instance> \ --query "securityProfile.enableTrustedDomainExtensions" \ --output json
第 7 章 使用 AMD SEV SNP 在公有云平台上配置 RHEL 复制链接链接已复制到粘贴板!
具有安全嵌套分页(SEV-SNP)的 AMD 安全加密虚拟化旨在防止基于虚拟机完整性的攻击并减少内存完整性违反情况的危险。对于安全引导过程,AMD 处理器提供三种基于硬件的安全机制;安全加密虚拟化(SEV)、SEV 加密状态(SEV-ES)和 SEV Secure Nested Paging (SEV-SNP)。
- SEV: SEV 机制加密虚拟机(VM)内存,以防止虚拟机监控程序访问虚拟机数据。
- SEV-ES : SEV with Encrypted State (SEV-ES)通过加密 CPU 注册状态来扩展 SEV。这种机制可防止虚拟机监控程序访问或修改虚拟机 CPU 注册。尽管在 hypervisor 和虚拟机之间提供隔离,但它仍然容易受到内存完整性攻击的影响。
SEV-SNP: SEV-SNP 是 SEV-ES 的增强,它添加了内存完整性保护和虚拟机加密。这种机制可防止虚拟机监控程序修改页表来重定向虚拟机内存访问,从而防止重播攻击和内存篡改。
注意在公共云平台上部署 Red Hat Enterprise Linux (RHEL)之前,请仔细检查相应的云服务供应商,以获取特定 RHEL 实例类型的支持状态和认证。
7.1. SEV-SNP 的属性 复制链接链接已复制到粘贴板!
-
Secure Processor: AMD
EPYC处理器集成了一个安全处理器(SP)子系统。AMD SP 是一个专用的硬件组件,用于管理密钥和加密操作。 - 内存完整性 :对于管理虚拟化和隔离,内存管理单元(MMU)使用页表将虚拟地址转换为客户机物理地址。SEV-SNP 使用嵌套页表将客户机物理地址转换为主机物理地址。定义了嵌套页面表后,虚拟机监控程序或主机无法更改页表来修改虚拟机访问不同页面,从而保护内存的完整性。SEV-SNP 使用此方法提供对虚拟机内存的重播攻击和恶意修改的保护。
-
内存加密 :AMD
EPYC处理器隐藏内存加密密钥,该密钥在主机和虚拟机中保持隐藏。 验证过程的测试报告 :以授权加密格式对 RHEL 实例信息的 CPU 生成的报告。这个过程确认 RHEL 实例和 AMD 处理器的初始 CPU 和内存状态的真实性和可靠性。
注意即使虚拟机监控程序创建虚拟机的主内存和 CPU 注册状态,它们在初始化该虚拟机后仍为隐藏且无法访问。
7.2. 了解 AMD SEV SNP 安全引导过程 复制链接链接已复制到粘贴板!
- 初始化和测量 :启用 SEV-SNP 的 hypervisor 设置虚拟机的初始状态。这个 hypervisor 将固件二进制文件加载到虚拟机内存中,并设置初始注册状态。AMD Secure Processor (SP)测量虚拟机的初始状态,并提供验证虚拟机初始状态的详细信息。
- firmware : 虚拟机启动 UEFI 固件。固件可能包含有状态或无状态的虚拟可信平台模块(vTPM)实现。有状态 vTPM 在虚拟机重启和迁移之间维护持久加密状态,而无状态 vTPM 会为每个虚拟机会话生成一个新的加密状态,而无需持久性。虚拟机特权级别(VMPL)技术将 vTPM 与客户机隔离。VMPL 在不同虚拟机组件和 hypervisor 之间提供硬件强制的特权隔离。
vTPM :根据有状态 vTPM 的云服务供应商,UEFI 固件可能会执行远程测试来解密 vTPM 的持久状态。
- vTPM 还测量引导过程的事实,如安全引导状态、用于签名引导工件的证书、UEFI 二进制哈希等。
shim :当 UEFI 固件完成初始化过程时,它会搜索扩展的固件接口(EFI)系统分区。然后,UEFI 固件从那里验证并执行第一个阶段引导装载程序。对于 RHEL,这是
shim。shim程序允许非 Microsoft 操作系统从 EFI 系统分区加载第二阶段引导装载程序。-
shim使用红帽证书来验证第二阶段引导装载程序(grub)或 Red Hat Unified Kernel Image (UKI)。 -
GRUB或UKI解压缩、验证并执行 Linux 内核和初始 RAM 文件系统(initramfs)和内核命令行。这个过程可确保在可信和安全的环境中载入 Linux 内核。
-
initramfs :在
initramfs中,如果完全磁盘加密技术,vTPM 信息会自动解锁加密的 root 分区。-
当根卷可用时,
initramfs会将执行流传输到根卷。
-
当根卷可用时,
- attestation : VM 租户可以访问系统,并可执行远程测试,以确保访问的虚拟机是未修改的虚拟机(CVM)。attestation 基于 AMD SP 和 vTPM 的信息执行。这个过程确认 RHEL 实例和 AMD 处理器的初始 CPU 和内存状态的真实性和可靠性。
- TEE :此过程创建受信任的执行环境(TEE),以确保引导虚拟机处于可信和安全的环境中。
7.3. 使用 AMD SEV SNP 在 Azure 上配置 RHEL 虚拟机 复制链接链接已复制到粘贴板!
带有安全嵌套分页(SEV-SNP)的 AMD 安全加密虚拟化是 Azure Virtual Machines (VM)上的 Red Hat Enterprise Linux (CVM)的机密虚拟机(CVM)的安全类型,仅适用于 AMD EPYC 处理器系列。SEV-SNP 提供可信引导环境,以便整个过程变得安全且保护,以便虚拟机监控程序和云服务供应商无法访问数据。
先决条件
-
已安装
openssh和openssh-clients软件包。 - 已安装 Azure CLI 工具。详情请参阅 安装 Azure CLI。
- 您已从上述 Azure 实例类型启动了实例。详情请查看 CVM 支持的虚拟机大小。
流程
使用 Azure CLI 实用程序登录到 Azure:
$ az login为所选可用区创建 Azure 资源组:
$ az group create --name <example_resource_group> --location eastus使用 SEV-SNP 部署 RHEL 实例,例如
Standard_DC4as_V5实例类型:$ az vm create --resource-group <example_resource_group> \ --name <example-rhel-9-instance> \ --image <"RedHat:rhel-cvm:9_5_cvm:latest"> \ --size <Standard_DC4as_V5> \ --admin-username <example_azure_user> \ --generate-ssh-keys \ --security-type ConfidentialVM \ --os-disk-security-encryption-type DiskWithVMGuestState连接到 RHEL 实例:
$ ssh <example_azure_user>@<example_ip_address_of_VM>
验证
检查内核日志以验证 SEV-SNP 的状态:
$ sudo dmesg | grep -i sev... [ 0.547223] Memory Encryption Features active: AMD SEV [ 4.843171] kvm-guest: setup_efi_kvm_sev_migration : EFI live migration variable not found ...
第 8 章 使用 RHEL 系统角色在 Azure 上部署 HPC 集群 复制链接链接已复制到粘贴板!
Microsoft Azure 上的高性能计算(HPC)工作负载需要特殊配置来获得最佳性能和可扩展性。HPC RHEL 系统角色使用特定于 HPC 的优化来自动配置 RHEL 镜像,包括 InfiniBand 支持、性能调优和所需的库。
配置启用了 HPC 的镜像后,您可以对虚拟机进行常规化,并在 Azure Compute Gallery 中创建可重复使用的镜像版本。这些镜像作为使用 Azure CycleCloud 在 Microsoft Azure 上部署 HPC 集群的基础,它是一个与 Slurm 工作负载管理器集成的集群编配工具来调度和管理计算作业。环境模块提供了一个灵活的框架,用于管理多个软件版本及其在 HPC 集群节点之间的依赖项。
8.1. 使用 HPC RHEL 系统角色为 HPC 配置 RHEL Azure 虚拟机 复制链接链接已复制到粘贴板!
要在自定义 Red Hat Enterprise Linux (RHEL)镜像上配置高性能计算(HPC) RHEL 系统角色,您可以使用 cloud-init 实用程序。使用 cloud-init 时,您可以自动配置 Ansible 集合,并在 Microsoft Azure 上运行 Ansible playbook。
使用以下方法之一在自定义 RHEL 镜像上配置 HPC RHEL 系统角色。
8.1.1. 使用 Azure Portal 配置 RHEL HPC 虚拟机 复制链接链接已复制到粘贴板!
通过将 Ansible 与 ansible-core 实用程序搭配使用,您可以在镜像构建过程中应用 RHEL 系统角色来自动配置 Azure 的自定义 RHEL 镜像。cloud-init 等工具嵌入了高性能计算(HPC) RHEL 系统角色配置,以在 Azure 中部署之前创建和配置 HPC RHEL 镜像。
先决条件
- 您有一个活跃的 Azure 云订阅。
流程
- 进入 Azure 控制台。
- 点 Virtual Machines → Create Virtual Machine。
从 Basics 选项卡中为虚拟机选择以下配置:
- 在 Virtual machine name 字段中输入您的虚拟机名称。
- 安全类型 :标准
- Image → See All Images → Search for Red Hat Enterprise Linux (RHEL) for High Computing (HPC) on Azure → Select Red Hat Enterprise Linux for HPC 9.6 VM - x64 Gen2
- VM 架构: x64
大小 : Standard_NC4as_T4_v3 - 4 vcpus, 28 GiB 内存
注意要获得最佳性能,请只使用 GPU 优化的虚拟机,如 NC 和 ND 系列。详情请参阅 Azure 中的虚拟机大小。
进入 Advanced 选项卡,在 Custom data 字段中输入以下详情:
#cloud-config #Please check RHEL HPC Ansible system role documentation for all available options write_files: - path: /root/hpc_full_install.yaml permissions: 644 content: | --- - name: Install and configure HPC hosts: localhost become: true vars: hpc_reboot_ok: false hpc_update_all_packages: true hpc_manage_firewall: true roles: - redhat.rhel_system_roles.hpc - path: /etc/dnf/azure-rhel9-eus.config permissions: 644 content: | [rhui-microsoft-azure-rhel9] name=Microsoft Azure RPMs for Red Hat Enterprise Linux 9 (rhel9-eus) baseurl=https://rhui4-1.microsoft.com/pulp/repos/unprotected/microsoft-azure-rhel9-eus enabled=1 gpgcheck=1 sslverify=1 gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-microsoft-azure-release - path: /etc/dnf/vars/releasever permissions: 644 content: | 9.6 # Run custom commands runcmd: # lock VM to RHEL9.6 and enable EUS channels # https://learn.microsoft.com/en-us/azure/virtual-machines/workloads/redhat/redhat-rhui - dnf --assumeyes --disablerepo='*' remove "rhui-azure-rhel9" - dnf --assumeyes --config /etc/dnf/azure-rhel9-eus.config install rhui-azure-rhel9-eus - dnf --assumeyes clean all - dnf --assumeyes install rhel-system-roles- 点 Review + create 按钮创建带有给定配置的虚拟机。
- 在 Azure 控制台中,检查虚拟机是否已成功部署并可使用。
- 点 Go to resource 按钮。
- 复制公共 IP 地址。
- 在 Azure 控制台中,检查虚拟机是否正在运行。
连接到虚拟机:
$ ssh -i ~/.ssh/azure_hpc <example_azureuser>@<192.0.2.101>检查虚拟机状态:
$ sudo cloud-init status --wait准备就绪后,运行 HPC RHEL 系统角色:
$ sudo ANSIBLE_LOG_PATH=/var/log/ansible_hpc_full_install.log ansible-playbook /root/hpc_full_install.yaml --verbose重启虚拟机。
重要等待初始重启完成,因为 HPC RHEL 系统角色配置在此阶段完成。
验证
通过 SSH 连接到虚拟机:
$ ssh -i <example_private_key.pem> <example_azureuser>@<192.0.2.101>验证安装的软件包列表:
$ sudo dnf list installed| grep -i -E 'nvidia-driver|cuda-toolkit|nccl|fabric-manager|rdma|openmpi'cuda-toolkit-12-9.x86_64 12.9.1-1 @nvidia-cuda cuda-toolkit-12-9-config-common.noarch 12.9.79.1 @nvidia-cuda cuda-toolkit-12-config-common.noarch 12.9.79.1 @nvidia-cuda cuda-toolkit-config-common.noarch 12.9.79.1 @nvidia-cuda libnccl.x86_64 2.27.5-1+cuda12.9 @nvidia-cuda libnccl-devel.x86_64 2.27.5-1+cuda12.9 @nvidia-cuda librdma.x86_64 54.0.1-e19 @rhel-9-for-x86_64-baseos-rhui-rpms nvidia-driver.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-cuda.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-cuda-libs.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-libs.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-fabric-manager.x86_64 575.57.08-1 @nvidia-cuda openmpi.x86_64 2:4.1.7-7.e19 @rhel-9-for-x86_64-appstream-rhui-rpms openmpi-devel.x86_64 2:4.1.7-7.e19 @rhel-9-for-x86_64-appstream-rhui-rpms rdma-core.x86_64 54.0.1-e19 @rhel-9-for-x86_64-baseos-rhui-rpms验证已安装的
Lmod环境模块:$ ml available-----------------------/usr/share/modulefiles------------------------ mpi/hpcx-2.24.1-pmix-4.2.9 mpi/openmpi-5.0.8-cuda12-gpu (L,D) mpi/hpcx-2.24.1 pmix/pmix-4.2.9 (L) mpi/openmpi-x86_64 ----------------/usr/share/lmod/lmod/modulefiles/Core---------------- lmod settarg其中:
-
l: Module is loaded -
D:默认模块
-
后续步骤
8.1.2. 使用 Azure CLI 配置 RHEL HPC 虚拟机 复制链接链接已复制到粘贴板!
通过将 Ansible 与 ansible-core 实用程序搭配使用,您可以在镜像构建过程中应用 RHEL 系统角色来自动配置自定义 Red Hat Enterprise Linux (RHEL)镜像。cloud-init 和 Azure CLI 等工具管理高性能计算(HPC) RHEL 系统角色,以在 Azure 中部署之前创建和配置 HPC RHEL 镜像。
先决条件
- 您有一个活跃的 Azure 云订阅。
流程
连接到 Azure 门户:
$ az login创建密钥对:
$ ssh-keygen -t ed25519 -b 3072 -C "<azureuser@hpc>" -f ~/.ssh/azure_hpc使用以下详情编辑
user-data.yml文件:$ vi user-data.yml#cloud-config # Please check RedHat HPC Ansible system role documentation for all available options write_files: - path: /root/hpc_full_install.yaml permissions: 644 content: | --- - name: Install and configure HPC hosts: localhost become: true vars: hpc_reboot_ok: false hpc_update_all_packages: true hpc_manage_firewall: true roles: - redhat.rhel_system_roles.hpc - path: /etc/dnf/azure-rhel9-eus.config permissions: 644 content: | [rhui-microsoft-azure-rhel9] name=Microsoft Azure RPMs for Red Hat Enterprise Linux 9 (rhel9-eus) baseurl=https://rhui4-1.microsoft.com/pulp/repos/unprotected/microsoft-azure-rhel9-eus enabled=1 gpgcheck=1 sslverify=1 gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-microsoft-azure-release - path: /etc/dnf/vars/releasever permissions: 644 content: | 9.6 # Run custom commands runcmd: # lock VM to RHEL9.6 and enable EUS channels # https://learn.microsoft.com/en-us/azure/virtual-machines/workloads/redhat/redhat-rhui - dnf --assumeyes --disablerepo='*' remove "rhui-azure-rhel9" - dnf --assumeyes --config /etc/dnf/azure-rhel9-eus.config install rhui-azure-rhel9-eus - dnf --assumeyes clean all - dnf --assumeyes install rhel-system-roles创建资源组:
$ az group create --name <example_vm_resource_group>为您的帐户选择并接受相关镜像的条款和条件:
对于北美(NA)或全球帐户,请使用:
$ az vm image terms accept --urn "redhat:rh-rhel-hpc:rh-rhel-hpc96:latest"对于欧洲、中东和非洲(EMEA)帐户,请使用:
$ az vm image terms accept --urn "redhat-limited:rh-rhel-hpc:rh-rhel-hpc96:latest"
根据上一步中指定的配置创建镜像:
$ az vm create \ --resource-group <example_vm_resource_group> \ --name <example_vm_name> \ --image <example_rhel_hpc_image_urn> \ --size <Standard_NC4as_T4_v3> \ --admin-username <example_azureuser> \ --ssh-key-values ~/.ssh/azure_hpc.pub \ --custom-data user-data.yaml \ --security-type Standard \ --public-ip-address-dns-name <example_vm_name>-$(openssl rand -hex 4) \ --tags owner=$USER project=hpc- 检查虚拟机是否在运行,检查 Azure 控制台。
通过 SSH 连接到虚拟机:
$ ssh -i ~/.ssh/azure_hpc <example_azureuser>@<192.0.2.101>检查虚拟机状态:
$ sudo cloud-init status --wait准备就绪后,运行 HPC RHEL 系统角色:
$ sudo ANSIBLE_LOG_PATH=/var/log/ansible_hpc_full_install.log ansible-playbook /root/hpc_full_install.yaml --verbose重启虚拟机。
重要等待初始重启完成,因为 HPC RHEL 系统角色配置在此阶段完成。
验证
通过 SSH 连接到虚拟机:
$ ssh -i <example_private_key.pem> <example_azureuser>@<192.0.2.101>验证安装的软件包列表:
$ sudo dnf list installed| grep -i -E 'nvidia-driver|cuda-toolkit|nccl|fabric-manager|rdma|openmpi'cuda-toolkit-12-9.x86_64 12.9.1-1 @nvidia-cuda cuda-toolkit-12-9-config-common.noarch 12.9.79.1 @nvidia-cuda cuda-toolkit-12-config-common.noarch 12.9.79.1 @nvidia-cuda cuda-toolkit-config-common.noarch 12.9.79.1 @nvidia-cuda libnccl.x86_64 2.27.5-1+cuda12.9 @nvidia-cuda libnccl-devel.x86_64 2.27.5-1+cuda12.9 @nvidia-cuda librdma.x86_64 54.0.1-e19 @rhel-9-for-x86_64-baseos-rhui-rpms nvidia-driver.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-cuda.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-cuda-libs.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-driver-libs.x86_64 3:575.57.08-1.e19 @nvidia-cuda nvidia-fabric-manager.x86_64 575.57.08-1 @nvidia-cuda openmpi.x86_64 2:4.1.7-7.e19 @rhel-9-for-x86_64-appstream-rhui-rpms openmpi-devel.x86_64 2:4.1.7-7.e19 @rhel-9-for-x86_64-appstream-rhui-rpms rdma-core.x86_64 54.0.1-e19 @rhel-9-for-x86_64-baseos-rhui-rpms验证已安装的
Lmod环境模块:$ ml available-----------------------/usr/share/modulefiles------------------------ mpi/hpcx-2.24.1-pmix-4.2.9 mpi/openmpi-5.0.8-cuda12-gpu (L,D) mpi/hpcx-2.24.1 pmix/pmix-4.2.9 (L) mpi/openmpi-x86_64 ----------------/usr/share/lmod/lmod/modulefiles/Core---------------- lmod settarg其中:
-
l: Module is loaded -
D:默认模块
-
8.2. 常规化 Azure 虚拟机用于创建镜像 复制链接链接已复制到粘贴板!
通过常规化虚拟机(VM),您可以准备虚拟机,以用作模板或基础镜像进行镜像版本控制。在此过程中,您需要删除特定数据,停止虚拟机、取消分配资源,并将虚拟机标记为常规化。通过使用常规镜像,您可以从同一镜像创建多个镜像版本。
先决条件
- 您已配置了 RHEL HPC 镜像。详情请参阅 使用 HPC RHEL 系统角色配置 RHEL HPC 镜像。
流程
通过 SSH 连接到虚拟机:
$ ssh -i <example_private_key.pem> <example_azureuser>@<192.0.2.101>删除任何临时用户、网络和主机信息:
$ sudo waagent -deprovision+user -force- 注销或按 Ctrl + D 关闭 SSH 会话。
停止虚拟机:
$ az vm stop --name <example_vm_name> --resource-group <example_vm_resource_group>取消分配资源以停止对 Azure 的收费:
$ az vm deallocate --name <example_vm_name> --resource-group <example_vm_resource_group>常规化虚拟机,以确保此镜像是通用的,并准备好克隆:
$ az vm generalize --name <example_vm_name> --resource-group <example_vm_resource_group>
8.3. 从通用虚拟机准备 Azure 镜像版本 复制链接链接已复制到粘贴板!
要从通用虚拟机创建可重复使用的 Azure 镜像版本,您必须首先创建一个资源组来组织相关资源,如计算、网络和存储。在这个资源组中,设置一个 Azure Compute Gallery 来管理并跨机构共享镜像。在 gallery 中定义镜像定义,以对镜像进行逻辑分组并指定其属性和要求。基于这些镜像定义,您可以创建多个镜像版本以实现一致性和可扩展性。
使用镜像版本,您可以创建同一镜像的副本和多个版本。使用 Azure Compute Gallery,您可以创建一个市场兼容的自定义镜像来跨机构共享。您可以使用 Azure CLI 或 Azure Cloud Shell。有关 Azure Cloud Shell 的详情,请参阅开始使用 Azure Cloud Shell。
先决条件
- 已安装 Azure CLI。详情请参阅 安装 Azure CLI。
- 您已创建了通用虚拟机。详情请参阅 为创建镜像正式发布 Azure 虚拟机。
流程
创建用于托管 gallery 的资源组:
$ az group create --name <example_image_resource_group>在以上资源组中创建 gallery:
$ az sig create --resource-group <example_image_resource_group> \ --gallery-name <example_image_gallery_name>为订阅将安全类型设置为
Standard:$ az feature register --name UseStandardSecurityType \ --namespace Microsoft.Compute注册供应商:
$ az provider register --namespace Microsoft.Compute创建镜像定义来管理镜像版本:
$ az sig image-definition create --resource-group <example_image_resource_group> \ --gallery-name <example_image_gallery_name> \ --gallery-image-definition <example_image_definition> \ --publisher <example_publisher> \ --offer <example_offer> \ --sku <example_sky> \ --os-type Linux \ --os-state Generalized \ --hyper-v-generation V2 \ --features SecurityType=Standard- <publisher>
- 提供镜像的实体或机构。
- <offer>
- 来自发布者的相关镜像集合。
- <stock Keeping Unit (SKU)>
- 提供的版本,表示主版本。
- <VERSION>
- 给定 SKU 的版本号。
获取有关镜像的信息:
$ az vm list --output table使用输出中的常规镜像名称:
$ az vm get-instance-view --resource-group <example_vm_resource_group> \ --name <example_vm_name> \ --query id- 从输出中复制镜像定义的 ID。
使用上一步中获取的镜像 ID 创建镜像版本:
$ az sig image-version create \ --resource-group <example_image_resource_group> \ --gallery-name <example_image_gallery_name> \ --gallery-image-definition <example_image_definition> \ --gallery-image-version <example_version> \ --virtual-machine <example_id>可选:删除虚拟机和相关资源:
$ az vm delete --resource-group <example_image_resource_group> \ --name <example_vm_name>
8.4. 使用 Azure CycleCloud 和 Slurm 部署 HPC 集群 复制链接链接已复制到粘贴板!
您可以在 Azure Cloud 上配置 Red Hat Enterprise Linux (RHEL)高性能计算(HPC)集群。HPC 集群通过在多台机器(也称为节点)分发任务来解决需要大量处理和计算的复杂问题。
Azure CycleCloud (一个云原生编配器)管理 Azure Cloud 的 HPC 集群。使用 Azure CycleCloud,您可以管理 HPC 集群,以自动部署和扩展适当的工作负载。Azure CycleCloud 管理并行计算作业、资源,并设置 Slurm 工作负载管理器。但是,Slurm 管理在集群中调度和运行任务的资源分配。以下步骤使用 Slurm 和 Azure CycleCloud 8.x 部署和管理 RHEL HPC 集群。
要在 Azure 环境中配置 RHEL HPC 集群,您可以使用 Microsoft Azure 服务,如 Azure CycleCloud。按照您自己的风险使用这些工具。
先决条件
- 您有一个活跃的 Azure 云订阅。
- 您有一个 RHEL HPC 镜像。详情请参阅 使用 HPC RHEL 系统角色配置 RHEL HPC 镜像。
- 您有一个通用的虚拟机。详情请参阅 为创建镜像正式发布 Azure 虚拟机。
- 您已准备好的 Azure 镜像版本。详情请参阅 从通用虚拟机准备 Azure 镜像版本。
流程
在 Azure 上安装和部署 CycleCloud:
- 对于 Azure Marketplace 安装,请参阅从 Azure Marketplace 安装 Azure CycleCloud。
- 有关手动安装,请参阅 手动安装 Azure CycleCloud。
显示自定义 RHEL HPC 镜像的 ID:
$ az sig image-version show --resource-group="<example_resource_group>" \ --gallery-name="<example_gallery>" \ --gallery-image-definition="<example_image>" \ --gallery-image-version="<example_version>" \ --query="id" \ --output="tsv"按照带有 CycleCloud 的 Run Slurm 中的步骤,使用 Azure CycleCloud 配置 Slurm 工作负载管理器:
警告由于 IPv4 地址有已知的限制,选择
Public Head Node选项会导致使用 Slurm head 节点进行置备失败。作为临时解决方案,请确保选中Public Head Node选项,并确定访问环境中 Slurm head 节点的最合适的方法。详情请参阅 GitHub 上的相关 Slurm 问题。注意将上一步中获取的自定义 RHEL 镜像 ID 用于所有集群节点。详情请参阅 如何指定自定义操作系统镜像。
- 在 CycleCloud 主页上,选择现有的 Slurm 集群。
- 要启动 Slurm 集群,请点击 Start。
- 通过选择 集群 视图并单击 Connect 来登录到 Slurm head 节点。使用标准的 Slurm 命令行工具来计划 HPC 作业。详情请查看 如何提交作业?(Slurm)部分。
8.5. 管理 HPC 集群的环境模块 复制链接链接已复制到粘贴板!
环境模块子系统使用基于 Lua 的环境模块(Lmod)来列出已安装的模块。使用 Lmod 时,您可以通过加载和卸载各种软件包及其依赖项来动态修改环境。它管理高性能计算(HPC)环境中的多个编译器、库和应用版本,以便您可以为每个版本选择特定的软件配置。为此,您可以使用 module 实用程序,它简写为 ml。
8.5.1. 环境模块管理的命令 复制链接链接已复制到粘贴板!
您可以使用以下命令来管理环境模块:
显示与
模块工具相关的所有命令:$ module help显示单个命令选项和语法:
$ module <command> help显示特定模块的详情:
$ ml whatis pmix/pmix-4.2.9pmix/pmix-4.2.9 : Description: PMIx 4.2.9 installed in /opt/pmix/4.2.9 pmix/pmix-4.2.9 : Version: 4.2.9-1列出 HPC 环境中的可用模块:
$ ml available-----------------------/usr/share/modulefiles------------------------ mpi/hpcx-2.24.1-pmix-4.2.9 mpi/openmpi-5.0.8-cuda12-gpu (L,D) mpi/hpcx-2.24.1 pmix/pmix-4.2.9 (L) mpi/openmpi-x86_64 ----------------/usr/share/lmod/lmod/modulefiles/Core---------------- lmod settarg其中:
-
l: Module is loaded -
D:默认模块 -
(L)注解表示 loadedmpi/openmpi-5.0.8-cuda12-gpu模块。 -
这也会将
pmix/pmix-4.2.9模块作为依赖项加载。 - 模块系统根据需要自动加载和卸载依赖模块。
-
列出载入的模块:
$ ml listCurrently Loaded Modules: 1) pmix/pmix-4.2.9 2) mpi/openmpi-5.0.8-cuda12-gpu卸载模块及其依赖项:
$ ml unload mpi/openmpi-5.0.8-cuda12-gpu $ ml listNo modules loaded卸载现有模块并载入新模块:
$ ml load mpi/openmpi-5.0.8-cuda12-gpu $ ml listCurrently Loaded Modules: 1) pmix/pmix-4.2.9 2) mpi/openmpi-5.0.8-cuda12-gpu切换载入的模块:
$ ml swap mpi/openmpi-x86_64The following have been reloaded with a version change: 1) mpi/openmpi-5.0.8-cuda12-gpu => mpi/openmpi-x86_64列出可用的模块:
$ ml listCurrently Loaded Modules: 1) mpi/openmpi-x86_64
8.5.2. Modulefiles 布局和规则 复制链接链接已复制到粘贴板!
modulefile 是一个定义和管理 HPC 系统上加载、卸载和切换软件环境的环境变量的脚本。推荐的目录结构和命名约定可以有效地环境模块文件组织,包括模块定义、打包程序模块以及在基于 RHEL 的 HPC 部署中管理多个软件环境的一致规则。
- 模块定义的手动方法
-
模块工具自动发现放置在/usr/share/modulefiles目录中的模块定义。如果您的其他目录带有模块定义,则需要将它们添加到MODULEPATH环境变量中。 - wrapper 模块
-
为避免修改环境变量并允许
Lmod查找特定于软件包的模块,请将wrapper模块放在/usr/share/modulefiles目录中,以便这些模块修改MODULEPATH并从外部位置加载相关模块。这种打包程序的一个示例是mpi/hpcx-2.24.1环境模块。 - 模块文件格式
Lmod支持使用 Lua 和工具命令语言(Tcl)格式编写的环境模块。lua 脚本是定义环境模块的首选方法。使用设定755权限的.lua扩展。ml命令的模块名称省略.lua后缀。本文档中提供的示例使用 Lua 脚本接口。它有以下要求:-
提供相同功能的所有软件包(如 MPI 库)都位于一个通用模块子目录中。在这种情况下,所有 MPI 库变体 ./
mpi/。 -
为软件包子目录(如冲突
("mpi")))向模块添加conflict ()定义,该定义一次只能加载该软件包类型的一个模块。 - 保持软件包命名一致。
使用功能名称作为子目录名称,而每个软件包实例的单个模块应根据以下模式命名:
<package provider>-<version>-<build>-<options>对于多个 MPI 库变体,有些来自不同的供应商,另一些是带有不同编译器和构建选项的给定软件包的多个构建。在这种情况下,命名方案提供了一致性。
-
提供相同功能的所有软件包(如 MPI 库)都位于一个通用模块子目录中。在这种情况下,所有 MPI 库变体 ./
8.5.3. 可用的 MPI 环境 复制链接链接已复制到粘贴板!
在 HPC Slurm 集群中,消息传递接口(MPI)环境为应用程序提供运行时支持,以便应用程序在节点间进行通信和同步。Slurm 与 MPI 实现(如 OpenMPI)集成,以便有效地管理分布式作业并优化对集群资源的使用。Slurm 使用 mpirun 在分配的节点之间编配执行,以进行可扩展的高性能作业。在提供的 RHEL HPC 集群中,有以下 MPI 环境:
-
openmpi.x86_64: Standard open MPI build,不提供 CUDA 或 GPU 加速支持。 -
openmpi-5.0.8-cuda-gpu: Open MPI 模块使用 CUDA 支持 GPU 感知 MPI 通信 -
Hpcx-2.24.1:基于 Open MPI 的 NVIDIA 全面的 HPC 软件堆栈。 -
Hpcx-2.24.1-pmix: HPC-X 构建配置了 Slurm 集成和作业调度的进程管理接口(PMIx)。
为了命名 MPI 库的一致性,请指定 Unified Communication X (UCX)作为对 MPI 基础架构指向消息传递层(PML)实现的点:
$ mpirun -mca pml ucx .
- openmpi.x86_64
- 此模块提供 OpenMPI 4.1.1 的标准构建。虽然它包含 PMIx 3.x 支持,但它不提供 CUDA 或 GPU 加速支持。RHEL InfiniBand 驱动程序和基础架构提供 InfiniBand (IB)/Remote Direct Memory Access (RDMA)功能。OpenMPI 库使用 gcc-11.4 编译。如果您的应用程序没有使用 CUDA 语言扩展或需要 GPU 卸载支持,请使用此模块。
- openmpi-5.0.8-cuda-gpu
此模块使用 NVIDIA HPC-X 软件包库提供带有 PMIx 4.x 支持和 CUDA 和 NVIDIA GPU 加速支持的 OpenMPI 5.0.8。RHEL InfiniBand 驱动程序和基础架构提供 InfiniBand (IB)/Remote Direct Memory Access (RDMA)功能。OpenMPI 库使用 gcc-11.5 编译。只有在使用需要 GPU 加速的启用了 CUDA 的应用程序时才选择这个模块。
注意如果没有 InfiniBand NIC,在 InfiniBand NIC 自动发现失败时会显示一个警告:
$ mpirun -n 2 /lib64/openmpi/bin/mpitests-osu_allreduce... [test-vm] Error: coll_hcoll_module.c:312 - mca_coll_hcoll_comm_query() Hcol library init failed ...您可以通过在
mpirun命令中添加-mca coll ^hcoll参数来删除这个警告:$ mpirun -mca coll ^hcoll -n 2 /lib64/openmpi/bin/mpitests-osu_allreduce# Size Avg Latency(us) 1 8.36 2 6.85- hpcx-2.24.1
- 此模块提供了一个 NVIDIA 构建的 OpenMPI 4.1.5 环境。它不支持 PMIx,但提供 CUDA 和 NVIDIA GPU 加速支持。RHEL InfiniBand 驱动程序和基础架构提供 InfiniBand (IB)/Remote Direct Memory Access (RDMA)功能。
- hpcx-2.24.1-pmix
-
此模块提供与
mpi/hpcx-2.24.1模块相同的环境,同时启用了 PMIx 4.x 支持。