Reiser4 - это высокопроизводительная файловая система, разрабатываемая Namesys и Гансом Рейзером. Она работает только в Linux и пока что несет статус Experimental, развиваясь вне основной ветви ядра Linux.
Некоторые особенности этой файловой системы:
Из минусов на март 2009 можно выделить
В настоящее время бремя разработки и поддержки постепенно поднимают вверх плечи свободной команды разработчиков.
Замеры производительности по сравнению с конкурентными ФС показывают крепкое превосходство в производительности.
Если вы не собираетесь использовать 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 статически, т.е. нам понадобится статическая библиотека libaal-1.0.a.
configure; make
configure --enable-part-static; make all install clean;Скорее всего, это будет непросто. Тем не менее, вам нужны статические версии libaal и некоторых других библиотек. В случае успешной установки, Вы будете иметь статические бинарники для работы с разделами reiser4. Они могут работать в самых экстремальных условиях, в том числе и в initrd. От себя рекомендую скопировать их в надежное место на случай, если корневой раздел упадет (ничего нельзя исключать), а под рукой не будет live-cd дистрибутива с поддержкой reiser4.
Добавьте необходимые библиотеки в /lib/modules/`uname -r`/. Можно также поэкспериментировать с библиотекой libaal-minimal, если ресурсоемкость initrd критична.
Процесс сборки нестандартного ядра может варьироваться от дистрибутива к дистрибутиву. Мы рассмотрим наиболее общие случаи.
Для ядер 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
По известным причинам, не очень просто найти дистрибутив, в котором имеется поддержка Reiser4 "из коробки". Поэтому соберем ядро руками. Нам понадобятся исходники ядра и соответствующий им патч reiser4.
За основу статьи взято ванильное ядро 2.6.24 с kernel.org, однако вы можете поэкспериментировать и с любым другим, так как процесс интеграции абсолютно индентичен. Для сборки ядра вам понадобятся gcc, glibc-devel. Опционально glib2, glib2-devel, gcc-c++, libstdc++, libstdc++-devel, qt3-devel.
su -
cd /usr/src/linux-2.6.24
wget -c http://www.kernel.org/pub/linux/kernel/people/edward/reiser4/reiser4-for-2.6/reiser4-for-2.6.25.patch.bz2
zcat reiser4-for-2.6.24.patch.gz | patch -p1Теперь в директории fs есть reiser4. Для субъективного сравнения сложности и "фичастости" новой файловой системы, вы можете сравнить свежепоявившуюся fs/reiser4 например c fs/ext4 или любой другой.
make xconfigДолжно появиться окно конфигуратора (qt3). Нажмите Ctrl+F, введите ключ для поиска reiser4, и...
make; make modules_install install cleanТеперь у вас есть ядро, способное полноценно работать с Reiser4. Вы можете загрузится в него из вашего загрузчика.
Исходим из того, что у нас есть на вооружении набор reiser4progs. Теперь нам необходимо перевести интересующие нас разделы на Reiser4.
Вам следует постоянно держать в голове тот факт, что простая конверсия из ext3/XFS/etc в Reiser4 невозможна. Под переводом раздела на 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 дает несколько большее сжатие, но и немного меньшую скорость работы. Когда Вы определитесь, какое сжатие вам нужно, создавайте раздел:
mkfs.reiser4 -o create=ccreg40,compress=gzip1 ...
mkfs.reiser4 -o create=ccreg40,compress=lzo1 ...
Итак, у нас есть раздел /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 [option] /dev/sda7
Однако запущенная без параметров она не производит никакого ремонта: только проверка на ошибки без исправления. Основные параметры, с которыми вам придется работать:
Некоторые размышления по данной теме вынесены в этот раздел.
Одним из ключевых понятий Reiser4 является транзакция: грубо говоря, одна атомарная транзакция - это пачка операций с ФС. Транзакционная запись повышает сохранность данных, однако всегда есть и обратная сторона медали: при частых, искуственно вызванных fsync(), мы получаем огромный оверхэд на дисковых транзакциях, и скорость записи многократно падает.
Принудительную синхронизацию ФС вызывает множество программ и утилит, начиная от банального статического sync и заканчивая sqlite, встроенного в amarok. Скорее всего под другими ФС этот факт не ощущался настолько сильно и ярко, как под Reiser4. Тем не менее, с этим приходится считаться.
Как с этим бороться? Единственный безотказный способ - запретить принудительный вызов синхронизации ФС. В зависимости от программ, это можно сделать по-разному:
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, можно только повторным форматированием.