跳转到内容

Linux 工程实践学习路线

推荐路径位置 4/6:学习路线总览 → C++ → Linux(当前) → ROS 2。可按已有基础和项目需要跳转。

本路线面向已经完成 C++ 入门、准备学习 ROS 2、PX4、嵌入式 Linux 或在远程计算机上部署程序的读者。学习目标不是背下一张命令表,而是能够安全地操作系统、理解命令产生的结果,并用证据定位常见环境问题。

完成主线后,应该能够:

  1. 区分 Linux 内核、发行版、终端、Shell 和桌面环境;
  2. 熟练使用路径、文件、文本、管道、重定向和命令帮助;
  3. 理解用户、用户组、所有权、权限、sudo 和 umask;
  4. 管理软件包、环境变量和基本开发工具链;
  5. 观察进程、信号、资源占用、systemd 服务和系统日志;
  6. 根据 IP、路由、DNS、端口和进程逐层排查网络问题;
  7. 理解磁盘、文件系统、挂载点、设备文件和串口权限;
  8. 编写输入、输出和影响范围明确的 Bash 小脚本;
  9. 通过 SSH 在远程主机上完成部署、检查、日志收集和恢复;
  10. 提交一份包含环境、复现步骤、证据、判断和验证结果的故障报告。
  • 操作系统:Ubuntu 22.04 LTS;
  • Shell:Bash;
  • 服务管理:systemd;
  • 软件包管理:APT/dpkg;
  • 版本管理:Git;
  • 远程访问:OpenSSH;
  • 编辑器:可以自选,但必须会在纯终端环境中完成最小修改;
  • 操作目录:~/linux-learning/。

Ubuntu 22.04 是为了与现有 ROS 2 Humble、PX4 和 Gazebo 环境保持一致,不代表 Linux 只等于 Ubuntu。路线中的路径、权限、进程、Shell、网络和诊断方法应尽量保持通用;发行版专有的软件包命令必须明确标注。

  • 文件、Shell、进程和网络基础阶段可以在原生 Ubuntu、虚拟机或 WSL2 中完成;
  • 涉及 USB、串口、显卡、内核模块、实时性、局域网发现或 systemd 行为时,不能默认 WSL2 与原生 Linux 等价;
  • 记录中必须写明运行环境,不能只写“Ubuntu”;
  • 进入 ROS 2、PX4 或硬件实验前,应在项目实际使用的环境中重新完成相关验收。

每次实验至少记录:

Terminal window
cat /etc/os-release
uname -r
echo "$SHELL"
ps -p $$ -o pid,ppid,comm,args

本路线不要求已有 Linux 经验,但开始前应当能够:

  • 使用电脑创建、复制和查找文件;
  • 阅读基本英文报错和命令帮助;
  • 按模板记录操作步骤和结果;
  • 接受“先理解现象,再修改系统”的排障方式。

如果还不熟悉文件、目录和终端的概念,先掌握阶段 0 的基础内容,不要直接照抄 ROS 或 PX4 的安装命令。

  1. 所有操作都在限定范围内完成。 默认只操作 ~/linux-learning/,涉及系统配置时先说明影响、备份和恢复方法。
  2. 先看帮助,再复制命令。 优先使用 --help、man、info 和项目官方文档确认参数含义。
  3. 先观察,再修改。 先用只读命令确认当前状态,再提出一个可以验证的假设。
  4. 一次只改变一个变量。 不同时换源、改权限、关防火墙和重装软件。
  5. 不用扩大权限掩盖问题。 不把 sudo、root 登录或 chmod 777 当作通用修复方法。
  6. 命令必须可解释。 应能说明命令、参数、输入、输出、退出码和影响范围。
  7. 以实际能力验收。 看完资料或成功复制一次命令不算通过。
  8. 保留故障证据。 完整命令、错误文本、日志时间范围和环境信息比截图更重要。

新人主线中禁止执行以下操作:

  • 在不清楚当前路径时递归删除、移动或改权限;
  • 对 /、/home、系统盘或不确定的设备执行格式化、分区和覆盖写入;
  • 直接编辑 /etc/sudoers;
  • 为绕过错误递归执行 chmod 777 或长期使用 root Shell;
  • 未审查内容就执行 curl ... | sudo bash;
  • 删除日志、关闭校验或关闭安全功能来让实验“通过”;
  • 在共享设备上修改网络、用户、服务和软件源而不记录恢复方法;
  • 把私钥、密码、令牌、内网地址或包含敏感数据的完整日志提交到仓库。

