mksquashfs: como incluir caminhos de diretório absolutos completos dentro da imagem do squashfs?

0

Quando eu crio uma imagem do squashf em vários diretórios, como:

  • / bin /
  • / usr / bin /
  • / usr / local / bin /
  • / some / other / random / folder /
  • / outro / long / path /

Se eu usar o comando ...

mksquashfs /bin /usr/bin /usr/local/bin /some/other/random/folder /another/long/path MyNewImage.squashfs

Isso me dá uma imagem com essas pastas de nível superior:

  • bin /
  • bin_1 /
  • bin_2 /
  • pasta /
  • caminho /

Eu quero que minha imagem contenha os caminhos completos do sistema de arquivos original:

  • bin /
  • usr / bin /
  • usr / local / bin /
  • algum / outro / aleatório / pasta /
  • outro / long / path /

Existe alguma maneira simples de fazer isso sem primeiro fazer cópias ou mover os arquivos originais antes de criar a imagem?

    
por LaVache 30.07.2018 / 10:32

2 respostas

0

man 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.
    
por 30.07.2018 / 10:39
0

Provavelmente não existe forma simples , mas você pode fazer isso com muito esforço usando a sintaxe de exclusão curinga estendida. Isso pode não estar documentado na página man, mas é mais mencionado no README . No entanto, para detalhes da sintaxe, você precisa ver a página de manual para fnmatch(3) .

Basicamente, você pode usar !(somedir) como uma exclusão para não excluir, então você acaba incluindo apenas esse diretório. Imagine que você tenha a seguinte árvore de exemplo em /tmp

$ mkdir -p a/b   d/e   d/e2
$ touch    a/b/c d/e/f d/e2/f2

e você deseja copiar apenas a e d/e enquanto preserva esses nomes completos de caminho. Você pode usar

$ echo '!(a)' >exclude
$ mksquashfs /tmp mysq -ef exclude -wildcards
$ echo -e '!(d)/\nd/!(e)' >exclude
$ mksquashfs /tmp mysq -ef exclude -wildcards

Listar o sistema de arquivos com unsquashfs -l mysq produz a saída

squashfs-root/a
squashfs-root/a/b
squashfs-root/a/b/c
squashfs-root/d
squashfs-root/d/e
squashfs-root/d/e/f

Sempre que o diretório de origem é /tmp , mas a primeira vez que excluímos tudo, exceto o diretório a , e a segunda vez, excluímos tudo, exceto o diretório d e d/e . Isso usa um arquivo de exclusão de vários níveis, em que em cada linha excluímos mais uma etapa do diretório no caminho, exceto a que deve ser mantida.

Uma solução mais simples é criar a hierarquia desejada de diretórios em algum lugar e mount -bind do diretório final para o diretório real. Por exemplo,

$ 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
    
por 30.07.2018 / 16:07