Файл /etc/exports управляет, какие файловые системы будут экспортированы на сетевой (remote) хост, и указывает опции. Пустые строки в нем игнорируются, комментарии могут быть вставлены строкой, начинающейся с символа #, и длинные строки могут быть продолжены на следующую строку с помощью символа обратного слеша \. Каждая экспортированная файловая система должна находится на своей собственной индивидуальной строке, и любые списки авторизованных хостов, размещаемые после экспортированной файловой системы, должны разделяться пробелами. Параметры для каждого из хостов должны быть помещены в круглые скобки непосредственно после идентификатора хоста без пробелов, разделяющих хост и первую скобку. Допустимые типы хостов: gss/krb5, gss/krb5i и gss/krb5p.
Замечание: вносить правки в конфигурационный файл /etc/exports необходимо с правами суперпользователя (через sudo).
[Содержимое файла /etc/exports]
Строка для экспортируемой файловой системы имеет следующую структуру:
В этой структуре замените < export> на экспортируемую директорию, замените < host1> на хост или сеть, в который применен экспорт для общего использования, и замените < options> на опции для этого хоста или сети. Дополнительные хосты могут быть указаны в разделяемом пробелами списке.
Следующие методы могут использоваться для указания имен хостов:
single host Один конкретный хост указывается по своему полному доменному имени (fully qualified domain name, FQDN), имени хоста (hostname), или по IP-адресу.
wildcards Здесь символ * или ? используется для учета группирования имен FQDN, которые совпадут с определенной строкой букв. Wildcards не должны использоваться вместе с IP-адресами; однако случайно это может сработать, если не удается произвести запрос reverse DNS.
Будьте осторожны с использованием wildcards для имен FQDN, поскольку они могут иметь тенденцию быть более точными, чем ожидалось. Например, использование *.example.com в качестве wildcard позволит получить доступ к экспортированной файловой системе, но не для bob.sales.example.com. Чтобы дать возможность доступа им обоим, необходимо указать *.example.com и *.*.example.com.
IP networks Позволяет задать совпадение хостов на основании их IP-адресов внутри увеличенной сети. Например, 192.168.0.0/28 позволит доступ первым 16 адресам IP от 192.168.0.0 до 192.168.0.15, но не для 192.168.0.16 и более старших адресов.
netgroups Разрешает использовать имя сетевой группы (NIS netgroup name), записанное как @< group-name>. Это фактически делает сервер NIS ответственным за управление доступом для этой экспортированной файловой системы, где пользователи могут быть добавлены или удалены их группы NIS, не влияя на /etc/exports.
Примечание: аббревиатура NIS расшифровывается как Network Information System. Это сетевая информационная служба, которая позволяет обмениваться данными конфигурации системы.
В простейшей форме файл /etc/exports только указывает экспортируемую директорию и хосты, которым разрешен доступ, как в следующем примере:
/exported/directory bob.example.com
В этом примере bob.example.com может смонтировать у себя /exported/directory/. Поскольку в этом примере опции не указаны, то вступают в действие следующие умолчания опций NFS:
ro Экспортированная файловая система монтируется только для чтения (read-only). Сетевые хосты не могут делать изменения данных на расшаренной файловой системе. Чтобы позволить хостам вносить изменения в файловую систему, то должна быть указана опция read/write (rw).
wdelay Заставляет сервер NFS применять задержку записи на диск, если он подозревает, что неизбежен другой запрос на запись. Это может улучшить производительность путем уменьшения количества обращений к диску отдельными командами записи, что снижает затраты ресурсов на запись. Опция no_wdelay отключает эту фичу, но это доступно только с использованием опции sync.
root_squash Запрещает удаленно подключенным пользователям root иметь права root и назначает им user ID (идентификатор пользователя) nfsnobody. Это эффективно "урезает" права remote root пользователям до самого обычного локального пользователя (lowest local user), что предотвращает неавторизованные изменения файлов на сетевом сервере. Альтернативно может быть указана опция no_root_squash, что отменяет это урезание прав root-пользователя. Чтобы урезать права любого remote-пользователя, включая root, используйте опцию all_squash. Чтобы указать идентификаторы и группы (user ID, group ID) для использования с remote-юзерами из определенного хоста, используйте anonuid и опции anongid соответственно. В этом случае может быть создана специальная учетная запись пользователя для remote NFS пользователей шары и указания (anonuid=< uid-value>,anongid=< gid-value>), где < uid-value> это номер user ID и < gid-value> номер group ID.
Важное замечание: по умолчанию NFS на Red Hat Enterprise Linux поддерживает списки управления доступом (access control list, ACL). Для запрета этой фичи укажите опцию no_acl при экспорте файловой системы.
Каждое умолчание для каждой экспортируемой файловой системы должно быть явно заново перенастроено. Например, если не указана опция rw, то экспортированная файловая система расшаривается как read-only. Следующий пример строки из /etc/exports перенастраивает две опции по умолчанию:
/another/exported/directory 192.168.0.3(rw,sync)
В этом примере хост 192.168.0.3 может у себя смонтировать каталог /another/exported/directory/ на чтение и запись, и все транзакции на диск сбрасываются на диск до завершения запроса на запись клиента.
Дополнительно доступны другие опции, для которых не заданы умолчания. Они включают возможность запрета sub-tree checking, разрешения доступа из небезопасных портов, и позволяют небезопасные блокировки (insecure file locks, что необходимо для некоторых ранних реализаций клиента NFS). Обратитесь к руководству man exports для подробностей по этим менее часто используемым опциям.
Предупреждение: формат файла /etc/exports очень точен, особенно в контексте использования символа пробела. Помните о том, что нужно всегда отделять пробелами экспортируемые файловые системы от хостов и хосты друг от друга. Однако не должно быть лишних символов пробела в строках файла exports, за исключением строк комментария.
Например, следующие две строки совсем не означают одно и то же. Первая строка позволяет только пользователям bob.example.com доступ на чтение и запись к директории /home. Вторая строка позволяет пользователям из bob.example.com монтировать директорию как read-only (что действует по умолчанию), в то время как остальная часть мира может делать монтирование на полный доступ (read/write).
Каждая файловая система, экспортируемая remote-пользователям через NFS, как и уровень доступа для этих файловых систем, перечисляется в файле /etc/exports. Когда запускается служба nfs, стартует команда /usr/sbin/exportfs, и она читает файл /etc/exports, передавая управление в rpc.mountd (если это NFSv2 или NFSv3) для фактического процесса монтирования, затем в rpc.nfsd, где файловые системы становятся доступны для remote-пользователей.
Когда команда /usr/sbin/exportfs запускается вручную, она позволяет root-пользовалю экспортировать директории или отменять экспорт директорий без необходимости перезапускать службу NFS. Когда заданы правильные опции, команда /usr/sbin/exportfs записывает экспортируемые файловые системы в /var/lib/nfs/xtab. Поскольку rpc.mountd ссылается на файл xtab при принятии решения о привилегиях доступа к файловой системе, изменения в списке экспортируемых файловых систем вступают в силу немедленно.
Ниже приведен список часто используемых опций, доступных для /usr/sbin/exportfs:
-r Вызывает экспорт всех каталогов, перечисленных в /etc/exports, путем создания нового списка экспорта в /etc/lib/nfs/xtab. Этот параметр эффективно обновляет список экспорта с учетом всех изменений, внесенных в /etc/exports.
-a Приводит к тому, что все каталоги экспортируются или не экспортируются, в зависимости от того, какие другие параметры передаются в /usr/sbin/exportfs. Если другие параметры не указаны, то /usr/sbin/exportfs экспортирует все файловые системы, указанные в /etc/exports.
-o file-systems Указывает директории для экспорта, которые не перечислены в /etc/exports. Замените file-systems дополнительными файловыми системами для экспорта. Эти файловые системы должны быть указаны в таком же формате, как в /etc/exports (синтаксис см. выше в разделе "Содержимое файла /etc/exports"). Эта опция часто полезна для тестирования экспортируемой файловой системы перед постоянным её добавлением в список экспортируемых файловых систем.
-i Игнорирование /etc/exports; для экспортируемых файловых систем используются только те опции, что указаны в командной строке.
-u Отмена экспорта всех расшаренных директорий. Команда /usr/sbin/exportfs -ua приостановит NFS file sharing, сохраняя активными все демоны NFS. Чтобы снова разрешить NFS шаринг, введите команду exportfs -r.
-v Подробные сообщения о работе, когда отображаются экспортируемые или отмененные для экспорта файловые системы.
Если никакие опции не указаны для команды exportfs, то она отобразит список экспортированных файловых систем.
Для дополнительной информации по команде /usr/sbin/exportfs см. справку man exportfs.
$ sudo apt install nfs-kernel-server
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
nfs-common rpcbind
Suggested packages:
open-iscsi watchdog
The following NEW packages will be installed:
nfs-common nfs-kernel-server rpcbind
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 428 kB of archives.
After this operation, 1 592 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://ru.archive.ubuntu.com/ubuntu jammy/main amd64 rpcbind amd64 1.2.6-2build1 [46,6 kB]
Get:2 http://ru.archive.ubuntu.com/ubuntu jammy-updates/main amd64 nfs-common amd64 1:2.6.1-1ubuntu1.2 [241 kB]
Get:3 http://ru.archive.ubuntu.com/ubuntu jammy-updates/main amd64 nfs-kernel-server amd64 1:2.6.1-1ubuntu1.2 [140 kB]
Fetched 428 kB in 1s (818 kB/s)
Selecting previously unselected package rpcbind.
(Reading database ... 325649 files and directories currently installed.)
Preparing to unpack .../rpcbind_1.2.6-2build1_amd64.deb ...
Unpacking rpcbind (1.2.6-2build1) ...
Selecting previously unselected package nfs-common.
Preparing to unpack .../nfs-common_1%3a2.6.1-1ubuntu1.2_amd64.deb ...
Unpacking nfs-common (1:2.6.1-1ubuntu1.2) ...
Selecting previously unselected package nfs-kernel-server.
Preparing to unpack .../nfs-kernel-server_1%3a2.6.1-1ubuntu1.2_amd64.deb ...
Unpacking nfs-kernel-server (1:2.6.1-1ubuntu1.2) ...
Setting up rpcbind (1.2.6-2build1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service → /lib/systemd/system/rpcbind.service.
Created symlink /etc/systemd/system/sockets.target.wants/rpcbind.socket → /lib/systemd/system/rpcbind.socket.
Setting up nfs-common (1:2.6.1-1ubuntu1.2) ... Creating config file /etc/idmapd.conf with new version Creating config file /etc/nfs.conf with new version
Adding system user `statd' (UID 136) ...
Adding new user `statd' (UID 136) with group `nogroup' ...
Not creating home directory `/var/lib/nfs'.
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-client.target → /lib/systemd/system/nfs-client.target.
Created symlink /etc/systemd/system/remote-fs.target.wants/nfs-client.target → /lib/systemd/system/nfs-client.target.
auth-rpcgss-module.service is a disabled or a static unit, not starting it.
nfs-idmapd.service is a disabled or a static unit, not starting it.
nfs-utils.service is a disabled or a static unit, not starting it.
proc-fs-nfsd.mount is a disabled or a static unit, not starting it.
rpc-gssd.service is a disabled or a static unit, not starting it.
rpc-statd-notify.service is a disabled or a static unit, not starting it.
rpc-statd.service is a disabled or a static unit, not starting it.
rpc-svcgssd.service is a disabled or a static unit, not starting it.
rpc_pipefs.target is a disabled or a static unit, not starting it.
var-lib-nfs-rpc_pipefs.mount is a disabled or a static unit, not starting it.
Setting up nfs-kernel-server (1:2.6.1-1ubuntu1.2) ...
Created symlink /etc/systemd/system/nfs-client.target.wants/nfs-blkmap.service → /lib/systemd/system/nfs-blkmap.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /lib/systemd/system/nfs-server.service.
nfs-mountd.service is a disabled or a static unit, not starting it.
nfsdcld.service is a disabled or a static unit, not starting it. Creating config file /etc/exports with new version Creating config file /etc/default/nfs-kernel-server with new version
Processing triggers for man-db (2.10.2-1) ... $ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
[Использование exportfs вместе с NFSv4]
Команда exportfs для ведения таблицы NFS экспортированных файловых систем. Когда команда exportfs выполнена в терминале без аргументов, она покажет все экспортированные в настоящий момент директории.
Поскольку NFSv4 больше не использует протокол MOUNT, который использовался с протоколами NFSv2 и NFSv3, изменилось монтирование файловых систем.
Клиент NFSv4 теперь имеет возможность увидеть все экспортирования, обслуживаемые сервером NFSv4, как одну файловую систему, которая называется NFSv4 pseudo-file system. На Red Hat Enterprise Linux эта pseudo-file system идентифицируется как одиночная, реальная файловая система, идентифицированная при экспорте с опцией fsid=0 option.
Например, на сервере NFSv4 могли быть запущены следующие команды:
В этом примере клиентам предоставляется несколько файловых систем для mount, с использованием опции --bind, которая создает неразрывные ссылки (unbreakable links).
Из-за функционала pseudo-file system конфигурации экспорта NFS версий 2, 3 и 4 не всегда совместимы. Например, учитывая следующее дерево каталогов:
/home /home/sam /home/john /home/joe
и экспорта:
/home *(rw,fsid=0,sync)
Использование NFS версий 2,3 и 4 будет работать следующим образом:
$ mount server:/home /mnt/home
$ ls /mnt/home/joe
Использование v4 будет работать следующим образом:
$ mount -t nfs4 server:/ /mnt/home
$ ls /mnt/home/joe
Здесь "server:/home" и "server:/" различаются. Чтобы сделать конфигурации экспорта совместимыми для всех версий, необходимо экспортировать (только для чтения) корневую файловую систему с fsid=0. fsid=0 сигнализирует серверу NFS, что этот экспорт является корневым.
/ *(ro,fsid=0) /home *(rw,sync,nohide)
Теперь с этими экспортами оба монтирования "mount server:/home /mnt/home" и "mount -t nfs server:/home /mnt/home" будут работать ожидаемо.
Пример монтирования локального каталога ~/workdir/myapp пользователя john:
1. Откройте в текстовом редакторе файл /etc/exports:
$ sudo gedit /etc/exports
2. Добавьте строку для экспорта каталога ~/workdir/myapp (должен быть указан полный путь относительно корневого каталога /):
Здесь заданы права на чтение и запись (rw), root-права пользователя на подключающемся хосте действуют, доступ в подкаталоги разрешен. Сохраните файл /etc/exports и выйдите из редактора.
3. Следующей командой укажите серверу NFS перечитать /etc/exports:
Если вам нужно отменить общий доступ для экспортированного каталога, то закомментируйте или удалите соответствующую строку в файле /etc/exports, сохраните файл, и выполните команду:
$ sudo exportfs -r
4. Следующую команду выполните на удаленном хосте, чтобы запустить на нем монтирование расшаренной на предыдущих шагах папки в свою локальную папку /mnt/mirror. Содержимое папки /mnt/mirror удаленной машины будет совпадать с содержимым папки /home/john/workdir/myapp:
-t nfs Ограничивает у этого монтирования поддержку файловых систем только для NFS.
-o rw,nolock Указывает несколько опций монтирования, каждая опция задается через запятую: rw разрешает чтение и запись, nolock предотвращает обмен информацией о блокировке файлов между сервером NFS и данным клиентом NFS. Сервер не знает о блокировках файлов на этом клиенте, и наоборот.
192.168.1.2:/home/john/workdir/myapp Здесь указан IP сервера NFS и расшаренный каталог на нем.
/mnt/mirror локальный каталог, содержимое которого будет совпадать с расшаренным каталогом /home/john/workdir/myapp на сервере NFS.
Отменить монтирование на сетевом хосте можно командой umount:
# umount /mnt/mirror
[Ссылки]
1. The /etc/exports Configuration File site:docs.redhat.com. 2. exports(5) Linux man page site:linux.die.net. 3. Настройка сервера NFS на Linux Ubuntu site:dmosk.ru.