Reiser4

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Reiser4 — это высокопроизводительная файловая система, разрабатываемая Namesys и Гансом Рейзером. Она работает только в Linux и пока что несет статус Experimental, развиваясь вне основной ветви ядра Linux.

А что в Reiser4 особенного?

Некоторые особенности этой файловой системы:

  • эффективная система журналирования (wandering logs);
  • эффективная работа с маленькими файлами, как в области расходования дискового пространства, так и в скорости. Используется технология tail packing;
  • быстрая обработка директорий, содержащих огромное количество файлов;
  • инфраструктура плагинов. Уже доступны плагины для работы с метаданными, сжатием (gzip, lzo) и шифрованием;
  • технология Allocate-on-flush или отложенное выделение дискового пространства под данные позволяет оптимизировать расходование дискового пространства. AoF также присутствует в ZFS, EXT4, BTRFS, HFS+ и XFS;
  • поддержка транзаций, танцующих деревьев и многого другое.

Из минусов на сентябрь 2017 года можно выделить

  • отсутствие этой ФС в основной ветви ядра;
  • острый недостаток разработчиков;
  • экспериментальный статус унаследован из прошлого;
  • первоначальный автор и основной разработчик (собственно Ганс Райзер) осуждён за убийство и находится в тюрьме.

В настоящее время бремя разработки и поддержки постепенно поднимают вверх плечи свободной команды разработчиков.

Почему Reiser4 называют высокопроизводительной?

Замеры производительности по сравнению с конкурентными ФС показывают крепкое превосходство в производительности:

Я хочу попробовать эту ФС. С чего мне начать?

reiser4progs

Если вы не собираетесь использовать reiser4 как ФС для корневого раздела, то можете просто установить reiser4progs из репозиториев вашего дистрибутива и пропустить этот подраздел.

Итак, мы хотим в будущем перевести корневой раздел на Reiser4, поэтому мы будем собирать утилиты для работы с этой ФС перед сборкой ядра. Почему? Здесь нужно сделать небольшое лирическое отступление на тему присутствия fsck в initrd. Это отступление специфично в первую очередь для дистрибутива openSUSE-10.3, которым пользуется ваш покорный слуга (но не касается 10.2, 10.1 и т. д.).

Загрузка ядра производится загрузчиком (GRUB). Он загружает ядро и initrd к нему, а так же передает ядру такой параметр, как корневой раздел, например root=/dev/sda2. В openSUSE начиная с версии 10.3 и, возможно, в некоторых других дистрибутивах корневой раздел не монтируется даже в режиме read-only до окончания проверки. Это значит, что все необходимые для проверки утилиты (fsck.reiser4) должны находится в initrd. Однако, програмная логика утилит reiser4progs вынесена в отдельную библиотеку — libaal, которую вы можете найти здесь. Эта библиотека автоматически не добавляется в initrd, что делает невозможной проверку reiser4-раздела на ошибки и переводит загрузку в «ручной режим» (то есть вам надо примонтировать корневой раздел, возможно содержащий ошибки, самостоятельно в rw-режиме на свой риск).

mount /dev/sda2 / -o remount

Пусть fsck.reiser4 будет статическим

Мы попробуем собрать fsck.reiser4 статически, то есть нам понадобится статическая библиотека libaal-1.0.a.

  • Соберите libaal-1.0.5, используя
    configure; make
  • Соберите reiser4progs-1.0.6, используя
    configure --enable-part-static; make all install clean;
    Скорее всего, это будет непросто. Тем не менее, вам нужны статические версии libaal и некоторых других библиотек. В случае успешной установки, Вы будете иметь статические бинарники для работы с разделами reiser4. Они могут работать в самых экстремальных условиях, в том числе и в initrd. От себя рекомендую скопировать их в надежное место на случай, если корневой раздел упадет (ничего нельзя исключать), а под рукой не будет live-cd дистрибутива с поддержкой reiser4.

Добавление libaal.so и libreiser4.so в initrd

Добавьте необходимые библиотеки в /lib/modules/`uname -r`/. Можно также поэкспериментировать с библиотекой libaal-minimal, если ресурсоемкость initrd критична.

