第三章﹕檔案系統
时间:2006-09-09 来源:jmhyy
好了﹐既然您已經知道如何開機和關機了﹐下面讓我們練練基本功吧。先讓我們認識一下 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 link 和 soft 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 再放在某些特定的目錄之下﹐在管理上來說也是非常方便的。
好了﹐我們知道在 /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]* | AABBCCDD﹑BBBDDAA﹑ABBBCCAA﹑Aabbccdd﹑Bbccddaa |
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 個(從右往左)數字代表什麼意思呢﹖
非常好的問題﹗不過﹐在解釋這個數字之前﹐先讓我們再認識兩個概念﹕SUID 和 SGID 。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:[email protected]... > : > 請問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 來了解。
所有的檔案都存在不同的 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 |
如果硬碟分區一旦切割好﹐要改變其大小可不容易﹐不小心會讓整個分區的資料都毀掉。市面上或許有一些工具可以對 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 |
上面這個動作﹐是將原本在 / 底下的 home/ 目錄內容灌到新的 partition 上面。完成複製之後﹐我們可以參考前面看到的 /etc/fstab 這個檔案﹐進行一些修改﹐讓機器在重新開機的時候﹐將 /home 掛在新的位置上﹕
vi /etc/fstab |
您只要在該檔案裡面加入﹕
/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 就不進行檢測。
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 的設定一共有兩種﹕soft limits 和 hard limits。當使用者達到 soft limits 的時候﹐系統會發出一個警告信息﹐不過使用者還是可以繼續使用﹔但如果達到 hard limits 的時候﹐就再也不能寫入檔案了﹔如果使用者達到 soft limits 而不理會警告﹐那麼系統還可以設定一個 grace period﹐當這個期限到達的時候﹐如果使用者不將其用量降到 soft limits 以下﹐就算還沒到達 hard limits ﹐也統樣不能寫入檔案。怎樣﹐夠狠吧﹖﹗
不過﹐設定 quota 的時候﹐我們還是有些規則是一定要遵守的﹐例如﹕quota 的設定﹐只能針對整個 partition 來限制﹐也就是說﹐一定要從 mount point 本身的最高目錄開始設定﹐而對其下的所有檔案路徑生效。同一 partition 下面﹐您不能單純針對某個目錄做限制﹐而其它目錄不做限制﹐這是不允許的。還有﹐您所使用的核心(kernel) 一定要支援 quota 功能﹐否則設了也是白設。
在真正進行設定之前﹐先讓我們熟悉一些指令﹐一般用來設定 quota 的命令叫做 edquota﹐用來檢查 quota 設定的命令叫 repquota 或 quota﹕
- 您用 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 目錄做一下限制吧﹕
- 首先﹐我建議您停掉所有網路和登錄服務﹐或乾脆重新開機到單人模式中。
- 無論任何﹐我們必須修改 /etc/fstab 這個檔案﹐將關於 /home 的那行修改一下﹕
修改前﹕ /dev/hdb5 /home ext2 efaults 0 2 修改後﹕ /dev/hdb5 /home ext2 efaults,usrquota,grpquota 0 2
- 存檔後﹐cd /home 到目標目錄﹐然後執行如下命令﹕
touch aquota.user aquota.group - 完成後﹐再執行﹕
chmod 600 aquota.* - 然後執行 quotacheck -uvg /home﹐這時候﹐這個 partition 會被 mount 成 read only 狀態﹐所以不能進行任何修改。假如您這個 partition 已經有執行 quota﹐那就先執行 quotaoff /home 再使用 quotacheck 吧。
- 執行 reboot 重新開機﹐讓前面的設定生效。(這步驟可不能偷懶哦)
- 建議您建立一個樣本帳號﹕
useradd quota_tmp - 然後針對樣本帳號設定 quota﹕
edquota -u quota_tmp - 然後根據您的實際要求設定限制﹕
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
這裡﹐您只需要修改粗體字的部份就可以了﹐其它不用修改。至於 inode 的限制﹐目前是沒有﹐所以都是 0。
Tips﹕假如這個步驟不能成功的或﹐可以試試如下動作﹕quotaoff -a; quotacheck -a 然後再做一次 reboot 。如果還是不行﹐不妨參考網友 vincent 兄的經驗﹕
"vincent" 撰寫於郵件 news:[email protected]... > > 我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 (還在懷疑中)
- 存檔之後﹐請執行如下命令設定 grace period﹕
edquota -ut - 設定好您的 grace period 時間﹕
Edit grace times for user quota: Device /dev/hdb5 (/home): Block grace: 60minutes Inode grace: 1day
注意哦﹕您得修改原來的 0 minutes 變為粗體字那樣的格式(數字和時間單位之間沒有空白﹗)﹐否則在退出的時候會得到警告(我個人覺得程式設計者這裡應該改良一下)。這裡的時間限制為﹕ block 是 60 分鐘﹑ inode 則是 1 天時間。
- 到這裡﹐您需要將 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 的範圍就行﹐方便吧﹖ ^_^
- 如果您還想編輯群組 quota ﹐那就將前面提到的那些命令之 -u 參數改為 -g 參數就是了。
好了﹐到這裡相信您已經對檔案管理具備相當能力了。事實上﹐還有許多檔案管理的技巧我在這裡還沒有討論到﹐請您自己多多發掘吧。