第三章﹕檔案系統


好了﹐既然您已經知道如何開機和關機了﹐下面讓我們練練基本功吧。先讓我們認識一下 Linux 的檔案系統﹕

檔案系統結構

如果您玩過 DOS 的話﹐相信這對您不是很難﹐但如果您一直以來所接觸的電腦都是 Windows 的話﹐不好意思﹐您可能需要認真操練操練才行。(這裡我要事先提醒一點的是﹕在Linux下面﹐字母的大小是有分別的﹐一定要留意哦﹗)

在 Linux 裡面﹐檔案系統都從一個稱為 root (寫作 / ) 的根目錄開始﹐離開了這個 / 一切免談就是了。在 / 下面是一些檔案子目錄﹐而子目錄下面也有其自己的檔案和子目錄﹐再下面的子目錄也一樣。整個檔案結構就像樹狀一樣﹕一切從根開始﹐然後分幹、分枝、分杈、分頁、... ﹐這樣一直延伸出去。我們稱這樣的結構為層階(hierarchy)式結構。一般的 Linux 檔案系統﹐其層階結構如下﹕

各目錄的名稱和安排﹐當然是有一定標準的﹐其功能主要如下﹕

目錄名稱 存放檔案類型
/boot 系統開機核心所需檔案
/etc 系統設定檔案
/home 使用者家目錄所在
/dev 設備檔案
/lib 函式庫檔案
/bin 一般執行檔﹐系統管理員需要
/sbin 系統執行檔﹐系統管理員需要
/usr/bin 一般執行檔﹐普通用戶需要
/usr/sbin 系統執行檔﹐普通用戶需要
/tmp 臨時檔存放目錄
/var 系統資訊/設定檔

總而言之﹐檔案系統所使用到的任何東西都以‘檔案’的形式出現﹐包括目錄本身也是一個特殊的檔案。就連所有的硬體設備﹐也必須在檔案系統上面有相對的檔案﹐比方說﹐/dev/fd0 就是系統的第一個軟碟機﹐諸如此類﹐應該找到許多例子。

Tip﹕在我們的設備檔中﹐其中有一個非常特殊的設備檔﹕/dev/null﹐null 就是什麼也沒有、什麼也不是的意思。請留意這個檔﹐我們日後會經常用到它。例如﹕用在一些命令的重導向中﹐它就好像神秘的黑洞一樣﹐將任何導向它的東西弄得無影無蹤。

檔案系統管理

先讓我們看看自己在哪吧(否則很容易迷失方向的哦)﹐我們先輸入﹕
pwd

它的意思是﹕Print Working Directory﹐也就是您目前所處的檔案系統中的位置﹐您或許會發現您正在 /root 中。這通常是您登錄後首先進入的目錄﹐也就是使用者家目錄(home directory)啦﹐每一個使用者都有其自己的家目錄。

然後﹐讓我們輸入﹕
cd ..

這個目的是 Change Directory 到上一級目錄(我們用兩點“..”表示上級目錄﹐而當前目錄則用一點“.”表示)。如果您這時候再輸入 pwd 的話(您也可以按向上的方向鍵﹐找回前面輸入的命令﹐這對長命令非常好用哦﹗)﹐您會看到當前目錄會變成了“/”﹐這是檔案系統的根目錄(因為您是從 /root/ 轉上來的)﹐所有檔案和目錄都由這裡延伸出去﹐這個您應該從前面的文章知道了吧。如果您要在檔案系統中游走﹐使用 cd 後接路徑(path)進行。

tips﹕路徑﹐就是一個檔案或目錄所在的位置﹐我們在 Linux 檔案系統中所使用的路徑一共有兩種﹕絕對路徑相對路徑。要區分這兩種路徑其實很容易﹕絕對路徑的第一個字母一定是 / ﹐否則就是相對路徑。因為整個系統只有一個 / ﹐所以對任何檔案而言﹐都只有一個絕對路徑。相對的﹐相對路徑則根據您當前的工作目錄(pwd 的結果)﹐到目標檔案的路徑。比方說﹐當前的工作目錄是在 /root/ 這裡﹐而目標的絕對路徑是 /tmp/test.txt﹐那相對路徑就是 ../tmp/test.txt (分析﹕.. 是 /root/ 的上一級目錄﹐也就是 / ﹐然後其下有一個 tmp/ 的目錄﹐然後就是目標檔案了)。再舉一個例子﹕如果目標檔案的絕對路徑是 /root/tmp/test.txt﹐那相對路徑就是 ./tmp/text﹐但是﹐通常來說﹐如果相對路徑是在當前目錄之下延伸出去的話﹐那麼這個 ./ (當前目錄)就可以省略﹐直接用 tmp/test.txt 是一樣的。

好了﹐這時候請您只輸入 cd 這個命令(不帶任何參數)﹐試試就知道了﹕哈哈﹐回家了﹗是的﹕如果輸入 cd 但不接任何路徑的話﹐您就會回到家目錄中。同時﹐家目錄的路徑也可以用“~/”來表示﹐例如您現在是用 root 登錄﹐在 /root 下面有個test.txt 檔案﹐其表示方法可以用絕對路徑﹕ /root/test.txt ﹐也可以用﹕~/text.txt (當您的身份是 root 的時候)。

好了﹐我們已經知道怎麼在檔案系統中穿梭﹐也懂得檔案的路徑了﹐下面我們就嘗試建立目錄和檔案吧。請輸入這個命令﹕
mkdir test1

這個命令的結果會在當前目錄下面 make directory ﹐新建了 test1 這個目錄。如果我們要刪除這個目錄的話﹐使用 rmdir 命令則可﹐但是﹐目錄內必須是空白的才可以﹐否則您會碰到一個錯誤信息﹐告知您要移除的目錄並不是空的。這時候﹐我們要先用 rm 命令將目錄內的檔案刪除掉﹐但有一個強制的方法是﹐使用 ‘rm -rf’來將目錄強制刪除掉。rm 這個命令(remove)基本上是用來刪除檔案的﹐-r 是 recursive 模式﹐會將目錄其下的所有檔案和子目錄刪除掉﹔通常進行 rm 的時候﹐在 Redhat 裡面預設會是 -i (interactive) 模式﹐也就是在刪除檔案之前會提出詢問﹐如果您按 y 才真正刪除﹐而 -f 則是 force 的意思﹐則不再提出詢問就直接刪除檔案。

