28 февраля 2014 в 23:56

Gentoo: настройка и подключение через /dev/loop файловой системы с компрессией на примере Reiser4 tutorial

Мал мала меньше
Есть у меня несколько VPS'ок с Gentoo, бегущих под VMWare, для которых я, пожадничав, выделил всего по 7G дискового пространства. Как-то раз, после выхода очередной версии gcc, на одной из них закончилось место. Покопавшись, я обнаружил, что главными потребителями были директории /usr/src и /usr/portage. Тут же родилась мысль переместить их на файловую систему с компрессией (ага, на NTFS) и выбор пал на Reiser4, так как эти данные идеально подходят для неё — очень много файлов и они все маленькие.

Про эту файловую систему в сети имеется множество противоречивой информации (2013), но, пожалуй, стоит почитать статью (2010) ведущего разработчика.
Цитата из статьи:
за последние четыре года я не помню, чтобы кто-то терял данные на reiser4 разделе при исправно работающем железе. Ко мне обращалось несколько человек с жалобой на работу fsck. В конечном итоге все они получали и свои данные и работающий fsck.
Не надо её бояться…

Хочу особо подчеркнуть, так как их часто путают между собой, Reiser4 это не то же самое, что ReiserFS. Это две разных файловых системы! ReiserFS давно уже живет в основном транке ядра, а вот для Reiser4, хотя и появилась она на свет в далеком 2004 году, придется применять патч, который, надо заметить, регулярно обновляется для новых версий ядра.

Качаем и применяем патч в соответствии с вашей версией ядра (у меня в системе linux-3.10.25-gentoo) с этой страницы

Скажем, это можно сделать вот так:
cd /usr/src/linux
wget -O reiser4-for-3.10.patch.gz 'http://downloads.sourceforge.net/project/reiser4/reiser4-for-linux-3.x/reiser4-for-3.10.patch.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Freiser4%2Ffiles%2Freiser4-for-linux-3.x%2F&ts=1393599138&use_mirror=heanet'
gunzip reiser4-for-3.10.patch.gz && patch -p1 < reiser4-for-3.10.patch

Конфигурируем наше ядро. Обратите внимание — поддержка ReiserFS не требуется. Скрин моей конкретной системы, на вашей могут быть другие настройки, но нас сейчас интересует только:
File Systems -> Reiser4
image

и не забываем про:
Device Drivers > Block devices -> Loopback device support
image

Вот пример реальной последовательности команд и действий, которые я выполнял на своем сервере, вдруг, кому-то пригодится:
; Запускаем конфигуратор ядра
make menuconfig
; Настраиваем функции ядра:
; Сохраняем новый конфиг, выходим и компилируем ядро
make && make modules_install

; Копируем новое ядро в /boot, кто как привык. Я делаю так:
mount /boot && cp arch/x86_64/boot/bzImage /boot/kernel-3.10.25 && cp .config /boot/.config-3.10.25

Так как я ставлю совсем новое ядро, то нужно подправить настройки загрузчика, я пользуюсь GRUB:
vi /boot/grub/grub.conf

Рабочая запись для нового ядра выглядит так (просто для примера, у вас может быть всё совсем по-другому):
title Gentoo Linux 3.10.25 md0
root (hd0,0)
kernel /boot/kernel-3.10.25 root=/dev/md0 net.ifnames=0

Не стоит пока что делать её конфигурацией по умолчанию, для начала перезапустим сервер и убедимся, что все хорошо.

Делаем контрольный замер свободного места на дисках:
df -h

; Ответ (нас интересует только первая строчка)
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0        7.4G  4.1G  2.9G  59% /

; И отдельно наши прожорливые директории
du  --summarize -h /usr/portage
; 2.2G    /usr/portage
du  --summarize -h /usr/src
; 766M    /usr/src


Запасаемся попкорном с валидолом и…
umount /boot && reboot

Не забываем ручками выбрать новую конфигурацию ядра для загрузки:
image
Надеюсь, ваш сервер всё ещё с вами…

Первое и второе мы уже съели, переходим к десерту — созданию loop устройства и монтированием на него образа диска с Reiser4:
; Собираем утилиты для работы с Reiser4
emerge reiser4progs

; Создаем файл контейнер для нашего образа диска
cd /mnt && truncate -s 2G reiser4.img

; Обратите внимание на размер файла
du -h reiser4.img
; 0       reiser4.img
du --apparent-size -h reiser4.img
;2.0G    reiser4.img

; Связываем файл с блочным устройством /dev/loop0
losetup /dev/loop0 /mnt/reiser4.img

; Создаем файловую систему с компрессией gzip (есть еще lzo, но я не проверял, говорят, что жмет хуже, но работает быстрее). Если кто знает, поделитесь пожалуйста ссылкой на документацию по параметрам для Reiser4
mkfs.reiser4 -f -o create=ccreg40,compress=gzip1 /dev/loop0

image

Наконец, монтируем наш новый «диск»:
; Для начала, добавим его описание в /etc/fstab
echo '/mnt/reiser4.img        /mnt/reiser4    reiser4         loop,noatime    0 0' >> /etc/fstab

; Создаем точку монтирования
mkdir reiser4

; Барабанная дробь... монтаж...
mount /mnt/reiser4

; И... убедимся, что все хорошо
mount | grep mnt
; Ответ - /mnt/reiser4.img on /mnt/reiser4 type reiser4 (rw,noatime)

