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

в 19:56, , рубрики: gentoo, kernel, linux, reiser4, reiserfs, Серверная оптимизация, системное администрирование, метки: , , ,

Есть у меня несколько 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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js