tips﹕在 Linux 裡面執行 rm 命令﹐一旦生效是沒辦法進行‘反移除’這動作的﹐也就是說﹕如果檔案一經砍除﹐除非您有備份﹐否則就沒辦法救回。所以﹐如果您用 root 身份﹐執行 rm -rf / 的話﹐結果是將整個 Linux 系統砍光﹐呵呵~~~ 這可一點也不好玩哦﹗當然﹐您是不會故意執行這個命令的﹐但如果﹐您本來要刪除 /tmp/test.txt 這個檔案的﹐但在執行 rm 命令的時候﹐在輸入 / 符號之後手指不覺意碰了一下空白鍵﹐那您真正輸入的命令將會是 rm -rf / tmp/test.txt (注意﹕/ 和 tmp 之間有一空白鍵)﹐那就會將您的 Linux 砍得片甲不留了﹗所以﹐再一次提醒﹕日後進行管理的時候﹐除非真有需要﹐否則不要用 root 身份登入﹐如果不小心造成意外的話﹐將是災難性的。如果您是用普通帳號的話﹐您試試執行 rm -rf / 的話﹐您會發現您並沒有此權限繼續的(關於於權限的問題﹐我們緊接著就會談到)。

然後﹐讓我們進入我們剛剛建立的 test1 目錄(執行 cd test1)﹐再建立一個新目錄叫 test1-1。

完成之後請輸入﹕
ls / > test.ls

讓我們解讀這個命令﹕“ls”是 list 的意思(下面我會再講)﹔“/”應該知道吧﹖“>”呢﹐是一個重導向功能﹐用來將命令的輸出結果產生檔案﹐如果該檔案已經存在的話﹐那麼原來內容都會丟失﹔如果您想保留原有內容﹐而把輸出產生在檔案結尾部份﹐可以使用“>>”。那麼﹐上面的命令執行結果是﹕在當前目錄產生一個內容為根目錄檔案列表結果的 test.ls 檔案。(命令的重導向和管線處理我們在後面介紹)

tips﹕我們還可以用 touch test.new 建立新檔案哦。這個 touch 命令可以用來更新檔案的最後修改時間﹐如果檔案不存在的話﹐則會建立一個新的空白檔。

既然我們已經有一個檔案了﹐我們可以將之進行複製哦﹕
cp test.ls test.ls.copy

這行命令的作用是將 test.ls 進行複製(copy)﹐產生一個 test.ls.copy 的副本。

如果我們用 mv 代替 cp 的話﹐那就是為檔案改一個名字﹐原來的檔案名字會不見了﹐只有新的檔案名字。

tips﹕我們用 cp 來複製目錄的話﹐要使用 -r 的參數才行﹐否則會告訴您不能複製目錄﹔如果用 mv 來改變目錄名字﹐則無需任何參數。

我們除了 copy 和 move 之外﹐我們還為檔案產生連接(link)呢﹕
ln -s test.ls test.ls.ln

這個命令的執行結果是﹕為 test.ls 建立一個叫做 test.ls.ln 的 symbolic link

嗯﹖什麼link啊﹖

對於用慣了 dos 的朋友來說﹐這個的確不好理解。其實﹐如果您為 Window s檔案建立過捷徑(shortcut)的話﹐您會知道無論您直接點擊原檔案﹐還是點擊捷徑﹐其結果都是一樣的。Linux 下面的 link 呢﹖有點類似﹐但也很不一樣﹕如果您修改 windows 的捷徑的話(指的是對捷徑檔案的內容進行編輯)﹐您會失去了和原來檔案的連接﹐而且﹐原來的檔案絲毫也沒被改變﹔但在 Linux 裡面﹐無論您修改原檔案﹐還是修改 link﹐其內容都會同時更新的。別以為 link 很神奇﹐說穿了﹐只不過是一個檔案具有多個名字罷了。比如說﹐我的名字叫 Kenny﹐但我在網路上使用的名字則為 netman﹐但所指的其實都是同一個人而已﹐您可以將 netman 看成是 kenny 的一個 link。

tips﹕在 Linux 的檔案系統上面的 link 有兩種﹕hard linksoft link﹐後者也叫 symbolic link。其兩者都是 link﹐那分別在哪裡呢﹖

所有檔案要存放在磁碟上面﹐都必須先獲得一個 i-node (這個我們後面會談到)﹐然後 inode 會告訴系統檔案存放在磁碟的哪個位置上面。如果用 hard link 的話﹐檔案會使用同一個 inode﹐其指向的磁碟位置和原來的檔案位置一樣﹐而這個 inode 會更新其 link 指標( link count )﹐hard link 越多﹐指標越多。這樣的情況之下﹐所有 hard link 都是平等的。如果要從磁碟上移除這個檔案所佔據的空間﹐那必須要將它所關聯到的所有 hard link 都砍光(link count 為 0 )﹐才可以進行﹔換句話說﹕如果我為檔案 A 建立一個 hard link 為檔案 B﹐然後我將 A 砍掉﹐但磁碟空間還是存在的﹐因為仍有 B 與之關聯﹐假如 B 是最後一個 hard link 了﹐這時將 B 砍掉﹐那麼這個磁碟空間就會被釋放出來。我們可以將所有檔案都看成是 hard link ﹐不同的檔案 hard link 到不同的磁碟空間去﹔但也允許不同的檔案 hard link 到同一個磁碟空間上面。

那 soft link 又是什麼呢﹖和 hard link 不一樣的地方是﹕它會建另一個 inode ,但不指向相同的磁碟空間﹐而是單純的指向原來的 file name 而已﹐如果原來的 inode 移除了﹐那這個 link 就變為無主孤魂了﹐也就是所謂的 dead link 是也。就好比宋七力有一個本尊﹐同時也有好些分身﹐但如果一旦本尊毀掉﹐那分身也跟著滅亡﹐道理是一樣的。

不如再以例子來比喻吧﹕判定一個人的身份﹐其實不是以他的名字為依據﹐準確來說是以他的出生時間、地點、父母、性別為依據。由某父某母在某地某時所產的男或女這麼一個人﹐其名字或許有許多個。例如我父母當初給我一個本名﹐後來取了個洋名叫 Kenny (護照資料上的父母、出生資料都沒變)﹐再後來還在網路上自稱 netman (這可完全沒有父母和出生資料哦﹐只知道是從 kenny 那名字來的)。其情形就有點像這樣﹕我為本名建立 hard link 叫 kenny ﹐然後為 kenny 建立一個 soft link 叫 netman 。就算我今天宣佈我不再使用本名了﹐但別人還是可以用 Kenny 和 netman 稱呼我﹔但如果我宣佈保留本名但不再使用 kenny 這個名字呢﹖那別人還是可以用本名稱呼我﹐但那個 netman 就不知道何許人也了。

關於 hard link 和 soft link 的另外一個分別是﹕hard link 必須建立在 同一個 partiton 上面﹐而且不能用在目錄上面﹔soft link 則可以跨越 partition 界限﹐同時可以用在檔案和目錄上面。

