標籤(空格分隔): Hadoopnode
以前對HDFS更或者說是對Linux中文件的權限沒有進行一個完整的學習,只是知道有全部者、所屬組和其它權限,具體到某我的的權限有讀(r)、寫(w)和可執行(x)。linux
HDFS的權限雖然是基於Linux的POSIX model,可是HDFS中其實並無真正的用戶和組的概念,只是從主機上拿到用戶的信息而後對其存儲的文件權限進行檢查。架構
HDFS中每一個文件和目錄都有一個owner和group,並對owner、owner同一個組的user和其它user的權限進行了分離,權限分爲rwx。對於文件來講,有r權限則可對此文件可讀,有w權限則可對文件進行寫和追加,x權限對文件來講沒有實際的意義。對於目錄來講,擁有r權限能夠查看目錄中內容,好比此目錄下的文件或者子目錄,擁有w權限能夠在此目錄中新建或者刪除文件和子目錄,但不能夠改變此目錄的名字,由於改變此目錄的信息是須要其上層目錄的寫權限,對於目錄來講,我的感受最重要的應該是x權限,擁有x權限,才能夠進入當前目錄進行其它操做。oop
若是沒有目錄的x權限,你擁有的其它權限並不能發揮相應的做用,由於rw權限都是針對目錄中的內容的,當你沒有進入目錄的權限時,其它權限都是虛無。學習
HDFS中還有一個sticky bit,此功能只針對目錄有效,是一個防刪除位。防止除管理員、目錄或者文件的全部者以外的其它人(即便其它用戶對該文件夾有rwx權限)對當前加了 sticky 位的目錄或者當前加了 sticky 位的目錄下的文件或者目錄進行刪除。
命令以下:ui
#即在第一位添加數字1 hdfs dfs -chmod 1777 /tmp hdfs dfs -chmod 1777 /user/hive/warehouse # 也能夠 hdfs dfs -chmod +t /tmp hdfs dfs -chmod +t /user/hive/warehouse
sticky bit 不一樣於suid, guid,對於others的execute權限位,則能夠設置sticky bit標誌, 用t來表示,若是該位置原本就有可執行權限位,即x,則t和x疊加後用大寫的T來表示。 sticky bit只對目錄起做用,若是一個目錄設置了sticky bit,則該目錄下的文件只能被 該文件的owner或者root刪除,其餘用戶即便有刪除權限也沒法刪除該文件。 例如,/tmp目錄,它的權限爲d rwx rwx rwt,該目錄中的文件(或目錄)只能被owner 或root刪除,這樣你們均可以把本身的臨時文件往該目錄裏面放,可是你的文件別人是沒法 刪除的。
注意:suid, sgid只對文件起做用,而sticky bit只對目錄起做用。code
HDFS ACL(Access Control Lists)是對POSIX permissions model的一個補充。傳統的權限是針對用戶和組的組織架構來設置的,但當你只想給特定的用戶或者組(而不是隻針對文件的全部者和所屬組)來開權限時,咱們就可使用ACL來控制。xml
默認狀況下,HDFS ACL功能是關閉的,由於開啓ACL以後,NN中會對開啓ACL的inode存儲一份額外的數據,會帶來額外的內存開銷,若是有須要能夠在hdfs-site.xml中設置dfs.namenode.acls.enabled爲true。繼承
新建一個文件或者目錄時,會繼承父目錄的ACL,但改變父目錄的ACL時,在此目錄中已經存在的內容不會發生改變。
一個文件或者目錄的ACL由一組ACL entry組成。每一個Entry標識一個用戶或者組的rwx權限,以下一個文件的一個ACL:ip
user::rw- user:bruce:rwx #effective:r-- group::r-x #effective:r-- group:sales:rwx #effective:r-- mask::r-- other::r--
文件的全部者具備rw權限,所屬組具備rx權限,其它用戶具備r權限,可是用戶bruce具備該文件的rwx權限,sales組也具備該文件的rwx權限。可是bruce和sales就真的具備rwx權限了?這裏還有最後一道防線mask,mask決定了一個用戶或者組可以獲得的最大的權限。上面的例子中,bruce和sales的權限會與mask的權限進行與運算,最終的結果纔是bruce和sales的權限,也就是註釋中的內容。
當一個文件有ACL時,權限檢查的流程爲:
一,判斷該用戶是否爲owner
二,判斷該用戶是否包含在ACL entry的user中,若是在,則經過mask過濾權限
三,判斷該用戶的所屬組是否包含在組中,包含則也要經過mask來過濾權限(由於在使用了ACL的狀況下,group的權限顯示的就是當前的mask)
四,判斷該用戶的所屬組是否包含在ACL entry的group中,若是在,則經過mask來過濾權限
# 添加用戶acl hdfs dfs -setfacl -m user:xx:rwx path # 刪除一個用戶的acl hdfs dfs -setfacl -x user:xx path # 刪除全部的acl hdfs dfs -setfacl -d path # 查看acl hdfs dfs -getfacl path
目錄或者文件添加了ACL以後,ll命令查看,會有一個+標識
一個文件或者目錄新建以後就有一個默認的權限,這個默認的權限是怎麼控制的呢?是由umask控制的。
文件建立以後的默認權限是0666 & ^umask,目錄建立以後的默認權限是0777 & ^umask,umask在core-site.xml中由fs.permissions.umask-mode設置,默認是022。
core-site中主要是設置umask,由fs.permissions.umask-mode控制,默認是022
hfds-site中控制着權限的開啓,參數以下:
dfs.permissions.enabled = true
是否開啓權限檢查,默認是true
dfs.permissions.superusergroup = supergroup
設置hdfs管理員的組名稱,模式名字是supergroup,通常改成與管理員相同的名字,如管理員是hdfs,則改成hdfs
dfs.namenode.acls.enabled = true
控制ACL是否開啓,默認爲false。
Tips:HDFS權限設置最好是以傳統的權限進行控制,只針對個別權限要求高的文件進行ACL控制。