|
最近更新日期:2005/08/05
本文已不再維護,更新文章請參考此處
Linux 最優秀的地方之一,就在於他的多人多工的環境。
而為了讓各個使用者具有較安全的管理機制,因此檔案的權限管理就變的很重要了。
Linux 一般將檔案可存取的方式分為三個類別,分別是 owner/group/other,
且各有 read/write/execute 等權限。若管理得當,將會讓您的 Linux 主機變的較為安全。
另外,您如果首次接觸 Linux 的話,那麼,
在 Linux 底下這麼多的目錄/檔案,到底代表什麼意義呢?
底下我們就來一一介紹呢!
|
使用者與群組
經過前面一章的洗禮之後,您應該可以在 Linux 的指令列模式底下輸入指令了吧?!
呵呵!接下來,當然是要讓您好好的瀏覽一下 Linux 系統裡面有哪些重要的檔案囉。
不過,每個檔案都有相當多的屬性,其中最重要的可能就是檔案的擁有者的概念了。
所以,在開始檔案相關資訊的介紹前,鳥哥先就簡單的使用者及群組的概念作個說明吧∼
好讓您快點進入狀況的哩! ^_^
檔案擁有者
初次接觸 Linux 的朋友大概會覺得很怪異,怎麼『Linux
有這麼多使用者,還分什麼群組,有什麼用?』。
這個『使用者與群組』的功能可是相當健全而好用的一個安全防護呢!怎麼說呢?
由於 Linux 是個多人多工的系統 ( 已經提過若干次囉!
),因此可能常常會有多人同時使用這部主機來進行工作的情況發生,
為了考慮每個人的隱私權以及每個人的喜好的工作環境,
因此,這個『檔案擁有者』的角色就顯的相當的重要了!
例如當你將你的 e-mail
情書轉存成檔案之後,放在您自己的家目錄,您總不希望被其他人看見自己的情書吧?
這個時候,你就把該檔案設定成『只有檔案擁有者,就是我,才能看與修改這個檔案的內容』,
那麼即使其他人知道你有這個相當『有趣』的檔案,不過由於您有設定適當的權限,
所以其他人自然也就無法知道該檔案的內容囉!
群組概念
那麼群組呢?為何要設定檔案還有所屬的群組?其實,
群組最簡單的功能之一,就是當您在團隊開發資源的時候最有用啦!
舉個例子來說好了,假如在我的主機上面有兩個團體,這第一個團體名稱為
testgroup 而他的成員是 test1, test2, test3 三個,第二個團體名稱為 treatgoup
他的團員為 treat1, treat2, treat3,這兩個團體之間是互相有競爭性質的,
但是卻又要繳交同一份報告,然而每組團員又需要同時可以修改自己的團體內任何人所建立的檔案,
且不能讓非自己團體的其他人看到自己的檔案內容!這個時候怎麼辦?
呵呵!在 Linux 底下可就很簡單啦!我可以經由簡易的檔案權限設定,就能限制非自己團隊(
亦即是群組囉 )的其他人不能夠閱覽內容囉!而且亦可以讓自己的團隊成員可以修改我所建立的檔案!
同時,如果我自己還有私人隱密的文件,仍然可以設定成讓自己的團隊成員也看不到我的檔案資料。
很方便吧!
另外,如果 teacher 這個帳號是 testgroup 與 treatgroup 這兩個群組的老師,
他想要同時觀察兩者的進度,因此需要兩邊的群組都能夠進去觀看,這個時候,您可以設定
teacher 這個帳號,『同時支援 testgroup 與 treatgroup 這兩個群組!』,也就是說,
每個人都可以有多個群組的支援呢!
這樣說或許你還不容易理解這個使用者與群組的關係吧?沒關係,我們可以使用目前『家庭』的觀念來進行解說喔!
假設有一家人,家裡只有三兄弟,分別是王大毛、王二毛與王三毛三個人,
而這個家庭是登記在王大毛的名下的!所以,『王大毛家有三個人,分別是王大毛、王二毛與王三毛』,
而且這三個人都有自己的房間,並且共同擁有一個客廳喔!
- 由於王家三個人各自擁有自己的房間,所以,王二毛雖然可以進入王三毛的房間,
但是二毛不能翻三毛的抽屜喔!那樣會被三毛
K 的!因為抽屜裡面可能有三毛自己私人的東西,例如情書啦,日記啦等等的,
這是『私人的空間』,所以當然不能讓二毛拿囉!
- 由於共同擁有客廳,所以王家三兄弟可以在客廳打開電視機啦、翻閱報紙啦、坐在沙發上面發呆啦等等的!
反正,只要是在客廳的玩意兒,三兄弟都可以使用喔!因為大家都是一家人嘛!
這樣說來應該有點曉得了喔!那個『王大毛家』就是所謂的『群組』囉,
至於三兄弟就是分別為三個『使用者』,而這三個使用者是在同一個群組裡面的喔!
而三個使用者雖然在同一群組內,但是我們可以設定『權限』,
好讓某些使用者個人的資訊不被群組的所有人查詢,以保有個人『私人的空間』啦!
而設定群組共享,則可讓大家共同分享喔!
其他人的概念
好了,那麼今天又有個人,叫做張小豬,他是張小豬家的人,與王家沒有關係啦!
這個時候,除非王家認識張小豬,然後開門讓張小豬進來王家,否則張小豬永遠沒有辦法進入王家,
更不要說進到王三毛的房間啦!不過,如果張小豬透過關係認識了三毛,並且跟王三毛成為好朋友,
那麼張小豬就可以透過三毛進入王家啦!呵呵!沒錯!那個張小豬就是所謂的『其他人,
Others 』囉!
因此,我們就可以知道啦,在 Linux 裡面,任何一個檔案都具有『User,
Group 及 Others』三個權限!我們可以將上面的說明以底下的圖示來解釋:
圖一、每個檔案的擁有者、群組與其他人的示意圖
此時,以王三毛為例,王三毛這個『檔案』的擁有者為王三毛,他屬於王大毛這個群組,
而張小豬相對於王三毛,則只是一個『其他人(others)』而已。
不過,這裡有個特殊的人物要來介紹的,那就是『萬能的天神』!這個天神具有無限的神力,
所以他可以到達任何他想要去的地方,呵呵!那個人在
Linux 系統中的身份代號是『 root 』啦!所以要小心喔! 那個
root 可是『萬能的天神』喔!
無論如何,『使用者身份』,與該使用者所支援的『群組』概念,在 Linux
的世界裡面是相當的重要的,他可以幫助您讓您的多工 Linux 環境變的更容易管理!更詳細的
『身份與群組』 設定,我們將在 帳號管理
再進行解說。底下我們將針對檔案系統與檔案權限來進行說明。
Linux 使用者身份與群組記錄的檔案
在我們 Linux 系統當中,預設的情況下,所有的系統上的帳號與一般身份使用者,還有那個 root
的相關資訊,都是記錄在 /etc/passwd 這個檔案內的。至於密碼則是記錄在 /etc/shadow 這個檔案下。
此外, Linux 所有的群組名稱都紀錄在 /etc/group 內!這三個檔案可以說是
Linux 系統裡面帳號、密碼、群組資訊的集中地囉!不要隨便刪除這三個檔案啊! ^_^
至於更多的與帳號群組有關的設定,還有這三個檔案的格式,不要急,我們在第四篇講到帳號時,
會再跟大家詳細的介紹的!這裡先有概念即可。
Linux 檔案權限概念
大致瞭解了 Linux 的使用者與群組之後,接著下來,我們要來談一談,
那麼這個檔案的權限要如何針對這些所謂的『使用者』與『群組』來設定該檔案的權限呢?
這個部分是相當的重要的,尤其對於初學者來說,因為檔案的權限與屬性是學習
Linux 的一個相當重要的關卡,如果沒有這部份的概念,那麼您將老是聽不懂別人在講什麼呢!
尤其是當您在您的螢幕前面出現了『Permission
deny』的時候,不要擔心,『肯定是權限設定錯誤』啦!呵呵!好了,閒話不多聊,趕快來瞧一瞧先:
Linux 檔案屬性
嗯!既然要讓你瞭解 Linux 的檔案屬性,那麼有個重要的也是常用的指令就必須要先跟你說囉!那一個?!就是『
ls 』這一個 list 檔案的指令囉!在你以 root
的身份登入 Linux 之後,下達『ls -al 』看看,會看到底下的幾個咚咚:
[root@linux ~]# ls -al
total 248
drwxr-x--- 9 root root 4096 Jul 11 14:58 .
drwxr-xr-x 24 root root 4096 Jul 9 17:25 ..
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 13823 Jul 10 23:12 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 100 Dec 4 2004 .cshrc
drwx------ 3 root root 4096 Jun 25 08:35 .ssh
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 屬性 ][連結][擁有者][群組][檔案容量][ 修改日期 ][ 檔名 ]
|
ls 是『list』的意思,與在早期的 DOS 年代的指令 dir 類似功能。
而參數『-al』則表示列出所有的檔案 ( 包含隱藏檔,就是檔名前面第一個字元為 . 的那種檔案 )
。如上所示,在你第一次以 root 身份登入 Linux 時,如果你輸入指令後,應該有上列的幾個東西,
先解釋一下上面七個欄位個別的意思:
圖二、檔案屬性的示意圖
- 第一欄代表這個檔案的屬性:
這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個屬性:
圖三、檔案的十個屬性內容
- 第一個屬性代表這個檔案是『目錄、檔案或連結檔等等』:
- 當為[ d ]則是目錄,例如上表的第 11 行;
- 當為[ - ]則是檔案,例如上表的第 5 行;
- 若是[ l ]則表示為連結檔(link file);
- 若是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備;
- 若是[ c ]則表示為裝置檔裡面的序列埠設備,例如鍵盤、滑鼠。
- 接下來的屬性中,三個為一組,且均為『rwx』
的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute):
- 第一組為『擁有人的權限』,以第 5
行為例,該檔案的擁有人可以讀寫,但不可執行;
- 第二組為『同群組的權限』;
- 第三組為『其他非本群組的權限』。
範例:若有一個檔案的屬性為『-rwxr-xr--』,簡單的可由下面說明之:
[-][rwx][r-x][r--]
1 234 567 890
1 為:代表這個檔名為目錄或檔案(上面為檔案)
234為:擁有人的權限(上面為可讀、可寫、可執行)
567為:同群組使用者權限(上面為可讀可執行)
890為:其他使用者權限(上面為僅可讀)
上面的屬性情況代表一個檔案、這個檔案的擁有人可讀可寫可執行、但同群組的人僅可讀與執行,
非同群組的使用者僅可讀的意思!
除此之外,需要特別留意的是 x 這個標號!
若檔名為一個目錄的時候,例如上表中的 .ssh 這個目錄:
drwx------ 3 root root 4096 Jun 25 08:35 .ssh
|
可以看到這是一個目錄,而且只有 root 可以讀寫與執行。但是若為底下的樣式時,請問非 root
的其他人是否可以進入該目錄呢?
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh
|
咦!似乎好像是可以喔!因為有可讀[ r ]存在嘛!『錯!』答案是非 root
這個帳號的其他使用者均不可進入 .ssh 這個目錄,為什麼呢?
因為 x 與 目錄 的關係相當的重要,
如果您在該目錄底下不能執行任何指令的話,那麼自然也就無法進入了,因此,
請特別留意的是,如果您想要開放某個目錄讓一些人進來的話,
請記得將該目錄的 x 屬性給開放呦!至於目錄的權限相關說明,
我們會在底下繼續介紹的。
另外,你也必須要更加的小心的是,在 Windows
底下一個檔案是否具有執行的能力是藉由『 附檔名 』來判斷的,
例如:.exe, .bat, .com 等等,但是在 Linux 底下,
我們的檔案是否能執行,則是藉由是否具有
x 這個屬性來決定的!所以,跟檔名是沒有絕對的關係的!
這點還請特別留意呢!稍後我們還會針對目錄來稍作說明的
- 第二欄表示為連結佔用的節點 (i-node):
這個跟連結檔 (link file) 比較有關係,我們在未來的章節會再加以介紹的。
如果是目錄的話,那麼就與該目錄下還有多少目錄有關。
- 第三欄表示這個檔案(或目錄)的『擁有人』。
- 第四欄表示擁有人的群組。
這裡再次解釋一下,在 Linux 中,你的 ID ( 如 root 或 test 等帳號均是所謂的
ID ) 即是你的身份,而且你還可以附屬在一個或多個群組之下,例如剛剛我們上面提到的,你有一個團體
( 即群組 ) 代號為 testgroup ,且這個群體裡有三個人,其代號分別是 test1,
test2, 與 test3,則這三個人為同一群組即 testgroup!那麼如果以上圖的的檔案屬性(-rwxrwx---)
來看,如果該檔案屬於
test1 所有,那麼 test2, test3 亦有讀、寫、執行的權力,因為他們都屬於同一個
group 呀!而如果您不是屬於 test1, test2, test3 的任何一個人,也不屬於 testgroup
這個群組時,那麼您將不具備讀、寫、執行這個檔案的權限了!
- 第五欄為這個檔案的容量大小。
- 第六欄為這個檔案的建檔日期或者是最近的修改日期,
分別為月份、日期及時間。請特別留意,如果您是以繁體中文來進行安裝您的
Linux 時,那麼預設的語系可能會被改為中文。而
由於中文無法顯示在文字型態的終端機上面,
所以這一欄會成為怪怪的亂碼,這個時候,請修改一下
/etc/sysconfig/i18n 這個檔案,裡面的『 LC_TIME 』修改為:『 LC_TIME=en
』再儲存離開,再登入一次,就可以得到英文字形顯示的日期了!
那麼如何修改該檔案呢?呵呵!以 root 身份用 vi 修改。
另外,也可以使用『 LANG=en ls -al 』之類的語法來顯示。
- 第七欄為這個檔案的檔名,
如果檔名之前多一個『 . 』,則代表這個檔案為『隱藏檔』,
例如上表第 6 行的『.bashrc_history』檔名即是隱藏檔,由於我們有下一個參數為
ls -al,所以連隱藏檔都列出來,如果你只輸入 ls 則檔名有加『 . 』的檔案就不會被顯示出來!
Tips: 對於更詳細的 ls 用法,還記得怎麼查詢嗎?對啦!使用
man ls 或 info ls 去看看他的基礎用法去!自我進修是很重要的,
因為『師傅帶進門,修行在個人!』,自古只有天才學生,沒有天才老師呦!加油吧!^_^
| |
這七個欄位的意義是很重要的!務必清楚的知道各個欄位代表的意義呢!尤其是第一個欄位的十個權限,
那是整個 Linux 檔案權限的重點之一。底下我們來做幾個簡單的練習,您就會比較清楚囉!
假設 test1, test2, test3 同屬於 testgroup 這個群組:
例題一:如果有下面的兩個檔案,請說明兩個檔案的擁有者與其相關的權限為何?
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt
-rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
答:
- 檔案『 test.txt 』的擁有人為 root ,群組為 root 。至於權限方面則只有 root
這個帳號可以存取此檔案,其他人則僅能讀此檔案;
- 另一個檔案『 ping_tsai 』的擁有人為 test1 ,而群組為 testgroup。其中,
test1 可以針對此檔案具有可讀可寫可執行的權力,而同群組的 test2, test3 兩個人與
test1 同樣是 testgroup 的群組帳號,則僅可讀可執行但不能寫 (亦即不能修改),至於非
testgoup 這一個群組的人則僅可以讀,不能寫也不能執行!
|
例題二:如果我的目錄為底下的樣式,請問 testgroup 這個群組的成員與其他人( others )是否可以進入本目錄?
drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
答:
- 檔案擁有者 test1 可以在本目錄中進行任何工作;
- 而 testgroup 這個群組的帳號,例如 test2, test3 亦可以進入本目錄進行工作,
但是不能在本目錄下進行寫入的動作;
- 至於 other 的權限中雖然有 r ,但是由於沒有 x 的權限,因此 others 的使用者,並不能進入此目錄!
|
Linux 檔案屬性的重要性:
與 Windows 系統不一樣的是,在 Linux 系統(或者說 Unix-Like
系統)當中,每一個檔案都多加了很多的屬性進來,尤其是群組的概念,這樣有什麼用途呢?
基本上,最大的用途是在『安全性』上面的。舉個簡單的例子,在你的系統中,關於系統服務的檔案通常只有
root 才能讀寫,或者是執行,例如 /etc/shadow
這一個帳號管理的檔案,由於該檔案記錄了你的系統中的所有帳號的資料,因此是很重要的一個資訊檔,
當然不能讓任何人讀取,只有
root 才能夠來讀取囉!所以該檔案的屬性就會成為 [ -rw-------
]囉!
那麼,如果你有一個開發團隊,在你的團隊中,你希望每個人都可以使用某一些目錄下的檔案,
而非你的團隊的其他人則不予以開放呢?以上面的例子來說,testgroup
的團隊共有三個人,分別是 test1, test2, test3 !那麼我就可以將 test1 的檔案屬性訂為
[ -rwxrwx--- ] 來提供給
testgroup 的工作團隊使用囉!這可是相當重要的。
再舉個例子來說,如果你的目錄權限沒有作好的話,可能造成其他人都可以在你的系統上面亂搞囉!例如本來只有
root 才能做的開關機、ADSL
的撥接程式、新增或刪除使用者等等的指令,若被你改成任何人都可以執行的話,
那麼如果使用者不小心給你重新開機啦!重新撥接啦!等等的!那麼你的系統不就會常常莫名其妙的掛掉囉!
而且萬一你的使用者的密碼被其他不明人士取得的話,只要他登入你的系統就可以輕而易舉的執行一些
root 的工作!可怕吧!因此,在你修改你的 linux 檔案與目錄的屬性之前,
一定要先搞清楚,什麼是可變的,什麼是不可變的!千萬注意囉!
如何改變檔案權限
好了,我們已經知道檔案權限對於一個系統的安全重要性了,也知道檔案的權限對於使用者與群組的相關性了,
好了,那麼如何修改一個檔案的權限呢?又!有多少檔案的權限我們可以修改呢?
其實一個檔案的權限很多嘛!大致上我們先介紹幾個簡單的,例如:群組、擁有者、各種身份的權限等等。
- chgrp :改變檔案所屬群組
- chown :改變檔案所屬人
- chmod :改變檔案的屬性、 SUID 、等等的特性
改變所屬群組, chgrp
改變一個檔案的群組真是很簡單的,直接以 chgrp 來改變即可,咦!這個指令就是
change group 的縮寫嘛!對啦!這樣就很好記了吧! ^_^。不過,請記得,
要改變成為的群組名稱必須要在 /etc/group
裡面存在的名稱才行,否則就會顯示錯誤!
假設您是以 root 的身份登入 FC4 ,那麼在您的家目錄內有一個 install.log 的檔案,
如何將該檔案的群組改變一下呢?假設您已經知道在 /etc/group 裡面已經存在一個名為 users
的群組,但是 testing 這個群組名字就不存在 /etc/group 當中了,
此時改變群組成為 users 與 testing 會有什麼現象發生呢?
[root@linux ~]# chgrp [-R] dirname/filename ...
參數:
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
都更新成為這個群組之意。常常用在變更某一目錄的情況。
範例:
[root@linux ~]# chgrp users install.log
[root@linux ~]# ls -l
-rw-r--r-- 1 root users 68495 Jun 25 08:53 install.log
[root@linux ~]# chgrp testing install.log
chgrp: invalid group name `testing' <== 發生錯誤訊息囉∼找不到這個群組名∼
|
發現了嗎?檔案的群組被改成 users 了,但是要改成 testing 的時候,
就會發生錯誤∼注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好!
改變檔案擁有者, chown
好了,那麼如何改變一個檔案的擁有者呢?很簡單呀!既然改變群組是 change group
,那麼改變擁有者就是 change owner 囉!BINGO,對啦!那就是 chown
這個指令的用途,要注意的是,使用者必須是已經存在系統中的,也就是在
/etc/passwd 這個檔案中有紀錄的使用者名稱才行改變。
chown 的用途還滿多的,他還可以順便直接修改群組的名稱呢!此外,
如果要連目錄下的所有次目錄或檔案同時更改檔案擁有者的話,直接加上
-R 的參數即可!我們來看看語法與範例:
[root@linux ~]# chown [-R] 帳號名稱 檔案或目錄
[root@linux ~]# chown [-R] 帳號名稱:群組名稱 檔案或目錄
參數:
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
都更新成為這個群組之意。常常用在變更某一目錄的情況。
範例:
[root@linux ~]# chown bin install.log
[root@linux ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log
[root@linux ~]# chown root:root install.log
[root@linux ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
|
嗯!知道如何改變檔案的群組與擁有者了,那麼什麼時候要使用 chown 或 chgrp
呢?!或許您會覺得奇怪吧?!是的,確實有時候需要變更檔案的擁有者的,
最常見的例子就是在 copy 檔案給你之外的其他人時,我們使用最簡單的 cp 來說明好了:
[root@linux ~]# cp 來源檔案 目的檔案
|
假設您今天要將 .bashrc 這個檔案拷貝成為 .bashrc_test ,且是要給 bin 這個人,您可以這樣做:
[root@linux ~]# cp .bashrc .bashrc_test
[root@linux ~]# ls -al .bashrc*
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 395 Jul 13 11:31 .bashrc_test
|
哇!怎麼辦? .bashrc_test 還是屬於 root 所有,如此一來,即使你將檔案拿給 bin
這個使用者了,那他仍然無法修改的( 看屬性就知道了吧! ),
所以你就必須要將這個檔案的擁有者與群組修改一下囉!知道如何修改了吧!?呵呵!
改變九個屬性, chmod
檔案屬性的改變使用的是 chmod 這個指令,但是,屬性的設定方法有兩種,
分別可以使用數字或者是符號來進行屬性的變更。我們就來談一談:
數字類型改變檔案權限
Linux 檔案的基本屬性就有九個,分別是 owner/group/others 組別的 read/write/execute 屬性,
先複習一下剛剛上面提到的資料:
這九個屬性是三個三個一組的!其中,我們可以使用數字來代表各個屬性,各屬性的對照表如下:
同一組 (owner/group/others) 的三個屬性 (r/w/x) 是需要累加的,例如當屬性為
[-rwxrwx---] 則是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
所以等一下我們設定屬性的變更時,該屬性的數字就是 770 啦!變更屬性的指令 chmod 的語法是這樣的:
[root@linux ~]# chmod [-R] xyz 檔案或目錄
參數:
xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
-R : 進行遞迴( recursive )的持續變更,亦即連同次目錄下的所有檔案、目錄
都更新成為這個群組之意。常常用在變更某一目錄的情況。
|
舉例來說,如果要將 .bashrc 這個檔案所有的屬性都打開,那麼就下達:
[root@linux ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@linux ~]# chmod 777 .bashrc
[root@linux ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
|
看到了嗎?屬性改變了喔!由於一個檔案有三組屬性,所以你可以發現上面 777
為三組,而由於我們將所有的屬性都打開,所以數字都相加,亦即『
r+w+x = 4+2+1 = 7』
那如果要將屬性變成『 -rwxr-xr-- 』呢?那麼就成為
[4+2+1][4+0+1][4+0+0]=754 囉!所以你需要下達
chmod 754 filename。
最常發生的一個問題就是,常常我們以 vi 編輯一個 shell 的文字檔後,他的屬性通常是
-rw-rw-rw- 也就是 666 的屬性,如果要將他變成可執行檔,並且不要讓其他人修改此一檔案的話,
那麼就需要 -rwxr-xr-x 這一個 755 的屬性,所以
chmod 755 test.sh 就需要這樣做囉!
另外,有些檔案你不希望被其他人看到,例如 -rwxr-----,那麼就下達
chmod 740 filename 吧!
例題三:將剛剛您的 .bashrc 這個檔案的屬性改回原來的 -rw-r--r--
答:
|
符號類型改變檔案權限
還有一個改變屬性的方法呦!從之前的介紹中我們可以發現,基本上就九個屬性分別是(1)user
(2)group (3)others 三群啦!那麼我們就可以藉由 u, g, o
來代表三群的屬性!此外, a 則代表 all
亦即全部的三群!那麼讀寫的屬性就可以寫成了 r, w, x 囉!也就是可以使用底下的方式來看:
chmod | u g o a |
+(加入) -(除去) =(設定) |
r w x | 檔案或目錄 |
來實作一下吧!假如我們要『設定』一個檔案的屬性為『-rwxr-xr-x』時,基本上就是:
- user (u):具有可讀、可寫、可執行的權限;
- group 與 others (g/o):具有可讀與執行的權限。
所以就是:
[root@linux ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那個 u=rwx,go=rx 是連在一起的,中間並沒有任何空白字元!
[root@linux ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
|
請注意, u=rwx,og=rx 這一段文字之間並沒有空白字元隔開呦!不要搞錯囉!
那麼假如是『 -rwxr-xr-- 』?可以使用『 chmod u=rwx,g=rx,o=r filename
』來設定。此外,如果我不知道原先的檔案屬性,而我只想要增加 .bashrc
這個檔案的每個人均可寫入的權限,那麼我就可以使用:
[root@linux ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
[root@linux ~]# chmod a+w .bashrc
[root@linux ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
|
而如果是要將屬性去掉而不更動其他的屬性呢?!例如要拿掉所有人的 x 的屬性,則:
[root@linux ~]# chmod a-x .bashrc
[root@linux ~]# ls -al .bashrc
-rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc
|
知道 +, -, = 的不同點了嗎?對啦! + 與 – 的狀態下,只要是沒有指定到的項目,
則該屬性『不會被變動』,例如上面的例子中,由於僅以
– 拿掉 x 則其他兩個保持當時的值不變!呵呵!多多實作一下,你就會知道如何改變屬性囉!
這在某些情況底下很好用的∼舉例來說,您想要教一個朋友如何讓一個程式可以擁有執行的權限,
但您又不知道該檔案原本的權限為何,此時,利用 chmod a+x filename ,就可以讓該程式擁有執行的權限了。
是否很方便?
目錄屬性的意義:
剛剛上面我們提到的屬性幾乎都是針對一般檔案的特性在說明,那麼如果是針對目錄時,
那個 r, w, x 對目錄是什麼意義呢?簡單的說:
- r (read contents in directory):
表示具有讀取目錄結構清單的權限,所以當您具有讀取 (r) 一個目錄的權限時,
您就可以利用 ls 這個指令將該目錄的內容列表顯示出來!
- w (modify contents of directory):
這個可寫入的權限對目錄來說,是很了不起的!
因為他表示您將具有異動該目錄結構清單的權限,也就是底下這些權限:
- 建立新的檔案與目錄;
- 刪除已經存在的檔案與目錄(不論該檔案是屬於誰的!)
- 將已存在的檔案或目錄進行更名;
- 搬移該目錄內的檔案、目錄位置。
所以說,如果您是一般身份使用者,例如鳥哥的帳號 dmtsai ,那麼在 /home/dmtsai 這個家目錄內,
無論是誰 (包括 root) 建立的檔案,無論該檔案屬於誰,無論該檔案的屬性是什麼,
dmtsai 這個使用者都『有權力將該檔案刪除』的喔!
- x (access directory):
這個在上頭我們已經稍微提過了,這個 x 與能否進入該目錄有關呢!
好了,那麼我們來簡單的做個測試看看,底下可能會有很多您沒有見過的指令,
不要擔心,先照著作看看,等到未來提到該指令時,您自然就會瞭解了。
[root@linux ~]# cd /tmp
[root@linux tmp]# mkdir testing
[root@linux tmp]# chmod 744 testing
[root@linux tmp]# touch testing/testing
[root@linux tmp]# chmod 600 testing/testing
# 這個 mkdir 是在建立目錄用的指令!是 make directory 的縮寫。
# 我們用 root 的身份在 /tmp 底下建立一個名為 testing 的目錄,
# 並且將該目錄的權限變為 744 ,該目錄的擁有者為 root 喔!
# 另外, touch 可以用來建立一個沒有內容的檔案,因此, touch testing/testing
# 可以建立一個空的 /tmp/testing/testing 檔案喔!
[root@linux tmp]# ls -al
drwxr--r-- 2 root root 4096 Jul 14 01:05 testing
# 仔細看一下,目錄的權限是 744 ,且所屬群組與使用者均是 root 喔!
# 接下來,我們將 root 的身份切換成為一般身份使用者。
# 鳥哥的系統裡面有個 dmtsai 的一般身份使用者帳號,所以切換身份成為 dmtsai
[root@linux tmp]# su dmtsai
# 那個 su 的指令是用來『變換身份』的一個指令,我們未來會詳細介紹。
# 注意看,底下這一行中,發現使用者變為 dmtsai 了,而且提示字元變成 $ 了!
# 也就是說,現在操作系統的人變成 dmtsai 了!那麼 dmtsai 這個人對於
# /tmp/testing 是屬於 others 的權限,那他可以對 /tmp/testing 幹嘛?
[dmtsai@linux tmp]$ ls -l testing <== 此時身份為 dmtsai
total 0
?--------- ? ? ? ? ? testing
# 可以查閱裡面的資訊喔!因為dmtsai 具有 r 的權限,不過,畢竟權限不夠,
# 很多資料竟然是問號 (?) 來的∼怪怪的緊∼
[dmtsai@linux tmp]$ cd testing <== 此時身份為 dmtsai
bash: cd: testing/: Permission denied
# 發現了嗎?即使我們具有 r 的權限,但是沒有 x ,所以
# dmtsai 無法進入 /tmp/testing 喔!
[dmtsai@linux tmp]$ exit
[root@linux tmp]# chown dmtsai testing
# 使用 exit 就可以離開 su 的功能了。我們將這個 testing 目錄的擁有者設定為
# dmtsai ,此時 dmtsai 就成為 owner 了,那麼這個使用者又能幹麻呢?
[root@linux tmp]# su dmtsai
[dmtsai@linux tmp]$ cd testing <== 此時身份為 dmtsai
[dmtsai@linux testing]$ ls -l <== 此時身份為 dmtsai
-rw------- 1 root root 0 Jul 14 01:13 testing
# 再切換身份成為 dmtsai ,此時就能夠進入 testing 了!查閱一下內容。
# 發現了 testing 這個檔案存在喔!權限是只有 root 才能夠存取∼
# 那我們測試一下能否刪除呢?
[dmtsai@linux testing]$ rm testing <== 此時身份為 dmtsai
rm: remove write-protected regular empty file `testing'? y
# 竟然可以刪除!這樣理解了嗎?!
|
透過上面這個簡單的步驟,您就可以清楚的知道, x 在目錄當中是與『能否進入該目錄』有關,
至於那個 w 則具有相當重要的權限,因為他可以讓使用者刪除、更新、新建檔案或目錄,
是個很重要的參數啊!這樣可以理解了嗎?! ^_^
Linux 檔案種類與附檔名
我們在學習 Linux 之前,就跟大家灌輸過一個概念,那就是,任何裝置在 Linux 底下都是檔案,
不僅如此,連資料溝通的介面也有專屬的檔案在負責∼所以,您會瞭解到, Linux 的檔案種類真的很多∼
除了前面提到的那個 -, d 亦即所謂的一般檔案與目錄檔案之外,還有哪些種類的檔案呢?
檔案種類:
我們在剛剛的屬性介紹中提到了最前面的標誌 ( d 或 - )
可以代表目錄或檔案,那就是不同的檔案種類啦!Linux 的檔案種類主要有底下這幾種:
- 正規檔案 (regular file ):
就是一般我們在進行存取的類型的檔案,在由 ls –al 所顯示出來的屬性方面,第一個屬性為
[ - ],例如 [-rwxrwxrwx ]。另外,依照檔案的內容,又大略可以分為:
- 純文字檔(ASCII):這是 Unix
系統中最多的一種檔案類型囉,稱為純文字檔是因為內容為我們人類可以直接讀到的資料,
例如數字、字母等等。幾乎只要我們可以用來做為設定的檔案都屬於這一種檔案類型。
舉例來說,您可以下達『 cat ~/.bashrc 』就可以看到該檔案的內容。
(cat 是將一個檔案內容讀出來的指令)
- 二進位檔(binary):還記得我們在『
Linux 是什麼 』那一章裡面的 GNU 發展史中提過,
我們的系統其實僅認識且可以執行二進位檔案 (binary file) 吧?沒錯∼
您的 Linux 當中的可執行檔 (scripts, 文字型批次檔不算) 就是這種格式的啦∼
舉例來說,剛剛下達的指令 cat 就是一個 binary file 。
- 資料格式檔(data):
有些程式在運作的過程當中會讀取某些特定格式的檔案,那些特定格式的檔案可以被稱為資料檔
(data file)。舉例來說,我們的 Linux 在使用者登入時,都會將登錄的資料記錄在
/var/log/wtmp 那個檔案內,該檔案是一個 data file ,他能夠透過 last 這個指令讀出來!
但是使用 cat 時,會讀出亂碼∼因為他是屬於一種特殊格式的檔案。瞭乎?
- 目錄 (directory):就是目錄囉∼第一個屬性為
[ d ],例如 [drwxrwxrwx]。
- 連結檔 (link):就是類似 Windows 底下的捷徑啦!第一個屬性為 [ l ],
例如 [lrwxrwxrwx] ;
- 設備與裝置檔 (device):與系統周邊及儲存等相關的一些檔案,
通常都集中在 /dev 這個目錄之下!通常又分為兩種:
- 區塊 (block) 設備檔 :就是一些儲存資料,
以提供系統存取的周邊設備,簡單的說就是硬碟啦!例如你的一號硬碟的代碼是
/dev/hda1 等等的檔案啦!第一個屬性為 [ b ];
- 字元 (character) 設備檔 :亦即是一些序列埠的周邊設備,
例如鍵盤、滑鼠等等!第一個屬性為 [ c ]。
- 資料接口檔 (sockets):既然被稱為資料接口檔,
想當然爾,這種類型的檔案通常被用在網路上的資料承接了。我們可以啟動一個程式來監聽用戶端的要求,
而用戶端就可以透過這個 socket 來進行資料的溝通了。第一個屬性為 [ s ],
最常在 /var/run 這個目錄中看到這種檔案類型了。
- 資料輸送檔 (FIFO, pipe):
FIFO 也是一種特殊的檔案類型,他主要的目的在解決多個程序同時存取一個檔案所造成的錯誤問題。
FIFO 是 first-in-first-out 的縮寫。第一個屬性為 [p] 。
那麼使用剛剛的『 ls -al 』這個指令,你就可以簡單的經由判斷每一個檔案的
第一個屬性來瞭解這個檔案是何種類型!很簡單吧!
除了設備檔是我們系統中很重要的檔案,最好不要隨意修改之外(通常他也不會讓你修改的啦!),
另一個比較有趣的檔案就是連結檔。如果你常常將應用程式捉到桌面來的話,你就應該知道在
Windows 底下有所謂的『 捷徑』。同樣的,你可以將
linux 下的連結檔簡單的視為一個檔案或目錄的捷徑。至於 socket 與 FIFO 檔案比較難理解,
因為這兩個咚咚與程序 (process) 比較有關係,這個等到未來您瞭解 process 之後,
再回來查閱吧!此外,也可以透過 man fifo 及 man socket 來查閱系統上的說明!
Linux 檔案附檔名:
基本上, Linux 的檔案是沒有所謂的『附檔名』的,因為由前面的說明我們可以知道,
一個 Linux 檔案能不能被執行,與他的第一欄的十個屬性有關,
與檔名根本一點關係也沒有。這個觀念跟 Windows 的情況不相同喔!在 Windows
底下,能被執行的檔案附檔名通常是 .com .exe .bat 等等,而在 Linux 底下,
只要你的屬性當中有 x 的話,例如 [ -rwx-r-xr-x ]
即代表這個檔案可以被執行喔!
不過,可以被執行跟可以執行成功是不一樣的∼舉例來說,在 root 家目錄下的 install.log
是一個純文字檔,如果經由修改權限成為 -rwxrwxrwx 後,這個檔案能夠被執行嗎?
當然不行∼因為他的內容根本就沒有可以執行的資料。所以說,這個 x 代表這個檔案具有可執行的能力,
但是能不能執行成功,當然就得要看該檔案的內容囉∼
雖然附檔名沒有什麼真的幫助,不過,由於我們仍然希望可以藉由附檔名來瞭解該檔案是什麼東西?!所以,
通常我們還是會以適當的附檔名來表示該檔案是什麼種類的。底下有數種常用的附檔名:
- *.sh : 批次檔 ( scripts ),因為批次檔為使用 shell 寫成的,所以附檔名就編成 .sh 囉;
- *Z, *.tar, *.tar.gz, *.zip, *.tgz: 經過打包的壓縮檔。這是因為壓縮軟體分別為 gunzip,
tar 等等的,由於不同的壓縮軟體,而取其相關的附檔名囉!
- *.html, *.php:網頁相關檔案,分別代表 HTML 語法與 PHP 語法的網頁檔案囉!
.html 的檔案可使用網頁瀏覽器來直接開啟,至於 .php 的檔案,
則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算後的網頁結果呢!
另外,還有程式語言如 perl 的檔案,其附檔名也可能取成
.pl 這種檔名!基本上, Linux 上面的檔名真的只是讓你瞭解該檔案可能的用途而已,
真正的執行與否仍然需要屬性的規範才行!例如雖然有一個檔案為可執行檔,如有名的代理伺服器軟體
squid ,不過,如果這個檔案的屬性被修改成無法執行時,那麼他就變成不能執行囉!
這種問題最常發生在檔案傳送的過程中。例如你在網路上下載一個可執行檔,但是偏偏在你的
Linux 系統中就是無法執行!呵呵!那麼就是可能檔案的屬性被改變了!不要懷疑,從網路上傳送到你的
Linux 系統中,檔案的屬性確實是會被改變的喔!
再提個另外!在 Linux 底下, 每一個檔案或目錄的檔名最長可以到達
255 的字元,加上完整路徑時,最長可達 4096 個字元,是相當長的檔名喔!我們希望
Linux 的檔案名稱可以一看就知道該檔案在幹嘛的,所以檔名通常是很長很長!而用慣了
Windows 的人可能會受不了,因為檔案名稱通常真的都很長,對於用慣 Windows
而導致打字速度不快的朋友來說,嗯!真的是很困擾.....不過,只得勸您好好的加強打字的訓練囉!
而由前面一章的熱鍵您也會知道,其實可以透過 [tab] 按鍵來確認檔案的檔名的!這很好用啊!
當然啦,如果您已經讀完了本書第三篇關於 BASH 的用法,那麼您將會發現
『 哇!變數真是一個相當好用的東西吶!』
嗯!看不懂,沒關係,到第三篇談到 bash 再說!
Linux 檔案名稱的限制:
由於 Linux 在文字介面下的一些指令操作關係,一般來說,您在設定 Linux 底下的檔案名稱時,
最好可以避免一些特殊字元比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
因為這些符號在文字介面下,是有特殊意義的!另外,檔案名稱的開頭為小數點『.』時,
代表這個檔案為『隱藏檔』喔!同時,由於指令下達當中,常常會使用到 -option 之類的參數,
所以您最好也避免將檔案檔名的開頭以 - 或 + 來命名啊!
Linux 目錄配置
在瞭解了每個檔案的相關種類與屬性,以及瞭解了如何更改檔案屬性的相關資訊後,再來要瞭解的就是,
為什麼每套 Linux distributions 他們的設定檔啊、執行檔啊、每個目錄內放置的咚咚啊,其實都差不多?
原來是有一套標準依據的哩!我們底下就來瞧一瞧。
Linux 目錄配置的依據 FHS
因為 Linux 的開發者實在太多了,如果每個人都發展出屬於自己的目錄配置方法,
那麼將可能會造成很多管理上的困擾。您能想像,您進入一個企業之後,所接觸到的 Linux
目錄配置方法竟然跟您以前學的完全不同嗎?!很難想像吧∼所以,後來就有所謂的
Filesystem Hierarchy Standard (FHS) 標準的出爐了!
這個 FHS ( http://www.pathname.com/fhs/ )
事實上僅是規範出在根目錄 ( / ) 底下各個主要的目錄應該是要放置什麼樣的檔案而已。
FHS 定義出兩層規範出來,第一層是 / 底下的各個目錄應該要放置什麼樣內容的檔案資料,例如 /etc 應該要放置設定檔,
/bin 與 /sbin 則應該要放置可執行檔等等。第二層則是針對 /usr 及 /var 這兩個目錄的次目錄來定義的。
例如 /var/log 放置系統登錄檔、 /usr/share 放置共享資料等等。
由於 FHS 僅是定義出最上層 (/) 及次層 (/usr, /var) 的目錄內容應該要放置的檔案資料,
因此,在其他個次目錄層級內,就可以隨開發者自行來配置了。舉例來說, FC4 的網路設定資料放在
/etc/sysconfig/network-script/ 目錄下,但是 SuSE Server 9 則是將網路放置在
/etc/sysconfig/network/ 目錄下,目錄名稱可是不同的呢!
另外,在 Linux 底下,所有的檔案與目錄都是由根目錄 / 開始的!那是所有目錄與檔案的源頭∼
然後再一個一個的分支下來,有點像是樹枝狀啊∼因此,我們也稱這種目錄配置方式為:『目錄樹 (directory tree)』
這個目錄樹有什麼特性呢?他主要的特性有:
- 目錄樹的啟始點為根目錄 (/, root);
- 每一個目錄不止能使用本地端的 partition 的檔案系統,也可以使用網路上的 filesystem 。舉例來說,
可以利用 Network File System (NFS) 伺服器掛載某特定目錄等。
- 每一個檔案在此目錄樹中的檔名(包含完整路徑)都是獨一無二的。
此外, 根據檔名寫法的不同,也可將所謂的路徑 (path) 定義為絕對路徑
(absolute) 與相對路徑 (relative)。
絕對路徑為:由根目錄 (/) 開始寫起的檔名或目錄名稱,
例如 /home/dmtsai/.bashrc; 相對路徑為相對於目前路徑的檔名寫法。
例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法,
而您必須要瞭解,相對路徑是以『您當前所在路徑的相對位置』來表示的。舉例來說,您目前在 /home 這個目錄下,
如果想要進入 /var/log 這個目錄時,可以怎麼寫呢?
- cd /var/log (absolute)
- cd ../var/log (relative)
因為您在 /home 底下,所以要回到上一層 (../) 之後,才能繼續往 /var 來移動的!
特別注意這兩個特殊的目錄:
- . :代表當前的目錄,也可以使用 ./ 來表示;
- .. :代表上一層目錄,也可以 ../ 來代表。
這個 . 與 .. 目錄概念是很重要的,您常常會看到 cd .. 或 ./command 之類的指令下達方式,
就是代表上一層與目前所在目錄的工作狀態喔!很重要的吶!此外,針對『檔名』與『完整檔名 (由 / 開始寫起的檔名)』
的字元限制大小為:
- 單一檔案或目錄的最大容許檔名為 255 個字元;
- 包含完整路徑名稱及目錄 (/) 之完整檔名為 4096 個字元。
我們知道 /var/log/ 底下有個檔案名為 message ,這個 message 檔案的最大的檔名可達 255 個字元。
var 與 log 這兩個上層目錄最長也分別可達 255 個字元。但總的來說,由 /var/log/messages 這樣完整檔名最長則可達
4096 個字元。這樣可以理解了吧!? ^_^
Tips: 這個 root 在 Linux 裡面的意義真的很多很多∼多到讓人搞不懂那是啥玩意兒。
如果以『帳號』的角度來看,所謂的 root 指的是『系統管理員!』的身份,
如果以『目錄』的角度來看,所謂的 root 意即指的是根目錄,就是 / 啦∼
要特別留意喔!
| |
目錄配置的內容
從前一小節的說明,您可以瞭解的是, FHS 定義出兩層目錄內的規範,那麼如果您來到根目錄查閱目錄資料,
會顯示什麼呢?
[root@linux ~]# ls -l /
drwxr-xr-x 2 root root 4096 Jul 14 05:22 bin
drwxr-xr-x 3 root root 4096 Jul 9 05:18 boot
drwxr-xr-x 9 root root 4880 Jul 11 00:45 dev
drwxr-xr-x 6 root root 4096 Jun 29 01:06 disk1
drwxr-xr-x 3 root root 4096 Jun 25 08:53 disk2
drwxr-xr-x 83 root root 12288 Jul 14 05:23 etc
drwxr-xr-x 6 root root 4096 May 30 20:07 home
drwxr-xr-x 10 root root 4096 Jul 14 05:23 lib
drwx------ 2 root root 16384 Jun 25 16:21 lost+found
drwxr-xr-x 3 root root 4096 Jun 25 19:34 media
drwxr-xr-x 2 root root 4096 Apr 25 23:54 misc
drwxr-xr-x 2 root root 4096 May 23 12:28 mnt
drwxr-xr-x 2 root root 4096 May 23 12:28 opt
dr-xr-xr-x 59 root root 0 Jul 10 01:25 proc
drwx------ 9 root root 4096 Jul 13 11:31 root
drwxr-xr-x 2 root root 4096 Jul 14 05:22 sbin
drwxr-xr-x 2 root root 4096 Jun 25 08:23 selinux
drwxr-xr-x 2 root root 4096 May 23 12:28 srv
drwxr-xr-x 10 root root 0 Jul 10 01:25 sys
drwxr-xr-x 10 root root 4096 Jun 25 20:24 system
drwxrwxrwt 10 root root 4096 Jul 14 05:23 tmp
drwxr-xr-x 14 root root 4096 Jun 25 08:27 usr
drwxr-xr-x 24 root root 4096 Jun 25 20:16 var
|
從屬性的角度來看,上面的檔名每個都是『目錄名稱』,較為特殊的是 root
,由於 root 這個目錄是管理員 root 的家目錄,這個家目錄可重要了!
所以一定要設定成較為嚴密的 700 ( rwx------ )這個屬性才行吶!如果以較為完整的樹狀目錄來視察的話,
可以將整個 Linux 的樹狀目錄繪製成下圖:
圖四、根據 FHS 定義的各層目錄相關性
請注意,每個目錄都是依附在 / 這個根目錄底下的,所以我們在安裝的時候一定要有一個 /
對應的 partition 才能安裝的原因即在於此!這也就是我們俗稱的『樹狀目錄』囉!而根據 FHS
定義出來的每個目錄內應該放置的檔案內容為:
目錄 | 應放置檔案內容 |
/ | 根目錄 root (/),一般建議在根目錄底下只接目錄,不要直接有檔案在 / 底下。
根目錄是開機的時候系統第一個掛載的 partition ,所以,所有開機過程會用到的檔案,
應該都要放置在這個 partition 當中。舉例來說, /etc, /bin, /dev, /lib, /sbin
這五個次目錄都應該要與根目錄連在一起,不可獨立成為某個 partition 呢! |
/bin, /usr/bin, /usr/local/bin | 除了 /bin 之外, /usr/local/bin, /usr/bin
也是放置『使用者可執行的 binary file 的目錄』喔!舉例來說,
ls, mv, rm, mkdir, rmdir, gzip, tar,
cat, cp, mount 等等重要指令都放在這個目錄當中。 |
/boot | 這個目錄主要的目的是放置 Linux 系統開機會用到的檔案。
開機會用到什麼呢?沒錯∼就是 Linux 的核心檔案。這個目錄底下檔名為 vmlinuz
的就是 Linux 的 Kernel 啦!粉重要的東西!
而如果你的開機管理程式 (loader) 選擇 grub 的話,那麼這個目錄內還有
/boot/grub 這個次目錄呦! |
/dev | 在 Linux 系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中的。
您只要透過存取這個目錄底下的某個檔案,就等於存取某個裝置囉∼
主要又分為周邊設備 (character device),例如鍵盤、滑鼠等;以及儲存設備 (block device),
例如硬碟、光碟等等。在此目錄下的檔案會多出兩個屬性,分別是 major device number ,
與 minor device number 。我們的系統核心就是透過這兩個 number 來判斷裝置的呢!
比要重要的檔案有 /dev/null, /dev/tty[1-6], /dev/ttyS*,
/dev/lp*, /dev/hd*, /dev/sd* 等等 |
/etc | 系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、
各種服務的啟始檔等等。一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,
但是只有 root 有權力修改。並且在此目錄下的檔案幾乎都是 ASCII 的純文字檔案哩。
不過, FHS 建議不要放置可執行檔在這個目錄中喔。比較重要的檔案有:
/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 或 XF86Config 這兩個 X Server 的設定檔。
|
/home | 這是系統預設的使用者家目錄 (home directory)。在你新增一個一般使用者帳號時,
預設的使用者家目錄都會規範到這裡來。比較重要的是,家目錄有兩種代號喔:
~:代表目前這個使用者的家目錄,而
~dmtsai :則代表 dmtsai 的家目錄! |
/lib, /usr/lib, /usr/local/lib | 系統會使用到的函式庫放置的目錄。
程式在運作的過程中,可能會呼叫一些額外的功能參數,那需要函式庫的協助!
這些函式庫就放在此處。比較重要的是 /lib/modules 這個目錄內會擺放 kernel 的相關模組喔! |
/lost+found | 系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下,
通常這個目錄會自動出現在某個 partition 最頂層的目錄下。例如你加裝一棵硬碟於 /disk 中,
那在這個目錄下就會自動產生一個這樣的目錄 /disk/lost+found |
/mnt /media | 這是軟碟與光碟預設掛載點的地方;通常軟碟掛在 /mnt/floppy 下,而光碟掛在 /mnt/cdrom
下,不過也不一定啦!只要你高興,隨便找一個地方來掛載也可以呀!另外,目前也規劃出另一個 /media
的目錄呢!與 /mnt 有點類似啦∼ |
/opt | 這是給主機額外安裝軟體所擺放的目錄。舉例來說, FC4 使用的是 Fedora 社群開發的軟體,
如果您今天想要自行安裝新的 KDE 桌面軟體的話,可以將該軟體安裝在這個目錄下的意思。
不過,以前的 Linux 系統中,我們還是習慣放置在 /usr/local 目錄下呢! |
/proc | 這個目錄本身是一個『虛擬檔案系統』喔!他放置的資料都是在記憶體當中,
例如系統核心、形成資訊、周邊設備的狀態及網路狀態等等。因為這個目錄下的資料都是在記憶體當中,
所以本身不佔任何硬碟空間啊!比較重要的檔案例如:/proc/cpuinfo,
/proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。 |
/root | 系統管理員 (root) 的家目錄。之所以放在這裡,
是因為我們提過,系統第一個開機就被掛載的 partition 為 / ,
而我們希望 /root 能夠與 / 放在同一塊 partition 上面之故。 |
/sbin, /usr/sbin, /usr/local/sbin | 放置一些系統管理員才會動用到的執行指令,例如:
fdisk, mke2fs, fsck, mkswap, mount 等等。與 /bin 不太一樣的地方,這幾個目錄是給 root
等系統管理用的。但是本目錄下的執行檔還是可以讓一般使用者用來『察看』而不能設定喔! |
/srv | 一些服務啟動之後,這些服務所需要取用的資料目錄。舉例來說,WWW
伺服器需要的網頁資料就可以放置在 /srv/www 裡面。 |
/tmp | 這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。
這個目錄是任何人都能夠存取的,所以您需要定期的清理一下。當然,重要資料不可放置在此目錄啊! |
/usr | 由 FHS 規範的第二層內容,在 /usr 此目錄下,包含系統的主要程式、
圖形介面所需要的檔案、額外的函式庫、本機端所自行安裝的軟體,以及共享的目錄與文件等等,
都可以在這個目錄當中發現。事實上,他有點像是 Windows 作業系統當中的『Program files』與
『WinNT』這兩個目錄的結合!在此目錄下的重要次目錄有:
- /usr/bin, /usr/sbin:一般身份使用者與系統管理員可執行的檔案放置目錄;
- /usr/include:c/c++等程式語言的檔頭 (header) 與包含檔(include)放置處,
當我們以 tarball 方式 (*.tar.gz 的方式安裝軟體) 安裝某些資料時,會使用到裡頭的許多包含檔喔!;
- /usr/lib:各應用軟體的函式庫檔案放置目錄;
- /usr/local:本機端自行安裝的軟體預設放置的目錄。目前也適用於 /opt 目錄。
在你安裝完了 Linux 之後,基本上所有的配備你都有了,但是軟體總是可以升級的,
例如你要升級你的 proxy 服務,則通常軟體預設的安裝地方就是在 /usr/local (local
是『當地』的意思),同時,安裝完畢之後所得到的執行檔,為了與系統原先的執行檔有分別,
因此升級後的執行檔通常擺在 /usr/local/bin 這個地方。給個建議啦,
通常鳥哥都會將後來才安裝上去的軟體放置在這裡,因為便於管理呦;
- /usr/share:共享文件放置的目錄,例如底下兩個目錄:
- /usr/share/doc:放置一些系統說明文件的地方,例如你安裝了 grub
了,那麼在該目錄底下找一找,就可以查到 grub 的說明文件了!很是便利!
- /usr/share/man:manpage 的文件檔案目錄;那是什麼?呵呵!
就是你使用 man 的時候,會去查詢的路徑呀!例如你使用 man ls 這個指令時,就會查出
/usr/share/man/man1/ls.1.gz 這個說明檔的內容囉!
- /usr/src:Linux 系統相關的程式碼放置目錄,例如 /usr/src/linux 為核心原始碼!
- /usr/X11R6:系統內的 X Window System 所需的執行檔幾乎都放在這!
|
/var | 這個目錄也很重要,也是 FHS 規範的第二層目錄內容。他主要放置的是針對系統執行過程中,
常態性變動的檔案放置的目錄。舉例來說,例如快取檔案 (cache) 或者是隨時變更的登錄檔
(log file) 都是放在這個目錄中的。此外,某些軟體執行過程中會寫入的資料庫檔案,
例如 MySQL 資料庫,也都寫入在這個目錄中!很重要吧!他底下的重要目錄有:
- /var/cache:程式檔案在運作過程當中的一些暫存檔;
- /var/lib:程式本身執行的過程中,需要使用到的資料檔案放置的目錄,
舉例來說, locate 這個資料庫與 MySQL 及 rpm 等資料庫系統,都寫在這個目錄內。
- /var/log:登錄檔放置的目錄。很重要啊!例如 /var/log/messages
就是總管所有登錄檔的一個檔案!
- /var/lock:某些裝置具有一次性寫入的特性,例如 tab (磁帶機),
此時,為了擔心被其他人干擾而破壞正在運作的動作,因此,會將該裝置 lock (鎖住)起來,
以確定該裝置只能被單一個程序所使用啊!
- /var/run:某些程式或者是服務啟動後,會將他們的 PID 放置在這個目錄下喔!
- /var/spool:是一些佇列資料存放的地方。舉例來說,主機收到電子郵件後,
就會放置到 /var/spool/mail 當中,若信件暫時發不出去,就會放置到 /var/spool/mqueue 目錄下,
使用者工作排程 (cron) 則是放置在 /var/spool/cron 當中!
|
需要特別注意的目錄
在上一節當中我們大約瞭解了各個目錄下所放置的檔案的用途。或許您會看得很吃力,不過,不要擔心,
等到後面的章節看完後,再回來這裡瞧一瞧,就會很清楚的知道每個目錄的意義囉!而這些目錄當中,
有幾個比較有趣的目錄還是需要特別來提醒一下的:
建議不可與 root partition 分開的目錄
我們在 安裝 FC4 那個章節裡面,有提到磁碟分割 (partition)
的概念對吧!在 Linux 的安裝裡面,最重要的就是根目錄 / 所在的那個 partition 了。
我們也可以將其他的例如 /home 放在不同的 partition 裡面。那麼是否有『一定』要放在 root partition
內的目錄呢?有啊!那就是: /etc/, /sbin/, /bin/, /dev/ 以及
/lib/ 這幾個目錄了。
為什麼呢?因為我們的 Linux 系統在開機的時候,一開始進行核心載入時,
只會掛載一個 partition ,那就是 / 。但是開機的時候會用到很多的指令與函式庫,舉例來說,要掛載,
就得需要 mount 這支程式,而且我們也需要 init 這支程式,還需要用到很多的設定檔,例如
/etc/inittab 等等。而我們核心的模組則是放置在 /lib 裡面。當然, /dev 是所有裝置放置的目錄,
也需要在開機的時候使用到的。因此,這些目錄都需要跟 / 綁在一起喔!
先有概念即可,下面兩章會跟您介紹所謂的 partition 概念的!
建議最好獨立成為單一 partition 的目錄
上面提到的是最好不要跟 / 這個 partition 分離的目錄。至於有些目錄則是因為安全性與特殊功能性,
而希望能夠獨立成為一個自己的 partition 呢!例如: /home, /usr,
/var, /tmp 等等。
我們必須要先知道的,系統上的使用者個人家目錄在 /home 裡面,
這個目錄也是可能被使用的最頻繁的目錄之一。此外,為了資源分配較為平均,
我們可能會希望針對每個人限制他可以使用的最大硬碟總量 (quota),在這個前提之下,
您就必須要將 /home 獨立出來,而且最好這個 partition 能夠大一點,尤其是您的 Linux 是作為檔案伺服器
(file server) 時,就更形重要了。
至於 /usr 則是一些程式安裝的目錄,也可以獨立出來的;還有 /var/,
這個目錄由於記錄了相當多的常用資料,讀取真的是很頻繁,所以是『很容易掛點的 partition 一!』
如果能夠將他獨立出來,那麼當 /var/ 真的、萬一、不小心掛點時,就不會影響到其他的 partition ,
最起碼能有一定程度的安全性啦!
特別重要的幾個目錄
除了針對 partition 的觀念來談目錄的重要性之外,有幾個比較重要的目錄您也需要瞭解一下:
- /etc:這個目錄是系統設定檔放置的地方,
包括您系統上的帳號與密碼 (/etc/passwd, /etc/shadow),還有開機時所要用到的各項設定值
(/etc/sysconfig/*) ,還有各主要的網路服務的設定檔,都在這個目錄中。
意思就是說,如果這個目錄底下的檔案被刪除或者是死掉了,嘿嘿∼
您的系統大概也就需要『很花功夫』的重建了∼ ^_^。因此,
一般鳥哥都會定期將這個目錄的所有檔案給他備份下來,
反正這個目錄的大小應該不會超過 50MB 才對,多多備份,有備無患啊!
- /usr/local:雖然說目前已經將這個目錄的重要性移動到 /opt 了,
但是鳥哥還是比較習慣將我自己開發或自行額外安裝的軟體放置在這個 /usr/local 目錄下。
如果您的 Linux 系統是多人共管的話,那麼,養成一個良好的操作習慣是有必要的。
那麼安裝軟體的習慣也要好好建立起來啊∼不要隨意安裝呢!
統一放置在 /usr/local 或者是 /opt 底下吧! ^_^
- /var:在上面提過一次,這裡再次強調。
這個目錄是在管理系統運作過程中的重要中間暫存資料的,例如 /var/lib 與 /var/run 。
此外,最終的資料例如郵件 /var/spool/mail 也是放置在這個目錄中∼
另外,幾乎所有服務的登錄檔 (可以記錄誰、什麼時候、由哪裡登入主機、做了什麼事等等資訊!)
都放在 /var/log 這個目錄下,因此,這個目錄也很重要。記得常常去檢查
/var/log/messages 這個檔案是否有異常啊∼
一般主機 partition 與目錄的配置情況
好了,知道了 Linux 的檔案權限,目前也知道了各個檔案內可能擺放的資料是什麼了,
那麼再來說說你的目錄與磁碟分割之間的相關性。通常一般的大型主機都不會將所有的資料放置在一個磁碟中
( 就是只有一個『 / 』根目錄 ),這有幾個目的:
- 安全性考量:
你的系統通常是在 /usr/ 中,而個人資料則可能放置在 /home 當中,至於一些開機資料則放置在
/etc 當中。如果將所有的資料放在一起,當你的系統不小心被駭客破壞,或者不小心自己砍了一個小東西,
則所有的咚咚也都跟著不見了.....這對於我們市井小民或許無所謂,再安裝一次就好了,
但是對於一些大型企業可不行這樣!因此需要將資料分別放置於不同的磁碟中,會比較保險些。
- 便利性:
如果你需要升級你的系統的話,是否需要重新 format 安裝呢?有些資料例如 /home
裡面的資料為個人用戶的資料,似乎與系統無關!所以如果你將這些資料分別放置於不同的磁碟,
則你要升級或者進行一些系統更動時,將比較有彈性。
你或許可以將你的系統做成這樣的 partition 分佈:
這是比較常見的磁碟分佈情況,其中:
- / 根目錄可以分配約 1 GB 以內;
- /boot 大概在 50 MB 就可以了,因為開機檔案並不大;
- /var 就至少需要 1GB 以上,因為你的 mail 、 proxy 預設的儲存區都在這個目錄中,除非你要將一些設定改變!
- /home 與 /usr 通常是最大的,因為你所安裝的資料都是在 /usr/
當中,而用戶資料則放置在 /home 當中,因此通常大家都會建議你將所剩下的磁碟空間平均分配給這兩個目錄說!
不過也不一定啦! /usr 大概給個 10G 就很多了∼其他的可以都給 /home
,也可以保留一些剩餘空間來作為以後的安裝與設定用啊!
無論如何,每部主機的環境與功能用途都不相同,自然其磁碟的分配就會不太一樣,因此,
上面的設定您就看看就好,等您將整本書或者整個網頁內容全 K
完了,那麼大概就知道怎樣設定您的主機最恰當啦!
Linux 支援的檔案系統
我們在本章前面提到的都是單一檔案的屬性與相關資訊,以及單一目錄在 Filesystem Hierarchy Standard (FHS)
當中的定義,還沒有提到所謂的 partition 的相關概念。底下我們就約略來談一談,那麼我們前面提到的這些檔案、目錄,
是放在什麼樣的檔案系統內呢?
什麼是檔案系統 (filesystem) 呢?目前的作業系統大多數是將資料由硬碟讀出來的,
那麼每個作業系統使用的硬碟在 x86 架構上的,都一樣啊!都是同樣的硬碟。
但是,每種作業系統都有其獨特的讀取檔案的方法,也就是說,
每種作業系統對硬碟讀取的方法不同,所以就造就了不同的檔案系統了。
舉例來說, Windows 98 預設的檔案系統是 FAT (或 FAT16) 檔案系統,
Windows 2000 有所謂的 NTFS 檔案系統,至於 Linux 的正統檔案系統則為 ext2
( Linux second extended file system, ext2fs ) 這一個。
我們的系統能不能讀取某個檔案系統,與前面提過的『核心功能』有關。
Linux 核心必須要能夠認識某種檔案系統後,我們的 Linux 才能讀取該檔案系統的資料內容啊!
也就是說, 你必須要將你所想要支援的檔案系統編譯到你的核心當中才能被支援
。因此,您可以發現, Windows 與 Linux 安裝在同一個硬碟的不同 partition 時,
Windows 將不能取用 Linux 的硬碟資料, Why ? 就因為 Windows 的核心不認識 Linux 的檔案系統呀!
目前 Fedora Core IV 預設的檔案系統為 ext3 (Third Extended File System),
他是 Ext2 的升級版,主要是增加了日誌 (journaling) 的功能,但是 ext3 還是向下支援 ext2 等。
另外,如果你需要將你原有的 Windows 系統也掛載在 Linux 底下的話,那麼 Linux
同時也支援 MS-DOS, VFAT, FAT, BSD 等等的檔案系統。至於 Window NT 的 NTFS
檔案系統則不見得每一個 Linux distribution 都有支援,例如我們的 FC4 預設就沒有支援了。
問我怎麼看出來的?呵呵! Linux 能夠支援的檔案系統與核心是否有編譯進去有關,
所以你可以到你的 Linux 系統的:
/lib/modules/`uname -r`/kernel/fs
該目錄底下看一看,如果有你想要的檔案系統,那麼這個核心就有支援啦!
很多 Linux 所需要的功能都可以在 ext2 上面完成,不過 ext2 缺乏日誌管理系統,
如果發生問題時,修復過程會比較慢一些。所以最近釋出的 Linux distribution
大多已經預設採用 ext3 或 reiserfs 這種具有日誌式管理的檔案系統了。
那麼什麼是日誌式檔案系統呢?舉例來說, ext3 與 ext2 有啥不同?
ext3 其實只是多做了一個日誌式資料的紀錄。當我們要在將資料寫入硬碟時,
ext2 是直接將資料寫入,但是 ext3 則會將這個『要開始寫入』的訊息寫入日誌式記錄區,
然後才開始進行資料的寫入。在資料寫入完畢後,又將『完成寫入動作』的訊息寫入日誌式記錄區,
這有什麼好處呢?最大的好處就是資料的完整性與『恢復力』。
什麼是『恢復力』呢?早期的 ext2 檔案系統如果發生類似斷電後時,檔案系統就得要檢查檔案一致性。
這個檢查的過程要將整個 partition 內的檔案做一個完整的比較,哇!很慢很慢、很久很久啊∼
如果是 ext3 的話,那麼只要透過檢查『日誌記錄區』就可以知道斷電時,是否有哪些檔案正在進行寫入的動作,
只要檢查這些地方即可∼這樣就能夠節省很多檔案檢查的時間呢!
這樣知道為何要選擇 ext3 了吧?我們還可以引用 Red Hat 公司中,首席核心開發者
Michael K. Johnson 的話:
『為什麼你想要從 ext 2轉換到 ext3 呢?有四個主要的理由:可利用性、資料完整性、速度及易於轉換』
『可利用性』,他指出,這意味著從系統中止到快速重新復原而不是持續的讓 e2fsck 執行長時間的修復。ext3
的日誌式條件可以避免資料毀損的可能。他也指出:
『除了寫入若干資料超過一次時,ext3 往往會較快於 ext2,因為 ext3 的日誌使硬碟讀取頭的移動能更有效的進行』
然而或許決定的因素還是在Johnson先生的第四個理由中。
『它是可以輕易的從 ext2 變更到 ext3 來獲得一個強而有力的日誌式檔案系統而不需要重新做格式化』。『那是正確的,為了體驗一下
ext3 的好處是不需要去做一種長時間的,冗長乏味的且易於產生錯誤的備份工作及重新格式化的動作』。
|
上列資料可在 Whitepaper: Red Hat's New Journaling File System: ext3 (
http://www.redhat.com/support/wpapers/redhat/ext3/ ) 查閱得到。
所以囉,使用 ext3 或者是其他的日誌式檔案系統是有好處的,最大的好處當然是錯誤問題的排除效率比較高。
無論如何,您只要先曉得 ext2 是 Linux 正規的檔案系統,而近年來的 ext3
等日誌式檔案系統則有取代的趨勢。
Linux 的 VFS (Virtual Filesystem Switch):
瞭解了我們使用的檔案系統之後,再來則是要提到,那麼 Linux 的核心又是如何管理這些認識的檔案系統呢?
其實,整個 Linux 的系統都是透過一個名為 Virtual Filesystem Switch 的核心功能去讀取 filesystem 的。
也就是說,整個 Linux 認識的 filesystem 其實都是 VFS 在進行管理,
我們使用者並不需要知道每個 partition 上頭的 filesystem 是什麼∼
VFS 會主動的幫我們做好讀取的動作呢∼
這無疑是個很好用的功能∼為什麼呢?因為只要系統管理員一開始就設定好各主要 filesystem 對應的檔案系統模組後,
核心的 VFS 就會主動接管該 filesystem 的存取模式。使用者可以在不曉得每個 filesystem 是什麼的情況下,
就能自由的運用系統上的各種 filesystem 。很方便∼不是嗎?! ^_^
本章習題練習
( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- 早期的 Unix 系統檔名最多允許 14 個字元,而新的 Unix 與 Linux 系統中,檔名最多可以容許幾個字元?
單一檔名可達 255 字元,完整檔名 (包含路徑) 可達 4096 個字元
- 當一個檔案屬性為 –rwxrwxrwx 則表示這個檔案的意義為?
任何人皆可讀取、可寫入亦可刪除。
- 我需要將一個檔案的屬性改為 –rwxr-xr-- 請問該如何下達指令?
chmod 754 filename 或 chmod u=rwx,g=rx,o=r filename
- 若我需要更改一個檔案的擁有者與群組,該用什麼指令?
chown, chgrp
- Linux 傳統的檔案系統為何?此外,常用的 Journaling 檔案格式有哪些?
傳統檔案格式為:ext2, Journaling 有 ext3 及 Reiserfs 等
- 請問底下的目錄與主要放置什麼資料:
/etc/, /etc/init.d, /boot, /usr/bin, /bin, /usr/sbin, /sbin, /dev, /var/log
- /etc/:幾乎系統的所有設定檔案均在此,尤其 passwd,shadow
- /etc/init.d:系統開機的時候載入服務的 scripts 的擺放地點
- /boot:開機設定檔,也是預設擺放核心 vmlinuz 的地方
- /usr/bin, /bin:一般執行檔擺放的地方
- /usr/sbin, /sbin:系統管理員常用指令集
- /dev:擺放所有系統裝置檔案的目錄
- /var/log:擺放系統登錄檔案的地方
- 若一個檔案的檔名開頭為『 . 』,例如 .bashrc 這個檔案,代表什麼?另外,如何顯示出這個檔名與他的相關屬性?
有『 . 』為開頭的為隱藏檔,需要使用 ls –a 這個
–a 的參數才能顯示出隱藏檔案的內容,而使用 ls –al 才能顯示出屬性。
參考資料
2002/07/18:第一次完成
2003/02/06:重新編排與加入FAQ
2005/06/28:將舊的資料移動到 這裡
2005/07/15:呼呼∼終於改完成了∼這次的修訂當中,加入了 FHS 的說明,希望大家能夠比較清楚 Linux 的目錄配置!
2005/08/05:修訂了最大檔名字元,應該是 255 才對!另外,加入了『檔名限制』的部分!
2005/09/03:修訂了目錄權限相關的說明,將原本僅具有 r 卻寫成無法使用 ls 瀏覽的說明資料移除!
|
|