Ставим nginx
deathstar# cd /usr/ports/www/nginx
deathstar# make install clean

в /etc/rc.conf добавляем:
nginx_enable="YES"

Ставим MySQL
deathstar# cd /usr/ports/databases/mysql51-server
deathstar# make install clean

в /etc/rc.conf добавляем:
mysql_enable="YES"
Запускаем MySQL

deathstar# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
deathstar# mysqladmin -u root password 'password'

Ставим PHP ( отмечаем [*] FPM Build FPM version )
deathstar# cd /usr/ports/lang/php5
deathstar# make install clean

в /etc/rc.conf добавляем:
php_fpm_enable="YES"

Приводим файл /usr/local/etc/php-fpm.conf к такмоу виду:

[global]
pid = run/php-fpm.pid
error_log = /var/log/php-fpm.log
events.mechanism = kqueue
include=/usr/local/etc/php-fpm.d/*.conf

Создаем каталог,в котором будут лежать описания пулов для PHP-FPM ( кому то может пригодиться, если юзеров для сайтов больше чем один ):

deathstar# mkdir -p /usr/local/etc/php-fpm.d/ и описываем пул
deathstar# ee /usr/local/etc/php-fpm.d/www.conf

[www]
user = www
group = www
listen = /tmp/php-fpm.sock
listen.backlog = -1
pm = dynamic
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[memory_limit] = 128M

Запускаем PHP-FPM:
deathstar# /usr/local/etc/php-fpm start

Ставим Vexim (отмечаем MySQL):
deathstar# cd /usr/ports/mail/vexim/
deathstar# make install clean

Ставим модуль p5-DBD-mysql51
deathstar# cd /usr/ports/databases/p5-DBD-mysql51/
deathstar# make
deathstar# make install clean

Запускаем скрипт:
perl /usr/local/share/vexim/create_db.pl --act=newdb --dbtype=mysql -uid=110 --gid=110 --mailstore=/usr/local/mail
deathstar#
Please enter the username of the mysql superuser: root
Please enter the password of the mysql superuser:
Please enter the name of your NEW database: vexim
--------------------------------------------------
Database: vexim will be created
--------------------------------------------------
Is this correct? (Y = continue / anykey = exit ): Y

Please enter a password for the 'vexim' database user:
Confirm password:
Please enter a password for the 'siteadmin' user:
Confirm password:
The user 'siteadmin' has been added with the password
Database created successfully!

Создаем каталог с виртуальными хостами для nginx

deathstar# mkdir -p /usr/local/etc/nginx/vhosts

Приводим /usr/local/etc/nginx/nginx.conf к такому виду:

worker_processes 2;

events {
use kqueue;
worker_connections 2048;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 32M;
large_client_header_buffers 2 1k;
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
reset_timedout_connection on;
server_tokens off;
gzip on;

# Закрываем обращения по IP адресу
server {
listen 80 default_server;
server_name _;
return 444;
}

# PHP-FPM
upstream php-fpm {
server unix:/tmp/php-fpm.sock;
}

# Инклюдим файлы с виртуальными хостами
include /usr/local/etc/nginx/vhosts/*;
}

Делаем виртуальный хост в nginx для Vexim

deathstar# ee /usr/local/etc/nginx/vhosts/exim.deathstar.name

server
{
listen 80;
server_name exim.deathstar.name;
access_log /var/log/nginx/exim-access.log;
error_log /var/log/nginx/exim-error.log;
root /usr/local/www/vexim;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Редактируем конфиг Vexim
deathstar# ee /usr/local/www/vexim/config/variables.php";
и вводим данные для подключения к базе данных введенные ранее.
Создаем группу и пользователя exim:
deathstar# pw groupadd vexim -g 90
deathstar# pw useradd vexim -u 90 -g vexim -d /usr/local/mail -m -s /nonexistant

Устанавливаем Exim ( отмечаем опцию SA-EXIM для работы SpamAssasin) :
deathstar# cd /usr/ports/mail/exim && make install clean
Добавляем в /etc/rc.conf:
exim_enable="YES"

Копируем и правим конфиги
deathstar# cd /usr/local/etc/exim/
deathstar# cp /usr/local/share/doc/vexim/docs/*.conf ./
deathstar# cp /usr/local/share/doc/vexim/docs/configure ./
deathstar# ee /usr/local/etc/exim/configure

Находим строку:
MY_IP = CHANGEописываем свой ip
MY_IP = 46.38.63.5/code>
Находим:
trusted_users = avleen:www
и удаляем avleen .Остается:

trusted_users = www
exim_user = mailnull
exim_group = mail
never_users = root

Находим закоментированную строку, отвечающую за подключение к MySQL серверу,раскоментируем ее и поставим там свой пароль:
hide mysql_servers = localhost::(/tmp/mysql.sock)/vexim/vexim/vexim
Раскоментируем:
AINS = SELECT DISTINCT domain FROM domains WHERE type = 'relay' AND domain = '${quote_mysql:$domain}'
ALIAS_DOMAINS = SELECT DISTINCT alias FROM domainalias WHERE alias = '${quote_mysql:$domain}'timeout_frozen_after = 2d
log_selector = +subject

Изменяем путь к антивируму ClamAV:
Находим:
av_scanner = clamd:/var/run/clamav/clamd и меняем на av_scanner = clamd:/var/run/clamav/clamd.sock

Добавляем в /etc/rc.conf
spamd_enable="YES" и запускаем
exim# /usr/local/etc/rc.d/sa-spamd start

Ставим ClamAV:
deathstar# cd /usr/ports/security/clamav && make install clean
Добавляем в /etc/rc.conf:
clamav_freshclam_enable="YES"
clamav_clamd_enable="YES"

и запускаем
deathstar# /usr/local/etc/rc.d/clamav-clamd start
Запускаем обновление баз ClamAV
deathstar# /usr/local/etc/rc.d/clamav-freshclam start

Добавялем в /etc/rc.conf
exim_enable="YES"

Устанавливаем Dovecot:
deathstar# cd /usr/ports/mail/dovecot && make install clean
Настройки хранятся в файле /usr/local/etc/dovecot.conf
Приводим конфиг к такому виду

base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
protocol imap {
listen=*:143
}
protocol pop3 {
listen=*:110
}
disable_plaintext_auth = no
log_path =/var/log/dovecot
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail
ssl = no
ssl_parameters_regenerate = 0
mail_location = maildir:~/Maildir
mail_privileged_group = mail
mail_debug = yes
mail_log_prefix = "%Us(%u): "
dotlock_use_excl = yes
verbose_proctitle = yes
first_valid_uid = 90
first_valid_gid = 90
maildir_copy_with_hardlinks = yes
protocol imap {
mail_executable = /usr/local/libexec/dovecot/imap
imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
}

protocol pop3 {
mail_executable = /usr/local/libexec/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@example.com
sendmail_path = /usr/sbin/sendmail
}
auth_username_format = %Lu
auth_verbose = yes
auth_debug = yes
auth default {
ssl_require_client_cert=no
ssl_username_from_cert=no
mechanisms = plain login
passdb pam {
args = session=yes dovecot
}
passdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
userdb passwd {
args = blocking=yes
}
userdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}
dict {
}
plugin {
}

Настраиваем подключение к MySQL в файле dovecot-sql.conf

deathstar# ee /usr/local/etc/dovecot-sql.conf

driver = mysql
connect = host=/tmp/mysql.sock user=vexim password=PASSWORD dbname=vexim
default_pass_scheme = MD5-CRYPT
password_query = SELECT crypt as `password` FROM users,domains WHERE users.username = '%u' AND users.enabled = '1' AND users.type = 'local' and domains.enabled = '1' and domains.domain_id = users.domain_id
user_query = SELECT pop as home, uid, gid FROM users WHERE username = '%u'

Добавляем запись в /etc/rc.conf:
dovecot_enable="YES"
Запускаем Dovecot:

deathstar# /usr/local/etc/rc.d/dovecot start

Ставим RoundCube (выбираем MySQL):

#deathstar cd /usr/ports/mail/roundcube/
deathstar# make install clean

И далее команды по порядку:

deathstar#cd /usr/local/www/roundcube
deathstar# chmod 777 logs/
deathstar# chmod 777 temp/

Создаем базу

deathstar# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
mysql> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

</code>
<code>deathstar# cd /usr/local/www/roundcube/
deathstar# mysql -p roundcubemail < SQL/mysql.initial.sql

deathstar# cp config/db.inc.php.dist config/db.inc.php
deathstar# ee config/db.inc.php

Правим конфигурационный файл /usr/local/www/roundcube/config/db.inc.php,
отвечающий за соединение с базой данных:
$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';

Правим файл main.inc.php, содержащий основные настройки:
deathstar# ee config/main.inc.php

$rcmail_config['default_host'] = 'localhost'; #хост, на котором находится почта
$rcmail_config['username_domain'] = ' mydomain.ru'; #домен, который будет автоматически добавляться к имени пользователя
$rcmail_config['mail_domain'] = 'mydomain.ru'; #почтовый домен
$rcmail_config['default_port'] = 143; #порт imap
$rcmail_config['imap_auth_type'] = null; #тип авторизации imap
$rcmail_config['smtp_server'] = 'localhost'; #сервер smtp
$rcmail_config['smtp_user'] = '%u';
$rcmail_config['smtp_pass'] = '%p';
$rcmail_config['smtp_auth_type'] = 'CRAM-MD5'; #тип авторизации smtp
$rcmail_config['create_default_folders'] = TRUE; #при первом логине юзера создаются дефолтные почтовые папки (Входящие, Исходящие, Корзина и тд.)
$rcmail_config['language'] = ru_RU; #локализация

И добавляем виртуальный хост в nginx для Roundcube

deathstar# ee /usr/local/etc/nginx/vhosts/mail.deathstar.name

server
{
listen 80;
server_name mail.deathstar.name;
access_log /var/log/nginx/mail-access.log;
error_log /var/log/nginx/mail-error.log;
root /usr/local/www/roundcube;
index index.php;
charset utf-8;

location ~ .php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /.ht
{
deny all;
}
}

Перезапускаем PHP-FPM и NGINX

deathstar# /usr/local/etc/rc.d/nginx restart && usr/local/etc/rc.d/php-fpm restart

Теперь Roundcube доступен по адресу http://mail.deathstar.name а Vexim по http://exim.deathstar.name

Заходим по адресу http://exim.deathstar.name
Логинимся под siteadmin и пароль, что выставляли ранее
Жмем Add local domain
Прописываем домен, имя администратора ( по умолчанию postmaster, можно сменить на любое , так же создастся ящик вида postmaster@domain, а создадим например admin )
прописываем пароль ( например pass )
повторяем пароль
отмечаем антиспам и антивирус ( по желанию ) и жмем Submit

У нас появился почтовый аккаунт admin@domain с паролем pass

Чтоб для созданного домена создать еще ящик, логинимся под логином админа домена, в нашем случае – admin

Жмем Add, delete and manage POP/IMAP accounts
Потом Add User
Прописываем имя ( любое, оно просто для отображения в списке юзеров )
логин ( например user )
два раза пароль ( например userpass )
Has domain admin privileges? – отмечаем, есди хотим сделать юзера тоже админом домена
И жмем Submit.
У нас появился почтовый аккаунт user@domain с паролем userpass

Теперь можно зайти в roundcube по ссылке http://mail.deathstar.name под логином user@domain и паролем userpass

Существующий пакетный менеджер в FreeBSD ветки 9 и ниже был предложен Джорданом Хаббардом (Jordan Hubbard) еще в далеком 1994 году. С тех пор многое изменилось, поэтому разработчики FreeBSD, начиная с ветки 10, заменили устаревший пакетный менеджер на новый – PKGNG (package new generation). Для установки бинарных пакетов теперь предлагается использовать удаленные репозитории, например – pkg.FreeBSD.org. Из базовой системы были удалены утилиты pkg_* (такие, как: pkg_install, pkg_add, pkg_create, pkg_delete, pkg_info, pkg_updating и pkg_version).

Теперь при обновлении какого-либо порта вы можете видеть вот такое предупреждающее сообщение:

/! WARNING /!
pkg_install EOL is scheduled for 2014-09-01. Please consider migrating to pkgng
http://blogs.freebsdish.org/portmgr/2014/02/03/time-to-bid-farewell-to-the-old-pkg_-tools/
If you do not want to see this message again set NO_WARNING_PKG_INSTALL_EOL=yes in your make.conf

В котором вам предлагается до сентября 2014 года перейти на новый пакетный менеджер, т.к. поддержка старого прекратится.

Переход на новый пакетный менеджер PKGNG в операционных системах FreeBSD версии 9 и ниже осуществляется следующим образом (все нижеперечисленные процедуры осуществлялись на FreeBSD 9.0-RELEASE). Сперва установим сам порт PKG:

# make -C /usr/ports/ports-mgmt/pkg install clean

По окончанию установки вы можете видеть следующее сообщение:

If you are upgrading from the old package format, first run:
  # pkg2ng

Но перед началом его использования укажите опцию WITH_PKGNG=YES в своем make.conf:

# echo 'WITH_PKGNG=YES' >> /etc/make.conf

Теперь дадим команду pkg2ng, которая осуществить конвертацию существующей базы установленных портов в новую, для использования с pkgng:

# pkg2ng
Converting packages from /var/db/pkg
...
Converting nmap-6.40_2...
Installing nmap-6.40_2... done
...

Принудительно обновите базу данных установленных портов:

# pkgdb -fu
--->  Updating the pkgdb
[Reading data from pkg(8) ... - 46 packages found - done]

В принципе – переход на использование нового пакетного менеджера завершен. Для обновления установленных портов я использую portupgrade. Теперь при ее запуске можно видеть, что используется pkg:

# portupgrade -van
--->  Session started at: Mon, 24 Mar 2014 10:05:07 +0400
[Reading data from pkg(8) ... - 46 packages found - done]
** None has been installed or upgraded.
--->  Session ended at: Mon, 24 Mar 2014 10:05:24 +0400 (consumed 00:00:16)

Но при попытке обновить базу данных с удаленного репозитария выскочила ошибка:

# pkg update -f
Updating repository catalogue
No valid repository found.

Чтобы явно указать расположение репозитария необходимо выполнить следующее.

Удалить существующий конфигурационный файл для pkg и скопировать его из того, что дан по-умолчанию:

# rm -f /usr/local/etc/pkg.conf
# cp /usr/local/etc/pkg.conf.sample /usr/local/etc/pkg.conf

Создать каталог /usr/local/etc/pkg/repos и разместить в нем конфигурационный файл FreeBSD.conf с указанием расположения удаленного репозитария (обратите внимание на кавычки, они должны быть прямыми "):

 # mkdir -p /usr/local/etc/pkg/repos
 # nano -w /usr/local/etc/pkg/repos/FreeBSD.conf
 FreeBSD: {
 url: “pkg+http://pkg.FreeBSD.org/${ABI}/latest”,
 mirror_type: “srv”,
 enabled: yes
 }

Теперь выполнение обновления базы pkg:

# pkg update -f
Updating repository catalogue
digests.txz                                              100% 1097KB   1.1MB/s   1.1MB/s   00:00
packagesite.txz                                          100% 5087KB   5.0MB/s   5.0MB/s   00:00
Incremental update completed, 23432 packages processed:
0 packages updated, 0 removed and 23432 added.

Использование pkg хорошо документировано. Полный список команд вы получите дав просто pkg:

# pkg
...
Commands supported:
        add            Registers a package and installs it on the system
        annotate       Add, modify or delete tag-value style annotations on packages
...

Получить помощь по отдельно взятой команде можно так:

# pkg help update

На момент написания статьи версия pkgng:

# pkg -v
1.2.7

Однако, вам теперь необходимо изучить применение новых опций, указываемых в вашем make.conf или при сборке портов. Конструкция типа WITH_NAME, WITHOUT_NAME канула в лету. Теперь вместо, например, WITHOUT_X11=YES необходимо указывать WITHOUT=“X11” и т.д. Более подробно тут: http://wiki.freebsd.org/Ports/Options/OptionsNG.

Некоторые полезные команды из нового менеджера пакетов:

# pkg audit -F
# pkg update -f
# pkg check -Bd
# pkg info | grep nmap
nmap-6.40_2                    Port scanning utility for large networks
Перед обновлением можно проверить базу данных портов на ошибки:
# pkgdb  -Fa
и на потерянные зависимости:
# pkgdb  -L
Исправить базу данных портов (автоматически, без дополнительных ответов на вопросы системы) можно использовав ключ -fu:
# pkgdb  -fu

Чтобы Linux выполнил проверку дисков (fsck) при следующей перезагрузке, нужно создать пустой файл forcefsck в корневом каталоге:

cd /
touch forcefsck
reboot

Тот же эффект даст следующая команда:

shutdown -rF now

Для того, чтобы fsck самостоятельно устраняла ошибки без ручного подтверждения запросов, в загрузочных параметрах требуется включить опцию автоматического подтверждения всех запросов.

CentOS, Fedora, RedHat
В конфигурационном файле /etc/sysconfig/autofsck добавляем значение -y переменной AUTOFSCK_OPT:
AUTOFSCK_OPT="$AUTOFSCK_OPT -y"
Debian, Ubuntu
В конфигурационном файле /etc/default/rcS присвоить переменной FSCKFIX значение yes:
FSCKFIX=yes
FreeBSD
В конфигурационном файле /etc/rc.conf присвоить переменной fsck_y_enable значение YES:
fsck_y_enable="YES"

FreeBSD 9

1. Обновления системы и дерева портов

обновляем систему, используя утилиту для бинарного обновления системы — freebsd-update:

freebsd-update fetch && freebsd-update install

скачиваем и обновляем коллекцию портов
portsnap fetch Если вы запускаете Portsnap впервые, извлекаем снэпшот в /usr/ports: portsnap extract По завершении первого запуска Portsnap, как было показано выше, /usr/ports может быть обновлен при помощи:

# portsnap fetch && portsnap update

ОБНОВЛЕНИЕ УСТАНОВЛЕННЫХ ПАКЕТОВ ПРИ ПОМОЩИ PKGNG

Не секрет, что желательно иметь в системе последние версии программного обеспечения. Но когда начинаешь задумываться о том, что иногда нужно чтобы обновить порт пересобрать кучу других приложений и библиотек, зависящих от обновляемого порта становится тоскливо, особенно если это нужно сделать на множестве компьютеров.
Но есть и готовое решение, помогающиее решить эту проблему. Оно носит гордое название portupgrade.

#whereis portupgrade
portupgrade: /usr/ports/ports-mgmt/portupgrade
#cd /usr/ports/ports-mgmt/portupgrade
#make install clean

При установке вылезет окошко с запросом выбора базы. Лучше выбрать BDB4.
Далее идет установка, тянет она кстати немало, порядка 10 Mb.
Но вот установка завершилась. Смотрим что утилита умеет, а умеет она многое.
Вот основное:

— a все установленные порты

— F Получить все исходные тексты устанавливаемого пакета, но не устанавливать/обновить.
— r Обновить все порты, от которых зависит устанавливаемый порт.
— R Обновить все порты, которые зависят от устанавливаемого порта.
— v Выводить всю информацию.
— c Выполнить «make config-confitional» перед обновлением каждого порта.
— f Принудительно обновляет порт, если он был переустановлен на другую версию или выполнен downgrade порта.

Лично я обновляю через команду

#portupgrade -rcvf имя_порта 

Ну, а узнать список обновляемых портов можно командой

#pkg_version -v | grep "need"
png-1.4.1_1                    < need updating (port has 1.4.3)

Далее просто

portupgrade -rcvf png-1.4.1_1 

И еще, если утилита просит выполнить pkgdb -F — выполните обязательно, она исправляет нарушенные зависимости.

Однако стоит иметь ввиду, что portupgrade — это целый набор утилит:

  • portupgrade – одноименная утилита, средство автоматического обновления установленных программ
  • portinstall – утилита установки новых программ, присутствующих в системе портов FreeBSD
  • portversion – утилита показывающая установленный софт и наличие обновлений для него.
  • portsclean – утилита очистки мусора остающигося после сборки портов
  • portsdb – утилита создающая базу программ, присутствующих в портах FreeBSD
  • ports_glob – предназначена для поиска по базе портов
  • portcvsweb – браузер для CVSWeb
  • pkgdu – утилита, предназначенная для подсчета дискового пространства занятого уcтановленными программами
  • pkgdb – еще одна утилита для управления базой портов
  • pkg_which – предназначен для поиска по базе портов
  • pkg_sort – утилита сортирует порты в соответствии c зависимостями
  • pkg_fetch – утилита для скачки собранных(бинарных) пакетов
  • pkg_deinstall – средство для массового удаления установленного софта

Надеюсь, теперь вы не будете испытывать проблем с обновлением приложений.

 

Сетевая файловая система (Network File System – NFS) служит для обеспечения доступа компьютерам сети к общим каталогам на сервере.

Итак немного теории
NFS по смыслу и по организации работы похожа на разделяемые каталоги (shared folders) в системах Windows, но в этих службах используются совершенно разные протоколы работы и между собой они не совместимы. Однако, существует несколько программных продуктов, которые устанавливают поддержку NFS в системах Windows, поэтому применение NFS в сети с различными операционными системами не представляет проблемы, надо только помнить о необходимости использовать одинаковые версии NFS. В Данный момент используется в основном 3-я версия и внедрятся 4-я.

NFS работает посредством механизма удаленного вызова процедур (RPC – Remote Procedure Call).
Идеология RPC очень проста и привлекательна для программиста. Как обычно работает сетевое приложение? Оно следует некоему протоколу (например, HTTP): формирует пакет с запросом, вызывает системную функцию установления соединения, затем функцию отправки пакета, затем ждет ответного пакета и вызывает функцию закрытия соединения. Это значит, что вся работа с сетью является заботой программиста, который пишет приложение: он должен помнить о вызове функций сетевого API системы, думать о действиях в случае сбоев сети.

RPC предполагает иной способ обмена данными между клиентом и сервером. С точки зрения программиста, приложение клиента, работающее с помощью RPC, вызывает функцию на сервере, она выполняется и возвращает результат. Пересылка запроса на выполнение функции через сеть и возврат результатов от сервера клиенту происходит незаметно для приложения, поэтому последнее не должно беспокоиться ни о сбоях сети, ни о деталях реализации транспортного протокола.

Для того, чтобы обеспечить прозрачность пересылки данных через сеть, придумана двухступенчатая процедура. На сервере любое приложение, которое хочет предоставлять свой сервис через RPC, регистрируется в программе, которая называется транслятором портов (port mapper). Функция этой программы – устанавливать соответствие между номером процедуры RPC, которую запросил клиент, и номером TCP или UDP порта, на котором приложение сервера ждет запросов. Вообще говоря, RPC может работать не только с TCP или UDP

Приложение, которое регистрируется у транслятора портов, сообщает ему номер программы, номер версии и номера процедур, которые могут обрабатываться данной программой. Эти процедуры будут впоследствии вызываться клиентом по номеру. Кроме этого, приложение сообщает номера портов TCP и UDP, которые будут использоваться для приема запросов на выполнение процедур.

Клиент, желающий вызвать выполнение процедуры на сервер, сначала отправляет запрос транслятору портов на сервер, чтобы узнать, на какой TCP или UDP порт надо отправить запрос. Транслятор портов запускается при старте системы и всегда работает на стандартном порте 111. Получив ответ от него, клиент отправляет запрос на тот порт, который соответствует требуемому приложению. Например, сервер NFS работает на порту 2049.

Процедура монтирования общего каталога через NFS

Прежде чем мы перейдем к описанию настроек сервера и клиентов NFS, следует понять, как осуществляется монтирование удаленных файловых систем в принципе.

Клиент NFS посылает запрос на монтирование удаленному компьютеру, который предоставляет свою файловую систему (обычно – некоторую ее часть) для общего пользователя. При этом говорят, что сервер NFS «экспортирует» тот или иной каталог (подразумевается – с подкаталогами). Запрос от клиента NFS попадает на обработку демону mountd. Тот выдает клиенту NFS специальный ключ. Этот ключ является идентификатором, который однозначно идентифицирует каталог, смонтированный по сети.

По NFS можно смонтировать как целые файловые системы, так и отдельные каталоги. Из соображений безопасности запрещено монтировать каталоги «через раздел». Это означает, что если каталог /var расположен на одном разделе диска, а каталог /var/adm – на другом, то при монтировании каталога /var каталог /var/adm не будет автоматически смонтирован. Если требуется монтировать те подкаталоги экспортируемого каталога, которые расположены в другой файловой системе (на другом разделе), следует экспортировать их отдельно и указывать в /etc/dfs/dfstab еще один разделяемый каталог – тот самый подкаталог с другого раздела.

Ключ, выданный клиенту при монтировании и идентифицирующий сеанс работы с данным удаленным каталогом, сохраняется при перезагрузке NFS-сервера, чтобы после восстановления его работы клиенты, замершие в ожидании, продолжили работу с удаленным сервером как ни в чем ни бывало. При демонтировании и новом монтировании файловой системы через NFS ключ обычно изменяется. На практике перезагрузка NFS-сервера все-таки может привести к сбою в работе клиентского приложения, особенно, если приложение читает или записывает файл в удаленный каталог во время перезагрузки.

После монтирования файловой системы через NFS клиент посылает серверу запросы на передачу и прием файлов, эти запросы обрабатывает демон nfsd.

Демонтирование файловой системы выполняется также, как и демонтирование любой другой файловой системы – командой umount.

Процесс установки соединения

Cilent |                                        |  Server
       |запрос транслятору портов на сервер,    |
mount  |чтобы узнать, на какой TCP или UDP порт |
nfs    |надо отправить запрос для доступа к nfsd|
       | -------------------------------------> | 111 UDP (rpcbind)
       | <------------------------------------- |
       | Запрос к самому приложению (nfsd)      |
       | -------------------------------------> | 2049 TCP или UDP
       | <------------------------------------- | на выбор (NFSD)
       | Запрос порта приложения mountd         |
       | -------------------------------------> | 111 UDP (rpcbind)
       | <------------------------------------- |
       | Запрос на монтирование к mountd        |
       | -------------------------------------> | 12345 (выставлен руками)
       | <------------------------------------- | UDP (mountd)
       | Обмен данных по протоколу NFS          |
       | -------------------------------------> |
       | <------------------------------------- |

Настройка NFS-сервера

Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd.

Переходим непосредственно к настройке
Вся настройка будет рассматриваться на ОС FreeBSD
Настройка NFS-сервера
Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd.
Добавляем их в rc.conf

# NFS
# запуск nfsd
nfs_server_enable="YES"
# флаги для nfsd:
# "-u" - используем тока протокол UDP - причина - это не инет, потери пакетов
# весьма малы, а по ресурсоёмкости UDP выгодней. TCP - весьма `дорогой`
# протокол, требует больше ресурсов
# "-t" - использовать протокол TCP (можно использовать и TCP и UDP одновременно
# - выбор, в конечном итоге, за клиентом)
# "-n 1" - максимальное число одновременно подключенных клиентов
# "-h 11.22.33.44" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех. Может быть указана неоднократно. У меня на этой машине
# всего один интерфейс (не считая lo0 :)) потому её наличие бессмысленно.
nfs_server_flags="-t -n 1 -h 11.22.33.44"
# демон монтированя - принимает подключения от клиентов. Запускается
# автоматически при опции nfs_server_enable="YES". Ключи:
# "-r" - для обслуживания файлов а не тока каталогов (если я правильно понимаю
# значение - то можно расшарить файл, а не каталог. Может для кого-то и имеет
# смысл...)
# "-l" - регистрация всх запросов на монтирование
# "-n" - для возможности монтированя из-под винды (вернее, никсовую
# шару на форточки)
# "-p" - на каком порту запускать
# "-h" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех.
mountd_enable="YES"
mountd_flags="-r -p 12345 -h 11.22.33.44"
# удалённый вызов процедур - необходим для фунциклирования NFS
rpcbind_enable="YES"
rpcbind_flags="-h 11.22.33.44"
# "-h" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех.

Настраиваем файл экспорта (/etc/exports)

# То, что расшариваем по NFS
/etc/PF/www      -alldirs  -maproot=root  11.22.33.55
/usr/ports -maproot=root -network 192.168 -mask 255.255.0.0

В первом случае расшаривание для конкретного ip.
Во втором случае расшаривание каталога /usr/ports для всей частной сети (192.168.0.0/16 — или 192.168.0.0/255.255.0.0), с правами root`a для всех root`ов с удалённых машин. Причём можно было это сделать для любого удалённого пользователя — хоть для nobody 🙂

Теперь, если перезагрузить сервак, все встанет,
либо можно перезапустить службы таким вот скриптом

#!/bin/sh
/etc/rc.d/rpcbind restart
/etc/rc.d/nfsd restart
/etc/rc.d/mountd restart

Для проверки готовности всех служб NFS к работе через rpcbind
используется команда

rpcinfo -p
showmount -ae

можно также посмотреть провесились ли демоны или нет


[root@srv /etc/rc.d]# sockstat | grep nfs
root     nfsd       41300 3  tcp4   *:2049                *:*
root     nfsd       41300 4  tcp6   *:2049                *:*
[root@srv /etc/rc.d]# 

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

#В FreeBSD8
/sbin/mount_nfs -o tcp -o bg -i 192.168.20.251:/usr/ports /usr/ports
#В FreeBSD7 и ранее
/sbin/mount_nfs -T -b -i 192.168.20.251:/usr/ports /usr/ports