2013年9月23日 星期一

第六章、Linux 的檔案權限與目錄配置

資料來源:http://linux.vbird.org/

使用者與群組

1.檔案擁有者
例如當你將你的e-mail情書轉存成檔案之後,放在你自己的家目錄,你總不希望被其他人看見自己的情書吧? 這個時候,你就把該檔案設定成『只有檔案擁有者,就是我,才能看與修改這個檔案的內容』, 那麼即使其他人知道你有這個相當『有趣』的檔案,不過由於你有設定適當的權限, 所以其他人自然也就無法知道該檔案的內容囉!



2.群組概念

當你在團隊開發資源的時候啦! 舉例來說,假設有兩組專題生在我的主機裡面,
第一個專題組別為projecta,裡面的成員有 class1, class2, class3
第二個專題組別為projectb,裡面的成員有class4, class5, class6

這兩個專題之間是有競爭性質的,但卻要繳交同一份報告。每組的組員之間必須要能夠互相修改對方的資料, 但是其他組的組員則不能看到本組自己的檔案內容,此時該如何是好?

在Linux底下可以經由檔案權限設定,限制非自己團隊(亦即是群組囉) 的其他人不能夠閱覽內容囉!而且亦可以讓自己的團隊成員可以修改我所建立的檔案! 同時,如果我自己還有私人隱密的文件,仍然可以設定成讓自己的團隊成員也看不到我的檔案資料。

另外,如果teacher這個帳號是projecta與projectb這兩個專題的老師, 他想要同時觀察兩者的進度,因此需要能夠進入這兩個群組的權限時,你可以設定teacher這個帳號, 『同時支援projecta與projectb這兩個群組!』,也就是說:每個帳號都可以有多個群組的支援呢

3.其他人的概念
因此,我們就可以知道啦,在Linux裡面,任何一個檔案都具有『User, Group及Others』三種身份的個別權限, 我們可以將上面的說明以底下的圖示來解釋:




 Linux 使用者身份與群組記錄的檔案

Linux系統中
系統上的帳號與一般身份使用者,記錄在/etc/passwd這個檔案。
個人的密碼,記錄在/etc/shadow這個檔案。
Linux所有的群組名稱,紀錄在/etc/group


Linux 檔案權限概念
[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          ]
[  權限  ][連結][擁有者][群組][檔案容量][  修改日期 ][      檔名        ]


第一欄代表這個檔案的類型與權限(permission):



第一個字元代表這個檔案是『目錄、檔案或連結檔等等』:

  • 當為[ d ]則是目錄,例如上表檔名為『.gconf』的那一行;
  • 當為[ - ]則是檔案,例如上表檔名為『install.log』那一行;
  • 若是[ l ]則表示為連結檔(link file)
  • 若是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備(可隨機存取裝置);
  • 若是[ c ]則表示為裝置檔裡面的序列埠設備,例如鍵盤、滑鼠(一次性讀取裝置)。
接下來的字元中,以三個為一組,且均為『rwx』 的三個參數的組合。
[ r ]代表可讀(read)
[ w ]代表可寫(write)
[ x ]代表可執行(execute)。 
要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。

假如是目錄,沒有權限x,代表不能進入
※目錄與檔案的權限意義並不相同

第二欄表示有多少檔名連結到此節點(i-node):

每個檔案都會將他的權限屬性記錄到檔案系統的i-node中,不過,我們使用的目錄樹卻是使用檔名來記錄, 因此每個檔名就會連結到一個i-node囉!
這個屬性記錄的,就是有多少不同的檔名連結到相同的一個i-node號碼去就是了。

第三欄表示這個檔案(或目錄)的『擁有者帳號』
第四欄表示這個檔案的所屬群組

在Linux系統下,你的帳號會附屬於一個或多個的群組中。
舉剛剛我們提到的例子,class1, class2, class3均屬於projecta這個群組,假設某個檔案所屬的群組為projecta,且該檔案的權限如圖2.1.2所示(-rwxrwx---), 則class1, class2, class3三人對於該檔案都具有可讀、可寫、可執行的權限(看群組權限)。 但如果是不屬於projecta的其他帳號,對於此檔案就不具有任何權限了。

