Hi3516A开发-- 生成烧写最小文件系统 squashfs

上一篇文章,讲到有第二种方法让Hi3516A通过RTSP播放H.265视频流。那接下我们试一下呗。

简单烧写的话,使用 tftp 就可以了。现在要讲的是在最小文件系统 squashfs 下如何烧写。

为什么要讲它呢,因为现在网上卖的网络模组都是这个文件系统。

一、squashfs 初识

首先先来看一下 ,squashfs 是个啥?

根据维基百科,参看:SquashFS -- 维基百科

翻译一下:

Squashfs 是用于 Linux 的压缩只读文件系统。 Squashfs压缩文件,inode和目录,并支持高达1 MB的块大小以实现更大的压缩。 支持几种压缩算法。 Squashfs也是免费软件的名称,根据GPL许可,用于访问Squashfs文件系统。
Squashfs旨在用于一般的只读文件系统使用以及需要低开销的约束块设备存储器系统(例如嵌入式系统)。

上面这段话简单来说,就是 Squashfs 是个最小的只读文件系统


这里发现一个网站上讲的相当不错。直接翻译一下来介绍好了。

参看:SquashFS HOWTO

1.1、介绍

当创建小尺寸和嵌入式Linux系统时,存储设备(软盘,闪存盘等)的每个字节都非常重要,因此可以使用压缩。此外,压缩文件系统经常需要用于归档目的。对于庞大的公共档案馆以及个人媒体档案,这是至关重要的。
SquashFS将所有这一切提升到一个新的水平。它是一个只读文件系统,允许您压缩整个文件系统或单个目录,将其写入其他设备/分区或普通文件,然后直接(如果设备)或使用环回设备(如果是一份文件)。SquashFS的模块化,紧凑的系统设计是幸福的。为了归档目的,SquashFS比tarball存档提供了更多的灵活性和性能。
SquashFS作为Linux内核源代码补丁(它启用了内核中的SquashFS读取支持),mksquashfs工具可以创建压缩文件系统(在文件或块设备中)和unsquashfs工具,该工具从现有的压缩文件系统。

1.2、SquashFS概述

数据,inode和目录被压缩
SquashFS存储完整的uid / gids(32位)和文件创建时间
文件最多支持2 ^ 64字节; 文件系统最多可达2 ^ 64字节
Inode和目录数据被高度压缩,并且在字节边界上打包; 每个压缩的inode平均长度为8个字节(精确长度因文件类型而异,即常规文件,目录,符号链接,块/字符设备inode具有不同的大小)
SquashFS 可以使用高达64 Kb(2.x)和1Mb(3.x)的块大小。默认大小为128Kb(3.x),这比通常的4K块大小实现更大的压缩比。
通过2.x版本引入了片段块的概念:将小于块大小的多个文件连接到单个块中的能力,实现更高的压缩比
检测并删除文件副本
支持大型和小型结构体系; SquashFS可以装载在不同字节顺序的机器上创建的文件系统

1.3、搞清楚

现在让我们确保进一步的讨论将更清楚,让您了解。获取SquashFS的过程主要包括以下步骤:
修补和重新编译目标Linux内核以启用SquashFS支持
编译mksquashfs和unsquashfs工具
使用mksquashfs创建压缩文件系统
测试:将压缩的文件系统安装到临时位置
修改目标Linux系统的/ etc / fstab或启动脚本,以便在需要时安装新的压缩文件系统

二、生成文件系统

如果参看上面的文章里说的,貌似还要用到文件系统移植。

因为在SDK软件包内带有rootfs_uclibc根文件系统,这里就省去了这一步。


三、SquashFS 工具的介绍

下面参看里是其他文件系统的制作方式。你可以做一下对比。

参看:Hi3516A开发--根文件系统

上面有提到主要是 mksquashfs 和 unsquashfs 工具。

重点是 mksquashfs 这个工具,Hi3516A 是提供的哦

3.1、使用mksquashfs

mksquashfs是创建新的压缩文件系统的工具,并将新数据添加到现有的压缩文件系统。mksquashfs的一般命令行格式是:


	bash#mksquashfs source1 source2 ... destination [options]

  • source1中源2等:文件和目录将被加入到得到的文件系统,具有相对和/或绝对路径给出

  • 目的地:常规文件(文件系统映像文件)或块设备(如/ dev / fd0/ dev / hda3),您想要将压缩文件系统

默认的mksquashfs行为注释

  • 当新文件添加到新文件系统或附加到现有文件系统时, mksquashfs将自动重命名具有重复名称的文件:如果两个或多个名为文本的文件将出现在同一结果目录中,则第二个文件将重命名为 text_1,第三个到text_2等等。

  • 重复的文件将被删除,因此只有一个物理实例(通过SquashFS 2.x,您可以使用-no-duplicates选项禁用检测/删除重复的文件)。

  • 如果目标位置上有一个预先存在的SquashFS文件系统,默认情况下,新的项目将被附加到现有根目录下。检查以下选项表,强制mksquashfs覆盖整个目的地和/或更改新的源项目的添加方式。

  • 如果给出单个源文件或目录,它将成为新创建的文件系统中的根目录。如果给出两个或多个源文件和/或目录,它们将全部变为新文件系统根目录中的子项。

  • 生成的文件系统将被填充到4 Kb的倍数:这是文件系统在块设备上使用所必需的。如果你非常确定你没有这个,请使用-nopad选项来禁用此操作。

