Каков был метод сжатия SquashFS?
У меня есть несколько файлов SquashFS, и я хотел бы знать, как они были сжаты, чтобы иметь представление о том, как они будут работать при монтировании.
Единственные двоичные файлы, предоставляемые squashfs-tools
пакет mksquashfs
а также unsquashfs
, которые предназначены для создания / добавления файлов SquashFS и извлечения файлов SquashFS, соответственно.
Как определить, какой метод сжатия использовался для создания определенного файла SquashFS?
3 ответа
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
Утилита версии 5.39 и выше поддерживает отображение сжатия squshfs. Если давать
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
Также ищите лучший ответ. Я предполагаю, что вы хотите знать, потому что ваша ОС, похоже, не поддерживает сжатие, используемое для предоставления вам рассматриваемых squashedfs. Или, возможно, как unsquashfs на CentOS6, ваш не сообщает тип сжатия.
Так что я strings | head
на сжатый файл. Первая строка будет hsqs
а вторая строка должна указывать используемый метод сжатия. Я считаю, что я использовал этот метод, чтобы определить, что 7zXZ
указывая, что 7zip был на самом деле метод. Однако с gzip
Нет такой удачи. Я должен использовать od -b
в файле, чтобы получить восьмеричный дамп и попытаться сопоставить подпись файла с теми, которые связаны с file
программа. Опять же, однако, нет такой удачи (строка, которую я ожидал найти, 037 213
но я вижу только 037 221
,