Файловая система Reiser4 и АльтЛинукс

Документация связанная с установкой, настройкой и работой пользовательского ПО
Ответить
Аватара пользователя
Raven
Бородатый сис
Бородатый сис
Сообщения: 2800
Зарегистрирован: 03 мар 2010, 15:12
ОС: RHEL 8
Откуда: Из серверной

Файловая система Reiser4 и АльтЛинукс

Сообщение Raven » 12 авг 2010, 19:50

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

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

Некоторые особенности этой файловой системы:
  • Эффективная система журналирования (wandering logs)
  • Эффективная работа с маленькими файлами, как в области расходования дискового пространства, так и в скорости.
  • Используется технология tail packing.
  • Быстрая обработка директорий, содержащих огромное количество файлов
  • Инфраструктура плагинов. Уже доступны плагины для работы с метаданными, сжатием (gzip, lzo) и шифрованием.
  • Технология Allocate-on-flush или отложенное выделение дискового пространства под данные позволяет оптимизировать расходование дискового пространства. AoF также присутствует в ZFS, EXT4, BTRFS, HFS+ и XFS
  • поддержка транзаций, танцующих деревьев и многого другое
Из минусов на март 2009 можно выделить
  • отсутствие этой ФС в основной ветви ядра
  • острый недостаток разработчиков
  • экспериментальный статус унаследован из прошлого
  • первоначальный автор и основной разработчик (собственно Ганс Райзер) осуждён за убийство и находится в тюрьме
В настоящее время бремя разработки и поддержки постепенно поднимают вверх плечи свободной команды разработчиков. По информации от Эдуарда Шишкина, reiser4 планируется протолкнуть в ядро 2.6.36, т.е. во втором полугодии 2010.

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

Замеры производительности по сравнению с конкурентными ФС показывают крепкое превосходство в производительности.
  • Сравнительный тест файловых систем на типичных операциях с различными параметрами
  • Сравнение Ext3, Ext4, и Reiser4 на Default-параметрах
Я хочу попробовать эту ФС. С чего мне начать?
reiser4progs

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

Итак, мы хотим в будущем перевести корневой раздел на Reiser4, поэтому мы будем собирать утилиты для работы с этой ФС перед сборкой ядра. Почему? Здесь нужно сделать небольшое лирическое отступление на тему присутствия fsck в initrd.

