А что в Reiser4 особенного?
Некоторые особенности этой файловой системы:
- Эффективная система журналирования (wandering logs)
- Эффективная работа с маленькими файлами, как в области расходования дискового пространства, так и в скорости.
- Используется технология tail packing.
- Быстрая обработка директорий, содержащих огромное количество файлов
- Инфраструктура плагинов. Уже доступны плагины для работы с метаданными, сжатием (gzip, lzo) и шифрованием.
- Технология Allocate-on-flush или отложенное выделение дискового пространства под данные позволяет оптимизировать расходование дискового пространства. AoF также присутствует в ZFS, EXT4, BTRFS, HFS+ и XFS
- поддержка транзаций, танцующих деревьев и многого другое
- отсутствие этой ФС в основной ветви ядра
- острый недостаток разработчиков
- экспериментальный статус унаследован из прошлого
- первоначальный автор и основной разработчик (собственно Ганс Райзер) осуждён за убийство и находится в тюрьме
Почему 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
В АльтЛинукс, при наличии интернета и настроеном репозитории вам всего лишь надо будет выполнить команду
Код: Выделить всё
apt-get install reiser4progs
для установки reiser4progs и как зависимости libaal.
Мы же попробуем собрать fsck.reiser4 статически, т.е. нам понадобится статическая библиотека libaal-1.0.a.
соберите libaal-1.0.5, используя
Код: Выделить всё
configure && make
Код: Выделить всё
configure --enable-part-static && make all install clean
Добавление 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:
Код: Выделить всё
su
Код: Выделить всё
apt-get install kernel-source
Создайте симлинк 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
Теперь нужно включить поддержку reiser4 в конфигураторе ядра. Сделаем это:
Код: Выделить всё
make xconfig
поставьте галочку, если вы хотите вкомпилировать поддержку 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
- Во всех пунктах (для полноты самоутверждения) мы хотим максимальную производительность и превосходство над другими ФС на дисковых операциях.
Максимальная производительность
Reiser4 даёт нам превосходство на дисковых операциях ввода-вывода даже на параметрах по умолчанию. Однако, нам необходимо нечто большее. Мы уже посмотрели сравнительный тест и сделали вывод, что нам нужнен раздел с прозрачным сжатием. Для этого укажем в опциях mkfs необходимость подключения плагина для прозрачного шифрования и компрессии файлов:
Код: Выделить всё
mkfs.reiser4 -o create=ccreg40,...
Доступно 2 алгоритма сжатия: gzip и lzo. Gzip в сравнении с lzo дает несколько большее сжатие, но и немного меньшую скорость работы. Когда Вы определитесь, какое сжатие вам нужно, создавайте раздел:
Создание раздела с gzip сжатием:
Код: Выделить всё
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
Если собранное Вами ядро с поддержкой Reiser4 является текущим загруженным, мы сможем примонтировать новый раздел:
Код: Выделить всё
mount /dev/sda7 /mnt/foo
Код: Выделить всё
/dev/sda7 /home reiser4 noatime 0 0
Конверсия корневого раздела
Прежде всего следует осознать, что корневой раздел отличается от всех остальных тем, что он играет ведущую роль в загрузке 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
Единственный неприятный минус последнего метода - он выводит из строя работу таких утилит, как kdesu(KDE3), поэтому этот случай приходится отрабатывать отдельно.
Материал для самостоятельного изучения и экспериментов
основа - утилита "measurefs.reiser4" из состава пакета "reiser4progs" (/usr/sbin/measurefs.reiser4):
- * measurefs.reiser4 -h - краткая справка по всем опциям команды
* measurefs.reiser4 -p - установки по умолчанию для "mkfs.reiser4"
* measurefs.reiser4 -l - список всех доступных опций/плагинов - дерзайте
Рерайт статьи Reiser4 с ЛОРа