涉及磁盘、网络、防火墙、内核模块和系统级服务的高风险实验,应在可丢弃虚拟机或备用设备中完成,并提前准备恢复方案。

阶段 核心问题 通过标准
0. 系统模型 我正在操作哪一层? 能区分内核、发行版、Shell 与终端
1. 文件与文本 数据在哪里,怎样可靠查找? 不依赖图形界面完成常见文件操作
2. 用户与权限 谁可以对什么做什么? 能解释读、写、执行和所有权
3. Shell 数据流 命令怎样组合和传递结果? 能处理引用、重定向、退出码和环境变量
4. 软件与工具链 命令从哪里来,版本由谁管理? 能追踪命令、包、版本和仓库来源
5. 进程与日志 程序为何没启动或为何退出? 能从进程、信号和 journal 定位问题
6. 网络与 SSH 连接失败发生在哪一层? 能区分地址、路由、DNS、端口和应用问题
7. 存储与设备 文件系统怎样连接磁盘和硬件? 能找到挂载点、空间、设备和权限问题
8. Bash 自动化 怎样把重复检查变成可靠工具? 参数、错误、临时文件和退出码明确
9. 故障排查 怎样把系统交给下一个人维护? 陌生人可以复现、诊断、停止和恢复
  • 阶段 0 建立系统模型;通过后再进入文件、权限和 Shell 数据流。
  • 阶段 1~3 是软件管理、进程诊断和网络排障的前置基础。
  • 阶段 4~6 通过验收后,再进入存储设备和自动化脚本。
  • 阶段 7~8 的安全操作与诊断能力通过验收后,再进入阶段 9 的故障排查与交接。
  • 已有部分经验时,可以直接完成对应阶段的验收;不能仅凭“经常用 Linux”跳过。
  • Linux 内核负责的范围,以及用户空间程序的角色;
  • 发行版、软件仓库、桌面环境、终端模拟器和 Shell 的区别;
  • 命令、Shell 内建命令、可执行文件、脚本和进程之间的关系;
  • 当前用户、主机名、工作目录、环境变量和 PATH;
  • --help、man、info、手册章节和关键字搜索;
  • 退出码中 0 与非 0 的基本约定。
  • 不把 Ubuntu、Linux、Bash 和 Terminal 当作同一个概念;
  • 能从帮助中找到参数,而不是只从搜索结果复制命令;
  • 能说明当前实验发生在原生系统、虚拟机、容器还是 WSL2。

阶段 1:文件系统、路径和文本工具

Section titled “阶段 1:文件系统、路径和文本工具”
  • /、/home、/etc、/var、/tmp、/dev、/proc、/sys 的基本职责;
  • 绝对路径、相对路径、当前目录、父目录、隐藏文件和通配符;
  • 普通文件、目录、符号链接和设备文件;
  • pwd、ls、mkdir、cp、mv、rm、ln、file、stat;
  • less、head、tail、wc、sort、uniq、cut、grep、find;
  • 文件大小、目录占用和“文件已删除但空间未释放”的基本概念。
  • 不依赖图形文件管理器完成任务;
  • 能说明每条命令会影响哪些精确路径;
  • 不使用递归删除解决本来只需删除一个文件的问题;
  • 能区分“文件大小”和“目录占用空间”。
  • UID、GID、用户、主组和附加组;
  • 文件所有者、所属组和其他用户;
  • 普通文件与目录上的读、写、执行权限含义;
  • 符号权限、八进制权限、chmod、chown、chgrp;
  • umask、setuid/setgid/sticky bit 只需建立概念;
  • sudo 的作用、审计意义和最小权限原则;
  • 串口常见的用户组权限问题。
  • 能解释目录的执行权限为什么影响路径访问;
  • 不用 chmod 777 处理权限问题;
  • 使用 sudo 前能说清为什么需要提升权限、命令将修改什么、如何恢复;
  • 能区分文件权限问题和进程、端口或设备不存在的问题。
  • 标准输入、标准输出和标准错误;
  • >、>>、2>、管道及其覆盖风险;
  • 单引号、双引号、反斜杠、变量展开和命令替换;
  • glob 与正则表达式的区别;
  • &&、||、; 和退出码;
  • Shell 变量、环境变量、子进程和 export;
  • PATH 的查找顺序,以及 .bashrc、登录 Shell 和当前终端的区别;
  • 前台、后台和基本 job control。
  • 变量引用时知道何时必须加双引号;
  • 重定向前能判断目标文件会被覆盖还是追加;
  • 不把 glob 当作 grep 正则表达式;
  • 能使用退出码控制后续命令,而不是只看终端有没有红字。

