PXE 启动设置#

DGX 服务器 UEFI BIOS 支持 PXE 启动。需要进行几个手动自定义步骤才能使 PXE 启动基础操作系统映像。

注意

本文档旨在用作参考。未给出配置 DHCP、FTP 和 TFTP 服务器的明确说明。预计最终用户的 IT 团队将对其进行配置,以符合其公司的安全准则。

先决条件#

  • TFTP 服务器已设置
    • TFTP 配置为从 /local/tftp/ 提供文件

  • HTTP 服务器已设置
    • HTTP 配置为从 /local/http/ 提供文件

  • DHCP 服务器已设置

  • IP 地址为 <FTP IP>

  • 完整限定主机名为 <FTP host>

本文档旨在提供关于如何为 DGX 系统设置 PXE 启动环境的详细分步说明。示例基于 DGX A100。该解决方案有几个主要组成部分

  • DHCP 服务器:本文档中使用 dnsmasq

  • TFTP 服务器:dnsmasq 也用作 TFTP 服务器。

  • HTTP 服务器:HTTP 服务器用于传输大型文件,例如 ISO 映像和 initrd。或者,FTP 也可用于此目的。本文档中使用 HTTP。

  • Syslinux:Linux 引导加载程序软件包。章节

PXE 服务器概述#

PXE 服务器分为三个通用区域

  • 引导加载程序 (grub)

  • TFTP 内容(内核和 initrd)

  • HTTP 内容(ISO 映像)

TFTP 和 HTTP 服务器上的大致目录结构如下所示

/local/
   http/
      base_os_6.0.0/
         base_os_6.0.0.iso
   tftp/
      grub2/
         base_os_6.0.0/
            vmlinuz
            initrd
      grub.cfg
      bootx64.efi

tftp-server(由 xinetd 服务控制,配置位于 /etc/xinetd.d/tftp 中)指向 /local/tftp 目录,以供系统 PXE 启动时使用。TFTP 用于传输在 DHCP 服务器的 dhcpd.conf 文件中指定的 bootx64.efi 文件(请参阅配置 DHCP 服务器)。默认情况下,在 bootx64.efi 启动后,它会查找 grub2/grub.cfg 文件,其中包含用于进一步引导的菜单选项。该配置文件将查找相对于 tftp 目录的内核和 initrd 文件。

以下步骤将假定 DHCP 和 PXE 服务器配置为使用上述目录结构。实验室管理员或负责部署 PXE 环境的任何人都应更改目录名称和结构以适应其基础设施。

配置 HTTP 文件目录和 ISO 映像#

将 BaseOS 6.0.0 ISO 的副本放在 /local/http/base_os_6.0.0/

挂载 BaseOS 6.0.0 ISO#

假设您的挂载点为“/mnt”

sudo mount -o loop /local/http/base_os_6.0.0/base_os_6.0.0.iso /mnt

将内核和 initrd 从 ISO 复制到 TFTP 目录

cp /mnt/casper/vmlinuz /local/tftp/grub2/base_os_6.0.0/
cp /mnt/casper/initrd /local/tftp/grub2/base_os_6.0.0/

配置 TFTP 目录#

挂载 BaseOS 6.0.0 ISO 假设您的挂载点为“/mnt”

sudo mount -o loop /local/http/base_os_6.0.0/base_os_6.0.0.iso /mnt

将内核和 initrd 从 ISO 复制到 TFTP 目录

cp /mnt/casper/vmlinuz /local/tftp/grub2/base_os_6.0.0/
cp /mnt/casper/initrd /local/tftp/grub2/base_os_6.0.0/

下载适用于 x86_64 的 GRUB 软件包

下载指定了正确架构的相关 grub 软件包

wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/grub2-efi-x64-2.02-0.87.el7.centos.7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/shim-x64-15-8.el7.x86_64.rpm

使用以下命令解压缩 RPM

rpm2cpio grub2-efi-x64-2.02-0.86.el7.centos.x86_64.rpm | cpio -idmv
rpm2cpio shim-x64-15-8.el7.x86_64.rpm | cpio -idmv

将以下二进制文件从解压缩的 RPM 复制到 /local/tftp/grub2/

shim.efi
shimx64.efi
grubx64.efi

在 /local/tftp/grub2/ 中复制一份 shimx64.efi,并将副本命名为 bootx64.efi

对于 arm64

下载指定了正确架构的相关 grub 软件包

