Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Файловая система —> mount_nfs

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

Автор: lissyara.


    Количество серверов выросло - начал задумываться об автоматизации отдельных телодвижений и о дублировании. Конкретно - обновление портов и прочее. Четыре сервера стоят в локалке, на всех 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)



размещено: 2006-04-16,
последнее обновление: 2006-05-29,
автор: lissyara


northern, 2006-04-16 в 11:55:10

Статья классная, а главное вовремя:) Тоже несеолько фрях и канал к тому же слабый. Два момента:
1. Фряхи должны быть одной версии?
2.  Цитата: "Не забудте удалить содержимое /usr/ports на локальной машине" -  это на клиентах?

lissyara, 2006-04-16 в 18:45:19

1. У меня 4.11 и 6.0. Честно - на знаю насколько это корректно и правильно, но уже успел поработать со всеми - глюков не было. Обновлял по настроению - то с одной то с другой...
2. Угадай с двух раз :)))

northern, 2006-04-16 в 19:02:20

я-то угадаю:)) Но фраза:"локальной машине" упоминается и в начале статьи. Я к тому, что многие начинающию сначала делают, потом думают.

eugen, 2006-04-22 в 2:14:09

вообсче честно говоря как то после прочтения "передёрнуло", никак не могу отойти от прошлых зависаний, посему предложение - ISCI :) пока удалось поднять на линуке но инициатор есть и на free сам пока под фрей не рыл но должно работать

iSa, 2008-07-06 в 17:25:33

Для тех у кого валиться при чтении файлов больше ~1,5кб:
192.168.20.251:/usr/ports   /usr/ports   nfs    rw,-b,-i,-r=1024,-w=1024   0   0
в опциях монтирования. Связано с некорректной обработкой разделенных пакетов некоторыми сетевухами. Сам столкнулся на VPN'ке.
PS Хотя это есть в Handbook'е... если приглядеться ;)

princeps, 2008-07-16 в 11:27:13

Как только что случайно узнал, самба не собирается по nfs, так что для нее WRKDIRPREFIX=/tmp/port_wrk в файле make.conf - обязательно. Чертова винда, все что с ней связано, работает через зад.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.156 секунд
Из них PHP: 54%; SQL: 46%; Число SQL-запросов: 77 шт.
Исходный размер: 24402; Сжатая: 7686