Nfs

通過 NFS 複製時不遵守 ACL 預設值

  • November 14, 2013

我有一個 Arch Linux 盒子,它有一個來自通過 NFS 安裝的 Ubuntu 伺服器的文件夾。我已經在伺服器上的文件夾上設置了一個訪問控制列表,以便任何新文件都應該設置它們的權限-rwx-r-x---

user1@ubuntu:~$ getfacl home/user2/shared/
# file: home/user2/shared/
# owner: user2
# group: remoteusers
user::rwx
group::r-x
other::---
default:user::rwx
default:user:user2:rwx
default:group::r-x
default:group:remoteusers:r-x
default:mask::rwx
default:other::---

如果我創建一個文件,則權限設置得很好:

userA@arch:~$ touch ubuntuNFS/test.txt

userA@arch:~$ ls -la ubuntuNFS
-rw-r----- 1 ########## ##########    0 Nov 13  2013 test.txt

但是,如果我複制一個文件,該組不會被授予任何權限:

userA@arch:~$ cp Videos/video.mp4 ubuntuNFS/

userA@arch:~$ ls -la ubuntuNFS
-rw------- 1 ########## ##########    0 Nov 13  2013 video.mp4
-rw-r----- 1 ########## ##########    0 Nov 13  2013 test.txt

為什麼不cp遵守 ACL 預設值?

我認為 NFS 中偶爾會以各種方式支持 ACL。請參閱 NFS 項目網站上的這篇文章。

如果這不是問題,那麼我會非常懷疑cp. cp我似乎記得一個關於命令不完全複製 ACL的問答,無論目標掛載類型如何。

我相信正是這個 U&L Q&A 的標題是:Using setfacl to allow group members to write to any file in a directory導致我看到這個 SF Q&A 的標題是:為什麼 cp 不尊重 ACL?.

具有諷刺意味的是,我們自己的@Gilles 在那個 SF Q&A 上寫了一個答案,解釋了為什麼cp不支持 ACL 的傳播。我相信這仍然是目前的情況!

摘自@Gilles 答案

如果 cp 創建目標文件,它會複製源文件的權限,但 umask 中設置的位除外。這是標準行為(例如參見Single Unix v3 (POSIX 2001) 規範中的步驟 3.b。

為什麼cp是這樣設計的?因為在很多情況下這種行為是可取的,例如在原始權限受到限制時保留文件的隱私,並且保留可執行性幾乎總是正確的做法。然而不幸的是,甚至 GNU cp 也沒有選項可以關閉此行為。

大多數複製工具(例如 pax、rsync)的行為方式相同。您可以通過將源與目標解耦來確保使用預設權限創建文件,例如使用 cat foo/baz。

例子

我設置了以下文件,afile並向其中添加了 ACL。

$ touch afile
$ setfacl -m user:sam:rwx,group:users:rwx afile

我們現在有:

$ getfacl afile 
# file: afile
# owner: root
# group: root
user::rw-
user:sam:rwx
group::r--
group:users:rwx
mask::rwx
other::r--

當我將這些文件複製到 NFSv3 共享時:

$ cp afile ~sam/
$ getfacl ~sam/afile 
getfacl: Removing leading '/' from absolute path names
# file: home/sam/afile
# owner: root
# group: root
user::rw-
group::rwx
other::r--

ACL 失去。嘗試使用--preserve開關cp

$ cp --preserve afile ~sam/
cp: preserving permissions for `/home/sam/afile': Operation not supported
cp: preserving ACL for `/home/sam/afile': Operation not supported

在 NFS 上啟用 ACL

在 NFS 掛載上啟用 ACL 似乎也沒有效果:

mulder:/export/r1/home/sam on /home/sam type nfs (rw,intr,tcp,nfsvers=3,acl,rsize=16384,wsize=16384,addr=192.168.1.1)

$ cp --preserve afile ~sam/
cp: preserving permissions for `/home/sam/afile': Operation not supported
cp: preserving ACL for `/home/sam/afile': Operation not supported

相同的硬碟工作

有趣的是,--preserve當在同一個 EXT4 安裝驅動器上本地複製文件時,該開關確實有效。

$ cp --preserve afile afile2
$ getfacl afile2
# file: afile2
# owner: root
# group: root
user::rw-
user:sam:rwx
group::r--
group:users:rwx
mask::rwx
other::r--

前進的道路?

在我的研究和實驗中,似乎低於 NFSv4 的任何東西都不支持 ACL。cp只要底層文件系統支持 ACL,該命令似乎就能夠保留 ACL。

我找到了這篇文章:Projects: NFS Version 4 Open Source Reference Implementation,其中討論了在 NFSv4 中使用 ACL。所以我希望將 ACL 複製到 NFSv4 共享是可能的,但我不相信使用 NFSv2 或 NFSv3 是可能的。

參考

引用自:https://unix.stackexchange.com/questions/101096