Linux最優秀的地方之一,就在於他的多人多工環境。而為了讓各個使用者具有較保密的檔案資料,因此檔案的權限管理就變的很重要了。 Linux一般將檔案可存取的身份分為三個類別,分別是 owner/group/others,且三種身份各有 read/write/execute 等權限。若管理不當,你的Linux主機將會變的很『不蘇服!@_@』。另外,你如果首次接觸Linux的話,那麼, 在Linux底下這麼多的目錄/檔案,到底每個目錄/檔案代表什麼意義呢?底下我們就來一一介紹呢! |
經過第五章的洗禮之後,你應該可以在Linux的指令列模式底下輸入指令了吧? 接下來,當然是要讓你好好的瀏覽一下Linux系統裡面有哪些重要的檔案囉。 不過,每個檔案都有相當多的屬性與權限,其中最重要的可能就是檔案的擁有者的概念了。 所以,在開始檔案相關資訊的介紹前,鳥哥先就簡單的(1)使用者及(2)群組與(3)非本群組外的其他人等概念作個說明吧∼ 好讓你快點進入狀況的哩! ^_^
在我們Linux系統當中,預設的情況下,所有的系統上的帳號與一般身份使用者,還有那個root的相關資訊, 都是記錄在/etc/passwd這個檔案內的。至於個人的密碼則是記錄在/etc/shadow這個檔案下。 此外,Linux所有的群組名稱都紀錄在/etc/group內!這三個檔案可以說是Linux系統裡面帳號、密碼、群組資訊的集中地囉! 不要隨便刪除這三個檔案啊! ^_^
至於更多的與帳號群組有關的設定,還有這三個檔案的格式,不要急,我們在第十四章的帳號管理時,會再跟大家詳細的介紹的!這裡先有概念即可。
大致瞭解了Linux的使用者與群組之後,接著下來,我們要來談一談,
這個檔案的權限要如何針對這些所謂的『使用者』與『群組』來設定呢?
這個部分是相當重要的,尤其對於初學者來說,因為檔案的權限與屬性是學習Linux的一個相當重要的關卡,
如果沒有這部份的概念,那麼你將老是聽不懂別人在講什麼呢!尤其是當你在你的螢幕前面出現了『Permission
deny』的時候,不要擔心,『肯定是權限設定錯誤』啦!呵呵!好了,閒話不多聊,趕快來瞧一瞧先。
嗯!既然要讓你瞭解Linux的檔案屬性,那麼有個重要的也是常用的指令就必須要先跟你說囉!那一個?就是『 ls 』這一個察看檔案的指令囉!在你以root的身份登入Linux之後,下達『 ls -al 』看看,會看到底下的幾個咚咚:
[root@www ~]# ls -al total 156 drwxr-x--- 4 root root 4096 Sep 8 14:06 . drwxr-xr-x 23 root root 4096 Sep 8 14:21 .. -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg -rw------- 1 root root 199 Sep 8 17:14 .bash_history -rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout -rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile -rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc -rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=範例說明處 drwx------ 2 root root 4096 Sep 5 14:09 .gconfd -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=範例說明處 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ] [ 權限 ][連結][擁有者][群組][檔案容量][ 修改日期 ][ 檔名 ] |
ls是『list』的意思,重點在顯示檔案的檔名與相關屬性。而選項『-al』則表示列出所有的檔案詳細的權限與屬性 (包含隱藏檔,就是檔名第一個字元為『 . 』的檔案)。如上所示,在你第一次以root身份登入Linux時, 如果你輸入上述指令後,應該有上列的幾個東西,先解釋一下上面七個欄位個別的意思:
這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字元:(圖2.1.1及圖2.1.2內的權限並無關係)
例題:
若有一個檔案的類型與權限資料為『-rwxr-xr--』,請說明其意義為何?
答:
先將整個類型與權限資料分開查閱,並將十個字元整理成為如下所示:
[-][rwx][r-x][r--]1 為:代表這個檔名為目錄或檔案,本例中為檔案(-); 234為:擁有者的權限,本例中為可讀、可寫、可執行(rwx); 567為:同群組使用者權限,本例中為可讀可執行(rx); 890為:其他使用者權限,本例中為可讀(r) 同時注意到,rwx所在的位置是不會改變的,有該權限就會顯示字元,沒有該權限就變成減號(-)就是了。 |
另外,目錄與檔案的權限意義並不相同,這是因為目錄與檔案所記錄的資料內容不相同所致。 由於目錄與檔案的權限意義非常的重要,所以鳥哥將他獨立到2.3節目錄與檔案之權限意義中再來談。
每個檔案都會將他的權限與屬性記錄到檔案系統的i-node中,不過,我們使用的目錄樹卻是使用檔名來記錄, 因此每個檔名就會連結到一個i-node囉!這個屬性記錄的,就是有多少不同的檔名連結到相同的一個i-node號碼去就是了。 關於i-node的相關資料我們會在第八章談到檔案系統時再加強介紹的。
在Linux系統下,你的帳號會附屬於一個或多個的群組中。舉剛剛我們提到的例子,class1, class2, class3均屬於projecta這個群組,假設某個檔案所屬的群組為projecta,且該檔案的權限如圖2.1.2所示(-rwxrwx---), 則class1, class2, class3三人對於該檔案都具有可讀、可寫、可執行的權限(看群組權限)。 但如果是不屬於projecta的其他帳號,對於此檔案就不具有任何權限了。
這一欄的內容分別為日期(月/日)及時間。如果這個檔案被修改的時間距離現在太久了,那麼時間部分會僅顯示年份而已。 如下所示:
[root@www ~]# ls -l /etc/termcap /root/install.log -rw-r--r-- 1 root root 807103 Jan 7 2007 /etc/termcap -rw-r--r-- 1 root root 42304 Sep 4 18:26 /root/install.log # 如上所示,/etc/termcap 為 2007 年所修改過的檔案,離現在太遠之故; # 至於 install.log 是今年 (2009) 所建立的,所以就顯示完整的時間了。 |
如果想要顯示完整的時間格式,可以利用ls的選項,亦即:『ls -l --full-time』就能夠顯示出完整的時間格式了!包括年、月、日、時間喔。 另外,如果你當初是以繁體中文安裝你的Linux系統,那麼日期欄位將會以中文來顯示。 可惜的是,中文並沒有辦法在純文字的終端機模式中正確的顯示,所以此欄會變成亂碼。 那你就得要使用『LANG=en_US』來修改語系喔!
如果想要讓系統預設的語系變成英文的話,那麼你可以修改系統設定檔『/etc/sysconfig/i18n』,利用第五章談到的nano來修改該檔案的內容,使LANG這個變數成為上述的內容即可。
這個欄位就是檔名了。比較特殊的是:如果檔名之前多一個『 . 』,則代表這個檔案為『隱藏檔』,例如上表中的.gconf那一行,該檔案就是隱藏檔。 你可以使用『ls』及『ls -a』這兩個指令去感受一下什麼是隱藏檔囉!
對於更詳細的 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
|
例題:
如果我的目錄為底下的樣式,請問testgroup這個群組的成員與其他人(others)是否可以進入本目錄?
答: drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
|
與Windows系統不一樣的是,在Linux系統當中,每一個檔案都多加了很多的屬性進來,尤其是群組的概念,這樣有什麼用途呢? 其實,最大的用途是在『資料安全性』上面的。
可怕吧!因此,在你修改你的linux檔案與目錄的屬性之前,一定要先搞清楚, 什麼資料是可變的,什麼是不可變的!千萬注意囉!接下來我們來處理一下檔案屬性與權限的變更吧!
我們現在知道檔案權限對於一個系統的安全重要性了,也知道檔案的權限對於使用者與群組的相關性, 那麼如何修改一個檔案的屬性與權限呢?又!有多少檔案的權限我們可以修改呢? 其實一個檔案的屬性與權限有很多!我們先介紹幾個常用於群組、擁有者、各種身份的權限之修改的指令,如下所示:
改變一個檔案的群組真是很簡單的,直接以chgrp來改變即可,咦!這個指令就是change group的縮寫嘛!這樣就很好記了吧! ^_^。不過,請記得,要被改變的群組名稱必須要在/etc/group檔案內存在才行,否則就會顯示錯誤!
假設你是以root的身份登入Linux系統的,那麼在你的家目錄內有一個install.log的檔案, 如何將該檔案的群組改變一下呢?假設你已經知道在/etc/group裡面已經存在一個名為users的群組, 但是testing這個群組名字就不存在/etc/group當中了,此時改變群組成為users與testing分別會有什麼現象發生呢?
[root@www ~]# chgrp [-R] dirname/filename ... 選項與參數: -R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案、目錄 都更新成為這個群組之意。常常用在變更某一目錄內所有的檔案之情況。 範例: [root@www ~]# chgrp users install.log [root@www ~]# ls -l -rw-r--r-- 1 root users 68495 Jun 25 08:53 install.log [root@www ~]# chgrp testing install.log chgrp: invalid group name `testing' <== 發生錯誤訊息囉∼找不到這個群組名∼ |
發現了嗎?檔案的群組被改成users了,但是要改成testing的時候,
就會發生錯誤∼注意喔!發生錯誤訊息還是要努力的查一查錯誤訊息的內容才好!
將他英文翻譯成為中文,就知道問題出在哪裡了。
如何改變一個檔案的擁有者呢?很簡單呀!既然改變群組是change group,那麼改變擁有者就是change owner囉!BINGO!那就是chown這個指令的用途,要注意的是, 使用者必須是已經存在系統中的帳號,也就是在/etc/passwd 這個檔案中有紀錄的使用者名稱才能改變。
chown的用途還滿多的,他還可以順便直接修改群組的名稱呢!此外,如果要連目錄下的所有次目錄或檔案同時更改檔案擁有者的話,直接加上 -R 的選項即可!我們來看看語法與範例:
[root@www ~]# chown [-R] 帳號名稱 檔案或目錄 [root@www ~]# chown [-R] 帳號名稱:群組名稱 檔案或目錄 選項與參數: -R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都變更 範例:將install.log的擁有者改為bin這個帳號: [root@www ~]# chown bin install.log [root@www ~]# ls -l -rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log 範例:將install.log的擁有者與群組改回為root: [root@www ~]# chown root:root install.log [root@www ~]# ls -l -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log |
知道如何改變檔案的群組與擁有者了,那麼什麼時候要使用chown或chgrp呢?或許你會覺得奇怪吧? 是的,確實有時候需要變更檔案的擁有者的,最常見的例子就是在複製檔案給你之外的其他人時, 我們使用最簡單的cp指令來說明好了:
[root@www ~]# cp 來源檔案 目的檔案
|
假設你今天要將.bashrc這個檔案拷貝成為.bashrc_test檔名,且是要給bin這個人,你可以這樣做:
[root@www ~]# cp .bashrc .bashrc_test [root@www ~]# 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 <==新檔案的屬性沒變 |
由於複製行為(cp)會複製執行者的屬性與權限,所以!怎麼辦?.bashrc_test還是屬於root所擁有,
如此一來,即使你將檔案拿給bin這個使用者了,那他仍然無法修改的(看屬性/權限就知道了吧),
所以你就必須要將這個檔案的擁有者與群組修改一下囉!知道如何修改了吧?
檔案權限的改變使用的是chmod這個指令,但是,權限的設定方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。我們就來談一談:
r:4每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為: [-rwxrwx---] 分數則是:
w:2
x:1
owner = rwx = 4+2+1 = 7所以等一下我們設定權限的變更時,該檔案的權限數字就是770啦!變更權限的指令chmod的語法是這樣的:
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
[root@www ~]# chmod [-R] xyz 檔案或目錄 選項與參數: xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。 -R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都會變更 |
[root@www ~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc [root@www ~]# chmod 777 .bashrc [root@www ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc |
例題:
將剛剛你的.bashrc這個檔案的權限修改回-rw-r--r--的情況吧!
答:
-rw-r--r--的分數是644,所以指令為:
chmod 644 .bashrc |
chmod | u g o a |
+(加入) -(除去) =(設定) |
r w x | 檔案或目錄 |
[root@www ~]# chmod u=rwx,go=rx .bashrc # 注意喔!那個 u=rwx,go=rx 是連在一起的,中間並沒有任何空白字元! [root@www ~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc |
[root@www ~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc [root@www ~]# chmod a+w .bashrc [root@www ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc |
[root@www ~]# chmod a-x .bashrc [root@www ~]# ls -al .bashrc -rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc |
現在我們知道了Linux系統內檔案的三種身份(擁有者、群組與其他人),知道每種身份都有三種權限(rwx),
已知道能夠使用chown, chgrp, chmod去修改這些權限與屬性,當然,利用ls -l去觀察檔案也沒問題。
前兩小節也談到了這些檔案權限對於資料安全的重要性。那麼,這些檔案權限對於一般檔案與目錄檔案有何不同呢?
有大大的不同啊!底下就讓鳥哥來說清楚,講明白!
檔案是實際含有資料的地方,包括一般文字檔、資料庫內容檔、二進位可執行檔(binary program)等等。 因此,權限對於檔案來說,他的意義是這樣的:
那個可讀(r)代表讀取檔案內容是還好瞭解,那麼可執行(x)呢?這裡你就必須要小心啦! 因為在Windows底下一個檔案是否具有執行的能力是藉由『 副檔名 』來判斷的, 例如:.exe, .bat, .com 等等,但是在Linux底下,我們的檔案是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關係的!
至於最後一個w這個權限呢?當你對一個檔案具有w權限時,你可以具有寫入/編輯/新增/修改檔案的內容的權限,
但並不具備有刪除該檔案本身的權限!對於檔案的rwx來說,
主要都是針對『檔案的內容』而言,與檔案檔名的存在與否沒有關係喔!因為檔案記錄的是實際的資料嘛!
檔案是存放實際資料的所在,那麼目錄主要是儲存啥玩意啊?目錄主要的內容在記錄檔名清單,檔名與目錄有強烈的關連啦! 所以如果是針對目錄時,那個 r, w, x 對目錄是什麼意義呢?
大致的目錄權限概念是這樣,底下我們來看幾個範例,讓你瞭解一下啥是目錄的權限囉!
例題:
有個目錄的權限如下所示:
答:drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh系統有個帳號名稱為vbird,這個帳號並沒有支援root群組,請問vbird對這個目錄有何權限?是否可切換到此目錄中?
vbird對此目錄僅具有r的權限,因此vbird可以查詢此目錄下的檔名列表。因為vbird不具有x的權限,
因此vbird並不能切換到此目錄內!(相當重要的概念!)
|
上面這個例題中因為vbird具有r的權限,因為是r乍看之下好像就具有可以進入此目錄的權限,其實那是錯的。 能不能進入某一個目錄,只與該目錄的x權限有關啦!此外, 工作目錄對於指令的執行是非常重要的,如果你在某目錄下不具有x的權限, 那麼你就無法切換到該目錄下,也就無法執行該目錄下的任何指令,即使你具有該目錄的r的權限。
很多朋友在架設網站的時候都會卡在一些權限的設定上,他們開放目錄資料給網際網路的任何人來瀏覽, 卻只開放r的權限,如上面的範例所示那樣,那樣的結果就是導致網站伺服器軟體無法到該目錄下讀取檔案(最多只能看到檔名), 最終用戶總是無法正確的查閱到檔案的內容(顯示權限不足啊!)。要注意:要開放目錄給任何人瀏覽時,應該至少也要給予r及x的權限,但w權限不可隨便給! 為什麼w不能隨便給,我們來看下一個例子:
例題:
假設有個帳號名稱為dmtsai,他的家目錄在/home/dmtsai/,dmtsai對此目錄具有[rwx]的權限。
若在此目錄下有個名為the_root.data的檔案,該檔案的權限如下:
答:-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data請問dmtsai對此檔案的權限為何?可否刪除此檔案?
如上所示,由於dmtsai對此檔案來說是『others』的身份,因此這個檔案他無法讀、無法編輯也無法執行,
也就是說,他無法變動這個檔案的內容就是了。
但是由於這個檔案在他的家目錄下, 他在此目錄下具有rwx的完整權限,因此對於the_root.data這個『檔名』來說,他是能夠『刪除』的! 結論就是,dmtsai這個用戶能夠刪除the_root.data這個檔案! |
還是看不太懂?有聽沒有懂喔!沒關係∼我們底下就來設計一個練習, 讓你實際玩玩看,應該就能夠比較近入狀況啦!不過,由於很多指令我們還沒有教, 所以底下的指令有的先瞭解即可,詳細的指令用法我們會在後面繼續介紹的。
我們用root的身份在所有人都可以工作的/tmp目錄中建立一個名為testing的目錄, 該目錄的權限為744且目錄擁有者為root。另外,在testing目錄下在建立一個空的檔案, 檔名亦為testing。建立目錄可用mkdir(make directory),建立空檔案可用touch(下一章會說明)來處理。 所以過程如下所示:
[root@www ~]# cd /tmp <==切換工作目錄到/tmp [root@www tmp]# mkdir testing <==建立新目錄 [root@www tmp]# chmod 744 testing <==變更權限 [root@www tmp]# touch testing/testing <==建立空的檔案 [root@www tmp]# chmod 600 testing/testing <==變更權限 [root@www tmp]# ls -ald testing testing/testing drwxr--r-- 2 root root 4096 Sep 19 16:01 testing -rw------- 1 root root 0 Sep 19 16:01 testing/testing # 仔細看一下,目錄的權限是 744 ,且所屬群組與使用者均是 root 喔! # 那麼在這樣的情況底下,一般身份使用者對這個目錄/檔案的權限為何? |
在上面的例子中,雖然目錄是744的權限設定,一般用戶應該能有 r 的權限, 但這樣的權限使用者能做啥事呢?假設鳥哥的系統中含有一個帳號名為 vbird 的, 我們可以透過『 su - vbird 』這個指令來變換身份喔!看看底下的操作先!
[root@www tmp]# su - vbird <==切換身份成為 vbird 囉! [vbird@www ~]$ cd /tmp <==看一下,身份變了喔!提示字元也變成 $ 了! [vbird@www tmp]$ ls -l testing/ ?--------- ? ? ? ? ? testing # 因為具有 r 的權限可以查詢檔名。不過權限不足(沒有x),所以會有一堆問號。 [vbird@www tmp]$ cd testing/ -bash: cd: testing/: Permission denied # 因為不具有 x ,所以當然沒有進入的權限啦!有沒有呼應前面的權限說明啊! |
上面的練習我們知道了只有r確實可以讓使用者讀取目錄的檔名列表,不過詳細的資訊卻還是讀不到的, 同時也不能將該目錄變成工作目錄(用 cd 進入該目錄之意)。那如果我們讓該目錄變成使用者的, 那麼使用者在這個目錄底下是否能夠刪除檔案呢?底下的練習做看看:
[vbird@www tmp]$ exit <==讓 vbird 變回原本的 root 身份喔! [root@www tmp]# chown vbird testing <==修改權限,讓vbird擁有此目錄 [root@www tmp]# su - vbird <==再次變成vbird來操作 [vbird@www ~]$ cd /tmp/testing <==可以進入目錄了呢! [vbird@www testing]$ ls -l -rw------- 1 root root 0 Sep 19 16:01 testing <==檔案不是vbird的! [vbird@www testing]$ rm testing <==嘗試殺掉這個檔案看看! rm: remove write-protected regular empty file `testing'? y # 竟然可以刪除!這樣理解了嗎?! |
透過上面這個簡單的步驟,你就可以清楚的知道, x 在目錄當中是與『能否進入該目錄』有關, 至於那個 w 則具有相當重要的權限,因為他可以讓使用者刪除、更新、新建檔案或目錄, 是個很重要的參數啊!這樣可以理解了嗎?! ^_^
我們在基礎篇一直強調一個概念,那就是:任何裝置在Linux底下都是檔案,
不僅如此,連資料溝通的介面也有專屬的檔案在負責∼所以,你會瞭解到,Linux的檔案種類真的很多∼
除了前面提到的一般檔案(-)與目錄檔案(d)之外,還有哪些種類的檔案呢?
我們在剛剛提到使用『ls -l』觀察到第一欄那十個字元中,第一個字元為檔案的類型。 除了常見的一般檔案(-)與目錄檔案(d)之外,還有哪些種類的檔案類型呢?
除了設備檔是我們系統中很重要的檔案,最好不要隨意修改之外(通常他也不會讓你修改的啦!),
另一個比較有趣的檔案就是連結檔。如果你常常將應用程式捉到桌面來的話,你就應該知道在
Windows底下有所謂的『捷徑』。同樣的,你可以將
linux下的連結檔簡單的視為一個檔案或目錄的捷徑。
至於socket與FIFO檔案比較難理解,因為這兩個咚咚與程序(process)比較有關係,
這個等到未來你瞭解process之後,再回來查閱吧!此外,
你也可以透過man fifo及man socket來查閱系統上的說明!
基本上,Linux的檔案是沒有所謂的『副檔名』的,我們剛剛就談過,一個Linux檔案能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關係也沒有。這個觀念跟Windows的情況不相同喔!在Windows底下, 能被執行的檔案副檔名通常是 .com .exe .bat等等,而在Linux底下,只要你的權限當中具有x的話,例如[ -rwxr-xr-x ] 即代表這個檔案可以被執行喔!
不過,可以被執行跟可以執行成功是不一樣的∼舉例來說,在root家目錄下的install.log 是一個純文字檔,如果經由修改權限成為 -rwxrwxrwx 後,這個檔案能夠真的執行成功嗎? 當然不行∼因為他的內容根本就沒有可以執行的資料。所以說,這個x代表這個檔案具有可執行的能力, 但是能不能執行成功,當然就得要看該檔案的內容囉∼
雖然如此,不過我們仍然希望可以藉由副檔名來瞭解該檔案是什麼東西,所以, 通常我們還是會以適當的副檔名來表示該檔案是什麼種類的。底下有數種常用的副檔名:
基本上,Linux系統上的檔名真的只是讓你瞭解該檔案可能的用途而已, 真正的執行與否仍然需要權限的規範才行!例如雖然有一個檔案為可執行檔, 如常見的/bin/ls這個顯示檔案屬性的指令,不過,如果這個檔案的權限被修改成無法執行時, 那麼ls就變成不能執行囉!
上述的這種問題最常發生在檔案傳送的過程中。例如你在網路上下載一個可執行檔,但是偏偏在你的
Linux系統中就是無法執行!呵呵!那麼就是可能檔案的屬性被改變了!不要懷疑,從網路上傳送到你的
Linux系統中,檔案的屬性與權限確實是會被改變的喔!
在Linux底下,使用預設的Ext2/Ext3檔案系統時,針對檔案的檔名長度限制為:
是相當長的檔名喔!我們希望Linux的檔案名稱可以一看就知道該檔案在幹嘛的, 所以檔名通常是很長很長!而用慣了Windows的人可能會受不了,因為檔案名稱通常真的都很長, 對於用慣Windows而導致打字速度不快的朋友來說,嗯!真的是很困擾.....不過,只得勸你好好的加強打字的訓練囉!
而由第五章談到的熱鍵你也會知道,
其實可以透過[tab]按鍵來確認檔案的檔名的!這很好用啊!
當然啦,如果你已經讀完了本書第三篇關於BASH的用法,那麼你將會發現
『哇!變數真是一個相當好用的東西吶!』
嗯!看不懂,沒關係,到第三篇談到bash再說!
由於Linux在文字介面下的一些指令操作關係,一般來說,你在設定Linux底下的檔案名稱時, 最好可以避免一些特殊字元比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
因為這些符號在文字介面下,是有特殊意義的!另外,檔案名稱的開頭為小數點『.』時, 代表這個檔案為『隱藏檔』喔!同時,由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將檔案檔名的開頭以 - 或 + 來命名啊!
在瞭解了每個檔案的相關種類與屬性,以及瞭解了如何更改檔案屬性/權限的相關資訊後,再來要瞭解的就是,
為什麼每套Linux distributions他們的設定檔啊、執行檔啊、每個目錄內放置的咚咚啊,其實都差不多?
原來是有一套標準依據的哩!我們底下就來瞧一瞧。
因為利用Linux來開發產品或distributions的社群/公司與個人實在太多了, 如果每個人都用自己的想法來配置檔案放置的目錄,那麼將可能造成很多管理上的困擾。 你能想像,你進入一個企業之後,所接觸到的Linux目錄配置方法竟然跟你以前學的完全不同嗎? 很難想像吧∼所以,後來就有所謂的Filesystem Hierarchy Standard (FHS)標準的出爐了!
根據FHS(http://www.pathname.com/fhs/)的官方文件指出, 他們的主要目的是希望讓使用者可以瞭解到已安裝軟體通常放置於那個目錄下, 所以他們希望獨立的軟體開發商、作業系統製作者、以及想要維護系統的使用者,都能夠遵循FHS的標準。 也就是說,FHS的重點在於規範每個特定的目錄下應該要放置什麼樣子的資料而已。 這樣做好處非常多,因為Linux作業系統就能夠在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風格。
事實上,FHS是根據過去的經驗一直再持續的改版的,FHS依據檔案系統使用的頻繁與否與是否允許使用者隨意更動, 而將目錄定義成為四種交互作用的形態,用表格來說有點像底下這樣:
可分享的(shareable) | 不可分享的(unshareable) | |
不變的(static) | /usr (軟體放置處) | /etc (設定檔) |
/opt (第三方協力軟體) | /boot (開機與核心檔) | |
可變動的(variable) | /var/mail (使用者郵件信箱) | /var/run (程序相關) |
/var/spool/news (新聞群組) | /var/lock (程序相關) |
上表中的目錄就是一些代表性的目錄,該目錄底下所放置的資料在底下會談到,這裡先略過不談。 我們要瞭解的是,什麼是那四個類型?
事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼資料而已,分別是底下這三個目錄的定義:
為什麼要定義出這三層目錄呢?其實是有意義的喔!每層目錄底下所應該要放置的目錄也都又特定的規定喔! 由於我們尚未介紹完整的Linux系統,所以底下的介紹你可能會看不懂!沒關係,先有個概念即可, 等到妳將基礎篇全部看完後,就重頭將基礎篇再看一遍!到時候你就會豁然開朗啦!^_^
這個 root 在 Linux 裡面的意義真的很多很多∼多到讓人搞不懂那是啥玩意兒。 如果以『帳號』的角度來看,所謂的 root 指的是『系統管理員!』的身份, 如果以『目錄』的角度來看,所謂的 root 意即指的是根目錄,就是 / 啦∼ 要特別留意喔!根目錄是整個系統最重要的一個目錄,因為不但所有的目錄都是由根目錄衍生出來的, 同時根目錄也與開機/還原/系統修復等動作有關。 由於系統開機時需要特定的開機軟體、核心檔案、開機所需程式、 函式庫等等檔案資料,若系統出現錯誤時,根目錄也必須要包含有能夠修復檔案系統的程式才行。 因為根目錄是這麼的重要,所以在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/ 等等。另外,其下重要的目錄有:
|
/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下的資料都刪除唷! |
事實上FHS針對根目錄所定義的標準就僅有上面的咚咚,不過我們的Linux底下還有許多目錄你也需要瞭解一下的。 底下是幾個在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非常類似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。這個目錄同樣不佔硬碟容量喔! |
除了這些目錄的內容之外,另外要注意的是,因為根目錄與開機有關,開機過程中僅有根目錄會被掛載, 其他分割槽則是在開機完成之後才會持續的進行掛載的行為。就是因為如此,因此根目錄下與開機過程有關的目錄, 就不能夠與根目錄放到不同的分割槽去!那哪些目錄不可與根目錄分開呢?有底下這些:
這五個目錄千萬不可與根目錄分開在不同的分割槽!請背下來啊!
好了,談完了根目錄,接下來我們就來談談/usr以及/var囉!先看/usr裡面有些什麼東西:
依據FHS的基本定義,/usr裡面放置的資料屬於可分享的與不可變動的(shareable, static), 如果你知道如何透過網路進行分割槽的掛載(例如在伺服器篇會談到的NFS伺服器),那麼/usr確實可以分享給區域網路內的其他主機來使用喔!
很多讀者都會誤會/usr為user的縮寫,其實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/src/ | 一般原始碼建議放置到這裡,src有source的意思。至於核心原始碼則建議放置到/usr/src/linux/目錄下。 |
如果/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/目錄中! |
建議在你讀完整個基礎篇之後,可以挑戰FHS官方英文文件(參考本章參考資料),相信會讓你對於Linux作業系統的目錄有更深入的瞭解喔!
由於FHS僅是定義出最上層(/)及次層(/usr, /var)的目錄內容應該要放置的檔案或目錄資料, 因此,在其他次目錄層級內,就可以隨開發者自行來配置了。舉例來說,CentOS的網路設定資料放在 /etc/sysconfig/network-scripts/ 目錄下,但是SuSE則是將網路放置在 /etc/sysconfig/network/ 目錄下,目錄名稱可是不同的呢!不過只要記住大致的FHS標準,差異性其實有限啦!
另外,在Linux底下,所有的檔案與目錄都是由根目錄開始的!那是所有目錄與檔案的源頭∼ 然後再一個一個的分支下來,有點像是樹枝狀啊∼因此,我們也稱這種目錄配置方式為:『目錄樹(directory tree)』 這個目錄樹有什麼特性呢?他主要的特性有:
好,談完了FHS的標準之後,實際來看看CentOS在根目錄底下會有什麼樣子的資料吧!我們可以下達以下的指令來查詢:
[root@www ~]# ls -l /
drwxr-xr-x 2 root root 4096 Sep 5 12:34 bin
drwxr-xr-x 4 root root 1024 Sep 4 18:06 boot
drwxr-xr-x 12 root root 4320 Sep 22 12:10 dev
drwxr-xr-x 105 root root 12288 Sep 22 12:10 etc
drwxr-xr-x 4 root root 4096 Sep 5 14:08 home
drwxr-xr-x 14 root root 4096 Sep 5 12:12 lib
drwx------ 2 root root 16384 Sep 5 01:49 lost+found
drwxr-xr-x 2 root root 4096 Mar 30 2007 media
drwxr-xr-x 2 root root 0 Sep 22 12:09 misc
drwxr-xr-x 2 root root 4096 Mar 30 2007 mnt
drwxr-xr-x 2 root root 0 Sep 22 12:09 net
drwxr-xr-x 2 root root 4096 Mar 30 2007 opt
dr-xr-xr-x 95 root root 0 Sep 22 2008 proc
drwxr-x--- 4 root root 4096 Sep 8 14:06 root
drwxr-xr-x 2 root root 12288 Sep 5 12:33 sbin
drwxr-xr-x 4 root root 0 Sep 22 2008 selinux
drwxr-xr-x 2 root root 4096 Mar 30 2007 srv
drwxr-xr-x 11 root root 0 Sep 22 2008 sys
drwxrwxrwt 6 root root 4096 Sep 22 12:10 tmp
drwxr-xr-x 14 root root 4096 Sep 4 18:00 usr
drwxr-xr-x 26 root root 4096 Sep 4 18:19 var
|
上面表格中比較特殊的應該是/selinux這個目錄了,這個目錄的內容資料也是在記憶體中的資訊, 同樣的不會佔用任何的硬碟容量。這個/selinux是Secure Enhance Linux(SELinux)的執行目錄, 而SELinux是Linux核心的重要外掛功能之一,他可以用來作為細部權限的控管,主要針對程序(尤其是網路程序)的存取權限來限制。 關於SELinux我們會在後續的章節繼續做介紹的喔!
如果我們將整個目錄樹以圖示的方法來顯示,並且將較為重要的檔案資料列出來的話,那麼目錄樹架構有點像這樣:
鳥哥只有就各目錄進行簡單的解釋,看看就好,詳細的解釋請回到剛剛說明的表格中去查閱喔! 看完了FHS標準之後,現在回到第三章裡面去看看安裝前Linux規劃的分割情況, 對於當初為何需要分割為這樣的情況,有點想法了嗎?^_^。根據FHS的定義,妳最好能夠將/var獨立出來, 這樣對於系統的資料還有一些安全性的保護呢!因為至少/var死掉時,你的根目錄還會活著嘛! 還能夠進入救援模式啊!
除了需要特別注意的FHS目錄配置外,在檔名部分我們也要特別注意喔!因為根據檔名寫法的不同,也可將所謂的路徑(path)定義為絕對路徑(absolute)與相對路徑(relative)。 這兩種檔名/路徑的寫法依據是這樣的:
而你必須要瞭解,相對路徑是以『你當前所在路徑的相對位置』來表示的。舉例來說,你目前在 /home 這個目錄下, 如果想要進入 /var/log 這個目錄時,可以怎麼寫呢?
因為你在 /home 底下,所以要回到上一層 (../) 之後,才能繼續往 /var 來移動的! 特別注意這兩個特殊的目錄:
這個 . 與 .. 目錄概念是很重要的,你常常會看到 cd .. 或 ./command 之類的指令下達方式, 就是代表上一層與目前所在目錄的工作狀態喔!很重要的吶!
例題:
如何先進入/var/spool/mail/目錄,再進入到/var/spool/cron/目錄內?
答:
由於/var/spool/mail與/var/spool/cron是同樣在/var/spool/目錄中,因此最簡單的指令下達方法為:
|
例題:
網路文件常常提到類似『./run.sh』之類的資料,這個指令的意義為何?
答:
由於指令的執行需要變數(bash章節才會提到)的支援,若你的執行檔放置在本目錄,並且本目錄並非正規的執行檔目錄(/bin,
/usr/bin等為正規),此時要執行指令就得要嚴格指定該執行檔。『./』代表『本目錄』的意思,所以『./run.sh』代表『執行本目錄下,
名為run.sh的檔案』囉!
|
某些時刻你可能想要知道你的 distribution 使用的是那個 Linux 標準 (Linux Standard Base), 而且我們也知道 distribution 使用的都是 Linux 的核心!那你如何觀察這些基本的資訊呢? 可以使用如下的指令來觀察看看啦:
[root@www ~]# uname -r 2.6.18-128.el5 <==可以察看實際的核心版本 [root@www ~]# lsb_release -a LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64: graphics-3.1-ia32:graphics-3.1-noarch <==LSB 的版本 Distributor ID: CentOS Description: CentOS release 5.3 (Final) <==distribution 的版本 Release: 5.3 Codename: Final |