Qual foi o método de compactação SquashFS?

2

Eu tenho alguns arquivos SquashFS e gostaria de saber como eles foram compactados, para que eu possa ter uma ideia aproximada de como eles seriam executados quando montado.

Os únicos binários fornecidos pelo pacote squashfs-tools são mksquashfs e unsquashfs , que são para criar / anexar arquivos SquashFS e extrair arquivos SquashFS, respectivamente.

Como posso determinar qual método de compressão foi usado para criar um arquivo SquashFS específico?

    
por Deltik 24.05.2015 / 23:05

2 respostas

4

unsquashfs -s não tem a capacidade de exibir o tipo de compactação usado até este commit em 07 de agosto de 2009 . Isso significa que, se você estiver executando squashfs-tools 4.0 ou mais, não conseguirá ver o método de compactação usado.

A partir dessas informações, eu obtive uma maneira de ler o superbloco SquashFS 4.0 para determinar o método de compactação usado (onde SQUASHFS é o caminho para o seu arquivo SquashFS):

dd if=SQUASHFS bs=1 count=2 skip=20 2>/dev/zero | od -An -tdI | xargs

Alternativamente, aqui está uma função para aqueles que gostariam de digitar o nome do arquivo no final da linha:

sqsh_comp_method(){ dd if="$1" bs=1 count=2 skip=20 2>/dev/zero|od -An -tdI | xargs;};sqsh_comp_method

Você receberá um número (entre 1 e 5 a partir do SquashFS 4.3). Você pode combinar esse número com a tabela a seguir para ver qual método de compactação foi usado:

╔═══╦════════════════════╦════════════════════╗
║ # ║ Compression Method ║ Compatible Version ║
╠═══╬════════════════════╬════════════════════╣
║ 1 ║ gzip               ║ 1.0 and newer      ║
║ 2 ║ lzma               ║ 4.1 and newer      ║
║ 3 ║ lzo                ║ 4.1 and newer      ║
║ 4 ║ xz                 ║ 4.2 and newer      ║
║ 5 ║ lz4                ║ 4.3 and newer      ║
╚═══╩════════════════════╩════════════════════╝

( Fonte )

Observe que o comando dd acima somente fornecerá uma saída confiável se o arquivo especificado tiver um superbloco SquashFS 4.0. O comando a seguir produzirá " Not SquashFS 4.0 " se o arquivo SQUASHFS não tiver o número mágico do SquashFS 4.0:

if [[ "$(dd if=SQUASHFS bs=1 count=4 skip=28 2>/dev/zero | xxd -p)" != "04000000" ]] ; then echo -n "Not " ; fi ; echo "SquashFS 4.0"

Explicação

Nos sistemas de arquivos SquashFS 4.0, o método de compactação é armazenado nos 21 st e 22 nd bytes do superbloco como um tipo de dados short . dd bs=1 count=2 skip=20 recuperará o short , od -An -tdI transformará o short em um número legível e xargs apenas para se livrar dos espaços iniciais.

Antes do SquashFS 4.0, havia apenas o método gzip .

Resposta antiga

unsquashfs tem o sinal -s para exibir informações do sistema de arquivos SquashFS.

Exemplo de uso:

deltik@node51 [/tmp]# unsquashfs -s template.squashfs
Found a valid SQUASHFS 4:0 superblock on template.squashfs.
Creation or last append time Thu Apr 30 23:07:23 2015
Filesystem size 47225242.44 Kbytes (46118.40 Mbytes)
Compression gzip
Block size 131072
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always_use_fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 23629
Number of inodes 437076
Number of ids 1

Se você quiser apenas o tipo de compactação identificado, poderá canalizar a saída por meio de awk '/^Compression/{print $2}' . Exemplo:

deltik@node51 [/tmp]# unsquashfs -s template.squashfs | awk '/^Compression/{print $2}'
gzip
    
por 24.05.2015 / 23:05
0

Também procurando uma resposta melhor. Eu estou supondo que você quer saber porque o seu sistema operacional não parece apoiar a compressão usada em fornecer-lhe o squashedfs em questão. Ou talvez como o unsquashfs no CentOS6, o seu não reporta o tipo de compressão.

Então, eu strings | head no arquivo compactado. A primeira linha será hsqs e a segunda linha deverá indicar o método de compactação usado. Eu acredito que eu usei esse método para determinar que 7zXZ indicando que 7zip era de fato o método. No entanto, com gzip , não tem essa sorte. Eu tenho que usar od -b no arquivo para obter o despejo octal e tentar corresponder a assinatura do arquivo com aqueles associados ao programa file . Novamente, no entanto, essa sorte não (a string que eu esperava encontrar é 037 213 , mas vejo apenas 037 221 .

    
por 25.05.2015 / 02:36