wget http://mirror.centos.org/altarch/7/updates/aarch64/Packages/grub2-efi-aa64-2.02-0.87.el7.centos.7.aarch64.rpm

使用以下命令解压缩 RPM

rpm2cpio grub2-efi-aa64-2.02-0.87.0.1.el7.centos.9.aarch64.rpm | cpio -idmv

将以下二进制文件从解压缩的 RPM 复制到 /local/tftp/grub2/

grubaa64.efi

创建 grub 配置文件

/local/tftp/grub2/grub.cfg 文件的内容应如下所示

set default=0
set timeout=-1
insmod all_video

menuentry 'Install BaseOS 6.0.0' {
  linuxefi /grub2/base_os_6.0.0/vmlinuz fsck.mode=skip autoinstall ip=dhcp url=http://<Server IP>/base_os_6.0.0/base_os_6.0.0.iso nvme-core.multipath=n nouveau.modeset=0
  initrdefi /grub2/base_os_6.0.0/initrd
}

注意

  • 注意 1:vmlinuz 和 initrd 文件是相对于 TFTP 根目录指定的 - 在此示例中,相对于 /local/tftp/。ISO 的位置相对于 HTTP 根目录 - 在此示例中,/local/http/。

  • 注意 2:内核引导参数应与相应 ISO 的引导菜单的内容匹配,位于 /mnt/boot/grub/grub.cfg 中。

  • 注意 3:在某些情况下,通过 FTP 传输 initrd 可能会超时。解决此问题的方法是在 HTTP 上托管所需的文件 - initrd、vmlinuz 和 ISO。通过 HTTP 托管这些文件可以使传输更快、更可靠。在此示例中,我们假设 HTTP 服务器托管在 /local/http 中。我们需要将这些文件复制到此位置

/local/
   http/
      base_os_6.0.0/
         base_os_6.0.0.iso
         vmlinuz
         initrd
   tftp/
      grub2/
         grub.cfg
         bootx64.efi
         grubaa64.efi

以此方式配置后,grub.cfg 文件可能如下所示

set default=0
set timeout=-1
insmod all_video

menuentry 'Install BaseOS 6.0.0' {
    linuxefi (http,<HTTP Server IP>)/base_os_6.0.0/vmlinuz fsck.mode=skip autoinstall ip=dhcp url=http://<Server IP>/base_os_6.0.0/base_os_6.0.0.iso nvme-core.multipath=n nouveau.modeset=0
    initrdefi (http,<HTTP Server IP>)/base_os_6.0.0/initrd
}

用于配置系统网络接口的有用参数

ip=dhcp:告诉 initramfs 使用 DHCP 自动配置系统的接口。- 如果只有一个接口连接到网络,则这应该足够了。- 如果多个接口连接到网络,则它将使用第一个收到回复的接口。

Base OS 安装程序特有的参数#

  • rebuild-raid 告诉安装程序重建指定的数据 RAID。来自工厂的安装应始终指定此参数,但在其他情况下是可选的

  • md5checkdisc 指定此参数时,将不执行安装。它只会解压缩 ISO 并检查其内容是否与 md5sum.txt 中描述的内容匹配

  • offwhendone 在安装完成后关闭系统电源。否则,我们在完成后重新启动。工厂安装将指定此参数。

  • nooemconfig 跳过 oemconfig 并创建默认用户“nvidia”,播种初始密码。用于 PXE 安装或自动 VM 创建/安装中的无人值守安装。

  • force-ai 允许用户提供自己的自动安装文件。如果网络已设置,则用户可以提供 URL。否则,这必须是安装程序中已存在的文件。

例如

force-ai=/ai/dgx2-ai.yaml
force-ai=http://your-server.com/your-ai.yaml

注意

有关将自定义自动安装文件与 force-ai 参数结合使用时的特殊格式注意事项,请参阅自动安装自定义部分。

配置 DHCP#

除了提供动态 IP 地址的通常角色外,DHCP 服务器还负责提供 TFTP 服务器的 IP 地址和引导加载程序文件的名称。TFTP 服务器的地址在 DHCP 配置文件中指定为“next-server”,引导加载程序文件指定为“filename”。架构选项可用于检测客户端系统的架构,并用于提供正确版本的 grub 引导加载程序(x86、ia32、arm 等)。

dhcpd.conf 的 PXE 部分的示例如下

next-server <TFTP_Server_IP>;

