| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
好了﹐既然您已經知道如何開機和關機了﹐下面讓我們練練基本功吧。先讓我們認識一下 Linux 的檔案系統﹕ 如果您玩過 DOS 的話﹐相信這對您不是很難﹐但如果您一直以來所接觸的電腦都是 Windows 的話﹐不好意思﹐您可能需要認真操練操練才行。(這裡我要事先提醒一點的是﹕在Linux下面﹐字母的大小是有分別的﹐一定要留意哦﹗) 在 Linux 裡面﹐檔案系統都從一個稱為 root (寫作 / ) 的根目錄開始﹐離開了這個 / 一切免談就是了。在 / 下面是一些檔案子目錄﹐而子目錄下面也有其自己的檔案和子目錄﹐再下面的子目錄也一樣。整個檔案結構就像樹狀一樣﹕一切從根開始﹐然後分幹、分枝、分杈、分頁、... ﹐這樣一直延伸出去。我們稱這樣的結構為層階(hierarchy)式結構。一般的 Linux 檔案系統﹐其層階結構如下﹕
各目錄的名稱和安排﹐當然是有一定標準的﹐其功能主要如下﹕
總而言之﹐檔案系統所使用到的任何東西都以‘檔案’的形式出現﹐包括目錄本身也是一個特殊的檔案。就連所有的硬體設備﹐也必須在檔案系統上面有相對的檔案﹐比方說﹐/dev/fd0 就是系統的第一個軟碟機﹐諸如此類﹐應該找到許多例子。 先讓我們看看自己在哪吧(否則很容易迷失方向的哦)﹐我們先輸入﹕
它的意思是﹕Print Working Directory﹐也就是您目前所處的檔案系統中的位置﹐您或許會發現您正在 /root 中。這通常是您登錄後首先進入的目錄﹐也就是使用者家目錄(home directory)啦﹐每一個使用者都有其自己的家目錄。 然後﹐讓我們輸入﹕
這個目的是 Change Directory 到上一級目錄(我們用兩點“..”表示上級目錄﹐而當前目錄則用一點“.”表示)。如果您這時候再輸入 pwd 的話(您也可以按向上的方向鍵﹐找回前面輸入的命令﹐這對長命令非常好用哦﹗)﹐您會看到當前目錄會變成了“/”﹐這是檔案系統的根目錄(因為您是從 /root/ 轉上來的)﹐所有檔案和目錄都由這裡延伸出去﹐這個您應該從前面的文章知道了吧。如果您要在檔案系統中游走﹐使用 cd 後接路徑(path)進行。 好了﹐這時候請您只輸入 cd 這個命令(不帶任何參數)﹐試試就知道了﹕哈哈﹐回家了﹗是的﹕如果輸入 cd 但不接任何路徑的話﹐您就會回到家目錄中。同時﹐家目錄的路徑也可以用“~/”來表示﹐例如您現在是用 root 登錄﹐在 /root 下面有個test.txt 檔案﹐其表示方法可以用絕對路徑﹕ /root/test.txt ﹐也可以用﹕~/text.txt (當您的身份是 root 的時候)。 好了﹐我們已經知道怎麼在檔案系統中穿梭﹐也懂得檔案的路徑了﹐下面我們就嘗試建立目錄和檔案吧。請輸入這個命令﹕
這個命令的結果會在當前目錄下面 make directory ﹐新建了 test1 這個目錄。如果我們要刪除這個目錄的話﹐使用 rmdir 命令則可﹐但是﹐目錄內必須是空白的才可以﹐否則您會碰到一個錯誤信息﹐告知您要移除的目錄並不是空的。這時候﹐我們要先用 rm 命令將目錄內的檔案刪除掉﹐但有一個強制的方法是﹐使用 ‘rm -rf’來將目錄強制刪除掉。rm 這個命令(remove)基本上是用來刪除檔案的﹐-r 是 recursive 模式﹐會將目錄其下的所有檔案和子目錄刪除掉﹔通常進行 rm 的時候﹐在 Redhat 裡面預設會是 -i (interactive) 模式﹐也就是在刪除檔案之前會提出詢問﹐如果您按 y 才真正刪除﹐而 -f 則是 force 的意思﹐則不再提出詢問就直接刪除檔案。 然後﹐讓我們進入我們剛剛建立的 test1 目錄(執行 cd test1)﹐再建立一個新目錄叫 test1-1。 完成之後請輸入﹕
讓我們解讀這個命令﹕“ls”是 list 的意思(下面我會再講)﹔“/”應該知道吧﹖“>”呢﹐是一個重導向功能﹐用來將命令的輸出結果產生檔案﹐如果該檔案已經存在的話﹐那麼原來內容都會丟失﹔如果您想保留原有內容﹐而把輸出產生在檔案結尾部份﹐可以使用“>>”。那麼﹐上面的命令執行結果是﹕在當前目錄產生一個內容為根目錄檔案列表結果的 test.ls 檔案。(命令的重導向和管線處理我們在後面介紹) 既然我們已經有一個檔案了﹐我們可以將之進行複製哦﹕
這行命令的作用是將 test.ls 進行複製(copy)﹐產生一個 test.ls.copy 的副本。 如果我們用 mv 代替 cp 的話﹐那就是為檔案改一個名字﹐原來的檔案名字會不見了﹐只有新的檔案名字。 我們除了 copy 和 move 之外﹐我們還為檔案產生連接(link)呢﹕
這個命令的執行結果是﹕為 test.ls 建立一個叫做 test.ls.ln 的 symbolic link。 嗯﹖什麼link啊﹖ 對於用慣了 dos 的朋友來說﹐這個的確不好理解。其實﹐如果您為 Window s檔案建立過捷徑(shortcut)的話﹐您會知道無論您直接點擊原檔案﹐還是點擊捷徑﹐其結果都是一樣的。Linux 下面的 link 呢﹖有點類似﹐但也很不一樣﹕如果您修改 windows 的捷徑的話(指的是對捷徑檔案的內容進行編輯)﹐您會失去了和原來檔案的連接﹐而且﹐原來的檔案絲毫也沒被改變﹔但在 Linux 裡面﹐無論您修改原檔案﹐還是修改 link﹐其內容都會同時更新的。別以為 link 很神奇﹐說穿了﹐只不過是一個檔案具有多個名字罷了。比如說﹐我的名字叫 Kenny﹐但我在網路上使用的名字則為 netman﹐但所指的其實都是同一個人而已﹐您可以將 netman 看成是 kenny 的一個 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 呢﹖理由很多﹕
好了﹐我們知道在 /root/test1 這個目錄下面﹐有目錄﹐有檔案﹐還有 link 。現在﹐讓我們輸入﹕
ls 是 List 的意思﹐應該是最常用的命令之一。如果 ls 的對象是目錄﹐那麼目錄的內容就會列出來﹐假如您想看目錄本身的資訊(而不是它的內容)﹐可以加上 -d 的參數。另外﹐您也可以用這個命令來確定檔案的存在﹕
您會看到所有以 test 開頭的檔案(包括目錄)都會被列出來。這裡使用的‘*’我們稱之為“通配字符(wildcard)”﹐除了 * ﹐我們還可以用 ﹖ 和 [ ] 來查找特定檔案﹐如果您靈活運用﹐可以列出許多您指定的檔案﹕
假設目錄裡面有如下這些檔案﹕ AABBCCDD BBBDDAA ABBBCCAA Aabbccdd Bbccddaa aabbccdd bbccddaa cabbccdd ccbbccdd 123abc bcd123 那麼﹐我們分別執行如下的命令﹐可得到相應的結果﹕
通常﹐使用 ls 是看不到那些以“.”開頭的檔案的﹐在 Linux 系統中﹐這些檔案是隱藏檔﹐您要用 ‘ ls -a’才能將它們顯示出來。不過﹐系統之所以要將檔案隱藏起來﹐當然是有其原因的。通常這些檔案都是系統使用到的﹐而不大希望使用者對它們進行修改。但是﹐如果您的系統遭到入侵被植入後門程式﹐它們也通常會以隱藏檔案存在的啦。 使用 ls 命令之後﹐您會看到目錄內容會以行列的形式列出來﹐不過﹐除非您原先就知道它們是什麼﹐否則您也看不出究竟哪一個是目錄﹐哪一個是檔案(不過﹐現在的 Linux 會用不同的顏色來表示不同的檔案﹐這樣也直觀多了)。如果您需要更詳細的信息﹐可以加上 -l 的參數﹕
這時後﹐您會看到這樣的結果﹕
這裡﹐我們得到的信息明顯多了許多。首先讓我們看看第一列的意思﹕在句子開頭共有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 命令是 change mode 的意思﹐第一行是為 user 增加 x 權限﹐第二行是為 group 增加 w 和 x 權限﹐而第三行則是為 others 增加 x 權限﹐如果您這時候再使用 ls -l 的話﹐您會看到 test.ls 的權限會變成﹕rwxrwxr-x 這樣的權限值了。我們使用“+”來增加權限﹐如果使用“-”是刪除權限﹐如果使用“=”則是指定權限值。不過﹐您是否覺得這樣輸入命令很麻煩呢﹖有沒用更方便的辦法啊﹖答案是﹕有的﹗現在﹐請您輸入這樣的命令﹕
您會看到test.ls的權限會變成﹕rwxrwxrwx﹐也就是所有使用者都具備所有權限了﹐因為我們給每一個使用者群都賦予‘7’這個數值﹐它分別是﹕1(x)+2(w)+4(r)的總和﹐如果是‘0’的話﹐就表示沒用任何權限。但事實上﹐權限值並的真正計算方法是以二進位進行的﹕ 先讓我們看看 x,r,w 的 bit 位元表示方式﹕ x: 001 w: 010 r: 100 下面您如果輸入﹕
您會發現權限會變成﹕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 的權限了。 目錄是用 777 扣掉 umask 的值﹔ 檔案是用 666 扣掉 umask 的值。 不過﹐電腦上面真正的運算是二進位啦﹐這個和我們計算 IP subnet 的時候是一樣的原理。 不信﹖不妨用 033 的 umask 玩玩 ﹐看看會產生什麼樣的權限呢﹖ 此外﹐我們不但可以改變檔案的權限﹐還可以使用 chown 來改變 user 和 group (也可以使用 chgrp 來單單改變 group)﹕
這命令通常由 root 來執行﹐用“.”(或 : )將擁有者和群組分隔開就可以了﹐當然﹐user 和 group 必須要事先被建立好了的。 權限對目錄和檔案的影響有時候不盡相同。r 和 w 應該一樣﹐都是可以進行讀取和寫入(或修改)﹐但 x 則不一樣了﹕ x 對目錄而言﹐是具有查找的能力﹔而對檔案而言﹐則是可執行程式。例如﹕當您要建立、讀取、寫入一個檔案(或子目錄)的時候﹐從 / 到當前目錄所經過的所有目錄﹐都必須有 x 權限﹐而當前目錄則按照不同的行為具備不同的權限﹕建立需要 wx、讀取需要 r、寫入需要 w 。 用 chmod 和 chown 來改變一個目錄權限的時候﹐如果加上 -R 參數﹐那麼﹐目錄裡面的檔案和子目錄﹐都會更著被修改。有時候會很方便﹐但也非常冒險﹗小心使用就是了。 或者﹐您會在其它一些 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 兄的說明﹕
事實上﹐您除了可以設定檔案的權限( permissions ) 之外﹐還可以設定檔案的屬性( attributes )。和 chmod 命令一樣﹐您可以使用 chattr 命令來改變一個檔案或目錄的屬性。常用的屬性大概有這些﹕
善於運用檔案的屬性設定﹐可以更好的確保檔案的使用習性。例如﹐您或許不希望任何人修改 /bin 和 /sbin 裡面的檔案 (因為木馬程式通常都會修改那裡)﹐那您可以執行﹕
然後﹐您試試在 /bin 和 /sbin 裡面新增或刪除檔案﹖應該不會成功的﹗如果您要看檔案或目錄的屬性﹐可以用 lsattr 命令﹕
如果拿掉 -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)。 當然﹐在進行掛載的過程中﹐有一些規則我們是必須遵守的﹕
比方說﹐按照前面的安裝規劃﹐我們的 / 是掛載於 hda6 上面﹐而 /boot 則掛載於 hda2 上面。這是開機的時候就會掛載好的﹐其設定寫在 /etc/fstab 檔案中﹕
這個檔案的語法﹐應該是 RedHat 7.x 系統上面才開始使用的﹐和以前的舊系統比較﹐最大的分別就是在這裡使用 LABEL﹐代替了原來的設備檔名稱(比較第一行和最後一行的最左邊)。這裡的 LABEL=/ 也就是 /dev/hda6﹐而 LABEL=/boot 則是 /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 ﹐那麼我們的命令將會如此﹕
關於這個命令﹐其中的 -t 選項是用來指定檔案系統格式的﹐如果 hdb1 是用 linux 的 ext2 格式來 format 的話﹐那就是 -t ext2 ﹐不過﹐這也是預設值﹐如果沒有指定 -t 那就是 ext2 了。如果您要掛載的檔案系統是 windows 98 的 FAT32 格式﹐那您就要改用 -t vfat ﹔假如是 dos 格式的話﹐則換為 -t msdos。 如果我們要讀取 CDROM﹐那我們也必須先將光碟機掛載進來才可以讀取﹕
這裡﹐光碟機是放在第二個 IDE 的 Slave 位置上﹐mount point 則是系統在安裝的時候就建立好的﹐而 iso9660 是 CDROM 的標準格式﹐但如果您不指定 -t ﹐系統也通常能讀取正確的 CD 格式的﹐至於 ro 這個 option﹐設與不設在目前這個例子中沒什麼分別﹐因為光碟本來就是 Read Only 的﹐只是如果不設﹐系統在成功掛載之後會告訴我們 device /dev/xxxx is write-protected 而已。
如果有這行設定﹐您以後要掛載 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 )﹐可以輸入:
如果硬碟分區一旦切割好﹐要改變其大小可不容易﹐不小心會讓整個分區的資料都毀掉。市面上或許有一些工具可以對 Windows 的分區進行 resize 的動作﹐而在 linux 上面也有同樣的工具。不過﹐我這裡就不介紹如何使用了﹐有興趣的話﹐請到這個網頁看看﹕The GNU Parted 。 在 DOS 下面要格式化磁碟﹐是使用‘format’命令﹐在 Linux 下面呢﹖卻使用‘mkxxxfs’命令哦﹐其中的‘xxx’為檔案系統類型﹐例如﹐mkdosfs 就會將磁碟格式為DOS 檔案系統了。在 Linux 下面的檔案系統通常會是 ext2﹐我們可以用 mke2fs 來格式化。 例如﹐如果我們要格式化第一個 IDE 的 slave 硬碟第一個邏輯分區﹐我們可以這樣輸入﹕
其中的‘-c’參數會讓程式在格式化同時對磁碟進行壞軌檢測﹐不過﹐這樣比較需時﹐如果要快速進行格式化﹐通常不使用。 資料的寫入是以 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 進來才可以使用﹕
因為我們打算用這個 partition 來作為我們新的 /home 目錄﹐等掛載好之後﹐就要將原有的 /home 目錄內容複製過來﹐您可以執行這個命令﹕
上面這個動作﹐是將原本在 / 底下的 home/ 目錄內容灌到新的 partition 上面。完成複製之後﹐我們可以參考前面看到的 /etc/fstab 這個檔案﹐進行一些修改﹐讓機器在重新開機的時候﹐將 /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 目錄的位置就找不到了﹐我們不妨先做一個備份﹕﹕
這樣﹐萬一新的 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﹕
好了﹐說了這麼多﹐心動不如行動﹐下面就讓我們把前面新掛載為獨立 partition 的 /home 目錄做一下限制吧﹕ 好了﹐到這裡相信您已經對檔案管理具備相當能力了。事實上﹐還有許多檔案管理的技巧我在這裡還沒有討論到﹐請您自己多多發掘吧。
www.study-area.org © 2001 Netman 網中人Last Updated: May 10, 2004 |