為什麼我們要用 link 呢﹖理由很多﹕

  • 首先﹐可以節省空間﹐如果您用 cp 來複製一個檔案﹐但是副本也是一個新的檔案﹐那會佔掉額外的磁碟空間。
  • 其次﹐如果您對 cp 的副本進行修改﹐那只有副本得到更新而已﹐原來的檔案內容依然是舊的。如果您產生了許多個副本﹐那您要進行修改的時候﹐必須要對所有副本進行修改才能得到同步﹔但如果用 link 呢﹖修改任何一個 link 就能讓所有 link 獲得同步了。
  • 再來﹐對系統安全也有幫助﹕在 Linux 檔案系統裡面﹐所有目錄和檔案都有著嚴密的權限設定。如果您建立了一個檔案在一個限制嚴密的目錄裡面﹐別人要想修改它是不可能的﹐甚至連讀取也不能夠。如果有某些檔案必須要讓別人或系統讀取的話﹐比方說要架設網頁伺服器好了﹐您可以在伺服器讀取的目錄中建立 link 就可以了。
  • 除此之外﹐為一些程式設定檔建立 link 再放在某些特定的目錄之下﹐在管理上來說也是非常方便的。
tips﹕如果您仔細看看 /dev/cdrom 這個檔﹐其實就是一個 soft link﹐指向真正的磁碟位置上。這樣﹐您的掛載程式只需使用統一的設備名稱就可以了﹐如果 CDROM 換了個位置﹐那修改 link 就可以了﹐而無需逐個的修改掛載程式。比方說﹐CDROM 從 hdb 換成 hdd ﹐那麼只要執行如下的命令 ln -sf /dev/hdd /dev/cdrom 就可以了。

好了﹐我們知道在 /root/test1 這個目錄下面﹐有目錄﹐有檔案﹐還有 link 。現在﹐讓我們輸入﹕
ls

ls 是 List 的意思﹐應該是最常用的命令之一。如果 ls 的對象是目錄﹐那麼目錄的內容就會列出來﹐假如您想看目錄本身的資訊(而不是它的內容)﹐可以加上 -d 的參數。另外﹐您也可以用這個命令來確定檔案的存在﹕
ls test*

您會看到所有以 test 開頭的檔案(包括目錄)都會被列出來。這裡使用的‘*’我們稱之為“通配字符(wildcard)”﹐除了 * ﹐我們還可以用 ﹖ 和 [ ] 來查找特定檔案﹐如果您靈活運用﹐可以列出許多您指定的檔案﹕
字符 代表意思
* 任意字串(無、一個、或多個)
單一字母
[a-z] 任意單一小寫字母
[A-Z] 任意單一大寫字母
[a-bA-Z] 任意單一字母﹐包括大小寫
[ABC] 或 A、或 B、或 C
[AB][AB] 或 AA、或 AB、或 BA、或 BB
[0-9] 任意單一數字
[!0-9] 非數字的任何字母

假設目錄裡面有如下這些檔案﹕

AABBCCDD
BBBDDAA
ABBBCCAA
Aabbccdd
Bbccddaa
aabbccdd
bbccddaa
cabbccdd
ccbbccdd
123abc
bcd123

那麼﹐我們分別執行如下的命令﹐可得到相應的結果﹕
命令  顯示結果
ls A* AABBCCDD、 Aabbccdd、Aabbccdd
ls A?B* AABBCCDD、ABBBCCAA
ls [AB]* AABBCCDDBBBDDAAABBBCCAAAabbccddBbccddaa
ls [ab]* aabbccdd、bbccddaaa、bc123
ls [abc][ab]* aabbccdd、bbccddaa、cabbccdd
ls [0-9]* 123abc
ls [!0-9]* AABBCCDD、BBBDDAA、ABBBCCAA、Aabbccdd、Bbccddaa、aabbccdd、bbccddaa、cabbccdd、ccbbccdd、bcd123

通常﹐使用 ls 是看不到那些以“.”開頭的檔案的﹐在 Linux 系統中﹐這些檔案是隱藏檔﹐您要用 ‘ ls -a’才能將它們顯示出來。不過﹐系統之所以要將檔案隱藏起來﹐當然是有其原因的。通常這些檔案都是系統使用到的﹐而不大希望使用者對它們進行修改。但是﹐如果您的系統遭到入侵被植入後門程式﹐它們也通常會以隱藏檔案存在的啦。

檔案權限屬性

使用 ls 命令之後﹐您會看到目錄內容會以行列的形式列出來﹐不過﹐除非您原先就知道它們是什麼﹐否則您也看不出究竟哪一個是目錄﹐哪一個是檔案(不過﹐現在的 Linux 會用不同的顏色來表示不同的檔案﹐這樣也直觀多了)。如果您需要更詳細的信息﹐可以加上 -l 的參數﹕
ls -l

這時後﹐您會看到這樣的結果﹕
-rw-r--r--   1 root  root   103 Oct 27 22:09 test.ls
-rw-r--r--   1 root  root   103 Oct 27 22:37 test.ls.copy
lrwxrwxrwx   1 root  root     7 Oct 27 22:37 test.ls.ln -> test.ls
drwxr-xr-x   2 root  root   024 Oct 27 22:37 test1-1   

這裡﹐我們得到的信息明顯多了許多。首先讓我們看看第一列的意思﹕在句子開頭共有10 字母空位可提供檔案的一些屬性信息。第一個如果是‘-’的話﹐表示這是一個常規檔案﹐如果是‘d’的話表示這是一個目錄﹐如果是‘l’的話﹐表示這是一個 link﹔接著其後的 9 個字母﹐分為三組﹕分別是分配給‘user (擁有者)’、‘group (群組)’、和‘others (其他使用者)’這三個不同使用者群的權限﹔而其中每一組使用者可以擁有這些權限﹕‘r’表示 readable (可讀)、‘w’表示 writable (可寫)、和‘x’表示 executable (可執行)。

跟著是一個數字﹐是關於這個檔案的 hard link 數目。目前為 1 ﹐也就是說它只有一個 hard link 而已﹐也就是最後一個。如果這個檔案被刪除掉﹐那麼它所佔據的磁碟空間就會釋放出來。

接下來我們看到 root root 這兩列﹐分別表示‘user’和‘group’是誰。user 會是系統的其中一個使用者﹐通常是建立這個檔案的使用者﹐而 group 則是該 user 所屬的群組。通常﹐一個 group 可以包括好些 user 在內﹐同時﹐一個 user 也可以從屬於好幾個 group 之中。無論是 user 或 group﹐都必須由系統管理員來建立或刪除。

至於再後面數列﹐是檔案的一些資料﹕大小和修改日期﹐最後則是檔案名稱。

那麼﹐我們看看第一行﹕

我們可以獲得這樣的信息﹕首先﹐這是一個檔案﹐它的擁有者 root 對這個檔案具備‘讀(r)’和‘寫(w)’的權限﹐而屬於 root 這個群組的組員﹐都只具備‘讀(r)’的權限﹐其他的使用者也只具備‘讀(r)’的權限。

當您得到一個檔案的時候﹐會根據您目前的身份(可以用 id 命令查詢)來判定您對該檔案擁有的權限。如果您就是該檔案的擁有者﹐那您就獲得 user 相關的權限﹔如果您不是它的 user﹐那麼看您是否屬於這個 group 裡面﹐然則您就獲得 group 的權限﹔如果您既不是 user﹐也不在 group 裡面﹐那您就獲得 others 的權限了。

