Skip to content

feat: support Azure Linux ARM64 images on NVIDIA GB200/300 - #9365

Open
Mitch Zhu (miz060) wants to merge 3 commits into
mainfrom
mitchzhu/gb200-azurelinux-shared-arm64
Open

feat: support Azure Linux ARM64 images on NVIDIA GB200/300#9365
Mitch Zhu (miz060) wants to merge 3 commits into
mainfrom
mitchzhu/gb200-azurelinux-shared-arm64

Conversation

@miz060

Copy link
Copy Markdown
Member

What this PR does / why we need it:
We want to support NVIDIA Grace GB200 and GB300 VMs on Azure Linux 3. These VMs require kernel-hwe and Grace-specific boot arguments, while standard ARM64 nodes use kernel without those arguments. Maintaining a separate VHD image series for GB200 and GB300 is undesirable, so this PR installs both kernels in one ARM64 image and selects the correct kernel and boot arguments based on the underlying hardware. It also enables managed NVIDIA driver setup for the Azure
Linux 3 ARM64 GPU path.

Changes:

  • Build one Azure Linux 3 ARM64 VHD with both kernel and kernel-hwe, plus the GRUB modules required for boot-time hardware detection.
  • Extend 10_azure_nvidia to select kernel-hwe with Grace arguments on GB200/GB300 and kernel without those arguments on standard ARM64. Existing Ubuntu behavior remains unchanged.
  • Enable managed GPU driver setup for standard, non-FIPS Azure Linux 3 ARM64: install when requested; otherwise validate and install only when needed.
  • Select cuda-open or cuda-open-hwe from the running kernel and current repository state without pinning an Azure Linux release.

Validation:

  • Unit test passed
  • Exact-source CPU and GPU ARM64 VMs passed first boot and reboot: ordinary ARM64 selected the standard kernel and passed CPU workload tests; NVIDIA Grace selected HWE with Grace arguments and passed GPU workload tests. Both passed GRUB, cloud-init, and systemd health checks.

Install standard and HWE kernels in the Azure Linux 3 ARM64 image. Select HWE with Grace boot arguments only on NVIDIA Grace hardware while ordinary ARM64 keeps the standard kernel.

Signed-off-by: Mitch Zhu <mitchzhu@microsoft.com>
Enable standard non-FIPS Azure Linux 3 ARM64 while preserving the existing install-or-validate dispatch. Resolve cuda-open packages against the running standard or HWE kernel from current repository state.

Signed-off-by: Mitch Zhu <mitchzhu@microsoft.com>
Verify the dual-kernel image contract, GRUB selection, and ordinary ARM64 boot behavior. Run VHD validation from the requested fork and captured source SHA.

Signed-off-by: Mitch Zhu <mitchzhu@microsoft.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Windows Unit Test Results

  3 files   13 suites   51s ⏱️
404 tests 404 ✅ 0 💤 0 ❌
407 runs  407 ✅ 0 💤 0 ❌

Results for commit 22e4909.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Kernel and GRUB update handling can break dual-kernel booting, and driver selection does not reliably distinguish kernel tracks.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds Azure Linux 3 ARM64 support for NVIDIA Grace systems using a shared dual-kernel VHD and managed GPU drivers.

Changes:

  • Installs standard and HWE kernels with hardware-aware GRUB selection.
  • Enables Azure Linux ARM64 NVIDIA driver installation and validation.
  • Expands VHD and ShellSpec coverage.
File summaries
File Description
vhdbuilder/packer/vhd-image-builder-mariner-arm64.json Uploads NVIDIA GRUB files.
vhdbuilder/packer/test/run-test.sh Passes configurable repository URL.
vhdbuilder/packer/test/linux-vhd-content-test.sh Tests dual-kernel VHD contents.
vhdbuilder/packer/pre-install-dependencies.sh Co-installs kernels and GRUB modules.
vhdbuilder/packer/packer_source.sh Installs GRUB selector configuration.
spec/vhdbuilder/packer/test/linux_vhd_content_test_helpers_spec.sh Tests source checkout behavior.
spec/parts/linux/cloud-init/artifacts/cse_install_mariner_spec.sh Tests HWE driver selection.
spec/parts/linux/cloud-init/artifacts/cse_config_spec.sh Tests ARM64 GPU dispatch.
spec/parts/linux/cloud-init/artifacts/azure_nvidia_spec.sh Tests kernel selector behavior.
pkg/agent/baker_test.go Covers GB GPU mappings.
parts/linux/cloud-init/artifacts/mariner/cse_install_mariner.sh Supports HWE OpenRM packages.
parts/linux/cloud-init/artifacts/cse_config.sh Enables supported ARM64 GPU setup.
parts/linux/cloud-init/artifacts/51-azure-nvidia.cfg Documents Grace argument handling.
parts/linux/cloud-init/artifacts/10_azure_nvidia Selects kernels using hardware detection.
Review details
  • Files reviewed: 14/14 changed files
  • Comments generated: 3
  • Review effort level: Balanced

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

elif [ "$driver_ret" -eq 0 ]; then
echo "VM SKU ${VM_SKU} uses NVIDIA OpenRM driver (cuda-open)"
CUDA_PACKAGE=$(dnf repoquery -y --available "cuda-open*" | grep -E "^cuda-open-[0-9]+.*_${KERNEL_VERSION}" | sort -V | tail -n 1)
CUDA_PACKAGE=$(getLatestAzureLinuxNvidiaDriverPackageForKernel "cuda-open*" "^cuda-open(-hwe)?-[0-9]" "$KERNEL_VERSION")
dnf_install 30 1 600 dnf5 || exit "$ERR_APT_INSTALL_TIMEOUT"
fi

dnf5 install -y kernel-hwe || exit "$ERR_APT_INSTALL_TIMEOUT"
Comment on lines +225 to +230
install -d -m 0755 "$grub_module_destination"
install -m 0644 \
"$grub_module_source/extcmd.mod" \
"$grub_module_source/smbios.mod" \
"$grub_module_source/moddep.lst" \
"$grub_module_destination/"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants