Pull to refresh

POHMELFS: NFS по-новому

Reading time 3 min
Views 6.6K
Те, кто следил за обновлениями ядра, могли заметить, что в релиз 2.6.30 была добавлена поддержка POHMELFS.
Что же это такое — Похмельная файлуха?
Изучение окрестностей странички проекта позволило предположить, что разработку ФС ведет московский программист Евгений Поляков (и только он!), у которого на том же сайте есть немало других интересных проектов, таких, например, как порт CARP под Linux. В общем, сложилось впечатление, что программист на редкость грамотный и упорный.
Вернемся к PohmelFS. статья в Википедии подтверждает причастность похмелья к названию, которое для приличия расшифровывается как Parallel Optimized Host Message Exchange Layered File System. Документация на страничке проекта говорит о том, что в перспективе PohmelFS — распределенная ФС с избыточностью, контролем доступа и прочими прелестями, разрабатываемая так, чтобы не сильно отставать по производительности от локальных ФС. Этакая альтернатива разнообразным GFS, GlusterFS и прочим Coda. Но это все будет после интеграции проекта с двумя другими — DST и Elliptics. На текущий момент PohmelFS — это альтернатива старому недоброму NFS, почти всюду показывающая бо́ льшую производительность (пруфлинк).

под хабракатом процесс настройки на небольшом зоопарке

Вещь новая, неизвестная, как ею пользоваться — никто толком не знает. Я в Сети нашел один-единственный howto, и тот не особо толковый. Поэтому здесь публикую грамотный (на мой взгляд) метод элементарной настройки.

Первое, что надо сделать — это скачать исходники ядра 2.6.30 и собрать ядро с модулем pohmelfs. На момент публикации драйвер имеел статус staging, поэтому его включение в menuconfig нетривиально. Нужно включить опцию Device Drivers -> Staging drivers и выключить Device Drivers -> Staging drivers -> Exclude Staging drivers from being built, после чего можно включать POHMELFS, находящийся там же.
Следует отметить, что ядро надо обновлять только на клиенте. Серверная часть работает в userspace.

Второе, что нужно для работы ФС — userspace утилиты и сервер. Нужно компилировать исходники. Я скачал отсюда последний снэпшот pohmelfs-server.git. Тем, кто будет делать так же, подскажу, что снэпшоты раздаются в формате tar.bz2, о чем нужно если не знать, то догадываться.
Распаковываем, читаем README, подкладываем /usr/src/linux/drivers/staging/pohmelfs/netfs.h туда, куда рекомендует начало README, то есть, /usr/src/linux/fs/pohmelfs/netfs.h (это очень важно, поскольку на сервере этому файлу взяться неоткуда, а для сборки сервера он необходим). Аккуратно, путь к исходникам ядра может быть другим. После этого
$ ./autogen.sh
$ ./configure

автоген может на что-нибудь пожаловаться, это лечится очевидным способом.
А вот configure у меня под Gentoo ругался на невозможность найти инклюды POHMELFS, и только при чтении лога выяснилось, что проблема, на самом деле, не в netfs.h, а в bitsperlong.h, который он по каким-то неведомым причинам не нашел. Пришлось конфигурить так:
$ CPPFLAGS=-I/usr/src/linux-2.6.30-git18/arch/x86/include ./configure --with-kdir-path=/usr/src/linux
Далее можно делать make, тогда он соберет все, что может. Я пошел другим путем.
На сервере сборка и установка выглядела так:
$ cd server; make
# cp fserver /usr/local/sbin

На клиенте, в свою очередь:
$ cd cfg; make; cd ../utils; make; cd ..
# cp cfg/cfg /usr/local/sbin/pohmelcfg; cp utils/flush /usr/local/sbin/pohmelflush

Это важное отступление от Makefile, поскольку теперь на сервере установлена только серверная часть, а на клиенте — только клиентская, а пока что ненужные инклюды не установлены вообще. Также переименованы клиентские бинарники в более понятные названия, поскольку, например, «cfg» абсолютно не говорит о том, что конфигурирует он только pohmelfs.
Юзерспейс утилиты успешно собрались как на Gentoo x86_64, так и на Arch Linux i686.

Наступает момент истины. Запускаем!
Сначала запустим серверную часть. fserver работает в фореграунде, поэтому для начала сделаем вот так:
# /usr/local/sbin/fserver -a 192.168.1.10 -r /mnt/HD_a2/ -w5 2>&1 >>/var/log/fserver.log &
(Подставьте желаемые параметры, -w — это количество рабочих процессов)

Далее — настройка и монтирование ФС на клиенте.
# modprobe pohmelfs
# pohmelcfg -A add -a 192.168.1.10 -p 1025 -i 1
# mount -t pohmel -o idx=1 /mnt/pohmel

Здесь -i для cfg и idx= для mount должны быть одинаковыми, по умолчанию 0. Как я понял, это просто ID монтируемой расшарки.

У меня запуск сервера и кллиента не вызвал никаких трудностей, все сразу заработало.
Маленький тест на производительность (файл весом в 700МБ):
stolen@stolen ~/soft/pohmelfs-server.git $ time cat /mnt/pohmel/share/GRTMPVOL_RU_20.10.08.iso >/dev/null
real 1m37.150s
user 0m0.010s
sys 0m1.270s

stolen@stolen ~/soft/pohmelfs-server.git $ time cat /mnt/pohmel/share/GRTMPVOL_RU_20.10.08.iso >/dev/null
real 0m0.591s
user 0m0.003s
sys 0m0.257s

stolen@stolen ~/soft/pohmelfs-server.git $ time cat /mnt/upload/share/GRTMPVOL_RU_20.10.08.iso >/dev/null
real 1m3.719s
user 0m0.003s
sys 0m0.400s

Третье — NFS, немного выигравающий по чтению. По записи 100МБ POHMELFS оказался в 10 раз быстрее, видимо, за счет фонового I/O.
Tags:
Hubs:
+33
Comments 86
Comments Comments 86

Articles