先别急着下单开发板。如果你是零基础的新手,学嵌入式第一天决定先搞 Linux 入门,这个方向是对的。我见过太多人一上来就买开发板、找例程、点灯,结果卡在软件环境上:编译工具链装不上,代码烧不进去,文档里的命令报错一大堆,最后连问题出在哪儿都不知道。嵌入式开发离不开 Linux,这一关逃不掉。这篇文章就写给你——一个想学嵌入式、但对 Linux 完全陌生的新手,第一天应该做什么、学什么、怎么避坑。我会把当初自己从零开始踩过的路梳理一遍,给你一份可以直接照着做的清单。
1. 第一天先想清楚:为什么嵌入式要过 Linux 这关
1.1 嵌入式开发的基本盘
很多新手觉得嵌入式就是“单片机开发”,用开发板、写寄存器、烧录固件。实际上,嵌入式开发分好多个方向,其中需求量最大、技术含量比较高的就是嵌入式 Linux。小到路由器、摄像头,大到工业控制设备、车载系统,里面跑的往往是一个精简过的 Linux 系统。你想让这些设备跑起来,就得能编译出在这个设备上运行的应用程序,得能配置系统、调试驱动、处理文件权限、排查网络问题,这些全都是 Linux 操作。
我常跟身边人说一句话:单片机是嵌入式的地基,Linux 是嵌入式的主干道。如果你连 Linux 的基本操作都不熟悉,后面看任何嵌入式项目教程,都会有一种“每个中文都认识,每句命令行都看不懂”的挫败感。相反,第一天就把 Linux 的目录结构、文件命令、用户权限搞明白,后面接触交叉编译、驱动模块、系统移植,你会发现自己能更快抓住重点。
1.2 第一天到底学什么、不学什么
第一天不是让你去读那本《Linux内核源码剖析》,也不是让你背几百个命令。新手最忌讳的是方向错了还特别努力。第一天的目标应该非常克制:
- 装好一个能用的 Linux 环境,比如虚拟机里的 Ubuntu;
- 知道 Linux 的文件系统大概是什么样,根目录、家目录意味着什么;
- 掌握 15~20 个最常用的命令,包括查看文件、切换目录、复制移动、编辑文本、安装软件;
- 在这个 Linux 系统里写完并运行一个 C 语言程序。
能做到这四件事,你第一天的“Linux 入门”就非常扎实了。内核、驱动、Makefile、交叉编译这些,全都放到后面几天,第一天碰都不要碰。你要做的是先建立“在 Linux 下我能自己搞定事情”的信心。用生活里的话说:你不需要第一天就学会修发动机,你只需要先把车发动起来,踩一脚油门,知道方向盘往哪打。
2. 环境准备:用虚拟机把 Linux“装”进电脑
2.1 为什么推荐虚拟机而不是直接装双系统
新手学 Linux 遇到的第一个选择就是:怎么装 Linux?有人会告诉你直接装双系统,开机选 Windows 或 Linux,性能好、原生态。这个方案听起来很酷,但我并不建议新手第一天就这么干。双系统最大的问题是你电脑里原本的引导分区、磁盘分区都要动,一旦操作失误,可能导致电脑开不了机或数据丢失。哪怕你跟着教程每一步都走,也可能遇到显卡驱动、无线网卡、引导项错乱这些玄学问题,还没开始学嵌入式,就耗在装系统上了,很容易劝退。
虚拟机就不一样。它相当于在你当前的系统里开一个“独立房间”,房间里面安装 Linux,房间外面的 Windows 不受影响。你鼠标一点就能在 Linux 和 Windows 之间切换,文件也可以通过共享目录互相传递。虚拟机还支持快照功能,Linux 被折腾坏了,几十秒就能回到之前的干净状态。这对新手来说是最大的安全感。有人担心虚拟机性能不够,其实对于学基础命令、写 C 程序、学嵌入式软件操作来说,虚拟机完全够用,除非你以后要搞 GPU 加速、大规模编译,再考虑换物理机或服务器也不迟。
2.2 虚拟机安装 Ubuntu 的完整流程
我用得比较多的是 VirtualBox,免费、跨平台、资料多。你也可以用其他虚拟机工具,操作大同小异。整个安装过程很简单,我把它拆成几个步骤:
- 下载 Ubuntu 的镜像文件。建议选择 LTS 长期支持版本,比如 Ubuntu 22.04 LTS,新手不要追最新的测试版,稳定最重要。
- 在虚拟机软件里新建虚拟机。操作系统类型选 Linux,版本选 Ubuntu 64-bit。
- 分配内存。建议至少给 4GB,如果你的电脑内存有 16GB,可以分 6GB,分太少开机会卡,分太多宿主机又不够用。
- 创建虚拟硬盘。建议大小 40GB 左右,类型选动态分配,这样实际占用不会一上来就是 40GB,而是随着使用慢慢变大。
- 启动虚拟机,选择之前下载的 Ubuntu 镜像,进入安装界面。
- 一路选择中文、时区、键盘布局,到“安装类型”时,新手直接选“清除整个磁盘”并安装 Ubuntu。这里要注意,它清除的是虚拟机里那块虚拟磁盘,不是你电脑上的真实硬盘,不要被提示吓到。
- 设置用户名和密码。密码在 Linux 里很重要,后面执行 sudo 命令时会反复用到,不要设成太简单的弱密码。
安装完成后,Linux 会要求你重启虚拟机,然后进入桌面。到这一步,你已经成功跑起一个 Linux 系统了。
2.3 装好后必须做的三件事
系统装好只是开始,第一次开机后还有三件事,强烈建议你当场做完。这三件事能帮你避免后面很多奇奇怪怪的问题。
第一件事是更新软件源和系统。Ubuntu 装好后默认的软件下载源在有些网络环境下可能很慢。可以在软件更新设置里把下载服务器换成国内的开源镜像站,具体的设置方法网上搜“Ubuntu 换源”就能看到。换完之后打开终端,依次执行:
sudo apt update sudo apt upgrade第一条命令是刷新软件包列表,第二条是升级系统已有的软件包。这个过程可能需要几分钟,耐心等就行。更新完了,很多“软件安装不上”“依赖报错”的问题会自动消失。
第二件事是安装编写代码会用到的软件。终端里执行:
sudo apt install gcc vimgcc 是 C 语言编译器,后面你写的第一个程序要靠它编译运行。vim 是老牌文本编辑器,虽然新手会觉得退出麻烦,但以后在服务器上排查问题几乎躲不开它。如果觉得 vim 不友好,可以再装一个 nano:
sudo apt install nanonano 操作简单,新手用它写短小的代码文件非常顺手。
第三件事是配置共享文件夹。虚拟机里的 Linux 和宿主机之间传文件,默认不太方便。你可以在虚拟机设置里添加一个共享文件夹,然后在 Linux 里执行类似这样的命令来挂载:
sudo mount -t vboxsf 共享文件夹名称 /mnt/shared挂载之后,Windows 里放的文件,Linux 里能在 /mnt/shared 看到;反之亦然。这一步解决了很多“我在宿主机下好的教程,怎么弄进虚拟机”的问题。最后再给虚拟机拍一个快照,这样后面乱折腾坏了还能一键还原。这三件事做完,你的环境才算真正“能干活”。
3. 入门命令实战:从打开终端到游刃有余
3.1 终端和文件系统的第一个理解
Linux 的命令操作离不开终端。在图形界面里按 Ctrl+Alt+T 可以打开终端,你也可以在应用程序菜单里找到“终端”图标。终端看起来就是一个黑色的框,光标在等你输入命令,这其实就是一个让你和 Linux 说话的地方。
为什么嵌入式开发要依赖终端?因为很多嵌入式设备根本没有屏幕,只有串口和命令行,你总不能给路由器接个显示器开图形界面。所以,习惯在终端里操作,是 Linux 嵌入式的必修课。
理解了终端,还要理解 Linux 的文件系统。Windows 里有 C 盘、D 盘,Linux 没有盘符的概念,一切文件从根目录 / 开始,像一棵倒着的树。你在终端里输入:
pwd这条命令会显示当前所在的目录,比如 /home/用户名。常见目录的用途我列了一张表:
| 目录 | 主要用途 |
|---|---|
| / | 根目录,整个文件系统的起点 |
| /home | 普通用户的家目录,你的个人文件都在这里 |
| /etc | 系统配置文件所在地,很多服务配置都在这里 |
| /usr | 系统安装的软件和用户程序 |
| /var | 经常变化的文件,比如日志、缓存 |
| /tmp | 临时文件,重启后可能被清空 |
| /dev | 设备文件,Linux 把硬件映射成文件 |
这张表不需要背,但你至少要知道:想找自己的文件就去 /home/你的用户名,想找系统配置就去 /etc。嵌入式开发里以后会频繁操作设备节点,比如 /dev/ttyUSB0,就是串口设备对应的文件。理解了“一切皆文件”,很多奇怪的概念会自然顺过来。
3.2 高频必备命令清单与使用场景
新手最怕命令太多记不住。我的建议是不要死记,而是跟着下面的场景走一遍。你先新建一个练习目录:
mkdir ~/test cd ~/test pwdmkdir 是创建目录,cd 是进入目录,pwd 是查看当前位置。再创建文件、查看列表、复制和重命名:
touch a.txt ls -l cp a.txt b.txt mv b.txt c.txt rm c.txttouch 创建一个空文件,ls -l 查看文件详情,cp 复制,mv 移动或重命名,rm 删除。这些是每天都会用的命令。很多人会问,为什么不能直接用图形界面?因为以后你可能要通过串口远程登录设备,没有图形界面,只有命令行,这些命令就是你唯一的工具。所以现在多敲几遍并不吃亏。
查看文件内容用 cat 或 less:
cat a.txtcat 适合短文件,less 适合长文件,按 q 退出。在一堆文件里找内容可用 grep,按文件名搜索可用 find。例如:
grep "hello" a.txt find /home -name "test"grep 是嵌入式开发里排查日志的神器,以后你会经常用它过滤串口输出或日志文件。下载软件、安装软件使用 apt,压缩解压使用 tar,查看网络配置使用 ip addr 或 ifconfig,这些命令不用一天全部记住,但至少有个印象,以后用到再查。
3.3 权限和用户管理,别让 sudo 坑了你
Linux 是一个多用户系统,权限无处不在。新手最常踩的坑就是把 sudo 当成“万能钥匙”,什么命令都加 sudo。其实 sudo 的意思是“以超级用户权限执行”,它虽然能绕过权限检查,但也会掩盖问题,甚至造成安全隐患。
先看文件权限。运行 ls -l,你会看到类似这样的输出:
-rw-r--r-- 1 user user 10 Nov 12 10:00 a.txt第一段字符有 10 位,第一位表示文件类型,后面九位分成三组,分别是文件所有者权限、同组用户权限、其他用户权限。r 表示读,w 表示写,x 表示执行。如果你想给某个文件添加上执行权限,可以:
chmod +x a.txt如果想去掉写权限,可以:
chmod -w a.txt新手刚学会 chmod 往往会滥用。这里提醒一句:不要随随便便把文件改成 777,也就是所有用户都可读可写可执行。嵌入式项目里很多文件涉及系统和设备权限,权限开得过大,既不专业也不安全。你以后编译程序、运行脚本,遇到 Permission denied 时,先判断是不是当前用户对文件没有权限,再决定是加 sudo 还是用 chmod 调整。
另外,尽量不要切换到 root 用户操作。创建普通用户后,绝大多数日常工作用不到 root,遇到权限不足时用 sudo 临时提升权限就好。如果整个系统都是 root 操作,可能会出现“明明是我自己的文件,却因为所有权混乱报错”的问题。
4. 第一次用 Linux 写 C 程序:打通嵌入式编程的第一个闭环
4.1 用 nano 写一个 hello.c
前面已经说过要安装 gcc 和 nano。现在我们来完成第一天最有成就感的一件事:在 Linux 里写 C 程序并让它跑起来。先回到自己的家目录,新建一个专门的练习文件夹:
cd ~ mkdir code cd code nano hello.c这时会进入 nano 的编辑界面。nano 的提示信息显示在屏幕下方,你不用记太多,只需要记住几个关键操作:Ctrl+O 保存,Ctrl+X 退出,方向键移动光标。在 nano 里输入下面这段代码:
#include <stdio.h> int main(void) { printf("Hello, embedded Linux!\n"); return 0; }然后按 Ctrl+O,回车确认保存,再按 Ctrl+X 回到终端。这段代码就是你进入嵌入式世界打出的第一行“暗号”。如果你以后想学更强大的编辑器 vim,也可以试着用 vim 做同样的事,但第一天我不建议你死磕 vim,因为在没来得及体验写代码的乐趣之前,你很可能先被“怎么退出 vim”搞崩溃。用 nano 起步,是更平滑的选择。
4.2 gcc 编译:源代码到可执行文件经历了什么
写好的 hello.c 是文本文件,计算机并不能直接运行。我们需要用 gcc 把它变成一个可执行文件:
gcc hello.c -o hello这条命令会把 hello.c 编译成名为 hello 的可执行程序。编译成功后,当前目录会多出一个名为 hello 的文件,终端里没有报错就说明编译通过。这时运行它:
./hello如果屏幕上打印出了“Hello, embedded Linux!”,恭喜你,你已经完成了 Linux 下从源码到程序运行的整个闭环。
这里多说一句 gcc 做了什么。整个过程其实分成四个阶段:预处理、编译、汇编、链接。预处理负责处理头文件和宏定义,编译把 C 代码变成汇编代码,汇编把汇编代码变成机器指令,链接把用到的库函数连接进最终的可执行文件。这四个阶段听起来复杂,但新手阶段你只要知道 gcc 是“人类代码翻译成机器指令的桥梁”就够了。以后你会慢慢理解,为什么嵌入式开发还需要交叉编译器。在宿主机上可以用 gcc,但要编译出开发板能跑的程序,需要用专门面向 ARM 芯片的交叉编译器,比如 arm-linux-gnueabihf-gcc。第一天的你,只需要把本机 gcc 这套流程跑明白,交叉编译的原理会在后面用到时自然理解。
4.3 嵌入式的交叉编译到底是什么意思
“交叉编译”这四个字,第一次听很容易被吓住。我打个比方:你在中国生活,但想做一道地道的日本料理,你需要先学会用日式调料,最终把菜做出来,端到一个“日本用户”面前。交叉编译就是在你当前的电脑上生成另一个 CPU 架构上运行的程序。因为嵌入式开发板通常内存小、CPU 性能弱,没法像电脑一样在上面直接跑编译器,所以我们要在性能更强的 PC 上完成编译,再把生成的可执行文件传过去运行。
具体到嵌入式项目,你以后会用到的工具链大体长这样:
arm-linux-gnueabihf-gcc hello.c -o hello前面那串前缀表示目标平台是 ARM 架构、使用 GNU 工具链。第一天你完全不需要真的安装它,但你需要建立这个概念:PC 上的 Linux 和开发板上的 Linux 都叫 Linux,但因为硬件架构不同,软件不能随意通用。你现在学的命令、编辑器、文件系统概念,到了开发板上一样能用,只是编译工具不同。所以不要觉得第一天学的是“通用计算机内容”,和嵌入式没关系,恰恰相反,这是嵌入式 Linux 开发最底层、最重要的能力。
5. 第一天常见的坑和排查指南
5.1 终端“找不到命令”和 apt 源问题
新手第一天最经常遇到的一类报错是“command not found”。比如敲了 apt install,结果终端说 apt 不存在。这其实有两个可能:一是你敲错了命令名,比如把 gcc 拼成 gcc;二是你还没有安装这个软件,需要用 sudo apt install 来装。还有一种是命令本身存在,但当前用户的 PATH 环境变量没有包含它的位置,这种情况往往是因为你手动改过环境变量,新手阶段不用过多纠结。
另外一类常见问题是 apt 下载源不可用。执行 sudo apt update 时如果长时间卡住、超时或者报错,大概率是网络问题和源地址问题。换一个可用的开源镜像源,再执行 update 和 upgrade,通常能解决。这里提醒一句:apt 安装软件包时,如果系统提示依赖关系损坏,不要想当然地乱删包,先执行 sudo apt --fix-broken install,让包管理器自己去修复依赖关系。这也是我踩过几次坑之后总结出来的教训。
5.2 目录混淆、文件权限踩坑
新手在终端里最容易迷路。刚开终端,默认是在自己的家目录,也就是 /home/你的用户名。cd / 可以跳到根目录,cd .. 可以回上一级,cd ~ 可以直接回家。很多人一开始分不清绝对路径和相对路径。绝对路径从 / 开始写,比如 /home/user/code/hello.c;相对路径是相对于当前目录写的,比如你已经在 /home/user/code 里,直接写 hello.c 就行。如果发现用 cat 打不开某个文件,先执行 pwd 看一下自己是不是还在预期目录,再执行 ls -l 看一下文件是否存在。
权限问题的经典报错是 Permission denied。有时候你想写一个系统目录下的文件,比如 /etc 下的某个配置,普通用户没有权限,于是系统拒绝。正确的做法是用 sudo 临时提升权限,而不是把自己直接变成 root,也不是粗暴地 chmod 777。如果你是第一天,尽量不要去碰系统目录里的文件,先在自己家目录里折腾就够了。等我后面分享一个反例:我曾经为了改某个配置文件,直接暴力改权限,结果造成了服务无法启动,最后只能靠快照恢复。所以虚拟机的快照功能对新手来说真的重要。
5.3 虚拟机卡顿、分辨率不适配
还有一批问题出现在虚拟机本身。比如 Ubuntu 开机很慢,鼠标点击有延迟,这通常是内存分配太少或者没有安装虚拟机增强工具。建议把虚拟机内存调到 4GB 以上,开启 CPU 的虚拟化支持,并且在虚拟机菜单里安装增强功能。分辨率不适配也很常见,屏幕特别小或者不能自适应窗口大小。安装增强功能后,再重启一次,分辨率一般就能正常。
如果虚拟机整体还是卡,你可以尝试关掉 Ubuntu 的动画特效,或者改用更轻量的桌面环境。新手没必要追求界面好看,嵌入式开发很多时候只需要一个终端、一个编辑器、一个文件管理器。把图形界面的负担降下来,剩余资源留给编译和运行程序,体验会舒服很多。我自己当初在性能不太好的笔记本上跑虚拟机,就是关了好几个桌面特效,整个系统才丝滑起来。
5.4 新手心态与学习路线避坑
技术问题都算小事,心态问题和路线问题才是最容易“杀死”新手的东西。第一天很容易陷入两个极端:要么觉得命令太多记不住,开始焦虑;要么觉得自己都会了,开始狂妄。我的建议是,不要和记忆力较劲,命令是查出来的,不是背出来的。遇到不会的命令,先看终端里的报错信息,再尝试 man 命令和查看文档,最后再搜索答案。这个“先用工具,再问搜索引擎”的顺序,会帮你养成嵌入式工程师的自主排查习惯。
学习路线上要克制。第一天不要下载大量学习资料,不要收藏一堆教程,也不要去研究驱动开发和内核移植。你就盯着一个最小目标:在 Linux 里跑起来一个 C 程序。完成了这个目标,就比大多数人第一天做得好。嵌入式是一个需要长期积累的领域,Linux 基础也不是一天能学完的,它会在你后面写脚本、配置开发环境、查看日志、调试程序时一遍遍出现。第一天建立起来的这份“我能操作 Linux”的底气,才是真正值钱的东西。
我个人在实际操作中还有一个习惯:准备一个简洁的笔记文件,把当天用到的命令、遇到的报错、解决办法都记下来。这个笔记不用很完善,只要自己能看懂就行。刚开始你会觉得麻烦,但等几天后再遇到类似报错,翻笔记就能找到答案,那种“怎么这么快就解决了”的体验,比重新搜索高效太多。这个习惯从你学 Linux 的第一天开始最好,越早开始受益越大。
第一天的 Linux 入门,不需要你成为命令行专家,只需要你成功走完“装系统—敲命令—写程序—跑起来”这一圈。能走到这一圈,你已经比那些还在下载开发板例程却不知道怎么编译的人领先一步。接下来几天,可以沿着 Linux 文件系统、常用命令、vim 操作、shell 脚本、Makefile 的顺序继续深入,慢慢你会发现,那些一开始觉得陌生的东西,正在变成你解决问题的手感。