尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式开发必学:Linux命令基础与实战指南

嵌入式开发必学:Linux命令基础与实战指南 嵌入式开发这行干了这么多年被问得最多的一个问题就是做嵌入式到底要不要先把Linux学好我的回答一直都是——如果你打算在嵌入式领域正经发展Linux命令这块不是你“要不要学”而是你“根本绕不开”的必修课。搞单片机和裸机开发或许还能绕开Linux但只要你接触到嵌入式Linux、驱动开发、系统移植、应用层开发终端里那些命令就是你每天吃饭的家伙。从刚入行时对着黑乎乎的终端发怵到现在闭着眼睛都能敲出常用的那一套操作这中间踩过的坑、绕过的弯还真不少。这篇文章就结合我个人的学习和带新人的经验把嵌入式入门阶段最核心的Linux命令基础给你捋一遍。不是为了让你背命令而是帮你搞清楚这些命令背后的逻辑以及它们在真实的嵌入式项目里到底是怎么用的。1. 嵌入式为什么绕不开Linux命令1.1 先搞明白嵌入式Linux开发到底在做什么很多刚接触嵌入式的朋友对“嵌入式开发”这个概念是模糊的。以为嵌入式就是玩单片机、调电路、烧程序。这个认知没错但那只是嵌入式领域的一块拼图。真正的嵌入式Linux开发做的事情要宽得多要让一块开发板跑起来需要交叉编译工具链要裁剪系统需要配置和编译内核要把程序部署到目标板上需要通过网络传输文件程序跑了之后要调试需要在板子上敲命令查看运行状态出了问题要分析还要查看日志、查看进程、查看内存。这一整套流程几乎每一步都离不开Linux命令。可以这么说你嵌入式项目做到什么深度你的Linux命令水平就得跟上什么深度。我见过不少科班出身的朋友C语言和数据结构学得不错一进嵌入式项目组最先露怯的反而是在终端里操作。给他们一块正点原子或者野火的开发板烧录固件没问题但让他们把编译好的可执行程序通过NFS挂载到板子上运行或者看看板子当前的CPU占用率、内存使用情况立刻就卡壳了。这种情况下再好的业务逻辑代码也发挥不出来因为你根本没法把代码跑起来、调起来。1.2 命令基础是嵌入式的“底层操作系统”把Linux命令比作嵌入式的“底层操作系统”一点都不夸张。你在PC上用鼠标点来点去的那些操作在嵌入式Linux开发环境里几乎全部要转化为对应的命令来执行。开发板资源有限很多时候没有图形界面就算有调试效率也远不如命令行来得高。再说深一点嵌入式开发本质上是在做“跨机器”的开发——你在PC宿主机上写代码、交叉编译然后把产物放到板子目标机上去运行。这个“跨机器”的过程中文件传输、远程登录、进程管理、网络配置、磁盘挂载全靠Linux命令串起来。没有这套基础你甚至连开发环境和板子之间怎么建立通路都搞不明白。还有一个很多人忽视的点现在很多嵌入式岗位的面试就喜欢考Linux命令。不是考你“ls怎么用”这种无聊的东西而是考你在具体场景下用哪条命令、加什么参数、怎么组合。比如给你一台卡死的服务器你怎么找出CPU占用最高的进程并干掉它开发板启动后网络不通你怎么一步步排查这些场景考察的恰恰就是你对Linux命令的理解深度而不是背了多少条命令的名字。2. 环境搭建先给自己准备一个趁手的“练兵场”2.1 虚拟机方案新手最稳妥的选择学Linux命令第一个拦路虎就是环境。很多新手一听“装Linux”第一反应是装双系统结果分区、引导、驱动折腾一晚上还没开始学命令就先崩溃了。我的建议是如果你想系统学习嵌入式Linux用虚拟机方案起步这是投入产出比最高的选择也是我带过的新人里成功率最高的路径。推荐用VMware Workstation Pro或者Oracle VM VirtualBox这两个都是主流选择。VMware功能更全企业里用得也多VirtualBox完全免费轻量一些。在虚拟机里安装Ubuntu 20.04 LTS或22.04 LTS这两个版本长期支持软件源稳定社区资料丰富遇到问题搜索引擎一搜就能找到答案。安装虚拟机的时候有几个参数值得关注。内存建议至少分配4GB如果你的物理机有16GB内存可以给虚拟机分8GB编译的时候会更从容。硬盘建议50GB起步因为后面安装交叉编译工具链、下载内核源码、存放镜像文件都会吃掉不少空间。处理器核心数建议分配2个或更多现在的CPU基本都支持多核多分几个核心给虚拟机编译速度会有明显提升。2.2 镜像选择与源配置能省下大量折腾时间系统镜像推荐从清华TUNA或者阿里云镜像站下载。这两个是国内最稳定的开源镜像站下载速度快版本同步也及时。直接在浏览器里搜索“清华TUNA Ubuntu镜像”就能找到选择对应版本的ISO文件下载即可。装完系统后第一件事永远是配置软件源。默认的官方源在国外下载软件包的速度会让你怀疑人生。把软件源切换到阿里云或者清华源操作也很简单。Ubuntu 20.04及以后的版本用apt edit-sources命令直接编辑源列表或者手动编辑/etc/apt/sources.list这个文件把archive.ubuntu.com替换为mirrors.aliyun.com或者mirrors.tuna.tsinghua.edu.cn然后执行sudo apt update更新索引。这里有个坑得提醒一下虽然我们用上了国产镜像源本身也是个很可靠的基础设施但涉及一些内核源码下载、大的软件包拉取时还是要留意磁盘空间是否充足。另外现在国产Linux系统像统信UOS、麒麟等也越来越成熟如果以后工作中遇到国产化环境很多命令逻辑是完全相通的你在Ubuntu上练熟的基础迁移过去没有障碍。2.3 目录结构认知别急着敲命令先看懂家底环境装好了建议先做的事情不是急着敲命令而是花半个小时把Linux的目录结构摸清楚。因为我发现很多人命令学不懂根源不在于命令本身而在于根本不知道命令操作的对象在哪里为什么在那里。Linux的目录结构是一棵倒挂的树所有东西都从根目录/开始。/bin和/sbin存放系统基本命令/etc存放系统配置文件/home是用户的“家”目录/var存放日志等经常变化的文件/tmp是临时文件目录/usr存放系统用户安装的应用程序和文件。嵌入式开发里还需要特别注意/opt这个目录很多第三方的交叉编译工具链默认安装在这里比如你装个交叉编译器通常会放在/opt/下面。理解了这个结构你再回头敲命令就明白为什么有些命令需要sudo提权为什么配置文件在/etc下为什么你自己写的代码通常建议放在/home/你的用户名/下面了。这套目录规范是所有Linux发行版通用的也会直接映射到嵌入式开发板的根文件系统里去所以必须在一开始就建立这个认知框架。3. 嵌入式入门必会的8类Linux命令3.1 文件与目录操作每天敲得最多的一组命令文件操作是Linux命令的基础中的基础。ls查看目录下有什么文件cd切换目录pwd显示当前所在路径mkdir创建目录rm删除文件或目录cp复制mv移动或重命名touch创建空文件或更新时间戳。这些命令看起来简单但有几个细节新手容易忽略。第一ls -l这个组合要牢牢记住它用长格式列出文件能看到文件权限、属主、大小、修改时间等信息这是排查问题时最常用的方式。第二rm -rf是个极其危险的操作-r表示递归删除目录及其中所有内容-f表示强制删除不提示这两个参数一组合删掉的目录和文件基本找不回来。我见过有同事在板子上误执行rm -rf /的虽然现代Linux发行版本有保护机制但造成的损失已经无法挽回。第三路径中.表示当前目录..表示上一级目录这两个概念在脚本和相对路径操作中经常会用到。嵌入式场景里文件操作命令最常见的使用场景是把编译好的可执行程序复制到开发板文件系统里或者把内核镜像拷贝到启动目录下。配合scp、tftp、nfs等工具就能实现宿主机和目标板之间的文件交互。这块内容后面细说。3.2 查看文件内容日志排查全靠这几招嵌入式开发中查看文件内容、分析日志是最费时间的工作之一。cat把整个文件内容一次性输出到屏幕适合查看小文件less和more分页显示大文件内容less尤其好用支持上下翻页搜索按q退出head显示文件开头若干行tail显示文件末尾若干行tail -f是嵌入式调试的利器可以动态跟踪文件增长程序在板子上打印日志时你就能实时看到了。看内核日志常用dmesg命令在板子上插拔USB设备、加载驱动时dmesg会输出对应的内核消息。排查启动问题时要看系统日志Ubuntu这类系统上用journalctl -xe查看嵌入式板子上通常直接看/var/log/messages或者用logread命令。我当年调试一个USB转串口驱动设备连接后始终识别不到就是靠着在板子上反复dmesg查看内核打印信息才发现是设备树里引脚复用冲突导致的问题。这种排查路径如果没有日志查看命令你根本无从下手。3.3 进程管理与性能查看板子卡了怎么办嵌入式开发板资源有限跑着跑着系统变慢、程序挂起这类问题很常见。“找不到是哪根稻草压死骆驼”的时候进程管理命令就派上用场了。ps查看当前进程快照ps -ef和ps aux是最常用的两种组合。top动态显示系统实时状态包括CPU占用率、内存使用量、各进程的资源占用情况按P键可以按CPU使用率排序按M键按内存排序。找到异常进程后用kill命令终止它。kill -9 进程ID是强杀方式有风险但见效快CtrlC在前台程序运行时能中断它。需要后台运行程序时用符号比如在板子上跑一个服务程序你可以敲./server 让它转到后台。调试板子程序时有一个组合拳很实用top先找出CPU占用高的进程记下PID然后kill -9 PID干掉它接着用ps -ef | grep 程序名确认它是否真的被清掉了。这套操作配合管道符|和grep过滤效率会非常高。3.4 网络配置与调试板子连不上网排查步骤嵌入式开发离不开网络。板子和电脑要通信要么走网线直连要么接同一个交换机或路由器。Linux网络命令不熟练板子网络不通的时候你会寸步难行。ifconfig和ip addr用来查看网卡信息像板子的IP地址、MAC地址、网卡状态都是从这里看。ping是最基础的连通性测试ping 192.168.1.100能确认两个设备之间网络是否打通。板子网络不通时排查顺序基本是先ifconfig确认网卡有没有起来IP配得对不对再ping网关确认链路通不通然后ping宿主机IP确认和开发机的通路是否正常。文件传输工具也属于网络命令的范畴。scp基于SSH做文件传输scp 文件名 用户名目标IP:目标路径就能把文件拷过去。嵌入式开发板上更常用的是tftp和nfs。tftp适合小文件快速传输比如下载内核镜像到板子的内存里启动nfs网络文件系统能把宿主机的目录挂载到板子上板子直接运行宿主机上的程序方便调试循环。我在调试程序时习惯把编译产物放到NFS共享目录里板子直接挂载运行就不用反复拷贝文件了。3.5 磁盘与挂载管理存储空间不够怎么办嵌入式开发板的存储空间普遍紧张了解磁盘和挂载管理是必备技能。df -h以人类可读的格式显示磁盘空间使用情况du -sh 目录名查看某个目录占用了多大空间。开发板上跑着跑着存储满了程序会莫名其妙出问题日志打不出来临时文件写不进去。这时候df -h一看/dev/root占用100%问题定位就快了。mount是挂载命令嵌入式开发里最常用的就是挂载U盘、SD卡和NFS目录。U盘插到板子上系统一般会自动识别设备节点比如/dev/sda1输入mount /dev/sda1 /mnt就能挂载到/mnt目录下访问。挂载NFS的命令格式是mount -t nfs 宿主机IP:/共享目录 /本地挂载点 -o nolock这个命令在嵌入式调试中的应用频率极高。有个基础概念得说一下Linux下一切皆文件硬件设备也是文件。U盘、SD卡这些存储设备对应的就是/dev目录下的块设备文件串口对应的是/dev/ttyS*或/dev/ttyUSB*这些设备节点是驱动和上层应用打交道的接口。理解了这一点你对下一步学习驱动开发会顺得多。3.6 用户权限与提权为什么总是“Permission denied”“Permission denied”是新手最常见也最头疼的报错。这个报错背后的机制是Linux的文件权限模型。Linux里每个文件都有属主、属组和其他用户三类对象的读、写、执行权限。ls -l看到的-rw-r--r--这串字符第一个字符是文件类型后面9个字符分成三组分别表示属主、属组、其他人的权限。普通用户在自己的家目录里操作不会有权限问题但一旦要操作系统文件、修改配置、安装软件就需要提权。sudo命令能以root身份执行单条命令比如sudo apt install安装软件。切换用户用su命令。修改文件权限用chmod比如给脚本加可执行权限chmod x 脚本名修改文件的属主和属组用chown。嵌入式板子上经常遇到一个情况从Windows或者宿主机拷贝过去的文件在板子上执行时提示Permission denied。大多数原因是这个文件没有可执行权限用chmod x 文件名解决即可。如果是USB设备、串口设备没有操作权限那是用户没有加入对应的用户组用usermod -aG dialout 用户名把用户加到dialout组里重新登录就生效了。3.7 压缩打包与查找发布代码和定位文件的利器给自己写的代码做个备份或者把编译好的整个系统镜像发给同事压缩和打包命令就得用上。tar是Linux下最通用的打包工具tar -czvf 文件名.tar.gz 目录名表示创建一个使用gzip压缩的归档文件。解包用tar -xzvf 文件名.tar.gz。注意-c创建、-x解包、-z使用gzip压缩、-v显示过程、-f指定文件名这五个参数组合是使用频率最高的。在庞大的目录结构里找文件find命令非常高效。find / -name 文件名从根目录开始按名字查找find /home -type f -size 10M找出大于10MB的文件。还有grep命令在文件内容中搜索关键词grep -r 某个函数名 /home/项目目录/能在整个项目目录里递归搜索。嵌入式开发中经常要确认某个头文件或库文件是否存在或者在内核源码树里查某个驱动源码的位置find和grep配合使用能省一大半时间。3.8 帮助命令遇到不认识的命令怎么办命令太多了记不住这太正常了。关键是学会三个求助工具。man查看系统手册man ls显示ls命令的完整文档里面有所有参数说明。--help是很多命令自带的简洁帮助比如ls --help直接输出用法摘要。还有apropos你不知道某个功能的命令叫什么输入apropos 关键词系统会列出相关的命令列表。我给新人的建议是不要背命令用频繁的“使用查文档”来形成肌肉记忆。刚开始学Linux命令时觉得记不住就准备一个小本子把踩过的坑和对应的命令记下来。现在回顾这些笔记的价值不亚于一本Linux命令大全。4. 嵌入式开发中的Linux命令实战应用4.1 交叉编译工具链与PATH环境变量嵌入式开发与PC开发的最大区别在于交叉编译。PC上编译出的程序只能在PC架构的CPU上跑而开发板通常使用ARM架构的CPU所以需要在PC上用一个特殊的编译器编译出能在ARM平台上运行的程序这就是交叉编译工具链。装好交叉编译工具链后第一件事是把工具链的路径加到PATH环境变量里。否则系统找不到你敲的arm-linux-gnueabihf-gcc命令会提示command not found。修改环境变量可以在/etc/profile或者~/.bashrc文件里追加一行类似export PATH$PATH:/opt/gcc-arm-xxx/bin。注意这个修改要分清楚交互式shell和登录shell的加载机制改完~/.bashrc后执行source ~/.bashrc让配置立即生效。交叉编译的大致流程是用交叉编译器编译源码生成ARM平台的可执行文件再用file命令检查文件格式确认架构正确然后通过网络挂载或复制的方式把文件放到开发板上去运行。这个过程就是嵌入式应用开发的一个最小可运行闭环也是Linux命令的综合应用场景。4.2 内核与设备树编译如果你往驱动或者系统底层方向发展内核编译是绕不过去的。解压内核源码后配置内核用make menuconfig会打开一个文本交互界面。配置完成后生成.config文件然后执行make开始编译根据机器性能不同可能需要几分钟到半小时不等。编译内核模块用make modules把模块安装到目标文件系统用make modules_install INSTALL_MOD_PATH目标路径。设备树DeviceTree在嵌入式Linux中用来描述硬件信息比如开发板上用了哪个GPIO控制LED哪个I2C总线挂了哪个传感器都在设备树文件里描述。修改设备树源文件后要编译生成.dtb文件。内核和设备树的编译过程本身不复杂但整个过程对文件路径、环境变量、源码版本的敏感度很高新手最常遇到的就是在错误的内核源码版本上编译导致报错。这个环节折腾下来会对Linux命令的理解上升到新的层次因为你会开始接触Makefile、环境变量、文件路径、依赖关系这一整套系统。4.3 串口调试与终端会话管理嵌入式开发离不开串口。给开发板供电后第一件事就是通过串口连接到板子的控制台。PC端好用的串口工具不少Ubuntu下最简单的是minicom安装后执行minicom -s进入设置界面配置串口设备名比如/dev/ttyUSB0、波特率常用115200、数据位等参数。保存配置后重新启动minicom就能看到板子的启动日志。板子跑起来后这个串口终端就是一个完整的Linux控制台你可以在里面敲任何命令。另外还有一个很实用的工具screen它能管理终端会话服务端跑着重要程序时即使你断开了串口连接程序依然在后台运行重新连接后又可以恢复会话。这在需要长时间运行烧录任务或压力测试时非常方便。串口调试这块还有个高频出现的问题插上USB转串口线后系统没有生成/dev/ttyUSB*设备节点。基本排查思路是查驱动——lsusb看USB设备是否识别查权限——确认用户是否在dialout组里插拔重试——确认接线和电平逻辑。这些问题看起来无关紧要但在实际工作中会浪费大量时间一个顺畅的串口调试环境直接影响整个开发过程的效率。4.4 通过NFS实现开发板与宿主机的文件共享NFS网络文件系统在嵌入式开发里是提升调试效率的一大神器。传统做法是每次修改代码后都要把编译好的可执行文件拷贝到开发板上麻烦且占存储空间。用NFS共享后开发板可以直接挂载宿主机的一个目录你只需要在宿主机上编译开发板直接执行的就是最新代码不用来回拷贝。搭建NFS环境的步骤不复杂宿主机上安装NFS服务apt install nfs-kernel-server然后编辑/etc/exports文件添加类似/home/用户名/nfs 192.168.1.0/24(rw,sync,no_root_squash)的配置然后执行exportfs -a和systemctl restart nfs-kernel-server。开发板那边执行mount -t nfs 宿主机IP:/home/用户名/nfs /mnt -o nolock就能挂载。挂载成功后开发板上/mnt目录下的内容就是宿主机上那个目录的内容实时同步。NFS挂载失败也是有常见原因的网络不通先pingNFS服务没启动查服务状态exports配置语法错误看系统日志开发板内核是否支持NFS客户端检查内核配置。我们做项目时目标板挂载NFS失败排查到最后发现是板子系统里缺少NFS客户端工具装上nfs-common包之后问题迎刃而解。这种问题不在Linux命令本身但排查过程和命令使用密不可分。5. 学习路线建议与避坑经验分享5.1 别按顺序啃命令手册按项目需求学个人经验Linux命令的学习千万不要打开“Linux命令大全”挨个背那是学习效率最低的方式。更好的方法是带着问题学你现在要做嵌入式入门第一步往往是搭建开发环境、编译一个简单的程序那就围绕这个任务去搜索需要用到哪些命令一步步实践把用到的命令记下来。做项目的过程会驱动你学到真正派得上用场的命令。我一般带新人都是这个思路先让他们自己看视频教程装虚拟机环境装上就学会了一半常用命令再给一个简单的LED驱动例程让他们自己交叉编译、拷贝到板子上跑起来这个过程基本能把文件操作、权限管理、网络传输这几类命令练熟之后开始写自己的业务代码学会用grep定位问题、用tail看日志排查bug。这套流程走完新手手中的Linux命令体系自然就建立起来了。5.2 养成“终端比界面快”的工作习惯做嵌入式开发要有意识地摆脱图形界面的依赖养成终端操作的习惯。哪怕刚开始敲命令比鼠标点好几个来回还要慢也要硬着头皮用。因为开发板上往往没有图形界面而且以后做运维、做服务器管理终端操作是基本功。现在很多公司面试嵌入式岗位会让候选人直接在Linux终端里完成几个任务比如找到某个进程并查看它占用的资源、查看日志文件中某个关键字附近的上下文、在指定目录下查找包含特定内容的文件。这些都是终端操作的日常不可能用图形界面完成。长期在终端工作可以慢慢尝试一些效率工具比如用alias给常用命令起快捷方式alias llls -alF就能让ll输出详细信息。配置好~/.bashrc里的PS1提示符在终端中一眼看到当前用户和路径避免在不同目录之间切换时迷路。这类细节积累起来会让你的终端操作越来越顺手。5.3 这些坑我替你踩过了别再踩了最后分享几个自己在学习和带新人过程中高频出现的坑每个都是真实经历过的第一个坑是在不熟悉命令的情况下用rm -rf。我在一次清理板子存储空间时本意是想删除临时目录结果路径写错直接删掉了一个工作目录里面的编译缓存和脚本全没了一个上午的调试进度归零。从那以后凡是删除操作我都会先用ls确认要删的内容实在不确定时先mv到/tmp而不是直接rm。第二个坑是权限问题导致的各种莫名报错。有个朋友把代码放在/root目录下交叉编译结果提示找不到头文件排查了很久最后发现是权限设置导致编译工具无法读取源码目录。规范的工程目录习惯很重要建议所有项目工作目录放在/home/用户名/下面这样权限问题会少很多。第三个坑是修改配置文件后忘了重启服务导致配置不生效。编辑/etc/exports后不执行exportfs -a修改/etc/profile后不执行source这类问题新手期一定会遇到。记住一点任何配置文件修改后要么重载服务要么重新登录要么重启系统让配置真正生效。第四个坑是在网络排查时靠猜而不是靠命令。板子连不上宿主机不ping网关直接重插网线反复试白白浪费很多时间。排查网络问题时要老老实实按链路一层一层来网线连接状态、网卡状态、链路层、网络层每一步用对应的命令确认结果定位问题的效率会高很多。5.4 后续还能往哪些方向延伸Linux命令基础这个阶段打通之后后面的学习路径就清晰了。一是往应用层走去熟悉Linux系统编程学习进程间通信、多线程编程、网络socket编程这些是嵌入式应用开发的硬核内容。二是往驱动与内核方向走结合一块具体的开发板学内核模块开发、设备树编写、字符设备驱动、平台总线框架等内容。三是往系统移植方向走学会用Buildroot或者Yocto构建自己的嵌入式Linux系统裁剪内核、选配根文件系统、加入你自己的应用。我个人更推荐从应用开发切入先写出能跑的业务代码把系统调通然后顺着兴趣和业务需要往深处挖。等你写的代码越来越多自然会发现上层应用性能优化绕不开内核理解驱动开发又依赖硬件知识知识体系会顺着项目需求不断延伸。这个领域的特点是越往后知识越密集但每个阶段的努力都会带来非常直接的产出感。
返回列表