Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
эта страница доступна на следующих языках: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  


автор Frédéric Raynal

Об авторе:

Frédéric Raynal Пишет диссертацию в области компьютерной науки на тему picture's tatoo в INRIA. Также в настоящее время он читает детектив, рассказывающий о жизни Th. Roosevelt в начале века, когда он был полицейским префектом. В основе сюжета поиск серийного убийцы детей. В расследовании использовались новые технологии ( психология, отпечатки пальцев и т.д.). Этот детектив, написанный Caleb Carr, L'ange des tйnиbres, раскрывает удивительную картину жизни начала века.

Содержание:

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

Резюме:

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



Введение

NFS позволяет легко обмениваться данными между компьютерами. Например : когда пользователь входит в сеть - ему не обязательно подключаться к какому - либо специальному компьютеру для доступа к своему home directory - он это осуществляет с помощью NFS.

Но в то же время это не достаточно эффективный протокол, особенно при модемном соединении. Скорее всего это удобное решение применительно к локальной сети.

Вы должны контролировать работу этого сервиса - ведь не совсем хорошая мысль позволять помещать данные в вашу сеть кому угодно;-) Несколько обычных настроек уменьшат вероятность возникновения такой ситуации.

Заметка построена следующим образом - сначала кратко вообще о файловых системах, затем рассмотрим протокол NFS, далее ( менее теоретическая часть ) - инсталляция NFS - сервера и клиента, и наконей пример взаимодействия NFS, NIS и autofs.
 

Кратко о "файловой системе"

Перед знакомством с NFS познакомимся с термином "файловая система". В основе это - способ хранения, организации и управления данными на носителе. Существует множество разновидностей их - New Technology FileSystem (NTFS), High Performance FileSystem (HPFS), DOS, FAT 12/16/32, VFAT, Macintosh Hierarchical Filesystem (HFS), ISO 9660 (for CD-ROM), extended filesystems (Ext, Ext2, Ext3), некоторые более распространены, некоторые менее и т.д.

Пример - предположим, что любой носитель информации ( например жесткий диск) - набор ячеек определенного размера для хранения информации, так называемые блоки ( blocks ). Каждая файловая система работает с этими блоками по - своему. На рисунке 1 изображена попытка разместить файл, состоящий из 2 блоков. На верхнем рисунке файл размещается за последним занятым блоком, оставляя свободными блоки в начале, на другом рисунке - файл помещается в первое свободное место. Если термин "фрагментация" напоминает вам что - нибудь - теперь вы знаете о чем речь ;-)
 
 


Рисунок. 1 : 2 метода расположения блоков








Наиболее популярная файловая система для ОС Linux - ext2fs (extended 2 file system), в которой каждый файл представлен таким термином как inode1. Каталоги содержат списки входящих файлов, доступ к которым осуществляется посредством операций чтения/записи.

Основная функция NFS - сервера - раздать клиентам запрашиваемые inodes. Тем не менее этого не достаточно - клиенты не могут взаимодействовать с файловыми inode, поэтому NFS - сервер предоставляет дополнительную информацию для корректной работы удаленных компьютеров с ними.
 

Протокол NFS

Протокол NFS - это на самом деле сочетание четырех различных протоколов. Каждый взаимодействует с Remote Procedure Calls( RPC ) и portmap (также используется название rpc.portmap). Вспомним, что эта программа преобразует номера программ RPC в номера портов. Когда RPC - сервер начинает свою работу, он передает информацию portmap какой порт будет использоваться программой. Когда клиент посылает RPC - запрос программе, сначала происходит взаимодействие с portmap на предмет получения номера порта, используемого данной программой. И только после этого запрос направляется на соответствующий порт.

