NFS сервер на Ubuntu 9.10

По давней и не очень хорошей привычке (еще с тех пор когда в доме водились компьютеры с Windows системами) я использую для организации домашней сети SAMBA. Причины просты, хорошо знакомы большинство настроек, хорошая совместимость с Windows системами. Вот и на днях стала задача, быстро и без проблем расшарить несколько папок с головного компьютера. По привычки и примутил SAMBA. Но так уж получилось, что разработчики Ubuntu сейчас немного заняты и им некогда обращать внимание на такие мелочи как говёно работающая SAMBA между Linux машинами с предустановленной Ubuntu 9.10 на обоих. И если на 9.04 нареканий не было то на 9.10 мне удалось завести херова работающую Самбу после часа мучений. Я считаю это полный непорядок. Это при том, что я даже не брезговал настраивать Самбу с помощью GUI утилиты system-config-samba, которая до селе прекрасно справлялось с поставленной перед ней задачей. Короче я взбесился, накатал длиннющий bug-report разработчикам и подумал о других путях организации домашней сети. Что из этого вышло читаем ниже.

NFS – Network File System

Понятное дело, на что, стразу упал взгляд. Это NFS – Network File System, хреновена из начально придуманная Sun Microsystems. Далее как по учебнику, первым делом я полез на Википедию, почитать что за зверь такой, проникнуться историей создания и т.д. Сказать что в русской Википедии статья о NFS херовая, значит ничего не сказать. Из трёх строчек понятное дело тяжело что либо понять.

Здесь стоит сделать отступление. Я никогда не занимался настройкой сети Linux — Linux. Это всегда были сети типа Windows — Linux ну или наоборот. По этому для меня NFS штука новая и от того еще более интересная.

Далее я побрел на официальный сайт и по дороге заглянул на сайт NFS for FreeBSD. Убедившись что сайт на английском языке, а мне на тот момент было в падло изучать 100 страничный мануал, нужно было просто папку расшарить. И я начал искать что же пишут об NFS в русскоязычном интернете. По началу я обрадовался огромному количеству how to однако после посещения уже третьего сайта стало понятно весь русский инет забит скопированным было how to который даже у школьника вызовет истерический хохот. Это было уже не смешно, все, абсолютно все блоги забиты одним и тем же copy\past гавном написанным тучу лет тому назад.

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

Установка NFS

Лезем в репозитарий Убунты и смотрим чего там есть полезного:

$ aptitude search nfs
v   nfs-client                  -                                                                                           
i   nfs-common              - NFS support files common to client and server                                             
i   nfs-kernel-server        - support for NFS kernel server                                                             
v   nfs-server                 -                                                                                           
$ aptitude search nfs
v   nfs-client                  -                                                                                           
i   nfs-common              - NFS support files common to client and server                                             
i   nfs-kernel-server        - support for NFS kernel server                                                             
v   nfs-server                 -                                                                                           

Это именно то, что нужно, ставим (и на клиенте и на сервере):

$ sudo aptitude isntall  nfs-server nfs-kernel-server nfs-common nfs-client
$ sudo aptitude isntall  nfs-server nfs-kernel-server nfs-common nfs-client

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

Создаем папку которую будем расшаривать (если еще нет)

[email protected]:$ mkdir share
[email protected]:$ mkdir share

Правим файл /etc/exports:

[email protected]$ sudo nano /etc/exports
/home/user/share/ 192.168.1.102(rw,sync,no_subtree_check)
[email protected]$ sudo nano /etc/exports
/home/user/share/ 192.168.1.102(rw,sync,no_subtree_check)

Опции доступа:
/home/user/share/ – расшариваемая папка на сервере
192.168.1.102 – IP адрес компьютера которому будет предоставлен доступ к шаре.

Открыть доступ всем машинам в сети:

/home/user/share/ *(rw,sync,no_subtree_check)
/home/user/share/ *(rw,sync,no_subtree_check)

Открыть доступ нескольким машинам в сети:

/home/user/share/ 192.168.1.101(rw,sync,no_subtree_check) 192.168.1.102(ro,sync,no_subtree_check)
/home/user/share/ 192.168.1.101(rw,sync,no_subtree_check) 192.168.1.102(ro,sync,no_subtree_check)

Обратите внимание, что машине 192.168.1.101 достались права на чтение\запись, а машине 192.168.1.102 только на чтение.

Можно пойти еще дальше и дать доступ к шаре целой сети:

/home/user/share/ 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
/home/user/share/ 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)

rw – дать права на запись\чтение
ro – дать права только на чтение
no_root_squash – рут на клиентской машине имеет тот уровень доступа к файлам в расшариной паке, что и рут на сервере. По умолчанию опция отключена, так как представляет собой реальную угрозу безопасности.
no_subtree_check – если монтируется только часть тома, то сервер будет выполнять проверку принадлежности файла запрошенного клиентом, именно к той части с тома которая примонтирована. Это замедляет передачу данных, по этому зачастую данная опция включена в список параметров, как у меня выше. Т.е. эта опция блокируют проверку, за ее не надобностью.
sync – синхронное поведение файловой системы по отношению к клиенту и серверу. (грубо говоря в режиме реального времени, закинул файл в шару на серваке и вы тут же его видите на клиенте)
async – асинхронное поведение файловой системы по отношению к клиенту и серверу.

Список хостов, доступ которым разрешен к системе, обратный файл это /etc/hosts.deny
Правим файл /etc/hosts.allow

[email protected]$ sudo nano /etc/hosts.allow
portmap: 192.168.1.102/24
lockd:   192.168.1.102/24
rquotad: 192.168.1.102/24
mountd:  192.168.1.102/24
statd:   192.168.1.102/24
[email protected]$ sudo nano /etc/hosts.allow
portmap: 192.168.1.102/24
lockd:   192.168.1.102/24
rquotad: 192.168.1.102/24
mountd:  192.168.1.102/24
statd:   192.168.1.102/24

Рестартуем сервер:

[email protected]$ sudo /etc/init.d/nfs-kernel-server restart
[email protected]$ sudo /etc/init.d/nfs-kernel-server restart

Если вы внесли какие либо изменения в файл /etc/exports, нет необходимости рестартовать сервер, достаточно выполнить:

$ sudo exportfs -avr
$ sudo exportfs -avr

и новые настройки вступят в силу.

Настройка клиента

Настройка клиента заключается по сути в том, что бы создать точку монтирования удаленной файловой системы и правильно выполнить монтирование.

Создаем точку монтирования:

[email protected]$ mkdir /home/user/data/
[email protected]$ mkdir /home/user/data/

Монтируем удаленную файловую систему:

[email protected]$ sudo mount.nfs 192.168.1.100:/home/booch/share /home/mothes/data/ -rw
[email protected]$ sudo mount.nfs 192.168.1.100:/home/booch/share /home/mothes/data/ -rw

Опции монтирования:
Тут все понятно, 192.168.1.100 – адрес сервера.
/home/booch/share – папка на сервере которую надо прикрутить.
/home/mothes/data/ – папка куда монтируем на клиенте.
-rw – монтируем файловую систему с правами доступа чтение\запись.

Тут стоит обратить внимание, что даже если на серваке папка открыта с правами rw, вы из соображений безопасности можете прикрутить папку только в режиме чтения.

Готово. УФС подмантировалась успешно, можно работать.

Дополнительные опции

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

rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  41419  status
    100024    1   tcp  47959  status
    100021    1   udp  39786  nlockmgr
    100021    3   udp  39786  nlockmgr
    100021    4   udp  39786  nlockmgr
    100021    1   tcp  39968  nlockmgr
    100021    3   tcp  39968  nlockmgr
    100021    4   tcp  39968  nlockmgr
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100005    1   udp  59137  mountd
    100005    1   tcp  53161  mountd
    100005    2   udp  59137  mountd
    100005    2   tcp  53161  mountd
    100005    3   udp  59137  mountd
    100005    3   tcp  53161  mountd
rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  41419  status
    100024    1   tcp  47959  status
    100021    1   udp  39786  nlockmgr
    100021    3   udp  39786  nlockmgr
    100021    4   udp  39786  nlockmgr
    100021    1   tcp  39968  nlockmgr
    100021    3   tcp  39968  nlockmgr
    100021    4   tcp  39968  nlockmgr
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100005    1   udp  59137  mountd
    100005    1   tcp  53161  mountd
    100005    2   udp  59137  mountd
    100005    2   tcp  53161  mountd
    100005    3   udp  59137  mountd
    100005    3   tcp  53161  mountd

Если вам надо, чтобы УФС монтировалась автоматически после загрузки системы правим /etc/fstab
Сделать это можно вот так:

# device       mountpoint     fs-type     options      dump fsckorder
...
/home/user/   /mnt                nfs          rw            0           0
...
# device       mountpoint     fs-type     options      dump fsckorder
...
/home/user/   /mnt                nfs          rw            0           0
...

Или вот так:

# device             mountpoint  fs-type    options    dump fsckord
...
/home/user/        /mnt/home   nfs      rw,hard,intr      0     0
...
# device             mountpoint  fs-type    options    dump fsckord
...
/home/user/        /mnt/home   nfs      rw,hard,intr      0     0
...

Второй вариант использует опцию hard, с ней надо быть поосторожней, так как это “жесткое” монтирование. Отвалиться сервак = зависнет клиент.

Проверить качество соединения:

tracepath 192.168.1.100
 1:  alexlinux.local (192.168.1.100)                        0.192ms pmtu 16436
 1:  alexlinux.local (192.168.1.100)                        0.084ms reached
 1:  alexlinux.local (192.168.1.100)                        0.080ms reached
     Resume: pmtu 16436 hops 1 back 64 
tracepath 192.168.1.100
 1:  alexlinux.local (192.168.1.100)                        0.192ms pmtu 16436
 1:  alexlinux.local (192.168.1.100)                        0.084ms reached
 1:  alexlinux.local (192.168.1.100)                        0.080ms reached
     Resume: pmtu 16436 hops 1 back 64 

Где 192.168.1.100 IP сервера или клиента.

Просмотреть загруженность сети (полезно если много шар и большой файлообмен)

sudo netstat -s
sudo netstat -s

Проброс по SSH:
Первое нужно добавить localhost:

[email protected]:$ sudo nano /etc/exports
/home   127.0.0.1(rw)
[email protected]:$ sudo nano /etc/exports
/home   127.0.0.1(rw)

Далее выполняем на клиентской машине проброс:

[email protected]:$ ssh root@192.168.0.42 -L 250:localhost:2049  -f sleep 60m
[email protected]:$ ssh root@192.168.0.42 -L 251:localhost:32767 -f sleep 60m
[email protected]:$ ssh [email protected] -L 250:localhost:2049  -f sleep 60m
[email protected]:$ ssh [email protected] -L 251:localhost:32767 -f sleep 60m

192.168.0.42 – IP адрес сервера.
250 – порт на клиенте
2049 – порт на сервера
Вы можете менять порты, поставив свои.
-f sleep 60m – хитрючая команда, которая позволяет присоединиться к серверу в режиму background, т.е. не открывать там Shell и не сообщать о своем присутствии. Т.е. Shell у нас будет открыт со стороны клиента. Т.е. все команды будут выполняться в режиме background на сервере. Соединение будет удерживаться в течении 60 минут.

Монтируем УФС на клиенте:

[email protected]:$ sudo nano /etc/fstab
localhost:/home  /mnt/home  nfs  rw,hard,intr,port=250,mountport=251  0 0
[email protected]t:$ sudo nano /etc/fstab
localhost:/home  /mnt/home  nfs  rw,hard,intr,port=250,mountport=251  0 0

Прочесть больше о пробросе NFS через SSH можно тут