关键词:dd、fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img等等。

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

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

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

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

1. 二进制文件烧录

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

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

2. fdisk创建分区

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

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

  1. AME
  2. fdisk - manipulate disk partition table
  3.  
  4. SYNOPSIS
  5. fdisk [options] device
  6.  
  7. fdisk -l [device...]

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

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

  1. cat > fdisk_input <<EOF
  2. n
  3. p
  4.  
  5. p
  6. w
  7. EOF
  8.  
  9. fdisk -u ${ALL_IN_ONE} <fdisk_input

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

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

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

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

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

最后将文件系统进行umount。

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

即完成了文件系统创建。

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

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

  1. 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。

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

分别执行:

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

结果如下:

  1. rootfs.ext4: Linux rev 1.0 ext4 filesystem data, UUID=a8e84664--4ab2-8bd3-bb20ea25e1ee (extents) (large files) (huge files)
  2. rootfs.ext4s: Android sparse image, version: 1.0, Total of -byte output blocks in input chunks.
  3. rootfs.sparse: Android sparse image, version: 1.0, Total of -byte output blocks in input chunks.
  4. 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. 记录ubuntu16.04版本安装过程中遇到的问题

    记录ubuntu16.04版本安装和使用过程中遇到的些问题,方便以后查看,主要内容有: 1. ubuntu源替换 2. windows与vmware ubuntu文件夹共享 3. putty连接ubu ...

  2. DML过程中记录错误日志

    当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火.10g R2之后有个新功能.将插入过程中失败的记录插入到还有一张表中. SQL> drop table test purge; ...

  3. 记录一个使用HttpClient过程中的一个bug

    最近用HttpClient进行链接请求,开了多线程之后发现经常有线程hang住,查看线程dump java.lang.Thread.State: RUNNABLE at java.net.Socket ...

  4. 写一个小demo过程中遇到的各种问题 学生管理考勤系统(网页模拟)

    添加与新增一些小玩意的1.0.3版本:传送门 各位带哥,这不是你们要的c++.java.c#作业哈 课上要求做个小作业,学生管理考勤系统,原本想着是个练手的好机会,结果只证实了我还是个弟中弟. 设想的 ...

  5. 安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法

    原来ubunto不提倡设置root用户,系统安装成功后,root密码是随机的,那么在这种情况下如何得到root权限呐,具体方法如下: 终端中输入:sudo passwd root 此时重新设置原登录用 ...

  6. 记一个VS连接过程中找不到cpp的解决方法

    在新增几个qt页面时,发现原来没动的几个cpp 连接报错了,错误均是qt的相关文件找不到 应该是moc文件没有生产或者没有被包含进工程.我想着既然我没动,应该不会是moc的原因,就在其他方向解决了很久 ...

  7. [.NET跨平台]Jeuxs独立版本的便利与过程中的一些坑

    本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...

  8. [.NET跨平台]Jexus独立版本的便利与过程中的一些坑

    本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...

  9. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

随机推荐

  1. python语言的鸭子类型和强类型语言的多态

    python语言的鸭子类型和强类型语言的多态 前面讲接口类的时候举过一个有关支付方式的例子,支付方式可以有几种,微信支付,支付宝支付,苹果支付等,这几个不同的支付都统一于支付,像这样几个类都统一于 某 ...

  2. Jmeter脚本参数化和正则匹配

    我们在做接口测试过程中,往往会遇到以下几种情况 每次发送请求,都需要更改参数值为未使用的参数值,比如手机号注册.动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于 ...

  3. 精通awk系列(6):awk命令结构和awk语法结构

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk命令行结构和语法结构 awk命令行结构 awk [ -- ] program-text file ... (1) awk -f p ...

  4. MySQL 是如何处理死锁的

    MySQL(InnoDB)是如何处理死锁的 一.什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁. 这个就好比你有一个人质,对方有一个人质,你们俩去 ...

  5. VS2017初学者如何打开右侧的解决方案资源管理器

  6. MATLAB实例:绘制折线图

    MATLAB实例:绘制折线图 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 条形图的绘制见:MATLAB实例:绘制条形图 用MATLAB将几组不同的数 ...

  7. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  8. SpringBoot:@Scope注解学习

    概述 先通过注解的javadoc,可以了解到,@Scope在和@Component注解一起修饰在类上,作为类级别注解时,@Scope表示该类实例的范围,在和@Bean一起修饰在方法上,作为方法级别注解 ...

  9. Linux 部署MySQL 一主一从一备

    主服务器搭建 准备三台服务器,一主一从一备 在主服务器(master)下找到mysql配置文件. Window下为my.ini(一般在C:\ProgramData\MySQL\MySQL Server ...

  10. redis 事务(悲观锁和乐观锁)

    MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...