阶段 4:软件包、命令来源和开发工具链

Section titled “阶段 4:软件包、命令来源和开发工具链”
  • 发行版软件仓库、包索引、包名、版本和依赖;
  • apt update、apt install、apt remove 与系统升级的区别;
  • apt show、apt policy、dpkg -L、dpkg -S;
  • 官方仓库、PPA、第三方仓库、源码构建和下载二进制的风险差异;
  • 命令查找、版本输出、动态库和架构不匹配的基本现象;
  • 编译器、构建系统、头文件、库和可执行文件的关系;
  • 为什么不应混用多个来源安装同一套复杂工具链。
  • 不通过反复执行 apt update 解决所有安装问题;
  • 能回答某个命令由哪个包、哪个仓库、哪个版本提供;
  • 不在未说明原因时添加第三方软件源;
  • 能区分包未安装、PATH 错误、架构错误和运行时依赖错误。

阶段 5:进程、信号、资源、systemd 和日志

Section titled “阶段 5:进程、信号、资源、systemd 和日志”
  • 程序与进程、PID 与 PPID、前台与后台;
  • 进程状态、退出码、信号和优雅停止;
  • ps、pgrep、top、free、uptime、lsof;
  • kill 默认发送的信号,以及 SIGTERM 与 SIGKILL 的差异;
  • systemd unit、service 状态、启动失败和依赖;
  • 系统级服务与用户级服务;
  • journalctl 按 unit、时间和优先级查看日志;
  • CPU、内存、文件描述符和僵尸进程只需掌握诊断入口。
  • 能确认程序是未启动、正在运行、卡住还是已经退出;
  • 能从日志中给出具体失败时间、unit、退出状态和错误文本;
  • 知道交互式 Shell 中可用的环境变量不会自动出现在服务中;
  • 停止服务后没有遗留进程。
  • 网络接口、IPv4 地址、子网、默认路由和 loopback;
  • localhost、局域网地址和公网地址的区别;
  • DNS 解析与 IP 可达性的区别;
  • TCP、UDP、监听端口、客户端连接和进程;
  • ip -br addr、ip route、getent hosts、ss、ping、curl;
  • 防火墙、虚拟机、WSL2、容器和多网卡对连接的影响;
  • SSH 主机密钥、用户密钥、权限和首次连接确认;
  • scp 或 rsync 的基本文件传输和校验。
  • 能用监听地址解释为什么服务只能本机访问或可以被局域网访问;
  • 不使用关闭整个防火墙作为首个排障步骤;
  • 不在聊天、截图或仓库中暴露私钥和密码;
  • 能将问题定位到名称解析、路由、端口、进程或应用协议中的一层。

阶段 7:磁盘、文件系统、设备和串口

Section titled “阶段 7:磁盘、文件系统、设备和串口”
  • 块设备、分区、文件系统、挂载点和目录的关系;
  • 容量、已用空间、inode 和目录占用;
  • lsblk、df -hT、du、findmnt、mount 的只读检查用法;
  • /dev 设备文件与 /sys 设备信息;
  • USB 枚举、串口设备、设备权限和用户组;
  • dmesg、lsusb、udevadm 的诊断用途;
  • 可移动设备安全卸载和写缓存的基本概念。
  • 不把磁盘、分区、文件系统、目录和挂载点混为一谈;
  • 空间不足时能区分块空间、inode、已删除但仍被占用的文件;
  • 串口失败时先确认设备是否枚举、设备名是否变化、权限是否满足;
  • 不为学习目的对系统盘或真实数据盘执行分区、格式化和修复命令。
  • shebang、脚本参数、位置参数和退出码;
  • if、case、for、函数和局部变量;
  • 引用、数组、命令失败和管道失败;
  • set -u、set -e、pipefail 的用途和局限,不能当作正确性的替代;
  • 临时目录、trap、清理和幂等性;
  • 将结果写入标准输出、标准错误和日志文件;
  • ShellCheck 和最小测试样例;
  • 日志脱敏与最小必要采集。
  • 路径或参数包含空格时脚本仍能工作;
  • 普通用户运行时不会偷偷使用 sudo;
  • 连续运行两次不会破坏已有数据;
  • 采集包足以支持排障,同时没有明显敏感信息。

