Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >制作SD启动卡,从SD卡启动系统

制作SD启动卡,从SD卡启动系统

作者头像
哆哆jarvis
发布于 2022-08-23 06:18:42
发布于 2022-08-23 06:18:42
3.7K00
代码可运行
举报
运行总次数:0
代码可运行
  • 芯片需要支持SD卡这种启动方式。
  • 准备好u-boot.imx,dtb,zImage,rootfs压缩包

使用fdisk命令对sd卡分区

输入fdisk /dev/mmcblk0.按照提示输入相关选项进行操作。

可以看到我这张SD卡的相关信息,总容量为15931539456字节,31116288个sectors,即一个sector为512字节。

创建第一个分区

输入n,添加一个新分区,这里提示输入分区号,范围1 ~ 4. 然后输入1,提示我们选择第一个柱面(一个柱面的大小是32KB)。 这里我选择32 ~(32+2048)作为第一个分区作boot分区(用来烧写dtb和kernel分区)。即32KB * 2048 = 64M大小。之所以从32开始,是把前1M(32K*32=1M)空间留给uboot,uboot是裸分区

创建第二个分区

同样地,创建第二个分区,从2081~486192都划分给第二个分区。 以下是我设置的分区。

分区名

分区号

大小

boot

1

64M

文件系统分区

2

剩余空间

设置p1为boot分区

使用t选项,选择第一个分区,然后选择c,把分区system id类型设置为fat。然后使用a,选择第一个分区为boot类型。

可以看到p1后面boot那列多了个*。

格式化p1 p2

创建完分区之后,还需要对分区进行格式化。把p1的fstype格式化为fat,p2的fstype格式化为ext3分区。mke2fs可以用-t选项指定为ext3或者ext4。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkfs.vfat -F 32 -n "boot" /dev/mmcblk0p1
mke2fs -t ext4 -F -L "rootfs" /dev/mmcblk0p2

烧录uboot.imx

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dd if=u-boot.imx of=/dev/mmcblk0 bs=1024 seek=1 conv=fsync

通过dd命令烧录uboot.imx到SD卡。这里需要使用seek跳过前1K,这个跟这款芯片有关。

做到这一步,已经可以从SD启动u-boot了,不过里面还没有kernel和根文件系统

烧录kernel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /tmp/kernel
mount /dev/mmcblk0p1 /tmp/kernel
cp -r /mnt/dfos.dtb /tmp/kernel
cp -r /mnt/zImage /tmp/kernel
umount /tmp/kernel

烧录根文件系统

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /tmp/rootfs
mount /dev/mmcblk0p2 /tmp/rootfs
tar -vxf /mnt/rootfs.tar.bz2 -C /tmp/rootfs/
umount /tmp/rootfs

至此,就可以从SD卡启动系统了。

关于根文件系统打包

压缩

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo tar -cvzf rootfs.tar.gz *  
sudo tar -cvjf rootfs.tar.bz2 *

解压

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -vxf /mnt/rootfs.tar.gz -C /tmp/rootfs/ --strip-components 1  
tar -vxf /mnt/rootfs.tar.bz2 -C /tmp/rootfs/

做成shell脚本一键烧录

使用方法:sd_burn.sh /dev/mmcblk0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/sh
#execute执行语句成功与否打印
execute ()
{
    $* >/dev/null
    if [ $? -ne 0 ]; then
        echo
        echo "错误: 执行 $*"
        echo
        exit 1
    fi
}

device=$1
dfos_dtb=imx6ull-14x14-evk.dtb
uboot='u-boot.imx'
rootfs_img=rootfs.tar.bz2
#rootfs_img=rootfs.tar.gz

#执行格式化$device
execute "dd if=/dev/zero of=$device bs=1024 count=1024"

#cat << END | fdisk -H 255 -S 63 $device
cat << END | fdisk $device
n
p
1
32
2080
n
p
2
2081  
486192
t
1
c
a
1
w
END

PARTITION1=${device}p1
PARTITION2=${device}p2

#第一个分区创建为Fat32格式
echo "格式化${device}p1 ..."
if [ -b ${PARTITION1} ]; then
	echo "${PARTITION1} ..."
	mkfs.vfat -F 32 -n "boot" /dev/mmcblk0p1
