Squashfs — файловая система только для чтения со встроенным сжатием. Она давно используется в live-образах, AppImage и snap-пакетах, но полезна и в обычной работе: для архива документации, неизменяемого набора данных, прошивки устройства или основы контейнера. Разберём сборку образа, монтирование, распаковку и добавление записываемого слоя через overlayfs.

Зачем нужен Squashfs

Главные свойства — компактность и предсказуемость. Сжатые блоки уменьшают размер, а режим только для чтения исключает случайное изменение файлов. Ядро Linux поддерживает Squashfs штатно, дополнительные модули обычно не требуются. Один образ можно смонтировать на нескольких машинах и раздавать по сети, не распаковывая его целиком.

Обратная сторона — невозможность записи. Обновление образа означает пересборку, а для изменяемых данных нужен отдельный слой или каталог. Squashfs также не подходит для баз данных и файлов, которые часто перезаписываются: случайный доступ к сжатым блокам медленнее, чем к обычной файловой системе.

Установка инструментов

sudo apt update
sudo apt install squashfs-tools
mksquashfs -version
unsquashfs -version

В Fedora и Arch Linux пакет называется так же — squashfs-tools. В состав входят mksquashfs, unsquashfs и sqfscat. Для работы с overlayfs дополнительных пакетов не нужно, модуль ядра overlay есть в большинстве дистрибутивов.

Сборка образа

Подготовьте каталог с файлами и соберите образ. Если файл образа уже существует, без -noappend утилита попытается дописать новые данные к нему, что обычно не то, что нужно.

mksquashfs ./rootfs ./rootfs.squashfs -comp zstd -b 256K -noappend
ls -lh ./rootfs.squashfs
file ./rootfs.squashfs
unsquashfs -s ./rootfs.squashfs

file покажет тип образа, а unsquashfs -s — суперблок: алгоритм сжатия, размер блока, количество inode и файлов. Эти сведения полезны, когда образ получен извне и нужно понять, чем он собран.

Чтобы владельцы файлов не зависели от исходного каталога, добавьте -all-root, а временные каталоги исключите:

mksquashfs ./rootfs /srv/images/rootfs.squashfs -comp zstd -b 1M -noappend -all-root -processors "$(nproc)" -wildcards -e 'proc/*' 'sys/*' 'tmp/*' 'var/log/*'

Шаблоны -e задаются относительно исходного каталога. Проверьте их на тестовой сборке: слишком широкое исключение легко оставляет образ без нужных файлов.

Сжатие и размер блока

Доступные алгоритмы зависят от сборки утилит: обычно это gzip, lz4, xz и zstd. Выбор — компромисс между степенью сжатия, скоростью сборки и скоростью чтения.