有关所有可能的选项的更多详细信息,请参阅下一节。

3.2。命令行选项

mksquashfs的 所有可能选项如下表所示。

表1. mksquashfs工具的命令行选项

选项描述
-2.0强制mksquashfs版本2.1创建版本2.0文件系统
-all-root or -root-owned使目标文件系统中的所有文件由root(UID = 0,GID = 0)拥有,
-always使用片段将所有大于块大小的文件分成片段(由2.x版本)。这将导致更大的压缩比
-b [块大小]使用[块大小]文件系统块大小(默认为2.x为32 KB,3.x为128 kbytes) - 这可以是4096,8192,16384,32768,65536或131072
-be-le分别强制一个大或小的endian文件系统
-check数据启用其他文件系统检查
-e [file1]([file2] ...)指定要从要创建的新文件系统中省略哪些文件和/或目录
-ef [文件]指定一个文件,它包含的文件列表/目录排除
-force-gid [GID]将目标文件系统中的所有组ID设置为[GID](可以指定为名称或数字)
-force-uid [UID]将目标文件系统中的所有用户ID设置为[UID](可以指定为名称或数字)
-info打印文件,它们的原始大小和压缩比,因为它们被添加到文件系统
-keep-AS-目录如果源是单个目录,请强制此目录是创建文件系统中根目录的子目录
-noappend如果目标文件/设备已经包含压缩的文件系统,则覆盖它,而不是将新数据附加到现有的文件系统
-no-duplicates不要检测/删除重复的文件名
-noD-noDataCompression不压缩数据
-noF-noFragmentCompression不要压缩片段(可用2.x)
-no片段不生成片段块(可用2.x,这将产生与1.x几乎相同的文件系统)
-noI-noInodeCompression不压缩inode表
-nopad不要将生成的文件系统填充到4 KB的倍数
-root-become [name]可以在附加到预先存在的压缩文件系统时使用:它将创建一个新根,并且[name]目录将包含所有预先存在的文件/目录
-version打印版本,版权和许可证消息
-recover [name]使用恢复文件恢复文件系统数据[name](3.3)
-no-recover
不要创建一个恢复文件(3.3)。
-no-exports
不要使available文件系统通过NFS导出(3.x)
-no-sparse不检查稀疏文件(3.x)
-processors[编号]设置CPU的数量来创建文件系统。默认情况下将使用所有可用的处理器(3.x)
--read-queue [size]将输入队列设置为[size] Mb。(默认为64 Mb)(3.x)
-write-queue [size]将输出队列设置为[size] Mb(3.x)
-sort [sort_file]排序与[sort_file](3.x)中的优先级相关的文件
-wildcards启用扩展shell通配符以排除目录/文件(与-e一起使用)
-regex启用使用POSIX正则表达式(3.3)

在大多数情况下,您应该默认保留所有压缩/块选项,因为它们允许 mksquashfs实现最佳压缩比。

执行 ./mksquashfs -help  也可以看到 mksquashfs 选项。

# ./mksquashfs -help
SYNTAX:./mksquashfs source1 source2 ...  dest [options] [-e list of exclude
dirs/files]

Filesystem build options:
-comp <comp>		select <comp> compression
			Compressors available:
				gzip (default)
				xz
-b <block_size>		set data block to <block_size>.  Default 131072 bytes
-no-exports		don't make the filesystem exportable via NFS
-no-sparse		don't detect sparse files
-no-xattrs		don't store extended attributes
-xattrs			store extended attributes (default)
-noI			do not compress inode table
-noD			do not compress data blocks
-noF			do not compress fragment blocks
-noX			do not compress extended attributes
-no-fragments		do not use fragments
-always-use-fragments	use fragment blocks for files larger than block size
-no-duplicates		do not perform duplicate checking
-all-root		make all files owned by root
-force-uid uid		set all file uids to uid
-force-gid gid		set all file gids to gid
-nopad			do not pad filesystem to a multiple of 4K
-keep-as-directory	if one source directory is specified, create a root
			directory containing that directory, rather than the
			contents of the directory

Filesystem filter options:
-p <pseudo-definition>	Add pseudo file definition
-pf <pseudo-file>	Add list of pseudo file definitions
-sort <sort_file>	sort files according to priorities in <sort_file>.  One
			file or dir with priority per line.  Priority -32768 to
			32767, default priority 0
-ef <exclude_file>	list of exclude dirs/files.  One per line
-wildcards		Allow extended shell wildcards (globbing) to be used in
			exclude dirs/files
