Skip to content

nvidia: discover the driver under / and normalize container paths - #1083

Merged
maherthomsi merged 2 commits into
bottlerocket-os:developfrom
maherthomsi:nvidia-cdi-usr-lib-paths
Oct 16, 2026
Merged

maherthomsi merged 2 commits into
bottlerocket-os:developfrom
maherthomsi:nvidia-cdi-usr-lib-paths

Conversation

@maherthomsi

@maherthomsi maherthomsi commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Description of changes:

The device plugin discovered the driver under the Bottlerocket cross-compilation sysroot, so that the generated CDI specification reported library paths as /usr/lib/<library>. That sysroot holds only usr, so the nvidia-persistenced socket under /run and the GSP firmware under /lib/firmware never resolved there, and the plugin left both out of the specification it writes to /var/run/cdi. A container then reported persistence mode as Disabled while the host reported Enabled. Persistence mode stayed enabled on the GPU, and only the reported value was wrong.

nvidia-k8s-device-plugin now discovers the driver under /, where the sockets and the firmware live, and patch 1004 adds a --container-path-root flag that replaces that root with / in the container paths of the generated specification. The host paths keep the sysroot, because the files are there.

nvidia-container-toolkit now passes --device-name-strategy uuid --device-name-strategy index, which is the nvidia-ctk default and which the unit had narrowed to UUID names, and runs nvidia-ctk cdi transform root --relative-to container so that /etc/cdi/nvidia.json reports the same /usr/lib paths as the plugin specification.

Related PRs:

Testing done:

  • Built core-kit for x86_64 and built aws-k8s-1.36-nvidia and aws-k8s-1.37-nvidia AMIs
  • Launched g4dn.xlarge nodes on EKS 1.36 clusters in us-east-1 and us-west-2, and on a 1.37 node, all registering their GPU with the kubelet
  • Verified nvidia-smi --query-gpu=pci.bus_id,persistence_mode reports Enabled both on the host and inside a container that requests nvidia.com/gpu
  • Verified the plugin specification at /var/run/cdi/k8s.device-plugin.nvidia.com-gpu.json contains the /run/nvidia-persistenced/socket mount, and that the plugin log reports Selecting /run/nvidia-persistenced/socket
  • Verified containers see the libraries at /usr/lib with the libcuda.so.1 symlink chain, and that ldconfig -p resolves libcuda.so.1 and libnvidia-ml.so.1
  • Verified the /usr/lib/nvidia/tesla compatibility symlinks still appear on a variant that renders the compat exec-start template
  • Verified /etc/cdi/nvidia.json declares CDI version 0.5.0 and holds both index and UUID device names