else
	echo "error: no ${PARTITION1}"
fi
#第二个分区创建为ext4格式
echo "格式化${device}p2 ..."
if [ -b ${PARITION2} ]; then
	echo "${PARTITION2} ..."
	/mnt/mke2fs -F -L "rootfs" /dev/mmcblk0p2
else
	echo "错误: /dev下找不到 SD卡 rootfs分区"
fi

echo "正在烧写${Uboot}到${device}"
execute "dd if=/mnt/${uboot} of=$device bs=1024 seek=1 conv=fsync"
sync
echo "烧写${Uboot}到${device}完成!"

echo "正在准备复制..."
echo "正在复制设备树与内核到${PARTITION1},请稍候..."
execute "mkdir -p /tmp/kernel"
execute "mount ${PARTITION1} /tmp/kernel"
execute "cp -r /mnt/${dfos_dtb} /tmp/kernel"
execute "cp -r /mnt/zImage /tmp/kernel"
sync
echo "复制设备树与内核到${device}p1完成!"

echo "卸载${PARTITION1}"
execute "umount /tmp/kernel"
sleep 1

#解压文件系统到文件系统分区
#挂载文件系统分区
execute "mkdir -p /tmp/rootfs"
execute "mount ${PARTITION2} /tmp/rootfs"

echo "正在解压文件系统到${PARTITION2} ,请稍候..."
#execute "tar -vxf /mnt/${rootfs_img} -C /tmp/rootfs/ --strip-components 1"
execute "tar -vxf /mnt/${rootfs_img} -C /tmp/rootfs/"
sync
echo "解压文件系统到${PARTITION2}完成!"

echo "卸载${PARTITION2}"
execute "umount /tmp/rootfs"