遇到问题时,按下面顺序收缩范围:

  1. 目标:本来要实现什么行为?
  2. 环境:系统、架构、Shell、版本和运行方式是什么?
  3. 复现:从干净终端开始的最小命令是什么?
  4. 现象:完整错误、退出码、时间和日志是什么?
  5. 分层:问题属于文件、权限、依赖、进程、资源、网络还是应用?
  6. 假设:哪一条证据支持当前判断?
  7. 最小修改:只改一个变量,保留恢复方法;
  8. 验证:原问题是否消失,是否引入副作用?
  9. 记录:别人是否能根据记录复现并确认修复?
  • 新终端或新主机可以按 README 重复部署;
  • 服务能正常启动、停止、重启和查看日志;
  • 故障报告包含原始证据,而不是只有结论;
  • 修复没有依赖 chmod 777、长期 root、关闭防火墙或重装系统;
  • 交接者可以说明哪些部分与 WSL2、虚拟机或具体 Ubuntu 版本有关;
  • 清理后不会遗留进程、服务、敏感文件和未知系统修改。

完成主线后,应能不依赖搜索回答:

  1. Linux、Ubuntu、Bash 和 Terminal 分别是什么?
  2. 相对路径由什么决定,为什么执行删除前必须确认当前目录?
  3. 目录的读、写、执行权限分别影响什么?
  4. 为什么 sudo 和 chmod 777 不能作为通用修复方案?
  5. 标准输出、标准错误、管道和退出码怎样配合?
  6. 单引号和双引号对变量展开有什么不同?
  7. source 一个脚本为什么会改变当前 Shell?直接执行为什么通常不会?
  8. 怎样确认一个命令来自哪个文件和软件包?
  9. SIGTERM 与 SIGKILL 有什么差别?
  10. systemd 服务启动失败时先看哪些状态和日志?
  11. 能解析域名但连不上端口,与不能解析域名有什么不同?
  12. 127.0.0.1:8000、0.0.0.0:8000 和局域网地址分别意味着什么?
  13. 磁盘、分区、文件系统和挂载点是什么关系?
  14. 插入串口设备后怎样确认设备名和权限?
  15. 一份能让别人继续排障的报告至少包含哪些证据?
  • README 写明发行版、内核、架构和运行环境;
  • 安装来源、包版本和验证命令已记录;
  • 所有操作范围明确,没有依赖未知当前目录;
  • 没有提交密钥、令牌、密码、完整环境变量或敏感日志;
  • 服务以普通用户运行,权限满足最小必要范围;
  • 配置、程序、数据和日志的职责与路径清楚;
  • 启动、停止、状态、日志和恢复命令齐全;
  • 网络监听地址和端口有明确理由;
  • 正常路径和至少四类失败路径已经验证;
  • 脚本参数、引用、临时文件、退出码和清理行为已检查;
  • 没有通过禁用检查、扩大权限或删除证据掩盖失败;
  • 另一名成员已按文档完成交叉验收。

本路线可以承接 C++ 机器人开发学习路线。完成本路线后,可以按需要选择:

  1. ROS 2 机器人开发学习路线:Shell 环境、进程、DDS 网络、日志和 rosbag;
  2. PX4 无人机学习路线:Ubuntu 开发环境、串口、网络、仿真和飞控工具链。

如项目需要,可另行学习嵌入式 Linux 专项,包括交叉编译、启动流程、设备树、驱动和系统裁剪。

Linux 主线未通过时,不建议直接把 ROS、PX4 或驱动安装失败归因于“环境玄学”。先使用本路线的分层方法确认问题发生在哪一层。

目标:我想完成什么?
环境:发行版、内核、架构、Shell、原生/虚拟机/WSL2/容器
复现:从干净终端开始执行了哪些完整命令?
预期:应该出现什么进程、文件、端口或输出?
实际:完整错误、退出码、日志时间和实际状态是什么?
证据:路径、权限、包版本、进程、资源、网络和日志检查结果
判断:问题最可能位于哪一层?哪些证据支持?
修改:只改变了哪个变量?怎样恢复?
验证:原问题是否解决,正常路径和失败路径是否仍符合预期?

学习时优先阅读当前系统自带的手册和与实验版本一致的官方文档。博客和视频可用于建立直觉,但其中的过期软件源、网络命令和权限处理方式不能直接复制到实验室设备。