-regex			Allow POSIX regular expressions to be used in exclude
			dirs/files

Filesystem append options:
-noappend		do not append to existing filesystem
-root-becomes <name>	when appending source files/directories, make the
			original root become a subdirectory in the new root
			called <name>, rather than adding the new source items
			to the original root

Mksquashfs runtime options:
-version		print version, licence and copyright message
-recover <name>		recover filesystem data using recovery file <name>
-no-recovery		don't generate a recovery file
-info			print files written to filesystem
-no-progress		don't display the progress bar
-processors <number>	Use <number> processors.  By default will use number of
			processors available
-read-queue <size>	Set input queue to <size> Mbytes.  Default 64 Mbytes
-write-queue <size>	Set output queue to <size> Mbytes.  Default 512 Mbytes
-fragment-queue <size>	Set fragment queue to <size> Mbytes.  Default 64 Mbytes

Miscellaneous options:
-root-owned		alternative name for -all-root
-noInodeCompression	alternative name for -noI
-noDataCompression	alternative name for -noD
-noFragmentCompression	alternative name for -noF
-noXattrCompression	alternative name for -noX

Compressors available and compressor specific options:
	gzip (no options) (default)
	xz
	  -Xbcj filter1,filter2,...,filterN
		Compress using filter1,filter2,...,filterN in turn
		(in addition to no filter), and choose the best compression.
		Available filters: x86, arm, armthumb, powerpc, sparc, ia64
	  -Xdict-size <dict-size>
		Use <dict-size> as the XZ dictionary size.  The dictionary size
		can be specified as a percentage of the block size, or as an
		absolute value.  The dictionary size must be less than or equal
		to the block size and 8192 bytes or larger.  It must also be
		storable in the xz header as either 2^n or as 2^n+2^(n+1).
		Example dict-sizes are 75%, 50%, 37.5%, 25%, or 32K, 16K, 8K
		etc.

3.3。使用unsquashfs

unsquashfs是从压缩的文件系统中提取数据的工具。unsquashfs的一般命令行格式为


unsquashfs [options] target [files / directories to extract]

  • 目标是压缩文件系统提取。

unsquashfs行为注意事项

  • 通过不指定任何目标路径,unsquashfs将在./squashfs-root目录中提取压缩文件系统 

  • 该工具不会在已经存在的目录中提取压缩的文件系统,除非指定-f选项。

  • 您可以在命令行中指定要提取的多个文件/目录,并且还可以在-e [file]选项的文件中给出要提取的项目

所有可能的unsquashfs选项如下表所示。

表2. unsquashfs工具的命令行选项

选项描述
-版]打印版本,许可和版权信息
-信息]在从文件系统中提取文件时打印文件
-l [IST]列出压缩文件系统而不提取文件
-li列出具有unsyrashed属性的文件(3.3)
-二列出带有属性的压缩文件系统文件,无需任何提取(3.3)
-d [estination]路径指定未修复项目的目标路径
-力]如果文件存在覆盖它们
-s [TAT]显示文件系统的超级块信息(可以发现文件系统版本和用于压缩文件系统的选项)(3.3)
-e [f] [提取文件]要提取的目录或文件列表(每行给出一个条目)(3.3)
-R [egex]将提取名称视为POSIX正则表达式(3.3)

四、制作 squashfs 文件系统

参看:Creating and using squashed file systems

参看里讲的有点太细,我这里就讲在 Hi3516A 这里里面具体怎么制作。

首先要将你需要文件系统统一放在一个文件夹下,比如我的为 hi3516d_mini 


然后执行  ./mksquashfs hi3516d_mini rootfs.squashfs -b 64K -comp xz

其中, rootfs 是之前已经制作好的根文件系统, rootfs.squashfs.img 是生成的 squashfs 文件系统映像文件。 -b 64K 指定 squashfs 文件系统的块大小为 64K(决定于实际 spi flash块大小)。 -comp 指定文件系统压缩方式为 xz。请根据实际情况修改参数。

五、烧写文件系统

对了制作之前还需要 修改 /hi3516d_mini/etc/init.d/S80network 
9   ipaddr=192.168.2.xx  (为网络模组设置一个IP地址,要和你PC同一网段的)
11 gateway=192.168.2.1

烧写文件系统
sf probe 0;sf erase 380000 0xc80000;mw.b 82000000 ff c80000;tftp 82000000 rootfs.squashfs;sf write 82000000 380000 0xc80000


setenv bootargs 'mem=46M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=squashfs rw init=/init mtdparts=hi_sfc:512K(u-boot),3M(kernel),10M(rootfs),2560K(config)'

save

六、改进

因为 squashfs 为只读文件系统,所以根文件系统中有什么改动,都必须从新制作文件系统。

很麻烦的,否则我也就不写这篇文章了,直接 tftp 得了,关键是不能啊。

网上有改进版的,参看:在Linux中的squashfs格式固件解包、修改和封包过程改进版

我没有细看,感兴趣的可以研究一下。

到此我们讲完了。



  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聚优致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值