Linux 工程实践学习路线
本路线面向已经完成 C++ 入门、准备学习 ROS 2、PX4、嵌入式 Linux 或在远程计算机上部署程序的读者。学习目标不是背下一张命令表,而是能够安全地操作系统、理解命令产生的结果,并用证据定位常见环境问题。
这条路线要解决什么问题
Section titled “这条路线要解决什么问题”完成主线后,应该能够:
- 区分 Linux 内核、发行版、终端、Shell 和桌面环境;
- 熟练使用路径、文件、文本、管道、重定向和命令帮助;
- 理解用户、用户组、所有权、权限、
sudo和umask; - 管理软件包、环境变量和基本开发工具链;
- 观察进程、信号、资源占用、systemd 服务和系统日志;
- 根据 IP、路由、DNS、端口和进程逐层排查网络问题;
- 理解磁盘、文件系统、挂载点、设备文件和串口权限;
- 编写输入、输出和影响范围明确的 Bash 小脚本;
- 通过 SSH 在远程主机上完成部署、检查、日志收集和恢复;
- 提交一份包含环境、复现步骤、证据、判断和验证结果的故障报告。
- 操作系统:Ubuntu 22.04 LTS;
- Shell:Bash;
- 服务管理:systemd;
- 软件包管理:APT/dpkg;
- 版本管理:Git;
- 远程访问:OpenSSH;
- 编辑器:可以自选,但必须会在纯终端环境中完成最小修改;
- 操作目录:
~/linux-learning/。
Ubuntu 22.04 是为了与现有 ROS 2 Humble、PX4 和 Gazebo 环境保持一致,不代表 Linux 只等于 Ubuntu。路线中的路径、权限、进程、Shell、网络和诊断方法应尽量保持通用;发行版专有的软件包命令必须明确标注。
原生 Linux、虚拟机和 WSL2
Section titled “原生 Linux、虚拟机和 WSL2”- 文件、Shell、进程和网络基础阶段可以在原生 Ubuntu、虚拟机或 WSL2 中完成;
- 涉及 USB、串口、显卡、内核模块、实时性、局域网发现或 systemd 行为时,不能默认 WSL2 与原生 Linux 等价;
- 记录中必须写明运行环境,不能只写“Ubuntu”;
- 进入 ROS 2、PX4 或硬件实验前,应在项目实际使用的环境中重新完成相关验收。
每次实验至少记录:
cat /etc/os-releaseuname -recho "$SHELL"ps -p $$ -o pid,ppid,comm,args本路线不要求已有 Linux 经验,但开始前应当能够:
- 使用电脑创建、复制和查找文件;
- 阅读基本英文报错和命令帮助;
- 按模板记录操作步骤和结果;
- 接受“先理解现象,再修改系统”的排障方式。
如果还不熟悉文件、目录和终端的概念,先掌握阶段 0 的基础内容,不要直接照抄 ROS 或 PX4 的安装命令。
- 所有操作都在限定范围内完成。 默认只操作
~/linux-learning/,涉及系统配置时先说明影响、备份和恢复方法。 - 先看帮助,再复制命令。 优先使用
--help、man、info和项目官方文档确认参数含义。 - 先观察,再修改。 先用只读命令确认当前状态,再提出一个可以验证的假设。
- 一次只改变一个变量。 不同时换源、改权限、关防火墙和重装软件。
- 不用扩大权限掩盖问题。 不把
sudo、root 登录或chmod 777当作通用修复方法。 - 命令必须可解释。 应能说明命令、参数、输入、输出、退出码和影响范围。
- 以实际能力验收。 看完资料或成功复制一次命令不算通过。
- 保留故障证据。 完整命令、错误文本、日志时间范围和环境信息比截图更重要。
新人主线中禁止执行以下操作:
- 在不清楚当前路径时递归删除、移动或改权限;
- 对
/、/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. 故障排查 | 怎样把系统交给下一个人维护? | 陌生人可以复现、诊断、停止和恢复 |
阶段推进规则
Section titled “阶段推进规则”- 阶段 0 建立系统模型;通过后再进入文件、权限和 Shell 数据流。
- 阶段 1~3 是软件管理、进程诊断和网络排障的前置基础。
- 阶段 4~6 通过验收后,再进入存储设备和自动化脚本。
- 阶段 7~8 的安全操作与诊断能力通过验收后,再进入阶段 9 的故障排查与交接。
- 已有部分经验时,可以直接完成对应阶段的验收;不能仅凭“经常用 Linux”跳过。
阶段 0:建立 Linux 系统模型
Section titled “阶段 0:建立 Linux 系统模型”要掌握的内容
Section titled “要掌握的内容”- Linux 内核负责的范围,以及用户空间程序的角色;
- 发行版、软件仓库、桌面环境、终端模拟器和 Shell 的区别;
- 命令、Shell 内建命令、可执行文件、脚本和进程之间的关系;
- 当前用户、主机名、工作目录、环境变量和 PATH;
--help、man、info、手册章节和关键字搜索;- 退出码中
0与非0的基本约定。
- 不把 Ubuntu、Linux、Bash 和 Terminal 当作同一个概念;
- 能从帮助中找到参数,而不是只从搜索结果复制命令;
- 能说明当前实验发生在原生系统、虚拟机、容器还是 WSL2。
阶段 1:文件系统、路径和文本工具
Section titled “阶段 1:文件系统、路径和文本工具”要掌握的内容
Section titled “要掌握的内容”/、/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;- 文件大小、目录占用和“文件已删除但空间未释放”的基本概念。
- 不依赖图形文件管理器完成任务;
- 能说明每条命令会影响哪些精确路径;
- 不使用递归删除解决本来只需删除一个文件的问题;
- 能区分“文件大小”和“目录占用空间”。
阶段 2:用户、用户组和权限
Section titled “阶段 2:用户、用户组和权限”要掌握的内容
Section titled “要掌握的内容”- UID、GID、用户、主组和附加组;
- 文件所有者、所属组和其他用户;
- 普通文件与目录上的读、写、执行权限含义;
- 符号权限、八进制权限、
chmod、chown、chgrp; umask、setuid/setgid/sticky bit 只需建立概念;sudo的作用、审计意义和最小权限原则;- 串口常见的用户组权限问题。
- 能解释目录的执行权限为什么影响路径访问;
- 不用
chmod 777处理权限问题; - 使用
sudo前能说清为什么需要提升权限、命令将修改什么、如何恢复; - 能区分文件权限问题和进程、端口或设备不存在的问题。
阶段 3:Shell、管道和环境
Section titled “阶段 3:Shell、管道和环境”要掌握的内容
Section titled “要掌握的内容”- 标准输入、标准输出和标准错误;
>、>>、2>、管道及其覆盖风险;- 单引号、双引号、反斜杠、变量展开和命令替换;
- glob 与正则表达式的区别;
&&、||、;和退出码;- Shell 变量、环境变量、子进程和
export; - PATH 的查找顺序,以及
.bashrc、登录 Shell 和当前终端的区别; - 前台、后台和基本 job control。
- 变量引用时知道何时必须加双引号;
- 重定向前能判断目标文件会被覆盖还是追加;
- 不把 glob 当作
grep正则表达式; - 能使用退出码控制后续命令,而不是只看终端有没有红字。
阶段 4:软件包、命令来源和开发工具链
Section titled “阶段 4:软件包、命令来源和开发工具链”要掌握的内容
Section titled “要掌握的内容”- 发行版软件仓库、包索引、包名、版本和依赖;
apt update、apt install、apt remove与系统升级的区别;apt show、apt policy、dpkg -L、dpkg -S;- 官方仓库、PPA、第三方仓库、源码构建和下载二进制的风险差异;
- 命令查找、版本输出、动态库和架构不匹配的基本现象;
- 编译器、构建系统、头文件、库和可执行文件的关系;
- 为什么不应混用多个来源安装同一套复杂工具链。
- 不通过反复执行
apt update解决所有安装问题; - 能回答某个命令由哪个包、哪个仓库、哪个版本提供;
- 不在未说明原因时添加第三方软件源;
- 能区分包未安装、PATH 错误、架构错误和运行时依赖错误。
阶段 5:进程、信号、资源、systemd 和日志
Section titled “阶段 5:进程、信号、资源、systemd 和日志”要掌握的内容
Section titled “要掌握的内容”- 程序与进程、PID 与 PPID、前台与后台;
- 进程状态、退出码、信号和优雅停止;
ps、pgrep、top、free、uptime、lsof;kill默认发送的信号,以及SIGTERM与SIGKILL的差异;- systemd unit、service 状态、启动失败和依赖;
- 系统级服务与用户级服务;
journalctl按 unit、时间和优先级查看日志;- CPU、内存、文件描述符和僵尸进程只需掌握诊断入口。
- 能确认程序是未启动、正在运行、卡住还是已经退出;
- 能从日志中给出具体失败时间、unit、退出状态和错误文本;
- 知道交互式 Shell 中可用的环境变量不会自动出现在服务中;
- 停止服务后没有遗留进程。
阶段 6:网络、端口和 SSH
Section titled “阶段 6:网络、端口和 SSH”要掌握的内容
Section titled “要掌握的内容”- 网络接口、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:磁盘、文件系统、设备和串口”要掌握的内容
Section titled “要掌握的内容”- 块设备、分区、文件系统、挂载点和目录的关系;
- 容量、已用空间、inode 和目录占用;
lsblk、df -hT、du、findmnt、mount的只读检查用法;/dev设备文件与/sys设备信息;- USB 枚举、串口设备、设备权限和用户组;
dmesg、lsusb、udevadm的诊断用途;- 可移动设备安全卸载和写缓存的基本概念。
- 不把磁盘、分区、文件系统、目录和挂载点混为一谈;
- 空间不足时能区分块空间、inode、已删除但仍被占用的文件;
- 串口失败时先确认设备是否枚举、设备名是否变化、权限是否满足;
- 不为学习目的对系统盘或真实数据盘执行分区、格式化和修复命令。
阶段 8:Bash 自动化与诊断脚本
Section titled “阶段 8:Bash 自动化与诊断脚本”要掌握的内容
Section titled “要掌握的内容”- shebang、脚本参数、位置参数和退出码;
if、case、for、函数和局部变量;- 引用、数组、命令失败和管道失败;
set -u、set -e、pipefail的用途和局限,不能当作正确性的替代;- 临时目录、
trap、清理和幂等性; - 将结果写入标准输出、标准错误和日志文件;
- ShellCheck 和最小测试样例;
- 日志脱敏与最小必要采集。
- 路径或参数包含空格时脚本仍能工作;
- 普通用户运行时不会偷偷使用
sudo; - 连续运行两次不会破坏已有数据;
- 采集包足以支持排障,同时没有明显敏感信息。
阶段 9:故障排查与交接
Section titled “阶段 9:故障排查与交接”统一排障顺序
Section titled “统一排障顺序”遇到问题时,按下面顺序收缩范围:
- 目标:本来要实现什么行为?
- 环境:系统、架构、Shell、版本和运行方式是什么?
- 复现:从干净终端开始的最小命令是什么?
- 现象:完整错误、退出码、时间和日志是什么?
- 分层:问题属于文件、权限、依赖、进程、资源、网络还是应用?
- 假设:哪一条证据支持当前判断?
- 最小修改:只改一个变量,保留恢复方法;
- 验证:原问题是否消失,是否引入副作用?
- 记录:别人是否能根据记录复现并确认修复?
- 新终端或新主机可以按 README 重复部署;
- 服务能正常启动、停止、重启和查看日志;
- 故障报告包含原始证据,而不是只有结论;
- 修复没有依赖
chmod 777、长期 root、关闭防火墙或重装系统; - 交接者可以说明哪些部分与 WSL2、虚拟机或具体 Ubuntu 版本有关;
- 清理后不会遗留进程、服务、敏感文件和未知系统修改。
完成主线后,应能不依赖搜索回答:
- Linux、Ubuntu、Bash 和 Terminal 分别是什么?
- 相对路径由什么决定,为什么执行删除前必须确认当前目录?
- 目录的读、写、执行权限分别影响什么?
- 为什么
sudo和chmod 777不能作为通用修复方案? - 标准输出、标准错误、管道和退出码怎样配合?
- 单引号和双引号对变量展开有什么不同?
source一个脚本为什么会改变当前 Shell?直接执行为什么通常不会?- 怎样确认一个命令来自哪个文件和软件包?
SIGTERM与SIGKILL有什么差别?- systemd 服务启动失败时先看哪些状态和日志?
- 能解析域名但连不上端口,与不能解析域名有什么不同?
127.0.0.1:8000、0.0.0.0:8000和局域网地址分别意味着什么?- 磁盘、分区、文件系统和挂载点是什么关系?
- 插入串口设备后怎样确认设备名和权限?
- 一份能让别人继续排障的报告至少包含哪些证据?
提交与交接清单
Section titled “提交与交接清单”- README 写明发行版、内核、架构和运行环境;
- 安装来源、包版本和验证命令已记录;
- 所有操作范围明确,没有依赖未知当前目录;
- 没有提交密钥、令牌、密码、完整环境变量或敏感日志;
- 服务以普通用户运行,权限满足最小必要范围;
- 配置、程序、数据和日志的职责与路径清楚;
- 启动、停止、状态、日志和恢复命令齐全;
- 网络监听地址和端口有明确理由;
- 正常路径和至少四类失败路径已经验证;
- 脚本参数、引用、临时文件、退出码和清理行为已检查;
- 没有通过禁用检查、扩大权限或删除证据掩盖失败;
- 另一名成员已按文档完成交叉验收。
与后续路线的关系
Section titled “与后续路线的关系”本路线可以承接 C++ 机器人开发学习路线。完成本路线后,可以按需要选择:
- ROS 2 机器人开发学习路线:Shell 环境、进程、DDS 网络、日志和 rosbag;
- PX4 无人机学习路线:Ubuntu 开发环境、串口、网络、仿真和飞控工具链。
如项目需要,可另行学习嵌入式 Linux 专项,包括交叉编译、启动流程、设备树、驱动和系统裁剪。
Linux 主线未通过时,不建议直接把 ROS、PX4 或驱动安装失败归因于“环境玄学”。先使用本路线的分层方法确认问题发生在哪一层。
提问和故障记录模板
Section titled “提问和故障记录模板”目标:我想完成什么?环境:发行版、内核、架构、Shell、原生/虚拟机/WSL2/容器复现:从干净终端开始执行了哪些完整命令?预期:应该出现什么进程、文件、端口或输出?实际:完整错误、退出码、日志时间和实际状态是什么?证据:路径、权限、包版本、进程、资源、网络和日志检查结果判断:问题最可能位于哪一层?哪些证据支持?修改:只改变了哪个变量?怎样恢复?验证:原问题是否解决,正常路径和失败路径是否仍符合预期?相关公开资料
Section titled “相关公开资料”- Ubuntu 20.04 换源记录:需要维护旧版 Ubuntu 20.04 环境时参考。
- Conda 环境管理及常用指令:用于管理相互隔离的 Python 环境和软件包。
学习时优先阅读当前系统自带的手册和与实验版本一致的官方文档。博客和视频可用于建立直觉,但其中的过期软件源、网络命令和权限处理方式不能直接复制到实验室设备。
- 菜鸟教程:Linux 中文入门参考
- Ubuntu:Linux command line for beginners
- Ubuntu Server documentation
- Ubuntu Server:Networking
- GNU Bash Reference Manual
- GNU Coreutils Manual
- systemd Manual Pages
- OpenSSH Manual Pages
- Git Reference
- ShellCheck
- 本机手册:
man hier、man bash、man chmod、man systemctl、man journalctl、man ip、man ss、man ssh