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.
Quando eu crio uma imagem do squashf em vários diretórios, como:
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:
Eu quero que minha imagem contenha os caminhos completos do sistema de arquivos original:
Existe alguma maneira simples de fazer isso sem primeiro fazer cópias ou mover os arquivos originais antes de criar a imagem?
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.
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