Рассмотрим функции каждого протокола :
 
 
Протокол
Описание
Демон
nfs создание, чтение/запись, поиск файлов. Также управляет аутентификацией и статистикой.
nfsd
mountd ответственный за присоединение внешних систем для доступа через nfs. Сервер получает запросы mount и umount и хранит информацию об экспортируемых системах.
mountd
nsm
(Network Status Monitor) 
следит за текущим состоянием компьютера ( сервера или клиента ) для информирования ( например о перезагрузке ).
statd
nlm
(Network Lock Manager) 
для предотвращения одновременного изменения данных разными клиентами ( используется система блокировки ). С помощью Nsm протокол получает информацию о начале работы клиента, соответственно снимаются все блокировки для осуществления доступа и если он происходит - ресурс опять блокируется.
lockd

Демон knfsd, доступный в последних версиях ядра поддерживает протоколы nfs и nlm. С другой стороны - протоколы mountd и nsm больше не поддерживаются. Когда NFS инсталлирован и запущен можно проконтролировать его работу следующим образом :
 

>> ps auxwww | egrep "nfs|mount|lock|stat"
root      1370  0.0  0.2  1176  580 ?        S    22:28   0:00 rpc.mountd --no-nfs-version 3
root      1379  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1380  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1381  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1382  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1383  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1384  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1385  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1386  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [nfsd]
root      1399  0.0  0.0     0    0 pts/0    SW   22:28   0:00 [lockd]
root      1409  0.0  0.2  1156  560 ?        S    22:28   0:00 rpc.statd
root      1652  0.0  0.1  1228  484 pts/3    S    22:49   0:00 egrep nfs|mount|lock|stat
В настоящее время существуют две версии NFS - 2 и 3, обозначаемые NFSv2 и NFSv3 соответственно. NFS - серверы Linux поддерживают только версию 2 ( в соответствии с опцией mountd из предыдущего примера ).

В сочетании с термином NFS используется термин file handle. Он включает в себя inode файла и файл, представляющий устройство, где находится данный файл. Следовательно мы можем сказать, что NFS является файловой системой встроенной в другую файловую систему.

Инсталляция

 

Сервер

Первое, что необходимо сделать - запустить portmap, так как мы знаем, что протоколы, входящие в NFS используют RPCs:
root >>/usr/sbin/rpcinfo -p
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused
root >>/sbin/portmap
root >>/usr/sbin/rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
Опция -p команды rpcinfo позволяет просмотреть сервисы RPC, работающие в данный момент на компьютере. Сначала мы видим, что portmap не запущен, активизируем его ( многие дистрибутивы Linux осуществляют это при запуске системы специальными скриптами ) и проверяем еще раз. Другой причиной негативного отклика системы на команду rpcinfo являются файлы /etc/hosts.{allow,deny}, другими словами запрет в них на отклики portmapper.

Перед запуском NFS необходимо провести конфигурацию. Файл конфигурации ( единственный ) /etc/exports состоит из строк включающих в себя ресурс и список клиентов, которым разрешен доступ к нему. Если необходимо - можно добавить опции после имени каждого клиента. Man exports подробно рассказывает об этом.

В качестве имени клиента можно использовать :

Также рассмотрим наиболее важные mount опции : Теперь необходимо запустить rpc.mountd и rpc.nfs чтобы получить работающий NFS - сервер. Проверяем состояние дел командой rpcinfo. Также можно настроить сервер на использование протоколов nsm и nlm ( соответственно rpc.statd и rpc.lockd ). Они конечно не существенны для NFS - сервера, но настоятельно рекомендуется их использовать на случай возникновения непредвиденных ситуаций ( сброс, перезагрузка компьютера и т.д.).

Так как мы изменили /etc/exports - необходимо оповестить об этом daemons. Команда exportfs передает эту информацию серверам : опция -r - синхронизирует файл /etc/mtab 2 c /etc/exports; опция -v - экспортируемые ресурсы получают свои установки.

Некоторая важная информация в процессе работы содержится в следующих файлах :

При попытке клиента получить доступ к файловой системе сначала запрос направляется к mountd. Далее проверяется возможность запроса через etab. Затем проверка идет на уровне ядра - файлы hosts.allow и hosts.deny. Ядро использует для проверки exportfs, допуская обновление /var/lib/nfs/etab. При возникновении ситуации невозможности доступа - запрос отклоняется и ядро обновляет xtab для нового клиента.  

