Linux系统移植到SD卡关键操作总结
一、准备移植材料(核心组件及作用)
组件 | 作用 | 常见形式/来源 |
---|---|---|
Uboot(引导程序) | 硬件初始化(如DDR、SD卡控制器)、加载内核到内存、传递启动参数给内核。 | 需针对目标芯片(如ARM、RISC-V)和板卡编译,来源:厂商SDK、Uboot官方仓库(需适配板卡)。 |
内核镜像 | 操作系统核心,负责进程管理、内存管理、外设驱动等。 | 编译后生成zImage (压缩内核)或uImage (Uboot专用格式),来源:Linux内核官方仓库(需配置目标芯片驱动)。 |
设备树文件(.dtb) | 以二进制形式描述硬件细节(如CPU、外设地址、中断号),让内核适配不同板卡(无需重新编译内核)。 | 由设备树源文件(.dts)编译生成,需与目标板卡硬件完全匹配(如外设型号、引脚定义)。 |
根文件系统 | 包含用户空间的所有资源:可执行程序(如sh 、ls )、库(如glibc )、配置文件(如/etc )、目录结构(如/bin 、/home )。 | 可通过busybox 手动构建、buildroot /yocto 自动生成,或使用厂商提供的最小根文件系统(需保证兼容性)。 |
二、SD卡分区与格式化
1. 识别SD卡设备节点
通过lsblk
或fdisk -l
确认设备节点(如/dev/sdb
),务必确认,避免误操作其他硬盘。
2. 分区(推荐方案)
使用fdisk
或parted
工具分区,常见分区方案:
- 分区1(boot分区):存放Uboot、内核、设备树,格式为FAT32,大小建议50-100MB。
- 分区2(rootfs分区):存放根文件系统,格式为ext4(或ext3),大小根据需求设置。
示例(fdisk操作):
fdisk /dev/sdb # 进入分区工具
# 输入n创建新分区(分区1:起始扇区2048,大小+100M;分区2:起始扇区默认,大小剩余全部)
# 输入t修改分区1类型为“W95 FAT32 (LBA)”(代码0c)
# 输入w保存分区表
3. 格式化分区
mkfs.vfat -F 32 /dev/sdb1 # 格式化boot分区为FAT32
mkfs.ext4 /dev/sdb2 # 格式化rootfs分区为ext4
三、编译材料并写入SD卡
1. 编译各组件
- Uboot编译:指定交叉编译工具链,加载目标板卡配置,编译生成
u-boot.bin
。
例:make CROSS_COMPILE=arm-linux-gnueabihf- -j4
- 内核编译:配置内核(
make menuconfig
),编译生成内核镜像(zImage
)和设备树(xxx.dtb
)。 - 根文件系统制作:通过
buildroot
/yocto
自动生成,或手动构建(确保目录结构完整、文件权限正确)。
2. 写入SD卡
- Uboot写入:
dd if=u-boot.bin of=/dev/sdb bs=512 seek=1 conv=fsync
- boot分区文件复制:挂载boot分区(
mount /dev/sdb1 /mnt/boot
),复制内核镜像和设备树。 - 根文件系统写入:挂载rootfs分区(
mount /dev/sdb2 /mnt/root
),解压根文件系统到该分区(如tar -xvf rootfs.tar -C /mnt/root
)。
四、从SD卡启动验证与优化
1. 启动参数配置
Uboot中通过bootargs
传递根文件系统位置给内核,例:
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rw init=/sbin/init'
2. 启动脚本设置
配置Uboot启动命令(bootcmd
),例:
setenv bootcmd 'mmc dev 0; fatload mmc 0:1 0x80800000 zImage; fatload mmc 0:1 0x83000000 xxx.dtb; bootz 0x80800000 - 0x83000000'
3. 验证
将SD卡插入目标板卡,设置启动方式为“SD卡启动”,上电后通过串口观察启动日志,确认启动成功(最终进入#
命令行)。
五、从SD卡迁移到eMMC(可选)
- 从SD卡启动系统,确认eMMC被内核识别(如
/dev/mmcblk1
)。 - 对eMMC分区(同SD卡分区方案)。
- 复制数据:
- Uboot:
dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=512 seek=1 conv=fsync
- boot分区:
cp -r /boot/* /mnt/emmc_boot
- rootfs分区:
rsync -av / /mnt/emmc_root
或镜像复制
- Uboot:
- 重启板卡,设置启动方式为“eMMC启动”,验证系统正常运行。
关键注意事项
- 工具链匹配:交叉编译工具链需与目标架构一致。
- 设备树正确性:必须准确描述硬件,否则内核无法识别外设。
- 根文件系统完整性:缺少关键文件会导致程序无法运行。
- SD卡兼容性:建议使用Class 10及以上的高速SD卡。