Saya telah berhasil mengatur klien dan server NFSv4, secara kasar mengikuti panduan di Menyiapkan NFS HOWTO . Keduanya menjalankan Ubuntu Linux 14.04. Ini adalah lingkungan pengujian kecil tanpa otentikasi yang rumit; kedua server hanya menggunakan file passwd yang sama. Segalanya tampak bekerja dengan benar; file terlihat di klien, dan izin / ID pengguna benar.
Sekarang saya ingin menggunakan NFSv4 ACL untuk mengontrol akses ke file di server NFSv4. Saya menginstal alat baris perintah yang diperlukan pada klien, dan saya bisa melihat sesuatu yang tampak seperti NFSv4 ACL:
$ nfs4_getfacl .
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy
Namun, sementara saya bisa mendapatkan daftar ACL dengan baik, saya tidak bisa mengatur ACL. Setiap upaya menghasilkan Invalid argument
kesalahan dari setxattr
.
$ nfs4_setfacl -a A::OWNER@:rxtncy .
Failed setxattr operation: Invalid argument
Saya menggunakan strace untuk melihat apa yang sedang terjadi. Menurut dokumentasi yang jarang saya dapat temukan, NFSv4 ACL disimpan sebagai data XDR biner dalam atribut yang diperluas system.nfs4_acl
pada file. Dan tentu saja, itulah yang terjadi; setxatt
akan kembali 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)
Jadi mengapa demikian? setxattr
kegagalan? Atribut yang diperluas diaktifkan di server 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
...
Dan klien tentu saja menggunakan protokol NFSv4; menggunakan mount
untuk menampilkan drive yang dipasang:
$ 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)
...
Saya mencoba membalik semua flag debug pada nfsd untuk melihat apakah itu akan menghasilkan log yang bermanfaat.
$ sudo rpcdebug -m nfsd -s all
Itu mengkonfirmasi bahwa server menerima permintaan untuk mengatur atribut.
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
Whatsapp "status 22"? Kenapa, 22 = EINVAL
, Argumen Tidak Valid, yang adalah apa setxattr
kembali pada klien. Sayangnya tidak muncul untuk mengungkapkan apa pun tentang Mengapa argumen tersebut dianggap tidak valid.
Beberapa hal lain yang pernah saya coba:
Satu kemungkinan adalah bahwa server mengira ACL rusak. Untuk memeriksa ini, saya menggunakan
nfs4_setfacl -e .
, yang membuka ada ACL dalam editor teks untuk manipulasi. Menyimpan file tanpa perubahan masih menghasilkan ACL yang menghasilkanInvalid argument
saat diterapkan.Pemetaan ID pengguna adalah masalah umum lainnya dengan NFSv4. Saya telah memvalidasi bahwa ID pengguna berbaris dengan benar dan kepemilikan file / mode bit benar dari sudut pandang klien NFSv4. Saya juga mencoba membuat domain untuk NFSv4 dengan mengatur
Domain = localdomain
di/etc/idmapd.conf
pada kedua server, tidak berpengaruh.
Jika Anda menggunakan NFSv4 ACL di server NFS berbasis Linux, saya ingin tahu dari Anda; Saya menemukan banyak tutorial untuk mengatur NFSv4 sendiri (lihat tautan di bagian atas omelan ini), tetapi hampir tidak ada yang menyebutkan penggunaan ACL.