mksquashfs ./rootfs /tmp/gzip.squashfs -comp gzip -b 128K -noappend
mksquashfs ./rootfs /tmp/lz4.squashfs -comp lz4 -b 256K -noappend
mksquashfs ./rootfs /tmp/zstd.squashfs -comp zstd -Xcompression-level 19 -b 1M -noappend
ls -lh /tmp/*.squashfs

gzip совместим со старыми системами и даёт среднее сжатие. lz4 распаковывается быстрее всех и подходит для live-систем, где важен отклик. xz сжимает сильнее, но требует больше процессорного времени при сборке. zstd — разумный баланс для большинства задач; уровень задаётся от 1 до 22, высокие значения заметно увеличивают время сборки.

Размер блока -b может быть от 4 КБ до 1 МБ и должен быть степенью двойки. Больший блок обычно улучшает сжатие, но увеличивает минимальную порцию чтения. Для смешанной нагрузки часто берут 128–256 КБ.

Просмотр и распаковка

unsquashfs -l ./rootfs.squashfs | head -30
unsquashfs -cat ./rootfs.squashfs etc/os-release
mkdir -p /srv/rootfs-check
unsquashfs -d /srv/rootfs-check ./rootfs.squashfs

-l выводит список файлов без распаковки, -cat показывает содержимое одного файла, -d задаёт каталог назначения. Если каталог уже существует, утилита может отказаться перезаписывать файлы; параметр -f разрешает перезапись, но применять его стоит осознанно.

Монтирование только для чтения

sudo mkdir -p /mnt/image
sudo mount -t squashfs -o loop,ro ./rootfs.squashfs /mnt/image
findmnt /mnt/image
df -h /mnt/image
sudo umount /mnt/image

Опция loop подключает файл как блочное устройство, ro фиксирует режим только для чтения. Даже root не сможет создать файл в смонтированном каталоге — ядро вернёт ошибку Read-only file system. Это удобно для проверки целостности и для сценариев, где изменение данных должно быть явным событием.

Если нужно подменить владельца файлов для непривилегированного пользователя, используйте опции uid= и gid= при монтировании. Для постоянного подключения добавьте строку в /etc/fstab:

/srv/images/rootfs.squashfs /srv/rootfs squashfs loop,ro,uid=1000,gid=1000 0 0
sudo findmnt --verify
sudo mount -a
findmnt /srv/rootfs

Изменяемый слой через overlayfs

Основу только для чтения можно дополнить записываемым слоем. Overlayfs монтирует объединённый каталог: чтение идёт из Squashfs, а изменения попадают в каталог upper.

sudo mkdir -p /srv/overlay/upper /srv/overlay/work /srv/overlay/merged
sudo mount -t overlay overlay -o lowerdir=/mnt/image,upperdir=/srv/overlay/upper,workdir=/srv/overlay/work /srv/overlay/merged
touch /srv/overlay/merged/test.txt
ls -l /srv/overlay/upper/test.txt
sudo umount /srv/overlay/merged

Каталоги upper и work должны находиться на одной файловой системе, а work — быть пустым при монтировании. Изменения сохраняются в upper и исчезают вместе с ним, если не сделать резервную копию. Такой схемой пользуются live-системы и некоторые контейнерные среды.

Диагностика и типичные ошибки

  • mount: wrong fs type — модуль squashfs не загружен или ядро собрано без поддержки; проверьте modprobe squashfs и lsmod.
  • failed to read superblock — файл повреждён или это не Squashfs; проверьте file и контрольную сумму.
  • Образ получился больше исходного каталога — данные уже сжаты (например, архивы JPEG), либо выбран неудачный алгоритм.
  • Не хватает места при распаковке — unsquashfs создаёт полный набор файлов; проверьте df -h.
  • Ошибка прав в overlay — upper и work должны быть доступны на запись процессу монтирования.

Проверить поддержку сжатия в ядре можно через zcat /proc/config.gz | grep SQUASHFS или grep SQUASHFS /boot/config-$(uname -r). Если нужного алгоритма нет, ядро не смонтирует образ, даже если unsquashfs его читает.

Как альтернативу стоит держать в виду EROFS: она тоже работает только для чтения и поддерживает сжатие, но ориентирована на другой профиль нагрузки. Для архивов и live-образов Squashfs остаётся простым и предсказуемым выбором.

Чек-лист

  • Соберите образ с явным алгоритмом и размером блока.
  • Проверьте суперблок через unsquashfs -s.
  • Смонтируйте с loop,ro и убедитесь, что запись запрещена.
  • Для изменений используйте overlayfs, а не попытки перемонтировать Squashfs в rw.
  • Храните исходный каталог или скрипт сборки рядом с образом.
  • Проверяйте свободное место перед распаковкой и обновлением.

Итог

Squashfs — надёжный способ упаковать набор файлов в компактный образ, который нельзя случайно изменить. Сборка занимает одну команду, монтирование — ещё одну, а overlayfs добавляет записываемый слой там, где он действительно нужен. Используйте zstd или lz4 для скорости, xz для максимального сжатия и всегда проверяйте образ через unsquashfs -s перед развёртыванием.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте