diff --git a/docs/setup.md b/docs/setup.md index 7f81556f8..963285f16 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -151,20 +151,33 @@ scripts/check-docker-gpu.sh --enable-nvidia-overlay scripts/check-docker-gpu.sh --install-nvidia-toolkit --enable-nvidia-overlay ``` -> **WSL2 + snap Docker.** If `docker run --gpus all ...` fails with -> `failed to fulfil mount request: open /usr/lib/wsl/lib/libdxcore.so: no -> such file or directory`, check whether Docker was installed via `snap` -> (`snap list docker`, or `docker info --format '{{.DockerRootDir}}'` reports -> a path under `/var/snap/docker/`). Snap's confinement prevents Docker from -> seeing the GPU library WSL2 injects at `/usr/lib/wsl/lib`, even though the -> file exists on the host — installing or reconfiguring -> `nvidia-container-toolkit` will not fix this, since the toolkit isn't the -> problem. `scripts/check-docker-gpu.sh` detects this combination and calls -> it out directly. The fix is to remove snap Docker and install the official -> apt-based Docker Engine instead -> ([docs.docker.com/engine/install](https://docs.docker.com/engine/install/)), -> then re-run `nvidia-ctk runtime configure --runtime=docker` and restart -> Docker. +**WSL2 + snap Docker.** If the NVIDIA check fails with this error, Docker may be +installed via snap: + +```text +failed to fulfil mount request: open /usr/lib/wsl/lib/libdxcore.so: no such file or directory +``` + +Check with `snap list docker` or: + +```bash +docker info --format '{{.DockerRootDir}}' +``` + +A Docker root under `/var/snap/docker/` means snap confinement can prevent +Docker from seeing WSL2's `/usr/lib/wsl/lib` GPU libraries even when the files +exist on the host. Reinstalling or reconfiguring `nvidia-container-toolkit` will +not fix that. Remove snap Docker, install the official apt-based Docker Engine +([Docker docs](https://docs.docker.com/engine/install/ubuntu/)), then configure +the NVIDIA runtime again: + +```bash +sudo snap remove docker +sudo nvidia-ctk runtime configure --runtime=docker +sudo systemctl restart docker +``` + +Then re-run `scripts/check-docker-gpu.sh`. Safety notes: - The app never installs host GPU runtime automatically. diff --git a/scripts/check-docker-gpu.sh b/scripts/check-docker-gpu.sh index d30d4c5f9..22e6eb539 100755 --- a/scripts/check-docker-gpu.sh +++ b/scripts/check-docker-gpu.sh @@ -214,16 +214,9 @@ _check_nvidia_smi() { echo } -# Returns 1 if Docker is unavailable (callers should stop further GPU checks). -# WSL2 only: Docker installed via snap confines the container runtime's mount -# namespace, so it cannot see the GPU library WSL2 injects at -# /usr/lib/wsl/lib/libdxcore.so even though the file exists on the host. -# Symptom: `docker run --gpus all ...` fails with -# "failed to fulfil mount request: open /usr/lib/wsl/lib/libdxcore.so: no -# such file or directory". No nvidia-container-toolkit install or -# `nvidia-ctk runtime configure` fixes this — the fix is to stop using the -# snap package. DockerRootDir is the reliable way to tell: snap installs -# report a path under /var/snap/docker/ instead of the normal /var/lib/docker. +# WSL2 snap Docker cannot see /usr/lib/wsl/lib/libdxcore.so from its confined +# namespace, so NVIDIA passthrough fails until the user switches to non-snap +# Docker. DockerRootDir identifies snap installs more reliably than snap(8). _is_wsl() { grep -qi microsoft /proc/version 2>/dev/null && return 0 [ -d /usr/lib/wsl ] && return 0 @@ -237,6 +230,7 @@ _is_docker_snap() { return 1 } +# Returns 1 if Docker is unavailable (callers should stop further GPU checks). _check_docker() { _info "Checking Docker..." if ! command -v docker >/dev/null 2>&1; then