Загрузка ядра производится загрузчиком (Lilo). Он загружает ядро и initrd к нему, а так же передает ядру такой параметр, как корневой раздел, например root=/dev/sda2. В некоторых дистрибутивах корневой раздел не монтируется даже в режиме read-only до окончания проверки. Это значит, что все необходимые для проверки утилиты (fsck.reiser4) должны находится в initrd. Однако, програмная логика утилит reiser4progs вынесена в отдельную библиотеку - libaal, которую вы можете найти [url=http://chichkin_i.zelnet.ru/namesys/]здесь[/url]. Эта библиотека автоматически не добавляется в initrd, что делает невозможной проверку reiser4-раздела на ошибки и переводит загрузку в "ручной режим" (т.е. вам надо примонтировать корневой раздел, возможно содержащий ошибки, самостоятельно в rw-режиме на свой риск).

Код: Выделить всё

mount /dev/sda2 / -o remount
Пусть fsck.reiser4 будет статическим


В АльтЛинукс, при наличии интернета и настроеном репозитории вам всего лишь надо будет выполнить команду

Код: Выделить всё

apt-get install reiser4progs

для установки reiser4progs и как зависимости libaal.

Мы же попробуем собрать 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 критична.

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

Процесс сборки нестандартного ядра может варьироваться от дистрибутива к дистрибутиву. Мы рассмотрим наиболее общие случаи.
Возможно некоторые мэйнтейнеры-ядерщики уже включили reiser4 в свои сборки ядер, так что рекомендую почитать документацию к нестандартным ядрам с вашего репозитория. В моем случае на репозитории AltLinux таковых не нашлось для моей версии ядра (2.6.32), а откатываться до 2.6.27 не хотелось. Пришлось собирать вручную.

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

За основу статьи взято стандартное ядро дистрибутива AltLinux 5.1 Sisyphus, однако вы можете поэкспериментировать и с любым другим, так как процесс интеграции абсолютно индентичен. Для сборки ядра вам понадобятся gcc, glibc-devel. Опционально glib2, glib2-devel,gcc-c++, libstdc++, libstdc++-devel, qt3-devel.
Для ядерной инженерии нам понадобятся права администратора. Станьте root: Установите пакет с исходниками ядра (либо загрузите ванильное ядро с kernel.org)

Код: Выделить всё

apt-get install kernel-source
Распакуйте исходники ядра linux-2.6.32.tar.bz2 в /usr/src/ (в Альте обычно архив размещается в /usr/src/kernel).
Создайте симлинк linux на директорию с сырьем

Код: Выделить всё

ln -sf /usr/src/kernel-source-2.6.32 /usr/src/linux
и топаем туда
cd /usr/src/linux
Reiser4-патч мы возьмем на kernel.org. Если вы используете ядро 2.6.32, то

Код: Выделить всё

wget -c http://www.kernel.org/pub/linux/kernel/people/edward/reiser4/reiser4-for-2.6/reiser4-for-2.6.32.patch.gz
Патчим ядро...

Код: Выделить всё

zcat reiser4-for-2.6.32.patch.gz | patch -p1
Теперь в директории fs есть reiser4. Для субъективного сравнения сложности и "фичастости" новой файловой системы, вы можете сравнить свежепоявившуюся fs/reiser4 например c fs/ext4 или любой другой.
Теперь нужно включить поддержку reiser4 в конфигураторе ядра. Сделаем это:

Код: Выделить всё

make xconfig
Должно появиться окно конфигуратора (qt3). Нажмите Ctrl+F, введите ключ для поиска reiser4, и...
поставьте галочку, если вы хотите вкомпилировать поддержку reiser4 в ядро. Тогда вы сможете перевести корневой раздел под эту ФС и загружаться с него.
Поставьте точку в том случае, если вам необходима просто поддержка reiser4. Модуль ФС будет находиться вне ядра и загружаться по требованию, т.е. при монтировании разделов Reiser4. В этом случае Вы не сможете загружаться с reiser4 раздела, не добавив этот модуль в initrd.
Добавьте суфикс версии ядра в General Setup -> Local Version. Сделайте необходимые вам настройки конфигурации. Сохраните изменения и закройте конфигуратор.
Соберите ядро и установите ядро

Код: Выделить всё

make modules_install install clean
После чего скопируйте файлы
  • .config в /boot/config-2.6.32
  • System.map в System.map-2.6.32
  • arch/x86/boot/bzlmage в /boot/vmlinuz-2.6.32
По хорошему это все хозяйство должно было установиться автоматически, но у меня этого почему-то не произошлои пришлось править все "ручками". Также проверьте ваш загрузчик на предмет правильности.
Теперь у вас есть ядро, способное полноценно работать с Reiser4. Вы можете загрузится в него из вашего загрузчика.

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

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

Вам следует постоянно держать в голове тот факт, что простая конверсия из ext3/XFS/etc в Reiser4 невозможна. Под переводом раздела на Reiser4 мы будем подозревать
  • архивацию данных с конвертируемого раздела на иной (вспомогательный) раздел или устройство.
  • форматирование существующего раздела под reiser4
  • восстановление данных из архивной копии на новый раздел
Далее будет рассмотрен следующий пример:
  • Мы переведем на 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 (ОЧЕНЬ поганый способ, использовать в последнюю очередь!)
    Собрать библиотеку libnosync.so и поместить её в /lib (или /lib64).
    Затем добавляем принудительную подгрузку этой библиотеки ко всем динамическим бинарникам:
    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, можно только повторным форматированием.

Рерайт статьи Reiser4 с ЛОРа
Я не злопамятный, я просто часто ковыряю логи
Ответить

Вернуться в «Документация *nix»