Что такое SquashFS?

Это HOWTO описывает использование SquashFS — высоко сжатой файловой системы только-для-чтения для Linux, которая предназначена для использования в очень маленьких и встроенных системах, где хотелось бы использовать сжатую файловую систему. С этим документом вы узнаете как подготовить Linux-ядро для SquashFS, создать сжатую файловую систему и успешно пользоваться ей.

Вступление

Когда создаются маленькие и встроенные Linux-системы, каждый байт запоминающего устройства (дискета, флэш-карта и т. д.) очень важен, поэтому сжатие используется везде, где возможно. Также, сжатые файловые системы часто используются для целей архивирования. Для огромных общих архивов, так же, как и для персональных медиа-архивов, это насущно необходимо.

ShquashFS выводит всё это на новый уровень. Это файловая система только для чтения, которая позволяет вам сжимать целые файловые системы или отдельные директории, переписывать их в другие устройства/разделы или в обычные файлы, а затем устанавливать их непосредственно (если это устройство) или использовать закольцовку устройства (в случае с файлом). Модульный, компактный системный дизайн SquashFS блестящ. Для целей архивирования SquashFS предоставляет вам гораздо большую гибкость и скорость исполнения, чем архивы .tar.gz.

В выпуск SquashFS исходные тексты Linux-ядра (что делает возможным чтение Squash на вашем ядре), а также вспомогательная программа mksquashfs, которая создает сжатые файловые системы (в файле или в блочном устройстве).

Последнее дерево выпуска SquashFS 2.x, предыдущая была 1.x. Этот документ описывает оба эти выпуска с соответствующими пометками. Например, если какое-либо свойство или параметр различны в этих выпусках, это будет обозначено как: новое значение (2.х) или старое значение (1.х).

