Я пытаюсь переместить файл из локального каталога в смонтированный каталог nfs на сервере CentOS 7. Экспорт предоставляется FreeNAS.
Оба каталога принадлежат текущему пользователю как минимум с 755 (nfs показывает как 777, но я не уверен, что верю в это).
Мой fstab выглядит так
host:/path/to/export /mnt/nfs nfs defaults 0 0
Я не могу переместить файл
mv /local/file /mnt/nfs/file
mv: cannot create regular file 'file': Operation not permitted
Однако я могу скопировать и удалить его
cp /local/file /mnt/nfs/file
rm /local/file
Выход mount
host:/path/to/export on /mnt/nfs type nfs (rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=host,mountvers=3,mountport=908,mountproto=udp,local_lock=none,addr=host)
Разрешения каталога на клиенте
ls -ld /local /mnt/nfs
drwxrwxrwx. 15 user user 17 Nov 28 08:32 /mnt/nfs/
drwxrwxrwx. 2 root root 17 Nov 29 12:20 /local
После дальнейшего расследования, похоже, это касается изменения разрешений. mv
берет с собой права доступа к файлу, однако cp
создает новый файл, который наследует разрешения от родительского каталога. Похоже, крепление nfs не позволяет мне chown
файлы, даже если я являюсь пользователем root или владельцем файлов. Итак, теперь мой вопрос: как разрешить изменение разрешений или игнорировать разрешения, указанные в mv
.
Вы видите какие-либо файлы в смонтированном каталоге nfs на клиенте nfs как принадлежащие
nobody nobody
Можете ли вы опубликовать вывод nfsidmap -d
с сервера и клиента? Подсказка - при использовании NFSV4 выходы должны совпадать.
Скорее всего, вы столкнулись с несоответствием между UID / GID на сервере NFS и клиенте NFS. Я покажу, как это работает, на простом примере.
Допустим, вы делитесь своим NFS-клиентом / nfs_share вот так. Заметь nfs_share
может писать кто угодно (777).
[root@nfsserver nfs_share]# cat /etc/exports
/nfs_share 192.168.0.52(rw,no_root_squash)
[root@nfsserver nfs_share]# ls -ld /nfs_share
drwxrwxrwx. 2 root root 4096 Nov 30 23:55 /nfs_share
И монтируем на вашем NFS-клиенте вот так
mount 192.168.0.51:/nfs_share /mnt
Теперь у вас на сервере nfs есть пользователь dmitry
[root@nfsserver nfs_share]# getent passwd|grep dmitry
dmitry:x:500:500::/home/dmitry:/bin/bash
[root@nfsserver nfs_share]# getent group|grep dmitry
dmitry:x:500:
И на вашем nfs-клиенте у вас есть пользователь helen
[root@nfsclient ~]# getent passwd|grep helen
helen:x:500:500::/home/helen:/bin/bash
[root@nfsclient ~]# getent group|grep helen
helen:x:500:
Обратите внимание, что несмотря на то, что это разные пользователи, у них одинаковые UID и GID. Итак, что произойдет, если я коснусь файла helen как пользователя на общей папке nfs?
[helen@nfsclient mnt]$ touch helen_client
[helen@nfsclient mnt]$ ls -lrt
[helen@nfsclient mnt]$ ls -lrt
total 0
-rw-rw-r--. 1 nobody nobody 0 Nov 30 23:58 helen_client
На клиенте NFS этот новый файл будет отображаться как принадлежащий nobody nobody
. Это связано с тем, что nfsidmap не может сопоставить client_user_name @ domain с server_user_name @domain. А теперь момент перемирия. Давайте проверим, какой владелец файла на сервере nfs.
[root@nfsserver nfs_share]# ls -rlt
total 0
-rw-rw-r--. 1 dmitry dmitry 0 Nov 30 23:58 helen_client
Еще не удивлены?
Но на самом деле ничего странного нет. Это работает, как ожидалось.
Сервер NFS не может сопоставить пользователя helen, но он получил UID и GID. Таким образом, он создал файл (поскольку папка доступна для записи всем) с UID 500 и GID 500, который сопоставлен с dmitry: dmitry на сервере NFS.
Теперь предположим, что у нас есть другой пользователь, UID / GID и имена совпадают между сервером и клиентом.
[root@nfsserver mnt]# getent passwd|grep angelina
angelina:x:501:501::/home/angelina:/bin/bash
[root@nfsserver mnt]# getent group|grep angelina
angelina:x:501:
[angelina@nfsclient mnt]$ getent passwd|grep angelina
angelina:x:501:501::/home/angelina:/bin/bash
[angelina@nfsclient mnt]$ getent group|grep angelina
angelina:x:501:
И если я коснусь файла на клиенте nfs от имени пользователя angelina - я увижу правильное имя пользователя / группу как на сервере, так и на клиенте.
[angelina@nfsclient mnt]$ pwd
/mnt
[angelina@nfsclient mnt]$ touch angelina_1
[angelina@nfsclient mnt]$ ls -l
total 0
-rw-rw-r--. 1 angelina angelina 0 Dec 1 2016 angelina_1
-rw-rw-r--. 1 nobody nobody 0 Dec 1 00:16 helen_1
[root@nfsserver nfs_share]# pwd
/nfs_share
[root@nfsserver nfs_share]# ls -l
total 0
-rw-rw-r--. 1 angelina angelina 0 Dec 1 00:27 angelina_1
-rw-rw-r--. 1 dmitry dmitry 0 Dec 1 00:16 helen_1
Итог - для правильной работы NFSV4 вам необходимо иметь
nfsidmap -d