Squashfs. Как сжать файловую систему

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

Кое-кто наверняка слышал про squashfs. Это сжатая файловая система, которую обычно используют на LiveCD.
Понадобилось мне сжать систему на моем EeePC (что бы уложиться в 2Гб SD-флешку), и нашел я вот такую заметку (на английском). Сейчас сделаем почти так же, но в более расширенном варианте.
Основная суть этого метода - сжимать не всю файловую систему, а только выборочные папки (/usr например). Если сжать все, то придется изменять initrd, что бы система продолжала загружаться. А если только /usr, то изменения минимальны.

Но как быть с записью, ведь squashfs только для чтения? А на этот случай есть подключаемая файловая система unionfs. Сначала "подключаем" в /usr наш сжатый образ (только для чтения), а потом поверх какую нибудь папку, уже с возможностью записи. И тогда все изменения будут храниться в отдельной папке.

Для поддержки Squashfs в официальном linux-ядре потребуются патчи патчей.

Итак начнем. Это можно делать прямо из рабочей системы, пока ничего необратимого не делаем.
Код:
#создаем overlay-папку, куда будут писаться изменения
mkdir -p /.filesystems/usr/overlay
#Создаем сжатый образ /usr
mksquashfs /usr /.filesystems/usr/usr.sqfs

Что бы модули этих файловых систем загружались автоматически добавляем в /etc/modules:
Код:
unionfs
squashfs
loop

И в файл /etc/fstab добавляем точки монтирования
Код:
/.filesystems/usr/usr.sqfs /usr squashfs ro,loop,nodev 0 0
unionfs /usr unionfs nodev,noatime,dirs=/.filesystems/usr/overlay=rw:/usr=ro 0 0

Первая строка - простое монтирование сжатого образа, а вторая - добавление overlay-папки через unionfs. В папке /usr будут лежать все файли из образа, и /.filesystems/usr/overlay. А если создать в /usr файл, то он появится в /.filesystems/usr/overlay.

Далее перезагружаемся, если все нормально, то можно загрузиться с LiveCD (или чистой консоли), и удалить/переместить содержимое /usr, пустая папка /usr должна остаться.

Результаты
/usr 1300Мб -> 520Мб
Вся система 1600Мб -> 840Мб

Как видно, даже при сжатии только usr, система стала в 2 раза меньше. Если сжать всю систему, а не только usr, то получится 600мб.

Производительность
А теперь оценим как быстро все это работает.
Для этого просто сравним время распаковки образа, с копированием /usr.
Код:
#!/bin/bash
#создаем временные точки папки
mkdir mp target target2
#монтируем образ
sudo mount /.filesystems/usr/usr.sqfs mp -o loop
#время распаковки
time cp -R mp/* target
#время несжатой стсиемы
time cp -R target/* target2

Результаты
Сжатая 2:05 0%
Несжатя 3:12 +50%

Как видите, после сжатия даже стало работать быстрее, за счет того, что не нужно возиться с мелкими файлами.
Еще быстрее можно сделать, если использовать приоритеты (порядок, в каком файлы кладутся в архив), это можно сделать через опцию -sort. Это полезно не только на LiveCD, ведь архив распаковывается блоками по 100кб, туда влезет 50-100 мелких файлов, и если они потребуются по порядку, то прирост скорости будет немалый.

Источник

free-templates.ru