execute "rm -rf /tmp/rootfs"
sync
echo "SD卡启动系统烧写完成!"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆jarvis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑!
前进几篇文章,已经搞定了Linux移植三巨头:uboot、kernel(包含dtb)和rootfs,除了uboot是烧写在SD中的,其它的都是在ubuntu虚拟机的nfs服务器中,运行时必须通过网络将这些文件加载到开发板的内存中运行。
xxpcb
2021/09/09
2.3K0
[ 物联网篇 ] 11 - NXP i.MX8M Mini 集成Mender OTA解决方案
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序手艺人
2019/11/14
1.8K0
i.MX6ULL嵌入式Linux开发1——uboot移植初探
本系列教程以「i.MX6ULL」处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括嵌入式Linux移植,嵌入式Linux驱动开发,嵌入式Linux应用开发等。
xxpcb
2021/07/20
2.6K0
荔枝派Zero(全志V3S)烧录Uboot、Kernel及rootfs到SD卡并运行在板子上
2、这里选择 /dev/sdb,这个是我们的 SD 卡,/dev/sda是我们的系统磁盘,千万不要选错,否则接下里的格式化会把系统磁盘格式化
Gnep@97
2023/08/10
1.1K0
荔枝派Zero(全志V3S)烧录Uboot、Kernel及rootfs到SD卡并运行在板子上
beaglebone AI环境搭建与运行
本文主要介绍beaglebone的开发过程与启动方式。同时将一套嵌入式Linux开发环境搭建起来。以便于更好的掌握和理解beaglebone AI的使用。工欲善其事,必先利其器,搭建好完整的开发环境,后续的工作才能更好的开展起来。要想用好一款芯片,也需要很好的理解其启动方式。下面来实际的展示操作流程。
bigmagic
2020/11/25
2.3K0
beaglebone AI环境搭建与运行
[ 物联网篇 ] 09 - Buildroot中构建NXP IMX8MM
烧录固件之后,发现一行打印也没有,代表uboot 都无法启动,而buildroot uboot 打包固件的脚本对应 : buildroot-2019.05-rc2/board/freescale/common/imx/imx8-bootloader-prepare.sh ,应该是该脚本出现问题,该问题并没有深入研究,
程序手艺人
2019/06/14
2.7K0
荔枝派Zero(全志V3S)制作 IMG 镜像文件
之前在玩板子时每次烧录镜像都是先烧录 uboot 到 SD 卡 8k 偏移处,再拷贝 zImage 镜像文件和 sun8i-v3s-licheepi-zero-dock.dtb 设备树文件到 sd 卡的 kernel 分区,再把 rootfs.tar 解压到 SD 卡的 rootfs 分区,总的来说感觉有些麻烦,因此本文将制作一个 img 镜像文件可以在 windows 下直接用 Win32DiskImager 一键烧录,或者在 linux 下直接使用 dd 烧录。
Gnep@97
2023/08/10
8970
荔枝派Zero(全志V3S)制作 IMG 镜像文件
玩玩树莓派之扩展SD卡剩余空间
前言:在安装好Go环境之后万事俱备只欠东风的情况下,我充满了喜悦,正准备go get -u github.com/gogits/gogs,然而fatal: write error: No space
AlicFeng
2018/06/08
1.8K0
嵌入式Linux开发-根文件系统本地挂载
上篇文章介绍了根文件系统的制作与NFS网络挂载,这篇文章介绍内核如何从本地挂载根文件系统,完成系统启动。本地挂载一般用在产品发布的时候,本地挂载的操作也分为两种。
DS小龙哥
2022/04/08
4.8K0
嵌入式Linux开发-根文件系统本地挂载
全志H3 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板
编译器下载地址:Downloads | GNU-A Downloads – Arm Developer[1]
Mculover666
2023/08/18
2.3K0
全志H3 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板
i.MX6ULL嵌入式Linux开发3-Kernel移植
NXP 会从linux内核官网下载某个版本,然后将其移植到自己的 CPU上,测试成功后就会将其开放给NXP的CPU开发者。开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。
xxpcb
2021/08/13
1.6K0
【小技巧】通过SD卡传文件到开发板就是这么简单!
4.    打开SecureCRT(在资料光盘->windows工具目录),如下设置连接串口
韦东山
2020/09/30
3.1K0
【小技巧】通过SD卡传文件到开发板就是这么简单!
Armada-3720 EMMC启动
官网wiki没有介绍相关的操作说明,看了88F3700的datesheet,armada-3720是支持uboot从emmc启动的,这里uboot使用最新的armada-18.12 u-boot,内核是4.14,编译工具链用gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu。
咖啡走糖
2022/11/05
1.5K0
Armada-3720 EMMC启动
MQ-Quad 全志H616 主线内核编译调试记录(u-boot、kernel、buildroot)
/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
阿志小管家
2024/02/02
7700
Tina Linux 存储开发指南
介绍TinaLinux Flash,分区,文件系统等存储相关信息,指导方案的开发定制。
韦东山
2023/02/25
3.1K0
鸿蒙系统研究之六:U-Boot引导
U-Boot 的全称是 Universal Boot Loader,其作用就是引导系统。对于我们熟悉的 PC,上电后,通过 BIOS 引导操作系统 (Windows、Linux等)。对于嵌入式系统一般将这个引导程序称作 BootLoader,U-Boot 就是目前使用得最广泛的 BootLoader。
云水木石
2021/08/06
2.8K1
嵌入式Linux开发-uboot常用命令介绍(下篇)
主要是涉及的命令是:磁盘分区、磁盘文件加载、内核引导、二进制文件加载、跳转命令、磁盘文件系统格式等等。
DS小龙哥
2022/04/08
2.7K0
嵌入式Linux开发-uboot常用命令介绍(下篇)
鸿蒙系统研究之四:根文件系统
在上一篇文章鸿蒙系统研究之三:迈出平台移植第一步,我们将内核加载并启动,但缺少根文件系统。这篇文章我们来探讨一下根文件系统的制作。
云水木石
2021/07/14
2.1K0
Cubieboard2 debian
本文所使用的主机环境为kubuntu 12.10,然而一般情况下,下面涉及到的命令对基于Debian的(X)ubuntu系列都应该适用。
全栈程序员站长
2022/09/16
6320
Rockchip RK3588 - uboot引导方式介绍
开发板 :RK3588 EVB开发板 eMMC :256GB LPDDR4 :16GB 显示屏 :10.1英寸HDMI接口显示屏 u-boot :2017.09 linux :6.1
用户11537198
2025/03/07
3730
相关推荐
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验