Клиент

В общем случае ничего делать не надо. Доступ к файловой системе, предоставляемый NFS, управляется непосредственно ядром, которое знает как получить доступ к данным в той или иной системе. В каталоге /lib/modules/<kernel'sversion>/fs находятся модули файловых систем, поддерживаемые ядром. В файле /proc/filesystems находится список файловых систем, непосредственно поддерживаемых ядром. Все, что вам нужно сделать - сообщить ядру, что вы хотите получить доступ к данным, предоставляемым NFS.

С помощью команды mount можно получить доступ к разным файловым системам. Команда сообщает ядру тип файловой системы, устройство и точку монтирования. Опция -t для обозначения типа файловой системы - например для NFS выглядит следующим образом : -t nfs.

Для NFS существуют специальные опции команды mount : например rsize и wsize меняют размер блоков для чтения/записи, которые можно комбинировать с обычно используемыми, такими как intr, noexec или nosuid. Man page mount рассказывает о всех доступных.

Пример : предположим, что на компьютере charly работает NFS - сервер и предоставляет в пользование свой /usr/local, для доступа к которому с компьютера с именем jill необходимо выполнить следующую команду :

root@jill >> mount -t nfs -o nosuid,hard,intr charly:/usr/local /usr/local
В команде используются следующие опции - -t nfs ( доступ к файловой системе NFS ), nosuid, hard. Рассмотрим подробнее последние два аргумента : предпоследний определяет "что" надо монтировать ( обратите внимание на синтаксис - для NFS отличается от обычно используемого : сначала указываем имя сервера, а затем каталог ( Внимание : обычно каталог, а не устройство )), последний - "куда". Совместное использование каталога /usr/local компьютерами charly и jill предотвращает повторную установку некоторых программ. В файле etc/fstab указываются устройства, монтируемые при загрузке. В данном случае файл etc/fstab будет содержать следующую строку :
 
#    device           mount point     file system    options          dump  fsckorder
charly:/usr/local    /usr/local       nfs       nosuid,hard,intr    0      0
 

Предостережение

Главная опасность использования NFS состоит в том, что между клиентом и сервером устанавливаются доверительные отношения. Следовательно при возникновении проблемной ситуации с root account сервера то же самое произойдет и с root account клиента. В NFS-HOWTO рассказывается об основных мерах, которые необходимо предпринять для избежания этого. Клиент не должен слепо доверять серверу, поэтому возникает необходимость использования специальных опций команды mount. Об одной мы уже упоминали - это nosuid, ее назначение - отмена эффекта SUID и SGID. Root сервера сначала регистрируется пользователем на клиенте и только потом становится root'ом. Следующая опция - noexec, ее назначение - запрет на использование программ, установленных на экспортируемом ресурсе.

Теперь немного о серверной стороне - также не доверять root'у, соответственно клиента. Ранее мы уже упоминали об этом - файл /etc/exports, опция root_squash. Механизм работы следующий : пользователь с UID 0 ( root ) клиента при обращении к серверу с запросом на доступ к данным - получает UID nobody. Эта опция используется в Linux по умолчанию, но может быть отменена с помощью no_root_squash. Также можно определить набор UID для которого использовать опцию. Вспомним, что опции anonuid и anongid помогают в изменении пользовательского UID/GID с nobody на любой другой.

Некоторые действия направлены на взаимодействие с portmapper. Например можно запретить доступ с любого компьютера, поместив следующую строку в файл /etc/hosts.deny :
 

# hosts.deny : absolute prohibition for every one to
#              use the portmap
portmap: ALL


Затем в файле /etc/hosts.allow можно указать компьютеры, которым разрешен доступ.

Не следует забывать и об использовании firewall'ов. В таблице указаны сервисы, номера портов и используемые протоколы :
 

