Verwenden von NFSv4-ACLs unter Linux

1390
Jonathan

Ich habe erfolgreich einen NFSv4-Client und -Server eingerichtet, der ungefähr der Anleitung unter Einrichten von NFS-HOWTO folgt . Beide laufen unter Ubuntu Linux 14.04. Dies ist eine kleine Testumgebung ohne komplizierte Authentifizierung. Die beiden Server verwenden nur die gleiche Passwd-Datei. Alles scheint richtig zu funktionieren; Dateien sind auf dem Client sichtbar und Berechtigungen / Benutzer-IDs sind korrekt.

Jetzt möchte ich NFSv4-ACLs verwenden, um den Zugriff auf die Dateien auf dem NFSv4-Server zu steuern. Ich habe die erforderlichen Befehlszeilentools auf dem Client installiert und kann etwas sehen, das wie eine NFSv4-ACL aussieht:

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

Obwohl ich die ACL-Liste gut abrufen kann, kann ich keine ACLs festlegen. Jeder Versuch führt zu einem Invalid argumentFehler von setxattr.

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

Ich benutzte strace, um zu sehen, was los war. Gemäß der spärlichen Dokumentation, die ich finden konnte, werden NFSv4-ACLs als binäre XDR-Daten in einem erweiterten Attribut gespeichert, das system.nfs4_aclfür die Datei aufgerufen wird. Und sicher ist das, was passiert. setxattkehrt zurück 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) 

Warum setxattrversagt das? Erweiterte Attribute sind auf dem NFSv4-Server aktiviert:

$ 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 ... 

Und der Client verwendet sicherlich das NFSv4-Protokoll. verwenden mount, um die eingebauten Laufwerke anzuzeigen:

$ 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) ... 

Ich habe versucht, alle Debug-Flags auf nfsd umzublättern, um zu sehen, ob sich daraus ein nützliches Protokoll ergibt.

$ sudo rpcdebug -m nfsd -s all 

Es wird bestätigt, dass der Server die Anforderung zum Festlegen des Attributs empfängt.

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 

Was ist "Status 22"? Warum, 22 = EINVAL, Invalid Argument, was setxattrauf dem Client zurückgegeben wird. Leider scheint es nichts darüber zu sagen, warum das Argument als ungültig gilt.

Einige andere Dinge, die ich ausprobiert habe:

  1. Eine Möglichkeit ist, dass der Server der Meinung ist, dass die ACL fehlerhaft ist. Um dies zu überprüfen, habe ich verwendet nfs4_setfacl -e ., wodurch die vorhandene ACL in einem Texteditor zur Manipulation geöffnet wird . Wenn Sie die Datei ohne Änderungen speichern, wird immer noch eine Zugriffssteuerungsliste erstellt, die sich Invalid argumentbei ihrer Anwendung auswirkt.

  2. Die Zuordnung von Benutzer-IDs ist ein weiteres häufiges Problem bei NFSv4. Ich habe bestätigt, dass die Benutzer-IDs richtig angeordnet sind und dass die Dateibesitz- / Modusbits aus Sicht des NFSv4-Clients korrekt sind. Ich habe auch versucht, eine Domäne für NFSv4 Erstellung, indem Domain = localdomainin /etc/idmapd.confauf beiden Servern, ohne Wirkung.

Wenn Sie NFSv4-ACLs auf Linux-basierten NFS-Servern verwenden, würde ich mich freuen, von Ihnen zu hören. Ich habe viele Tutorials für die Einrichtung von NFSv4 selbst gefunden (siehe Link oben in dieser Tirade), aber praktisch keine erwähnt die Verwendung von ACLs.

5

1 Antwort auf die Frage

1
Jonathan

Für das, was es wert ist, gab ich diese Anstrengung schließlich nach ein paar weiteren Stichen im Dunkeln auf, bei denen meistens ein Ubuntu-Host mit ZFS versucht wurde.

Da ich für meine Testumgebung nur eine VM benötigte, die einen NFSv4-Server mit ACLs verfügbar machen konnte, gab ich meine Bemühungen auf, einen Linux-Server zum Laufen zu bringen, und benutze stattdessen ein FreeBSD 10.3-Image. Der Versuch, dies mit NFSv4 zu erreichen, war ebenfalls schwierig, aber zumindest möglich. Auf der FreeBSD-Manpage für nfsv4 (4) gibt es einen ziemlich anständigen Leitfaden .