Перемещаем требуемые директории на новое место жительства (тут можно выпить чашечку кофе и поделать другие дела)
mv /usr/portage /mnt/reiser4 && ln -s /mnt/reiser4/portage /usr/portage
mv /usr/src /mnt/reiser4 && ln -s /mnt/reiser4/src /usr/src

Всё, можно сделать контрольный и подсчитывать профит:
df -h

; Ответ - в зеленой зоне прибыли получили 1.2G 
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0        7.4G  2.9G  4.2G  41% /
devtmpfs       1004M     0 1004M   0% /dev
tmpfs           201M  392K  201M   1% /run
shm            1004M     0 1004M   0% /dev/shm
cgroup_root      10M     0   10M   0% /sys/fs/cgroup
/dev/loop1      2.0G  1.8G  191M  91% /mnt/reiser4

; Наш файл-контейнер reiser4.img занимает 1.8G  

; Теперь можно сделать нашу новую конфигурацию ядра основной и перезагрузить систему с последующей проверкой:
mount | grep mnt
; Ответ - /mnt/reiser4.img on /mnt/reiser4 type reiser4 (rw,noatime)
; и проверить portage, запустив
emerge -p world


Итого: наши исходники занимали 3.9G, после упаковки это значение уменьшилось до 1.8G, или 46% (сжались больше, чем в два раза!) от исходного размера. Мелочь, конечно, но приятно.

Такая конфигурация используется у меня около года без каких-либо проблем, 2G еще ни разу не закончились, ядро не паниковало, а CPU не расправился во время emerge -DNu world. Однако, все-таки есть один минус, если в таком контейнере закончится место, то для увеличения его размеров придется создавать новый файл большего размера и переливать в него все содержимое из старого файла. К сожалению, утилита resize_reiser4 все ещё никем не написана. Возможно, если кто-то знает другой способ увеличения размера этой файловой системы, то поделитесь пожалуйста в комментариях. И в каких файловых системах, кроме NTFS и BRTFS, есть поддержка прозрачного сжатия данных?

Цитата из статьи, ссылка на которую дана в начале поста:
The Reiser4 performance results were mixed but overall its performance was decent compared to EXT4/XFS/Btrfs given the limited manpower devoted to this out-of-tree file-system and its unfortunate history. Beyond porting the file-system to newer versions of the Linux kernel and fixing bugs, there's been no major development progress on Reiser4 in months. At this time, however, it appears there are still no formal plans for merging Reiser4 into the mainline Linux kernel anytime soon.
@KEKSOV
карма
32,0
рейтинг 0,0
Похожие публикации
Самое читаемое Администрирование

Комментарии (15)

  • +1
    1) Почему не squashfs? /usr/portage в squashfs это уже почти официально поддерживаемая конфигурация, посмотрите в блоге на gentoo.org, кажется mgorny писал про это.
    2) Почему у вас в grub'е русская «м» отображается в «md0»? :)
    • 0
      1. Потому что /tmp и /var там же (так надо)
      2. Глюк :)
  • 0
    На сколько изменилась скорость работы, производили замеры?
    • 0
      Я думал об этом, но так и не придумал, как это сделать. Какой-то синтетический тест прогнать? А толку от него… ну понятно, что gzip добавляет, но для моих задач с этим можно мириться. Или Вы имели ввиду сравнить чистый Reiser4 и его же с gzip сжатием?
  • +2
    Почему не btrfs? Reiser4 если и развивается, то крошечными шагами. Эдуард один не справляется.
  • +2
    Почему не ZFS? «аналог» WAFL от NetAPP, сам не тестировал на сжатие, но поддерживает функционал расширения «на лету». Современная реализация под линукс достаточно стабильна.
    • 0
      И еще поддержка дедупликации. На исходниках раздела с «portage» может дать около 20%, думаю, к сохранениюм места. И эти технологии можно комбинировать. Но, на ЦПУ нагрузка тоже определенная при этом.
      • 0
        О! А вот это интересно, надо будет попробовать. Вообще, родилась мысль сделать сравнение нескольких FS по степени сжатия. Как бы еще CPU при этом померить?
  • 0
    Можно же сделать make -jx -s, х заменить на кол-во ядер+1-2 — быстрее и меньше бесполезного вывода.
    Копировать тоже не обязательно руками, make install сам копирует ядро, конфиг и system.map в /boot.
    В итоге можно свести к:
    make -jx -s
    make install && make modules_install
    • 0
      У меня в /etc/make.conf прописана строчка MAKEOPTS="-j2"
      А с каким именем make install копирует ядро и другие файлы?
      • 0
        genkernel копирует с нормальными именами =)
        • 0
          А ещё можно было использовать Grub2 и править конфиг не вручную, а grub2-mkconfig -o /boot/grub/grub.cfg
      • +1
        При сборке руками, по make, /etc/make.conf игнорируется и сборка происходит в 1 поток.
        config-3.13.5-gentoo System.map-3.13.5-gentoo vmlinuz-3.13.5-gentoo.
  • +1
    Дочитав до:

    gunzip reiser4-for-3.10.patch.gz && patch -p1 < reiser4-for-3.10.patch

    Понял почему вам понадобилась ФС с компрессией )
    zcat reiser4-for-3.10.patch.gz | patch -p1


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