搜尋此網誌
RHCE 目錄與檔案權限
DIRECTORY
Linux系統中,目錄是一種檔案,用來紀錄其中檔案的位置。
就像是倉庫一樣,倉庫是一種檔案系統空間,裡面的貨物就是檔案,而目錄就是倉儲貨物的清單。
使用者可以使用 #ls 來查詢目錄中的內容,更常使用 #ls -al 來查詢目錄檔案的詳細資料。
-a表示顯示所有檔案,包括隱藏檔;-l表示列出詳細的資料。
目錄檔案中,每筆資料表示一個檔案或目錄,連結數就表示這筆資料下有多少檔案或目錄連結至此。
時間是檔案建立時間、上次執行時間、上次修改時間三者中最接近當前時間者。
另外要注意到,為什麼很多目錄的容量都是4096bytes。
這並不是這個目錄裡面只有4096bytes的檔案,而是這個名為「目錄」的檔案有4096bytes的大小。
是4096bytes的原因在於你硬碟的block的大小,通常都是1k、2k、或4k為一個block。
圖片中的硬碟就是以4096bytes為一個block,所以新增目錄時,目錄檔案大小就是4096bytes。
當然也有些目錄因為系統設定的關係不會是block的倍數,不過基本上一定都是1024bytes的倍數。
另外,有些目錄檔案的容量為0bytes,這些目錄屬於虛擬檔案系統(Virtual File System, VFS)。
簡單來說,這些目錄內的資料並不存在於實體硬碟中,而是存在於記憶體。
這些資料藉由VFS掛載到Linux中,以便系統於進行存取的動作。
包括了kernel、process、net以及其他週邊裝置等。
所以當使用者對檔案進行異動,其實就是對目錄檔案的編輯。
新增檔案就是在目錄檔案上加上一筆資料,哪個地方有哪個檔名的檔案。
移動檔案就是把原本目錄檔案上這個檔案刪除,然後新增到新的目錄檔案上。
有趣的是刪除檔案,刪除檔案其實並不是把那個檔案空間清除,而是目錄檔案上這個檔案的紀錄。
當一個檔案沒有跟任何目錄有所連結,系統就會判定這的空間是空的空間。
將來要儲存新的檔案的時候,系統可能就會把新資料覆蓋過舊資料。
FILE PERMISSIONS
這邊同樣以下圖為例子,權限的部分可以看到是dr-xr-x-rx。
權限主要分為四個部分:檔案類型、擁有者權限、群組權限、以及其他使用者權限三部分。
檔案類型大致有以下幾種:
-:file(一般檔案)
d:directory(目錄)
l:symbolic link(連結符號)
s:socket
p:pipeline
b:block(可儲存資料的設備)
c:character(硬碟以外的硬體接口)
權限是針對擁有者(user)、群組(group)、以及其他使用者(other)進行讀、寫、執行三種權限設定。
這邊要注意到對於檔案,權限只有讀取、編輯內容、以及執行,那如果要新增跟刪除呢?
檔案的新增跟刪除必須要對該檔案所屬的目錄有寫入(w)的權限才可以進行,這點要注意。
權限數字是讓使用者可以用數字去代表權限,例子中權限為r-xr-xr-x,每三個字母就代表一組權限。
所以這個檔案的權限也可以寫成555。
另外還有一種特殊權限,主要是針對每組權限中的執行(x)給予不同的功能。
例如一個檔案原本的權限為rwxrwx---(770),如今希望這個檔案對於群組的部分給予特殊權限。
所以特殊權限的群組為s,就把原本群組的x替換為s,變成rwxrws---。
而權限數字表示群組的為2,加上原本的權限後,新的權限數字為2770。
FILE PERMISSIONS MANAGE
當需要變更檔案或目錄的擁有者以及擁有群組時,可以使用 #chown 以及 #chgrp。
#chown [使用者名稱] [檔案或目錄] 可以將檔案或目錄的擁有者變更。
#chgrp [群組名稱] [檔案或目錄] 可以將檔案或目錄的擁有群組者變更。
或者使用 #chown .[群組名稱] [檔案或目錄]
#chown 指令中,只要群組名稱前面加上「.」,就可以變更擁有群組。
所以同時變更擁有者以及擁有群組,就使用 #chown [使用者名稱].[群組名稱] [檔案或目錄]。
而加入參數-R,可以同時改變目錄下所有檔案以及目錄。
當需要變更檔案的存取權限時,可以使用 #chmod 。
權限的變更分為三個部分,who、what、which。
例如一個檔案原本的權限是rwxr-xrw-(756)。
要群組增加讀取權限就輸入 #chmod g+w [檔案或目錄],或者 #chmod 776 [檔案或目錄]。
要其他使用者無法讀取就輸入 #chmod o-r [檔案或目錄],或者 #chmod 752 [檔案或目錄]。
要注意使用「= (assign)」是重新設定權限,如果一次想設定兩個以上的對象,可用「,」分隔。
而-R參數也是為同時變更目錄以下所有檔案以及目錄的權限。
ACCESS CONTROL LIST
Access Control List(ACL)提供了一種更靈活控制檔案權限的方式。
例如公司依照部門將所有員工建立群組,群組外的人無法存取群組中的權限。
但是公司的董事長希望可以看到業務群組內的檔案,但是董事長屬於管理群組,無法進入業務群組。
這時候就可以利用ACL讓董事長可以存取業務群組中的檔案。
ACL在EXT4檔案系統中是預設開啟,而之前的檔案系統就必須手動設定開啟。
使用 #dumpe2fs /dev/[分割區] | grep 'Default mount' 查詢分割區是否支援ACL功能。
若無ACL功能可使用 #tune2fs -o acl.user_xattr /dev/[分割區] 開啟ACL功能。
或編輯/etc/fstab,在該分割區的檔案系統參數中加入「,acl」。
對於欲修改權限的檔案或目錄,可以先用#getfcal 查詢目前的權限設定。
例如查詢/etc/fstab,輸入 #getfacl /etc/fstab。
由上而下依序是檔案名稱、擁有者、擁有群組、擁有者權限、擁有群組權限、其他使用者權限。
要改變檔案的ACL則使用 #setfacl -m [u, g, o]:[使用者或群組名稱]:[權限] [檔案或目錄]。
例如要讓使用者peter可以讀取,則輸入 #setfacl -m u:peter:r /etc/fstab。
也讓群組john可以讀取寫入,則輸入 #setfacl -m g:john:rw /etc/fstab。
然後在查詢一下就會發現,我們剛剛設定的權限都已經設定完成了。
這時候會發現,多出了一個mask,這是所謂的有效權限範圍,就像遮罩一樣。
如果設定超出了這個範圍就會失效,例如如果peter加上了執行權限。
就會發現peter後面多了一個#effective:r--,表示peter的有效權限只有r--。
管理員可以利用 #setfacl -m m:[權限] [檔案或目錄] 進行有效權限的設定。
當系統中的使用者以及群組數量眾多,或者使用率頻繁的時候,可以以繼承的方式設定ACL。
#setfacl -m d:[u, g, o]:[使用者或群組名稱]:[權限] [檔案或目錄]。
在設定對象類型之前多加一個d,這就表示此目錄以下的檔案或目錄,會繼承此設定。
當管理員想要移除某條設定的時候,就使用-x參數,此參數不可與-m一起使用。
例如上述例子如果想把john群組移除,則輸入 #setfacl -x g:john /etc/fstab。
再用 #getfacl /etc/fstab 就會發現john群組設定已經移除了。