2

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

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

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

2 ответа2

5

unsquashfs -s не было возможности отображать тип сжатия, используемый до этой фиксации 7 августа 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 до 5, начиная с SquashFS 4.3). Вы можете сопоставить это число со следующей таблицей, чтобы увидеть, какой метод сжатия использовался:

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

(Источник)

Обратите внимание, что приведенная выше команда 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
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .