mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2352 字
7 分钟
ROS2GO 翻车实录:从U盘DKMS地狱到WSL2求生
2026-04-28

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-550

nvidia-dkms-550 编译内核模块时直接报错:

ERROR (dkms apport): kernel package linux-headers-6.6.7-x64v1-xanmod1 is not supported
Error! 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)没有等价的原子性保证。

抢救方案(待执行)#

  1. DiskGenius 搜索已丢失分区:扫描整个磁盘,找回 ext4 根分区和 EFI 分区,保留后保存分区表。
  2. 联系 ROS2GO 卖家:看是否提供系统恢复镜像。
  3. 最坏情况:重新烧录 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)实例:

Terminal window
wsl --terminate Ubuntu-22.04
wsl --set-default Ubuntu
wsl -d Ubuntu

在自己的干净环境里从头配置。


4. 坑四:Anaconda 商业许可 ToS 拦截#

现象#

首次执行 conda create -n pointnet python=3.10 -y 时报错:

CondaToSNonInteractiveError: Terms of Service have not been accepted...

根因#

2024 年底,Anaconda 更新了商业渠道服务条款pkgs/mainpkgs/r 这两个默认渠道不再默认可用,需要用户显式点击同意。

解法#

conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

5. 坑五: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 脚本、路径解析逻辑。

解法#

改用全小写用户名,例如 hwtianbot


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 实时内核

核心教训#

  1. USB 外置系统盘不适合折腾内核级操作(DKMS、驱动编译、频繁重启),掉电即翻车。
  2. WSL2 是应急神器:当物理 Linux 环境崩了,它能让你在 5 分钟内恢复 CUDA 开发环境,且 3090 计算性能无损。
  3. conda 的坑已经从技术问题变成了法律问题:ToS 拦截、商业渠道限制,以后装环境要习惯先 conda tos accept
  4. source ~/.bashrc 不是玄学:它是 shell 配置热重载的标准操作,理解这个能避免很多”改了配置为什么不生效”的困惑。

当前状态:WSL2 Ubuntu 已就绪,conda + PyTorch 环境安装中,U 盘修复待明日处理。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

ROS2GO 翻车实录:从U盘DKMS地狱到WSL2求生
https://fredsblog-2dc.pages.dev/posts/trap-linux-ros2go-configure/
作者
Fredzhe
发布于
2026-04-28
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时