追加到squashfs文件内的子目录

追加到squashfs文件内的子目录

假设我们有filesystem.squashfs,我们可以通过以下方式附加到它:

mksquashfs somefile filesystem.squashfs

它附加somefile到squashfs文件的根目录。追加目录:

mksquashfs somedir/ filesystem.squashfs

会将其中的文件和目录附加到somedir/squashfs 文件的根目录中。如果目录或文件存在于 squashfs 树中,mksquashfs则将重命名新文件,而不更改旧文件和目录。那么“append”这个短语是有道理的。

我知道unsquashfs哪个会解压squashfs,但我很好奇是否有一种方法可以将新文件或目录添加到squashfs树内的现有子目录而不解压?

答案1

当然,可以将目录或文件附加到squashfs_file。

人们必须了解 mksquashfs 的工作方式:粗略地说,它是增量添加数据压缩块,其方式与 Growthisofs 写入 DVD 类似;最后更新 TOC,即图像的表格内容。当然你不能“清除”旧目录,因为增量写入只关心未来而不关心过去!!!!

但是有一种非常简单的方法可以修改squashfs文件,而无需取消整个映像的squashfs(这可能会占用RAM或存储设备上的大量空间......想想dvd_iso 3-5 GB映像!)。指导思想是这样的:

1挂载squashfs_file /mnt(挂载使用的存储远少于unsquashfs)

2 通过排除要修改的目录来重新构建squashfs_file,然后附加我们想要的新目录。

详细信息例如:

  • cp /mnt/specific_dir $home ##modify $home/specific_dir as needed
  • mksquashfs /mnt new_squashfs_file -wildcards -e specific_dir
  • mksquashfs $home/specific_dir new_squashfs_file -keep-as-directory
  • umount /mnt # cleanup

当然,mksquashfs 的所有其他选项都可以照常添加(块大小;压缩方案 ....-b 1048576 -comp xz ....)

出于澄清目的,该示例显示了一个目录修改;但在 rootfs 上,您可以排除 etc usr ....然后在第二行追加机制中追加修改后的 etc usr 。

如果您需要在 4GB 内存“windows10 笔记本电脑”上重新管理整个 livecd ubuntu,而不涉及 ntfs 原始分区,那么这就是您要走的路。

希望有帮助,王吉。

答案2

当尝试重新制作 Live-CD 时,文件夹的复制和排除只能到此为止(在我的例子中,我不得不接触 /etc、/lib 和 /usr,这几乎相当于解压所有内容)。

但是,利用重新压缩而不解压缩的想法,并添加了 overlayfs 的优点,我最终得出了以下结论:

SQFS=/path/to/my.sqfs
ADD=/path/to/additional/files/

mkdir /tmp/lower /tmp/upper /tmp/work /tmp/joined
mount $SQFS /tmp/lower
mount -t overlay none -olowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work  /tmp/joined
rsync -a $ADD /tmp/joined
mksquashfs /tmp/joined ${SQFS}_new -comp xz -b 1M -noappend
umount /tmp/joined /tmp/lower
rm -rf /tmp/lower /tmp/upper /tmp/work /tmp/joined
mv ${SQFS}_new $SQFS

它仍然需要创建一个新的 SQFS,但不需要解压旧 SQFS 的任何内容,并且覆盖层会处理旧目录中的新文件等。

PS 我曾希望,它也比先解压缩 SQFS 然后重新压缩更快,但事实并非如此。毕竟,它仍然需要读取整个旧的 SQFS 才能创建新的 SQFS。

相关内容