Использование списков ACL NFSv4 в Linux

5

Я успешно настроил клиент и сервер NFSv4, примерно следуя инструкциям на Настройка NFS HOWTO , Оба работают под управлением Ubuntu Linux 14.04. Это небольшая тестовая среда без сложной аутентификации; два сервера просто используют один и тот же файл passwd. Кажется, все работает правильно; файлы видны на клиенте, и права доступа / идентификаторы пользователей верны.

Теперь я хотел бы использовать списки управления доступом NFSv4 для управления доступом к файлам на сервере NFSv4. Я установил необходимые инструменты командной строки на клиенте и смог увидеть что-то похожее на ACL NFSv4:

$ nfs4_getfacl .
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy

Однако, хотя я могу получить список ACL просто отлично, я не могу установить какие-либо ACL. Каждая попытка приводит к Invalid argument ошибка от setxattr,

$ nfs4_setfacl -a A::OWNER@:rxtncy .
Failed setxattr operation: Invalid argument

Я использовал strace, чтобы увидеть, что происходит. Согласно разреженной документации, которую я смог найти, ACL NFSv4 хранятся в виде двоичных данных XDR в расширенном атрибуте, который называется system.nfs4_acl в файле. И конечно же, это то, что происходит; setxatt возвращается EINVAL,

getxattr("/primary/home/rstudiouser", "system.nfs4_acl", 0x0, 0) = 80
getxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 80) = 80
setxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa9\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 104, XATTR_REPLACE) = -1 EINVAL (Invalid argument)

Итак, почему setxattr неудачу? Расширенные атрибуты включены на сервере NFSv4:

$ sudo tune2fs -l /dev/sda1
tune2fs 1.42.9 (4-Feb-2014)
...
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file 
uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
...

И клиент, конечно, использует протокол NFSv4; с помощью mount показать установленные диски:

$ mount
...
192.168.55.103:/primary/home on /primary/home type nfs4 (rw,rsize=8192,wsize=8192,timeo=14,intr,nfsvers=4,acl,addr=192.168.55.103,client
addr=192.168.55.101)
...

Я попытался переключить все флаги отладки на nfsd, чтобы увидеть, приведет ли это к полезному журналу.

$ sudo rpcdebug -m nfsd -s all

Это подтверждает, что сервер получает запрос на установку атрибута.

Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567892] nfsd_dispatch: vers 4 proc 1
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567909] nfsv4 compound op #1/2: 22 (OP_PUTFH)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567915] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567929] nfsv4 compound op ffff88003c2f6080 opcnt 2 #1: 22: status 0
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567932] nfsv4 compound op #2/2: 34 (OP_SETATTR)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567938] nfsd: fh_verify(36: 01070001 001c0002 00000000 acf697e6 a847b405 c98a638b)
Apr  7 20:21:49 vagrant-ubuntu-trusty-64 kernel: [73465.567978] nfsv4 compound op ffff88003c2f6080 opcnt 2 #2: 34: status 22

Что такое "статус 22"? Почему 22 = EINVALНеверный аргумент setxattr возвращается на клиента. К сожалению, это ничего не говорит о Зачем аргумент считается недействительным.

Некоторые другие вещи, которые я пробовал:

  1. Одна возможность состоит в том, что сервер думает, что ACL искажен. Чтобы проверить это, я использовал nfs4_setfacl -e ., который открывает существующий ACL в текстовом редакторе для манипуляции. Сохранение файла без изменений все еще производит ACL, который приводит к Invalid argument при применении.

  2. Отображение идентификатора пользователя - еще одна распространенная проблема с NFSv4. Я проверил, что идентификаторы пользователей выстроены правильно и что биты владения / режима файла являются правильными с точки зрения клиента NFSv4. Я также попытался создать домен для NFSv4, установив Domain = localdomain в /etc/idmapd.conf на обоих серверах безрезультатно.

Если вы используете списки управления доступом NFSv4 на серверах NFS на базе Linux, мне было бы интересно услышать ваше мнение; Я нашел много учебных пособий по настройке самой NFSv4 (см. Ссылку вверху этой тирады), но практически никто не упоминает об использовании ACL.

Jonathan
источник

Ответы:

1

Что бы это ни стоило, я, наконец, отказался от этих усилий после нескольких ударов в темноте, которые в основном включали в себя попытку использования Ubuntu с ZFS.

Поскольку все, что мне было нужно для моей тестовой среды, - это виртуальная машина, которая может предоставлять NFSv4-сервер с ACL, я отказался от своих усилий по запуску Linux-сервера и использовал вместо этого образ FreeBSD 10.3. Попытка заставить это работать с NFSv4 было также сложно, но было по крайней мере возможно. Есть довольно приличное руководство по Справочная страница FreeBSD для nfsv4 (4) ,

Jonathan
источник