Цель: расшарить директорию через NFS и CIFS так, чтобы для обоих протоколов был общий доступ и файлы, залитые через один протокол, были доступны на чтение и запись через второй.
Метод, до которого дошел я (возможно не единственный), реализуется через дополнительного пользователя на сервере, с которого шарится директория. В моем случае это пользователь «user» с UID 1000 (входит в одноименную группу с GID 1000).
Файл /etc/exports выглядит так
- "/share/Public" *(rw,nohide,async,no_subtree_check,crossmnt,all_squash,anonuid=1000,anongid=1000)
ключевыми параметрами являются:
- all_squash — опция говорит что все подключения будут считаться анонимными
- anonuid=1000 — определяет UID пользователя от имени которого будет осуществляться доступ для анонимных подключений
- anongid=1000 — аналогично определяет GID
Таким образом все файлы и папки, создаваемые на сервере через NFS будут иметь владельца «user»
- ls -la /share/Public/test_dir/
- total 12
- drwxr-xr-x 3 user user 4096 Jan 14 16:18 .
- drwxrwxrwx 14 user user 4096 Jan 14 16:18 ..
- drwxr-xr-x 2 user user 4096 Jan 14 16:18 'nfs dir'
- -rw-r--r-- 1 user user 0 Jun 19 2020 'nfs file.txt'
Теперь можно переходить к настройке самбы. Приведу весь свой конфиг /etc/samba/smb.conf
- [global]
- workgroup = WORKGROUP
- dns proxy = no
- log file = /var/log/samba/log.%m
- max log size = 200
- panic action = /usr/share/samba/panic-action %d
- server role = standalone server
- passdb backend = tdbsam
- obey pam restrictions = yes
- unix password sync = yes
- passwd program = /usr/bin/passwd %u
- passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
- pam password change = yes
- map to guest = bad user
- security = user
- usershare allow guests = yes
- acl allow execute always = true
- allow insecure wide links = yes
- # WinXP/Android X-Plore compatibility:
- ntlm auth = yes
- server min protocol = NT1
- [Public]
- path = /share/Public
- mangled names = no
- writeable = yes
- follow symlinks = yes
- wide links = yes
- browsable = yes
- guest ok = yes
- guest only = yes
- force user = user
- force group = user
- create mask = 666
- directory mask = 777
- #recycle
- vfs objects = recycle
- recycle:repository = /share/Public/.Trash-1000/files/%U
- recycle:keeptree = Yes
- recycle:versions = Yes
- recycle:touch = Yes
Здесь ключевыми являются опции директории:
- guest ok = yes — пускать юзера без аутентификации
- guest only = yes — пускать только анонимусов
- force user = user — работа с файлами ведется от имени указанного юзера «user» (аналог nfs-ного «anonuid=1000»)
- force group = user — аналогично для группы (аналог nfs-ного «anongid=1000»)
Корзина
Отдельно прокомментирую вот это кусок
- #recycle
- vfs objects = recycle
- recycle:repository = /share/Public/.Trash-1000/files/%U
- recycle:keeptree = Yes
- recycle:versions = Yes
- recycle:touch = Yes
Дело в том, что при удалении файлов из директории, смонтированной через NFS, скорее всего (это зависит от файлового менеджера) в точке монтирования будет создана директория корзины «.Trash-1000». В то же время клиенты Windows для сетевых путей корзину не используют, но именно для этого существуют опции самбы, которые включают сетевую корзину и позволяют указать — в какой именно директории хранить удаляемые файлы. В моем случае опция «recycle:repository» указывает правило хранения, которое соответствует правилам удалению в корзину в линуксе. То есть, при такой настройке, файлы что удаленные в линуксе через NFS, что в виндусе через SMB — попадут в один каталог. В винде, конечно, они не появятся в виндовой «корзине», но как минимум их можно будет достать из папки «.Trash-1000».
Однако при этом возникает парадоксальная ситуация, что в винде данную «корзину» очистить не получится, так как она лежит в той же шаре. То есть удаляемые файлы будут валиться в нее же. Воркэраундом является создание дополнительной отдельной шары под эту директорию, чтобы через нее удалять ненужные файлы.
- [Trash]
- path = /share/Public/.Trash-1000
- mangled names = no
- writeable = yes
- follow symlinks = yes
- wide links = yes
- browsable = yes
- guest ok = yes
- guest only = yes
- force user = user
- force group = user
- create mask = 666
- directory mask = 777