问题
shell
sudo docker run -d -p 2222:22 --gpus all 【略】
出现
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running prestart hook #0: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: mount error: lstat failed: /usr/lib/wsl/lib/libnvidia-gpucomp.so.580.105.07: no such file or directory: unknown
gemini首次回答[未解决]
这是一个非常经典的 WSL2 + Docker GPU 透传错误。
报错的核心在于这句:lstat failed: /usr/lib/wsl/lib/libnvidia-gpucomp.so.580.105.07: no such file or directory。
原因分析:
在 WSL2 环境下,Linux 里面并没有真正安装显卡驱动,而是由 Windows 宿主机强行将底层的驱动文件(.so 文件)映射到了 WSL 的 /usr/lib/wsl/lib/ 目录下。
当你最近在 Windows 上更新了显卡驱动(版本更新到了 580.105.07),或者 Windows 后台自动刷新了驱动状态,但当前的 WSL 实例没有重启,就会导致映射路径不同步。Docker 试图去挂载新版本的驱动库,却在 WSL 的旧映射目录下找不到它。
要解决这个问题,请按以下步骤操作:
步骤 1:强制重启 WSL(最关键)
必须让 WSL 彻底关闭并重新冷启动,以重新映射 Windows 的新版驱动文件。
-
打开 Windows 的 PowerShell 或 CMD(不是在 Ubuntu 里)。
-
执行以下命令强制关闭所有 WSL 实例:
cmdwsl --shutdown -
等待几秒钟后,重新打开你的 Ubuntu/WSL 终端。
步骤 2:验证驱动文件是否重新挂载
回到你的 Ubuntu 终端,检查那个报错的库文件现在是否出现了:
bash
ls -l /usr/lib/wsl/lib/libnvidia-gpucomp*
- 结果判断: 如果能看到输出(类似指向
libnvidia-gpucomp.so.580.105.07的文件),说明同步成功。
步骤 3:重置 Docker GPU 运行时(保险起见)
有时候驱动更新后,NVIDIA Container Toolkit 也需要重新生成一下配置文件。在 Ubuntu 终端执行:
bash
# 重新配置 runtime
sudo nvidia-ctk runtime configure --runtime=docker
完成这三步后,再次运行你的 sudo docker run ... 命令,应该就能顺利拉起带有 4090 GPU 的容器了。
查看libnvidia-gpucomp*
只有 /usr/lib/wsl/lib/libnvidia-gpucomp.so
gemini第二次回答 【解决】
这个输出非常清晰地说明了问题:文件确实存在,只是缺少了版本号后缀。
这是最近 Windows NVIDIA 驱动(580.x 系列)和 WSL2 Docker 结合时的一个已知官方 Bug。Docker 底层的 nvidia-container-cli 非常死板,它探测到你的驱动版本是 580.105.07,就强制要求去挂载 libnvidia-gpucomp.so.580.105.07,但 Windows 映射进来的本体却只有不带版本号的 libnvidia-gpucomp.so。
要解决这个问题,我们需要手动给它建一个带版本号的软链接(快捷方式)骗过 Docker。但由于 /usr/lib/wsl/lib 这个目录在 WSL 中是只读系统(Read-only file system),我们无法直接在里面创建文件。
请严格按顺序在终端执行以下 4 条命令,使用"偷梁换柱"的挂载大法来修复:
bash
# 1. 将现有的只读驱动库完整复制到一个新建的可写目录中
sudo cp -r /usr/lib/wsl/lib /usr/lib/wsl/lib_custom
# 2. 在这个新目录里,创建一个 Docker 想要的带版本号的软链接
sudo ln -s /usr/lib/wsl/lib_custom/libnvidia-gpucomp.so /usr/lib/wsl/lib_custom/libnvidia-gpucomp.so.580.105.07
# 3. 使用 bind 挂载,用我们修改好的新目录强行覆盖掉原本的只读目录
sudo mount --bind /usr/lib/wsl/lib_custom /usr/lib/wsl/lib
# 4. 重启 Docker 服务使配置生效
sudo service docker restart
执行完这四步后,再次运行你的 sudo docker run ... 命令,就能完美启动并透传 4090 了。
写入bashrc
# ====================================================
# 修复 WSL2 Docker GPU 驱动挂载丢失版本号的问题 (580.105.07)
# 注意:/usr/lib/wsl/lib_custom 目录及其软链接必须已提前创建好
# ====================================================
if [ ! -f "/usr/lib/wsl/lib/libnvidia-gpucomp.so.580.105.07" ]; then
echo "🔍 检测到 WSL 驱动映射重置,正在应用 GPU 挂载补丁..."
# 执行挂载并重启 Docker,此处会要求输入一次你的 joy 用户密码
sudo mount --bind /usr/lib/wsl/lib_custom /usr/lib/wsl/lib
sudo service docker restart
echo "✅ GPU 驱动补丁已生效!"
fi