我有一些squashfs
文件当前使用默认算法压缩,即zlib/gzip
。我想将它们重新压缩为zstd
。
如果不将其提取到磁盘并从该提取中重新创建它,那么执行此操作的命令是什么?
答案1
Squashfs-tools 4.6 及更高版本(去年发布)支持此功能。
此处的文档中提到了将 Squashfs 文件系统从一种压缩类型转换为另一种压缩类型(https://github.com/plougher/squashfs-tools/blob/master/README-4.6.1#L289)。
由于我编写了上述文档(和 Squashfs),因此将其复制到这里没有任何问题。
- 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,使用您想要的任何选项,包括备用压缩算法。如果您只想更改压缩,即使工具支持它,也没有更好的方法来处理这个问题。