Собираем ядро

Процесс сборки нестандартного ядра может варьироваться от дистрибутива к дистрибутиву. Мы рассмотрим наиболее общие случаи.

Gentoo Linux

Для ядер 2.6.24:

SRC_URI="${KERNEL_URI} ${GENPATCHES_URI} ${ARCH_URI} http://chichkin_i.zelnet.ru/namesys/reiser4-for-${PV}${R4V}.patch.gz" 
UNIPATCH_LIST="${DISTDIR}/reiser4-for-${PV}${R4V}.patch.gz" 

Потом — просто emerge новый gentoo-sources и genkernel. Проверялось на 2.6.24-r8.

В целом — смотрите http://gentoo-wiki.com/HOWTO_Reiser4_With_Gentoo-Sources

Обычная сборка и make install

По известным причинам, не очень просто найти дистрибутив, в котором имеется поддержка Reiser4 «из коробки». Поэтому соберем ядро руками. Нам понадобятся исходники ядра и соответствующий им патч reiser4.

За основу статьи взято ванильное ядро 2.6.24 с kernel.org, однако вы можете поэкспериментировать и с любым другим, так как процесс интеграции абсолютно индентичен. Для сборки ядра вам понадобятся gcc, glibc-devel. Опционально glib2, glib2-devel, gcc-c++, libstdc++, libstdc++-devel, qt3-devel.

  1. Для ядерной инженерии нам понадобятся права администратора. Станьте root:
    su -
  2. Распакуйте исходники ядра linux-2.6.24.tar.bz2 в /usr/src/.
  3. cd /usr/src/linux-2.6.24
  4. Reiser4-патч мы возьмем на kernel.org. Если вы используете ядро 2.6.25, то
    wget -c http://www.kernel.org/pub/linux/kernel/people/edward/reiser4/reiser4-for-2.6/reiser4-for-2.6.25.patch.bz2
  5. Патчим ядро…
    zcat reiser4-for-2.6.24.patch.gz | patch -p1
    Теперь в директории fs есть reiser4. Для субъективного сравнения сложности и «фичастости» новой файловой системы, вы можете сравнить свежепоявившуюся fs/reiser4 например c fs/ext4 или любой другой.
  6. Теперь нужно включить поддержку reiser4 в конфигураторе ядра. Сделаем это:
    make xconfig
    Должно появиться окно конфигуратора (qt3). Нажмите Ctrl+F, введите ключ для поиска reiser4, и…
    1. Поставьте галочку, если вы хотите вкомпилировать поддержку reiser4 в ядро. Тогда вы сможете перевести корневой раздел под эту ФС и загружаться с него.
    2. Поставьте точку в том случае, если вам необходима просто поддержка reiser4. Модуль ФС будет находиться вне ядра и загружаться по требованию, то есть при монтировании разделов Reiser4. В этом случае Вы не сможете загружаться с reiser4 раздела, не добавив этот модуль в initrd.
  7. Добавьте суфикс версии ядра в General Setup -> Local Version. Сделайте необходимые вам настройки конфигурации. Сохраните изменения и закройте конфигуратор.
  8. Соберите и установите ядро
    make; make modules_install install clean
    Теперь у вас есть ядро, способное полноценно работать с Reiser4. Вы можете загрузится в него из вашего загрузчика.

Создаем раздел reiser4

Исходим из того, что у нас есть на вооружении набор reiser4progs. Теперь нам необходимо перевести интересующие нас разделы на Reiser4.

Вам следует постоянно держать в голове тот факт, что простая конверсия из ext3/XFS/etc в Reiser4 невозможна. Под переводом раздела на Reiser4 мы будем подразумевать:

  1. архивацию данных с конвертируемого раздела на иной (вспомогательный) раздел или устройство;
  2. форматирование существующего раздела под reiser4;
  3. восстановление данных из архивной копии на новый раздел.

Далее будет рассмотрен следующий пример:

  • Мы переведем на reiser4 уже существующий, заполненный данными /home раздел.
  • Нам очень понравилось, и мы хотим корневой раздел / на Reiser4.
  • Во всех пунктах (для полноты самоутверждения) мы хотим максимальную производительность и превосходство над другими ФС на дисковых операциях.

