通過 NFS 複製時不遵守 ACL 預設值
我有一個 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 的傳播。我相信這仍然是目前的情況!如果 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 是可能的。
參考