Home FreeBSD FreeBSD File System and SMB NFS - сетевая файловая система

NFS - сетевая файловая система

NFS - сетевая файловая система

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/file_system/mount_nfs/

Количество серверов выросло - начал задумываться об автоматизации отдельных телодвижений и о дублировании. Конкретно - обновление портов и прочее. Четыре сервера стоят в локалке, на всех 4-х хранится дерево портов и куча дистрибутивов. После обновления на всех 4-х самбы, кламава и ещё чего-то немелкого задумался - всё это обошлось в сотню мегабайт траффика, а можно было сделать вчетверо меньше - если руками всё перетаскивать с одного на другой. Но - руками не хотелось :))) Подумавши, вспомнил про NFS - ибо сеть локальная - т.е. трафик бесплатен, скорость сто мегабит - местами вообще гигабит. Сойдёт. Решил привернуть на совсем локальную машину - один из серверов занимается архивацией, работает полсуток, и то по ночам. LAN на нём гигабитный (правда на остальных сотка - но это уже мелочи :)) - вообще прекрасно. Тема в хандбуке оказалась хорошо окучена, так что делаем всё по хандбуку. (Кстати, там как вариант применения NFS - расшаривание директории /usr/ports/distfiles, хотя я слышал про использование её на WWW-серверах, когда собран кластер - для расшаривания директории с контентом, но сам такого не пробовал, потому не утверждаю)
На сервере (на котором и будем расшаривать директорию с деревом портов) в /etc/rc.conf заносим такие строки:# NFS
# удалённый вызов процедур - необходим для фунциклирования NFS
rpcbind_enable="YES"
# запуск nfsd
nfs_server_enable="YES"
# флаги для nfsd:
# "-u" - используем тока протокол UDP - причина - это не инет, потери пакетов
# весьма малы, а по ресурсоёмкости UDP выгодней. TCP - весьма `дорогой`
# протокол, требует больше ресурсов
# "-t" - использовать протокол TCP (можно использовать и TCP и UDP одновременно
# - выбор, в конечном итоге, за клиентом)
# "-n 5" - максимальное число одновременно подключенных клиентов
# "-h 192.168.20.251" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех. Может быть указана неоднократно. У меня на этой машине
# всего один интерфейс (не считая lo0 :)) потому её наличие бессмысленно.
nfs_server_flags="-u -n 5"
# демон монтированя - принимает подключения от клиентов. Запускается
# автоматически при опции nfs_server_enable="YES". Ключи:
# "-r" - для обслуживания файлов а не тока каталогов (если я правильно понимаю
# значение - то можно расшарить файл, а не каталог. Может для кого-то и имеет
# смысл...)
# "-l" - регистрация всх запросов на монтирование
# "-n" - для возможности монтированя из-под винды (вернее, никсовую
# шару на форточки)
mountd_flags="-r"


После чего я собрался было править файл /etc/exports - но его не оказалось. Кстати, если его не существует, то nfsd и mountd не запускаются. Ну да ладно, сделал сам - из двух строк:# То, что расшариваем по NFS
/usr/ports -maproot=root -network 192.168 -mask 255.255.0.0


В данном случае я расшарил каталог /usr/ports для всей частной сети (192.168.0.0/16 - или 192.168.0.0/255.255.0.0 - ибо локалочка-то немаленькая), и дал в нём права root`a для всех root`ов с удалённых машин. Причём можно было это сделать для любого удалённого пользователя - хоть для nobody :)
После чего перезагружаем сервер, и после перезагрузки (в принципе, можно всё находу запустить руками - но в данном случае это некритичная машина и я предпочёл перезагрузиться. Если хотите находу - идите повышеприведённой ссылочке на хандбук) смотрим:/usr/home/lissyara/>ps -axj | grep nfsd
root 382 1 382 382 0 Is ?? 0:00,01 nfsd: master (nfsd)
root 384 382 382 382 0 I ?? 0:00,00 nfsd: server (nfsd)
lissyara 8450 628 8449 628 2 R+ p0 0:00,00 grep nfsd
/usr/home/lissyara/>
/usr/home/lissyara/>ps -axj | grep mountd
root 380 1 380 380 0 Is ?? 0:00,00 /usr/sbin/mountd -r
lissyara 8762 628 8761 628 2 R+ p0 0:00,00 grep mountd
/usr/home/lissyara/>