RPC сервис Порт Протокол
portmap 111 upd / tcp
nfsd 2049 udp
mountd variable udp / tcp

Приложение : NIS, NFS и autofs

Для наглядности обратимся к сети, установленной нами в предыдущей заметке о NIS. Напомню, что имя сервера - "charly", который мы сконфигурировали в качестве NIS - сервера, а другие компьютеры в сети - "sabrina", "jill" и "kelly" - его клиенты ( конечно необходимо иметь дублирующий сервер, но в настоящий момент перед нами стоит другая задача ).

Сначала рассмотрим конфигурацию нашего сервера charly - во-первых определим некоторые NIS maps, содержащие всю необходимую информацию.

В файле /etc/netgroup перечислены группы компьютеров со схожими характеристиками ( например с одинаковой архитектурой ). Данная NIS map очень полезна для NFS. Мы собрали вместе все компьютеры, у которых есть право на доступ к одной и той же экспортируемой файловой системе и далее эта группа будет использоваться в файле /etc/exports вместо определения каждого компьютера в отдельности :

# /etc/netgroup
charlysangels (sabrina,,) (jill,,) (kelly)
 Что касается NFS - конфигурирование ограничено. Посмотрим на содержимое файла /etc/exports на сервере charly:
# /etc/exports
/usr/local    @charlysangels(ro)
Мы решили использовать automount для каталога /usr/local вместо монтирования при загрузке, эта процедура будет выполнена автоматически при попытке пользователя использовать файл из него. Также создадим файл /etc/auto.map и определим что будет одновременно доступно и automount и NIS:
# /etc/auto.map
charly          charly:/usr/local
Далее, если мы хотим чтобы информация из файлов auto.map и netgroup была интегрирована в базу данных NIS - необходимо изменить Makefile. Мы должны быть уверены, что netgroup будет обязательно добавлен, что касается auto.map - этот файл не определен по умолчанию и поэтому надо указать на его присутствие, добавив новый элемент в Makefile ( на основе существующих, взяв их в качестве основы ):
#To be added in the Yellows Pages's Makefile
AUTO_MAP    = $(YPSRCDIR)/auto.map
# ...
#...
auto.map: $(AUTO_MAP) $(YPDIR)/Makefile
            @echo "Updating $@..."
            -@sed -e "/^#/d" -e s/#.*$$// $(AUTO_MAP) | $(DBLOAD) \
            -i $(AUTO_MAP) -o $(YPMAPDIR)/$@ - $@
            -@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@
Это правило удаляет комментарии, добавляет новый элемент и пересылает информацию всем серверам.

Далее необходимо выполнить make из каталога /var/yp.

Теперь о клиентах sabrina, jill and kelly. Эдесь ничего особенного делать не надо:) Просто информируем autofs об управлении новой картой представляемой YP. Следующая строка присутствует в каждом файле /etc/auto.master у клиентов и позволяет получать информацию о наличии auto.map от YP сервисов.

#/etc/auto.master
/usr/local    yp auto.map    --intr,nosuid,nodev
Перезапускаем autofs.

После установки программ на компьютере charly, все клиенты могут использовать их.

Можно пойти еще дальше и создать один /usr на всех, один /usr/doc на всех, но как показывает практика - это не совсем хорошая идея. Это влечет за собой изменения в каталоге /etc и других. Далее приходится обновлять не экспортируемые файлы на компьютерах и т.д.
   

Ссылки

Файловые системы


NFS



Сноски

... inode1
дескриптор файла ( последовательность бит содержащая такую информацию как права доступа к файлу, владелец, адреса блоков содержащих данные и т.д.).
... /etc/mtab2
файл содержащий список файловых систем монтируемых ядром.

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Frédéric Raynal, FDL
LinuxFocus.org

Click here to report a fault or send a comment to Linuxfocus
Translation information:
fr -> -- Frédéric Raynal
fr -> en Philippe Trbich
en -> ru Kirill Poukhliakov

2000-12-10, generated by lfparser version 2.1