一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和kernel都是二进制,rootfs存在文件系统。

二进制在烧录的时候比较简单,将二进制数据写入存储设备固定地址;rootfs存在文件系统,所以需要对存储设备进行分区,然后在分区上建立文件系统。

对存储介质分区可以直接挂载,进行分区、挂载,然后将rootfs内容写入,即完成了rootfs更新。

或者创建一个普通image文件,然后将文件当成一个分区,在其上创建rootfs。创建的普通image文件,可以使raw image也可以是sparse image。

1. 二进制文件烧录

二进制文件更新比较简单,直接使用DD即可。

dd if=spl.bin of=/dev/sdc bs=1024 seek=33

2. fdisk创建分区

通过fdisk可以在一个物理设备上创建分区表,也可以在一个image文件上创建分区。

fdisk -l device将输出指定设备的分区信息,不指定device则显示系统所有设备的分区信息。

AME
fdisk - manipulate disk partition table SYNOPSIS
fdisk [options] device fdisk -l [device...]

fdisk device之后,输入m显示帮助信息。n新增一个分区表,p显示分区信息,w保存分区信息,q退出。

可以将分区命令输入到一个fdisk_input文件中,然后fdisk <fdisk_input读取分区命令并执行生成分区表。

cat > fdisk_input <<EOF
n
p
1
61440 p
w
EOF fdisk -u ${ALL_IN_ONE} <fdisk_input

退出后即可看到创建的分区。

3. 创建ext4的raw image文件系统

首先创建一个空白image文件,如果在设备上创建则直接使用。

然后调用mkfs.ext4在文件或者设备上创建ext4文件系统,将创建好的文件系统mount到一个目录。

将rootfs文件写入mount目录,并sync。

最后将文件系统进行umount。

dd if=/dev/zero of=${ROOTFS_EXT4} bs=1M count=${ROOTFS_SIZE}
mkfs.ext4 ${ROOTFS_EXT4} -F mkdir -p /tmp/emmc
sudo mount -t ext4 ${ROOTFS_EXT4} /tmp/emmc -o data=journal,barrier=1
sudo rm -rf /tmp/emmc/*
cd /tmp/emmc
sudo cpio -idm < ${ROOTFS_CPIO}
sync
cd -
sudo umount /tmp/emmc

即完成了文件系统创建。

4.创建ext4的sparse image文件系统

工具make_ext4fs可以创建稀疏ext4文件系统,制作出来的文件尺寸较小。

make_ext4fs -l 2018M -s rootfs.sparse ../target/

即可创建完成2018M大小的rootfs.spare image文件,文件来源于../target/目录。

5. sparse image和raw image互转

通过simg2img可以将sparse image转换成raw image,img2simg可以将raw image转换成sparse image。

Usage: simg2img <sparse_image_files> <raw_image_file>
Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]

分别执行:

simg2img rootfs.sparse rootfs.sparse2raw
img2simg rootfs.ext4 rootfs.ext42sparse

结果如下:

rootfs.ext4:       Linux rev 1.0 ext4 filesystem data, UUID=a8e84664-5362-4ab2-8bd3-bb20ea25e1ee (extents) (large files) (huge files)
rootfs.ext4s: Android sparse image, version: 1.0, Total of 516608 4096-byte output blocks in 404 input chunks.
rootfs.sparse: Android sparse image, version: 1.0, Total of 516608 4096-byte output blocks in 1187 input chunks.
rootfs.sparse2raw: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)

参考文档:

1.《http://2net.co.uk/tutorial/android-sparse-image-format

fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img的更多相关文章

  1. 一个版本烧录过程中记录:fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img

    关键词:dd.fdisk.mkfs.ext4.make_ext4fs.img2simg.simg2img等等. 一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和k ...

  2. centos Linux下磁盘管理 parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpfs ,nr_inodes, LVM,传统方式扩容文件系统 第七节课

    centos Linux下磁盘管理   parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpf ...

  3. 2.1、Hibernate多表操作--一对多、多对一、多对多。

    一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...

  4. Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

    Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...

  5. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  6. Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总

    Unit06 - 抽象类.接口和内部类(下) . 面向对象汇总 1.多态:  1)意义:    1.1)同一类型的引用指向不同的对象时,有不同的实现        行为的多态:cut().run(). ...

  7. StringGrid 实例4 本例功能: 1、给每个单元格赋值 2、调整当前单元格位置:上下左右;

    实例4 本例功能:1.给每个单元格赋值 2.调整当前单元格位置:上下左右: 运行效果图:

  8. 主要从架构上来做优化,负载均衡、CDN、静态化、数据库的水平切割和纵向切割、读写分离、分布式缓存着手

    语言知识一种工具,甚至技术本身也只是一种工具,本身并不值钱,关键在于用于何种行业,产生了什么价值. 但从语言来看,我个人更喜欢php,然后是C#,然后是java从框架而言,先是java,然后C#,再次 ...

  9. C#下利用封包、拆包原理解决Socket粘包、半包问题(新手篇)

    介于网络上充斥着大量的含糊其辞的Socket初级教程,扰乱着新手的学习方向,我来扼要的教一下新手应该怎么合理的处理Socket这个玩意儿. 一般来说,教你C#下Socket编程的老师,很少会教你如何解 ...

随机推荐

  1. MYSQL中的时间类型

    时间上总共有五中表示方法:它们分别是 time.date.datetime.timestamp和year. time :  “hh:mm:ss”格式表示的时间值,格式显示TIME值,但允许使用字符串或 ...

  2. Mac 设置redis开机启动

    1.创建一个plist文件 首先我们需要在/Library/LaunchDaemons目录下创建一个plist文件,使用如下命令: 复制代码代码如下: sudo vim /Library/Launch ...

  3. python url合并与分离

     #!/bin/python3 from urllib import parse parse.urlsplit() 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路径.参数.查询 ...

  4. JVM的底层实现原理

    JVM是Java程序运行的环境,但是他同时也是一个操作系统的一个应用程序的一个进程,因此JVM也有他自己的运行生命周期,也有自己的代码和数据空间. JDK JDK在Java的整个体系中充当一个生产加工 ...

  5. 定制你的“魅力”报告--Allure

    “人世间是一个大囚笼,每个人都在狱中,砥砺前行.九狱台中的刺,是生活中所要面对的砥砺,是锋利的刺,将自己肉身刺得千疮百孔,将自己的道心刺得千疮百孔.” ---<牧神记·九狱锁道心> 一.简 ...

  6. 【转】tf.SessionRunHook使用方法

    原文地址:https://blog.csdn.net/mrr1ght/article/details/81011280 .本文有删减. tf.train.SessionRunHook()是一个类:用来 ...

  7. Mincut 最小割 (BZOJ1797+最小割+tarjan)

    题目链接 传送门 思路 根据题目给定的边跑一边最大流,然后再在残留网络上跑\(tarjan\). 对于每一条边有: 如果它是非满边,那么它一定不是最小割集里面的边: 如果\(c[u[i]] \not= ...

  8. httprunner学习10-测试报告ExtentReport

    前言 httprunner默认生成的报告不怎么美观,里面还有第二套报告模板extent_report_template.html. extent_report_template 使用 hrun -h ...

  9. IDEA+Maven+Mybatis 巨坑:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.rao.mapper.UserMapper.findAll

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.rao.mapper.User ...

  10. LeetCode 752. Open the Lock

    原题链接在这里:https://leetcode.com/problems/open-the-lock/ 题目: You have a lock in front of you with 4 circ ...