将Linux系统烧录到芯片是嵌入式开发、物联网设备部署或定制化硬件开发中的核心环节,涉及硬件准备、软件环境搭建、镜像制作、烧录执行及后续调试等多个步骤,整个过程需根据芯片架构、存储介质类型及目标设备特性进行调整,以下从基础到进阶详细说明操作流程。
硬件准备:明确目标与连接基础
烧录Linux前,需确认硬件环境是否就绪,这是避免后续问题的关键。
-
目标芯片与开发板
明确芯片型号(如ARM Cortex-A系列、RISC-V架构)及对应的开发板(如树莓派、STM32MP1、全志H3等),不同芯片的引导方式和外设接口差异较大,需查阅芯片厂商的数据手册(Datasheet)和开发板文档,确认支持的存储介质(eMMC、SD卡、NAND Flash、SPI Flash等)及烧录接口(USB、串口、JTAG/SWD等)。 -
存储介质
根据开发板接口选择存储介质:- SD卡/eMMC:常见于开发板,通过SD读卡器或eMMC转USB适配器连接电脑;
- NAND Flash:需专用烧录器或通过板载SPI/USB接口烧录;
- SPI Flash:容量较小(32MB),用于存储引导程序(如u-boot),需通过SPI工具连接。
-
连接工具
- 串口线:用于烧录过程中的日志输出和调试(通常为USB转TTL,如CH340、FT232,波特率一般设置为115200);
- USB线/JTAG调试器:部分芯片需通过USB(如OTG模式)或JTAG(如J-Link、ST-Link)烧录;
- 电源:确保开发板供电稳定(推荐使用独立电源,避免USB供电不足)。
软件环境:搭建烧录与编译平台
烧录Linux需在宿主机(如x86架构的Linux或Windows系统,推荐Linux环境,兼容性更好)上安装必要工具。
-
宿主机系统
推荐使用Ubuntu 20.04/22.04 LTS,已预装多数开发工具,避免环境配置问题。 -
交叉编译工具链
若目标芯片架构与宿主机不同(如宿主机x86,目标芯片ARM),需安装对应架构的交叉编译工具链。- ARM架构:
gcc-linaro-7.5.0-2017.12-x86_64_arm-linux-gnueabihf
- RISC-V架构:
riscv64-unknown-elf-gcc-8.3.0-2020.04.1
工具链可通过芯片厂商SDK(如NXP的Yocto SDK、瑞芯微的RKDevTool)或开源仓库安装。
- ARM架构:
-
烧录工具
根据存储介质和芯片类型选择工具:- 通用工具:
dd
(Linux内置,适用于SD卡等块设备)、BalenaEtcher
(跨平台,支持SD卡/eMMC镜像烧录); - 芯片专用工具:
- 树莓派:
Raspberry Pi Imager
(图形化,支持系统烧录); - 瑞芯微:
RKDevTool
(用于RK系列芯片eMMC烧录); - STM32:
STM32CubeProgrammer
(支持NAND Flash/SPI Flash烧录); - 英特尔/AMD:
flashrom
(用于SPI Flash烧录)。
- 树莓派:
- 通用工具:
-
镜像制作工具
- 引导程序:
u-boot
(需芯片厂商移植或自行编译); - 内核:
Linux Kernel
(从kernel.org获取主线版本或厂商提供的内核树); - 根文件系统:
Buildroot
(轻量级自动化构建)、Yocto Project
(灵活定制,适合复杂系统)、Debian/Ubuntu Rootfs
(直接使用预构建镜像)。
- 引导程序:
Linux镜像制作:构建可烧录的系统镜像
完整的Linux镜像通常包含引导程序(u-boot)、Linux内核、设备树(Device Tree)和根文件系统(Rootfs),需按顺序整合。
-
引导程序(u-boot)编译与适配
u-boot是硬件初始化和内核加载的关键,需从源码编译(芯片厂商通常提供u-boot仓库):git clone https://source.denx.de/u-boot/u-boot.git # 下载u-boot源码 cd u-boot make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- <board_name>_defconfig # 配置开发板(如stm32mp1_defconfig) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc) # 编译生成u-boot.bin/u-boot.imx
编译完成后,生成适合芯片的引导文件(如u-boot.bin、u-boot.imx),部分芯片需结合工具生成镜像(如STM32需生成.stm32文件)。
-
Linux内核编译与配置
下载对应内核版本(如5.15 LTS),配置内核以匹配硬件:wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.xz # 下载内核源码 tar -xf linux-5.15.tar.xz && cd linux-5.15 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig # 进入图形化配置
关键配置项:
System Type
→ 选择目标架构(如ARM)和开发板型号;Device Drivers
→ 启用存储驱动(如MMC、NAND)、串口驱动(UART);File Systems
→ 启用根文件系统格式(如ext4、squashfs)。
编译生成内核镜像(如arch/arm/boot/zImage)和设备树文件(arch/arm/boot/dts/*.dtb)。
-
根文件系统构建
根据需求选择构建方式:- Buildroot(推荐新手):通过
make menuconfig
选择软件包(如Python、网络工具),编译后生成rootfs.tar或rootfs.ext4镜像; - Yocto(适合复杂系统):创建layer配置,定制系统组件,生成完整镜像;
- 预构建镜像:直接下载厂商提供的rootfs(如Debian for ARM)。
- Buildroot(推荐新手):通过
-
镜像整合与分区规划
将引导程序、内核、设备树、根文件系统整合为单一镜像,常见分区方案(以SD卡为例):
| 分区 | 文件系统 | 大小 | 内容 |
|——–|———-|———|———————|
| Boot | FAT32 | 256MB | u-boot.bin、zImage、*.dtb |
| Root | ext4 | 剩余空间 | rootfs(根文件系统) |
使用fdisk
或parted
分区后,通过mkfs.vfat
、mkfs.ext4
格式化,最后用dd
或工具写入文件:# 写入引导分区(假设SD卡为/dev/sdb) sudo mount /dev/sdb1 /mnt sudo cp u-boot.bin zImage *.dtb /mnt/ sudo umount /mnt # 写入根分区(假设rootfs.img为根文件系统镜像) sudo dd if=rootfs.img of=/dev/sdb2 bs=4M status=progress
烧录执行:将镜像写入芯片存储介质
根据存储介质类型选择烧录方式,以下以SD卡、eMMC、SPI Flash为例说明。
SD卡烧录(通用)
-
方法1:dd命令(Linux)
sudo dd if=linux.img of=/dev/sdx bs=4M status=progress oflag=sync # /dev/sdx为SD卡设备名(如sdb)
注意:
oflag=sync
确保数据写入缓存,避免断电损坏。 -
方法2:BalenaEtcher(跨平台)
下载并打开BalenaEtcher,选择镜像文件(linux.img),目标设备(SD卡),点击“Flash”即可。
eMMC烧录(开发板内置)
若开发板支持eMMC且已连接USB(如OTG模式),可通过u-boot命令烧录:
# 进入u-boot命令行(通过串口或USB进入) usb start # 初始化USB设备 fatload usb 0:1 ${loadaddr} linux.img # 从U盘加载镜像到内存地址${loadaddr} mmc dev 0 # 选择eMMC设备(通常为0) mmc write ${loadaddr} 0 0x10000 # 写入镜像(地址0,写入块数0x10000,根据镜像大小调整)
或使用芯片专用工具(如RKDevTool),选择eMMC设备,导入镜像文件点击“烧录”。
SPI Flash烧录(小容量存储)
SPI Flash用于存储u-boot等引导程序,需使用专用工具:
- flashrom(Linux):
sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -u -w u-boot.bin # 写入u-boot.bin到SPI Flash
- STM32CubeProgrammer:通过ST-Link连接,选择“SPI Flash”选项,导入u-boot文件后点击“Download”。
验证与调试:确保系统正常启动
烧录完成后,需验证系统是否能正常启动,排查常见问题。
-
启动日志检查
通过串口连接开发板,上电后观察u-boot和内核启动日志:- u-boot阶段:检查是否从正确存储介质启动(如“MMC: 1”表示SD卡),是否加载内核(如“Loading from MMC device 1:1”);
- 内核阶段:检查设备树是否加载成功(如“Booting Linux on physical CPU 0x0”),根文件系统是否挂载(如“VFS: Mounted root (ext4 filesystem) readonly”)。
-
常见问题排查
- 问题1:串口无输出
原因:波特率不匹配(检查开发板默认波特率,如115200)、串口线接触不良、芯片未上电。
解决:重新连接串口线,确认波特率,检查电源电压(如3.3V/5V)。 - 问题2:u-boot加载内核失败
原因:镜像文件损坏(重新烧录)、存储介质分区错误(用fdisk
检查分区表)、u-boot bootcmd配置错误(修改u-boot环境变量bootcmd
,如setenv bootcmd 'fatload mmc 0:1 ${loadaddr} zImage; bootz ${loadaddr}'
)。 - 问题3:内核启动后卡死
原因:设备树不匹配(重新编译设备树,确保与芯片外设一致)、内核驱动缺失(重新配置内核,启用对应驱动)、根文件系统损坏(重新制作镜像)。
- 问题1:串口无输出
常见存储介质烧录工具对比
存储介质 | 推荐工具 | 烧录命令/操作 | 注意事项 |
---|---|---|---|
SD卡 | dd、BalenaEtcher | dd if=xxx.img of=/dev/sdx |
确认设备名,避免误系统盘 |
eMMC | u-boot命令、RKDevTool | mmc write ${addr} 0 0x10000 |
需开发板支持eMMC烧录模式 |
NAND Flash | STM32CubeProgrammer | 通过ST-Link连接,选择“NAND Flash” | 注意坏块管理,部分芯片需专用工具 |
SPI Flash | flashrom、J-Link | flashrom -p linux_spi -w u-boot.bin |
确认SPI设备节点(如/dev/spidev0.0) |
相关问答FAQs
Q1:烧录Linux镜像后设备无法启动,如何排查?
A:排查步骤如下:
- 检查硬件连接:确认串口线、电源线连接正常,开发板供电稳定(电压、电流是否符合要求);
- 观察启动日志:通过串口查看u-boot和内核启动信息,定位卡点(如u-boot阶段可能是存储介质未识别,内核阶段可能是设备树或驱动问题);
- 验证镜像完整性:使用
md5sum
校验镜像文件是否损坏(与原始镜像对比); - 检查分区表:用
fdisk -l
查看存储介质分区是否正确,引导分区是否包含u-boot.bin、zImage等文件; - 修改u-boot环境变量:进入u-boot命令行,检查
bootcmd
(引导命令)、bootargs
(内核参数)是否正确,如bootcmd
需指向内核和设备树位置,bootargs
需包含根分区信息(如root=/dev/mmcblk0p2
)。
Q2:如何制作包含自定义应用的Linux镜像?
A:以Buildroot为例,步骤如下:
- 配置Buildroot:
git clone https://github.com/buildroot/buildroot.git cd buildroot make menuconfig
在
Target options
中选择目标架构(如ARM),在Toolchain
中选择交叉编译工具链,在Target packages
中添加自定义应用(如Python、Node.js、或自行编译的程序)。 - 编译镜像:
make -j$(nproc)
编译完成后,在
output/images/
目录下生成rootfs.ext4
(根文件系统镜像)和boot.scr
(引导脚本)。 - 整合镜像:将
rootfs.ext4
与u-boot.bin、zImage、*.dtb按分区方案整合(如使用dd
写入SD卡),或直接使用Buildroot生成的sdcard.img
(已包含所有分区)。 - 验证自定义应用:烧录后进入系统,检查应用是否可用(如输入
python --version
确认Python是否安装)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/31202.html