上周又把一台笔记本从头到尾刷了一遍 Ubuntu 20.04这已经是今年第四次了。说起来有点好笑明明 22.04、24.04 都出来了手上的项目还是老老实实钉在 20.04 上——ROS Noetic 只支持到 20.04几个老版本的 CUDA 和显卡驱动在更新的系统上折腾起来又是一堆麻烦。所以这篇东西就是一份实打实的重装 Ubuntu 20.04 系统基本环境配置记录从做启动盘、分区装系统到换源、装显卡驱动、配开发环境再到 ROS、ORB-SLAM3 这类偏工程向的部署一条线走完。适合两类人一类是第一次装双系统、心里没底的另一类是装完系统发现没网卡、没声音、显卡驱动装不上正在满世界翻帖子的。我踩过的坑都写在后面了尤其是那几个经典的装完就没声音重启进不去系统直接照抄排查步骤就行。1. 重装前的整体规划与方案选型1.1 为什么很多项目至今还锁在 Ubuntu 20.04先把这个说清楚不然很多人会问都 2025 年了为什么还要装 20.04核心就一个字——依赖。ROS Noetic 是 ROS1 的最后一个长期支持版本官方支持矩阵里对应的就是 Ubuntu 20.04装到 22.04 上要么源码编译到怀疑人生要么各种 Python 3.10 和 catkin 的兼容问题。ORB-SLAM3 这种视觉 SLAM 项目也是同理它的 CMakeLists 里对 C11/14、OpenCV 4.2、Eigen 3.3 的版本假设恰好和 20.04 的默认软件源严丝合缝。再加上不少公司的推理框架、TensorRT 版本、CUDA 版本都是围绕 20.04 打包的迁移成本远大于收益。所以重装 ubuntu20.04这件事本质上不是图省事而是一次环境对齐。你要做的不是装一个最新最潮的系统而是装一个和你的代码库、和你的同事、和你的服务器完全一致的基线环境。想明白这一点后面很多纠结就没了——比如不该手贱去升 Python 系统版本不该随便换 GCC 主线版本。1.2 单系统、双系统、虚拟机三条路怎么选这是我被问得最多的问题先给结论再讲理由。方案适合谁优点坑点纯 Ubuntu 单系统主力开发机、服务器、跑训练/仿真的机器性能无损驱动最干净显存不会被分走Windows 上的软件用不了某些网银、Office 重度用户会难受Windows Ubuntu 双系统学生党、一台机器兼顾打游戏和写代码两不误切换靠重启分区一旦手滑会毁数据Windows 更新偶尔会覆盖引导虚拟机VirtualBox / VMware / virt-manager只想跑跑命令、学 ROS 基础装坏了直接删零风险无独立显卡直通SLAM、深度学习基本跑不动我的个人建议很简单如果你要跑视觉 SLAM、要装 NVIDIA 驱动、要在本机跑训练那虚拟机直接放弃别浪费那个时间。虚拟机里装 Ubuntu 20.04 只适合我只是想熟悉一下 Linux 命令这种需求。双系统的话给 Ubuntu 至少留 150GB。这个数字不是拍脑袋来的根分区/大概 80GB 起步ROS desktop-full 装完就 2GB 多加上 CUDA、Anaconda、各种 conda 环境80GB 其实很紧张/home单独分的话再留 100GB 比较从容。如果硬盘总共只有 256GB建议放弃双系统直接买个移动硬盘盒装块 SSD 做 Ubuntu 的独立盘用 BIOS 启动项切换比折腾分区安全得多。1.3 装机前必须做的备份与物料准备这一步是最多人跳过的也是出事之后最后悔的。我说几个硬性动作Windows 侧先关掉快速启动和 BitLocker。快速启动会让 NTFS 分区处于半休眠状态Ubuntu 挂载时只能只读甚至能把你 Windows 弄进不去。BitLocker 更麻烦装完 Ubuntu 再回 Windows会发现 D 盘、E 盘带把小锁让你输恢复密钥——那个密钥 48 位找不到就只能格盘。所以进系统之前先在 Windows 的管理 BitLocker里把非系统盘全部关闭加密等确认无误了再考虑开回来。备份清单浏览器书签、SSH 私钥~/.ssh、各种.env和配置文件、conda 环境导出文件conda env export env.yml、pip 的requirements.txt。这些东西比代码值钱代码在 Git 上有密钥没有。物料清单一个 8GB 以上的 U 盘会被格式化别用有数据的、一根网线无线网卡没驱动的救急方案、另一台能上网的电脑用来查驱动、下镜像。提示如果你打算装双系统强烈建议在 Windows 里先用磁盘管理压缩出一个未分配空间不要在 Ubuntu 安装器里直接删 Windows 分区。安装器里那一步是刀尖上跳舞很容易点错行。2. 安装盘制作与分区方案实操2.1 镜像下载与启动盘制作镜像下载这一步国内直连官方源速度感人用清华或中科大的镜像站会快很多搜ubuntu 20.04 镜像站就能找到下载ubuntu-20.04.6-desktop-amd64.iso这个文件。注意选 desktop 版本还是 server 版本desktop 版带图形安装器和桌面环境适合本地开发机server 版没有图形界面装了 ROS 之后还得自己补桌面除非你就是要做纯服务器否则一律选 desktop。启动盘制作工具有好几个Rufus、balenaEtcher、Ventoy。我自己现在基本只用 Ventoy——把 U 盘一次性做成 Ventoy 盘之后镜像文件直接拖进去就行一个 U 盘可以同时放 Ubuntu 20.04、Windows 11、PE 工具不用反复格式化。Rufus 也行但要注意两点分区类型选 GPT对应 UEFI 启动写入模式用 DD 模式比 ISO 模式更保险虽然慢一点。写完启动盘别急着拔先插到目标机器上试一下能不能进启动菜单。开机时反复按 F2/F12/Del/Esc不同品牌不一样华硕一般是 Esc 或 F8 调启动项惠普是 F9联想是 F12能进到启动设备选择界面就成功了一半。2.2 BIOS 里的几个关键开关进 BIOS 之后要找这几项不同主板叫法不一样我按常见名字列一下Secure Boot装 Ubuntu 20.04 过程中如果卡在验证失败或者根本起不来把它设成 Disabled。虽然 20.04 理论上支持 Secure Boot但一旦你要装第三方驱动NVIDIA、VirtualBox 内核模块签名的坑一个接一个直接关掉省心。SATA 模式需要是 AHCI如果原来是 RAID有些游戏本默认这样改成 AHCI 后 Windows 可能起不来。这种情况要么在 Windows 里先改成安全模式启动一次要么索性别动Ubuntu 装完再处理。启动顺序把 USB 设备调到第一位或者干脆用一次性启动菜单Boot Menu临时选 U 盘不改全局顺序。2.3 分区方案EFI、swap、根分区到底分多大这是全文最需要动手算的部分。我给出一个经过验证的分区表按 500GB 硬盘、双系统场景来算假设你从 Windows 里压出了 300GB 空闲空间安装器里选择其他选项Something else手动分区然后这样分挂载点大小类型说明EFI 分区512MB - 1GBEFI 系统分区如果 Windows 已经有一个 EFI 分区复用它不要再新建否则会出现两个 EFI 分区抢引导swap物理内存大小 × 1或 16GB 封顶交换空间内存 16GB 以上其实 8GB 也够主要是为了休眠和编译时兜底/80GB - 120GBext4系统和软件都在这ROS CUDA conda 装完能吃掉 40GB 以上/home剩余全部ext4你的代码、数据集、conda 环境默认也在这这里的取舍逻辑把/home单独分出来最大的好处是以后重装系统可以只格式化//home挂上去不动配置和数据集全在。代价是/空间有限Anaconda 如果装到默认位置会占用/home问题不大但如果你的 CUDA 装在/usr/local那就是/分区的事80GB 起是合理的。swap 的大小有个老说法是内存的两倍那是 2GB 内存时代的经验现在不适用了。真正需要考虑的是你要不要用休眠hibernate。要休眠的话 swap 必须 ≥ 物理内存不休眠的话8GB 到 16GB 足够纯粹是内存吃紧时的溢出区。分区的时候还有个小细节容易忘**安装启动引导器的设备**这一栏双系统一定要选整个磁盘比如/dev/nvme0n1不要选某个具体分区比如/dev/nvme0n1p5。选分区会导致 GRUB 装到不该装的地方重启直接进 Windows连启动菜单都看不到。2.4 安装过程中的几个必须勾选项安装向导里有几处不能瞎点安装类型这一步双系统务必选其他选项自己分区别选与 Windows 共存那个自动分区会在 Windows 分区之间硬塞出了问题很难收拾。安装第三方软件这个勾选框一定要勾上。它包含显卡驱动、WiFi 驱动的额外固件、MP3 等媒体解码器。很多装完没网卡装完没声音的问题根子就在这没勾。当然它也会带来一个副作用——装了 NVIDIA 私有驱动之后首次启动可能黑屏或者分辨率不对这个后面第 3 章细说。清除整个磁盘并安装只有在你确认这块盘上没有任何要保留的数据时才能选。台式机加一块新 SSD 专门装 Ubuntu 用这个最省事但一定要拔掉所有其他硬盘的数据线或者至少确认磁盘型号没选错。装完之后第一次重启会提示拔掉安装介质拔了再按回车。进 GRUB 菜单应该能看到 Ubuntu 和 Windows Boot Manager 两项都能进就说明引导没问题。3. 系统装完第一件事源、驱动与基础工具3.1 换源这一步别省能省下你几个小时刚装完的系统默认源是archive.ubuntu.com和security.ubuntu.com国内访问速度看运气。第一件事就是换源我用清华的比较多也可以选阿里云或中科大操作方式一样。先备份原文件这一步是习惯出问题能还原sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %F)focal 是 20.04 的代号源里的每条记录都要把archive.ubuntu.com和security.ubuntu.com替换成镜像站域名。手动改太累直接在镜像站的帮助页面抄一份sources.list内容覆盖过去最快sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//.*security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo apt update sudo apt upgrade -y顺带把 pip 源也换了不然后面装 Python 包又是漫长的等pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple注意apt upgrade在刚装完系统的时候会拉一大堆包包括内核更新。如果你要装 NVIDIA 驱动建议先把内核更新做完再装驱动顺序颠倒的话可能出现驱动编译进旧内核、重启进新内核直接黑屏的经典事故。3.2 显卡驱动apt install nvidia-driver-535 的正确姿势这一节是整个配置里最容易翻车的地方我把逻辑讲透。Ubuntu 20.04 自带的nouveau开源驱动能用但跑不了 CUDA也带不动 Blender 的 GPU 渲染和 SLAM 的实时要求所以必须换成 NVIDIA 官方驱动。推荐做法是用 Ubuntu 仓库里的版本也就是apt直接装原因是它会自动帮你处理 DKMS内核模块在每次内核更新后自动重新编译比官网下载.run文件手装稳定得多。第一步先看看仓库里有哪些版本可选ubuntu-drivers devices输出里会列出nvidia-driver-470、nvidia-driver-525、nvidia-driver-535这些还会标注哪个是 recommended。535 是目前兼容 CUDA 12.x 的主流版本如果你的项目要跑较新的 PyTorch选它比较合适如果项目是老代码配 CUDA 10.2那就得退到 470 甚至更老。驱动版本要跟着你的 CUDA 需求走不是越新越好。确定版本后sudo apt install nvidia-driver-535 sudo reboot重启后验证nvidia-smi能输出显卡型号、驱动版本、显存占用就成功了。现在说几个常见坑。第一个是Secure Boot 没关DKMS 编译出来的模块没签名加载会被拒绝表现为nvidia-smi报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver。第二个是装完重启黑屏多数是驱动和当前内核不匹配或者 nouveau 没被正确禁用。处理方式是在 GRUB 界面按e编辑启动参数在linux那行末尾加nomodeset临时进系统然后sudo apt purge nvidia-* sudo apt autoremove sudo apt install nvidia-driver-470 # 换一个版本重来第三个坑是混合显卡笔记本Intel 核显 NVIDIA 独显这时候默认会走核显输出nvidia-smi能跑但外接显示器可能不亮。需要在NVIDIA X Server Settings里切到 Performance 模式或者用prime-select nvidiasudo prime-select nvidia sudo reboot3.3 中文输入法、字体和日常软件系统默认可能装的是英文中文显示会有一堆方块。先补语言包sudo apt install language-pack-zh-hans sudo apt install fonts-noto-cjk fonts-wqy-microhei输入法我用了很久 fcitx 搜狗拼音的组合20.04 下稳定性还行sudo apt install fcitx fcitx-config-gtk fcitx-googlepinyin装完在语言支持里把键盘输入法系统切成 fcitx重启然后im-config -n fcitx确认配置生效。搜狗拼音的 deb 包从官网下sudo dpkg -i装完之后跑一次sudo apt -f install补依赖不然会提示缺库。日常软件方面vim、git、curl、wget、htop、tree、net-tools、build-essential这几个是必装的一次性装上sudo apt install -y vim git curl wget htop tree net-tools build-essential cmake pkg-configbuild-essential里包含 gcc、g、make装 ROS 和 ORB-SLAM3 的时候会一直用到别等到报错make: command not found才想起来装。3.4 音箱没声音、只有耳机有输出怎么查这个问题的搜索量高得离谱我把它单独拎出来讲因为排查路径很固定。装完系统插 3.5mm 音箱没声音但插 USB 耳机有声音九成以上是声卡输出通道被静音了而不是驱动没装。第一步先装pavucontrolsudo apt install pavucontrol pavucontrol打开输出设备标签页看是不是有个Headphones处于活动状态而Line Out是 Idle。这种情况是插孔自动检测jack detection判断错了把音箱插头认定成耳机。第二步打开alsamixeralsamixer按 F6 选对声卡可能有多个 HDA Intel然后按M键把标着MM的通道解除静音调高Master、PCM、Front、Line Out这几个。如果是笔记本还会看到一个Auto-Mute Mode把它设成Disabled这个是罪魁祸首——它的逻辑是插入耳机就把内置扬声器静音但检测错的时候会把该出声的通道一起关掉。第三步如果上面都不行试着禁用自动检测sudo vim /etc/modprobe.d/alsa-base.conf # 末尾加一行 options snd-hda-intel modelauto或者更暴力一点把model换成你机身对应的型号dell-headset-multi、alc295之类但一般auto就够了。提示每次改完alsamixer之后记得执行sudo alsactl store保存配置不然重启又回到原样。4. 开发环境搭建从 Shell 到语言运行时4.1 基础工具链与终端增强装完系统之后我的第一件事是换终端。原因很实在默认 bash 在跑git status的时候慢得让人心焦尤其在 ROS 那种几十万文件的工作空间里。换成 zsh oh-my-zsh再配zsh-autosuggestions和zsh-syntax-highlighting效率能提不少。sudo apt install -y zsh git sh -c $(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh) chsh -s $(which zsh)如果上面这个脚本拉不下来直接apt install zsh之后手动克隆 oh-my-zsh 仓库到~/.oh-my-zsh也一样能用路径对了就行。tmux 也建议装跑编译、跑 ROS 节点的时候开一个 session断网、关窗口都不影响sudo apt install -y tmux我常用的配置就三行改前缀键为Ctrla、开启鼠标、设置大一点的滚动缓冲。写进~/.tmux.conf里set -g prefix C-a set -g mouse on set -g history-limit 100000配上htop日常看资源占用、杀进程足够用了。4.2 Node.js 与 Vue3 环境Node 我强烈建议用 nvm 管理不要用 apt 装。apt 里的 Node 版本老而且换版本要动系统包很容易把依赖搞乱。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 18 nvm alias default 18 node -v npm -v版本选 18 是比较稳的选择Vue3 的生态、Vite 都在这个版本上跑得最好。npm 源换成国内镜像npm config set registry https://registry.npmmirror.com然后建项目看你要用哪种脚手架。Vue3 现在两种主流方式# 方式一Vite推荐冷启动快 npm create vitelatest my-app -- --template vue cd my-app npm install npm run dev # 方式二Vue CLI老项目维护 npm install -g vue/cli vue create my-app实测下来 Vite 的冷启动比 Vue CLI 快一个数量级新项目直接上 Vite。注意 Node 18 配 Vue CLI 5.x 时偶尔会有 OpenSSL 的报错解决办法是在package.json的 scripts 里加上NODE_OPTIONS--openssl-legacy-provider或者干脆升到 Vue CLI 5.0.8 以上。4.3 PythonAnaconda、conda 环境与 pip 的边界Python 这块最大的坑是不要动系统自带的 Python。Ubuntu 20.04 系统自带的 Python 3.8 是给系统工具链用的apt、ubuntu-drivers这些脚本都依赖它你一旦把默认 python 指向了别的版本系统工具会莫名其妙挂掉。正确做法是装 Anaconda 或者 Miniconda用虚拟环境隔离。Miniconda 更轻我一般推荐它wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh source ~/.bashrc装完先配 conda 的镜像源不然conda install会慢到让你放弃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 yes然后是老生常谈的问题conda 源和 pip 源不要混用。一个环境里用 conda 装了一半、pip 装了一半很容易出现 numpy 版本冲突、libstdc.so.6版本不对这类问题。我的原则是能用 conda 装的numpy、scipy、pytorch就用 condaconda 里没有的一些小众库再用 pip而且 pip 装完之后要检查一下有没有覆盖掉 conda 装的底层库。PyTorch 环境建起来大概是这个流程conda create -n torch python3.8 -y conda activate torch conda install pytorch torchvision torchaudio cudatoolkit11.3 -c pytorchCUDA 版本要和驱动对应。535 驱动向下兼容到 CUDA 11.x所以cudatoolkit11.3或者 11.8 都行。查驱动支持的 CUDA 上限用nvidia-smi右上角那个CUDA Version。4.4 Java 与 Maven 环境配置Java 部分相对简单20.04 仓库里有 OpenJDK 8、11、17sudo apt install -y openjdk-11-jdk装完配JAVA_HOME。这一步很多人漏掉后果是某些构建工具找不到 JDKsudo vim /etc/profile.d/java.sh # 写入 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile.d/java.sh java -versionMaven 建议用官网的二进制包控制版本方便wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz sudo tar -zxvf apache-maven-3.9.6-bin.tar.gz -C /opt/ sudo vim /etc/profile.d/maven.sh # 写入 export MAVEN_HOME/opt/apache-maven-3.9.6 export PATH$MAVEN_HOME/bin:$PATH然后改 settings.xml 加国内镜像路径在/opt/apache-maven-3.9.6/conf/settings.xml在mirrors标签里加一条指向阿里云仓库的 mirror。不改的话第一次mvn clean install能跑半小时。4.5 VSCode 配置 C/C 与 Python 环境VSCode 在 20.04 上有 snap 和 deb 两种装法建议用 debsnap 版的文件系统沙箱会导致某些插件读不到系统路径尤其是 C/C 插件找头文件的时候。sudo apt install -y code或者去官网下 deb 包sudo dpkg -i code_x.x.x_amd64.deb。C/C 环境要配三个文件放在项目根目录的.vscode/下c_cpp_properties.json负责告诉插件头文件在哪{ configurations: [ { name: Linux, includePath: [ ${workspaceFolder}/**, /usr/include, /usr/include/c/9 ], compilerPath: /usr/bin/g, cStandard: c11, cppStandard: c14, intelliSenseMode: linux-gcc-x64 } ], version: 4 }注意cppStandard设成c14因为 ORB-SLAM3 这类代码基本都要求 C11 以上设c17反而会让某些老代码报错。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负责调试{ version: 0.2.0, configurations: [ { name: g debug, type: cppdbg, request: launch, program: ${fileDirname}/${fileBasenameNoExtension}, args: [], stopAtEntry: false, cwd: ${workspaceFolder}, MIMode: gdb, preLaunchTask: build } ] }Python 那边就简单多了装上官方 Python 插件选好解释器按CtrlShiftP输入Python: Select Interpreter挑你 conda 环境里那个python路径就行。如果你用的是 conda解释器路径大概是~/miniconda3/envs/xxx/bin/python。提示VSCode 里如果 Python 插件反复提示 Linter pylint is not installed直接在对应环境里pip install pylint就行别去点它那个 Install 按钮那个按钮会往系统 Python 里装东西。5. ROS、SLAM 与图形类工程环境部署5.1 ROS Noetic 安装与 rosdep 卡死的处理ROS Noetic 的安装流程网上一大把我只讲关键点和容易卡住的地方。先加源和密钥sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt install curl -y curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-noetic-desktop-full -ydesktop-full包含了 rviz、gazebo、各种仿真包装完大概 2GB 多。如果你只是要写节点desktop或ros-base也够但做 SLAM 的别省这点空间gazebo 迟早要用。装完初始化sudo rosdep init rosdep update这两步是国内用户最头疼的。rosdep init会去拉raw.githubusercontent.com上的源列表文件经常超时。几个可行的做法第一rosdep init成功但rosdep update卡住的话通常是超时时间太短可以在~/.ros/目录相关配置里把超时调大或者多试几次。第二更省事的办法是使用国内镜像提供的rosdepc工具把 rosdep 的源换到国内镜像站装完之后用rosdepc init和rosdepc update代替原命令用法完全兼容。第三手动方案直接从镜像站下载rosdistro仓库到本地然后修改/etc/ros/rosdep/sources.list.d/20-default.list里的 URL 指向本地路径再跑rosdep update。这个方式最稳但配置稍麻烦。环境变量别忘了加否则roscore找不到命令echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc建工作空间的流程是固定的mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_makecatkin_make初始化环境之后再 source 一次devel/setup.bash。这里有个小陷阱如果你用的是 zsh.bashrc里的 source 语句不会自动生效得写到~/.zshrc里。我见过不少人折腾半天说环境变量不生效就是这个原因。5.2 ORB-SLAM3 的依赖与编译要点ORB-SLAM3 是编译型项目里比较挑环境的按顺序来基本不会错。依赖三件套Pangolin、OpenCV、Eigen3。OpenCV 用系统自带的 4.2 就行sudo apt install libopencv-dev别自己编译编译一次两小时起步。Eigen 也是sudo apt install libeigen3-dev版本 3.3.7 正好满足要求。Pangolin 要自己编注意选对版本v0.6 和 ORB-SLAM3 是兼容的sudo apt install -y libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin git checkout v0.6 mkdir build cd build cmake .. make -j$(nproc) sudo make install-j$(nproc)这个技巧值得记一下它会用上所有 CPU 核心并行编译比默认快好几倍。但注意内存小于 8GB 的机器别用会 OOM 卡死。然后是 ORB-SLAM3 本体git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git cd ORB_SLAM3 chmod x build.sh ./build.sh编译过程中最常见的两个报错我列在表里报错信息原因解决fatal error: opencv2/...: No such fileCMake 找不到 OpenCVsudo apt install libopencv-dev再确认/usr/include/opencv4存在undefined reference to symbol ...C 标准不匹配在 CMakeLists.txt 里把CMAKE_CXX_STANDARD改成 14Segmentation fault运行即崩Pangolin 版本不对退到 v0.6或检查 OpenGL 环境变量libpango_...运行时报找不到库动态库路径没刷新sudo ldconfig编译到 90% 卡死内存不足去掉-j单线程编译或加 swapORB-SLAM3 还自带一份 DBoW2 和 g2o 的第三方库build.sh会一起去编中间如果中断了再跑一次可能因为残留文件报错rm -rf build Thirdparty/DBoW2/build Thirdparty/g2o/build清干净重来。跑之前记得下载词典文件ORBvoc.txt和对应数据集词典文件解压后有 100 多 MB加载一次要十几秒这是正常的。5.3 Blender 安装与双显示器配置Blender 如果用 apt 装版本会比较老。做渲染和建模的话直接去官网下 tar.xz 包解压即用不用安装wget https://download.blender.org/release/Blender3.6/blender-3.6.5-linux-x64.tar.xz tar -xf blender-3.6.5-linux-x64.tar.xz cd blender-3.6.5-linux-x64 ./blender第一次启动要设置 GPU 渲染。进 Preferences → System → Cycles Render Devices选 CUDA 或者 OptiX然后再选你的显卡。这一步的前提是 NVIDIA 驱动已经装好了否则选项里什么都没有。双显示器的配置有两种路数。如果你用的是 NVIDIA 独显直接输出可以在NVIDIA X Server Settings里点X Server Display Configuration选第二个显示器设成X screen 0的一部分TwinView然后选布局和主屏。另一种是走系统设置xrandr这条命令会列出所有接口和分辨率比如HDMI-1 connected 1920x108019200。左侧显示器为主屏的话xrandr --output HDMI-1 --primary --mode 1920x1080 --pos 0x0 --output DP-1 --mode 1920x1080 --pos 1920x0--pos是相对坐标左屏放0x0右屏就从1920x0开始这样鼠标从左滑到右是连续的。想持久化就写进~/.xprofile或者做成 systemd 服务。对于切换工作区主副屏桌面环境自带的显示设置里可以拖拽排列但有时候改了不生效得先xrandr --auto刷新一次。6. 常见问题排查速查表与踩坑经验6.1 装完系统网卡没了怎么联网救急这个问题的成因就一个Ubuntu 20.04 的安装镜像里没有你网卡的固件尤其是比较新的 Intel AX200、AX210 无线网卡或者某些 Realtek 的有线网卡。装的时候如果没勾安装第三方软件固件就没打进去。救急的优先级顺序是这样方案一手机 USB 网络共享。用数据线把手机连到电脑在手机设置里打开USB 网络共享Ubuntu 会自动识别成一个 USB 网卡并拿到 IP。这是最快的方式不需要任何驱动。方案二插网线。有线网卡的驱动一般在核心里就有插上就能用。前提是你有网线且路由器在旁边。方案三离线装固件。在另一台电脑上下载对应的.deb用 U 盘拷过去sudo dpkg -i。Intel 网卡的固件包叫linux-firmware但完整的linux-firmware在 20.04 上可能还是不够新有些卡需要更新的固件版本。Realtek 的某些网卡需要rtl8821ce-dkms这类 DKMS 包。联网之后先跑一遍sudo apt update sudo apt install --reinstall linux-firmware sudo apt install linux-generic-hwe-20.04hwe是硬件支持栈包含更新的内核和驱动对新型号网卡的兼容性提升很明显。装完重启大部分情况下 WiFi 就出来了。如果还是不认用lspci -knn | grep -i net看看网卡型号和当前加载的驱动再用dmesg | grep -i firmware看有没有 firmware not found 的报错按型号去搜对应固件包。提示装机的经验法则是装系统时如果机器能联网就一定要勾上安装第三方软件事后省下的排查时间够你看完一部电影。6.2 重启后进不去系统与引导修复双系统最常见的噩梦装完 Ubuntu 重启直接进 Windows看不到 GRUB 菜单。成因通常有两个。一是安装时引导器安装设备选错了GRUB 写到了 Ubuntu 分区而不是磁盘的 EFI 分区主板的 UEFI 里排在第一位的还是 Windows Boot Manager。二是 Windows 有一次大版本更新把 EFI 分区里的引导顺序改了。处理办法用 Ubuntu 安装 U 盘进入 Live 环境选Try Ubuntu先装个boot-repairsudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt update sudo apt install -y boot-repair boot-repair选Recommended repair它会自己检查 EFI 分区、重装 GRUB、更新引导顺序。跑完重启一般就回来了。如果你不想用工具手动方式也行。先进 Live 环境找到根分区并挂载sudo fdisk -l # 找到根分区比如 /dev/nvme0n1p5 sudo mount /dev/nvme0n1p5 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi # EFI 分区 for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done sudo chroot /mnt grub-install /dev/nvme0n1 update-grub exit sudo reboot另一种情况是 BIOS 里明明有 ubuntu 启动项但选了之后黑屏或者进 GRUB rescue。这多半是分区 UUID 变了比如你重装过系统但 /etc/fstab 还是旧的用 Live 环境打开/mnt/etc/fstab对一下 UUID 就清楚了。还有一种更隐蔽的Windows 的快速启动导致的 NTFS 只读。表现是进得了系统但挂载 D 盘报The disk contains an unclean file system。解决办法是回 Windows 关掉快速启动或者用sudo ntfsfix /dev/sdXn临时修一下但治本还是得关快速启动。6.3 其他盘符带锁BitLocker 的正确处理姿势装完 Ubuntu 再回 Windows打开此电脑发现 D 盘、E 盘图标上多了个锁双击提示要输恢复密钥。这是 BitLocker 的设备加密被触发了触发条件通常是检测到启动环境变化。处理方式分两种情况能找到恢复密钥的去微软账户的设备页面里找 BitLocker 恢复密钥输入即可解锁然后进管理 BitLocker把对应盘关闭加密等解密完成再用。找不到密钥的基本没办法。这也是为什么我在第 1 章就强调装机前一定要先关 BitLocker。真正保险的做法是装系统之前在 Windows 里对所有非系统盘执行manage-bde -off D:然后manage-bde -status确认保护状态是保护已关闭再动手装 Ubuntu。还有一种情况你在 Windows 里把 Ubuntu 分区设成了隐藏或者 Windows 弹出是否格式化该磁盘的提示千万别点格式化那是它认不出 ext4 分区。同理在 Ubuntu 里也别手贱去挂载 Windows 的系统保留分区。6.4 常见问题速查表把这些年遇到的高频问题整理成一张表装系统的时候可以对照着查现象最可能的原因首选处理装完没 WiFi缺网卡固件手机 USB 共享联网装linux-firmware和linux-generic-hwe-20.04nvidia-smi报通信失败Secure Boot 未关 / DKMS 未编译关 Secure Boot重装驱动dkms status检查装完重启黑屏驱动与内核不匹配GRUB 加nomodeset进系统换驱动版本3.5mm 音箱无声Auto-Mute 或通道静音alsamixer取消静音pavucontrol切输出设备重启进 WindowsGRUB 引导项丢失Live 环境跑boot-repairD 盘带锁BitLocker 触发输恢复密钥后关闭加密rosdep update超时源访问慢用国内镜像版 rosdep 或本地化 rosdistroORB-SLAM3 编译报 OpenCV 错未装libopencv-devsudo apt install libopencv-devconda 环境里 numpy 冲突conda 与 pip 混装重建环境统一用 conda 装底层库zsh 下 ROS 命令找不到环境变量写进了.bashrc迁移到~/.zshrcVSCode 插件找不到头文件snap 沙箱限制改用 deb 版本安装mvn拉包龟速未配镜像settings.xml加国内 mirror6.5 几条用血换来的经验最后聊几个不成体系但很值钱的点。第一装系统之前先想清楚这台机器要跑什么。如果只是写写 Python 脚本装完换源、装个 conda、装个 VSCode半小时搞定。如果要跑 ROS 和 SLAM那 CUDA、显卡驱动的版本就要提前规划好别装到一半发现驱动版本和 PyTorch 对不上再回头卸驱动那个来回折腾至少两小时。第二不要同时装 conda 和 apt 版本的 Python 包。比如你用 apt 装了python3-opencv又在 conda 环境里pip install opencv-python那么在 Python 里import cv2到底导入的是哪个取决于sys.path顺序。ORB-SLAM3 的 Python 绑定出问题时八成是这个原因。要么全用 conda要么全用 apt venv别混。第三把装机过程脚本化。我现在维护了一个setup.sh里面按顺序写着换源、装基础包、装驱动、装 conda、配 git、克隆 dotfiles。每次重装系统跑一遍三十分钟进入工作状态。这比每次凭记忆敲命令靠谱得多也不会漏掉某个当时觉得以后再说的配置。第四重要数据永远不要放在系统盘。不管你分区做得多漂亮重装系统的时候总会有手滑的可能。代码推到远端仓库数据集放移动硬盘或者 NAS配置和密钥定期导出。我见过太多人在格式化那一步犹豫三秒钟然后把/home一起格了。第五装完系统先截图记录关键信息。nvidia-smi的输出、lsblk的分区表、apt list --installed的包列表、xrandr的显示配置全部存一份到云盘或者 U 盘里。下次出问题的时候对照着看哪里变了比盲猜快十倍。这也是我这些年摸索出来的习惯——系统环境本身也是一种需要版本管理的资产只是很多人没意识到而已。