我們這裡看到的權限設定為內建值﹐也就是該檔案被建立起的時候就是這樣設定的了。不過﹐我們可以改變這些設定哦~~~﹐下面讓我們輸入這幾個命令﹕
chmod u+x test.ls
chmod g+wx test.ls
chmod o+x test.ls

或是合為一句﹕
chmod u+x,g+wx,o+x test.ls

這個 chmod 命令是 change mode 的意思﹐第一行是為 user 增加 x 權限﹐第二行是為 group 增加 w 和 x 權限﹐而第三行則是為 others 增加 x 權限﹐如果您這時候再使用 ls -l 的話﹐您會看到 test.ls 的權限會變成﹕rwxrwxr-x 這樣的權限值了。我們使用“+”來增加權限﹐如果使用“-”是刪除權限﹐如果使用“=”則是指定權限值。不過﹐您是否覺得這樣輸入命令很麻煩呢﹖有沒用更方便的辦法啊﹖答案是﹕有的﹗現在﹐請您輸入這樣的命令﹕
chmod 777 test.ls

您會看到test.ls的權限會變成﹕rwxrwxrwx﹐也就是所有使用者都具備所有權限了﹐因為我們給每一個使用者群都賦予‘7’這個數值﹐它分別是﹕1(x)+2(w)+4(r)的總和﹐如果是‘0’的話﹐就表示沒用任何權限。但事實上﹐權限值並的真正計算方法是以二進位進行的﹕

先讓我們看看 x,r,w 的 bit 位元表示方式﹕

x: 001
w: 010
r: 100
如果將全部位元做 OR 運算就是最終 permission﹕rwx 的位置都是 111 ﹐換成十進位就是 7 了。

下面您如果輸入﹕
chmod 750 test.ls

您會發現權限會變成﹕rwxr-x---﹐至於為什麼會如此﹐不妨算算看﹕

1) 將 750 換成二進位﹐就是﹕111,101,000
2) 分別將 rwx 的位置代入得﹕rwx,r-x,---
(方法﹕1 對應著的權限就打開﹐0 對應的就關閉)
就這麼簡單 ^_^

好了﹐我們剛纔已經會得計算自己對一個檔案擁有什麼樣的權限﹐也知道如何改變檔案的權限設定。但是﹐檔案被建立的時候﹐預設會獲得怎樣的權限呢﹖這個值就要靠 umask 來決定了。如果您現在輸入 umask﹐會得到 022 的值﹐這個值決定了檔案在建立的時候﹐要拿掉什麼樣的權限。在沒有使用 umask 的時候﹐所建立的檔案都是 777 這個值的﹐但當運用了 umask 之後呢﹐目錄會變為 755﹐而檔案則為 644 。那是怎麼得出來的呢﹖還是回到二進位吧﹐然後將完整權限和 umask 進行 NOT 和 AND 運算﹐就是最後的權限值。

在建立目錄的時候﹕
1) 首先﹐我們先對 unmask 進行 NOT 運算﹕
000,010,010 的 NOT 運算結果是﹕111,101,101 ﹔
2) 然後再和 777﹐也就是﹕111,111,111 進行 AND 運算﹔
3) 最後﹐我們會得到這樣的結果﹕111,101,101 ﹔
換成十進位就是 755。

而至於檔案的建立﹕
預設會把它的 x (001) 拿掉﹐其實也是先進行 NOT + AND 運算﹕
1) 先對 x 做 NOT 運算﹕001 NOT ==> 110
2) 然後和 111 做 AND 運算﹕
111,111,111
110,110,110  AND
-----------------
110,110,110      ===> 也就是 666﹐ 然後再和 umask 022 做 NOT 跟 AND 運算﹕
111,101,101  AND
-----------------
110,100,100      ===> 換成十進位是 644 ﹐這才是真正的結果。

我們的 umask 值是登入的時候﹐由 shell 的 profile 分配的(一般規則是:user 與 group 同名為 022﹐否則是 002)﹐我們可以在任何時候改變這個值﹕用 umask 命令以新的值作參數就可以了﹐如﹕umask 002 ﹐然後新建立的檔案就變成 664 的權限了。

tips﹕如果您不習慣用二進位進行計算﹐只能用十進位來算的話﹐可以簡單的這樣算﹕
目錄是用 777 扣掉 umask 的值﹔
檔案是用 666 扣掉 umask 的值。

不過﹐電腦上面真正的運算是二進位啦﹐這個和我們計算 IP subnet 的時候是一樣的原理。

不信﹖不妨用 033 的 umask 玩玩 ﹐看看會產生什麼樣的權限呢﹖

此外﹐我們不但可以改變檔案的權限﹐還可以使用 chown 來改變 user 和 group (也可以使用 chgrp 來單單改變 group)﹕
chown user1.group1 test.ls

這命令通常由 root 來執行﹐用“.”(或 : )將擁有者和群組分隔開就可以了﹐當然﹐user 和 group 必須要事先被建立好了的。

權限對目錄和檔案的影響有時候不盡相同。r 和 w 應該一樣﹐都是可以進行讀取和寫入(或修改)﹐但 x 則不一樣了﹕ x 對目錄而言﹐是具有查找的能力﹔而對檔案而言﹐則是可執行程式。例如﹕當您要建立、讀取、寫入一個檔案(或子目錄)的時候﹐從 / 到當前目錄所經過的所有目錄﹐都必須有 x 權限﹐而當前目錄則按照不同的行為具備不同的權限﹕建立需要 wx、讀取需要 r、寫入需要 w 。

用 chmod 和 chown 來改變一個目錄權限的時候﹐如果加上 -R 參數﹐那麼﹐目錄裡面的檔案和子目錄﹐都會更著被修改。有時候會很方便﹐但也非常冒險﹗小心使用就是了。

tips﹕例如﹐有些朋友在架設網頁伺服器的時候﹐明明已經建立好目錄和網頁了﹐為什麼還不能顯示﹖這是因為伺服器通常以 nobody 身份來讀取檔案系統的﹐如果從 / 到您存放網頁的目錄之間﹐只要其中一個目錄﹐對 others 來說沒有 x 的話﹐那就讀取不到網頁了。所以﹐當找到哪一個目錄沒有 x 權限﹐通常用 chmod o+x 就可以解決問題。

或者﹐您會在其它一些 chmod 範例中會看到用 4 個數字來設定權限的﹐比方說﹕chmod 1777 /tmp 。您或許會好奇究竟第 4 個(從右往左)數字代表什麼意思呢﹖

非常好的問題﹗不過﹐在解釋這個數字之前﹐先讓我們再認識兩個概念﹕SUIDSGID 。UID 和 GID 您應該知道了吧﹖您執行 id 這個命令就可以看出來自己是的 ID 是什麼。當您在 Linux 系統上面執行一個檔案的時候(具有 x permission)﹐這個檔案所執行的程式﹐所具備的權限﹐就以執行者的 ID 為準﹕如果您是 root﹐那麼這個程式也是以 root 的權限執行﹔如果您是 user1﹐那就以 user1 的權限執行。但如果﹐一個執行檔還具有 SUID 屬性的話﹐那這個程式所具有的權限﹐就不是命令的執行者﹐而是檔案的擁有者﹕如果一個檔案具備 SUID 屬性﹐它的 user 和 group 都是 root﹐而且 others 也具有 x 權限﹐那麼﹐當 user1 執行這個檔案的時候﹐程式所具有的權限就不是 user1 而是 root﹗同樣﹐如果 SGID 也打開了﹐那麼這個程式也具有檔案之 goup 群組相同的權限。

