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

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

Eu tenho alguns arquivos SquashFS e gostaria de saber como eles foram compactados para que eu possa ter uma ideia aproximada de como eles funcionariam quando montados.

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

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

Responder1

unsquashfs -snão tinha 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-toolsa versão 4.0 ou anterior, não conseguirá ver o método de compactação usado.

A partir dessas informações, deduzi uma maneira de ler o superbloco SquashFS 4.0 para determinar o método de compactação usado (onde $SQUASHFSestá 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 quem gostaria 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 6 no SquashFS 4.4). 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      ║
║ 6 ║ zstd               ║ 4.4 and newer      ║
╚═══╩════════════════════╩════════════════════╝

(Fonte)

Observe que o comando acima ddsó fornecerá uma saída confiável se o arquivo especificado tiver um superbloco SquashFS 4.0. O seguinte comando produzirá " Not SquashFS 4.0" se o arquivo $SQUASHFSnã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º e 22º bytes do superbloco como um tipo de dados short. dd bs=1 count=2 skip=20recuperará o short, od -An -tdItransformará o shortem um número legível por humanos e xargsserve apenas para se livrar dos espaços iniciais.

Antes do SquashFS 4.0, havia apenas ogzipmétodo.


Resposta antiga

unsquashfspossui o -ssinalizador 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ê deseja apenas que o tipo de compactação seja identificado, você pode canalizar a saída por meio de awk '/^Compression/{print $2}'. Exemplo:

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

Responder2

O fileutilitário na versão 5.39 e superior suporta a exibição da compactação squashfs. Ao fornecer fileum dispositivo de bloco, é necessário dizer a ele para não se importar com o fato de ser um arquivo especial e olhar para dentro como se fosse um arquivo.

file --special-files /dev/mmcblk0p1
/dev/mmcblk0p1: Squashfs filesystem, little endian, version 4.0, zlib compressed, 817826784 bytes, 27633 inodes, blocksize: 131072 bytes, created: Mon Nov 29 20:51:12 2021

Responder3

Também procurando uma resposta melhor. Presumo que você queira saber porque seu sistema operacional não parece suportar a compactação usada para fornecer os squashedfs em questão. Ou talvez como o unsquashfs no CentOS6, o seu não reporta o tipo de compactação.

Então eu estou strings | headno arquivo compactado. A primeira linha será hsqse a segunda linhadeve indique o método de compressão utilizado. Acredito que usei esse método para determinar isso, 7zXZindicando que 7zip era de fato o método. No entanto, com gzip, não tive essa sorte. Eu tenho que usar od -bno arquivo para obter o dump octal e tentar combinar a assinatura do arquivo com aquelas associadas ao fileprograma. Novamente, porém, não tive essa sorte (a string que eu esperava encontrar é, 037 213mas vejo apenas 037 221.

informação relacionada