
重装系统这件事装的过程其实是最轻松的真正折磨人的是装完之后那一长串环境配置。Ubuntu 20.04 虽然已经不是最新的 LTS 版本但它至今仍然是很多实验室、公司和高校课程锁定的主力系统——ROS Noetic 只支持到 20.04ORB-SLAM3 的大量教程也是在 20.04 上跑通的很多工业视觉、机器人项目的老代码更是绑死在 Glibc 2.31 上换到 22.04 反而要重新折腾兼容性。所以重装 Ubuntu 20.04 基本环境配置这件事不是怀旧而是实打实的生产需求。这篇内容我按一条完整的配置链路来写从装完系统第一次开机开始先把软件源、显卡驱动、音频输出、主副屏这些底层环境铺好再往上装 VSCode、Node.js、Java、Maven、Python 这一套通用开发环境最后落到 ROS Noetic、ORB-SLAM3、Blender 这些专业方向的东西。不管你是刚重装完系统的还是准备装双系统、虚拟机装 Ubuntu 的都可以按这个顺序照着抄中间我会把踩过的坑和参数选择的理由都写清楚。1. 重装 Ubuntu 20.04 前的整体规划与配置顺序1.1 为什么 20.04 至今还是刚需版本先说说版本选择这件事。很多人重装系统的时候会纠结既然要重装为什么不直接上 22.04 或者 24.04我的建议是看你的项目决定而不是看哪个版本新。Ubuntu 20.04 代号 Focal Fossa内核是 5.4 系列Glibc 版本 2.31Python 默认 3.8GCC 默认 9.4。这几个数字看着不起眼但决定了大量老项目能不能直接编译过。比如 ROS Noetic 是官方明确只支持 20.04 的最后一个 ROS1 版本ROS2 虽然新但很多实验室的机械臂、移动底盘驱动包压根没做 ROS2 的移植。ORB-SLAM3 官方仓库的编译脚本和 Issue 讨论也大量基于 20.04你在 22.04 上遇到链接错误的概率明显更高。再说显卡驱动这一块。20.04 对 NVIDIA 535 系列驱动的支持是成熟的apt install nvidia-driver-535这条命令在很多机器上就是一把过装完nvidia-smi直接能看到显卡型号和 CUDA 版本。而更新的系统有时候会遇到内核版本和驱动模块不匹配的问题。所以如果你手上有明确要跑的项目尤其是涉及机器人、SLAM、深度学习推理的老老实实用 20.04 反而是最省时间的路径。别为了用新版本给自己找麻烦配置环境的成本远高于装系统的成本。还有一类情况是课程要求。很多高校的操作系统、嵌入式、机器人课程实验指导书就是按 20.04 写的助教也只在这个版本上验证过。这种情况下你换版本出问题了没人能帮你排查。所以选版本这一步我的原则很简单先看项目依赖再看社区资料密度最后才考虑新旧。1.2 配置顺序背后的依赖链逻辑很多人配环境是一边想一边装装到哪算哪结果就是反复重装、反复冲突。我推荐一个固定的顺序这个顺序不是随便排的背后是依赖链底层的东西会影响上层上层出问题的时候不好回退。第一步一定是网络和软件源。理由很直白后面所有东西都要靠 apt 和 pip 下载源慢或者源不对后面每一步都是煎熬。第二步是显卡驱动因为驱动装完要重启重启会影响你后面所有未保存的配置工作所以尽早做。第三步是音频、显示、输入法这类桌面环境的东西这些不影响编译但很影响你的心情和效率早点弄好早点顺手。第四步是通用开发工具链编辑器、运行时、包管理器。第五步才是专业方向环境比如 ROS、SLAM、Blender 这些大件。这么排的另一个好处是隔离问题。假设你装完 ROS 之后发现系统崩了如果前面几步都做过快照或者备份你可以快速回滚到通用环境已就绪的状态不用从头再来。我见过太多人一口气装完所有东西才测试结果出了问题根本不知道是哪一步引入的。分阶段验证每完成一个阶段就跑一次基本测试这是省时间而不是浪费时间。提示每完成一个阶段建议用timeshift做一次系统快照或者至少把关键的配置文件sources.list、/etc/profile、~/.bashrc、~/.condarc备份到 U 盘或者云盘。后面出问题能救命。1.3 双系统与重装前的分区、加密盘准备如果你是要装 Windows Ubuntu 双系统或者刚从 Windows 重装完准备加装 Ubuntu这一步必须提前做否则后面分区的时候会踩大坑。最常见的一个坑是 BitLocker现在很多品牌笔记本惠普、联想、戴尔都有出厂就默认开启了设备加密你在 Windows 的磁盘管理里能看到 C 盘或者 D 盘图标上带一把锁。这种情况下如果你直接进 Ubuntu 安装程序去压缩分区要么看不到盘要么操作完 Windows 进不去系统要么数据盘在 Ubuntu 里无法挂载。正确做法是先回 Windows在设置-隐私和安全性-设备加密里把加密关掉等解密进度条走完可能要好几个小时取决于盘的大小再做后续操作。第二个必须处理的是 Windows 的快速启动和休眠。Windows 10/11 默认开启了快速启动关机其实是休眠NTFS 分区处于未完全卸载状态。Ubuntu 挂载这种分区会报错甚至可能损坏文件系统。所以要在 Windows 的电源选项里把启用快速启动取消勾选并且执行一次完整的重启而不是关机。公司电脑如果开了 BitLocker 还有组策略限制那就别硬来老老实实用虚拟机。分区方面Ubuntu 20.04 我一般这样分EFI 分区如果 Windows 已经有一个直接复用不用新建根分区/给 80 到 120GB装 ROS、CUDA、各种 SDK 之后很容易吃满 60GB/home单独分给剩下的空间这样以后重装系统只格式化/个人数据全保留swap 分区在内存 16GB 以上的机器上给 8GB 意思一下就行或者干脆用 swapfile。分区的时候一定要看清楚设备名/dev/nvme0n1和/dev/sda搞混了就是灾难。装之前用lsblk在 Live USB 环境里确认一遍磁盘布局这个习惯能救你一次。2. 系统底层环境软件源、显卡驱动与音频显示2.1 换源三分钟解决 apt 更新慢的老问题装完系统第一次sudo apt update如果没换源那个速度能让你怀疑人生。Ubuntu 20.04 默认源是 archive.ubuntu.com 和 security.ubuntu.com国内访问速度很不稳定。换源的本质就是把这些域名替换成国内的软件源镜像比如清华 TUNA、中科大 USTC、阿里云、华为云内容完全一致只是服务器在国内。先备份这是铁律改坏了还能恢复sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak用 sed 批量替换注意要同时处理 archive 和 security 两个域名还要把http换成https避免某些网络环境下的重定向问题sudo sed -i s|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo sed -i s|http://security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo sed -i s|http://cn.archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list改完执行sudo apt update看输出里是不是已经指向清华的地址了。这里有个细节很多人忽略20.04 的 sources.list 里有 focal、focal-updates、focal-backports、focal-security 四个部分如果你只想保留主源和更新源可以把 backports 注释掉能减少一部分索引下载量日常使用完全够。另外提一句apt的常用清理操作重装系统后养成习惯sudo apt autoremove清掉不再需要的依赖包sudo apt clean清掉下载缓存。这两个命令在小容量硬盘的机器上能省出好几个 G。如果你用中科大或者华为云源访问速度可能比清华还快具体哪个快你可以在浏览器里 ping 一下镜像域名或者直接用netselect-apt测。注意换源之后如果遇到NO_PUBKEY或者 GPG 签名错误一般是镜像站同步延迟导致的。等十分钟再apt update基本就好了不要急着去网上找什么野路子删 keyring那个操作风险更大。2.2 显卡驱动安装apt install nvidia-driver-535 全流程显卡驱动几乎是重装 Ubuntu 之后最容易出问题的一步尤其是笔记本的双显卡Intel 核显 NVIDIA 独显场景。先说结论能用 apt 装就别用官网的 .run 包。因为 apt 方式会和内核模块管理、DKMS 自动挂钩系统内核升级之后驱动会自动重新编译.run 包每次内核更新都要手动重装非常麻烦。第一步先看看系统识别到的是什么设备推荐装哪个版本ubuntu-drivers devices输出里会列出driver : nvidia-driver-535 - third-party free recommended这样的信息带 recommended 的那个就是官方认为最稳的版本。如果你的机器上显示推荐 535那直接装就行sudo apt update sudo apt install nvidia-driver-535安装过程中如果弹出 Secure Boot 相关的对话框会让你设置一个 MOK 密码。如果你的 BIOS 里开了 Secure Boot这里必须设置密码重启后会进入蓝屏的 MOK 管理界面选择 Enroll MOK输入刚才的密码否则驱动模块因为没签名加载不了nvidia-smi会报找不到设备。如果你嫌麻烦也可以进 BIOS 把 Secure Boot 关掉这是最省事的选择但会略微降低系统的启动安全性你自己权衡。装完必须重启sudo reboot重启之后验证nvidia-smi正常情况下会打印一个表格包含驱动版本、CUDA Version、显卡型号、显存使用情况、当前运行的进程。如果这条命令报错先别慌检查三件事一是 BIOS 里 Secure Boot 状态和 MOK 是否已经注册二是lsmod | grep nvidia看看模块有没有加载三是dmesg | grep -i nvidia看内核日志里的具体报错。最常见的错误是 NVRM: The NVIDIA GPU ... is not supported by the NVIDIA driver这说明驱动版本和显卡代际不匹配老卡要装 470 或者 390新卡要装 535 甚至更高。笔记本双显卡还有一个prime-select的问题。装完驱动后可以这样切换prime-select query # 查看当前模式 sudo prime-select on-demand # 按需切换省电 sudo prime-select nvidia # 全程使用独显性能优先on-demand 模式是最实用的平时用核显出图跑 CUDA 程序的时候自动切独显功耗和性能兼顾。切换完要注销重新登录才生效。我实测下来跑深度学习训练的时候用 nvidia 模式最稳on-demand 偶尔会遇到显存分配异常。2.3 重装后 3.5mm 音箱没声音音频设备切换排查这个问题的出现频率高得离谱。重装系统之后插着的 3.5mm 音箱或者耳机没声音但 USB 头戴式耳机是好的。原因基本不是驱动坏了而是 PulseAudio 的默认输出设备选错了系统把音频送到了 HDMI 或者某个未连接的输出口。先看系统识别到了哪些输出设备pactl list short sinks输出里每一行是一个 sink比如alsa_output.pci-0000_00_1f.3.analog-stereo模拟输出就是 3.5mm 口、alsa_output.pci-0000_01_00.1.hdmi-stereoHDMI 音频。如果默认 sink 指向了 HDMI那你 3.5mm 自然没声音。手动切换pactl set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo写进配置文件更稳妥编辑/etc/pulse/default.pa在末尾加上set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo然后pulseaudio -k重启音频服务。图形化排查我强烈推荐装pavucontrol它比系统自带的设置面板信息量大得多sudo apt install pavucontrol打开之后切到输出设备标签页能看到每个 sink 的音量条和端口选择。模拟输出设备下面通常有Line Out和Headphones两个端口选项插 3.5mm 音箱要选 Line Out。还有一个坑有些机器的前面板和后面板是分开的你在机箱前面板插耳机但 pavucontrol 里选的是后面板的端口那也不响。另外alsamixer这个工具也要会用它是更底层的混音器alsamixer按 F6 选声卡检查有没有通道被静音显示 MM 就是静音按 M 键取消。我遇到过一次PulseAudio 层面一切正常但 alsamixer 里 Auto-Mute Mode 开启了插上 3.5mm 之后自动把主板扬声器静音了同时又没正确路由到耳机口。把这个选项设成 Disabled 就好了。这种问题没有任何文档会写只能靠自己一层层查。2.4 主副屏设置xrandr 与显示管理器配置外接显示器之后发现分辨率不对、副屏不亮、鼠标只能在主屏移动这些都是配置没做。命令行工具xrandr是最直接的xrandr输出里带connected的是已连接的显示器比如eDP-1笔记本内屏、HDMI-1、DP-1。设置主副屏xrandr --output eDP-1 --primary --auto --pos 0x0 \ --output HDMI-1 --auto --right-of eDP-1--primary指定主屏--right-of表示副屏放在主屏右边--auto用显示器的最佳分辨率。如果你想让两块屏的顶边对齐用--pos手动指定绝对坐标如果两屏分辨率不一样Y 坐标要算一下偏移量比如主屏 1920x1080副屏 2560x1440想让它们垂直居中副屏的 Y 就是(1080-1440)/2 -180写法是--pos 1920x-180。这个计算过程很多人不知道结果就是副屏要么顶到天花板要么沉到底。上面这条命令是临时的重启就失效。要持久化20.04 用的是 GNOME最简单的办法是把命令写进~/.profile或者用 arandr 这个图形工具生成脚本sudo apt install arandrarandr 里拖拽排列保存成 shell 脚本然后加到开机自启里。用 NVIDIA 专有驱动的话还有nvidia-settings这个工具它的X Server Display Configuration页面配置完点Save to X Configuration File效果更稳定。我个人的经验是如果用的是 NVIDIA 双显卡优先用 nvidia-settings 保存到 xorg.conf如果是纯核显或者 AMD 卡用 arandr 生成的脚本就够了。3. 通用开发环境编辑器、运行时与包管理3.1 VSCode 安装与 C/C、Python 环境配置VSCode 在 Ubuntu 20.04 上的安装有两种方式snap 和 deb 包。snap 版本启动稍慢而且和某些插件的路径解析有点别扭我更推荐官方 deb 包wget -O code.deb https://code.visualstudio.com/sha/download?buildstableoslinux-deb-x64 sudo apt install ./code.deb装完在终端敲code .就能在当前目录打开。接下来是 C/C 环境这是新手最容易卡住的地方。核心是三份配置文件tasks.json负责编译launch.json负责调试c_cpp_properties.json负责代码提示。它们放在项目根目录的.vscode文件夹里。tasks.json的典型内容{ version: 2.0.0, tasks: [ { label: build, type: shell, command: g, args: [-g, ${file}, -o, ${fileDirname}/${fileBasenameNoExtension}], group: { kind: build, isDefault: true } } ] }launch.json里 program 字段要指向编译产物的路径miDebuggerPath指向/usr/bin/gdb。这里有个常见的坑系统默认可能没装 gdb报错 Unable to start debugging 的时候先sudo apt install gdb。另一个坑是 preLaunchTask 的名字必须和 tasks.json 里的 label 完全一致大小写都不能错否则会出现找不到任务的错误。Python 环境配置相对简单装扩展的时候注意区分官方 Python 扩展和 Pylance两个都装上。然后在命令面板里选解释器Python: Select Interpreter能自动识别 conda 环境和 venv。如果你是做数据分析或者深度学习建议在项目里建一个独立的虚拟环境别用系统 Python 直接装包因为 Ubuntu 系统里有大量工具依赖系统 Python你pip install搞乱了版本可能导致 apt 相关的功能异常这个教训我是真金白银换来的。3.2 Node.js 与 Vue3 环境搭建Ubuntu 20.04 的 apt 源里 Node.js 是 10.x太老了跑 Vue3 和 Vite 会各种报错。正确的做法是用 nvm 管理 Node 版本。nvm 的安装脚本托管在代码托管平台上国内直接拉取可能比较慢如果超时就换个时间段或者用镜像站。安装完别忘了在~/.bashrc里确认有这几行export NVM_DIR$HOME/.nvm [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh然后装 LTS 版本nvm install 18 nvm use 18 nvm alias default 18版本选择上Node 18 是 Vue3 生态里兼容性最好的 LTSNode 20 也可以但有些老的构建工具链会报 OpenSSL 相关的错误。npm 的源也要换不然装依赖能等到睡着npm config set registry https://registry.npmmirror.comVue3 项目创建现在官方推荐 Vite不再是 vue-clinpm create vuelatest按提示勾选 TypeScript、Router、Pinia 这些选项然后npm install、npm run dev。如果遇到node: --openssl-legacy-provider is not allowed这类错误说明你用的是 webpack 4 时代的老项目需要在 npm script 里加环境变量或者干脆升级到 Vite。这里我踩过一个大坑在一个老项目上折腾了半天 OpenSSL最后发现升级构建工具只花了二十分钟所以遇到老工具链问题的时候先评估一下别一头扎进兼容性泥潭。3.3 Java、Maven 环境配置Java 项目在 Ubuntu 上主要注意版本和 JAVA_HOME。20.04 的源里可以装 openjdk-8、11、17装哪个看项目要求。多版本共存用update-alternatives管理sudo apt install openjdk-11-jdk sudo update-alternatives --config java选完之后java -version确认。然后配置 JAVA_HOME这步很多人漏掉导致 Maven 或者 Gradle 报找不到 JDK。编辑/etc/profile末尾加上export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile生效。注意 JAVA_HOME 的路径要用update-alternatives输出里给出的实际路径不同小版本的目录名可能不一样直接抄网上的有时候是错的。验证方式echo $JAVA_HOME后跟着ls $JAVA_HOME/bin/javac能列出来才是对的。Maven 直接用 apt 装sudo apt install maven装完必须改 settings.xml不然拉依赖能拉到你放弃。文件位置在/etc/maven/settings.xml或者~/.m2/settings.xml在mirrors节点里加上国内镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf namealiyun maven/name urlhttps://maven.aliyun.com/repository/public/url /mirrormirrorOf*/mirrorOf表示拦截所有仓库请求这样中央仓库、插件仓库都会走镜像。有个细节是~/.m2/settings.xml的优先级高于全局配置团队协作的时候建议用全局配置统一环境个人的特殊需求再写到用户级配置里覆盖。3.4 Anaconda 与深度学习环境PyTorch、YOLOv8做深度学习的话Anaconda 或者 Miniconda 几乎是必装的。Miniconda 更轻量我一般推荐它。下载安装脚本后执行bash Miniconda3-latest-Linux-x86_64.sh一路回车加 yes最后会问你要不要conda init选 yes。重开终端后conda --version能看到版本就成功了。然后换 conda 源这是提速的关键。编辑~/.condarcchannels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpip 的源也一起换了编辑~/.pip/pip.conf或者~/.config/pip/pip.conf。创建环境的时候指定 Python 版本conda create -n dl python3.8 conda activate dlPython 3.8 是 20.04 上兼容性最好的选择很多老的 CUDA 扩展和 PyTorch 版本在 3.9 以上会有问题。装 PyTorch 的时候要先去官网查清楚 CUDA 版本对应的命令。假设你显卡驱动装的是 535那支持的 CUDA 最高到 12.x但如果你想兼容性好一点装 CUDA 11.8 的 PyTorch 版本pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118装完必须验证python -c import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))输出True和显卡型号才算成功。如果 CUDA 不可用先检查驱动再检查 conda 环境里是不是装了 CPU 版本的包卸载重装。YOLOv8 就简单了pip install ultralytics它会自动带上一堆依赖。跑推理的时候注意device0参数不指定的话默认用 CPU速度差几十倍。这里提一个我踩过的坑conda 环境里同时用 pip 和 conda 装包很容易出现依赖冲突尤其是 numpy、protobuf 这类被广泛依赖的库。我的原则是能 pip 就 pipconda 只用来管理环境本身和那些 pip 装不了的包比如自带编译好的 CUDA runtime 的包。4. 专业方向环境ROS、ORB-SLAM3 与图形工具4.1 ROS Noetic 安装与 rosdep 卡顿解决ROS Noetic 是 ROS1 的最后一个版本官方只支持 Ubuntu 20.04这也是很多人死守 20.04 的核心原因。安装流程分三步配置源、装包、初始化。配置源的时候官方源在国内速度一般可以用清华的镜像替换sudo sh -c echo deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list然后加密钥、更新、装完整版sudo apt update sudo apt install ros-noetic-desktop-full装完整版是因为里面包含了 rviz、gazebo、各种仿真插件单独装会有一堆依赖问题。装完配置环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc接下来是让无数人卡住的一步sudo rosdep init和rosdep update。这两条命令会去访问境外的代码托管地址在国内网络环境下经常超时失败。这里我推荐用国内社区改造的 rosdepc 工具它是把 rosdep 的索引源换到了国内镜像效果很稳sudo pip install rosdepc sudo rosdepc init rosdepc update用 rosdepc 替代 rosdep 之后rosdep install --from-paths src --ignore-src -r -y这类命令也相应替换成rosdepc install。实测下来在实验室网络里基本一次过省掉了手动改 hosts 的各种折腾。验证安装roscore另开一个终端rosrun turtlesim turtlesim_node小乌龟出来了就说明环境没问题。如果 roscore 报端口被占用检查是不是已经有别的 roscore 在跑pkill -9 roscore和pkill -9 roslaunch清一下。4.2 ORB-SLAM3 部署的依赖链ORB-SLAM3 是个典型的依赖地狱项目装它之前要有心理准备。它的依赖包括Pangolin可视化、OpenCV图像处理、Eigen3矩阵运算、DBoW2 和 g2o自带在源码里、以及 C11 以上的编译器。Pangolin 要先装依赖sudo apt install libgl1-mesa-dev libglew-dev cmake libpython2.7-dev然后从源码编译 Pangolin。这里有个版本陷阱ORB-SLAM3 对 Pangolin 的版本比较敏感新版的 Pangolin 改了 API编译 ORB-SLAM3 会报错。建议用 v0.6 或者 v0.8 的 tag。编译流程是标准的 cmake 三连mkdir build cd build cmake .. make -j4 sudo make installOpenCV 的建议是装 4.2 或者 4.4太新的版本4.8会因为有 API 改动导致 ORB-SLAM3 报错。如果你系统里已经有多个 OpenCV 版本编译 ORB-SLAM3 的时候要手动指定路径cmake -DOpenCV_DIR/usr/local/opencv-4.4/lib/cmake/opencv4 ..Eigen3 相对省心sudo apt install libeigen3-dev就行。真正麻烦的是编译阶段的报错最常见的几个undefined reference to DBoW2::...通常是 DBoW2 没编译成功去 Thirdparty 目录下单独编译error: usleep was not declared是缺unistd.h头文件手动加上就行和 C 标准相关的报错检查 CMakeLists 里是不是 C11改成 C14 有时候能解决。编译成功后还需要下载数据集或者用自己的相机标定参数。单目模式用 EuRoC 数据集测试./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml /path/to/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt第一次跑会加载词袋文件 ORBvoc.txt这个文件有一百多兆加载要一两分钟别以为卡死了。跑通之后轨迹窗口和地图窗口会弹出来。这里提醒一句ORB-SLAM3 对内存要求不低跑大型数据集建议 16GB 以上内存不然会频繁 swap帧率掉得很难看。4.3 Blender 等图形软件与常见外设处理Blender 在 Ubuntu 20.04 上装起来其实很简单官网下载 tar.xz 压缩包解压就能用tar -xf blender-3.x-linux-x64.tar.xz cd blender-3.x-linux-x64 ./blender想加到应用菜单里创建一个 desktop 文件放到~/.local/share/applications/就行。Blender 依赖显卡做渲染装好 NVIDIA 驱动之后在偏好设置里把渲染设备切成 CUDA 或者 OptiX渲染速度能提升好几倍。如果启动时报libXxf86vm.so.1之类的库缺失sudo apt install libxxf86vm1补齐即可这类库依赖问题在老系统上比较常见。外设方面重装系统之后很多人会遇到的另一个问题USB 头戴式耳机和 3.5mm 音箱同时插着的时候声音去了耳机但你想让音箱出声。这个在前面音频那节讲过原理本质就是 sink 优先级。这里补充一个更实用的方案在pavucontrol的回放标签页里每个正在发声的应用可以单独指定输出设备。也就是说你可以让浏览器走音箱让语音通话走耳机互不干扰。这个功能用过就回不去了尤其是在需要一边放音乐一边开会的时候。还有一个容易被忽略的点是 USB 设备的权限。如果你用串口设备、摄像头或者开发板非 root 用户可能没权限访问。标准的解决办法是把用户加到 dialout 组sudo usermod -aG dialout $USER然后重新登录。这个在嵌入式开发里是必做的一步不然后面调串口会一直报权限错误。摄像头的话确保在 video 组里用groups命令可以看到自己当前所属的所有组。5. 常见问题速查与重装后的收尾工作5.1 网卡、声音、驱动类问题速查表重装系统之后的故障其实高度集中在几类上我把常见的整理成表遇到问题直接对号入座比到处搜帖子快得多。现象最可能的原因处理方式3.5mm 音箱没声音USB 耳机正常PulseAudio 默认 sink 指向了 HDMI 或错误端口pactl list short sinks查看pactl set-default-sink切换或用 pavucontrol 选端口nvidia-smi报找不到设备Secure Boot 未注册 MOK或驱动版本不匹配重启进 MOK 管理界面注册或ubuntu-drivers devices换推荐版本外接显示器无信号接口未启用或分辨率超出范围xrandr查看 connected 状态显式指定--mode和--rate有线网卡识别不到网卡型号较新内核 5.4 缺驱动更新内核到 5.15 HWE或从官网下载驱动源码编译apt update 报 GPG 错误镜像站同步延迟等待后重试或临时切回官方源更新一次双系统时间差 8 小时Windows 用本地时间Linux 用 UTCLinux 下执行timedatectl set-local-rtc 1或改 Windows 注册表其他盘符带锁无法挂载Windows BitLocker 未解密回 Windows 关闭设备加密等解密完成VSCode 调试启动失败缺 gdb 或 preLaunchTask 名称不匹配sudo apt install gdb核对 tasks.json 的 label关于网卡这个问题要单独说一句。有些新机器尤其是近两年的笔记本用的是比较新的有线或者无线网卡芯片Ubuntu 20.04 默认的 5.4 内核驱动库里没有对应模块表现就是设置里压根看不到网卡。这种情况有两个办法一是装 HWE 内核sudo apt install linux-generic-hwe-20.04能把内核升到 5.15驱动支持好很多二是用手机 USB 网络共享临时联网先把驱动装好再切回有线。虚拟机里装 Ubuntu 遇到网卡问题通常是虚拟机软件的虚拟网卡模式选错了NAT 和桥接换一下试试比折腾驱动快得多。5.2 依赖冲突与版本回退的实用手法依赖冲突是配环境过程中最耗时的部分尤其是 Python 生态。核心原则是隔离别把所有东西装到一个环境里。conda 环境、venv、Docker 容器三种隔离手段按项目复杂度选。小型脚本用 venv深度学习项目用 conda需要跑 ROS 又要跑别的复杂依赖的项目直接上 Docker 最省心。排冲突的时候pip check能列出当前环境里所有版本不满足的包非常好用。定位到具体包之后用pip install packagex.y.z精确指定版本。如果冲突太严重建议导出当前环境再重建pip freeze requirements.txt conda env export environment.yml改完依赖再pip install -r requirements.txt。对于 apt 安装的系统级包版本回退稍微麻烦一点可以用apt policy packagename看有哪些可用版本然后sudo apt install packagenameversion指定。但系统级包回退有风险可能牵连一堆其他包的依赖能不动就不动。C 项目的依赖冲突主要体现在动态库版本上。ldd可以查看可执行文件链接了哪些库LD_LIBRARY_PATH可以临时指定运行时的库搜索路径。遇到undefined reference或者symbol lookup error的时候先用ldd确认链接的库路径对不对再用nm -D看符号在不在。这些工具看着底层但解决问题的时候比反复重装高效得多。提示echo $LD_LIBRARY_PATH如果输出里有你自己加的路径注意排查顺序。多个库版本共存时路径顺序决定了用哪个版本加错顺序会导致一些诡异的问题比如程序能编译但跑起来崩溃。5.3 备份与快照让下次重装轻松一半环境配好之后最该做的是备份但大部分人都是下次重装的时候才后悔没备份。我的做法分三层第一层是配置文件备份sources.list、/etc/profile、~/.bashrc、~/.condarc、~/.gitconfig、~/.ssh、VSCode 的 settings.json这些打包扔到云盘重装之后复制回去就能恢复大半。第二层是环境清单pip freeze、conda env export、dpkg --get-selections把装过的包列出来重装的时候有据可依。第三层是系统快照用 timeshift 定时做全盘快照出问题能回滚到某个时间点。timeshift 的安装和配置sudo apt install timeshift图形界面里选 RSYNC 模式快照存到单独的数据盘或者移动硬盘上不要存在系统盘不然系统盘挂了快照也没了。建议在几个关键节点各做一次快照系统装完、驱动装完、通用开发环境装完、专业环境装完。这样任何一步出问题都能快速回退不用从零开始。如果你的系统盘和 home 是分开的重装的时候只格式化/分区/home保持不动那么所有的个人配置、代码、conda 环境、数据集都还在。这时候你只需要重新装系统级的东西驱动、ROS、apt 包用户级的配置和 conda 环境直接就能用。这是分区策略带来的实实在在的好处强烈建议还没装系统的同学按这个方案来。如果条件允许用 Docker 把整套环境容器化是更彻底的方案。写一个 Dockerfile把 ROS、CUDA、Python 依赖全写进去镜像推到私有仓库或者导出成 tar 包。以后换机器docker load一下就能跑完全不用重新配。代价是要花时间写 Dockerfile而且 GUI 程序在容器里的显示配置有点门槛。但对于需要长期维护的项目这个投入绝对值。最后分享一个我自己用了很久的小习惯把所有的环境配置步骤写成一个 shell 脚本每装一个新东西就往里面追加一条命令同时记一句注释说明为什么装它。这个脚本的存在感很低但下次重装系统的时候它就是你的施工图纸。我第一份这样的脚本只有二十行现在已经积累到三百多行了从换源到 ROS 到 CUDA 全都有新机器从装完系统到能跑项目两个小时以内搞定。踩过的坑不会白踩前提是你把它记下来了。