Repository navigation
bug(gpu): cuInit segfaults in DGX OS 7.5 sandbox while plain CDI passes #2343
Description
Description
On a DGX Station GB300 running DGX OS 7.5, a GPU-enabled OpenShell 0.0.85
sandbox can load the injected driver library and call cuDriverGetVersion, but
cuInit(0) segfaults. The same library and GPU pass on the host and in ordinary
Docker CDI containers, including as the sandbox UID/GID.
This blocks qualification of DGX OS 7.5 for the NemoClaw Station golden path.
The existing generic Ubuntu path remains the supported control.
Related: #1486
Environment
- Hardware: DGX Station GB300, ARM64
- OS: DGX OS
7.5.0-GB300ws-GB200ws/ Ubuntu 24.04.4 - Kernel:
6.17.0-1014-nvidia-64k - NVIDIA driver:
595.58.03 - Driver API:
cuDriverGetVersion=13020 - Docker:
29.2.1 - NVIDIA Container Toolkit:
1.19.0 - OpenShell:
0.0.85 - NemoClaw commit:
b47c81e0cc2b3dc22e07921167e48ad0a4ff7c1c
Reproduction
In a GPU-enabled OpenShell sandbox:
openshell sandbox exec -n my-assistant --no-tty -- \
python3 -c 'import ctypes; lib=ctypes.CDLL("libcuda.so.1"); rc=lib.cuInit(0); print(f"cuInit(0)={rc}")'Observed during fresh onboarding and in a separate bounded diagnostic:
GPU proof passed: nvidia-smi when available
GPU proof passed: /proc/<pid>/task/<tid>/comm write
GPU proof inconclusive: cuInit(0) via libcuda.so.1
Segmentation fault (core dumped)
The isolated diagnostic produced:
sandbox_libcuda_load: loaded=libcuda.so.1, exit 0
sandbox_driver_version: cuDriverGetVersion=0,version=13020, exit 0
sandbox_cuda_init: no output, exit 1
Controls
All of the following passed with cuInit(0)=0:
- the DGX OS host;
- an ephemeral network-disabled Docker CDI container as root;
- the same CDI container as UID/GID
998:998; - a current generic Ubuntu 24.04 ARM64 control rebuilt with the same NemoClaw
commit and OpenShell 0.0.85 (kernel6.8.0-124-generic, driver610.43.02).
The DGX OS host and sandbox used the same injected driver file:
sha256 ba8d543fee78b6e7932592d55abba877a0df226d48631e746bd50beb05916dac
/usr/lib/aarch64-linux-gnu/libcuda.so.595.58.03
The managed vLLM container, direct inference, routed agent inference, exact
response, tool-use artifact, restart/reuse, and ECC checks all passed. This
narrows the failure to the OpenShell sandbox boundary on the DGX OS
kernel/driver stack; the current evidence does not isolate kernel versus driver.
Expected Behavior
A GPU-enabled sandbox should complete cuInit(0) when the host and equivalent
plain CDI container pass. At minimum, the sandbox must fail deterministically
with an actionable diagnostic rather than continuing with CUDA marked
unverified after a segmentation fault.
Activity
elezar commentedon Jul 17, 2026
elezar commentedon Jul 17, 2026
elezar commentedon Jul 17, 2026
senthilr-nv commentedon Jul 17, 2026
New root-cause evidence from NVIDIA/NemoClaw#7108 narrows this from the broader CDI hypotheses to sysfs visibility through Landlock.
On a physical DGX OS 7.5 / GB300 Station, released OpenShell 0.0.85 passes
cuInit(0), CUDA device count, and GB300 identification when the generated NemoClaw direct-GPU filesystem policy adds/systoread_only. No patched or custom OpenShell binary is required.At the current PR head, the change is applied by
buildDirectGpuPolicyYaml()only when the agent sandbox has direct GPU enabled; CPU-only sandboxes are unchanged:https://github.com/NVIDIA/NemoClaw/blob/58c11e9d687231baad2debb8e48dd1e6d9c281c8/src/lib/onboard/initial-policy.ts#L38-L66
An equivalent GPU-only, read-only
/sysrule in the OpenShell default GPU policy enrichment could therefore benefit all OpenShell GPU consumers, not just NemoClaw. We are also preparing an independent clean-host repetition of the final PR head.fix(installer): enable stock DGX OS on Station GB300 (#7108)
mohityadav8 commentedon Jul 20, 2026
@elezar can i work on this
elezar commentedon Jul 21, 2026
Additional context from the merged NemoClaw PR NVIDIA/NemoClaw#7108: this now looks like a sysfs visibility gap in the OpenShell inner Landlock policy, not a CDI-spec parsing issue.
The important nuance is that NVIDIA CDI specs do not generally enumerate the sysfs topology paths that CUDA/NVML may read during initialization. Docker CDI can still pass because the ordinary container view leaves enough of
/sysreadable. OpenShell then applies a stricter inner Landlock policy, so those implicit host sysfs reads become explicit sandbox policy requirements.The merged NemoClaw fix narrowed the workaround from broad read-only
/systo a Station GB300 direct-GPU allowlist:/sys/bus/pci/devices/<BDF>entries for discovered NVIDIA display-class PCI devices;/sys/devices/system/cpu,/sys/devices/system/memory, and/sys/devices/system/node;/sys/module/nvidia/initstateand/sys/module/nvidia_uvm/initstate.They explicitly avoid adding broad
/sys,/sys/bus/pci/devices, PCI parent subtrees, or any sysfs write access.NemoClaw reports an A/B validation on physical DGX OS / GB300: without the sysfs exception, sandbox CUDA init failed; with the exact BDF plus CPU/memory/NUMA/module-init read-only paths,
cuInit(0)passed, while unrelated sysfs paths such as/sys/fs/cgroup/cgroup.controllersand/sys/class/net/lo/addressremained denied.This suggests the OpenShell-side fix should be a separate GPU runtime/sysfs enrichment, not a relaxation of CDI path validation and not an expectation that
/syswill appear in CDI. A conservative first implementation could mirror the NemoClaw allowlist for selected NVIDIA GPU PCI BDFs and the small shared topology/module paths, then validate on this DGX OS 7.5 / GB300 reproducer.github-actions commentedon Aug 4, 2026
This issue has had no activity for 14 days and is now marked stale. It may be closed in 7 days if there is no further activity. Comment or remove the state:stale label to keep it open.