Общая сетевая папка NFS+SAMBA с правами для всех

Цель: расшарить директорию через NFS и CIFS так, чтобы для обоих протоколов был общий доступ и файлы, залитые через один протокол, были доступны на чтение и запись через второй.

Метод, до которого дошел я (возможно не единственный), реализуется через дополнительного пользователя на сервере, с которого шарится директория. В моем случае это пользователь «user» с UID 1000 (входит в одноименную группу с GID 1000).

Файл /etc/exports выглядит так

/etc/exports
 
  1. "/share/Public" *(rw,nohide,async,no_subtree_check,crossmnt,all_squash,anonuid=1000,anongid=1000)

ключевыми параметрами являются:

  1. all_squash — опция говорит что все подключения будут считаться анонимными
  2. anonuid=1000 — определяет UID пользователя от имени которого будет осуществляться доступ для анонимных подключений
  3. anongid=1000 — аналогично определяет GID

Таким образом все файлы и папки, создаваемые на сервере через NFS будут иметь владельца «user»

 
 
  1. ls -la /share/Public/test_dir/
 
 
  1. total 12
  2. drwxr-xr-x  3 user user 4096 Jan 14 16:18  .
  3. drwxrwxrwx 14 user user 4096 Jan 14 16:18  ..
  4. drwxr-xr-x  2 user user 4096 Jan 14 16:18 'nfs dir'
  5. -rw-r--r--  1 user user    0 Jun 19  2020 'nfs file.txt'

Теперь можно переходить к настройке самбы. Приведу весь свой конфиг /etc/samba/smb.conf

/etc/samba/smb.conf
 
  1. [global]
  2.     workgroup = WORKGROUP
  3.     dns proxy = no
  4.     log file = /var/log/samba/log.%m
  5.     max log size = 200
  6.     panic action = /usr/share/samba/panic-action %d
  7.     server role = standalone server
  8.     passdb backend = tdbsam
  9.     obey pam restrictions = yes
  10.     unix password sync = yes
  11.     passwd program = /usr/bin/passwd %u
  12.     passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
  13.     pam password change = yes
  14.     map to guest = bad user
  15.     security = user
  16.     usershare allow guests = yes
  17.     acl allow execute always = true
  18.     allow insecure wide links = yes
  19.     # WinXP/Android X-Plore compatibility:
  20.     ntlm auth = yes
  21.     server min protocol = NT1
  22. [Public]
  23.     path = /share/Public
  24.     mangled names = no
  25.     writeable = yes
  26.     follow symlinks = yes
  27.     wide links = yes
  28.     browsable = yes
  29.     guest ok = yes
  30.     guest only = yes
  31.     force user = user
  32.     force group = user
  33.     create mask = 666
  34.     directory mask = 777
  35.     #recycle
  36.     vfs objects = recycle
  37.     recycle:repository = /share/Public/.Trash-1000/files/%U
  38.     recycle:keeptree = Yes
  39.     recycle:versions = Yes
  40.     recycle:touch = Yes

Здесь ключевыми являются опции директории:

  1. guest ok = yes — пускать юзера без аутентификации
  2. guest only = yes — пускать только анонимусов
  3. force user = user — работа с файлами ведется от имени указанного юзера «user» (аналог nfs-ного «anonuid=1000»)
  4. force group = user — аналогично для группы (аналог nfs-ного «anongid=1000»)

Корзина

Отдельно прокомментирую вот это кусок

 
 
  1. #recycle
  2.     vfs objects = recycle
  3.     recycle:repository = /share/Public/.Trash-1000/files/%U
  4.     recycle:keeptree = Yes
  5.     recycle:versions = Yes
  6.     recycle:touch = Yes

Дело в том, что при удалении файлов из директории, смонтированной через NFS, скорее всего (это зависит от файлового менеджера)  в точке монтирования будет создана директория корзины «.Trash-1000». В то же время клиенты Windows для сетевых путей корзину не используют, но именно для этого существуют опции самбы, которые включают сетевую корзину и позволяют указать — в какой именно директории хранить удаляемые файлы. В моем случае опция «recycle:repository» указывает правило хранения, которое соответствует правилам удалению в корзину в линуксе. То есть, при такой настройке, файлы что удаленные в линуксе через NFS, что в виндусе через SMB — попадут в один каталог. В винде, конечно, они не появятся в виндовой «корзине», но как минимум их можно будет достать из папки «.Trash-1000».

Однако при этом возникает парадоксальная ситуация, что в винде данную «корзину» очистить не получится, так как она лежит в той же шаре. То есть удаляемые файлы будут валиться в нее же. Воркэраундом является создание дополнительной отдельной шары под эту директорию, чтобы через нее удалять ненужные файлы.

/etc/samba/smb.conf
 
  1. [Trash]
  2.     path = /share/Public/.Trash-1000
  3.     mangled names = no
  4.     writeable = yes
  5.     follow symlinks = yes
  6.     wide links = yes
  7.     browsable = yes
  8.     guest ok = yes
  9.     guest only = yes
  10.     force user = user
  11.     force group = user
  12.     create mask = 666
  13.     directory mask = 777