当我从多个目录创建 squashfs 映像时,例如:
- /垃圾桶/
- /usr/bin/
- /usr/local/bin/
- /一些/其他/随机/文件夹/
- /另一条/长/路径/
如果我使用命令...
mksquashfs /bin /usr/bin /usr/local/bin /some/other/random/folder /another/long/path MyNewImage.squashfs
它为我提供了包含这些顶级文件夹的图像:
- 垃圾桶/
- bin_1/
- bin_2/
- 文件夹/
- 小路/
我希望我的图像包含原始文件系统的完整路径:
- 垃圾桶/
- usr/bin/
- usr/local/bin/
- 一些/其他/随机/文件夹/
- 另一条/长/路/
有没有简单的方法可以做到这一点,而无需在创建图像之前先制作副本或移动原始文件?
答案1
基于@meuh的回答(这对我来说有点难以理解):
mksquashfs / MyNewImage.squashfs -wildcards -e \
!(bin|usr|some|another) \
usr/!(bin|local) \
usr/local/!(bin) \
some/!(other) \
some/other/!(random) \
some/other/random/!(folder) \
another/!(long) \
another/long/!(path)
我也很高兴有一个更易于理解和更简洁的可能性,并为此提出了功能请求:https://github.com/plougher/squashfs-tools/issues/80。
更新
您可以-no-strip
在较新版本中使用该选项:
mksquashfs /bin /usr/bin /usr/local/bin \
/some/other/random/folder /another/long/path \
MyNewImage.squashfs -no-strip
答案2
大概没有简单的方法,但是您可以通过使用扩展通配符排除语法来完成此操作。这可能没有记录在手册页中,但在自述文件。但是,有关语法的详细信息,您需要查看 的手册页fnmatch(3)
。
基本上,您可以用作!(somedir)
排除不是排除,因此您最终只包含该目录。假设您有以下示例树/tmp
$ mkdir -p a/b d/e d/e2
$ touch a/b/c d/e/f d/e2/f2
您只想复制a
并d/e
同时保留这些完整路径名。您可以使用
$ echo '!(a)' >exclude
$ mksquashfs /tmp mysq -ef exclude -wildcards
$ echo -e '!(d)/\nd/!(e)' >exclude
$ mksquashfs /tmp mysq -ef exclude -wildcards
列出文件系统会unsquashfs -l mysq
产生输出
squashfs-root/a
squashfs-root/a/b
squashfs-root/a/b/c
squashfs-root/d
squashfs-root/d/e
squashfs-root/d/e/f
每次,源目录都是/tmp
,但第一次我们排除除目录 之外的所有内容a
,第二次我们排除除目录d
和 之外的所有内容d/e
。这使用了一个多级排除文件,其中在每一行中,我们排除路径中除要保留的目录步骤之外的另一个目录步骤。
一个更简单的解决方案是在某处创建所需的目录层次结构,并将mount -bind
最终目录创建为真实目录。例如,
$ mkdir -p a/usr/local/bin a/some/other/bin
$ sudo mount -o bind /usr/local/bin a/usr/local/bin
$ sudo mount -o bind /some/other/bin a/some/other/bin
$ mksquashfs a ~/mysq
$ sudo umount a/usr/local/bin a/some/other/bin
答案3
男子 mksquashfs:
-keep-as-directory
if one source directory is specified, create a root directory con‐
taining that directory, rather than the contents of the directory.