Июл 28 2011

squashfs

Published by

Повышение производительности операционной системы в конечном итоге упрётся в производительность жёстких дисков. Один из способов обойти это ограничение — сжать данные. Это в свою очередь приведёт к небольшому увеличения нагрузки на процессор.

Суть метода заключается в том, чтобы сжать /usr в squashfs образ с размером блока 64k (128k) и смонтировать образ squashfs как /usr при помощи aufs. В результате мы получим уменьшение времени запуска приложений и больше свободного места на диске.

Подготовка
Сначала нужно проверить, включена ли поддержка squashfs и aufs в ядре:

zcat /proc/config.gz | grep  SQUASHFS
CONFIG_SQUASHFS=m
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
zcat /proc/config.gz | grep -i AUTOFS
CONFIG_AUTOFS4_FS=m

Если в выводе ничего похожего нет, то Вам нужно пересобрать ядро, включив необходимые опции.

Далее нам нужно установить два пакета: aufs2 и squashfs-tools. Воспользуйтесь пакетным менеджером Вашего дистрибутива. Имена пакетов также могут отличаться.

Последовательность действий
1. Создаём необходимые папки (имена папок могут быть любые). Одна из них будет только для чтения — во вторую будут записываться изменения со времени последнего сжатия.

# mkdir -p /squashed/usr/{ro,rw}

2. Сжимаем /usr в squashfs образ:

# mksquashfs /usr /squashed/usr/usr.sfs -b 65536

3. Далее в fstab вписываем следующие строки:

/squashed/usr/usr.sfs   /squashed/usr/ro   squashfs   loop,ro   0 0
usr    /usr    aufs    udba=reval,br:/squashed/usr/rw:/squashed/usr/ro  0 0

4. Перезагружаемся и наслаждаемся полученным результатом.
5. Если всё работает нормально, можно отмонтировать /usr (с aufs) и удалить оригинальный /usr (Вам он больше не понадобиться). Можно оставить в качестве бэкапа.
6. Поскольку содержимое /usr периодически изменяется, то необходимо периодически повторять процедуру сжатия. Добавьте в /etc/cron.weekly/ или в /etc/cron.monthly/ следующий скрипт:

#!/bin/bash
mksquashfs /usr /squashed/usr/usr_tmp.sfs -b 65536
umount -l /usr
umount -l /squashed/usr/ro
rm /squashed/usr/usr.sfs
mv /squashed/usr/usr_tmp.sfs /squashed/usr/usr.sfs
rm -rf /squashed/usr/rw/*
mount /squashed/usr/ro
mount /usr

Автор также предлагает попробовать сжать /bin /sbin /lib /opt тем же самым способом. Имеет смысл сжимать папки, содержимое которых изменяется не очень часто. Не удаляйте оригинальную папку /lib после сжатия, т.к. там находится утилита для монтирования aufs.

Автор также приводит результаты сравнения до и после сжатия:

Benchmark w/o squashfs w squashfs Уменьшение времени
1. Загрузка системы до логин менеджера 60s, 18s релеванты бенчмарку 58s, 16s релеванты бенчмарку 11%
2. Логин и ожидание пока рабочим стол станет юзаьбельным 16s 10s 37.5%
3. Запуск openoffice-writer 9s 6s 33%
4. Запуск eclipse 25s 22s 12%
5. Создание случой последовательности файлов и запись общего времени чтения всех файлов:

# find /usr -type f -printf "%s %p\n" | sort -R | awk '{ printf $2; printf "\n" }' > /sort
# time cpio -o --quiet -H newc < sort > /dev/null
36m31.726s 9m48.873s 30%

Источники:

http://forums.gentoo.org/viewtopic-t-646289.html
http://wiki.archlinux.org/index.php/Maximizing_performance#Compressing_.2Fusr
http://bbs.archlinux.org/viewtopic.php?pid=714052

3 responses so far

3 Responses to “squashfs”

  1. Alexon 01 Ноя 2014 at 18:47

    Для убунту
    zcat /proc/config.gz | grep SQUASHFS
    cat /boot/config-`uname -r` | grep SQUASHFS

  2. Николайon 06 Ноя 2014 at 17:03

    Приведённый здесь сценарий пересборки сжатого образа плохой. Если при выполнении mksquashfs произойдёт ошибка, старый файл всё равно будет удалён (причём даже в том случае, если фс ещё используется), а новый не создастся. В результате данные из файловой системы будут потеряны. Я столкнулся с этим, мне помог undelete.
    Надо добавить проверки на результат выполнения mksquashfs и наличие существующего файла /squashed/usr/usr_tmp.sfs, и удалять старый файл только в том случае, если новый создан (или даже примонтирован) успешно.

    А так этот способ очень интересный, реально помогает в том случае, если на машинке медленный хард. Есть идея: а что если взять SD-карту достаточной ёмкости с хорошей скоростью на чтение (на запись не важно) и положить этот файл туда? Получится как бы SSD кэш без перемещений головок диска. Поскольку перезапись происходит редко — карточка не будет сильно изнашиваться.

  3. Annulenon 04 Фев 2015 at 22:42

    Существует инструмент, автоматизирующий подобные фокусы:

    https://github.com/vaeth/squashmount

Trackback URI | Comments RSS

Leave a Reply


*

Powered by WordPress