Обзор SquashFS

  • Данные, связующие узлы и директории сжаты.
  • Squashfs сохраняет полностью идентификаторы пользователя/группы (uin/gids) (32 бита) и время создания файла.
  • Поддерживаются файлы до 232 байт. Файловые системы могут быть до 232 байт.
  • Данные узлов и директорий очень сильно сжаты и упакованы в байтовых пределах. Каждый сжатый узел имеет в среднем размер 8 байт (конкретная длина зависит от типа файла (то есть обычный файл, директория, символьная ссылка и блочные/символьные узлы устройства имеют различные размеры).
  • Squashfs может использовать блоки размером до 64 Кб (размер по умолчанию 64 Кб). Использование 64-килобайтовых блоков позволяет достигать большей степени сжатия, чем обычный 4-килобайтовый размер блока.
  • SquashFS привносит концепцию фрагментарных блоков: возможность объединять множественные файлы, по размеру меньшие блока, в отдельный блок, достигая больших степеней сжатия.
  • Копии файлов обнаруживаются и удаляются.
  • Поддерживаются архитектуры как big-endian, так и little-endian.
  • SquashFS может собирать файловые системы, созданные на машинах с различной последовательностью байтов.

Разъяснения

Теперь давайте убедимся, что любые последующие обсуждения вам будем проще понять. Процедура запуска работы SquashFS, в целом, состоит из следующих шагов:

  • Патч и рекомпиляция Linux-ядра для возможности поддержки SquashFS
  • Компиляция mksquashfstool
  • Создание сжатой файловой системы с mksquashfs
  • Проверка: установка squashfs в место временного назначения
  • Модифицирование стартовых скриптов /etc/fstab вашей целевой Linux-системы для установления новой сжатой файловой системы, когда это необходимо

Приготовления для SquashFS

Приобретение SquashFS

Домашняя страница SquashFS содержит новости о последнем выпуске и лог изменений, а также общую информацию о SquashFS. Вы можете заполучить последнюю версию на странице проекта SquashFS SourceForge.

Подготовка совместимого со SquashFS ядра

Для того, чтобы читать SquashFS, вам необходимо, чтобы она поддерживалась вашим ядром — точно так же, как если бы это были файловые системы reiserfs или ext3. Вы должны убедиться в наличии соответствующего пaтча для вашей версии ядра — он должен быть расположен в субдиректории linux-2.x.y в дереве исходных текстов SquashFS. Помните также, что в большинстве случаев вам понадобится чистое (оригинальное) Linux-ядро от www.kernel.org. Если ваше ядро от продавца-дистрибьютера, оно может быть уже пропатчено, поэтому с патчем SquashFS скорее всего не будет работать, поскольку патчи SquashFS сделаны для оригинальных Linux-ядер.

"Склейка" исходных текстов ядра

С исходниками ядра и наличием надлежащего патча все, что вам нужно делать это (мы исходим из того, что у вас имеются исходные тексты ядра Linux в /usr/src/linux и xnj и исходные тексты SquashFS в /usr/src/squashfs):

Внести изменения в директорию исходников SquashFS и скопировать пaтч ядра (мы исходим из того, что он называется squashfs-patch) в /usr/src/linux.

cd /usr/src/squashfs
cp linux-2.x.y/squashfs-patch /usr/src/linux

Идем в директорию исходных текстов Linux /usr/src/linux:

cd /usr/src/linux

Внимание: помните, что мы не будем покидать эту директорию в течение всех последующих связанных с ядром процедур и все дорожки будут даваться относительно /usr/src/linux.

Теперь «склеиваем» исходные тексты с помощью пaтча SquashFS:

patch -p1 < squashfs-patch

Компиляция ядра 2.6.x

чистим и подготовим ядро программы:

make distclean
make mrproper

Выберем конфигурацию ядра используя ваш любимый метод (config/menuconfig/xconfig/gconfig):

make menuconfig

В разделе «File systems» («Файловые системы»), подразделе «Miscellaneous (различные) file systems» активируем опцию «Squashed filesystem» в качестве модуля либо как связанную с ядром. Обязательно компилировать SquashFS внутри ядра только в том случае, если планируем использовать «сквошенные» начальные виртуальные диски (initrd).

Для использования сжатого начального виртуального диска, активируем «Initial RAM disk support» в разделе «Device drivers», подразделе «Block devices».

Чтобы иметь возможность установить сжатую файловую систему после закольцовки устройства, следует активировать опцию «Loopback device support» («Поддержка закольцовки») и разделе «Device drivers» («Драйвера»), подразделе «Block devices» («Блочные устройства»).

Теперь вы можем компилировать ядро и модули:

make

Компиляция ядра 2.4.x

Выберем конфигурацию:

make menuconfig

В разделе «File systems» активируем опцию «Squashed filesystem» в качестве модуля либо как связанную с ядром. Обязательно компилировать SquashFS внутри ядра только в том случае, если планируется использовать «сквошенные» начальные виртуальные диски (initrd).

Если хотим использовать «сквошенные» начальные вирт диски, активируем «Initial RAM disk support» (поддержку начальных вирт дисков) в разделе «Block devices» («Блочные устройства»).

Чтобы иметь возможность установить сжатую файловую систему после закольцовки устройства, следует активировать опцию «Loopback device support» («Поддержка закольцовки») и разделе «Device drivers» («Драйвера»), подразделе «Block devices» («Блочные устройства»).

Теперь можно компилировать ядро и модули:

make dep
make bzImage
make modules

Инсталляция и тестирование ядра

Теперь пора инсталлировать ваше новое ядро с возможностью работы SquashFS. Инструкции ниже для инсталляции и начальной загрузки ядра на хостовой машине.

Мы исходим из того, что ядро было компилировано на x.86 архитектуре, и что сжатый образ ядра находится в arch/i386/boot/ субдиректории дерева ядра. Теперь скопируем ядро в директорию /boot (и назовем для удобства bzImage-sqsh):

cp arch/i386/boot/bzImage /boot/bzImage-sqsh

Не забудем инсталлировать модули ядра, если они у вас есть:

make modules_install

Модифицируем конфигурацию файла начального загрузчика, чтобы он включал теперь наше новое ядро и инсталлируем (обновляем) начальный загрузчик. Теперь можно перезагрузиться с новым ядром. Когда оно запустится, проверим, что все прошло правильно:

cat /proc/filesystems

Или, если установили поддержку SquashFS в качестве модульного ядра:

insmod squashfs
cat /proc/filesystems

Если видим строку squashfs над другими файловыми системами, это означает, что SquashFS успешно внедрена в ядро.

Компиляция вспомогательной программы mksquashfs

Теперь нам нужно скомпилировать mksquashfs — инструмент для создания сжатых файловых систем

cd /usr/src/squashfs/squashfs-tools

Компилируем и установим mksquashfs:

make
cp mksquashfs /usr/sbin

Если все прошло хорошо, набираем mksquash в строке подсказки, что выдаст сообщение как им пользоваться.

Вспомогательная программа mksquashfs, как она есть

Использование mksquashfs

mksquashfs — это инструмент для создания новых «сквошенных» файловых систем и для добавления новых данных в уже существующие сквошенные файловые системы. Основной вид командной строки для mksquashfs:

mksquashfs source1 source2 ... destination [options]
source1, source2 и т. д.
файлы и директории, которые должны быть в итоге добавлены в полученную файловую систему с относительными и/или абсолютными путями
destination
обычный файл (файловая система, образ файла) или блочное устройство (такое как /dev/fd0 или /dev/hda3), куда мы хотим поместить свою сжатую файловую систему.

Заметки по работе mksquashfs по умолчанию:

Когда новые файлы добавляются в новую файловую систему или присоединяются к уже существующей, mksquashfs будет автоматически переименовывать файлы с одинаковыми именами: если два или более файла с названием text появятся в одной полученной директории, второй файл будет переименован в text_1, третий в text_2 и т. д.

Идентичные файлы будут удалены, поэтому будет оставаться только один физический экземпляр (в SquashFS 2.x можно отменить поиск/удаление копий с опцией --no-duplicates).

Если в пункте назначения уже есть существующая SquashFS по умолчанию, новые пункты будут добавлены в существующую ветвь директорий. Необходимо проверить список опций ниже, чтобы заставить mksquash переписать пункт назначения полностью и/или изменить его таким образом, чтобы добавить новые элементы исходных текстов. Пожалуйста обратите внимание, что невозможно присоединять записи к файловой системе, созданной с mksquashfs1.x используя mksquashfs2.x. Для этого понадобится установить SqyashFS-1.x файловую систему и скопировать файлы куда-нибудь, а затем присоединить их с другими нужными файлами, чтобы создать файловую систему SquashFS-2.x.

Если даны один файл исходных текстов или директория, они становятся ветвью в заново созданной файловой системе. Если даны два или более файлов исходников и/или директорий, они все станут подпунктами в ветви новой файловой системы.

Полученная в результате файловая система будет упакована во множество пакетов 4 Кб: это необходимо для файловых систем, используемых в блочных устройствах. Если вы абсолютно уверены, что вам это не понадобится, используйте опцию --nopadoption, чтобы отменить эту операцию.

Смотрите следующий раздел с более подробным описанием всех возможных опций.

Опции командной строки

Все возможные опции для mksquashfs представлены в таблице ниже.

Таблица 1. Опции командной строки инструмента mksquashfs

Описание опций

-2.0 заставляет mksquashfs версии 2.1 создавать файловую систему версии 2.0
-all-root или –root-owned объединяет все файлы целевой файловой системы в ветвь (UID=o, GID=o)
-always-use-fragments разделяет все файлы размером больше блока на фрагменты (только 2.x, достижение больших степеней сжатия)
-b [block size] использует [block size] размер блока файловой систему (32 Кб по умолчанию) — это может быть также 512, 1024, 2048, 4069, 8192, 16384 или 32768
-be или -le запускает big endian либо little endian файловую систему, соответственно.
-check-data активирует дополнительные проверки файловой системы
-e [file 1] ([file 2] …) задает, какие файлы и/или директории нужно опустить из новой файловой системы, которая должна создаваться
-ef [file] указывает файл, который содержит перечень файлов/директорий, которые нужно исключить
-force-gid [GID] устанавливает все групповые ID в целевой файловой системе в [GID] (может быть указано как имя или число)
-force-uid [UID] устанавливает все юзерские ID в целевой файловой системе в [UID] (может быть указано как имя или число)
-info выдает файлы, их оригинальный размер и степень сжатия после добавления в файловую систему
-keep-as-directory если исходный текст представляет из себя одну директорию, опция делает эту директорию субдиректорией ветви в созданной файловой системе
-noappend если целевой файл/устройство уже содержит сжатую файловую систему, лучше перепишите его, чем добавлять новые данные в уже существующую файловую систему
-no-duplicates не обнаруживает/удаляет одинаковые имена файлов
-noD или –noDataCompression не сжимать данные
-noF или –noFragmentCompresstion не сжимать фрагменты (только для 2.x)
-no-fragments не создавать фрагментарные блоки (только для 2.x, это создаст практически такую же файловую систему, как 1.x)
-noI или –no-Inode-Compresstion не сжимать таблицу узлов
-nopad не паковать полученную файловую систему во множественные пакеты 4 Кб
-root-becomes [name] может быть использована в процессе присоединения к уже существующей сжатой файловой системе: это создаст новый корень и [имя] директорию, которая будет содержать все пре-существующие файлы/директории
-version выдает сообщение о версии, авторских правах и лицензии

В большинстве случаев нужно оставить все опции сжатия/блоков по умолчанию, поскольку они позволяют mksquashfs достигать наилучших возможных степеней сжатия.

Создание и использование сжатых файловых систем

Основные шаги

Для того, чтобы создать сжатую файловую систему из одной директории (скажем, /some/dir (какая-то/директория)) и вывести ее в обычный файл (таким образом продуцируя образ файловой системы), нужно сказать только одну волшебную фразу:

mksquashfs /some/dir dir.sqsh

mksquashfs начнет сжимать и печатать получаемое число узлов и размер записанных данных, так же, как среднюю степень сжатия. Теперь у нас есть образ директории /some/dir в файле dir.sqsh. Теперь можно использовать команду установки, чтобы установить ее используя устройство закольцовки:

mkdir /mnt/dir
mount dir.sqsh /mnt/dir -t squashfs -o loop

Чтобы проверить, получилось ли то, что ожидали:

ls /mnt/dir

Если мы хотим вывести файловую систему непосредственно в устройство (скажем, дискета на /dev/fd0):

mksquashfs /some/dir /dev/fd0

Затем просто установим устройство:

mount /dev/fd0 /mnt/floppy -t squashfs

И проверим, все ли в порядке:

ls /mnt/floppy

Сжатие файловых систем

Операции, описанные здесь, обращены к большинству случаев, когда может использоваться сжатая файловая система только-для-чтения, хотите ли вы, чтобы она была на блочном устройстве или в файле. Это может быть все что угодно начиная от FTP/HTTP архивов, которые часто не обновляются до сжатого сегмента памяти и все, что угодно в этом духе.

Пример 1

Давайте предположим, что у нас есть директория /var/arch со множеством файлов и что надо превратить ее в сжатую файловую систему и сохранить на вашем сегменте ветви в качестве файла (это будет образ файловой систему который вы установите через кольцевое устройство). Операции, которые понадобится сделать:

Сожмем директорию, затем установим через кольцевое устройство, чтобы проверить:

mksquashfs /var/arch /var/arch.sqsh
mkdir /mnt/tmp
mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
ls /mnt/tmp

Если все прошло, как ожидалось, чтобы файловая система устанавливалась автоматически во время запуска, добавим эту строку в /etc/fstab:

/var/arch.sqsh/var/archsquashfsro,defaults0 0

Извлекаем файловую систему из временного места установки и установите используя компонент fstab:

umount /mnt/tmp
mount /var/arch

Теперь просто убедимся, что все работает хорошо:

ls /var/arch

Пример 2

Предположим, что у нас есть два раздела жесткого диска, /dev/hda6 (который пуст) и /dev/hda7 (который больше, чем /dev/hda6, установлен в /at/arch, содержит те же данные и полон). Теперь скажем, мы хотим сжать файловую систему /dev/hda7 и переместить ее в /dev/hda6, потом использовать /dev/hda7 для каки-то других целей. Мы предположим, что у нас будет следующая строка в /etc/fstab (reiserfs это просто пример файловой системы, используемой на /dev/hda7):

/dev/hda7/var/archreiserfsdefaults0 0

И точно таким же образом, как с предыдущим примером:

mksquashfs /var/arch /var/arch.sqsh
mkdir /mnt/tmp
mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
ls /mnt/tmp

Если все прошло хорошо, извлекаем /dev/hda7 (если нужно) и используйте dd чтобы копировать var/arch/sqsh в /dev/hda6:

umount /dev/hda7
dd if=/var/arch.sqsh of=/dev/hda6

Теперь изменим строку в /etc/fstab для /dev/hda7 на:

/dev/hda6/var/archsquashfsro,defaults0 0

Установим новую файловую систему и проверим, все ли прошло хорошо:

mount /var/arch
ls /var/arch

Не забудем стереть ненужный образ файловой системы:

rm /var/arch.sqsh

Создание маленьких/встроенных систем

Под «маленькие/встроенные», подразумеваются Linux-системы, которые строятся в первоначальной загрузкой c дискет, IDE/USB флэш дисков, iso9660 CD-ROM'ов, маленьких жестких дисков и т.д. Хотите ли вы иметь вашу целую корневую файловую систему или единичный носитель (единичный сегмент, одна дискета) или у вас модульная система (несколько дискет или сегментов диска), процедура практически идентична. Создание таких Linux-систем стоит вне контекста этого HOWTO — есть специальные HOWTO и гиды для этого (такие, как Bootdisk HOWTO и Linux From Scratch — посетите tldp.org чтобы найти эти документы).

Сжатые файловые системы на дискетах/флэш/жестких дисках

Чтобы использовать SquashFS для создания Linux-систем на маленьких дисках, нужно сделать следующие обычные шаги для создания минимальных систем.

Проделайте следующие операции в соответствующих пунктах:

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

Используйте mksquashfs для создания начального виртуального диска только-для-чтения и/или ветви и/или других файловых систем.

Не забудьте установить типа файловых систем для squashfs в /etc/fstab и/или начальных скриптах вашей системы для установления сжатых файловых систем.

Пример с дискетой. Предположим что у нас есть дерево системы дискеты в /home/user/floppylinux и мы хотим поместить корневую файловую систему на одну дискету, а /usr на другую. Что надо сделать:

cd /home/user
mksquashfs floppylinux root.sqsh -e usr
mksquashfs floppylinux/usr usr.sqsh

Примечание 1: здесь можно видеть, как мы используем опцию -e чтобы исключить директорию /usr из образа корневой файловой системы.

Примечание 2: не забудьте указать squashfs в директории /etc/fstab вашего корневого диска или стартовых скриптах когда устанавливаете файловую систему /usr.

Вставляем корневой диск в накопитель (предполагается , что на ней есть, положим, компилятор, и, таким образом, файловая система существует на этой дискете, а корневая файловая система будет постоянно храниться под директорией /boot этой файловой системы):

mount /mnt/floppy
cp root.sqsh /mnt/floppy/boot

Когда будет сделано, вытаскиваем корневую дискету, меняем дискеты на /usr диск и используем dd для передачи данных на usr:

dd if=usr.sqsh of=/dev/fd0

Сжатые файловые системы на CD-ROM

Посредством SquashFS можно сжимать большие файловые системы, что может быть использовано в CD дисках (просто как пример).

Запустите SquashFS в Linux-ядре целевой системы. Создаем сжатую корневую файловую систему. Изменяем начальные скрипты /etc/fstab целевой системы чтобы установить сжатую файловую систему, когда она нам понадобится.

Если мы создаем корневую файловую систему из запущенной Linux-системы, используем опцию -e, чтобы mksquashfs исключил все псевдо-файловые системы, такие, как /proc, /sys (на Linux-ядре после 2.5x) и /dev (когда используется DevFS). Также не забываем добавить сам образ ядра файловой системы который создается вместе с mksquashfs (Предполагается, что вы знаете причины для этих исключений).

Благодарности

Я бы хотел выразить мою искреннюю благодарность и безмерное уважение:

Phillip Lougher — за его блестящую работу по squashfs, за создание эксклюзивного патча для linux-2.4.18, за его помощь в редактировании этого howto и ответы на мои письма.

Tabatha Marshall из TLDP Проекта Документации Linux за помощь мне написании этого HOWTO финального выпуска 1.0.

Всех из Проекта Документации Linux за их великолепную работу над всеми HOWTO и гидами, которые сильно помогли мне в исследовании и изучении тонкостей Linux.

Всех из рассылочных листов Проекта Документации Linux, которые помогли мне начать.

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

Лицензия

Этот документ может быть использован и распространен в пределах и под условиями , последующими дальше в Open Content licencе. Коротко это означает, что вы можете свободно изменять и распространять это HOWTO с основным условиям , что вы сохраняете ссылку на автора и авторские права. Полный текст лицензии вы можете увидеть на http://www.opencontent.org/opl.shtml


Artemyi I. Pavlov

Опубликовал и редактировал Виктор Мелехин

Печать/экспорт