2006 г.
Руководство по продвинутым файловым системам.
Использование ReiserFS в Linux
Дэниел Роббинс (Daniel Robbins), перевод Владимира Холманова, под редакцией Алексея Федорчука
Первоисточник : http://www-106.ibm.com/developerworks/library/l-fs2.html
Август 2001
Зачем оно нужно?
В этой статье я опишу процесс установки ReiserFS с ядром 2.4. Одновременно будут затронуты "технические" аспекты, касающиеся
ядра 2.4 и его сопряженности с ReiserFS, вопросы производительности и т.п. Так как инсталляция будет описана в начале, я
рекомендую прежде прочесть всю статью, и лишь потом перейти к практике. Полезно сразу ознакомиться с техническими примечаниями,
поскольку при установке ReiserFS на вашу систему такое знание поможет снять ряд вопросов.
Поиск подходящего ядра.
Чтобы сделать доступной ReiserFS на вашей системе, сначала потребуется найти подходящее ядро. Если вы следите за развитием ядер серии
2.4, то, наверное, знаете, что не все происходит гладко. При написании статьи последним было 2.4.6-pre2. Однако я рекомендую
обратить внимание либо на 2.4.4 (a stock Linus kernel), либо на 2.4.4-ac9 (модифицированное ядро от Алана Кокса) для установки
ReiserFS. Тесты показали, что на 2.4.5 имеются "моменты", которые не позволяют рекомендовать это ядро для промышленного
использования. Давайте надеяться, что 2.4.6 в этом плане будет лучше.
Если не хотите использовать 2.4.4 или 2.4.4-ac9 ядро для ReiserFS, прежде убедитесь, что проведены достаточные тесты по
исследованию устойчивости ReiserFS на выбранном ядре. Конечно, предупреждение не распространяется для ReiserFS на тестовом
сервере, где можно использовать любое ядро, если не поступало сообщений о его "проблемности".
Имеются два серьезных основания для повышенного внимания к проблемам стабильности ядра вообще и стабильности ReiserFS в
частности. Первое состоит в том, до сих пор ReiserFS - "экспериментальная" особенность ядра, и вы не должны прогнозировать, что ее реализация
на более новом ядре будет работать не хуже, чем на предыдущем. Второе (в данный момент это самая большая проблема), большая
часть релизов ядра 2.4 и патчей были немного flaky side, что предполагает большую осторожность. Теоретически, все 2.4 релизы
принадлежат стабильной серии, так как 2.4 "по определению" считается таковой. На практике в этом возникают сомнения.
Я надеюсь, что не отговорил вас от использования ReiserFS или Linux 2.4, но предупреждение не будет лишним. Не прыгайте с
одного ядра на другое только по причине его "современности". На промышленных системах такая практика ничего хорошего не сулит.
Когда переходите на непроверенное ядро, вы рискуете не только зависанием системы, но и сохранностью данных. Даже если сама
ReiserFS устойчива, есть вероятность, что ошибки в других частях ядра приведут к повреждению информации на файловой системе.
Если вы еще не выбрали хороший источник информации по стабильности современных ядер, я рекомендую посетить Linux Weekly News, чтобы быть "в курсе" проблем разработки ядра (информация обновляется каждый четверг).
Теперь, когда я убедил читателей в использовании 2.4.4 или 2.4.4-ac9 для ответственных инсталляций ReiserFS, продолжим.
Подготавливаем ядро.
OK, возможны три варианта получения готовой к использованию ReiserFS. Первый, использование простого ядра 2.4.4.
Второй, использование ядра 2.4.4 с наложением специального набора патчей для ReiserFS (bigpatch). Третий,
использование 2.4.4 ядра с патчами от Алана Кокса, как с bigpatch, так и без него. Далее описывается процесс последний процесс, но
если у вас одна или обе patches не установлены, просто пропустите соответствующий шаг. Теперь начнем.
Получите 2.4.4 kernel sources от kernel.org
и положите в /usr/src каталог. Переименуйте существовавший linux каталог или symlink на него, либо просто удалите старую
symlink. Далее:
# cd /usr/src
# cat /path/to/linx-2.4.4.tar.bz2 | bzip2 -d | tar xvf -
The ac9 patch and bigpatch
Можно использовать простое 2.4.4 ядро, в нем все имеется. Однако я рекомендую применить следующие ac и bigpatch patches.
Для apply the ac9 patch, получите
Alan Cox ac9 patch из kernel.org и выполните:
# cd /usr/src/linux
# bzip2 -dc /path/to/patch-2.4.4-ac9.bz2 | patch -p1
Наложив такой patch (или оставив все без изменений), получите
DiCE и ReiserFS bigpatch. Опять
же, этот шаг необязателен, но мною рекомендованный, особенно для NFS сервера и поддержки квот (даже если это вам не нужно,
patch не навредит). Для наложения bigpatch выполните:
# cd /usr/src/linux
# bzip2 -dc /path/to/bigpatch-2.4.4.diff.bz2 | patch -p1
Выполнив один, оба или ни одного шага, вы готовы к конфигурированию ядра для ReiserFS.
Обратите внимание: если вам требуется помощь в компиляции ядра, есть хорошая, свободно распространяемая обучающая
программа
Compiling the Linux kernel на developerWorks. Далее очень кратко.
Конфигурирование ядра весьма просто. Сначала выполняем "make menuconfig". В секции "Code maturity level
options" убедитесь, что опция "Prompt for development and/or incomplete code/drivers" - enabled. Переходим
в секцию "File systems" и enable "ReiserFS support". Вы должны конфигурировать поддержку ReiserFS для
компилирования непосредственно в ядро, а не как модуль. Теперь не помешает разрешить "Have reiserFS do extra internal
checking". Сохраните конфигурацию и компилируйте ядро ("make dep; make bzImage; make modules; make modules_install") и
добавьте запись в ваш загрузчик для ReiserFS-enabled kernel.
Важно: никогда не удаляйте ваше текущее ядро, не убедившись в работоспособности нового.
Работа с ReiserFS
Инсталляция tools.
До перезагрузки следует инсталлировать "reiserfsprogs" tools, которые состоят из "mkreiserfs", "resize_reiserfs" (полезно,
если у вас используется LVM) и "fsck.reiserfs". Получить самую последнюю версию "reiserfsprogs" (на момент написания статьи -
"3.x.0j") можно от Namesys.com download page. Как только tools загружены, их можно
компилировать и инсталлировать следующими командами:
# cd /tmp
# tar xzvf reiserfsprogs-3.x.0j.tar.gz
# cd reiserfsprogs-3.x.0j
# ./configure
./configure output will appear here
# make
make output will appear here
# make install
make install output will appear here
После инсталляции инструментария можно создавать новые разделы (используя "fdisk" или "cfdisk") либо LVM logical volumes
(используя "lvcreate") по необходимости и перезагрузить систему. Когда создается обычный раздел, его можно маркировать
как "Linux native file system" (83).
Создание и монтирование файловой системы.
После перезагрузки вы сможете создать файловую систему ReiserFS на пустом partition следующей командой:
# mkreiserfs /dev/hdxy
В этом примере /dev/hdxy - device node, соответствующий свободному partition. Монтирование аналогично любой другой
файловой системе:
# mount /dev/hdxy /mnt/reiser
Добавить файловую систему ReiserFS в файл /etc/fstab можно при установке полей "freq" и "passno" в значение "0",
например:
/dev/hdc1 /home reiserfs defaults 0 0
Начиная с этого момента ваша ReiserFS внешне становится тождественной ext2. Вы быстро забудете об изнурительном "fsck",
а данные станут доступны быстрее, особенно из маленьких файлов.
Технические примечания по ReiserFS.
Стабильность файловой системы.
Я использовал 2.4.4 с ReiserFS на промышленном сервере в течение месяца (на cvs.gentoo.org development сервере) без
каких-либо проблем. 2.4.4 и 2.4.4-ac9 зарекомендовали себя надежными. Сервер сильно загружен операциями IO, так как на нем
хранятся cvs архив нашего "dev-wiki", почтовый сервер gentoo.org, списки рассылки
и другое.
Ограничения ReiserFS.
Хотя ReiserFS превосходит по быстродействию практически во всех типах приложений "файловую классику" ext2, имеется ряд
областей, где ReiserFS в настоящее время еще не доработан. Это не жесткие ограничения ReiserFS, а те области, до которых
разработчики Namesys не имели время добраться.
Отсутствие dump/restore
Да, это истина. ReiserFS не имеет "dump" и "restore" реализации. Если вы желаете использовать ReiserFS, но вам нравится
"dump", придется находить иные пути бэкапу данных. В действительности это не так актуально. Ядро 2.4 несовместимо с "dump" и
"restore" в принципе (а не только на ReiserFS). Для подробной информации о dump/kernel 2.4 incompatibility читайте Linus
Torvalds, где он говорит, "Dump была глупой программой, во-первых.
Оставьте ее в прошлом."
Проблемы производительности.
Хотя ReiserFS в общем, имеет преимущество в производительности над ext2, в частностях имеются и слабости. Первая - работа
с "разреженными" файлами (например, mailbox). ReiserFS заметно хуже справляется с разреженными файлами, чем ext2. Положение
должно изменится, когда разработчики Namesys вернуться к оптимизации этой стороны ReiserFS (предполагается в версии 4 ReiserFS).
А сейчас ext2 - лучшее решение для приложений, которые помещают информацию в разреженные файлы.
Вы можете столкнуться с проблемами при написании кода, который делает связанный вызов stat() для большого числа файлов.
Одно из приложений, которое имеет проблемы (проявляется только с ReiserFS на ядрах 2.4, но не с 2.2) - mutt mailer когда он читает большие maildir-style mailboxes. Очевидно, mutt выполняет вызов
stats для каждого почтового файла дважды. Это имеет тенденцию замедления работы. В команде разработчиков ReiserFS
об этой специфической проблеме знают и работают над ее устранением (решение будет включено в ReiserFS 4 или раньше).
Приемы повышения производительности
К счастью, имеется пара простых приемов, которые вы можете использовать для "купирования" проблем производительности.
Первый прием - монтирование ReiserFS с опцией "noatime" (опция монтирования, доступная и для других файловых систем).
Вероятно, вы знаете, что системы UNIX делают запись atime (время доступа) для каждого объекта файловой системы и этот атрибут
модифицируется при каждом чтении файла. Для большинства случаев штамп atime интереса не представляет (даже не могу привести
пример, когда atime требуется для "критических" приложений). По этой причине, ничем не рискуя, от его модификации можно
отказаться и получить выигрыш в производительности. Можно даже сказать следующее. Если вам не известно, что штамп atime
требуется для конкретного приложения, разместившего файлы на конкретной файловой системе, то вы должны монтировать ее с опцией
noatime. Используйте примерно следующую запись в /etc/fstab:
/dev/hdc1 /home reiserfs noatime 0 0
В первой статье о ReiserFS я упомянул, что ReiserFS имеет специфическую feature, называемую
"tail packing" (упаковка хвостов). А что в ReiserFS называют "хвостами"? Во-первых, файлы, размер которых меньше, чем блок
файловой системы или, во-вторых, "кончики" файлов, которые не заполняют весь блок. В первом случае ReiserFS имеет превосходную
производительность по причине умения "запихивать" такие "карликовые" файлы в свои b*tree (первичная организационная структура
данных). При этом данные хранятся рядом со stat-data (ReiserFS эквивалент i-node). Во втором случае с производительностью иначе.
Хвосты не заполняют полный блок и непроизводительно используют дисковое пространство. Для лучшего использования дискового
пространства ReiserFS использует "tail packing". Считается, что такая feature позволяет экономить более 5% в сравнении с ext2.
Немного больше о notail.
Не следует думать, что упаковка хвостов больших файлов имеет одни достоинства. Один из недостатков - снижение
производительности. Разработчики ReiserFS предполагали, что ряд пользователей решит не жертвовать производительностью ради 5%
экономии дискового пространства. Была предусмотрена опция монтирования "notail". Когда файловая система монтируется с этой
опцией, упаковка хвостов отключается, что дает прирост скорости при меньшей вместимости диска. С учетом сегодняшней стоимости
дискового пространства следует рекомендовать монтирование файловой системы с опциями "notail" и "noatime":
/dev/hdc1 /home reiserfs noatime,notail 0 0
Даже если имеется потребность в экономии дискового пространства, может оказаться хорошей идеей временное монтирование
файловой системы (пока не заполнилась) с опцией "notail". Кроме того, некоторые загрузчики имеют проблемы с загрузкой ядер,
созданных на ReiserFS с tail packing enabled. Если у вас LILO старее версии 21.6, с такой проблемой вы обязательно
столкнетесь. Могут быть проблемы даже с современными версиями GRUB при загрузке файлов stage1 и stage1_5,
хотя на загрузку самого ядра это не влияет. Устранить проблему поможет временное монтирование ReiserFS с опцией "notail" и
перемещение файлов в буферную файловую систему "туда обратно". Помните, после пересоздания файлов (инсталляция нового ядра)
они снова окажутся "без хвостов". Есть возможность перемонтирования файловой системы (с новыми опциями) без ее размонтирования. Ниже показано, как перемонтировать корневую файловую систему с опцией "notail".
Команда будет полезной, если для вас обычная практика - упаковка хвостов, но загрузчик "этого не любит" и требуется
"распаковать" вспомогательные файлы:
# mount / -o remount,notail
Заключение.
Я нахожу, что ReiserFS очень приятная файловая система и дает выигрыш не только на маленьких, но и на больших файлах по
сравнению с ext2. Благодаря ReiserFS разработчикам требуется только 15 секунд для модификации CVS Gentoo Linux, притом, что на
ext2 это занимало около 2 минут. ReiserFS делает работу более комфортной и позволяет нашему cvs серверу одновременно
обрабатывать большее число IO без потери интерактивности.
Притом, что она уже сегодня производит впечатление, будущее представляется еще более интересным. Ханс Райзер имеет очень
агрессивный творческий план относительно ReiserFS. Со временем можно ожидать, что ReiserFS станет больше чем "другая
высокоэффективная файловая система". Это должно открыть новые возможности и подходы для решения традиционных проблем хранения
информации. С Namesys можно связывать и будущее развитие Linux.