大家好,欢迎回到电控组竞培营系列教程。
在之前的学习中,我们已经接触过不少与电控开发相关的概念。但当你准备正式开始接触嵌入式 Linux、机器人操作系统(ROS)、复杂工程项目的编译部署,或者想更高效地管理开发服务器时,会发现一个绕不开的基础技能——Linux。
很多同学在 Windows 环境下写代码、烧录单片机非常熟练,但一打开 Linux 终端就感觉无从下手。这很正常,因为 Linux 的学习路径和图形化操作习惯差异很大。本文作为竞培营第三讲,将围绕“Linux 基础与工程工具”这个主题,帮大家建立一个完整的知识框架。文章会从“为什么要学”讲起,然后覆盖环境搭建、日常高频命令、用户与权限、文本处理、网络与工程协作工具,最后给出常见报错的排查思路和实践建议。
无论你未来是做嵌入式底层开发、机器人算法部署,还是单纯想提升开发效率,这篇文章都值得你花 20 分钟耐心看完,并跟着操作一遍。
1. 为什么电控方向要掌握 Linux
很多刚接触电控的同学会有疑问:我们平时用 Keil、STM32CubeMX 都是在 Windows 下完成的,为什么还要单独学习 Linux?
1.1 嵌入式开发的必然选择
现代电控开发早已不是只写一个裸机程序那么简单。当你开始接触以下场景时,Linux 几乎是绕不开的:
- 使用 ROS(Robot Operating System)进行机器人开发时,官方主推 Ubuntu 系统;
- 交叉编译 ARM 平台程序时,大部分工具链都优先支持 Linux;
- 运行 SLAM、路径规划、视觉识别等算法库,依赖大量 Linux 环境下的开源库;
- 嵌入式 Linux 驱动开发、内核裁剪、设备树修改,需要在 Linux 主机上完成;
- 项目协同、代码版本管理、自动化构建脚本,很多团队统一使用 Linux 服务器。
即便是传统意义上的“电控”岗位,现在也越来越强调与上位机、算法、操作系统的协同能力。
1.2 效率思维的转变
Linux 最核心的思维方式是“一切皆文件,一切皆命令”。你可以用一个终端完成绝大多数工作:编辑代码、编译工程、查看日志、远程连接服务器、批量处理文件。相比之下,图形界面虽然直观,但在自动化、批量化和远程操作场景下效率明显更低。
学习 Linux 不只是学命令,更是在建立一种“基于命令行的工作流”。这种工作流一旦熟练,你后续接触 Docker、Git、CMake、交叉编译、CI/CD 等工程工具时会顺畅很多。
1.3 工程团队的协作标准
在实际工程项目中,版本管理(Git)、问题追踪、持续集成等环节高度依赖 Linux 服务器环境。即使你负责的是单片机端代码,也会涉及到在 Linux 服务器上拉取代码、执行自动化编译、查看构建日志等操作。提前掌握 Linux 基础,相当于提前适应真实的工程协作环境。
2. 环境准备与版本选择
学习 Linux 首先要有一台可用的 Linux 环境。这里提供三种常见方案,大家可以根据自己的电脑配置和项目需求选择。
2.1 安装方式对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 虚拟机(VMware / VirtualBox) | 与 Windows 共存,切换方便,可随时快照回滚 | 性能有一定损耗 | 初学者推荐,日常学习足够 |
| WSL2(Windows Subsystem for Linux) | 启动快,集成度高,可直接访问 Windows 文件 | 不支持部分硬件直通和图形界面 | 偏向开发调试、命令行工具链场景 |
| 双系统(物理安装) | 性能最好,硬件兼容性最强 | 切换系统需重启,有一定安装风险 | 需要大量编译、性能调优、驱动开发 |
2.2 发行版选择建议
Linux 发行版非常多,但对于初学者和电控方向开发,推荐优先选择Ubuntu LTS(长期支持版),比如 20.04 LTS 或 22.04 LTS。原因很简单:
- 社区资料丰富,遇到问题基本都能搜到解决方案;
- ROS 等机器人框架对 Ubuntu 支持最好;
- 软硬件兼容性好,驱动安装相对省心;
- LTS 版本维护周期长,适合长期学习使用。
其他常见发行版,比如 CentOS、Debian、Arch Linux 等,各有特点,但现阶段不建议大家花太多时间纠结。先把一个发行版用熟练,后面再按需扩展。
2.3 环境验证
安装完成后,打开终端,执行以下命令确认系统信息:
uname -a lsb_release -a whoami预期输出效果类似:
Linux ubuntu 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy如果能看到类似的系统信息,说明环境已经准备好。版本号不必完全一致,根据你自己安装的版本为准即可。
3. 高频 Linux 命令精讲
这一部分是全文的重点。我会按照“文件管理、目录跳转、内容查看、权限控制、进程管理、网络工具”几个维度拆开讲,每一条命令都会说明用途、常用参数和典型示例。
3.1 文件和目录操作
pwd
pwd用于显示当前工作目录的绝对路径。这是你迷失在目录树中时最常用的自我定位命令。
pwdls
ls列出当前目录下的文件和子目录。常用组合参数:
ls # 平铺列出文件名 ls -l # 详细信息,包括权限、属主、大小、修改时间 ls -a # 显示全部文件,包括以 . 开头的隐藏文件 ls -la # 平时最常用,查看详细列表 ls -lh # 以人类可读的方式显示文件大小(K、M、G)示例输出:
total 48 drwxr-xr-x 6 ubuntu ubuntu 4096 Dec 2 10:30 . drwxr-xr-x 3 root root 4096 Dec 2 10:18 .. -rw-rw-r-- 1 ubuntu ubuntu 220 Dec 2 10:28 main.py drwxrwxr-x 2 ubuntu ubuntu 4096 Dec 2 10:28 scripts可以看到,第一列是文件类型和权限位。d开头表示目录,-开头表示普通文件。后面每三个字符一组,分别代表属主、属组、其他用户的读(r)、写(w)、执行(x)权限。
cd
cd用于切换目录。这是使用频率最高的命令之一。
cd /home/ubuntu # 切换到绝对路径 cd .. # 返回上一级目录 cd ~ # 切换到当前用户的家目录 cd - # 切换到上一次所在目录 cd / # 切换到根目录mkdir
mkdir创建目录。常用参数:
mkdir project # 创建单级目录 mkdir -p a/b/c # 递归创建多级目录,不会因父目录不存在而报错 mkdir -p project/{src,include,build}最后这条命令会一次性创建project/src、project/include、project/build三个目录,适合初始化工程结构。
touch
touch有两个作用:创建空文件,或者修改已有文件的时间戳。
touch README.md touch -d "2024-01-01 10:00" main.crm
rm删除文件或目录。注意:Linux 下删除文件不会经过回收站,一旦删除很难恢复。
rm test.c # 删除文件 rm -r build/ # 递归删除目录 rm -f temp.log # 强制删除,不询问 rm -rf build/ # 递归强制删除,谨慎使用rm -rf是运维人员口中“删库跑路”的代名词,执行前务必确认路径是否正确。
cp
cp复制文件或目录。
cp main.c main_backup.c # 复制文件 cp -r ./config ./config_backup # 递归复制整个目录 cp -i main.c new.c # 覆盖前提示确认mv
mv移动文件,也可以用来重命名。
mv old_name.c new_name.c # 重命名 mv file.txt /home/ubuntu/docs/ # 移动到其他目录 mv ~/Downloads/installer.run /opt/ # 移动并覆盖3.2 文件内容查看与搜索
cat
cat直接输出整个文件内容,适合查看小文件。
cat /etc/os-release cat -n main.py # 显示行号less / more
当文件内容过长,一屏放不下时,用less可以分页查看。支持上下翻页、搜索等操作。
less /var/log/syslog进入less后:
- 按空格键向下翻页;
- 按
b向上翻页; - 输入
/关键词向下搜索; - 按
q退出。
这个命令在排查日志文件时非常实用。
head / tail
只看头部或尾部若干行。
head -20 main.py # 查看前 20 行 tail -50 app.log # 查看最后 50 行 tail -f app.log # 实时跟踪日志输出,调试程序时非常常用tail -f是查看运行时日志的利器。比如你在服务器上部署了一个服务,想实时观察打印输出,直接用这个命令就能持续刷新。
grep
grep在文件内容中搜索符合条件的行,是日志排查、代码检索的核心工具。
grep "ERROR" app.log # 在文件中查找包含 ERROR 的行 grep -r "TODO" ./src/ # 在整个目录中递归搜索 grep -n "int main" main.c # 显示匹配行,并带行号 grep -v "#include" main.c # 反向匹配,输出不包含 #include 的行 grep -i "error" app.log # 忽略大小写这里重点推荐grep -r的组合用法,当你接手一个陌生工程时,通过关键字快速定位相关代码位置,效率极高。
3.3 用户与权限管理
Linux 是多用户操作系统,每个文件都有属主和权限控制。团队协作开发时,经常需要创建用户、分配权限。
whoami / id
whoami # 查看当前登录用户名 id # 查看当前用户的 uid、gid 和所属组sudo
sudo让普通用户以 root 权限执行命令。注意,不是所有用户都能执行sudo,需要该用户在sudo组中。
sudo apt updateuseradd / adduser
useradd是底层命令,adduser是更友好的交互式命令,推荐新手使用后者。
sudo adduser newuser执行后系统会引导你设置密码、填写用户信息。当需要给开发机或服务器新建一个账户时,这条命令很常用。
passwd
修改密码。
passwd # 修改当前用户密码 sudo passwd root # 修改 root 用户密码chmod
chmod修改文件权限。权限表示法有两种:符号法和数字法。数字法中r=4、w=2、x=1。
chmod 755 script.sh # 属主可读写执行,属组和其他用户可读执行 chmod +x run.sh # 给所有用户增加执行权限 chmod -R 755 ./build/ # 递归修改目录下所有文件一个常见的实际场景:你写了一个脚本run.sh,但执行./run.sh时提示Permission denied。这时只需要执行chmod +x run.sh即可解决。
chown
chown修改文件属主和属组。
sudo chown ubuntu:ubuntu main.py # 将文件属主修改为 ubuntu,属组也修改为 ubuntu sudo chown -R ubuntu:ubuntu ./project # 递归修改整个目录3.4 进程与系统管理
ps
ps查看进程状态。
ps -ef # 查看所有进程的完整信息 ps aux # 查看所有进程,包含 CPU 和内存占用 ps -ef | grep python # 过滤出与 python 相关的进程top / htop
top实时显示系统资源占用和进程列表,类似 Windows 的任务管理器。htop是更友好的增强版,界面彩色,支持鼠标操作,但需要额外安装。
top sudo apt install htop htop在top界面中,按q退出,按M按内存排序,按P按 CPU 排序。
kill
kill向进程发送信号,常用于终止异常进程。
kill PID # 正常终止进程 kill -9 PID # 强制杀死进程,慎用 pkill -f python # 通过进程名匹配并终止注意:如果进程有未保存的数据,kill -9可能造成数据丢失。能先尝试普通kill就尽量不要直接上-9。
df / du
磁盘空间查看。
df -h # 查看磁盘分区使用情况,人类可读 du -sh ./build/ # 查看某个目录的总大小 du -sh * # 查看当前目录下所有子目录和文件的大小当你编译大工程时发现磁盘爆满,或者需要确认哪个目录占空间最多时,这两个命令非常实用。
systemctl
管理系统服务。这是现代 Linux 系统中服务管理的标准方式。
sudo systemctl status ssh # 查看 ssh 服务状态 sudo systemctl start ssh # 启动 ssh 服务 sudo systemctl enable ssh # 设置开机自启 sudo systemctl restart network # 重启网络服务3.5 网络工具
ping
测试网络连通性。
ping -c 4 baidu.com # 发送 4 个 ICMP 包后停止ifconfig / ip addr
查看网络接口信息,比如 IP 地址、MAC 地址。
ifconfig ip addr showssh
远程登录到 Linux 服务器。这是工程协作中最常用的命令之一。
ssh ubuntu@192.168.1.100 ssh -p 2222 ubuntu@192.168.1.100 # 指定端口第一次连接时会提示确认主机指纹,输入yes即可。之后输入密码登录。
scp
基于 SSH 协议远程复制文件,常用于上传代码到服务器、下载日志到本地。
scp main.py ubuntu@192.168.1.100:/home/ubuntu/ scp -r ./build ubuntu@192.168.1.100:/home/ubuntu/ scp ubuntu@192.168.1.100:/var/log/app.log ./wget / curl
下载文件或测试接口。
wget https://example.com/file.tar.gz curl -I https://www.baidu.com # 发起 HEAD 请求,查看响应头4. 工程工具与工作流
单纯记住命令还不够,真正的效率提升来自于将命令组合成工作流。这一节我们重点讲电控开发中最常用的工程工具。
4.1 Vim 编辑器基础
在 Linux 服务器上,如果没有图形界面,或者你想快速修改一个配置文件,就必须掌握一种终端编辑器。Vim 是 Linux 系统内置的经典编辑器,必须会基本操作。
Vim 有三种模式:
- 普通模式(Normal):默认模式,用于移动光标、删除、复制;
- 插入模式(Insert):用于输入文字,按
i进入; - 命令行模式(Command):用于保存、退出、搜索,按
:进入。
最常用的操作只记五条就够:
vim main.py # 打开文件 i # 进入插入模式,开始编辑 Esc # 回到普通模式 :wq # 保存并退出 :q! # 不保存强制退出进入插入模式后,按Esc返回普通模式,然后输入:wq回车即可保存退出。使用 Vim 时最常犯的错误是忘记切换模式,导致输入内容变成命令。多练几次就习惯了。
4.2 Git 版本管理
Git 是工程开发中不可缺少的工具。配置好 Git 后,任何代码改动都有记录,可以随时回退到历史版本。
# 配置用户信息(首次使用必须配置) git config --global user.name "Your Name" git config --global user.email "your_email@example.com" # 初始化仓库 git init # 添加文件到暂存区 git add main.c git add . # 提交到本地仓库 git commit -m "feat: add main logic" # 查看状态和日志 git status git log --oneline # 关联远程仓库并推送 git remote add origin git@github.com:user/repo.git git push -u origin main建议每位同学都注册一个 GitHub 或 Gitee 账号,把平时的练习代码托管上去,既保证代码安全,也能记录自己的成长轨迹。
4.3 编译工具链与 Make
在 Linux 下编译 C/C++ 工程,最基础的工具是gcc和make。很多时候我们并不需要手动输入超长的编译命令,而是通过 Makefile 来组织编译规则。
先看一个最简单的例子。创建一个hello.c:
#include <stdio.h> int main() { printf("Hello, Linux!\n"); return 0; }直接编译运行:
gcc hello.c -o hello ./hello当工程文件增多后,可以写一个简单的 Makefile:
CC = gcc TARGET = app OBJS = main.o utils.o $(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) main.o: main.c $(CC) -c main.c utils.o: utils.c $(CC) -c utils.c clean: rm -f $(TARGET) $(OBJS)然后在终端执行:
make # 编译 make clean # 清理对于嵌入式交叉编译,只需要把CC换成对应的交叉编译器前缀,比如arm-linux-gnueabihf-gcc。
4.4 通过 SSH 远程开发
真实的工程开发中,代码通常放在远程服务器上,本地电脑通过 SSH 连接进行操作。这个过程会用到 SSH 密钥免密登录:
# 本地生成密钥对 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 将公钥拷贝到服务器 ssh-copy-id ubuntu@192.168.1.100配置完成后,再次ssh ubuntu@192.168.1.100就不需要输入密码了。远程开发时,可以配合 VS Code 的 Remote-SSH 插件,把本地编辑器直接连接到服务器上,编码体验和本地开发几乎一致。
5. 常见问题排查与避坑指南
以下这些问题是竞培营学员初学 Linux 时最容易踩的坑,提前了解能省下大量排查时间。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
Permission denied | 文件没有执行权限或当前用户权限不足 | 检查文件权限,执行chmod +x;高权限操作前加sudo |
command not found | 命令不存在或不在 PATH 环境变量中 | 确认软件是否安装;检查 PATH 配置;多使用绝对路径 |
No space left on device | 磁盘空间已满 | 使用df -h查看分区使用情况,删除不需要的临时文件 |
| SSH 连接超时 | 防火墙拦截或服务未启动 | 确认ssh服务状态;检查端口是否开放 |
| 虚拟机无法联网 | 网络适配器模式配置错误 | 虚拟机网络模式改为 NAT 或桥接模式,重启网络服务 |
wget卡住或下载失败 | 网络原因或源地址不可达 | 更换下载源;使用国内镜像站加速 |
| 文件删除后找不到 | Linux 删除文件不经过回收站 | 定期备份重要数据;删除前用ls确认目标 |
grep搜不到结果 | 日志文件路径不对或权限不足 | 使用ls -la确认路径;必要时加sudo查看日志 |
5.1 网络源问题
国内用户使用 Ubuntu 时,默认软件源是国外服务器,下载速度往往很慢。建议将软件源更换为国内镜像源,比如清华源、阿里云源。具体操作方式是在/etc/apt/sources.list文件中替换镜像地址,然后执行:
sudo apt update这里不过多展开,搜索“Ubuntu 更换国内源”就能找到对应版本的教程。
5.2 路径问题
Linux 路径通过/分隔,不像 Windows 用\。初学者常犯的错误是:
- 使用
\作为路径分隔符; - 在文件路径中带了空格而没有使用引号或转义。
推荐做法是:所有目录和文件名尽量使用小写字母、数字、下划线,避免空格和特殊字符。
6. 最佳实践与工程建议
命令行用得越多,越能体会到规范和习惯的重要性。下面给出几条能直接提升开发效率的建议。
6.1 使用 Tab 补全和方向键历史
任何命令、路径输入到一半时,按Tab键自动补全。如果有多项匹配,连续按两次Tab会列出所有候选。按上下方向键可以快速调出历史命令。配合history命令,可以查看过往执行的所有命令。
history history | grep ssh这能显著减少输入的出错率和重复劳动。
6.2 善用命令组合
Linux 的哲学是一条命令只做一件事,然后用管道把它们组合起来。以下几个组合几乎每天都会用到:
# 实时查看日志中 ERROR 关键字 tail -f app.log | grep ERROR # 查看当前目录最大的 5 个文件 du -ah . | sort -rh | head -5 # 统计代码行数 find . -name "*.c" | xargs wc -l6.3 安全边界意识
在 Linux 下操作时,要始终保持安全意识:
sudo只用于必要的管理操作,避免长时间以 root 身份操作;- 不要随意修改系统目录下的文件属性;
- 删除命令执行前,仔细确认路径;
- 重要的工程目录应该纳入 Git 版本管理,避免不可逆的数据丢失;
- 生产环境或共享服务器上,所有变更操作前先备份。
6.4 环境隔离
如果你需要在同一台机器上使用不同版本的 Python、Node.js 或工具链,建议使用虚拟环境或容器方案。比如 Python 的venv、conda,以及近年来团队协作中非常流行的 Docker。这些工具能有效隔离依赖,避免版本冲突,提升开发体验。
6.5 建立自己的速查手册
不要试图一次记住所有命令。更高效的做法是:遇到一个不会的操作就搜索一次,并把常用命令记录到自己的笔记或仓库中,形成一份个人速查手册。经过一段时间积累,它比网上任何教程都更适合你。
7. 总结与后续学习建议
这一讲我们从“为什么要学 Linux”出发,完成了 Ubuntu 环境的准备,系统梳理了文件管理、目录跳转、内容查看、权限控制、进程管理、网络工具等高频命令,同时引入了 Vim、Git、Make 和 SSH 这几个工程开发必备工具,最后整理了初学者最常见的问题清单和实践建议。
掌握这些内容之后,你可以做到:
- 在 Linux 环境下独立完成日常文件操作和程序编译;
- 通过 SSH 远程连接开发服务器;
- 使用 Git 管理自己的代码版本;
- 看懂并编写简单的 Makefile;
- 遇到权限、路径、网络等问题时,能够自主排查。
下一步的学习路线,建议分两条线并行推进:
- 命令深化:练习 shell 脚本编写,理解环境变量、管道、重定向等核心机制;
- 工程实战:在 Ubuntu 上安装并运行 ROS、编译一个开源 C++ 项目、使用 Docker 部署一个简单服务。
Linux 的学习是一个反复练习的过程。刚开始敲命令会觉得很慢,但只要坚持用命令行替代鼠标操作,一两周之后就能明显感受到效率提升。建议把今天讲到的命令在终端中亲手敲一遍,遇到问题不要怕,多搜索、多思考、多记录。如果你在练习过程中碰到了某些奇怪报错,可以优先检查路径、权限和软件源这三个最常出问题的地方——大部分坑都能在排查完这三项之后解决。
如果这篇文章对你有帮助,可以收藏备用,也欢迎在评论区交流你在学习 Linux 过程中遇到的问题。下一讲我们会进一步深入到嵌入式交叉编译与开发工具链实战,我们到时候见。