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

来源:互联网 发布:java连接mongodb 编辑:程序博客网 时间:2024/06/06 03:46

上一篇文章,讲到有第二种方法让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 -helpSYNTAX:./mksquashfs source1 source2 ...  dest [options] [-e list of excludedirs/files]Filesystem build options:-comp <comp>select <comp> compressionCompressors available:gzip (default)xz-b <block_size>set data block to <block_size>.  Default 131072 bytes-no-exportsdon't make the filesystem exportable via NFS-no-sparsedon't detect sparse files-no-xattrsdon't store extended attributes-xattrsstore extended attributes (default)-noIdo not compress inode table-noDdo not compress data blocks-noFdo not compress fragment blocks-noXdo not compress extended attributes-no-fragmentsdo not use fragments-always-use-fragmentsuse fragment blocks for files larger than block size-no-duplicatesdo not perform duplicate checking-all-rootmake all files owned by root-force-uid uidset all file uids to uid-force-gid gidset all file gids to gid-nopaddo not pad filesystem to a multiple of 4K-keep-as-directoryif one source directory is specified, create a rootdirectory containing that directory, rather than thecontents of the directoryFilesystem 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>.  Onefile or dir with priority per line.  Priority -32768 to32767, default priority 0-ef <exclude_file>list of exclude dirs/files.  One per line-wildcardsAllow extended shell wildcards (globbing) to be used inexclude dirs/files-regexAllow POSIX regular expressions to be used in excludedirs/filesFilesystem append options:-noappenddo not append to existing filesystem-root-becomes <name>when appending source files/directories, make theoriginal root become a subdirectory in the new rootcalled <name>, rather than adding the new source itemsto the original rootMksquashfs runtime options:-versionprint version, licence and copyright message-recover <name>recover filesystem data using recovery file <name>-no-recoverydon't generate a recovery file-infoprint files written to filesystem-no-progressdon't display the progress bar-processors <number>Use <number> processors.  By default will use number ofprocessors 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 MbytesMiscellaneous options:-root-ownedalternative name for -all-root-noInodeCompressionalternative name for -noI-noDataCompressionalternative name for -noD-noFragmentCompressionalternative name for -noF-noXattrCompressionalternative name for -noXCompressors available and compressor specific options:gzip (no options) (default)xz  -Xbcj filter1,filter2,...,filterNCompress 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 sizecan be specified as a percentage of the block size, or as anabsolute value.  The dictionary size must be less than or equalto the block size and 8192 bytes or larger.  It must also bestorable 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, 8Ketc.

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格式固件解包、修改和封包过程改进版

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

到此我们讲完了。



原创粉丝点击