Sysbox
Sysbox is a container runtime that lets customers run Docker-in-Docker securely inside pods — without --privileged mode. Many workloads (custom image builds, CI/CD pipelines, system-level tooling) require it.
Every validator probes every node for the sysbox-runc runtime. Nodes missing it are rejected — they earn no emission and cannot be rented. Sysbox is a hard requirement for every Lium node, not an optional optimization. Setup takes ~5 minutes.
Requirements
| Component | Requirement |
|---|---|
| Kernel | 5.19 or newer (6.x recommended). Older kernels cannot pass GPUs into a sysbox container — see below. |
| Docker | 27.x or 28.x works out of the box. 29.x needs daemon settings — see Docker 29. |
| Docker storage driver | overlay2 — check with docker info --format '{{.Driver}}'. On ZFS, and on some btrfs setups, the filesystem has no ID-map support and GPU passthrough breaks the same way an old kernel breaks it. |
| Architecture | x86_64 |
Kernel 5.19+ is mandatory for GPUs
Sysbox needs ID-mapped mounts, which the kernel supports for overlayfs only from 5.19 onward. On an older kernel — Ubuntu 22.04 ships 5.15 by default — sysbox falls back to shiftfs and runs the container rootfs from a different path (/var/lib/sysbox/shiftfs/<uuid>). The NVIDIA hook doesn't know about that move and still targets the original overlay2 path, which is not there in the container's mount namespace:
nvidia-container-cli: mount error: /var/lib/docker/overlay2/<id>/merged/proc/driver/nvidia: no such file or directory
Check your kernel:
uname -r
If it is below 5.19, install the HWE kernel and reboot:
sudo apt-get update
sudo apt-get install -y linux-generic-hwe-22.04
sudo reboot
Before you reboot:
- Stop any rentals. Rebooting a node under an active rental costs you a penalty.
- Check that the NVIDIA driver is DKMS-managed —
dkms statusshould list annvidiamodule. A driver installed from a.runfile without DKMS will not load on the new kernel, and the node comes back with no GPUs at all. Reinstall the driver after the reboot if that happens. - The old kernel stays in the GRUB menu, so you can boot back into it if something goes wrong.
- Ubuntu 20.04 has no upgrade path here — its HWE kernel is 5.15. You need 22.04 or newer.
After the reboot, confirm both uname -r and nvidia-smi before re-running the installer.
In our tests, upgrading the NVIDIA driver, the Container Toolkit, or Docker on its own did not fix this — only the kernel did.
Check the host first
The installer runs a preflight before it installs anything. Run it on its own with --check — it installs and configures nothing (the Sysbox probe pulls alpine once) and prints one line per requirement:
curl -fsSL https://raw.githubusercontent.com/Datura-ai/lium-io/main/neurons/executor/nvidia_docker_sysbox_setup.sh | sudo bash -s -- --check
…
PASS Kernel 6.8.0-1063-aws (>= 5.19, ID-mapped mounts available).
PASS Docker 29.8.0.
…
FIX Kernel modules iptable_nat iptable_filter are not loaded — the validators' Docker-in-Docker probe needs legacy iptables and reports sysbox missing without them.
sudo modprobe -a ip_tables iptable_nat iptable_filter # -a: without it modprobe reads the 2nd and 3rd name as parameters of the 1st
printf 'ip_tables\niptable_nat\niptable_filter\n' | sudo tee /etc/modules-load.d/lium-iptables.conf >/dev/null # survives reboots
…
SKIP Disk >= 1.5x VRAM — no NVIDIA driver, VRAM unknown.
PASS TCP 8080 (executor port) is free and not blocked by ufw.
…
Preflight: 6 PASS, 5 FIX, 1 SKIP.
Every FIX line is followed by the command that clears it. A SKIP is a check that could not run on this host — here the disk rule, because without the NVIDIA driver the VRAM is unknown; it counts neither way and clears once its input exists.
The checks:
- root and
x86_64; - kernel 5.19+;
- Docker installed and running;
- the NVIDIA driver loaded and at the validators' minimum version;
- the legacy iptables modules the validators' Docker-in-Docker probe needs;
- total disk of at least 1.5× total GPU VRAM on the filesystem under Docker's data-root — the idle-incentive rule;
- the node's HTTP and SSH ports free and not blocked by
ufw. The defaults are8080and2200; for other ports putEXECUTOR_PORT=… SSH_PORT=…aftersudo:… | sudo EXECUTOR_PORT=8001 SSH_PORT=2201 bash -s -- --check.
With --check it also reports the NVIDIA Container Toolkit, the Docker 29 settings, fusermount3 (from the fuse3 package) and whether a container starts under sysbox-runc. The command exits 1 while any line says FIX. Cloud firewalls sit outside the host: after the node is up, run nc -vz <public IP> 8080 2200 from another machine.
Without --check, a FIX on root, x86_64, the kernel or Docker stops the installer before it changes anything (Nothing was installed.); fix the lines and run it again. A FIX on the NVIDIA driver, the iptables modules, the disk or the ports is printed with its command and the install goes on, because a node without Sysbox is not listed at all. After SUCCESS (or Nothing to do. on a host that already has Sysbox 0.7.1 or newer; an older Sysbox is upgraded) a reminder says how many FIX lines are at the top and gives the --check command. Without a loaded NVIDIA driver the install still runs, but the final verification (nvidia-smi in a Sysbox container) fails: install the driver, reboot, and run the installer again.
Install
The lium-io repo ships an installer that takes care of NVIDIA Container Toolkit + Sysbox in one go. From any Ubuntu host:
curl -fsSL https://raw.githubusercontent.com/Datura-ai/lium-io/main/neurons/executor/nvidia_docker_sysbox_setup.sh | sudo bash
The installer installs fuse3 together with nvidia-container-toolkit and jq, before the Sysbox package. Sysbox 0.7 mounts its FUSE file systems with fusermount3, which only fuse3 provides, and the sysbox-ce package does not pull it in. On Ubuntu 22.04, fuse3 replaces the older fuse package and still satisfies the sysbox-ce dependency.
nvidia-container-toolkit is not in the Ubuntu archive. The installer adds NVIDIA's apt repository itself (key in /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg, list in /etc/apt/sources.list.d/nvidia-container-toolkit.list) unless an apt source already points at nvidia.github.io/libnvidia-container. When an apt-get step fails, it prints the last 20 lines of apt's output and exits 1; fix what apt reports (a proxy, a held package, a broken source) and re-run — the installer is idempotent. A local lium-io clone from before 8 Sep 2026 still has the older installer, which hides apt's output and stops silently after [3/7] Installing packages; git pull first.
Or, if you already have the lium-io repo cloned locally:
cd lium-io/neurons/executor
chmod +x nvidia_docker_sysbox_setup.sh
sudo ./nvidia_docker_sysbox_setup.sh
Confirm /etc/docker/daemon.json includes the sysbox runtime:
{
"runtimes": {
"sysbox-runc": {
"path": "/usr/bin/sysbox-runc"
}
}
}
Restart Docker:
sudo systemctl restart docker
Verify
Run the same command our validator uses:
sudo docker run --rm --runtime=sysbox-runc --gpus all daturaai/compute-subnet-executor:latest nvidia-smi
If you see nvidia-smi output — you're good.
docker and sudo docker can reach different daemonsThe installer above runs under sudo, so verify under sudo too. Rootless Docker, or a DOCKER_HOST set in your shell, points your plain docker client at another daemon. That daemon has no sysbox-runc and answers unknown or invalid runtime name: sysbox-runc, which looks like a failed install. Compare docker context ls with sudo docker context ls — contexts are per-user, so the two clients can differ.
Docker 29: two required settings
| Docker | Status |
|---|---|
| 27.x, 28.x | Works as is. What we run and test against. |
| 29.0–29.1 | Works — confirmed on 29.1.5. --gpus does not go through CDI until 29.2.0, and the installer sets cdi: false regardless. |
| 29.2.x–29.4.x | Works with cdi off. |
| 29.5.0 and later | Works with cdi and time-namespaces off — confirmed by a provider on 29.7.0. |
Docker 29 broke sysbox twice, in two unrelated ways. On 29.5.0 and later, turn both off with one block in /etc/docker/daemon.json:
{
"features": {
"cdi": false,
"time-namespaces": false
}
}
On 29.2.x–29.4.x, set only "cdi": false — the time-namespaces key appeared in 29.5 and is untested on older daemons.
Stop any rentals first. Restarting the daemon kills every running container on the host, and a pod killed under an active rental costs you a penalty. Then restart Docker and re-run the verify command:
sudo systemctl restart docker
Both settings are reversible — remove the features block and restart Docker to go back. cdi: false is daemon-wide, though: anything else on the host that gets its devices through CDI stops getting them that way. On a Lium node that is fine, since the NVIDIA legacy hook does the injection.
CDI: Docker 29.2.0 and later
Sysbox + GPU fails with a permission denied error:
OCI runtime create failed: ... failed to open OCI spec file: ... permission denied
Docker 29.2 enables CDI (Container Device Interface) by default, routing --gpus through CDI — incompatible with sysbox's user namespace.
Time namespaces: Docker 29.5.0 and later
Every container fails, GPUs or not:
docker run --runtime=sysbox-runc alpine echo ok
OCI runtime create failed: ... namespace {"time" ""} does not exist
The daemon now gives each container a private time namespace and writes it into the OCI spec; sysbox-runc before 0.7.1 does not know that namespace type and rejects the whole spec. Disabling CDI does not help here. Sysbox 0.6.6 and 0.7.0 reject it; 0.7.1 accepts it (we checked on Docker 29.8.1). The installer still turns time-namespaces off, so a host that keeps an older Sysbox also works. We first hit this on 29.6.2 in our own testing; a provider then confirmed both the error and the time-namespaces fix on 29.7.0.
If the error survives the time-namespaces setting, downgrade the daemon to 28.5.2, which we verified working with containerd 2.2.6. The downgrade restarts the daemon too — stop any rentals first, same as above:
source /etc/os-release
sudo apt-get install -y --allow-downgrades \
"docker-ce=5:28.5.2-1~ubuntu.${VERSION_ID}~${VERSION_CODENAME}" \
"docker-ce-cli=5:28.5.2-1~ubuntu.${VERSION_ID}~${VERSION_CODENAME}"
sudo apt-mark hold docker-ce docker-ce-cli
sudo systemctl restart docker
If apt cannot find that version, list what your repo has: apt-cache madison docker-ce.
Troubleshooting
-
mount error: .../merged/proc/driver/nvidia: no such file or directory— sysbox is running without ID-mapped mounts. Usually the kernel is older than 5.19: see Kernel 5.19+ is mandatory for GPUs. Ifuname -ralready shows 5.19 or newer, the filesystem under Docker's data-root is the next suspect (docker info --format '{{.Driver}}'should sayoverlay2);journalctl -u sysbox-mgr -b | grep -i id-mappedshows what sysbox itself decided. -
setting up ID-mapped mount on path 212/fs(any number before/fs) — your host runs Sysbox 0.6.6 or older. With Docker's containerd image store, that version cannot start an image with about 44 or more layers; smaller images still start, so the node looks healthy until a large image arrives. Re-runnvidia_docker_sysbox_setup.shwhen the node has no rentals (it upgrades Sysbox to 0.7.1), then check withsysbox-runc --version. If the output does not showExecutor restarted, start the executor again withdocker compose up -dfrom its folder. -
namespace {"time" ""} does not exist— your Docker daemon is 29.5.0 or newer. See Docker 29. -
failed to pre-register with sysbox-fsorfusermount: exec: "fusermount3": executable file not found in $PATH— the host has nofuse3, so every sysbox container fails to start even though the Sysbox package installed. An older installer can also end by blaming the Docker 29.5 time namespace, which is not the cause. Re-runnvidia_docker_sysbox_setup.sh(it installsfuse3and reconfigures Sysbox; with a local clone,git pullfirst), or install it by hand withsudo apt-get install -y fuse3and run the installer again. -
sysbox-runc not found— the installer didn't finish. Re-runnvidia_docker_sysbox_setup.shand check its output. -
GPU not visible inside the container — confirm NVIDIA Container Toolkit is installed (
nvidia-container-cli --version) and the Docker daemon was restarted after the install. -
The verify command works but the validator still reports
sysbox_runtime: false— the validator does not only start a sysbox container; it runs Docker inside it, and that innerdockerduses legacy iptables. On a host whose netfilter is nftables-only (the default on Debian 13 and Ubuntu 26.04), theip_tableskernel modules are not loaded, the inner daemon dies withcan't initialize iptables table 'nat',sshdnever starts, and the probe reports sysbox missing even though sysbox is fine. Load the three modules and make it stick across reboots — no Docker restart needed:sudo modprobe -a ip_tables iptable_nat iptable_filterprintf 'ip_tables\niptable_nat\niptable_filter\n' | sudo tee /etc/modules-load.d/lium-iptables.conflsmod | grep -E '^(ip_tables|iptable_nat|iptable_filter)' # all three listedThe next validation cycle (~15 min) passes.
-
Validator still reports Sysbox missing — wait one validation cycle (~15 min) and re-check from the Provider Portal. If it does not clear after two cycles and the verify command above works, see the nftables entry just above.