1. 为什么嵌入式开发总在跟命令打交道,而不是"写代码"
如果你刚接触嵌入式Linux,多半有一个错觉:嵌入式开发主要工作是把代码写好、把功能调通。真入行之后你会发现自己一半以上的工作时间耗在终端里,不是在敲命令,就是在等命令执行完。板子启动、系统引导、驱动加载、文件系统挂载、进程状态排查、日志抓取、固件传输,每一步都靠命令硬碰硬地啃。不是开发板厂家没给你图形界面,而是嵌入式设备本身资源紧张,CPU、内存、Flash都捉襟见肘,图形界面是奢侈品。更重要的是,嵌入式开发面向的是系统底层,很多状态只有命令行能摸得到。
我见过不少人拿到一块嵌入式开发板,第一反应是找"图形界面"或者"IDE一键部署",然后卡在环境上一天。真正高效的做法是把终端命令当作一条通往系统底层的直梯。搜索引擎里天天有人搜"linux命令大全""linux必学的60个命令",这些列表看得人眼花缭乱,但放到嵌入式场景里,高频核心其实就几十条——文件、进程、网络、日志、系统状态,五个方向。这几十条命令用熟了,远比背三百条命令有用。
这篇文章不打算给你重复命令手册内容,而是从一个嵌入式开发一线的角度,把我在项目里真正天天用、出过问题、踩过坑的命令讲清楚。包括它们解决什么场景、参数怎么组合、在资源受限的板子上和PC上有什么不同,以及哪些细节是文档不会告诉你的。适合正准备入行嵌入式Linux的初学者,也适合刚接手板级开发但命令用得还不太顺手的工程师。
2. 文件系统与存储:排查"空间去哪了"的标准动作
2.1 df和du:在板子上找回"被吃掉"的存储空间
嵌入式设备的存储空间通常很紧张,256MB、512MB、几个GB都很常见。跑几天之后,空间莫名其妙满了是高频故障。日志文件、core dump、临时文件、升级备份包,都是空间杀手。
排查空间问题,第一板斧永远是df -h。这个命令列出各分区的已用空间、可用空间和挂载点。
root@board:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/root 480M 456M 24M 95% / tmpfs 64M 3.2M 61M 5% /tmp看到/dev/root用了95%,基本可以断定根分区快满了。这是第一步,接下来要知道具体什么东西占的空间。df只告诉你哪个分区满了,du才帮你找出元凶。
我最常用的排查组合是这样:
du -sh /var/log du -sh /home du -sh /tmp du -sh /datas汇总,h人性化显示(M/G),第一轮先把大目录筛出来。如果某个目录看起来异常大,再往下钻:
du -h --max-depth=2 /var/log这条命令会把/var/log下两层目录的占用全部列出来,一目了然。几个G的空间没了,罪魁祸首往往是一个疯狂写日志的守护进程,日志文件已经长到几百MB。这在嵌入式场景太平常了——某个库开了debug级别,或者某个服务陷入死循环疯狂打log,等发现时空间已经被吃干。
还有一个容易被忽略的点:嵌入式板子上的du -h不一定支持--max-depth参数。完整版coreutils里有,但busybox里很多精简过。busybox的du通常直接du -h /目录也能递归统计,但深度控制的画风不同。先试,不支持再换思路。
2.2 rm和find:删除操作的"安全绳"
空间找到了,接下来就是删。rm -rf是嵌入式里最常见的删除姿势,但也是最能制造灾难的命令。裸奔的rm -rf /或者手滑在变量没赋值时执行rm -rf $DIR/,分分钟让你重新烧录镜像。我在实际项目里的原则很简单:能不用-rf就不用,不得不用时先把路径用ls确认一遍。
批量清理日志文件、旧的core dump、临时编译产物,我更推荐用find加-delete或-exec,可以做条件筛选,不会把不该删的删了。
# 找到并删除7天前的日志文件 find /var/log -type f -name "*.log" -mtime +7 -delete # 找到并删除崩溃产生的core文件 find / -type f -name "core.*" -size +10M -exec rm -f {} \;注意两点:第一,-delete有顺序坑,它不会在删除前问你一句"确认吗",所以务必先不带-delete跑一遍,把将命中的文件列出来看,确认无误再真正执行。第二,-mtime +7是按"天"过滤,粒度比较粗,有些场景你需要精确到分钟,那就用-mmin(比如-mmin +120表示120分钟前修改的)。
另外嵌入式环境的shell、文件系统可能对中括号、通配符的展开方式与PC不一样,尤其是文件名带空格或者特殊字符时,find的-print0配xargs -0才是稳妥组合。虽然写起来长了点,但对系统来说更安全:
find /data/tmp -type f -name "*.tmp" -print0 | xargs -0 rm -f2.3 busybox裁剪:为什么同一命令在板子上表现不一样
这是嵌入式开发最容易碰到的知识盲区。你在Ubuntu上执行df -h输出很漂亮,有文件系统类型、有挂载点完整路径,但到了板子上df只有三列,甚至没有-h选项。别慌,这不是命令坏了,而是板子上的工具集是busybox提供的精简版。
busybox号称"嵌入式瑞士军刀",把两百多个常用命令打包到一个可执行文件里。功能够用,但每个子命令的参数被大幅裁剪。比如busybox的ls支持-l -a -h,但不一定支持--color=auto;ps可能只支持-ef和aux的简化版;top在部分板子上压根没编译进去。
判断当前环境,可以看:
ls -l /bin/ls如果显示/bin/ls -> /bin/busybox,说明你用的就是busybox。知道这一点非常重要,因为你在PC上测好的命令参数,到板子上可能直接报"unknown option"。应对办法是:写脚本时优先用POSIX通用参数,避免用GNU扩展。更细致一点,可以在板子上先busybox --list看当前编译进哪些命令,做到心中有数。
3. 进程、启动与系统状态:板子卡顿或异常时的排查链路
3.1 ps和top:看进程状态,先确认版本
嵌入式板子跑着跑着变卡了、某个进程起不来了、CPU一直100%,这种问题排查绕不开ps和top。但一上来就会遇到现实问题:完整版ps有-ef、aux、-eo pid,ppid,cmd一堆参数,busybox版却常常只支持ps -ef(System V风格)和ps aux(BSD风格),两者输出格式还不一样。
我最常用的组合是:
ps -ef | grep <进程名> ps aux | head -20看进程是否存在、占了多少CPU、启动参数是什么。比ps更直观的是top,但嵌入式上top不一定存在。如果没有,用cat /proc/meminfo和cat /proc/cpuinfo手动读取系统资源信息也行,只是要懂得怎么把这些零散信息拼起来。
比如查CPU使用率,top第一行的load average,其实是读取/proc/loadavg。手动查也可以:
cat /proc/loadavg5个数字分别代表1分钟、5分钟、15分钟的平均负载和当前运行/总线程数。看到那几个数值就大概知道系统是不是过载了。
3.2 从"进程不在了"到"为什么被杀了"的完整排查顺序
嵌入式环境里,进程消失的原因比PC上更复杂,常见的有四种:崩溃、被OOM Killer杀掉、被看门狗喂狗超时重置、被人为kill。排查时我习惯按顺序走一套链路:
第一步,确认进程现在是否在运行。
pidof <进程名> ps -ef | grep <进程名> | grep -v grep第二步,如果进程真的没了,先看内核有没有留下痕迹。dmesg里会记录内存不足(Out of Memory)杀进程的信息,还会记录Segmentation Fault等崩溃现场。
dmesg | grep -i -E "oom|killed|segfault|panic" | tail -50第三步,如果内核日志也没看出名堂,就要查系统日志。syslog、journalctl(如果板子用systemd)、或者你自己程序写入的日志文件,都要过一遍。特别是程序被看门狗踢死的情况,应用程序自己往往来不及写任何日志,必须从系统层面倒查。
第四步,检查是否有人为的kill操作。上生产环境后,我会建议写脚本定期last -x或者查看shell历史,排查是否有误操作。这套链路走下来,八成问题能定位,剩下的要么是硬件异常(过热、电压不稳),要么是驱动层面的bug,那就得配合示波器和内核调试手段了。
3.3 内核日志dmesg:启动失败与驱动加载的破案神器
dmesg在嵌入式里的价值比在PC上高得多。板子起不来、外设没反应、驱动加载失败,第一反应就应该是看dmesg。它能直接显示内核环形缓冲区里的启动日志、驱动注册信息、中断和设备树解析结果。
一个典型场景:新做的板子,SD卡检测不到。dmesg | grep -i mmc看内核是否识别到了控制器、是否枚举到了卡。如果显示mmc0: error -110这类超时错误,多半要查硬件上拉电阻、电源供电。如果根本没有mmc相关的输出,则可能是设备树里没配置节点。
排查驱动的常见做法是主动制造日志。内核模块加载时加参数:
insmod /path/to/module.ko debug=1有些驱动支持动态调试:
echo "module xxx +p" > /sys/kernel/debug/dynamic_debug/control但在实际产品里,dmesg的环形缓冲区大小有限,日志多了会被冲刷掉。稳妥做法是在启动参数里加log_buf_len=1M扩大缓冲区,或者直接让日志落到文件系统。我在带验证环境里习惯把内核日志完整保存到文件:
dmesg -n 8 dmesg > /var/log/kernel_boot.log-n 8是把日志级别设置为debug,确保信息完整。
3.4 板子启动过程与init/systemd:你需要的不是背命令,是理解流程
嵌入式Linux的启动链路通常是:Bootloader(U-Boot)→ 内核 → init进程 → 挂载根文件系统 → 启动服务。排查启动问题,命令层面的核心就是"在内核引导参数里指定 init"和"切换根文件系统"。
busybox的init使用/etc/inittab配置启动项;带systemd的板子用systemctl系列命令。两者混用要格外小心。我在一个项目里遇到板子开机后网络服务起不来,排查过程发现/etc/init.d/S40network脚本和systemd的网络服务冲突。最后整理了启动顺序,把busybox的inittab里多余条目全部注释掉,统一交给systemd管理,问题才解决。
一个重要技巧:如果应用死活起不来,可以临时在U-Boot命令行里给内核传init=/bin/sh,直接进shell手动启动服务,逐条执行、逐条观察。这个操作不要随便上生产环境,但在开发调试阶段非常好用。还有一种更优雅的方式是传rdinit=/linuxrc或init=/sbin/init,可控性更强。
4. 文本与日志处理:在串口终端里高效处理大文件
嵌入式开发离不开日志分析。应用程序、内核日志、业务调试信息,动不动就是几百MB甚至上G。板子上又没办法装专业编辑器(内存不够、Flash吃紧),所以文本处理命令的熟练度直接影响调试效率。
4.1 grep:过滤日志的正确姿势
grep是嵌入式日志分析的第一兵器,也是搜索热词里出现频率最高的命令。它一个字面理解很简单——按模式过滤行,但用好了有很多讲究。
基础场景我就不多说了,直接给几个嵌入式开发里最常用的组合:
# 在log目录所有文本文件里,同时匹配"error"或"timeout" grep -rn -E "error|timeout" /var/log/ # 只搜C源码和配置里的相关内容 grep -rn --include="*.c" --include="*.h" --include="*.conf" "CONFIG_XXX" /home/project/ # 看某个时间段的日志:在某行之前/之后各显示N行上下文 grep -n -B 5 -A 10 "FATAL" /var/log/app.log这里有几个细节值得强调。第一,-r递归搜索默认会搜二进制文件,结果里经常出现乱码,建议加-I(忽略二进制文件)。第二,-n显示行号在回溯问题时极其重要,不然你根本不知道日志在文件的什么位置。第三,-B和-A的上下文行数要按需调整——嵌入式日志打点频繁时,上下文太多反而干扰判断。
实时日志是另一大场景。用tail -f看滚动日志,配 grep 过滤关键信息:
tail -f /var/log/app.log | grep --line-buffered "ERROR"--line-buffered很关键,它让grep按行即时输出,否则你可能会看到日志一堆一堆地蹦出来,完全没法读了。这是grep文档里不常提、但实战中离不开的参数。
还有个坑:如果日志编码是UTF-8、里面夹杂中文,grep搜英文关键词没问题,搜中文要小心终端编码设置,否则匹配不上。串口终端中文乱码是家常便饭,所以我在脚本里尽量用数字或英文日志标签,从源头规避。
4.2 tail、head、sed:轮转日志与"清空大文件"的高招
日志文件几百MB、越来越大,最常见的是程序没做日志轮转。这时候你不能直接rm删,因为进程还持有文件描述符,删了之后文件空间不释放,反而变成"幽灵文件"。正确做法是清空文件内容,而不是删除文件。
高频操作是清空日志:
> /var/log/app.log这里>重定向直接截断文件,进程不受影响,文件大小归零。这也是搜索热词里 "linux清空日志log" 的真正答案。千万别看到日志快占满磁盘就rm -f /var/log/xx.log——那样做的结果是df -h看着空间没变化,因为被进程占用的inode还没释放。
还有一个使用频率不低的场景:只保留日志最后1000行,丢弃前面所有内容。
tail -n 1000 /var/log/app.log > /tmp/tmp.log && cat /tmp/tmp.log > /var/log/app.log这比用vim打开几十MB文件再手动删快得多。如果你要处理更复杂的文本编辑,而板子上又实在没有vim,sed就是救星。比如把所有IP=旧地址替换成IP=新地址:
sed -i 's/IP=10.0.0.1/IP=10.0.0.2/g' /etc/network.confsed处理百万行级别的文件完全无压力,嵌入式板子上跑也没问题。-i是原地编辑,注意先拿个小文件练手,确认表达式没问题再上生产文件,表达式写错直接原地误改,没得后悔。
4.3 awk:日志统计不需要装Python
嵌入式板子上可能要统计某个服务的调用频次、错误出现的次数、提取特定字段,装Python是不现实的,这时awk一行脚本就能解。
比如统计app.log里每分钟的日志条数,分析是否存在集体打点风暴:
awk '{print $1" "$2}' /var/log/app.log | uniq -c$1和$2按空格切分日期时间两部分,uniq -c统计相同行出现的次数。如果某分钟的数字异常高,基本就是在该时间段出了异常。
再比如从一条带协议的日志里提取IP和耗时字段。假设日志格式是:
[200 OK] src=192.168.1.10 dst=192.168.1.11 duration=142ms提取耗时并排序:
awk '/duration=/{gsub(/duration=/, "", $NF); if($NF+0 > 100) print $0}' /var/log/app.log这个例子里的$NF是最后一列,gsub把duration=前缀去掉,然后转成数值和100比较。养成这种"筛完再处理"的习惯,日志分析速度至少提升一档。
5. 网络与文件传输:板子和主机之间的命令配合
嵌入式开发的网络命令集中在两块:一是网络状态排查,二是文件/根文件系统传输。这两块痛点最多,也最值得展开。
5.1 NFS挂载根文件系统的完整链路与常见坑
搜索热词里有一个极其具体且高频的需求:嵌入式linux 根文件系统挂载 使用nfs v3。这几乎是所有带网络能力的开发板做Linux开发的必经之路——不用每次改动都重新烧写根文件系统,直接在主机上改,板子通过网络挂载启动,开发效率提高一个级别。
主机侧(Ubuntu)配置NFS服务,三件事:
# 1. 安装NFS服务 sudo apt install nfs-kernel-server # 2. 创建并导出目录,比如 /srv/nfs/rootfs sudo mkdir -p /srv/nfs/rootfs # 把交叉编译好的根文件系统内容放进去 # 3. 编辑/etc/exports 添加一行 /srv/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)no_root_squash特别重要,它允许板子以root身份对主机目录写入,否则板子上写文件会权限被映射成nobody,明明root登录却没有写权限。调试阶段建议加,产品阶段尽量不加。
配置完重启服务:
sudo exportfs -ra sudo systemctl restart nfs-kernel-server板子侧,在U-Boot环境变量里设置NFS引导参数。以典型ARM板为例:
setenv bootargs 'console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.10:/srv/nfs/rootfs,v3 ip=192.168.1.99:192.168.1.10:192.168.1.1:255.255.255.0'这里的,v3就是热词里提到的NFS v3。为什么要强调v3?因为嵌入式板子内核可能没编译NFS v4支持,或者v4的锁机制在某些精简内核里有问题。实际中我用v3最稳,兼容性最好。
NFS起不来的排查顺序,我按经验轻重排一下:
- 先 ping 通不通,板子和主机网络三层是否通。
- 主机上
showmount -e 主机IP看导出目录是否可见。 - 板子上挂载测试:NFS没挂载上之前,根文件系统都没有,所以只能提前在U-Boot里传
root=/dev/nfs配合ip=静态配置。也可以先用一个能起来的initramfs,进去后手动mount -t nfs -o nfsvers=3 主机IP:/srv/nfs/rootfs /mnt验证。 - 主机的
/etc/exports检查有没有fsid=0(如果用NFSv4否则容易出问题)、路径拼写错误。
这一套走下来,NFS挂载的问题十有八九能解决。我自己踩过最隐蔽的坑是防火墙:Ubuntu的ufw默认开着,NFS相关端口(111、2049等)没放行,板子一直连不上。关掉或者放行之后一切正常:
sudo ufw allow from 192.168.1.0/245.2 scp与串口传输:不同场景下的传输选择
嵌入式开发里,文件传输的优先级是这样排的:能用网络优先网络,网络不好用再考虑串口。网络场景下我最常用scp,原因是它基于SSH加密通道,不需要额外搭FTP服务,安全也够用。命令很简单:
# 从PC传到板子 scp ./my_app root@192.168.1.99:/usr/bin/ # 从板子拉日志回PC scp root@192.168.1.99:/var/log/app.log /tmp/scp有个注意点:如果板子的SSH服务是dropbear精简版,和OpenSSH协议兼容性一般没问题,但某些老板子可能没编译dropbear。这时退而求其次,用串口传输。
串口传文件最经典的方式是使用lrzsz工具的rz和sz命令。PC端用支持ZMODEM的终端软件(SecureCRT、MobaXterm、minicom配lrzsz),板端:
# 板端接收:PC选择要发送的文件 rz # 板端发送:把文件从串口丢回PC sz /var/log/app.log串口速度也就是115200波特率约11.5KB/s的量级,传大文件很煎熬。如果板子网络本来就通,串口传输基本只用于"网络还没有起来"的初始烧录阶段。这也是为什么在我眼里,网络通了,命令使用效率才谈得上翻身。
5.3 网络状态排查:从phy到应用层的逐层命令
嵌入式网络问题比PC更复杂,硬件PHY、驱动、IP配置、路由、DNS、应用服务,每一层都可能出问题。这也是为什么ifconfig、ip、ping是嵌入式最基本的命令,但真正会用的人不多。
排查链路我习惯从底层往上层走:
# 1. 看网卡有没有起来,有没有拿到IP ip addr show eth0 # 2. 二进制链路检测,ping网关 ping -c 3 192.168.1.1 # 3. 检查路由表 ip route show # 4. 检查端口和服务 netstat -tunlp如果PHY起来但拿不到IP(DHCPclient问题),先看DHCP客户端进程是否启动,再看/etc/network/interfaces或systemd-networkd配置。如果在板子上总是DHCP失败,建议直接改静态IP,嵌入式环境静态IP最省事:
ifconfig eth0 192.168.1.99 netmask 255.255.255.0 up route add default gw 192.168.1.1netstat -tunlp里-t是TCP、-u是UDP、-n数字显示、-l只看到监听状态、-p显示进程名。这个命令在判断"服务到底有没有监听端口"时几乎是唯一选择。还有telnet 某IP 端口可以手工测试TCP连接是否通,比自己写socket调试代码快得多。虽然telnet协议本身不安全,但在本地开发环境里做连通性测试非常方便。
6. 把命令用出效率:并行、批处理和工作习惯
命令本身是死的,真正拉开开发效率差距的是组合和习惯。这一节不讲单个命令,讲怎么让命令在嵌入式项目里成体系地跑起来。
6.1 并行执行:在多核主机上批量处理的速度提升
热词里有"并行执行linux命令",这是很容易被嵌入式开发忽视的效率点。板子本身核少,但你的Linux开发主机通常有8核、16核甚至更多核。交叉编译、批量压缩日志、批量转换资源文件,全部可以并行。
最简单的并行方式是把命令丢到后台:
for i in {1..16}; do ./handle_one.sh "file_$i" & done wait&把任务放到后台,wait等所有任务结束。这种方式胜在简单、直观,但每个子任务输出会混在一起,日志看起来会乱。
更优雅的是xargs -P:
find /data/logs -name "*.log" | xargs -P 8 -I {} gzip {}-P 8表示最多8个进程并行,-I {}把每行的内容替换进命令。这样批量压缩几百个日志文件,速度是串行的好几倍。
我实际项目里更常用的是构建和部署脚本。交叉编译耗时很长,有时候编译完还要同步到板子再重启板子,一条龙脚本才是核心竞争力。下面这段是我非常常用的一个同步脚本结构:
#!/bin/bash # 编译 && 部署 && 远程重启 make -j$(nproc) && \ scp ./build/my_app root@192.168.1.99:/usr/bin/ && \ ssh root@192.168.1.99 "sync && killall my_app && my_app &"nproc自动拿CPU核数,make -j直接用满全核。&&保证前一步成功才执行下一步,省去手工一条条敲命令的时间。脚本里我特意加了一行sync,让板子把缓存写回Flash,减少掉电丢数据的概率。这个小习惯救过我好几次。
6.2 历史记录与别名:把重复动作固化下来
嵌入式开发调试过程中,命令反复敲是常态。有两个小技巧能让日子好过很多。第一个是充分利用history,在脚本或交互环境里用!$(上一条命令的最后一个参数)、!!(上一条命令)减少重复输入。第二个是定义alias,把高频长命令压缩成短命令。
比如我调试串口时会定义:
alias mm='mount -t nfs -o nfsvers=3 192.168.1.10:/srv/nfs/rootfs /mnt' alias uw='export PATH=/opt/toolchain/bin:$PATH'这些都是当前会话临时生效的。如果想永久生效,写入/etc/profile或~/.profile。不过嵌入式板子重启后环境变量经常被重置,我建议alias放在启动脚本里,而不是只手动敲。
还有一个容易忽略的坑:板子默认shell多半是ash(busybox的shell精简版),不是bash。bash的数组、[[ ]]、source这些高级特性在ash里未必兼容。比如[[ $a == "x" ]]在ash下会报语法错误,得用[ "$a" = "x" ]这种POSIX写法。写板子上的shell脚本时,第一行#!/bin/sh,然后按POSIX语法写,最稳妥。否则你在PC上反复测好的脚本,板子上一跑直接翻车。
6.3 嵌入式板子上的包管理与软件安装:pub install的另一种姿势
热搜词里有"linux下sqlite安装命令""linux安装搜狗输入法命令"这类问题,折射出一个共性困惑——Linux上装软件到底怎么装?嵌入式环境比桌面Linux更特殊,因为网络受限、架构不同、依赖库要交叉编译。
板子上的包管理器场景要分三种:第一种,如果板子系统是完整的发行版(有些开发板确实能用 apt ),可以直接apt update && apt install xxx,但多数产品板的源更新后软件版本老掉牙,而且你装的东西未必能在该架构上跑。第二种,板子系统是基于Yocto/Buildroot构建的,主推自己在宿主机上交叉编译,制作成.ipk、.deb或.tar.gz包,再用opkg install或dpkg -i安装。第三种,什么包管理器都没有,纯静态编译拷贝进文件系统,这是嵌入式产品最常见的形态。
我自己交叉编译第三方库的标准姿势是:
./configure --prefix=/usr/local/arm --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc make -j$(nproc) make install DESTDIR=/path/to/rootfs--host指定目标架构,DESTDIR指定安装到哪个根文件系统目录。这样库文件、头文件直接落到rootfs里,打包烧录固件时一并带走。记住:不要指望在板子上现场编译,那对板子CPU和存储都是折磨。搜狗输入法这类桌面需求在嵌入式上同理——不是你跑不通,而是软件依赖的图形栈、输入法框架在板子上根本没有。
7. 命令能力的真正提升路径:从"会敲"到"会查"
关于嵌入式Linux命令,我最后真心建议一句:别去背"60个命令"、"最全手册"这类清单,那样记不住,也用不出来。我自己的学习路径是反过来的——先面对真实调试场景,在场景里需要什么查什么,把命令用成"肌肉记忆"。
一个很好的训练方式,是在你的开发主机上把man手册翻烂。网上找了很多文章的搜索结果,不如本地文档准确。比如man awk、man grep的完整说明,PC上都有,板子上未必有,但在PC上学透了对板子同样适用。
还有一个建议:给自己建一个"命令笔记本",按场景分类记录,比如"磁盘解释""网络调试""崩溃排查",每次解决一个实际问题就把用到的命令组合记下来。半年之后这就是你独有的命令手册,比任何网络下载的大全都有价值。
而如果你刚入门,我建议优先掌握这样一组组合拳:df/du看存储,ps/top/dmesg看系统运行,grep/tail/sed处理日志,ip/ifconfig/ping/scp打通网络,NFS调试根文件系统。这套组合在绝大多数嵌入式项目里够撑起日常开发调试的全部场景了。
我就是靠着这套命令体系,从拿到一块陌生的开发板到把上层应用、内核驱动、文件系统调试到基本成型,用最快的时间和板子建立起信任关系。命令不是炫耀的工具,它就是嵌入式工程师的手脚——伸得越远,你在这个领域能折腾的空间就越大。