Какой метод сжатия использовал SquashFS?

Какой метод сжатия использовал SquashFS?

У меня есть несколько файлов SquashFS, и я хотел бы узнать, как они были сжаты, чтобы иметь приблизительное представление о том, как они будут работать после монтирования.

Единственными двоичными файлами, предоставляемыми пакетом, squashfs-toolsявляются mksquashfsи unsquashfs, которые предназначены для создания/добавления файлов SquashFS и извлечения файлов SquashFS соответственно.

Как определить, какой метод сжатия использовался при создании конкретного файла SquashFS?

решение1

unsquashfs -sне имел возможности отображать используемый тип сжатия до тех пор, покаэтот коммит 07 августа 2009 г.. Это означает, что если вы используете squashfs-toolsверсию 4.0 или более раннюю, вы не сможете увидеть используемый метод сжатия.

На основе этой информации я разработал способ чтения суперблока SquashFS 4.0 для определения используемого метода сжатия (где $SQUASHFSнаходится путь к файлу SquashFS):

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

В качестве альтернативы, вот функция для тех, кто хотел бы ввести имя файла в конце строки:

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

Вы получите число (от 1 до 6 для SquashFS 4.4). Вы можете сопоставить это число со следующей таблицей, чтобы увидеть, какой метод сжатия использовался:

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

(Источник)

Обратите внимание, что приведенная выше ddкоманда предоставит надежный вывод только в том случае, если указанный вами файл имеет суперблок SquashFS 4.0. Следующая команда выведет " Not SquashFS 4.0", если файл $SQUASHFSне имеет магического числа 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"

Объяснение

В файловых системах SquashFS 4.0 метод сжатия хранится в 21- м и 22 байтах суперблока как тип данных short. dd bs=1 count=2 skip=20извлечет short, od -An -tdIпреобразует shortв понятное человеку число и xargsпредназначен только для того, чтобы избавиться от начальных пробелов.

До SquashFS 4.0 существовал толькоgzipметод.


Старый ответ

unsquashfsимеет -sфлаг для отображения информации о файловой системе SquashFS.

Пример использования:

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

Если вы просто хотите определить тип сжатия, вы можете передать вывод через awk '/^Compression/{print $2}'. Пример:

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

решение2

Утилита fileверсии 5.39 и выше поддерживает отображение сжатия squashfs. Если вы указываете fileблочное устройство, нужно указать, чтобы оно не заботилось о том, что это специальный файл, и смотрело внутрь, как будто это файл.

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

решение3

Также ищу лучший ответ. Я предполагаю, что вы хотите знать, потому что ваша ОС, похоже, не поддерживает сжатие, используемое для предоставления вам squashedfs в вопросе. Или, возможно, как и unsquashfs на CentOS6, ваша не сообщает тип сжатия.

Итак, я strings | headна сжатом файле. Первая строка будет hsqsи вторая строкадолжен указать используемый метод сжатия. Я полагаю, что использовал этот метод, чтобы определить, 7zXZчто 7zip на самом деле был методом. Однако с gzip, такой удачи не было. Мне приходится использовать od -bдля файла, чтобы получить восьмеричный дамп и попытаться сопоставить сигнатуру файла с теми, которые связаны с программой file. Однако снова не было такой удачи (строка, которую я ожидал найти, 037 213но я вижу только 037 221.

Связанный контент