這樣的設計﹐是讓一些普通使用者以檔案擁有者的權限去執行某些程式。例如﹕某些程式﹐如 passwd (您不妨輸入 ls -l /usr/bin/passwd 看看)﹐需要寫入檔案系統中使用者本身不能存取的位置(如 /etc/shadow)﹐如果沒有 SUID 和 SGID 屬性﹐那這樣的設計是沒辦法做到的。不過﹐這樣的設計﹐也同時帶來了系統上的安全威脅。比方說﹕系統被植入一個擁有者為 root 的後門程式﹐它能抓取只有 root 才能讀取的密碼檔案。如果在沒有 SUID 的情況之下﹐就算是一般用戶執行它﹐也沒辦法達到目的﹐因為程式只具備一般用戶的身份而已﹔但如果這個程式有設定 SUID﹐就算一般用戶執行它﹐也能得逞﹗

有鑒於此﹐在我們使用的 shell script (我們後面再介紹)﹐預設上是取消 SUID 和 SGID 屬性的﹐就算您設了﹐shell 也不會執行它就是了。那麼﹐您或許會問﹕我們如何設定 SUID 和 SGID 呢﹖呵呵~~ 就是剛纔我們提到的 chmod 的第 4 個數字了﹕如果是 4 就是 SUID﹔如果是 2 就是 SGID﹔如果是 1﹐則為檔案設上一個特殊標籤﹕sticky bit (黏著位元)﹐當這個標籤打開的時候﹐只有檔案的擁有者才能刪除這個檔案(root 除外)﹐其它使用者就算具有 w 的權限﹐也只能修改檔案的內容﹐而不能將檔案刪除。如果一個目錄具有這個位元﹐那麼其下所建立的檔案﹐也具有這個屬性。

讀者不妨參考 Edward 兄的說明﹕
Edward G.J. Lee  wrote in message news:3g6A8i$GfM@bbs.ee.ntu.edu.tw...
> : > 請問chmod 指令中的特殊權限(SetUID、SetGID、sTicky)有何作用????
> : suid 應該是執行該程式,該程式會擁有其擁有者的權限。
> : 例如 aaa 擁有者是 root,而有 suid 權限,則執行它時,aaa 會擁有 root 的權限。
> : 如果此時 aaa 進行的動作是 rm -rf /,就爽了。  ~:Q
> : sgid 比較不清楚,意義類似?
> [...]
> 
>   對目錄而言,setuid 是沒有意義的,而 setgid 則會在該目錄下開檔時
>   擁有與該目錄相同的 group。
> 
>   對檔案而言,就比較複雜,非 script 的可執行檔如上述的作用,會轉變
>   身份為檔案擁有者或檔案群組。非可執行檔,則 setuid 沒有意義,但
>   setgid 則牽涉對該檔案的鎖定都是 mandatory locking 的作用,而非
>   advisory locking。
>   * 請參考:/usr/src/linux/Documentation/mandatory.txt。
> 
>   sticky bit 對檔案而言,在 Linux 是沒有作用的,會被忽略。
> 

事實上﹐您除了可以設定檔案的權限( permissions ) 之外﹐還可以設定檔案的屬性( attributes )。和 chmod 命令一樣﹐您可以使用 chattr 命令來改變一個檔案或目錄的屬性。常用的屬性大概有這些﹕

屬性 代表意思
a 在寫入的時候﹐只能延增﹐不能刪除現有內容。
c 核心會自動執行壓縮。
i 不能刪除、移動、link、寫入。
s 檔案刪除時﹐磁碟空間也會清理乾淨。
S 修改時直接寫入磁碟﹐而不是寫在 buffer 中。

善於運用檔案的屬性設定﹐可以更好的確保檔案的使用習性。例如﹐您或許不希望任何人修改 /bin 和 /sbin 裡面的檔案 (因為木馬程式通常都會修改那裡)﹐那您可以執行﹕
chattr +i /bin /sbin

然後﹐您試試在 /bin 和 /sbin 裡面新增或刪除檔案﹖應該不會成功的﹗如果您要看檔案或目錄的屬性﹐可以用 lsattr 命令﹕
lsattr -d /bin /sbin

如果拿掉 -d 就是看一般的檔案(和 ls 命令一樣)。而至於具體的屬性有哪些呢﹖您可以用 man chattr 來了解。

檔案系統掛載 (Mount)

所有的檔案都存在不同的 partition 裡面﹐但 Linux 的檔案系統和 DOS 或 Windows 的不太一樣﹕在 DOS (或 windows) 裡面﹐每一個 partition 都有各自的磁碟代號﹐從 C﹕開始一直到 Z﹕﹐超過了就讀不到了。在每一個磁碟代號裡面﹐都各自有其獨立的根目錄和子目錄﹐您必須明確指定哪一個磁碟代號才能找到相關檔案。而在 Linux 裡面呢﹖根本沒有磁碟代號這玩意﹐一切萬物都從 / 開始﹐/ 必須有自己的獨立的 partition﹐但其它 partition 則一律掛在 / 下面的目錄或子目錄中﹐我們稱這些用來掛載 partition 的目錄為 mount point﹐而將這些 partition 掛入相應的 mount point 的動作稱為 mount (掛載)。在掛入新的 parition 的時候﹐是無需重新開機的﹐任何時候都可以進行。當 partition 不再使用的時候﹐您也可以將之進行卸載(umount)。

當然﹐在進行掛載的過程中﹐有一些規則我們是必須遵守的﹕

  • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
  • 其它 mount point 必須為已建立的目錄﹐可以任意指定﹐但一定要遵守必須的系統目錄架構原則。
  • 所有 mount point 在同一時間之內﹐只能掛載一次。
  • 所有 partition 在同一時間之內﹐只能掛載一次。
  • 如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。

比方說﹐按照前面的安裝規劃﹐我們的 / 是掛載於 hda6 上面﹐而 /boot 則掛載於 hda2 上面。這是開機的時候就會掛載好的﹐其設定寫在 /etc/fstab 檔案中﹕
LABEL=/                 /                       ext2    defaults        1 1
LABEL=/boot             /boot                   ext2    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/pts                devpts  gid=5,mode=620  0 0
/dev/hda5               swap                    swap    defaults        0 0

