【Linux】Linux 文件權限與目錄配置

內容來自《鳥哥的linux私房菜》。

一、Linux 文件屬性

1.1、用戶和組

Linux 系統中的目錄和文件的訪問身份分為 user,group, others 分別簡寫為 u, g , o 。

  • user:文件的所有者
  • group:文件所有者所在組
  • others :不在所有者的所在組的其他用戶
  • all:代表所有用戶, 簡寫為 a

每個身份對文件的權限又分為 : read , write , execute, 分別簡寫為 : r,w ,x, 數字表示分別為 : 4, 2, 1

image

1.2、文件詳細信息

Linux 文件或目錄的屬性主要包括:文件或目錄的節點、種類、權限模式、鏈接數量、所歸屬的用戶和用戶組、最近訪問或修改的時間等內容。

ls -al 查看文件詳細信息:

drwxr-xr-x 5 root root 4096 Apr 23 14:49 .
drwxr-xr-x 18 root root 4096 Apr 28 16:36 ..
drwxr-xr-x 4 root root 4096 Apr 23 14:49 master
drwxr-xr-x 3 root root 4096 Apr 23 14:49 spark1
drwxr-xr-x 3 root root 4096 Apr 23 14:49 spark2

1.2.1、第一欄:類型與權限

image

第一個字符代表這個文件的類型(如目錄、文件或鏈接文件等等):

  • 當為[ d ]則是目錄
  • 當為[ - ]則是文件
  • 若是[ l ]則表示為鏈接文件(link file)
  • 若是[ b ]則表示為裝置文件里面的可供儲存的接口設備(可隨機存取裝置)
  • 若是[ c ]則表示為裝置文件里面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)

接下來的字符中,以三個為一組,且均為『rwx』 的三個參數的組合:

  • [ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute) ,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。
  • 第一組為『文件擁有者的權限,第二組為『同群組的權限』,第三組為『其他非本群組的權限』。

1.2.2、第二欄:多少檔名連結到此節點(i-node)

每個文件都會將他的權限與屬性記錄到文件系統的 i-node 中,不過,我們使用的目錄樹卻是使用文件名來記錄, 因此每個文件名就會鏈接到一個 i-node。這個屬性記錄的,就是有多少不同的文件名鏈接到相同的一個 i-node 號碼。

1.2.3、第三欄:文件(或目錄)的擁有者

1.2.4、第四欄:文件的所屬群組

1.2.5、第五欄:文件的容量大小(默認單位為 bytes )

1.2.6、第六欄:文件的建檔日期或者是最近的修改日期

1.2.7、第七欄:文件的全路徑及其文件名

這個字段就是檔名。 比較特殊的是:如果檔名之前多一個“.” ,則代表這個文件為隱藏檔。

二、修改文件屬性和權限

2.1、chgrp :改變文件所屬群組

chgrp [-R] dirname/filename ...

選項與參數:
-R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件、目錄
都更新成為這個群組之意。常常用在變更某一目錄內所有的文件之情況。

范例:
chgrp users initial-setup-ks.cfg

2.2、chown :改變文件擁有者

chown [-R] 帳號名稱 文件或目錄

選項與參數:
-R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件都變更

范例:將 initial-setup-ks.cfg 的擁有者改為bin這個帳號:
chown bin initial-setup-ks.cfg

2.3、chmod :改變文件的權限

權限的設置方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。

2.3.1、數字類型改變文件權限

Linux文件的基本權限就有九個,分別是 owner/group/others 三種身份各有自己的
read/write/execute 權限。

各權限的分數對照表如下:

r:4 > w:2 > x:1

每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為: [-rwxrwx---] 分數則是:

owner = rwx = 4+2+1 = 7 > group = rwx = 4+2+1 = 7 > others= --- = 0+0+0 = 0

變更權限的指令 chmo的語法是這樣的:

chmod [-R] xyz 文件或目錄

