重新压缩 squashfs

重新压缩 squashfs

我有一些squashfs文件当前使用默认算法压缩,即zlib/gzip。我想将它们重新压缩为zstd

如果不将其提取到磁盘并从该提取中重新创建它,那么执行此操作的命令是什么?

答案1

Squashfs-tools 4.6 及更高版本(去年发布)支持此功能。

此处的文档中提到了将 Squashfs 文件系统从一种压缩类型转换为另一种压缩类型(https://github.com/plougher/squashfs-tools/blob/master/README-4.6.1#L289)。

由于我编写了上述文档(和 Squashfs),因此将其复制到这里没有任何问题。

  1. Squashfs 文件系统转换(将 Unsquashfs 输出传输到 Mksquashfs)

有时您有一个现有的 Squashfs 文件系统,您想使用一组不同的压缩选项(例如压缩算法、块大小、尾部打包等)重新生成它。或者您想修改文件系统的某些部分,例如排除文件、更改所有权等。

显然,您已经能够挂载 Squashfs 文件系统并通过mksquashfs在挂载的目录上运行来重新生成文件系统。但是,这需要 root 访问权限(有时无法获得)。到目前为止,唯一的其他替代方案是将 Squashfs 文件系统提取到中间未压缩的目录中,然后通过mksquashfs在该目录中运行来重新生成文件系统。但是,这很慢,并且需要存储空间来存储未压缩的文件系统。

unsquashfs现在可以将代表输入文件系统的伪文件输出到 stdout,并且mksquashfs可以从 stdin 读取伪文件。这样可以将 的输出通过unsquashfs管道传输到mksquashfs

以下是一些示例。

如果您有一个 GZIP 文件系统并想要将其转换为 ZSTD,您可以执行以下操作:

% unsquashfs -pf - image.sqsh | mksquashfs - new.sqsh -pf - -comp zstd

如果您想要更改为 XZ 压缩,增加到 1 Mbyte 块大小并使用-tailend打包,您可以执行以下操作:

% unsquashfs -pf - image.sqsh | mksquashfs - new.sqsh -pf - -comp xz -b 1M -tailends

如果你只想要目录,foobar你可以告诉 Unsquashfs 仅提取该目录:

% unsquashfs -pf - image.sqsh foobar | mksquashfs - new.sqsh -pf -

如果您不小心存储了二进制.o文件,则可以使用新的“非锚定”unsquashfs排除文件功能将其删除:

% unsquashfs -excludes -pf - image.sqsh "... *.o" | mksquashfs - new.sqsh -pf -

如果要将所有文件时间戳更新为now,并使每个文件归 拥有phillip

% unsquashfs -pf - image.sqsh | mksquashfs - new.sqsh -all-time now -force-uid phillip -pf -

答案2

Squashfs 工具对已创建的 squashfs 的操作能力非常有限。截至撰写本文时,对现有映像的唯一可用更改是在根目录添加新文件(以及合并或重命名旧根目录)以附加到映像。

但是,squashfs 是用来挂载的。没有必要提取它,只需挂载它即可。(如果您想修改它,则可以使用 overlayfs 之类的东西进行更改。)

一旦挂载完毕,您就可以使用 mksquashfs 从挂载的 squash 中重建 squash,使用您想要的任何选项,包括备用压缩算法。如果您只想更改压缩,即使工具支持它,也没有更好的方法来处理这个问题。

相关内容