第五欄為這個檔案的容量大小,預設單位為bytes;
第六欄為這個檔案的建檔日期或者是最近的修改日期


如何改變檔案屬性與權限
  • chgrp :改變檔案所屬群組
  • chown :改變檔案擁有者
  • chmod :改變檔案的權限, SUID, SGID, SBIT等等的特性

改變所屬群組, chgrp
要被改變的群組名稱必須要在/etc/group檔案內存在才行,否則就會顯示錯誤!
[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' <== 發生錯誤訊息囉~找不到這個群組名~

改變檔案擁有者, chown
使用者必須在/etc/passwd 這個檔案中有紀錄的使用者名稱才能改變。

[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也可以使用『chown user.group file』,亦即在擁有者與群組間加上小數點『.』也行! 
#不過很多朋友設定帳號時,喜歡在帳號當中加入小數點(例如vbird.tsai這樣的帳號格式),這就會造成系統的誤判了! 
#所以我們比較建議使用冒號『:』來隔開擁有者與群組啦!此外,chown也能單純的修改所屬群組呢! 
#例如『chown .sshd install.log』就是修改群組~看到了嗎?就是那個小數點的用途! 
常見的例子就是在複製檔案給你之外的其他人時, 我們使用最簡單的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
w:2
x:1


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

[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
@符號類型改變檔案權限
 

chmodu
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


目錄與檔案之權限意義:

@權限對檔案的重要性
  • r (read):可讀取此一檔案的實際內容,如讀取文字檔的文字內容等;
  • w (write):可以編輯、新增或者是修改該檔案的內容(但不含刪除該檔案);
  • x (eXecute):該檔案具有可以被系統執行的權限。
Linux底下,我們的檔案是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關係的


權限對目錄的重要性

目錄主要的內容在記錄檔名清單,檔名與目錄有強烈的關連啦!
  • r (read contents in directory)

    表示具有讀取目錄結構清單的權限,所以當你具有讀取(r)一個目錄的權限時,表示你可以查詢該目錄下的檔名資料。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來!
  • w (modify contents of directory)

    這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構清單的權限,也就是底下這些權限:

    • 建立新的檔案與目錄;
    • 刪除已經存在的檔案與目錄(不論該檔案的權限為何!)
    • 將已存在的檔案或目錄進行更名;
    • 搬移該目錄內的檔案、目錄位置。

    總之,目錄的w權限就與該目錄底下的檔名異動有關就對了啦!
  • x (access directory)

    咦!目錄的執行權限有啥用途啊?目錄只是記錄檔名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的x代表的是使用者能否進入該目錄成為工作目錄的用途! 所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入Linux時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)囉!

Linux檔案種類與副檔名

正規檔案(regular file )
第一個字元為 [ - ],又大略可以分為:

  • 純文字檔(ASCII): 舉例來說,你可以下達『 cat ~/.bashrc 』就可以看到該檔案的內容。
  • 二進位檔(binary):舉例來說,剛剛下達的指令cat就是一個binary file。
  • 資料格式檔(data): 舉例來說,我們的Linux在使用者登入時,都會將登錄的資料記錄在 /var/log/wtmp那個檔案內,該檔案是一個data file,他能夠透過last這個指令讀出來! 但是使用cat時,會讀出亂碼~因為他是屬於一種特殊格式的檔案。瞭乎?
目錄(directory)
就是目錄囉~第一個屬性為 [ d ]。

連結檔(link)
就是類似Windows系統底下的捷徑啦! 第一個屬性為 [ l ](英文L的小寫)
設備與裝置檔(device)
與系統周邊及儲存等相關的一些檔案, 通常都集中在/dev這個目錄之下!
通常又分為兩種:


  • 區塊(block)設備檔 :舉例來說,硬碟與軟碟等就是啦! 你可以隨機的在硬碟的不同區塊讀寫,這種裝置就是區塊裝置囉!你可以自行查一下/dev/sda看看, 會發現第一個屬性為[ b ]喔!
  • 字元(character)設備檔:亦即是一些序列埠的周邊設備, 例如鍵盤、滑鼠等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。 舉例來說,你不可能讓滑鼠『跳到』另一個畫面,而是『滑動』到另一個地方啊!第一個屬性為 [ c ]。
資料接口檔(sockets)
既然被稱為資料接口檔, 想當然爾,這種類型的檔案通常被用在網路上的資料承接了。我們可以啟動一個程式來監聽用戶端的要求, 而用戶端就可以透過這個socket來進行資料的溝通了。第一個屬性為 [ s ], 最常在/var/run這個目錄中看到這種檔案類型了。

資料輸送檔(FIFO, pipe)
FIFO也是一種特殊的檔案類型,他主要的目的在解決多個程序同時存取一個檔案所造成的錯誤問題。 FIFO是first-in-first-out的縮寫。第一個屬性為[p] 。

Linux檔案副檔名:

Linux的檔案是沒有所謂的『副檔名』的,一個Linux檔案能不能被執行,與他的第一欄的十個屬性有關, 與檔名根本一點關係也沒有
在Linux底下,只要你的權限當中具有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 端瀏覽,以得到運算後的網頁結果呢!
※從網路上傳送到你的 Linux系統中,檔案的屬性與權限確實是會被改變的喔!

Linux檔案長度限制:
在Linux底下,使用預設的Ext2/Ext3檔案系統時,針對檔案的檔名長度限制為:
  • 單一檔案或目錄的最大容許檔名為 255 個字元
  • 包含完整路徑名稱及目錄 (/) 之完整檔名為 4096 個字元。
我們希望Linux的檔案名稱可以一看就知道該檔案在幹嘛的, 所以檔名通常是很長很長!

Linux檔案名稱的限制:
由於Linux在文字介面下的一些指令操作關係,一般來說,你在設定Linux底下的檔案名稱時, 最好可以避免一些特殊字元比較好!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
檔案名稱的開頭為小數點『.』時, 代表這個檔案為『隱藏檔』喔!
由於指令下達當中,常常會使用到 -option 之類的選項, 所以你最好也避免將檔案檔名的開頭以 - 或 + 來命名啊!

Linux目錄配置
Linux目錄配置的依據--Filesystem Hierarchy Standard (FHS)

根據FHS(http://www.pathname.com/fhs/)的官方文件指出, 他們的主要目的是希望讓使用者可以瞭解到已安裝軟體通常放置於那個目錄下

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


可分享的(shareable)不可分享的(unshareable)
不變的(static)/usr (軟體放置處)/etc (設定檔)
 /opt (第三方協力軟體)/boot (開機與核心檔)
可變動的(variable)/var/mail (使用者郵件信箱)/var/run (程序相關)
 /var/spool/news (新聞群組)/var/lock (程序相關)

  • 可分享的:可以分享給其他系統掛載使用的目錄,所以包括執行檔與使用者的郵件等資料, 是能夠分享給網路上其他主機掛載用的目錄;
  • 不可分享的:自己機器上面運作的裝置檔案或者是與程序有關的socket檔案等, 由於僅與自身機器有關,所以當然就不適合分享給其他主機了。
  • 不變的:有些資料是不會經常變動的,跟隨著distribution而不變動。 例如函式庫、文件說明檔、系統管理員所管理的主機服務設定檔等等;
  • 可變動的:經常改變的資料,例如登錄檔、一般用戶可自行收受的新聞群組等。
  •  
  • / (根目錄)
    • /home (使用者放資料的地方,也就是 Windows 的 C:\Documents and settings\)
    • /etc (存放全系統設定檔的地方)
    • /media (額外磁區的位置,像是隨身碟、SD 卡會掛載到這個目錄底下,也可以想成是 Windows 的 D, E 等槽)
    • /usr (放一般通用程式的地方)
    • /opt (放廠商自己開發程式的地方,像是 EeePC 的選單程式)
事實上,FHS針對目錄樹架構僅定義出三層目錄底下應該放置什麼資料而已,分別是底下這三個目錄的定義:
  • / (根目錄):與開機系統有關;
  • /usr (unix software resource):與軟體安裝/執行有關
  • /var (variable):與系統運作過程有關。


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

所有的目錄都是由根目錄衍生出來, 同時也與開機/還原/系統修復等動作有關
由於系統開機時需要特定的開機軟體、核心檔案、開機所需程式、 函式庫等等檔案資料,若系統出現錯誤時,根目錄也必須要包含有能夠修復檔案系統的程式才行

因為根目錄是這麼的重要,所以在FHS的要求方面,他希望根目錄不要放在非常大的分割槽內, 因為越大的分割槽妳會放入越多的資料,如此一來根目錄所在分割槽就可能會有較多發生錯誤的機會。

因此FHS標準建議:根目錄(/)所在分割槽應該越小越好, 且應用程式所安裝的軟體最好不要與根目錄放在同一個分割槽內,保持根目錄越小越好。 

如此不但效能較佳,根目錄所在的檔案系統也較不容易發生問題。
有鑑於上述的說明,因此FHS定義出根目錄(/)底下應該要有底下這些次目錄的存在才好:

目錄應放置檔案內容
/bin 系統有很多放置執行檔的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。 在/bin底下的指令可以被root與一般帳號所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot 放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。

Linux kernel常用的檔名為:vmlinuz
,如果使用的是grub這個開機管理程式, 則還會存在/boot/grub/這個目錄喔!
※CentOS 有/boot/grub/
/dev 任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中的。

你只要透過存取這個目錄底下的某個檔案,就等於存取某個裝置囉~ 比要重要的檔案有/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下的資料都刪除唷!



目錄應放置檔案內容
/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:重要執行檔
  • /sbin:重要的系統執行檔
  • /dev:所需要的裝置檔案
  • /lib:執行檔所需的函式庫與核心所需的模組
這五個目錄千萬不可與根目錄分開在不同的分割槽!請背下來啊! 好了,談完了根目錄,接下來我們就來談談/usr以及/var囉!先看/usr裡面有些什麼東西:

/usr 的意義與內容:
/usr裡面放置的資料屬於可分享的與不可變動的(shareable, static)
很多讀者都會誤會/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/share/man:線上說明文件
  • /usr/share/doc:軟體雜項的文件說明
  • /usr/share/zoneinfo:與時區有關的時區檔案
/usr/src/ 一般原始碼建議放置到這裡,src有source的意思。至於核心原始碼則建議放置到/usr/src/linux/目錄下。


/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/目錄中!


針對FHS,各家distributions的異同
由於FHS僅是定義出最上層(/)及次層(/usr, /var)的目錄內容應該要放置的檔案或目錄資料, 因此,在其他次目錄層級內,就可以隨開發者自行來配置了。

舉例來說,CentOS的網路設定資料放在 /etc/sysconfig/network-scripts/ 目錄下,但是SuSE則是將網路放置在 /etc/sysconfig/network/ 目錄下,目錄名稱可是不同的呢!不過只要記住大致的FHS標準,差異性其實有限啦!


目錄樹(directory tree)

  • 目錄樹的啟始點為根目錄 (/, root);
  • 每一個目錄不止能使用本地端的 partition 的檔案系統,也可以使用網路上的 filesystem 。舉例來說, 可以利用 Network File System (NFS) 伺服器掛載某特定目錄等
  • 每一個檔案在此目錄樹中的檔名(包含完整路徑)都是獨一無二的。
好,談完了FHS的標準之後,實際來看看CentOS在根目錄底下會有什麼樣子的資料吧!我們可以下達以下的指令來查詢:

這個/selinux是Secure Enhance Linux(SELinux)的執行目錄, 而SELinux是Linux核心的重要外掛功能之一,他可以用來作為細部權限的控管,主要針對程序(尤其是網路程序)的存取權限來限制


絕對路徑與相對路徑

因為根據檔名寫法的不同,也可將所謂的路徑(path)定義為絕對路徑(absolute)與相對路徑(relative)

  • 絕對路徑由根目錄(/)開始寫起的檔名或目錄名稱, 例如 /home/dmtsai/.bashrc;
  • 相對路徑相對於目前路徑的檔名寫法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正開頭不是 / 就屬於相對路徑的寫法

 CentOS 的觀察
某些時刻你可能想要知道你的 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










沒有留言:

張貼留言