# x86 UEFI
if option arch = 00:06 {
   filename "grub2/bootx64.efi";
# x64 UEFI
} else if option arch = 00:07 {
   filename "grub2/bootx64.efi";
# ARM 64-bit UEFI
} else if option arch = 00:0b {
   filename "grub2/grubaa64.efi";
} else {
   filename "pxelinux.0";
}

可选:配置 CX-4/5/6/7 卡以进行 PXE 启动#

DGX 服务器也可以使用 MLNX CX-4/5/6 卡进行 PXE 启动。如果您已登录到 DGX 服务器主机操作系统,并且运行的是 DGX Base OS 4.4 或更高版本,则可以使用“/usr/sbin/mlnx_pxe_setup.bash”工具执行本节的步骤,该工具将启用找到的每个 MLNX Infiniband 设备的 UEFI PXE ROM。

否则,请继续执行以下手动步骤。

查询 UEFI PXE ROM 状态#

为了从 MLNX CX-4/5/6/7 卡进行 PXE 启动,您必须首先启用您希望从中进行 PXE 启动的卡的 UEFI PXE ROM,因为它默认情况下处于禁用状态。这需要在 DGX 服务器主机操作系统本身上执行,无法远程完成。

DGX OS 6 默认提供树内 OFED 堆栈,但用户可以选择在其之上安装 MOFED。用于查询和启用 UEFI PXE ROM 的命令将因您使用的是树内 OFED 还是 MOFED 堆栈而异。

MOFED 说明#

要确定 MLNX CX 卡的设备名称和当前配置,请运行“sudo mlxconfig query”

user@dgx1server$ sudo mlxconfig query

Device #1:
----------

Device type:    ConnectX4
Name:           MCX455A-ECA_Ax
Description:    ConnectX-4 VPI adapter card; EDR IB (100Gb/s) and 100GbE; single-port QSFP28; PCIe3.0 x16; ROHS R6
Device:         /dev/mst/mt4115_pciconf3

Configurations:                              Next Boot
         ...
         ...
         EXP_ROM_UEFI_x86_ENABLE             False(0)
         ...
         ...

In-tree OFED Instructions
To determine the device name and current configurations of the MLNX CX cards, run "sudo mstconfig query":

user@dgxserver:~$ sudo mstconfig query

Device #1:
----------

Device type:    ConnectX7
Name:           MCX755206AS-NEA_Ax
Description:    NVIDIA ConnectX-7 VPI adapter card; 400Gb/s IB and 200GbE; dual-port QSFP; PCIe 5.0 x16 with x16 PCIe extension option; dual slot; secure boot; no crypto; tall bracket for Nvidia DGX storage
Device:         /sys/bus/pci/devices/0000:b1:00.0/config

Configurations:                              Next Boot
         ...
         ...
         EXP_ROM_UEFI_x86_ENABLE             False(0)
         ...
         ...

Enable UEFI PXE ROM
The "EXP_ROM_UEFI_x86_ENABLE" configuration must be set to True(1) for the MLNX CX card that you wish to PXE boot from, and reboot.

MOFED Instructions

user@dgx1server$ sudo mlxconfig -y -d /dev/mst/mt4115_pciconf3 set EXP_ROM_UEFI_x86_ENABLE=1
user@dgx1server$ sudo reboot

Upon reboot, confirm the configuration was set.

user@dgx1server$ sudo mlxconfig query

Device #1:
----------

Device type:    ConnectX4
Name:           MCX455A-ECA_Ax
Description:    ConnectX-4 VPI adapter card; EDR IB (100Gb/s) and 100GbE; single-port QSFP28; PCIe3.0 x16; ROHS R6
Device:         /dev/mst/mt4115_pciconf3

Configurations:                              Next Boot
         ...
         ...
         EXP_ROM_UEFI_x86_ENABLE             True(1)
         ...
         ...
In-tree OFED Instructions
user@dgxserver:~$ sudo mstconfig -y -d b1:00.0 set EXP_ROM_UEFI_x86_ENABLE=1
user@dgx1server$ sudo reboot

Upon reboot, confirm the configuration was set.

user@dgxserver:~$ sudo mstconfig query

Device #1:
----------

Device type:    ConnectX7
Name:           MCX755206AS-NEA_Ax
Description:    NVIDIA ConnectX-7 VPI adapter card; 400Gb/s IB and 200GbE; dual-port QSFP; PCIe 5.0 x16 with x16 PCIe extension option; dual slot; secure boot; no crypto; tall bracket for Nvidia DGX storage
Device:         /sys/bus/pci/devices/0000:b1:00.0/config

