0. 前言
今天本来只是想给 3090 工作站配个 Linux 跑 PointNet++,刚好家里有个没有使用的ROS2GO系统盘,结果一路从 ROS2GO 外置盘 → NVIDIA 驱动 DKMS 编译失败 → U 盘分区表损坏 → 发现 WSL2 → conda 商业许可拦截,连环翻车。这篇文章把今天踩的所有坑(包括没填上的)和背后的原理记下来,方便以后复盘。
1. 坑一:XanMod 内核与 NVIDIA DKMS 的生死局
现象
在 ROS2GO(Ubuntu 20.04 + XanMod 6.6.7 内核)上执行:
sudo apt install -y nvidia-driver-550 nvidia-dkms-550nvidia-dkms-550 编译内核模块时直接报错:
ERROR (dkms apport): kernel package linux-headers-6.6.7-x64v1-xanmod1 is not supportedError! Bad return status for module build on kernel: 6.6.7-x64v1-xanmod1根因:DKMS 的版本白名单机制
DKMS(Dynamic Kernel Module Support) 是 Ubuntu 用来在内核升级时自动重编第三方驱动(如 NVIDIA)的机制。NVIDIA 的 DKMS 包并不是”来者不拒”地编译,它内置了一个内核版本检查逻辑。当检测到内核版本字符串里出现 xanmod 这种非官方标识时,安装脚本会直接判定为”不受支持的内核”,拒绝继续编译。
为什么 ROS2GO 要预装 XanMod? XanMod 是一个面向实时场景的第三方内核,ROS 机器人控制需要低延迟调度。但深度学习训练是吞吐型负载,不需要实时内核,反而引入了驱动兼容性问题。
尝试过的解法
| 方案 | 结果 | 原因 |
|---|---|---|
| 加 NVIDIA PPA | ❌ 550 包名在 Ubuntu 20.04 focal 的 PPA 里不存在 | 20.04 太老,NVIDIA 没给这个版本打包 550 |
| 切回 Ubuntu 5.15 官方内核 | ⚠️ 无线网卡丢失 | 5.15 内核太老,没有新无线芯片(如 AX211/RTL8852BE)的固件 |
| runfile 手动安装 | ⏸️ 未执行完,U 盘已损坏 | 需要进 TTY 关图形界面,过程被中断 |
教训
不要在 USB 外置系统盘上折腾 DKMS/runfile 这种需要稳定内核环境的操作。 外置盘的供电和 IO 稳定性都不如内置 SSD,一旦掉电就是灾难。
2. 坑二:强制关机导致 U 盘分区表损坏(未解决)
现象
sudo reboot 卡住超过 5 分钟,长按电源键强制关机。再开机后:
- BIOS 启动菜单找不到 U 盘
- Windows 磁盘管理显示 “磁盘 3:未知,没有初始化”
- 之前能看到的 EFI/FAT32 “小分区”也消失了
根因:USB 外置盘的掉电保护缺陷
USB 外置盘的主控为了提升写入性能,通常会把数据先写进缓存(DRAM 或 SLC Cache),再异步刷回闪存。强制断电时,如果缓存里正好有 GPT 分区表头或 FAT32 文件分配表的更新数据没来得及落盘,分区表就会损坏。
为什么内置硬盘不容易这样? SATA/NVMe 有完善的掉电保护(PLP, Power Loss Protection)机制,且文件系统日志(ext4 journal/NTFS log)能在重启后自修复。USB 大容量存储协议(BOT/UASP)没有等价的原子性保证。
抢救方案(待执行)
- DiskGenius 搜索已丢失分区:扫描整个磁盘,找回 ext4 根分区和 EFI 分区,保留后保存分区表。
- 联系 ROS2GO 卖家:看是否提供系统恢复镜像。
- 最坏情况:重新烧录 Ubuntu ISO,但会丢失预装 ROS 环境。
3. 坑三:WSL2 里发现”两个 Ubuntu”和主管账户
现象
Windows 资源管理器里已经有 Linux → Ubuntu-22.04。执行 wsl --list --verbose 发现:
NAME STATE VERSION* Ubuntu-22.04 Stopped 2 Ubuntu Running 2打开 Ubuntu-22.04 后,发现默认用户是 peterlu(主管的账户),环境里可能预装了 ROS 和 conda。
根因
微软商店里 “Ubuntu”(默认版,通常是 20.04)和 “Ubuntu 22.04 LTS” 是两个独立的 WSL 应用,互不影响。这台电脑之前被主管用过,他在 22.04 里初始化了自己的账户。
为什么建议不共用别人的 WSL 实例
别人的家目录里可能有:
- 未知的
.bashrc环境变量和 alias - 预装的 conda 环境(版本可能很老)
- SSH 密钥、Git 配置、ROS 工作空间 这些都会成为不可复现的隐性依赖,排查问题时会浪费大量时间。
解法
切回自己的 Ubuntu(20.04)实例:
wsl --terminate Ubuntu-22.04wsl --set-default Ubuntuwsl -d Ubuntu在自己的干净环境里从头配置。
4. 坑四:Anaconda 商业许可 ToS 拦截
现象
首次执行 conda create -n pointnet python=3.10 -y 时报错:
CondaToSNonInteractiveError: Terms of Service have not been accepted...根因
2024 年底,Anaconda 更新了商业渠道服务条款。pkgs/main 和 pkgs/r 这两个默认渠道不再默认可用,需要用户显式点击同意。
解法
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/mainconda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r5. 坑五:conda init 后仍无法 activate
现象
执行 conda init 后,终端输出:
modified /home/hw/.bashrc==> For changes to take effect, close and re-open your current shell. <==但紧接着运行 conda activate pointnet,仍然报错:
CondaError: Run 'conda init' before 'conda activate'根因:Shell 配置文件的加载机制
conda init 的本质是修改 ~/.bashrc 文件,向其中注入一段 conda 的 shell hook 脚本(用于自动激活 base 环境、解析 conda activate 命令等)。
但当前正在运行的 bash 进程,是在 conda init 之前启动的。它已经把旧的 ~/.bashrc 加载进了内存,不会自动监听磁盘上配置文件的变更。因此,虽然磁盘上的 .bashrc 已经更新了,当前终端”脑子里”还是旧的配置。
为什么 source ~/.bashrc 能解决
source(或它的等价写法 .)命令的作用是:在当前 shell 进程中重新读取并执行指定脚本,相当于对运行中的终端做一次”热重载”(hot reload)。
source ~/.bashrc执行后,当前终端立刻拥有了 conda hook 的能力,conda activate 就能正常解析了。
等价的另一种做法
直接关闭终端窗口,重新打开。新启动的 bash 进程会从头读取最新的 ~/.bashrc,效果一样,但比 source 慢(需要重新开窗口、cd 目录)。
6. 坑六:Linux 用户名大小写规范
现象
WSL2 Ubuntu 首次初始化时输入用户名 HW,报错:
err: Please enter a username matching the regular expression configured via NAME_REGEX...根因:POSIX 用户名规范
Linux 的用户名必须遵循严格的正则规则:只能包含小写字母(a-z)、数字(0-9)、下划线(_)和连字符(-),且不能以数字开头。大写字母不在允许范围内。
这是为了兼容早期 Unix 系统的用户数据库(/etc/passwd)和大量依赖小写用户名的 shell 脚本、路径解析逻辑。
解法
改用全小写用户名,例如 hw 或 tianbot。
7. 坑七:WSL2 的 IO 性能陷阱
现象/顾虑
担心 WSL2 跑深度学习训练时文件 IO 慢,拖垮 3090。
根因:9P 协议跨系统挂载的开销
WSL2 访问 Windows 盘符(如 /mnt/c/Users/HW)时,底层走的是 9P(Plan 9 Filesystem Protocol) 网络文件协议。虽然它在本地内存中传输,但仍需经过协议封装、权限转换、路径映射等开销,大文件随机读写性能比原生 ext4 差 3-10 倍。
为什么放在 /home/ 下就没事
/home/hw/ 位于 WSL2 自己的 VHD 虚拟磁盘 内部,文件系统是原生 ext4。这部分 IO 不经过 9P 协议,性能接近裸机 Linux。
建议
- 代码仓库 →
~/projects/ - conda 环境 →
~/miniconda3/ - 数据集 →
~/data/或~/projects/xxx/data/ - 绝不在
/mnt/c/或/mnt/d/下执行频繁的 git 操作、conda 安装或模型训练。
8. 坑八:WSL2 没有图形界面
现象
打开 WSL2 Ubuntu 只有黑底白字的终端,没有 Ubuntu 桌面。
解释
WSL2 的设计初衷是命令行开发环境,默认不启动图形会话。但这不影响深度学习,因为模型训练、日志监控、代码编辑全部可以在终端 + VS Code(Windows 侧)完成。
如果需要 GUI(比如用 matplotlib 弹窗或 CloudCompare),WSL2 已内置 X11 转发,Windows 侧会自动处理窗口渲染。
9. 总结与建议
| 维度 | 短期方案(现在) | 长期方案 |
|---|---|---|
| 系统环境 | WSL2 + Ubuntu 20.04 | 修复/重做外置 Ubuntu 盘,或加内置 SSD 装原生双系统 |
| NVIDIA 驱动 | 继承 Windows 宿主驱动(WSL CUDA) | 原生 Ubuntu 下用官方 DKMS 或 runfile |
| 代码/数据存放 | WSL2 的 /home/hw/(ext4) | 同上 |
| ROS 需求 | 暂不涉及 | 如需 ROS,再考虑 XanMod 或官方 22.04 实时内核 |
核心教训
- USB 外置系统盘不适合折腾内核级操作(DKMS、驱动编译、频繁重启),掉电即翻车。
- WSL2 是应急神器:当物理 Linux 环境崩了,它能让你在 5 分钟内恢复 CUDA 开发环境,且 3090 计算性能无损。
- conda 的坑已经从技术问题变成了法律问题:ToS 拦截、商业渠道限制,以后装环境要习惯先
conda tos accept。 source ~/.bashrc不是玄学:它是 shell 配置热重载的标准操作,理解这个能避免很多”改了配置为什么不生效”的困惑。
当前状态:WSL2 Ubuntu 已就绪,conda + PyTorch 环境安装中,U 盘修复待明日处理。
部分信息可能已经过时









