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 перед развёртыванием.