選項與參數:
xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
-R : 進行遞回(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更

2.3.2、符號類型改變文件權限

基本上就九個權限分別是(1)user (2)group (3)others 三種身份。那么就可以借由 u, g, o 來代表三種身份的權限!此外, a 則代表 all 亦即全部的身份!

可以使用下面的方式來看:

| chmod | u g o a | +(加入) -(除去) =(設置) | r w x | 文件或目錄 |

chmod u=rwx,go=rx .bashrc

那個 u=rwx,go=rx 是連在一起的,中間并沒有任何空白字符!

如果是要將權限去掉而不更動其他已存在的權限,例如要拿掉全部人的可執行權
限,則:

 chmod a-x .bashrc

三、Linux 文件種類與擴展名

3.1、文件種類

3.1.1、正規文件(regular file )

ls -al 所顯示出來的屬性方面,第一個字符為 [ - ]。

可以分為:

  • 純文本文件(ASCII):這是 Linux 系統中最多的一種文件類型, 稱為純文本文件,內容為我們人類可以直接讀到的數據,例如數字、字母等等。
  • 二進制檔(binary):Linux當中的可可執行文件。
  • 數據格式文件(data):有些程序在運行的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,Linux 在使用者登陸時,都會將登錄的數據記錄在 /var/log/wtmp 那個文件內,該文件是一個 data file,他能夠通過 last 這個指令讀出來! 但是使用cat時,會讀出亂碼。

3.1.2、目錄(directory)

目錄,第一個屬性為 [ d ]。

3.1.3、鏈接文件(link)

第一個屬性為 [ l ]。

就是類似 Windows 系統下面的快捷方式!

3.1.4、設備與設備文件(device)

與系統周邊及儲存等相關的一些文件, 通常都集中在 /dev 這個目錄之下!通常又分為兩種:

  • 區塊(block)設備文件 :就是一些儲存數據, 以提供系統隨機存取的周邊設備,舉例來說,硬盤與軟盤等就是。第一個屬性為[ b ]。
  • 字符(character)設備文件:亦即是一些序列埠的周邊設備, 例如鍵盤、鼠標等等!這些設備的特色就是“一次性讀取”的,不能夠截斷輸出。 第一個屬性為 [ c ]。

3.1.5、數據接口文件(sockets)

第一個屬性為 [ s ]。

這種類型的文件通常被用在網絡上的數據承接。可以啟動一個程序來監聽用戶端的要求, 而用戶端就可以通過這個 socket 來進行數據的溝通了。 最常在 /run 或 /tmp 這些個目錄中看到這種文件類型了。

3.1.6、數據輸送檔(FIFO, pipe)

第一個屬性為[p]

FIFO也是一種特殊的文件類型,主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。 FIFO 是 first-in-first-out 的縮寫。

四、Linux 目錄配置

根據 FHS(Filesystem Hierarchy Standard )的標準文件指出每個特定的目錄下應該要放置什么樣子的數據。

FHS 依據文件系統使用的頻繁與否與是否允許使用者隨意更動, 而將目錄定義成為四種交互作用的形態:

  • 可分享的:可以分享給其他系統掛載使用的目錄,所以包括可執行文件與使用者的郵件等數據, 是能夠分享給網絡上其他主機掛載用的目錄。
  • 不可分享的:自己機器上面運行的設備文件或者是與程序有關的socket文件等, 由于僅與自身機器有關,所以當然就不適合分享給其他主機了。
  • 不變的:有些數據是不會經常變動的,跟隨著distribution而不變動。 例如函數庫、文件說明文檔、系統管理員所管理的主機服務配置文件等等。
  • 可變動的:經常改變的數據,例如登錄文件、一般用戶可自行收受的新聞群組等。

事實上,FHS 針對目錄樹架構僅定義出三層目錄下面應該放置什么數據而已,分別是下面這三個目錄的定義:

  • / (root, 根目錄):與開機系統有關
  • /usr (unix software resource):與軟件安裝/執行有關
  • /var (variable):與系統運行過程有關

4.1、根目錄 (/) 的意義與內容

根目錄是整個系統最重要的一個目錄,因為不但所有的目錄都是由根目錄衍生出來的,同時根目錄也與開機/還原/系統修復等動作有關。 由于系統開機時需要特定的開機軟件、核心文件、開機所需程序、函數庫等等文件數據,若系統出現錯誤時,根目錄也必須要包含有能夠修復文件系統的程序才行。 因為根目錄是這么的重要,所以在FHS的要求方面,他希望根目錄不要放在非常大的分區內, 因為越大的分區你會放入越多的數據,如此一來根目錄所在分區就可能會有較多發生錯誤的機會。

FHS 標準建議:根目錄(/)所在分區應該越小越好, 且應用程序所安裝的軟件最好不要與根目錄放在同一個分區內,保持根目錄越小越好。 如此不但性能較佳,根目錄所在的文件系統也較不容易發生問題。

鑒于上述的說明,因此 FHS 定義出根目錄(/)底下應該要有底下這些次目錄的存在才好:

目錄 應放置文件內容
/bin 系統有很多放置執行文件的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。 在/bin底下的指令可以被root與一般賬號所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot 這個目錄主要在放置開機會使用到的文件,包括Linux核心文件以及開機選單與開機所需配置文件等等。 Linux kernel常用的檔名為:vmlinuz,如果使用的是grub這個開機管理程序, 則還會存在/boot/grub/這個目錄喔!
/dev 在Linux系統上,任何裝置與接口設備都是以文件的型態存在于這個目錄當中的。 你只要透過存取這個目錄底下的某個文件,就等于存取某個裝置啰~ 比要重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/lp, /dev/hd, /dev/sd*等等
/etc 系統主要的配置文件幾乎都放置在這個目錄內,例如人員的賬號密碼文件、 各種服務的啟始檔等等。一般來說,這個目錄下的各文件屬性是可以讓一般使用者查閱的, 但是只有root有權力修改。FHS建議不要放置可執行文件(binary)在這個目錄中喔。比較重要的文件有: /etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/ 等等。另外,其下重要的目錄有: /etc/init.d/:所有服務的預設啟動 script 都是放在這里的,例如要啟動或者關閉 iptables 的話:『 /etc/init.d/iptables start』、『/etc/init.d/iptables stop』 /etc/xinetd.d/:這就是所謂的super daemon管理的各項服務的配置文件目錄。 /etc/X11/:與 X Window 有關的各種配置文件都在這里,尤其是 xorg.conf 這個 X Server 的配置文件。
/home 這是系統默認的用戶家目錄(home directory)。在你新增一個一般使用者賬號時, 默認的用戶家目錄都會規范到這里來。比較重要的是,家目錄有兩種代號喔: ~:代表目前這個用戶的家目錄,而 ~dmtsai :則代表 dmtsai 的家目錄!
/lib 系統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫, 以及在/bin或/sbin底下的指令會呼叫的函式庫而已。 什么是函式庫呢?妳可以將他想成是『外掛』,某些指令必須要有這些『外掛』才能夠順利完成程序的執行之意。 尤其重要的是/lib/modules/這個目錄, 因為該目錄會放置核心相關的模塊(驅動程序)喔!
/media media是『媒體』的英文,顧名思義,這個/media底下放置的就是可移除的裝置啦! 包括軟盤、光盤、DVD等等裝置都暫時掛載于此。常見的檔名有:/media/floppy, /media/cdrom等等。
/mnt 如果妳想要暫時掛載某些額外的裝置,一般建議妳可以放置到這個目錄中。 在古早時候,這個目錄的用途與/media相同啦!只是有了/media之后,這個目錄就用來暫時掛載用了。
/opt 這個是給第三方協力軟件放置的目錄。什么是第三方協力軟件啊? 舉例來說,KDE這個桌面管理系統是一個獨立的計劃,不過他可以安裝到Linux系統中,因此KDE的軟件就建議放置到此目錄下了。 另外,如果妳想要自行安裝額外的軟件(非原本的distribution提供的),那么也能夠將你的軟件安裝到這里來。 不過,以前的Linux系統中,我們還是習慣放置在/usr/local目錄下呢!
/root 系統管理員(root)的家目錄。之所以放在這里,是因為如果進入單人維護模式而僅掛載根目錄時, 該目錄就能夠擁有root的家目錄,所以我們會希望root的家目錄與根目錄放置在同一個分割槽中。
/sbin Linux有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來『設定』系統,其他用戶最多只能用來『查詢』而已。 放在/sbin底下的為開機過程中所需要的,里面包括了開機、修復、還原系統所需要的指令。 至于某些服務器軟件程序,一般則放置到/usr/sbin/當中。至于本機自行安裝的軟件所產生的系統執行文件(system binary), 則放置到/usr/local/sbin/當中了。常見的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。
/srv srv可以視為『service』的縮寫,是一些網絡服務啟動之后,這些服務所需要取用的數據目錄。 常見的服務例如WWW, FTP等等。舉例來說,WWW服務器需要的網頁數據就可以放置在/srv/www/里面。
/tmp 這是讓一般使用者或者是正在執行的程序暫時放置文件的地方。 這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要數據不可放置在此目錄啊! 因為FHS甚至建議在開機時,應該要將/tmp下的數據都刪除唷!

底下是幾個在 Linux 當中也是非常重要的目錄:

目錄 應放置文件內容
/lost+found 這個目錄是使用標準的ext2/ext3文件系統格式才會產生的一個目錄,目的在于當文件系統發生錯誤時, 將一些遺失的片段放置到這個目錄下。這個目錄通常會在分割槽的最頂層存在, 例如你加裝一顆硬盤于/disk中,那在這個系統下就會自動產生一個這樣的目錄『/disk/lost+found』
/proc 這個目錄本身是一個『虛擬文件系統(virtual filesystem)』喔!他放置的數據都是在內存當中, 例如系統核心、行程信息(process)、周邊裝置的狀態及網絡狀態等等。因為這個目錄下的數據都是在內存當中, 所以本身不占任何硬盤空間啊!比較重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。
/sys 這個目錄其實跟/proc非常類似,也是一個虛擬的文件系統,主要也是記錄與核心相關的信息。 包括目前已加載的核心模塊與核心偵測到的硬件裝置信息等等。這個目錄同樣不占硬盤容量喔!

根目錄與開機有關,開機過程中僅有根目錄會被掛載, 其他分割槽則是在開機完成之后才會持續的進行掛載的行為。就是因為如此,因此根目錄下與開機過程有關的目錄, 就不能夠與根目錄放到不同的分割槽去!那哪些目錄不可與根目錄分開呢?有底下這些:

  • /etc:配置文件
  • /bin:重要執行檔
  • /dev:所需要的裝置文件
  • /lib:執行檔所需的函式庫與核心所需的模塊
  • /sbin:重要的系統執行文件

這五個目錄千萬不可與根目錄分開在不同的分割槽!

4.2、/usr 的意義與內容

/usr 里面放置的數據屬于可分享的與不可變動的(shareable, static),/usr 可以分享給區域網絡內的其他主機來使用。

usr 是 Unix Software Resource 的縮寫, 也就是『Unix操作系統軟件資源』。

FHS建議所有軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟件自己獨立的目錄。

因為是所有系統默認的軟件(distribution發布者提供的軟件)都會放置到/usr底下,因此這個目錄有點類似 Windows 系統的『C:\Windows\ + C:\Program files\』這兩個目錄的綜合體。

/usr的次目錄建議有底下這些:

目錄 應放置文件內容
/usr/X11R6/ 為X Window System重要數據所放置的目錄,之所以取名為X11R6是因為最后的X版本為第11版,且該版的第6次釋出之意。
/usr/bin/ 絕大部分的用戶可使用指令都放在這里!請注意到他與/bin的不同之處。(是否與開機過程有關)
/usr/include/ c/c++等程序語言的檔頭(header)與包含檔(include)放置處,當我們以tarball方式 (*.tar.gz 的方式安裝軟件)安裝某些數據時,會使用到里頭的許多包含檔喔!
/usr/lib/ 包含各應用軟件的函式庫、目標文件(object file),以及不被一般使用者慣用的執行檔或腳本(script)。 某些軟件會提供一些特殊的指令來進行服務器的設定,這些指令也不會經常被系統管理員操作, 那就會被擺放到這個目錄下啦。要注意的是,如果你使用的是X86_64的Linux系統, 那可能會有/usr/lib64/目錄產生喔!
/usr/local/ 系統管理員在本機自行安裝自己下載的軟件(非distribution默認提供者),建議安裝到此目錄, 這樣會比較便于管理。舉例來說,你的distribution提供的軟件較舊,你想安裝較新的軟件但又不想移除舊版, 此時你可以將新版軟件安裝于/usr/local/目錄下,可與原先的舊版軟件有分別啦! 你可以自行到/usr/local去看看,該目錄下也是具有bin, etc, include, lib...的次目錄喔!
/usr/sbin/ 非系統正常運作所需要的系統指令。最常見的就是某些網絡服務器軟件的服務指令(daemon)啰!
/usr/share/ 放置共享文件的地方,在這個目錄下放置的數據幾乎是不分硬件架構均可讀取的數據, 因為幾乎都是文本文件嘛!在此目錄下常見的還有這些次目錄: /usr/share/man:聯機幫助文件 /usr/share/doc:軟件雜項的文件說明 /usr/share/zoneinfo:與時區有關的時區文件
/usr/src/ 一般原始碼建議放置到這里,src有source的意思。至于核心原始碼則建議放置到/usr/src/linux/目錄下。

4.3、/var 的意義與內容

/usr是安裝時會占用較大硬盤容量的目錄,那么/var就是在系統運作后才會漸漸占用硬盤容量的目錄。 因為/var目錄主要針對常態性變動的文件,包括緩存(cache)、登錄檔(log file)以及某些軟件運作所產生的文件, 包括程序文件(lock file, run file),或者例如MySQL數據庫的文件等等。常見的次目錄有:

目錄 應放置文件內容
/var/cache/ 應用程序本身運作過程中會產生的一些暫存檔;
/var/lib/ 程序本身執行的過程中,需要使用到的數據文件放置的目錄。在此目錄下各自的軟件應該要有各自的目錄。 舉例來說,MySQL的數據庫放置到/var/lib/mysql/而rpm的數據庫則放到/var/lib/rpm去!
/var/lock/ 某些裝置或者是文件資源一次只能被一個應用程序所使用,如果同時有兩個程序使用該裝置時, 就可能產生一些錯誤的狀況,因此就得要將該裝置上鎖(lock),以確保該裝置只會給單一軟件所使用。 舉例來說,刻錄機正在刻錄一塊光盤,你想一下,會不會有兩個人同時在使用一個刻錄機燒片? 如果兩個人同時刻錄,那片子寫入的是誰的數據?所以當第一個人在刻錄時該刻錄機就會被上鎖, 第二個人就得要該裝置被解除鎖定(就是前一個人用完了)才能夠繼續使用啰。
/var/log/ 重要到不行!這是登錄文件放置的目錄!里面比較重要的文件如/var/log/messages, /var/log/wtmp(記錄登入者的信息)等。
/var/mail/ 放置個人電子郵件信箱的目錄,不過這個目錄也被放置到/var/spool/mail/目錄中! 通常這兩個目錄是互為鏈接文件啦!
/var/run/ 某些程序或者是服務啟動后,會將他們的PID放置在這個目錄下喔! 至于PID的意義我們會在后續章節提到的。
/var/spool/ 這個目錄通常放置一些隊列數據,所謂的『隊列』就是排隊等待其他程序使用的數據啦! 這些數據被使用后通常都會被刪除。舉例來說,系統收到新信會放置到/var/spool/mail/中, 但使用者收下該信件后該封信原則上就會被刪除。信件如果暫時寄不出去會被放到/var/spool/mqueue/中, 等到被送出后就被刪除。如果是工作排程數據(crontab),就會被放置到/var/spool/cron/目錄中!
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容