這個檔案的語法﹐應該是 RedHat 7.x 系統上面才開始使用的﹐和以前的舊系統比較﹐最大的分別就是在這裡使用 LABEL﹐代替了原來的設備檔名稱(比較第一行和最後一行的最左邊)。這裡的 LABEL=/ 也就是 /dev/hda6﹐而 LABEL=/boot 則是 /dev/hda2。我們不妨執行行如下命令看看﹕
e2label /dev/hda6
e2label /dev/hda2

如果這時候﹐我們有其它 partition 要掛載進來﹐我們就可以用 mount 這個命令了。但在執行 mount 之前﹐我們必須確定作為 mount point 的目錄已經建立好。如果目錄已經存在﹐並且其下已經有檔案和子目錄﹐那就要小心了﹕一旦被 mount 到新的 partition 上面之後﹐mount point 的內容將變為新 partition 上面的內容﹔而原來的內容將‘暫時隱形’﹐直到我們進行卸載之後才恢復過來。所以﹐我們儘量用空目錄來做 mount point﹐目錄所在位置在哪裡都行﹐不一定要在 / 底下 (和 windows 的磁碟代號一定要直接在‘我的電腦’之下不同哦~~)。通常﹐我們會發現 / 底下有一個 mnt 的目錄﹐按慣例﹐我們都會將 mount point 置於其下(當然這不是硬性如此的)﹐如果 mount point 還沒建立﹐我們可以用 mkdir 來建立。

我們在安裝的章節裡面已經知道 linux 的 partition 代號的命名規則了﹐只要您確定了哪個 partition 要掛載﹐並且該 partition 和 mount point 還沒有被 mount 起來﹐就可以進行掛載了。先假設我們要 mount 的 partition 是 hdb1﹐而 mount point 為 /mnt/my_mount ﹐那麼我們的命令將會如此﹕
mount -t ext2 /dev/hdb1 /mnt/my_mount

關於這個命令﹐其中的 -t 選項是用來指定檔案系統格式的﹐如果 hdb1 是用 linux 的 ext2 格式來 format 的話﹐那就是 -t ext2 ﹐不過﹐這也是預設值﹐如果沒有指定 -t 那就是 ext2 了。如果您要掛載的檔案系統是 windows 98 的 FAT32 格式﹐那您就要改用 -t vfat ﹔假如是 dos 格式的話﹐則換為 -t msdos。

如果我們要讀取 CDROM﹐那我們也必須先將光碟機掛載進來才可以讀取﹕
mount -t iso9660 -o ro /dev/hdd /mnt/cdrom

這裡﹐光碟機是放在第二個 IDE 的 Slave 位置上﹐mount point 則是系統在安裝的時候就建立好的﹐而 iso9660 是 CDROM 的標準格式﹐但如果您不指定 -t ﹐系統也通常能讀取正確的 CD 格式的﹐至於 ro 這個 option﹐設與不設在目前這個例子中沒什麼分別﹐因為光碟本來就是 Read Only 的﹐只是如果不設﹐系統在成功掛載之後會告訴我們 device /dev/xxxx is write-protected 而已。

tips﹕如果您再仔細檢查 /etc/fstab 這個檔案﹐您或許會發現這麼一行﹕
/dev/cdrom              /mnt/cdrom      iso9660 noauto,owner,ro 0 0

如果有這行設定﹐您以後要掛載 CDROM 的話﹐只要輸入 mount /mnt/cdrom 就可以了﹐因為相關參數都已經在這裡指定了﹐方便吧﹗ ^_^

當我們掛載好 CDROM 之後﹐cd /mnt/cdrom 就可以讀取裡面的內容了﹐好方便哦~~~ 當您完成讀取之後﹐只要輸入 umount /mnt/cdrom 就可以將 mount point 卸載出來。不過﹐如果您這時候執行這個命令的話﹐系統應該會告訴您﹕device is busy ﹗那是因為您 cd 之後的工作目錄在 mount point 裡面的緣故﹐只要您 cd (回家)然後再執行這個命令就可以了。

我們這裡再介紹一個 chroot 命令。這是一個非常好用的工具﹐透過它﹐我們可以在不同的 root partition 進行切換。嗯﹖什麼意思啊﹖

不如用一個實例來說明好了﹕比方說﹐今天我有裝了兩個 Linux﹐其中的一個 / 在 hda6﹐而另一個 / 在 hdb1。兩個系統都可以進入﹐現在我在 hdb1 的系統上面﹐然後進行核心編譯工作﹐因為太過自信﹐沒有建立開機片﹐等重新開機之後﹐發現竟然不能再進入 hdb1 這個系統了﹐那怎麼辦﹖這時候﹐我們可以先進入 hda6 這個系統裡面﹐然後將 hdb1 掛載到 /mnt/my_mount 上面(這些您應該都會做了吧﹖)﹐然後 cd /mnt/my_mount﹐您可以用 pwd 來確定一下當前目錄﹐接著執行 chroot . 這個命令。這樣﹐我們就可以‘臨時性’的將 / ‘變’到 /mnt/my_mount 上面﹐這時候您再輸入 pwd 的話﹐您就發現已經變成 / 了。換一句話說﹐原來的 /mnt/my_mount/etc/lilo.conf 就會變成 /etc/lilo.conf ﹐懂了嗎﹖當您完成這個系統的修復之後﹐輸入 exit﹐就回到正常的當案系統了﹐怎樣﹖神奇吧﹗^_^

設定開機時的掛載

有時候﹐因為系統的擴充需要﹐我們會為系統增加新硬碟。比方說﹐今天我們的 /usr 目錄下面有存放了太多東西﹐快要把硬碟塞滿了﹐或是說我們想將 /home 獨立出來﹐進行 quota 設定(這個我們後面再談)﹐等等諸如情形﹐新增一個硬碟或許是一個不錯的解決辦法。下面﹐讓我們看看怎樣把 /home 目錄重新掛到新的硬碟上面吧﹕

我們在“學習電腦”中已經知道﹐要使用新硬碟都必須經過兩個步驟﹕先進行 fdisk﹐然後進行 format。要在 linux 下面進行 fdisk (假設目標是第一個 IDE 的 slave )﹐可以輸入:
fdisk /dev/hdb
(然後具體步驟請參閱前面的“安裝 Linux”)

tips﹕當新硬碟完成 fdisk 之後﹐最好重新啟動機器﹐以讀入更新後的硬碟資訊。

如果硬碟分區一旦切割好﹐要改變其大小可不容易﹐不小心會讓整個分區的資料都毀掉。市面上或許有一些工具可以對 Windows 的分區進行 resize 的動作﹐而在 linux 上面也有同樣的工具。不過﹐我這裡就不介紹如何使用了﹐有興趣的話﹐請到這個網頁看看﹕The GNU Parted

在 DOS 下面要格式化磁碟﹐是使用‘format’命令﹐在 Linux 下面呢﹖卻使用‘mkxxxfs’命令哦﹐其中的‘xxx’為檔案系統類型﹐例如﹐mkdosfs 就會將磁碟格式為DOS 檔案系統了。在 Linux 下面的檔案系統通常會是 ext2﹐我們可以用 mke2fs 來格式化。

