假设我们有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。