mksquashfs:如何在squashfs图像中包含完整的绝对目录路径?

mksquashfs:如何在squashfs图像中包含完整的绝对目录路径?

当我从多个目录创建 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

您只想复制ad/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.

相关内容