例如﹐如果我們要格式化第一個 IDE 的 slave 硬碟第一個邏輯分區﹐我們可以這樣輸入﹕
mke2fs -c /dev/hdb5

其中的‘-c’參數會讓程式在格式化同時對磁碟進行壞軌檢測﹐不過﹐這樣比較需時﹐如果要快速進行格式化﹐通常不使用。

tips﹕您可以 man mke2fs 看看這個命令的其它選項﹐例如﹐我們有時候或許需要使用到 -b-i 參數﹕

資料的寫入是以 block 為單位的﹐-b 則用來設定每一個 block 的大小(以 byte 為單位)﹐預設的 block size 視檔案系統用途而定(一般為 1024 byte)。 假如其值為 4096byte﹐然後寫入一個 5K 的檔案﹐將會佔掉兩個 block﹐而其中會浪費掉大於 3K 的空間﹔如果 block size 為 2048﹐同樣的檔案則會佔掉 3 個 block ﹐但只浪費 1K 空間而已。不過﹐block size 越大﹐讀寫速度也越快﹐因為磁碟的磁頭移動位置都比較集中。block 的可用數目是磁碟容量除以 block size 的商數。(您可以用 df 命令來檢查磁碟的 block 使用情況)

不過﹐單純這樣的考量是不夠的﹐我們還必須和另外一個概念聯係起來﹕i-node﹐也就是 index node 的簡稱。在 linux 的檔案系統上面﹐當檔案要儲存在硬碟的時候﹐必須要分配到一個 i-node 指標﹐以指示它存放在硬碟上的實體位置﹐以及其它的一些資訊。i-node 的數量是有限的﹐在 mke2fs 的時候可以用 -i 來指定 i-node 的大小( bytes-per-inode, 通常不能少於 block size 的)﹐預設是 4K﹐那實際上的磁碟 i-node 數量就是磁碟容量除以每個 i-node 大小的商數。(您可以用 df -i 來檢查 i-node 的使用情況)

簡而言之﹕i-node 是能夠寫入的檔案數量﹐而 block 則是檔案寫入磁碟的最小儲存單位。如果 i-node 和 block 兩者之一被用光的話﹐然後磁碟就不能再寫入了。比方說﹐您的磁碟是 4096000K 容量好了﹐其 block size 為 1024byte、 inode 數目是 1000 個。如果此時有兩個分別為 2048000K 的檔案要寫入﹐那一下子所有 block 就用光了﹐那剩下的 998 個 inode 空著也沒用﹔但如果反過來﹐每個檔案都只佔 2K ﹐但因為 i-node 只有 1000 個﹐換句話說﹐您最多只能寫入 1000 個檔案而已﹐也就只會用掉 2000K 的容量﹐剩下的 4094000K 也只能空著囉。

所以﹐block size 和 i-node 數目的設計有時候會影響到 partition 的分配。比方說﹐我要架設 news server﹐事實上每一篇文章的大小都只是 1K 或 2K 而已﹐如果按預設的數值來進行格式化﹐那會造成許多 block 的浪費。這時候我們可以專門用另外一個 partition 來作為 news 文章的存在 mount point (/var/spool/news)﹐將 block size 和 i-node(bytes-per-inode) 調小一點﹐這樣﹐磁碟的使用率就比較高了。事實上﹐還有其它多方面的考量﹐等您日後慢慢組織心得了。如有疑問﹐不妨 man mke2fs 仔細看看。

當硬碟準備妥當之後﹐我們要將硬碟 mount 進來才可以使用﹕
mount /dev/hdb5 /mnt/my_mount

