一个典型的嵌入式系统是由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. 详解js中的this指向

    this指向问题是个老生常谈的问题了,现在我给大家一个例子 var obj={ bar:'Cynthia' , foo:function(){ console.log(this.bar,"w ...

  2. .Net core 如何生成Nuget包

    以前引用了很多neget包,觉得nuget包方便了很多,是不是有些通用的代码可以封装到nuget中,想要用的时候引用就可以了, 这样其实有两个好处: 1. 首先不用重复的coding,节约了时间. 2 ...

  3. 【干货】gitlab-11.10.4版本汉化

    目录 1.YUM安装gitlab-11.10.4 2.gitlab汉化技能 1.YUM安装gitlab-11.10.4 下载gitlab-ce的repo [root@localhost ~]# cur ...

  4. Linux service进程管理

    Linux进程基本介绍: 1)在Linux中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个ID号. 2)每一个进程,都对应一个父进程,而这个父进程可以复制多个子进程.例如www服务器. ...

  5. HTTP认识

    一.相关名词解释 1. 超文本:是指包含指向其他文档的超链接的文本 2. 万维网:简称web,是一个分布式的超媒体系统,它是超文本系统的扩充,以客户-服务器方式工作 3. 超媒体:文档包含文本,图片, ...

  6. 不用虚拟机直接在线用的 Linux,统统都在这里!

    玩过 Linux 的同学,几乎都用过虚拟机!然而,你们肯定不晓得?不用装虚拟机,也有体验 Linux 的办法.下面一起来看看吧,到底如何不用虚拟机,照样能玩 Linux. 其实方法很简单,你只需要拥有 ...

  7. 离线安装python的ibm_db模块

    目前手头的项目是一个UI自动化框架,其中有些模块的功能需要与DB2数据库交互,于是百度了一下python操作DB2的模块是 ibm_db. 然而我的工作机器是一台windows堡垒机,不能联网,固不能 ...

  8. hashCode、HashMap 的原理

    hashCode 的契约是:如果两个对象相等,那么调用两个对象的 hashCode() 方法一定会返回相同的 hash 值. HashMap 中 存储桶 的原理: 当你在 hashMap 中存储值的时 ...

  9. 【大数据】Windows7、Hadoop2.7.6

    一.Java配置 1.完整路径不能有空格:C:\jdk1.8.0_101 2.配置环境变量:JAVA_HOME 二.Hadoop配置 1.完整路径不能有空格:F:\0002_BigData\Soft\ ...

  10. Objective-C Classes Are also Objects

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC ...