¿Cuál era el método de compresión de SquashFS?

¿Cuál era el método de compresión de SquashFS?

Tengo algunos archivos SquashFS y me gustaría saber cómo se comprimieron para poder tener una idea aproximada de cómo funcionarían al montarlos.

Los únicos archivos binarios proporcionados por el squashfs-toolspaquete son mksquashfsy unsquashfs, que sirven para crear/añadir archivos SquashFS y extraer archivos SquashFS, respectivamente.

¿Cómo puedo determinar qué método de compresión se utilizó para crear un archivo SquashFS específico?

Respuesta1

unsquashfs -sno tenía la capacidad de mostrar el tipo de compresión utilizado hastaeste compromiso el 07 de agosto de 2009. Esto significa que si está ejecutando squashfs-tools4.0 o anterior, no podrá ver el método de compresión utilizado.

A partir de esta información, deduje una forma de leer el superbloque de SquashFS 4.0 para determinar el método de compresión utilizado (dónde $SQUASHFSestá la ruta a su archivo SquashFS):

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

Alternativamente, aquí hay una función para aquellos que quieran escribir el nombre del archivo al final de la línea:

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

Obtendrá un número (entre 1 y 6 a partir de SquashFS 4.4). Puede hacer coincidir ese número con la siguiente tabla para ver qué método de compresión se utilizó:

╔═══╦════════════════════╦════════════════════╗
║ # ║ 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      ║
╚═══╩════════════════════╩════════════════════╝

(Fuente)

Tenga en cuenta que el comando anterior ddsolo proporcionará un resultado confiable si el archivo que especificó tenía un superbloque SquashFS 4.0. El siguiente comando generará " Not SquashFS 4.0" si el archivo $SQUASHFSno tiene el número mágico de 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"

Explicación

En los sistemas de archivos SquashFS 4.0, el método de compresión se almacena en los bytes 21 y 22 del superbloque como un tipo de datos short. dd bs=1 count=2 skip=20recuperará el short, od -An -tdIlo convertirá shorten un número legible por humanos y xargses solo para deshacerse de los espacios iniciales.

Antes de SquashFS 4.0, solo existía lazipmétodo.


Antigua respuesta

unsquashfstiene la -sbandera para mostrar información del sistema de archivos SquashFS.

Uso de ejemplo:

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

Si solo desea identificar el tipo de compresión, puede canalizar la salida a través de awk '/^Compression/{print $2}'. Ejemplo:

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

Respuesta2

La fileutilidad en la versión 5.39 y superiores admite la visualización de la compresión de squashfs. Si se proporciona fileun dispositivo de bloque, es necesario decirle que no le importe que sea un archivo especial y mirar dentro como si fuera un archivo.

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

Respuesta3

También buscando una mejor respuesta. Supongo que quieres saberlo porque tu sistema operativo no parece admitir la compresión utilizada para proporcionarte los squashedfs en cuestión. O tal vez, como los unsquashfs en CentOS6, el suyo no informa el tipo de compresión.

Entonces yo strings | headen el archivo comprimido. La primera línea será hsqsy la segunda línea.debería indicar el método de compresión utilizado. Creo que utilicé este método para determinar que 7zXZindicaba que 7zip era de hecho el método. Sin embargo, gzipno tuvo tanta suerte. Tengo que usarlo od -ben el archivo para obtener el volcado octal e intentar hacer coincidir la firma del archivo con las asociadas con el fileprograma. Nuevamente, sin embargo, no tuve tanta suerte (la cadena que esperaba encontrar es 037 213pero solo veo 037 221.

información relacionada