当前位置:网站首页>制作SD启动卡,从SD卡启动系统
制作SD启动卡,从SD卡启动系统
2022-08-08 06:33:00 【哆哆的Linux存储杂记】
哆哆的Linux存储杂记
芯片原厂驱动开发,深入操作系统的世界,挖掘Linux内核与驱动,有空坚持OJ,欢迎交流。 终身学习|终身成长
33篇原创内容
公众号
芯片需要支持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。
mkfs.vfat -F 32 -n "boot" /dev/mmcblk0p1
mke2fs -t ext4 -F -L "rootfs" /dev/mmcblk0p2
烧录uboot.imx
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
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
烧录根文件系统
mkdir -p /tmp/rootfs
mount /dev/mmcblk0p2 /tmp/rootfs
tar -vxf /mnt/rootfs.tar.bz2 -C /tmp/rootfs/
umount /tmp/rootfs
至此,就可以从SD卡启动系统了。
关于根文件系统打包
压缩
sudo tar -cvzf rootfs.tar.gz *
sudo tar -cvjf rootfs.tar.bz2 *
解压
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
#!/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卡启动系统烧写完成!"
边栏推荐
猜你喜欢
随机推荐
云服务器搭建MQTT消息代理EMQX
在String类型的前提前下:使用“==“ 与equals的区别
动手学高等数学
基于FTP协议的文件上传与下载
单片机裸机编程中实用驱动分享
VISIO 2003 在线更新的注册文件
小程序云开发服务端(云函数-函数式编程)数据库取出数据突破限制
Task02:PyTorch进阶训练技巧
归并排序
论文解读:《多层肽 - 蛋白质相互作用预测的深度学习框架》
受邀全球互联网技术大会分享
大型直播平台应用架构浅谈
对称式加密与非对称式加密的对比
【网络安全】SSL Pinning及其绕过
Integer类缓存池的理解
论文翻译:《6mAPred-MSFF:基于多尺度特征融合机制预测跨物种DNA N6-甲基腺嘌呤位点的深度学习模型》
ES日期时间格式化参数集锦
Task01:PyTorch模型定义
用栈模拟队列
网络安全笔记第二天day2(等级保护)