Если у вас LVM или EVMS, то шаги работы будут аналогичны, однако помните, что с изменением размеров reiser4 имеются некоторые серьезные проблемы.

Максимальная производительность

Reiser4 даёт нам превосходство на дисковых операциях ввода‐вывода даже на параметрах по умолчанию. Однако, нам необходимо нечто большее. Мы уже посмотрели сравнительный тест и сделали вывод, что нам нужнен раздел с прозрачным сжатием. Для этого укажем в опциях mkfs необходимость подключения плагина для прозрачного шифрования и компрессии файлов:

mkfs.reiser4 -o create=ccreg40,...

Иными словами, параметр create=ccreg40 (CryptoCompress REGular file plugin) переопределяет createfile-плагин reg40 (unix-file plugin), позволяя тем самым задействовать дополнительные файловые плагины. Мы рассмотрим далее прозрачную компрессию.

Доступно 2 алгоритма сжатия: gzip и lzo. Gzip в сравнении с lzo дает несколько большее сжатие, но и немного меньшую скорость работы. Когда Вы определитесь, какое сжатие вам нужно, создавайте раздел:

  • создание раздела с gzip сжатием:
    mkfs.reiser4 -o create=ccreg40,compress=gzip1 ...
  • создание раздела с lzo сжатием:
    mkfs.reiser4 -o create=ccreg40,compress=lzo1 ...

Переводим обычный раздел на Reiser4

Итак, у нас есть раздел /dev/sda7, что внутри него — нам не жалко. Форматируем в reiser4 со сжатием gzip:

mkfs.reiser4 -o create=ccreg40,compress=gzip1 /dev/sda7

Заметьте! Компрессия и параметры раздела задаются на этапе форматирования и являются константами в течение жизненного цикла раздела. Если вам нужет lzo, впишите compress=lzo1. Если вы считаете, что сжатие нецелесообразно (фильмы, музыка, картинки, архивы), уберите все опции.

Если собранное Вами ядро с поддержкой Reiser4 является текущим загруженным, мы сможем примонтировать новый раздел:

mount /dev/sda7 /mnt/foo

Если вы хотите, чтобы данные раздел монтировался автоматически при загрузке, добавьте следующую строку в /etc/fstab:

/dev/sda7   /home   reiser4  noatime   0 0

Параметр noatime указывает на «не сохранение» времени последнего доступа к объекту ФС. Также здесь можно оперировать параметрами nomtime (модификация объекта) и noctime (модификация метаданных).

Конверсия корневого раздела

Прежде всего следует осознать, что корневой раздел отличается от всех остальных тем, что он играет ведущую роль в загрузке Linux. Поэтому нам следует задаться вопросом: а сможем ли мы загрузить с него ядро? С помощью GRUB — нет, потому что в GRUB отсутствует поддержка Reiser4, а тем более сжатой. Патч для GRUB с официального FTP-сервера несовместим с новейшими версиями libaal и reiser4progs, а также ломает поддержку в GRUB файловых систем, отличных от Reiser4. LILO работает с несжатой файловой системой Reiser4 «из коробки».

Итак, при использовании GRUB или сжатия вы должны вынести /boot в отдельный раздел (с файловой системой, поддерживаемой GRUB, например ext3). Допустим /boot будет /dev/sda1 (начало диска — это хороший тон), добавьте его в /etc/fstab (чтобы он монтировался в /boot) и внести правки в /boot/grub/menu.lst. Если корневая файловая система на LVM или EVMS, то, скорее всего, /boot уже является отдельным разделом. Мы не будем рассматривать этот процесс подробно внутри этой статьи.

Остальная часть конверсии ФС происходит аналогично конверсии обычного раздела, о которой мы говорили пунктом выше.

С моей файловой системой что-то не так…

Ошибки возникают в любом продукте и никто от них не застрахован. Мы же используем экспериментальный продукт и риски возникновения неполадок выше. Тем не менее 2 моих года эксплуатации reiser4 на ноутбуке не прошли даром. При загрузке системы никакой существенной проверки не происходит и приходиться обычно полировать ФС вручную.

