简介:这份PDF文档面向需要在Windows 11上搭建Ubuntu 24.04双系统的开发者与深度学习初学者,重点解决系统安装后Nvidia驱动、CUDA、cuDNN及Python开发环境配置繁琐、易踩坑的问题。内容覆盖Ubuntu 24.04安装、Nvidia驱动部署、CUDA与cuDNN配置、Anaconda安装、虚拟环境创建,以及VS Code和PyCharm专业版的环境搭建,并附有新手参考链接与快速安装路径,兼顾零基础与有经验读者。资源包共1个PDF文件,大小约1.74MB,便于离线查阅与按步骤对照操作。目前已有17630人学习下载,说明该流程经过较多读者验证。读者可据此获得一套从系统到深度学习工具链的完整配置思路,减少驱动版本不匹配、环境变量遗漏等常见问题,快速完成开发环境搭建。
1. 从 Windows 11 到 Ubuntu 24.04:一套能跑通 CUDA 的深度学习环境搭建路线
如果你刚在 Windows 11 上腾出一块空闲分区,准备装 Ubuntu 24.04 做深度学习,大概率会在某个环节卡住:要么装完系统 WiFi 直接消失,要么nvidia-smi报错,要么 CUDA 装完nvcc -V找不到命令。这套流程我在几台机器上反复走过,从 Rufus 做启动盘到 PyTorch 认出 GPU,中间踩过的坑基本都集中在驱动版本匹配、Secure Boot 拦截和源配置这三处。本文按 Ubuntu 24.04 + Nvidia 驱动 + CUDA + cuDNN + Anaconda + VS Code/PyCharm 的顺序拆一遍,每一步给出可复现的命令和参数说明,适合已经装过一两次系统、想快速把环境跑起来的同学。新手建议先看一遍再动手,老手可以直接跳到驱动和 CUDA 版本匹配那节。
2. 装 Ubuntu 24.04 与 Windows 11 共存:分区、启动盘和 BIOS 三个关键点
2.1 分区规划与启动盘制作
Windows 11 下腾空间,我一般用系统自带的磁盘管理压缩卷,留出至少 100GB 给 Ubuntu。注意 Windows 的快速启动和 BitLocker 要先关掉,否则安装程序可能看不到硬盘。启动盘用 Rufus 写入 Ubuntu 24.04 的 ISO,分区类型选 GPT,目标系统选 UEFI,文件系统保持 FAT32。如果 ISO 超过 4GB 且 Rufus 提示需要 NTFS,直接选它推荐的方案即可,Ubuntu 24.04 的安装器已经能识别。
# 在 Windows 上确认分区状态(管理员 PowerShell) Get-Disk Get-Partition -DiskNumber 0 # 关闭快速启动(管理员 CMD) powercfg /h off # 查看 BitLocker 状态,如已启用先暂停保护 manage-bde -statusGet-Disk用来确认磁盘编号和分区表类型,必须是 GPT 才能走 UEFI 启动。powercfg /h off关掉休眠文件,避免 Windows 占用分区导致 Ubuntu 安装器无法调整。manage-bde -status检查加密状态,如果显示 Protection On,先在控制面板暂停 BitLocker,装完 Ubuntu 再恢复,否则安装程序读不到分区。
2.2 BIOS 设置与安装引导
重启按 F2 或 F12 进 BIOS,确认三件事:Secure Boot 先关掉(装完驱动再开),SATA 模式设为 AHCI,启动顺序把 U 盘排第一。进入 Ubuntu 安装界面后,分区那一步选「其他选项」手动分,我一般这样切:
| 挂载点 | 大小 | 类型 | 说明 |
|---|---|---|---|
| /boot/efi | 512MB | EFI 系统分区 | 和 Windows 共用已有的 EFI 分区,不要格式化 |
| / | 60GB | ext4 | 根分区 |
| /home | 剩余空间 | ext4 | 用户数据 |
| swap | 内存大小 | swap | 休眠用,内存大于 32GB 可省略 |
安装过程中有一个选项叫「安装第三方图形驱动」,这里不要勾。原因很简单:安装器自带的 Nvidia 驱动版本往往偏旧,装完再手动换版本会残留配置,后面nvidia-smi报错很难排查。先用开源驱动把系统跑起来,进桌面后再处理显卡驱动。
2.3 首次启动后的基础配置
装完重启,先换国内源再更新,否则 apt 拉包能等到怀疑人生。Ubuntu 24.04 的源配置文件在/etc/apt/sources.list.d/ubuntu.sources,格式和 22.04 的sources.list不一样,别照抄旧教程。
# 备份原配置 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak # 编辑源,替换为国内镜像(以清华源为例) sudo nano /etc/apt/sources.list.d/ubuntu.sources # 更新索引并升级 sudo apt update && sudo apt upgrade -y # 安装编译工具和内核头文件,后面装驱动要用 sudo apt install -y build-essential linux-headers-$(uname -r) dkmsubuntu.sources是 deb822 格式,把URIs字段改成镜像地址即可,不要动Suites和Components。linux-headers-$(uname -r)必须和当前内核版本严格对应,DKMS 编译 Nvidia 内核模块时依赖它,缺了会直接编译失败。dkms负责在内核升级后自动重编驱动模块,不装的话每次内核更新显卡驱动都会掉。
3. Nvidia 驱动安装:版本匹配、Secure Boot 签名与 WiFi 消失的排查
3.1 驱动版本选择与安装方式对比
Nvidia 驱动有三条安装路径:Ubuntu 软件与更新里的附加驱动、apt 源里的nvidia-driver-xxx、官网 runfile。我优先推荐前两种,runfile 容易和系统包管理冲突。Ubuntu 24.04 的附加驱动里通常能看到 535、550、555 几个版本,选哪个取决于你要装的 CUDA 版本。
| 驱动版本 | 支持的最高 CUDA | 适用场景 |
|---|---|---|
| 535 | 12.2 | 稳定,PyTorch 2.1 官方推荐 |
| 550 | 12.4 | 较新,支持 40 系卡 |
| 555 | 12.5 | 最新,部分新卡需要 |
先用ubuntu-drivers devices看推荐版本,再决定装哪个。如果显卡是 40 系,驱动别低于 550,否则 CUDA 12.4 以上跑不起来。
# 查看显卡型号和推荐驱动 ubuntu-drivers devices # 查看 apt 源里可用的驱动版本 apt search nvidia-driver | grep -E "^nvidia-driver-[0-9]+" # 安装指定版本(以 535 为例) sudo apt install -y nvidia-driver-535 # 重启 sudo rebootubuntu-drivers devices会输出recommended标记,但推荐版本不一定适合你的 CUDA 需求,要结合上表判断。apt install nvidia-driver-535会自动处理依赖和 DKMS 编译,比 runfile 干净。装完必须重启,驱动模块才会加载。
3.2 Secure Boot 与驱动签名
如果 BIOS 里 Secure Boot 是开着的,Nvidia 内核模块没签名就加载不了,表现是nvidia-smi报NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver。两个选择:关掉 Secure Boot,或者给模块签名。我一般装系统阶段先关,环境跑通后再开并配 MOK 签名。
# 检查 Secure Boot 状态 mokutil --sb-state # 如果显示 enabled,查看模块是否加载 lsmod | grep nvidia # 查看内核日志里的签名错误 sudo dmesg | grep -i "module verification failed"mokutil --sb-state输出SecureBoot enabled就说明签名是必须的。lsmod | grep nvidia没有任何输出,基本可以确认模块没加载。dmesg里如果有module verification failed: signature and/or required key missing,就是签名问题,要么关 Secure Boot,要么走mokutil --import导入密钥。
3.3 WiFi 消失与驱动冲突处理
装完 Nvidia 驱动后 WiFi 图标不见了,这个坑我遇到过两次。原因是驱动安装过程重新编译了内核模块,某些无线网卡的iwlwifi模块被覆盖或版本错位。先看dmesg里无线网卡有没有报错,再决定是重装内核模块还是回退驱动。
# 查看无线网卡状态 lspci | grep -i network rfkill list # 查看内核日志中的无线相关错误 sudo dmesg | grep -i iwlwifi # 重装内核模块(以 iwlwifi 为例) sudo apt install --reinstall linux-modules-extra-$(uname -r) sudo modprobe -r iwlwifi && sudo modprobe iwlwifilspci确认网卡型号,rfkill list看是不是被软屏蔽。dmesg | grep iwlwifi如果出现firmware not found或Microcode SW error,重装linux-modules-extra通常能解决。modprobe -r卸载再modprobe加载,不用重启就能验证。如果还不行,用sudo apt install --reinstall nvidia-driver-535回退驱动版本,有时候是驱动和内核版本不兼容导致的连锁反应。
4. CUDA 与 cuDNN 安装:runfile 参数、环境变量和验证脚本
4.1 CUDA 版本选择与 runfile 安装
CUDA 版本必须和驱动匹配,驱动 535 最高支持 CUDA 12.2,装 12.3 以上会报CUDA driver version is insufficient。去官网 archive 页面选对应版本,安装方式选 runfile,不要选 deb,deb 会连带升级驱动,容易把已经配好的驱动搞乱。
# 下载 CUDA 12.2 runfile wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run # 赋予执行权限 chmod +x cuda_12.2.0_535.54.03_linux.run # 运行安装,关键参数:不装驱动 sudo sh cuda_12.2.0_535.54.03_linux.run --toolkit --silent --override --no-opengl-libs--toolkit只装 CUDA 工具链,不碰驱动。--silent静默安装,省去交互。--override跳过编译器版本检查,Ubuntu 24.04 的 GCC 版本较新,不加这个可能被拦。--no-opengl-libs不装 OpenGL 库,避免和系统已有的 Mesa 冲突。安装完成后 CUDA 默认在/usr/local/cuda-12.2。
4.2 环境变量配置与 nvcc 验证
环境变量写进~/.bashrc,注意 PATH 和 LD_LIBRARY_PATH 的写法,用${VAR:+:${VAR}}这种形式可以避免重复追加。
# 编辑 bashrc nano ~/.bashrc # 在文件末尾添加 export PATH=/usr/local/cuda-12.2/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} # 生效 source ~/.bashrc # 验证 nvcc -V${PATH:+:${PATH}}的意思是:如果 PATH 已定义,就在前面加冒号再拼接,避免出现::这种空路径。nvcc -V输出 CUDA 版本号就说明工具链就位。如果提示command not found,先echo $PATH看路径有没有生效,再检查~/.bashrc是不是写到了错误的位置。
4.3 cuDNN 安装与 bandwidthTest 验证
cuDNN 从 8.x 开始用本地 deb 包安装,下载对应 CUDA 版本的包,安装后把 keyring 拷到系统目录,再 apt 安装。
# 安装本地 deb 包 sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.6.50_1.0-1_amd64.deb # 拷贝 keyring sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.6.50/cudnn-local-5E60450C-keyring.gpg /usr/share/keyrings/ # 更新并安装 sudo apt update sudo apt install -y libcudnn8 libcudnn8-dev libcudnn8-samples # 验证 cd /usr/local/cuda-12.2/extras/demo_suite/ ./bandwidthTest ./deviceQuerydpkg -i安装的是仓库配置包,不是 cuDNN 本体,装完必须apt update再装libcudnn8。bandwidthTest输出Result = PASS说明 CUDA 和 cuDNN 的通信正常。deviceQuery会列出显卡型号、显存、计算能力,Result = PASS表示设备查询通过。如果bandwidthTest报CUDA error: no CUDA-capable device is detected,回到驱动那步检查nvidia-smi是否正常。
5. Anaconda、虚拟环境与 IDE 配置:从 conda 命令到 PyTorch 认卡
5.1 Anaconda 安装与 conda 基础命令
Anaconda 安装包从官方 archive 拉,选 Linux x86_64 版本。安装时注意最后一步问是否conda init,选 yes,否则每次要手动 source。
# 下载并安装 wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bash Anaconda3-2024.02-1-Linux-x86_64.sh # 安装完成后生效 source ~/.bashrc # 验证 conda --version conda info --envsconda init会往~/.bashrc写一段初始化脚本,把 conda 的 base 环境加到 PATH。conda info --envs列出所有环境,带*的是当前激活的。如果conda命令找不到,手动执行~/anaconda3/bin/conda init bash再 source。
5.2 创建虚拟环境与 PyTorch 安装
虚拟环境隔离依赖,避免不同项目的 CUDA 版本打架。PyTorch 安装用官方 index,指定 cu121 版本。
# 创建环境 conda create --name pytorch python=3.10 -y # 激活 conda activate pytorch # 安装 PyTorch(CUDA 12.1 版本) pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu121 # 验证 GPU python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available())"--index-url指向 PyTorch 官方 wheel 源,cu121 对应 CUDA 12.1,和前面装的 CUDA 12.2 兼容。torch.cuda.is_available()输出True说明 PyTorch 认到了 GPU。如果输出False,先确认nvidia-smi正常,再检查 PyTorch 版本和 CUDA 版本是否匹配。
5.3 VS Code 与 Jupyter 配置
VS Code 用 deb 包安装,装完在扩展市场搜 Python 和 Jupyter。Jupyter 需要把虚拟环境注册成 kernel,否则 notebook 里选不到。
# 安装 VS Code sudo dpkg -i code_1.75.0-1675266613_amd64.deb # 安装 Jupyter 并注册 kernel conda activate pytorch pip install ipykernel ipython python -m ipykernel install --user --name pytorch --display-name "Python (pytorch)" # 启动 Jupyter jupyter notebookipykernel install把当前虚拟环境注册到 Jupyter 的 kernel 列表,--name是内部标识,--display-name是 notebook 里显示的名字。VS Code 里按Ctrl+Shift+P输入Python: Select Interpreter,选pytorch环境的 python 路径。PyCharm 专业版在 Ubuntu Software 里直接搜安装,配置解释器时指向~/anaconda3/envs/pytorch/bin/python。
6. 避坑与排查:驱动、CUDA、conda 三类高频翻车记录
6.1 nvidia-smi 报错「couldn't communicate with the NVIDIA driver」
现象:装完驱动重启,终端输入nvidia-smi提示无法和驱动通信。原因通常是 Secure Boot 拦截了未签名的内核模块,或者 DKMS 编译失败。解决:先mokutil --sb-state确认 Secure Boot 状态,开着就进 BIOS 关掉;再dkms status看 nvidia 模块状态,如果显示build: failed,执行sudo dkms autoinstall重编,缺头文件就补装linux-headers-$(uname -r)。
6.2 nvcc -V 找不到命令
现象:CUDA 装完,nvcc -V提示 command not found。原因一般是环境变量没写对,或者写进了错误的 shell 配置文件。解决:echo $PATH看有没有/usr/local/cuda-12.2/bin,没有就检查~/.bashrc里的 export 语句,确认没有拼写错误,然后source ~/.bashrc。如果用的是 zsh,要写到~/.zshrc。
6.3 PyTorch 的 cuda.is_available() 返回 False
现象:nvidia-smi正常,nvcc -V正常,但 PyTorch 认不到 GPU。原因通常是 PyTorch 装成了 CPU 版本,或者 CUDA 版本和 PyTorch 编译版本不匹配。解决:pip list | grep torch看版本号,如果带+cpu后缀就是装错了,卸载重装时加--index-url https://download.pytorch.org/whl/cu121。另外确认torch.version.cuda输出的版本和系统 CUDA 主版本一致。
6.4 conda 创建环境时 Solving environment 卡住
现象:conda create卡在 Solving environment 几分钟不动。原因是 conda 默认源在国外,元数据拉取慢。解决:换国内源,或者用mamba替代 conda。换源命令:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes6.5 装完驱动 WiFi 图标消失
现象:Nvidia 驱动装完重启,WiFi 图标不见了,rfkill list显示无线被 hard block。原因是驱动安装过程重编内核模块,iwlwifi固件加载失败。解决:sudo apt install --reinstall linux-modules-extra-$(uname -r)重装内核模块,再sudo modprobe -r iwlwifi && sudo modprobe iwlwifi重新加载。如果还不行,sudo apt install --reinstall nvidia-driver-535回退驱动版本,重启后再试。
7. 版本锁定与快照:让这套环境半年后还能一键还原
环境搭好只是开始,真正省心的是把它固化下来。我现在的习惯是装完所有东西后做两件事:导出 conda 环境清单,用 Timeshift 给系统盘打快照。conda 清单记录 Python 包版本,Timeshift 记录系统级配置,两者配合基本能覆盖 90% 的还原场景。
# 导出 conda 环境 conda activate pytorch conda env export > pytorch_env.yaml # 恢复时用 conda env create -f pytorch_env.yaml # 安装 Timeshift sudo apt install -y timeshift # 命令行创建快照(需要先配置好快照存储位置) sudo timeshift --create --comments "cuda-env-ready" --tags Dconda env export会把所有包和版本号写进 yaml,包括 pip 安装的包。恢复时conda env create -f按清单重建,版本完全一致。Timeshift 的--tags D表示按需快照,--comments写备注方便识别。快照存到独立分区或外置硬盘,别放系统盘,否则系统挂了快照也一起没。
还有一个细节:Nvidia 驱动和 CUDA 的版本组合建议记在备忘录里。我遇到过驱动自动更新后 CUDA 跑不起来的情况,apt-mark hold可以锁定驱动版本不被升级:
# 锁定驱动版本 sudo apt-mark hold nvidia-driver-535 # 查看锁定状态 apt-mark showhold # 需要升级时解锁 sudo apt-mark unhold nvidia-driver-535apt-mark hold让 apt 在upgrade时跳过指定包,避免驱动被意外升级导致 CUDA 不兼容。apt-mark showhold列出所有锁定的包,定期检查一下,别锁了忘了。从那以后我每次装完环境都先apt-mark hold驱动,再导出 conda 清单,最后打一个 Timeshift 快照,三件事做完才敢开始跑训练。希望帮到你。
本文还有配套的精品资源,点击获取