/dev and devmounts == ls -l /dev (nvidia) crw-rw-rw-. 1 root root 195, 254 Oct 16 21:24 nvidia-modeset crw-rw-rw-. 1 root root 239, 0 Oct 16 21:24 nvidia-uvm crw-rw-rw-. 1 root root 239, 1 Oct 16 21:24 nvidia-uvm-tools crw-rw-rw-. 1 root root 195, 0 Oct 16 21:24 nvidia0 crw-rw-rw-. 1 root root 195, 255 Oct 16 21:24 nvidiactl == mountinfo entries under /dev or proc driver 899 897 0:95 / /dev rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:data_t:s0:c247,c908",size=65536k,mode=755 901 899 0:97 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,context="system_u:object_r:data_t:s0:c247,c908",gid=5,mode=620,ptmxmode=666 902 899 0:92 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw,seclabel 903 897 259:17 /var/lib/docker/containers/8e4245c3309dfc5f4d965f647dfc7dc98077b34df1fda92de5ba1b13aff55cc4/resolv.conf /etc/resolv.conf rw,nosuid,nodev,noatime - xfs /dev/nvme1n1p1 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,sunit=8,swidth=8,noquota 904 897 259:17 /var/lib/docker/containers/8e4245c3309dfc5f4d965f647dfc7dc98077b34df1fda92de5ba1b13aff55cc4/hostname /etc/hostname rw,nosuid,nodev,noatime - xfs /dev/nvme1n1p1 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,sunit=8,swidth=8,noquota 905 897 259:17 /var/lib/docker/containers/8e4245c3309dfc5f4d965f647dfc7dc98077b34df1fda92de5ba1b13aff55cc4/hosts /etc/hosts rw,nosuid,nodev,noatime - xfs /dev/nvme1n1p1 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,sunit=8,swidth=8,noquota 906 899 0:72 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,context="system_u:object_r:data_t:s0:c247,c908",size=65536k 909 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/nvidia-cuda-mps-control /usr/bin/nvidia-cuda-mps-control ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 910 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/nvidia-cuda-mps-server /usr/bin/nvidia-cuda-mps-server ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 911 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/nvidia-debugdump /usr/bin/nvidia-debugdump ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 912 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/nvidia-persistenced /usr/bin/nvidia-persistenced ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 913 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/nvidia-smi /usr/bin/nvidia-smi ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 914 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libEGL.so.580.178.04 /usr/lib/libEGL.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 915 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libEGL_nvidia.so.580.178.04 /usr/lib/libEGL_nvidia.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 916 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libGLESv1_CM_nvidia.so.580.178.04 /usr/lib/libGLESv1_CM_nvidia.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 917 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libGLESv2_nvidia.so.580.178.04 /usr/lib/libGLESv2_nvidia.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 918 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libGLX_nvidia.so.580.178.04 /usr/lib/libGLX_nvidia.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 919 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libcuda.so.580.178.04 /usr/lib/libcuda.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 920 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libcudadebugger.so.580.178.04 /usr/lib/libcudadebugger.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 921 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvcuvid.so.580.178.04 /usr/lib/libnvcuvid.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 922 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-allocator.so.580.178.04 /usr/lib/libnvidia-allocator.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 923 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-cfg.so.580.178.04 /usr/lib/libnvidia-cfg.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 924 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-eglcore.so.580.178.04 /usr/lib/libnvidia-eglcore.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 925 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-encode.so.580.178.04 /usr/lib/libnvidia-encode.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 926 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-fbc.so.580.178.04 /usr/lib/libnvidia-fbc.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 927 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-glcore.so.580.178.04 /usr/lib/libnvidia-glcore.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 928 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-glsi.so.580.178.04 /usr/lib/libnvidia-glsi.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 929 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-glvkspirv.so.580.178.04 /usr/lib/libnvidia-glvkspirv.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 930 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-gpucomp.so.580.178.04 /usr/lib/libnvidia-gpucomp.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 931 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-ml.so.580.178.04 /usr/lib/libnvidia-ml.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 932 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-ngx.so.580.178.04 /usr/lib/libnvidia-ngx.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 933 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-nvvm.so.580.178.04 /usr/lib/libnvidia-nvvm.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 934 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-opencl.so.580.178.04 /usr/lib/libnvidia-opencl.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 935 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-opticalflow.so.580.178.04 /usr/lib/libnvidia-opticalflow.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 936 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-pkcs11-openssl3.so.580.178.04 /usr/lib/libnvidia-pkcs11-openssl3.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 937 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-pkcs11.so.580.178.04 /usr/lib/libnvidia-pkcs11.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 938 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-present.so.580.178.04 /usr/lib/libnvidia-present.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 939 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-ptxjitcompiler.so.580.178.04 /usr/lib/libnvidia-ptxjitcompiler.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 940 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-rtcore.so.580.178.04 /usr/lib/libnvidia-rtcore.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 941 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvidia-tls.so.580.178.04 /usr/lib/libnvidia-tls.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 942 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libnvoptix.so.580.178.04 /usr/lib/libnvoptix.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 943 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/libvdpau_nvidia.so.580.178.04 /usr/lib/libvdpau_nvidia.so.580.178.04 ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 944 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/bin/kmod /usr/local/sbin/modprobe ro,relatime master:1 - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 945 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/vulkan/icd.d/nvidia_icd.json /etc/vulkan/icd.d/nvidia_icd.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 946 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/vulkan/icd.d/nvidia_layers.json /etc/vulkan/icd.d/nvidia_layers.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 947 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/vulkan/icd.d/nvidia_layers.json /etc/vulkan/implicit_layer.d/nvidia_layers.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 948 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/nvidia/nvoptix.bin /usr/share/nvidia/nvoptix.bin ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 949 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/firmware/nvidia/580.178.04/gsp_ga10x.bin /usr/lib/firmware/nvidia/580.178.04/gsp_ga10x.bin ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 950 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/lib/firmware/nvidia/580.178.04/gsp_tu10x.bin /usr/lib/firmware/nvidia/580.178.04/gsp_tu10x.bin ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 951 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json /usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 952 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json /usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 953 897 252:0 /x86_64-bottlerocket-linux-gnu/sys-root/usr/share/glvnd/egl_vendor.d/10_nvidia.json /usr/share/glvnd/egl_vendor.d/10_nvidia.json ro,nosuid,nodev,relatime - erofs /dev/root ro,seclabel,user_xattr,acl,cache_strategy=readaround 967 898 0:99 /nvct-params /proc/driver/nvidia/params rw,relatime - tmpfs tmpfs rw,seclabel,size=4k

Terms of contribution:

By submitting this pull request, I agree that this contribution is dual-licensed under the terms of both the Apache License, version 2.0, and the MIT license.

containerDriverRoot was the cross-compilation sysroot, so that the
generated CDI specification reported library paths as /usr/lib. That
sysroot holds only usr, so the nvidia-persistenced socket under /run
and the GSP firmware under /lib/firmware were left out of the
specification, and nvidia-smi in a container reported persistence mode
as Disabled.

Set containerDriverRoot to / and add patch 1004, which introduces a
--container-path-root flag that replaces that root with / in the
container paths. The host paths keep the sysroot.

Signed-off-by: Maher Homsi <maherhom@amazon.com>
Comment thread packages/nvidia-container-toolkit/generate-cdi-specs.service Outdated
From ecbbcbfd1e0f7ff6e03ff4c5ad189e24cb2b3d05 Mon Sep 17 00:00:00 2001
From: Maher Homsi <maherhom@amazon.com>
Date: Wed, 14 Oct 2026 21:06:21 +0000
Subject: [PATCH] Normalize container paths in generated CDI specifications

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.

You should open an issue if not already in NVIDIA Device Plugin making the case to support this and we can upstream it.

generate-cdi-specs pinned --device-name-strategy uuid, so
/etc/cdi/nvidia.json held UUID names only and declared CDI version
0.3.0, while the device plugin names its devices by index.

Pass both naming strategies, which is the nvidia-ctk default, and run
nvidia-ctk cdi transform root to replace the cross-compilation sysroot
with / in the container paths. The host paths keep the sysroot.

Signed-off-by: Maher Homsi <maherhom@amazon.com>
@maherthomsi
maherthomsi force-pushed the nvidia-cdi-usr-lib-paths branch from 673f58d to b107ce4 Compare October 16, 2026 21:44
Comment on lines 14 to +15
--device-name-strategy uuid \
--device-name-strategy index \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would have thought one would overwrite the other but per the --help:

If this is specified multiple times, the devices will be duplicated for each strategy.

@maherthomsi
maherthomsi merged commit d8b7dfa into bottlerocket-os:develop Oct 16, 2026
3 checks passed
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.

3 participants