fsck.reiser4

Ремонт файловой системы осуществляется уже знакомой нам fsck.reiser4. Если возможно, используйте статически скомпилированную версию (о том, как её собрать мы говорили выше)

Работает она так:

fsck.reiser4 [option] /dev/sda7

Однако запущенная без параметров она не производит никакого ремонта: только проверка на ошибки без исправления. Основные параметры, с которыми вам придется работать:

  • --fix — это простой ремонт мелких нарушений. В случае если вы используете сжатие, вы получите некоторый выигрыш в пространстве раздела в следствие несовершенства некоторых алгоритмов. Обычно этого вида проверки бывает достаточно.
  • --build-fs — ремонт + перестроение танцующих деревьев. Бывает, что --fix выдает невозможность ремонта и приходиться прибегать к этой, более емкой, процедуре.

Основные советы по уходу за ФС

  • Плановую проверку лучше производить каждые пару месяцев. Как бы это странно не звучало, но во время исправления ошибок все остальные reiser4‐разделы должны быть отмонтированы. Почему — не знаю, но знаю, что если хоть один раздел примонтирован, а второй проверяется, то первый получает некоторые повреждения. Вроде бы связи никакой, но вот так получается.
  • Следует держать в мозгу тот факт, что Reiser4 довольно стабильна и бессмертна, и даже при серьёзных повреждениях деревьев или хвоста мы всё равно сможем её поднять на ноги и поставить в строй. Не надо бояться делать --build-fs.

Appendix

Некоторые размышления по данной теме вынесены в этот раздел.

Транзакционность и синхронизации ФС

Одним из ключевых понятий Reiser4 является транзакция: грубо говоря, одна атомарная транзакция — это пачка операций с ФС. Транзакционная запись повышает сохранность данных, однако всегда есть и обратная сторона медали: при частых, искусственно вызванных fsync(), мы получаем огромный оверхэд на дисковых транзакциях, и скорость записи многократно падает.

Принудительную синхронизацию ФС вызывает множество программ и утилит, начиная от банального статического sync и заканчивая sqlite, встроенного в amarok. Скорее всего под другими ФС этот факт не ощущался настолько сильно и ярко, как под Reiser4. Тем не менее, с этим приходится считаться.

Как с этим бороться? Единственный безотказный способ — запретить принудительный вызов синхронизации ФС. В зависимости от программ, это можно сделать по-разному:

  • Посмотреть в настройках программы. В правильных продуктах (к примеру syslog-ng) всегда можно найти выключатель принудительных синхронизаций.
  • Hard-way: Внести коррективы в исходники программы и пересобрать её. Но это отнимет у Вас массу времени, а любой хороший программист должен быть ленив, поэтому сразу же перейдем к следующему методу.
  • Dirty-way: (ОЧЕНЬ поганый способ, использовать в последнюю очередь!)
  1. Собрать библиотеку libnosync.so и поместить её в /lib (или /lib64).
  2. Затем добавляем принудительную подгрузку этой библиотеки ко всем динамическим бинарникам:
    echo "export LD_PRELOAD='libnosync.so'" >> /etc/profile
    Таким образом при следующем логине любого пользователя к любой запускаемой им программе будет применена попытка перезаписать внешние вызовы фунций синхронизации на пустышки. К статическим бинарникам (таким как sync и sudo) это не относится.

Единственный неприятный минус последнего метода — он выводит из строя работу таких утилит, как kdesu (KDE3), поэтому этот случай приходится отрабатывать отдельно.

Материал для самостоятельного изучения и экспериментов

Основа — утилита measurefs.reiser4 из состава пакета reiser4progs (/usr/sbin/measurefs.reiser4):

  • measurefs.reiser4 -h — краткая справка по всем опциям команды;
  • measurefs.reiser4 -p — установки по умолчанию для «mkfs.reiser4»;
  • measurefs.reiser4 -l — список всех доступных опций/плагинов — дерзайте.

Опция «-o» (override) может быть передана только команде mkfs.reiser4. Другими словами, «поправить» параметры, использованные при создании партиции reiser4, можно только повторным форматированием.

Ссылки