因為我們打算用這個 partition 來作為我們新的 /home 目錄﹐等掛載好之後﹐就要將原有的 /home 目錄內容複製過來﹐您可以執行這個命令﹕
cp -af /home/* /mnt/my_mount

tips﹕因為我們這裡要轉移系統相關的目錄﹐如果在這過程中﹐其它使用者更新了原有目錄的內容﹐那在我們完成轉移之後﹐可能出現不同步的現象。為了避免出現這種情形﹐最好是開機到單人模式裡面工作﹐或是暫時將網路服務連接關閉。

上面這個動作﹐是將原本在 / 底下的 home/ 目錄內容灌到新的 partition 上面。完成複製之後﹐我們可以參考前面看到的 /etc/fstab 這個檔案﹐進行一些修改﹐讓機器在重新開機的時候﹐將 /home 掛在新的位置上﹕
vi /etc/fstab
(vi 的使用方法我們以後再介紹)

您只要在該檔案裡面加入﹕
/dev/hdb5  /home	ext2  efaults    0 2  

前面數項相信不難理解﹐最後三項可能比較模糊﹐我就簡單說說吧﹕

  • /dev/hda5 是 parition 所在位置。
  • /home 就是 mount point 所在位置。
  • ext2 是檔案系統格式。
  • defaults 當然是系統預設值啦(其中包括﹕rw、suid、dev、 exec、auto、nouser、和 async)﹐除了它﹐我們還可以加入(或只選取)相關的屬性﹐諸如﹕ro,noauto,grpquota,usrquota 等等﹐分別用“,”分開就是了。(具體內容請 man mount 然後看 -o 的說明)
  • 然後到下一個‘1’﹐是說這個 mount point 在進行 dump (一個備份程式)的時候﹐是否要進行備份﹐如果是 0 則不備份。
  • 最後的數字﹐是告訴系統在重新開機的時候進行檢測的次序﹐通常‘/’是永遠排第 1 的﹐其他設為 2 就可以了﹐如果是 0 就不進行檢測。
tips﹕如果您想用 LABEL 來代替設備名稱﹐那您可以先用 e2label 為 partition 設定標籤﹕
e2label /dev/hdb5 /home

然後將 /etc/fstab 中的 /dev/hda5 改為 LABEL=/home 就可以了。

用 LABEL 有一個好處﹕日後如果您將硬碟的位置改變了﹐並不需要重新修改 fstab ﹗舉例子說好了﹕您現在將 mount piont 掛在 /dev/hda5 中﹐如果日後我將這個顆硬碟搬到 hdb 的位置﹐您必須要有技巧的修改 /etc/fstab ﹐將 hda5 改為 hdb5﹐否則﹐系統就抓不到這個 mount point ﹔但如果用 label 的話﹐則沒有這個困繞。

(至於其它的一些 automount 技巧﹐日後我們在 NFS 裡面在討論)

但是﹐在我們重新開機之前﹐還有一個地方要注意﹕因為我們我們這裡已經將 /home 的 mount point 修改了﹐那下次開機﹐原本的 /home 目錄的位置就找不到了﹐我們不妨先做一個備份﹕﹕
mkdir /home.bak mv /home/* /home.bak

這樣﹐萬一新的 mount point 有所殘缺﹐我們還可以從備份中進行補救﹐等一切都確定 OK 之後﹐再執行 rm -rf /home.bak 不遲。

設定 quota

不知道您有聽過 quota 這個詞嗎﹖如果沒有﹐那接下來將讓您大開眼界﹔如果您聽過﹐但卻不會弄﹐或是弄不起來﹐相信下面的介紹也相當有益。

簡而言之﹐quota 是一種磁碟空間的使用限制技術﹐透過它的設定﹐可以對不同的使用者作出不同的空間大小限制。而 quota 的設定一共有兩種﹕soft limitshard limits。當使用者達到 soft limits 的時候﹐系統會發出一個警告信息﹐不過使用者還是可以繼續使用﹔但如果達到 hard limits 的時候﹐就再也不能寫入檔案了﹔如果使用者達到 soft limits 而不理會警告﹐那麼系統還可以設定一個 grace period﹐當這個期限到達的時候﹐如果使用者不將其用量降到 soft limits 以下﹐就算還沒到達 hard limits ﹐也統樣不能寫入檔案。怎樣﹐夠狠吧﹖﹗

不過﹐設定 quota 的時候﹐我們還是有些規則是一定要遵守的﹐例如﹕quota 的設定﹐只能針對整個 partition 來限制﹐也就是說﹐一定要從 mount point 本身的最高目錄開始設定﹐而對其下的所有檔案路徑生效。同一 partition 下面﹐您不能單純針對某個目錄做限制﹐而其它目錄不做限制﹐這是不允許的。還有﹐您所使用的核心(kernel) 一定要支援 quota 功能﹐否則設了也是白設。

在真正進行設定之前﹐先讓我們熟悉一些指令﹐一般用來設定 quota 的命令叫做 edquota﹐用來檢查 quota 設定的命令叫 repquotaquota

  • 您用 root 身份執行 edquota -u user1 可以編輯 user1 的 quota 限制﹔
  • 除了針對單一 user 的 quota﹐您也可以設定針對 group 的 quota﹐同樣用 edquota -g group1 就可以設定 group1 的 quota﹔
  • 如果您所設定的 quota 限制對許多使用者來說都是一樣的﹐那您可以將 quota 設定進行複製﹕edquota -p user1 -u user2 ﹐這樣 user2 就獲得 user1 一樣的限制了。
  • 如果您要修改 grace period﹐那可以使用 edquota -ut ﹐其設定一視同仁﹐設定一次就好了。
  • 要查看所有使用者的 quota 情況﹐使用﹕repquota -a﹐如果要查特地使用者的話﹐則使用 ﹕repquota -u user1。不過﹐這是給管理員使用的﹐如果要查自己的 quota﹐只要輸入 quota 就可以了。
  • 好了﹐說了這麼多﹐心動不如行動﹐下面就讓我們把前面新掛載為獨立 partition 的 /home 目錄做一下限制吧﹕

    1. 首先﹐我建議您停掉所有網路和登錄服務﹐或乾脆重新開機到單人模式中。

    2. 無論任何﹐我們必須修改 /etc/fstab 這個檔案﹐將關於 /home 的那行修改一下﹕
      修改前﹕
      /dev/hdb5  /home	ext2  efaults    0 2  
      修改後﹕
      /dev/hdb5  /home	ext2  efaults,usrquota,grpquota    0 2  
      

    3. 存檔後﹐cd /home 到目標目錄﹐然後執行如下命令﹕
      touch aquota.user aquota.group
      (注意﹕以往版本使用 quota.* ﹐而這裡使用 aquota.* 哦﹗)

    4. 完成後﹐再執行﹕
      chmod 600 aquota.*

    5. 然後執行 quotacheck -uvg /home﹐這時候﹐這個 partition 會被 mount 成 read only 狀態﹐所以不能進行任何修改。假如您這個 partition 已經有執行 quota﹐那就先執行 quotaoff /home 再使用 quotacheck 吧。

    6. 執行 reboot 重新開機﹐讓前面的設定生效。(這步驟可不能偷懶哦)

    7. 建議您建立一個樣本帳號﹕
      useradd quota_tmp

    8. 然後針對樣本帳號設定 quota﹕
      edquota -u quota_tmp

    9. 然後根據您的實際要求設定限制﹕
      Edit block and inode quota for user guest:
      Device /dev/hdb5 (/home):
      Used 0KB, limits: soft=2000 hard=3000
      Used 0 inodes, limits: soft=0 hard=0
      (上面的檔案是以 vi 的操作方式進行的﹐您必須學習好這個編輯器﹐請參考後面的文章。)

      這裡﹐您只需要修改粗體字的部份就可以了﹐其它不用修改。至於 inode 的限制﹐目前是沒有﹐所以都是 0。

      Tips﹕假如這個步驟不能成功的或﹐可以試試如下動作﹕quotaoff -a; quotacheck -a 然後再做一次 reboot 。如果還是不行﹐不妨參考網友 vincent 兄的經驗﹕
      "vincent"  撰寫於郵件 news:3hk5WT$Ir_@bbs.ice.cycu.edu.tw...
      > 
      >   我reboot後還是不行,不過後來試了另一個方法,問題就解決了..
      >   step 1 : touch quota.user quota.group
      >   setp 2 : convertquota -u /home  (產生一新的aquota.user檔案,內有資料)
      >   setp 3 : quotaon -auv
      >   setp 4 : edquota -u username   竟然可以了說...
      >   setp 5 : 測試ok    (還在懷疑中)
      

    10. 存檔之後﹐請執行如下命令設定 grace period﹕
      edquota -ut

    11. 設定好您的 grace period 時間﹕
      Edit grace times for user quota:
      Device /dev/hdb5 (/home):
      Block grace: 60minutes Inode grace: 1day
      
      

      注意哦﹕您得修改原來的 0 minutes 變為粗體字那樣的格式(數字和時間單位之間沒有空白﹗)﹐否則在退出的時候會得到警告(我個人覺得程式設計者這裡應該改良一下)。這裡的時間限制為﹕ block 是 60 分鐘、 inode 則是 1 天時間。

    12. 到這裡﹐您需要將 quota 設定複製給真正須要進行空間限制的用戶﹕
      edquota -p quota_tmp -u user1

      或許這還是不夠好﹐如果需要一次過設定 200 個 user 呢﹖哈哈﹐別擔心啦﹐不妨寫個這樣的 script 然後執行它(我們在後面的章節會介紹如何寫 shell script )﹕
      #!/bin/bash
      TMP_U=quota_tmp
      F_UID=500
      L_UID=700
      UID=$F_UID
      until [ $UID -gt $L_UID ]
      do
      	edquota -p $TMP_U $UID
      	let UID=($UID + 1)
      done
      

      也就是指定好 F_UID 和 L_UID 的範圍就行﹐方便吧﹖ ^_^

    13. 如果您還想編輯群組 quota ﹐那就將前面提到的那些命令之 -u 參數改為 -g 參數就是了。

    好了﹐到這裡相信您已經對檔案管理具備相當能力了。事實上﹐還有許多檔案管理的技巧我在這裡還沒有討論到﹐請您自己多多發掘吧。

     

     


    www.study-area.org © 2001 Netman 網中人
    Last Updated: May 10, 2004