Configurations:                              Next Boot
         ...
         ...
         EXP_ROM_UEFI_x86_ENABLE             True(1)
         ...
         ...

可选:配置 DGX 服务器自动 PXE 启动#

将 PXE 添加到 UEFI 启动顺序的顶部#

在具有 BMC 的系统上,您可以通过将 PXE 添加到 UEFI 启动顺序的顶部来指定 DGX 服务器进行 PXE 启动。这可以通过 IPMI 带外完成。

ipmitool -I lanplus -H <DGX_BMC_IP> -U <ADMIN> -P <PASSWORD> chassis bootdev pxe options=efiboot

注意

请注意,这仅设置 DGX 服务器进行 PXE 启动,但不指定尝试从中进行 PXE 的网络设备顺序。这是我们当前 UEFI 和 BMC FW 的限制。请参阅以下部分以指定网络设备启动顺序。

配置网络启动优先级#

UEFI 网络驱动器 BBS 优先级允许您指定从中进行 PXE 启动的网络设备顺序。要修改此设置,您必须重新启动 DGX 服务器,并在看到启动画面时按“F2”或“Del”键进入 UEFI 启动选择菜单。导航到“Boot”菜单,然后向下滚动到“UEFI NETWORK Drive BBS Priorities”

_images/sbios-splash-screen-1.png

使用此菜单配置尝试网络启动的设备顺序。

_images/sbios-splash-screen-2.png

保存并退出。

完成网络启动优先级的排序后,保存更改并重置。

_images/sbios-splash-screen-3.png

使 DGX 服务器 PXE 启动#

自动 PXE 启动过程#

如果您已按照上述可选步骤操作,则只需重新启动,UEFI 将尝试使用网络驱动器 BBS 优先级列表中指定的顺序使用设备进行 PXE 启动。

手动 PXE 启动过程#

如果您想手动触发 PXE 启动,请重新启动 DGX 服务器,并在看到启动画面时按“F2”或“Del”键进入 UEFI 启动选择菜单。

导航到“Save & Exit”菜单,向下滚动到 Boot Override 部分,然后选择要从中启动的相应网络端口。仅当您启用了特定卡的 UEFI PXE ROM 时,MLNX 卡才会出现。

_images/sbios-splash-screen-4.png

或者,您可以按 SBIOS 启动画面上的“F12”键,SBIOS 将遍历每个 NIC 并尝试在每个 NIC 上进行 PXE 启动。尝试 NIC 的顺序由网络驱动器 BBS 优先级指定。

其他 IPMI 启动选项#

有关通过 IPMI 指定启动顺序的更多信息,请参阅“ipmitool”手册页,并查看“chassis”命令和“bootdev”子命令:https://linux.die.net/man/1/ipmitool

有关 IPMI 规范的更多信息,请参阅智能平台管理接口规范 v2.0 rev. 1.1

自动安装自定义#

与 Base OS 5.x 安装程序相比,Base OS 6.x 安装程序经历了重大更改。Base OS 6.x 安装程序现在使用 subiquity,它支持自动安装而不是 curtin。

自动安装和 curtin 都服务于类似的目的,但有一些语法差异 - 在移植旧 curtin 文件时请注意这些差异。用户可以在 Base OS 6.x ISO 中引用许多自动安装文件;这些文件包含在

casper/ubuntu-server-minimal.ubuntu-server.installer.kernel.nvidia.squashfs

用户可以挂载 ISO,然后挂载此 squashfs 以查看其中打包的许多自动安装文件

mkdir -p /tmp/iso_mnt
mkdir -p /tmp/squash_mnt
sudo mount /path/to/DGXOS-<version>-<date>.iso /tmp/iso_mnt/
sudo mount /tmp/iso_mnt/casper/ubuntu-server-minimal.ubuntu-server.installer.kernel.nvidia.squashfs /tmp/squash_mnt/
find /tmp/squash_mnt/ai/ -name '*.yaml'

对于某些部署,用户可能希望使用自己的自动安装文件。本节将介绍内置自动安装文件中包含的一些部分,以及如何执行一些常见的自定义。

注意

安装程序期望统一的自动安装文件,而不是典型的拆分供应商/用户/元数据格式。这意味着用户提供的自动安装文件需要考虑一些格式差异 - 即,需要删除 autoinstall: 关键字,并相应地调整缩进

