嵌入式开发,无论是调试设备、部署应用还是分析日志,都绕不开 Linux 系统。对于开发者而言,Linux 命令就是与系统对话、高效完成工作的“瑞士军刀”。这篇文章不空谈概念,直接聚焦于嵌入式开发中最常用、最核心的命令,目标是让你看完就能用,用上就见效。
我们将从文件操作、系统监控、网络调试、进程管理和开发调试五个核心场景出发,拆解每个场景下的必备命令。重点不是罗列所有命令,而是讲清楚在嵌入式开发中,这些命令具体解决什么问题、怎么组合使用、以及遇到常见错误如何排查。无论你是使用物理开发板、虚拟机还是 WSL(Windows Subsystem for Linux),这些命令都是相通的。
本文会假设你有一个基本的 Linux 环境(可以是 Ubuntu、Debian、CentOS 或其变体),并已通过终端(Terminal)或 SSH 连接到你的开发环境。我们将通过“命令说明 -> 常用参数 -> 嵌入式场景示例 -> 避坑指南”的结构,带你快速掌握。
1. 核心能力速览:嵌入式 Linux 命令工具箱
在深入细节前,先通过下表快速了解我们将要覆盖的命令领域及其在嵌入式开发中的核心价值:
| 能力领域 | 核心命令示例 | 在嵌入式开发中的主要用途 | 学习优先级 |
|---|---|---|---|
| 文件与目录操作 | ls,cd,pwd,cp,mv,rm,find,grep | 管理交叉编译工具链、内核源码、应用程序文件;查找日志和配置文件。 | 最高 |
| 文本查看与编辑 | cat,more,less,head,tail,vim/nano | 查看系统日志、配置文件;快速编辑脚本或源码。 | 最高 |
| 权限与用户管理 | chmod,chown,sudo,adduser | 设置可执行权限、管理设备文件权限、以特定用户运行服务。 | 高 |
| 系统监控与性能 | ps,top,htop,free,df,du | 监控嵌入式设备资源(内存、CPU)使用情况,排查应用卡顿或崩溃。 | 高 |
| 网络配置与调试 | ifconfig/ip,ping,netstat/ss,scp,ssh | 配置设备网络、测试连通性、传输文件、远程登录调试。 | 高 |
| 进程与任务控制 | kill,killall,jobs,fg,bg,&,nohup | 启动、停止、后台运行嵌入式应用程序或服务。 | 中 |
| 压缩与归档 | tar,gzip,unzip | 打包和解压内核镜像、根文件系统、应用程序发布包。 | 中 |
| 查找与过滤 | find,grep,which,whereis | 在庞大的源码树或日志文件中定位特定内容。 | 高 |
| 磁盘与文件系统 | mount,umount,fdisk,mkfs | 挂载 SD 卡、U 盘等存储设备,制作或修复文件系统。 | 中(特定场景下为高) |
2. 适用场景与使用边界
这套命令组合主要适用于以下嵌入式开发场景:
- 嵌入式 Linux 应用开发:在主机上交叉编译,通过命令管理代码、传输文件到目标板、远程调试。
- 系统移植与构建:操作内核源码、构建根文件系统、配置启动参数。
- 设备驱动调试:查看内核日志、操作设备节点、测试驱动功能。
- 生产环境部署与维护:登录到已部署的设备,监控状态、更新程序、排查线上问题。
- 自动化脚本编写:将一系列命令组合成 Shell 脚本,实现编译、打包、部署的自动化。
使用边界与注意事项:
- 权限意识:
rm -rf /这样的命令具有毁灭性。在嵌入式设备上操作,尤其是涉及系统文件时,务必确认当前路径和命令参数。 - 资源限制:嵌入式设备存储和内存有限。避免在设备上执行
find /这样全盘搜索的耗时操作,或生成巨大的日志文件。 - 网络依赖:
scp,ssh,apt-get等命令依赖网络。在离线或网络环境复杂的工控场景需提前准备。 - 命令差异:不同 Linux 发行版(如 BusyBox 精简系统)的命令选项可能略有不同,需注意兼容性。
3. 环境准备与前置条件
要实践这些命令,你需要一个 Linux 环境。对于嵌入式开发者,通常有以下几种选择:
- 物理开发板/设备:通过串口(Serial)或网口(SSH)登录到设备本身的 Linux 系统。这是最直接的环境。
- 虚拟机:在 Windows/Mac 主机上安装 VMware 或 VirtualBox,运行一个完整的 Linux 发行版(如 Ubuntu)。适合进行交叉编译和模拟测试。
- WSL (Windows Subsystem for Linux):在 Windows 10/11 上启用 WSL 并安装一个 Linux 发行版。它提供了原生般的 Linux 命令行体验,与 Windows 文件系统互通,非常方便。
- Docker 容器:运行一个包含交叉编译工具链的 Linux 容器,环境隔离且易于复制。
通用检查清单:
- 终端访问:确保你能打开一个命令行窗口(Terminal, PowerShell, 串口工具如 MobaXterm、Putty)。
- 用户权限:知道自己的用户名,并了解是否需要使用
sudo来获取管理员(root)权限。 - 网络连通(可选):如果你的练习涉及网络命令,确保环境可以访问网络或其他设备。
- 基础认知:理解路径的概念(绝对路径如
/home/user,相对路径如./和../)。
4. 文件与目录操作:开发者的基石
这是每天都会用到的命令集,用于导航和管理你的工作空间。
4.1 导航与查看:pwd,ls,cd
pwd:打印当前工作目录。在复杂的目录结构中随时确认自己的位置。$ pwd /home/developer/projectls:列出目录内容。嵌入式调试中,常用ls -l(长格式查看权限)、ls -a(显示隐藏文件,如.config)。# 查看 /dev 目录下的设备文件,常用于检查驱动是否成功创建节点 $ ls -l /dev/ttyUSB* crw-rw---- 1 root dialout 188, 0 Apr 10 09:30 /dev/ttyUSB0cd:切换目录。cd ~回家目录,cd -回上一个目录。$ cd /lib/modules/$(uname -r)/ # 切换到当前内核的模块目录
4.2 创建、复制、移动与删除:mkdir,cp,mv,rm
mkdir -p:递归创建目录。在创建复杂的项目源码目录结构时必备。$ mkdir -p my_project/{src,include,bin,lib} # 一次性创建多个子目录cp:复制文件或目录。
避坑:复制到$ cp -r toolchain /opt/ # 递归复制整个交叉编译工具链目录 $ cp -v firmware.bin /mnt/sdcard/ # -v 显示复制过程,确认文件已传输/dev或/sys等系统目录要极其小心,可能破坏系统。mv:移动或重命名。在部署应用时,常用它将编译好的可执行文件移动到目标位置。$ mv app_debug app_release # 重命名 $ mv app /usr/local/bin/ # 移动到系统目录rm:删除。警告:此命令不可逆。
黄金法则:执行$ rm obsolete_log.txt # 删除文件 $ rm -rf build/ # 递归强制删除整个 build 目录(清理编译中间文件)rm -rf前,务必双重检查路径。在嵌入式设备上,误删系统文件可能导致设备变砖。
4.3 查找文件与内容:find,grep
这两个命令组合是定位问题的神器。
find:在目录树中查找文件。# 在 /etc 目录下查找所有 .conf 配置文件 $ find /etc -name "*.conf" # 在当前目录及子目录中,查找最近 7 天内修改过的 .c 文件 $ find . -name "*.c" -mtime -7 # 在嵌入式根文件系统中查找所有大于 10MB 的文件 $ find / -type f -size +10M 2>/dev/null # 2>/dev/null 忽略权限错误信息grep:在文件中搜索文本模式。嵌入式开发中用于搜索日志、代码、配置项。# 在内核日志中查找包含 “error” 或 “Error” 的行 $ dmesg | grep -i error # 在多个 .c 文件中递归搜索 “gpio_init” 函数调用 $ grep -r "gpio_init" ./src/ # 搜索并显示匹配行前后的内容,方便理解上下文 $ grep -A 2 -B 2 "panic" /var/log/syslog
5. 文本查看与编辑:与日志和配置打交道
嵌入式设备没有 GUI,所有配置和日志都通过文本文件管理。
5.1 快速查看:cat,head,tail,less
cat:连接并打印文件内容。适合查看小文件。$ cat /proc/cpuinfo # 查看 CPU 信息 $ cat /proc/version # 查看内核版本head/tail:查看文件开头或结尾部分。$ head -n 20 large_log.txt # 查看日志前20行 $ tail -n 50 -f /var/log/app.log # 持续跟踪(-f)日志文件末尾,实时观察新日志tail -f是调试动态程序输出的必备工具。less:分页查看大文件,支持上下滚动、搜索。比more更强大。$ less /var/log/kern.log # 按 `q` 退出,`/` 搜索
5.2 基本编辑:vim与nano
nano:简单易用的命令行编辑器,适合新手快速修改配置。
常用操作:$ sudo nano /etc/network/interfaces # 编辑网络配置Ctrl+O保存,Ctrl+X退出,Ctrl+W搜索。vim:功能强大的编辑器,学习曲线陡峭但效率极高。嵌入式开发中,掌握基础操作足以应对大多数编辑任务。
Vim 极简生存指南:$ vim device_tree.dts # 编辑设备树文件- 打开文件:
vim filename - 进入编辑模式:按
i - 保存并退出:先按
ESC回到命令模式,然后输入:wq回车。 - 不保存退出:
ESC后输入:q!回车。 - 搜索:命令模式下输入
/keyword回车。
- 打开文件:
6. 系统监控与性能分析:洞察设备状态
嵌入式设备资源紧张,监控其健康状况至关重要。
6.1 进程查看:ps,top,htop
ps:查看当前进程快照。$ ps aux | grep my_app # 查找名为 my_app 的进程及其资源占用 $ ps -ef | grep -v grep | grep -c my_app # 统计 my_app 进程的数量aux和-ef是两种常用选项格式,输出信息类似。top:动态实时查看进程和系统资源(CPU、内存)占用。按q退出。
关键指标:$ top%CPU,%MEM,RES(实际物理内存),COMMAND。htop:top的增强版,界面更友好,支持鼠标操作。如果系统未安装,可通过sudo apt install htop安装。
6.2 内存与磁盘:free,df,du
free -h:以人类可读格式(G/M)显示内存使用情况。重点关注available列,它表示应用程序可用的内存。$ free -h total used free shared buff/cache available Mem: 1.9G 500M 200M 20M 1.2G 1.2G Swap: 2.0G 0B 2.0Gdf -h:查看磁盘空间使用情况。在部署新应用或下载大型文件前检查。$ df -h / Filesystem Size Used Avail Use% Mounted on /dev/root 15G 8.0G 5.8G 58% /du -sh:查看指定目录或文件的磁盘使用大小。$ du -sh /home/developer/ # 查看用户主目录总大小 $ du -h --max-depth=1 /var/log/ # 查看 /var/log 下一级子目录的大小
7. 网络配置与调试:连接世界的桥梁
嵌入式设备联网是常态,网络命令是调试连通性的关键。
7.1 网络配置与信息:ifconfig与ip
ifconfig(传统命令):查看和配置网络接口。$ ifconfig eth0 # 查看 eth0 网卡信息(IP, MAC, 收发数据包) $ sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up # 静态配置IPip(现代推荐):更强大的网络配置工具,属于iproute2套件。$ ip addr show # 显示所有网络接口地址信息(同 ip a) $ ip route show # 显示路由表 $ sudo ip link set eth0 up # 启用 eth0 接口 $ sudo ip addr add 192.168.1.100/24 dev eth0 # 为 eth0 添加 IP
7.2 连通性测试:ping
最基本的网络测试工具。
$ ping -c 4 8.8.8.8 # 向谷歌 DNS 发送4个包测试外网 $ ping -c 4 192.168.1.1 # 测试到网关是否通如果ping不通,可能是网络配置错误、防火墙阻止或物理链路问题。
7.3 网络状态与端口:netstat与ss
netstat:查看网络连接、路由表、接口统计等。$ netstat -tulpn | grep :80 # 查看谁在监听 80 端口 $ netstat -an | grep ESTABLISHED # 查看所有已建立的连接ss:netstat的替代品,速度更快,信息更详细。$ ss -tulpn # 功能同上,但输出更简洁高效
7.4 文件传输与远程登录:scp与ssh
scp:通过 SSH 协议安全地在主机间复制文件。嵌入式开发中用于向目标板传输程序或从设备拉取日志。# 从本地主机复制文件到远程嵌入式设备 $ scp ./app root@192.168.1.100:/home/root/ # 从远程设备复制日志到本地 $ scp root@192.168.1.100:/var/log/app.log ./ # 递归复制整个目录 $ scp -r ./project_dir/ developer@target_ip:/opt/ssh:安全地远程登录到另一台 Linux 主机(你的嵌入式设备)。
首次连接时会确认主机密钥。退出远程会话使用$ ssh root@192.168.1.100 # 以 root 用户登录 $ ssh -p 2222 developer@target_ip # 指定非默认端口 (22) 登录exit命令或Ctrl+D。
8. 权限、进程与任务控制
8.1 权限管理:chmod,chown,sudo
chmod:修改文件或目录的权限。$ chmod +x my_script.sh # 为脚本添加可执行权限 $ chmod 755 my_app # 设置权限为 rwxr-xr-x (所有者可读可写可执行,组和其他可读可执行) $ chmod -R 644 /www/data/ # 递归设置目录下所有文件为只读chown:修改文件或目录的所有者和所属组。$ sudo chown root:root /usr/bin/my_daemon # 将文件所有者和组都改为 root $ sudo chown -R www-data:www-data /var/www/html # 递归修改网站目录属主sudo:以超级用户(root)权限执行命令。嵌入式开发中,安装软件、修改系统配置常需sudo。$ sudo apt update # 更新软件包列表 $ sudo vi /etc/fstab # 编辑系统配置文件
8.2 进程控制:kill,jobs,&,nohup
kill:向进程发送信号。最常用的是SIGTERM(15,优雅终止)和SIGKILL(9,强制杀死)。$ kill 1234 # 发送 SIGTERM 给 PID 为 1234 的进程 $ kill -9 1234 # 发送 SIGKILL,强制结束进程 $ killall my_app # 结束所有名为 my_app 的进程&和jobs:在后台运行进程。$ ./long_running_task & # 在后台启动任务 $ jobs # 查看当前 shell 的后台任务列表 $ fg %1 # 将后台 1 号任务切换到前台 $ bg %1 # 将暂停的任务在后台继续运行nohup:使进程在用户退出登录后仍继续运行,并且输出重定向到文件。$ nohup ./my_server > server.log 2>&1 & # 此命令会启动 my_server,忽略挂断信号,将标准输出和错误都重定向到 server.log,并在后台运行。
9. 压缩归档与查找路径
9.1 压缩与解压:tar,gzip
tar:打包和解包文件,常与压缩工具联用。# 打包并压缩(创建) $ tar -czvf project_backup.tar.gz ./project/ # -c 创建,-z 用gzip压缩,-v 显示过程,-f 指定文件名 # 解压 $ tar -xzvf project_backup.tar.gz # -x 解压 # 仅查看包内内容 $ tar -tzvf project_backup.tar.gz # -t 列出内容
9.2 查找命令路径:which,whereis
which:在PATH环境变量指定的目录中查找命令的完整路径。$ which gcc /usr/bin/gccwhereis:查找命令的二进制文件、源码和手册页位置。$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz
10. 组合使用与实战示例
嵌入式开发中,命令很少单独使用,而是通过管道|和重定向>、>>组合,形成强大的单行指令。
示例1:快速定位问题
# 查找最近1小时内修改过的日志文件,并在其中搜索“error” $ find /var/log -name "*.log" -mmin -60 -exec grep -l "error" {} \;示例2:监控应用并记录资源使用
# 每2秒记录一次特定进程的CPU和内存占用到文件 $ while true; do ps -p $(pidof my_embedded_app) -o %cpu,%mem,cmd >> usage.log; sleep 2; done示例3:一键备份交叉编译产物
# 将 build 目录下所有 .bin 和 .elf 文件打包,并以日期命名 $ tar -czvf firmware_$(date +%Y%m%d).tar.gz $(find ./build -name "*.bin" -o -name "*.elf")示例4:通过 SSH 远程执行命令并获取结果
# 在远程设备上执行命令,并将结果保存到本地 $ ssh root@192.168.1.100 "dmesg | tail -20" > remote_dmesg.txt11. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 命令未找到 (Command not found) | 命令未安装;PATH 环境变量错误。 | which command_name或echo $PATH | 使用apt install或yum install安装;检查 PATH。 |
| 权限被拒绝 (Permission denied) | 当前用户无权执行或访问。 | ls -l查看文件权限;id查看当前用户。 | 使用sudo提权;或chmod/chown修改权限。 |
| 设备空间不足 (No space left on device) | 磁盘已满。 | df -h查看磁盘使用率;du -sh *定位大文件。 | 清理临时文件、日志或无用安装包。 |
| 网络连接失败 | IP 配置错误、服务未启动、防火墙。 | ifconfig/ip a看 IP;ping测网关;systemctl status networking。 | 正确配置 IP/网关/DNS;检查防火墙规则 (iptables -L)。 |
| 进程无法杀死 | 进程可能处于僵尸 (Z) 或内核态 (D)。 | `ps aux | grep defunct;kill -9` 无效。 |
| 文件被占用无法删除 | 有进程正在使用该文件。 | lsof | grep filename查看占用进程。 | 先结束占用进程 (kill),再删除。 |
| SSH 连接超时或拒绝 | 网络不通、SSH 服务未运行、端口错误。 | ping测试;netstat -tulpn | grep :22看 SSH 端口。 | 确保设备 SSH 服务开启 (service ssh start),检查防火墙。 |
| 交叉编译工具链不工作 | 路径错误、库缺失、架构不匹配。 | echo $PATH;file /opt/toolchain/bin/arm-linux-gcc看文件类型。 | 正确设置 PATH;安装 32 位兼容库 (lib32z1等);确认工具链与目标板架构匹配。 |
12. 最佳实践与使用建议
- 善用 Tab 补全和命令历史:在输入命令或路径时,多按
Tab键自动补全,能极大减少输入错误。使用history命令或上下箭头查找之前执行过的命令。 - 操作前先确认:在执行
rm、dd、fdisk等危险命令前,先pwd确认当前目录,或用ls预览要操作的文件。 - 理解输出重定向:
>覆盖写入文件,>>追加到文件。2>&1将标准错误重定向到标准输出。这在记录脚本输出或日志时非常有用。 - 编写 Shell 脚本自动化:将重复的命令序列写入
.sh脚本,赋予执行权限 (chmod +x)。这是提高嵌入式开发效率的关键一步。 - 掌握一个强大的文本编辑器:无论是
vim还是nano,投入时间学习其基本操作,会让你在远程设备上的编辑工作游刃有余。 - 善用手册:遇到不熟悉的命令或参数,第一时间查看手册:
man command或command --help。 - 环境变量管理:将交叉编译工具链路径、自定义库路径等加入
~/.bashrc或~/.profile,实现登录自动配置。 - 备份重要配置:在修改
/etc下的任何配置文件前,先进行备份:sudo cp /etc/xxx.conf /etc/xxx.conf.bak。
掌握这些 Linux 命令,并非要死记硬背每一个参数,而是理解其解决问题的场景和思路。从文件操作到系统监控,从网络调试到进程管理,它们构成了嵌入式开发者在 Linux 世界中最基础的生存技能。建议你立即打开你的 Linux 环境,从最常用的ls,cd,grep,ps开始,结合手头的项目进行实践。当你能熟练地将这些命令组合起来,高效地完成编译、部署、调试和问题排查时,你会发现嵌入式 Linux 开发的大门才真正向你敞开。