Ну а затем, на клиентских машинах прописываем такие строки в /etc/rc.conf:# Эта опция в-общем-то и не нужна, всё прекрасно монтируется и без неё,
# но с ней подрубается демон nfsiod, позволяющий проводить чтение-запись
# асинхронно, не дожидаясь окончания предыдущей операции.
nfs_client_enable="YES"
# скока демонов запускать (по одному на примонтированный ресурс)
nfs_client_flags="-n 1"


И пробуем подмонтровать (в хандбуке советуют на клиентах выполнить команду nfsiod -n 4, но у меня и без неё заработало, но, вероятно, оно работало несколько медленней :)))):/usr/home/lissyara/>mount_nfs 192.168.20.251:/usr/ports /usr/ports
/usr/home/lissyara/>df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 126M 43M 72M 37% /
/dev/ad0s1h 85G 65G 14G 83% /smb
/dev/ad0s1e 756M 15M 681M 2% /tmp
/dev/ad0s1g 16G 4.8G 9.7G 33% /usr
/dev/ad0s1f 7.9G 2.1G 5.1G 29% /var
procfs 4.0K 4.0K 0B 100% /proc
192.168.20.251:/usr/ports 24G 12G 9.9G 56% /usr/ports
/usr/home/lissyara/>


Всё работает. Строку эту я поместил в такой скрипт:/usr/local/etc/rc.d/>cat /usr/local/etc/rc.d/mount_nfs.sh
#!/bin/sh

# Скрипт монтирования портов по NFS
case "$1" in
start)
/sbin/mount_nfs -i 192.168.20.251:/usr/ports /usr/ports
echo "/usr/ports mounted"
;;
stop)
/sbin/umount /usr/ports
;;
*)
echo ""
echo "Usage: `basename $0` { start | stop }"
echo ""
exit 64
;;
esac
/usr/local/etc/rc.d/>


В принципе (и наверно даже более правильно) можно добавить в /etc/fstab такую строчку:192.168.20.251:/usr/ports /usr/ports nfs rw,-b,-i 0 0


Опция -b нужна для того, чтобы в случае, если не удастся примонтировать ФС сразу, продолжать попытки сделать, а не ждать. Иначе комп может вообще не загрузиться, так и остановившись на этом моменте (у NFS неприлично большой таймаут), а -i нужна чтобы при пропадании удалённого компа из сети не зависнуть по команде ls, например, выполненной на сетевой файловой системе. При её наличии можно будет первать команду с помощью Ctrl+C, иначе - никак :))
Ну, вот и всё. Конечно, по сети оно работает несколько медленней, чем с локальной машиной. Также есть и недостатки - если один клиент что-то собирает то другому лучше это же не делать :) Ничем хорошим не кончится :)))
P.S. Не забудте удалить содержимое /usr/ports на локальной машине - иначе место не освободится. Хотя - я, например, удалил тока distfiles - остальное оставил. На всякий случай. :)))
P.S.2 - бывают проблемы с блокировкой, при сборке чего-либо из портов, тогда надо монтировать с ключиком -L, и всё будет нормально. Как вариант - перенос рабочей директории в локальную ФС (WRKDIRPREFIX=/tmp/port_wrk в файл make.conf)

Обновлено 28.05.2010 13:39  
Интересная статья? Поделись ей с другими:

  • Вопросы по поводу написанных статей можно обсудить в нашем сообществе в Вконтакте / Questions about written articles can be discussed in our community in Vkontakte Вопросы по поводу написанных статей можно обсудить в нашем сообществе в  Вконтакте / Questions about written articles can be discussed in our community in Vkontakte
Яндекс.Метрика