2026/10/9 6:36:14

学嵌入式Day1:先啃Linux基础命令,别急着点亮屏幕

学嵌入式Day1:先啃Linux基础命令,别急着点亮屏幕 学嵌入式第一天很多人恨不得马上点亮一块LCD屏幕、跑一个MQTT协议栈结果折腾三天连板子都没识别出来。我的建议反着来第一天什么都别做先把Linux基础命令在终端里敲熟。说句不太好听的话嵌入式开发的大部分时间其实都耗在编译、看日志、拷文件、部署这套流程上而这些操作全都发生在Linux命令行里。这篇笔记就是Day1的记录围绕Linux基础命令展开——文件管理、权限、系统状态、交叉编译的典型工作流再加上我踩过的几个坑。适合零基础准备转嵌入式、手头刚拿到开发板的朋友们。1. 从一块开发板到一个终端嵌入式学习为什么从Linux命令开始1.1 Linux在嵌入式里的位置比你想的更靠前很多人对嵌入式的第一印象是单片机C语言Keil确实有一部分MCU开发是这个套路。但只要你开始接触稍微复杂一点的SoC——比如全志、瑞芯微、树莓派或者ST的MP1系列跑在上面的系统基本都是Linux。你写驱动、调应用、做OTA升级、接外设绕不开这套操作系统。我当年踩过的一个误区是想先纯Windows环境做开发结果发现厂商给的SDK是Linux脚本交叉编译工具链名带着linux前缀文档里的命令全是tar、make、chmod。你在Windows上不是不能干但每走一步都在翻译别人的流程效率极低。后来我直接把主力开发环境换成了Ubuntu虚拟机很多问题瞬间就通了。还有一点很现实嵌入式岗位的面试题里Linux命令几乎是必考。ps看进程、find查文件、grep过滤日志、netstat看端口还有权限、软链接、后台运行这些都是高频题。Day1把这些底子打好后面看内核源码、交叉编译、写驱动阻力会小很多。1.2 Day1的目标不要贪多先学会活下来我给第一天的定位不是让你背完几百条命令而是让你在终端里能活下来——知道自己在哪个目录、能看到哪些文件、能把源码包解开、能把文件拷来拷去、能查系统还剩多少内存和磁盘。这几件事对应五组命令目录导航、文件管理、解压打包、权限管理、系统状态。练习方法也很笨跟着这篇笔记把每条命令敲一遍最好手敲而不是复制。我第一天学的时候专门建了一个/tmp/day1目录反复折腾用ls看变化用rm删掉自己刚建的文件又用tar打包再解压。命令这玩意儿不靠背靠手指记忆。你今天敲20遍明天再敲10遍一周之后基本忘不掉。提示如果你连虚拟机都还没装好也可以先用网页版Linux终端或者WSL这样的环境先练起来命令本身没有区别关键是动手。2. 文件和目录命令工程文件管理的四梁八柱2.1 pwd、ls、cd先搞清楚自己在哪、有什么嵌入式项目里最常见的场景是你下载了一份内核源码要进到某个子目录改配置或者SDK里的某个脚本要在指定路径下执行。这时候最基础的三条命令就是pwd、ls、cd。pwd # 告诉我当前在哪个目录比如 /home/you/project ls # 列出当前目录下的文件和文件夹 ls -l # 长格式列表能看到权限、属主、大小、修改时间 ls -a # 显示隐藏文件以 . 开头的文件都要靠 -a ls -lh # 大小用K/M/G显示比一串字节数友好得多 cd /home/you # 切换到指定目录 cd .. # 回到上一级目录 cd ~ # 回到家目录~ 就是 /home/you cd - # 回到上一次所在的目录来回切换神器我建议你把ls -l的输出认真看一次因为它藏着大量信息。比如最前面那串drwxr-xr-x第一个字符d表示这是一个目录普通文件是-后面每三个字符一组分别表示属主、属组、其他人的权限再后面是文件大小和最后修改时间。后面讲chmod的时候你要回来跟这个对照看。有个小习惯我从第一天坚持到现在每次不知道自己到哪了先pwd每次要进一个陌生目录先ls -l看一眼再动脚。终端不是图形界面没有地图给你看pwd就是你的定位系统。2.2 mkdir、cp、mv、rm工程文件的增删改查一个嵌入式工程跑起来无非是建目录、拷贝脚本、改文件名、删掉编译残留。这些动作就是mkdir、cp、mv、rm四个命令的事。mkdir project # 新建目录 mkdir -p proj/src/inc # 一次创建多级目录没有 -p 会报错 cp main.c main_backup.c # 复制文件目标名字可以改 cp -r ./mydir /home/you/backup # 复制整个目录必须加 -r mv a.c b.c # 重命名文件这是shell里改名字的方式 mv a.c ./src/ # 把文件移动到src目录下 rm test.c # 删除单个文件 rm -r build # 删除目录必须加 -r这里的坑主要在cp -r和rm -r上。我第一次复制整个源码目录的时候没加-r终端回了一句omitting directory我还以为是命令打错了。原因很简单普通文件复制是内容拷贝目录复制要递归处理里面一层层的文件所以必须显式加-r。rm也一样直接删目录会拒绝执行加了-r才肯递归删除。说到改文件名嵌入式里很常见的是给下载的固件改版本号比如firmware_v1.2.bin改成firmware_v1.3.bin。你不需要编辑器打开改mv一句话就搞定。注意mv跨目录移动时如果目标路径写错文件可能被挪到奇怪的地方所以移动之前可以先ls目标目录确认一下。2.3 tar解压源码包和工具链的第一道关嵌入式世界里的资料包十有八九是.tar.gz、.tar.bz2、.tar.xz这是Linux生态的压缩主流。交叉编译工具链、内核源码、Buildroot、SDK全是这种东西。tar命令不熟你连第一步都迈不出去。tar -xzf gcc-arm-none-eabi-10.3.tar.gz # 解压 .tar.gz tar -xvf gcc-arm-none-eabi-10.3.tar.bz2 # 解压 .tar.bz2加了 j 参数 tar -xJf linux-6.1.tar.xz # 解压 .tar.xz大写的 J tar -czf myfiles.tar.gz mydir/ # 把 mydir 打包成压缩包 tar -tf myfiles.tar.gz # 不解压只看压缩包里有啥几个参数的含义先记一下x表示解压c表示创建压缩包z表示用gzip压缩j表示用bzip2J表示用xz。f后面紧跟文件名注意f一定要写在最后因为它后面跟的是档案名。v是显示过程虽然啰嗦但新人不建议省——你能直接看到解压出来的路径和文件心里有数。解压交叉编译工具链之后还有一步很多人会忘把工具的bin目录加进PATH。比如我解压到/opt/gcc-arm-none-eabi/bin装完不能用就是因为系统不知道去哪找这个编译器。执行一下export PATH/opt/gcc-arm-none-eabi/bin:$PATH arm-none-eabi-gcc --version # 能输出版本就说明工具生效了这种export PATH的操作是嵌入式日常的基操后面每次编译不同SDK几乎都会碰到。工具链解压、加PATH、验证版本这三板斧顺下来天坑能少一半。3. 权限、用户和系统状态别让开发板在裸奔3.1 用户与权限谁在操作能做什么Linux的权限模型我一直用楼房门禁来类比你是住客属主你有钥匙能进自己的房间你不在的时候物业属组可以帮你处理一些问题至于路人其他人进不了门。每个文件和目录都有这样三组权限分别对应属主、属组、其他人。查看当前用户、切换用户、新建用户这几条命令是嵌入式工作里常常碰到的whoami # 我是谁当前登录的用户名 id # 更详细的用户ID和组ID sudo whoami # 用管理员身份执行命令输出 root su - # 切换到root用户适合一段时间的连续管理操作 sudo useradd -m -s /bin/bash devuser # 新建一个用户并创建家目录 sudo passwd devuser # 给新用户设密码权限本身用rwx三组字符表示r读、w写、x执行。改权限用chmod两种写法都要会。第一种是符号方式第二种是数字方式但实际工作里数字更常用。权限组合数字含义rwx7读写执行rw-6读写无执行r-x5读执行无写r--4只读---0无任何权限chmod 755 myscript.sh # 属主7属组5其他人5脚本可执行 chmod 644 config.txt # 属主读写其他人只读配置文件典型权限 chmod x runme # 给文件加执行权限很多新手会忘记这一步嵌入式里最常见的报错叫Permission denied。比如你下载了一个脚本./start.sh跑起来说没有权限大概率就是少了x位执行chmod x start.sh就好。另一个常见情况是设备文件权限不够访问串口、GPIO这类硬件节点有时需要sudo或者把自己加进dialout组这个等玩到板子再细说。3.2 系统状态命令查家底要有这几个开发板上跑Linux内存就128M、256M磁盘也就几百MB到几GB资源比PC紧张得多。所以看家底的命令在嵌入式场景里不是选修是必修。uname -a # 查看内核版本、主机名、系统架构 date # 查看系统时间嵌入式板子时间不同步很常见 free -m # 看内存剩余多少MB一眼可知 df -h # 看磁盘分区占用-h是人性化显示 ps -ef # 列出所有进程找僵尸进程、查残留进程好用 top # 动态看CPU和内存占用按q退出 cat /proc/cpuinfo # 看CPU型号、核心数、硬件特性 ifconfig # 看网络接口和IP地址我最常干的组合是板子起不来或者卡顿先free -m看内存再df -h看flash是否写满然后ps -ef看有没有多个残留进程在抢CPU。这三个命令加起来不过十秒却能解决八成板子变慢的问题。ps -ef的输出里每一行是一个进程PID是进程号。要干掉一个失控进程用kill PID杀不死就kill -9 PID。注意-9是强杀相当于直接断电非必要不用。3.3 嵌入式特别提醒主机和板子的世界不一样这里有一个特别容易混淆的点我每次带新人都会强调你是在PC的Linux上敲命令还是在开发板的Linux上敲命令这两个环境完全不同。uname -a在PC上显示的是x86_64在开发板上可能显示armv7l或aarch64。有一次我在主机上uname -a看到版本是6.1就以为板子上跑的内核也是6.1结果做驱动模块加载时怎么都不匹配。后来才知道板子的内核版本要去板子上查不能拿主机的结果想当然。交叉编译时代你装的工具链带着arm-前缀编译出来的程序只能在ARM板子上跑PC上直接执行会报cannot execute binary file。另外一个判断程序架构的办法是file命令file hello_arm # 输出类似 ELF 32-bit LSB executable, ARM, ... 就说明这是ARM平台程序所以养成习惯查系统信息、查架构、查内核版本都要问一句我是在哪个系统上查的。这个习惯能帮你省下大量和硬件之间鸡同鸭讲的排查时间。4. 命令串联成工作流编译、后台任务、部署一条龙4.1 从gcc到交叉编译一条命令看清编译工具链Day1学的命令看着散但它们在真实工作中是串起来用的。我来拆一个最典型的嵌入式工作流写一个C程序交叉编译传到开发板跑。先在PC上创建一个测试文件并用编辑器写点代码第一天的编辑器建议先用nano别一上来就折腾vim的退出方式mkdir -p ~/day1/hello cd ~/day1/hello nano hello.chello.c里写上一段最简单的打印代码保存退出。在Linux主机上直接编译运行gcc hello.c -o hello ./hello # 输出 Hello, Embedded!如果你拿到的是交叉编译工具链比如arm-linux-gnueabihf-gcc编译方式几乎一样export PATH/opt/arm-gcc/bin:$PATH arm-linux-gnueabihf-gcc hello.c -o hello_arm file hello_arm # 确认是ARM架构的程序看到没有唯一区别就是编译器名字带了个架构前缀。理解了这一层你对交叉编译这个词的恐惧就少了大半——它就是把编译器换成目标平台的编译器编译参数和流程没变。这个过程中用到的export PATH、which、file、mkdir、cd全是基础命令。所以Day1学的不是孤立的语法是一整套工作流的零件。4.2 nohup与重定向让任务断连也不死做嵌入式的时候经常要编译内核或跑测试脚本一跑就是十几分钟甚至几小时。最怕的是你关掉终端窗口或者SSH断开任务跟着停了。这个问题的标准解法是nohup加加重定向。nohup ./build.sh build.log 21 这一行命令拆开看nohup表示不要挂断——进程忽略终端关闭的挂断信号表示放到后台运行 build.log把标准输出写入日志文件21把错误输出也合并到同一个文件里。等任务跑完日志全在build.log里随时可以tail -f build.log实时看进度。关于重定向有几点要记牢写法含义覆盖写入文件追加写入文件2错误输出单独到文件21把错误输出重定向到标准输出所在处看到后台任务卡住了可以用ps -ef | grep build.sh找到进程号然后决定kill掉还是继续等。要查看当前终端的所有后台任务jobs列出fg %1把后台任务拉回前台。不过SSH断开后jobs就看不到了所以生产级的做法还是nohup ... 。我第一次编译Buildroot时不知道这招SSH断了一次两个小时白跑。后来习惯了任何长时间任务都写成nohup xxx log 21 再也不怕断线。这个习惯在嵌入式开发里极其加分。4.3 传输与烧写把成果送到开发板上编译出来的hello_arm要传到开发板上跑最常见的传输方式有两种网络传输scp和存储卡烧写dd。scp只要你跟开发板在同一局域网一条命令完成scp hello_arm root192.168.1.100:/root/ # 输入板子密码后文件就传过去了然后SSH到板子上直接运行ssh root192.168.1.100 cd /root ./hello_armdd则是把整个系统镜像写入SD卡或者EMMC比如给板子烧系统dd ifsystem.img of/dev/sdb bs4M statusprogressif是源文件of是目标设备bs4M是块大小statusprogress显示进度。这里要特别提醒of一定要写对写错盘符会把你PC的数据清掉。我见过的惨案包括把/dev/sdb写成了/dev/sda整块PC硬盘变成了无分区状态。所以用dd之前先执行lsblk看清楚哪个是你的SD卡设备名再下决定。5. Day1避坑清单这些坑我现在还记得5.1 rm -rf 的教训删除前先确认三秒网上流传的rm -rf /其实极少有人真打出来但把它误打出来的情况并不少见。真实场景是你想删当前目录下的所有文件敲rm -rf *结果发现自己就在根目录附近一条命令下去系统文件被删了一部分。这种错误在嵌入式开发板上尤其致命因为板子上没有多余备份。我的原则有三条从Day1起就可以建立删除前先ls确认对象避免手滑。绝对路径要写完整比如rm -rf /home/you/build而不是在/home/you下直接rm -rf build后者只说对了一半也不安全。犹豫的东西别删先mv到/tmp或改个名过几天确认没用再删。有一个我用到现在的好习惯重要的目录先打包再动手改造改坏了用tar解压恢复比什么都靠谱。5.2 终端卡住怎么办CtrlC、CtrlD、CtrlZ分清楚新手最容易在终端里陷入卡死状态然后一顿乱按。首先要分清是什么卡住了一个前台程序在跑你想中断它CtrlC发中断信号。Shell会话要退出CtrlD不是退出程序是发EOF信号给当前shell。程序在运行但你想暂停它CtrlZ挂起到后台然后fg恢复。模糊记忆的结果往往很惨。比如编译正在跑你想停下来却按了CtrlD编译任务还在shell却在不停退出。再比如你想退出某个编辑器按了CtrlZ看起来退出了其实它还在后台挂着一个任务你不清楚的时候又开了个编辑器最后整出一堆残留进程。Day1建议做个小实验让一个sleep 100跑着分别按CtrlC、CtrlZ再用ps看进程状态。搞清楚这几个组合键的区别你就不会在关键时候手足无措。5.3 练习环境怎么搭三种方式各有取舍练习Linux命令不一定非得先买开发板我有三个阶段的选择方案。最正式的是虚拟机VirtualBox或VMware里装一个Ubuntu桌面版。安装时最常见的问题是启动蓝屏或黑屏大概率跟CPU虚拟化没开有关进BIOS打开VT-x/AMD-V基本能解决其次是内存分配太少建议分2GB以上。虚拟机的好处是可以随便折腾系统坏了重装不心疼。其次是Windows自带的WSL用户态和Linux几乎一样命令兼容性很好日常练习足够。缺点是涉及串口、USB设备、实时性强的操作会比较折腾更适合前期学命令。最后是网页版Linux终端。我在没有电脑在身边的时候也用过手机上就能敲命令适合碎片时间巩固记忆。不过它毕竟是模拟环境做文件操作练习没问题一旦要碰硬件还是要回到虚拟机或真机。提示无论用哪种方式建议不要只在能跑通的层面练习刻意给自己布置一点小任务比如在/tmp下建一个带日期的目录复制三个文件进去打包然后删掉原目录这种小任务做三遍命令体系的肌肉记忆才算真正建立。第一天的体会现在回头看第一天花在Linux命令上的时间是我嵌入式学习里回报率最高的一段投入。它没有让我当时就点亮一块屏或跑通一个协议但让我在后来每一次看SDK、解内核、配环境变量、交叉编译时都能不用查手册、不用停下来想顺手就能完成。这也解释了为什么很多嵌入式学习路线都把Linux命令放在最前面——它不是可选项是你和开发板之间最基本的共同语言。如果你现在也站在Day1的起点不用焦虑记不住命令更不用急着往下冲。把今天笔记里这些命令在终端里轮番敲几遍建几个假工程、打包解压几次、假装删错一次再恢复回来一个下午下来你就已经能活在Linux命令行里了。Day2我会继续往前走到时候再看设备、串口和编辑器你会发现一切顺滑很多。