#
# typical user-data file
#
#cloud-config
autoinstall:
  version: 1
  identity:
    realname: 'DGX User'
    username: dgxuser
    password: '$6$g3vXaGj.MQpP/inN$l6.JtAueRAfMtQweK7qASjxXiEX8Vue3CvRcwON81Rt9BJmlEQKtnfOVSnCqHrTsy88PbMDDHq6k.iM6PWfHr1'

#
# unified autoinstall file
#
version: 1
identity:
  realname: 'DGX User'
  username: dgxuser
  password: '$6$g3vXaGj.MQpP/inN$l6.JtAueRAfMtQweK7qASjxXiEX8Vue3CvRcwON81Rt9BJmlEQKtnfOVSnCqHrTsy88PbMDDHq6k.iM6PWfHr1'

NVIDIA 特定的自动安装变量#

ISO 中包含的自动安装文件是特定于平台的,并且可以作为自定义版本的一个良好起点。其中许多文件包含以 CHANGE_ 为前缀的变量,这些变量将由安装程序替换

  • CHANGE_STORAGE_REG 当不存在引导参数 ai-encrypt-root 时,将删除并取消注释此项。取消注释此节会导致不使用 LUKS 加密的标准磁盘分区方案。

  • CHANGE_STORAGE_ENC 当存在引导参数“ai-encrypt-root”时,将删除并取消注释此项。取消注释此节会导致加密的根分区。

  • CHANGE_BOOT_DISK_NAME_x 这是一个磁盘名称,不带“/dev”前缀。对于期望 RAID 引导设备的平台,可能存在多个名称(例如 CHANGE_BOOT_DISK_NAME_1 和 CHANGE_BOOT_DISK_NAME_2) - DGX-2 和 DGX A100 就是这种情况。

    注意

    安装程序将找到要在此处替换的适当磁盘名称。或者,可以使用“force-bootdisk”参数来指定磁盘名称。

  • CHANGE_BOOT_DISK_PATH_x 这与上面的 CHANGE_BOOT_DISK_NAME_x 变量相同,只是它以“/dev/”为前缀。

  • CHANGE_DESC_PLATFORM 安装程序将用特定于平台的描述性名称替换此项。

  • CHANGE_SERIAL_NUMBER 安装程序将用 dmidecode 报告的序列号替换此项。

  • CHANGE_INSTALL_PKGS 安装程序将用特定于平台的软件包列表替换此值。软件包列表由 squashfs 中的 *-pkgs 文件指定

    注意

    此处的软件包列表将包括 oem-config 及其依赖项。当用户提供自己的自动安装文件时,他们通常也希望放弃 oem-config 提供的其他设置步骤,而是在自动安装期间执行这些步骤。对于这种情况,我们建议在 late-commands 部分中添加一个步骤来删除 oem-config 和 ubiquity 软件包

    late-commands:
      ...
      - curtin in-target -- apt-get purge -y oem-config ubiquity
    
  • CHANGE_REBUILD_RAID 这将根据是否存在“rebuild-raid”引导参数替换为“true”或“false”。

  • CHANGE_IPMISOL 这将根据是否存在“ai-encrypt-root”引导参数替换为“true”或“false”。当我们使用加密设置系统时,我们还会撤消 IPMI 串行通过 LAN 配置,以确保 LUKS 密码短语提示显示在控制台而不是串行通过 LAN 接口上。

注意

虽然可以自行替换这些值,但我们强烈建议让安装程序处理此问题。

常见自定义#

在本节中,我们将介绍一些在更自定义的部署中可能有用的常见自定义。

网络配置#

要在安装时配置网络,您可以向自动安装文件添加“network”部分。在此示例中,我们将创建一个 netplan 配置文件,该文件将 enp1s0f0 接口设置为使用 DHCP

network:
 version: 2
 ethernets:
   enp1s0f0:
    dhcp4: yes

创建用户#

要在安装时创建用户,您可以向自动安装文件添加“identity”部分。在此示例中,我们将系统的主机名设置为“dgx”,并创建一个名称/密码为 nvidia/nvidia 的用户。

#  To generate an encrypted password:
#    printf '<plaintext_password>' | openssl passwd -6 -stdin
#
#  For example:
#    printf 'nvidia' | openssl passwd -6 -stdin
identity:
  hostname: dgx
  password: $6$8fqF54QDoaLMtDXJ$J02iNH1xW9hHtzH6APpUX4X4HkRx2xY2ZKy9DQpGOQhW7OOuTk3DwHr9FnAAh1JIyqn3L277Jy9MEzW4MyVsV0
  username: nvidia

Ubuntu 自动安装参考中记录了更多示例