鳥哥的 Linux 與 ADSL 私房菜

再次強調：
底下的幾篇短文是學習 Linux 的基礎文件，這些文件是基礎中的基礎，如果您能將其中的文件都看完，並且消化過，那麼未來在管理 Linux 主機以及架設網站方面，就能夠達到『事半功倍』的成效，請不要忽略這部份了！否則，再怎麼討論都是枉然的啦！ ^_^

第一部份：Linux 的規劃與安裝
Linux 本身雖然具有相當強大的功能，不過，如果不能理解 Linux 的工作能力，那麼 Linux 能做的工作將會大打折扣！本篇著重於介紹 Linux 的緣起與他的功能，此外，亦將介紹目前 Linux 的規劃技巧，以提供大家如何規劃自己的 Linux 主機的一個基本依據！當然，多重作業系統在一部機器上面，這對於電腦數量不足卻又要求支援多個作業平台的朋友來說是挺重要的，這裡也會跟大家談一談如何安裝多重作業系統在一部主機上面。不過，這個技巧用到的 Linux 指令與軟體較多，所以僅止於介紹，至於更詳細的說明，將在更後面的章節介紹各軟體的細項設定。

Linux 是什麼 2003/01/25 | Linux 雖然是從 1991 年由 Linus Torvalds 釋出後才初次問世，不過不要忘了，Linux 的前身是相當穩定而有名的系統『 Unix 』前輩！在這裡我們由 Unix 與 Linux 的歷史說起，然後再來談一談，目前 Linux 這麼多的版本 ( distributions ) 當中，到底有哪些異同的地方呢？！也就是說， 到底 Linux 是什麼東西呢？他有哪些基本的功能呢？！
Linux 要如何學習 2003/01/28 | 目前 Linux 上頭有兩種主要的操作模式，分別是圖形介面與文字介面，那麼學習 Linux 要用 X-Window ( 圖形介面 ) 好還是 Command Line ( 文字介面 ) 好？這兩種學習心態有什麼優缺點呢？此外，有沒有良好的入門文件可供參考？！Linux 學習有困擾的時候應該要如何發問？！要到哪裡去搜尋網路資源？！還有，怎樣進行有智慧的提問？嗯！來這裡看看吧！
Linux 主機規劃 2003/02/02 | 在實地的安裝 Linux 之前，有些功課要先來做的！因為 Linux 對於硬體的配置要求較嚴格，所以您必須要瞭解到 Linux 所支援的 CPU 、 RAM 、 顯示卡等等的硬體配備，以免造成無法安裝的窘境。此外，您同時需要考慮即將架設的 Linux 主機的作用為何？！舉例來說，若是一般的 Desktop 類型的主機，那麼 X-Window 及 KDE 是不可或缺的，但是如果是一般的伺服器主機呢？嘿嘿！ X-Window 就可以免了吧！當然，如果您的 Linux 是架設來進行練習的，那麼所有的套件都安裝上去，是一個很好的開始！
SPFDISK 的一個範例 2003/02/03 | 安裝 Linux 最重要的就是硬碟空間了！然而很抱歉的是， Windows 的 fdisk 並不認識 Linux 的磁碟格式！所以如果您已經安裝了 Linux 之後，卻想將該 partition ( 硬碟磁區 ) 刪除的話，那麼使用 Windows 的 FDISK 程式是無法做的！另外，使用 全中文 的 spfdisk 也可以讓您更容易瞭解 fdisk 在做什麼工作呦！另外，順道瞭解一下 Linux 與 Windows 分割區支援程度在哪裡不相同呢！？
較小安裝 Red Hat 7.2 2003/02/03 | 終於要安裝 Red Hat Linux 了！呼∼真是麻煩∼那麼 Linux 的安裝模式有哪些呢？嗯！基本上可以分為圖形安裝模式 ( 好消息是 Red Hat 7.3 已經支援中文安裝了 )與文字安裝模式，由於圖形安裝模式較為慢一些，此外，有些較為詭異的周邊( 例如滑鼠、鍵盤、顯示卡等 )較為怪異時，可能無法使用圖形介面，所以這裡我們以文字介面來安裝！再則，我們適合伺服器與開發軟體環境的最小安裝模式來介紹如何安裝 Linux ....
安裝 Mandrake 9.0 與多重開機技巧 2003/02/05 | 一個好的 Linux 主機，在安裝之初就需要先行規劃他的未來服務及磁碟分割了！在這個章節裡面，我們以較為簡單的方式先來介紹一下 Linux 的規劃方式，並實際進行一次規劃，期望讀者可以在自己進行安裝之前，先規劃一下自己的 Linux 主機。此外， Linux 的硬碟分割一直是個困擾新手的大問題，這裡我們不建議新手以繁複的手法去分割硬碟，而以大家的個別需要來建議您分割的技巧！最後，關於多重作業系統在一部機器上面的設定方式，這一章當中亦會介紹一些實用的技巧，不過，實際的修改會放在後續的章節，因為畢竟使用到太多的 Linux 指令與軟體了！
開機與關機 及簡易指令操作 2003/02/06 | 在你完成了 Linux 的安裝之後，接下來呢？當然是學習 Linux 囉！那麼學習 Linux 第一步驟是什麼？哈哈！那就是『正確的開機與關機』方法啦！此外，由於 Linux 底下使用文字介面畢竟是比較有效的學習！因此，在這個小章節裡面，我們也會使用文字介面的方式來下達一些簡單的指令，好讓大家快一點進入狀況喔！另外的另外，這個基礎篇的內容是適合所有版本的 Unix-Like 系統，所以，大家趕緊來玩一玩喔！ ^_^ ！再一次的另外，如果我在開機的時候發現硬碟無法開機了！該如何解決，又， lilo 掛掉的時候，及 root 密碼忘記的時候，要怎麼辦？來這裡看看吧！

第二部分：Linux 檔案、目錄與磁碟格式
安裝完了 Linux 之後，接著下來自然就是要使用他了！我們在 開機與關機及簡易指令操作 稍微說明了指令下達的方法，以及指令線上查詢的方式，因此您可以輕易的使用指令列模式來進行諸多的動作與工作。那麼接著下來呢？當然就是想要知道 Linux 裡面有什麼東西囉，所以，在這一個部分當中，我們將介紹 Linux 最基本的檔案權限概念，與每個檔案目錄所帶有的意涵。當然囉，要瞭解權限的概念，那麼對於不同的『身份』就需要瞭解一下才行，不同的身份的人，所建立的或擁有的檔案是否會相同呢？例如系統管理員與一般身份使用者的檔案？當然不太一樣！除此之外，如果您的硬碟空間不足，需要增加硬碟時，應該要如何新增呢？還有，記憶體不足的情況下，有沒有增進虛擬記憶體容量的方法？在接下來的幾個章節之中，我們將介紹 Linux 主要的檔案架構、以及磁碟在 Linux 當中該如何使用及掛載等問題。

Linux 檔案屬性與目錄配置 2003/02/06 | 既然要玩 Linux ，那麼對於 Linux 的檔案屬性 ( 看的到的與看不到的 ) 及 Linux 底下的目錄功能都要瞭解一下才行！在這裡，我們介紹一下最基礎的 Linux 屬性，還有所謂的 SUID, SGID 與 Sticky bit 呢！而更深入的屬性在下一個 Linux 檔案與目錄管理 再來介紹！此外，也約略介紹一下如何修改檔案的屬性呦！
Linux 檔案與目錄管理 2003/02/06 | 這裡我們再持續的介紹一下，如何登入 Linux 呢？再來，怎樣修改 Linux 檔案的屬性？這個屬性除了看的到的之外，還有看不到的屬性呦！再來，如何拷貝、移動、建立連結檔？還有還有，有什麼方法可以搜尋檔案呢？！來這裡看看吧！
Linux 磁碟與硬體管理 2003/02/07 | 好了，對於檔案與目錄具有一定程度的認識之後，我們再來需要談到的是，那麼我的硬碟到底剩下多少容量？需要如何確認我的硬碟的檔案格式？如果硬碟有了壞軌時，應該要如何修理？還有還有，我怎麼知道我的 inodes 有多少？！當然囉，最重要的是，當我的硬碟容量不足時，我要如何增加一棵新的硬碟呢？如何進行 partition？與如何進行掛載？！以及如何進行軟碟開機片的製作？另外，如何掛載 ( mount ) 一個可以顯示出『中文』的 Windows partition 呢？還有還有，如何新增一個 swap 虛擬記憶體？又，如何啟動一個『檔案型態的 swap 虛擬記憶體？』，看看便知道！此外，這一章的課後練習記得看一看，因為有些鳥哥認為有用的方法呦！
檔案的壓縮與打包 2003/02/09 | 在某些情況下，壓縮指令顯的特別重要的！什麼情況下呢？大部分都是在『備份』的情況下，他顯的特別的重要，此外，如果你是一個套件程式設計師，那麼當你要將你的程式發佈出去的時候，由於要降低網路頻寬的使用率，那麼壓縮也是一個很值得使用的方法！要是你是下載人家的檔案呢？哈哈！那麼解壓縮則是不可少的步驟囉！在 Linux 當中，使用的最多的壓縮指令有哪些呢？呵呵！那就是 gzip 與 tar 這兩個寶貝蛋了！在這一節當中，我們來介紹一下幾種不一樣的壓縮指令，學一學先！

第三部分：學習 Shell 與 Shell scripts
瞭解的基本的 Linux 檔案屬性與目錄的配置之後，在進入更深入的 Linux 世界之前，有幾個課題還是一定要知道的，那就是我們所使用的這個文字模式介面，也就是所謂的『Shell』這個咚咚。在 Linux 的世界中，使用的是 GNU 發展出來的強化的第二代 shell ，稱為 BASH Shell ，他有什麼特異功能呢？簡單的說，我們之前下達的幾個指令都是 bash 管理的，除此之外，他還可以記錄指令、檔案或命令的補全功能、環境變數的使用等等，還有很多功能等著你去發掘呢！在知道了部分的 bash 功能後，在接著下來，我們還得瞭解一下什麼是資料流重導向？還有常規表示法等等的問題，這都是未來我們系統管理員在管理主機上面，一個不可缺乏的利器！當然囉，要將這些功能整合起來運用的話，就不能不學習一下所謂的腳本『 shell scripts 』，他具有基礎的程式能力( Program )，當真是個管理系統的好幫手呢！再來，在未來的架站設定當中，常會使用到文字編輯器來編輯參數設定檔，這個時候，系統管理員至少務必要熟悉一套文字介面下的文書編輯軟體，當然不限制哪一套軟體啦，但是 vi 是最標準的 Unix-Like 的文字介面之文書處理軟體，所以，我們幾乎一定可以在每部 Unix-Like 上面發現他的蹤跡，所以，就來瞭解他一下吧，這也是挺重要的工作呢！

vi 文書處理器 2003/02/25 | 一個系統管理員至少應該要熟悉一種文字處理軟體，以方便未來的系統管理，包括系統設定與架站時候的參數設定檔修訂等等工作之進行。在 Unix-Like 系統中，肯定看的到的文書編輯器就是 vi 啦，他算是最正規的文字介面下的文書處理器了。為什麼文書處理器很重要呢？還記得前兩個章節中我們提到的 /etc/fstab 這個檔案嗎？您如果想要修改他的話，要如何修改呢？當然是使用文書編輯器來編輯他囉，那麼使用什麼呢？當然幾乎就是 vi 啦！此外，後續的 shell scripts 章節與 Linux 架站設定的檔案等等，幾乎都是使用他來進行設定耶！那 vi 重不重要呢？你猜猜?
認識 bash shell 2003/02/10 | 文字模式這種指令下達的方式，就是 bash 的工具與介面啦！那麼前幾章我們都已經很快樂的進行了很多的指令下達方式啦，所以說， bash shell 根本就不難嘛！是啦！只要能夠熟悉的話，那麼確實他不是很困難的東西啦！這一章節中，我們會從變數談起，先說到環境變數的設定與修改問題，然後提到歷史指令的運用，接著下來，我們會提一下『命令重導向』這個重要的觀念，之後就是『管線命令』的部分啦！
正規表示法 2003/02/10 | 在 Unix-Like 的系統當中，有個東西可以幫助你擷取部分資料！那就是『正規表示法, Regular Express (RE) 』，這個東西不容易理解，但是由於他強大的功能，您最好還是得認識一下喔！尤其是 grep 這個指令呢！
學習 shell scripts 2003/02/10 | 如果您真的想要輕鬆的管理你的主機，那麼 shell scripts 是千萬少不得的學習過程！他有點類似 Program ( 程式撰寫 ) 了，對於從未摸過程式的人來說，確實很是困擾，所以這裡我們不強調原理，單純的以十幾個例子來進行說明，好讓您能夠瞭解一下 shell scripts 的強大功能囉！我個人認為，您可以不需要知道如何撰寫 shell scripts ，但是您一定得看的懂 shell scripts ，為什麼呢？因為如此一來，您才能在您的主機上面進行偵錯的工作吶！

第四部分：Linux 使用者管理
好了！終於要到了管理 Linux 帳號的時刻了！對於 Linux 有一定的熟悉度之後，再來就是要管理連上 Linux 的帳號問題了！這個帳號的問題可大可小啦！大到可以限制他使用 Linux 主機的各項資源，小到甚至一般帳號的密碼訂定規則都可以進行規定！端看您對於安全的需求啦！此外，如果站在資源平均分配的角度上，那麼 Linux 主機上面有限的資源當然是平均分配給大家比較好！這個時候就得來規定一下『誰可以使用多少的硬碟空間？』那就是 Quota 喔！呵呵！厲害吧！在訂定完了一些帳號的規則之後，那麼我們就繼續來管理一下主機的系統與程序的管理吧！這個包括了觀察每個程序 ( Process ) 與工作排程及工作管理 ( jobs control )，這些也都是很重要的工作呢！

Linux 帳號管理 2003/02/10 | 在這一節當中，我們來談一談，在 Linux 底下的『帳號』有什麼特殊的功能，或者是說，不同的帳號有什麼特殊的權限呢？舉個例子來說， root 為什麼跟大家不一樣？而如果使用者僅允許使用 pop3 的時候，其帳號需要如何設定？另外，如果要修改使用者的預設家目錄內容、shell 的內容等等，要怎樣進行修改，此外，如果遠端登入主機之後，要怎樣使用 su 與 sudo 變換身份成為 root 呢？來這裡學習一下咯！
Linux 磁碟配額 quota 2003/02/10 | 磁碟配額 ( Quota ) 一直就是個很有用的東西！怎麼說呢？舉個例子來說明，如果您曾經申請過網路的 mail 服務時，那麼肯定就會明白什麼是 20MB 的郵件空間、 30MB 的免費網頁空間，好了，這個 20MB, 30MB 是怎樣定義出來的呢？哈哈！沒錯，就是 quota 這個東西搞出來的！如果我們要限制使用者使用硬碟的容量使用大小，嗯！來這裡看看就對了！
例行性命令 at & crontab 2003/02/10 | 不論什麼時候，建立系統可以自動的執行功能都是必須的！您瞭解目前系統在預設的情況中，每天、每小時、每個月都在做些什麼事嗎？！您瞭解『循環的工作』與『僅進行一次的工作』有什麼不同嗎？看一下吧！
程序與資源管理 2003/02/10 | 在 Linux 當中， Linux 是如何分辨一個程序的呢？嗯！當我們的系統裡面有太多的死亡的程序的時候，應該怎樣將該程序查出來之後並殺掉他呢？如果主機僅允許一次登入一個終端機畫面，如何從事多個工作的進行呢？還有，如何設定一個程序，讓他的執行順序可以比較快速呢？！這個都是程序控制的重點項目呦！呵呵！另外一個又更常發生啦！如果我的 X-Window 死掉了！但是我的 Linux 基本上卻還是活著的時候，那麼是否需要重新 reboot 呢？還是有其他的方式可以重新啟動 X-Window ？

第五部分：Linux 系統管理員
嗯！終於來到系統管理員 ( root ) 要注意的工作事項之篇幅了！各位準系統管理員心理準備好了嗎？我們要管理機器囉?呵呵！那麼管理員的工作是什麼？看報喝茶？！沒錯！管理員最大的享受就是看報喝茶了?一個好的系統管理員，平時不會希望掛載網站上面一再不斷的查詢、檢查漏洞等等的，因為果真如此的話，那麼就表示『機器一定有問題了！』。為了讓我們的 Linux 機器跑得更穩更順暢，好讓我這個管理員有更多的時間去看報喝茶，哈哈！更深入的瞭解系統是需要的！所以，這一篇我們由開機關機的整體流程談起，好瞭解一下 Linux 在開機的過程中到底做了哪些事情，這樣才能知道我們在什麼時候應該做什麼事情吶！此外，由於『沒有一個套件是永遠安全的！』，所以套件管理是相當重要的一部份，這裡我們以 RPM 與 Tarball 來介紹一下如何管理你系統上面的套件?再來，你知道你的系統上面跑了多少資料嗎？雖然知道什麼是 ps 來查詢程序，但是總是得知道我的系統有哪些服務吧！嘿嘿！來看看先?不但如此，還得針對登錄檔進行解析，以及對於系統進行備份?呵呵！管理員的工作還真多那?不止不止，還要進行核心的管理呢！哇！果然是忙斃了！無論如何，還是得要瞭解吶！

開機流程分析 2003/02/10 | 在這個章節當中，我們特別要來看一看整個開機的流程設定，看看能不能在開機的時候就主動的幫我們將所需要的資訊都填進去！此外，還想要知道一下，我們要如何來設定多重開機呢？設定多重開機的原理是什麼？最重要的是那個『什麼是開機管理程式 boot loader 呢？』這些東西對於家裡只有一部電腦，卻又要安裝多個作業系統的朋友來說，是相當重要而有趣的項目呢！VBird 底下會介紹 Linux 下的兩套相當棒的 boot loader 系統，分別是 lilo 及 grub ！
套件管理 RPM & Tarball 2003/02/11 | 就目前網路的世界來看，我們可以說，沒有任何一個套件是完美無缺的，也沒有任何一個套件是可以達到 100% 的安全的，因此，適時的升級與修補套件，就成為網管或者是系統管理員的一門重要的學問了！好了，那麼到底怎麼修補或升級套件呢？這就要說到目前最流行的套件管理程式 ( Package Manager )了！目前我們在 Mandrake, Red Hat, Openlinux 等等的 Linux Distribution 當中，使用的最廣泛的還是屬於 RPM 這個系統預設的套件管理程式，然而這種套件管理程式上面最討人厭的就是『屬性相依』的問題了，因此，不同的 distribution 上面提供的 RPM 都不相同，唉?真麻煩?有沒有比較原始的方式來管理套件呢？可以呀！就使用 Tarball 的方式來安裝套件?但是是否每個 Linux 上面都可以使用 Tarball 來安裝呢？很抱歉?如果您忘記了某些發展工具的安裝，那麼確實還是沒有辦法編譯的啦！因此，在這個章節中，我們將要為您介紹這兩個常常使用的套件管理方式? RPM 與 Tarball 的升級方式 ?
動手製作 SRPM 2003/02/11 | 呵呵！我已經知道了如何升級了∼但是這裡仍然有個問題，那就是，人家搞定的 RPM 檔案並不是我想要的套件格式，我希望修改別人的原本的設定資料，那麼就需要動手去修改一下 SRPM 囉！另外，如何製作自己寫好的套件呢？如何打包成為 RPM 呢？呵呵！這一小節當中，我們就來談一談！
核心編譯與模組管理 2003/02/11 | 由前面的介紹中，我們發現很多的功能都需要有核心的支援才可以進行，此外，由於核心『越小越好』，加上系統預設的核心不見得就能夠適合於您的系統，所以，在這裡我們來談一談如何重新的編譯一下核心！還有，編譯完核心之後，自然就是要使用他囉?那麼如何安裝核心呢？此外，舊的核心是否可以留下來呢？一個 Linux 系統是否可以具有兩個以上的核心來開機呢？如果可以的話，能不能設定多重開機系統呢？呵呵！這裡我們就來談一談吧！ 注意：這一章節當中，是屬於比較進階的課程?所以，如果您沒有特別的需求的話，那麼這一章可以先跳過去不看也沒有關係?或者，等到您比較熟悉 Linux 系統之後，再回來複習此章，嗯！也不錯哩！
系統設定指令 2003/02/11 | 基本上，不論是那個 Linux distribution ，通常他們都會提供一些蠻不錯的系統設定工具來方便使用者進行設定！當然， Mandrake 也提供不少的系統設定工具來造福使用者。不過，這也有點小問題啦！舉個例子來說，在 Red Hat 裡頭，他的系統設定工具名稱為 setup ，但在 Mandrake 裡頭則為 drakconf ，且在其中每個項目的設定多多少少有點不同。就如同我們在序章裡頭提到的，如果您僅會這些系統設定工具，那麼萬一改天沒有了這些工具或者是換了一套 distribution 時，哇！ㄟ西郎?不過，如果我們已經知道如何手動設定了，那麼瞭解一下設定工具也還不錯吶！所以這裡首先會介紹一些系統的設定工具。再者，萬一某些硬體在您的 linux 裡頭無法自動偵測的到，這時就得要編譯核心模組了！那麼如何編譯？又，如果要開機就將該模組載入系統，該如何編寫設定檔？然後，如何手動的載入模組？恩∼都是一些需要瞭解的呢！
認識系統服務 2003/02/11 | 在 Unix-Like 的系統中，常常聽到這個字眼： daemons ！那麼什麼是傳說中的 daemons 呢？這些 daemon 放在什麼地方？他的功能是什麼？該如何啟動這些 daemons ？又如何有效的將這些 daemon 管理妥當！？此外，要如何視察這些 daemons 開了多少個 ports ？又這些 ports 要如何關閉？還有還有，曉得你的系統的這些 port 各代表的是什麼服務嗎？這些都是最基礎需要注意的呢！尤其是在架設網站之前，這裡個觀念就顯的更重要了。
分析登錄檔 2003/02/11 | 『登錄檔』似乎是常常聽到的名詞，網路上的老手們也常常告知新手們要多察看登錄檔，那麼這些登錄檔是幹嘛用的？嗯！似乎是當你啟發一個事件的時候，或者是有人登入你的 Linux 主機的時候，主機會有一些認證的程序或者是一些重要的訊息，由於這些訊息有被追蹤的重要性，所以自然就有需要將他保留下來，以備未來的不時之需囉，這些訊息會被紀錄在某些檔案上，這些檔案就被稱為登錄檔了！那麼您曉得該登入者的資訊被紀錄在哪裡嗎？這些資訊的量有多大呢？您可以每天自行觀看嗎？哇！如果能用 Shell Scripts 來分析的話，不是就更快速了嗎？呵呵！這裡 VBird 寫了一個小小的分析檔案 ( logfile.sh )，讓大家可以更快樂的管理你的 Linux 主機呦！ ^_^
資料備份策略 2003/02/12 | 萬一不幸你的 Linux 被駭客入侵了、或是你的 Linux 系統由於硬體關係 ( 不論是天災還是人禍 ) 而掛掉了！這個時候，請問如何快速的回復你的系統呢？呵呵！當然囉，如果有備份資料的話，那麼回復系統所花費的時間與成本將降低相當的多！平時最好就養成備份的習慣，以免突然之間的手足無措！此外，哪些檔案最需要備份呢？又，備份是需要完整的備份還是僅備份重要資料即可？嗯！確實需要考慮看看呦！
簡易X-Window設定 2003/02/12 | 大家都知道在 Linux 底下有個很漂漂的視窗介面，那就是有名的 X-Window 啦！但是，X-Window是什麼？怎麼會有 KDE, GNOME之 類的不同顯示界面？它們之間的關係又是怎樣？這個必需要先知道一下下呢！否則常常會搞不清楚，萬一資料掛了我是應該找 X server 還是找 X Client 呢！另外，那麼如果我的 X-Window 一直無法啟動，那是什麼原因？去除了硬體問題的因素之後，那麼當然就是設定的問題啦！呵呵！那麼如何以手動的方式來調整我的X-Window設定檔案？有沒有比較方便的方式來調整呢？當然有啦，我們可以使用 Mandrake 或者是 Red Hat 提供的好用的小程式呢！這一章的主要內容僅是讓你能夠克服無法進入 X-Window 的情況而已，而其他的中文化、中文輸入法以及相關的顯示功能，那可就得靠您自己收集資訊囉！
Linux 系統與指令練習題 2002/06/28 | 趕快來試試看對於 Linux 瞭解有多深？！這裡的題目都只與基礎系統有關，其他的關於 Server 的部分將在以後才會擺上來。
說明文件的製作 施工中 | 說明文件可是件很有趣的事情！因為他可以幫助我們更瞭解整個指令的運作吶！所以，在這個小章節中，我們會將整個說明文件的製作過程加以介紹，當然，包括了 man page 與 info page 喔！ info info man man
進階硬體管理 施工中 |

第六部分：其他備份文章
這部份的內容都是較早之前的文章囉！基本上是建構在 Red Hat 6.1 上面所書寫的內容，如果您使用的是舊的系統，那麼這些文章可能對您有點幫助，不過，大部分的內容都過時了，而且內容已經不再被維護囉！所以，努力的看完上面的內容吧！相信您對於 Linux 一定會愛不釋手的！

Red Hat 6.x 舊文件
very old
 這些是早期的 Red Hat 6.x 的相關基礎文件，當時寫的比較簡單，而且也比較沒有系統，不過，如果您還是使用舊版的 Red Hat 的話，那麼，或許還是有可以參考的地方吧！？ ^_^..

2002/06/28 以來統計人數

Designed by VBird during 2001-2003. Aerosol Lab.


什麼是 Linux
最近更新日期：2003/02/28
什麼是 Linux ？什麼是作業系統？
從 Unix 到 Linux 這一段歷史
什麼是 distribution
Linux 的功能與優缺點
一些名詞
本章習題練習
什麼是 Linux ？什麼是作業系統？
要瞭解 Linux 之前，就不能不知道什麼是作業系統 ( Operation System, OS )，所以，首先我們來簡單的說一說什麼是作業系統吧！先來想一想，當我們使用電腦時，螢幕上面顯示的咚咚是由哪裡來的？嗯！是由顯示卡與螢幕顯像的；那麼你現在可以藉由網路看到這篇文章，則是藉由 Internet 、網路卡、網路線以及所有相關的電子器材與網路器材所完成的一項任務！如果你要看 VCD 呢？那麼就需要光碟機、光碟、音效卡的發聲等等的支援。這麼說來的話，所以在『工作』的東西都是『硬體』的工作呀！對了！就是這些電腦硬體在工作的。那麼硬體怎麼工作呢？那就是藉由『作業系統』來達成的囉！這個作業系統就是在溝通你這個使用者跟硬體之間的訊息傳遞啦！也就是說，沒有作業系統，那麼你的電腦硬體就只是一堆廢鐵，什麼工作都不能做的！
那麼作業系統裡面含有什麼東西呢？簡單的來說，作業系統主要分為兩個東西，一個是『核心』、一個是『一堆核心提供的工具』我們以使用者常使用的 Windows 電腦來做一個簡單的說明好了。大家應該都使用過 Windows 電腦裡面的檔案總管吧？那麼當你開啟檔案總管的時候，他是否會顯示你硬碟當中的資料？這個顯示硬碟裡面的資料，就是『核心』幫你做的，但是，你要核心去顯示硬碟哪一個目錄下的資料，則是由『檔案總管』這個『工具』幫你達成的！這樣可以理解嗎？再來，如果您曾經使用過 Windows 2000 或 Windows XP 的話，那就更好了！你就應該聽過有所謂的『FAT32 與 NTFS 檔案格式』吧？在 Windows 98 這個早期的 Windows 版本中，他並無法讀取或者是找到 Windows XP 的 NTFS 檔案格式的硬碟，為什麼呢？因為他的『核心』本來就不認識 NTFS 啊！所以，即使你有檔案總管，但是由於核心根本不認識 NTFS ，所以，檔案總管也是沒有能力幫你達到你想要做的事情！這樣應該就更清楚了吧？沒錯！你的整個硬體是由核心來管理的，而如果核心不認識你的硬體，那麼你將無法使用該硬體設備，例如上面提到的 NTFS 檔案格式的硬碟！核心就是『 Kernel 』，他是一個作業系統的最底層的東西，由他來掌管整個硬體資源的工作狀態，而 Linux 有 Linux 自己的核心， Windows 也有他自己的核心。所以說，當有新的硬體加入到你的系統中的時候，那麼若你的『 Kernel 』並沒有支援他的時候，呵呵，這個新的硬體就肯定無法工作的，因為控制他的 Kernel 並不認識他呀！這樣瞭解了嗎？！先有個概略性的瞭解，後面我們提到『核心編譯』的時候會在更詳細的談到他！

一般來說，Kernel 管理的事項有：

  • System call interface ：一些服務與 kernel 溝通之後，將硬體的資源進一步的利用；
  • Process control ：系統程序控制中心，所以核心編的越小越好；
  • Memory management ：控制整個系統的記憶體管理；
  • File system management ：檔案系統的管理，例如 I/O 等等的工作啦！還有不同檔案格式的支援啦等等，如果你的核心不認識某個檔案系統，那麼您將無法使用該檔案格式的檔案囉！例如上面提到的 Windows 98 不認識 NTFS 檔案格式的硬碟；
  • Device drivers ：就如同上面提到的，硬體的管理是 Kernel 的主要工作之一，當然囉，裝置的驅動程式就是核心需要做的事情啦！好在目前都有所謂的『可載入模組』功能，可以將驅動程式編輯成模組，就不需要重新的編譯核心啦！這個也會在後續的核心編譯當中提到的！
    • 所以啦！所有硬體的資源都是他來管理的！至於我們要達成一些工作時，除了藉由核心本身提供的功能 ( 例如上面提到的檔案總管 ) 之外，還可以藉由其他的應用軟體來達成喔！舉個例子來說，你要看 VCD 影片是吧！那麼除了 Windows 提供的媒體播放程式之外，你也可以自行安裝 VCD 播放程式來播放 VCD 囉！這個播放程式就是應用軟體囉，而這個應用軟體可以幫你去控制核心來工作 ( 就是放映影片囉 ) ，因此，我們可以這樣說，核心是控制整個硬體支援的咚咚，也是一個作業系統的最底層，然而要讓整個作業系統更完備的話，那還需要含有相當豐富的核心提供的工具，以及核心相關的應用軟體來支援！
    OK！提到這裡那麼您知道 Linux 是什麼了嗎？呵呵！對啦！其實 Linux 就是一個作業系統，這個作業系統裡頭含有最主要的 kernel 以及 kernel 提供的工具啦！他提供了一個完整的作業系統當中最底層的硬體控制與資源管理的完整架構，這個架構是沿襲 Unix 良好的傳統來的，所以相當的穩定而功能強大！此外，由於這個優良的架構可以在目前的個人電腦 ( X86 系統 ) 上面跑，所以很多的軟體開發者將他們的工作心血移轉到這個架構上面，那就是很多的應用軟體啦！雖然 Linux 僅是其核心與核心提供的工具，不過，由於核心、核心工具與這些軟體開發者提供的軟體的整合，使得 Linux 成為一個更完整的、功能強大的作業系統囉！我們可以將 Linux 的系統與使用者的相關性看成底下的圖示：

    圖一、使用者、使用者介面與核心工具、核心、與硬體之相關性
    約略瞭解 Linux 是何物之後，接下來，我們要談一談，『為什麼說 Linux 是很穩定的作業系統呢？他是如何來的？』
    從 Unix 到 Linux 這一段歷史
      為什麼大家常常會說， Linux 是很穩定的一套作業系統呢？這是因為， Linux 他有個老前輩，那就是 Unix 家族囉！有這個前輩的提攜，讓 Linux 這個小老弟很快的就成為一套穩定而優良的作業系統啦！所以，底下我們來談一談 Unix 到 Linux 的這一段歷史吧！
      早在 Linux 出現之前的二十年 ( 大約在 1970 年代 )， 就有一個相當穩定而成熟的作業系統存在了！那就是 Linux 的老大哥『 Unix 』是也！怎麼這麼說呢？！他們這兩個傢伙有什麼關係呀？這裡就給他說一說囉！眾所皆知的， Linux 的核心是由 Linus Torvalds 在 1991 年的時候給他開發出來的，並且丟到網路上提供大家下載，後來大家覺得這個小東西 ( Linux Kernel ) 相當的小而精巧，所以慢慢的就有相當多的朋友投入這個小東西的研究領域裡面去了！但是為什麼這的小東西這麼棒呢？！然而又為什麼大家都可以免費的下載這個東西呢？！嗯！等鳥哥慢慢的唬xx....喔不！聽我慢慢的道來！
    • 一個沒有完成的夢想： Bell, MIT 與 GE 的『 Multics 』系統
      早期的電腦並不像現在的個人電腦一般，他可不是一般人碰的到的玩意兒，除非是軍事或者是高科技用途才有可能接觸到這類的 Computer ！而如前面所言，有電腦硬體還需要作業系統的配合才能夠發揮電腦的效能，不過，在那個年代，由於電腦算是『奢侈品』，喔∼應該說是『貴重物品』，所以，可能一間學校就只有一部大型主機當然，那個年代所謂的大型主機仍然無法提供適度的運算能力的。不過，既然只有一部大型主機，然而有許許多多的教師、學生要想要來使用，怎麼辦呢？為了解決這個問題，在 1960 年代初期，麻省理工學院 ( MIT ) 發展了所謂的『相容分時系統 ( Compatible Time-Sharing System, CTSS )』，就字面上的意義來看，他主要讓大型主機可以提供多個終端機連線進入主機使用主機的資源， ( 附帶一提，當時的終端機 ( Terminal ) 本身並沒有軟體或者可供使用的資源，這些終端機要能使用，一定必需要連線登入主機之後，才能夠使用主機的資源來工作！) 當時可以讓約 30 位使用者連線使用主機。而為了讓這個分時系統更加的強大，所以，在 1965 年前後由貝爾研究室 ( Bell )、 麻省理工學院 ( MIT ) 及奇異電器公司 ( GE ) 開始來共同開發一個名為 Multics 的大型計畫，目標是想讓大型主機可以連線 300 位以上的使用者。不過，在奮鬥了四年之後，該計畫仍然宣告不治...喔！是失敗啦！(註： Multics 有複雜、多數的意思。)
    • 一個小型檔案系統的產生：1969 年 Ken Thompson 的小型 file server system
      在複雜的 Multics 系統的計畫失敗後，貝爾研究室當然就退出該計畫。就在這個計畫解散之後，曾經參與 Muitics 的貝爾研究室的成員 Ken Thompson 由於自己工作上的需求，需要一套檔案存取的小型作業系統，便在 1969 年的時候以 DEC 公司 ( Digital Equipment Corporation ) 的電腦 PDP-7 為硬體基準，設計了一個適合自己工作環境的小型檔案系統，其中也含有他自行開發的一些小工具。那個系統就是最早期的 Unix 的源頭！當初 Ken 設計這個檔案系統時，主要是為了自己的存取方便所設計的簡單 OS ，因此將原有的 Multics 系統大幅度的簡化，不過，在當時還並沒有 Unix 這個名詞的出現！
    • Unix 的正式誕生：1973 年 Ritchie 等人以 C 語言寫出第一個正式 Unix 核心
      由於 Thompson 寫的那個作業系統實在太好用了，所以在 Bell 研究室內部廣為流傳，並且數度經過改版。到了 1973 年， Bell 研究室的 Dennis Ritchie 等人為了讓這個系統的執行效能更佳化，所以使用編譯效能更好的 C 語言將原有的 1969 年的那個系統之核心大幅度的改寫過，並且確定該作業系統名稱為 Unix，呵呵！那就是最早的 Unix 作業系統囉！不過，由於這個作業系統是由這一群工程師所開發完成的，而且使用者也大多是這方面的工程師，因此造成了後來 Unix 系統介面較難被一般使用者接受的情況 @_@ (註： 相對於 Multics ，Unix 具有單一的意思！)
    • 重要的 Unix 分支： 1977 年 BSD 的誕生
      在 Unix 早期的發展中，有一件相當重要的事情，那就是 BSD 的誕生！由於 C 語言是一種高階語言，他可以被應用在不同的硬體架構上面，而 Unix 本身就是 C 語言寫成的！在 Unix 發表之後， 柏克萊大學 ( Berkeley ) 的教授對於這個作業系統相當的有興趣，在經過取得 Unix 的原始碼，並且幾經修改之後，終於在 1977 年發表了第一代的 Berkeley Software Distribution ( BSD ) 。這個 BSD 是 Unix 的一個分支，他的發展對於 Unix 有相當大的影響，例如後來的 Sun 公司就是使用 BSD 發展的核心進行自己商業的 Unix 版本的發展的！
    • 百家齊鳴的 Unix 版本：
      由於 C 語言是一個相當高階的程式語言，他與硬體沒有很直接的相關性，例如你的 Windows 也可以執行 C 程式語言！而由於 Unix 是由 C 語言寫成的，因此，也就是說，你只要經過稍微的原始碼修改程序，就可以在不同的硬體架構上面執行這個作業系統！後來，由於 Unix 的方便性，因此很多的商業公司及學術機構就加入這個作業系統的研發囉。不過，也由於 Unix 的便利性與改寫容易，因此就造成了很多的不同版本的 Unix 囉，例如 ATT 的 System V 、 加州大學的 BSD 版、 IBM 的 AIX 等等。
      由於『作業系統的核心 ( Kernel ) 必須要跟硬體配合，以提供及控制硬體的資源進行良好的工作！』，而在早期每一家生產電腦硬體的公司還沒有所謂的『協定』的概念，所以每一個電腦公司出產的硬體自然就不相同囉！因此他們必須要為自己的電腦硬體開發合適的 Unix 系統，所以，他們自行開發的 Unix 當然只能配合本身的硬體配備囉！例如在學術機構相當有名的 Sun 、 Cray 與 HP 就是這一種情況，他們開發出來的 Unix 並沒有辦法在其他的硬體架構下工作的！ ( 我們都稱呼這種系統與配備為『超級電腦』 ) ！由於沒有廠商針對個人電腦設計 Unix 系統，因此，在早期並沒有支援個人電腦的 Unix 作業系統的出現 ( 當然，這是由於早期的個人電腦並沒有現在這樣風行就是了！ ) ，每一家公司自己出的 Unix 雖然在架構上面大同小異，但是卻真的僅能支援自身的硬體，所以囉，早先的 Unix 只能與伺服器 ( Server ) 或者是大型工作站 ( Workstation ) 劃上等號！
      此外，由於版本太多了，而大家都是同樣來自於 Unix 這個老祖宗，當然也都稱自己是 Unix ，好了，如此一來，許多商業公司自然就會有類似的軟體發表，喝！那麼自然就有些許的商業糾紛囉！真是傷腦筋∼
    • 1984 年的 GNU 與 Free Software Foundation：
      Unix 在商業上面的問題讓許多對於 Unix 喜好者感到相當的憂心，其中一個就是有名的 Richard M. Stallman 先生。他認為， Unix 是一個相當好的作業系統，在這個系統上面，如果大家能夠將自己所學的貢獻出來，那麼這個系統將會更加的優異！Stallman 先生認為最大的快樂就是讓自己發展的良好的軟體讓大家來使用了！而且，由於每個人的工作環境 ( 指軟硬體平台 ) 可能都不太相同，所以，他也強調應該要有 Open Source 的概念，讓大家都能夠分享這一份的心得！他認為，有了 Open Source 之後，你的程式將有很多的人可以幫忙檢驗，將使得 Unix 社群更佳的茁壯。為了自己的理想， Stallman 在 1984 年實際創立了 GNU 與 自由軟體基金會 ( Free Software Foundation, FSF )，並創作了許多『自由軟體』供大眾來使用，此外，對於其作品以自由 ( free ) 的 GNU General Public License ( GPL ) 的授權模式提供大眾使用。這個 FSF 的核心觀念是『版權制度是促進社會進步的手段，版權本身不是自然權力。』對於 FSF 有興趣或者對於 GNU 想要更深入的瞭解時，請參考朝陽大學的洪朝貴教授的網站，裡面有更為深入的解說！而且，Stallman 的 GNU General Public License 一直強調 Free 這個字眼！他是這樣說的：『"Free software" is a matter of liberty, not price. To understand the concept, you should thik of "free speech", not "free beer". "Free software" refers to the users freedom to run, copy, distribute, study, change, and improve the software』大意是說，自由軟體並不是指『免費』的，而是指具有『自由度, freedom』的軟體，什麼是自由度呢？也就是你在取得這個軟體之後，可以進行修改、進一步發表與複製在不同的電腦平台上面。這無疑是個好消息！因為如此一來，你所拿到的軟體可能原先只能在 Unix 上面跑，但是經過原始碼的修改之後，你將可以拿他在 Linux 或者是 Windows 上面來跑！Stallman 先生更直接對自由度下了這樣的說明：
      • 你可以根據任何你想要的提議 ( purpose ) 來跑這個 Free 的程式；
      • 你可以在理解了這支 Free 的程式的運作之後，將他修改成你所想要的樣式與功能；
      • 你可以將你自己修改過的 Free 的程式再次的發表，以幫助你的朋友們；
      • 你可以將這支 Free 的程式進行改良，並將改良過的程式公開發表，以造福社群！
      簡單的來說， GPL 授權具有幾個特點：
      • 任何軟體掛上 GPL 授權之後，即為自由的軟體，任何人均可取得，同時，亦可取得其原始碼 ( Source Code )；
      • 取得 GPL 授權之軟體後，任何人均可進行修改原始碼，以符合自己的喜好；
      • 除此之外，經過修改的 Source Code 應回報給網路社會，提供大家來參考！
      但請特別留意，並非掛上 GPL 之後的軟體就不可販賣，這個是不同的兩回事呦！舉個例子來說，在 Red Hat 的官方網站上面提供 Red Hat 釋出的 Linux 安裝光碟提供大眾下載，但是 Red Hat 本身依然有在賣 Linux 的套件，而且還賣的『很不便宜！』為何可以如此呢？呵呵！因為 Red Hat 他們賣的資料當中，含有相當大量經過整了的文件資料，這些資料雖然在網路上面可以下載，然而花了這麼多的時間來整理這些資料，當然應該要給予相當程度的報酬囉！您說是吧！所以，請留意喔！並非 GPL 不可用來營利！
      這個 GNU 對於後來的 Linux 有相當深遠的影響，由於 Stallman 先生發展了 GNU 這個計畫中，主力在推出各種方便而優異的工具軟體，例如廣為大家所知的 Emacs 文書編輯器、GCC, BASH..然而沒有作業平台怎麼使用這些軟體呢？然而，由於他倡導的自由軟體，讓後來的心血能很快的接觸原始碼來發展軟體，這就是後來的 Linux 的故事....這是後來的故事，等一下來說∼
    • 1988 年的圖形介面 X-Free86 project：
      有鑑於圖形使用者介面 ( Graphical User Interface, GUI ) 的需求日益加重，在 1984 年由 MIT 與其他協力廠商首次發表了 X Window System ，並且更在 1988 年成立了非營利性質的 XFree86 這個組織。所謂的 XFree86 其實是 X window system 與 Free 及 x86 系統架構的整合名稱呢！而這個 XFree86 的 GUI 介面更在 Linux 的核心 1.0 版於 1994 年釋出時，整合於 Linux 作業系統當中！
    • 1991 年 芬蘭大學生 Linus Torvalds 的一則簡訊：
      在後來的幾年內，由於電腦硬體工業的強力運作，以 intel 主導的 x86 系統架構的個人電腦大行其道，所以個人電腦算是相當流行的一個機器了！但在此時，人們使用的大多還是舊舊而且需要吃很多系統資源的 DOS 系列或其他的作業系統。 此時，有個芬蘭的郝爾辛基大學 (Helsinki )Linus Torvalds 學生做了件不尋常的事情！ Linus 手邊有個 Minix 系統 ( 這也是 Unix 的分支 ) ，他對這個作業系統相當的有興趣！此外，由於當時他正好買了一部 386 的電腦，所以他就想說，咦！這個 Unix 這麼棒！這麼穩定，那我可不可以將他移植到個人電腦 ( X86 架構 ) 來使用呢？！好在由於 Stallman 提倡的 Open Source 風氣，他得以接觸到一些 source code ，而就經由這樣的一個想法，呵呵！他就很有心的讀取 Unix 的核心，並且去除較為繁複的核心程序，將他改寫成可以適用於一般個人電腦的 x86 系統上面，到了 1991 年，他終於將 0.02 版的 hobby 放到網路上面供大家下載，並且由於 hobby 受到大家的肯定，相當多的朋友一起投入這個工作中！終於到了 1994 年將第一個完整的核心 Version 1.0 釋出！並且造成目前的大流行.....由於 Linux kernel 的發展是由『虛擬團隊』所達成的，大家都是透過網路取得 Linux 的核心原始碼，經由自己精心改造後再回傳給 Linux 社群，進而一步一步的發展完成完整的 Linux 系統，至於 Torvalds 先生是這個集團中的發起者。由於這個群策群力的緣故， Torvalds 先生將 Linux 定為同樣造福大家的 GNU 授權模式！
    • 企鵝的來源：
      1994年發表 Linux 正式核心 1.0 的時候，大家要 Linus Torvalds 想一隻吉祥物，怪怪的 Torvalds 突然想到小時候去動物園被一隻企鵝追著滿地打滾∼還被咬了一口！既然想不到其他的吉祥物了，乾脆就以這支企鵝來當吉祥物算了！所以，呵呵！目前我們常常看到這一隻企鵝就是這麼來的咯！
    什麼是 distribution
    好了，經由上面的說明，我們知道 Linux 是個『作業系統』，而且他是 GNU 的授權模式，並且有個老大哥是 Unix 。不過，畢竟由 Torvalds 先生負責維護的 Linux 提供的僅是『核心』與『核心工具』的集合，對於需要更完整功能的作業系統來說，畢竟還不夠完備，例如如果你要桌面程式，還得要加入 X-Window 系統對吧！？如果你要架設 WWW 還得加入伺服器軟體對吧？所以，雖然 Linux 的核心已經提供了相當多的支援與工具程式，但畢竟還不足以構成一個很完整的作業系統。
    好在，由於 Linux 的穩定性良好，並且可以在便宜的 x86 架構下的電腦平台運作，所以吸引了很多的套件商與自由軟體的開發團隊在這個 Linux 的核心上面開發相關的軟體，例如有名的 sendmail, wu-ftp, apache 等等。此外，亦有一些商業公司發現這個商機，因此，這些商業公司或者是非營利性的工作團隊，便將 Linux 核心、核心工具與相關的軟體集合起來，並加入自己公司或團隊的創意的系統管理模組與工具，而釋出一套可以完整安裝的作業系統，這個完整的 Linux 作業系統，我們就稱呼他為 distribution，或者是中文所謂的『安裝套件』囉！當然囉，由於是基於 GNU 的架構下，因此各家公司所發行的光碟套件是可以在網路上面自由下載的。不過，如果想要有較佳的服務，那麼購買該公司發行的光碟也是不錯的！
    不過，由於發展的 Linux 公司實在太多了，例如有名的 Red Hat, OpenLinux, Mandrake, Debian, SuSE 等等，所以很多人都很擔心，如此一來每個 distribution 是否都不相同呢？這就不需要擔心了，由於各個 distribution 都是架構在 Linux Kernel 下來發展屬於自己公司風格的 distribution，因此大家都遵守 Linux Standard Base ( LSB ) 的規範，也就是說，各個 distribution 其實都是差不多的！反正用到的都是 Linux Kernel 啊！只是各個 distribution 裡面所使用的各套件可能並不完全相同而已。所以囉，大家可以按照自己的喜好來選擇 Linux 的 distribution 光碟囉！底下列出幾個主要的 Linux 發行者網址：
    • Red Hat: http://www.redhat.com
    • Mandrake: http://www.linux-mandrake.com/en/
    • Slackware: http://www.slackware.com/
    • SuSE: http://www.suse.com/index_us.html
    • OpenLinux: http://www.caldera.com/
    • Debian: http://www.debian.org/
    • Linpus: http://www.linpus.com.tw/
    • UniteLinux:http://www.sco.com/unitedlinux/
    當然發行套件者不僅於此，您可以查閱其他的 Linux 新聞來發現喔！而其中中文化較為有名的就屬 CLE 這個套件發行者了！另外，台灣還有另一家 Linux 開發商，稱為 Linpus (百資)，有興趣的話也可以到底下的網頁上看看！
    • CLE：http://cle.linux.org.tw/
    • 百資：http://www.linpus.com.tw/
    好了，那麼哪一個安裝套件比較好呢？！就如同 VBird 前面提到的，每一個發行者所使用的 Linux 核心其實是一樣的，都是由 www.kernel.org 開發出來的核心呀！所以其架構，甚至包括其檔案放置的目錄，都是大同小異的，基本上除了某些內容套件不太一樣之外 ( 例如有人使用 wu-ftpd 有人使用 proftpd 等等 ) ，其他的檔案架構與指令系統其實幾乎都是相同的，因此我們不去探討哪一個套件比較棒！而是要來介紹如何學習與使用一個套件！至於下載的地點，網友提供了一個相當棒的多種 Linux distributions 的下載網站：
      www.linuxiso.org
    同時底下的網站還有各個著名的 Linux distribution 的比較！包括使用的熱門情況、市場佔有率、以及套件的相依程度等等：
    http://www.distrowatch.com/
    Linux 的功能與優缺點
    • Linux 的起源：
      前面提到了，Linus Torvalds 先生一直以來就喜歡那個小小的作業系統核心，而核心是管理一個系統的最底層的東西，所有的硬體資源都是由 kernel 來管控的！但是，就如同前面說的，早期的 Unix 並不支援 x86 的個人電腦架構，一直到了 1991 年在 BBS 裡面 Linus 先生貼了個小佈告之後，才有了重大的轉變：
      Hello everybody out there using minix-
      I'm doing a (free) operation system (just a hobby,
      won't be big and professional like gnu) for 386(486) AT clones.
      這封 BBS 的郵件即是由當時還是芬蘭的大學生 Linus Torvalds 所發表的，他說他修改了一個簡單的作業系統核心，核心名稱為 hobby，這個 hobby 的核心 ( Kernel ) 即為第一個 Linux 的核心系統！此外，由於他是基於 GNU 的協議而開發這個作業系統，所以他是 Free 的，任何人都可以下載使用！( 註：hobby 是個人興趣，just a hobby, won't be big and professional like gnu，其意思是：僅為個人興趣，不會玩得跟 gnu 那麼大啦~~~)
      Linus 所開發的這個 hobby 是基於 Unix 的系統所發展出來的，他將 Unix 裡面的很多資料又加以簡化，並且使之可以適用於 intel 主導的 x86 的系統下（當初的個人電腦系統為 386 與 486 架構），因此當初他所發表的這個最新的系統核心就被稱為 linus's unix ，簡稱為 Linux ！當然，由於這個核心很像是當時的 Unix 系統，因此也稱為 Unix-like 系統囉！( 註：其實 Unix-Like 可以說是目前伺服器類型的作業系統的統稱啦！因為，不論是 FreeBSD, BSD, Sun Unix, SCO Unix, HP Unix, Red Hat Linux, Mandrake Linux 等等，都是由同一個祖先『Unix』來的，因此，這些咚咚都被統稱為 Unix-Like 的作業系統囉！ )
      那麼這個系統有什麼特異功能呢？簡單的說：
      • 免費：由於他是基於 GPL ( General Public License ) 的架構之下，因此他是 Free 的，也就是任何人都可以免費的使用或者是修改其中的原始碼的意思！這就是所謂的『開放性架構』，這對科學界來說是相當重要的！因為很多的工程師由於特殊的需求，常常需要修改系統的原始碼，使該系統可以符合自己的需求！而這個開放性的架構將可以滿足各不同需求的工程師！因此當然就有可能越來越流行囉！
      • 配備需求低廉：而他可以支援個人電腦的 X86 架構，系統資源不必像早先的 Unix 系統那般，僅適合於單一公司 ( 例如 Sun ) 設備！單就這一點來看，就可以造成很大的流行囉！
      • 功能強大而穩定：也且由於功能並不會輸給一些大型的 Unix 工作站，因此，近年來越來越多的公司或者是團體、個人投入這一個作業系統的開發與整合工作！
      • 獨立作業：另外，由於很多的軟體套件逐漸被這套作業系統來來使用，而很多套件軟體也都在 Linux 這個作業系統上面進行發展與測試，因此， Linux 近來已經可以獨力完成幾乎所有的工作站或伺服器的服務了，例如 Web, Mail, Proxy, FTP.....。
      所以，目前他已經是相當成熟的一套作業系統囉！而且不耗資源又免費，呵呵，可以說造成微軟相當大的壓力呀！此外，由於他的系統硬體要求很低，加上目前很多的人由於『Intel 的陰謀』（呵呵！開玩笑的，因為 Tom 的硬體評論網站常常這樣說 Intel 的不是！呵！很好笑！）而造成手邊有相當多的淘汰掉的硬體配備， Linux 在這些被淘汰的硬體中就可以執行的相當的順暢與穩定！因此也造成相當多朋友的關注囉！
      這也是造成 Linux 成為最近幾年來最受矚目的作業系統之一，如前所述，他會受到矚目的原因主要是因為他是『free』的，就是免費的作業系統啦！然後他是開放性的系統，也就是你可以隨時的取得程式的原始碼，這對於程式開發工程師是很重要的！而且，雖然他是免費的，不過功能卻很強大！另外， Linux 對於硬體的需求是很低的，這一點更造成他流行的主因，因為硬體的汰換率太快了，所以很多人手邊都有一些很少在用的零件，這些零件組一組就可以用來跑 Linux 了，反正做一個工作站又不用使用到螢幕 ( 只要主機就可以囉 ) ，因此 Linux 就越來越流行囉！(插個嘴，也就是因為 Linux 具有 1.硬體需求低、 2.架構開放、 3.系統穩定性及保密性工能夠強、 4.完全免費，所以造成一些所謂『反微軟聯盟』的程式設計高手不斷的開發新軟體！以與 Microsoft 進行抗衡！)
    • Linux 的優點：
      那幹嘛要使用 Linux 做為我們的主機系統呢？這是因為 Linux 有底下這些優點：
      • 穩定的系統：Linux 本來就是建立在 Unix 上面發展出來的作業系統，因此，Linux 具有與 Unix 系統相似的的程式介面跟操作方式，當然也繼承了 Unix 穩定並且有效率的特點。常聽到安裝 Linux 的主機連續運做一年以上而不曾當機、不必關機是稀鬆平常的事；
      • 免費或少許費用：由於 Linux 是基於 GPL 的基礎下的產物，因此任何人皆可以自由取得 Linux ，至於一些『安裝套件』的發行者，他們發行的安裝光碟也僅需要些許費用即可獲得！不同於 Unix 需要負擔龐大的版權費用，當然也不同於微軟需要一而再、再而三的更新你的系統，並且繳納大量費用囉！
      • 安全性、漏洞的修補：如果你常玩網路的話，那麼你最常聽到的應該是『沒有絕對安全的主機』！沒錯！不過 Linux 由於支援者日眾，有相當多的熱心團體、個人參與其中的開發，因此可以隨時獲得最新的安全資訊，並給予隨時的更新，亦即是具有相對的較安全！
      • 多工、多使用者：與 Windows 系統不同的， Linux 主機上可以同時允許多人上線來工作，並且資源的分配較為公平，比起 Windows 的單人假多工系統要穩定的多囉！ 這個多人多工可是 Unix-Like 上面相當好的一個功能，怎麼說呢？你可以在一部 Linux 主機上面規劃出不同等級的使用者，而且每個使用者登入系統時的工作環境都可以不相同，此外，還可以允許不同的使用者在同一個時間登入主機，以同時使用主機的資源。
      • 使用者與群組的規劃：在 Linux 的機器中，檔案的屬性可以分為『可讀、可寫、可執行』等參數來定義一個檔案的適用性，此外，這些屬性還可以分為三個種類，分別是『檔案擁有者、檔案所屬群組、其他非擁有者與群組者』。這對於專案計畫或者其他計畫開發者具有相當良好的系統保密性。
      • 相對比較不耗資源的系統：Linux 只要一部 p-100 以上等級的電腦就可以安裝並且使用愉快囉！還不需要到 P-III 等級的電腦呢！不過，如果你要架設的是屬於大型的主機（服務上百人以上的主機系統），那麼就需要比較好一點的機器了。不過，目前市面上任何一款個人電腦均可以達到這一個要求囉！
    • Linux 的缺點：
      反正 Linux 好處說不完啦！不過雖然 Linux 具有這樣多的好處，但是他先天上有一個足以致命的地方，使他的普及率受到很大的限制，就是 Linux 需要使用 『指令列』 的終端機模式進行系統的管理！雖然近年來有很多的圖形介面開發使用在 Linux 上面，但畢竟要熟悉 Linux 還是以指令列來使用是比較好的，因此要接受 Linux的玩家必須比較要能熟悉對電腦下指令的行為，而不是用滑鼠點一點 icon 就行了！不過如果只是要架一些簡單的小站呢？是不是大家都可以做的到？沒錯！其實只要對 Linux 做一些小小的設定就可以架站了！
      • 沒有特定的支援廠商：因為所有的套件都是免費的，自然也就沒有專人會到府服務啦！不過，這點倒是不需要擔心，因為拜網路風行之賜，你要問的問題幾乎在網路上都可以找到答案喔！看你有沒有用心去找就是了！
      • 圖形介面作的還不夠好：其實是因為 VBird 不玩 X-windows 啦，所以也不知道目前發展到怎樣的一個地步了！基本上 VBird 常說的一句話就是：『Windows 上面有的咚咚 Linux 上面也一定可以找的到！，但 Linux 有的服務 Windows 可不見得有喔！』只不過，您可得自己找到自己想要的介面囉！
    一些名詞（GNU, GPL ？？）
    • Linux Standard Base ( LSB )
      由於 Linux 是一個沒有『規格品』樣式的新鮮玩意兒，如果大家都自己玩自己的，那麼可想而知的是，未來想要在 Linux 這個作業系統上面發展軟體與硬體的廠商一定會無所適從的！為了讓軟體開發商、與硬體發展者有一個依循的方向，因此而有 Linux Standard Base 這個玩意兒的誕生！所以，各個 distribution 也都要遵循 LSB 上面的規範，軟硬體發展者也都會依循 LSB ，所以囉，我們才會常常說，各大 distribution 雖然在提供的工具與創意上面有所不同，但是基本上，他們的 Linux 架構都是很類似的！因此，你只要玩一套 Linux distribution 也就夠了！其他的 distribution 應該就難不倒你囉！
    • Unix-Like
      其實 Unix-Like 可以說是目前伺服器類型的作業系統的統稱啦！因為，不論是 FreeBSD, BSD, Sun Unix, SCO Unix, HP Unix, Red Hat Linux, Mandrake Linux 等等，都是由同一個祖先『Linux』來的，因此，這些咚咚都被統稱為 Unix-Like 的作業系統囉！目前，很多的軟體在開發的時候，基本上，都已經可以是用在各個 Unix-Like 的平台上的！了不起，更改一些原始碼就可以適用你所在的平台囉！
    • 伺服器、工作站、終端機...
      由於網路的盛行，我們或許常常會聽到一些名詞ㄋㄟ∼所以，底下先來介紹幾個簡單的網路名詞吧！ ^_^，來認識一下什麼是 伺服器 ( Server )、工作站 ( Workstation ) 與終端機 ( Ternianl )？簡單的來說，你可以這樣認為：
      • 伺服器 ( Server )：提供 Internet 一種以上的網路服務的主機，例如 yahoo 提供的是 WWW 的服務，那麼 yahoo 就可以稱之為 伺服器 了！那麼，你自己架設一台 mail server 呢？呵呵！那也是一個小型的伺服器囉！所以，你必須要清楚的知道，伺服器是有規模大小之分的！目前一部 Linux 上面就可以架設多個伺服器軟體囉！例如 WWW 伺服器的 Apache 軟體、 FTP 伺服器的 Wu-ftp 軟體等等的；
      • 工作站 ( Workstation ) ：基本上，工作站可以視為僅提供一群特定人士，作為數值分析、科學用途的機器。例如我們研究室有一部 Sun 的機器，他僅提供我們研究室內部幾部電腦的連線，當我們有需要使用到 Fortran 這個程式語言時，就連線進入 Sun 這部機器，並在上面進行我們所需要的計算工作！這個就是工作站啦。而工作站與伺服器的差別，大概就在於有沒有提供 internet 上面的服務而已，例如，如果我將 Sun 上面的 mail server 開啟之後，那麼這部機器就可以稱之為伺服器 了！同時也是我們的工作站喔！當然，更廣義的定義是，只要是沒有對 Internet 上面提供網路服務的，那就是工作站了！這當然也就包含所謂的終端機！
      • 終端機 ( Terninal ) ：簡單的說，就是 end-user ( 就是你啦 ) 前面的那部電腦！呵呵，例如我都是使用我的工作機 ( Windows ) 連上我們的主機來工作，那麼這一部 Windows 的電腦，就可以稱為 terninal 機器囉！不過，更狹義的來說，『終端機』本身應該是不具備任何可以作業的軟體的，在終端機上面一定要連上 Server 之後，才能進行各項作業！那才是最狹義的終端機囉！例如我們前面說過的早期的大型主機連線模式！
      大致上的分別可以用上面的觀點來看！
    • 幾個常見的授權模式與定義
      說說幾個常見的授權模式吧：
      • GNU General Public License ：這個可以由剛剛的說明瞭解，他主要定義在『自由軟體』上面，任何掛上 GPL 授權的軟體，需要公布其原始碼 ( Open Source )，GPL 有幾個主要的大方向：
        1. 任何個人或公司均可釋出自由軟體 ( free software )；
        2. 任何釋出自由軟體的個人或公司，均可由自己的服務來收取適當的費用；
        3. 該軟體的原始碼 ( Source Code ) 需要隨軟體附上，並且是可公開發表的；
        4. 任何人均可透過任何正常管道取得此一自由軟體，且均可取得此一授權模式。
      • Freeware ：不同於 Free software ， Freeware 為『免費軟體』而非『自由軟體！』雖然他是免費的軟體，但是不見得要公布其原始碼，端看釋出者的意見囉！這個東西與 Open Source 畢竟是不太相同的東西喔！此外，目前很多標榜 免費軟體 的程式很多都有小問題！例如假借免費軟體的名義，實施使用者資料竊取的目的！所以『來路不明的軟體請勿安裝！』
      • Shareware ：共享軟體這個名詞就有趣了！與自由軟體有點類似的是， Shareware 在使用初期，他也是免費的，但是，到了所謂的『試用期限』之後，您就必須要選擇『付費後繼續使用』或者『將他移除』的宿命∼通常，這些共享軟體都會自行撰寫失效程式，讓你在試用期限之後就無法使用該軟體。
      • Berkeley Software Distribution (BSD) ：使用 BSD source code 最常接觸到的就是 BSD 授權模式了！這個授權模式其實與 GPL 很類似，而其精神也與 Open Source 相呼應呢！
      • Open Source ：Open source 表示軟體釋出時，一定伴隨著原始碼的釋出喔！通常他有幾個好處：
        1. 程式設計師通常會等到程式成熟之後才會釋出 ( 免得被笑, ^_^ )，所以通常程式在雛形的時候，就已經具有相當的優良體質；
        2. Open Source 的精神，相信當程式原設計人將程式原始碼釋出之後，其他的程式設計師接受這份原始碼之後，由於需要將程式改成自己所需的樣式，所以會經由本身的所學來加以改良，並從中加以改良與除蟲，所以程式的 debug 功能會比傳統的 close source 來的快！
        3. 由於程式是伴隨原始碼的，因此，系統將會不易存在鮮為人知的木馬程式或一些安全漏洞，相對而言，會比較更加的安全！
      • Close Source ：程式的核心是封閉的，優點是有專人維護，您不需要去更動他；缺點則是靈活度大打折扣，使用者無法變更該程式成為自己想要的樣式，此外，若有木馬程式或者安全漏洞，將會花上相當長的一段時間來除錯！
    • GNU General Public License ( GPL )
      上面我們提到了 Linux 是基於 GPL 的情況下而允許大眾可以做最大限度的使用！那麼 GPL 是什麼呢？基本上他是基於 GNU 的架構下的！簡單的說， GNU 就是『自由軟體』的意思，『自由軟體』是放置於網路上供人免費下載使用的軟體，基本上他會提供原始程式碼與編譯完成的執行檔（有的僅提供原始碼，要編譯得自己來才行），並鼓勵使用者修改程式使符合使用者本身的服務需求，當然囉，如果你將這些自由軟體修改之後，以商業的手法來販賣，也不會觸犯到什麼法律上的責任啦，只是如此一來則違反了自由軟體的創作美意了！在目前的臺灣教育界中，有一群老師也是在積極的從事這一種『自由軟體』的集體創作呢！如此一來將有助於臺灣中小學教師的電腦程度，並提供良好的學習環境呢！當真是很不錯呦！以下將 GNU/GPL 的中文譯本附上，大家可以稍微看一看囉！
      版權所有 (C) 1989，1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307USA
      允許每個人複製和發佈這一許可證原始文件的副本，但絕對不允許對它進行任何修改。
      聲明
      This is an unofficial translation of the GNU General Public License into Chinese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL-- only the original English text of the GNU GPL does that. However, we hope that this translation will help Chinese speakers understand the GNU GPL better.
      這是一份 GNU 通用公共許可證非正式的中文翻譯。它不是自由軟體基金會所發布，並且不能適用於使用 GNU GPL 的軟體 ── 只有 GNU GPL 英文原文的版本才行。然而，我們希望這份翻譯能幫助中文的使用者更了解 GNU GPL。
      序言
      大多數軟體許可證的用意在於剝奪您共享和修改軟體的自由。相反的，GNU 通用公共許可證力圖保證您共享和修改自由軟體的自由 ── 保證自由軟體對所有使用者都是自由的。GNU GPL 適用於大多數自由軟體基金會的軟體，以及任何因信任而採用 GNU GPL 的作者所開發的軟體。(有些自由軟體基金會軟體受 GNU 函式庫通用許可證的保護)。您也可以將它用到您的程式中。

      當我們談到自由軟體 ( free software ) 時，我們指的是自由而不是價格。我們把 GNU 通用公共許可證設計成您的　保障，讓您保有發佈自由軟體的自由 ( 您可以自由決定是否要對此項服務收取費用 )；確保您能收到程式原始碼或者在您需要時能得到它；確保您能修改軟體或將它的一部分用於新的自由軟體；而且還確保您知道您擁有這些權利。

      為了保護您的權利，我們需要作出規定：禁止任何人剝奪您的權利，或者要求您放棄這些權利。如果您修改了自由軟體或者發佈了軟體的副本，這些規定就轉化為您的責任。

      例如，如果您發佈這樣一個程式的副本，不管是免費的還是收費的，您必須將您具有的一切權利給予您的接受者；您必須確認他們能收到或得到原始程式碼；並且將這些條款給他們看，使他們知道他們有這樣的權利。

      我們採取兩項措施來保護您的權利：
      1.用版權來保護軟體。
      2.提供您許可證，賦予您複製，發佈和修改這些軟體的法律許可。
      同樣，為了保護每個作者和我們自己，我們需要清楚地讓每個人明白，自由軟體沒有擔保 ( no warranty )。如果由於某人修改了軟體，並繼續加以傳播，我們需要它的接受者明白：他們所得到的並不是原來的自由軟體。由其他人引入的任何問題，不應損害原作者的聲譽。

      最後，由於任何自由軟體不斷受到軟體專利的威脅，故我們希望避免這樣的風險。如果自由軟體的再發佈者以個人名義獲得專利許可證，也就等同將軟體變為私有。為防止這一點，我們必須明確聲明：任何專利必須以允許每個人自由使用為前提，否則就不准許有專利。

      下面是有關複製、發佈和修改的確切的條款和條件。
      GNU 通用公共許可證 有關複製，發佈和修改的條款和條件
      凡是版權所有者在其程式和作品中聲明其程式和作品可以在 GNU GPL 條款的約束下發佈，這樣的程式或作品都受到本許可證約束。下面提到的 "程式" 指的是任何這樣的程式或作品。而 "程式的衍生作品" 指的是這樣的程式或者版權法認定下的衍生作品，也就是說包含此程式或程式的一部分的套件，可以是原封不動的，或經過修改的，和/或翻譯成其他語言的 ( 程式 )。( 在下文中，"修改" 一詞的涵義一律包含翻譯作品。) 每個許可證接受人 ( license ) 用 "您" 來稱呼。

      本許可證條款不適用於複製，發佈和修改以外的行為。這些行為超出這些條款的範圍。執行本程式的行為不受條款的限制。而程式的輸出只有在其內容構成本程式的衍生作品 ( 並非只是因為該輸出由本程式所產生 ) 時，這一條款才適用。至於程式的輸出內容是否構成本程式的衍生作品，則取決於程式具體的用途。

      1. 只要您在每一程式副本上明顯和恰當地宣告版權聲明和不承擔擔保的聲明，並原封不動保持此許可證的聲明和沒有擔保的聲明，並將此許可證連同程式一起給其他每位程式接受者，您就可以用任何媒體複製和發佈您收到的程式的原始碼。

        您可以為轉讓副本的實際行動收取一定費用。您也可以自由決定是否以提供擔保來換取一定的費用。

      2. 您可以修改程式的一個或幾個副本或程式的任何部分，以此形成基於這些程式的衍生作品。只要您同時滿足下面的所有條件，您就可以按前面第一款的要求複製和發佈這一經過修改的程式或作品。

        • 您必須在修改過的檔案中附有明顯的說明：您修改了此一檔案及任何修改的日期。
        • 您必須讓您發佈或出版的作品，包括本程式的全部或一部分，或內含本程式的全部或部分所衍生的作品，允許第三方在此許可證條款下使用，並且不得因為此項授權行為而收費。
        • 如果修改的程式在執行時以交談方式讀取命令，您必須使它在開始進入一般的交談使用方式時列印或顯示聲明：包括適當的版權聲明和沒有擔保的聲明 ( 或者您提供擔保的聲明 )；使用者可以按此許可證條款重新發佈程式的聲明；並告訴使用者如何看到這一許可證的副本。 ( 例外的情況：如果原始程式以交談方式工作，但它通常並不列印這樣的聲明，那麼您基於此程式的作品也就不用列印聲明 )。

        這些要求適用於整個修改過的作品。如果能夠確定作品的一部分並非本程式的衍生產品，且可以合理地單獨考慮並將它與原作品分開的話，則當您將它作為獨立的作品發佈時，它不受此許可證和其條款的約束。但是當您將這部分與基於本程式的作品一同發佈時，則整個套件將受到本許可證條款約束，因為本許可證對於其他許可證持有人的授權擴大到整個產品，也就是套件的每個部分，不管它是誰寫的。

        因此，本條款的意圖不在於剝奪您對完全由您自身完成作品的權利，而是履行權利來控制基於本程式的集體作品或衍生作品的發佈。

        此外，將與本程式無關的作品和本程式 ( 或本程式的衍生作品 ) 一起放在貯存媒體或發佈媒體的同一卷上，並不導致將其他作品置於此許可證的約束範圍之內。

      3. 您可以以目標碼或可執行形式複製或發佈程式 ( 或符合第 2 款，本程式的衍生作品 )，只要您遵守前面的第 1、2 款，並同時滿足下列三條中的任一條。

        • 在通常用作軟體交換的媒體上，和目標碼一起附有機器可讀的完整的本程式原始碼。這些原始碼的發佈應符合上面第 1，2 款的要求。或者
        • 在通常用作軟體交換的媒體上，和目標碼一起，附上書面報價，提供替第三方複製原始碼的服務。該書面報價有效期不得少於 3 年，費用不得超過完成原程式發佈的實際成本，原始碼的發佈應符合上面的第 1，2 款的要求。或者
        • 和目標碼一起，附有您收到的發佈原碼的報價信息。 ( 這一條款只適用於非商業性發佈，而且您只收到程式的目標碼或可執行碼，和按 b 款要求提供的報價 )

        作品的原始碼指的是對作品進行修改最優先擇取的形式。對可執行的作品而言，完整的原始碼套件包括：所有模組的所有原始程式，加上有關的介面的定義，加上控制可執行作品的安裝和編譯的 script。至於那些通常伴隨著執行本程式所需的作業系統元件 ( 如編譯器、核心等 ) 而發佈的軟體 ( 不論是原始碼或可執行碼 )，則不在本許可證要求以程式原始碼形式伴隨發佈之列，除非它是本程式的一部分。

        如果可執行碼或目標碼是以指定複製地點的方式來發佈，那麼在同一地點提供等價的原始碼複製服務也可以算作原始碼的發佈，然而第三方並不需因此而負有必與目標碼一起複製原始碼的義務。

      4. 除了本許可證明白聲明的方式之外, 您不能複製，修改，轉發許可證和發佈程式。任何試圖用其他方式複製，修改，轉發許可證和發佈程式是無效的，而且將自動結束許可證賦予您的權利。然而，對那些從您那裡按許可證條款得到副本和權利的人們，只要他們繼續全面履行條款，許可證賦予他們的權利仍然有效。

      5. 您沒有在許可證上簽字，因而您沒有必要一定接受此一許可證。然而，沒有任何其他東西賦予您修改和發佈程式及其衍生作品的權利。如果您不接受許可證，這些行為是法律禁止的。因此，如果您修改或發佈程式 ( 或本程式的衍生作品 ) ，您就表明您接受這一許可證以及它的所有有關複製、發佈和修改程式或基於程式的作品的條款和條件。

      6. 每當您重新發佈程式 ( 或任何程式的衍生作品 ) 時，接受者自動從原始許可證頒發者那裡接到受這些條款和條件支配的複製、發佈或修改本程式的許可。您不可以增加任何條款來進一步限制本許可證賦予他們的權利。您也沒有強求第三方履行許可證條款的義務。

      7. 如果由於法院判決或違反專利的指控或任何其他原因 ( 不限於專利問題 ) 的結果，使得強加於您的條件 ( 不管是法院判決，協議或其他 ) 和許可證的條件有衝突時，他們也不能令您背離許可證的條款。在您不能同時滿足本許可證規定的義務及其他相關的義務來發佈程式時，則結果您只能夠根本不發佈程式。例如，如果某一專利許可證不允許所有直接或間接從您那裡接受副本的人們，在不付專利費的情況下重新發佈程式，唯一能同時滿足兩方面要求的辦法是停止發佈程式。

        如果本條款的任何部分在特定的環境下無效或無法實施，就使用條款的其餘部分，並將這部分條款作為整體用於其他環境。

        本條款的目的不在於引誘您侵犯專利或其他財產權的要求，或爭論這種要求的有效性。本條款的主要目的在於保護自由軟體發佈系統的完整性。它是通過公共許可證的應用來實現的。許多人已依賴同是出自此系統的應用程式，經由此系統發佈大量自由軟體而做出慷慨的供獻。作者 / 捐獻者有權決定他/她是否通過任何其他系統發佈軟體，許可證接受者不能強迫作者 / 捐獻者做某種特定的選擇。

        我們相信許可證其他部分已涵蓋本節所述狀況，本節目的只在更明確說明許可證其餘部分可能產生的結果。

      8. 如果由於專利或者由於有版權的介面問題使程式在某些國家的發佈和使用受到限制，則以本許可證發佈程式的原始作者可以增加發佈地區的限制條款，將這些國家明確排除在外，並在這些國家以外的地區發佈程式。在這種情況下，這些限制條款如同寫入本許可證一樣，成為許可證的條款。

      9. 自由軟體基金會可能隨時出版通用公共許可證的修改版或新版。新版和當前的版本在精神上保持一致，但在細節上可能有出入，以處理新的問題與狀況。

        每一版本都有不同的版本號。如果程式指定可適用的許可證版本號以及 "任何更新的版本" ，您有權選擇遵循指定的版本或自由軟體基金會以後出版的新版本。如果程式未指定許可證版本，您可選擇自由軟體基金會已經出版的任何版本。

      10. 如果您願意將程式的一部分結合到其他自由程式中，而它們的發佈條件不同，請寫信給作者，要求準予使用。如果是自由軟體基金會加以版權保護的軟體，請寫信給自由軟體基金會，我們有時會作為例外的情況處理。我們的決定受兩個主要目標的指導，這兩個主要目標是：我們的自由軟體的衍生作品繼續保持自由狀態，以及從整體上促進軟體的共享和重複利用。

      11. 沒有擔保
        由於程式准予免費使用，在適用法准許的範圍內，對程式沒有擔保。除非另有書面說明，版權所有者和/或其他提供程式的人們 "一樣" 不提供任何類型的擔保，不論是明確的，還是隱含的，包括但不限於可銷售和適合特定用途的隱含保證。全部的風險，如程式的質量和性能問題都由您來承擔。如果程式出現缺陷，您應當承擔所有必要的服務、修復和改正的費用。

      12. 除非適用法或書面協議的要求，在任何情況下，任何版權所有者或任何按許可證條款修改和發佈程式的人們都不對您的損失負有任何責任。包括由於使用或不能使用程式引起的任何一般的、特殊的、偶然發生的或重大的損失 ( 包括但不限於數據的損失，或者數據變得不精確，或者您或第三方的持續的損失，或者程式不能和其他程式協調運行等 ) 。即使版權所有者和其他人已被告知這種損失的可能性也不例外。
      條款結束

      ( 譯註：以下不是法律條文，只是要教一般的程式設計師如何使用 GNU GPL )
      如何將這些條款用到您的新程式

        如果您開發了新程式，而且您需要它得到公眾最大限度的利用，要做到這一點的最好辦法是將它施以 GNU GPL，使得每個人都能循此條款來修改和重新發佈你寫的軟體。

        為了做到這一點，請將程式附上下列聲明。最安全的方式是將它放在每個原始碼檔案的開頭，以便最有效地傳遞沒有擔保的信息。每個文件至少應有 "版權所有" 行以及在什麼地方能看到聲明全文的說明。

        用一行空間描述程式的名稱和它的用途版權所有 (C) 19XX 作者姓名

        本程式是自由軟體，您可以遵照自由軟體基金會 ( Free Software Foundation ) 出版的 GNU 通用公共許可證條款 ( GNU General Public License ) 第二版來修改和重新發佈這一程式，或者自由選擇使用任何更新的版本。

        發佈這一程式的目的是希望它有用，但沒有任何擔保。甚至沒有適合特定目的而隱含的擔保。更詳細的情況請參閱 GNU 通用公共許可證。

        您應該已經和程式一起收到一份 GNU 通用公共許可證的副本。如果還沒有，寫信給：
        Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

        此外還應加上如何和您保持聯繫的信息。

        如果程式以交談方式進行工作，當它開始進入交互方式工作時，應輸出類似下面的簡短聲明：
        Gnomovision 第 69 版，版權所有 (C) 19XX，作者姓名， Gnomovision 絕對沒有擔保。要知道詳細情況，請輸入 "show w"。 這是自由軟體，歡迎您遵守一定的條件重新發佈它，要知道詳細情況，請輸入 "show c"。

        假設的命令 "show w" 和 "show c" 應顯示通用公共許可證的相應條款。當然，您使用的命令名稱可以不同於 "show w" 和 "show c" 。根據您的程式的具體情況，也可以用選單或滑鼠來顯示這些條款。

        如果需要，您應該取得您的上司 ( 如果您是程式員 ) 或您的學校簽署放棄程式版權的聲明。下面只是一個例子，您應該改變相應的名稱：
        Yoyodyne 公司以此方式放棄 James Hacker 所寫的 Gnomovision 程式的全部版權利益。
        Ty coon 簽名，1989.4.1 Ty coon 副總裁

        這一許可證不允許您將程式併入私有程式。如果您的程式是一個子函式庫。您可能會認為讓它和私有的應用程式連接會更有用。如果您想這麼做，請使用 GNU 函式庫通用公共許可證代替本許可證。
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • 請問『 核心, kernel 』是什麼？而『作業系統』又是什麼？
      答：
        一部機器是否能夠正常的工作，需要藉由『核心』來管理，因此，『核心』可以說是一部機器是否能夠正常運作的主要咚咚！而這個『核心』就是所謂的『作業系統』最底層的元件了，他負責了作業系統與『硬體』之間的溝通，而我們要利用作業系統來使硬體正常的工作，也需要藉由『核心』來幫忙轉譯才行。至於所謂的『作業系統』則是建構在核心之上，加入許多的功能與物件，好讓使用者能夠更加輕易的管理核心來操縱硬體工作。至於『使用者、使用者操作介面、核心、硬體』之間的相關性就如同前面圖一的圖示所示。
    • 有個朋友問我說『 Linux 是什麼？』我該如何回答比較好？
      答：
        Linux 是由芬蘭人 Linus Torvalds 先生所寫出來的一個小核心作業系統，由於此一作業系統是依據 Unix 的核心修改而來的，因此這個作業系統承接了 Unix 的良好傳統：穩定性高、多人多工環境設計優良、要求配備較低等優點。不過， Linux 其實就是一個『核心』，這個『核心』是管理與操縱硬體來正確工作的主要功能。目前我們提到的 Linux 不論是由何家公司所發產出來的，都是使用 http://www.kernel.org 所釋出的 Linux 核心呢！
    • 怎麼有這麼多版本的 Linux 呢？有 Mandrake, Red Hat, CLE, OpenLinux… 一大堆，這些版本有什麼異同？
      答：
        就如同前面一題提到的， Linux 其實就是一個『核心』，而各開發商依據這個核心的功能，安置了各式各樣的伺服器與桌面程式，以構成可以完整安裝在個人電腦的光碟釋出版本，這就是各個版本的來源啦 ( distribution )，所以，各個 distribution 的伺服器與桌面程式或許有些許的不同，但是基本的檔案架構、BASH Shell 及基本操作系統與介面，都是相同的，因為，他們都是使用 www.kernel.org 所提供的核心來發展的！
    • 我要如何取得 Linux distribution 的可安裝光碟？
      答：
        目前各大版本的 Linux distribution 大致上仍然依附在 GPL 這個授權碼之上，因此在網路上面都可以輕易的下載，若有興趣的話可以到各發展的廠商主網頁去下載。然而為了頻寬的節省起見，建議在台灣以映像站台來下載速度上會快上很多，特別建議南台灣朋友可以到中山大學的 FTP 站 ( http://ftp.nsysu.edu.tw )下載資料！
    • 簡單的說明一下什麼是 GNU 的 GPL ？
      答：
      1. 任何個人或公司均可釋出自由軟體 ( free software )；
      2. 任何釋出自由軟體的個人或公司，均可由自己的服務來收取適當的費用；
      3. 該軟體的原始碼 ( Source Code ) 需要隨軟體附上，並且是可公開發表的；
      4. 任何人均可透過任何正常管道取得此一自由軟體，且均可取得此一授權模式。
    • 何謂多人 ( Multi-user ) 多工 ( Multitask )？
      答：
        Multiuser 指的是 Linux 允許多人同時連上主機之外，每個使用者皆有其各人的使用環境，並且可以同時使用系統的資源！
        Multitask 指的是多工環境，在 Linux 系統下， CPU 與其他例如網路資源可以同時進行多項工作， Linux 最大的特色之一即在於其多工時，資源分配較為平均！
    • 簡單說明 GNU General Public License ( GPL ) 與 Open Source 的精神：
      答：
      1. GPL 的授權之軟體，乃為自由軟體（Free software），任何人皆可擁有他；
      2. 開發 GPL 的團體(或商業企業)可以經由該軟體的服務來取得服務的費用；
      3. 經過 GPL 授權的軟體，其屬於 Open source 的情況，所以應該公布其原始碼；
      4. 任何人皆可修改經由 GPL 授權過的軟體，使符合自己的需求；
      5. 經過修改過後 Open source 應該回饋給 Linux 社群。
        (PS. Open source 最大的優點為多人維護， debugs 的速度較快，程式亦較為安全，但是缺點則是缺乏『專人』維護！)
    2002/06/25：第一次完成
    2003/01/26：重新修訂，加入一些歷史事件、重新編排與加入 FAQ
    2003/02/28：加入百資以及 distrowatch 兩個網站的推薦！
    2002/02/03以來統計人數


如何學習 Linux
最近更新日期：2003/01/28
Linux 的應用
從『頭』學起
選擇一本好的工具書
實作經驗
X-Window 還是 command line
網路資料查詢
真的沒辦法、發問吧！
其他的一些建議
本章習題練習
Linux 的應用：
要談到 Linux 如何學習之前，我們得就 Linux 目前的一般應用來說明一下，才好理解您需要什麼樣的學習方式！
  • 桌上型電腦：
    所謂的桌上型電腦就是一般使用者在螢幕前面工作時候的常見的作業系統了！我們稱之為『Desktop』系統，就是簡稱的桌上型電腦了！說到桌上型電腦就不能不提一下 X-Window System 。
    • 由前一章提到的 Unix 與 Linux 的歷史中，我們知道在 1986 年美美的視窗畫面就已經在 Unix 上面出現過了，那個時候視窗畫面被簡稱為 X 系統，而後來到了 1994 年的時候正式被整合在 Linux 裡頭！至於微軟的 Windows 則是在 1995 年才出現！
    • 所謂的 X Window System 就是以 XFree86 這個計畫釋出的 X11 這個視窗軟體為管理顯示核心的一套視窗介面的軟體，我們常常簡稱他為圖形使用者介面( Graphical User Interface )。這個 XFree86 只是 Linux 核心上面的一套軟體而已，他主要的工作就是管理圖形介面輸出的時候，幾乎所有顯示相關的硬體的控制，例如顯示卡、螢幕、鍵盤、滑鼠、等等，都是 XFree86 管理的！或者，我們可以稱 XFree86 為 X-Window System 的伺服器，簡稱為 X Server 。
    • 至於我們所看到的美美的視窗畫面，則是使用 X Server 提供的顯示相關硬體的功能，來達到圖形顯示的『視窗管理員( Window Mananger, WM )』所發揮的能力啦！這也就是說， WM 是掛在 X Server 上面來運作的一套顯示視窗介面的軟體，例如我們常見的 KDE, GNOME 等等都是 WM。
    那麼這個桌上型電腦平時都在幹些什麼？簡單的說，桌上型電腦的日常工作是：
    • 上網瀏覽；
    • 文書處理；
    • 網路介面之公文處理系統；
    • 辦公室軟體( Office Software )處理資料；
    • 收發電子郵件；
    大致上就是這些工作囉！在這些工作中， Linux 有美麗的圖形介面 X Window System 提供良好的使用者介面 ( GUI ) ，此外，目前發展中的 WM 也都具有中文化的功能！至於 Office 軟體則有類似 Open Office 的軟體支援，所以，基本上在桌上型電腦型態的使用中， Linux 已經足以應付大部分的上班族群的工作了。
  • 工作站電腦：
    工作站電腦與桌上型電腦不太一樣的地方，在於工作站通常得要應付比較重要的公事應用，例如工程界流體力學的數值模式運算、娛樂事業的特效功能處理、軟體開發者的工作平台等等。Linux 上面有強大的運算能力，以及支援度相當廣泛的 GCC 編譯軟體，因此在工作站當中也是相當良好的一個作業系統選擇。例如我們研究室目前就要將 Sun Unix 上面執行的大型模式移轉到 Linux 上面，據美國環保署內部人員的測試，發現 Linux 不但比較便宜 ( X86 系統嘛！ )而且速度還比較快呢！
  • 網路伺服器：
    承襲了 Unix 的良好傳統， Linux 上面的網路功能特別的強大！此外，由於 GNU 計畫，讓 Linux 上面的伺服器軟體幾乎都是免費的！因此，做為一部網路伺服器，例如 WWW, Mail Server, File Server, FTP Server 等等， Linux 絕對是上上之選！
  • 嵌入式系統：
    近年來電子相關產業相當的蓬勃發展，其中，小型微電腦的發展甚為重要！例如家電產品、PDA、以及其他微型的電腦配備。這些電腦配備通常是直接嵌入於產品當中的，例如 PDA 本身就是一個小型的電腦作業系統啦！這些系統我們就稱為嵌入式系統。而要讓這些嵌入式系統能夠動作，自然就需要製作一套簡單的作業系統囉，這個時候，可修改核心讓功能變簡單的 Linux 則是很好的選擇。因此，近年來有相當多的嵌入式系統選擇 Linux 做為發展的平台呢！
上面這些就是目前常見的幾個 Linux 的應用方向。那麼根據上面的應用，你覺得應該要怎樣學習 Linux 呢？
從『頭』學起
其實，不論學什麼系統，『從頭學起』是很重要的！還記得你剛剛接觸微軟的 Windows 都在幹什麼？還不就是由檔案總管學起，然後慢慢的完到控制台、玩到桌面管理，然後還去學辦公室軟體，我想，你總該不會直接就套過這一段學習的歷程吧！？那麼 Linux 的學習其實也差不多，就是要從頭慢慢的學起啦！不能夠還不會走路之前就想要學飛了吧！ ^_^！
常常有些朋友會寫信來問鳥哥一些問題，不過，信件中大多數的問題都是很基礎的！例如：『為什麼我的使用者個人網頁顯示我沒有權限進入？』、『為什麼我下達一個指令的時候，系統告訴我找不到該指令？』、『我要如何限制使用者的權限』等等的問題，這些問題其實都不是很難的，只要瞭解了 Linux 的基礎之後，應該就可以很輕易的解決掉這方面的問題呢！所以請耐心的，慢慢的，將後面的所有章節內容都看完。自然你就知道如何解決了！
此外，網路基礎與安全也很重要，例如 IP 的基礎，網路的 Gateway 設定基礎與網路的相關概念！很多的朋友一開始問的問題就是『為什麼我的 mail server 無法收到信件？』這種問題相當的困擾，因為發生的原因太多了，而朋友們常常一接觸 Linux 就是希望『架站！』根本沒有想到要先瞭解一下 Linux 的基礎！這是相當傷腦筋的！尤其近來電腦怪客 ( Cracker ) 相當多， ( 真奇怪，閒閒沒事幹的朋友還真是不少.... ) ，一個不小心您的主機就被當成怪客跳板了！甚至發生被警告的事件也層出不窮！這些都是沒能好好的注意一下網路基礎的原因呀！
所以， 鳥哥希望大家能夠更瞭解 Linux ，好讓他可以為你做更多的事情喔！而且這些基礎知識是學習更深入的技巧的必備條件呀！因此建議：
  1. 先理解一下基礎的硬體知識，不用一定要全懂(沒那麼多時間)，但是至少要『聽過、有概念』即可；
  2. 先瞭解一下 Linux 的基礎知識，這些包含了『使用者、群組的概念』、『權限的觀念』，『程序的定義』等等；
  3. 必需至少學會一種以上的文書編輯器，例如最好學會通用版本的 vi 囉！
  4. 實際操作 Linux 時，必定要學習的 Shell ，最好 Shell scripts 也能夠瞭解；
  5. 如果上面你都通過了，那麼網路的基礎就是下一階段要接觸的咚咚，這部份包含了『IP 概念』『路由概念』『TCP/IP』等等；
  6. 如果連網路基礎都通過了，那麼網站的架設對你來說，簡直就是『太簡單啦！』
在一些基礎知識上，這裡推薦一下 Study-Area 裡面的基礎文章，相當的實用！
  • 電腦基礎
  • 網路基礎
選擇一本好的工具書
『工具書』對於學習者而言是相當重要的！不過，一本錯誤觀念的工具書卻會讓新手整個誤入歧途....，以下有幾個網站有特別介紹了幾本書籍，如果有興趣的話，歡迎參考看看！實在是很建議買一本『基礎一點』的工具書來學習 Linux ，等到有一定的基礎之後，才來買架設網站以及『安全防護』方面的書籍，尤其是『安全防護』的書籍， VBird 認為，網路安全一定會越來越受到重視的！當然，有興趣的話，小弟的『鳥哥的 Linux 私房菜 -- 基礎學習篇』也可以參考看看囉！ ^_^
  • 請推薦有關網路的書
  • 小紅帽技術論壇
實作經驗
要增加自己的體力，就是只有運動；要增加自己的知識，就只有讀書；當然，要增加自己對於 Linux 的認識，大概就只有實作經驗了！所以，趕快找一部電腦，趕快安裝一個 Linux 套件，然後快點進入 Linux 的世界裡面晃一晃！相信對於你自己的 Linux 能力必然大有斬獲！除了自己的實作經驗之外，也可以參考網路上一些善心人士整理的實作經驗分享喔！例如最有名的 Study-Area ( http://www.study-area.org )等網站。
此外，人腦不像電腦的硬碟一樣，除非硬碟壞掉了或者是資料被你抹掉了，否則儲存的資料將永遠而且立刻的記憶在硬碟中！在人類記憶的曲線中，你必須要『不斷的重複練習』才會將一件事情記得比較熟！同樣的，學習 Linux 也一樣，如果你無法經常摸索的話，那麼，抱歉的是，學了後面的，前面的忘光光！學了等於沒學，這也是為什麼鳥哥當初要寫『鳥哥的私房菜』這個網站的主要原因，因為，我的忘性似乎比一般人還要好∼∼呵呵！所以，除了要實作之外，還得要常摸！才會熟悉 Linux 而且不會怕他呢！
好了，底下列出幾個學習網站來提供大家做為參考實作的依據：（註：由於不同的網站當初撰寫的時候所用的 Linux 套件或版本與目前的主流並不相同，因此參考他人的實作經驗時，必須要特別留意對方的版本，否則反而可能造成你的困擾喔！）
  • Study-Area
  • 鳥哥的私房菜館
  • 狼主的網路實驗室
  • 臥龍大師的網路技術文件
  • 大南國小（林克敏主任文件集）
  • 張毓麟先生的小文章
  • 臺灣 Linux 社群
  • 吳仁智的文件集
X-Window 還是 command line
    由前面的介紹我們可以知道，雖然目前 X-Window 的介面越做越漂亮，而且也已經漸漸的可以來控管整個系統了！但是必須要注意的是， X-Window 畢竟還只是一個 Linux 上面的軟體，並不是一套『作業系統』，所以實際上使用他來設定系統的時候，還是有相當多的困擾的，因為畢竟他無法完全的管理好我們的 Linux 啊！雖然就以 Desktop 的型態來說，X-Window 是讓 Linux 立刻深入人心的方法。不過， X-Window 在使用的時候還是有相當多的問題的，最大的問題來自於『系統資源的有效應用』，以 VBird 的使用情況來說，我的系統資源並沒有很好，但是 X-Window 本身相當的消耗系統資源，如果一開 X-Window ，那麼你的記憶體幾乎都被 X-Window 吃光了！您要如何來用剩下的系統資源來進行高效率的其他工作呢？！這也是為什麼很多的書籍與網站都會希望使用者架設網站的時候，不要啟動圖形使用者介面 的原因囉！
    以下再來說說 X-Window 學習與 command line 學習的角度。
  • X-Window
    如果您對於 Linux 的要求是『桌上型電腦』，並且你又不架設網站的話，那麼學習 X-Window 對您而言，絕對是需要的！至於指令列模式對你就不是這麼必要了！但是，如果 Linux 對你而言是『伺服器與工作站』的話，那麼 X-Window 可能就不是這麼重要，但是指令列模式可就大大的重要啦！
    因為，如果以 X-Window 作為學習 Linux 的方式，那麼未來一定會有死角，這是因為 X-Window 了不起也只是 Linux 的『一套軟體』而不是『Linux 核心』此外，目前發展出來的 X-Window 對於系統的管理上還是有無法掌握的地方， 舉個例子來說，如果 Linux 本身捉不到網路卡的時候， 請問如何以 X-Window 來捉這個硬體呢？！還有，如果需要以 tarball 的方式來安裝軟體並加以設定的時候， 請以 X-Window 來架設他！這可能嗎？當然可能，但是這是在考驗『X-Window 開發商』的技術能力， 對於瞭解 Linux 架構與核心並沒有多大的幫助的！所以說，如果只是想要『會使用 Linux 』的角度來看， 那麼確實使用 X-Window 也就足夠了，反正搞不定的話，花錢請專家來搞定即可；但是如果想要更深入 Linux 的話，那麼指令列模式才是不二的學習方式！
  • 伺服器端
    如果 Linux 對你而言是『生財』的工具，呵呵！那可不是只要學習 X-Window 能夠解決的了！舉個例子來說好了，假如你的客戶人在台北，而你人在遠方的台南，他的 Linux 伺服器出了問題，要你馬上解決他， 請問：要您親自上台北去修理？還是他搬機器下來讓你修理？！或者是直接請他開個帳號給你進去設定即可？！想當然爾，就會選擇開帳號給你進入設定即可囉！因為這是最簡單而且迅速的方法！然而這個方法使用的方式卻不是 X-Window 作的到的！因為 X-Window 太耗資源，實在不容易讓您這樣子連線（很麻煩的啦！）所以囉！文字界面是相當重要的！尤其如果想要深入 Linux 的核心時，那麼以文字界面來瞭解 Linux 就更需要了！所以說，不要怕麻煩，還是多摸一些文字界面的東西吧！！幫助會比較大哩！
    所以基本上， VBird 還是希望大家可以多多的以 文字介面( command line )的方式來學習 Linux 啦！
網路資料查詢
其實，在網路上面已經有相當多的 FAQ 整理出來了！所以，當你發生任何問題的時候，除了自己檢查，或者到上述的實作網站上面查詢一下是否有設定錯誤的問題之外，最重要的當然就是到各大 FAQ 的網站上查詢囉！以下列出一些有用的 FAQ 網站給您參考一下：
  • CLDP 中文文件計畫
  • Unix 的一般常見問題
  • asklinux
還有相當的的網路資源可以查詢！如果你有發現更新的資訊時，記得來信通知 VBird 喔！
真的沒辦法、發問吧
  • 天助自助者：
    一般而言， Linux 在下達指令的過程當中，或者是 log file 裡頭就可以自己查得錯誤資訊了，舉個例子來說，當您下達：
      ls -l /vbird
    時，由於系統並沒有 /vbird 這個目錄，所以會在螢幕前面顯示：
      ls: /vbird: No such file or directory
    這個錯誤訊息夠明確了吧！系統很完整的告訴您『查無該資料』！呵呵！所以囉，請注意，發生錯誤的時候，請先自行以螢幕前面的資訊來進行 debug ( 除錯 )的動作，然後，如果是網路服務的問題時，請到 /var/log 這個目錄裡頭去查閱一下 log file ，這樣可以幾乎解決大部分的問題了！
  • 討論區的提問：
    萬一真的經過了自己的查詢，卻找不到相關的資訊，那麼就發問吧！不過，在發問之前建議您最好先看一下『提問的智慧』這一篇討論！然後，你可以到底下幾個討論區發問看看：
    • Study-Area 討論區
    • 鳥哥的私房菜館討論區
    • 狼主的網路實驗室討論區
    • 小紅帽技術論壇
    • LinuxFab
    • 竹貓星球
    不過，基本上每一個討論區的內容是大同小異的，發問的時候一定要注意到某些禮節！最好是先以搜尋的方式搜尋一下該討論區是否有您需要的文章之後，在發問！這樣可以獲得事半功倍的功能喔！此外， Netman 兄提供的一些學習的基本方針，提供給大家參考：
    • 在Windows裡面﹐程式有問題時﹐如果可能的話先將所有其它程式保存並結束﹐然後嘗試按救命三鍵(Ctrl+Alt+Delete)﹐將有問題的程式(不要選錯了程式哦)“結束工作”﹐看看能不能恢復系統。不要動不動就直接關機或reset。
    • 有系統地設計檔案目錄﹐不要隨便到處保存檔案以至以後不知道放哪裡了﹐或找到檔案也不知道為何物。
    • 養成一個做記錄的習慣。尤其是發現問題的時候﹐把錯誤信息和引發狀況以及解決方法記錄清楚﹐同時最後歸類幾定期整理。別以為您還年輕﹐等你再弄多幾年電腦了﹐您將會非常慶幸您有此一習慣。
    • 如果看在網路上看到任何好文章﹐可以為自己留一份copy﹐同時定好題目﹐歸類存檔。
    • 作為一個使用者﹐人要遷就機器﹔做為一個開發者﹐要機器遷就人。
    • 學寫 script 的確沒設定 server 那麼好玩﹐不過以我自己的感覺是﹕關鍵是會得“偷”﹐偷了會得改﹐改了會得變﹐變則通矣。
    • 在Windows裡面﹐設定不好設備﹐您可以罵它﹔在Linux裡面﹐如果設定好設備了﹐您得要感激它﹗
其他的一些建議
除了上面的學習建議之外，還有其他的建議嗎？確實是有的！其實，無論作什麼事情，對人類而言，兩個重要的因素是造成我們學習的原動力：
  • 成就感
  • 興趣
很多人問過我，鳥哥是怎麼學習 Linux 的？由鳥哥之前的 自我介紹 與對於 Linux 的接觸歷程，你大概會知道，原來我本人對於電腦就蠻有興趣的，加上工作的需要，而鳥哥又從中得到了相當多的成就感，所以囉，就一發不可收拾的愛上 Linux 囉！因此，鳥哥個人認為，學習 Linux 如果玩不出興趣，他對你也不是什麼重要的生財工具，那麼就不要再玩下去了！因為很累人ㄋㄟ∼而如果你真的想要玩這麼一套優良的作業系統，除了前面提到的一些建議之外，說真的，得要培養出興趣與成就感才行！那麼如何培養出興趣與成就感呢？可能有幾個方向可以提供給你參考：
  • 建立興趣：Linux 上面可以玩的東西真的太多了，你可以選擇一個有趣的課題來深入的玩一玩！不論是 Shell 還是圖形介面等等的，只要能夠玩出興趣，那麼再怎麼苦你都會不覺得喔！
  • 成就感：成就感是怎麼來的？說實在話，就是『被認同』來的！怎麼被認同呢？寫心得分享啊！當你寫了心得分享，並且公告在 BBS 上面，自然有朋友會到你的網頁去瞧一瞧，當大家覺得你的網頁內容很棒的時候，哈哈！你肯定會加油繼續的分享下去而無法自拔的！那就是我啦...... ^_^！而且，就鳥哥的經驗來說，你『學會一樣東西』與『要教人家會一樣東西』思考的紋路是不太一樣的！學會一樣東西可能學一學會了就算了！但是要『教會』別人，那可就不是鬧著玩的！得要思考相當多的理論性與實務性方面的咚咚，這個時候，你所能學到的東西就更深入了！鳥哥常常說，我這個網站對我在 Linux 的瞭解上面真的的幫助很大！
  • 協助回答問題：另一個創造成就感與滿足感的方法就是『助人為快樂之本！』當你在 BBS 上面告訴一些新手，回答他們的問題，你可以獲得的可能只是一句『謝謝！感恩吶！』但是那句話真的會讓人很有快樂的氣氛！很多的老手都是因為有這樣的滿足感，才會不斷的協助新來的朋友的呢！此外，回答別人問題的時候，就如同上面的說明一般，你會更深入的去瞭解每個項目，哈哈！又多學會了好多東西呢！
  • 參與討論：參與大家的技術討論一直是一件提昇自己能力的快速道路！因為有這些技術討論，你提出了意見，不論討論的結果你的意見是對是錯，對你而言，都是一次次的知識成長！這很重要喔！ ^_^
此外，除了這些鳥哥的經驗之外，還有在 BBS 上面有一封對於 Linux 新手相當有幫助的文件資料，大家可以多看一看：
  • Linux 初學者之旅 2002/01
  • Linux 初學者之旅 2002/07
  • 最新的 Linux 初學者之旅
  • 資訊人的有效學習(洪朝貴教授網頁)
裡面提到了幾乎新手都會有的問題！此外，在網路上還有另外一篇介紹 Linux 的文章，也蠻好玩的，不過他是 Word 版本，目前並不打算將他修改一番，因為要保持原文件的風貌呀！呵呵！有興趣的朋友真的可以好好的看一看：
    Linux 初學者入門
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 在 X-Window System 的架構裡面，主要有幾個元件？各有何重點？
    答：
      X-Window System 有三個元件，分別是 X Server, X Client 與 Window Manager 三部分，分別的工作如下：
      • X Server ： 主要用於主機上面繪製影像的功能！而且他可以控管所有的主機上面的顯示介面硬體，諸如：滑鼠、鍵盤、顯示卡(最重要為驅動程式)及螢幕等等，是最重要的部分喔；
      • X Client ： 用在 Client 端電腦的應用程式軟體，他可以用來操縱 X Server 繪製出使用者想要的圖示，簡單的說，他就是使用者在使用的軟體啦！
      • Window Manager ： 視窗管理員，她主要的功能就是讓 X Server 繪製出來的圖形變的更漂亮，簡單的說，他就是介於使用者與 X Server 之間的一套軟體就是了！由於 X Server 提供的繪圖醜醜的，因此，有了 Window Manager 我們的 X Window System 就可以變的漂漂亮亮的囉！
      一般而言， X Server 與 X Client 會是在同一部電腦主機上面，就是我的直接在 Linux 主機上面執行 startx 就跑出來 X Window 即是一例！
  • 什麼是 GUI ( Graphical User Interface )？
    答：
      GUI 就是圖形使用者介面，亦即是使用圖形介面來操縱硬體囉！例如我們的 X Window system 就是一個例子！目前桌上型的電腦為了親和力，圖形使用者介面做得越來越好了！
2002/07/08：第一次完成或者是上次更新...忘記了∼ @_@
2003/01/28：重新修訂，加入 X-Window 的簡易說明
2002/02/03以來統計人數


如何規劃 Linux 主機
最近更新日期：2003/02/02
認識電腦硬體配備
選擇硬體配備
硬體與硬體在 Linux 中的裝置代號
選擇 distribution
主機的服務規劃
主機硬碟的主要規劃
VBird 的兩個範例
本章習題練習
認識電腦硬體配備
『什麼？學 Linux 還得要玩硬體？！』呵呵！沒錯！Linux 與微軟 Windows 在硬體之認知上有相當大不同的差異！其實由前面『 Linux 是什麼 』那個章節中您或許已經知道了， Linux 其實主要就是那個『核心』囉，而『核心』的功能就是在管理硬體囉，所以，作業系統與硬體本來就具有很高的相關性的！此外，由於每個人的主機用途都不一樣，例如有的人把 Linux 主機當作頻寬分享的工具，有的人將 Linux 主機當作桌上型電腦在使用，這些不一樣的用途所需要的硬體要求都不相同！我們舉個另外的簡單的例子來說明，家裡有小孩，或者自己仍然算是小孩的朋友大概都知道，『要用來打 Game 的 "遊戲機電腦" 所需要的配備一定比辦公室用的 "工作機電腦" 配備更高檔』，為什麼呢？因為『電腦遊戲』所需要的顯示、CPU需要適合比較大量運算的配備，所以等級上面不能太差啊(例如 Athlon 或者是 P4 系列 ) ！至於辦公室軟體，通常我們不太可能會使用到太複雜的軟體，所以，等級不需要太好 ( 例如K6-2 500 ) ，就可以運作的很順暢啦！所以囉，底下我們得先來約略瞭解一下電腦主機裡面的各個配備，以及他們對於系統性能的影響囉！
    一般來說，電腦主機裡頭最重要的就是主機板了！因為你所有的硬體配備都是給他裝在主機板上面的！並且，所有的輸出、輸入裝置也都是透過主機板來進行溝通的呢！而當你將主機的外殼拆掉之後，你會發現主機板有點像底下這個樣子：
    上圖中，中間上面的部分就是中央處理器 ( CPU ) 的插槽了，至於 CPU 右邊那三個直直的則是記憶體 ( RAM ) 的插槽；而在中間偏下有幾個 PCI 的咚咚，那就是一些介面卡的插槽了。包括 SCSI 介面卡、網路卡，還有一些音效卡等等，都是接在 PCI 卡上面的！至於在 PCI 上面還有一個 AGP 插槽是幹嘛的？那個就是目前主流顯示卡 ( AGP 介面 ) 的插槽了！此外，在記憶體的右邊還有幾支黑黑的咚咚，那就是使用『排線』連接主機板與硬碟的介面插槽，我們稱他為『IDE介面』，這個部分相當的重要，等一下我們會再提到的！底下我們來談一談關於幾個主要的元件，然後再介紹整體的運作吧！
  • 中央處理器 ( CPU ) ：CPU 是一部電腦內的心臟啦！因為不論你做什麼事情都需要 CPU 來加以運作的！(雖然有時工作量大、有時工作量小！)，在 586 以前的電腦( 包含 386, 486, 與 586 ) ，CPU 的規格蠻固定的！只要是 586 ，那麼全部的 586 CPU 都是同一規格的，你可以使用任何一家的 586 CPU 來安裝到你的系統中。不過，近年來 CPU 的規格變化的很大，光是一個 Intel 就有4種以上的規格，再加上他的最大對手 AMD 也有至少兩種以上的 CPU 規格，哇！光是 CPU 規格就有夠熱鬧呢！目前( 2003/02 )最熱門的 CPU 規格應該是 Intel 的 P-III ( Socket 370 )、 P4 以及 AMD 的 K7 ( Socket A )，各個 CPU 都有其賣點，我們不談哪一個好用，而是得來瞭解一下 CPU 的速度問題。
    • CPU 有所謂的『倍頻』與『外頻』，外頻是所有系統的周邊設備運作時候的速度，至於倍頻則是 CPU 本身運算時候加上去的一個運算速度！兩者相乘才是 CPU 的時脈。不過，由於周邊設備並沒有這麼快的速度，所以，一些周邊設備需要將外頻除上一個數字，才可以進行溝通。例如一般 PCI 介面的正常速度是 33 ，所以，如果你的 CPU 外頻是 133 時，麼周邊設備的速度就要再除以 4 才能跟系統溝通！一般來說，越快的時脈代表越快的 CPU 運算速度。以 Intel 的 PIII 時脈 933 MHz 為例，
      • CPU 外頻與倍頻： 133(外頻) X 7(倍頻) MHz
      • RAM 頻率：通常與 CPU 之外頻相同，為 133 MHz
      • PCI 介面( 包含網路卡、音效卡等等的介面喔 ) 133/4=33 MHz
      • AGP 介面 ： 133 / 2 = 66 MHz (這是 AGP 正常的頻率喔！)
      如果你將 CPU 超頻呢？會怎樣？呵呵！如果是超外頻的話，例如到 166 MHz 時，你的 AGP 將達 (166/2=83) 而 PCI 也將達 (166/4=41.5) ，高出正常值甚多，通常，越快的外頻由於所有的設備運作頻率都會提升，所以，可以讓效能提高不少，但也可能會造成系統不穩定！在 Linux 系統中，『不建議超頻』，因為，即使 CPU 可以耐的住這麼高的時脈，但是系統的運作是全面性的，只要有一個設備當機，那麼你的系統就跟著當掉啦！而因為超頻之後，系統頻率高出正常值太多，所以當然容易造成不穩定呢！
    • 另一個需要注意的是，『CPU 是有分等級的』，而目前很多的程式都有對『CPU 做最佳化』的行動，所以就會有所謂的 i386, i586, i686 為附檔名的檔案產生啦！基本上，在 P MMX 以及 K6-III 都稱為 586 的 CPU ，而 Intel 的賽揚以上等級與 AMD 的 K7 以上等級，就被稱為 686 的機器了！萬一改天你發現一些程式是註名給 686 的 CPU 使用時，就不要將他安裝在 586 以下等級的電腦中，否則可是會無法執行該軟體的！不過，在 686 倒是可以安裝 386 的軟體喔！也就是說，這些東西具有向下相容的能力啦！
  • 記憶體 ( RAM )：記憶體對於系統來說，真是一個重要的傢伙，怎麼說呢？剛剛提到，電腦真正運作的核心是 CPU ，但是真正『餵給』 CPU 運算資料的，那就是記憶體 (RAM) 啦！所以你的作業系統的核心啦、軟硬體的驅動程式啦、所有你要讀取的檔案啦等等的，都需要先讀入記憶體之後，才餵給 CPU 來進行資料的運作！您瞧！ RAM 可重要的很吧！此外，一些比較優良的作業系統，也會將常用的檔案或程式等資料，給他常駐在記憶體內而不直接移除，如此一來，下次取用這個資料時，就不需要在去周邊讀取一次，呵呵！對於系統速度來說，真是不無小補喔！所以囉，您就會曉得，如果你常常開啟大容量的檔案，以及執行一些很佔資源的軟體，那麼你就必須要『很大量的記憶體』來幫助你存放這些資料，瞧！很重要的一個項目吧！記憶體目前的規格也不少，主要有三種，分別是 SDRAM, DDR, RAMBUS 等，新一代的記憶體通常使用 DDR 這種規格的記憶體，不過還得配合主機板與CPU來選擇 RAM 的規格才行！對於一個系統來說，通常越大的記憶體代表越快速的系統，這是因為系統不用常常釋放一些記憶體內部的資料。
  • 顯示卡 ( VGA card )：目前三 D 的畫面在電腦遊戲介面與工作介面很大量的被使用，而由於如果這些三 D 畫面沒有先經過處理而直接進入 CPU 來做處理的話，將會影響到整體運作的速度，因為 CPU 的工作實在太多了！這個時候就有所謂的 GPU 出現了！那是什麼咚咚呢？為了避免由於大量的 3-D 畫面造成 CPU 的困擾，所以顯示卡開發商就在顯上卡上面安插一個可以處理這些很耗 CPU 運算時間的硬體來處理這些畫面資料，如此一來，不但圖形畫面處理的速度增快了， CPU 的資源也會多出來以執行其他的工作喔！顯示卡也有兩種主要規格，一種是以傳統 PCI 介面來進行傳輸的介面，一種則是以較快的 AGP 介面來傳輸資料！由剛剛我們提到的 CPU 運作時脈中，我們可以知道 PCI 的介面標準速度是 33MHz ，但是 AGP 標準是 66 MHz ，你說，那個快？所以，目前新的主機板上面，通常都會安插一個 AGP 插槽的，這也是目前的主流規格喔！至於 PCI 介面的顯示卡，目前已經很少見了！
  • 硬碟與存取裝置：目前最常見的主流存取介面應該是 IDE 介面吧！所以，所有的開發商都是依據 IDE 這個介面來開發他們的硬體裝置的！通常一塊主機板上面有兩個 IDE 介面(參考上圖)，，而每個 IDE 介面接的排線上又有兩個插槽，所以，正常來說，應該至少會有四個可以使用的 IDE 裝置！這些裝置包含了硬碟、光碟、燒錄機等等的周邊儲存裝置。由於一個 IDE 插槽可以接兩個 IDE 介面的裝置，那麼系統怎麼知道那個是那個？此時就需要 IDE 裝置的跳針 (Jumper) 來設定了！你可以在一個 IDE 介面接的兩個裝置上面，以排線接一個 Master 以及一個 Slave 的裝置！而 Master 與 Slave 可以在任何一個 IDE 裝置上面找到的！也就是說，如果你有兩顆硬碟，那麼你可以將任何一顆調成 Master ，但是另外一顆則必須為 Slave 才行！否則 IDE 介面會無法分辦，而造成系統的當機喔！至於硬碟的一些相關資料我們在後面的章節再來提！
  • PCI 介面卡：PCI 介面卡是安插在 PCI 介面上面的功能卡，主要有 網路卡、音效卡以及 SCSI 介面卡等等。
    • 網路卡：網路卡很重要吧！因為他是讓你可以連接上 Internet 的重要功臣！網路卡的傳輸速度目前都已經可以支援 10/100Mbps 的主流速度了！但是網卡的好壞卻差很多！同樣是 10/100Mbps ，但是 Intel 與 3Com 的卡硬是要比一般的雜排卡多出 1000 元新台幣以上，原因無他，因為網路卡的穩定性、消耗 CPU 資源的特性與其他特殊功能等，Intel 與 3Com 要比其他的廠牌優良的多！至於網路線連接的介面上面，目前則幾乎已經都是 RJ-45 的介面插孔了，這種介面有點像是電話線插孔，不過要稍微大一點。
    • SCSI 介面卡：這個東西可以用來連接 SCSI 的介面的裝置！以硬碟為例，目前的硬碟分為 IDE 介面(剛剛說過了)以及這個 SCSI 介面！由於 SCSI 介面的裝置比較穩定，而且裝置的運轉速度較快，因而速度也會快的多，目前 SCSI 介面卡是一般大型伺服器主機的硬碟傳輸介面，不過，用在個人電腦上面的話， IDE 介面就夠了！因為， SCSI 介面的硬碟很貴呢！
  • 主機板：注意到上面圖示的那個『主機板晶片組』了沒？我們剛剛說主機板是所有設備連接的『媒體介面』，而負責這個媒體介面最重要的『溝通』工作的，就是這個主機板晶片組啦！由於主機板上面的晶片組將負責與 CPU、RAM 及其他相關的輸出、輸入裝置，所以，晶片組設計的好壞也相差甚多喔！另外，由於晶片組在設計的時候，即是針對某種規格的 CPU 與記憶體來設計的，因此：
    • 晶片組的功能：晶片組就是在溝通 CPU、 RAM 、輸出與輸入裝置的重要角色！還記得剛剛我們在 CPU 時候提到的時脈問題吧？在這裡我們再次的強調， CPU 的外頻就是晶片組與其他周邊溝通的速度囉，假如使用剛剛的 P-III 933 MHz 做為例子的話，那麼你的晶片組運作頻率應該是以 133 為基準，所以 CPU 與晶片組溝通是 133 ，晶片組與 RAM 亦是 133 的速度，與 PCI 介面則通常是 33 (133/4)，而與 AGP 則是 66 (133/2)囉！所以，一個晶片組就需要負責這麼多不同的時脈操作喔！呵呵！所以囉，晶片組的好壞對於系統的影響也是相當大的！另外，目前很多的技術可以提升各個與晶片組之間溝通的時脈速度，例如 DDR 記憶體，可以將時脈再提升一倍，所以，如果剛剛是 133 ，那麼使用 DDR 記憶體時，就可以提升成為 266 囉！至於 P4 則晶片組與 CPU 之間則可以提升四倍的時脈速度，遺憾的是，晶片組能支援的規格，只有一種，並無法支援所有的規格，也就是說，你的 Intel 晶片組的主機板，只能支援 Intel 的 CPU 與晶片組能溝通的記憶體規格；
    • CPU、記憶體與晶片組(就是主機板啦)在選購的時候需要一起考慮，因為晶片組(主機板)能夠支援的 CPU 只有一種規格，而晶片組對記憶體的支援通常也僅支援一種規格，所以，當你選擇 Intel 的主機板晶片組時，那就不能使用 AMD 的 CPU 囉！這在購買的時候要特別小心您主機板上晶片組所能支援的規格喔！使用者最容易搞錯的就是這裡了！大家總是認為 DDR 最好，所以拼命也要買 DDR，但是，如果你主機板晶片組本來就不支援 DDR 記憶體的話，那你買來的 DDR 是找不到地方插的！所以，如果您想要升級你的系統時，請特別留意你的主機板晶片組是否有支援喔！
    • I/O 位址與 IRQ 岔斷：既然主機板是負責各個電腦系統元件之間的溝通的，但是電腦的東西又太多了，又有輸出輸入、又有不同的儲存裝置，主機板晶片組怎麼知道如何負責溝通吶？這個時候就需要用到所謂的 I/O 與 IRQ 囉！I/O 有點類似門牌位址啦，每個裝置都有他自己的位址，一般來說，不能有兩個裝置使用同一個I/O位址，否則系統就會不曉得該如何運作，例如，如果你家門牌與隔壁家的相同，那麼郵差怎麼送信到你家啊？不過，萬一還是造成不同的裝置使用了同一個 I/O 而造成 I/O 衝突時，就需要手動的設定一下各個裝置的 I/O 囉！而除了 I/O 位址之外，還有個 IRQ 岔斷這個咚咚，如果 I/O 想成是門牌號碼的話，那麼 IRQ 就可以想成是各個門牌連接到郵件中心 ( CPU ) 的專門路徑囉！IRQ 可以用來溝通 CPU 與各個裝置啦！目前 IRQ 只有 15 個，如果你的周邊介面太多時，可能就會不夠用，這個時候你可以選擇將一些沒有用到的周邊介面關掉，以空出一些 IRQ 來給真正需要使用的介面喔！當然，也有所謂的 sharing IRQ 的技術就是了！
    • BIOS ：BIOS 是 Basic Input Output Setting 的縮寫，剛剛上面我們提到了很多的輸出與輸入以及 I/O, IRQ 等等的咚咚，你要如何設定呢？可以透過作業系統，也可以透過主機板提供的 BIOS 功能來設定喔！當你開機的時候，螢幕上不是會出現一些版本的訊息嗎？那就是 BIOS 的設定囉！你可以在開機的時候按下 DEL 按鍵，以設定開機順序、 I/O ，以及 IRQ 等等！
    • 其他輸出輸入介面：目前主機板上面通常會內建一些基本的介面，這些介面通常是在主機機殼的後面，例如：
      • PS2介面：這是目前最常見的鍵盤與滑鼠的介面，在插孔的地方是圓形的，這種介面速度上面會比較好一些，但是最麻煩的地方在，如果你的鍵盤與滑鼠鬆脫了，通常只能以重新開機來再次驅動鍵盤或滑鼠囉；
      • 九針序列埠：這個是以前用來接滑鼠的介面，常常被稱為 com1 ；
      • 25針序列埠：這通常用來連接印表機的介面，通常稱為 LPT1, LPT2...；
      • 聲音輸出、輸入與麥克風：這個是一些圓形的插孔，而必須你的主機板上面有內建音效晶片時，才會有這三個東西；
      • USB 介面：目前相當流行的一個介面，支援隨插即用，目前已經推出到 USB 2.0 了，這個規格改變了速度上的問題，目前 USB 2.0 的速度已經足夠了，相當的快速！不像之前 1.xx 版時， copy 一些資料到 USB 硬碟時，會吐血....
  • 關於速度：對於速度來說的話，由剛剛我們看到的晶片組所負責溝通的工作來看，您就應該曉得啦！速度的快慢與『整體系統的最慢的那個設備有關！』，如果你是使用最快速的 P4 ，使用最快的 DDR 記憶體，但是配上一個慢慢的兩倍速的過時顯示卡，那麼整體的速度效能將會卡在那個顯示卡上面喔！很重要的呢！所以，在購買整套系統時，請特別留意需要全部的介面都考慮進去喔！
    這些咚咚就是系統所必備的一些元件了！當然啦，還有光碟機、滑鼠、鍵盤我們沒有介紹，因為那個東西比較簡單啦！只是要注意的是，他與主機板提供的連接介面是否相同呢？如果不同的話，自然就無法連接囉！例如你拿 PS2 的接頭要去接九針序列埠的插槽，試問，可以連接嗎？？所以，買周邊設備的時候，要考慮到整體性喔！底下我們再來介紹一下
選擇硬體配備
認識了主要的電腦系統硬體之後，接下來就得知道，那麼你的硬體需要怎樣的等級才能符合你的作業系統需求呢？剛剛我們也提到了，不同的主機服務需要的主機等級是不相同的！基本上，如果你的 Linux 是做為終端機之用 ( 也就是當作你的工作機，並不對 Internet 提供其他服務 )，並且也不玩 X-Window 的話，那麼由於 Linux 所需要的硬體資源是很低的，只要你有 Pentun-133 以上等級的機器就可以跑得很順暢囉！所以，若你手上有升級後要汰換的設備，千萬別急著丟掉，可以嘗試著組裝一下，然後來玩玩 Linux 呀！ 但是，萬一您的 Linux 機器是預計用來作為您公司內部的 mail server 或者是您學校的 Web server, proxy server 時，或者是要玩 X-Window 的話，那麼你就必須要選擇高檔一點的電腦配備了，尤其是 RAM 的大小、顯示卡的記憶體容量與 硬碟 的空間容量！
    另外，由於 Linux 是近來才崛起的梁山泊好漢，而且參與開發 Linux 核心者是一些『公益團體』呵呵！所以他可以支援的硬體相對的是比 Windows 少上很多的！如果你手上的設備是很舊 ( 老古董的兩倍數光碟機... ) ，或者很新 ( 最新的一些高效能 CPU，還有高檔顯示卡 Geforce 4 Ti等等的設備 ) 的咚咚，是非常有可能無法進行 Linux 的安裝的！因此，你需要瞭解一下你的硬體。要瞭解你的硬體是否被 Linux 支援，除了在每一版的 kernel 的文件資料中查詢之外，你可以到下面這個網站上去看看，相信會有所幫助的！
  • 台灣 Linux/FreeBSD 硬體支援資料庫
  • Red Hat Linux 的硬體支援
底下我們稍微談一下 Linux 至少所需要的硬體配備是如何吧！假設一台 Linux 主機，他主要的功能是用來作為 NAT 主機，所謂的 NAT 主機也就是類似『IP分享器』 的功能，而且用這台 NAT 主機的 PC 數並不多，那你只需要 Pentun-166, 32MB RAM, 及一塊不太特殊的顯示卡及網路卡也就夠了！當然，硬體的需求與你服務的對象多寡是有相當的相關性的！在這個一般家庭的 NAT 主機的環境下，你所需要的硬體大致的需求如下：
  • CPU ( 微處理器 )：Pentun-166 以上等級就可以了。不過建議使用 K6-2 300 以上等級的CPU，當然了，CPU的等級與你舊有的主機板相容程度是有相關性的；
  • RAM ( 記憶體 )：至少32MB 以上。其實除了 CPU 之外，在 Linux 系統中最重要的應該是記憶體的大小了，因為如果你的服務開得太多，而你的記憶體不夠大，勢必要使用類似 Windows 的『虛擬記憶體』的東西 ( 在 Linux 當中稱為 Swap ) ，這個 Swap 是使用硬碟的空間來模擬記憶體的存取型態，所以，你可以知道，在記憶體中跑的資料卻以速度較慢的硬碟來跑，呵呵！這東西可操硬碟的緊！所以雖然記憶體最低的需求是 32MB 就可以了，不過強烈建議最好是有 64MB 以上比較好，尤其是如果你還要玩 X-Window的話！ ( 註：目前新出版的 Linux distribution 當中，由於提供的服務越來越多，且 X-Window 介面越做越好，所以對於記憶體的要求，實際上也越來越高！事實上，最好要求您的 Linux 具有 128 MB 以上的記憶體，不過，如果您跟 VBird 一樣不碰 X-Window 的話，那麼使用 64 MB 就已經嚇嚇叫了！ )
  • Hard disk ( 硬碟 )：最好有 2GB 以上。當然是越大越好，最好至少為 3GB 的硬碟！（註：同樣的，目前的 Linux 提供的資料太多了！所以某些出版商提供的 Linux 在選擇完整安裝之後，硬碟竟然佔用了 4.5 GB 左右的空間，相當的可怕！不過，如果您已經學會了 Linux 的話，那麼事實上，透過選擇的套件內容，將不需要用到這麼多硬碟空間，尤其不玩 X-Window 的話，硬碟空間幾乎可以減少一半以上。）
  • VGA ( 顯示卡 )：如果是舊設備的話，最好是 S3 早期的顯示卡。 Linux 對於最新的顯示卡支援的並不是很足夠，而且通常 VBird 是建議人家使用淘汰的零件當主機使用，並且如果你又不玩 X-Window 的話，一塊 1MB 記憶體的 S3-775 顯示卡就夠了！重要的是， Linux 對於 S3 舊的 VGA 卡 ( 如 Virge 系列 ) 支援的程度相當的成熟，所以我推薦他！然而，如果您想要將 X-Window 建置在您的 Linux 機器上面，那麼最好是『一定要有 8 MB 以上的顯示卡記憶體』，否則光是等待的時間，會磨盡您原本具有的耐心指數….
  • Network Card ( 網路卡 ) ：一塊極其普通的 10/100 MB 的網卡就可以了，建議用具有 RTL8139或者是NE2000相容的晶片的網卡，因為 Linux 本身就有支援，不用再額外加掛驅動程式！強烈的建議使用 Realtek RTL8139 晶片的 PCI 介面網路卡，便宜又蠻好用的！不過，還是得提醒一下，如果您的 Linux 是用來架設大流量的網站時，那麼好一點的網路卡將是不能節省的花費！如果能夠使用 Intel 或是 3Com 的網路卡，那將是不錯的選擇呀！
  • 光碟、軟碟、鍵盤與滑鼠：不要太舊的就可以了。基本上除了鍵盤之外，其他的裝置都是非必備的，以 VBird 為例，在安裝 Linux 的時候先拿別部電腦的光碟機、軟碟機與滑鼠來安裝，等到安裝完畢之後，關機，將所有的裝置拔掉，只要剩下硬碟與電源供應器就可以啦！等到所有的設定都完成之後，連螢幕都可以搬走了！剩下的 Linux 會自動搞定！因為通常伺服器這東西最需要的就是穩定，而穩定的最理想狀態就是平時沒事不要去動他是最好的！
不過，請千萬注意了，上面提到的是『規模很小的主機系統』可以這樣玩！如果是『企業內部的 Linux 主機』，呵呵，可能就要做修正囉！例如某些學校內部架設的 Proxy 系統，由於服務的機器數非常的大，所以建議至少需要：
  • CPU 等級至少需要 P-III 500 以上；
  • RAM 最重要，最好至少 512 MB 以上，越大越好；
  • 網路卡最好可以選擇較佳一些的，例如 Intel 或 3COM 的！
  • 硬碟至少需要數十 GB 以上的，分割成多槽， Proxy 執行效率較好；
  • 其他的就隨意啦！
所以囉！不同規模的伺服器，他的硬體要求等級也就會不相同！除此之外，不同的 Linux distribution 對於硬體的要求也不一樣！舉例來說，在 Open Linux 的 server 3.1.1 就『嚴格要求』您的系統必須是 i686 ( 也就是 PII 等級以上的 CPU ) ，所以，您必須要針對您即將安裝的 Linux 所需要的硬體需求進行瞭解呢。稍微提一下各個不同的 Linux 功能主機所需要的硬體等級好了！

配備\主機類型
一般小型主機
不含 X Window
桌上型 Linux 系統
含 X-Window
中大型 Linux Server
中大型 Linux Server
含 X-Window
用途
 家庭用 NAT 主機，或者是小型企業用來架設非圖形介面的小型主機。 就是您用來學習 Linux ，並且打算在該電腦上面玩跟 X-Window 有關的軟體。 中小型企業或者是學校單位用來作為全校的 mail, ftp....等的主機。 中小型企業或者是學校單位用來做為全校的主機，同時，還支援圖形化介面操控！
CPU
 大於 Pentun 133 即可 好一點的，最好是 K6-III 400 以上等級，例如 P-III 或者是 P4 ，或是 k7 ，因為這部 Linux 電腦會被你用來工作，所以要好一些。 最好是 P-III 以上等級，因為大型主機會用到很多的 CPU 資源！ 最好是 P-III 以上等級，因為大型主機會用到很多的 CPU 資源！
RAM
 大於 32 即可，不過，最好還是有 64MB 比較妥當！ 一定要大於 128 以上，最好可以 256 MB 以上，因為你會在上面工作吶！越大越好！ 最好大於 256 MB 以上，512 MB是標準配備。 最好大於 256 MB 以上，512 MB是標準配備。
NIC ( 網路卡 )
 普通的 10/100 Mbps 的 RJ-45 接頭的網路卡即可！通常就是大賣場裡面最便宜的那一項就對啦！ 普通的 10/100 Mbps 的 RJ-45 接頭的網路卡即可！通常就是大賣場裡面最便宜的那一項就對啦！ 越快速的越好！通常由於我們不搞 Cluster (叢集式電腦 )所以還不需要 1000Mbps 的網路卡！不過，一張穩定又功能性強的網路卡是需要的， Intel 或者是 3Com 的 10/100 Mbps 是需要的！ 越快速的越好！通常由於我們不搞 Cluster (叢集式電腦 )所以還不需要 1000Mbps 的網路卡！不過，一張穩定又功能性強的網路卡是需要的， Intel 或者是 3Com 的 10/100 Mbps 是需要的！
顯示卡(VGA)
 只要能用就好了！因為你不用 X-Window ，所以，老期的 PCI 介面的 S3 廠牌及其記憶體 1MB 就可以啦！ 一定至少有 8 MB 以上記憶體的 RAM ，當然，越大越好！例如目前主流已經漸漸朝 64MB 發展，那就是很棒的配備啦！( AGP 介面 ) 與一般小型主機一樣，由於不用 X-Window ，所以顯示卡並不是這麼重要！ 至少有 16MB 以上的顯示卡記憶體，目前市面上的顯示卡應該都可以符合這個功能！除非你的 Linux 還必須用來發展圖形軟體，否則，目前主流顯示卡介面就夠了！( AGP 介面 )
硬碟
 硬碟空間足夠將你所需要的服務安裝完畢即可！例如，如果單純的 NAT 主機，那只要 640 MB 以上的硬碟即可！但是如果你還需要其他的服務功能，例如 FTP, Mail 等等，那就需要大一點。通常，一般家庭或者是小型企業的 Linux 主機， 2~4 GB 的小硬碟也夠了！ 越大越好！因為你還得玩那個很耗系統資源的 X-Window ，加上如果你還想要玩一些多媒體的話，一個轉速快，且高容量的硬碟是需要的！ 越大越好，最好還可以做成磁碟陣列，資料會更安全一些，可以的話，還可以轉成 SCSI 介面的硬碟喔！比較快且穩定！通常 10GB 的空間跑不掉！因為一些空間還得用來存放您工作單位或者是學校單的其他教室或老師的教學資料吶！所以空間要預留的比較多喔！ 越大越好，最好還可以做成磁碟陣列，資料會更安全一些，可以的話，還可以轉成 SCSI 介面的硬碟喔！比較快且穩定！通常 10GB 的空間跑不掉！因為一些空間還得用來存放您工作單位或者是學校單的其他教室或老師的教學資料吶！所以空間要預留的比較多喔！

反正要注意的就是未來你的 Linux 主機規劃的『用途』來決定你的 Linux 主機硬體配備喔！相當的重要呢！
硬體與硬體在 Linux 中的裝置代號
瞭解了硬體之後，接著下來得瞭解一下個硬體在 Linux 當中所扮演的角色囉！在 Linux 系統當中，每個裝置都被當成一個檔案來對待！舉例來說，硬碟的檔案名稱即為 /dev/hd[a-d]，其中，括號內的字母為 a-d 的任何一個，亦即由 /dev/had, /dev/hdb, /dev/hdc, 及 /dev/hdd這四個檔案的意思（註：這種型式的表示法在後面的章節當中會使用得很頻繁，請特別留意）。那麼光碟機與軟碟呢？分別是 /dev/cdrom, /dev/fd0 囉！好了，其他的周邊設備呢？底下列出幾個常見的裝置與其在 Linux 當中的代號囉：

裝置
裝置在 Linux 內的代號
IDE 硬碟機
/dev/hd[a-d]
SCSI 硬碟機
/dev/sd[a-p]
CDROM
/dev/cdrom
軟碟機
/dev/fd[0-1]
印表機
/dev/lp[0-2]
滑鼠
/dev/mouse
磁帶機
/dev/ht0 (IDE)或
/dev/st0 (SCSI 介面)
網路卡
/dev/ethn ( n 由 0 開始 )

需要特別留意的是 IDE 硬碟機，每個磁碟機的磁碟分割 ( partition ) 不同時，其磁碟代號還會改變呢！關於 IDE 硬碟機的分割與配置將在安裝 Linux 時再提及。此外，您會發現怎麼檔案開頭都是 /dev 呢？呵呵！那個咚咚就是我們放置裝置檔案的目錄啦！而需要特別注意的是磁帶機的代號，在某些不同的 distribution 當中可能會發現不一樣的代號，需要稍微留意。總之，你得先背一下 IDE 硬碟的代號就是了！其他的，用的到再來背吧！
選擇 distribution
就如同前面幾節中說明的， distribution 是由於各個不同的開發商所發展的不同套件所致！不過，其架構則差異不大！因此，這裡不評論哪一個 distribution 比較好！請選擇您自己喜歡的套件即可！目前台灣地區使用較多的兩個套件分別是 Mandrake 及 Red Hat 這兩個，因為使用者較多，所以支援度與網路文章自然也比較多，對於新手而言，這兩套 Linux distributions 是蠻好的入門版本喔！並且，在各大 FTP 站中都有提供下載！以下列出 VBird 最常去的 FTP 站，您可以進入其中並選擇您所想要的 distribution 囉！
  • 雲科大的 FTP ：
  • 中山大學的 FTP ：
當然還不止此，您可以到各大專院校的 BBS 站的精華區去搜尋一番！網友就提供了一個相當棒的多種 Linux Distributions 的下載網站：
  • http://www.linuxiso.org
要注意的是，您所下載的檔案為 image 檔（所謂的映象檔，可能是 .iso 的附檔名），你必須要將該檔案燒錄成為可開機的光碟片之後才能真正的使用他！（提供一下個人的經驗：您可以使用 IE 或 Netscape之類的瀏覽器下載上述的 image 檔，不過，很抱歉的是，由於檔案太大了（一個映象檔需要 600∼700 MB 之間），使用 http 協定來捉檔案的話，很容易造成斷線、或者是不明原因的問題，產生捉取的檔案有問題，這個時候您還得再重新捉一次呢！因此這裡特別建議使用具有續傳功能的 ftp 軟體下載上述的檔案，例如 cute ftp 等等！）
各家 distribution 所需要的光碟檔案大小不一，以 Open Linux 3.1.1 與 Red Hat 8.0 為例，前者僅需要一塊 CD 即可，後者卻需要 3 塊 CD 才行！此外，這些 distribution 的 CD 基本上均提供含有原始程式碼的 Source RPM (SRPM) 及可直接安裝的 binary RPM，下載之前請先瞭解各 distribution 的 CD 內容，以免佔用您與他人的網路頻寬！
主機的服務規劃
    前面已經提過，由於主機的服務目的不同，所需要的硬體等級與配備自然也就不一樣！底下提一提每種服務可能會需要的硬體配備規劃，當然，還是得提醒，每個朋友的需求都不一樣，所以設計您的主機之前，請先針對自己的需求進行考量。而，如果您不知道自己的考量為何，那麼就先拿一部普通的電腦來玩一玩吧！記得！不要將重要資料放在練習用的 Linux 主機上面！
  • 打造 Windows 與 Linux 共存的環境：
    因為一般硬體對於 Windows 的支援度比較足夠，而若你也希望這架機器在不使用 Linux 的情況下還能以 Windows 系統作業，這時你就需要使用多重開機選單了！ Linux 本身就有至少兩個很不錯的多重開機程式，分別稱為 LILO 與 Grub ，如果你需要兩個以上的作業系統在你這台主機上的話，例如 Windows98 與 Linux 共存，那你必須先安裝 Windows98 再灌 Linux 系統就可以了！當然囉，如果你先安裝了 Linux 再安裝 Windows 系統呢？還能不能成功的製作多重開機？當然可以啦！不過，你需要學會知道什麼是『多重開機』的概念，這部分我們會在後面再繼續談，不要著急喔！基本上，多重開機涉及硬碟規劃的問題，如果你的硬碟有 6GB ，那你可以先以 DOS 的 Fdisk 或其他的分割程式如 SPFdisk 進行硬碟的劃分。僅割出 Windows 要的磁區就好。例如你要分 1GB 給 windows ，那以 Fdisk 分割一個 1GB 的主分割就好了！其他的等 Linux 灌的時候再弄就可以啦！這部分會在後面再提到！
    再來提到您的 Linux 主機系統，我這裡要跟大家報告的是，如果您是使用較為老舊的電腦來做為主機的處理，並且他上面可能預計會安裝 mail, WWW 等伺服器軟體，因此需要全天、全年開機的，所以安裝 Windows 與 Linux 共存的環境是可以，但是請將 Windows 的硬碟規劃的小一點！好讓您的 Linux 主機可以有更多的空間提供更完善的服務。好了！現在來說說你需要的主機服務有哪些呢？一般而言，對於非企業或者是小型企業或者是學校單位，通常你需要的服務有底下這幾個：
  • NAT ( Network Address Transfer )：
    如果您是一般小型企業，或者是一般的中小學學校，那麼貴單位對外的連線應該通常是：『申請一個固定制的 IP ，然後透過 IP 分享器 ( IP sharing ) 來達到全校的電腦皆可連上 Internet 的連線機制』吧！咦！要連上 Internet 不是需要實體 IP 嗎( Public IP )，那每部電腦不是都需要一個 IP 嗎？那麼您只有申請一個 Public IP ，其他電腦的 IP 要怎麼設定呢？早在當初規劃這個 IPv4 協定時( 就是目前的 IP 設定囉！ )，就考慮到可能的 IP 不足啦！此時，就有專門給內部網域設定用的 Private IP 了( 或者稱為私有 IP 或保留 IP ) ，需要注意的是，這些 Private IP 都不能直接與 Internet 上面的 Public IP 互相溝通！那怎麼我學校內部的電腦還是可以透過 IP 分享器連出去呢？這就是所謂的 NAT( Network Address Transfer )功能啦！當內部電腦要連接上 Internet 時，需要通過 NAT 的技術，將你內部電腦的資料封包中，關於 IP 的設定都設定成 NAT 主機的實體 IP ，然後才傳送出去 Internet ，如此一來，你的內部電腦雖然是使用私有 IP ，但是在連線上 Internet 時，就可以透過 NAT 主機的 NAT 技術，將 IP 來源給改了改！哈哈！如此一來，就可以向 Internet 要求資料囉！這部分我們在網路基礎篇會再提及的！通常使用舊電腦來做為主機時，最大的效用就是用來作為 NAT 了！若你的主機僅單純提供 NAT 服務，那麼在這個服務當中，比較重要的就屬網路卡而已！其他的 CPU、RAM、硬碟 等硬體的影響相對就小了相當多！
  • SAMBA：
    在 Windows 裡面可以很輕易的就以『網路上的芳鄰』來分享彼此的檔案資料，那麼 Linux 要如何與 Windows 分享呢？呵呵！使用 SAMBA 就可以啦！這也是最普遍的 file server （檔案伺服器）。由於分享的資料量可能較大，那麼對於系統的網路卡與硬碟的大小及速度就比較重要，如果您針對不同的使用者提供檔案伺服器功能，那麼 /home 可以考慮獨立出來，並且加大容量。
  • Mail：
    Linux 一安裝完畢就已經提供了 Sendmail 或 Postfix 的郵件服務！由於我們如果向外面的公司申請免費的 E-Mail 信箱，了不起容量大致上到 20 MB ，但是，要知道有時候我們一不小心就會讓郵件容量超過了 20 MB，這樣一來，呵呵，您的免費信箱就爆了！真抱歉....但是，如果你自己架設一個 mail server 呢？哈哈！哪麼你的信箱就可以到達幾 GB 這麼大！很過癮吧！在 mail server 上面，重要的也是硬碟容量與網路卡速度，在此情境中，也可以將 /var 獨立出來，並加大容量。
  • Web：
    WWW 幾乎是每個主機上面都會安裝的一個套件了！當然，要推銷你自己的話，那麼 WWW 伺服器是絕對不會被你忘掉的！在 Web server 上面，CPU 的等級有時候不能太低，而最重要的則是 RAM 了！要增加 WWW 系統的穩定度，提升 RAM 是一個不錯的考量。
  • DHCP：
    NAT 搞定之後，要曉得的是，你的 Client （用戶端）每一部都需要經過設定才能上網 ( 剛剛提到的私有 IP 的概念！ ) ！阿！好麻煩！那麼使用 DHCP 就可以改善這個問題囉！呵呵！ Client 端都不必設定任何咚咚，馬上將可以上網了！快樂吧！這個咚咚的硬體要求可以不必很高囉。
  • Proxy：
    這也是常常會安裝的一個伺服器軟體，尤其像中小學校的頻寬較不足的環境下， Proxy 將可有效的解決頻寬不足的問題！當然，你也可以在家裡內部安裝一個 Proxy 喔！但是，這個伺服器的硬體要求可以說是相對而言最高的，他不但需要較強有力的 CPU 來運作，對於硬碟的速度與容量要求也很高！自然，既然提供了網路服務，網路卡則是重要的一環！
  • FTP：
    FTP的功能是真的很好啦！但是對於 撥接制 ADSL 使用者來說，架設 FTP 實在是一件不智的事情！因為對你的頻寬影響太大了！ VBird 相當不建議架設 FTP 的啦！尤其安全性上面也很傷腦筋！對於 FTP 則是您的硬碟容量與網路卡好壞相關性較高。
大致上我們會安裝的伺服器軟體就是這一些囉！假設您需要 NAT 的服務，那麼通常會建議安裝『兩塊網路卡』在您的主機上面，因為可以順便解決您內部電腦的安全問題！假如您需要 mail 與 Web 伺服器，那麼就建議申請 DNS 或者是直接申請免費的動態 DNS 系統的 domain name 囉！如果您需要 Proxy 的服務，那麼在當初設計硬碟規劃的時候，就要小心硬碟的切割了，因為不同的切割方式會使得您的 Proxy 效能有差異！如果你對於上面的幾個服務還不是很熟悉，沒有關係，未來網路架站篇會再詳細的介紹給大家的啦！
主機硬碟的主要規劃
系統對於硬碟的需求跟剛剛提到的主機開放的服務有關，那麼除了這點之外，還有沒有其他的注意事項呢？當然有，那就是資料的分類與安全性的考量。常常會發現網路上有些朋友在問『我的 Linux 主機因為跳電的關係，造成不正常的關機，結果導致無法開機，這該如何是好？』呵呵，幸運一點的可以使用 fsck 來解決硬碟的問題，麻煩一點的可能還需要重新安裝 Linux 呢！傷腦筋吧！另外，由於 Linux 是多人多工的環境，因此很可能上面已經有很多人的資料在其中了，如果需要重新安裝的話，光是搬移與備份資料就會瘋掉了！所以硬碟的分割考量是相當重要的！同時，硬碟的規劃對於 Linux 新鮮人而言，那將是造成您『頭疼』的主要兇手之一！因為硬碟的分割技巧需要對於 Linux 檔案結構有相當程度的認知之後才能夠做比較完善的規劃的！所以在未來的幾個章節當中，鳥哥將會著重在這方面的探討，這可是相當重要的入門知識呢！因為如此，所以特別建議 Linux 新鮮人先只切兩個磁區就好，分別是根目錄 / 與 Swap ！無論如何，底下還是說明一下基本硬碟分割的模式吧！
  • 最簡單的切割方法：Linux 安裝的過程中，至少要有兩個 partition 才行，一個是『 / 』，另一個則是虛擬記憶體『 Swap 』，如果你的硬碟很小（例如小於 1GB 的小硬碟），那麼使用這個分割的方法會比較好！但是，保證是比較不保險的切割方式啦；
  • 稍微麻煩一點的方式：在預設的情況下，由於 Linux 的作業系統都是擺在 /usr/ 當中，所以囉，你可以將這個部分切割的大一點，另外，由於使用者的資訊都是在 /home 底下，因此這個也可以大一些，而 /var 底下是記錄所有預設伺服器的登錄檔，且 mail 與 WWW 預設的路徑也在 /var 底下，因此這個空間可以加大一些喔！所以，需要的目錄就有：
    • /
    • /usr
    • /home
    • /var
    • Swap
以 VBird 為例，通常我會希望我的郵件主機大一些，因此我的 /var 通常會給個數 GB 的大小，如此一來就可以不擔心會有郵件空間不足的情況了！另外，由於我開放 SAMBA 服務，因此提供每個研究室內人員的資料備份空間，所以囉， /home 所開放的空間也很大！至於 /usr/ 的空間，大概只要給 2?3 GB 即可！凡此種種均與您當初預計的主機服務有關！因此，請特別注意您的服務項目！然後才來進行硬碟的規劃！
無論如何，一開始玩 Linux 時，還是建議先將所有的套件都安裝在同一個分割區內，也就是那個根目錄 / ，等到學習了後面的相關資訊，尤其是 Linux 檔案與目錄的使用架構之後，再重新將 Linux 安裝與規劃，那麼一定可以得到您所需要的環境的！
VBird 的兩個範例
這裡說一下我曾經規劃過的兩個範例，要先聲明的，我的範例不見得是最好的，因為每個人的考量不同，我只是提供相對可能較佳的方案喔！
案例一：
  • 提供服務：提供家裡的五部電腦 ADSL 連線分享、同時架設 NAT Server、Mail Server、 WWW Server、SAMBA等服務。此外，為多重開機系統。
  • 架設硬體：
    • CPU 使用 P-166；
    • 記憶體大小為 64MB 的 RAM；
    • 網路卡為 螃蟹卡；
    • 硬碟機容量為 3.2 GB；
    • 顯示卡選擇 S3 Virge VGA。
    • 安裝完畢之後拔掉 CD-ROM、滑鼠、鍵盤、螢幕等等配備！只剩下網路線及電源線跟主機連接！
  • 硬碟切割：
    • 提供 500 MB 給 Windows 98；
    • 1GB 給 /var (特別針對郵件設定)；
    • 100 MB 給 Swap；
    • 剩下的空間都給 /
案例二：
  • 提供服務：提供整個單位的 Proxy 伺服器服務，同時提供單位內相關人員的數值模式模擬（這個模式很耗系統資源！）。
  • 架設硬體：
    • 使用雙 CPU 架構（因為需要大量的運算）；
    • 使用 GeForce 2 MX 顯示卡（因為數值模式模擬完畢之後，需要將圖示顯示在螢幕上除錯）；
    • 使用 30 GB 硬碟兩顆（數值模式所需的儲存、 Proxy 所需要的空間）；
    • 使用 3COM 網路卡（ Proxy 呦！）；
    • 使用 512 MB RAM。
  • 硬碟切割：
    • 6 GB 給 Proxy （/proxy1, /proxy2, /proxy3 各佔 2 GB）；
    • 1GB 給 Swap （數值模式需要）；
    • 5 GB 給 /；
    • 剩下的都給 /disk1 及 /disk2
在上面的案例中，案例一是屬於小規模的主機系統，因此只要使用預計被淘汰的配備即可進行主機的架設！唯一可能需要購買的大概是網路卡吧！呵呵！；而在案例二中，由於我需要大量的數值運算，並且由於提供了很多電腦的 Proxy 服務，因此就需要較大的硬碟空間、與較佳的網路卡來搭配了！這些工作請先記得，因為下一章節在實際安裝 Linux 之前，您得先進行主機的規劃呀！
本章習題練習( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 請簡略說明一部電腦主機裡面，大概有哪些基本的硬體？
    答：
      基本的硬體主要有 CPU、RAM、硬碟、主機板、光碟機、輸入輸出介面(滑鼠、鍵盤、印表機等周邊設備！)、顯示卡以及網路卡等等！
  • 一部電腦主機是否只要 CPU 夠快，整體速度就會提高？
    答：
      不見得！一部電腦系統的速度與整體電腦系統的運作有關，每個元件皆會影響電腦的速度！這包括了記憶體、CPU、AGP與顯示卡速度，硬碟的速度以及其他相關的輸入輸出介面等等！所以，如果您的系統是升級的，那麼還得必須要注意各個舊元件是否可以保留，或者舊的可以用的元件必須要捨棄！
  • 什麼是 CPU 的外頻與倍頻？
    答：
      CPU 時脈的計算當中，有所謂的外頻與倍頻，真正的時脈需要將兩者相乘才是！比較重要的是 CPU 的外頻了！因為系統整體運作的頻率便是依據這個外頻來進行各個元件的溝通的！一般而言，目前比較流行的屬於 133 這個外部頻率，至於 PCI 則是這個頻率的 1/4 倍，亦即是 33 MHz ， AGP 則是 66 ( 133/2 )，而，由於目前的技術越來越高超， CPU 可以透過特殊的技術來將外頻調高為 133 的兩倍，亦即是 266 ， RAM 也可以經過 DDR 的技術來將 133 加倍成為 266 ，這些技術都有助於速度上面的助益！
  • 什麼是 I/O 位址與 IRQ 岔斷？
    答：
      主機板是負責各個電腦系統元件之間的溝通的，但是電腦的東西又太多了，又有輸出輸入、又有不同的儲存裝置，主機板晶片組怎麼知道如何負責溝通吶？這個時候就需要用到所謂的 I/O 與 IRQ 囉！I/O 有點類似門牌位址啦，每個裝置都有他自己的位址，一般來說，不能有兩個裝置使用同一個I/O位址，否則系統就會不曉得該如何運作，例如，如果你家門牌與隔壁家的相同，那麼郵差怎麼送信到你家啊？不過，萬一還是造成不同的裝置使用了同一個 I/O 而造成 I/O 衝突時，就需要手動的設定一下各個裝置的 I/O 囉！而除了 I/O 位址之外，還有個 IRQ 岔斷這個咚咚，如果 I/O 想成是門牌號碼的話，那麼 IRQ 就可以想成是各個門牌連接到郵件中心 ( CPU ) 的專門路徑囉！IRQ 可以用來溝通 CPU 與各個裝置啦！目前 IRQ 只有 15 個，如果你的周邊介面太多時，可能就會不夠用，這個時候你可以選擇將一些沒有用到的周邊介面關掉，以空出一些 IRQ 來給真正需要使用的介面喔！當然，也有所謂的 sharing IRQ 的技術就是了！
  • Linux 對於硬體的要求需要的考慮為何？是否一定要很高的配備才能安裝 Linux ？
    答：
      Linux 對於硬體的要求是因『服務種類、服務範圍及主機的角色』而定的。例如一部專門用來運算數值解析的 Linux 運算工作站，需要比較強大的 CPU 與足夠的 RAM 來進行工作，至於一般家庭用的僅用來做為 ADSL 寬頻分享器的 Linux 主機，則只要 586 等級的電腦，甚至 486 系列的等級，就可以很順利的運行 Linux 了。
  • 一部好的主機在安裝之前，最好先進行規劃，哪些是必定需要注意的 Linux 主機規劃事項？
    答：
      依據上一題的答案內容，我們知道 Linux 對於硬體的要求是『因地制宜』地！所以，要進行 Linux 的安裝之前，一定需要規劃 Linux 主機的定位與角色！因此，Linux 的主機是否開放網路服務？這部主機的未來規劃中，是否需要進行大量的運算？這部主機是否需要提供很大的硬碟容量來服務客戶端的使用？這部主機預計開放的網路服務內容？等等，都是需要經過考量的，尤其未來的『套件選擇安裝』上面，更需要依據這些規劃來設定。
  • 請寫下目前您使用的個人電腦中，各項配備的主要等級與廠商或晶片組名稱：
      主機板：
      CPU：
      記憶體大小：
      硬碟容量：
      顯示卡：
      網路卡：
  • 請寫下下列配備中，在 Linux 的裝置代號：
    IDE 硬碟：
    CDROM：
    印表機：
    軟碟機：
    網路卡：
    答：
      IDE 硬碟：/dev/hd[a-d]
      CDROM：/dev/cdrom
      印表機：/dev/lp[0-2]
      軟碟機：/dev/fd[0-1]
      網路卡：/dev/eth[0-n]
2002/04/08：第一次完成吧？
2003/02/02：重新編排與加入 FAQ
2002/ 02/03以來統計人數


以 spfdisk 分割硬碟的一個範例
最近更新日期：2003/02/03
什麼是硬碟分割？
SPFdisk
    刪除原有分割
    建立主要分割磁區
    儲存分割表
    格式化硬碟
什麼是硬碟分割？
在開始進行 Linux 之前，應該有很多的工作要做的！最重要的就如同前面『Linux 主機規劃』當中說的，要如何規劃硬碟呢？！到底要如何分割硬碟才好！是要將 swap （虛擬記憶體）規劃的大一點比較好？或者是只要一個根目錄就可以了呢？另外，如果我的硬碟上面已經有 Windows 系統，我又不想要將 Windows 殺掉，想使用多重開機來安裝我的多個作業系統，那要怎麼做呢？！況且，由於 DOS 的 fdisk 不認識 Linux 的檔案格式，那麼我要如何將 Linux 完全的從我的硬碟中移除呢？！呵呵！這裡就來說一下該如何是好吧！
由於不同的作業系統所使用的檔案架構並不相同，有些甚至是不相容的，例如 Windows 所使用的是 FAT 表，而 Linux 所使用的是 ext2 這個檔案格式，這兩種格式完全不相同，在 Linux 底下還可以藉由編輯核心來支援 Windows 的 FAT 檔案格式，但是 Windows 則完全無法讀取 Linux 的檔案格式了！此外， Windows 使用的磁碟分割工具 fdisk ，很抱歉的，並不認識 Linux 的 ext2 這個檔案格式，所以如果您有一棵已經安裝有 Linux 系統的硬碟，呵呵，使用 Windows 的 fdisk 是完全無法分割這塊硬碟的！
那麼到底什麼是硬碟分割呢？真的要將硬碟用刀子割一割嗎？！不是這樣的，實際上，硬碟是以 blocks, clusters, partitions 這些東西來作為儲存的單位，而最底層的硬碟單位就是 blocks 了，通常一個 blocks 大約是 512 bytes 左右。那麼 partition 是什麼？簡單的來說，你知道你的 Windows 有所謂的 C:, D: 是吧！其實他們是同一顆硬碟，只是利用『磁碟分割表』(partition table)來將實體的硬碟規劃出不同的區塊。舉個例子說，假設你的硬碟總共有 1024 個 clusters （利用 blocks 結合而成的硬碟計算單位），那麼你在這塊硬碟的檔頭地方（就是磁碟分割表，可以想成要讀取一塊硬碟時最先讀取的地方）如果寫入你的 partitions 共有兩塊，一塊是 primary 一塊是 extended ，而且 extended 也只規劃成一個 logical ，那麼你的硬碟就是只有兩個槽啦（對於系統來說，真正能使用的有 Primary 與 Logical 的詞區， Extended 並無法直接使用的！需要再加以規劃成為 Logical 才行！ ) ，而且在 partition table 也會記錄 primary 是由『第 n1 個 cluster 到第 n2 個 cluster 』，所以囉，這樣子一來，當系統要去讀取 primary （就是 c 槽）的時後，就只會在！n1~n2 之間的實體硬碟當中活動囉！
基本上， Windows 98 系統中的 Fdisk 這支程式僅支援一個 primary 與一個 extended ，其中， extended 可以再細分成多個 logical 的硬碟槽。NT 很抱歉，小弟不熟，所以就不提了！那麼 Linux 呢？嗯！基本上最多可以有 4 個 primary 的硬碟，而可以支援到 3 個 primary 與一個 extended ，其中， extended 若再細分成 logical 的話，則全部 primary + extended + logical 應該可以支援到 64 個之多。底下我們將以 spfdisk 這個全中文介面的 fdisk 磁碟分割工具來介紹如何分割硬碟！
硬碟分割 ==> SPFdisk
SPFdisk 是一套由國人開發完成的全中文介面的硬碟分割工具，他要比微軟出的 Fdisk 功能強多了，他的好處除了==>全中文介面讓你一定可以看的懂之外，簡單的類圖形介面可以讓你輕易的進行硬碟分割，除此之外，這套軟體的『DOS工具』內的『格式化工具』格式化硬碟的速度真是 DOS 比不上的，我格式化一個 30GB 的硬碟不用十秒就可以格式化完全！<==另外，其他的優點我在此也不多說了，若有需要你可以自行自一些搜尋網站下載最新的程式，或從這裡下載我有的程式，不過可能舊一點。
另外，由於 DOS 的 Fdisk 並不認識 Linux 的分割表，所以用 DOS 的 Fdisk 是無法將 Linux 的分割表去除的。因此，你要刪除 Linux 的分割表，只有兩個比較快的方法，一個是以 Linux 直接再分割，一個則是使用 SPfdisk 分割啦！
由於這個頁面的檔案很大，有時候會有沒辦法顯示的情況發生，這時請在畫面上『按滑鼠右鍵』，再選擇『顯示圖片』這個選項，即可顯示畫面啦！
硬碟分割主要可分為下面幾個步驟：
  1. 將舊有的分割表刪除；
  2. 建立新的主分割及擴充分割（若有需要的話）；
  3. 貯存分割表；
  4. 以 DOS 工具格式化以分割的硬碟。

1. 刪除原有分割：
假設你的主機中沒有任何系統存在，則請以 Windows98 製作開機片後，將 spfdisk 拷貝至開機片。以此磁片開機之後，執行：
A:>spfdisk

會出現如下歡迎畫面。

按任意鍵後出現下面畫面：
以方向鍵移動游標至『硬碟分割工具』按 Enter 鍵後會出現畫面如下：
這是向你詢問是否需要使用 FAT32 的檔案系統，由於 Windows 98 支援的長檔名及相關的檔案型態是以 FAT32 為準，所以當然按『Y』！按了 Y 之後會出現硬碟的資訊，如下所示：
因為我是在我原有的機器上執行這個程式，所以會有兩顆硬碟，如果你的系統只有一顆硬碟的話，則只會顯示你有的硬碟資料，在上圖中，1.19GB 的硬碟其總磁柱僅有 621 單位，比可開機磁區範圍（0 ~ 1023）小得多，所以可以隨意分割。將游標以方向鍵移動至 1.19GB 這顆硬碟後，按 Enter ：
因為這顆硬碟之前被我灌過 Linux ，所以會顯示 Linux 的磁區劃分情況。上面的意義為：
  • 啟動：由於系統開機時會去先去找分割表，由分割表所設定的『可開機磁區』進行開機程序，因此若這個磁區為開機磁區，則『啟動』項目會有一個心型的符號存在！
  • 起始磁柱與結束磁柱：這一個被分割的磁區的開始與結束磁區。
  • MBytes：這個磁區的硬碟容量。
  • 系統 ID 與系統種類：這一個分割表的類型。因為這是 Linux 的分割類型，所以其 ID 顯示為 83，若是 FAT32 的話，則為 0b。
將游標以方向鍵移動至這個磁區後，按 Enter ：
在這個畫面中，將游標以方向鍵移動至『刪除分割』這個項目，並按下 Enter ：
出現此畫面後，確定要刪除這個分割就按『[Y]是』這個項目。
刪除分割之後你的硬碟中就沒有分割表的存在了，所以這個硬碟的系統種類則變成了<未規劃>。
2. 建立主要分割磁區：
在上面的畫面中，按下 Enter 鍵，會出現下面畫面。
由於這一顆硬碟的分割表被刪除了，所以『系統ID』與『刪除分割』被取消了。這時按下『建立分割』會出現如下畫面：
然後選擇『建立主分割』，那何謂主分割與擴充分割呢？所謂的主分割在 windows 系統下即是 『C槽』 啦！但是擴充分割並非『邏輯分割』，這裡要注意一下，所謂的『邏輯分割』是包含在擴充分割中的，例如當你的擴充分割共有 10GB 但是你想將之分為兩槽，則可以使用邏輯分割將擴充分割分為兩槽，這兩槽即稱為『邏輯分割』。所以這裡要注意啦，建立擴充分割的時候就要選擇『配置整個區域』啦！好！下一步按下『建立主分割』：
這裡會問你是否要將整個硬碟分割為僅有一個磁碟區？由於我們要將硬碟分為兩槽，所以這裡當然選擇『[N]否』啦！
由於你選擇了『不要配置整個區域為一塊磁區』，所以這時程式要你輸入你所需要的磁區。通常在第一步是輸入『啟始磁柱』，這時只要按 Enter 就可以啦，然後會要你輸入『結束磁柱』，結束磁柱的輸入方法有兩種模式，一種是輸入磁柱區，一種是輸入你所需要的 MB 數，通常我是輸入 MB 數啦，例如如上所示，我所需要的空間大小是 600MB ，所以輸入『+600』即可，而如果你的硬碟很大，你要輸入 4GB 時，則需要輸入 『+4000』，以此類推！輸入『+600』並按 Enter 之後出現如下畫面。
這時出現了你剛剛劃分的硬碟資訊啦，由於我們是劃分為 DOS 分割區，所以系統種類是 FAT-32 ，而 ID 則為 0b 。至於另外尚未劃分的就會顯示為 <未規劃> 啦！如果你還需要再繼續劃分的話，這時將游標移動至 <未規劃> 的那一個磁區按 Enter 後選擇『擴充分割』即可繼續劃分。如果劃分完畢之後，當然就是貯存分割表囉。這裡注意一下，因為剛剛的動作均尚未完成貯存的工作，所以要反悔還來得及！
3. 貯存分割表：
接下來要做貯存的動作了，按下『Esc』鍵（鍵盤左上角那個鍵）後會出現如下畫面：
按『[Y]是』，將剛分割好的分割表貯存至硬碟中！然後出現如下畫面：

這裡的動作是連續的：
  1. 程式會先跟你確認你的硬碟有沒有錯誤，這裡還可以反悔。
  2. 然後程式會問你是否需要使用破壞貯存，一般來說是需要使用『破壞貯存』的，因為需要將你的硬碟劃分完全啦！所以要按 [Y]；
  3. 為了可以讓你以後回復分割情況，所以你可以選擇 『建立 UNDO』檔，所謂的 UNDO 檔即是記錄你之前硬碟分割表資訊的檔案啦。
這樣一來你的硬碟就劃分完畢而且貯存啦！這時要做的就是重新開機並格式化硬碟。格式化硬碟可以使用 DOS 的 Format ，當然也可以使用 spfdisk 的內建功能喔！
4. 格式化硬碟
再進入剛剛你劃分完畢的那個硬碟區，按下 Enter 之後會出現一串選單，然後最下方的選單為『DOS 工具』，選擇這一項並按 Enter 後，會出現另一個選單：
在這個次選單中的第二項即是快速格式化，這個格式化的動作非常的快喔！比 DOS 的格式化快多了！不過，這裡也必須指出一個問題，那就是若你的硬碟有壞軌的話，那最好還是使用 DOS 的 format 比較完整一點。
2002/04/09：第一次完成吧？
2003/02/03：重新編排
2002/ 01/01以來統計人數


簡易且較小安裝 Red Hat 7.2
最近更新日期：2003/02/03
主機的硬體配備與預計開放的服務
硬碟規劃
多重作業系統的安裝流程
Linux 安裝流程（較小安裝、完全安裝）
建立軟碟開機片
本章習題練習
主機的硬體配備與預計開放的服務
就如同前面所說的，安裝你的 Linux 之前，最好先來瞭解一下您的 Linux 用途！當然囉！如果目前您所需要的 Linux 僅只是在於學習 Linux 的指令的話，那麼底下的咚咚你都可以把他看看就好！不過，還是強烈的建議您慢慢的一步一步的安裝你的 Linux 系統，這樣對於您的 Linux 系統會有比較完整的概念說！此外，由於 Linux 系統最好在安裝完成之後，立即重新編譯過他的核心，以使 Linux 系統『較為穩定』，所以，在你可以連上 Internet 的時候，千萬記得一起下載新的 核心 喔！由於 Red Hat 7.2 的核心版本為 2.4.7 ，因此，你必須要下載較新的 2.4.17 以後的版本喔（到 2002/02/16 為止）。
我的主機配備：
好了，既然 VBird 寫的這個部分主要的目的是在於『使用淘汰的電腦來進行 Linux 伺服器的安裝』，那麼我的硬體配備當然不會太好囉！以下就是我的配備啦：
  • CPU 為 P-166，主機板為華碩的老主機板；
  • 使用 64 MB 的 RAM （是 72 pin 的喔！）；
  • 硬碟為 3.2 GB 的硬碟，安插在 primary 排線的 master 上面；
    這裡要特別說明一下，通常在 586 之後的主機板上面都有兩條接排線的界面（排線就是硬碟與主機板相接的那一個東西啦！），而我們稱這種界面為 IDE 界面（目前的主流硬碟界面），並且主機板上面的這兩個界面就分別稱為 Primary （主要的） 與 Secondary （次要的） IDE 囉。
    而如果你有仔細觀察的話，那麼每一條排線上面還有兩個插孔，也就是說一條排線可以接兩個 IDE 界面的裝置（硬碟或光碟機），而你有兩條排線，因此一個主機板在預設的情況中，應該都可以接四個 IDE 界面的裝置。好了，那麼每條排線上面該如何判別哪一個是主硬碟（ Master ），哪一個是副硬碟（ Slave ）呢？基本上這個需要調整硬碟上面的 jump 才可以知道！這個時候，請察看一下您的硬碟機吧！上面應該都會有圖示說明才對！
    這一部份請特別留意喔！因為不同的硬碟接法將會導致不一樣的狀況，更嚴重的，將會導致無法開機的窘境，所以建議您注意一下這裡！
  • 網路卡預計使用兩塊螃蟹卡，不過，如果您不希望有無法分辨網路卡的狀況發生，那麼建議使用兩塊不一樣晶片的網路卡比較好！
  • 顯示卡使用的是 S3 Virge 的 PCI 顯示卡，不過由於我以後的過程中將不會使用 X-Windows ，所以這部份似乎不會有問題！
  • 安裝過程中需要的裝置：鍵盤、螢幕、光碟機、軟碟機等等，這些裝置在安裝完成 Linux 之後，即可馬上拔掉！
硬碟 partition 的問題：
硬碟的 partition 是相當重要的一環呦！這裡有一些重要的資訊要先跟大家報告！就是說：
  • 在 Linux 底下，每一個裝置都以一個檔案來代表，例如 IDE1 的 master 為 /dev/hda ，而由於 primary + extended 最多有四個 partition ，所以第一個由 extended 分割出來的 logical 磁區為 /dev/hda5 ！
  • 需要特別留意的另幾個裝置是網路卡、軟碟、光碟，其代號分別為： /dev/eth0, /dev/fd0, /dev/cdrom！
  • 如果你有一個硬碟接在 IDE2 的 master 上面，並且有 5 個可以使用的磁區，同時你分割了 2 個 primary partition 時，那麼你的磁碟應該就會有底下幾個代號：
    • /dev/hdc1 (primary)
    • /dev/hdc2 (primary)
    • /dev/hdc3 (extended, 這個為不可使用的磁碟代號)
    • /dev/hdc5 (1st logical)
    • /dev/hdc6 (2nd logical)
    • /dev/hdc7 (3th logical)
預計開放的服務：
雖然是老舊的配備，不過相對於我服務的機器數：五部個人電腦，也相當足夠了！呵呵！那麼我需要的服務有哪些呢？
  • NAT ： 用來分享頻寬；
  • Mail ： 用來收發信件；
  • WWW ： 用來給大家架設個人網頁；
  • Proxy ： 用來提供五部區域電腦內的用途，並加以分流；
  • DHCP ： 主要在提供內部電腦不需要安裝一些有的沒的！
  • FTP ： 最好是不要安裝的啦！
我的網路：
我的網路主要是以 撥接制 ADSL 為主，那麼如何規劃呢？
  • 在 Linux 系統中，預計以 rp-pppoe 這個軟體來撥接 ADSL 並且予以分享；
  • 我的內部網路之 網段 為 192.168.1.0/255.255.255.0 這一個，沒有再切割的子網路；
  • 我的 Linux 主機名稱為 vbird.adsldns.org ，是跟 www.adsldns.org 申請的動態 DNS 系統；
選擇的套件：
我選擇的安裝套件為 Red Hat 7.2 版，他的特徵為：
  • 這一版的預設核心為 2.4.7-10 ！
  • 預設的防火牆機制為 Kernel 2.4.x 的 iptables ；
  • 預計使用 LILO 作為 Boot Loader 喔！
  • 另外，由於在設定其他的服務之前，想要先以較新的 Kernel ( 核心 ) 來編譯過，因此需要先下載核心！
大致上就是這樣囉！
硬碟規劃
自訂安裝『Custom』：
初次接觸 Linux ：只要切割『 / 』及『 Swap 』即可！
好了，通常初次安裝 Linux 系統的朋友們，我們都會建議他直接以一個最大的磁區『 / 』來安裝，這樣有個好處，就是不怕分割錯誤造成無法安裝的困境！例如 /usr/ 是 Linux 安裝程式中擺放的目錄，萬一你分割了一塊磁區給 /usr ，但是卻給的不夠大，那麼就傷腦筋了！因為會造成無法將資料完全寫入的問題，就有可能會無法安裝啦！因此上，如果你是初次安裝的話，那麼可以僅分割成兩個磁區『 / 與 Swap 』即可！
建議分割的方法：預留一個備份的磁區！
就如同前面幾個心得分享文章中提到的，由於 Linux 預設的目錄是固定的，所以：
  • 通常我們會將 /var 及 /home 這兩個目錄稍微加大一些，如果硬碟夠大的話，加個幾 GB 也不為過！
  • 另外， /usr 至少給他 3~5 GB 吧，如果硬碟真的大的話！
  • 而 / 也可以給個幾 GB 的空間。
  • 最後，由於我們的 Linux 可能是在『試用』階段，所以很有可能會重複的一再安裝，因此上，我都會預留一個磁區來備份我的核心啦與實驗過程中覺得不錯的 scripts （就有點像 DOS 的批次檔），當然，我的 /home 底下的咚咚也可以有備份的地方，而安裝套件的原始檔案也可以擺在這裡！有個最大的好處是，當我的 Linux 重新安裝的時候，我的一些套件馬上就可以直接在硬碟當中找到！呵呵！重新安裝比較便利啦！
選擇 Server 的硬碟切割方式：
對於首次接觸 Linux 的朋友們，通常不建議使用 Red Hat 預設的 Server 安裝方式，因為會讓你無法得知 Linux 在搞什麼鬼，而且也不見得可以符合你的需求！不過，這裡仍然說一下選擇 Server 的時候，他是如何切割硬碟的呢？

注意：選擇 Server 的時候，請『確定』您的硬碟資料是不要的！因為 Linux 會自動的把你的硬碟裡面舊有的資料全部殺掉！此外，硬碟至少需要 2 GB 以上才可以選擇這一個模式！

  • 64 MB 的 Swap ；
  • 256 MB 的 / ；
  • 256 MB 的 /var ；
  • 其他的空間平分給 /usr 與 /home ！
知道了嗎？由於 Server 會有上面的限制，所以通常我都不太喜歡讓 Linux 自己切啦！選擇 Custom 比較好說！
硬碟的代號意義？
在 Windows 或者是 DOS 年代，硬碟以 FAT 表來切分時，他們的代表磁區為 C: D: E: ...但是在 Linux 中則不然喔！一個『目錄』可以代表一個『裝置』！基本上，每一個硬碟在安插的 IDE 介面中，都有不同的代號：
硬碟安插的 IDE 介面
Linux 上面的磁碟名稱
第一個 IDE 的 Master 上之硬碟
hda
第一個 IDE 的 Slave 硬碟
hdb
第二個 IDE 的 Master 硬碟
hdc
第二個 IDE 的 Slave 硬碟
hdd

另外，需要特別留意的是，每一個硬碟（例如 hda ）最多可以有 4 個 primary 磁區！分別是 hda1, hda2, hda3, hda4！而如果是邏輯磁區的話，那麼就需要由 hda5 開始增加囉！

多重作業系統的安裝流程
  • 硬碟重新規劃的多重開機系統：
      • 如果你想要在你的 Linux 機器上同時安裝 Windows ？可行嗎？當然可行囉！況且目前很多的朋友手邊只有一部電腦，但是又想要同時學習一下 Linux ，呵呵！那麼安裝多重作業系統實在是必須要的！好了！那要如何安裝呢？以我前一陣子幫一個朋友規劃的 Win98, Win2000, Linux 為例，我先將硬碟以 spfdisk 切割成兩個 FAT partition，分別是 2GB 與 3GB ，預計安裝 Win98 與 Win2000 （分別是 C: 與 D: ），然後再以 CD 開機後，分割最後的磁碟成為 / 與 Swap 兩個！好了！如何安裝：

      1. 先以 Spfdisk 分割硬碟：由於 Windows 的 Fdisk 實在太慢了，我蠻喜歡使用 spfdisk 這個全中文的磁碟分割介面的！簡單又方便！將硬碟切割成 C: 2GB, D: 3GB即可！詳細的 Spfdisk 執行範例可以看一下底下這一篇： spfdisk 範例
      2. 先安裝 Win98 ：這個簡單吧！用 98 開機片開機之後，直接安裝，並且選擇安裝在 C 槽即可！
      3. 再安裝 Win2000：進入 Win98 之後，將 Win2000 的光碟片放進光碟機中，螢幕會自動的跑出一個視窗，問你要不要升級，選擇『是』，然後會進行一些小動作！在安裝程式問到『升級安裝或全新安裝』的時候，請千萬選擇『全新安裝』這個項目，並且不要升級硬碟磁區！然後在出現一個『問你安裝目錄所在』的問題時，進入選項裡面，選擇『要我自己挑選硬碟分割區』那個項目！然後接下來一直按下『確定』或『是』即可！之後，電腦會重新開機，開機完成之後會進入 Win2000 的安裝畫面，然後在出現『安裝磁區』的時候，請選擇 D 槽，並且選擇『不要更改磁區檔案系統』即可！接下來就會完成一些程序啦！
      4. 最後才安裝 Red Hat 7.2：是的，最後才安裝 Linux ！安裝的過程底下會說明喔！
      5. 以 Lilo 設定多重開機：是的，我還是比較習慣使用 Lilo 來作為多重開機的設定啦！

      好了！這樣你就可以具有多重開機的主機系統囉！很高興吧！呵呵！先別高興的太早！很多的朋友安裝 Windows XP 及 Windows ME 版本與 Linux 共存，安裝的結果是『殘念』的！不過個人沒有試過 XP 與 ME ，所以無法提供任何的解答！這點請千萬注意了！在我的經驗中，使用 98 與 2000 來與 Linux 共存是沒有問題的（在我的舊機器與新的雙 CPU 主機當中都試過！ OK ！）
    • 在既存的 Windows 系統中加裝 Linux 系統：
      另外再提供一個之前也曾經安裝過的一個經驗！恩！你可能會覺得奇怪，這個方法跟上一個方法有什麼不同！？呵呵呵呵！最大的不同在於：
      • 我既存的 Windows 系統中的資料不想丟掉，並且我也沒有新的硬碟來暫存我的系統或者是備份資料！假設原本我的 20 GB 硬碟中分割成 10GB, 10GB 兩槽，但是我還想要安裝 Linux ，且是在『舊系統仍然可以存活』的情況下！那該如何是好？！
      這真的是很有趣的問題！早先在 Windows 系統中， VBird 就犯了一個錯！C 槽給的太大了！基本上，系統檔不需要太大啦！通常我都喜歡 C 槽只給大約 4 GB 左右的空間（甚至更小），這是因為 C 槽是很需要備份的！如果太大的話，備份很麻煩！所以系統重置就會很花時間（因為所有的東西都要重新安裝！我哩咧....！）！因此，我都習慣將 C 槽只給一點點的空間，然後再安裝完並設定完所有的系統之後，馬上以 Ghost 來備份我的系統！而所有的備份資料檔案都擺放在 D 槽！此外，我的 OutLook Express 的書信目錄也都不是擺在 C 槽！呵呵所以我不會很害怕 C 槽掛掉，因為，直接以 Ghost 還原即可囉！系統還原還不需要 30 分鐘呢！
    這裡就發生一個問題啦，假如原本的系統是 10GB, 10GB 的兩槽，不過全部的有用到的資料量只有 10GB 不到！也就是還有空間來安裝 Linux ，但是由於硬碟切割的不好，所以傷腦筋！此外，我的原系統希望留下來，而且也希望可以安裝 Linux ，要怎辦？！我曾經這樣做過：
    • 由於 FAT 的磁區使用，其實只是在磁頭區域（所謂的硬碟第零軌）規劃而已，所以，我就將我的資料先以『磁碟重組』的方式將資料都歸在一起；
    • 然後以 Spfdisk 將該硬碟的 FAT 表進行分割，注意喔！只是分割 FAT 表，並沒有 format 喔！不過這裡的技術性很高，需要特別注意！因為你是將 FAT 表重新劃分，所以你的資料必須要在同一個磁區內！好了，我就將原本的 10GB 10GB 切割成 4GB、10GB與 6GB 三槽！而且在 spfdisk 的幫助之下，順利的在沒有任何資料遺失的狀況下，將我的硬碟由原先的兩槽分割成三槽囉！那麼一來，我就可以在我原本的 D 槽裡面安裝 Linux 啦！方法有點像底下的圖示：
    很神奇吧！資料還是在原來的地方，不過磁區的定位點改變了，還多出一個磁區！不過，這裡要提醒大家，雖然 VBird 曾經以這個方法成功而且完全沒有驚險的將硬碟資料在不毀損的情況下，順利的將硬碟切割完畢！但是那是小弟已經瞭解到 FAT 與磁區的相關性（其實 FAT 只是在『規範』你的硬碟讀取頭讀取的『頭』跟『尾』而已，並不是真的將硬碟『切割』囉！），而且我也有『壯士斷腕』的覺悟！呵呵！因此不是很建議您這樣做！尤其是當你的資料還很重要的時候！切記切記！
    Linux 安裝流程（較小安裝、完全安裝）
    接著下來要開始來安裝 Linux 囉！說了這麼多有的沒的 ㄟ .... 不好意思， VBird 太喜歡胡扯了....
    事先檢查：
    基本上你必須先檢查一下你的武裝配備喔：
    • 下載並燒錄 Red Hat 7.2 的可開機光碟：不要問我如何燒錄∼∼
        enigma-i386-disc1.iso
        enigma-i386-disc2.iso
      強烈的建議您不要使用 HTTP 來捉這兩個檔案，就是不要使用 IE 或者是 Netscape 之類的瀏覽器來捉這兩個檔案，因為檔案太大了，在傳輸的過程中會有捉錯的情況，所以就會很麻煩....建議使用續傳軟體，或者是直接以 FTP 軟體到中山大學的 FTP 站捉，不但具有續傳功能不怕斷線，捉到的檔案也會比較正常（已經有很多朋友在 BBS 上面留言，發現捉的檔案無法燒錄囉！）。此外，也建議直接下載新的核心，以方便後來的核心編譯工作！目前新的核心已經出到了 linux-2.4.17 （截至 2002/02/16 為止），通常 VBird 都是在中山大學下載的，你可以到底下來看看呦！
        中山大學關於核心
    • 進入 BIOS 設定開機順序：
      基本上如果是不太舊的版子都會支援光碟開機的，使用 CD-ROM 開機的好處是比較快，而且也不用再去做 Linux 安裝開機片，確認的方法如下：
      • 按電源鍵開機；
      • 在進入系統之前會出現 Del 字樣（每個廠牌不太相同），此時按下鍵盤上的 Delete 鍵；
      • 進入 BIOS 之後以方向鍵選擇 『BIOS Features Setup』這一項，或者是 『Advanced BIOS Features』，不管如何，反正只要看到 『BIOS Features』字樣的那一項就對了！；
      • 將方向鍵移動至 『Boot Sequence』 或者是 『First Boot Device』； 這一項，按鍵盤上的『Page Up』 或 『Page Down』 按鍵，選擇『CD-ROM』 為第一開機順位即可。這裡注意一下，如果你的機器並不支援 CD-ROM 開機的話，你一定找不到 CD-ROM 這一項，這時請製作開機片吧，並將此項調整為『A』為第一順位；
      • 按鍵盤上 『ESC』 鍵退出；
      • 將方向鍵移動至 『Save and Exit』 這一項按 『Enter』 及 『Y』 確認後重新開機即可！
    • 製作 Linux 開機片：
      a. 隨便找一台 Windows 電腦，開啟 MS-DOS 視窗；
      b. 將可開機 Linux 光碟放入光碟機中，在 MS-DOS 視窗鍵入：
        C:\WINDOWS> cd E:\dosutils
        上面的 E 為你的光碟機代號；
      c. 在 DOS 提示字元下鍵入：
        E:\dosutils> rawrite -f e:\images\boot.img -d a:
        上面的 e 為你的光碟機代號，這時在軟碟機放入一片空白的軟碟片後，按『Enter』即可。
    開始安裝：
    這樣就準備妥當了！正式進入安裝吧！特別說明，由於 VBird 不太喜歡使用 X-Windows 系統，所以通常我都使用文字介面安裝的，因此底下將以 文字 介面作為介紹，而且，由於許多畫面不是很重要，因此 VBird 並沒有將畫面秀出來喔！
    1. 開機==>放入 Red Hat 7.2 的光碟機後，以 CD-ROM 開機或者以剛剛做好的 Linux 軟碟開機；
    2. 選擇安裝模式==>進入歡迎畫面，之後在『 boot: 』的地方輸入：『 text 』以文字介面安裝！這個時候 Red Hat 會載入一些模組，所以會花費一些時間。
    3. 選擇語系==>然後在選擇語系的地方輸入『 English 』；因為文字介面好像沒有支援中文的樣子！？
    4. 鍵盤模式==>同樣的，鍵盤先選擇『 us 』即可；
    5. 滑鼠模式==>由於我沒有滑鼠，所以直接按『 tab 』鍵到『 OK 』按下 Enter 即可；
    6. 歡迎畫面==>按 Enter 即可；
    7. 選擇系統模式==>如前所述，這裡共分為 Workstation, Server 與 Custom 等等，由於 Workstation 與 Server 會將你舊有的硬碟 Partition 給殺掉，因此我們就直接以『 Custom System 』來安裝吧！
    8. 要不要 Linux 自動幫你規劃硬碟==>開什麼玩笑！當然要自己規劃自己的硬碟囉！請選擇『 Manually partition 』這一項；
    9. 選擇硬碟分割工具==>硬碟分割工具當然是選擇比較簡單的啦！那麼我們就選擇『 Disk Druid 』這個有點像圖形介面的咚咚吧！
    10. 硬碟分割==>進入 Disk Druid 介面之後，應該有點像底下的圖，不過由於 VBird 不會捉圖，所以底下的畫面是『錯誤的』喔！ Red Hat 7.2 版已經不是這個樣子的圖示了！因為他還有加入 ext3 呢！呵呵！不過基本的使用方式還是差不多啦！底下來說一說吧：
      基本上你會看到類似上面的話面，總共會顯示你的目前硬碟的磁區，如上面說的，『 Primary IDE 的硬碟中的 Mater 為 hda 』！這點請特別留意囉！好了，如果你要將舊有的 FAT 磁區安裝 Linux 的話，那麼你就必須將該磁區『 Delete 』掉才行，不論如何，請看一下你的剩餘硬碟資料空間（註：常常有很多的朋友來信問到，咦！我的 E 槽明明還有 5GB 的空間，為什麼不能安裝 Linux 呢？！就是這個問題啦！因為 Linux 的磁區與 Windows 的 FAT 並不相同呀！所以你必須將原有的 FAT 磁區砍掉後，才能規劃出新的 Linux 磁區呀！所以要看一下硬碟的 Free 喔！）我這裡建議的分割方式有機種（請注意，第三個安裝的選項是關於 Proxy 的設定方面，如果你要安裝 Proxy 套件的話，才建議多加這些磁區！因為據說這樣分割的硬碟會讓 Proxy 的效能比較好！）：
      較小安裝（或初次安裝）
      建議安裝
      含有 Proxy
      • Swap 約 100 MB ；
      • 其他的都給 /
    11. Swap 約 100 MB；
    12. /var 給 3∼5 GB；
    13. /usr 給 3∼5 GB；
    14. / 給 1 GB 以上；
    15. /home 可以給大一些；
    16. /backup 用來做為備份的磁區
      • 與 建議安裝 相同
      • /proxy1 給 500 MB；
      • /proxy2 給 500 MB；
      • /proxy3 給 500 MB；
      • /proxy4 給 500 MB

      另外，進入每一個磁區之後，你必須要決定：
      『 Mount point 』就是磁區啦；
      『 Filesystem type 』除了一定要有一個 Swap 之外，你可以選擇 Ext3 這個新的磁區喔！似乎有稍微快一點呢；
      『 hda, hdb 』這個是硬碟啦！這裡請小心選擇！
      『 Fixed Size 』由於我們都需要給每一個磁區固定的大小，所以這裡就選擇 Fixed Size 這一個，但是在最後一個磁區（通常是 /backup 這一個）時，我通常都會選擇『 Fillall available space 』將其他剩下的空間都給他！
      『 Force to be a primary partition 』除非特別需求，例如你的這個磁區是開機區，但是卻可能落在 8 GB 以後的磁區內，那麼才需要將這個勾選，否則這個選項不要管他！
      『 Check for bad blocks 』除非你的硬碟是有壞軌的，否則『千萬不要選』不然硬碟檢查真的好慢....好慢.....
      VBird 的分割結果（3.6 GB 硬碟）：

        /dev/hda1 2204 /
        /dev/hda2 996 /var
        /dev/hda3 502 /backup
        /dev/hda5 100 /proxy1
        /dev/hda6 100 /proxy2
        /dev/hda7 100 /proxy3
        /dev/hda8 100 /proxy4
        /dev/hda9 64 Swap
    17. 選擇安裝的開機管理系統==>Red Hat 7.2 提供兩個開機管理系統，由於 VBird 比較習慣使用 Lilo ，所以這裡我是選擇『 Lilo Boot Loader 』的！如果你要試一試其他的多重開機控制軟體，不反對啦！但是，這裡 VBird 仍是以 Lilo 來作為說明的！
    18. 選擇開機管理系統安裝的磁區==>如果沒有特殊的需要，就直接選擇『 MBR Master Boot Record 』吧！
    19. 載入額外的模組==>這個選項專門提供給系統中特殊裝置使用的！由於我們的裝置都很普通，所以這裡就按『 OK 』跳過去吧！
    20. 開機系統的名稱==>你可以選擇其他的名稱，當然也可以不用理他，以預設的名稱輸入之，例如，如果你已經存在有 Windows 系統，那麼很可能 Lilo 秀出來的卻是 DOS 字樣，你可以修改啦！這個可以在未來 Lilo 的部分說明，所以先不要管啦！
    21. 網路卡設定==>『先再次強調，VBird 這一次的安裝是預計要安裝兩塊螃蟹卡的，由於具有相同的晶片組，所以我在安裝的時候僅先安裝一塊而已！並且，這一塊網路卡預設是做為內部虛擬網路之用的！另外一塊會在後面才安裝上去！』。如果你不是使用很奇怪的卡，那麼這個步驟應該會出現網路卡的設定的！（我在這個步驟中預設是當作內部網路之用！所以先給他一個虛擬 IP 喔！）
        首先將 DHCP 前面的 [*] 取消（按空白鍵）；
        然後按上下鍵來設定你的網路條件成為：
          IP：192.168.1.2
          Netmask：255.255.255.0
          Gateway：192.168.1.2
          Primary DNS：139.175.10.20
          Secondary DNS：163.28.112.1
    22. 主機名稱的設定==>給自己一個名字吧！例如我的主機為 vbird.adsldns.org 囉！這裡寫錯也不要緊，後面會提到修改 host name 的方法！
    23. 防火牆的設定==>由於我們會在後續的步驟中更改一些防火牆機制，所以這裡不用設定囉！選擇『 No Firewall 』那一個項目；
    24. 選擇語系==>通常我只選擇兩個語系，分別是『 English 』與『 Taiwan, R. O. C. 』這兩個！
    25. 選擇預設語系==>由於我不使用 X-Windows ，而終端機界面（純文字界面的情況下）並沒有辦法提供中文的顯示，選擇中文作為預設的語系反而會在純文字界面下出現亂碼！！所以我都是選擇『 English 』作為我的預設語系囉！
    26. 選擇時區==>在台灣，當然選擇『 Asia/Taipei 』囉！
    27. 設定密碼==>這裡要特別告誡大家，密碼最好『多於八個字元』，並且含有『非英文或數字的特殊符號』為較佳的選擇！當然囉，你也不能忘記呀！選擇 Password 會有兩次，提供你輸入正確的密碼！
    28. 設定使用者 ID ==>我這裡通常都先不設定的！所以就跳過去吧！先不設定囉！
    29. 選擇加密的條件==>也使用預設值就可以了！所以按下『 tab 』鍵移動至『 OK 』後，按下 Enter 吧！
    30. 套件選擇==>呵呵！終於來到重頭戲了！底下提供三個選擇，你可以參考看看！通常，如果你的硬碟很大的話，那麼將游標移動到最底下，選擇『 Every thing 』來個完全安裝即可！但是為了安全性，不建議選擇 Every Thing 啦！VBird 建議以『建議二』的方式來安裝，不過，如果你的硬碟很小的話，那麼就選擇『建議一』來安裝吧！無論如何， VBird 的系統中是以『 建議二 』安裝的！
      建議一
      建議二
      建議三
      • Network Support
      • Dialup Support
      • Messaging and Web Tools
      • Router/Firewall
      • Network/Managed Workstation
      • Utilities
      • Network Support
      • Dialup Support
      • Messaging and Web Tools
      • Router/Firewall
      • Network/Managed Workstation
      • Utilities
      • Software Development
      • Kernel Development
      • 選擇 『 Every Thing 』
      全部套件共佔 366 MB
      全部套件共佔 657 MB
      全部套件共佔 2902 MB
      適合只想要作為 NAT 之用的機器
      可以後續再加入套件！
      新手的安裝啦！

      大概就這樣吧！若想要跟 VBird 一樣的系統，那就直接以『建議二』安裝囉！

    31. 開始正式安裝囉==>這個時候系統會跟你說：『安裝的過程中，會將資訊都記錄在 /var/install.tmp 檔案中』不理他，直接給他『 OK 』下去！然後系統就會正式的作底下的工作囉：
        1. 先 Formating ，這個動作蠻快的，但是如果你前面選擇了『 check bad blocks 』那麼可能就會花很長一段時間！
        2. 再來是 Copying files ，然後是：
        3. Package Installation ！通常是蠻快的，由於我們安裝的套件並不多！不過，如果你是選擇 Every Thing 的話，那麼可能要花比較長的時間喔！過程中需要抽換光碟片喔！
    32. 製作開機片==>Boot Disk 最好作一下吧！有備而無患呀！
    33. 完成安裝==>螢幕顯示出 Complet 的時候，哈哈！恭喜你啦！這樣就 OK 囉！
    注意事項：
    • 你可能會覺得很奇怪，為什麼你的安裝過程會跟我的不一樣？！呵呵！由於 VBird 的安裝是比較簡易的，包括我也沒有安裝 X-Windows 呀！所以當然也就沒有 X-Windows 的測試的畫面囉！因此，如果你再安裝的過程中選擇了跟我不一樣的套件，不用擔心，安裝過程會有些許的不相同的！
    • 在安裝完成之後，請千萬記得『取出光碟片』，不然又會在進入一次安裝畫面喔！
    • 同時建議，安裝完成之後，請進入您的 BIOS 當中，將開機的順序改回來『 C、A 』或『 C only 』反正就是讓硬碟開機啦！
    好了！這樣應該就已經安裝完畢了！請繼續往下看看吧！而且，相當的建議您，在正式的進行架站之前，請依序看一下底下的網頁，最好不要跳著看，不然的話，嘿嘿嘿嘿！出現什麼問題可不要怪我！因為，照著順序看會對你的 Linux 認識比較有幫助啦！
    建立軟碟開機片
    建立軟碟開機片一直是個好主意！他可以在你求助無門的時候給你莫大的幫助喔！所以，建立一個新的軟碟開機片是一個好主意啦！如何建立呢？其實真的是很簡單，不過，需要你的系統核心的版本就是了！依序進行底下的步驟（先將軟碟片塞進軟碟機中喔！）
    [root @tsai / ]# uname -r
    2.4.7-10 <==先取得核心的版本
    [root @tsai / ]# mkbootdisk --device /dev/fd0 2.4.7-10
    Insert a disk in /dev/fd0. Any information on the disk will be lost.
    Press <Enter> to continue or ^C to abort: 按下 enter 吧！

    注意一下上表的第三行， mkbootdisk 是製作開機軟碟的指令，而 /dev/fd0 是軟碟的代號，至於 2.4.7-10 則是我們系統的核心。要注意的是，如果你的核心曾經更新過，那麼你的核心將不會是預設的 2.4.7-10 喔！需要跟著改變才行！這樣就製作 OK 囉！然後將你的可開機軟碟貼上標籤，給他保存起來吧！

    本章習題練習( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • Linux 的目錄配置以『樹狀目錄』來配置，至於磁碟分割區 ( partition ) 則需要與樹狀目錄相配合！請問，在預設的情況下，在安裝的時候系統會要求你一定要分割出來的兩個 Partition 為何？
      答：
        就是根目錄『/』與虛擬記憶體『Swap』
    • 什麼是 IDE 界面，一般而言，普通 PC 允許幾個 IDE 界面與裝置？
      答：
        IDE 為用來傳輸硬碟資料的一個彙流界面；
        共有 IDE1, IDE2 ，分別有 master 與 slave 所以共四個 IDE 裝置支援！
    • IDE2 的 master 之第一個 logical 磁碟中，其裝置代號（檔案名稱）為何？
      答：
        /dev/hdc5
    • 在硬碟分割 (Partition)時，最多有幾個 primary + extended ？
      答：
        Primary + Extended 共四個，其中 Extended 只有一個！ ( 更詳細的硬碟與 MBR 可以參考 這裡 這篇討論 )
    • 若在分割的時候，在 IDE1 的 slave 硬碟中，分割『六個有用』的磁區（具有 filesystem 的），此外，有兩個 primary 的磁區！請問六個磁區的代號？
      答：
        /dev/hdb1(primary)
        /dev/hdb2(primary)
        /dev/hdb3(extended)
        /dev/hda5(logical 底下皆為 logical)
        /dev/hda6
        /dev/hda7
        /dev/hda8
        請注意，5-8 這四個 logical 相加的總和為 3！
    • 一般而言，在 RAM 為 64MB 或 128 MB 的系統中， swap 要開多大？
      答：
        Swap 可以簡單的想成是虛擬記憶體，通常他的建議大小為 RAM 的兩倍，但是實際上還是得視您的主機規格配備與用途而定。約兩倍的 RAM ，亦即為 128 MB 或 256 MB ，可獲得較佳效能！
    • 什麼是 GMT 時間？台北時間差幾個鐘頭？
      答：
        GMT 時間指的是格林威治時間，為標準的時間，而台北時間較 GMT 快了 8 小時！
    • Tap, SCSI 硬碟, RAID, printer 的裝置代號？
      答：
        Tap : /dev/ht0 (IDE), /dev/st0 (SCSI);
        SCSI H.D.: /dev/sd[a-p],
        RAID : /dev/md[0-15];
        printer : /dev/lp[0-2]
    • 如果我的磁碟分割時，設定了四個 Primary 磁區，但是磁碟還有空間，請問我還能不能使用這些空間？
      答：
        不行！因為最多只有四個 Primary 的磁碟分割槽，沒有多的可以進行分割了！且由於沒有 Extended ，所以自然不能再使用 Logical 分割說
    • 我的 Mandrake 9.0 在安裝的時候，進行 X-Window 的測試時都不會成功，要怎麼辦呢？
      答：
        這個是 Mandrake 9.0 的安裝程式的小問題！在安裝的時候是沒有辦法解決的！一定會失敗！不過沒關係，您可以略過這個步驟！這是因為沒有測試也沒有關係，在安裝完畢之後，應該沒有問題的！都可以進入 X-Window System 的！萬一還是沒有辦法登入 X-Window 的話，沒有關係！不要害怕！等到後來『系統管理員篇』的時候，我們再來深入的談一談 X-Window 的設定吧！！ ^_^。而，如果萬一不幸不小心按下了測試，要怎麼辦呢？螢幕已經一片漆黑了！＠_@，沒關係，此時可以按下 [Ctrl] + [Alt] + [F1] 就可以回到原先的畫面啦！
    • 通常在安裝 Linux 的時候，最重要的就是磁碟分割了！請問：磁碟分割通常要分成幾個步驟？
      答：
        1. 進行磁碟分割 partition ；
        2. 進行格式化 format ；
    • 磁碟分割之後會有所謂的 Primary, Extended 與 Logical 的磁碟分割槽，請問何者為可使用的 Partition ？
      答：
        只有 Primary 與 Logical 為可用， Extended 為不可直接使用的 Partition ，還需要再次的分割成為 Logical 之後，才可以繼續使用！而最大可分割出來的 Partition 應該有 64 個才對！

    2002/02/06：第一次完成吧？
    2003/02/03：重新編排與加入 FAQ
    2002/ 02/06以來統計人數


安裝 Mandrake 9.0 與多重開機技巧
最近更新日期：2003/02/05
Linux 安裝的第一步『規劃』
硬碟分割之配置
Linux 安裝前準備
一個 Linux 安裝實例
多重開機安裝流程與技巧
課後練習
Linux 安裝的第一步『規劃』
由第二章的內容我們大致上可以瞭解：『Linux 主機的配備要求與 Linux 主機所提供的服務有關』，所以囉，要安裝 Linux 的第一步就是先進行 Linux 主機的未來藍圖規劃啦！那麼該如何規劃？由第二章的內容，我們不難瞭解，要規劃好一個 Linux 主機的話，需要：
  1. 決定 Linux 主機的角色定位；
  2. 根據步驟一，選擇適當的硬體配備；
  3. 根據步驟一，決定實體硬碟的分割狀態；
  4. 根據主機上面的作業系統，選擇適當的開機載入程式 ( boot loader ) ，以便安裝在主要開機磁區中 ( Master Boot Recorder, MBR )；
  5. 根據步驟一，選擇所需要的 Linux 程式套件；
好了，既然已經知道大概需要規劃的原理之後，底下我們就實地的來操練一遍吧！好讓您不會很快的忘掉去！
    假設：我是我們宿舍的代表，由於同住的校外宿舍同學需要上網繳交作業，但是該宿舍只有一條電話線，因此希望以 ADSL 來做為網路連線的方式。也就是說，我們宿舍裡面要安裝一部 Linux 主機來做為頻寬分享的機器，同時，這部 Linux 主機預計也要做為我們宿舍裡面 20 個人的郵件主機，與網頁空間伺服器，請問我該如何規劃我的 Linux 主機呢？
    1. Linux 主機的角色定位：
      由上面的說明，可以知道 Linux 主機的服務主要有 NAT ( Network Address Transfer ) 這個頻寬分享的機制、郵件服務與 Web 空間提供等等，此外，為了以後方便系統升級與安裝其他套件，因此需要安裝一些工具軟體，例如 gcc 這個編譯器與 kernel-header 或 kernel-source 等等套件。

    2. 硬體的配備選擇：
      由於服務的對象並不多，加上主機的服務當中，需要 CPU 運算的地方較少，不過呢，由於我需要提供每個人的磁碟使用空間，並且還要提供使用者的郵件空間，所以硬碟方面可能需要大一點容量才行。所以我的硬體配備可以是：

      • 主機板與 CPU ：CPU 只要比 P-166 好即可，而主機板需要與 CPU 形式配合。此外，選擇淘汰的電腦配備來安裝就很好了；
      • 記憶體：使用 64 MB 以上的 RAM ，如果未來網頁空間的流量太大時，可能需要提升記憶體到 256 MB 以上，所以需要預留記憶體插槽；
      • 硬碟：硬碟至少需要 3.2 GB 以上的 IDE 硬碟；
      • 網路卡：網路卡預計使用螃蟹卡；
      • 顯示卡：由於這部機器本身是做為主機之用，所以不需要 X-Window ，因此顯示卡使用的是 S3 Virge 的 PCI 顯示卡；
      • 安裝過程中需要的裝置：鍵盤、螢幕、光碟機、軟碟機等等，這些裝置在安裝完成 Linux 之後，即可馬上拔掉！

    3. 關於硬碟分割的分配：
      由於我們的 Linux 主機要用做網頁空間與郵件主機，所以如果為了安全起見，最好將放置網頁的目錄與放置郵件的目錄安置在不同的磁區中，因此總共規劃為四個磁區，分別為：

      • /
      • /var/spool/mail
      • /home
      • swap

      特別注意到，硬碟分割的分配與你的主機規劃相關性最高了，在下一節當中，我們會更仔細的介紹硬碟分割的基本原理與步驟！而至於各個目錄與磁區的相對應關係，我們將在磁碟檔案系統進行說明，請莫著急呦 ^_^ ！

    4. 選擇 MBR 當中的開機管理程式：
      在 Linux 裡面預設使用兩種開機管理程式，分別是 LILO 與 GRUB 這兩個好東西，其中， LILO 算是比較早期的開機管理程式，不過， VBird 個人倒是還蠻喜歡 LILO 的，畢竟他雖然比較死板，但是還蠻好用的，磁碟代號設定上面與 Linux 上的磁碟代號相同，所以沒有什麼太大的困擾。而較新的 GRUB 其實是很棒的一套開機管理程式，我個人認為，他最大的功能也最具魅力的地方是具有『動態搜尋核心檔案』的功能，他可以讓您在開機的時候，可以自行編輯您的開機設定系統檔案，呵呵！所以即使您不小心設定錯了 grub ，沒關係！開機的時候自行編輯一下就好啦！這方面的技巧，我們會在開機流程與 Loader 的時候再來詳細的介紹，還是慢慢的從頭學習起來呦！

    5. 選擇所需套件：
      由於將光碟上面的全部套件都安裝，是有點浪費硬碟空間，當然如果您是要練習 Linux 的話，那麼還是完整的都給他安裝下去的好?。由於我們需要 Web 與郵件，所以需要特別加選這兩個套件來安裝，此外，由於預設的安裝項目並不包含 gcc, kernel-headers 等對於自行編譯程式者而言相當重要的套件，所以我們也要額外加選這些項目！

    到了這一步之後，嘿嘿！規劃就已經差不多了，所以，這個時候，基本上已經可以開始來安裝 Linux 啦！但是，還是有個困擾耶?那就是，在第三步驟的時候，我要怎麼在安裝的時候分割我的硬碟呀！？第二章裡面有提過硬碟的排線與硬碟在 Linux 裡面的磁碟代號有關，那麼該如何分割？另外，有什麼自訂的方式可以來幫我分割硬碟嗎？呵呵！底下我們就來提一提如何
硬碟分割之配置
硬碟分割與配置的好壞，會影響到未來您的主機的使用情況，此外，好一點的分割方式，會讓您的資料保有一定的安全性！怎麼說呢？這麼想好了，如果你的 Windows 硬碟裡面，僅有 C 槽的話，那麼當 Windows 需要重新安裝的時候，你又想要重新格式化 ( format ) 時，而 C 槽裡面很不巧的，已經放了很多重要的檔案資料，這個時候怎麼辦？光是搬這些重要資料到其他空間就受不了！所以，比較聰明的玩家，都喜歡分割成兩槽以上，將系統檔案與資料檔案分開，可以達到比較好的管理效果！
所以囉，正常使用情況下的 Linux 主機，通常會依照目錄與主機的特性，來分割硬碟，以達到比較好的管理成效。不過，由於 Linux 的硬碟分割比較具有彈性，同時， Linux 硬碟分割程式 fdisk 功能很強悍，此外，要分割的好，必須要瞭解一下基礎的硬碟架構，所以，底下我們先來介紹一下硬碟的基本架構，然後再來介紹如何分割吧！
  • 硬碟連接排線與硬碟代號：
    通常在 586 之後生產的主機板上面都有兩條接排線的界面 ( 排線就是用來連接硬碟與主機板的那一個東西啦！ )，而我們稱這種界面為 IDE 界面，這也是目前的主流硬碟界面，為了區隔硬碟讀取的先後順序，所以主機板上面的這兩個界面就分別被稱為 Primary ( 主要的 ) 與 Secondary ( 次要的 ) IDE 介面囉，或者被稱為 IDE1 ( Primary ) 與 IDE2 ( Secondary )。而如果你有仔細觀察的話，那麼每一條排線上面還有兩個插孔，也就是說一條排線可以接兩個 IDE 界面的裝置 ( 硬碟或光碟機 )，而你有兩條排線，因此一個主機板在預設的情況中，應該都可以接四個 IDE 界面的裝置。好了，那麼每條排線上面該如何判別哪一個是主硬碟 ( Master )，哪一個是副硬碟 ( Slave ) 呢？這個時候就需要調整硬碟上面的跳針 ( jump ) 才可以知道！請察看一下您的硬碟機吧！上面應該都會有圖示說明才對。
    好了，所以如果我有一個光碟機了，那麼我最多就只能再安裝三部 IDE 介面的硬碟在我的主機上面。OK！那麼由於我的硬碟與 Linux 的磁碟代號有關，那麼我怎麼知道這個硬碟的代號呢？沒問題啦，由 IDE 1 ( Primary IDE ) 的 Master 硬碟先計算，最後是 IDE 2 的 slave 硬碟，所以各個磁碟的代號是：

    IDE\Jumper
    Master
    Slave
    IDE1(Primary)
    /dev/hda
    /dev/hdb
    IDE2(Secondary)
    /dev/hdc
    /dev/hdd

    假如我只有一顆硬碟，而且這一顆硬碟接在 IDE 2 的 Master 上面，那麼他在 Linux 裡面的代號就是 /dev/hdc 囉！OK！好像沒問題了呦！呵呵！才不是呢，問題很大呦！因為，如果我這個磁碟被分割成兩槽，那麼每一槽在 Linux 裡面的代號又是如何？注意！基本上，在 Linux 底下我們不是用 槽 為單位，而是以 partition ( 磁碟分割區塊 ) 來說明！所以囉，如何知道每個 partition 的代號呢？
  • 認識硬碟：
    基本上，硬碟是由最小的組成單位 磁區 ( sector ) 所組成的，而數個磁區組成一個磁柱 ( cylinder ) ，最後構成整個硬碟的容量大小。關於硬碟的管理我們在後續章節再來介紹，這裡我們比較想要知道的是，如何分割硬碟，所以先簡單的將硬碟變成如下的圖示：

    在上面的圖示中，我們可以很清楚的知道，在硬碟裡面有分為兩個區域，一個是放置這個硬碟的資訊區，我們稱為 Master Boot Recorder, MBR ( 主要開機磁區 )，一個則是實際檔案資料放置的地方。MBR 可以說是整個硬碟最重要的地方了，因為在 MBR 裡面記錄了兩個重要的東西，分別是：開機管理程式，與磁碟分割表 ( partition table )。因此，只要 MBR 物理實體壞掉了，那麼這顆硬碟就差不多要報廢了！因為，如果系統找不到 partition table ，就無法使用這塊硬碟，所以資料即使沒有丟掉，但是沒有 MBR ，呵呵，還是不能使用的啦！
    首先來看一看什麼是 partition table 呢？簡單的說，我們說的『硬碟分割』就是在修改這個 partition table 而已！他基本上定義了『第 n 個磁碟區塊是由第 x 磁柱到第 y 個磁柱』，所以，每次當系統要去讀取 n 磁碟區塊時，就只會去讀取第 x 到 y 個磁區之間的資料！呵呵！這樣知道了嗎？很簡單吧！下次記得人家在談磁碟分割的時候，不要以為系統真的會在硬碟上面用力、努力的劃標籤！實際上，他最大的功能就是修改 MBR 裡面的 partition table 啦！不過，由於這個 MBR 區塊的容量有限，所以，當初設計的時候，就只有設計成 4 個分割紀錄，這些分割記錄就被稱為 Primary ( 主分割 ) 及 Extended ( 延伸分割 ) ，也就是說，一顆硬碟最多可以有 4 個 Primary + Extended 的磁區，其中， Extended 只能有一個，因此，你如果要分割成四塊磁碟分割的話，那麼最多就是可以：

      P ＋ P ＋ P ＋ P
      P ＋ P ＋ P ＋ E

    的情況來分割了。其中需要特別留意的是，如果上面的情況中， 3P +E 只有三個『可用』的磁碟，如果要四個都『可用』，就得分割成 4P 了！( 因為 Extended 不能直接被使用，還需要分割成 Logical 才行，底下我們會繼續說明的！ )。那麼為什麼要有 Extended 呢？這是因為如果我們要將硬碟分割成 5 的磁塊的話，那麼怎麼辦？這個時候就需要 Extended 的幫忙了，本身 Extended 是不能在任何系統上面被使用的，還需要再額外的將 Extended 分割成 Logical ( 邏輯 ) 分割才能被使用，所以囉，藉由這個 Extended 的幫忙，我們就可以分割超過 5 個可以利用的 partition 囉！不過，在實際的分割時，還是容易出現問題的，底下我們來思考看看：

    • 思考一：如果我要將我的大硬碟『暫時』分割成四個 partition ，同時，還有其他的空間可以讓我在未來的時候進行規劃，那麼該如何分割？
      說明：
        由剛剛的說明，我們可以知道， Primary + Extended 最多只能有四個 partition，而如果要超過 5 個 partition 的話，那麼就需要 Extended 的幫忙。因此，在這個例子中，我們『千萬不能分割成四個 Primary 』為什麼呢？假如您是一個 20 GB 的硬碟，而 4 個 primary 共用去了 15 GB ，您心想還有 5 GB 可以利用對吧？錯！剩下的 5 GB 『完全不能使用』，這是因為已經沒有多餘的 partition table 紀錄區可以記錄了，因此也就無法進行額外的分割，當然囉，空間也就被浪費掉了！因此，請千萬注意，如果您要分割超過 4 槽以上時，請記得一定要有 Extended 分割區，而且必須將所有剩下的空間都分配給 Extended ，然後再以 logical 的分割區來規劃 Extended 的空間。

    • 思考二：我可不可以僅分割 1 個 Primary 與 1 個 Extended 呢？
      說明：
        當然可以！基本上， Logical 可以有 64 個，因此，你可以僅分割一個主分割，並且將所有其他的分割都給 Extended ，利用 Logical 分割來進行其他的 partition 規劃即可！

    • 思考三：假如我的硬碟安裝在 IDE 1 的 Master ，並且我想要分割成 6 個可以使用的硬碟磁區，那麼每個磁碟在 Linux 底下的代號為何？
      說明：
        由於硬碟在 Primary ＋ Extended 最多可以有四個，因此，在 Linux 底下，已經將 partition table 1 ~ 4 先留下來了，如果只用了 2 個 P + E 的話，那麼將會空出兩個 partition number 呦！再詳細的說明一下，假設我將四個 P + E 都用完了，那麼硬碟的實際分割會如同下圖所示：

        實際可以使用的是 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5, /dev/hda6, /dev/hda7 這六個 partition！至於 /dev/hda4 這個 Extended 磁區本身僅是用來規劃出讓 Logical 可以利用的磁碟空間而已！

        那麼萬一我只想要分割 1 個 Primary 與 1 個 Extended 呢？這個時候你的磁碟分割會變成如下所示：

        注意到了嗎？因為 1~4 號已經被預留下來了，所以第一個 Logical 的代號由 5 號開始計算起來，而後面在被規劃的，就以累加的方式增加磁碟代號囉！而其中 /dev/hda3, /dev/hda4 則是空的，被保留下來的代號。
  • Linux 底下的硬碟分割模式選擇注意事項：
    實際上，在 Linux 安裝的時候，已經提供了相當多的預設模式讓您選擇分割的方式了，不過，無論如何，分割的行為都不是很能符合自己主機的樣子！因為畢竟每個人的『想法』都不太一樣！因此，強烈建議使用『自訂安裝, Custom 』這個安裝模式！在某些 Linux distribution 中，會將這個模式寫的很厲害，叫做是『 Expert, 專家模式 』，這個就厲害了，請相信您自己，瞭解上面就自稱為 專家了吧！沒有問題！

    • 自訂安裝『Custom』：

      • A：初次接觸 Linux ：只要切割『 / 』及『 Swap 』即可！
        好了，通常初次安裝 Linux 系統的朋友們，我們都會建議他直接以一個最大的磁區『 / 』來安裝，這樣有個好處，就是不怕分割錯誤造成無法安裝的困境！例如 /usr/ 是 Linux 的可執行程式及相關的文件擺放的目錄，所以他的容量需求蠻大的，萬一你分割了一塊磁區給 /usr ，但是卻給的不夠大，那麼就傷腦筋了！因為會造成無法將資料完全寫入的問題，就有可能會無法安裝啦！因此上，如果你是初次安裝的話，那麼可以僅分割成兩個磁區『 / 與 Swap 』即可！

      • B：建議分割的方法：預留一個備份的磁區！
        就如同前面幾個心得分享文章中提到的，由於 Linux 預設的目錄是固定的，所以，通常我們會將 /var 及 /home 這兩個目錄稍微加大一些，如果硬碟夠大的話，加個幾 GB 也不為過！另外， /usr 至少給他 3~5 GB 吧，如果硬碟真的大的話！而 / 也可以給個幾 GB 的空間。最後，由於我們的 Linux 可能是在『試用』階段，所以很有可能會重複的一再安裝，因此上， VBird 都會預留一個磁區來備份我的核心啦與實作過程中覺得不錯的 scripts ( 就有點像 DOS 的批次檔 ) ，當然，我的 /home 底下的咚咚也可以有備份的地方，而安裝套件的原始檔案也可以擺在這裡！有個最大的好處是，當我的 Linux 重新安裝的時候，我的一些套件馬上就可以直接在硬碟當中找到！呵呵！重新安裝比較便利啦！

    • 選擇 Linux 安裝程式提供的的硬碟分割方式：
      對於首次接觸 Linux 的朋友們，通常不建議使用各個 distribution 所提供預設的 Server 安裝方式，因為會讓你無法得知 Linux 在搞什麼鬼，而且也不見得可以符合你的需求！注意：選擇 Server 的時候，請『確定』您的硬碟資料是不要的！因為 Linux 會自動的把你的硬碟裡面舊有的資料全部殺掉！此外，硬碟至少需要 2 GB 以上才可以選擇這一個模式！
硬碟方面的規劃大致上就是如此啦！要規劃硬碟的時候，請特別的小心呦！
Linux 安裝前準備
Linux 安裝之前要準備什麼呢？就是剛剛前面已經講過的幾個咚咚啦！歸納一下：
  1. Linux 主機規劃單：就是剛剛我們規劃好的那個單據囉！
  2. Linux distribution ：利用一些映象站台下載各版本的 Linux ，或者直接以本書提供的三塊 CD 裝的 Mandrake 進行安裝囉！
  3. 主機硬體資訊收集：根據主機規劃單的內容，去收集一下你的硬體資訊吧！其中特別重要的是，先檢查一下是否可以使用光碟開機呢？如果 BIOS 不能支援光碟開機的話，那麼就需要先行安裝可開機軟碟。
  4. 網路硬體連線：這部份本書先不談，否則內容就太多了，阿?再寫下去鳥哥會瘋掉……所以請大家先上網查閱一下網路的硬體連線吧！
  5. 網路資訊：包括你的 IP, netmask, gateway, dns IP 、是否為撥接等等，都需要先知到呦！
然後，其實各個套件的安裝步驟都差不多，大概都是：
  • A. 選擇安裝模式：主要分為圖形介面安裝與文字介面安裝；如果是圖形介面安裝的話，還可以選擇語系，這個時候我們就有中文可以使用啦！
  • B. 搜尋硬體資訊：然後安裝程式會去搜尋一下系統的硬體設備，以利後續的處理，有的安裝程式會在這個地方讓您加入一些參數，以驅動不明的裝置設備；
  • C. 設定鍵盤、滑鼠模式：這個可是很重要的項目呀！
  • D. 硬碟分割設定：就是剛剛提到的幾個注意事項；
  • E. 套件選擇：這是很重要的部分呢！請特別留意！
  • F. 網路與安全性設定：連上 Internet 的模式與驅動網路卡的方式等設定；
  • G. 超級管理員與一般身份使用者帳號設定：最重要的是設定 root ( 超級管理員 ) 的密碼囉！
  • H. 設定 X-Window 與開機片：如果有安裝 X-Window 相關的軟體，那麼 X-Window 就需要設定並且測試一下，另外，製作開機片永遠是最正確的選擇！
大概就是這樣子吧！好了，底下我們就真的要來安裝囉！
一個 Linux 安裝實例
好咯，我要開始安裝我的 Linux 啦！那麼先說明一下我的基本規劃：
  • Linux 主機定位：
    關於這部 Linux 主機，主要是用來做為練習與比較各不同版本 Linux 之間的差異用的，所以定位在練習上面，預計並不提供任何的網路服務；

  • 硬體要求：
    因為定位在練習上面，所以以手邊有的機器來做為練習就是了，且由於是手邊的工作機，所以必須要安裝多重開機系統。

    • CPU 使用 P-III 933 的 CPU ，這個是我的工作機啦，實際上不需要這麼高檔的貨色；
    • 記憶體使用 128 MB ，是 PC 133 的規格；
    • 硬碟使用手邊有的一顆 30 GB 硬碟，預計未來要在上面安裝 3 ~ 4 個 Linux 系統，所以在這次的安裝中，預計規劃 /, /home, swap 三個磁碟區塊而已；
    • 網路卡使用最常見的螃蟹卡；
    • 顯示卡則是前一陣子的主流，但是目前已經落伍了的 Geforce 2 MX ；
    • 其他軟碟機、光碟機、滑鼠、鍵盤等等的配備，則是一般的個人電腦之配備

  • 磁碟分割：
    如同剛剛提到的，由於是定位在練習上面，所以僅分割出 /, /home, swap 三個磁碟區塊，各別佔約：

    • /　　　/dev/hda1 ：4 GB
    • /home　/dev/hda3 ：1 GB
    • Swap　 /dev/hda2 ：200 MB
    • 其他則為尚未規劃空間

  • 由於需要多重開機，所以選擇開機管理程式為 grub 這個程式，並且安裝在 MBR 裡頭；

  • 套件選擇：由於是定位在練習上面，並且不提供任何的網路服務，所以一些零碎的套件將不安裝，並且 X-Window 僅安裝個人較為喜好的 KDE 套件；
好啦！真的要來安裝了！請依照下面的步驟來進行吧！
  1. 選擇開機次序並開機：
    我們可以在 BIOS 裡面設定開機的次序，看看能不能以 光碟機 開機！現今的主機板大多已經支援這項功能了，而我們的 Mandrake 9.0 光碟片本身就是可以開機的，所以設定成光碟開機最好囉！設定方式為：

    • 按電源鍵開機；
    • 在進入系統之前會出現 Del 字樣（每個廠牌不太相同），此時按下鍵盤上的 Delete 鍵；
    • 進入 BIOS 之後以方向鍵選擇 『BIOS Features Setup』這一項，或者是 『Advanced BIOS Features』，不管如何，反正只要看到 『BIOS Features』字樣的那一項就對了！；
    • 將方向鍵移動至 『Boot Sequence』 或者是 『First Boot Device』； 這一項，按鍵盤上的『Page Up』 或 『Page Down』 按鍵，選擇『CD-ROM』 為第一開機順位即可。這裡注意一下，如果你的機器並不支援 CD-ROM 開機的話，你一定找不到 CD-ROM 這一項，這時請製作開機片吧，並將此項調整為『A』為第一順位；
    • 按鍵盤上 『ESC』 鍵退出；
    • 將方向鍵移動至 『Save and Exit』 這一項按 『Enter』 及 『Y』 確認後重新開機即可！

    如果是必須以軟碟開機的話，那麼需要的動作就變成了：

    • 隨便找一台 Windows 電腦，啟動檔案總管，進入光碟機的檔案資料夾，假如您的光碟機在 E 槽，那麼請進入 E:\dosutils 這個目錄，請注意，每個人的光碟機所在磁碟代號都不一樣，請依您的電腦來操作；
    • 在該目錄當中，點選 rawrite 這個應用程式，然後在出現的 MS-DOS 畫面之中依序輸入下列：( 註：那個磁碟代號是光碟機，請依您的電腦實際配置來決定！ )

      Enter disk image source file name: e:\images\cdrom.img
      Enter target diskette drive: a:
      Please insert a formatted diskette into drive A: and press -ENTER- :

    請注意，請將軟碟放入您的軟碟機當中呦！

    無論如何，在進行完上面的步驟之後，請將第一片 Mandrake 可開機光碟放入光碟機中，如果使用軟碟的朋友，請將可開機軟碟放入軟碟機，否則拿出軟碟，按下電源，給他開機去！

  2. 選擇安裝模式：
    一般 Linux 支援兩種安裝模式，分別是圖形介面與文字介面。正常的話，在開機之後，會到底下的這個畫面，在這裡可以直接按下 Enter 來進入圖形安裝介面，或者在 boot: 後面輸入 text 來以文字介面安裝。由於 Mandrake 的安裝程式做的蠻好的，所以通常可以順利的進入圖形安裝程式當中。如果必須以文字介面來安裝的話，那麼也沒有關係，因為全部的步驟都跟圖形介面下一模一樣，所以您可以對照著這個網頁的步驟來試看看。

  3. 選擇安裝程式的語系：
    在 boot: 之後，會跑一些安裝程式所需要的資料，然後就是進入這個語系選擇的畫面。由於我們比較看的懂中文呀！所以，在進入圖形介面之後，請移動滑鼠並且選擇上面的項目，選擇完畢之後，請按下 OK 按鈕即可；

  4. 是否接受授權碼規定：
    授權碼一定要選擇接受才可以繼續呦！所以就接受吧！同時請注意到，在這個安裝程式的畫面中，主要分為三個區域：

    • 執行流程步驟區：這個區域是在左邊的流程列，您會發現到上面的畫面中，那個『選擇語系』左邊的按鈕列顏色不一樣！對啦，那表示『已經或正在安裝的步驟』咯！而在下方的顏色則是表示尚待進行中的流程。好了，那麼假設您已經進行到了第五個流程，亦即是『選擇鍵盤形式』那個流程時，卻想要回到前一個流程，亦即是『設定滑鼠』時，可以將滑鼠移動到『設定滑鼠』左邊的按鈕，按下他，嘿！就回到設定滑鼠的畫面啦！

    • 此步驟的提示內容：在上頭畫面的右下方，就是此一步驟的提示協助文字區( Help )，您可以到該畫面的右邊捲軸處移動，以瞭解完整的資訊；

    • 該步驟的選擇項目：就是佔了畫面最大面積的那個框框當中啦！裡面是關於該步驟安裝時，需要您來設定的選擇項目，請仔細的進行選擇吧！

    此外，在某些流程步驟當中，會另外有跳出式視窗來提供您選擇或設定，這就是基本的安裝程式畫面囉。

  5. 選擇預設或自訂安裝：
    目前的 distribution 通常還蠻好心的，會詢問您是否要『安裝』還是在『既有的 Linux 上面升級』，另外，也可以不升級核心，僅升級可以升級的套件！由於我們是第一次安裝，且想要以自己最想要的方式來安裝，所以當然就如同上面一般，選擇『自訂』及按下『安裝』即可！

  6. 硬碟偵測：
    由於您的系統上面可能會有 SCSI 介面的硬碟，果真有的話，由於 Linux 會再以額外的程式去偵測並驅動 SCSI 介面的硬碟，所以這裡才需要選擇『是的』，如果您跟 VBird 一樣是個苦命的人，那麼這裡直接給他『否』吧！當然，有興趣的話，可以去『檢視硬體資訊』看看你的硬體配備是否被正常的驅動了呢？

  7. 設定滑鼠：
    選擇屬於您正確的滑鼠類型，這裡設定錯的話，有些 distribution 可是不許您進入 X-Window 的呦！滑鼠比較有關係的是他的連接到主機的類型啦！如果是圓頭的，那就稱為是『PS2介面』的滑鼠，如果是有九個孔的，就稱為『序列埠』滑鼠，如果是扁頭的，那就是『USB』滑鼠啦！我們這裡選擇標準就好了！

  8. 設定鍵盤：
    通常我們直接選擇美式鍵盤即可！

  9. 安全性設定：
    共分為四種等級，分別為『標準』、『高』、『較高』、『嚴密』等四個，通常我們選擇『標準』就可以了！對於安全性而言，這樣的設定可能並不足夠，需要再進一步的設定，關於安全性的設定文章，請參考相關書籍。不過，我們這裡的定義是練習用主機，所以選擇『標準』即可。

  10. 設定檔案系統及硬碟分割：
    接著下來是最重要的硬碟分割方式！如上圖所示，我們會看到硬碟的整體資訊，由於我們的硬碟尚未規劃，所以在 hda 的部分為白色的模樣！此外，在底下有幾個重要的按鈕，分別的功能是：

    • 全部清除：將原有的硬碟分割全部刪除成未分割的樣子；
    • 自動分配：以系統磁碟分割方式進行磁碟分割；
    • 更多：更多的詳細資料；
    • 精靈：叫出提示精靈；
    • 復原：恢復成尚未進行分割前的樣子；
    • 切換到一般模式：換成較為簡易的設定畫面；
    • 完成：完成磁碟分割，並將 partition table 寫入 MBR 內。

    • A. 建立根目錄分割：

      在按一下 hda 那個空白的區域之後，在選擇動作欄內會出現『新建』字樣，按下『新建』會出現底下的圖樣：

      在這個跳出式的視窗之中，我們要選擇的是開始的磁區與大小，剛剛我們的設定是需要根目錄約 4 GB 左右，這裡『開始的磁區』使用預設值即可，滑鼠移到『大小』右邊的那個捲軸上面，請注意，由於每個磁碟的大小不同，所以一個磁柱的大小也都不一樣，因此，你的螢幕前面看到的內容可能與我的不一樣，請特別留意！

      設定完了磁碟的大小之後，再來是要選擇磁碟的檔案格式，Linux 預設的檔案格式是 Ext2 ，但是更新的 Ext3 檔案格式中，提供了更多的日誌式記錄功能，所以目前也可以使用 Ext3 這一個檔案格式呦！同時，我們選擇了『 / 』根目錄做為掛載點以及『Primary』做為設定值，所以，最後得到的結果為：

      再按下『確定』之後，就會顯示出目前這個磁區的屬性啦！如下圖所示：

      在上面的圖示中，將滑鼠移動到空白的區域之內，按一下滑鼠左鍵，就又會出現『新建』的字樣，此時，再繼續新建的工作！好啦，我們來新建一下 Swap 這個虛擬記憶體吧！

    • B. 建立虛擬記憶體 Swap ：
      與新建的功能相當，不過，需要選擇的則是『檔案系統格式』內容，需要選擇為『 Linux swap 』的格式，則底下『掛載點』會自動被取消掉！

      這個 Swap 有什麼功能呢？簡單的說，他可以被看做為『虛擬記憶體』囉，那麼虛擬記憶體是什麼？您可以這樣想像，當你的實體記憶體只有 64 MB 的時候，但是你的系統負荷突然之間太大了，例如突然之間有數十個人連上你的 Web 伺服器時，那麼你的實體記憶體將不足以負荷這些計算的資料！怎麼辦？這個時候我們可以使用硬碟來模擬記憶體的資料存取，這個就是所謂的『虛擬記憶體』囉！不過，虛擬記憶體的速度會比較慢呦！

      當有資料被存放在實體記憶體裡面，但是這些資料又不是常被 CPU 所取用時，那麼這些不常被使用的程序將會被丟到虛擬記憶體當中，而將速度較快的實體記憶體空間釋放出來給真正需要的程序使用！這就是虛擬記憶體 的功效啦！通常 Swap 建議的值大約是『RAM 的兩倍大』，但是這個因地制宜啦！像我的 Proxy 主機本身的記憶體就達到 1GB 了，那麼是否還需要虛擬記憶體呢？見仁見智囉！

    • C. 新增其他掛載磁區：

      好啦！再來以同樣的方法建立其他的磁碟分割，同樣的方式建立起 /home 這一個磁碟分割吧！請注意，上面三個我都使用 Primary 進行分割的呦！最後的資料就成為：

    • D. 使用預設分割行為分割：

      安裝程式也提供了三種主要的預設分割方式來給使用者，當我按下『全部清除』並且再按下『自動分配』之後，會出現上面的視窗，其中，他們的分割方式分別為：

      • with /usr：
          / : 1GB
          Swap : 2 * RAM
          /usr : 3.9 GB
          /home :其他剩餘的空間都直接給 /home
      • simple：
          / : 5.3 GB
          Swap : 2 * RAM
          /home :其他剩餘的空間
      • server：
          / : 256 MB
          Swap : 3 * RAM
          /usr : 3.9 GB
          /tmp : 500 MB
          /var 與 /home 平均分配其他的硬碟空間。
      同樣的，我們這裡不建議使用安裝程式提供的方式來分割啦！

    • E. 寫入磁碟分割表：

      最後，就給他輸入『完成』，並且在出現的視窗中，將硬碟分割表寫入，這樣就完成了我們的硬碟分割囉！哇！好累呦！

    • F. 選擇剛剛分割完成的磁碟分割表：

      使用剛剛完成的那個分割表，所以選擇第二項即可按下確定！

    • G. 設定掛載點：

      再次的設定掛載點，對應好剛剛的分割表！嘿嘿！這樣就完成了最麻煩的工作之一了！

    • H. 硬碟分割的建議：
      這裡必須要給 Linux 新鮮人一些硬碟分割上面的建議：
      • 甲、 初次使用 Linux ：
          Swap 約 100 MB
          其他的都給 / ；
      • 乙、 進階使用者：
          Swap 約 100 MB；
          /var 給 3?5 GB；
          /usr 給 3?5 GB；
          / 給 1 GB 以上；
          /home 可以給大一些；
          /backup 用來做為備份的磁區

  11. 硬碟格式化：
    接著下來，硬碟分割完畢之後，就是格式化硬碟啦！沒錯，所以這裡選擇一下你要格式化的磁碟，當然，如果該磁碟早就存在，那麼不格式化也沒有關係！ ^_^…..

  12. 選取程式套件：
    接著下來自然就是選擇套件囉！而要選擇套件之前， Mandrake 會先檢查是否有這些安裝套件的原始碼存在，所以會先顯示是否有上面這些光碟片存在？如果您使用的是書上附的光碟片，那麼就會出現上面的內容咯！請勾選他吧！

    • A. 選擇所需要的套件：

      接下來我們要來選擇的就是所需要安裝的套件啦！剛剛已經提過了，我們需要的是 KDE 與相關的 X-Window 套件，另外，也需要幾乎所有的練習用的資料，所以可以選擇如上面所示的套件項目，可以在上圖的左下角發現選擇的套件容量為 1727 MB ！

      上表中，最需要注意的是『Console 工具』、『程式開發平台』及『文件檔案』這幾個東西，如果我們未來在進行一些程式編譯的時候，或者是自己在網路上面下載軟體來安裝的時候，常常會使用到這三個項目內的資料，如果沒有選擇的話，會死翹翹！

      底下提供五個建議來給大家做為套件選擇上面的考量：

      • 預設給桌上型電腦用的：這是預設值共需 969 MB 的空間，缺點是沒有 compiler ，以後不能以原始碼安裝軟體。
          辦公室軟體平台
          Internet 平台
          KDE 環境
          Gnome 環境

      • 全部都安裝：全部安裝需要大約 2193 MB 的空間，特別建議新手以這個方式來安裝您的第一套 Linux ，以降低學習的困難呢！

      • 小硬碟的選擇：沒有 X-Window, 並且未來也不能自行安裝軟體，不過就是可以節省硬碟空間，佔了大約 430 MB 的容量。
          用戶端網路環境
          組態設定
          Console 工具
          文件檔案

      • 只有文字介面的伺服器用主機：特別適合用來進行架站的選擇套件方式，沒有 X-Window 呦，而且僅佔容量為 958 MB，是鳥哥最喜歡的安裝方式了！
          Internet 平台
          用戶端網路環境
          組態設定
          Console 工具
          程式開發平台(特別重要，一定要選擇)
          文件檔案
          防火牆、路由器

      • 加上 X-Window 的伺服器用主機：這個比上一個多了 X-window 就是了，共用了 1727 MB，也是我們上面的圖示的內容！建議第二次玩 Linux 的朋友，並且還是想要使用 X-Window 的朋友安裝！

    • B. 危險套件的警告標語：

      當你選擇了一些套件，但是這些套件在 Linux 上面可能不是這麼安全，所以 Mandrake 特別提出告示警語，呵呵！沒關係，我們早就知道會有這些咚咚，所以不用理他吧！

    • C. 開始正式安裝囉：

      努力的給他安裝中……喝杯茶，看個電視去? 不過，在安裝的過程中，會要求您換片，依序換上第二片 CD ，以及第三片名為 Internal CD 的，安裝完畢之後，就可以進入到下一個畫面了！

  13. 設定 root 密碼：
    這個也是相當重要的呦！那就是系統管理員的密碼啦！由於我們預設使用 Linux 本身的密碼機制，所以選擇 本機密碼 資料，至於其他的密碼格式，則請參考個別的網路書籍吧！

    對於密碼的設定，如果您的機器可能會上網，那麼不論是否為 Server ，最好將 root 的密碼設定的嚴格一點，例如至少 8 個字元以上，而且含有特殊符號，例如： I&my_dog 之類的怪怪密碼！不但不容易被猜測，自己還蠻容易記憶的為主！

  14. 預設使用者登入系統：
    如果您的系統預計是要給許多人來使用的，那麼這個『開機預設使用者身份登入』的功能最好是取消，對您而言會比較有保障！

  15. 新增使用者：
    您可以在這個動作裡面設定你的一般身份使用者的帳號與密碼，也可以在未來進行帳號與密碼的設定，這裡我們先設定一個名為 test 的使用者，並且幫他設定一下密碼，設定完成之後，先按下『接受使用者』，再按下『完成』，就可以進入到下一步驟囉！至於其他的使用者設定，我們將在後面的章節再介紹。

  16. 設定網路：
    很多朋友對於設定網路的問題都很困擾耶！這真是傷腦筋了！不過沒有關係，我們底下以一般性的用法來設定你的網路卡，如果你不知道如何設定你的網路卡，那麼就直接以底下的例子來設定吧！

    • A. 選擇自動偵測網路卡與連線模式：

      選擇自動偵測網路卡之後，如果能夠見到上面的圖示您應該要覺得『哇！好高興！』因為看到這個畫面表示你的網路卡已經被 Linux 捉到了！這還不夠高興呀！應該要很爽的哩！好了，接著下來設定其他的東西吧！按下確定；

    • B. 網路介面卡資訊選擇：

      注意一下上面顯示的是否為你的網路配備，沒有問題的話，那麼就給他按下『否』之後，選擇確定吧！

    • C. 設定網路卡位址 IP：

      網路卡位址(IP)選擇最簡單的私有 IP 來設定即可！如果不知道如何設定，那麼就設定上面的樣子就好了！

    • D. 設定主機名稱與 DNS 相關：

      在實際的網路世界中，每一部主機都有他『獨一無二的名字』，那就是這裡設定的主機名稱啦！不過，因為我們沒有對外公佈我們的主機名稱，所以這裡隨便你設定沒有關係啦！相關的主機名稱訊息，請參考 DNS ( Domain name server ) 的相關文章。至於 DNS 伺服器與通訊閘，那個 DNS 伺服器可以直接填中華電信的， 168.95.1.1 大家都能使用，沒有問題，再來的那個通訊閘就不見得每個人都一樣了！如果你還是不知道你的網路狀況，那麼還是先跟我一樣的填法吧未來可以自行修改呢！

    • E. 使用代理伺服器：

      如果不知道你的代理伺服器是什麼，就不要設定吧！沒有關係的啦！

  17. 設定總結：
    好啦！看看有沒有設定錯誤啦！沒有的話就給他『確定』下去吧！

  18. 設定系統服務：
    在預設的狀態之下，系統就會啟動一些服務來自我調整使用環境，這些包含了登錄檔案的紀錄、例行命令的執行與記憶體管理等等，這個部分我們會在後面的章節繼續說明，所以也可以直接給他『確定』下去吧！

  19. 設定開機管理程式：
    我們以較新的 Grub 開機管理程式來管理我們的 Linux 主機吧！同時，將他安裝在開機磁區的 MBR 裡面，作業延遲表示『選單會停留 10 秒鐘』來讓我們決定是否要以該核心進入 Linux 系統！

  20. 建立軟碟開機片：
    無論任何時刻，建立可以開機的救援磁片都是一件正確的選擇！因為您無法肯定什麼時候會來個全台大停電，您總不希望努力了這麼久的安裝好了的系統被破壞吧！ ^_^””

  21. 設定 X-Window ：
    如果您有安裝關於 X-Window 這個視窗介面的軟體，例如 KDE, Gnome 等等的咚咚時，那麼就會出現這個設定 X 環境的選項囉！『設定視窗介面是個很麻煩的程序，而且一定會不成功』，這是因為 Mandrake 的安裝程式在設定 X-Window System 的部分有點小問題！所以，『請不要測試 X-Window 』！然而，無論如何，如果設定不成功，仍然可以在裝完成之後再進行重新設定，所以這一步即使設定錯誤了，也別難過，我們在『系統管理員篇』的時候，會再詳細的介紹 X-Window 的設定方法！

    同時也請特別留意， X-Window 在 Linux 裡面『僅是一套軟體』，而且他還是相當有趣的一套軟體，怎麼說呢？ X-Window 又分為兩部份，第一部份稱為 X Server ，這個 X Server 負責 Linux 主機硬體的管理，例如顯示卡、滑鼠、鍵盤、螢幕解析度等等，都是他在管，而這個 X Server 即是鼎鼎大名的『 XFree86 』是也，而負責整個桌面的顯示的管理者，就稱為 Window Manager ( 視窗管理員 ) 軟體囉，目前最讓大家熟知的就是 KDE 與 GNOME 這兩套視窗管理系統啦！那麼也就是說，只要您的 XFree86 死掉的話，那麼 KDE 也好， GNOME 也好，就肯定也是死掉的，而我們通常說的在『設定 X-Window 』通常就是設定那個 XFree86 囉，包括螢幕的解析度、更新頻率等等的！

    • A. 設定解析度：
      解析度的設定就如同上面所示，一般使用者電腦的解析度設定大都是『 800x600 更新頻率 60-80 』，但是鳥哥特別喜歡字小小的，桌面大大的，所以我會選擇 1024 x 768 那個解析度呢！

    • B. 選擇顯示卡晶片組：

      剛剛提過，我的顯示卡為 Geforce 2 mx ，所以選擇這一個就對啦！『看！』之前不是跟您說過最好先瞭解一下自己的硬體嗎？嘿嘿！就是這些地方用的到啦！

    • C. 選擇 X Server 版本：

      目前 XFree86 分為兩個版本，較新的是 4.x.x 版，舊版的為 3.3.x 版，由於 4.x.x 支援度比較高，當然選擇 4.2.1 那個版本囉！

    • D. 調整色彩度：

      調整一下您的未來的桌面吧！這裡我選擇我最喜歡的大小，您亦可選擇您喜歡的色彩呦！

    • E. 測試設定值：

      記住喔！由於 Mandrake 的安裝程式問題，這個測試的功能『一定會失敗！』，所以請不要測試喔！但是，如果不小心測試下去了，螢幕變成黑壓壓的一片時，怎麼辦？！別擔心，這個時候給他按下：

        [Ctrl] + [Alt] + [F1]

      就會回到剛剛的畫面了！無論如何，如果測試成功的話，那麼就會進入到下一個畫面。

    • F. 選擇是否以 X-Window 做為預設的開機登入系統：

      就像之前就一直在說的，不需要直接進入 X-Window 啦！反正在文字介面之下，仍然可以輕鬆的就進入 X-Window 的說！所以這裡我是選擇『否』呦！

    • G. 再次確認 X Server 設定值：

      如果沒有問題的話，就給他『是的』下去吧！

    • H. 製作救援磁片：

      我也不是很清楚為什麼這裡還要再製作一次救援磁片？無論如何，小心駛得萬年船，所以還是再拿另外一塊磁片來製作一次吧！這樣 X-Window 就設定完成囉！

  22. 套件修補中心：
    這可不是坐月子中心吶！因為發展出來的各個 Linux 套件都很有可能被一些網路閒人所破解，而利用一些漏洞來影響或破壞別人家的主機，因此，必須要常常進行各種套件修補的動作！不過，由於我們的網路還沒有搞定，所以….這個步驟也就沒有辦法做啦！選擇『否』吧！等到安裝完畢，並且連上 Internet 之後，再來修補漏洞！

  23. 安裝完成！恭喜發財！
    不經一番寒徹骨，焉得梅花撲鼻香，呵呵！您已經經過了『一番寒徹骨』了，恭喜您即將進入『撲鼻香』的境界！恭喜您，安裝成功，請按下『確定』，然後取出光碟片，OK！等待登入吧！

  24. 安裝後的注意事項：
    • 你可能會覺得很奇怪，為什麼你的安裝過程會跟我的不一樣？！呵呵！因為每個人選擇的套件都不盡相同，因此，如果你在安裝的過程中選擇了跟我不一樣的套件，不用擔心，安裝過程會有些許的不相同是正常的！
    • 在安裝完成之後，請千萬記得『取出光碟片』，不然又會在進入一次安裝畫面喔！
    • 同時建議，安裝完成之後，請進入您的 BIOS 當中，將開機的順序改回來『 C、A 』或『 C only 』反正就是讓硬碟開機啦！這樣比較安全一些！
    • 如果真的沒有辦法在開機的時候載入 Linux 的核心，以進行安裝時，不要太擔心，直接將 Mandrake 9.0 第一片可開機片放入 Windows 的系統當中，會出現下面圖示：

      再直接按下 Install Mandrake Linux! 即可安裝囉！ ^_^y

    好了！這樣應該就已經安裝完畢了！請繼續往下看看吧！而且，相當的建議您，在正式的進行架站之前，請依序看一下底下的網頁，最好不要跳著看，不然的話，嘿嘿嘿嘿！出現什麼問題可不要怪我！因為，照著順序看會對你的 Linux 認識比較有幫助啦！
多重開機安裝流程與技巧
很多的朋友，包括我自己，由於工作的需要，常常需要兩部不同的作業系統來處理日常生活與工作的雜事！那麼我是否需要兩部電腦呢？並不需要，只要一部電腦使用多重開機的方式來進行安裝，嘿嘿！這樣就 OK 啊！理論上是如此，不過實際上還需要一些小技巧呢！
  • 硬碟重新規劃的多重開機系統：
    如果你想要在你的 Linux 機器上同時安裝 Windows ？可行嗎？當然可行囉！況且目前很多的朋友手邊只有一部電腦，但是又想要同時學習一下 Linux ，呵呵！那麼安裝多重作業系統實在是必須要的！好了！那要如何安裝呢？以我前一陣子幫一個朋友規劃的 Win98, Win2000, Linux 為例，我先將硬碟以 spfdisk 切割成兩個 FAT partition，分別是 2GB 與 3GB ，預計安裝 Win98 與 Win2000 （分別是 C: 與 D: ），然後再以 CD 開機後，分割最後的磁碟成為 / 與 Swap 兩個！好了！如何安裝：

    1. 先以 Spfdisk 分割硬碟：由於 Windows 的 Fdisk 實在太慢了，我蠻喜歡使用 spfdisk 這個全中文的磁碟分割介面的！簡單又方便！將硬碟切割成 C: 2GB, D: 3GB即可！詳細的 Spfdisk 執行範例可以到網路上搜尋一下教學文章吧！

    2. 先安裝 Win98 ：這個簡單吧！用 98 開機片開機之後，直接安裝，並且選擇安裝在 C 槽即可！

    3. 再安裝 Win2000：進入 Win98 之後，將 Win2000 的光碟片放進光碟機中，螢幕會自動的跑出一個視窗，問你要不要升級，選擇『是』，然後會進行一些小動作！在安裝程式問到『升級安裝或全新安裝』的時候，請千萬選擇『全新安裝』這個項目，並且不要升級硬碟磁區！然後在出現一個『問你安裝目錄所在』的問題時，進入選項裡面，選擇『要我自己挑選硬碟分割區』那個項目！然後接下來一直按下『確定』或『是』即可！之後，電腦會重新開機，開機完成之後會進入 Win2000 的安裝畫面，然後在出現『安裝磁區』的時候，請選擇 D 槽，並且選擇『不要更改磁區檔案系統』即可！接下來就會完成一些程序啦！

    4. 最後才安裝 Linux distribution ：是的，最後才安裝 Linux ！安裝的過程就如同上面提的，只不過在硬碟分割的地方會比較不一樣就是了！！

    5. 以 Lilo 或 grub 設定多重開機：是的，您必須選用 lilo 或 grub 來將您的開機程序設定一下，這個動作我們會在後頭再談，或者您可以在瞭解 vi 之後，直接翻到第十九章去瞧一瞧去！

  • 在既存的 Windows 系統中加裝 Linux 系統：
    另外再提供一個之前也曾經安裝過的一個經驗！恩！你可能會覺得奇怪，這個方法跟上一個方法有什麼不同！？呵呵呵呵！最大的不同在於：

    我既存的 Windows 系統中的資料不想丟掉，並且我也沒有新的硬碟來暫存我的系統或者是備份資料！假設原本我的 20 GB 硬碟中分割成 10GB, 10GB 兩槽，但是我還想要安裝 Linux ，且是在『舊系統仍然可以存活』的情況下！那該如何是好？！

    這真的是很有趣的問題！早先在 Windows 系統中， VBird 就犯了一個錯！C 槽給的太大了！基本上，系統檔不需要太大啦！通常我都喜歡 C 槽只給大約 4 GB 左右的空間（甚至更小），這是因為 C 槽是很需要備份的！如果太大的話，備份很麻煩！所以系統重置就會很花時間（因為所有的東西都要重新安裝！我哩咧....！）！因此，我都習慣將 C 槽只給一點點的空間，然後再安裝完並設定完所有的系統之後，馬上以 Ghost 來備份我的系統！而所有的備份資料檔案都擺放在 D 槽！此外，我的 OutLook Express 的書信目錄也都不是擺在 C 槽！呵呵所以我不會很害怕 C 槽掛掉，因為，直接以 Ghost 還原即可囉！系統還原還不需要 30 分鐘呢！

    這裡就發生一個問題啦，假如原本的系統是 10GB, 10GB 的兩槽，不過全部的有用到的資料量只有 10GB 不到！也就是還有空間來安裝 Linux ，但是由於硬碟切割的不好，所以傷腦筋！此外，我的原系統希望留下來，而且也希望可以安裝 Linux ，要怎辦？！我曾經這樣做過：

    • 由於 FAT 的磁區使用，其實只是在磁頭區域（所謂的硬碟第零軌）規劃而已，所以，我就將我的資料先以『磁碟重組』的方式將資料都歸結在一起；

    • 然後以 Spfdisk 將該硬碟的 FAT 表進行分割，注意喔！只是分割 FAT 表，並沒有 format 喔！不過這裡的技術性很高，需要特別注意！因為你是將 FAT 表重新劃分，所以你的資料必須要在同一個磁區內！好了，我就將原本的 10GB 10GB 切割成 4GB、10GB與 6GB 三槽！而且在 spfdisk 的幫助之下，順利的在沒有任何資料遺失的狀況下，將我的硬碟由原先的兩槽分割成三槽囉！那麼一來，我就可以在我原本的 D 槽裡面安裝 Linux 啦！方法有點像底下的圖示：

    很神奇吧！資料還是在原來的地方，不過磁區的定位點改變了，還多出一個磁區！不過，這裡要提醒大家，雖然 VBird 曾經以這個方法成功的將硬碟資料在不毀損的情況下，順利的將硬碟切割完畢，不過，這個方法本身還是具有相當程度的風險，呵呵！因此不是很建議您這樣做！尤其是當你的資料還很重要的時候！切記切記！
課後練習( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • Linux 的目錄配置以『樹狀目錄』來配置，至於磁碟分割區 ( partition ) 則需要與樹狀目錄相配合！請問，在預設的情況下，在安裝的時候系統會要求你一定要分割出來的兩個 Partition 為何？
    答：
      就是根目錄『/』與虛擬記憶體『Swap』
  • 什麼是 IDE 界面，一般而言，普通 PC 允許幾個 IDE 界面與裝置？
    答：
      IDE 為用來傳輸硬碟資料的一個彙流界面；
      共有 IDE1, IDE2 ，分別有 master 與 slave 所以共四個 IDE 裝置支援！
  • IDE2 的 master 之第一個 logical 磁碟中，其裝置代號（檔案名稱）為何？
    答：
      /dev/hdc5
  • 在硬碟分割 (Partition)時，最多有幾個 primary + extended ？
    答：
      Primary + Extended 共四個，其中 Extended 只有一個！ ( 更詳細的硬碟與 MBR 可以參考 這裡 這篇討論 )
  • 若在分割的時候，在 IDE1 的 slave 硬碟中，分割『六個有用』的磁區（具有 filesystem 的），此外，有兩個 primary 的磁區！請問六個磁區的代號？
    答：
      /dev/hdb1(primary)
      /dev/hdb2(primary)
      /dev/hdb3(extended)
      /dev/hda5(logical 底下皆為 logical)
      /dev/hda6
      /dev/hda7
      /dev/hda8
      請注意，5-8 這四個 logical 相加的總和為 3！
  • 一般而言，在 RAM 為 64MB 或 128 MB 的系統中， swap 要開多大？
    答：
      Swap 可以簡單的想成是虛擬記憶體，通常他的建議大小為 RAM 的兩倍，但是實際上還是得視您的主機規格配備與用途而定。約兩倍的 RAM ，亦即為 128 MB 或 256 MB ，可獲得較佳效能！
  • 什麼是 GMT 時間？台北時間差幾個鐘頭？
    答：
      GMT 時間指的是格林威治時間，為標準的時間，而台北時間較 GMT 快了 8 小時！
  • Tap, SCSI 硬碟, RAID, printer 的裝置代號？
    答：
      Tap : /dev/ht0 (IDE), /dev/st0 (SCSI);
      SCSI H.D.: /dev/sd[a-p],
      RAID : /dev/md[0-15];
      printer : /dev/lp[0-2]
  • 如果我的磁碟分割時，設定了四個 Primary 磁區，但是磁碟還有空間，請問我還能不能使用這些空間？
    答：
      不行！因為最多只有四個 Primary 的磁碟分割槽，沒有多的可以進行分割了！且由於沒有 Extended ，所以自然不能再使用 Logical 分割說
  • 我的 Mandrake 9.0 在安裝的時候，進行 X-Window 的測試時都不會成功，要怎麼辦呢？
    答：
      這個是 Mandrake 9.0 的安裝程式的小問題！在安裝的時候是沒有辦法解決的！一定會失敗！不過沒關係，您可以略過這個步驟！這是因為沒有測試也沒有關係，在安裝完畢之後，應該沒有問題的！都可以進入 X-Window System 的！萬一還是沒有辦法登入 X-Window 的話，沒有關係！不要害怕！等到後來『系統管理員篇』的時候，我們再來深入的談一談 X-Window 的設定吧！！ ^_^。而，如果萬一不幸不小心按下了測試，要怎麼辦呢？螢幕已經一片漆黑了！＠_@，沒關係，此時可以按下 [Ctrl] + [Alt] + [F1] 就可以回到原先的畫面啦！
  • 通常在安裝 Linux 的時候，最重要的就是磁碟分割了！請問：磁碟分割通常要分成幾個步驟？
    答：
      1. 進行磁碟分割 partition ；
      2. 進行格式化 format ；
  • 磁碟分割之後會有所謂的 Primary, Extended 與 Logical 的磁碟分割槽，請問何者為可使用的 Partition ？
    答：
      只有 Primary 與 Logical 為可用， Extended 為不可直接使用的 Partition ，還需要再次的分割成為 Logical 之後，才可以繼續使用！而最大可分割出來的 Partition 應該有 64 個才對！

2003/02/05：首次完成編輯！
2003/ 02/06 以來統計人數


開機、關機、線上求助與指令下達方式
最近更新日期：2003/02/06
第一次登入系統與離開系統
圖形模式與文字模式的切換方式
指令下達方式與基礎指令練習
線上求助：man, info
正確的關機方式
開機過程的問題排解
本章習題練習
第一次登入系統與離開系統
登入系統有這麼難嗎？呵呵！並不難，不過，雖然說是這樣說，然而很多人第一次登入 Linux 的感覺都是『接下來我要幹啥？』如果是以圖形介面登入的話，或許還有很多好玩的事物，但是，要是以文字介面登入的話，面對著一片黑壓壓的螢幕，還真不曉得要幹嘛呢！嗯！為了讓大家更瞭解如何正確的使用 Linux ，正確的登入與離開系統還是需要說明的！
  • 登入系統：
    啊開機就開機呀！怎麼還有所謂的登入與離開呀！？呵呵！開什麼玩笑，在 Linux 裡面，正確的開關機可是很重要的！因為，不正常的關機可能會導致整個系統的磁區錯亂，造成資料的毀損呢！這也是為什麼通常我們的 Linux 主機都會加掛一個不斷電系統囉！
    在順利的安裝完成之後，就是要快樂的進入 Linux 的世界啦，這個時候，按下電源，如果你是以文字型的 Grub 登入的話，那麼你的螢幕可能會出現下列的字樣 ( 註：不同的 Linux distribution 的登入畫面都不相同的啦！這無所謂，只是開機的畫面而已！ ) ：
    這個就是 Grub 開機管理程式啦！由上面我們可以發現，總共目前有三個開機的選項，分別是 linux, failsafe 與 floppy 三個！當然啦，我們要使用的是 linux ，則移動游標指到 linux 上面去，按下 Enter 即可！另外，仔細看到右下方有個秒數對不對，呵呵！只要您在預設的秒數之內沒有按下任何按鍵，那麼 grub 會自動的以系統預設的開機檔案來開機囉！還有還有， grub 還有很多的功能，關於這個，我們留待後面的『系統管理員篇』再來詳細的介紹這個玩意兒∼此外，如果是以另一個多重開機軟體 ( loader ) ，也就是 LILO 來設定你的 MBR 時，那麼預設是不會出現選單的！只會有出現『 boot： 』的畫面而已，如果按下『 Enter 』就會以預設的開機檔來開機，如果按下『Tab』按鍵，就會出現其他可能的開機檔啦！這部份我們同樣在管理員篇再介紹！
    選擇了 Linux 之後，會開始跑一些硬體搜尋的資料，然後是一些服務的開啟動做，就像下圖一般：
    呵呵！這就是在正確的開機啦！OK！如果順利的開機成功，那麼就會進入到底下的畫面來啦！

    Mandrake Linux release 9.0 (dolphin) for i586
    Kernel 2.4.19-16mdk on an i686 / tty1
    test login: root
    Password:
    [root@test root]#

    上面的畫面顯示的內容是：

    • 第一行顯示的是您的 Linux distribution 與版本，還有安裝的軟體等級( i586 )，
    • 第二行顯示的是您的 Linux 核心版本，以及您的硬體等級 ( i686 )，那麼什麼是 tty1 呢？這個等一下告訴你！
    • 第三行顯是您的主機名稱 (Hostname) ，至於 login 後面則是需要你輸入登入者的帳號，由於我們剛剛安裝完畢，直接以 root 來登入即可！注意，那個 root 就是『系統管理員』，也就是『超級使用者, Super User』，在 Linux 主機之內，這個帳號代表的是『無窮的權力！』，任何事都可以進行的，因此，使用這個帳號要『粉小心！』
    • 第四行則在第三行輸入後才會出現，要你輸入密碼囉！請注意，在輸入密碼的時候，螢幕上面『不會顯示任何的字樣！』，所以不要以為你的鍵盤壞掉去！
    • 第五行則是正確登入之後才顯示的訊息，最左邊的 root 顯示的是『目前使用者的帳號』，而 @ 之後接的 test 則是『主機名稱』，至於最右邊的 root 則指的是『目前所在的目錄』，那麼那個 # 則是我們常常講的『提示字元』啦！

    好了這樣就是登入主機了！很快樂吧！耶∼

      註：關於登入的身份：為了安全的考量上，通常我們都希望普通時候不要以 root 的身份登入 Linux 系統中。這裡有必要說明一下 root 身份與一般身份的異同。其實在 Linux 上面實際上記錄使用者身份的是 UID 與 GID ，分別是使用者的號碼與群組的號碼。舉例來說，系統管理員 ( root ) 的號碼即是 0 ，所以你只要進入 /etc/passwd 這個檔案中，即可看到 root 有兩個號碼都是 0 ，基本上，你只要建立一個帳號，並且將他的 UID 設定為 0 的話，那麼他就具有 root 的身份了！而一般使用者的號碼通常在 500 以後，至於 1~499 之間，比較多會留給系統來使用！至於為什麼？這僅是一個習慣而已！好了！我們都知道 root 具有無窮大的權力，例如他可以殺掉任何一個檔案或者是目錄！因此，若您以 root 的身份登入 Linux 系統，還不小心殺掉了任何一個檔案，是可能會造成非常大的問題。除此之外，使用 root 的身份登入系統最大的問題其實是『不安全』。容易被有心人士監聽你對主機下達的命令，使得密碼或者是資料的外流！因此，稱職的網管人員通常具有兩個帳號，平時以自己一般的帳號使用 Linux 主機，除非系統的主要功能需要修改設定時，才以 root 的身份來登入的！所以我也建議您建立一個普通的帳號來供自己使用喔！尤其是遠端登入時（如 telnet 與 SSH 伺服器），最好不要以 root 來登入喔！

  • 離開系統：
    離開系統就很簡單啦！直接下達：

    [root@test root]# exit

    就能夠離開系統，但是請注意：『離開系統並不是關機！』基本上， Linux 本身已經有相當多的工作在進行，您的登入也僅是其中的一個『工作』而已，所以當您離開時，那麼該工作就停止了，不過其他的工作但此時 Linux 其他的工作是還是進行的！在後面我們再來提如何正確的關機，這裡先建立起這個概念即可！
圖形模式與文字模式的切換方式
    咦！萬一我在安裝的時候選擇的是圖形模式呢？怎麼辦？我要如何跑到文字介面下面工作吶！？呵呵！沒有關係， Linux 預設提供了六個文字介面終端機來讓您登入呢！您可以直接按下：『 Ctrl 』+ 『 Alt』 加上 『F1』 ~ 『F6』 功能鍵 來變換不同的文字介面登入點，這也是剛剛我們上面提到的那個 tty1 的咚咚啦！當您以『 Ctrl 』+ 『 Alt』 + 『F1』登入主機時，他所在的位置就是 tty1 這個終端機，而 F2 就是 tty2 這個終端機囉！那怎麼回到美美的桌面去？很簡單呀！按下『 Ctrl 』+ 『 Alt』 + 『F7』就回到桌面囉！ ( 註：某些 Linux distribution 會使用到 F8 這個終端介面做為他的桌面終端機，例如 OpenLinux Server 3.1.1 ，所以這部份還不是很統一！無論如何，嘗試按按 F7 or F8 就可以知道囉！ )
  • Ctrl + Alt + [F1] ~ [F6] ：文字介面登入 tty1 ~ tty6 終端機；
  • Ctrl + Alt + [F7] ：圖形介面桌面。
    這也就是說，如果您是以文字介面登入的話，那麼您可以有 tty1 ~ tty6 這六個文字介面的終端機玩，但是圖形介面 則沒有任何東西。至於以圖形介面登入的話，就可以使用圖形介面跟文字介面囉！當然，如果您在文字介面卻想要進入圖形介面時，可以直接下達：

    [root@test root]# startx

    就可以啟動圖形介面啦！當然，前提是您的 XFree86 需要設定 OK 才行。那麼如果您要修訂一下預設的開機進入的介面呢？例如由文字介面變到圖形介面，哈哈！修改一下 /etc/inittab 這個檔案，但是我們還沒有提到 vi 文書編輯器呀！所以這部份得到系統管理員篇幅的時候再說明！別擔心，再仔細的看下去吧！
指令下達方式與基礎指令練習
好了，既然我們是要以文字介面來介紹 Linux ，那麼自然就需要先談一談指令下達的方式囉！一般而言，指令下達的方式為：

[root@test root]# command [-options] parameter1 parameter2 ...
指令 選項 參數(1) 參數(2)

說明：
0. 上面的指令與參數之下達中，字母的大小寫代表意義不同：
1. command 為指令的名稱，例如變換路徑的指令為 cd 等等；
2. 中刮號[]並不存在於實際的指令中，而加入參數設定時，通常為 - 號，
有時候完整參數名稱會輸入 -- 符號；
3. parameter1 parameter2.. 為依附在 option 後面的參數，
或者是 command 的參數；
4. command, -options, parameter1.. 這幾個咚咚中間以空格來區分，
不論空幾格 shell 都視為一格；
5. 指令太長的時候，可以使用 \ 符號來跳脫 [Enter] 符號，
使指令連續到下一行。

實例：
以 ls 列出 /root 這個目錄中的隱藏檔與相關的屬性參數；

[root@test /root]# ls -al /root
[root@test /root]# ls -al /root

上面這兩個指令的下達方式是一模一樣的執行結果喔！為什麼？請參考上面的說明吧！關於更詳細的文字模式使用方式，我們會在『Shell 與 Shell Scripts』篇幅中再來強調喔！此外，請特別留意，在 Linux 的環境中，『大小寫字母是不一樣的東西！』也就是說，在 Linux 底下， VBird 與 vbird 這兩個檔案是『完全不一樣的』檔案呢！所以，您在下達指令的時候千萬要注意到您的指令是大寫還是小寫。例如當您輸入底下這個指令的時候，看看有什麼現象：

[root@test /root]# date
[root@test /root]# Date
[root@test /root]# DATE

很好玩吧！不一樣的大小寫顯示的結果會有錯誤訊息發生呢！因此，請千萬記得這個狀態呦！好囉，底下我們來練習一下一些簡單的指令，好讓您可以瞭解指令下達方式的模式：
  • 顯示日期的指令： date
  • 顯示日曆的指令： cal
  • 簡單好用的計算機： bc
  • 顯示日期的指令： date
    如果在文字介面上面，想要知道目前的時間，那麼就直接在指令列模式輸入 date 即可顯示：

    [root@test root]# date
    Wed Oct 16 15:19:59 CST 2002

    上面是顯示：星期三, 十月十六日, 15:19 分， 59 秒，在 2002 年的 CST 時區！請趕快動手做做看呦！好了，那麼如果我想要以 2002/10/16 顯示目前的時間呢？那麼就使用 date 的相關功能吧！

    [root@test root]# date +%Y/%m/%d
    2002/10/16
    [root@test root]# date +%H:%M
    15:32

    那個『 +%Y%m%d 』就是 date 的一些參數功能啦！很好玩吧！
  • 顯示日曆的指令： cal
    那如果我想要列出目前這個月份的月曆呢？呵呵！直接給他下達 cal 即可！

    [root@test root]# cal
    October 2002
    Su Mo Tu We Th Fr Sa
    1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31

    基本上， cal (calendar) 這個指令可以做的事情還很多，你可以顯示整年的月曆情況：

    [root@test root]# cal 2002
    2002

    January February March
    Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
    1 2 3 4 5 1 2 1 2
    6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
    13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
    20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
    27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
    31
    April May June
    Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
    1 2 3 4 5 6 1 2 3 4 1
    7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
    14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
    21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
    28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
    30
    July August September
    Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
    1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7
    7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14
    14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21
    21 22 23 24 25 26 27 18 19 20 21 22 23 24 22 23 24 25 26 27 28
    28 29 30 31 25 26 27 28 29 30 31 29 30

    October November December
    Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
    1 2 3 4 5 1 2 1 2 3 4 5 6 7
    6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14
    13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
    20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
    27 28 29 30 31 24 25 26 27 28 29 30 29 30 31

    也就是說，基本上， cal 接的語法為：

    [root@test root]# cal [month] [year]

    所以，我想要知道 2003 年 2 月的月曆，可以直接下達：

    [root@test root]# cal 2 2003
    February 2003
    Su Mo Tu We Th Fr Sa
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28

    所以，未來您可以很輕易的就以 cal 來取得日曆上面的日期囉！簡直就是萬年歷啦！ ^_^
  • 簡單好用的計算機： bc
    如果我想要使用簡單的計算器呢？很容易呀！就使用 bc 即可！在輸入 bc 之後，顯示出版本資訊之後，就進入到等待指示的階段，如下所示：

    [root@test root]# bc
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'.
    ==> 游標在這裡等待您的輸入

    好了，來基本的操作一下，在此之前，必須要先告知幾個使用的運算子：

      + 加法
      - 減法
      * 乘法
      / 除法
      ^ 指數
      % 餘數

    [root@test root]# bc
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'.
    1+2+3+4
    10
    7-8+3
    2
    10*52
    520
    10%3
    1
    10^2
    100
    10/100
    0
    quit ==> 離開 bc 這個計算器

    在上表當中，黃色的字表示輸入的東西，而在每個黑體的字底下就是輸出的結果。咦！每個計算都還算正確，怎麼 10/100 會變成 0 呢？這是因為 bc 預設僅輸出整數，如果要輸出小數點下位數，那麼就必須要執行 scale=number ，那個 number 就是小數點位數，例如：

    [root@test root]# bc
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'.
    scale=3
    1/3
    .333
    340/2349
    .144
    quit

    好了！就是這樣子啦！簡單的很吧！以後你可以輕輕鬆鬆的進行加減乘除啦！
  • 一些按鍵的說明：
    在 Linux 底下有幾個常用的按鍵，這裡要給他說明一下，以方便你未來在文字介面操作的情況下，可以直接按下這些按鍵來幫你處理事務喔！

    • Ctrl + c ： 在 Linux 底下，如果您輸入了錯誤的指令或參數，有的時候這個指令或程式會在系統底下『跑不停』這個時候怎麼辦？別擔心，如果您想讓當前的程式『停掉』的話，可以輸入：『Ctrl』＋『c』，這個就是中斷目前程式的按鍵啦！

    • q ： 有很多程式在跑的時候(例如 man 這個指令或 more 這個指令)，如果您想跳出來，就按下 q 即可！這個按鈕也是很多指令常定義的退出鈕。

    • [Tab] ：會不會覺得打字很疲勞啊！沒關係，在 Linux 的預設文字介面 ( 我們稱為 BASH Shell ) 當中，有個很棒的功能，叫做是『命令與檔案補全』的功能！那就是鍵盤左邊的[Tab]這個按鍵啦！他有什麼好處呢？例如剛剛我們要執行 cal 這個指令對吧，這個時候，你只要輸入 ca[tab][tab] ，也就是輸入 ca 之後，再按兩次 [tab] 按鍵，您會發現什麼事呢？啊！所以以 ca 為開頭的指令都被顯示出來啦！很棒吧！另外，如果你輸入『 ls -al .bash[tab][tab]』會發生什麼事呢？哈哈！在該目錄下面所有以 .bash 的檔案名稱都會被顯示出來！所以囉，你就會知道，[tab] 按鍵是『很棒的功能！』在文字介面底下，要多按 [tab] 按鍵，可以避免打錯字或下錯指令喔！

    總之，在 Linux 底下，文字介面的功能是很強悍的！要多多的學習他，而要學習他的基礎要訣就是......多使用、多熟悉啦！
  • 錯誤訊息的查看
    萬一我下達了錯誤的指令怎麼辦？不要緊呀！您可以藉由螢幕上面顯示的錯誤訊息來瞭解你的問題點，那就很容易知道如何改善這個錯誤訊息囉！舉個例子來說，假如我輸入了 DATE 這個錯誤的訊息了：

    [root@test root]# DATE
    bash: DATE: command not found

    上面那個 bash: 表示的是我們的 Shell 的名稱，那麼什麼是 Shell 呢？還記不記得我們在 什麼是 Linux 的時候提到的『使用者、使用者介面、核心、硬體』的架構呢？呵呵！那個 shell 就是使用者介面囉！在 Linux 底下預設的使用者介面就是 bash shell 囉！
    好了，那麼上面的例子說明了， bash 有錯誤，什麼錯誤呢？ bash告訴你：

      DATE: command not found ==>指令找不到啦！

    所以說，系統上面可能並沒有 DATE 這個指令囉！就是這麼簡單！那如果是底下的樣子呢？

    [root@test root]# cal 13 2003
    cal: illegal month value: use 1-12

    呵呵！這下子換到 cal 警告你啦， illegal month value: use 1-12，看不懂英文？沒關係，又不是考試，趕快拿本英文字典在旁邊對照著看呀！意思是說『不合法的月份值，應該使用 1-12 之間的數字！』所以各位看倌您看看，跟著螢幕的錯誤訊息瞧，很容易知道問題的錯誤是什麼吧！因此，以後如果出現了問題，螢幕上的訊息真的是很重要的呢！不要忽略了他呦！
先介紹這幾個指令讓您玩一玩先，更詳細的指令操作方法我們會在第三篇的時候再進行介紹！好了，萬一我在操作 date 這個指令的時候，手邊又沒有這本書，我要怎麼知道要如何加參數，好讓輸出的結果符合我想要的輸出格式呢？嘿嘿！到下一節 VBird 告訴你怎麼辦吧！
線上求助：man, info
哇！ linux 還有線上求助系統啊！呵呵！這是『一定要的啦！』因為 Linux 是由所謂的『虛擬團隊』開發出來的，所以雖然他的功能很多，但是指令也是有點雜亂的！如果沒有線上說明文件的話，那麼肯定會讓大家無所適從的！因此，不論任何人寫出了一個很好用的指令後，他也會同是附上這個指令的說明文件喔！你可以很輕鬆的就查詢到這個指令的使用方法呢！很不賴吧！底下說一下幾個在 Linux 上面很常用的求助指令喔！
  • 最廣泛使用的線上查詢： man
  • 用在 Linux 上面的線上查詢： info
  • Linux 系統中的說明文件彙集目錄： /usr/share/doc
  • man
    嗄？不知道怎麼使用 date 這個指令？嘿嘿嘿！不要擔心，我們 Linux 上面的線上求助系統已經都幫您想好要怎麼辦了，所以你只要使用簡單的方法去尋找一下說明的內容，馬上就清清楚楚的知道該指令的用法了！怎麼看呢？就是找男人 ( man ) 呀！？喔！不是啦！ man 是 manual (操作說明) 的簡寫啦！只要下達：『 man date 』馬上就會有清楚的說明出現在你面前：

    [root@test root]# man date
    DATE(1) FSF DATE(1)

    NAME
    date - print or set the system date and time

    SYNOPSIS
    date [OPTION]... [+FORMAT]
    date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

    DESCRIPTION
    Display the current time in the given FORMAT, or set the system date.

    -d, --date=STRING
    display time described by STRING, not `now'

    -f, --file=DATEFILE
    like --date once for each line of DATEFILE

    ……………………………………（中間省略）

    ENVIRONMENT
    TZ Specifies the timezone, unless overridden by command line parameters. If
    neither is specified, the setting from /etc/localtime is used.

    AUTHOR
    Written by David MacKenzie.

    REPORTING BUGS
    Report bugs to <bug-sh-utils@gnu.org>.

    COPYRIGHT
    Copyright ?2000 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO war?
    ranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    SEE ALSO
    The full documentation for date is maintained as a Texinfo manual. If the info and
    date programs are properly installed at your site, the command

    info date

    should give you access to the complete manual.

    GNU sh-utils 2.0.11 October 2000 DATE(1)
    (END)

    看！馬上就知道一大堆的用法了！出現的這個螢幕畫面，我們稱呼他為 man page ，您可以在裡頭查詢他的用法與相關的參數說明，如果要向下翻頁的話，可以按下鍵盤的空白鍵 ，也可以使用 [Page Up] 與 [Page Down] 來翻頁呢！同時，如果您知道某些關鍵字的話，那麼可以在任何時候輸入『 /word 』，來主動搜尋關鍵字！例如在上面的搜尋當中，我輸入了 /date 會變成怎樣？

    此外，看到了最後面的幾個資訊了嗎？包括了這個程式的『環境』、『作者』及相關資訊等等，最重要的是那個『See Also』的內容囉，該內容告訴我們，還有其他相關的程式可以查詢！呵呵！查了一個，可以知道更多個！棒！那麼離開 man page 就直接輸入 『q』 這個字母即可離開！整理一下，在 man page 當中可以按的鍵有：

    • 空白鍵： 往下翻一頁；
    • page up： 往上翻一頁；
    • page down： 往下翻一頁；
    • home： 回到最前面；
    • end： 去到最終頁；
    • /word： 搜尋 word 這個檔案。

    那麼這些 man page 放在哪裡呢？不同的 distribution 通常可能有點差異性，不過，通常是放在 /usr/share/man 裡頭，然而，我們可以透過修改他的 man page 搜尋路徑來改善這個目錄的問題！修改 /etc/man.config ( 有的版本為 man.conf ) 即可囉！至於更多的關於 man 的訊息您可以使用『 man man 』來查詢呦！關於更詳細的設定，我們會在 Shell 的章節當中繼續的說明喔！
  • info
    除了 man 之外，在 Linux 裡面亦提供另外一種查詢的方式，稱為 info ，使用的方法跟 man 差不多，

    [root@test root]# info command

    使用 info 後面接您要查詢的指令名稱即可！這個 info 的功能比 man 還要更強大呢！在這個 info page 裡面，你可以輸入 p 及 n 往前及往後翻頁，如果看到『 * text :』的項目時，將游標移到該項目上面，按下『Enter』還可以進入次頁面的說明畫面中！很厲害喔！不過，這個 info 目前只有 Linux 底下有，其他 Unix-Like 就沒有啦！除非你有安裝....無論如何，這個部分我們會在『系統管理員篇』裡面再加以介紹啦！
  • /usr/share/doc
    剛剛上面說，一般而言，指令或者軟體製作者，都會將自己的指令或者是軟體的說明製作成『線上說明文件』！但是，畢竟不是每個咚咚都需要做成線上說明文件的，還有相當多的說明需要額外的文件！此時，這個所謂的 How-To ( 如何做的意思 ) 就很重要啦！還有，某些軟體不只告訴你『如何做』還會有一些相關的原理會說明，那麼這些說明文件要擺在哪裡呢？哈哈！就是擺在這個目錄 /usr/share/doc 啦！所以說，其實，您只要到這個目錄底下，就會發現好多好多的說明文件檔啦！還不需要到網路上面找資料呢！厲害吧！ ^_^
記住喔！在文字介面下，有任何你不知道的玩意兒，但是你想要瞭解他，請趕快使用 man 或者是 info 來查詢這個玩意兒！此外，如果你想要架設一些其他的服務時，請趕快到 /usr/share/doc 底下查一查有沒有該服務的說明檔喔！另外，再次的強調，因為 Linux 畢竟是外國人發明的，所以中文文件確實是比較少的！但是不要害怕，拿本英文字典在身邊吧！隨時查閱！不要害怕英文喔！
正確的關機方式
OK！大概知道開機的方法，也知道基本的指令操作，而且還已經知道線上查詢了，好累呦！想去休息呢！那麼如何關機呢？我想，很多朋友在 DOS 的年代已經有在玩電腦了！在當時我們關掉 DOS 的系統時，常常是直接關掉電源開關，而 Windows 在你不爽的時候，按著電源開關四秒也可以關機！但是在 Linux 則相當的不建議這麼做！ Why？在 Windows 系統中，由於是單人假多工的情況，所以即使你的電腦關機，對於別人應該不會有影響才對！不過呢，在 Linux 底下，由於每個程序（或者說是服務）都是在在背景下執行的，因此，在你看不到的螢幕背後其實可能有相當多人同時在你的主機上面工作，例如瀏覽網頁啦、傳送信件啦以 FTP 傳送檔案啦等等的，如果你直接按下電源開關來關機時，則其他人的資料可能就此中斷！那可就傷腦筋了！此外，最大的問題是，若不正常關機，則可能造成檔案系統的毀損（因為來不及將資料回寫到檔案中，所以有些服務的檔案會有問題！）。正常情況下，要關機時需要注意底下幾件事：
  • 觀察系統的使用狀態：如果要看目前有誰在線上，可以下達 who 這個指令，而如果要看網路的連線狀態，可以下達 netstat -a 這個指令，而要看背景執行的程序可以執行 ps -aux 這個指令。使用這些指令可以讓你稍微瞭解主機目前的使用狀態！當然囉，就可以讓你判斷是否可以關機了（這些指令在後面 Linux 常用指令中會提及喔！）
  • 通知線上使用者關機的時刻：要關機前總得給線上的使用者一些時間來結束他們的工作，所以，這個時候你可以使用 shutdown 的特別指令來達到此一功能。
  • 正確的關機指令使用：例如 shutdown 與 reboot 兩個指令！
所以底下我們就來談一談關於這個關機的正確指令用法囉！
  • 將資料同步寫入硬碟中的指令： sync
  • 最正確的關機指令： shutdown
  • 重新開機： reboot
  • 關機囉： halt
  • sync
    在 Linux 系統中，為了加快資料的讀取速度，所以，預設的情況中，某些資料將不會直接被寫入硬碟，而是先暫存在記憶體當中，如此一來，如果一個資料被你重複的改寫，那麼由於他尚未被寫入硬碟中，因此可以直接由記憶體當中讀取出來，在速度上一定是快上相當多的！不過，如此一來也造成些許的困擾，那就是，萬一當你重新開機，或者是關機，或者是不正常的段電的情況下，由於資料尚未被寫入硬碟當中，哇！所以就會造成資料的更新不正常啦！那要怎麼辦呢？這個時候就需要 sync 這個指令來進行資料的寫入動作啦！直接在文字介面下輸入 sync ，那麼在記憶體中尚未被更新的資料，就會被寫入硬碟中！所以，這個指令在系統關機或重新開機之前，很重要喔！最好多執行幾次！( 註：這個指令也只有 root 可以執行喔！ )

    [root@test root]# sync

  • shutdown
    好了，由於關機有種種的限制因子在，所以只有 root 有權力關機而已喔！嗯！那麼就來關機試試看吧！我們較常使用的是 shutdown 這個指令，而這個指令會通知系統內的各個行程( processes )，並且將通知系統中的 run-level 內的一些服務來關閉之( run-level 會在後面告知喔 )。shutdown 可以達成：

    • 可以自由選擇關機模式：是要關機、重新開機或進入單人操成模式均可；
    • 可以設定關機時間: 可以設定成現在立刻關機, 也可以設定某一個特定的時間才關機。
    • 可以自訂關機訊息：在關機之前，可以將自己設定的訊息傳送給線上 user 。
    • 可以僅發出警告信：有時有可能你要進行一些測試，而不想讓其他的使用者干擾，或者是明白的告訴使用者某段時間要注意一下！這個時候可以使用 shutdown 來嚇一嚇使用者，但卻不是真的要關機啦！
    • 可以選擇是否要 fsck 檢查檔案系統 。

    那麼 shutdown 的語法是如何呢？聰明的讀者大概已經開始找『男人』了！沒錯，隨時隨地的 man 一下，是很不錯的舉動！好了，簡單的語法規則為：

    [root@test root]# /sbin/shutdown [-t 秒 ] [-arkhncfF] 時間 ] [ 警告訊息]
    實例：
    [root@test root]# /sbin/shutdown -h 10 'This server will shutdown after 10 mins'
    告訴大家，這部機器會在十分鐘後關機！並且會顯示在目前登入者的螢幕前方！
    至於參數有哪些呢？以下介紹幾個吧！

    -t sec ： -t 後面加秒數，亦即『過幾秒後關機』的意思
    -k ： 不要真的關機，只是發送警告訊息出去！
    -r ： 在將系統的服務停掉之後就重新開機
    -h ： 將系統的服務停掉後，立即關機。
    -n ： 不經過 init 程序，直接以 shutdown 的功能來關機
    -f ： 關機並開機之後，強制略過 fsck 的磁碟檢查
    -F ： 系統重新開機之後，強制進行 fsck 的磁碟檢查
    -c ： 取消已經在進行的 shutdown 指令內容。

    此外，需要注意的是，時間參數請務必加入，否則會自動跳到 run-level 1 （就是單人維護的登入情況），這樣就傷腦筋了！底下提供幾個例子吧！

    shutdown -h now 立刻關機，其中 now 相當於時間為 0 的狀態
    shutdown -h 20:25 系統在今天的 20:25 分會關機
    shutdown -h +10 系統再過十分鐘後自動關機
    shutdown -r now 系統立刻重新開機
    shutdown -r +30 'The system will reboot'
    再過三十分鐘系統會重新開機，並顯示後面的訊息。
    shutdown -k 'This system will reboot'
    僅發出警告信件的參數！系統並不會關機啦！嚇唬人！

  • reboot; halt; poweroff
    這三個指令差不多，用途上有些不同而已！那個 reboot 其實與 shutdown -r now 幾乎相同！不過，建議在關機之前還是將資料回填的指令下達一次再說：

    [root@test root]# sync; sync; sync; reboot

    就可以啦！通常我如果忘記 shutdown 的指令，或者是怕麻煩，都是使用上面說的這一個指令來重新開機，並且在聽到『逼』的一聲時，立刻將 Linux 主機的總電源關閉！如此亦可達到關機的目的呀！此外， halt 與 poweroff 也具有相同的功能喔！不要擔心，使用 man 去查詢一下下吧！ ^_^
開機過程遇到的問題解決
磁區錯亂：
在開機的過程中最容易遇到的問題就是硬碟可能有壞軌或磁區錯亂（資料損毀）的情況，這種情況雖然不容易發生在穩定的 Linux 系統下，不過由於不當的開關機還是可能會造成的，原因可能有：
  • 最可能發生的原因是因為斷電或不正常關機所導致的硬碟磁軌錯亂， VBird 就曾經發生過多次因為跳電，家裡的主機又沒有安裝不斷電系統，結果就導致硬碟磁軌錯亂了！
  • 硬碟使用率過高也是一個可能的原因，例如你開放了一個 FTP 服務，裡面有些資料很有用，所以一堆人搶著下載，如果你又不是使用較穩定的 SCSI 介面硬碟，僅使用 IDE 介面的硬碟，雖然機率真的不高，但還是有可能造成磁軌錯亂的（這個問題其實在 Windows 系統下更容易發生哩！）。
解決的方法其實很簡單，也可能很困難，如果您的根目錄『/』並沒有損毀，那就很容易解決，如果根目錄已經損毀了，那就比較麻煩！
  • 如果根目錄沒有損毀：假設你發生錯誤的磁碟區塊是在 /dev/hda7 這一塊，那麼在開機的時候，螢幕應該會告訴你： press root pass word or ctrl+D : 這時候請輸入 root 的密碼登入系統：

    • 在游標處輸入 root 密碼登入系統，進行單人單機的維護工作；
    • 輸入 fsck /dev/hda7 （fsck 為指令， /dev/hda7 為錯誤的磁碟區塊，請依你的情況下達參數），這時螢幕會顯示開始修理硬碟的訊息，如果有發現任何的錯誤時，螢幕會顯示：clear [Y/N]？的詢問訊息，就直接輸入 Y 吧！
    • 修理完成之後，以 reboot 重新開機囉！
  • 如果根目錄損毀了：一般初學者喜歡將自己的硬碟只劃分為一個大區塊，亦即只有根目錄，那硬碟區塊錯亂一定是根目錄的問題囉！這時你可以將硬碟拔掉，接到另一台 Linx 系統的電腦上，並且不要掛載（mount）該硬碟，然後以 root 的身份執行 fsck /dev/hdb1 （/dev/hdb1 指的是你的硬碟裝置名稱，你要依你的實際狀況來設定），這樣就 OK 囉！
  • 如果硬碟整個壞掉：如果硬碟實在壞的離譜時，那就換一棵吧，如果不願意換硬碟，那就重灌 Linux 吧，並且在重灌的時候，於 Format 項目中，選取『error check』項目，只是如此一來，format 會很慢，並且，何時會再壞掉也不確定！最好還是換一棵吧！
預防的方法：
  • 妥善保養硬碟：例如：主機通電之後不要搬動，避免移動或震動硬碟；盡量降低硬碟的溫度，可以加裝風扇來冷卻硬碟；或者可以換裝 SCSI 硬碟。
  • 劃分不同的磁碟區塊：如果諸位看官還記得的話，應該知道 Redhat 安裝的方法可以分為四五種，有 upgrad, Server, Workstation 等等的，這些咚咚不一樣的地方就在於磁碟劃分的不同啦！通常我們會建議劃分下列的磁碟區塊：
      /
      /boot
      /usr
      /home
      /var
    這樣劃分有些好處，例如 /var 是系統預設的一些資料暫存或者是 cache 資料的儲存目錄，像 e-mail 就含在這裡面。如果還有使用 proxy 時，因為常常存取，所以有可能會造成磁碟損壞，而當這部份的磁碟損壞時，由於其他的地方是沒問題的，因此資料得以保存，而且在處理時也比較容易！

忘記 root 密碼：
常常有些朋友在設定好了 Linux 之後，結果 root 密碼給他忘記去！要重新安裝嗎？！不需要的，你只要以單人維護模式登入即可更改你的 root 密碼喔！不過，目前的開機選單主要有 LILO 與 Grub 兩種，這兩種模式並不相同，有必要來說明一下：
  • LILO：
    您只要在出現 Lilo 選單的時候，輸入：（請注意，如果是 Red Hat 7.0 以後的版本，會出現圖形介面的 lilo ，這個時候請按下 [Ctrl] + x 即可進入純文字介面的 lilo 囉！）

      boot: linux -s

    以進入單人單機維護模式（即為 run-level 1 ），然後再輸入 passwd 這個指令，就可以直接更改 root 的密碼囉！同時，如果圖形介面無法登入的時候，也可以使用此一方法來進入單人單機的維護工作，然後再去修改 /etc/inittab 改變一下登入的預設模式，如此一來就可以在下次開機的時候以文字模式登入囉！同時請注意！如果您在設定啟動的名稱的時候，已經改變了啟動的名稱，例如我都喜歡在名稱之後加上核心碼，例如：Red-Hat-2.4.7，這個時候我就必須在 boot: 底下輸入：

      boot: Red-Hat-2.4.7 -s 或者是：
      boot: Red-Hat-2.4.7 single

    另外，您可能會遇到 Lilo 的開機問題，這個時候建議您先參考一下底下這一篇討論，未來還會再次提到 lilo 的設定問題！
    關於 Lilo ！
  • Grub：
    grub 做為開機檔案，要進入單人維護模式就比較麻煩一些！請回到 上面的圖示 中查看一下，關於 grub 的圖示，看到該圖示的底下有些說明對不對！？對啦！這個時候，請按下『 e 』進入編輯畫面，這個時候，你的畫面會有點像底下的樣子：

      root (hd0,0)
      kernel /boot/vmlinuz-2.4.19 root=/dev/hda1

    此時，請將游標移動到 kernel 那一行，再按一次『 e 』進入 kernel 該行的編輯畫面中，然後在出現的畫面當中，最後方輸入 single ：

      kernel /boot/vmlinuz-2.4.19 root=/dev/hda1 single

    再按下『 Enter 』確定之後，按下 b 就可以 boot 看看啦！
關於 LILO 與 grub 我們會在後面繼續加以介紹，這裡先有概念即可！不過，並非所有版本的 Linux 皆可使用此一方法！例如 OpenLinux 就無法進入單人維護模式，因為他的單人維護模式『仍然需要輸入 root 的密碼！』哇！真是可怕吶！這個時候怎麼辦？呵呵！別擔心，現在你還不會，看完了後面幾個章節之後，您就一定會啦！ ^_^
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 請問如果我以文字模式登入 Linux 主機時，我有幾個終端機介面可以使用？如何切換各個不同的終端機介面？
    答：
      共有六個， tty1 ~ tty6 ，切換的方式為 Crtl + Alt + [F1]~[F6]，其中， [F7] 為圖形介面的使用。
  • 在 Linux 系統中， VBird 與 vbird 是否為相同的檔案？
    答：
      兩者為不同的檔案，因為大小寫不一樣！
  • 我想要知道 date 如何使用，應該如何查詢？
    答：
      最簡單的方式就是使用 man date 或 info date 來查看，如果該套件有完整說明的話，那麼應該也可以在 /usr/share/doc 裡面找到說明檔！
  • 我想要在今天的 1:30 讓系統自己關機，要怎麼做？
    答：
      shutdown –h 1:30
  • man page 的設定檔在哪裡？
    答：
      /etc/man.config 有的 distribution 會定義為 /etc/man.conf
  • 我想要知道 2003 年 5 月 2 日是星期幾？該怎麼做？
    答：
      最簡單的方式直接使用 cal 5 2003 即可找出 2003 年 5 月份的月曆。
  • 使用 man date 然後找出顯示目前的日期與時間的參數，成為類似：2002/10/16-20:03
    答：
      date +%Y/%m/%d-%H:%M
  • 若以 X-Window 為預設的登入方式，那請問如何進入 Virtual console 呢？
    答：
      可以按下 [Ctrl] + [Alt] + [F1] ~ [F6] 進入 Virtual console ( 共六個 )；
      而按下 [Ctrl] + [Alt] + [F8] 或 [F7] 可回到 X-Window 的 desktop 中！
2002/07/16：第一次完成吧？
2003/02/06：重新編排與加入 FAQ
2002/ 02/14以來統計人數


Linux 檔案屬性與目錄配置
最近更新日期：2003/02/06
使用者與群組
Linux 檔案屬性
如何改變檔案權限： chgrp, chown, chmod,
Linux 支援的檔案格式與檔案種類
Linux 目錄配置
本章習題練習
使用者與群組
初次接觸 Linux 的朋友大概會覺得很怪異，怎麼『Linux 有這麼多使用者，還分什麼群組，有什麼用？』。這個『使用者與群組』的功能可是相當健全而好用的一個安全防護呢！怎麼說呢？由於 Linux 是個多人多工的系統 ( 已經提過若干次囉！ )，因此可能常常會有多人同時使用這部主機來進行工作的情況發生，為了考慮每個人的隱私權，因此，這個『檔案擁有者』的角色就顯的相當的重要了！例如當你將你的e-mail情書轉存成檔案之後，放在您自己的家目錄，您總不希望被其他人看見自己的情書吧？這個時候，你就把該檔案設定成『只有檔案擁有者，就是我，才能看與修改這個檔案的內容』，那麼即使其他人知道你有這個相當『有趣』的檔案，不過由於您有設定適當的權限，所以其他人自然也就無法知道該檔案的內容囉！

那麼群組呢？為何要設定檔案還有所屬的群組？其實，群組最簡單的功能之一，就是當您在團隊開發資源的時候最有用啦！舉個例子來說好了，假如在我的主機上面有兩個團體，這第一個團體名稱為 testgroup 而他的成員是 test1, test2, test3 三個，第二個團體名稱為 treatgoup 他的團員為 treat1, treat2, treat3，這兩個團體之間是互相有競爭性質的，但是卻又要繳交同一份報告，然而每組團員又需要同時可以修改自己的團體內任何人所建立的檔案，且不能讓非自己團體以外的人看到自己的檔案內容！這個時候怎麼辦？呵呵！在 Linux 底下可就很簡單啦！我可以經由簡易的檔案權限設定，就能限制非自己團隊( 亦即是群組囉 )的其他人不能夠閱覽內容囉！而且亦可以讓自己的團隊成員可以修改我所建立的檔案！同時，如果我自己還有私人隱密的文件，仍然可以設定成讓自己的團隊成員也看不到我的檔案資料?很方便吧！另外，如果 teacher 這個帳號是 testgroup 與 treatgroup 這兩個群組的老師，他想要同時觀察兩者的進度，因此需要兩邊的群組都能夠進去觀看，這個時候，您可以設定 teacher 這個帳號，『同時支援 testgroup 與 treatgroup 這兩個群組！』，也就是說，每個人都可以有多個群組的支援呢！

這樣說或許你還不容易理解這個使用者與群組的關係吧？沒關係，我們可以使用目前『家庭』的觀念來進行解說喔！假設有一家人，家裡只有三兄弟，分別是王大毛、王二毛與王三毛三個人，而這個家庭是登記在王大毛的名下的！所以，『王大毛家有三個人，分別是王大毛、王二毛與王三毛』，而且這三個人都有自己的房間，並且共同擁有一個客廳喔！
  • 由於王家三個人各自擁有自己的房間，所以，王二毛雖然可以進入王三毛的房間，但是二毛不能翻三毛的抽屜喔！那樣會被三毛 K 的！因為抽屜裡面可能有三毛自己私人的東西，例如情書啦，日記啦等等的，這是『私人的空間』，所以當然不能讓二毛拿囉！

  • 由於共同擁有客廳，所以王家三兄弟可以在客廳打開電視機啦、翻閱報紙啦、坐在沙發上面發呆啦等等的！反正，只要是在客廳的玩意兒，三兄弟都可以使用喔！因為大家都是一家人嘛！
這樣說來應該有點曉得了喔！那個『王大毛家』就是所謂的『群組』囉，至於三兄弟就是分別為三個『使用者』，而這三個使用者是在同一個群組裡面的喔！而三個使用者雖然在同一群組內，但是我們可以設定『權限』，好讓某些使用者個人的資訊不被群組的所有人查詢，以保有個人『私人的空間』啦！而設定群組共享，則可讓大家共同分享喔！
好了，那麼今天又有個人，叫做張小豬，他是張小豬家的人，與王家沒有關係啦！這個時候，除非王家認識張小豬，然後開門讓張小豬進來王家，否則張小豬永遠沒有辦法進入王家，更不要說進到王三毛的房間啦！不過，如果張小豬透過關係認識了三毛，並且跟王三毛成為好朋友，那麼張小豬就可以透過三毛進入王家啦！呵呵！沒錯！那個張小豬就是所謂的『其他人， Others 』囉！因此，我們就可以知道啦，在 Linux 裡面，任何一個檔案都具有『User, Group 及 Others』三個權限！我們可以將上面的說明以底下的圖示來解釋：

不過，這裡有個特殊的人物要來介紹的，那就是『萬能的天神』！這個天神具有無限的神力，所以他可以到達任何他想要去的地方，呵呵！那個人在 Linux 系統中的身份代號是『 root 』啦！所以要小心喔！那個 root 可是『萬能的天神』喔！

無論如何，『使用者身份』，與該使用者所支援的『群組』概念，在 Linux 的世界裡面是相當的重要的，他可以幫助您讓您的多工 Linux 環境變的更容易管理！更詳細的『身份與群組』 設定，我們將在帳號管理再進行解說。底下我們將針對檔案系統與檔案權限來進行說明。
Linux 檔案屬性：
大致瞭解了 Linux 的使用者與群組之後，接著下來，我們要來談一談，那麼這個檔案的權限要如何針對這些所謂的『使用者』與『群組』來設定該檔案的權限呢？這個部分是相當的重要的，尤其對於初學者來說，因為檔案的權限與屬性是學習 Linux 的一個相當重要的關卡，如果沒有這部份的概念，那麼您將老是聽不懂別人在講什麼呢！尤其是當您在您的螢幕前面出現了『Permission deny』的時候，不要擔心，『肯定是權限設定錯誤』啦！呵呵！好了，閒話不多聊，趕快來瞧一瞧先：

嗯！既然要讓你瞭解 Linux 的檔案屬性，那麼有個重要的也是常用的指令就必須要先跟你說囉！那一個？！就是『 ls 』這一個 list 檔案的指令囉！在你以 root 的身份登入 Linux 之後，下達『ls -al 』看看，會看到底下的幾個咚咚：

[root@tsai root]# ls -al
total 64
drwxr-x--- 4 root root 4096 Feb 14 22:02 .
drwxr-xr-x 23 root root 4096 Feb 16 13:35 ..
-rw-r--r-- 1 root root 1210 Feb 10 06:03 anaconda-ks.cfg
-rw------- 1 root root 12447 Feb 14 23:22 .bash_history
-rw-r--r-- 1 root root 24 Jun 11 2000 .bash_logout
-rw-r--r-- 1 root root 234 Jul 6 2001 .bash_profile
-rw-r--r-- 1 root root 217 Feb 9 22:06 .bashrc
-rw-r--r-- 1 root root 210 Jun 11 2000 .cshrc
drwx------ 2 root root 4096 Feb 14 21:54 .gnupg
-rw------- 1 root root 8 Feb 14 22:05 .mysql_history
drwx------ 2 root root 4096 Feb 10 00:44 .ssh
-rw-r--r-- 1 root root 196 Jul 11 2000 .tcshrc
-rw-r--r-- 1 root root 1126 Aug 24 1995 .Xresources

第一欄 二 三 四 五 六 七
[檔案屬性][檔案數][擁有者][所有者群組][大小][建檔日期][檔名]

ls 是『list』的意思，與在早期的 DOS 年代的 dir 類似功能。而參數『-al』則表示列出所有的檔案（包含隱藏檔，就是檔名前面第一個字元為 . 的那種檔案）。如上所示，在你第一次以 root 身份登入 Linux 時，如果你輸入指令後，應該有上列的幾個東西，先解釋一下上面七個欄位個別的意思：
  1. 第一欄代表這個檔案的屬性：這個地方最需要注意了！仔細看的話，你應該可以發現這一欄其實共有十個屬性：
    • 第一個屬性代表這個檔案是『目錄、檔案或連結檔』：
      • 當為[ d ]則是目錄，例如上表的第 11 行；
      • 為[ - ]則是檔案，例如上表的第 5 行；
      • 若是[ l ]則表示為連結檔(link file)；
      • 若是[ b ]則表示為裝置檔裡面的可供儲存的周邊設備；
      • 若是[ c ]則表示為裝置檔裡面的序列埠設備，例如鍵盤、滑鼠。

    • 接下來的屬性中，三個為一組，且均為『rwx』的三個參數的組合。其中，[ r ]代表可讀、[ w ]代表可寫、[ x ]代表可執行：
      • 第一組為『擁有人的權限』，以第五行為例，該檔案的擁有人可以讀寫，但不可執行；
      • 第二組為『同群組的權限』；
      • 第三組為『其他非本群組的權限』。

    範例：若有一個檔案的屬性為『-rwxr-xr--』，簡單的可由下面說明之：

    [-][rwx][r-x][r--]
    1 234 567 890
    1 為：代表這個檔名為目錄或檔案（上面為檔案）
    234為：擁有人的權限（上面為可讀、可寫、可執行）
    567為：同群組使用者權限（上面為可讀可執行）
    890為：其他使用者權限（上面為僅可讀）

    上面的屬性情況代表一個檔案、這個檔案的擁有人可讀可寫可執行、但同群組的人僅可讀與執行，非同群組的使用者僅可讀的意思！

    • 除此之外，需要特別留意的是 x 這個標號！若檔名為一個目錄的時候，例如上表中的 .ssh 這個目錄：

        drwx------ 2 root root 4096 Feb 10 00:44 .ssh

      可以看到這是一個目錄，而且只有 root 可以讀寫與執行。但是若為底下的樣式時，請問非 root 的其他人是否可以進入該目錄呢？

        drwxr--r-- 2 root root 4096 Feb 10 00:44 .ssh

      咦！似乎好像是可以喔！因為有可讀[ r ]存在嘛！『錯！』答案是非 root 這個帳號的其他使用者均不可進入 .ssh 這個目錄，為什麼呢？因為 x 與 目錄 的關係相當的重要，如果您在該目錄底下不能執行任何指令的話，那麼自然也就無法執行 ls, cd 等指令，所以囉，也就無法進入了，因此，請特別留意的是，如果您想要開放某個目錄讓一些人進來的話，請記得將該目錄的 x 屬性給開放呦！

    • 另外，你也必須要更加的小心的是，在 Windows 底下一個檔案是否具有執行的能力是藉由『附檔名』來執行的，例如：.exe, .bat, .com 等等，但是在 Linux 底下，我們的檔案是否能執行，則是藉由是否具有 x 這個屬性來決定的！所以，跟檔名是沒有絕對的關係的！這點還請特別留意呢！

  2. 第二欄表示為連結佔用的節點 (i-node) ( 若為目錄時，通常與該目錄底下還有多少目錄有關 )這部分將在介紹連結 link 檔案時 (下一節) 再深入的介紹！；

  3. 第三欄表示這個檔案（或目錄）的『擁有人』；

  4. 第四欄表示擁有人的群組；
    這裡再次解釋一下，在 Linux 中，你的 ID ( 如 root 或 test 等帳號均是所謂的 ID ) 即是你的身份，而且你還有附屬在一個或多個群組之下，例如剛剛我們上面提到的，你有一個團體 ( 即群組 ) 代號為 testgroup ，且這個群體裡有三個人，其代號分別是 test1, test2, 與 test3，則這三個人為同一群組即 testgroup！那麼如果以上圖的[-rwxrwx---]的檔案屬性來看，如果該檔案屬於 test1 所有，那麼 test2, test3 亦有讀、寫、執行的權力，因為他們都屬於同一個 group 呀！而如果您不是屬於 test1, test2, test3 的任何一個人，也不屬於 testgroup 這個群組時，那麼您將不具備讀、寫、執行這個檔案的權限了！

  5. 第五欄為這個檔案的大小；

  6. 第六欄為這個檔案的建檔日期或者是最近的修改日期，分別為月份、日期及時間。請特別留意，如果您是以繁體中文來進行安裝您的 Linux 時，那麼預設的語系可能會被改為中文。而由於中文無法顯示在文字型態的終端機上面，所以這一欄會成為怪怪的亂碼，這個時候，請修改一下 /etc/sysconfig/i18n 這個檔案，裡面的『 LC_TIME 』修改為：『 LC_TIME=en 』再儲存離開，再登入一次，就可以得到英文字形顯示的日期了！那麼如何修改該檔案呢？呵呵！以 root 身份用 vi 修改！ ；

  7. 第七欄為這個檔案的檔名，如果檔名之前多一個『 . 』，則代表這個檔案為『隱藏檔』，例如上表第 6 行的『.bashrc_history』檔名即是隱藏檔，由於我們有下一個參數為 ls -al，所以連隱藏檔都列出來，如果你只輸入 ls 則檔名有加『 . 』的檔案就不會被顯示出來！

      對於更詳細的 ls 用法，還記得怎麼查詢嗎？對啦！使用 man ls 或 info ls 去看看他的基礎用法去！自我進修是很重要的，因為『師傅帶進門，修行在個人！』，自古只有天才學生，沒有天才老師呦！加油吧！ ^_^

  • 例題一：如果有下面的兩個檔案：
    -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
    請說明兩個檔案的擁有者與其相關的權限為何？
    答：
    • 檔案『 test.txt 』的擁有人為 root ，群組為 root 。至於權限方面則只有 root 這個帳號可以存取此檔案，其他人則僅能讀此檔案；
    • 另一個檔案『 ping_tsai 』的擁有人為 test1 ，而群組為 testgroup。其中， test1 可以針對此檔案具有可讀可寫可執行的權力，而同群組的 test2, test3 兩個人與 test1 同樣是 testgroup 的群組帳號，則僅可讀可執行但不能寫 (亦即不能修改)，至於非 testgoup 這一個群組的人則僅可以讀，不能寫也不能執行！

  • 例題二：如果我的目錄為底下的樣式：
    drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
    請問 testgroup 這個群組的成員與其他人( others )是否可以進入本目錄？
    答：
    • 檔案擁有者 test1 可以在本目錄中進行任何工作；
    • 而 testgroup 這個群組的帳號，例如 test2, test3 亦可以進入本目錄進行工作，但是不能在本目錄下進行寫入的動作；
    • 至於 other 的權限中雖然有 r ，但是由於沒有 x 的權限，因此 others 的使用者，並不能進入此目錄！

Linux 檔案屬性的重要性：
與 Windows 系統不一樣的是，在 Linux 系統（或者說 Unix-Like 系統）當中，每一個檔案都多加了很多的屬性進來，尤其是群組的概念，這樣有什麼用途呢？基本上，最大的用途是在『安全性』上面的。舉個簡單的例子，在你的系統中，關於系統服務的檔案通常只有 root 才能讀寫，或者是執行，例如 /etc/shadow這一個帳號管理的檔案，由於該檔案記錄了你的系統中的所有帳號的資料，因此是很重要的一個資訊檔，當然不能讓任何人讀取，只有 root 才能夠來讀取囉！所以該檔案的屬性就會成為 [ -rw------- ]囉！

那麼，如果你有一個開發團隊，在你的團對中，你希望每個人都可以使用某一些目錄下的檔案，而非你的團隊的其他人則不予以開放呢？以上面的例子來說，testgroup 的團隊共有三個人，分別是 test1, test2, test3 ！那麼我就可以將 test1 的檔案屬性訂為 [ -rwxrwx--- ]來提供給 testgroup 的工作團隊使用囉！這可是相當重要的。

再舉個例子來說，如果你的目錄權限沒有作好的話，可能造成其他人都可以在你的系統上面亂搞囉！例如本來只有 root 才能做的開關機、ADSL 的撥接程式、新增或刪除使用者等等的指令，若被你改成任何人都可以執行的話，那麼如果使用者不小心給你重新開機啦！重新撥接啦！等等的！那麼你的系統不就會常常莫名其妙的掛掉囉！而且萬一你的使用者的密碼被其他不明人士取得的話，只要他登入你的系統就可以輕而易舉的執行一些 root 的工作！可怕吧！因此，在你修改你的 linux 檔案與目錄的屬性之前，一定要先搞清楚，什麼是可變的，什麼是不可變的！千萬注意囉！
如何改變檔案權限
好了，我們已經知道檔案權限對於一個系統的安全重要性了，也知道檔案的權限對於使用者與群組的相關性了，好了，那麼如何修改一的檔案的權限呢？又！有多少檔案的權限我們可以修改呢？其實一個檔案的權限很多嘛！大致上我們先介紹幾個簡單的，例如：群組、擁有者、各種身份的權限等等。
    chgrp ：改變檔案所屬群組
    chown ：改變檔案所屬人
    chmod ：改變檔案的屬性、 SUID 、等等的特性
  • 改變所屬群組, chgrp：
    改變一個檔案的群組也真是很簡單的，直接以 chgrp 來改變即可，咦！這個指令就是 change group 的縮寫嘛！對啦！這樣就很好記了吧！ ^_^。不過，請記得，要改變成為的群組名稱必須要在 /etc/group 裡面存在的名字才行，否則就會顯示錯誤！例如底下的例子中，我們要將 tmp 的群組改變一下，其中， users 這個群組本身已經存在 /etc/group 當中了，但是 testing 這個群組名字就不存在 /etc/group 當中，所以就會有錯誤訊息發生啦！

    語法：
    chgrp 群組名稱檔案或目錄

    範例：
    [root@test root]# chgrp users tmp
    [root@test root]# ls –l
    drwx------ 2 root root 4096 Oct 19 11:43 drakx/
    drwx------ 2 root users 4096 Oct 19 21:24 tmp/
    [root@test root]# chgrp testing tmp
    chgrp: invalid group name `testing' <==發生錯誤訊息囉！

  • 改變所屬群組, chown：
    好了，那麼如何改變一個檔案的擁有者呢？很簡單呀！既然改變群組是 change group ，那麼改變擁有者就是 change owner 囉！BINGO，對啦！那就是 chown 這個指令的用途，要注意的是，使用者必須是已經存在系統中的，也就是在 /etc/passwd 這個檔案中有紀錄的使用者名稱才行改變。 chown 的用途還滿多的，他還可以順便直接修改群組的名稱呢！此外，如果要連目錄下的所有次目錄或檔案同時更改檔案擁有者的話，直接加上 –R 的參數即可！我們來看看語法與範例：

    語法：
    chown [ -R ] 帳號名稱 檔案或目錄
    chown [ -R ] 帳號名稱:群組名稱 檔案或目錄

    範例：
    [root@test root]# chown test tmp
    [root@test root]# ls -l
    total 28
    drwx------ 2 root root 4096 Oct 19 11:43 drakx/
    drwx------ 2 test users 4096 Oct 19 21:24 tmp/
    [root@test root]# chown –R root:root tmp
    [root@test root]# ls –l
    drwx------ 2 root root 4096 Oct 19 11:43 drakx/
    drwx------ 2 root root 4096 Oct 19 21:24 tmp/

    嗯！知道如何改變檔案的群組與擁有者了，那麼什麼時候要使用 chown 或 chgrp 呢？！或許您會覺得奇怪吧？！是的，確實有時候需要變更檔案的擁有者的，最常見的例子就是在 copy 檔案給你之外的其他人時，我們使用最簡單的 cp 來說明好了，

    語法：
    cp 來源檔案目的檔案

    假設您今天要將 .bashrc 這個檔案拷貝成為 .bashrc_test ，且是要給 test 這個人，您可以這樣做：

    [root@test root]# cp .bashrc .bashrc_test
    [root@test root]# ls –al .bashrc*
    -rw-r--r-- 1 root root 226 Feb 16 2002 .bashrc
    -rw-r--r-- 1 root root 226 Oct 21 14:24 .bashrc_test

    哇！怎麼辦？ .bashrc_test 還是屬於 root 所有，如此一來，即使你將檔案拿給 test 這個使用者了，那他仍然無法修改的( 看屬性就知道了吧！ )，所以你就必須要將這個檔案的擁有者與群組修改一下囉！知道如何修改了吧！？呵呵！

  • 改變九個屬性 ( chmod )：

    數字類型改變檔案權限
    其實， Linux 檔案的屬性不只九個呦！不過這裡不打算寫的太複雜！先說一些簡單的，較難的以後有空再說吧！先複習一下剛剛上面說的：

      -rwxrwxrwx

    這九個屬性是三個三個一組的！其中，我們可以使用數字來代表各個屬性，各屬性的對照表如下：

      r:4
      w:2
      x:1

    由於同一組的數字是相加的！例如當屬性為 [ -rwxrwx--- ] 則是：

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

    所以，這樣的屬性造成的數值就是 770 囉！而更改屬性的指令為 chmod，他的語法為：

    語法：
    chmod [-R] xyz 檔案或目錄
    xyz 為同三組 rwx 屬性數值的相加

    舉例來說，如果要將 .bashrc 這個檔案所有的屬性都打開，那麼就下達：

    [root@test root]# ls –al .bashrc
    -rw-r--r-- 1 root root 226 Feb 16 2002 .bashrc
    [root@test root]# chmod 777 .bashrc
    [root@test root]# ls –al .bashrc
    -rwxrwxrwx 1 root root 226 Feb 16 2002 .bashrc

    看到了嗎？屬性改變了喔！由於一個檔案有三組屬性，所以你可以發現上面 777 為三組，而由於我們將所有的屬性都打開，所以數字都相加，亦即『r+w+x = 4+2+1 = 7』。

    那如果要將屬性變成『 -rwxr-xr-- 』呢？那麼就成為 [4+2+1][4+0+1][4+0+0]=754 囉！所以你需要下達 chmod 754 filename。最

    常發生的一個問題就是，常常我們以 vi 編輯一個 shell 的文字檔後，他的屬性通常是 -rw-rw-rw- 也就是 666 的屬性，如果要將他變成可執行檔，並且不要讓其他人修改此一檔案的話，那麼就需要 -rwxr-xr-x 這一個 755 的屬性，所以 chmod 755 test.sh 就需要這樣做囉！

    另外，有些檔案你不希望被其他人看到，例如 -rwxr-----，那麼就下達 chmod 740 filename 吧！

    符號類型改變檔案型態
    還有一個改變屬性的方法呦！從之前的介紹中我們可以發現，基本上就九個屬性分別是(1)user (2)group (3)others 三群啦！那麼我們就可以藉由 u, g, o 來代表三群的屬性！此外， a 則代表 all 亦即全部的三群！那麼讀寫的屬性就可以寫成了 r, w, x 囉！也就是可以使用底下的方式來看：

    chmod
    u
    g
    o
    a
    +(加入)
    -(除去)
    =(設定)
    r
    w
    x
    檔案或目錄

    來實作一下吧！假如我們要『設定』一個檔案的屬性為『-rwxr-xr-x』時，基本上就是：

    • u： 具有可讀、寫、執行
    • g 與 o： 具有讀與執行

    所以就是：

    [root@test root]# chmod u=rwx,og=rx .bashrc
    [root@test root]# ls –al .bashrc
    -rwxr-xr-x 1 root root 226 Feb 16 2002 .bashrc

    請注意， r=rwx,og=rx 這一段文字之間並沒有空白字元隔開呦！不要搞錯囉！那麼假如是『 -rwxr-xr-- 』？可以使用『 chmod u=rwx,g=rx,o=r filename 』來設定。此外，如果我不知道原先的檔案屬性，而我只想要增加 .bashrc 這個檔案的每個人均可寫入的權限，那麼我就可以使用：

    [root@test root]# ls –al .bashrc
    -rwxr-xr-x 1 root root 226 Feb 16 2002 .bashrc
    [root@test root]# chmod a+w .bashrc
    [root@test root]# ls –al .bashrc
    -rwxrwxrwx 1 root root 226 Feb 16 2002 .bashrc*

    而如果是要將屬性去掉而不更動其他的屬性呢？！例如要拿掉所有人的 x 的屬性，則

    [root@test root]# chmod a-x .bashrc
    [root@test root]# ls –al .bashrc
    -rw-rw-rw- 1 root root 226 Feb 16 2002 .bashrc

    知道 +, -, = 的不同點了嗎？對啦！ = 與 – 的狀態下，只要是沒有指定到的項目，則該屬性『不會被變動』，例如上面的例子中，由於僅以 – 拿掉 x 則其他兩個保持當時的值不變！呵呵！多多實作一下，你就會知道如何改變屬性囉！
Linux 支援的檔案格式與檔案種類
Linux 的檔案與 Windows 的檔案能不能互相使用？為何可以？為何不行？這些咚咚都涉及到 Linux 的檔案類型與檔案格式喔！底下我們就來談一談這些基本的觀念吧！
  • 檔案格式：
    什麼是檔案格式呢？就是你的作業系統用來存取的資料格式，例如我們知道 Windows 用來存取硬碟的資料格式為 FAT (或 FAT16 ) ，而 Windows 2000 也有所謂的 NTFS 檔案格式等等，至於 Linux 的正統檔案格式為 ext2 這一個。不過，目前 Linux 所能支援的檔案格式非常的多，不過，你必須要將你所想要支援的檔案格式編譯到你的核心當中才能被支援！因為如果核心不認識該檔案格式的話，那麼自然就無法取用呀！因此，您可以發現， Windows 與 Linux 安裝在同一個硬碟的不同 partition 時， Windows 將不能取用 Linux 的硬碟資料， Why ? 就因為 Windows 的核心不認識 Linux 的檔案系統呀！

    目前 Mandrake 9.0 預設的檔案格式為 ext3 (Third Extended File System )，是 ext2 檔案格式的升級版，不過也向下相容 ext2, ext 等等。另外，如果你需要將你原有的 Windows 系統也掛載在 Linux 底下的話，那麼 Linux 也支援 MS-DOS, VFAT, FAT, BSD 等等的檔案格式，至於 Window NT 的 NTFS 檔案格式則不見得每一個 Linux distribution 都有支援，例如 Red Hat 預設的核心就不支援 NTFS，但是 Mandrake 9.0 的核心竟然預設有支援 ntfs 耶！真高興！問我怎麼看出來的？呵呵！ Linux 能夠支援的檔案格式與核心是否有編譯進去有關，所以你可以到你的 Linux 系統的

      /lib/modules/`uname –r`/kernel/fs

    底下看一看，如果有你想要的檔案格式，那麼這個核心就有支援啦！目前使用的最廣泛的雖然還是 ext2 ，不過，最近釋出的 Linux distribution 大多已經預設採樣 ext3 或 reiserfs 這種具有日誌式管理( Journaling )的檔案格式了。那為什麼要使用 ext3 這種檔案格式呢？我們採用第一個使用 ext3 做為 Linux distribution 的 Red Hat 公司中，首席核心開發者 Michael K. Johnson 的話：

      『為什麼你想要從ext2轉換到ext3呢？有四個主要的理由：可利用性、資料完整性、速度及易於轉換』

      『可利用性』，他指出，這意味著從系統中止到快速重新復原而不是持續的讓e2fsck執行長時間的修復。ext3的日誌式條件可以避免資料毀損的可能。他也指出：

      『除了寫入若干資料超過一次時，ext3往往會較快於ext2，因為ext3的日誌使硬碟讀取頭的移動能更有效的進行』

      然而或許決定的因素還是在Johnson先生的第四個理由中。

      『它是可以輕易的從ext2變更到ext3來獲得一個強而有力的日誌式檔案系統而不需要重新做格式化』。『那是正確的，為了體驗一下ext3的好處是不需要去做一種長時間的，冗長乏味的且易於產生錯誤的備份工作及重新格式化的動作』。

    更詳細的 ext3 說明在底下的連結中：ext3 or ReiserFS? Hans Reiser Says Red Hat's Move Is Understandable ( http://www.linuxplanet.com/linuxplanet/reports/3726/1/ ) 所以囉，我們可以使用 ext3 來做為我們的 Linux 的檔案格式啦！ ^_^ 。在這裡，您只要記得，我們 Linux 正統的檔案格式是 ext2 ，而目前有逐漸被 Journaling 的檔案格式取代的趨勢就是了。

  • 檔案種類：
    談完了檔案格式之後，再來談談所謂的檔案種類吧！我們在剛剛的屬性介紹中提到了最前面的標誌 ( d 或 - ) 可以代表目錄或檔案，那就是不同的檔案種類啦！Linux 的檔案種類主要有底下這幾種：

    • 正規檔案( regular file )：就是一般類型的檔案，在由 ls –al 所顯示出來的屬性方面，第一個屬性為 [ - ]。另外，依照檔案的內容，又大略可以分為兩種檔案種類：
      • 純文字檔(ascii) ：這是 Unix 系統中最多的一種囉，幾乎只要我們可以用來做為設定的檔案都屬於這一種；
      • 二進位檔(binary) ：通常執行檔除了 scripts （文字型批次檔）之外，就是這一種檔案格式；

    • 目錄 (directory)：就是目錄啦！第一個屬性為 [ d ]；

    • 連結檔 (link)：就是類似 Windows 底下的捷徑啦！第一個屬性為 [ l ]；

    • 設備檔 (device)：與系統周邊相關的一些檔案，通常都集中在 /dev 這個目錄之下！通常又分為兩種：
      • 區塊 (block) 設備檔 ：就是一些儲存資料，以提供系統存取的周邊設備，簡單的說就是硬碟啦！例如你的一號硬碟的帶碼是 /dev/hda1 等等的檔案啦！第一個屬性為 [ b ]；
      • 字元 (character) 設備檔 ：亦即是一些序列埠的周邊設備，例如鍵盤、滑鼠等等！第一個屬性為 [ c ]。

    那麼使用剛剛的『 ls -al 』這個指令，你就可以簡單的經由判斷每一個檔案的第一個屬性來瞭解這個檔案是何種類型！很簡單吧！

    除了設備檔是我們系統中很重要的檔案，最好不要隨意修改之外（通常他也不會讓你修改的啦！），另一個比較有趣的檔案就是連結檔。如果你常常將應用程式捉到桌面來的話，你就應該知道在 Windows 底下有所謂的『捷徑』。同樣的，你可以將 linux 下的連結檔簡單的視為一個檔案或目錄的捷徑。但是基本上這兩個東西是不一樣的！在 Windows 系統的捷徑中，你將無法修改主程式，但是在 Linux 中，連結檔可以直接連結到主程式，因此你只要改了這個連結檔，則主程式亦被改變了！這部份我們也會在後面的連結檔介紹中，再次詳細的談一談。

  • Linux 檔案附檔名：
    基本上，Linux 檔案的附檔名是沒有意義的！因為由前面的說明我們可以知道，一個 Linux 檔案能不能被執行，與他的第一欄的十個屬性有關，與檔名根本一點關係也沒有。這個觀念跟 Windows 的情況不相同喔！在 Windows 底下，能被執行的檔案附檔名通常是 .com .exe .bat 等等，而在 Linux 底下，只要你的屬性當中有 x 的話，例如 [ -rwx-r-xr-x ] 即代表這個檔案可以被執行喔！不過，由於我們仍然希望可以藉由附檔名來瞭解該檔案是什麼東西？！所以，通常我們還是會以適當的附檔名來表示該檔案是什麼種類的。簡單的分別，底下有數種常用的附檔名：

    • 批次檔 ( scripts )：通常以 *.sh 來代表，（因為批次檔為使用 shell 寫成的，所以附檔名就編成 .sh 囉）；
    • 打包或壓縮檔：通常附檔名為 *.Z, *.tar, *.tar.gz, *.zip, *.tgz 等等，這是因為壓縮軟體分別為 gunzip, tar 等等的，由於不同的壓縮軟體，而取其相關的附檔名囉！
    • 網頁相關檔案：通常使用 *.html 與 *.php 等等的檔案，分別代表 HTML 語法與 PHP 語法的網頁檔案囉！這種檔案可以使用網頁瀏覽器來開啟！

    另外，還有程式語言如 perl 的檔案，其附檔名也可能取成 .pl 這種檔名！基本上， Linux 上面的檔名真的只是讓你瞭解該檔案可能的用途而已，真正的執行與否仍然需要屬性的規範才行！例如雖然有一個檔案為可執行檔，如有名的代理伺服器軟體 squid ，不過，如果這個檔案的屬性被修改成無法執行時，那麼他就變成不能執行囉！這種問題最常發生在檔案傳送的過程中。例如你在網路上下載一個可執行檔，但是偏偏在你的 Linux 系統中就是無法執行！呵呵！那麼就是可能檔案的屬性被改變了！不要懷疑，從網路上傳送到你的 Linux 系統中，檔案的屬性確實是會被改變的喔！

    再提個另外！在 Linux 底下，每一個檔案或目錄的檔名最長可以到達 256 的字元，是相當長的檔名喔！我們希望 Linux 的檔案名稱可以一看就知道該檔案在幹嘛的，所以檔名通常是很長很長！而用慣了 Windows 的人可能會受不了，因為檔案名稱通常真的都很長，對於用慣 Windows 而導致打字速度不快的朋友來說，嗯！真的是很困擾.....不過，只得勸您好好的加強打字的訓練囉！當然啦，如果您已經讀完了本書第三篇關於 BASH 的用法，那麼您將會發現『哇！變數真是一個相當好用的東西吶！』嗯！看不懂，沒關係，到第三篇談到 bash 再說！

Linux 目錄配置：
在 Linux 系統的預設狀態下，你在根目錄中輸入『 ls -l 』應該可以看到如下的畫面：

[vbird@tsai vbird ]$ cd /
[vbird@tsai /]$ ls -l
total 153
drwxr-xr-x 2 root root 4096 Feb 10 02:06 bin
drwxr-xr-x 3 root root 4096 Feb 10 00:05 boot
drwxr-xr-x 17 root root 77824 Feb 11 14:45 dev
drwxr-xr-x 41 root root 4096 Feb 16 15:18 etc
drwxr-xr-x 8 root root 1024 Feb 9 22:44 home
drwxr-xr-x 2 root root 4096 Jun 22 2001 initrd
drwxr-xr-x 6 root root 4096 Feb 10 02:12 lib
drwxr-xr-x 2 root root 16384 Feb 10 05:35 lost+found
drwxr-xr-x 2 root root 4096 Aug 30 00:10 misc
drwxr-xr-x 3 root root 4096 Feb 9 22:05 mnt
drwxr-xr-x 2 root root 4096 Aug 24 1999 opt
dr-xr-xr-x 102 root root 0 Feb 11 22:45 proc
drwx------ 4 root root 4096 Feb 16 15:25 root
drwxr-xr-x 2 root root 4096 Feb 14 21:28 sbin
drwxrwxrwt 2 root root 4096 Feb 16 15:40 tmp
drwxr-xr-x 16 root root 4096 Feb 10 01:28 usr
drwxr-xr-x 20 root root 4096 Feb 14 21:41 var

由屬性的角度來看，上面的檔名每個都是『目錄名稱』，較為特殊的是 root ，由於 root 這個目錄是管理員 root 的家目錄，這個家目錄可重要了！所以一定要設定成較為嚴密的 700 ( rwx------ )這個屬性才行吶！如果以較為完整的樹狀目錄來視察的話，可以將整個 Linux 的樹狀目錄會製程下圖：
請注意，每個目錄都是依附在 / 這個根目錄底下的，所以我們在安裝的時候一定要有一個 / 對應的 partition 才能安裝的原因即在於此！這也就是我們俗稱的『樹狀目錄』囉！

每個目錄的大致內容如下表所示：

/bin | 這是放例如： ls, mv, rm, mkdir, rmdir, gzip, tar, telnet, 及 ftp 等等常用的執行檔的地方（這些執行檔的執行方法會在後面提到），有時候這個目錄的內容與 /usr/bin 是一樣的（有時候甚至會使用連結檔哩），是給一般使用者使用的執行程式放置的所在！
/boot | 沒錯，這裡就是放置你 Linux 核心與開機相關檔案的地方，這個目錄底下的 vmlinuz-xxx 就是 Linux 的 Kernel 啦！粉重要的東西！而如果你的開機管理程式選擇 grub 的話，那麼這個目錄內還有 /boot/grub 這個次目錄呦！
/dev | 擺放一些與裝置有關的檔案。基本上 Unix 或 Linux 系統均把裝置當成是一個檔案來看待，例如 /dev/fd0 代表軟碟，亦即 Windows 系統下的 A 槽，而 /dev/cdrom 則代表光碟，等等！而如上所述，在這個目錄底下的檔案型態通常分為兩種喔，分別是管理磁碟 Input/Output 的 Block 檔案與周邊的 Character 檔案。
/etc | 系統在開機過程中需要讀取的檔案均在這個目錄中，例如 Lilo 的參數、人員的帳號與密碼、系統的主要設定、http 架站的參數內容、你所要開啟的服務項目等等都在這個目錄中，所以在這個目錄下工作的時候，請記得一定要備份，否則檔案被改掉了可是很麻煩的！
/etc/rc.d | 這個路徑主要在記錄一些開關機過程中的 scripts 檔案， scripts 有點像是 DOS 下的批次檔（.bat檔名）
/etc/rc.d/init.d 所以服務預設的啟動 scripts 都是放在這裡的，例如要啟動與關閉 iptables 的話，可以：
/etc/rc.d/init.d/iptables start
/etc/rc.d/init.d/iptables stop
/etc/xinetd.d | 這個路徑在較新的 Linux distribution 當中才有，由於早期的版本用來開啟服務的檔案是 inetd.conf ，但是在較新的版本中，開啟服務的項目已經變成使用 xinetd.conf 這個檔案，因此，你若需要啟動一些額外的服務的話，在 Mandrake 9.0 或者是 Red Hat 7.0 以後就要到 /etc/xinetd.d 這個目錄下了。
/etc/X11 | 這是與 X windows 有關的設定檔所在的目錄，尤其裡面的 XF86Config-4 更是重要呢！
/home | 基本上，這是系統預設的使用者的家目錄( home directory )，在你新增一般使用者帳號的時候，預設的使用者家目錄都在這裡設定好囉！
/lib | 在 Linux 執行或編譯一些程式的時候，均會使用到一些函式庫（library），就在這個目錄下
/lost+fount | 系統不正常產生錯誤時，會將一些遺失的片段放置於此目錄下，通常這個目錄會自動出現在裝置目錄下。例如你加裝一棵硬碟於 /disk 中，那在這個目錄下就會自動產生一個這樣的目錄 /disk/lost+found
/mnt | 這是軟碟與光碟接預設掛載點的地方；通常軟碟掛在 /mnt/floppy 下，而光碟掛在 /mnt/cdrom 下，不過也不一定啦！只要你高興，隨便找一個地方來掛載也可以呀！
/proc | 系統核心與執行程序的一些資訊。例如你的網路狀態的問題啦！這個目錄將在啟動 Linux 的時候自動的被掛上，而且該目錄底下不會佔去硬碟空間！因為裡面都是『記憶體』內的資料啦
/root | 系統管理員的家目錄
/sbin | 放置一些系統管理常用的程式，例如： fdisk, mke2fs, fsck, mkswap, mount 等等。與 /bin 不太一樣的地方，這個目錄下的程式通常是給 root 等系統管理員使用的程式喔！
/tmp | 這是讓一般使用者暫時存放檔案的地方，例如你在安裝 Linux 下的軟體時，可能軟體預設的工作目錄就是 /tmp ，所以你要定期的清理一下，當然，重要資料最好不要放在這裡！
/usr | 這是最重要的一個目錄了，裡面含有相當多的系統資訊，內有許多目錄，用來存放程式與指令等等。這個目錄有點像是 Windows 底下的『Program Files』那個目錄說∼
/usr/bin | 放置可執行程式，如前所說，這個目錄的檔案與 /bin 幾乎是相同的。
/usr/include | 一些套件的header檔。基本上，當我們在以 tarball 方式（ *.tar.gz 的方式安裝軟體）安裝某些資料時，會使用到的一些函式庫都在這個目錄底下喔！
/usr/lib | 內含許多程式與子程式所需的函式庫。
/usr/local 在你安裝完了 Linux 之後，基本上所有的配備你都有了，但是軟體總是可以升級的，例如你要升級你的 proxy 服務，則通常軟體預設的安裝地方就是在 /usr/local 中（ local 是『當地』的意思），同時，安裝完畢之後所得到的執行檔，為了與系統原先的執行檔有分別，因此升級後的執行檔通常擺在 /usr/local/bin 這個地方。

給個建議啦，通常 VBird 都會將後來才安裝上去的軟體放置在這裡，因為便於管理呦！

/usr/sbin | 放置管理者使用程式，與 /sbin 類似的功能
/usr/share/doc | 放置一些系統說明文件的地方，例如你安裝了 lilo 了，那麼在該目錄底下找一找，就可以查到 lilo 的說明文件了！很是便利！
/usr/share/man | 放置一些程式的說明檔的地方，那是什麼？呵呵！就是你使用 man 的時候，會去查詢的路徑呀！例如你使用 man ls 這個指令時，就會查出 /usr/share/man/man1/ls.1.bz2 這個說明檔的內容囉！
/usr/src | 這是放置核心原始碼的預設目錄，未來我們要編譯核心的時候，就必須到這個目錄底下呦！
/usr/X11R6 | X Window System存放相關檔案的目錄
/var | 這個目錄可就重要了！所有服務的登錄檔或錯誤訊息檔案（log files）都在 /var/log 裡面，此外，一些資料庫如 MySQL 的資料庫則在 /var/lib 裡頭，此外，使用者未讀郵件郵件的預設放置地點為 /var/spool/mail ！呵呵！你說重不重要呀！？
  • 需要注意的目錄
    在 Linux 系統中，有幾個目錄是特別需要注意的，以下提供幾個需要注意的目錄，以及預設相關的用途：

    • /etc：這個目錄相當重要，如前所述，你的開機與系統資料檔案均在這個目錄之下，因此當這個目錄被破壞，那你的系統大概也就差不多該死掉了！而在往後的文件中，你會發現我們常常使用這個目錄下的 /etc/rc.d/init.d 這個子目錄，因為這個 init.d 子目錄是開啟一些 Linux 系統服務的 scripts （可以想成是批次檔 ）的地方。而在 /etc/rc.d/rc.local 這個檔案是開機的執行檔，有點像是舊 Windows 系統下的 autoexec.bat 及 config.sys 檔。所以，如果你有需要在開機載入的服務或執行檔案，可以寫在這個檔案的最後一行，則開機時就會自動幫你載入執行檔了！

    • /bin, /sbin, /usr/bin, /usr/sbin：這是系統預設的執行檔的放置目錄，例如 root 常常使用的 userconf, netconf, perl, gcc, c++ 等等的資料都放在這幾個目錄中，所以如果你在提示字元下找不到某個執行檔時，可以在這四個目錄中查一查！其中， /bin, /usr/bin 是給系統使用者使用的指令，而 /sbin, /usr/sbin 則是給系統管理原使用的指令！

    • /usr/local：這是系統預設的讓你安裝你後來升級的套件的目錄。例如，當你發現有更新的 Web 套件（如 Apache ）可以安裝，而你又不想以 rpm 的方式升級你的套件，則你可以將 apache 這個套件安裝在 /usr/local 底下。安裝在這裡有個好處，因為目前大家的系統都是差不多的，所以如果你的系統要讓別人接管的話，也比較容易上手呀！也比較容易找的到資料喔！因此，如果你有需要的話，通常我都會將 /usr/local/bin 這個路徑加到我的 path 中。

    • /home：這個是系統將有帳號的人口的家目錄設置的地方。

    • /var：這個路徑就重要了！不論是登入、各類服務的問題發生時的記錄、以及常態性的服務記錄等等的記錄目錄，所以當你的系統有問題時，就需要來這個目錄記錄的檔案資料中察看問題的所在囉！而 mail 的預設放置也是在這裡，所以他是很重要的喔！

    • /usr/share/man, /usr/local/man：這兩個目錄為放置各類套件說明檔的地方，例如你如果執行 man man，則系統會自動去找這兩個目錄下的所有說明檔，如果有相同的資料就會叫出來給你幽！

  • 一般主機可能會分配的磁碟情況
    好了，知道了 Linux 的檔案權限，目前也知道了各個檔案內可能擺放的資料是什麼了，那麼再來說說你的目錄與磁碟分割之間的相關性。通常一般的大型主機都不會將所有的資料放置在一個磁碟中（就是只有一個『 / 』根目錄），這有幾個目的：

    1. 安全性考量：你的系統通常是在 /usr/ 中，而個人資料則可能放置在 /home 當中，至於一些開機資料則放置在 /etc 當中。如果將所有的資料放在一起，當你的系統不小心被駭客破壞，或者不小心自己砍了一個小東西，則所有的咚咚也都跟著不見了.....這對於我們市井小民或許無所謂，再安裝一次就好了，但是對於一些大型企業可不行這樣！因此需要將資料分別放置於不同的磁碟中，會比較保險些。

    2. 便利性：如果你需要升級你的系統的話，是否需要重新 format 安裝呢？有些資料例如 /home 裡面的資料為個人用戶的資料，似乎與系統無關！所以如果你將這些資料分別放置於不同的磁碟，則你要升級或者進行一些系統更動時，將比較有彈性。

    你或許可以將你的系統做成這樣的 partition 分佈：

      /
      /boot
      /usr
      /home
      /var

    這是比較常見的磁碟分佈情況，其中，

    • / 根目錄可以分配約 256 MB 以內；
    • /boot 大概在 50 MB 就可以了，因為開機檔案並不大；
    • /var 就至少需要 1GB 以上，因為你的 mail 、 proxy 預設的儲存區都在這個目錄中，除非你要將一些設定改變！
    • /home 與 /usr 通常是最大的，因為你所安裝的資料都是在 /usr/ 當中，而用戶資料則放置在 /home 當中，因此通常書上都會建議你將所剩下的磁碟空間平均分配給這兩個目錄說！

    無論如何，每部主機的環境與功能用途都不相同，自然其磁碟的分配就會不太一樣，因此，上面的設定您就看看就好，等您將整個網頁內容全 K 完了，那麼大概就知道怎樣設定您的主機最恰當啦！接著下來，我們來談一談簡單的檔案與目錄的管理了！

本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 早期的 Unix 系統檔名最多允許 14 個字元，而新的 Unix 與 Linux 系統中，檔名最多可以容許幾個字元？
    答：
      255個字元
  • 當一個檔案屬性為 –rwxrwxrwx 則表示這個檔案的意義為？
    答：
      任何人皆可讀取、可寫入亦可刪除。
  • 我需要將一個檔案的屬性改為 –rwxr-xr-- 請問該如何下達指令？
    答：
      chmod 754 filename 或 chmod u=rwx,g=rx,o=r filename
  • 若我需要更改一個檔案的擁有者與群組，該用什麼指令？
    答：
      chown, chgrp
  • Linux 傳統的檔案系統為何？此外，常用的 Journaling 檔案格式有哪些？
    答：
      ext2,
      Journaling 有 ext3 及 Reiserfs 等
  • 請問底下的目錄與主要放置什麼資料
    /etc/：
    /etc/rc.d/init.d：
    /boot：
    /usr/bin, /bin：
    /usr/sbin, /sbin：
    /dev：
    /var/log：
    答：
      /etc/：幾乎系統的所有設定檔案均在此，尤其 passwd, shadow
      /etc/rc.d/init.d：系統開機的時候載入服務的 scripts 的擺放地點
      /boot：開機設定檔，也是預設擺放核心 vmlinuz 的地方
      /usr/bin, /bin：一般執行檔擺放的地方
      /usr/sbin, /sbin：系統管理員常用指令集
      /dev：擺放所有系統裝置檔案的目錄
      /var/log：擺放系統登錄檔案的地方
  • 若一個檔案的檔名開頭為『 . 』，例如 .bashrc 這個檔案，代表什麼？另外，如何顯示出這個檔名與他的相關屬性？
    答：
      有『 . 』為開頭的為隱藏檔，需要使用 ls –a 這個 –a 的參數才能顯示出隱藏檔案的內容，而使用 ls –al 才能顯示出屬性。
2002/07/18：第一次完成
2003/02/06：重新編排與加入 FAQ
2002/ 02/18以來統計人數


Linux 檔案與目錄管理
最近更新日期：2003/02/06
目錄與路徑： 相對路徑與絕對路徑, cd, pwd, mkdir, rmdir, 環境變數PATH,
檔案與目錄管理： ls, cp, rm, mv, basename, dirname,
觀看檔案內容： cat, tac, more, less, head, tail, nl, od,
連結檔的介紹： 什麼是 inode , ln,
檔案與目錄權限： chown, chmod, umask, chattr, lsattr,
搜尋檔案或目錄： which, whereis, locate, find,
SetUID, SetGID, Sticky bit 與 file 指令：
本章習題練習
目錄與路徑：
由前一章節『Linux 的檔案權限與目錄配置』中約略瞭解到 Linux 的『樹狀目錄』概念之後，接下來就得要實際的來搞定一些基本的路徑問題了！這些問題當中，最重要的莫過於『絕對路徑』與『相對路徑』的意義啦！趕緊來瞭解一下！
  • 絕對路徑與相對路徑：
    在開始目錄的切換之前，你必須要先瞭解一下所謂的『路徑, PATH』，有趣的是：什麼是『相對路徑』與『絕對路徑』？如果你還記得前一章的內容的話，那麼應該還記得 Linux 裡面的目錄是呈現『樹狀目錄』的情況，有就是有分支的啦！好了，假設你需要在任意一個目錄下變換到根目錄的 etc 底下，那麼你就應該要使用『 cd /etc 』這個情況，這也就是所謂的『絕對路徑』，他是從根目錄連續寫上來的一個情況，所以不論你在哪一個路徑現執行這一個指令，都會將你移動到該路徑下。那如果我是使用『 cd etc 』呢？那表示你要切換到『目前這個目錄下的 etc 目錄中』，情況可是不一樣的呦！通常第一次接觸 Linux 的使用者常會搞錯這一個路徑的觀念！

    • 絕對路徑：路徑的寫法『一定由根目錄 / 寫起』，例如： /usr/share/doc 這個目錄。
    • 相對路徑：路徑的寫法『不是由 / 寫起』，例如由 /usr/share/doc 要到 /usr/share/man 底下時，可以寫成：『cd ../man』這就是相對路徑的寫法啦！

    那麼相對路徑與絕對路徑有什麼了不起呀！？喝！那可真的是了不起了！假設您寫了一個套件，這個套件共需要三個目錄，分別是 etc, bin, man 這三個目錄，然而由於不同的人喜歡安裝在不同的目錄之下，假設甲安裝的目錄是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ，不過乙卻喜歡安裝在 /home/packages/etc, /home/packages/bin, /home/packages/man 這三個目錄中，請問如果需要用到絕對路徑的話，那麼是否很麻煩呢？是的！如此一來每個目錄下的東西就很難對應的起來！這個時候相對路徑的寫法就顯的特別的重要了！

    此外，如果您跟我一樣，喜歡將路徑的名字寫的很長，好讓自己知道那個目錄是在幹什麼的，例如：/data4/staiwan19961109/models-3/smoke 這個目錄，而另一個目錄在 /data4/staiwan19961109/models-3/cctm ，那麼我從第一個要到第二個目錄去的話，怎麼寫比較方便？當然是『 cd ../cctm 』比較方便囉！對吧！

    好了，既然要談到目錄這個東西，自然就需要瞭解一下有哪些常用的目錄『符號』代表的意義啦！

    . 代表此層目錄
    .. 代表上層目錄
    ~ 代表自己的家目錄
    ~user 代表到 user 這個人的家目錄

    底下我們要來談一談目錄與路徑的幾個常用的指令：
    • cd 變換目錄
    • pwd 顯示目前的目錄
    • mkdir 建立一個新目錄
    • rmdir 刪除一個裡面是空的空目錄

  • cd 與 pwd
    這兩個指令主要是在『變換目前目錄』與『顯示目前所在目錄』的工作，底下說一說他們的用途與語法吧！

  • cd
    語法：
    [root @test /root ]# cd [相對路徑或絕對路徑]
    參數說明：
    路徑有『相對路徑』與『絕對路徑』的分別，請千萬小心囉！
    範例：
    [root @test /root]# cd ..　　　　　　　<==回到上一層目錄
    [root @test /root]# cd ../home　　　　 <==相對路徑的寫法
    [root @test /root]# cd /var/www/html　 <==絕對路徑的寫法
    [root @test /etc]# cd　　　　　　　　　<==回到使用者的家目錄
    [root @test /etc]# cd ~ 　　　　　　　 <==回到使用者的家目錄！
    [root @test /etc]# cd ~test　　　　　　<==回到 test 這個使用者的家目錄
    說明：
    cd 是 change directory 的縮寫，這是用來變換工作路徑的指令。注意，路徑與 cd 指令之間存在一個空格！一登入 Linux 系統後，root 會在 root 的家目錄，亦即 /root 下，至於使用者會在預設的 /home/username 底下，例如鳥哥的 ID 為 vbird ，則以 vbird 的身份登入後，會到 /home/vbird 這個路徑下。OK！那回到上一層可以用『 cd .. 』而到相對路徑可到『 cd ../bird』，至於絕對路徑則是 cd /usr/sbin ！注意喔，在前面的提示字元會改變路徑名稱！此外，家目錄還有一個代碼，那就是『 ~ 』符號！例如上面的例子可以發現，使用『 cd ~ 』可以回到個人的家目錄裡頭去呢！此外，如果你的 Linux 主機當中有個 testing 的帳號，你要到他的家目錄去，可以下達『 cd ~testing』立刻去到 testing 的家目錄囉！

  • pwd
    語法：
    [root @test /root ]# pwd
    範例：
    [root @test root]# cd /home/test
    [root @test test]# pwd
    /home/test <==顯示目前你所在的目錄呦！
    說明：
    pwd 是 print working directory 的縮寫，也就是顯示目前所在目錄的指令，例如在上個表格最後的目錄是 /home/test 這個目錄，但是提示字元僅顯示 test ，如果你想要知道目前所在的目錄，可以輸入 pwd 即可：

    此外，由於很多的套件所使用的目錄名稱都相同，例如 /usr/local/etc 還有 /etc ，但是通常 Linux 僅列出最後面那一個目錄而已，這個時候你就可以使用 pwd 來知道你的所在目錄囉！免得搞錯目錄，結果……

  • mkdir 與 rmdir 管理目錄：
    那麼要如何建立刪除目錄呢？很簡單呀！就用 mkdir 與 rmdir ，看出來了嗎？沒錯啦！就是 make/remove directory 的縮寫說！看要怎麼用吧！

  • mkdir
    語法：
    [root @test /root ]# mkdir [-mp] [目錄名稱]
    參數說明：
    -m ：設定檔案的權限喔！直接設定，不需要看 umask 這個內容的臉色！
    -p ：幫助你直接將上面的目錄遞迴建立起來！
    範例：
    [root @test /root]# cd tmp
    [root @test /tmp]# mkdir test<==建立名稱為 test 的目錄
    [root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上層目錄
    [root @test /tmp]# mkdir -m 711 testqq <==建立權限為 711 的目錄！
    [root @test /tmp]# ll test*
    drwxrwxr-x 2 test test 4096 Feb 6 20:47 test/
    drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/
    drwx--x--x 2 test test 4096 Feb 6 20:48 testqq/
    說明：
    如果想要建立新的目錄的話，那麼就使用 mkdir 吧！ 不過，請注意呦！在預設的情況下，你所需要的目錄得一層一層的建立才行！例如：假如你要建立一個目錄為 /home/bird/testing/test1，那麼首先必須要有 /home 然後 /home/bird ，再來 /home/bird/testing 都必須要存在，才可以建立 test1 這個目錄！假如沒有 /home/bird/testing 時，就沒有辦法建立 test1 的目錄囉！不過，現在有個更簡單有效的方法啦！那就是加上 -p 這個參數喔！你可以直接下達：『 mkdir -p /home/bird/testing』則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的建立起目錄！並且，如果該目錄本來就已經存在時，系統也不會顯示錯誤訊息喔！挺快樂的吧！ ^_^

  • rmdir
    語法：
    [root @test /root ]# rmdir [-p] [目錄名稱]
    參數說明：
    -p ：將上層的目錄也刪除吧！
    範例：
    [root @test /root]# rmdir test<==刪除名稱為 test 的目錄
    [root @test tmp]# ll
    drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/
    [root @test tmp]# rmdir test1
    rmdir: `test1': Directory not empty
    [root @test tmp]# rmdir -p test1/test2/test3/test4
    [root @test tmp]$ ll
    說明：
    如果想要建立刪除舊有的目錄時，就使用 rmdir 吧！例如將剛剛建立的 test 殺掉，使用 rmdir test 即可！請注意呦！目錄需要一層一層的刪除才行！而且被刪除的目錄裡面必定不能還有其他的目錄或檔案！那如果要將所有目錄下的東西都殺掉呢？！這個時候就必須使用 rm -rf test 囉！不過，還是使用 rmdir 比較不危險！不過，你也可以嘗試以 -p 的參數加入，來刪除上層的目錄喔！

  • 環境變數 PATH
    在提過了絕對路徑、相對路徑與指令的下達方式之後，您應該會稍微注意到一件事情，那就是：『為什麼我可以在 /root 底下執行 /bin/ls 這個檔案呢？』對呀！為什麼我可以直接執行 ls 就一定可以顯示出一些訊息而不會說找不到該檔案呢？這是因為環境變數 PATH 的幫助所致呀！當我們在執行一個指令的時候，系統會依照 PATH 的設定去每個 PATH 定義的路徑下搜尋檔案，先搜尋到的指令檔案先被執行之！現在，請下達 echo $PATH ， echo 有『顯示、印出』的意思，而 PATH 前面加的 $ 表示後面接的是變數，所以即會顯示出目前的 PATH 了！

    [root@test root]# echo $PATH
    /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

    注意到了嗎？對啦！ /bin 在 PATH 的設定之中，所以自然就可以找的到 ls 啦！
    • 如果你將 ls 移動到 /root 底下的話，然後你自己本身也在 /root 底下，但是當你執行 ls 的時候，他就是不理你？怎麼辦？這是因為 PATH 沒有 /root 這個目錄，而你又將 ls 移動到 /root 底下了，自然系統就找不到可執行檔了，因此就會告訴你， command not found ！那麼該怎麼克服這種問題呢？有兩個方法，其一：直接將 /root 的路徑加入 PATH 當中！如何增加？可以使用：

        PATH=”$PATH”:/root

      這種方式來增加即可！另一種方式則是使用完整檔名，亦即直接使用相對或絕對路徑來執行，例如：

        /root/ls
        ./ls

      因為在同一個目錄中，而我們又知道在同一個目錄中的目錄符號為『 . 』，因此，就以上面的 ./ls 來執行也可以！這種執行方式以後您應該會很常見到才對！

    • 如果我有兩個 ls 檔案在不同的目錄中，例如 /usr/local/bin/ls 底下與 /bin/ls 那麼當我下達 ls 的時候，那個 ls 會被執行？那還用說，就找出 PATH 裡面那個目錄先被查詢，則那個目錄下的檔案就會被先執行了！

    • 咦！既然如此的話，那麼為何不要在 PATH 裡面加入 . 這個目錄，如此一來的話，不就可以直接在所在目錄執行檔案了嗎？因為 . 代表所在目錄嘛！是這樣沒錯！但是有沒有想過，如果某天，某個怪怪的使用者在 /tmp 裡面寫了一個 ls 的檔案，偏偏他是有害的檔案，那麼當你在 /tmp 底下執行 ls 時，怎麼辦？！沒錯，可能會『中標』，所以囉，為了安全起見，不建議將『 . 』加入 PATH 的搜尋當中！
檔案與目錄管理：
談了談目錄與路徑之後，再來討論一下關於檔案的一些基本管理吧！檔案與目錄的管理上，不外乎『顯示屬性』、『拷貝』、『刪除檔案』及『移動檔案或目錄』等等，由於檔案與目錄的管理在 Linux 當中是很重要的！尤其是每個人自己家目錄的資料也都需要注意管理！由於我們在執行程式的時後，系統預設有一個搜尋的路徑順序，如果有兩個以上相同檔名的執行檔分別在不同的路徑時，呵呵，就需要特別留意囉！這裡我們來談一談有關檔案與目錄的一些基礎管理部分吧！
ls 顯示檔案名稱、屬性等
cp 拷貝檔案或目錄
rm 刪除檔案或目錄
mv 移動檔案或目錄

  • ls
    語法：
    [root @test /root ]# ls [-ailS]
    參數說明：
    -a :全部的檔案都列出（連同隱藏檔）
    -i :印出 inode 的值
    -l :長的列出，連同檔案大小的資料等等
    -S :以檔案大小排序
    --color=never :不要顯示顏色
    --color=always :均顯示顏色
    --color=auto :由系統自行判斷！
    範例：
    [root @test /root]# ls -al
    total 48
    drwxr-x--- 4 root root 4096 Mar 10 00:37 .
    drwxr-xr-x 21 root root 4096 Mar 10 20:16 ..
    -rw------- 1 root root 524 Mar 10 00:40 .bash_history
    -rw-r--r-- 1 root root 24 Jun 11 2000 .bash_logout
    -rw-r--r-- 1 root root 266 Jun 11 2000 .bash_profile
    -rw-r--r-- 1 root root 249 Mar 6 20:50 .bashrc
    -rw-r--r-- 1 root root 210 Jun 11 2000 .cshrc
    drwx------ 2 root root 4096 Mar 9 11:06 .gnupg
    -rw------- 1 root root 524 Jan 16 14:37 .mysql_history
    drwx------ 2 root root 4096 Mar 9 11:06 .ssh
    -rw-r--r-- 1 root root 196 Jul 11 2000 .tcshrc
    -rw-r--r-- 1 root root 1126 Aug 24 1995 .Xresources
    [root @test /]# ls
    bin dev etc lib misc opt root tftpboot usr
    boot disk1 home lost+found mnt proc sbin tmp var
    [root @test /]# ls --color=never
    bin dev etc lib misc opt root tftpboot usr
    boot disk1 home lost+found mnt proc sbin tmp var
    [root @test /]# ls -al|more
    說明：
    還記得我們在解釋檔案的一些屬性與目錄的結構的那一章嗎？！對啦！我們使用的第一支指令就是 ls 啦！通常我們都需要知道這個檔案名稱『目錄』還是『檔案』？所以，我都喜歡使用『 ll』這個指令，其實那就是ls -l 的意思啦！不論如何，你都可以嘗試著執行這之指令來視察你的檔案！

    請注意呦！不要忘記你的資料的主要咚咚！尤其是前面幾個主要的屬性呦！另外，你有沒有發現如果在遠端以 telnet 或者是 putty 的連線程式登入主機的時後，由於 Linux 預設使用有顏色的方式顯示方式，但是像上表一樣，藍色的字樣根本就是很難看到！這個時候通常我都是使用『ls --color=never 』來丟掉顏色！那如果想讓 ls 預設沒有顏色的話，可以在 /root/.bashrc 或者是你的家目錄的 .bashrc 這個檔案中加入下面這一行：
    alias ls='ls --color=never'
    這樣就可以把顏色去到了！至於 alias 是在幹嘛的？我們到了 bash 這個 shell 的時候再來談吧！

  • cp
    語法：
    [root @test /root ]# cp [-drsu] [來源檔] [目的檔]
    參數說明：
    -d　　　　　：在進行 copy 的時候，如果是 copy 到 link 檔案，若不加任何參數，則預設情況中會將 link 到的原始檔案
                  copy 到目的地，若加 -d 時，則 link 檔案可原封不動的將 link 這個捷徑其拷貝到目的地！
    -r　　　　　：可以進行目錄的 copy 呦！
    -s ：做成連結檔，而不 copy 之意！與 ln 指令相同功能！
    -u, --update：如果來源檔比較新，或者是沒有目的檔，那麼才會進行 copy 的動作！可用於備份的動作中！
    範例：
    [root @test /root]# cp .bashrc bashrc <==將 .bashrc 拷貝成 bashrc 這個檔案！
    [root @test /root]# cp -r /bin /tmp/bin <==這個功能就好玩啦！這是用來 copy 整個目錄的參數！
    [root @test /root]# cp -s .bashrc bashrc <==將 .bashrc 建立一個連結檔，檔名為 bashrc
    [root @test /root]# cp -u /home/.bashrc .bashrc <==先檢查 /home/.bashrc 是否與 .bashrc 不同，如果不同的話就開始 copy 一份！如果相同則不做任何動作！
    說明：
    這個指令會常用到的呦！因為我們得常常需要 copy 資料呀！所以需要瞭解一下喔！如果你有些很大檔案的需要備份，偏偏這個檔案的更新率很低，那麼每次備份都需要在 copy 一份嗎？看來是不需要了！你可以使用『cp -u 來源檔 目的檔』來備份呦！如此一來，當檔案被改變過後，才會進行 copy 的動作！

  • rm
    語法：
    [root @test /root ]# rm [-fir] [檔名]
    參數說明：
    -i :提供使用者確認（這是預設值）
    -r :循環，就是一直殺掉，直到沒有東西為止的意思
    -f :force ，就是強力殺掉啦！
    範例：
    [root @test /root]# cp .bashrc bashrc<==建立一個新檔案， bashrc
    [root @test /root]# rm bashrc <==會顯示如下的提示：
    rm: remove `bashrc'?
    [root @test /root]# mkdir testing
    [root @test /root]# cp .bashrc testing
    [root @test /root]# rmdir testing
    rmdir: `testing': Directory not empty <==由於 testing 裡面有 .bashrc ，所以砍不掉！
    [root @test /root]# rm -rf testing <==持續刪除該目錄下的所有檔案與目錄
    說明：
    這是移除的指令，相當於 dos 下的 del 指令！這裡要注意的是，通常在 Linux 系統下，為了怕檔案被誤殺，所以都已經有 -i 這個參數， -i 是指每個檔案被殺掉之前都會讓使用者確認一次，以預防誤殺檔案！而如果要連目錄下的東西都一起殺掉的話，例如子目錄裡面還有子目錄時，那就要使用 -rf 這個參數了！不過，使用『 rm -rf 』這個指令之前，請千萬注意了，因為，該目錄或檔案『肯定』會被 root 殺掉！因為系統不會再次詢問你是否要砍掉呦！ 所以那是個超級嚴重的指令下達呦！得特別注意！不過，如果你確定該目錄不要了，那麼使用 rm -rf 來循環殺掉是不錯的方式！

  • mv
    語法：
    [root @test /root ]# mv [-u] [來源檔] [目的檔]
    參數說明：
    -u :同樣的，為 update 的簡寫，當來源檔比目的檔還新的時後才會動作！
    範例：
    [root @test /root]# cp .bashrc bashrc
    [root @test /root]# mv bashrc bashrc.old
    [root @test /root]# mv bashrc bashrc2 /tmp<==將 bashrc 與 bashrc2 移動到 /tmp 這個目錄下！請注意，最後一個才是最終的目標，其他的都是 SOURCE
    說明：
    這是搬移的意思！當你要移動檔案或目錄的時後，呵呵！這個指令就很重要啦！同樣的，你也可以使用 -u ( update )才測試新舊檔案，看看是否需要搬移囉！另外一個用途就是『變更檔名！』，我們可以很輕易的使用 mv 來變更一的檔案的檔名呢！

  • basename
    語法：
    [root @test /root ]# basename [目錄]
    參數說明：
    範例：
    [root @test /root]# basename /usr/local/etc
    etc
    這個指令會將後面的[目錄]僅擷取出最後面的那個目錄或檔案，
    以上面的例子來看， /usr/local/etc 不論 etc 是目錄或檔案，
    他都會被擷取出來，因為他是最後一個出現的咚咚！
    說明：
    這個指令頗有點意思∼他可以將一個目錄或檔案的最後一個咚咚秀出來！所以，未來如果你有要使用變數，並且取出最後一個資料(不論是檔案還是目錄)，那麼使用這個玩意兒就對啦！ ^_^

  • dirname
    語法：
    [root @test /root ]# dirname [目錄]
    參數說明：
    範例：
    [root @test /root]# dirname /usr/local/etc
    /usr/local
    恰恰與 basename 相反，他僅是秀出來前面的『目錄』部分喔！
    說明：
    這個指令恰恰與 basename 相反的啦！呵呵！很好玩吧！這部份也最常用在我們第三部分要講的 Shell 的學習中喔！用最多的地方應該是 scripts 啦！用這兩個寶貝蛋來擷取部分資料的內容！有用的很！
    • 觀看檔案內容：cat, tac, more, less, head, tail, nl,
    剛剛我們提到的都只是在於顯示檔案的外觀，或者是移動與複製一個檔案或目錄而已，那麼如果我們要視察一個檔案的內容時，該如何是好呢？！這裡有相當多有趣的指令可以來分享一下：最常使用的顯示檔案內容的指令可以說是 cat 與 more 及 less 了！此外，如果我們要查看一個很大型的檔案（好幾百MB時），但是我們只需要後端的幾行字而已，那麼該如何是好？呵呵！用 tail 呀，此外， tac 這個指令也可以達到！好了，說說各個指令的用途吧！
    cat 由第一行開始顯示檔案內容
    tac 從最後一行開始顯示，可以看出 tac 是 cat 的倒著寫！
    more 一頁一頁的顯示檔案內容
    less 與 more 類似，但是比 more 更好的是，他可以往前翻頁！
    head 只看頭幾行
    tail 只看尾巴幾行
    nl 顯示的時候，順道輸出 行號！
    od 以二進位的方式讀取檔案內容！
    底下我們來談一談每個指令的基本用法吧！
  • cat
    語法：
    [root @test /root ]# cat [-nAE]
    參數說明：
    -n: 顯示時，連行號印出螢幕上。
    -A: 將 DOS 下的 <tab> 與斷行字符都列出來！
    -E: 將 DOS 編輯的文件中，僅列出 斷行字符出來！
    範例：
    [root @test /root]# cat ~/.bashrc <==顯示 .bashrc 這個檔案
    # .bashrc

    # User specific
          aliases and functions
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
alias rm='rm
          -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls -l
          --color=never'

    [root @test /root]# cat ~/.bashrc -n <==顯示 .bashrc 並且加上行號！
    1 # .bashrc
    2
    3 # User specific aliases and functions
    4 PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    6 alias rm='rm -i'
    7 alias cp='cp -i'
    8 alias mv='mv -i'
    9 alias ll='ls -l --color=never'

    [root @test /root]# cat -A regexp.txt
    This is a cat, however, I need a dog.^M$
    I want to "Happy" and <Happy> and /Happy/ here.^M$
    OK! ^Ieverythins is OK^M$
    Now, I will eat my food^M$
    are you ^Ifinished your work^M$
    what do you 123 goto where^M$
    顯示出 DOS 檔案的幾個特殊符號，以上面檔案為例，
    可發現 ^M 為斷行符號，而每行的 $ 為行尾符號，
    至於 ^I 則是 <tab> 按鍵啦！

    說明：
    嘿嘿！ Linux 裡面有『貓』？！喔！不是的， cat 是 Concatenate （連續）的簡寫，主要的功能是將一個檔案的內容連續的印出在螢幕上面！例如上面的例子中，我們將重要的參數檔 .bashrc 印出來！如果加上 -n 的話，則每一行前面還會加上行號呦！cat 比較少用！畢竟當你的檔案內容的行數超過 40 行以上，嘿嘿！根本來不及看！所以，配合 more 或者是 |more 來執行比較好！此外，如果是一般的 DOS 檔案時，就需要特別留意一些奇奇怪怪的符號了，例如斷行與<tab>等，要顯示出來，就得加入 -A 之類的參數了！。

  • tac
    語法：
    [root @test /root ]# tac [檔名]
    參數說明：
    範例：
    [root @test /root]# tac ~/.bashrc <==發現了沒？反向印出呦！
    fi
    . /etc/bashrc
    if [ -f /etc/bashrc ]; then
    # Source global definitions

    alias
          h='history'
alias lm='ls
          -al|more'
alias ll='ls -l'
# alias ll='ls -l
          --color=never'
alias mv='mv -i'
alias cp='cp
          -i'
alias rm='rm -i'

    export PATH
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    # User specific aliases and functions

    # .bashrc

    說明：
    tac 這個好玩了！怎麼說呢？詳細的看一下， cat 與 tac ，有沒有發現呀！對啦！ tac 剛好是將 cat 反寫過來，所以他的功能就跟 cat 相反啦， cat 是由『第一行到最後一行連續顯示在螢幕上』，而 tac 則是『由最後一行到第一行反向在螢幕上顯示出來』，很好玩吧！

  • more
    語法：
    [root @test /root ]# more [檔名]
    參數說明：
    範例：
    [root @test /root]# more ~/.bashrc <==一頁一頁的顯示檔案內容
    [root @test /]# ls -al | more <==一頁一頁的將 ls 的內容顯示出來
    說明：
    more 真是個很有用的指令！我好喜歡呦！當你的檔案太大的時後，那麼使用 cat 將沒有辦法看清楚！這個時候你可以使用 more 來做動作！more 也可以用來做為管線的同時執行之用！例如你在執行 find 這個尋找的指令時，可以同時使用 |more ，則搜尋結果可以一頁一頁的列出呦！關於管線( pipe )的用法我們在 bash shell 的地方再來談！

  • less
    語法：
    [root @test /root ]# less [檔名]
    參數說明：
    範例：
    [root @test /root]# less ~/.bashrc
    說明：
    less 的用法比起 more 又更加的有彈性，怎麼說呢？在 more 的時候，我們並沒有辦法向前面翻，只能往後面看，但若使用了 less 時，呵呵！就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件，您瞧，是不是更容易使用來觀看一個檔案的內容了呢！？

    more 與 less 的用途與用法真的是很廣啦！首先，你可以在 more 與 less 的畫面中進行『搜尋』的工作！如何進行呢？我們以 less 來說明好了，如果你想要知道 /etc/man.config 這個檔案裡面有沒有一個叫做 GER 的大寫字眼，那麼可以：

    [root @test /root ]# less /etc/man.config
    按鍵說明：
    /word：在 /etc/man.config 這個檔案中搜尋 word 這個字串的所在
    q ：離開 less 的畫面

    然後在輸入 / 之後，游標會移動到最左下角等待輸入，這個時候您只要輸入你的字串之後，就會自動的幫你找出來該關鍵字囉！

  • head
    語法：
    [root @test /root ]# head [-n number] [檔名]
    參數說明：
    -n ：顯示 number 行
    範例：
    [root @test /root]# head ~/.bashrc <==預設情況下，顯示頭十行
    [root @test /root]# head -n 20 ~/.bashrc<==顯示頭二十行！
    說明：
    head 的英文意思就是『頭』啦，那麼這個東西的用法自然就是顯示出一個檔案的前幾行囉！沒錯！就是這樣！若沒有加上 -n 這個參數時，預設只顯示十行，若只要一行呢？那就加入『 head -n 1 filename 』即可！

  • tail
    語法：
    [root @test /root ]# tail [-n number] [檔名]
    參數說明：
    -n ：顯示 number 行
    範例：
    [root @test /root]# tail ~/.bashrc
    [root @test /root]# tail -n 5 ~/.bashrc <==只顯示最後面五行！
    說明：
    那麼有 head 自然就有 tail ( 尾巴 ) 囉！沒錯！這個 tail 的用法跟 head 的用法差不多類似，只是顯示的是後面幾行就是了！預設也是顯示十行，若要顯示非十行，就加 -n number 的參數！

    例題一：假如我想要顯示 ~/.bashrc 的第 11 到第 20 行呢？
    答：
    這個應該不算難，想一想，在第 11 到第 20 行，那麼我取前 20 行，再取後十行，所以結果就是：『 head –n 20 ~/.bashrc | tail –n 10 』，這樣就可以得到第 11 到第 20 行之間的內容了！但是裡面涉及到管線命令，需要在第三篇的時候才講的到！

  • nl
    語法：
    [root @test /root ]# nl [檔名]
    參數說明：
    範例：
    [root @test /root]# nl ~/.bashrc
    說明：
    那麼 nl 又是什麼？這也沒什麼，這個指令的用法跟 cat -n 的用法類似，也就是『可以印出行號』的指令來查看檔案啦！也是挺好用的！

  • od
    語法：
    [root @test /root ]# od [檔名]
    參數說明：
    範例：
    [root @test /root]# od ~/.bashrc
    0000000 020043 061056 071541 071150 005143 021412 052440 062563
    0000020 020162 070163 061545 063151 061551 060440 064554 071541
    0000040 071545 060440 062156 063040 067165 072143 067551 071556
    0000060 050012 052101 036510 027442 064542 035156 071457 064542
    0000100 035156 072457 071163 071457 064542 035156 072457 071163
    0000120 061057 067151 027472 071565 027562 067554 060543 027554
    0000140 061163 067151 027472 071565 027562 067554 060543 027554
    0000160 064542 035156 050044 052101 021110 062412 070170 071157
    0000200 020164 040520 044124 005012 066141 060551 020163 066562
    0000220 023475 066562 026440 023551 060412 064554 071541 061440
    0000240 036560 061447 020160 064455 005047 066141 060551 020163
    0000260 073155 023475 073155 026440 023551 021412 060440 064554
    0000300 071541 066040 036554 066047 020163 066055 026440 061455
    0000320 066157 071157 067075 073145 071145 005047 066141 060551
    0000340 020163 066154 023475 071554 026440 023554 060412 064554
    0000360 071541 066040 036555 066047 020163 060455 076154 067555
    0000400 062562 005047 066141 060551 020163 036550 064047 071551
    0000420 067564 074562 005047 021412 051440 072557 061562 020145
    0000440 066147 061157 066141 062040 063145 067151 072151 067551
    0000460 071556 064412 020146 020133 063055 027440 072145 027543
    0000500 060542 064163 061562 056440 020073 064164 067145 004412
    0000520 020056 062457 061564 061057 071541 071150 005143 064546
    0000540 000012
    0000541
    說明：
    好了，那麼如果有一個非 ASCII 的資料檔案呢？例如那個 binary 的檔案！使用 vi 根本就是看不著∼這個時候看來只有使用將整個資料以數值方法讀出來啦！那就是 od 這個指令來讀出來呦！這個東西可以用來輸出該資料為十進位、16進位等等的資料格式！不過這個東西對於工程師可能比較有用啦！因為印出來的東西都是數字或記憶體當中的資料∼∼
    • 連結檔的介紹：
    在開始介紹介紹連結檔 ( Link ) 之前，我們得先來瞭解一下什麼是 inode 這個東西？說實在的，這個東西真的很重要，不瞭解他的時候，很容易搞錯很多的咚咚！
    • 什麼是 inodes ？
      要提到 inode 之前，我們得先來瞭解一下硬碟的整體構造才行！硬碟裡面有多個硬碟盤組合在一起，而一個硬碟盤可以如下圖所示，硬碟盤為圓形的，其中，每一個硬碟盤上面都有個可以讀寫的磁頭( Head )，而當這個磁頭固定住，讓硬碟盤轉一圈，那麼那一個圓形的就是磁軌( Track )啦，而在硬碟內的幾個硬碟盤同半徑的那一圈的磁軌總和稱為磁柱( Cylinder )，而由圓心向外畫出直線，可以得到如下圖所示，那麼那一顆一顆的咚咚，就是硬碟的最小儲存物理量，我們稱為磁區( setctor )，一個磁區的物理量大約是 512 bytes ( 約 0.5K )。

        磁頭 ( Head ) ：可讀寫的金屬磁片；
        磁軌 ( Track ) ：讀寫頭轉一圈 ( 同心圓的一圈 ) 的量；
        磁區 ( Sector ) ：最小的物理儲存量。

      好了，知道了大體的硬碟構造之後，再來談一談怎麼硬碟分割( partition )呢？我們在進行硬碟分割的時候，最小都是以磁柱為單位進行分割的，那麼分割完成之後自然就是格式化( format )囉，在 Linux 裡面我們在進行格式化的時候必須要考慮到 Block 與 inode 的資訊，這個 block 還好理解，他是我們磁碟可以記錄的最小單位，是由數個 sector 所組成的，所以他的大小通常為 n*512 bytes ，例如 4K 。那麼 inode 是什麼？ Block 是記錄『檔案內容資料』的地區，而 inode 則是記錄『該檔案的屬性、及該檔案放置在哪一個 Block 之內』的資訊！所以，每個檔案都會佔用到至少一個 inode 。而當我們 Linux 系統要找到這個檔案時，他會先去搜尋 inode table 找到這個檔案的屬性及資料放置的地區，然後再到資料去找到資料存放的 Block 進而將資料取出利用。這個 inode 數目在一開始就會被設定好，他的設定方式通常是利用 ( 硬碟大小 / 一個容量 )，這個容量至少應該比 Block 要大一些較佳，例如剛剛的 Block 訂為 4K ，那麼 inode 可以訂為 8K 左右。所以，一顆 1GB 的硬碟，如果以 8K 來規劃他的 inode 數時，他的 inode 就會有 131072 個 inode 啦！而一個 inode 的大小為 128 bytes 這麼大！這麼一來的話，我們就可以清楚的知道了，那就是一個 partition 格式化為一個 filesystem 之後，基本上，他一定會有 inode table 與 data area 兩個區塊，一個用來記錄檔案的資訊與該檔案放置的 block 區塊，一個用來記錄檔案的內容！

      由於我們 Linux 在讀取資料的時候，是先查詢 inode table 以得到資料是放在那個 Block 裡面，然後再去該 Block 裡面讀取真正的資料內容！然後，那個 block 是我們在格式化硬碟的時候規定出來的一個值，這個 block 是由 2 的 n 次方個 sector 所集結而成的！所以，他是 0.5K 的倍數喔！假設我們 block 規劃為 4KBytes 好了，那麼由於一個 inode 與一個 block 最多均只紀錄一個檔案，所以，哈哈！如果你的一個檔案有 0.1 K bytes 這麼大時，你要曉得的是，由於你的 block 為 4K bytes ，因此，你就會有 3.9 Kbytes 的空間『浪費掉』喔！所以，當你在格式化硬碟的時候，請千萬注意到你的系統未來的使用方向喔！
      • 當 block 越小 ( 最小為 0.5K ) 、inodes 越多，可利用空間越多，但是大檔案寫入效率較差：適合檔案數量多但是檔案容量小的系統，例如 BBS 或者新聞群組 news 這方面的服務之系統；
      • 當 block 越大 ( 最大可到 16 * 0.5K 以上 ) 、 inodes 數越少，大檔案寫入效率較佳，但浪費的空間較多：適合檔案容量大的系統。
    • ln
      OK！知道了什麼是 inode 與他的功能之後，接著下來就要來介紹 link 這個玩意兒了！說到 link 其實也沒有什麼大不了的，說穿了，就真的有點像是 Windows 的『捷徑』一樣，不過， link 的功能要好的多呦！ Link 又分為 hard link 與 symbolic link 兩種方式，分別來談一談：

      • Hard Links：
        剛剛說過，當系統要讀取某一個檔案的時候，就會先去讀 inode table ，然後再根據 inode 的資訊到 block area 去將資料取出來利用！而 hard link 就是直接再建立一個 inode 連結到檔案放置的 block 區塊。也就是說，進行 hard link 的時候，實際上，你的檔案內容不會改變，只是你在查詢的時候，利用原來的 inode 與後來的 inode 均可被指定到該檔案放置的地點，因此兩個檔案的內容會是一樣的！所以讀取任何一個 inode 的結果都是存取在同一個檔案的內容就是了。不過，這樣一來就有個問題啦，因為 inode 是會連結到 block 區域去的，而『目錄』本身僅消耗 inode 而已，那麼一來的話， hard link 不就不能 link 目錄啦？對的！沒錯！ Hard link 有兩個最大的限制：

        1. 不能跨 filesystem ，因為不同的 filesystem 有不同的 inode table 嘛！
        2. 不能 link 目錄！

      • Symbolic Links：
        相對於 hard link ， Symbolic link 可就好理解多了，基本上，他就是在建立一個獨立的檔案，而這個檔案會讓資料讀取指向他 link 的那個檔案內容！由於只是利用檔案來做為指向的動作，所以，當來源檔被刪除之後，symbolic link 的檔案會『開不了』，會一直說『無法開啟某檔案！』

      所以，看樣子，似乎 hard link 比較安全，因為即使某一個 inode 被殺掉了，只要有任何一個 inode 存在，那麼該檔案就不會不見！不過，不幸的是，由於 Hard Link 的限制太多了，包括無法做『目錄』的 link ，所以在用途上面是比較受限的！反而是 Symbolic Link 的使用方向較廣喔！好了，說的天花亂墜，看您也差不多快要昏倒了！沒關係，實作一下就知道怎麼回事了！

      特別留意，底下的案例中，我們是將系統的設定檔 copy 到 /root/test 底下進行測試用的，請不要在 /etc/ 底下做，未來我們的工作目錄都會在 /root/test 底下進行，這有個好處，是可以讓您清楚的知道，這是用來 test 用的啦！
    語法：
    [root @test /root ]# ln [-s] [來源檔] [目的檔]
    參數說明：
    -s :提供連結檔的連結！如果直接以 ln 不加任何參數的話，那麼就屬於 hard link 囉！
    範例：
    [root @test /root]# mkdir test
    [root @test /root]# cd test
    [root @test /test]# cp /usr/bin/passwd .

    0. 原本的資訊：
    [root @test /test]# ll
    -rw-r--r-- 1 root root 13476 Jun 26 11:31 passwd
    [root @test /test]# du -k <==查看該目錄下的佔用硬碟空間
    20

    1. Hard Link 資訊：
    [root @test /test]# ln passwd passwd-hard
    [root @test /test]# ll
    total 32
    -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd
    -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard
    注意看，上面那個數字變成 2 囉！這就是佔用掉 inodes 囉！
    [root @test /test]# du -k
    20 <==注意看，容量並沒有變大！因為是 link 檔案呀！

    2. Symbolic Link 資訊：
    [root @test /test]# ln -s passwd passwd-soft; ll
    -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd
    -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard
    lrwxrwxrwx 1 root root 6 Jun 26 11:37 passwd-sofe -> passwd
    注意囉！該 Symbolic Link 的檔案是有容量的呦！
    注意囉， passwd-soft 會指到另外一個檔案去，而且，最前面屬性顯示 l ，
    此外，他是一個獨立的檔案！先殺掉 passwd 後，我們分別 more 一下內容：

    3. 用 more 來試試看是怎樣？！
    [root @test test]# rm passwd
    rm: remove regular file `passwd'? y
    [root @test test]# more passwd-hard
    ………(正常顯示)
    [root @test test]# more passwd-soft
    passwd-soft: No such file or directory

    說明：
    要注意囉！如果不加任何參數的話，那麼就是 Hard Link 囉！如同上面的情況，增加了 hard link 之後，可以發現 link 那一欄屬性增加了！而如果這個時候砍掉 passwd 會發生什麼事情呢？呵呵！ passwd-hard 的內容還是會跟原來 passwd 相同，但是 passwd-soft 就會找不到該檔案啦！就是這樣！瞭解了嗎？！還有，跟 cp 也不一樣呦！因為雖然 Hard Link 的檔案看起來是有容量的，但是基本上還是指向原來的檔案，所以囉，整體容量是沒有增大的啦！

    而如果使用 -s 的參數時，就做成差不多是 Windows 底下的『捷徑』的意思（Symbolic Link，較常用！）不過，需要特別注意的是， Linux 的 link 與 Windows 的捷徑是不一樣的東西！舉個例子說，當你在 Windows 建立一個捷徑時，你可以在這個捷徑內修改任何資料，而你的原始資料並不會跟著變！不過，當你修改 Linux 下的 link 檔案時，則更動的其實是『原始檔』，呵呵，所以不論你的這個原始檔被連結到哪裡去，只要你修改了連結檔，呵呵！原始檔就跟著變囉！以上面為例，由於你使用 -s 的參數建立一個名為 passwd-soft 的檔案，則你修改 passwd-soft 時，其內容與 passwd 完全相同，並且，當你按下儲存之後，被改變的將是 passwd 這個檔案！

    此外，如果你做了底下這樣的連結：
    ln –s /bin /root/bin
    那麼如果你進入 /root/bin 這個目錄下，『請注意呦！該目錄其實是 /bin 這個目錄，因為你做了連結檔了！』所以，如果你進入 /root/bin 這個剛剛建立的連結目錄，並且將其中的資料殺掉時，嗯！ /bin 裡面的資料就通通不見了！這點請千萬注意！並不是 /root 底下的資料都是 root 的！還需要注意一下該屬性才行！

    基本上， Symbolic link 的用途比較廣，所以您要特別留意 symbolic link 的用法呢！未來一定還會常常用到的啦！
    檔案與目錄權限：
    由 Linux 檔案屬性 的內容我們可以知道一個檔案有若干個屬性，包括 ( r, w, x ) 等基本屬性，及是否為目錄 (d) 與檔案 (-) 或者是連結檔 (l) 等等的屬性！那麼要修改屬性的方法在前面也約略提過了，這裡再加強補充一下！此外，由於 Linux 還可以設定其他的系統安全屬性，使用 chattr 來設定，而以 lsattr 來查看，最重要的屬性就是可以設定其不可修改的特性！讓連檔案的擁有者都不能進行修改！這個屬性可是相當重要的，尤其是在安全機制上面（ security ）！
    chown 改變檔案的擁有人
    chgrp 改變檔案的所屬群組
    chmod 改變檔案的可寫、可讀、可執行等屬性
    umask 改變預設的建立檔案或目錄時的屬性
    chattr 改變檔案的特殊屬性
    lsattr 顯示檔案的特殊屬性！
    • chown
      語法：
      [root @test /root ]# chown [-R] user:group [目錄名稱]
      參數說明：
      -R :循環的將該目錄下的所有檔案都改成 user 與 group 的名稱！
      範例：
      [root @test /root]# mkdir /home/test/testing <==在 /home/test 這個家目錄中建立一個名為 testint 的子目錄
      [root @test /root]# cp * /home/test/testing
      [root @test /root]# chown test /home/test/testing
      [root @test /root]# chown -R test:test /home/test/testing<==將該目錄下的所有目錄或檔案均變為 test 擁有
      說明：
      前一個章節才剛講完，應該不會就這樣忘記了吧？！由於 chown 的使用範圍較廣，所以這裡再次的給他複習一下 chown 就好， chgrp 請回前一章內容觀看呦！

      記得檔案有『擁有人』及『擁有群組』吧，這個 chown 就是在改變擁有者的指令。剛接觸 Linux 的朋友最容易犯的一個錯誤在哪裡呢？就是以 root 的身份 copy 一個檔案（或路徑）給一般使用者（假設為 test ）時，忘記將該檔案的所有人改成 test 了！由於複製者是 root 所以該檔案也會是 root 所有！那麼 test 當然也就不能修改該檔案了！

      在上面的例子中，『 chown test /home/test/testing 』這個指令只會將該目錄變成 test 的，但是 group 仍然是 root 的呦！所以你可以使用『 chown test:test /home/test/testing 』，連使用者群組都給他改變一下囉！不過需要注意的是，這兩個指令都只改變了『目錄』的所有權而已！那麼在這個目錄下的東西也要改變的話，該如何？！呵呵，就使用 -R 這個參數即可！

    • chmod
      語法：
      [root @test /root ]# chmod [-R] [parameter] [目錄名稱]
      參數說明：
      -R :循環的一直將該目錄的檔案均改變之！
      範例：
      [root @test /root]# chmod 777 .bashrc
      說明：
      還記得在『檔案屬性與系統』那一章吧！一個檔案或目錄至少有九個屬性，三個三個一組，共分為三組！而可以使用數字來當作變換屬性的參考依據！各屬性如下：
      r:4
      w:2
      x:1
      舉個例子來說，當一個屬性為『-rwxr-xr--』時，那是幾分呢？！我們可以將他看成如下『-[rwx][r-x][r--]』三組，所以分數就變成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦！這樣會算嗎？！OK！測試一下，底下的分數為幾分：
      -r-xr-xr-x
      -rwxrw----
      如果你可以算出『555』與『760』，呵呵！那麼你就應該會算囉！所以，如果你要將 .bashrc 設定成所有人都可以讀取的話，就下達『 chmod 777 .bashrc 』吧！其中需要特別注意的是，通常我們都會允許個人網頁的設定！那麼由於個人網頁預設是記錄在/home/userID/public_html底下，偏偏 /home/userID 的屬性為『drwx------』根本就不允許任何人進入！所以，你最少要將你的目錄設定成『drwx--x--x』 才可以！當然也可以設定成『drwxr-xr-x』！不過不建議設定成『777』呦！

    • umask
      OK！那麼現在我們知道如何建立或者是改變一個目錄或檔案的屬性了，不過，您知道當你建立一個新的檔案或目錄時，他的預設屬性會是什麼嗎？呵呵！那就與 umask 有關了！那麼 umask 是在搞什麼呢？基本上， umask 就是指定『目前使用者在建立檔案或目錄時候的屬性預設值』，那麼如何得知或設定 umask 呢？他的指定條件以底下的方式來指定：
      語法：
      [root @test root]# umask
      0022
      [root@vbird test]# umask 002 <==後面接 3 個數字！
      [root@vbird test]# umask
      0002
      說明：
      查看 umask 數值為直接輸入 umask 即可，而設定呢？沒錯！就是 umask 之後接三個數字！那麼如何來指定呢？主要還是跟 Linux 的檔案屬性（那九個屬性， r, w, x ）有關的，而且是以分數的那一個關係為例的，而有底下的規則為輔：

      • 若使用者建立為『檔案』則預設『沒有可執行 ( x ) 項目』，亦即只有 rw 這兩個項目，也就是最大為 666 分
        --rw-rw-rw-
      • 若使用者建立為『目錄』，則由於 x 與是否可以進入此目錄有關，因此預設為所有權限均開放，亦即為 777 分
        drwxrwxrwx

      那麼 umask 指定的是『該預設值需要減掉的權限！』因為 r、w、x 分別是 4、2、1 分，所以囉！也就是說，當要拿掉能寫的權限，就是輸入 2 分，而如果要拿掉能讀的權限，也就是 4 分，那麼要拿掉讀與寫的權限，也就是 6 分，而要拿掉執行與寫入的權限，也就是 3 分，這樣瞭解嗎？請問您， 5 分是什麼？呵呵！就是讀與執行的權限啦！如果以上面的例子來說明的話，因為 umask 為 002 ，所以 user, group 並沒有被拿掉屬性，不過 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 )，那麼由於當使用者：

      • 建立檔案時：(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
      • 建立目錄時：(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x

      不相信嗎？你只要使用 touch test 然後看看這個 test 的檔案屬性，就可以知道了！那麼如何看你這個使用者目前的 umask 呢？直接下達 umask 即可！實作看看先：

      [root@vbird test]# umask
      0002
      [root@vbird test]# touch test1
      [root@vbird test]# mkdir test2
      [root@vbird test]# ls -l
      -rw-rw-r-- 1 root root 0 Oct 22 00:00 test1
      drwxrwxr-x 2 root root 4096 Oct 22 00:00 test2/
      發現了什麼？呵呵！ Test1 的屬性為 666-002 = 664 ！正確嗎？是的！正確！
      而 test2 這個目錄呢？就是 777-002 = 775 ！也正確！

      [root@vbird test]# umask 003
      [root@vbird test]# touch test3
      [root@vbird test]# mkdir test4
      [root@vbird test]# ll
      -rw-rw-r-- 1 root root 0 Oct 22 00:03 test3
      drwxrwxr-- 2 root root 4096 Oct 22 00:03 test4/
      嘿！屬性又跟剛剛的不一樣囉！仔細推敲一下為什麼呦！test3 666-003 =663，這是怎麼一回事？！ 663 應該是 -rw-rw--wx 才對啊！怎麼會是上面的屬性！呵呵！這裡就要特別的給他強調了！『盡量不要以數字相加減啦！』容易造成類似上面的問題！你應該要這樣想(-rw-rw-rw-) - (--------wx)=-rw-rw-r--這樣就對啦！瞭解了嗎？不要用十進位的數字喔！夠能力的話，用二進位來算，不曉得的話，用 rwx 來算喔！ ^_^

      由上面的例子您應該很輕易的就可以發現 umask 的用途！而這個 umask 可以在 /etc/bashrc 裡面進行修改喔！預設的情況之下， root 的 umask 為 022 而一般使用者則為 002 ，因為可寫的權限蠻嚴重的，因此預設都會拿掉這個權限！此外，因為 root 比較重要！所以為了安全的需求，其同群組的寫入屬性就被拿掉了！這東西對於安全性也有一定程度的貢獻呦！

    • chattr
      語法：
      [root @test /root ]# chattr [+-=][ASacdistu] [檔案或目錄名稱]
      參數說明：
      +-=　：分別為 [+ 增加] [- 減少] [= 設定] 屬性的意思
      A　　：當設定了 A 這個屬性時，這個檔案(或目錄)的存取時間 atime (access) 將不可被修改，
             可避免例如手提式電腦容易有磁碟 I/O 錯誤的情況發生！
      S　　：這個功能有點類似 sync 的功能！就是會將資料同步寫入磁碟當中！可以有效的避免資料流失！
      a　　：當設定 a 之後，這個檔案將只能增加資料，而不能刪除，只有 root 才能設定這個屬性。
      c　　：這個屬性設定之後，將會自動的將此檔案『壓縮』，在讀取的時候將會自動解壓縮出來！
             但是在儲存的時候，將會先進行壓縮之後再儲存（看來對於大檔案似乎蠻有用的！）
      d　　：當 dump (備份)程序被執行的時候，設定 d 屬性將可使該檔案(或目錄)具有 dump 功效！
      i　　：這個 i 可就很厲害了！他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料！』
             對於系統安全性有相當大的助益！
      j　　：當使用 ext3 這個檔案系統格式時，設定 j 屬性將會使檔案在寫入時先記錄在 journal 中！
             但是當 filesystem 設定參數為 data=journalled 時，由於已經設定了日誌了，所以這個屬性無效！
      s　　：當檔案設定了 s 參數時，他將會被完全的移除出這個硬碟空間。
      u　　：與 s 相反的，當使用 u 來設定檔案時，則資料內容其實還存在磁碟中，可以使用來 undeletion.
      範例：
      [root @test /root]# chattr +i /etc/shadow<==呵呵！如此則無法更動這個檔案囉！
      [root @test /root]# chattr -i /etc/shadow <==解除該屬性！
      說明：
      這這個指令是重要的，尤其是在系統的安全性上面！由於這些屬性是隱藏的性質，所以需要以 lsattr 才能看到該屬性呦！其中，個人認為最重要的當屬 +i 這個屬性了，因為他可以讓一個檔案無法被更動，對於需要強烈的系統安全的人來說，真是相當的重要的！裡頭還有相當多的屬性是需要 root 才能設定的呢！此外，如果是 log file 這種的登錄檔，就更需要 +a 這個可以增加，但不會被殺掉的參數了！怎樣？很棒吧！未來提到登錄檔的認知時，我們再來聊一聊如何設定他吧！

    • lsattr
      語法：
      [root @test /root ]# lsattr [-aR]
      參數說明：
      -a　：將隱藏檔的屬性也秀出來；
      -R　：連同子目錄的資料也一併列出來！
      範例：
      [root @test /root]# chattr +i .bash_logout
      [root @test /root]# lsattr -a
      -------------- ./.
      -------------- ./..
      ---i---------- ./.bash_logout
      -------------- ./.bash_profile
      -------------- ./.bashrc
      -------------- ./.emacs
      -------------- ./.screenrc
      說明：
      這兩個指令在使用上必須要特別小心，例如：某天你心情好，突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成為具有 i 的屬性，那麼過了若干天之後，你突然要新增使用者，卻一直無法新增！別懷疑，趕快去將 i 的屬性拿掉吧！
    搜尋檔案或目錄：
    檔案的搜尋可就厲害了！因為我們常常需要知道那個檔案放在哪裡，所以來談一談怎麼搜尋吧！在 Linux 底下也有相當優異的搜尋系統呦！通常 find 不很常用的！因為速度慢之外，也很操硬碟！通常我們都是先使用 whereis 或者是 locate 來檢查，如果真的找不到了，才以 find 來搜尋呦！為什麼呢？因為 whereis 與 locate 是利用資料庫來搜尋資料，所以相當的快速，而且並沒有實際的搜尋硬碟，比較省時間啦！
    which 查看可執行檔案的位置
    whereis 查看檔案的位置
    locate 配合資料庫查看檔案位置
    find 實際搜尋硬碟去查詢檔案名稱
  • which
    語法：
    [root @test /root ]# which [檔案名稱]
    參數說明：
    範例：
    [root @test /root]# which passwd
    /usr/bin/passwd
    說明：
    which 的基本功能是『藉由 PATH 這個環境變數的內容，去該路徑內尋找可執行檔』，所以基本的功能在於『尋找執行檔』囉！

  • whereis
    語法：
    [root @test /root ]# whereis [-bmsu] [目錄名稱]
    參數說明：
    -b :只找 binary 的檔案
    -m :只找在說明檔 manual 路徑下的檔案
    -s :只找 source 來源檔案
    -u :沒有說明檔的檔案！
    範例：
    [root @test /root]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2
    將 passwd 相關字眼的檔案或目錄都列出來！

    [root @test /root]# whereis -b passwd
    passwd: /usr/bin/passwd /etc/passwd
    僅列出binary 檔案！

    [root @test /root]# whereis -m passwd
    passwd: /usr/share/man/man1/passwd.1.bz2
    僅搜尋 man page 所在的目錄！

    說明：
    如果使用 find 太麻煩，而且時間花用的很大！（因為如果你的硬碟比較老舊的話，嘿嘿！有的等的！）這個時候 whereis 就相當的好用了！另外， whereis 可以加入參數來找尋相關的資料，例如如果你是要找可執行檔（ binary ）那麼加上 -b 就可以啦！例如上面的範例針對 passwd 這支程式來說明！如果不加任何參數的話，那麼就將所有的資料列出來囉！那麼 whereis 到底是使用什麼咚咚呢？為何搜尋的速度會比 find 快這麼多？！其實那也沒有什麼！這是因為 Linux 系統會將系統內的所有檔案都記錄在一個資料庫檔案裡面，而當使用 whereis 或者是底下要說的 locate 時，都會以此資料庫檔案的內容為準，因此，有的時後你還會發現使用這兩個執行檔時，會找到已經被殺掉的檔案！這就是因為他是一個『資料庫』檔案呀！另外，基本上 Linux 每天會針對 Linux 主機進行 updatedb （就是那一個資料庫檔案囉！）的動作，你可以在 /etc/cron.weekly/slocate.cron 這個檔案找到相關的機制呦！當然，也可以直接使用 /usr/bin/updatedb 來更新資料庫檔案呢！

  • locate
    語法：
    [root @test /root ]# locate [目錄名稱]
    參數說明：
    範例：
    [root @test /root]# locate root
    ……一大堆跟 root 有關字眼的檔案都出來了 @_@

    [root @test /root]# updatedb <==立刻更新資料庫

    說明：
    locate 的使用方式就更簡單了！直接鍵入你要找的檔名即可！但是，這個東西還是有使用上的限制呦！為什麼呢？您會發現使用 locate 來尋找資料的時候特別的快，這是因為 locate 尋找的資料是由『已建立的資料庫 /var/lib/slocate』裡面的資料所搜尋到的，所以不用直接在去硬碟當中存取資料，呵呵！當然是很快速囉！那麼有什麼限制呢？就是因為他是經由資料庫來搜尋的，而資料庫的建立預設是在每個禮拜執行一次，所以當您新建立起來的檔案，卻還在資料庫更新之前搜尋該檔案，那麼 locate 會告訴您『找不到！』呵呵！因為必須要更新資料庫呀！

    那麼我到底要建立哪些資料庫呢？是否全部都要建立？似乎不需要，這個時候，你可以自己選擇需要建立檔案資料庫的目錄呢！在 /etc/updatedb.conf 這個內即可設定了！

    [root @test root]# more /etc/updatedb.conf
    ## Linux-Mandrake configuration.
    # 由何處開始查詢資料，當然是由根目錄啦！所以填入 / 即可
    FROM="/"

    # 哪些目錄不想要建立檔案搜尋資料，呵呵！就是那些不要的資料嘛！
    # 忘記的話，記得回上一章去看看內容，就知道為何如此設定了！
    PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

    # 安全等級
    # 0 代表關閉安全檢驗，速度上面較快速，但較不安全；
    # 1 啟動安全簡易，這是系統的預設值；
    SECURITY="1"

    # 查詢的時候是否要由螢幕輸出？當然不要，否則多麻煩?
    VERBOSE="NO"

    # 資料庫所在處！這是預設值，不要隨意移動，否則會找不到！
    DATABASE="/var/lib/slocate/slocate.db"

    # 哪些檔案系統我們也不搜尋建立？就是光碟啦、非 Linux 的檔案格式啦，
    # 我們都不要進行搜尋資訊的建立啦！
    PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

  • find
    語法：
    [root @test /root ]# find [路徑] [參數]
    參數說明：
    1. 時間：
    -atime n :在 n*24 小時內被 access 即存取過的檔案列出來！
    -ctime n :在 n*24 小時內被 changed 即改變、新增的檔案或目錄印出
    -mtime n :在 n*24 小時內被 modified 即修改過的檔案印出
    -newer file :比 file 還要新的檔案就列出來！
    2. 使用名稱：
    -gid n :尋找 群組 ID 為 n 的檔案
    -group name :尋找群組名稱為 name 的檔案
    -uid n :尋找擁有者 ID 為 n 的檔案
    -user name :尋找使用者名稱為 name 的檔案
    -name file :尋找檔名為 file 的檔案名稱（可以使用萬用字元）
    -type type :尋找檔案屬性為 type 的檔案，type 包含了 b, c, d, p, l, s，
    這些與前一章的屬性相同！例如 l 為 Link 而 d 為路徑之意！
    範例：
    [root @test /root]# find / -name testing <==尋找檔名為 testing
    [root @test /root]# find / -name 'test*' <==尋找檔名包含 test 的！
    [root @test /root]# find . -ctime 1 <==尋找目前目錄下一天內新增的目錄或檔案
    [root @test /root]# find /home/test -newer .bashrc <==尋找 /home/test 目錄下比 .bashrc 還要新的檔案
    [root @test /root]# find /home -user test <==尋找 /home 底下擁有者為 test 的檔案
    [root @test /root]# find /dev -type b <==尋找 /dev 這個目錄下，檔案屬性為 b 的檔案
    說明：
    如果你要尋找一個檔案的話，那麼使用 find 會是一個不錯的主意！他可以根據不同的參數來給予檔案的搜尋功能！例如你要尋找一個檔名為 httpd.conf 的檔案，你知道他應該是在 /etc 底下，那麼就可以使用『 find /etc -name httpd.conf 』嚕！那如果你記得有一個檔案檔名包含了 httpd ，但是不知道全名怎辦？！呵呵，就用萬用字元 ＊ 吧，如上以：『 find /etc -name '*httpd*' 』就可將檔名含有 httpd 的檔案都列出來囉！不過，由於 find 在尋找資料的時後相當的耗硬碟！所以沒事情不要使用 find 啦！有更棒的指令可以取代呦！那就是 whereis 與 locate 囉！！
    • SetUID, SetGID, Sticky bit 與 file 指令
    • SUID 與 SGID：
      其實，說到這裡之前，應該先說明一下 UID (user ID)與 GID (Groupt ID)的！基本上， Linux 認得的帳號只是一堆數字而已！而由於我們每個檔案中同時含有『使用者』與『使用者群組』的屬性，因此，就有所謂的 UID 與 GID 囉！ UID 代表我們的使用者『代號』而 GID 則是群組的『代號』。你可以使用『 more /etc/passwd 』這個指令來看一下你的系統當中的所有帳號，然後你會注意到每行的第三、四個欄位（以 : 分隔）為數字，那個就是 UID 與 GID 了，您更會注意到的是， root 的 UID 與 GID 都是 0 ！因此，當你建立了一個帳號，而你將該帳號的 UID 與 GID 都改為零，呵呵！那個帳號的使用者就具有 root 的身份囉！

      那麼什麼是 SUID 與 SGID 呢？！在說明之前我們先來以一般身份使用者 ( 還記得安裝的時候曾經增加一個 test 帳號的一般身份使用者嗎？對啦！用他！然後呢？直接在鍵盤上按下 [Alt] + [Ctrl] + [F2] 到第二個終端機呀！) test 的身份登入，再來看一個檔案的內容：

      [test@test test]$ ls -l /usr/bin/passwd
      -r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd

      看到了 /usr/bin/passwd 檔案的前面屬性了嗎？怎麼會有 s 的屬性在原本的 x 呀！？那個就是所謂的 SUID 了！如果是『 -r-xr-s--x 』時，那麼 s 就成為所謂的 SGID 了！

        『當一個檔案具有 SUID 的時候，同時 other 的群組具有可執行的權限，那麼當 others 群組執行該程式的時候， other 將擁有該檔案的 owner 的權限！』。

      [test@test test]$ ls -l /usr/bin/passwd /etc/shadow
      -r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd
      -rw------- 1 root root 2423 Jun 25 14:29 /etc/shadow

      我們以帳號的密碼檔來說明好了！注意上面的範例囉！可以看到的是， /etc/shadow 的權限是『只有 root 才能存取』呦！那麼你會不會覺得很奇怪？明明我的一般使用者可以自己修改密碼呀！對不對？那麼修改密碼一定跟 /etc/shadow 這個檔案有關，那麼怎麼回事呀！？使用者是如何修改 /etc/shadow 這個檔案的呢？嗯！沒錯！就是使用 SUID 的功能啦！上面的例子說明了， /usr/bin/passwd 這個檔案具有 SUID 的屬性，那麼當使用者使用 /usr/bin/passwd 這個執行檔時，在執行 pass word 修改的期間就具有 /usr/bin/passwd 這個檔案的擁有者 root 的所屬權限囉！所以，所以當一般使用者執行 passwd 的時候，將具有 root 的權限，所以他們也可以更改 /etc/shadow 的內容囉！那麼由此也可以知道，由於這個 Set UID ( SUID ) 的主要功能是在『某個檔案執行的期間具有檔案擁有者的權限』，因此， s 就是替代上面提到的 x 這個可執行的位置囉！那萬一該檔案並沒有 x 的屬性呢？哈哈！問的好！那麼該檔案的屬性就會將小寫的 s 變成大寫的 S 啦！ ( 這裡即使暫時不瞭解也沒有關係，等到過一陣子再回來看一看，你就會瞭解啦！ )

      不過，由此也知道 SUID 與 SGID 的問題所在，沒錯！就是太不安全了！如果你有一個檔案具有 root 的權限，那麼當開啟了 SUID 的時候，嘿嘿！夠你瞧的了！！因此上，在變更一個檔案成為具有 SUID 或 SGID 的情況時，必須要特別小心呢！知道乎！？

    • Sticky bit：
      OK！接著下來，我們要來看一下，既然有 SUID 與 SGID ，那麼為什麼沒有在最末位出現 s 取代 x 呢？呵呵！這當然沒有必要啦！因為那是屬於 others 的權限，你的檔案如果是任何人皆可執行的話，那麼本來他們就具有權限啦！幹嘛還要設定 s 的屬性！？不過，這裡卻真的有另一個屬性出現了，那就是 Sticky bit 的屬性 ( t ) ！這個屬性的最大用處在於『具有 sticky bit 屬性的該”目錄”下的檔案，其檔案或目錄只有檔案擁有者及 root 才有權力刪除！』這樣是否可以瞭解了呢？嘿嘿！沒錯！在我們系統裡面本來就預設有一個啦！那就是 /tmp 這個目錄！

      [test@test test]$ ls -l /
      drwxrwxrwt 2 root root 4096 Jul 18 13:08 tmp

      如何，發現了吧！雖然該目錄具有所有人皆可讀寫的權限，但是確有一個 t 出現了，那就是所謂的 sticky bit 囉！在該目錄裡面雖然你可以建立與修改任何檔案，但是卻僅能刪除自己建立的檔案呢！除非你是 root ！你可以這樣試試看囉：

        1. 以 root 登入系統，並且進入 /tmp 當中；
        2. touch test，並且更改 test 權限成為 777 ；
        3. 以一般使用者登入，並進入 /tmp；
        4. 嘗試刪除 test 這個檔案！

      如何！？發現了吧！！

    • SUID, SGID, Sticky bit 的設定方法：
      前面介紹過 SUID 與 SGID 的功能，那麼如何開啟檔案使成為具有 SUID 與 SGID 的權限呢？！這就需要剛剛的數字更改權限的方法了！現在你應該已經知道數字型態個更改權限方式為『三個數字』的組合，那麼如果在這三個數字之前再加上一個數字的話，那最前的面數字就代表這幾個屬性了！ ( 註：通常我們使用 chmod xyz filename 的方式來設定 filename 的屬性時，則是假設沒有 SUID, SGID 及 Sticky bit 啦！ )

      • 4 為 SUID
      • 2 為 SGID
      • 1 為 Sticky bit

      假設要將一個檔案屬性改為『-rwsr-xr-x』時，由於 s 在使用者權限中，所以是 SUID ，因此，在原先的 755 之前還要加上 4 ，也就是：『 chmod 4755 filename 』來設定！此外，還有大 S 與大 T 的產生喔！參考底下的範例啦！

      [root@test tmp]# touch test
      [root@test tmp]# ll
      total 0
      -rw-r--r-- 1 root root 0 Feb 6 23:08 test
      [root@test tmp]# chmod 4755 test
      [root@vbird tmp]# ll
      total 0
      -rwsr-xr-x 1 root root 0 Feb 6 23:08 test*
      [root@test tmp]# chmod 6755 test
      [root@test tmp]# ll
      total 0
      -rwsr-sr-x 1 root root 0 Feb 6 23:08 test*
      [root@test tmp]# chmod 1755 test
      [root@test tmp]# ll
      total 0
      -rwxr-xr-t 1 root root 0 Feb 6 23:08 test*
      上面的三個例子應該都很好說明啊！就是直接將 x 以 s 或者是 t 來取代就是了！也就是分別為 SUID, SGID 及 sticky bit 的設定方法啦！

      [root@test tmp]# chmod 7666 test
      [root@test tmp]# ll
      total 0
      -rwSrwSrwT 1 root root 0 Feb 6 23:08 test
      這個例子就要特別小心啦！怎麼會出現大寫的 S 與 T 呢？不都是小寫的嗎？因為 s 與 t 都是取代 x 這個參數的，但是你有沒有發現阿，我們是下達 7666 喔！也就是說， user, group 以及 others 都沒有 x 這個可執行的標誌 ( 因為 666 嘛！ )，所以，這個 S, T 代表的就是『空的』啦！怎麼說？ SUID 是表示『該檔案在執行的時候，具有檔案擁有者的權限』，但是檔案擁有者都無法執行了，哪裡來的權限給其他人使用？當然就是空的啦！ ^_^

    • file
      語法：
      [root @test /root ]# file [檔名]
      參數說明：
      範例：
      [root @test /root]# file ~/.bashrc
      /root/.bashrc: ASCII text <==表示這個檔案是 ASCII 純文字檔

      [root @test /root]# file /usr/bin/passwd
      /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
      嘿！還可以看到是否具有 SUID 的權限呢！

      說明：
      file 這個指令也蠻好用的，可以用來查看這個檔案的類型，例如 ASCII 格式檔，或者是 binary 的檔案等等，還可以用來觀看檔案是否被加入 SUID 等等的資訊！並且，也同時提供了是否有使用動態函式庫的資訊！相當的好用！
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • 什麼是絕對路徑與相對路徑
      答：
        絕對路徑的寫法為由 / 開始寫，至於相對路徑則不由 / 開始寫！
    • 如何更改一個目錄的名稱？例如由 /home/test 變為 /home/test2
      答：
        mv /home/test /home/test2
    • PATH 這個環境變數的意義？
      答：
        這個是用來指定執行檔執行的時候，檔案搜尋的目錄路徑。
    • umask 有什麼用處與優點？
      答：
        umask 可以拿掉一些屬性，因此，適當的定義 umask 有助於系統的安全，因為他可以用來建立預設的目錄或檔案的權限。
    • 當一個使用者的 umask 分別為 033 與 044 他所建立的檔案與目錄的權限為何？
      答：
        在 umask 為 033 時，則預設是拿掉 group 與 other 的 w(2)x(1) 權限，因此權限就成為『檔案 –rw-r--r-- ， 目錄 drwxr--r-- 』而當 umask 044 時，則拿掉 r 的屬性，因此就成為『檔案 -rw--w--w-，目錄 drwx-wx-wx』
    • 什麼是 SUID ？
      答：
        當一個指令具有 SUID 的功能時，則當其他人使用這個指令時，該程序將具有指令擁有者的權限。
    • 當我要查詢 /usr/bin/passwd 這個檔案的一些屬性時，可以使用什麼指令來查詢？
      答：
        ls –al, file, lsattr
    • 嘗試用 find 找出目前 linux 系統中，所有具有 SUID 的檔案有哪些？
      答：
        find / -type f –perm –04000 -print
    2002/06/26：第一次完成
    2003/02/06：重新編排與加入 FAQ
    2003/02/07：加入 basename 與 dirname 的說明
    2002/ 03/13以來統計人數


Linux 磁碟與硬體管理
最近更新日期：2003/02/07
認識硬碟：
查看硬碟或目錄的容量： df, du,
切割與格式化硬碟：fdisk, mke2fs, e2label, mknod,
檢查硬碟壞軌與資料同步化寫入：fsck, badblocks, sync,
關於軟碟開機片： mkbootdisk, fdformat,
各式磁區的掛載： mount , 軟碟, 光碟, Windows磁區, Windows 中文磁區, 新硬碟, umount,
設定開機時即掛載的方式： /etc/fstab
虛擬記憶體 Swap： swap partition, swap file, dd, mkswap, swapon, swapoff,
磁碟效能：hdparm,
附錄一：第二延伸檔案系統 ext2
附錄二：為何選擇 ext3 呢
本章習題練習
認識硬碟：
    讓我們再來複習一下 硬碟 裡面有什麼東西值得我們來討論的！
  • 物理組成：
    就物理組成來說，硬碟是由多個硬碟盤所組成的，而每一個硬碟盤上面都有個磁頭( Head )在進行該硬碟盤上面的讀寫工作，而當磁頭固定不動，硬碟盤轉一圈所畫出來的圓就是所謂的磁軌( Track )，全部硬碟盤上面同一個磁軌組成了磁柱( Cylinder )，這個磁柱也是磁碟分割( partition )時，最小的單位了！另外，由圓心向半徑方向劃直線，而每個 Track 上面細分成一個一個的磁區( Sector )那就是最小的磁碟儲存物理量了，一個 Sector 通常為 512 Bytes 。這就是整個硬碟的構造囉，那麼如果以硬碟的 filesystem 來做為檢視呢？你可以簡單的這樣想啦，一個 Partition 當中就具有一個 filesystem ( 檔案系統 ) 囉！那麼一個 partition 當中能不能具有兩個 filesystem 呢？理論上應該是不行的！因為每個檔案系統都有其獨特的支援方式，例如 Linux 的 ext3 就無法被 Windows 系統所讀取！而你將一個 partition 格式化的時候，總不能格式化為 ext3 也同時格式化為 fat32 吧？！那是不可能的啊！底下來談一談關於檔案系統的相關功能吧！

  • Filesystem
    在進行磁碟格式化或者是分割的時候，都會需要知道磁碟的一些基本的名詞定義，主要有：

    • 主要開機磁區( Master Boot Recorder, MBR )：主要開機磁區可以說是一顆硬碟裡面最重要的地方了，怎麼說呢？因為他記錄了所有硬碟的分割資訊，以及開機的時候可以進行開機管理程式的寫入等等，如果一顆硬碟的 MBR 死掉了，那麼這顆硬碟幾乎就可以說是壽終正寢了∼那麼 MBR 有什麼限制呢？他最大的限制來自於他的大小不夠大到儲存所有的資訊，因此，他僅提供最多四個 partition 的記憶，這就是所謂的 Primary (P)與 Extended (E)磁區最多相加只能有四個的原因了。所以說，如果你預計分割超過 4 個 partition 的話，那麼勢必需要使用 3P + 1E ，並且將所有的剩餘空間都撥給 Extended 才行( 記得呦！ Extended 最多只能有一個 )，否則只要 3P + E 之後還有剩下的空間，那麼那些容量將成為廢物而浪費了?所以結論就是『如果您要分割硬碟時，並且已經預計規劃使用掉 MBR 所提供的 4 個 partition ( 3P + E 或 4P )那麼磁碟的全部容量需要使用光，否則剩下的容量也不能再被使用』。不過，如果您僅是分割出 1P + 1E 的話，那麼剩下的空間就還能再分割兩個 partition ！

    • 區塊( Block )：檔案在磁碟當中會被儲存在一個固定的大小區塊中，那就是 Block ，而 Block 的大小通常為 2 的次方，其中，由於磁碟的磁區物理量通常為 0.5K ( 512 Bytes )，所以 Block 通常規劃為 0.5 K 的倍數，例如 EXT2 預設 Block 為 4K 即是一例！其中需要特別留意的地方是，一個 Block 最多僅能容納一個檔案，所以當一個檔案不足 4K 時，例如大小僅為 1K ，那麼剩下的 3 K 容量將會被浪費掉，這與 inode 也有一定的相關性！因此，在規劃您的磁碟時，需要留意到您主機的用途來進行規劃較佳！與此同時，若 Block 規劃的太小，則磁碟的 Block 數目會大增，而造成 inode 在指向 block 時候的一些搜尋時間的增加，又會造成大檔案讀寫方面的效率較差，這也與 inode 有一定程度的相關性呢！需要特別留意的是：『當系統讀取了某一個檔案，則該檔案所在的區塊資料會被載入到記憶體當中，所以該磁碟區塊就會被放置在主記憶體的緩衝快取區中，若這些區塊的資料被改變時，剛開始資料僅有主記憶體的區塊資料會被改變，而且在緩衝區當中的區塊資料會被標記為” Dirty “，這個時候磁碟實體區塊尚未被修正！所以亦即表示，這些” Dirty “區塊的資料必需寫到磁碟當中，以維持磁碟實體區塊上的資料與主記憶體中的區塊資料的一致性。』這也是為什麼當 Linux 系統不正常關機，或者是突發性的跳電時，總是會造成系統在磁碟檢驗上面大花時間的原因了！

    • Superblock：當我們在進行磁碟分割( partition )時，每個磁碟分割槽( partition )就是一個檔案系統( filesystem )，而每個檔案系統開始的位置的那個 block 就稱為 superblock ，superblock的作用是儲存像是檔案系統的大小、空的和填滿的區塊，以及他各自的總數和其他諸如此類的資訊等等，這也就是說，當您要使用這一個磁碟分割槽( 或者說是檔案系統 )來進行資料存取的時候，第一個要經過的就是 superblock 這個區塊了，所以囉， superblock 壞了，您的這個磁碟槽大概也就回天乏術了！

    • Inode: 在 Linux 檔案與目錄管理 當中，我們提到了很多的 inode 概念，這裡在加重補強一下說明：對於檔案系統而言一個inode是在inode tables 中的一個項目。Inode包含了所有檔案有關的資訊例如名稱、大小、連接的數量、資料建立之日期，修改及存取的時間。它也包含了磁碟區塊的檔案指向(pointer)。pointer是用來記錄檔案被儲存在何處。對於 inode 的規劃方面，我們可以使用 mke2fs 來進行。
大致上硬碟就有這些東西，您還得瞭解每一個 filesystem 就是一個磁碟分割槽，免得到時候底下講的東西太混亂時，造成您的困擾，那就不好意思啦！
查看硬碟或目錄的容量
好了！那麼在文字介面底下有什麼方法可以查看目前的磁碟最大容許容量、已經使用掉的容量、目前所在目錄的已使用容量？還有還有，怎麼知道目前目錄底下使用掉的硬碟容量呢？以及如何查詢目前的 inodes 數目？呵呵！底下我們就來談一談主要的兩個指令：
df 查看以掛載磁碟的總容量、使用容量與 inode 等等
du 查看檔案使用掉的容量有多少？
  • df
    語法：
    [root @tsai /root ]# df -[ikm]
    參數說明：
    -i: 使用 i-nodes 顯示結果
    -k: 使用 KBytes 顯示結果
    -m: 使用 MBytes 顯示結果
    範例：
    [root @test /root ]# df -k <==以 KB 顯示磁碟空間
    Filesystem 1k-blocks Used Available Use% Mounted on
    /dev/hda1 2118832 904600 1106600 45% /
    /dev/hda3 497861 37525 434632 8% /disk1
    none 31220 0 31220 0% /dev/shm
    /dev/hda5 101089 4127 91743 5% /proxy1
    /dev/hda6 101089 4127 91743 5% /proxy2
    /dev/hda2 1004052 38360 914688 5% /var
    /dev/fd0 1423 1405 19 99% /mnt/floppy
    說明：
    這是用來顯示目前磁碟空間的指令！需要注意的是，由於我們的檔案或者是外掛的磁碟都是加在『 / 』底下，所以當根目錄沒有空間的時後，嘿嘿！你的 Linux 系統大概就是掛了吧∼（說個笑話！當初我們系上有個研究生在管理 Sun 的工作站，是別研究室的，他的硬碟明明有好幾 GB ，但是就是沒有辦法將幾 MB 的資料 copy 進去，他就去跟老闆講說機器壞了！嘿！明明才來維護過幾天而已為何會壞了！結果老闆將維護商叫來罵了 2 小時左右吧！後來，維護商發現原來硬碟的『總空間』還有很多，只是某個磁區填滿了，偏偏該研究生就是要將資料 copy 去那個磁區！呵呵！後來那個研究生就被命令『再也不許碰 Sun 主機』了∼∼）當然囉！你可以將你的資料放置在加掛的硬碟中，那麼如何知道目前哪一個磁碟還有多少空間呢？！

    這裡要請大家再複習一下，我們的硬碟磁區規劃中， primary 磁區每一顆硬碟只允許 4 個，其他的就放置在 Extended 磁區中了！而，硬碟的代號與 IDE 的插槽是有關係的！如果忘記了，那就回去安裝 Linux 那一章複習一下吧！好了！假設我只有一棵硬碟，且放在 IDE 的 mater ，那麼我的硬碟就是 /dev/hda 囉！而在這顆硬碟中的分割磁區就可以由 /dev/hda1 開始向上加！

    OK，那麼使用 df -k 之後，出現的上面的資料中，可以知道我的硬碟更分為 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5 與 /dev/hda6 ，咦！ /dev/hda4 跑去哪裡了！呵呵！其實 /dev/hda4 通常就是 Extended 磁區啦！而後面的 /dev/hda5, /dev/hda6 等磁區就是由 /dev/hda4 所切出來的！所以 /dev/hda5 + /dev/hda6 = /dev/hda4 ！當然，如果還有沒有顯示出來的，例如 Swap ，則 /dev/hda4 還有可能更大呦！
    那麼來解釋一下上面的資料吧！
    • Filesystem：說的是磁區啦！另外，如果你有加掛軟碟的話，那麼就會出現如上表中最後一行囉！
    • 1k-blocks：說明底下的數字單位是 1KB 呦！如果你使用 df -m 則這一欄會出現 1M-blocks 囉！
    • Used ：顧名思義，就是使用掉的硬碟空間啦！
    • Available ：也就是剩下的磁碟空間大小；
    • Use% ：就是磁碟的使用率啦！如果使用率高達 90% 以上時，最好需要注意一下了，免得容量不足造成系統問題（例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁碟！）。
    • Mounted on ：就是磁碟掛載的目錄所在啦！例如 /dev/hda5 是掛載在 /proxy1 底下，而 /var 是 /dev/hda2 這個磁區囉！
    另外，需要注意的是，有的時後某些系統會出現 /proc 這個磁區，但是裡面的東西都是 0 ，不要緊張！ /proc 的東西都是 Linux 系統所需要載入的系統資料，而且是掛載在『記憶體當中』的，有點像是以前 DOS 年代的虛擬硬碟啦！所以當然沒有佔任何的硬碟空間囉！

  • du
    語法：
    [root @test /root ]# du [-abckms] [目錄名稱]
    參數說明：
    [目錄名稱] 可以省略，如果省略的話，表示要統計目前所在目錄的檔案容量
    -a :全部的檔案與目錄都列出來！預設值是指列出目錄的值！
    -b :列出的值以 bytes 輸出
    -c :最後加總 total ！
    -k :列出的值以 KB 輸出
    -m :列出的值以 MB 輸出
    -s :只列出最後加總的值！
    範例：
    [root @test /root]# du -m <==列出 /root 底下的目錄與檔案所佔的容量以 MB 輸出
    [root @test /root]# du -s /home <==將 /home 底下的目錄與檔案的容量加總後輸出，這裡只會輸出總容量！
    說明：
    在 Windows 底下可以使用檔案總管來管理你的磁碟，在 Linux 底下也可以輕易的以 du 來知道目前磁碟的檔案容量耶！在預設的情況下，容量的輸出是以 KB 來設計的，如果你想要知道目錄佔了多少 MB ，那麼就使用 -m 這個參數即可囉！而，如果你只想要知道該目錄佔了多少容量的話，呵呵，使用 -s 就可以啦！
    • 切割與格式化硬碟：
    對於一個系統管理者 ( root ) 而言，硬碟的的管理是相當重要的一環，尤其近來硬碟已經漸漸的被當成是消耗品了.....好了，如果我們要 partition 一棵新的硬碟，要使用什麼程式來工作？而如果已經 partition 好了，又要如何來格式化呢？剛剛我們提到了 inodes 這個東西，那麼使用格式化 ( format ) 的軟體可以怎樣的來格式化好我們所需要的 inodes 的大小呢？這裡我們就來談一談囉！
    fdisk 硬碟切割 partition 的工具
    mke2fs 就是 Linux 底下重要的 format 格式化的工具
    e2label 修改硬碟的 label （表頭名稱） 的工具！
    mknod 新增硬體對應檔的工具！
    • fdisk
      語法：
      [root @test /root ]# fdisk [-l] [裝置名稱]
      參數說明：
      -l ：直接列出該硬碟裝置的 partition table
      範例：
      [root @test root]# fdisk /dev/hdb<==分割我的 hdb 磁碟，記得後面不接數字

      Command (m for help): m <==印出說明內容
      Command action
      a toggle a bootable flag
      b edit bsd disklabel
      c toggle the dos compatibility flag
      d delete a partition
      l list known partition types
      m print this menu
      n add a new partition
      o create a new empty DOS partition table
      p print the partition table
      q quit without saving changes
      s create a new empty Sun disklabel
      t change a partition's system id
      u change display/entry units
      v verify the partition table
      w write table to disk and exit
      x extra functionality (experts only)

      Command (m for help): p <==印出目前的磁碟分割狀態

      Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
      Units = cylinders of 8064 * 512 bytes

      Device Boot Start End Blocks Id System
      /dev/hdb1 * 1 250 1007968+ 83 Linux

      Command (m for help):q <==不儲存離開 fdisk

      [root @test root]# fdisk -l /dev/hdb<==直接秀出這顆硬碟當中的 partition

      Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
      Units = cylinders of 8064 * 512 bytes

      Device Boot Start End Blocks Id System
      /dev/hdb1 * 1 250 1007968+ 83 Linux

      說明：
      還記得我們剛剛在認識硬碟裡面提到的部分內容嗎？其實 fdisk 最主要的工作就是在修改『 partition table 』而已，並沒有實際的將硬碟切切割割的啦！他會定義出某一個 partition 是由 n1 磁柱到 n2 磁柱之間這樣的資訊！因此，如果硬碟切割錯誤時，只要在 format 之前將 partition tables 復原，那麼就可以將硬碟原來的資料救回來囉！所以，一個好的管理員，有時候也會將自己的 partition table 記錄下來，以備不時之需呀！這個 fdisk 只有 root 才能執行，此外，請注意，使用的『裝置名稱』請不要加上數字，因為 partition 是針對『整個硬碟裝置』而不是某個 partition 呢！所以執行 fdisk /dev/hdb1 就會發生錯誤啦！要使用 fdisk /dev/hdb 才對！底下說一說進入 fdisk 之後的幾個重要參數吧！

      註：您可以使用 fdisk 在您的硬碟上面胡搞瞎搞的進行實際操作，都不打緊，但是請『千萬記住，不要按下 w 即可！』離開的時候按下 q 就萬事無妨囉！

      • 硬碟資訊：通常我們需要知道這顆硬碟的資訊時，直接按下『 p 』就可以瞭解了，例如上面的例子中，我的一棵硬碟切割呈上面的模樣，而我的 System 除了一個 swap 之外，其他的都是屬於 ext2 的呦！

      • 刪除磁區：如果我要刪除一個以存在的磁區時，就需要：
        1. fdisk /dev/hdb ：先進入 fdisk 畫面；
        2. p ：先看一下磁區的資訊，假設要殺掉 /dev/hdb1；
        3. d ：這個時候會要你選擇一個 partition ，就選 1 囉！
        4. w ：儲存到磁碟資料表中，並離開 fdisk ；當然囉，如果你反悔了該怎麼辦！？呵呵，直接按下 q 就可以取消剛剛的刪除動作了！
          [root@test root]# fdisk /dev/hdb

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

          Device Boot Start End Blocks Id System
          /dev/hdb1 * 1 250 1007968+ 83 Linux

          Command (m for help): d
          Partition number (1-4): 1

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

          Device Boot Start End Blocks Id System
          看！原先的 partition 不見了，如果確定儲存就按下 w ，否則按下 q 趕緊離開！

      • 新增磁區：那麼如何增加一個磁區呢？前提之下是你的硬碟必須還有硬碟空間才行！
        1. fdisk /dev/hdb ：先進入 fdisk 畫面中；
        2. n：新增一個磁區，這個時候系統會問你，如果您已經具有 extended 磁區時，那麼系統會問您，您要新增的是 Primary 還是Logical ，而如果您還沒有 extended ，那麼系統僅會問你要新增 Primary 還是 Extended，除此之外，如果您已經用完了四個 P + E 的話，那麼就僅有 Logical 可以選擇啦！請再回到剛剛說明硬碟的地方再次的複習一下吧！如果是選擇 primary 的話，請按 p ，否則請按 e 或 l 。
        3. p ：由於選擇為 primary 所以就會按下 p 囉！
        4. 1-4 ：primary 只允許四個，（仍然比 Windows 只允許一個好的多了！），所以這裡請按尚未被使用的那一個磁區囉！
        5. w ：同樣的儲存離開囉！
          [root @test root]# fdisk /dev/hdb

          Command (m for help): p <==印出資訊

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

          Device Boot Start End Blocks Id System
          /dev/hdb1 * 1 250 1007968+ 83 Linux

          Command (m for help): n <==選擇新增
          Command action
          e extended
          p primary partition (1-4)
          e <==輸入 e 來新增 extended 囉！
          Partition number (1-4): 2
          First cylinder (251-523, default 251): <==這裡按 Enter 即可！用預設值！
          Using default value 251
          Last cylinder or +size or +sizeM or +sizeK (251-523, default 523): +100M

          Command (m for help): p <==再印出資訊

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

          Device Boot Start End Blocks Id System
          /dev/hdb1 * 1 250 1007968+ 83 Linux
          /dev/hdb2 251 276 104832 5 Extended <==這行即是新增的！

          Command (m for help): n <==再次新增
          Command action
          l logical (5 or over)
          p primary partition (1-4)
          l<==這次選擇 logical 的 l 哩！
          First cylinder (251-276, default 251): <==這裡按 Enter 即可！用預設值！
          Using default value 251
          Last cylinder or +size or +sizeM or +sizeK (251-276, default 276): +100M

          Command (m for help): p

          Disk /dev/hdb: 128 heads, 63 sectors, 523 cylinders
          Units = cylinders of 8064 * 512 bytes

          Device Boot Start End Blocks Id System
          /dev/hdb1 * 1 250 1007968+ 83 Linux
          /dev/hdb2 251 276 104832 5 Extended
          /dev/hdb5 251 276 104800+ 83 Linux <==這行即是新增的！

          透過上面的例子，您可以清楚的看到，呵呵！第一個 logical 是在 5 號呦！OK！在 fdisk 完成之後，請記得使用 mke2fs 格式化囉！另外，請注意，如果過程中進行錯誤時，那麼趕緊按下 q 離開即可！

      • 操作環境的說明：以 root 的身份進行硬碟的 partition 時，最好是在單人維護模式底下比較安全一些，此外，在進行 fdisk 的時候，如果該硬碟某個 partition 還在使用當中，那麼很有可能系統核心會無法重新載入硬碟的 partition table ，解決的方法就是將該使用中的 partition 給他卸載，然後再重新進入 fdisk 一遍，重新寫入 partition table ，那麼就可以成功囉！

      • 注意事項：另外，請注意一下，雖然一顆硬碟最大的邏輯磁區可以到達 64 顆( 總數，包含 1~4 的 primary partition )，但是並非所有的 Linux distribution 都會將所有的邏輯磁區對應的磁碟代號都寫入系統當中，以 Red Hat 為例，他僅列出 1~16 個代碼，其他的您就得自己動手做啦！至於 Mandrake 的話，他則是使用自己偵測的，當您以 fdisk 設定好了 partition table 之後，磁碟對應的磁碟代號就會自動的在您的 /dev/ 裡頭設定完成囉！不過，有的時候您還是得自己設定一下磁碟代碼啦！如何設定呢？就使用 mknod 這個指令吧！

    • mke2fs
      語法：
      [root @test /root ]# mke2fs [-b block-size] [-i inode-size]
      [root @test /root ]# mke2fs [-c]
      [root @test /root ]# mke2fs [-L]
      [root @test /root ]# mke2fs [-j]
      參數說明：
      -b :在設定每個資料區塊佔用的大小，目前支援的大小有 1024, 2048, 4096 三種！
      -i :設定 inode 值！
      -c :檢查錯誤磁碟，會比較慢呦！
      -L :規劃設定這個磁區的 label （表頭名稱）
      -j :建立 ext3 這個 journaling 的檔案格式
      範例：
      [root @test /root]# mke2fs /dev/hda5
      以 mke2fs 預設的條件( ext2 )格式化 /dev/hda5 這個裝置

      [root @test /root]# mke2fs -c /dev/hda5
      在格式化的過程中一起檢查硬碟

      [root @test /root]# mke2fs –j -b 8192 -i 8192 /dev/hda5
      改變 block 由 4096 預設值改為 8192

      [root @test /root]# mke2fs /dev/fd0 <==格式化軟碟呀！
      mke2fs 1.26 (3-Feb-2002)
      Filesystem label=
      OS type: Linux
      Block size=1024 (log=0)
      Fragment size=1024 (log=0)
      216 inodes, 1680 blocks
      84 blocks (5.00%) reserved for the super user
      First data block=1
      1 block group
      8192 blocks per group, 8192 fragments per group
      216 inodes per group
      Writing inode tables: done
      Writing superblocks and filesystem accounting information: done

      This filesystem will be automatically checked every 35 mounts or
      180 days, whichever comes first. Use tune2fs -c or -i to override.

      說明：
      這是用來將磁碟格式化成 Linux 系統檔的指令。基本上，只要寫入對的裝置檔案就可以了。例如我們要格式化軟碟的話，或是新的硬碟 hda5 等等！這個指令通常是在新的硬碟上面切割完之後，再加以格式化的！另外，如果要將舊的磁區格式化成 ext2 格式的話，就使用這個指令吧！進行當中顯示的訊息有點像上面的最後幾行，系統會顯示目前的格式化的預設值！而如果要設定不同的 Block ( 就是前面提到的一個邏輯 sector 的大小 )，就可以使用 -b 這個參數！請注意囉，預設的情況下， Block 是 4096！此外，您也可以自訂 inode table 呢！而，當沒有指定的時候， mke2fs 使用 ext2 為格式化檔案格式，若加入 –j 時，則格式化為 ext3 這個 Journaling 的 filesystem 呦！

    • e2label
      語法：
      [root @test /root ]# e2label [/dev/hd...] [label_name]
      參數說明：
      範例：
      [root @test /root]# e2label /dev/hda1 /
      上面的案例為將 /dev/hda1 這個磁碟槽的名字設定為 / 啦！
      說明：
      個東西也蠻有意思的！他主要是用來『更改磁碟的表頭資料』，也就是類似『檔案總管』裡面每一個磁碟機代號後面的名稱！沒有什麼特異功能啦！就是有趣的用途而已！此外，這個用途也可以被用在 /etc/fstab 裡頭！也就是可以增加那個磁碟代號的設定囉！

    • mknod
      語法：
      [root @test root]# mknod [device] [bcp] [Major] [ Minor]
      參數說明：
      b :設定節點成為周邊儲存設備檔
      c :設定節點成為周邊設備如滑鼠等
      p :建立 FIFO
      範例：
      [root@test /]# cd /dev
      [root@test dev]# ll hda*
      lr-xr-xr-x 1 root root 32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc
      lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1
      lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2
      [root@test dev]# ll ide/host0/bus0/target0/lun0/
      total 0
      brw------- 1 root root 3, 0 Jan 1 1970 disc
      brw------- 1 root root 3, 1 Jan 1 1970 part1
      brw------- 1 root root 3, 2 Jan 1 1970 part2
      [root@test dev]# mknod hda3 b 3 3<==注意到囉！那個 3 3 就是上面的數值
      [root@test dev]# ll hda*
      lr-xr-xr-x 1 root root 32 Oct 19 13:04 hda -> ide/host0/bus0/target0/lun0/disc
      lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda1 -> ide/host0/bus0/target0/lun0/part1
      lr-xr-xr-x 1 root root 33 Oct 19 13:04 hda2 -> ide/host0/bus0/target0/lun0/part2
      brw-r--r-- 1 root root 3, 3 Oct 22 17:16 hda3
      說明：
      mknod 在平時是幾乎不會使用到的，但是某些時候，確實有可能會出問題！這個指令的設定方法中，必需要取得設備的 Major ( 主要 ) 與 Minor ( 次要 ) 的數值後，才能夠設定完整！上面是我的 Mandrake 9.0 在 P-166 MMX 上面的情況，由於之前僅分割成兩槽，所以僅到達 /dev/hdb2 而已，如果要 hdb3 的話，那麼除了 fdisk 完成之後， Mandrake 會自行多設定一個之外，否則就要自己來囉！而由這個裝置的內容說明上面，我們可以這樣定義一下：

      硬碟代號
      Major
      Minor
      /dev/hda
      3
      0 ~ 63
      /dev/hdb
      3
      64 ~ 127
      /dev/hdc
      22
      0 ~ 63
      /dev/hdd
      22
      64 ~ 127

    檢查硬碟與資料同步化寫入：
    現在也建立好了新的 partition 了，也 format 好了，那麼有沒有其他的關於硬碟的工作需要來進行呢？有的，就是需要怎樣來檢查硬碟有沒有壞軌呢？那個就是 fsck 這個工具的用途啦！此外，您會發現到，在 / 這個目錄底下 ( 其實只要有掛載硬碟的那個目錄底下都有這個目錄 ) 會有一個特殊的目錄，就是『 lost+found 』這個目錄啦！對的！就是當你處理完 fsck 之後，如果程式有發現到任何的錯誤的檔案，就會將該檔案的資料給他丟到這個目錄當中，嘿嘿！所以當你發現你的 Linux 目錄當中有這個檔案時，不要擔心，那個是正常的啦！而且只有掛載 partition 的目錄才會有這個預設的目錄囉！

    還有，由於在 Linux 系統當中，為了增加系統效能，通常系統預設就是一些資料會寫在記憶體當中，並不會直接將資料寫入硬碟裡面，這是因為記憶體的速度要比硬碟快上若干倍呀！但是有個問題就發生了，萬一系統由於『跳電』或者是其他的莫名原因，造成系統的 shutdown 時，唉呀！怎麼辦？！系統就完蛋啦！所以囉，我們需要在某些特定的時候讓資料直接回存到硬碟之中呀！了乎！這裡提供幾個慣用的指令，其中，那個 fsck 是相當重要的，請參考其用法囉！
    fsck 檢查硬碟有沒有壞軌的工具
    badblocks 跟 fsck 一樣，但是 fsck 的功能比較強，所以這個指令可以不學！
    sync 將 記憶體中的資料給他同步化寫入硬碟中
  • fsck
    語法：
    [root @test /root ]# fsck [-Aar] [裝置名稱]
    參數說明：
    -A :依據 /etc/fstab 的內容，將所有的裝置都掃瞄一次（通常開機過程中就會執行此一指令）
    -a :自動修復檢查到的有問題的磁區，所以你不用一直按 y 囉！
    -r :一定要讓使用者決定是否需要修復，這與上一個 -a 剛好相反！
    範例：
    [root @test /root]# fsck -a /dev/hda5 <==檢查 /dev/hda5 這個磁區有沒有錯誤！
    說明：
    這是用來檢查與修正硬碟錯誤的指令。注意：通常只有身為 root 且你的系統有問題的時候才使用這個指令，否則在正常狀況下使用此一指令，可能會造成對檔案的危害！通常使用這個指令的場合都是在系統出現極大的問題，導致你在 Linux 開機的時候得進入單人單機模式下進行維護的行為時，才必須使用此一指令！另外，如果你懷疑剛剛格式化成功的硬碟有問題的時後，也可以使用 fsck 來檢查一下硬碟呦！其實就有點像是 Windows 的 scandisk 啦！此外，由於 fsck 在掃瞄硬碟的時候，可能會造成部分 filesystem 的損壞，所以『要執行 fsck 的時候，請將該 partition umount 一下！』，然後再去執行！

    常常我們會發現，在比較老舊的機器上（例如我的 p-166），如果主機不正常的關機（例如跳電囉！），那麼硬碟很可能會出現錯誤的狀況！這個時候 Linux 就無法正常的開機！這個時候就需要輸入 root 的密碼，以登入單人維護模式（run level 1），然後下達 fsck -a /dev/hdxxx 來檢查你的硬碟！等到確認成功之後，就使用 reboot 來重新啟動吧！
    • badblocks
      語法：
      [root @test /root ]# badblocks [-svw] [裝置名稱]
      參數說明：
      -s :在螢幕上列出進度
      -v :可以在螢幕上看到進度
      -w :使用寫入的方式來測試，建議不要使用此一參數，尤其是待檢查的裝置已有檔案時！
      例：
      [root @test /root]# badblocks -sv /dev/hda1
      說明：
      這是用來檢查硬碟或軟碟磁區有沒有壞軌的指令！跟 Windows 的 scandisk 相同功能啦！不過由於 fsck 的功能比較強，所以目前大多已經不使用這個指令了！
  • sync
    語法：
    [root @test /root ]# sync
    參數說明：
    例：
    [root @test /root]# sync; sync
    說明：
    在正常的狀況中，由於為了增加系統的效率，因此，很多時候進行中的程式產生的程序之暫存檔案都不會直接存至磁碟機當中，而是記憶在記憶體當中！由於記憶體的資料傳遞速度比磁碟機快了幾十倍，所以如此一來將有助於整個系統的效率！！然而這也產生了一個困擾，那就是當你的系統不正常關機的時候，可能會使得一些已經經過改變，卻還沒有存入磁碟中的資料遺失（因為還在記憶體當中！）所以這個時候 sync 的功能就相當的大了！因為他可以直接將系統暫存在記憶體當中的資料回存寫入磁碟當中，呵呵！很棒吧！但是需要注意你的系統核心 (kernel) 必須要有支援 sync 才行（目前幾乎一定都會支援的啦！）
    • 關於軟碟開機片：
    嗯！搞定了上面的動作了沒？！好了，如果搞定了的話，現在我們來製作一個可以開機的軟碟開機片好了！怎麼製作呢？呵呵！就是利用 mkbootdisk 囉！
    mkbootdisk 製作軟碟開機片
    fdformat 這是用來『低階格式化』軟碟的工具
  • mkbootdisk
    語法：
    [root @test /root ]# mkbootdisk --device /dev/fd0 `uname -r`
    參數說明：
    --device :後面接裝置！通常接的就是軟碟啦 /dev/fd0 ！
    範例：
    [root @test /root]# mkbootdisk --device /dev/fd0 `uname -r` <==建立可開機軟碟！！
    說明：
    這是製作開機磁片的指令，其中，『 `uname -r` 』是目前 Linux 系統所使用的核心版本，如果你有多個核心版本的話，你以可以直接輸入核心版本。例如在我的系統中，舊的核心還是有保留的，所以我都會至少有兩個核心，在我管理的某部主機中，核心為 2.4.7 及 2.4.18 ，那麼如果我要直接以 2.4.18 來開機的話，就可以使用
    mkbootdisk --device /dev/fd0 2.4.18
    建立軟碟開機片一直是個好主意！他可以在你求助無門的時候給你莫大的幫助喔！所以，建立一個新的軟碟開機片是一個好主意啦！
    • fdformat
      語法：
      [root @test /root ]# fdformat [裝置名稱]
      參數說明：
      例：
      [root @test /root]# fdformat /dev/fd0H1440
      說明：
      這是用來『低階格式化』軟碟的指令。（注意：軟碟的裝置檔為 /dev/fd0 ）！在上面的裝置檔案為 /dev/fd0H1440 ，其中加在 /fd0 之後的 H1440 為表示 1.44MB 的軟碟容量！在低階格式化之後，還要將軟碟的檔案格式化為 Linux 的 ext2 之型態，則需要使用 mke2fs 指令！
    各式磁區的掛載：
    要將上面我們所建立起來的硬碟或軟碟正式的在 Linux 上面啟用時，一定需要將他掛載上檔案系統！而所謂的『掛載點』則是該硬碟所在的目錄，且在該目錄下的所有目錄都歸在該硬碟所有！假設一個情況好了，我們的 / 為 /dev/hda1 而 /home 為 /dev/hda2 ，那麼在 /home/test 底下的咚咚就也都歸 /dev/hda2 這個 partition 所有囉！而需要特別留意的是，由於掛載檔案系統需要掛載點，所以掛載的時候得先建立起掛載的目錄才行！除此之外，如果您要用來掛載的目錄裡面並不是空的，那麼掛載了檔案系統之後，那麼原目錄下的東西就會暫時的消失。舉個例子來說，假設您的 /home 原本是屬於根目錄 / 底下的 partition 所有，底下原本就有 /home/test 與 /home/vbird 兩個目錄。然後你想要加入新的硬碟，並且直接掛載 /home 底下，那麼當您掛載上新的 partition 時，則 /home 顯示的是該 partition 的內容，至於原先的 test 與 vbird 這兩個目錄就會暫時的被隱藏掉了！注意喔！並不是被覆蓋掉，而是暫時的隱藏了起來，等到 partition 被 umount 之後，則該目錄的內容就會再次的跑出來啦！
    • mount
      語法：
      [root @test /root ]# mount [-ahlV]
      [root @test /root ]# mount -t type /dev/hdxx /mountpoint
      [root @test /root ]# mount -o [options]
      [root @test /root ]# umount /mountpoint
      參數說明：
      -a :依照 /etc/fstab 的內容將所有相關的磁碟都掛上來！
      -h :只列出 mount 相關的參數，並不掛載任何裝置
      -l :列出目前已經掛載的裝置、檔案系統名稱與掛載點！
      -V :列出 mount 的版本資訊
      type :將後面 /dev/hdxx 這個裝置以 type 的檔案格式掛載到 /mountpoint 這個點，
      常見的 type 有底下幾個：
      vfat, msdos :這個是支援 Windows 系統的檔案格式，尤其是 vfat 常用！
      ext, ext2 :這個就是 Linux 的主要檔案格式啦！
      iso9660 :光碟機的檔案格式
      nfs, ntfs, ufs :Windows 2000 使用 NTFS 格式呀！
      -o　 :這個參數後面接的咚咚可多了！可用的資料可不少呢！
            rw　　　：讓 mount 的磁區為可讀寫
            suid　　：允許該磁區可以設定檔案為 SUID 的狀態！
            exec　　：允許該磁區可以執行 binary 的檔案！
            auto　　：允許該磁區可以使用 mount -a 的參數設定！
            nouser　：禁止其他人(非 root 之使用者)使用掛載功能！這是預設值！
            async　：允許磁區可以進行非同步記錄（記憶體與硬碟不同步！最常用！）
            defaults：同時具有 rw, suid, dev, exec, auto, nouser, async 這些功能的設定值！
            nosuid　：不許該磁區具有 SUID 的檔案屬性！
            ro　　　：設定為唯讀屬性！
            remount ：讓系統本來掛載的磁區重新被掛載！
      範例：
      [root @test /root]# mount -a
      [root @test /root]# mount -t iso9660 /dev/cdrom /mnt/cdrom <==掛上光碟
      [root @test /root]# mount -t vfat /dev/fd0 /mnt/floppy <==掛上 windows 檔案系統的軟碟
      [root @test /root]# mount -t ext2 /dev/fd0 /mnt/floppy <==掛上 Linux 檔案系統的軟碟
      [root @test /root]# mount -t ext2 /dev/hdc6 /home <==掛上 Linux 檔案格式硬碟
      [root @test /root]# mount -o remount,rw /　　　　　　　　　 <==讓根目錄重新掛載為可讀！
      說明：
      這個指令只有 root 才能執行！如果你不想要單獨的將某個磁碟掛上來，那麼執行：
      mount -a
      就可以依照 /etc/fstab的的參數內容將所有的磁碟給他重新掛上去！此外，需要注意的是，由於 Linux 系統中，每一個路徑都有可能是一個獨立的磁區系統，所以需要將每個磁區系統都掛上各自的掛載點！詳細的內容請回去參考一下上一篇 Linux 檔案系統 的說明。另外，由於各個磁區的檔案系統可能並不相同，所以您必須先要瞭解該磁區的檔案系統，這樣才可以進行 mount 的工作！如何知道該磁碟的檔案格式呢？可以使用 fdisk 來顯示的功能即可！

      請注意呦！由於 mount 之後的檔案格式是沒有辦法直接被拿掉的！尤其在使用 fsck 檢查你的硬碟時，更是不能掛上硬碟的！而如何將硬碟至掛載點卸載呢？呵呵，就直接使用 umount 即可囉！

      底下分別談一談各個裝置的掛載情況：這裡可能先要強調一個觀念，在 Windows 底下，磁碟分割是以 A, B, C, D, .... 等等的方式來劃分的，然而在 Linux 或 Unix 系統之下，卻是以目錄來代表，也就是說，一個目錄很可能就是一個磁區了！舉個例子來說，通常 Linux 預設的軟碟掛載的地點在 /mnt/floppy 這裡！呵呵！那麼如果你需要軟碟的資料時，就將 /dev/fd0 這一個裝置（前面提過囉！這個是周邊存取裝置的一個設備檔案類型）掛上 /mnt/floppy 就可以啦！然後你進入到 /mnt/floppy 就可以讀取軟碟的資料囉！OK！在這裡也必須要介紹一下 mount 這個指令喔！

      • 掛載軟碟：
        很多朋友常常會使用到軟碟，尤其是在網路有問題的時候，那麼如何使用 Linux 將軟碟掛上來呢？！首先，您給先瞭解你的磁片檔案的格式，例如 Linux 的檔案格式（ ext2 ）與 Windows 的檔案格式（ vfat ）是不一樣的！分別可以使用如下的方式掛上來：

        [root @test /] # mount -t ext2 /dev/fd0 /mnt/floppy<==Linux 格式
        [root @test /] # mount -t vfat /dev/fd0 /mnt/floppy<==Windows 格式
        [root @test /] # umount /mnt/floppy<==將軟碟機卸載

        所以囉！即使是 Windows 格式的檔案，在 Linux 底下仍然是可以讀取的到的呦！另外，要注意的是，即使你使用軟碟完畢之後，一定要將 /mnt/floppy 卸載之後才可以取出軟碟片喔！不然系統會一直告訴你發生錯誤囉！而在卸載 /mnt/floppy 的時候，你一定不能在該目錄底下，否則會發生錯誤訊息喔！而如果載入的格式不符合，系統也不會將該軟碟掛上來的呦！好了，那麼怎麼製作 ext2 的軟碟呢？簡單的很，就使用 mke2fs /dev/fd0 就行啦！

      • 掛載光碟！
        在某些 Linux distribution 底下，例如 Red Hat 7.2 在預設的狀態下是將 CDROM 視為一個模組，預設的核心並沒有將他載入，所以，如果你需要在 Red Hat 7.2 裡面掛載 CDROM 的話，有兩個解決的方法：

        一個是直接將 CDROM 的模組載入系統中，這個動作比較簡單，而且你也可以將這個指令直接寫到 /etc/rc.d/rc.local 裡面去即可！

        [root @test / ]# modprobe cdrom
        [root @test / ]# modprobe ide-cd
        [root @test / ]# mount -t iso9660 /dev/cdrom /mnt/cdrom
        [root @test / ]# umount /mnt/cdrom

        前兩行是模組的載入，而第三行是掛載 CDROM ，第四行則是卸載！此外，由於預設的 CDROM 掛載就是以 iso9660 的 type 來做的，所以你也可以直接寫成 mount /dev/cdrom /mnt/cdrom 就可以囉！

        另外一個解決的方法是將 CDROM 的模組編譯進核心當中！又有兩種方式，一個是直接下載新的核心來編譯，另一個則是直接以 Red Hat 出的更新版的核心來直接升級就可以啦！如果是使用 up2date 的話，那麼升級核心是很簡單的啦！

      • 掛載 Windows 磁區：
        如果萬一你在安裝系統的時候忘記將 Windows 的 VFAT 格式的磁區 mount 上你的 Linux 時，該怎麼辦？！這種現象最常發生在多系統共存的環境中！例如再原有的 Windows 98 或 Win2000 上面安裝 Linux ，但是結果卻忘記將該磁區掛載上來！嗯！這樣需要重新安裝嗎？！當然不需要了！又不是被入侵！那麼該如何掛載上來呢？！就如同前面說的，由於一個目錄可能代表了一個磁區，因此你必須要先建立一個磁區，然後再將此磁區掛載上你的 Linux 目錄，就可以啦！另外，由於需要將磁區掛在目錄下，所以你還得需要瞭解你的 Windows 磁區是在哪一個硬碟周邊中喔！如何知道你的 Windows 磁區呢？就使用 fdisk 吧！假設你的 Windows 是在 Primary IDE 的硬碟，那麼應該就是 /dev/hda 囉！則你可以這樣做：

        [root @test / ]# fdisk –l /dev/hda
        Disk /dev/hda: 255 heads, 63 sectors, 524 cylinders
        Units = cylinders of 16065 * 512 bytes

        Device Boot Start End Blocks Id System
        /dev/hda1 1 268 2152678+ 83 Win95 FAT32
        /dev/hda2 * 269 395 1020127+ 83 Linux
        /dev/hda3 396 459 514080 83 Linux
        /dev/hda4 460 524 522112+ 5 Extended
        /dev/hda5 460 472 104391 83 Linux
        /dev/hda6 473 485 104391 83 Linux
        /dev/hda7 486 498 104391 82 Linux swap
        /dev/hda8 499 511 104391 83 Linux
        /dev/hda9 512 524 104391 83 Linux

        使用 fdisk 指令的話就可以知道你的 Win95 FAT32 的磁區在哪一個，在上表中，顯示的是 /dev/hda1 這一個磁區囉！那麼假設我要將 Windows 的目錄建置在 /mnt/win98 裡面呢？就這樣做吧：

        [root @tsai / ]# mkdir /mnt/win98
        [root @tsai / ]# mount -t vfat /dev/hda1 /mnt/win98
        [root @tsai / ]# mount -t vfat -o iocharset=cp950 /dev/hda5 /mnt/win98

        如此一來就將 Windows 的系統掛到 Linux 裡面囉！簡單吧！請注意，上面那個第三行所使用的參數可以讓您的 Windows 98 的磁區當中的檔案顯示出正確的中文呦！

      • 安裝新硬碟：
        再來個新問題！那麼我如果想要安裝一顆新硬碟呢？呵呵，也是很簡單啦，就跟在 Windows 底下一樣！需要先 fdisk 然後在 format ，之後就可以順利的掛上 Linux 系統囉！假設我安裝的硬碟在 Primary 的第二個 IDE 上面，也就是 /dev/hdb 上，那麼整個步驟應該就會是：

        [root @test / ]# fdisk /dev/hdb
        .......（以下省略！直接以 fdisk 分割好硬碟啦！）

        [root @test / ]# mke2fs /dev/hdb1
        在 Linux 中的 format 是 mke2fs 這一個指令喔！
        上面的指令在將你的硬碟磁區格式化成 Linux 的 ext2 格式啦！

        [root @test / ]# mkdir /disk2
        建立一個目錄名稱為 /disk2 ，預計用來掛載你的新硬碟

        [root @test / ]# mount -t ext2 /dev/hdb1 /disk2
        將硬碟掛上 Linux 系統囉！

    • umount
      語法：
      [root @test root]# umount [-f] [device|mount_point]
      參數說明：
      -f ：強制將該檔案系統退出，最常使用在無法退出的 NFS 檔案系統中了！
      範例：
      [root @test root]# umount /home
      說明：
      就是直接將 mount 上來的檔案系統給他卸載即是！卸載之後，可以使用 df 看看是否還存在呢？！
    設定開機時即掛載的方式：
    剛剛上面說了許多，那麼可不可以在開機的時候就將我要的磁區都掛好呢？！這樣我就不需要每次進入 Linux 系統都還要在掛載一次呀！當然可以囉！那就直接到 /etc/fstab 裡面去修修就行囉！不過，在開始說明前，這裡要先跟大家說一說系統掛載的一些限制：
    • 根目錄 / 是必須掛載的﹐而且一定要先於其它 mount point 被掛載進來。
    • 其它 mount point 必須為已建立的目錄﹐可以任意指定﹐但一定要遵守必須的系統目錄架構原則。
    • 所有 mount point 在同一時間之內﹐只能掛載一次。
    • 所有 partition 在同一時間之內﹐只能掛載一次。
    • 如若進行卸載﹐您必須先將工作目錄移到 mount point(及其子目錄) 之外。
    好了，那麼我們進入 /etc/fstab 看一看吧：

    [root @test / ]# more /etc/fstab
    # History:
    # ==================================================
    # When Who What
    # 2002/10/19 VBird This file had been modified by me.
    # ==================================================
    # device MountPoint filesystem parameters dump fsck
    /dev/hda1 / ext3 defaults 1 1
    /dev/hda2 swap swap defaults 0 0
    LABEL=/backup /backup ext3 defaults 1 1
    none /dev/pts devpts mode=0620 0 0
    none /proc proc defaults 0 0
    /dev/hda3 /mnt/win98 vfat defaults,iocharset=big5,codepage=950 0 0

    我這個人比較龜毛一點，因為 Mandrake 9.0 的 /etc/fstab 檔案排列方式蠻醜的，雖然每一欄之間只要以空白字元分開即可，但就是覺得醜，所以通常我就會自己排列整齊，並加上註解符號，就是 # 字號，來幫我記憶這些資訊！總共有六欄，分別來談一談吧！
    1. 磁區或標頭：就是磁區啦！不過，如果是在安裝的時候有給予一個 label (標頭) 的話，那麼使用 label 也可以，例如上面的 LABEL=/backup 那一行。而如果是我們增加新的磁區的話，那麼這裡就必須要使用『磁區』了！例如新安裝一個硬碟在 /dev/hdd1 當中，那麼這裡就寫 /dev/hdd1 囉！那麼如果我還是想要使用 label 來掛載呢？！就使用 e2label 來建立 label name 啦！ e2label 的用法在前一章有說明，忘了的話，快去看看先！

    2. 掛載的目錄點：就是 mount 的掛載點啦！

    3. 該磁區的檔案格式：目前 Linux 大都使用 ext2, ext3, reiserfs 等等的，不過，如果你有使用 Windows 的檔案格式的話，那麼就可以使用 vfat 囉！目前支援的格式還有 iso9660( 光碟 ), msdos, minix, nfs, swap 等等的檔案格式；

    4. 檔案格式參數區：這個就重要了！有哪些磁碟參數可以參考呢？在前一章的 mount 指令裡面介紹了一些些，這裡再更詳細的提出說明如下：

      參數
      內容意義
      async/sync
      非同步/同步
               是否允許磁碟與記憶體中的資料以同步寫入的動作？使用 async 這個非同步寫入的方式會比較快速一些。
      auto/noauto
      自動/非自動
               在開機的時候是否自動掛載該磁區？既然設定在這個區域內了，當然希望開機的時候自動掛載囉！
      rw/ro
      可讀寫/唯讀
               讓該磁區以可讀寫或者是唯獨的型態掛載上來，如果是 vfat 之類的磁區，您不想讓 Linux 變更的話，那麼使用 ro 也不錯！能夠提供有效的保護呢！
      exec/noexec
      可執行/不可執行
               限制在此檔案系統內是否可以進行『執行』的工作？如果是純粹用來儲存資料的，那麼可以設定為 noexec 會比較安全，相對的，會比較麻煩！
      user/nouser
      允許/不許
               是否允許使用者使用 mount 指令來掛載呢？一般而言，我們當然不希望 user 身份的人能使用 mount 囉，因為太不安全了，因此這裡應該要設定為 nouser 囉！
      suid/nosuid
      具有suid/沒有suid
               該檔案系統是否允許 SUID 的存在？一般而言，如果不是 Linux 系統的磁區，而是一般資料的 partition ，那麼設定為 nosuid 確實比較安全一些！畢竟有 SUID 是蠻可怕的一件事
      usrquota
               啟動使用者磁碟配額模式支援
      grpquota
              啟動群組磁碟配額模式支援！
      defaults
               同時具有 rw, suid, dev, exec, auto, nouser, async 這些功能，所以預設情況中，使用這個即可！

      另外，如果有興趣的話，還可以加上類似『iocharset=big5,codepage=950』這種額外的功能參數以啟動中文編碼的支援，更詳細的資料可以 man mount 搜尋呢！

    5. 是否可以被 dump 指令備份：這一列在說明，使用 dump 指令來備份時時，該磁區是否跟著一起動作？如果沒有數字的話則以 0 帶入！由於我們希望有備份的功能，所以這裡當然就開啟( 1 )囉！

    6. 檢驗磁區：這個數字在用來以 fsck 檢驗磁區用的！在開機與關機的時候，通常 Linux 希望檢驗一下磁區，所以這裡需要設定一下。通常 root （就是根目錄 / 啦）需要設定為 1 ，而其他的檔案系統（ filesystem ）就設定為 1 即可！當然囉！由於 proc 及 swap 與 windows 並不需要以 fsck 來檢驗，所以就可以設定為 0 囉！
    所以，假如我要新增加一個 /dev/hdb1 並且掛載在 /disk2 這個目錄下的話，那麼我就在該檔案的最底加上一行：
    /dev/hdb1 /disk2 ext2 defaults 1 1
    或者我直接在這個檔案上面規劃好之後，再下達： mount -a 那麼程式就會自動的將 /etc/fstab 裡面的資訊讀出，並且依據裡面的情況來掛載磁區喔！如此一來，每次開機的時候都會自動的建立好對應的咚咚啦！

    有經驗的朋友大概都還蠻清楚的，就是 /etc/fstab 寫錯了的時候(最常發生在 quota 設定的時候)會造成無法開機的窘境，因此，通常我們都會把自己所想要的資料給他寫在 /etc/fstab 之後，以 mount –a 驅動看看，此外，如果錯誤已經造成了呢？那也不要太擔心，由於錯誤造成了，所以根目錄 / 預設會變成唯讀屬性，這個時候就得要進行 remount 的工作了，亦即下達：
    mount –n –o rw,remount /
    這樣應該就可以將磁碟掛載成為可讀寫了！

    此外，您必須瞭解的是， /etc/fstab 寫的是您的設定檔，但是目前的系統所掛載的資訊則是記錄在 /etc/mtab 這個檔案中喔！這個檔案會即時的進行更新，如果您重新手動掛載你的檔案系統，那麼這個 mtab 就會跟著變動囉！
    虛擬記憶體 Swap：
    我們前面談了很多各式各樣的 filesystem ，不過，您曉得在安裝的時候設定的那一個『虛擬記憶體, swap 』要如何增加嗎？舉個簡單的例子吧，我們的 Sun 主機上面，由於跑的程式太龐大了，通常 swap 需要開啟到 1GB 左右，但是呢，有的時候還是會不夠的！在 Linux 當中，如果您需要使用到很大量的虛擬記憶體，偏偏當初給的 swap 磁區不夠大，那要怎麼辦呢？有什麼方法可以來達成：
    • 設定一個 swap partition ？
    • 建立一個虛擬記憶體的檔案？
    怎麼說呢？基本上，虛擬記憶體就是將硬碟規劃出一個區間，讓記憶體的資料可以經由硬碟來讀取罷了，那麼如果有 swap file 也就夠了對不對！是呀！所以這裡我們使用兩種方法來嘗試建立一下 swap 的擴增吧！
    • Swap partition ( 建立虛擬記憶體的磁區 )：
      第一種正規的方法是『直接再加一棵硬碟，並且將其中某個磁區規劃為 swap 的 filesystem 』，呵呵，說的容易，做起來更容易！實際的動作為：
      1. 以『 fdisk /dev/hd[a-d] 』先建立一個 partition ，還記得 fdisk 怎麼做嗎？回去複習一下吧！簡單的來說，就是先 (1)建立一個 partition，然後 (2)將該 partition 的 ID 改為 82 這一個 swap 的磁碟檔案格式代號就對啦！這樣這一步驟就 OK 囉！

      2. 以『 mkswap /dev/hd[a-d][1-16] 』的方式來將您剛剛建置出來的 partition 『格式化為 swap 的檔案格式』，很簡單吧！這樣就格式化 OK 囉！

      3. 再來則是將 swap 啟動，啟動的指令為『 swapon /dev/hd[a-d][1-16] 』，這樣就能啟動了！很簡單吧！這樣 swap 就自動加入到記憶體容量裡頭去了！
      那麼如何將 swap 關掉呢？呵呵！很簡單呀！就是直接給他 swapoff 就對了！
    • Swap file ( 建立虛擬記憶體檔案 ) ：
      那麼萬一我不想新增加一個磁區呢？可不可以使用 swap file 的方式來新增硬碟呀！當然可以囉！而且步驟還蠻簡單的呢！基本的流程就是：
      1. 以 dd 指令來建立 swapfile ；
      2. 以 mkswap 來將 swapfile 格式化為 swap 的檔案格式；
      3. 以 swapon 來啟動該檔案，使成為 swap ；
      4. 以 swapoff 來關閉該檔案！
      嗯！多說無益！我們來實際的將您的主機系統上面新增 64MB 的虛擬記憶體吧！如果可能的話，請您在您的系統上面實際的操作一次底下的步驟，我想，您應該馬上會瞭解實際的操作流程的！（底下的步驟是可以復原的！！別擔心，不過 mkswap 這個指令的下達要小心一點就是了！）
      1. 使用 dd 這個指令來新增一個 64MB 的檔案在 /tmp 底下：
        [root@test /root]# dd if=/dev/zero of=/tmp/swap bs=4k count=16382
        16382+0 records in
        16382+0 records out
        dd 這個指令是用來轉換檔案並且 copy 用的；
        if 指的是要被轉換的輸入檔案格式 /dev/zero 可以由 man zero 來查看內容；
        of 指的是輸出的檔案，我們將之輸出到 /tmp/swap 這個檔案；
        bs 指的是一個磁區佔用幾個 kb ；
        count 指的是要使用多少個 bs ，所以最後的容量為 bs*count = 4k * 16382 ~ 64MB
        如上所述，我們將建立一個檔名為 /tmp/swap 的檔案，且其內容共有 64MB 左右大小的檔案；

      2. 使用 mkswap 將 /tmp/swap 這個檔案格式化為 swap 的檔案格式：
        [root@test /root]# mkswap /tmp/swap
        Setting up swapspace version 1, size = 67096576 bytes
        請注意，這個指令在下達的時候請『特別小心』，因為下錯字元控制，將可能使您的 filesystem 掛掉！

      3. 使用 swapon 來將 /tmp/swap 啟動囉！
        [root@test /root]# free
        total used free shared buffers cached
        Mem: 62524 60200 2324 0 716 19492
        -/+ buffers/cache: 39992 22532
        Swap: 127004 2620 124384
        [root@test /root]# swapon /tmp/swap
        不要懷疑！這樣就已經將虛擬記憶體增加 64 MB 囉！如果您需要每次都啟動該檔案，
        那麼將 swapon /tmp/swap 寫入 /etc/rc.d/rc.local 當中即可！
        用 free 這個指令查看一下您的系統囉！
        [root@test /root]# free
        total used free shared buffers cached
        Mem: 62524 60240 2284 0 724 19492
        -/+ buffers/cache: 40024 22500
        Swap: 192524 2620 189904

      4. 使用 swapoff 關掉 swap file
        [root@test /root]# swapoff /tmp/swap
        就直接給他關掉囉！
    沒錯，就這麼簡單的將虛擬記憶體給他新增囉！趕快來去試試看去！
    磁碟效能：
    我們都知道目前的 IDE 硬碟主要的傳輸模式為 ATA 模式，最近 （2002年）已經出到了 ATA 133 了！不過，傳統上， ATA 66 就已經很厲害了！新的 IDE 硬碟也沒有辦法完全利用 ATA 100 呢！但是，你知道嗎？有沒有開啟 ATA 這個傳輸通道的 DMA 模式，對於硬碟的存取效率差很大呦！好了！我們來測試一下磁碟的效能吧！
  • hdparm
    語法：
    [root @test /root ]# hdparm [-cdmXTt] [裝置名稱]
    參數說明：
    -c :提供 32 位元的存取模式，支援的型態有：
    -c0：關閉 32 位元存取模式
    -c1：開啟 32 位元存取模式
    -c3：以較為特殊的 sync 模式開啟 32 位元存取模式（建議值）
    -d :是否啟動硬碟的 DMA 模式， 0 為關閉， 1 為開啟。
    -m :設定 multiple sector I/O 的模式，通常預設為 16 ，建議值亦為 16 。
    -X :設定 IDE/ATA 模式的項目，支援如下的設定：
    -X34：開啟 DMA mode 2 (ATA)
    -X66：開啟 ultra DMA mode 2 (ATA66)
    -T :測試暫存區 cache 的存取效能
    -t :測試硬碟的實際存取效能 （較正確！）
    例：
    [root @test /root]# hdparm -Tt /dev/hda <==測試 hda 這顆硬碟的 cache 與實際效能
    [root @test /root]# hdparm -d0 /dev/hda <==關閉 DMA 模式！
    [root @test /root]# hdparm -d1 -c3 -X66 /dev/hda <==開啟 DMA 模式在 DMA 66 ，並且開啟 32 位元存取模式
    說明：
    這個指令必須要 root 才能執行！此外，需要特別注意， -X 這個參數是很危險的參數設定，除非您非常瞭解您的硬碟架構，否則不建議自行設定，因為 manual page 上面就有說明到這一點∼∼不過，無論如何，目前大於 2GB 以上的硬碟至少都已經支援了 DMA 33 了！因此，使用 -X66 應該都是可行的！較常建議的硬碟 DMA 開啟功能項目如下：
    hdparm -d1 -X66 -m16 -c3 /dev/hda
    另外，基本上目前的 Linux 預設都是開啟 DMA 的模式，因此這個指令的功能相對的重要性就降低了！不過，有一點仍然相當的重要，就是 Linux 預設的 -c 是關閉的，亦即是 -c0 的狀態，所以你可以增加上面的 -c3 來開啟 32 位元的存取模式呦！當然了，如果你的硬碟真的是很老舊的，那麼就不要開啟的好！好了！那麼如何開機就啟動 DMA 模式呢？！你可以將上面那一段指令寫入 /etc/rc.d/rc.local 裡面即可！
    • 附錄一：第二延伸檔案系統 ext2
    這裡轉貼一篇關於 ext2 這個 Linux 檔案格式的主要特點：
    第二延伸檔案系統(ext2)介紹 （本文摘自小紅帽技術論壇）

    自從我們開始使用電腦後，大多數的使用者都曾經使用過檔案，而我們總是對關於硬碟如何正確地儲存檔案感到好奇，它看起來似乎非常抽象，所以今天讓我們看一看 Linux 作業系統中較新的檔案系統版本『第二延伸系統( ext2 )』，並了解它各方面之用途。

    這個檔案系統是主要來自於Andrew Tanenbaum 所寫的Minix檔案系統，它也是唯一可用在免費作業系統的檔案系統，稱之為Minix。它後來修正為 Linux 所慣用的檔案系統並稱為延伸檔案系統，到現在 Linux 的檔案系統稱為 ext2 (第二延伸檔案系統)，它是延伸檔案系統中較新的版本並支援存取控制列(ACL)。

    但是在著手研究 ext2 檔案系統之前，讓我們先了解檔案系統中之專有名詞的關聯。
    • Block (區塊)：檔案在磁碟中被儲存在整數固定大小的區塊中，那區塊的大小通常是2的次方。在預設中，ext2檔案系統的區塊大小是4K。研究顥示，4K位元組對於一磁碟區塊而言是最理想的大小，假如一個檔案的大小無法達成4K位元組的倍數時，那最後的磁碟區塊部分就會被浪費。在最不好的例子中幾乎在完整的區塊中就有一位元組被浪費掉。
      對於這情況有一點技巧，假如我們選擇了一個較大的區塊，則對於小的檔案而言會有一些磁碟空間被浪費掉。另外一方面，假如我們使用一個非常小的區塊，則磁碟區塊數量會成指數的增加，因此對於檔案而言需有更多的搜尋時間。所以，選擇區塊大小必須三思而後行。
      當一個檔案被載入到記憶體時，那磁碟區塊會被放在主記憶體中之緩衝快取區，假如它們已經變更了，區塊在緩衝區中會被標記為’Dirty’，其意指的是這些區塊必須先寫到磁碟中來維持磁碟上的區塊及在主記憶體中的區塊之一致性．
    • Superblock：superblock是在每個檔案系統開始的位置，其儲存資訊像是檔案系統的大小，空的和填滿的區塊，它們各自的總數和其他諸如此類的資料。要從一個檔案系統中存取任何檔案皆須經過檔案系統中之superblock。如果superblock損壞了，它可能無法從磁碟中去取得資料。
  • Inode: 對於檔案系統而言一個inode是在inode表格中的一個項目。Inode包含了所有檔案有關的資訊例如名稱、大小、連接的數量、資料建立之日期，修改及存取的時間。它也包含了磁碟區塊的檔案指向(pointer)。pointer是用來記錄檔案被儲存在何處。

    • Ext2fs公用程式
    現在讓我們來看看一些標準Linux版本之ext2fsprogs公用程式

    • e2fsck
      這個程式允許我們在ext2檔案系統上去執行檔案系統檢查，它像是Windows中之Scandisk一樣，但卻是一種更有效的系統檢查方式。在此，我們可以加上一個檔案名稱來檢查上面之損壞區塊。
    警告:絕對不要在任何已掛載的檔案系統上執行 e2fsck/fsck。假如我們想要去執行 fsck，我們應該卸下檔案系統後再去執行 fsck（亦即需要 umount 該磁區囉）。如果不這樣做，可能會讓檔案系統毀損。
    • tune2fs
      這允許我們去調整檔案系統的參數設定。在此，我們可以設定在兩個檔案系統檢查間之最大掛載總數、容量標記、錯誤行為、變更保留的資訊和許多其他參數。
    • dumpe2fs
      這個程式將ext2檔案系統狀態輸出到標準的設備上。它對於分析問題以及存取一般關於檔案系統用法的資訊是有幫助的。
    • mke2fs
      這個程式允許我們在先前尚未格式化的磁碟中，去建立一個ext2的檔案系統。它提供了許多的選項包含區塊的大小、段落的大小、每一個inode的位元組到多種磁碟陣列的選項。mke2fs通常在第一次安裝的期間執行，並建立完成新的root 及其他的檔案系統。（就相當於 DOS 底下的 format 程式啦！）
    • badblocks
      這個程式去搜尋磁碟並檢查區塊是否已經損壞，它通常會在新的檔案系統安裝程式前執行，但請不要在掛載好的檔案系統上執行。
    在Linux檔案系統中最新的版本被稱為ext3，並已有 Journaling 之支援。Journaling 檔案系統對於所有已完成的步驟，持有記錄以及檢查點，所以假使系統當機時，它可以從最後的檢查點來還原檔案系統。
    附錄二：為何選擇 ext3 呢
    在最新的 Red Hat 7.2 當中，已經捨棄了 ext2 而改用支援 Journaling 的 ext3 這一個檔案格式了，那麼這兩個咚咚有什麼不一樣的呢？！底下有一篇翻譯過的文章，看看吧！

    Red Hat Linux 7.2 為何決定採用ext3檔案系統？

    Red Hat決定在7.2版中使用ext3的格式來作為預設的檔案系統在，引起相當多熟悉Linux使用者的關注，但ext3並不是唯一的，也不是眾多日誌式(journaling)檔案系統中最佳的。

    傳統的Linux檔案系統ext2，對於在相當小容量的硬碟上之小檔案而言是相當的理想。隨著硬碟的容量及檔案大小大幅增加，整體性能會下滑。有些原因是來自讀取未有效利用的磁碟空間，有些原因是來自不正常關機或是電源中斷檔案系統的恢復時間。檔案系統經由e2fsck在一個1GB的硬碟做檢查是毫不費力的，但相同的測試在40GB的硬碟上可能會相當的秏費時間。所以就有日誌式檔案系統的誕生。

    這些記錄硬碟狀態的檔案稱為日誌。所以在不正確關機之後重新啟動需要參考到日誌檔案來重新回復檔案系統的狀態，而非將整個硬碟做掃描。同時，日誌式檔案系統可以有更高的硬碟空間使用效率及使資料在各種不同之檔案大小中能夠快速的讀取及寫入。

    Linux並不是只有一個日誌式的檔案系統，它有四個，或是說成三又二分之一個：

    • Reiser檔案系統：依照Hans Reiser的名字而取。Reiser是眾所皆知的一種新式快速記錄硬碟內容的檔案系統，它曾經被廣泛的使用超過一年，且這個檔案系統被推薦安裝在SuSE7.1版及7.2版上。
    • JFS檔案系統：經由IBM所開發的，其設計的理念在於提供一高速的處理能力。IBM從2000年2月間開始經過一系列的測試版本，它的1.0版本已在六月底公開發表。
    • XFS檔案系統：XFS是SGI公司在Linux上所開發的日誌式檔案系統，它也提供了所有以完整發展為特色的日誌式檔案系統。
    • ext3檔案系統：ext3是之前所提及的二分之一日誌式檔案系統。為何只有一半呢?原因是ext3是一種疊在傳統ext2檔案系統上面並保有磁碟活動紀錄的日誌式檔案系統。所以當不正確關機時，檔案的恢復速度會比ext2檔案系統來的快。但是，因為它是被結合在ext2中，它會遭受到一些老舊系統的限制並因此不能利用所有日誌式檔案系統的完整功能。這樣並非是完全不好，因為ext3分割區並沒有不同於ext2檔案系統，因此如ext3損毀要回到ext2檔案系統卻是非常的簡單。
    Red Hat是第一個採用ext3的公司，它嘗試性的將Linux檔案系統推向日誌式檔案系統。當公司計畫在7.2版的第二個測試版本採用ext3時，公司中首席核心開發者Michael K. Johnson便迅速的提供一個原理的闡述：
    “為什麼你想要從ext2轉換到ext3呢？有四個主要的理由：可利用性、資料完整性、速度及易於轉換”。可利用性，他指出，這意味著從系統中止到快速重新復原而不是持續的讓e2fsck執行長時間的修復。ext3的日誌式條件可以避免資料毀損的可能。他也指出”除了寫入若干資料超過一次時，ext3往往會較快於ext2，因為ext3的日誌使硬碟讀取頭的移動能更有效的進行“。然而或許決定的因素還是在Johnson先生的第四個理由中。
    “它是可以輕易的從ext2變更到ext3來獲得一個強而有力的日誌式檔案系統而不需要重新做格式化”他說道。”那是正確的，為了體驗一下ext3的好處是不需要去做一種長時間的，冗長乏味的且易於產生錯誤的備份工作及重新格式化的動作”。
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • 如何增加一顆新的硬碟在你的 Linux 系統當中？請詳述流程：
      答：
      1. 安裝硬碟：關掉 Linux 主機電源，調整 Hard Disk 的 Jump （master 或 slave），串接在 IDE 的介面，請注意，留意你增加的硬碟所串接的 IDE 介面為哪一個插槽，例如你插在 IDE2 的 Master ，則你的硬碟應為 hdc；此外，需要特別留意的是，目前的機器中，如果是 ATA 66 以上的排線（那種很密的排線），那麼 master 或者是 slave 在排線上的順序是固定的！底端的是 Mater 而中間的是 Slave ，這點請稍微注意呦！

      2. B新增硬體於BIOS：開啟電腦後，按 del 鍵進入 BIOS，選擇 IDE Hard Disk Detector 字樣的選項，讓BIOS去捉硬碟，然後再選擇 Save and Exit；不過，較新的機器通常都可以自動偵測了！但是，如果你的機器是舊型的，那麼還是手動來增加硬碟吧！

      3. Linux 系統偵測：如果你的 Linux 系統有啟動 kudzu 這個服務時，那麼開機就會自動去偵測新的硬體裝置！ Red Hat 預設是有開啟這項服務的，除非你關掉他了！OK，假設你有開啟這項服務，那麼開機進入 Linux 的時候，系統會告訴你有捉到一個新的硬體，你可以按 『configure』由系統直接安裝即可；

      4. 格式化硬碟：以 root 的身份進入 Linux 後，執行以下兩個程式：
        • fdisk /dev/hdc <== hdc 與你的硬碟串接的IDE介面有關，關於這個指令的介紹請參考上面的指令說明；
        • mke2fs /dev/hdc1 <==假設硬碟全部配置成一個大硬碟，則硬碟應為 hdc1 ，以 mke2fs 將系統規劃為 Linux 的系統檔。

      5. 建立 mount point：假設我的這顆硬碟要掛在 /disk3 下面，那麼就需要 ：
          mkdir /disk3

      6. 開機自動載入( mount )：再來則是以 vi 修改 /etc/fstab 檔案，讓每次開機把這個硬碟直接掛入系統中。例如 hdc1 這顆硬碟掛在 /disk1 中，則 fstab 的檔案有點像底下這樣：（/dev/hdc1 那一行是新加入的！），修改完之後，直接以 mount -a 來掛載吧！

          /dev/hda1 / ext2 defaults 1 1
          /dev/hda5 swap swap defaults 0 0
          /dev/hdc1 /disk1 ext2 defaults 1 1

      7. 安裝完成：你可以使用 mount -a 來將全部的裝置重新掛載一遍，或者是重新開機就可以啦！
    • 如何增加某一目錄的容量：常常會聽到的一個問題是，我原先規劃的硬碟方式有點容量不足了，要如何增加容量呢？！這最容易發生在 /var/spool/mail 及 /home 底下了！好了，這裡我們以 /home 的容量不足了來進行說明！
      答：
      • 假設條件：我原先規劃的 /home 只有 1GB ，但是目前的使用者日眾，所以容量不足！我想要增加一棵 8GB 的舊硬碟，要如何作？！
      • 將硬碟加入 Linux 系統中：利用剛剛上面的方式將你的硬碟加入到 Linux 系統中，亦即是使用 fdisk 與 mke2fs 建立了 ext2 的檔案格式的硬碟！好了，同樣假設該硬碟的代號為 /dev/hdc1 好了！ 掛載新硬碟：由於我需要將新舊磁區都掛上來，這樣才有辦法將資料由舊硬碟移到新硬碟上面，OK！我就建立一個暫存的目錄，稱為 /disk-tmp：
          mkdir /disk-tmp
          mount -t ext2 /dev/hdc1 /disk-tmp
          如此一來則 /disk-tmp 就是新掛上來那顆 8 GB 的硬碟啦！
      • 移動資料：好了！現在開始將資料 copy 到新掛上的硬碟上面吧！
          cd /home
          tar -zcvf /disk-tmp/home.tar.gz *
          cd /disk-tmp
          tar -zxvf home.tar.gz
        上面的指令會將目前舊有的 /home 底下的東西完全的壓縮之後移動到 /disk-tmp/home.tar.gz 這個壓縮檔，然後再到 /disk-tmp 底下將他解壓縮！這樣資料就複製到新掛上來的硬碟啦！
      • 卸載舊的，掛上新的：好了，那麼我們就開始來測試一下吧！你可以這樣做：
          umount /home
          mount -t ext2 /dev/hdc1 /home
        注意呦！如果你的 /home 底下原本就沒有掛載磁區的話，那麼你就可以直接將 /home 底下的資料都砍掉，然後在掛上新的那顆硬碟就好了！而 home.tar.gz 這個檔案就可以用作為備份之用！
      • 開機執行：同樣的，如果要設定成開機就掛上這顆新的硬碟，那就修改 /etc/fstab 檔案吧！
    • 如何製作開機磁片：
      答：
        無論何種系統，有個開機片總是比較安心的！ Linux 也是一樣！雖然他很穩定，但是並不是說就不會有問題，因此製作可開機磁片以利解救 Linux 問題是一個好習慣！製作開機片的方法很簡單，請參考 mkbootdisk 的指令！
    • 請問底下的目錄與主要放置什麼資料？
      答：
      • /etc/：幾乎系統的所有設定檔案均在此，尤其 passwd, shadow
      • /etc/rc.d/init.d：系統開機的時候載入服務的 scripts 的擺放地點
      • /boot：開機設定檔，也是預設擺放核心 vmlinuz 的地方
      • /usr/bin, /bin：一般執行檔擺放的地方
      • /usr/sbin, /sbin：系統管理員常用指令集
      • /dev：擺放所有系統裝置檔案的目錄
      • /var/log：擺放系統登錄檔案的地方
    • 『舊的』 Unix 系統與 Linux 系統的『檔名』最多可以容許幾個字元？
      答：
        14, 255
    • 什麼是絕對路徑與相對路徑，要由 /usr/share/doc 進入到 /usr/share/man 由相對路徑與絕對路徑的寫法各為何？
      答：
      • 絕對路徑絕對由 / 開始寫起，相對路徑則非由 / 寫起；
      • cd /usr/share/man ; cd ../man
    • 在非為根目錄的任何一個目錄中，下達 ls –al 時，均會有『.』及『..』這兩個目錄，請問分別代表什麼？
      答：
      • . ：代表本目錄
      • .. ：代表上層目錄
    • 顯示、變換目錄的時候，使用什麼指令？
      答：
        ls, pwd 為顯示； 變換目錄用 cd
    • 新增目錄、移除目錄移動目錄與拷貝目錄有什麼指令可用？
      答：
      • 新增： mkdir 目錄,
      • 移除： rmdir 目錄(但是該目錄內必須要已經清空了), rm –rf 目錄,
      • 移動： mv directory1 directory2
      • 拷貝： cp –r directory1 directory2
    • 如何查看一個檔案的『內容』（不要使用 vi 的情況下）
      答：
        cat, tac, more, less, head, tail, nl, od(查看二進位制)
    • 什麼是 hard link 與 Symbolic link 的檔案？有何不同？
      答：
      • Hard Links：在做成 hard link 檔案時，系統會佔用掉一個 inode ，由連結檔案可發現其 link 欄位多使用了一個 inode ，當原始檔案被刪除的時候，該原始檔案的內容將繼續保留在其他的 Hard Links 檔案中；但所有 Link 佔用的硬碟總量僅佔一個檔案的容量大小！(但 Hard link 不能連結不同 filesystem 的檔案)
      • Symbolic Links：類似捷徑，當原始檔被刪除，soft link 檔案將找不到原始檔了！
    • 如何在 root 的家目錄下建立一個 /bin 的連結捷徑
      答：
        ln –s /bin /root/bin
    • 若有一個連結檔為 testing 連結到 test1.sh ，請問 copy testing 到 /tmp 底下，『cp testing /tmp』則 /tmp/testing 這個檔案會是：(1) 連結檔，連結到 test1.sh ；(2) 一般檔案，為內容與 test1.sh 相同？
      答：
        答案為 (2)
    • 當一個檔案屬性為 –rwxrwxrwt 則表示這個檔案的意義為？
      答：
        任何人皆可讀取、可寫入，但是不可刪除該檔案(或目錄)，除了 root 與檔案或目錄擁有者有權可以刪除。
    • 我需要將一個檔案的屬性改為 –rwxr-xr-- 請問該如何下達指令？
      答：
        chmod 754 filename, chmod u=rwx,g=rx,o=r filename
    • 在 /usr/bin/passwd 這個檔案的屬性為 –r-s--x--x 請問代表什麼意思(s)
      答：
        那個 s 代表為 SUID ，當使用者使用這個檔案進行工作的時候，將會具有該檔案擁有者的權限！
    • 如何改出 –rwxr-sr-x 與 –rwxr-xr-t這個屬性？
      答：
        chmod 2755 filename, chmod 1755 filename
    • 如何查看一個檔案的類型 (type) 例如純文字檔、執行檔與 setuid 檔案等？
      答：
        file filename
    • 若一個使用者的 umask 為 033 ，請問他建立一個新的目錄與檔案時的預設屬性為？
      答：
      • 目錄：744 ? -rwx-r--r--
      • 檔案：633 ? -rw--wx-wx
    • 若我需要更改一個檔案的擁有者與群組，該用什麼指令？
      答：
        chown, chgrp
    • 如何將一個檔案的修改日期改成目前的時間？
      答：
        touch filename
    • 如何搜尋一個檔案？
      答：
        which (僅用於指令搜尋), whereis, locate, fine
    • Linux 預設的檔案系統為何？此外，常用的 Journalling 檔案格式有哪些？
      答：
        Ext2, Journalling 有 ext3 及 Reiserfs 等
    • less 跟 more 有什麼不同？
      答：
        less 可以翻頁，但是 more 不行！
    • 在比較兩個檔案的異同時，常使用的是 diff 與 cmp ，請教兩者有何不同？
      答：
        diff 為一行一行比較， cmp 為一個字元(character)一個字元比較
    • 我要如何查看 Linux 系統當中所有已經掛載的硬碟容量與 inodes ？
      答：
        df –k, df –i,
    • 我要如何查看目前所在目錄的所有檔案佔用的硬碟空間，此外，如何僅輸出結果？
      答：
        du -k, du –i, du -s
    • 如果磁區 /dev/hda3 有問題，偏偏他是被掛載上的，請問我要如何修理此一磁區？
      答：
        umount /dev/hda3
        fsck /dev/hda3
    • 承上題，那麼有問題的檔案將被移動到那個目錄下？
      答：
        lost+found
    • 試說明新增一個 partition 在 /dev/hdb 當中，且為 hdb5時，並掛載上 /disk2 ，需要哪些步驟？
      答：
      • fdisk /dev/hdb 按 n 新增，按 e 新增 extended ，再按 n 新增 logical
      • mke2fs –b 2048 /dev/hdb5
      • mkdir /disk2
      • mount –t ext2 /dev/hdb5 /disk2
    • 如何新增加 64MB 的虛擬記憶體 swap ？
      答：
      • dd if=/dev/zero of=/tmp/swap bs=4k count=16384
      • mkswap /tmp/swap
      • swapon /tmp/swap
    2002/07/15：第一次完成
    2003/02/07：重新編排與加入 FAQ
    2002/06/26 以來統計人數


檔案的壓縮與打包
最近更新日期：2003/05/02
壓縮的用途與技術
Linux 壓縮檔案的附檔名
  compress
  gzip, zcat
  bzip2, bzcat
  tar
  cpio
本章習題練習
壓縮的用途與技術：
您是否有過文件檔案太大，導致無法以一片軟碟將他複製完成的困擾？又，您是否有過，發現一個軟體裡面有好多檔案，這些檔案要將他複製與攜帶都很不方便的問題？還有，您是否有過要備份某些重要資料，偏偏這些資料量太大了，耗掉了你很多的硬碟與磁碟空間呢？這個時候，那個好用的『檔案壓縮』技術可就派的上用場了！因為這些比較大型的檔案透過所謂的檔案壓縮技術之後，可以將他的磁碟使用量降低，可以達到減低檔案容量的效果，此外，有的壓縮程式還可以進行容量限制，使一個大型檔案可以分割成為數個小型檔案，以方便軟碟片攜帶呢！

那麼什麼是『檔案壓縮』呢？我們來稍微談一談他的原理好了。目前我們使用的電腦系統中都是使用所謂的 bytes 單位來計量的！不過，事實上，電腦最小的計量單位應該是 bits 才對啊，此外，我們也知道 1 byte = 8 bits 。但是如果今天我們只是記憶一個數字，亦即是 1 這個數字呢？他會如何記錄？假設一個 byte 可以看成底下的模樣：(註：由於 1 byte = 8 bits ，所以每個 byte 當中會有 8 個空格，而每個空格可以是 0, 1 ，這裡僅是做為一個約略的介紹，讀者不必刻意記憶 )
□□□□□□□□
而由於我們記錄數字是 1 ，考慮電腦所謂的二進位喔，如此一來， 1 會在最右邊佔據 1 個 bit ，而其他的 7 個 bits 將會自動的被填上 0 囉！你看看，其實在這樣的例子中，那 7 個 bits 應該是『空的』才對！不過，為了要滿足目前我們的作業系統資料的存取，所以就會將該資料轉為 byte 的型態來記錄了！而一些聰明的電腦工程師就利用一些複雜的計算方式，將這些沒有使用到的空間『丟』出來，以讓檔案佔用的空間變小！這就是壓縮的技術啦！簡單的說，你可以將他想成，其實檔案裡面有相當多的『空間』存在，並不是完全填滿的，而『壓縮』的技術就是將這些『空間』填滿，以讓整個檔案佔用的容量下降！不過，這些『壓縮過的檔案』並無法直接被我們的作業系統所使用的，因此，若要使用這些被壓縮過的檔案資料，則必須將他『還原』回來未壓縮前的模樣，那就是所謂的『解壓縮』囉！而至於壓縮前與壓縮後的檔案所佔用的磁碟空間大小，就可以被稱為是『壓縮比』囉！更多的技術文件或許你可以參考一下 GNU 計畫當中關於壓縮指令 gzip 的說明文件。當然，我 這裡 也保留一份資料，做為未來參考之用呢！

這個『壓縮』與『解壓縮』的動作有什麼好處呢？最大的好處就是壓縮過的檔案容量變小了，所以你的硬碟容量無形之中就可以容納更多的資料，此外，在一些網路資料的傳輸中，也會由於資料量的降低，好讓網路頻寬可以用來作更多的工作！而不是老是卡在一些大型的檔案上面呢！目前很多的 WWW 網站也是利用檔案壓縮的技術來進行資料的傳送，好讓網站的可利用率上升喔！( 註：這種技術蠻有趣的！他讓您網站上面『看的到的資料』在經過網路傳輸時，使用的是『壓縮過的資料』，等到這些壓縮過的資料到達你的電腦主機時，再進行解壓縮，由於目前的電腦運算速度相當的快速，因此其實在網頁瀏覽的時候，時間都是花在『資料的傳輸』上面，而不是 CPU 的運算啦！，如此一來，由於壓縮過的資料量降低了，自然傳送的速度就會增快不少！ )若您是一位軟體工程師，那麼相信您也會喜歡將你自己的軟體壓縮之後提供大家下載來使用，畢竟沒有人喜歡自己的網站天天都是頻寬滿載的吧？！舉個例子來說， Linux 2.4.19 完整的核心大小約有 200 MB 左右，而由於核心主要多是 ASCII code 的存文字型態檔案，這種檔案的『多餘空間』最多了。而一個提供下載的壓縮過的 2.4.19 核心大約僅有 30MB 左右，差了幾倍呢？您可以自己算一算喔！
Linux 壓縮檔案的附檔名
如果您常常在網路上面捉 Linux 的資料下來玩的話，大概會曉得的是，這些供人下載的檔案通常都是『壓縮』過的！為了什麼？上面已經稍微提過啦！呵呵！壓縮過的檔案具有節省頻寬、節省磁碟空間等等的優點，並且還方便攜帶呢！ ^_^ ！而，您應該也會知道，這些被壓縮過的檔案，通常其附檔名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』等等的，為什麼要訂定這些壓縮檔案附檔名為這樣的模樣呢？這是因為在 Linux 上面壓縮的指令相當的多，並且，這些壓縮指令可能無法針對每種壓縮檔案都可以解的開，畢竟目前的壓縮技術五花八門，每種壓縮計算的方法都不是完全相同的，所以囉，當你捉到某個壓縮檔時，自然就需要知道壓縮他的是那個指令啦，好用來對照著解壓縮啊！ ^_^！也就是說，雖然 Linux 檔案的屬性基本上是與檔名沒有絕對關係的，能不能執行與他的檔案屬性有關而已，與檔名的關係很小！但是，為了幫助我們小小的人類腦袋瓜子，所以適當的檔案名稱附檔名還是必要的！因此，目前就有一些常常見到的壓縮檔案的附檔名啦！我們僅列出常見的幾樣在底下，給大家權做參考之用：
  • *.Z compress 程式壓縮的檔案；
  • *.bz2 bzip2 程式壓縮的檔案；
  • *.gz gzip 程式壓縮的檔案；
  • *.tar tar 程式打包的資料，並沒有壓縮過；
  • *.tar.gz tar 程式打包的檔案，其中並且經過 gzip 的壓縮！
目前常見的壓縮程式主要就是如同上面提到的附檔名對應的那些指令啦！最早期的要算是 compress 這個傢伙了，而後，後來的 GNU 計畫開發出新一代的壓縮指令 gzip ( GNU zip ) 用來取代 compress 這個老牌的壓縮指令，再來還有 bzip2 這個壓縮比更好的壓縮指令呢！不過，這些指令通常僅能針對一個檔案來壓縮與解壓縮，如此一來，每次壓縮與解壓縮都要一大堆檔案，豈不煩人？，此時，那個所謂的『打包軟體』就顯的很重要啦！在 Unix-Like 當中，有個軟體很好玩，他就是 tar 這支程式！這個 tar 可以將很多檔案『打包』成為一個檔案！甚至是目錄也可以這麼玩。不過，單純的 tar 功能僅是『打包』而已，亦即是將很多檔案集結成為一個檔案，事實上，他並沒有提供壓縮的功能，後來， GNU 計畫中，將整個 tar 與壓縮的功能結合在一起，如此一來提供使用者更方便並且更強大的壓縮與打包功能！

底下我們就來談一談這些在 Linux 底下基本的壓縮指令吧！
  • compress：
    語法：
    [root @test /root ]# compress [-d] filename
    參數說明：
    -d ：解壓縮的參數！
    範例：
    先 copy /etc/man.config 到 root 底下，再將他壓縮看看
    [root @test /root]# cp /etc/man.config /root
    [root @test /root]# compress man.config
    [root @test /root]# compress -d man.config.Z
    [root @test /root]# uncompress man.config.Z
    這是用來壓縮與解壓縮附檔名為 *.Z 的指令！所以看到 *.Z 的檔案時，就應該要知道他是經由 compress 這個程式壓縮的呦！這是最簡單的壓縮指令囉！不過，使用的時候需要特別留意的是，當你以 compress 壓縮之後，如果沒有下達其他的參數，那麼原本的檔案就會被後來的 *.Z 所取代！以上面的案例來說明：原本壓縮的檔案為 man.config ，那麼當壓縮完成之後，將只會剩下 man.config.Z 這個經過壓縮的檔案囉！那麼解壓縮呢？呵呵，則是將 man.config.Z 解壓縮成 man.config ！使用上很簡單啦！解壓縮除了可以使用 compress –d 這個參數之外，也可以直接使用 uncompress ！意思相同啦！

  • gzip, zcat：
    語法：
    [root @test /root ]# gzip [-d#] filename <==壓縮與解壓縮
    [root @test /root ]# zcat filename.gz <==讀取壓縮檔內容
    參數說明：
    -d ：解壓縮的參數！
    -# ：壓縮等級， 1 最不好， 9 最好， 6 是預設值！
    範例：
    [root @test /root]# gzip man.config
    會產生 man.config.gz 這個檔案

    [root @test /root]# zcat man.config.gz
    會讀取出 man.config 的內容

    [root @test /root]# gzip -d man.config.gz
    [root @test /root]# gunzip man.config.gz
    解壓縮，產生 man.config 這個檔案

    [root @test /root]# gzip -9 man.config
    以最大壓縮比壓縮 testing 這個檔案！

    gzip 是用來壓縮與解壓縮附檔名為 *.gz 的指令！所以看到 *.gz 的檔案時，就應該要知道他是經由 gzip 這個程式壓縮的呦！另外， gzip 也提供 壓縮比的服務！ -1 是最差的壓縮比，但是壓縮速度最快，而 -9 雖然可以達到較佳的壓縮比（經過壓縮之後，檔案比較小一些！），但是卻會損失一些速度！預設是 -6 這個數值！ gzip 也是相當常使用的一個壓縮指令呢！至於 zcat 則是用來讀取壓縮檔資料內容的指令！假如我們剛剛壓縮的檔案是一個文字檔，那麼你還記得如何讀取文字檔嗎？！沒錯！就是使用 cat ，那麼讀取壓縮檔呢？呵呵！就是使用 zcat 囉！由於 gzip 這個壓縮指令主要想要用來取代 compress 的，所以 compress 的壓縮檔案也可以使用 gzip 來解開喔！同時， zcat 這個指令可以同時讀取 compress 與 gzip 的壓縮檔呦！

  • bzip2, bzcat：
    語法：
    [root @test root]# bzip2 [-dz] filename <==壓縮解壓縮指令
    [root @test root]# bzcat filename.bz2 <==讀取壓縮檔內容指令
    參數說明：
    -d ：解壓縮的意思！
    -z ：壓縮的意思！
    範例：
    同樣的，我們以剛剛拷貝過來的 /root/man.config 這個檔案為例
    [root @test root]# bzip2 –z man.config
    [root @test root]# bzcat man.config.bz2
    [root @test root]# bzip2 –d man.config.bz2
    [root @test root]# bunzip2 man.config.bz2
    剛剛的 compress 附檔名自動建立為 .Z ，這裡的 bzip2 則是自動的將附檔名建置為 .bz2 囉！所以當我們使用具有壓縮功能的 bzip2 –z 時，那麼剛剛的 man.config 就會自動的變成了 man.config.bz2 這個檔名囉！好了，那麼如果我想要讀取這個檔案的內容呢？是否一定要解開？當然不需要囉！可以使用簡便的 bzcat 這個指令來讀取內容即可！例如上面的例子中，我們可以使用 bzcat man.config.bz2 來讀取資料而不需要解開！此外，當您要解開一個壓縮檔時，這個檔案的名稱為 .bz, .bz2, .tbz, .tbz2 等等，那麼就可以嘗試使用 bzip2 來解看看啦！當然囉，也可以使用 bunzip2 這個指令來取代 bzip2 –d 囉

  • tar：
    語法：
    [root @test /root ]# tar [-zxcvfpP] filename
    [root @test /root ]# tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source
    參數說明：
    -z ：是否同時具有 gzip 的屬性？
    -x ：解開一個壓縮檔案的參數指令！
    -t ：查看 tarfile 裡面的檔案！
    -c ：建立一個壓縮檔案的參數指令
    -v ：壓縮的過程中顯示檔案！
    -f ：使用檔名，請留意，在 f 之後要立即接檔名喔！不要再加參數！
          例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法，要寫成
          『 tar -zcvPf tfile sfile』才對喔！
    -p ：使用原檔案的原來屬性（屬性不會依據使用者而變）
    -P ：可以使用絕對路徑
    -N ：比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案中！
    --exclude FILE：在壓縮的過程中，不要將 FILE 打包！
    範例：
    [root @test /root]# tar -cvf directory.tar directory
    只將目錄整合打包成一個檔案

    [root @test /root]# tar -zcvf directory.tar.gz directory
    除了將目錄打包外，同時以 gzip 壓縮

    [root @test /root]# tar -zcvf filename.tar.gz /home/test/*
    將 /home/test/ 這個目錄下的檔案全部打包並壓縮成為一個 filename.tar.gz 的檔案

    [root @test /root]# tar -xvf directory.tar
    解 tar 的封包，請注意，由於沒有 gzip (.tar 而非 .tar.gz) 的作用，所以只要使用 –xvf 即可！不需要加上 z ，否則會顯示有問題！

    [root @test /root]# tar -zxvf directory.tar.gz
    這個就是有加上 gzip 的壓縮的結果！所以需要加上 –z 呦！

    [root @test /root]# tar –ztvf directory.tar.gz
    這個 t 可以用來查看 tar 裡面的檔案資訊呢！而不需要將他解開！

    [root @test /root]# tar -zcvPf home.tar.gz /home
    則建立起來的壓縮檔內檔案為絕對路徑
    請注意，使用這個 P 的參數時，不要將 P 加在 f 後面，因為
    f 之後要立即接檔名才行喔！

    [root @test /root]# tar -N '2002/06/25' -zcvf home.tar.gz /home
    上面是說 在 /home 這個目錄中，比 2002/06/25 日還要新的檔案才會被打包進入 home.tar.gz 這個檔案中！

    [root @test /root]# tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc
    上面是說，將根目錄的所有資料都打包進 host.tar.gz 這個檔案中，但是 /mnt 及 /proc 則不打包！

    [root @test /root]# tar -cvf - /home | tar -xvf -
    上面的意思是『將 /home 打包之後，直接解壓縮在 /root 底下！』嘿嘿！不需要再建立一次中間檔案！不過，使用上面的語法最好使用『絕對路徑』，比較不會有問題！這個方式適合不想要建立中間檔案時！

    • 這是一個多用途的壓縮指令！剛剛我們提到的 compress 與 gzip 是可以適用在一個檔案的壓縮上面，但是如果是要壓縮一個目錄呢？！這時該如何是好？！呵呵！ tar 就派上用場了！ tar 可以將整個目錄或者是規定的檔案都整合成一個檔案！例如上面的第三個範例，他可以將 /home/test 底下的檔案全部整合成一個檔案！而第一個範例中，則是將目錄整合成一個檔案！同時， tar 可以配合 gzip （這個 gzip 的功能已經已經附加上 tar 裡面去了），同時整合並壓縮！呵呵！很方便吧！『 tar 用來作備份是很重要的指令！ 』而由於 tar 整合過後的檔案我們通常會取名為 *.tar ，而如果還含有 gzip 的壓縮屬性，那麼就取名為 *.tar.gz 囉！取這個檔名只是為了方便我們記憶這個檔案是什麼屬性罷了！並沒有實際的意義在！

    • 另外，需要注意的是，在使用的參數方面，有還有幾個有用的參數需要來瞭解一番，亦即是 -p 與 -P 這兩個！如果你曾經在 crontab 裡面下達過一些備份的指令時，那麼常常會收到 root 的信件，就是說，系統會告訴你『我將 / 的 tar 裡頭的內容拿掉了！』也就是說，原本你備份的檔案是 /home/test ，但是由於擔心未來你在解開壓縮的時候，會產生一些困擾，因為在 tar 裡面的檔案如果是具有『絕對路徑』的話，那麼你解開的檔案將會『一定』在該路徑下也就是 /home/test，而不是絕對路徑（這裡請用心的想一想！），這樣子的最大困擾是，萬一有人拿走了你的這個檔案，並且將該檔案在他的系統上面解開！萬一他的系統上面正巧也有 /home/test 這個目錄，哈哈！他的檔案就會『正巧』被覆蓋了！所以囉，在預設的情況中，如果是以『絕對路徑』來建立打包檔案，那麼將會自動的將 / 拿掉！這是為了剛剛說明的『安全』為前提所做的預設值。好了！但是你就是要以絕對路徑來建立打包的檔案！那麼就加入 -P 這個參數吧（請注意！是大寫字元）！這樣就可以啦！那麼 -p 是什麼（小寫字元）？呵呵！那個 -p 是 permission 的意思，也就是『權限』啦！使用 -p 之後，被打包的檔案將不會依據使用者的身份來改變權限喔！

    • 這裡還有一個值得注意的參數呦！那就是在備份的情況中很常使用的 -N 的這個參數！你可以參考一下上面的例子就可以知道啦！在這個例子當中，相當重要的就是那個日期啦！在備份的情況當中，我們都希望只要備份較新的檔案就好了，為什麼呢？因為舊的檔案我們已經有備份囉！幹嘛還要再備份一次，浪費時間也浪費系統資源！這個時候此一參數就顯的相當的重要了啊！

    • 在上面的例子中，最後一個例子很有趣『tar cvf - /home | tar -xvf - 』！他是直接以管線命令『 pipe 』來進行壓縮、解壓縮的過程！在上面的例子中，我們想要『將 /home 底下的資料直接 copy 到目前所在的路徑，也就是 /root 底下來』，但是又覺得使用 cp -r 有點麻煩，那麼就直接以這個打包的方式來打包，其中，指令裡面的 - 就是表示那個被打包的檔案啦！由於我們不想要讓中間檔案存在，所以就以這一個方式來進行複製的行為啦！

    • tar 的功能相當的多，而由於他是經由『打包』之後再處理的一個過程，所以常常我們會聽到 tarball 的檔案，那就是經由 tar 打包再壓縮的檔案啦！此外， tar 也可以用在備份的儲存媒體上面，最常見的就是磁帶機了！假設我的磁帶機代號為 /dev/st0 ，那麼我要將我的 /home 底下的資料都給他備份上去時，就是使用 tar /dev/st0 /home 就可以啦！很不錯吧！

      在 Linux 當中， gzip 已經被整合在 tar 裡面了！但是 Sun 或者其他較舊的 Unix 版本中， 當中的 tar 並沒有整合 gzip ，所以如果你需要解壓縮的話，就需要這麼做：

        gzip -d testing.tar.gz
        tar -xvf testing.tar

      第一個步驟會將檔案解壓縮，第二個步驟才是將資料解出來！與其他壓縮程式不太一樣的是， bzip2, gzip 與 compress 在沒有加入特殊參數的時候，原先的檔案會被取代掉，但是使用 tar 則原來的與後來的檔案都會存在呦！

  • cpio：
    語法：
    [root @test /root ]# cpio -covB > [file|device]<==備份
    [root @test /root ]# cpio -icduv < [file|device]<==還原
    參數說明：
    -o ：將資料 copy 輸出到檔案或裝置上
    -i ：將資料自檔案或裝置 copy 出來系統當中
    -t ：查看 cpio 建立的檔案或裝置的內容
    -c ：一種較新的 portable format 方式儲存
    -v ：讓儲存的過程中檔案名稱可以在螢幕上顯示
    -B ：讓預設的 Blocks 可以增加至 5120 bytes ，預設是 512 bytes ！
         這樣的好處是可以讓大檔案的儲存速度加快(請參考 i-nodes 的觀念)
    -d ：自動建立目錄！由於 cpio 的內容可能不是在同一個目錄內，
    如此的話在反備份的過程會有問題！ 這個時候加上 -d 的話，
    就可以自動的將需要的目錄建立起來了！
    -u ：自動的將較新的檔案覆蓋較舊的檔案！
    範例：
    [root @test /root]# find / -print | cpio -covB > /dev/st0
    將搜尋到的檔案存到磁帶機

    [root @test /root]# cpio -icduv < /dev/st0
    將磁帶機的資料還原回來！

    [root @test /root]# cpio -icdvt < /dev/st0 > /tmp/content
    將磁帶機的內容(檔名而已)轉存到 /tmp/content

    [root @test /root]# find / -type -f | cpio -o > /tmp/root.cpio
    [root @test /root]# cpio -i < /tmp/root.cpio
    上面這個例子可以馬上實作看看！先輸出到 /tmp/root.cpio 這個檔案，然後再給他還原回來！

    這個 cpio 還蠻神奇的呢！他最適用於備份的時候使用的一個指令了！為什麼呢？因為他並不像 cp 一樣，可以直接的將檔案給他 copy 過去，例如 cp * /tmp 就可以將所在目錄的所有檔案 copy 到 /tmp 底下，在 cpio 這個指令的用法中，由於 cpio 無法直接讀取檔案，而是需要『每一個檔案或目錄的路徑連同檔名一起』才可以被記錄下來！因此， cpio 最常跟 find 這個指令一起使用了！這個 cpio 好像不怎麼好用呦！但是，嘿嘿！他可是備份的時候的一項利器呢！因為他可以備份任何的檔案，包括 /dev 底下的任何裝置檔案！呵呵！所以他可是相當重要的呢！！您說是吧！ 而由於 cpio 必需要配合其他的程式，例如 find 來建立檔名，所以， cpio 與管線命令及命令重導向的相關性就相當的重要了！上面的例子剛好可以用來複習一下上一章節裡面提到的內容！加油啦！

    • 備份：在備份的用法當中，他可以直接跟輸出到檔案或者是裝置當中，但是如前面說過的，你必須要配合 find 這個指令較好呦！那個 -o 表示將檔案或目錄輸出到右邊去的意思！還記得命令重導向嗎？對啦！就是那個東西囉！在上面的例子中，我們將備份的資料給他 copy 到磁帶機裡頭去！那個磁帶機的裝置代號就是 /dev/st0 囉！

    • 還原：那麼如何給他反過來解開呢？呵呵！可以直接給他下達 cpio -i 就是 input 就對啦！例如上頭的例子囉！這個指令可以多看看呢
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2003/02/09：第一次完成
2003/05/05：修改 tar 的部分內容，尤其是 -P 這個參數的配合用法
2003/02/09 以來統計人數


vi 文書處理軟體
最近更新日期：2003/02/25

一個系統管理員至少應該要熟悉一種文字處理軟體，以方便未來的系統管理，包括系統設定與架站時候的參數設定檔修訂等等工作之進行。在 Unix-Like 系統中，肯定看的到的文書編輯器就是 vi 啦，他算是最正規的文字介面下的文書處理器了。為什麼文書處理器很重要呢？還記得前兩個章節中我們提到的 /etc/fstab 這個檔案嗎？您如果想要修改他的話，要如何修改呢？當然是使用文書編輯器來編輯他囉，那麼在 Linux 的指令列模式當中使用什麼文書編輯器呢呢？當然幾乎就是 vi 啦！此外，後續的 shell scripts 章節與 Linux 架站設定的檔案等等，幾乎都是使用他來進行設定耶！那 vi 重不重要呢？你猜猜?

vi 簡易說明
簡易執行範例
命令列內容說明
一個案例練習
本章與 LPI 的關係
本章習題練習
vi 簡易說明
由前面一路走來，我們一直建議使用文字模式來處理 Linux 的系統設定問題，因為不但可以讓您比較容易瞭解到 Linux 的運作狀況，也比較容易瞭解整個設定的基本精神，更能『保證』您的修改可以順利的被運作 ( 這裡要再次的強調，不同的 Linux distribution 各有其不同的附加軟體，例如 Red Hat 的 userconf, Linuxconf, ntsysv 與 setup 等等，而 Caldera 則有 COAS 等等，因此，如果您只會使用此種類型的軟體來控制您的 Linux 系統時，當接管不同的 Linux distribution 時，呵呵！那可就苦惱了！ ) 所以，在 Linux 的系統中使用文字編輯器來編輯您的 Linux 參數設定檔，嗯！可是一件很重要的事情呦！所以說嘛！系統管理員至少應該要熟悉一種文書處理器的！

由 Linux是什麼 介紹中，我們知道 Linux 與 Unix 系統中的參數檔幾乎都是 ASCII 碼的『純文字』檔！因此，利用簡單的文字編輯軟體就可以馬上修改 Linux 的參數檔囉！然而，與 Windows 不同的是，如果您用慣了 Microsoft Word 或 Corel Wordperfect 的話，那麼除了 Xwindows 裡面的編輯程式(如 xemacs )用起來尚可應付外，於 Linux 的文字模式下，會覺得檔案編輯程式都沒有 Windows 程式那麼方便。( 註：什麼是 ASCII 的純文字檔案呢？說穿了，就是您開啟的檔案可以將內容給您看到的檔案，而不是呈現亂碼的檔案，那就是純文字檔了！當您以 Windows 的 word 存一個檔案時，在 DOS 的情況下使用 type ，嗯！完全不知到內容是什麼？因為會出現很多的亂碼，那並非是純文字檔，而如果以 word 在存檔時，選擇『純文字類型』，嗯！那就可以使用 type 看到該檔案的內容了！總之，純文字檔相當的容易修改就是了！ )

無論如何，要管理好 Linux 系統，純文字的手工設定仍然是需要的！所以請您千萬不要嫌麻煩，努力的將下文參詳一下吧！以下我們以最常見到的 vi 這套文書軟體來介紹 Linux 底下的文書編輯動作。 ( 註： vi 是 Unix 預設的文書處理軟體，當然，也是 Linux 預設的文書處理軟體！ )

基本上 vi 共分為三種模式，分別是『一般模式』、『編輯模式』與『指令列命令模式』三種！

  • 一般模式：以 vi 處理一個檔案的時後，一進入該檔案就是一般模式了。在這個模式中，你可以使用『上下左右』按鍵來移動游標，您可以使用『刪除字元』或『刪除整行』來處理檔案內容，也可以使用『複製、貼上』來處理您的文件資料。
  • 編輯模式：在一般模式中可以處理刪除、複製、貼上等等的動作，但是卻無法編輯的！要等到您按下『i, I, o, O, a, A, r, R』等字母之後才會進入編輯模式。注意了！通常在 Linux 中，按下上述的字母時，在畫面的左下方會出現『 INSERT 或 REPLACE 』的字樣，才可以輸入任何字來輸入到您的檔案中！而如果要回到一般模式時，則必須要按下『Esc』這個按鍵即可退出編輯模式。
  • 指令列命令模式：在一般模式當中，輸入『 : 或 / 』就可以將游標移動到最底下那一行，在這個模式當中，可以提供您『搜尋資料』的動作，而讀取、存檔、大量取代字元、離開 vi 、顯示行號 等等的動作則是在此模式中達成的！
簡單的說，我們可以將這三個模式想成底下的圖示來表示之：
閒話不多說，我們底下以一個簡單的例子來進行說明吧！
簡易執行範例
我們怎麼使用 vi 建立一個檔名為 test.txt 的資料呢？也是很簡單的啦，
  1. 使用 vi 進入一般模式；
    [root @test root]# vi test.txt
    直接輸入『 vi 檔名』即可進入 vi 了！如下圖所示，左下角還會顯示這個檔案目前的狀態！如果是新建檔案會顯示 [New File]，如果是以存在的檔案，則會顯示目前的檔名、行數與字元數，例如：『"/etc/man.config" 145L, 4614C』

  2. 按下 i 進入編輯模式，開始編輯文字；
    在一般模式之中，只要按下 I, o, a 等字元，就可以進入編輯模式了！在編輯模式當中，您可以發現在左下角會出現 –INSERT- 的畫面，那就是可以輸入任意字元的提示囉！這個時候，鍵盤上除了 [Esc] 這個按鍵之外，其他的按鍵都可以視作為一般的輸入按鈕了，所以您可以進行任何的編輯囉！（註：在 vi 裡面， [tab] 這個按鈕所得到的結果與空白字元所得到的結果是不一樣的，特別強調一下！）

  3. 按下 [ESC] 按鈕回到一般模式；
    好了，假設我已經按照上面的樣式給他編輯完畢了，那麼應該要如何退出呢？是的！沒錯！就是給他按下 [Esc] 這個按鈕即可！馬上你就會發現畫面左下角的 – INSERT – 不見了！

  4. 在一般模式中按下 :wq 儲存後離開 vi ！
    OK，我們要存檔了，存檔並離開的指令很簡單，輸入『:wq』即可存檔離開！（注意了，按下 : 該游標就會移動到最底下一行去！）這時你在提示字元後面輸入『 ls -l 』即可看到我們剛剛建立的 test.dat 檔案啦！整個圖示有點像底下這樣：

    如此一來，您的檔案 test.txt 就已經建立起來囉！很簡單吧！需要注意的是，如果您的檔案權限不對，例如為 -r--r--r-- 時，那麼可能會無法寫入，那麼可以使用『強制寫入』的方式嗎？可以！使用『:wq!』多加一個驚嘆號即可！不過，需要特別注意呦！那個是在『您的權限可以改變』的情況下才能成立的！關於權限的概念，請參考一下 Linux 的檔案權限概念 囉！
命令列內容說明
如前所述，所謂的命令列或命令模式，就是在最下面一行沒有顯示『--INSERT--』或者『--REPLACE--』字樣的時候。通常在命令列中的指令有下面幾種：（注意，當按下『:』 時，游標會自動移動到螢幕的最下面一行！）

一般模式： 移動游標
h 或 向左方向鍵
 游標向左移動一個字元
j 或 向下方向鍵
 游標向下移動一個字元
k 或 向上方向鍵
 游標向上移動一個字元
l 或 向右方向鍵
 游標向右移動一個字元
[Ctrl] + [f]
 螢幕『向前』移動一頁（常用）
[Ctrl] + [b]
 螢幕『向後』移動一頁（常用）
[Ctrl] + [d]
 螢幕『向前』移動半頁
[Ctrl] + [u]
 螢幕『向後』移動半頁
+
 游標移動到非空白字元的下一列
-
 游標移動到非空白字元的上一列
n<space>
 按下數字後再按空白鍵，游標會向右移動這一行的 n 個字元。例如 20<space> 則游標會向後面移動 20 個字元距離。
0
 這是數字『 0 』：移動到這一行的最前面字元處（常用）
$
 移動到這一行的最後面字元處（常用）
H
 游標移動到這個螢幕的最上方那一行
M
 游標移動到這個螢幕的中央那一行
L
 游標移動到這個螢幕的最下方那一行
G
 移動到這個檔案的最後一行（常用）
nG
 移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的 20 行(可配合 :set nu)
n<Enter>
 游標向下移動 n 行（常用）
一般模式： 搜尋與取代
/word
 向游標之後尋找一個字串名稱為 word 的字串。（常用）
?word
 向游標之前尋找一個字串名稱為 word 的字串。
:n1,n2s/word1/word2/g
 在第 n1 與 n2 行之間尋找 word1 這個字串，並將該字串取代為 word2 ！（常用）
:1,$s/word1/word2/g
 從第一行到最後一行尋找 word1 字串，並將該字串取代為 word2 ！（常用）
:1,$s/word1/word2/gc
 從第一行到最後一行尋找 word1 字串，並將該字串取代為 word2 ！且在取代前顯示提示字元給使用者確認（conform）是否需要取代！（常用）
一般模式： 刪除、複製與貼上
x, X
 x 為向後刪除一個字元， X 為向前刪除一個字元（常用）
nx
 向後刪除 n 個字元
dd
 刪除游標所在的那一整列（常用）
ndd
 刪除游標所在的向下 n 列，例如 20dd 則是刪除 20 列（常用）
d1G
 刪除游標所在到第一行的所有資料
dG
 刪除游標所在到最後一行的所有資料
yy
 複製游標所在的那一行（常用）
nyy
 複製游標所在的向下 n 列，例如 20yy 則是複製 20 列（常用）
y1G
 複製游標所在列到第一列的所有資料
yG
 複製游標所在列到最後一列的所有資料
p, P
 p 為複製的資料在游標下一行貼上，P 則為貼在游標上一行！（常用）
J
 將游標所在列與下一列的資料結合成同一列
c
 重複刪除多個資料，例如向下刪除 10 行，[ 10cj ]
u
 復原前一個動作。（常用）
進入編輯模式
i, I
 插入：在目前的游標所在處插入輸入之文字，已存在的文字會向後退；（常用）
a, A
 增加：由目前游標所在的下一個字開始輸入，已存在的文字會向後退：（常用）
o, O
 插入新的一行：從游標所在的下一行枝行首開始輸入文字；（常用）
r, R
 取代：r 會取代游標所在的那一個字元；R會一直取代游標所在的文字，直到按下 ESC 為止；（常用）
Esc
 退出編輯模式，回到一般模式中（常用）
指令列命令模式
:w
 將編輯的資料寫入硬碟檔案中（常用）
:w!
 若檔案屬性為『唯讀』時，強制寫入該檔案
:q
 離開 vi （常用）
:q!
 若曾修改過檔案，又不想儲存，使用 ! 為強制離開不儲存檔案。
:wq
 儲存後離開，若為 :wq! 則為強制儲存後離開（常用）
:e!
 將檔案還原到最原始的狀態！
ZZ
 若檔案沒有更動，則不儲存離開，若檔案已經經過更動，則儲存後離開！
:w [filename]
 將編輯的資料儲存成另一個檔案（類似另存新檔）
:r [filename]
 在編輯的資料中，讀入另一個檔案的資料。亦即將 『filename』這個檔案內容加到游標所在行後面
:set nu
 顯示行號，設定之後，會在每一行的字首顯示該行的行號
:set nonu
 與 set nu 相反，為取消行號！
n1,n2 w [filename]
 將 n1 到 n2 的內容儲存成 filename 這個檔案。
:! command
 暫時離開 vi 到指令列模式下執行 command 的顯示結果！例如[ :! ls /home ]

OK！會這些指令就已經很厲害了，因為常用到的指令也只有不到一半！通常 vi 的指令除了上面 VBird 註明的常用的幾個外，其他是不用背的，你可以做一張簡單的指令表在你的螢幕牆上，一有疑問可以馬上的查詢呦！

一個案例練習
來來來！測試一下您是否已經熟悉 vi 這個指令呢？請依照底下的需求進行您的指令動作( 請注意，該檔案為 Mandrake 9.0 所附上的檔案內容，如果是其他的 distribution ，可能結果會不太一樣！ )，然後看一下結果在螢幕前面顯示什麼？
  1. 請在 /root 這個目錄下建立一個名為 vitest 的目錄；
  2. 進入 vitest 這個目錄當中；
  3. 將 /etc/man.config 拷貝到本目錄底下；
  4. 使用 vi 開啟本目錄下的 man.config 這個檔案；
  5. 在 vi 中設定一下行號；
  6. 移動到第62 行，向右移動 40 個字元，請問您看到的雙引號內是什麼目錄？
  7. 移動到第一行，並且向下搜尋一下『 teTeX 』這個字串，請問他在第幾行？
  8. 接著下來，我要將 50 到 100 行之間的 man 改為 MAN ，並且一個一個挑選是否需要修改，如何下達指令？
  9. 修改完之後，突然反悔了，要全部復原，有哪些方法？
  10. 我要複製 51 到 60 行這十行的內容，並且貼到最後一行之後；
  11. 刪除 11 到 30 行之間的 20 行；
  12. 將這個檔案另存成一個 man.test.config 的檔名；
  13. 去到第 29 行，並且刪除 15 個字元；
  14. 請問目前的檔案有多少行與多少字元？
  15. 儲存後離開吧！
整個的步驟可以如下所示：
  1. mkdir /root/vitest
  2. cd /root/vitest
  3. cp /etc/man.config .
  4. vi man.config
  5. : set nu
  6. 先按下 62G ，再按下 40 + 向右鍵，會看到『/dir/bin/foo』
  7. 先按下 1G ，然後按下 /teTeX 搜尋，會看到他在第 51 行！
  8. :50,100s/man/MAN/gc
  9. (1)簡單的方法可以一直按 u 回復到原始狀態，(2)使用不儲存離開 :q! 之後，再重新讀取一次該檔案
  10. 51G 然後在 10yy 之後按下 G 到最後一行，再給他 p 貼上十行！
  11. 11G 之後，再給他 20dd 即可刪除 20 行了；
  12. :w man.test.config
  13. 29G 之後，再給他 15x 即可刪除 15 個字元；
  14. 135行，共 3903 個字元
  15. :wq!
如果您的結果都可以查的到，那麼 vi 的使用上面應該沒有太大的問題啦！剩下的問題會是在…..打字練習….
本章與 LPI 的關係：
在 http://www.lpi.org 所提供的 topic 當中， LPI 101 的 Topic 103 之 1.103.8 提到：『應試者應該能夠學會使用 vi 文書編輯器，學習的目標包含了 vi 的插入、編輯、刪除、複製與搜尋等功能的練習！』至於使用到的指令與 vi 當中所會用到的資料與指令為：
  • vi
  • /, ? (請看搜尋部分)
  • h, j, k, l (移動游標的部分，這個較常考！)
  • G, H, L (移動游標的部分)
  • i, c, d, dd, p, o, a (刪除、編輯與貼上的部分)
  • ZZ, :w!, :q!, :e!
  • :!
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 我要在某個檔案的第 34 行向右移動 15 個字元，應該在一般模式下達什麼指令？
    答：
      1. 先按下 11G 到第 11 行；
      2. 再按下 [ 15 + 向右鍵 ]，或 [ 15l ] 亦可！

  • 在 vi 裡面， PageDown 按鈕可以使用什麼組合鍵來取代？
    答：
      [Ctrl] + f 可以向後翻一頁
  • 如何去到 vi 該檔案裡面的頁首或頁尾？
    答：
      去頁首按下 1G ；
      去頁尾按下 G 即可
  • 如何在一行中，移動到行頭及行尾？
    答：
      移動到行頭，按 0 ，
      移動到行尾按 $ 即可！
  • 進入編輯模式的按鈕？
    答：
      i, I, o, O, a, A, R
  • vi 裡面， r 有什麼功能？
    答：
      取代游標所在的那個字元！
  • 如何將目前的頁面另存新檔？
    答：
      :w filename
  • 在 linux 底下最常使用的文書編輯器為 vi ，請問如何進入編輯模式？
    答：
    • 在一般模式底下輸入： i, I, a, A 為在本行當中輸入新字元；（出現 –Insert- ）
    • 在一般模式當中輸入： o, O 為在一個新的一行輸入新字元；
    • 在一般模式當中輸入： r, R 為取代字元！（左下角出現 –Replace-）
  • 如何由編輯模式跳回一般模式？
    答：
      可以按下[Esc]
  • 若上下左右鍵無法使用時，請問如何在一般模式移動游標？
    答：
      [h, j, k, l]分別代表[左、下、上、右]
  • 若 [pagedown] [ pageup] 在一般模式無法使用時，如何往前或往後翻一頁？
    答：
      向下翻 [Ctrl] + [f]
      向前翻 [Ctrl] + [b]
  • 如何到本檔案的最後一行、第一行；本行的第一個字元、最後一個字元？
    答：
      分別為：G, 1G, 0, $
  • 如何刪除一行、n行；如何刪除一個字元？
    答：
      分別為 dd, ndd, x 或 X （dG 及 d1G 分別表示刪除到頁首及頁尾）
  • 如何複製一行、n行並加以貼上？
    答：
      分別為 yy, nyy, p 或 P
  • 如何搜尋 string 這個字串？
    答：
      ?string (往前搜尋)
      /string (往後搜尋)
  • 如何取代 word1 成為 word2，而若需要使用者確認機制，又該如何？
    答：
      :1,$s/word1/word2/g 或
      :1,$s/word1/word2/gc （需要使用者確認）
  • 如何讀取一個檔案 filename 進來目前這個檔案？
    答：
      :r filename
  • 如何另存新檔成為 newfilename？
    答：
      :w newfilename
  • 如何存檔、離開、存檔後離開、強制存檔後離開？
    答：
      :w； :q： :wq； :wq!
  • 在 vi 底下作了很多的編輯動作之後，卻想還原成原來的檔案內容，應該怎麼進行？
    答：
      直接按下 :e! 即可恢復成檔案的原始狀態！

  • 我在 vi 這個程式當中，不想離開 vi ，但是想執行 ls /home 這個指令，vi 有什麼額外的功能可以達到這個目的：
    答：
      事實上，可以使用[ :! ls /home ]不過，如果你學過後面的章節之後，你會發現，執行[ ctrl + z ]亦可暫時退出 vi 讓你在指令列模式當中執行指令喔！

  • 如何設定與取消行號？
    答：
      :set nu
      :set nonu
vi 文書處理軟體
2002/04/05：第一次完成
2003/02/07：重新編排與加入 FAQ
2003/02/25：新加入本章節與 LPI 的相關性說明！
http://info.sayya.org/~edt1023/vim/
2002/ 01/21以來統計人數


認識 BASH Shell
最近更新日期：2003/02/10
什麼是 Shell
BASH Shell
變數與變數的設定： echo, env, set, 變數設定規則, export, unset, 變數的有效範圍, read, array, $RANDOM, eval, 重要的環境變數(?, HOME, SHELL, MAIL, HISTSIZE...)
命令別名與歷史命令：alias(設定命令別名), history, !command,
bash shell 的設定檔案： source,
萬用字元與特殊符號：
絕對路徑與相對路徑
命令重導向 ( redirect )
管線命令 ( pipe )： cut, sort, wc, uniq, tee, tr, split,
本章習題練習
什麼是 Shell
這應該是個蠻有趣的話題：『什麼是 Shell ？』相信只要摸過電腦，對於作業系統（不論是 Linux 、 Unix 或者是 Windows ）有點概念的朋友們大多聽過這個名詞，因為只要有『作業系統』那麼就離不開 Shell 這個東西。不過，在討論 Shell 之前，我們先來瞭解一下電腦的運作狀況吧！舉個例子來說：當你要電腦傳輸出來『音樂』的時候，你的電腦需要什麼東西呢？
  1. 當然就是需要你的硬體有『音效卡晶片』這個硬體配備，否則怎麼會有聲音；
  2. 作業系統的核心可以支援這個晶片組，當然還需要提供晶片的驅動程式囉；
  3. 需要使用者（就是你）輸入發生聲音的指令囉！
這就是基本的一個輸出聲音的需要的步驟！那麼也就是說，你必須要『輸入』一個指令之後，『硬體』才會透過你下達的指令來工作！嘿嘿！那麼硬體如何知道你下達的指令呢？那就是 kernel （核心）的控制工作了！瞭解了嗎？沒錯！也就是說，我們必須要透過『 Shell 』將我們輸入的指令與 Kernel 溝通，好讓 Kernel 可以控制硬體來正確無誤的工作！基本上，我們可以透過底下這兩張圖來說明一下：

基本上，替我們工作的是『硬體』，而控制硬體的是『核心』，再來，我們使用者乃是利用『Shell』控制一些 kernel 提供的 『工具 Utility』來操控硬體替我們正確的工作。再進一步來說，由於 kernel 聽不懂人類的語言，而人類也沒有辦法直接記得 kernel 的語言，所以兩者的溝通就得藉由 shell 來支援了！（其實早期的 DOS 的文字介面也是使用 shell 來溝通呀！那個 shell 的名稱就叫做 command.com ，還記得嗎？ ^_^）

以字面上的意思來說， kernel 是『核心』的意思，而 Shell 是『殼』的意思，呵呵！也就是說， shell 是最外頭的咚咚！而 kernel 乃是最內層的的咚咚啦！核心是作業系統的最底層的東西！這個核心裡頭包括了各種的支援硬體的工具！當然囉，如果你的硬體太新，而你的 kernel 並沒有支援的話，那麼很抱歉，你的 Shell 能力再怎麼強，也沒有辦法使硬體工作的！這樣可以瞭解了嗎？呵呵！沒錯！使電腦主機工作的正是核心的任務，但是操作核心來替使用者工作的，卻是 shell 喔！因此，有時候你的 shell 搞了老半天，硬體卻不能工作的時候，請注意，您的『核心』是否正確呢？阿！扯遠了！這是 kernel 章節才要說的東西??
  • 我幹嘛要學習 Shell 呢？
    常常聽到這個問題：『我幹嘛要學習 shell 呢？不是已經有很多的工具可以提供我設定我的主機了？我為何要花這麼多時間去學指令呢？不是以 X-Window 按一按幾個按鈕就可以搞定了嗎？為什麼要這麼麻煩？』唉?還是得一再地強調，X-Window 還有 Web 介面的設定工具例如 webmin 是真的好用的傢伙，他真的可以幫助我們很簡易的設定好我們的主機，甚至是一些很進階的設定都可以幫我們搞定。但是 VBird 在序章裡面也已經提到過相當多次了， X-Window 的介面雖然親善，功能雖然強大，而 web 介面的工具也可以提供我們很友善的服務，但是畢竟他是整合的一個套件而已，並非是一個完整的套件，所以某些時候當你升級或者是使用其他套件管理模組( 例如 tarball 而非 rpm 檔案等等 )時，就會造成設定的困擾了，此外，遠端連線時，文字介面的傳輸速度一定比較快，而且，較不容易出現斷線或者是資訊外流的問題，因此， shell 真的是得學習的一項工具。而且，他可以讓您更深入 Linux ，更瞭解他，而不是只會按一按滑鼠而已！所謂『天助自助者！』多摸一點文字模式的東西，會讓你與 Linux 更親近呢！

    有些朋友也很可愛，常會說：『我學這麼多幹什麼？又不常用，也用不到！』嘿嘿！有沒有聽過『書到用時方恨少？』當你的主機一切安然無恙的時候，您當然會覺得好像學這麼多的東西一點幫助也沒有呀！萬一，某一天真的不幸給他中標了，您該如何是好？是直接重新安裝？還是先追蹤入侵來源後進行漏洞的修補？或者是乾脆就關站好了？這當然涉及很多的考量，但就以 VBird 的觀點來看，多學一點總是好的，尤其我們可以有備而無患嘛！甚至學的不精也沒有關係，瞭解概念也就 OK 啦！畢竟沒有人要您一定要被這麼多的內容啦！瞭解概念就很了不起了！

    此外，如果您真的有心想要將您的主機管理的好，那麼良好的 shell 程式編寫是一定需要的啦！就 VBird 來說，我管理的主機雖然還不算多，只有區區不到十部，但是如果每部主機都要花上幾十分鐘來查閱他的 log file 以及相關的資訊，那麼我可能會瘋掉！基本上，也太沒有效率了！這個時候，如果能夠藉由 shell 提供的命令重導向( 或稱資料流重導向 )，以及管線命令，呵呵！那麼我分析 log file 只要花費不到十分鐘就可以看完所有的主機之重要資訊了！相當的好用呢！

    由於學習 shell 的好處真的是多多啦！所以，如果您是個系統管理員，或者有心想要管理系統的話，那麼 shell 這個東西與 shell scripts 這個東西，真的真的有必要看一看！
BASH Shell
知道什麼是 Shell 之後，那麼我們來瞭解一下 Linux 使用的是哪一個 shell 呢？什麼！哪一個？難道說 shell 不就是『一個 shell 嗎？』哈哈！那可不！由於早年的 Unix 年代，發展者眾，所以由於 shell 依據發展者的不同就有許多的版本，例如常聽到的 Bourne SHell (sh) 、在 Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等，每一種 Shell 都各有其特點。至於 Linux 使用的這一種版本就稱為『 Bourne Again SHell （簡稱 bash ） 』，這個 Shell 是 Bourne Shell 的增強版本，也是基準於 GNU 的架構下發展出來的呦！

在介紹 shell 的優點之前，先來說一說 shell 的簡單歷史吧：第一個流行的 shell 是由 Steven Bourne 發展出來的，為了紀念他所以就稱為 Bourne shell ，或直接簡稱為 sh ！而後來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的 shell ，這個 shell 的語法有點類似 C 語言，所以才得名為 C shell ，簡稱為 csh ！由於在學術界 Sun 主機勢力相當的龐大，而 Sun 主要是 BSD 的分支之一，所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一（因為太多的程式設計師使用的就是 C 語言啦！）！

好了，那麼 BASH 是怎麼一回事呢？這個 shell 是 GNU 計畫中重要的工具軟體之一，目前也是 GNU 作業系統中標準的 shell ，他主要相容於 sh ，並且依據一些使用者需求，而加強的 shell 版本，可以說目前幾乎所有的 Linux distribution 都是使用 bash 作為管理核心的主要 shell ！因此，不論您使用的是那個 distribution ，你都難逃需要學習 bash 的宿命啦！那麼這個 shell 有什麼好處，幹嘛 Linux 要使用他作為預設的 shell 呢？ BASH 主要的優點有底下幾個：

  • 命令編修能力（類似 DOS 的 doskey 功能）：
    使用 bash 裡頭，個人認為相當棒的一個功能就是『他能記憶使用過的指令！』這功能真的相當的棒！因為我只要在指令列按『上下鍵』就可以找到前一個輸入的指令！而在 Mandrake 9.0 預設的指令記憶功能可以到達 1000 個！也就是說，你曾經下達過的指令都被記錄下來了，記錄的檔案在你的家目錄內的 .bash_history ！不過，需要留意的是， ~/.bash_history 記錄的是前一次登入以前所執行過的指令，而至於這一次登入所執行的指令都被暫存在暫記憶體中，當您成功的登出系統後，該指令記憶才會記錄到 .bash_history 當中！這有什麼功能呢？最大的好處就是可以『查詢曾經做過的舉動！』，如此可以知道你的執行步驟，那麼就可以追蹤您曾下達的指令，以作為除錯的工具！但如此一來也有個煩惱，就是如果被駭客入侵了，那麼他只要翻你曾經執行過的指令，剛好你的指令又跟系統有關（例如直接輸入 MySQL 的密碼在指令列上面）那麼很容易就被破解你的 Linux 主機！所以，最好是將記錄的指令數目減小一點較好！
  • 檔案比對補全功能（比對資料正確性）：
    這個功能也相當的棒！主要分為指令補全與檔案名稱補全：
    • 指令補全：如果在執行命令的時候不想按下太多的按鍵，例如指令 pcprofiledump 夠長吧！好了，那麼如果你輸入了 pcprofile 之後，再按下 [Tab] 按鍵的話，那麼 bash 馬上會自動的將後面的 dump 接上來！那如果有重複的指令呢？那麼按下兩次 [Tab] 將會把所有重複的指令給他列出來囉！那麼就有個特殊的案例啦，就是『直接在提示字元後面連按兩次 <tab> 鍵，則系統會將所有可以使用的指令都列出來！』那麼如果我想要知道目前系統裡面，所以 b 開頭的指令呢？呵呵！就是按下 b 之後，連按兩次 <tab> 就可以知道啦！
    • 檔案名稱補全：此外，如果你用 vi 來讀取某個檔案時，例如 /etc/man.config 這個檔案好了，那麼您可以輸入 vi /etc/man. 之後，直接按下 <tab> 按鍵，那麼該檔案名稱就會被自動的補齊囉！呵呵！很方便，而且對於檔案名稱或者指令名稱的正確性上面，幫助還蠻大的吧！是的！真的是很方便的功能，所以，有事沒事，在 bash shell 底下，多按幾次 <tab> 是一個不錯的習慣啦！
  • 命令別名(alias)設定功能：
    假如我需要知道這個目錄底下的所有檔案（包含隱藏檔）及所有的檔案屬性，那麼我就必須要下達 ls -al 這樣的指令列，唉！真麻煩，有沒有更快的取代方式？呵呵！就使用命令別名呀！例如我最喜歡直接以 lm 這個自訂的命令來取代上面的命令，也就是說， lm 會等於 ls -al 這樣的一個功能，嘿！那麼要如何作呢？就使用 alias 即可！你可以在指令列輸入 alias 就可以知道目前的命令別名有哪些了！也可以直接下達命令來設定別名呦：
      alias lm='ls -al'
  • 工作控制(jobs)、前景背景控制：
    這部分我們在之後的資源管理章節中會再提及！使用前、背景的控制可以讓工作進行的更為順利！至於工作控制(jobs)的用途則更廣，可以讓我們隨時將工作丟到背景中執行！而不怕不小心使用了 [Ctrl] + C 來停掉該程序！真是好樣的！此外，也可以在單一登入的環境中，達到多工的目的呢！
  • Shell scripts 的強大功能：
    在 DOS 年代還記得將一堆指令寫在一起的所謂的『批次檔』吧？在 Linux 底下的 shell scripts 則發揮的更為強大的功能，可以將您日常生活當中常需要下達的連續指令寫成一個檔案，該檔案並且可以透過對談互動式的方式來進行主機的偵測工作！也可以藉由 shell 提供的環境變數及相關指令來進行設計，哇！整個設計下來幾乎就是一個小型的程式語言了！該 scripts 的功能真的是超乎我的想像之外！以前在 DOS 底下需要程式語言才能寫的東西，在 Linux 底下使用簡單的 shell scripts 就可以幫你達成了！真的利害！！這部分我們在後續章節再來談！
在瞭解了 BASH 的優點之後，再來我們要來討論的是：那如何在 Shell 提供的環境中下達指令呢？其實很簡單的，下達指令的方式為：
[root@test /root]# command [-options] parameter1 parameter2 ...
指令 選項 參數(1) 參數(2)

1. command 為指令的名稱，例如變換路徑的指令為 cd 等等；
2. 中刮號[]並不存在於實際的指令中，而加入參數設定時，通常為 - 號，有時候完整名稱會輸入 -- 符號；
3. parameter1 parameter2.. 為依附在 option 後面的參數，或者是 command 的參數；
4. command, -options, parameter1.. 這幾個咚咚中間以空格來區分，不論空幾格 shell 都視為一格；
5. 指令太長的時候，可以使用 \ 符號來跳脫 [Enter] 符號，使指令連續到下一行。

實例：
[root@test /root]# ls -al /root <==以 ls 列出 /root 這個目錄中的隱藏檔與相關的屬性參數；
[root@test /root]# ./configure --prefix=/usr/local --with-tcp_wrappers \
> --with-pam <==這兩行實際上是同一行的指令，但是加上 \ 跳脫符號後，指令可以連續到下一行！
[root@test /root]# ls -al /root <==這個指令與第一個相同，空白字元不論幾個，僅視為一個來處理。

很簡單吧！OK！那麼再來一個問題：『Shell 是什麼時候開始接管 Linux 主機的！？』我們在後面會再提到『開機流程』的介紹，這裡先跳過去，假設你的機器已經開機成功了，那麼主機便進入等待使用者 login 的狀態。當使用者輸入了帳號與密碼，並且順利的 pass 之後，經過了 shell 的環境變數檔案讀取功能，最後，使用者進入自己的『家目錄』之後，例如 root 的家目錄在 /root 底下，一般使用者的家目錄則在 /etc/passwd 這個檔案裡面規定，那麼主機就已經丟了一個程序稱為 bash 的給你操作囉！
變數與變數的設定： echo, env, set, 變數設定規則, export, unset,
再繼續研究 BASH 之前，我們要就變數這個東西來討論一番，因為在主機裡面有太多的資料需要進行存取了，而這些資料都是一些服務所必須的，例如 mail 的存取路徑在 /var/spool/mail 、家目錄預設在 /home/useraccount 等等，當然我們可以改變這些個變數，但是如果該變數是直接深植於套件當中，那麼當你修改了某些參數之後，嘿嘿！你的套件就必須要『由原始碼直接更新再編譯』才行！這樣似乎很麻煩，所以囉，就會有變數這個好東西出來了！
舉個簡單的例子來說， sendmail 的 smtp 存放 mail 路徑是經由 /etc/profile 裡頭的
MAIL="/var/spool/mail/$USER"
來設定的，而當我修改了上面這一個咚咚，然後重新開機之後，嘿嘿嘿嘿！我的郵件就可以存放到不同的路徑去了！而且不會有問題！可以順利的『在 Linux 主機上面』收發。然而問題發生在 pop3 這個服務上面，由於 pop3 的預設路徑是在 source code 裡頭，而且就正是 /var/spool/mail 這個路徑，也就是說，不論我怎麼修正我的『變數』， pop3 都不為所動！唉∼真慘，所以就無法直接以 pop3 來收信了（例如 OutLook 就不能工作了）！會發生密碼不接受的問題呢！
此外，例如我們在執行程式的時候，系統怎麼知道你的 ls 這個指令放在哪裡？原來是有 PATH 這個變數，系統會透過這個變數裡面所設定的路徑去依序尋找該指令系統，如果找不到的話，那麼才在螢幕上顯示『 command not found 』字樣！這些還都只是系統預設的變數的目的，如果是個人的設定方面：例如你要寫一個大型的 script （批次檔）時，有些資料因為可能由於使用者習慣的不同而有差異，比如說路徑好了，由於該路徑在 script 被使用在相當多的地方，如果下次換了一部主機，都要修改 script 裡面的所有路徑，那麼我一定會瘋掉！這個時候如果使用變數，而將該變數的定義寫在最前面，後面相關的路徑名稱都以變數來取代，嘿嘿！那麼你只要修改一行就等於修改整篇 script 了！方便的很！所以，良好的程式設計師都會善用變數的定義！（這個部分我們在底下還會再提到！）

如果說的學理一點，那麼由於在 Linux System 下面，所有的執行續都是需要一個執行碼，而就如同上面提到的，你『真正以 shell 來跟 Linux 溝通，是在正確的登入 Linux 之後！』這個時候你就有一個 bash 的執行程序，也才可以真正的經由 bash 來跟系統溝通囉！而在進入 shell 之前，也正如同上面提到的，由於系統需要一些變數來提供他資料的存取（或者是一些環境的設定參數值，例如是否要顯示彩色等等的），所以就有一些所謂的『環境變數』需要來讀入系統中了！這些環境變數例如 PATH、HOME、MAIL、SHELL等等，都是很重要的，為了區別與自訂變數的不同，環境變數通常以大寫字元來表示呢！

說了那麼久，那麼到底『什麼是變數』呢？簡單的說，『變數就是以一組文字或符號等，來取代一些設定或者是一串保留的資料！』，例如：『VBird』就是『鳥哥』，所以當你讀取 VBird 的時候，系統自然就會知道！哈！那就是鳥哥！最簡單的例子可以取 PATH 來說明！如果你對於『相對路徑與絕對路徑』還有點印象的話，那麼應該曉得『要下達正確的指令，應該需要指定路徑與檔名』才行！例如你的 ls 指令應該需要以『/bin/ls』來下達指令才對，那麼為何你在任意的路徑下都可以執行 ls 呢？而不需要指定路徑呢？這是因為系統已經預設了一些『搜尋路徑(PATH)』了，所以當你需要執行一些指令的時候，系統就會依照該 PATH 的設定來進行指令的搜尋！而這個 PATH 就是所謂的變數了！那麼如何『顯示變數』呢？這就需要使用到 echo 這個指令啦！
  • echo
    顯示變數內容
    語法：
    [test @test test]# echo $variable
    參數說明：
    範例：
    [test @test test]# echo $PATH
    /bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/loc
    al/bin:/bin:/usr/bin:/usr/X11R6/bin
    就如同上面的範例，當我們要顯示目前的 PATH 這個變數時，使用了 echo ，而為了要分辨是否為變數，那麼 Linux 系統預設變數名稱前面會加上一個『 $ 』符號，所以就必須要寫成 echo $PATH 囉！
    例題：請在螢幕上面顯示出您的環境變數 PATH, HOME 與 MAIL：
    答：
    [root@test root]# echo $PATH
    /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
    [root@test root]# echo $HOME
    /root
    [root@test root]# echo $MAIL
    /var/spool/mail/root

    有多少的環境變數呀？使用 env 與 set 來看看：
    嗯！既然環境變數是挺重要的，那麼到底有多少的環境變數在 Linux 系統中呢？呵呵！你可以簡單的使用 env 就可以知道囉！『基本上，在 Linux 預設的情況中，使用{大寫的字母}來設定的變數一般為系統內定需要的變數』，底下列出 Linux 系統中 預設的變數內容：
  • env
    顯示目前系統中主要的預設變數內容
    語法：
    [test @test test]# env
    ENV=/root/.bashrc <==使用者自訂環境變數的設定檔案
    HISTSIZE=1000 <==目前的指令記憶數量
    HOME=/home/test <==登入者的家目錄
    HOSTNAME=test.adsldns.org <==這部主機的主機名稱
    HOSTTYPE=i386 <==這部主機的硬體等級大致狀態(i386, i686..)
    INPUTRC=/etc/inputrc <==一些 shell 載入的資料檔案設定處
    LANGUAGE=C <==預設語系的資料
    LANG=zh_TW.Big5
    與 LANGUAGE 類似，這個則是各個 linux distribution 常用的預設語系變數，由於我的 Mandrake 使用中文安裝，所以預設語系是中文，亦即 zh_TW.Big5 ，如果我要修改這個變數，可以到 /etc/sysconfig/i18n 去修改！底下的 LC_xxx 均是與預設的表示語系有關的變數，其中比較有趣的是 LC_TIME ，如果在文字介面下，最好將 LC_TIME 改成美規日期的顯示方式，才不會有亂碼！
    LC_COLLATE=zh_TW.Big5
    LC_CTYPE=zh_TW.Big5
    LC_MESSAGES=zh_TW.Big5
    LC_MONETARY=zh_TW.Big5
    LC_NUMERIC=zh_TW.Big5
    LC_TIME=en
    LESSOPEN=|/usr/bin/lesspipe.sh %s <==用來設定 less 使用的一支 script 檔案
    LOGNAME=test <==登入者的帳號

    MACHTYPE=i586-mandrake-linux-gnu
    主機的硬體配備等級 i586 為 P MMX 等級，至於 K7 及 PIII 之後的，就是 i686 等級囉！

    MAIL=/var/spool/mail/test     <==登入者的郵件預設放置地點
OSTYPE=linux-gnu              <==作業系統的形式(linux-gnu)
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/test/bin
PWD=/home/test                <==目前登入者所在的目錄(當下的目錄)
SHELL=/bin/bash               <==登入者使用的 shell 類型
USER=test
          <==目前這個登入者的使用者名稱

    env environment 的簡寫，所以說，這個指令主要在將目前系統中的主要變數讀出來！但是，不是說我們還可以自訂變數嗎？因此，除了 env 這個讀取環境變數的指令之外，還有一個可以將目前系統中所有的變數資料都讀出來的指令，稱為 set ！set 除了會將上面的資料都給他讀出來之外，還會有額外的這些資訊也一起讀入（通常都與使用者的設定有關！）

  • set
    顯示目前系統中全部的變數內容
    語法：
    [test @test test]# set
    BASH=/bin/bash <==BASH 的主程式放置路徑
    BASH_VERSINFO=([0]="2" [1]="05" [2]="8" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu") <==BASH 版本資訊
    BASH_VERSION=$'2.05.8(1)-release' <==BASH 的版本
    COLORS=/etc/DIR_COLORS <==使用顏色
    COLUMNS=100 <==目前這個終端機使用的欄位有幾個字元距離
    HISTFILE=/home/vbird/.bash_history <==目前用來存過往指令的檔案，為一個隱藏檔
    HISTFILESIZE=1000 <==存起來的檔案中，指令的最大數(只紀錄 1000 個指令)
    IFS=$' \t\n' <==預設的分隔符號
    langfile=/home/vbird/.i18n <==語系選擇的檔案
    LINES=40 <==目前游標所在的位置為第幾行
    MAILCHECK=60 <==每隔多久檢查一次有無新信件(秒數)
    PPID=24572 <==目前 bash 這個父程序的 ID ！
    PROMPT_COMMAND=$'echo -ne "\\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\\007"' <==提示字元顯示的內容
    SHELLOPTS=braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs
    SUPPORTED=zh_TW.Big5:zh_TW:zh:en_US:en <==支援的語系
    TERM=xterm <==終端機形式
    UID=500 <==登入者的使用者 ID (UID)
    $ <==目前 shell 的 PID
    ?
    最後一個命令的回傳值，若之前的命令被正確的執行會傳回 0 ，否則會傳為 1 或其他錯誤代碼。
    set 的輸入就是直接輸入 set 即可！他除了會顯示出目前的『環境變數』之外，也會顯示出您的『自訂變數』呢！那麼有哪些與使用者較有相關性的自訂變數呢？我們上面僅列出部分常見的變數值囉！

    使用 set 除了會將系統的預設值秀出來之外，連帶的所有的你自己設定的變數也會被秀出來！同時需要注意的是，若當時有相當多人同時在線上的話，那麼你的變數只能給自己使用（除非改的是系統的預設參數檔，如 /etc/profile ），而不會干擾到別人的！就如同前面所說的，由於你登入 Linux 之後會取得一個 PID ，而你的設定將只對這個 PID 與子程序有關！此外，這次登入所進行的變數設定，如果沒有更動到設定檔，那麼這次設定的變數在下次登入時將被取消掉（因為程序 PID 不見囉！）！所以囉，如果你想要你的變數每次都能在你登入的時候自動就設定好了，那麼就必須將你的設定寫入登入時載入的設定檔！

    上面的變數中，比較有趣的是 $ 與 ? 這兩個咚咚，尤其是 ? 這個變數，如果您上一個命令執行的過程中沒有錯誤，那麼這個變數就會被設定為 0 ，如果您的上個命令有錯誤訊息，那麼這個變數會變成 1 或其他的錯誤代碼！現在馬上動手試看看您的上個指令執行成果為何？

      echo $?

  • 變數設定規則：
    好了，我們知道了一些系統的預設變數了，但是如果是我自己想要設定一些我自己的變數，該如何設定呢？有什麼規則需要遵守？呵呵！在說明之前，可能要來讓大家瞭解一下為什麼自己會想來設定變數？
      我的案例一：最簡單的例子就是『路徑名稱』囉！以鳥哥為例，我的工作在 Unix 系統之下進行一些數值模式的模擬工作，偏偏由於資料量太大，為了怕日後忘記這個目錄的內容與主要的意義，所以我的檔名都取的很長，偏偏在執行模式的過程中，常常會切換目錄！我哩ㄌㄟ，光是打那幾行路徑名稱就快要瘋掉了！所以我就設定那幾行目錄名稱成為一個四個字元的變數，如此一來我只要輸入『 cd $VARI 』這個指令，嘿嘿！馬上就移動到該路徑下了！很方便吧！當然變數的意義還不止於此，不過這是最簡單的實例說明囉！
      我的案例二：另外一個常常需要變數的咚咚是在 scripts 裡面，例如我寫的一個偵測登錄檔的小程式 logfile.sh 這個咚咚，由於裡頭常常需要用到『儲存路徑』，偏偏可能每個人的存取路徑都不太一樣，而如果要修改存取路徑的話，嘿嘿！好幾十行要同時修改呢！還可能會改錯！那麼我只要定義一個變數，然後後續的所有資料都使用這個變數的內容！嘿嘿！那麼只要大家修改了這個變數的內容（只要一行），後續的動作就不需要修正了！這個動作常在程式或者是 script 當中看到的！
      所以囉，有很多的時候為了方便或者是使用於 scripts 的意義，我們必須要設定變數！然而在 bash 底下的變數設定是有一定規則的，必須要來遵守才行：
      1. 變數與變數內容以等號『=』來連結；
      2. 等號兩邊不能直接接空白字元；
      3. 變數名稱只能是英文字母與數字，但是數字不能是開頭字元；
      4. 若有空白字元可以使用雙引號『 " 』或單引號『 ' 』來將變數內容結合起來，但須要特別留意，雙引號內的特殊字元可以保有變數特性，但是單引號內的特殊字元則僅為一般字元；
      5. 必要時需要以跳脫字元『 \ 』來將特殊符號（如Enter, $, \, 空白字元, '等）變成一般符號；
      6. 在一串指令中，還需要藉由其他的指令提供的資訊，可以使用 quote 『 ` command` 』；
      7. 若該變數為擴增變數內容時，則需以雙引號及 $變數名稱如：『 "$PATH":/home』繼續累加內容；
      8. 若該變數需要在其他子程序執行，則需要以 export 來使變數可以動作，如『export PATH』；
      9. 通常大寫字元為系統預設變數，自行設定變數可以使用小寫字元，方便判斷（純粹依照使用者興趣與嗜好）；
      10. 取消變數的方法為：『unset 變數名稱』。

      底下我們舉幾個例子來說明一下：
      一般變數設定：
      [tets @test test]# 12name=VBrid <==錯誤的！因為變數開頭不能是數字！
      [test @test test]# name = VBird <==錯誤的！因為等號兩邊不能直接接空白！
      [test @test test]# name=VBird <==正確的！echo $name 顯示 VBird
      [test @test test]# name=VBird name <==錯誤的！需要加上雙引號！不然會顯示錯誤！
      [test @test test]# name="VBird name" <==正確的！echo $name 顯示 VBird name
      [test @test test]# name="VBird's name" <==正確的！

      變數累加設定：
      [test @test test]# name=$nameisme <==錯誤的！需要以雙引號將原變數圈起來
      [test @test test]# name="$name"isme <==正確的！echo $name 顯示 VBird's nameisme
      [test @test test]# PATH="$PATH":/home/test <==正確的！echo $PATH 將多了後面一句話！
      [test @test test]# PATH="$PATH:/home/test" <==正確的！這個形式對於 PATH 來說也是正確的格式！

      變數延伸到下一個子程序：
      [test @test test]# name="VBird's name" <==設定 name 這個變數
      [test @tset test]# echo $name <==顯示 name 變數的指令
      [test @test test]# VBird's name
      [test @test test]# /bin/bash <==另開一個 bash 的子程序
      [test @tset test]# echo $name <==顯示 name 這個變數
      [test @tset test]# <==會顯示空字串因為 name 這個變數不能使用在子程序
      [test @test test]# exit <==退出子程序 bash shell ！
      [test @test test]# export name <==正確的！如此則 $name 可以用於下一個子程序中！

      指令中的指令：
      [test @test test]# cd /lib/modules/`uname –r`/kernel
      上式中，會先執行 `uname –r` 這個內含指令，然後輸出的結果附加在 /lib/module… 裡面，所以執行這個指令，可以完成幾個附指令程序！

      取消變數設定：
      [test @test test]# unset name

      根據上面的案例你可以試試看！就可以瞭解變數的設定囉！這個是很重要的呦！請勤加練習！！其中，較為重要的一些特殊符號的使用囉！例如單引號、雙引號、跳脫字元、錢字號、quote 符號等等，底下的例題想一想吧！
      例題：在變數的設定中，單引號與雙引號有什麼不同呢？
      答：
      單引號與雙引號的最大不同在於雙引號仍然可以保有變數的內容，但單引號內僅能是一般字元，而不會有特殊符號。我們以底下的例子做說明：假設您定義了一個變數， name=VBird ，現在想以 name 這個變數定義出 myname 顯示 VBird its me 這個內容，要如何訂定呢？
      [root @test root]# name=VBird
      [root @test root]# echo $name
      VBird
      [root @test root]# myname="$name its me"
      [root @test root]# echo $myname
      VBird its me
      [root @test root]# myname='$name its me'
      [root @test root]# echo $myname
      $name its me
      發現了嗎？沒錯！使用了單引號的時候，那麼 $name 將失去原有的變數內容，僅為一般字元的顯示型態而已！這裡必需要特別小心在意！

      例題：在指令下達的過程中， quote ( ` ) 這個符號代表的意義為何？
      答：
      在一串指令中，在 ` 之內的指令將會被先執行，而其執行出來的結果將做為外部的輸入資訊！例如 uname –r 會顯示出目前的核心版本，而我們的核心版本在 /lib/modules 裡面，因此，你可以先執行 uname –r 找出核心版本，然後再以『 cd 目錄』到該目錄下，當然也可以執行
      cd /lib/modules/`uname –r`
      直接到該目錄下去！

      底下我們來談一談 export 的用途吧！

  • export
    當你取得一個 bash 之後，亦即得到了一個程序了，但是若你再次的執行一次 bash ，那麼你將進入『子程序』，這個程序的概念我們在資源管理章節中再詳談，這裡您先有個概念即可。那麼由於您已經進入了該子程序，所以在父程序中的變數設定將不再繼續的存在。如您想要讓該變數內容繼續的在子程序中使用，那麼就請執行：

      export 變數

    ！這個東西用在『引用他人的檔案或者其他程序』時，相當的重要的！尤其像我常常兩三個檔案互相引用來引用去的，如果忘記設定 export 的話，那麼不同的檔案中的相同變數值，將需要一再地重複設定才行！所以，我只要在頭一個檔案使用 export 的話，那麼後續的檔案引用時，將會把該變數內容讀進來！好用的很?而，如果僅下達 export 而沒有接變數時，那麼此時將會把所有的『環境變數』秀出來喔！也就是說， export 可以將一般自訂的變數變成環境變數！
    [root @test root]# export
    declare -x BASH_ENV="/root/.bashrc"
    declare -x CVSROOT="/usr/local/cvs/src/master"
    declare -x HISTSIZE="50"
    declare -x HOME="/root"
    declare -x HOSTNAME="test.adsldns.org"
    declare -x HOSTTYPE="i386"
    declare -x INPUTRC="/etc/inputrc"
    declare -x LANG="en_US"
    declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
    declare -x LOGNAME="root"
    declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:
    bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=
    01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh
    =01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.z
    ip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;
    31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=
    01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
    declare -x MACHTYPE="i386-redhat-linux-gnu"
    declare -x MAIL="/var/spool/mail/root"
    declare -x MANPATH=":/usr/local/netcdf/man"
    declare -x OSTYPE="linux-gnu"
    declare -x PATH="/usr/local/pgi/linux86/bin:/bin:/sbin:/usr/sbin:/usr/bin:
    /usr/local/sbin:/usr/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
    :/usr/local/netcdf/bin"
    declare -x PGI="/usr/local/pgi"
    declare -x PWD="/root"
    declare -x SHELL="/bin/bash"
    declare -x SHLVL="1"
    declare -x SSH_TTY="/dev/pts/0"
    declare -x TERM="xterm"
    declare -x USER="root"

  • unset
    就是直接將該變數的內容拿掉：

      unset 變數

  • 變數的有效範圍：
    由前面的 export 以及相關的說明，你可以很清楚的知道一件事情，那就是，『變數的設定只在目前這個 shell 環境當中存在，在下個或者是在子程序中 ( 子 shell ) 將不會存在！』要讓變數在下個程序也可以繼續的使用，大概就是使用 export 這個咚咚啦！此外，其實除了 shell 的父、子程序外，在腳本( scripts )的編寫當中，由於有的軟體會使用到 2 個以上的 scripts 做為一個完整的套件！也就是說，假如你有兩支程式，一支為 scripts1.sh 以及 scripts2.sh ，而 scripts2.sh 會去引用 scripts1.sh 的變數，這個時候，嘿嘿！你在 scripts1.sh 當中設定的變數請『千萬記得以 export 設定』，否則你的變數將無法在兩個 scripts 之間互相被引用喔！當這個 scripts 執行完畢之後，剛剛在 scripts 當中設定的變數也就『失效了！』。

  • 其他的注意事項：
    乍看之下變數似乎沒有什麼值得我們來留意的地方，其實不然，變數可以讓我們的系統管理變的更加的簡單，舉個例子來說，剛剛我們提到 HISTSIZE 可以控制歷史指令的多寡，那麼太多的話，可能會有安全的顧慮之虞，那麼是否需要改小一點呢？當然需要∼此外，關於路徑的設定方面，當您使用一般身份使用者登入系統，再以 su 轉換成 root 身份時，基本上，一堆環境變數仍是以當初的一般身份者為主的，因此，您常常會發現 root 使用的指令會『找不到！』那就是環境變數的錯誤設定啦！這個時候，如果您能夠將該一般身份使用者的路徑設定成為 root 能用的指令的樣子，嗯！那麼轉換身份的時候，將可以免除相當多的困擾呢！提供給你做為參考了！

  • read：
    上面我們談到的『變數』都是由『指令列』直接設定好的！那麼可不可以隨時來提供使用只以鍵盤隨時輸入變數內容？也就是說，變數內容是由使用者由鍵盤輸入的哩！呵呵！可以使用 read 來達成喔！這個東西在『 script 』裡面比較重要啦！所以我們在 shell script 裡面會再次的提到喔！
    語法：
    [test @test test]# read name
    testing <==這個時候螢幕會等待使用者由鍵盤輸入喔！
    [test @test test]# echo $name
    testing <==剛剛輸入的資料變成了變數的內容啦！

  • array：
    談完了一些基本的變數之後，再接下來我們可以聊一聊關於『陣列, Array』這東西了！學過數學應該知道有所謂的陣列吧！他可以使用一個『函數』來包含一些內容！例如 A(1)=1, A(2)=4, A(3)=8 等等的樣子，那個 A(n) 就是函數， n 就是 index(索引)，而在等號的右邊就是這個函數對應索引所得到的『內容』啦！在 Bash 裡頭提供了『一維陣列』給大家來使用，他的設定格式是：
    語法：
    [test @test test]# a[索引]=內容
    [test @test test]# echo ${a[索引]}
    例：
    [test @test test]# a[1]=4
    [test @test test]# a[2]=8
    [test @test test]# echo ${a[1]} ${a[2]}
    4 8
    注意一下喔！在設定陣列的時候，他主要是以 『字母及中刮號, abc[]』的樣式來設定的！其他的規則則與 變數設定規則 相同！不過，在讀取陣列的時候就需要比較注意了！讀取的時候，是以 ${陣列函數} 的方式來讀取的！這部份特別容易搞錯！請大家特別留意呢！當然啦，陣列不止可以進行數字的型態，也可以是字串的類型喔！都可以的啦！

  • $RANDOM：
    有聽過『隨機取亂數』這個玩意兒吧！？呵呵！那麼在 BASH 裡面的亂數是那個變數來的？亂數在英文的寫法為 RANDOM 啦，所以囉， BASH 當中針對亂數的變數名稱就是 $RANDOM 囉！來給他秀一下吧！
    語法：
    [test @test test]# echo $RANDOM
    xxxx <==每次都會出現不同的數字喔！
    亂數對於程式設計師比較重要，對於我們一般使用者，重要性就沒有這麼大啦！只是提出來讓大家知道一下就是了！

  • eval：
    語法：
    [test @test test]# eval variable
    例題：
    [test @test test]# days=365
    [test @test test]# year=days
    [test @test test]# echo \$$year
    $days <==第一個 $ 被 \ 改變成為一般字元，而 \$ 後面接的 $year 就成為 days 啦！
    [test @test test]# eval echo \$$year
    365
    加上 eval 之後， \$$year 變成的 $days 的『變數內容』會顯現出來喔！
    這個指令也是頗有趣的！他主要是用來做為變數的『疊代』用的！以上面的例子來看，起先， \$$year 會變成為 $days ，而這個 $days 其實是一般字元喔！並不是變數！不過，加上了 eval 之後，這個字串就會被變成變數內容咯！所以說， eval 是用來做為『二次疊代』的功能的！
命令別名與歷史命令
  • 命令別名：
    命令別名是一個很有趣的東西，特別是你的慣用指令特別長的時候！還有，增設預設的屬性在一些慣用的指令上面，可以預防一些不小心誤殺檔案的情況發生的時候！舉個例子來說，如果你要查詢隱藏檔，並且需要長的列出與一頁一頁翻看，那麼需要下達『 ls -al | more 』這個指令，我是覺得很煩啦！要輸入好幾個單字！那可不可以使用 lm 來簡化呢？！當然可以，你可以在命令列下面下達：
    [test @tset test]# alias lm='ls -al | more'

    要注意的是：『alias 的定義規則與變數定義規則幾乎相同』，所以你只要在 alias 後面加上你的{『別名』='指令 參數'}，以後你只要輸入 lm 就相當於輸入了 ls -al|more 這一串指令！很方便吧！另外，我們知道 root 可以移除( rm )任何資料！所以當你以 root 的身份在進行工作時，需要特別小心，但是總有失手的時候，那麼 rm 提供了一個參數來讓我們確認是否要移除該檔案，那就是 -i 這個參數！所以，你可以這樣做：

    [test @tset test]# alias rm='rm -i'

    嘿嘿！那麼以後使用 rm 的時候，就不用太擔心會有錯誤刪除的情況了！這也是命令別名的優點囉！那麼如何知道目前有哪些的命令別名呢？就使用 alias 呀！
    [test @tset test]# alias
    alias l.='ls -d .[a-zA-Z]* --color=tty'
    alias ll='ls -l'
    alias lm='ls -al'
    alias ls='ls --color=tty'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

    至於如果要取消命令別名的話，那麼就使用 unalias 吧！

    那麼命令別名與變數有什麼不同呢？基本上，他們的意義就不太一樣了！ alias 這種命令別名，你可以將他想成是建立一個新的指令名稱，至於變數則僅是將一個數值或者字串存在某個代表意義當中！舉個例子好了，我們知道以前的 DOS 年代，列出目錄與檔案就是 dir ，而清除螢幕就是 cls ，那麼如果我想要在 linux 裡面也使用相同的指令呢？那就以 alias 來進行指令的別名設定：

      alias cls=’clear’
      alias dir=’ls –l’

    只要加入這兩行，以後你輸入 cls 及 dir 就可以執行了！很方便吧！
  • 歷史指令記錄資料：
    前面我們提過 bash 有提供指令歷史的服務！那麼如何查詢我們曾經下達過的指令呢？就使用 history 囉！當然，如果覺得 histsory 太麻煩，可以使用命令別名來設定呢！不要跟我說還不會設定呦！

      alias h=’history’

    如此則輸入 h 等於輸入 history 囉！好了，我們來談一談 history 的用法吧！
    • history, !command
      顯示歷史指令記錄內容, 下達歷史紀錄中的指令
      語法：
      [test @test test]# history
      [test @test test]# [!number] [!command] [!!]
      參數說明：
      number ：第幾個指令的意思；
      command ：指令的開頭幾個字母
      ! ：上一個指令的意思！
      範例：
      [test @test test]# history <==底下列出的就是(1)歷史指令的編號；(2)指令的內容
      66 man rm
      67 alias
      68 man history
      69 history
      [test @test test]# !66 <==執行第 66 個歷史指令
      [test @test test]# !! <==執行上一個指令（在本例中，就是 !66 那一個指令！）
      [test @test test]# !al <==執行最近一次以 al 為開頭的指令內容，就是第 67 個指令囉！
      說明：
      history 這個指令配合 ! 這個用法就多了！如果我想要執行上一個指令，除了使用上下鍵之外，我可以直接以 !! 來下達上個指令的內容，此外，我也可以直接選擇下達第 n 個指令， !n 來執行，也可以使用指令標頭，例如 !vi 來執行最近指令開頭是 vi 的指令列！相當的方便而好用！基本上 history 的用途很大的！但是需要小心安全的問題！尤其是 root 的歷史紀錄檔案，這是 Cracker 的最愛！因為不小心的 root 會將很多的重要資料在執行的過程中會被紀錄在 ~/.bash_history 當中，如果這個檔案被解析的話，後果不堪吶！無論如何，使用 history 配合『 ! 』曾經使用過的指令下達是很有效率的一個指令方法！
bash shell 的設定檔案：
    終於來到 bash 的設定檔案囉！這部份我們預計分成『系統設定值』與『一般各人喜好設定值』來說明，除非您是 root ，並且對於大家的喜好有共同的認知，否則只要設定您的『個人設定值』（在每個人的家目錄內）也就可以囉！要注意的是，在指令列輸入的變數也好、命令別名也罷，都是針對該次登入的設定而已，所以只要您一登出，那麼上次的設定值就會不見去！因此，我們需要有幾個檔案來幫助我們，每次登入的時候，就已經幫我們搞定了環境的設定囉！
  • 系統設定值：
    所謂的系統設定值，也就是說每個使用者進入到 bash shell 之後，會先讀取的設定檔案！預設的設定檔案有下列幾個：
    • /etc/profile：這個檔案設定了幾個重要的變數，例如：『PATH、USER、MAIL、HOSTNAME、HISTSIZE、umask』等等，也同時規劃出 /etc/inputrc 這個針對鍵盤熱建設定的檔案的資料內容。你可以在這裡設定總體的 PATH 等等的資訊！同時，這個 file 也規劃出 /etc/profile.d 及 /etc/inputrc 這兩個檔案，其中， inputrc 是用在 history （歷史指令）的作用上的！總之，你可以瞭解到剛剛我們學會的變數設定方式，在這個檔案中也可以設定呢！但是設定上需要特別小心，因為所有的使用者皆會使用到這個檔案的資訊。註：通常我都喜歡將 /usr/local/bin 這個路徑加成最前面，這是因為通常自己安裝的套件自己最喜歡，所以當然是最先收尋囉！ ^_^！此外，請注意一下，可以將 HISTSIZE 的大小改變一下，改成 50 就可以啦！比較安全！( 註：這個檔案不論在那個 Linux distribution 當中均存在 /etc/profile 當中，所以，請特別留意此一檔案即可！ )。

    • /etc/bashrc：這個檔案在規劃 umask 的功能，也同時規劃出提示字元的內容（就是裡頭那個 PS1 啦！）。特別留意的是，這個檔案在不同的 Linux distribution 裡面，擺放的位置可能不太一樣呢！所以需要查詢一下才行呦！

    • /etc/man.config：這個檔案或許跟 bash shell 較沒相關性，但是對於系統管理員來說，卻也是很重要的一個檔案！這的檔案的內容『規範了使用 man 的時候， man page 的路徑到哪裡去尋找！』所以說的簡單一點，這個檔案規定了下達 man 的時候，該去哪裡查看資料的路徑設定！那麼什麼時候要來修改這個檔案呢？如果你是以 tarball 的方式來安裝你的資料，那麼你的 man page（指令說明檔案）可能會放置在 /usr/local/softpackage/man 裡頭，那個 softpackage 是你的套件名稱，這個時候你就得以手動的方式將該路徑加到 /etc/man.config 裡頭，否則使用 man 的時候就會找不到相關的說明檔囉
    這就是系統在設定的時候常常會使用的檔案！需要特別留意的是，通常設定完了這幾個檔案之後，都需要先 logout 在 login 之後才會將設定整個啟動起來！
  • 個人設定值
    那麼個人的喜好設定在哪裡？嘿嘿嘿嘿！那就是在個人家目錄的幾個隱藏檔當中囉！分別會使用到底下的幾個檔案啦！ ( 注意！底下的檔案都是隱藏檔，需要使用 ls -al 方能顯示出來 ) ，另外，注意一下囉！底下那個『 ~ 』代表的是『家目錄』的意思：
    • ~/.bash_profile：裡面定義了個人化的路徑（PATH）與環境變數的檔案名稱！你可以在這裡修改你的個人路徑呦！當然囉！也可以在 ~/.bashrc 這個個人設定的變數裡頭修改！有的時候會有 ~/.profile 或 ~/.bash_login 等檔案來取代這個檔案！

    • ~/.bashrc：這個檔案對於個人喜好的 bash 設定來說，是最重要的啦！因為我都是在這裡設定我的個人化變數！例如命令別名的設定！路徑的重新定義等等，都是在這裡完成的！

    • ~/.bash_history：這個檔案的用途在於將你曾經使用過的命令記錄下來，而當你再次的以上下鍵搜尋或者直接以 history 搜尋的時候，就可以找到曾經使用過的指令囉！需要注意的是

      1. 在這一次的執行過程中的指令，將在你離開 shell 之後才會被紀錄到這個檔案中，否則將只會先被寫到暫存記憶體中(Cache)；
      2. 可以藉由 history 這個指令來將裡頭的紀錄搜尋出來；
      3. 這個檔案的指令記錄筆數，與 HISTFILE 有關，你可以自行在 ~/.bashrc 裡頭設定，或者直接由 root 在 /etc/profile 裡面統一設定大小！

    • ~/.bash_logout：這個檔案則是在『你登出 shell 的時候， BASH 會為你所做的事情！』通常預設是只有 clear 清除螢幕這件事情而已，不過，你也可以將一些備份或者是其他你認為重要的工作寫在這個檔案中（例如清空暫存檔），那麼當你離開 Linux 的時候，就可以解決一些煩人的事情囉！
    大致上的個人設定就是如同上面說的！不過，我個人覺得比較重要的是 ~/.bashrc 這一個檔案！我喜歡將自己的相關設定寫在裡頭！這樣可以很輕易的將個人的設定寫好！尤其是命令別名與變數的設定等等！我個人喜好的 ~/.bashrc 設定如下：
    [test @test test]# more .bashrc
    # User specific aliases and functions
    PATH="/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/sbin:/usr/bin:$PATH"
    Export PATH

    Alias rm='rm -i'
    Alias cp='cp -i'
    Alias mv='mv -i'
    Alias ll='ls -l'
    Alias lm='ls -al|more'
    Alias h='history'

    # Source global definitions
    if [ -f /etc/bashrc ]; then
    . /etc/bashrc
    fi

  • source：
    前面提過了，如果我需要將目前的設定檔的內容讀入一次，需要重新 logout 再 login 才能夠讀入，那麼有沒有辦法不登出而直接讀入變數設定檔呢？當然可以，就使用 source 即可！
    [test @test test]# source 變數設定檔

    這個使用的情況在什麼時候呢？最常發生在一個人的工作環境分為多重的時候了！舉個例子來說，在我的大型主機中，我常常需要負責兩到三個不同的案子，每個案子所需要處理的環境變數訂定並不相同，那麼我就將這兩三個案子分別編寫屬於該案子的環境變數設定檔案，當我需要該環境時，就直接 source 變數檔，如此一來，環境變數的設定就變的更簡便而靈活了！

萬用字元與特殊符號
    由於在 bash 當中常會使用到一些萬用字元，與搭配特殊符號來將指令做更好的利用（例如最常提到的正規表示法 Regulare Express ）！底下我們列出一些常用的萬用字元與特殊符號：
    符號 | 內容
* | 萬用字元，代表一個或多個字元（或數字）
? | 萬用字元，代表一個字母
# | 註解，這個最常被使用在 script 當中，視為說明！
\ | 跳脫符號，將『特殊字元或萬用字元』還原成一般字元
| | 分隔兩個管線命令的界定；
; | 連續性命令的界定（注意！與管線命令並不相同）
~ | 使用者的家目錄
$ | 亦即是變數之前需要加的變數取代值
& | 將指令變成背景下工作
! | 邏輯運算意義上的『非』 not 的意思！
/ | 路徑分隔的符號
>, >> | 輸出導向，分別是『取代』與『累加』
' | 單引號，不具有變數置換的功能
" | 具有變數置換的功能！
` ` | 兩個『 ` 』中間為可以先執行的指令！
( ) | 在中間為子 shell 的起始與結束
[ ] | 在中間為字元的組合
{ } | 在中間為命令區塊的組合！
組合按鍵 | 執行結果
Ctrl + C | 終止目前的命令
Ctrl + D | 輸入結束（EOF），例如郵件結束的時候；
Ctrl + M | 就是 Enter 啦！
Ctrl + S | 暫停螢幕的輸出
Ctrl + Q | 恢復螢幕的輸出
Ctrl + U | 在提示字元下，將整列命令刪除
Ctrl + Z | 『暫停』目前的命令

    上面的萬用字元當中，最常用的就屬 *, ?, [] 及 ` 了！我們提幾個簡單的例子：
    [test @test test]# ls test* <==那個 * 代表後面不論接幾個字元都予以接受(沒有字元也接受！)
    [test @test test]# ls test? <==那個 ? 代表後面『一定』要接『一個』字元
    [test @test test]# ls test??? <==那個 ??? 代表『一定要接三個』字元！
    [test @test test]# cp test[1-5] /tmp <==將 test1, test2, test3, test4, test5 若存在的話，就拷貝到 /tmp 下
    [test @test test]# cd /lib/modules/`uname -r`/kernel/drivers <==被 ` ` 括起來的內容『會先執行』！
    上面幾個例子相當的有趣！尤其是最後面兩個！需要注意的是， [] 裡面『代表只有一個字元』但是範圍可以由 1-5 ，這樣來說的話，那麼我們如果允許『大寫字元』就可以將檔案 copy 出來的話，可以這樣做：

      cp *[A-Z]* /tmp

    很有趣吧？！ ^_^
    此外，那個 `` 裡面的『指令』會先被執行，也就是說：

    1. 系統先執行 uname -r 找出輸出的結果；
    2. 將結果累加在目錄上面，來執行 cd 的功能！

    很棒吧！！這些基本的功能需要特別來瞭解一下才行呦！
  • 連續指令的下達方式：
    這裡需要再提幾個重要的資訊，我們剛剛上面提過說，兩個指令先後寫在一起，可以這樣寫：

      command1; command2

    利用分號『 ; 』來分隔，這個分號的意思，代表不論 command1 執行結果為何，command2 都會被執行！那麼如果我是兩個相關的指令，第一個 command1 如果執行結果有錯誤，第二個就不被執行，可以這樣做嗎？當然可以，就使用下面兩個連結的咚咚：

      command1 && command2
      command1 || command2

    還記得我們之前的變數內容中，那個 ? 代表什麼嗎？沒錯，就是代表前一個執行的指令內容有沒有錯誤，如果有錯誤就回傳為 1 ，沒有錯誤就回傳為 0 ，你可以經由 echo $? 來查詢得知！那麼 && 就是代表，當 command1 執行結果傳回值為 0 的時候，也就是沒有錯誤訊息時，則 command2 才會開始執行，而 || 恰恰相反，當 command1 有錯誤訊息時， command2 才會執行！舉個例子來說，我的系統中並沒有 /vbird 這個目錄，所以執行 ls /vbird 應該會有錯誤訊息才對，所以，底下三個指令串會顯示什麼呢？
    [root @test root]# ls /vbird ; ls /
    [root @test root]# ls /vbird && ls /
    [root @test root]# ls /vbird || ls /

    試看看呦！

絕對路徑與相對路徑
    其實，在使用 bash 還有另一個困擾，就是當你的 PATH 沒有設定完整的時候，下達指令都是要以『一長列的指令連帶根目錄都要列出來』，呵呵那就是絕對路徑的設定法啦！基本上，這個『絕對路徑』與『相對路徑』的觀念是很重要的！否則你將常常會找不到檔案說！所謂的『絕對路徑』就是以根目錄開始寫入到檔案的一種命令寫定方法，舉例來說，我目前在 /home/test 這個 test 使用者的家目錄中，我想要看看裡面的 .bashrc 這個檔案的資料，使用的是 more 這個指令，而這個指令在 /bin/more 當中，則正確的下達指令的方法為：

    [test @tset test]# /bin/more .bashrc<==我在的目錄為 /home/test ！這是絕對路徑寫法！

    我在的目錄為 /home/test ！這是絕對路徑寫法！ 而如果你還記得我們在 檔案系統指令 那一篇文章中提到的觀念的話，那麼應該記得使用 ls -al 時會出現兩個一定存在的目錄，分別是『.』與『..』，分別代表是『這個路徑』，與『上一層路徑』！

    [test @tset test]# ls -al
    total 728
    drwx------ 3 vbird vbird 4096 May 19 14:53 . <==這一層路徑的屬性說明
    drwxr-xr-x 3 root root 4096 May 5 16:50 .. <==上一層路徑的屬性說明
    以下略！

    所以說，要執行上一層目錄中的命令，可以下達『../command 』那個 command 指的是存在的可執行檔！那麼我因為在 /home/test 裡面，距離 /bin 有兩層上層目錄，所以我要使用 /bin/more 這個執行檔，並且使用相對路徑的方法，就必須使用：

    [test @tset test]# ../../bin/more .bashrc <==一層一層回到根目錄，在進入 /bin 的寫法！相對路徑

    這種相對路徑的方法相當廣泛的被運用於 script 當中，這是因為如前面提到的，每個人的安裝預設的目錄都不相同，則使用相對路徑的話，很容易就可以找到套件之間相依軟體或者是設定檔案的相關性！
      關於路徑搜尋的問題！為何不執行目前所在目錄下的檔案？
      咦！剛剛不是提到『.』與『..』嗎？那麼那個『 . 』是幹嘛用的？！眼尖的朋友應該已經發現了，就是『我在執行檔案的時候，基本上，並不會主動搜尋目前目錄下的檔案』舉個例子來說，我安裝的 squid 這個執行檔在 /usr/local/squid/bin/squid 這個檔案，然而我在 /usr/local/squid/bin 下達 squid 的時候，系統會告訴你『查不到這個檔案！』真是見鬼了！明明有這個檔案的呀！這是因為系統預設的 PATH （路徑）並沒有執行目前目錄下的設定，也就是『.』這個路徑！你可以使用『 echo $PATH 』看看，就可以知道為什麼了！那麼為何不要設定這個路徑呢？這是因為『安全』的考量。由於系統預設是允許任何人在 /tmp 底下寫入任何檔案的，那麼萬一有居心不良的使用者或者是 Cracker 入侵你的電腦，並在你的 /tmp 裡頭埋了一個小木馬，並取名為 ls ，好了，改天你以 root 身份登入後，到 /tmp 底下，並執行 ls ，你看會有什麼結果？！這個 /tmp/ls 由其他身份的人來執行或許沒有問題，但是由 root 來執行卻可能會導致 Cracker 所樂意見到的結果！那曉得為何了吧？！
      當然囉！您還是可以選擇在 ~/.bashrc 當中設定你的 . 在你的 PATH 當中，不過並不這麼建議就是了！
    好了，由於系統預設並不主動搜尋目前目錄下的執行檔，那麼你應該如何執行『目前目錄下的執行檔』呢？很簡單呀！就是以相對路徑的觀念，由於『 .. 』是上層，而『 . 』是這一層，所以要執行這一層目錄的命令就使用『 ./command 』即可！例如你的 /usr/local/squid/bin 底下執行 squid 則可以寫成：

    [test @tset bin]# ./squid <==以相對路徑的觀念來看！在本目錄下達的指令寫法！

    請特別留意這方面的問題！『新手特別容易犯這個錯誤呢！』
命令重導向
    基本上，這個子題是 bash 相當重要的觀念，這裡可得花點心思才行呦！
    • 什麼是『重導向, redirect ？』：簡單的說，就是將你目前的所得資料轉到其他地方去就是了！例如我們常用的，將目前的螢幕輸出資料轉到檔案中去，就可以這麼寫：『ls -l / > test 』，那個大於的符號『 > 』就是將輸出結果導向到 test 這個檔案中的意思囉！這個時候：
      • 如果你執行『 ls -l / 』而已的話，螢幕會將根目錄的檔案與目錄都列出在螢幕上；
      • 但是當使用 > 導向到 test 這個檔案中時，則螢幕不會顯示任何訊息，但是會將剛剛你執行的結果輸出到 test 這個檔案中。
      所以囉，你只要『 vi test 』一下，就會知道 test 這個檔案中記錄了剛剛我們執行的資料結果囉！不過，這裡需要特別留意的是，當你使用 > 符號將資料由螢幕導向到檔案中時，則：
      • 該檔案（就是 test ）若不存在，系統會自動的將他建立起來，但是，
      • 當這個檔案存在的時候，那麼系統就會先將這個檔案內容清空，然後再將資料寫入！
      • 也就是若以 > 輸出到一個既存檔案中，呵呵，那個檔案就會被覆蓋掉囉！
    除了這個 > 的符號之外，在 bash 命令執行的過程中，主要有三種輸出入的狀況，分別是：
    1. 標準輸入；代碼為 0 ；或稱為 stdin ；使用的方式為 <
    2. 標準輸出：代碼為 1 ；或稱為 stdout；使用的方式為 1>
    3. 錯誤輸出：代碼為 2 ；或稱為 stderr；使用的方式為 2>
    基本的指令書寫方式為：
    指令
    1>
    1>>
    2>
    2>>
    <
    裝置或檔案

    左邊一定是指令，至於右邊則可能是裝置或者是檔案！注意了！那個 1> 與 2> 之間並沒有空白字元！而相關的使用說明可以舉例如下：
    [test @test test]# ls -al > list.txt
    將顯示的結果輸出到 list.txt 檔案中，若該檔案以存在則予以取代！
    [test @test test]# ls -al >> list.txt
    將顯示的結果累加到 list.txt 檔案中，該檔案為累加的，舊資料保留！
    [test @test test]# ls -al 1> list.txt 2> list.err
    將顯示的資料，正確的輸出到 list.txt 錯誤的資料輸出到 list.err
    [test @test test]# ls -al 1> list.txt 2>&1
    將顯示的資料，不論正確或錯誤均輸出到 list.txt 當中！
    [test @test test]# ls -al 1> list.txt 2> /dev/null
    將顯示的資料，正確的輸出到 list.txt 錯誤的資料則予以丟棄！
    注意！錯誤與正確檔案輸出到同一個檔案中，則必須以上面的方法來寫！
    不能寫成其他格式！

    這個觀念相當的重要，尤其是在 /etc/crontab 當中執行的時候，如果我們已經知道錯誤的訊息為何，又不想要讓錯誤的訊息一直填滿 root 的信箱，就必須以 2> 搭配 /dev/null 這個垃圾桶黑洞裝置，來將資料丟棄！這個相當的重要！

    這裡我們來說明一下命令重導向裡面幾個常用的符號與裝置：
    • < ：由 < 的右邊讀入參數檔案；
    • > ：將原本由螢幕輸出的正確資料輸出到 > 右邊的 file ( 檔案名稱 ) 或 device ( 裝置，如 printer )去；
    • >> ：將原本由螢幕輸出的正確資料輸出到 >> 右邊，與 > 不同的是，該檔案將不會被覆蓋，而新的資料將以『增加的方式』增加到該檔案的最後面；
    • 2> ：將原本應該由螢幕輸出的錯誤資料輸出到 2> 的右邊去。
    • /dev/null ：可以說成是黑洞裝置！
好了，對於『 > , >> 』這兩個東西有一定的概念之後，我們來深入的談一談『命令輸出重導向』的觀念吧！如前所述，基本上， Linux 執行的結果中，可以約略的分成『正確輸出』與『錯誤輸出』兩種方式。例如，當你以一般身份執行 find 這個指令時，例如執行『 find / -name testing 』時，由於你是一般身份，又有些資料夾是不允許一般身份者進入的，所以囉，當你使用 find 時，就會有錯誤訊息發生了！但同時如果有 testing 這個檔案在你可以進入的資料夾當中，那麼螢幕也會輸出到給你看！因此，就具有正確的與錯誤的輸出兩種囉！（分別稱為 Stdout 與 Stderror）例如下面為執行結果：裡面的『 find: /home/root: Permission denied 』就告訴你該資料夾你沒有權限進入，這就是錯誤的輸出了，那麼『 /home/test/tseting 』就是正確的輸出了！
[test @test test]# find / -name testing
find: /home/test1: Permission denied <==這是錯誤的輸出
find: /home/root: Permission denied <==這是錯誤的輸出
find: /home/masda: Permission denied <==這是錯誤的輸出
/home/test/testing <==這是『正確』的輸出
[test @test test]#

好了，那麼假如我們想要將資料輸出到 list 這個檔案中呢？執行『 find / -name testing > list 』會有什麼結果？呵呵，你會發現 list 裡面存了剛剛那個『正確』的輸出資料，至於螢幕上還是會有錯誤的訊息出現呢！傷腦筋！如果想要將正確的與錯誤的資料分別存入不同的檔案中需要怎麼做？！呵呵！其實在資料的重導向方面，正確的寫法應該是『 1> 』與『 2> 』才對！但是如果只有 > 則預設是以 1> 來進行資料的！那個 1> 是輸出正確資料， 2> 則是錯誤資料輸出項目。也就是說：

  • 1> ：是將正確的資料輸出到指定的地方去
  • 2> ：是將錯誤的資料輸出到指定的地方去
好了，那麼上面的例子中，我們如何將資料輸出到不同的地方去呢？可以這麼寫：
[test @test test]# find / -name testing 1> list_right 2> list_error

這樣一來，剛剛執行的結果中，有 Permission 的那幾行錯誤資訊都會跑到 list_error 這個檔案中，至於正確的輸出資料則會存到 list_right 這個檔案中囉！這樣可以瞭解了嗎？如果有點混亂的話，去休息一下再來看看吧！！

    再來，如果我只要正確的資料，錯誤的資訊我不要了呢？呵呵，這個時候 /dev/null 這個垃圾桶就很重要了！/dev/null 是什麼呢？基本上，那就有點像是一個『黑洞』的垃圾桶功能！當你輸入的任何東西導向到這個虛擬的垃圾桶裝置時，『他就會憑空消失不見了∼∼』，這個東西有用的很！例如上面的例子中，我們可以這麼做，來將錯誤的資訊丟掉！
    [test @test test]# find / -name testing 1> list_right 2> /dev/null

    很神奇呦！ error message 就會『不見了！』呵呵！真高興！另外，如果我要將資料都寫到同一個檔案中呢？這個時候寫法需要用到特殊寫法，請注意底下的寫法呦！
    [test @test test]# find / -name testing 1> list 2> list <==錯誤寫法
    [test @test tset]# find / -name testing 1> list 2>&1 <==正確寫法

    請特別留意這一點呢！同時寫入同一個檔案需要使用 2>&1 才對呦！

    OK！瞭解了 >, 2>, >> 與 /dev/null 之後，那麼那個 < 又是什麼呀！？呵呵！以最簡單的說法來說，那就是『將原本需要由鍵盤輸入的資料，經由檔案來讀入』的意思，最明顯的例子就是 mail 這個東西了！我們以 root 的身份來寄信給 root 好了，可以這樣做：
    1. 完全由鍵盤輸入資料：
    [root @test test]# mail -s "test" root <== -s 表示標題， root 為收件者
    I am root! <==以下的資料都是由鍵盤輸入的
    That's OK
    . 　　　　　 <==要結束鍵盤的輸入時，需要在一行的最前面加上 . 即可！
    CC.　　　　　<==是否需要有密件副本？不需要的話，直接按下 Enter ！
    EOF　　　　　<==表示送出的提示字元而已！

    2. 由檔案代替輸入
    [test @test tset]# mail -s "test" root < /root/.bashrc <==將 .bashrc 內容寄給 root ！

    很有趣吧！ ^_^ 這樣就可以將信寄出去囉！所以說，熟悉命令重導像的話，對您可是相當的有幫助的呦！

    好了，那麼為何要使用命令輸出重導向呢？這個問題一定會困擾你一下下的，如果你從來都沒有寫過 script 的話！好了，我們來說一說吧！
    • 當螢幕輸出的資訊很重要，而且我們需要將他存下來的時候；
    • 背景執行中的程式，不希望他干擾螢幕正常的輸出結果時；
    • 一些系統的例行命令（例如寫在 /etc/crontab 中的檔案）的執行結果，希望他可以存下來時；
    • 一些執行命令，我們已經知道他可能的錯誤訊息，所以想以『 2> /dev/null 』將他丟掉時；
    • 錯誤訊息與正確訊息需要分別輸出時。
    當然還有很多很多的功能的，最簡單的就是網友們常常問到的：『為何我的 root 都會收到系統 crontab 寄來的錯誤訊息呢』這個咚咚是常見的錯誤，而如果我們已經知道這個錯誤訊息是可以忽略的時候，嗯！『 2> errorfile 』這個功能就很重要了吧！瞭解了嗎？？
管線命令 ( pipe )
    就如同前面所說的， bash 命令執行的時候有輸出的資料會出現！那麼如果這群資料必需要經過幾道手續之後才能得到我們所想要的格式，應該如何來設定？這就牽涉到管線命令的問題了（ pipe ），管線命令使用的是『 | 』這個界定符號！另外，管線命令與『連續下達命令』是不一樣的呦！這點底下我們會再說明。底下我們先舉一個例子來說明一下簡單的管線命令。
    假設我們要讀取 last 這個指令中，那個 root 登入的『次數』應該怎麼作？注意呦！我們只需要『次數』。那麼我所進行的步驟是：
    1. 執行 last ，將所有這個月的所有人登入資料取出來；
    2. 使用 grep 將上面的輸出資料（stdout）當中的 root 擷取出來，其他的不要；
    3. 使用 wc 這個可以計算行數的指令將上一步的資料計算行數！
    由於 last 的輸出是一行代表一次登入，所以只要計算幾行就代表登入幾次的意思，所以囉！經由上面三個步驟，將 last 資料逐步的篩選，就可以得到我們的資料了！整個命令可以寫成如下：

    [test @test bin]# last
    [test @test bin]# last | grep root
    [test @test bin]# last | grep root | wc -l

    你可以分別執行『 last 』然後再逐步增加為『 last | grep root 』，最後到上面那一行，那麼就馬上可以清楚的知道為何會這麼做囉！這個管線命令『 | 』僅能處理經由前面一個指令傳來的正確資訊，也就是 standard output ( STDOUT ) 的資訊，對於 stdandard error 並沒有直接處理的能力，請記得。那麼整體的管線命令可以使用下圖表示之：

    在每個管線的部分都是『指令』呢！而後一個指令的輸入乃是由前一個指令的輸出而來的！底下我們來談一談一些基本的管線命令指令介紹：
  • cut
    語法：
    [root @test /root ]# cut -d "分隔字元" [-cf] fields
    參數說明：
    -d ：後面接的是用來分隔的字元，預設是『空白字元』
    -c ：後面接的是『第幾個字元』
    -f ：後面接的是第幾個區塊？
    範例：
    [root @test /root]# cat /etc/passwd | cut -d ":" -f 1
    將 passwd 這個檔案裡面，每一行裡頭的 : 用來作為分隔號，
    而列出第一個區塊！也就是姓名所在啦！

    [root @test /root]# last | cut -d " " -f1
    以空白字元為分隔，並列出第一個區間！

    [root @test /root]# last | cut -c1-20
    將 last 之後的資料，每一行的 1-20 個字元取出來！

    說明：
    這個 cut 實在很好用！不過，說真的，除非你常常在分析 log 檔案，否則使用到 cut 的機會並不多！好了！ cut 主要的用途在於將『同一行裡面的資料進行分解！』，最常使用在分析一些數據或文字資料的時候！這是因為有時候我們會以某些字元當作分割的參數，然後來將資料加以切割，以取得我們所需要的資料。我也很常使用這個功能呢！尤其是在分析 log 檔案的時候！
  • sort
    語法：
    [root @test /root ]# sort [-t 分隔符號] [(+起始)(-結束)] [-nru]
    參數說明：
    -t 分隔符號：使用分隔符號來隔開不同區間，預設是 tab
    +start -end：由第 start 區間排序到 end 區間
    -n ：使用『純數字』排序（否則就會以文字型態來排序）
    -r ：反向排序
    -u ：相同出現的一行，只列出一次！
    範例：
    [root @test /root]# cat /etc/passwd | sort
    將列出來的個人帳號排序！

    [root @test /root]# cat /etc/passwd | sort -t: +2n
    將個人帳號中，以使用者 ID 來排序（以 : 來分隔，第三個為 ID ，
    但第一個代號為 0 之故）

    [root @test /root]# cat /etc/passwd | sort -t: +2nr
    反相排序囉！

    說明：
    sort 同樣是很常用的指令呢！因為我們常常需要比較一些資訊啦！舉個上面的第二個例子來說好了！今天假設你有很多的帳號，而且你想要知道最大的使用者 ID 目前到哪一號了！呵呵！使用 sort 一下子就可以知道答案咯！當然其使用還不止此啦！有空的話不妨玩一玩！
  • wc
    語法：
    [root @test /root ]# wc [-lmw]
    參數說明：
    -l ：多少行
    -m ：多少字元
    -w ：多少字？
    範例：
    [root @test /root]# cat /etc/passwd | wc -l
    這個檔案裡頭有多少行？

    [root @test /root]# cat /etc/passwd | wc -w
    這個檔案裡頭有多少字！？

    說明：
    wc 也可以當作指令？呵呵！這可不是上洗手間的 WC 呢！這是相當有用的計算檔案內容的一個工具組喔！舉個例子來說，當你要知道目前你的帳號檔案中有多少個帳號時，就使用上面的 wc -l 啦！因為 /etc/passwd 裡頭一行代表一個使用者呀！所以知道行數就曉得有多少的帳號在裡頭了！而如果要計算一個檔案裡頭有多少個字元時，呵呵！就使用 wc -w 這個參數吧！
    • uniq
      語法：
      [root @test /root ]# uniq
      參數說明：
      範例：
      [root @test /root]# last | cut -d" " -f1 | sort | uniq
      說明：
      這個指令用來將『重複的行刪除掉只顯示一個』，舉個例子來說，你要知道這個月份登入你主機的使用者有誰，而不在乎他的登入次數，那麼就使用上面的範例，(1)先將所有的資料列出；(2)再將人名獨立出來；(3)經過排序；(4)只顯示一個！由於這個指令是在將重複的東西減少，所以當然需要『配合排序過的檔案』來處理囉！
    • tee
      語法：
      [root @test /root ]# last | tee last.list | cut -d " " -f1
      參數說明：
      範例：
      [root @test /root]# last | tee last.list | cut -d " " -f1
      說明：
      有沒有發現在命令重導向的時候，如果我們要將資料送出到檔案的時候，螢幕上就不會出現任何的資料！那麼如果我們需要將資料同時顯示在螢幕上跟檔案中呢？呵呵！這個時候就需要 tee 這個指令囉！使用 last 可以查看到這個月份的登入資料，而使用了 tee 之後，會將資料同時傳給下一個命令去執行，也會將資料寫入 last.list 這個檔案中！也是個好幫手！
    • tr
      語法：
      [root @test /root ]# tr [-ds] SET1
      參數說明：
      -d ：刪除 SET1 這個字串
      -s ：取代掉重複的字元！
      範例：
      [root @test /root]# last | tr '[a-z]' '[A-Z]' <==將小寫改成大寫
      [root @test /root]# cat /etc/passwd | tr -d : <==嘿嘿！ : 這個符號在 /etc/passwd 中不見了！
      [root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM <==將 DOS 檔案的字尾符號 ^M 的符號去除！
      說明：
      其實這個指令也可以寫在『正規表示法』裡頭！因為他也是由正規表示法的方式來取代資料的！以上面的例子來說，使用 [] 可以設定一串字呢！也常常用來取代檔案中的怪異符號！例如上面第三個例子當中，可以去除 DOS 檔案留下來的 ^M 這個斷行的符號！這東西相當的有用！相信處理 Linux & Windows 系統中的人們最麻煩的一件事就是這個事情啦！亦即是 DOS 底下會自動的在每行行尾加入 ^M 這個斷行符號！這個時候我們可以使用這個 tr 來將 ^M 去除！ ^M 可以使用 \r 來代替之！
    • split
      語法：
      [root @test /root ]# split [-bl] 輸入檔案 輸出檔案前導字元
      參數說明：
      -b ：以檔案 size 來分
      -l ：以行數來分
      範例：
      [root @test /root]# split -l 5 /etc/passwd test <==會產生 testaa, testab, testac... 等等的檔案
      說明：
      在 Windows 的情況下，你要將檔案分割需要如何作？！傷腦筋吧！呵呵！在 Linux 底下就簡單的多了！你要將檔案分割的話，那麼就使用 -b size 來將一個分割的檔案限制其大小，如果是行數的話，那麼就使用 -l line 來分割！好用的很！如此一來，你就可以輕易的將你的檔案分割成 floppy 的大小，方便你 copy 囉！
    管線命令在 bash 的連續的處理程序中是相當重要的！另外，在 log file 的分析當中也是相當重要的一環，所以請特別留意！好嘛！？
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 如何顯示 HOME 這個環境變數？
    答：
      echo $HOME

  • 如何得知目前的所有變數與環境變數的設定值？
    答：
      環境變數用 env 而所有變數用 set 即可顯示

  • 我是否可以設定一個變數名稱為 3myhome ？
    答：
      不行！變數不能以數字做為開頭，參考 變數設定規則 的內容

  • 如何取消變數與命令別名的內容？
    答：
      使用 unset 及 unalias 即可

  • 如何設定一個變數名稱為 name 內容為 It’s my name ？
    答：
      name=It\’s\ my\ name 或 name=”It’s my name”

  • 環境變數檔案的載入順序？
    答：
      先由 /etc/passwd 取得 bash 這個 shell ，再到 /etc/profile 讀取主要的環境變數，同時亦會將 /etc/inputrc 及 /etc/profile.d 內容均讀入。之後，再到個人的家目錄讀取 ~/.bash_profile 及 ~/.bashrc 等檔案！

  • man page 的路徑設定檔案？
    答：
      /etc/man.config 或 /etc/man.conf

  • 試說明 ‘, “, 與 ` 這些符號在變數定義中的用途？
    答：
      參考變數規則那一章節，其中， “ 可以具有變數的內容屬性， ‘ 則僅有一般字元，至於 ` 之內則是可先被執行的指令。

  • 跳脫符號 \ 有什麼用途？
    答：
      可以用來跳脫特殊字元，例如 Enter, $ 等等，使成為一般字元！

  • 連續命令中， ;, &&, || 有何不同？
    答：
      分號可以讓兩個 command 連續運作，不考慮 command1 的輸出狀態， && 則前一個指令必需要沒有錯誤訊息，亦即回傳值需為 0 則 command2 才會被執行， || 則與 && 相反！

  • 如何將 last 的結果中，獨立出帳號，並且印出本月份曾經登入過的帳號？
    答：
      last | cut –d “ “ –f1 | sort | uniq
參考文章：
  • 臥龍小三的教學文件：http://linux.tnc.edu.tw/techdoc/shell/book1.html
  • GNU 計畫的 BASH 說明：http://www.gnu.org/manual/bash-2.05a/html_mono/bashref.html，或我這裡保留的檔案
2002/06/27：第一次完成
2003/02/10：重新編排與加入 FAQ
2002/05/20 以來統計人數


正規表示法(Regular Expression,RE)(積極施工中)
最近更新日期：2003/03/15

正規表示法或者稱為常規表示法等等，在 Unix Like 的機器當中，實在是一個相當重要的系統管理員的『利器』！此外，很多的套件也都使用正規表示法的語法在進行工作的分析用途！正規表示法最常用在字串的搜尋與比對，他可以用來進行相當多樣化的比對技巧，可以幫助套件取得所需要的資料，例如郵件伺服器 sendmail 與 postfix 等，都有使用到正規表示法的方式在進行郵件的過濾工作呢！另外，正規表示法也可以幫助使用者快速取得所需要的資料，並且可以協助使用者快速的以取得的資料進行取代的動作等，鳥哥使用這個比對的技巧設計了許多管理的小程式來管理我的 Linux ，實在是相當的有用啊！註：本章節使用者需要多加練習，因為目前很多的套件都是使用正規表示法來達成其『過濾、分析』的目的，為了未來主機管理的便利性，使用者至少要能看的懂正規表示法的意義！

前言：
基礎正規表示法：
    ：grep 應用簡介
    ：重要特殊字元(characters)
延伸正規表示法：
    ：延伸正規表示法的特殊字元
    ：egrep 應用簡介
線上文書編輯器 ed 簡介
常用的相關字元指令：
    ：tr
    ：col
    ：expand, unexpand
    ：paste, ...
好用的搜尋軟體 sed 簡介
厲害的 awk 簡介
正規表示法與管線命令之應用
相關應用：
    ：檔案的比對 diff, cmp, ....
重點回顧
本章與 LPI 的關係
參考資源：
本章習題練習
前言：
    約略瞭解了 Linux 的基本指令 ( Shell ) 並且熟悉了 vi 之後，接下來，我們要介紹如何在文字模式底下 ( Shell 環境當中 ) 進行資料的擷取，以獲得使用者所需要的重要訊息。這個功能很重要，怎麼說呢？在您的電腦工作平台中，或多或少都會使用到『搜尋』以及『取代』的功能對吧！例如使用 Google 或者 Open find 去尋找網頁資訊、例如以文書編輯軟體編輯的過程中，發現錯誤，而使用取代的方式來取代掉錯誤字眼，又例如你開啟的一篇文件資料當中，由於資料量太大，所以直接以搜尋的方法去找出你所需要的關鍵內容等等，這些都是使用到搜尋與取代的功能喔！不過，在您慣用的作業系統當中，平常的工作下 (非伺服器環境) 大概無法進行底下的功能吧：『如何在一串字串當中，尋找有 abc 以及 tqm 還有 WWW 的關鍵字！』，哇！一口氣要達到三組以上的關鍵字搜尋，大概平常的作法就是搜尋三遍吧！不過，如此一來，卻又太浪費時間，並且搜尋完畢後還要將搜尋的資料結合，真麻煩！那有沒有其他的方式可以達到這個目的呢？有的，那就是使用『正規表示法』來進行搜尋囉！

  • 什麼是正規表示法：
    什麼是正規表示式 ( Regular Expression, 底下簡稱 RE ) 呢？簡單的說，在 Linux 的環境下，我們可以透過『字串以及一些特殊字元的輔助』來進行文字的比對工作，好來讓使用者篩選自己所需要資料。這些特殊的字元與搭配使用的工具，就構成了正規表示法的主軸啦！舉個簡單的例子來說，我要找到 VBird 或 Vbird 這個字樣，但是不要其他的字串，如果使用大小寫都接受的情況，我就有可能會找到 VBIRD 或 vbird 或 vbIRd 等等的字眼，但是我卻只要前兩個字串而已啊！這個時候，我可以使用 V[Bb]ird 來搜尋呢！呵呵！那個中括號[]就是一個很常見的表示法之一囉！此外，正規表示法搜尋的結果顯示當中，由於 RE 主要針對『一行』來進行處理，如果是在文書排版的軟體當中，則是以『一整段(沒有斷行)』來進行處理，如果該行有所需要的資料時，則取出來進行處理，如果該行無搜尋的資料，則將該行捨棄，不進行處理與顯示！

    再舉個常見的例子好了，在一堆檔案當中，例如 /etc/rc.d/init.d 這個目錄當中好了，如果你要找到一個檔案內容含有 mail 這個字串的檔名，要怎麼搜尋呢？利用 grep 配合 mail 以及萬用字元來搜尋所有的檔名『grep 'mail' /etc/rc.d/init.d/*』，赫赫！馬上就可以找到你想要的檔案資料啦！這樣可以用來進行很快速的比對呢！對於使用純文字檔編輯文件的人來說，真是一個好消息啊！最起碼，不用像 MS word 一樣，總是需要一個檔案一個檔案的開啟啊！ ^_^！說的好似很複雜，其實不怎麼難的，底下我們會有很多例子讓大家來實作，您就會曉得啦！

  • 正規表示法對於系統管理員的用途：
    那麼為何我需要學習正規表示法呢？對於一般使用者來說，由於使用到正規表示法的機會不怎麼多，因此感受不到他的魅力，不過，對於身為系統管理員的您來說，正規表示法則是一個『不可不學的好東西！』怎麼說呢？由於系統如果在繁忙的情況之下，每天產生的訊息資訊會多到你無法想像的地步，而我們也都知道，系統的『錯誤訊息登錄檔案』的內容(這部份我們在第五篇會詳談)記載了系統產生的所有訊息，當然，這包含你的系統是否被『入侵』的紀錄資料。但是系統的資料量太大了，要系統管理員的你每天去看這麼多的訊息資料，想不瘋掉都很難，這個時候，我們就可以透過『正規表示法』的功能，將這些登錄的資訊進行處理，僅取出『錯誤』的資訊來進行分析，哈哈！如此一來，你的系統管理工作將會『快樂得不得了』啊！當然，正規表示法的優點還不止於此，等您有一定程度的瞭解之後，您會愛上他喔！

  • 正規表示法的廣泛用途：
    除了系統管理員之外，一大堆的軟體與設定都是支援正規表示法的，最常見的例子就是『郵件伺服器』啦！何解？您是否有常常收到電子郵件裡最讓人詬病的『廣告信件』呢？那如果我在 Server 端就將廣告信件給剔除的話，用戶端就會減少很多不必要的頻寬損耗了對吧！那麼如何剔除廣告信件呢？由於廣告信件幾乎都有一定的標題或者是內容，因此，只要每次有來信時，都先將來信的標題與內容進行特殊字串的比對，發現有不良信件就予以剔除！嘿！這個工作怎麼達到啊？就使用正規表示法啊！目前兩大伺服器軟體 sendmail 與 postfix 都支援正規表示法的比對功能！棒的很∼當然還不止於此啦，很多的伺服器軟體、以及套件都支援正規表示法呢！當然，雖然各家軟體都支援他，不過，這些『字串』的比對還是需要系統管理員來加入比對規則的，所以啦！身為系統管理員的你，為了自身的工作以及用戶端的需求，正規表示法實在是很需要學習的一項工作呢！

  • 正規表示法與 Shell 在 Linux 當中的角色定位：
    說實在的，我們在學數學的時候，一個很重要、但是粉難的東西是一定要『背』的，那就是九九乘法表，背成功了之後，未來在數學應用的路途上，真是一帆風順啊！這個九九乘法表我們在小學的時候幾乎背了一整年才背下來，並不是這麼好背的呢！但他卻是基礎當中的基礎！您現在一定受惠相當的多呢 ^_^！而我們談到的這個正規表示法，與前一章的 BASH shell 就有點像是數學的九九乘法表一樣，是 Linux 基礎當中的基礎，雖然也是最難的部分，不過，如果學成了之後，一定是『大大的有幫助』的！不論是對於系統的認識與系統的管理部分，他都有很棒的扶助啊！所以囉，請好好的學習這個基礎吧！ ^_^

  • 正規表示法的嚴謹度：
    認知到正規表示法的重要性之後，而且也瞭解了 RE 的主要用途，接下來得談一談的是，那麼正規表示法的嚴謹度怎麼分啊？華特 ( What ) ？正規表示法還有『嚴謹度』之分？當然有啊！你可以使用較為鬆散的 RE 去找尋一篇文章的內容，也可以使用較為嚴謹的方式去搜尋更準確的內容 ( 有點類似 Google 裡面的『模糊比對』啦！ ^_^ ) 舉個簡單的例子來說，如果你要找尋 car 這個字眼時，那麼會連 careful 也一併當作結果來輸出∼真是抱歉....這個時候，使用更為嚴謹的正規表示法，將 cat 前後的字元限制不可接受英、數字，那就可以得到更為準確的 cat 這個獨立單字的字眼了！很棒不是嗎！底下我們將先以較為基礎的 RE 來做介紹，而後將介紹較為嚴謹的『延伸正規表示法』，清一清腦門，準備用功啦！ ^_^
基礎正規表示法：

  • grep

    語法：
    [root @test /root ]# grep [-acinv] '搜尋字串' filename
    參數說明：
    -a ：將 binary 檔案以 text 檔案的方式搜尋資料
    -c ：計算找到 '搜尋字串' 的次數
    -i ：忽略大小寫的不同，所以大小寫視為相同
    -n ：順便輸出行號
    -v ：反向選擇，亦即顯示出沒有 '搜尋字串' 內容的那一行！
    範例：
    [root @test /root]# grep 'root' /var/log/secure
    將 /var/log/secure 這個檔案中有 root 的那一行秀出來

    [root @test /root]# grep -v 'root' /var/log/secure
    若該行沒有 root 才將資料秀出來到螢幕上！

    [root @test /root]# last | grep root
    若該行沒有 root 才將資料秀出來到螢幕上！

    [root @test /root]# grep [A-Z]ANPATH /etc/man.config
    將 /etc/man.config 這個檔案當中，所有有：
    [任何一個大寫字元]後面接 ANPATH 的那一行就顯示出來！
    例如 AANPATH, BANPATH.... ZANPATH 等等！

    說明：
    grep 是一個很常見的指令，最重要的功能就是進行字串資料的比對了，需要說明的是『grep 在一個檔案中查尋一個字串時，他是以"整行"為單位來資料的擷取的！』也就是說，假如一個檔案內有 10 行，其中有兩行具有你所搜尋的字串，則將那兩行顯示在螢幕上，其他的就丟棄了！而 grep 除了可以進行檔案的資料搜尋之外，也常常被應用在 input/output 的資料處理當中，例如常見的管線命令 ( pipe ) 就可以常常見到他的蹤影！以上面的例子來看，我們可以發現前兩個例子是查尋檔案的內容，有沒有加上 -v 所顯示出來的結果是『相反的！』，而第三個例子則是以 pipe 的功能進行資料的處理的喔！至於最後一個例子比較特殊，使用到中括號 [] ，這是什麼意思呢？

    在中括號裡面『只有一個字元』，而裡面的內容就是『字元的範圍』啦！所以呢[A-Z]就是指：『A到Z當中的任何一個字元都能被接受，但是只有一個字元』的意思！所以，如果我想要所有的數字都接受，那就是[0-9]，如果我只要接受 1,3,5 呢？就是[135]或者可以用逗號隔開[1,3,5]！所以啦，那個減號 - 在中括號當中，代表『一個範圍(range)』的意思啦！中括號還有很多用途呢！底下會更詳細介紹！

    grep 是最簡單的正規表示法搜尋指令之一，他並不支援一些更嚴謹的正規表示法內容，不過，已經相當的好用啦！底下我們就以一個檔案做為練習吧！先來查看一下這個檔案內容：

    [root @test /root ]# vi regexp.txt
    This is a cat, however, I need a dog.
    I want to "Happy" and <Happy> and /Happy/ here.
    * I don't know how to do this *
    # I don't Know how to do this $
    ^ I don't KNOW how to do this @
    OK! everythins is OK
    Now, I will eat my food
    are you finished your work
    what do you 123 goto where
    tesaaaaatest
    quit bbbbqqa testglgs
    i will shutdown my mechine
    bye bye

    這個檔案是鳥哥在 MS dos 的環境中編輯的，所以他還含有一些特殊的字元喔！使用 vi 來查看的時候還沒有很清楚，如果使用 cat -A 來查看時，會出現什麼呢？

    [root @test /root ]# cat -A regexp.txt
    This is a cat, however, I need a dog.^M$
    I want to "Happy" and <Happy> and /Happy/ here.^M$
    * I don't know how to do this *^M$
    # I don't Know how to do this $^M$
    ^ I don't KNOW how to do this @^M$
    OK! ^Ieverythins is OK^M$
    Now, I will eat my food^M$
    are you ^Ifinished your work^M$
    what do you 123 goto where^M$
    tesaaaaatest^M$
    quit bbbbqqa testglgs^M$
    i will shutdown my mechine^M$
    bye bye^M$

    上面粗體的地方就是 DOS 檔案底下的特殊字符啦！比較一下用 vi 與 cat -A 秀出來的結果有什麼不同？而主要的 DOS 字符有：
      ^M ：表示斷行字符；
      ^I ：表示 <tab> 造成的按鍵符號；
      $ ：表示每一行的行尾之意！
    這個 regexp.txt 檔案你可以在 http://linux.vbird.org/download/index.php#regular 下載回去做練習喔！好了，假設你已經將這個檔案給他捉到自己的 Linux 底下了，此時，應該要來做一些小練習囉！趕緊看看吧！

    例題一：找出這個檔案裡面含有 know 這個字元，並將行號列出來：
    [root @test /root ]# grep -n 'know' regexp.txt
    3:* I don't know how to do this *
    grep 會一行一行的去比對 know 這個字串，請注意，大小寫是不一樣的！
    當該行裡面沒有 know 這個字串時， grep 就會將該行捨棄而不顯示出來，
    不過，到第三行時，出現了 know 了，所以第三行就會被顯示出來啦！

    例題二：找出這個檔案裡面含有 * 這個字元，並將行號列出來：
    [root @test /root ]# grep -n '\*' regexp.txt
    3:* I don't know how to do this *
    請特別留意喔，在正規表示法裡面有相當多的『特殊字元』存在，而要
    取消掉這些特殊字元的屬性時，反斜線『\』的存在就顯的特別重要了！
    在這個例子中，或許你會發現使用 grep -n '*' regexp.txt 也可以得到
    相同的結果，但是，良好的習慣是需要養成的，這裡，請以較為正統的
    正規表示法來去除 * 這個特殊字元的屬性，對您以後一定會有很多的好處的！

    例題三：我要將所有 know 不論大小寫都列出來，並列出行號：
    [root @test /root]# grep -ni 'know' regexp.txt
    3:* I don't know how to do this *
    4:# I don't Know how to do this $
    5:^ I don't KNOW how to do this @
    如果不理會大小寫的差異，加入 -i 這個參數吧！列出行號就以 -n 來達成！

  • 正規表示法的特殊字元(charaters)與 egrep 指令

    正規表示法不止於尋找簡單的字串，他還有相當多的額外功能提供我們使用者組合、分析字串，底下我們先來列出幾個常見的正規表示法的特殊字元，搭配剛剛您下載的檔案，然後再以右邊的範例來實習一下吧！

    特殊字元
    表示意義與範例
    ^word 意義：待搜尋的字元在行首
    說明：
    搜尋 word 這個字串，『並且 word 必需為這一行的行首』。
    範例：
    找出檔案中以 i 為開頭的那一行，並且忽略大小寫：
    [root@test root]# grep -in '^i' regexp.txt
    2:I want to "Happy" and <Happy> and /Happy/ here.
    12:i will shutdown my mechine
    word$ 意義：待搜尋的字元在行尾
    說明：
    搜尋 word 這個字串，並且 word 必需為這一行的行尾
    範例：
    由於鳥哥提供的檔案其實是 DOS 檔案下的產物，所以字尾都會存在著 ^M 的字符，因此，我們先以 tr 這個指令將這個字符給他去掉，然後再找出字尾為 ye 的那一行，並顯示出來！關於更多的 tr 指令的用法，我們會在後面進行說明。
    [root@test root]# cat regexp.txt|tr -d '\r' grep -n 'ye$'
    13:bye b ye
    . 意義：代表『一個』任意字元，一定要有『一個字元』存在
    說明：
    這個『.』在正規表示法當中很常用，代表的是『一個』任意字元，不是 0 個也不是多個，恰恰好就是『一個』。
    範例：
    我要將檔案中有 e 與 t 並且中間含有一個字元的該行抓出來，注意喔！ e 與 t 的中間一定會有一個字元存在才是成功的喔！例如下列範例：
    [root@test root]# grep -n 'e.t' regexp.txt
    7:Now, I will eat my food
    10:tesaaaaatest
    11:quit bbbbqqa testglgs
    \ 跳脫符號將特殊字元變成普通字元
    ? 任何一個『單一』字元
    * 隨意幾個任意字元
    [list] | 列表中的字元
    [range] | 列表中範圍內的字元
    [^list] | 反向選擇，與 [list] 相反
    [^range] | 反向選擇，與 [range]相反
    \{n\} | 與前一個相同字浮連續 n 個
    \{n,m\} | 與前一個相同字浮連續 n-m 個

    請特別留意的是，『正規表示法的特殊字元』與一般在指令列輸入指令的『萬用字元』並不相同，例如，在萬用字元當中， * 代表的是 0 ~ 無限多個字元的意思，但是在正規表示法當中， * 則是重複前一個字符的意思∼使用的意義並不相同，不要搞混了！(鳥哥我一開始摸正規表示法時就很容易搞混！因為這裡是新手最容易搞錯的地方，特別小心啊！)
    題：我想要知道，在 /etc 底下，只要含有 XYZ 三個字元的任何一個字元的那一行就列出來，要怎樣進行？
    答：
    『只要』含有 X 或 Y 或 Z 就將該行列出來，因此，我們的範圍很很廣啦！這個時候就必需要使用到 [] 這個咚咚！還記得中括號的用途嗎？那就是『在中括號裡面謹代表一個字元而已！』而這個中括號是一個『代表』，可以是一串字也可以是幾個不連續的字！這裡我們僅需要 XYZ 其中任何一個，所以可以這樣寫：
    grep [XYZ] /etc/*
    則只要在每一行當中，只要發現 X 或 Y 或 Z 任何一個，就會將他印出來！這個與 grep XYZ /etc/* 是『完全不一樣』的！請仔細的思考一下ㄟ！

    例題：我想要知道在 /etc 裡面，只要句首是 w-z 的就將他印出來？
    答：
    同樣的，使用中括號！
    grep ^[w-z] /etc/*

    當然還有很多很多用法啦！畢竟一個正規表示法加上他附屬的一些指令，幾乎可以出一本書了，這裡僅是想讓大家瞭解他的好處罷了！所以就寫到這裡！其他的，就等著您去參詳與發現囉！
  • diff
    語法：
    [root @test /root ]# diff file1 file2
    參數說明：
    範例：
    [root @test /root]# diff index.htm index.html
    說明：
    這是用來比較兩個檔案內容是否有不一致的指令！
  • awk
    語法：
    [root @test /root ]# last | awk '{print $1 " " $2}'
    參數說明：
    範例：
    [root @test /root]#
    說明：
    施工中
  • sed
    語法：
    [root @test /root ]# last | sed 10,\$d
    參數說明：
    範例：
    [root @test /root]#
    說明：
    施工中
      • 重點回顧
      • 正規表示法 ( Regular Expression ) 的用途主要是用來做為『搜尋』字串之用，還可以用來過濾特殊訊息等用途；
      • 由於嚴謹度的不同，正規表示法之上還有更嚴謹的延伸正規表示法；
      • 正規表示法的處理方式，經常是以『整行』或稱為『整段』來進行處理的；
      • grep 與 egrep 在正規表示法裡面是很常見的兩支程式，其中， egrep 支援更嚴謹的正規表示法的語法；
      本章與 LPI 的關係
    • 在 LPI 網站 http://www.lpi.org 裡面提到的，
      • 參考資源：
      • 洪朝貴老師的網頁：http://www.cyut.edu.tw/~ckhung/olbook/gnulinux/regexp.shtml
      • PCRE 官方網站：http://www.perldoc.com/perl5.8.0/pod/perlre.html
      • 龍門少尉的窩：http://main.rtfiber.com.tw/~changyj/
      • Study Area：http://www.study-area.org/linux/system/linux_shell.htm
      本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
      • 例題：我想要知道某個檔案裡面含有 boot 的字眼，而這個檔案在 /etc/ 底下，我要如何找出這個檔案？
        答：
          既然知道有這個字眼那就好辦了！可以直接下達：
          grep boot /etc/*

      • 題：我想要知道，在 /etc 底下，只要含有 XYZ 三個字元的任何一個字元的那一行就列出來，要怎樣進行？
        答：
          『只要』含有 X 或 Y 或 Z 就將該行列出來，因此，我們的範圍很很廣啦！這個時候就必需要使用到 [] 這個咚咚！還記得中括號的用途嗎？那就是『在中括號裡面謹代表一個字元而已！』而這個中括號是一個『代表』，可以是一串字也可以是幾個不連續的字！這裡我們僅需要 XYZ 其中任何一個，所以可以這樣寫：
          grep [XYZ] /etc/*
          則只要在每一行當中，只要發現 X 或 Y 或 Z 任何一個，就會將他印出來！這個與 grep XYZ /etc/* 是『完全不一樣』的！請仔細的思考一下ㄟ！

      • 例題：我想要找出在 /etc 底下，檔案內容含有 * 的檔案名稱？
        答：
          由於 * 是特殊字元，在變數的訂定法則裡面曾經提過要將特殊字元移除，需要使用跳脫字元，亦即是 \ 符號，所以我可以這樣下達指令：
          grep \* /etc/*
      正規表示法(Regular Expression,RE)
      2002/07/29：第一次完成
      2003/02/10：重新編排與加入 FAQ
      2003/03/10：重新編寫資料，加入 sed 與相關的重要訊息資訊！
      2002/06/28 以來統計人數


學習 shell scripts
最近更新日期：2002/06/27
幹嘛學習 Scripts
scripts 的執行與第一支 scripts：
標籤與運算符號： declare
對談式 scripts ： read
scripts 邏輯判斷式與運算式：
條件式判斷： if...then...fi, case.....esac
迴圈：for....do....done, while...do...done, until...do...done,
script 如何 debug ：
本章習題練習
幹嘛學習 Scripts
這個問題可有趣的很了，我為什麼要學習 scripts 呢？不要學可不可以呀！？呵呵！如果您只想要『會用』 Linux 就好的話，那麼這一個部分確實可以先跳過去不看也沒關係，不過，如果您想要更加的瞭解與控制 Linux ，使 Linux 運作更順暢之外，還可以高枕無憂的讓你的 Linux Server 在 Internet 上面提供相關服務的話，那麼 scripts 還是多少學一學吧！為什麼呢？因為 scripts 可以設計到『很聰明的知道什麼條件之下需要進行什麼動作！』不要小看這個功能呦！當您不在電腦前面的時候，突然之間，主機被一些不明封包試圖入侵了，這個時候如果你的 Linux 主機可以透過『當該封包嘗試幾次還是連線失敗之後，就予以抵擋住該 IP 』，如果可以設計到如此功能的話，呵呵！那麼可就不得了了！您的 Linux 主機就可以說是『好聰明呀！ smart!』

除了針對主機之外，其實 scripts 還有相當多的運用功能呦！例如您想要在 Linux 上面作你的作業，而這個作業是一些數值方面的計算，這個時候 Scripts 也可以幫您計算呦！還不需要用到 fortran, c 這類高階的程式語言呢！ scripts 本身就是一個可以用的 program 囉！相當的棒吧！其實， scripts 最開始被新手使用的功能就是『彙整一些在 command line 下達的連續指令，將他寫入 scripts 當中，而由直接執行 scripts 來啟動一連串的 command line 指令輸出入！』例如： 防火牆連續規則 ( iptables )，開機載入程序的項目 ( 就是在 /etc/rc.d/rc.local 裡頭的資料 ) ，等等都是相似的功能啦！ 其實，說穿了，如果不考慮 program 的部分，那麼 scripts 也可以想成，僅是幫我們把一大串的指令彙整在一個檔案裡面，而直接執行該檔案就可以執行那一串又臭又長的指令段！就是這麼簡單啦！

另外的另外，在編寫 scripts 時，在 Linux 當中，最常使用的就是 vi 這一套文書編輯器了，所以囉，為了更簡易的控管我們的 Linux ，嗯！還是學習一下好了啦！好不好呀！ ^_^

scripts 的執行與第一支 scripts
  • scripts 的執行：
嗯！在上一章 bash shell 當中說了一堆變數啦！管線指令啦！等等的，都是為了接著而來的 scripts 的咚咚啦！什麼是 script 啊？由字面上的意思來說， script 就是『腳本、劇本』的意思，那夠清楚了吧！就是將我們要執行的內容寫成一個『腳本』，讓系統依據這個『腳本』來執行我們想要的東西！好了！現在我們來討論一下怎麼寫 scripts 好了！基本上，一個 script 被執行的時候， bash 會據以判斷執行的步驟為：
  1. 如果讀取到一個 Enter 符號（ CR ），就嘗試開始執行該行命令；
  2. 如同前面 bash command 提到的，指令間的多個空白會被忽略掉；
  3. 而空白行也將被忽略掉！，並且 tab 也是不會被理會的！
  4. 至於如果一行的內容太多，則可以使用 \ 來延伸至下一行；
  5. 此外，使用最多的 # 可做為註解！任何加在 # 後面的字，將全部被視為註解文字而被忽略！
然後，在撰寫一個 scripts 的時候，最好養成良好的習慣：
  1. 先宣告使用的 shell 為何？（特別留意這一點，在某些狀況中，例如 /etc/crontab 情況下，如果沒有宣告使用的 shell ，常常會出現錯誤訊息而導致 scripts 無法被執行呦！）
  2. 註明該 script 的內容功能、版本資訊、作者、建檔日期等等
  3. 每一個大步驟的主要功能（也順便提供自己未來修改之用！）
那麼 scripts 這個檔案要如何來執行呢？執行的方法有兩種：
  • 一個是將該檔案改成可以執行的屬性，如chmod 755 scripts.file ，然後執行該檔案；
  • 另一種則是直接以 sh 這個執行檔來執行 script 的內容，如 sh scripts.file！
大致上就是這樣啦！OK！那麼還記得我們在前面一章已經說過了變數的設定方式了吧？好了，那麼我們就以第一支 scripts 來將我們設定的變數直接給他 show 出來！嗯！來設計一下這支 script 吧！
  • 建立你的第一支 script：
好了，我們來建立第一支簡單的 script 吧！最簡單的一個例子，就是在螢幕上列出『 Hello ! How are you ?』，可以這樣寫：（註：最常使用來作為 shell scripts 的寫作的軟體，就是 vi 啦！有空真的要多熟悉一下 vi 呦！）
[root @test /root]# mkdir test; cd test <==建立一個新的目錄，所有的 scripts 都暫存在此！
[root @test test]# vi test01-hello.sh
#!/bin/bash <==在 # 之後加上 ! 與 shell 的名稱，用來宣告使用的 shell
# 這個腳本的用途在於列出 Hello ! How are you 在螢幕上
# 建檔日期： 2002/05/20
# Made by VBird
hello=Hello\ \!\ How\ are\ you\ \? <==這就是變數啦！
echo $hello

[root @test test]# sh test01-hello.sh
Hello ! How are you ? <=輸出的結果顯示在螢幕上！

這裡給他注意一下：

  • 所有在 scripts 裡面的東西，基本規則 ( 如變數設定規則 ) 需要與 command line 時相同；
  • scripts 的附檔名最好為 .sh 提供他人的認識；
  • 並非加上 .sh 就可以是執行檔，還需要查看其屬性中是否有 x 這個屬性。
呵呵！很興奮吧！你已經會寫 scripts 了呦！已經具有初階的程式設計能力囉！嗯！是該覺得高興的！^_^...！好了，接著下來我們寫稍微複雜一點的，若一個 script 裡頭有兩個以上的變數要相互引用呢？呵呵！這個時候順便來比較一下 " 與 ' 的異同吧！
[root @test test]# vi test02-2var.sh
#!/bin/bash
# 這個腳本用途在於引用兩個變數，順便比較一下 " 與 ' 的異同
# Date: 2002/06/27
# Made by VBird
name="V.Bird"
myname1="My name is $name"
myname2='My name is $name'
echo $name
echo $myname1
echo $myname2

[root @test test]# sh test02-2var.sh
V.Bird
My name is V.Bird
My name is $name

看到輸出的結果了吧！呵呵！沒錯！那個 " 與 ' 最大的不同就是在於能不能保有『變數內容』啦！再提醒一次，那個單引號『 ' 』裡頭的資料都將變成『單純的字元』而不是有特殊的字體呦！

標籤與運算符號：declare
    OK！瞭解了變數的 scripts 寫法之後，現在我們來進行一個有趣的實驗好了！就是說，當我們在進行『計算』的時候，到底 bash 能不能瞭解我們所給予的是『數字』還是單純的『字元』呢？這個很重要的，因為會造成系統的誤判呦！好了，我們來試試看！當我們需要輸出 3 * 5 的結果時，需要如何做呢？用單純的 command line 一行一行輸入的結果如下：
    [root @test test]# a=3
    [root @test test]# b=5
    [root @test test]# c=$a*$b
    [root @test test]# echo $c
    3*5 <==糟糕！怎麼變成了字串了？！

    發現了嗎？嘿嘿！上面輸出的是不是我們所希望的 3*5 = 15 的結果？嗯！這是因為我們沒有定義該變數，則該變數預設是呈現『字串』的型態！那麼自然 $c 就成為自串型態了！所以我們需要來宣告一下變數（嘿嘿！跟程式語言很相近吧！也是需要宣告變數的啦！），宣告變數使用的是 declare 這個指令，而變數名稱有底下這些囉！

  • declare
    宣告變數內容
    語法：
    [test @test test]# declare [-afirx]
    參數說明：
    -a ：定義為陣列 array
    -f ：定義為函數 function
    -i ：定義為整數 integer
    -r ：定義為『唯讀』
    -x ：定義為透過環境輸出變數
    範例：
    [test @test test]# declare -i a=3
    [test @test test]# declare -i b=5
    [test @test test]# declare -i c=$a*$b
    [test @test test]# echo $c
    15 <==變成數字囉！ ^_^
初步瞭解了吧！？好了，現在我們來玩玩看，如果您的計算結果當中，需要輸入為 2*3+5*13-32+25 時，並且在最後輸出『 Your result is ==> 』該怎樣寫這一支簡單的 script 呢？可以這樣試試看：
[root @test test]# vi test03-declare.sh
#!/bin/bash
# This program is used to "declare" variables
# VBird 2002/06/27
number1=2*3+5*13-32+25
declare -i number2=2*3+5*13-32+25
echo "Your result is ==> $number1"
echo "Your result is ==> $number2"
[root @test test]# sh test03-declare.sh
Your result is ==> 2*3+5*13-32+25
Your result is ==> 64

怎樣？很有趣吧！更好玩的還在後頭呦！再往下看一下吧！

對談式 scripts ：
什麼是對談式的 scripts 呢？很簡單啦！例如你在執行 Windows 的安裝程式時，系統不是常常會跳出一個視窗，問你『下一步』、『上一步』或『取消』嗎？那就是對談啦！程式會依據您輸入的資料來進行判斷，OK！那麼最簡單的對談式指令是什麼呢？呵呵！就是 read 這個指令啦！ read 的功能就是『依據您在鍵盤輸入的結果 input 到變數內容中』，例如：
[root @test test]# read name
VBird <==這是鍵盤輸入的結果
[root @test test]# echo $name
VBird

好了！那麼我們來設定一下，當您的 script 在執行的時候，將您由鍵盤輸入的資料列出來！如何做呢？
[root @test test]# vi test04-read.sh
#!/bin/bash
# This program is used to "read" variables
# VBird 2002/06/27
echo "Please keyin your name, and press Enter to start."
read name
echo "This is your keyin data ==> $name"
[root @test test]# sh test04-read.sh
Please keyin your name, and press Enter to start.
VBird Tsai
This is your keyin data ==> VBird Tsai

就是這麼簡單，我們後面還會繼續的談到判別式，那個時候輸入的資料可就更重要了！

好了！下一步我們再來說一說怎樣定義一個 script 的參數的代號！？以底下我們的說明為例：
[root @test test]# myscript opt1 opt2 opt3 opt4
                    $0　　　 $1　 $2　 $3 　$4

這是什麼意思呢？嘿嘿！就是說，在這個 script （ myscript ）裡面，只要變數名稱為 $0 就表示為 myscript 這個咚咚，也就是說：

$0 : myscript 亦即是 script 的檔名
$1 : opt1 亦即是第一個附加的參數 (parameter)
$2 : opt2
$3 : opt3
這樣說或許不是很清楚，我們來玩一玩底下這個 script 看看就曉得他的意思啦！
[root @test test]# vi test05-0123
#!/bin/bash
# This program will define what is the parameters
# VBird 2002/06/27
echo "This script's name => $0"
echo "parameters $1 $2 $3"
[root @test test]# sh test05-0123 pa1 pa2 pa3
This script's name => test05-0123
parameters pa1 pa2 pa3

這個東西在運用上也是相當的重要的，例如當您要取得 script 的名稱時（因為有時候使用者會自行更改檔案名稱），則這個功能變數就相當的重要了！瞭解乎！？

scripts 邏輯判斷式與運算式：
再來的這個東西可就更重要了，尤其在 scripts 當中！那就如『如何判定某個檔案或目錄，或者是如何判定程式應該朝向那個方向行進』？這個東西需要有比較好一些的邏輯概念的說明才行！底下我們分別說明一下邏輯判斷式與運算式之後，再來設定幾個小 scripts 試試看不同的用法，以期得到大家的瞭解囉！
  • 邏輯判斷式：
    在 scripts 裡頭很重要的一項工作就是『判斷是否可行』的目標！舉個例子來說，當我們要建立一個目錄的時候，先偵測有沒有該目錄，如果有的話，那麼就不需要建立，如果沒有的話，那麼就建立該目錄！這個就需要 script 來主動的判斷了！那麼如何判斷呢？基本上由於是判斷式，那麼應該都會與『條件』有關的，所以底下的判斷式大多與『 if... then... fi 』這一種條件判斷式有關係！這部份後面再提，這裡先提一下邏輯判斷式的幾個重要的咚咚：
    邏輯標籤
    表示意思
    1. | 關於檔案與目錄的偵測邏輯標籤！
    -f
    常用！偵測『檔案』是否存在
    -d
    常用！偵測『目錄』是否存在
    -b
    偵測是否為一個『 block 檔案』
    -c
    偵測是否為一個『 character 檔案』
    -S
    偵測是否為一個『 socket 標籤檔案』
    -L
    偵測是否為一個『 symbolic link 的檔案』
    -e
    偵測『某個東西』是否存在！
    2. | 關於程序的邏輯標籤！
    -G
    偵測是否由 GID 所執行的程序所擁有
    -O
    偵測是否由 UID 所執行的程序所擁有
    -p
    偵測是否為程序間傳送資訊的 name pipe 或是 FIFO （老實說，這個不太懂！）
    3. | 關於檔案的屬性偵測！
    -r
    偵測是否為可讀的屬性
    -w
    偵測是否為可以寫入的屬性
    -x
    偵測是否為可執行的屬性
    -s
    偵測是否為『非空白檔案』
    -u
    偵測是否具有『 SUID 』的屬性
    -g
    偵測是否具有『 SGID 』的屬性
    -k
    偵測是否具有『 sticky bit 』的屬性
    4. | 兩個檔案之間的判斷與比較 ；例如『 test file1 -nt file2 』
    -nt
    第一個檔案比第二個檔案新
    -ot
    第一個檔案比第二個檔案舊
    -ef
    第一個檔案與第二個檔案為同一個檔案（ link 之類的檔案）
    5. | 邏輯的『和(and)』『或(or)』
    &&
    邏輯的 AND 的意思
    ||
    邏輯的 OR 的意思

    比較有趣的應該算是 1, 3 這兩種種類的判斷，尤其是在建立一些 permission 相關的檔案時，這個就更重要了！然後那個『兩個檔案之間的判斷』也是挺有意思的！有空的話不妨去試一試去！還有，那個 && 及 || 這兩個東西也是很重要的！接著下來，我們要來談一談運算符號囉！

  • 運算符號簡介：
    在 bash shell scripts 的運算符號的加減乘除是怎樣的一回事呀！？談一談吧！
    運算符號
    代表意義
    =
    等於
    !=
    不等於
    <
    小於
    >
    大於
    -eq
    等於
    -ne
    不等於
    -lt
    小於
    -gt
    大於
    -le
    小於或等於
    -ge
    大於或等於
    -a
    雙方都成立（and）
    -o
    單方成立（or）
    -z
    空字串
    -n
    非空字串

    邏輯判斷式與 if...then...fi 的關係是密不可分的，我們底下就先來談一談這一個判斷式當中最常使用的語法吧！

條件式判斷：if...then...fi, case.....esac
  • 條件判斷一：if then fi 的方式
OK！剛剛我們 建立了第一支 script ，在螢幕上面以 script 來輸出問候語！好了，現在我們如果要讓 scripts 加上『判斷』要如何來工作呢？這就是所謂的條件式判斷了！最常使用到的就是『 if ... then .... else if .... then ... end if 』的作法了！這個條件判斷的語法為：
if [ 條件判斷一 ] && (||) [ 條件判斷二 ]; then <== if 是起始的意思，後面可以接若干個判斷式，使用 && 或 ||
執行內容程式
elif [ 條件判斷三 ] && (||) [ 條件判斷四 ]; then <==第二段的判斷，如果第一段沒有符合就來此搜尋條件
執行第二段內容程式
else <==當前兩段都不符合時，就以這段內容來執行！
執行第三段內容程式
fi <==結束 if then 的條件判斷！

上面的意思是這這樣的：在中刮號『[]』裡面的是條件式，如果是複合式的條件判斷（如若A及B則C之類的邏輯判斷），那麼就需要在兩個中刮號之間加上『 && (and)』或者是『 || (or)』這樣的邏輯運算式才行！如果是多重選擇的話，那麼就需要以 elif （optional, 選擇性的，若有需要才加上！）來新增另一個條件；如果所有的條件都不適用，則使用 else （optional）來進行最後的執行內容囉！

不過，這裡有幾個新手常犯的錯誤，我們需要來加強說明一下：
  1. 在 [ ] 當中，只能有一個判別式；
  2. 在 [ ] 與 [ ] 當中，可以使用 && 或 || 來組織判別式；
  3. 每一個獨立的元件之間『都需要有空白鍵來隔開』！
尤其是最後一點，最容易犯的錯啦！好了，我們來進行一個簡單的判別式好了！
[root @test test]# vi test06-ifthen.sh
#!/bin/bash
# This program is used to study if then
# VBird 2002/06/27
echo "Press y to continue"
read yn
if [ "$yn" = "y" ]; then
echo "script is running..."
else
echo "STOP!"
fi
[root @test test]# sh test06-ifthen.sh
Press y to continue
y
script is running...
[root @test test]$ sh test06-ifthen.sh
Press y to continue
n
STOP!

很簡單的一個例子吧！當輸入為 y 的時候，就給他進行，若非為 y 則予以進行！但是這裡有個問題，就是如果我輸入為 Y 時，程式還是停止了！怎麼辦？！這個時候就需要使用到 || 這個東西啦！我們可以這樣做！
[root @test test]# cp test06-ifthen.sh test07-ifthen.sh
[root @test test]# vi test07-ifthen.sh
#!/bin/bash
# This program is used to study if then
# VBird 2002/06/27
echo "Press y to continue"
read yn
if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
echo "script is running..."
else
echo "STOP!"
fi
[root @test test]# sh test07-ifthen.sh
Press y to continue
y
script is running...
[root @test test]$ sh test07-ifthen.sh
Press y to continue
Y
script is running...

好了！那麼如果再加上前面提過的： parameter 的選用呢？呵呵！這個也蠻有趣的，我們再來試試看：
[root @test test]# vi test08-ifthen.sh
#!/bin/bash
# set parameters in the if then
# 需要加上 hello 這個參數才會顯示正確的！
# VBird 2002/06/27
if [ "$1" = "hello" ]; then
echo "Hello! How are you ?"
elif [ "$1" = "" ]; then
echo "You MUST input parameters"
else
echo "The only accept parameter is hello"
fi
[root @test test]# sh test08-ifthen.sh hello
Hello! How are you ?
[root @test test]$ sh test08-ifthen.sh
You MUST input parameters
[root @test test]$ sh test08-ifthen.sh djdkf
The only accept parameter is hello

呵呵！是不是不難呢？玩到這裡應該對於 scripts 的認識有一定程度的瞭解了吧！嗯！好了，底下我們來玩一個大的！假設您已經知道 netstat 與 grep 這兩個東西的用法，那麼如果要來偵測你的主機上面的 port 是否有開啟時，可以使用底下的範例來進行：
[test @test test]# vi port.sh <==編輯一個檔案為 test1.sh 的 script
#!/bin/bash <==宣告使用的 shell 類型
# program: Using to study the [if ... then ... fi] program
# Made by: VBird
# date: 2002/05/20
# content: I will using this program to show your services
# 1. print the program's work in your screen
echo "Now, the services of your Linux system will be detect!"
echo "The www, ftp, ssh, and sendmail + pop3 will be detect!"
echo " "
# 2. www
www=`netstat -an|grep LISTEN|grep :80` <==這個就是變數啦！並使用了管線命令！
if [ "$www" != "" ]; then <==開始條件的判斷囉！
echo "WWW is running" <==若條件成立，那麼就列印這一行的內容！
else
echo "WWW is NOT running"
fi
# 3. ftp
ftp=`netstat -an|grep LISTEN|grep :21`
if [ "$ftp" != "" ]; then
echo "FTP is running"
else
echo "FTP is NOT running"
fi
# 4. ssh
ssh=`netstat -an|grep LISTEN|grep :22`
if [ "$ssh" != "" ]; then
echo "SSH is running"
else
echo "SSH is NOT running"
fi
# 5. sendmail + pop3
smtp=`netstat -an|grep LISTEN|grep :25`
pop3=`netstat -an|grep LISTEN|grep :110`
if [ "$smtp" != "" ] && [ "$pop3" != "" ]; then <==有兩個以上的條件式，就使用 && 或 || 來分隔！
echo "sendmail is OK!"
elif [ "$smtp" != "" ] && [ "$pop3" = "" ]; then
echo "sendmail have some problem of your pop3"
elif [ "$smtp" = "" ] && [ "$pop3" != "" ]; then
echo "sendmail have some problem of your smtp"
else
echo "sendmail is NOT running"
fi
[test @test test]# sh port.sh <==執行看看輸出的結果！
Now, the services of your Linux system will be detect!
The www, ftp, ssh, and sendmail + pop3 will be detect!

WWW is running
FTP is running
SSH is running
sendmail is OK!

很簡單吧！上面這樣就可以將你主機上面的資料進行解析囉！

  • 條件判斷二：使用 case ...esac 的方式
剛剛的『 if then fi 』的形式是以程式來自行判斷，那麼如果我已經規劃好幾個項目要來執行，只要選擇執行的『種類方式』就可以正確的執行的話，要怎麼做呢？最簡單的例子就是我們常常使用到的 /etc/rc.d/init.d/ 裡頭的 scripts 囉！例如：重新啟動 xinetd 是使用：
/etc/rc.d/init.d/xinetd restart
注意囉！那個是 restart 的項目，然後 script 就會自動的去搜尋 restart 項目裡面的情況去執行！那個就是 case ... esac 的使用模式囉！有沒有注意到，開始是『 case 』結束則是使用 case 的倒寫『 esac 』喝！很有趣吧！那麼這種格式是怎樣呢？
case 種類方式(string) in <==開始階段，那個種類方式可分成兩種類型，通常使用 $1 這一種直接下達類型！
種類方式一)
程式執行段
;; <==種類方式一的結束符號！
種類方式二)
程式執行段
;;
*)
echo "Usage: {種類方式一|種類方式二}" <==列出可以利用的參數值！
exit 1
esac <==這個 case 的設定結束處！

在種類方式(string)的格式主要有兩種：

  1. 直接下達式：就是以『 執行檔案 + string 』的方式來執行的(/etc/rc.d/init.d 裡頭的基本設定方式），則 string 可以直接寫成『 $1 』（在執行檔案後面直接加入參數的第一個參數！）
  2. 互動式：就是由螢幕輸出可能的項目，然後讓使用者輸入，這個通常必須配合『 read variable 』然後 string 則寫成『 $variable 』的格式！
同樣的，我們建立一個名為 test2.sh 的檔案來試做看看。假如我們共可分三段格式來進行實作，分別為 one, two, three ，並假設使用直接下達式，則可以寫成：
[test @test test]# vi test09-case.sh
#!/bin/bash
# program: Using case mode
# Made by: VBird
# date: 2002/05/20
# content: I will use this program to study the case mode!
# 1. print this program
echo "This program will print your selection!"

case $1 in <==使用直接下達指令型態！
one)
echo "your choice is one"
;;
two)
echo "your choice is two"
;;
three)
echo "your choice is three"
;;
*)
echo "Usage {one|two|three}" <==列出可以使用的參數（如果使用者下達錯誤的參數時）
exit 1
esac
[test @test test]# sh test09-case.sh <==執行結果！顯示沒有相對的參數！所以列出可以參數！
This program will print your selection!
Usage {one|two|three}
[test @test test]# sh test09-case.sh three
This program will print your selection!
your choice is three

那麼對談式的 case 又如何呢？嗯！我們利用上面的方式來修改一下內容囉！
[root @test test]# vi test10-case.sh
#!/bin/bash
# program: Using case mode
# Made by: VBird
# date: 2002/06/27
# content: I will use this program to study the case mode!
# 1. print this program
echo "Press your select one, two, three"
read number

case $number in
one)
echo "your choice is one"
;;
two)
echo "your choice is two"
;;
three)
echo "your choice is three"
;;
*)
echo "Usage {one|two|three}"
exit 1
esac
[root @test test]# sh test10-case.sh
Press your select one, two, three
two <=這一行是您輸入的呦！
your choice is two

如何！很簡單吧！以後對於 /etc/rc.d/init.d/ 裡頭的 script 就應該看的懂了吧！此外，由於還有所謂的『函數(function)』也就是『先將需要執行的程式段寫成一個小區塊，而這個小區塊則以一個名稱來取代之』，簡單的方式可以請您參考一下您系統中的 /etc/rc.d/init.d/sendmail ！注意看一下 start() 底下的那些個咚咚！你就可以知道什麼意思了！由於我們這裡並不教你如何寫程式（基本上， scripts 就是小程式啦！還好！ VBird 以前就有程式的底子！不然還真怕 script 呢！），所以就只好點到為止囉！

迴圈：for....do....done, while...do...done, until...do...done,
在程式段當中，最常使用到的就是迴圈了！迴圈是很重要的一項工具，尤其是具有判斷形式的迴圈，很常被使用來判斷一些事項的可行性與否！但是程式怎麼知道什麼時候應該要停止這個程式呢？呵呵！就需要加入判斷囉！好了，最簡單的判斷式可以是底下幾種：
  • for (( 條件一; 條件二; 條件三 ))
  • for variable in variable1 variable2 .....
  • while [ condition1 ] && { || } [ condition2 ] ...
  • until [ condition1 ] && { || } [ condition2 ] ...
for 是已經知道有多少個 run 了，即是已經知道要跑幾次了，至於 until 與 while 則分別是：
  • 『until：直到條件相同的時候才離開程式』；
  • 『while：當條件相同的時候，就繼續做！』
這兩者不太相同的啦！
好了！我們先來談一下最簡單的迴圈，就是利用 for 這個東西來進行！好了，假設我們計算 1 + 2 + 3 .... + 100 ，以 script 要如何寫呢？有很多的方式，我們來談一談 do...done 好了！
[test @test test]# vi test11-loop.sh
#!/bin/bash
# Using for and loop
# VBird 2002/06/27
declare -i s # <==變數宣告
for (( i=1; i<=100; i=i+1 ))
do
s=s+i
done
echo "The count is ==> $s"

[test @test test]# sh test11-loop.sh
The count is ==> 5050

請注意！ for (( 條件一; 條件二; 條件三)) 這是必須要的！

  • 條件一：這可以看成是『初始值』，如上面的例子中，初始值是 i=1 啦！
  • 條件二：這可以看成是『符合值』，如上面的例子中，當 i<=100 的時候都是符合條件的！
  • 條件三：這可以看成是『步階』！也就是說， i 每次都加一！
所以啦！上面的例子是說：由 i=1 開始到 i<= 100 ，每次 i 都加一來執行底下的程式段（就是 s=s+i ），當 i >100 （也就是 i=101 ）就跳出這一段程式段！怎樣！不難吧！
好了！那麼使用 while 或者是 until 要怎樣執行呢？其實都是差不多的情況！我們使用底下的兩個 script 來進行 1 ~ 100 的累加動作！
1. 使用 while ：
[test @test test]# vi test12-loop.sh
#!/bin/bash
# Using while and loop
# VBird 2002/06/27
declare -i i
declare -i s
while [ "$i" != "101" ]
do
s=s+i
i=i+1
done
echo "The count is ==> $s"

2. 使用 until ：
[test @test test]# vi test13-loop.sh
#!/bin/bash
# Using until and loop
# VBird 2002/06/27
declare -i i
declare -i s
until [ "$i" = "101" ]
do
s=s+i
i=i+1
done
echo "The count is ==> $s"

[test @test test]# sh test12-loop.sh
The count is ==> 5050

嘻嘻嘻嘻！很簡單吧！

第二個例子來自於網友 jony 的提供！這是另外一種迴圈的方式，可以用來判斷非數字的類型呦！
[test @test test]# vi test14-for.sh
#!/bin/bash
# using for...do ....done
# VBird 2002/06/27

LIST="Tomy Jony Mary Geoge"

for i in $LIST
do
echo $i
done

[test @test test]# sh test5.sh
Tomy
Jony
Mary
Geoge

這一種格式是以空白鍵當作 i 這個變數的選擇項目！也就是說，上面的 $LIST 這個變數當中，以空白鍵來分隔的時候，共可以分離出來四個！所以囉！當以 do ..... done ... 就可以分別寫出四個咚咚啦！好啦！那麼有沒有辦法利用這個東西來將你的 Linux 主機上的帳號 ( account ) 印出來呢？！很簡單呀！我們利用 cut 跟 sort 以及 /etc/passwd 這個檔案來完成這一支 script ，作法如下囉：
[test @test test]# vi test15-for.sh
#!/bin/bash
# Using for and loop to read the account of this linux server!
# VBird 2002/06/27
account=`cut -d ":" -f1 /etc/passwd|sort`
echo "The following is your linux server's account"

for i in $account
do
echo $i
done

[test @test test]# sh test15-for.sh
The following is your linux server's account
adm
aerosol
alenchan
amanda
apache
....

OK！再來，我們來使用一下對談式的迴圈作用吧！嗯！當我們輸入 y 或 Y 時，程式就予以結束！該怎樣做？！
[test @test test]# vi test16-loop.sh
#!/bin/bash
# Using until
# VBird 2002/06/27

echo "Press Y/y to stop"
until [ "$yn" = "Y" ] || [ "$yn" = "y" ]
do
read yn
done
echo "Stop here"

[test @test test]# sh test16-for.sh
Press Y/y to stop

GDSG
A
Y
Stop here

上面說的是，當輸入 Y 或者是 y 時才跳出 do...done 的迴圈之中！而去執行底下的東西！哈哈！很好玩吧！嗯！接著下來，我們來判斷一下目錄是否存在好了！這是常用的呦！

接下來我們判別一下所謂的『邏輯判斷式』的使用方式啦！剛剛我們不是已經知道了嗎，我們可以使用條件判斷來斷定到底有沒有檔案（用 -e ）或者是該名稱是屬於目錄或者是檔案（ -d -f ），接下來我們來判斷一個流程好了：
  1. 先查看一下 /root/test/logical 這個名稱是否存在；
  2. 若不存在，則建立一個檔案，使用 touch 來建立，建立完成後離開；
  3. 如果存在的話，判斷該名稱是否為檔案，若為檔案則將之刪除後建立一個檔案，檔名為 logical ，之後離開；
  4. 如果存在的話，而且該名稱為目錄，則移除此目錄！
看起來似乎很複雜，其實很簡單的啦！我們來試試看：
[test @test test]# vi test17-ifthen.sh
#!/bin/bash
# using if and then to select file or directory
# VBird 2002/06/27
if [ ! -e logical ]; then
touch logical
echo "Just make a file logical"
exit 1
elif [ -e logical ] && [ -f logical ]; then
rm logical
mkdir logical
echo "remove file ==> logical"
echo "and make directory logical"
exit 1
elif [ -e logical ] && [ -d logical ]; then
rm -rf logical
echo "remove directory ==> logical"
exit 1
else
echo "Does here have anything?"
fi

然後請你依序執行 sh test17-ifthen.sh ; ll 看看這個目錄底下 logical 那個檔案有什麼變化狀況！呵呵！瞭解了嗎？就是這麼簡單！這個動作可以讓我們很輕鬆的就判別到某個檔案的存在與否！嗯！不錯用！趕快來使用看看吧！

script 如何 debug ：
scripts 在執行之前，最怕的就是出現問題了！那麼我們如何 debug 呢？有沒有辦法不需要透過直接執行該 scripts 就可以來判斷是否有問題呢！？呵呵！當然是有的！我們就直接以 sh 來進行判斷吧！
[test @test test]# sh [-nvx] scripts
-n ：不要執行 scripts ，查詢 scripts 內的語法，若有錯誤則予以列出！
-v ：在執行 scripts 之前，先將 scripts 的內容顯示在螢幕上；
-x ：將有使用到的 scripts 內容顯示在螢幕上，與 -v 稍微不同！
[test @test test]# sh -n test01-hello.sh
[test @test test]# sh -v test01-hello.sh
#!/bin/bash
# This program will print the "Hello! How are you" in your monitor
# Date: 2002/06/27
# User: VBird
hello="Hello! How are you"
echo $hello
Hello! How are you
[test @test test]# sh -x test01-hello.sh
+ hello=Hello! How are you
+ echo 'Hello!' How are you
Hello! How are you

熟悉 sh 的用法，將可以使您在管理 Linux 的過程中得心應手！

對於 Shell scripts 的學習方法上面，需要『多看、多模仿、並加以修改成自己的樣式！』是最快的學習手段了！網路上有相當多的朋友在開發一些相當有用的 scripts ，若是您可以將對方的 scripts 拿來，並且改成適合自己主機的樣子！那麼學習的效果會是最快的呢！

本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )

2002/06/27：第一次完成
2003/02/10：重新編排與加入 FAQ
2002/06/27 以來統計人數


Linux 帳號與身份管理
最近更新日期：2003/02/10
帳號管理： groupadd, groupdel, useradd, userdel, chsh, chfn, userconf,
密碼管理與設定：passwd,
使用者身份切換： su, sudo, visudo,
使用者查詢： id, finger, groups,
手動增加使用者： 一般使用者帳號, 僅開放 POP (郵件)帳號
本章習題練習
帳號管理：
管理員的工作中，相當重要的一環就是『管理帳號』啦！因為整個系統都是你在管理的，並且所有的一般用戶的申請，都必須要透過你的協助才行！所以你就必須要瞭解一下如何管理好一個網站的帳號管理啦！在管理 Linux 主機的帳號時，我們必須先來瞭解一下 Linux 到底是如何辨別每一個使用者的！
  • 使用者的 ID 與群組的 ID ：
    其實 Linux 並不會直接認識你的『帳號名稱』，他認識的其實是你的『帳號 ID 』才是！如果你曾經以 tarball 安裝過軟體的話，那麼應該不難發現，在解壓縮之後的檔案，嘿?檔案擁有者竟然是『不明的數字』？奇怪吧？這沒什麼好奇怪的，因為 Linux 說實在話，他真的只認識代表你身份的號碼而已！而對應的號碼與帳號，則是記錄在 /etc/passwd 當中！
  • 怎樣登入 Linux 主機呀？
    好了，那麼我們再來談一談，到底我們是怎樣登入 Linux 主機的呢？其實也不難啦！當我們在主機前面或者是以 telnet 或者 ssh 登入主機時，系統會出現一個 login 的畫面讓你輸入帳號，這個時候當你輸入帳號與密碼之後， Linux 會：

    1. 先找尋 /etc/passwd 裡面是否有這個帳號？如果沒有則跳出，如果有的話則將該帳號對應的 UID ( User ID )與 GID ( Group ID )讀出來，另外，該帳號的家目錄與 shell 設定也一併讀出；
    2. 再來則是核對密碼表啦！這時 Linux 會進入 /etc/shadow 裡面找出對應的帳號與 UID，然後核對一下你剛剛輸入的密碼與裡頭的密碼是否相符？
    3. 如果一切都 OK 的話，就進入 Shell 控管的階段囉！
大致上的情況就像這樣，所以呢，當你要登入你的 Linux 主機的時候，那個 /etc/passwd 與 /etc/shadow 就必須要讓系統讀取啦，（這也是很多攻擊者會將特殊帳號寫到 /etc/passwd 裡頭去的緣故！）所以呢，如果你要備份 Linux 的系統的帳號的話，那麼這兩個檔案就一定需要備份才行呦！
  • 認識 UID、GID、SUID與SGID：
    還記得我們在『檔案系統與檔案屬性』那一篇文章的時候有提到每一個檔案都具有『擁有人與擁有群組』的屬性嗎？那麼檔案如何判別他的擁有者與群組呢？其實就是利用 UID 與 GID 啦！每一個檔案都會有所謂的擁有者 ID 與擁有群組 ID ，亦即是 UID 與 GID ，然後系統會依據 /etc/passwd 的內容，去將該檔案的擁有者與群組名稱，使用帳號的形式來秀出來！我們可以作個小實驗，你可以以 root 的身份 vi /etc/passwd ，然後將你的一般身份的使用者的 ID 隨便改一個號碼，然後再到你的一般身份的目錄下看看原先該帳號擁有的檔案，你會發現該檔案的擁有人變成了『數字了』呵呵！這樣可以理解了嗎？
    [root @test /root]# vi /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    test:x:500:500:test user:/home/test:/bin/bash <==將 500 改成 510
    [root @test /root]# cd /home/test
    [root @test test]# ll
    -rw-rw-r-- 1 500 test 12542 Apr 12 11:22 test
    看上面，擁有這變成了數字了∼

    瞭解了之後，請趕快回到 /etc/passwd 裡面，將數字改回來喔！

  • 認識 /etc/passwd 檔案與 /etc/shadow 檔案：
    由上面的說明您大概已經知道，嘿嘿！帳號管理最重要的兩個檔案就是『 /etc/passwd 與 /etc/shadow 』了！這兩個檔案可以說是 Linux 裡頭最重要的檔案之一了！如果沒有這兩個檔案的話，呵呵！您可是無法登入 Linux 的呦！

    • passwd 的構造：
      這個檔案的構造是這樣的：每一行都代表一個帳號，有幾行就代表有幾個帳號在你的系統中！不過需要特別留意的是，裡頭很多帳號本來就是系統中必須要的（例如 bin, daemon, adm, nobody 等等），請不要隨意的殺掉他??；
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin

      上面是 Mandrake 9.0 預設的幾個帳號，這些帳號是系統在使用的呦！我們先來看一下 root 這個系統管理員這一行好了，你可以明顯的看出來，每一行使用『:』分隔開，共有七個咚咚，分別是

      1. 帳號名稱：就是帳號名稱啦！對應 UID 用的！例如 root 就是預設的系統管理員的帳號名稱；

      2. 密碼：早期的 Unix 系統的密碼是放在這個檔案中的，不過由於這樣一來很容易造成資料的被竊取，所以後來就將資料給他改放到 /etc/shadow 中了，這一部份等一下再說，而這裡你會看到一個 x ，呵呵！別擔心密碼已經被移動到 shadow 這個加密過後的檔案囉；

      3. UID：這個就是使用者識別碼（ID）囉！通常 Linux 對於 UID 有幾個限制需要說給您瞭解一下：
        • 0 系統管理員，所以當你要作另一個系統管理員帳號時，你可以將該帳號的 UID 改成 0 即可；
        • 1~500 保留給系統使用的ID，其實 1~65534 之間的帳號並沒有不同，也就是除了 0 之外，其他的 UID 並沒有不一樣，預設 500 以下給系統作為保留帳號只是一個習慣。這樣的好處是，以 named 為例，這個程式的預設所有人 named 的帳號 UID 是 25 ，當有其他的帳號同樣是 25 時，很可能會造成系統的一些小問題！為了杜絕這樣的問題，建議保留 500 以前的 UID 給系統吧！
        • 500~65535 給一般使用者用的！
        上面這樣說明可以瞭解了嗎？是的， UID 為 0 的時候，就是 root 呦！所以請特別留意一下你的 /etc/passwd 檔案！

      4. GID：這個與 /etc/group 有關！其實 /etc/group 的觀念與 /etc/passwd 差不多，只是他是用來規範 group 的而已！

      5. 說明：這個欄位基本上並沒有什麼用途，只是用來解釋這個帳號的意義而已！不過，如果您提供使用 finger 的功能時，這個欄位可以提供很多的訊息呢！底下的 chfn 可以解釋一下囉！

      6. 家目錄：這是使用者的家目錄，以上面為例， root 的家目錄在 /root ，所以當 root 登入之後，馬上在的所在就是 /root 裡頭啦！呵呵！如果你有個帳號的使用空間特別的大，你想要將該帳號的家目錄移動到其他的硬碟去，沒有錯！可以在這裡進行修改呦！預設的使用者家目錄在 /home/yourIDname

      7. Shell ：所謂的 shell 是用來溝通人類下達的指令與硬體之間真正動作的界面！我們通常使用 /bin/bash 這個 shell 來進行指令的下達！關於 shell 的用法我們會在後面再提及的！這裡比較需要注意的是，有一個 shell 可以用來替代成讓帳號無法登入的指令！那就是 /bin/false 這個東西！這也可以用來製作純 pop 郵件帳號者的資料呢！
    • shadow 的構造：
      由於 /etc/passwd 並不安全，所以後來發展出將密碼移動到 /etc/shadow 這個檔案中分隔開來的技術！並且加入了很多的限制參數在 /etc/shadow 裡頭！我們來瞭解一下這個檔案的構造吧！
      root:$K.K2.hqu.QfV.dkjjteojiasdlkjeo:11661:0:99999:7:::
      bin:*:11661:0:99999:7:::
      daemon:*:11661:0:99999:7:::
      adm:*:11661:0:99999:7:::

      這是 shadow 的形式，也同樣的以『:』作為分隔的符號。數一數，共可以發現有九個欄位，分別給他說明如下：

      1. 帳號名稱：這個跟 passwd 需要對應！也就是跟 passwd 相同的意思啦！

      2. 密碼：這個才是真正的密碼，而且是經過編碼過的密碼啦！你只會看到有一些特殊符號的字母就是了！需要特別留意的是，雖然這些加密過的密碼很難被解出來，但是『很難』不等於『不會』，所以，這個檔案的預設屬性是『-rw-------』亦即只有 root 才可以讀寫就是了！你得隨時注意，不要不小心更動了這個檔案的屬性呢！另外，如果是在密碼欄的第一個字元為『 * 』表示這個帳號並不會被用來登入的意思。所以萬一哪一天你的某個使用者不乖時，可以先在這個檔案中，將他的密碼多加一個 * ！嘿嘿！他就無法使用該帳號囉！直到他變乖了，再給他啟用啊！

        注意事項：密碼忘記或者被更動了？

        有的時候會發生這樣的情況，就是說，你的 root 密碼忘記了！要怎麼辦？重新安裝嗎？另外，有的時候是被入侵了， root 的密碼被更動過，該如何是好？

        這個時候就必須要使用到 /etc/shadow 這個資料了！我們剛剛知道密碼是存在這個檔案中的，所以只要你能夠以軟碟開機，進入『單人維護系統』，那麼就可以不用輸入密碼來以 root 的身份登入（通常就是在 boot: 時輸入 linux single 就是了！）然後進入 /etc/shadow 這個檔案中，將 root 的密碼這一欄全部清空！然後再登入 Linux 一次，這個時候 root 將不需要密碼（有的時候需要輸入空白字元）就可以登入了！這個時候請趕快以 passwd 設定 root 密碼即可！

      3. 上次更動密碼的日期：這個欄位記錄了『更動密碼的那一天』的日期，不過，很奇怪呀！在我的例子中怎麼會是 11979 呢？呵呵，這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 ，而 1971 年 1 月 1 日則為 366 啦！所以這個日期是累加的呢！得注意一下這個資料呦！那麼最近的 2002 年 1 月 1 日就是 11689 啦，瞭解了嗎？

      4. 密碼不可被更動的天數：第四個欄位記錄了這個帳號的密碼需要經過幾天才可以被變更！如果是 0 的話，表示密碼隨時可以更動的意思。這的限制是為了怕密碼被某些人一改再改而設計的！如果設定為 20 天的話，那麼當你設定了密碼之後， 20 天之內都無法改變這個密碼呦！

      5. 密碼需要重新變更的天數：由於害怕密碼被某些『有心人士』竊取而危害到整個系統的安全，所以有了這個欄位的設計。你必須要在這個時間之內重新設定你的密碼，否則這個帳號將會暫時失效。而如果像上面的 99999 的話，那就表示，呵呵，密碼不需要重新輸入啦！不過，如果是為了安全性，最好可以設定一段時間之後，嚴格要求使用者變更密碼呢！

      6. 密碼需要變更期限前的警告期限：當帳號的密碼失效期限快要到的時候，系統會依據這個欄位的設定，發出『警告』言論給這個帳號，提醒他『再過 n 天你的密碼就要失效了，請盡快重新設定你的密碼呦！』，如上面的例子，則是密碼到期之前的 7 天之內，系統會警告該用戶。

      7. 帳號失效期限：如果用戶過了警告期限沒有重新輸入密碼，使得密碼失效了，而該用戶在這個欄位限定的時間內又沒有跟 root 反應，讓帳號重新啟用，那麼這個帳號將暫時的失效！

      8. 帳號取消日期：這個日期跟第三個欄位一樣，都是使用 1970 年以來的日期設定。這個欄位表示：這個帳號在此欄位規定的日期之後，將無法再使用。這個欄位會被使用通常應該是在『收費服務』的系統中，你可以規定一個日期讓該帳號不能再使用啦！

      9. 保留：最後一個欄位是保留的，看以後有沒有新功能加入。

      這個 /etc/shadow 是很重要的資料，千萬不能遺失也不能被 root 以外的人看到或修改！尤其是密碼欄，因為很早之前就已經發明了『暴力計算』密碼的程式，如果你的密碼被看過了，則別人可以利用該程式去演算出你的真實密碼，呵呵，到時候可就傷腦筋了！切記切記！
      這個 /etc/shadow 是很重要的資料，千萬不能遺失也不能被 root 以外的人看到或修改！尤其是密碼欄，因為很早之前就已經發明了『暴力計算』密碼的程式，如果你的密碼被看過了，則別人可以利用該程式去演算出你的真實密碼，呵呵，到時候可就傷腦筋了！切記切記！那麼什麼是 SUID 與 SGID 呢？前面有說過了！跟檔案屬性比較有相關， 點這裡 去看看吧！
  • 認識 /etc/group 與 /etc/gshadow 檔案：
    認識帳號與密碼是使用 /etc/passwd 與 /etc/shadow ，那麼認識 group 就是 /etc/group 與 /etc/gshadow 囉！OK！我們也來看看這兩個檔案的構造吧！
    • 認識 /etc/group
      這個檔案可以讓你直接將帳號所要支援的群組加進來！例如你有一個帳號名稱為 myaccount ，你想要讓這個帳號可以支援 root 這個群組，則你可以直接在 /etc/group 裡面加入呢！很方便，不需要動用的指令呦！
      root:x:0:root
      bin:x:1:root,bin,daemon
      daemon:x:2:root,bin,daemon
      sys:x:3:root,bin,adm
      adm:x:4:root,adm,daemon

      這個內容也說明如下：

      1. 群組名稱：就是群組名稱啦！
      2. 群組密碼：通常不需要設定，因為我們很少使用到群組登入！不過，同樣的，密碼也是被紀錄在 /etc/gshadow 當中囉！
      3. 群組 ID：就是所謂的 GID 啦！
      4. 支援的帳號名稱：這個群組裡面的所有的帳號，如上面所言，如果你想要讓 mysccount 也屬於 root 這個群組的話，那麼就將上面的第一行最後面加上 ,myaccount （不要有空格）使成為『root:x:0:root,myaccount』就可以啦。
    • /etc/gshadow 的構造：
      root:::root
      bin:::root,bin,daemon
      daemon:::root,bin,daemon
      sys:::root,bin,adm
      adm:::root,adm,daemon

      一般來說，group password 是用來讓那些不在 group 中的成員，臨時加入 group 用的，有興趣的話可以使用 man newgrp 瞭解一下他的用法！不過，因為牽涉到 "密碼"，不好管理，因此很少用。真想讓對方加入，不如將對方加入該群組，用密碼反而不方便。

  • 增加使用者的一般步驟：
    新增使用者的時候，如果該使用者所屬的群組不存在，則得(1)先新增群組；然後(2)再新增使用者帳號。當然，如果要刪除群組時，則必須要反過來，先刪除使用者才能刪除群組！這點請大家留意囉！
認識完了一些需要注意的東西之後，我們來研究一下如何以『指令』增加群組、使用者與變更密碼吧！在接下來的例子中，『您可以依照底下的案例直接下達指令去試看看！』實作是真的很重要的啦！
  • groupadd
    語法：
    [root @test /root ]# groupadd [-g GID] groupname
    參數說明：
    -g GID ：自行設定 GID 的大小
    範例：
    [root @test /root]# groupadd -g 55 testing<==設定一個群組，GID為 55
    說明：
    這個指令會增加群組呢！而作用到的檔案只有『/etc/group 與 /etc/gshadow』這兩個檔案，說實在的，你也可以直接修改這兩個檔案就好了，根本不需要使用到這個指令的！使用 vi 修改上面兩個檔案還比較簡單呢！另外，如果你要新增的使用者所要的群組並不存在於系統中，那麼您在增加使用者帳號之前，就必須要先新增群組囉！
  • groupdel
    語法：
    [root @test /root ]# groupdel groupname
    參數說明：
    範例：
    [root @test /root]# groupdel testing
    說明：
    這很簡單的，就是將 group ID 給他殺掉去！不過，有一點必須要特別留意，就是『在殺掉群組之前，請先將該群組的 primary 使用者刪除！』才好！那什麼是 Primary 的使用者呢？說穿了也很簡單啦！就是 /etc/passwd 裡面，那個 GID 設定為這個群組的 GID 的那個使用者就對啦！
  • useradd
    語法：
    [root @test /root ]# useradd [-u UID] [-g GID] [-d HOME] [-mM] [-s shell] username
    參數說明：
    -u ：直接給予一個 UID
    -g ：直接給予一個 GID （此 GID 必須已經存在於 /etc/group 當中）
    -d ：直接將他的家目錄指向已經存在的目錄（系統不會再建立）
    -M ：不建立家目錄
    -s ：定義其使用的 shell
    範例：
    [root @test /root]# useradd testing <==直接以預設的資料建立一個名為 testing 的帳號
    [root @test /root]# useradd -u 720 -g 100 -M -s /bin/bash testing <==以自己的設定建立帳號
    說明：
    這個指令能夠變更的檔案可多了！包括了底下的各個檔案：

    • /etc/passwd
    • /etc/shadow
    • /etc/group
    • /etc/gshadow
    • /etc/skel
    • /etc/default/useradd
    • /etc/login.defs
    建立預設的帳號：
    建立帳號的時候，如果沒有特殊的設定，通常我們只使用『 useradd username 』就可以建立一個名為 username 的帳號了！不過你知道預設的帳號的基本設定嗎？嘿嘿嘿嘿！基本設定就在 /etc/login.defs 與 /etc/default/useradd 這兩個檔案中！在 login.defs 裡頭有點像底下這樣：
    MAIL_DIR /var/spool/mail <==郵件預設目錄擺放處
    PASS_MAX_DAYS 99999 <==密碼需要變更的時間
    PASS_MIN_DAYS 0 <==密碼多久需要變更
    PASS_MIN_LEN 5 <==密碼的最小長度（這個可以改大一些吧！）
    PASS_WARN_AGE 7 <==密碼快要失效之前幾天發警告訊息？
    UID_MIN 500 <==預設帳號最小起算的 UID 數目（最小為 500 ）
    UID_MAX 60000 <==最大的 UID 限制
    GID_MIN 500 <==GID 限制
    GID_MAX 60000 <==GID 限制
    CREATE_HOME yes <==是否建立家目錄，預設是要建立家目錄（若為 mail server 可以取消此項目）
    幾乎可以設定的都在這裡設定了！所以需要瞭解一下這個檔案！另外，如果你是專門開啟 mail server 的，那麼由於使用者帳號不需要登入主機，所以也就不需要給予家目錄，這個時候最後一項 GREATE_HOME 或者可以設定為 no ！此外，當你以預設的資料建立帳號時，該帳號的 UID 將會取目前在 /etc/passwd 當中『最大的（其實是小於 60000）』那一個 UID + 1 即是預設帳號的 UID 囉！
    而至於 useradd 內容則為：
    GROUP=100 <==預設的使用者群組為 100 ，查看一下 /etc/group 時，這個群組名稱為 users 呢！
    HOME=/home <==預設使用者的家目錄建立的目錄
    INACTIVE=-1 <==是否不啟動，設定為 -1 自然就是啟動啦！
    EXPIRE= <==是否需要設定『死亡』時間？如果你希望該用戶在期限到之後就不許登入，此項可以設定天數。
    SHELL=/bin/bash <==預設的 Shell 為何？
    SKEL=/etc/skel <==使用者家目錄的內容！
    在這個項目中，最需要瞭解的就是 SKEL 啦！當你建立一個名為 testing 的帳號時，預設的家目錄會是『 /home/testing 』這個目錄，而這個目錄的內容就是由 /etc/skel 所 copy 過去的！所以『當你想要讓使用者的預設家目錄內容更動時，可以直接將要更動的資料寫在 /etc/skel 當中！』
      以自己的條件建立帳號：
      如果要以自己的條件建立帳號的時候，一般我都是喜歡手動的增加啦！不然就是先以上面的那一個例子增加一個帳號之後，在去手動修改 /etc/passwd 等等的檔案！
  • userdel
    語法：
    [root @test /root ]# userdel [-r] username
    參數說明：
    -r ：將該帳號的[home directory]與[/var/spool/mail/username]一併刪除！
    範例：
    [root @test /root]# userdel testing <==只有砍掉 /etc/passwd 與 /etc/shadow 的該帳號內容；
    [root @test /root]# userdel -r testing<==連該帳號的 /home/testing 與 /var/spool/mail/testing 都砍掉！
    說明：
    這個指令下達的時候要小心了！通常我們要移除一個帳號的時候，你可以手動的將 /etc/passwd 與 /etc/shadow 裡頭的該帳號取消即可！一般而言，如果該帳號只是『暫時不啟用』的話，那麼將 /etc/shadow 裡頭最後倒數一個欄位設定為 0 就可以讓該帳號無法使用，但是所有跟該帳號相關的資料都會留下來！使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何資料了！』
  • chsh
    語法：
    [root @test /root ]# chsh [-l] [-s shellname]
    參數說明：
    -l ：列出目前這部機器上面的能用的 shell 名稱
    -s ：改變目前的 shell 成為 shellname
    範例：
    [test @test /root]# chsh -l <==列出本機上所有能用的 shell 名稱
    /bin/sh
    /bin/bash
    /bin/ash
    /bin/bsh
    /bin/csh
    [test @test /root]# chsh -s /bin/csh <==test 這個用戶自行改變自己的預設 shell
    說明：
    這是用來改變使用者自己的 shell 的指令！要注意呦，由於這個檔案能夠改變 /etc/passwd 的內容，所以他的預設屬性就有 SUID 的屬性了！通常 VBird 也都不會使用這個指令，因為直接改 /etc/passwd 就可以啦！
  • chfn
    語法：
    [root @test /root ]# chfn
    參數說明：
    範例：
    [test@test test]$ chfn
    Changing finger information for test.
    Password: <==這裡輸入新的密碼
    Name [Testing]: Testing <==這裡輸入你要顯示的『暱稱』
    Office []:
    Office Phone []:
    Home Phone []:
    Finger information changed.
    說明：
    這個指令說實在的，除非是你的主機有很多的用戶，否則倒真是用不著這個程式！這就有點像是 bbs 裡頭更改你『個人屬性』的那一個資料啦！這個程式主要都是搭配 finger 這支程式在運作的！不過，由於 finger 這支程式不是很安全，所以預設是沒有安裝他的！如果您想要玩一下 finger 的話，那麼請先參考 RPM 套件安裝內容後，在安裝 finger 的 RPM 檔案，然後再來玩吧！底下這裡鳥哥還是先簡單的介紹一下就好了！
    使用 chfn 這個指令之後，程式會要求您輸入許多的資訊，包含了：
    密碼
    暱稱
    辦公室號碼
    辦公室電話
    家裡電話
    這幾個咚咚給他設定好之後，你的 /etc/passwd 會變成怎樣呢？我們以管線命令，配合正規表示法，捉出 test 這個人的資訊如下：
    [root @test root]# more /etc/passwd | grep test
    test:x:501:501:Testing user,06-123-1234,06-123-1234,06-123-1234:/home/test:/bin/bash
    嘿嘿！多出了一些逗點分隔在第三欄囉！那個就是 chfn 改的資訊囉！只有改這個地方就是了！所以你也可以自行修改呢！那麼再來你可以使用 finger test 來看一下 test 這個人的基本資訊！
  • userconf
    不論怎麼說，以 useradd 與 groupadd 這兩個指令來增加群組與帳號總是不太方便！那麼有沒有比較類圖形界面的方式可以來新增使用者呢？哈哈！當然有，在 Mandrake 與 Red Hat 當中那就是使用 userconf 就可以啦！假設您已經安裝了 Linuxconf 這個套件，所以自然也就含有 userconf 這個咚咚！因此，直接以 root 的身份在指令列模式輸入 userconf 就會出現下圖：

    在這個畫面中，目前我們所要使用到的功能只有：
    • User accounts
    • Group definitions
    • Change root password
    當然，其實我們關心的只有 User accounts 這一項囉！在操作上，使用『上下鍵』移動反白的線條，而使用『Tab』鍵來使游標移動到底下的 Quit 及 Help 按鈕！底下我們提一提在帳號管理方面，最常使用的兩個功能，分別是『已存在帳號的修正與管理』，及『新增帳號！』
    • 察看已存在帳號的內容、修正與管理：
      在上圖當中，以上下按鍵移動游標到 User accounts 部分上去，然後按下 Enter 吧！會顯示如下的畫面：

      在上面這個畫面當中，我們可以發現到每一個有用的帳號都在上頭，而他的主要資訊也都列示在上頭了！當然啦，這些資訊『全部都在 /etc/passwd 裡面！』沒錯！所以你只要知道 passwd 這個檔案裡面的代表意義，這裡就很容易瞭解他的意思啦！好了，假設我要修改 test 這個已經存在的使用者資訊，那麼就直接將游標移動到 test 上面，然後按下 Enter 鍵，會出現如下的圖示：

      您會發現到你的游標是在右邊的 Base info 裡面，你可以移動游標，並且去修改他呢！例如你要修改 group 的話，就直接移動到 users 上面去，修修改改即可！同樣的， HOME( 家目錄 )與 shell ( 就是 Command interpreter 那一欄 )的修改都是直接移動游標再來修訂即可！這個應該不難啦！不過，如果要修改密碼呢？那麼你就必需使用 <Tab> 按鍵，移動到 Passwd 那個按鈕上面，按下他之後，就可以設定密碼了！

      修改完畢之後，會回到帳號圖示的畫面，這個時候您可以繼續的觀察其他的帳號呢！
    • 新增帳號：
      再來則是新增帳號的部分！在帳號圖示畫面中按兩下『Tab』 鍵將游標移動至 Add 這一項，按 Enter，會出現：

      在這個畫面中，你所需要輸入的其實只有 Login name 就可以了，其他的東西系統會自動幫你設定（有 (opt) 的都是系統會自行依照 /etc/login.defs 與 /etc/defaults/useradd 的內容自行加以設定的！）。不過，如果你需要將使用者分門別類的話，最好還是設定一下比較好！咦！什麼叫做分門別類？以我為例，我們單位的主機有分對自己研究室的成員還有外面的朋友開放帳號服務，由於對外的帳號僅提供 mail 的服務，而自己的研究室成員則包含了所有主機上面可以進行的工作！為了防止未來不當的管理，對於兩邊的人員的身份管制( 最簡單的方法就是以 UID 或 Group 來分辨 )就顯的重要的多了！好了！那麼什麼東西在 userconf 這支程式裡面需要特別瞭解一下的呢？

      1. Login name：輸入要新增的使用者的帳號（就是 ID 啦），盡量不要使用大寫字元啦！；
      2. Full name ：這是這個帳號的使用者全名，這個地方是可有可無的，不會影響！
      3. group ：用來指定這一個 ID 的所屬群組，通常鳥哥都會將在我機器上的使用者分成幾各類別，而分別給予不同的群組，好方便管控！
      4. Supplementary groups：除了主要的群組之外，Linux 還提供你其他的支援群組！不過通常不用設定就可以了。如果設定的話，修改的檔案其實就是 /etc/group 囉；
      5. Home directory(opt) ：這是用來設定這個帳號使用者的家目錄。通常如果不設定的話，預設的使用者家目錄都在 /home/userID ，但是當你的硬碟容量不夠大的時候，或者想將某人移動到某一個目錄的話，就可以直接在這邊改一改囉！
      6. Command interpreter(opt) ：這是使用者預設的 Shell ，通常在 Linux 下，我們都使用 BASH ，所以不用改啦；
      7. User ID(opt) ：注意喔，這個 ID 可不是前面的 login 的 ID ，這個 ID 是前面說的 Uid 編號，你可以自己設定一個大於 500 且不與其他帳號重複的 ID，也可以交由系統自動設定；

      OK！設定完成之後，按下 『Tab』 鍵，選擇 Accept 按 Enter，這時會出現要你輸入密碼的畫面，就如同上圖 13-1-4 。請輸入這個帳號所想要的密碼。請注意，通常密碼的限制是：

      • 密碼不能與帳號相同；
      • 密碼盡量不要選用字典裡面會出現的字串；
      • 密碼需要超過 8 個字元；

      這是主要的限制，不過，由於你是『權力無限大的管理員』，所以密碼的形式是『不限的』（雖然沒有照規矩來時，在設定中會出現一些錯誤訊息，不過並不會影響你的設定！）。輸入完畢之後會出現在輸入一次的畫面，再次輸入一次密碼之後，那就新增完成了！

      基本上， userconf 的功能是很多啦！但是，他也只是將我們的 /etc/passwd 這個檔案進行圖表顯是的樣子而已！並沒有什麼新奇的事物呢！所以囉，如果你已經很熟悉該檔案了，那麼根本使用 vi 也就可以啦！ Userconf 還用不上呢！
    • 密碼管理與設定：
    再來跟大家提一提那個重要的密碼概念！您得要特別留意的是，今天，您的主機若是遭到入侵，對方的第一個入侵點自然就是您主機上面帳號的『密碼』了，所以，如果您的密碼定義的比較嚴格的話，那麼自然對方就不容易猜到你的密碼，自然就會比較有保障啦！

    目前一些 Cracker 較常使用的密碼破解軟體，大抵是『字典攻擊法』及所謂的『暴力攻擊法』，就字面上的意義來說，『字典攻擊法』是將字典裡面所查的到的任何單字或片語都輸入的程式中，然後使用該程式一個一個的去嘗試破解你的密碼，不要覺得這樣的速度似乎很慢，實際上，現今的電腦運算速度太高了，字典攻擊法的操作效率基本上是很高的！另一個『暴力攻擊法』就是直接使用鍵盤上面任何可以使用的按鍵，然後依照組合，以 1 個, 2 個, 3 個…. 密碼組合的方式去破解你的密碼！這個方式就真的比較慢一點，如果你的密碼組合是 6~8 個字元以上，那麼暴力攻擊法還是需要好長一段時間才能夠破解的了的！

    由上面的『字典攻擊法』與『暴力攻擊法』猜測你的密碼的方式來說，您知道如何設定一個好的密碼了嗎？是的，您的密碼最好需要底下幾個特性：
    • 密碼中含有數個特殊字元，例如 $#@^&* 及數字鍵等等：如同上面提到的，您的按鍵越奇怪，那麼對方就越不容易使用既有的軟體來破解！
    • 英文字母大小寫混合使用；
    • 密碼長度至少要到 6 ~ 8 個以上才好；
    • 沒有特殊意義的字母或數字組合，並且夾著很多的特殊字元！
    這種密碼真的很不容易被破解，但是很不幸的，也很容易被你我忘記??所以呢，建議您常常使用一些對別人來說是沒有意義，但是對您確有特殊涵意的字眼！例如我常常提到的，我愛我老婆！『 I&Mywife*^』之類的密碼！不容易被猜，也挺容易被你自己記住的！那麼有沒有『很要命的密碼』呢？有的，底下幾種密碼就很要命：
    • 常用的英文單字：例如 party, park, andyliu, linux, paper 等等，都不好！容易被字典攻擊法破解！
    • 身邊人物的名字，例如配偶、小孩的名字等等， Tom, andy, eric 等等，都不好！
    • 單純的日期：例如您的生日啦！等等的，都不夠好！
    • 任何與您相關的數字或其他資訊，例如身份證號、銀行帳號等；
    VBird 曾經見過直接以帳號做為密碼的狀況！真是要命??太好猜了?

    好了！知道了密碼的重要性，與基本的設定之後，接著下來我們談一談如何手動設定密碼吧！基本上， root 可以設定『任何樣式的密碼』，而且， root 也可以幫助 user 訂定他們的密碼！至於 user 僅能修改自己的密碼！那麼修改密碼使用什麼命令？就是 passwd 這個命令啦！咦！這裡突然給他想到幾個重要資訊，大家趕緊複習一下：
    • 如何尋找 passwd 這個指令？
      使用 which passwd 即可
    • 如何察看 passwd 這個檔案的屬性？並請說明他的屬性為何？
      使用 ls –l `which passwd` 即可！他具有 SUID 的屬性！
    • 什麼是 SUID ？
      就是該程式在被執行的過程中，具有程式擁有者的權限！
    • 我該如何查詢 /etc/passwd 與 /usr/bin/passwd 的用法與架構？
      分別使用 man passwd 及 man 5 passwd
    這些指令與意義如果都還沒有忘記！恭喜您了！真是不錯！好了，還記得我們密碼放在哪裡嗎？對啦！就是 /etc/shadow 裡面，那個檔案的權限是 –rw------- 所以只有 root 可以修改，因此， passwd 必需要具有 SUID 才能讓一般使用者修改他們的密碼囉！
  • passwd
    語法：
    [root @test /root]# passwd [username]
    [test @test /root]# passwd
    [root @test /root]# passwd test
    Changing password for user test
    New password: <==輸入密碼
    BAD PASSWORD: it is based on a dictionary word
    Retype new password: <==再輸入一次！
    passwd: all authentication tokens updated successfully
    說明：
    這個指令可以修改使用者的密碼！要注意的是，這個指令在 /bin/passwd 中，而帳號所存放的地方在 /etc/passwd 中，是不一樣的呦！搞清楚呦！
    • 一般使用者的用法是直接輸入 passwd 即可；
    • root 可以使用 passwd [username] 來替 username 這個帳號取一個新的密碼！
    • 使用者身份切換：
    這裡有個很有趣的問題要來跟大家分享一下，還記得在古老的年代裡面，還沒有 ssh 的時候，我們都是使用 telnet 登入系統的，偏偏系統預設是不開啟 root 以 telnet 登入，那麼好了！我們要怎樣遠端操控我們的 Linux 主機呀！？因為由前面的介紹我們不難發現，系統當中最特殊的帳號就是 UID 為 0 的使用者了，他具有至高無上的權力！而且是系統管理員必須要具備的身份，否則怎樣操控主機呢？您說是吧！好了，那麼 telnet 將 root 的登入權限關掉了，而如果我們在製作一個使用者，並將其 UID 變為 0 的話又如何？嘿嘿！很抱歉， telnet 就是認 UID 的，所以肯定還是進不了系統，這個時候要怎麼辦呀！？就是變換身份呀！將一般使用者的身份變成了 root 就行了！

    但是怎樣變換身份呀？怎麼說呢？就是說，一般而言，我們都不希望以 root 的身份登入主機，以避免被怪客入侵了！但是一部主機又不可能完全不進行修補或者是設定等動作！這個時候要如何將一般使用者的身份變成 root 呢？主要有兩種方式，分別是：
    • 以 su 直接將身份變成 root 即可，但是這個指令卻需要 root 的密碼，也就是說，如果你要以 su 變成 root 的話，你的一般使用者就必須要有 root 的密碼才行；
    • 所以當有很多人同時管理一部主機的時候，那麼 root 的密碼不就很多人知道了？不是很好吧?所以，如果不想要將 root 的密碼流出去呢？呵呵！可以使用 sudo 來進行工作呦！
    底下我們就來說一說 su 跟 sudo 的用法啦！
  • su
    語法：
    [root @test /root ]# su
    參數說明：
    範例：
    [test@test test]$ su
    Password: <==輸入 root 的密碼
    [root@test test]# <==身份變成 root 了！
    [test@test test]$ su - <==連環境參數檔案都是讀取 root 的！
    [root@test root]# su test <==將 root 的身份改為 test ，且不需要輸入密碼喔！
    說明：
    這個指令很有用呦！這是用來將『一般身份轉換成 super user 』的指令！通常為了安全的考量， telnet 與 ssh 盡量不要以 root 的身份來登入！但是有時後我們又要在外頭以 root 的身份來修改系統設定，這個時候 su 就很有用了！su 的使用真的很簡單，輸入 su 之後，直接給他輸入 root 的密碼，此時您就是 root 了！但是需要特別留意的是：
    • 雖然您已經是 root 的身份，但是您的環境當中，還是屬於當初登入的那個使用者！例如我以 test 登入 Linux ，再以 su 切換身份成為 root ，但是我的 mail, PATH 及其他一些相關的環境變數，都還是 test 這個身份呢！
    • 至於環境變數當中，最麻煩的當屬 PATH 這個東西，因為為了避免一般使用者使用了 root 的管理指令，所以通常 Linux 都會將指令分類放在兩個主要的目錄，分別是 /bin 與 /sbin ！那個 /sbin 大多是 super user 就是 root 用來管理系統的指令啦！所以，可能的話，將 test 的 PATH 重新設定成為 root 的 PATH ，這樣也比較方便呀！
    • 如果要全部的環境變數均使用 root 的設定檔，這個時候必需使用『 su - 』來下達命令喔！
    此外， su 也可以將您的身份轉換成為其他身份的使用者，而，如果您是 root ，那麼轉換為其他身份的使用者，將不需要輸入密碼喔！很過癮吧！例如上面的最後一個例子！
  • sudo
    語法：
    [root @test /root ]# sudo [-u username] [command]
    參數說明：
    -u ：將身份變成 username 的身份
    範例：
    [test@test test]$ sudo mkdir /root/testing
    Password: <==輸入 test 自己的密碼
    [root@test test]$ sudo -u test touch test <==root 可以執行 test 這個使用者的指令，建立 test 的檔案！
    說明：
    • 如果單純的使用 su 來變換成 root 的身份，最大的好處是可以直接下達我們慣用的指令，但是，還是會有問題的，就是如果主機是由多人共管的時候，由於所有的人都必須要知道 root 的密碼，如此一來，呵呵！很麻煩的啦！因為怕被入侵嘛！而且只要 root 改變了密碼，那麼所有人都必需要通知一次！很麻煩，加上，如果管理群中的一個人不小心洩出了 root 的密碼，不就完蛋了??那麼有沒有可以不需要 root 的密碼，卻還是可以執行 root 的工具呢？呵呵！這個時候就有 sudo 的出現了！
    • sudo 的基本語法就是在 sudo 後頭直接加上指令，例如上面的例子中， mkdir /root/testing 就是命令啦！那麼就可以來執行 root 身份可以動作的事情！此外，由於執行 root 身份的工作時，『輸入的密碼是使用者的密碼，而不是 root 的密碼，所以可以減少 root 密碼外流的問題！』如此 root 的密碼將不會流出去了！但是 sudo 在使用的時候請小心，就是要在 /etc/sudoers 裡頭設定該有的事項！在預設情況下，只有 root 才能使用 sudo ！那有什麼用！我們是一般使用者，想要使用的是 sudo 來變成 root 的身份呀！呵呵！沒關係！可以使用 visudo 來編輯 /etc/sudoers 這個檔案即可！在 Mandrake 9.0 與 Red Hat 的 Linux 版本之的預設情況中，使用『 visudo 』才能編輯 /etc/sudoers 這個檔案，此外，編輯者的身份必須要 root 才行！如何編輯呢？在預設的情況中，我們會希望將可以執行 root 動作的人的 group 設定為 wheel ，然後：

      [root@est /root]# visudo
      # sudoers file.
      #
      # This file MUST be edited with the 'visudo' command as root.
      #
      # See the sudoers man page for the details on how to write a sudoers file.
      #
      # Host alias specification
      # User alias specification
      # Cmnd alias specification
      # Defaults specification
      # User privilege specification
      root ALL=(ALL) ALL
      test ALL=(ALL) ALL <==這一行可以加入，使 test 這個人可以使用 sudo
      # Uncomment to allow people in group wheel to run all commands
      # %wheel ALL=(ALL) ALL <==將這一行註解符號取消
      # Same thing without a password
      # %wheel ALL=(ALL) NOPASSWD: ALL
      # Samples
      # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
      # %users localhost=/sbin/shutdown -h now

      如果如同上面的方式，將黃色字體那一行 /etc/sudoers 裡頭將

        『 # %wheel ALL=(ALL) ALL』

      這一行的註解符號取消，如此一來，則群組為 wheel 的人就可以進行 root 的身份工作！這個 wheel 是系統預設的 group 呢！因此，如果您想要讓這部主機裡頭的一般身份使用者具有 sudo 的使用權限，那麼您就必需將該 user 放入支援 wheel 這個群組裡頭！如何加入？呵呵！剛剛上面不是介紹了 /etc/group 嗎？趕緊去看看！那麼萬一我想要讓『單獨的個人可以使用 sudo 的功能』呢？呵呵！那就直接以 visudo 加上這一行

        『test ALL=(ALL) ALL』

      即可！那麼 test 即可使用 sudo 的功能囉！很簡單吧！但是請記得不要以 vi 直接修改 sudoers 呦！會有問題！
    • sudo 除了變成 root 的功能之外！嘿嘿！他還可以變成『任何人』的功能呦！舉個簡單的例子來說好了，我們都知道啟動程序的時候最好不要使用 root 來啟動，因為如此一來當該程序被接管時，接管者（或者說是入侵者）將擁有 root 的權限了！所以近來我們都希望不要以 root 來啟動一些程序啦！會比較安全！那麼我們要以 root 來啟動成為 test （例如常用的 nobody 這個帳號）要如何作？很簡單，就使用上面的第二個例子來看：

        sudo -u test touch test

      root 可以改變身份成為 test 來建立檔案！嘿嘿！還不需要輸入密碼！很棒吧！這個動作我曾經在 squid 這個執行程序上面做過，這樣一來，即使我的 squid 被利用了，那麼該怪客只能擁有 nobody 的權限，嘿嘿！該權限是很小很小的！所以可以達到保護主機的部分功能呦！
    • 使用者查詢：
    好了，知道了 UID，GID 以及與帳號有關的一些資訊之後，我們要來瞧瞧，那麼如何知道哪一個使用者的 UID 與 GID ，以及他們所能夠提供的支援的群組呢？可能的話，當然可以直接到 /etc/passwd 及 /etc/group 裡面去查看囉！但是還有更簡單的方法呢，那就是使用簡單的指令工具呀！有哪些簡便的工具呢？就是底下這幾個：
    • id 查詢使用者的 UID, GID 及所擁有的群組；
    • groups 查詢使用者能夠支援的群組；
    • finger 查詢使用者的一些相關訊息，例如電話號碼等。
    • id
      語法：
      [root @test root]# id [username]
      範例：
      [root @test root]# id
      uid=0(root) gid=0(root) groups=0(root)
      [root @test root]# id test
      uid=501(test) gid=501(test) groups=501(test)
      說明：
      直接輸入 id 就可以知道目前這個帳號的 UID, GID 與所屬的群組！當然囉，如果想要知道某個使用者的相關資訊，就直接使用 id username ，例如 id test 就可以知道 test 這個使用者的相關資訊囉！很方便吧！不需要去查看 /etc/passwd 及 /etc/group ！

    • finger
      語法：
      [root @test root]# finger [-s] username
      參數說明：
      -s ：長的列出
      範例：
      [root @test root]# finger test
      Login: test Name: Testing user
      Directory: /home/test Shell: /bin/bash
      Office: 06-123-1234, 06-123-1234 Home Phone: 06-123-1234
      Never logged in.
      No mail.
      No Plan.

      [root @test root]# finger –s test
      Login Name Tty Idle Login Time Office Office Phone
      test Testing user * * No logins 06-123-123 06-123-1234

      說明：
      finger 的用法也是真的很簡單，就是直接給他 finger username 就可以知道任何一個人的相關資訊了！而這個相關的訊息基本上都是寫在 /etc/passwd 裡面，當然，裡面還搜尋了 /var/spool/mail 這個郵件放置的地點，所以還會顯示出是否有郵件的訊息呢！相當的方便吧！不過，這個 finger 通常必需要配合 chfn 這個指令，亦即是 13-1-6 的內容提到的那個指令，才能夠顯示出比較多的資訊呢！另外，其實 finger 不是個很安全的指令，因此， Mandrake 系統預設是不安裝這個套件的！如果您想要試試看 finger 的話，那麼請依照第二篇教導的內容，將 Mandrake 安裝光碟第二塊放入 CDROM 當中，然後 mount cdrom 之後呢，再以『 rpm –ivh finger* 』來安裝 finger 吧！至於 rpm 的用法，我們會在第十八章的時候在進行說明呦！

    • groups
      直接輸入 groups 就可以顯示出目前的使用者的所屬群組了！包含了 Primary 與其他相關的群組都會被顯示出來呢！
    手動增加使用者：
    好了，那麼我們已經知道如何新增帳號與刪除甚至是修改帳號了，呵呵！是否從此之後，天下太平呢？當然不是了！為什麼呢？假設您今天要新增帳號的內容是『數字帳號』的話，那麼是否可以使用 useradd 新增帳號呢？例如：
    useradd 1234567
    很抱歉?useradd 並不允許這樣的帳號設定的！唉?真難過，難道沒有其他的方法可以新增這樣的使用者帳號了嗎？咦！剛剛不是說過，其實我們都是使用 /etc/passwd 及 /etc/shadow 這幾個檔案來設定帳號的嗎？那麼使用手動的方式是否就可以解決這樣的困擾了！Bingo ！沒錯！就是這樣！所以底下我們嘗試使用手動的方式來新增帳號，試試看能不能成功的增加一個使用者 1234 呢？
    • 一般使用者帳號的增加：
      好了，現在我們知道其實使用 userconf 、 useradd 與 groupadd 其實會用到的檔案最鮮明的就是 /etc/passwd 與 /etc/shadow 囉！那麼如何手動的增加一個使用者呢？最大的困擾在於 passwd 與 shadow 的同步啦！OK！大致的步驟可以這樣說：
      1. 先建立所需要的群組（ vi /etc/group ）
      2. 建立帳號的各個屬性（ vi /etc/passwd ）
      3. 將 passwd 與 shadow 同步化 （ pwconv ）
      4. 建立該帳號的密碼 （ passwd acount ）
      5. 建立使用者家目錄 （ cp -r /etc/skel /home/account ）
      6. 更改家目錄屬性 （ chown -R account.group /home/account ）
      這樣就 OK 啦！實地的來新增一個 test 群組與帳號來試試看：
      建立新的群組 test ，設其 GID 為 520
      [root @test /root ]# vi /etc/group
      ----略
      test:x:520:test <==新增群組，且群組的人為 test ，GID 為 520

      建立 test 的各個屬性
      [root @test /root ]# vi /etc/passwd
      ----略
      test:x:520:520:testing account:/home/test:/bin/bash <==建立各個屬性

      同步化 /etc/passwd 與 /etc/shadow
      [root @test /root ]# pwconv <==將 passwd 的資料轉入 /etc/shadow 中！

      建立密碼
      [root @test /root ]# passwd test <==建立使用者 test 密碼
      Changing password for user test
      New password:
      Retype new password:
      passwd: all authentication tokens updated successfully

      建立家目錄並轉化家目錄的擁有者
      [root @test /root ]# cp -r /etc/skel /home/test
      [root @test /root ]# chown -R test:test /home/test

      這樣就建立完畢囉！！很簡單吧！而由上面的例子，其實您也可以依據此而使用 scripts 來新增使用者，詳細的步驟等以後 VBird 真的開發出來了，再來跟大家報告。（如果沒記錯的話，目前很多網頁都已經有提供相關的大量建立帳號的方式了！）

    • POP3 郵件帳號的增加：
      好啦！如果我是一個郵件主機，我不要使用者使用 ftp, telnet, ssh 的話，只允許對方使用 POP3 而已，該怎麼辦？呵呵！其實也是很簡單的，除了 userconf 可以進行之外，你也可以手動達到此一目的呦！
      基本上的原理是這樣的：
      • 由於不需要讓這個帳號由其他的服務登入主機，所以在 shell 的地方則改成了 /bin/false 囉！
      • 由於不需要這個帳號的登入，所以家目錄也可以不用建立！！
      所以整個建立的步驟就可以簡化為：
      1. 建立帳號的各個屬性（ vi /etc/passwd ）
      2. 將 passwd 與 shadow 同步化 （ pwconv ）
      3. 建立該帳號的密碼 （ passwd acount ）
      這樣就可以啦！我們實地的來建立一個名為 poptest 的帳號試試看：
      建立帳號 poptest
      [root @test /root ]# vi /etc/passwd
      ---略
      poptest:x:530:45:testing pop account:/home/poptest:/bin/false<==家目錄先設定也沒關係！
      注意：群組必需要先存在，通常不知道什麼 group 好的時候，可以直接使用 100 這個預設的 group 來替代！而 shell 則需要為 /bin/false 才行！

      同步化 passwd 與 shadow
      [root @test /root ]# pwconv

      建立密碼
      [root @test /root ]# passwd poptest
      Changing password for user poptest
      New password:
      Retype new password:
      passwd: all authentication tokens updated successfully

      很簡單吧！這樣就建立好 poptest 這一個郵件 POP3 的帳號了！這個帳號將僅可以使用 pop3 與 smtp 來收發信件呢！！
      那麼如何砍到剛剛建立的帳號呢？很簡單的啦！
      1. 就是將 /etc/passwd 與 /etc/shadow 裡面的相關資訊都殺掉，
      2. 然後再到 /home 底下去將該 account 的家目錄整個殺掉就是了！
      3. 此外，你也需要到 /var/spool/mail 底下去殺掉該帳號的郵件呦！
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • root 的 UID 與 GID 是多少？而基於這個理由，我要讓 test 這個帳號具有 root 的權限，應該怎麼作？
      答：
        root 的 UID 與 GID 均為 0 ，所以要讓 test 變成 root 的權限，那麼就將 /etc/passwd 裡面， test 的 UID 與 GID 欄位變成 0 即可！

    • 假設我是一個系統管理員，我有一個用戶最近不乖，所以我想暫時將他的帳號停掉，讓他近期無法進行任何動作，等到未來他乖一點之後，我再將他的帳號啟用，請問：我可以怎麼作比較好？？
      答：
        由於這個帳號是暫時失效的，所以不能使用 userdel 來刪除，否則很麻煩！那麼應該如何設定呢？再回去瞧一瞧 /etc/shadow 的架構，可以知道有這幾個可使用的方法：
        • 將 /etc/passwd 的 shell 欄位寫成 /sbin/nologin ，即可讓該帳號暫時無法登入主機；
        • 將 /etc/shadow 內的密碼欄位，增加一個 * 號在最前面，這樣該帳號亦無法登入！
        • 將 /etc/shadow 的第八個欄位關於帳號取消日期的那個，設定小於目前日期的數字，那麼他就無法登入系統了！

    • 在設定密碼的時候，是否可以隨便設定呢？
      答：
        最好不要隨便設定密碼！最好可以仔細的參考一下 13-2 節提到的內容！

    • 我在使用 useradd 的時候，新增的帳號裡面的 UID, GID 還有其他相關的密碼控制，都是在哪幾個檔案裡面設定的？
      答：
        在 /etc/login.defs 還有 /etc/defaults/useradd 裡面規定好的！

    • 我希望我在設定每個帳號的時候( 使用 useradd )，預設情況中，他們的家目錄就含有一個名稱為 www 的子目錄，我應該怎麼作比較好？
      答：
        由於使用 useradd 的時候，會自動以 /etc/skel 做為預設的家目錄，所以，我可以在 /etc/skel 裡面新增加一個名稱為 www 的目錄即可！

    • pwconv 這個指令有什麼功能呢？
      答：
        pwconf 可以讓 passwd 裡面的帳號，設定一份密碼到 /etc/shadow 當中！
    2002/05/15：第一次完成
    2003/02/10：重新編排與加入 FAQ
    2002/05/05 以來統計人數


Linux 磁碟配額（ Quota ）
最近更新日期：2003/02/10
什麼是 quota
基本的 quota 指令： quota, quotacheck, edquota, quotaon, quotaoff,
動手作 quota
使用郵件主機進行 quota 的實例
本章習題練習
什麼是 quota？
quota 就字面上的意思來看，呵呵！就是有多少『限額』的意思啦！如果是用在零用錢上面，就是『有多少零用錢一個月』的意思之類的。如果是在容量空間上面呢？以 Linux 來說，呵呵！就是有多少容量限制的意思。

在 Linux 系統中，由於是多人多工的環境，所以會有多人共同使用一個硬碟空間的情況發生，如果其中有少數幾個使用者大量的佔掉了硬碟空間的話，那勢必壓縮其他使用者的使用權力！因此管理員應該適當的開放硬碟的權限給使用者，以妥善的分配系統資源！避免有人抗議呀！比較常使用的幾個情況是：
  • (1) 例如每個人的網頁空間的容量限制！
  • (2) 每個人的郵件空間限制。
在 Linux 當中，使用來作為硬碟空間管理的就是所謂的 quota 這個咚咚啦！使用這個模組要有幾個步驟，底下就分別說說吧！另外要特別注意的是，使用 quota 時有幾個基本的限制需要談一談：
  • quota 實際在運作的時候，是針對『整個 partition』進行限制的，例如：如果你的 /dev/hda5 是掛載在 /home 底下，那麼在 /home 底下的所有目錄都會受到限制！
  • Linux 系統核心必須有支援 quota 這個模組才行：如果您是使用 Mandrake 的預設核心，嘿嘿！那恭喜你了，你的系統已經預設有開放 quota 這個模組囉！如果您是自行編譯核心的，那麼請特別留意您是否已經『真的』開啟了 quota 這個模組？否則底下的功夫將全部都視為『白工』。至於核心編譯的過程我們會在未來進行說明呦！
  • 目前新版的 Linux distributions 如： Mandrake 9.0 與 Red Hat 8.0 等使用的是 Kernel 2.4.xx 的核心版本，這個核心版本支援新的 quota 模組，使用的預設檔案（ aquota.user, aquota.group ）將不同於舊版本的 quota.user, quota.group ！（多了一個 a 呦！）而由舊版本的 quota 可以藉由 convertquota 這個程式來轉換呢！
quota 這支程式的限制內容主要分為底下幾個部分：
  • soft ：這是最低限制容量的意思，使用者在寬限期間之內，他的容量可以超過 soft ，但必需要寬限時間之內將磁碟容量降低到 soft 的容量限制之下！
  • hard ：這是『絕對不能超過』的容量！跟 soft 相比的意思為何呢？通常 hard limit 會比 soft limit 為高，例如網路磁碟空間為 30 MB ，那麼 hard limit 就設定為 30MB ，但是為了讓使用者有一定的警戒心，所以當使用空間超過 25 MB 時，例如使用者使用了 27 MB 的空間時，那麼系統就會警告使用者，讓使用者可以在『寬限時間內』將他的檔案量降低至 25 MB ( 亦即是 soft limit )之內！也就是說， soft 到 hard 之間的容量其實就是寬限的容量啦！可以達到針對使用者的『警示』作用！
  • 寬限時間：那麼寬限時間就可以很清楚的知道含意是什麼了！也就是當您的使用者使用的空間超過了 soft limit ，卻還沒有到達 hard limit 時，那麼在這個『寬限時間』之內，就必需要請使用者將使用的磁碟容量降低到 soft limit 之下！而當使用者將磁碟容量使用情況超過 soft limit 時，『寬限時間』就會自動被啟動，而在使用者將容量降低到 soft limit 之下，那麼寬限時間就會自動的取消囉！
基本的 quota 指令：
在開始進行 quota 的實作之前，我們得來瞭解一下 quota 要使用的指令囉！基本上分為兩種，一種是查詢功能（quota, quotacheck, quotastats, warnquota, repquota），另一種則是編輯 quota 的內容（ edquota, setquota ）。底下我們來談一談這些基本的指令吧！
  • quota
    語法：
    [root @test /root ]# quota [-guvs] [user,group]
    參數說明：
    -g ：顯示 group 群組
    -u ：顯示 user
    -v ：顯示 quota 的值
    -s ：選擇 inod 或 硬碟空間來顯示
    範例：
    [root @test /root ]# quota -guvs <==顯示目前執行者（就是 root ）的 quota 值
    [root @test /root ]# quota -uvs test <==顯示 test 這個使用者的 quota 值
    說明：
    這個指令僅是使用來『顯示(display)』目前某個群組或者某個使用者的 quota 限值！您可以使用來觀察一下呦！
  • quotacheck
    語法：
    [root @test /root ]# quotacheck [-auvg] /yourpath
    參數說明：
    -a ：掃瞄所有在 /etc/mtab 裡頭已經 mount 的具有 quota 支援的磁碟
    -u ：掃瞄使用者的檔案與目錄
    -v ：顯示掃瞄過程
    -g ：掃瞄群組使用的檔案與目錄
    範例：
    [root @test /root ]# quotacheck -uvg /home <==開始掃瞄 /home 這一個獨立磁區的目錄
    quotacheck: Scanning /dev/hda3 [/home] done <==顯示 /home 磁區為 /dev/hda3 ！
    quotacheck: Checked 35 directories and 342 files <==掃瞄完畢，有 35 目錄與 342 檔案。
    [root @test /root ]# ls -l /home <==查看一下 /home 這個目錄底下，兩個檔案產生了！
    -rw------- 1 root root 7168 May 6 18:37 aquota.group
    -rw------- 1 root root 7168 May 6 18:37 aquota.user
    說明：
    這這個指令主要的目的在掃瞄某一個磁碟的 quota 空間，他會針對該磁碟進行掃瞄，並且，由於該磁碟若持續運作時，可能掃瞄的過程中，檔案可能會增減，造成 quota 掃瞄的錯誤發生，因此，當使用 quotacheck 時，該磁碟將『自動被設定成為唯獨磁區（read-only）；至於掃瞄完畢之後，掃瞄所得的磁碟空間結果會寫入該磁區最頂端（例如：在我的例子中，掃瞄 /home 這個 /dev/hda3 的磁區，如果是初次掃瞄，那麼掃瞄完畢之後會產生 aquota.user 與 aquota.group ，會放置在 /home/aquota.xxx 底下！而如果是建立 quota 後的掃瞄，那麼就會更新這兩個檔案！）另外， Linux 也特別強調 quota 在使用的時候，需要特別注意在 reboot 時，得先將 quota 關閉才好！
  • edquota
    語法：
    [root @test /root ]# edquota [-u user] [-g group] [-t]
    [root @test /root ]# edquota -p user_demo -u user
    參數說明：
    -u ：編輯 user 的 quota
    -g ：編輯 group 的 quota
    -t ：編輯寬限時間（就是超過 quota 值後，還能使用硬碟的寬限期限）
    -p ：copy 範本（以建立好的使用者或群組）到另一個使用者（或群組）
    範例：
    [root @test /root ]# edquota -u test <==設定 test 這個使用者的 quota 數值，會直接進入 vi 畫面
    Disk quotas for user test (uid 501):
    Filesystem blocks soft hard inodes soft hard
    /dev/hda3 8 0 0 5 0 0
    修改一下成為：
    Disk quotas for user test (uid 501):
    Filesystem blocks soft hard inodes soft hard
    /dev/hda3 8 50005000 5 50005000

    [root @test /root ]# edquota -p test -u test2 <==將 test 這個人的 quota 資料複製給 test2 這個人！

    [root @test /root ]# edquota -t <==設定寬限時間，也就是超過 quota 值之後的修正時間啦！
    Grace period before enforcing soft limits for users:
    Time units may be: days, hours, minutes, or seconds
    Filesystem Block grace period Inode grace period
    /dev/hda3 0minutes 0minutes
    上面的 0minutes 可以改成 60minutes 即可！也就是 60 分鐘之內必須要趕快整理硬碟的意思！

    說明：
    這個指令就是在編輯每一個『個人』或者是『群組』的 quota 數值！通常我們以 edquota -u username 或者是 edquota -g groupname 來編輯個人與群組的 quota 設定值。不過，或許您會覺得一個一個分配似乎很慢的樣子！那麼您也可以直接 copy 一個人的設定值給其他人，就如同上面第二個例子，利用已經建立好的 test 來建立 test2 這個人的 quota 限額！這個指令可是很重要的呦！另外，上面有幾個重要的資訊，我們來談一談吧：
    1. filesystem：這個是那個 partition 的意思！以上面來說，就是 /dev/hda3 囉！
    2. blocks：這個是目前使用者 test ( uid 501 )在 /dev/hda3 這個 filesystem (參考上面一個資訊)，所耗掉的磁碟容量，也就是目前的使用掉的空間啦！單位是 Kbytes 喔！這個資訊是 quota 程式自己計算出來的，所以請不要修改他！
    3. soft 與 hard ：這個是目前的 test 在這個 filesystem 之內的 quota 限制值！至於 soft 與 hard 的意思就如同 14-1 節最後面提的那個意思啦！當 soft 與 hard 數值為 0 的時候，表示『沒有限制』的意思！而數值的單位仍是 Kbytes 喔！
    4. inodes ：是目前使用掉 inode 的狀態，也是 quota 自己計算出來而得到的，所以不要去變更他。一般而言， inode 不容易控制，所以您可以不必去限制 inode 呢！
  • quotaon
    語法：
    [root @test /root ]# quotaon [-a] [-uvg directory]
    參數說明：
    -a ：全部的 quota 設定都啟動（會自動去尋找 /etc/mtab 的設定）
    -u ：使用者的 quota 啟動
    -g ：群組的 quota 設定啟動
    -s ：顯示訊息
    範例：
    [root @test /root ]# quotaon -a <==全部的 quota 限制都啟動
    [root @test /root ]# quotaon -uv /home <==只有啟動 /home 底下的使用者 quota 限額，group 不啟動！
    說明：
    這個指令是在啟動 quota 的！不過，由於這個指令是啟動 aquota.group 與 aquota.user 的，所以您就必須要先完成 qutoacheck 的工作了！然後簡單的下達 quotaon -a 即可啟動！
  • quotaoff
    語法：
    [root @test /root ]# quotaoff -a
    參數說明：
    -a ：全部的 quota 設定都關閉（會自動去尋找 /etc/mtab 的設定）
    範例：
    [root @test /root ]# quotaoff -a <==全部的 quota 限制都關閉了！
    說明：
    這個指令就是關閉了 quota 的限制啦！
    • 動手作 quota：
      quota 可以作用的功能有很多，包括了：

      • 限制某一群組所能使用的最大磁碟配額（使用 群組 限制）：你可以將你的主機上的使用者分門別類，有點像是目前很流行的付費與免付費會員制的情況，你比較喜好的那一群的使用配額就可以給高一些！呵呵！ ^_^...

      • 限制某一使用者的最大磁碟配額（使用 使用者 限制）：在限制了群組之後，您也可以再繼續針對個人來進行限制，使得同一群組之下還可以有更公平的分配！

      • 以 Link 的方式，來使郵件可以作為限制的配額（更改 /var/spool/mail 這個路徑）：如果是分為付費與免付費會員的『郵件主機系統』，是否需要重新再規劃一個硬碟呢？也不需要啦！直接使用 Link 的方式指向 /home （或者其他已經做好的 quota 磁碟）就可以啦！

      底下先列出幾個主要的步驟來說明：

      1. 開啟磁碟的 quota 功能：編輯 /etc/fstab ，使得準備要開放的 quota 磁碟可以支援 quota 囉；
      2. 預掃瞄磁碟的使用情況：使用 quotacheck 來掃瞄一下我們要使用的磁碟囉；
      3. 建立使用者的 quota ：使用 edquota 來編輯每個使用者或群組的可使用空間囉；
      4. 啟動 quota ：使用 quotaon 吧！

      整個步驟大致上就只有這幾步，我們來瞧一瞧如何使用吧！！底下我們以一個簡單的範例來進行 quota 的說明囉！整個範例的說明如下：

      1. 我們假設 test 這部主機裡頭有 test 與 test2 這兩個使用者，且他們兩個都掛在 test 這個群組下；
      2. 每個使用者總共有 50MB 的磁碟空間（不考慮 inode ）限制！並且 soft limit 為 45 MB；
      3. 而寬限時間設定為 1 天，也就是說，這四個人可以突破 40MB 的限制，但是在一天之內必須要將多餘的檔案砍掉，否則將無法使用剩下的空間（也就是說，這個帳號大概就不能使用了?）；
      4. test 這個群組考慮最大限額，所以設定為 90 MB 好了！

      整個執行步驟可以照下面來執行看看：
      1. 建立 test2 這個使用者：
        由於我們之前只有 test 這個使用者掛在 test 群組之中，所以必需要先設定一下 test2 這個使用者！因為他的群組必需是 test 這個，而我們去查了一下 /etc/group 發現 test 的 uid 為 501 ，因此，我們可以這樣來設定 test2 呢！

        [root @test root]# useradd –m –g 501 test2
        [root @test root]# passwd test2
        Changing password for user test2.
        New UNIX password:
        Retype new UNIX password:
        passwd: all authentication tokens updated successfully.

      2. 開啟磁碟的 quota 功能：
        由於 quota 需要在 ext 的 Linux 延伸格式檔案才可以啟動，所以你就必須要將準備開啟 quota 的磁碟啟動參數，寫進入 quota 的磁碟設定才行 ( /etc/fstab )！以我的例子而言，我想要在 /home 底下進行 quota 的限制test, test2 這兩個人！正巧 /home 是一個獨立的磁區，這可以使用 df 來查詢：此外，必需要特別留意的是，最好不要以根目錄亦即是 / 進行 quota 啦！否則容易有些問題呢！另外，不要針對 root 做 quota 喔！

        [root @test root]# df
        Filesystem 1K-blocks Used Available Use% Mounted on
        /dev/hda1 1904920 1088136 720020 61% /
        /dev/hdb1 976344 71504 854444 8% /backup
        /dev/hdb2 101540 4252 92048 5% /home

        嗯！我的 home 是獨立的 partition ，並且他的裝置名為 /dev/hdb2 ，好了！那麼我就必須要啟動 /home 這個 /dev/hdb2 的 quota 檔案格式，好了！那麼由於檔案格式的設定是寫在 /etc/fstab 裡頭，所以我們以 vi 來編輯他吧！只要在 /etc/fstab 裡頭增加了 usrquota, grpquota 就可以啦！『註：請特別留意，這兩個項目請『務必』不要寫錯了！請再寫入 /etc/fstab 之前好好的再次檢查，因為寫錯之後，很有可能造成系統無法開機（雖然機率不高，但是有可能！?）』

        [root @test root]# vi /etc/fstab
        # device MountPoint filesystem parameters dump fsck
        /dev/hda1 / ext3 defaults 1 1
        /dev/hda2 swap swap defaults 0 0
        /dev/hdb1 /backup ext3 defaults 1 1
        /dev/hdb2 /home ext3 defaults 1 1
        none /dev/pts devpts mode=0620 0 0
        none /proc proc defaults 0 0

        上面的黃色字體改成底下的樣子！
        /dev/hdb2 /home ext3 defaults,usrquota,grpquota 1 1

        多了 usrquota,grpquota 注意，由 defaults,usrquota,grpquota 之間都沒有空格！

        這樣就算加入了 quota 的磁碟格式了！不過，由於真正的 quota 在讀取的時候是讀取 /etc/mtab 這個檔案的，偏偏這一個檔案需要重新開機之後才能夠以 /etc/fstab 的新資料進行改寫！所以這個時候你可以選擇：

          (1)重新開機==>reboot；也可以選擇
          (2)重新 remount filesystem 來驅動設定值！

        我是不太喜歡重新開機的人啦！所以我就這麼做：

        [root@test /]# umount /dev/hdb2
        [root@test /]# mount -a
        [root@test /]# more /etc/mtab
        /dev/hda1 / ext3 rw 0 0
        none /proc proc rw 0 0
        none /proc/bus/usb usbdevfs rw 0 0
        none /dev devfs rw 0 0
        none /dev/pts devpts rw,mode=0620 0 0
        /dev/hdb1 /backup ext3 rw 0 0
        /dev/hdb2 /home ext3 rw,usrquota,grpquota 0 0

        或者以下列的方式重新 mount 所有的磁碟：
        [root @test /root ]# mount -a -o remount <==這個指令可以重新將 /etc/fstab 的咚咚 mount 下來！

        嘿嘿嘿嘿！這樣我們就已經成功的將 quota 的功能寫入 partition 當中囉！另外，我們這裡是以 ext3 這個磁碟格式來測試 quota 的呦！
      3. 掃瞄磁碟的使用者使用狀況，並產生重要的 aquota.group 與 aquota.user：
        接著下來就是要來掃瞄一下我們所需要的磁碟到底有沒有多餘的空間可以讓我們來設定 quota 呢？並且將掃瞄的結果輸出到這個磁碟的最頂層去（也就是 /home 底下）這個時候就需要 quotacheck 這個指令的幫忙了！使用 quotacheck 就可以輕易的將所需要的資料給他輸出了！現在就 OK 啦！並且在 /home 底下會產生 aquota.group 與 aquota.user 這兩個檔案！

        [root@test /]# quotacheck -avug
        quotacheck: Scanning /dev/hdb2 [/home] done
        quotacheck: Checked 10 directories and 22 files
        [root@test /]# ll /home
        total 44
        -rw------- 1 root root 7168 Oct 28 14:05 aquota.group
        -rw------- 1 root root 7168 Oct 28 14:05 aquota.user
        drwx------ 2 root root 16384 Oct 22 16:54 lost+found/
        drwxr-xr-x 3 test test 4096 Oct 28 01:45 test/
        drwxr-xr-x 3 test2 test 4096 Oct 28 13:37 test2/

        使用 quotacheck 就可以輕易的將所需要的資料給他輸出了！現在就 OK 啦！並且在 /home 底下會產生 aquota.group 與 aquota.user 這兩個檔案！註：但是很奇怪的是，在某些 Linux 版本中，我不能夠以 aquota.user(group) 來啟動我的 quota ，真的是很奇怪呢！所以我就另外做了一個 link 檔案來欺騙 quota 囉：

        [root @test /root ]# cd /home
        [root @test /root ]# ls -l aquota*
        -rw------- 1 root root 7168 May 6 22:16 aquota.group
        -rw------- 1 root root 7168 May 6 22:16 aquota.user
        [root @test /root ]# ln -s aquota.group quota.group
        [root @test /root ]# ln -s aquota.user quota.user

      4. 啟動 quota 的限額！
        再來就是要啟動 quota 啦！啟動的方式也是很簡單的！就是使用 quotaon -av 即可：

        [root@test /]# quotaon -av
        /dev/hdb2 [/home]: group quotas turned on
        /dev/hdb2 [/home]: user quotas turned on

        注意：要看到上面有個 turned on 的出現，才是真的成功了！

      5. 編輯使用者的可使用空間：
        由於我們有兩個使用者要設定，先來設定 test 好了，使用 edquota 就對了

        [root @test /]# edquota –u test
        Disk quotas for user test (uid 501):
        Filesystem blocks soft hard inodes soft hard
        /dev/hdb2 32 0 0 8 0 0

        將上面的原本設定改為底下的模樣：
        Disk quotas for user test (uid 501):
        Filesystem blocks soft hard inodes soft hard
        /dev/hdb2 32 40000 50000 8 0 0

        要特別留意的是，上面的黑體數值代表的是 KB 呦！轉成 MB 是需要乘上 1024 倍，這裡簡單的計算一下就好了！這樣就算編輯完畢了！接下來我們就需要將這個設定同時複製給 test2 這個傢伙！

        [root@test /]# edquota -p test test2

        接下來要來設定寬限時間，還是使用 edquota ！

        [root@test /]# edquota -t
        Grace period before enforcing soft limits for users:
        Time units may be: days, hours, minutes, or seconds
        Filesystem Block grace period Inode grace period
        /dev/hdb2 1days 1days

        將時間改為 1 天（原本是 7days 改成 1days ），好了！查詢一下是否真的有設定進去呢？使用 quota -v 來查詢

        [root@test /]# quota –vu test test2
        Disk quotas for user test (uid 501):
        Filesystem blocks quota limit grace files quota limit grace
        /dev/hdb2 32 40000 50000 8 0 0
        Disk quotas for user test2 (uid 502):
        Filesystem blocks quota limit grace files quota limit grace
        /dev/hdb2 28 40000 50000 7 0 0

        特別注意到，由於我們的使用者尚未超過 40 MB，所以 grace ( 寬限時間 )就不會出現啦！這樣很夠清楚了吧？！

      6. 編輯群組使用空間：
        其實也差不多，還是使用 edquota：

        [root@test /]# edquota -g test
        Disk quotas for group test (gid 501):
        Filesystem blocks soft hard inodes soft hard
        /dev/hdb2 60 0 0 15 0 0

        修改成底下這樣：
        Disk quotas for group test (gid 501):
        Filesystem blocks soft hard inodes soft hard
        /dev/hdb2 60 80000 90000 15 0 0

        [root@test /]# quota -vg test
        Disk quotas for group test (gid 501):
        Filesystem blocks quota limit grace files quota limit grace
        /dev/hdb2 60 80000 90000 15 0 0

      7. 設定開機時啟動：
        開機的時候自動啟動的設定在哪裡還記得嗎？沒錯！就是在 /etc/rc.d/rc.local 底下：所以你可以使用 vi 在這個檔案的最後面加上一行：

        [root @test /root ]# vi /etc/rc.d/rc.local
        /sbin/quotaon -aug

        如果要關閉 qutoa 就是用 quotaoff 吧！沒錯！這樣就將 quota 設定完畢了！很簡單吧！！
    使用郵件主機進行 quota 的實例：
      好了，我們前面 帳號管理 的部分曾經提到 e-mail 這個東西嘛！好了，如果我們要設定一個對外開啟的郵件主機的時候，那麼最好對於郵件空間有點限制比較好，免得如同上面提到的一些問題一樣，造成使用者的使用權不一！所以說，使用 quota 確實是一個好建議！這個時候該怎麼辦呢？什麼怎麼辦？嗯！是這樣的，由於 quota 『只能針對一個 partition 進行整體的磁碟配額，無法針對某個目錄進行磁碟配額！』針對這個觀念，我們不難發現，『(1)將郵件存在個人的家目錄與 (2)將郵件統一放在 /home 下的一個共用目錄』是一樣的！為什麼呢？這是因為 quota 針對的是一個磁碟呀！呵呵！所以囉，您必須先確定『您的 /home 是一個獨立的 partition 』才行！當然囉，您也可以使用其他的獨立的 partition 來進行底下的步驟！但是在這裡，我們預設以 /home 這一個目錄來假定這一個目錄是一個獨立的 partition ！
      如此則在 /home 底下，由於每個人的磁碟配額已經設定好了！所以當然囉！該信件就可以得到完整的 quota 限額的限制了！所以呢，就需要進行下面的步驟：
      1. 以 上面設定 的方式設定好使用者 quota 的所有工作（即是在 /home 這個 partition ）；
      2. 將 /var/spool/mail 這個郵件預設的資料夾備份到其他的目錄去；
      3. 建立 /home/mail，這是因為假設我們的郵件放置在這個目錄中；
      4. 修改 /home/mail 的屬性，使成為 擁有者 root ，群組 mail ，及屬性為 775 才行！
      5. 將 /home/mail 給他 Link 到 /var/spool/mail 去即可！
      6. 以後每個人的郵件將都會放置 /home/mail 這個目錄中！
      1. 建立並修改 /home/mail 這個目錄：
      [root @test /root ]# mkdir /home/mail
      [root @test /root ]# chown root:mail /home/mail
      [root @test /root ]# chmod 775 /home/mail

      2. 備份並移動原本的 mail 到 /home/mail 底下去：
      [root @test /root ]# cp -r /var/spool/mail /var/spool/mail.back
      [root @test /root ]# mv /var/spool/mail/* /home/mail
      [root @test /root ]# rmdir /var/spool/mail

      3. 建立連結：
      [root @test /root ]# ln -s /home/mail /var/spool/mail

      只要這樣的一個小步驟，嘿嘿！您家主機的郵件就有一定的限額囉！當然囉！您也可以依據不同的使用者與群組來設定 quota 然後同樣的以上面的方式來進行 link 的動作！嘿嘿嘿！就有不同的限額針對不同的使用者提出囉！很方便吧！！ ^_^

    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • 如果我有一個 Linux 主機，未來想要對外提供 mail 與 WWW 的服務，同時預計提供個人網頁空間的服務，然而我希望 mail 提供 30 MB 而 WWW 則提供 20MB 的空間，那麼我應該如何規劃我的主機？
      答：
        在 quota 的限制中，由於他限制的是整個 partition 呢！所以既然要分為兩個服務來限制，就需要設定成兩個 partition 了！這個案例當中是以 Linux 為新架設的角度來看，所以我們的規劃就較為簡單！假設我的硬碟為 30GB 的硬碟，那麼我可以這樣設定：
          / 256 GB
          Swap 2 * RAM
          /usr 3~5 GB
          /backup 5GB
        其他的空間平均分給
          /home
          /var/spool/mail
        這樣就可以啦！然後安裝完成之後，套用 quota 的設定，即可做好限制囉！很是方便的！
    2002/07/14：第一次完成
    2003/02/10：重新編排與加入 FAQ
    2002/05/06以來統計人數


Linux 例行性命令的建立
最近更新日期：2002/05/30
什麼是例行性命令？
Linux 系統的例行性命令有哪些？
僅執行一次的工作排程： at
循環執行的例行性命令： crontab
系統的 crontab 設定： /etc/crontab
安全的防護： /var/log/cron 記錄檔
本章習題練習
什麼是例行性命令？
每個人或多或少都有一些約會或者是工作，有的工作是例行性的，例如每年一次的加薪、每個月一次的工作報告、每週一次的午餐會報、每天需要的打卡等等；有的工作則是臨時發生的，例如剛好總公司有高官來訪，需要你準備演講器材等等！用在生活上面，例如每年的愛人的生日、每天的起床時間等等、還有突發性的電腦大降價（阿∼我等好久了∼∼）等等囉。這些工作都可以稱為例行性命令，而這些工作 Linux 也都可以幫您提醒，例如：每一天早上 8:00 鐘要伺服器連接上音響，並啟動音樂來喚你起床；而中午 12:00 希望 Linux 可以發一封信到你的郵件信箱，提醒你可以去吃午餐了；另外，在每年的你愛人的生日的前一天，先發封信提醒你，以免忘記這麼重要的一天。
從上面的說明當中可以很清楚的發現兩種工作排程的方式：
  • 一種是例行性的，就是每隔一定的週期要來辦的事項；
  • 一種是突發性的，就是這次做完以後就沒有的那一種（電腦大降價....）
那麼在 Linux 底下如何達到這兩個功能呢？呵呵！那就得使用 at 與 crontab 這兩個好東西囉！
  • at ： 這個工作僅執行一次就從 Linux 系統中的排程中取消；
  • crontab ： 這個工作將持續例行性的作下去！
底下我們先來談一談 Linux 的系統到底在做什麼事情，怎麼有若干多的工作排程在工作呢？然後再回來談一談 at 與 crontab 這兩個好東西！
Linux 系統的例行性命令有哪些
好了，那麼伺服器自己有什麼例行性命令要來作呀！？Linux 的工作可多著呢！由前面提到的幾篇文章中，我們知道Linux 本身在背景下的工作可是很多的，尤其是網路開放的情況下，建立與取消連線、MySQL 資料庫的即時更新、以及一些例行的系統指令，例如釋放記憶體的工作等等。由於例行的工作非常的多，實在不可能每天都要管理員來手動輸入吧！所以才會建立這個工作排程的需求的！基本預設的工作有底下這些：
  • 進行資料輪替 ( log rotate )：這個步驟重要了！尤其是在 log file 的選項當中！由於登錄檔案會越來越大，所以需要適時適量的將登錄檔備份，並以新開的檔案來進行記錄，這樣效率會比較好，因此就需要使用 log rotate 啦！系統預設的重要工作之一；
  • rpm 資料庫的建立：雖然 RPM 資料庫會在你以 RPM 安裝之後即更新到 RPM 資料庫當中去，但是難保會有漏網之魚，所以系統也會設定每隔依段時間自動的蒐集系統上面的 RPM 資料庫來建置一番；
  • 建立 locate 的資料庫：是否還記得為何使用 locate 這個指令時，搜尋速度超快！那是因為 Linux 系統上將檔案與路徑都記錄在資料庫裡面了！所以使用 locate 的時候，嘿嘿！直接指向資料庫去 ( /var/lib/slocate/slocate.db ) ，偏偏麻煩的是這個檔案的更新是每天一次！所以當你今天更新的檔案，使用 locate 反而可能會找不到....
  • 進行程序的分析：每隔依段時間會進行程序的分析，如果發現有僵屍程序的時候，就會將他刪去！以保持記憶體的工作能力！
  • 登錄檔視察：這個東西是在 Red Hat 7.1 以後才出現的東西，後來太好用了，所以被拿到舊版的 Red Hat 裡面去使用！基本上就是分析登錄檔啦！然後據以解析有問題的紀錄檔，以維護主機的安全性！這部份不才小弟也自己寫了一個簡易型的分析檔案，覺得更好用就是了！
  • 指紋資料庫的比對：基本上就是 tripwire 這個套件啦！可以用來分析最近被更動過的檔案內容！蠻不錯的一個程式！有空也來玩玩看。
Linux 預設的例行工作至少就有這些了，再加上您努力的為 Linux 進行工作排程的設計，嘿嘿！每天的工作量可是相當的大的呢！
僅執行一次的工作排程
如果僅要執行一次的工作，就使用 at 這個指令吧！這個指令其實就是 atd 這個服務啦！所以請記得一定要啟動這個服務呦！如果是在 Red Hat 系統下，可以使用：
  1. ntsysv
  2. 選擇 atd
  3. 按下 OK ！
如果是在 Mandrake 系統下，可以使用：
  1. chkconfig --add atd
  2. chkconfig --list
    上面這個指令可以查看 atd 在 run-level 正確的情況中，是否會在開機的時候被啟動！
基本上， atd 是預設開啟的，如果您沒有更動過系統預設值的話，那麼上面的動作就不需要動囉！下達 at 這個動作會將工作排程寫入 /var/spool/at 這個目錄下呢！然後等待系統將之執行囉！此外，這個 at 指令雖然預設是所有人都能進行，但是可以經由 root 的規範來限制使用的人口。限制的方法其實與 /etc/hosts.allow(deny) 類似，使用 /etc/at.allow(deny) 這兩個檔案來限制：
  • 限制使用者原理：當使用者執行 at 時，系統會

    1. 先找尋 /etc/at.allow 這個檔案，寫在這個檔案中的使用者才能使用 at ，沒有在這個檔案中的使用者則不能使用 at ( 即使沒有寫在 at.deny 當中 )；
    2. 如果沒有 /etc/at.allow 就尋找 /etc/at.deny 這個檔案，若寫在這個 at.deny 的使用者則不能使用 at ，而沒有在這個 at.deny 檔案中的使用者，就可以使用 at 咯；
    3. 如果兩個檔案都不存在，那麼只有 root 可以使用 at 這個指令。
  • Linux 預設情況下，只有 /etc/at.deny 這個檔案，且這個檔案的內容為空白的，由於內容沒有任何使用者，所以當然『所有人都可以使用 at 』
  • 如果不想要某個使用者使用 at 時，那麼將該使用者帳號寫到 /etc/at.deny 這個檔案中即可。
好了！我們來談一談 at 的語法吧！
[test @test test]# at [-m] TIME　　　　(下達工作指令)
[test @test test]# atq　　　　　　　　 (查看目前的工作排程)
[test @test test]# atrm [jobnumber]　　(刪除排程)
參數說明：
-m ：執行 at 所規範的工作排程時，將螢幕輸出結果 mail 給下達指令的使用者
TIME ：時間的格式，有底下幾個：
      HH:MM YYYY-MM-DD　　　　　　　　　　　 　ex> 04:00 2002-05-30 (五月三十號四點執行)
      HH[pm;am] + number [hours;days;weeks]　　ex> 4pm + 3 days (在過 3 天的下午 4 點)
      HH:MM　　　　　　　　　　　　　　　　　　ex> 12:00 (今天的 12 點執行)
      HH[pm;am] [Month] [Day]　　　　　　　　　ex> 1pm May 30
jobnumber：每一個 at 工作排程都有編排的順序！這個即是！
範例：

[test @test test]# at 5pm <==在今天的 5pm 執行，如果今天已過 5 點則明天執行；
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
at> mail -s test test < /home/test/.bashrc <==這就是我的工作！
at> <EOT> <==這裡是按下 [Ctrl] + D 就可以離開了！
job 8 at 2002-05-30 17:00 <==這裡會告訴你這個工作的號碼為 8 號，執行的日期為後面所示。

[test @test test]# atq <==窺視一下你(test)目前有多少工作？
5 2002-05-30 12:00 a test
8 2002-05-30 17:00 a rest

[test @test test]# atrm 5<==刪除第 5 號工作
[test @test test]# atq
8 2002-05-30 17:00 a rest

請注意！在 at 下達之後，便進入指令列下達的模式！在這裡你可以重複的輸入指令，但是離開的時候請下達『 [Ctrl] + D 』就可以離開了！離開之後，系統會告訴你這個工作排程的號碼與使用者是誰！呵呵！很簡單吧！

循環執行的例行性命令
這個循環的例行性命令其實就是 cron 這個服務啦 (crond)！當你下達 crontab 的指令之後，會將你的命令寫入 /var/spool/cron這個目錄當中呦！例如 test 下達了他的 crontab 命令，那麼就會自動產生 /var/spool/cron/test 這個檔案！『但請注意，這個檔案不能直接編輯！』然後執行的指令記錄會放置在 /var/log/cron 這個檔案中！所以，『如果您的 Linux 系統不知道是否被木馬入侵時，可以搜尋一下 /var/log/cron 這個記錄擋，視察看看有沒有被搞鬼？』
好了！我們來看一下 crontab 的指令語法吧！
[test @test test]# crontab [-u user] [-l | -e | -r]
參數說明：
-u user ：只有 root 能下達的參數，視察或編譯其他使用者的 crontab 內容
-l ：列出 crontab 的內容
-e ：編輯 crontab 的內容
-r ：刪除 crontab 的內容
範例：
一般使用者 test 要在每天的 12:00 發信給自己：

[test @test test]# crontab -e <==自己編輯自己的 crontab 內容

進入 crontab 編輯內容，使用 vi 呦！

0 12 * * * mail test < /home/test/test.txt
分時日月週 |========指令列===============|

上面的例子是說：假如你需要在每天的正午 12:00 發一封信給你自己，而且信的內容已經寫好了，那要怎樣作呢？而且，另一個假設是，你在 Linux Server 中的權限僅止於一般使用者，並不是 root （管理員）身份，那要怎樣設定你的例行性命令呢？哈哈！那就使用 crontab 這個指令吧！你只要執行『 crontab -e 』就可以進入 vi 的編輯畫面來編輯你的例行性命令說！

在上面的例子中，輸入 crontab -e 時，會出現一個 vi 畫面，然後你在 vi 畫面中輸入上面的一行字，之後按 :wq 儲存後離開！即可完成編輯！容易吧！那上面那一行字代表什麼意義呢？你可以看到，在真正執行命令之前（就是 mail test < /home/test/test.txt ）總共有五個數字，這五個數字分別代表：
分　　（0-59）
小時　（0-23）
日期　（1-31）
月份　（1-12）
週　　（0-6）
數字代表的意義
分鐘
小時
日期
月份
週
範圍
0-59
0-23
1-31
1-12
0-6 (0為星期天)
另外，如果是『 ＊ 』的時候，代表所有數字都適用的意思。所以，你就可以知道我上面那一行寫的意義為何了！那就是『不論何月、何日、星期幾的 12 點 0 分時，執行 mail test < /home/test/test.txt 這個命令』！還不瞭解？沒關係，我們這裡作幾個例子！
例題一：假如你的女朋友生日是 5 月 2 日，你想要在 5 月 1 日的 23:59 發一封信給他，
        這封信的內容已經寫在 /home/test/lover.txt 中了

[test @test test]# crontab -e

59 23 1 5 * mail pigpp < /home/test/lover.txt

那樣的話，每年 pigpp 都會收到你的這封信喔！（當然囉，信的內容就要每年變一變啦！）
例題二：假如你每隔五分鐘要去 check 你的一個名為 test.sh 的批次檔一次，則：

[test @test test]# crontab -e

59 23 1 5 * mail pigpp < /home/test/lover.txt <==剛剛的那個指令還存在呦！
*/5 * * * * /home/test/test.sh <==新加入的一個排程！

注意到呦！那個 crontab 每個人都只有一個檔案，就是在 /var/spool/cron 裡面的檔案啦！還有兩件事要注意一下：
(1) 指令的路徑最好是下達絕對路徑，這樣比較不會找不到執行的檔案喔；
(2) 第一個數字 */5 表示『每五分鐘執行一次』的意思！
例題三：假如你每個禮拜的星期五下午 4:30 要告訴朋友星期六的約會不要忘記，則：

[test @test test]# crontab -e

59 23 1 5 * mail pigpp < /home/test/lover.txt
*/5 * * * * /home/test/test.sh
30 16 * * 5 mail frend@test.domain.name < /home/test/frend.txt <==新加入的！

呵呵！這樣很簡單吧！如此就可以輕易的達到您所需要的例行性工作排程的安排囉！
好了！那麼我們要如何來查看使用者目前的 crontab 的工作排程呢？
[test @test test]# crontab -l <==這個 -l 是 L 的小寫
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.27683 installed on Thu May 30 13:38:38 2002)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
59 23 1 5 * mail pigpp < /home/test/lover.txt
*/5 * * * * /home/test/test.sh
30 16 * * 5 mail frend@test.domain.name < /home/test/frend.txt
呵呵呵！其實這個顯示的內容就是 /var/spool/cron/test 檔案的內容啦！那麼如何刪除排程呢？
[test @test test]# crontab -r
[test @test test]# crontab -l
no crontab for test
看到了嗎？ crontab 『整個內容都不見了！』所以請注意：『如果只是要刪除某個 crontab 的工作項目，那麼請使用 crontab -e 來重新編輯即可！』如果使用 -r 的參數，是會將所有的 crontab 資料內容都刪掉的！千萬注意了！
系統的 crontab 設定
這個『 crontab -e 』是針對使用者的 cron 來設計的，如果是『系統的例行性任務』時，該怎麼辦呢？是否還是需要以 crontab -e 來管理你的例行性命令呢？當然不需要，你只要編輯 /etc/crontab這個檔案就可以啦！有一點需要特別注意喔！那就是 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個執行檔，但是 /etc/crontab 可是一個『純文字檔』喔！你可以 root 的身份編輯一下這個檔案哩！
基本上， cron 這個服務的最低偵測限制是『分鐘』，所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容』，因此，只要你編輯完 /etc/crontab 這個檔案，並且將他儲存之後，呵呵！那麼 crontab 的設定就自動的會來執行了！
注意：在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項，但是某些原因或者是其他的 Unix 系統中，由於 crontab 是讀到記憶體當中的，所以在你修改完 /etc/crontab 之後，可能並不會馬上執行，這個時候請重新啟動 crond 這個服務吧！
/etc/rc.d/init.d/crond restart
好了，我們來看看 /etc/crontab 這的檔案的內容吧：
[root@test /root]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly <==每小時執行的工作
02 4 * * * root run-parts /etc/cron.daily <==每天執行的工作
22 4 * * 0 root run-parts /etc/cron.weekly <==每星期執行的工作
42 4 1 * * root run-parts /etc/cron.monthly <==每個月執行的工作
分 時日月週使用者 參數 指令

看到這個檔案的內容你大概就瞭解了吧！呵呵，沒錯！這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣！只是有幾個地方不太相同：
    • MAILTO=root：是說，當 /etc/crontab 這個檔案中的例行性命令發生錯誤時，會將錯誤訊息或者是螢幕顯示的訊息傳給誰？由於 root 並無法在用戶端中收信，因此，我通常都將這個 e-mail 改成自己的帳號，好讓我隨時瞭解系統的狀況！
    • 01 * * * * root run-parts /etc/cron.hourly：在註解符號 #run-parts 這一行以後的命令，我們可以發現，五個數字後面接的是 root 喔！沒錯，這一行代表的是『執行的層級為 root 身份』當然囉，你也可以將這一行改寫成其他的身份哩！而 run-parts 代表後面接的 /etc/cron.hourly 是『一個目錄內（/etc/cron.hourly）的所有可執行檔』，這也就是說，每個小時的 01 分，系統會以 root 層級的使用者去 /etc/cron.hourly 這個目錄下執行所有可以執行的檔案！後面的三行也都是類似的意思！你可以到 /etc/ 底下去看看，系統本來就預設了這四個目錄了！你可以將每天需要執行的命令直接寫到 /etc/cron.daily 即可，還不需要使用到 crontab -e 的程式呢！方便吧！
        注意：基本上 /etc/crontab 裡頭支援兩種下達指令的方式，一種是直接以指令型態 下達，一種則是以『目錄規劃』來下達；
        • 指令型態：
          01 * * * * test mail -s test test < /home/test/test.txt
          使用者是 test, 且在每個小時執行一次指令 mail ...
        • 目錄規劃：
          */5 * * * * root run-parts /root/runcron
          建立一個 /root/runcron 的目錄，將要每隔五分鐘執行的『可執行檔』都寫到該目錄下，就可以讓系統每五分鐘執行一次該目錄下的所有可執行檔。
    這樣就可以曉得 run-parts 的用意了吧！此外，與 crontab -e 規劃當中最不相同的就是多了一個『使用者層級』的概念，通常我們都是以 root 的角度來規劃例行性命令，但是總有不需要 root 的指令吧！就可以使用這個層級來規範該程序的使用者屬於誰囉！
    好！你現在大概瞭解了這一個咚咚吧！OK！假設你現在要作一個目錄，讓系統可以每 2 分鐘去執行這個目錄下的所有可以執行的檔案，你可以寫下如下的這一行在 /etc/crontab 中：
      */2 * * * * root run-parts /etc/cron.min
    當然囉， /etc/cron.min 這個目錄是需要存在的喔！那如果我需要執行的是一個『程式』而已，不需要用到一個目錄呢？該如何是好？例如在偵測網路流量時，我們希望每五分鐘偵測分析一次，可以這樣寫：
      */5 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
    沒有了 run-parts 就是代表『一個檔案』的意思啦！
    如何！？建立例行性命令很簡單吧！如果你是系統管理員的話，直接修改 /etc/crontab 這個檔案即可喔！又便利，又方便管理呢！
安全的防護
  • 資源分配不均：
    當大量使用 crontab 的時候，總是會有問題發生的，最嚴重的問題就是『系統資源分配不均』的問題，以我的系統為例， VBird 有偵測流量的資訊，包括：
    • 流量
    • 區域內其他 PC 的流量偵測
    • CPU 使用率
    • RAM 使用率
    • 線上人數即時偵測
    如果每個流程都在同一個時間啟動的話，呵呵！那麼在某個時段時，我的系統會變的相當的繁忙，所以，這個時候就必須要分別設定啦！我可以這樣做：
    [root@test /root]# vi /etc/crontab
    1,6,11,16,21,26,31,36,41,46,51,56 * * * * root ........ <==那個 .. 代表你的指令
    2,7,12,17,22,27,32,37,42,47,52,57 * * * * root ........
    3,8,13,18,23,28,33,38,43,48,53,58 * * * * root ........
    4,9,14,19,24,29,34,39,44,49,54,59 * * * * root ........
    看到了沒？那個『 , 』分隔的時候，請注意，不要有空白字元！（連續的意思）如此一來，則可以將每五分鐘工作的流程分別在不同的時刻來工作！則可以讓系統的執行較為順暢呦！
  • 取消不要的輸出項目：
    另外一個困擾發生在『當有執行成果或者是執行的項目中有輸出的資料時，該資料將會 mail 給 MAILTO 設定的帳號』，好啦，那麼當有一個排程一直出錯（例如 DNS 的偵測系統當中，若 DNS 上層主機掛掉，那麼你就會一直收到錯誤訊息！）怎麼辦？呵呵！還記得 BASH 與 Shell scripts 那一章吧！？直接以『命令重導向』將輸出的結果輸出到 /dev/null 這個垃圾桶當中就好了！
  • 安全的檢驗：
    很多時候被植入木馬都是以例行命令的方式植入的，所以可以藉由檢查 /var/log/cron 的內容來視察是否有『非您設定的 cron 被執行了？』這個時候就需要小心一點囉！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 今天假設我有一個指令程式，名稱為： ping.sh 這個檔名！我想要讓系統每三分鐘執行這個檔案一次，但是偏偏這個檔案會有很多的訊息顯示出來，所以我的 root 帳號每天都會收到差不多四百多封的信件，光是收信就差不多快要瘋掉了！那麼請問應該怎麼設定比較好呢？
    答：
      這個涉及命令重導向的問題，我們可以將他導入檔案或者直接丟棄！如果該訊息不重要的話，那麼就予以丟棄，如果訊息很重要的話，才將他保留下來！假設今天這個命令不重要，所以將他丟棄掉！因此，可以這樣寫：
      */5 * * * * root /usr/local/ping.sh > /dev/null 2>&1
2002/05/30：第一次完成
2003/02/10：重新編排與加入 FAQ
2002/05/30 以來統計人數


Linux 程序與資源管理
最近更新日期：2003/02/10
特別說明 man 用法：
Linux 多人多工程序環境：
背景工作管理： &, [Ctrl]+z, jobs, fg 與 bg, kill,
程序與資源管理： ps, top, free, sar, kill, uname,
程序的優先順序： nice, renice,
訊息管理： dmesg, uptime, who, w, whoami, id, last, date, cal, hostname,
關於網路校時： ntpdate,
本章習題練習
特別說明線上求助：
這部份真的太重要了！不希望大家老是到討論區上面發問一些『可能會被碎碎唸』的問題，所以這裡再次的重複的強調一次！
  • 關於線上 Linux 指令查詢：
    基本上，使用 Linux 最好還是使用文字界面登入比較好！這是因為 X-Window 雖然對於新手來說，他的附加功能蠻強大的，不過，如果單純使用 X-Window 來使用 Linux 的話，那麼跟使用 Window 有何不同呢？！（當然囉，如果您想將 Linux 作為 DeskTop 的話，那就另當別論囉！）由於使用 X-Window 可能具備了很多的後遺症！這是因為 X-Window 只能算是 Linux 下的一套『軟體』，並不是一套『作業系統』，所以 X-Window 對於你的系統的全部功能並不能完全的掌握，並且，由於 X-Window 在 Run 的時候會耗用比較多的資源，這一點對於比較老舊的機器來說是很要命的！例如鳥哥的 P-166 來來去去就只有 64 MB 的記憶體大小，如果一跑 X-Window 的話，那麼我其他的網路服務可能就會有遲滯的情況發生....！基本上，對於有心想要往 Linux 裡面鑽的朋友呀！還是希望您可以多多的使用文字界面來設定您所有的服務，這樣您比較容易清楚 Linux 的主要架構，並且，也能瞭解每一個指令與其相關的設定檔案的相關位置，對於您往後的除錯工作具有相當大的幫助呦！所以囉，有鑑於『幫助節省系統資源』與『幫助使用者更加瞭解 Linux 系統架構』，這裡鳥哥大力的推薦使用文字界面來操作 Linux 咯！

    基本上，比較常用的一般指令（尤其是檔案與目錄的建置方面的指令）已經在前幾章討論過了，有需要的或可以前往一觀呦！。另外一個最重要的地方是，在 Linux 主機上，已經內建各個指令的說明內容了，而且是很詳細的線上說明，你可以使用：

    [root@tsai root]# man command <==command 為你欲查詢的指令名稱
    [root@tsai root]# info command

    在上表中，針對 command 這個指令你可以使用 man 或者是 info 來查詢他的功能與說明，例如你要查尋 ls 這個指令時，你可以輸入： man ls 或 info ls 來查詢一下！適當的利用線上查詢對於你的英文及相關的指令功能有一定程度的幫助喔！就鳥哥使用的情況來看，還是那句老話，『不要害怕看英文』，看久了還是會懂得啦！因為鳥哥的英文也不好（其實是很破），不過努力的看還是可以看的懂得呀！然後，通常我在開始玩 Linux 的時候，都是拿一本英文字典在旁邊查...！
  • 關於線上查詢『參數設定檔案結構』
    此外，如果是一般的參數檔案的話，應該如何查詢其設定方式呢？！呵呵！就輸入底下這個參數吧！

    [root@tsai root]# man 5 passwd
    [root@tsai root]# man passwd

    呵呵！仔細的比較一下上面提供的兩個指令，您會很輕易的發現兩者的不同！怎麼說不同呢？嘿嘿！第二個顯示的其實是 /usr/bin/passwd 這個執行檔的使用方法介紹，但是第一個加上參數 5 的時候，就自動的變成去查詢 /etc/passwd 這個檔案的設定功能了！記得：『在 Linux 當中，使用 man 的時候，參數設定檔的查詢都是以 5 來設定的！』怎麼會是 5 呢？如何設定的，哈哈！那就需要來查看一下 man 這個咚咚的搜尋路徑 (MANPATH) 了！
  • 線上查看 man pages 的搜尋路徑：
    這裡有個有趣的課題要來讓大家想一想，我在查詢指令的用法時，或者是查詢參數檔案的設定時， Linux 到哪裡去找的呀！？呵呵！就是到 MANPATH 這個變數當中搜尋的囉！那麼 MANPATH 在哪裡設定的呢？嗯！很容易找的到的，那就是 /etc/man.conf 這個檔案囉！在該檔案中，當我們執行 man 的時候，系統就會一個一個的去查詢 PATH ，就有點像我們在執行某些執行檔的時候一樣！那麼預設的 MANPATH 在哪裡呀！？就是在：

    • /usr/share/man
    • /usr/local/man

    上面這兩個是大宗啦！好了，那麼如果我安裝了一個新的套件，是以 Tarball 安裝在 /usr/local/newpackes 底下，而且我知道該套件的 man pages 放在 /usr/local/newpackes 底下，那麼我該如何讓該目錄可以被 MANPATH 查詢到呢？很簡單呀！將該目錄寫入 /etc/man.conf 裡頭就可以啦！
  • Linux 主機內的文件資料：
    基本上，你的 Linux 裡面就已經具有相當多的文件資料了，只不過是原文的！好了，你知道該文件資料擺在哪裡嗎？！就是在底下的目錄當中啦！
    • /usr/share/doc
    有空的話多到裡頭去看看！你會看到很多相關的資訊呦！很棒的啦！
  • 注意螢幕前面顯示的訊息：
    另外，很多錯誤訊息基本上都已經提供您解決的方案了！所以在發生錯誤的時候，請千萬記得『讀取一下您螢幕上顯示的錯誤訊息』吧！！這是最容易自救的方式！
  • 留心 /var/log 裡頭的檔案：
    基本上， Linux 預設的情況中，已經將大大小小的事件都寫入 log file ( 登入檔 ) 當中了！這個時候如果您發現您的系統有問題，嗯！到該目錄下去查看一下，差不多都可以解決您的問題呢！留意留意！
Linux 多人多工環境指令：
多人多工
  • 多人環境：Linux 最棒的地方就在於他的多人多工環境了！那麼，什麼是『多人多工』？！在 Linux 上面允許不同的人使用，而且每個人都有其特殊的權限，只有一個人具有至高無上的權力，那就是 root （系統管理員），除了他之外，其他人都必須要受一些限制的！而每個人進入 Linux 的環境設定都可以隨著每個然的喜好來設定( 還記得我們在 BASH 那一章提過的 ~/.bashrc 吧！？對了！就是那個光！ )！咦！ Windows 也可以呀！是沒錯呀！但是要曉得的是，您只能在 Windows 前面才可以進行『登入』的工作，也就是說，每次 Windows 僅允許一個人物登入！當然囉，Windows NT 也同樣的具有這個多人多工的功能！不過，由於 NT 實在是太耗系統資源了，個人認為，還是比不上 Linux 或者是 Unix 家族的網路連線來的順暢呢！
  • 多工行為：我想，使用過 Windows 的人絕對都會遇到這樣的事情：『這個檔案正在使用中，您無法開啟這個檔案！』我哩勒！還得將正在執行當中的程式關掉之後才能開這個中間暫存檔！！而且這個時候還只有我自己一個人在使用呢??受不了??呵呵！ Linux 就不會這樣囉！您可以同時在不同的畫面，同時由不同的人（當然囉，有的是經由 SSH 網路連線過來，有的是直接在螢幕前面的朋友囉！）使用『同一個檔案』，不論是開啟或者是修改，只要您有權限，（還記得前面說過的檔案權限的資料吧？！忘記了？回頭複習去吧！！）就可以使用該檔案！！這個東西可有用的緊！由於鳥哥是很常使用程式的（就是 Fortran 啦，吃飯的工具！），而由於我們有一部主機專門用來工作的，所以配備比較高檔一點（雙 PIII 的 CPU），那麼我就可以同時的進行兩個 compiler 的程序，而且還不會互相的影響，並且資源分配的還蠻均勻的！哈哈！又捨棄掉 Windows 的耗費資源的咚咚，唉呦?怎麼會跑得這麼順暢呀！爽斃了！！
  • 七個基本視窗：在 Linux 當中，預設提供了六個文字界面登入視窗，以及一個圖形界面，你可以使用 [Alt]+[F1].....[F7]來切換不同的終端機界面，而且每個終端機界面的登入者還可以不同人！很炫吧！不像 Windows 一次只能在螢幕前登入一個人！！這個東西可就很有用啦！尤其是在某個程序死掉的時候！
  • 殺掉程序：以前的鳥哥笨笨的，總是以為使用 Windows 98 就可以啦！後來，因為工作的關係，需要使用 Unix 系統，想說我只要在工作機前面就好，才不要跑來跑去的到 Unix 工作站前面去呢！所以就使用 Windows 連到我的 Unix 工作站工作！好死不死，我一個程序跑下來要 2~3 天，唉?偏偏常常到了地 2.5 天的時候， Windows 98 就給他掛點去！當初真的是給他怕死了??後來因為換了新電腦，用了隨機版的 Windows 2000 ，呵呵，這東西真不錯（指對單人而言），在當機的時候，他可以僅將錯誤的程序踢掉，而不干擾其他的程序進行，呵呵！從此以後，就不用擔心會當機連連囉！不過， 2000 畢竟還不夠好，因為有的時候還是會死當！！那麼 Linux 呢？哈哈！更棒了，幾乎可以說絕對不會當機的！因為他可以在任何時候，將某個被困住的程序殺掉，然後在重新執行該程序而不用重新開機！夠炫吧！那麼如果我在 Linux 下以文字界面登入，在螢幕當中顯示錯誤訊息後就掛了?動都不能動，該如何是好！？這個時候那預設的七個視窗就幫上忙啦！你可以隨意的再按 [Alt]+[F1].....[F7] 來切換到其他的終端機界面，然後以 ps -aux 找出剛剛的錯誤程序，然後給他 kill 一下，哈哈，回到剛剛的終端機界面！恩?棒！又回復正常囉！
  • CPU 的工作問題：在早期玩 Windows 98 的朋友應該都曉得的是，Windows 98 預設 CPU 是『一直全速在跑的』，也不能這樣說啦，應該說 windows 98 的 CPU 是一直在通電的！連沒有工作的時候，他的 CPU 使用率還是可以到達 100% ，所以容易造成 CPU 過熱當機的問題！這個情況雖然可以在 NT 獲 2000 中得到解決，或者可以加灌 CPU 省電軟體來降低溫度，但是仍然是怪怪的！而在 Linux 當中根本就沒有這個問題， CPU 沒有使用，就不會有通電，哈哈！省電又沒有高熱呦！不然您可以瞧一瞧咱們這個網站的 CPU 使用率，除了 WWW 線上人數過多的時候會衝到 30% 左右之外，其他時候可是低低的呦！
背景執行
  • 另外一個功能，就是『背景執行』的功夫了。當你輸入

      [root@tsai root]# cp file1 file2 &

    這一串指令的時候，表示將 file1 這個檔案複製為 file2 ，且放置於背景中執行，也就是說執行這一個命令之後，在這一個終端介面仍然可以做其他的工作！而當這一個指令（ cp file1 file2 ）執行完畢之後，系統將會在您的終端介面顯示完成的消息！很便利喔！
多人多工的問題
  • 多人多工確實有很多的好處，但其實也有管理上的困擾，因為使用者越來越多，將導致你管理上的困擾哩！另外，由於使用者日盛，當使用者達到一定的人數後，通常你的機器便需要升級了，因為 CPU 的運算與 RAM 的大小可能就會不敷使用！
好了！廢話說完了！開始來談一談幾個常用的指令吧！
背景工作管理：
有時後我們並不是一定要在螢幕前進行工作的，尤其是某些朋友特別不喜歡同時開啟多個視窗，會容易搞混掉！這個時候就需要使用到背景工作管理的一些指令囉！這些指令是需要同時使用的！如 &, [Ctrl]+z, bg, fg, jobs, 與 kill 等等！此外，最主要利用到『背景工作』的使用者通常是怎麼回是呢？『就是當您的主機已經被限制使用者僅能同時登入一次』的時候，也就是說，你無法用兩個視窗登入到同一部主機，可以做的到嗎？可以呀！目前很多的主機為了節省系統資源，就是這樣搞的，然而這個時候萬一您要進行很多工作的時候，要怎麼辦？！阿！傷腦筋呀！還好！在 Linux 裡面支援了很多這方面的事情！我們可以這樣做呢！ ^_^
學習本章的時候會使用到部分的命令重導向，所以請前往 BASH SHELL 閱讀一番！
  • &
    語法：
    [root @test /root ]# command &
    參數說明：
    範例：
    [root @test /root]# find / -name testing & <==將該執行程序丟到背景執行
    [root @test /root]# fg <==將該程序叫回螢幕前執行
    說明：
    如果想要讓螢幕中的工作( command )在背景底下執行的時後，就使用 & 吧！不過，由於是背景執行的，所以該程序的輸出並不會顯現在螢幕上，所以需要特別留意輸出的資訊的管線重導的問題呦！另外，如何將該程序叫回來螢幕上面執行呢？就使用 fg 即可！當然囉，也可以使用 [Ctrl]+z 來將目前正在進行當中的工作丟到背景底下！那麼擺在背景底下執行有何好處呢？！最大的好處就是不怕被『 [Ctrl]+c 』這個中斷指令來中斷了！！
  • [Ctrl]+z
    語法：
    [root @test /root ]# command
    [root @test /root ]# ^Z <==按下[Ctrl]加上 z 鍵
    參數說明：
    範例：
    [root @test /root]# vi .bashrc
    ^Z <==在 vi 當中的一般模式中鍵入[Ctrl]+z

    [1]+ Stopped vi .bashrc <==這裡會顯示將資料丟到背景當中了！
    [root @test /root]#

    說明：
    如果你正在進行 vi ，而且是在編輯一個重要資料檔案，但是偏偏你想起有的程序需要留意，因此需要退出 vi ，不過，你並不想這個時候儲存退出 vi ，那麼該如何是好呢？！就將資料丟到背景裡面去吧！以上面的例子來說明，當你在執行編輯 /root/.bashrc 這個檔案時，想要暫時離開，那麼就直接在 vi 的『一般模式』當中輸入[Ctrl]加上 z （小寫）按鍵，，那麼系統就會告訴你『工作項目 [1] 在背景當中，而其狀態為[Stopped]亦即是停止的狀態！』，並且會離開 vi 進入到 command line 當中，等待使用者輸入指令！這個咚咚很好用的呦！那如果想要回到 vi 呢？！呵呵，就需要使用 jobs 配合 bg 或 fg 囉！
  • jobs
    語法：
    [root @test /root ]# jobs
    參數說明：
    範例：
    [root @test /root]# vi .bashrc
    ^Z <==在 vi 當中的一般模式中鍵入[Ctrl]+z

    [1]+ Stopped vi .bashrc <==這裡會顯示將資料丟到背景當中了！
    [root @test /root]# jobs
    [1]+ Stopped vi .bashrc <==顯示有一個工作在背景下，狀態為停止。

    說明：
    剛剛我們提到的 & 與 vi 在背景下執行，那麼你怎麼知道目前你所進行的背景底下的工作有哪些呢？！很簡單，就是使用 jobs 就可以觀察到啦！以上式為例，使用 jobs 就可以知道目前的背景中工作項目有 vi .bashrc 這一項！那個中括號（[]）裡面的數字就是 jobs 的代號囉！
  • fg 與 bg
    語法：
    [root @test /root ]# fg %number
    [root @test /root ]# bg %number
    參數說明：
    % ：後面接數字，表示 jobs 的工作代號
    number ：就是工作代號
    範例：
    [root @test /root]# find / -name test
    ^Z
    [1]+ Stopped find / -name testing
    [root @test /root]# vi .bashrc
    ^Z
    [2]+ Stopped vi .bashrc <==這裡會顯示將資料丟到背景當中了！
    [root @test /root]# jobs
    [1]- Stopped find / -name testing
    [2]+ Stopped vi .bashrc
    [root @test /root]# bg %1
    [root @test /root]# jobs
    [1]- Running find / -name testing &
    [2]+ Stopped vi .bashrc
    [root @test /root]# fg %2
    進入 vi 畫面囉！
    說明：
    OK！那麼如何來瞭解 jobs 的背景（bg）與前景（fg）的管控呢？！這裡請注意囉！這個 bg 是將『背景當中的程式由 stopped 變成 Running 』的一個手段，至於 fg 『則是將背景中的指令移到螢幕上來動作』，那你怎麼知道你的背景當中有多少的工作（jobs）在進行呢？！就是執行 jobs 來看看背景程式的代號囉！然後以 bg %number 來將資料在背景中執行，而 fg %number 則是將代號為 number 的程式移動到螢幕前面動作！
  • kill
    語法：
    [root @test /root ]# kill -sigal %number
    參數說明：
    %number ：背景工作的代號，可使用 jobs 查詢
    signal
    -1 ：重新讀取一次參數設定檔(類似 reload )
    -2 ：使用者中斷該工作，類似 [Ctrl]+c 來中斷一個工作
    -9 ：立刻殺掉一個工作，不論該工作是否為僵屍程序
    -15 ：停止一個工作（這是預設值）
    範例：
    [root @test /root]# jobs
    [1]+ Stopped vi .bashrc
    [root @test /root]# kill -9 %1
    說明：
    如果想要直接殺掉背景工作中的項目，可以直接輸入 kill 來殺掉！但是由於預設是將該程序停止而已，不見得一定可以將該工作清除乾淨，因此需要送出一個訊號，告訴系統你就是要砍掉該程序！這個時候就使用 kill -9 吧另外， -15 稱為 terminal ，是以一般的正常程序砍掉一個 jobs ，而 –9 有『強制終止』的意思，所以可以控制殭屍程序。
    • 程序與資源管理：
    終於來到最嚴重的系統管理員的擔心部分！一個被入侵的 Linux 系統最容易被修改的是什麼？想必您一定有聽說過所謂的『木馬程式』吧！所謂的木馬程式就是以一些小指令，由背景執行的方式常駐在系統當中，而當你的系統被入侵者入侵之後，對於您 Linux 主機上面的資訊，呵呵！就是由這些木馬程式傳送到入侵者手中的！所以囉！良好的管理程序的習慣，也是系統管理員必須要做的功課呢！好了！我們必須要瞭解的是『什麼是程序』呀！？說穿了，這也沒有什麼好神秘的，『程序就是您在執行或者啟動一個事件的時候，系統會發給他的一個執行序！』換句話說，當您啟動了一個指令或者是 shell 的時候，系統就會給這個事件或者是 shell 一個代碼，而如果有任何的其他服務要使用到你目前這程序的資源時，就會自動的跑來瞭解一下您的 PID （ process ID, 就是程式序囉！），底下我們使用 ps 與 top 這兩個最常用來觀察系統程序工作狀態的指令來瞭解一下什麼是程序啦！
    另外，我們還得需要來瞭解一下，什麼是『父程序, PPID』與『子程序, child precess』呢？！呵呵！說穿了也沒有什麼了不起！就是『子程序是由父程序執行而得的一個程序，當子程序死掉時，父程序通常不會被影響，但是當父程序死掉時，則所有子程序將一併結束！』常常很多朋友都在反應：『唉呦！我的 sendmail 怎麼關都關不掉，真是見鬼了！』呵呵！這個時候您就得告訴他囉：『唉呦！你關掉的不是父程序呀！只是一些子程序，由於父程序還存活著，所以子程序就會不動的湧出囉！』
  • ps
    語法：
    [root @test /root ]# ps -aux
    參數說明：
    a :選擇所有的程序列出
    u :所有使用者的程序均列出
    x :所有 tty 的程序列出
    範例：
    [root @test /root]# ps -aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.1 1384 468 ? S Mar31 0:05 init [3]
    root 2 0.0 0.0 0 0 ? SW Mar31 0:00 [keventd]
    root 3 0.0 0.0 0 0 ? SWN Mar31 0:00 [ksoftirqd_CPU0]
    root 4 0.0 0.0 0 0 ? SW Mar31 0:11 [kswapd]
    root 5 0.0 0.0 0 0 ? SW Mar31 0:00 [bdflush]
    root 6 0.0 0.0 0 0 ? SW Mar31 0:00 [kupdated]
    root 130 0.0 0.0 0 0 ? SW Mar31 0:00 [kjournald]
    root 131 0.0 0.0 0 0 ? SW Mar31 0:01 [kjournald]
    root 132 0.0 0.0 0 0 ? SW Mar31 0:03 [kjournald]
    root 133 0.0 0.0 0 0 ? SW Mar31 0:12 [kjournald]
    root 482 0.0 0.2 1444 528 ? S Mar31 0:03 syslogd -m 0
    ........
    說明：
    這是用來查詢目前主機環境中，在背景執行的相關程序！我通常使用『 ps -aux 』這個參數來列出所有的資訊以提供自己檢查程序的問題！在上面的程序列出當中，說明如下：
    • USER：說明該程序是屬於哪一個人的；
    • PID：該程序的代號；
    • %CPU：代表該程序使用了多少 CPU 資源；
    • %MEM：代表該程序使用了多少的 RAM ；
    • VSZ, RSS：佔去的 ram 的大小（ bytes ）；
    • TTY：是否為登入者執行的程序？若為 tty1-tty6 則為本機登入者，若為 pts/?? 則為遠端登入者執行的程序
    • STAT：該程序的狀態，( R )為可執行的，( S )為該程序正在睡眠中，就是沒有執行了，( T )正在偵測或者是停止了，( Z )僵屍程式，就是 zombie 死掉的程式啦！需要以 kill 除去囉！
    • START：該程序開始的日期；
    • TIME：該程序跑了多久的時間？
    • COMMAND：該程序的內容啦！
    這是一個很有用的指令，尤其是在偵測系統的狀態時！不過，這個程式也是入侵者最喜歡修改的執行程式了！因為他可以寫一個 script 來騙 root 呀！讓某些木馬程式沒有辦法顯示出來∼∼重要的很！！善加利用吧！此外，那個 PID 是挺重要的資訊呦！因為在後面的 kill 就是藉由瞭解 PID 來進行程序的刪除的動作的！
  • top
    語法：
    [root @test /root ]# top
    參數說明：
    在執行 top 的程式中，可以輸入下面的字元以進行排序
    A ：以 age 亦即是執行的先後程序進行排序
    T ：由啟動的時間排序
    M ：以所佔的 memory 的大小排序
    P ：以所耗用的 CPU 資源排序
    範例：
    [root @test /root]# top
    11:55pm up 8 days, 7:40, 1 user, load average: 0.22, 0.14, 0.10
    71 processes: 69 sleeping, 2 running, 0 zombie, 0 stopped
    CPU states: 24.6% user, 3.7% system, 0.0% nice, 71.5% idle
    Mem: 255892K av, 222300K used, 33592K free, 0K shrd, 48084K buff
    Swap: 289128K av, 8184K used, 280944K free 110472K cached

    PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
    9898 root 9 0 5976 5976 1364 S 5.5 2.3 0:00 mrtg
    4744 apache 14 0 5312 5052 3764 S 2.1 1.9 0:16 httpd
    9189 apache 14 0 4520 4256 3752 S 1.9 1.6 0:01 httpd
    9187 apache 10 0 4544 4276 3800 S 1.7 1.6 0:01 httpd
    9212 mysql 9 0 7280 4772 2716 S 0.7 1.8 0:00 mysqld
    9888 root 12 0 1064 1064 832 R 0.7 0.4 0:00 top
    4842 mysql 10 0 7280 4772 2716 S 0.5 1.8 0:06 mysqld
    9218 mysql 10 0 7280 4772 2716 S 0.5 1.8 0:00 mysqld

    說明：
    使用 ps 是一個不錯的管理工具，但是 ps 畢竟不是動態的，若使用 top 的話，呵呵！可以用動態（每五秒鐘更新一次）的方式來偵測程序的進行！而且在程序進行中，還可以使用 P 來以 CPU 耗用資源排序、使用 M 來以 memory 佔用大小排序等等，非常好用的管理工作！有空的話多以 man top 來玩一玩吧！
  • free
    語法：
    [root @test /root ]# free
    參數說明：
    -k ：以 KBytes 來顯示記憶體
    -m ：以 MBytes 來顯示記憶體
    範例：
    [root @test /root]# free
    total used free shared buffers cached
    Mem: 255892 222076 33816 0 49072 112272
    -/+ buffers/cache: 60732 195160
    Swap: 289128 7572 281556
    說明：
    另一個觀看系統資源的就是使用 free 來檢查目前記憶體的使用情況囉！在上面顯示的是，我有 256 MB 的時體記憶體，也有大約 270 MB 的 swap （就是虛擬記憶體啦！）大小。
  • sar
    語法：
    [root @test /root ]# sar [-u] [-r] 秒數 次數
    參數說明：
    -u ：看 CPU 使用的情況
    -r ：看 memory 使用的情況
    秒數：幾秒鐘觀測一次？
    次數：共觀測幾次
    範例：
    [root @test /root]# sar -u 1 3
    12:10:28 AM CPU %user %nice %system %idle
    12:10:29 AM all 0.00 0.00 0.00 100.00
    12:10:30 AM all 0.00 0.00 0.00 100.00
    12:10:31 AM all 12.00 0.00 1.00 87.00
    Average: all 4.00 0.00 0.33 95.67
    [root @test /root]# sar -r 1 3
    12:11:11 AM kbmemfree kbmemused %memused kbmemshrd kbbuffers kbcached kbswpfree kbswpused %swpused
    12:11:12 AM 24416 231476 90.46 0 51068 112536 281556 7572 2.62
    12:11:13 AM 24420 231472 90.46 0 51068 112536 281556 7572 2.62
    12:11:14 AM 24392 231500 90.47 0 51068 112540 281556 7572 2.62
    Average: 24409 231483 90.46 0 51068 112537 281556 7572 2.62
    說明：
    鳥哥真的是很喜歡使用 sar 來看系統的資源呢！真的是太方便了！比較常用的是 CPU 與 RAM 的觀察，當然囉，還可以觀察硬碟的 I/O 變化！！在上面的例子中，觀察 CPU 的現象中，可以發現 CPU idle 的情況很長！不錯！另外，在 RAM 的觀測中，比較常使用的是 %memused （使用的百分比）及 %swpused （虛擬記憶體使用的百分比），很方便吧！一覽無遺呦！事實上， VBird 也已經以 sar 來作為 MRTG 繪製圖表的一個工具，很是方便的！不過，比較麻煩的是， Mandrake 預設並沒有安裝這個套件，如果您有需要的話，可以到相關網站上面下載 sysstat 這個套件呢！
  • kill
    語法：
    [root @test /root ]# kill -signal PID
    參數說明：
    那個 -signal 跟上面的 kill 一樣：
    -9 ：殺掉該程序
    -15 ：停止該程序！
    範例：
    [root @test /root]# kill -9 2380
    說明：
    要殺掉一個程序的時後，自然需要知道該程序的 PID 才行！另外，需要注意的是，由於很多的程序都有附屬關係，例如 sendmail 可能會同時開啟相當多的程序在工作（如果郵件量很大的時後！）所以，如果砍掉的是『子程序』是無法將整個程序殺掉的！而要知道該程序的代號（PID）自然就得善用 ps, top 等工具囉！ 此外，您常常會發現在一些 scripts 裡面，會寫著 kill –1 PID 的字樣，那個 –l 是讓該 PID 重新讀取一次設定檔的意思，最常發現在 syslogd 這個 daemon 呢！我們在後頭再來提一提這個重要的咚咚！
  • uname
    語法：
    [root @test /root ]# uname [-apnr]
    參數說明：
    -a ：所有的系統資訊均列出
    -p ：列出 CPU 資訊
    -n ：列出 host name
    -r ：列出 kernel 版本資訊
    範例：
    [root @test /root]# uname -a
    Linux tsai.adsldns.org 2.4.18 #2 Mon Mar 25 21:51:51 CST 2002 i586 unknown
    說明：
    想要知道你的系統資訊嗎？包括你的核心版本、主機名稱、CPU 資訊等等！使用 uname 就可以達到啦！另外，如果對於你的 CPU 有興趣的話，那麼不妨在 /proc 底下看看：
    [root @test /root ]# more /proc/cpuinfo
    processor : 0
    vendor_id : AuthenticAMD
    cpu family : 5
    model : 9
    model name : AMD-K6(tm) 3D+ Processor
    stepping : 1
    cpu MHz : 400.917
    cache size : 256 KB
    fdiv_bug : no
    hlt_bug : no
    f00f_bug : no
    coma_bug : no
    fpu : yes
    fpu_exception : yes
    cpuid level : 1
    wp : yes
    flags : fpu vme de pse tsc msr mce cx8 pge mmx syscall 3dnow k6_mtrr
    bogomips : 799.53
    看到了嗎？！馬上就知道你的 CPU 的 type 囉！
    • 程序的優先順序： nice, renice,
    好了！接著下來我們來談一談『我哪一個程序可以最優先被處理！？』呵呵！這是個很重要的課題！怎麼說呢？因為在你的系統當中，通常『同一個時間一定有多個程序會佔用到 CPU 的資源，哪麼那個程序比較重要，讓 CPU 可以先跑該程序，就是一個重要的課題了！』您說是吧！好了，如果您還記得 ps 這個指令的話，那麼來看一看加入 ps -l 這個功能所顯示出來的訊息吧！
    [root @test /root ]# ps -l
    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
    100 S 0 5624 5606 0 70 0 - 608 wait4 pts/0 00:00:00 bash
    000 R 0 6944 5624 0 76 0 - 769 - pts/0 00:00:00 ps

    注意看到上面那些資訊：

    • UID 代表執行者的身份；
    • PID 代表這個程序的代號；
    • PPID 代表這個程序是由那個程序發展出來的，亦即是父程序；
    • PRI 代表這個程序『可被執行的優先順序』越小越早被執行！
    • NI 代表這個程序的 nice 值！
    好啦！這裡有兩個奇怪的資訊，一個是 PRI 一個是 NI 這兩個鬼東西！嗯！ PRI 還容易理解，就是該程序被 CPU 執行的先後順序啦！所以當 CPU 忙線中的時候，那麼 PRI 值月小的就會被越快執行！那麼 NI 是什麼？呵呵！那個就是 nice 值啦！那麼什麼是 nice 值呢？就是『系統可被執行的修正數值！』如前面所說的，由於 PRI 是越小越快被執行，而由於我們加入 nice 值之後，將使得 PRI 變為：
    • PRI(new) = PRI(old) + nice
    呵呵！如此一來，則當 nice 值為負值的時候，那麼該程序將會提前被執行！就是變的優先處理囉！這個概念需要特別的注意！另外，這裡也需要注意的是：『只有具有 root 權限的身份者，可以將程序的 nice 調為負值』一般而言，我們可以這樣說：
    • 一般使用者可用 nice 值 ： 0 ~ 19
    • root 管理員可用 nice 值： -19 ~ 19
    沒錯！就是這樣！底下我們來談一談，如何在：
    1. 程序一開始就給予一個 nice 值；與
    2. 改變正執行中的程序之 nice 值
    • nice
      語法：
      [root @test /root ]# nice [-n number] command
      參數說明：
      -n ：就是後面那個 number 即為 nice 值！
      範例：
      [root @test /root]# nice -n -5 find / -name core > /tmp/core
      說明：
      就如同前面說的， nice 是用來調整程序的執行優先順序！這裡只是一個執行的範例罷了！通常什麼時候要將 nice 值調大呢？
      • 一些非重要的程序之進行：例如備份工作！由於備份工作相當的耗系統資源，這個時候就可以將備份的指令之 nice 值調大一些，可以使系統的支援分配的更為公平！
    • renice
      語法：
      [root @test /root ]# renice [number] PID
      參數說明：
      範例：
      [root @test /root]# ps -aux
      [root @test /root]# renice 5 234
      說明：
      這個 renice 的功能就不太一樣了！由於 renice 是『將一個正在進行當中的程序的優先順序降低』，所以必須要：
        先取得該程序的 PID 才行！
      所以囉，通常 renice 都與 ps 相互配合才對！先找處某個程序的 PID 之後，才來重新的設定其 nice 值！
    訊息管理：
    想要知道開機的時候 Linux 偵測主機的訊息嗎？想知道目前有哪些人在你的機器上嗎？想知道目前的時間嗎？！想瞭解最近某個人登入的時間嗎？！嗯！這都需要使用到一些訊息管理的程式呦！像是 last, who, dmesg 等等！
  • dmesg
    語法：
    [root @test /root ]# dmesg
    參數說明：
    範例：
    [root @test /root]# dmesg | more
    說明：
    在開機的時候你會發現有很多的訊息出現吧，例如 CPU 的形式、硬碟、光碟型號及硬碟分割表等等。但是訊息都是『刷』的一聲就跑過去了！這些訊息有時候對於系統管理員是很重要的，因為他提供了系統的資訊呀！要看這些訊息你可以用 dmesg 這個指令來觀看！加上 |more 的原因是因為訊息太多了，所以可以加入這個管線指令來使畫面暫停！

  • uptime
    語法：
    [root @test /root ]# uptime
    參數說明：
    範例：
    [root @test /root]# uptime
    11:27pm up 9 days, 7:12, 1 user, load average: 0.07, 0.12, 0.14
    說明：
    知不知道你的 Linux 主機已經開機多久了？還有，過去 1, 5, 15 分鐘的系統平均 loading 是多少呢？呵呵！使用 uptime 就對了！在上面的例子中，執行 uptime 之後，顯示目前時間是 11:27pm, 而系統已經開機了 9 天又 7:12 之多，目前有一個使用者在線上，過去 1, 5, 15 分鐘系統平均負荷為 0.07, 0.12, 0.14！
  • who & w
    語法：
    [root @test /root ]# who
    [root @test /root ]# w
    參數說明：
    範例：
    [root @test /root]# who
    root pts/0 Aug 2 20:43

    [root @test /root]# w
    8:48pm up 4 days, 5:08, 1 user, load average: 0.00, 0.00, 0.00
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root pts/0 192.168.1.2 8:43pm 0.00s 0.38s ? -

    說明：
    這是用來視察目前在系統上的使用者指令，你也可以使用 w 這個指令來下達動作。基本上，who 與 w 的功能是相同的，只是 who 僅列出使用者名稱與登入時間，至於 w 則會列出使用者的
    • 來源位址（IP）：就是 FROM 那一項即是IP；
    • 登入時間：即是 LOGIN@ 那一項；
    • 工作項目：就是 WHAT 那一項！
    此外，不知道你有沒有發現，在使用 w 的時候，開頭會有一個訊息，『 8:48m up 4days ....』那個是 uptime 的輸出結果！
  • whoami
    語法：
    [root @test /root ]# whoami
    參數說明：
    範例：
    [root @test /root]# whoami
    test
    說明：
    如果您是一位稱職的系統管理員，那麼您應該曉得盡量不要使用 root 登入系統這件事吧！那麼如何管理系統呢？！可以使用 su 或者是 sudo 來管理啊！通常我是比較習慣使用 su 啦！ OK！那麼您已經是 root 的身份了，不過，可能由於執行程序的關係，常常會忘了到底自己的真實身份，這個時候 whoami 就可以解救你啦！如上面所示，雖然我的身份是 root ，不過，實際上我是 test 的啦！使用 su 變換身份而已！！
  • last
    語法：
    [root @test /root ]# last
    參數說明：
    -number ：number 為數字，如果您的登入訊息太多了，可以使用這個指令！
    範例：
    [test @test /root]# last -5
    test pts/0 192.168.1.2 Tue Apr 9 20:34 - 20:35 (00:01)
    test pts/0 192.168.1.2 Tue Apr 9 20:14 - 20:30 (00:15)
    test ftpd21546 192.168.1.2 Tue Apr 9 02:55 - 03:06 (00:10)
    test ftpd15813 192.168.1.2 Tue Apr 9 01:20 - 01:21 (00:00)
    test pts/0 192.168.1.2 Mon Apr 8 20:14 - 00:27 (04:13)
    wtmp begins Tue Apr 2 01:12:26 2002
    說明：
    要知道有沒有被入侵，常常使用的就是 last 這個指令囉！包括 ftp, telnet, ssh 都會被紀錄在這個訊息當中，不過目前是只有記錄一個月的量！這個指令真的是不錯用的！常常可以發現是否有不正常的人物登入資訊呢！
  • date
    語法：
    [root @test /root ]# date [-s] [-R]
    [root @test /root ]# date +[format]
    參數說明：
    -s ：用來設定 Linux 主機時間的參數，如果你的主機時間不對，用這個就對啦！
    -R ：如果發現你的語系是中文的，在純文字模式底下用這個試試看
    +[format]
    %a ：星期幾
    %b ：月份名稱
    %d ：日期
    %y ：年份
    ：還有很多的參數，請使用 man 自行查詢
    範例：
    [root @test /root]# date +%a" "%b" "%y
    Wed Apr 02
    [root @test /root]# date -s 04/10/2002 <==改變日期
    [root @test /root]# date -s 02:02:00 <==改變時間
    [root @test /root]# clock -r <==檢查 BIOS 裡面的時間
    [root @test /root]# clock -w <==將目前 Linux 的時間寫到 BIOS 裡面去！
    說明：
    date 簡單的用法是只能查看時間的，不過，更廣義的用法是可以搭配很多種樣式來進行時間輸出的紀錄！此外，在 Linux 底下要更改時間，呵呵呵呵！也需要使用到 date 呦！不過，千萬記得， date 改完時間後，還要使用 clock 將時間記錄在 BIOS 裡面才算是完成了時間修改呦！
  • hostname
    語法：
    [root @test /root ]# hostname
    參數說明：
    範例：
    [test @test /root]# hostname
    test.adsldns.org
    說明：
    很簡單吧！就是用來查看你主機名稱的指令就是了！
    • 關於網路校時： ntpdate
    您或許偶而會發現這樣的問題：咦！我的 Linux 主機怎麼經過一段時間的運作之後，時間會跑掉？而且有的時候，還會跑掉的蠻嚴重的！這是因為我們 Linux 系統的時間記錄器與 BIOS 的時間記錄器，可能與真實的、我們使用的時間有點差異，這種差異在短時間內差異性並不明顯，但若延長到一年、兩年以上，那麼日積月累下來，呵呵！時間差異性甚至可以達到小時?因此，這個時候以網路上合法的而且具有公信力的時間伺服器( time server )來校正你的 linux 主機時間，就有其必要性囉！那麼該如何校正呢？很簡單啦！由於 time server 已經在網路上面可以找到啦，台灣地區可以使用底下這一部 time server ：
    time.stdtime.gov.tw
    那麼網路校時使用哪一個 port 呢？就是 123 這個 port ，而使用的軟體就是 ntpdate 這一支程式！在 Mandrake 當中，很抱歉的，預設還是沒有安裝這個套件，所以，請趕快將 CD 拿出來，放入 CDROM ，並且 mount 上他，然後以十八章教的 RPM 程式安裝他吧！之後就可以使用囉！

    基本上，網路校時需要兩個步驟：

    1. 由 time.stdtime.gov.tw 取得最新的時間，並即時更新 Linux 系統時間；
    2. 更改 BIOS 的時間。
    所以整個方法只要執行兩行即可搞定：
    [root @test root]# ntpdate time.stdtime.gov.tw
    [root @test root]# clock –w

    如果還想要讓系統自動去更新時間的話，哈哈！對啦！那個 /etc/crontab 不要忘記了！將底下這一行寫入 /etc/crontab 當中：

    10 5 * * 0,3 root /usr/sbin/ntpdate time.stdtime.gov.tw; clock -w
    這樣一來，每星期三、日的五點，系統就會自動的去更新您 Linux 的時間囉！讚！
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • 我今天想要查詢 /etc/crontab 與 crontab 這個程式的用法與寫法，請問我該如何線上查詢？
      答：
        查詢 crontab 指令可以使用 man crontab 或 info crontab ，至於查詢 /etc/crontab ，則可以使用 man 5 crontab囉！

    • 我要如何查詢 crond 這個 daemon 的 PID 與他的 PRI 值呢？
      答：
        ps –aux | grep crond 即可查到！

    • 我要如何修改 crond 這個 PID 的優先執行序？
      答：
        在例題二當中我可以找到 crond 的 PID ，藉由 renice –n PID 即可降低 nice 值，亦即提高優先執行的順序！

    • 我是一般身份使用者，我是否可以調整不屬於我的程序的 nice 值？此外，如果我調整了我自己的程序的 nice 值到 10 ，是否可以將他調回 5 呢？
      答：
        不行！一般身份使用者僅能調整屬於自己的 PID 程序，並且，只能將 nice 值一再地調高，並不能調低，所以調整為 10 之後，就不能降回 5 囉！

    • 我要怎麼知道我的網路卡在開機的過程中有沒有被捉到？
      答：
        可以使用 dmesg 來視察！
    2002/06/28：第一次完成
    2003/02/10：重新編排與加入 FAQ
    2002/04/30以來統計人數


Linux 開機流程分析
最近更新日期：2003/02/10
開機流程分析： /etc/sysconfig
變換預設的登入模式
Lilo ： 設定檔 /etc/lilo.conf, 以預設的 lilo.conf 新增一個開機檔, 安裝 lilo ,一些問題的解決之道
Grub ： 設定檔 /boot/grub/menu.lst, 安裝 grub 在系統中, 開機手動設定選項
可開機磁片與救援磁片製作
本章習題練習
開機流程分析
開機不是只要按一下電源鈕而關機只要關掉電源鈕就可以了嗎？有何大學問？話是這樣沒錯啦，但是由於 Linux 是一套多人多工的作業系統，你難保你在關機時沒有人在線上，如果你關機的時候碰巧一大群人在線上工作，那會讓當時在線上工作的人馬上斷線的！那不是害死人了！一些資料可以無價之寶哩！另外，與 DOS 環境不同的是， Linux 在執行的時候，雖然你在畫面上只會看到黑壓壓的一片，完全沒有任何畫面，但其實他是有很多的程式在背景底下執行的，例如郵件程式、瀏覽器主機程式等，你如果隨便關機的話，是很容易傷害硬碟及資料傳輸的動作的！所以在 Linux 下關機可是一門大學問喔

既然開機是很嚴肅的一件事，呵呵，那我們來瞭解一下整個開機的過程吧！好讓大家比較容易發現開機過程裡面發生錯誤的地方，與解決之道！不過，由於開機的過程中，那個 Boot Loader 使用的軟體可能不一樣，例如 Mandrake 9.0 已經同時提供 Lilo 與 Grub 這兩個開機管理程式，雖然 lilo 與 grub 的啟動過程或許有點不太相同，但是他的原理則都是一樣的哩！這裡我們先介紹較老牌的 Lilo 囉！ Lilo 是什麼？！簡單的說，他是 LInux LOader 的縮寫，就是 Linux 開機時候載入的咚咚就對了！這東西可是控制了你的多重開機的命脈！底下的篇幅會再分別介紹這兩套開機管理程式！底下先開始來談談 Linux 是如何開機的呢？基本的流程為：
  1. 載入 BIOS 的硬體資訊；
  2. 讀取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)開機資訊；
  3. 載入 Kernel 的作業系統核心資訊；
  4. Kernel 執行 init 程式並取得 run-level 資訊；
  5. init 執行 /etc/rc.d/rc.sysinit 檔案；
  6. 啟動核心的外掛式模組 (/etc/modules.conf)；
  7. init 執行 run-level 的各個批次檔( Scripts )；
  8. init 執行 /etc/rc.d/rc.local 檔案；
  9. 執行 /bin/login 程式；
  10. 登入之後開始以 Shell 控管主機。
大概的流程就是上面寫的那個樣子啦，而每一個程序的內容主要是在幹嘛呢？底下就分別來談一談吧！
  • 尋找 BIOS 載入硬體資訊：
    稍微有 PC 硬體經驗的人們大概都知道 BIOS ( Basic Input/Output Setup ) 的作用！他是第一個被載入電腦的資料！你主機的 CPU 資料、開機順序、硬碟大小、晶片組工作狀態、PnP 的開啟與否、記憶體的時脈等等等...這都記錄在 BIOS 當中！所以啦，開機之後，系統會先去找這個東西；
  • 可開機硬碟的 MBR 讀取 Kernel loader：
    再來呢？呵呵！當然就是硬碟的開機資料囉！由於個人電腦的系統在讀完 BIOS 之後，會先去讀取第一個開機硬碟的第一個磁區（就是 master boot record, MBR 囉！），還記得這個 MBR 嗎？嗄！忘記了？趕緊回到第二篇好好的再複習一遍ㄋㄟ?。而這個磁區主要就是在記錄開機的資訊！還記得上面提到的 Lilo 及 grub 吧？他的紀錄就是在這裡囉！所以囉，這個時候 Lilo 紀錄的資訊就會被讀出來，系統並依 Lilo 的資訊去不同的系統開機，這也就是多重開機設定的地方啦。

    好了，先再來回憶一下，如果你是以 grub 程式開機的話，那麼在開機的時候會顯示什麼資料呢？呵呵！會顯示蠻多的開機選單，沒錯?就是『選單』，然後選擇了你的選擇項目之後，系統就會跑到該磁區去讀取該作業系統的核心囉！呵呵！所以一個好的 boot loader 會具有兩個功能，就是：

    • 選單功能 ( menu )
    • 指向功能 ( pointer )

    那麼為何要有 loader 呢？我想，我們得先來探討一下這個話題才行！要探討之前先來瞭解一下，曉不曉得 Windows 與 Linux 的檔案格式一不一樣？！呵呵！當然不一樣對不對，好了，那麼再來說一說，請問，你的電腦怎麼知道你的硬碟的資料是什麼系統？哈哈！那就是 loader 的主要功能囉！在你能使用系統之前，一定需要載入核心對吧！？但是怎樣讓你的硬體認識核心呢？那就是 kernel loader 的主要功能了！所以這裡需要提出的是， Linux 的 loader ( lilo 或 grub ) 是可以認識 windows 的核心檔案的，但是 Windows 的 loader 卻不認識 Linux 的核心檔案，因此，作為一個多重開機的設定 loader ，就無法使用 Windows 所提供的 loader 囉！由於需要讓系統認識你的 kernel ，因此，就需要 kernel loader 啦！這樣想就對啦！

    這一部份的資訊我們在後續的章節會再提及！
  • 載入核心( Kernel )：
    好了，等我們在 grub 的選單中選擇了 Linux 這個系統，然後主機跑到 Linux 所在的硬碟之下，就開始將他的核心載入囉。在 Linux 的系統下，通常開機的核心都擺在 /boot 底下，因此，這個時候的 boot loader 就會到 /boot 去尋找相關的核心。我們的 kernel 名稱通常就是 /boot/vmlinuz-xxxx 的格式，目前 Mandrake 9.0 的核心版本為 2.4.19，而 Mandrake 自行釋出的版本為 2.4.19-16mdk ，所以，使用 uname –r 會出現 2.4.19-16mdk 呦！然後 MDK 9.0 預設核心檔案就是： /boot/vmlinuz-2.4.19-16mdk 這一個！好了，載入這個檔案再往下繼續吧！
  • 核心執行 init 並由 /etc/inittab 取得系統登入狀態：
    核心載入之後，由核心執行的第一個程式就是 /sbin/init 囉！而這個程式第一個目標當然就是確定主機是要以怎樣的情況登入！這個時候就必須要以 /sbin/init 來載入 /etc/inittab 的資訊啦！而 Linux 共有幾種登入模式呢？嗯！這裡似乎有需要說明一下 Linux 有哪些登入的狀態！如果你進入 Linux 的 /etc/inittab 檔案的話( 可以使用 vi 啦 )，你應該會看到如下的資訊：

    [root @test /root]# vi /etc/inittab
    # 0 - halt (Do NOT set initdefault to this) 關機
    # 1 - Single user mode 單人使用（系統有問題時候的登入狀況）
    # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多人但無網路
    # 3 - Full multiuser mode 文字界面登入的多人系統
    # 4 - unused 系統保留
    # 5 - X11 X-Windows 圖形界面登入的多人系統
    # 6 - reboot (Do NOT set initdefault to this) 重新開機
    #
    id:3:initdefault:

    上面顯示的就是目前可以登入的狀態了（就是 run-level 啦！），共有 0?6 的登入狀態，其中，我們比較常使用的是 3 與 5 ， 因為我們需要 Linux 是多人多工的情況，而較常登入的狀態就是文字與圖形界面啦！所以這裡需要設定成 3 或者是 5 ，千萬不要設定成 0 或者是 6 喔！不然系統會一直直接重新開機或者是直接關機....預設的系統登入在上面這個表格的最底下一行紀錄著！就是『id:3:initdefault 』那一行！注意喔！因為 VBird 預設是以文字界面來登入，所以才會是 3 ，如果你要改成圖形界面登入的話（請確定你的 X-windows 沒有問題），那麼就將 /etc/inittab 裡面的上面那一行，將 3 改成 5 即可囉！

    那麼什麼是『單人維護模式 ( run-level 為 1 )』？如果你有玩過 Windows 的話，那麼你在開機的時候如果按下 F8 時，不是會出現一些什麼『安全模式』啦、『正常開機』啦或『 MS-DOS 模式』等等的進入 Windows 的狀態嗎？尤其是當你不正常關機的時候， Windows 預設就會以『安全模式』來啟動 Windows 囉！Windows 的『安全模式』幾乎不載入一些複雜的模組，讓你的 Windows 一定可以開機成功！那麼 Linux 的維護模式狀態即是使用單人模式（ 就是 run_level 為 1 啦！）所以說， Linux 的登入情況是如何呢？呵呵！沒錯，就是在這裡載入的啦！
  • init 的第一個執行內容 /etc/rc.d/rc.sysinit ：
    確定了登入狀態之後，再來當然就是需要將主機的資訊給他讀進去 Linux 系統囉！而 Linux 系統的第一個資料內容就是 /etc/rc.d/sysinit 這個檔案啦！如果你有空進入這個檔案去看看的話，會發現這個檔案的內容包括了==>設定預設路徑（ PATH ）、設定主機名稱、執行 /etc/sysconfig/network 所記錄的網路資訊、掛載 /proc 這個保存在記憶體當中的主機基本訊息、以及其他幾個 Linux 作業系統最基本的幾個資訊！大抵來說，他的基本工作是：
    1. 設定預設路徑：( PATH )
    2. 設定網路狀態：系統會再去讀取 /etc/sysconfig/network，並將該檔案內的資料，如 NETWORKING, FORWARD_IPV4, HOSTNAME, DOMAINNAME, GATEWARY, GATEWAYDEV 等等的設定讀入系統中。
    3. 啟動系統的置換空間（簡單的可以想成是虛擬記憶體）： swapping
    4. 檢查檔案系統：這個時候系統會去檢查一些可能會存在的目錄，例如 /fsckoptions 與 /forcfsck 及 /fastboot 等等的目錄，當你的系統有不正常關機的現象時（例如突然的斷電等等），那麼 Linux 將會自動的強制去檢查 root 的檔案系統 （ checking root filesystems ）。簡單的想一想，就好像是 Windows 系統下，當你不正常關機時，在開機的過程中就會出現掃瞄硬碟的情況相同啦！
    5. 周邊設定與系統設定的參數 ( /proc )：在 Linux 或者是 Unix 系統中，你會在根目錄中發現一個很奇怪的磁區，那就是 /proc 囉！其實這個目錄是記錄在記憶體當中的，每次開機的時候就會被建置起來。他的主要功能是記錄主機的一些周邊設備的最新資料狀況！例如網路周邊啦、輸入輸出周邊啦等等的。沒事的話，不要到裡面亂砍喔！會有問題
    6. 設定 Plug and Play ( PNP )的一些參數資料；
    7. 清除 /etc/mtab ；
    8. mount root 及 /proc 檔案系統 ：好了，將一些資料都設定好之後，當然就是需要將資料寫下來囉！這個時候就會將 root 與 /proc 資料給他 mount 上檔案系統啦！
    9. 決定是否使用模組, 載入模組
    10. 檢查檔案系統 ：與前面相同的，當前面的 /fastboot 檢查的旗標開啟之後，就會以 fsck 檢查你的其他磁區囉！ ( 使用 fsck )
    11. 掛上其它檔案系統
    12. 設定 console 字型
    13. 打開 quota
    14. 清除不必要的檔案, 如 lock, pid
    15. 設定 clock
    16. serial port 初始化
    17. 將開機訊息經由 dmesg 放入 /var/log/dmesg 中

    如此一來，在 /etc/rc.d/rc.sysinit 就已經將基本的系統設定資料都寫好了，也將系統的資料設定完整！而如果你想要知道到底開機的過程中發生了什麼事情呢？那麼就使用第十六章學會的 dmesg 就可以知道囉
  • 啟動核心的外掛式模組 (/etc/modules.conf)：
    由於我們的核心越來越聰明，所以呢，我們可以選擇使用模組的型態 ( 這個在後面也會繼續說明 ) 來進行驅動程式的載入！那麼如果系統原本找不到的模組 ( 例如早期的 via-rhine 晶片組 ) 就可以在這個檔案裡面 /etc/modules.conf 寫入呢！
  • init 執行 run-level 的各個 scripts ：
    由於不同的 run-level 所需要載入的模組並不相同，所以系統早就為不同的 run-level 設定了一些批次檔( scripts )來做這件事囉！而 run-level 早就在前面的時候以 /etc/inittab 當中取得囉！好了，如果你知道如何進入到 /etc/rc.d 的目錄中的話，那麼你將會看到該目錄下應該有八個目錄跟三個檔案，目錄 rc0.d ~ rc6.d 分別代表了各個 run-level 的 scripts ！而在這些目錄中的檔案都是以 S 及 K ( 大寫 ) 為開頭的檔案，並接兩位數的數字與該服務的名稱所組合而成的！如下所示為 Mandrake 9.0 的 /etc/rc.d/rc3.d 的內容：

    [root @test /root]# ll /etc/rc.d/rc3.d
    total 0
    lrwxr-xr-x 1 root root 16 Oct 19 11:05 K55routed -> ../init.d/routed*
    lrwxr-xr-x 1 root root 18 Oct 19 10:58 S03iptables -> ../init.d/iptables*
    lrwxr-xr-x 1 root root 17 Oct 19 11:26 S10network -> ../init.d/network*
    lrwxr-xr-x 1 root root 16 Oct 19 11:26 S12syslog -> ../init.d/syslog*
    lrwxr-xr-x 1 root root 16 Oct 19 11:26 S20random -> ../init.d/random*
    lrwxrwxrwx 1 root root 13 Oct 28 15:22 S40atd -> ../init.d/atd*
    lrwxr-xr-x 1 root root 19 Oct 19 10:59 S40saslauthd -> ../init.d/saslauthd*
    lrwxrwxrwx 1 root root 14 Oct 19 21:28 S55ntpd -> ../init.d/ntpd*
    lrwxrwxrwx 1 root root 14 Oct 19 12:11 S55sshd -> ../init.d/sshd*
    lrwxrwxrwx 1 root root 16 Oct 19 12:00 S56xinetd -> ../init.d/xinetd*
    lrwxr-xr-x 1 root root 18 Oct 19 11:26 S75keytable -> ../init.d/keytable*
    lrwxr-xr-x 1 root root 17 Oct 19 11:12 S80prelude -> ../init.d/prelude*
    lrwxr-xr-x 1 root root 17 Oct 19 11:03 S85numlock -> ../init.d/numlock*
    lrwxr-xr-x 1 root root 18 Oct 19 11:35 S89internet -> ../init.d/internet*
    lrwxr-xr-x 1 root root 15 Oct 19 11:26 S90crond -> ../init.d/crond*
    lrwxr-xr-x 1 root root 17 Oct 19 11:26 S95kheader -> ../init.d/kheader*
    lrwxr-xr-x 1 root root 14 Oct 19 11:38 S99adsl -> ../init.d/adsl*
    lrwxr-xr-x 1 root root 19 Oct 19 11:04 S99linuxconf -> ../init.d/linuxconf*
    lrwxr-xr-x 1 root root 11 Oct 19 10:41 S99local -> ../rc.local*

    在這個目錄下的檔案都是連結檔，均指向到 /etc/rc.d/init.d 這個目錄下，而這個 /etc/rc.d/init.d 目錄則是以 Linux 的 rpm 安裝方法時，設定一些服務的啟動目錄。舉個例子來說，如果你要重新啟動 sendmail 的話，而且你的 sendmail 是以 rpm 來安裝的，那麼下達 /etc/rc.d/init.d/sendmail restart 就可以直接啟動 sendmail 囉！所以你即可知道 /etc/rc.d/init.d 裡面檔案的主要功能！因此，當你的 run-level 內的 scripts 要啟動哪寫服務呢，呵呵！就將檔案連結到該 init.d 目錄下的檔案並加以啟動即可囉！也就是說『當你以 文字模式 ( run-level=3 ) 啟動 Linux 時，你的系統在經過 BIOS、 MBR、 Kernel、 init、/etc/rc.d/rc.sysinit 之後，就會進入 /etc/rc.d/rc3.d 來啟動一些服務』囉！不過，需要注意的是，在 rc3.d (或其他目錄下 rc0.d ~ rc6.d )目錄中 S 開頭的檔案為執行該服務， K 為開頭的檔案則是殺掉該服務的意思。那麼那些數字代表的意義為何？那就是啟動的順序啦！例如S12syslog 會比S90crond 更早被執行呢！那麼為什麼要有這些順序呢？這是有原因的！例如您的主機有要啟動 WWW 好了，那麼您的網路設定應該要先啟動才對吧！所以囉，如果 WWW 先啟動，才驅動網路，那麼 WWW 自然就一定起不來啦！所以各項服務的啟動順序也是相當重要的！目前 Mandrake 當中，可以使用 chkconfig 來設定開機要啟動的服務選項呢！
  • init 執行 /etc/rc.d/rc.local
    在 DOS 或 Windows 的系統中，對於 autoexec.bat 與 config.sys 這兩個檔案您應該不陌生吧？！這兩個檔案是 DOS 或 Windows 在完成開機之後，第一個要去讀取的內容！那麼 Linux 有沒有該檔案？！有的！在 Linux 系統執行完了大部分的開機程序之後，接著下來就是要執行你的 Linux 主機的個人化設定囉！舉個例子來說，由於 Red Hat 7.2 預設是將 CDROM 視為一個模組啟動的裝置，因此你的 cdrom 將必須要載入兩個模組之後才能使用，分別是 modprobe cdrom, modprobe ide-cd 這兩個指令！而如果你想每次都使用 cdrom 的話，那麼你每次開機都必須記得手動載入這兩個模組！粉累耶....這個時候就可以將這兩行指令加入到 /etc/rc.d/rc.local 當中去囉！也就是說，不論你有什麼需要在開機的時候寫進去的指令，都可以在這裡寫入喔！ ( 通常為了避免麻煩，我們都將開機完之後必須要做的幾件事情，例如啟動 NAT 主機的命令，使用 tarball 安裝的一些軟體的啟動指令都寫在這個檔案來，那麼系統開機完成之後，你所需要執行的指令也都執行完畢囉！）

    前面的步驟都被主機執行之後，開機的程序就已經完全的啟動完畢了！也就是說，如果你已經有網路的服務啟動的話（通常在 /etc/rc.d/init.d 時就載入囉），那麼你的主機已經在 Internet 上面提供服務了！所以根本就不需要你登入 Linux 系統你的主機也能正確的提供相關的服務喔！
  • 開機設定檔 /etc/sysconfig
    不過，在開機的過程中，到底使用了多少設定檔呢？呵呵！使用最多的設定檔大多放置在 /etc/sysconfig 這個目錄底下呢！來看一下 Mandrake 9.0 在這個設定檔底下有哪些東西？

    [root @test root]# ll /etc/sysconfig
    total 100
    -rw-r--r-- 1 root root 511 Sep 19 17:48 alsa
    -rw-r--r-- 1 root root 239 Sep 19 17:48 autofsck
    -rwxr-xr-x 1 root root 41 Oct 19 11:39 autologin*
    -rwxr-xr-x 1 root root 36 Oct 19 11:35 clock*
    drwxr-xr-x 4 root root 4096 Oct 19 11:27 console/
    -rw------- 1 root root 35 Oct 19 11:35 drakconnect
    -rw------- 1 root root 29 Oct 19 11:35 drakconnect.adsl_pppoe
    -rw------- 1 root root 363 Oct 19 11:35 drakconnect.netc
    -rwxr-xr-x 1 root root 275 Oct 19 11:47 i18n*
    -rw-r--r-- 1 root root 952 Sep 19 17:47 init
    -rw-r--r-- 1 root root 1407 Sep 19 17:48 installkernel
    -rwxr-xr-x 1 root root 446 Aug 26 23:37 ipvsadm*
    -rwxr-xr-x 1 root root 39 Oct 19 11:27 keyboard*
    -rwxr-xr-x 1 root root 114 Oct 18 11:43 mouse*
    -rwxr-xr-x 1 root root 53 Oct 19 11:39 msec*
    -rw-r--r-- 1 root root 0 Sep 17 22:16 msec.rpmnew
    -rwxr-xr-x 1 root root 100 Oct 19 13:35 network*
    drwxr-xr-x 5 root root 4096 Oct 19 10:41 networking/
    drwxr-xr-x 2 root root 4096 Oct 19 13:36 network-scripts/
    -rwxr-xr-x 1 root root 10 Oct 19 11:26 pcmcia*
    -rw-r--r-- 1 root root 153 Jul 25 2000 rawdevices
    -rw-r--r-- 1 root root 336 Jul 26 20:35 saslauthd
    -rw-r--r-- 1 root root 455 Aug 14 09:30 syslog
    -rwxr-xr-x 1 root root 56 Oct 19 11:39 system*
    -rw-r--r-- 1 root root 337 Sep 19 17:48 usb
    -rw-r--r-- 1 root root 41 Aug 22 18:11 xinetd

    上面具有黃色字體的哪幾個項目尤其重要！
    • clock 在設定我們 Linux 主機的時區，可以使用格林威治時間，也就是標準時間，也可以使用台灣的本地時間 ( local )；
    • i18n 在設定一些語系的使用方面，例如最麻煩的文字介面下的日期顯示問題！如果您是以中文安裝的，那麼預設語系會被選擇 big5 ，所以在純文字介面之下，你的檔案日期顯示就會呈現亂碼！這個時候就需要更改一下這裡啦！更動這個 i18n 的檔案，將裡面的 LC_TIME 改成 en 即可！！
    • Keyboard 與 mouse 就是在設定鍵盤與滑鼠的形式；
    • network 可以設定主機名稱，以及 GATEWAY 這兩個重要資訊呢！
    • 至於 network-scripts 裡面的檔案，則是主要用在設定網路卡∼這部份我們在網路架設篇才再次提到！

    總之，這個目錄下的檔案都是很重要的啦！

變換預設的登入模式
剛剛在上面說了登入主機的方式最少有六種，不過常使用的是 run-level 3 的文字介面模式與 run-level 5 的圖形介面模式！如果你在安裝的過程中選擇了文字介面登入，但是後來卻想以圖形介面登入系統，應該怎麼做？！簡單的很！就直接修改 /etc/inittab 這個檔案的內容即可！如何做呢？！以 vi 或者是其他的文書編輯軟體，進入 /etc/inittab 這個檔案，檔案的內容有點像這樣：

# Default runlevel. The runlevels used by Mandrake Linux are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

在上面的資料中，將 id:3:initdefault: 裡頭的 3 改成 5 ，那麼在下次的登入時就會變成是圖形介面囉！同理，要由圖形介面變成文字介面來登入時，也是將上面那行改成 3 即可！此外，不知道您有沒有經驗，在你的 Linux 主機當中， Linux 共提供了六個終端機介面與 一 個圖形介面的登入點，你可以按下 『 Ctrl 』+ 『 Alt』 加上『F1』 ~ 『F6』 功能鍵 來變換不同的文字介面登入點！至於圖形介面則僅使用於『 Ctrl + Alt + F7 』這一個喔！不過，如果你只想要提供四個文字介面呢？該如何是好？！呵呵！只要將上面的最後兩行刪掉，只剩下 1:2345:....至 4:2345:...，只剩下這四行然後重新開機之後，你的 F5 與 F6 功能鍵的作用就會消失囉！就這麼簡單啦！不過，需要注意的是，圖形介面只有一個，當你使用圖形介面登入時，那麼將直接進入 tty7 那一個圖形介面的登入螢幕喔！而當你在 tty1 輸入 startx 啟動 X-Windows 時，你的控制權將會跑到 tty7 （就是在 F7 功能鍵），此時，若您的 X-windows 掛了！那麼直接按下『 Ctrl + Alt + F1 』 回到 tty1 之後，直接刪除該 X-Windows 的程序即可關閉 X-Windows 囉！很不錯吧！
Lilo
好了，要開始來搞定 boot loader 囉！第一個介紹的事較老牌的 lilo 這個玩意兒！他算是最標準的 Linux boot loader 囉！目前我的幾部主機裡面，用的也大部分都是他呢！Lilo 的設定與安裝方面必需要分成兩個步驟，分別是設定 /etc/lilo.conf 這個設定檔，設定完畢之後，還必需要給他改寫進去 MBR 或者是 Super block 才行！
  • 設定檔 /etc/lilo.conf
    基本上， lilo 是載入 Linux 核心的重要開機資料的安裝程式，他的參數設定檔案就放在 /etc/lilo.conf 裡頭，那麼我們來看一看裡面有什麼設定參數吧，基本上他的設定參數有點像底下這樣，可以分為兩部分，一個是整體的設定方面，一個則是每一個開機設定的核心檔案：

    [root @test linux]# vi /etc/lilo.conf
    # 第一部份，整體的設定部分
    prompt <==強制出現 boot 的開機訊息囉！
    Compact <==可以整合一些讀取的磁區，可以保持 map 較小，相當適合軟碟開機時使用
    delay=50 <==如果有多重開機的話，可以設定這個延遲時間，單位0.1秒
    timeout=50 <==與 delay 有類似的關係！也是 0.1 秒，如果 5 秒內沒有按鍵盤，直接以第一個 image 開機。
    default=linux-2.4.18 <==如果開機的過程中，出現了boot之後，使用者沒有動作，
    則以此設定的核心開機，與底下的label需對應
    boot=/dev/had <==Lilo 的開機資訊寫入到 /dev/hda 這顆硬碟的 MBR 當中。
    map=/boot/map <==用來說明 local 主機的地圖資訊囉！
    install=/boot/boot.b <==關於開機區的訊息(boot sector)，不用理他沒關係！
    Linear <==在較大容量的硬碟使用時，可以加入這一個參數試試看！
    lba32 <==這個東西也是在大容量的硬碟使用時候會需要的參數！
    password=1234567 <==設定密碼！如果為了安全起見，可以設定您的 lilo 密碼哩！
    message=/boot/message <==那個 LILO 的訊息就是在裡面出現的啦！

    # 第二部分，個別的開機設定部分，一個 image 或 other 均代表一個開機設定！
    image=/boot/vmlinuz-2.4.7-10 <==核心檔案啦！
    label=linux-2.4.7 <==請注意！label 前面以 [tab] 按鍵來作為分隔！
    這個字眼則是顯示在 boot 裡頭挑選項目。
    initrd=/boot/initrd-2.4.7-10.img
    read-only <==開機磁區掛載為唯讀！這是預設狀況，實際在
    掛載入 Linux 系統時，會重新掛載成可寫！
    root=/dev/hda1 <==掛載成 / 這個 root 目錄的磁碟！
    other=/dev/hdb1 <==如果是『非 Linux 核心』就以 other 來設定
    開機的磁碟磁區！
            label=Windows2k <==同樣的要有 label 來表示這個開機磁區的名稱！

    注意一下上面那幾個咚咚：
    • delay 與 timeout 的設定是 0.1 秒，所以 delay=50 表示延遲時間為 5 秒！
    • linear 與 lba32 通常用在 SCSI 或者是較大的硬碟，例如磁區超過 1024 磁軌的硬碟，可以使用這個項目來除錯！不過，如果是小於 8GB 的硬碟，這兩個東西有沒有設定就沒有什麼影響了！
    • default 需要設定成底下幾個 image 或者是 other 的 label 才成！這個地方最常被忘記！因為常常會記得修改 label ，但是忘記跟著改變 default 的內容！此外，如果你想要修正開機預設的作業系統選項，在這裡改啦！
    • password 的用途在於安全防護方面，不過有個困擾，就是『如果你的電腦因為不正常關機（如斷電後重開）而在電源恢復的時候重新開機時，則會卡在這個階段無法直接進入 Linux 系統』，因為你必須提供 password 才能繼續的工作呀！
    • boot 顯示的是開機的磁區選擇！ 這裡也蠻重要的，如果你想要安裝在 MBR 裡面的話，如同上面的書寫模式，就是寫入 /dev/hda ，後面不要加上每個 partition 的代碼！但是，如果你是想寫入 Super Block ，例如我想要寫入的是 had5 這個 Logical 的 partition 時，那麼這裡就必需要改寫為 /dev/hda5 囉！所以，您應該只要一看到這個 boot 後面接的內容，就會知道那個安裝的磁區是 MBR 還是 Super Block 囉！
    • image 可以設定成多數個！如果你的 Linux 系統有多個核心檔案的時候，例如我們剛剛編譯完成的一個新的核心，然而你又不想丟掉舊核心，就可以設定成兩個不同核心的開機系統囉！

    大致上就是這樣吧！其他不明了是什麼東西的選項，可以使用 man lilo.conf 來看看裡頭的設定！因為還有很多開機時後需要載入的參數可以來設定一番呢！

  • 以預設的 lilo.conf 新增一個開機檔
    好啦！為了測試一下您是否已經知道了 lilo.conf 的設定方式，所以我們來做個實驗吧！請在您的『實驗主機』上面，不要在提供服務的主機上面完呦！否則死掉了不要怪我沒警告您…我們先試圖安裝在 super block 上面好了！以下面為例，黃色字體的部分是經過我的修改之後的結果，您的 /etc/lilo.conf 應該會長的跟我的差不多才是！

    boot=/dev/hda1
    map=/boot/map
    vga=normal
    default=linux
    keytable=/boot/us.klt
    prompt
    nowarn
    timeout=100
    message=/boot/message
    menu-scheme=wb:bw:wb:bw
    image=/boot/vmlinuz
    label=linux
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=mount"
    read-only
    image=/boot/vmlinuz
    label=failsafe
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=nomount failsafe"
    read-only
    image=/boot/vmlinuz <==就給他新增加一個 label ，但是內容不變！
    label=linux-test
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=mount"
    read-only

    這樣就設定好了！接著下來看一下怎麼安裝他吧！

  • 安裝 lilo
    既然設定好了，自然就是要安裝他囉！安裝的方式很簡單，直接輸入 lilo 即可！

    [root @test root]# lilo
    Added linux * <==有打星號的是『預設的開機設定檔！』
    Added failsafe
    Added linux-test

    看到沒有！要像上面這樣才是安裝成功呦！如果出現了錯誤的訊息，那麼肯定是有地方沒有安裝好！這個時候請特別的再重新設定一次 /etc/lilo.conf 呢！有打星號的是『預設的開機設定檔！』

    而如果您還要看看更多的訊息，那麼就需要這樣：

    [root @test root]# lilo -v
    LILO version 22.3.2, Copyright (C) 1992-1998 Werner Almesberger
    Development beyond version 21 Copyright (C) 1999-2002 John Coffman
    Released 11-Jul-2002 and compiled at 21:48:42 on Aug 13 2002.

    Reading boot sector from /dev/hda1
    Using MENU secondary loader
    Calling map_insert_data
    Mapping message file /boot/message -> message-text
    Calling map_insert_file

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added linux *

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added failsafe

    Boot image: /boot/vmlinuz -> vmlinuz-2.4.19-16mdk
    Mapping RAM disk /boot/initrd.img -> initrd-2.4.19-16mdk.img
    Added linux-test

    /boot/boot.0301 exists - no backup copy made.
    Writing boot sector.

    如果你需要更多的訊息，那麼就使用『 lilo –v –v –v 』多一點 –v 就對啦！

  • 一些問題的解決之道

    好了！ lilo 安裝完成之後，總是會有一些問題會發生吧！那麼如何來解決問題呢？嗯！可以看一下底下的一些解決之道：

    • 我要如何選擇不同的開機設定檔？開機的時候我只看的到 boot: 而已?
      開機之後，如果是以 lilo 來啟動 kernel 時，那麼他會出現 boot: 的字樣，出現這個字樣之後，馬上按下 <tab> 按鍵，那麼就會出現目前 lilo 所記憶的開機設定檔囉！然後在 boot 後面輸入想要的開機檔案，就可以囉！
    • 安裝好了 Linux 之後，在開機的過程中卻只出現『 LI 』就停止了！該如何是好？
      這個問題可能發生的原因是 Lilo 沒有設定好，或者是由於 Linux 安裝在非 /dev/hda ( MBR )的硬碟之中，解決的方法可以如下：
      1. 用 Linux 光碟開機，然後在出現 boot: 處輸入
        linux root=/dev/hda1 （這個與你的 Linux 安裝的 partition 有關）
        順利開機之後，以 vi 修改 /etc/lilo.conf 將
        linear
        這一行取消（如果沒有這一行的話，那就在 lilo.conf 中加入吧！）然後執行
        lilo
        再取出光碟並重新開機試試看；
      2. 進入 BIOS ，將硬碟的 mode 改成 LBA 試看看；
      3. 將Linux往前面一點的磁區安裝，例如你可能安裝在 /etc/hdc1 ，那你可以重新安裝 Linux 在 /dev/hda2 試看看
    • 安裝Linux完成之後，卻是出現 010101... 等數字在螢幕上，無法進入 Linux ...
      這個問題的發生很有可能是硬碟出了問題了！這個時候可以使用 fsck 來掃瞄囉！
      1. 用軟碟或者是光碟開機後，使用fsck這個硬碟修正軟體掃瞄一下您的 root partition ，例如：fsck /dev/hda1
      2. 進入 BIOS ，將硬碟的 mode 改成 LBA 試看看；
    • 我們知道 DOS 需要在第一顆硬碟的第一個磁區才能正常開機使用！那要是他並非在第一個磁區呢？例如當 DOS 系統在 /dev/hdb1 （第一條排線的 slave ）？
      解決知道就是以 lilo 修正磁碟的配置啦！如下所示來修改 /etc/lilo.conf
      other=/dev/hdb1
            label=DOS
            map_drive=0x80
            to=0x81
            map_drive=0x81
            to=0x80
      然後再執行 lilo 寫入 MBR 當中！
    • 我不要玩 Linux 了，如何移除 lilo ？
      只要以 Windows 的開機片開機，然後以 Windows 系統的 fdisk 下達：
      fdisk /mbr
      就可以將 Lilo 自 MBR 當中移除囉！
    • 無法正常的進入 Lilo 怎麼辦？
      這的時候開機片就很重要啦！使用開機片，在出現 boot: 的時候，輸入
      linux -s
      就可以進入啦！這裡請特別留意！那個 linux 指的是 label 呢！就像剛剛我們有三個 label ，分別是 linux, linux-test 與 failsafe ，那麼如果我要以 linux-test 這個開機設定檔的單人維護模式登入，就必需要改寫成
      linux-test –s
      linux-test single
      請特別留意！！
Grub
grub 是較新的 boot loader 程式，他具有相當多的優點，這裡不一一列舉啦！無論如何， lilo 能做的， grub 幾乎都可以做的到，包括選單、密碼、指向等等的功能！不過， grub 比 lilo 要先進的幾點是：
  1. 他可以讓您在開機的時候『自行編輯與修改開機設定項目』，有點像是 bash 的指令模式；
  2. 他可以自動『動態尋找設定檔』，亦即他可以依據 /boot/grub/menu.lst 的設定而改變其設定！因此，修改設定只要改 /boot/grub/menu.lst 即可，不需要再重新安裝 grub ！
很棒吧！不過，在設定底下的工作之前，請先確認您的 grub 這個套件已經安裝上來來！如果還沒有安裝的話，那麼先查閱一下 RPM 的安裝方法再說！底下假設 grub 這個套件已經安裝在您的主機上囉！
  • 設定檔 /boot/grub/menu.lst
    Grub 的設定檔也很簡單，就是 /boot/grub/menu.lst 這個檔案，請注意，那個 lst 是 L 的小寫呢！如果有興趣的話，可以使用 info grub 好好的去看一下他的所有功能，底下僅列出一些我們常用的功能與設定而已喔！
    • 關於硬碟的代號：
      在 grub 裡面，有一點是比較讓人覺得不適應的，那就是他的硬碟代號與 lilo 還有 Linux 傳統的代號不一樣∼他的代號主要有點像這樣：
        (hd0,0)

      hd 指的是 IDE 的硬碟，而裡面的 0,0 代表什麼呢？第一個 0 代表他是第一個 IDE 的 master ，而第二個 0 代表他是第一塊 partition 的代號，所以呢，這個代號就是 hda1 啦！所以，我們可以得到底下這個對應表：
      裝置
      Lilo
      Grub
      IDE1 master | hda, hda1, hda2 | (hd0), (hd0,0), (hd0,1)
      IDE1 slave | hdb, hdb1, hdb2 | (hd1), (hd1,0), (hd1,1)
      IDE2 master | hdc, hdc1, hdc2 | (hd2), (hd2,0), (hd2,1)
      IDE2 slave | hdd, hdd1, hdd2 | (hd3), (hd3,0), (hd3,1)

      這裡需要先記憶一下囉！

    好了，那麼將我的 menu.lst 列出來一下吧先！

    [root @test root]# vi /boot/grub/menu.lst
    timeout 10 <==多久之後鍵盤沒有動靜，就直接以 default 的設定開機，這裡是秒數！
    Color black/cyan yellow/cyan <==設定顏色的參數
    i18n (hd0,0)/boot/grub/messages <==設定 i18n 多國語系的訊息提示
    keytable (hd0,0)/boot/us.klt <==設定鍵盤形式，通常使用美規的鍵盤即可！
    Default 0 <==預設的開機選項，依照底下的排序，第一個為 0 ！

    title linux <==這是第一個開機設定檔，亦即排序為 0 號！
    kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=mount
    initrd (hd0,0)/boot/initrd.img
    <==上面兩個則是開機設定檔的基本內容，分別是
    核心檔案所在地與 Ramdisk 的設定內容！

    title failsafe <==這是第二個開機設定檔，亦即排序為 1 號！
    kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe
    initrd (hd0,0)/boot/initrd.img

    title windows
    chainloader (hd1,0) +1

    • default 與 title 的計算方式：
      基本的說明已經在上表當中了，這裡需要在說明的是關於 default 開機檔的計算。如果今天我有四個開機設定檔，那麼 default 算的是什麼呢？就是『排序』啦！假如我底下依序出現的設定檔 title 分別是 linux, linux-test, windows, failsafe 的話，那麼開機的時候， grub 的選單就會顯示：
      linux
      linux-test
      windows
      failsafe
      其中，linux 就是 0 ，而 failsafe 就是 3 ，如果您要調整開機時後的選單順序，就在 /boot/grub/menu.lst 修改一下他們的順序即可！但是記得 default 要跟著變，因為他也是依據排序而變的呦！這點請不要忘記了?
    • title 內容的設定方式：
      基本上，如果是一般的硬碟環境中，我們僅需要兩行就可以設定好 title 的內容了，分別是：

      root [開機根目錄 / 所在的磁碟代號]
      kernel [開機檔案的所在地完整檔名] [root=/dev/硬碟代號]

      範例：
      root (hd0,0)
      kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1

      設定上面就是這樣而已！所以，開機完畢之後，請將您的 kernel 檔案名稱(完整檔名)與開機的根目錄所在的磁碟代號記憶一下，那麼下次就可以手動設定開機設定項目呢！但如果是 windows 方面的設定時，那就直接使用 chainloader 這個項目即可，有點像這樣：
      chainloader [硬碟代號] +1

      範例：
      chainloader (hd1,0) +1

  • 安裝 grub 在系統中
    要安裝 grub 跟 /boot/grub/menu.lst 並沒有相關性！因為剛剛我們就提過了， grub 為動態去搜尋設定檔的，所以寫入 MBR 或 super block 時，並沒有將 menu.lst 寫入ㄋㄟ?好了，那我們就來安裝看看吧！安裝的方式主要也是分為安裝在 MBR 與 super block 呢！底下我們就來談談這兩種安裝的方式：基本上的動作就是：

    1. 使用 root [磁碟代號] 選擇開機根目錄 / 所在磁碟代號；
    2. 使用 setup [磁碟代號] 選擇 MBR 或 Super block 直接安裝進去！
    3. 使用 quit 就可以離開 grub 了！

    [root @test root]# grub

    # 先安裝在 Super Block 底下試看看：
    grub> root (hd0,0) <==這裡輸入我要的 root 硬碟磁區！
    Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0,0) <==實際安裝上來！使用 setup 指令！
    Checking if "/boot/grub/stage1" exists... yes
    Checking if "/boot/grub/stage2" exists... yes
    Checking if "/boot/grub/e2fs_stage1_5" exists... yes
    Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
    Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
    Running "install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 p /boot/grub/menu
    .lst "... succeeded
    Done.

    # 再安裝在 MBR 試看看：
    grub> root (hd0,0)
    Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0)
    Checking if "/boot/grub/stage1" exists... yes
    Checking if "/boot/grub/stage2" exists... yes
    Checking if "/boot/grub/e2fs_stage1_5" exists... yes
    Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded.
    succeeded
    Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2
    /boot/grub/menu.lst"... succeeded
    Done.
    grub> quit <==離開 grub 囉！

    這樣就安裝進去囉！很方便吧！並不難吧！

  • 開機手動設定選項
    事實上，每次動手修改完 /boot/grub/menu.lst 就已經完成了 grub 的設定囉！因為他相當的聰明！但是，如果我設定錯誤怎麼辦？沒關係！有很多的方法可以使用呢！如果您可以順利的以硬碟進入 grub 畫面，那麼恭喜您，可以繼續下面的行動了！但是如果您的 Linux 竟然無法順利的開機了，也就是說，使用硬碟開不了機！那麼也沒有關係，別擔心，就直接給他使用 CD 開機，然後在進入 grub 畫面之後，再繼續下面的動作！
    • 在 grub 畫面下進行手動加入的動作：
      在 grub 畫面中，通常畫面的最下方都會顯示一些基本的訊息，例如下方的 Mandrake 預設文字介面 grub 登入圖示：

      在這個畫面中，您可以輸入 e 或 c 來選擇『編輯』或『進入指令列模式』，無論如何，這兩個選項將使您進入指令列模式當中啦！所以您就可以看到一個大大的 grub> 提示字元，然後就可以修改或者是自訂一些項目啦！而這些修改或者設定的項目，並不會主動的去覆蓋您的 /boot/grub/menu.lst ，而是這次登入所做的修改而已呢！通常我都是選擇 e 進入編輯的畫面，然後選擇 kernel 與 root 那兩項內容進行編輯即可！例如我們上面提過的，我的 root 與 kernel 已經知道了正確的訊息，所以我就可以按下 c 來輸入底下的字樣：
        grub> root (hd0,0)
        grub> kernel /boot/vmlinuz-2.4.19-16mdk root=/dev/hda1

      這樣就可以進入我們的主機了呢！很厲害吧！

可開機磁片與救援磁片製作
不論任何時候，製作可以開機的磁片與救援的磁片，都是一件很值得鼓勵的事情！這裡我們提供簡單的方式來讓您的磁片可以開機呦！

# 製作軟碟開機片：
[root @test root]# mkbootdisk --device /dev/fd0 `uname -r`
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press <Enter> to continue or ^C to abort:

# 製作救援磁片：
[root @test root]# mkrescue --device /dev/fd0

不過， mkrescue 比較麻煩的一點是，這個程式僅支援 lilo 這個 loader 的 image file ，所以如果剛剛您是使用 grub 來設定 MBR 的話，那麼 mkrescue 就無法動作了?
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 我有個朋友跟我說，他想要讓一個程式在 Linux 系統下一開機就啟動，但是在關機前會自動的先結束該程式，我該怎麼建議他？
    答：
      由於 /etc/rc.d/rc[0-6].d 裡面有的 Sxxname 與 Kxxname 可以設定開機啟動與關機結束的事項！所以我就可以輕易的寫一個 script 放在 /etc/rc.d/init.d 裡面，並連結到我的 run-level 裡頭，就可以讓他自由自在的啟動與結束了！
  • 萬一不幸，我的一些模組沒有辦法讓 Linux 的核心捉到，但是偏偏這個核心明明就有支援該模組，我要讓該模組在開機的時候就被載入，那麼應該寫入那個檔案？
    答：
      應該寫入 /etc/modules.conf 這個檔案，他是模組載入相關的地方呢！
2003/02/10：第一次完成
2003/02/10 以來統計人數


RPM 與 Tarball 套件管理員
最近更新日期：2003/02/11
為何需要升級套件？
RPM 套件管理程式
    什麼是 RPM 、 SRPM ？
    什麼是 i386, i586, i686, noarch ？
    SRPM 與 RPM 所需要的安裝目錄
    RPM 的指令使用：
        安裝
        升級與更新
        查詢
        驗證
        反安裝與重建資料庫
Tarball 管理方法
    什麼是 Tarball ( source code )
    Tarball 需要的基礎套件
    Tarball 安裝的基本步驟
    Tarball 的移除與升級
要選擇 RPM 還是 Tarball？
函式庫資料： ldconfig, ldd,
檢驗軟體正確性： md5sum
網路資源
本章習題練習
為何需要升級套件
這真是一個很有趣的課題，為何需要升級套件？如果我的機器運作的好好的，那麼我幹嘛需要升級？通常我們升級的原因主要有三個：
  • 需要新的功能，但舊有主機並沒有，所以需要安裝新的套件；
  • 舊版本的套件上面可能有安全上的顧慮，所以需要更新到新版的套件；
  • 舊版的套件執行效能不彰，或者執行的能力不能讓管理者滿足。
在上面的需求當中，尤其需要注意的是第二點，當一個套件有安全上的顧慮時，千萬不要懷疑，趕緊更新套件吧！否則造成網路危機，那可不是鬧著玩的?那麼更新的方法有哪些呢？其實，目前在 Linux 裡面有相當多的不同的更新套件的方式，包括了 Red Hat 發展的 RPM 與 up2date 的線上更新模式； Debian 這個 distribution 裡頭使用的 dpkg 方法；Sun Unix 上面使用的 pkg 升級方式；目前越來越流行的 apt 線上更新模式；還有原始碼裡頭最常使用的 Tarball 編譯方法等等，如果要一個一個說明的話那也太累人了?所以，這裡我們以目前在 Mandrake, Red Hat, OpenLinux 等 Linux distributions 內常見的 RPM 與 Tarball 的套件升級方式來進行說明：
  • RPM
    目前使用最廣泛的套件管理程式之一，利用資料庫管理的方式來進行套件的安裝，具有相當容易的操作介面，而且套件查詢驗證的功能相當強大，不過麻煩的地方在於他的屬性相依的問題；
  • Tarball
    直接以原始碼( source code )經過編譯後，進行安裝。在安裝上面具有較大的靈活度，可以隨時更改使用者喜好的參數。但是需要其他的套件協助，例如 gcc compiler, kernel-header, make 套件等等，並且在反安裝上面具有一定程度的困難度；
這兩種方法是各有優缺點啦，我們這裡想要來談一談 RPM 與 Tarball 的安裝方式了！
RPM套件管理員：
    接下來我們先談論一下廣為流傳與使用的 RPM 套件管理員的相關使用方法喔！

  • 什麼是 RPM 、 SRPM ？
    RPM 全名是『 RedHat Package Manager 』簡稱則為 RPM 啦！顧名思義，當初這個套件管理的程式是由 Red Hat 這家公司發展出來的，但其實在很多的其他套件也有相類似的套件管理程式。不過由於 RPM 使用上很方便，所以就成了目前最熱門的套件管理程式啦！那麼什麼是 RPM 呢？說的簡單一點， RPM 是以一種資料庫記錄的方式來將你所需要的套件安裝到你的 Linux 主機的一套管理程式。他最大的特點就是將您要安裝的套件先包裝好了，透過包裝好的套件裡頭預設的資料庫記錄，記錄這個套件要安裝的時候必須要的相依屬性模組（就是你的 Linux 主機需要先存在的幾個必須的套件），當安裝在你的 Linux 主機時， RPM 會先依照套件裡頭的紀錄資料查詢 Linux 主機的相依屬性套件是否滿足，若滿足則予以安裝，若不滿足則不予安裝。那麼安裝的時候就將該套件的資訊整個寫入 RPM 的資料庫中，以便未來的查詢、驗證與反安裝！這樣一來的優點是：

    1. 由於已經編譯完成並且打包完畢，所以安裝上很方便；
    2. 由於套件的資訊都已經記錄在 Linux 主機的資料庫上，很方便查詢、升級與反安裝；

    但是這也造成很大的困擾，由於 RPM 程式是已經包裝好的資料，也就是說，裡面的資料已經都『編譯完成』了！所以，安裝的時候一定需要當初安裝時的主機環境才能安裝，也就是說，當初建立這個套件的安裝環境必須也要在你的主機上面出現才行！例如 rp-pppoe 這個 ADSL 撥接套件，他必須要在 ppp 這個套件存在的環境下才能進行安裝！如果你的主機並沒有 ppp 這個套件，那麼很抱歉，除非您先安裝 ppp 否則 rp-pppoe 就是不讓你安裝的（當然您可以強制安裝，但是通常都會有點問題發生就是了！）。所以，通常不同的 distribution 所釋出的 RPM 檔案，並不能用在其他的 distribution 裡面，舉例來說， Red Hat 釋出的 RPM 檔案，通常無法直接在 Mandrake 上面進行安裝的，更有甚者，不同版本之間也無法互通，例如 Mandrake 9.0 的 RPM 檔案就無法直接套用在 8.2 上面！因此，這樣可以發現他的缺點是：

    1. 安裝的環境必須與打包時的環境需求一致或相當；
    2. 需要滿足套件的相依屬性需求；
    3. 反安裝時需要特別小心，最底層的套件不可先移除，否則可能造成整個系統的問題！

    那怎麼辦？呵呵！還好，還有 SRPM 這個東西！ SRPM 是什麼呢？他也是一種 RPM 啦！但是由於裡面連同當初編譯之前的原始碼都在裡頭，所以可以進行重新編譯的動作。通常 SRPM 的附檔名是 ****.src.rpm 這一種檔案格式。由於 SRPM 包含了原始碼及參數設定檔案，所以在安裝之前則必須重新的編譯建立起包裝的資訊檔案套件才行！當然囉，如果在編譯的過程中發生了問題，也可以藉由裡頭的原始碼更動來修正問題的所在呢！所以說， RPM 與 SRPM 最大的差異就是在於有沒有包含原始碼的程式啦！

  • 什麼是 i386, i586, i686, noarch
    好啦！現在我們已經知道 RPM 與 SRPM 的格式了，分別為：

    xxxxxxxxx.rpm 　<==RPM 的格式，已經包裝完成的 rpm 檔案；
    xxxxx.src.rpm 　<==SRPM的格式，包含為編譯的原始碼資訊。

    OK！那麼 rpm 檔案有沒有什麼版本或者是套件名稱的稱呼呢？有的，你可以這樣來看待一個 rpm 的檔案，例如 rp-pppoe-2.6-5.i386.rpm

    rp-pppoe - 2.6 - 5 . i386 .rpm
    第一個部分是套件名稱這是套件的版本資訊 這是釋出版本的次數 這是適合的硬體平台 附檔名而已

    這樣子可以很清楚的發現該套件的名稱、版本資訊、打包次數與操作的硬體平台！好了，來談一談每個不同的地方吧：

    • 套件名稱：當然就是每一個套件的名稱了！

    • 版本資訊：每一次更新版本就需要有一個版本的資訊，否則如何知道這一版是新是舊？這裡通常又分為主版本跟次版本，反正版本很多啦！

    • 釋出版本次數：也就是編譯的次數啦！那麼為何需要重複的編譯呢？這是由於同一版的套件中，可能由於有某些 bug 或者是安全上的顧慮，所以必須要重新設定當初打包時候的設定參數，設定完成之後重新編譯並打包成 RPM 檔案！因此就有不同的打包數出現了！

    • 操作硬體平台：這是個很好玩的地方，由於 RPM 可以適用在不同的操作平台上，但是由於不同的平台設定的參數還是有所差異性！所以就有所謂的 i386, i586, i686 與 noarch 等的檔案名稱出現了！
      • i386：幾乎適用於所有的 x86 平台，不論是舊的 pentum 或者是新的 pentum-IV 與 K7 系列的 CPU等等，都可以正常的工作！那個 i 指的是 Intel 相容的 CPU 的意思，至於 386 不用說，就是 CPU 的等級啦！
      • i586：就是 586 等級的電腦，那是哪些呢？包括 pentum 第一代 MMX CPU， AMD 的 K5, K6 系列 CPU ( socket 7 插腳 ) 等等的 CPU 都算是這個等級；
      • i686：在 pentun II 以後的 Intel 系列 CPU ，及 K7 以後等級的 CPU 都屬於這個 686 等級！
      • noarch：就是沒有任何硬體等級上的限制。
      需要額外說明的是， i386 的檔案可以在任何的機器上面安裝，不論是 586 或者是 686 的機器，但是 i386 則不一定可以使用於 586 或者是 686 的硬體上面，另外，在 686 的機器上使用 i686 的檔案會比使用 i386 的檔案在執行上，效能可能比較好一些！無論如何，使用 i386 應該就是比較沒有問題的啦！另外，由於不同的 distirbution 會有不同的環境與函式庫，所以在 i386 之後也有可能會額外再加上該套件的簡寫！

    好了！接下來我們來談一談安裝的時候所需要使用到的目錄！

  • SRPM 與 RPM 工作時候所需要的安裝目錄
    SRPM 的編譯過程：
    剛剛提到 SRPM 裡頭含有的是未經編譯的原始碼，所以我們需要將 SRPM 進行編譯打包的動作！那麼編譯是在哪裡進行呢？由於編譯的時候會將原始碼解壓縮出來，並且將附有的參數控制選項也同時的解開，所以就有一些資料會出現了，那麼這些資料放在哪裡呢？你可以到你的 /usr/src 這個目錄裡面去查看一下，通常每個 distribution 提供的目錄都不太相同，以 Mandrake 9.0 為例，他是以 /usr/src/RPM 為工作目錄， Red Hat 是以 /usr/src/redhat 為工作目錄， Openlinux 則是以 /usr/src/openlinux 為工作目錄！無論如何，反正就是在 /usr/src 這個目錄下就對了！好了，既然我們是在 Mandrake 9.0 ，所以就到 /usr/src/RPM 裡頭去看一看呦：

    • /usr/src/RPM/SPEC：這個目錄當中放置的是該套件的設定檔，例如這個套件的資訊參數、設定項目等等都放置在這裡；
    • /usr/src/RPM/SOURCE：這個目錄當中放置的是該套件的原始檔（*.tar.gz的檔案）以及 config 這個設定檔；
    • /usr/src/RPM/BUILD：在編譯的過程中，有些暫存的資料都會放置在這個目錄當中；
    • /usr/src/RPM/RPMS：經過編譯之後，並且順利的編譯成功之後，將打包完成的檔案放置在這個目錄當中。裡頭有包含了 i386, i586, i686, noarch.... 等等的次目錄。

    此外，在編譯的過程當中，可能會發生不明的錯誤，或者是設定的錯誤，這個時候就會在 /tmp 底下產生一個相對應的錯誤檔，您可以根據該錯誤檔進行除錯的工作呢！等到所有的問題都解決之後，也編譯成功了，那麼剛剛解壓縮之後的檔案，就是在 /usr/src/RPM/SPEC, SOURCE, BUILD 等等的檔案都會被殺掉，而只剩下放置在 /usr/src/RPM/RPMS 底下的檔案了！

    RPM 的安裝過程：
    RPM 在安裝的時候，會先去讀取 套件 內的設定參數內容，就是剛剛我們在 /usr/src/RPM/SPEC 的相關資訊啦！然後將該資料用來比對 Linux 系統的環境，這些環境包括了這個欲安裝的套件的前驅套件，例如目前 postfix 這個 e-mail 套件當中，大都支援了cyrus-sasl 這個套件的身份認證功能，所以，要安裝 postfix 就必需先安裝 cyrus-sasl 這個套件，否則 postfix 就不讓你安裝了！還有類似版本的資訊等等，這些都是 RPM 環境的要求，如果環境相符就予以安裝，如果不符就會顯示出不符合的內容所在！等到安裝完畢之後， rpm 就會將套件的資訊寫入：/var/lib/rpm 這個目錄中去！所以，往後您在進行查詢的時候或者是預計要升級的時候，相關的資訊就會由 /var/lib/rpm 這個目錄的內容資料來提供囉！此外，在安裝 RPM 的套件時，這些套件通常會使用到底下的目錄：

    • /etc 一些設定檔放置的目錄，例如 /etc/samba
    • /usr/bin 一些可執行檔案
    • /usr/lib 一些程式使用的動態函式庫
    • /usr/share/doc 一些基本的軟體使用手冊與說明檔
    • /usr/share/man 一些 man page 檔案

    底下我們先針對 RPM 的相關指令來進行說明囉！

  • RPM 的指令使用：安裝、升級與更新、查詢、驗證、反安裝與重建資料庫
    RPM 提供了『安裝』、『升級與更新』、『查詢』、『驗證』、『反安裝與重建資料庫』等功能，底下我們一個一個來說明吧！
    • 安裝：
      從無到有就是安裝啦！那麼安裝的方式為何呢？若是 RPM 則使用 ivh 啦！如果是 SRPM 就使用 rebuild 或是 recompiler 囉！

      [root @test /root]# rpm --rebuild rp-pppoe-2.6-5.src.rpm <==SRPM
      [root @test /root]# rpm --recompile rp-pppoe-2.6-5.src.rpm <==SRPM
      [root @test /root]# rpm -ivh rp-pppoe-2.6-5.i386.rpm <==RPM

      • --rebuild：這個參數會將後面的 SRPM 進行『編譯』與『打包』的動作，但是並沒有安裝，當您使用 --rebuild 的時候，最後通常會發現一行字體：

          Wrote: /usr/src/RPM/RPMS/i386/rp-pppoe-2.6-5.i386.rpm

        這個就是編譯完成的 RPM 檔案囉！那麼這個檔案就可以用來安裝啦！安裝的時候請加絕對路徑來安裝即可！

      • --recompile：這個動作會直接的『編譯』『打包』並且『安裝』囉！請注意， rebuild 僅『編譯並打包』而已，而 recompile 不但進行編譯跟打包，還同時進行『安裝』了！

      • -ivh：就是用來安裝 RPM 的參數而在這個參數之下，由於會有一些『相依屬性』的問題，或者是曾經安裝過的檔案的問題，所以您可以再加以下的參數來『強制』安裝：
        • --nodeps：不考慮相依屬性的關係，給他強制的安裝下去；
        • --replacepkgs：如果這個套件之前安裝過，您想要覆蓋這個套件，那麼不需要反安裝後再安裝，可以直接加上 --replacepkgs 強制覆蓋；

      • --replacefiles：那麼如果這個套件安裝完畢之後，曾經被你修改過檔案呢？就是安裝過程中會出現『confilcting files 』的話，那麼直接以 --replacefiles 覆蓋掉這種檔案吧！

        [root @test /root]# rpm -ivh rp-pppoe-2.6-5.i386.rpm
        [root @test /root]# rpm -ivh --nodeps rp-pppoe-2.6-5.i386.rpm <==不考慮相依模組
        [root @test /root]# rpm -ivh --replacepkgs rp-pppoe-2.6-5.i386.rpm <==直接覆蓋掉曾安裝過的套件
        [root @test /root]# rpm -ivh --replacefiles rp-pppoe-2.6-5.i386.rpm <==直接覆蓋掉被修改過的問題檔案

    • 升級：
      使用 RPM 來升級真是太簡單了！就以 Uvh 來升級即可！但是在比較大量的升級版本中，使用 Fvh 則是比較好的作法。但是需要注意的是，如果您使用的是 Fvh ，偏偏您的機器上尚無這一個套件，那麼很抱歉，該套件並不會被安裝在您的 Linux 主機上面，所以請重新以 ivh 來安裝吧！

      [root @test /root]# rpm -Uvh rp-pppoe-2.6-5.i386.rpm
      [root @test /root]# rpm -Fvh *.rpm <==所有在你 Linux 主機上面安裝過的套件才升級

      注意的是， Uvh 是升級您所寫入的套件，至於 Fvh 則是『僅升級在您的系統裡面存在的套件』，所以有的朋友在大量的進行套件版本修補的時候，他們都是這樣做的：

      1. 先到各發展商的 errata 網站上捉下來最新的 i386 檔案；
      2. 使用 -Fvh 來將您的系統內曾安裝過的套件進行修補與升級！（真是方便呀！）

    • 查詢：
      查詢也是 RPM 的重要功能之一，因為他提供了這個套件的版本、用途等資訊，是相當有用的！那麼如何查詢呢？底下列出只要的查詢參數：

      1. 從系統查詢（由 /var/lib/rpm 資料庫取得的資料）
      [root @test /root]# rpm -q rp-pppoe <==僅列出 rp-pppoe 這個套件的版本；
      [root @test /root]# rpm -qa <==列出所有安裝過的套件與版本；
      [root @test /root]# rpm -qi rp-pppoe <==列出 rp-pppoe 這個套件的詳細資訊
      [root @test /root]# rpm -ql rp-pppoe <==列出 rp-pppoe 這個套件安裝的檔案與路徑；
      [root @test /root]# rpm -qf /etc/rc.d/init.d/pppoe <==查詢 pppoe 這個檔案屬於哪一個套件？

      2. 由檔案查詢檔案的內容
      [root @test /root]# rpm -qpi rp-pppoe-2.6-5.src.rpm <==查詢這個套件的詳細資訊；
      [root @test /root]# rpm -qpl rp-pppoe-2.6-5.src.rpm <== 查詢這個套件裡面有多少的檔案內容存在

      • 查詢套件：查詢安裝過的套件可以使用 -q 即可知道他的套件版本，但是如果忘記套件的全名，那麼可以使用
        rpm -qa | grep pakagename 來選擇出適當的套件！
        若使用 -qi 則可以瞭解這個套件的主要資訊！
      • 尋找套件檔案：常常我們忘記一個套件內容含有的檔案時，可以使用 -ql 來查詢該套件，會列出相當多的檔案呦！
      • 由檔案尋找套件：這是最長發生的問題，就是您『誤砍』了某個檔案，偏偏不知道他是哪一個套件的，呵呵！那麼你可以請跟你同樣系統的朋友，使用 -qf 來查詢該檔案所屬的套件，然後重新安裝該套件就可以就回來啦！

    • 驗證：
      驗證的功能主要在於提供系統管理員一個有用的管理機制！作用的方式是『使用 /var/lib/rpm 底下的資料庫內容來比對目前 Linux 系統的環境下的所有套件檔案』也就是說，當您有資料不小心遺失，或者是因為您誤殺了某個套件的檔案，或者是不小心不知道修改到某一個套件的檔案內容，就用這個簡單的方法來驗證一下原本的檔案系統吧！好讓您瞭解這一陣子到底是修改到哪些檔案資料了！

      [root @test /root]# rpm -V rp-pppoe <==單純檢查 rp-pppoe 這個已安裝套件的檔案內容與原先是否相同
      [root @test /root]# rpm -Va <==檢查所有的 /var/lib/rpm 底下的資料庫與 Linux 系統下是否相同的檔案！

      範例：
      [root @test /root]# rpm -V xinet
      S.5....T c /etc/xinetd.d/echo
      S.5....T c /etc/xinetd.d/echo-udp
      S.5....T c /etc/xinetd.d/time
      S.5....T c /etc/xinetd.d/time-udp

      在檔案名稱前面的參數說明
      S ：file Size differs（檔案的容量大小已被改變）
      M ：Mode differs (includes permissions and file type)（檔案的類型或檔案的屬性，如是否可執行等參數已被改變）
      5 ：MD5 sum differs（MD5 這一種加密防駭的屬性已被改變）
      D ：Device major/minor number mis-match（裝置名稱已被改變）
      L ：readLink(2) path mis-match（Link 屬性已被改變）
      U ：User ownership differs（檔案的所屬人已被改變）
      G ：Group ownership differs（檔案的所屬群組已被改變）
      T ：mTime differs（檔案的建立時間已被改變）

      [root@test RPM]# rpm -ql crontabs <==查詢 crontabs 有哪些檔案？
      /etc/cron.daily
      /etc/cron.hourly
      /etc/cron.monthly
      /etc/cron.weekly
      /etc/crontab
      [root@test RPM]# rpm -V crontabs <==這些檔案有哪些已經被修改了？
      S.5....T c /etc/crontab

      例如上面的範例中，我們知道了 crontabs 有五個檔案或目錄，其中，如果驗證一下的話，就會發現 /etc/crotab 已經被改過了?那麼如果該檔案的變更是『預期中的』，那麼就沒有什麼大問題，但是如果該檔案是『非預期的』，那麼是否被入侵了呢？呵呵！得注意注意囉！

    • 反安裝與重建資料庫：
      反安裝就是將套件解除安裝啦！要注意的是，『解安裝的過程一定要由最上層往下解除』，以 rp-pppoe 為例，這一個套件主要是依據 ppp 這個套件來安裝的，所以當您要解除 ppp 的時候，就必須要先解除 rp-pppoe 才行！否則就會發生結構上的問題啦！這個可以由建築物來說明，如果你要拆除五、六樓，那麼當然要由六樓拆起，否則拆了第五樓，那麼上面的樓層難道會懸空？

      那麼重建資料庫呢？由於我們會一直在修改一些檔案內容，例如 /etc/xinetd.d 裡頭的參數檔案，加上可能自系統操作的過程中新增、移除等等的動作，導致系統的資料庫有點亂，這個時候可以使用 --rebuilddb 來重建一下 rpm 的資料庫！這兩個方法的參數如下囉

      [root @test /root]# rpm -e re-pppoe <==解安裝 rp-pppoe
      [root @test /root]# rpm --rebuilddb <==重建資料庫
Tarball 套件管理員：
    還記得我們使用過的打包指令 tar 嗎？使用 tar 並且以 gzip 進行壓縮的檔案，就稱為 Tarball 啦！這個是最原始的原始碼檔案喔！底下談一談他囉！

  • 什麼是 Tarball ( source code )
    其實 tarball 就是以 *.tar.gz 壓縮之後的 binary 原始檔啦！還記得 tar 怎麼使用嗎？記得回去第二篇瞧一瞧去！由於軟體開發商為了適應各種工作平台，所以通常他們都會將整個軟體以較龐大的原始檔案創建下來，裡頭除了(1)最重要的原始碼之外，另外包含了(2)針對各個不同的平台編譯與操作參數而訂定的偵測與參數設定檔，然後將這些東西以 tar 這個彙整壓縮軟體將整個軟體下的目錄壓縮成一個檔案，由於是經過類似打包壓縮的動作，嘿嘿！那就是所謂的 tarball 囉！因此，當您看到一個 tarball 的檔案，不要懷疑，裡頭通常是包含了原始碼的！

    剛剛說 tarball 可以適應在各個不同的平台上面，那麼他是怎麼辦到的呢？因為各個平台的操作環境都不相同吶！嗯！為了要讓使用者便於安裝，所以通常軟體開發者會寫一支小 scripts 來偵測使用者的系統，以及偵測該軟體所需要的前驅軟體是否存在你的 Linux 環境中，以便利於後續的編譯過程與安裝步驟！利用這樣的一個 script 幾乎就可以完整的建立起基本的參數設定檔了。基本上，如果前驅軟體都已經安裝完畢，那麼使用 tarball 幾乎『一定可以安裝成功』的，而且安裝上面也不麻煩，大多只要執行三~四個步驟即可安裝完畢！而且，使用者『可以自行設定安裝的路徑』，以便於管理。

    不過， tarball 在另一方面有個相當嚴重的困擾，那就是反安裝的部分。在 RPM 上面的反安裝是蠻簡單的一件事，只要克服了屬性相依的問題之後，要反安裝只要下達 rpm –e package 即可！但是 tarball 可沒有這麼簡單呢！因為他並沒有紀錄當初安裝檔案的資料庫，所以，要反安裝的時候，可能需要一個檔案一個檔案的手動去除?嗄?這麼麻煩？那麼有沒有什麼方法可以比較容易管理呢？有呀！就是利用安裝在特定的目錄下的方式來管理，就會比較清楚一點！而且也會比較容易未來進行主機的移交作業?通常我們會給您這樣的建議：

    1. 最好將 tarball 的原始資料解壓縮到 /usr/local/src 當中；
    2. 安裝時，最好安裝到 /usr/local 這個預設路徑下；
    3. 考慮未來的反安裝步驟，最好可以將每個套件單獨的安裝在 /usr/local 底下，例如安裝 rp-pppoe-2.6.tar.gz 時，則可以指定該套件需要安裝於 /usr/local/rp-pppoe 當中，如此一來，如果該套件會將所有的資料都寫入 /usr/local/rp-pppoe 當中，因此，未來如果要移除該套件，只要將該目錄刪除即可視為成功的移除了！
    4. 不過單獨安裝某個套件在某一特定路徑下的作法，會導致當有 man page 的時候，使用預設的 MANPATH 會找不到相關的說明檔案內容。這個時候就必須要將 man page 的路徑加到 /etc/man.config 檔案中了！否則使用 man 也查詢不到指令的使用方法的。以上面的例子為例，如果是安裝了 /usr/local/rp-pppoe 當中，通常 man page 會放在 /usr/local/rp-pppoe/man 當中，所以，您就必需要在 /etc/man.config 裡面差不多 40~50 行左右的地方，加入底下這一行：
        MANPATH /usr/local/rp-pppoe/man
      這樣就可以使用 man 來查詢資料囉！

  • Tarball 需要的基礎套件
    雖然 Tarball 在安裝上面可以說『相當的簡單』，因為只要順著解開壓縮之後目錄裡面的 README 或 INSTALL 就可以安裝成功了！但是仍然有部分的困擾，例如：如果常常上 BBS 或者是新聞群組討論區的朋友，應該不難發現這個發問『我在執行某個程式的偵測檔案時，他都會告訴我沒有 gcc 這個套件，這是怎麼回事？』還有：『我沒有辦法使用 make 耶！這是什麼問題？』呵呵！必須要告訴大家的是，使用 tarball 的安裝時，『一定』需要幾個物件才行！這些物件在 Mandrake 或者是其他的 distribution 時，『預設都是不選擇的』，所以在安裝 Linux 的時候，請特別留意選擇的類別呢！底下這些東西都是必需的：
    1. 需要 Kernel sources files：常常一些 Tarball 在安裝時，會使用到 Kernel 的原始檔案，亦即在 /usr/src/linux 這個目錄底下的檔案，而該目錄是需要安裝或者編譯過核心才會存在的目錄！這個問題最常發生在『驅動程式的安裝與編譯』方面。所以當您在安裝 Linux 的時候沒有選擇 Kernel source 或者在之後沒有編譯核心時，呵呵！那麼可能就沒有辦法安裝了！

    2. 需要 make 及 autoconfig 等套件：需要另外注意的就是，我們還需要 make 這個套件才行！除此之外，還有 autoconfig 等等的套件也需要安裝才行！這兩個東西可以讓參數設定檔( 通常就是 Makefile 這個檔案 )順利的被執行。

    3. 需要 gcc 或 cc 等編譯軟體 ( compiler )：如果沒有編譯的軟體，那麼自然也就無法將原始程式碼編譯成可以執行的檔案啦！所以至少要有一種編譯器才行！在 GNU 架構的 Linux 上面，我們通常使用的是 gcc 這個加強功能的 C 語言編譯器啦！請注意：除了 gcc 之外，連同上面的 make 等等的套件，幾乎都在安裝 Linux 的時候的那個 Software Development 咚咚裡頭！也就是說，若是您當初 安裝 的時候，選擇的是我建議的那種安裝方式的話，那麼您的 tarball 安裝應該問題不大，若是沒有安裝的話，那麼肯定很多的套件是無法編譯成功的！這個時候只好拿出您的原版光碟，一個一個 RPM 套件加入您的 Linux 系統當中吧！ @_@

    4. 特別留意安裝時候的選擇工具：由於在安裝的時候『預設選項並沒有將 Kernel Development 及 Software Development 加入安裝的行列』，所以您如果選擇預設選項的話，呵呵！那麼使用 tarball 的工具就會顯的力不從心！這一點還請特別特別留意呢！

  • 一般安裝步驟：
    基本上， tarball 的安裝主要就是：

    1. 將 tarball 在 /usr/local/src 解壓縮；
    2. 在軟體解壓縮的路徑下建立 Makefile 這個參數設定檔案；
    3. 以 make 這個程式並使用該目錄下的 Makefile 做為他的參數設定檔，來進行 make (編譯或其他) 的動作；
    4. 以 make 這個程式，並以 Makefile 這個參數設定檔，依據 install 項目的指定來安裝到正確的路徑！

    此外，通常在每個軟體的 tarball 中，都會附上 INSTALL 或者是 README 這種檔名的說明檔，這些說明檔請『務必詳細閱讀』過一遍，通常這些檔案會記錄這個軟體的安裝要求、軟體的工作項目、與軟體的安裝參數設定及技巧等，只要仔細的閱讀完這些檔案，基本上，要安裝好 tarball 的檔案，都不會有什麼大問題囉?那麼那個 make 在幹嘛？一般而言， make 會依據 Makefile 這個檔案的內容，去執行清除目標檔(object file)或者是編譯或者是安裝的步驟，對於安裝 source code 的人來說，這個 make 是相當重要的！在 Makefile 這個檔案中，會有一些不同的步驟應該要進行的工作項目，例如 clean, install, compile 等等，而如果要執行清除的步驟，就是 make clean ，安裝就下達 make install ，亦即 make 後面接欲進行的工作，那麼 make 這個工具就會依據 Makefile 這個檔名的檔案去讀取相關的步驟訊息，而進行該有的動作！

    OK！我們底下約略提一下大部分的 tarball 軟體之安裝的指令下達方式：

    1. ./configure ：這個步驟就是在建立 Makefile 這的檔案囉！通常程式開發者會寫一支 scripts 來檢查您的 Linux 系統、相關的套件屬性等等，這個步驟相當的重要，因為未來您的安裝資訊都是這一步驟內完成的！另外，這個步驟的相關資訊應該要參考一下該目錄下的 README 或 INSTALL 相關的檔案！！基本上，這個步驟完成之後會建立（或修改）一個 Makefile ，這就是參數檔啦！

    2. make clean：make 會讀取 Makefile 中關於 clean 的工作。這個步驟不一定會有，但是希望執行一下！為什麼呢？因為在進行編譯的時候，會產生一些 *.o 的檔案，例如有個 abc.c 的原始碼，經過編譯後會變成 abc.o 的檔案！我們稱這些檔案為 object file ，這些檔案如果之前已經編譯過並留下來的話，那麼這次再編譯的時候，就不會編譯該檔案，然而由於我們可能已經修改了部分的參數，因此該檔案的編譯結果事實上應該會有所不同！因此，為了避免前一次留下來的資料可能影響到這次編譯的結果，所以通常可以進行一下這個步驟囉！

    3. make：make 會依據 Makefile 當中的預設工作進行編譯的行為！編譯的工作主要是進行 gcc 來將原始碼編譯成為可以被執行的 object files ，但是這些 object files 通常還需要一些函式庫之類的 link 後，才能產生一個完整的執行檔！使用 make 就是要將原始碼編譯成為可以被執行的可執行檔，而這個可執行檔會放置在目前所在的目錄之下，尚未被安裝到預定安裝的目錄中；

    4. make install：通常這就是最後的安裝步驟了，make 會依據 Makefile 這個檔案裡面關於 install 的項目，將上一個步驟所編譯完成的資料給他安裝到預定的目錄中，就完成安裝啦！

    5. 特別留意：請注意，上面的步驟是一步一步來進行的，而其中只要一個步驟無法成功，那麼後續的步驟就完全沒有辦法進行的！因此，要確定每一的步驟都是成功的才可以！舉個例子來說，萬一今天你在 ./configure 就不成功了，那麼就表示 Makefile 無法被建立起來，要知道，後面的步驟都是根據 Makefile 來進行的，既然無法建立 Makefile ，後續的步驟當然無法成功囉！另外，如果在 make 無法成功的話，那就表示原始檔案無法被編譯成可執行檔，那麼 make install 主要是將編譯完成的檔案給他安裝下去的，既然都沒有成功的執行檔了，怎麼進行安裝？所以囉，要每一個步驟都正確無誤才能往下繼續做！此外，如果安裝成功，並且是安裝在獨立的一個目錄中，例如 /usr/local/packages 這個目錄中好了，那麼您就必需手動的將這個套件的 man page 給他放到 /etc/man.config 裡面去，設定的方法如前面提到的一般所示。

  • Tarball 的移除與升級：
    再來就要談到惱人的 tarball 的移除跟升級了?Tarball的移除難易度跟(1)當初設定參數檔時候的安裝目錄與(2)這個套件本身要求的檔案放置目錄有關。如果我們以 apache 這個軟體來說明的話( 您的系統不見得有裝 )，那麼如果您以 RPM 的安裝方式來安裝時，會發現他的檔案放在哪裡呢？大多是放在：

    • /etc/httpd
    • /usr/lib
    • /usr/bin
    • /usr/share/man

    我們會發現他大致上是擺在 etc, lib, man, bin 等目錄當中，分別代表『設定、函式庫、線上說明檔、執行檔』，一個套件通常會將他的內容分為這四個目錄來放置，好了，那麼你是以 tarball 來安裝時呢？如果是放在預設的 /usr/local 裡面，由於 /usr/local 原本就預設這幾個目錄了，所以你的資料就會被放在：

    • /usr/local/etc
    • /usr/local/bin
    • /usr/local/lib
    • /usr/local/man

    但是如果你每個套件都選擇在這個預設的路徑下安裝的話，那麼所有的套件的檔案都將放置在這四個目錄當中，因此，如果你都安裝在這個目錄下的話，那麼未來在想要升級或移除的時候，就會比較難以追查檔案的來源囉?而如果您在安裝的時候選擇的是單獨的目錄，例如 /usr/local/apache 的話，那麼您的檔案目錄就會變成：

      /usr/local/apache/etc
      /usr/local/apache/bin
      /usr/local/apache/lib
      /usr/local/apache/man

    呵呵呵呵！自己的檔案都在同一個目錄之下，那麼要移除就簡單的多了！只要將該目錄移除即可視為該套件已經被移除囉?當然囉，實際安裝的時候還是得視該軟體的 Makefile 裡頭的 install 資訊才能知道到底他的安裝情況為何的?

    移除的方法是這樣，那麼升級呢？唉?升級有的時候也是很困擾啦！怎麼說呢？我們還是以 apache 來說明好了，如果您安裝的時候是使用 PHP + Apache + MySQL 的方式來安裝的，那麼每個套件在安裝的時候『都有一定的順序與程序！』因為他們三者之間具有相關性，所以安裝時必需要三者同時考慮到他們的函式庫與相關的編譯參數。那麼如果今天我只要升級 PHP 呢？有的時候因為只有涉及動態函式庫的升級，那麼我只要升級 PHP 即可！其他的部分或許影響不大。但是如果今天 PHP 需要重新編譯的模組比較多，那麼可能會連帶的，連 Apache 這個程式也需要重新編譯過才行?阿！真是有點給他頭痛的?沒辦法啦！使用 tarball 確實有他的優點啦，但是在這方面，確實也有他一定的傷腦筋程度? @_@
要選擇 RPM 還是 Tarball？
優先選擇 RPM：
這一直是個有趣的問題：『如果我要升級的話，或者是全新安裝一個新的套件，那麼該選擇 RPM 還是 Tarball 來安裝呢？』！基本上，如果有 RPM 可以提供給您的 distribution 來安裝，並且沒有嚴重的相依屬性的問題時，呵呵！選擇 RPM 來安裝會是一個比較好的解決方案， Why ？這是由於剛剛上面就提到的 RPM 的好處 啦！可以具有檔案與資料均有紀錄的優點，這就是上面提到的 /var/lib/rpm 這個目錄裡面的資料庫，個記錄可以讓你在管理上更為便利，包括上面提到的 RPM 的升級、安裝、驗證與移除等等。尤其是在查詢上面！可以讓你在管理你的系統上面更為便利。但是 RPM 也不是沒有缺點的，包括最為大家所抱怨連連的『屬性相依』的問題，每一個不同版本之間，就必須要以不同的 RPM 檔案來安裝！此外，如果要升級『某一個套件』而已時，通常還需要連帶其他的套件也必須要一起升級才行，否則會有問題！此外，當一個套件經過了『大幅度的修改』之後，通常舊的 RPM 與新的 RPM 之間已經幾乎無法『完全相容』時，呵呵！那麼升級或者是移除的手續可是會累壞人的！例如最近朋友們常常問到的 Apache 1.3.xx 與 2.0.xx 的版本升級問題！由於架構上面差異性太大，加上版本屬性相依問題很難得到一個完滿的解決方案，這個時候 RPM 就不那麼合適了。（除非您要一個一個的將 Apache 移除，連同其相依的套件，然後再將 Apache 一個一個的安裝，包括新套件的相依套件！ ^_^ .....我是不會這麼做的啦！）
簡易方法：
所以這個時候 Tarball 的方式就特別適合您的安裝了！這是因為 Tarball 可以自行設定編譯時的參數，此外，也可以自行設定『安裝路徑』，相當的適合於想要安裝『多個不同版本的同一個套件』的情況！這是怎麼說呢？！由於 RPM 必須要配合系統裡面其他的相依屬性的套件，所以基本上，他的安裝路徑（就是每個檔案的放置路徑）理論上是放死的，就是不能隨意的改變他的安裝路徑，因此，當有兩個不同版本的相同套件想要測試的時候，大概一定就得將原先的版本移除之後，才能安裝使用先的版本囉！（此外，由於相依的套件幾乎都已經包含在 tarball 當中了，所以安裝上面其實並不難啦！）
然而 tarball 可不是這樣的！你可以自行編譯並且安裝在不同的路徑，只要在啟動的時候啟動適當的版本，那麼不同版本的套件可以同時的存在於一個系統當中，而且可以透過選擇啟動的檔案來啟動不同的版本。當然囉！你也可以讓 tarball 的安裝與 RPM 的安裝同時存在於一個系統當中，但是需要特別留意的是，你在啟動該套件的時候，千萬記得你的啟動路徑！免得啟動到了錯誤的版本了！呵呵！（這也是一個系統存在不同多個版本的套件容易發生的錯誤！希望大家都能夠瞭解這個問題呢！）
所以說，為了避免這種路徑上的錯誤困擾，基本上，我們都希望 Tarball 的安裝路徑可以設定在 Linux 原本就規劃要給大家安裝的路徑『 /usr/local 』這個路徑下！這樣可以省去相當多尋找檔案的時間！而且在管理上面也會比較容易！呵呵！
不過， Tarball 最麻煩的地方有幾點：
  • 反安裝：
    Tarball 最麻煩的地方就在於他的『解安裝』了！相當的討厭！如果是簡單的直接將所有的套件安裝在一個目錄下的話，例如 /usr/local/mrtg 時，那麼解安裝還算簡單，就是將該路徑殺掉就 OK 啦！但是如果是類似 sendmail 這一種呢？他的路徑都是已經放置死的（需要在 /etc/sendmail.cf、/etc/mail 底下）那麼追蹤反安裝的路徑就很煩人；
  • 線上查詢：
    如果您的安裝路徑是在 /usr/local 底下的話，那麼執行檔會被放置到 /usr/local/bin ，或者是 /usr/local/sbin 底下，參數檔會放在 /usr/local/etc 底下，線上查詢檔案會放在 /usr/local/man 底下，所以在設定上面還有查詢上面還算簡單（路徑設定一下即可！），不過，如果你是將套件安裝在單獨的路徑下呢？例如 /usr/local/mrtg 底下，那麼執行檔變成了 /usr/local/mrtg/bin 底下，最麻煩的地方就是 man page （線上查詢）放置的地點會變成在 /usr/local/mrtg/man 底下了！糟糕！那麼預設的 man page 路徑就找不到該說明檔囉！這個時候就必須要手動的將該路徑加入 /etc/man.conf 這個檔案中！而且執行檔放置的路徑也沒有指定，可以經由 (1)Link 的方式或者 (2)設定 PATH 環境變數的方式將該路徑加進去啦！確實是比較麻煩的啦！
所以說，RPM 與 Tarball 各有其優缺點，不過，如果有 RPM 的話，那麼優先權還是在於 RPM 安裝上面，畢竟管理上比較便利，但是如果套件的架構差異性太大，或者是無法解決相依屬性的問題，那麼與其花大把的時間與精力在解決屬性相依的問題上，還不如直接以 tarball 來安裝，輕鬆又愜意！
函式庫資料： ldconfig, ldd,
    什麼是函式庫呢？由於我們使用的 Linux 是一個相當不算小的作業系統，裡頭的資料可是相當多的，然而有些執行程式所使用的系統資源都是相同的，例如登入的時候不論 ftp, ssh, telnet 都需要使用到 pam 模組，那麼是不是所有的執行程式都需要將 pam 的資料寫入程式當中呢？當然不需要了！因為系統本身就已經有 pam 了呀！那麼如何使用這些系統提供的資訊呢？呵呵！這個時候動態的函式庫就不可或缺了！同時，需要特別留意的是，有相當多的函式庫都是『根據 kernel 的版本來設定的』，所以不同版本的 kernel 最好不要隨意的互相更換呦！容易造成很多執行程式無法使用其函式庫，而掛點的情況發生的！底下我們來談一談怎麼獲得函式庫的資料！
  • ldconfig

    [root @test /root]# ldconfig [-f conf] [-C cache] [-p]
    參數說明：
    -f conf ：使用 conf 作為 libarary 函式庫的取得，而不以 /etc/ld.so.conf 為預設值
    -C cache：使用 cache 作為快取暫存的函式庫資料，而不以 /etc/ld.so.cache 為預設值
    -p　　　：列出目前有的所有函式庫資料內容（在 /etc/ld.so.cache 內的資料！）
    範例：
    [root @test /root]# ldconfig -p
    333 libs found in cache `/etc/ld.so.cache'
    libz.so.1 (libc6) => /usr/lib/libz.so.1
    libz.so (libc6) => /usr/lib/libz.so
    libxsltbreakpoint.so.1 (libc6) => /usr/lib/libxsltbreakpoint.so.1
    libxslt.so.1 (libc6) => /usr/lib/libxslt.so.1
    libxrx.so.6 (libc6) => /usr/X11R6/lib/libxrx.so.6
    libxrx.so (libc6) => /usr/X11R6/lib/libxrx.so
    ........
    [root @test /root]# more /etc/ld.so.conf
    /usr/kerberos/lib
    /usr/X11R6/lib
    [root @test /root]# ldconfig <==以 /etc/ld.so.conf 的內容進行函式庫的重建（ /etc/ld.so.cache ）
    說明：
    系統預設的函式庫都是由 ldconfig 設定後寫入 /etc/ld.so.cache 當中！然後供系統來讀取使用！那麼您如何知道目前的函式庫有多少呢？呵呵！使用 ldconfig 就可以知道啦！以 ldconfig -p 可以列出 /etc/ld.so.cache 的內容呢！那麼 /etc/ld.so.conf 又是什麼呢？！很簡單，那就是『目前你的系統中主要的函式庫放置的目錄』，以上式為例，則主要的 XFree86 函式庫放置在 /usr/X11R6/lib 當中，另外還有常用的 kerberos 的函式庫也擺在其中！如果您的其他函式庫需要寫入系統中，讓系統可以很快的找到該函式庫而予以取用的話，那麼將你所安裝的套件（通常是 tarball 的套件）所產生的 lib 目錄，給他寫到 /etc/ld.so.conf 這個檔案中，然後再以 ldconfig 重新建立 /etc/ld.so.cache 即可！
  • ldd

    [root @test /root]# ldd [-vdr] [filename]
    參數說明：
    -v ：列出所有內容資訊；
    -d ：重新將資料有遺失的 link 點秀出來！
    -r ：將 ELF 有關的錯誤內容秀出來！
    範例：
    [root @test /root]# cd /lib
    [root @test /lib]# ldd libdb.so
    libc.so.6 => /lib/libc.so.6 (0x400ae000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
    [root @test /lib]# ldd -v libdb.so
    libc.so.6 => /lib/libc.so.6 (0x400ae000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

    Version information:
    ./libdb.so:
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
    /lib/libc.so.6:
    ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.2) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2

    說明：
    如果您常常升級安裝 RPM 的套件時，應該常常會發現那個『相依屬性』的問題吧！？沒錯！我們可以先以 ldd 來視察『相依函式庫』之間的相關性！以先取得瞭解！例如上面的例子中，我們檢查了 libc.so 這個在 /lib 當中的函式庫，結果發現他其實還跟 libc.so.6 有關呢！也與 ld-linux.so.2 有關說！所以我們就需要來瞭解一下，那個檔案到底是什麼套件的函式庫呀！？使用 -v 這個參數還可以得知該函式庫來自於哪一個套件！像上面的資料中，就可以得到該 libc.so.6 其實可以支援 GLIBC_2.1.1 等的版本！
檢驗軟體正確性
在我們的 Linux 系統當中，為了怕系統商（ distribution ）推出的檔案被修改過，因此都會有所謂的 MD5 的軟體指紋驗證功能！例如在南台灣最大的 ftp 學術網站 中山大學的 ftp 網站 裡頭的 Red Hat 7.3 這個可開機光碟的完整套件，在該目錄底下，除了完整的的可開機光碟的映象檔(image)之外，還會附上一個檔名為 MD5SUM 的檔案，這個檔案的內容有點像這樣：

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

c9a4d963a49e384e10dec9c2bd49ad73 valhalla-SRPMS-disc1.iso
41b03d068e84d2a17147aa27e704f79b valhalla-SRPMS-disc2.iso
cb91810ce8173039fed24420407e4c59 valhalla-i386-disc1.iso
ec1b813d32ffdc8edc2be261735d17de valhalla-i386-disc2.iso
5dc81ce523cfddf99b4d4d63e91bcaa7 valhalla-i386-disc3.iso
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE8z/oCIZGAzdtCpg4RAsMvAJ9+xOn4Pw1T0mp8zVT64cEDWuqqKwCfblTd
4Lw0SvJC+v/6JbGIxJWL7aA=
=0xs+
-----END PGP SIGNATURE-----

這說明的是，『在 valhalla-i386-disc1.iso 這個檔案中，有個 MD5SUM 的檔案指紋表，如果該檔案是原本開發廠商提供的檔案時（沒有被修改過！），則以 md5sum 這支程式進行檢驗時，會得到左邊的指紋表！』那有什麼用呢？！呵呵！用途可大了，前一陣子不是常常發現有些免費的軟體被利用來作為收集使用者的電子郵件、常上網站資料，及其他使用者私人的資訊嗎？嘿嘿！那就是利用軟體的特性來『偷』使用者的咚咚，那麼萬一 Red Hat 提供的光碟映象檔(image)被下載之後，讓有心人士偷偷修改過，再轉到 Internet 上面流傳，那麼你下載的這個檔案偏偏不是原廠提供的，呵呵！你能保證該檔案的內容完全沒有問題嗎？！當然不能對不對？！是的，這個時候就有 md5sum 這個檔案指紋的咚咚出現啦！說說他的用法吧！
  • md5sum

    [root @test /root]# md5sum [-bct] filename
    [root @test /root]# md5sum [--status|--warn] --check filename
    參數說明：
    -b ：使用 binary 的讀檔方式，預設為 Windows/DOS 檔案型態的讀取方式；
    -c ：檢驗 md5sum 檔案指紋；
    -t ：以文字型態來讀取 md5sum 的檔案指紋。
    範例：
    [root @test /root]# md5sum -t logfile.sh　　　　　<==使用文字型態來檢驗檔案的 md5
    2a6da1ba121c7a83496fa2afc3e522bb logfile.sh　　　<==顯示出的這個檔案的 md5 內容

    [root @test /root]# echo testing >> logfile.sh　　<==改變一下檔案內容看看；

    [root @test /root]# md5sum -t logfile.sh　　　　　<==再檢查一下
    dc39058c7acbad49fbd13946407c2152 logfile.sh　　　<==嘿嘿！密碼的內容不一樣了！！

    [root @test /root]# md5sum --status --check logfile.sh <==看此檔案有無 md5sum 的指紋創建
    md5sum: logfile.sh: no properly formatted MD5 checksum lines found
    因為這個檔案是我自己建立的，並沒有寫入任何的 md5 資料，所以....

    說明：
    一般而言，每個系統裡面的檔案內容大概都不相同，例如你的系統中的 /etc/passwd 這個登入資訊檔與我的一定不一樣，因為我們的使用者與密碼、 Shell 及家目錄等大概都不相同，所以由 md5sum 這個檔案指紋分析程式所自行計算出來的指紋表當然就不相同囉！以上面的例子來說明，當原本的 logfile.sh 被改變之後，在經由 md5sum 計算一次，嘿嘿！指紋改變了∼∼這說明了我們的檔案被修改過了，與原先的內容不相同囉！
    好了，那麼如何使用這個東西呢？基本上，您必須要為您的這些重要的檔案進行指紋資料庫的建立（好像在做戶口調查！），將底下這些檔案建立資料庫：

    • /etc/passwd
    • /etc/shadow（假如你不讓使用者改密碼了）
    • /etc/group
    • /usr/bin/passwd
    • /sbin/portmap
    • /bin/login （這個也很容易被駭！）
    • /bin/ls
    • /bin/ps
    • /usr/bin/top

    等等，這幾個檔案最容易被修改了！因為很多木馬程式執行的時候，還是會有所謂的『執行序, PID』為了怕被 root 追查出來，所以他們都會修改這些檢查排程的檔案，如果你可以替這些檔案建立指紋資料庫（就是使用 md5sum 檢查一次，將該檔案指紋記錄下來，然後常常以 shell script 的方式由程式自行來檢查指紋表是否不同了！），那麼對於檔案系統會比較安全啦！！
網路資源
剛剛最前面說過了，套件升級最主要的考量就是『安全性』啦！所以請隨時注意安全性方面的問題！目前國內的主要安全網站為：『台灣網路危機處理小組』這個組織，請隨時注意上面發佈的新聞！另外，如果跟鳥哥一樣使用的是 Red Hat 的 distrubution 的話，那麼 Red Hat 的 Errata 網頁則不可不光臨！好啦！底下列出幾個 RPM 相關的網頁與 Red Hat 的 Errata 網頁提供大家參考囉！
  • RPM 包裝檔案管理程式：http://www.study-area.org/tips/rpm.htm
  • 中文 RPM HOW-TO：http://www.linux.org.tw/CLDP/RPM-HOWTO.html
  • RPM 的使用：http://linux.tnc.edu.tw/techdoc/rpm-howto.htm
  • 大家來作 RPM ：http://freebsd.ntu.edu.tw/bsd/4/3/2/29.html
  • 一本 RPM 的原文書：http://linux.tnc.edu.tw/techdoc/maximum-rpm/rpmbook/
  • Red Hat 的 Errata 網頁：http://www.redhat.com/apps/support/errata/
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/08/21：第一次完成
2003/02/11：重新編排與加入 FAQ
2002/05/08 以來統計人數


動手製作 SRPM
最近更新日期：2003/02/11
SRPM 需要的套件：
SRPM 使用到的目錄：
設定檔的主要內容：
SRPM 的編譯指令：
打包自己的套件：
本章習題練習
SRPM 需要的套件：
在上一節當中，我們介紹了 RPM 這個既可愛又可恨的傢伙，RPM 的可愛在於他的資料庫管理方式，很容易去查詢與升級，而他的可恨呢？呵呵！就是在於他的 binary 的檔案不能再改變他的原始設定內容 ( 就是 *.rpm 的檔案不能再重新編譯的意思 )，與套件及套件之間的屬性相依的問題∼還真是傷腦筋吶！
沒有關係，現在有解決的方法了！我們可以利用『含有 source code 的 SRPM 』來重新編譯 *.rpm 的檔案成為我們所希望的樣式了！就因為在 SRPM 裡面含有的不是 binary 的檔案，而是含有 source code ，因此 SRPM 是不能直接拿來安裝成為可執行的檔案的。必需要將他重新編譯，並且打包成為類似 i386, i586, i686 等等 RPM 的檔案之後，才能夠安裝在我們的系統當中哩！這個時候你就應該會想像啦，咦！既然如此的話，那麼在編譯的過程當中，我們是否可以加入其他的設定參數，來讓我們的 SRPM 可以依照我的想法來編譯呢！？哈哈！答對了！所以呢，這個時候我們就要來修改別人的 SRPM 以及編譯自己的套件啦！
不過這裡需要特別留意的就是，因為 SRPM 需要重新編譯，而編譯的過程當中，我們至少需要有 make 與其相關的程式，及 gcc, c, c++ 等其他的編譯用的程式語言來進行編譯，所以，如果您在安裝的過程當中沒有選取軟體開發工具之類的套件，呵呵！得重新拿出你的光碟，然後再安裝喔！哈哈！只是得要克服一大堆的屬性相依的問題就是了∼嗯！還是建議您再次的看一下如何安裝吧！
SRPM 使用到的目錄：
SRPM 既然含有 source code ，那麼其中必定有設定檔囉，所以首先我們必需要知道，這個 SRPM 在進行編譯的時候，會使用到哪些目錄呢？這樣一來才能夠來修改嘛！你可以到你的 /usr/src 這個目錄裡面去查看一下，通常每個 distribution 提供的目錄都不太相同，以 Mandrake 9.0 為例，他是以 /usr/src/RPM 為工作目錄， Red Hat 是以 /usr/src/redhat 為工作目錄， Openlinux 則是以 /usr/src/openlinux 為工作目錄！無論如何，反正就是在 /usr/src 這個目錄下就對了！好了到 /usr/src/redhat 裡頭去看一看呦：
  • /usr/src/redhat/SPEC：這個目錄當中放置的是該套件的設定檔，例如這個套件的資訊參數、設定項目等等都放置在這裡；
  • /usr/src/redhat/SOURCE：這個目錄當中放置的是該套件的原始檔（*.tar.gz的檔案）以及 config 這個設定檔；
  • /usr/src/redhat/BUILD：在編譯的過程中，有些暫存的資料都會放置在這個目錄當中；
  • /usr/src/redhat/RPMS：經過編譯之後，並且順利的編譯成功之後，將打包完成的檔案放置在這個目錄當中。裡頭有包含了 i386, i586, i686, noarch.... 等等的次目錄。
此外，在編譯的過程當中，可能會發生不明的錯誤，或者是設定的錯誤，這個時候就會在 /tmp 底下產生一個相對應的錯誤檔，您可以根據該錯誤檔進行除錯的工作呢！等到所有的問題都解決之後，也編譯成功了，那麼剛剛解壓縮之後的檔案，就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的檔案都會被殺掉，而只剩下放置在 /usr/src/redhat/RPMS 底下的檔案了！
設定檔的主要內容：
剛剛我們在上面提過了，SRPM還可以更改一些設定的內容，那麼要如何修改這些設定的內容呢？我們以簡單的 rp-pppoe 這個套件來說明好了，你可以連上 Internet 上面的 rp-pppoe 官方網站下載 SRPM ，或者由以下的方式來下載這個套件(請注意底下的檔案是 2002/11 最新的檔案資料，有可能在您看到本文時，這個套件已經更新了，所以請直接上底下的網址來下載吧！http://www.roaringpenguin.com/pppoe/)。至於基本的過程如下：

1. 下載 SRPM 軟體：
[root @test root]# wget http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5-1.src.rpm

2. 將 SRPM 解開在/usr/src/redhat 底下的目錄當中
[root @test root]# rpm –i rp-pppoe-3.5-1.src.rpm

3. 觀察一下有哪些原始碼呢？
[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCE]# ls –l
-rw-rw-r-- 1 root root 189321 Jul 8 22:38 rp-pppoe-3.5.tar.gz
呵呵！上面顯示我們的原始碼就是這個檔案啦！

好了，來看看我們的設定參數檔，亦即是在 /usr/src/redhat/SPECS 內的 *.spec 檔案囉！

觀察一下預設的設定檔案內容：
[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi rp-pppoe.spec

沒錯！這個就是SRPM的預設設定內容檔案囉，進去修改一下，裡面的資料有點像這樣：
Summary: PPP Over Ethernet (xDSL support)
Name: rp-pppoe
Version: 3.5
%if %(%{expand:test %{_vendor} != mandrake ; echo $?})
Release: 1mdk
%else
Release: 1
%endif
Copyright: GPL
Group: System Environment/Daemons
Source: http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5.tar.gz
Url: http://www.roaringpenguin.com/pppoe/
Packager: David F. Skoll <dfs@roaringpenguin.com>
BuildRoot: /tmp/pppoe-build
Vendor: Roaring Penguin Software Inc.
Requires: ppp >= 2.3.7

# LIC: GPL
%description
PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by
many ADSL Internet Service Providers. Roaring Penguin has a free
client for Linux systems to connect to PPPoE service providers.

The client is a user-mode program and does not require any kernel
modifications. It is fully compliant with RFC 2516, the official PPPoE
specification.

%prep
%setup
cd src
./configure --mandir=%{_mandir}

%build
cd src
make
cd ../gui
make

%install
cd src
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT
cd ../gui
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc doc/CHANGES doc/HOW-TO-CONNECT doc/LICENSE doc/KERNEL-MODE-PPPOE README SERVPOET
%config(noreplace) /etc/ppp/pppoe.conf

註：中間還有很多資訊，被我省略掉了！知道了就好喔！

%changelog
* Thu Jul 21 2001 Shigechika AIKAWA <shige@cin.nihon-u.ac.jp>
- merged rp-pppeo.spec and rp-pppoe-gui.spec

注意到的是rp-pppoe.sepc這個檔案，這是主要的將SRPM編譯成RPM的設定檔，他的基本規則可以這樣看：
  1. 整個檔案的開頭以Summary為開始，這部份的設定都是最基礎的說明內容；
  2. 然後每個不同的段落之間，都以%來做為開頭，例如%prep與%install等；
我們來談一談幾個常見的SRPM設定段落：
  • 系統整體資訊方面：

    • Summary：主要的套件說明，例如上表中，我們說明了他是ppp的撥接用途啦！
    • Name：這個就是套件的名稱；
    • Version：這個是套件的版本資訊；
    • Release：這個是該版本打包的次數說明，在Mandrake裡面，會自動的幫你設定打包的次數喔！就是1mdk那個咚咚；
    • Copyright：這個套件的授權模式，我們是使用GPL啦！
    • Group：這個套件的發展團體名稱；
    • Source：這個套件的來源，如果是網路上下載的套件，通常一定會有這個資訊來告訴大家這個原始檔的來源！
    • Url：這個原始碼的主要官方網站； Packager：這個套件是經由誰來打包的呢？
    • Vender：發展的廠商哪；
    • ExclusiveArch：這個是說明這個套件的適合安裝的硬體，通常預設為i386，當然，你也可以調整為i586啦等等的！
    • Requires：如果你這個套件還需要其他的套件的支援，那麼這裡就必需寫上來，則當你製作成RPM之後，系統就會自動的去檢查啦！這就是『相依屬性』的主要來源囉！
上面幾個資料通常都必需要寫啦！但是如果你的軟體沒有相依屬性的關係時，那麼就可以不需要那個Requires囉！
  • %description
    將您的套件做一個簡短的說明！這個也是必需要的。
  • %prep
    這部份的設定在於『尚未進行設定或安裝之前，你要編譯完成的RPM幫你事先做的事情』，就是prepare的簡寫囉！那麼他的工作事項主要有：

    1. 尋找套件所需要的目錄是否已經存在？確認用的！
    2. 事先建立您的套件所需要的目錄，或者事先需要進行的任務；
    3. 如果待安裝的Linux系統內已經有安裝的時候可能會被覆蓋掉的檔案時，那麼就必需要進行備份(backup)的工作了！

    大致的工作就是這些啦！
  • %setup
    這個段落就是在建立我們在Tarball當中說明的那個Makefile檔案啦！所以呢，當然就是執行./config之類的設定檔案囉！那麼如果你要自己新增自己的參數，就可以在這個地方加入你的設定值！如果你的軟體本身沒有這方面的需要，裡面就不需要編寫內容囉！
  • %build
    build就是建立啊！所以當然囉，這個段落就是在談怎麼make編譯成為可執行的程式囉！
  • %install
    編譯完成(build)之後，就是要安裝啦！安裝就是寫在這裡，也就是類似Tarball裡面的make install的意思囉！
  • %files
    這個套件安裝的檔案都需要寫到這裡來，當然包括了『目錄』喔！所以連同目錄請一起寫到這個段落當中！以備查驗呢！^_^
  • %changelog
    這個主要則是在記錄這個套件曾經的更新紀錄囉！
好了，那麼如果您有自訂的資訊想要加入的話，就選擇你要加入的那個段落，將他修改一下吧！例如，如果你在設定Makefile的時候，希望能夠多一些額外的參數設定，那麼就找到 %setup 那個段落，將他修改成您所需要的樣子，就可以囉！
SRPM 的編譯指令：
再來呢？嗯！沒錯，修改完成了，自然就是要將他編譯成可以安裝的RPM檔案啦！這個時候我們就可以直接在/usr/src/redhat/SPECS底下下達：

[root @test SPECS]# rpm -bb rp-pppoe.spec <==編譯成RPM檔案
[root @test SPECS]# rpm -ba rp-pppoe.spec <==打包成SRPM檔案

這個時候系統就會這樣做：
  1. 先進入到BUILD這個目錄中，在Mandrake 9.0當中就是/usr/src/RPM/BUILD，在Red Hat底下就是/usr/src/redhat/BUILD這個目錄；
  2. 依照*.spec檔案內的Name與Version設定定義出工作的目錄名稱，以我們上面的例子為例，那麼系統就會在BUILD目錄中先刪除rp-pppoe-3.5的目錄，再重新建立一個rp-pppoe-3.5的目錄，並進入該目錄；
  3. 在新建的目錄裡面，針對SOURCES目錄下的來源檔案，也就是*.spec裡面的Source設定的那個檔案，以tar進行解壓縮，以我們這個例子來說，則會在/usr/src/redhat/BUILD/rp-pppoe-3.5當中，將/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz進行解壓縮啦！
  4. 然後就開始%setup的工作；
  5. 再來開始%build及%install的設定與編譯！
  6. 最後將完成打包的檔案給他放置到該放置的地方去，如果你的規定的硬體是在i386的系統，那麼最後編譯成功的*.i386.rpm檔案就會被放置在/usr/src/RPM/RPMS/i386裡面囉！如果是i586那麼自然就是/usr/src/redhat/RPMS/i586目錄下囉！
整個步驟大概就是這樣子！最後的結果資料會放置在RPMS那個目錄底下就對啦！
打包自己的套件：
這個就有趣了！我們自己來編輯一下自己製作的RPM怎麼樣？會很難嗎？完全不會！這裡簡單的以一個小例子來說明喔！請注意，這個真的只是一個小例子，所以不要覺得奇怪喔！其中，比較需要注意的，由於在上面的步驟說明中，我們知道在將SRPM編譯成為RPM的時候，會以tar這支程式來將檔案解開，因此，我們在進行來源檔案的建立時，就必需要將他打包成為一個tar.gz的tarball的檔案才行！
假設我們編輯了一支script，內容是這樣：

[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCES]# vi showvbird.sh
#!/bin/bash
# This file is just used to demo the RPM packaging.
# the only thing is showing the hostname.
HOST=`/bin/hostname`
/bin/echo $HOST

[root @test SOURCES]# chmod 755 showvbird.sh
[root @test SOURCES]# tar –zcvf showvbird.tar.gz showvbird.sh
注意了，我們必需要將他打包才行！

上面的動作中，我們編輯了一個shell script檔案，檔名為showvbird.sh，並且將他打包成為具有gzip壓縮的tarball檔案，也就是showvbird.tar.gz這樣的檔案才行！請注意，這個showvbird.tar.gz檔案『必需』放置在SOURCES目錄之下！
再來則是要編輯那個很重要的*.spec檔案囉！你可以這樣簡單的編寫一下：

[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi showvbird.spec
Summary: This is a demo RPM package.
Name: showvbird
Version: 1.0
Release: 1
Copyright: GPL
Group: VBird's Home
Source: showvbird.tar.gz <==這個就是剛剛建立起來的 arball檔案！
Url: http://linux.vbird.org
Packager: VBird

%description
This package is just a demo RPM.

%prep
%setup –c
%install
install -m 755 showvbird.sh /usr/local/bin/showvbird.sh

%files
/usr/local/bin/showvbird.sh

好了！開始給他編譯並打包成為RPM檔案啦！

[root @test SPECS]# rpm -bb showvbird.spec
….(略)
Wrote: /usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm

最後這個被打包成功的檔案就被放置在/usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm囉！然後給他安裝一下：

[root @test SPECS]# rpm –ivh /usr/src/RPM/RPMS/i586/showvbird-1.0-1.i586.rpm
Preparing... ########################################### [100%]
1:showvbird ########################################### [100%]

[root @test SPECS]# rpm –qi showvbird
Name : showvbird Relocations: (not relocateable)
Version : 1.0 Vendor: (none)
Release : 1 Build Date: Wed 06 Nov 2002 11:27:17 PM CST
Install date: Wed 06 Nov 2002 11:27:42 PM CST Build Host: test.linux.org
Group : VBird's Home Source RPM: showvbird-1.0-1.src.rpm
Size : 143 License: GPL
Packager : VBird
URL : http://linux.vbird.org
Summary : This is a demo RPM package.
Description :
This package is just a demo RPM.

[root @test SPECS]# showvbird.sh
test.linux.org
[root @test SPECS]# rpm –ql showvbird
/usr/local/bin/showvbird.sh <==嘿嘿！已經記錄起來了！自己的軟體耶！

用很簡單的方式，就可以將自己的軟體或者程式給他修改與設定妥當！很不錯吧！以後您就可以自行設定你的RPM囉！當然，也可以手動修改您的SRPM的來源檔內容囉！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/12/04：第一次完成
2003/02/11：重新編排與加入 FAQ
2002/12/04 以來統計人數


核心( Kernel )編譯與模組管理
最近更新日期：2003/02/11
什麼是核心( Kernel )
我幹嘛要更新核心
核心的版本與何處下載最新核心
開始設定核心的內容
開始編譯囉！
安裝核心與 Lilo 多重開機設定
核心模組管理：模組編譯, depmod, lsmod, modinfo, modprobe, insmod, rmmod,
本章習題練習
什麼是核心( Kernel )
  • Linux Distribution：
    如果您已經從前面一路走來都沒有休息的話，那麼問您一個問題好了，那就是『什麼是 Linux distribution ？』呵呵！應該還沒有忘記吧？ Linux distribution 就是各個開發 Linux 這個作業系統的公司所丟出來的安裝光碟啦！舉個截至目前為止（2002/10）市場佔有率蠻高的幾個套件，例如： Red Hat, Mandrake, OpenLinux(Caldera) 等等，這些都是開發 Linux 作業系統的公司！好了，那麼怎麼這麼多家公司呀！那他們都是 Linux 嗎？沒錯！他們都是相同的使用 Linux 的『核心』來進行套件的開發的！也就是說，他們『本質』上都是一樣的！比較不同的地方可能是他們使用的套件不同或者是新加入的某些工具不同而已！基本上，他們都是 Linux ！所以囉，認真的學習某一個 distribution 也就夠了！其他的 distribution 絕大部分都是相同的耶！
  • Kernel：
    那麼到底什麼是核心呢？還記得我們在前面的 BASH shell 部分提到過：電腦真正在工作的東西其實是『硬體』，不是 Windows 、不是 Linux 也不是 Unix！其實就是 CPU 啦、記憶體啦、硬碟啦、音效卡啦、網路卡啦、、等等的硬體配備，那麼如何控制這些硬體呢？那就是核心的工作了！也就是說，核心是一個『作業系統』最底層的咚咚啦！你所希望電腦幫你達成的各項工作，都需要透過『核心』的幫助才行！當然囉，如果你想要達成的工作是核心所沒有辦法提供的，那麼你自然就沒有辦法透過核心來控制電腦使他工作囉！又如果你想要有網路功能（例如 NAT 服務），但是你的核心偏偏忘記加進去這項功能，那麼不論你如何『賣力』的設定該網路套件，很抱歉！不來電??換句話說，你想要讓電腦進行的工作，都必須要『核心有支援』才可以！！這個標準不論在 Windows 或 Linux 這幾個作業系統上都相同！如果有一個人開發出來一個『全新的硬體』，目前的核心不論 Windows 獲 Linux 都不支援，呵呵！那麼不論你用什麼系統，哈哈！這個硬體都是英雄無用武之地啦！那麼是否瞭解了『核心』的重要了呢？沒錯！所以我們需要來瞭解一下如何編譯我們的核心啦！

    關於驅動程式與核心的問題：很多朋友常常感到困惑的，就是 Linux 上面針對最新硬體的驅動程式總是慢了幾個腳步，所以覺得好像 Linux 的支援度不足！其實不可以這麼說的，為什麼呢？因為在 Windows 上面，對於最新硬體的驅動程式需求，基本上，也都是廠商提供的驅動程式才能讓該硬體工作的，因此，在這個『驅動程式開發』的工作上面來說，應該是屬於硬體發展廠商的問題，因為他要我們買他的硬體，自然就要提供消費者能夠使用的驅動程式啦！所以，如果大家想要讓某個硬體能夠在 Linux 上面跑的話，那麼似乎可以發起一人一信的方式，強烈要求硬體開發商發展 Linux 上面的驅動程式！這樣一來，也可以促進 Linux 的發展呢！
  • Linux 核心放在哪裡？
    好問題！那麼 Linux 核心放在哪裡呢？嘿嘿！還記得我們之前在安裝 Red Hat 7.2 裡頭就提過了吧！而且在開機的流程裡頭也有說明過，那個開機的順序是：

    1. BIOS
    2. MBR（就是 Lilo 或 Grub ）取得 boot loader；
    3. 取得核心 kernel 的資料並載入
    4. init
    5. 很多 scripts
    6. login 與 shell

    看到了吧！那個第三步驟就需要 kernel 囉！那個 kernel 其實就是 lilo.conf 裡頭說的 image 指到的那個檔案，也就是 vmlinuz 這個檔案啦！放置在 /boot 裡頭！我們需要的編譯出來的核心檔案就是這一個東西！除此之外，由於近來的核心通常是支援模組的，那個外掛模組則是放置在 /lib/modules/`uname -r` 裡面囉！
我幹嘛要更新核心
這個『核心』是除了 BIOS 之外，一個作業系統中最早被啟動的東西，他包含了所有可以讓硬體與軟體工作的資訊，所以，如果沒有搞定核心的話，那麼你的系統肯定會有點小問題！好了，那麼是不是將『所有目前核心有支援的東西都給他編譯進去我的核心中，那就可以支援目前所有的硬體與可執行的工作啦！』，這話說的是沒錯啦，但是你是否曾經看過一個為了怕自己今天出門會口渴、會餓、會冷、會熱、會被車撞、會摔跤、會被性騷擾，而在自己的大包包裡面放了大瓶礦泉水、便當、厚外套、短褲、防撞鋼樑、止滑墊、電擊棒....等一大堆東西，結果卻累死在半路上的案例嗎？當然有！但是很少啦！我相信不太有人會這樣做！（會這麼做的人通常都已經在醫院了∼）取而代之的是會看一下天氣，冷了就只帶外套，熱了就只帶短衣、如果穿的漂亮一點又預計晚點回家就多帶個電擊棒、出遠門到沒有便利商店的地方才多帶礦泉水....說這個幹什麼！對啦！就是要您瞭解到，核心的編譯重點在於『你要你的 Linux 作什麼？』，是啦！如果沒有必要的工作，就乾脆不要加在你的核心當中了！這樣才能讓你的 Linux 跑得更穩、更順暢！這也是為什麼我們要編譯核心的最主要原因了！

說到這裡突然想到以前國軍研究的『經國號戰鬥機』事件，在當時，經國號裡頭的配備都是『最棒的！』包括測量儀器、瞄準配備、武器系統等等，但是呢，卻配上一部普普通通的客機用引擎！挖哩ㄌㄟ?最早期試飛的時候，經國號竟然只能『在跑道上滑行！』真是悲哀！同樣的道理， Linux 的核心也是這樣的，如果你的硬體與核心之間沒有辦法達到良好的配合，那麼 Linux 確實可能會跑得不很順暢！！

Linux 的核心有幾個主要的特色，除了『Kernel 可以隨時、隨各人喜好而更動』之外，Kernel 的『版本更動次數太頻繁』也是一個特點！所以囉，除非你有特殊需求，否則一次編譯成功就可以啦！不需要隨時保持最新的核心版本，而且也沒有必要（編譯一次核心要粉久的ㄋㄟ！）。話說到這裡又突然想到今天看到的一篇文章，大意是說老闆想要雇用的人會希望是 Linux 的老手，因為他們比較容易瞭解問題的所在，除此之外，如果有任何問題發生，由於其使用 Linux 是可以隨時修補漏洞的！但是如果是 Windows 的話，就得要將機器關閉，直到 MS 推出修補套件後才能再啟用∼

那麼是否『我就一定需要在安裝好了 Linux 之後就趕緊給他編譯核心呢？』，老實說，『並不需要的』！這是因為幾乎在每一個 distribution 當中，他們已經預設好了相當大量的模組了，所以幾乎使用者常常或者可能會使用到的資料都已經被編譯成為模組（這個『模組』的意義後面會再解釋），也因此，呵呵！我們使用者確實不太需要重新來編譯核心！尤其是『一般的使用者，由於系統已經將核心編譯的相當的適合一般使用者使用了，因此一般入門的使用者，基本上，不太需要編譯核心』。OK！那麼鳥哥閒閒沒事幹跑來寫個什麼東西？既然都不需要編譯核心還寫編譯核心的分享文章，鳥哥賣弄才學呀！？很抱歉， VBird 雖然是個『不學有術』的混混，卻也不會平白無故的寫東西要您來指教∼當然是有需要才會來編譯核心啦！編譯核心的時機可以歸納為幾大類：
  • 新功能的需求：我需要新的功能，而這個功能只有在新的核心裡面才有，那麼為了獲得這個功能，只好來重新編譯我的核心了（例如 iptables 這個防火牆機制只有在 2.4.xx 版本裡面才有，而新出產的 AGP 顯示卡，很多也需要新的核心推出之後，才能正常而且有效率的工作！）再舉個例子，在之前的 Red Hat 7.2 的版本中，由於預設是將 CD-ROM 編譯成核心的『模組』，也就是說，核心本身還沒有支援 CD-ROM 的功能，必須要掛上模組之後才能使用與讀取這個 CD-ROM ！是否覺得很麻煩呢？呵呵！那麼這個時候，如果你想要直接讓 kernel 支援 CD ROM 的話，就得要重新編譯核心囉；
  • 原本核心太過臃腫：如果您是那種對於系統『穩定性』很要求的人，那麼對於核心多編譯了很多莫名其妙的功能而不太喜歡的時候，那麼就可以重新編譯核心來取消掉該功能囉；
  • 與硬體的搭配穩定性：由於原本 Linux 的核心大多是針對 Intel 的 CPU 來作開發的，所以如果你的 CPU 是 AMD 的系統時，有可能（注意！只是有可能，不見得一定會如此）會讓系統跑得『不太穩！』就 VBird 的經驗來看，使用舊的 Pentum 系列的舊機器安裝 Linux 的結果，還沒有胡亂當機的經驗！但是安裝在 K6-2, K6-3 上面的 Linux ，通常需要重新編譯一下核心會比較穩定一些！
  • 其他：就是你需要特殊的環境需求時，就得自行設計你的核心囉！（像是一些商業的套裝軟體系統，由於需要較為乾淨的作業系統，那麼他們的核心就需要更簡潔有力了！）
另外，需要注意重新編譯核心雖然可以針對你的硬體作最佳化的步驟（例如剛剛提到的 CPU 的問題！），不過由於這些最佳化的步驟對於整體效能的影響可能還不到百分之五，因此如果是為了增加效能來編譯核心的話，基本上，效益不大！然而，如果是針對『系統穩定性』來考量的話，那麼就有絕對充分的理由來支持您重新編譯核心囉！

『如果系統已經運行很久了，而且也沒有什麼大問題，加上我又不增加冷門的硬體設備，那麼建議就不需要重新編譯核心了！』，因為重新編譯核心的最主要目的是『想讓系統變的更穩！』既然您的 Linux 主機已經達到這個目的了，何必再編譯核心？不過，就如同前面提到的，由於預設的核心不見得適合您的需要，加上預設的核心可能並無法與您的硬體配備相配合，所以 VBird 通常都是『一安裝完 Linux ，第一個動作（在還沒有進行任何的設定之前，也沒有上網，也沒有更新套件等等，反正就是安裝完畢 Linux ，第一次進入 Shell 時！）立刻就是以最新版本的 kernel 重新編譯一個屬於我這部主機的核心！』以讓我的核心都能夠相當的符合我的硬體配備，讓系統運作的更順暢！

然而由於『核心的主要工作是在控制硬體！』所以編譯核心之前，請先瞭解一下您的硬體配備，與您這部主機的未來功能！由於核心是『越簡單越好！』所以只要將這部主機的未來功能給他編進去就好了！其他的就不用去理他啦！
核心的版本與何處下載最新核心
請特別留意！不同版本的核心之間，最好不要互相升級！否則及容易發生問題！例如： Red Hat 6.x 使用的是 2.2.xx 版本的核心，那麼就不要使用 2.4.xx 的核心來編譯他！如果誤用的話，很有可能造成您系統上面的服務無法正常的工作！還請特別留意呢！
  • 核心的版本：
    要更新核心自然就得知道目前我的核心是哪一個囉！然後才能拿更新的核心來更新呀！您說是吧！那麼在哪裡找到這個核心的資訊呢？應該還記得那個 uname 查看的資訊吧！沒錯！就是他了，可以使用其功能來查詢目前在工作的核心版本：

    [test @test test]# uname -r
    2.4.7-10 <==這個是 Red Hat 7.2 的預設核心版本！

    看到了吧！那個東西就是核心版本的資訊啦！好了！我們依照 RPM 版本的先例，也來談一談 kernel 的版本吧！基本上， kernel 的版本可以分為：
      [主版本].[次版本].[修訂版本]-[附版本]
    在這當中，需要特別留意的屬於第二個那個[次版本]囉！
    • 如果次版本是奇數的話，例如 2.3, 2.5 等等，那表示他是一個『測試性質功能的核心版本』，這種核心通常是在推出穩定版本的核心之前，用來給 developer (核心維護更新測試者！）測試用的！雖然功能較為強大，但是由於是屬於測試性質，所以可能會有些許的 bug 也說不定；
    • 如果次版本是偶數的話，例如 2.2, 2.4 等等，那表示他是一個經過測試之後才釋出的穩定核心版本，這種核心較為穩定不容易出錯，比較適合一般個人或者是商業使用！
    所以啦！我們要升級的時候，大多就是使用那種偶數的核心版本啦！不過這裡還是要再提一遍！就是『2.2 與 2.4 是兩個具有相當大差異的核心版本，兩者之間使用到的函式庫基本上已經不相同了，所以在升級之前，如果您的核心原本是 2.2.xx 版(Red Hat 6.x 系列)，那麼就升級到 2.2.xx 版本的最新版，不要由 2.2.xx 直接升級到 2.4.xx 版，否則到時可能會欲哭無淚∼∼』，這個問題在討論區一再地被提起！這裡再次說明！
    此外， 2.2.xx 與 2.4.xx 的比較中，並不是 2.4.xx 就一定比 2.2.xx 還要新，因為這兩種版本同時在進行維護與升級的工作！如果有興趣的話，可以前往 Linux 核心網站 http://www.kernel.org 一看究竟，您就可以瞭解目前的核心變動情況了！另外，再提到額外的一點，就是 2.2 可以升級到 2.3 版本，這是因為這兩個是互相援用的，在 2.3 測試成功之後，就將他轉成 2.2 的版本，所以兩者的函式庫使用的情況是約略相同的，這個情況也可以使用在 2.4.xx 與 2.5.xx 版本之中！也就是說，您的 Red Hat 7.x 的 2.4.xx 版本可以升級到 2.5.xx 版本去呦！但是您的 Red Hat 6.x 的 kernel 2.2.xx 則僅能更新到最新的 2.2.xx 或者是 2.3.xx ，強烈的建議不需要更新到 2.4.xx ∼∼再次不厭其煩的提醒大家∼
    好了！既然 Red Hat 7.1 ~ 7.3 使用的是 kernel 2.4.xx 版本，我們又需要的是穩定型態的 2.4.xx 版本，再由 http://www.kernel.org 網站資料上發現，截至目前為止( 2002/05/23 )，最新的核心是 2.4.18 這一個，所以，您可以前往下載這一個版本的核心，當然也可以由本站下載呢！嗯！底下的各個選項的擇定，我們都是以這一個版本為例呦！需要特別的注意！由於較新的核心版本可能會多出一些選項，因此若有不同的項目也沒有關係！稍微查看一下說明內容就可以瞭解啦！
  • 核心下載地點：
    Linux 的核心目前是由其發明者 Linus 所屬團隊在負責維護的，而其網站在底下的站址上，在該網站上可以找到最新的 kernel 資訊！不過，美中不足的是目前的核心越來越大了（ linux-2.4.18.tar.gz 這一版，這一個檔案大約 30MB 了！），所以如果你的 ISP 連外很慢的話，那麼使用台灣的映射站台來下載不失為一個好方法：
    • http://www.kernel.org/
    • http://ftp.nsysu.edu.tw/Linux/Kernel/linux/kernel/
    • 交大資科
    • 教育部
    基本上，就如同前面所說的，最好是在系統安裝完畢之後馬上就進行核心編譯工作，免得以後每次裝一些特定功能的時候又要花一大輪時間編譯。另外要說明的，由於小弟是以 2.4.18 這一版的核心來做升級的動作，所以以下是以 2.4.18 來做示範！
開始設定核心的內容
    由於 VBird 都是在安裝完 Linux 之後立刻就給他編譯核心的，所以通常我都是直接將該核心檔案燒錄起來，或者是先捉到自己的電腦中，再以 ftp 等等的動作將該檔案傳輸到 Linux 系統下！好了！目前我就假設您已經可以上網了，所以您可以使用底下的方式來下載核心，並將之解開在 /usr/src 當中！此外，由於編譯核心的行為必須要是 root 才可以進行，所以底下的動作使用者身份為 root 呦！
    1. 下載核心：
    [root @test /root]# wget http://aerosol.ev.ncku.edu.tw/~vbird/download/linux-2.4.18.tar.gz <==由本站下載核心
    --02:55:31-- http://aerosol.ev.ncku.edu.tw/%7Evbird/download/linux-2.4.18.tar.gz
    => `linux-2.4.18.tar.gz'
    Connecting to aerosol.ev.ncku.edu.tw:80... connected!
    HTTP request sent, awaiting response... 200 OK
    Length: 30,108,170 [application/x-gzip]

    0K .......... .......... .......... .......... .......... 0% @ 49.65 KB/s
    50K .......... .......... .......... .......... .......... 0% @ 26.25 KB/s
    100K .......... .......... .......... .......... .......... 0% @ 39.90 KB/s

    最後在您的 /root 底下會產生一個名為 linux-2.4.18.tar.gz 的檔案！那就適合新的 source 了！

    2. 解壓縮：
    [root @test /root]# cd /usr/src　　　　　　　 　　　　　　<==kernel 的預設 source 檔案放置目錄
    [root @test /src]# mv linux linux.old　　　　　　　　　　 <==將舊的核心編譯的目錄搬移成其他目錄
    [root @test /src]# tar -zxvf /root/linux-2.4.18.tar.gz　　<==將核心檔案解壓縮吧！
    [root @test /src]# mv linux linux-2.4.18
    [root @test /src]# ln -s linux-2.4.18 linux　　　　　　　 <==建立連結！

    需要比較留意的是，核心所放置的地點『一定是 /usr/src/linux』這一個目錄，然而由於不論哪一版核心編譯都是這一個目錄底下編譯的，所以我個人相當的建議將每一版的核心都使用不同的目錄來指定，然後以 link 的方式將該目錄 link 到 linux 就可以啦！較為簡單而且明瞭！底下的動作請都在 /usr/src/linux 底下進行呦！

    另外，在開始設定核心內容之前，先來說明一下什麼是『模組』？以方便大家瞭解核心編譯的選擇！由於核心的更新速度雖然很快，然而有些硬體的出版卻是不定時的，另外，有些軟體需要的載入程式可能也需要核心的支援才有辦法提供！然而如果每次一有新的硬體或者軟體推出，則需要編譯一次核心，那不是挺麻煩的嗎？要曉得的是，編譯一次核心小一點的也要 30 分鐘左右（這與你的機器速度有關！），每次這麼編譯不是挺麻煩的嗎？所以囉，就有所謂的『模組』出現了！由於目前的核心已經都具有『外掛模組』的功能（這個等一下我們在實際編譯的時候會提到！），所以，只要將您『可能會用到』的功能的選項，將他編譯成模組！那麼往後真的需要該功能的時候，再將他載入到核心就可以啦！這麼做最大的優點就是，當沒有使用到該功能的時候，核心並不會主動的載入，所以真正在核心內工作的程序就不會太多而耗掉系統資源！另外，當您目前不需要的功能可以先編譯成模組，未來真的有需要的時候，就可以將他直接載入！嘿嘿！可以免除再一次編譯的繁複手續呢！！很棒吧！所以囉！如果可以編譯成為模組的，那麼就直接先編成模組也是可以的哩！但是，如果是『肯定不會』使用到的功能，那麼就不需要編譯進來了！例如我的舊電腦當中根本就沒有 AGP 插槽，那麼我自然就不需要在我的核心裡面編譯上 AGP 的支援囉！
  • 編譯之前：
    在 Linux 當中安裝任何軟體的鐵則：『注意看套件解壓縮之後的 INSTALL 或 README 檔案！』，好了，那麼請進入 /usr/src/linux 當中去瞧一瞧 README 先！再來，由於害怕不小心前面有人已經先編譯過了核心，則由於編譯過程當中會產生目的檔案（檔名為 .o ），為了避免此一問題，請先執行 make mrproper 這個指令：
    [root @test linux]# make mrproper
    ......
    會顯示相當多的 rm 去除檔案的訊息....

    好了！現在您就已經具有相當完整的 Kernel source code 囉！接著下來則是選擇編譯模式咯！

  • 特別留意：
    很奇怪呦！我老是寫『特別留意』的字樣?真是傷腦筋，鳥哥大概算老人了吧，粉容易碎碎唸的….好啦，要強調的還是得強調，是這樣的，在上面的介紹裡，我們不是說過 Kernel 的外掛模組是放在 /lib/modules/`uname –r` 嗎？好了，那麼現在來想一想，如果你的『同一版本的核心編譯兩次』的情況下，會怎樣？這是很可能的情況呢！怎麼說？萬一你的第一次的編譯沒有成功的話，那總得編譯第二次吧？而由於第一次編譯完成之後，你的一些模組已經放在 /lib/modules/2.4.18 當中了( 以這一次我們使用的核心版本為例 )，那麼下次在編譯完成後，核心的模組還是會放在 /lib/modules/2.4.18 這個目錄下，那不是重複了嗎？有些模組會被重複放置，導致問題重重的∼因此上，如果同一個版本的核心被編譯兩次以上的話，那麼請將 /lib/modules 裡面的該版核心先移動掉吧！舉個例子來說，假如你的核心版本是 2.4.18 ，而又要對 2.4.18 重新編譯一次，那麼就必需要：

      cd /lib/modules
      mv 2.4.19 2.4.19.old

    這樣才行呢！不然安裝之後還是會有問題的呦！請特別留意呢！
  • 設定編譯模式：
    目前的 Kernel 可以允許多種編譯的模式，包括了：
    • make config ：這種模式需要逐行輸入所需要設定的項目，無法往前修改設定，所以目前很少使用這種方式來設定 Kernel 的項目了；
    • make xconfig ：這種模式則是使用 X-Window 為主要環境的設定模式！除非你有 X-Window 在執行，否則沒有辦法使用這種模式；
    • make menuconfig ：這種模式有點像是文字界面的選單模式，較為簡便，而且可以在純文字界面下面執行編輯動作！是目前最常使用的模式。
    由於我們是在文字介面下工作，因此，我們就使用 make menuconfig 來進行核心的編譯設定內容吧！這個選單模式較為簡單的啦！
    [root @test linux]# make menuconfig

    出現如下圖示：

    看到上面的圖示之後，你會發現有兩個畫面，一個是大框框內的反白光柱，另一個則是底下的 Select, Exit, 與 Help 游標，這幾個元件的用法如下：

    • 最底下的 <Select> <Exit> <Help> ：可以使用『左右鍵』來移動游標；
    • 上下鍵可以移動上面大框框部分的 Code maturity level options 那一行！，有箭頭『 ---> 』則表示該行內部還有其他細項需要來設定的意思。
    • 當以『上下鍵』選擇好想要設定的項目之後，並以『左右鍵』選擇 <Select> 之後，按下『 Enter 』就可以進入該項目去作更進一步的細部設定囉！
    • 在細部項目的設定當中，如果前面有 [ ] 或 < > 符號時，該項目才可以選擇，而選擇可以使用『空白鍵』來選擇；
    • 若為 [*] <*> 則表示編譯進核心；若為 <M> 則表示編譯成模組！盡量在不知道該項目為何時，且有模組可以選，那麼就可以直接選擇為模組囉！
    • 當在細項目選擇 <Exit> 後，並按下 Enter ，那麼就可以離開該細部項目囉！
    基本上建議只要『上下左右 空白 及 Enter 』這六個按鍵就好了！不要使用 Esc ，否則一不小心就有可能按錯的！
  • 開始設定：
    底下的設定項目非常的多，其中，如果您使用的是比 2.4.18 還要新的版本時，那麼有可能會出現更多的選項！如果不確定選項的內容是什麼？請千萬以 Help 進入看一下該項目的設定值，如果還是不清楚怎麼辦？那麼就直接以 Kernel 的預設值保留即可！我在底下的設定中，僅列出個人認為比較重要的項目，其他的項目您就得自己看一下囉?其實，基本上，只要底下這些項目您都瞭解之後，那麼核心編譯大抵上就沒有很嚴重的困擾囉！

    [root @test linux]# make mrproper <==去除 .o 的編譯過的檔案
    [root @test linux]# make menuconfig <==以文字選單的模式進行編譯！
    底下開始編譯！
    Code maturity level options --->　　　　　　　　　　　　　　　　　 <==關於核心測試功能的 code 開啟項目；
    [ ] Prompt for development and/or incomplete code/drivers　 <==因為我們沒有要研發核心，所以不選
    Loadable module support ---> 　　　　　　　　　　　　　　　　　　　<==這個就是我們之前說的『模組』啦！
    [*] Enable loadable module support　　　　　　　　　　　　 <==讓核心可以載入模組項目（必選）
    [ ] Set version information on all module symbols　　　 <==這個除非你要使用舊版本的資料，通常不選！
    [*] Kernel module loader　　　　　　　　　　　　　　　　　<==也是必選啦！
    Processor type and features --->　　　　　　　　　　　　　　　　　 <==選擇 CPU 的型號項目
    (Pentium-MMX) Processor family　　　　　　　　　　　　　　　<==請依照您的實際情況選擇您的 CPU 型號
    < > Toshiba Laptop support　　　　　　　　　　　　　　 　　 <==底下這兩個有使用到（筆記型電腦）才選擇！
    < > Dell laptop support
    <M> /dev/cpu/microcode - Intel IA32 CPU microcode support <==如果是使用 Intel 的，可以編譯成模組
    <M> /dev/cpu/*/msr - Model-specific register support　　　　<==如果是使用 Intel 的，可以編譯成模組
    <M> /dev/cpu/*/cpuid - CPU information support　　　　　　　<==如果是使用 Intel 的，可以編譯成模組
    (off) High Memory Support　　　　　　　　　　　　　　　　　 <==這個東西跟你的 RAM 有關係，RAM小於 1 GB 則使用 off 即可
    [ ] Math emulation　　　　　　　　　　　　　　　　　　 　　 <==是否需要數值模擬？當然不需要！我們的 CPU 都夠強了！
    [ ] MTRR (Memory Type Range Register) support　　　　　 　 <==P6 (PII等級以上) 並且要跑 X-Window 才加上吧,與 AGP 有關
    [ ] Symmetric multi-processing support　　　　　　　 　　　 <==如果是雙 CPU 的主機板才選擇！否則就不要選了！
    [*] Local APIC support on uniprocessors (NEW)　　　 　　　 <==如果你的 CPU 有支援 APIC 則選擇！通常可以選擇起來啦！
    [*] IO-APIC support on uniprocessors　　　　　　　 　　　　 <==跟上面的理由一致！選擇起來吧！
    General setup ---> 　　　　　　　　　　　　　　　　　　　　　　　　<==一般設定部分
    [*] Networking support 　　　　　　　　　　　　　　　 <==底下四個一定要選，跟基本的硬體裝置有關！
    [*] PCI support
    (Any) PCI access mode
    [*] PCI device name database
    [ ] EISA support　　　　　　　　　　　　　　　　　　　<==底下這兩個則與主機板上面的插槽有關！除非筆記型，否則不選
    [ ] MCA support
    [*] Support for hot-pluggable devices　　　　　 　　　<==有點類似隨插即用吧！可以選擇呦！
    PCMCIA/CardBus support --->
    < > PCMCIA/CardBus support　　　　　　　　　　<==因為我沒有筆記型，所以不選，若為筆記型電腦，請選擇！
    PCI Hotplug Support --->
    [*] System V IPC　　　　　　　　　　　　　　　　　　　<==底下這三個東西對於效能都不錯！可以選擇呦！
    [*] BSD Process Accounting
    [*] Sysctl support
    (ELF) Kernel core (/proc/kcore) format　　　　　　　　<==底下這幾個東西可以編譯成模組啦！但是我直接編到核心囉！
    <*> Kernel support for a.out binaries
    <*> Kernel support for ELF binaries
    <*> Kernel support for MISC binari
    [*] Power Management support
    < > Advanced Power Management BIOS support　　　　　<==如果你想要你的 BIOS 接管電源管理，可以選擇！我是不選的啦！
    Memory Technology Devices (MTD) --->
    < > Memory Technology Device (MTD) support　　　　　　<==沒必要就不要選吧！
    Parallel port support --->
    < > Parallel port support　　　　　　　 <==由於我的主機上面並沒有接印表機，所以沒選！如果你有印表機的話，一定要選擇
    Plug and Play configuration --->
    <*> Plug and Play support　　　　　　　 <==底下兩個隨插即用！ 馬上勾選！
    <*> ISA Plug and Play support
    Block devices --->　　　　　　　　　　　　　 　<==一些比較冷門的儲存機器！如果不確定的話，直接編譯成模組吧！沒關係的！
    <*> Normal PC floppy disk support
    < > XT hard disk support
    < > Compaq SMART2 support
    < > Compaq Smart Array 5xxx support
    < > Mylex DAC960/DAC1100 PCI RAID Controller support
    < > Loopback device support
    < > Network block device support
    < > RAM disk support
    Multi-device support (RAID and LVM) --->
    [ ] Multiple devices driver support (RAID and LVM)　　 <==除非要完 RAID （磁碟陣列）與 LVM ，否則不用選！
    Networking options ---> 　　　　　　　　　　　　　　 　 <==這一部份是最重要的除非特別強調，否則能編成模組就編成模組！
    <*> Packet socket
    [*] Packet socket: mmapped IO
    <M> Netlink device emulation (NEW)
    [*] Network packet filtering (replaces ipchains)
    [ ] Network packet filtering debugging (NEW)
    [*] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*] IP: multicasting
    [*] IP: advanced router
    [*] IP: policy routing (NEW)
    [*] IP: use netfilter MARK value as routing key (NEW)
    [*] IP: fast network address translation (NEW)
    [*] IP: equal cost multipath (NEW)
    [*] IP: use TOS value as routing key (NEW)
    [*] IP: verbose route monitoring (NEW)
    [ ] IP: large routing tables (NEW)
    [*] IP: kernel level autoconfiguration
    [*] IP: DHCP support (NEW)
    [*] IP: BOOTP support (NEW)
    [*] IP: RARP support (NEW)
    <M> IP: tunneling
    <M> IP: GRE tunnels over IP
    [*] IP: broadcast GRE over IP (NEW)
    [*] IP: multicast routing
    [*] IP: PIM-SM version 1 support (NEW)
    [*] IP: PIM-SM version 2 support (NEW)
    [*] IP: TCP Explicit Congestion Notification support
    [*] IP: TCP syncookie support (disabled per default)
    IP: Netfilter Configuration ---> 　　　　　　　　　　　<==這就是防火牆機制裡頭的 iptables 啦！都編成模組！
    <M> Connection tracking (required for masq/NAT) (NEW)
    <M> FTP protocol support (NEW)
    <M> IRC protocol support (NEW)
    <M> IP tables support (required for filtering/masq/NAT) (NEW)
    <M> limit match support (NEW)
    <M> MAC address match support (NEW)
    <M> netfilter MARK match support (NEW)
    <M> Multiple port match support (NEW)
    <M> TOS match support (NEW)
    <M> AH/ESP match support (NEW)
    <M> LENGTH match support (NEW)
    <M> TTL match support (NEW)
    <M> tcpmss match support (NEW)
    <M> Connection state match support (NEW)
    <M> Packet filtering (NEW)
    <M> REJECT target support (NEW)
    <M> Full NAT (NEW)
    <M> MASQUERADE target support (NEW)
    <M> REDIRECT target support (NEW)
    <M> Packet mangling (NEW)
    <M> TOS target support (NEW)
    <M> MARK target support (NEW)
    <M> LOG target support (NEW)
    <M> TCPMSS target support (NEW)
    <M> ipchains (2.2-style) support (NEW)
    <M> ipfwadm (2.0-style) support (NEW)
    <M> The IPX protocol
    [ ] IPX: Full internal IPX network (NEW)
    < > Appletalk protocol support
    < > DECnet Support
    < > 802.1d Ethernet Bridging
    QoS and/or fair queueing --->
    [ ] QoS and/or fair queueing
    Telephony Support ---> <==這東西我也不知道怎麼玩∼∼
    < > Linux telephony support
    ATA/IDE/MFM/RLL support ---> <==儲存界面的選擇！當然 IDE 一定要選的啦！！ 裡面如果有看到屬於您的晶片組，請記得將他選擇起來！例如如果使用 VIA 的晶片組，那麼最後一項VIA82CXXX chipset support就一定要選擇起來呢！如果你是跟 VBird 一樣，使用較老舊的主機板，那麼就用系統預設值也就可以了！
    <*> ATA/IDE/MFM/RLL support
    IDE, ATA and ATAPI Block devices --->
    <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
    <*> Include IDE/ATA-2 DISK support
    [*] Use multi-mode by default
    <*> Include IDE/ATAPI CDROM support
    ---- IDE chipset support/bugfixes
    [*] CMD640 chipset bugfix/support
    [*] RZ1000 chipset bugfix/support
    [*] Generic PCI IDE chipset support
    [*] Sharing PCI IDE interrupts support
    [*] Generic PCI bus-master DMA support
    [*] Use PCI DMA by default when available
    [*] Intel PIIXn chipsets supportt
    [*] PIIXn Tuning supportt
    SCSI support ---> <==我的舊機器上並沒有安裝 SCSI 卡！我確定我不會使用到 SCSI ，但是如果你可能會安裝的話，請編譯！
    < > SCSI support
    Fusion MPT device support --->
    I2O device support --->
    < > I2O support
    Network device support ---> <==仔細的將你的網路設備編譯進來吧！這個也很重要的！
    [*] Network device support
    <*> Dummy net driver support <==這個一定要裝！但是請注意！如果你之前已經使用了 MRTG 了！這個裝完之後 MRTG 要重跑一次！
    <M> Bonding driver support
    <M> EQL (serial line load balancing) support
    <M> Universal TUN/TAP device driver support
    <M> General Instruments Surfboard 1000
    Ethernet (10 or 100Mbit) ---> <==這裡面有相當多的卡，我只列出我要的卡而已！請選擇你自己的網路卡呦！
    [*] Ethernet (10 or 100Mbit)
    [*] EISA, VLB, PCI and on board controllers
    <*> EtherExpressPro/100 support
    <M> RealTek RTL-8139 PCI Fast Ethernet Adapter support
    [*] Use PIO instead of MMIO
    [*] Support for older RTL-8129/8130 boards
    <M> VIA Rhine support <==這就是傳說中的 D-Link 530 那塊卡的驅動程式啦！
    <*> PPP (point-to-point protocol) support <==這個一定要編進核心！不然就無法使用 ADSL 的 rp-pppoe 撥接囉！
    [*] PPP filtering (NEW)
    <M> PPP support for async serial ports (NEW)
    <M> PPP support for sync tty ports (NEW)
    <M> PPP Deflate compression (NEW)
    <M> PPP BSD-Compress compression (NEW)
    <M> PPP over ATM (EXPERIMENTAL) (NEW)
    Amateur Radio support ---> <==底下這四個應該不需要安裝吧！？
    IrDA (infrared) support --->
    ISDN subsystem --->
    Old CD-ROM drivers (not SCSI, not IDE) --->
    Input core support ---> <==這個也編成模組就好囉！
    <M> Input core support
    <M> Keyboard support
    <M> Mouse support
    (1024) Horizontal screen resolution (NEW)
    (768) Vertical screen resolution (NEW)
    <M> Joystick support
    <M> Event interface support
    Character devices ---> <==周邊設備的選項！最重要的地方在 AGP 的設定項目！因為我沒有 AGP 所以沒有設定！
    [*] Virtual terminal
    [*] Support for console on virtual terminal
    <*> Standard/generic (8250/16550 and compatible UARTs) serial support
    [*] Unix98 PTY support
    <M> Mouse Support (not serial and bus mice)
    [*] PS/2 mouse (aka "auxiliary device") support
    < > /dev/agpgart (AGP Support) <==這個相當的重要！就是 AGP 顯示卡的支援核心！請選擇（若你有 AGP 的話！）
    [ ] Intel 440LX/BX/GX and I815/I830M/I840/I850 support <==下面的選項要上面的打勾之後才會出現！
    [ ] Intel I810/I815/I830M (on-board) support 請特別留意選擇你的適合的主機板晶片組呢！
    [ ] VIA chipset support
    [ ] AMD Irongate, 761, and 762 support
    [ ] Generic SiS support
    [ ] ALI chipset support
    [ ] Serverworks LE/HE support
    [ ] Direct Rendering Manager (XFree86 DRI support)
    [ ] Build drivers for old (XFree 4.0) DRM (NEW)
    --- DRM 4.1 drivers
    < > 3dfx Banshee/Voodoo3+
    < > ATI Rage 128
    < > ATI Radeon
    < > Intel I810
    < > Matrox g200/g400
    < > SiS (NEW)
    [ ] Direct Rendering Manager (XFree86 DRI support)
    Multimedia devices --->
    File systems ---> <==底下的選項主要在提供核心支援的檔案格式！相當的重要！如果忘記編入的話，系統可是會讀不到東西！
    [*] Quota support <==沒有他！ Quota 就無法起來！請選擇呦！
    <M> Kernel automounter support
    <*> Kernel automounter version 4 support (also supports v3)
    <M> Ext3 journalling file system support (EXPERIMENTAL)
    <M> DOS FAT fs supportt
    <M> MSDOS fs supportt
    <M> UMSDOS: Unix-like file system on top of standard MSDOS fss
    <M> VFAT (Windows-95) fs supportt
    <M> Compressed ROM file system support
    [*] Virtual memory file system support (former shm fs)
    <*> ISO 9660 CDROM file system support <==在 Red Hat 7.2 這裡就是被編成模組了！才需要每次載入！
    [*] Microsoft Joliet CDROM extensionss
    <M> Minix fs support
    <M> NTFS file system support (read only)
    [*] /proc file system support
    [*] /dev/pts file system for Unix98 PTYs
    <*> Second extended fs support
    <M> System V/Xenix/V7/Coherent file system support
    Network File Systems --->
    <M> Coda file system support (advanced network fs)
    <*> NFS file system support <==NFS 也是需要的呦！
    <M> SMB file system support (to mount Windows shares etc.) <==網芳總是需要的吧！
    [*] Use a default NLS (NEW)
    Default Remote NLS Option: "cp950" (NEW) <==支援中文的語系！
    Partition Types --->
    Native Language Support ---> <==除了底下說的幾個 * 的之外，其他的全部都編譯成為模組！（以備不時之需！）
    Default NLS Option: "iso8859-1" (NEW)
    <*> Traditional Chinese charset (Big5) (NEW)
    <*> NLS ISO 8859-1 (Latin 1; Western European Languages) (NEW)
    <M> for others
    Console drivers --->
    [*] VGA text console
    Sound --->
    < > Sound card support <==你有音效卡嗎？那就編譯他吧！
    USB support --->
    <M> Support for USB
    Kernel hacking --->

    好了！編譯完成之後選擇『Save Configuration to an Alternate File』然後寫成一個你喜歡的檔名，這個檔案內容就是你剛剛編譯完成的資料啦！然後選擇 <Exit> 之後，再儲存一次到系統當中！接著下來就準備要編譯囉！

    另外，上面的設定您可以 按這裡 來下載，然後捉到您的 /usr/src/linux 目錄下，進入 make menuconfig 畫面之後，選擇『Load an Alternate Configuration File』，然後寫入檔名 VBird-2.4.18 ，這樣一來， Linux 核心的預設選項則成為上面的樣子囉！然後再請您一個一個的進行修正啦！目前我的機器以上面的檔案案例來工作中，一切正常的啦！
    不過，上面的資料主要是適用在鳥哥的個人機器上面的，我們這個網站主要的核心也是這樣編出來的！因為我重視的地方在於『網路伺服器』上面，所以裡頭的設定少掉了相當多的個人桌上型 Linux 的硬體編譯！所以，如果你想要編譯出一個適合您的機器的核心，那麼可能還有相當多的地方需要來修正的！不論如何，請隨時以 Help 那個選項來看一看內容吧！反正 Kernel 重編的機率不大！花多一點時間重新編譯一次！然後將該編譯完成的參數檔案儲存下來，未來就可以直接將該檔案叫出來讀入了！所以花多一點時間安裝一次就好！那是相當值得的！
開始編譯囉！
  • 開始編譯之前：
    開始編譯之前請先確認你的這一次編譯的核心與上一次編譯的核心的版本不同！請特別留意：
    • 因為編譯成模組的資料會被系統安裝在『 /lib/modules/`uname -r` 』底下，所以，如果這次你安裝的核心版本跟上一次相同時，那麼自然模組放置的地點就一樣了，那會造成很多模組版本的問題！因此，這個時候就需要將原本的模組移動到其他地方去囉！不過，由於我們是下載新核心，所以這部份就可以略過了！因為版本自然不同囉！
    • 另外，我們編譯出來的 Kernel 的檔案名稱為 vmlinuz ！這個東西就是我們所需要的核心檔案啦！他正確的擺放位置是在 /boot 當中哩！此外，還有系統地圖資料 System.map 也是很重要的，同樣在 /boot 當中！
    如果確認好了之後，我們就可以正式的來編譯囉！
  • 開始編譯：
    開始編譯的動作主要如下所示：

    [root @test linux]# make dep　　　　　　　　<==建立相依的屬性關係！
    [root @test linux]# make clean　　　　　　　<==將舊的資料去除掉！
    [root @test linux]# make bzImage　　　　　　<==開始編譯核心！這個核心是經過壓縮的，此外，這個步驟也很長！
    [root @test linux]# make modules　　　　　　<==開始編譯模組！這個動作視您剛剛編譯的模組數量！
    [root @test linux]# make modules_install　　<==好了！將資料給他安裝在 /lib/modules/`uname -r` 裡面囉！
    [root @test linux]# make install　　　　　　<==嗯！就將剛剛 bzImage 建立完成的核心給他安裝上來！

    在編譯的過程當中，可能會有些錯誤或者是警告的訊息，因此，為了怕錯過什麼重要的資訊，你也可以使用命令重導向來將資料存在檔案裡頭，例如這樣做：

      make dep clean bzImage modules modules_install > compile.kernel.log

    基本上，編譯的動作就是這樣而已！我們說一說各個步驟的主要意義：

    1. make dep ：這個動作在進行，將您在上一節所選擇的項目當中，屬於模組的咚咚進行相依屬性的建立，以方便未來軟體或程式進行的時候，模組的呼叫；

    2. make clean ：這個動作會將您前一次編譯的目標檔 ( *.o 的檔案 ) 給他去除，所以編譯的內容才會是新的核心！

    3. make bzImage ：注意喔！那個 I 是『 i 』的大寫字元?這個步驟主要在產生可開機的核心檔案，也就是我們再開機程序當中提到好多次的 vmlinuz 那個檔案啦！但是由於目前的核心檔案都還蠻大的，因此都會經過壓縮的程序?所以，編譯出來的核心檔案放置的地點在底下的目錄當中：

        /usr/src/linux/arch/i386/boot/bzImage

      此外，其實還有個未經壓縮的核心在 /usr/src/linux 底下，那就是 /usr/src/linux/vmlinux ，不過我們不使用這個檔案，因此您只要記得上面提到的那個壓縮過的核心檔案即可！

    4. make modules ：這個步驟在編譯模組啦！

    5. make modules_install ：這個步驟在安裝模組！那麼模組安裝在哪裡呢？呵呵！就是我們之前提過的，在 /lib/modules/`uname –r` 裡面，因為我們的核心是 2.4.18 ，所以就安裝在 /lib/modules/2.4.18 當中囉！

    如果在編譯的過程當中發生問題的話，通常的可能就是挑選的項目有點問題，這個時候請重新再挑選一次設定內容『 make menuconfig 』，通常編譯都可以成功的啦！

    如果在過程裡面沒有出現任何錯誤訊息的話，那麼很好，應該可以準備安裝核心囉∼
安裝核心與 Lilo 多重開機設定
剛剛上一個步驟就已經將核心安裝好了嗎？很抱歉！非也非也∼我們到前一步驟中，僅是將模組安裝到 /lib/modules/`uname –r` 當中，而核心編譯完成並放在 /usr/src/linux/arch/i386/boot/bzImage 而已！所以，這個時候，請將核心放置在開機核心預設放置的目錄 /boot 吧！
[root @test root]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.18
在一般人的習慣中，我們還是比較喜歡將開機的核心稱做為 vmlinuz ，而由於版本不同，所以我們可以將他取名為 vmlinuz-2.4.18 這樣的檔案名稱，比較好進行確認啦！

核心搬移完畢之後就 OK 了嗎？當然不對囉！還記得在開機流程裡面介紹的 Linux 的開機管理員嗎？沒錯，那就是 lilo 跟 grub 囉，所以，接著下來我們要作的就是開機的設定囉?由於 lilo 與 grub 我們之前就提過了，所以這裡不詳細的介紹每個物件的內容，僅說明一下我的測試核心的規劃！通常，我都喜歡直接以硬碟開機來測試新的核心，而由於害怕新的核心沒有辦法工作 ( 註：很多時候，由於不同的 distribution 他所考慮的內容不一樣，因此，很有可能您編譯完成的核心並無法在您的 Linux distribution 上面工作的，所以，雖然他可以被編譯成功，但是我們還是得測試測試他呢！ ) 因此，我都會將舊的核心繼續留下來，因為如果萬一新核心沒有辦法工作，那麼最起碼我還可以使用舊的核心繼續來管理我的 Linux 呢！這個時候就必需要有多重開機系統啦！
  • Lilo 的安裝設定：
    那麼如果您是使用 lilo 的話，就需要修改 /etc/lilo.conf 囉！依據剛剛我們建立的名為 /boot/vmlinuz-2.4.18 的核心檔案，您的 /etc/lilo.conf 內容應該有點像是這樣：

    [root @test linux]# vi /etc/lilo.conf
    boot=/dev/hda
    map=/boot/map
    vga=normal
    default=linux-2.4.18
    keytable=/boot/us.klt
    prompt
    nowarn
    timeout=100
    message=/boot/message
    menu-scheme=wb:bw:wb:bw
    image=/boot/vmlinuz-2.4.18
    label=linux-2.4.18
    root=/dev/hda1
    append="devfs=mount"
    read-only
    image=/boot/vmlinuz
    label=linux
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=mount"
    read-only
    image=/boot/vmlinuz
    label=failsafe
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=nomount failsafe"
    read-only
    image=/boot/vmlinuz
    label=linux-test
    root=/dev/hda1
    initrd=/boot/initrd.img
    append="devfs=mount"
    read-only

    [root @test boot]# lilo
    Added linux-2.4.18 *
    Added linux
    Added failsafe
    Added linux-test

    黃色字體的部分是經過修改的，其他的則是 Mandrake 9.0 的預設值！這樣就修改好囉！然後給他安裝到 MBR 或 Super block 吧！出現了 * 符號囉！呵呵！安裝成功了，請重新開機，試圖使用一下您的新核心吧！更詳細的 LILO 說明請參考開機流程裡面的 LILO 說明喔！
  • Grub 安裝說明：
    那麼如果是使用 grub 呢？就修改一下 /boot/grub/menu.lst 吧！修改成類似底下的模樣：

    [root @test linux]# vi /boot/grub/menu.lst
    timeout 10
    color black/cyan yellow/cyan
    i18n (hd0,0)/boot/grub/messages
    keytable (hd0,0)/boot/us.klt
    altconfigfile (hd0,0)/boot/grub/menu.once
    default 0

    title linux-2.4.18
    kernel (hd0,0)/boot/vmlinuz-2.4.19 root=/dev/hda1 devfs=mount

    title linux-2.4.19-16mdk
    kernel (hd0,0)/boot/vmlinuz-2.4.19-16mdk root=/dev/hda1 devfs=mount
    initrd (hd0,0)/boot/initrd.img

    title failsafe
    kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 devfs=nomount failsafe
    initrd (hd0,0)/boot/initrd.img

    上面的黃色字體是經過修改之後的結果?很簡單吧！這樣就搞定了！然後就可以開機測試看看囉！但是，如果是 Lilo 轉換到 grub 的使用者，還得再安裝 grub 呢！可以這樣做做看：

    [root @test boot]# grub-install /dev/hda
    Installation finished. No error reported.
    This is the contents of the device map /boot/grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-run the script `grub-install'.

    (hd0) /dev/hda

    或者直接進入 grub 的指令列進行安裝：

    [root @test boot]# grub

    GRUB version 0.92 (640K lower / 3072K upper memory)

    [ Minimal BASH-like line editing is supported. For the first word, TAB
    lists possible command completions. Anywhere else TAB lists the possible
    completions of a device/filename. ]

    grub> root (hd0,0)
    Filesystem type is ext2fs, partition type 0x83

    grub> setup (hd0)
    Checking if "/boot/grub/stage1" exists... yes
    Checking if "/boot/grub/stage2" exists... yes
    Checking if "/boot/grub/e2fs_stage1_5" exists... yes
    Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 17 sectors are embedded.
    succeeded
    Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2
    /boot/grub/menu.lst"... succeeded
    Done.

    grub> quit

    呵呵！這樣就 OK 囉！安裝完畢，請馬上重新開機測試看看您的核心是否可以正常的工作了吧！ ^_^更詳細的 Grub 說明請參考開機流程的 Grub 喔！
核心模組管理：
還記得核心的功能嗎？對啦！就是用來控制系統硬體與相關程序的東西啦！那麼在上面提到的功能裡面，我們也提到了核心可以使用『模組』的方式來動態的載入與移除所需要的模組，OK！那麼該如何載入與卸載這些模組呢？！要知道的是，在模組的載入方面，最主要的開機時即載入模組的檔案在於：
/etc/modules.conf
這個檔案，如果你有任何的新的驅動程式需要在開機的時候載入，呵呵！寫入這個檔案就對了！而核心的驅動程式寫在哪裡？呵呵！就是在底下的目錄中：
/lib/modules/核心版本/kernel/drivers (也可以寫成如下)
/lib/modules/`uname –r`/kernel/drivers
上面這兩行是一模一樣的東西，什麼？怎麼看出來的？別多說廢話了，如果忘記的話，使用 uname –r 看一下內容，再去看一下 quote 是什麼！趕緊回想一下喔！好了，那麼 /etc/modules.conf 的內容是怎樣呢？我們舉最簡單的例子好了，假設你的網路卡是早期有『惡魔卡』稱號的 D-Link 530 好了，那麼這個卡的模組其實已經被 Linux 編譯好了，他就是 via-rhine.o 這個檔案，我們又知道說網路卡的第一個代號為 eth0 ，所以呢，要讓 eth0 與 via-rhine 劃上等號( 註：那個 .o 不要寫出來！ )，因此，在 /etc/modules.conf 的最後一行加入底下的文字：
alias eth0 via-rhine
如果一切順利的話，那麼開機的時候他就會自動的幫我們找到相對應的硬體與模組囉！但是如果 Linux 沒有幫我們編譯好模組呢？怎麼編譯？就使用 make 呀！請回到 RPM 與 Tarball 那一章去閱讀一下 tarball 的安裝方式！再來，如果我需要的是手動隨時加入與取消某些模組呢？呵呵，這個時候也就需要來瞭解一下模組的載入與卸載的功能囉！
  • 模組編譯
    還記得要手動編譯一些驅動程式或者是 tarball 的套件時，至少需要什麼嗎？對啦！要 gcc, make 及 kernel-header 等套件，現在我假設這些套件已經都在您的機器上面了，那麼我們來模擬一下編譯 viarhine.o 這個模組吧！好了，首先先到網路卡的驅動程式中心下載這個模組的原始碼吧！

      http://www.scyld.com/network/index.html

    不過，上面的網站提供的驅動程式有點難以編譯成功！所以，我這裡也提供一個比較容易編譯成功的原廠釋出的模組，大家來試看看：

      http://linux.vbird.org/download/book_basic/linux530_321.tar

    (你可以使用 wget 這個程式在文字介面下載這個檔案！)。首先，您必需將此檔案解壓縮，假設這個檔案原本放置在 /root 底下好了，那麼我們曾經說過，要編譯新的套件或其他林林總總的資料時，最好放在 /usr/local/src 底下，所以：

    [root @test root]# wget http://linux.vbird.org/download/book_basic/linux530_321.tar
    [root @test root]# cd /usr/local/src
    [root @test src]# mkdir dlink-530
    [root @test dlink-530]# tar –xvf /root/linux530_321.tar

    這步之後會多出 readme.txt, Makefile, viarhine.c, viarhine.h 四個檔案，
    其中，那個 readme.txt 『真的』要看一看！

    [root @test dlink-530]# make

    這個 make 會依據 Makefile 這個檔案的內容來將你的 viarhine.c 加以編譯！
    最後就得到了 viarhine.o 這個編譯成功的目標檔案。

    這樣就編譯完成了，接著下來就是將編譯好的模組放置在核心應該要放置的地方，我這裡以 2.4.xx 核心版本為例說明，聽說明年六月 ( 2003/06 ) 會推出新的 2.6.xx 版核心，無論如何，目前大部分的 Linux 還是使用 2.4.xx 的，因此，這裡還是以他為例了：

      核心的模組放置目錄： /lib/modules/`uname –r`/kernel/
      核心的檔案格式模組： /lib/modules/`uname –r`/kernel/fs
      核心的網路卡驅動程式模組： /lib/modules/`uname –r`/kernel/drivers/net

    因此，我們要把這個模組給他直接 copy 到該目錄下，所以：

    cp /usr/local/src/dlink-530/via-rhine.o /lib/modules/`uname –r`/kernel/drviers/net

    這樣就完成了系統的驅動程式模組的編譯了！完成編譯之後，想要在開機的時候立即啟動這個模組的對應，那麼就寫入 /etc/modules.conf 當中，所以：

    [root @test root]# vi /etc/modules.conf
    alias eth0 via-rhine

    加入上面黃色字體那行就對啦！

  • depmod

    [root @test /root]# depmod [-aens]
    參數說明：
    -a ：將 /etc/modules.conf 可以查詢到的模組的相關性都寫入 /lib/modules/`uname -r`/當中
    -e ：顯示出目前已載入的不可執行的模組名稱
    -n ：將各模組的相依性直接輸出螢幕上，而不是輸出到 /lib/modules/`uname -r` 當中
    -s ：將一些訊息結果輸出到 syslog 的登錄檔中！
    範例：
    [root @test /root]# depmod -a
    [root @test /root]# depmod -n

    很多時候，在使用模組時，這些模組基本上是有相關性的！什麼意思呢？例如你要在 NAT 伺服器的情況下啟動 NAT 時，那麼就需要 ip_tables 這個模組，以及 ip_nat 這個模組，而若你還想要啟用 NAT 下的 ftp 功能，那麼就需要啟用 ip_nat_ftp 模組！換個角度來想，如果你需要啟用 ip_nat_ftp 模組的話，那麼就『必需啟用 ip_nat 與 ip_tables 模組！』這就是所謂的相依性！而這些相依性的內容都是被紀錄在 /lib/modules/`uname –r`/modules.dep 這個檔案中的！至於分析這些模組的相關性，則是以 depmod 來執行的啦！此外，如果不想讓模組被寫入 /lib/modules/`uname -r` 當中的話，那麼就加入 -n 參數吧，可以先看一下各模組的相依性呢！

  • lsmod

    [root @test /root]# lsmod
    參數說明：
    範例：
    [root @test /root]# lsmod
    Module Size Used by Tainted: P
    ipt_MASQUERADE 1216 1 (autoclean)
    iptable_filter 1696 1 (autoclean)
    ip_conntrack_irc 2592 0 (unused)
    ip_conntrack_ftp 3328 0 (unused)
    ip_nat_irc 2400 0 (unused)
    ip_nat_ftp 2976 0 (unused)
    iptable_nat 13588 3 [ipt_MASQUERADE ip_nat_irc ip_nat_ftp]
    ip_tables 11232 5 [ipt_MASQUERADE iptable_filter iptable_nat]
    ip_conntrack 13356 3 [ipt_MASQUERADE ip_conntrack_irc ip_conntrack_ftp ip_nat_irc ip_nat_ftp iptable_nat]
    ppp_async 6240 1 (autoclean)
    8139too 14208 2
    usbcore 29632 0 (unused)

    在目前系統中的模組有哪些呢？就是以 lsmod 來查看就對啦！例如以我的宿舍 Linux 主機來看，我的網路卡是螃蟹卡，亦即是 8139 這個模組啦，另外，我有進行 NAT ，所以開啟了相當多的 iptables 模組，所以你可以看到一堆 ipxxxx 的模組名稱啦！

  • modinfo

    [root @test /root]# modinfo [-adnp] module_name
    參數說明：
    -a ：秀出作者
    -d ：秀出這個模組的基本說明
    -n ：秀出這個模組的檔案放置路徑與名稱
    範例：
    [root @test /root]# modinfo 8139too
    filename: /lib/modules/2.4.19/kernel/drivers/net/8139too.o
    description: "RealTek RTL-8139 Fast Ethernet driver"
    author: "Jeff Garzik <jgarzik@mandrakesoft.com>"
    license: "GPL"
    parm: multicast_filter_limit int, description "8139too maximum number of filtered multicast addresses"
    parm: max_interrupt_work int, description "8139too maximum events handled per interrupt"
    parm: media int array (min = 1, max = 8), description "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"
    parm: full_duplex int array (min = 1, max = 8), description "8139too: Force full duplex for board(s) (1)"
    parm: debug int, description "8139too bitmapped message enable number"

    [root @test /root]# modinfo -a 8139too
    "Jeff Garzik <jgarzik@mandrakesoft.com>"

    [root @test /root]# modinfo /usr/local/src/dlink-530/via-rhine.o
    filename: /usr/local/src/dlink-530/via-rhine.o
    description: "PCI 10/100Mb Fast Ethernet Adapter"
    author: "Donald Becker <becker@scyld.com>"
    license: <none>
    parm: debug int
    parm: min_pci_latency int
    parm: max_interrupt_work int
    parm: rx_copybreak int
    parm: options int array (min = 1, max = 8)
    parm: full_duplex int array (min = 1, max = 8)

    很簡單吧！就是用來查看這個模組的作者啦！如果不加任何參數的時候，就是將這個模組的所有訊息都寫出來的意思！我們使用的網路卡（螃蟹卡）所掛載的這個模組使用的檔案就是： filename 那一行當中的 /lib/modules/2.4.19/kernel/drivers/net/8139too.o 這個檔案啦！那麼如果我是想看剛剛我們在核心編譯當中編譯出來的那個模組的資訊呢？可以直接加上模組的檔案名稱！

  • modprobe

    [root @test /root]# modprobe [-l|-c]
    [root @test /root]# modprobe modules_name<==直接載入該模組與其相依屬性的模組
    參數說明：
    -l ：列出目前系統所有的模組 ( 在 /lib/modules/`uname -r`/kernel 底下 )
    -c ：列出目前系統所有的模組！（更詳細的代號對應表）
    範例：
    [root @test /root]# modprobe ip_tables <==直接載入 ip_tables.o 這個模組
    [root @test /root]# modprobe –l

    這東西相當的好用，因為他除了可以將後面接的模組名稱載入之外，還可以依據 /lib/modules/`uname –r`/modules.dep 裡面的相依屬性，將其他相關的模組也載入！不錯吧！此外，需要特別留意的是，模組全部都擺在『 /lib/modules/`uname -r`/kernel 』這個目錄下，而且模組的名稱都是以 *.o 這個附檔名存在，但是在實際載入模組的時候，只要寫入名稱即可，千萬不可寫入 .o 或者是路徑名稱，例如要載入 ip_tables.o 這個模組時，就寫 modprobe ip_tables 即可！其實，這個程式與底下的 insmod 有點類似，只是他是依據系統已經建立好的模組相依屬性來載入模組，而 insmod 則是直接手動來載入模組檔案！

  • insmod

    [root @test /root]# insmod [-fkps] module_name
    參數說明：
    -f ：強制將模組載入，要載入不相同版本的模組時候可能會用到的參數
    -k ：自動在核心沒有使用到該模組的時候，先清除乾淨！
    -p ：測試模組是否可以被載入，不會直接載入系統中！
    -s ：將一些執行訊息寫到 syslog 這種登錄檔，而不是寫到 terminal 當中！
    範例：
    [root @test /root]# insmod -p /usr/local/src/dlink-530/via-rhine.o
    Warning: loading /usr/local/src/dlink-530/via-rhine.o will taint the kernel: no license
    See http://www.tux.org/lkml/#export-tainted for information about tainted modules

    這個跟 modprobe 有點類似啦，但是 insmod 可以讀取非 /lib/modules/`uname -r`/kernel 內的模組，而且還可以為模組進行載入測試呢！您可以加上路徑與完整的檔名來載入模組，加上 -p 這個參數可以驗證該模組的可執行性與否！！『要注意的是，這個 insmod 輸入的模組名稱必須要完整的路徑、檔名來輸入呦！』

  • rmmod

    [root @test /root]# rmmod modules_name
    參數說明：
    範例：
    [root @test /root]# rmmod 8139too

    顧名思義，呵呵！移除模組的程式啦！！使用 lsmod 得到以存在的模組之後，，然後再輸入『 rmmod 模組名稱』就可以移除模組囉！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/05/29：第一次完成
2003/02/11：重新編排與加入 FAQ
2002/05/29 以來統計人數


系統設定常用指令
最近更新日期：2003/02/11
基礎設定工具
    Mandrake 系統設定工具：drakconf
    Red Hat 基本系統設定指令： setup,
    /etc/sysconfig/*
系統啟動服務工具： ntsysv, service, chkconfig, init,
本章習題練習
基礎設定工具
我們在 Linux 系統開機流程的說明中提及了相當多次的系統設定檔案所在的目錄，那就是 /etc/sysconfig 這個目錄囉，您可以手動的修改一下該目錄裡面的各個檔案，以使符合您的系統環境！底下我們會介紹關於這個目錄底下各個檔案所代表的意義啦！

由於這本書當中尚未提到關於網路架設的部分(若還寫下去的話，那麼這本書也就太重了…)，所以我們先以簡單的方式來說明一下如何設定網路方面的功能，這個時候，每個 distribution 所提供的一些好用的小工具軟體，就得給他瞭解一下的啦！底下我們分別介紹一下目前最流行的兩套 distribution 的工具，分別是 Mandrake 與 Red Hat 的兩個小工具呦！
Mandrake 系統設定工具：
在 Mandrake Linux 裡頭已經有一個相當好用的系統參數設定工具，那就是大家都耳熟能詳的『 drakconf 』囉！這工具說穿了也沒有什麼特殊的地方，就是他將一些 /etc/sysconfig 裡的設定參數給他做成圖形界面就是了！基本上，如果你對系統熟的話，那麼不需要使用 drakconf 也是可以的啦！直接修改 /etc/sysconfig 底下的東西就可以囉！好吧，閒話不多說，我們就來看一看 drakconf 的功能吧！
  • 屬性相依的套件需求：
    如果您當初使用的安裝方法是比較小的安裝方式，例如鳥哥都不安裝圖形介面的，好讓我那小的可憐的硬碟還可以被拿來當作資料備份之用…這個時候，很可能 drakconf 就沒有被您安裝上來囉！此時，請將您的 Mandrake 9.0 的 CD 1 拿出來，給他放入光碟機當中，並且掛載上來，再使用 RPM 的方法，安裝一下底下的各個套件：

      userdrake-0.5-3mdk.i586.rpm
      menudrake-0.7.1-3mdk.i586.rpm
      rxvt-2.7.8-5mdk.i586.rpm
      harddrake-ui-1.1.9-53mdk.i586.rpm
      drakcronat-0.1.2-9mdk.noarch.rpm
      drakconf-9.0-6mdk.i586.rpm

    玩過了前面幾章之後，千萬不要不曉得我上面講的是什麼內容….如果忘記了，請回到前面的章節，並且『仔細的，好好的再看一遍』吧！這樣安裝完畢之後，就會有 drakconf 在你的系統當中囉！如果您想要知道你的 Linux 系統當中有沒有 drak 為開頭的指令要怎麼尋找？別擔心！回到第三部分講 Shell 的地方，還記得 BASH 裡面關於 <tab> 按鍵的用途吧！呵呵！試試看就知道會發生什麼事情囉！
在你輸入 [root @test root]# drakconf 之後，就會出現底下的圖樣：

如上為 drakconf 的主要圖示，在這些畫面中，除了要您以鍵盤輸入文字的時候會有底線之外，其他的時候，只要移動『上下左右』、『空白』、『tab』及『Enter』等按鍵操作即可！drakconf 主要僅是將幾個小工具彙整成為一個啦！那麼這個 drakconf 底下彙整了哪些小工具呢？看看上面的圖示，您會發現有底下幾個個別的小工具：
  • Add new users：新增帳號工具，您可以參考第十三章的內容；
  • Boot Configuration：就是 LILO 跟 Grub 的內容，參考十七章內容；
  • Connection Sharing：這個就是鼎鼎大名的 DHCP ( Dynamic Host Configuration Protocol ) 主機的設定啦！就是讓您的 Linux 成為 DHCP 主機，可以分配 IP 給同一個網域內的其他電腦呢！
  • Display Configuration：設定您的顯示模式，也就是在圖形介面無法登入的時候，可以用來修正 Xfree86 這個圖形使用者介面的工具！
  • Internet & Network：設定網路啦！包括您的網路卡、主機名稱等等！
  • KeyBoard Configuration：鍵盤的設定，主要是鍵盤的格式；
  • Mouse Configuration：設定滑鼠的類型；
大概就是這樣啦！底下我們分別來說一說各個工具的內容吧：
  • Add new users：
    新增使用者的方法我們都知道直接使用 useradd 再以 passwd username 設定密碼即可！這個小工具即是幫我們進行這兩個動作，其圖示如下所示：

    那個 User name 才是『帳號』，至於 Real name 則是在 /etc/passwd 當中的第五欄說明欄的內容啦！輸入完畢之後就給他 Accept user 即可！
  • Boot Configuration
    其實這個就是 /usr/sbin/drakboot 這支程式啦！他的功能亦即是我們在開機流程的內容所提到的 LILO 與 Grub 內容，就是進行開機管理啦！按下這個功能之後會出現如下的圖示：

    事實上，這個動作可以幫我們設定兩個咚咚，第一個是分別設定 /etc/lilo.conf 或 /boot/grub/menu.lst 這兩個設定檔，第二個則是將該設定寫入 MBR 或 Super Block 當中！記得回到開機流程去瞧一瞧內容即可！當然啦！由於他還可能會幫我們寫入 MBR 或 Super Block 呢！所以還是要小心一點呢！
  • Connection Sharing
    這個動作是在幫我們主機進行 DHCP 設定的各個規劃，由於我們尚未提到網站架設的部分，俺可不希望這裡隨便講講，結果您照著這裡的作法也隨便作作，最後就被怪客隨便破解∼所以呢，有興趣的朋友您可以自行試做看看，其實很簡單，照著出現的圖樣一步一步輸入參數就對了！但是什麼參數才是對的？呵呵！如果您真的很急的話，那麼可以先參考底下的網站呢：
    http://www.study-area.org/linux/servers/linux_dhcp.htm
    http://linux.vbird.org/linux_redhat7.2/65dhcp.html
  • Internet & Network
    但是網路內容就得說一說了，因為如果不作的話，那麼您的 Linux 怎麼上網呢？OK！這裡就來稍微談一談吧！現在上網的方式主要有三種，分別是：

    1. 固定制的 IP：使用的是稱為 LAN ( Local Area Network ) 的方法；
    2. 浮動式的 ADSL ：就是使用 ADSL 呀！
    3. 浮動式的 Cable ：就是使用 DHCP 呀，同樣也是選擇 LAN 的方法。

    我們先來談一下比較簡單的 LAN 的設定，首先，要使用 LAN 之前，請先確認您的網路參數，分別是：

    1. Protocol 固定( Static )或動態( Dynamic ) IP 分配
    2. IP 你的主機位址
    3. Network 你的主機網域
    4. Netmask 你的主機子網路遮罩
    5. Broadcast 你的主機的廣播位址
    6. Gateway 你的主機所使用的通訊閘
    7. Hostname 你主機的名字！
    8. DNS 你需要 ISP 的 DNS 的 IP

    其中，在協定(Protocol)的部分要特別注意了，若以 ISP 的角度來看，那麼如果協定為 static 則是固定 IP 的設定方式，如果是 Dynamic 則是 Cable 的設定方式！這是因為 Dynamic 就是使用 DHCP 這個協定所造成的啦！好了，現在來看一看按下了 Internet & Network 這一項，會出現如下的圖示，這個時候請選擇 Configuration the connection 。

    這個時候會出現是否自訂設定或專家模式，然後請按下專家模式：

    OK！既然要使用 LAN 所以使用 LAN connection 喔！

    然後出現了硬體的選擇項目，如下所示，在下圖中顯示了兩張網路卡的模組，這是因為我有兩張網路卡，所以上頭會顯示兩個模組。所以，如果您的主機跟我的主機網路卡的形式或者是數量不同，那麼您主機上面的圖樣就會跟我不相同囉！注意注意。好了，在下圖中問你是否還有其他的網路設備？因為我知道沒有其他的網路卡了，所以當然就選擇 No 囉！

    好了，底下要開始給他設定一下你的網路囉！在這個例子中，首先我們使用固定制的方式，使用了 192.168.1.2 這個私有 IP ，然後選擇不要 bootp/dhcp ，並且設定在開機的時候啟動，因此勾選 Start at boot ！

    不過，如果你是使用 Cable 的話，或者是您公司有架設 DHCP 主機的話，那麼上面的圖示中，你就需要選擇『Automatic IP 』這一項！而其他的就直接設定的跟我一樣即可！這可是很重要的！然後再設定你的主機名稱與 ISP 給你的 DNS 的 IP，還有 Gateway 或者是 Gateway 的裝置！像我是以 eth1 做為對外的網路卡，因此就選擇 eth1 囉！

    這樣就設定 OK 啦！其實，以上的步驟就只是設定底下幾個檔案：

    • /etc/sysconfig/network
    • /etc/sysconfig/network-scripts/ifcfg-eth0
    • /etc/resolv.conf

    我們在網路架設篇再來聊一聊如何設定這些資料，包括使用手動的方式設定固定 IP 、 Cable 與 ADSL 上網的方式！

    這些就是 drakconf 的主要功能了！當然，還有 X-window 裡面的 XFree86 的硬體設定！不過，這些資料我們就在 X-Window 章節裡面再提囉！
Red Hat 基本系統設定指令
    在 Red Hat Linux 裡頭有一個相當好用的系統參數設定工具，那就是大家都耳熟能詳的『 setup 』囉！這工具說穿了也沒有什麼特殊的地方，就是他將一些 /etc/sysconfig 裡的設定參數給他做成圖形界面就是了！基本上，如果你對系統熟的話，那麼不需要使用 setup 也是可以的啦！直接修改 /etc/sysconfig 底下的東西就可以囉！
setup：
我們先來說一說 setup 的用法吧！以 root 的身份在 command line 輸入 setup 就可以進入如下的畫面：
主要有底下幾個設定的咚咚：
  • Authentication configuration：這是關於系統性安全的設定項目；
  • Firewall configuration ：這個是關於 ipchains 的防火牆機制設定；
  • Keyboard configuration ：這個是鍵盤的類型設定項目；
  • Mouse configuration ：設定滑鼠的型態的地方啦；
  • Network configuration ：設定網路參數的地方，包括你的 IP 呦！
  • System services ：設定一些系統服務的地方；
  • Printer configuration ：設定印表機囉；
  • Sound card configuration ：就是設定音效卡啦！
  • Timezone configuration ：設定時區；
  • X configuration ：設定 X-Window 相關的硬體設定！
    依序介紹一下裡面的各種資料囉：
  • Authentication configuration ：
    還記得我們在 帳號管理 那一篇文章裡面提到的東西嗎？對啦！我們在管理密碼的時候就是使用那個 shadow 的資料！好啦，那麼怎麼改變這些密碼資料的設定呢？呵呵！就是在這一項囉！按下他之後會出現底下兩個畫面：

    那個 NIS, LDAP, Hesiod 等等都是其他類型的 ID 與 pass word 管理伺服器，這裡我們不太需要使用到這麼高級的伺服器！所以只要簡單的 Shadow 與 MD5 這兩個編碼過的安全防護即可！所以囉，您可以在這裡勾選 Shadow 與 MD5 就行了！除非後來您還想要加入上述的伺服器！( 註：這個項目完成之後，會寫入/etc/sysconfig/authconfig這個檔案當中！所以也可以直接修改這個檔案即可！)
  • Firewall configuration ：
    這是用來設定防火牆的！

    • 在設定防火牆之前需要來瞭解一下什麼是『防火牆』？簡單的說，防火牆就是資料封包的過濾機制的套件囉，目前在 2.2.xx 上面使用的是 ipchains 這個封包過濾，至於 2.4.xx 則使用的是 iptables 這個封包過濾機制。此外，這兩個封包過濾機制『不能同時開啟』！

    但是在這個 setup 當中的 firewall 比較詭異一點點，就是在 Red Hat 7.1 以後的版本中（包含這一版的 Red Hat 7.2 ）使用的 Kernel 是 2.4.xx 版本，這一版的適合的防火牆如前述是 iptables 這個機制，但是

    • 這支程式使用來設定的卻是『 ipchains 』真是的∼∼而且，另外一點比較怪異的是，
    • 這個程式啟動之後，所顯示的是『程式預設值』而不是您目前的設定值，所以每次進入都會顯示『Security Level 為 ( ) High 那一項！，不過，只要不按下 OK 的話，就不會改變您原先的設定！

    基本上，這個東西用來設定 ipchains 是可以啦，但是用來設定 iptables 則『沒有辦法』，最起碼我試不出來，如果您試出來的話，可得教教我呦！按下之後顯示出來的樣子如下：

    請注意，在上面的設定當中，是適合於 ipchains 的，再強調一次，所以如果您使用了 iptables 作為您的防火牆機制，那麼就不要使用這支程式了！另外，在第二個畫面中，需要特別注意的是：

    • 如果您只有一張卡（例如上面的例子），那麼千萬注意『不要開啟 eth0 』這個咚咚！上面的意思是說，『來自底下的界面卡(例如 eth0)或者是底下的 port 號，則予以接受』，那麼當您接受 eth0 的請求，偏偏這個卡是對外卡，那麼由於所有的要求都是由外界來的，所以底下的設定則完全沒有用了！因為檢查到界面卡的部分就予以放行的意思！這裡請注意！
    • 萬一，若您有兩張網路卡，一張對內（假設為 eth0 ）一張對外（假設為 eth1 ），那麼對內信任對外不信任，則可以勾選 eth0 為信任的（溝成星號），而 eth1 則不勾！

    那麼這個設定在產生什麼設定檔案呢？

    • 這個設定完成之後，會在 /etc/sysconfig 產生一個名為 ipchains 的檔案，這個檔案即是開機時啟動的設定檔，您可以查詢到 /etc/rc.d/init.d/ipchains 這個啟動檔案的內容看到！！
    • 同理，如果您想要一開機立即將您的 iptables 機制的規則寫上去的話，那麼就可以在 /etc/sysconfig/ 建立一個名為 iptables 的檔案囉！
  • Keyboard configuration ：
    這是用來設定鍵盤型式的！如下圖所示：

    選擇正確的即可！通常我們選擇 us 這一個就對了！(註：修改的結果會記錄在 /etc/sysconfig/keyboard 這個檔案中！)
  • Mouse configuration：
    這是用來設定滑鼠的！按下去之後會顯示出下面的圖示：

    看到了喔！如果是 ps/2 的介面的話，那麼上面就會顯示出 Generic Mouse (PS/2) 的那一項！請依照您的硬體來設定好你的滑鼠周邊！( 這個項目會在 /etc/sysconfig/mouse當中記錄下來正確的滑鼠型態，可以直接修改這個檔案呦！)
  • Network configuration :
    這東西是用來設定網路的東西的！按下他之後會出現底下的咚咚：

    所謂的 DHCP 是一種動態發放 IP 的主機，來分給 client 電腦 IP 的方式！那麼由於我們使用的是虛擬 IP 這一種靜態的 IP 給予方式，所以自然就將第一個取消囉！另外，需要特別留意的是，使用 Cable 的朋友就是以 DHCP 來上網的，所以其對外的卡使用的就得是 DHCP 協定囉！然後需要來設定 IP （給予虛擬 IP 即可！）子遮罩網路（ netmask）及 gateway 等等，這個咚咚會修改到的檔案有：

    • /etc/sysconfig/network
    • /etc/sysconfig/network-scripts/ifcfg-eth0
    • /etc/resolv.conf

    大概就是如此吧！所以，基本上，手動修改上面這些檔案即可設定好網路的基礎架構囉！
  • System services ：
    這個東西也蠻好玩的，其實他就是 ntsysv 這個程式啦！按下他之後會顯示出底下的框框！

    這裡顯示的是，目前系統上以 RPM （或者是你自己寫的）可以進行『開機時後啟動的』服務項目，以這張圖表為例，顯示出 atd 這支服務在啟動的時候就會自動的啟動囉！所以你可以移動到你所想要啟動的項目之前，按下空白鍵使產生 * 後，再按下 OK 即可！不過需要注意的是：

    • 這個設定僅是在設定『啟動的時候可以自動執行』的服務，所以當你設定好 * 之後，除非重新開機，否則仍需要直接以手動啟動才行；
    • 這個設定所捉出來的服務項目，其內容都列在 /etc/rc.d/init.d 及 /etc/xinetd.d這兩個目錄內；
    • 這個設定設好之後，其連結會在 /etc/rc.d/rc#.d/Sxxservername 這個檔案內，例如我以文字型態登入的，所以 run-level 為 3 ，而我要設定的是 atd 這個服務，所以就會在 /etc/rc.d/rc3.d/S95atd 這個連結檔建立到 /etc/rc.d/init.d/atd 這個執行 script 中！請注意，那麼 S 代表開機啟動的意思，而數字代表執行的順序！
  • Printer configuration ：
    設定 printer 的步驟！按下去之後可以出現如下的咚咚：

    這個我就不是很熟悉了！請有經驗的朋友來信告訴我該怎麼做吧！
  • Sound card configuration ：
    設定音效卡囉！那就設定吧！

  • Timezone configuration ：
    還記得我們選擇的時區嗎？呵呵！想不想改變呢？

    建立的資料寫在 /etc/sysconfig/clock 裡頭！
/etc/sysconfig/* 裡頭的設定檔案：
    剛剛提過了，那個 drakconf 與 setup 這兩支工具軟體都是在設定 /etc/sysconfig 裡面的檔案，所以我們就得來看看這些目錄裡面的檔案是幹嘛用的？我們底下只說明幾個可能會用到的檔案，並介紹該檔案的用途（註：由於不同的 distribution 當初在設計的理念多少有點不同，因此，在開機啟動的設定項目中，就會有些許的差異！所以，在 /etc/sysconfig 裡面的檔案，在各個 distribution 當中，多少也有點差異性，故而請注意您使用的版本呢！不過，底下還是列出大部分您可以察看的到的檔案吧！ ^_^
    /etc/sysconfig/* | 用途
authconfig | 系統使用者所使用的認證方式，或者說是系統使用者使用以登入主機的密碼管理方式。目前最常見的就是每部主機自己管理自己，也就是 /etc/shadow 這個檔案，以及底下會再提到的檔案認證方式 MD5 的編碼格式！通常檔案的內容為： USELDAP=no <==是否使用 LDAP USEMD5=yes <==是否使用MD5 USENIS=no <==是否使用NIS USESHADOW=yes <==是否使用 shadow
autofsck | 當系統出現問題的時候，通常系統會自動的執行 fsck ，但是當這個檔案存在的時候，那麼系統就會依據這個檔案的內容來決定是否需要以 fsck 來檢查硬碟資料！ AUTOFSCK_TIMEOUT=5 <==暫停時間等待輸入 AUTOFSCK_DEF_CHECK=no <==若不輸入是否進行 fsck 檢驗，這裡是設定為 no 喔！
clock | 記錄時區的檔案內容： UTC=true <==設定時區為以 GMT 時區的設定 ARC=false <==設定時間以 ARC console 來比對 ZONE=Asia/Taipei <==以 GMT 時間推算出本地的時區
gpm | 紀錄一些額外的周邊設備的檔案資料，例如滑鼠！這個服務可以讓您在文字模式下能使用滑鼠來進行複製、剪貼等等的功能！
harddisks | 要開啟 IDA 模式嗎？要啟動 16 I/O 模式嗎？沒錯！使用這個檔案來設定就對了！尤其是檔案裡頭的 USE_DMA=1 ，應該是可以直接啟動的啦！（將 # 去除！）這東西與 hdparm 程式有點關係的啦！
hwconf | 在你啟動 Linux 的時候，不是有偵測硬體的項目嗎？沒錯，偵測到的硬體就是記錄在這裡，所以，如果要瞭解你的硬體資訊，來這個檔案看一看就知道了！（註：需要對於硬體如晶片組有點瞭解的人才比較容易看懂！）這東西與 hdparm 程式有點關係的啦！
i18n | 修改預設語系的地方！很多朋友常常提到，如果預設語系選擇中文，偏偏文字模式下無法正常顯示，那麼就修改這裡的設定即可！將 LANG 的設定改成 en_US 即可！不過，有沒有支援還是得看這個檔案裡頭的 SUPPORTED 項目才行！
keyboard | 設定鍵盤的形式；
kudzu | 設定開機時後偵測新裝置的方式！
mouse | 設定滑鼠的形式
network | 設定你的網路狀態，例如 gateway, hostname 等等的地方！相當重要！
network-scipts | 所有的介面卡設定檔案的地方！例如 ifcfg-eth0 ！相當的重要！
rhn | 設定一些 up2date 線上更新的註冊資料！( Red Hat 上才有！)
iptables | （不一定會存在的檔案）這個檔案為開機時啟動防火牆規則的規則檔案！

    其他的咚咚不是不重要，而是我僅列出比較相對重要的咚咚！
    註：很多檔案都必須要您的系統中有設定啟動才會存在該檔案，例如 iptables 即是一例！

系統啟動服務工具：ntsysv, service, chkconfig, init,
大家一定都有：『咦！我某些服務在開機的時候啟動，要怎麼開始？』的疑問吧！？像我一開始玩 Linux 的時候，就對這個問題很有興趣！嘿嘿！完到最後才終於曉得，原來開機能不能執行跟你的 /etc/rc.d/init.d 裡頭的服務設定項目有關，例如我要立刻就啟動 apache ，那麼 apache 的啟動 script 稱為 httpd ，所以要啟動他就需要：
/etc/rc.d/init.d/httpd start
此外，一開機是否立刻啟動則是設定在 /etc/rc.d/rc[0-6].d 這總共七個目錄下的資料中！我們當然可以手動來進行連結檔案，使他符合我們所需要的特性，但是我們也可以透過 Linux 給我們的設定工具來執行呦！
  • ntsysv

    [root @test /root]# ntsysv [--level run-level]
    參數說明：
    --level ：可以設定每一個 run-level 的開機啟動項目
    範例：
    [root @test /root]# ntsysv　　　　　　　<== 目前的 run-level 下的設定
    [root @test /root]# ntsysv --level 5　　<== 不同 run-level 下的設定修改
    說明：
    這支工具蠻有意思的！他可以設定開機時後啟動的項目呢！就是在 setup 裡頭的 System Services 那個設定的地方！比較不一樣的地方在於，這個單獨的程式還可以執行非目前 run-level 的啟動項目。如果您回到前面提到的『開機流程』的地方，那麼就會發現在啟動的項目方面，需要取得 inittab 之後，才能在各個 /etc/rc.d/rc#.d 裡頭執行各不同的 scripts ，其中常用的 run-level 是 3 及 5 （文字與圖形！）。那麼 ntsysv 就可以依據：

    • /etc/xinetd.d
    • /etc/rc.d/init.d

    這兩個資料夾內的 scripts ，然後配合 /etc/rc.d/rc#.d 裡頭的 scripts 來進行連結檔的設定！

  • service
    [root @test /root]# service [service name] [start|stop|restart]
    參數說明：
    service name ：這個服務名稱必須要實際存在 /etc/rc.d/init.d 這個目錄下才行
    start|stop.. ：基本上，這個與 /etc/rc.d/init.d/service_name 所允許的啟動形式有關！
    範例：
    [root @test /root]# service xinetd restart　　<==重新啟動 xinetd
    [root @test /root]# service sendmail start　　<==啟動 sendmail 這個服務！
    說明：
    這個程式就更簡單了！基本上他只是一支 script 而已！他會將 /etc/init.d （其實就是 /etc/rc.d/init.d ）的東西取出來，然後進行分析啦！例如上面的例子中，[ service xinetd restart ] = [ /etc/rc.d/init.d/xinetd restart ]這兩個是完全相同的東西呦！只是 service 把他更簡化了而已！除此之外，在 ntsysv 與底下接著要說明的 chkconfig 都是『等到下次開機的時候再啟動』的方式，那麼有沒有辦法立刻啟動呢？呵呵！那就是 service 的工作啦！ service 可以直接將該服務啟動呦！

  • chkconfig

    [root @test /root]# chkconfig [--level levels] [--list|add|del] [service name]
    參數說明：
    --level ：同樣的說明了可以設定不同的 run-level 的咚咚！
    --list ：列出 run-level 情況下的該套件名稱是否有被開機啟動？！
    --add ：增加一個 service_name 在開機的時候啟動；
    --del ：刪除一個開機啟動的服務！
    service name ：這個服務名稱必須要實際存在 /etc/rc.d/init.d 這個目錄下才行
    範例：
    [root @test /root]# chkconfig --list sendmail　　<==列出 sendmail 的啟動！
    sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    上面說明， sendmail 在 run-level 0, 1, 6 的時候是 off ，而在 2,3,4,5 是 On 的情況！

    [root @test /root]# chkconfig <==列出系統所擁有的執行服務，並且列出是否開機啟動？
    keytable 0:off 1:on 2:on 3:on 4:on 5:on 6:off
    atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
    kdcrotate 0:off 1:off 2:off 3:off 4:off 5:off 6:off
    syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    gpm 0:off 1:off 2:on 3:off 4:on 5:on 6:off
    kudzu 0:off 1:off 2:off 3:off 4:on 5:on 6:off
    sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    netfs 0:off 1:off 2:off 3:off 4:on 5:on 6:off
    network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    random 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    rawdevices 0:off 1:off 2:off 3:off 4:on 5:on 6:off
    apmd 0:off 1:off 2:on 3:off 4:on 5:on 6:off
    ipchains 0:off 1:off 2:on 3:off 4:on 5:on 6:off
    iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    anacron 0:off 1:off 2:on 3:off 4:on 5:on 6:off
    xinetd based services:
    chargen-udp: off
    chargen: off
    daytime-udp: off
    daytime: off
    echo-udp: off
    echo: off
    time-udp: off
    [root @test /root]# chkconfig --add gpm <==增加 gpm 這個咚咚在開機的時候啟動！

    說明：
    chkconfig 這個程式可以將 /etc/rc.d/init.d/ 裡面的可執行服務與 /etc/xinetd.d 裡面的相關可執行的服務，連結到目前的 run-level 裡頭去，或者是您可以定義你的 run-level 讓你的該項服務在開機的時候就給他啟動?不過請注意呦！ service 是馬上讓你的該項服務立刻啟動，但是 chkconfig 則僅是設定某個服務在開機得時候可以被啟動，並不一樣，請注意ㄋㄟ！

  • init

    [root @test /root]# init [0-6]
    參數說明：
    範例：
    [root @test /root]# init 5 <==轉為圖形介面登入！
    說明：
    說完了 /etc/rc.d/rc[0-6].d 與 /etc/rc.d/init.d 的執行序之後，呵呵！如何切換呢？是否一定要修改 inittab 這個檔案？！其實不需要，直接使用 init 這支程式就行了！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/06/16：第一次完成
2003/02/11：重新編排與加入 FAQ
2002/06/17 以來統計人數


認識系統服務 daemons
最近更新日期：2003/02/11
什麼是 daemon： /etc/services, 命名規則,
系統的 Daemons 放在哪裡： /etc/rc.d/init.d/, /etc/xinetd.conf, /etc/xinetd.d,
解析 xinetd.conf
TCP_Wrappers ： /etc/hosts.allow, /etc/hosts.deny,
系統開啟的服務： netstat, ntsysv, chkconfig,
各個服務的簡單說明
本章習題練習
什麼是 daemon
如果您常常上網去查看一些資料的話，尤其是關於 Unix-Like 的相關作業系統，如 FreeBSD, Unix, Linux 等等，應該會常常聽到 daemons 這個字眼，那麼 daemon 是什麼東西呀！？怎麼這麼常被見到？呵呵，Daemon 的字面上的意思就是『守護神、惡魔？』還真是有點奇怪呦！ ^_^"" 。基本上，我們的 Linux 主機常常會收到一些要求，不論是來自本機系統的要求或者是網路 Client 端的服務要求，反正只要有要求來的時候，通常就是各式各樣的 daemons 負責去喚起應該要工作的 Servers 來工作啦！那麼 daemons 目前有兩種基本的模式，分別是 stand_alone 與 super daemon 兩種方式，底下就來說一說這兩種 daemon 的工作型態：
  • stand_alone ： 就字面上的意思來說，stand alone 就是『獨立的啟動』的意思，也就是說，該 daemon 啟動之後，就直接常駐在記憶體當中囉！他雖然會一直的佔用系統的資源，但最大的優點就是，他會一直啟動的啦！所以當有要求來的時候，他就會很快速的回應囉！常常用在這一種 daemon 的網路服務如常見的 httpd 這一個即是一例！
  • super daemon ： 相對於 stand alone 的執行方式，這一種服務的啟動方式則是藉由統一的一個 daemon 來負責喚起該服務！這一個統一負責的 daemon 就是 inet 這支服務啦！不過，在後來的 Linux 發展套件中，則是使用 xinet 這個設定囉！我們這裡以 Mandrake 的 xinet 來做說明。當有網路的服務要求來的時候，該要求會先送給 xinet 這個服務，然後 xinet 根據該網路要求送來的資料封包的內容 ( 該內容會記錄 IP 與 port ) 來將資料封包送給實際運作的服務！而該服務這個時候才會啟動的！最常見到的就是 ftp 這支網路服務啦！這種最大的優點就是當沒有資料封包來的時候，該服務不會一直佔據系統資源 ( 該服務會在 sleeping 的狀態吧！ ) ，但是相對的，他的反應時間也會比較慢，因為還要花費一段時間去『喚醒』該服務呀！
那麼這兩種啟動的方式哪一個比較好呢？見仁見智啦！而且還要看該主機的工作負荷與實際的用途說！例如當你的主機是用來作為 WWW 伺服器的，那麼 httpd 自然就以 stand alone 的啟動方式較佳！事實上，我們常常開玩笑的說明 stand alone 與 super daemon 的情況，可以銀行的窗口來作為說明的範例！
  • stand alone ： 在銀行裡面，假設有一種單一服務的窗口，例如存錢窗口，所以，當你需要存錢的時候，直接前往該窗口，就有『專人』為您服務啦！
  • super daemon ： 在銀行裡面假設還有另外一種複合型態的窗口，同時提供轉帳、資金調度、提款等等的業務，那當你需要其中一項業務的時候，就需要前往該窗口，但是坐在窗口的這個營業員，拿到你的需求單之後，往後面一丟『喂！那個轉帳的仁兄！該你的工作了』那麼那個仁兄就開始工作去！然而裡頭還有資金調度與提款等負責業務的仁兄呢？他們在幹嘛？嘿嘿！看看報、喝喝茶囉！那麼這裡就會引出另外一個問題啦！假設銀行今天的人潮特別的洶湧，所以這個窗口後面除了你之外還有很多的人！那麼想一想，這個窗口是要『一個完成再來下一個』還是『全部都把你們的單據拿來，我全部處理掉』呢？呵呵！是不是不太一樣？

    • multi-threaded：就是我們提到的，全部的客戶之要求都給他拿來，一次給他交辦下去，所以一個服務同時會負責好幾個程序。

    • single-threaded：這個就是目前我們『人類的銀行』最常見的方式啦，不論如何，反正一個一個來，第一個沒有處理完之前，後面的請排隊！嘿嘿！所以如果 client 的要求突然大增的話，那麼這些晚到的 client 可得等上一等！
另外，需要注意的是，既然銀行裡頭有這兩種窗口同時存在，所以囉，在 Linux 系統裡面，這兩種 daemon 是可以同時存在的啦！也就是說，某些服務可以使用 stand alone 來啟動，而有其他的服務則可以使用 xinet ( 或者是 inet ) 大致的情況就是這樣啦！了呼！？
  • /etc/services
    OOK！這個時候就又發生了另一個問題囉！那麼我怎麼知道要將我的資料送到那個窗口去！咦！那個窗口不是有寫說明說他是幹嘛用的嗎？所以你要存錢、轉帳、或者是進行匯款，都可以在不同的窗口來完成，那麼換到實際的網路情況來說呢，因為我們的 TCP 封包裡面含有 port 與 IP 對吧！將那些已經監聽的 port 想成是這些窗口，如此一來你的 TCP 封包便可以依據不同的需求，而到達不一樣的 port 來索取服務了！因此，你的連線是 FTP, WWW, smtp 等等都好，絕對不會被搞錯啦！

    好了，如果我想要知道這個 port 是由那個服務所啟動的呢？在 Linux 系統裡面有個檔案在說明那個窗口與服務的 ( services and ports ) 對應！呵呵！那就是鼎鼎大名的 /etc/services 這個檔案啦！我們取一段常常看到的 port 與相關服務的區段來看一下好了！

    [root @test root]# vi /etc/services
    .... 略
    ftp-data 20/tcp
    ftp-data 20/udp
    ftp 21/tcp
    ftp 21/udp
    ssh 22/tcp # SSH Remote Login Protocol
    ssh 22/udp # SSH Remote Login Protocol
    telnet 23/tcp
    telnet 23/udp
    smtp 25/tcp mail
    smtp 25/udp mail
    nameserver 42/tcp name # IEN 116
    nameserver 42/udp name # IEN 116
    domain 53/tcp nameserver # name-domain server
    domain 53/udp nameserver
    .... 略
    <daemon name> <port 與型態> < 該服務的說明 >

    像上面說的是，第一欄為 daemon 的名稱、第二欄為該 daemon 所使用的 port 號碼與其網路資料封包傳送時候的類型，主要為較穩定的 tcp 封包與較易破損但較快速之 udp 封包！舉個例子說，那個 e-mail 的發信協定為 smtp 這個服務，而這個服務的使用之 port 即為 25 啦！就這樣！

    • 請特別注意！雖然有的時候您可以藉由修改 /etc/services 來更改一個服務的 port 號，不過並不建議如此做，因為很有可能會造成一些協定的錯誤情況！這裡特此說明一番呦！（除非您要架設一個地下網站，否則的話，使用 /etc/services 原先的設定就好啦！）
  • Daemon 的命名規則：
    每一個服務的開發者，當初在開發他們的服務時，都有特別的故事啦！不過，無論如何，這些服務的名稱被建立之後，被掛上 Linux 使用時，通常在服務的名稱之後會加上一個 d ，例如例行性命令的建立的 at, 與 cron 這兩個服務，通常會被稱為 atd 與 crond，這個 d 代表的就是 daemon 的意思。所以，在資源管理那一章中，我們使用了 ps 與 top 來觀察程序時，都會發現到很多的 xxxd 的程序，呵呵！通常那就是一些 daemon 的程序囉！
系統的 Daemons 放在哪裡：
好了！那麼我們已經知道了 daemon 的作用之後，再來要討論的是，那麼他們啟動的 scripts 是放在哪裡呀！？呵呵！底下就來說一說囉：
  • stand alone ： 這個放置在 /etc/rc.d/init.d/ 這個目錄裡面，幾乎所有的 RPM 安裝的套件之啟動項目都在這裡啦！
  • super daemon ： 這個工作的那一支服務其實就是 xinet 或者是 inet 啦！請注意， xinet 也是一個 daemon 呢！他是 stand alone 啟動的，也就是他會一直在監聽大家的需求，所以 xinet 的啟動 scripts 寫在 /etc/rc.d/init.d/xinetd 這個 scripts 裡面囉！但是掛在這個 daemon 裡頭的服務之設定項目呢？嗯！就是寫在 /etc/xinetd.conf 與 /etc/xinetd.d/ 這個目錄裡面的任何檔案！
  • /etc/rc.d/init.d/*
    OK！先來瞭解一下 stand alone 的 daemon 是怎麼啟動的呢？！很簡單，假如我們要啟動 syslog 這支記錄登錄檔的服務，那麼要啟動他的話，就直接下達：
    • /etc/rc.d/init.d/syslog start
    • service syslog start
    亦即是檔名之後加上 start 即可，或者是使用 Red Hat 才有的這個 service script 來進行啟動的功能！如果你還記得我們前幾節提到過的 shell scripts 的話，那麼或許還記得 case ..... esac 這個有選擇性的項目的語法吧！？沒錯！這幾支服務就是以 bash scripts 裡頭的 case 語法寫成的！因此，只要加上後面的參數，如此一來， scripts 就會自動的去找尋執行檔來執行囉！如果有興趣的話，可以在你的系統裡面的該目錄下開一個檔案來觀看一下，就知道如何寫囉！
  • /etc/xinetd.conf
    這個檔案就是設定 xinet 服務的參數檔案啦！
  • /etc/xinetd.d/*
    這個目錄裡面的所有檔案就是個別掛上 xinet 的所有服務啦！例如赫赫有名的 wu-ftpd 及 telnet 與 pop3 等等！
解析 xinetd.conf
一般而言，在 /etc/rc.d/init.d/ 裡面的 scripts 都是發展者之 RPM 所提供的，如果您有興趣自行發展你的軟體的話，那麼可以直接以這樣的方式來獨立啟動的！不過，我們也可以經由 super daemon 來管理我們的服務，因為這個 super daemon 可以提供相當多的功能，尤其是安全性方面的功能，所以，我們就來談一談如何使用這個東西吧！

先來看一看預設的 /etc/xinetd.conf 這個檔案的內容是什麼吧！

#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d

內容格式：
service <service_name>
{
<attribute> <assign_op> <value> <value> ...
...
}

在上面的預設範例當中，說明的是：『如果沒有指定的 services ( defaults ) 那麼就用 {} 裡面的設定來執行之！』正常的情況之下有點像上面例子中的黃色字體所示，那個 <> 裡頭的資料我們先來說明一下：註：那個 assign_op 主要有三種形式，分別如下：
= ： 表示後面的設定參數就是這樣啦！
+= ： 表示後面的設定為『在原來的設定裡頭加入新的參數』
-+ ： 表示後面的設定為『在原來的參數捨棄這裡輸入的參數！』
用途不太相同，敬請留意呦！好了！底下再來說一說那些 attribute 與 value ！
attribute
(功能)
assing_op
(允許的動作)
說明
(範例)
一般設定項目：
disable
yes
no
 允許該 server 可以執行或者是不能執行！
當設定為 yes 表示該服務不能執行！
socket_type
stream
dgram
raw
 當連線為 TCP 封包時，則使用 stream 類型
當連線為 UDP 封包時，則使用 dgram 類型
raw 代表 server 需要與 IP 直接對談！
protocol
tcp
udp
...
 這個東西說的是，連線的狀態使用的是哪一種協定！？各個協定的代號可以參考 /etc/protocols 內容！此外，除非是你自己設定的服務，否則這個可以不用設定啦！
wait
yes
no
 這就是我們剛剛提到的 Multi-threaded 與 single-threaded 的方式啦！一般來說，我們希望大家的要求都可以同時被啟用，所以可以設定 wait = no
user
UID
root
 還記得我們在 帳號管理 那一篇提到的 UID 概念嗎？對啦！這個 UID 就是那個 UID 啦！要注意的是，假如你的服務啟動者不要以 root 為主的話，那麼這個地方就可以改變其他的使用者，例如 nobody ！這個咚咚也會有安全防護的機制存在！此外，需要注意這個 UID 必須存在於 /etc/passwd 。
group
GID
 跟 user 的意思相同！只是這個 GID 的使用者也必須存在於 /etc/group 當中！
instances
number
UNLIMITED
 這個是『在同一時間之內，同一個服務可以允許的連線數目』的意思，你可以寫入一個『數字』來控制連線數目，也可以使用 UNLIMITED 來告訴系統『沒有上限』囉！例如你在同時段之內僅允許 ftp 連線有 30 個，那麼這裡就可以輸入 30 啦！
nice
-19 ~ 19
 還記得我們在 程序管理 裡面談到的那個 nice 指令嗎？！對啦！這裡就是這個東西囉！數字越小( 負值 )代表該程序越優先被執行！
server
program
/usr/sbin/in.ftpd
 這個就是指出這個服務的啟動程式！例如要啟動 ftp 的話，其實就是 in.ftpd 這支程式啦！所以這個時候在這裡輸入 server = /usr/sbin/in.ftpd
server_args
一些參數
 這裡應該輸入的就是你的 server 那裡需要輸入的一些參數啦！例如 in.ftpd 當中，我們可能就需要輸入 -l -a 這個參數說！
log_on_success
PID
HOST
USERID
EXIT
DURATION
 在『成功登入』之後，需要記錄的項目：PID為紀錄該 server 啟動時候的 process ID ，HOST 為遠端主機的 IP、USERID 為登入者的帳號、EXTI 為離開的時候記錄的項目、DURATION 為該使用者使用此服務多久？
log_on_failure
HOST
USERID
ATTEMPT
RECORD
 當登入失敗之後被 syslog 登入的項目：HOST為遠端主機的 IP，USERID為登入者帳號、ATTEMPT為記錄登入失敗者企圖的意圖為何、RECORD為記錄遠端主機的資訊！以及為何本機 server 不能啟動的原因！主要有 login, shell, exec, finger 等指令可以使用在這裡！( 基本上，可以在 /etc/hosts.allow 或 /etc/hosts.deny 書寫內容 )。
進階設定項目：
env
'name=value'
 這一個項目可以讓你設定環境變數，環境變數的設定規則可以參考 認識 BASH Shell 。
port
number
 這裡可以設定不同的服務與對應的 port ，但是請記住你的 port 與服務名稱必須與 /etc/services 內記載的相同才行！
redirect
IP_Address port
 將 client 端對我們 server 的要求，轉到另一部主機上去！呵呵！這個好玩呦！例如當有人要使用你的 ftp 時，你可以將他轉到另一部機器上面去！那個 IP_Address 就代表另一部遠端主機的 IP 囉！
includedir
directory_path
 表示將某個目錄底下的所有檔案都給他塞進來 xinetd.conf 這個設定裡頭！這東西有用多了，如此一來我們可以一個一個設定不同的項目！而不需要將所有的服務都寫在 xinetd.conf 當中！你可以在 /etc/xinetd.conf 發現這個設定呦！
安全控管項目：
bind
IP_Address
 這個是設定『允許使用此一服務的介面卡』的意思！舉個例子來說，你的 Linux 主機上面有兩個 IP ，而你只想要讓 IP1 可以使用此一服務，但 IP2 不能使用此服務，這裡就可以將 IP1 寫入即可！那麼 IP2 就不可以使用此一 server 囉！
interface
IP_Address
 跟 bind 相同！
only_from
0.0.0.0
192.168.1.0/24
host_name
domain_name
 這東西用在安全機制上面，也就是管制『只有這裡面規定的 IP 或者是主機名稱可以登入！』如果是 0.0.0.0 表示所有的 PC 皆可登入，如果是 192.168.1.0/24 則表示為 C class 的網域！亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入！另外，也可以選擇 domain name ，例如 .ev.ncku.edu.tw 就可以杜絕成大環工系的網域 IP 登入你的主機使用該 server ！
no_access
0.0.0.0
192.168.1.0/24
host_name
domain_name
 跟 only_from 差不多啦！就是用來管理可否進入你的 Linux 主機啟用你的 server 服務的管理項目！ no_access 表示『不可登入』的 PC 囉！
access_times
00:00-12:00
HH:MM-HH:MM
 這個項目在設定『該服務 server 啟動的時間』，使用的是 24 小時的設定！例如你的 ftp 要在 8 點到 16 點開放的話，就是： 08:00-16:00。
umask
000
777
022
 還記得在 檔案權限 裡面約略提過的 umask 這個東西嗎？呵呵！沒錯！就是那個鬼玩意兒囉！可以設定使用者建立目錄或者是檔案時候的屬性！系統建議值是 022 。

當然上面的參數不需要每個都設定啦！只要設定需要的就可以啦！而在 /etc/xinetd.conf 這個檔案當中，一定會看到『 includedir = /etc/xinetd.d 』這一行！這說明的是，除了 /etc/xinetd.conf 之外，所有在 /etc/xinetd.d 的檔案都是可以用來設定的啦！！好了，我們來舉個簡單的 telnet 的例子吧！那就是 /etc/xinetd.d/telnet 這個檔案，如果你的 Mandrake 9.0 當中沒有這個檔案，那表示還沒有安裝telnet-server-krb5-1.2.5-1mdk這個套件，請先安裝他吧！然後，他的內容有點像這樣：

service telnet
{
        disable　　　　 = yes　　　　　　　　 <==服務預設是關閉的
        flags　　　　　 = REUSE　　　　　　　 <==額外使用的參數
        socket_type　　 = stream　　　　　　　<==使用 tcp 封包常用的連線型態
        wait　　　　　　= no 　　　　　　　　 <==不需等待，可以同時允許多個連線
        user　　　　　　= root　　　　　　　　<==啟動程序的使用者身份
        server　　　　　= /usr/sbin/telnetd　 <==服務啟動的程式
        server_args　　 = -a none 　　　　　　<==上面那個程式的參數
        log_on_failure　+= USERID 　　　　　　<==錯誤登入時，要記錄下來的內容
}

上面的表格中，已經說明了每一項參數的意義！如果原本的預設值你並不滿意，那麼你可以修改成比較安全與多一點機制。假設你這個 Linux 是一部主機，而且他有兩塊網路介面，分別是對外的 140.116.44.125 與對內的 192.168.0.254 這兩個，如果你想要讓對內的介面限制較鬆，而對外的限制較嚴格，你可以這樣的來設定呢：

# 先針對對內的較為鬆散的限制來設定：
service telnet
{
        disable　　　　 = no　　　　　　　　 <==預設就是啟動 telnet 服務
        bind 　　　　　 = 192.168.0.254　　　 <==只允許經由這個介面卡的封包進來
        only_from 　　　= 192.168.0.0/24　　　<==只允許 192.168.0.0/24 這個網段
                                                 的主機連線進來使用 telnet 的服務
        instances 　　　= UNLIMITED 　　　　　<==同時允許連線不限制！
        nice 　　　　　 = 0 　　　　　　　　　<==使用的優先順序較高
        flags　　　　　 = REUSE 　　　　　　　<==額外使用的參數
        socket_type 　　= stream　　　　　　　<==使用 tcp 封包常用的連線型態
        wait　　　　　　= no　　　　　　　　　<==不需等待，可以同時允許多個連線
        user　　　　　　= root　　　　　　　　<==啟動程序的使用者身份
        server 　　　　 = /usr/sbin/telnetd 　<==服務啟動的程式
        server_args　　 = -a none 　　　　　　<==上面那個程式的參數
        log_on_failure　+= USERID 　　　　　　<==錯誤登入時，要記錄下來的內容
}

# 再針對外部的連線來進行限制呢！
service telnet
{
        disable　　　　 = no <==預設就是啟動 telnet 服務
        bind 　　　　　 = 140.116.44.125 <==只允許經由這個介面卡的封包進來
        only_from 　　　= 140.116.0.0/16 <==只允許 140.116.0.0 ~ 140.116.255.255
這個網段連線進來使用 telnet 的服務
        only_from 　　　= .edu.tw <==重複設定，只有教務界才能連線！
        no_access 　　　= 140.116.32.{10,26} <==不許這些 PC 登入
        access_times　　= 1:00-9:00 20:00-23:59
<==每天只有這兩個時段開放服務
        umask 　　　　　= 022 <==建立檔案時的預設屬性設定
        instances 　　　= 10 <==同時只允許 10 個連線
        nice　　　　　　= 10 <==使用的優先順序較低
        flags 　　　　　= REUSE <==額外使用的參數
        socket_type 　　= stream <==使用 tcp 封包常用的連線型態
        wait　　　　　　= no <==不需等待，可以同時允許多個連線
        user　　　　　　= root <==啟動程序的使用者身份
        server　　　　　= /usr/sbin/telnetd <==服務啟動的程式
        server_args 　　= -a none <==上面那個程式的參數
        log_on_failure　+= USERID <==錯誤登入時，要記錄下來的內容
}

呵呵！如上面的設定，我們可以將 telnet 的啟動項目進行更多的限制！如此一來，將有助於我們的安全防護呢！尤其如果可以針對不同的介面來設定，嘿嘿！就更加的棒囉！不過，請注意喔！如果照上面的設定，那麼您的主機上面將會開了兩個 23 port 的介面，分別是給兩個介面來使用的呢！嗯！真好玩?同樣的，你也可以針對自己的喜好來設定你的其他 daemon 使他掛在 xinetd 底下呢！

TCP_Wrappers
好了，接著下來我們要來說一說，除了 xinetd 之外，還有另一個可以抵擋利用某些服務進入 Linux 主機的方法，那就是常常使用的 /etc/hosts.allow 與 /etc/hosts.deny 囉！這個方式是我們常常在使用的方法，這裡先提幾個比較簡單的設定方式！註： TCP_Wrappers 也可以當成一個最內層的防火牆了，因為是最內層，所以當然要設定的比較嚴格囉！

為什麼叫做 TCP_Wrappers 呢？那麼 wrappers 有包裹的意思，所以說，這個套件本身的功能就是在分析 TCP 網路資料封包啦！那麼剛剛我們稍微提到我們網路的封包資料主要是以 TCP 封包為主，這個 TCP 封包的檔頭至少記錄了來源與目主機的 IP 與 port ，因此，若藉由分析 TCP 封包，就可以比對看我要不要讓這個資料進入到主機裡面來囉！所以啦，我們要使用 TCP_Wrappers 來控管的，就是
  1. 來源 IP
  2. port (就是服務啦)
TCP_Wrappers 設定 TCP 封包是否可以進入的設定檔在 /etc/hosts.allow 與 /etc/hosts.deny 當中。因此，基本上，如果一個服務是受到 xinetd 或 TCP_Wrappers 的控制時，那麼該服務就會受限於 hosts.allow 與 hosts.deny 的管理了！而如果你自己安裝的套件當中( 亦即使用 Tarball 安裝的方式之套件 )，除非有自行定義支援 TCP_Wrappers 的功能 ，否則就無法使用這個玩意囉！嘿嘿！

那麼這兩個檔案是幹嘛用的？剛剛不是提過哪！他主要是用來規範 TCP 封包的規則的，所以呢，裡面記錄的當然就是：『某些 IP 在特定服務中是否能夠進入主機』！那麼要怎麼寫？這兩個檔案的內容基本的語法是：

<service> : <IP, domain, hostname...> : <allow|deny>

所以我們要先找出來那個 service_name 才行，例如以我們剛剛的 telnet 為例，那個 service_name 是什麼呢？其實指的就是上表中 server 這個設定後面接的程式名稱啦！所以， telnet 在 Mandrake 底下的名稱為 telnetd ( 注意，在其他的 distribution 中，這個名稱可能會變，例如 Red Hat 或 OpenLinux 都是以 in.telnetd 為名！所以這裡請參考您的系統裡面的設定而定！)。因此，如果你不想讓 140.116.44.202 這個位址及 140.116.32.0/255.255.255.0 這個 C class 的網域進入你的主機的話，那麼可以這樣在 /etc/hosts.deny 裡面設定：

[root @test root]# vi /etc/hosts.deny
telnetd: 140.116.44.202 : deny
telnetd: 140.116.32.0/255.255.255.0 : deny

這樣一來，對方就無法以 telnet 進入你的主機啦！方便吧！不過，既然如此，為什麼要設定成 /etc/hosts.allow 及 /etc/hosts.deny 兩個檔案呢？呵呵！基本上，他們兩個的關係為：
  1. 當檔案 /etc/hosts.allow 存在時，則先以此檔案內之設定為準；
  2. 而在 /etc/hosts.allow 沒有規定到的事項，將在 /etc/hosts.deny 當中繼續設定！
也就是說， /etc/hosts.allow 的設定優先於 /etc/hosts.deny 囉！瞭解了嗎？基本上，只要 hosts.allow 也就夠了，因為我們可以將 allow 與 deny 都寫在同一個檔案內，只是這樣一來似乎顯得有點雜亂無章，因此，通常我們都是：
  1. 允許進入的寫在 /etc/hosts.allow 當中；
  2. 不許進入的則寫在 /etc/hosts.deny 當中。
再強調一次，那個 service_name 『必需』跟你的 xinetd 或者是 /etc/rc.d/init.d/* 裡面的程式名稱要相同。好了，我們還是以 telnet 為例子來說明好了，現在假設一個比較安全的流程來設定，就是：
  1. 只允許 140.116.44.0/255.255.255.0 與 140.116.79.0/255.255.255.0 這兩個網域，及 140.116.141.99 這個主機可以進入我們的 telnet 伺服器；
  2. 此外，其他的 IP 全部都擋掉！
這樣則首先可以設定 /etc/hosts.allow 這個檔案成為：

[root @test root]# vi /etc/hosts.allo
telnetd: 140.116.44.0/255.255.255.0 : allow
telnetd: 140.116.79.0/255.255.255.0 : allow
telnetd: 140.116.141.99 : allow

再來，設定 /etc/hosts.deny 成為『全部都擋掉』的狀態：

[root @test root]# vi /etc/hosts.deny
telnetd: ALL : deny

那個 ALL 代表『全部』的意思！呵呵！很棒吧！那麼有沒有更安全的設定，例如，當當有其他人掃瞄我的 telnet port 時，我就將他的 IP 記住！以做為未來的查詢與認證之用！那麼你可以將 /etc/hosts.deny 這個檔案改成這個樣子：

[root @test root]# vi /etc/hosts.deny
telnetd: ALL : spawn (echo Security notice from host `/bin/hostname`; \
echo; /usr/sbin/safe_finger @%h ) | \
/bin/mail -s "%d-%h security" root & \
: twist ( /bin/echo -e "\n\nWARNING connection not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

在上面的例子中，黃色字體字『 root 』，可以寫成你的個人帳號或者其他 e-mail ，以免很少以 root 身份登入 Linux 主機時，容易造成不知道的情況，另外，最後幾行，亦即 :twist 之後的那幾行為同一行。如此一來，當未經允許的電腦嘗試登入你的主機時，對方的螢幕上就會顯示上面的最後一行，並且將他的 IP 寄到 root （或者是你自己的信箱）那裡去！（註：某些沒有安裝 tcp_wrappers 的套件之 distribution 中，由於沒有 safe_finger 等程式，所以無法執行相關的功能，這點還請多加注意呢！）
系統開啟的服務
好了，現在假設您已經知道了 daemons 的啟動檔案放置的目錄，也知道了服務與 port 的對應，那麼要如何查詢目前系統上面已經啟動了的服務呢？不要再打混了！已經學過了 ps 與 top 應該要會應用才對耶！呵呵！沒錯，可以使用 ps 與 top 來找尋已經啟動了的服務的程序與他的 PID 呢！不過，我們怎麼知道該服務啟動的 port 是哪一個？呵呵！好問題！可以直接使用 netstat 這個網路狀態觀察指令來檢查我們的 port 呢！甚至他也可以幫我們找到該 port 的程序呢( PID )！好了，那麼我們就來試看看這個指令的用法吧！
  • netstat

    [root @test /root]# netstat [-r] [-i interface]
    [root @test /root]# netstat [-antulp]
    參數說明：
    -r ：顯示出 route 的意思；
    -i ：顯示出 interface 的內容，跟 ifconfig 類似啦！
    -a ：顯示出目前所有的網路連線狀態！
    -n ：預設情況中，顯示出的 host 會以 host name 來顯現，若為 n 則可以使 port 與 host 都以數字顯示
    -t ：僅顯示 tcp 封包的連線行為
    -u ：僅顯示 udp 的封包連線狀態
    -l ：僅顯示 LISTEN 的內容
    -p ：同時顯示此一連線的 PID 喔！(注意：只有 root 才能行使此功能！)
    範例：
    [root @test /root]# netstat -r <==嘿嘿！顯示出目前的路由表！
    Kernel IP routing table
    Destination Gateway Genmask Flags MSS Window irtt Iface
    140.116.141.253 * 255.255.255.255 UH 40 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 40 0 0 eth0
    192.168.0.0 * 255.255.255.0 U 40 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 40 0 0 lo
    default 140.116.141.253 0.0.0.0 UG 40 0 0 ppp0

    [root @test /root]# netstat -i eth0 <==看看底下顯示出的內容，是否跟 ifconfig eth0 類似呀！？
    Kernel Interface table
    Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
    eth0 1500 077199373 0 0 169616342 0 0 0 BMRU
    lo 16436 0 1130485 0 0 0 1130485 0 0 0 LRU

    [root @test /root]# netstat -an <==顯示所有的連線狀態，並且以數字型態顯示
    [root @test /root]# netstat -tul<==顯示 LISTEN 的及 tcp 與 udp 的連線狀態，如下：
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:mysql *:* LISTEN
    tcp 0 0 *:netbios-ssn *:* LISTEN
    tcp 0 0 *:pop3 *:* LISTEN
    tcp 0 0 *:http *:* LISTEN
    tcp 0 0 *:ftp *:* LISTEN
    tcp 0 0 *:ssh *:* LISTEN
    tcp 0 0 *:smtp *:* LISTEN
    udp 0 0 *:netbios-ns *:*
    注意：上面的 LISTEN 表示該 port 是已經在 監聽 網路服務啦！而左邊的 tcp 指的是 tcp 封包！

    [root @test /root]# netstat -anp | more<==這個指令很常下達！請記得呦！

    netstat 可是很了不起的指令，一定要學會的！尤其他可以讓我們瞭解目前的你的主機的連線狀態！與開啟的 port 有哪些！所以一定得學會才行呀！如果你分別下達：

      netstat -a | more
      netstat -an | more

    一定會發現有點奇怪？怎麼有的 port 會以服務名稱(例如上面例子裡的 pop3 ...)有的會以 port 號碼來顯示呢！？嘿嘿！那就是 /etc/services 以及 -n 這個參數的用途啦！你可以發現的是，如果 netstat -a 時，顯示出來的 port 號碼在 /etc/services 存在對應的服務名稱的時候，那麼預設他就會顯示出該服務名稱啦！但是若在 /etc/services 找不到檔案的話，那麼自然就還是以 port 號碼來顯示的！那麼加上了 -n 參數後，不論如何，他都會以 port 及 IP 來顯示啦！

    另外，那個 -p 也很有用呦！尤其是在一些莫名其妙的連線出現時，可以用 netstat –anp | more查到 PID ，然後再以我們之前談到的 系統資源管理 部分，利用 kill 來殺掉該 PID 的程序！ 此外，使用 netstat –tlp 也可以得到目前在 LISTEN 的 port 的服務名稱，嘿嘿！那樣就可以知道該 port 是那個程序來啟動的！很便利ㄋㄟ?

    • Proto：指的是封包或者是通訊協定啦！ tcp , udp 是常見的呦！
    • Local Address：本地端的 IP 與 Port 號，如果 /etc/services 存在對應服務名稱，就以服務名稱顯示；
    • Foreign Address ：監聽哪一個地區與 port ；
    • state：狀態列就很多啦！基本的有：
      • LISTEN ：亦即監聽狀態中的 port ！
      • ESTABLISHED：已建立連線的連線情況
      • TIME_WAIT：該連線在目前已經是等待的狀態了！隨時有可能會斷線呦！

    善用 netstat 可以查得相當多的網路資訊！尤其在關閉本機的 port 時！假設我要將 ftp 關閉掉，那麼要使用 ntsysv, chkconfig 以及看一下 /etc/rc.d/rc.local 裡頭的設定囉！請注意，這個時候僅是將『開機預設啟動關閉』而已，並沒有實際關閉目前的服務，假設您發現 ftp 還在啟動的項目，你要將他關閉，那麼就必須：
    1. 使用 ntsysv 或 chkconfig 將 wu-ftpd 前面的符號關閉掉；
    2. 跳出之後，以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 來重新啟動 xinet 這個服務；
    3. 再以 netstat -a | more 看一下 ftp 是否還在 LISTEN 呢？

    這樣才能關閉呢！同理可證囉！要關閉 sshd 怎麼關？！嘿嘿！自己測試看看囉！(注意：事實上，在 Linux 系統中，要『開或關某個 port 』，就是需要『啟動或關閉某個服務』啦！因此，你可以找出某個 port 對應的服務，程式對應的服務，進而啟動或關閉他，那麼那個經由該服務而啟動的 port ，自然就會關掉了！)
各個服務的簡單說明
底下是一些 linux 系統上面常見的 daemons ，大家可以參考看看呦！
服務名稱
  • 參數檔
  • 預設使用 port 號
  • 說明
  • 是否需要執行
    • anacron
  • /etc/anacrontab
  • 沒有使用 port 號
  • 當你的 Linux 主機並不是全天候開機的時候，這個 anacron 就可以幫你執行在『 crontab 』既定的時間內沒有執行的工作！舉個例子來說，當你的主機在晚上 12:00 會自動關閉，但是偏偏 crontab 這個例行性工作是在 4:00 工作，這個時候例行性工作不是都沒有做到嗎？嗯！ anacron 就可以使用啦！
  • 如果主機已經 24 小時開機，而且執行了 cron ，那麼這個程式就不需要啟動了。
    • apmd
    • /etc/sysconfig/apmd
    • 沒有使用 port 號
    • apmd 是 Adventage Power Management daemon 的縮寫，顧名思義，可以用來瞭解系統的『電池電量』，如果對於手提式電腦才有需要吧我想！
    • 基本上，我們使用的桌上型或者是一直開機的機型，大致上不需要使用此一 daemon。
    arpwatch
    • /etc/sysconfig/arpwatch
    • 沒有使用
    • 這是用來持續監測網路卡的『 Hardware IP (MAC) 與 Software IP (TCP/IP 那個 IP) 』對應的 daemon，還可以提供 e-mail 通知系統管理員呦！
    • 一般的主機不太需要這個 daemon 啦！
    atd
    • /etc/at.allow, /etc/at.deny
    • 沒有使用 port 號
    • 這個總該不陌生了吧！就是單一使用的例行性命令囉！如果忘記了！趕緊去查看一下！
    • 這個通常需要啟動啦！不過，如果你一般都是使用 cron ，那麼這個東西不啟動影響也不很大！
    autofs
    • /etc/rc.d/init.d/autofs
    • 沒有使用 port 號
    • 這個東西使用在自動掛載一些裝置的 daemon
    • 不需要開啟！
    xinet
    chargen
    chargen-udp
    • 這東西主要的 port 號是 19 號；
    • 主要的功能在於提供類似遠端打字的咚咚吧！我也不是很懂說....
    • 一般來說，不用啟動啦！
    crond
    • /etc/crontab
    • 沒有使用 port
    • 用來執行 例行性命令 的 daemon！
    • 務必啟動！
    xinet
    daytime
    daytime-udp
    • 這東西使用 13 port 號！
    • 用來作為 daytime 的服務（我也不清楚，請來信告知耶！）
    • 不用啟動
    xinet
    echo
    echo-udp
    • 使用 port 7
    • 不用啟動啦！
    xinet
    finger
    • /etc/xinetd.d/finger
    • port 79
    • 最大的功能就是讓遠端的使用者可以查看本地端的使用者資訊
    • 由於有安全上的顧慮，沒有必要的話，不要啟動！
    gpm
    • /etc/sysconfig/mouse
    • 沒有使用 port 號
    • 在文字模式裡面可以使用 mouse 來從事『複製、貼上、移動游標』等等的功能！
    • 沒必要的話，建議是『關閉』！
    httpd
    • /etc/httpd/conf/httpd.conf
    • 使用 80 port 以及(或) 443
    • 這個就是鼎鼎大名的 WWW 主機服務開啟的程式啦！
    • 看你的需求囉！有 WWW 則必須要啟動！
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    2002/07/10：第一次完成
    2003/02/11：重新編排與加入 FAQ
    2002/07/10 以來統計人數


認識與分析登錄檔
最近更新日期：2003/02/11
什麼是登錄檔、幹嘛要分析登錄檔
Linux 登錄檔的規劃： syslogd, 登錄檔的安全屬性設定, logrotate,
登錄檔分析： dmesg, last,
VBird 寫的 logfile.sh
本章習題練習
什麼是登錄檔、幹嘛要分析登錄檔
這部分是最容易被新手所忽略的，那就是詳細而確實的紀錄或者是備份系統的登錄檔。什麼是登錄檔呢？簡單的說，就是記錄系統活動記錄的幾個檔案，例如：何時、何地（來源 IP ）、何人（ login name ）、做了什麼動作，另外就是系統在什麼時候做了什麼樣的行為時，發生了什麼樣的事件等等，要知道的是，我們的 Linux 主機在背景之下，有相當多的 daemons 在工作著，那麼這些工作中的程序總是會有一些訊息顯示，這些顯示的訊息就是給記錄在登錄檔當中啦，也就是說，記錄這些系統的重要訊息，就是登錄檔所進行的紀錄工作的內容了。而由於這些記錄的工作內容對於系統的資訊太詳細了，若被取得將可能影響到系統的安全性，因此，通常這些登錄檔只有 root 可以進行視察的功能！
那麼為何要記錄與解析登錄檔呢？這是由於記錄檔有幾個重要的功能：
  • 解決系統的錯誤：這個對於系統管理員來說是很重要的資訊，例如：開機的過程當中偵測到的硬體訊息資料會記錄到記憶體當中，由於這些偵測的資訊可以提供我們瞭解硬體資訊，所以如果你的系統發生問題時，可以下達 dmesg 看看硬體的偵測有沒有發生錯誤呢！另外，如果系統資源被耗盡、核心活動發生錯誤等等事件發生的時候，則系統登錄檔亦會將錯誤的訊息記錄在登錄檔中（通常是 /var/log/messages ），這些都可以藉以取得錯誤發生時的資訊，並加以克服問題！！
  • 解決網路服務的問題：在安裝或設定新服務的套件時，最常使用到這個功能了！例如在安裝啟動 sendmail 時，如果 sendmail 無法提供服務的時候，那麼無法提供服務的問題則會被紀錄到登錄檔當中去，則只要分析登錄檔就可以瞭解問題點，並藉以解決問題啦！( 所以我們常說『天助自助者』是真的啦！察看(1)螢幕上面的錯誤訊息與(2)登錄檔的錯誤資訊，幾乎可以解決大部分的 Linux 問題！ )
  • 記錄登錄資訊：這個東西相當的重要！例如：有天您的 apache 這個 WWW 服務掛了，你怎麼知道何時掛掉的？而最後登入者是誰？！這都可以藉由分析 apache 的登錄檔來取得資訊；此外，萬一有一天您的系統被入侵，並且被利用來攻擊他人的主機，這個時候對方的主機查出是您的 Linux 在進行攻擊的行為，這個時候你要如何告知對方您的主機是由於被入侵所導致的問題，並且協助對方繼續往來源追查呢？！呵呵！此時登錄檔可是相當重要的呢！
因此，一個有經驗的主機管理員，會隨時隨地查閱一下自己的登錄檔，以隨時掌握系統的最新脈動！那麼見的幾個登錄檔有哪些呢？一般而言，有下面幾個：
  • /var/log/secure：記錄登入系統存取資料的檔案，例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中；
  • /var/log/wtmp：記錄登入者的訊息資料，由於本檔案已經被編碼過，所以必須使用 last 這個指令來取出檔案的內容；
  • /var/log/messages：這個檔案相當的重要，幾乎系統發生的錯誤訊息（或者是重要的資訊）都會記錄在這個檔案中；
  • /var/log/boot.log：記錄開機或者是一些服務啟動的時候，所顯示的啟動或關閉訊息；
  • /var/log/maillog 或 /var/log/mail/*：紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄；
  • /var/log/cron：這個是用來記錄 crontab 這個例行性服務的內容的！
  • /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log： 分別是幾個不同的網路服務的記錄檔啦！
好了，那麼記錄了這些登錄檔之後，我要做什麼分析呀！？基本上，一個好的系統管理員大概都知道『一部主機負責的服務最好能少盡量少』，這是什麼意思呢？也就是說，這部主機為郵件主機那麼就專門負責郵件工作，不要還搞 WWW 服務！這樣有幾個好處，除了系統的安全性較佳之外（因為開的 port 變少了！），記錄檔的解析也會比較簡單！因為我們的 /var/log/secure 記錄的登入者資訊就會比較有一致性！那麼我們就可以查詢一下每日登入的使用者帳號啦與錯誤訊息啦等等的！（當然囉，如果你的頻寬夠、經驗豐富的話，那麼一部主機上面安裝所有的網路服務也是可以的啦！）基本上，檢查/var/log/messages、/var/log/secure這些個檔案也就相當夠了！因為系統發生的錯誤或者是警告訊息通常都會寫入這個檔案中。

但是，如果我手邊有數十部主機怎麼辦？我要不要一部一部去察看 log file 呢？呵呵！那樣察看會死人ㄋㄟ?因此，我們底下也使用一個簡易的登錄檔來分析 Red Hat 或 Mandrake 這兩種 Linux distribution 的登錄檔吧！
Linux 登錄檔的規劃： syslogd, logrotate,
    在系統的登錄檔系統當中，大多以一支常駐程式來進行寫入這些訊息的這個工作，那就是 syslogd 這支程式啦！另外，由於登錄檔如果一直長大的話，那麼這些登錄檔的寫入動作將會很沒有效率，這是因為檔案太大時，ASCII 格式碼的資料檔案寫入比較麻煩的緣故！那麼怎麼進行登錄檔資料的備份工作呢？呵呵！那就使用 logrotate 吧！將資料進行輪轉( rotate )？什麼是輪轉？！（我ㄌㄟ台語不輪轉呦！？）其實也可以稱為輪替啦！基本上，就是將舊的 log 檔案更改名稱，然後建立一個空的 log 檔案，如此一來，新的 log 檔案將從零開始記錄，然後只要將舊的 log 檔案留下一陣子，嗯！那就可以達到將登錄檔『輪轉』的目的啦！此外，如果舊的紀錄（大概要保存幾個月吧！）保存了一段時間沒有問題，那麼就可以讓系統自動的將他砍掉，免得佔掉很多寶貴的硬碟空間說！（舉個例子來說，我的 WWW 網站一個月的登錄檔，所佔掉的硬碟空間大小，大概就有 1GB 這麼多....而且都是純文字檔....很可怕吧！）

    所以說，基本上，針對 log 檔案來設計的服務有這兩支：
    • syslogd：進行系統或者是網路服務的登錄檔記錄工作；
    • logrotate：將舊的資料更名，並且建立新的登錄檔，以保持登錄檔的『新鮮』，並視設定將最舊的登錄檔刪除。
    所以，接著下來我們來談一談怎麼樣規劃這兩支程式呢？！就由 syslogd 這支程式先談起吧！畢竟得先有登錄檔，才可以進行 logrotate 呀！您說是吧！？
    • syslogd：
      我們在Linux裡面預設就已經使用了syslogd這支程式來記錄系統的登入資料，不相信的話，你可以使用ps來查詢一下：

      [root @test root]# ps -aux|grep syslog
      root 782 0.0 0.8 1340 508 ? S Oct30 0:00 syslogd -m 0
      root 11044 0.0 1.1 2408 732 pts/1 S 00:03 0:00 grep syslog

      看到syslog這個服務名稱了吧？！呵呵！所以知道他已經在背景底下工作囉！syslog 這支程式可以提供『系統登入資訊記錄』及『Kernel錯誤或警示資訊記錄』等功能，此外，他還提供了『本地端與遠端電腦的登錄資訊記錄』功能，所以，可以將遠端的主機登入資訊同時記錄在本地端呢！很不錯的功能吧！！此外，目前正規使用的系統服務中，大都預設支援以 syslog 這一個服務來記錄他的登錄檔案資料，例如apache, samba, sendmail 等等。而通常syslog提供的記錄參數主要有：

      • 事件發生時間；
      • 主機名稱；
      • 啟動此事件的服務名稱（例如 httpd, samba...）
      • 訊息資料內容

      等等這些資訊，當然，這些資訊的詳細度是可以修改的，此外，這些資訊可以作為系統除錯之用呢！我們先來看一下/var/log/secure的內容顯示些什麼呢？

      [root @test root]# vi /var/log/secure
      Nov 4 16:28:35 test xinetd[7831]: START: telnet pid=7841 from=192.168.1.11
      Nov 4 16:28:35 test xinetd[7841]: FAIL: telnet address from=192.168.1.11
      Nov 4 23:41:17 test sshd[10803]: Accepted password for test from 192.168.1.11 port 3117 ssh2
      Nov 4 23:41:17 test sshd(pam_unix)[10805]: session opened for user test by (uid=500)
      Nov 4 23:41:29 test su(pam_unix)[10838]: authentication failure; logname=test uid=500 euid=0 tty= ruser=test rhost= user=root
      Nov 4 23:41:34 test su(pam_unix)[10839]: session opened for user root by test(uid=500)

      在上面的表格中，可以看到每筆記錄的主要內容是：

        <日期與時間><主機名稱><服務名稱><顯示訊息>

      以第一筆資料來看，<日期是 Nov 4 的 16:28:35 時候>，在<主機 test 當中>，<那個 xinetd 服務的內容有資料啦>，<該程序的 PID 為 7831，顯示的訊息，說的是telnet這個由xinetd啟動的服務有人登入，登入者的IP是192.168.1.11>，這樣夠詳細了吧！還有很多的資訊值得看的呢！尤其是/var/log/messages的內容。然後，不要忘記了，在最後一筆資料中，還記錄了可以使用su的使用者的uid為500，帳號名稱為test，那麼如果這個資料被人家奪走了，呵呵！未來外面的cracker將可能試圖以test這個帳號來猜測你的密碼，並加以破解，嗯！真的很重要吧！所以這些資料很多都不能外流呢！

      好了，再來看到我們要如何來設定 syslogd 呢？！剛剛說到 syslog 可以記錄我們系統中的幾乎所有的預設的系統工作，那麼萬一我的網路服務是自行設定的呢？！例如以 Tarball 安裝好的服務套件。OK！我們可以藉由修改 syslog 的參數檔來達到這個目的。那麼預設的 syslog 參數檔放在哪裡呢？！

      • /etc/syslog.conf

      其實預設的 syslogd 程式的參數檔案就是 /etc/syslog.conf 這個檔案內容啦！這個檔案的內容可以規定『什麼服務需要被記錄、該服務被紀錄的訊息等級如何？』。基本上，可以使用底下的句子語法來說明：
        服務名稱.訊息等級　　　存放或顯示地點
      • 服務名稱：例如 mail, http, news, cron, at 等等的服務名稱；

      • 訊息等級：總共分成下列幾種等級：
        • info ： 提示一些訊息資料；
        • notice ： 注意！需要比較留意的訊息；
        • waring 或 warn ： 警示的訊息，以上三個訊息都還是沒有錯誤的情況，雖然是需要留意，但是還沒有到錯誤的情況；
        • err 或 error ： 呀！錯誤訊息出現了！該要檢驗錯誤的問題發生原因了；
        • crit ： 臨界點了！再不處理可就傷腦筋了！
        • alert ： 錯誤訊息一再地警告警告！你將要完蛋了！
        • emerg 或 panic ： 阿！系統已經進入混亂的階段！真的是完蛋了∼∼
        • 特殊等級：例如 debug （顯示較多的資訊！）及 none （不要記錄該服務的內容！）等！

      • 存放或顯示地點：通常我們使用的都是記錄的檔案啦！但是也可以輸出到裝置呦！例如印表機之類的！
        • 檔案的絕對路徑：通常就是放在 /var/log 裡頭的檔案啦！
        • 印表機或其他：例如 /dev/lp0 這個印表機裝置
        • 使用者名稱：顯示給使用者囉！
        • 遠端主機：例如 @test.adsldns.org

      例題一：如果我要將我的mail相關的資料給他寫入/var/log/maillog當中，那麼在/etc/syslog.conf就要寫成：
      mail.info /var/log/maillog
      注意到上面喔，當我們的等級使用info時，那麼『任何大於info等級(含info這個等級)之上的訊息，都會被寫入到後面接的檔案之中！』這樣可以瞭解嗎？也就是說，我們可以將所有mail的登錄資訊都紀錄在/var/log/maillog裡面的意思啦！

      例題二：我要將新聞群組資料(news)及例行性命令的資訊(cron)都寫入到一個稱為/var/log/cronnews的檔案中，但是這兩個程序的警告訊息記錄在/var/log/cronnews.warn該如何設定我的檔案呢？很簡單啦！既然是兩個程序，那麼只好以分號來隔開了，此外，由於第二個指定檔案中，我只要記錄警告訊息，因此設定上需要指定『=』這個符號，所以就成為了：
      news.*;cron.* /var/log/cronnews
      news.=warn;cron.=warn /var/log/cronnews.warn
      上面那個『=』就是在指定等級的意思啦！由於指定了等級，因此，只有這個等級的訊息才會被紀錄在這個檔案裡面呢！

      例題三：我的messages這個檔案需要記錄所有的資訊，但是就是不想要記錄cron,mail及news的資訊，那麼應該怎麼寫才好？可以有兩種寫法，分別是：
      *.*;news,cron,mail.none /var/log/messages
      或
      *.*;news.none;cron.none;mail.none /var/log/messages
      使用『,』分隔時，那麼等級只要接在最後一個即可，如果是以『;』來分的話，那麼就需要將服務與等級都寫上去囉！這樣會設定了吧！

      瞭解語法之後，我們來看一看在尚未開啟網路服務的情況下，我們的 syslog 有哪些系統服務已經在紀錄了呢？！那就是瞧一瞧 /etc/syslog.conf 這個檔案的預設內容囉！（注意！如果需要將該行做為註解時，那麼就加上 # 符號就可以啦！）

      第一個例子：來自 Red Hat 7.x 版本的 syslog.conf 內容：
      #kern.* /dev/console
      # 只要是 kernel 產生的訊息，全部都送到 console 去！
      # 這個項目預設是關閉的！不過，只要您願意，可以開啟就是了！

      *.info;mail.none;authpriv.none;cron.none /var/log/messages
      # 在已知各服務的訊息中，不要記錄到這個檔案當中啦！
      # 例如 mail 我們已經預設要記錄在 /var/log/maillog （底下），
      # 所以自然不要在記錄到這個 /var/log/messages 檔案中啦！
      # 然後其他的訊息全部都記錄到 /var/log/messages 當中！
      # 所以這個檔案相當的重要！沒有被規定到的訊息都可以在這裡找到！

      authpriv.* /var/log/secure
      # 這個就是經過一些身份確認的行為之後，需要記錄身份的檔案啦！
      # 什麼是身份確認呢？例如 pop3 收信要輸入帳號與密碼、 ssh 與 telnet, ftp
      # 等等的服務需要輸入帳號與密碼，這些都會在 /var/log/secure 裡面記錄！
      # 他可也是相當重要的一個檔案呢！

      mail.* /var/log/maillog
      # 只要跟 mail 有關的（不論是 pop3 還是 sendmail ）都會被紀錄到這個檔案中！

      cron.* /var/log/cron
      # 還記得例行性命令那一章節嗎？！對啦！就是那個 crontab 的東西，
      # 那東西的服務程式名稱就是 cron 啦！執行 cron 的結果都記錄於此！

      *.emerg *
      任何時候發生的警告訊息都會顯示給線上的所有人！那個＊ 就是目前線上的所有人啦！

      uucp,news.crit /var/log/spooler
      # 記錄新聞錯誤高於 crit 的等級的資訊，寫入 spooler 當中！

      local7.* /var/log/boot.log
      # 將開機的當中的訊息給他寫入 /var/log/boot.log 這個檔案當中呦！

      第二個例子：來自 Mandrake 9.0 的 syslog.conf 內容！
      # 各種系統的訊息
      # 下面三行中，分別記錄的是：
      # 1. 第一行記錄的是有關『身份確認』的資訊，只要是有『登入』主機，即有
      # 『輸入帳號與密碼』的程序時，都記錄到 auth.log 裡面去了，這部份的記錄主要有：
      # xinet(telnet, ftp), ssh, su, postfix, pop3 等等
      # 2. 第二行則是除了身份記錄的資訊之外，其他的都需要記錄在/var/log/syslog當中！
      # 3. 第三行則是記錄了任何 user 執行的指令有呼叫系統功能所產生的某些訊息！
      auth,authpriv.* /var/log/auth.log
      *.*;auth,authpriv.none -/var/log/syslog
      user.* -/var/log/user.log

      # 這個部分則是在記錄任何資訊！其實跟上面的 /var/log/syslog 有點重複了！
      # 不過，底下這一行中，跟 mail, news, authpriv 有關的資訊都不會被紀錄。
      *.info;mail.none;;news.none;authpriv.none -/var/log/messages

      # 任何跟認證資訊有關的訊息都會被紀錄在 /var/log/secure 這個檔案當中，
      # 其實跟 /var/log/auth.log 也有點重複了！無論如何，多記錄幾份總是好的！
      Authpriv.* /var/log/secure

      # 任何跟郵件有關的資訊都會紀錄在底下！不過，還是分為三個等級來記錄，
      # 分別是所有、警告與錯誤訊息！因為如果是郵件主機的話，你的訊息會非常的雜亂，
      # 所以適時的將記錄檔的等級分開，將有助於瞭解你的主機主要資訊呢！
      mail.=debug;mail.=info;mail.=notice -/var/log/mail/info
      mail.=warn -/var/log/mail/warnings
      mail.err -/var/log/mail/errors

      # 這個部分則是在記錄關於一些例行性命令的設定之處！
      # 要曉得的是，由於很多的木馬程式都是使用 cron 在進行破壞的行為，
      # 所以適時的瞭解 cron 也是很重要的！
      cron.=debug;cron.=info;cron.=notice -/var/log/cron/info
      cron.=warn -/var/log/cron/warnings
      cron.err -/var/log/cron/errors

      # 這部份是記錄任何跟核心有關的資訊！例如我們在前一章提到的模組載入，
      # 由於那個是核心的功能，所以當執行模組載入時，核心就會有訊息顯示啦！
      kern.=debug;kern.=info;kern.=notice -/var/log/kernel/info
      kern.=warn -/var/log/kernel/warnings
      kern.err /var/log/kernel/errors

      # 這是關於印表機的資訊啦！
      lpr.=debug;lpr.=info;lpr.=notice -/var/log/lpr/info
      lpr.=warn -/var/log/lpr/warnings
      lpr.err -/var/log/lpr/errors

      # 這是新聞群組主機的資訊
      news.=debug;news.=info;news.=notice -/var/log/news/news.notice
      news.=crit -/var/log/news/news.crit
      news.=err -/var/log/news/news.err

      # 那麼這個就是關於所有服務紀錄的檔案囉！
      Daemon.=debug;daemon.=info;daemon.=notice -/var/log/daemons/info
      Daemon.=debug;daemon.=info;daemon.=notice -/var/log/daemons/info
      Daemon.=warn -/var/log/daemons/warnings
      Daemon.err -/var/log/daemons/errors

      # 將所有已經呈現『嚴重錯誤的訊息』隨即的發送給目前在主機上面的任何人！
      # 這有個好處了，如果主機萬一不幸有發生緊急事件時，那麼線上使用者可以立刻知道，
      # 如果能夠立即聯絡 root 的話，那麼主機的傷害將可減到最低！
      *.emerg *

      # 任何跟 Mandrake Linux 有關的設定工具，所顯示的資訊都會被紀錄在這個檔案中！
      Local1.* -/var/log/explanations

      大致上就是有這些功能啦！這樣一來，我們的一些不同的資訊就可以存在不同的檔案當中，可以方便我們來進行登入資料的解析呢！另外，這些檔案都相當的重要（例如什麼時候被誰登入進來主機啦！？），所以他們的權限大多是屬於 root 的可讀寫而已！這點非常需要小心而留意！（請注意，在系統的預設狀況中，所有的未知狀態的訊息幾乎都是寫入 /var/log/messages 這個檔案中，所以，如果系統有問題，請詳細的檢查一下這個 /var/log/messages 檔案吧！！）

      如果您有其他的需求，所以需要特殊的檔案來幫你記錄時，呵呵！別客氣，千萬給他記錄在/etc/syslog.conf當中，如此一來，您就可以重複的將許多的資訊記錄在不同的檔案當中，以方便您的管理呢！

    • 登錄檔的安全屬性設定
      好了，由上一個章節裡面我們知道了 syslog.conf 的設定，也知道了登錄檔內容的重要性了，所以，如果幻想你是一個很厲害的駭客，想利用他人的電腦幹壞事，然後又不想留下證據，你會怎麼作？對啦！就是離開的時候將屁股擦乾淨，將所有可能的訊息都給他抹煞掉，所以第一個動腦筋的地方就是登錄檔的清除工作啦∼哇！鳥哥教人家幹壞事…..喂！不要亂講話∼俺的意思是，如果改天你發現你的登錄檔不翼而非了，或者是發現你的登錄檔似乎不太對勁的時候，最常發現的就是網友常常會回報說，他的/var/log這個目錄『不見了！』不要笑！這是真的事情?請記得，『趕快清查你的系統！』

      傷腦筋呢！那麼有沒有辦法防止這樣的事情呢？有呀！拔掉網路線…..呵呵！別擔心，基本上，我們可以透過一個隱藏的屬性來設定你的登錄檔，成為『只可以增加資料，但是不能被刪除』的狀態，那麼或許可以達到些許的保護！不過，如果你的 root 帳號被破解了，那麼底下的設定還是無法保護的，因為你要記得『 root 是可以在系統上面進行任何事情的』，因此，請將你的 root 這個帳號的密碼設定的安全一些！千萬不要輕忽這個問題呢！好了，開始來設定一下基本的隱藏屬性吧！那就是在 檔案屬性 提過的 lsattr 與 chattr 這個東西啦！如果將一個檔案以 chattr 設定i這個屬性時，那麼該檔案連 root 都不能殺掉！而且也不能新增資料，嗯！真安全！但是，如此一來登錄檔的功能豈不是也就消失了？因為沒有辦法寫入呀！所以囉，我們要使用的是 a 這個屬性！你的登錄檔如果設定了這個屬性的話，那麼他將只能被增加，而不能被刪除！嗯！這個項目就非常的符合我們登錄檔的需求啦！因此，建議您可以這樣的增加你的登錄檔的隱藏屬性。

      [root @test root]# chattr +a /var/log/messages
      [root @test root]# lsattr /var/log/messages
      ----a--------- messages

      加入了這個屬性之後，你的/var/log/messages登錄檔從此就僅能被增加，而不能被刪除，直到root以chattr –a /var/log/messages取消這個a的參數之後，才能被刪除或移動喔！

      為了您的登錄檔資訊安全，強烈的建議您使用這個屬性！不過，在底下的logrotate當中，我們必需要將這個屬性去除之後，才能進行輪替喔！呵呵！接下來我們來看看如何進行登錄檔資料的輪替吧！
  • logrotate：
    好了！那麼我們已經將登錄資料寫入了記錄檔中了，也已經利用chattr設定了a這個屬性了，那麼該如何進行 log rotate 的工作呢！？這裡請特別留意的是， syslog 乃是利用 demand 的方式來啟動的，當有需求的時候立刻就會被執行的，但是 log rotate 卻是在規定的時間到了之後才來進行 log files 的 rotate 行為，所以這個 logrotate 程序都是掛在 cron 底下進行的呦！這一點請特別留意呦！好了，那麼 logrotate 這個程式的參數設定檔在哪裡呢？！呵呵！考慮兩個地方呦

    • /etc/logrotate.conf
    • /etc/logrotate.d

    注意囉！那個 logrotate.conf 才是主要的參數檔案，至於 logrotate.d 是一個目錄，裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行！另外，在/etc/logrotate.d裡面的檔案中，如果沒有規定到的一些細部設定，則以/etc/logrotate.conf這個檔案的規定來指定為預設值！好了，剛剛我們提到 log rotate 的主要功能就是將舊的登錄檔案移動成舊檔，並且重新建立一個新的空的檔案來記錄，他的執行結果有點類似底下的圖示：

    由上面的圖示我們可以清楚的知道，當第一次執行完rotate之後，原本的messages會變成messages.1而且會製造一個空的messages給系統來儲存登錄檔。而第二次執行之後，則messages.1會變成messages.2而messages會變成messages.1，又造成一個空的messages來儲存登錄檔！那麼如果我們僅設定保留三個登錄檔而已的話，那麼執行第四次時，則messages.3這個檔案就會被刪除，並由後面的較新的保存登錄檔所取代！基本的工作就是這樣啦！

    那麼多久進行一次 logrotate 的工作呢？嗯！這些都記錄在 logrotate.conf 裡面，我們來看一下預設的 logrotate 的內容吧！

    # 底下的設定是 logrotate 的預設設定值，如果個別的檔案設定了其他的參數，
    # 那麼將以個別的檔案設定為主，若該檔案沒有設定到的參數，
    # 則以這個檔案的內容為預設值！

    # 每個禮拜進行一次 rotate 的工作
    weekly

    # 保留幾個登錄檔呢？預設是保留四個！
    rotate 4

    # 是否建立新的登錄檔來記錄呢？因為我們要繼續記錄，所以當然是建立囉！
    create

    # rotate之後的登錄檔，要不要壓縮，通常是不要壓縮啦，
    # 但是如果你的系統很忙碌，表示你的登錄檔很龐大的時候，
    # 那麼最好就是給他壓縮一下比較不會佔空間！
    Compress

    # 將底下這個目錄中的所有檔案都讀進來執行 rotate 的工作！
    include /etc/logrotate.d

    # 至於登錄的資訊部分，有使用 last 來紀錄的登錄者資訊就是記錄在這個檔案中！
    # 底下就是 /var/log/wtmp 這個檔案的 rotate 情況，他的意思是：
    # 1. 每個月進行一次 log rotate 的工作；
    # 2. 將檔案的權限設定為 664 囉！
    # 3. 僅保存前一個月的 rotate 備份！這個可以改大一點，例如 5 ！保存五個月，以利追蹤
    /var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
    }

    # 底下這個檔案跟 /var/log/wtmp 類似！
    /var/log/lastlog {
    monthly
    rotate 1
    }

    由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄，所以，其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可，但是這樣一來這個檔案就實在是太複雜了，因此，獨立出來一個 RPM 套件就一個 rotate 的執行檔案，呵呵！似乎是比較合理的一個方法！上面的資訊是系統的預設rotate情況，不過，您可以自行的修改為自己喜歡的樣式，例如，如果您的系統的空間夠大，並且擔心除錯以及駭客的問題，那麼可以：

    • 將 rotate 4 改成 rotate 9 左右，以保存較多的備份檔案；
    • 大部分的登錄檔不需要 compress 囉！但是空間太小就需要 compress ！尤其是很佔硬碟空間的httpd更需要compress的！

    好了，上面我們大致介紹了 /var/log/wtmp 這個檔案的設定，但是還是不很詳細啦，所以底下我們以 /etc/logrotate.d/syslog 這個輪替 syslog 這個服務的檔案，來看看該如何設定他的rotate呢：

    /var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
            sharedscripts
            rotate 5
            weekly
            postrotate
            /usr/bin/killall -HUP syslogd #
            endscript
    }

    正確的 logrotate 的寫法中：

    • 將 log file 名稱（包含絕對路徑）寫在前面，可以使用空白字元分隔多個 log files ；
    • 用 { } 包括所有的設定；
    • 設定的項目與前面提到的相同，並且可加入 rotate 前 (pre) 與後 (post) 的一些特殊執行的指令！
      • prerotate：在啟動 logrotate 之前進行的指令，例如修改 log file 的屬性！！
      • postrotate：在做完 logrotate 之後啟動的指令，例如重新啟動（ kill -1 或 kill -HUP ）某個服務！
      • Prerotate與postrotate對於已經加上了特殊屬性的檔案處理上面，是相當重要的執行程序！

    由於我們已經將登錄檔的屬性設定了chattr +a，所以必需要在logrotate之前將這個屬性拿掉，並在logrotate之後，再將這個屬性加回去！所以囉，那個prerotate與postrotate就顯的相當的重要啦！假設我們僅針對/var/log裡面的幾個檔案設定屬性：

    • messages
    • secure
    • auth.log

    那麼應該如何修改上面顯示的內容呢？嗯！你可以這樣做：

    /var/log/auth.log /var/log/syslog /var/log/user.log /var/log/secure /var/log/messages /var/log/boot.log /var/log/mail/errors /var/log/mail/info /var/log/mail/warnings /var/log/cron/errors /var/log/cron/info /var/log/cron/warnings /var/log/kernel/errors /var/log/kernel/info /var/log/kernel/warnings /var/log/lpr/errors /var/log/lpr/info /var/log/lpr/warnings /var/log/news/news.err /var/log/news/news.notice /var/log/news/news.crit /var/log/daemons/errors /var/log/daemons/info /var/log/daemons/warnings /var/log/explanations {
            sharedscripts
            rotate 5
            weekly
            prerotate
                    /usr/bin/chattr -a /var/log/auth.log
                    /usr/bin/chattr -a /var/log/messages
                    /usr/bin/chattr -a /var/log/secure
            endscript
            postrotate
                    /usr/bin/killall -HUP syslogd
                    /usr/bin/chattr +a /var/log/auth.log
                    /usr/bin/chattr +a /var/log/messages
                    /usr/bin/chattr +a /var/log/secure
            endscript
    }

    看到否？就是先給他去掉 a 這個屬性，然後執行了之後，再給他加入這個屬性！請特別留意的是，那個 /usr/bin/killall –HUP syslogd 的意義，這一行的目的在於將系統的 syslogd 重新以其參數檔（ syslog.conf ）的資料讀入一次！也可以想成是 reload 的意思啦！由於我們建立了一個新的空的紀錄檔，如果不執行此一行來重新啟動服務的話，那麼記錄的時候將會發生錯誤呦！！(請回到資源管理的章節讀一下 kill 後面的 signal 的內容說明)！

    Logrotate的測試：
    好了，設定完成之後，我們來測試看看這樣的設定是否可行呢？給他執行底下的指令：

    [root @test root]# logrotate –f /etc/logrotate.conf
    [root @test root]# lsattr /var/log/auth.log /var/log/messages /var/log/secure
    ----a--------- /var/log/auth.log
    ----a--------- /var/log/messages
    ----a--------- /var/log/secure

    上面那個 -f 具有『強制執行』的意思，如果一切的設定都沒有問題的話，那麼理論上，您的 /var/log 這個目錄就會起變化囉！而且應該不會出現錯誤訊息才對！嘿嘿！這樣就 OK 了！很棒不是嗎？！

    好了，那麼預設的logrotate什麼時候執行呢？呵呵！不用擔心，系統已經幫我們設定好了！放在哪裡呢？

      /etc/cron.daily/logrotate

    注意看一下裡面的內容：

      /usr/sbin/logrotate /etc/logrotate.conf

    由於 logrotate 的工作已經加入 crontab 裡頭了！所以現在每天系統都會自動的給他查看 logrotate 囉！不用擔心的啦！！只是要注意一下那個 /var/log/messages 裡頭是否常常有：『Jun 23 04:02:00 test syslogd 1.4.1: restart.』這樣的字樣！？這說明的是 syslogd 重新啟動的時間啦（就是因為 /etc/logrotate.d/syslog 的設定之緣故！）

    例題：我的/var/log/messages只希望記錄一些相當重要的資訊，關於cron的內容已經在/var/log/cron裡面記錄了，所以我想將cron的資訊移除，那麼該怎麼修改我的syslog.conf的設定呢？
    答：
    基本上，你可以這樣設定啦！

    [root @test root]# vi /etc/syslog.conf

    修改 /var/log/messages 那一行，使成為底下的模樣就可以了！

    *.info;mail.none;;news.none;authpriv.none;cron.none -/var/log/messages

    [root @test root]# /etc/rc.d/init.d/syslog restart

    這樣就可以啦！簡單的很！

    例題：將 procmail 的 logfile （/var/log/procmail.log）加入 logrotate 當中！假設我們已經將 procmail 加入到 sendmail 的程式當中了，並且已經啟動他，這個時候，如果我想要每個月份執行一次 logrotate ，並且保留五個月份的登錄資料備份，應該怎麼作呢？
    答：
    使用 vi 建立一個檔案，檔名為 /etc/logrotate.d/procmail，這個檔案的內容為：
    # This file is creating by VBird 2002/06/18
    /var/log/procmail.log {
            monthly
            size=10M
            rotate 5
            nocompress
    }
    上面說的是：

    1. 若該登錄檔工作超過一個月；
    2. 或該登錄檔大小超過 10 MB；
    3. 保存五個備份檔案；
    4. 備份檔案不要壓縮！！

    然後儲存後離開，這樣一來，每個月就會自動的將登錄資料備份下來囉！不需要執行的啦！比較有趣的是那個 size 的參數！如果您的登錄檔老是很大的時候，可以考慮加入 size 這個參數說！他基本上有兩種單位，分別是『 k 與 M 』，請使用 man logrotate 來詳細查看一下用法囉！

登錄檔分析
    登錄檔的分析是很重要的！例如那個 last 可以讓你知道到底誰登錄進主機啦！但是並沒有 pop3 這個收信協定的登錄訊息！這個時候就需要考慮到 /var/log/secure 的紀錄啦！無論如何，系統最常使用的查閱登錄檔的指令分別有底下幾個：
  • dmesg
    [root @test /root]# dmesg
    在指令列模式直接輸入dmesg即可執行！由於系統在開機的過程當中尚未將硬碟 mount 上來，所以無法直接將資料直接給他讀到 log file 當中去，但是為了除錯上面的方便，所以在開機的過程當中的訊息還是要記錄下來，這個時候系統就將 ram 開了一個小區塊來儲存這個資料囉！這個開機記錄的檔案就是：『/proc/kmsg』啦！同時，預設的 RAM 的區塊容量在不同的版本中並不相同，目前的預設版本是 16KB 的大小呦

  • last
    [root @test /root]# last
    參數說明：
    -number ：number 為數字，如果您的登入訊息太多了，可以使用這個指令！
    範例：
    [test @test /root]# last -5
    test pts/0 192.168.1.2 Tue Apr 9 20:34 - 20:35 (00:01)
    test pts/0 192.168.1.2 Tue Apr 9 20:14 - 20:30 (00:15)
    test ftpd21546 192.168.1.2 Tue Apr 9 02:55 - 03:06 (00:10)
    test ftpd15813 192.168.1.2 Tue Apr 9 01:20 - 01:21 (00:00)
    test pts/0 192.168.1.2 Mon Apr 8 20:14 - 00:27 (04:13)
    wtmp begins Tue Apr 2 01:12:26 2002
    [root @test /root]# last -f /var/log/wtmp.1 <==叫出上個月的登入資料！
    那麼如果要叫出來上個月的登入資料呢？！可以使用上面的第二個範例！
VBird 寫的 logfile.sh
  • Mandrake 9.0
    雖然很多的套件都有他們的喜好的登錄分析資料檔案，但是總覺得不是很對自己的口味，所以呢，VBird就自己寫了一支程式來分析自己的登錄檔！目前這支程式已經被改成可以支援Mandrake 9.0了，而且已經打包成為RPM檔案，應該是很容易安裝啦！

    我的設計理念很簡單，就是單純分析我們常常使用的幾個服務：

    • SSH登入次數與登入者帳號與IP分析；
    • 使用su轉化成root的次數
    • 使用FTP登入主機的次數與登入者帳號與IP分析；
    • 使用POP3登入主機的次數與登入者帳號與IP分析；
    • 使用Postfix的狀態
    大概就是分析這機個資料，而分析的檔案為：
    • /var/log/auth.log
    • /var/log/mail/info, /var/log/mail/warnings, /var/log/mail/errors
    • /var/log/messages
    下載的網頁：
    • http://linux.vbird.org/download.html
    安裝的步驟很簡單的，就是直接以RPM的方式來安裝即可！容易的很?此外，這個程式預設會將分析的資料寄給root@localhost，所以，如果您想要讓這個程式的分析結果寄到其他的信箱去的話，那麼就需要手動的修改一下檔案，亦即是/usr/local/virus/logfile/logfile.sh這個檔案，修改那個email的變數，將他由原先的root改成你的e-mail address即可！
    祝大家都能很輕鬆的管理自己的主機喔！

  • Red Hat 7.X
    雖然 Red Hat 已經寫了一支很棒的程式來分析 log files ，但是我總覺得不是很合我的口味！！所以就直接以 awk 配合 cut 與一些相關的 command ，將我的幾個重要的 secure 的 log files 叫出來，重新分析一番！寫出了一個叫做 logfile.sh 的分析檔案！這個檔案主要分析的項目為：
    • /var/log/secure ：含 ssh 登入、ftp 登入、pop3 登入及 sendmail 登入等四大項目；
    • /var/log/messages：分析因錯誤登入而發生的錯誤訊息顯示；
    • /var/log/maillog ：分析是否可能被當作轉信站了？！檢查試圖使用我們主機的 IP ！
    安裝的步驟很簡單！不過請注意，我的這個檔案主要的環境是在 Red Hat 7.2 底下，而在 Red Hat 7.1 底下使用過也沒有任何問題！說說安裝的方法吧！
    • 先下載該檔案：
      logfile.sh
    • 建立一個目錄，名稱為 /usr/local/virus/logfile
      mkdir /usr/local/virus
      mkdir /usr/local/viurs/logfile
    • 將檔案 copy 到該目錄下，並且變更權限：
      cp /root/logfile.sh /usr/local/virus/logfile
      chmod 700 /usr/local/virus/logfile/logfile.sh
    • 設定這個檔案在每天的 11:57pm 執行一次！編輯 /etc/crontab 檔案！
      vi /etc/crontab
      57 23 * * * root /usr/local/virus/logfile/logfile.sh
    這樣子一來，每天的晚上 11:57 就會自動的執行這一個分析檔案，並且將資料寄給您（root），所以如果你不想將資料寄給 root 的話，請進入 logfile.sh 裡面，修改『email="root@localhost"』這一個項目，改成您要的 e-mail 就可以啦！祝使用愉快！

  • 網友回報動作：
    感謝網友文桐兄所提供的資訊，由於我們的程式使用的是 Wu-ftp 這支 ftp 的服務，所以針對 proftp 並沒有辦法成功的將之搞定！還好文桐兄已經幫大家搞定了！嗯！感謝他吧！！ ^_^如果您還有新的發現，歡迎提出來與我們分享呦！謝謝囉！以下將文桐兄寫的關於 proftp 的部分貼上來，如果您使用的是 proftp 的話，那麼請將底下的資料剪下之後，貼到 logfile.sh 當中，取代原先的 2.3 那一部份關於 ftp 的處理碼！
    # 2.3a FTP {for proftpd}
    echo "========================== " >> $logfile
    echo "3. 關於 FTP 登錄檔的登入次數統計" >> $logfile
    echo "帳號 來源位址 次數 "|awk '{printf("\%-15s \%-25s \%-4s\n", $1, $2, $3)}' >> $logfile
    echo "FTP登入次數: `cat $basedir/messageslog|grep "FTP session opened." | wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile
    # add login ip script
    cat $basedir/messageslog | grep "FTP session opened."|awk '{print $7}'|cut -d"[" -f2 | cut -d"]" -f1 >"$basedir/ftploginip"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
    END{ for( course in Number )
    printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/ftploginip|sort +2 -gr |awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile
    echo " " >> $logfile
    echo "FTP登入成功帳號" >> $logfile
    cat $basedir/messageslog | grep "(ftp) session opened for user" | awk '{print $11}' > "$basedir/messagesftp"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
    END{ for( course in Number )
    printf( "\%-41s \%3d\n", course, Number[course])}' $basedir/messagesftp|sort +2 -gr|awk '{printf("\%-41s \%3d\n", $1, $2)}'>>$logfile
    echo " " >> $logfile
    cat $basedir/messageslog|grep "Authentication failure." >$basedir/ftperr
    cat $basedir/messageslog|grep "no such user '" >>$basedir/ftperr
    echo "FTP錯誤登入次數:`cat $basedir/ftperr| wc -l`"|awk '{printf( "\%-41s \%3d\n", $1, $2)}' >> $logfile
    cat $basedir/ftperr|grep "failure."|awk '{print $7 " " $9}'|cut -d'[' -f2|cut -d':' -f1|awk '{print $2 " " $1}'|cut -d'M' -f2|cut -d']' -f1>"$basedir/ftpfail"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
    END{ for( course in Number )
    printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpfail|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile
    cat $basedir/ftperr|grep "no such user '"|awk '{print $7 " " $12}'|cut -d'[' -f2|awk '{print $2 " " $1}'|cut -d']' -f1>"$basedir/ftpxusr"
    /bin/awk '{ for( i=0; i<1; i++ ) Number[$i]++ };
    END{ for( course in Number )
    printf( "\%-15s \%3d\n", course, Number[course])}' $basedir/ftpxusr|sort +2 -gr|awk '{printf("\%-15s \%-25s \%3d\n", $1, $2, $3)}'>>$logfile
    echo " " >> $logfile
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/06/24：第一次完成
2003/02/11：重新編排與加入 FAQ
2002/06/24 以來統計人數


淺談備份策略
最近更新日期：2003/02/12
誰需要備份資料
哪些 Linux 資料具有備份的意義
選擇的備份裝置
備份的種類： 完整備份(full backup), 部分備份(Implement backup),
備份的工具選擇
VBird 的備份策略與 scripts：系統備份, 每日備份, 遠端備份,
本章習題練習
誰需要備份資料
前面我們提到了相當多的 Linux 系統基礎，這個時候我們再來談一談：『若您的系統由於不預期的傷害，導致系統發生錯誤，該如何修復？』這可是個相當大的問題呀！怎麼說呢？又什麼叫做『不預期的傷害？』好了，假如您的 Linux 系統上面某些Internet的服務套件是最新的！也意味著可能是『相對最安全的』，但是，這個世界目前是閒人相當的多的，你不知道什麼時候會有所謂的『駭客軟體』被提供出來，萬一你在 Internet 上面的服務套件被入侵，導致你的 Linux 系統全毀，這個時候怎麼辦？！『重新安裝就好啦！』或許您會這麼說，但是，像鳥哥管理的幾個網站的資料，尤其是 MySQL 資料庫的資料，這些都是彌足珍貴的經驗資料，萬一被損毀而就不回來的時候，不是很可惜嗎？這個還好哩，萬一您是某家銀行的話，呵呵！那麼資料的損毀可就不是能夠等閒視之的！！關係的可是數千甚至上萬人的身家財產！！這就是備份的重要性了！他可以最起碼的稍微保障我們的資料有另外一份 copy 的備援以達到『安全回復』的基本要求！

如果是針對個人資料的話，那麼在一般桌上型電腦中，最好用的備份軟體就是『Ghost』這一個遠近馳名的備份大師了！他可以很輕快的就將我們的整個 partition 搞定的非常的完美！在還原方面也是非常的快速且操作簡便！由於個人桌上型電腦所使用的資料量通常不大，所以當 ghost 完成之後，通常只要將資料燒錄到光碟片當中，大約只要一至兩片的光碟片也就綽綽有餘囉！那麼將光碟片保存好，這就是最簡易的資料備份模式囉！此外，由於個人的資料變動性不大，所以資料的備份頻率方面也不需要非常的頻繁！

但是，萬一您提供的是『Internet』上面服務的主機資訊呢？！怎麼辦？舉個例子來說，像是我們 TnLUG 同好領導者之一的『阿基』兄，他提供的 Internet 服務是 BBS ，您曉得嗎？ BBS 的資料量雖然不大，但是由於他的文件是天天在增加的，每天都有相當多的資訊流入，由於某些資訊都是屬於重要的人物之留言，這個時候，我們能夠讓機器死掉嗎？再提到最近VBird的討論區曾經掛點的問題，以及數週前 Study-Area 討論區掛點的問題，討論區一旦掛點的話，該資料庫內容如果損毀到無法救回來，嘿嘿！要曉得討論區可不是一個人的心血耶！有的時候（像 Study-Area 討論區）是一群熱心 Linux 的朋友們互相建立交流起來的資料流通網，如果死掉了，那麼不是讓這些熱血青年的熱情付之一炬了嗎？！所以囉，建立備份的策略是相當的重要的。

基本上，『電腦是一個相當不可靠的機器』這句話在大部分的時間內還是成立的！常常會聽到說『要電腦正常的工作，最重要的是要去拜拜！』嘿嘿！不要笑！這還是真的哩！尤其是在日前一些電腦周邊硬體的生產良率 ( 就是將硬體產生出來之後，經過測試，發現可正常工作的與不能正常工作的硬體總數之比值 ) 越來越差的情況之下，電腦的不穩定狀態實在是越來越嚴重了！舉個例子來說，我曾經同時買過同一廠牌的 IxM 30GB 硬碟三顆，回來之後經過一個星期，嘿嘿！掛掉了兩顆！其中一棵是有壞軌，另外一棵是『完全死掉』，拿去公司要求修理，結果呢？嗯！店家直接拿了一棵新的給我，害我嚇一跳，店家的工程師說『唉呀！目前這個牌子的良率太差了，所以代理商為了怕麻煩，都會直接拿新的替換給我們啦！』要曉得的是，當初那一棵完全死掉的硬碟，是我用來備份我的主機資料的....好在當時我將備份的資料放在三四的地方，還好....

所以囉！由於電腦 ( 尤其是目前的電腦，操作頻率太高、硬體良率太差、使用者操作習慣不良、『某些』作業系統的當機率太高.... ) 的穩定性較差，所以囉！備份的工作就越來越重要了！

那麼 Linux 在備份時考慮的因素有哪些呢？
  1. 備份哪些檔案：
    例如在帳號管理那一篇當中，我們知道最起碼主機的帳號資訊在/etc/*及/home/*等等檔案都是重要的！

  2. 選擇什麼備份的媒介：
    是可讀寫光碟、另一棵硬碟、同一顆硬碟的不同 partition、還是使用網路備援系統？哪一種的速度最快，最便宜，可將資料保存最久？

  3. 考慮備份的方式：
    是完全備份(類似 ghost)還是部分備份即可？

  4. 備份的頻率：
    例如 MySQL 資料庫是否天天備份、若完全備份，需要多久進行一次？

  5. 備份使用的工具為何：
    是 tar 還是 cpio 等等？
底下我們就來談一談這些問題的解決之道吧！ ^_^
哪些 Linux 資料具有備份的意義
具有備份意義的檔案通常可以粗分為兩大類，一類是系統一類則是類似網路服務的資料庫，那麼各有哪些檔案需要備份的呢？我們就來稍微分析一下。
  • 主機系統需要備份的檔案：
    這方面的檔案主要跟『帳號』有關係！主要有哪些帳號的檔案需要備份呢？就是 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的帳號等等，而由於 Linux 預設的主機資訊設定參數檔都在 /etc/ 底下，所以只要將這個檔案備份下來的話，那麼幾乎所有的設定檔都會存在的！而由於 /home 底下是每個人的家目錄，自然也需要來備份一番！再來，由於使用者會有郵件吧！所以呢，這個 /var/spool/mail 內容也需要備份呦！另外，由於如果您曾經自行更動過核心，那麼 /boot 裡頭的資訊也就很重要囉！所以囉，這方面的資料您必須要備份的檔案為：
    • /etc/ 整個目錄
    • /home 整個目錄
    • /var/spool/mail
    • /boot
    • /root
    • 如果您自行安裝過其他的套件，那麼 /usr/local/ 也最好備份一下！
  • 網路服務的資料庫方面：
    這部份的資料可就多而且複雜了，如果您的網路套件設定都是以原廠提供的為主，那麼您的設定檔案大多是在 /etc 底下，所以這個就沒啥大問題了！但是若您的套件大多來自於自行的安裝，那麼 /usr/local 這個目錄可就相當的重要了！這裡我們假設我們提供的服務套件都是使用原廠的 RPM 安裝的！所以要備份的資料檔案有：
    • 資料設定檔案：
      /etc/ 整個目錄
      /usr/local/ 整個目錄
    • 系統 www + MySQL：
      /var/www 整個目錄 ( 系統的家目錄 )
      /var/lib/mysql 整個目錄
    • 其他你在 Linux 主機上面提供的資料庫資料檔案！
  • 推薦需要備份的目錄：
    由上面的介紹來看的話，那麼如果您的硬體或者是由於經費的關係而無法全部的資料都予以備份時， VBird 建議您至少需要備份這些目錄呦！
    • /boot
    • /etc
    • /home
    • /root
    • /usr/local
    • /var(註：這個目錄當中有些暫存目錄則可以不備份！)
  • 不需要備份的目錄：
    有些資料是不需要備份的啦！例如我們在 檔案與目錄系統 裡頭提到的 /proc 這個目錄是在記錄目前系統上面正在跑的程序 ( processes ) ，這個資料根本就不需要記錄的呢！所以就把他拿掉！此外，外掛的機器，例如 /mnt 裡面都是掛載了其他的硬碟裝置、光碟機、軟碟機等等，這些也不需要備份吧！？所以囉！底下有些目錄可以不需要備份啦！
    • /dev ：這個隨便你要不要備份
    • /proc：這個真的不需要備份啦！
    • /mnt ：如果你沒有在這個目錄內放置你自己系統的東西，也不需要備份
    • /tmp ：幹嘛存暫存檔！不需要備份！
選擇的備份裝置
在備份的時候，選擇一個『資料存放的地方』也是很需要考慮的一個因素！什麼叫做資料存放的地方呢？講個最簡單的例子好了，我們知道說，較為大型的機器都會使用 tap 這一種磁帶機來備份資料，而如果是一般個人電腦的話，很可能是使用類似 Mo 這一種可讀寫式光碟片來存取資料！但是您不要忘記了幾個重要的因素，那就是萬一您的 Linux 主機被偷了呢？這不是不可能的，我們隔壁校區的研究室曾經遭小偷，裡面所有的電腦都被偷走了！包括『 Mo 片』，當他們發現的時候，一開始以為是硬體被偷走了，還好，他們都有習慣進行備份，但是很不幸的，這一次連『備份的 MO 都被拿走了！』怎麼辦？！只能道德勸說小偷先生能夠良心發現的將硬碟拿回來囉！唉∼真慘....
這個時候，所謂的『遠端備援系統』就顯的相當的重要了！什麼是遠端備援呀！說的太文言了！呵！簡單的說，就是將你的系統資料『備份』到其他的地方去，例如說我的機器在台南，但是我還有另一部機器在高雄老家，這樣的話，我可以將台南機器上面重要的資料都給他定期的自動的 ftp 回去！也可以將家裡重要的資料給他丟到台南來！這樣的最大優點是可以在台南的機器死掉的時候，即使是遭小偷，也可以有一個『萬一』的備份所在！但是缺點是∼∼頻寬嚴重的不足！在這種狀態下，所能採取的策略大概就是『僅將最重要的資料給他 ftp 回去囉！』至於一些只要系統從新安裝就可以回覆的咚咚！那就沒有這個必要了！當然囉，如果你的網路是屬於 T1 專線的話，那麼完整備份將資料丟到另一地去，呵呵！也是很可行的啦！只是我沒有那麼好命....唉∼窮學生一個∼
在此同時，我們再來談一談，那麼除了這個『相對較為安全的備份』方法之外，畢竟這種網路備援系統實在是太耗頻寬了！如果像我們一般家用的 ADSL 根本就是吃不消！那麼怎麼辦！還有其他的方法嗎？喔∼那就只好使用近端的裝置來備份囉！這也是目前我們最常見到的備份方法！例如一般我們使用的 Tap, Mo, Zip, CD-RW, 還有備份用抽取式硬碟等等！那麼在選擇上需要注意些什麼呢？需要注意的地方有幾點：
  • 速度要求：『備份』基本上在 Linux 主機上面也是蠻耗系統資源的！因為需要將系統的資料拷貝到其他裝置上面去，這個時候 CPU 幾乎是 loading 100%！您總不希望系統就這樣給他掛點吧！？此外，有些系統的資料實在太多咯，怎麼樣也備份不完！所以囉，越快的儲存裝置是越好的！如果您是個重視速度甚於一切的人，那麼我覺得抽取式硬碟是個不錯的方式，只不過.....目前我知道的抽取式硬碟都需要冷開機才行，不太符合 Linux 主機 24 小時全年無修的狀態....所以，近年來速度越來越快的 MO, CD-RW 就變的很方便囉！至於 tap ，在速度上完全是落後的.....至於使用第二顆硬碟備份，類似 Raid, 或者是安裝一顆備份的硬碟在 Linux 系統當中，這個方案也很好，而且速度上絕對是最具優勢的！但是就如同我們剛剛提到的，萬一你的機器被偷了，連帶的，這顆備份的硬碟自然也就不見了.....
  • 儲存容量：這也是一個需要考量的因素！而且常常是最大考量的因素呢！雖然目前硬碟越來越便宜（前兩天 2002/07/01 去網路上看一下價格，下一跳， 80GB 的硬碟已經不到 4000 就有了！天那.....），但是畢竟就如同前面說的，抽取式硬碟需要將系統冷開機，而建構在系統內的硬碟又同時具由不安全的成分在，這個時候一個大容量的替代方案就顯的很重要了！雖然 CD-RW 與 MO 可以提供不錯的速度，但是其容量畢竟不足（目前 MO 最大大約可到 1.3G ），所以說，具有大容量的 tap （磁帶容量最小的一款也可以到達 8 GB 左右！）就相當的具有這方面的優勢了！而且攜帶方便，存放也容易！更可以帶著走∼∼
  • 經費與資料可靠性：在經費不短缺的情況下，我們當然會建議您上面的幾個裝置都買一買，然後分別在不同的時間進行不同的備份作業（底下我們有些建議的啦！ ^_^）！但是如果經費也是需要考量的話，那麼磁帶機這個目前還算貴重的物品可能暫時還動不到！這個時候近來漸漸便宜的 CD-RW 就顯的活躍的多了！而且光碟片也可以保存很久的ㄋㄟ∼當然，目前應該不會有人以軟碟來備份了吧！？呵呵！軟碟可是相當不安全的（每次我看到有人拿軟碟拷貝資料，我都會要他 copy 完成之後，立刻到另外一部電腦 copy 出來試看看，果不其然，十次裡面有八次對方的軟碟片都有問題∼）
無論如何，如果經費夠的話， Tap 備份資料真的是一個不錯的點子！因為他的高容量讓我好滿意！再來，如果經費稍微短缺的話，那麼 CD-RW 經常性的將資料燒錄下來，這也是蠻好的，尤其 CD 片又不佔空間！再來，如果還是沒有辦法，那麼一顆內建在 Linux 的硬碟用來備份也是不錯的！什麼！！連備份的硬碟都沒有，唉！怎麼跟我一樣∼這個時候沒辦法啦，用原來的安裝系統的硬碟，多留一個 partition 用來當作備份之用吧（這也是目前我常用的方法之一！）
一些裝置的檔案代號：
  • 光碟機： /dev/cdrom
  • 磁帶機： /dev/st0 ( SCSI 介面 ), /dev/ht0 ( IDE 介面 )
  • 軟碟機： /dev/fd0, /dev/fd1
  • 硬碟機： /dev/hd[a-d][1-16] ( IDE 介面 ), /dev/sd[a-p][1-16] ( SCSI 介面 )
  • 印表機： /dev/lp[0-2]
    特別留意的是磁帶機呦！如果你有錢的話，那麼買一部磁帶機是相當不錯的建議！沒錢的話，買 IDE 介面的硬碟也很不錯！！ ^_^
備份的種類
    講了好多口水了，還是沒有講到重點，真是的....好了，再來提到那個備份的種類，其實前面已經提到一些了！基本上，備份就可以直接分為『完全備份』與『部分備份』這兩方面：
  • 完全備份(Full Backup)：
    完全備份就是將根目錄『 / 』裡頭所有的資料都給他一股腦兒的備份下來，不過，這個時候所需要的『時間與備份裝置的容量』就顯的相當的重要了！用在大型的企業是有一定的需求的，但是像我們這一種小網站的話，完整的備份似乎太過於浪費的（畢竟我們可以用時間換取金錢....了不起又重新安裝了....）。但是剛剛完成的系統（還沒有對外 Internet 上面服務）通常可以的話，就趕快給他備份一下吧！這樣的一個備份是最乾淨的！用在系統的最乾淨還原是相當有幫助的！這是因為有的時候我們的系統被入侵了，但是 root 並不知道，這個時候老是拿最近的備份資料來還原也沒有用呀！因為連同被 cracker 修改過的檔案也被我們備份下來了呀！呵呵！所以囉，將一個最原始的系統的資料備份下來還是有其必要性的！此外，這種完整備份的頻率可不能太高，因為太耗系統資源了！
  • 部分備份(Implement backup)
    部分備份就如同上面提過的，備份那些最重要的資料就好了！反正系統不見的話，只要重新安裝就回來了，資料只要妥善的備份重點資料，那麼系統的復原還是一個很快速的工作！以我為例，我通常都喜歡僅備份最重要的資訊，因為重新安裝一次系統時間花的並不長（一個鐘頭內一定可以搞定！）而帳號、服務設定、原本系統的資料庫、等等，幾乎都只要 copy 回來就 OK 了！例如：我們這個網站在開始營運初期，雖然交通流量很大了，還是常出狀況，那個時候重新安裝了好幾次（似乎是硬體的問題！），每次都是一個下午就搞定了！所以囉，我是一直認為『重點備份』就真的是蠻重要的！尤其很多時候，你的資料被吃掉都只是『某個網路服務』，那麼如果僅進行完整備份的工作時，呵呵！單單是將系統先讀出來，再取出所要還原的部分，呵呵！就可以累死你了....
如同上面提到的，這兩個方式各有優缺點啦！那麼如果可能的話，是否兩個都來進行一下最好呢？呵呵！答對了！給你拍拍手！我們通常的規劃就是這樣，重點部分的備份頻率較高，可能每天都需要備份的！至於如果是完整備份的話，那麼一個星期、甚至一個月在備份一次都可以！目前我的系統上面就是每天備份 MySQL 資料庫，然後每個星期備份所有的重要資料！
備份的工具選擇
好了，選定了備份的裝置與備份的頻率之後，那麼我要使用什麼方式來備份呀！呵呵！這個也要跟備份的種類相互配合呢！通常我在備份的時候，除非有磁帶機或者有特殊的功用，否則通常我只使用 tar 啦！但是這裡我們介紹一下 cpio 這個東西！如果你有磁帶機的話， cpio 可是相當好用的一個指令呢！ ^_^ ，呵呵！由於這兩個指令我們早在『壓縮工具』當中稍微提過了，請再自行過去瞧一瞧去囉！另外，您或許會問道：『那麼我為什麼不直接給他 copy 過去備份的地點就好了呢！？』呵呵！既然可以在 copy 的過程裡面增加壓縮的功能來減低整個儲存空間的消耗，為何不壓縮？！那當然還是壓縮一下比較好囉！所以啊！我還是比較喜歡 tar, cpio 的啦！
完整備份的工具：
在完整備份的工具裡面，三個工具 tar, cpio 與 dump 都很常被使用！但是我沒有使用過 dump ，所以這裡就不談他！至於 cpio 的話，他最大的好處就是『 cpio 連一般的裝置檔都可以 copy 過來！』很棒吧！所以使用 cpio 進行完整備份是很棒的一個選擇。不過需要注意的是，由於 cpio 需要配合 find 才可以正常的動作！這裡請特別留意囉！另外，使用 cpio 常常配合另一顆完全用來備份的硬碟或者是磁帶機才好！至於完整的指令用法請到『壓縮工具』 那一篇去查看囉！備份與反備份分別可以這樣使用：
1. 使用 cpio 來備份與反備份
[root @test /root]# find / -print | cpio -covB > /dev/st0 <==備份至 tap
[root @test /root]# cpio -iduv < /dev/st0 　　　　　　　　<==由 tap 將資料存回系統中！

2. 使用 tar 來備份
[root @test /root]# tar -zcvfP host.tar.gz / --exclude /proc --exclude /mnt --exclude /tmp
[root @test /root]# tar -zxvf host.tar.gz

這兩個工具都蠻好用的！尤其我特喜歡 tar 的用途！因為他相當的適合於另一顆硬碟的備份呢！

部分備份的基礎工具：
至於部分備份方面，我們就以簡單的 tar 來說明一下吧！！假如我們需要備份的資料是每天的 MySQL 資料庫時，由於我想讓每天的資料都存成不同的檔案，而要分別檔案的新舊又以日期來分別最簡單了！所以我就可以這樣做：
[root @test /root]# tar -zcvf mysql.`date +%Y-%m-%d`.tar.gz /var/lib/mysql
如果忘記了上面的指令代表什麼意思，那麼請回到 bash 那一章去瞧一瞧吧！

[root @test /root]# tar -N '2002/07/05' -zcvf home.tar.gz /home
只有在比 2002/07/05 還要新的檔案，在 /home 底下的檔案才會被打包進 home.tar.gz 中！

這樣就能將 mysql 的資料庫壓縮備份至 mysql.2002-07-06.tar.gz 這個檔案，並且日期會每天都不一樣！呵呵！這樣一來如果系統的資料庫出了問題，就可以馬上的回復了！而且還有很多的檔案可供回復呢！不錯吧！此外，也可以利用類似上面的第二個範例的例子，將最新的資料備份就好，其他的資料則不予以更動！嘿嘿！提供了更完善的方式呢！

大致的工具就是這樣了！此外，由於備份是長長久久的事業，所以我們需要的是『系統可以自己動作』的方式，您說是吧！所以呢，這個時候就需要使用到 cron 的服務啦！還記得我們先前講過的 例行性命令的建立 嗎？趕快在去複習一下呀！
VBird 的備份策略
其實我在備份的策略相當的簡單，我並沒有想要將整個系統完全的備份下來，因為太耗時間了！而且就我的立場而言，似乎也沒有這個必要，所以通常我只備份較為重要的檔案而已！不過，由於我需要備份 /home 與網頁資料，如果天天都備份，我想，系統遲早會受不了，所以我就將我的備份分為兩大部分，一個是每週備份，一個則是每日備份，備份的時間點都選擇在凌晨的 3~4 點左右！這個時候我就寫了兩個簡單的 scripts ，分別來儲存我的資料：
  1. 使用一顆加掛的硬碟來進行備份的功能，掛在 /disk2 當中；
  2. 每週進行的備份有 /home, /var, /etc, /boot, /usr/local 等目錄；
  3. 每日進行的目前僅有 MySQL 資料庫；
  4. 利用 /etc/crontab 來自動提供備份的功能；
  5. 在每週或每月定期的將資料分別 (a)燒錄到光碟上面 (b)使用網路傳輸到另一部機器上面。
  • 日常備份行為：
    底下提供我的備份的 scripts ，希望對大家有點幫助！

    [root @test /root]# vi backupweekly.sh
    #!/bin/bash
    # This file will backup
    # 1. username (in /etc, passwd, shadow, group, gshadow, aliases,
    # aerosol510.mail, and /var/spool/mail, total 7 files)
    # 2. httpd (in /etc/httpd/conf, httpd.conf and /var/www/html
    # /home/vbird will be tared !)
    # 3. smb (in /etc/samba/*, all files will be copied!)
    # 4. The safe and driver files
    # /etc files
    # /var/lib/mysql
    #
    # ===========================================================================
    # History
    # Make by VBird 2000/12/16 first time!
    # ============================================================================

    #
          建立備份的路徑！這樣的好處是可以清楚的知道每個檔案放置的地點！
usernamep=/disk2/backup/username
httpdp=/disk2/backup/httpd
smbp=/disk2/backup/smb
otherp=/disk2/backup/others
netpara=/disk2/backup/network
ftpp=/disk2/backup/ftp

    #1. username, sendmail and their home directories and local setting
    cp /etc/passwd $usernamep
    cp /etc/shadow $usernamep
    cp /etc/group $usernamep
    cp /etc/gshadow $usernamep
    cp /etc/aliases $usernamep
    tar -zcf $usernamep/mail.tar.gz /var/spool/mail
    tar -zcf $usernamep/home.tar.gz /home
    tar -zcf $usernamep/usr.local.tar.gz /usr/local

    #2. httpd and mysql and counter data
    cp /etc/httpd/conf/httpd.conf $httpdp
    tar -zcf $httpdp/webcgi.tar.gz /var/www
    tar -zcf $httpdp/counter.tar.gz /usr/local/Counter/data
    /etc/rc.d/init.d/mysqld stop
    tar -zcf $httpdp/mysql.lib.tar.gz /var/lib/mysql
    /etc/rc.d/init.d/myslqd start

    #3. smb
    cp /etc/samba/lmhosts $smbp
    cp /etc/samba/MACHINE.SID $smbp
    cp /etc/samba/smb.conf $smbp
    cp /etc/samba/smbpasswd $smbp
    cp /etc/samba/smbusers $smbp

    #4. safe and drivers
    tar -zcf $otherp/etc.tar.gz /etc
    tar -zcf $otherp/mrtg.cfg.tar.gz /usr/local/mrtg-2/bin
    tar -zcf $otherp/virus.tar.gz /usr/local/virus
    cp /etc/cron.weekly/backup /$otherp

    #5. network parameters
    cp /etc/hosts $netpara
    cp /etc/hosts.allow $netpara
    cp /etc/hosts.deny $netpara
    cp /etc/sysconfig/network $netpara
    cp /etc/modules.conf $netpara
    cp /etc/sysconfig/network-scripts/ifcfg-eth0 $netpara

    #6. ftp services
    cp /etc/ftp* $ftpp

    當然囉，上面的 script 是適合我的狀態，所以，你要使用的話，還得要修修改改呦！不要照著使用，會有問題的！
  • 每日備份資料 scripts：
    再來，繼續提供一下每日備份的資料：

    [root @test /root]# vi backupdaily.sh
    #!/bin/bash
    #
    # This program is created by VBird 2002/06/13
    #
    # What is this program?
    # This program will backup the following messages:
    # 1. MySQL data files ( /var/lib/mysql );
    # 2. HTTP's CGI-directory ( /var/www/cgi-bin )
    #
    # HOW TO RUN THIS PROGRAM?
    # Just put the file into /etc/crontab job,
    # or put this file's link file to /etc/cron.daily!
    #
    ###############################################################
    # History
    # Date What Who
    #==============================================================
    # 2002/06/13 First time to run this program
    # The only backup files are MySQL and CGI VBird
    #==============================================================
    # 0. Get the date messages and backup directory
    day=`date +%Y-%m-%d`
    basedir="/disk2/backup/daily"

    # 1. MySQL ( PATH = /var/lib/mysql )
    /etc/rc.d/init.d/mysqld stop
    cd /var/lib
    tar -zcf "$basedir"/mysql."$day".tar.gz mysql 2> /dev/null
    /etc/rc.d/init.d/mysqld start

    # 2. CGI ( PATH = /var/www/cgi-bin )
    cd /var/www
    tar -zcf "$basedir"/cgi-bin."$day".tar.gz cgi-bin 2> /dev/null

    好啦！這樣一來每天的 MySQL 資料庫就可以自動的被記錄在 /disk2/backup/daily 裡頭啦！而且還是檔案名稱會自動的改變的呦！呵呵！我很喜歡！OK！再來就是開始讓系統自己跑啦！怎麼跑？！就是 /etc/crontab 呀！提供一下我的相關設定呦！感謝網友 duncanlo 兄提供的好主意！在備份之前將 MySQL 資料庫的服務先 stop ，這樣一來在線上備份的時候會比較 OK ！！

    [root @test /root]# vi /etc/crontab
    # 加入這兩行即可 ( 請注意您的檔案目錄！不要照抄呦！ )
    # backup scripts
    30 3 * * 0 root /etc/root/backupweekly.sh
    30 2 * * * root /etc/root/backupdaily.sh

    這樣系統就會自動的在每天的 2:30 進行 MySQL 的備份，而在每個星期日的 3:30 進行重要檔案的備份！呵呵！您說，是不是很容易呢！？但是請千萬記得呦！還要將 /disk2 當中的資料 copy 出來才行耶！否則整部系統死掉的時候....那可不是鬧著玩的！

  • 遠端備援系統：
    除此之外，那麼還有沒有保險的方式呢？呵呵！剛剛前面不是提過遠端備援嗎？最簡單的說法就是『使用網際網路的方法，將你的資料送到遠端主機去備份！』那樣就 OK 啦！那麼我們怎麼使用遠端備份的方法呢？那就用最簡易的 FTP 吧！不過，在此之前，你必需要瞭解的是：

    1. 備份的資料最好『越精簡越好』；
    2. 遠端主機必需提供 FTP 服務(當然，其他的服務例如 sftp 也是可以的，只要能夠將資料傳上去就好了！)
    3. 遠端主機必需要可以符合你上傳的屬性設定，例如 quota 容量、儲存目錄的屬性等等！

    好了，那麼我們就用最簡單的自動FTP scripts來幫我們達成自動檔案上傳的功能吧！

    #!/bin/bash
    #
    # WHAT IS THIS:
    # This program will automatically put the backup file
    # from this host to another hosts
    #
    # HISTORY
    # When Who What
    # 2002/10/14 VBird First time to release
    #
    ###################################################################
    # 1. input your FTP's ID and PassWord
    host="192.168.1.100"
    id="testing"
    pw='your.passwd'

    # 2. what is the correct and remote working directory
    basedir="/disk2/backup" # 本機上面的欲上傳檔案路徑
    remodir="/disk2/backup_testinghost" # 遠端主機欲備份的目錄

    # 3. the tar file
    filename="backup.testinghost.tar"

    # 4. starting tar work
    # 因為我將所有預備被傳送的資料都分門別類的放置在 /disk2/backup 這個目錄中，
    # 但是FTP傳送檔案的時候，畢竟一個檔案送完會比較容易與快速，
    # 所以我先將好幾個檔案 tar 成一個！
    cd $basedir
    tar -cvf $filename *

    ###################################################################
    # 5. 底下就是 ftp 自動連線並操作上傳手續的 script ！
    ftp -n "$host" > "$basedir"/"$filename".log 2> "$basedir"/"$filename".log <<EOC
    user $id $pw
    binary
    cd $remodir
    put $filename
    bye
    EOC

    # 6. End of this file
    # Please remenber, change permission of this file!
    # Because there are many personal secure in this file!

    好了！大家趕緊寫一個適合自己的備份 script 來進行備份的行為吧！重要重要喔！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2002/07/06：第一次完成
2003/02/12：重新編排與加入 FAQ
2002/07/06 以來統計人數


簡易 X-Window 設定
最近更新日期：2003/02/12
X-Window的架構
    XFree86 的歷史演進與版本
    X server, X client 與 Window manager
    XFree86 的主要設定檔案
使用設定工具：XFdrake, Xconfigurator
使用XFree86提供的工具設定：xf86cfg, xf86config
手動修改XFree86設定檔
啟動X-Window
更新顯示卡驅動程式範例：以Geforce2 MX 說明
本章習題練習
X-Window的架構
在Unix-Like包括Linux等作業底下的圖形界面通常被我們簡稱為X-Window囉，這個X-Window怎麼來的？他目前的版本是怎樣？還有，X-Window主要是主從架構的(Server, Client)，那麼這些主從架構是怎麼回事呢？我們底下就來談一談這些東西吧！
  • XFree86 的歷史演進與版本
    基本上，X-Window的核心就是 XFree86 這個玩意兒囉，他怎麼來的呢？在早期的Unix世界中，並沒有所謂的圖形界面，所以在一些圖形展示上面有點困擾就是了，後來經過麻省理工學院(MIT)的發展，終於在 1986 年開發出在 Unix 系統上面的 X Window System！並且組織了 XFree86 這個計畫組織來發展這個圖形介面！從此之後，人們才可以在 Unix 作業系統中看到這個美美的圖形化介面(Graphical User Interface, 簡稱GUI)呢！那麼這個 XFree86 組織繼續發展這個介面，到了 1987 年釋出第一版的X11版本，而後陸續發展出更新的版本，在第二版釋出被稱為X11R2，目前的版本則是第六次釋出，稱為X11R6囉！而目前的X11R6版本中，主要依照新舊又被分為較舊的第三版(version 3)，以及較新的第四版(version 4)。(註： XFree86 的命名基本上為 X 系統 + Free 軟體 + x86 系統架構 的簡寫囉！)

    那麼在 Linux 針對 XFree86 的使用上面情況是怎樣呢，呵呵，在 1994 年第一個 Linux kernel 1.0 的版本當中，就已經支援 XFree86 囉！至於目前在 2002 年之後出版的 Linux distribution 通常都已經換為了version 4了，例如 Mandrake 9.0 及Red Hat 7.2以後版本，這一版支援的顯示卡驅動程式較多，而且也較新啦！不過，在 2001 年以前的Linux版本則主要還是以 version 3 為主呢！

  • X server, X client 與 Window manager
    大概瞭解一下X-Window的歷史與版本之後，接著下來我們要來談一談，那麼什麼是X server, X client這些個東西，怎麼一個X-Window有這麼多的奇怪的介面，什麼KDE啦還有GNOME啦等等的！

    • X server：
      基本上，XFree86的主要功能是什麼呢？嗯！那就是管理整個Linux主機上面的關於顯示的硬體配備啦！例如顯示卡、螢幕解析度、鍵盤形式、滑鼠形式等等，咦！那我們在安裝Linux的時候，不是都已經可以將這些資訊設定好了嗎？這裡必須說明的是，X-Window在Linux裡面只是『一個軟體』而已，所以，你在安裝Linux的時候，選擇的鍵盤也好，滑鼠形式也好，都是給Linux這個系統用的，跟X-Window可沒有絕對的關係呢！所以這也就說明啦，你的X-Window要在Linux上面啟動時，還需要載入X-Window需要的驅動程式才行！所以呢，當你以run-level 3進入Linux之後，基本上，X-Window是完全不存在你的系統的記憶體中，而當你輸入startx以啟動X-Window系統時，這個時候Linux才會開始讀入X-Window的驅動程式(大概就是顯示卡驅動程式、螢幕解析度調整等等的設定值)。所以，請注意啦，這個X server就是用來管理Linux主要關於顯示的一些硬體與驅動程式囉！

    • X client：
      大略知道了X server之後，再來我們要看一看，那麼什麼是X client呢？又沒有網路連線，怎麼會有client這個名詞？其實，X server主要的功能只是在管理顯示的驅動程式與硬體，但是在整個螢幕前面顯示給使用者，並且經由使用者移動滑鼠也好、鍵盤也好，來啟動一些『事件』的動作，以回應給X server，並進一步處理一些資訊，則是需要一些X的軟體來進行，這些關於X的軟體，我們就可以稱為是X client囉！反正，只要是關於一些視窗的行為、顯示在螢幕的行為等等，使用者都是透過X client來告訴X server的啦！那也就是說，『當X server死掉的時候，X client根本就無法動作！』怎麼說呢？因為管理硬體的X server都不動了，利用這個server來進行顯示與事件觸發的X client要怎麼活下去？瞭解了嗎？

    • Window manager：
      那麼什麼又是『視窗管理員？』說穿了，其實視窗管理員你也可以簡單的將他看做是一個X client啦！這個Window manager主要是做為你跟整個X Window系統的介面，所以，所有的X軟體(就是上面講到的X client)都是他管的！目前最熱門的兩個視窗管理員就是KDE與GNOME囉！

    如果我們以KDE來作說明，那麼您應該不難瞭解，主要的硬體驅動還是得要X Window的核心，也就是XFree86這個咚咚沒有問題的驅動之後，然後我們才能進入KDE這個視窗管理員的介面之下進行美美的圖形介面環境工作！萬一哪一天您的X-Window死掉了，你必須要知道的是，你是怎麼讓他死掉的？

    • 如果之前還可以進入X-Window，也就是KDE，不過經過當機之後(這裡指的是並沒有重新設定XFree86喔！)，導致X-Window無法進入，那麼應該可能就來自於KDE的問題了，這個情況之下，通常刪除自己家目錄之下的.kde這個隱藏目錄後，就可以恢復到最原始的狀態。

    • 但是如果一安裝完Linux就一直無法進入X-Window的話，那麼大概就是XFree86這個核心沒有設定好的問題啦！所以我們就必須要設定XFree86呢！

  • XFree86 的主要設定檔案
    好啦，既然如果曾經進入過X-Window，則可能的問題就會變成是window manager的問題，而不是XFree86的問題，那麼情況應該還容易解決，所以我們不談這個。我們底下要談的是當你的X-Window一直無法正確且成功的啟動時，那麼應該就是硬體設定的問題啦！例如解析度調錯啦、滑鼠格式不對啦、顯示卡的驅動程式不對等等的問題！果真是這些問題的時候，我要如何來重新設定我的XFree86這個核心呢？

    剛剛前面提過，我們的XFree86目前有兩個版本，分別是version 3與version 4，那麼怎麼知道我的Linux使用的是哪一個XFree86的版本呢？嗯！就使用：

      X –version

    來檢查吧！好了，那麼不同版本的設定檔在哪裡？這兩個版本的設定檔分別是：

    • version 3: /etc/X11/XF86Config
    • version 4: /etc/X11/XF86Config-4

    請特別留意他的大小寫呢！上面的可是設定檔喔！所以呢，當我們說『我的X-Window一直無法驅動，我要去修改我的設定檔！』通常指的就是這個檔案啦！目前我們在Linux裡面大多是使用version 4了，因此底下我們將以/etc/X11/XF86Config-4這個檔案來說明呢！請注意，如果您的X-Window本來可以正確無誤的啟動時，表示這個檔案內容是對的，這個時候，『請務必將您的這個設定檔案備份一個！』因為未來如果設定錯誤導致無法進入X-Window時，只要將原本正確的備份檔案覆蓋回來，你的X-Window就救回來了！所以這個檔案真的很重要，請記得一定要備份喔！

      cp /etc/X11/XF86Config-4 /etc/X11/XF86Config-4.bak

    底下我們就來談一談，怎麼樣設定我們的XFree86呢？一般而言，如果你要重新設定XFree86的一些細項設定時，最好的步驟是：

    1. 如果已經能夠進入X-Window了，那麼就直接以Window manager提供的小工具來設定你的XFree86，例如KDE提供的control center就可以進行這個工作；
    2. 如果沒有辦法進入X-Window了，那麼就使用各家distribution提供的小工具來設定我們的XFree86設定檔；
    3. 如果各家提供的工具還沒有辦法設定好XFree86的話，那麼就必須要使用到XFree86提供的小軟體工具，在指令列模式下面執行的xf86cfg或xf86config囉！
    4. 如果調整的結果您還是不太滿意，那麼就直接手動的來微調/etc/X11/XF86Config-4這個檔案吧！
使用設定工具：XFdrake, Xconfigurator：
好了，如果你的X-Window本來就沒有問題，那麼底下的資料就可以不要看啦！但是，如果你的X-Window一直怪怪的，那麼底下的設定方式就得給他瞧一瞧！目前使用上面較為方便的，還是以各家distribution提供的小工具來設定我們的/etc/X11/XF86Config-4這個檔案較為方便，而設定的內容不外乎：
  1. 鍵盤的格式；
  2. 滑鼠的格式；
  3. 螢幕的格式，包含解析度、水平、垂直更新頻率等等；
  4. 顯示卡的主要驅動程式，也就是所謂的X server最主要的內容啦！
  5. 顯示的解析度：
上面那個顯示的解析度還得要瞭解一下，我們在設定螢幕的解析度時，指的是『我的螢幕能夠負荷的最高解析度』，而在第五項的顯示的解析度，是我們進入X-Window並且使用Window manager來操作主機之後，那個桌面的支援的解析度啦！因此，第三項螢幕的解析度當然就可以設定的比較高囉！

目前最流行的兩套Linux：Mandrake與Red Hat均提供不錯的軟體來設定XF86Config-4，那就是：
  • Mandrake XFdake
  • Red Hat Xconfigurator
這兩個套件設定的項目幾乎都是一模一樣啦。好了，請記得備份你的XF86Config-4這個檔案吧。
  • Mandrake ： XFdrake
    直接在指令列模式中輸入XFdrake開始使用 XFdrake 的 X 設定囉！

    • 偵測系統的硬體設定：

      進入XFdrake之後的第一個動作即是在偵測你的主機上面的硬體啦！如果捉到硬體之後，會將你的Linux主機上面的硬體給他顯示在畫面上，如同上圖所示，而且有幾個設定值：

      • Graphic Card: 這個顯示目前你的顯示卡晶片；
      • Monitor: 顯示目前你的螢幕廠牌或者選擇自訂(Custom)
      • Resolution: 選擇你的X-Window顯示的解析度
      • Test: 立即測試你的硬體設定
      • Options: 讓你選擇是否開機的時候進入X-Window
      • Quit: 離開XFdrake這個程式！

      請注意，在選擇的時候，必須要使用<tab>按鍵，使游標移動到OK之後，才可以進入各細項去選擇呢！

    • 顯示卡晶片組的選擇：Graphic Card
      在按下了Graphic Card之後，會出現可以選擇晶片組的畫面來，如下圖所示，在下圖中，基本上會有三個欄位，第一個Vendor是說廠商，第二個SIS則是發展的廠商名稱，例如你的顯示卡是Nvidia的，那麼就選擇Nvidia吧！第三個則是這個廠商的支援晶片組！嗯！選擇你的顯示卡吧！我這裡是使用SIS的6326啦！

      好了，確定了晶片組之後，由於我們的X11目前有兩版，所以必須要先確認一下你的X11版本為何？因為這兩個版本使用的晶片組驅動程式並不相同呀！因此，按下OK之後會出現下面圖示：

      由於我是使用version 4，所以這裡就選擇XFree 4.2.1囉！選擇了XFree 4.2.1之後，系統會回復到最先前的畫面喔！

    • 設定螢幕：Monitor
      設定完了顯示卡之後，再來則是設定另外一個很重要的咚咚，就是顯示器，也就是螢幕設定啦！在螢幕的設定當中，首先，你可以選擇程式提供的顯示器的廠牌，如下圖所示，如果你可以找到你的螢幕廠牌的話，那麼直接點選就可以啦！如果找不到的話，那麼就直接選擇Custom吧！

      如果剛剛上面選擇了廠牌的話，那麼程式將會自動設定水平、垂直更新頻率；但是，如果是選擇了Custom的話，那麼就會出現如上的圖示來要求你輸入水平、垂直的更新頻率。這裡請特別留意呢，因為這兩個頻率設定錯誤的話(如果設定得太高了的話)很有可能會造成『螢幕的燒毀』，通常設定水平31-57及垂直50-90應該都不會有問題啦！這裡設定完之後，又會回到最先前的畫面。

    • 設定X-Window解析度：Resolution
      在按下了Resolution之後，會出現下圖：

      在螢幕的解析度上面，這個就隨個人的喜好而定了，鳥哥特別喜歡字小小的，桌面大大的，所以比較偏好1024x768這樣的設定值囉！

    • 實地測試：Test
      再來，如果按下Test之後，XFdrake就會幫我們進行測試工作了！奇怪的是，我做了好幾次，結果都沒有辦法Test成功！真是奇怪？如果在這個畫面中當掉了，不要慌張，按下[Ctrl]+[Alt]+[F1]就會回到原來的畫面，基本上，不Test也沒有關係啦！

    • 設定run-level：Options
      接著下來則是設定是否開機即啟動X-Window，也就是所謂的run-level 5啦

      以我為例，因為我的Linux都是拿來當伺服器用的，而且對於X-Window不是很有使用的時機，所以我都是以run-level 3來登入Linux的，自然也就選擇No囉！

    • 離開XFdrake：Quit
      這樣就設定完畢了！所以選擇離開，這個時候會出現如下的圖示：

      如果確定一切都沒有問題，就給他按下『Yes』吧！這樣就完成設定了！當然啦，你的/etc/X11/XF86Config-4就被更改囉！

  • Red Hat : Xconfiguration
    在 Red Hat 裡面也有個 Xconfiguration 來簡單的設定我們的 X Window 的各項設定喔！

    • 執行 Xconfigurator ：
      這個時候會出現一個歡迎畫面，按下 OK 之後，系統會自動去捉顯示卡的晶片組。如果顯示卡是這一版的 XFree86 有支援的話，那系統就會顯示出你的顯示卡型號，如下圖所示為 S3 的 Trio64v2 晶片：

    • 設定螢幕與螢幕解析度：
      上圖按下 OK 之後會開始去設定顯示器（螢幕），一般我們都用自訂的方法去捉螢幕，所以選擇 Custom 手動設定（第一項），如下圖所示：

      按下 OK 之後，系統會告訴你一些訊息，再按下 OK 後，就會出現如下的畫面，告訴你應該要選擇哪一個螢幕的解析度，通常我們都會選擇『High Frequency SVGA, 1024x768 @ 70Hz 』那一個選項。

      上圖按下 OK 之後，就會要求你選擇垂直解析度，通常我們都是選擇第二項，也就是 50-90 那一項即可；

    • 顯示卡相關設定：
      再來系統會問你是否要讓 XFree86 自己捉顯示卡相關的資訊？這裡可以按 Probe 也可以按 Don't Probe ，只是，如果你確切的知道你的顯示卡記憶體的大小的話，這裡建議選擇 Don't Probe； 上一步驟選擇 Don't Probe 之後，系統會要你選擇你的記憶體，請依你的顯示卡記憶體實際大小輸入，如果是 S3 Vrige 的話，通常是 1M 或者是 2M 左右吧！

      選完了記憶體大小之後，過來是選擇你的記憶時脈晶片，由於我們通常不是很清楚我們的晶片是哪一個，所以這裡只好讓系統自己捉，如下圖，直接選擇 No Clockchip Setting 即可！

    • 色彩度的設定：
      再來則是選擇畫面解析度與色彩量，如下圖所示，一般而言，如果你的 X-Window 一直有問題，這裡可以選擇 8 bit，及 640x480 的最原始設定就好！如果你的 X-Window 沒有問題，可以正常的使用了，而你覺得你想要讓你的色彩最大化，則可以僅選擇 24 bit 及 1024x768 這一項即可！如此一來，你就可以以你最喜歡的解析度與色度進入 X-Window 啦！（注意喔，在 bit 之間以 tab 鍵移動，而以 空白鍵 確定！）

      接著下來系統告訴你要開始測試 X-Windows 啦，按下 OK 之後系統就開始測試 X-Window！在這個地方要注意一下，如果你的設定不完全，則系統將會回到第三步驟重新再設定，如果你在這一個步驟重複了三次以上仍無法設定成功，那就必須以 xf86config 這支程式設定了！

      如果你可以正常的看到一個游標及一個框框告訴你還有10秒鐘的時間可以按確定，那就表示你的 X-Window 可以用啦！這個時候請選擇 OK，然後出現的另一個框框告訴你：『是否要在下次開機的時候以圖形介面登入』，這一步千萬選擇『NO』，因為以 X-Window 為預設的開機介面，個人覺得並不好，因為不但佔用了較多的系統資源，而且，並不會比較好使用！

      完成設定了，跳出 Xconfigurator 後，以 startx 進入 X-Window ！
很簡單吧，這就是使用工具軟體來設定的方法。底下我們來提一提，那麼正統的設定XFree86該怎麼玩？

使用XFree86提供的工具設定：xf86cfg, xf86config
基本上，XFree86 已經提供了兩支相當好用的程式來幫我們設定 XF86Config-4 了！那就是 xf86cfg 及 xf86config 這兩個！

那個 xf86cfg 會自動的偵測我們的主機資訊，並且直接將新的 XF86Config.new 檔案放置在設定者的家目錄之下，相當的方便！只要使用者在啟動 X-Window 之前，將自己家目錄的 XF86Config.new 複製到 /etc/X11/XF86Config-4 這個檔案，那麼就完成設定啦！但是，由於 xf86cfg 主要是自動幫我們捉取資料的，除非您使用 man xf86cfg 來查詢他的參數，否則常常無法捉到自己喜歡的模式！使用的方法是直接在指令列模式下，下達 xf86cfg 即可！

相對於 xf86cfg 的主動偵測資料，這個 xf86config 則顯的較為老態龍鍾，因為他的所有設定都需要使用者給予呢！包括鍵盤、滑鼠、螢幕、解析度等等的問題。不過，因為他都是經由使用者設定的，所以自然也就有辦法直接提供使用者一個喜好的環境設定囉！底下我們就針對 xf86config 來談一談吧！

[root @test root]# xf86config
Step 1: 準備備份與是否進行？
This program will create a basic XF86Config file, based on menu selections you make.
Before continuing with this program, make sure you know what video card
you have, and preferably also the chipset it uses and the amount of video
memory on your video card. SuperProbe may be able to help with this.
Press enter to continue, or ctrl-c to abort. <==這裡按下Enter開始設定

Step 2: 設定滑鼠：
First specify a mouse protocol type. Choose one from the following list:
1. Microsoft compatible (2-button protocol)
2. Mouse Systems (3-button protocol)
3. Bus Mouse
4. PS/2 Mouse
5. Logitech Mouse (serial, old type, Logitech protocol)
6. Logitech MouseMan (Microsoft compatible)
7. MM Series
8. MM HitTablet
9. Microsoft IntelliMouse
Enter a protocol number: 4 <==主要是2或4，目前大多使用ps/2滑鼠，所以選4就對了！

Do you want to enable Emulate3Buttons? n <==是否模擬三鍵？我們已經是三鍵，當然不模擬！

Now give the full device name that the mouse is connected to, for example
/dev/tty00. Just pressing enter will use the default, /dev/mouse.
Mouse device: <==這裡要設定滑鼠的裝置代號，通常使用預設值即可，所以按下Enter！

Step 3: 設定鍵盤格式：
1 Generic 101-key PC
2 Generic 102-key (Intl) PC
3 Generic 104-key PC
4 Generic 105-key (Intl) PC
5 Dell 101-key PC
6 Everex STEPnote
7 Keytronic FlexPro
8 Microsoft Natural
Enter a number to choose the keyboard.
1 <==選擇鍵盤的形式，如果不知道你的鍵盤格式，選擇 1 或 3 即可！

1 U.S. English
2 U.S. English w/ ISO9995-3
3 U.S. English w/ deadkeys
4 Albanian
Enter a number to choose the country.
Press enter for the next page
1 <==選擇鍵盤按鍵，我們鍵盤上面有的是英文呀！所以當然選擇 1 英文按鍵！

Please enter a variant name for 'us' layout. Or just press enter
for default variant
<==選擇這個鍵盤的名稱，預設稱為 us ，不用搞特殊，Enter即可！

Please answer the following question with either 'y' or 'n'.
Do you want to select additional XKB options (group switcher,
group indicator, etc.)? n <==是否需要額外的XKB選項，不需要啦！按 n ！

Step 4:設定螢幕
Now we want to set the specifications of the monitor.
The valid range for horizontal sync and vertical sync should be documented
in the manual of your monitor. If in doubt, check the monitor database
/usr/X11R6/lib/X11/doc/Monitors to see if your monitor is there.
Press enter to continue, or ctrl-c to abort. <==準備設定螢幕，按Enter開始

hsync in kHz; monitor type with characteristic modes
1 31.5; Standard VGA, 640x480 @ 60 Hz
2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz
5 31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
8 31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
9 31.5 - 79.0; Monitor that can do 1280x1024 @ 74 Hz
10 31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz
11 Enter your own horizontal sync range
Enter your choice (1-11): 7 <==目前的螢幕選擇 7 應該都吃的下啦！
當然，如果你的螢幕比較好，可以考慮選擇 8~10 的選擇！

the number that counts is the high one (e.g. 87 Hz rather than 43 Hz).
1 50-70
2 50-90
3 50-100
4 40-150
5 Enter your own vertical sync range
Enter your choice: 2 <==目前螢幕選擇 2 也應該都沒有問題啦！

You must now enter a few identification/description strings, namely an
identifier, a vendor name, and a model name. Just pressing enter will fill
in default names.
The strings are free-form, spaces are allowed.
Enter an identifier for your monitor definition: MyMonitor<==這裡要寫一下你的螢幕的代號，
隨便寫沒有關係啦！因為這個是在XF86Config裡面的代號而已！

Step 5: 設定顯示卡
Do you want to look at the card database? y <==是否要選擇顯示卡？當然是要囉！

468 SiS 5597 SiS5597
469 SiS 5598 SIS5598
470 SiS 620 SIS620
471 SiS 6326 SiS6326
472 SiS SG86C201 SIS86C201
Enter a number to choose the corresponding card definition.
Press enter for the next page, q to continue configuration.
471<==這裡接著下來會讓你選擇你的顯示卡資料，由於我們的資料庫相當龐大，所以
如果該頁沒有你要的資料時，可以按下Enter到下一頁去選擇！那麼如果你的廠商
是比較小牌的怎麼辦？沒關係，果真如此，那麼選擇不同廠商但是同樣晶片的
資料就可以了！由於我是使用Sis 6326，所以就選擇471這個號碼囉！

Your selected card definition:
Identifier: SiS 6326
Chipset: SiS6326
Driver: sis
Do NOT probe clocks or use any Clocks line.
Press enter to continue, or ctrl-c to abort. <==這裡再按Enter即可！

How much video memory do you have on your video card:
1 256K
2 512K
3 1024K
4 2048K
5 4096K
6 Other
Enter your choice: 6 <==設定你的顯示卡記憶體，目前的主流已經提升到 64MB了，
所以自然要選擇 6 來自定了！記得 RAM 的算法：
32M = 32*1024= 32768K 才對喔！

Amount of video memory in Kbytes: 1024 <==我的卡只有 1M 而已….

The strings are free-form, spaces are allowed.
Enter an identifier for your video card definition: <==這裡按下 Enter 使用預設值即可！

Step 6:設定螢幕解析度：
"640x480" "800x600" "1024x768" for 8-bit
"640x480" "800x600" for 16-bit
"640x480" for 24-bit

Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.

1 Change the modes for 8-bit (256 colors)
2 Change the modes for 16-bit (32K/64K colors)
3 Change the modes for 24-bit (24-bit color)
4 The modes are OK, continue.

Enter your choice: 3 <==預設的情況下會有上面的那些模式，那麼我通常喜歡一種模式而已，
所以就按下 3 來修改該模式，設定為我喜歡的 1024x768 那個模式。

Select modes from the following list:
1 "640x400"
2 "640x480"
3 "800x600"
4 "1024x768"
5 "1280x1024"
6 "320x200"
7 "320x240"
8 "400x300"
9 "1152x864"
a "1600x1200"
b "1800x1400"
c "512x384"
Please type the digits corresponding to the modes that you want to select.
For example, 432 selects "1024x768" "800x600" "640x480", with a
default mode of 1024x768.

Which modes? 4 <==選擇我要的呦！

Please answer the following question with either 'y' or 'n'.
Do you want a virtual screen that is larger than the physical screen? n
上面的設定在說明，是否需要虛擬桌面？我才不要呢！所以選擇 n 囉！

1 Change the modes for 8-bit (256 colors)
2 Change the modes for 16-bit (32K/64K colors)
3 Change the modes for 24-bit (24-bit color)
4 The modes are OK, continue.

Enter your choice: 4 <==這樣就 OK 了！

Please specify which color depth you want to use by default:

1 1 bit (monochrome)
2 4 bits (16 colors)
3 8 bits (256 colors)
4 16 bits (65536 colors)
5 24 bits (16 million colors)
Enter a number to choose the default depth.
5 <==預設是哪一個色彩度登入呢？選擇你要的喔！我要的是 5 那個色彩度！

Step 7: 寫入設定檔
Shall I write it to /etc/X11/XF86Config? y <==勇敢一點！給他 y 寫入吧！反正已經備份了！

這樣就設定完成了，但是比較麻煩的是，這個指令在設定XF86Config，所以你必需將他複製成為XF86Config-4才可以呢！然後就可以測試一下X-Window是否成功囉！
手動修改XFree86設定檔
好了，既然知道前面幾個咚咚都是在設定XF86Config-4這個檔案，那麼我們豈不是也可以自行去修改這個檔案呢？說的好！沒錯！所以我們就來修修改改這個檔案吧！首先，這個檔案裡面將很多的段落分成這種模樣：

Section “section name”
……..
……..
EndSection

開頭由 Section 接著該段落的內容項目，然後結束以 EndSection 來結束，我們直接在檔案內容進行說明吧！請參考一下底下的內容囉：

[root @test X11]# vi /etc/X11/XF86Config-4
Section "Module"
Load "dbe"
Load "dri"
Load "extmod"
Load "glx"
Load "record"
Load "xie"
Load "freetype"
Load "type1"
Load "v4l"
EndSection
上面的資料在載入驅動X-Window的時候，需要的模組項目！通常這些項目都給他載入進去吧！另外，模組的資料可以在/usr/X11R6/lib/modules這個目錄中找到！

Section "Device"
Identifier "Card0"
Driver "nv"
VendorName "NVidia"
BoardName "GeForce2 MX"
BusID "PCI:1:0:0"
Option "X-KXCONFIG-VideoRam" "32768"
Option "X-KXCONFIG-MaxClock" "350"
EndSection
這個項目在設定你的顯示卡驅動程式！以我的卡為例，這個例子中，使用的是 Geforce 2 MX，
所以當然就是使用 nv 這個預設的 Nvidia 驅動程式啦！還有Option裡面的VideoRam設定的是顯示卡記憶體容量，記得填對！至於其他的項目就沒有這麼重要！

Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/misc:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
FontPath "/usr/X11R6/lib/X11/fonts/Type1"
FontPath "/usr/X11R6/lib/X11/fonts/Speedo"
FontPath "/usr/X11R6/lib/X11/fonts/ghostscript"
EndSection
這個項目在設定字型與顏色，那個RgbPath是設定色彩，而FontPath則是設定字型的地方！
這裡告訴我們另一個資訊，那就是字型通常是擺在/usr/X11R6/lib/X11/fonts裡面喔！

Section "ServerFlags"
Option "AllowMouseOpenFail" “false”
EndSection
這裡可以設定X-Window的另一個整體化參數！上面那個 AllowMouseOpenFail 的設定中，
若設定為 “false” 那麼沒有找到並驅動滑鼠，就不能登入X-Window囉！

Section "InputDevice"
Driver "keyboard"
Identifier "keyboard"
Option "XkbRules" "xfree86"
Option "XkbModel" "pc104"
Option "XkbLayout" "us_group3"
EndSection
Section "InputDevice"
Driver "mouse"
Identifier "mouse"
Option "Protocol" "IMPS/2"
Option "Device" "/dev/psaux"
Option "ZAxisMapping" "4 5"
EndSection
這個是在設定周邊輸入介面，有鍵盤及滑鼠兩種設定，注意上面黑體的地方，keyboard設定的是鍵盤的格式(XkbModel與 XkbLayout)，而滑鼠則是設定介面(Protocol)較為重要！

Section "ServerLayout"
Identifier "Default layout"
Screen 0 "Screen0" 0 0
InputDevice "mouse" "CorePointer"
InputDevice "usbmice" "SendCoreEvents"
InputDevice "keyboard" "CoreKeyboard"
EndSection
這個地方在設定整個畫面的輸出呢！重點在 Screen 那個項目的設定喔！那個 0 0 指的是桌面左上角為 0 0 的意思！

Section "Monitor"
Identifier "Generic Monitor"
VendorName "Typical Monitors"
ModelName "1280x1024, 60Hz"
HorizSync 31-64
VertRefresh 50-90
ModeLine "1024x768/70Hz" 75 1024 1048 1184 1328 768 771 777 806 -HSync -VSync
ModeLine "640x480" 25.175 640 664 760 800 480 491 493 525
EndSection
這個項目則是設定螢幕的細項，包括解析度、更新頻率等等的設定值喔！

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Generic Monitor"
DefaultDepth 16
Subsection "Display"
Depth 32
Modes "1024x768/70Hz" "640x480"
Virtual 0 0
EndSubsection
Subsection "Display"
Depth 24
Modes "1024x768/70Hz" "640x480"
Virtual 0 0
EndSubsection
Subsection "Display"
Depth 8
Modes "1024x768/70Hz" "640x480"
Virtual 0 0
EndSubsection
Subsection "Display"
Depth 16
Modes "1024x768/70Hz"
Virtual 0 0
EndSubsection
EndSection
重點來了！這個就是設定你進入X-Window的時候，顯示的解析度囉！預設有支援的項目都會寫進來，但是，像比較龜毛的我，就是不喜歡有這麼多的項目存在，所以我可以將上面的資料，只剩下粗體字，其他的都刪除，那麼進入X-Window就只有一種顯示模式！比較方便啦！當然囉，你也可以藉由修改DefaultDepth那個項目來控制登入X-Window時的設定值囉！

這樣就設定完成啦！而如果你曾經選錯了『虛擬桌面，Virtual desktop』時，那麼就修改Section Screen 那個項目，將裡面的 Virtual 改成 0 0 即可囉！一般而言，我們在設定X-Window時，通常會先以各家Linux distribution提供的軟體來設定，如果不能成功，就改以xf86cfg來自動設定，還不能成功，就以xf86config來設定，再不成功，唉∼只好使用手動的方式修改設定檔囉！
啟動X-Window
好了，設定好了XF86Config-4之後，自然就是要啟動X-Window試試看囉！那麼該如何啟動X-Window呢？如果在開機流程簡介那一篇有仔細的瞧過的話，應該會知道，我們的開機進入模式有多種，但是基本上正常登入則有run-level 3的文字介面登入及run-level 5的圖形介面登入！如果是run-level 5的話，那麼表示您目前應該已經是在X-Window的環境下了，如果是在run-level 3要轉到X-Window的畫面下，那麼就直接給他：
startx
就可以啦！這個時候就會主動的來將我們剛剛設定的內容給他驅動看看，如果可以的話，自然就會進入視窗桌面囉！如果不能進入，再次的給他設定吧！ ^_^
更新顯示卡驅動程式範例：以Geforce2 MX 說明
那麼萬一我的顯示卡並不被我的XFree86所支援呢？例如最新的Geforce4這些晶片組的顯示卡？沒有關係，能不能驅動硬體是跟硬體發展的廠商有關係的，所以只要硬體開發商能夠提供驅動程式的話，那麼自然就可以沒有問題的給他驅動囉！底下我們以目前最常見的Nvidia的顯示卡來進行說明，讓大家瞭解一下如何更新這個驅動程式吧！
  • 下載最新的驅動程式：
    既然要更新驅動程式，自然要到硬體開發商的網站去下載囉！底下列出Nvida的網址，您可以前往下載最新的驅動程式囉！我是使用SRPM下載到我的系統當中，然後藉由編譯來完成安裝的！所以建議您也下載SRPM來玩玩吧！

      http://www.nvidia.com/view.asp?IO=linux_display_archive

    註：至少要兩個檔案，檔名為：

      NVIDIA_GLX-xxxx.src.rpm
      NVIDIA_kernel-xxxx.src.rpm

    那個xxxx顯示的是版本，這兩個檔案的版本必需一致才行！

  • 編譯並安裝驅動程式：
    好了，開始來編譯一下我們的SRPM囉！並且安裝他們啦！

    [root @test root]# rpm --rebuild NVIDIA_kernel-1.0-3123.src.rpm
    [root @test root]# rpm --rebuild NVIDIA_GLX-1.0-3123.src.rpm
    這個時候會在/usr/src/RPM/RPMS/i586多兩個檔案，好了，將他裝上

    [root @test root]# rpm -ivh /usr/src/RPM/RPMS/i586/NVIDIA_kernel-1.0-3123.i586.rpm
    [root @test root]# rpm -ivh /usr/src/RPM/RPMS/i586/NVIDIA_GLX-1.0-3123.i586.rpm

    安裝的過程當中會有一些錯誤訊息顯示，不過不要僅，那個是正常的！在安裝好了之後，會在/usr/X11R6/lib/modules/drivers多一個名為nvidia_drv.o的檔案，那個就是我們要的驅動程式啦！

  • 手動加入驅動程式於設定檔中
    如果您原先就可以使用X-Window，那麼就直接手動的修改/etc/X11/XF86Config-4這個檔案，如果原先就無法使用X-Window的話，那麼請重新以xf86config設定一下你的XFree86，然後在修改底下的資料：

    [root @test root]# vi /etc/X11/XF86Config-4
    1. 載入 GLX 模組：
    尋找 Section “Module” 確定底下這一行存在，若不存在，請自行加入：
    Load "glx"
    同時尋找底下兩行：
    Load "dri"
    Load "GLcore"
    這兩行若存在的話，請刪除，若不存在，就沒有關係！

    2. 載入驅動核心程式
    尋找Section "Device" 應該會有這一行：
    Driver "nv" (或者其他的名稱！)
    將他修改為如下的樣子：
    Driver “nvidia”

    這樣就修訂完成了！趕快重新啟動X-Window試試看！
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
2003/02/12：第一次完成
2003/02/12 以來統計人數


一些基礎的 Linux 問題
最近更新日期：2002/06/28
一些基礎的 Linux 問題與討論：
注意：如果您有更好的試題，或者是有相關的資料要提供給 VBird 的話，我也會盡快的將他寫到網頁中的！感謝感謝！！ ^_^ ..
一、什麼是 Linux 呢？！
  1. 試說明 Unix 與 Linux 的歷史？
  2. 簡單說明 GNU General Public License （GPL）的精神：
  3. 什麼是 Linux Distribution？
  4. 市面上眾多的 Linux 版本當中，有何異同？
  5. Linu Kernel 的功能：
  6. 試說明 Linux Kernel 與使用者之間的相關性？
  7. 試說明什麼是 GUI
  8. Linux 的優點：
  9. Linux 是多人多工的環境，請問何謂多工(Multitask)與多人(Multiuser)：
二、Linux 的安裝與認識 Linux 支援的硬體
  1. 一般而言， Linux 需要的配備並不需要太高檔，但 Open Linux Server 3.1.1 需要？
  2. 什麼是 IDE 界面，一般而言，普通 PC 允許幾個 IDE 界面與裝置？
  3. IDE2 的 master 之第一個 logical 磁碟中，其裝置代號（檔案名稱）為何？
  4. 在硬碟分割 (Partition)時，最多有幾個 primary + extended ？
  5. 若在分割的時候，在 IDE1 的 slave 硬碟中，分割『六個有用』的磁區（具有 filesystem 的），此外，有兩個 primary 的磁區！請問六個磁區的代號？
  6. 一般而言安裝 Linux 至少要有哪兩個 partition 呢？
  7. 一般而言，在 RAM 為 64MB 或 128 MB 的系統中， swap 要開多大？
  8. 光碟機與軟碟機的代號（裝置檔案名稱）？
  9. 網路卡（Network Interface Card, NIC）的代號？
  10. 預設的 Linux 檔案格式為何？又，目前常用的 Journalling 檔案格式為何？
  11. 安裝 Linux 的主要流程？
  12. 什麼是 GMT 時間？台北時間差幾個鐘頭？
  13. Tap, SCSI 硬碟, RAID, printer 的裝置代號？
其他注意事項：
  • 要玩 X-window 時，至少需要具有 4-8 MB 的 VGA RAM 才好！
  • 第一次使用與安裝 Linux 時，請盡量的安裝『所有套件！』
  • 若具有安裝與使用經驗之後，則安裝的時候，僅選擇您所預計需要開放的服務之套件即可！
  • 特別留意硬體對於 Linux distribution 的支援度！可以參考一下如下的網頁：
    http://www.linux.org.tw/hardware/index.php3
  • 製作 Install 之軟碟開機片：
    將可開機光碟放入 Windows 系統下，並執行光碟機中的檔案(假設光碟代號為 E:)
      E:\col\tools\rawrite\rawrite2
      Enter disk image source filename: E:\col\launch\floppy\install.144
      Enter target disketie derive: A:
  • 製作軟碟開機片的一般方法：
    mkbootdisk --device /dev/fd0 `uname -r`
三、簡易 KDE 的使用( X-Window)
  1. 若以 X-Window 為預設的登入方式，那請問如何進入 Virtual console 呢？
  2. 如何修改進入 Linux 時候的 run-level ？又 run-level 0, 1, 3, 5 各代表什麼意思？
  3. XFree86 在 X-Window 中的角色為何？
  4. XFree86 的主要設定檔在哪裡？
  5. KDE 預設提供多少個 Virtual desktops ？
四、線上求助 ( Help )
  1. 在 Linux 系統中，安裝的套件 (RPM安裝) 預設的文件資料放在那個目錄底下？
  2. 查看 Linux 系統的線上求助可以使用什麼指令？
  3. 使用 man 來查詢線上求助的時候，若要查詢類似參數檔(如/etc/passwd)需如何？
  4. 使用 man 查詢 command 的所有相關指令時，需要下什麼參數？
  5. man page 的 man path 變數，記錄在那個檔案中呢？！
五、vi 的使用
  1. 在 linux 底下最常使用的文書編輯器為 vi ，請問如何進入編輯模式？
  2. 如何由編輯模式跳回一般模式？
  3. 若上下左右鍵無法使用時，請問如何在一般模式移動游標？
  4. 若 [pagedown] [ pageup] 在一般模式無法使用時，如何往前或往後翻一頁？
  5. 如何到本檔案的最後一行、第一行；本行的第一個字元、最後一個字元？
  6. 如何刪除一行、n行；如何刪除一個字元？
  7. 如何複製一行、n行並加以貼上？
  8. 如何搜尋 string 這個字串？
  9. 如何取代 word1 成為 word2，而若需要使用者確認機制，又該如何？
  10. 如何讀取一個檔案 filename 進來目前這個檔案？
  11. 如何另存新檔成為 newfilename？
  12. 如何存檔、離開、存檔後離開、強制存檔後離開？
  13. 如何設定與取消行號？
六、檔案與目錄管理
  1. 請問底下的目錄與主要放置什麼資料？
  2. 『舊的』 Unix 系統與 Linux 系統的『檔名』最多可以容許幾個字元？
  3. 什麼是絕對路徑與相對路徑，要由 /usr/share/doc 進入到 /usr/share/man 由相對路徑與絕對路徑的寫法各為何？
  4. 在非為根目錄的任何一個目錄中，下達 ls –al 時，均會有『.』及『..』這兩個目錄，請問分別代表什麼？
  5. 顯示、變換目錄的時候，使用什麼指令？
  6. 新增目錄、移除目錄移動目錄與拷貝目錄有什麼指令可用？
  7. 如何查看一個檔案的『內容』（不要使用 vi 的情況下）
  8. 什麼是 hard link 與 soft link 的檔案？有何不同？
  9. 如何在 root 的家目錄下建立一個 /bin 的連結捷徑
  10. 若有一個連結檔為 testing 連結到 test1.sh ，請問 copy testing 到 /tmp 底下，『cp testing /tmp』則 /tmp/testing 這個檔案會是：(1) 連結檔，連結到 test1.sh ；(2) 一般檔案，為內容與 test1.sh 相同？
  11. 當一個檔案屬性為 –rwxrwxrwt 則表示這個檔案的意義為？
  12. 我需要將一個檔案的屬性改為 –rwxr-xr-- 請問該如何下達指令？
  13. 在 /usr/bin/passwd 這個檔案的屬性為 –r-s--x--x 請問代表什麼意思(s)
  14. 如何改出 –rwxr-sr-x 與 –rwxr-xr-t這個屬性？
  15. 如何查看一個檔案的類型 (type) 例如純文字檔、執行檔與 setuid 檔案等？
  16. 若一個使用者的 umask 為 033 ，請問他建立一個新的目錄與檔案時的預設屬性為？
  17. 若我需要更改一個檔案的擁有者與群組，該用什麼指令？
  18. 如何將一個檔案的修改日期改成目前的時間？
  19. 如何搜尋一個檔案？
  20. Linux 預設的檔案系統為何？此外，常用的 Journalling 檔案格式有哪些？
  21. less 跟 more 有什麼不同？
  22. 在比較兩個檔案的異同時，常使用的是 diff 與 cmp ，請教兩者有何不同？
六.1、磁碟掛載與虛擬記憶體問題
  1. 我要如何查看 Linux 系統當中所有已經掛載的硬碟容量與 inodes ？
  2. 我要如何查看目前所在目錄的所有檔案佔用的硬碟空間，此外，如何僅輸出結果？
  3. 如果磁區 /dev/hda3 有問題，偏偏他是被掛載上的，請問我要如何修理此一磁區？
  4. 承上題，那麼有問題的檔案將被移動到那個目錄下？
  5. 試說明新增一個 partition 在 /dev/hdb 當中，且為 hdb5時，並掛載上 /disk2 ，需要哪些步驟？
  6. 如何新增加 64MB 的虛擬記憶體 swap ？
  7. 如果要設定一個新掛載上的磁區，令他可以在開機的時候被掛載上，應該編輯哪一個檔案？
  8. 簡易說明 quota 的設置流程？
七、BASH SHELL
  1. 簡單說明 bash shell 的功能特徵：
  2. 在設定變數中，主要的規則為何？
  3. 顯示環境變數與所有變數的指令為何？
  4. 在環境變數當中，『使用者家目錄、主機名稱』的變數名稱為：
  5. 如何讓一個變數可以持續到下一個程序 (PID) 去？
  6. 在變數的設定當中，雙引號與單引號有何不同？
  7. Command1 `command2` 這個指令代表什麼意思？
  8. 在命令重導向當中， > 與 >> 有什麼不同？
  9. 若要將錯誤的輸出導向『不見了』的裝置，該如何是好？
  10. 在管線指令中，我要將 last 輸出的結果顯示 root 的『登入次數』， 如何做？
  11. 如何設定一個變數名稱為 name ，使其顯示為『 VBird’s testing variable. 』？
  12. 請問 bash shell 的環境變數與自己的個人變數可以登入便設定的檔案？
  13. 如何查詢曾經操作過的指令？如何執行第 26 個操作過的指令？上一個操作過的指令？
  14. 如何設定命令別名？使 lm 與 ls –al|more 功能相同
  15. 如何將 /bin 的所有資訊輸出到 /home/testing.dat 這個檔案？
  16. 在上一題中，若還要輸出到螢幕上，要如何是好？
  17. 執行 find ，並將正確的結果輸出到 right 而錯誤結果輸出到 error 當中？
  18. 如何在指令列模式中將 /root/.bashrc 的資料加在 /home/col/.bashrc 當中？
  19. 不要顯示執行的結果要如何是好？
  20. 列出這個月曾經登入主機的使用者資訊即可，不需要重複？
  21. 萬用字元當中， *, ?, [] 各代表什麼意思？
七.1、SHELL SCRIPTS
  1. 什麼是 shell scripts ？ scripts 有何功用？
  2. 要撰寫可以經由鍵盤輸入的 scripts 時，常使用到的指令？
  3. 在 shell script 當中，在控制式中， && 與 || 代表什麼意思？
  4. 在使用迴圈的時候，常使用到的控制式為哪三個？
  5. 執行 scripts 的方法有哪兩種？
  6. 如何宣告一個變數成為整數型態？
  7. 為何在 shell script 前面都要宣告 shell 呢？
  8. 在判斷式中，如何判斷一個檔名是否存在？
  9. 在執行一個 scripts 時，在 scripts 內的變數， $0, $1 代表什麼？
  10. 若要寫一個既定的 parameter （如 start ），用哪一個判斷式較簡單？
  11. 如何印出目前系統中的所有帳號，並加以排序且輸出到 /tmp/account 中？
  12. 如何在不執行 scripts 的情況中 debug ？
八、基本帳號管理
  1. 如何新增一個使用者 username，且該使用者沒有家目錄？
  2. Linux 使用者的帳號、密碼與群組的名稱檔案放在哪裡？
  3. 建立新使用者的預設家目錄內容在那個目錄中？
  4. 建立一個新使用者時，其使用到的相關檔案有哪些？
  5. root 的 UID 與 GID 各為何？
  6. 如何讓一個使用者不能登入主機，但是可以收信？
  7. 試說明一個使用者登入系統的流程？
  8. 在 /etc/shadow 當中的日期設定中，其數字代表的意義為何？
  9. 如何變更使用者的一些屬性？
  10. 如何視察一個使用者 username 所擁有的群組呢？
  11. 試說明如何手動增加一個使用者 username 與群組 groupname？
  12. 試說明 /etc/passwd 這個檔案的內容與格式：
  13. 使用 id 這個指令時，可以顯示什麼訊息資料？
  14. 可以控制使用者使用主機資源的預設檔案在哪裡？
  15. 基本的壓縮指令有哪些？
九、開機程序
  1. 試說明開機流程：
  2. 開機時後的載入訊息可以看哪裡？
  3. 改變 run-level 或關機的指令
  4. 改變登入 Linux 時候預設的 run-level 要改那個檔案？
十、程序與資源管理
  1. 如何查看目前的程序？
  2. 如何查看目前的記憶體使用狀況？
  3. 目前的工作如何丟到背景中？
  4. 如何取得目前背景中的工作，且將他拉回前景中？
  5. 如何設定一個程序在開始執行時候的優先值？
  6. 什麼指令可以修改一個正在執行的程式之 nice 值？
  7. 在例行性命令中，使用的兩支 demane 是什麼？
  8. 使用 crontab 這個『指令』的時候，如何可以查看目前的工作與刪除目前的工作？
  9. 常用的 kill 指令之 signal 當中， 1, 9, 15 代表什麼？
來看看解答囉：
請注意：這些解答是 VBird 自己查書或者是實際操作所得到的答案，如果您發現這些答案是『錯誤的』請趕快跟 VBird 聯絡，好讓我將資料趕快的訂正！感謝大家的熱情支持囉！
一、什麼是 Linux 呢？！
  • 試說明 Unix 與 Linux 的歷史？
    • Multics 系統：由Bell（貝爾實驗室）、MIT（麻省理工學院）與GE（美國通用電器）合作開發的一個系統；
    • 1969：K. Thompson 替 DEC 公司寫了一個簡單的 file system 系統，此為 Unix 的前身，但是 Unix 一詞尚未出現
    • 1973：由 Bell 的 D. Richie 以 C 語言改寫了 Thompson 的小系統，全部以 ASCII 檔案進行改寫，方便於應用！此時為第一次出現 Unix 這個作業系統的名詞，不過，由於 Unix 乃針對不同的硬體而設定，因此僅出現在大型的 Server 上面看到！經過數年後，有底下幾種版本：
        1. System V 來自於 ATT 公司；
        2. BSD 來自於加州理工學院；
        3. AIX 來自於 IBM 公司
    • 1979：Richard Stallman 倡導 Open source 精神；
    • 1984：GNU 與 Free Software Foundation (FSF)由 R. Stallman 倡導；
    • 1986：Xfree86 出現在 Unix 上面，且在 1994 年整合於 Linux 中！
    • 1991：芬蘭大學生 Linus Torvalds在網路上首次公告 0.02 版的 Linux Kernel ，稱為 hobby。
  • 簡單說明 GNU General Public License （GPL）的精神：
    • GPL 的授權之軟體，乃為自由軟體（Freeware），任何人皆可擁有他；
    • 開發 GPL 的團體(或商業企業)可以經由該軟體的服務來取得服務的費用；
    • 經過 GPL 授權的軟體，其屬於 Open source 的情況，所以應該公布其原始碼；
    • 任何人皆可修改經由 GPL 授權過的軟體，使符合自己的需求；
    • 經過修改過後 Open source 應該回饋給 Linux 社群。
      (PS. Open source 最大的優點為多人維護， debugs 的速度較快，程式亦較為安全，但是缺點則是缺乏『專人』維護！)
  • 什麼是 Linux Distribution？
    基本上 Linux 是在 1991 年由芬蘭大學生 Linus Torvalds 寫的一個核心作業系統，最早僅只是核心而已，後來由於此一核心不但可以適合於主流 PC 的 x86 架構，並且穩定，因此有相當多的團隊加入研究開發，後來某些公司將一些套件加入此一核心中，變成為完整的『安裝光碟』，亦即是 Linux Distribution 了！所以才會有這麼多的 Linux 版本，各版本之間沒有所謂的誰優誰劣，而是個有其優缺點！看你適合哪一款，就用那一款吧！
    開發商針對 Linux Kernel 進行開發，並加入適合該 Kernel 的套件（如 ftp, apache, mail 等等），及配合開發商本身的支援軟體，而製作出來的可安裝光碟即可稱為 distribution。
  • 市面上眾多的 Linux 版本當中，有何異同？
    唯一相同的地方在於 Linux 的『Kernel』，目前 ( 2002/06/29 ) Kernel 發展至 2.4.xx 版本，至於不同點則是 Linux 開發商自行加入或者是研發的軟體。
  • Linu Kernel 的功能：
    • System call interface
    • Process control
    • Memory management
    • File System management
    • Device drivers
    簡單的說，任何跟系統硬體資源有關的都是 Linux Kernel 管轄的範圍，所以編輯核心的時候，將核心編的越小越好！
  • 試說明 Linux Kernel 與使用者之間的相關性？
    硬體<=>Kernel (Modules Loader)<=>Shell ( Terminal or GUI )<=>Users
  • 試說明什麼是 GUI
    GUI 為 Graphical User Interface 的簡寫，即為使用者圖形界面，目前我們在 Linux 上面的 GUI 一般稱為 X-Window ，而其核心為 Xfree86 這個 X-Server ！請注意，這個 Xfree86 最大的功能即是在控制『顯示卡、硬體周邊』等跟 Window 有關的界面，所以 X-Window 無法啟動時，通常是 Xfree86 這個 X-Window 的核心驅動程式設定不完全有關！
  • Linux 的優點：
    最大的優點來自於其良好的資源分配！所以具有：
    • 良好的多人多工環境，資源分配平均；
    • 除了免費之外，線上更新速度快，除錯與安全性均較佳；
    • 為 Open source 的授權，故而具有 open source 的所有優缺點；
    • 網路功能強大。
  • Linux 是多人多工的環境，請問何謂多工(Multitask)與多人(Multiuser)：
    • Multitask 指的是多工環境，在 Linux 系統下， CPU 與其他例如網路資源可以同時進行多項工作， Linux 最大的特色之一即在於其多工時，資源分配較為平均！
    • Multiuser 指的是 Linux 允許多人同時連上主機之外，每個使用者皆有其各人的使用環境，並且可以同時使用系統的資源！
二、Linux 的安裝與認識 Linux 支援的硬體
  • 一般而言， Linux 需要的配備並不需要太高檔，但 Open Linux Server 3.1.1 需要？
    • CPU 需要在 PII, PIII, P4 或 K7, K8 以上等級；
    • RAM 至少需要 64 MB，
    • 硬碟至少 550 MB，全部安裝則需要 1.7GB
  • 什麼是 IDE 界面，一般而言，普通 PC 允許幾個 IDE 界面與裝置？
    • IDE 為用來傳輸硬碟資料的一個彙流界面；
    • 共有 IDE1, IDE2 ，分別有 master 與 slave 所以共四個 IDE 裝置支援！
  • IDE2 的 master 之第一個 logical 磁碟中，其裝置代號（檔案名稱）為何？
    /dev/hdc5
  • 在硬碟分割 (Partition)時，最多有幾個 primary + extended ？
    Primary + Extended 共四個，其中 Extended 通常只有一個！ ( 更詳細的硬碟與 MBR 可以參考 這裡 這篇討論 )
  • 若在分割的時候，在 IDE1 的 slave 硬碟中，分割『六個有用』的磁區（具有 filesystem 的），此外，有兩個 primary 的磁區！請問六個磁區的代號？
    • /dev/hdb1(primary)
    • /dev/hdb2(primary)
    • /dev/hdb3(extended)
    • /dev/hda5(logical 底下皆為 logical)
    • /dev/hda6
    • /dev/hda7
    • /dev/hda8
      請注意，5-8 這四個 logical 相加的總和為 3！
  • 一般而言安裝 Linux 至少要有哪兩個 partition 呢？
    • 根目錄 / (root)
    • 虛擬記憶體 Swap
  • 一般而言，在 RAM 為 64MB 或 128 MB 的系統中， swap 要開多大？
    約兩倍的 RAM ，亦即為 128 MB 或 256 MB ，可獲得較佳效能！
  • 光碟機與軟碟機的代號（裝置檔案名稱）？
    • /dev/cdrom
    • /dev/fd0
  • 網路卡（Network Interface Card, NIC）的代號？
    • /dev/eth0
  • 預設的 Linux 檔案格式為何？又，目前常用的 Journalling 檔案格式為何？
    • Ext2
    • Ext3, Reseifs
  • 安裝 Linux 的主要流程？
    • BIOS（決定由 cdrom 或 floppy 開機，並載入PC硬體資訊）
    • 載入 install kernel loader ：
    • 收集硬體資訊
    • Hard Disk 之 Partition
    • Formation
    • Softpackage 的選擇
    • 開始安裝！
  • 什麼是 GMT 時間？台北時間差幾個鐘頭？
    GMT 時間指的是格林威治時間，為標準的時間，而台北時間較 GMT 快了 8 小時！
  • Tap, SCSI 硬碟, RAID, printer 的裝置代號？
    • Tap : /dev/ht0 (IDE), /dev/st0 (SCSI);
    • SCSI H.D.: /dev/sd[a-p],
    • RAID : /dev/md[0-15];
    • printer : /dev/lp[0-2]
三、簡易 KDE 的使用( X-Window)
  • 若以 X-Window 為預設的登入方式，那請問如何進入 Virtual console 呢？
    可以按下 [Ctrl] + [Alt] + [F1] ~ [F6] 進入 Virtual console ( 共六個 )；
    而按下 [Ctrl] + [Alt] + [F8] 可回到 X-Window 的 desktop 中！
  • 如何修改進入 Linux 時候的 run-level ？又 run-level 0, 1, 3, 5 各代表什麼意思？
    • 修改 /etc/inittab 裡頭的設定即可；
    • 0：重新開機(如 init 0 )；
      1：單人維護模式，沒有網路功能；
      3：純文字介面登入，多人多工環境；
      5：X-Window 登入模式，多人多工模式。
  • XFree86 在 X-Window 中的角色為何？
    基本角色是控制顯示相關硬體的核心角色，也可以說程式 X-Window 的 Server ，此外， KDE 這個 Window management 則是 X-Window 的 Client 呦！因此， XFree86 若死掉了，那麼 KDE 就無法被啟動！
  • XFree86 的主要設定檔在哪裡？
    就是在 /etc/X11/XF86Config-4 這個檔案！
  • KDE 預設提供多少個 Virtual desktops ？
    預設是提供四個，就是在進入 KDE 之後，最下方的 bar 上面有 1,2,3,4 那個字樣的那個咚咚！
四、線上求助 ( Help )
  • 在 Linux 系統中，安裝的套件 (RPM安裝) 預設的文件資料放在那個目錄底下？
    /usr/share/doc
  • 查看 Linux 系統的線上求助可以使用什麼指令？
    man command
    info command
  • 使用 man 來查詢線上求助的時候，若要查詢類似參數檔(如/etc/passwd)需如何？
    man 5 passwd 或是例如 syslog.conf 則： man 5 syslog.conf 那個 5 即是大部分的 config 檔案的查詢。
  • 使用 man 查詢 command 的所有相關指令時，需要下什麼參數？
    man –k command 例如 man –k passwd
  • man page 的 man path 變數，記錄在那個檔案中呢？！
    /etc/man.conf
五、vi 的使用
  • 在 linux 底下最常使用的文書編輯器為 vi ，請問如何進入編輯模式？
    • 在一般模式底下輸入： i, I, a, A 為在本行當中輸入新字元；（出現 –Insert- ）
    • 在一般模式當中輸入： o, O 為在一個新的一行輸入新字元；
    • 在一般模式當中輸入： r, R 為取代字元！（左下角出現 –Replace-）
  • 如何由編輯模式跳回一般模式？
    [Esc]
  • 若上下左右鍵無法使用時，請問如何在一般模式移動游標？
    h, j, k, l
  • 若 [pagedown] [ pageup] 在一般模式無法使用時，如何往前或往後翻一頁？
    [Ctrl] + [f]
    [Ctrl] + [b]
  • 如何到本檔案的最後一行、第一行；本行的第一個字元、最後一個字元？
    G, 1G, 0, $
  • 如何刪除一行、n行；如何刪除一個字元？
    dd, ndd, x 或 X （dG 及 d1G 分別表示刪除到頁首及頁尾）
  • 如何複製一行、n行並加以貼上？
    yy, nyy, p 或 P
  • 如何搜尋 string 這個字串？
    • ?string (往前搜尋)
    • /string (往後搜尋)
  • 如何取代 word1 成為 word2，而若需要使用者確認機制，又該如何？
    • :1,$s/word1/word2/g 或
    • :1,$s/word1/word2/gc （需要使用者確認）
  • 如何讀取一個檔案 filename 進來目前這個檔案？
    :r filename
  • 如何另存新檔成為 newfilename？
    :w newfilename
  • 如何存檔、離開、存檔後離開、強制存檔後離開？
    :w； :q： :wq； :wq!
  • 如何設定與取消行號？
    :set nu
    :set nonu
六、檔案與目錄管理
  • 請問底下的目錄與主要放置什麼資料？
    • /etc/：幾乎系統的所有設定檔案均在此，尤其 passwd, shadow
    • /etc/rc.d/init.d：系統開機的時候載入服務的 scripts 的擺放地點
    • /boot：開機設定檔，也是預設擺放核心 vmlinuz 的地方
    • /usr/bin, /bin：一般執行檔擺放的地方
    • /usr/sbin, /sbin：系統管理員常用指令集
    • /dev：擺放所有系統裝置檔案的目錄
    • /var/log：擺放系統登錄檔案的地方
  • 『舊的』 Unix 系統與 Linux 系統的『檔名』最多可以容許幾個字元？
    14, 255
  • 什麼是絕對路徑與相對路徑，要由 /usr/share/doc 進入到 /usr/share/man 由相對路徑與絕對路徑的寫法各為何？
    • 絕對路徑絕對由 / 開始寫起，相對路徑則非由 / 寫起；
    • cd /usr/share/man ; cd ../man
  • 在非為根目錄的任何一個目錄中，下達 ls –al 時，均會有『.』及『..』這兩個目錄，請問分別代表什麼？
    • . ：代表本目錄
    • .. ：代表上層目錄
  • 顯示、變換目錄的時候，使用什麼指令？
    ls, pwd 為顯示； 變換目錄用 cd
  • 新增目錄、移除目錄移動目錄與拷貝目錄有什麼指令可用？
    • 新增： mkdir 目錄,
    • 移除： rmdir 目錄(但是該目錄內必須要已經清空了), rm –rf 目錄,
    • 移動： mv directory1 directory2
    • 拷貝： cp –r directory1 directory2
  • 如何查看一個檔案的『內容』（不要使用 vi 的情況下）
    cat, tac, more, less, head, tail, nl, od(查看二進位制)
  • 什麼是 hard link 與 soft link 的檔案？有何不同？
    • Hard Links：在做成 hard link 檔案時，系統會佔用掉一個 inode ，由連結檔案可發現其 link 欄位多使用了一個 inode ，當原始檔案被刪除的時候，該原始檔案的內容將繼續保留在其他的 Hard Links 檔案中；但所有 Link 佔用的硬碟總量僅佔一個檔案的容量大小！(但 Hard link 不能連結不同 filesystem 的檔案)
    • Soft Links：類似捷徑，當原始檔被刪除，soft link 檔案將找不到原始檔了！
  • 如何在 root 的家目錄下建立一個 /bin 的連結捷徑
    ln –s /bin /root/bin
  • 若有一個連結檔為 testing 連結到 test1.sh ，請問 copy testing 到 /tmp 底下，『cp testing /tmp』則 /tmp/testing 這個檔案會是：(1) 連結檔，連結到 test1.sh ；(2) 一般檔案，為內容與 test1.sh 相同？
    答案為 (2)
  • 當一個檔案屬性為 –rwxrwxrwt 則表示這個檔案的意義為？
    任何人皆可讀取、可寫入，但是不可刪除該檔案(或目錄)，除了 root 與檔案或目錄擁有者有權可以刪除。
  • 我需要將一個檔案的屬性改為 –rwxr-xr-- 請問該如何下達指令？
    chmod 754 filename, chmod u=rwx,g=rx,o=r filename
  • 在 /usr/bin/passwd 這個檔案的屬性為 –r-s--x--x 請問代表什麼意思(s)
    那個 s 代表為 SUID ，當使用者使用這個檔案進行工作的時候，將會具有該檔案擁有者的權限！
  • 如何改出 –rwxr-sr-x 與 –rwxr-xr-t這個屬性？
    chmod 2755 filename, chmod 1755 filename
  • 如何查看一個檔案的類型 (type) 例如純文字檔、執行檔與 setuid 檔案等？
    file filename
  • 若一個使用者的 umask 為 033 ，請問他建立一個新的目錄與檔案時的預設屬性為？
    • 目錄：744 ? -rwx-r--r--
    • 檔案：633 ? -rw--wx-wx
  • 若我需要更改一個檔案的擁有者與群組，該用什麼指令？
    chown, chgrp
  • 如何將一個檔案的修改日期改成目前的時間？
    touch filename
  • 如何搜尋一個檔案？
    which (僅用於指令搜尋), whereis, locate, fine
  • Linux 預設的檔案系統為何？此外，常用的 Journalling 檔案格式有哪些？
    Ext2, Journalling 有 ext3 及 Reiserfs 等
  • less 跟 more 有什麼不同？
    less 可以翻頁，但是 more 不行！
  • 在比較兩個檔案的異同時，常使用的是 diff 與 cmp ，請教兩者有何不同？
    diff 為一行一行比較， cmp 為一個字元(character)一個字元比較
六.1、磁碟掛載與虛擬記憶體問題
  • 我要如何查看 Linux 系統當中所有已經掛載的硬碟容量與 inodes ？
    df –k, df –i,
  • 我要如何查看目前所在目錄的所有檔案佔用的硬碟空間，此外，如何僅輸出結果？
    du -k, du –i, du -s
  • 如果磁區 /dev/hda3 有問題，偏偏他是被掛載上的，請問我要如何修理此一磁區？
    umount /dev/hda3
    fsck /dev/hda3
  • 承上題，那麼有問題的檔案將被移動到那個目錄下？
    lost+found
  • 試說明新增一個 partition 在 /dev/hdb 當中，且為 hdb5時，並掛載上 /disk2 ，需要哪些步驟？
    • fdisk /dev/hdb 按 n 新增，按 e 新增 extended ，再按 n 新增 logical
    • mke2fs –b 2048 /dev/hdb5
    • mkdir /disk2
    • mount –t ext2 /dev/hdb5 /disk2
  • 如何新增加 64MB 的虛擬記憶體 swap ？
    • dd if=/dev/zero of=/tmp/swap bs=4k count=16384
    • mkswap /tmp/swap
    • swapon /tmp/swap
  • 如果要設定一個新掛載上的磁區，令他可以在開機的時候被掛載上，應該編輯哪一個檔案？
    • 先 /etc/fstab
    • 再 mount –a
  • 簡易說明 quota 的設置流程？
    • 編輯 /etc/fstab， 加入 usrquota and/or grpquota
    • reboot
    • quotacheck –avug (會產生 aquota.user(group))
    • quotaon –aug
    • edquota –u username
    • edquota –g groupname
    • repquota –vu /dev/hd[a-d][1-16]
七、BASH SHELL
  • 簡單說明 bash shell 的功能特徵：
    • 命令記憶功能 ~/.bash_history
    • 命令別名功能 alias
    • shell scripts 功能
    • 命令與檔案名稱補全功能 <tab>
    • 工作控制功能 jobs
  • 在設定變數中，主要的規則為何？
    1. 變數與變數內容以等號來連結；
    2. 等號兩邊不能直接接空白字元；
    3. 變數名稱只能是英文字母與數字，但是數字不能是開頭字元；
    4. 若有空白字元可以使用雙引號『 " 』或單引號『 ' 』來將變數內容結合起來，但須要特別留意，雙引號內可以保有變數，但是單引號則僅為一般字元；
    5. 必要時需要以跳脫字元『 \ 』來將特殊符號（如 Enter, $, \, 空白字元, ' 等）變成一般符號；
    6. 若該變數為擴增變數內容時，則需以雙引號及 $變數名稱如：『 "$PATH":/home』繼續累加內容；
    7. 若該變數需要在其他子程序執行，則需要以 export 來使變數可以動作，如『export PATH』；
    8. 通常大寫字元為系統預設變數，自行設定變數可以使用小寫字元，方便判斷（純粹依照使用者興趣與嗜好）；
    9. 取消變數的方法為：『unset 變數名稱』
  • 顯示環境變數與所有變數的指令為何？
    env, set,
  • 在環境變數當中，『使用者家目錄、主機名稱』的變數名稱為：
    HOME, HOSTNAME
  • 如何讓一個變數可以持續到下一個程序 (PID) 去？
    export variable
  • 在變數的設定當中，雙引號與單引號有何不同？
    雙引號裡面可以包含變數，單引號謹代表一般字元！
  • Command1 `command2` 這個指令代表什麼意思？
    在這一行當中， command2 會先執行，而輸出的結果會給 command1 當作參數。
    cd /lib/modules/`uname -r`/kernel 是最常使用的一例
  • 在命令重導向當中， > 與 >> 有什麼不同？
    > 會將導向的 file 覆蓋，
    >> 則是增加！
  • 若要將錯誤的輸出導向『不見了』的裝置，該如何是好？
    command 2> /dev/null
  • 在管線指令中，我要將 last 輸出的結果顯示 root 的『登入次數』， 如何做？
    last | grep root | cut –d “ “ –f 1 | wc -l
  • 如何設定一個變數名稱為 name ，使其顯示為『 VBird’s testing variable. 』？
    • name=VBird\’s\ testing\ variable.
    • name=”VBird’s testing variables.”
    • echo $name
  • 請問 bash shell 的環境變數與自己的個人變數可以登入便設定的檔案？
    • Open Linux：
      /etc/profile, /etc/config.d/shells/bashrc, ~/.profile, ~/.bashrc,
    • Red Hat ：
      /etc/profile, ~/.bash_profile, ~/.bashrc,
  • 如何查詢曾經操作過的指令？如何執行第 26 個操作過的指令？上一個操作過的指令？
    • history
    • !26
    • !!
  • 如何設定命令別名？使 lm 與 ls –al|more 功能相同
    alias lm=’ls –al|more’
  • 如何將 /bin 的所有資訊輸出到 /home/testing.dat 這個檔案？
    ls –al /bin 1> /home/testing.dat
  • 在上一題中，若還要輸出到螢幕上，要如何是好？
    ls –al /bin | tee /home/testing.dat
  • 執行 find ，並將正確的結果輸出到 right 而錯誤結果輸出到 error 當中？
    find / -name test 1> right 2>error
  • 如何在指令列模式中將 /root/.bashrc 的資料加在 /home/col/.bashrc 當中？
    cat /root/.bashrc >> /home/col/.bashrc
  • 不要顯示執行的結果要如何是好？
    command > /dev/null 2>$1
  • 列出這個月曾經登入主機的使用者資訊即可，不需要重複？
    last | cut –d” “ –f1 | sort | uniq
  • 萬用字元當中， *, ?, [] 各代表什麼意思？
    • * 代表 0 到無限多個字元；
    • ? 代表一個任意字元；
    • [] 代表一個字元，這個字元在某一個限制範圍內。
七.1、SHELL SCRIPTS
  • 什麼是 shell scripts ？ scripts 有何功用？
    • 簡單的說， scripts 就是一個內部含有多個或複雜的 command 的純文字檔案；
    • scripts 可以進行 program 的功能，但速度上較 C 慢了點！
  • 要撰寫可以經由鍵盤輸入的 scripts 時，常使用到的指令？
    read variable
  • 在 shell script 當中，在控制式中， && 與 || 代表什麼意思？
    分別代表『和(同時成立)』及『或(僅其一成立就成立)』的意思！
  • 在使用迴圈的時候，常使用到的控制式為哪三個？
    for, while, until
  • 執行 scripts 的方法有哪兩種？
    • 使用 sh script 或
    • 以 chmod 增加 scripts 的屬性為可執行， chmod 777 script 並執行 scripts。
  • 如何宣告一個變數成為整數型態？
    declare -i variable
  • 為何在 shell script 前面都要宣告 shell 呢？
    宣告 shell 方能讓 script 瞭解該內容需要以何種 shell 來執行！目前 Linux 通常宣告 /bin/bash 這個 shell ，然而若在非 shell 環境中，又沒有宣告 shell 類型時，可能會造成 script 無法執行的情況。
  • 在判斷式中，如何判斷一個檔名是否存在？
    if [ -e filename ] 若存在則回傳值為真！
  • 在執行一個 scripts 時，在 scripts 內的變數， $0, $1 代表什麼？
    • $0 代表 scripts 的檔名；
    • $1 代表第一個 parameter，例如 /etc/rc.d/init.d/xinetd start 那個 start 的變數即為 $1
  • 若要寫一個既定的 parameter （如 start ），用哪一個判斷式較簡單？
    可以使用 case …. Esac 的語法較為簡單。
  • 如何印出目前系統中的所有帳號，並加以排序且輸出到 /tmp/account 中？
    cut -d ‘:’ -f 1 /etc/passwd | sort > /tmp/account
  • 如何在不執行 scripts 的情況中 debug ？
    sh -n scripts
八、基本帳號管理
  • 如何新增一個使用者 username，且該使用者沒有家目錄？
    useradd -M username
  • Linux 使用者的帳號、密碼與群組的名稱檔案放在哪裡？
    • /etc/passwd
    • /etc/shadow
    • /etc/group
  • 建立新使用者的預設家目錄內容在那個目錄中？
    /etc/skel
  • 建立一個新使用者時，其使用到的相關檔案有哪些？
    • /etc/default/useradd,
    • /etc/login.defs,
    • /etc/skel/
    • /etc/passwd,
    • /etc/shadow
  • root 的 UID 與 GID 各為何？
    皆為 0
  • 如何讓一個使用者不能登入主機，但是可以收信？
    將 /etc/passwd 最後一欄代表 shell 的名稱改為 /bin/false
  • 試說明一個使用者登入系統的流程？
    1. 登入：使用 /bin/login 程式，並輸入 ID 與 passwd ；
    2. 確認密碼：搜尋 /etc/passwd, /etc/shadow 確認密碼！並取得使用者的相關訊息。
    3. 查核 pam 登入模組：這個需要視主機的設定而定！
    4. 取得並執行 shell ：由 /etc/passwd 取得 shell 之後，並執行 shell ，以 bash 為例，將讀入： /ete/profile ? ~/.bash_profile ( 或 .bash_login 或 .profile ) ? ~/.bashrc ? 登出的時候執行 ~/.bash_logout
  • 在 /etc/shadow 當中的日期設定中，其數字代表的意義為何？
    由 1970 年開始計算，故 1970 年 一月一日為 1 ，2002 年 1 月 1 日為11689
  • 如何變更使用者的一些屬性？
    usermod, chfn, chsh, passwd
  • 如何視察一個使用者 username 所擁有的群組呢？
    groups username
  • 試說明如何手動增加一個使用者 username 與群組 groupname？
    1. 先看看 /etc/skel 當中，預設要給 user 的家目錄內容；
    2. 新增 group ： groupadd groupname
    3. 新增 user ：useradd -m -g groupname username
    4. 給予密碼： passwd username
  • 試說明 /etc/passwd 這個檔案的內容與格式：
    帳號; 密碼; UID; GID; 說明的內容; 家目錄; SHELL
  • 使用 id 這個指令時，可以顯示什麼訊息資料？
    UID, GID 跟 GROUP
  • 可以控制使用者使用主機資源的預設檔案在哪裡？
    /etc/security/limits.conf
  • 基本的壓縮指令有哪些？
    tar, gzip, compress
九、開機程序
  • 試說明開機流程：
    1. BIOS
    2. MBR ( boot loader )
    3. Loader ( lilo or grub, stage 1 and stage 2 )
    4. Kernel loader ( /boot/vmlinuz )
    5. init process ( 讀取 /etc/inittab 取得 run-level )
    6. 開始執行 /etc/rc.d 內的 scripts
    7. 執行 /etc/modules.conf 內部的額外 kernel 模組
    8. 執行 /etc/rc.d/rc[1-6].d 的這些 run-level 內的 scripts ！
    9. 執行 /bin/login 等待使用者登入！
  • 開機時後的載入訊息可以看哪裡？
    dmesg
    grep “kernel” /var/log/messages
  • 改變 run-level 或關機的指令
    shutdown,
    halt,
    reboot,
    init or telinit
  • 改變登入 Linux 時候預設的 run-level 要改那個檔案？
    /etc/inittab
十、程序與資源管理
  • 如何查看目前的程序？
    ps, top,
  • 如何查看目前的記憶體使用狀況？
    free, top,
  • 目前的工作如何丟到背景中？
    [Ctrl] + z
  • 如何取得目前背景中的工作，且將他拉回前景中？
    jobs 及 fg %number
  • 如何設定一個程序在開始執行時候的優先值？
    nice –n [number] [command]
  • 什麼指令可以修改一個正在執行的程式之 nice 值？
    top, renice
  • 在例行性命令中，使用的兩支 demane 是什麼？
    atd,
    crond
  • 使用 crontab 這個『指令』的時候，如何可以查看目前的工作與刪除目前的工作？
    編輯： crontab –e,
    查看： crontab –l,
    刪除： crontab –r
  • 常用的 kill 指令之 signal 當中， 1, 9, 15 代表什麼？
    • 1 重新讀取一次 config file
    • 9 強制刪除此一執行程序
    • 15 terminal結束的意思！
2002/06/29 以來統計人數


學習 Linux 基礎文件
註：這裡的文章都很舊了！請前往 Linux 基礎篇 學習 Linux 的基礎呦！
最近更新日期：2001/11/04
簡易基礎篇
寫在前面 | 一開始總是要對 Linux 的起源做一些介紹的吧！然後再建議 Linux 的學習方法等等的。Linux 最早是由 Linus Torvalds 所寫出的第一套類 Unix 的核心程式，經由不斷的開發才有今日的規模。不過，由於於開發者眾多，所以導致有很多不同的 distribution 版本！.....
安裝之前 | 是否準備要安裝 Linux 了呢？別急別急，總是得知道一下你所要安裝 Linux 的硬體（硬碟、CPU、RAM尤其是 VGA）是否可以被 Linux 的核心支援呢？所以你得先瞭解何種硬體設備適合 Linux？如何規劃硬碟？如何取得 Linux 光碟.....
簡易的安裝程序 | 好了，開始來安裝吧！實地進行硬碟劃分，本文並以 Windows98 及 Linux 並存的架構進行 Linux 的安裝，同時並以 SPFdisk 介紹硬碟劃分的方法.....
開機關機多重開機 | 終於安裝好 Linux 了，也可以開機了，但是要怎樣進入你的 Linux 系統呢？這裡提一提第一次開機、關機如何登入你的 Linux 主機；同時並教導如何設定多重開機選單.....
檔案配置與檔案系統 | 當你第一次進入 Linux 系統中，看到的一大堆文字，在沒有看過 DOS 年代的人們眼中可真是恐懼呀！這裡帶你瞭解 Linux 的路徑各有何用途？ Linux 檔案共有多少屬性？
常用的 Linux 指令 | OKOK！那接下來要怎樣在 Linux 的文字介面中下達指令給 Linux 幫你執行呢？這裡有最簡單的察看檔案、壓縮解壓縮、郵件傳送等等指令的說明....
文書編輯器 vi | 文書編輯軟體在 Windows 下有 word ，在 Linux 下就是 vi 啦！
X-Windows 的使用 | 如何建立 X-windows 的 XFree86 server 系統？如何修改視窗呢？然後，如何讓你的 NVidia 的顯示卡被 Linux 支援呢？
Linux 套件升級 | 如果使用了舊版的 RedHat 而要更新至新版的套件，是否需要重新安裝新版的 RedHat 呢？這裡告訴你如何升級你的套件！
進階篇：編譯核心 | 如果你是玩家的話，想對 Linux 有進一步的瞭解，一定要編譯過核心才行！當然，如果你只是要讓 Linux 當成你的 NAT 主機，那一輩子不用編譯也沒關係，所以這裡定義為進階篇！這裡教你編輯一個適合你的 Linux 核心，並且設定新舊核心及 Windows 共存的多重開機！
例行性命令的建立 | 如果你每天或每個月需要在特定的某一時刻執行一些程式的話，該如何設定？
2002/ 01/01以來統計人數


學習之前
最近更新日期：2001/07/03
  • Linux 的來源：是由一個芬蘭人 Linus Torvalds 於 1991 年 10 月開發出第一個核心之後，逐漸發展形成目前的情況。而由於他所發展的核心以 Unix 為基準去寫的，所以也就通稱叫 Linus's unix （Linux）。另外， Linux 是以 GPL（General Public License）的方式發表的，也就是 Linux 是開放性的，隨時可以由網路上下載其原始程式碼。只是當你修改 Linux 的原程式後，亦應該公開你的程式碼！
  • Linux 是最近幾年來最受矚目的作業系統之一，他會受到矚目的原因主要是因為他是『free』的，就是免費的作業系統啦！然後他是開放性的系統，也就是你可以隨時的取得程式的原始碼，這對於程式開發工程師是很重要的！而且，雖然他是免費的，不過功能卻很強大！另外， Linux 對於硬體的需求是很低的，這一點更造成他流行的主因，因為硬體的汰換率太快了，所以很多人手邊都有一些很少在用的零件，這些零件組一組就可以用來跑 Linux 了，反正做一個工作站又不用使用到螢幕（只要主機就可以囉），因此 Linux 就越來越流行囉！（插個嘴，也就是因為 Linux 具有 1.硬體需求低、 2.架構開放、 3.系統穩定性及保密性工能夠強、 4.完全免費，所以造成一些所謂『反微軟聯盟』的程式設計高手不斷的開發新軟體！以與 Microsoft 進行抗衡！）
  • 雖然 Linux 具有這樣多的好處，但是他先天上有一個足以致命的地方，使他的普及率受到很大的限制，就是 Linux 需要使用 『指令列』 的終端機模式進行系統的管理！雖然近年來有很多的圖形介面開發使用在 Linux 上面，但畢竟要熟悉 Linux 還是以指令列來使用是比較好的，因此要接受 Linux的玩家必須比較要能熟悉對電腦下指令的行為，而不是用滑鼠點一點 icon 就行了！不過如果只是要架一些簡單的小站呢？是不是大家都可以做的到？沒錯！其實只要對 Linux 做一些小小的設定就可以架站了，這也是我寫這個網頁的目的！如果你從來都沒有摸過 Linux 這個咚咚，那也沒關係，只要照著以下的步驟一步一步走下去，應該也可以架設完成屬於你自己的網站的。
  • 我做這個小站的目的在於讓大家可以輕易的就架設一個簡易的 LinuxServer 來使用，所以文中並沒有很有效的防火牆篇幅，因此，這個站裡面的所有文件均不太適用於小規模以上的企業部門，僅適合一般家庭架設的網站，因為這裡的技術文件保密性都不高....。不過，若您只是要架設一個 Mail server、FTP Server、Web Server 、NAT Server 等等的小站在自己家裡的話，這裡的文件應該還是挺合適的喔！
  • 話雖如此，但是一些基本的概念還是必須要有的，例如最基本的『電腦硬體配備』、『IP的分配與TCP/IP』的一些概念最好是有的，而且，具備簡易的 DOS 概念也是必須的....
聰明學習
  • 我摸 Linux 只不過才一年，雖然架了幾個小站在自己實驗室及自己家裡，但是對於 Linux 實在還是不懂，所以看不懂我這個小站裡的資料的話，應該就是我不對啦！果真如此的話，歡迎替我指正，我會很樂意的接受的。因為我也是從完全不懂，在網路上問人家時，一些高手還有點替我擔心，有的則是認為我問的問題太白爛而不願意回答我.....，不過大部分的同好還是很樂意的會回答您提出的問題的。
  • 所以，要學習 Linux 的話，一定要常上網站去看看有沒有新的文件，然後在看一些技術文件的時候千萬不要覺得麻煩，多看幾遍給他看懂，這對你的學習一定會有所幫助的，尤其是基礎的IP協定與一些基礎的執行程式！
  • 給新手的建議：這裡有一個給新手建議的 BBS 精華篇，建議你可以來看一下，他有大略的提及需要注意的事項呀！
  • 如果你需要知道『電腦基礎』的話，這裡有一篇已經寫得很詳細的資料，他是在 study area 的網中人寫的，去看看吧！
  • 如果你需要知道『IP基礎』的話，這裡也有一篇網中人寫的資料，相當的棒！
給他版權宣告一下
在這個網頁之下的文章中，絕大部分均是鳥哥自己的經驗，或者是查一些書籍之後所寫成的，不過，也有部分文章是來自於網路上的其他相關資源網站，當然，對於鳥哥所引用的文章，鳥哥理所當然的定然會註明文章之出處的。由於我並沒有想要營利的意思，所以這裡的文章在非營利的情況下都可以隨意引用，不過請註明一下出處喔！謝啦！
2002/ 01/01以來統計人數


在實際的安裝 Linux 之前，有些事情.......
最近更新日期：2001/07/17
雖然說簡易的 Linux 安裝及設定並不很難（如果不涉及繁雜的企業網路架構，及為了避免駭客入侵而設置的強大防火牆），但是你也總得知道一下要安裝 Linux 之前的一些前置作業吧！有哪些需要注意的事情呢？
  1. 認識你的硬體配備；
  2. 選擇所需要的 Linux 來源（distribution）；
  3. 你要用 Linux 做啥？功能有哪些？
認識硬體：
基本上 Linux 所需要的硬體資源是很低的，只要你有 Pentun-133 以上等級的機器就可以跑得很順暢囉！所以，若你手上有升級後要汰換的設備，千萬別急著丟掉，可以嘗試著組裝一下，然後來玩玩 Linux 呀！

不過，也由於 Linux 是近來才崛起的梁山泊好漢，所以他可以支援的硬體相對的是比 Windows 少上很多的！如果你手上的設備是很舊（老古董的兩倍數光碟機...），或者很新（最新的 Pentun-4，還有 Geforce 3等等的設備）的咚咚，是非常有可能無法進行 Linux 的安裝的！因此，你需要瞭解一下你的硬體。要瞭解你的硬體是否被 Linux 支援，你可以到下面這個網站上去看看，相信會有所幫助的！

  • 台灣 Linux/FreeBSD 硬體支援資料庫

建議的硬體配備：
如果你只是需要 Linux 來做 NAT 功能的主機，也就是類似『IP分享器』 的功能的話，而且用這台 NAT 主機的 PC 數並不多，那你只需要 Pentun-166, 32MB RAM, 及一塊不太特殊的顯示卡及網路卡也就夠了！當然，硬體的需求與你服務的對象多寡是有相當的相關性的！大致的需求如下：
  • CPU（微處理器）：Pentun-166 以上等級就可以了。不過強烈建議 K6-2 300 以上等級的CPU，（不過，這個網頁的目的中還不用使用到 PIII 以上等級的就是了！）當然了，CPU的等級是與你舊有的主機板相容程度是有相關性的；
  • RAM（記憶體）：32MB 以上。其實除了 CPU 之外，在 Linux 系統中最重要的應該是記憶體的大小了，因為如果你的服務開得太多，而你的記憶體不夠大，勢必要使用類似 Windows 的『虛擬記憶體』的東西，這東西可操硬碟的緊！所以雖然記憶體的需求是 32MB 就可以了，不過強烈建議最好是有 64MB 以上比較好，尤其是如果你還要玩 X-Window的話！
  • Harddisk（硬碟）：最好有 2GB 以上。當然是越大越好，最好至少為 3GB 的硬碟！
  • VGA（顯示卡）：最好是 S3 早期的顯示卡。 Linux 對於最新的顯示卡支援的並不是很足夠，而且通常我是建議人家使用淘汰的零件當主機使用，並且如果你又不玩 X-Window 的話，一塊 1MB 記憶體的 S3-775 顯示卡就夠了！重要的是， Linux 對於 S3 舊的 VGA 卡（如 Virge 系列）支援的程度相當的成熟，所以我推薦他！
  • NetCard（網路卡）：一塊極其普通的 10/100 MB 的網卡就可以了，我是建議用具有 RTL8139或者是NE2000相容的晶片的網卡，因為 Linux 本身就有支援，不用再額外加掛驅動程式！強烈的建議使用 Realtek RTL8139 晶片的 PCI 介面網路卡，例如勁駒的網路卡，便宜又蠻好用的！
  • 光碟、軟碟、鍵盤與滑鼠：不要太舊的就可以了。（基本上除了鍵盤之外，其他的裝置都是非必備的，以鳥哥為例，在安裝 Linux 的時候先拿別部電腦的光碟機、軟碟機與滑鼠來安裝，等到安裝完畢之後，關機，將所有的裝置拔掉，只要剩下硬碟與電源供應器就可以啦！，等到所有的設定都完成之後，連螢幕都可以搬走了！剩下的 Linux 會自動搞定！因為通常伺服器這東西就是平時沒事不要去動他是最好的！）
所需要的 Linux distribution：
由於 Linux 只是一種系統核心，要搭配其他的元件才能作很多的動作，然而由於開發者的不同，產生很多種不甚相同的作業系統（雖然都是 Linux），各作業系統是各有各的好，我們也不用去評論他，目前我是使用 Redhat 這一個 distribution。那去哪裡下載這些程式呢？在下列的各 FTP 站中都有提供下載，不過一個檔案都要 600MB 以上，而且因為提供的是 ISO 檔（也就是燒錄後的檔案）所以也要有燒錄機才行！在下列的 FTP 站中，進入 RedHat （或 distribution）目錄，找 iso 目錄，這個 iso 目錄下的咚咚（通常檔名是 *.iso 檔）就是 Redhat 的光碟資料啦！目前 Redhat 已經出到 7.X 版了，而且在安全的防護上也越來越強！不過，個人還是比較偏好 Redhat 6.1 版這個介面，所以我們的範例大多以 6.1 版來做說明！
  • ftp://ftp.nsysu.edu.tw/pub/Linux
  • ftp://ftp.csie.ncu.edu.tw/OS/Linux
  • ftp://ftp.nctu.edu.tw
因為在這個網頁中我是使用 Linux RedHat 6.1 版本為範例（因為懶得再去下載最新的咚咚），所以我也提供下載的檔案在這裡，這個檔案是以 Nero 燒錄程式燒成的，所以你可以由 Nero 燒錄完成可開機光碟！
當然囉，目前市面上關於 Linux 的書籍很多，其中均會附上 Linux 的可開機光碟，那也是一種取得的方法！
你要的服務種類與硬碟規劃：
通常一般人架設 Linux 都是為了架站，這個網頁的目的也是，所以這時你要想一想你所要開放的服務有哪些（所謂的服務就是你這部 Linux 主機的功能啦）？最常見的服務有：mail server 、 www server 、 FTP server 、 NAT server 等。如果你只是要使用在你家裡（以鳥哥為例，小弟家中連同主機共有四部電腦），而需要的項目僅有、NAT server、Mail server 及 Web server，那所需要的硬體需求則真的是很低啦！上面提到的最低配備硬體就已經很足夠了！不過，若你想要使用在小型的區域網路內（可能服務的電腦數有20台以上），由於當用戶端同時連上來的時候，系統會非常的忙碌，因此就需要比較大的記憶體及比較好的運算能力之 CPU 了！

打造 Windows 與 Linux 共存的環境：但是因為一般硬體對於 Windows 的支援度比較足夠，你也希望這架機器在不使用 Linux 的情況下還能以 Windows 系統作業，這時你就需要使用多重開機選單了！ Linux 本身就附上一個很不錯的多重開機程式，叫做 LILO ，如果你需要兩個以上的作業系統在你這台主機上的話，例如 Windows98 與 Linux 共存，那你必須先安裝 Windows98 再灌 Linux 系統就可以了！ 不過這涉及硬碟規劃的問題，如果你的硬碟有 6GB ，那你可以先以 DOS 的 Fdisk 或其他的分割程式如 SPFdisk 進行硬碟的劃分。僅割出 Windows 要的磁區就好。例如你要分 1GB 給 windows ，那以 Fdisk 分割一個 1GB 的主分割就好了！其他的等 Linux 灌的時候再弄就可以啦！這部分我會在後面再提到！這裡不懂沒關係！

鳥哥的範例：
這裡提供鳥哥的主機範例：
  • 硬體：Pentun-166MMX, 64MB RAM, 6GB Harddisk, S3 Virge VGA, RTL 8139 Netcard, 20X CD-ROM ...
  • 系統：提供多重開機（Windows+Linux並存）。 6GB 硬碟中有 1GB 給 Windows98 其他 5GB 為 RedHat 6.1
  • 對外連線： ADSL 浮動式 IP
  • 服務：Mail server, Web server, NAT server, 及 Samba server
2002/ 01/01以來統計人數


簡易 Linux 安裝
最近更新日期：2001/08/12
注意事項
硬碟規劃
SPFdisk 的範例
Linux 安裝流程
本章問題討論：如何移除 Lilo、何謂虛擬IP....

注意事項：
  • 在安裝 Linux 之前，先瞭解一下你為何要安裝 Linux 呢？ Linux 是什麼？ 要如何學習 Linux 呢？
  • 另外，你要瞭解一下，哪一種硬體可以適合 Linux 的安裝？你要安裝哪一種版本的 Linux 呢？ 最主要的，你安裝的 Linux 目的是啥？
  • 在進行 Linux 的安裝之前，必須先知道到一下你的硬體配備與所需要的作業系統。以下我的示範是以 Windows98 及 Linux (RedHat 6.1) 為基準，建立一個多重開機在 6GB 的硬碟上！
  • 再確認一次，我們使用的 Linux 版本是 RedHat 6.1，核心為 2.2.12-20 的穩定版本，以可開機光碟進行文字模式的安裝。
  • 當然囉，再提一下鳥哥的硬體配備：Pentun-166MMX, 64MB RAM, 6GB Harddisk, S3 Virge VGA, RTL 8139 Netcard, 20X CD-ROM ...
  • 由於我需要進行多重開機的設定，然而 Linux 本身的強悍功能可能會讓你的 Windows 沒有辦法在安裝了 Linux 後還能順利安裝完畢，所以這裡要說的是：『請先安裝了 Windows98 之後再安裝 Linux！』，否則等你安裝完了 Linux 之後，要再安裝 Windows 可能要花上好一番功夫囉！安裝流程如下圖所示：
硬碟規劃：
鳥哥的硬碟規劃為： 1GB windows98 + 5GB Linux ，多重開機選單！

先假設你對於硬體的瞭解還算可以（亦即你可以自己將舊的零件組裝成一台新的電腦！），在你將所有的零件組合好之後，就要開始進行你這部主機的作業系統規劃了。由於各軟硬體廠商所開發的驅動程式畢竟還是以微軟的 Windows 系統為主流，而你要確定你的系統有沒有問題時，通常也是使用 Windows 的隨插即用的功能去捉你的硬體。也曾在網路上聽說過，當你的 Linux 硬體設定有問題時，可以在 Windows 中察看其 IRQ 與 DMA 等硬體設定，然後再回到 Linux 中去設定！

另外，再假設你還有其他的小弟小妹可能會來碰你的電腦，你又想將這部電腦在不跑 Linux 時還可以當小弟小妹的打字練習機，或上網瀏覽器使用.....。這樣一來，是否覺得這部電腦有多重系統的設定需要呢？我就覺得有需要！所以在我的主機上我是設計成 Windows98 與 Linux 共存的情況！同時，若僅使用 Windows 作為 Web server 的主機也是有很多的程式可用的！在後面的章節中我也會以 Windows 98 做為主機的情況略做說明！

假設你的舊機子上已經存在舊有的資料，那樣一來你勢必要重新規劃你的硬碟，以符合你要灌的系統需求！這裡我是將我的 6GB 硬碟規劃為兩個磁區，一個是 1GB 給 Windows 使用，一個是 5GB 給 Linux 使用。咦！ Linux 不是不會用到很多的資源嗎？為何要劃分 5GB 給 Linux 使用呢？通常你灌完 Linux 全部的系統需求大約需要 1.2GB ，但是因為我還有設定『代理伺服器』 的服務，這項服務會很耗硬碟空間，所以開的系統是比較大一些的，而且，還有一些預留空間是給『信件』及『網頁空間』與『網路磁碟』使用的空間！此外，這部機器上主要是提供 Linux 主機之用，當然 Windows 的空間就不用太大啦！

註：如果你有的只是1∼2GB的小硬碟，那基本上你可以僅安裝 Linux 即可！那樣的話，佔用的硬碟空間會變的很小！（只要 1GB 即可）

好了，接下來就是使用 DOS 下的 FDisk 程式或是國人開發的 SPFdisk 程式進行硬碟的分割了！這裡假設你已經會使用 DOS 或是 SPFdisk 的程式進行硬碟分割，所以將硬碟分出主分割區 1GB 及未分割區為 5GB ，在這一個部分只有一個地方需要注意，『若您的硬碟很大（例如現在的 30GB 硬碟），由於開機系統區並不支援在 1023 磁區以外的硬碟磁區，所以在分割的時候要先注意一下你要將系統開機磁區放置的區域是哪一個！！！』

Fdisk 的範例：若您還不會使用 fdisk 的功能，可以按這裡看一個範例（使用 1.2GB 的硬碟作為範例分割成兩個主要分割區）。

Windows98：
好啦！硬碟終於分割好啦，那接下來要做的就是灌 Windows98 啦！說實在的，玩個人電腦的朋友們， Windows98 不灌個幾十遍以上是不可能的，因為 Windows98 有個別名叫做『暈倒九八』，就是要灌到暈倒 98 次以上才會成精！哈哈！當然這是個笑話，不過這個笑話裡隱藏了一個很大的問題，就是 Windows98 或 Windows ME 的不穩定性。當然了，如果你對於 Windows2000 或 Windows NT 有興趣的話，那你可能會說『微軟出的東西不錯呀！』就連玩硬體的玩家都知道的『湯姆的五金店』對於微軟這款 Windows2000 都讚譽有加，不過湯姆的五金店中也說了，微軟根本不希望 Windows2000 可以賣的好，因為如此一來使用 Windows 的客戶將不想要再繼續升級其作業系統，因為 Win2000 實在是太穩定了，那微軟賺啥？？？這或許是上述這個網站對於微軟過去行為的不諒解，不過也可以說明在個人電腦上使用的 98 核心的不穩定性了！

說到這裡實在是有點離題，好，回歸主題！ Windows98 在 1GB 的硬碟空間要灌到怎樣的地步呢？其實只要能開機就可以了！因為後續的安裝可以在你 Linux 系統裝完之後再繼續安裝，因為 Linux 安裝完畢之後，你的這部機器就可以使用多重開機了，當然 Windows 既然可以開機當然也可以繼續他未完成的安裝啦！

話雖如此，不過最好還是能把一些常用的執行程式也一起灌好，尤其是網路卡的安裝與連線程式的安裝！因為這一台 PC 是要被當成主機使用的，不用說，其網際網路的連接一定是主要的功能，所以當然你要先確認在比較容易以圖形介面安裝的 Windows 介面下，隨插即用的配備均可正常運作！而以撥接網路或 ADSL 撥接或固定制網路系統或校園網路系統.....不管何種連接上網路的系統，你要先確認所有的運作是正常的！這樣就可以了！

安裝 Windows98 的過程我就不多說了，主要是先以 98 製作的開機片開機並驅動光碟機，放入原版的 98 光碟後打入
C:>setup /is （如果你已經格式化好硬碟了）

/is 這個參數是令 Windows 不要去檢查硬碟的指令。然後就按照螢幕上的指示一步一步的安裝吧，照你機器的速度，安裝大約需要30分鐘以上的時間，泡個茶去看個電視再回來吧！

Linux：
    OK！Windows 終於安裝完畢了，開始進入 Linux 的安裝囉！準備好你的 Linux 光碟吧！什麼？沒有光碟！剛剛不是跟你說過了下載的地方嗎？傷腦筋，來這裡下載吧！然後開始下列的步驟囉！

    簡易流程
    1. 確認 BIOS 是否支援光碟開機；
    2. 以文字模式開始安裝 Linux ；
    3. 安裝流程；

1. 確認 BIOS 是否支援光碟開機：
基本上如果是不太舊的版子都會支援光碟開機的，使用 CD-ROM 開機的好處是比較快，而且也不用再去做 Linux 安裝開機片，確認的方法如下：
  1. 按電源鍵開機；
  2. 在進入系統之前會出現 Del 字樣（每個廠牌不太相同），此時按下鍵盤上的 Delete 鍵；
  3. 進入 BIOS 之後以方向鍵選擇 『BIOS Features Setup』這一項，或者是 『Advanced BIOS Features』，不管如何，反正只要看到 『BIOS Features』字樣的那一項就對了！；
  4. 將方向鍵移動至 『Boot Sequence』 或者是 『First Boot Device』； 這一項，按鍵盤上的『Page Up』 或 『Page Down』 按鍵，選擇 『CD-ROM』 為第一開機順位即可。這裡注意一下，如果你的機器並不支援 CD-ROM 開機的話，你一定找不到 CD-ROM 這一項，這時請製作開機片吧，並將此項調整為『A』 為第一順位；
  5. 按鍵盤上 『ESC』 鍵退出；
  6. 將方向鍵移動至 『Save and Exit』 這一項按 『Enter』 及 『Y』 確認後重新開機即可！
2. 以文字模式開始安裝 Linux：
Linux 的安裝一定要使用 Linux 安裝程式開機片，或者是由 CD-ROM 直接以 Linux 光碟開機，方法為：
  • BIOS可使用 CD-ROM 開機：若是你可以 BIOS 開機，則按照『步驟一』設定開機為 CD-ROM ，然後在開機之前放入 Linux 可開機光碟即可自動開機；
  • 僅能使用軟碟開機：若你的主機無法以 CD-ROM 開機，則你需要在 DOS 介面中製作 Linux 開機片：
    a. 隨便找一台 Windows 電腦，開啟 MS-DOS 視窗；
    b. 將可開機 Linux 光碟放入光碟機中，在 MS-DOS 視窗鍵入：
    C:\WINDOWS> cd E:\dosutils

    上面的 E 為你的光碟機代號；
    c. 在 DOS 提示字元下鍵入：
    E:\dosutils> rawrite -f e:\images\boot.img -d a:

    上面的 e 為你的光碟機代號，這時在軟碟機放入一片空白的軟碟片後，按『Enter』 即可。

OK！在完成上面的步驟之後（不論是何種開機方法），將可開機 Linux 光碟放入你主機的光碟機中，將可開機軟碟放入軟碟機中，按下電源鍵開機，開機完成之後會進入安裝啟始畫面，此時請在提示字元下打 text 然後按 Enter ，便可進入文字模式安裝 Linux 了！

個人是比較偏好文字模式的安裝，因為圖形介面的安裝雖然方便，但是好像常常會有問題，而且當你的主機速度並不快時，圖形介面的安裝會有一點點的慢，所以我是建議使用文字模式啦，以下也以文字模式作為介紹。不過，如果使用圖形介面也是可以的，安裝的順序都相同，只是以圖形的方式呈現罷了！

3. 安裝流程：
    接下來的安裝流程是蠻繁複的，你可要一步一步的慢慢來！
    1. 選擇顯示模式===> 一開始安裝程式要你確認你的安裝模式，你可以在提示字元 boot: 下輸入 『text』 這個即是文字安裝模式，按下 Enter 之後，便會載入 Linux 的一些驅動程式；
    2. 選擇語系=======> 因為沒有中文，所以這裡選擇『English』 按 Enter 即可；
    3. 選擇鍵盤模式===> 同樣是選擇『us』 即可；
    1. 歡迎畫面=======> 按 Enter 即可；
    2. 選擇系統模式===> 這一版的 Linux 提供五種模式選擇，分別是 GNOME, KDE, Server, Custom, 及 Upgrade ，除第五種為升級安裝之外，前面四種最大的不同乃是在其硬碟分割的部分，因為我們是初學者，一開始選擇 Custom 自己分割是比較好的一個方式，所以移動方向鍵至 『Install Custom System』 按 Enter；
    3. 硬碟劃分=======> 『極度重要』再來是最重要的部分『硬碟劃分』，你應該可以看到如下的畫面（圖一），由於 Linux 對於硬碟的觀念與 DOS 並不相同，他是將以前 DOS 下的分槽（C：、D：、E：.....）都看做是一個目錄，所以最重要的當然就是『根目錄』了，因為如果沒有根目錄的話，其他的目錄就無法存在！然後由於虛擬記憶體也是需要的（如果你的記憶體不夠大的話），由於我們的 6GB 硬碟已經分 1GB 給 Windows98 了，所以你可以將我們剩下的 5GB 的空間分 100MB 給虛擬記憶體，而剩下的全部都掛在根目錄 『/』 底下即可；
      如圖一中你會看到一個已經分割好的 DOS 系統，那是之前安裝 Windows98 的咚咚，那一列不要理他，其他的兩列在一開始你並不會看到。然後你還會看到 Device 這個東西， Linux 會自動去偵測你 IDE 介面的硬碟，注意：接在 primary IDE 的 Master 硬碟（就是所謂的 C: 槽）稱為 『hda』，而這個硬碟的邏輯分割就稱為『hda1、hda6、.....』，而接在 slave 的則稱為 『hdb』囉。至於接在 secondary IDE 的 Master 就稱為 『hdc』，因此你需要知道你的硬碟是接在哪一個區域！以下列出IDE介面的各個硬碟在 Linux 下的代號：
      IDE介面插槽
      Linux 下的硬碟代號
      Primary, Master
      hda
      Primary, Slave
      hdb
      Secondary, Master
      hdc
      Secondary, Slave
      hdd

      圖一

      建立虛擬記憶體=> 在圖一中你可以按鍵盤的『Tab』 鍵選擇至 『Add』 這一項按 Enter，會出現一個如下所示的視窗（圖二），『Mount Point』不用理他，按 『Tab』 移動至 『Size (Megs)』 這一個選項後，輸入 『100』 （我們要建立100MB的虛擬記憶體），然後再按 『Tab』鍵移動至畫面中的 Type 這一項，選擇『Linux Swap』這一項（Linux Swap 即是 Linux 下的虛擬記憶體了），然後再按 Tab 鍵至『OK』按 Enter 即可；

      圖二

      建立根目錄=====> 在圖一的畫面中再次移動至『Add』 這一項，出現圖二的畫面後，在 『Mount Point』 輸入 『/』，然後在 『Grow to fill disk?:』按一次空白鍵使括號內出現一個 [*] 符號，這是說『將所有剩下的硬碟空間都配置給根目錄』的意思（當然了，如果你不要將所有的空間都分配給 Linux 的話，在 Size 的地方輸入你要給 Linux 的磁碟空間，單位為 MB ，最少要給 2048MB 的空間喔！）。而在 Type 的地方選擇 『Linux Native』 這一項（Linux Native 就是 Linux 的磁區），再按 『OK』即可！

      貯存變更區域===> 剛剛的變動都做完之後，你應該可以看到原先圖一的畫面上多出了兩列，就是剛剛分割的那兩列，而且最底下的那一列有個 free 項目的那一欄應該會顯示為 0，然後選擇『OK』這個項目，會出現要你 Save 磁碟分割的訊息，按 『Yes』 即可。

    4. 格式化硬碟=====> 分割完硬碟當然要格式化（format）囉，因為 Linux 與 DOS 的檔案型態不同，所以你必須格式化硬碟，由於你只將硬碟分割為一個磁區（根目錄），所以畫面上應該只會有一個磁區，然後有一個選項『Check for bad blocks during format』 這個項目主要是在檢查你的硬碟是否有壞軌。切記，如果你確定你的硬碟沒有壞軌的話，這個項目一定不要選，不然你可能會等的瘋掉。
    5. SCSI介面卡=====> 接下來的動作是設定 SCSI 卡，不過我們沒有這個卡，所以直接選『OK』跳過！
    6. 選擇開機區=====> 再來則是 LILO 這套程式設定開機的地方，畫面上應該會有兩列，第一列後端會顯示『Master Boot Record (MBR)』通常我們就是選擇這個，按『OK』 行了！
    7. 檢視開機磁區===> 這個畫面會顯示你的主機系統中的可開機磁區，應該是有兩列的，第一列是 Windows98 的開機區，另一列則是 Linux 的開機區。你可以改變開機的名稱，在『Default Boot Label』 的地方可以看到你的開機名稱，按 Enter 後可以改變名稱，不要變名稱的話選擇『OK』 即可；
    8. 設定主機名稱===> 由於我們將來要去申請免費的『動態IP』的 DNS ，所以這裡請定你的名稱為 『xxx.adsldns.org』，其中 xxx 為你想取的名稱，後面 adsldns.org 請照寫，注意喔，主機名稱盡量使用小寫！例如我的主機就定名為 vbird.adsldns.org，不過主機名稱後來也可以修改，所以這裡先隨意定一個名稱吧！
    9. 設定網路卡=====>『極度重要』 如果你夠幸運的話，系統可以捉到網路卡就會進入這個項目。（如果你是使用鳥哥建議的 RTL 8139 晶片的網路卡，那幾乎一定可以捉的到！）首先這個項目會問你是不是要使用 DHCP 的設定，由於我們是使用 ADSL 連線的，所以這裡可以輸入『虛擬IP』或者是你有固定的IP即可填入。通常我都是輸入『192.168.1.11』這個虛擬IP，你可以照我的設定輸入為：
        IP address: 192.168.1.11
        Netmask: 255.255.255.0
        Default gateway(IP) 192.168.1.11
        Primary nameserver: 192.168.1.11
      關於 IP 的網段理論，及遮罩子網域的設定等等，你可以在網中人的 study-area 這個網站上找到相關的訊息！尤其是『何為虛擬IP？』真的需要瞭解一下！
    10. 設定滑鼠=======> 在設定滑鼠的地方請依照你的實際需求選擇，通常我們的滑鼠都是三個鈕的，你可以選『Generic - 3 Button Mouse (serial)或(PS/2）』這一項，如果你是兩個鈕的，就選另一個兩鈕的吧！另外要注意的是，底下有一個『Emulate 3 Buttons』預設是選擇的，這是模擬按鈕成三個鈕的項目，通常我們不要這個項目，所以請將這個項目的選擇取消（按 Tab 鍵後，按空白鍵取消）；
    11. 設定滑鼠接埠===> 因為我們是接在 COM1 的接埠，所以直接按 Enter 即可；
    12. 設定系統時區===> 以 Tab 及方向鍵選擇我們的時區為『Asia/Taipei』，再至『OK』按 Enter ；
    13. 設定root密碼===> 接下來請輸入兩次你的密碼，root就是系統管理員，這個密碼很重要，不要忘了！另外，輸入密碼的時候畫面上並不會有任何的顯示。
    14. 設定帳號=======> 這一版的 Linux 可以讓你先設定一個帳號，你也可以不設定，直接按 OK 跳過，如果要設定的話，你的 ID 最好是小寫，然後密碼也是要輸入兩次！至於 Full name 可以先不用寫！
    15. 設定密碼保護===> 目前 Linux 系統支援幾種不同的密碼保護，我們也不用選擇 NIF 系統，直接接受預設值按 OK 就可以了。
    16. 選擇安裝套件===> 不用說，直接按方向鍵一直向下選擇最後一個『Everything』即可，
    17. 設定顯示卡=====> 因為我們的顯示卡是 S3 的 Virge ，所以 Linux 可以捉到，這時按 OK 接受預設值即可；
    18. 製作開機磁片===> 由於可能會有問題發生，當然是製作開機片比較好囉，選擇 OK！
    19. 即將開始安裝===> 這時出現的畫面告訴你，你的安裝過程會記錄在 /tmp/install.log 檔案中，按 OK；
      然後你會等待一定的時間，這個時間與你選擇的套件及是否有檢查硬碟壞軌有關，在我的 P-166 MMX 64MB RAM 系統中，大概需要 30-60 分鐘左右的時間，去休息一下吧！
    20. 安裝開機磁片===> 在安裝完所有的套件之後，再來則是製作開機片，請放入空白磁片後按 Enter；
    21. 設定顯示器=====> 由於我們的顯示器不見得會被 Linux 支援，一般我們都是選擇 『Custom』自行設定：
        a. 先按 OK 略過畫面；
        b. 選第七項『High Frequency SVGA, 1024x768 @ 70 Hz』，這是因為目前的螢幕還不錯！
        c. 選第二項『50-90』即可；
        d. 選『Probe』讓 Linux 自己去捉顯示卡的硬體！
        e. 在顯示的畫面中按 OK 開始測試 X-Windows；
        f. 如果你的顯示器與顯示卡沒有問題，螢幕上會顯示 Window 的畫面，且接下來會有十秒鐘的時間讓你確認；
        g. 接下來會問你是否在開機的時候進入 X-Widows，由於我們的主機主要是當作 Server 使用，因此在 X-Windows 的使用情況不是很多，另外，由於開啟 X-Windows 會佔去不少的記憶體資源，因此我不建議你進入 X-Windows 在開機的時候，所以這裡選擇『NO』。
    22. 安裝完成=======> 接下來的畫面告訴你安裝完畢了，請按 OK 跳過！
      終於安裝完畢，這時系統會重新開機，注意喔，請一定要將 CD-ROM 中可開機的光碟片拿出來，不然就請你進 BIOS 將開機選項選為 C: 或者是 A: 。此外，在開機的過程中，注意一下，在出現：
      LILO boot:

      的提示字元之後，馬上按 『Tab』鍵，則會出現兩個開機系統，分別是『linux』與『dos』，如果要進入 Windows98 系統，請在 boot: 後面輸入 dos 即可，如果要進入 linux 則輸入 linux 即可。當然了，如果你不按任何鍵，則系統會主動以 Linux 開機！這個多重開機的部分我們會在後面繼續談到！

Q&A
  1. Q：在灌過了 Linux 之後，由於安裝 Lilo 開機區在 MBR 中，所以雖然 Linux 被移除了，但是開機還是會以 MBR 的設定為主，因此，很多人灌完了 Linux 想改回 Windows 時，硬碟總是還會以 Linux 開機。請問要如何將 Lilo 自 MBR 中移除？
    A：
    你可以使用 Windows98 的軟碟開機後，輸入：
    A:\> fdisk /mbr (fdisk 是 DOS 下的指令)
    如此則可將 MBR 中的 Lilo 完全移除了！
  2. Q：何謂『虛擬 IP 』，與『實體 IP 』或者『固定 IP 』『動態 IP 』有啥不同？
    A：
    『實體 IP 』：在網路的世界裡，為了要辨識每一部電腦的位置，因此有了電腦 IP 位址的定義。一個 IP 就好似一個門牌！例如，你要去微軟的網站的話，就要去『 207.46.197.101 』這個 IP 位置！這些可以直接在網際網路上溝通的 IP 就被稱為『實體 IP 』了。

    『虛擬 IP 』：不過，眾所皆知的，IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態，其中， xxx 為 1-255 間的整數，由於近來電腦的成長速度太快，實體的 IP 已經有點不足了，好在早在規劃 IP 時就已經預留了三個網段的 IP 做為內部網域的虛擬 IP 之用。這三個預留的 IP 分別為：

      10.0.0.0 - 10.255.255.255
      172.16.0.0 - 172.31.255.255
      192.168.0.0 - 192.168.255.255
    不過，由於是虛擬 IP ，所以當您使用這些地址的時候﹐當然是有所限制的，限制如下：
      私有位址的路由資訊不能對外散播
      使用私有位址作為來源或目的地址的封包﹐不能透過Internet來轉送
      關於私有位址的參考紀錄(如DNS)﹐只能限于內部網路使用
    這給我們架設IP網路做成很大的方便﹐比如﹕即使您目前的公司還沒有連上Internet﹐但不保證將來不會啊。如果使用公共IP的話﹐如果沒經過註冊﹐等到以後真正要連上網路的時候﹐就很可能和別人衝突了。也正如前面所分析的﹐到時候再重新規劃IP的話﹐將是件非常頭痛的問題。這時候﹐我們可以先利用私有位址來架設網路﹐等到真要連上intetnet的時候﹐我們可以使用IP轉換協定﹐如NAT (Network Addresss Translation)等技術﹐配合新註冊的IP就可以了。

    『固定 IP 』與『動態 IP 』：基本上，這兩個東西是由於近來網路公司大量的成長下的產物，例如，你如果向中華電信申請一個商業型態的 ADSL 專線，那他會給你一個固定的實體 IP ，這個實體 IP 就被稱為『固定 IP 』了。而若你是申請計時制的 ADSL ，那由於你的 IP 可能是由數十人共同使用，因此你每次重新開機上網時，你這部電腦的 IP 都不會是固定的！於是就被稱為『動態 IP』或者是『浮動式IP』。基本上，這兩個都是『實體IP』，只是網路公司用來分配給用戶的方法不同而產生不同的名稱而已！

    這裡只有說了一些概念性的東西，基本是，IP是很麻煩的，小弟也不甚瞭解，例如子網路遮罩的計算等等！強烈的建議初學者到 study-area 這個網站去看看，相信對你往後的電腦網路概念有很大的幫助喔！

  3. Q：什麼是 Linux 的核心，核心有哪些版本？哪裡可以取得最新的核心程式？
    A：
    所謂的核心可以簡單的想成是 Linux 的心臟，核心包含了你的系統所需要的硬體設定與 Linux 系統模組，核心是相當重要的一個咚咚，當你的硬體太新，而使你原來的 Linux 捉不到時，就可以藉著跟新核心程式來捉到！

    基本上，目前可以聽到的核心大概有 2.2.X 、 2.3.X 及 2.4.X，要注意的是，這些版本是同時發展的，只是目的不同，所以 2.3.X 並不是指比 2.2.X 來的新，這點一定要注意。通常，2.2.X與2.4.X是較為穩定的版本，至於 2.3.X 則是適用於一些程式發展者所需要的特殊核心，因此，對於我們這種初學者來說，使用 2.2.X 的核心版本就可以了！

    在各大 FTP 站上均可以捉到最新的核心程式，只是，除非你很確定你要的新核心作用為何，否則小弟並不是十分建議常常更新核心的啦！畢竟，電腦夠用且適用就好！

  4. Q：在灌完了 Linux 之後，想改回來 Windows，但是以 DOS 的 Fdisk 卻無法分割這個硬碟，該如何是好？
    A：
    由於 Windows98 開機片的系統並不認識 Linux 的檔案配置區，所以使用 DOS 下的 Fdisk 是無法修正硬碟的資料的！你有兩個方法可以將這一個硬碟回復，一個是再以 Linux 系統重新劃分；另一個則是使用國人發展的 Spfdisk 來劃分，這裡有一個 spfdisk 的範例可以讓你看看如何劃分硬碟。
  5. 等待加入新問題
2002/ 01/01以來統計人數


一個硬碟分割的範例
最近更新日期：2001/07/03

硬碟分割 ==> SPFdisk

SPFdisk 是一套由國人開發完成的全中文介面的硬碟分割工具，他要比微軟出的 Fdisk 功能強多了，他的好處除了==>全中文介面讓你一定可以看的懂之外，簡單的類圖形介面可以讓你輕易的進行硬碟分割，除此之外，這套軟體的『DOS工具』內的『格式化工具』格式化硬碟的速度真是 DOS 比不上的，我格式化一個 30GB 的硬碟不用十秒就可以格式化完全！<==另外，其他的優點我在此也不多說了，若有需要你可以自行自一些搜尋網站下載最新的程式，或從這裡下載我有的程式，不過可能舊一點。

另外，由於 DOS 的 Fdisk 並不認識 Linux 的分割表，所以用 DOS 的 Fdisk 是無法將 Linux 的分割表去除的。因此，你要刪除 Linux 的分割表，只有兩個比較快的方法，一個是以 Linux 直接再分割，一個則是使用 SPfdisk 分割啦！

由於這個頁面的檔案很大，有時候會有沒辦法顯示的情況發生，這時請在畫面上『按滑鼠右鍵』，再選擇『顯示圖片』這個選項，即可顯示畫面啦！

硬碟分割主要可分為下面幾個步驟：

  1. 將舊有的分割表刪除；
  2. 建立新的主分割及擴充分割（若有需要的話）；
  3. 貯存分割表；
  4. 以 DOS 工具格式化以分割的硬碟。
1. 刪除原有分割：
假設你的主機中沒有任何系統存在，則請以 Windows98 製作開機片後，將 spfdisk 拷貝至開機片。以此磁片開機之後，執行：
A:>spfdisk

會出現如下歡迎畫面。

按任意鍵後出現下面畫面：
以方向鍵移動游標至『硬碟分割工具』按 Enter 鍵後會出現畫面如下：
這是向你詢問是否需要使用 FAT32 的檔案系統，由於 Windows 98 支援的長檔名及相關的檔案型態是以 FAT32 為準，所以當然按『Y』！按了 Y 之後會出現硬碟的資訊，如下所示：
因為我是在我原有的機器上執行這個程式，所以會有兩顆硬碟，如果你的系統只有一顆硬碟的話，則只會顯示你有的硬碟資料，在上圖中，1.19GB 的硬碟其總磁柱僅有 621 單位，比可開機磁區範圍（0 ~ 1023）小得多，所以可以隨意分割。將游標以方向鍵移動至 1.19GB 這顆硬碟後，按 Enter ：
因為這顆硬碟之前被我灌過 Linux ，所以會顯示 Linux 的磁區劃分情況。上面的意義為：
  • 啟動：由於系統開機時會去先去找分割表，由分割表所設定的『可開機磁區』進行開機程序，因此若這個磁區為開機磁區，則『啟動』項目會有一個心型的符號存在！
  • 起始磁柱與結束磁柱：這一個被分割的磁區的開始與結束磁區。
  • MBytes：這個磁區的硬碟容量。
  • 系統 ID 與系統種類：這一個分割表的類型。因為這是 Linux 的分割類型，所以其 ID 顯示為 83，若是 FAT32 的話，則為 0b。
將游標以方向鍵移動至這個磁區後，按 Enter ：
在這個畫面中，將游標以方向鍵移動至『刪除分割』這個項目，並按下 Enter ：
出現此畫面後，確定要刪除這個分割就按『[Y]是』這個項目。
刪除分割之後你的硬碟中就沒有分割表的存在了，所以這個硬碟的系統種類則變成了<未規劃>。
2. 建立主要分割磁區：
在上面的畫面中，按下 Enter 鍵，會出現下面畫面。
由於這一顆硬碟的分割表被刪除了，所以『系統ID』與『刪除分割』被取消了。這時按下『建立分割』會出現如下畫面：
然後選擇『建立主分割』，那何謂主分割與擴充分割呢？所謂的主分割在 windows 系統下即是 『C槽』 啦！但是擴充分割並非『邏輯分割』，這裡要注意一下，所謂的『邏輯分割』是包含在擴充分割中的，例如當你的擴充分割共有 10GB 但是你想將之分為兩槽，則可以使用邏輯分割將擴充分割分為兩槽，這兩槽即稱為『邏輯分割』。所以這裡要注意啦，建立擴充分割的時候就要選擇『配置整個區域』啦！好！下一步按下『建立主分割』：
這裡會問你是否要將整個硬碟分割為僅有一個磁碟區？由於我們要將硬碟分為兩槽，所以這裡當然選擇『[N]否』啦！
由於你選擇了『不要配置整個區域為一塊磁區』，所以這時程式要你輸入你所需要的磁區。通常在第一步是輸入『啟始磁柱』，這時只要按 Enter 就可以啦，然後會要你輸入『結束磁柱』，結束磁柱的輸入方法有兩種模式，一種是輸入磁柱區，一種是輸入你所需要的 MB 數，通常我是輸入 MB 數啦，例如如上所示，我所需要的空間大小是 600MB ，所以輸入『+600』即可，而如果你的硬碟很大，你要輸入 4GB 時，則需要輸入 『+4000』，以此類推！輸入『+600』並按 Enter 之後出現如下畫面。
這時出現了你剛剛劃分的硬碟資訊啦，由於我們是劃分為 DOS 分割區，所以系統種類是 FAT-32 ，而 ID 則為 0b 。至於另外尚未劃分的就會顯示為 <未規劃> 啦！如果你還需要再繼續劃分的話，這時將游標移動至 <未規劃> 的那一個磁區按 Enter 後選擇『擴充分割』即可繼續劃分。如果劃分完畢之後，當然就是貯存分割表囉。這裡注意一下，因為剛剛的動作均尚未完成貯存的工作，所以要反悔還來得及！
3. 貯存分割表：
接下來要做貯存的動作了，按下『Esc』鍵（鍵盤左上角那個鍵）後會出現如下畫面：
按『[Y]是』，將剛分割好的分割表貯存至硬碟中！然後出現如下畫面：

這裡的動作是連續的：
  1. 程式會先跟你確認你的硬碟有沒有錯誤，這裡還可以反悔。
  2. 然後程式會問你是否需要使用破壞貯存，一般來說是需要使用『破壞貯存』的，因為需要將你的硬碟劃分完全啦！所以要按 [Y]；
  3. 為了可以讓你以後回復分割情況，所以你可以選擇 『建立 UNDO』檔，所謂的 UNDO 檔即是記錄你之前硬碟分割表資訊的檔案啦。
這樣一來你的硬碟就劃分完畢而且貯存啦！這時要做的就是重新開機並格式化硬碟。格式化硬碟可以使用 DOS 的 Format ，當然也可以使用 spfdisk 的內建功能喔！
4. 格式化硬碟
再進入剛剛你劃分完畢的那個硬碟區，按下 Enter 之後會出現一串選單，然後最下方的選單為『DOS 工具』，選擇這一項並按 Enter 後，會出現另一個選單：
在這個次選單中的第二項即是快速格式化，這個格式化的動作非常的快喔！比 DOS 的格式化快多了！不過，這裡也必須指出一個問題，那就是若你的硬碟有壞軌的話，那最好還是使用 DOS 的 format 比較完整一點。
2002/ 01/01以來統計人數


開機、關機與多重開機
最近更新日期：2001/08/12
開機與關機
設定 Lilo 的多重開機
本章問題與討論

開機與關機：
開機不是只要按一下電源鈕而關機只要關掉電源鈕就可以了嗎？有何大學問？話是這樣沒錯啦，但是由於 Linux 是一套多人多工的作業系統，你難保你在關機時沒有人在線上，如果你關機的時候碰巧一大群人在線上工作，那會讓當時在線上工作的人馬上斷線的！那不是害死人了！一些資料可以無價之寶哩！另外，與 DOS 環境不同的是， Linux 在執行的時候，雖然你在畫面上只會看到黑壓壓的一片，完全沒有任何畫面，但其實他是有很多的程式在背景底下執行的，例如郵件程式、瀏覽器主機程式等，你如果隨便關機的話，是很容易傷害硬碟及資料傳輸的動作的！所以在 Linux 下關機可是一門大學問喔！

開機（登入）

對啦！在沒有電源的情況下，開機只要按一下電源鈕就夠了！電腦會先去讀 BIOS 裡頭的設定，然後就開始開機程序。請記得，如果你在 BIOS 的開機設定是以 CD-ROM 為第一項，請將可開機的光碟片拿出來。且 A 槽最好不要放軟碟喔！

OK！是否還記得在安裝 Linux 的時候安裝的開機程式是啥？沒錯，就是可以設定多重開機的 Lilo 這套軟體，而由於 Lilo 的開機資訊通常是存放在 MBR 當中，所以系統會先找到我們的 Linux 設定，因此開機過程中，螢幕的最底下一行會出現：

LILO boot:_

這一行字，如果你在大約十秒鐘的時間沒有動作，則系統將以 Linux 預設的情況進行開機（通常是預設為 Linux 開機）。如果你在這個時候按一下 『Tab』鍵，則螢幕上應該會出現：

LILO boot: <== 這裡按一下 Tab
linux dos
boot: _ <== 游標在這裡

好了，這個畫面告訴你系統目前有兩個可以開機的磁區，其名稱分別是 linux 與 dos 兩個，其實這就是我們在安裝的時候設定的開機名稱！而游標會在 boot: 後面，這時如果按 『Enter』 則系統會直接以預設的 linux 系統開機，如果打 linux 則同樣以 linux 開機，當然，打 dos 就會以 dos 進入開機程序！所以打 dos 開機時你就會見到 windows98 的開機畫面囉！因此，如果你在安裝 Linux 之前的 Windows98 並沒有安裝的很完整，這個時候可以再以 dos進入 Windows98 去設定你其他的需求！

嗯，如果你是以 Linux 開機，那首先系統會先去搜尋你的硬體設備，這時螢幕上會出現很多硬體資訊的訊息，你可以一行行的看，也可以不用看，因為每次開機的這些資訊會存在 /var/log/dmesg 這個檔案中，你可以在開機完畢之後再仔細的分析這些檔案資料！搜尋軟硬體資訊之後，便開始啟動一些服務（services），例如： ftp、telnet、talk等等！當然，你的其他架站設定也會一併的啟動。在預設的狀況之下， Linux 的架站服務會自動幫你設定兩個基本的小站，一個是 mail server ，用的是 sendmail 這套軟體，另一個是 WWW server ，用的是 httpd 這一套軟體，不過這些服務一開始的設定可能是不對的，這不打緊，因為架站這部分我們會在後面提到，這裡只是先告訴你一般來說 Linux 會有的預設服務罷了！

開機完畢之後就需要登入了，登入的畫面有點像這樣：

會顯示你所使用的 Linux 核心版本 （Kernel） 與 Red Hat 版本！這裡注意一下，上面這個例子中，因為我是以另一台已經將核心更新過的機器作為示範，所以核心版本是 2.2.18 ，如果你是以這個站上面的檔案製成的光碟安裝的話，你的核心應該是 2.2.12-20 才對！好了，現在在 login: 的地方輸入： root ，按 Enter 後再輸入你的密碼，就可以順利的登入你的機器了，root 是系統管理員的意思。另外要注意的是，由於這一款 Linux 為了系統保密的關係，是不允許遠端以 root 的身份登入的！就是說，如果你以後以 telnet 的網路方式連上這台機器的話， root 這個帳號是不能進入的！因此身為系統管理員的你最好有另一個一般的帳號，如我以 vbird 的身份登入我的系統之後，有如下面的畫面：

系統會告訴你，你上次進入系統的時間與連線的機器！然後會顯示你的身份與所在的目錄！注意囉，如果你是以 root 身份進入的話，那就會變成 [root@tsai root]# 這付模樣。

另外，如果你在前一章安裝設定時設定開機啟動為 X-Window，那出現的登入畫面則是一個圖形介面的咚咚，登入的方法是一樣的，只是畫面變成圖形介面了！

遠端以 Windows 軟體登入 Linux 主機

這是我對 Linux 最喜歡的功能之一了，當你已經架設好 Linux 主機，並且也已經正常的連上 Internet 之後，你應該已經有個合法的 IP （實體IP），如果你已經設定好了 DNS 的話更棒，這樣你可以直接使用 telnet 或 netterm 等連線軟體登入你這架主機！假設你的 DNS 是 sun.os.test.com ，則使用 『開始』->『執行』鍵入：

telnet sun.os.test.com，
這樣在任何地方就都可以連上你的主機囉！很棒吧！

關機

關機的方式有很多，不過都要注意一件事，就是『不要在開機的情況下直接按下電源』關機，不然造成機器損毀時不要找我.....。
通常關機所下的指令是（在指令之前的 # 是提示字元的意思！）：
# shutdown -h now

或者是：
# reboot

這是立刻關機及重新開機的意思，不過很多的文章都建議在進行關機程序之前，先將 Linux 貯放在緩衝區的資料寫進硬碟中，所以你可以先執行：
# sync

這個指令來將資料寫回磁碟中！當然了，你也可以讓系統在固定的時間或在一定的時間後關機，指令如下：
# shutdown -h 20:25 <======系統在今天的 20:25 關機
# shutdown -h +10 <======系統在 10 分鐘後關機

在關機的過程中也會顯示相當多的訊息，以告訴你系統關閉的項目為何。

通常我都是使用 reboot 這個指令來重新啟動 Linux ，而在 Linux 跑完關機程序之後我便將電源關掉！因為我的系統目前還很單純，沒有開啟很多服務，自然不用太在乎緩衝區中的資料，但是，好習慣的養成是很重要的，所以正確的關機程序應該是需要養成的！你可以如下進行關機程序：
# sync;sync;sync
# reboot

然後在系統出現 嗶 的一聲後再關掉電源！

那如果你是以 X-Window 登入的話，要登出時你可以以滑鼠在畫面中的左下角有一個『腳丫子』形狀的咚咚上面按一下，會出現類似 Windows 的『開始』的一串字，最下方有一個 logout 的選項，按下這個選項後，畫面正中央會出現一個方框，裡面共有三個選項，這時選擇 reboot 這個選項即可重新開機！

設定 Lilo 多重開機
其實，這一部份應該在後面才提到，因為目前還沒有說到『 vi 』這套文書處理程式（有點像是早期 DOS 下的 PE2或是漢書等軟體），不過因為多重開機與開關機是有相關的，所以鳥哥將之寫在一起， Anyway，這裡還是假設您已經知道如何使用 Linux 下的文書處理軟體了，如果您還不瞭解 vi 的話，請先翻到後面的章節學學使用 vi 再說吧！

設定多重開機時僅需要修改一個檔案，及執行一個檔案！修改的檔案在『 /etc 』目錄下，檔名為 lilo.conf ，所以你要做的就是以 vi 來修改這個檔案囉！注意唷，因為底下要修改的檔案只有管理員（root） 才有權限更改，所以除非你在主機上以 root 的身份登入，否則你必須使用 su 來更改你的身份成為管理員。執行的程序如下：

以 root 的身份登入之後先進入 etc 這個目錄，然後執行 vi ，所以鍵入：
# cd /etc
# vi lilo.conf

按下 enter 之後，畫面會變成這樣：

畫面的最下面一行會告訴你這個檔案的屬性為：這個檔案共有 20 行，及共有 306 個字元！你可以用方向鍵移動游標，在這個檔案中，由於我先更新過系統核心，但又不想放棄比較先前一個版本的核心，所以設計了兩個核心並存，另外尚包含一個 Windows 開機磁區的設定。

在此將上面的幾行字解釋一下：

  1. 『 boot=/dev/hda 』：告訴你開機是由 hda （第一顆硬碟，在安裝的時候解釋過。）的 MBR 開機；
  2. 『 map=/boot/boot.b 』：我也不是很清楚，應該是關於系統的模組配置檔；
  3. 『 install=/boot/boot.b 』：跟上面一樣；
  4. 『 default=linux-2.2.18 』：系統的預設開機選項為 linux-2.2.18 這一項！注意： image後面接的就是開機的咚咚，所以共有三個開機檔（兩個image及一個other）
  5. 『 image=/boot/vmlinuz-2.2.12-20 』：vmlinuz-2.2.12-20是系統核心開機檔，這一行以下的咚咚在告訴你，以 vmlinuz-2.2.12-20 這個版本核心的訊息；（其中要注意的是，底下每行的前面是按下 Tab 鍵所造成的空白，不是以空白鍵按出來的。）
    label=linux-2.2.12 ：就是你在按下 Tab 鍵之後，顯示的檔頭資料；
    root=/dev/hda5 ：就是開機磁區位於第五個開機磁區（與你的硬碟配置有關）
    read-only ：這個系統檔只可以讀取！
  6. 底下的另一個 image 是同樣以 Linux 核心開機的設定資料；
  7. 『 other=/dev/hda1 』：最後面這一個咚咚告訴你，還有一個非 Linux 的開機磁區在 hda1 上面，而這個開機磁區的代號為 win98。
注意到了沒？在開機的選項後面均有一個開機的磁區，在 Linux 下，分別是 /boot/vmlinuz-2.2.12-20、/boot/vmlinuz-2.2.18及 /dev/hda1，這就是開機的系統區，而在你安裝 Linux 前，不是有分割硬碟嗎？這裡你就可以參照一下你的開機區與你的系統所在磁區囉！

將預設的開機選項設定為 Windows98：

要將原先設定的 Linux 開機變成 Windows 開機是很簡單的。基本上最上面幾行可以不用修改，僅需要改的是 default 這個項目，如果你希望進入系統時先以 Windows 開機，若輸入 linux 才進入 linux 系統的話，你可以將 default 後面的 linux-2.2.18 改成 win98 這個項目。

  1. 先移動游標至 linux-2.2.18 的 l 字母上面；
  2. 按小寫『 x 』將 linux-2.2.18 消掉（x 鍵是 vi 這套軟體的 del 鍵）
  3. 按小寫『 i 』之後變成輸入模式，畫面底部會變成『 -- INSERT -- 』字樣，
  4. 輸入 win98；
  5. 按 Esc 鍵退出輸入模式，
  6. 按『 :wq 』修改貯存並退出 vi 軟體；
  7. 最後，請一定輸入『 lilo 』以執行修改後的設定。畫面會如下：
然後重新開機即可完成設定。上面這一個畫面系統就告訴你，目前有三個開機區，而預設的開機區是 win98 （有打 ＊ 號的），這樣便完成修改的動作囉！當然，要改回來的話，只要將前四個步驟的 win98 與 linux-2.2.18 對換回來即可！

另外，常常我們在進行多重開機的設定時，偶爾會有設定錯誤的情況發生，這時，在上面這個畫面中，就不會顯示『*』，而且也不會有 Added 字樣產生，果真如此的話，請您再回剛剛的 vi 畫面修改 lilo.conf 這個程式，通常最容易發生錯誤的地方在：你所給的開機磁區不存在，或者你的開機檔案寫錯了！

2002/ 01/01以來統計人數

本章問題討論：
  1. Q：如何完全移除 Lilo ：
    A：
    請參考前面一章的問題討論。
  2. 等待加入新討論：


認識 Linux 檔案屬性及檔案配置
最近更新日期：2001/09/02
Linux 檔案屬性
Linux 檔案配置
需要注意的目錄
一般主機可能會分配的磁碟情況
問題討論

Linux 檔案屬性：
認識檔案

如果您已經安裝好了 Linux ，並且已經以 root 的身份登入了這架主機，那接下來要做些啥？我想，你應該先試著瞭解一下 Linux 的主要檔案屬性，以免不小心砍了一些重要的檔案，或者當以一般使用者身份登入時，產生無法進入一些沒有權限之目錄的情況！

首先，進入 Linux 之後，你可以如下輸入一個可以觀看檔案屬性的指令： ls -al
[root @tsai root]# ls -al
-rw-r--r-- 1 root root 1422 Jun 18 17:20 .Xdefaults
-rw-r--r-- 1 root root 24 Jun 18 17:20 .bash_logout
-rw-r--r-- 1 root root 230 Jun 18 17:20 .bash_profile
-rw-r--r-- 1 root root 124 Jun 18 17:20 .bashrc
drwxr-xr-x 3 root root 4096 Jun 18 17:20 .kde
-rw-r--r-- 1 root root 435 Jun 18 17:20 .kderc
-rw-r--r-- 1 root root 3394 Jun 18 17:20 .screenrc
drwxr-xr-x 5 root root 4096 Jun 18 17:20 Desktop
lrwxrxwrwx 1 root root 10 Jun 18 17:21 link_file -> /home/vbird/test
-rw-rw-rw- 1 root root 238 Jun 18 17:22 test.txt

第一欄 二 三 四 五 六 七
[檔案屬性][檔案數][擁有者][所有者群組][大小][建檔日期][檔名]

ls 是『list』的意思，而參數『-al』則表示列出所有的檔案（包含隱藏檔）。如上所示，在你第一次登入 Linux 時，如果你輸入指令後，應該有上列的幾個東西，先解釋一下上面七個欄位個別的意思：

  1. 第一欄代表這個檔案的屬性，仔細看的話，你應該可以發現這一欄其實共有十個屬性，第一個屬性代表這個檔案是『目錄、檔案或連結檔』當為[d]則是目錄；為[-]則是檔案，若是[l]則表示為連結檔(link file)。接下來的屬性中，三個為一組，且均為『rwx』的三個參數的組合。其中，[r]代表可讀、[w]代表可寫、[x]代表可執行，而第一組為『所有人的權限』、第二組為『同群組的權限』、第三組為『其他非本群組的權限』，若有一個檔案的屬性為『-rwxr-xr--』，簡單的可由下面說明之：
    [-][rwx][r-x][r--]
    1 234 567 890
    1 為：代表這個檔名為目錄或檔案（上面為檔案）
    234為：擁有人的權限（上面為可讀、可寫、可執行）
    567為：同群組使用者權限（上面為可讀可執行）
    890為：其他使用者權限（上面為僅可讀）

    上面的情況代表一個檔案、這個檔案的擁有人可讀可寫可執行、但同群組的人僅可讀與執行，非同群組的使用者僅可讀的意思！

  2. 第二欄表示有多少檔案在這個目錄（若為1則通常為檔案）；
  3. 第三欄表示這個檔案（或目錄）的『擁有人』；
  4. 第四欄表示擁有人的群組；
    這裡解釋一下，在 Linux 中，你的 ID （如 root 或 vbird 等帳號均是 ID）即是你的身份，而且你還有附屬在一個群組之下，例如你有一個團體（即群組）代號為 bird，且這個群體裡有四個人，其代號分別是 bird1, bird2, bird3, bird4，則這四個人為同一群組即 bird！若看上面的情況，則代表所有人為 root 且群組為 root （群組與所有人名稱可以相同）
  5. 第五欄為這個檔案的大小；
  6. 第六欄為這個檔案的建檔日期，分別為月份、日期及時間；
  7. 第七欄為這個檔案的檔名，如果檔名之前多一個『 . 』，則代表這個檔案為『隱藏檔』，例如上表第二行的『.Xdefaults』檔名即是隱藏檔，由於我們有下一個參數為 ls -al，所以連隱藏檔都列出來，如果你只輸入 ls 則檔名有加『 . 』的檔案就不會被顯示出來！
舉個例子來說，如果有下面的兩個檔案：
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt
-rwxr-xr-- 1 bird1 bird 5238 Jun 19 10:25 ping_tsai

則檔案『 test.txt 』只有 root 可以讀寫，其他人僅可以讀；而另一個檔案『 ping_tsai 』所有人 bird1 可讀可寫可執行，而 bird2, bird3, bird4 這三個與 bird1 同樣是 bird 群組的僅可讀可執行但不能寫（亦即不能修改），至於非 bird 這一個群組的人則僅可以讀，不能寫也不能執行！

連結檔

另一個比較有趣的檔案是連結檔。如果你常常將應用程式捉到桌面來的話，你就應該知道在 Windows 底下有所謂的『捷徑』，你可以將 linux 下的連結檔簡單的視為一個檔案或目錄的捷徑。但是基本上這兩個東西是不一樣的！在 Windows 系統的捷徑中，你將無法修改主程式，但是在 Linux 中，連結檔可以直接連結到主程式，因此你只要改了這個連結檔，則主程式亦被改變了！

一些檔案的分別

通常在 Linux 底下會有顏色來顯示每一種檔案型態，主要有底下幾種檔案型態：

  • 一般檔案：檔案的第一個屬性顯示 - ；
  • 目錄： 如果你只輸入 ls -l 來察看檔案的時候，可以看到檔案第一個屬性為 d；
  • 可執行檔：可以看到檔案屬性會有 x 這個屬性；
  • 壓縮檔：基本上，只要檔案是 .Z .z .gz .zip .tgz 都是壓縮檔喔！

Linux 檔案配置：
如果你是以系統管理員（root）的身份登入這部 Linux 機器，則你的路徑應該是在 [root@tsai root]# 底下，這時你可以輸入：
[root @tsai root]# cd ..
會回到根目錄『/』下，再輸入剛剛學過的指令『ls -al』則會看到如下的畫面：
[root@tsai /]$ ls -al
total 117
drwxr-xr-x 2 root root 4096 May 10 06:50 bin
drwxr-xr-x 3 root root 1024 Mar 16 18:37 boot
drwxr-xr-x 7 root root 36864 Jul 8 04:02 dev
drwxr-xr-x 42 root root 4096 Jul 9 15:21 etc
drwxr-xr-x 35 root root 4096 Jul 9 15:20 home
drwxr-xr-x 4 root root 4096 Jan 29 22:55 lib
drwxr-xr-x 2 root root 16384 Jan 29 22:52 lost+found
drwxr-xr-x 6 root root 4096 Mar 27 19:10 mnt
drwxr-xr-x 2 root root 4096 Aug 24 1999 opt
dr-xr-xr-x 60 root root 0 Jul 1 12:52 proc
drwxr-x--- 12 root root 4096 Jun 7 14:21 root
drwxr-xr-x 3 root root 4096 May 10 06:50 sbin
drwxrwxrwt 6 root root 4096 Jul 11 01:04 tmp
drwxr-xr-x 23 root root 4096 Sep 16 2000 usr
drwxr-xr-x 23 root root 4096 Jan 29 17:11 var
drwxr-xr-x 6 root root 4096 Jan 1 1970 win98se
要說明的是，這裡的目錄為 RedHat 6.1 的配置，在 RedHat 7.0 中有稍做改變，但其實也是差不多的！底下針對上面幾個路徑來做說明：
  • /bin ：這是放例如： ls, mv, rm, mkdir, rmdir, gzip, tar, telnet, 及 ftp 等等常用的執行檔的地方（這些執行檔的執行方法會在後面提到），而通常這個檔案的內容與 /usr/bin 是一樣的（有時候甚至會使用連結檔哩）；
  • /boot ：記得我們在之前的 多重開機設定 那一部份有提到你的開機檔所在位置吧！沒錯，這裡就是放置你 Linux 核心與開機相關檔案的地方；
  • /dev ：擺放一些與裝置有關的檔案。基本上 Unix 或 Linux 系統均把裝置當成是一個檔案來看待，例如 /dev/fd0 代表軟碟，亦即 Windows 系統下的 A 槽，而 /dev/cdrom 則代表光碟，等等！
  • /etc ：系統在開機過程中需要讀取的檔案均在這個目錄中，例如 Lilo 的參數、人員的帳號與密碼、系統的主要設定、http 架站的參數內容、你所要開啟的服務項目等等都在這個目錄中，所以在這個目錄下工作的時候，請記得一定要備份，否則檔案被改掉了可是很麻煩的！
  • /etc/rc.d ：這個路徑主要在記錄一些開關機過程中的 scripts 檔案， scripts 有點像是 DOS 下的批次檔（.bat檔名）；
  • /etc/xinetd.d ：這個路徑在 RedHat 7.0 以後的版本才有，由於 RedHat 6.1 用來開啟服務的檔案是 inetd.conf ，但是在 7.0 以後的版本中，開啟服務的項目已經變成使用 xinetd.conf 這個檔案，因此，你若需要啟動一些額外的服務的話，在 7.0 以後就要到 /etc/xinetd.d 這個目錄下了；
  • /etc/X11 ：這是與 X windows 有關的設定檔；
  • /home ：基本上，這是系統預設的使用者的家目錄( home directory )，另外，在 RedHat 6.1 版中，httpd及 ftp 等程式的家目錄也在這個目錄下！
  • /lib ：在 Linux 執行或編譯核心的時候，均會使用到一些函式庫（library），就在這個目錄下；
  • /lost+fount ：系統不正常產生錯誤時，會將一些遺失的片段放置於此目錄下，通常這個目錄會自動出現在裝置目錄下。例如你加裝一棵硬碟於 /disk 中，那在這個目錄下就會自動產生一個這樣的目錄 /disk/lost+found，這是砍不掉的目錄喔；
  • /mnt ：這是軟碟與光碟接掛點的地方；通常軟碟掛在 /mnt/floppy 下，而光碟掛在 /mnt/cdrom 下；
  • /proc ：系統核心與執行程序的一些資訊；
  • /root ：系統管理員的家目錄；
  • /sbin ：放置一些系統管理常用的程式，例如： fdisk, mke2fs, fsck, mkswap, mount 等等；
  • /tmp ：這是讓一般使用者暫時存放檔案的地方，例如你在安裝 Linux 下的軟體時，可能軟體預設的工作目錄就是 /tmp ，所以你要定期的清理一下，當然，重要資料最好不要放在這裡！
  • /usr ：這是最重要的一個目錄了，裡面含有相當多的系統資訊，內有許多目錄，用來存放程式與指令；
  • /usr/bin ：放置可執行程式，如前所說，這個目錄的檔案與 /bin 幾乎是相同的；
  • /usr/include ：c語言的header檔；
  • /usr/lib ：內含許多程式與子程式所需的函式庫；
  • /usr/local ：在你安裝完了 Linux 之後，基本上所有的配備你都有了，但是軟體總是可以升級的，例如你要升級你的 proxy 服務，則通常軟體預設的安裝地方就是在 /usr/local 中（ local 是『當地』的意思），同時，安裝完畢之後所得到的執行檔，為了與系統原先的執行檔有分別，因此升級後的執行檔通常擺在 /usr/local/bin 這個地方；
  • /usr/sbin ：放置管理者使用程式，與 /sbin 相同；
  • /usr/doc ：放置一些系統說明文件的地方，（RedHat 7.0 以後改放在 /usr/share/doc 下）；
  • /usr/man ：放置一些程式的說明檔的地方，（RedHat 7.0 以後放在 /usr/share/man 底下）；
  • /usr/src ：這是放置核心原始碼的預設目錄；
  • /usr/X11R6 ：X Window System存放相關檔案的目錄 。
  • /var ：這是系統在工作時，預設的工作目錄，例如這架主機使用者的登錄檔案資訊、尚未寄出的郵件存放地、接收的郵件放置處等等；

需要注意的目錄
在 Linux 系統中，有幾個目錄是特別需要注意的，以下提供幾個需要注意的目錄，以及預設相關的用途：
  • /etc：這個目錄相當重要，如前所述，你的開機與系統資料檔案均在這個目錄之下，因此當這個目錄被破壞，那你的系統大概也就差不多該死掉了！而在往後的文件中，你會發現我們常常使用這個目錄下的 /etc/rc.d/init.d 這個子目錄，因為這個 init.d 子目錄是開啟一些 redhat 這個 Linux 系統服務的 scripts （可以想成是 批次檔 ）的地方。而在 /etc/rc.d/rc.local 與 /etc/rc.d/rc.sysinit 這兩個檔案是開機的執行檔，有點像是舊 Windows 系統下的 autoexec.bat 及 config.sys 檔。所以，如果你有需要在開機載入的服務或執行檔案，可以寫在這兩個檔案的最後一行，則開機時就會自動幫你載入執行檔了！
  • /bin, /sbin, /usr/bin, /usr/sbin：這是系統預設的執行檔的放置目錄，例如 root 常常使用的 userconf, netconf, perl, gcc, c++ 等等的資料都放在這幾個目錄中，所以如果你在提示字元下找不到某個執行檔時，可以在這四個目錄中查一查！
  • /usr/local：這是系統預設的讓你安裝你後來升級的套件的目錄。例如，當你發現有更新的 Web 套件（如 Apache ）可以安裝，而你又不想以 rpm 的方式升級你的套件，則你可以將 apache 這個套件安裝在 /usr/local 底下。安裝在這裡有個好處，因為目前大家的系統都是差不多的，所以如果你的系統要讓別人接管的話，也比較容易上手呀！也比較容易找的到資料喔！因此，如果你有需要的話，通常我都會將 /usr/local/bin 這個路徑加到我的 path 中。
  • /home：這個是系統將有帳號的人口的家目錄設置的地方。
  • /var：這個路徑就重要了！不論是登入、各類服務的問題發生時的記錄、以及常態性的服務記錄等等的記錄目錄，所以當你的系統有問題時，就需要來這個目錄記錄的檔案資料中察看問題的所在囉！而 mail 的預設放置也是在這裡，所以他是很重要的喔！
  • /usr/man, /usr/local/man：這兩個目錄為放置各類套件說明檔的地方，例如你如果執行 man man，則系統會自動去找這兩個目錄下的所有說明檔，如果有相同的資料就會叫出來給你幽！

一般主機可能會分配的磁碟情況
通常一般的大型主機都不會將所有的資料放置在一個磁碟中（就是只有一個『 / 』根目錄），這有幾個目的：
  1. 安全性考量：你的系統通常是在 /usr/ 中，而資料庫則可能放置在 /home 當中，至於一些開機資料則放置在 /etc 當中。如果將所有的資料放在一起，當你的系統不小心被駭客破壞，或者不小心自己砍了一個小東西，則所有的咚咚也都跟著不見了.....這對於我們市井小民或許無所謂，再安裝一次就好了，但是對於一些大型企業可不行這樣！因此需要將資料分別放置於不同的磁碟中，會比較保險些。
  2. 便利性：如果你需要升級你的系統的話，是否需要重新 format 安裝呢？有些資料例如 /home 裡面的資料為個人用戶的資料，似乎與系統無關！所以如果你將這些資料分別放置於不同的磁碟，則你要升級或者進行一些系統更動時，將比較有彈性。
你或許可以將你的系統做成這樣的分佈：
  • /
  • /boot
  • /usr
  • /home
  • /var
這是比較常見的磁碟分佈情況，其中，
  1. / 根目錄可以分配約 256 MB 以內；
  2. /boot 大概在 50 MB 就可以了，因為開機檔案並不大；
  3. /var 就至少需要 1GB 以上，因為你的 mail 、 proxy 預設的儲存區都在這個目錄中，除非你要將一些設定改變！
  4. /home 與 /usr 通常是最大的，因為你所安裝的資料都是在 /usr/ 當中，而用戶資料則放置在 /home 當中，因此通常書上都會建議你將所剩下的磁碟空間平均分配給這兩個目錄說！
2002/ 01/01以來統計人數

本章問題討論：
  1. Q：Xwindows 的設定檔為 XF86Config，請問這個檔案在 RedHad 的哪裡？
    A：
    這個檔案放置在 /etc/X11 底下，通常我們在設定 X-Windows 時，比較喜歡用 Xconfigurator 來做簡單的設定，也可以使用 XF86Setup 來做設定；
  2. 等待加入新討論：


Linux 基本指令介紹
最近更新日期：2001/08/04
一定要先學會的指令：ls, more, cd, pwd, rpm, ifconfig, find
登入與登出（開機與關機）：telnet, login, exit, shoudown, reboot
Linux 多人多工與背景執行功能 ：& 與 [ctrl]+[z], fg, ps, kill
檔案與目錄管理：cd, pwd, ls, cat, more, mkdir, rm, rmdir, mv, cp, ln, find, whereis, chmod, chown, chgrp, df, du
磁碟與硬體管理：mount, fdformat, fdisk, mke2fs, mkbootdisk, badblocks, fsck, rpm
系統管理員：su, clear, dmesg, groupadd, useradd, userconf, passwd, who, whoami, top, free, quotacheck, edquota
壓縮指令：compress, gzip, tar
一些網路功能：ifconfig, route, netstat, hostname, ping, nslookup,talk, traceroute, mail
其他有的沒的：date, cal, grep
ftp 指令：ftp, ncftp, gftp
相關設定指令：set, uname, setup, lilo, Xconfigurator, xf86config
X-Window內的設定指令 ：startx, netconf, netcfg, XF86Setup
問題討論：增加新硬碟,增加新使用者,製作開機磁片,

特別說明：
先說明一下，基本上雖然 Linux 目前對於圖形界面的使用已經支援的相當的不錯，但是對於一些比較細微的設定方面，畢竟是比不上使用傳統的文字介面來的有效！並且，使用文字介面來設定對於瞭解 Linux 有一定的幫助，畢竟 Linux 與 MS 的咚咚是不太相同的！鳥哥特別建議大家使用文字介面來解決問題！

除此之外，使用文字介面登入 Linux 對於系統資源的損耗也比較少，相對的，就有比較多的資源可以做為網路的用途，進而增加 Linux 的效能。尤其，在我們這個網頁中，基本上是以一般被淘汰的 586 系列電腦做為主機，因此對於記憶體與 CPU 的效能要求並不高，所以能有效的減少系統資源的浪費就盡量的減少一些容易耗掉系統資源的廢物吧！

底下我們會分門別類的將各個比較常用的指令給搬上來，你可以參考一下。另外一個最重要的地方是，在 Linux 主機上，已經內建各個指令的說明內容了，而且是很詳細的線上說明，你可以使用：
[root@tsai root]# man command <=== command 為你欲查詢的指令名稱
[root@tsai root]# info command

在上表中，針對 command 這個指令你可以使用 man 或者是 info 來查詢他的功能與說明，例如你要查尋 ls 這個指令時，你可以輸入： man ls 或 info ls 來查詢一下！適當的利用線上查詢對於你的英文及相關的指令功能有一定程度的幫助喔！

登入與登出（開機與關機）
telnet
這套軟體在 Windows 及 Linux 系統中都存在，只是介面有點不很相同就是了。基本上，這個程式是 user 端用來連線登入遠端主機的。例如鳥哥人在台南，但是我可以在台南使用可以連上 Internet 的電腦，經由 telnet 連線上家裡的 Linux 主機，而進行設定！感覺上就好像在家裡玩自己的 Linux 主機一樣！
一般來說，如果你是使用 Winodows 系統，則你可以在『開始』-->『執行』後，輸入 telnet xxx.yyy.zzz.qqq ，其中， xxx.yyy.zzz.qqq 為 IP 位址，則可以連上主機（或者是 BBS ）囉。當然，如果您是在 Linux 系統下，亦可直接輸入 telnet xxx.yyy.zzz.qqq 來連上主機或BBS喔！
語法： telnet 主機位址（或主機名稱）
login
登入系統的指令，在遠端進入系統時，程式會自動執行。假設你所要登入的系統主機為 sun.os.test.com ，則你可以在 Windows 底下的 Telnet 軟體，或其他軟體上，執行：
telnet sun.os.test.com
則會出現如下的畫面：
SunOS 5.7

login: username
Password:

sun# _

你只要有 username 及 pass word 就可以登入系統啦！在你登入系統後， sun# 是提示字元，相當於古早的 C:\> 的意思！
exit
這是離開 Linux 系統的指令，相當於 login out 的意思。
sun# exit
shutdown
Linux 用來關機的指令，這個指令只有 root 才有權力下！ shutdown 的用法如下：
[root@tsai root]# shutdown <==系統在兩分鐘後關機，並傳送訊息給在線上的人
[root@tsai root]# shutdown -h now <==系統立刻關機
[root@tsai root]# shutdown -r now <==系統立刻重新開機
[root@tsai root]# shutdown -h 20:30 <==系統在今天的 20:30 分關機
[root@tsai root]# shutdown -h +10 <==系統在 10 分鐘後關機
reboot
這是鳥哥最常用來重新開機的指令（或關機），可以配合寫入緩衝資料的 sync 指令動作，如下：
[root@tsai root]# sync; sync; sync; reboot

Linux 多人多工與背景執行功能
多人多工

Linux 最為人所稱道的即是其多人多工的能力，你可以在任何時刻連線上來你的 Linux 主機，並且同時做很多的工作，例如同時執行 http 的 Web 功能，同時進行 fortran 等程式語言的編輯，並同時上網聊天！你會懷疑， Windows 98 也可以做到這樣的地步呀！不過，不要忘了，在 Linux 的系統下，你所做的任何工作都是獨立的，你可以隨時將你所不要的工作給殺掉，而且，當其中某一個程式當掉的時候， Linux 並不會當機，只要你在其他的視窗再開啟一個終端介面，然後查出當機的那一個指令的 process （過程），然後將之殺掉就可以了！根本不用再重新開機！也因為這種多人多工的強大能力，因此， Linux 系統一般來說是很少當機的，並且，由於其記憶體的管理功能完善，因此也不容易有 CPU 過熱的情況發生（如果只是做為一般伺服器使用）。

在你的 Linux 主機中，可以支援七個終端視窗介面，你可以按[Alt]+[F1].....[F7]來切換不同的終端機介面！所以當其中一個終端機介面當機的時候，你可以在另外一個終端機登入，然後查出錯誤的所在（使用 ps -aux 的功能），再以 kill 將錯誤的地方殺掉即可！

背景執行

另外一個功能，就是『背景執行』的功夫了。當你輸入
[root@tsai root]# cp file1 file2 &

這一串指令的時候，表示將 file1 這個檔案複製為 file2 ，且放置於背景中執行，也就是說執行這一個命令之後，在這一個終端介面仍然可以做其他的工作！而當這一個指令（ cp file1 file2 ）執行完畢之後，系統將會在您的終端介面顯示完成的消息！很便利喔！

多人多工的問題

多人多工確實有很多的好處，但其實也有管理上的困擾，因為使用者越來越多，將導致你管理上的困擾哩！另外，由於使用者日盛，當使用者達到一定的人數後，通常你的機器便需要升級了，因為 CPU 的運算與 RAM 的大小可能就會不敷使用！

& 與 [Ctrl]+[z]

如前所述，背景執行可以提供你在同一個終端機介面（命令模式）當中同時做很多的事情，你可以使用 & 或 [Ctrl]+[z] 來將指令放置背景中執行。例如執行 find "/" -name httpd & 這一行命令，表示將尋找 httpd 這個檔案的指令放置到背景中執行的意思。另外，當你執行一個需要長時間的程式，例如執行 ftp 程式時，在程式進行當中，也可以經由按下 [Ctrl]+[z] 來將程式放置於背景中。那如何由背景中將程式在叫回螢幕上呢？請參考下一個指令 fg。
fg
fg 是將程式再叫回螢幕上顯示的一個指令，在終端模式中輸入 fg 即可。當然，如果你當時並沒有程式在執行的話，系統會告訴你，並無執行中程式（no such job）。
ps -aux
這是察看執行中的程式的一個指令，你可以配合其參數 -aux 來執行，如下：
[root@tsai root]# ps -aux

則系統將會列出連同系統服務的程式，在輸出的第一列中會出現 『PID』字樣，在那一欄中的咚咚就是每一個程式執行的代碼。例如下面的輸出畫面。
[root@tsai root]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1324 532 ? S Jul16 0:14 init [3]
root 2 0.0 0.0 0 0 ? SW Jul16 0:05 [kflushd]
root 3 0.0 0.0 0 0 ? SW Jul16 0:29 [kupdate]
root 4 0.0 0.0 0 0 ? SW Jul16 0:00 [kpiod]
root 5 0.0 0.0 0 0 ? SW Jul16 0:00 [kswapd]

在上圖中， init 這個程式的 PID 為 1 。

kill
這是用來殺掉執行中程式的指令，需配合 ps 這個指令，當你執行一個 ftp 程式，但是他有點當當的時候，你可以 ps -aux 這個指令查出 ftp 這個程式的代碼（PID），假設其 PID 為 110 ，然後輸入：
[root@tsai root]# kill 110

即可殺掉這個 ftp 程式。

檔案與目錄管理
cd
這是用來變換工作路徑的指令。一登入 Linux 系統後，root 會在 /root 下，至於使用者會在預設的 /home/username 底下，例如鳥哥的 ID 為 vbird ，則以 vbird 的身份登入後，會到 /home/vbird 這個路徑下。OK！那回到上一層可以用 cd .. 而到相對路徑可到 cd ../bird，至於絕對路徑則是 cd /usr/sbin ！注意喔，在前面的提示字元會改變路徑名稱！
[root@tsai /root]# cd .. <== 回到上一層
[root@tsai /]# cd <== 回到使用者目錄
[root@tsai root]# cd /usr/bin <== 到 /usr/bin 這一個目錄
[root@tsai bin]# <== 看吧！到 bin 這個目錄下囉！
pwd
這是顯示目前所在目錄的指令，例如在上個表格最後的目錄是 /usr/bin 這個目錄，但是提示字元僅顯示 bin ，如果你想要知道目前所在的目錄，可以輸入 pwd 即可：
[root@tsai bin]# pwd
/usr/bin <== 顯示路徑囉！
[root@tsai bin]#
ls
這是用來顯示檔案名稱與內容的指令，檔案的內容說明已經在 這裡 說明過了，在此不再重複！ ls 的語法為：
[root@tsai bin]# ls --color 以彩色顯示檔案資料
[root@tsai bin]# ls -l 詳細列出檔案系統結構
[root@tsai bin]# ls -a 顯示隱藏檔（以"."開頭的檔案）
[root@tsai bin]# ls -al 同時顯示隱藏檔與詳細資料
[root@tsai bin]# ls -al|more 將檔案內容以一頁一頁顯示
cat
這是將檔案內容列出的指令。例如在 /root 下有一個檔名為 .bashrc （這是系統預設的檔案，是隱藏檔），你可以按下 cd 回到 /root 目錄後，執行：
[root@tsai /root]# cat .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm
          -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls
          -l'
alias lm='ls
    -al|more'

上面顯示的就是 .bashrc 這個檔案的內容啦！基本上，cat 與 DOS 下的 type 是相同的！
more
是否覺得 cat 在讀取較大的檔案的時候會有看不到的資訊呢（如果檔案太大的話），這時候你可以用 more 來一頁頁讀取喔！另外， more 也可以與其他的程式合併使用，例如 ls ！（如下表中，『｜』就是分隔號，可以將兩個指令放在一起執行！）
[root@tsai /root]# more .bashrc
[root@tsai /root]# ls -al|more
mkdir
建立新的目錄！例如我們要建立一個 test 的目錄，你可以這樣下指令：
[root@tsai /root]# mkdir test
[root@tsai /root]# ls -l
再執行了 ls -l 之後，你就可以看到 test 這個目錄啦！
rm -irf
這是移除的指令，相當於 dos 下的 del 指令！這裡要注意的是，通常在 Linux 系統下，為了怕檔案被誤殺，所以都已經有 -i 這個參數， -i 是指每個檔案被殺掉之前都會確認一次。而如果要連目錄下的東西都一起殺掉的話，就要使用 -rf 這個參數了！你可以用下面這個例子來試試看有什麼不同的現象！
[root@tsai /root]# rm test
[root@tsai /root]# rm -rf test
rmdir
mkdir 是建立目錄，而 rmdir 就是移除目錄的指令。不過，若是欲移除的目錄裡頭有檔案或其他目錄存在，就無法移除，這時就要用剛剛的 rm -rf 來移除啦！
mv
這是移動檔案或目錄的指令，例如我們要將 .bashrc 這個檔案移動至根目錄下，則：
[root@tsai /root]# mv .bashrc /
[root@tsai /root]# mv /.bashrc .
而將檔案移動至目前的工作目錄，則加上 "." 這個字！

語法： mv 來源檔（或目錄）目的檔（或目錄）

cp
就是 copy 的意思。例如我們要將 .bashrc 這個檔案複製到 /home 底下，可以：
[root@tsai /root]# cp .bashrc /home

語法： cp 來源檔 目的檔

ln
ln -s 真實目錄或檔案 連結的目錄或檔案：這是連結檔案或目錄的指令，通常我們都會加 -s 這個參數，例如我們將 /usr/bin 這個目錄連接到 /root 底下，可以這樣輸入：
[root@tsai /root]# ln -s /usr/bin bin
不過請注意喔，在你的 /root 底下的 bin 這個目錄中的所有檔案其實都是 /usr/bin 裡面的東西，所以你如果進入 /root/bin 內亂殺東西的話，等於是將 /usr/bin 內的檔案殺掉喔！

語法： ln -s 來源檔（或目錄）目的檔（或目錄）

find
尋找檔案的指令，會將欲尋找的檔案找出來，例如下面的例子：
[root@tsai /root]# find / -name bin
上面的意思為：在 / 目錄（根目錄）下尋找檔名（-name）為 bin 的檔案，要注意的是，因為 Linux 的檔案很多，如果你的電腦比較舊，可能會找很久...

語法： find 路徑 -name 檔名

whereis
相對於 find ，你也可以使用 whereis 這個指令來下達找尋的檔案，whereis 利用曾經找過的系統資訊內的資料去找檔案，所以速度會很快，不過，如果 whereis 找不到的話，並不代表該檔案真的不存在！這個要小心！
[root@tsai /root]# whereis bin
bin: /usr/bin
chmod
這是變更檔案屬性的指令，通常鳥哥都是以數字作為改變屬性的依據；在檔案的屬性中， r 為4分、w 為2分， x 為1分，如果你想要讓你剛建立的一個檔案，讓大家都看到的話，即你需要『-rw-r--r--』，這是你的三個群組的分數分別是 r+w=6, r=4, r=4，所以可以下達：
[root@tsai /root]# chmod 644 .bashrc
[root@tsai /root]# ls -al .bashrc
-rw-r--r-- 1 root root 216 Apr 8 13:54 .bashrc
chown
記得檔案有『擁有人』及『擁有群組』吧，這個 chown 就是在改變擁有者的指令。例如你 copy 一個檔案給 vbird ，但是因為你的身份是 root ，所以你 copy 過去的檔案 vbird 可能不能使用，因此你需要將檔案的擁有人改成 vbird 才可以！如下：
[root@tsai /root]# cp .bashrc /home/vbird
[root@tsai /root]# cd /home/vbird
[root@tsai vbird]# chown vbird .bashrc
那如果想要將整個目錄下的檔案都改變擁有者與擁有群組呢？可以下達
chown -R username:groupname directory (ex> chown -R root:root /root)
即可喔！
chgrp
作用與 chown 相似，只是在改變檔案或目錄的『擁有群組』。
df
這是用來察看硬碟空間的指令。由於我們目前將檔案都建立在根目錄『/』下，所以只要沒有空間，則所有檔案都無法複製進來系統。不過，若你規劃出多的硬碟，則可以察看你的硬碟空間資訊，如下所示：
[root@tsai /root]# df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 964312 87648 827680 10% /
/dev/hdb5 2150420 745500 1295680 37% /home
/dev/hdb1 2016016 1419708 493896 74% /usr
/dev/hda1 1022080 349880 672200 34% /win98
上面說，Filesystem 是硬碟所在的劃分表， Used 是指使用掉的硬碟空間（KB），Available是剩下空間，Mounted on則是這顆硬碟代表哪一個目錄。如上所示，根目錄(/)在 hda5 這顆硬碟，總空間有 964312 KB，剩下可用空間為 827680KB，至於 /win98 則在 hda1 中，且全部空間有 1022080 KB。

如果要將資料型態以 MB 數顯示的話，可以輸入 df -m 來達成。

du
這是用來察看目錄內所有檔案使用掉的空間的情況，如下所示：
[root@tsai /root]# du -m
其中， du 預設的檔案輸出資料為 KB，以參數 -m 使檔案資料顯示為 MB。

磁碟與硬體管理
mount
這是將硬碟或者是光碟、軟碟接掛上系統的指令！之前有提過，在 Linux 下面，每一個裝置都是一個檔案（或目錄），而每一種裝置的檔案型態都不相同，因此對於 mount 後面加的參數就很重要囉：例如：
[root@tsai /root]# mount -t iso9660 /dev/cdrom /mnt/cdrom <=光碟
[root@tsai /root]# mount -t vfat /dev/fd0 /mnt/floppy <=軟碟(windows 系統檔)
[root@tsai /root]# mount -t ext2 /dev/fd0 /mnt/floppy <=軟碟(Linux 系統檔)
[root@tsai /root]# mount -t ext2 /dev/hdc1 /mnt/harddisk <=硬碟
光碟裝置檔=/dev/cdrom、軟碟裝置檔=/dev/fd0、硬碟裝置檔=/dev/hdxx。
如上表所示， -t 是參數，至於 iso9660, vfat, ext2則是這些裝置的檔案型態！後面接的則是這個裝置所在的目錄！千萬記得，這些目錄需要是早已存在的，而且最好是空的目錄，不然目錄裡面原本存在的檔案會不見去！
另外，注意喔！當你 mount 上光碟機或軟碟的時候，請不要輕易的拿出磁片（而且光碟片也不會被你退出），因為會造成系統讀取的錯誤！你應該用 umount 來退出！指令為
umount /mnt/cdrom （umount 裝置所在目錄）
fdformat
這是用來『低階格式化』軟碟的指令。（注意：軟碟的裝置檔為 /dev/fd0 ）不必將軟碟 mount 就可以格式化了，指令內容為：
[root@tsai /root]# fdformat /dev/fd0H1440
注意喔！在上面的裝置檔案為 /dev/fd0H1440 ，其中加在 /fd0 之後的 H1440 為表示 1.44MB 的軟碟容量！在低階格式化之後，還要將軟碟的檔案格式化為 Linux 的 ext2 之型態，則需要使用 mke2fs 指令！
fdisk
這是對硬碟（也可以對軟碟喔）做分割的程式。基本的用法為=> fdisk 裝置檔案，假設您有一顆硬碟要重新規劃，而這顆硬碟為 hdc ，則你可以輸入：
[root@tsai /root]# fdisk /dev/hdc
然後，按下 m 會出現 help 的選單，要知道的大概只有兩個子指令，一個是刪除 partition 按 d ，一個是增加 partition 按 n，假設你要增加一個 primary partition，按下 n 再按 p 再按你要的 primary partition 號碼（1-4）就可以了。假設你的 hdc 需要規劃成為一個硬碟（即 hdc1）則在輸入 fdisk /dev/hdc 後，需要按：
n（增加） -> p（primary partition） -> 1（partition 1） -> w （儲存寫入） -> q （離開）
同樣的，分割完硬碟（或軟碟）後，要以 mke2fs 格式化！
mke2fs
這是用來將磁碟格式化成 Linux 系統檔的指令。基本上，只要寫入對的裝置檔案就可以了。例如我們要格式化軟碟的話，或是新的硬碟 hdc1 ，則可以如此寫：
[root@tsai /root]# mke2fs -c /dev/fd0
[root@tsai /root]# mke2fs -c /dev/hdc1
要記得的是，在你做這個格式化的動作時，軟碟與硬碟均不可 mount 到 Linux 的系統中。
mkbootdisk
這是製作開機磁片的指令。指令很簡單：
[root@tsai /root]# mkbootdisk --device /dev/fd0 `uname -r`
其中， `uname -r` 是目前 Linux 系統所使用的核心版本，如果你有多個核心版本的話，你以可以直接輸入核心版本。例如在這個網頁中所使用的核心有兩個版本，一個是 2.2.12-20，另一個是 2.2.18，若要以 2.2.18 設定開機的話，可以使用： mkbootdisk --device /dev/fd0 2.2.18 ！
badblocks
這是用來檢查硬碟或軟碟有沒有壞軌的指令，你可以用底下的方式來下達：
[root@tsai /root]# badblocks -svw /dev/hdc1
fsck
這是用來檢查與修正硬碟錯誤的指令。注意：通常只有身為 root 且你的系統有問題的時候才使用這個指令，否則在正常狀況下使用此一指令，可能會造成對檔案的危害！
[root@tsai /root]# fsck /dev/hdc1
通常使用這個指令的場合都是在系統出現極大的問題，導致你在 Linux 開機的時候得進入單人單機模式下進行維護的行為時，才必須使用此一指令！
rpm
這是一個安裝或者是解安裝 RedHat 軟體的指令，在 RedHat 中已經有設定了一些有點像 Windows 的軟體安裝功能，這就是 rpm 這套軟體了！而 rpm 所安裝的軟體又分為兩種形式，因此你可以分別使用下面兩種參數對不同的檔案進行安裝：
[root@tsai /root]# rpm -ivh xxxxx.rpm <==將 xxxxx.rpm 檔案安裝於 Linux 系統中
[root@tsai /root]# rpm -ivh --nodeps xxxxx.rpm <==將 xxxxx.rpm 檔案『強制』安裝於 Linux 系統中
[root@tsai /root]# rpm -Uvh xxxxx.rpm <==將 xxxxx.rpm 升級
[root@tsai /root]# rpm -e xxxxx.rpm <==將 xxxxx.rpm 解除安裝
[root@tsai /root]# rpm -q squid <==察看 squid 這一個軟體的版本
[root@tsai /root]# rpm --recompile yyyyy.src.rpm <==安裝檔名為 .src.rpm 的檔案！
這裡要注意的是， rpm 的檔案主要有兩種形式，一種是已經經過編譯的 i386.rpm 檔案，令一種是未經編譯的 .src.rpm 檔案，兩種檔案形式的安裝參數是不一樣的，請小心注意！

系統管理員
su
這是一個用來轉換你身份成為 super user （系統管理員）的指令，任何人只要知道 root 的密碼，就可以成為 super user，所以密碼可千萬不要外流呀！由於 RedHat 在主機之外的終端機上，無法以 root 的身份直接連線，所以你需要以一般身份的 user 連線之後，再以 su 指令來成為 super user：
[vbird@tsai vbird]# su <==輸入指令
Password: <==在這裡輸入 root 的密碼
[root@tsai vibrd]# <==看，使用者名稱變囉！
clear
這是用來清除螢幕畫面用的，沒有什麼太大的用處。通常是你覺得畫面太亂的時候輸入用的！直接輸入 clear 就可以了！
dmesg
在開機的時候你會發現有很多的訊息出現吧，例如 CPU 的形式、硬碟、光碟型號及硬碟分割表等等。但是訊息都是『刷』的一聲就跑過去了！這些訊息有時候對於系統管理員是很重要的，因為他提供了系統的資訊呀！要看這些訊息你可以用 dmesg 這個指令來觀看！
[root@tsai /root]# dmesg|more
加上 |more 的原因是因為訊息太多了，所以可以加入這個管線指令來使畫面暫停！
groupadd
這是用來增加群組的指令，通常鳥哥都不用這個指令的，因為有更容易使用的指令 /bin/userconf 可以使用哩（注意，在 RedHat 7.0 以後的版本，就要使用 /sbin/userconf 哩）！
useradd
這是用來增加使用者的指令，鳥哥通常不使用這個指令，你可以使用 /bin/userconf 這個指令，更簡單易用喔（是視窗介面的喔！）（注意，在 RedHat 7.0 以後的版本，就要使用 /sbin/userconf 哩）
userconf
這是用來增加使用者、群組等，且以視窗為介面的一個指令！如果你是以遠端登入，並使用 su 指令成為 super user 的話，直接輸入 userconf 可能會找不到這個指令，你可以輸入： /bin/userconf 來啟動這個指令！（注意，在 RedHat 7.0 以後的版本，就要使用 /sbin/userconf 哩），由於這個指令的圖示較多，請到這裡來看看！
passwd
這是用來更改密碼的指令，很簡單，只要在提示字元下輸入 passwd ，然後輸入目前的密碼，再輸入兩次欲修改成的新密碼，就修改OK了！不過要注意，密碼的形式：不能與帳號相同，且需要 8 個字元以上，另外，帳號也不能太簡單！否則系統會不接受！
[vbird@tsai vbird]# passwd
Changing password for vbird
(current) UNIX password: <==這裡輸入目前的密碼
New UNIX password: <==這裡輸入新的密碼
Retype new UNIX password: <==這裡再輸入新的密碼一次
passwd: all authentication tokens updated successfully
who
這是用來視察目前在系統上的使用者指令，你也可以使用 w 這個指令來下達動作。
[root@tsai /root]# who
root pts/0 Aug 2 20:43

[root@tsai /root]# w
8:48pm up 4 days, 5:08, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.2 8:43pm 0.00s 0.38s ? -

基本上，who 與 w 的功能是相同的，只是 who 僅列出使用者名稱與登入時間，至於 w 則會列出使用者的
  • 來源位址（IP）：就是 FROM 那一項即是IP；
  • 登入時間：即是 LOGIN@ 那一項；
  • 工作項目：就是 WHAT 那一項！
whoami
這是用來確認你目前的身份的指令，由於你可能會有幾個身份在你的機器上，所以需要以這個指令來確認你的身份，不過由於 Linux 會將使用者名稱寫在提示字元上，所以這個指令目前比較少用到了。
top
這是用來指示目前系統的服務項目的動態資料。
[root@tsai /root]# top
10:14pm up 4 days, 6:34, 1 user, load average: 0.01, 0.01, 0.00
40 processes: 39 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 0.5% user, 0.3% system, 0.0% nice, 99.0% idle
Mem: 63124K av, 60844K used, 2280K free, 23604K shrd, 35648K buff
Swap: 104380K av, 1684K used, 102696K free 10788K cached

PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND
3121 root 20 0 1016 1016 820 R 0 0.9 1.6 0:47 top
1 root 0 0 380 368 320 S 0 0.0 0.5 0:04 init
2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd
3 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kupdate
4 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kpiod
5 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kswapd
6 root -20 -20 0 0 0 SW< 0 0.0 0.0 0:00 mdrecoveryd
366 bin 0 0 308 288 228 S 0 0.0 0.4 0:00 portmap
382 root 0 0 392 376 328 S 0 0.0 0.5 0:00 apmd
435 root 0 0 488 480 388 S 0 0.0 0.7 0:00 syslogd
446 root 0 0 688 676 316 S 0 0.0 1.0 0:00 klogd

輸入 top 之後，會出現類似上面的顯示情況。上圖中說明了你的記憶體有63124K，而下方的面版說明了目前正在執行中的工作內容！
free
這是用來察看記憶體的指令。
[root@tsai /root]# free
total used free shared buffers cached
Mem: 63124 60732 2392 23136 35648 10796
-/+ buffers/cache: 14288 48836
Swap: 104380 1684 102696
如上圖中，說明總記憶體容量為 63124K，而使用了 60732K，另外，虛擬記憶體（Swap）共有 104380K（亦即共有 100MB 的虛擬記憶體）。
quotacheck, edquota
這些檔案是用來限制使用者在 Linux 主機上的硬碟使用容量。例如，有十個人同時分享一個 2G 的硬碟空間，但是有一個使用者就用了 1.5 GB 的容量，那相對的，其他人可使用的空間就只有剩下 0.5G 啦！不公平對不對，而且也怕被使用者填充大量的垃圾，而使用系統資源被瓜分掉！因此就有 Quota 這個咚咚的出現啦！由於執行的步驟較為繁瑣，所以額外寫了一個頁面，請到這裡來看看。

壓縮指令
compress
這是用來壓縮及解壓縮檔名為 .Z 的壓縮檔。要注意的是，用 compress 壓縮的時候，會將原檔案殺掉而變成檔名為 .Z 的檔案，例如你壓縮一個名為 bird.test 的檔案，則壓縮完成後只會剩下 bird.test.Z 這個壓縮檔！當然，解壓縮的時候也是一樣的，壓縮檔不見了，只有剩下被解壓縮的檔案。指令如下：
[root@tsai /root]# compress xxxxx <==將 xxxxx 檔案壓縮成為 xxxxx.Z 檔名
[root@tsai /root]# compress -d xxxxx.Z <==將 xxxxx.Z 解壓縮成 xxxxx
上表中，解壓縮也可以用 uncompress xxxxx.Z 來達成！
gzip
這個也是一個壓縮指令，與 compress 很相似，指令的用法也相同！只是壓縮的檔名為 .gz 罷了！
[root@tsai /root]# gzip xxxxx <==這是壓縮指令
[root@tsai /root]# gzip -d xxxxx.gz <==這是解壓縮指令
tar
這是一個很棒的壓縮指令，這個指令可以配合 gzip 來進行整個目錄的壓縮！例如有一個名為 bird 的目錄要被你整合成一個檔案，你可以使用：tar -xvf *.tar *（其中 * 為你所要整合的目錄名稱）。
[root@tsai /root]# tar -cvf bird.tar bird <==只有將目錄轉成一個檔案，沒有壓縮
[root@tsai /root]# tar -zcvf bird.tar.gz bird <==壓縮一整個目錄成為 .tar.gz 檔案
上面這個例子的 bird.tar 只是將 bird 這個目錄整個拷貝成為一個檔案而已，並沒有壓縮，而 bird.tar.gz 則是將 bird 這個目錄壓縮成為一個檔案！基本上，我們都是使用 -zxvf 來壓縮一整個目錄的！而如果是要解壓縮呢？由於有沒有壓縮所下的參數並不相同，所以針對兩種檔案也是有兩種參數的組合：
[root@tsai /root]# tar -xvf bird.tar
[root@tsai /root]# tar -zxvf bird.tar.gz
上面則是解壓縮的參數！
注意了，用 compress 及 gzip 壓縮及解壓縮的時候，會將原檔案取代掉！而使用 tar 來壓縮及解壓縮的時候，原檔案將會與產生檔案同時存在！通常我們都是使用 tar 來進行壓縮或解壓縮的！（當然，你還是可以使用 compress 及 gzip 來壓縮一個大的檔案！）

一些網路功能
ifconfig
這是用來查詢目前我們這個系統的網路卡的狀況的指令，可以查詢 IP、子遮罩網路及網路卡的硬體資訊等等。例如：
[root@tsai /root]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:FC:20:F1:4D
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7651977 errors:0 dropped:0 overruns:0 frame:0
TX packets:7467862 errors:0 dropped:0 overruns:0 carrier:0
collisions:961 txqueuelen:100
Interrupt:10 Base address:0x6100

eth1 Link encap:Ethernet HWaddr 00:80:C8:5A:87:01
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7492497 errors:0 dropped:0 overruns:0 frame:0
TX packets:7617653 errors:0 dropped:0 overruns:0 carrier:0
collisions:289 txqueuelen:100
Interrupt:9 Base address:0x6200

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:512 errors:0 dropped:0 overruns:0 frame:0
TX packets:512 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

ppp0 Link encap:Point-to-Point Protocol
inet addr:211.74.249.38 P-t-P:172.16.11.8 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:7469726 errors:0 dropped:0 overruns:0 frame:0
TX packets:7617651 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10

由於上面的例子是使用兩張網路卡，因此會有 eth0 及 eth1 兩個介面，至於 lo 是系統內設的遞迴網路，這是一定會有的咚咚，而且其 inet addr（IP）一定是 127.0.0.1！另外， ppp0 則是 ADSL 撥接之後所產生的虛擬介面（對外的介面！）。在這個例子中，鳥哥使用了兩張網路卡， eth0 用在內部網路， eth1 用在 ADSL 撥接，所以 eth1 就沒有 address。至於第一張網路卡的網路位址是虛擬的 192.168.1.2。而真正的對外聯繫是 ppp0 這一個撥接介面，其 internet 是 211.74.249.38！
route
這是用來看你的網路通訊包傳送的路由情況的指令。由於通信包是藉由一個一個的路由表來傳遞的，所以觀察你的路由表，對於網路除錯（debuge）就很重要啦！
[root@tsai /root]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.2 * 255.255.255.255 UH 0 0 0 eth0
172.16.11.8 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 172.16.11.8 0.0.0.0 UG 0 0 0 ppp0
例如上表中，所有的通訊都是藉由 ppp0 這一個介面卡（Iface）並且其通訊閘（Gateway）為 172.16.11.8 這一個！另外，在虛擬 IP （內部網路）則是藉由 eth0 （192.168.1.2）這一塊網卡來連線的！

另外，你也可以使用 route 來加入你的路由表，假如你要將一個網路為 192.56.76.XXX 且子網路為 255.255.255.0 的位置加入你的 eth0 這個網路卡的連線處理中，就可以使用如下的語法：
[root@tsai /root]# route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0

netstat
這也是用來觀察網路狀況的指令。
[root@tsai /root]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 126 swks249-38.adsl.:telnet 192.168.1.15:1341 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 87643 /dev/log
unix 0 [ ] STREAM CONNECTED 116 @00000012
在上表黃色的部分，由於鳥哥是在另一部電腦連線進入的，所以網路位址就會不同囉！
hostname
這只是用來觀看你的主機名稱而已。
[root@tsai /root]# hostname
tsai.adsldns.org
ping
這是用來察看對方網路是否有動作的指令，這個指令亦可以在 windows 上面執行！
[root@tsai /root]# ping www.kimo.com.tw
PING www.kimo.com.tw (202.1.237.21) from 211.74.249.38 : 56(84) bytes of data.
64 bytes from 202.1.237.21: icmp_seq=0 ttl=245 time=56.7 ms
64 bytes from 202.1.237.21: icmp_seq=1 ttl=245 time=58.0 ms
64 bytes from 202.1.237.21: icmp_seq=2 ttl=245 time=58.7 ms
64 bytes from 202.1.237.21: icmp_seq=3 ttl=245 time=52.0 ms
64 bytes from 202.1.237.21: icmp_seq=4 ttl=245 time=72.2 ms
--- www.kimo.com.tw ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 52.0/59.5/72.2 ms
例如上表中，我們去觀察 www.kimo.com.tw 是否有啟動，看每一列的最後一行，會告訴你訊息回應的時間大約是 56ms！（10-3 sec.）
nslookup
這是用來查詢或反查詢 DNS 的指令！例如我們要知道 奇摩 的網路位址，則可以如此查詢：
[root@tsai /root]# nslookup www.kimo.com.tw
Server: ksdns.seed.net.tw
Address: 139.175.10.20

Non-authoritative answer:
Name: www.kimo.com.tw
Address: 202.1.237.21

系統會告訴你，我們使用的 DNS server 是 ksdns.seed.net.tw，而查詢到的網址是 202.1.237.21。如果需要更詳細的查詢，可以用下面的方式來查！
[root@tsai /root]# nslookup
Default Server: ksdns.seed.net.tw
Address: 139.175.10.20

> set type=any <==告訴系統我們要詳細的資料！
> www.kimo.com.tw
Server: ksdns.seed.net.tw
Address: 139.175.10.20

Non-authoritative answer:
www.kimo.com.tw internet address = 202.1.237.21

Authoritative answers can be found from:
kimo.com.tw nameserver = ns1.kimo.com.tw
kimo.com.tw nameserver = ns1.yahoo.com
kimo.com.tw nameserver = ns3.europe.yahoo.com
kimo.com.tw nameserver = ns5.dcx.yahoo.com
ns1.kimo.com.tw internet address = 210.59.144.1
ns1.yahoo.com internet address = 204.71.200.33
ns3.europe.yahoo.com internet address = 217.12.4.71
ns5.dcx.yahoo.com internet address = 216.32.74.10

talk
這是用來交談的指令。
traceroute
這是用來追查通訊包傳送的情況，例如我們要從 seednet 的網路上查詢到成大的代理伺服器的通訊狀況，可以使用如下的指令：
[root@tsai /root]# /usr/sbin/traceroute proxy.ncku.edu.tw
traceroute to proxy.ncku.edu.tw (163.28.112.100), 30 hops max, 38 byte packets
1 172.16.11.8 (172.16.11.8) 128.378 ms 68.920 ms 118.313 ms
2 139.175.15.1 (139.175.15.1) 54.146 ms 38.557 ms 44.320 ms
3 R58-37.seed.net.tw (139.175.58.37) 61.339 ms 43.177 ms 39.548 ms
4 R56-162.seed.net.tw (139.175.56.162) 66.631 ms 43.182 ms 41.429 ms
5 203.72.191.222 (203.72.191.222) 65.538 ms 61.379 ms 38.887 ms
6 140.116.241.230 (140.116.241.230) 40.159 ms 46.107 ms 46.854 ms
7 proxy.tnrc.edu.tw (163.28.112.100) 38.641 ms 57.286 ms 46.380 ms
系統會告訴你，總共通過了7個路由，並列出了每一個路由的 Internet 位址。這個東西有個好處，可以告訴你，當網路出問題時，問題是在哪一個地方！
mail
這是用來收發信件的指令，詳細的流程我們會在 mail 架站中提及。

其他有的沒的
date
這是用來察看日期的指令。
[root@tsai /root]# date
Fri Aug 3 19:09:31 CST 2001
cal
這是用來叫出日曆的指令。
[root@tsai /root]# cal
August 2001
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
grep
這是用來搜尋某些特定字元的指令。例如使用 ps -aux 查詢系統服務時，我們只需要知道 sendmail 是否有動作，則可以使用管線指令『|』來加入 grep 這個指令同時運作。
[root@tsai /root]# ps -aux|grep sendmail
root 443 0.0 1.0 2092 660 ? S Jul26 0:36 sendmail: accepti
vbird 8387 0.0 0.7 1240 492 pts/1 S 19:11 0:00 grep sendmail
上表則表示 sendmail 有在運作了！

ftp 指令
ftp
FTP 這個功能不用再多談了吧？這是用來捉取網路上免費檔案的一套軟體。例如我們要連上交大的 FTP 站捉東西，可以如下：
[root@tsai /root]# ftp linux.cis.nctu.edu.tw
Connected to linux.cis.nctu.edu.tw.
220 ProFTPD 1.2.0rc3 Server (Linux.CIS FTP server) [linux.cis.nctu.edu.tw]
Name (linux.cis.nctu.edu.tw:vbird): anonymous <==輸入 anonymous 匿名登入
331 Anonymous login ok, send your complete email address as your password.
Password: <==輸入 name@server.xxx.xxx 型態的 mail-address 密碼
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir <==檢查網站上的目錄
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
-rw-rw-rw- 1 linux adm 39491400 Aug 3 21:00 00ls-lR
-rw-rw-rw- 1 linux adm 3091546 Aug 3 21:01 00ls-lR.gz
-rw-r--r-- 1 linux wheel 232 Mar 15 22:00 00mirror.today
drwxr-xr-x 5 linux wheel 4096 Oct 29 2000 java
drwxr-xr-x 14 linux wheel 4096 Aug 2 19:31 kernel
drwxr-xr-x 4 linux wheel 4096 Sep 28 2000 mirrors
226-Transfer complete.
226 Quotas off
ftp> cd kernel/v2.4 <==進入 kernel 底下的 v2.4 目錄
250 CWD command successful.
ftp> get linux-2.4.0.tar.bz2.sign <==捉下 linux-2.4.0.tar.bz.2.sign 這個檔
local: linux-2.4.0.tar.bz2.sign remote: linux-2.4.0.tar.bz2.sign
200 PORT command successful.
150 Opening BINARY mode data connection for linux-2.4.0.tar.bz2.sign (248 bytes)
.
226 Transfer complete.
248 bytes received in 0.014 secs (17 Kbytes/sec)
ncftp
在使用 FTP 功能的時候，因為只能一次捉一個檔案，所以要捉一群檔案的時候就會有困擾。這時我們可以使用更容易登入匿名 FTP 站的 ncftp 來執行 FTP 功能！
[root@tsai /root]# ncftp linux.cis.nctu.edu.tw
ncftp / > mget -R kernel <==將 kernel 這個目錄的東西全捉下來！
加上了 mget -R 目錄 這個指令後，就可以將目錄下的東西完全捉下來！好用吧！
gftp
這是在 X-Windows 使用的圖形介面 FTP 咚咚！這個咚咚的使用方法就跟 CutFTP 很相似！

相關程式設定指令
set
這是用來設定或是觀看目前系統的設定的指令，若只打入 set 則僅會列出目前系統的參數。
uname
這是用來觀看系統名稱的指令，可以打入 -a 參數來列出所有資訊。
[root@tsai /root]# uname -a
Linux vbird.adsldns.org 2.2.12-20 #1 Mon Sep 27 10:25:54 EDT 1999 i586 unknown
setup
這個是常常使用來設定系統的一個指令，執行之後會有一個視窗出現，較常使用的是 System services 這一項，可用來設定開機的時候要開放的服務！
lilo
這是用來設定多重開機，或是開機選項的指令，詳細的流程請到這裡來看看！
Xconfigurator
這是用來簡易的設定 X-Windows 的指令，當你的 X-Windows 確定是可以跑的，而你想要改變一些設定，例如：解析度、色彩度等等，就直接使用這個指令啦！
xf86config
這是用來設定 X-Windows 的指令！這個指令會比 Xconfigurator 麻煩，不過當你的 X-Windows 沒有辦法跑的時候，這個咚咚是很好用的！

X-Window內的設定指令
startx
這是開始執行 X-Windows 的指令！
netconf
這是網路設定的指令！
netcfg
這也是網路設定的指令！
XF86Setup
這是在 X-Windows 下以圖形介面設定 解析度、色彩度 的設定指令。

本章問題討論：
  1. Q：在 Linux 上面都是一些線上的英文說明，有沒有中文說明，或更詳細的說明資料呢？
    A：
    其實在網路上已經有一票高手在進行 Linux how to 的翻譯工作，這是一個很有意義的事情，因為可以讓新手或者是一些有需要使用 Linux 的人，有一個很好的學習文件。你可以來下面的網址看看：
    中文How-to：http://www.linux.org.tw/CLDP/
    英文How-to：http://www.ibiblio.org/mdw/HOWTO/HOWTO-INDEX/howtos.html
  2. Q：在 Linux 中如何加入新硬碟？
    A：
    其實加入新硬碟的方法也是很簡單的：
    • 安裝硬碟：關掉 Linux 主機電源，調整 Hard Disk 的 Jump （master 或 slave），串接在 IDE 的介面，請注意，留意你增加的硬碟所串接的 IDE 介面為哪一個插槽，例如你插在 IDE2 的 Master ，則你的硬碟應為 hdc；
    • 新增硬體於BIOS：開啟電腦後，按 del 鍵進入 BIOS，選擇 IDE Hard Disk Detector 字樣的選項，讓BIOS去捉硬碟，然後再選擇 Save and Exit；
    • Linux 安裝：開機進入 Linux 的時候，系統會告訴你有捉到一個新的硬體，你可以按 『configure』 由系統直接安裝即可；
    • 格式化硬碟：以 root 的身份進入 Linux 後，執行以下兩個程式：
      • fdisk /dev/hdc <== hdc 與你的硬碟串接的IDE介面有關，關於這個指令的介紹請參考上面的指令說明；
      • mke2fs -c /dev/hdc1 <==假設硬碟全部配置成一個大硬碟，則硬碟應為 hdc1 ，以 mke2fs 將系統規劃為 Linux 的系統檔。
    • 開機自動載入：再來則是以 vi 修改 /etc/fstab 檔案，讓每次開機把這個硬碟直接掛入系統中。例如 hdc1 這顆硬碟掛在 /mnt/hdc1 中，則 fstab 的檔案有點像這樣：（/dev/hdc1 那一行是新加入的！）
      /dev/hda1 / ext2 defaults 1 1
      /dev/hda5 swap swap defaults 0 0
      /dev/hdc1 /mnt/hdc1 ext2 defaults 1 1
    • 安裝完成：然後再重新開機就可以啦！
  3. Q：在 Linux 中如何增加新使用者呢？
    A：
    無論是加入新使用者或者是加入新群組，都可以使用 /bin/userconf 這個程式來完成，使用這個程式，只要輸入 ID 及 pass word 就可以啦！（不過你必須是 root 的身份才可以執行！）詳細的執行請看上面的指令說明。
  4. Q：在 Linux 中如何製作開機片？
    A：
    無論何種系統，有個開機片總是比較安心的！ Linux 也是一樣！雖然他很穩定，但是並不是說就不會有問題，因此製作可開機磁片以利解救 Linux 問題是一個好習慣！製作開機片的方法很簡單，只要下達：
    • mkbootdisk --device /dev/fd0 `uname -r`
    就可以啦！
  5. 等待加入新討論：
2002/ 01/01以來統計人數


vi 文書處理軟體
最近更新日期：2001/07/17
vi 簡易說明
簡易執行範例
命令列內容說明
問題討論

vi 簡易說明
要管理好 Linux 系統﹐少不了要對設定檔案進行編輯，如果您用慣了 Microsoft Word 或 Corel Wordperfect 的話，除了 Xwindows 裡面的編輯程式(如 xemacs )用起來尚可應付外，於 Linux 的文字模式下，會覺得檔案編輯程式都沒有 Windows 程式那麼方便。雖然 Linux 下面也有好多種文書編輯器，例如﹕ed、vi、pico、joe、emacs等。

以下我們以最常見到的 vi 這套文書軟體來介紹 Linux 底下的文書編輯動作。

基本上 vi 共分為兩種模式，一種是『編輯模式』，一種被稱為『命令模式』，其中，在命令模式中尚包含『命令列模式』的情況。『編輯』與『命令』這兩種模式的切換動作是以『Esc』來達成的。通常，檔案一開啟或者新建檔時，會成為命令模式，如果要在檔案中輸入字元，就必需以小寫的 i 來進入編輯模式，進入編輯模式後你輸入的咚咚才會顯示出來！那由『編輯模式』要變成『命令模式』時，就直接按『Esc』即可。而若要進入『命令列模式』時，就必須要在命令模式中輸入『:』（冒號），那游標就會跑到螢幕的最下面一行來等待你輸入啦！

簡易執行範例
新建檔案：
好了，我們在 Linux 底下建立一個名為 test.dat 的檔案，可以這樣開啟一個新檔案：
[root@tsai root]# vi test.dat

進入編輯模式：
一進入 vi 的畫面你會看到一片空白（烏漆嘛黑的），而且即會進入命令模式，你可以輸入 i 來進入編輯模式，這時候你會看到螢幕的最下方會出現『--INSERT--』字樣：

開始編輯：
這時候你就可以隨便按幾個字來輸入一下，在這裡要提醒一下，『Tab』鍵與空白鍵是不一樣的咚咚喔！

回到命令模式：
在編輯模式的時候，不論你按什麼鍵（除了 Esc 之外）都會被視為字元而顯示在螢幕上，這時按下 Esc 鍵後會回到命令模式，如果你會到了命令模式，但是要消除你目前游標所在行的內容，你可以輸入『dd』，就可以殺掉一整列了！

在命令列模式輸入儲存指令：
OK，我們要存檔了，存檔並離開的指令很簡單，輸入『:wq』即可存檔離開！這時你在提示字元後面輸入『 ls -l 』即可看到我們剛剛建立的 test.dat 檔案啦！

命令列內容說明
如前所述，所謂的命令列或命令模式，就是在最下面一行沒有顯示『--INSERT--』或者『--REPLACE--』字樣的時候。通常在命令列中的指令有下面幾種：（注意，當按下『:』 時，游標會自動移動到螢幕的最下面一行！）
進入編輯模式：
i
 插入：在目前的游標所在處插入輸入之文字，已存在的文字會向後退；
a
 增加：由目前游標所在的下一個字開始輸入，已存在的文字會向後退：
o
 插入新的一行：從游標所在的下一行枝行首開始輸入文字；
r
 取代：會取代游標所在的那一個字元；
R
 全部取代：會一直取代游標所在的文字，直到按下 ESC 為止；
游標移動指令：
k 或向上鍵
 向上移一個字元；
j 或向下鍵
 向下移一個字元；
h 或向左鍵
 向左移一個字元；
l 或向右鍵
 向右移一個字元；
H
 游標移動到螢幕頂端；
M
 游標移動到螢幕正中央；
L
 游標移動到螢幕最夏方；
+
 游標移動至非空白字元的下一列；
-
 游標移動至非空白字元的前一列；
[Ctrl] + [b]
 螢幕向『後』移動一頁；
[Ctrl] + [f]
 螢幕向『前』移動一頁；
[Ctrl] + [u]
 螢幕向『後』移動半頁；
[Ctrl] + [d]
 螢幕向『前』移動半頁；
[n]<space>
 先按數字後再按空白鍵：游標向後面移動 n 個字元；
0
 數字鍵『0』：移動到這一列的第一個字元；
$
 移動到這一行的行尾；
G
 移動到最後一行；
nG
 移動到第 n 行（常與 :set nu 合用）；
J
 將目前游標所在行與下一行連結；
搜尋指令：
/word
 向游標之後尋找一個名為 『word』 的字串；
?word
 向游標之前尋找一個名為 『word』 的字串；
:g/word1/s//word2/g
 尋找 『word1』 這個字串，並且以 『word2』 這個字串取代之；
:n1,n2 s/word1/word2/g
 將第 n1 行到 n2 行的字串 『word1』 都改成 『word2』；
:1,$ s/ls/ll/g
 將所有檔案內容的 『ls』 這個字串改成 『ll』 這個字串；
刪除與複製：
yy 或 Y
 複製游標所在行的內容；
nyy 或 nY
 『n』 為數字：複製游標所在行向下 n 行之內容；
p
 將 yy 複製的內容貼到游標所在行的下面；
x
 刪除一個字元；
nx
 『n』 為數字：刪除 n 個字元；
dd
 刪除游標所在那一行；
ndd
 『n』 為數字：向下刪除 n 行；
u
 取消前一個動作；
[Ctrl] + [L]
 清除螢幕並重繪螢幕
命令模式：
:wq
 將所做修改儲存後離開 vi；
:w
 僅儲存檔案；
:w [filename]
 將目前的內容儲存到 『filename』 這個檔案中（類似另存新檔）；
:r [filename]
 將 『filename』 這個檔案內容加到游標所在行後面；
:q
 離開 vi；
:q!
 強制離開 vi ；
其他指令：
:set nu
 設定行號，讓你可以輕易的找出錯誤；
:set nonu
 取消設定行號；
:n1, n2 w [filename]
 將 n1 到 n2 的內容存成 『filename』 這個檔案；

OK！會這些指令就已經很厲害了，因為常用到的指令也只有不到一半！通常 vi 的指令除了常用的幾個外，其他是不用背的，你可以做一張簡單的指令表在你的螢幕牆上，一有疑問可以馬上的查詢幽！

2002/ 01/01以來統計人數

本章問題討論：
  1. Q：有沒有其他的網站有介紹 vi 這套軟體的例子？
    A：


X-Window 的安裝與升級
最近更新日期：2001/08/15
何謂 X-Window
開始設定 XFree86 的參數
選擇 X-Window 的升級套件
安裝 XFree86 升級套件
使用 src.rpm 進行 XFree86 的升級安裝
更新 NVidia 的顯示卡核心程式
關於 X-Window 的相關下載檔案與網址
問題與討論

何謂 X-Window
X window system 最早是由 1984 年的麻省理工學院（MIT）在發展一個可以讓視窗介面適應多平台環境的一個計畫（Project Athena），所發展的一套視窗系統。到今日我們所常聽到的 X-Window 通常是指 X11R6 這一版的 X 系統。X windows 有下列幾種別稱：
  • X
  • X window system
  • X Version 11
  • X Window System, Version 11
  • X11
而 X-Window 在運作的時候，必須要下面幾種檔案：
  • X Server：這是 X-Window 最重要的一個程式了，主要在負責所有與 X-Windows 有關的介面顯示功能；
  • X Client：用戶端程式；
  • X protocol：主要負責 X 的一些協定咚咚；
  • X Lib：一些 X 的資料庫！
而通常我們所使用的 X ，由於是由 XFree86 Project Inc. 公司為支援 Intel x86 平台的原始碼系統，所以就被通稱為 XFree86 系統啦！目前最常被使用的是 XFree86-3.3.6 版，這一版是比較穩定的版本，另外，如果你的顯示卡太新的話，你就必須要下載更新的 XFree86 啦，目前最新的出到了 4.1.0 版了！一些常去的 FTP 下載網站你可以在底下找到：另外，你以可以上 XFree86 的網站去逛逛！

除此之外，X-Window 相關的設定與檔案都在：

  • /usr/X11R6
  • /etc/X11
這兩個目錄中，其中，關於 X 的設定檔就在 /etc/X11/XF86config 這個檔案中！

開始設定 XFree86 的參數
如果你是使用這個網頁所提供的光碟來安裝你的 Linux ，並依鳥哥建議的安裝方法來安裝 Linux 時，那在你安裝完畢之後應該就已經有 XFree86-3.3.5-3 版的 X-Window 系統了！如果你是使用一些早期比較常用的顯示卡，例如 S3 Virge 系列的卡，那應該在安裝的時候就已經設定好 X-Window 了，果真如此的話，只要打 startx 就可以開始你的視窗介面的 Linux 囉！

如果你的卡是比較新款的顯示卡，故而 Linux 無法直接幫你裝好，那麼你只好自己來作設定了！設定的方法有很多種，包括有以下的幾種程式（請注意大小寫喔！）：

  • Xconfigurator
  • xf86config
  • XF86Setup
比較要注意的是 XF86Setup 為圖形介面的設定 X-Window 的設定程式，如果你的 X-Window 沒有辦法跑的話， XF86Setup 應該就沒有辦法執行了！基本上，由於 Xconfigurator 比較容易設定，所以我會建議你先以 Xconfigurator 這一支程式來測試一下你的 X-Window，如果可以跑的話就OK了！如果以 Xconfigurator 沒有辦法設定好的話，就必須以 xf86config 來設定你的 X 了！而設定完了 X 之後，你可能會想要改變顯示器的色度，那你就可以用手動的方式來修改囉！通常我會建議你以以下的步驟來設定你的 X-window：
  1. 先以 Xconfigurator 來設定；
  2. 若不行，再以 xf86config 來設定；
  3. 還不行，則只好手動 /etc/X11/XF86config 檔案！
方法一：使用 Xconfigurator 設定 X-Window
  1. 執行 Xconfigurator ：
    這個時候會出現一個歡迎畫面，按下 OK 之後，系統會自動去捉顯示卡的晶片組。
  2. 如果顯示卡是這一版的 XFree86 有支援的話，那系統就會顯示出你的顯示卡型號，如下圖所示為 S3 的 Trio64v2 晶片：

  3. 上圖按下 OK 之後會開始去設定顯示器（螢幕），一般我們都用自訂的方法去捉螢幕，所以選擇 Custom 手動設定（第一項），如下圖所示：

  4. 按下 OK 之後，系統會告訴你一些訊息，再按下 OK 後，就會出現如下的畫面，告訴你應該要選擇哪一個螢幕的解析度，通常我們都會選擇『High Frequency SVGA, 1024x768 @ 70Hz 』那一個選項。

  5. 上圖按下 OK 之後，就會要求你選擇垂直解析度，通常我們都是選擇第二項，也就是 50-90 那一項即可；
  6. 再來系統會問你是否要讓 XFree86 自己捉顯示卡相關的資訊？這裡可以按 Probe 也可以按 Don't Probe ，只是，如果你確切的知道你的顯示卡記憶體的大小的話，這裡建議選擇 Don't Probe；
  7. 上一步驟選擇 Don't Probe 之後，系統會要你選擇你的記憶體，請依你的顯示卡記憶體實際大小輸入，如果是 S3 Vrige 的話，通常是 1M 或者是 2M 左右吧！
  8. 選完了記憶體大小之後，過來是選擇你的記憶時脈晶片，由於我們通常不是很清楚我們的晶片是哪一個，所以這裡只好讓系統自己捉，如下圖，直接選擇 No Clockchip Setting 即可！

  9. 再來則是選擇畫面解析度與色彩量，如下圖所示，一般而言，如果你的 X-Window 一直有問題，這裡可以選擇 8 bit，及 640x480 的最原始設定就好！如果你的 X-Window 沒有問題，可以正常的使用了，而你覺得你想要讓你的色彩最大化，則可以僅選擇 24 bit 及 1024x768 這一項即可！如此一來，你就可以以你最喜歡的解析度與色度進入 X-Window 啦！（注意喔，在 bit 之間以 tab 鍵移動，而以 空白鍵 確定！）

  10. 接著下來系統告訴你要開始測試 X-Windows 啦，按下 OK 之後系統就開始測試 X-Window！在這個地方要注意一下，如果你的設定不完全，則系統將會回到第三步驟重新再設定，如果你在這一個步驟重複了三次以上仍無法設定成功，那就必須以 xf86config 這支程式設定了！
  11. 如果你可以正常的看到一個游標及一個框框告訴你還有10秒鐘的時間可以按確定，那就表示你的 X-Window 可以用啦！這個時候請選擇 OK，然後出現的另一個框框告訴你：『是否要在下次開機的時候以圖形介面登入』，這一步千萬選擇『NO』，因為以 X-Window 為預設的開機介面，個人覺得並不好，因為不但佔用了較多的系統資源，而且，並不會比較好使用！
  12. 完成設定了，跳出 Xconfigurator 後，以 startx 進入 X-Window ！
方法二：使用 xf86config 設定 X-Window
    如果你的 X-Window 並無法以 Xconfigurator 這個比較容易設定的程式設定的話，你只好選擇 xf86config 這個文字模式的程式來設定了！整個流程我們將他寫在底下，因為很長，所以有些部分被我捨棄掉了！（注意，如果有一個步驟作錯的話，請按 ctrl+c 退出後，在從頭開始作吧！）
    [root@tsai /root]# xf86config <== 這裡輸入 xf86config
    step 1：
    底下會出現一大串字，不用理他
    Press enter to continue, or ctrl-c to abort. <== 這裡按 enter

    step 2：
    1. Microsoft compatible (2-button protocol)
    2. Mouse Systems (3-button protocol)
    3. Bus Mouse
    4. PS/2 Mouse
    5. Logitech Mouse (serial, old type, Logitech protocol)
    6. Logitech MouseMan (Microsoft compatible)
    7. MM Series
    8. MM HitTablet
    9. Microsoft IntelliMouse
    10. Acecad tablet
    Enter a protocol number: <==這裡按 2 或 4（依你的滑鼠而定）

    step 3：
    Do you want to enable Emulate3Buttons? <==問你要模擬成三鈕嗎
    因為沒必要模擬成三鈕，所以選 n 即可

    step 4：
    Mouse device: <==這裡也按 enter 用預設值就好了

    step 5：
    Do you want to use XKB? <==按 enter
    Press enter to continue, or ctrl-c to abort. <==按 enter

    step 6：
    1 Standard 101-key, US encoding
    2 Microsoft Natural, US encoding
    3 KeyTronic FlexPro, US encoding
    4 Standard 101-key, US encoding with ISO9995-3 extensions
    5 Standard 101-key, German encoding
    6 Standard 101-key, French encoding
    7 Standard 101-key, Thai encoding
    8 Standard 101-key, Swiss/German encoding
    9 Standard 101-key, Swiss/French encoding
    10 Standard 101-key, US international
    11 Brazilian ABNT2
    12 None of the above

    Enter a number to choose the keymap.
    <==共有 12 種鍵盤選擇，這裡選擇 1 即可
    Press enter to continue, or ctrl-c to abort.<==按 enter

    step 7：
    1 31.5; Standard VGA, 640x480 @ 60 Hz
    2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
    3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
    4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56 Hz
    5 31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
    6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
    7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
    8 31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
    9 31.5 - 82.0; Monitor that can do 1280x1024 @ 76 Hz
    10 31.5 - 95.0; Monitor that can do 1280x1024 @ 85 Hz
    11 Enter your own horizontal sync range

    Enter your choice (1-11): <==選擇解析度，同樣選 7 即可！

    1 50-70
    2 50-90
    3 50-100
    4 40-150
    5 Enter your own vertical sync range

    Enter your choice: <==選擇解析度，選 2 即可！

    Enter an identifier for your monitor definition:<==按 enter
    Enter the vendor name of your monitor:<==按 enter
    Enter the model name of your monitor:<==按 enter

    step 8：
    Do you want to look at the card database? <==這裡選 y 開始看你的顯示卡型號

    506 S3 86C391 (Savage3D) Generic VGA
    507 S3 86C764 (generic) S3 Trio64
    508 S3 86C765 (generic) S3 Trio64V+
    509 S3 86C775 (generic) S3 Trio64V2
    510 S3 86C785 (generic) S3 Trio64V2
    511 S3 86C801 (generic) S3 801/805
    512 S3 86C805 (generic) S3 801/805

    由於我們使用的卡是 S3 Trio64V2 的卡，所以一直按 Enter 到大概 509 的
    地方就會出現 S3 Trio64V2 這個卡！選 509 後按 enter

    Press enter to continue, or ctrl-c to abort.<==按 enter

    step 9：
    1 The XF86_Mono server. This a monochrome server that should work on any
    VGA-compatible card, in 640x480 (more on some SVGA chipsets).
    2 The XF86_VGA16 server. This is a 16-color VGA server that should work on
    any VGA-compatible card.
    3 The XF86_SVGA server. This is a 256 color SVGA server that supports
    a number of SVGA chipsets. On some chipsets it is accelerated or
    supports higher color depths.
    4 The accelerated servers. These include XF86_S3, XF86_Mach32, XF86_Mach8,
    XF86_8514, XF86_P9000, XF86_AGX, XF86_W32, XF86_Mach64, XF86_I128 and
    XF86_S3V.

    These four server types correspond to the four different "Screen" sections in
    XF86Config (vga2, vga16, svga, accel).

    5 Choose the server from the card definition, XF86_S3.

    Which one of these screen types do you intend to run by default (1-5)?
    上面告訴你共有五種型式的卡供你選擇，第五項 XF86_S3 是你選擇的！所以這裡
    選 5 就好了，如果你不知道你的卡是哪一個，那就選 4 試試看吧！

    step 10：
    Do you want me to set the symbolic link? <==這裡按 y

    step 11：
    1 256K
    2 512K
    3 1024K
    4 2048K
    5 4096K
    6 Other
    Enter your choice: <==按你的顯示卡而定，不知道的話可以選 3 試看看

    step 12：
    Enter an identifier for your video card definition:<==按 enter
    Enter the vendor name of your video card:<==按 enter
    Enter the model (board) name of your video card:<==按 enter

    step 13：
    Press enter for the next page, q to quit without selection of a RAMDAC.
    不知道我們的 RAMDAC 所以選 q 離開即可

    step 14：
    What Clockchip setting do you want (1-12)? <==按 q 即可
    Press enter to continue, or ctrl-c to abort. <==按 enter

    step 15：
    "640x480" "800x600" "1024x768" for 8bpp
    "640x480" "800x600" for 16bpp
    "640x480" for 24bpp
    "640x400" for 32bpp

    Note that 16, 24 and 32bpp are only supported on a few configurations.
    Modes that cannot be supported due to monitor or clock constraints will
    be automatically skipped by the server.

    1 Change the modes for 8pp (256 colors)
    2 Change the modes for 16bpp (32K/64K colors)
    3 Change the modes for 24bpp (24-bit color, packed pixel)
    4 Change the modes for 32bpp (24-bit color)
    5 The modes are OK, continue.
    Enter your choice:
    如果要避免麻煩，直接按 5 使用預設值就可以了！

    step 16：
    Shall I write it to /etc/X11/XF86Config? <== 按下 y

    在上面上下 y 之後，就完成了設定啦！

    完成上面的設定之後，你就可以嘗試著打 startx 看看是否可以啟動 X-Window 啦，如果還是不行的話，就在從頭設定一次吧！

方法三：手動修正一些錯誤
其實，不論你使用哪一種程式修改 X-Window 的設定，都是在修改 /etc/X11/XF86Config 這個設定檔，在進行這個檔案的修改工作之前，請先將你的檔案備份吧！免得改錯了就不得了了！

在這個檔案中，最需要注意的大概只有幾個部分（其他的我也不是很懂呀！）：monitor、device 跟 screen ，主要的部分有點像這樣：

monitor:

Section "Monitor"

Identifier "My Monitor"
VendorName "Unknown"
ModelName "Unknown"

HorizSync 31.5 - 57.0

VertRefresh 50-90

# 800x600 @ 72 Hz, 48.0 kHz hsync
Modeline "800x600" 50 800 856 976 1040 600 637 643 666 +hsync +vsync

# 1024x768 @ 60 Hz, 48.4 kHz hsync
Modeline "1024x768" 65 1024 1032 1176 1344 768 771 777 806 -hsync -vsync

# 640x480 @ 100 Hz, 53.01 kHz hsync
Modeline "640x480" 45.8 640 672 768 864 480 488 494 530 -HSync -VSync

要注意的是上面顯示黃色的部分，而底下的部分比較麻煩，最好是由 Xconfigurator 設定就好，不要隨意改變。
device:
# Device configured by Xconfigurator:

Section "Device"
Identifier "Silicon Integrated Systems [SiS]|86C326"
VendorName "Unknown"
BoardName "Unknown"
#VideoRam 8192
Option "no_accel" # Use this if acceleration is causing problems
# Option "fifo_moderate"
# Option "fifo_conserv"
# Option "fifo_aggresive"
# Option "fast_vram"
# Option "pci_burst_on"
# Option "xaa_benchmark" # DON'T use with "ext_eng_queue" !!!
# Option "ext_eng_queue" # Turbo-queue. This can cause drawing
# errors, but gives some accel
# Insert Clocks lines here if appropriate
EndSection

上面的設定是我另一台機器的 Linux 設定，使用的是 SIS 6326 晶片，而有 8M 的記憶體，不過不知為何，上面的記憶體項目（黃色）備註解掉了（#符號為註解，不會被執行）。如果你知道如何變換的話，可以從這裡去修改你的顯示卡！
screen:
# The Colour SVGA server

Section "Screen"
Driver "svga"
# Use Device "Generic VGA" for Standard VGA 320x200x256
#Device "Generic VGA"
Device "Silicon Integrated Systems [SiS]|86C326"
Monitor "My Monitor"
Subsection "Display"
Depth 32
Modes "800x600"
ViewPort 0 0
EndSubsection
EndSection

上面的設定跟你最終在螢幕上輸出的解析度有關，主要是黃色的部分，Depth是指你的色彩度，而 Modes 是解析度，你可以依照自己的喜好來設定。
其他疑難排解：
  • 基本上，如果你出現了沒有辦法解決的問題時，你可以先以 xf86config 設定，設定完成了之後再以手動的方式去修改你的 screen 項目，基本上可能會出現的問題應該是出自於 Display 這一項，盡量將你的 Subsection 的情況訂定的簡單一點，最好是只有一個 Models 的情況！那樣可能可以讓你成功的達成開啟 X-Window 的任務喔！
  • 另外，如果你的畫面大到整個螢幕之外，要用滑鼠才能移動到周圍的話，你可以將 Modes 那一項調成只有 "1024x768" 這一個，就可以將整個畫面融入了！

選擇 X-Window 的升級套件
好啦，我們知道 X-Window 主要是以 XFree86 這個 server 所提供的咚咚，另外也已經知道如何設定 X-Window 了，那要如何升級 X-Window 呢？再者，如果我們不使用原有的 X-server 的話，那要如何更新到新版的 x-window 呢？

如果你是使用這個網頁所提供的 RedHat 6.1 作為你 Linux 的作業系統，而且你的安裝方法是使用所有的東西都安裝的方法，另外，你使用的顯示卡是比較舊的 S3 系列的卡，那很好，你已經有 X-Window 3.3.5-3 的套件了！接下來你只要去設定 XFree86 就可以正常啟動 x-window 啦！（其實，如果你使用較舊的機器，而且安裝的方法使用這個網頁的話，其實在安裝的時候應該就已經可以看到 X-Window 的畫面了！）

如果你雖然使用 RedHat 6.1 ，但是你的顯示卡是比較新的卡，以目前的顯示卡介面來說，可能是 GeForce2 MX 這塊卡，由於 NVIDIA 的產品是比較新的顯示卡，所以除了以新版的 XFree86 Server 來增加你的顯示卡支援度外，也可以先更新 XFree86 到 4.0.1 以後的版本，才來安裝這張顯示卡！升級完了 XFree86 後再到底下的『安裝 NVidia 的顯示卡核心程式』去更新這個新的顯示卡核心程式！

那如果你要升級你的 X-Window 系統呢？例如你要將你的 XFree86 升級到最新的 4.1.0 版的話，那要如何升級呢？你可以依底下的步驟來做做看：
  1. 確認你的 X-Window 版本：你要做的是，先確認你的 X-Window 的版本，先以 rpm 確認一下你的 XFree86 這個軟體，並將 Xinstall.sh 這個檔案捉到你的 Linux 系統中，更改 Xinstall.sh 成為可執行的檔案，然後以 root 的身份執行：
    [root @tsai /tmp]# rpm -q XFree86
    XFree86-3.3.5-3
    [root @tsai /tmp]# chmod 744 Xinstall.sh
    [root @tsai /tmp]# ./Xinstall.sh -check
    Checking which OS you're running...
    uname reports 'Linux' version '2.2.12-20', architecture 'i586'.
    Object format is 'ELF'. libc version is '6.1.2' (6.1).

    Binary distribution name is 'Linux-ix86-glibc21'

    如果你是以這個網頁提供的 RedHat 6.1 來安裝的話，你的螢幕應該會顯示如上面這一個咚咚，上面顯示了 XFree86 的版本為 3.3.5-3 ，而我們的 Linux 版本為 2.2.12-20，而 X-Window 的版本為 Linux-ix86-glibc21 這一個東西。（另外要注意的是，如果你是使用 RedHat 7.0 的話，你的 X-Window 版本已經變成了 Linux-ix86-glibc22 了！）
  2. 下載你的 X-Window 版本的核心程式：你可以到幾個比較有名的 FTP 站去下載最新的 X-Window 版本，或者由鳥哥這個網頁下載你所需要的咚咚：
    • 教育部：ftp://nctuccca.edu.tw/UNIX/XFree86/
    • XFree86 組織：ftp://ftp.xfree86.org/pub/XFree86
    • 這個網頁提供的是 XFree86 4.1.0 版的東西：
      • Linux-ix86-glibc21.tar.gz：主要是 RedHat 6.1 以前版本所使用的 X-window 核心；
      • Linux-ix86-glibc22.tar.gz：主要是 RedHat 7.0 以後版本使用的 X-window 核心。
    基本上，在各大 FTP 站中，你所要下載的東西，除了在各版本底下的主要執行檔與說明檔之外（就是 Xinstall.sh 等檔案），其他要下載的只是在 binaries 底下的核心程式檔，只要選擇適合你的檔案就可以了！
注意了，如果你是由鳥哥的這個網頁所下載的檔案（Linux-ix86-glibc21.tar.gz），則你必須先解壓縮，假設你的檔案放置在 /test 底下，則：
[root @tsai XFree86]# tar -zxvf Linux-ix86-glibc21.tar.gz
上面步驟會產生 Linux-ix86-glibc21 這個目錄，裡面就是我們所需要的 X-window 的核心啦！

安裝 XFree86 的升級套件
在選擇完了你的 X-Window 套件之後，再來就是要安裝了！以下的安裝是針對 4.1.0 的 X-Window 版本，而且是在 RedHat 6.1 中，以 Linux-ix86-glibc21 核心進行安裝的步驟！
  1. 備份你的 X-Window 系統：做事情總是有備而無患的！由於安裝新的 X-Window 核心時，會將舊的版本覆蓋掉，所以如果新的版本無法安裝完成，或者是新的版本你使用的不愉快時，要換回舊版的 X-window 就要重新安裝一次！很麻煩，所以最好是將你的舊版 X-window 備份。假設你要將備份的東西存在 /backup 中，則：
    [root @tsai /test]# mkdir /backup
    [root @tsai /test]# cd /backup
    [root @tsai /backup]# mkdir x-window
    [root @tsai /backup]# cd x-window
    [root @tsai x-window]# tar -zcvf X11R6.tar.gz /usr/X11R6
    [root @tsai x-window]# tar -zcvf X11.tar.gz /etc/X11
    則在你的 /backup/x-window 下會有兩個檔案名稱為：X11R6.tar.gz 及 X11.tar.gz 的檔案！
  2. 離開 X-window 系統：如果你是以 X-window 為預設的開機登入情況，則你必須修改成 init 3 的等級登入，總之，就是要進入成文字模式，並且 X-window 不能在使用的狀態下才能升級！
  3. 開始安裝：
    • 在剛剛我們捉下來的 Linux-ix86-glibc21 的目錄中執行 Xinstall.sh 這個檔案：
      [root @tsai /test]# cd /test/XFree86/Linux-ix86-glibc21
      [root @tsai Linux-ix86-glibc21]# chmod 744 Xinstall.sh
      [root @tsai Linux-ix86-glibc21]# ./Xinstall.sh
    • 開始整個流程可以如下的幾個步驟表示：（注意：由於新版的 XFree86 我動手裝了好幾次，都沒有辦法成功，所以基本上，用這個程式的預設值就可以了，也就是一直按 enter 即可，這樣就不會造成你的 X-Window 被改亂掉的困擾喔！）
      step 1:
      If you are installing a version different from 4.1.0, you
      may need an updated version of this installer script.
      Do you wish to continue? (y/n) [n] y <== 這裡輸入 y

      step 2:
      You appear to have an existing installation of X. Continuing will
      overwrite it. You will, however, have the option of being prompted
      before most configuration files are overwritten.
      Do you wish to continue? (y/n) [y] y <== 這裡輸入 y

      step 3:
      Do you want to move them to /etc/X11 and create the necessary
      links? (y/n) [y] <== 這裡輸入 y

      step 4:
      == Extracting /test/XFree86/Linux-ix86-glibc21/Xetc.tgz ==
      Do you want to overwrite the app-defaults config files? (y/n) [n]
      上面在問你，你是否要將前一版的 X-window 設定留下？
      如果你只是升級，那就按 n 即可，如果你想要重頭安裝，
      這裡可以按 y ，只要後面就要重新設定 x-window 了！
      後面的步驟（到步驟 13 都是這種情況！）

      step 5:
      Do you want to overwrite the fs config files? (y/n) [n]

      step 6:
      Do you want to overwrite the lbxproxy config files? (y/n) [n]

      step 7:
      Do you want to overwrite the proxymngr config files? (y/n) [n]

      step 8:
      Do you want to overwrite the rstart config files? (y/n) [n]

      step 9:
      Do you want to overwrite the twm config files? (y/n) [n]

      step 10:
      Do you want to overwrite the xdm config files? (y/n) [n]

      step 11:
      Do you want to overwrite the xinit config files? (y/n) [n]

      step 12:
      Do you want to overwrite the xsm config files? (y/n) [n]

      step 13:
      Do you want to overwrite the xserver config files? (y/n) [n]

      step 14:
      Do you want to install Xfsrv.tgz (font server)? (y/n) [y]
      這個是跟 X server 有關的檔案，沒有其他要求的話，直接都按 y 吧！
      以下的都是與 X server 有關的咚咚！
      Do you want to install Xnest.tgz (Nested X server)? (y/n) [y]
      Do you want to install Xprog.tgz (programmer support)? (y/n) [y]
      Do you want to install Xprt.tgz (X print server)? (y/n) [y]
      Do you want to install Xvfb.tgz (Virtual framebuffer X server)? (y/n) [y]

      step 15:
      Do you want to install Xf100.tgz (100dpi fonts)? (y/n) [y]
      這個是 X windows 的字型，以下都是屬於字形的部分，請選 y 吧！
      Do you want to install Xfcyr.tgz (Cyrillic fonts)? (y/n) [y]
      Do you want to install Xfscl.tgz (Scaled fonts (Speedo and Type1))? (y/n) [y]
      Do you want to install Xhtml.tgz (Docs in HTML)? (y/n) [y]
      Do you want to install Xjdoc.tgz (Docs in Japanese)? (y/n) [y]
      Do you want to install Xps.tgz (Docs in PostScript)? (y/n) [y]

      step 16:
      Do you wish to have the (new) links installed (y/n)? [n]
      這個地方在告訴你，是否需要將一些檔案連結到 /usr/lib 或
      /usr/include，注意，一旦選擇y就會有檔案被覆蓋掉。

      step 17:
      Do you wish to have this link installed (y/n)? [n]

      step 18:
      Do you want them moved to /usr/X11R6/lib/modules/old?
      Note: that if you want to use them with 3.3.x again, you'll
      need to move them back manually. (y/n) [n]

      step 19:
      Installation complete.

    • OK啦！這樣就安裝完畢了！
  4. 重新設定 XFree86：接著下來，由於我們升級了 XFree86 ，所以接下來要開始重新的設定 XFree86 了，設定的方法雖然有點不太一樣，但是同樣是使用 xf86config 這一個咚咚來設定！如果你的顯示卡是 NVidia GeForce2 MX 的話，請在看到：
    Do you want to look at the card database?
    這一行的時候，請持續按 enter 到大概是 320 的時候，會顯示 GeForce 的字樣，選這個就對了！不過在選擇顯示解析度的時候，最好調成 1024*768 那一個，畫面就不會移來移去了！
  5. 開始進行 Check 的工作：基本上，安裝完畢之後，需要執行『XFree86 -configure』 來確認你有沒有安裝好，但是，奇怪的是，我每次執行都會出現有問題？不過 X-Windows 倒是可以執行。

使用 src.rpm 進行 XFree86 的升級安裝
使用手動的升級雖然可以避免一些編譯上面的問題，不過，畢竟如果有 i386.rpm 或 src.rpm 等等的檔案的話，就會更簡單的升級了！你可以上各大 FTP 站去下載最新的 XFree86 的咚咚！然後執行編譯各 *.src.rpm 程式，等到編譯沒有問題之後，直接在 /usr/src/redhat/RPMS/i386 中安裝你的 rpm 檔案吧！

更新 NVidia 的顯示卡核心程式
基本上經過了 Xconfigurator 及 xf86config 的設定工作之後，你的 X-Window 應該可以正常工作了，但是如果你使用的是 NVidia GeForce2 MX 這一張目前市面上最常見到的卡呢？由於舊的 X-Window 的 Server 並不支援 GeForce 的核心，所以你是一定沒有辦法進入 X-Window 的！那要怎樣讓這張卡可以支援 X-Window 呢？有幾個工作你要先注意：
  1. 升級你的 rpm 程式：由於 NVIDIA 的驅動程式太新了，所以需要 rpm 4.0.2 以後版本的 rpm 程式，但是我們 RedHat 6.1 裡面附的 rpm 是 3.0.3-2 ，所以你要先升級 rpm 才行，升級的辦法請看這裡：
  2. 升級你的 XFree86 ：基本上，以上面的方法來升級就好了，更要注意的是，由於使用 Xinstall.sh 來手動升級的時候，如果你不用這個程式預設的選項（除了第一項選擇 y 之外），是會有一點小麻煩的，所以建議你最好是直接按 enter 就好了！
  3. 下載 NVidia 核心：鳥哥這裡有已經下載的兩個檔案，是 src.rpm 的檔案，你可以點選底下的線條下載：
      NVIDIA_kernel-1.0-1251.src.rpm
      NVIDIA_GLX-1.0-1251.i386.rpm
  4. 開始編輯核心程式：好了，下載完了 NVIDIA_kernel 之後，請先以 rpm 編譯吧！
    rpm --rebuild NVIDIA_kernel-1.0-1251.src.rpm
    上面的程式編譯完之後會在 /usr/src/redhat/RPMS/i386 產生一個名為 NVIDIA_kernel-1.0-1251.i386.rpm 的檔案，這時請以：
    rpm -ivh NVIDIA_kernel-1.0-1251.i386.rpm
    安裝完了之後，回到你剛剛下載核心的目錄，開始安裝 GLX 這個檔案，注意喔，由於 GLX 需要一些特別的檔案來升級，不要理他！用強制安裝的方法：
    rpm -ivh --nodeps NVIDIA_GLX-1.0-1251.i386.rpm
    這個時候就可以完成顯示卡核心的更新了！更新完成之後，就會在你的 /usr/X11R6/lib/modules/drivers 內多了一個名為 nvidia_drv.o 的檔案，這就是我們要的顯示卡驅動程式啦！
  5. 再重新設定一次 xf86config ：由於我們重新安裝了 XFree86 ，所以你必須要使用 xf86config 再重新設定一次，然後在選擇顯示卡的地方選擇地 320 款那一項（Geforce），就 OK 啦！
  6. 手動更改 /etc/X11/XF86Config 檔案：這一個步驟比較討厭，因為必須要使用 vi 去修改你的 X-Window 設定檔，以 vi /etc/X11/XF86Config 進入編輯畫面，然後找到類似下面的片段：
    --------------------第一部份---------------------------------------------
    Section "Module"

    # This loads the DBE extension module.

    Load"dbe" # Double buffer extension

    # This loads the miscellaneous extensions module, and disables
    # initialisation of the XFree86-DGA extension within that module.
    SubSection "extmod"
    Option "omit xfree86-dga" # don't initialise the DGA extension
    EndSubSection

    # This loads the Type1 and FreeType font modules
    Load"type1"
    Load"freetype"

    # This loads the GLX module
    Load"glx"

    EndSection
    --------------------第二部份---------------------------------------------
    ModulePath "/usr/X11R6/lib/modules"

    --------------------第三部份---------------------------------------------
    Section "Device"
    Identifier "NVIDIA GeForce"
    Driver "nv" <== 這裡改成 nvidia
    #VideoRam 4096 <== 這裡改成你的記憶體量(32768)，並且將 # 取消
    # Insert Clocks lines here if appropriate
    EndSection
    --------------------第四部份---------------------------------------------
    Section "Screen"
    Identifier "Screen 1"
    Device "NVIDIA GeForce"
    Monitor "My Monitor"
    DefaultDepth 24

    Subsection "Display"
    Depth 24
    Modes "1024x768"
    ViewPort 0 0
    EndSubsection
    EndSection

    將上面『Load"glx"』這一行之前的註解符號『#』拿掉！亦將 ModulePath "/usr/X11R6/lib/modules" 的註解拿掉，然後，最重要的是在第三部分，將原先的 nv 改成 nvidia ，而將 VideoRam 的記憶體改成你的記憶體大小（一般來說應該是 32768 => 32MB），然後將註解拿掉。最後在第四部分的地方，你可以將 DefaultDepth 改成 24 （bit）而將底下的 Modes 改成 "1024x768" ，這樣每次啟動 X-Window 就可以看到最大的畫面啦！
  7. 完成設定，以 startx 啟動 X-Window ！

關於 X-Window 的相關下載檔案與網址

一些 FTP 站：

  • 交大資科：ftp://linux.cis.nctu.edu.tw/X/Xserver/XFree86/
  • 教育部：ftp://nctuccca.edu.tw/UNIX/XFree86/
  • XFree86 組織：ftp://ftp.xfree86.org/pub/XFree86
  • NVidia 網站：http://www.nvidia.com/

本章問題討論：
  1. Q：？
    A：
  2. 等待加入新討論：
2002/ 01/01以來統計人數


Linux 套件升級
最近更新日期：2001/08/17
前言
升級工具：rpm
升級 rpm

前言
雖然 RedHat 提供好用的東西，但是 Linux 本身是一直在進步的，當然囉，他的套件也就會一直更新啦！什麼是套件呢？例如你要使用 Web server 就應該會知道， RedHat 是使用 Apache 這一套軟體，而這個軟體就稱為一個套件啦！什麼時候需要更新套件呢？通常這是完全視你的需求而定的，如果你覺得你的 Linux 已經夠好了，當然不用升級，但是如果你覺得有更新的套件出來，而這個新的套件內的功能是你所想要的，那就得更新套件啦！

通常要更新套件，最常用的就是直接使用 rpm 這套軟體來直接更新！ rpm 使用上是很簡單的！這裡就說說如何以 rpm 更新你的 RedHat 6.1 內的套件吧！

另外，其實在 RedHat 當中，主要都是以 rpm 這套程式再安裝所有的軟體套件的，所以你在安裝一些軟體的時候，最好是選擇 *.i386.rpm 或 *.src.rpm 來進行安裝，這樣對於你往後的升級或者是安裝方面，都會比較簡單喔！

升級工具：rpm
要升級套件，當然就要先知到你的套件的版本啦，如何知道呢？假設你要知道你的 Web Server （就是 Apache 這個軟體）的版本，就需要輸入：
[root@tsai /root]# rpm -q apache
apache-1.3.9-4

如上面所寫的， -q 這個參數是察看的意思，則可以發現你的 apache 軟體為 1.3.9-4 版！

安裝全新的套件：

而假如你要安裝的軟體並不在你的 Linux 機器上，例如你並沒有安裝 apache ，則使用 -q 參數會出現如下畫面：
[root@tsai /root]# rpm -q apache
package apache is not installed

好的很，那你就必須用下面的方法來安裝你的軟體了！
[root@tsai /root]# rpm -ivh apache-1.3.9-4.i386.rpm
[root@tsai /root]# rpm --recompile apache-1.3.9-4.src.rpm
[root@tsai /root]# rpm --rebuild apache-1.3.9-4.src.rpm

注意到上面有兩種安裝的方法喔！這是由於 rpm 有兩種模式，一種是已經經過編碼的（i386.rpm）一種是未經編碼的（src.rpm）（通常這種 src.rpm 附檔名的檔案被稱作 SRPM 喔！），這兩種 rpm 的安裝並不相同！另外，以可以用 --rebuild 先製作屬於你的 Linux 的 rpm 後，再進行安裝的工作，而以 --rebuild 編碼後的 i386.rpm 檔案將會被放置在 /usr/src/redhat/RPMS/i386 這個目錄中，例如上面的例子中， apache-1.3.9-4.i386.rpm 將會被製作而放置在 /usr/src/redhat/RPMS/i386 這個目錄中，你只要再以 ivh 或 Uvh 去安裝即可。

升級你的套件：

那如果你只是要升級你的套件呢？該如何升級？很簡單，第一步驟就是先從網路上下載新的套件 rpm 檔，你可以在各大 FTP 站上面捉到，或者也可以從底下的 FTP 站直接捉：

RPM：
ftp://linux.sinica.edu.tw/pub1/redhat/updates/6.2/en/os/i386/
ftp://linux.cis.nctu.edu.tw/LINK/distributions/redhat/redhat/linux/7.1/en/os/i386/RedHat/RPMS/
SRPM：
ftp://linux.cis.nctu.edu.tw/LINK/distributions/redhat/redhat/linux/7.1/en/os/i386/SRPMS/
在上面的 FTP 站中，你可以看到最新的 apache 版本為：apache-1.3.19-5.i386.rpm，應該是比你的版本還要新！如果想要更新的話，就捉下來吧！然後以下列的方法來進行升級的動作：
[root@tsai /root]# rpm -Uvh apache-1.3.19-5.i386.rpm

參數 -Uvh 就是升級安裝的意思啦！不過，我想你應該會遭遇到像是這樣的困擾：
[root@tsai /root]# rpm -Uvh apache-1.3.19-5.i386.rpm
error: failed dependencies:
libc.so.6(GLIBC_2.1.3) is needed by apache-1.3.19-5
libc.so.6(GLIBC_2.2) is needed by apache-1.3.19-5

為何會有 error 呢？這是因為每一種套件都可能會有相依的套件存在，在上面的例子中，如果你要安裝 apache-1.3.19-5.i386.rpm 的話，就必須要其他的兩個檔案！所以你就得再去找這兩個檔案的相關套件啦！如果你一定要安裝這個套件，又不想提供其他的相依套件的話，你可以這樣做：
[root@tsai /root]# rpm -Uvh --nodeps apache-1.3.19-5.i386.rpm

加上 --nodeps 這個參數，他會強制安裝這個套件！不過會不會有問題？這個就不清楚了！所以最好的方法除了下載相關的 i386.rpm 之外，其實，你可以直接下載所謂的 SRPM 檔案（src.rpm），在你的機器上面先編譯過，然後再安裝！這樣的安裝會比較好喔！例如你先捉下來 apache-1.3.19-5.src.rpm 然後在執行編譯的過程：
[root@tsai /root]# rpm --rebuild apache-1.3.19-5.src.rpm

然後螢幕會告訴你還需要 openssl 這個咚咚，同樣的，我們再將這個檔案捉下來，然後先後執行：
[root@tsai /root]# rpm --rebuild openssl-0.9.6-3.src.rpm
會有很多的咚咚跑出來！最後的 rpm 檔案會放在 /usr/src/redhat/RPMS/i386 中
[root@tsai /root]# cd /usr/src/redhat/RPMS/i386
[root@tsai /root]# rpm -ivh openssl-0.9.6-3.src.rpm
[root@tsai /root]# rpm --rebuild apache-1.3.19-5.src.rpm

順利的話，將會把 apache 的 rpm 檔案編譯出來，如果一直有問題的話，可能就要使用 tar.gz 的檔案從頭手動的升級了，這會比較麻煩一點！

解除安裝：

那如果安裝完的 rpm 套件要移除呢？如和移除？其實就更簡單了，假設你要移除 apache ，則直接下達：
[root@tsai /root]# rpm -e apache

系統就會自動的移除你的軟體了！

升級 rpm
但其實使用 rpm 最大的問題是，舊版的 rpm 程式沒有辦法替較新版的 .rpm 檔案升級或安裝，這時你就必須要升級你的 rpm 程式了！通常，如果你發現在你要安裝 rpm 的時候，會出現下面的訊息，就表示你需要升級你的 rpm 程式：
only packages with major numbers <= 3 are supported by this version of RPM
error: imap-2000-9.i386.rpm cannot be installed

上面的情況是說，你的 rpm 版本是 3.xx 版，而 imap-2000-9.i386.rpm 需要大於 3.xx 版以上的 rpm 程式才能安裝，所以就發生了錯誤訊息了！你可以察看一下你的 rpm 版本：
[root@tsai RPM]# rpm -q rpm
rpm-3.0.3-2

如果你是以這個網頁提供的 Linux 作為安裝系統，則應該會出現 rpm 版本為 3.0.3-2 的信息！我們要將之升級到比較新的4.0.2版時，你可以到底下來下載：

ftp://linux.sinica.edu.tw/pub1/redhat/updates/6.2/en/os/i386/
不過這裡必須先說明，由於 rpm 升級時需要其他的套件幫忙，所以你不能只下載 rpm 相關的檔案而已，基本上你應該下載這八個檔案：
  • db3-3.1.17-4.6x.i386.rpm
  • db3-devel-3.1.17-4.6x.i386.rpm
  • db3-utils-3.1.17-4.6x.i386.rpm
  • popt-1.6.2-6x.i386.rpm
  • rpm-4.0.2-6x.i386.rpm
  • rpm-build-4.0.2-6x.i386.rpm
  • rpm-devel-4.0.2-6x.i386.rpm
  • rpm-python-4.0.2-6x.i386.rpm
你可以直接點選上面八個檔案，由我們這裡直接下載！那要如何安裝呢？如前所說的，由於我們並沒有安裝 db3 這個套件，而 popt 則是需要升級的，所以你可以依照下面的順序來加以升級！
[root@tsai RPM]# rpm -ivh db3-3.1.17-4.6x.i386.rpm
[root@tsai RPM]# rpm -ivh db3-devel-3.1.17-4.6x.i386.rpm
[root@tsai RPM]# rpm -ivh db3-utils-3.1.17-4.6x.i386.rpm
[root@tsai RPM]# rpm -Uvh popt-1.6.2-6x.i386.rpm
[root@tsai RPM]# rpm -Uvh rpm-4.0.2-6x.i386.rpm
[root@tsai RPM]# rpm -Uvh rpm-build-4.0.2-6x.i386.rpm
[root@tsai RPM]# rpm -Uvh rpm-devel-4.0.2-6x.i386.rpm
[root@tsai RPM]# rpm -Uvh rpm-python-4.0.2-6x.i386.rpm

好了！如此一來你就已經升級好了 rpm 啦！又可以去安裝其他的軟體囉！

2002/ 01/01以來統計人數


核心編譯(kernel)
最近更新日期：2001/08/17
前言
下載新核心
開始設定核心的內容
開始編譯
安裝編譯完成的核心及設定多重開機選項 lilo

前言
其實應該在安裝完 Linux 之後便開始編譯核心，因為每個人所需要的核心都並不相同！舉個例子來說，你安裝了一個很新的網路卡，但是你的核心並不支援這一種網路卡，那你只好下載比較新的核心來編譯，才能支援你的網路卡！另外，由於太大的核心對於整體的執行效能會比較慢，所以適當的核心對於你的 Linux 系統之執行效率也是有幫助的！因此，一般的玩家通常在安裝完了 Linux 之後，便開始進行核心的重新編譯工作！

在 study-area 也曾提到：Linux的靈魂所在﹐其實就是其穩定的核心設計。我們可以將之看成是一個架於程式和硬體之間的界面操作系統﹐離開來核心﹐什麼東西都用不了。而核心的編譯好壞﹐也會影響到系統的效能﹐甚至﹐一些系統功能(如 ip networking)﹐就必須要編進核心才行。

不過，由於核心的更新速度太快了，如果你一直執著於最新的核心編譯，那肯定會吃不消，所以通常我們的建議就是，除非你有新的需求，否則可以不用常常去更新核心的！

下載新核心
  • 核心的版本：
    要如何知道你的核心版本呢？基本上，你在開機進入 Linux 的 login 畫面時， Redhat 應該就已經告訴你這個主機的核心版本了，不過，如果你要知道你的核心版本的話，可以輸入：
    [root@tsai /root]# uname -r
    2.2.12-20
    上面顯示我們這個 Linux 核心是 2.2.12-20 這個版本。

    好啦，那要選擇哪一個核心版本呢？目前你可以看到的核心版本主要有 2.2.X, 2.3.X 及 2.4.X，哪一個才適合你呢？我想，既然我們需要的是穩定版的 Linux ，那自然選擇越穩定的越好囉，那基本上，所有 2.2.X 及 2.4.X 的都是屬於穩定型的核心版本，至於 2.3.X 則是適合開發 Linux 軟體的核心！另外，2.4.X並不是比2.2.X還新的意思，基本上，所有 2.2.X 及 2.3.X 與 2.4.X 都是同時開發的核心，只是因為其支援的程度或者是一些功能方面不完全相同，所以才會分成這些版本！而目前我們所想要使用的應該是 2.2.X 這個版本的系列核心，截至目前為止，這一版的最新核心應該是 2.2.19 這一個，當然，你也可以下載其他的核心！

  • 核心下載地點：
    Linux 核心的下載地點可以在底下的地點找到最新的，當然也可以在台灣相關的 FTP 站找到你要的核心。
    • http://www.kernel.org/
    • 交大資科
    • 教育部

    另外，你也可以在我這裡下載 linux-2.2.19.tar.gz 這個核心版本。基本上，最好是在系統安裝完畢之後馬上就進行核心編譯工作，免得以後每次裝一些特定功能的時候又要花一大輪時間編譯。另外要說明的，由於小弟是以 2.2.18 這一版的核心來做升級的動作，所以以下是以 2.2.18 來做示範！

  • 核心解壓縮：
    下載下來的核心大致上都是 *.tar.gz 這種壓縮檔，所以需要先解壓縮，另外，由於 redhat 預設的編譯核心的目錄是 /usr/src/linux ，所以你要將這個壓縮檔解至這個目錄。不過由於系統原本就有一個 linux 的連結檔在這裡，所以你要先取消連結檔。現在假設你的 linux-2.2.18.tar.gz 放在 /root/ 底下，則你可以這樣做：
    [root@tsai /root]# cd /usr/src/
    [root@tsai src]# rm linux
    [root@tsai src]# tar -zxvf /root/linux-2.2.18.tar.gz
    [root@tsai src]# mv linux linux-2.2.18
    [root@tsai src]# ln -s linux-2.2.18 linux
    則你的新核心資料放在 linux-2.2.18 這個目錄中，而 linux 則是連結至這個目錄的連結目錄！

開始設定核心的內容
編譯核心有許多方法，這裡以視窗介面的方法來說明：
  1. 進入核心目錄： cd /usr/src/linux
  2. 開始設定畫面： make menuconfig
  3. 進入選擇項目：
    進入選擇項目之後，你將會在視窗介面中看到很多的選項，請使用方向鍵、空白鍵與 enter 來進行選擇。以下開始你要慢慢的詳細挑選，如果有任何問題的話，請詳細的看一下每一個選項中的 Help 。另外，如果沒有需要的話，請盡量不要把核心邊的太大！否則效能是會降低的喔！此外，由於很多時候你不曉得需不需要選擇這個項目，那你可以將之編成模組（<M> 的項目），模組是在開機載入時有被載入才可以執行的咚咚！所以並不會使效能方面有太大的問題！
    • Code maturity level options：請選擇。這個項目主要在讓你可以接受一些測試的版本的套件。
    • Processor type and features：請選擇進入，選你的 CPU 形式。
      • Processor family：例如鳥哥的 CPU 為 P-166 則我可以選擇 Pentium/K6/TSC/CyrixIII 這一項！
      • Math emulation：這一項請不要選擇，因為這是用軟體來模擬硬體的計算核心，因為我們的 CPU 都是 P-100 以後的，所以不用選這項！
      • Symmetric multi-processing support：這是是否支援雙CPU 的主機板的選項，你可以選擇也可以不選擇，但如果你使用雙CPU主機板，這個就一定要選擇。
      • 其他保持預設值即可。
    • Loadable module support：請選擇，這是用來是否支援模組載入的。
      • Enable loadable module support：請選擇。
      • Set version information on all symbols for modules：不要選，因為我們可能會具有兩種以上的版本的核心，所以這一項不可選擇。
      • Kernel module loader：請選擇。
    • General setup：
      • Networkking support：一定要選擇。
      • PCI support：請選擇。
      • Advanced Power management BIOS support：如果您的BIOS支持APM的話﹐請選擇。
      • Power off on shutdown：如果您選擇了上一個﹐也請選擇。
      • 其他，保留預設，或視實際情況設定。 例如我們實驗室的機器需要與 SGI 的機器聯繫，所以就多選擇了 SGI Visual Workstation support 這一項。
    • Plug and Play support：將之全部選擇。
    • Block devices：裡面放置了一些晶片組的選項，通常以預設值就可以了，不過，如果你的主機板是最近的版子，例如 VIA 的 82C586 晶片組，哪就必須進來選擇你的晶片組啦！
    • Networking options：這是所有項目裡面最重要的了，底下的選擇
      • Network firewalls﹐請選擇。
      • Socket Filtering﹐請選擇。
      • TCP/IP networking﹐請選擇。
      • IP: multicasting﹐請選擇。
      • IP: advanced router﹐請選擇。
      • IP: police routing﹐請選擇。
      • IP: verbose route monitoring﹐請選擇。
      • IP: firewalling﹐請選擇。
      • IP: use FWMARK value as routing key﹐請選擇。
      • IP: transparent proxy support﹐請選擇。
      • IP: masquerading﹐請選擇。
      • IP: ICMP masquerading﹐請選擇。
      • IP: masquerading special modules support﹐請選擇。
      • IP: ipautofw masq support﹐請選擇為 Module。
      • IP: ipportfw masq support﹐請選擇為 Module。
      • IP: ip fwmark masq-forwarding support﹐請選擇為 Module。
      • IP: optimize as router not host﹐請選擇。
      • IP: multicast routing﹐請選擇。
      • IP: aliasing support﹐請選擇。
      • IPX: Full internal IPX network﹐如果您的網路有Novell伺服器﹐請選擇。
      • IPX: SPX networking﹐如果您的網路有Novell伺服器﹐請選擇。
      • 其他﹐保留預設﹐或視實際情況設定。
    • Telephony Support：保留預設值。
    • SCSI support：除非你有 SCSI 的設備，否則可以選擇成為 M 的模組型態。
    • Network device support：這個也是很重要的選項，與你的網路卡有關！
      • Dummy net driver support：非常建議選擇。
      • Ethernet (10 or 100Mbit)：除非您使用其他的網路形態﹐否則這個一定要選擇。
        • 3 COM cards：除非您的網路卡是這個牌子的﹐否則不選擇。
        • Western Digital/SMC cards：除非您的網路卡是這個牌子的(或兼容)﹐否則不選擇。
        • RealTek 8912/8139 (not 8019/9029!) support：除非您的網路卡是這 8912或8139這兩個確切型號﹐否則不選擇﹐不過﹐也可以選“M”。
        • Other ISA cards：如果您有ISA網卡的話﹐可以選擇。
        • NE2000/NE1000 support：如果您不知道您的網路卡型號﹐這個可以試試選擇。
        • EISA, VLB, PCI and on board controllers：請選擇。
        • PCI NE2000 support：如果您用的是PCI網路卡﹐又不知道型號﹐這個可以試試選擇。
        • EtherExpressPro/100 support：如果您有此類網卡﹐請選擇。
        • Pocket and protable adaptors：如果您使用PCMCIA網卡﹐可以試試選擇。
        • 基本上在這個選項當中，就是選你有的網路卡的形式就對了！
      • FDDI driver support：如果您沒用使用FDDI﹐請不要選擇。
      • Frame relay DLCI support：如果您沒用使用Frame relay﹐請不要選擇。
      • PPP (point-to-point) support：這個一定要選擇。
      • SLIP (serial line) support：如果您知道您ISP使用SLIP﹐可以選擇。
      • Token Ring driver support：如果您的網路不是這個形態﹐請不要選擇。
      • 至於其他﹐如果確定不使用的﹐就不要選擇﹐如果不確定﹐可以保留預設﹐或將之設成“M”。
    • Amateur Radio support ：有才選擇，通常不選。
    • IrDA (infrared) support：有才選擇，通常不選。
    • ISDN subsystem：有才選擇，通常不選。
    • Old CD-ROM drivers (not SCSI, not IDE)：有才選擇，通常不選。
    • Character devices：有才選擇，通常不選。
    • USB support：有才選擇，通常不選。
    • Filesystems：這個與你的 Linux 系統可支援的檔案型態有關，一定要進來選擇。
      • Quota support：請選擇。
      • DOS FAT fs support：請選擇。
      • MSDOS fs support：請選擇。
      • VFAT (Windows-95) fs support：請選擇。
      • ISO 9660 CDROM filesystem support：請選擇。
      • Microsoft Joliet CDROM extensions：請選擇。
      • NTFS filesystem support (read only)：請選擇。
      • OS2/HPFS filessystem support (read only)：如果您的機器還有OS/2系統﹐請選擇。
      • Network File Systems：請展開﹐喜歡的話﹐可以全部選擇﹐但我們只關心‘NFS’和‘SMB’的部分。
      • Partition Types：除非您找到相關項目﹐否則可以不理會。
      • Native Language Support：請展開﹐然後選擇﹕
        • Codepage 850
        • Codepage 950
        • NLS ISO 8859-1
    • Console drivers：除非您確定﹐否則保留預設。
    • Sound：如果您用的是Creative的SB16﹐或兼容聲卡﹐可以不理會。
    • Kernel hacking：保留預設則可。

    這樣就編完了，請按下『exit』然後選擇 save 後，即可離開視窗畫面。

  4. 更改前一版的模組目錄：
    再來則是要開始讓系統編譯你剛剛設定的核心了，此時請注意，如果你使用的核心版本之前你已經有編過一次了，那樣的話，在 /lib/modules 這個目錄中應該會有前一版的模組，這時請到這個目錄下將該核心目錄更改名稱。不過我們這裡由於是第一次編譯核心，所以在 /ib/modules 裡面應該只有 2.2.12-20 這個目錄，因此這一步就不用作了。

開始編譯
這個時候要開始編譯我們的核心了，其實也是很簡單，直接執行以下幾個步驟即可：
[root@tsai linux]# make dep
[root@tsai linux]# make clean
[root@tsai linux]# make modules
這個步驟要花點時間的，所以按下 enter 後就可以去看電視了！
[root@tsai linux]# make modules_install
[root@tsai linux]# make bzImage
這個步驟是最久的一步，也請你去喝個茶吧！
這時才開始編譯核心。其實有兩種編譯核心的方法，
分別是 make bzImage 及 make zImage，有何不同？
在 bzImage 編譯的核心是經過壓縮的，由於我們目前編的核心
都蠻大的，所以需要 bzImage 這個指令，如果你選擇的核心很小，
就可以使用 make zImage 了（據說比較快一點）。
[root@tsai linux]# make bzlilo
最後一動啦，將核心安裝在硬碟之上。

在執行 make modules_install 後，會在你的 /lib/modules 形成一個專屬於這個核心的模組目錄，而在執行 make bzImage 成功之後，會在你的根目錄造成兩個重要的檔案，就是我們最重要的核心開機程式了，分別是：vmlinuz 及 System.map 這兩個檔案。

安裝編譯完成的核心及設定多重開機選項 lilo
好了，編譯完就是要安裝啦！由於害怕剛剛編譯完的核心不能正常的開機，所以通常鳥哥都是手動來設定成多重開機的選單，好讓我們如果發生錯誤的設定，可以直接再次開機來進入 Linux 系統。
  1. 移動兩個主要的開機檔到 /boot 中：並加以更改名稱
    [root@tsai linux]# cd /
    [root@tsai /]# mv System.map /boot/System.map-2.2.18
    [root@tsai /]# mv vmlinuz /boot/vmlinux-2.2.18
    [root@tsai /]# cd /boot
    [root@tsai /boot]# rm System.map
    [root@tsai /boot]# ln -s System.map-2.2.18 System.map
    如此一來，則你的開機執行的 System.map 會找尋 2.2.18 這一版的資訊！
  2. 編輯你的 /etc/lilo.conf 多重開機設定檔：
    這裡就必須比較小心了，因為設定錯誤會讓你開不了機的！只要設定一個檔案就好了，那就是 /etc/lilo.conf 這個檔案。
    [root@tsai /boot]# vi /etc/lilo.conf
    進入 vi 的編輯畫面，原始的 lilo.conf 有點像這樣：
    ----
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=linux

    image=/boot/vmlinuz-2.2.12-20
    label=linux
    initrd=/boot/initrd-2.2.12-20.img
    read-only
    root=/dev/hda5

    other=/dev/hda1
    label=windows
    ----
    關於上述個相關的咚咚你可以到 設定lilo 去看，
    而經過修改之後可以變成像是這樣：
    ----
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=linux-2.2.18 <==預設以 2.2.18 開機

    image=/boot/vmlinuz-2.2.12-20
    label=linux-2.2.12-20
    initrd=/boot/initrd-2.2.12-20.img
    read-only
    root=/dev/hda5

    image=/boot/vmlinuz-2.2.18 <==這是新的核心喔！
    label=linux-2.2.18
    read-only
    root=/dev/hda5

    other=/dev/hda1
    label=windows

    重要的地方在於 default=linux-2.2.18 這一行，以及 image=/boot/vmlinuz-2.2.18 兩行，需要指定正確才行！基本上這樣就設定成功了！
  3. 啟動 lilo ：
    這個時候請打入：
    [root@tsai /boot]# lilo
    Added linux-2.2.12-20
    Added linux-2.2.18 *
    Added windows
    你會看到如上的說明，可以看到 linux-2.2.18 有打星號，這表示預設的開機檔是以 linux-2.2.18 的核心來開機的！
  4. 重新開機：
    現在你可以重新開機來測試一下你的核心了！當然，你也可以在開機過程中，出現 boot 時按下 tab 鍵，讓你選擇你要的開機檔！
  5. 換回舊核心：
    如果核心使用的不滿意怎麼辦？你可以如此的換回來原先的核心：
    • 進入 /boot 中，將 System.map 的連結檔換成 System.map-2.2.12-20 這一個，
    • 編輯 /etc/lilo.conf 檔案，將預設的開機檔改成 linux-2.2.12-20 ，
    • 最後再執行 lilo 即可！
編譯核心有時候會遇到許多麻煩﹐尤其是當您從一個舊的版本升級上來。建議您看看 kernel-HOWTO 和 modules mini-howto 之外﹐還應該看看 /usr/src/linux/Documentation 裡面的文章﹐尤其是 Changes?modules.txt?kmod.txt 等。而且﹐在編譯(make menuconfig)的過程中﹐對任何不明白的選項﹐應該看看 Help 是怎麼說的﹐這非常重要。

另外，由於編譯核心並以新的核心開機之後，所有的模組都會到新的目錄去，如以上面的例子來看，以新的核心開機時，模組的載入會跑到 /lib/modules/2.2.18 中，所以如果你的網路卡不是模組中有的，而是自己安裝的，那你得在重新安裝一次到新的目錄中，否則你的網路將無法連接喔！

2002/ 01/01以來統計人數


Linux 例行性命令的建立
最近更新日期：2001/11/04
前言
使用 crontab 指令
修改 /etc/crontab 檔案
前言
假如你每一天早上 8:00 鐘要伺服器連接上音響，並啟動音樂來喚你起床；而中午 12:00 希望 Linux 可以發一封信到你的郵件信箱，提醒你可以去吃午餐了；另外，在每年的你愛人的生日的前一天，先發封信提醒你，以免忘記這麼重要的一天.....要怎樣達到這個目的呢？其實是很簡單的，只要使用 crontab 就可以啦！
其實，Linux 本身在背景下的工作可是很多的，尤其是網路開放的情況下，建立與取消連線、MySQL 資料庫的即時更新、以及一些例行的系統指令，例如釋放記憶體的工作等等。由於例行的工作非常的多，實在不可能每天都要管理員來手動輸入吧！因此我們就需要瞭解一下 Linux 是如何建立例行性工作的！
crontab 基本上有兩種建立例行性命令的方式，一種是針對所有使用者，可以藉由 crontab -e 的指令來下達工作排程；另一種是針對系統管理員，你可以直接藉由修改 /etc/crontab 這一個文字檔，來直接排程！那 crontab 的主要命令要如何執行呢？待鳥哥慢慢道來！
使用 crontab 指令
建立個人用戶的例行性命令：
假如你需要在每天的正午 12:00 發一封信給你自己，而且信的內容已經寫好了，那要怎樣作呢？而且，另一個假設是，你在 Linux Server 中的權限僅止於一般使用者，並不是 root （管理員）身份，那要怎樣設定你的例行性命令呢？哈哈！那就使用 crontab 這個指令吧！你只要執行 crontab -e 就可以進入 vi 的編輯畫面來編輯你的例行性命令說！
[vbird@tsai vbird]# crontab -e

0 12 * * * mail vbird@tsai.adsldns.org < /home/vbird/test.txt

在上面的例子中，輸入 crontab -e 時，會出現一個 vi 畫面，然後你在 vi 畫面中輸入上面的一行字，之後按 :wq 儲存後離開！即可完成編輯！容易吧！那上面那一行字代表什麼意義呢？你可以看到，在真正執行命令之前（就是 mail vbird@tsai.adsldns.org < /home/vbird/test.txt ）總共有五個數字，這五個數字分別代表：
分（0-59）
小時（0-23）
日期（1-31）
月份（1-12）
週（0-6）
數字代表的意義 | 分鐘 | 小時 | 日期 | 月份 | 週
範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-6 (0為星期天)
另外，如果是『 ＊ 』的時候，代表所有數字都適用的意思。所以，你就可以知道我上面那一行寫的意義為何了！那就是不論何月、何日、星期幾的 12 點 0 分時，執行 mail vbird@tsai.adsldns.org < /home/vbird/test.txt 這個命令！還不瞭解？沒關係，我們這裡作幾個例子！
  • 例題一：假如你的女朋友生日是 5 月 2 日，你想要在 5 月 1 日的 23:59 發一封信給他，這封信的內容已經寫在 /home/vbird/lover.txt 中了那你要如何編輯呢？呵呵，使用：
    [vbird@tsai vbird]# crontab -e

    59 23 1 5 * mail pigpp@tsai.adsldns.org < /home/vbird/lover.txt

    就可以囉！那樣的話，每年 pigpp 都會收到你的這封信喔！（當然囉，信的內容就要每年變一變啦！）
  • 例題二：假設你每隔五分鐘就要去 check 你的一個名為 test.sh 這個批次檔一次！要如何寫呢？
    [vbird@tsai vbird]# crontab -e

    */5 * * * * /home/vbird/test.sh

    就可以啦！有兩件事要注意一下：(1) 指令的路徑最好是下達絕對路徑，這樣比較不會找不到執行的檔案喔！；(2) 第一個數字 */5 表示『每五分鐘執行一次』的意思！
  • 例題三：假如你每個禮拜五下午 4:30 要告訴朋友星期六的約會不要忘記，如何下達指令？
    [vbird@tsai vbird]# crontab -e

    30 16 * * 5 mail frend@test.domain.name < /home/vbird/frend.txt

    就成功啦！這樣了不了呀！
察看個人用戶的例行性命令：
如果你一直使用 crontab 這個方法來下達例行性命令的話，有可能有一些指令你會忘記了！那怎辦呢？沒關係，只要下達：
crontab -l （註： -l 是 L 的小寫喔！）
就可以知道你曾經下達的 crontab 的命令囉！
刪除例行性命令：
這個更簡單，使用 crontab -r 就刪除了！
修改 /etc/crontab 檔案
    如果你是系統管理員的話，那麼是否還是需要以 crontab -e 來管理你的例行性命令呢？當然不需要，你只要編輯 /etc/crontab 這個檔案就可以啦！有一點需要特別注意喔！那就是 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個執行檔，但是 /etc/crontab 可是一個『純文字檔』喔！你可以 root 的身份編輯一下這個檔案哩！
    [root@tsai /root]# vi /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/

    # run-parts
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    看到這個檔案的內容你大概就瞭解了吧！呵呵，沒錯！這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣！只是有幾個地方不太相同：
    • MAILTO=root：是說，當 /etc/crontab 這個檔案中的例行性命令發生錯誤時，會將錯誤訊息或者是螢幕顯示的訊息傳給誰？由於 root 並無法在用戶端中收信，因此，我通常都將這個 e-mail 改成自己的帳號，好讓我隨時瞭解系統的狀況！
    • 01 * * * * root run-parts /etc/cron.hourly：在 #run-parts 這一行以後的命令，我們可以發現，五個數字後面接的是 root 喔！沒錯，這一行代表的是『執行的層級為 root 身份』當然囉，你也可以將這一行改寫成其他的身份哩！而 run-parts 代表後面接的 /etc/cron.hourly 是『一個目錄內（/etc/cron.hourly）的所有可執行檔』，這也就是說，每個小時的 01 分，系統會以 root 層級的使用者去 /etc/cron.hourly 這個目錄下執行所有可以執行的檔案！後面的三行也都是類似的意思！你可以到 /etc/ 底下去看看，系統本來就預設了這四個目錄了！你可以將每天需要執行的命令直接寫到 /etc/cron.daily 即可，還不需要使用到 crontab -e 的程式呢！方便吧！
    好！你現在大概瞭解了這一個咚咚吧！OK！假設你現在要作一個目錄，讓系統可以每 2 分鐘去執行這個目錄下的所有可以執行的檔案，你可以寫下如下的這一行在 /etc/crontab 中：
      */2 * * * * root run-parts /etc/cron.min
    當然囉， /etc/cron.min 這個目錄是需要存在的喔！那如果我需要執行的是一個『程式』而已，不需要用到一個目錄呢？該如何是好？例如在偵測網路流量時，我們希望每五分鐘偵測分析一次，可以這樣寫：
      */5 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
    沒有了 run-parts 就是代表『一個檔案』的意思啦！
    如何！？建立例行性命令很簡單吧！如果你是系統管理員的話，直接修改 /etc/crontab 這個檔案即可喔！又便利，又方便管理呢！
2002/ 01/01以來統計人數


特別強調
底下這些文件主要是針對 Linux 的網站架設來書寫的，而由於 Linux 在網站的架設方面，每個 Linux distributions 所提供的工具與 RPM 套件都不相同，因此，在必要的條件下，我都是以 Tarball 的方式來架設，以符合大部分的朋友的 Linux 操作環境∼最主要是想要避免由於不同 distributions 所造成的困擾啦！以方便大家都可以利用同樣的一篇文章，架設出符合您自己的 Server 的環境喔！另外，要特別強調的是：
  • 由於網站的架設需要很強的
    1. Linux 系統架構的瞭解；
    2. 網路的基礎知識，
    所以您『一定要將 Linux 基礎篇看完才來玩架站篇』，否則，如果您在架站的過程中發生問題，將會很難解決您的困擾，因為，基本上，您玩 Linux 架站，卻不去理解 Linux 基礎，那就是一個最大的困擾了！

  • 出現問題的時候，請『務必』查看 Log file ！那個是最主要的問題克服的地方！
第一部份：架站前進修篇
架站需要很強的 Linux 基礎概念以及網路基礎知識，否則，您的網站架設好之後，可能隔天就被 Cracker 給破解掉了，如此一來將需要重新安裝，而再次安裝的結果，也是再次的被入侵∼所以，請您務必在架站前『讀過 Linux 基礎篇』及『讀過網路基礎篇』的文章，否則大家很難跟您討論呢！這個部分我放在最前面，希望大家『務必』要查看這些資料啊！

架站之前的技能 (施工中) | 架站之前您至少需要學會什麼咚咚呢？可能要知道的有『什麼是群組、使用者與其他類群組？』『什麼是檔案的權限與樹狀目錄？』『什麼是 Shell 與 Shell Scripts ？』『什麼是服務？』以及其他林林總總需要瞭解的事項，不知道這些東西，那就不要想架站啦！否則....怎麼翹辮子的都不曉得哩！
簡易 網路基礎架構 2002/07/18 | 要進入多樣化的網路世界之前，請先瞭解一下網路的基礎架構吧！例如：什麼是 IP？ 一個資料封包傳送到 Internet 上面的時候，他的程序是如何進行的？什麼是 TCP 封包？另外， Hub 與 Switch 哪一個比較好？為什麼呢？嘿嘿！這個在架站之前都必須要先瞭解一下，否則怎麼架站呀！？而且瞭解整個網路架構之後，比較容易網路除錯呦！
區域網路架構簡介 2002/07/22 | 在瞭解了基本的 網路架構 之後，再來就是將你家的電腦全部連在一起好做成一個 LAN 啦！那你預計有幾台 PC 在你的 Linux 主機附近？要怎麼連接這些不同的電腦才行？需要哪些網路參數？該如何挑選你的網路硬體裝置及一些線材的選擇？另外，先將你的 Windows 電腦的網路設定搞定吧！呵呵！來這裡查看看吧！
連上 Internet 2002/07/24 | 如何連上 Internet 呢？ Linux 的網路相關設定檔案有哪些？使用 ADSL 撥接、 Cable moden 的上網方式、以及固定 IP 的上網方式是怎樣的一個狀態？！此外，萬一你是 ADSL 撥接的，而你的網路斷線了，要如何隨時讓 Linux 自行偵測，並且讓他自行重新撥接呢？來這裡看看我們是怎樣做的吧！！
Linux 網路功能 2002/07/31 | 嘿嘿！已經可以連接上網路了嗎？如果可以的話，那就恭喜你囉！那麼趕快來試一試 Linux 的網路功能吧！先利用 ping, ifconfig, route, traceroute 來看看你的網路結構；再利用 telnet, ftp, ncftp 來試試看 Linux 強大的網路功能哩！此外，我們還有文字界面的瀏覽器 lynx 呦！另外，嘻嘻！還有 wget 這個好用的下載軟體呢！還要介紹怎麼查詢其他 Internet 上面的主機 IP 呦！
Linux 網路偵錯 2002/07/31 | 瞭解了基礎的網路功能之後，現在要來解決你無法連上 Internet 的困擾囉！對！沒錯！不要懷疑，就是一些 FAQ 問題的總整理啦！呵呵！如果你一直無法連接上 Internet 的話，這裡面的資料或許會對你有啟發的作用呢！趕快來除蟲吧！

第二部分：主機的簡易防火措施
在架設網站之前，您『務必知道你的系統開了哪些服務與埠口』，否則，怎麼被侵入的都不曉得哩！豈不是相當的可怕？∼天曉得什麼時候你的系統會不小心的被破壞呢？！所以囉，我們在架站之前，基本的網路防備措施還是得來瞭解一下，免得三不五時要重灌、重灌、重灌、、、、

限制對外埠口 port 2002/08/02 | 在上網之前，最起碼要知道你的 port 目前開放了哪些呢？最重要的工作就是，將所有的 port 都給他關閉( 反正我們還沒有提到架站的部分 )，那麼這些關閉 port 的地方在哪裡？要如何關閉？每個 port 對應的服務是什麼？在哪裡可以查詢到？來這兒瞧一瞧！
Linux 套件升級 up2date 2002/08/02 | 曉得你能上網之後的第一件工作嗎？不是查資料！不是申請 DNS ，也不是去看新聞，而是去『更新你的套件！』這個相當的重要，請您立刻更新你的套件版本，否則....嘿嘿....怎麼被怪客入侵的都不曉得呢！
簡易 Router 架設 2002/08/09 | 這個可就有趣啦！我們要介紹一下如何在一張網路卡上面架上多個 IP 呢！此外，亦介紹一下如何在 Linux 這個系統當中，讓他可以當作一個高貴的 Router 哩！這個應該很適合小型的企業內部來使用！用 486 的電腦就可以達成囉！
認識網路安全與認識 iptables TCP_Wrappers 2002/08/12 | 好了！好不容易，連那個 Router 都是屬於內部網路的延伸，現在終於來到要進入 Network 架設安全的網站啦！不過，在這個時候可得先來瞭解一下，嘿嘿嘿嘿！我們的 Internet 到底有多危險哪？！這才是進入網路的第一課呢！會架設網站沒啥了不起，但是會架設一個『安全的網站』，哇！那可真是了不起呀！在這一小節當中，我們會約略的談一談網路安全的幾個基礎概念而已，而主要的目的是要提到 iptables 與 TCP_Wrappers 這兩個寶貝蛋！為何要先提這個麻煩的東西呢？這是因為底下的網站架設我們主要都已安全為出發點，所以當然得瞭解一下囉！尤其這部份不談， NAT 就談不下去了.... ^_^""
簡易 防火牆設計規劃 2002/08/20 | 好了，目前你的所有的內部電腦都可以上網囉！這個時候，請特別留意你的『防火牆』囉！我們這裡選擇 iptables 與 TCP_Wrappers 來進行我們的防火牆規劃設定，嗯！這個防火牆真的很簡單，所以還要再加強其他的考慮呦！
主機取名字囉 (施工中) | 替你的主機取幾個好記的名字吧！連同底下的動態 DNS 設定一起介紹∼這部份還在施工中啦！ ^_^
動態 DNS 與偵測 2002/08/05 | 要架站嗎？嘿嘿！當然就需要讓你的主機有一個『合法』的名字囉！那麼如何『建立一個合法的名字呢』？最簡單的方式就是申請動態 DNS 囉！我們這裡會介紹 www.adsldns.org 的申請方式！此外，還介紹一個 動態 DNS 偵測 script 呦！還不來看看！額外附帶一個在 IP 分享器後端的動態 IP 偵測 script ！

第三部分：伺服器架設
在瞭解了基本的網路基礎以及做好了基礎的防火措施後，嗯！我們可以聊一聊如何架站啦！呵呵！底下的文件希望對您有幫助囉！ ^_^

簡易 Telnet SSH 伺服器 2003/03/08 | Linux 由於安全性的考量，所以目前已經預設不開放 telnet 囉，好了，那麼如果你還想要開放 telnet 怎麼辦？又！如果要開放 SSH 又要怎麼辦，又！如果要針對這兩個咚咚來設定安全機制，又要怎麼做？！鳥哥來提供幾個小建議吧！還有，有了 sftp 幹嘛需要開放 FTP 呢？
簡易 NAT 伺服器 2002/08/15 | 架設 Linux 的最大好處除了可以讓你的系統資源對外開放之外，對大的特色之一就是可以使用 頻寬分享 的功能啦！呵呵！如何讓你的 Linux 分享你的 ADSL 頻寬，好讓所有內部的電腦都可以上網呢！？就是這個簡單的 NAT ( Network Address Transfer )伺服器的設定啦！要架設一個安全的 NAT 伺服器並不容易，但是如果僅是要開放所有的系統資源，那就簡單多了！請注意，我是以 iptables 的方式來架設的，如果是 ipchains 的話，就請參考舊文章吧！至於安全性，嘿嘿！底下的文章會繼續提到呦！
簡易 NFS 伺服器 2003/03/09 | 最簡單的伺服器架設之一就是 NFS 了！架設真的是很簡單！不過，這個 NFS 有什麼用途呀！呵呵！他就是 Linux <-> Linux 檔案傳送之間最簡便的方式之一了！架設簡單，使用也很簡單，不過，就是有點危險∼所以，我們只要對內部開放就好了呦！
簡易 DHCP 伺服器 2002/11/23 | DHCP 就是分配『動態 IP 』的協定啦！那麼如果你的內部網路還蠻大的，而且你又不想一個一個的去設定你的 Client( 客戶 ) 的電腦，那麼使用 DHCP 實在是一個很方便的事情！不過，由於 Client 端每次開機都要搜尋一次 DHCP ，所以開機速度很慢，建議內部電腦不多的時候，還是手動設定比較好ㄋㄟ∼
簡易 DNS 伺服器 2003/03/10 | 可以的話，最好是不要架設 DNS 啦！一者，很難設定的好，二者，又有安全性上面的顧慮，所以，非必要，我個人認為，還是不要設定 DNS 伺服器的好！但是，很多時候，偏偏沒有 DNS 在管理主機名稱上面，又很麻煩！唉！當真是兩難吶！我們這裡會先提一個觀念：『我要架站，是否一定需要架設 DNS 伺服器？』這個觀念相當的重要，很多人都被市面上的書誤導了∼再者，才是簡易的 DNS 設定啦！
簡易 Web 伺服器 2003/01/14 | 目前最熱門的網頁伺服器之一，就是 LAMP 囉，什麼是 LAMP 呢？吶！簡單的說，也沒有什麼了不起，不過是 Linux + Apache + MySQL + PHP 囉！這裡我們除了介紹最簡單的 RPM 方式安裝的 LAMP 伺服器，如果要升級！哇！可累了∼要使用 tarball ㄋㄟ！此外，還會介紹 2.xx 版的 Apache 喔！
簡易 SAMBA 伺服器 (施工中) | Linux 對 Linux 使用的是 NFS ，那麼 Windows 對 Windows 使用的是 NetBEUI ，好了，那麼 Linux 對 Windows 用的是什麼？沒辦法，配合 Windows ，所以我們使用的也是 NetBEUI 囉！而使用的套件就是 SAMBA 啦！
簡易 Mail 伺服器 ( Sendmail ) 2003/03/01 | 在這個郵件伺服器的架設中，我們首先談論 Mail 與 DNS 的重要相關性，然後依序介紹 Mail Server 的相關名詞，以及 Mail Server 的運作基本流程與協定，也會談到相關的 Relay 與 郵件認證機制 等項目，這些項目對於未來郵件主機的管理與設定是重要的，請不要忽略了這方面問題的討論喔。當然，主要的目的還是在於架設 Sendmail 這個使用最為廣泛的郵件主機伺服器軟體囉！
簡易 Mail 伺服器 ( Postfix ) 2003/03/07 | 在介紹完了 sendmail 之後，您是否覺得∼唉！怎麼 sendmail.cf 這個設定檔這麼難搞定∼還得藉由 m4 scripts 才能搞定！而且， sendmail 需要考慮到相當多的安全設定項目 ( Security )，否則很容易一不小心就被攻擊了！那麼有沒有更簡單、更安全的郵件系統啊！當然有啊！那就是 Postfix 這個咚咚！Postfix 的作者有鑑於 sendmail 是這樣成功的一個 MTA ，但是偏偏有點小問題，所以該作者站在兼容的立場上面寫出這個幾乎可以完全取代 sendmail 的 MTA ！此外， Postfix 還更加的安全呢，真是很不錯的一個 mail server 的替代方案啊！
簡易 FTP 伺服器 ( Wu-FTP ) 2003/03/26 | 說實在的，鳥哥本人真的不希望大家架設 FTP 這個伺服器，因為實在是很『危險！』不過，如果要架設的話，還是可以啦！但是需要謹慎一點，不要隨意開放呢！
簡易 FTP 伺服器( ProFTP ) (施工中) | 既然 Wu-FTP 也不安全，那麼 ProFTP 又如何呢？還是得試試看才知道吧！？哈哈！趕快也來試試看怎樣安裝與取代 Wu-FTP 呢？！
簡易 Proxy 伺服器 2003/04/04 | 代理伺服器這個東西對於大企業可了不得囉！可以提升內部的網路的速度呢！雖然是有點奇怪的說法，不過，他確實可以『假象』的提升企業內部的網路工作效率，嘿嘿，廢話不多說，趕快來看看怎樣架設吧！
簡易 NIS 伺服器 2003/05/06 | NIS 是什麼東西呢？假如我有好幾部l Linux 主機，而這幾部 Linux 主機的『帳號與密碼其實都一樣』啊！這樣的架構其實在一般的企業界是很常見的，果真如此的話，如果每一部 Linux 主機都要設定帳號密碼，會瘋掉，此時就需要 NIS 的幫忙啦！NIS 可以讓網域當中所有使用者的帳號與密碼都放置在一部 NIS server 當中，至於其他的 Linux 主機就做為 NIS Client ，當有用戶要登入 NIS client 時，那麼 NIS client 就會向 NIS server 要求讀取帳號與密碼的資料，如此一來，只要在 NIS server 上面進行帳號與密碼的管理即可囉！
簡易 DMZ 伺服器 ( 施工中 ) | 瞭解了 NAT 之後，那麼如何架設一個比較好的防火牆也是一個重要的學問！接著下來，那麼我要如何設定一下我的 NAT 或防火牆之後的主機呢？呵呵！來看看如何設定啊！
簡易 LDAP 伺服器 ( 施工中 ) | 哇！這個東西也很厲害！還沒實作過實在不知道他會變成什麼樣子！鳥哥本人也很期待的吶！
MySQL 基本指令使用 ( 施工中 ) | 如果已經架設好 LAMP ( Linux + Apache + MySQL + PHP ) 的朋友，最想要知道的大概就是『嗄！我的資料庫出問題，或者是死掉的時候怎麼辦？』呵呵！這個時候我們可以直接登入 MySQL 資料庫系統，而不必經由 PHP 程式來管理呢！ But HOW ？我們這裡就來談一談吧！
Webmin 伺服器架設 ( 施工中 ) | 瞭解了所有的手動啟動伺服器之後，那麼這一篇才可以看 ^_^ ，因為在這一篇裡面，我們完全不談理論，只談怎麼架設 webmin ，而且，架設起來之後的其他設定，其他的咚咚就交給您自己搞定啦！
平行計算電腦的建置 Cluster Server 2003/05/12 | 當您想要使用電腦來進行大量的計算時，呵呵！這個平行計算電腦的架構就顯得相當的重要啦！基本上， Cluster (叢集電腦) 的解釋相當的紊亂，我們這裡主要以『平行計算』的功能來做為 cluster 的說明！什麼是平行計算呢？當你需要使用數值模式(一些很龐大的程式，會使用到很大量的 CPU 運算功能)，那麼越多顆 CPU 來分擔這樣的工作，自然運算的速度就越快了！而這個將運算資料同時丟給很多顆 CPU 來跑得功能，就是我們簡稱的平行運算啦！

舊文件 Red Hat 6.1
(Very Old)
 如果是使用舊的系統的話，那麼就到底下來看看吧！

2002/07/21 以來統計人數


簡易網路基礎架構
最近更新日期：2002/09/26
關於網路基礎：
淺談網路： 網路是什麼, 網路功能, 網路運作模式, OSI 七層協定,
基礎網路佈線模式： Internet, LAN, WAN, Intranet, Extranet,
網路媒體的運作方式： 網路媒體, 什麼是物理廣播, 封包碰撞, 軟體位址到硬體位址, TCP/IP 流程,
    網路媒體的選擇：網路線的等級, 平行線與跳線, hub 與 Switch, 傳輸單位,
    網路卡與驅動程式： 驅動程式, MAC, 選購要點,
    IP 觀念： IP, network, netmask, broadcast, gateway, ARP協定, 保留 IP 與內部迴圈網路,
    TCP 封包概念： 埠口對應檔案 /etc/services, 防火牆, TCP_Wrappers,
Gateway 與 Router ：
其他討論：何為實體 IP, 保留 IP, 浮動式 IP, 與動態 IP ？
特別感謝：
關於網路基礎之注意事項：
在 Linux 中的最大優勢就是在 Network 的功能啦！包括他的高效能網路傳輸與高穩定度系統資源分配，以及較為安全的網路防備能力！然而，由於這些優點同時也是缺點，因為一旦被 Cracker (網路怪客) 入侵的話，嘿嘿嘿嘿！怎麼吃上官司的都不知道！所以囉，上網之前，請先注意：我的網路做好安全防護了嗎？再者，由於 Linux 的設定上面常常比較不人性化，畢竟當初他是由一群工程師發展出來的 Unix 的下一代，所以依舊具有相當麻煩的設定工作需要作！這個時候，如果沒有較為基礎的 網路基礎 認知的話，那麼在 Linux 上面設定網路或者是網路除錯將是您一生當中最大的夢魘......，所以，這裡有幾件事情要請您好好的來參考一下：
  • 花幾晚的時間將網路基礎看一看： 這一篇短文旨在引導新鮮人快速進入網路的世界，所以寫的比較淺顯一些些，基本上，還有一堆網路硬體與通訊協定並沒有被包含在這篇短文裡頭。如果您的求知慾已經高過本篇短文，那麼請前往 Study-Area 裡面的 網路基礎 取經去吧！尤其是 IP 基礎 那一篇，對於您的網路概念，將有『長足』的進步呢！此外，如果您對於本篇短文有不苟同之處，請千萬與小弟聯絡，以提供小弟修改的空間！感謝感謝！
  • 再度熟悉 Linux 操作與 Linux 基礎：還是要一再地強調，如果您確定您只是想要『會使用 Linux 就好』那一類型的使用者，那麼真的不要再往下看了，因為問題會很大，倒不如花個小錢，請個專家來幫你搞定即可！而如果您確定您是『想要更瞭解 Linux 的使用者，並且想要熟悉架設網站』，那麼請不要再在網路上詢問：『為何我不能使用 FTP 傳送資料到主機上？』或者是『為何我不能建立個人網頁』之類的傻問題，因為這僅僅牽涉到『檔案權限與屬性』的概念而已，而這些概念都是 Linux 基礎裡頭相當重要的功課！此外，由於遠端操控 Linux 主機時，幾乎都是使用文字界面來工作，所以，不懂 bash shell ？哈哈！那麼想要幹嘛都碼不可能！
  • 隨時掌握主機資訊： 這是最麻煩的一點啦！因為大家還是常常認為『我的網站這麼小，沒有人會注意的啦！』唉！說過若干次了，就是因為有這種心裡存在，我們才會常常聽到『奇怪！我在早上剛安裝完畢，怎麼下午就無法以 root 的身份登入了！』請隨時注意您主機的資訊，好好的愛護他吧！
無論如何， netman 大哥寫的 網路基礎 請千萬不要忘了前往一觀！拜託拜託！否則您後來的網路學習腳步會很慢很慢...
淺談網路：
網路是什麼？
網路是什麼呢？簡單的說，只要是兩部以上的電腦，透過網路線或者是其他的網路媒體(例如無線網卡、專線、Cable纜線等等)連接在一起，以進行檔案傳輸、訊息傳遞等等功能，那就形成一個『網路世界』啦！那麼網路有沒有大小之分呢？基本上，如果您的網路是在您的研究室內幾部電腦，或者是大樓內的所有幾百部電腦連接起來的，那麼就可以視為一個小型的 LAN ( Local Area Network )，透過 LAN 的再延伸，例如整個城市或國家，就可以稱做為 WAN ( Wide Area Network ) ，而這些無數個的 LAN 與 WAN 都連接在一起，那就是 Internet啦！您可以想像成， Internet 僅是將所有的 LAN 與 WAN 連接在一起的一個介面，所以，任何地方的電腦，只要連接上 Internet 之後，就沒有什麼太大的差異了，也就是說，在地球的另一端的電腦，與在您身旁的電腦，在 Internet 上面，事實上是差不多的！(只不過流量有點限制就是了 ^_^)！此外，需要注意的是， Internet 並沒有專人在維護的，所以他是完全沒有王法的地方，您可以在 Internet 上面進行任何的事情！哇！好像很可怕的樣子！是這樣沒錯！ Internet 確實是『相當的可怕！』 ^_^，就是因為太可怕了，所以我們得要來聊一聊網路的基礎呀！
網路的功能：
好了，對於所謂的網路有一點認識之後，要來談一談：網路有什麼功能呢？說穿了，網路真的是很日常生活化的一項工具了！！例如您使用的電腦上 WWW 去瀏覽時，使用的就是網路功能了；您的公司內部的『網路上的芳鄰』分享的檔案、印表機，那就是網路功能之一；上網下載軟體，使用的 FTP 也是網路功能之一！呵呵！夠生活化了吧！我想，目前的生活中，很難有人不去奇摩雅虎看一看奇摩即時新聞的吧！？還有股票啦、電子資訊郵件啦、上網玩網路連線遊戲咯等等，哇！好多功能呦！這都是網路幫您達成的呦！當然啦！網路的功能來不止於此，您可以再更深入的研究呦！
網路的運作模式：
好啦，網路就是幾部電腦連接在一起，並且可以互相進行資料與訊息及硬體周邊分享的一個咚咚，他可以達到的功能相當的多，但是這裡就牽涉出來了一個問題，那就是『網路是如何運作的呢？』，我們以目前最常見的 ADSL 撥接制的情況稍做說明好了。當您需要連線網路時，那麼就必須要有：
  1. 網路卡與網路線：在網路的世界裡，其實真正工作的應該就是電子訊號啦！而這些電子訊號需要藉由硬體做為媒體來傳輸，這就是最底層的網路硬體啦！我們這裡是以 ADSL 來進行說明的，當然還有所謂的光纖、無線網路等等。無論如何，要連接到 Internet 上面去，首先，就是必須要有『連接的媒體』這個媒體一般就是 RJ-45 的網路線與網路卡啦！當然啦，每一種媒體都有其規格與負載量，所以選擇的時候就需要多加的小心囉！
  2. 支援網路媒體的作業系統：有了網路媒體之後，但是沒有能夠跟媒體溝通的作業系統來操控硬體，那硬體當然沒有辦法工作啦！
  3. 合法的網路位址：就跟門牌一樣，沒有門牌，那麼您要如何到達目的地或者別人如何到達你家？此外，在網路位址的訂定方面，還會定義出『路徑』(route，路由)，就是要如何到達目的地的地圖啦！
  4. 資料傳輸的方法：好了，現在硬體都沒有問題了，接著下來就是需要瞭解『我的資料是怎麼傳送出去的？！』哇！好麻煩，還要理解資料『封包』的咚咚呀！呵呵！基本上，不用擔心，目前的網路已經幫我們定義好很多協定了！所以我們只要瞭解他的一些基礎原理即可！其他的就不需要太擔心啦！！
OK！OK！那麼假設一個狀態好了，如果你要瀏覽 奇摩新聞 的話，您是怎樣取得上面網頁的資料的呢？
  1. 首先，您要取得奇摩雅虎上面的資料，就必須向對方傳送一個要求，不然對方怎麼知道您要的資料是什麼呢？呵呵！那麼這個要求的『封包』會先在你的系統上面被『打包』；
  2. 『打包』完成之後，當然就是要開始來傳送咯，傳送當然是藉由網路卡來傳送囉，所以資料這個時候會被送到網路卡上；
  3. 而在網路卡將打包的封包傳送出去之前，會先監聽一下在這個傳送的時間點上面，是否有其他的 PC 同時在傳送，如果沒有的話，封包才可以送出去，否則就無法傳送，需要再等下一次的監聽之後才能傳送！
  4. 好了，那麼開始傳送之後，就需要藉助於 route tables 的規則，才能經由一個一個的節點(nodes)來送達目的地！
  5. 到達目的地之後，再來則是對方的主機將封包收下來，並經過作業系統的解開封包，得到您所要求的資料，然後在依據要求的內容來給予回應！而這個給予的回應又需要上面的這樣一個流程了！這個時候就會變成對方將資料打包->網路卡->網路傳送->....到達你的螢幕前面！
OSI 網路七層協定：
而依據上面的流程來看，我們就不難瞭解到 OSI ( Reference Model for Open System Interconnection ) 的一個模式(model)，稱為 OSI 七層協定的一個模式囉！這個七層協定可以簡單的分為兩大群組，一個用在網路的基礎(硬體協定與網路位址)方面，主要規定了一堆硬體的相關協定；另一個則是使用者部分的協定，使用者可以利用這四個協定來設定自己的應用程式！分別可以這樣看：
  • 網路基礎：實體層、資料連接層、網路層
  • 使用者方面：傳輸、會談、表現及應用層
我們可以簡單的用下表來稍微瞭解一下這七層分別在幹嘛？請特別留意，下表請由下往上看，亦即由實體層看到應用層呦！
OSI 七層協定的名稱
該層負責的工作
應用層
  • 表現層是將資料轉換成 PC 的資料格式，而應用層則是跟應用程式有關的轉換了！例如您的瀏覽器若只認識 BMP 的圖檔，那麼在應用層就會將來自 JPG 或 GIF 的檔案轉成 BMP 囉！
表現層
  • 當接受了會談層傳送來的資料之後，當然，我們必須要針對各個不同的資料與字元進行解碼與轉換的工作！例如 ASCII 與 EDCDIC 之轉換，及資料的加密與與壓縮等等功能！
會談層
  • 資料是藉由傳送層傳送來的，而這一層則是將來自傳送層傳來的資料進行回應的工作！舉個例子來說：假設 client 端為節點 A 而 Server 端為節點 B。
      1. 當節點 A 要對 B 要求建立連線時，A 會先發出『連線請求』的訊息，該訊息上面帶有 SYN 的符號；
      2. 節點 B 收到訊息之後，如果確定接受 A 的連線要求，那麼就會回應一個『確認請求』的訊息給 A ，該訊息上面則帶有 SYN/ACK 符號；
      3. 然後節點 A 再度回應給 B 一個『確認連線』的訊息，帶有 ACK 的符號，這個時候就進入了資料傳送的階段了！
      4. 當節點 A 資料傳送完畢之後， A 會發送一個『終止連線』的訊息，則在得到 B 回應的『確認終止』訊息之後，就結束了該次連線！
    • 上面即是有名的『三向交握, Three-Way Handshack』的工作原理啦！那就是在這一層裡面達成的哩！所以我們可以說，在會談層裡面可以提供穩定的可靠的連線渠道！
    傳送層
    • 我們在底下的網路功能三層協定之中，知道資料傳送是以封包 ( packet )來傳遞的，而打包的工作就是在這一層裡面完成的啦！在這一層裡面，最常見到的協定就是 TCP 封包啦！他可以記錄目標及來源的 port 與 IP ，讓資料封包可以順利的藉由底下的網路層來達到傳送的目的！
    • 所以，在這一層裡面，主要負責的工作就是『由上面來的資料需要打包，由下面來的封包則是拆封』咯！而且他也會依據不同的協定( ftp, http, smtp... )在同一位址上面來進行追蹤與分析呢！
    網路層
    • 在真實的世界裡面，我們在寄出郵件的時候，需要知道的是『我們的門牌及對方的門牌』對吧！？那麼在網路的世界裡，我們的資料封包記錄的來源與目的『位址』 ( 目前最流行的 IPv4 這種 IP 的規定 )，就是在這一層當中定義出來的！
    • 此外，不要忘記了，資料要能夠流通，還得需要藉由『路途』來決定，在網路的世界裡面，就是我們的 route table 囉！這東西很重要！沒有他的話，資料就送不出去囉∼
    資料連接層
    • 我們的資料要透過實體層的網路卡及網路媒體(如網路線)進行傳輸的時候，需要將資料打包(打包成為 packet, 打包的步驟是在傳送層裡面完成的 )，那麼一個封包的大小與格式及所含的內容就在這一層當中規定！
    • 通常一個打包的資料封包是不可以太大的(所以才會有規定呀！)這是因為要避免某部主機一直佔著網路媒體不放的緣故！所以如果你的檔案很大時，那麼該檔案就會被分成很多的打包後的資料封包來傳送呦！
    • 再來，如果發生了同一個傳送時間點上面有兩個或以上的主機同時提出傳送的需求時，那麼該次傳送將會失敗( collision )，此時，該封包再等待下一次傳送的時間間隔也在這一層內規定！
    實體層
    • 前面說過了，真的在進行網路工作的其實是電子訊號及傳遞電子訊號的硬體設備。而包括各個網路媒體之定義啦、還有網路的連接型態啦！都是在這個層級當中規定的！例如我們的 ethernet 網路卡還有 RJ-45 網路線等等！
    • 當然啦，如果你有興趣想要發展網路媒體硬體的話，那麼你的硬體就需要符合這個層級的規定啦！不然做出來的硬體可就無法與其他的規格品溝通囉！
    請特別留意， OSI 僅定義出大略的模式而已，更詳細的定義則需要再參考各項層級當中的規定！！例如網路層在目前最流行的是 IPv4 的協定，但是未來的 IPv6 協定也可以適用呦！
    所以，每次進行網路工作的時候，你的資料就會由上(應用層)而下(實體層)的進行資料的打包、標籤與傳送，而到達目的地的時候，你的資料就會被由下(實體層)而上(應用層)的解開與運用啦！用郵局的郵件傳送來解說一下好了：你要寄信的時候是怎樣寄出去的呢？
    1. 將你所想要寄出的資料進行打包進入資料袋的工作：這裡面包含了你所想要做的工作的判斷，包括是否需要將你的文件資料進行加密呀？等等的（這些包含了應用層、表現層與對談層）；
    2. 接著下來，你必須要在資料袋上面填寫你的地址與對方的地址，並且還要註明收信者呦（這部份就屬於傳送層的階段了）；
    3. 然後你將這封信放入郵筒裡面去，等待郵差車來運載（這部份可以想像成網路層）；
    4. 郵差來收了這封信之後，會先載運到地區的大型郵件集散地，並依據信封上面的地址進行包裹的分類，以進行下一步的傳遞工作；
    5. 然後分類之後的大型貨櫃或包裹，經過空運或海運或者是貨運進行傳輸(有點像在 Internet 上面呦！)，送到對方的大型郵件集散地；
    6. 對方的大型郵件集散地將貨櫃打開之後，依據各包裹的地址進行分類，
    7. 由郵差將分類過後的信件運載到正確的地址去；
    8. 收信人收到該信件之後，打開包裹，得到資料之後，再進行進一步的回應！！
    因此，我們可以這樣看，如果您的網路要能夠運作的話，那麼就需要底下的幾件東西：
    1. 網路線：這可有的選擇的了！不同等級的網路線能夠進行的最大傳輸量與能支援的網路佈線類型並不一樣，所以要仔細的給他選擇一下呦！目前的主流是以 RJ-45 的 Cat5 等級網路線為主體！
    2. 網路卡：網路卡的學問是很大，不過我們這種小站，嗯！普通一點的 10/100 網卡即可啦！
    3. 核心支援的驅動程式：還記得在 核心編譯 裡面提到的吧！對了，除非你的作業系統能夠跟你的硬體溝通，否則永遠都是個『屁！』
    4. 合法的 IP ：對啦！網路世界的『門牌』啦！必須要是『合法的』呦！那麼什麼是『私有的？』後面繼續會提到的啦！
    5. 正確的 route table ：要讓各家『門牌』可以正確的顯示出來，就需要『路徑圖』啦！好讓我們的資料封包可以『按圖索驥』呀！呵呵！這個時候， route table 可是不可或缺的喔！
    好了，底下我們先以一個實際的網路佈線情況來加以說明上面的理論囉！然後在一個一個的拆開來進行說明啦！
    基礎網路佈線模式：
    談完了一些基本的觀念之後，接著下來當然就是實作的部分囉！首先，要讓網路能通，自然就需要將所有的電腦以『網路的連線媒體』連接起來，這裡指的媒體就是『網路線、集線器或交換器( Hub 或 Switch )、網路卡』等等的硬體配備啦！當然啦，由於選擇的媒體不同，佈線情況也會有所差異！這裡 VBird 以目前最常見於一般小型企業或家庭 LAN 裡面的佈線『星形連線』來進行說明。這種架構基本上就是以一個 Hub 或者是 Switch 為中心，進而將所有的電腦連接起來，以提供各個電腦的網路功能！這種架構的最大優點在於除錯較容易！我們底下列出一個很簡單的家庭星形架構的連線：
    基本元件：
    • 工作站與伺服器( workstation, server )：簡單的來說，上面的 Windows PC1, Windows PC2, Linux PC3 這個沒有對外開放網路服務的機器就可以稱為 工作站( workstation ) 啦！而上面的 Linux之Proxy,NAT伺服器由於對外提供網路服務，可以允許用戶端 ( Client ) 連接上來，就稱為 伺服器( Server ) 啦！而 host 指的是一部電腦啦！不論是上面的 workstation 或 server 的哪一部，都是 host 說！
    • 節點：那麼 node 是什麼呢？就是節點啦，在網路媒體上面的每一個 host (主機) 都可以看做一個 node 囉！例如上面的圖示當中， 集線器、 Linux 伺服器、數據機、ISP大型主機.... 都是一個『節點』，因為我們的資料封包都是會經過該裝置才一個一個的傳送出去！
    基本架構說明：
    簡單的說，『網路就是一群通過一定形式連接起來的電腦』！
    • LAN：一個網路可以由兩台電腦組成，也可以擁有在同一大樓裡面的上千台電腦和使用者。我們通常指這樣的網路為區域網路 ( LAN、Local Area Network )，如同上面的圖示，我們可以簡單的認定在數據機以內( 即左邊 )的 PC1, PC2, PC3, Linux 主機等設備即為 我們的 LAN 的部分了。因為我們最常使用的還是LAN，( 即使我們從家中連上 Internet，其實也是先連上 ISP 的 LAN )，所以這裡我們主要討論的還是以LAN為主。
    • WAN：由 LAN 再延伸出去更大的範圍，比如整個城市甚至整個國家，這樣的網路我們稱為廣域網 (WAN、Wide Area Network )，所以，簡單的說，很多的這樣的架構的 LAN 湊在一起，就稱為廣域網路啦！
    • Internet：就如同上面提到的，Internet 是將所有 WAN 與 LAN 連結起來的一個介面而已！由於沒有專人維護，所以說， Internet 是一個最沒有王法的地方了，你可以在 Internet 上面連線到任何地方去或進行任何事情！
    • Intranet：最早出現的名詞是 Internet，然後人們將 Internet 的概念和技巧引入到內部的私人網路，可以是獨立的一個 LAN 也可以是專屬的 WAN ，於是就稱為 Intranet 了。它們之間的最大分別是：開放性。Internet 是開放的，不屬於任何人，只要能連接得到您就屬於其中一員，也就能獲得上面開放的資源。相對而言，Intranet 則是專屬的、非開放的，它往往存在於於私有網路之上，只是其結構和服務方式和設計都參考 Internet 的模式而已。 所以，簡單的說，我們那個小小的 LAN 也可以視作是一個小型的 Intranet 呢！
    • Extranet：Extranet 算得上是針對 Intranet 而延伸出來的概念。既然 Intranet 是指內網路部而言，那麼 Extranet 則指外部的網路了。Extranet 通常是企業和 Internet 連接以向公共提供服務的網路。不過﹐這並非是單純根據物理或邏輯位置來定義，主要是以連接的形式和功能來區分。例如某個外部網路，如果單純的透過網路來連接我們的 Extranet 或 Intranet ，那它只是一個毫不相關的外部個體而已。但是，如果我們用 VPN 或其它信任形式將對方連接起來，那麼對方也可以屬於 Extranet 或 Internet 的部份。
      關於 Internet/Intranet/Extranet 的觀念，我們再引用 ZMAN 兄的話：『舉例來說，假設我的公司有台北台中高雄上海等分公司 ，將這些公司連在一起然後屬於我公司內部使用的網路，就叫 INTRANET ！我的觀念是不一定非用INTERNET(VPN)連用X.25或FRAME RELAY或專線應該都算在內，重點在於屬於我公司內部使用的網路服務的對象是公司內部員工，如果我的上游供應商或下游協力廠商甚至是客戶需要進來我的INTRANET存取資料，連線的方式當然很多(撥接,專線,INTERNET) ，認證及安全性也很重要 ，這樣子的網路我們叫它EXTRANET ，重點在於服務特定外部對象進來INTRANET ，而INTERNET的服務對象就是無限定的，譬如說你無法預估誰會來看你的網站或寄MAIL給你 』
    連線方向：
    那麼現在來想一想，我們是怎樣由內部的 Intranet 連上 Internet 的呢？！如同上面的圖示一般，如果我們目前在 Linux PC3 這部工作站上面，那麼我們的資料怎樣經由網路傳送出去呢？基本上，需要有這些步驟才行：
    1. Linux 核心必須有支援網路卡：
      由於 linux 系統本身就有相當強大的網路支援度，所以我們上面提到的 OSI 模式上面使用者功能的四層在這裡都不成問題！接著下來我們應該要探討的就是『硬體』部分了。還記得我們在 編譯核心 的時候有提到，真正在進行工作的是什麼嗎？！沒錯！就是『硬體』！而要讓硬體正確的工作時，就需要核心的支援啦！因此，在一個打包好的資料封包想要進行網路傳輸時，最重要的工作就是讓你的核心支援網路卡啦！

      如果你的網路卡預設並沒有被核心支援，那麼就必須要編譯網路卡的驅動程式，並且在 /etc/modules.conf 寫入驅動程式的模組，這樣才能在一開機的時候被驅動呢！好了！那麼我們的作業系統怎麼知道網路卡這個硬體呢？嘿嘿！這就需要所謂的 Media Access Control ( MAC ) 這個東西啦！基本上，每一塊網路卡都有獨一無二的自己的網路位址，那個東西跟我們常講的 IP ( 軟體位址 )不一樣呢！那稱為 Hareware Address (硬體位址)，是由 六組16進位的數字組成的！例如我家裡的網路卡位址為：『00:50:FC:22:9C:57』，這個硬體位址是在網路卡出廠的時候就已經被銲死在網路卡上面了！你沒有辦法修改的！這個東西在 Switch 及 DHCP 的時候很有用呢！你可以想像一下，這個東西就有點像是門牌號碼啦！

    2. 網路卡必須具有合法的 IP ( 軟體位址, software address )：
      再來，由於我們目前的網路基礎是由 IP ( Internet Protocol )進行溝通的( 由於這個 IP 是經由作業系統的軟體給的，所以又稱為 軟體位址( software address ) ，跟剛剛上面提到的硬體位址並不相同，請特別留意！)，什麼是 IP 呢？就是由四組 8 bits 的數字組成的，例如 tw.yahoo.com 的 IP 位址為：202.1.237.21，這就是所謂的 IP 啦！那麼還有所謂的保留 IP (或稱為私有 IP ) ，這個是原先在規劃 IP 的規則的時候就先預留的 IP 囉！這些 IP 並不能直接跟外界之 Internet 進行溝通！最常使用的就是 192.168.0.1 ~ 192.168.0.255 這一個 C Class 的網段囉！好了！既然要溝通的話，那麼自然就有所謂的 network 網段內囉（我們常提到的『同一個網段』的概念）！那個 192.168.0 就是 network ，由於是 C class 的關係，( 注意，其 netmask 為 255.255.255.0 )，而起始段為 192.168.0.0 到最末段為 192.168.0.255 ，而這個最後一個末段的 IP 就稱為 broadcast ！這四個東西： IP, network, broadcast, netmask 在規劃一個網路卡的時候是相當重要的參數！千萬不能設定錯誤呢！

    3. 資料封包打包送出( TCP )：
      好了，也有了 合法 IP 位址之後，那麼我們的資料就已經可以定位了，這個時候，當你要將你的資料傳出去的時候，你的資料就需要經過打包，所以我們就會稱為是『資料封包』，那麼這個傳輸你的資料封包的協定我們稱為 Transmission Control Protocol ( TCP ) 囉！這個 TCP 的內容除了你的資料之外，最重要的就是紀錄了這個資料的來源 IP 與埠口 ( source, port ) 還有目的地的 IP 與 埠口 ( destination, port )，這樣我們的資料就可以去尋找 IP 給他丟出去囉！

    4. 經過節點、 Router 或 Gateway 主機：
      好了，由於我們是經由 Hub/Switch 進行連接的，所以我們的資料一定會經過這個節點才會傳送出去！這個時候不禁要想一想， Hub 好還是 Switch 好？這兩者有什麼不同呢？其實最大的不同來自於『共享網路媒體』與『網路媒體對應』的架構上面！這點我們在後面會再提及。

      還有，當我們的 TCP 封包已經打包好了準備送出的時候，網路怎麼知道如何傳送這個資料封包呢？其實，就像我們去到陌生的國家需要有『地圖』才能夠『按圖索驥』一般！在網路的世界裡，必須要藉由 route table (路由表) 來取得 gateway 或 router 的位址，進而將資料傳送到 router 上面去啦，其他的工作就是 router 那邊的事情囉！而 router 接收了封包之後，就會再藉由 router 自己的 route table 來判斷下一個該去的 router 主機∼∼一直重複這個動作，最後就可以到達目的地啦！( 請注意，如果兩部互相傳輸的電腦是在同一個網域之內，由於同一個網域的主機均可以直接透過監聽與溝通的動作來達到資料傳輸的目的，所以主機可以直接與主機相互溝通，而不需要 router 囉！當然你也可以想成你的主機就是你的 router 啦！ ^_^ )

    5. 到達目的地：
      好了，藉由這麼多的節點的傳送，我們的資料封包由於 TCP 裡頭的目的地 IP 的規定，所以找到了正確的主機囉！這個時候這個主機就會將 TCP 封包解開，並且將資料讀取出來！嘿嘿！完成傳送囉！
    所以，基本上我們在傳送一個資料的時候，他的機制是挺複雜的，不過也可以想得很簡單！就是：
    1. 作業系統先依據軟體給的 IP 來將資料打包成為待傳送的封包，例如 TCP 封包，上面並記錄了來源與目的的 IP 與 port；
    2. 根據封包上面的目的地 IP 資料，並經由 本機上面的 route table 來取得下一個 router 的資訊( 若在同一網域內，則 router 可視為本機的網路卡 )，然後將資料送到 router 上面去；
    3. 重複 router 的行為，最後送到目的地端的 PC，而對方主機接收你的 TCP 封包！
    基本上就是這樣，底下我們分別來談一談，那麼上面這些基礎步驟所需要注意的地方為何，其中最重要的就是 IP 的概念！這點請特別留意呢！
    網路媒體的運作方式：
    開始來談一談網路的運作方式吧！底下我們以基本的 Bus (直線型匯流排) 連線模式來進行說明，如下面圖示所示，雖然一般家庭網路最常見的連線模式為星形模式，不過基本原理上面還是與 Bus 佈線模式相同的！而由於 Bus 模式較容易記憶與說明，所以我們底下選用比較好理解的 Bus 來進行說明吧！
    網路媒體：
    先來談一下什麼是『網路媒體』，說穿了，最基礎的網路媒體就是『網路線』囉，因為我們都是透過網路線來進行電子訊號的交流的嘛 ( 再次請您留意，這裡是以網路線為例，當然網路媒體還有相當多的樣式的！)，好了，請注意的是，當所有的電腦要進行資料傳遞的時候，就是需要使用到這個所謂的網路媒體，而由於所有的電腦都連接在這個網路媒體上面，您可以將這個 Bus 的網路線當成是一個『共享媒體』囉！並且，這個共享媒體的傳輸限制為『單一時間點上面，只能有一部機器使用這個共享媒體』。
    什麼是物理廣播(physical broadcast)：
    好了，我們已經知道訊號是藉由網路媒體來進行傳遞的，而這個媒體在單一時間點上面僅能讓一個機器使用！(1)那麼各電腦怎麼知道該時間點上面有沒有其他的機器在使用呢？(2)還有，如果 PC1 與 PC2 要相互溝通的話，他們的訊號是怎樣傳輸的，也就是說， PC1 怎麼知道該訊號是要送到 PC2 呢？(3)此外，如果同一個時間裡面有兩部電腦以上同時使用這個媒體，會產生什麼情況？底下我們就來談一談囉：
    • 由於這個媒體 ( 就是網路線呦！ ) 每個時間點上面僅能讓一部機器使用 ( 這個時間可能是幾千到幾萬分之一秒，很短的啦！)，所以，為了確認當時在這個媒體上面沒有其他的機器在使用，因此 PC1 會先發送一個信號到這個媒體上面去，假設當時 PC2 ~ PC5 都沒有要使用這個媒體，那麼 PC1 在知道沒有人使用之後，就可以來順利的使用網路媒體傳送資料，這就是所謂最底層的『物理廣播』了；
    • 再來，如果 PC1 與 PC 3 同時都想要使用網路媒體呢？呵呵！這個時候，就要看是誰先傳送出廣播信息的，當然是先搶先贏，例如當 PC1 比 PC3 早送出物理廣播信息，那麼 PC3 就會先停頓，等 PC1 該次工作完畢之後，才會發送廣播信息了！這個地方就要再次的強調了！由於先搶先贏，那麼如果 PC1 的封包太大的時候，那其他的 PC 豈不是永遠無法使用網路媒體來傳輸資料囉？因此，才會在 OSI 的資料連接層裡面定義每個封包的大小及格式呀，如此一來，媒體的使用權才會比較平均一些啦！
    • 上面的情況都還可以接受，但是如果萬一真的不幸發生了 PC1 與 PC3 同時進行物理廣播信息呢？那也不用太擔心，因為既然這次發生了同時廣播的狀態，那麼這兩部機器均將不會進行資料傳送，會等待一段時間之後才再次廣播！而在等待的時間上面，是『在一段時間裡面隨機取一個時間點』來再次廣播，由於是隨機取樣的，因此應該不太容易再造成同時進行物理廣播的現象。萬一真的不幸又同時物理廣播，那麼又會等待下一次....依序下去，好像超過 16 次以後，如果還真的很不幸(因為機率真的太低了)再次同時進行物理廣播，那麼就抱歉啦！您的網路媒體將癱瘓掉！不過也別擔心，重新 reset 就好啦！ ^_^""
    • OK！那麼有沒有同時發送封包的狀況？當然有啦！現在你假設 PC1 到 PC5 的距離是很遠(假設 100m 好了)，那麼當 PC1 與 PC5 發送出物理廣播，提醒大家說要傳送資訊的時候，由於 PC1 與 PC5 的距離太遠了，因此回應的時間比較長，那麼這個時候可能就會造成誤判，認為當時媒體上面沒有任何的機器在傳送資料，造成 PC1 與 PC5 同時傳送出資料在媒體上面，這個時候就會發生所謂的『封包碰撞, collision』的情況了！因為網路媒體上面單一時間內僅能允許一個機器使用的嘛！封包碰撞可能會造成資料的損毀現象呢！比較麻煩啦！而為了避免封包碰撞的問題，所以目前網路上面都會使用一種稱為 CSMS/CD ( Carire Sense Multiple-Access / Collision Detect ) 的技術來避免因封包碰撞造成資料損毀的問題！不過，由於選擇的媒體不同，所以還是很有可能會造成碰撞的啦！
    • 好了，那麼假設 PC1 也經過物理廣播了，也順利的將封包丟出來到媒體上面傳送了，那麼他怎麼知道資料要丟到 PC2 上面去呢？這就需要藉由 MAC 與 ARP 等等的咚咚來幫助達成了！ARP 我們等一下再提，而 MAC 剛剛已經提過了，就是網路卡的硬體位址，由於網路卡出廠的時候就有所謂的硬體位址，因此，只要硬體位址與軟體位址能夠相互配合，讓封包可以知道要傳送到哪一個硬體位址上面去，喝！那麼封包就可以成功的送到 PC2 上頭去囉！
    軟體位址到硬體位址
    好了，知道了網路媒體的定義，也知道網路媒體的使用方式了，那麼再來自然就要提到網路世界裡面常常提到的 IP 也就是軟體位址這個玩意兒了！軟體位址是我們使用軟體來給予的一個定位的咚咚，而這個所謂的 IP 是在 OSI 的第三層，也就是網路層裡面的定義。而我們也知道在網路媒體上面資料的傳遞主要還會查看所謂的 MAC 這個硬體位址，好啦！那麼軟體位址跟硬體位址怎麼對應起來呀？！既然實際上是使用 MAC 來接收資料，但是我們又是以 IP 來做為門牌號碼，呵呵，所以就需要一個對應的協定啦，好溝通這兩個玩意兒！那就是 ARP ( Address Resolution Protocol ) 囉！幾乎作業系統裡面都會有個 ARP table ，用以記錄 IP 與 MAC 的對應情況！
    • 在首次進行資料傳輸的時候，由於 ARP table 當中沒有相關的資料，這個時候您的主機就會對『同一網域的全部電腦進行邏輯廣播( logical broadcast )』，(關於什麼是『同一網域』的定義，等一下我們在 IP 基礎內會再次提及) 請注意呦！
      • 剛剛的『物理廣播主要是針對在同一個物理網段內的共享網路媒體之動作』；
      • 而『邏輯廣播主要是針對網路層的軟體位址而言來進行的動作！』
      那麼如果查詢到了主機所需要的軟體位址之後，主機的 ARP 表就會自動的學習起來，將軟體位址( IP ) 與硬體位址( MAC )之對應給他寫入 ARP 當中！
    • 而在後續的資料傳輸的時候，主機就會先去尋找 ARP 表中的資料：
      • 如果 ARP 有紀錄的話，那麼資料就會直接的傳送到該目的地去，而不會進行『邏輯廣播』；
      • 如果 ARP 沒有紀錄的話，那麼主機就又會對全部的同一網域內的電腦進行『邏輯廣播』了！
    • 這裡就有一點很奇怪啦，既然說『物理廣播』是針對 MAC ( 第一、二層 )而『邏輯廣播』是針對軟體位址( 第三層 )，偏偏真正在進行網路工作的是網路媒體還有 MAC 這個咚咚，怪了！那麼當進行邏輯廣播的時候，底下的層級都不需要動嗎？好像跟 OSI 協定裡面不太一樣呦！呵呵！其實是這樣的！當進行邏輯廣播時，主機發送出去的信息中的會含有目的地的 MAC 是 FF:FF:FF:FF:FF:FF ，也就是所有的網路卡都會接受該封包啦！而當其他主機接受該封包之後，會進入第三層去分析軟體位址的要求，如果該要求的軟體位址不是自己的，就會將該封包丟棄，如果是自己的，那麼就會回應該封包，以將自己的 MAC 傳送給原來發送信息的主機啦！
    • 要知道目前的您的主機的 ARP 紀錄，可以使用 arp -a 來查看呦！
    TCP/IP 流程
    基本上，在 OSI 最底下的三層網路功能的傳輸行為，大概都已經定義好了，我們的網路媒體與 MAC 及軟體位址之間都可以正確的去工作！因此倒是不用太去擔心！呵呵！所以我們只要知道其原理就好了。接著下來的 TCP 封包最主要的也只要知道 IP, port, messages( ACK, SYN... ) 這樣即可！這樣一來， TCP 可以整合來自上層的各個協定，而 IP 用來決定路由與傳送的途徑，呵呵！就可以知道能不能到達目的地啦！
    網路媒體的選擇：
    網路線的等級：
    嗯！現在我們知道網路媒體是很重要的！那麼如何來選擇一個好的網路媒體呢？先來看一看最常用的到 RJ-45 網路線好了！目前 RJ-45 網路的線等級，對於一般家庭或小型企業使用者而言，可以到達 CAT5 這個等級就很好了！嗯！？網路線也有等級之分？是呀！剛剛不是說過了嗎？那個網路媒體是很重要的，而由於網路媒體中跑的訊號其實就是電子啦！由於電子訊號在行進的時候會產生一些電磁效應( 這裡指的是 cross talk )，這些 cross talk 就會影響整個傳輸的效能！為了避免 cross talk 的干擾，人們想出了很多的方法來解決他！有所謂的『雙絞線, Twisted Pair』、或提供屏閉『Shielded, STP』等功能，來讓網路線的 cross talk 干擾降低，並提升整體的網路傳輸速度負載量！而依據給予的不同的屏閉等級來將網路線分級！目前最常見的應該就是 CAT5 這一級啦！最大的傳輸量可以到達 100 Mbps 呢！所以，請注意『在選擇網路線的時候，至少您的網路線等級要達到 CAT5 才行！』，否則即使您的網路卡可以到達的傳輸量為 100 Mbps ，但是網路線只有 10 Mbps 時，呵呵！那麼最大的傳輸量將會僅成為 10 Mbps 呦！
    平行線與跳線
    談完了網路線的等級之後，接著下來我們來談一談所謂的『平行線』與『跳線』吧！剛剛提到了，在網路媒體當中跑得是電子訊號，由於電子訊號需要是一個迴路才能通(例如正極接負極)，所以說這些訊號自然就需要成對囉！好了，那麼由於設備的不同，因此網路線的接腳也會跟著不同的！舉個例子來說，在 Hub 與 網路卡 之間的網路線(不談 UpLink 孔時)，使用的是常見的平行線，但是在網路卡與網路卡直接相連時，就需要使用不同接腳的『跳線』啦！由於具有兩種接頭，一般而言，我們將他分成 568A 及 568B 兩種接頭，這兩種接頭的 8 條纜線排列順序為：
    接頭名稱
             1 2 3 4 5 6 7 8
    568A
             白綠 綠 白橙 藍　白藍 橙 白棕 棕
    568B
             白橙 橙 白綠 藍　白藍 綠 白棕 棕

    如果同一種接頭( 不論是 568A 或 568B )接在一條網路線上面，就稱為平行線，而兩種接頭同時接在同一條網路線上面，那就稱為『跳線』啦！

    Hub 與 Switch
    在前面我們提到了網路媒體的型態，使用的是 Bus 的型態，那麼如果是星形模式的話，就需要 Hub 或 Switch （中文稱的集線器與交換器）這種網路媒體了！Hub 還比較好理解，基本上，他僅是將所有的網路線給他連接在一起，並沒有考慮到其他的因素！因此，每部電腦只要連上 Hub 之後，感覺上就好像連上 Bus 一樣啦！那麼『瞎米係』 Switch 呀！？為什麼 Switch 通常比 Hub 要貴上非常的多呢？他們的功能有哪裡不同？我們先不提較高階的不同點，最基礎的不同在於 Switch 多了一個可以記錄 MAC 與 port 的 table 啦！那是什麼呢？這樣說好了，當您的網域之中有一部電腦在進行物理廣播的時候(請注意，物理廣播主要是以 MAC 為傳遞的對象)：
    • 如果使用的連結器是 Hub 的時候，那麼所有連接到這部 Hub 上面的主機都會接到該廣播的封包；
    • 而如果使用的是 Switch 時，由於上面的 table 已經記錄了 MAC 對應 Port 的資料，所以該封包將會『直接』經由該 port 來送出去給目的地主機！
    由於這樣的關係，因此在進行物理廣播的時候，就已經去除了可能產生封包碰撞的狀態了！因此上， Switch 與 Hub 所能承受的流量或許相同，但是 Switch 卻可以達到比較好的傳輸功能，用在大型的網域當中，嘿嘿！當然是 Switch 比較棒啦！這也是為什麼 Switch 會比較貴的原因呀！更簡單的來說， Hub 仍然屬於『共享媒體』的一種，然而 Switch 幾乎可以看做是『非共享媒體』了！更詳細的 Hub 與 Switch 功能的討論可以在 這裡 找到。不過如果是只有小貓兩三隻的我們這種家庭式的內部網路呢？呵呵！簡易型的 Hub 就很夠了啦！不需要買到這個高檔的 Switch 說 ( 純粹個人觀點啦！)。
    傳輸單位
    談個輕鬆一點的！那麼 10/100 Mbps ( Mega- bits per second )是什麼東西呢？怎麼大家都說我的網路卡是 100 Mbps ，但是我只能以最高約 12 MBytes 的速度在 Intranet 當中工作！？嘿嘿！別緊張，那麼 100 Mbps 是 Mbits ！還記得網路的資料量計算嗎？不曉得也沒有關係，可以直接告訴你：
      1byte = 8bits
    瞭解了嗎？沒錯，由於網路的速度在計算的時候主要是依照訊號來設計的，而電子訊號只有 0 跟 1 呀！所以自然就選用最簡單的 bit 來計算了！因此，目前在廣告這些網路的速度的時候，都是以 bits 來計算的，但是我們在硬碟的計算方面則是以 bytes 來計算的，呵呵∼千萬記得，不要被迷惑了呢！因此，那個標榜 512/64 Kbps的網路速度，呵呵，最大的實際 byts 為： 64/8 KBytes 囉！這是理論最大速度啦，所以正常的速度約在 45~50 KBytes 之間囉！瞭解了嗎？！
    網路卡與驅動程式
    結束了網路媒體的選擇之後，接著下來自然就是網路卡的選擇囉！網路卡需要注意什麼事項呢？
    • 驅動程式：
      還記得我們在 編譯核心 的時候有提到，真正在進行工作的是什麼嗎？！沒錯！就是『硬體』！而要讓硬體正確的工作時，就需要核心的支援啦！因此，在一個電腦想要連上網路時，最重要的就是你的網路卡 ( Network Interface Card, NIC ) 是否被正確的啟動了呢？！好了，那麼一個網路卡要被正確的啟動時，需要幹嘛？沒錯！就是需要載入適當的驅動程式囉！目前 Linux 預設的核心當中已經編譯好了相當多的網路卡模組了，你可以到 /lib/modules/`uname -r`/kernel/drivers/net 底下去看一看即可知道有沒有你的網路卡的模組啦！好啦！那麼如果你的網路卡並沒有被正確的啟動呢？！怎麼辦！？沒關係，還可以使用模組掛載呀！可以寫入 /etc/modules.conf 裡頭！這樣一來就可以讓你的網路卡正確的被啟動囉！
    • Media Access Control, MAC：
      前面就提過了，在網路卡出廠的時候，其實就已經銲上了一個獨一無二的 address 了！這個即是所謂的 Hardware Address 囉！而在我們的系統上面， Linux 就由這個 Hardware Address 與下一單元我們要強力介紹的 IP 進行資料的傳遞與轉換，讓整個網路卡硬體可以正確無誤的工作啦！這個硬體位址就是所謂的 Media Access Control ( MAC ) 這個東西啦！他是由 六組16進位的數字組成的！例如我家裡的網路卡位址為：『00:50:FC:22:9C:57』，這就是我的網路卡 Address 囉！千萬不要小看這個東西，他在 Switch 及 DHCP 的時候很有用呢！如果稍具有一點想像力，你可以想像一下，這個東西就有點像是門牌號碼啦！無論如何，在網路卡這一個地方，你需要特別留意這個 MAC 的視察方式，與驅動程式的載入方式！！
    • 網路卡選購要點：
      基本上，網路卡的選購只要『不要太麻煩的晶片組』就可以啦！盡量選擇目前新的 PCI 界面的網路卡，而且強烈的建議使用螃蟹卡即可，但是仍然是有例外的：
      1. 預計大型網站的架設：如果你是想要使用你的 Linux 來幫你架設大型主機的話，例如每天即時上線人數都可達到上百人的大型網站，這個時候就得要好一點的卡啦！因為好的網路卡在資源的分配以及其他的資源配比方面會比較完善，不容易造成網路當機或者是死亡！所以買一塊好一點的 10/100 Mbps 的 3Com or Intel 之類的網路卡，是千萬省不得的！
      1. 一般家用或者是小流量的網站：如果你的野心沒有這麼大，而是希望可以好好的學習 Linux 而已，並且使用的是 512 Kbps 的 ADSL 撥接系統，呵呵！那麼太好的網路卡對你一點幫助也沒有啦！這個時候便宜的 200~300 塊的網路卡( 即是所謂的螃蟹卡 )就可以用得很開心啦！我目前也都是使用螃蟹卡在我的宿網上面呢！
    IP 觀念： IP, network, netmask, broadcast, gateway, ARP協定,
    接著下來要跟大家介紹的是 IP 這個東西，這的東西真是讓人要愛又怕呀！因為沒有了他，所有的網路都是沒有用的咚咚！嗯！通過了網路卡的安裝與驅動程式的載入之後，你的系統已經可以取得 MAC 並且也可以啟動 NIC ( 網路卡 ) 了，好了，那麼接著下來自然就是要讓你的電腦的門牌號碼被 Internet 上面其他的門牌號碼認識囉！這個時候就必須要有所謂的 Internet Protocol, IP 這個咚咚了！這個 IP 是所有網路基礎裡面最基礎的東西，如果沒有了他，那麼網路將不再是網路了！
    • IP 的組成：
      眾所皆知的，IP 是由四組 8 bits 的數字所組成的，最小是 0.0.0.0 ，最大是 255.255.255.255 ，可以這樣來看：
      IP 的表示式：
      00000000.00000000.00000000.00000000 ==>0.0.0.0
      11111111.11111111.11111111.11111111 ==>255.255.255.255

      就是這樣的一個模樣！由於原本是二進位的方式來計算的，為了適應人類的思考方式，所以經過十進位的表示之後，自然就是由 0 ~ 255 囉！好啦！從剛剛前面我們提到的『廣播』的觀念來看，假設您的環境是『網路媒體共享』的環境且整個網域之中都以 IP 直接互相連接的話，那麼在第一次執行『軟體廣播』、或是因為主機找不到 ARP 表對應的 MAC 而執行的『軟體廣播』、抑或者是在『物理廣播』的傳送與監聽接段，哈哈！『ㄟ西郎！』因為每發出一個封包可能需要 255x255x255x255 部電腦同時回應！那麼很可能就會造成嚴重的封包碰撞或者是網路停頓的狀態！因此，設定 IP 的朋友們很聰明的將整個 IP 段分成 Network + Host ( 網域 + 主機 )，在同一個 Network 當中，每一個 Host 都必須是獨一無二的！何解？我們來以一個 C Class 的例子來談一談好了！假設是 192.168.0.0 ~ 192.168.0.255 這個例子來談：
      C Class 的說明：
      192.168.0.00000000
      192.168.0.11111111
      |network-|--host-|

      前面的三組數字稱為 network ，而最後面的一組數字就被稱為是 host 囉！他有什麼特異功能呢？還記得軟體廣播與 ARP 表的說明嗎？對啦！當你的主機發出要求訊息到你的網路媒體上面時，由於是網路層的要求了，因此在訊息當中顯示的目標 MAC 為 FF:FF:FF:FF:FF:FF，所以其他主機會先接收該封包，並且檢驗裡面的 IP 要求，如果不是在同一個網段內的，就會將封包給他丟棄啦！而如果是同一網段內的話，就會給予回應！也就是說『如果在同一個網段之內，所有的 IP 將不需要透過 router 而可以互相直接溝通！』在上面的例子當中，當我們以 192.168.0.0 ~ 192.168.0.255 的 IP 的電腦連在一起時，他們將可以直接進行資料傳送！所以呢，呵呵！當然就是很方便囉！( 請注意，在這個系統當中， network 不可變，而 host 則是不可相同！否則相同的那兩個 IP 將無法無法連線 ) ！那麼目前我們將整個 IP 簡單的方類成為三個網段，分別設定為所謂的 A, B, C class ：
      Network 第一個數字的定義：
      A Class : 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx　==>開頭是 0
                |network|---------host------------|
      B Class : 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx　==>開頭是 10
                |----network-----|------host------|
      C Class : 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx　==>開頭是 110
                |---------network---------|-host--|

      發現了嗎？對啦！ A Class 開頭是0，所以起始的數字就是 0~126, B Class 是 10 開頭，所以就是由 128-191，同理得：
      Network 第一個數字的範圍：
      A Class : 1 ~ 126
      B Class : 128 ~ 191
      C Class : 192 ~ 223

      因此，我們剛剛那個 192.168.0.0 ~ 192.168.0.255 就是 C Class 囉！

    • Netmask ：
      在所有的 IP 訊息當中，最不容易搞懂得就是 netmask 啦！為了不造成大家學習上面的困擾，這裡我們僅提出簡單的『理解想法』來提供 Netmask 的用途，至於更詳細的理論，請務必前往 Study Area 取經呦！
      就如同剛剛我們提到的，既然 A Class 前面一個數字是固定死的，後面三個數字是可變動的，那麼也就可以想成是，前面一個數字已經被用光了 ( 全部為 1 ) ，而後面的數字還保留者 ( 全部為 0 )，所以就有點像這樣：
      Netmask 表示方式：
      A Class : 11111111.00000000.00000000.00000000 ==> 255. 0. 0. 0
      B Class : 11111111.11111111.00000000.00000000 ==> 255.255. 0. 0
      C Class : 11111111.11111111.11111111.00000000 ==> 255.255.255. 0

      好了，所以簡單的來說，當使用 A Class 時，我們怎麼知道他是 A Class 呢？當然要配合 netmask 的說明囉！那麼假設 10.0.0.0 這個網段好了，他就可以想成是：10.0.0.0/255.0.0.0這樣的表示方式，也就是 IP/Netmask 的表示方式！好了，那麼剛剛提到的 C Class 的 192.168.0.0 呢？我們要設定他是 C Class的話，呵呵！那麼自然就是 192.168.0.0/255.255.255.0這樣的表示方式囉！好啦！那麼由於 A Class 是由八個 1 所組成的，而 C Class 的前面 24 的數字也都是 1 ，為了省麻煩，我們還有另一種表示的方法： 192.168.0.0/24 ！嘿嘿！很好記吧！反正前面 24 個數字是固定的嘛！就這樣，所以 A Class 就是 10.0.0.0/8 囉！很容易記憶吧！

    • Network 與 Broadcast ：
      好了，剛剛我們也提到要分辨是否為同一個網段 ( network ) 還需要 netmask 的幫忙，那麼記錄了 netmask 有什麼好處呢？！還記得剛剛我們提過了吧，在『同一個網段當中，各主機將可以直接進行資料溝通』對吧！假設在一個具有『共享媒體』的環境中，當我的電腦有資料要傳送出來的時候，我就會在『同一個網段』的電腦傳送一個訊息，說『喂！我有資料要送出來囉！你們停下來聽一聽，等我送出去之後你們再繼續你們的工作！』呵呵！沒錯，這就是所謂的『硬體廣播』方式傳遞啦！而如果您常常需要使用到『軟體廣播』時，那麼這個 netmask 假如是 255.255.255.0 這個 C Class ，而我們依舊是使用 192.168.0.0 這個東西當作例子的話，那麼不難想像的到，我的封包要傳送出去，就得向 255 個電腦查詢並等待回應，光是這個查詢的時間可能就要造成這兩百多部電腦停頓下來聽你的封包的結果，唉∼速度太慢了吧！！尤其是如果是 B Class 的環境呢？嘿嘿！就有 255*255 部電腦要停頓下來監聽你的需求.... 哇！這樣怎麼可能造成高效率的網路環境呢？！所以囉『網路佈線模式(媒體共享與否)』與『netmask 的設定』就成了重要的課題了！
      這裡請特別留意：
        network 　：同一個網段裡面，HOSTID 都為零的位址；
        broadcast ：同一個網段裡面，HOSTID 都為 1 的位址！
      基本上，如果是便於記憶的話，您可以想像一下， network 就是同一網段的第一個 IP 位址(因為 hostid 都為 0 )， Broadcast 則是最後一個 IP 位址(因為 hostid 都為 1 )。
      那麼為了解決一下『軟體廣播』的範圍，( 由於如果軟體廣播的回應數量變少了，所以網路效能會變的比較好一些！) 我們可以再進行 Subnet 的切割呀！好了，假設我要將剛剛我的 192.168.0.0 在切成兩個子網域呢？可行嗎？當然可行囉！剛剛不是說過嗎？我們的 netmask 可以作為切割網域時候的確認用途，嗯！這個時候如果將已將佔用了 24 個 bits 的 network 在加一個 bit 的話，成為 25 bits ，那麼會變成什麼呢？
      C Class 在細分為兩個子網域的示意法：
      IP　　　:　　　192.　　 168.　　　 0.　0 ( 128 )
      netmask : 11111111.11111111.11111111.10000000 ==> 255.255.255.128
      表示式　: |-------network------------|-host-|

      這樣一來，由於多花費了一個 bit 給 network 了，所以 network 分別是 192.168.0.0 及 192.168.0.128 這兩個
      C Class 在細分為兩個子網域的示意法：
      192.168.0.0 這個子網域的最末一位數範圍：00000000 ~ 01111111
      192.168.0.128 這個子網域的最末一位數範圍：10000000 ~ 11111111

      192.168.0.0 這個子網域的參數：
      network:　192.168.0.0
      broadcast:192.168.0.127
      netmask:　255.255.255.128 (將 100000000 這個二進位轉成 十進位 的結果)
      示意法： 192.168.0.0/255.255.255.128 ==> 192.168.0.0/25

      呵呵！那麼一來，當您的主機要進行『軟體廣播』的時候，接受該訊息的電腦數將可減少一倍！哈哈！這樣子一來區域內的網路流量就更棒囉！OK！這個觀念給他用在實際的社會上，我們的 ISP 不是常常在說『固定制 IP 的給八個固定的 IP 』嗎？呵呵！那個就是在細分成最後面的三個 host 啦！也就是 netmask 是 29 囉

        11111111.11111111.11111000
      因此 host 最大就是 111 最小就是 000 ，轉成十進位就是 8 個啦！( 0 ~ 7 )這樣說不知道您了不了呢？
    • Gateway：
      再來又要頭痛了！那麼什麼是 gateway 呀！？說的簡單一點：在同一個 network 底下，各 IP 可以直接進行溝通，但是在不同的 network 底下，則需要藉由 gateway 來進行資料的傳遞！因此，當您的主機發現該封包的 IP 不在同一個網域內時，就會自動的將封包傳送到 gateway 上面去啦！而由於你的主機與 gateway 是可以直接進行溝通的，所以 gateway 與 你的主機『一定需要在同一個 network 當中』，這個就沒有問題了吧！！
    • 預留 IP ==> 保留 IP 與內部迴圈網路：
      還有一點也是眾所皆知的，就是目前的網路的 IP 網段越來越少了！那怎麼辦？！呵呵！別擔心，當初規劃的時候為了預防這個問題，已經有規劃出幾個網段來作為『內部網路的預留 IP 』之用，那麼這些 IP 網段有哪些呢？依舊分成三個 Class ，分別是：
      • A Class：10.0.0.0 - 10.255.255.255
      • B Class：172.16.0.0 - 172.31.255.255
      • C Class：192.168.0.0 - 192.168.255.255
      由於這三個 Class 的 IP 是預留使用的，所以並不能直接作為 Internet 上面的連接之用，不然的話，到處都有相同的 IP 囉！那怎麼行！網路豈不混亂？所以囉，這三個 IP 網段就只做為內部網域的 IP 溝通之用，也就是說，他有底下的幾個限制：
      • 私有位址的路由資訊不能對外散播 （就是內部網路咯）；
      • 使用私有位址作為來源或目的地址的封包，不能透過 Internet 來轉送 （呵呵！當然囉！不然網路會混亂）；
      • 關於私有位址的參考紀錄(如DNS)，只能限于內部網路使用（一樣的原理啦！）
      這個預留的 IP 有什麼好處呢？呵呵！由於他的私有路由不能對外直接提供資訊，所以呢，你的虛擬網路將不會直接被 Internet 上面的 Cracker 所攻擊！但是，當然囉，你也就無法以保留 IP 來『直接上網』囉！所以相當適合一些尚未具有實體 IP 的企業內部用來規劃其網路之設定之用！否則當你隨便指定一些可能是實體 IP 的位置來設計你的企業內部的網路設定時，萬一哪一天真的連上 Internet 了，那麼啟不是可能會造成跟 Internet 上面的 IP 相同了嗎？！這可不是鬧著玩的，要整個將你原先規劃的 IP 網段整個重新調整過呢！哈哈！累死了！那麼萬一你又要將這些保留 IP 送上 Internet 呢？呵呵！這個簡單，設定一個簡單的防火牆加上 NAT ( Network Address Transfer ) 主機設定，你就可以透過 IP 偽裝(不要急，這個在後面也會提到！)來使你的保留 IP 的電腦也可以連上 Internet 囉(雖然不是真的直接，但是很像『直接上網』呢！)
      好了，那麼除了這個預留的 IP 網段的問題之外，還有沒有什麼其他的怪東西呢？呵呵！當然是有啦！不然我幹嘛花時間來唬 XX 呢！？沒錯，還有一個奇怪的 A Class 的網域，那就是 lo 這個奇怪的網域啦 ( 注意：是小寫的 o 而不是零喔！ )這個 lo 的網路是當初被用來作為測試作業系統內部迴圈所用的一個網域！簡單的說，如果你沒有安裝網路卡在你的機器上面，但是你又希望可以測試一下在你的機器上面設定的資料到底可不可以被執行，這個時候怎麼辦，嘿嘿！就是利用這個所謂的內部迴圈網路啦！這個網段在 127.0.0.0/8 這個 A Class ，但是預設的主機 ( localhost ) 的 IP 是 127.0.0.1 呦！所以囉，當你啟動了你的 WWW 伺服器，然後在你的主機的 X-Window 上面執行 http://localhost 就可以直接看到你的主頁囉！而且不需要安裝網路卡呢！測試很方便吧！此外，你的內部使用的 mail 怎麼運送郵件呢？例如你的主機系統如何 mail 給 root 這個人呢？嘿嘿！也就是使用這一個內部迴圈啦！當要測試你的 TCP/IP 封包與狀態是否正常時，可以使用這個呦！( 所以哪一天有人問你：嘿！你的主機上面沒有網路卡，那麼你可以測試你的 WWW 伺服器設定是否正確嗎？這個時候可得回答：當然可以囉！使用 127.0.0.1 這個 Address 呀！ ^_^... )
    好啦！那麼說來的話，一組成功的網路設定需要哪些資料呢？呵呵！就是：
    1. IP；
    2. network；
    3. netmask；
    4. broadcast；
    5. gateway
    沒錯！就是這些資料！如果是 ADSL 撥接的話，這些資料都是由 ISP 直接給你的，那你大可放心的直接使用，但是如果是固定制（如學術網路）的話，那麼就得使用上面的設定囉！缺一不可呢！以 192.168.0.0 這個 C Class 為例的話，那麼就是：
    1. 192.168.0.1~254；
    2. 192.168.0.0；
    3. 255.255.255.0；
    4. 192.168.0.255；
    5. 自訂(依你的區網設定而異)
    TCP 封包概念： 防火牆, TCP_Wrappers,
    • TCP 封包：
      說完了 IP 之後，自然就不能不提 TCP/IP 這個架構底下的 TCP 封包囉！這個 TCP 是 Transmission Control Protocol 的意思，字面上的意思就是傳輸控制協定啦！嗯！還真是不錯的字眼！這個 TCP 就是實際在『傳送資料封包』的協定啦！剛剛我們有提到了 IP 這個東西嘛！那麼我們怎麼將資料寄到其他的地方去呢？很簡單，就是系統先將我們的資料打包，然後在這個包裹的上面寫上了『來源 IP 與 埠口』及『目的地 IP 與 埠口』，有了這個 IP 門牌，及 埠口 樓層，我們就可以將資料封包正確無誤的寄到目的地啦！所以囉，要有 TCP 自然就必須要有 IP （因為 TCP 上面需要記錄 IP 來源與目的地啊！）而要有 IP 就必須要有網路卡（必須要有這個東西才行嘛！）然後要網路卡正確的工作又需要正確的驅動網路卡！這樣一層一層的下來，嘿嘿！就不難解決我們的網路問題啦！（當然囉， TCP 並不是這麼簡單的東西，不過我們這裡又不是再開班授徒！所以就講得很簡單啦！有興趣的趕緊買本書來看先！）
    • 埠口 ( port )：
      咦！剛剛提到了 TCP 裡面怎麼有個陌生的名詞？『埠口』？呵呵！其實說穿了，也沒有什麼了不起的，你可以想像成 IP 就是某家銀行，而埠口就是銀行裡面的各個窗口啦！所以當 TCP 的封包進入到目的地 IP 主機之後，還要視當初送出這個 TCP 封包的時候，我們需要這個 TCP 封包送到那個埠口去！這是因為每個埠口的功能都不一樣！最常見到的埠口有這些：
        21-20:FTP
        22 :SSH
        23 :Telnet
        25 :SMTP ( e-mail )
        80 :WWW
        110 :POP3 ( e-mail )
      所以啦，當我們將資料丟到目的地主機上面的時候，我們的資料並不是亂丟的啦！而是要丟給實際在負責該封包解析的窗口（埠口）才是呢！那麼這些服務對應的埠口在哪裡可以查到呢？嘿嘿！你的主機裡頭就有檔案可以負責翻譯啦！那就是鼎鼎大名的： /etc/services 這個檔案啦！馬上給他使用 vi 進入看一下（像不像在上課！ ^_^""），當我們啟動一個服務的時候，有可能該服務是直接以 port 來啟動的，也有可能是經由 /etc/services 對應的 port 號與服務名稱來比對的！這個可能依照寫作之作者的不同而異！無論如何，我們要查詢一個服務的基本埠口時，就可以藉由查詢此一檔案來簡單的得知囉！
    • 防火牆概念：
      好啦！那麼提到了 TCP 就不能不稍微聊一聊甚麼是『 Firewall 』呢？簡單的來說，最簡易的 firewall 就是藉由『分析 TCP 封包，並經由一些既定規則，來將不想讓某些 IP 或者是某些埠口的封包踢掉！』舉個例子來說，我們都知道 Telnet 似乎不怎麼安全，而由上面的埠口看到， telnet 是 port （埠口） 23，那麼只要有任何的 TCP 封包帶有 port 23 的要求時，你就將他擋到門外！嘿嘿！這就可以稱作是防火牆啦！這個部分我們會在後頭的 iptables 在詳細的說明一下！
    • TCP_Wrappers:
      除了 TCP 分析的 iptables 軟體之外，我們還可以藉由相當簡單的 TCP_Wrappers 來分析 TCP封包呢！這個功能就更簡單啦！單純的使用 /etc/hosts.allow 及 /etc/hosts.deny 這兩個檔案的設定值來解析 TCP 封包的規則，並將其設定抵擋原則，嘿嘿！馬上就具有最簡易的防火牆機制囉！這部份我們也會在後續繼續提及！
    Gateway 與 Router ：
    Gateway 與 Router 也是節點當中相當重要的一環，他的主要工作是：
    • 將兩個不同的網域 ( network ) 進行轉譯的功能；
    • 製作路由 ( route ) 的功能。
    剛剛在上頭我們知道在同一個 network 當中，資料可以在兩個 IP 之間直接溝通，那麼如果不在同一個 network 呢？舉個例子來說，如果在上面的圖示當中，那個 PC1 的 IP 是 192.168.0.1 而 PC2 的 IP 是 192.168.1.1 的話，而且兩者之間並沒有使用一些通訊協定，單純只以 TCP/IP 來溝通時，由於位在不同的網段，所以正常狀態下『兩者之間是無法直接連線的』，這個時候就必須要透過轉譯器 ( Router ) 的協助啦！這個轉譯器的功能其實不只如此，他還可以轉譯不同的作業系統的通訊協定等等的，不過這裡我們僅簡單的討論一下他的功能之一而已，Router 就是負責溝通兩個或者是多個不同的網段的封包連接啦！所以，如果你的網路切的很細時，由於主機與 router 需要在同一個網域裡面，呵呵，這個時候就得需要很多的 router 來進行不同 network 之間的連接了，否則不同的 network 怎麼連接∼？ Linux 目前也可以用來作為 Router 呦！這個在後續我們提到 Router 的時候再來說明！
    好了，知道不同的 network 之外，來討論一下，什麼是『路由』呢？路由就是『讓你的資料封包可以經由 route table 找到下一個要去的 IP 位址』。簡單的以我們系上的網路架構來進行說明，我的工作機假設 IP 是 140.116.44.125 好了，那麼我的封包如果是要傳送給 140.116.44.202 時，由於我們系上是一個 C Class 的網域，所以 125 <--> 202 可以直接傳遞！但如果我的資料封包是要送到 tw.yahoo.com ( 202.1.237.21 ) 去呢？這個時候我的 125 就會先判斷我的 路由表 ( route table ) 看看預設的網關 ( gateway ) 是哪一部電腦，然後他會將 資料封包傳送到該 gateway 主機上去，而 gateway 主機在經由判斷他自己的路由表，來判斷這個資料封包下一個節點要傳送到哪裡去！？這一傳再傳最後才能到達 tw.yahoo.com 這部機器上！
    因此， route table 是相當重要的，你的 gateway 就相當的重要囉！因為你的所有的非 network 的封包都是經由 gateway 送出去的，萬一你設定 gateway 錯誤時，嘿嘿！那麼自然就無法將你的資料封包 正確的傳導出去囉！這是目前在設定 網路參數 當中最容易被搞錯的地方囉！
    其他討論：何為實體 IP, 保留 IP, 浮動式 IP, 與動態 IP
    • 實體 IP：就如同前面的 IP 觀念裡頭提到的，在網路的世界裡，為了要辨識每一部電腦的位置，因此有了電腦 IP 位址的定義。一個 IP 就好似一個門牌！例如，你要去微軟的網站的話，就要去『 207.46.197.101 』這個 IP 位置！這些可以直接在網際網路上溝通的 IP 就被稱為『實體 IP 』了。
    • 保留 IP：不過，眾所皆知的，IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態，其中， xxx 為 1-255 間的整數，由於近來電腦的成長速度太快，實體的 IP 已經有點不足了，好在早在規劃 IP 時就已經預留了三個網段的 IP 做為內部網域的保留 IP 之用。這三個預留的 IP 的網段分別為：
      • A Class：10.0.0.0 - 10.255.255.255
      • B Class：172.16.0.0 - 172.31.255.255
      • C Class：192.168.0.0 - 192.168.255.255
      不過，由於是內部的保留 IP ，所以當您使用這些地址的時候，當然是有所限制的，限制如下：
      • 私有位址的路由資訊不能對外散播
      • 使用私有位址作為來源或目的地址的封包，不能透過Internet來轉送
      • 關於私有位址的參考紀錄(如DNS)，只能限于內部網路使用
      由以上的限制我們可以知道，保留 IP 僅能使用於內部網路（或者說是區域網路內），而無法直接與外部的 Internet 進行資料的流通。如果需要連上 Internet 時，就必須要使用一部具有 NAT 功能的主機（或者是 IP 分享器）來作為封包溝通的轉換站了。不過，這也給我們架設IP網路造成很大的方便，比如：即使您目前的公司還沒有連上Internet﹐但不保證將來不會啊。如果使用公共IP的話，如果沒經過註冊，等到以後真正要連上網路的時候，就很可能和別人衝突了。也正如前面所分析的，到時候再重新規劃IP的話，將是件非常頭痛的問題。這時候，我們可以先利用私有位址（保留 IP ）來架設網路，等到真要連上intetnet的時候，我們可以使用IP轉換協定，如NAT (Network Addresss Translation)等技術，配合新註冊的IP就可以了（不過這可需要大學問喔）。
    • 固定 IP 、動態 IP 與浮動式 IP：基本上，這兩個東西是由於近來網路公司大量的成長下的產物，例如，你如果向中華電信申請一個商業型態的 ADSL 專線，那他會給你一個固定的實體 IP ，這個實體 IP 就被通稱為『固定 IP 』了，因為你每次藉由這一個 ADSL 上網時，你的 IP 是不變的。而若你是申請計時制的 ADSL ，那由於你的 IP 可能是由數十人輪流使用，因此你每次重新開機上網時，你這部電腦的 IP 都不會是固定的！於是就被稱為『動態 IP』或者是『浮動式IP』。基本上，這兩個都是『實體IP』，只是網路公司用來分配給用戶的方法不同而產生不同的名稱而已！（註：如 Giga 的撥接式固定 IP 並不是固定制的 IP 呦！還是屬於浮動式類型的 IP 啦！只是每次分配的 IP 都是同一個而已！）
    特別感謝：
    本文在發出之後，收到相當多朋友的關心，也發現了自己已經誤會得相當離譜的網路基礎理論，真的感謝好朋友 ZMAN 兄 及 netman 兄的指導！由於對於自己在網路基礎的認知沒有信心，加上小站的目的僅是在於協助朋友們建立一個小型的區域網路，所以上面的文章已經稍微修改過部分的內容，並且取消了部分可能會誤導讀者的內容，特此聲明，感謝大家！ ^_^
    2002/07/18 以來統計人數


區域網路架構簡介
最近更新日期：2002/07/22
如何連線
要安裝哪些通訊協定
確定你的網路參數
Windows 個人電腦的設定： windows 2000, window 98
如何連線
  • 連線方式圖解：
    就如同上一節 網路基礎 當中，我們提到的網路連線方式，目前比較常見的就屬 星形連線 方式了！亦即藉由 Hub 或 Switch 作為所有 PC 連接的通道！但並不是所有的人都有多部電腦，所以也有單部電腦連上 Internet 的連線型態。此外，還包含了 Linux 主機是否具有兩塊網路卡以上的連接方式，這都具有不一樣的連線型態。底下列出三種常見的連線方式，附帶一提，鳥哥個人最喜歡第三種形式！當然，您不見得一定要跟我一樣吧？！ ^_^
    • 直接連上 Internet ，只有 Linux 主機：
    • 以 Hub/Switch 連接，並且 Linux 主機僅有一塊網路卡：
    • 以 Hub/Switch 連接，並且 Linux 主機具有兩塊網路卡：
  • 連線裝置與線材注意事項暨選購注意事項：
    在上面的幾種連線方式當中，應該不難發現，嘿嘿！那個『網路線』與『Hub/Switch』到底要如何選購呢？還有，是否常常會覺得『唉！怎麼按照網頁上面的資料來處理我自己的連線，卻還是沒有辦法搞定』呢？不要太難過了，這是因為鳥哥是苦命人，沒有辦法嘗試每一種連線的裝置，所以僅列出我認為一般人可行的方式，因此可能您的情況這裡就沒有考慮到！此外，也有相當多網友的回報，發現『果然中華電信因為不同批次安裝的數據機模組不同，所以會有不一樣的連接與線材處理方式！』那麼到底要如何確定你自己的網路連線是正確無誤的呢？！嗯！先來談一談你所需要的設備與選購方式吧：
    • 關於網路卡：在每部電腦當中總是需要網路卡的吧( 目前我們這裡均已 ADSL 及 Cable moden 為說明，對於撥接上網的朋友.....那就抱歉了 ^_^ ) ，所以這個時候就得要針對網路卡來要求一下囉！基本上，在 Linux 的主機部分，如果要玩大的，就直接買一塊 10/100 Mbps 的 Intel 或 3Com 的網卡 ( 一塊要上千元 )，如果是一般家用的，那麼就直接買 10/100 Mbps 的螃蟹卡就對了( 一塊 200~500 元不等 )！那麼什麼是螃蟹卡呢？簡單的說，就是在大賣廠裡面擺在最外面的，一塊只要 200 ~ 300 元的網路卡就對了！其實他的晶片組稱為 RealTek 8139 ，因為他的晶片外面的圖形有點像是螃蟹，所以俗稱螃蟹卡囉！那如果是 Windows 的話，那麼可以考慮 D-Link 的 530 這塊卡！請注意：如果要玩 Linux 又想比較順暢的玩弄 Linux 時，請不要堅持使用 Linux 捉不到的網路卡！否則那份失望的心情 ......唉！！
    • 關於 Hub ：就如同 網路基礎 裡面提到的，如果你只是一般的家庭使用，而且你的電腦數量不超過 4 部的話，則 Hub 可以選擇很便宜的五孔的那一種（一個大概只要 500-600 元），但是如果你是一個宿網，而且你們同學之間常常有大流量的文件傳輸（例如由 PC1 傳到 PC2），為了增加傳輸的效率，個人是建議使用可以自動分辨 10/100Mbps 的集線器或者是 switch 來使用，因為他的傳輸速率是一般 10Mbps 的10倍！並且需要考慮到分享的電腦數，來選擇 5, 8 還是 16 孔的呦！( 註：請注意『可以自動分辨』這幾個大字，這是因為有的 Hub/Switch 僅能支援 10 或 100 Mbps，無法自動分辨，則此時會產生很大的困擾，那就是由於網路設備是以『最低流量的那個裝置為準則』，所以若是你的區網中有一台電腦的網路卡是 10 Mbps 的，則當你選擇無法自動分辨的 Hub/Switch 時，那麼所有的電腦將都只能跑 10 Mbps 囉！呵呵！瞭解了嗎？！ )
    • 關於網路線：這個是特別需要注意的地方，由於目前最常使用的網路線接頭為 RJ-45 的網路線，而這種網路線又因為接頭部分有沒有經過跳線處理而分為兩種線材，一種是平行線（就是沒有經過跳線處理的），一種就稱為跳線。上面的圖形中，由 PC1 ~ PC3 連接到 Hub 的網路線都是正常的網路線，亦即是 平行線 ，而由 Linux 主機接到 ADSL 數據機的線段則通常使用跳線！但是卻又不一定！因為在後來感謝網友的回應，發現到有的 Linux 主機到 ADSL 數據機之間使用的竟然是 平行線 ！哇！真是傷腦筋！那麼如何確定你的連線是正確的呢？嗯！有的最簡單的方法，就是：你的 Hub/Switch 上面的每個插孔不是都有燈號嗎？此外，你的 ADSL 數據機當中那個 LAN 的插孔也有燈號對吧！呵呵，那麼『確定連線正確與否的方法，就是確定每個設備在啟動之後 ( 插上電源並且將 PC 開機 ) 每個設備的燈號都是亮的！』如果不亮的話，那麼就肯定有問題，這個時候請換一條網路線，或者是將平行線 <==> 跳線 變換一下試試看，通常就可以正確的讓 Hub/Switch 及 數據機 的燈號亮囉！
  • 內部連線：
    由於各電腦之間是以 Hub 或 switch 作為連線的介面，然後跟 Linux 主機之間連接後，以 NAT 或 Proxy 的方式，透過固定IP的學術網路，或者是自家的 ADSL 數據機來連上 Internet。所以，基本上主機是需要『 兩個網路介面 』 的，而且介面一是與內部網路連線的，這個內部網路通常是使用保留 IP 來進行連線溝通的！我們比較常使用的保留 IP 是在 192.168.0.0 到 192.168.255.255 這一段 ( C Class )，以鳥哥為例，個人是比較喜歡 192.168.1.0∼192.168.1.255 這一段的網路，沒有任何原因，單純是因為喜歡！呵呵！那麼為什麼我說的是『兩個網路介面』而不是『兩張網路卡』呢？原因很簡單，因為網路卡的 IP 可以設定多個！因此，在 Linux 當中一張網路卡可以具有一個以上的 IP 呢！由於一個 IP 即為一個網路介面，因此只要兩個網路介面即可進行 NAT 的設定啦！所以自然一個網路卡即可囉！不過，我個人還是比較喜歡兩張網路卡的啦！
    由於我們在內部網路希望以保留 IP 來設定網路溝通的模式 ( 亦即藉由廣播，不需要 Router 啦 )，所以：
    1. 在 PC1, PC2, PC3 及 Linux 主機的內部介面中，必須使用同一個網段，如此則這四個網路介面就可以直接溝通啦！例如 Linux 內部網路介面的 IP 設定為 192.168.1.2 ，而 PC1 為 192.168.1.11, PC2: 192.168.1.12, PC3: 192.168.1.13 ；
    2. Netmask 均為 255.255.255.0 ( C Class )；
    3. PC1 ~ PC3 的 gateway 均為 192.168.1.2 ，如此則四張網路介面可以直接溝通之外， PC1 ~ PC3 可透過 Linux 來傳送資料封包呢！
    4. 如果未來還需要在增加 PC，那麼其 IP 可以設定在 192.168.1.0 ~ 192.168.1.255 之間即可！
要安裝哪些通訊協定
  • Linux 安裝的通訊協定部分：
    要進行網路的溝通，除了網路卡與硬體之外，再來就是需要網路的通訊協定了！目前最常使用的標準通訊協定為 TCP/IP 這個寶貝蛋！不過，在預設的狀態之中， Linux 本來就已經支援 TCP/IP 囉！所以您不用安裝任何通訊協定！但是，如果你想要使用 Windows 的網路上的芳鄰來做 file server ( 檔案伺服器 ) 的話，那就需要安裝 SAMBA 這個套件囉！阿！這個以後再說∼∼
  • Windows 的通訊協定部分：
    在你的 Windows 系統中，網路就需要有以下的設定才能讓每台電腦看到對方！（注意，以下的說明摘自 Study-Area 的文章）
    • NetBEUI
      讓我們回到 IBM 最初進軍個人電腦網路的時代﹐他們當時的確需要一個很基本的網路通訊協定﹐但他們並不打算用此來建構大型網路﹐僅僅供數十台電腦甚至更小的網路而已。基于這個訴求﹐就誕生了 Network Basic Input/Output System﹐或稱 NetBIOS。 NetBIOS 其實只有18個命令(command)來讓網路的電腦能夠建立?維持?和使用連接服務。不過IBM在不久後又再推出了NetBIOS的延伸版本﹕NetBIOS Extened User Interface﹐或稱 NetBEUI﹐基本上是 NetBIOS 的改良版本而已。然而﹐NetBIOS 和 NetBEUI 終究是不同的﹕NetBEUI 事實上可以說是一個傳輸協定﹐而 NetBIOS 充其量只是一組命令來讓系統可以使用網路而已﹐在技術角度來看﹐它是一個 Application Program Interface (API)。NetBEUI 可以算是您能夠用到的最快通訊協定了。這個“最快”是指它可以將格式化資料放進封包裡面﹐而接收節點又可以迅速的解讀到內容。然而﹐NetBEUI 卻有一個最致命的弱點﹕它不是可路由( routable )協定﹐也就是不能夠和其它網路的機器對講。NetBEUI 在本地網路裡面是非常優秀的協定﹐但如果您想和設在其它網路的機器溝通﹐NetBEUI 就不是您所需要的了。如果您想實現和其它網路的電腦溝通﹐您極有可能必需通過路由設備或路由軟體來實現﹐但無論用哪一樣﹐很遺憾﹐NetBEUI 都做不到。不過﹐Microsoft 網路則運用一種叫 NetBIOS over IP 的技術﹐來連接不同網路的 NetBEUI 客戶。但歸根結底﹐用來達成路由的不是 NetBIOS 而是 TCP/IP。
    • TCP/IP
      美國國防部開發的 Transmission Control Protocol / Internet Protocol (TCP/IP)﹐當初是用來配合 ARPANET ( Advanced Research Projects Agency Net )來處理不同硬體之間的連接問題的﹐比如 Sun系統和 Mainframe、Mainframe 和個人電腦之間的連接。Internet Protocol (IP) 工作於網路層( 以後會繼續和大家探討 OSI 的網路層級 )﹐它提供了一套標準讓不同的網路有規則可循﹐當然﹐前提是您想使用 IP 從一個網路將封包路由到另一個網路。IP 在設計上是用來在 LAN 和 LAN 及 PC 和 PC 之間進行傳輸的。您可以把 IP 看成是游戲規則﹐而 TCP 則用來詮釋這些規則的。雖然TCP/IP原先是專門為幾所大學和機構的使用而設計的﹐但現在 TCP/IP 已經成為最流行的通訊協定了﹐我們使用的 Internet 就是用 TCP/IP 來傳送封包的了。下面就讓我們看看 TCP/IP 是怎樣工作的﹕假如您的公司在好些地方都有分公司﹐各自都有著自己的本地網路(LAN)﹐在總公司跑的是Novell網路﹐但分公司大部份都是用麥金塔電腦。當Mac有數據要傳送給PC的時候將會如何呢﹖
      1. 首先﹐TCP會在這兩個平臺建立起一個可以提供全雙工檢錯(對雙向的數據都進行錯誤檢測)的連接。
      2. 接著﹐IP制定好溝通規則以及Mac和PC之間的連接port。到這裡為止﹐TCP已經準備好數據了﹐如果數據太大﹐IP就將之分拆成幾份較小的封包﹐並且在封包上面加上一個新的header(轉送地址)﹐確保封包會被正確傳送。TCP還會加上標籤說明數據的種類及其長度。
      3. 再下來﹐IP將封包轉換成標準的編碼格式並將之傳送給PC。
      4. 最後﹐在PC上面的TCP將封包解碼並翻譯成PC能夠懂的格式﹐也就是它自己所使用的網路協定。TCP/IP可以說是現行協定中用途最廣的協定之一﹐由于它嘗試在所有硬體上實現所有事情。不過﹐它也是最慢的傳輸協定之一﹐在某些情形之下﹐它的速度只有NetBEUI的七成。
    在沒錯！針對 Windows 的介面當中，只要這兩個咚咚即可啦！安裝完成了上面的通訊協定之後，相信你的區域網路之中，所有的 Windows 個人電腦已經可以看到對方了，只要在開啟資源分享項目，即可達到區域網路的目的。
確定你的網路參數
  • Linux 部分：
    由於我們是以 Linux 作為主機來連線，而 Windows 則是視為 Client 端的機器，這個時候， Windows 可以給幾個保留 IP 來作為溝通之用，但是 Linux 可得好好的設定連上 Internet 的方法囉！
    • 連上 Internet 的方式：
      目前最常見的連上 Internet 的方式主要有：
      1. 固定 IP ：例如學術網路，或者是 ADSL 固定制 IP 的專線，如 T1 之類亦屬於此種方式。但是 Giga 之類的在撥接後，方才給予固定 IP 的方式，並不在此類別呦！這種類別的上網方式，必須要取得 ISP 或者是校方給你的幾個網路參數才能上網： IP, netmask( 子網路遮罩 ), network, broadcast, 及 Gateway 等等！

      2. ADSL 撥接制：亦可稱為浮動式或動態 IP ，由於 Linux 必須要撥接之後才能上網，此外，給的 IP 也是不固定的，這個時候你就必須要取得：連線用帳號、連線密碼、ISP 的 DNS 主機 IP ！此外， Linux 必須要安裝連線程式才行！

      3. Cable Moden 的方式：這種方式連線上網的玩家也越來越多了！但是這是使用 DHCP 協定來上網的，因此得到的 IP 也是屬於浮動式 IP 哩！這個時候僅需要設定好 Linux 網路卡的連線協定即可！相當的簡單！
    • 設定 Linux 主機成為 NAT 主機：
      由於內部網路是由保留 IP 所構成的，如同前面 網路基礎 提到的，保留 IP 並不能與外界的 Internet 溝通，所以你如果要連上 Internet 的話，就必須透過具有實體 IP 的 Linux 主機來連線了！因此，你的 Linux 主機必須有兩張網路介面：
      • 一張以實體IP（可能是實體網路卡, eth0 ，或者是撥接後產生的虛擬介面卡, ppp0，亦即不論是固定的或者是浮動的）與 Internet 連線，
      • 一張則以保留 IP與你的內部網路連線。
      然後將這兩塊在 Linux 主機內的網路卡經由 Linux 內部的 NAT 設定來達成使 區域網路內 PC 連上 Internet 的功能，以分享 Internet 上網的頻寬哩！
    • Linux 主機上的設定：
      如上面所說的，Linux 主機上面有兩塊網路介面，如何設定呢？
      • 與外界溝通的網路卡：這一張網路卡的設定中，如果是固定 IP 的話，則直接輸入 IP 及子遮罩網路，就可以直接連上 Internet 了；而如果是使用撥接（或者是 ADSL 計時制），則必須使用 rp-pppoe 之類的軟體來連上網路！
      • 與內部網路溝通的網路卡：這一張卡的 IP 必須與你的內部網路的所有的電腦之 IP 都在同一網段內，例如 192.168.1.0-192.168.1.255 之內，另外，這一張網路卡的 IP 將是你內部網路的所有電腦的『通訊閘』。
  • Windows 個人電腦上的設定：
    在個人電腦方面，由於我們已經設定了 NAT 主機，這一個主機有一個固定的保留 IP 、子遮罩網路，因此，Windows 系統則直接輸入一個固定的保留 IP 、子遮罩網路，而通訊閘( Gateway )則設定為 NAT 主機的 IP 即可！但請注意，那個 DNS 的 IP 必須輸入你的 ISP 給你的 DNS 之 IP 才行，例如 Hinet 為 168.95.1.1, SeedNet 為 139.175.10.20 等等！關於 Windows 的設定，我們在底下予以先行說明！
Windows 個人電腦的設定
    就如同前面說的，我們需要的網路參數除了 IP, netmask, DNS 之外，還需要『工作群組』與『電腦名稱』等等的設定，當然，不要忘記了，由於我們未來會架設 Samba 這支服務，而這個服務是架構在 NetBIOS (NetBEUI) 協定上的，所以囉，我們除了 TCP/IP 協定之外，還需要 NetBIOS( NetBEUI )這個協定，至於其他的，除非你確定你的網域內還有其他的工作站，否則『請只要安裝這兩個協定就好了！』安裝太多反而會有問題呢！底下我們假設你的網路卡都安裝好了，然後來介紹一下，我們的內部網路的設定：
    1. PC1：OS( Windows 2000 ), IP( 192.168.1.11 ), netmask( 255.255.255.0 ), DNS( 168.95.1.1 ), gateway( 192.168.1.2 ), 工作群組( birdhouse ), 電腦名稱( bird2 )
    2. PC2：OS( Windows 98 ), IP( 192.168.1.12 ), netmask( 255.255.255.0 ), DNS( 168.95.1.1 ), gateway( 192.168.1.2 ), 工作群組( birdhouse ), 電腦名稱( bird1 )
  • Windows 2000 的設定方式：
    1. 開啟網路設定內容，滑鼠移動到『網路上的芳鄰』按下右鍵選擇內容：

    2. 在出現的畫面當中選擇『區域連線』這一項，會出現如下的畫面：

    3. 選擇內容進入設定畫面，在底下的話面當中，勾選『連線後，將圖示顯示在工作列上』以提醒使用者的連線狀態：

    4. 原先的設定僅只有 TCP/IP 這個協定，此外亦會開啟檔案分享，所以上面的框框會出現『File and Printer Sharing for Microsoft Networks』！好了，先來設定 TCP/IP 這一項，所以在上圖中按下 Internet Protocol( TCP/IP )兩下，以設定網路參數。在下面的參數設定當中，輸入我們的重要資訊，就是剛剛提到的那幾個重要網路參數！然後按下『確定』即可！

    5. 按下確定之後，會回到步驟三的畫面，這個時候因為要安裝通訊協定，所以請按下『安裝』那個按鈕，在底下會出現這樣的畫面：

    6. 在上面的步驟當中，我們要安裝通訊協定，所以請按下『通訊協定』吧！並選擇『NetBEUI Protocol 』這個協定！按下『確定』即可！

    7. 最後會得到這樣的畫面才可以！

    8. 將上頭的資料關閉之後，到桌面上，在『我的電腦』，按下右鍵，選擇內容，並勾選『網路識別』那一個頁面，會出現如下的畫面：

    9. 這個時候，請選擇『內容』這一項！不要選擇『網路識別』呦！然後將你的電腦名稱改為我們剛剛設定的『bird1』，並且修改一下你的工作群組成為『 birdhouse 』（大小寫不要緊！）：

    10. 按下『確定』之後，選擇『重新開機』來使設定成功吧！
  • Windows 98 的設定方式：
    1. 首先，同樣的，請在你的『網路上的芳鄰』上面，按下『右鍵』選擇『內容』，會出現如下的畫面：

    2. 在預設的情況之中，大概或者會有兩三個協定吧！無論如何，這裡假設僅有『一個實體網路卡』就是上面那個 D-Link 的圖示，還有一個通訊協定，也就是 TCP/IP 的協定！好了，我們現在來安裝一下 NetBEUI 吧！此外，如果有出現一個 IPX/SPX 的協定時，請自行將他移除吧！在上面的圖示當中按下『新增』項目：

    3. 選擇『通訊協定』喔！並且挑選『 Microsoft 』及『 NetBEUI 』這兩個，並按下『確定』即可！

    4. 好了，回到『步驟一』那個畫面中，按下『檔案及列印分享』項目，在底下的畫面中，兩個全部都給他勾選啦！

    5. 再來，回到原始的畫面中，就會有如下的情況啦！如果你有『撥號配接卡』時，又你不要使用撥接，那麼就將『撥號配接卡』拿掉吧！所以最後就只有上面這些咚咚囉！

    6. 開始來設定我們的網路元件了，請按下上圖的『 TCP/IP 』出現如下的畫面，將我們的 IP 及子遮罩網路給他填進去！

    7. 再來繼續設定通訊閘( Gateway )：

    8. 再來則是設定『DNS組態』一項！如果不確定的話，可以直接以我的設定來設定呢！

    9. 好了，這樣 TCP/IP 設定就完成了，接著下來，請選擇原先畫面中的『識別資料』頁面，然後將我們的資訊填進去吧！

    10. 過程之中可能會要你的 Windows 98 原版光碟，請自行安裝，然後重新開機，嘿嘿！成功！
2002/07/21 以來統計人數


連上 Internet
最近更新日期：2002/08/17
Linux 網路相關設定檔案：
安裝網路卡：
固定 IP 上網方式：註：非撥接上網之方式
Cable Moden 上網方式：
ADSL 上網方式：
設定內部保留 IP 與 DNS IP： /etc/hosts, /etc/resolv.conf,
無法連線的自我檢查幾大問題詳解：
Linux 網路相關設定檔案
玩起 Linux 的網路，最麻煩的地方就是不太曉得那個設定放在哪裡了！其實所有的 Linux 套件在網路的設定參數檔案，放置的地點幾乎都是相同的！底下來說一說這幾個檔案：
  • /etc/sysconfig/network：
    這個檔案主要的功能在於『設定預設的 GATEWAY，主機名稱( HOSTNAME )的修改，啟動 Network 與否』請注意，通常那個 gateway 不要設定呦！
  • /etc/sysconfig/network-scrips/ifcfg-ethn：
    這個檔案的內容即是設定網路卡的參數檔案啦！裡面可以設定『 network, IP, netmask, broadcast, gateway, 開機時的 IP 取得協定之方式( DHCP, static ), 是否在開機的時候啟動』等等，那個 n 是數字啦！如果是第一塊網路卡，則檔案名稱為 ifcfg-eth0 ，第二塊網路卡為 ifcfg-eth1 以此類推。
  • /etc/modules.conf：
    這個檔案只在找不到網路卡的晶片組的時候才會動用到！亦即是開機時，系統一些核心模組的載入檔案囉！
  • /etc/resolv.conf：
    這個是設定 DNS ( 名稱解析伺服器 ) 的檔案，常常有人提到『咦！我已經可以 ping 到外部電腦的實體 IP 了，為何輸入網址卻無法連線？』通常發生的錯誤就是這個檔案啦！請注意！通常這個檔案可以輸入中華電信的 DNS ( 168.95.1.1 )！
  • /etc/hosts：
    裡面可以寫入你的所有的內部保留的 IP 啦！例如我們在 網路基礎 裡面提到的 192.168.1.11, 192.168.1.12 等等的幾個同網段的 IP，此外，亦可將你常常連上 Internet 的實體 IP 配合該 IP 的主機名稱給他寫入這個檔案當中！請注意，如果你的內部網路想要加快速度的話，那麼這個檔案是不可缺少的設定的地方呢！內部 IP 一定要給他寫入呦！
大概就是這幾個檔案啦！只要知道這些檔案的放置地點，那麼差不多網路設定的方針就沒有問題囉！
安裝網路卡：
安裝網路卡最重要的地方就是需要『網路卡驅動模組』囉！亦即這個網路卡的驅動模組需要核心有支援才行，如果萬一不幸核心沒有支援的話，那麼就需要 (1)重新編譯核心或者是 (2)編譯網路卡驅動模組，好讓核心可以支援網路卡這塊硬體啦！如果要鳥哥來建議的話，那麼如果您是新手的話，建議直接換一塊螃蟹卡吧！免得花了太多時間在硬體確認上面，划不來的！ ^_^ 如果您是照鳥哥推薦的，使用 RLT 8139 晶片 ( RealTek 8139 ) 的網路卡，那您應該在安裝 Linux 的時候就已經捉到網路卡了，那真是恭喜您啦！因為您的網路卡應該已經可以正常的工作囉！那如果在安裝的時候並沒有捉到網路卡呢？該如何是好？那也不用擔心，因為您也可以事後才安裝網路卡的驅動程式呀！不過，因為 Linux 並不像 Windows 是那樣的隨插即用，所以需要動一些手術的！
如果很不幸的，您使用的是比較罕見的一些晶片組網路卡，或者是 Linux 核心支援度不太夠的網卡，以致於在安裝 Linux 時，並無法捉到這張卡，那也不用擔心，在這裡，鳥哥提供一個簡易的網路卡驅動程式安裝方式，其他的驅動程式安裝法大致上是大同小異的！步驟其實也很簡單，當然，如果你的網路卡已經被捉到了，那麼請直接跳過驅動程式的安裝這部分：( 註：我們這裡以 D-Link 530 這一塊網路卡作為說明！ )
  • 驅動程式的安裝：
    1. 檢查核心是否有支援：
      基本上，我們的預設核心裡面，已經幫我們建立了很多的網路卡驅動程式模組了！所以囉！首要的工作就是先確認一下你的網路卡的晶片組是否有被支援呢？如果有支援的話『那麼自然不需要編譯模組了咯』！嗯！那麼 D-Link 530 這塊網路卡的晶片組就是有名的 via-rhine ( 有的時候也寫成是 viarhine )，所以來找一找網路卡的模組，核心預設的網路卡模組路徑在底下可以發現：
      [root@test /root]# uname -r　　　　　　<==看看你的核心版本
      2.4.7-10 　　　　　　　　　　　　　　　<==這是 Red Hat 7.2 的預設核心版本

      [root@test /root]# cd /lib/modules/`uname -r`/kernel/drivers/net　　<==這是 kernel 2.4.xx 版本的路徑
      [root@test /root]# cd /lib/modules/`uname -r`/net　　　　　　　　　 <==這是 kernel 2.2.xx 版本的路徑
      請特別留意，上面兩行跟你的系統有關！請選擇一個來執行即可！

      [root@test net]# ls -l via*
      -rw-r--r-- 1 root root 17892 Sep 7 2001 via-rhine.o <==太好了！有支援，跳到第四步驟

    2. 下載網路卡驅動程式模組：
      萬一不幸的，你的網路卡的驅動模組恰好不在上頭，例如買到了雜牌的卡或是特別想要的卡（例如 D-Link 530 TX），那你就必須要注意這些卡的包裝上面是否有提及『支援 Linux 』字樣！如果有支援的話就可以買了，因為一定會有驅動程式附在上面的磁片中的，以鳥哥的 FNW-9702-T 為例，他就有附上一塊驅動程式片，裡頭有一個 linux 目錄，裡面就是安裝驅動程式的原始碼啦！如果找不到驅動程式的話，你可以到下面的網站去找找看有沒有你需要的驅動程式原始檔案，當然囉！最好還是到你買的那張網路卡的公司去下載完整的驅動程式碼！例如上面提到的 D-Link 530TX的驅動程式原始碼，在底下的 友訊 網站就有提供下載！
      Linux Network Drivers
      友訊網路卡驅動程式下載網頁

    3. 編譯下載之網路卡模組：
      在編譯之前，有幾件事你一定要確認一下，否則一定無法編譯成功的！

      • 是否安裝 kernel-source 與 kernel-header 這個 RPM ：
        [root @test /root]# rpm -qa | grep kernel
        kernel-headers-2.4.7-10
        kernel-2.4.7-10
        kernel-source-2.4.7-10
        在 Red Hat 7.2 當中，正常的情況下必須要有這三個 RPM 套件，才能順利的安裝你的網路卡驅動程式呢！另外，可以到 /usr/src 底下看看有沒有 linux-2.4.7-10 這個目錄，請注意，由於很多時候網路卡的驅動程式都是捉這裡面的資料！( 註：如果是以我網頁上的方法自行編譯核心的話，那麼就沒有問題，如果是自行編譯的話，可能會有問題，這個時候請到 /usr/src 底下執行 ln -s linux linux-`uname -r` )

      • 是否已經安裝 gcc 套件：
        基本上，只要是依照我網頁上的方式( 建議二 )來安裝你的 Red Hat Linux 的話，那麼應該已經選擇了編譯程式套件了！如果沒有的話，那麼肯定就是忘記將 make, gcc 等套件安裝到你的系統當中了！這個時候請拿出你的原版光碟，將這些套件安裝進去吧！

      在這裡，我們以友訊提供的 D-Link 530TX 這個驅動程式的編譯來說明之：
      1. 將由網路上下載的 dlkfet-4.16.tar.gz 放置到 /tmp 底下，假設該檔案在軟碟內了！
      [root @test /root]# cd /tmp
      [root @test /tmp]# mount -t vfat /dev/fd0 /mnt/floppy
      [root @test /tmp]# cp /mnt/floppy/dlkfet-4.16.tar.gz .
      [root @test /tmp]# umount /dev/fd0

      2. 開始解壓縮及編譯！
      [root @test /tmp]# tar -zxvf dlkfet-4.16.tar.gz
      [root @test /tmp]# cd dlkfet-4.16
      [root @test /dlkfet-4.16]# make clean　　　　　<==清除舊的編譯檔案
      [root @test /dlkfet-4.16]# make
      到此為止，會產生一個檔案模組，稱為： rhinefet.o
      [root @test /dlkfet-4.16]# cp rhinefet.0 /lib/modules/`uname -r`/kernel/drivers/net
      特別留意，上面的路徑為 2.4.xx 版本的核心！如果你是 2.2.xx 請依照上一步驟提到的路徑

      (當然，如果你是使用別的原始碼，則你的檔名會成為==>filename.o)

    4. 載入模組與預設開機載入：/etc/modules.conf
      假設你的網路卡是第一塊，所以你的網路卡代號應該就是 eth0 囉！(請依序類推)，然後你的驅動程式給他寫入驅動程式檔案 /etc/modules.conf：
      1. 設定開機時載入模組：
      [root @test /root]# vi /etc/modules.conf
      alias eth0 via-rhine 　　　<==如果是核心預設的 via-rhine 這個模組，則寫入這一行
      alias eth0 rhinefet　　　　<==如果是剛剛編譯成功的，就寫入這一行
      請注意，上面的設定當中， via-rhine 或 rhinefet 不需要寫入 .o 呦！ 只要寫前面的檔名即可！ 而且，請依照你的模組來寫入，並不是直接寫上上面那兩行！特別留意！

    5. 啟動驅動程式模組：
      啟動的方式很簡單，可以直接 reboot 試試看，也可以直接使用 modprobe 來啟動！
      1. 手動啟動：
      [root @test /root]# modprobe via-rhine 　<==請依照你的網路卡，僅寫入一行即可
      [root @test /root]# modprobe rhinefet　　<==請依照你的網路卡，僅寫入一行即可！

      2. 重新開機：
      [root @test /root]# reboot

      通常建議直接給他 reboot 順便測試一下是否可以正常的執行啦！

    6. 確認啟動與否：
      直接以 lsmod 看看啟動了沒？當然要有剛剛載入的模組出現才算成功！
      [root @test /root]# lsmod
      Module Size Used by Tainted: P
      via-rhine 14208 2
      ....(略)....
  • 測試網路卡工作與否：
    要測試網路卡有沒有正確的工作，就給予網路卡一個保留 IP 來測試看看，我們以 192.168.1.2 這個保留 IP (亦可稱為私有 IP 或是常聽到的虛擬 IP 啦！），加上 255.255.255.0 這個 C Class 的 netmask 來測試看看，此外，以 eth0 為預設的 Gatewaydev ( 通訊閘裝置 )，好啦！試試看先：
    1. 設定 /etc/sysconfig/network 檔案：
      這個檔案可以設定主機名稱與預設的通訊閘道：
      [root @test /root]# vi /etc/sysconfig/network
      NETWORKING=yes　　　　　　　　　<==是否啟動網路，當然是啦！
      HOSTNAME=test.domain.name　　　 <==主機名稱，要確定呦！可以隨時修改啦！
      GATEWAY=　　　　　　　　　　　　<==可以設定 IP ，但是我們不要設定 IP 啦！
      GATEWAYDEV=eth0　　　　　　　　 <==設定通訊閘裝置！使用 eth0 呢！

    2. 設定網路卡 /etc/sysconfig/network-scripts/ifcfg-eth0 檔案：
      這個檔案的設定也可以設定的很簡單的啦！馬上設定看看：
      [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0　　　　　　　　<==設定裝置的名稱，這個要跟檔案名稱對應！
      ONBOOT=yes　　　　　　　　 <==是否在開機的的時候啟動網路卡，如果不要的話，可以寫 no
      BOOTPROTO=static　　　　　 <==啟動的時候的 IP 取得的協定，如果是 Cable 的話，要改成 dhcp
      IPADDR=192.168.1.2　　　　 <==這個就是 IP 囉！
      NETMASK=255.255.255.0　　　<==這個就是子遮罩網路囉！
      NETWORK=192.168.1.0　　　　<==這個就是網段囉！
      BROADCAST=192.168.1.255　　<==這個就是最後一個同網段的廣播位址囉！
      GATEWAY=192.168.1.2　　　　<==這個就是這塊網路卡的通訊閘囉！『也可以不用寫入！』
      同樣的，要之道上面的參數代表的意義，請參考 網路基礎 裡面提到的各項資料！

    3. 啟動與關閉網路卡：
      啟動與關閉網路卡的方式其實是使用 ifconfig 啦！但是有更簡單的指令，也就是 ifup 跟 ifdown
      [root @test /root]# /etc/rc.d/init.d/network restart <==重新啟動網路介面
      [root @test /root]# ifup 　eth0　　<==啟動 eth0 網路卡
      [root @test /root]# ifdown eth0　　<==關閉 eth0 網路卡
      ifup 是啟動而 ifdown 是關閉的意思！後面接的是網路卡啦！

    4. 檢查是否啟動了：
      檢查網路卡是否啟動了！就使用 ifconfig 即可：
      [root @test /root]# ifconfig
      eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:5692910 errors:0 dropped:0 overruns:0 frame:0
      TX packets:5914804 errors:0 dropped:0 overruns:0 carrier:0
      collisions:848 txqueuelen:100
      RX bytes:522002571 (497.8 Mb) TX bytes:2498073183 (2382.3 Mb)
      Interrupt:10 Base address:0x6100

      lo Link encap:Local Loopback
      inet addr:127.0.0.1 Mask:255.0.0.0
      UP LOOPBACK RUNNING MTU:16436 Metric:1
      RX packets:3252 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3252 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:169559 (165.5 Kb) TX bytes:169559 (165.5 Kb)

      [root @test /root]# ping -c 3 192.168.1.2
      PING 192.168.1.2 (192.168.1.2) from 192.168.1.2 : 56(84) bytes of data.
      64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=318 usec
      64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=213 usec
      64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=217 usec

      --- 192.168.1.2 ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/mdev = 0.213/0.249/0.318/0.050 ms

      看到了吧！正常的情況之下，一定會有 lo 這個介面，而剛剛我們設定好的網路卡也已經被驅動囉！哈哈！很高興吧！
固定 IP 上網方式： 非撥接上網之方式
固定 IP 來上網的情況有兩種：
  • 一種是類似學術網路或者是固定制的 ADSL 這些情況，你有『實體 IP』，並且也取得了『實體 IP 的 GATEWAY』了！而你的其他的所有的網路參數也都取得的情況！
  • 另一種則是保留 IP 的情況，例如在 區域網路架構 那篇文章的 圖三 當中，我們的 PC3 是 Linux ，而這個 Linux 的 IP 就是 保留 IP ，並且透過 Linux server 的 NAT 作為 GATEWAY 的情況！( 不知道 NAT 嗎？！沒關係，以後就知道啦！ )
這樣清楚了嗎？反正就是要上網的時候，需要取得網路的所有參數就對了！底下我們來介紹一下使用固定保留 IP ，並且透過 NAT 主機的虛擬 IP 介面連上 Internet 的情況：
  • 網路參數的取得：
    在確定所有的網路參數之前，請先確定 網路卡 沒有問題之後，再來則是網路連線的問題了！請先確認你的 網路硬體連線 沒有問題。這裡先說說如果以固定制( 或者是校園網路系統 )的情況之下，你已經知道了你的 IP 與 gateway 的 address 的話，該如何設定以登上網路呢？『請特別注意，這是給已經知道你的 IP 與 Gateway 的情況下使用的方法，若是使用 ADSL 撥接系統上網的話，這個方法並不適用！』，也就是說，如果你的網路連線是類似 GIGA 之類的撥接後才給予一個固定 IP 的話，那麼就不能使用這個方法！我們假設我們的網路參數為底下的模樣：
    • IP 為： 192.168.1.13
    • Netmask 為： 255.255.255.0
    • Network 為： 192.168.1.0
    • Broadcast 為： 192.168.1.255
    • Gateway 為： 192.168.1.2
    • 主機名稱為： redhat73.vbird.net
    • DNS 設定為： 168.95.1.1
    而連上 Internet 的方法只有幾個步驟：
    (1)設定主機名稱與預設通訊閘；
    (2)設定網路參數( IP, netmask, broadcast, Network 等等 )；
    (3)設定 DNS 伺服器的 IP ( 你的 ISP 給的 )；
    (4)重新啟動網路設備。
    這樣就夠了！來試看看吧！
    1. /etc/sysconfig/network ( 設定主機名稱與 default gateway )
      [root @test /root]# vi /etc/sysconfig/network
      NETWORKING=yes
      HOSTNAME=redhat73.vbird.net
      GATEWAY=192.168.1.2

    2. /etc/sysconfig/network-scripts/ifcfg-eth0 ( 設定網路卡參數 )
      [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      ONBOOT=yes
      BOOTPROTO=static
      IPADDR=192.168.1.13
      NETMASK=255.255.255.0
      NETWORK=192.168.1.0
      BROADCAST=192.168.1.255
      # 請注意， GATEWAY 在 network 檔案內設定了！這裡不需要再設定

    3. /etc/resolv.conf ( 設定 DNS 主機的 IP )
      [root @test /root]# vi /etc/resolv.conf
      search vbird.net
      nameserver 168.95.1.1
      nameserver 139.175.10.20
      我們以中華電信與 SeedNet 在南部的 DNS 主機之 IP 作為設定的方式！而至於那個 search 的用途在於『 domain 』的搜尋啦！設不設沒有很大的關係！

    4. 重新啟動網路設定：
      [root @test /root]# /etc/rc.d/init.d/network restart
      [root @test /root]# ifdown eth0
      [root @test /root]# ifup eth0
    到這一步驟就算 OK 囉！很簡單吧！！ ^_^
Cable Moden 上網方式
使用 Cable 魔電( Moden )來上網是最簡單的事了！因為他是透過所謂的 DHCP 主機來直接分配動態 IP 的，所以，我們幾乎所有的網路參數都不需要設定呢！只要設定啟動網路卡時候，選擇的啟動協定為 dhcp 就可以了！不過，如果主機端沒有給我們 DNS 的 IP 與主機名稱的時候，還是需要設定的啦！ ^_^
  1. /etc/sysconfig/network ( 設定主機名稱與 default gateway )
    [root @test /root]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=redhat73.vbird.net
    GATEWAY=　　　　　　　　　　<==請千萬不要設定！切記切記！

  2. /etc/sysconfig/network-scripts/ifcfg-eth0 ( 設定網路卡參數 )
    [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp　　<==這一行設定正確即可！下面的四個網路參數沒有用！
    IPADDR=192.168.1.13
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255

  3. /etc/resolv.conf ( 設定 DNS 主機的 IP )
    [root @test /root]# vi /etc/resolv.conf
    search vbird.net
    nameserver 168.95.1.1
    nameserver 139.175.10.20
    這個設定有時候會被主動的改變，這是因為來自於 dhcp 主機的設定所致！所以，如果被改變時，請不要訝異！

  4. 重新啟動網路設定：
    [root @test /root]# /etc/rc.d/init.d/network restart
    [root @test /root]# ifdown eth0
    [root @test /root]# ifup eth0
ADSL 上網方式：
好了，終於提到最熱門的 ADSL 撥接制的上網方式囉！嗯！來談一談怎麼上網吧！在 Linux 系統中，要以 ADSL 連上 Internet 是一件很簡單的事情，使用 rp-pppoe 軟體就可以進行撥接了！安裝也很方便喔！請先確認你的網路硬體連線沒有問題，請到 前面 看看去。再來要注意的是，我們提過在 Linux 的安裝方式主要有 RPM 與 Tarball 兩種方式，而雖然 Red Hat 7.2 與 7.3 均已經有安裝了 rp-pppoe 的套件，卻偏偏沒有設定程式 ( adsl-setup ) ，很奇怪，所以我們必須先將他移除之後，再安裝其他版本的 rp-pppoe 了！目前鳥哥已經成功的在 Red Hat 7.2 上面安裝 rp-pppoe-2.6-5.src.rpm 這個版本的 rp-pppoe 囉！然而由於很多時候 RPM 有相依屬性的問題，因此我們也嘗試以 Tarball 來安裝一下 rp-pppoe 吧！( 註：如果依舊無法以 RPM 安裝 rp-pppoe 時，請直接以 Tarball 來安裝吧！ )
設定與安裝的步驟簡單說明如下( 請注意：我是在 Red Hat 7.2 底下做的，如果是不同的版本，可能會有差異性！ )：
  1. 重新設定網路參數檔案；
  2. 查看是否安裝了 rp-pppoe，移除 rp-pppoe；
  3. 安裝 rp-pppoe ：
    • 用 rpm 安裝；
    • 用 Tarball 安裝；
  4. 設定 rp-pppoe ：
  5. 連線囉！
好了！開始一步一步來進行安裝與設定及連線的步驟吧！
  1. 重新設定網路參數檔案：
    由於我們是使用撥接的方式來連上 Internet 的，所以我們原先在 /etc/sysconfig/network 裡面設定的『 default gateway 』就必須將他拿掉才行！否則會造成無法連接出去的情況( 這個情況我們會在 Linux Router 的設定當中說明 )，至於 /etc/sysconfig/network-scripts/ifcfg-eth0 的影響就不很大了！
    1. 取消預設通訊閘
    [root @test /root]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=redhat73.vbird.net
    GATEWAY=　　　　　　　　　　<==請千萬不要設定！切記切記！
    GATEWAYDEV=　　　　　　　　 <==這個也不要設定，或者設定為 ppp0 ！

    2. 簡化網路參數
    [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes　　　　<==若您需要 eth0 幫您建立內部私有網域時，這裡可以寫成 yes
                        但若不需要內部網路時，這一行請直接寫成 no ，反正撥接
                        之後網路卡會自動被啟動！
    BOOTPROTO=static　<==底下的五行其實都用不到！隨便寫也沒有關係！
    IPADDR=192.168.1.13
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255

    3. 重新啟動網路：
    [root @test /root]# /etc/rc.d/init.d/network restart

  2. 查看是否已經安裝了原本 Red Hat 7.2 附的 rp-pppoe：
    由於原本 Red Hat 7.2 的 rp-pppoe 有點問題( 沒有 adsl-setup )，所以我們就直接將他移除吧！
    1. 看是否有安裝：
    [root @test /root]# rpm -qa | grep rp-pppoe
    rp-pppoe-3.2-3　　　　　　　　　<==看來是已經安裝了！只好移除囉！

    2. 就將他移除囉！
    [root @test /root]# rpm -e rp-pppoe

  3. 安裝 rp-pppoe ：
    安裝 rp-pppoe 的方式有兩種，可以使用 rpm 與 tarball 的方式來分別安裝，不過，只要選擇一種來安裝就可以啦！

    • RPM 安裝 rp-pppoe：
      如果你是由本網頁下載 rp-pppoe 程式的話，由於這個檔案是 SRPM 檔案，所以需要先經過編譯才行。然而必須特別留意，我們提供的檔案基本上已經算是比較舊的檔案了，請您到 中山大學FTP站 去尋找看看有沒有更新的版本吧！詳細的編譯及安裝步驟如下表所示：( 請注意，編譯的過程也需要 gcc 之類的 compiler ，如果沒有在 Install 的時候選擇時，在編譯個過程中可能會有出現錯誤，請自行由 Red Hat 光碟安裝吧！ )

      1. 下載 rp-pppoe ：
        如果你的主機尚未開放任何的服務時，你可以使用軟碟來下載 rp-pppoe ，因為 rp-pppoe 的檔案很小啦！還不到 200 KB 呢！所以軟碟就可以囉！如何使用軟碟呢？
        • 先使用軟碟將下載下來的 rp-pppoe copy 到軟碟上；
        • 將軟碟放置於 Linux 主機的軟碟槽中；
        • 在 Linux 底下使用 df 這個指令，看看有沒有類似底下的這一行：
          /dev/fd0　　　　　1423　　　0　　1423　0%　/mnt/floppy
          如果有的話，請使用『 umount /mnt/floppy 』，如果無，則跳到下一步；
        • 使用『 ls -l /mnt 』看看有沒有 floppy 這個目錄：
          如果有則下一步，若無則『 mkdir /mnt/floppy 』；
        • 使用『 mount -t vfat /dev/fd0 /mnt/floppy 』將軟碟掛上去！
        • 使用『 cp /mnt/floppy/rp* /root 』將檔案 copy 到 /root 這個目錄下；
        • 使用『 cd /root 』將目錄轉到 root 底下。

      2. 編譯及安裝 rp-pppoe ：
        1. 編譯 SRPM：
        [root @test /root]# rpm --rebuild rp-pppoe-2.6-5.src.rpm
        .........
        Wrote: /usr/src/redhat/RPMS/i386/rp-pppoe-2.6-5.i386.rpm
        .........
        在編譯時，最後的結果(如果沒有錯誤)會顯示上面那個樣子！
        也就是說，你的編譯完成的檔案就放在上面囉！

        2. 安裝 rp-pppoe :
        [root @test /root]# cd /usr/src/redhat/RPMS/i386
        [root @test i386]# rpm -ivh rp-pppoe-2.6-5.i386.rpm
        Preparing... ########################################### [100%]
        1:rp-pppoe ########################################### [100%]
        [root @test i386]# rpm -q rp-pppoe
        rp-pppoe-2.6-5
        這樣就安裝完畢了！簡單吧！如果不相信，可以查詢看看！

        安裝完畢之後，會在 /usr/sbin 當中多了 adsl-start, adsl-stop, adsl-setup, adsl-status 等檔案，至於設定檔則在 /etc/ppp 當中！如果你要詳細的看每一個指令的用法，可以使用 man adsl-setup ....等指令名稱來觀察！我們這裡僅提供設定的方法及執行的方法！

    • Tarball 安裝 rp-pppoe ：
      嗯！由於 RPM 可能會有相依屬性的問題！因此，如果你的系統上面無法安裝 rp-pppoe 的話，那麼就直接以 Tarball 的方式來安裝 rp-pppoe 吧！目前 (2002/07/24) 最新的 rp-pppoe 套件為 rp-pppoe-3.5.tar.gz 這個檔案：
      1. 解壓縮！
      [root @test /root]# mv rp-pppoe-3.5.tar.gz /usr/local/src
      [root @test /root]# cd /usr/local/src
      [root @test src]# tar -zxvf rp-pppoe-3.5.tar.gz

      2. 偵測系統與編譯執行檔：
      [root @test src]# cd rp-pppoe-3.5/src
      [root @test src]# ./configure --prefix=/usr/local
      [root @test src]# make; make install

      安裝方面很簡易吧！這樣就妥當囉！準備來給他設定一下吧！

  4. 設定 rp-pppoe ：
    rp-pppoe 的設定非常簡單，只要透過 /usr/sbin/adsl-setup ( 若為 Tarball 安裝的話，那麼就在 /usr/local/sbin /adsl-setup 囉 ) 這個程式來設定就 OK 了！另外有一點蠻重要的，如果你是以第一塊網路卡連線的話，請先將 eth0 斷線，若是以第二塊網路卡的話，就先將 eth1 斷線！方法如下：
    1. 先將 eth0 或 eth1 斷線：
    [root @test /root]# ifdown eth0 　　<==看你的 ADSL 接的那個網路卡代號而定！

    2. 設定 adsl 的參數：
    [root @test /root]# /usr/sbin/adsl-setup
    >>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca): T0123456
    這個時候請輸入你在 ADSL 的帳號，不同的 ISP 有不同的設定方式呦！請特別注意！
    a. 如果是 seednet 的話，應該有點像這樣==> T0123456
    b. 如果是 Hinet 的話，應該有點像這樣====> yourname@hinet.com.tw(連同 host 也要寫)

    >>> Enter the Ethernet interface connected to the ADSL modem
    For Solaris, this is likely to be something like /dev/hme0.
    For Linux, it will be ethn, where 'n' is a number.
    (default eth0): eth0
    因為我們使用 eth0 連線的呀！

    >>> Enter the demand value (default no):
    這裡按 enter 不用設定就好了！

    >>> Enter the DNS information here: 168.95.1.1
    >>> Enter the secondary DNS server address here: 139.175.10.20
    這裡要你輸入慣用的 DNS 主機：
    若使用 hinet 的話，可以打入 168.95.1.1
    若使用 seednet 的時候，可以打入 139.175.10.20
    若在台南地區的話，可以使用成大的 DNS => 163.28.112.1

    >>> Please enter your PPPoE password:
    >>> Please re-enter your PPPoE password:
    這裡就輸入你的 ADSL 密碼啦，要輸入兩次喔！

    The firewall choices are:
    0 - NONE: This script will not set any firewall rules. You are responsible
    for ensuring the security of your machine. You are STRONGLY
    recommended to use some kind of firewall rules.
    1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
    2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
    for a LAN
    >>> Choose a type of firewall (0-2): 0
    這裡要你選擇防火牆的形式，通常我是不設火牆的，
    所以直接選 0 就對了！ 注意：選了防火牆有的時候反而會造成無法連線成功！

    Start this connection at boot time
    Do you want to start this connection at boot time?
    Please enter no or yes.
    yes
    如果想要一開機就自動啟動 ADSL 連線的話，這裡可以填入 yes啦！

    Ethernet Interface: eth0
    User name: T0123456
    Activate-on-demand: No
    Primary DNS: 139.175.10.20
    Secondary DNS: 163.28.112.1
    Firewalling: NONE

    >>> Accept these settings and adjust configuration files (y/n)? y
    接下來將你的設定作一個整合結果輸出，如果沒有問題的話，
    輸入 y 之後就完成設定啦！
    基本上，設定完成之後以下的檔案會被自動改變，
    有影響的是 resolv.conf 這個檔案，你可以手動改變這個檔案喔！

    Adjusting /etc/ppp/pppoe.conf
    Adjusting /etc/resolv.conf
    (But first backing it up to /etc/resolv.conf-bak)
    Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
    (But first backing it up to /etc/ppp/pap-secrets-bak)
    (But first backing it up to /etc/ppp/chap-secrets-bak)

    哈哈！這樣設定就成功啦！很簡單吧！為一需要注意的是在上面的 username 那個地方，千萬注意，因為 hinet 與 seednet 的設定是不一樣的！千萬小心呢！否則會無法連上線呦！此外，由於我們在未來還會有 firewall 的建置，所以這裡不太需要使用到防火牆啦！就先關閉他吧 ( 選 0 ) ！否則也可能無法連上 Internet 呦！

  5. 連上 Internet 啦！
    連上 Internet 之前，請先確認 eth0 或 eth1（用來連接線到 Modem 的那一張網路卡）已經斷線了，可以使用 /sbin/ifconfig 來確認，然後直接輸入
    [root @test /root]# adsl-start
    ....Connect!
    這樣就是顯示連上 Internet 啦！通常比較容易出問題的地方在於硬體的連線情況，請先確認所有的硬體連線沒有問題喔！通常，如果你使用小烏龜（ATU-R）時，請使用跳線連接網路卡與ATU-R。另外一個容易出錯的地方在於輸入的帳號與密碼，帳號與密碼都是你的 ISP 給你的，並且注意大小寫。

  6. 查看你的 IP 啦！
    那如何知道你的 IP 呢？呵呵！就使用 ifconfig 呀！
    [root @test /root]# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:80:C8:5A:87:01
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:8381302 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532065 errors:0 dropped:0 overruns:0 carrier:0
    collisions:317 txqueuelen:100
    Interrupt:9 Base address:0x6200

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:3924 Metric:1
    RX packets:567 errors:0 dropped:0 overruns:0 frame:0
    TX packets:567 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0

    ppp0 Link encap:Point-to-Point Protocol
    inet addr:211.74.249.38 P-t-P:172.16.11.8 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
    RX packets:8356088 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532063 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:10

    在上表中顯示，ppp0（就是 ADSL 的 ISP 給你的真實 IP）的網址是 211.74.249.38，而 eth0 由於是使用來作為 pppoe 的介面，所以就沒有網址啦。

  7. 自動偵測 ppp0 的撥接狀態：
    這部分我們將在『動態 IP 偵測技巧』裡面在好好的談一談，而如果你害怕斷線的話，可以在 /etc/crontab 裡面先加入這一行：
    [root @test /root]# vi /etc/crontab
    .......
    01-59/3 * * * * root /usr/sbin/adsl-start > /dev/null 2>&1
    在上面的式子當中，如果你看不懂的話，那就表示『你需要再將 BASH Shell 學一學了』！ ^_^
設定內部保留 IP 與 DNS IP： /etc/hosts, /etc/resolv.conf,
  • /etc/hosts
還有幾個檔案對於內部真的是挺重要的，首先就是 /etc/hosts 這個檔案啦！請注意！由於電腦與電腦在交互溝通的時候，都會『想要確認對方的身份』，因此會利用 /etc/hosts 與 /etc/resolv.conf 這兩個檔案去『查詢對方的 domain name 』，亦即是對方的身份啦！這個時候，如果你的電腦在連上對方的電腦時，對方無法查詢到你的身份，那就有可能會發生『等待逾時』的情況！最常見的發生狀況就在於『使用你的區域網路內的私有 IP ( 或者被稱為虛擬 IP )連上具有實體 IP 的 NAT 主機』時，最容易發生這個問題了！你應該會覺得奇怪，『咦！不都是我的區域網路的電腦嗎( 指 NAT 主機跟你的 PC1 ) 怎麼 pop3 跟 FTP 連線這麼慢？！還要等個 60 秒！』嘿嘿！沒錯！這個時候就是你的 NAT 主機在追查你的 PC1 的身份啦！
那麼通常 Linux 主機是如何查詢對方的身份的呢？在預設的情況中( 因為這個順序可以改變，所以才會說是『預設情況』，這個順序我們會在 DNS 的架設當中再提及！ )首先，就會去檢查 /etc/hosts 這個檔案的設定，所以他是第一優先，再來則是 /etc/resolv.conf 的 DNS 主機啦！而，由於你的 PC1 是以『私有 IP 』進行架設的( 就是 192.168.xx.xx 那個 IP 啦 )，然而你並沒有將你的 私有 IP 寫入 /etc/hosts 當中，這個時候你的 Linux 主機就會到 /etc/resolv.conf 裡面設定的 DNS IP 去查詢你的 PC1 的身份，偏偏你的 PC1 根本就沒有在網際網路上( 因為私有路由不可直接與 Internet 連接 )，哈哈！那麼當然 Linux 就會找不到，也就會 delay 了幾乎 60 秒鐘了！
瞭解了嗎？所以說，你就要將你的 私有 IP 的電腦與電腦名稱寫入你的 /etc/hosts 當中了！好了！那麼這個咚咚的內容如何呢？我們來看一看原本的 Red Hat 7.2 的設定吧！
[root @test /root]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1　　　localhost.localdomain　　　localhost
電腦 IP　　　　主機名稱　　　　　　　　　主機別名( alias )

在上面的情況中很容易就發現了設定的方法了吧！很簡單吧！沒錯！那就是 IP 對應主機名稱啦！那麼現在知道為什麼我們給他 ping localhost 的時候，位址會寫出 127.0.0.1 了吧！那就是寫在這個檔案中的啦！而且那一行不能拿掉呦！否則系統會掛掉的！好了！那麼將我區域網路內的所有的電腦 IP 都給他寫進去！並且，每一部給他取一個你喜歡的名字，即使與 PC1 的電腦名稱設定不同也沒關係啦！以我為例，如果我還額外加設了 DHCP 的時候，那麼我就乾脆將所有的 C Class 的所有網段 ( 什麼是 C Class ？如果看不懂我在寫什麼，請千萬回到 網路基礎 去看一看內容呦！很重要的！ )全部給他寫入 /etc/hosts 當中，有點像底下這樣：
[root @test /root]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1　　　localhost.localdomain　　　localhost
192.168.1.1　　linux001
192.168.1.2　　linux002
192.168.1.3　　linux003
.........
.........
192.168.1.255　linux255

如此一來，不論我哪一部電腦連上來，不論是在同一個網段的哪一個 IP ，我都可以很快速的追查到！嘿嘿！那麼區內網路互連的時候，就不會多等個好幾時秒鐘囉！

  • /etc/resolv.conf
很多朋友常問的一個問題『咦！我可以撥接上網了，也可以 ping 到奇摩雅虎的 IP ，但為何就是無法直接以網址連上 Internet 呢！』嘿！被氣死！前面不是一直強調那個 DNS 解析的問題嗎？對啦！就是名稱解析不對啦！趕快改一下 /etc/resolv.conf 這個檔案吧！改成上層 ISP 給你的 DNS 主機的 IP 就可以啦！例如 Hinet 的 168.95.1.1 及 Seednet 的 139.175.10.20 囉！
無法連線的自我檢查幾大問題詳解
  • DNS 設定錯誤：
    最容易造成無法以網址連線的情況就是 DNS 主機的 IP 設定錯誤了！大家都習慣將 /etc/resolv.conf 設定成自己 NAT 的主機 IP！這是『錯誤的情況』！請注意！將『區域網路內的每一部電腦，不只是 NAT 主機，全部的( 不論是 Linux 還是 Windows ) DNS 主機 IP 都寫成合法的 IP！例如使用 Hinet 的 168.95.1.1 ！』
  • GATEWAY 設定錯誤：
    常常有朋友來信在問到：『為何我的 adsl-start 撥接上了，但是就是無法連接出去 Internet 呢？』有的朋友則是問：『為何我連出去 Internet 的時候，都是以虛擬 IP 那個介面( eth0 )在連線，而不會以實體 IP ( ppp0 那個介面 )來連線？』這個都是同樣的問題，就是系統無法建立實際的 gateway 來溝通你與 Internet 的連線！因為封包送錯了方向啦！舉個最簡單的例子，我們都知道虛擬 IP 與實體 IP 不能直接相互溝通，所以我們需要在主機上面設定兩個 IP （通常是以兩塊網路卡搞定！），一個是實體 IP 另一個則是虛擬 IP ，然而在設定的初期，很多人都會使用一個預設的 gateway ( 在 /etc/sysconfig/network )，這個gateway 是在告訴系統：『嘿！你只能由這裡出去！』的意思，因此，所有的封包將會直接給他送到這個 gateway 來！不過，抱歉的是，由於你在後來新增了一個 ppp0 （撥接之後產生的）界面，這個界面所使用的是實體 IP ，而該 IP 是寫在 rp-pppoe 的界面裡頭的，他可以自行提供合理的 gateway 。然而偏偏你已經設定了一個 default gateway 了，因此不論 pppoe 如何振作，嘿嘿！都沒有辦法改變的啦！因此，這個時候就必須要來改一下你的 default gateway 了！
    1. 修改 /etc/sysconfig/network 這個檔案，將裡頭的：
      GATEWAY=xxxx.xxxx.xxx
      GATEWAYDEV=eth0
      裡面的 xxxx.xxx.xxx.x 都刪掉，然後，那個如果對外卡是eth0，則設定為 eth0 ，否則亦可設定為 ppp0 （撥接！）當然，最好是可以不要設定啦，所以變成了：
      GATEWAY=
      GATEWAYDEV=
    2. 這樣就可以啦！如果沒有辦法立刻達成，可以下達：
      /etc/rc.d/init.d/network restart
    基本上，與網路有關的檔案主要有：
    /etc/modules.conf （設定網路卡晶片組）
    /etc/hosts （設定可以直接溝通的 IP 電腦！設定之後，網內連接虛擬與實體 IP 會比較快！）
    /etc/resolv.conf （設定讀取 dns 的主機 IP ）
    /etc/sysconfig/network （設定 GATEWAY, GATEWAYDEV, HOSTNAME 等的地方）
    /etc/sysconfig/network-scripts （設定網路卡界面參數，例如 IP 的地方！）
2002/07/24 以來統計人數


Linux 常用網路指令介紹
最近更新日期：2002/07/31
一些網路偵錯指令： ping, ifconfig, ifup, ifdown, netstat, route, traceroute, host, nslookup,
遠端連線使用指令： telnet, ftp, ncftp,
文字界面網頁瀏覽： lynx, wget,
修改主機名稱： /etc/sysconfig/network,
一些網路偵錯指令： ping, ifconfig, ifup, ifdown, netstat, route, traceroute, host, nslookup,
在網路的世界中，最常聽到的一句話就是：『高手求救！我的 Linux 不能上網路！』我的天吶！不能上網路的原因多的很！而要完全搞懂也不是一件簡單的事情呢！而很多的網路偵測指令其實在 Linux 裡頭已經都預設存在了，只要你好好的學一學基本的偵測指令，那麼一些朋友在告訴你如何偵錯的時候，你應該就立刻可以知道如何來搞定他囉！好了，底下我們就簡單的來談一談幾個很基本的網路常用的偵錯指令啦！要好好學習呦！
ping ：送一個 ICMP 的封包給某部主機
ifconfig ：設定網路參數使用的指令
ifup,ifdown：啟動與關閉某個網路介面卡
netstat ：查閱網路資訊的指令
route ：顯示/修改路由表( route table )
traceroute ：調查連接到某部主機時，每個節點的連線速度
host ：顯示主機名稱( domain name )
nslookup ：調查主機名稱對應的 IP ！
底下分別來談一談先！
  • ping
    傳送一個 ICMP 封包給某部主機
    語法：
    [test @test test]# ping [-b broadcast]
    [test @test test]# ping [-c number] host
    參數說明：
    -b broadcast ：當要 ping 一個區間時，可以使用這個方式來『廣播』！
    -c number ：預設 ping 沒有停止時，會 ping 到死！這個時候加上 -c 是不錯的方式！
    範例：
    [test @test test]# ping -c 5 tw.yahoo.com <==除了 IP 也可以 ping domain name！
    PING tw.yahoo.com (202.1.237.21) from 61.28.113.1 : 56(84) bytes of data.
    64 bytes from tw.yahoo.com (202.1.237.21): icmp_seq=0 ttl=245 time=7.133 msec
    64 bytes from tw.yahoo.com (202.1.237.21): icmp_seq=1 ttl=245 time=7.497 msec
    64 bytes from tw.yahoo.com (202.1.237.21): icmp_seq=2 ttl=245 time=6.625 msec
    64 bytes from tw.yahoo.com (202.1.237.21): icmp_seq=3 ttl=245 time=6.457 msec
    64 bytes from tw.yahoo.com (202.1.237.21): icmp_seq=4 ttl=245 time=6.434 msec

    --- tw.yahoo.com ping statistics ---
    5 packets transmitted, 5 packets received, 0% packet loss
    round-trip min/avg/max/mdev = 6.434/6.829/7.497/0.421 ms

    [test @test test]# ping -b 192.168.1.255 -c 2 <==這裡必須是廣播位址
    WARNING: pinging broadcast address
    PING 192.168.1.255 (192.168.1.255) from 192.168.1.254 : 56(84) bytes of data.
    64 bytes from 192.168.1.36: icmp_seq=0 ttl=255 time=191 usec
    64 bytes from 192.168.1.45: icmp_seq=0 ttl=255 time=492 usec (DUP!)
    64 bytes from 192.168.1.254: icmp_seq=0 ttl=255 time=531 usec (DUP!)

    --- 140.116.44.255 ping statistics ---
    2 packets transmitted, 2 packets received, +6 duplicates, 0% packet loss
    round-trip min/avg/max/mdev = 0.134/0.811/2.094/0.647 ms

    說明：
    這個東西好用的很！不論在哪一個作業系統當中，他都是相當有用的網路偵錯指令！例如你要偵測一下你的網路卡是否正確的備執行了，可以使用『 ping your.NIC.IP.address 』來查閱！當然囉！加上次數更好：『 ping -c 5 your.NIC.IP.address 』！無論如何，這個指令一定要記得的啦！
    • icmp：指的是 ICMP 這個協定囉！
    • ttl：指的是 time to live 啦！當經過一個節點， ttl 就會減少一！而預設有 255 個！以上面為例，我的 Linux 主機連接到 tw.yahoo.com 共經過 10 個 gateway ，所以 ttl 剩下 245 ！
  • ifconfig
    設定網路參數使用的指令
    語法：
    [root @test test]# ifconfig interface
    [root @test test]# ifconfig interface [options]
    參數說明：
    interface ：網路介面卡代號，例如 eth0, eth1...
    options ：主要有以下幾個參數
          network ：網段
          broadcast ：廣播網段
          netmask ：子網路遮罩
          up|down ：啟動|關閉網路介面
    範例：
    [root @test /root]# ifconfig <==沒有加上網路卡時，會將所有的網路介面內容顯示出來
    eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:5793395 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6032143 errors:0 dropped:0 overruns:0 carrier:0
    collisions:983 txqueuelen:100
    RX bytes:534796148 (510.0 Mb) TX bytes:2607882970 (2487.0 Mb)
    Interrupt:10 Base address:0x6100

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:3258 errors:0 dropped:0 overruns:0 frame:0
    TX packets:3258 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:170063 (166.0 Kb) TX bytes:170063 (166.0 Kb)

    [root @test /root]# ifconfig eth0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255
    上面再將 eth0 這個網路介面的 IP 屬性修改為 192.168.0.2 這個 IP ，廣播位址也跟著改變了！
    [root @test /root]# ifconfig eth0 <==將修改完的咚咚顯示出來一下！
    eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
    inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:5793395 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6032143 errors:0 dropped:0 overruns:0 carrier:0
    collisions:983 txqueuelen:100
    RX bytes:534796148 (510.0 Mb) TX bytes:2607882970 (2487.0 Mb)
    Interrupt:10 Base address:0x6100
    [root @test /root]# ifconfig eth0 down <==關閉 eth0 網路卡
    [root @test /root]# ifconfig eth0 up <==啟動 eth0 網路卡！

    說明：
    ifconfig 這個東西也很好玩！尤其是你在你的網路卡尚未設定完成的時候，而且確定網路卡已經成功的驅動上來時，可以使用這個 ifconfig 來驅動你的網路卡呦！另外，他的最大用處其實是來自於可以查看你的網路介面卡的參數啦！所以最常使用的就是直接輸入『 ifconfig 』或者是『 ifconfig eth0 』或者是『 ifconfig ppp0 』等等的用法！倒是不建議直接用來修改你的網路卡啦！不過，如果確定要使用 ifconfig 來修改你的網路介面卡，那麼可以參考上面的例子來修改呦！同時， ifconfig 也是用來做成『多 IP 』的主要指令呢！好了，我們來談一談上面幾個簡單的項目內容吧！
    • eth0 ：表示為網路卡的代號；
    • lo ：表示為『內部迴圈 IP 』的網路卡代號，請注意，這個虛擬的 interface 一定要存在！千萬不要關掉他！
    • HWaddr ：是網路卡的硬體位址，就是我們 前面 提到的 MAC 啦！
    • inet addr ：就是網路卡的 IP；
    • Bcast ：是廣播( broadcast ) 的位址；
    • Mask ：就是子網路遮罩啦；
    • MTU ：是 Maximum Trasmission Unit 最大傳輸單元(位元組)，即此介面一次所能傳輸的最大封包，也可以參考底下的 MTU 說明。
    • RX ：網路由啟動到目前為止的接收情形；
    • TX ：網路由啟動到目前為止的傳送情形；
    • collisions ：網路訊號碰撞的情況說明；
    • txqueuelen ：是傳輸緩衝區長度大小意思；
    • Interrupt ：是 IRQ 中斷位址；
    • Base address ：是 I/O 位址。這個 IRQ 與 I/O 在網路卡上面是可以設定的！設定的地方可以在 /etc/lilo.conf 裡頭來設定呢！如果你的主機上面有多張網路卡的時候，就用的著他了！可以避開問題呦！
    總而言之， ifconfig 也是一個很好用的指令啦！但是有一點必須要清楚的，那就是 ifconfig eth0 up 或者是 ifconfig eth0 down 可以使用 ifup eth0 或 ifdown eth0 來替代！不過有一點必須要先說明的，那就是 ifup 與 ifdown 是以 /etc/sysconfig/network-scripts/ifcfg-ethn 的檔案來進行啟動的！所以 ifcfg-eth0 必須存在才能使用 ifup ！OK！底下馬上來說說 ifup, ifdown。
  • ifup, ifdown
    啟動與關閉某個網路介面卡
    語法：
    [root @test /root]# ifup [interface]
    [root @test /root]# ifdown [interface]
    參數說明：
    範例：
    [root @test /root]# ifup eth0 <==啟動 eth0 這塊網路卡！
    [root @test /root]# ifdown eth0 <==關閉 eth0 這塊網路卡
    說明：
    這兩個指令要比 ifconfig 簡單的多！不過他卻必須要有相關的檔案存在才能啟動呦！舉個例子來說，上面我們要啟動 eth0 這塊網路卡的時候，那麼你的 Linux 系統當中就必須要存在 /etc/sysconfig/network-scripts/ifcfg-eth0 這個網路介面卡的設定檔案才行！同理可證！如果要啟動 eth1 ，除了存在 eth1 這個實體網路卡之外，還要存在 ifcfg-eth1 才行！請確實瞭解呦！因為後面我們提到的一張網卡多 IP 就是用這個觀念來達成的！
  • netstat
    查閱網路資訊的指令
    語法：
    [root @test /root]# netstat [-r] [-i interface]
    [root @test /root]# netstat [-antulp]
    參數說明：
    -r ：顯示出 route 的意思；
    -i ：顯示出 interface 的內容，跟 ifconfig 類似啦！
    -a ：顯示出目前所有的網路連線狀態！
    -n ：預設情況中，顯示出的 host 會以 host name 來顯現，若為 n 則可以使 port 與 host 都以數字顯示
    -t ：僅顯示 tcp 封包的連線行為
    -u ：僅顯示 udp 的封包連線狀態
    -l ：僅顯示 LISTEN 的內容
    -p ：同時顯示此一連線的 PID 喔！(注意：只有 root 才能行使此功能！)
    範例：
    [root @test /root]# netstat -r <==嘿嘿！顯示出目前的路由表！這部分底下的 route 指令會說明！
    Kernel IP routing table
    Destination Gateway Genmask Flags MSS Window irtt Iface
    140.116.141.253 * 255.255.255.255 UH 40 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 40 0 0 eth0
    192.168.0.0 * 255.255.255.0 U 40 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 40 0 0 lo
    default 140.116.141.253 0.0.0.0 UG 40 0 0 ppp0

    [root @test /root]# netstat -i eth0 <==看看底下顯示出的內容，是否跟 ifconfig eth0 類似呀！？
    Kernel Interface table
    Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
    eth0 1500 077199373 0 0 169616342 0 0 0 BMRU
    lo 16436 0 1130485 0 0 0 1130485 0 0 0 LRU

    [root @test /root]# netstat -an <==顯示所有的連線狀態，並且以數字型態顯示
    [root @test /root]# netstat -tul <==顯示 LISTEN 的及 tcp 與 udp 的連線狀態，如下：
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:mysql *:* LISTEN
    tcp 0 0 *:netbios-ssn *:* LISTEN
    tcp 0 0 *:pop3 *:* LISTEN
    tcp 0 0 *:http *:* LISTEN
    tcp 0 0 *:ftp *:* LISTEN
    tcp 0 0 *:ssh *:* LISTEN
    tcp 0 0 *:smtp *:* LISTEN
    udp 0 0 *:netbios-ns *:*
    注意：上面的 LISTEN 表示該 port 是已經在 監聽 網路服務啦！而左邊的 tcp 指的是 tcp 封包！

    [root @test /root]# netstat -anp | more <==這個指令很常下達！請記得呦！

    說明：
    netstat 可是很了不起的指令，一定要學會的！尤其他可以讓我們瞭解目前的你的主機的連線狀態！與開啟的 port 有哪些！所以一定得學會才行呀！如果你分別下達：
    • netstat -a | more
    • netstat -an | more
    一定會發現有點奇怪？怎麼有的 port 會以服務名稱(例如上面例子裡的 pop3 ...)有的會以 port 號碼來顯示呢！？嘿嘿！那就是 /etc/services 以及 -n 這個參數的用途啦！你可以發現的是，如果 netstat -a 時，顯示出來的 port 號碼在 /etc/services 存在對應的服務名稱的時候，那麼預設他就會顯示出該服務名稱啦！但是若在 /etc/services 找不到檔案的話，那麼自然就還是以 port 號碼來顯示的！那麼加上了 -n 參數後，不論如何，他都會以 port 及 IP 來顯示啦！
    另外，那個 -p 也很有用呦！尤其是在一些莫名其妙的連線出現時，可以用他查到 PID ，然後再以我們之前談到的 系統資源管理 部分，利用 kill 來殺掉他呦！
    • Proto：指的是封包或者是通訊協定啦！ tcp , udp 是常見的呦！
    • Local Address：本地端的 IP 與 Port 號，如果 /etc/services 存在對應服務名稱，就以服務名稱顯示；
    • Foreign Address ：監聽哪一個地區與 port ；
    • state：狀態列就很多啦！基本的有：
      • LISTEN ：亦即監聽狀態中的 port ！
      • ESTABLISHED：已建立連線的連線情況
      • TIME_WAIT：該連線在目前已經是等待的狀態了！隨時有可能會斷線呦！
    善用 netstat 可以查得相當多的網路資訊！尤其在關閉本機的 port 時！
  • route
    顯示/修改路由表( route table )
    語法：
    [root @test /root]# route [-nee]
    [root @test /root]# route add [-net|-host] 目標主機或網域 [netmask] [gw|dev]
    [root @test /root]# route del [-net|-host] 目標主機或網域 [netmask] [gw|dev]
    參數說明：
    -n　　　：列出的資訊以 IP 來顯示
    -ee　　 ：列出較長列的資訊
    add　　 ：增加路由資訊
    net　　 ：刪除一個路由資訊
    -net　　：增加一個『網域』的路由，例如 C Class 的網域！
    -host 　：增加到某個 IP 主機的路由！
    netmask ：就是 netmask 呀！
    gw 　　 ：這個是路由的通訊閘！ gw 是以 IP 來建置的
    dev 　　：這個是路由的通訊閘！ dev 是以 介面 ( internet ) 代號來建置的！
    範例：
    [root @test /root]# route <==看路由的資訊！
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.141.253 * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 140.116.141.253 0.0.0.0 UG 0 0 0 ppp0

    [root @test /root]# route -n <==以 IP 的方式來顯示路由！
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.141.253 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
    0.0.0.0 140.116.141.253 0.0.0.0 UG 0 0 0 ppp0

    [root @test /root]# route add -net 192.168.0.0 netmask 255.255.255.0 dev eth0 <==新增一個路由！
    [root @test /root]# route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.141.253 * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 <==厲害！增加了！
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 140.116.141.253 0.0.0.0 UG 0 0 0 ppp0

    [root @test /root]# route del -net 192.168.0.0 netmask 255.255.255.0 dev eth0 <==刪除一個路由囉

    [root @test /root]# route add default gw 192.168.1.2 <==增加一個 default gateway 呢！

    說明：
    這個指令相當的有用！尤其是新手們最容易犯錯的 gateway 設定錯誤的問題，都可以藉由這一個指令來檢查呢！這個指令有兩個主要的用途：
    • 顯示目前主機上面的路由資訊；
    • 修改( 增加或刪除 )主機上面的路由表！『可以建置 router 呦！』
    我們來談一談使用 route 時，顯示的內容意義：
    • Destination：目標，可以是 IP 也可以是網域！至於沒有規定到的，則是以 default 來表示！以上面為例，當我的機器要去 192.168.1.0 的時候，則以上表的 192.168.1.0 那一行的設定為主，但如果我要去 tw.yahoo.com 的時候，由於沒有規定到！所以就要以 default 的資訊為主要的路由！因此，我就會經由 140.116.141.253 這個 gateway 來傳送出去我的封包囉！
    • Gateway ：該目標要經由哪一個網關傳送？就是這一個設定值啦！
    • Genmask ：就是該 Destination 的 netmask 囉！例如 140.116.141.253 為 255.255.255.255 ，因為他是一個 host 而不是一個 network 呀！至於 192.168.1.0 就是 255.255.255.0 這個 C Class 囉！那如果是 default 的話，就顯示 0.0.0.0 ，也就是不論是哪裡，都出自這一個 gateway 就事了！
    • Flages ：旗標，有底下幾種 Flage 呢：
      • U (route is up)：該路由已經啟動了；
      • H (target is a host)：目標是一個主機( IP )，例如上面範例中的 140.116.141.253 那一個；
      • G (use gateway)：用來作為 gateway 的設定；
      • R (reinstate route for dynamic routing)：使用動態路由時，恢復路由資訊的旗標；
      • D (dynamically installed by daemon or redirect)：已經由服務或轉 port 功能設定為動態路由；
      • M (modified from routing daemon or redirect)：路由已經被修改了；
      • ! (reject route)：這個路由將不會被接受（用來抵擋不安全的網域！）
    • Iface ：該設定使用的 interface 為何？
    好了，那麼如何增加或刪除路由呢！就由上面的例子就可以知道啦！很簡單的啦！不過需要注意的是，單純有路由功能還不購！因為還需要有 router 的功能才行！我們將在 router 那個章節再來持續談一談這個問題囉！『註：當你發現下達 route 的時候，顯示的速度很慢時，通常是你的路由資訊有一定的問題存在！果真如此的話，請務必仔細的檢查一下設定，否則對於你的網路速度會有遲滯現象呦！』
  • traceroute
    調查連接到某部主機時，每個節點的連線速度
    語法：
    [root @test /root]# traceroute [-i interface] [-g gateway] [host|IP]
    參數說明：
    -i ：使用這個 interface 來連出去！例如 eth0, ppp0 等！
    -g ：使用這個 gateway 來連出去！例如 192.168.1.2, 140.116.141.29 等！
    範例：
    [root @test /root]# traceroute tw.yahoo.com
    traceroute to tw.yahoo.com (202.1.237.21), 30 hops max, 38 byte packets
    1 140.116.141.253 (140.116.141.253) 123.958 ms 96.357 ms 97.810 ms
    2 140.116.140.253 (140.116.140.253) 103.548 ms 87.607 ms 78.227 ms
    3 163.28.112.253 (163.28.112.253) 99.522 ms 84.379 ms 79.858 ms
    4 210.242.251.246 (210.242.251.246) 104.429 ms 86.622 ms 79.857 ms
    5 211.22.226.50 (211.22.226.50) 97.897 ms 86.031 ms 87.177 ms
    6 TaiPei-TANET-P1.BR.HiNet.NET (168.95.207.242) 101.981 ms 58.149 ms 60.231 ms
    7 168.95.17.162 (168.95.17.162) 69.198 ms 63.294 ms 58.594 ms
    8 210.65.200.10 (210.65.200.10) 65.950 ms 67.336 ms 63.503 ms
    9 211.22.35.169 (211.22.35.169) 67.572 ms 92.535 ms 83.105 ms
    10 211.22.41.89 (211.22.41.89) 106.855 ms 92.540 ms 87.201 ms
    11 alteon6.tpe.yahoo.com (202.1.237.253) 122.347 ms 92.235 ms 91.266 ms
    說明：
    這個指令相當的有用途，他可以用來判斷一部遠端主機無法連線時候，是當在哪一個節點！因為很多時候，你常常會發現『咦！網路速度怎麼變慢了？』然後自己的主機似乎沒有問題呀！這個時候就可以使用這個指令查檢查一下，是否在連線的過程當中，有些節點被擋下來了呢？！很好用的啦！
  • host
    顯示主機名稱( domain name )
    語法：
    [root @test /root]# host [-a] domain_name
    參數說明：
    -a ：顯示出所有的資訊
    範例：
    [root @test /root]# host tw.yahoo.com <==僅顯示出主機的 IP
    tw.yahoo.com. has address 202.1.237.21

    [root @test /root]# host -a tw.yahoo.com <==所有的主機資訊顯示！
    Trying "tw.yahoo.com."
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59138
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5

    ;; QUESTION SECTION:
    ;tw.yahoo.com. IN ANY

    ;; ANSWER SECTION:
    tw.yahoo.com. 370 IN A 202.1.237.21

    ;; AUTHORITY SECTION:
    yahoo.com. 213 IN NS NS1.yahoo.com.
    yahoo.com. 213 IN NS NS2.yahoo.com.
    yahoo.com. 213 IN NS NS3.yahoo.com.
    yahoo.com. 213 IN NS NS4.yahoo.com.
    yahoo.com. 213 IN NS NS5.yahoo.com.

    ;; ADDITIONAL SECTION:
    NS1.yahoo.com. 88153 IN A 66.218.71.63
    NS2.yahoo.com. 42259 IN A 209.132.1.28
    NS3.yahoo.com. 51730 IN A 217.12.4.104
    NS4.yahoo.com. 38291 IN A 63.250.206.138
    NS5.yahoo.com. 67985 IN A 64.58.77.85

    Received 216 bytes from 163.28.112.1#53 in 10 ms

    說明：
    這個功能跟 nslookup 幾乎是相同的！但是 nslookup 多了較多的功能就是了！我們使用這個指令時，系統會自動去找 /etc/resolv.conf 底下設定的 DNS 的 IP，然後根據該 IP 來偵測該主機的 IP ！那麼多了 -a 之後顯示出來的訊息是什麼？嘿嘿！別擔心，在我們後續的 DNS 架設當中就會提到啦！有點耐心的往下看呦！
  • nslookup
    啟動與關閉某個網路介面卡
    語法：
    [root @test /root]# nslookup [domain_name|IP]
    參數說明：
    範例：
    [root @test /root]# nslookup tw.yahoo.com <==由 domain name 查詢 IP！
    Note: nslookup is deprecated and may be removed from future releases.
    Consider using the `dig' or `host' programs instead. Run nslookup with
    the `-sil[ent]' option to prevent this message from appearing.
    Server: 163.28.112.1
    Address: 163.28.112.1#53

    Non-authoritative answer:
    Name: tw.yahoo.com
    Address: 202.1.237.21

    [root @test /root]# nslookup 202.1.237.21 <==由 IP 查詢 domain name
    Note: nslookup is deprecated and may be removed from future releases.
    Consider using the `dig' or `host' programs instead. Run nslookup with
    the `-sil[ent]' option to prevent this message from appearing.
    Server: 163.28.112.1
    Address: 163.28.112.1#53

    Non-authoritative answer:
    21.237.1.202.in-addr.arpa name = tw.yahoo.com.

    Authoritative answers can be found from:
    237.1.202.in-addr.arpa nameserver = ns1.yahoo.com.
    237.1.202.in-addr.arpa nameserver = ns2.yahoo.com.
    237.1.202.in-addr.arpa nameserver = ns3.yahoo.com.
    237.1.202.in-addr.arpa nameserver = ns4.yahoo.com.
    237.1.202.in-addr.arpa nameserver = ns5.yahoo.com.
    ns1.yahoo.com internet address = 66.218.71.63
    ns2.yahoo.com internet address = 209.132.1.28
    ns3.yahoo.com internet address = 217.12.4.104
    ns4.yahoo.com internet address = 63.250.206.138
    ns5.yahoo.com internet address = 64.58.77.85

    說明：
    這個指令就如同前面的 host 提到的，就是正查反查的的指令啦！也是利用 /etc/resolv.conf 的內容來查詢的！
遠端連線使用指令： telnet, ftp, ncftp,
用來作為遠端連線操控自己主機的方法是什麼呢？呵呵！簡單，就是利用 telnet 囉！當然啦！這並不是很安全的方式，我們未來在後頭提到 ssh 伺服器的時候，會再跟大家報告 ssh 及 sftp 的用法囉！另外， telnet 用來連上 BBS 也是挺好用的哩！呵呵！那麼遠端傳送 DATA 自然就是使用 ftp 囉！而由於目前很多的匿名網站耶，每次都要輸入 anonymous 真的很煩！那麼就使用 ncftp 吧！很簡單使用呦！
    telnet ：用來連線遠端主機，當然， BBS 主機也可以連線
    ftp ：遠端傳送資料當中，速度最快的協定之一
    ncftp ：登入匿名主機最好用的文字介面 FTP 軟體！
底下我們就談一談怎麼樣來用這些指令吧！
  • telnet
    用來連線遠端主機，當然， BBS 主機也可以連線
    語法：
    [root @test /root]# telnet [-8] [host|IP] [port]
    參數說明：
    -8 ：可以減少亂碼的情況
    port：服務的埠口！例如 POP3 的 110 ，SMTP 的 25 port 等等！telnet 可以用來偵測！
    範例：
    [root @test /root]# telnet -8 140.116.247.7

    ╭?══?═══?═══?═══?═══?═══?═══?═══?══?╮
    ?┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴?
    ?┬┴─┬─┴─┬?══════════════════?─┴─┬─┴┬?
    ?┴┬─┴─┬─┴? 成 功 大 學 電 子 佈 告 欄 ?─┬─┴┬─┴?
    ?┬┴─┬─┴─┬?══════════════════?─┴─┬┴─┬?
    ?┴┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬┴?
    ?┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┼─┬─┴─┬─┴─┬─┴┬?
    ?┴╭─╮╭╮╭───╮╭─╮╭╮╭-╮╭-╮ ╭─╮╭─╮╭───╮┴?
    ?┬│ ╰┘││ ╭╮││ └╯││ ││ │ │ ││ ││ ╭─╯┬?
    ?┴│ ││ │╰╯│ ╭╯│ ╰╯ │ │ ││ ││ ╰─╮┴?
    ?┬│ ││ │ │ │ │ │ │ ││ ││ │┬?
    ?┴│ ││ │╭╮│ ╰╮│ │ │ ││ ││ ╭─╯┴?
    ?┬│┌╮ ││ ╰╯││ ┌╮││ │ │ ││ ││ ╰─╮┬?
    ?┴╰╯╰─╯╰───╯╰─╯╰╯╰───╯ ╰─╯╰─╯╰───╯┴?
    ?─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┼─?
    ?┬┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴┬?
    ?┴┬─┴─┬─┴─┬─┴─ 資 訊 工 程 系 所 ─┬─┴─┬─┴─┬┴?
    ╰═?═══?═══?═══════════════?═══?═══?═╯

    現在上線人數 105 人
    最高上線人數 [1600]人
    請輸入代號(參觀請輸入 'guest',註冊請輸入 'new'):

    [root @test /root]# telnet localhost 110 <==偵測本機端的 110 這個 port 是否有啟動
    Trying 127.0.0.1...
    telnet: connect to address 127.0.0.1: Connection refused
    上面是沒有開啟 port 110 的情況！所以顯示連線不成功！ refused

    [root @test /root]# telnet localhost 110
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    +OK POP3 pc510 v2000.70rh server ready
    quit <==這裡輸入離開的指令為 quit 呦！
    +OK Sayonara <==哈哈！還告訴你日本話『紗呦那哪』
    Connection closed by foreign host.

    說明：
    除了連線到主機以進行遠端操控之外， telnet 最好用的地方就是在於：
    • 幫助你連接上去 BBS 查詢資料；
    • 幫助你測試主機端某個 埠口 的連線情況！
    以上面的例子來說，我們使用 telnet 就可以立刻連上成大資訊工程的歡迎畫面！嘿嘿！很棒吧！另外，如果你要確認本機端的 110 這個埠口是否正常時，也可以使用『 telnet + IP + port 』來偵測看看呦！很好用的工具吧！ ^_^""
  • ftp
    遠端傳送資料當中，速度最快的協定之一
    語法：
    [root @test /root]# ftp [-p] host [port]
    參數說明：
    -p ：啟動 PASSIVE 模式！
    範例：
    [root @test /root]# ftp localhost 　　　　<==預設是以 port 21 來進行連線
    [root @test /root]# ftp localhost 1354 　 <==如果你設定的 ftp 的 port 非正規的 21 ，則可以這樣！

    [root @test /root]# ftp localhost　　<==連接到遠端主機
    Connected to localhost (127.0.0.1).
    220 localhost FTP server (Version wu-2.6.1-20) ready.
    Name (127.0.0.1:test): test
    331 Password required for test.
    Password:
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> dir 　　　　　　　　　<==顯示遠方主機的內容
    ftp> cd 　　　　　　　　　 <==變換遠端主機的目錄
    ftp> close or bye or exit　<==離開遠端主機
    ftp> get file　　　　　　　<==取得遠端主機的檔案
    ftp> mget file　　　　　　 <==取得所有的檔案，較 get 好用！例如 mget .bash* ！
    ftp> put file　　　　　　　<==將本地端檔案 file 丟到遠端主機上
    ftp> mput file　　　　　　 <==與 mget 差不多意思啦！
    ftp> delete file　 　　　　<==殺掉遠端主機的 file 檔案
    ftp> help　　　　　　　　　<==顯示求救指令！
    ftp> mkdir dir　　　　　　 <==在遠端主機上面建立目錄
    ftp> lcd　　　　　　　　　 <==變換本地端路徑！
    ftp> ascii or binary　　　 <==以 ASCII 模式或 BINARY 模式捉取資料！？

    說明：
    這個指令是用在傳輸檔案上面相當好用的功能之一！尤其是再可匿名登入的 FTP 網站！例如中山大學的網站！！用法就如同上面顯示的一般！包括各種捉取檔案的方式都寫在上頭了，可得好好的參考參考！不過，由於這個資料在傳送的時候是以明碼的方式來傳送的，所以較不安全啦！建議多以 sftp 來使用之！另外，他最大的好處是可以指定 port ！當你有建立非 21 port 的時候，就可以使用這個指令加上 port 號來連線啦！
  • ncftp
    登入匿名主機最好用的文字介面 FTP 軟體！
    語法：
    [root @test /root]# ncftp [host]
    [root @test /root]# ncftp [ftp://domain.name/path]
    參數說明：
    可以直接連接到 host 主機，也可以直接連接到主機的某個路徑之下，相當的方便
    範例：
    [root @test /root]# ncftp ftp.nsysu.edu.tw　　　　　　 <==連接到中山大學 FTP 站
    [root @test /root]# ncftp ftp://ftp.nsysu.edu.tw/Linux <==直接連接到 Linux 底下的 Linux 目錄下！
    NcFTP 3.0.3 (April 15, 2001) by Mike Gleason (ncftp@ncftp.com).

    Copyright (c) 1992-2001 by Mike Gleason.
    All rights reserved.

    Connecting to ftp.nsysu.edu.tw...

    ======================================================================
    == ***** ????¥?°?°?¥????s?j???q?????? ***** ==
    == *********** -- ???R?§?q???×???A?? -- *********** ==
    == ********************** FTP.NSYSU.EDU.TW ************************ ==
    == _/_/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/_/ _/_/_/ _/_/_/ ==
    == _/ _/ _/ _/ _/ _/_/ __/ _/ _/ _/ _/ _/ _/ ==
    == _/ _/ _/ _/ _/ _/ _/_/_/ _/ _/ _/ _/ _/ ==
    == _/_/_/_/ _/ _/ _/_/_/ _/ _/ _/ _/ _/ _/_/_/ _/_/_/_/ ==
    == _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ==
    == _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ==
    == _/ _/_/_/ _/ _/ _/ _/ _/_/_/ _/_/_/ _/ _/ ==
    == ************** National Sun Yat Sen University *************** ==
    == ***************** Computer Center ****************** ==
    == *********** -- FORMOSA -- ************ ==
    == ****** Ftp Server ****** ==
    ======================================================================
    ???h§Q¥? <A HREF="http://ftp.nsysu.edu.tw">http://ftp.nsysu.edu.tw</A>
    ======================================================================
    FTP.NSYSU.edu.tw is ready now.
    Logging in...

    ========================================================================
    o Continously file transfer protocol supported now! (Download Resum)
    (¥????????U??????)
    ========================================================================
    ???h?h§Q¥? <A HREF="http://ftp.nsysu.edu.tw">http://ftp.nsysu.edu.tw</A>
    ¥i¥H??¥????K??·j?M??????!!!!!!!!!!!!!!!!!
    Please use the search engine on the URL http://ftp.nsysu.edu.tw
    ========================================================================
    ¥??e FTP ??¥÷?? 235 ?H¥??b?u?W?A¥??e??°????? 1600 ?H
    There are currently 235 users out of 1600 possible. (Class: default)
    ======================================================================
    ADM.Email: ftpadm@cc.nsysu.edu.tw
    Anonymous access granted, restrictions apply.
    Logged in to ftp.nsysu.edu.tw.
    Current remote directory is /pub/Linux.
    ncftp /pub/Linux >　　　　　　　　　　　　　<==瞧！直接進入畫面囉！而且不需要輸入帳號與密碼呢！

    遠端主機的一些服務指令：
    ncftp /pub/Linux > cd Redhat　　　　　　　　<==變換目錄
    ncftp /pub/Linux > dir　　　　　　　　　　　<==顯示目前目錄下的檔案與目錄資訊
    ncftp /pub/Linux > get file1 　　　　　 　　<==將 file1 的資料存到本地端
    ncftp /pub/Linux > get -z file1 file2　　　 <==將 file1 存到本地端時改檔名為 file2
    ncftp /pub/Linux > get -A file1 file2 　　　<==將 file1 以累積的方式(append)增加到 file2 這個檔案
    ncftp /pub/Linux > pub file　　　　　　　　 <==將檔案由本地端上傳至遠端！
    ncftp /pub/Linux > rename file1 file2　　　 <==將遠端的主機之 file1 更名為 file2
    ncftp /pub/Linux > rm file　　　　　　　　　<==刪除檔案
    ncftp /pub/Linux > rmdir directory　　　　　<==刪除目錄
    ncftp /pub/Linux > mget directory　　　　　 <==可以下載『整個目錄』的資料！很棒吧！

    本地端主機的一些指令功能：
    ncftp /pub/Linux > lcd 　　　　　　　　　　 <==變更本地端目前所在的目錄
    ncftp /pub/Linux > lls 　　　　　　　　　　 <==顯示目前本地端所在目錄的檔案與目錄資訊
    ncftp /pub/Linux > lmkdir 　　　　　　　　　<==在本地端建立目錄
    ncftp /pub/Linux > lpwd　　　　　　　　　　 <==顯示目前本地端主機的所在目錄
    ncftp /pub/Linux > lrm　　　　　　　　　　　<==刪除本地端的檔案
    ncftp /pub/Linux > lrmdir　　　　　　　　　 <==刪除本地端的『目錄』

    說明：
    這個指令的功能就更強大了！尤其在於使用目前網路上面允許匿名登入的 FTP 網站！例如上面提到的中山大學的 FTP 網站！
    你可以馬上登入他，然後立刻連線看看，就知道如何使用他啦！很好用的啦！！ ^_^

文字界面網頁瀏覽： lynx, wget,
什麼？！文字界面竟然有瀏覽器！別逗了好不好？！呵呵！誰有那個時間在逗你呦！真的啦！有這個東西，是在文字界面下上網瀏覽的好工具！分別是 lynx 及 wget 這兩個寶貝誕，但是，你必需要確定你已經安裝了這兩個套件才行：
  • wget-1.7-3
  • lynx-2.8.4-17
這兩個套件的版本在 Red Hat 7.2 是 1.7-3 及 2.8.4-17 ，至於其他版本則不見得是後面這個版本名稱，所以不同也沒有關係！然後將原板 CD 拿出來 mount 他之後，以 rpm 安裝吧！不要說你不會呦！打屁屁！好了，假設你已經安裝好了，那麼這兩個東西分別是什麼呢？先約略的介紹一下：
  • lynx ：用來上網的文字界面的瀏覽器！他真的很不錯用，尤其是要讓 Linux 定期捉取某個網站的網頁資料，他可是相當好用的哩！同時，如果作了部分設定，就可以直接觀看中文囉！
  • wget ：以 HTTP 或 FTP 協定作用，來進行網路檔案資料的捉取的功能！這個東西也相當的好用！可以在文字界面下直接捉取 HTTP 上面的分享的檔案呦！呵呵！棒！
底下我們就分別來談一談這兩個可愛的小東西吧！！
  • lynx
    文字介面下的 WWW 瀏覽器
    語法：
    [root @test /root]# lynx http://web.site
    參數說明：
    範例：
    [root @test /root]# lynx http://tw.yahoo.com
    tw.yahoo.com cookie: B=b7hd3jkukeu1e&b=2 Allow? (Y/N/Always/neVer) A<==輸入 A 接受 cookie
    Yahoo!奇摩 (p1 of 3)

    Yahoo!奇摩

    港台娛樂八卦
    乜都有！

    填寫3C評鑑
    送購書折價卷

    ______________________________ 搜 尋 說明
    強力搜尋

    高中職仃M奐s放榜 缺額達25%　伊能靜 公開婚前婚後心情

    【我的】信箱 書籤 相簿 通訊錄 行事曆 茪H網? 自q熄 即時通訊
    【每日】新聞 股市 / 理財 氣象 星座 【服務】q報 賀卡 手機 / 簡訊 ADSL
    【社群】聊天 家族 摩域 遊戲 　　 【指南】新奇 看板 字典 工作 汽車
    【娛樂】影? 電影 絳? 卡通 笑壇 【商務】旅遊 拍賣
    購物 算命 開店

    [c7a.gif] 3C情報 育兒 女性時尚 防毒駭 減肥
    藝術文化
    絳?戲劇 歌手歌星
    視聽娛樂
    寫真 同人 神奇寶貝
    運動體育
    棒球 NBA 世足賽
    教育學習
    大學 社團 同學會
    科學科技
    環保 天文 地球科學
    地區地域
    輕?美國 城市鄉鎮
    圖書出版
    活動 圖書館 電腦雜誌
    網路指南
    (NORMAL LINK) Use right-arrow or <return> to activate.
    Arrow keys: Up and Down to move. Right to follow a link; Left to go back.
    H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

    說明：
    1. 進入畫面之後，由於是文字型態，所以編排可能會有點位移！不過不打緊！不會影響我們看咚咚！
    2. 這個時候可以使用『上下鍵』來讓游標在上面的選項當中( 如信箱、書籤等等的 )，按下 Enter 就進入該頁面
    3. 可以使用『左右鍵』來移動『上一頁或下一頁』。
    4. 可以藉由修改 /etc/lynx.cfg 來設定顯示的字元編碼( 台灣地區可以選擇 Big5 編碼 )。
    5. 其他的設定可以使用上面的範例當中，最底下那一行， H)elp O)ptions P)rint G)o M)ain 及 Q)uit 等等！
    6. 功能說明：
          h 　　　：Help, 求助功能. 線上說明書.
          g 　　　：Goto URL, 按 g 後輸入網頁位址(URL) 如:http://www.abc.edu/ 等等...
          d 　　　：download, 下載檔案.
          q 　　　：Quit, 跳離 lynx !
          Ctrl+C ：強迫切斷 lynx 的執行.
          方向鍵:
              上 ：移動游標至本頁中 "上一個可連結點" .
              下 ：移動游標至本頁中 "下一個可連結點" .
              左 ：back. 跳回上一頁.
              右 ：進入反白游標所連結之網頁.
              ENTER 同 "右" 鍵.

    說明：
    這個指令的最大功用就是讓我們在文字介面下使用這個瀏覽器來上 WWW 網頁啦！真的相當的好用！你可以仔細的嘗試使用看看！速度上面應該是蠻快的呦！lynx 是文字模式下最普遍也最好用的網頁瀏覽器(browser)，由於 lynx 只在畫面上秀出文字及其鏈結(link)的點，透過操作簡單的方向鍵及功能鍵，便能訊速的瀏覽網頁，亦可下載檔案。
    • 另外，在台灣地區由於我們需要使用到 Big5 的編碼表，所以需要修改一下 lynx 的設定檔，亦即是 /etc/lynx.cfg 這個檔案，將底下的內容修改一下：
    [root @test /root]# vi /etc/lynx.cfg
    .... 略 ....找到底下的三行字串
    ##CHARACTER_SET:iso-8859-1 　　　<==大約在 394 行處
    #ASSUME_CHARSET:iso-8859-1　　　 <==大約在 409 行處
    #PREFERRED_LANGUAGE:en　　　　　 <==大約在 537 行處

    將上面三行的 # 符號取消，並且改成底下這樣：
    CHARACTER_SET:big5　　　　　　　 <==這就是 Big5 中文的編碼
    ASSUME_CHARSET:big5　　　　　　　<==跟上面的說明一樣！
    PREFERRED_LANGUAGE:zh_TW　　　　 <==這個就是語系的支援！
    語系的支援方面，你可以查看一下 /etc/sysconfig/i18n 這個檔案，zh_TW 指的就是台灣！
    做了上面設定之後，就可以看中文囉！

    呵呵！這樣一來就可以見識到文字介面瀏覽器的龐大功能囉！您還可以參考一下底下的網址：http://freebsd.sinica.edu.tw/zh-tut/web-browse.html#LYNX
    此外，我們也可以使用 lynx 來進行『下載圖示』的功能呦！例如我們要下載一個檔案，則可以使用：
    [root @test /root]# lynx -dump http://the.site.doname.name/xxx.gif > file.gif
    呵呵呵！就樣就 OK 啦！
  • wget
    使用 wget 利用 FTP 及 HTTP 的協定來捉取資料！
    語法：
    [root @test /root]# wget http://domain.name/file
    [root @test /root]# wget http://ftp.nsysu.edu.tw/Unix/Web/counter/Count2.6/Count2.6/download/src/wwwcount2.6.tar.gz
    --14:54:45-- http://ftp.nsysu.edu.tw/Unix/Web/counter/Count2.6/Count2.6/download/src/wwwcount2.6.tar.gz
    => `wwwcount2.6.tar.gz'
    Connecting to ftp.nsysu.edu.tw:80... connected!
    HTTP request sent, awaiting response... 200 OK
    Length: 433,312 [application/x-gzip]

    0K .......... .......... .......... .......... .......... 11% @ 746.27 KB/s
    50K .......... .......... .......... .......... .......... 23% @ 581.40 KB/s
    100K .......... .......... .......... .......... .......... 35% @ 909.09 KB/s
    150K .......... .......... .......... .......... .......... 47% @ 1.09 MB/s
    200K .......... .......... .......... .......... .......... 59% @ 746.27 KB/s
    250K .......... .......... .......... .......... .......... 70% @ 781.25 KB/s
    300K .......... .......... .......... .......... .......... 82% @ 757.58 KB/s
    350K .......... .......... .......... .......... .......... 94% @ 704.23 KB/s
    400K .......... .......... ... 100% @ 1.13 MB/s

    14:54:46 (780.73 KB/s) - `wwwcount2.6.tar.gz' saved [433312/433312]

    說明：
    這個指令則是可以在文字介面下下載 WWW 裡面的連結檔案資料！也是相當方便的指令呢！那麼如果要使用 proxy 來下載資料呢？嘿嘿！算你聰明！沒錯！使用 Proxy 有時候確實會讓我們的下載速度變快，這個時候就需要動用的設定檔啦！我們的設定檔案放置在 /etc/wgetrc ，你可以這樣修改一下，假設你要使用成大的 Proxy 主機：http://proxy.ncku.edu.tw 而他的連接 port 為 3128 ，所以就要這樣改變囉！
    [root @test /root]# vi /etc/wget
    .... 略 ....找到底下的兩行字串
    #http_proxy = http://proxy.yoyodyne.com:18023/ <==在 75 行處
    #use_proxy = on　　　　　　　　　　　　　　　　<==在 78 行處

    將上面兩行的 # 符號取消，並且改成底下這樣：
    http_proxy = http://proxy.ncku.edu.tw:3128/
    use_proxy = no

    呵呵呵！這樣一來，就有 Proxy 來支援我們的 wget 下載軟體囉！很棒吧！ ^_^
    • 修改主機名稱： /etc/sysconfig/network, hostname,
    如果沒有忘記的話，那麼還記得怎樣看得出目前我的主機名稱呢？嘿嘿！沒錯！就是使用 hostname 啦！簡單的很！那麼萬一出現的主機名稱不是我所要的呢？可不可以進行修改？！當然可以囉！直接在 /etc/sysconfig/network 底下修改就可以啦！請依照底下的步驟來進行即可！
    1. 修改主機名稱：
    [root @test /root]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=test.adsldns.org <==就是這裡來修改啦！
    GATEWAY=
    GATEWAYDEV=

    2. 重新啟動網路：
    [root @test /root]# /etc/rc.d/init.d/network restart

    2002/07/31 以來統計人數


Linux 網路偵錯
最近更新日期：2002/07/31
瞭解發生網路問題的可能狀況：
步驟一：網路卡工作確認： 重新驅動網路卡
步驟二：區域網路硬體連線確認
步驟三：確認路由表資料沒有問題
步驟四：確認 DNS 的 IP 設定
步驟五：NAT 功能( 或 IP 分享器 )是否正常
步驟六：ADSL 數據機或 router 的問題
步驟七：主機服務是否關掉了與服務權限的問題
瞭解發生網路問題的可能狀況：
Linux 最強的，也是最讓人稱道的地方，就是他的網路功能了，不論是 Mail server、Web server、Proxy server等等，都好好用喔！但是，我們也常在網路上看到一堆常見的問題，就是在問『我的 Linux 沒有辦法連上網路，該如何是好....』等等的問題，問來問去的重點大概都是一樣的狀況！傷腦筋！那鳥哥就把一些可能的問題把他整理一下，看看你是不是有這方面的問題，參考看看吧！
    問題的解決順序應該是從自己可以掌握的地方著手，再慢慢的向上面來查核問題所在！基本上，問題的解決流程可以如下：
    1. 瞭解一下可能的問題發生狀況：
    2. 看自己的網路卡是否正常工作；
    3. 能不能 ping 到同一網域中的電腦 IP 呢（區域網路）；
    4. 看自己的 DNS 是否設定正確 ；
    5. 區域網路中 NAT 不能工作？看看 /etc/sysconfig/network；
    6. 看看 ADSL 或者是 Router 有沒有問題？traceroute 撥接的問題；
    7. 是否主機的服務被關掉了？ check 看看 inetd.conf /etc/xinetd.d ；
    8. 一些服務的權限與允許瀏覽權是否有開放；
    底下我們先來談一談有哪些常見的可能網路問題狀況，先以簡單的區域網路連線架構圖<下圖>的表示方式：
    如上面的區域網路接線法中，一般而言，造成網路問題的情況可以粗分為
    1. 網路硬體傳輸的部分；與
    2. 作業系統、通訊協定或者相關服務的設定之軟體問題！
    我們分別來談一談這些問題吧！
  • 網路硬體傳輸的問題：
    1. 網路線材的問題：
      在上面的圖示中，可以發現，其實網路周邊設備中，使用最多的就是網路線啦！由於網路線分成平行線與跳線（RJ-45接頭）以及以前較流行的同軸電纜線，且，其實網路線常常是接在門縫處，有可能被壓毀的！所以，你需要注意一下這些事情：
      • 網路線被截斷；
      • 網路線過度扭曲變形造成訊號不良；
      • 自製網路接頭（如RJ-45跳線頭）品質不良；
      • 網路接頭與設備（如 Hub）接觸不良；

    2. 網路卡、Hub 及 Router 等網路設備的問題：
      另外，還有一些網路設備也會有問題，常見的問題如下：
      • 網路卡不穩定、品質不佳，或者與整體系統的相容度不佳；
      • 各網路設備的接頭不佳，接觸不良，造成訊號衰減；
      • 各網路設備使用方法不良，造成設備功能衰減；

    3. 設備配置的規則；
      在各個設備的配置上，是有規則的，最常聽見的就是太長的網路線會造成訊號的衰減，導致網路連線的時間太長甚至無法連線！關於相關的設備配置原則上，可以參考 網中人兄的網站：
      • 使用錯誤的網路線，最常發生在平行線與跳線的分別！
      • 路設網路線過長，導致訊號衰減太嚴重。以最常見的最高品質（CAT5等級，亦即目前在市面上最常看到的產品，最大傳輸速度可達 100 Mbps） RJ-45 平行線來說，他的限制長度大概是在 90 公尺左右，也就是說，在兩個設備之間（如網路卡與 Hub 的距離）的網線長度當然以不超過 90 公尺為原則了；
      • 其他雜訊的干擾，最常發生在網路線或者網路設備旁邊有太強的磁波；
      • 區域網路上面，節點或者其他的設備太多，以網中人兄說的 543 原則中，資引用如下：
        5個網段(segment)。所謂segment就在物理連接上最接近的一組電腦﹐在一個BNC網段裡面最多只能接30台電腦﹐且網線總長不能超過185m。
        4個增益器(repeater)。也就是將信號放大的裝置。
        3個電腦群體(population)。這個不好理解﹐也就是說前面所說的5個segment之中﹐只能有3個可以裝電腦﹐其它兩個不行。
  • 軟體設定的問題：
    1. 網路卡的 IP 設定錯誤：
      例如：同一個 IP 在同一個網段中出現造成IP衝突、子遮罩網路設定錯誤、網路卡的驅動程式使用錯誤、網路卡的 IRQ、 I/O Address 等等；

    2. 路由的問題（Router）：
      這方面的問題出在 Gateway 的設定錯誤，或者是路由設定不正確，導致資料封包沒有辦法順利的送出去；

    3. 通訊協定的問題（Protocol）：
      最常發生在不同的周邊設備的通訊了！例如 windows2000 與 98 之間的『網路上的芳鄰』之溝通中，以 NetBUEI 似乎是比較好的解決方案！

    4. 網路負荷問題（Loading）：
      當同時有大量的資料封包湧進 Server 或者是 Hub 或者是同一個網域中，就有可能造成網路的停頓甚至掛點！

    5. 其他問題：
      例如：一些 port 被防火牆擋住了，造成無法執行某些網路資源；應用程式本身的 Bug 問題；應用程式中使用者的網路設定錯誤；以及不同的作業系統的相容性問題等等。
  • 解決問題的方法：
    1. 知道問題之後當然就要解決了！以上圖為例，我們需要由自身的 PC 上的網路卡查起，到網路線、到 Hub 在到 ATU-R 等等的硬體先檢查完；

    2. 確定硬體沒問題了，再來思考軟體的設定問題！
步驟一：網路卡工作確認
其實，網路一出問題的時候，你應該從自己可以檢查的地方檢查起，因此，最重要的地方，就是你的網路卡是否有工作的問題啦！檢查網路卡是否正常工作的方法如下：
  1. 使用 lsmod 看看網路卡的模組是否已被載入：
    除非你曾經自行編譯過核心，否則網路卡的驅動程式應該是以模組的型態存在才對！由於網路卡是最基本的網路元件之一啦！沒有他，自然也就無法連上 Internet ，所以囉，請先確認一下你的網路卡是否已經被驅動吧！這個時候當然就要使用 lsmod 來看看啦！
    [root @test /root]# lsmod
    Module Size Used by Tainted: P
    ipt_MASQUERADE 1216 1 (autoclean)
    iptable_filter 1696 1 (autoclean)
    ip_conntrack_irc 2592 0 (unused)
    ip_conntrack_ftp 3328 0 (unused)
    ip_nat_irc 2400 0 (unused)
    ip_nat_ftp 2976 0 (unused)
    iptable_nat 13588 3 [ipt_MASQUERADE ip_nat_irc ip_nat_ftp]
    ip_tables 11232 5 [ipt_MASQUERADE iptable_filter iptable_nat]
    ip_conntrack 13356 3 [ipt_MASQUERADE ip_conntrack_irc ip_conntrack_ftp ip_nat_irc ip_nat_ftp iptable_nat]
    ppp_async 6240 1 (autoclean)
    8139too 14208 2　　　<==這個就是我的螃蟹卡模組啦！
    usbcore 29632 0 (unused)
    呵呵！沒錯！我的網路卡已經掛上去啦！所以沒有問題！那麼如果沒有發現呢？嗯！那麼很可能是沒有捉到硬體囉！這個時候請先以 dmesg 確認一下是否已經捉到了網路卡囉！
    [root @test /root]# dmesg
    ....略....
    PPP generic driver version 2.4.1
    NET4: Linux TCP/IP 1.0 for NET4.0
    IP Protocols: ICMP, UDP, TCP, IGMP
    IP: routing cache hash table of 512 buckets, 4Kbytes
    TCP: Hash tables configured (established 4096 bind 4096)
    Linux IP multicast router 0.06 plus PIM-SM
    NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
    VFS: Mounted root (ext2 filesystem) readonly.
    Freeing unused kernel memory: 216k freed
    Adding Swap: 86680k swap-space (priority -1)
    usb.c: registered new driver hub
    8139too Fast Ethernet driver 0.9.24 <==確實有捉到囉！
    eth0: RealTek RTL8139 Fast Ethernet at 0x6100, 00:50:fc:22:9c:57, IRQ 10
    eth0: Identified 8139 chip type 'RTL-8139C'
    eth1: RealTek RTL8139 Fast Ethernet at 0x6300, 00:50:fc:22:9a:cb, IRQ 11
    eth1: Identified 8139 chip type 'RTL-8139C'
    eth0: Setting half-duplex based on auto-negotiated partner ability 0000.
    eth1: Setting 100mbps full-duplex based on auto-negotiated partner ability 41e1.
    ip_conntrack (512 buckets, 4096 max)
    ip_tables: (C) 2000-2002 Netfilter core team
    eth1: Setting 100mbps full-duplex based on auto-negotiated partner ability 41e1.
    eth1: Setting 100mbps full-duplex based on auto-negotiated partner ability 41e1.
    eth1: Setting 100mbps full-duplex based on auto-negotiated partner ability 41e1.
    嗯！確實是有捉到我的網路卡啦！是 Ethernet 的網路卡呦！

  2. 使用 ifconfig 看看是否有網路卡的運作出現：
    在確定網路卡已經被捉到之後，硬體就沒有問題了，再來就是網路卡的軟體設定問題。通常使用了 ifconfig 之後，會出現一個說明視窗，如果沒有任何網路硬體被驅動的話，那就以 ifup eth0 來啟動，再以 ifconfig 來看看網路設備的運作！如果還是沒有辦法啟動的話，就需要來重新安裝網路卡的驅動程式！如何確定網路卡有無正常工作呢？簡單的很，就是使用 ifconfig 這個指令來檢查一下吧！
    [root @test /root]# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9A:CB
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:35747 errors:0 dropped:0 overruns:0 frame:0
    TX packets:38701 errors:0 dropped:0 overruns:0 carrier:0
    collisions:567 txqueuelen:100
    Interrupt:11 Base address:0x6300

    eth1 Link encap:Ethernet HWaddr 00:90:CC:08:49:13
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:79570 errors:0 dropped:0 overruns:0 frame:0
    TX packets:69642 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    Interrupt:10 Base address:0x6100

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:3924 Metric:1
    RX packets:4553 errors:0 dropped:0 overruns:0 frame:0
    TX packets:4553 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0

    ppp0 Link encap:Point-to-Point Protocol
    inet addr:140.116.141.114 P-t-P:140.116.141.253 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
    RX packets:27577 errors:0 dropped:0 overruns:0 frame:0
    TX packets:25980 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:10

    如上所示，是我的網路的設定，我共有兩個網路卡，設備名稱分別為 eth0 (對內，保留 IP )及 eth1 (對外)，而由於我是使用 ADSL 撥接的，所以就有 ppp0 這個虛擬的網路介面囉！至於第三個 lo 是主機內部的遞迴網路，這是每部機器都會有的。如上所述，那我的三個介面都有出來，並且 eth0 的 IP 是 192.168.1.2 這一個，那就表示設備應該沒有問題才對！如果想要確定一下到底網路有沒有通，你可以使用 ping 的功能：
    [root @test /root]# ping -c 5 192.168.1.2
    PING 192.168.1.2 (192.168.1.2) from 192.168.1.2 : 56(84) bytes of data.
    64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=0.2 ms
    64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=0.2 ms
    64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=0.2 ms
    64 bytes from 192.168.1.2: icmp_seq=3 ttl=255 time=0.2 ms
    64 bytes from 192.168.1.2: icmp_seq=4 ttl=255 time=0.1 ms

    --- 192.168.1.2 ping statistics ---
    5 packets transmitted, 5 packets received, 0% packet loss
    round-trip min/avg/max = 0.1/0.1/0.2 ms

    如果有回應的話，如上面所示，那就是正常啦！

  3. 不必撥接的已知固定式 IP 的檢查方式：
    假如已經知道你的實體 IP 、 通訊閘 (GateWay)，且不必撥接的情況 (Giga 的 ADSL 不算這一種！)，你可以直接修改 /etc/sysconfig/network 以及 /etc/sysconfig/network-scripts/ifcfg-eth0 這兩個檔案，然後以 ifup eth0 啟動網路卡，並以 ping 你的網路卡 IP 來看看是否有正常工作。
    [root @test /root]# vi /etc/sysconfig/network
    NETWORKING=yes
    FORWARD_IPV4=yes
    HOSTNAME=your.domain.name
    GATEWAY=140.116.44.253
    GATEWAYDEV=
    例如上面的範例，需要注意的地方是在 GATEWAY=及 GATEWAYDEV=eth0 這個地方（只需要有一個即可），例如成大環工的 gateway IP 是 140.116.44.253 ，那你只要將你的 gate way 設定成那個 IP 就是了（就是 GATEWAY=140.116.44.253）！而你的實體 IP 的修改方法為：
    [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=none
    BROADCAST=140.116.44.255
    IPADDR=140.116.44.125
    NETMASK=255.255.255.0
    NETWORK=140.116.44.0
    ONBOOT=yes
    在上面的例子中，你的 IP 是 140.116.44.125，則你可以廣播的位址共有 140.116.44.1-255（140.116.44.255那一個），而你的子遮罩網路為 255.255.255.0。好了！都設定完成之後，那就直接以下面的方式來啟動：
    [root @test /root]# /etc/rc.d/init.d/network restart
    [root @test /root]# ifup eth0
    [root @test /root]# ping -c 5 140.116.44.125
    看看網路卡是否正常的啟動了呢？

  4. 需撥接的網路卡 IP ：
    通常建議直接在 /etc/sysconfig/network 及 /etc/sysconfig/network-scripts/ifcfg-eth0 中，給予一個虛擬 IP 後，再 ping 你的網路卡 IP 。這是由於撥接式 ADSL 在撥接之前是沒有真實 IP 的，所以我們先以虛擬 IP 來測試看看網路卡是否可以正常啟動吧：
    [root @test /root]# vi /etc/sysconfig/network
    NETWORKING=yes
    FORWARD_IPV4=yes
    HOSTNAME=your.domain.name
    GATEWAY=
    GATEWAYDEV=ppp0
    在這裡比較重要的地方是 GATEWAYDEV 的地方，假如你的撥接是以 eth1 這個網路卡來啟動的，那就要設定成 eth1 ，當然了，你也可以設定成 ppp0 ！另外，其實你也可以不要設定（變成空字串），這樣網路會自行判斷。網友們最常發生問題的地方在於，你是以 eth1 來作為撥接的網路卡，但是卻將 GATEWAYDEV 設定成 eth0 ，那樣的話，你對外要求的封包將都會透過 eth0 這個保留 IP 的網路卡向外要求資料，由於保留 IP 沒有辦法連上 Internet ，所以，你的網路就完全上不了 Internet 啦！所以這裡的設定要注意一下囉！
    [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=none
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=no
    在在上面的例子中，你將網路卡的虛擬 IP 設定成為 192.168.1.2 這一個！另外一個比較重要的地方在於 ONBOOT 的地方，由於你的網路需要撥接後才能連上 Internet ，所以，『請不要在開機的時候將"對外"的網路卡啟動』，很多網友都誤會了這裡的意思！另一個習慣的錯誤在於將 BOOTPROTO（通訊協定）設定成 DHCP ，這是不對的，因為你的網路是透過撥接的方式，在撥接的過程中就會由 rp-pppoe 給予 DHCP 的協定了，所以這裡只要設定成 none（沒有）就行了！千萬注意了！然後再以下面的方式來確認網路卡的運作與否：
    [root @test /root]# /etc/rc.d/init.d/network restart
    [root @test /root]# ifup eth0
    [root @test /root]# ping -c 5 192.168.1.2
    請注意呦！這個部分不需要修改也沒有關係，因為我們的設定是『 ONBOOT=no 』，嘿嘿！所以開機的時候並不會啟動網路卡，那麼實際撥接的時候就不會有干擾囉！如果需要啟動撥接系統來確認撥接是否可行，可以按照上面的方式修改完兩個檔案，然後將 adsl-setup 設定完成，之後以下面的方式來啟動 ADSL 試試看：
    [root @test /root]# ifdown eth0
    [root @test /root]# /etc/rc.d/init.d/network restart
    [root @test /root]# adsl-start
    啟動之後，再以 ping 的方式來確定一下網路：
    [root @test /root]# ping -c 5 your.IP
    [root @test /root]# ping -c 5 168.95.1.1
    [root @test /root]# ping -c 5 tw.yahoo.com
    如果確定可以連上 Internet 之後，就將 adsl-start 寫進 /etc/rc.d/rc.local 中吧！

  5. 重新安裝網路卡驅動程式：
    如果上面的方式都沒有辦法來正常啟動你的網路卡時，那就只好再捉一次你的網路卡驅動程式了。首先看看驅動程式對不對吧！假設你買的是螃蟹卡，那麼你的 /etc/modules.conf 內容就會有點像這樣（在 Red Hat 6.x 以前的檔案，檔名為 /etc/conf.modules ！）：
    [root @test /root]# vi /etc/modules.conf
    alias eth0 rtl8139
    alias eth1 viarhine
    在上面的例子中，由於我有兩塊網路卡，第一塊是屬於螃蟹卡（晶片為 RelTeck8139），第二塊是 VIA 的晶片（直接以 viarhine 來驅動）第三行是將 viarhine 這個晶片驅動的意思。萬一你插了兩張相同的網路卡，那要如何來區分網路卡的先後次序呢？！例如插了兩塊 rtl8139 的網路卡，那你可以這樣寫（增加 io 及 irq 的控制參數）
    [root @test /root]# vi /etc/modules.conf
    alias eth0 rtl8139
    alias eth1 rtl8139
    options rtl8139 io=0x300,0x320 irq=3,5
    上面是說，兩塊卡的io 與 irq 分別為 0x300, 3 及 0x320, 5。至於這方面的相關資訊，你可以進入 windows 系統中看過（所以說，可以安裝成多成作業系統啦！）再來修改吧！好了，那如果要重新安裝網路卡的驅動程式呢？！簡單來說，你可以依照小弟的網頁來安裝網路卡：鳥哥的私房菜。不過，若是 D-Link 的網路卡（指 D-Link 530 B 版的網路卡），可以參考 狼主的網路實驗室的網管小技巧 來安裝看看。反正不管如何說，一般都與 /etc/module.conf 這個檔案有點關係（在 Red Hat 6.X 以前的版本為 /etc/conf.modules 而 7.0 以後的版本則變成 /etc/modules.conf 檔案了！），通常的網路卡驅動程式安裝方法步驟如下：
    1. 下載你的網路卡驅動程式；
    2. 編譯並安裝模組；
    3. 修改 /etc/conf.module 檔案；
    4. 修改 /etc/sysconfig/network 檔案；
    5. 修改 /etc/sysconfig/network-scripts/ifcfg-eth0 檔案；
    6. 以 ifup eth0 來啟動你的 網路卡 試試看囉！
    你只要將你的網路設備與你的晶片名稱寫上正確的，再加上將該晶片的驅動程式編譯完成，並擺在 /lib/modules/`uname -r/kernel/drivers/net 裡面即可 ( 若核心為 2.2.xx 則需要擺在 /lib/modules/2.X.X/net 裡面即可囉！)
    VBird 的建議：
    其實，在架設 Linux 的過程中，大概最麻煩的地方就是在網路的設定這裡了，尤其是後續的一些區域網路的連線設定（如果涉及 NAT 主機來分享網路頻寬的話，將會更麻煩！），所以這裡 VBird 要給大家一個建議，就是遇到網路卡設定的瓶頸的時候，乾脆先買一塊很便宜，但是支援度很高的螃蟹卡（我去大賣場看過，最便宜的只要 250 不到就有了，我在台南！），先將網路架設起來再說！否則一個新手花了很多的時間去搞一塊莫名的網路卡，常常會磨損一個 Linux 愛好者的耐心！
步驟二：區域網路硬體連線確認
    在確認完了最重要的網路卡設定之後，並且確定網路卡是正常的之後，在接著下來是區域網路內的網路連接情況了！假設你是按照 最上面 那張圖的架設方式，那麼你的區域網路內的要求有下面幾點：
    1. 關於 IP 的設定：假設你的私有 IP 段為 192.168.1.0/24 ，那你的區域網路內的所有電腦的 IP 應該介於 192.168.1.1 - 192.168.1.254，且所有的電腦的 子遮罩網路 均為 255.255.255.0 ，並且 IP 在所有的電腦都不可以重複；

    2. 關於 Gateway 與 DNS 的設定：假設你的 Linux 對內 IP 為 192.168.1.2，那麼所有區域網路內，其他的個人電腦的 通訊閘 應該是 192.168.1.2 這一個，此外，你的 DNS 應該設定為 ISP 給你的 DNS IP 呢！例如 Hinet 的 168.95.1.1 ，如果你不曉得你的 DNS 應該設定多少，那就設定為 168.95.1.1 即可！『注意！不要設定為 192.168.1.2 』；

    3. 關於 Windows 端的通訊協定：區域網路內其他的 windows 系統的通訊協定僅需要 TCP/IP 及 NetBUEI 即可，安裝過多的通訊協定可能會造成連線過慢的情況；

    4. 關於 Windows 端的工作群組與電腦名稱：假如你還需要資源分享，那麼你就必須在 windows 系統中開放檔案分享，並且建議所有的電腦將『工作群組』設定相同，但『電腦名稱』則不能相同！此外，強烈建議將所有的電腦的登錄名稱設定相同。以我為例，在我的工作地方，我管理的近十台的電腦的登錄名稱都相同，所以資源分享的時候，不論是 98 或是 2000 或是其他的系統，都可以快速的就連接上喔！
    若要問你：區域網路內的電腦是否連線成功？最簡單的方是就是以 ping 啦！假設我是在 Linux 主機端（192.168.1.2 這一個 IP），那我只要在主機端下達：
    [root @test /root]# ping -c 5 192.168.1.100

    就可以知道 192.168.1.100 這部電腦是否可以跟我的主機相通！如果不能連通呢？！說說可能的原因：

    1. Windows 端的設定不對：
      仔細看一下上面說的幾個基本要求的設定，是不是都正確呢！如果不確定的話，得到 這裡 去看一下 Windows 的設定。

    2. 連線線材不對：
      要曉得，兩塊網路卡之間是以『跳線』連接，網路卡與 Hub 是以『平行線』連接。因為網路線（RJ-45）分成平行線與跳線，兩種規格並不相同。而在 Hub 的形式方面，目前較新的 ADSL 數據機，連接到 Hub 都必須要連到 uplink 這個孔了，所以必須以跳線連接 Hub 到 ADSL 數據機才行！此外，目前 ADSL 數據機大都有一個虛擬 IP 為 192.168.1.1，那你可以在你的主機端下達 ping 192.168.1.1 來看看兩者是否有連通！這時請注意，將你的網路卡連接到數據機 的那一個，設定的 IP 成為 192.168.1.2，並且重新啟動 ifup eth0 ，才可以進行測試！註：還有一個簡單的檢視方法，那就是接到 Hub 上面之後，並且開啟所有的裝置電源，則全部的有接上裝置的 Hub 插孔應該要『亮燈』才是對的，如果燈不亮，那就『肯定』有問題！

    3. 網路卡或 Hub 壞掉了：
      不要懷疑！網路卡與 Hub 是會壞掉的！得小心一下這一個情況。

    4. 訊號太弱了：
      這個最常發生在電話線接很長，或者是網路線接很長的情況，由於你的線材可能不是很好，所以可以就會造成你的網路會斷斷續續的！當然，也有可能是中華電信的機房本身提供給你的訊號就不夠強，這時，你就必須請中華電信的工程師來幫你處理處理了！
步驟三：確認路由表資料沒有問題
在一般正常的情況之下，當你下達 route 這個指令的時候，你的路由表 ( route table ) 應該會很快的顯示出來，如果萬一不幸顯示的速度非常之慢，那麼通常就是你的網路設定可能『有點怪怪的』，當然啦，如果是你的系統還有放置上 IP alias 的話，那麼就真的會有點慢慢的∼不過沒有關係，我們還是可以來設定一下是否有問題呢！？
[root @test /root]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
140.116.141.253 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 140.116.141.253 0.0.0.0 UG 0 0 0 ppp0

請注意，由於我有兩塊網路卡( 一塊對內一塊對外，我的系統架構就如同 上圖 所顯示的那樣！ )，加上我是以撥接的方式連上 Internet 的，所以自然就會有 eth0, eth1, ppp0 及本來就會有的 lo 這三個介面，而由於 eth1 這個介面是依附在 ppp0 上面的( 我的 ppp0 的撥接介面卡使用的是 eth1 呦！)，所以自然也就沒有 eth1 這個介面的設定！好了，那麼我的路由介面自然就應該會有 eth0, ppp0, lo 這三個啦！那由於 lo 是 127.0.0.1 ，加上他是 A Class 的網路迴圈，因此就會得到上面的那一行！同時，我的預設通訊閘自然選擇可以連上 Internet 的 ppp0 那塊，所以也就成為 default 那一行囉！無論如何，我的 route 可以這樣就設定妥當沒有問題！

最常發生在這個地方的情況就是有點像底下的樣子：
[root @test /root]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
140.116.141.253 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.1.2 0.0.0.0 UG 0 0 0 eth0

發現哪裡有問題了嗎？對啦！那個 default 怎麼 gateway 為 192.168.1.2 呢？對啦！唯一有問題的地方就是在那兒！因為預設的 GATEWAY 變成了 192.168.1.2 這個私有 IP ，自然無法連接上 Internet ，那麼當你使用『 ping -c 5 202.1.237.21 』當然也就會顯示出 out 的 IP 為 192.168.1.2 ，呵呵！完全連不出去！怎麼辦？！很簡單啦！就是直接修改 /etc/sysconfig/network 這個檔案，將裡頭的 GATEWAY 或 GATEWAYDEV 的設定修正一下，就可以啦！加油！！

步驟四：確認 DNS 的 IP 設定
如果通過上面的問題確認，這個時候你的情況應該是：
  1. 網路卡與室內的連線材料都是好的；
  2. 並且區域網路內的電腦都可以互通；
  3. 同時，adsl-start 已經正確的工作了；
  4. ping IP 可以 ping 的到，但是還是沒有辦法連上網路。
該如何是好！？嘿嘿！這時就需要注意你的 DNS 設定了！通常，如果是 DNS 設定的問題的時候，發生的現象是這樣的：（我們以雅虎站 tw.yahoo.com， IP：202.1.237.21 來說明）
  • 以 IP 來 ping 雅虎有資料可以傳遞：
    有點像這樣：
    [root @test /root]# ping -c 5 202.1.237.21
    PING 202.1.237.21 (202.1.237.21) from 211.74.152.23 : 56(84) bytes of data.
    64 bytes from 202.1.237.21: icmp_seq=0 ttl=246 time=103.6 ms
    64 bytes from 202.1.237.21: icmp_seq=1 ttl=246 time=105.3 ms
    64 bytes from 202.1.237.21: icmp_seq=3 ttl=246 time=112.8 ms
    64 bytes from 202.1.237.21: icmp_seq=4 ttl=246 time=87.7 ms
    64 bytes from 202.1.237.21: icmp_seq=5 ttl=246 time=92.0 ms

    --- 202.1.237.21 ping statistics ---
    6 packets transmitted, 5 packets received, 16% packet loss
    round-trip min/avg/max = 87.7/100.2/112.8 ms

  • 以 領域名稱 來 ping 卻沒有回應：
    有點像這樣：
    [root @test /root]# ping -c 5 tw.yahoo.com
    ping: unknown host tw.yahoo.com
這時就需要改變你的主機的 DNS 設定了！你可以修改 /etc/resolv.conf 檔案：
[root @test /root]# vi /etc/resolv.conf
nameserver 168.95.1.1
nameserver 139.175.10.20
nameserver 163.28.113.1

上面只是一個簡單的表示方法，你的主要的 DNS 主機為 168.95.1.1 （Hinet的 DNS 主機），而備用的 DNS 則為 139.175.10.20 及 163.28.113.1 這兩個。何謂備用的 DNS 主機呢？這是由於 168.95.1.1 可能會因為某些正常或不正常原因而停止服務的時候，則你的主機只要偵測不到主要 DNS 主機，將會繼續往下尋找另一個 DNS 主機，直到沒有 DNS 主機為止。通常我至少都會設定兩個以上。

    那如果是 windows 端的設定呢？常常初學者會搞錯的地方就是在 windows 的設定了！要注意：Windows 端的 DNS 設定與主機端 /etc/resolv.conf 的內容相同即可！很多初學者都以為 TCP/IP 內的 DNS 主機是填上自己的 Linux 主機，這是不對的（除非你自己的 Linux 上面有 DNS 服務）！你只要填上你的 ISP 給你的 DNS 主機 IP 位置就可以了！
步驟五：NAT 功能( 或 IP 分享器 )是否正常
NAT 無法正確的工作原因有很多，不過，如果你確定你的區域網路連線已經正常，而且主機可以正確的連上 Internet，另外，用戶端的 DNS 設定也是正確的（這一步常常有人搞錯！），那麼可能發生的問題大概就是沒有將 IPv4 打開吧！雖然 /etc/sysconfig/network 當中已經設定了FORWARD_IPV4=yes 的項目，但是仍然有可能沒有開啟這一個項目，那麼就以下面的指令來開啟吧！
echo 1 > /proc/sys/net/ipv4/ip_forward
你可以將這個指令寫入 net.sh 裡面，或者是直接寫在 /etc/rc.d/rc.local 這個檔案中。另外，還有一點，就是你的 GateWay 設定錯誤了！這個在上面的 network 檔案說明中已經提到了，你可以在詳細的看一看！或者是使用 route -n 這個指令來察看一下你的 route table （路由表）例如：
[root @test /root]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.2 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
172.16.11.8 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 172.16.11.8 0.0.0.0 UG 0 0 0 ppp0
仔細看到上面喔：
  • 第六行顯示你的對內網域為 192.168.1.0 這一個，且在 Iface 的地方，顯示了你的界面卡使用的是 eth0 這一個界面卡；
  • 另外，你的對外通訊閘（就是最後一行，由於是對外，所以會寫出 0.0.0.0 的 Destination ）是以 172.16.11.8 這一個，且你的介面是 ppp0 這一個！
瞭解了嗎？對內與對外的 route table 是不一樣的，如果你的對外 Iface 顯示 eth0 的話，那就表示你的路由設定錯誤了！這時你就必須要修改一下你的 /etc/sysconfig/network 檔案囉！然後再以
/etc/rc.d/init.d/network restart
來重新啟動！
除了這些問題之外，你的 ipchains 是否正確的工作呢？而若使用 iptables 的話，那是否也是正確的工作呢？這都需要注意的！而在 Red Hat 7.X 的版本之後，由於 ipchains 與 iptables 並存的環境下，會有問題發生，因此你必須取消任何一個防火牆機制才行！如果對於 ipchains 與 iptables 不是很熟悉的話，可以看一下這一篇討論：
http://redhat.ecenter.idv.tw/bbs
我也將他收錄下來了，你可以來底下看一下：
小州先生的 iptables 相關 NAT 與安全防護說明
好了！除了這些問題之外，還有一個小問題，就是發生在 Windows 的系統中，可能會有 MTU 的問題存在，也就是說，可能有部分的網站你沒有辦法連上去，那要如何是好？你可以看一下底下這一篇解決的方法喔！修改一下你的 MTU 吧！
MTU 修改法

步驟六：ADSL 數據機或 router 的問題
在你確認了上面的幾個問題點之後，大概已經可以讓你的網路暢通了！不過，如果還是沒有辦法連上 Internet 呢？那就很有可能是外部的問題了！我們需要注意的大概是這樣：
  1. ADSL 的 modem 燈號是否都是正常的？如果不正常的話，先處理 modem 吧！
  2. 連接到中華電信的 gateway 是否正常？這可以從 ifconfig 當中得到的資訊，去 ping 那個 gateway 試試看！再不然的話，直接打電話到中華電信的機房去詢問一下是否有問題；
  3. 是否有部分的 router 出現問題了：
基本上，前兩點都很好解決，直接看一下 ADSL 的燈號就可以知道是否正常了！第三點才是我們這裡所要探討的！萬一你從成大要連線到你高雄家中的以 seednet 作為 ISP 的你的主機時，你可以使用 traceroute 這樣做：
[root @test /root]# traceroute tsai.adsldns.org
traceroute to tsai.adsldns.org (211.74.251.208), 30 hops max, 38 byte packets
1 140.116.44.253 (140.116.44.253) 7.373 ms 8.732 ms 9.560 ms
2 203.72.191.42 (203.72.191.42) 0.932 ms 1.050 ms 0.716 ms
3 203.72.191.218 (203.72.191.218) 0.906 ms 1.209 ms 0.867 ms
4 R56-161.seed.net.tw (139.175.56.161) 2.229 ms 1.877 ms 2.154 ms
5 R58-38.seed.net.tw (139.175.58.38) 3.283 ms 3.639 ms 5.303 ms
6 br011008.seed.net.tw (139.175.11.8) 4.344 ms 3.941 ms 3.602 ms
7 swks251-208.adsl.seed.net.tw (211.74.251.208) 50.058 ms 52.567 ms 53.109 ms
在這樣的過程中，你就可以知道，你向你家中要求的資料封包是怎樣傳送的！而一個一個的去瞭解到底你的網路傳輸速度是在哪一個環節被擋了下來而有延遲的問題！又例如我從家裡連線到雅虎的網站時，資料封包時如何傳送的呢？例如下面的說明：
[root @test /root]# /usr/sbin/traceroute tw.yahoo.com
traceroute to tw.yahoo.com (202.1.237.21), 30 hops max, 38 byte packets
1 172.16.11.8 (172.16.11.8) 46.181 ms 45.028 ms 39.722 ms
2 139.175.15.1 (139.175.15.1) 37.972 ms 36.554 ms 40.228 ms
3 R58-194.seed.net.tw (139.175.58.194) 45.332 ms 46.370 ms 46.140 ms
4 R58-90.seed.net.tw (139.175.58.90) 46.814 ms 55.286 ms 46.401 ms
5 211.22.41.174 (211.22.41.174) 46.326 ms 57.491 ms 45.398 ms
6 211.22.35.230 (211.22.35.230) 46.813 ms 57.740 ms 46.117 ms
7 211.22.35.169 (211.22.35.169) 46.319 ms 51.316 ms 52.549 ms
8 203.69.65.65 (203.69.65.65) 46.342 ms 46.185 ms 58.698 ms
9 * * *
最後面出現了 * 的符號，這表示從 203.69.65.65 這一個 router 到下一個 router 的過程中可能有點小問題，所以造成了你的網路有點不是很正常的情況發生！這時你就必須要去瞭解下原因了。像早先新竹的一條光纜被挖斷的時候，由於那條光纜是主要的網路幹道之一，所以被挖斷了，將使得資料封包必須經過東部的以及備份的網路流量較小的備援網路系統來處理，所以也就造成大塞車的問題了！另外，本站前一陣子由於教育部的 UPS 在進行維護的工程，結果也是導致成大部分的網路流量受阻，造成我們的網友無法連線進來的結果，你可以到首頁看一下在 2001/12/6-10 日之間的公告，這樣的檢驗也可以讓我們瞭解到網路流量的瓶頸喔！
步驟七：主機服務是否關掉了與服務權限的問題
另外一個常見的問題是，無法登入主機執行『某些』功能，也就是說，你可以 ping 的到網路上的某部主機，但是就是無法執行這個主機的某些特定的功能，例如 FTP, WWW, mail 等等。以我們的主機為例，我們的主機僅提供 mail 及 www 的服務，因此你使用 telnet 及 ftp 都是沒有用的！所以囉，你必須先去瞭解到該主機提供的服務才行！
那如果是你的主機呢？最常見到的就是 Red Hat 7.X 版中， ftp 與 telnet 已經預設不開放了！那你當然無法連接到你的主機裡面！這時，就必須要到 /etc/xinetd.d 去修改幾個服務的設定，以 telnet 為例，你可以在 /etc/xinetd.d/telnet 中看到如下的咚咚：
[root @test /root]# vi /etc/xinetd.d/telnet
service telnet
{
disable = yes
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
看看上面，請將 disable = yes 改成 disable = no 就可以開啟啦！然後再以 /etc/rc.d/init.d/xinetd restart 來啟動你的 telnet 服務！不過，基本上也有可能是 firewall 擋住了你的服務通道，這時，就需要先開啟防火牆了！
還有一個要檢查的是各個檔案或者是程序的權限了！例如你的 /etc/hosts.allow 中是否有開啟？你的 mail server 是否有設定 relay ？你的 httpd.conf 中是否有開放 PHP 或者是 MySQL 的服務，或者是其他相關的 CGI 程式執行的可行性？你的 FTP 是否有開放匿名登入？等等等，都是需要特別的檢查的，不過，這都屬於一般性的 FAQ 了，這裡就不多做說明。
2002/07/31 以來統計人數


限制 Linux 對外連線的埠口( port number )
最近更新日期：2002/08/02
什麼是埠口( port )： /etc/services, 安不安全,
如何觀察埠口： netstat, 刪除已建立的連線, nmap,
如何關閉或啟動一個埠口： 啟動或關閉服務, 啟動或關閉 daemons 的路徑,
設定開機時啟動的方法： 開機啟動的設定, 系統必備的服務,
安全性： 關閉所有對外開放的 port

什麼是埠口( port )：
在開始這個章節之前，我們先來聊一聊什麼是 port 呢？常常在網路上聽說『我的主機開了多少的 port ，會不會被入侵呀！？』或者是說『開那個 port 會比較安全？又，我的服務應該對應什麼 port 呀！？』呵呵！很神奇吧！怎麼一部主機上面有這麼多的奇怪的 port 呢？這個 port 有什麼作用呢？！
還記得我們在網路基礎裡頭提到的 TCP/IP 資料吧？對啦！那個 TCP 在傳送資料的時候，不是會填有來源與目的之 IP 及 port 嗎？在這裡你可以這樣想，由於每種網路的服務功能都不相同，因此有必要將不同的封包送給不同的服務來處理，所以囉，當你的主機同時開啟了 FTP 與 WWW 服務的時候，那麼別人送來的資料封包，就會依照 TCP 上面的 port 號碼來給 FTP 這個服務或者是 WWW 這個服務來處理，當然就不會搞亂囉！（註：嘿嘿！有些很少接觸到網路的朋友，常常會問說：『咦！為什麼你的電腦同時有 FTP、WWW、E-Mail 這麼多服務，但是人家傳資料過來，你的電腦怎麼知道如何判斷？電腦真的都不會誤判嗎？！』現在知道為什麼了嗎？！對啦！就是因為 port 不同嘛！你可以這樣想啦，有一天，你要去銀行存錢，那個銀行就可以想成是『主機』，然後，銀行當然不可能只有一種業務，裡頭就有相當多的窗口，那麼你一進大門的時候，在門口的服務人員就會問你說：『嗨！你好呀！你要做些什麼事？』你跟他說：『我要存錢呀！』，服務員接著就會告訴你：『喝！那麼請前往三號窗口！那邊的人員會幫您服務！』這個時候你總該不會往其他的窗口跑吧？！ ^_^""這些窗口就可以想成是『 port 』囉！所以啦！每一種服務都有特定的 port 在監聽！您無須擔心電腦會誤判的問題呦！）
除此之外，還記得我們在 網路基礎 那一篇當中稍微提到，如果需要進行網路連線的時候，那個重要的三向交握( Three-Way Handshake )就不能不理解一下，底下我們以 Study Area 裡面的解釋來進行說明：
  • 每一個 TCP 連線都必須由一端(通常為 client )發起請求這個 port 通常是隨機選擇大於 1024 以上的 port 號來進行！其 TCP 封包會將(且只將) SYN 旗標設定起來！這是整個連線的第一個封包；
  • 如果另一端(通常為 Server ) 接受這個請求的話（當然囉，特殊的服務需要以特殊的 port 來進行，例如 FTP 的 port 21 ），則會向請求端送回整個連線的第二個封包！其上除了 SYN 旗標之外同時還將 ACK 旗標也設定起來，並同時時在本機端建立資源以待連線之需；
  • 然後，請求端獲得服務端第一個回應封包之後，必須再回應對方一個確認封包，此時封包只帶 ACK 旗標(事實上﹐後繼連線中的所有封包都必須帶有 ACK 旗標)﹔
  • 只有當服務端收到請求端的確認( ACK )封包(也就是整個連線的第三個封包)之後﹐兩端的連線才能正式建立。這就是所謂的 TCP 連線的‘三段式交握( Three-Way Handshake )’的原理。
經過三向交握之後，呵呵！你的 client 端的 port 通常是高於 1024 的隨機取得的 port 至於主機端則視當時的服務是開啟哪一個 port 而定，例如 WWW 選擇 80 而 FTP 則以 21 為正常的連線通道！
  • 總共有多少埠口？哪些是保留的 port ？
    我想，你或許會很好奇，ㄟ∼那麼通常一般的主機會有多少個 port 呢？！正常來說，所有的 port 是由 1 ~ 65535 這麼多個啦！好啦，那麼我們在 帳號管理 那裡面也曾經說過，為了 Linux 系統本身，所以會有些保留給系統使用的 ID 號碼，那麼在 port 上面有沒有這些保留的咚咚呢！？賓果！答對了！就是有保留的 port ！一般而言，只有 root 才可以使用 1 ~ 1023 以內的 port ，這些 port 就是特殊的埠口，是保留給系統來使用的！至於一般的使用者則僅能使用大於 1024 以上的 port 來進行網路的連線動作！
  • 特殊的 port ？ /etc/services ？
    好了，那麼你應該又會說，那麼這些保留的 port 有什麼特殊的功能呢？！首先，這些 port 通常只有 root 才能啟動，而目前在 Internet 上面流行的幾個服務之封包都有固定使用的埠號，也就是說，如果你要連上某個服務的時候，就必須要使用特殊的埠口才行，例如我們常常聽到的 FTP 正常就要使用 port 21 ，而 telnet 就要使用 port 23 囉！還有哪些常常聽到的埠號呢？例如 WWW 的 port 80 ，而 Proxy 的 port 3128 等等！好了，那麼如果你沒有將這些 port 保留起來，萬一被系統不小心的隨機給他丟給使用者來使用連線，呵呵！那麼你的服務不就無法啟動囉！？
    另外，還必須要知道一件事情，剛剛提到了那麼多的服務與 port ，那麼我的 Linux 怎麼知道那個 port 對應哪一個服務來顯示給我知道呢？例如 Linux 常用網路指令裡面提到的 netstat 的功能，使用他之後，竟然可以告訴我那個服務名稱！嘿嘿！不要太害怕！那也沒有什麼了不起的啦！就是在 /etc/services 就可以找到 port 與對應的服務的相關性囉！你可以進去看一看裡面的大概內容呢！
    [root @test /root]# vi /etc/services
    ftp-data 20/tcp
    ftp-data 20/udp
    ftp 21/tcp
    ftp 21/udp
    ssh 22/tcp # SSH Remote Login Protocol
    ssh 22/udp # SSH Remote Login Protocol
    telnet 23/tcp
    telnet 23/udp
    smtp 25/tcp mail
    smtp 25/udp mail
    domain 53/tcp nameserver # name-domain server
    domain 53/udp nameserver
    bootps 67/tcp # BOOTP server
    bootps 67/udp
    bootpc 68/tcp # BOOTP client
    bootpc 68/udp
    http 80/tcp www www-http # WorldWideWeb HTTP
    http 80/udp www www-http # HyperText Transfer Protocol
    hostname 101/tcp hostnames # usually from sri-nic
    hostname 101/udp hostnames # usually from sri-nic
    pop2 109/tcp pop-2 postoffice # POP version 2
    pop2 109/udp pop-2
    pop3 110/tcp pop-3 # POP version 3
    pop3 110/udp pop-3
    sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
    sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
    auth 113/tcp authentication tap ident
    auth 113/udp authentication tap ident
    sftp 115/tcp
    sftp 115/udp

    這個 /etc/services 檔案可得好好的照顧呀！還有，你不知道的幾個主要的 port 對應的服務也可以在裡面找到呢！當然囉，萬一在這個檔案裡面沒有提到的服務對應的 port ，嘿嘿！那麼使用 netstat 自然也就沒有辦法顯示出該服務的名稱嚕！注意：這個檔案有時會被修改的較不安全，有必要的時候，可以將他的屬性以 chattr 來修改成不可變動呦！

  • 安全不安全？
    那麼瞭解了這些 port 之後，再來你應該還會問到一個問題呀！那就是『我怎麼知道哪一個 port 比較安全？』這裡可能要先請您瞭解一下所謂的『 port 』與『 服務 』對於『 安全 』的相關性！真正影響網路的安全的並不是 port 這個東西，而是將 port 啟動的那個服務才是重點！舉個例子來說好了，你應該偶而會聽到『 Wu-ftpd 這個服務不安全，建議大家改用 proftp 』對吧！請注意呦！那個 Wu-ftpd 與 proftp ( 這兩個都是套件的名稱 )都是使用 port 21 這個埠口！嘿嘿！但是 proftp 就是比 wu-ftp 稍微安全一點！曉得了嗎？沒錯！對於安全真正有危害的是『某些不安全的服務』而不是『開了哪些 port 』才是！基本上，沒有必要的話，一些你想不到或者用不到的 port 都把他關掉了吧！畢竟沒有開口總比開了口再來防堵要安全的多吧！！ ^_^""
如何觀察埠口： netstat, 刪除已建立的連線, nmap,
好了，我們現在知道這個 port 是什麼鬼東西了，再來就是要去『看他到底在幹啥？』對吧！沒錯！再來就是要來瞭解一下，我們的主機到底是開了多少的 port 呢？如同我們前面說的，你得要先瞭解一下，我們的『服務』跟『 port 』對應的檔案是哪一個？再提醒一次呦！是『 /etc/services 』 啦！好了，那麼常見的 port 對應的服務有哪些呢？大概有這些啦！
服務名稱　　　port 號　　　常見套件名稱　　　　　　　建議
==================================================================================
ftp　　　　　 21　　　　　 Wu-ftp, proftp　　　　　　不要開放他！
telnet　　　　23　　　　　 telnet　　　　　　　　　　不要開放他！
smtp　　　　　25　　　　　 sendmail, postfix　　　　 除非必要，不然不要啟動！
http　　　　　80　　　　　 apache　　　　　　　　　　除非必要，不然不要啟動！
pop3　　　　 110　　　　　 imap 　　　　　　　　　　 除非是 mail 主機，不然不要開放
netbios-ssn　139　　　　　 SAMBA　　　　　　　　　　 除非必要，不然不要啟動！
squid　　　 3128　　　　　 squid　　　　　　　　　　 除非必要，不然不要啟動！
mysql　　　 3306　　　　　 MySQL　　　　　　　　　　 除非必要，不然不要啟動！

當然還不只這些哩，更詳細的資訊你應該到你的 Linux 主機之下的 /etc/services 這個檔案去看仔細！好了，那麼接下來就是要來察看我們主機的 port 囉！如何察看呢？底下我們介紹兩個最常使用的觀測指令：

  • netstst ： 在本機上面以自己的程式監測自己的 port ，無危險；
  • nmap ： 在本機上面，以特殊的偵測程式偵測自己，可能會有違法之虞。
見他的大頭王！怎麼使用 nmap 會違法？呵呵！別擔心，由於 nmap 的功能太強大了，所以很多 cracker ( 怪客，網路上面的閒人 ) 會直接以他來偵測別人的主機，這個時候就可能造成違法啦！只要你使用 nmap 的時候不要去偵測別人的電腦主機，那麼就不會有問題啦！ ^_^"" 底下我們分別來說一說這兩個寶貝吧！
  • 使用 netstat 指令
    如前所述，在做為主機的 Linux 系統中，服務項目是越少越好！這樣可以避免不必要的入侵管道喔！因此，這個時候請瞭解一下您的系統當中，有沒有哪些服務被開啟了呢？要瞭解自己的系統當中的服務項目，最簡便的方法就是使用 netstat 了！這個東西不但簡單（每一部 Linux 機器當中預設都會安裝的套件喔！），而且功能也是很不錯的，例如我們在偵測線上 WWW 使用者的人數時，就很需要這個咚咚囉！這個指令的使用方法在 Linux 常用網路功能指令介紹當中提過了，底下我們僅提供如何使用這個工具的方法囉！
    [root @test /root]# netstat
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 20 192.168.1.2:ssh 192.168.1.11:1391 ESTABLISHED
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785

    如上所示，單純使用 netstat 的時候，僅『列出目前已經接通的服務項目與服務名稱』所以你可以看到，由於目前僅有一個 ssh 的連線建立成功，所以就只有顯示出一個 ESTABLISHED （連線中的意思）的項目。上面淺黃色的那一行，表示『有一個 ssh 的服務開啟通道連線中，是由遠端 client 的 192.168.1.11 這個 IP 連接到 192.168.1.2 的主機上面的這個 IP ，而 Client 端連線的通道是以 1391 這個通道連接進入 ssh 的服務中的！』。這裡這個 ssh 所顯示的服務名稱就是在 /etc/services 裡面記載的囉！那如果我需要將所有的項目都列出來呢？例如說：有哪些 port 目前正在監聽呢？！
    [root @test /root]# netstat -a
    AActive Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:pop3 *:* LISTEN
    tcp 0 0 *:imap *:* LISTEN
    tcp 0 0 *:ftp *:* LISTEN
    tcp 0 0 *:ssh *:* LISTEN
    tcp 0 0 *:smtp *:* LISTEN
    tcp 0 20 192.168.1.2:ssh 192.168.1.11:1391 ESTABLISHED
    udp 0 0 *:1238 *:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785

    如上所示，加入 -a ( all )就是說將所有在機器上所有的 port 的狀態列出的意思，不過，服務的名稱已經使用 /etc/services 裡面的名稱了，而不是使用 port 的數字！如上所示，目前我主機上面的服務共開啟了：『 pop3、imap、ftp、ssh、smtp 』等服務（就是在 tcp 封包裡頭的具有 LISTEN 的那幾個咚咚囉！）至於已經建立的服務就只有 ssh 這一個囉！那如果我想要知道 port 的號碼呢？呵呵，就使用底下的指令吧！
    [root @test /root]# netstat -an
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
    tcp 0 20 192.168.1.2:22 192.168.1.11:1391 ESTABLISHED
    udp 0 0 0.0.0.0:1238 0.0.0.0:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785

    如上所示，我接通的服務通道只有 22 這一個，而其他的你可以參照上面的指令輸出結果來對照，所以你就可以知道囉：pop3 為 110 而 imap 為 143 呵呵！就是這樣囉！因此，透過此一指令，就可以輕易的瞭解目前主機的運作狀況與服務狀態囉！當然囉， netstat 的用途不止於此，您可以使用 man netstat 來查閱一番喔！相信對你的主機會有更大的瞭解呦！

    • 使用 netstat 配合 kill 刪除已建立的連線：
      相信有不少的朋友都會有這個困擾，就是要怎樣刪除已經建立的連線呢？因為總有些不速之客會連到你的主機來進行一些破壞的工作！或者是你根本不想讓對方連線過來！呵呵！還記得 資源管理 裡面提到的幾個常用的指令吧！？那就是找出那個連線程序的 PID ，然後給他 kill 掉就是了！簡單呀！不過，大問題是『我要怎樣找出連線的 PID 呀！？』呵呵！由於 PID 的管理與整體的系統資源有關，這個時候，雖然可以使用 netstat 來觀察 PID ，不過只有 root 可以觀察到連線狀態的 PID 號碼呦！( 註：還記得資源管理提及的 PID 概念嗎？就是說，在 Linux 系統之內，每個『程序』系統都會給予一個號碼來管理！這個就是 PID 囉！)
      [root @test /root]# netstat -ap
      Active Internet connections (servers and established)
      Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
      tcp 0 0 *:ssh *:* LISTEN 32149/sshd
      tcp 0 284 140.116.141.19:ssh 192.168.1.11:1391 ESTABLISHED 24751/sshd
      Active UNIX domain sockets (servers and established)
      Proto RefCnt Flags Type State I-Node PID/Program name Path
      unix 7 [ ] DGRAM 944 509/syslogd /dev/log
      unix 2 [ ] DGRAM 3035915 16648/xinetd
      unix 2 [ ] DGRAM 739227 5951/pppoe
      unix 2 [ ] DGRAM 739189 5949/pppd
      unix 2 [ ] DGRAM 1070 628/crond
      unix 2 [ ] DGRAM 953 514/klogd
      unix 2 [ ] STREAM CONNECTED 690 1/init [3]

      看到上面那個淡黃色的連線建立的網路狀態了嗎？嘿嘿！最後面一欄就是顯示那個 PID/Program name ，那個 PID ( 上面是 24751 )也就是我們要來砍掉的啦！這個時候，如果要將該連線砍掉時，就直接以 kill 來做吧！
      [root @test /root]# kill -9 24751

      這樣就能將該連線給他『踢出去』你的主機啦！！ ^_^""

    • 使用 nmap 套件：注意安全！
      在本機上面觀察 port 最好是使用 netstat 啦！因為他安全又可靠！但是，由於可能有某些 port 會尋找不到，或者不曉得那些 port 是幹嘛用的，尤其是 /etc/services 裡頭沒有提到的幾個 port 對應的服務！這個時候怎麼辦？！沒關係，不要緊，我們這個時候可以使用那個很流行的『黑客指令』，就是 nmap 這個東西啦！nmap 的套件說明之名稱為：『Network exploration tool and security scanner』，顧名思義，這個東西是被系統管理員用來管理系統安全性查核的工具！他的具體描述當中也提到了， nmap 可以經由內部自行定義的幾個 port 對應的指紋資料，來查出該 port 的服務為何，所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的！如果你是安裝 Red Hat 7.x 版本的話，那麼這個 nmap 套件應該已經安裝妥當了，萬一沒有這個套件的話，也可以來 這裡 下載去安裝呦！什麼？不知道如何安裝！？該死，看一下 RPM 的指令吧！好了，我們談一談 nmap 的使用吧！
      [root @test /root]# nmap <掃瞄類型> <掃瞄參數> <Hosts 位址與範圍>
      參數說明：
      <掃瞄類型>：主要的掃瞄類型有底下幾種：
          -sT：掃瞄 TCP 封包已建立的連線 connect() ！
          -sS：掃瞄 TCP 封包帶有 SYN 標籤的資料
          -sP：以 ping 的方式進行掃瞄
          -sU：以 UDP 的封包格式進行掃瞄
          -sO：以 IP 的協定 ( protocol ) 進行主機的掃瞄
      <掃瞄參數>：主要的掃瞄參數有幾種：
          -PT：使用 TCP 裡頭的 ping 的方式來進行掃瞄，可以獲知目前有幾部電腦存活(較常用)
          -PI：使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄
          -p ：這個是 port range ，例如 1024-, 80-1023, 30000-60000 等等的使用方式
      <Hosts 位址與範圍>：這個有趣多了，有幾種類似的類型
          192.168.0.100 ：直接寫入 HOST IP 而已，僅檢查一部；
          192.168.0.0/24 ：為 C Class 的型態，
          192.168.*.*　　：嘿嘿！則變為 B Class 的型態了！掃瞄的範圍變廣了！
          192.168.0.0-50,60-100,103,200 ：這種是變形的主機範圍啦！很好用吧！
      範例：

      例題一：掃瞄單一部電腦！
      [root @test /root]# nmap localhost　　　<==沒有加上任何參數，由 nmap 的預設參數來進行掃瞄
      Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
      Interesting ports on vbird.adsldns.org (127.0.0.1):
      (The 1539 ports scanned but not shown below are in state: closed)
      Port State Service
      21/tcp open ftp
      22/tcp open ssh
      23/tcp open telnet
      Nmap run completed -- 1 IP address (1 host up) scanned in 1 second
      由上面可以看出我的系統目前共有 21, 22, 23 這三個 port 開放！而且各 port 對應的服務也被查出來了！

      例題二：掃瞄單一部電腦的較少數 port 號碼！
      [root @test /root]# nmap -p 1024-65535 localhost <==僅掃瞄較少數的 port 啦！
      Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
      Interesting ports on pc510.ev.ncku.edu.tw (127.0.0.1):
      (The 64511 ports scanned but not shown below are in state: closed)
      Port State Service
      3306/tcp open mysql <==只有這個 port 被找出來囉！
      Nmap run completed -- 1 IP address (1 host up) scanned in 11 seconds

      例題三：直接以 Ping 的方式掃瞄數個電腦！
      [root @test /root]# nmap -PT 192.168.1.171-177 <==看到了吧！掃瞄一個區段的活著的電腦！

      Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
      Interesting ports on linux172 (192.168.1.172):
      (The 1536 ports scanned but not shown below are in state: closed)
      Port State Service
      110/tcp open pop-3
      135/tcp open loc-srv
      139/tcp open netbios-ssn
      445/tcp open microsoft-ds
      1025/tcp open listen
      1110/tcp open nfsd-status

      Interesting ports on linux174 (192.168.1.174):
      (The 1537 ports scanned but not shown below are in state: closed)
      Port State Service
      110/tcp open pop-3
      135/tcp open loc-srv
      139/tcp open netbios-ssn
      445/tcp open microsoft-ds
      1025/tcp open listen

      Interesting ports on linux176 (192.168.1.176):
      (The 1537 ports scanned but not shown below are in state: closed)
      Port State Service
      110/tcp open pop-3
      135/tcp open loc-srv
      139/tcp open netbios-ssn
      445/tcp open microsoft-ds
      1025/tcp open listen

      Nmap run completed -- 7 IP addresses (3 hosts up) scanned in 1 second
      瞧！我要偵測的只有七部電腦，所以這七部電腦只會回應給我囉！而其中只有三部有啟動，所以當然就只會有三段回應啦！這個方式蠻適合一次掃瞄你的子網域內的所以電腦呢！ ^_^"

      請特別留意，這個 nmap 的功能相當的強大，也是因為如此，所以很多剛在練習的黑客會使用這個軟體來進行偵測別人的電腦，這個時候請您特別留意，目前很多的人已經都有『特別的方式』來進行登錄的工作！例如以 TCP_Wrappers ( /etc/hosts.allow, /etc/hosts.deny ) 的功能來記錄曾經偵測過該 port 的主機 IP！這個軟體用來『偵測自己機器的安全性』是很不錯的一個工具，但是如果用來偵測別人的主機，可是可能會『吃上官司』的！特別留意！！
    如何關閉或啟動一個埠口： 啟動或關閉服務, 啟動或關閉 daemons 的路徑,
    • 如何啟動或關閉服務？
      既然已經知道了有多少個 port 被啟動或關閉，那麼接著下來當然就是要將一些不安全的服務給他關閉囉！呵呵！那麼該如何關閉呢？請注意：『開或關一個 port 的方式是：開啟或關閉一個服務即可！』例如你要關閉 port 21 這個較為危險的 ftp 的埠口，那麼就是將 wu-ftp 或者是 proftp 關掉就對啦！關掉他自然就連同 port 也關掉囉！ ^_^"" 所以說，當你偵測完了 port 之後，接著下來就是找出該 port 的對應的服務，將該服務給關掉，就會把 port 關啦！嗯！我們來試試看關掉一個 25 port 好了！由於 25 port 是由 sendmail 來進行 smtp 的啟動的，那麼我們就先來啟動他：
      [root @test /root]# /etc/rc.d/init.d/sendmail start
      Starting sendmail: [ OK ]
      [root @test /root]# netstat -an|more
      Active Internet connections (servers and established)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
      tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
      tcp 0 0 192.168.1.2:22 192.168.1.11:3175 ESTABLISHED
      Active UNIX domain sockets (servers and established)
      Proto RefCnt Flags Type State I-Node Path
      unix 8 [ ] DGRAM 944 /dev/log
      unix 2 [ ] DGRAM 3161529
      unix 2 [ ] DGRAM 3160038
      unix 2 [ ] DGRAM 739227
      unix 2 [ ] DGRAM 739189
      unix 2 [ ] DGRAM 1070
      unix 2 [ ] DGRAM 953
      unix 2 [ ] STREAM CONNECTED 690
      看！那個 127.0.0.1:25 出現了！！

      [root @test /root]# /etc/rc.d/init.d/sendmail stop
      Shutting down sendmail: [ OK ]

      那如果要關閉的話，就停止 sendmail 呀！直接以上面的方式關閉呀！這樣就好囉！這樣你再以 netstat -an 看一下，呵呵！ port 25 就被關掉喔！很簡單吧！

    • 啟動或關閉 daemons 的路徑與指令：
      如果你還記得 認識服務 那一篇文章的時候，那麼應該就會記得我們目前的幾個 port 啟動的路徑預設都放置在：
      • /etc/rc.d/init.d
      • /etc/xinetd.d
      這兩個路徑底下，那個 /etc/rc.d/init.d 是以 RPM 來安裝套件的時候，一定會存在的目錄，這個目錄記錄了所有的服務的啟動之 scripts ，這也界是剛剛為何我會以 /etc/rc.d/init.d/sendmail start 來啟動我的 sendmail 服務的原因囉！至於那個 /etc/xinetd.d 目錄的下檔案，就是掛在 xinetd 這個服務底下的服務套件啦！最常見的有 FTP, Telnet, POP3, IMAP 等等，都是由 xinet 統一統籌來進行整理！所以，當你要啟動 telnet 時，就直接到 /etc/xinetd.d 裡面去，然後將 telnet 這個檔案的 disable = yes 改成 disable = no ，然後『重新啟動 xinetd 這個服務！』沒錯！我沒有寫錯！就是 xinetd ！因為我剛剛提過啦，由於 telnet 是由 xinetd 統一統籌的，所以要啟動 telnet 自然就是將 xinetd 重新啟動即可！
      • /etc/rc.d/init.d/xinetd restart
      如何！不難吧！簡單的很！好了，那麼除了直接以檔案名稱來啟動關閉之外，有沒有其他較為簡易的方式來啟動的啦！？當然有！就是使用 service 這個指令說！詳細的說明已經都寫在 好用的系統工具 裡面了，您可得多多的參考參考！例如要重新啟動 xinetd ，可以這麼寫：
      • service xinetd restart
    設定開機時啟動的方法：
    • 開機啟動的設定：
      剛剛提到的都是立刻生效的服務啟動或關閉的方法，那麼有沒有方法可以再開機啟動的時候就設定不要啟動呢？您還記得在 Linux 開機關機程序 那一篇文章嗎？開機的程序在經歷了：
      1. BIOS
      2. MBR
      3. Linux Loader
      4. Kernel, init ( 取得 run-level ),
      5. /etc/rc.d/,
      6. /etc/modules.conf,
      7. /etc/rc.d/rc[0-6].d,
      8. /etc/rc.d/rc.local
      等等程序後，就是開機完畢啦！那個系統就成功的啟動啦！而其中啟動服務的項目在哪裡呢？呵呵！就是在第七步驟，以我為例，通常我都是以文字界面 登入我的系統，文字界面的 run-level 為 3 ，所以這個時候我就可以在 /etc/rc.d/rc3.d 裡頭找到我的服務的啟動項目啦！就是 S 開頭的檔案！這些相關的概念如果忘記的話，請在前往 開機關機程序 那篇文章去讀一讀去！那麼如果不要啟動一些服務的話，很簡單呀！就是將該服務的對應檔案( 指 S 開頭的檔案 )刪除就可以啦！ ^_^""
    但是我要自己一個檔案一個檔案去刪除他嗎？！呵呵！當然不需要啦！ Red Hat 很細心的寫了幾支程式來幫你搞定他！那就是：
    • ntsysv
    • setup
    • chkconfig
    這三支程式的使用方式我已經都介紹過了，這裡就不再囉唆囉！請前往 好用的系統工具 裡頭看看吧！
    • 系統必備的服務項目：
      請注意呦！不是將『所有的服務都關掉就是安全的！』因為系統還有很多的項目是『一定要啟動的！』否則將會反而變的不安全呢！底下列出來一個完全沒有對外開放 port 的，但是系統必需要的服務項目，這些項目請『務必』不要關閉了！
      服務名稱　　　　　　服務內容說明
      ===============================================================================
      atd　　　　　　　　在 例行性命令 裡頭提到的，單一次預約命令執行的服務，務必啟動！
      cron　　　　　　　　在 例行性命令 裡頭提到的，循環執行的命令，務必啟動！
      iptables　　　　　　這個是防火牆軟體，無論如何，先啟動他吧！
      keytables　　　　　設定鍵盤的上面的字母的格式！當然需要讀入了！不然如何控制！
      network　　　　　　你總該不會不想要有網路吧？！所以這個也請啟動囉！
      random　　　　　　　快速的將系統的狀態在隨機的時間內存到映象檔當中，對於系統
                          相當重要！因為在開機之後，系統會迅速的回復到關機之前的狀態！
      syslog　　　　　　　在 系統登錄檔 裡面提過很多次了！相當重要的服務！務必啟動！
      xinetd　　　　　　　對啦！另一個服務管理員！也是必須要啟動的項目之一！
      xfs　　　　　　　　如果你是使用 run-level 為 5 的圖形介面，那麼這個也必須要啟動啦

      沒錯！不要懷疑！只要這些就可以啦！這幾個服務是必須要啟動的！至於其他服務則都先不用啟動！例如 sendmail 啦！其他林林總總的資料，都先擺著！我們會在後續的章節當中提到如何啟動這些服務的啦！

    安全性： 關閉所有對外開放的 port
      在你安裝了 Linux 之後呢，相信有很多的朋友會開始想要作一些很炫的服務，例如 WWW 或者是 mail 亦或是 FTP 的服務，但是，這些服務都有潛在性的危險喔，很多的駭客就是利用你開啟的這些服務來進行網站的破壞！基本上，比較麻煩的是『特洛伊木馬』程式這一類的後門程式，以你的網站做為中繼站去攻擊駭客想要攻擊的目標。所以囉，灌完了 Linux 之後，先將一些不必要的程式或服務移除吧！以保障您的網路安全！其中，更重要的則是將所有的對外的 port 都先關起來！有需要的才開啟！好了，利用我們剛剛提到的幾個方法將你的對外的 port 都關起來吧！
      1. 使用 ntsysv 設定開機時啟動的服務項目：
      [root @test /root]# ntsysv
      只要選擇底下幾個服務即可(注意！我是以 Red Hat 7.2 的文字介面為基礎的)
      atd, cron, iptables, keytables, network, random, syslog, xinetd

      2. 重新開機讓設定生效：
      [root @test /root]# reboot

      3. 觀察目前的 port 開啟多少個？
      [root @test /root]# netstat -an | more
      Active Internet connections (servers and established)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      Active UNIX domain sockets (servers and established)
      Proto RefCnt Flags Type State I-Node Path
      unix 7 [ ] DGRAM 944 /dev/log
      unix 2 [ ] DGRAM 3162963
      unix 2 [ ] DGRAM 739227
      unix 2 [ ] DGRAM 739189
      unix 2 [ ] DGRAM 1070
      unix 2 [ ] DGRAM 953
      unix 2 [ ] STREAM CONNECTED 690

      這樣一來，所有的對外窗口將暫時的全部關閉了！好了，準備要來玩架站囉！一個一個的啟動我們的 port 吧！ ^_^

    2002/08/02 以來統計人數


Linux 網路套件升級
最近更新日期：2002/08/02
為何要升級？：
up2date 的使用： 安裝, 註冊, 使用,
結語：
為何要升級？
不要升級好不好？幹嘛我一定要升級！？在 RPM 與 Tarball 那篇文章裡面對於升級的目的我們已經講得很清楚了，所這裡不再重複說明！只是，是否真的升級就只能利用 RPM 與 Tarball 這兩個手動的方式呢？
我們都曉得在 Windows 底下有個 update 的選項，而在一些防毒軟體的附屬功能中，由於病毒隨時在變種，所以病毒碼也要常常線上更新（Live Update），那麼你曉不曉得 Red Hat Linux 也有線上更新的功能呢？呵呵！答案是有的，那就是 up2date 這個套件了！這個東西很好用的，你只要註冊好了之後，就可以使用 Red Hat 提供的線上更新資訊來更新你的 Red Hat 囉！不過，有一點必須要曉得，由於線上更新主要為更新 rpm 的版本，所以你可要千萬小心，『更新的套件為 rpm 的版本， tarball 的版本是無法藉由 up2date 來更新的』。此外，為了怕有些資訊在你的系統操作過程中遺失了，那麼就必須要先以 rpm --rebuilddb 建議資料庫囉。
額外附加一點，目前 Red Hat 已經針對不同的用戶進行 Server 的流量限制，所以如果像我們這一種免費的用戶，有可能會比較難登入 Server 去進行更新的動作呦！這點請特別留意囉！
up2date 的使用：
    其實 up2date 實作的過程很簡單，只要：
    1. 下載並更新 up2date 與 rhn_register 套件；
    2. 確定可以登入 Internet ，可能的話，並找尋可支援的近端 proxy ；
    3. 執行 rhn_register 線上註冊；
    4. 執行 up2date 更新套件。
    這樣就可以囉。不過有一點必須說明一下，up2date 套件在 7.2 以後已經預設安裝好在你的系統上面了，但是舊版本的 Red Hat 本身並沒有 up2date 的套件（例如 Red Hat 6.1），所以你必須先安裝 up2date 套件。但是，由於 up2date 套件使用之前必須先登入 Red Hat 總公司，所以你必須先註冊才行。 Red Hat 就提供一個註冊程式，即為 rhn_register ！因此，整個流程就是先註冊，然後就可以線上更新囉。此外的此外，由於 rpm 套件只有 root 可以來變更系統，所以『以下的指令都必須以 root 的身份來安裝』
    • 下載並更新 up2date 與 rhn_register 套件：
      各版本（Red Hat 6.2 - Red Hat 7.2）詳細的 up2date 與 rhn_register 在 Red Hat 網頁 上，你可以直接去下載，如果是 Red Hat 6.1 怎辦？呵呵，你可以在這裡下載 Red Hat 6.1 的 up2date 套件。另外，這裡也有 Red Hat 7.1 的套件。安裝的過程如下：
      Red Hat 6.1：
      1. 將 up2date_6.1.tar.gz 解壓縮，會產生 up2date_6.1 裡面有 i386 及 srpm 兩個目錄；
      2. 你可以直接將 i386 裡面的 *.i386.rpm 全部安裝，順序依序為：
        • python-popt...
        • openssl-0.95.......
        • python-1.5.2......
        • python-xmlrpc..
        • usermode-1.37...
        • pam-0.72...
        • pygnome-libglade
        • rhn_register...
        • gnupg...
        • up2date...
        注意喔，由於有些套件有屬性相依的疑問，所以必須依序安裝才可以。此外，若你之前已經安裝過該套件（使用『 rpm -q 套件名稱 』來查詢），則以『 rpm -Uvh 套件名稱』來升級，否則需要用『 rpm -ivh 套件名稱』來安裝。由於擔心有版本不合的疑問，所以我也將 SRPM 附上，你可以使用 rpm --rebuild 來重新編譯一次！
      Red Hat 7.1：
      1. 將 up2date_7.1.tar.gz 解壓縮；
      2. 將裡頭的四個 SRPM 檔案以 rpm --rebuild * 來重新編譯打包一次；
      3. 到 /usr/src/redhat/RPMS/i386 這個目錄底下，將剛剛編譯完成的六個檔案安裝起來：
        • python-popt
        • python-xmlrpc
        • rhn_register-2.7.2-7.x.8.i386.rpm
        • rhn_register-gnome-2.7.2-7.x.8.i386.rpm
        • up2date-2.7.11-7.x.1.i386.rpm
        • up2date-gnome-2.7.11-7.x.1.i386.rpm
        這樣就算安裝完畢了！
    • 註冊：
      註冊可以使用 http://rhn.redhat.com/network 這個網址的功能來註冊，或者直接以底下的方式在你的 Linux 主機來註冊：
      • 先重建一下你的 rpm 套件資料庫：
        rpm --rebuilddb
      • 首次執行 rhn_register：
        [root@tsai /root]# rhn_register
        This is the first time you have ran rhn_register.
        If you need special network configuration, such as a web proxy,
        please enter that info here.

        0. enableProxyAuth No
        1. httpProxy
        2. proxyUser
        3. proxyPassword

        Enter number of item to edit <return to exit, q to quit without saving>: 1 <==我有 proxy
        Attribute Name: httpProxy
        Comment: HTTP proxy in host:port format, e.g. squid.redhat.com:3128
        Current value:
        <return for default, enter two spaces and return to clear>
        New Value: proxy.ncku.edu.tw:3128
        This is the first time you have ran rhn_register.
        If you need special network configuration, such as a web proxy,
        please enter that info here.

        0. enableProxyAuth No
        1. httpProxy proxy.ncku.edu.tw:3128
        2. proxyUser
        3. proxyPassword

        Enter number of item to edit <return to exit, q to quit without saving>: <==按 enter 離開

        在上面中，由於我有 proxy ，所以選擇 1 ，如果你沒有的話，就選 0 吧！上面的紀錄的資訊都會被寫入到這個目錄當中的檔案內： /etc/sysconfig/rhn ，所以萬一你寫錯了資訊，請到這個目錄當中進行修改吧！！

      • 再次執行 rhn_register：
        然後，再執行一次 ：rhn_register （請以 root 的身份喔）這次由於需要連線到 Red Hat 公司，所以時間很久，請稍待喔！
        這裡請輸入你的使用名稱，如果已經註冊過，那麼這裡就要填寫正確，如果從未註冊過，那麼這裡就請填寫你要的使用者名稱與密碼。並且，請將你的使用者名稱與密碼『記下來』，以後可以直接使用，而不需要底下的步驟囉！
        上面會列出你的軟硬體資訊，這個時候請注意看一下你的軟硬體設定是否正確！注意，如果到這一步結果發現有問題時，通常是找不到你的系統資訊，這時，請以 rpm --rebuilddb 來重建你的資料庫。
        這樣就註冊完畢了，開始使用 up2date 吧！
      • 啟動註冊碼：
        /usr/bin/gpg --import /usr/share/rhn/RPM-GPG-KEY
    • 開始使用 up2date 功能：
      其實，使用 man up2date 就可以知道很多的功能囉！不過，這裡列出幾個可能比較常用的：
      [root @test /root]# up2date -l　　　　　<==列出所有可以升級的套件
      [root @test /root]# up2date --showall 　<==列出你的版本中，有沒有可以升級的套件
      [root @test /root]# up2date -i packages <==直接升級 packages 那個套件！例如：
      [root @test /root]# up2date -i gdb　　　<==直接連到 Red Hat 主機升級 gdb 這個套件
      [root @test /root]# up2date -i u　　　　<==全部的套件升級！等於升級你的 Red Hat ！
結語：
其實我一直覺得 up2date 是很方便沒錯，而且對於 RPM 套件討人厭的相依屬性都可以經由 Red Hat Server 的自行判斷來進行無痛升級！但是對於我們這些使用 ADSL 或者是對國外連線很慢的系統來說，使用 up2date 可能是一件很痛苦的事情！！Why？這是因為 up2date 的功能是將你的網路直接連到美國 Red Hat 總公司，這可是跨洋的線路呢，你要下載的速度有多快呢？我們又不是在美國使用這一個功能.....所以，除非是在網路並沒有很繁忙的時候，否則，我們還是乖乖的去找一些臺灣已經有人幫忙捉下來的檔案，還是比較快一些.....
無論如何，能夠上網之後，第一件事情，請您趕快進行 Linux 系統之套件的升級吧！以免有些漏洞造成你系統整體的問題！
2002/08/02 以來統計人數


多 IP 與 Router 的架設
最近更新日期：2002/08/09
多個 IP 在一塊網路卡上面： 為何多 IP, 如何實作, command line, 參數設定檔, 注意事項,
Router： 什麼是 Router, 為何需要 Router, 觀察與修改路由,
一個 Router 架設範例：
建議：
多個 IP 在一塊網路卡上面：
  • 為何需要多 IP ？
    好好一塊網路卡，為何需要多個 IP 呢？難道是鳥哥沒事找事作？！嘿嘿！我又不是閒的發慌，幹嘛沒事找事作呢？！其實多個 IP 是有其必要性的啦！在什麼時候『可能』會用的上呢？這樣說好了現在你的區域網路當中，由於有些朋友一開始設定錯誤，結果一個 Hub 卻接了兩個網域，分別是192.168.1.xx 及 192.168.0.xx ，但是你的朋友們卻又都不想改變他們的網路設定，這個時候怎麼辦？『因為不同的網域之間不能直接互相溝通』這個概念還沒忘記吧？！所以 192.168.1.xx 及 192.168.0.xx 就不能直接溝通資料囉！因此，你如果要與 192.168.1.xx 溝通，你的 IP 就必須設定在該網域內，但這個時候另一個網域 192.168.0.xx 的資料卻又無法溝通了！所以你就必須要常常變更 IP 囉！那你又不想常常變更你的 IP ，呵呵！這個時候多個 IP 就派上用場啦！你可以在一塊網路卡上面同時設定 192.168.0.xx 及 192.168.1.xx 的 IP ，如此則你的系統可同時接受來自這兩個不同網域的資料流！嘿！還不錯吧！
    除此之外，其實還有很多的用的到多個 IP 的地方啦！例如 Router 的設定，有時後也會使用的到的！另外，在測試系統的時候，也常常會使用到多 IP 的設定！基本上，多 IP 的用途還不少就是了！
  • 如何實作？
    其實多個 IP 在一塊網路卡上面的設定很簡單啦！就只要記得一個概念就夠了，那就是網路界面卡( Network Interface Card, NIC )與網路界面( Interface )不一樣的東西！一個是實體界面，一個則是連線的虛擬界面，兩者並不相同！但是 Interface 必需要架構在 NIC 之上才行！好了！我們來談一談實際面吧！你應該知道 Linux 第一塊網路卡的代號為 eth0 吧？！OK！那麼在這個網路卡上面的第一個虛擬界面( Interface )的代號是什麼呢？那就是 eth0:0 囉！第二個虛擬界面則為 eth0:1 .....以此類推！以要啟動 eth0:0 時， eth0 務必要被啟動！而當關閉 eth0 時，其所有相關的 eth0:n ( n 是數字，0, 1....)將會全部被關閉！這就是剛剛上面提到的『虛擬界面是架構在實體界面之上』的意思！好了！那麼設定的方式主要又可以分為直接以『 command line 』手動啟動，也可以使用『 裝置設定檔案 』來設定！分別說明如下囉！
    • command line 手動設定多個 IP ：
      在 Linux 網路常用指令篇 裡面我們曾經提到 ifconfig 可以用來達成多個 IP 的設定功能！他的主要設定語法與範例為：
      [root @test /root]# ifconfig <device> <ip> netmask <nip> broadcast <bip> <action>
      參數說明：
      <device>　　：裝置代號，例如 eth0, eth0:0, eth0:1....
      <ip>　　　　：該裝置代號的 IP ！
      netmask　　：該裝置代號的子網域遮罩設定參數名稱
      <nip>　　　：就是實際的 netmask ，例如 C Class 則為 255.255.255.0
      boradcast　：廣播位址設定參數
      <bip>　　　：亦即實際的廣播位址
      <action> 　 ：動作！例如 up 啟動與 down 關閉！

      範例：
      1. 修改一個 eth0 的 netmask ，由原先的 255.255.255.0 變成 255.255.255.128
      [root @test /root]# ifconfig eth0
      eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 <=原先的！
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:5972569 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6263943 errors:0 dropped:0 overruns:0 carrier:0
      collisions:1331 txqueuelen:100
      RX bytes:557413197 (531.5 Mb) TX bytes:2810197942 (2680.0 Mb)
      Interrupt:10 Base address:0x6100
      [root @test /root]# ifconfig eth0 netmask 255.255.255.128
      [root @test /root]# ifconfig eth0
      eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.128<=修改後
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:5972745 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6264165 errors:0 dropped:0 overruns:0 carrier:0
      collisions:1331 txqueuelen:100
      RX bytes:557431640 (531.6 Mb) TX bytes:2810221471 (2680.0 Mb)
      Interrupt:10 Base address:0x6100
      [root @test /root]# ifconfig eth0 netmask 255.255.255.0<==測試完後記得改回來！

      2. 新增一個網路界面 eth0:0 ，而且他的 IP 為 192.168.0.2
      [root @test /root]# ifconfig eth0:0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255 up
      [root @test /root]# ifconfig eth0; ifconfig eth0:0
      eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:5973506 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6265264 errors:0 dropped:0 overruns:0 carrier:0
      collisions:1331 txqueuelen:100
      RX bytes:557511152 (531.6 Mb) TX bytes:2810327518 (2680.1 Mb)
      Interrupt:10 Base address:0x6100

      eth0:0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      Interrupt:10 Base address:0x6100
      看！很簡單吧！你的虛擬界面就已經作出來了！目前你的 eth0 這塊網路卡上面就有 192.168.1.2 及 192.168.0.2 這兩個界面存在了！此外，這兩個連線界面是使用同一個實體界面卡！信不信？看一下上面 HWaddr 的部分， eth0 與 eth0:0 都是使用同一組 MAC 呢！還記得嗎？每一個網路卡都有一個『獨一無二』的硬體位址，那個就是 MAC 亦是上面顯示的 HWaddr 的部分！既然都是使用同一個 HWaddr ，當然就是指兩個連線界面使用的是同一個實體界面囉！

      不相信的話就來測試一下吧！
      [root @test /root]# ping -c 3 192.168.1.2; ping -c 3 192.168.0.2
      PING 192.168.1.2 (192.168.1.2) from 192.168.1.2 : 56(84) bytes of data.
      64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=482 usec
      64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=188 usec
      64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=196 usec

      --- 192.168.1.2 ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/mdev = 0.188/0.288/0.482/0.138 ms
      PING 192.168.0.2 (192.168.0.2) from 192.168.0.2 : 56(84) bytes of data.
      64 bytes from 192.168.0.2: icmp_seq=0 ttl=255 time=289 usec
      64 bytes from 192.168.0.2: icmp_seq=1 ttl=255 time=213 usec
      64 bytes from 192.168.0.2: icmp_seq=2 ttl=255 time=203 usec

      --- 192.168.0.2 ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/mdev = 0.203/0.235/0.289/0.038 ms

      3. 關掉 eth0:0 這個界面
      [root @test /root]# ifconfig eth0:0 down

      嘿嘿嘿嘿！如此一來，你這塊網路卡上面就已經有兩個界面啦！分別是 192.168.0.2 及 192.168.1.2 ！很簡單吧！不過，這樣還是有點問題，那就是每次開機你都得在手動的輸入一次( 除非寫到 /etc/rc.d/rc.local 這個檔案當中 )，好了！底下我們就介紹一下如何以裝置設定的方式來設定多個 IP 的方法吧！
    • 裝置設定檔設定多個 IP：
      這個東西也不難！還記得我們在 連上 Internet 一文當中，曾經提到網路卡的參數設定檔吧！沒錯！那就是 /etc/sysconfig/network-scripts/ifcfg-eth0 囉！好了！那麼我們目前是以裝置 eth0:0 做為裝置代號，自然檔名就需要改一改啦！所以你可以這樣做一次，來達成與上面 command line 的設定相同的狀況！
      [root @test /root]# cd /etc/sysconfig/network-scripts
      [root @test network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
      請注意，那個 ifcfg 是必要的，而 eth0:0 則是裝置代號！所以請依您的需求來設定檔名！例如你要設定 eth0:1 ，則檔名應該寫為 ifcfg-eth0:1 才對呦！

      1. 開始設定參數檔！
      [root @test network-scripts]# vi ifcfg-eth0:0
      # This file is just to be used to test the more IPs
      DEVICE=eth0:0　　　　　　　<==這裡請跟剛剛檔名的地方寫的一樣！亦即為裝置代號！
      ONBOOT=no　　　　　　　　　<==是否開機時啟動！很奇怪，無論這裡設定為何，開機只要啟動 eth0 ，
                                    則這裡就會被啟動！很奇怪？！
      BOOTPROTO=static　　　　　 <==使用的開機設定協定
      IPADDR=192.168.0.2　　　　 <==我設定的 IP！
      NETMASK=255.255.255.0　　　<==就是子網域遮罩
      NETWORK=192.168.0.0　　　　<==就是網域
      BROADCAST=192.168.0.255　　<==就是廣播位址啦！

      2. 正確的啟動！
      [root @test network-scripts]# ifup eth0:0
      [root @test network-scripts]# ifconfig eth0:0
      eth0:0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
      inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      Interrupt:10 Base address:0x6100

      3. 正確的關閉！
      [root @test network-scripts]# ifdown eth0:0

      很簡單吧！這樣就可以達到你的多個 IP 在同一塊網路卡上面的目標囉！
    • 需要注意的地方：
      一般而言，鳥哥個人是比較偏向於『使用參數設定檔案的方式』來進行我的多個 IP 的設定！這樣有很多好處啦！包括我可以在 ifcfg-eth0:0 這個檔案裡頭，先以 # 註解符號後面來說明一下當初我為何要建置這個檔案，以及可以使用檔案的型態來瞭解一下我的設定檔，再來，由於所有的網路卡參數檔案都在這個目錄下『 /etc/sysconfig/network-scripts』，所以我可以很輕易的就找到相關的設定檔囉！所以，比較推薦這個方式！
      不過需要特別注意的地方是，我試過好幾次了，每次重新開機啟動的時候，即使你設定 ONBOOT=no ，但是當 eth0 這個實體網路界面被啟動時，所有跟 eth0 有關的虛擬界面 eth0:n 都會被啟動！然後，當你關閉掉 eth0 時，則所有跟 eth0 有關的 eth0:n 都會被關閉掉！這點還請特別留意呦！
Router： 什麼是 Router, 為何需要 Router,
  • 什麼是 Router ？
    還記得我們在 網路基礎 裡面提過的幾個東西嗎？『不同網域的資料流，必需要透過 Router 來轉譯彼此』，也就是說，我們必需要藉由 router 來溝通不同的網域之間的資料啦！通常我們發現 router 的地方，都是在不同的網域之間相互連通的節點上面，好了，那麼我們也曉得 Router 是一個『很貴的機器』，呵呵！那麼 Linux 可以做成 router 嗎？嘿嘿！很好！他可以！
  • 為何需要 Router ？
    既然 Router 的作用是連通不同的網域，那麼我的公司所有的電腦只要都在同一個網域之內，那不就得了！根本就用不著 Router 嘛！不過，不要忘記了我們在 網路基礎裡面曾將向大家提過的『封包碰撞』與『節點的最大傳輸量』限制！舉個例子來說好了：
    • 當你的公司成長到需要 200 部電腦好了，這個時候假如你還是將所有的 200 部電腦都給他在同一個網域之內，那麼當一部電腦要將資料丟出來的時候，嘿嘿！所有的網路卡將會停頓一下等他的廣播！這會造成相當大的網路負荷！此外，在 Hub 裡頭，所有的資料都在裡頭流竄，你會發現你的資料很容易有損失而無法連線的情況！這會造成內部網路的極大負荷....
    • 那或許你會說：『如果 Hub 不行，那麼我將他換成 Switch 總可以了吧！ Switch 不是可以將封包碰撞的機率降至最低嗎？』是的！您說的沒錯！但是很不幸的，您買的 Switch 應該是 10/100Mbps 的吧！果然如此的話，那麼你的 Switch 最大的即時傳輸量為 12.5 MBytes 左右，如果平均分配給你的 200 部電腦的話，那麼每一部的頻寬是多少？答案是 60 KBytes 左右！嘿！在區域網路內的電腦流量怎麼會這麼慢？！尤其當一個人死命的捉某部電腦的資料的時候，那就慘咯！其他人的平均頻寬將會降的更低！
    這個時候或許 Router 的功能就可以顯現出來囉！怎麼說呢？因為不同的網域之間不能直接廣播，所以你必需要將網域分別開來，而假設以 200 部電腦平均分為 5 個網域好了，這個時候一個網域裡面只有 40 部電腦，在這個情況之下，不但佈線容易( 針對 40 部電腦來說 )，而且由於不同網域之間不會互相廣播，所以你的廣播時產生的網路停頓情況將會減少非常的多！如此一來，對於您內部區域網路的網路流量舒緩，將有相當大的助益！『請特別留意，通常比較大的區域網路( 指電腦數量較多的企業 )，如果規劃不良，則你對外連線的時候，最大的速度瓶頸可能來自於內部網域！這是因為內部網路的 loading 比起外部網路要『慢的很多！』因為內部網路互連的狀況( 例如網路芳鄰的資源分享、印表機的分享、檔案伺服器的分享等等 )就會導致你的 Switch/Hub 的頻寬被佔用光了！ 』
    一般不想要管事的網管人員，最喜歡直接將佈線設計成類似底下的模樣：
    這樣做最大的好處就是『簡單』，你只要控管一個 伺服器 就夠了！其他的完全不用去理他，管他什麼封包碰撞，反正你內部網路的 loading 太大也沒有關係，對於懶惰的網管人員來說，他根本就不痛不癢....這個時候你的內部網路的流量可能真的會負荷很大啦！此時，相當的建議設定成類似底下的模樣！
    這樣有個好處啦！你的伺服器上面有兩塊網路卡，分別負責不同的網域，那麼由於這兩個網域之間分隔開來了，因此廣播停頓、封包碰撞與 Hub/Switch 流量限制的情況就會比較舒緩一些！而兩個不同的網域之間的資料分享呢？嘿嘿！則可以透過伺服器架設的 Router 功能來達成呀！這樣你可以瞭解為何需要設定成這個模樣了吧？！
  • 觀察與修改路由：
    其實就如同前面說的， Router 的最大用途就是將不同網域的資料互相流通，而要溝通這些資料，必然就需要有所謂的『路由, route』這個東西了！以我的情況為例，我是以 ADSL 撥接上 Internet 的，但是我有個內部網域，192.168.1.0/24 這一個東西，所以在我的 Linux 底下輸入 route 時，會得到如下的結果：
    [root @test /root]# route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.142.253 * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 140.116.142.253 0.0.0.0 UG 0 0 0 ppp0
    上面顯示什麼意義呢？簡單的說，就是：
    1. 當我有一個封包要送到 192.168.1.0/24 這個網域時，我的輸出介面為 eth0 這個介面；
    2. 當我有封包要送到 127.0.0.0/8 ( A Class ) 時，我的輸出介面為 lo 這個介面；
    3. 當我有資料要送到 140.116.142.253 時，由於他是 p-p-p 的協定，所以是單點對單點，而介面為 ppp0 這個；
    4. 至於其他沒有規定到的所有網域，則統一由 default 這個 Gateway 140.116.142.253 ，介面為 ppp0 丟出去！由於 ppp0 傳送到的這個 140.116.142.253 是 ISP 的介面，該介面通常為 Router ，所以他會自動的將你的封包再往前面送，使之最後可以到達目的地！
    這樣瞭解了嗎？那個 default 裡頭的 Gateway 就是我們在 /etc/sysconfig/network 這個檔案裡面設定的啦！ ^_^""
    好了！那麼假設你的網域當中還有另外一個不同的網域，假設為 192.168.0.0/24 好了，而這個網域同樣的是接在 eth0 這個網卡上面，所以你要你的 eth0 同時還負責 192.168.0.0/24 這個網域時，可以這樣做！
    [root @test /root]# route add -net 192.168.0.0 netmask 255.255.255.0 dev eth0
    [root @test /root]# route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.142.253 * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 140.116.142.253 0.0.0.0 UG 0 0 0 ppp0
    [root @test /root]# route del -net 192.168.0.0 netmask 255.255.255.0 dev eth0
    這樣就增加囉！不過，這個時候或許你可以連上人家的機器，但是人家卻無法連接到你的機器！因為你的網路並沒有 192.168.0.0/24 裡面的任何一個 IP ，所以別人的電腦自然無法透過廣播來與你進行資料的交流！這個時候就必須要啟動 Routing 的功能啦！如何啟動呢？繼續看下去吧！ ^_^""
    註：請特別留意，當你使用 route 來秀出目前的路由表時，如果顯示的訊息非常的緩慢，不要懷疑！一定有地方設定錯誤。請依照 route 所顯示的訊息來修改你的網路參數！通常最容易發生 route 問題的地方在於 gateway 的設定啦！或者是重複啟動多次的虛擬介面卡時，也會有這樣的情況，例如我曾經看過在 route table 上面出現同一個路由狀態共三次以上！例如上面 192.168.0.0 .... 那一行，若在 route table 上面竟然重複出現三次！這肯定有問題呀！！處理的方法為：
    1. 將該相關的網路介面關閉！使用 ifdown 來關掉；
    2. 使用 route 的功能，將該路由刪除！
    3. 修改相關的介面，將介面符合我們的需求！
    4. 重新啟動介面，並持續觀察 route ！
一個 Router 架設範例：
好啦！既然知道 Router 的好處之後，再來當然就是要來架設他囉！其實架設的方法真的很簡單！你只要作幾個動作就可以啦！(註：請特別留意，本文僅在測試 Routing 的功能而已，如果您在貴公司內部需要架設 Router 時，可以依照本文的概念來架設，但是實體佈線則需要用『實體網路卡』來區隔，請不要使用本文的 IP Alias 的方式！切記！)
  1. 設定網路卡，使連接不同的網域；
  2. 設定 route 路由表，讓兩網域可以互通；
  3. 啟動 ip_forward 的選項；
  4. 在 Client 端設定 gateway 分別為 server 端的兩個 IP ！
由於我們的 Router 需要直接跟兩個網域互相連通，所以囉，你的 Router 上面就需要同時具有在這兩個網域之間的 IP 啦！此外，由於不同的網域需要啟動 Routing 的功能！所以你必須要做一個動作，那就是讓目前記憶體裡面的 Routing 功能啟動！那麼我們在 資源管理 的文章裡面曾經提過，那個核心的程序都是記錄在 /proc 裡面的，至於我們 Linux 核心的網路功能則都記錄在 /proc/sys/net/ipv4 這個目錄內！而啟動 Routing 的程序為 ip_forward 這個檔案！只要將內容設定為 1 即為啟動，而當為 0 時，就是顯示關閉的啦！因此，若要啟動 Routing 則需要『 echo 1 > /proc/sys/net/ipv4/if_forward 』即可！底下是我的測試環境啦！請注意，這個範例單純僅只是在測試 Router 的功能罷了！你應該依照你的需求來架設你的 Router 呦！那麼就將我的連線圖示秀出來囉！ ^_^
  • 測試環境說明：
    在我的實際測試環境當中，每個元件的內容如下：
    1. Linux 主機：我的 Linux 伺服器本身作為 NAT 之用，裡面有兩張網路卡，一張連接 ADSL 數據機，這張對外卡的代號為 eth1 ，一張連接內部網路，代號為 eth0 ；
    2. Hub 連結電腦：Linux 主機對內的網路卡 eth0 連接到 Hub 上面，同時，Hub 上面還存在其他四部個人電腦，取兩部來進行測試， IP 分別為 192.168.1.11 及 192.168.0.11 ；
    3. eth0 對內網路卡：由於對內有兩個 C Class 的網域，所以我的網路卡 eth0 設定為 192.168.1.2 而另一個虛擬介面 eth0:0 設定為 192.168.0.2 ！
    4. Client 端的作業系統：我的 client 端的設定方面，在 192.168.1.11 使用 Windows 2000 隨機版，而 192.168.0.11 則使用 Red Hat 7.3 這個咚咚囉！
    基本的圖示如下示意：
  • 設定說明：
    在這個章節當中，我們不談怎麼架設 NAT 主機，那個是下一個章節才要提到的東西，所以焦點的地方在於 NAT Server 的左邊之設定，也就是 eth0 的設定！亦即是內部網域的設定而已！基本上，這個可以視為 區域網路架構 那一篇文章的內容延伸啦！在這個地方，我們的網路卡有兩個 IP 呦！
  • 開始設定：
    我們就照著上面的步驟一步一步做來吧！
    1. 設定網路介面，其中 eth0 為 192.168.1.2, eth0:0 為 192.168.0.2
    [root @test /root]# cd /etc/sysconfig/network-scripts
    [root @test network-scripts]# vi ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255
    GATEWAY=192.168.1.2

    [root @test
        network-scripts]# vi
        ifcfg-eth0:0
DEVICE=eth0:0
ONBOOT=no
BOOTPROTO=static
IPADDR=192.168.0.2
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255

    [root @test network-scripts]# ifup eth0 ; ifup eth0:0
    [root @test network-scripts]# ifconfig eth0; ifconfig eth0:0
    eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:5975598 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6267765 errors:0 dropped:0 overruns:0 carrier:0
    collisions:1331 txqueuelen:100
    RX bytes:557835433 (531.9 Mb) TX bytes:2811341821 (2681.1 Mb)
    Interrupt:10 Base address:0x6100

    eth0:0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
    inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    Interrupt:10 Base address:0x6100
    瞧！啟動兩個網路卡囉！這個沒問題的啦！可以連通兩個網域囉！

    2. 觀察路由情況：
    [root @test network-scripts]# route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    140.116.142.253 * 255.255.255.255 UH 0 0 0 ppp0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
    192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 140.116.142.253 0.0.0.0 UG 0 0 0 ppp0
    嘿！路由表是對的！不用理他也沒有關係呢！

    3. 啟動 IP FORWARD 項目：
    [root @test network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
    相信嗎？竟然只要上面這一行，我們的 Linux 就具有 Router 的功能了！ ^_^
    如果一切測試都順利，那麼你可以直接將這一行加入 /etc/rc.d/rc.local 這個檔案中！

    4.1 設定 192.168.1.0 那個網域的 client 電腦：
    IP:192.168.1.11
    Gateway:192.168.1.2 <==極度重要的設定！
    netmask:255.255.255.0
    network:192.168.1.0
    broadcast:192.168.1.255

    4.2 設定 192.168.0.0 那個網域的 Clinet 電腦
    IP:192.168.0.11
    Gateway:192.168.0.2 <==極度重要的設定！
    netmask:255.255.255.0
    network:192.168.0.0
    broadcast:192.168.0.255
    如此一來，兩個網域之間的溝通將會透過彼此的 GATEWAY 而兩者的 GATEWAY 都在 Linux 上面，所以自然很容易進行溝通啦！尤其我們已經開啟了 Routing 的功能！哈哈！OK！沒問題！

    這樣就設定完成了！如何？很容易吧！這樣一來，就可以讓你的很多電腦的內部網域之網路流量舒緩很多囉！此外，這裡必須提出一點說明，因為我上面的範例直接就是要用來作為測試用的，所以搞的比較簡單，而且還是在同一塊 Linux 主機的網路卡上面搞定的！請注意，如果要架設較大流量的 Router 時，請分別以兩張網路卡來分隔不同的網域，這樣應該會比較好呢！而至於 client 端的設定方面可以參考：
    • Windows 的網路參數設定
    • Linux 的網路參數設定
    另外，請特別留意，就如同剛剛前面我們提過的資訊來看，開機的時候，不論你的 alias 的設定為何 ( 是否設定為 ONBOOT )，只要啟動 eth0 則相關的 eth0:n 都會被啟動！這個時候請特別留意！如果其中有一個 IP alias 設定錯誤的話，那麼將會導致你的網路整體都會不通！原因多半出在 GATEWAY 上面！建議設定完成之後，先將 eth0 整個 shutdown ，然後再啟動，亦即『 ifdown eth0; ifup eth0 』然後再來看看 route 的情況！這樣可以避免這次設定成功，下次開機卻是不通的情況發生的！
  • 測試 Router 工作：
    好了，不可免俗的，我們可要好好的測試一下我們的 router 囉！如何測試呢？很簡單呀！
    1. 在 192.168.1.11 這個 client 端，先連線到 192.168.1.2 試看看能否連線；
    2. 在 192.168.1.11 這個 client 端測試是否可以連線到 192.168.0.2 這個 Server 端的另一個網路連接介面；
    3. 在 192.168.1.11 這個 client 端測試是否可以連接到另一個 client 端，亦即 192.168.0.11 這個 clinet ！？
    4. 將 Linux 主機的 /proc/sys/net/ipv4/ip_forward 功能關掉，然後再檢驗上面的三個步驟看看！試看看網路是否能夠溝通呢？
    測試的工作就是這麼簡單！來吧我們來測試看看吧！
    1. Client 端的測試( Windows 2000 作業系統, IP 為 192.168.1.11 )：
    C:\>ping 192.168.1.2 <==同網域的主機
    Pinging 192.168.1.2 with 32 bytes of data:
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Ping statistics for 192.168.1.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

    C:\>ping 192.168.0.2 <==不同網域的主機
    Pinging 192.168.0.2 with 32 bytes of data:
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Ping statistics for 192.168.0.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

    C:\>ping 192.168.0.11 <==不同網域的 Client 端！
    Pinging 192.168.0.11 with 32 bytes of data:
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Ping statistics for 192.168.0.11:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
    看到了嗎？用我們的 192.168.1.11 可以 ping 到 192.168.0.11 呦！OK囉！

    2. Server 端的修改：
    [root @test /root]# echo 0 > /proc/sys/net/ipv4/ip_forward
    先將 IP routing 的功能關掉一下！試看看結果！

    3. Client 端的測試 ( 作業系統為 windows 2000, IP 192.168.1.11 )：
    C:\>ping 192.168.0.11
    Pinging 192.168.0.11 with 32 bytes of data:
    Request timed out.
    Request timed out.
    Request timed out.
    Request timed out.
    Ping statistics for 192.168.0.11:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
    馬上就無法連線了！很誇張吧！！ ^_^

    4. 恢復 Linux Router ：
    [root @test /root]# echo 1 > /proc/sys/net/ipv4/ip_forward
    不要忘記把 IP Routing 的功能加回來呢！

    5. 用另一部 Linux 主機看一下結果 ( IP 192.168.0.11 )：
    [root@vbird-redhat root]# ping -c 3 192.168.1.11
    PING 192.168.1.11 (192.168.1.11) from 192.168.0.11 : 56(84) bytes of data.
    64 bytes from 192.168.1.11: icmp_seq=1 ttl=127 time=0.542 ms
    64 bytes from 192.168.1.11: icmp_seq=2 ttl=127 time=0.517 ms
    64 bytes from 192.168.1.11: icmp_seq=3 ttl=127 time=0.541 ms
    --- 192.168.1.11 ping statistics ---
    3 packets transmitted, 3 received, 0% loss, time 1998ms
    rtt min/avg/max/mdev = 0.517/0.533/0.542/0.022 ms
    看到上面淺紅色的字體了嗎？嘿嘿！沒錯！兩個不同網域確實有在溝通囉！ ^_^

    呵呵！測試的結果也告訴我們囉！沒錯！有沒有啟動 Routing 的功能將會影響 Linux 是否可以具有 Router 的能力！

建議：
上面的那個範例單純只是為了作為範例來示範！要注意，我們在公司內部架設 router 的時候，通常是希望降低內部網路流量的負載，這個時候，當然是將兩個網域分別分開在兩個實體網路卡上面比較好！而不是在一塊網路卡上面設定兩組 IP ，這樣做對於減低流量負荷的幫助應該不大！所以，您的實體線路配線方面可能要變成如下圖所示的模樣( 當然，設定方面則是完全一樣啦！ )：
無論如何，上面的方式可以提供一些中小企業，電腦數要多不多，偏偏又會影響整體流量的情況時，可以使用來解決問題！再來，對於中小學的網路佈線情況呢，也可以達到不錯的降地整體網路負荷的效果！而這個簡單的 Router 你可以使用 486 那種等級的舊舊爛爛的電腦來架設就可以啦！反正他的 loading 又不重∼∼此外，附上一篇小州前輩的建議給大家參考：
其實這樣子弄是有點問題的。我的意思是說，一般弄切割的話，還是需要弄獨立的網路卡分隔，這不只是區隔網路而已，而且還是考慮到實體封包流通時的問題。

你網頁上的架構，實體網路佈線，那 linux 只有一張網路卡，所以網路卡接網路線時會接到 hub 上，而 a、b 兩端不同網路區段的電腦也都是把網路線接到該 hub。這個佈線方式，其實底層封包流通時，a、b 兩端網路都還是可以收到，只不過 ip 那層看到因為不是自己網路區段的封包而不理會。

ip alias 時機，一般不建議用在提供 router/nat 這類同一個 ip 區段內，因為不同網路區段的封包還是會撞在一起... 真正商業使用上，要提供router/nat 功能時，通常不會建議使用 ip alias (除非真的是臨時需要或者是真的少網路卡可以用)，而會使用兩張網路卡並且各自使用 hub/switch切割開處理。

外管理實際網路的經驗來看，其實若是有使用者作怪，像是 a 網路有人架設dhcp，那 b 網路使用者可能就遭殃了:Q 還有就是，若是 a 網路內的電腦作怪，也可以把自己的 ip 設定為 b 網路區段內的 ip，那就會失去區隔效用。
2002/08/08 以來統計人數


認識網路安全與 iptables 、 TCP_Wrappers
最近更新日期：2002/08/12
TCP/IP 封包進入主機的基本流程：
主機防護 A 計畫：
防火牆： proxy, ip filtering,
iptables：什麼是 iptables, 有幾個 tables, 清除規則, 定義政策(policy), 增加(插入)規則,
TCP_Wrappers：什麼是 TCP_Wrappers, /etc/hosts.allow, /etc/hosts.deny,
TCP/IP 封包進入主機的基本流程：
    好啦！這一章的主要內容是在介紹網路安全與基礎防護方面的之事與建議，那麼這裡就要來討論一下，嘿嘿！當有一個 TCP/IP 的封包要進入你的系統時，應該會經過哪些關卡呢！？知道這些關卡之後，才會知道有哪些入侵的管道呀！然後才能知道如何去防禦他！OK！那麼首先自然就要來瞭解一下，什麼是 TCP/IP 囉！
  • 認識 TCP/IP：
    由 網路基礎 裡頭我們可以知道目前的網路連線協定以 TCP/IP 為主要的架構，其中：
    • 主機的 IP 可以當成是地址；
    • 而主機啟動的 port 可以想成是窗口或樓層；
    • 至於在兩個 IP 之間傳送資料的 TCP 封包則可以被想成是包裹。
    好了，既然 TCP 是個包裹，那麼想當然爾，真正的資料是在包裹裡面的 Messages/Data ，但是由於要將包裹傳送到最正確的地點去，所以就有個表頭，亦即在包裹不是都需要有填寫資料的那一面嗎？在這一面上面必須要填寫正確的來源與目的之地址以及該地址的樓層，才能夠正確的將這個包裹傳送到正確的地方！當然囉，由於可能會收到回信，所以自然那個包裹上面，寄信的地址與樓層也需要填寫正確囉！^_^。所以呢，你可以簡單的將 TCP 封包想成有兩個主要的地方，一個是放置資料的 Messages/Data ，另一個則是表頭( Header )資料填寫區，在這個 Header 區域中，有相當多的資料，這裡不談怎麼去認識所有的 TCP/IP 架構資料，僅提出最重要的兩個資訊，那就是來源與目的之 IP 及傳送的 port ！基本的 TCP 封包可以由下圖來表示囉。
    由上圖我們可以清楚的發現到，你的主機能不能接收這個 TCP 封包，就需要合乎 TCP 封包的 IP 與 port 的規定囉！
  • 簡易 TCP/IP 進入主機之流程：
    好了，現在我們知道主機收不收的到資料跟 TCP 上面的表頭資料( Header )是有關係的！那麼假如這個 TCP 封包已經正確的送到你的主機上面了呢？你的主機要怎樣來接收這個 TCP 封包？基本上，由 Linux 主機的一些基本設定項目，可以將整個程序簡化成如下圖：
    1. 首先， TCP 封包會先經過所謂的 IP 過濾機制( IP Filtering )，這是 Linux 提供的第一層保護，他可以將你不想要的來源 IP (經由 TCP 封包的 Head 資料)先擋掉再說！如果可以通過的話，就進入下一關；
    2. 再來則是 Super daemons 及 TCP_Wrappers 的功能囉！他可以將經過 IP filter 的封包資料再加以進一步的分析濾除；
    3. 經過了上兩道基本的防火設施之後，在接下來則是每一項服務的個別設定功能！舉例來說，如果是以 FTP 連線的話，那麼在 ftp 的設定檔案當中，可能會經由 PAM 模組( 未來在網路安全當中會提及)來抵擋特殊的 users ，當然也會以特別的設定來抵擋某些 TCP 封包！另外，以 WWW 來看，在 httpd.conf 裡頭也有類似的 deny 功能呦！
    4. 假使上面的幾道火牆都通過了，那麼才能進入主機來登入！此時，一經登入就會被系統記錄在『登錄檔』當中，藉以瞭解主機的歷史歷程！
    OK！那麼底下我們就經由這一串流程來討論一下，該如何抵擋有問題的 TCP 封包呢？
  • 封包過濾( IP Filter )：
    封包過濾是 Linux 提供的第一道防火牆呦！但是不同的核心版本會有不一樣的封包過濾機制！以 2.2.xx 為核心的 Linux 主要以 ipchains 作為過濾機制，至於目前新版的 2.4.xx 則以 iptables 為機制！OK！既然我們的 Red Hat 7.1, 7.2, 7.3 為 kernel 2.4.xx ，所以自然以 iptables 來進行 IP 抵擋的工作啦！那麼由於 TCP 封包裡頭有 IP 及 port 嘛！所以要抵擋來源 IP 或者是自身的 port ，嘿嘿！自然就很容易來進行啦！您目前只要曉得， iptables 可以經由 TCP 的封包表投資料來進行分析的工作，並設定『特殊動作』，例如：符合我們 iptables 的設定規則，就讓他可以經過防火牆，若是該 TCP 封包在我們的不歡迎 IP 的行列，那就將他丟棄，他就沒有辦法進入 Linux 主機啦！
  • Super daemons 與 TCP_Wrappers：
    Red Hat 7.x 以後的 super daemons 則是以 xinet 為主，至於抵擋封包的工作則可以讓 TCP_Wrappers 來進行！Wrappers 是垃圾、廢棄物的含意，那麼 TCP_Wrappers 自然就是『 TCP 的丟棄者 』嘿嘿！沒錯，他可以丟棄 TCP 的封包啊！利用每個服務的特色，來將 TCP 封包抵擋，這個 TCP_Wrappers 主要以『 服務 』為主的抵擋方針，例如 FTP, Telnet, SSH 都可以經由他來進行 IP 分析的動作呦！
  • 服務過濾：
    每個服務還有特別的自訂的防火機制，例如 Apache 這個 WWW 的套件裡頭，就含有『 deny from IP 』來抵擋某些不受歡迎的 IP 機制，而 ssh 也可以在設定檔裡頭決定是否要開放 root 的登入權限！FTP 當然也可以制定一些規則來擋掉不受歡迎的 IP 啦！不過，到這一步時，該封包已經進入主機的服務之內囉，是經由服務來關閉該 IP 的連線的呦！而由於某些服務天生就有些小漏洞，呵呵， Cracker 相當的容易利用這些漏洞來進行破壞的行為！由於該封包已經進入主機了，萬一服務真的有漏洞，那可就慘了......
  • 登入主機：
    上面提到的大多是在某些服務裡頭來取用我們主機系統的資源，那麼如果該封包是想要直接登入我們的主機呢( login )？這個時候就需要取得我們主機的『帳號與密碼』的權限啦！如果通過 ID & pass word 的驗證之後，就可以進入我們的主機啦！
  • 登錄檔記錄：
    『為了防止世界的破壞.....』喔！不！那個是皮卡丘的裡頭壞人的台詞....這裡要談的是，『為了防止主機的破壞....可愛又迷人的角色...』那就是 登錄檔 啦！為了記錄歷史歷程，以方便管理者在未來的錯誤查詢與入侵偵測，良好的分析登錄檔的習慣是一定要建立的，尤其是 /var/log/messages 與 /var/log/secure 這些個檔案！
主機防護 A 計畫：
在網路上面( 尤其是 BBS )最常聽到的就是這樣的哀嚎聲音：『阿！！救命哪！我被入侵了！要怎麼辦？』真是傷腦筋的很！我也不知道要怎麼幫助你呢！因為這真是......『自作自受』吶！一些老人家常常在講，架設一個『網站』很容易，因為目前的線上教學實在是太多了，市面上的『教戰手冊』之類的書籍也真是多如過江之鯽，然而，大家都只知道『我要架設網站』卻不知到『我要架設的是一個安全的網站』，這就是我們老人家的心聲哪！因為『架設一個安全的網站，真的很難....』！其中，維護的心力更難哪！為什麼呢？由上面的 TCP/IP 的封包路線圖，我們可以發現，嘿嘿！目前的入侵你的主機的管道實在是太多了！而一個良好的防火系統又不是只要上述的其中一層就可以做好的！而是複合式的整體規劃，並且要『持續不斷的』監測你的主機系統，才能夠較為完善的保護好你的主機呢！唉∼還真是不容易吶！底下我們來談一談，如果由主機內部到外部來規劃，要怎樣來加強主機的安全性呢？
  1. 建立完善的登入密碼規則限制：
    要做好主機的防護，第一步就是要建立完善的密碼規則啦！因為這個咚咚常常是 cracker 嘗試入侵的第一步！你必須要建立好主機的密碼規則，請參考 帳號管理 那一篇文章，裡頭提到的 /etc/shadow 檔案格式，還有 /etc/login.defs 這個檔案的內容，以及未來會再提到的 PAM 模組，都是相當重要的密碼規則訂定的所在！另外，可以嘗試以 chattr 來將 /etc/passwd 及 /etc/shadow 做成不可變更的檔案！較為安全啦！

  2. 升級與修補套件漏洞、及移除危險套件：
    這個真的相當的重要的！那就是因為你的服務套件的安全性啦！例如有名的 wu-ftpd 這個 ftp 套件，被說了很多次，好像不怎麼安全哩！那麼就好就不要啟動他，或者是雖然啟動，但是限制他的使用網域，這樣最起碼可以達到一點保護的效果！此外，定時的升級與不定時上網查看危險通告，是很重要的態度呢！

  3. 每項系統服務的安全設定項目：
    舉個例子來說， ftp 就不要讓 root 登入嘛！而 SSH 也可以考慮不開放 root 登入才好呢！這些都是基礎的安全設定項目說！要好好愛護自己的主機呦！

  4. TCP_Wrappers 的基礎防火設定：
    再來則是 TCP_Wrappers 的咚咚啦！請針對你的需求來訂定規則啦！這是最起碼的防火牆安全！尤其是開啟了 FTP, Telnet 的朋友，要更小心在意這個咚咚，此外，他也可以用來記錄嘗試入侵我們主機的 IP 地址呦！

  5. iptables 的防火規則設定：
    這個是 Linux 核心支援的工作咯！可以利用一行一行的規則訂定，來設定防火牆的安全規則，如此則可以抵擋掉大部分的不受歡迎的 TCP 封包囉！

  6. 主機資源偵測系統( MRTG )：
    當主機受到不明原因的攻擊時，通常會有一些端倪可以瞧出來，例如最明顯的是 CPU 的 loading 會飆到 90 ~ 100% 左右！還有，當有內部無聊人士在大量下載資料時，網路流量頻寬被他佔光了！這個時候主機的資源偵測系統就顯的重要了，我們也可以用簡易的 snmp 配合 MRTG 來捉取資料，以即時的角度來觀察主機的現況！

  7. 登錄檔案分析系統：
    還是要再說一遍，登錄檔的良好的分析習慣，對於系統管理員來說，是真的很重要的一件事情！
防火牆：
我想，你應該常常會聽到防火牆這個東西吧！他是什麼咚咚呀！？剛剛上面也提到很多了，所以你可以約略的瞭解到『防火牆的功能就在於杜絕一些不受歡迎的 TCP 封包，並進而保障主機或者是主機內部網域的安全』，那麼既然要杜絕一些不受歡迎的封包，則最少就有兩種基本的方式啦，一種是利用代理伺服器，將所有可行的協定限制的很少很少，並且由於內部與外部電腦的 IP 並不能互通，而達到良好的保護效果；另一種則是上面提到的 IP fileter 啦！利用封包過濾的方式來達到防火牆的目的！
  • Proxy ：
    這是屬於網路『應用層』的咚咚了，這個 Proxy ( 代理伺服器 ) 基本上就是一種『服務』喔！他的功能可以如下圖來表示：
    當 Client 有要求的時候， Proxy Server 會幫 Client 去外面捉取資料，然後再將資料丟回給 Client 端！請注意，此時真正出去 Internet 的，其實是 Proxy Server ，而不是 Client 端呦！( 這個跟 NAT 並不一樣，會在下一章 NAT主機設定時再提到。) 由於 Client 端並不是直接出去，加上 Proxy Server 一般僅開放 80 及 21, 20 port 而已，因此可以較為安全！相對的，對於 Client 端的限制自然就較多了！
  • IP fileter ：
    直接以 IP filter 例如 iptables 來進行封包的過濾！這個時候會由 TCP 的 header 分析起來，再決定是否可以讓該 TCP 封包進入主機。這個時候， iptables 的『規則』就顯的很重要啦！
底下我們先不談 Proxy 這個東西，僅來分析一下最基礎的兩個防火牆設備，一個是 iptables ，另一個則是 TCP_Wrappers ！
iptables：
iptables 是 Linux Kernel 2.4.xx 版本以上的主要 IP 過濾機制！他最大的功能就是可以過濾掉不要的 TCP 封包啦！當然功能還不止於此，他還可以用來進行 IP 偽裝，以達成 NAT 的主機功能呢！ iptables 的工作方向，必須要依規則的順序來分析，底下我們簡單的談一談 iptables 的幾個概念吧：
  • 有幾個 tables ：
    跟之前版本的 ipchains 不同的地方是， iptables 可以自行定義一些 tables 的新規定！將可以讓防火牆規則變的更為便於管理呢！基本上，原本的 iptable 至少有兩個 table ，一個是 filter ( 預設的，沒有填寫 tables 時，就是 filter 這個 table 啦 )，一個則是相當重要的 nat table 。其中， filter 可以用來管理主機的安全，至於 nat 則是用來處理 NAT 的功能啦！
  • 清除規則：
    iptables 的訂定方法其實很簡單，就是使用指令列的方式來訂定而已，他的基礎語法在清除規則時，是這樣的：
    [root @test /root]# /sbin/iptables [-FXZ]
    參數說明：
    -F ：清除所有的已訂定的規則；
    -X ：殺掉所有使用者建立的 chain (應該說的是 tables ）囉；
    -Z ：將所有的 chain 的計數與流量統計都歸零
    範例：
    [root @test /root]# /sbin/iptables -F
    [root @test /root]# /sbin/iptables -X
    [root @test /root]# /sbin/iptables -Z
    請注意，如果在遠端連線的時候，『這三個指令必須要用 scripts 來連續執行』，不然肯定『會讓你自己被主機擋在門外！』

  • 定義政策( Policy )：
    清除規則之後，再接下來就是要設定規則的政策啦！這個所謂的政策指的是『當你的封包不在你的規則之內時，則該封包的通過與否，以 Policy 的設定為準』，例如：你設定了十條規則，但有一個封包來的時候，這十條規則都不適用，這個時候此一封包就會依據 Policy 的規定為準，來決定是否可以通過防火牆囉。通常這個政策在 INPUT 方面可以定義的比較嚴格一點，而 FORWARD 與 OUTPUT 則可以訂定的鬆一些！
    [root @test /root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD| PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
    參數說明：
    -t 　　：定義 table ！
    tables ：table 的名稱，例如 nat 囉！
    -P 　　：定義政策( Policy )。
    INPUT　：封包為輸入主機的方向；
    OUTPUT ：封包為輸出主機的方向；
    FORWARD：封包為不進入主機而向外再傳輸出去的方向；
    PREROUTING ：在進入路由之前進行的工作；
    OUTPUT　 　：封包為輸出主機的方向；
    POSTROUTING：在進入路由之後進行的工作。
    範例：
    [root @test /root]# /sbin/iptables -P INPUT ACCEPT
    [root @test /root]# /sbin/iptables -P OUTPUT ACCEPT
    [root @test /root]# /sbin/iptables -P FORWARD ACCEPT
    [root @test /root]# /sbin/iptables -t nat -P PREROUTING ACCEPT
    [root @test /root]# /sbin/iptables -t nat -P OUTPUT ACCEPT
    [root @test /root]# /sbin/iptables -t nat -P POSTROUTING ACCEPT
    將預設的政策都定義為接受囉！

  • 增加、插入規則：
    接下來則要定義規則啦！我們底下先完全以主機的角度來觀察！可以這樣來設定啦！
    [root @test /root]# /sbin/iptables [-AI] [INPUT,OUTPUT,FORWARD] [-io interface] [-p TCP,UDP] [-s IP/network] [--sport ports] [-d IP/network] [--dport ports] -j [ACCEPT,DROP]
    參數說明：
    -A 　　：新增加一條規則，該規則增加在最後面一行；
    -I　　 ：在第一條規則加入；
    INPUT　：封包為輸入主機的方向；
    OUTPUT ：封包為輸出主機的方向；
    FORWARD：封包為不進入主機而向外再傳輸出去的方向；
    -i　　　 ：流入的網卡介面
    -o　　　　：流出的網卡介面
    interface ：網路卡介面，例如 ppp0, eth0, eth1....
    -p ：請注意，這是小寫呦！封包的協定啦！
    TCP ：封包為 TCP 協定的封包；
    UDP ：封包為 UDP 協定的封包；
    -s ：來源封包的 IP 或者是 Network ( 網域 )；
    --sport：來源封包的 port 號碼；
    -d ：目標主機的 IP 或者是 Network ( 網域 )；
    --dport：目標主機的 port 號碼；
    -j 　　：動作，可以接底下的動作；
    ACCEPT ：接受該封包
    DROP　 ：丟棄封包
    範例：
    [root @test /root]# /sbin/iptables -A INPUT -i lo -j ACCEPT
    所有的來自 lo 這個介面的封包，都予以接受
    [root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.0.1 -j ACCEPT
    來自 192.168.0.1 這個 IP 的封包都予以接受
    [root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.1.0/24 -j ACCEPT
    來自 192.168.1.0 這個 C Class 的網域的任何一部電腦，就予以接受！
    [root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.1.25 -j DROP
    來自 192.168.1.25 的 IP 的封包，就直接全部給他丟棄！
    [root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP --dport 21 -j DROP
    只要想要進來 21 這個 port 的封包，就把他丟棄！
    [root @test /root]# /sbin/iptables -A INPUT -i eth0 -p TCP -s 192.168.0.24 --dport 22 -j ACCEPT
    來自 192.168.0.24 的主機，想要到我的 port 22 時，就予以接受！
    請注意：防火牆的規則是『一行一行依序來檢查的，若符合任何一條規則，則予以動作(接受或丟棄)，否則繼續往下檢查到最後一條』上面的範例只是一些小規則而已！不要太緊張！後面還會再提到呦！
TCP_Wrappers：
這個 TCP_Wrappers 實在是很簡單的一個設定工作，因為他只要設定 /etc/hosts.allow 及 /etc/hosts.deny 就可以啦！基本上，他是經由 /usr/sbin/tcpd 這個程式來進行 TCP 的檢驗工作！而檢驗的方式則是以 /etc/hosts.allow 及 /etc/hosts.deny 來設定的啦！檢驗的流程是先以 /etc/hosts.allow 這個檔案，檢驗完之後，在到 /etc/hosts.deny 去搜尋！好了，那麼 hosts.allow 要怎樣設定呢？
<服務名稱> : <IP/network> : <action>
特別注意， network 可以使用 192.168.0.0/255.255.255.0 ，但不可使用 192.168.0.0/24 ！
[root @test /root]# vi /etc/hosts.allow
in.telnetd: 127.0.0.1 : allow
in.ftpd: 127.0.0.1 : allow
本機的 127.0.0.1 開放 telnet 及 ftp 哩！

[root @test /root]# vi /etc/hosts.deny
in.telnetd: 192.168.2.3 : deny
將 192.168.2.3 的 telnet 服務關掉！

大致上就是這樣，其他的相關技巧，我們會在後續在持續的說明呦！
2002/08/12 以來統計人數


簡易 Firewall 架設
最近更新日期：2002/08/20
為何需要防火牆：
網管人員所需要具備的認知與能力：
簡單的防火牆硬體配置與抵擋技巧：
防火牆規則的草擬：
簡易說明 iptables 規則：
簡易說明 TCP_Wrappers 設定：
其他相關測試：
為何需要防火牆：
  • 緣起：
    • 因為不希望常常在網路上面看到『唉呀！我依據某某網頁的資訊架設了一個 Linux 主機，為什麼過了一個星期之後，以 root 的密碼無法登入我的主機？』，還有一種說法『唉呦！我的 Linux 主機為什麼無法查詢登錄檔了？為什麼被 ISP 警告說我的 mail server 被列為黑名單了，為什麼被偵測到說我有攻擊人家？我都沒有做壞事呀！？』呵呵！很傷腦筋對不對∼沒錯啦！網路安全果然是很麻煩！又得要天天照顧他，又得要隨時更新到最新版的套件！唉∼麻煩吶！但是網路安全卻又是一個網管人員的基本知識要求，一個具有良好的防火牆措施的主機，可以讓一個網管人員過的更開心呀！
    要曉得的是，我們是一般的小家庭，所以主機即使被 Cracker 入侵，只要在對方利用我們的 IP 幹壞事之前就將主機給他關掉的話，還能稍微保護一下自己，但是若你是一的大型企業的主機，而且還提供有關信用卡啦，個人用戶的資訊啦等等的訊息時，那麼可不能說關機就關機的，這個時候怎麼辦，如果你沒有設定緊急應變手則，沒有良好的登錄檔案分析習慣，也沒有即時回報系統在幫你偵測你的主機，嘿嘿！那總損失除了金額之外，還包括公司的信譽，那可是很可怕的呦！由國外的分析可以發現，幾乎主機被入侵之後，損失的除了金錢之外，還有主機維護的時間、軟硬體重新設定的費用等等，相當可觀的一筆費用呀∼
    所以啦！架設一部具有較為安全的主機，對我們來說，也是相當重要的，怎麼說呢？別以為我們是一般的 ADSL 小站就無所謂呦！等到真的被入侵之後，然後你的主機被利用來作壞事，然後利用你的主機作壞事的那個人又將他的登錄資訊殺掉，讓人加找不到他，嘿嘿！到時候吃官司的可會是你！別以為 ADSL 撥接制的頻寬不足呢！要使用你的主機來做事那也不需要多大的頻寬，只要能連上 Internet ，只要能再藉由你的主機向外面擴散，嘿嘿！再怎麼小的頻寬都有人會利用的！『千萬不要小看系統的安全性∼』
    • Cracker 常見的入侵技術：
    這裡先提供幾個可能的入侵方法，然後我們再來聊一聊怎樣防備我們的主機呢：
    • 使用工具程式入侵你的主機：
      千萬不要懷疑，目前網路上面有太多的入侵偵測型態的攻擊軟體了！只要你的主機上面的防護作的不夠好，他就可以經由攻擊軟體提供的功能，將你的主機的 root 權限取得，進一步操縱你的主機！並且，為了怕被你的一些工具程式發現他的 PID，所以一般來說，他會去修改你的主機裡面的幾個檔案，例如：who, w, last, top, ps, netstat, find 等等，讓你永遠找不到他是否在你的系統當中！怕了吧？！趕快做好防備工作！
    • 蠕蟲或木馬程式 ( Trojan horse )：
      取自木馬屠城記的意思，木馬程式會主動的將你的主機開一個後門 ( 可以想成是 port 被啟動了 )，讓攻擊者可以輕輕鬆鬆的進出你的主機呢！那麼木馬程式怎麼會在你的系統上面呢？很簡單呀！如果今天你下載了一個不明程式，而且就安裝了他，他就可能會常駐在你的記憶體當中了！所以不要隨意安裝不明來源的檔案呀！例如前一陣的那個有名的某個軟體，在自家的網站上面還被放置了有木馬的程式在原套件中∼呀！真可怕∼另外，蠕蟲也很可怕，他會自己繁殖長大，例如前一陣子相當有名的 Nimda 與 Code Red 病毒，會讓你的網路頻寬被吃光光！！
    • DoS 攻擊法 ( Denial of Service )：
      這種攻擊法也很要命，方法有很多，最常見的就屬 SYN Flood 攻擊法了！他會不斷的送出資料封包來讓主機等待回應，讓你的主機不斷的開啟 port ，結果就是耗盡系統資源！阿！又是當機 !@_@∼∼
    • IP 欺騙：
      這個是比較高竿的人搞出來的把戲，他把送到你主機的封包的檔頭資料改過了，並宣告成為你內部網路的一份子！如果你沒有擋掉這樣的封包的話，那麼通常就會變成『接受他』！結果就是對方又可以輕而易舉的進入你的主機了....唉！真難防∼
    • Port scan：
      這個最討厭了！因為目前很多的 distribution 為了自身測量自己的漏洞，都會附上類似 nmap 這一類的掃瞄軟體！這種軟體自己玩自己還無所謂，可以檢查一下自己的主機開了哪些 port ！但是一旦被使用來攻擊別人的主機，那可就不好玩了....如果你有這種機會的話，也不要隨意去偵測別人的主機呦！很是危險呢！
    • 主機維護的幾個重要法門：
      呵呵！所以說，要來跟大家談一談如何架設一個簡單的防火牆啦！請特別留意，在您的 Linux 主機實地上網之前，請先：
      • 關閉幾個不安全的服務；
      • 升級幾個可能有問題的套件；
      • 架設好最起碼的安全防護--防火牆--
      其他相關的訊息請到 主機防護 A 計畫 裡面去看一看怎麼增加自身的安全吧！
    網管人員所需要具備的認知與能力：
    從上面的情況來看，嘿嘿嘿嘿！要作為一個稱職的網管人員，還真是難呀！基本上，你必需要具備這些能力才行呢：
    • 瞭解什麼是需要保護的內容：
      我的天吶，還要知道什麼是需要保護的呀！？呵呵！沒錯，就是如此！由剛剛我們知道的主機入侵方法當中，不難瞭解，只要有人坐在你的主機前面，那麼任何事都有可能會發生！因此，如果你的主機相當的重要，請『不要讓任何人靠近！』你可以參考一下湯姆克魯斯在『不可能的任務』裡面要竊取一部電腦內的資料的困難度！！ ^_^""
      • 硬體：能鎖就鎖吧！
      • 軟體：還包含最重要的資料呢！！
    • 預防黑客( Black hats )的入侵：
      這可不是開玩笑的，什麼是黑客呀！這是因為原本在西部電影當中，壞人都是戴黑色帽子的，所以之前的人們就稱網路攻擊者為 Black hats 啦！在預防這方面的攻擊者時，除了嚴格管制網路的登入之外，還需要特別控制原本你的主機中的人物！就我們小網站來說，不要以為好朋友就隨便他啦！他說要指定密碼是跟他的帳號相同比較好記，你就答應他！等到人家用他的密碼登入你的主機，並破壞你的主機，那可就得不償失了！如果是大企業的話，那麼員工使用網路時，也要分等級的呢！ ^_^
    • 主機環境安全化：
      沒什麼好講的，除了多關心，還是多關心！仔細的分析登錄檔，常常上網看看最新的安全通告，這都是最基礎的！還包含了以最快的速度更新有問題的套件！因為，越快更新你的套件，就越快可以杜絕黑客的入侵！
    • 防火牆規則的訂定：
      這部份比較麻煩一些啦！因為你必需要不斷的測試測試再測試！以取得最佳化的網路安全設定！怎麼說呢？要曉得的是，如果你的防火牆規則訂定得太多的時候，那麼一個資料封包就要經過越多的關卡才能完整的通過防火牆，以進入到主機內部！嘿嘿！這可是相當的花費時間的！會造成主機的效能不彰！特別留意這一點呢！
    • 即時維護你的主機：
      就像剛剛說的，你必需要隨時維護你的主機，因為，防火牆不是一經設定之後就不用在管他了！因為，再嚴密的防火牆，也會有漏洞的！這些漏洞包括防火規則設定不良、利用較新的偵測入侵技術、利用你的舊軟體的服務漏洞等等！所以，必需要即時維護你的主機呀！這方面除了分析 log files 之外，也可以藉由即時偵測來進行這個工作！例如 Open Linux 裡面的 PortSentry 就是蠻不錯的一套軟體呢！
    • 良好的教育訓練課程：
      不是所有的人都是電腦網路高手，尤其雖然現在資訊爆炸，但是仍然有很多的機會會遇到電腦白癡呀！這個時候，要曉得的是，我們對於內部網域通常沒有太多的規範，那如果他用內部的電腦去做壞事怎麼辦？！有時候還是無心的∼挖哩ㄋㄟ∼所以說，需要特別的教育訓練課程呀！
    • 完善的備份計畫：
      天有不測風雲，人有旦夕禍福呀！什麼人都不知道什麼時候會有大地震、我們也都不知道什麼時候會突然的硬碟掛掉去∼所以說，完善的備份計畫是相當重要的！！這一部份請參考一下 Linux 主機備份 的內容吧！
    反正呦，就是要花蠻多心力在上面的就是了！不然，真的會一天到晚接到你的主管、你的用戶、你的客戶哇哇大叫的呦！ ^_^""
    簡單的防火牆硬體配置與抵擋技巧：
    我們在 認識網路安全 那一篇裡面提到了相關的網路危機，並且也分析了 TCP/IP 架構底下，封包的可能入侵方向，OK！那麼接著下來，要瞭解的自然就是防火牆的設定啦！請特別留意，防火牆除了可以幫助我們抵禦外來的主動連線之外，也可以幫我們控管網路流量，並且，在簡單的區域網路規劃中， Firewall 搭配 Router ( 就是 NAT 主機的架構 ) 也是相當常見的一種規劃！這種規劃對於內部私有網域的安全也有一定程度的保護作用呢！
    好了，現在我們需要來做好基礎的防火牆措施了，在這裡，我們以最簡單的 Router 上面 ( 亦即是 NAT 主機 ) 架設防火牆 ( 亦即上面的圖示說明 ) ，那麼所有的內部 PC 將透過這部 Linux 主機連接上網，這樣設計的好處是：
    • 安全維護在內部可以開放的權限較大！
    • 安全機制的設定可以針對 Linux 主機來維護即可！
    • 對外只看的到 Linux 主機，所以對於內部可以達到有效的安全防護！
    再來複習一下一個資料封包的內容，如下圖所示：
    由於防火牆可以分析網路上傳送過來的資料封包，並取得分析該資料封包的檔頭資料，亦即可以分析上面圖示中的目的地與來源地的 IP, port, 帶有的其他資訊等等！所以經由分析這些資料後，我們不難發現抵擋的方法可以有幾個動作：
    • 拒絕讓封包進入主機的某些 port ：
      這個應該不難瞭解吧！例如你的 port 20-21 這個 FTP 相關的 port ，你只要開放給內部網路的話，所以不對 Internet 開放，那麼當 Internet 來的封包想要進入你的 port 20-21 的話，那麼就可以將該資料封包丟掉！因為我們可以分析的到該封包所帶有的 port 號碼呀！
    • 拒絕讓某些來源 IP 的封包進入：
      例如你已經發現某個 IP 主要都是來自攻擊行為的主機，那麼只要來自該 IP 的資料封包，就將他丟棄！這樣也可以達到基礎的安全呦！
    • 拒絕讓帶有某些特殊旗標( flag )的封包進入：
      最常拒絕的就是帶有 SYN 的主動連線的旗標了！只要一經發現，嘿嘿！你就可以將該封包丟棄呀！
    當然還有很多的技巧，這裡我們就不多提了！底下好好的來談一談怎樣建置一個簡單的 firewall 主機吧！此外，我預計使用兩層防火牆，分別是 iptables 與 TCP_Wrappers ，其中，兩者的相關性為：
    也就是說，資料封包會先經過 iptables 才會經過 TCP_Wrappers 的作用！底下我們先來談一下防火牆規則的草擬囉！
    防火牆規則的草擬：
    這裡提一個蠻簡單的防火牆規劃，我的硬體連線如上面的圖示所示的那樣，網路設定為：
    • 外部網路使用 ppp0：由於是撥接的，所以實際對外是 ppp0 這一個界面；
    • 內部網路使用 eth0 ：這個 eth0 使用在內部網路的連接上面，而且網域為 192.168.1.0/24 這個 C Class；
    • 主機開放的服務：目前我的主機雖然只有開放 NAT ，但是未來還會增加一些服務，目前我假設我的主機預計會有的對 Internet 上面啟用的服務有：
      • NAT
      • WWW
      • SSH
      • SMTP
      • POP3
      • IMAP
      • DNS
      • FTP, Telnet, DHCP, NFS 都只對內部網域開放！
    我們草擬的規則為：『關閉所有的，開放特定的』的模式，但是在政策上面( Policy )則先選擇 ACCEPT ，然後在最後一行才以 NEW, INVALID 的狀態來關閉所有的服務之 port 啦！而眾所皆知的， iptables 所訂定的規則為一條一條分析比對下去的，所以我們在 安排防火牆的規則 上面就顯得特別的重要了！為了預防某些動作被搞混亂了，加上未來我們要以這個簡易的防火牆進行更進一步的設定規劃，所以這裡我們需要用一個簡單的流程圖來示意！特別留意：這裡我們總共用了三個檔案，我放置的目錄在 /usr/local/virus/iptables 裡面，檔名分別為：
    • iptables.rule ：設定規則的檔案，包括清除防火牆規則、載入模組、設定一些服務的登入與否等等！
    • iptables.deny ：設定惡意 IP 或網段的檔案，裡面完全都是抵擋的 IP 段落語法！
    • iptables.allow：可以想成是一些自己設定的後門啦！因為我們不知道哪一天會出到外頭去！這個時候，一個嚴格的防火牆說不定會擋死自己，所以需要加上一些 IP 的開放囉！
    注意：每次修改完了任何一個檔案，要立刻生效的話，請執行 iptables.rule 即可！而整個的流程有點像底下這樣：
    上面是我個人建議的小小流程，原則上，內部與主機的開放度很高，因為 Output 與 Forward 是完全開放不理的！對於小家庭的主機是可以接受的，因為我們內部的電腦數量不多，而且人員都是熟悉的，所以不需要特別加以控管！但是：『在大企業的內部，這樣的規劃是很不合格的，因為你不能保證內部所有的人都可以按照您的規定來使用 Network ！』也就是說『家賊難防』呀！因此，連 Output 與 Forward 都需要特別加以管理才行！
    簡易說明 iptables 規則：
    關於 iptables 的語法，與基本的用法，我們在 認識網路安全 裡面已經稍微提過了，這裡不再重複提出！僅進行上面流程的一些 script 的說明！請注意，我們的檔案基本上都放置在 /usr/local/virus/iptables 裡面呢！先來看一下 iptables.rule 的規則內容是怎樣呢？
    [root @test /root]# mkdir /usr/local/virus
    [root @test /root]# mkdir /usr/local/virus/iptables
    [root @test /root]# cd /usr/local/virus/iptables
    [root @test iptables]# vi iptables.rule

    #!/bin/bash
    #
    # 這個 script 是用來建立 iptables 防火牆的基本規則！
    # 基本規則定義為『拒絕所有，開放特定』的模式！
    # 你可以將這個檔案放置在 /usr/local/virus/iptables 底下，檔名可定義為 iptables.rule
    # 基本上，你可以參考這個網站資料： http://aerosol.ev.ncku.edu.tw/~vbird
    #
    # HISTORY:
    # 2002/08/20 First release by VBird
    #

    # 0.0 Please key in your parameters
    EXTIF="ppp0" # the interface that connect Internet
    INIF="eth0" # the inside interface. if you don't have this one
    # and you must let this be black ex> INIF=""
    INNET="192.168.1.0/24" # This is for NAT's network

    # 1.0 Testing your Kernel version and remove the ipchains module
    kver=`uname -r | cut -c 1-3`
    if [ "$kver" != "2.4" ] && [ "$kver" != "2.5" ]; then
    echo "Your Linux Kernel Version may not be suported by this script!"
    echo "This scripts will not be runing"
    exit
    fi
    ipchains=`lsmod | grep ipchains`
    if [ "$ipchains" != "" ]; then
    echo "unload ipchains in your system"
    rmmod ipchains 2> /dev/null
    fi

    # 2.0 Loading some modules
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    export PATH EXTIF INIF INNET
    modprobe ip_tables > /dev/null 2>&1
    modprobe iptable_nat > /dev/null 2>&1
    modprobe ip_nat_ftp > /dev/null 2>&1
    modprobe ip_conntrack > /dev/null 2>&1
    modprobe ip_conntrack_ftp > /dev/null 2>&1
    modprobe ip_conntrack_irc > /dev/null 2>&1

    # 3.0 Clear the iptables's rules
    /sbin/iptables -F
    /sbin/iptables -X
    /sbin/iptables -Z
    /sbin/iptables -F -t nat
    /sbin/iptables -X -t nat
    /sbin/iptables -Z -t nat
    /sbin/iptables -P INPUT ACCEPT
    /sbin/iptables -P OUTPUT ACCEPT
    /sbin/iptables -P FORWARD ACCEPT
    /sbin/iptables -t nat -P PREROUTING ACCEPT
    /sbin/iptables -t nat -P POSTROUTING ACCEPT
    /sbin/iptables -t nat -P OUTPUT ACCEPT

    # 4.0 Allow the lo and inside interface to access the server and internet
    /sbin/iptables -A INPUT -i lo -j ACCEPT
    if [ "$INIF" != "" ]; then
    /sbin/iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    /sbin/iptables -t nat -A POSTROUTING -s $INNET -o $EXTIF -j MASQUERADE
    fi

    # 5.0 Deny and Allow IP or host or network from files
    if [ -f /usr/local/virus/iptables/iptables.deny ]; then
    /usr/local/virus/iptables/iptables.deny
    fi
    if [ -f /usr/local/virus/iptables/iptables.allow ]; then
    /usr/local/virus/iptables/iptables.allow
    fi

    # 6.0 Allow ICMP come in
    AICMP="0 3 3/4 4 11 12 14 16 18"
    for tyicmp in $AICMP
    do
    /sbin/iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
    done

    # 7.0 Allow services
    /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT # SSH
    /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP
    /sbin/iptables -A INPUT -p UDP -i $EXTIF --dport 53 -j ACCEPT # DNS
    /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 53 -j ACCEPT # DNS
    /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # WWW
    /sbin/iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3

    # 8.0 Allow RELATED and ESTABLISHED
    /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    # 9.0 deny all
    /sbin/iptables -A INPUT -m state --state NEW,INVALID -j DROP

    再來看一下關於 iptables.allow 的內容是如何？假如我要讓一個 140.116.44.0/24 這個網域進入我的主機的話，那麼這個檔案的內容可以寫成這樣：
    [root @test iptables]# vi iptables.allow
    #!/bin/bash
    #
    # This program is used to allow some IP or hosts to access your Server
    #
    # HISTORY
    # 2002/08/20 first release by VBird

    /sbin/iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

    [root @test iptables]# vi iptables.deny
    #!/bin/bash
    #
    # This script will deny some IPs that I don't want it IN
    #
    # HISTORY
    # 2002/08/20 revise by VBird

    /sbin/iptables -A INPUT -i $EXTIF -s 140.115.236.8 -j DROP
    /sbin/iptables -A INPUT -i $EXTIF -s 140.120.13.237 -j DROP

    請特別注意，若您有新的 port 或者是沒有開啟某些 port 的時候，請在您的 iptables.rule 裡面的第 7 步驟，新增加其他的 port 的服務，這樣就可以啦！不過，還是如同前面我們所說的，這個 firewall 僅能提供基本的安全防護，其他的相關問題，還需要再測試測試呢！此外，如果你希望一開機就自動執行這個 script 的話，請將這個檔案的完整檔名寫入 /etc/rc.d/rc.local 當中，有點像底下這樣：
    [root @test /root]# vi /etc/rc.d/rc.local
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.

    touch /var/lock/subsys/local

    #1. adsl connectting. 2002/04/06 VBird
    /usr/sbin/adsl-start
    #2. Starting the NAT Server 2002/04/06 VBird
    /usr/local/nat/nat.sh
    #3. Starting firewall settings 2002/08/20 VBird
    /usr/local/virus/iptables/iptables.rule

    三個檔案可以按底下來取得：
    iptables.rule
    iptables.deny
    iptables.allow

    簡易說明 TCP_Wrappers 設定：
    好了！基礎的防火牆設備已經 OK 了！接著下來，我們要來探討一下在 iptables 封包過濾完成之後，並且進入主機後，接下來的這一層 TCP_Wrappers ！呵呵！他其實也很簡單啦！相關的語法你可以先參考一下 認識網路安全 裡面的說明，這個地方由於是在 iptables 之後，所以呢，我們可以針對可以進入主機的封包來進行控制！舉個例子來說，像是 FTP 好了！當一個 TCP 封包進入我們的主機時：
    1. iptables 會先去檢驗相關的設定，由上面的範例來看，來自 Internet 上面的封包將會被抵擋下來，而唯一能夠進入的網段為內部的 192.168.1.0/24 這一個私有網段；
    2. 來自內部私有網段關於 FTP 的封包進入後，開始來到 TCP_Wrappers 的分析，由於我們不會開放全部的人進入，假設只有 192.168.1.1~192.168.1.3 可以進入取用 FTP 的服務，所以就需要設定 /etc/hosts.allow 及 /etc/hosts.deny 的設定了！
    大致上便是如此！此外，以 SSH 為例，如果你只想要讓『信任的主機』登入的話，那麼也可以在裡頭進行規劃！好了！這裡我們以私有網段 192.168.1.0/24 可以取用 Telnet 及 FTP 的 hosts 有 192.168.1.2, 192.168.1.10, 192.168.1.20 這三部電腦，及來自 Internet 上面可以取用 SSH 的主機為 xxx.yyy.zzz.qqq 這個主機，及 192.168.1.0/24 全部的電腦！則你的兩個檔案可以寫成這樣：
    [root @test /root]# vi /etc/hosts.allow
    # 先寫關於 telnet, ftp 及 sshd 開放的資料
    in.telnetd: 192.168.1.2, 192.168.1.10, 192.168.1.20 : allow
    in.ftpd: 192.168.1.2, 192.168.1.10, 102.168.1.20 : allow
    sshd: 192.168.1.0/255.255.255.0, xxx.yyy.zzz.qqq : allow

    [root @test /root]# vi /etc/hosts.deny
    # 將上面的三個服務都關掉啦！
    in.telnetd: ALL : deny
    in.ftpd: ALL : deny
    sshd: ALL : deny

    其中，還有更高竿的 /etc/hosts.deny 的寫法，這是關於當有來自不明人士的 touch 時，會被記錄下來該 IP 的方法啦！
    [root @test /root]# vi /etc/hosts.deny
    in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

    in.ftpd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

    sshd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

    如此一來，當有來自非你所規定的合法 IP 試圖以 telnet, ftp 及 ssh 連線你的主機時，系統就會將該 IP 寄一份資料給 root 來留檔！不過，這有個傷腦筋的地方，萬一該 IP 最後成功的登入你的主機之後，可能會將 root 的信箱砍掉，導致這個作用就沒有效果了！所以，這個時候，請你將上面 root@localhost 改成另一個非主機的信箱來收信！這樣會比較有安全上的保障啦！ ^_^這個咚咚一設定完畢立刻就生效了！所以不用去理他也沒關係！但是要隨時注意一下你的設定是否正確呦！

    其他相關測試：
    雖然這樣一來就稍微建置好了你的防火牆了！但是誰都不知道到底這樣的防火牆效果如何？所以，你需要花費更多的時間來進行測試呢！測試的步驟可以是：
    1. 先由主機向外面主動連線試看看；
    2. 再由私有網域內的 PC 向外面主動連線試看看；
    3. 最後，由 Internet 上面的主機，主動連線到你的 Linux 主機試看看；
    一步一步作下來，看看問題出在哪裡，然後多多的去改進、改良！！基本上，網路上目前很多的資料可以提供你不錯的參考了！這一篇的設定寫的是很簡單，大部分都還在介紹階段而已！希望對大家有幫助！底下列出幾個有用的防火牆網頁，希望大家有空真的要多多的去看看！會很有幫助的！
    中文網站：
    http://www.study-area.org/linux/servers/linux_nat.htm
    http://linux.tnc.edu.tw/techdoc/firewall/
    http://www.linuxyes.com/tw/tutorial/iptables.html
    http://www.linux.org.tw/CLDP/Packet-Filtering-HOWTO.html
    http://www.linux.org.tw/CLDP/Firewall-HOWTO.html
    英文網站：
    http://www.linux-firewall-tools.com/linux/
    http://www.netfilter.org/
    http://www.linuxguruz.org/iptables/
    http://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO.html
    http://www.interhack.net/pubs/fwfaq/
    2002/08/20 以來統計人數


動態 DNS 申請與偵測小技巧
最近更新日期：2002/08/05
什麼是 DNS ：
哪裡申請 DNS ： 靜態 DNS, 動態 DNS,
動態 DNS 偵測與自動更新小技巧：
    單純 E-Mail 給系統管理員：
    直接偵測與線上更新動態 DNS ：
    在 IP 分享器後端的 Linux 偵測與更新：
什麼是 DNS ：
    DNS 的全名是『 Domain name server 』是也，中文譯名為『領域名稱伺服器』，這個咚咚的用途是什麼哇！為什麼我們的電腦或者是 Internet 一定需要他 ( 尤其是以 WWW 的方式來上網時 ) ？呵呵！他最大的用途就是『造福懶惰與記憶性薄弱的人類∼』哈哈！沒錯！為什麼說他是造福人類呢？且聽我娓娓道來：
  • /etc/hosts 的歷史：
    還記得我們在 網路基礎 裡面提過的吧？目前在 Internet 上面通用的通訊協定為 TCP/IP ，那麼資料傳送是以 TCP 封包來傳送，他還是建置在 IP 協定之上的，而眾所皆知的， IP 是由四組 8 bit 的號碼組成的，也就是類似『 xxx.yyy.zzz.www 』這樣的型態，好啦，那麼如果我們要連上某一部電腦，就要在網址列輸入該電腦主機的 IP 才能連接的上，如果是一部或兩部電腦那還無所謂，如果像目前這種 Internet 的主機數目.....嘿！誰記得住這麼多的 IP 呀！？由於 IP 是一堆沒有意義的數字所組成的，實在不容易被懶惰與記憶性薄弱的人類所接受 ( 說的是鳥哥自己 ....) ，那如果將這些數字以『名字』來取代呢？那又如何？嘿嘿！早期的人類早就想到這個簡單又偷懶的方式了，那就是 /etc/hosts 這個檔案的由來！例如，只要你輸入『 ping -c 5 localhost 』你的 Linux 馬上可以印出 127.0.0.1 這個 IP ， Why ？你去看一下 /etc/hosts 就知道為什麼了！所以囉，只要將你常常上網的『網址對應的 IP 』寫到這個 /etc/hosts 底下，你的 IP 搜尋速度就會快上很多∼
  • DNS 的歷史：
    但是， Internet 上面這麼多主機，總不能一個一個的將他輸入在 /etc/hosts 裡面吧！？對呀！真不聰明！所以後來的這個時候就有所謂的『領域名稱解析伺服器, DNS』出現啦！DNS 利用類似樹狀目錄的型態，將主機名稱的管理分配在不同層級的 DNS 主機當中，經由分層管理，所以每一部主機的記憶的資訊就不會很多，而且異動上面也相當的容易修改！那麼這個 DNS 的功能你知道了嗎？對啦！就是『將電腦主機的名稱轉譯成 IP 』就是了！當然囉，他的額外功能還很多，關於 DNS 的詳細的解析部分我們將在後續的章節當中在持續的加強內容，這裡先談個大概即可！總之，他的最大功能就是『讓有意義的，人類較容易記憶的主機名稱(英文字母)，轉譯成為電腦所熟悉的 IP 位址！』舉個例子來說好了，奇摩雅虎的網站的 IP 是 202.1.237.21 ，所以你可以在你的瀏覽器上面輸入『 http://202.1.237.21 』來連上奇摩雅虎！不過，我想沒有幾個人能夠將這個 IP 背的起來的吧？！反之，我們卻都知道奇摩雅虎的網址為 tw.yahoo.com ，那麼你只要輸入『 http://tw.yahoo.com 』就可以連上 Internet 啦！很容易記憶吧！不過，電腦怎麼知道 tw.yahoo.com 就是 202.1.237.21 呢？底下我們以我們的主機 aerosol.ev.ncku.edu.tw 來說明 DNS 的搜尋原理吧！
  • DNS 的查詢流程：
    剛剛說過 DNS 是以類似『樹狀目錄』的型態來進行名稱的管理的！所以每一部 DNS 主機都『僅管理下一層 DNS 主機的名稱轉譯』而已，至於下層的下層，則『授權』給下層的 DNS 主機來管理啦！這樣說好像很繞口，好吧！我們就以下圖來說一說原理囉：
    首先，當你在網址列輸入 http://aerosol.ev.ncku.edu.tw 時，你的電腦就會依據 /etc/resolv.conf 所提供的 DNS 的 IP 去進行連線查詢，好了，用最常見的 Hinet 的 168.95.1.1 這個 DNS 主機好了，這個時候， hinet 的這部主機會這樣工作：
    1. 先查看本身有沒有紀錄：因為 hinet 並沒有紀錄到學術網路上面的資訊，所以自然也就沒有辦法直接提供給 client 端關於 aerosol.ev.ncku.edu.tw 這部機器的 IP 了，好了，這個時候 168.95.1.1 就會向 .tw 這部機器查詢；
    2. 向最頂層查詢：由於 168.95.1.1 沒有紀錄我們主機的 IP ，這個時候他就會向『最頂層』的 .tw 這部主機來查詢資料了！而.tw 這部機器管理的只有 .com.tw, .edu.tw ... 那一行的幾部主機的 IP 而已，所以他也不曉得 aerosol 那部主機的 IP ，但是他卻可以告訴 168.95.1.1 說『嘿！你可以到 .edu.tw 那部機器去查詢！我這裡有 .edu.tw 的 IP 呦！』；
    3. 向第二層查詢：168.95.1.1 接著又到 .edu.tw 去查詢，而該部機器管理的又僅有 .ncku.edu.tw, .nsysu.edu.tw, .... 那幾部主機，所以這個時候 .edu.tw 又告訴 168.95.1.1 說：『你要去 .ncku.edu.tw 那裡查詢，我有他的 IP ！』；
    4. 向下層持續查詢：好了，一步一步下來， .ncku.edu.tw 可以查到 .ev.ncku.edu.tw 的 IP ，而最後我們 aerosol.ev.ncku.edu.tw 就可在 .ev.ncku.edu.tw 當中查詢到啦！
    5. 記錄暫存記憶體：查到了 IP 之後， 168.95.1.1 會先記錄一份對應 IP 的資訊在自己的暫存記憶體當中，以方便下一次同一個主機名稱的要求之查詢！然後再將結果回報給 client 端！
    就是這樣的分層負責，所以當你的主機名稱要修改時，你只要向你的上層 DNS 要求修改，那麼全世界就都可以找到你修改過後的主機名稱對應的 IP 了！很簡單維護吧！機動性也很高吧！好啦！那麼我們需要架設 DNS 了嗎？！哈哈！當然不是，為什麼呢？這個就牽涉到『授權』的問題了！
  • 關於授權的 DNS 主機：
    很多朋友都認為『我要架站，因為主機要有名字，所以一定需要架設 DNS ？』是這樣嗎？當然不是！這是錯誤的觀念，怎麼說呢？從上面的圖示當中，你應該不難發現，當我要搜尋 aerosol.ev.ncku.edu.tw 時，就需要由 .ev.ncku.edu.tw 這部機器上面查到，而 .ev.ncku.edu.tw 則需要在 .ncku.edu.tw 上面查到！好了，那麼 .ncku.edu.tw 怎麼知道 .ev.ncku.edu.tw 的 IP 呢？這是因為『 .ncku.edu.tw 已經授權給 ev.ncku.edu.tw 這部機器，當有人要查詢 .ev.ncku.edu.tw 時， .ncku.edu.tw 將把查詢的任務直接轉給 .ev.ncku.edu.tw 去管理了！』所以囉，如果你要架設 DNS ，而且是可以連上 Internet 上面的 DNS 時，你就必須要透過『上層 DNS 主機的授權』才行！
    那麼我要怎麼架站呢？很簡單阿！剛剛不是說過嗎？ DNS 系統最大的功能就是『主機名稱轉譯成 IP 』這個動作，那麼你只要向任何一個合法的 DNS 主機申請一個『主機名稱, hostname 』給你的 Linux 主機，讓大家都可以藉由該 DNS 主機來查詢到你的 Linux 之 IP ，就可以使用該主機名稱來架站啦！就是這麼簡單！
  • 關於網址列的意義：
    那網址列的名稱有沒有什麼意義呢？其實是有的，網址列的最後幾個字母代表的意義如下：
    名稱
    代表意義
    com
    公司、行號、企業
    org
    組織、機構
    edu
    教育單位
    gov
    政府單位
    net
    網路、通訊
    mil
    軍事單位
  • 動態 DNS 系統：
    好了，既然知道了 DNS 系統了，那什麼叫 動態DNS 呢？剛剛我們上面提到的大都是屬於『一個主機名稱對應一個固定的 IP 位址！』的型態，但是由於近年來撥接網路的盛行，而撥接網路所分給你的 IP 並非固定的，例如以 seednet 為例，你每次重新開機而 seednet 就會隨機分配給你一個 IP ，也就是說，你的 Linux 主機的 IP 在每次重新撥接上網時都會不一樣！
    那就會產生一個問題，如果你架設了一個網站，但是你的 IP 卻一直變來變去，那用戶端如何跟你連線呢？這時就有所謂的動態 DNS 出現了，他的運作原理是這樣：
    1. Client 端(就是你啦)每次開機或者是重新撥接後，取得一個新的 IP 之後，會向 DNS Server 端提出要求，希望 Server 端變更主機名稱與 IP 的對應（這個步驟你可以使用 scripts 來自動判讀與達成！）；
    2. Server 端接受 Client 端的要求之後，會先去查詢 Client 提供的帳號密碼是否正確，正確之後就會立即修改 Server 本身對於你的主機名稱的設定值，
    因此，只要別人知道你的主機名稱，不論你的 IP 為何，他一定可以連上你的主機（因為 IP 跟著你的主機而變！）這對於我們這種使用動態 IP 的人是很有幫助的！（阿！真是造福我們這些窮苦人家的孩子呀！）底下我們就是要使用這個動態 DNS 來進行偵測的技巧啦！
哪裡申請 DNS ：
靜態 DNS 主機註冊：
好了！既然知道了 DNS 的用途，那麼自然我們就需要來申請 DNS 啦！不然怎麼架設網站呢？目前的靜態 IP 對應主機名稱的註冊網站有底下幾個！當然還不止啦！我們僅提出幾個出來分享就是了！
  • 台灣網路資訊中心
  • http://www.netsol.com/
  • http://www.dotster.com/
  • 荻恩斯科技
動態 DNS 主機註冊：
那麼有沒有免費的 DNS 系統呀！呵呵！當然有囉！我們要感謝造福我們這些窮苦人家的孩子的大好人∼∼你可以在底下找到相關的資訊：
  • 台灣地區免費動態DNS系統(中文)
  • http://dns2go.deerfield.com/
  • http://www.dyndns.org/
動態 DNS 偵測與自動更新小技巧：
好了，既然已經申請了 動態 DNS 了，那麼要架設主機的時候，當然就不希望還要手動的來更新你的 IP 對應主機名稱囉，對吧！所以這個時候就需要使用 shell scripts 的方式來自動的更新 ( update ) 你的 IP 對應的動態 DNS 主機名稱囉！除此之外，如果你並不想要更新動態的 DNS 的話，那麼也可以在 ADSL 撥接斷線的時候可以傳送 IP 給你吧！這樣的話，也比較能夠讓你瞭解目前主機的狀態，不是嗎？！嘿嘿！沒錯！接著下來，我們將要使用一組 script 來進行我們的 IP 偵測工作！在實際進行 scripts 之前，你應該先要瞭解一下我是如何設計這個 script 的吧？！
  • 僅 e-mail 給管理員：
    適用的環境：沒有申請 www.adsldns.org 的主機名稱；
    功能：不會更新 DNS ，僅會將新的 IP e-mail 給系統管理員。
    原理：利用簡單的 IP 分析，如果新的 IP 分析出來的結果是沒有連線的，那麼系統將先啟動 Internet 連線，如果舊的 IP 與新的 IP 不一樣，那麼就將新的 IP 寄給系統管理員！
  • E-mail 之外，還會更新 DNS 組態：
    適用環境：申請 www.adsldns.org 主機名稱者；
    功能：除了新的 IP 將 e-mail 給系統管理員之外，亦將會分析 DNS 主機的 IP 。
    原理：利用 IP 分析，若發現斷線，則自動加以連線，而連線之後的 IP 除了 e-mail 給系統管理原之外，亦將與 Internet 上面的主機名稱 IP 比對，若不相同，則直接予以更新 DNS 的 IP ！
  • 在 IP 分享器後端的 Linux 來更新 DNS 的 IP ：
    適用環境：在 IP 分享器的後端的 Linux 主機，可用來判斷 IP 分享器的 IP
    功能：除了判斷 IP 分享器的 IP ，並將 IP mail 給系統管理原之外，亦將更新 DNS 的 IP ；
    原理：利用 www.adsldns.org 可以判斷自己的 IP 的原理，用來將該 IP 整個的更新！
上述的功能我將他全部都寫在同一個 script 裡面了，你必須要選擇你所需要的環境，而這個 script 將可同時適用 ADSL 與 Cable 的浮動式 IP 的狀態！
#!/bin/bash
#
# WHAT IS THIS PROGRAM
# This program is used to connect your dynamic DNS server
# http://www.adsldns.org
# You can use this program to do something
# 1. Just e-mail to root your Linux's IP
# 2. Just re-dial up your ADSL and e-mail your Linux's IP
# 3. Re-dial, connect to www.adsldns.org and e-mail IP
# 4. The script behind in the IP share mechine.
#
# HOW TO RUN THIS PROGRAM
# 1. download the last version of this file in
# http://aerosol.ev.ncku.edu.tw/~vbird/
# 2. mkdir /usr/local/pingcard
# 3. cp ping_net_card.sh /usr/local/pingcard
# 4. vi /usr/local/pingcard/ping_net_card.sh
# modified the nessecery parameters in this file.
# 5. chmod 744 /usr/local/pingcard/ping_net_card.sh
# 6. vi /etc/crontab
# adding the following line.
# */2 * * * * root /usr/local/pingcard/ping_net_card.sh
# 7. This program will automatical running every 2 minutes.
#
# History and lastlog
#======================================================================
# Date Who What
#======================================================================
# 2002/08/05 VBird Use the older scripts to modify and adding some
# modules to fit everyone's needed.
#######################################################################
#
#
#
#====================== INPUT SESSION =================================
# 1. The following are parameters of http://www.adsldns.org
# 輸入你在 www.adsldns.org 申請的帳號與密碼等等項目！
password="your.pass.word"
email="your.email"
hostname="your.host.name"

# 2. The Network Interface Card ( NIC ), which connect with ADSL modem.
# And the output interface ( For example > NIC = eth0 and IF = ppp0)
# And the method of connect to your ISP ( ADSL or Cable )
# mothod : 連接上 Internet 的方法！有 cable 及 adsl 兩種！
# nicif : 連接在 adsl 或 cable moden 上面的網路卡代號，
# outif : 對外連接的網路卡代號，以 adsl 撥接而言是 ppp0 ，以 cables 而言則是與 nicif 同一個網路卡代號！
method="adsl" # 輸入 "cable" 或 "adsl"
nicif="eth1" # 如果是 cables 的話，請輸入接在 cable moden 上面的網卡代號
outif="ppp0" # 如果是 cables 的話，那麼則是與 nicif 相同的網卡代號

# 3. The following e-mail is used to collect your Linux's dynamic IP
# Please keyin the public e-mail and sure that you can get your IP.
# 這裡請輸入可以收的到的電子郵件信箱！
emailto="root@localhost"

# 4. The based directory. The default directory is /usr/local/pingcard
# If you want to change this directory, write it down here, or
# you can use the default parameters
# 這個檔案放置的地方！
basedir="/usr/local/pingcard"
basefile="$basedir/oldcardIP"

# 5. What jobs is your needed?
# 1. e-mail and re-dial up
# 2. e-mail, re-dial up, and update DNS
# 3. IP share ==> e-mail and update DNS
jobs="2"

#######################################################################
#
#
#
#====================== DETECT FILES SESSION ==========================
# 1. Detect the lynx package.
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
if [ "$jobs" == "2" ] || [ "$jobs" == "3" ]; then
if [ ! -f /usr/bin/lynx ]; then
echo "The nessecery package ==> lynx do not install!"
echo "Please install this package before running this."
exit
fi
fi

# 2. Detect the old IP file
welcome='Welcome to use this program to update your IP to
www.adsldns.org. This message is only show you at the first time.
If you have any problem about this program, and/or you have any
good ideas for develop this program, please contact with me.
http://aerosol.ev.ncku.edu.tw/~vbird'
if [ ! -f $basefile ]; then
echo $welcome | mail -s "Welcome using ping_net_card.sh" \
$emailto
/bin/touch $basefile
fi

#######################################################################
#
#
#
#====================== ONLY EMAIL SESSION jobs 1 =====================
if [ "$jobs" == "1" ]; then
# 1. Get the older IP and newer IP
oldip=`cat $basefile`
newip=`/sbin/ifconfig "$outif" | /bin/grep 'inet' | \
/usr/bin/awk '{print $2}' | /bin/sed -e "s/addr\://"`
# 2. compare with older IP and newer IP. And e-mail to you
if [ "$newip" == "" ]; then
if [ "$method" == "adsl" ]; then
/sbin/ifdown $nicif > /dev/null 2>&1
adsl-stop > /dev/null 2>&1
adsl-start
fi
if [ "$method" == "cable" ]; then
/sbin/ifdown $nicif > /dev/null 2>&1
/sbin/ifup $nicif
fi
newip=`/sbin/ifconfig "$outif" | /bin/grep 'inet' | \
/usr/bin/awk '{print $2}' | /bin/sed -e "s/addr\://"`
fi
if [ "$newip" != "$oldip" ]; then
echo $newip | \
mail -s "The new IP in your $hostname" $emailto
echo "$newip" > $basefile
fi
exit
fi

#######################################################################
#
#
#
#====================== EMAIL and UPDATE SESSION job 2 ================
if [ "$jobs" == "2" ]; then
# 1. Get the older IP and newer IP
oldip=`cat $basefile`
newip=`/sbin/ifconfig "$outif" | /bin/grep 'inet' | \
/usr/bin/awk '{print $2}' | /bin/sed -e "s/addr\://"`
# 2. compare with older IP and newer IP. And e-mail to you
if [ "$newip" == "" ]; then
if [ "$method" == "adsl" ]; then
/sbin/ifdown $nicif > /dev/null 2>&1
adsl-stop
adsl-start
fi
if [ "$method" == "cable" ]; then
/sbin/ifdown $nicif > /dev/null 2>&1
/sbin/ifup $nicif
fi
newip=`/sbin/ifconfig "$outif" | /bin/grep 'inet' | \
/usr/bin/awk '{print $2}' | /bin/sed -e "s/addr\://"`
fi
if [ "$newip" != "$oldip" ]; then
echo $newip | \
mail -s "The new IP in your $hostname" $emailto
echo "$newip" > $basefile
# 3. update your dynamic DNS settings
HOST="http://www.adsldns.org:8080/clientupdate.php?email=$email&passwd=$password&hostname=$hostname&debug=1&forceip=$newip"
lynx -dump $HOST > /dev/null 2>&1
fi
# 4. check if the DNS name == newip
dnsip=`host $hostname | awk '{print $4}'`
declare -i testdnsip=`echo $dnsip | cut -d'.' -f1`
if [ "$testdnsip" == "0" ];then
exit
fi
if [ "$newip" != "$dnsip" ]; then
HOST="http://www.adsldns.org:8080/clientupdate.php?email=$email&passwd=$password&hostname=$hostname&debug=1&forceip=$newip"
lynx -dump $HOST > /dev/null 2>&1
fi
exit
fi

#######################################################################
#
#
#
#====================== SHARE IP MECHANIME job 3 ======================
if [ "$jobs" == "3" ]; then
# 1. Get the older IP and newer IP
oldip=`cat $basefile`
newip=`lynx -dump "http://www.adsldns.org:8080/login.php?email=$email&passwd=$password"| grep 您好|cut -d":" -f2`
declare -i testdnsip=`echo $newip | cut -d'.' -f1`
if [ "$testdnsip" == "0" ];then
exit
fi
# 2. compare with older IP and newer IP. And e-mail to you
if [ "$newip" != "$oldip" ]; then
echo $newip | \
mail -s "The new IP in your $hostname" $emailto
echo "$newip" > $basefile
# 3. update your dynamic DNS settings
HOST="http://www.adsldns.org:8080/clientupdate.php?email=$email&passwd=$password&hostname=$hostname&debug=1&forceip=$newip"
lynx -dump $HOST > /dev/null 2>&1
fi
# 4. check if the DNS name == newip
dnsip=`host $hostname | awk '{print $4}'`
declare -i testdnsip=`echo $dnsip | cut -d'.' -f1`
if [ "$testdnsip" == "0" ];then
exit
fi
if [ "$newip" != "$dnsip" ]; then
HOST="http://www.adsldns.org:8080/clientupdate.php?email=$email&passwd=$password&hostname=$hostname&debug=1&forceip=$newip"
lynx -dump $HOST > /dev/null 2>&1
fi
exit
fi

上面的 script 你可以在 這裡下載，至於安裝的方法就相當的簡單啦！你只要下載該 script ，然後將他移動到適當的目錄之下，修改一下上面顯示黃色的地方，然後再修改你的 /etc/crontab ！嘿嘿！那就成功囉！
1. 下載 script 並移動到適當的目錄：
[root @test /root]# wget http://aerosol.ev.ncku.edu.tw/~vbird/download/ping_net_card.sh
[root @test /root]# mkdir /usr/local/pingcard
[root @test /root]# cp ping_net_card.sh /usr/local/pingcard
[root @test /root]# chmod 744 /usr/local/pingcard/ping_net_card.sh
[root @test /root]# vi /usr/local/pingcard/ping_net_card.sh
這個時候進入 vi 的畫面，請依照您的需求來修改 INPUT 的部分！

2. 修改 crontab
[root @test /root]# vi /etc/crontab
....新增加一行：
*/3 * * * * root /usr/local/pingcard/ping_net_card.sh

嘿嘿！這樣一來，如果你的主機不正常的斷電之後，在三分鐘之內就會自動的撥接，此外，還會自動的上網去更新你的 DNS 主機名稱！還會 e-mail 到你的信箱去！告訴你最新的 IP 是幾號！哈哈！簡不簡單呀！？（註：因為我沒有 cable modem ，所以在 cable 的部分我是經由網友回報而做成的 script ！此外，我也沒有 IP 分享器！所以第三個 jobs=3 還沒有測試過！無論如何， jobs=1 是完全沒有問題的！此外，針對朋友們常常發生的 lynx 沒有安裝的問題，這是我也先將他寫了一個小小的檢查檔案，可以告訴朋友們！嘿！你的 lynx 安裝了沒？！）

2002/08/05 以來統計人數


簡易 Telnet 與 SSH 主機設定
最近更新日期：2003/03/08

一部連上 Internet 上面的你的個人主機，最重要的是什麼呢？大概就是如何讓您自己可以連線進入自己的主機，並且進行所謂的『遠端操控』了吧！也就是說，您可以在任何具有連上 Internet 電腦的地方，以遠端連線軟體連上 Internet ，並藉由您主機上面的連線軟體提供的功能，直接登入您的主機來進行操控的工作！此時，您將發現 Linux 有趣又好玩的地方囉！在 Unix Like 的機器當中，幾乎都提供 Telnet 這個遠端連線伺服器軟體，不過， Telnet 本身是以明碼來傳送你操作的資料，安全上面是值得來思考要不要開放吶！這個時候就有需要瞭解一下傳送過程中以加密動作來傳送的 SSH 這個遠端連線伺服器軟體啦！這個章節當中，我們會提到 Telnet 與 SSH 這兩個伺服器，值得參考喔！

遠端連線程式的功能：
Telnet 伺服器：
    telnet 伺服器：安裝、啟動與關閉服務
    telnet 用戶端：好用的連線軟體
    telnet 安全性：iptables, TCP_Wrappers, 純建議,
SSH 伺服器：
    連線加密技術簡介：
    啟動 ssh 服務：
    ssh 用戶端連線： ssh, sftp, putty,
    詳細設定 sshd 伺服器：/etc/ssh/sshd_config
    製作不用密碼可立即登入的 ssh 用戶： ssh-keygen,
    安全設定： sshd_config, iptables, TCP_Wrappers,
參考資源
本章習題練習
遠端連線程式的功能：
在這個章節當中，首先，我們要先來瞭解一下，什麼是『遠端連線伺服器』？這個東西的功能為何？我想，您應該已經聽過，一個良好的網路環境當中，一部開放到 Internet 上面的伺服器，基本上，他可以不需要顯示卡、螢幕、鍵盤、滑鼠等等的配備！只要有基本的主機板、CPU、RAM、硬碟再加上一塊好一點的網路卡，並且連上 Internet ！哈哈！那麼你要操控這部主機的時候，只要透過網路連線進來，然後進行任何修改即可！嘿！所以囉，這個時候主機自然不需要周邊設備啦！
以鳥哥個人為例，目前鳥哥管理大約七、八部左右的 Unix-Like 主機，這些主機都不在同一個地方，分佈在南台灣各處！那麼當有新的套件的漏洞被發佈，或者是需要進行一些額外的設定的時候，是否我本人一定要到現場嗎？當然不需要， 只要透過網路連線到該主機上面，就可以進行任何工作了！真的就好像在螢幕前面工作一般的輕鬆愉快！^_^！這就是遠端連線伺服器啦！遠端連線伺服器的功能當然還不只如此！舉個例子來說：當您的工作需要使用到 Linux 的強大的編譯功能時，那麼您一定需要 Linux 對吧！而且最好是運算速度快一點的主機，這個時候你可以將你研究室最快的那一部主機開放出來，設定一下遠端連線伺服器，讓你的學生啦，或者是研究室的同仁啦，可以透過這部機器幫他們進行研究的工作，這個時候，你的主機就可以讓多人進行分享 Linux 運算的功能啦！
在早期的網路世界裡，由於只有 Unix 機器，而且個人電腦還不流行的時候，想要使用大型主機來進行數值程式的運算時(在我們工程界，比較常使用 Fortran 這一類的程式語言，至於 C 語言則較少碰∼)，就需要向學校單位申請工作站的帳號，並且以遠端連線程式連進主機，以使用 Unix 的資源來進行我們的數值模式運算！所以啦，那個遠端連線伺服器的設定，基本上，對於系統管理員是很重要的！尤其對於大型的工作站類型的 Unix-Like 主機，由於很多人都需要使用到他的 CPU 運算核心功能，或者是他的編譯程式( compiler )來進行運算，這時的遠端連線就更形重要啦！

那麼是否每一部連上 Internet 上面的主機都應該要開放遠端連線的功能呢？其實並不盡然，還是需要針對你的主機來進行規劃的，我們底下分伺服器與工作站來說明：
    • 伺服器類型( Server )的連線程式：
      在一般開放網際網路服務的伺服器中，由於開放的服務可能會有較為重要的資訊，而遠端連線程式連進主機之後，可以進行的工作又太多了(幾乎就像在主機前面工作一般！)，因此網際網路的遠端連線程式通常僅針對少部分系統維護者開放而已！除非必要，否則 Server 類型的主機還真的不建議開放連線的服務呢！以鳥哥為例，我的主機提供了我們研究室使用 Mail 與 Internet 上面的 WWW 服務，如果還主動提供遠端連線的話，那麼萬一不小心被入侵，那可就傷腦筋了！因此，鳥哥僅開放『很小部分的網域』讓系統管理員連進來，其他來源的 IP 一律抵擋！不許使用遠端連線的功能呢！
    • 工作站類型( Workstation )的連線程式：
      至於工作站的情況就跟伺服器不太一樣了！工作站常常僅針對內部的幾個使用者開放而已，通常是不希望連上 Internet 的啦！而且所謂的工作站自然就是用來做工的！例如鳥哥的其中一部 Linux 就是專門用來進行大型的數值模式計算模擬之用！這個時候的遠端連線伺服器可能就得要對多人啟動了！因為工作站的強大運算功能可以讓很多人一同使用他的計算能力！而且也可以免除每部電腦都得要安裝 compiler 的窘境！要知道，某些工程用的 compiler 是粉貴的∼

    那麼目前遠端連線伺服器的主要類型有哪些呢？目前最常見的遠端連線伺服器主要有以明碼傳送資料的 telnet 伺服器，及以加密過的封包進行傳送來連線的 ssh 伺服器！雖然 telnet 可以支援的 client 端的軟體比較多，不過由於他是使用明碼來傳送資料，很容易遭到有心人士的擷取！所以近來我們都呼籲大家多使用 ssh 這一種連線方式，而捨棄掉 telnet 這個比較不安全的咚咚囉！底下我們就分別來談一談這兩種連線伺服器吧！ ^_^
Telnet 伺服器：
知道 telnet 是什麼嗎？咦！不就是連接 BBS 的工具嗎？！嘿嘿！沒錯！他確實也是 BBS 軟體類的掛上的一個伺服器啦！不過這裡我們暫不玩弄 BBS ！ telnet 可以說是歷史相當悠久的遠端連線伺服器哩！而且支援他的軟體也相當的多！例如知名的 netterm 就直接支援他啦！連線之後的界面也漂亮，在 client 端的中文傳輸與輸入也沒有問題！相當的不錯用！不過，他最麻煩的地方就是.....比較不安全而已啦∼
    底下我們談一談怎麼啟動與使用 telnet 伺服器吧！
  • telnet 伺服器：安裝、啟動與關閉服務

    安裝：
    如何啟用 Telnet 這個好用的伺服器呢？首先，當然一定要有安裝囉！近年來由於 telnet 的傳輸問題，所以在新的 Linux 版本上面，已經都將 telnet 這個伺服器排除在『先發名單』之外啦，也就是說，很多 Linux distribution 預設是不安裝 telnet 的，不過，在每個主要的 Linux distribution 還是有提供在光碟當中啦！所以您要拿出原版光碟，並且安裝好他，就可以啦！如何確認是否已經安裝了 telnet 呢？最簡單的方法就是使用最廣泛被使用的 RPM 啦！

    [root @test /root]# rpm -qa | grep telnet
    telnet-server-krb5-1.2.5-1mdk
    telnet-client-krb5-1.2.5-1mdk
    上面是 Mandrake 9.0 的範例；或底下是 Red Hat 7.2 的範例
    telnet-0.17-20
    telnet-server-0.17-20

    需要特別留意的是，如果要提供 telnet 連線服務，通常需要安裝兩個 RPM 喔：

    1. 一個是 telnet-client (或 telnet)，這個套件提供的是 telnet 用戶端的連線程式；
    2. 另一個是 telnet-server 套件，這個才是真正的 Telnet server 軟體喔！

    所以，如果你的系統上面找不到等一下要設定的 telnet 設定檔，肯定就是沒有安裝 telnet 啦！請拿出你的光碟片，然後 mount 之後，趕緊的安裝他吧！否則就無法進行下一步的設定啦！ ^_^

    啟動與關閉：
    還記得『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的『認識服務 ( daemon )』那個章節吧！？要記得 super daemon 呦！？沒錯啦，我們的 telnet 就是掛在 super daemon 底下的一支服務而已！那個咚咚就是有名的 xinetd 囉！( 註：在某些舊版的套件上面也有使用 inetd 的，啟動的方式有點不太一樣，不過差異不大啦！只要懂得基本的常識，那麼就不會有問題囉！所以鳥哥才會要大家先讀完 Linux 基礎篇 啦！ ) 啟動的方式就是：

      (1)將 xinetd 裡面關於 telnet 的項目開啟，然後
      (2)重新啟動一次 xinetd 就成功啦！

    那麼如何開啟 telnet 的項目呢？很簡單，有兩個方式，
    1. 使用 ntsysv 或 chkconfig：
      還記得小紅帽 ( Red Hat ) 裡面的 ntsysv 這個好用的東西嗎？對了，在 Red Hat 底下有這麼一個好用的設定工具，你可以使用 ntsysv 出現的視窗之中，將 telnet 勾選起來，然後按下 OK 離開即可囉！

    2. 使用 vi 修改 /etc/xinetd.d/telnet 這個檔案：
      那麼如果不是 Red Hat 的 Linux 系統呢？基本上， ntsysv 也只是修改 /etc/xinetd.d 這個目錄下的資料而已，所以我們當然可以手動自己修改他啦！
      [root @test /root]# vi /etc/xinetd.d/telnet
      # default: on
      # description: The telnet server serves telnet sessions; it uses \
      # unencrypted username/password pairs for authentication.
      service telnet
      {
      disable = yes <==就是改這裡，將 yes 改成 no 即可！
      flags = REUSE
      socket_type = stream
      wait = no
      user = root
      server = /usr/sbin/in.telnetd
      log_on_failure += USERID
      }
      看到了沒！？只要將 disable (取消的意思) 變成 no ，也就是不取消，亦即是開啟啦！
    設定完開啟之後，自然就是要啟動啦，剛剛提到 telnet 是掛在 xinetd 底下的，所以自然只要重新啟動 xinetd 就能夠將 xinetd 裡頭的設定重新讀進來，所以剛剛設定啟動的 telnet 自然也就可以被啟動啦！而啟動的方式也有兩種方式，其中 service 僅支援在 Red Hat 與 Mandrake 底下，所以通常我還是以 /etc/rc.d/init.d 底下的 scripts 為啟動的主要方法啦！

      方法一：僅支援 Red Hat 或 Mandrake 系統：
      [root @test /root]# service xinetd restart
      Stopping xinetd: [ OK ]
      Starting xinetd: [ OK ]

      方法二：正統的啟動方式：
      [root @test /root]# /etc/rc.d/init.d/xinetd restart
      Stopping xinetd: [ OK ]
      Starting xinetd: [ OK ]
      注意：有的某些版本並沒有 restart 的選項，這個時候就需要：
      stop 再 start 囉！

    那麼要看有沒有啟動服務呢？怎麼看？其實也很簡單啦，還記得我們在前幾章提到的『 限制 Linux port 的連線 』那一章嗎？使用 netstat 就可以啦！

      [root @test /root]# netstat -tl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 *:ssh *:* LISTEN
      tcp 0 0 *:telnet *:* LISTEN

    看到了嗎？沒錯，那個 telnet 就是啟動的項目啦！( 這裡考一個問題，那個 port 對應的服務名稱在哪一個檔案裡面查詢到的呢？在每一個 Linux 系統都有的檔案呦！忘記了呀！？再回到前面看看 限制 Linux port 的連線 ，然後用 vi 去看看那一個檔案的內容吧！ ^_^ )那麼要如何關閉呢？呵呵！那就真的是太簡單啦！就將剛剛的步驟再做一次，而將設定值轉變一下即可！步驟如下啦！
      step 1: 修改一下 /etc/xinetd.d/telnet 檔案：
      [root @test /root]# vi /etc/xinetd.d/telnet
      # default: on
      # description: The telnet server serves telnet sessions; it uses \
      # unencrypted username/password pairs for authentication.
      service telnet
      {
      disable = no <==就是改這裡，將 no 改成 yes 即可！
      flags = REUSE
      socket_type = stream
      wait = no
      user = root
      server = /usr/sbin/in.telnetd
      log_on_failure += USERID
      }

      step 2: 重新啟動 xinet 即可：
      [root @test /root]# /etc/rc.d/init.d/xinetd restart

    這樣就關掉啦！很簡單吧！
  • telnet 用戶端：好用的連線軟體

    剛剛上面提到的都是在伺服器端的設定而已！那麼在客戶端有什麼好用的軟體可以連上 Server 的呢？最常見到的應該就是 netterm 這個鼎鼎大名的連線軟體了吧！我想，只要玩過 BBS 的大概都曉得這個軟體才對！所以這裡就不提了！另外，目前幾乎所有的作業系統都提供了 telnet 這個程式，這個程式可以直接輕易的就連上 telnet server 呢！例如您要在 Linux 上面連上自己的 telnet 伺服器，可以這樣做：
      [root @test /root]# telnet localhost
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      Red Hat Linux release 7.2 (Enigma)
      Kernel 2.4.18 on an i586
      login: test <==輸入帳號
      Password: <==輸入密碼請注意！密碼並不會在螢幕上面顯示任何的字眼
      Last login: Thu Oct 3 11:59:29 from test_inside <==提示上次登入的位址
      You have new mail. <==自上次登入以來，是否信箱內有新信件！？
      [test @test test]$ <==這裡就進入了 telnet 的連線程序當中了！
      [test @test test]$ exit <==離開這次 telnet 的登入！

    這樣就連線進來啦！很簡單吧！那麼在 Windows 的環境底下呢？同樣的，也是可以使用 telnet 的程式連線到 Linux 的 telnet server 裡面來！沒有問題的啦！可以依序這樣做：

    1. 按下 Windows 內的 『開始』
    2. 選擇 『執行』
    3. 在出現的視窗中輸入 『telnet your.IP.or.hostname』

    這樣就可以進入 Linux 的環境中了！很方便吧！當然啦！你也可以使用類似 netterm 這個很棒的連線軟體來連線的，這裡我們就不示範啦！
  • telnet 安全性：iptables, TCP_Wrappers, 純建議,

    telnet 這個伺服器方便歸方便，但總是一個不太好的連線解決方案，因為畢竟他是一個以『明碼』傳輸的協定，什麼是『明碼』呢？簡單的說，當你使用 telnet 的時候，你總是會在螢幕上面輸入資料吧！？最簡單的例子，就是你總是要登入 telnet 的主機畫面吧！那麼你總是需要輸入帳號與密碼吧？當主機接受你的資料後才能進行確認！這個時候，你的資料就會經過 telnet 這個協定來傳輸到主機上面，這個傳輸時候的資料基本上是沒有加密過的，也就是類似 ASCII 碼的咚咚！如此一來的話，只要有心人士在某個 router 點去監聽你的封包，而且將該資料封包捉下來，進行解讀的工作，哈哈！那麼你的帳號與密碼就被拿走了！所以下一次，別人就可以利用你的帳號與密碼了∼很危險對不對∼是很危險！除此之外， telnet 由於太老牌了，很多的駭客程式已經都寫了破解的方式，所以啟動之後，其實也很危險的啦！因此實在是建議不要啟用 telnet 說！無論如何，有些朋友還是喜歡以 telnet 來連線，那麼我們就提一些基本的注意事項好了！

    • 以比較限制的設定檔來規範連線的 IP ：
      事實上， xinetd 這個 super daemon 提供的些許的保護措施了，你可以針對你的主機的多重介面(有對內以及對外喔！)來提供不同保護等級的措施！底下列出一個範例，不過，更多的資訊請再回到『鳥哥的 Linux 私房菜 -- 基礎學習篇』當中去查閱一下『認識服務 』那一章裡面的詳細設定說明吧！
      [root @test /root]# vi /etc/xinetd.d/telnet
      # This file had been modified by VBird 2002/11/04
      # First is about inside the network
      service telnet
      {
      disable = no
      bind = 192.168.1.2
      only_from = 192.168.1.0/24 <==這兩行說明僅提供內部網域！
      instance = UNLIMITED
      nice = 0
      flags = REUSE
      socket_type = stream
      wait = no
      user = root
      server = /usr/sbin/telnetd
      server_args = -a none
      log_on_failure += USERID
      }

      # Second is about the outside domain's settings
      service telnet
      {
      disable = no
      bind = 140.116.142.196
      only_from = 140.116.0.0/16
      no_access = 140.116.32.{10,26} <==這三行設定外部較為嚴格的限制
      instance = 10
      umask = 022
      nice = 10
      flags = REUSE
      socket_type = stream
      wait = no
      user = root
      server = /usr/sbin/telnetd
      server_args = -a none
      log_on_failure += USERID
      }

    • root 不能直接以 telnet 連接上主機：
      既然 telnet 不是很安全，自然預設的情況之下就是無法允許 root 以 telnet 登入 Linux 主機的！但是，事實上， telnet 只是利用一些較為安全的機制來防止 root 登入而已∼所以囉，假如你確定你的環境夠安全(例如你的主機並沒有連上 Internet )，並且想要開放 root 以 telnet 登入 Linux 主機的話，請直接將 /etc/securetty 更改檔名即可！
      [root @test /root]# mv /etc/securetty /etc/securetty.bak
      這樣一來，root 就可以登入啦！不過，相當的不建議這樣做喔！畢竟不是很安全啦！此外，你也可以藉由修改 pam 模組來達成同樣的功能！修改 /etc/pam.d/login 這個檔案的第二行設定即可：
      [root @test /root]# vi /etc/pam.d/login
      #%PAM-1.0
      #auth required /lib/security/pam_securetty.so
      將這一行加上 # 註解掉！
      auth required /lib/security/pam_stack.so service=system-auth
      auth required /lib/security/pam_nologin.so
      account required /lib/security/pam_stack.so service=system-auth
      password required /lib/security/pam_stack.so service=system-auth
      session required /lib/security/pam_stack.so service=system-auth
      session optional /lib/security/pam_console.so
      如此一來， root 將可以直接進入 Linux 主機了！不過，還是不建議如此做的！
    • 加上防火牆 iptables：
      針對 telnet 加設防火牆 iptables 是一個好主意！如果您已經參考了前面章節提到的『簡易防火牆架設』一文，並且使用裡面的 scripts 的話，那麼不用擔心 telnet 啦！基本上，他原本就僅對內部開放 telnet ，外部是無法連上您的 telnet 的！但是，若是您自己設定了自己的防火牆機制之後，那麼想要針對 192.168.0.0/24 這個網域，及 61.xxx.xxx.xxx 這個 IP 進行 telnet 的開放呢？可以增加這幾行在您的 iptables 規則之內(請注意：防火牆的規則順序是很重要的！所以再回頭看看 簡易防火牆架設 一文是有必要的！)
      /sbin/iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 23 -j ACCEPT
      /sbin/iptables -A INPUT -p tcp -i eth0 -s 61.xxx.xxx.xxx --dport 23 -j ACCEPT
      /sbin/iptables -A INPUT -p tcp -i eth0 --dport 23 -j DROP
      上面的規則中，第一、二行是針對來源的 IP 來開放 port 23 亦即是 telnet 的協定啦！而最後一行則是將其他的所有來源的，想要連上 telnet 的連線封包都丟掉的意思！怎麼樣！很簡單吧！
    • 加上防火牆 /etc/hosts.allow(deny) 機制：
      防火牆的機制是越多越好！永遠也不嫌多的啦！這裡也可以使用 TCP_Wrappers 的機制呢！剛剛是開放了 192.168.0.0/24 這個網段，但是如果你只想要其中的 192.168.0.1 ~ 192.168.0.5 進入呢？而其他的 IP 只要一經連線，就會被記錄該 IP ，以提供 root 查詢呢？可以這樣做：
      [root @test /root]# vi /etc/hosts.allow
      in.telnetd: 192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.4, 192.168.0.5: allow

      [root @test /root]# vi /etc/hosts.deny
      in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
      /bin/echo; /usr/sbin/safe_finger @%h ) | \
      /bin/mail -s "%d -%h security" root@localhost & \
      : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

      更詳細的 TCP_Wrappers 用法請參考 簡易防火牆架設 一文囉！
    • 建議事項：
      說真的， telnet 真的不是很安全的！簡直應該說為『危險』等級的服務，所以盡量不要啟動他啦：
      1. 非必要時，不要啟動 telnet ，如果真的需要啟動 telnet ，那麼也請在啟動並且使用完畢之後，立即將他關掉！
      2. 如果確定真的要啟動 telnet 時，請確定好限制的連線範圍，使用 iptables 來設定連線的限制區域；
      3. 加上 TCP_Wrappers 的輔助，加強防火牆的功能！
      4. 隨時注意登錄檔案裡面關於 login 的事項！並且不要讓 root 能以 telnet 登入 Linux 主機！
SSH 伺服器：
    既然 telnet 不是很安全，那麼我又需要以遠端連線服務來操控我的 Linux 主機，那麼應該怎麼辦呀！？最好的方法當然就是以較為安全的連線機制的方案來解決連線的問題囉！那麼該如何解決這樣的問題呢？這也不難啦，使用 SSH 即可。那麼 SSH 是什麼呢？他有什麼特異功能？簡單的來說，SSH 是 Secure SHell protocol 的簡寫，他可以經由將連線的封包加密的技術，來進行資料的傳遞，因此，資料當然就比較安全囉！這個 SSH 可以用來取代 Internet 上面較不安全的 finger, R Shell (rcp, rlogin, rsh 等指令), talk 及 telnet 等連線模式。底下我們將先簡介一下 SSH 的連線模式，來說明為什麼 SSH 會比較安全呢！
    特別注意：這個 SSH 協定，在預設的狀態中，本身就提供兩個伺服器功能：
    1. 一個就是類似 telnet 的遠端連線使用 shell 的伺服器，亦即是俗稱的 ssh ；
    2. 另一個就是類似 FTP 服務的 sftp-server ！提供更安全的 FTP 服務。
  • 連線加密技術簡介：

    基本上，加密的技術通常是藉由所謂的『公鑰與私鑰』亦即『Public and Private keys』來進行加密與解密的動作！如下圖所示，當 SSH 伺服器主機啟動該服務之後，主機端會產生一支公鑰，而身為個人電腦的妳 ( client 端 )，在進行與 server 的連線時，可以藉由 Client 端隨機自行產生的私鑰來提供 server 的連線之用，也可以直接藉由 server 提供的私鑰來進行連線！這個與進行連線時選擇的加密版本有關，這個等一下我們再提！

    在上面的圖示中，我們可以知道，當資料由 Server 端傳送到 Client 端時，這些資料會先經過『公鑰, Public Key』來進行加密的行為，所以，在傳輸的過程中，這些資料本身是經過加密的，因此，即使這些資料在途中被截取時，要破解這些加密的資料，還是得要花費上好長一段時間的。那麼等這些經過公鑰加密的資料傳送到 Client 端之後，就可以藉由所謂的『私鑰, Private Key』來進行解密的動作。需要注意的是，這些公鑰與私鑰在每一部電腦上面都不一樣，所以，妳與 Server 的連線對其他人來說，都是很難去破解的呢！那麼這些公鑰與私鑰是如何產生的呢？底下我們來談一談目前 SSH 的兩種版本的連線模式囉！

    • SSH protocol version 1：
      每一部主機都可以使用 RSA 加密方式來產生一個 1024-bit 的 RSA Key ，這個 RSA 的加密方式，主要就是用來產生公鑰與私鑰的演算方法！這個 version 1 的整個連線的加密步驟可以簡單的這麼看：
      1. 當每次 SSH daemon (sshd) 啟動時，就會產生一支 768-bit 的公鑰(或稱為 server key)存放在 Server 中；
      2. 若有 client 端的需求傳送來時，那麼 Server 就會將這一支公鑰傳給 client ，而 Client 藉由比對本身的 RSA 加密方式來確認這一支公鑰；
      3. 在 Client 接受這個 768-bit 的 server key 之後，Client 自己也會隨機產生一支 256-bit 的私鑰(host key)，並且以加密的方式將 server key 與 host key 整合成一支完整的 Key ，並且將這支 Key 也傳送給 server ；
      4. 之後，Server 與 Client 在這次的連線當中，就以這一支 1024-bit 的 Key 來進行資料的傳遞！
      當然啦，因為 Client 端每次的 256-bit 的 Key 是隨機取的，所以妳這次的連線與下次的連線的 Key 就會不一樣啦！

    • SSH protocol version 2：
      與 version 1 不同的是，在 version 2 當中將不再產生 server key 了，所以，當 Client 端連線到 Server 端時，兩者將藉由 Diffie-Hellman key 的演算方式來產生一個分享的 Key ，之後兩者將藉由類似 Blowfish 的演算方式進行同步解密的動作！
    每一個 sshd 都提供這兩個版本的連線，而決定這兩種模式連線的，就必需要在 client 端連線時選擇連線的模式才能確認。目前預設情況下，會自動使用 version 2 的連線模式喔！而由於我們的連線資料中，經過了這個 Public 與 Private Key 的加密、解密動作，所以在中間的傳送過程中，當然就比較安全的多囉！
  • 啟動 ssh 服務：

    事實上，在我們使用的 Linux 系統當中，預設就已經含有 SSH 的所有需要的套件了！這包含了可以產生密碼等協定的 OpenSSL 套件與 OpenSSH 套件，所以呢，要啟動 SSH 真的是太簡單了！就直接給他啟動就是了！此外，在目前的 Linux Distributions 當中，都是預設啟動 SSH 的，所以一點都不麻煩，因為不用去設定，他就已經啟動了！哇！真是爽快∼無論如何，我們還是得說一說這個啟動的方式吧！直接啟動就是以 SSH daemon ，簡稱為 sshd 來啟動的，所以，手動可以這樣啟動：
    [root @test root]# /etc/rc.d/init.d/sshd start
    [root @test root]# service sshd start
    [root @test root]# netstat -tl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:ssh *:* LISTEN

    上面兩種方式都可以直接手動啟動 sshd 這個服務！然後使用 netstat -tl 看看能不能看到 ssh 的服務在監聽呢！？如果出現了上面那一行黃色字體，就表示您的 SSH 已經正確的啟動囉！這真是太簡單了吧！沒錯，但是他就是這麼簡單∼

    那麼我要如何在開機的時候就啟動這個 sshd 呢？如果是 Red Hat 的系統，可以使用 ntsysv 這支程式，而 Mandrake 可以使用 chkconfig 這個程式！至於 OpenLinux 則可以到 /etc/sysconfig/daemons 去看看喔！
    這個方式僅適合在已經有 OpenSSH 的 Linux Distributions 當中，如果以 Red Hat 6.x 為例，他並沒有預設使用 SSH 怎麼辦？別擔心，可以參考一下底下這個鳥哥之前寫過的網頁，有詳細的說明使用 tarball 安裝的步驟呢！
    使用 Tarbal 安裝 SSH 以及升級 SSH 可能會遇到的問題說明
    (http://linux.vbird.org/linux_server/0310telnetssh-2.php)
    需要注意的是， SSH 不但提供了 shell 給我們使用，亦即是 ssh protocol 的主要目的，同時亦提供了一個較為安全的 FTP server ，亦即是 ssh-ftp server 給我們當成是 FTP 來使用！所以，這個 sshd 可以同時提供 shell 與 ftp 喔！而且都是架構在 port 22 上面的呢！所以，底下我們就來提一提，那麼怎麼樣由 Client 端連接上 Server 端呢？同時，如何以 FTP 的服務來連接上 Server 並且使用 FTP 的功能呢？
  • ssh 用戶端連線： ssh, putty

    由於 Linux 與 Windows 這兩個用戶端的 Client 連線軟體並不一樣，所以我們分為兩個部分來說明：
    • Linux 用戶端：
      在 Linux 用戶端方面，我們主要以 ssh 進行一般連線，而已 sftp 進行 FTP 的使用連線！分別簡介如下：
      ssh 一般連線的使用方式：
      [root @test root]# ssh user@hostname
      [root @test root]# ssh -l test test.linux.org
      Connecting to test.linux.org...
      The authenticity of host 'test.linux.org (192.168.1.100)' can't be established.
      RSA key fingerprint is 46:cf:06:6a:ad:ba:e2:85:cc:d9:c4:8d:15:bb:f3:ec.
      Are you sure you want to continue connecting (yes/no)? yes <==請輸入 yes ！
      Warning: Permanently added 'test.linux.org,192.168.1.100' (RSA) to the list of known hosts.
      test@test.linux.org's password: <==請輸入 test 這個使用者的密碼！

      這裡請特別留意的是，如果直接以 ssh hostname 來連接進入 hostname 這個主機時，則進入 hostname 這個主機的『帳號名稱』將會是目前你所在的這個環境當中的使用者帳號！以上面為例，因為我是以 root 的身份在執行，所以如果我執行了『 ssh host.domain.name 』時，那麼對方 host.domain.name 這部主機，就會以 root 的身份來讓我進行密碼確認的登入動作！因此，為了避免這樣的麻煩，通常我都是以簡單的 e-mail 的寫法來登入遠方的主機，例如『ssh user@hostname 』即表示，我是以 user 這個帳號去登入 hostname 這部主機的意思。當然，也可以使用 -l username 這樣的形式來書寫！登入對方主機之後，其他的所有執行行為都跟在 Linux 主機內沒有兩樣∼所以，真的是很簡單吧！ ^_^ 這樣就可以達到遠端控管主機的目的了！此外，在預設的情況下， SSH 是『允許你以 root 的身份登入』喔！呵呵！更是爽快啦！此外，請特別留意的是，當您要連接到對方的主機時，如果是首次連接，那麼 Server 會問妳，妳的連線的 Key 尚未被建立，要不要接受 Server 傳來的 Key ，並建立起連線呢？呵呵！這個時候請『務必要輸入 yes 而不是 y 或 Y』，這樣程式才會接受喔！

      那麼如何使用 SSH FTP 的功能呢？也是很容易啦！就是使用 sftp 這支程式即可！而登入的方式與 ssh 相同，都是使用 sftp -l username hostname 或者直接以 sftp user@hosname 來書寫！執行之後會有底下的模樣：
      sftp 一般連線的使用方式：
      [root @test root]# sftp test@test.linux.org
      test@test.linux.org's password: <==請輸入 test 這個使用者的密碼！
      sftp> <==等待你輸入指令！

      進入到 sftp 之後，那就跟在一般 FTP 模式下的操作方法沒有兩樣了！底下我們就來談一談， sftp 這個介面下的使用指令吧！
      針對遠方主機(Server)之行為 |
變換目錄到 /etc/test 或其他目錄 | cd /etc/test cd PATH
列出目前所在目錄下的檔案或目錄 | ls dir
建立目錄 | mkdir directory
刪除目錄 | rmdir directory
顯示目前所在的目錄 | pwd
更改檔案或目錄群組 | chgrp groupname PATH
更改檔案或目錄擁有者 | chown username PATH
更改檔案或目錄的權限 | chmod 644 PATH 其中，644 與權限有關！回去看基礎篇！
建立連結檔 | ln oldname newname
刪除檔案或目錄 | rm PATH
更改檔案或目錄名稱 | rename oldname newname
離開遠端主機 | exit bye
針對本機(Client)之行為(都加上 l ) |
變換目錄到本機的 PATH 當中 | lcd PATH
列出目前本機所在目錄下的檔名 | lls
在本機建立目錄 | lmkdir
顯示目前所在的本機目錄 | lpwd
檔案傳輸 |
將檔案由本機上傳到遠端主機 | put [本機目錄或檔案] [遠端] put [本機目錄或檔案] 如果是這種格式，則檔案會放置到目前遠端主機的目錄下！
將檔案由遠端主機下載回來 | get [遠端主機目錄或檔案] [本機] get [遠端主機目錄或檔案] 若是這種格式，則檔案會放置在目前本機所在的目錄當中！可以使用萬用字元，例如： get * get *.rpm 亦是可以的格式！

      就整體而言， sftp 在 Linux 底下，如果不考慮圖形介面，那麼他已經可以取代 FTP 了呢！因為所有的功能都已經涵蓋啦！因此，在不考慮到圖形介面的 FTP 軟體時，可以直接關掉 FTP 的服務，而改以 sftp-server 來提供 FTP 的服務吧！ ^_^

    • Windows 用戶端：
      在 Linux 底下已經有 ssh 了，那麼如果在 Windows 底下呢？該怎麼辦？呵呵！這個可以直接使用 putty 這種類型的連線軟體呢，他也是免費的軟體喔！取得的方式可以參考底下的網站：
      官方網站：http://www.chiark.greenend.org.uk/~sgtatham/putty/
      中文網站：http://beta.wsl.sinica.edu.tw/~ylchang/putty/
      好了，那麼要取得哪幾個程式呢？其實只要 putty.exe 及 psftp.exe 這兩支程式就夠了！分別用來登錄 shell 及 FTP 的呢！
      • putty：
        直接在 Windows 底下執行，執行的圖示有點像底下這樣：

        這個時候請注意，由於我們比較喜歡將固定的幾個主機的IP記錄下來，所以在這裡我們需要先進行一些基本的設定才行！在上圖中，我們需要填寫：
          (1)HostName(or IP address) 那一項，及
          (2)Saved Sessions 取個好記的名字，
          (3)並且選擇 SSH 那個選項才行！
        以我的區域內網路為例，我可以寫成這個模樣：

        請千萬記得，填寫完畢之後，一定要按下右邊的『Save』按鍵，這樣妳的設定才會被記錄下來喔！接著下來，我們要設定的是每次登入的時候，都會進行記錄的項目，所以，妳可以在左邊的畫面上面按下『Logging』然後將右邊的『Always append to the end of it』，這樣才不會每次登入的時候，系統都要問妳一次，是否需要記錄！

        接著下來，我們還可以調整整個 putty 的螢幕大小呢！以下圖為例，我設定我的登入畫面為 40 行與 100 個字元！這樣的畫面比起傳統的 24 * 80 要大的多，看起來也比較舒服就是了∼那麼那個 1000 表示我的捲軸有 1000 行的紀錄，可以方便我往前查詢呢！

        調整完了螢幕的大小之後，再來這是最重要的：『妳要以第幾個 SSH version 進入？！』前面說過，我們預設是以 version2 來登入的，所以這裡我們可以調整為 2 那個項目！這樣每次登入都會以 version 2 的模式登入主機了！

        好了，已經都設定完畢了，再來當然又是要記錄囉！所以請回到『Session』的設定裡面，再按下一次『Save』，這個時候在中間的大框框就會出現妳輸入的記錄名稱，然後，以後要登入 SSH 主機時，就直接給他點兩下 test.linux.org 那個(就是妳剛剛自行設定的紀錄名稱)，就可以進入妳所點選的主機囉！

        整個 putty 大致上的流程就是這樣！如此一來，您就可以在 Windows 上面以 SSH 的協定，登入遠端的 Linux 主機嚕！粉方便吧！ ^_^ ！如果還要其他的設定，那麼就直接修改 Saved Sessions 與 HostName 這兩個項目，然後再次給他 Save ，嘿嘿！就又多一個設定值了！而且還是跟剛剛的設定值相同！很容易設定的啦！那麼如果想要中文支援的話，目前 putty 已經支援中文啦！你可以輸入中文喔！不過需要修改一下字元集，選擇左邊畫面的『window』項目，並選擇『Appearance』設定內容，設定：

        在出現的上面框框中，選擇右邊第二個項目內的『Change』去修改字元集顯示：

        將(1)字型設定為細明體(2)字集設定為『Big5』，如此一來，你的 putty 就支援中文的輸入囉！ ^_^
      • psftp：
        這一支程式的重點則是在於以 sftp 連線上 Server 。連線的方式可以直接點選 psftp 這個檔案，讓他直接啟動，則會出現下面的圖樣：
        psftp: no hostname specified; use "open host.name" to connect
        psftp>
        這個時候可以填入妳要連接上去的主機名稱，例如我的區域內網路 test.linux.org 這個主機：
        psftp: no hostname specified; use "open host.name" to connect
        psftp> open test.linux.org
        login as: test
        Using username "test".
        test@test.linux.org's password:
        Remote working directory is /home/test
        psftp>
        呵呵！這樣就登入主機啦！很簡單吧！然後其他的使用方式跟前面提到的 sftp 一樣哩！加油的使用吧！
  • 詳細設定 sshd 伺服器

    基本上，所有的 ssh 相關設定都放在 /etc/ssh/sshd_config 裡面！不過，每個 Linux distribution 的預設設定都不太相同，所以我們有必要來瞭解一下整個設定值的意義為何才好！
    # 1. 關於 SSH Server 的整體設定，包含使用的 port 啦，以及使用的密碼演算方式
    Port 22　　　　　　　　　　# SSH 預設使用 22 這個 port，你也可以使用多的 port ！
                               # 亦即重複使用 port 這個設定項目即可！
    Protocol 2,1　　　　　　　 # 選擇的 SSH 協定版本，可以是 1 也可以是 2 ，
                               # 如果要同時支援兩者，就必須要使用 2,1 這個分隔了！
    #ListenAddress 0.0.0.0　　 # 監聽的主機介面卡！舉個例子來說，如果你有兩個 IP，
                               # 分別是 192.168.0.100 及 192.168.2.20 ，那麼只想要
                               # 開放 192.168.0.100 時，就可以寫如同下面的樣式：
    ListenAddress 192.168.0.100 # 只監聽來自 192.168.0.100 這個 IP 的SSH連線。
                                         # 如果不使用設定的話，則預設所有介面均接受 SSH
    PidFile /var/run/sshd.pid　　　　　　# 可以放置 SSHD 這個 PID 的檔案！左列為預設值
    LoginGraceTime 600　　　　 # 當使用者連上 SSH server 之後，會出現輸入密碼的畫面，
                               # 在該畫面中，在多久時間內沒有成功連上 SSH server ，
                               # 就斷線！時間為秒！
    Compression yes　　　　　　# 是否可以使用壓縮指令？當然可以囉！

    # 2. 說明主機的 Private Key 放置的檔案，預設使用下面的檔案即可！
    HostKey /etc/ssh/ssh_host_key　　　　# SSH version 1 使用的私鑰
    HostKey /etc/ssh/ssh_host_rsa_key　　# SSH version 2 使用的 RSA 私鑰
    HostKey /etc/ssh/ssh_host_dsa_key　　# SSH version 2 使用的 DSA 私鑰

    # 2.1 關於 version 1 的一些設定！
    KeyRegenerationInterval 3600　 　　　# 由前面連線的說明可以知道， version 1 會使用
                                         # server 的 Public Key ，那麼如果這個 Public
                                         # Key 被偷的話，豈不完蛋？所以需要每隔一段時間
                                         # 來重新建立一次！這裡的時間為秒！
    ServerKeyBits 768 　　　　　　　　　 # 沒錯！這個就是 Server key 的長度！

    # 3. 關於登錄檔的訊息資料放置與 daemon 的名稱！
    SyslogFacility AUTH　　　　　　　　　# 當有人使用 SSH 登入系統的時候，SSH會記錄資
                                         # 訊，這個資訊要記錄在什麼 daemon name 底下？
                                         # 預設是以 AUTH 來設定的，即是 /var/log/secure
                                         # 裡面！什麼？忘記了！回到 Linux 基礎去翻一下
                                         # 其他可用的 daemon name 為：DAEMON,USER,AUTH,
                                         # LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,
    LogLevel INFO　　　　　　　　　　　　# 登錄記錄的等級！嘿嘿！任何訊息！
                                         # 同樣的，忘記了就回去參考！

    # 4. 安全設定項目！極重要！
    # 4.1 登入設定部分
    PermitRootLogin no　　 　　# 是否允許 root 登入！預設是允許的，但是建議設定成 no！
    UserLogin no　　　　　　　 # 在 SSH 底下本來就不接受 login 這個程式的登入！
    StrictModes yes　　　　　　# 當使用者的 host key 改變之後，Server 就不接受連線，
                               # 可以抵擋部分的木馬程式！
    #RSAAuthentication yes　　 # 是否使用純的 RSA 認證！？僅針對 version 1 ！
    PubkeyAuthentication yes　 # 是否允許 Public Key ？當然允許啦！只有 version 2
    AuthorizedKeysFile .ssh/authorized_keys
                               # 上面這個在設定若要使用不需要密碼登入的帳號時，那麼那個
                               # 帳號的存放檔案所在檔名！
    # 4.2 認證部分
    RhostsAuthentication no　　# 本機系統不止使用 .rhosts ，因為僅使用 .rhosts 太
                               # 不安全了，所以這裡一定要設定為 no ！
    IgnoreRhosts yes　　　　　 # 是否取消使用 ~/.ssh/.rhosts 來做為認證！當然是！
    RhostsRSAAuthentication no # 這個選項是專門給 version 1 用的，使用 rhosts 檔案在
                               # /etc/hosts.equiv配合 RSA 演算方式來進行認證！不要使用
    HostbasedAuthentication no # 這個項目與上面的項目類似，不過是給 version 2 使用的！
    IgnoreUserKnownHosts no　　# 是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄
                               # 的主機內容？當然不要忽略，所以這裡就是 no 啦！
    PasswordAuthentication yes # 密碼驗證當然是需要的！所以這裡寫 yes 囉！
    PermitEmptyPasswords no　　# 若上面那一項如果設定為 yes 的話，這一項就最好設定
                               # 為 no ，這個項目在是否允許以空的密碼登入！當然不許！
    ChallengeResponseAuthentication yes # 挑戰任何的密碼認證！所以，任何 login.conf
                                         # 規定的認證方式，均可適用！
    #PAMAuthenticationViaKbdInt yes # 是否啟用其他的 PAM 模組！啟用這個模組將會
                                         # 導致 PasswordAuthentication 設定失效！

    # 4.3 與 Kerberos 有關的參數設定！因為我們沒有 Kerberos 主機，所以底下不用設定！
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosTgtPassing no

    # 4.4 底下是有關在 X-Window 底下使用的相關設定！
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes

    # 4.5 登入後的項目：
    PrintMotd no # 登入後是否顯示出一些資訊呢？例如上次登入的時間、地點等
                              # 等，預設是 yes ，但是，如果為了安全，可以考慮改為 no ！
    PrintLastLog yes　　　　　# 顯示上次登入的資訊！可以啊！預設也是 yes ！
    KeepAlive yes　　　　　　 # 一般而言，如果設定這項目的話，那麼 SSH Server 會傳送
                              # KeepAlive 的訊息給 Client 端，以確保兩者的連線正常！
                              # 在這個情況下，任何一端死掉後， SSH 可以立刻知道！而不會
                              # 有僵屍程序的發生！
    UsePrivilegeSeparation yes # 使用者的權限設定項目！就設定為 yes 吧！
    MaxStartups 10　　　　　　# 同時允許幾個尚未登入的連線畫面？當我們連上 SSH ，
                              # 但是尚未輸入密碼時，這個時候就是我們所謂的連線畫面啦！
                              # 在這個連線畫面中，為了保護主機，所以需要設定最大值，
                              # 預設最多十個連線畫面，而已經建立連線的不計算在這十個當中

    # 4.6 關於使用者抵擋的設定項目：
    DenyUsers *　　　　　　　 # 設定受抵擋的使用者名稱，如果是全部的使用者，那就是全部
                              # 擋吧！若是部分使用者，可以將該帳號填入！例如下列！
    DenyUsers test
    DenyGroups test　　　　　 # 與 DenyUsers 相同！僅抵擋幾個群組而已！

    # 5. 關於 SFTP 服務的設定項目！
    Subsystem sftp /usr/lib/ssh/sftp-server

    基本上，在你的系統中，『除非有必要，否則請不要更改 /etc/ssh/sshd_config 這個檔案的設定值！』因為預設的情況下通常都是最嚴密的 SSH 保護了，因此，可以不需要更動他！上面的說明僅是在讓大家瞭解每個細項的一些基本內容而已！需要注意的是最後一項，如果您不願意開放 SFTP 的話，將最後一行註解掉即可！

    另外，如果妳修改過上面這個檔案(/etc/ssh/sshd_config)，那麼就必需要重新啟動一次 sshd 這個 daemon 才行！亦即是：
    /etc/rc.d/init.d/sshd restart
  • 製作不用密碼可立即登入的 ssh 用戶：

    咦！既然 SSH 可以使用 Key 來比對資料，並且提供使用者資料的加密功能，那麼可不可能利用這個 Key 就提供使用者自己進入主機，而不需要輸入密碼呢？呵呵！好主意！我們可以將 Client 產生的 Key 給他拷貝到 Server 當中，所以，以後 Client 登入 Server 時，由於兩者在 SSH 要連線的訊號傳遞中，就已經比對過 Key 了，因此，可以立即進入資料傳輸介面中，而不需要再輸入密碼呢！在實作上的步驟可以是：
    1. 首先，先在 Client 上面建立 Public Key 跟 Private Key 這兩把鑰匙，利用的指令為 ssh-keygen 這個命令；
    2. 再來，將 Private Key 放在 Client 上面的家目錄，亦即 $HOME/.ssh/ ，並且修改權限為僅有該 User 可讀的狀態；
    3. 最後，將那把 Public Key 放在任何一個你想要用來登入的主機的 Server 端的某 User 的家目錄內之 .ssh/ 裡面的認證檔案即可完成整個程序。
    說是好像很困難的樣子，其實步驟真的很簡單，我們依序來進行作業好了！
    假設前提：
      a. Server 部分為 test.linux.org 這部 192.168.0.2 的主機，欲使用的 User 為 test 這個帳號；
      b. Client 部分為 test2.linux.org 這部 192.168.0.100 PC 的 test2 這個帳號，他要用來登入 192.168.0.2 這部主機的 test 這個帳號。
    也就是說，我在 192.168.0.100 這部機器的身份為 test2 ，但是我想以 test 的身份登入 192.168.0.2 這部主機，並且希望不要使用密碼！這樣可以瞭解大前提了嗎？好了，我們就一步一步來作吧！
    1. 在 Client 端建立 Public 與 Private Key ：
      建立的方法真的是簡單到不行！直接在 192.168.0.100 這個 Client 上面，以 test2 這個帳號，使用 ssh-keygen 這個指令來進行 Key 的產生即可！不過，需要注意的是， version 1 與 version 2 使用的密碼演算方式不同，此外， version 2 提供兩個密碼演算的方法，我們這裡僅針對 version 2 的 RSA 這個演算方法進行說明！
      [test2 @test2 test2]$ ssh-keygen -t rsa <==這個步驟在產生 Keys
      Generating public/private rsa key pair.
      Enter file in which to save the key (/home/test2/.ssh/id_rsa):
      Enter passphrase (empty for no passphrase): <==這裡按 Enter
      Enter same passphrase again: <==再按一次 Enter
      Your identification has been saved in /home/test2/.ssh/id_rsa. <==這是私鑰
      Your public key has been saved in /home/test2/.ssh/id_rsa.pub. <==這是公鑰
      The key fingerprint is:
      c4:ae:d9:02:d1:ba:06:5d:07:e6:92:e6:6a:c8:14:ba test2@test2.linux.org
      注意： -t 指的是『使用何種密碼演算方式？』由於我們使用 RSA ，
      所以直接輸入 -t rsa 即可建立兩支 Keys ！
      此外，建立的兩把 Keys 都放置在家目錄下的 .ssh 這個目錄中！
      察看一下這兩把 Keys 吧！

      [test2 @test2 test2]$ ll ~/.ssh
      total 12
      -rw------- 1 test2 test2 887 Nov 12 22:36 id_rsa
      -rw-r--r-- 1 test2 test2 233 Nov 12 22:36 id_rsa.pub
      -rw-r--r-- 1 test2 test2 222 Oct 31 11:20 known_hosts

      請注意上面喔，我的身份是 test2 ，所以當我執行 ssh-keygen 時，才會在我的家目錄底下的 .ssh/ 這個目錄裡面產生所需要的兩把 Keys ，分別是私鑰(id_rsa)與公鑰(id_rsa.pub)。另外一個要特別注意的就是那個 id_rsa 的檔案權限啦！他必須要是 -rw------- 才好！否則內容被人家知道了，那麼你的 Keys 不就有可能外洩了？所以請特別留意他的權限喔！那麼那個 id_rsa.pub 則是『公鑰！』這個檔案必須要被放置到 Server 端才行！

    2. 在 Client 端放置私鑰：
      在預設的條件中，我們的私鑰必需要放置在家目錄底下的 .ssh 裡面，那麼如果是 version 2 的 RSA 演算法，就需要放置在 $HOME/.ssh/id_rsa 當中！咦！剛好使用 ssh-keygen 就是已經產生在這個目錄下了，所以自然就不需要去調整他了！以我的 test2.linux.org 來看，那麼我的檔案就會放置在 /home/test2/.ssh/id_rsa 這個檔案就是私鑰啦！

    3. 在 Server 端放置可以登入的公鑰：
      既然我們要讓 test2 可以以 test 這個帳號登入 test.linux.org 這部主機，那麼這部主機自然需要保有 test2 的 public key 囉！對的！所以我們必需要將 Client 端建立的 id_rsa.pub 檔案給他拷貝到 test.linux.org 裡頭的 test 這個使用者的家目錄之下！那麼如果妳還記得上面的 sshd_config 這個檔案的設定的話，那麼應該就記得『AuthorizedKeysFile』這個設定吧！是的！在被登入的主機的某個帳號，他的公鑰放置的檔案名稱預設就是這個項目所記載的！而他預設的檔名就是 authorized_keys 這個檔案名稱啦！那麼應該怎麼做呢？
      1. 先在 Client 端以 sftp 將公鑰丟到 test 上面去！
      [test2 @test2 test2]$ cd ~/.ssh <==切換目錄
      [test2 @test2 .ssh]$ sftp test@test.linux.org<==連到主機上面
      Connecting to test.linux.org...
      test@test.linux.org's password: <==輸入 test 的密碼
      sftp> put id_rsa.pub <==將公鑰丟到 Server 上面去！
      Uploading id_rsa.pub to /home/test/id_rsa.pub
      sftp> exit

      2. 到 Server 上面，將公鑰轉存到 authorized_keys 檔案中！
      [test @test test]$ cd ~/.ssh
      [test @test .ssh]$ cat ../id_rsa.pub >> authorized_keys

      請注意上面的機器！由於 authorized_keys 可以保存相當多的公鑰內容，因此，可以使用 >> 的方式來將 Client 端的公鑰新增到該檔案內！呵呵！做完這一步一後，未來 test2 就可以直接在 test2.linux.org 以
      [test2 @test2 test2]$ ssh test@test.linux.org
      這樣就可以不需要輸入密碼囉！但是請注意， test 不能以 test2 登入 test2.linux.org 喔！
很簡單的步驟吧！這樣一來，就可以不需密碼的手續了！無論如何，妳要記得的是， Server 需要有的是 Public Keys ，而 Client 端的則是 Private Keys ！則未來，當妳還想要登入其他的主機時，只要將妳的 public key ( 就是 id_rsa.pub 這個檔案 )給他 copy 到其他主機上面去，並且新增到某帳號的 .ssh/authorized_keys 這個檔案中！哈哈！成功！
  • 安全設定：

    好了，那麼關於安全的設定方面，有沒有什麼值得注意的呢？當然是有啦！我們可以先建議幾個項目吧！分別可以由：
    • /etc/ssh/sshd_config
    • /etc/hosts.allow, /etc/hosts.deny
    • iptables
這三方面來著手進行！底下我們就說一說吧！
  • /etc/ssh/sshd_config
    一般而言，這個檔案的預設項目就已經很完備了！所以，事實上是不太需要更動他的！但是，如果您有些使用者方面的顧慮，那麼可以這樣修正一些問題呢！
    • 禁止 root 的登入：任何時候，不許 root 以遠端連線的方式登入，都會是一個好主意！所以這裡蠻建議大家直接將 root 的登入權限拿掉吧！所以，可以修改 /etc/ssh/sshd_config 這個檔案的內容為：
      [root @test root]# vi /etc/ssh/sshd_config
      PermitRootLogin no <==將他改成 no 啦！
      [root @test root]# /etc/rc.d/init.d/sshd restart
      如此一來，以後 root 就不能以 ssh 登入囉！這樣還是比較好的啦！ ^_^

    • 不許某個群組登入：有些特殊情況中，我們想要讓使用者只能使用 sendmail, pop3, ftp 等，但是不希望他可以遠端連線進來，那麼妳可以這樣做：
      1. 將這些使用者都歸納在某一個特殊群組之下，例如 nossh 這個群組好了；
      2. 在 /etc/ssh/sshd_config 當中加入這一行：『DenyGroups nossh』
      3. 重新啟動 sshd ： /etc/rc.d/init.d/sshd restart
      這樣就OK啦！

    • 不許某個使用者登入：跟 DenyGroups 類似，使用 DenyUsers 即可！參考 sshd_config 的設定喔！
  • /etc/hosts.allow 及 /etc/hosts.deny ：
    這東西也是很簡單的啦！直接參考： 簡易防火牆架設 一文囉！當然，簡單的方法就是：
    [root @test /root]# vi /etc/hosts.allow
    sshd: 192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.4, 192.168.0.5: allow

    [root @test /root]# vi /etc/hosts.deny
    sshd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
    /bin/echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d -%h security" root@localhost & \
    : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

  • iptables
    多幾層保護也很好的！所以也可以使用 iptables 喔！參考：簡易防火牆架設 一文囉！
基本上， SSH 還蠻安全的，只要取消 root 的登入權限，那麼問題應該就會比較小一點啦！所以，雖然可以不用設定 iptables ，但是建議針對幾個網域設定一下 /etc/hosts.allow 與 /etc/hosts.deny ！加油囉！
參考資源
  • OpenSSH 官方網站：http://www.openssh.com/
  • OpenSSL 官方網站：http://www.openssl.org/
  • putty 官方網站：http://www.chiark.greenend.org.uk/~sgtatham/putty/
  • putty 中文網站：http://beta.wsl.sinica.edu.tw/~ylchang/putty/
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )

簡易 Telnet 與 SSH 主機設定

2002/11/14：第一次完成
2003/03/08：加入標頭說明，與修改部分內容，例如 Telnet 伺服器軟體的安裝等等，以及 SSH 的 putty 使用中文狀態！
2002/11/14以來統計人數


簡易 NAT 伺服器
最近更新日期：2002/08/17
什麼是 NAT 呀： NAT 的功能, 連線示意圖, 核心版本, 誰需要 NAT 架設,
一塊網路卡的 NAT 架設：
兩塊網路卡的 NAT 架設：
觀察路由資訊：
客戶端的設定： Windows, Linux,
安全性：
什麼是 NAT 呀：
  • NAT 的功能：
    我想，大家對於 NAT 一定是有所耳聞才對，那麼什麼是 NAT 呢？NAT 其實是 Network Address Transfer 的簡寫，簡單的說，就是將要傳送出去的封包進行 IP 轉換的動作啦！由 TCP 封包的架構圖，我們可以發現 TCP 封包裡頭有來源與目的地的 IP 及 port 之資訊在 Header 裡面，那麼如果透過某些技術，是否可以將這個 header 的內容改變呢？當然可以囉！就直接使用 iptables 即可！他可以幫助我們將打包過後的 TCP 封包上面的 header 進行修改的動作，以方便我們工作！而其中用的最廣泛的例子就屬：頻寬分享 的部分了！怎麼說呢？很簡單呀！還記得我們在 區域網路架構 裡頭提到的網路架設方法吧？對啦！就是利用一部 Linux 當作主機，而將我們對內( intranet )與對外( Internet )的連接分離開來，以達到良好的隔絕效果，此外，由於 內部私有網路 的私有 IP 並不能直接連接上 Internet 上面，所以你的所有內部的私有 IP 的電腦，將無法直接連通到 Internet 上面去，阿！那豈不是很無趣？！再想一想，咦！我們的 Linux 主機不是有『對內及對外』的兩組 IP 嗎？一組是私有 IP ( 跟 intranet 同一個網段 ) 一組則是可以連上 Internet 的實體 IP ，而我們的私有網域的所有電腦都是以 Linux 主機為 Gateway 的，那麼如果我在我的對內的所有私有 IP 在對外連線的時候 ( 透過 Linux 主機 )，將他的 TCP 封包的 header 資料裡面，那個 sourec IP and port (來源 IP 與對應的埠口)改成 Linux 的對外的 IP 與埠口，那麼不就可以連出去 Internet 啦！哈哈！沒錯！這就是 NAT 的概念之一啦！
    如上圖所示，當我的區域內的具有 192.168.1.100 的 client 要對外連線的時候：
    1. 這個 client 的 gateway 設定為 NAT 主機，所以當要連上 Internet 的時候，該 TCP 封包就會被送到 NAT 主機啦；
    2. 而透過這個 NAT 主機，她會將 client 的對外連線的封包之 source 的 IP ( 192.168.1.100 ) 改成 ppp0 ( 假設為撥接情況 )這個實體 IP 囉，同時並記憶這個連線的封包是由哪一個 ( 192.168.1.100 ) client 端傳送來的；
    3. 由 Internet 傳送回來的封包，當然由 NAT 主機來接收了，這個時候， NAT 主機會去查詢原本記錄的路由資訊，並將目標 IP 改回原來發送出此一封包的 Client 端；
    4. 最後則由 NAT 主機將該封包傳送給原先發送封包的 Client 囉！
    其實這也很好理解啦，你可以想成這樣：『當您在私人賽車場上比賽的時侯，不必管您是否有註冊過的車牌﹔但開到馬路上卻非得要一個監理站核發的車牌不可。如過您要將跑車開到街道上，必須要改掛一個合法的車牌。這時候，賽車場老闆(NAT)自有辦法幫您弄一個就是了。』！這樣可以瞭解了嗎？
  • 連線示意圖：
    由上面的說明您應該可以瞭解了吧？！沒錯，你的 NAT 主機上面，至少需要『兩塊網路介面』請注意，我說的是『網路介面』而不是『網路實體介面卡』呦！以撥接為例，由於撥接之後會產生 ppp0 這個撥接後產生的網路介面，加上你再提供一個 IP alias ，那麼自然就有兩個以上的網路介面囉！這麼說應該很容易瞭解了嗎？底下我以兩塊實體網路介面卡的佈線情況作為連線的示意圖，至於一塊網路卡進行 NAT 的圖示，將在待會說明囉。
在上面的圖示當中，很清楚吧！我們的 Linux 共有兩塊實體介面卡，一塊接在數據機 上面，一塊接在 Hub/Switch 上面，並且以此 Hub/Switch 連接所有的區域網路內的電腦，以組成內部的私有網域！鳥哥個人是比較喜歡這樣的接線方式啦！不過，人各有志，而且這樣的情況也不見得適合所有的人，所以還是得瞭解一下其他種類的連接方法！好吧，等一下再告訴你∼ ^_^""
  • 核心版本：
    嘿嘿！幹嘛呀！怎麼又提到核心版本了？這個就得特別說明一下囉！因為不同的核心版本所提供的 TCP 封包的偽裝技術，及防火牆軟體都不相同，所以需要特別的關心一下您的核心版本！首先，用『uname -r 』看一下你的版本呢，如果是出現 2.2.xx 的話，則是屬於較早期的核心，那個是使用 ipchains 作為技術的，至於如果是 2.4.xx 的話，那麼就是屬於 iptables 的模組較棒囉！
    • Kernel 2.2.xx ：使用 ipchains 做封包偽裝的技術；
    • Kernel 2.4.xx ：使用 iptables 做封包偽裝的技術！
    簡單的判別方法，如果是 Red Hat 7.0 ( 含 7.0 )以前的版本，使用的是 2.2.xx 的核心，自然只有 ipchains 而已，而如果是 Red Hat 7.1 ( 含 7.1 ) 以後的版本，則使用的是 Kernel 2.4.xx ，因此最好使用 iptables 的技術！因為 2.4.xx 的 IP 處理模組當中，大部分都是針對 iptables 來作為處理的軟體， ipchains 的已經不含在 2.4.xx 裡頭了！由於我是以 Red Hat 7.2 與 7.3 作為範例的，所以自然以 iptables 為準囉！如果還想要以 ipchains 來進行架設 NAT 的朋友，不妨參考一下底下這篇：
    • NAT 伺服器
  • 誰需要 NAT 架設：
    由前面 NAT( Network Address Transfer ) 的功能介紹，我們知道他可以作為頻寬分享的主機，當然也可以管理一群在 NAT 主機後面的 Client 電腦！呵呵！所以 NAT 的功能至少有這兩項：
    • 頻寬分享：我想，架設 NAT 的朋友大部分都是希望可以達到頻寬分享的目的的！這畢竟是 NAT 主機的最大功能囉！
    • 安全防護：咦！關安全防護什麼事呀！？別忘了， NAT 之內的 PC 連線到 Internet 上面時，他所顯示的 IP 是 NAT 主機的實體 IP ，所以 Client 端的 PC 當然就具有一定程度的安全了！最起碼人家在 scan 的時候，就偵測不到你的 Client 端的 PC 啦！安全多了！
一塊網路卡的 NAT 架設：
    剛剛上面我們已經提過了，要架設 NAT 的話，只要『兩塊網路介面』就夠了，倒不一定需要兩塊『實體網路卡( NIC )』，是的！所以我們先以較為便宜的方式(因為少了一塊網路卡呀！)來介紹 NAT 的架設！底下是我們介紹的安裝步驟：
    1. 關閉一些系統服務的 port ：
      為了安全起見，還是檢查一下吧！
      好了，首先，我們需要先來瞭解一下，咦！我的 Linux 主機的功用為何？！如果只是單純的要作為 NAT 的話，那麼 Linux 主機所開放的 port 是越少越好！鳥哥可不希望你開機了大約一個星期，就開始苦苦哀嚎說自己的主機無法以 root 登入了......。關閉 port 的方法與選擇『系統一定需要的服務』的介紹在 限制連線的埠口 裡面已經說的很清楚了！你可以 按這裡 來瞭解到底什麼是『一定要啟動的服務』。
      1. 使用 ntsysv 設定開機時啟動的服務項目：
      [root @test /root]# ntsysv
      只要選擇底下幾個服務即可(注意！我是以 Red Hat 7.2 的文字介面為基礎的)
      atd, cron, iptables, keytables, network, random, syslog, xinetd

      2. 重新開機讓設定生效：
      [root @test /root]# reboot

      3. 觀察目前的 port 開啟多少個？
      [root @test /root]# netstat -an | more
      Active Internet connections (servers and established)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      Active UNIX domain sockets (servers and established)
      Proto RefCnt Flags Type State I-Node Path
      unix 7 [ ] DGRAM 944 /dev/log
      unix 2 [ ] DGRAM 3162963
      unix 2 [ ] DGRAM 739227
      unix 2 [ ] DGRAM 739189
      unix 2 [ ] DGRAM 1070
      unix 2 [ ] DGRAM 953
      unix 2 [ ] STREAM CONNECTED 690
      注意：盡量不要看到有 LISTEN 的咚咚！最多就是有 ssh 就好了！除非你有其他的服務！

    2. 實體線路配置圖：
      怎麼安裝連線呢？趕快買線材來架設吧！
      由於 Linux 主機只有一張網路卡，所以所有的裝置(包括 Linux 主機, client 端電腦, 數據幾等等)都需要接在 Hub/Switch 上面，有點像底下的樣子：

      這個時候請特別留意啦！如果是使用 ADSL 撥接制的話，那麼應該會有安裝 rp-pppoe 這個東西，並且在撥接之後會產生 ppp0 這個網路介面，同時不要忘了，啟動網路卡的時候不是就已經有 eth0 這個實體網路界面的設定嗎？，嘿嘿！那麼我們不是就有兩個網路介面了嗎？！沒錯！就是這樣！但是，如果是 Cable 或者是其他的固定制的方法的話，那麼跟這個也差不多啦！不過由於 Cable 的方式沒有自動產生兩個以上的網路界面，所以就需要設定 IP Alias 囉，也就是 eth0:0 啦！亦即就是以 eth0 跟 eth0:0 這兩個介面來連線囉！反正，只有一張網路卡，也可以進行 NAT 的啦！ ^_^""

    3. 設定網路介面：
      分別以撥接、 Cable 及固定 IP 為例啦！

        ADSL撥接制 ：
        在進入 Linux 並啟動網路卡之後，我們會得到 eth0 這個界面，再加上撥接之後的 ppp0 界面，所以我們就已經會有個兩網路介面，分別是 ppp0, eth0！此外，我預計的私有網域的 IP 選用 192.168.1.0/24 這個 C Class 的網域，其中， Linux NAT 主機的私有 IP 選擇為 192.168.1.2 這一個！

        • 第一個網路介面 -- ppp0 -- 的設定：這個東西應該不難吧！就是我們在 連上 Internet 一文裡頭提到的關於 rp-pppoe 的撥接上網方式。

        • 實體網路卡 -- eth0 -- 的設定：請注意，如果您要同時使用 ppp0 及 eth0 ，那麼請在撥接之前啟動 eth0 吧！以取得內部的 eth0 這個網路界面的設定！( 註：如果你不知道如何設定的話，那麼就請照我的方式來填寫即可 )：
          [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
          DEVICE=eth0
          BOOTPROTO=static
          BROADCAST=192.168.1.255
          IPADDR=192.168.1.2
          NETMASK=255.255.255.0
          NETWORK=192.168.1.0
          ONBOOT=yes <==重要的地方在這裡！請設定為 yes 呦！
          # 如果你不曉得應該如何設定的話，就照上面的打就好了！

        Cable 浮動式：
        在 Cable 的情況又不太相同了！這個時候只有兩塊網路介面，分別是 eth0, eth0:0 囉！設定為：

        • 實體網路卡 -- eth0 -- 的設定：請注意，由於 cable 使用的是 DHCP 主機，所以這個時候請特別留意你底下的設定呦！( 註：如果你不知道如何設定的話，那麼就請照我的方式來填寫即可 )：
          [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
          DEVICE=eth0
          BOOTPROTO=dhcp <==這裡最重要！
          BROADCAST=192.168.100.255
          IPADDR=192.168.100.1
          NETMASK=255.255.255.0
          NETWORK=192.168.100.0
          ONBOOT=yes
          # 如果你不曉得應該如何設定的話，就照上面的打就好了！

        • 虛擬網路介面 --eth0:0 的設定：在 IP Alias 的設定當中，我們已經在 Router 當中說明過多次了！請務必回到該章節再讀取一次，如果您不記得如何設定的原理的話！
          [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
          DEVICE=eth0:0
          BOOTPROTO=static
          BROADCAST=192.168.1.255
          IPADDR=192.168.1.2
          NETMASK=255.255.255.0
          NETWORK=192.168.1.0
          ONBOOT=yes
          # 如果你不曉得應該如何設定的話，就照上面的打就好了！

        固定 IP 的情況：
        跟 cable 的設定幾乎一模一樣，只有兩個介面，分別是 eth0, eth0:0，需要特別注意的是 eth0 這個東西，你必須要『填寫正確的 IP, netmask, network, broadcast 而且 ONBOOT=yes 才可以！』，而 eth0:0 則與上面相同！

        啟動私有網域的 IP 網路介面：
        啟動之後順便觀察一下路由的資訊！
        [root @test /root]# ifdown eth0
        [root @test /root]# ifup eth0
        [root @test /root]# route
        Kernel IP routing table
        Destination Gateway Genmask Flags Metric Ref Use Iface
        swks81-1.adsl.s * 255.255.255.255 UH 0 0 0 ppp0
        192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
        127.0.0.0 * 255.0.0.0 U 0 0 0 lo
        default swks81-1.adsl.s 0.0.0.0 UG 0 0 0 ppp0
        嘿嘿！這樣就是成功啦！注意，這個路由是以 adsl 撥接為例的！

    4. 設定其他檔案：
      還有一些網路的相關檔案要設定呦！/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,
      別忘了我們還有其他的檔案要設定呦！很重要的：
      1. 將私有 IP 加入到 /etc/hosts 裡面去吧！
      [root @test /root]# vi /etc/hosts
      127.0.0.1 localhost
      192.168.1.1 linux001
      192.168.1.2 linux002
      .......(略)......
      192.168.1.100 linux100
      .......(略)......
      192.168.1.254 linux254

      2. 將 DNS 的 IP 寫到 /etc/resolv.conf 裡面去，這裡以中華電信跟 Seednet 為例
      [root @test /root]# vi /etc/resolv.conf
      nameserver 168.95.1.1
      nameserver 139.175.10.20

      3. 設定主機名稱跟 gateway 與否：
      [root @test /root]# vi /etc/sysconfig/network
      NETWORKING=yes
      HOSTNAME=your.domain.name <==寫你的主機名稱
      GATEWAY= <==除非你是固定制的，不然這個不要填入任何東西！

    5. 設計 NAT 的 shell scripts ：
      直接將一些指令寫在 scripts 裡頭執行較快啦！
      正確的情況之下，目前你的 Linux 主機上面應該是已經可以正常的對外連線的才對！而且內部也已經可以正確的連線成功了才對！如果還沒有成功的話，請趕快再到 區域網路設定 裡頭去查一查資料去！好了，接著下來只要執行一個程式，嘿嘿！就可以將 NAT 啟動喔！這個就好玩了！因為基本上，我們使用的是 iptables 這個東西，自然就需要這個 ip_tables 的模組了！而查看模組與載入模組的指令分別為 lsmod, modprobe 哩！好了，你可以直接在命令提示字元底下進行工作：
      echo "1" > /proc/sys/net/ipv4/ip_forward
      modprobe ip_tables
      modprobe ip_nat_ftp
      modprobe ip_nat_irc
      modprobe ip_conntrack
      modprobe ip_conntrack_ftp
      modprobe ip_conntrack_irc
      /sbin/iptables -F
      /sbin/iptables -X
      /sbin/iptables -Z
      /sbin/iptables -F -t nat
      /sbin/iptables -X -t nat
      /sbin/iptables -Z -t nat
      /sbin/iptables -P INPUT ACCEPT
      /sbin/iptables -P OUTPUT ACCEPT
      /sbin/iptables -P FORWARD ACCEPT
      /sbin/iptables -t nat -P PREROUTING ACCEPT
      /sbin/iptables -t nat -P POSTROUTING ACCEPT
      /sbin/iptables -t nat -P OUTPUT ACCEPT
      /sbin/iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE

      當然啦，如果要設計的人性化一點，可以使用底下的 script 來達成：
      #!/bin/bash
      # 說明：
      # a. 這個程式主要用來進行簡易 NAT 的功能的！使用的模組為 iptables 。
      # b. 執行的方式為：
      # 將檔案放在 /usr/local/nat 底下，檔名為 nat.sh (範例)
      # chmod 744 /usr/local/nat/nat.sh
      # /usr/local/nat/nat.sh
      # c. 或者是直接在開機時啟動，可以使用：
      # vi /etc/rc.d/rc.local
      # 寫入最後一行為： /usr/local/nat/nat.sh
      # d. Made by VBird 2002/08/14
      ###########################################################################

      # 0. 請輸入你的參數值：
      EXIF='ppp0' # 這個是對外的介面，如果是 cable ，則可能為 eth0！
      EXNET='192.168.1.0/24' # 這個是對內的網域！這裡我只設定一個網域而已！

      # 底下如無需要，請不要變動了！
      # 1. 宣告變數、啟動 Routing 與清除規則：
      PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
      export PATH
      echo "1" > /proc/sys/net/ipv4/ip_forward
      /sbin/iptables -F
      /sbin/iptables -X
      /sbin/iptables -Z
      /sbin/iptables -F -t nat
      /sbin/iptables -X -t nat
      /sbin/iptables -Z -t nat
      /sbin/iptables -P INPUT ACCEPT
      /sbin/iptables -P OUTPUT ACCEPT
      /sbin/iptables -P FORWARD ACCEPT
      /sbin/iptables -t nat -P PREROUTING ACCEPT
      /sbin/iptables -t nat -P POSTROUTING ACCEPT
      /sbin/iptables -t nat -P OUTPUT ACCEPT

      # 2. 載入模組啦！
      modprobe ip_tables 2> /dev/null
      modprobe ip_nat_ftp 2> /dev/null
      modprobe ip_nat_irc 2> /dev/null
      modprobe ip_conntrack 2> /dev/null
      modprobe ip_conntrack_ftp 2> /dev/null
      modprobe ip_conntrack_irc 2> /dev/null

      # 3. 啟動 IP 偽裝：
      /sbin/iptables -t nat -A POSTROUTING -o $EXIF -s $EXNET -j MASQUERADE

      呵呵！很簡單吧！這樣就 OK 啦！不過請特別留意上面表格當中的那個黃色的字體，其中， EXIF 指的是對外連線的網路介面，而 EXNET 指的則是要偽裝 IP 的內部虛擬網域的 C Class 的網域資料囉！然後你將這個檔案名稱為 nat.sh 的資料，放置在你的 /usr/local/nat 底下，你可以這樣做：
      [root @test /root]# mkdir /usr/local/nat
      [root @test /root]# cd /usr/local/nat
      [root @test nat]# wget http://aerosol.ev.ncku.edu.tw/~vbird/download/scripts/nat.sh
      --14:19:03-- http://aerosol.ev.ncku.edu.tw/%7Evbird/download/scripts/nat.sh
      => `nat.sh'
      Connecting to aerosol.ev.ncku.edu.tw:80... connected!
      HTTP request sent, awaiting response... 200 OK
      Length: 1,441 [application/x-sh]

      0K . 100% @ 469.08 KB/s

      14:19:04 (37.03 KB/s) - `nat.sh' saved [1441/1441]
      [root @test nat]# chmod 744 nat.sh
      [root @test nat]# ./nat
      [root @test nat]# vi /etc/rc.d/rc.local
      #!/bin/sh
      #
      # This script will be executed *after* all the other init scripts.
      # You can put your own initialization stuff in here if you don't
      # want to do the full Sys V style init stuff.

      touch /var/lock/subsys/local

      #1. adsl connectting. 2002/04/06 VBird
      /usr/sbin/adsl-start
      #2. Starting the NAT Server 2002/04/06 VBird
      /usr/local/nat/nat.sh

      這樣一來，下次開機就可以自動的連上 ADSL 之外，還可以自動的執行 NAT 的功能呦！

    6. Client 端的設定參數：包含的是網路的設定參數而已！這個我們留在最後面講！
兩塊網路卡的 NAT 架設：
真是的，這個部分的連線架設在 區域網路連線 當中已經提過很多遍了！這裡不再重複的說明！僅列出幾個重要的地方，基本上，跟剛剛一張網路卡的設定方式幾乎完全相同，只是那個 eth0:0 變成了 eth1 而已啦！我的設定為：
  • eth0 為對內的實體網路卡，具有私有 IP ，其 IP 為 192.168.1.2 。
  • eth1 為對外的實體網路卡，被用來進行 ADSL 的撥接，所以開機的時候不要設定 on ！
同樣的，我們的設定方式為：
  1. 關閉一些系統服務的 port ：
    跟 上面 的一模一樣，這裡就不再多做說明！

  2. 實體線路配置圖：
    也跟剛剛上面 第一個圖示 提到的差不多，不再說明！

  3. 設定網路介面：
    重要的地方在安裝第二塊網路卡！安裝網路卡的相關技巧請前往 連上 Internet 參考！不過，對於第二塊網路卡的安裝，在這裡有些建議：基本上，第二張網路卡最好不用使用與第一張相同晶片的卡，例如你第一張卡使用 RTL 8139，那第二張卡最好使用別的卡。因為鳥哥曾經發現，在鳥哥的 RedHat 6.1 英文版中，安裝兩塊相同的（同公司出的） RTL8139 ，結果竟然兩張卡的輸出輸入都是經由第一張！也就是說，第二張卡根本就沒有用處！並且，也很容易發生 eth1 與 eth0 捉錯的情況！所以，請記得，『第二張網路卡盡量不要使用與第一張網路卡相同晶片的卡！』當然，你要使用同一個晶片的網路卡也是可以啦！目前我的機器上面就是使用兩塊 RTL8139 的網路卡，不過，在安裝的時候請特別留意，不要同時安插兩塊，最好是一塊安裝完畢之後，再安裝另一塊！會比較好一點啦！安裝的步驟可以是(請注意，我以 ADSL 撥接為例的，其中， eth0 為對內， eth1 為對外，請依照您的設定來修正呢！)：
    • 關機、硬體安裝：這個不用再提了吧！，先關機，然後拆開外殼，插入PCI網路卡即可；
    • 開機、硬體掃瞄：然後再開機，而於開機的過程中，你的 Linux 會主動去找到這一張網路卡（如果這張卡是有被 Linux 支援的！）；
    • 安裝網路卡驅動程式：如果在上一步驟中，你的網路卡並不能被捉到，哪就比較傷腦筋！請到連上 Internet 參考網路卡的驅動程式安裝方法
    • 檢視設定 /etc/sysconfig/network-scripts/ifcfg-eth1：在安裝完了網路卡的驅動程式之後，在 /etc/sysconfig/network-scripts/ 中，應該會有 ifcfg-eth1 這一個檔案。請設定他吧！因為是對外卡，我這裡假設他是利用 ADSL 撥接的，所以可以是這樣：
      [root @test /root]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
      DEVICE=eth1
      BOOTPROTO=static
      BROADCAST=192.168.0.255
      IPADDR=192.168.0.2
      NETMASK=255.255.255.0
      NETWORK=192.168.0.0
      ONBOOT=no <==這裡很重要！對外用來撥接的卡不要在開機的時候啟動啦！
    這樣就成功囉！很簡單吧！ ^_^""

  4. 設定其他檔案：
    其他一些網路的相關檔案也要設定！亦即/etc/hosts, /etc/resolv.conf, /etc/sysconfig/network,設定的方式跟 上面 一樣！

  5. 設計 NAT 的 shell scripts ：
    基本上，設定的方式跟上面也是一模一樣的啦！你依舊可以僅使用上面的 script 來進行 NAT 的設定，只是要注意那個 黃色字體 部分的設定，如果你跟我的情況不同，那麼就需要修改一下啦！趕快 下載 script 吧！
觀察路由資訊：
在整個 NAT 的設定當中，最經典的錯誤連線訊息來自於 路由資訊 的錯誤啦！這個在我們的 連上 Internet 及 網路偵測 文章當中已經說明過了，不過，我們這裡再次提醒一下！免得您又犯了同樣的錯誤了！由於網路在進行連接的時候，都會指定所謂的 router 或者是 gateway 的設定，除非是來自於廣播的網域之連線。而我們在設定網路時，常常會犯了一個錯誤，那就是指定錯了 Gateway 了！請你參考一下 /etc/sysconfig/network 的修改方式，在 ADSL 撥接及 Cable 連線時，請『務必』不要設定 gateway 才好！
再來，請常下達 route 的指令來觀察一下您的 linux 主機的路由設定是否正確呦！
客戶端的設定：
在 Client 端的設定真是簡單的可以了！由於我們上面的網域設定的是 192.168.1.0/24 這個 C Class 的私有網域，所以你只要記得幾件事情：
  1. network 設定需要為： 192.168.1.0
  2. broadcast 設定需要為： 192.168.1.255
  3. netmask 設定需要為 255.255.255.0
  4. IP 設定需要為 192.168.1.1 ~ 192.168.1.254 之一，且『不能重複』
  5. Gateway 或者說是 通訊閘 需要設定為你的 Linux 的對內 IP ，以我的例子來說，就是 192.168.1.2 ！
  6. DNS 的設定：這個最容易出錯了，你的 DNS 設定需要是你的 ISP 給你的 DNS IP，如果你不知道的話，可以填入 168.95.1.1 這一個中華電信的 DNS 或者是 139.175.10.20 這一個 SeedNet 的 DNS 即可！千萬不要設定為 192.168.1.2 呦！會連不出去！
大致上就是這樣啦！至於 Client 端通常是 Windows ，他的設定可以參考一下 這裡 說！至於 Linux 端則需要查看一下 連上 Internet 裡面的固定 IP 的設定啦！
安全性：
請注意，在這個例子當中，我們並沒有使用到封包分析的動作，有的只有 IP 偽裝而已，所以：
  • 對於 Client 端來說，由於已經經過了 IP 偽裝的功能，所以基本上，你通過 NAT 主機連出去的封包的 IP 都會是『 NAT 主機對外的實體 IP 』，因此對於內部 Client 端而言，由於網路 Cracker 幾乎都是根據 IP 來進行破壞，而因為你連出去的封包 IP 是 NAT 主機的實體 IP ，自然你的 Client 端就比較安全多了！基本上， Client 端在 NAT 之內，不要安裝防火牆軟體也還好，但是『防毒軟體一定要安裝！』因為你畢竟會接收電子郵件呀等等的，所以還是可能會中毒啦！！
  • 對於 Server 端來說，其實這樣的一個主機並不是十分的安全的，因為我們並沒有設定防火牆的規則，好家在的是，我們在一開始就將所有的主機的 port 都關掉了( 請注意，這些 port 關掉之後，完全不會影響到 NAT 主機的頻寬分享功能，所以不用擔心！ )，因此還算有點小安全啦！無論如何，小心駛得萬年船，所以在沒有必要的時候，而且你只是要作為 NAT 主機的時候，請千萬將 Linux 主機的所有的 port 都先關掉呦！
至於增加安全性方面，底下我們會簡介一下 iptables 配合 TCP_Wrappers 的方法來抵擋部分的 IP 與部分的服務呦！
2002/08/15 以來統計人數


簡易 NFS 伺服器機設定
最近更新日期：2003/03/09

NFS為 Network Filesystem 的簡稱，最早之前是由 Sun 這家公司所發展出來的，他的目的就是想讓不同的機器、不同的作業系統可以彼此分享個別的檔案啦！目前在 Unix Like 當中用來做為 file server 是相當不錯的一個方案喔！基本上， Unix Like 連接到 Unix Like 來分享彼此的檔案時，使用 NFS 要比 SAMBA 快速且方便的多了！此外， NFS 的設定真的很簡單，幾乎只要記得啟動 Remote procedure Call 這個咚咚 ( 就是 portmap 這個套件啦！ ) 就一定可以架設的起來！真是不錯啊！不過，如果要達成 Window 與 Linux 之間的溝通，那麼還是以 SAMBA 比較容易啊！無論如何， NFS 還是可以做為小公司或學校單位內部 Unix Like 機器共享 file 的一個 Server 喔！

NFS 的由來與其功能：
    什麼是 NFS ( Network FileSystem )
    什麼是 RPC ( Remote Procedure Call )
    NFS 啟動的 RPC daemons
需要的套件：
Server 端的設定：
Client 端的設定：
RPC server 的相關指令：
關機或結束時的注意事項：
安全設定(被防火牆擋掉了)：
實際演練：
重點回顧
本章與 LPI 的關係
參考資源：
本章習題練習
NFS 的由來與其功能
  • 什麼是 NFS ( Network FileSystem )
    在開始進行 NFS 的設定之前，我們得先來瞭解一下，什麼是 NFS 呢？不然講了一堆也沒有用，對吧！ ^_^！所謂的 NFS 就是 Network FileSystem 的縮寫，最早之前是由 Sun 這家公司所發展出來的。他最大的功能就是可以透過網路，讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 ( share file )，所以，妳也可以簡單的將他看做是一個 file server 呢！這個 NFS Server 可以讓妳的 PC 來將網路遠端的 NFS 主機分享的目錄，掛載到本地端的機器當中，所以，在本地端的機器看起來，那個遠端主機的目錄就好像是自己的一個磁碟分割槽一樣 ( partition )！使用上面相當的便利！
    就如同上面的圖示一般，當我們的 NFS Server 設定好了之後，其他的 Client 端就可以直接在 Server 上面存取資料了！也就是說，其他的 Personal Computer 可以『掛載 NFS server 所提供的檔案或目錄』，而且掛載之後，這個目錄看起來就像你的本地端的磁碟區塊一般，只要權限對了，那麼你可以使用 cp, cd, mv, rm... 等等磁碟或檔案相關的指令！真是他X的方便吶！
    那麼您或許會問啦：『咦！那麼這個 NFS 是藉由什麼樣的協定來進行傳輸的呢？』雖然 NFS 有屬於自己的協定與使用的 port number ，但是在資料傳送或者其他相關訊息傳遞的時候， NFS 使用的則是一個稱為遠端程序呼叫( Remote Procedure Call, RPC )的協定來協助 NFS 本身的運作！
  • 什麼是 RPC ( Remote Procedure Call )
    那麼什麼是 RPC 呢？由字面上的意思來看『遠端程序呼叫』不就是一些程式( Program )在執行遠端連線時，需要用到的程序嗎？呵呵！是這樣沒錯啦！簡單的來說，當我們在使用某些服務來進行遠端連線的時候，有些資訊，例如主機的 IP、服務的 port number、與對應到的服務之 PID 等等，都需要管理與對應！這些管理 port 的對應與服務相關性的工作，就是這個 Remote Procedure Call, RPC 的任務了！
    好了，如果我們將 NFS 與 RPC 兩者的相關性連接起來的話，那麼你應該就可以知道： NFS 本身的服務並沒有提供資料傳遞的協定，但是 NFS 卻能讓我們進行檔案的分享，這其中的原因，就是 NFS 使用到一些其他相關的傳輸協定！而這些傳輸的協定，就是使用到這個所謂的 RPC 的功能囉！這也就是說， NFS 本身就是使用 RPC 的一個 program 就是了！說的更白話一點， NFS 也可以視作是一個 RPC server 啦！同時要注意到的是，在某些狀況中，不但跑 NFS 的 Server 需要啟動 RPC 的服務，連帶的，要掛載 NFS partition 的 Client 機器，也需要同步啟動 RPC 才行！這樣 Server 端與 Client 端才能藉由 RPC 的協定來進行 program port 的對應喔！
    OK！簡單的說， NFS 也可以看做是 RPC server 的一種，因為他是使用這種協定的 program 呀！ ^_^ ！那麼為什麼 NFS 要使用 RPC 執行呢？這是因為 NFS 本身可以被看做是一個檔案系統，那麼一來的話，你的使用者連線常常變化，而且你的檔案內容啦、分享的目錄啦，還有其他檔案相關的資訊等等，也都會常常在變化，這個時候，使用類似這種可以對應 program number 與 port number 的 RPC 就相當的方便了！也就是說，NFS 主要在管理分享出來的目錄，而至於資料的傳遞，就直接將他丟給 RPC 的協定來運作就是了！
    更多關於 NFS 協定的資訊您可以參考底下的網頁：
    • http://www.faqs.org/rfcs/rfc1094.html
    • http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
  • NFS 啟動的 RPC daemons
    NFS server 總共需要啟用到至少兩個 daemons ，一個管理 Client 是否可以登入的問題，另一個管理登入主機後的 Client 能夠使用的檔案權限！如果您還要管理 quota 的話，那麼 NFS 還會自動的再載入其他相關的 RPC program 呢！我們這裡以最簡單的方式來設定 NFS，說明如下：
    • rpc.nfsd：這個 daemon 主要的功能就是在管理 Client 是否能夠登入主機的權限啦，其中還包含這個登入者的 ID 的判別喔！
    • rpc.mountd：這個 daemon 主要的功能，則是在管理 NFS 的檔案系統哩！當 Client 端順利的通過 rpc.nfsd 而登入主機之後，在他可以使用 NFS server 提供的檔案之前，還會經過檔案使用權限 ( 就是那個 -rwxrwxrwx 與 owner, group 那幾個權限啦 ) 的認證程序！他會去讀 NFS 的設定檔 /etc/exports來比對 Client 的權限，當通過這一關之後， Client 就可以取得使用 NFS 檔案的權限啦！（註：這個也是我們用來管理 NFS 分享之目錄的使用權限與安全設定的地方哩！）
需要的套件
    要啟動 NFS 我們必須要有兩個套件才行，分別是：
    • nfs-utils 與 nfs-utils-clients (有時後僅有一個)
    • portmap
  • portmap：
    就如同剛剛提的到，我們的 NFS 其實可以被視為一個 RPC server program，而要啟動任何一個 RPC server program 之前，我們都需要做好 port 的對應 ( mapping ) 的工作才行，這個工作其實就是『 portmap 』這個服務所負責的！也就是說，在啟動任何一個 RPC server 之前，我們都需要啟動 portmap 才行呢！那麼這個 portmap 到底在幹嘛呢？就如同這個服務的名稱，哈哈！就是作 port 的 mapping 啊！舉個例子來說：當 Client 端嘗試來使用 RPC server 所提供的服務時，由於 Client 需要取得一個可以連接的 port 才能夠使用 RPC server 所提供的服務，因此， Client 首先就會去跟 portmap 講『喂！可不可以通知一下，給我個 port number ，好讓我可以跟 RPC 聯絡吧！』這個時候 portmap 就自動的將自己管理的 port mapping 告知 Client ，好讓他可以連接上來 server 呢！所以囉：『啟動 NFS 之前，請先啟動 portmap ！』
  • nfs-utils：
    就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其他相關 documents 與說明文件、執行檔等的套件！這個就是 NFS 的主要套件啦！一定要有喔！
    好了，知道我們需要這兩個套件之後，現在幹嘛？！趕快去你的系統先用 RPM 看一下有沒有這兩個套件啦！沒有的話趕快用 RPM 去安裝喔！不然就玩不下去了！

    例題：
    請問我的主機是以 RPM 為套件管理的 Linux distribution ，例如 Red Hat, Mandrake 與 OpenLinux 等版本，那麼我要如何知道我的主機裡面是否已經安裝了 portmap 與 nfs 相關的套件呢？
    答：
    簡單的使用 rpm -qa | grep nfs 與 rpm -qa | grep portmap 即可知道啦！
Server 端的設定：
前面對於 NFS 稍微解釋了一下，哇！怎麼看起來好像粉難喔！其實一點也不！為什麼呢？因為 portmap 只要一支 scripts 就可以啟動， NFS 只要設定一個檔案就可以順利運作！那麼怎麼能說不簡單呢！呵呵！這個 NFS 真是他 X 的太太太.....簡單了∼在開始 NFS 之前，讓我們先以 Windows 的系統當中的『資源分享』來說明一下整個流程吧：
  1. 在 Windows Server 上面，開啟檔案總管，在某個目錄上面按右鍵選擇啟動資源分享；
  2. 在資源分享的內容當中，需要設定『使用者權限』( 以 Windows 2000 為例 )；
  3. 在 Client 端需要登入 Windows server 時，需要啟動『網路上的芳鄰』來尋找可用的網路上面分享的目錄，然後點選該目錄，若可以登入該 Windows server 時，則可以依據步驟一的權限使用該目錄下的檔案！
呵呵！沒錯！ NFS 的整個流程也差不多是這樣：
  • 首先，需要確認一下妳的 Linux 主機是否可以支援 NFS 這項服務，然後再設定一下使用者的來源IP或主機名稱以及分享出去的目錄的權限，之後呢，啟動 NFS 即可將剛剛設定的目錄給他分享出去了！
  • 那麼在 Client 端怎麼使用這個分享出來的目錄？就是先以 showmount 這支程式檢查 Linux Server 是否有可以使用的 NFS 目錄，如果有的話，就將他 mount 在本機上面，如果可以 mount ，那麼就可以使用 NFS 主機提供的資源了！
哈哈！果然很簡單吧！所以底下我們就來一個一個步驟的說明一下 NFS 怎麼設定囉：
  1. 系統需求
  2. /etc/exports
  3. 關於權限問題
  4. 啟動服務 portmap, nfsd
  5. exportfs
  6. 檢驗目錄 /var/lib/nfs/xtab
  7. showmount
  8. 觀察啟動的 port number
OK！每個咚咚的細部項目就來談一談吧：
    • 系統需求：
      嗄！NFS 有最低硬體需求嗎？呵呵！您誤會了！這裡的需求其實指的是『軟體需求』啦！需要的是：
      1. 除了剛剛我們已經提到的兩個套件『 portmap 與 nfs-utils 』必需要存在之外；
      2. 您的核心版本最好能夠高於 2.2.xx 以後比較好！
      3. 此外，如果重新編譯過核心，妳必需『一定要選擇』NFS 支援才行！
      目前，如果妳使用的是安裝時候的 Linux distribution 預設核心時，那麼妳都不用太擔心，因為系統已經預設有支援囉！所以底下的咚咚妳都可以玩！但是，如果妳已經重新編譯過核心，並且不知道你是怎麼編譯的 ( 例如道聽途說啦、試試看新鮮玩意啦等等的來編譯妳的核心時，所以沒有注意到這個項目的選擇 ) ，這個時候請拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』好好的再次的讀一遍『核心編譯』！
    • /etc/exports：
      好了，已經確認『一切OK』之後，我們就真的要來玩弄 NFS 啦！這個東西真的很簡單的啦，只要一個檔案就可以搞定了！那就是編輯 /etc/exports 這個檔案，請注意，這個檔案如果不存在，請自行建立！並且，檔名不要寫錯了喔！這個檔案的內容很簡單啦，我們列出他的規則：

      [root @test root]# vi /etc/exports
      欲分享的目錄 主機名稱1或IP1(參數1,參數2) 主機名稱2或IP2(參數3,參數4)

      上面的規則是這樣的：欲分享的目錄主要是要分享給主機名稱1及主機名稱2，但是提供給這兩者的權限並不一樣，其中，給主機名稱1的權限是參數1與參數2，至於給主機名稱2的 Client 權限則是參數3與參數4。好了，那麼那個『權限』也就是『參數』主要有哪些呢？
      • rw：可讀寫的權限；
      • ro：唯讀的權限；
      • no_root_squash：登入 NFS 主機使用分享目錄的使用者，如果是 root 的話，那麼對於這個分享的目錄來說，他就具有 root 的權限！這個項目『極不安全』，不建議使用！
      • root_squash：在登入 NFS 主機使用分享之目錄的使用者如果是 root 時，那麼這個使用者的權限將被壓縮成為匿名使用者，通常他的 UID 與 GID 都會變成 nobody 那個身份；
      • all_squash：不論登入 NFS 的使用者身份為何，他的身份都會被壓縮成為匿名使用者，通常也就是 nobody 啦！
      • anonuid：前面關於 *_squash 提到的匿名使用者的 UID 設定值，通常為 nobody，但是妳可以自行設定這個 UID 的值！當然，這個 UID 必需要存在於你的 /etc/passwd 當中！
      • anongid：同 anonuid ，但是變成 group ID 就是了！
      • sync：資料同步寫入到記憶體與硬碟當中；
      • async：資料會先暫存於記憶體當中，而非直接寫入硬碟！
      大致的參數就是這幾樣囉！那麼我們來假設幾個例子好了：
      • 思考一：我要將 /tmp 分享出去給大家使用，由於這個目錄本來就是大家都可以讀寫的，因此我要讓所有的人都可以存取。此外，我要讓 root 寫入的檔案還是具有 root 的權限！那麼妳可以這麼寫喔！
        [root @test root]# vi /etc/exports
        /tmp *(rw,no_root_squash)
        這樣一來，無論來自哪裡(*萬用字元！表示萬事OK！)都可以使用我的 /tmp 這個目錄。請注意，那個 *(rw,no_root_squash) 中間沒有空白字元喔！而 /tmp 與 *(rw,no_root_squash) 則是有空白字元來隔開的！特別注意到那個 no_root_squash 的功能！在這個例子中，如果你是 client 端，當你 mount 上我這部主機的 /tmp 之後，你在該 mount 的目錄當中，將具有『root 的權限！』

      • 思考二：我要將一個公共的目錄 /home/public 公開出去，但是只有限定我的區域網路內 192.168.0.0/24 這個網域可以讀寫，其他人則只能讀取：
        [root @test root]# vi /etc/exports
        /tmp　　　　　*(rw,no_root_squash)
        /home/public　192.168.0.*(rw)　　 *(ro)
        /home/public　192.168.0.0/24(rw)　*(ro)
        請注意，在上面的例子中，倒數兩行的格式都可以適用！所以只要寫一行即可！上面的例子說的是，當我的 IP 是在 192.168.0.0/24 這個網段的時候，那麼 /home/public 我就可以讀寫∼至於如果我不是在這個網段之內，那麼這個目錄的資料我就僅能讀取而已，亦即為唯讀的屬性啦！

      • 思考三：我要將一個私人的目錄 /home/test 開放給 192.168.0.100 這個 Client 端的機器來使用，那麼我就必需這麼寫：
        [root @test root]# vi /etc/exports
        /tmp　　　　　*(rw,no_root_squash)
        /home/public　192.168.0.*(rw)　　 *(ro)
        /home/test　　192.168.0.100(rw)
        這樣就設定完成了！而且，只有 192.168.0.100 這部機器才能對 /home/test 這個目錄進行存取喔！

      • 思考四：我要讓 *.linux.org 網域的主機，登入我的 NFS 主機時，可以存取 /home/linux ，但是他們存資料的時候，我希望他們的 UID 與 GID 都變成 40 這個身份的使用者：
        [root @test root]# vi /etc/exports
        /tmp　　　　　*(rw,no_root_squash)
        /home/public　192.168.0.*(rw)　　 *(ro)
        /home/test　　192.168.0.100(rw)
        /home/linux　 *.linux.org(rw,all_squash,anonuid=40,anongid=40)
        特別注意到那個 all_squash 與 anonuid, anongid 的功能！如此一來，當 test.linux.org 登入這部 NFS 主機，並且在 /home/linux 寫入檔案時，該檔案的所有人與所有群組，就會變成 /etc/passwd 裡面對應的 UID 為 40 的那個身份的使用者了！
    • 關於權限問題：
      無論任何時候，權限的問題都是需要考慮到的！讓我們來看看剛剛建立的 /etc/exports 檔案的內容：
      [root @test root]# vi /etc/exports
      /tmp　　　　　*(rw,no_root_squash)
      /home/public　192.168.0.*(rw)　　 *(ro)
      /home/test　　192.168.0.100(rw)
      /home/linux　 *.linux.org(rw,all_squash,anonuid=40,anongid=40)
      假設我在 192.168.0.100 登入這部 NFS ( IP 假設為 192.168.0.2 ) 主機，並且我在 192.168.0.100 的帳號為 test 這個身份，同時，在這部 NFS 上面也有 test 這個帳號，果真如此的話，那麼：
      1. 由於 192.168.0.2 這部 NFS 主機的 /tmp 權限為 -rwxrwxrwt ，所以我 ( test 在 192.168.0.100 上面 ) 在 /tmp 底下具有存取的權限，並且寫入的檔案所有人為 test ；
      2. 在 /home/public 當中，由於我有讀寫的權限，所以如果在 /home/public 這個目錄的權限對於 test 有開放寫入的話，那麼我就可以讀寫，並且我寫入的檔案所有人是 test 。但是萬一 /home/public 對於 test 這個使用者並沒有開放可以寫入的權限時，那麼我還是沒有辦法寫入檔案喔！這點請特別留意！
      3. 在 /home/test 當中，我的權限與 /home/public 相同的狀態！還需要 NFS 主機的 /home/test 對於 test 有開放權限；
      4. 在 /home/linux 當中就比較麻煩！因為不論妳是何種 user ，妳的身份一定會被變成 UID=40 這個帳號！所以，這個目錄就必需要針對 UID = 40 的那個帳號名稱，修改他的權限才行！

      那麼假如我在 192.168.0.100 的身份為 test2 ，但是 192.168.0.2 這部 NFS 主機卻沒有 test2 這個帳號時，情況會變成怎樣呢？
      1. 我在 /tmp 底下還是可以寫入，但是寫入的檔案所有人變成 nobody 了；
      2. 我在 /home/public 裡面是否可以寫入，還需要視 /home/public 的權限而定，不過，反正我的身份就被變成 nobody 了就是；
      3. /home/test 的觀點與 /home/public 相同！
      4. /home/linux 底下，我的身份就被變成 UID = 40 那個使用者就是了！

      那麼假如我在 192.168.0.100 的身份為 root 呢？ root 這個帳號每個系統都會有呀！呵呵！權限變成怎樣呢？
      1. 我在 /tmp 裡面可以寫入，並且由於 no_root_squash 的參數，改變了預設的 root_squash 設定值，所以在 /tmp 寫入的檔案所有人為 root 喔！
      2. 我在 /home/public 底下的身份還是被壓縮成為 nobody 了！因為預設屬性裡面都具有 root_squash 呢！所以，如果 /home/public 有針對 nobody 開放寫入權限時，那麼我就可以寫入，但是檔案所有人變成 nobody 就是了！
      3. /home/test 與 /home/public 相同；
      4. /home/linux 的情況中，我 root 的身份也被壓縮成為 UID = 40 的那個使用者了！

      這樣的權限講解之後，您可以瞭解了嗎？這裡是最重要的地方，如果這一關通過了，底下的咚咚就沒有問題啦！ ^_^
    • 啟動服務 portmap, nfsd
      好了，設定OK也沒有權限的問題之後 ( 有問題也沒關係，可以事後在好好的檢視與修改一番！) ，再來自然就是啟動他囉！如何啟動呢？簡單的很，直接給他OK下去！
      [root @test root]# /etc/rc.d/init.d/portmap start<==啟動 portmap ！
      [root @test root]# /etc/rc.d/init.d/nfs start　　 <==啟動 NFS
      那個 portmap 根本就不需要設定！只要直接啟動他就可以啦！啟動之後，會出現一個 port 111 的 sunrpc 的服務！那就是 portmap 啦！至於 nfs 則會啟動至少兩個以上的 daemon 出現！然後就開始在監聽 Client 端的需求啦！啟動之後，請趕快到 /var/log/messages 裡面看看有沒有被正確的啟動呢？
      [root @test root]# vi /var/log/messages
      Nov 16 15:04:45 test portmap: portmap startup succeeded
      Nov 16 15:04:53 test nfs: Starting NFS services: succeeded
      Nov 16 15:04:54 test nfs: rpc.rquotad startup succeeded
      Nov 16 15:04:54 test nfs: rpc.mountd startup succeeded
      Nov 16 15:04:54 test nfs: rpc.nfsd startup succeeded
      要正常的出現上面的字樣之後，才算是正確的啟動喔！
    • exportfs：
      好了，那麼如果我們修改了 /etc/exports 這個檔案之後，是否需要重新啟動 nfs 呢？呵呵，並不需要，只要使用 exportfs 重新掃瞄一次 /etc/exports 這的檔案，並且重新將設定載入即可！因此，就要來瞭解一下 exportfs 的用法了：
      語法：
      [root @test root]# exportfs [-aruv]
      參數說明：
      -a ：全部掛載(或卸載) /etc/exports 檔案內的設定
      -r ：重新掛載 /etc/exports 裡面的設定，此外，亦同步更新 /etc/exports
           及 /var/lib/nfs/xtab 的內容！
      -u ：卸載某一目錄
      -v ：在 export 的時候，將分享的目錄顯示到螢幕上！
      範例：
      [root @test root]# exportfs -rv <==全部重新 export 一次！
      exporting 192.168.0.100:/home/test
      exporting 192.168.0.*:/home/public
      exporting *.linux.org:/home/linux
      exporting *:/home/public
      exporting *:/tmp
      reexporting 192.168.0.100:/home/test to kernel

      [root @test root]# exportfs -au <==全部都卸載了！

      要熟悉一下這個指令的用法喔！這樣一來，就可以直接重新 export 我們的記錄在 /etc/exports 的目錄資料囉！
    • 檢驗目錄 /var/lib/nfs/xtab
      好了，當妳順利的將妳的目錄都分享出去之後，妳怎麼知道每個目錄的分享權限呢？不要忘記了，因為我們有相當多的預設屬性呢！因此，這個時候就得需要檢驗一下妳所分享的目錄內容囉！看一下 /var/lib/nfs/xtab 這個檔案吧！他有點像這樣：
      [root @test root]# vi /var/lib/nfs/xtab
      /home/test 192.168.0.100(rw,sync,wdelay,hide,secure,root_squash,
      no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,
      anongid=-2)
      看到沒？這個就是 /home/test 這個分享出去的目錄的預設 NFS 裡面的屬性啦！這個屬性狀態裡頭有個比較奇怪的，那就是 anonuid=-2 這個，怎麼有 uid=-2 的呢？呵呵！其實它說的是將 65536 - 2 的值，也就是 65534 的那個 UID 啦！對照一下 /etc/passwd ，妳就會發現，哇！原來那就是 nobody 的啦！
    • showmount：
      showmount 顧名思義，就是看看有沒有可以 mount 的指令嘛！怎麼用呢？
      語法：
      [root @test root]# showmount [-ae] hostname
      -a ：在螢幕上顯示目前主機與 Client 所連上來的使用目錄狀態
      -e ：顯示 hostname 這部機器的 /etc/exports 裡面的分享目錄！
      範例：
      [root @test root]# showmount -e localhost
      Export list for localhost:
      /tmp *
      /home/linux *.linux.org
      /home/public (everyone)
      /home/test 192.168.0.100
      很簡單吧！所以，當妳要掃瞄某一部主機他提供的 NFS 分享的目錄時，就使用 showmount -e IP(或hostname)即可！非常的方便吧！
    • 觀察啟動的 port number：
      OK！來看看我們啟動 NFS 之後，到底啟動了多少的 port 呢？要注意的是，我們有啟動 portmap 與 nfs 兩支 scripts 喔！
      [root @test root]# netstat -utln
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN <==來自 portmap
      tcp 0 0 0.0.0.0:817 0.0.0.0:* LISTEN <==來自 rpc.xxxx
      tcp 0 0 0.0.0.0:1266 0.0.0.0:* LISTEN <==來自 rpc.xxxx
      udp 0 0 0.0.0.0:2049 0.0.0.0:*　　　　　　　　　　　<==就是 nfs 的 port
      udp 0 0 0.0.0.0:814 0.0.0.0:*　　　　　　　　　　　<==來自 rpc.xxxx
      udp 0 0 0.0.0.0:1327 0.0.0.0:*　　　　　　　　　　　<==來自 rpc.xxxx
      udp 0 0 0.0.0.0:111 0.0.0.0:*　　　　　　　　　　　<==來自 portmap
      注意看到上面喔！總共產生了好多的 port 喔！真是可怕！先注意到 nfs 自己所開啟的 port ，就是那個 2049 的 port 啦！那個就是 NFS 主要產生的 port 囉。那麼其他的 rpc.xxxx 的 port 又是從何而來？ NFS server 在前面我們就提過了，他是 RPC server 的一種，而 NFS 由於提供了多個 program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... ) ，因此就需要啟動多個 port 了！而且這些 port 是『隨機產生的』，也就是那個 port number 不會是固定的啦！每次 restart nfs 都會得到不一樣的 port number 呢！那麼 Client 端怎麼知道要連接上那個 port 來呼叫需要的 program 呢？呵呵！那就是 sunrpc ( port 111 ) 那個 portmap 服務所產生的 port number 的功用啦！Client 會先連接到 sunrpc 那個 port 去知道應該到那個 port 去呼叫所需要的程式！所以囉， rpc.xxxx 等之類的 daemon 自然就不需要有固定的 port number 囉！
    OK！這樣一來， Server 端的設定就 OK 啦！
Client 端的設定：
    掛載遠端主機：
    好了， Server 端已經設定完畢，接著下來自然就是要使用 Client 端連接上 Server 端囉！那麼連接上 Server 的步驟是怎樣呢？
    1. 掃瞄可以使用的 Server 目錄；
    2. 在 Client 本地端建立 mount point；
    3. 使用 mount 將遠端主機分享的目錄掛載進來；
    4. 可能發生的問題解決(被防火牆擋掉了！？)。
OK啦！所以我們得先知道一下我們的主機裡面有什麼？假設我的主機名稱是 test.linux.org ，那麼我要知道裡頭有些什麼藉由 NFS 分享出來的目錄，就給他 showmount 一下囉！

[root @test root]# showmount -e test.linux.org
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100

然後呢？假設我要將 /home/public 掛載在我的 /home/nfs/public 底下，那麼我就得先有這個目錄才行呀！然後再利用 mount 這個指令來掛載 /home/public 這個目錄！有點像這樣：

[root @test root]# mkdir -p /home/nfs/public <==建立 public 這個目錄，加 -p 可以持續增加目錄
[root @test root]# mount -t nfs test.linux.org:/home/public /home/nfs/public
掛載的格式：
[root @test root]# mount -t nfs hostname(orIP):/directory /mount/point
[root @test root]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 1904920 1235380 572776 69% /
/dev/hdb1 976344 115212 810736 13% /backup
test.linux.org:/home/public
1904920 1235376 572776 69% /home/nfs/public <==這個是遠端主機的容量

先注意一下掛載 NFS 檔案的格式範例喔！呵呵！這樣就可以將資料掛載進來啦！請注意喔！以後，只要你進入你的目錄 /home/nfs/public 就等於到了 test.linux.org 那部遠端主機的 /home/public 那個目錄中囉！很不錯吧！那麼如何將掛載的 NFS 目錄卸載呢？就使用 umount 啊！

[root @test root]# umount /home/nfs/public

可能發生的問題：
通常無法掛載的原因有底下這幾個：
  1. 使用者的權限不符：以上面的例子來說明，我的 /home/test 只能提供 192.168.0.0/24 這個網域，所以，如果我在 test.linux.org 這部機器中，以 localhost 來掛載時，就會無法掛載上，這個權限概念沒問題吧！那麼你可以試試看：
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: localhost:/home/test failed, reason given by server: Permission denied
    所以囉！如果你發現上面的顯示的訊息時，就表示你的主機權限不能夠進入該目錄囉！如果確定你的 IP 沒有錯誤，那麼請回到 /etc/exports 這個檔案中，針對你自己的 IP 來進行修正吧！

  2. 忘記啟動 portmap ：
    這個最容易被忘記了！就是忘記了啟動 portmap 這個服務啦！如果你發現你的 mount 的訊息是這樣：
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: RPC: Port mapper failure - RPC: Unable to receive
    或者是：
    [root @test root]# mount -t localhost:/home/test /home/nfs
    mount: RPC: Program not registered
    那麼就趕緊將 portmap 啟動吧！！並且也需要將 nfs 重新啟動喔！
    [root @test root]# /etc/rc.d/init.d/portmap start
    [root @test root]# /etc/rc.d/init.d/nfs restart

  3. 被防火牆擋掉了：
    這個也很容易忘記了！那就是重新設定一下你的防火牆，這包含了兩部份，包括 iptables 與 TCP_Wrappers ！因為我們啟動了 portmap ，這個東西有兩個資料需要分享出來，一個是 port 111 需要提供出去，因此你的 iptables 規則當中，需要開放這個 port 喔！有點像這樣的幾行字要加入你的 iptables rules 當中：
    iptables -A INPUT -p TCP --dport 111 -j ACCEPT
    iptables -A INPUT -p UDP --dport 111 -j ACCEPT
    如果你已經開放了這個 port 的連接權限，卻還是無法連接成功，那麼應該就是 TCP_Wrappers 的問題了！檢查一下你的 /etc/hosts.deny 裡頭是否有這行：
    [root @test root]# vi /etc/hosts.deny
    ALL: ALL: deny
    果真如此的話，由於 portmap 是由 portmap 這個 daemon 所啟動的，所以你就必須要在 /etc/hosts.allow 裡面加入這一行：
    [root @test root]# vi /etc/hosts.allow
    portmap: ALL : allow
    或者是將 ALL 改成你所想要讓他使用 NFS 的網域即可！這樣說可以瞭解了嗎？若想進一步瞭解一下防火牆，請參考前面章節提過的：簡易防火牆建置。
RPC server 的相關指令：
好了，既然我們知道這個 NFS 其實使用的是 RPC 這個咚咚，所以當然要知道 RPC 的每個 port 在幹什麼呀！這個時候，就不能不知道 rpcinfo 這個指令了！先來談一談這個指令的用法吧！
語法：
[root @test root]# rpcinfo [-p] hostname(orIP)
-p ：顯示所有的 port 與 program 的資訊！
範例：
[root @test root]# rpcinfo -p test.linux.org
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 1014 rquotad
100011 2 udp 1014 rquotad
100011 1 tcp 1017 rquotad
100011 2 tcp 1017 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100021 1 udp 1339 nlockmgr
100021 3 udp 1339 nlockmgr
100021 4 udp 1339 nlockmgr
100005 1 udp 1340 mountd
100005 1 tcp 1271 mountd
100005 2 udp 1340 mountd
100005 2 tcp 1271 mountd
100005 3 udp 1340 mountd
100005 3 tcp 1271 mountd

這樣就可以知道每個 port number 所對應的 program 囉！您也就知道這個 RPC server 提供給你的 program 是什麼了！當然了，要讓這個 rpcinfo 可以正確的動作，你的 portmap 得真的動起來才行吶！加油囉！

關機或結束時的注意事項：
需要注意的是，由於 NFS 使用的這個 RPC 在 client 端連上主機時，那麼你的主機想要關機，那可就會成為『不可能的任務』！如果你的 Server 上面還有 Client 在連線，那麼你要關機，可能得要等到數個鐘頭才能夠正常的關機成功！嗄！真的假的！不相信嗎？不然您自個兒試試看！ ^_^！所以囉，建議您的 NFS Server 想要關機之前，能更先『關掉 portmap 與 nfs 』這兩個東西！如果無法正確的將這兩個 daemons 關掉，那麼先以 netstat -utlp 找出 PID ，然後以 kill 將他關掉先！這樣才有辦法正常的關機成功喔！這個請特別特別的注意呢！
安全設定(被防火牆擋掉了)：
好了！一些注意事項講完了之後，再來呢？對了！又是最重要的安全設定方面的問題了！那麼 NFS 可以設定安全的地方有哪裡呢？其實還不少呢？由外而內可以這樣看：
  1. iptables 防火牆設定；
  2. TCP_Wrappers 防火牆設定；
  3. /etc/exports 權限設定。
防火牆的基本概念請參考『簡易防火牆建置』一文，最好能將該篇文章給他看完，否則還真難瞭解底下在幹嘛∼嗯！假設您已經看完該篇短文了，接著下來我們就得要一步一步的接著建立防火牆囉！
  • 使用 iptables 限制大範圍連線：
    假設我們的 NFS 主要是針對內部網路開放而已，而對於外部網路只有對學術網路開放，亦即是 140.0.0.0/8 ，那麼你可以使用這樣的語法：
    iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
    iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
    這樣大致上就可以讓 192.168.0.0/24 這個 C Class 的網域與 140.0.0.0/8 這個 A Class 的網域到你的主機裡面來，而其他的連線就視您的原本的 iptables 的狀態而定喔！

  • 使用 TCP_Wrappers 限制更細的範圍：
    事實上，如果你不懂得如何設定 iptables 的話，那也沒關係，我們可以使用 TCP_Wrappers 阿！因為要使用 NFS 就必須要通過 portmap 這一關( 因為要使用 RPC 啦！ )，而這個 portmap 可以藉由 TCP_Wrappers 來管理！呵呵！太好了！那麼就將他連線的範圍限制的更小囉！我們可以在 /etc/hosts.allow 裡面規定連上 NFS 主機的主機 IP 與名稱，假設限制中的主機只有 192.168.0.0/24 這個 C class 及 140.116.44.125 這個主機，以及後面接的是 ncku.edu.tw 的網域可以連上我的 NFS 主機，那麼我可以寫成這樣：
    [root @test root]# vi /etc/hosts.allow
    portmap: 192.168.0.0/255.255.255.0 : allow
    portmap: 140.116.44.125 : allow
    portmap: .ncku.edu.tw : allow

    [root @test root]# vi /etc/hosts.deny
    portmap: ALL : deny

    呵呵！這樣可就設定好囉！很簡單的吧！

  • 使用 /etc/exports 設定更安全的權限：
    這就牽涉到您的邏輯思考了！怎麼設定都沒有關係，但是在『便利』與『安全』之間，要找到您的平衡點吶！善用 root_squash 及 all_squash 等功能，再利用 anonuid 等等的設定來規範登入您主機的使用者身份！應該還是有辦法提供一個較為安全的 NFS 主機的！
  • Client 端掛載的問題：
    基本上，在 Client 端掛載的時候，為了擔心會不小心剛 NFS 端掛進來的具有 SUID 權限檔案的程式執行！這個很可能會危害到系統的安全呢！因為 SUID 本來就不是很安全的嘛！所以呢，你這個 root 也可以將 NFS 所分享的目錄以較為安全的情況掛載進來！例如：
    [root @test root]# mount -t nfs -o nosuid,ro hostname:/directory /mount/point
    選擇 nosuid 也是一個很不錯的抉擇喔！
通常我們都會約略的建議，不要啟動 NFS Server ，即使要啟動，最好也是針對某個範圍來進行目錄的分享！並且，『要分使用者層級來管理』會比較好一些喔！底下我們就來實際的在您的機器上面搞一個簡單的 NFS server 吧！
實際演練：
假設環境：
  1. 假設我的 Linux 主機為 192.168.0.100 這一部；
  2. 預計將 /tmp 以可讀寫，並且不限制使用者身份的方式分享給所有 192.168.0.0/24 這個網域中的所有 Linux 工作站；
  3. 預計開放 /home/nfs 這個目錄，使用的屬性為唯讀，可提供除了網域內的工作站外，向外亦提供資料內容；
  4. 預計開放 /home/upload 做為 192.168.0.0/24 這個網域的資料上傳目錄，其中，這個 /home/upload 的使用者及所屬群組為 nfs-upload 這個名字，他的 UID 與 GID 均為 210；
  5. 預計將 /home/andy 這個目錄僅分享給 192.168.0.50 這部 Linux 主機，以提供該主機上面 andy 這個使用者來使用，也就是說， andy 在 192.168.0.50 及 192.168.0.100 均有帳號，且帳號均為 andy ，所以預計開放 /home/andy 給 andy 使用他的家目錄啦！
實地演練：
好了，那麼請你先不要看底下的答案，先自己動筆或者直接在自己的機器上面動手作作看，等到得到你要的答案之後，在看底下的說明吧！
  • 首先，就是要建立 /etc/exports 這個檔案的內容囉，你可以這樣寫吧！
    [root @test root]# vi /etc/exports
    /tmp　　　　　192.168.0.*(rw,no_root_squash)
    /home/nfs　　192.168.0.*(ro) *(ro,all_squash)
    /home/upload　192.168.0.*(rw,all_squash,anonuid=210,anongid=210)
    /home/andy　　192.168.0.50(rw)
    大概就是這樣子吧！你可以自行測試看看！

  • 再來，就是要建立每個對應的目錄的實際 Linux 權限了！我們一個一個來看：
    1. /tmp
    [root @test root]# ll /
    drwxrwxrwt 6 root root 4096 Nov 16 09:07 tmp

    2. /home/nfs
    [root @test root]# mkdir -p /home/nfs <==建立所需要的目錄
    [root @test root]# chmod 755 -R /home/nfs <==修改較為嚴格的檔案權限
    將目錄與檔案設定成唯讀！不能寫入的狀態，會更保險一點！

    3. /home/upload
    [root @test root]# groupadd -g 210 nfs-upload <==先建立所需要的 210 這個群組
    [root @test root]# useradd -g 210 -u 210 -M nfs-upload <==建立需要的使用者名稱
    [root @test root]# mkdir -p /home/upload <==建立起目錄了！
    [root @test root]# chown -R nfs-upload:nfs-upload /home/upload <==修改擁有者！
    如此，則使用者與目錄的權限都設定妥當囉！

    4. /home/andy
    [root @test root]# ll /home
    drwx------ 3 andy andy 4096 Oct 28 13:37 andy

    這樣子一來，權限的問題大概就可以解決囉！

  • 啟動 portmap 與 nfs 服務：
    [root @test root]# /etc/rc.d/init.d/portmap start
    [root @test root]# /etc/rc.d/init.d/nfs start

  • 在 192.168.0.50 這部機器上面演練一下：
    1. 確認可用目錄
    [andy @linux50 andy]$ showmount -e 192.168.0.100
    Export list for 192.168.0.100:
    /tmp 192.168.0.*
    /home/nfs (everyone)
    /home/upload 192.168.0.*
    /home/andy 192.168.0.50

    2. 建立掛載點：
    [andy @linux50 andy]$ mkdir -p /home/zzz/tmp
    [andy @linux50 andy]$ mkdir -p /home/zzz/nfs
    [andy @linux50 andy]$ mkdir -p /home/zzz/upload
    [andy @linux50 andy]$ mkdir -p /home/zzz/andy

    3. 實際掛載：
    [andy @linux50 andy]$ su <==通常 Linux 只允許 root 來掛載！
    [root @linux50 andy]# mount -t nfs 192.168.0.100:/tmp /home/zzz/tmp
    [root @linux50 andy]# mount -t nfs 192.168.0.100:/home/nfs /home/zzz/nfs
    [root @linux50 andy]# mount -t nfs 192.168.0.100:/home/upload /home/zzz/upload
    [root @linux50 andy]# mount -t nfs 192.168.0.100:/home/andy /home/zzz/andy
    [root @linux50 andy]# exit

整個步驟大致上就是這樣吶！加油喔！
重點回顧
  • Network FileSystem (NFS) 可以讓主機之間透過網路分享彼此的檔案與目錄；
  • NFS 主要是透過 RPC 來進行 file share 的目的，所以 Server 與 Client 的 RPC 一定要啟動才行！
  • NFS 主機可以控制連線的 Client 端的登入與權限；
  • NFS 的設定檔就是 /etc/exports 這個檔案；
  • NFS 的重要登錄檔可以參考 /var/lib/nfs/xtab 這個檔案，還包含相當多有用的資訊在其中！
  • NFS 主機要關機之前，請務必先關閉 portmap 與 nfs server ，否則關機無法順利成功；
  • NFS 主機在更動 /etc/exports 這個檔案之後，可以透過 exportfs 這個指令來重新掛載分享的目錄！
  • 可以使用 rpcinfo 來觀察 RPC program 之間的關係！！！
  • NFS 主機在設定之初，就必須要考慮到 client 端登入的權限問題，很多時候無法寫入或者無法進行分享，主要是 Linux 實體檔案的權限設定問題所致！
  • NFS 的防火牆設定可以透過控制 RPC 的主要 port ，亦即是 111 這個 port 來管理！此外，亦可透過 TCP_Wrappers 來管理！
  • NFS 用戶端只要成功 mount NFS 主機分享的目錄之後，使用上面就好像自己的 partition 一般；
  • NFS 用戶端可以透過使用 showmount, mount 與 umount 來使用 NFS 主機提供的分享的目錄！
本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的，關於 NFS 的考試題庫的地方，只有在 LPI level 1 的 102 ，裡面的 topic 113 Networking Services ，第四點當中，簡易的 NFS 設定。強調的是『應試者需瞭解 NFS 的設定、啟動與關閉的關係』至於會考的檔案與指令可能有這些：
  • /etc/exports
  • /etc/fstab
  • mount
  • umount
參考資源：
  • http://www.faqs.org/rfcs/rfc1094.html
  • http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
  • man exports
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • NFS 的主要設定檔為何？而在該檔案內主要設定項目為何？
    答：
      主要的設定檔為 /etc/exports 而至於其設定的內容項目在每一行當中則為：
      1. 分享的目錄
      2. 針對此分享目錄開放的主機或 IP或網域
      3. 針對這部主機所開放的權限參數！

  • 在 NFS 主要的設定檔當中僅有少許的參數說明，至於預設的參數說明則沒有在該檔案當中出現，請問，如果要查閱更詳細的分享出來的檔案的屬性，要看那個檔案？
    答：
      要查閱 /var/lib/nfs/xtab 這個檔案才行！

  • 如果已經啟動了 nfs 這個伺服器，但是卻又修改過主要設定檔，請問可以使用那個指令來重新掛載分享出來的目錄與 client 端權限的設定值？
    答：
      透過使用 exportfs ，可以加上 -a 或者是 -rv 這兩個參數來重新掛載！

  • 在 client 端如果要掛載 NFS 所提供分享的檔案，可以使用那個指令？
    答：
      那自然就是 mount 啦！還有卸載是 umount 喔！

  • 在 NFS 主要設定檔當中，可以透過那個參數來控制不讓 client 端以 root 的身份使用你所分享出來的目錄與檔案？
    答：
      可以透過 root_squash 來控制沒有 root 喔！
簡易 NFS 伺服器機設定
2002/11/17：第一次完成
2003/03/09：修改部分內容，並且新增 LPI 相關性與重點整理部分！
2002/11/17以來統計人數


簡易 DHCP 伺服器設定
最近更新日期：2003/03/15

如果你在工作單位使用的是筆記型電腦，而且常常要帶著你的筆記型電腦到處跑，那麼由前幾章的『連上 Internet 』設定當中，會發現，哇！我的網路卡參數要常常修改啊！而且，每到一個新的地方，就得問清楚該地的 Server 提供的網路參數才行！真是麻煩∼∼這個時候，動態主機設定協定 (DHCP) 可就大大的派上用場啦！DHCP 這個伺服器可以自動的分配 IP 與相關的網路參數給 Client 端，來提供 Client 端自動以主機提供的參數來設定他們的網路，如此一來，使用者只要將自己的 Notebook 設定好經由 DHCP 協定來取得網路參數後，一插上網路線，呵呵！馬上就可以享受 Internet 的服務啦！很方便吧！所以得來瞧一瞧這個好用的協定喔！

原理：
    ：什麼是 DHCP
    ：DHCP 的運作方式
    ：什麼時候需要 DHCP
設定 DHCP Server ：
設定 DHCP Client ：
除錯與檢視租約檔案：
重點回顧
參考資源：
本章習題練習
原理：
    老規矩，在正式的進入 DHCP 主機設定之前，我們先來認識一下 DHCP 這個協定吧！還有，需要瞭解的是，我們是否有需要『一定』得設定 DHCP 這個伺服器呢？這裡都需要釐清一下概念喔！

  • 什麼是 DHCP：

    在開始 DHCP 的說明之前，我們先來複習一下之前在『網路基礎』裡面提到的幾個網路參數吧！要設定好一個網路的環境，使電腦可以順利的連上 Internet ，那麼你的電腦裡面一定要有底下幾個網路的參數才行，分別是：

    • IP
    • netmask
    • network
    • broadcast
    • gateway
    • DNS IP

    其中，那個 IP, netmask, network, broadcast 與 gateway 都可以在 /etc/sysconfig/network-scripts/ifcfg-eth[0-n] 這些個檔案裡面設定，DNS 的 IP 則是在 /etc/resolv.conf 裡頭設定。呵呵！只要這幾個項目設定正確，那麼電腦應該就沒問題的可以上網了！所以說，你家裡面的 3, 4 部電腦，你都可以手動的來設定好你所需要的網路參數，然後就可以大搖大擺的 連上 Internet 了！真是不錯 ^_^，不是嗎？
好了，現在讓我們換一個大一些些的場景吧！假設您是學校宿舍的網路管理員，所管理的學生電腦大概有 100 部好了，那麼你怎麼設定好這 100 部的電腦呢？
(1) 直接每一部電腦都讓你登門拜訪手動的去設定好？
(2) 將所有的學生都集合起來，然後精神訓話.....喔不！是直接教導一下怎麼設定？還是
(3) 藉由一部主機來自動的分配所有的網路參數給宿舍內的任何一部電腦？
這三種解決方案所需要的時間都不相同，如果您選擇的是(1)，那麼我個人認為，您不是工作狂就是瘋掉了，因為所要花費的時間與你所得的薪水與付出的心力是完全不成比例的∼∼如果選擇是(2)那麼很可能您會被掛上獨裁者、沒良心的管理員的稱號！如果是選擇(3)呢？恭喜您！這個方案的管理時間花費最短，也是最不麻煩的作法啦！
    呵呵！知道我要說些什麼了嗎？是的！這個 DHCP ( Dynamic Host Configuration Protocol ) 主機最主要的工作，就是在進行前面提到的第三個方案，也就是自動的將網路參數正確的分配給網域中的每部電腦，讓 Client 端的電腦可以在開機的時候就立即自動的設定好網路的參數值，這些參數值可以包括了 IP、netmask、network、router 與 DNS 的 IP 等等。如此一來，呵呵！身為管理員的你，只要注意到這一部提供網路參數的主機有沒有掛掉就好了，其他同學們的個人電腦，哈！你想都不必想要怎麼去幫忙！因為 DHCP 主機已經完全都幫你搞定啦！ ^_^！ 阿！當管理員最大的幸福就是可以喝喝茶、聊聊天就能控管好一切的網路問題呢！

  • DHCP 的運作方式：

    運作模式：
    那麼 DHCP 是怎麼運作的呢？現在假設我們的機器在同一個網域當中，也就是說， DHCP Server 與他的 Clients 都在同一個網段之內，可以透過軟體廣播的方式來達到相互溝通的狀態。那麼 Client 藉由 DHCP Server 得到 IP 的程序為：

    1. 若 Client 端電腦設定使用 DHCP 協定以取得網路參數時，則 Client 端電腦在開機的時候，或者是重新啟動網路卡的時候，會自動的發出 DHCP Client 的需求給網域內的每部電腦：這個時候，由於發出的訊息希望每部電腦都可以接受，所以該訊息除了網路卡的硬體位址(MAC)無法改變外，需要將該訊息的來源軟體位址設定為 0.0.0.0 ，而目的位址則為 255.255.255.255 (這個我們 Linux 會自動幫妳設定，無須考慮這個問題！)。這個時候，網域內的其他非 DHCP 電腦，收到這個封包之後，由於該電腦沒有提供 DHCP 的服務，所以就會自動的將該封包丟棄而不回應；而如果是 DHCP 主機呢？

    2. DHCP 主機回應訊息：如果是 DHCP 主機收到這個 Client 的 DHCP 需求時，那麼 DHCP 主機首先會針對該次需求的訊息所攜帶的 MAC 與 DHCP 主機本身的設定值去比對，如果 DHCP 主機的設定有針對該 MAC 做靜態 IP (每次都給予一個固定的 IP )的提供時，則提供 Client 端相關的固定 IP 與相關的網路參數；而如果該訊息的 MAC 並不在 DHCP 主機的設定之內時，則 DHCP 主機會選取目前網域內沒有使用的 IP (這個 IP 與設定值有關) 來發放給 client 端使用！此外，需要特別留意的是，在 DHCP 主機發放給 Client 端的訊息當中，會附帶一個『租約期限』的訊息，以告訴 Client 端，妳這個 IP 可以使用的期限有多長！

    3. Client 端接受來自 DHCP 主機的網路參數，並設定 Client 自己的網路環境：當 Client 端接受回應的訊息之後，首先會以 ARP 封包在網域內發出訊息，以確定來自 DHCP 主機發放的 IP 並沒有被佔用！如果該 IP 已經被佔用了，那麼 Client 對於這次的 DHCP 資訊將不接受，而將再次向網域內發出 DHCP 的需求廣播封包；若該 IP 沒有被佔用，則 client 可以接受 DHCP 主機所給的網路的參數，那麼這些參數將會被使用於 client 端的網路設定當中，同時， Client 端也會對 DHCP 主機發出確認封包，告訴 Server 這次的需求已經確認！而 Server 也會將該資訊記錄下來；

    4. Client 端結束該 IP 的使用權：當 Client 開始使用這個 DHCP 發放的 IP 之後，有幾個情況下他可能會失去這個 IP 的使用權：
      • Client 端離線：不論是關閉網路介面( ifdown )、重新開機 ( reboot )、關機 ( shutdown ) 等行為，皆算是離線狀態，這個時候 Server 端就會將該 IP 回收，並放到 Server 自己的備用區中，等待未來的使用；
      • Client 端租約到期：前面提到 DHCP server 端發放的 IP 有使用的期限， Client 使用這個 IP 到達期限規定的時間，就需要將 IP 繳回去！這個時候就會造成斷線，而 Client 也可以在向 DHCP 主機要求再次分配 IP 囉！

    以上就是 DHCP 這個協定在 Server 端與 Client 端的運作狀態，由上面這個運作狀態來看，我們可以曉得，喝！只要 Server 端設定沒有問題，加上 Server 與 Client 在硬體連線上面確定是 OK 的，那麼 Client 就可以直接藉由 Server 來取得上網的網路參數，當然啦，只要我們這些管理員能夠好好的、正確的管理好我們的 DHCP ，嘿嘿！那麼自然上網的設定就變成一件很簡單的事情啦！
IP 取得的方法：
在上面的步驟裡面，注意到第二步驟了嗎？就是 DHCP 會去比較 MAC 這個硬體位址，並判斷該 MAC 是否需要給予一個固定的 IP 呢！呵呵！所以啦，我們由 DHCP 主機取得的 IP 主要有兩種方式：
    靜態 ( Static ) IP ：只要那個 client 端電腦的網路卡不換掉，那麼 MAC 肯定就不會改變，由於 DHCP 可以根據 MAC 來給予固定的 IP ，所以該電腦每次都能以一個固定的 IP 連上 Internet ！呵呵！這種情況比較適合當這部電腦需要用來做為提供區域內的一些網路服務的主機之用。那麼如何在 Linux 上面知道你的 MAC 呢？很簡單啦！有很多的方式，最簡單的方式就是使用 ifconfig 及 arp 來進行：
    [root @test root]# ifconfig eth0
    ifconfig
    eth0 Link encap:Ethernet HWaddr 00:50:FC:22:9C:57
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:333678 errors:0 dropped:0 overruns:0 frame:0
    TX packets:377219 errors:0 dropped:0 overruns:0 carrier:0
    collisions:195 txqueuelen:100
    RX bytes:42243563 (40.2 Mb) TX bytes:278373316 (265.4 Mb)
    Interrupt:10 Base address:0x6100

    [root @test root]# arp
    Address HWtype HWaddress Flags Mask Iface
    test.linux.org ether 00:50:FC:22:9C:57 C eth0
    192.168.1.100 ether 00:02:44:19:A6:AD C eth0

  • 動態 ( dynamic ) IP：Client 端每次連上 DHCP 所取得的 IP 都不是固定的！都直接經由 DHCP 所隨機由尚未被使用的 IP 中提供！
除非妳的區域網路內的電腦有可能用來做為主機之用，所以必需要存在成為固定 IP ，否則使用動態 IP 的設定比較簡單，而且使用上面具有較佳的彈性。怎麼說呢？假如妳是一個 ISP 好了，而妳只申請到 150 個 IP 來做為妳的客戶連線之用。那麼您是否真的只能邀集到 150 的使用者？呵呵！當然不囉！我可以邀集 200 個使用者以上呢！為什麼？這樣想好了，我今天開了一家餐館，裡面只有 20 個座位，那麼是否我一餐指只能賣給 20 個人呢？當然不是啦！因為客人是人來人往的，有人先吃有人後吃，所以同樣是 20 個座位，但是可以有 40 個人來吃我的簡餐，因為來的時間不一樣嘛！瞭解了嗎？呵呵！對啦！妳這個 ISP 雖然只有 150 個 IP 可以發放，但是因為妳的使用者並非 24 小時都掛在線上的，所以妳可以將這 150 個 IP 做良好的分配，讓 200 個人來『輪流使用』這 150 個 IP 哩！
好了，那麼另外一個問題，還是搞不懂，什麼是『靜態 IP 』與『動態 IP』呢？不都是由 DHCP 發放的嗎？讓我們再來談一個小例子好了。目前(2003年)上網的主流是 ADSL 撥接制這種方法，其中，由於撥接制所以每次上線的 IP 都不一樣！這可以想成是 DHCP 的 動態 IP 分配方式！那麼如果妳是使用 GIGA 的撥接制給予的固定 IP 呢？呵呵！那個方式其實還是使用撥接之後才能得到連線啦！只不過 ISP 可能經由電話號碼的判斷，讓妳每次都可以收到一個固定的 IP 而已！這樣可以理解了嗎？呵呵！妳可以想成，撥接到 ISP 就是類似 client 端發送一個 DHCP 的需求給 DHCP 主機，而將 GIGA 想成我們 DHCP 裡面的固定 IP 分配方式，而 Seednet 之類的 ISP 動態給予 IP 的，就是 DHCP 裡面使用的 dynamic IP 分配方式啦！ ( 註：其實在軟體位址亦即是 IP 上面，只有 Public IP 與 Private IP 兩種，中文翻譯成『公共 IP』與『私有 IP』這兩個，至於其他所謂的『靜態 IP』、『實體 IP』、『虛擬 IP』、『浮動式 IP』等等，都是藉由一些 IP 取得的方式來分類的，對於此種分類方式可能會造成讀者的困擾，所以，請特別留意這些 IP 的意義，不要搞混了！如果還是害怕會搞不清楚，那麼只要先記得『公共 IP』是可以直接與 Internet 相互溝通的，至於『私有 IP』則是不能直接與 Internet 溝通的內部 IP 段！)
關於租約的行為：
怪了！如果我們觀察上面 DHCP 運作模式的第二個步驟，妳會發現最後面還有一個租約期限！幹嘛還要這樣的一個期限呢？其實設定期限還是有個優點啦！最大的優點就是可以避免該 IP 被某些使用者一直佔用著，但該使用者卻是 Idle ( 發呆 ) 的狀態！舉個例子來說，我們剛剛不是說到，我有 150 個 IP ，但是偏偏我有 200 個用戶嘛！那麼假設剛好例如 2002 年的世界盃足球賽好了，每個使用者都急著上網知道消息，那麼將會達到交通尖峰時段！也就是說，這 200 個人同時要來使用這 150 個 IP ，有可能嗎？當然不可能！肯定會有 50 個人無法連線，因為『很抱歉！目前系統正在忙線中，請您稍後再撥！』那怎麼辦？這個時候租約到期的方式就很有用處啦！那幾個已經連線進來很久的人，就會因為租約到期而被迫離線，這個時候那個 IP 就會被釋放出來，哈哈！大家趕快搶呀！先搶到先贏喔！所以，那 50 個人 ( 包括被迫離線的那個朋友 ) 只好繼續的、努力的、加油的來進行 DHCP 的要求囉！ ^_^""
    雖然說是優點，但是其實如果站在使用者的角度來看，還是可能會造成公憤的！憑什麼大家一起交錢，我先連線進來就需要先被踢出去？∼呵呵！這個在早期 Hinet 就是這點被罵的要死！為什麼呢？因為他的 ADSL 撥接制，似乎真的就有這個租約到期的問題，限制的時間似乎是 24 小時的樣子！所以，使用 Hinet ADSL 撥接制的朋友，每 24 小時就要忍受一次斷線！我沒有使用過 Hinet 的 ADSL 撥接制，網路上的朋友確實有回應這樣的事情，但是我不確定現在( 2003/03/15 )Hinet 是否還是用這套設定值？這樣您可以瞭解租約到期的行為了嗎？！ ^_^

    關於 DHCP 主機個數：
    或許你曾經發現過一件事情，那就是，當我的網域裡面有兩部以上的 DHCP 主機時，到底哪一部主機會設定我的這部 Client 端電腦？呵呵！很抱歉，俺也不曉得！因為在網路上面，很多時候都是『先搶先贏』的，同樣的， DHCP 的回應也是如此！當 Server1 先回應時，你使用的就是 Server1 的規定內容，如果是 Server2 先回應，你就是使用 Server2 的參數來設定你的 PC ！不過，前提之下當然是這些電腦的『物理連線』都是在一起的啊！

  • 什麼時候需要 DHCP ？

    什麼時候才需要架設 DHCP 呢？是否每個人都最好架設一部 DHCP 主機呢？那可就見仁見智啦！接下來要告知大家的是幾個概念性的問題，您倒不一定『必需』遵守底下的一些概念呢！反正，自己的網域自己『爽』就好啦！

    • 什麼時候最好使用 DHCP ？
      在某些情況之下，倒是強烈的建議架設 DHCP 主機的！什麼情況呢？例如：

      1. 您的公司內部很多 Notebook 電腦使用的場合！因為這種 NoteBook 本身就是移動性的裝置，如果每到一個地方都要去問人家『喂！妳這邊的網路參數是什麼？』還得要擔心是否會跟人家的 IP 相衝突等等的問題！這個時候，DHCP 可就是妳的救星囉！因為 Notebook 在使用上，當設定為 DHCP client 的時候，那麼只要他連接上的網域裡面有一部可以動作的 DHCP ，那麼那部 notebook 就可以連接上 Internet 了！真好，不是嗎？！

      2. 網域內電腦數量相當的多時：另外一個情況就是您所負責的網域內電腦數量相當龐大時，大到你沒有辦法一個一個的進行說明來設定他們自己的網路參數，這個時候為了省麻煩，還是架設 DHCP 來的方便吶！況且，維護一部你熟悉的 DHCP 主機，要比造訪幾十個不懂電腦的人要簡單的多哩！^_^

    • 什麼情況下不建議使用 DHCP 主機？
      雖然 DHCP 有很多好處，但是您有沒有發現一個步驟怪怪的呀！回頭看一下那個步驟一， Client 在開機的時候會主動的發送訊息給網域上的所有機器，這個時候，如果網域上就是沒有 DHCP 主機呢？很抱歉，那麼你的這部 Client 端電腦，『仍然會持續的發送訊息！』真正的時間與次數我不曉得會有多久，不過，肯定會超過 30 秒以上，甚至可以達到一分鐘以上！哇！那麼這段時間你能幹嘛？呵呵！除了等、還是等！所以囉，如果電腦數不多，還是使用手動的方式來設定一下就好了！方便嘛！

      1. 在你網域內的電腦，有很多機器其實是做為主機的用途，很少 Client 需求，那麼似乎就沒有必要架設 DHCP ；

      2. 更極端的情況是，像一般家裡，只有 3 ~ 4 部電腦，這個時候，架設 DHCP 只能拿來練練功力，事實上，並沒有多大的效益；

      3. 當你管理的網域當中，大多網路卡都屬於老舊的型號，並不支援 DHCP 的協定時；

      4. 很多使用者的資訊知識都很高，那麼也沒有需要架設 DHCP 啦。

    如前所述，上面的都是概念性的說法，事實上，一件事情的解決之道是有很多的方案的，沒有所謂的『完全正確』的方案，只有『相對可行、並且符合經濟效益與功能』的方案！所以囉，架設任何網站之前，請先多評估評估吶！
設定 DHCP Server：
好不容易！終於到了要架設 DHCP Server 的時候了，哇！好感動.....咦！鳥哥怎麼老是在唱單口相聲.... @_@
其實要設定好一個 DHCP 主機還真是蠻簡單的，只要設定一個檔案即可！但是前面的確認工作請先仔細的查驗好！
  1. 確認硬體的連線沒有問題：
    這可是架設網站的第一個重點！如果你的硬體沒有搞定，那麼軟體再怎麼厲害，呵呵！也是沒有用的啦！目前我的架構就像底下這樣，我的 Linux 主機上面有兩張網路卡，一張對內一張對外喔！

  2. 確認 dhcp 的相關套件已經安裝好了：
    如果您還不知道如何確認你的主機上面是否已經安裝了某個套件，很抱歉，請不要學習架站啦！我們這裡以 RPM 檔案及使用 Mandrake 9.0 為範例說明，使用 rpm 來查詢吧！
    [root @test root]# rpm -qa | grep dhcp
    dhcp-server-3.0-1rc9.2mdk
    dhcp-common-3.0-1rc9.2mdk
    dhcp-client-3.0-1rc9.2mdk
    看到了吧！我們需要的套件就是這三個囉！如果沒有安裝的話，請拿出您的原板光碟(不論是那個 Linux distribution ，應該都是這三個套件名稱啦！只是後面的版本可能不一樣就是了！但是，需要注意的是，在 Red Hat 上面，這三個套件被整合成為一個，亦即是 dhcp-xxxx.rpm 的檔案就是了！)，先掛載上去，然後就以 rpm 給他安裝啦！什麼？不知道如何搞定 RPM ？唉啊！又得拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』好好的 K 一 K 『 RPM 與 Tarball 的使用』。

  3. 確認 dhcp 相關設定檔案擺放的路徑：
    請您特別留意的是，不同的 Linux distribution 中，每個套件的設定檔放置的位置都不相同，例如 OpenLinux 使用的 dhcp 設定檔放置在 /etc/dhcpd/dhcpd.conf ，而 Red Hat 與 Mandrake 則放在 /etc/dhcpd.conf 裡頭！那麼我要怎麼確認呢？呵呵，因為我知道設定檔案與 server 有關，所以當然是查詢 dhcp-server 這個套件囉，要查詢設定檔，可以加上 c 的參數，所以：
    [root @test root]# rpm -qc dhcp-server
    /etc/dhcpd.conf.sample
    /etc/rc.d/init.d/dhcpd
    /etc/sysconfig/dhcpd
    /var/lib/dhcp/dhcpd.leases
    喝！知道那個 /etc/dhcpd.conf.sample 是範例檔，注意，我們的 DHCP 設定檔之檔名為 dhcpd.conf ，所以囉，馬上就知道我們的設定檔案即為 /etc/dhcpd.conf 囉！咦！這個檔案不存在哪！沒有關係，我們要自動的建立這個檔案喔！除此之外，如果您是使用 RPM 安裝的 DHCP ，那麼察看一下 /etc/rc.d/init.d/dhcpd 這個 scripts 的內容，也可以知道設定參數檔的位置，甚至修正他的位置呢！

  4. 設定 dhcpd.conf 設定檔：
    好了，那麼來到最重點啦！我們的 DHCP 就只要設定這個檔案即可！那麼這個檔案如何設定呢？基本上，我們剛剛前面提過說， DHCP 的 IP 分配可分為給予動態 IP 與靜態 IP ，其中，又需要瞭解的是，如果需要設定靜態 IP 的話，那麼就必須要知道要設定成靜態 IP 的那部電腦的硬體位址 (MAC)才行，請使用 arp 及 ifconfig 來查知您的介面的 MAC 吧！此外，我們需要設定的項目大概有幾項：

    • 整體設定(Global)：裡面含有租約期限啦、或許還有 DNS IP 與 router 的設定等等內容；
    • 動態 IP 設定：使用 subnet 的項目與 range 的參數來設定要分配出去的 IP ！請先確認好您的網段喔！
    • 靜態 IP 設定：使用 host 這個項目段，配合 MAC 來設定！

    在 dhcpd.conf 這個檔案裡頭有些地方要特別留意：

    • 『#』為註解符號；
    • 除了括號那一行之外，其他的每一行後面都要以『 ; 』做為結尾！這很重要！

    那麼我的網路環境是怎樣呢？

    • 目前我的內部網段設定為 192.168.1.0/24 這一段，且 router 為 192.168.1.2 ，此外， DNS 的 IP 為中華電信的 168.95.1.1 及 Seednet 的 139.175.10.20 這兩個；
    • 我想要讓每個使用者預設租約為 3 天，最長為 6 天；
    • 我只想要分配的 IP 只有 192.168.1.21 到 192.168.1.100 這幾個，其他的 IP 則保留下來；
    • 我還有一部主機，他的 MAC 是『 00:40:95:30:43:B4 』，我要給他的主機名稱為 vbird-inside ，且 IP 為 192.168.1.5 這個。

    則，我的設定檔為：
    [root @test root]# vi /etc/hdcpd.conf
    這個檔案在各家 Linux 中，可能放置的目錄不同而且不見得會存在，請自行建立！

    # 再次說明，這個檔案中，行首為 # 的，則為註解，且，
    # 設定的每一行之行尾，都需要 ; 符號。
    # 這個檔案的設定寫法主要有兩種，首先是有獨特的設定名稱的，例如
    # default-lease-time ，
    # < 參數代號 >　　　　 < 設定內容 > ;
    # default-lease-time 　259200　　　 ;
    # 再來則是由 option 這個代號後面接的參數代碼
    # option < 參數代碼 > < 設定內容 > ;
    # option domain-naim "domain.name" ;

    # 1. Global 首先建立整體的設定值，亦即是，當 subnet 或 host
    #　　當中沒有設定的，以 global 為準

    # 1.1 設定租約期限：
    default-lease-time 259200; # 預設的租約時間，後面接的時間為秒鐘。
    max-lease-time 518400; # 但是超過租約時間還可續約，不過，
                                 # 最長還是只到 518400 秒！

    # 1.2 設定領域名稱與 DNS IP
    option domain-name "dhcp.vbird.org" ; # 設定每部主機的後頭
                                            # 領域名稱為 dhcp.vbird.org ！
    option domain-name-servers 168.95.1.1, 139.175.10.20 ;
    # 上面這個設定在寫入 DNS 的 IP ，會自動在 Client 端修改 /etc/resolv.conf
    # 檔案，若有兩個 DNS 的 IP 以上，那麼就需要以 , 符號分隔開來！
    # 最後面還是得加上 ; 符號
    ddns-update-style ad-hoc;　# 在 Mandrake 9.0 這一版當中，由於加入許多新
                               # 功能，所以，這一行就需要加入才行驅動！

    # 2. 動態 IP 分配的設定：
    subnet 192.168.1.0 netmask 255.255.255.0 {
          range 192.168.1.21 192.168.1.100;
          option broadcast-address 192.168.1.255;
          option routers 192.168.1.2;
    }
    # 動態 IP 就如同上面的設定內容，主要以 subnet 與 netmask 來進行前頭的說明，
    # 亦即先宣告我要的網段是哪一段，這部份就一定得要回去參考一下網路基礎
    # 的部分了！千萬記得吶！然後，那個 range IP1 IP2; 那一行，都以空白字元
    # 隔開即可，而 range 表示我要分配的 IP 就是在 IP1 與 IP2 這之間的 IP 段
    # 就是了！再者，我總是要給 broadcast 吧！沒錯！那個
    # option broadcast-address 即是給予的 broadcast 了；至於 routers
    # 不用說也知道那是什麼了吧？所以，我們就已經含有 IP, network, netmask,
    # broadcast 與 router 囉！這樣就可以順利上網啦！至於 DNS 則是在
    # 上面 global 處已經設定囉！

    # 3. 靜態 IP 的設定：
    host vbird-inside {
          hardware ethernet 00:40:95:30:43:B4;
          fixed-address 192.168.1.5;
          option broadcast-address 192.168.1.255;
          option routers 192.168.1.2;
    }
    # 靜態 IP 肯定跟 MAC 有關的，所以請先查出來 MAC 吧！然後的設定您都知道啦！

    • 在 Global 的設定當中，也就是不在 subnet 與 host 的括號內的設定資料，就是可以被視為『預設』的資料啦！也就是說，當 subnet 裡頭沒有寫到租約期限啦、沒有寫到 domain-name 啦，那麼這個 Global 的設定就會自動被拿去做為該設定內的設定內容囉！

  5. 建立租約期限檔案：
    既然我們知道 DHCP 是由用戶與主機端之間的租約是否到期來進行是否繼續連線的動作，那麼自然就有所謂的『簽約儀式』囉！哈哈！真會掰！這個時候，我們就得要知道一下，那麼我到底要在哪裡設定這個租約期限檔案呢？如果在比較早期的版本中，這個步驟一定要進行的！不過，目前的版本中，似乎預設已經有這個租約期限檔案了！無論如何，還是作一下比較安心啦！

    [root @test root]# touch /etc/dhcpd.leases
    建立租約檔案同樣的，注意你的版本目錄！

    這個檔案倒是蠻有趣的！因為在實際的運作過程中，這個檔案本身不會有什麼作用，但是在啟動了 DHCP 之後，這個檔案會被 copy 一份成為底下的檔案： 『/var/lib/dhcp/hdcpd.leases 』而真正在記錄的，其實就是這個 /var 底下的檔案啦！後面我們再來看一下這個檔案的內容吧！目前還不會用到這個檔案的內容囉！(註：如果你使用的 Linux 是最近的版本，那麼應該不需要再執行這個步驟了！無論如何，你可以先略過這個步驟，到啟動的時刻下，如果未能正確啟動，再回來做這一步都還來得及呢！)

  6. 編輯 scripts 內容：
    咦！不是可以啟動了嗎？喔不∼我們還得要檢查一下，你要提供 DHCP 的介面是哪一個呢！就如同我上面的圖示，基本上，我的主機是有兩塊網路卡的，一塊對外一塊對內，而我只對這個對內部的網路卡啟動 DHCP ，因此，我可以修改一下我的 /etc/rc.d/init.d/dhcp 這個檔案：註：我是以 Mandrake 9.0 為例來說明的，如果您是使用 Red Hat 或者是 OpenLinux 等其他版本時，你應該可以找到『 daemon /usr/sbin/dhcpd 』那一行，將他改成底下的樣子也就可以啦！

    [root @test root]# vi /etc/rc.d/init.d/dhcpd
    這是啟動的 script 檔案

    先找到底下的設定內容，如果沒有找到也沒有關係，就自行新增吧！
    CONFIGFILE="/etc/dhcpd.conf"　　　　　　# 這個是設定檔案的完整路徑名稱
    LEASEFILE="/var/lib/dhcp/dhcpd.leases"　# 這個是在設定租約期限記錄檔案
    INTERFACES="eth0"　　　　　　　　　　# 這個則是要啟用 DHCP 的主機網路介面卡
    OPTIONS="-q"　　　　　　　　　　　　　　# 其他的 dhcpd 的參數設定值！
    start() {
            .....(略)...
            daemon /usr/sbin/dhcpd -cf $CONFIGFILE -lf $LEASEFILE $OPTIONS $INTERFACES
            .....(略)...
    }
    ....

    基本上，上面的 /etc/dhcpd.conf 設定檔案的所在目錄是可以變動的！就在這裡進行更動即可！你可以使用 man dhcpd 就可以知道每個參數代表的意義了！請注意，那個 start() 裡面的資訊，只要更動找到的 daemon .... 那一行即可！至於上面的參數設定內容，則可以參考 BASH 的變數設定方法來寫！目前因為我們只要針對 eth0 來啟用 DHCP 而已，所以上面 INTERFACES 的部分我就寫入了 eth0 而已，如果你還要啟動 eth1 的話，那麼就需要：『 INTERFACES="eth0 eth1"』兩個介面中間以空白字元來隔開！這樣，大致上就已經設定妥當了！準備來去啟動啦！

  7. 啟動 DHCP 服務：
    啟動服務的方法不需要再教了吧！？直接給他執行剛剛改過的 scripts 即可：

    [root @test root]# /etc/rc.d/init.d/dhcpd start 啟動的啦！
    Starting dhcpd: [ OK ]

    注意螢幕前面要顯示 OK 才可以呢！好了，除此之外，我們還要確認 DHCP 已經啟動才行！

  8. 確認正確的啟動 DHCP ：觀察啟動的 port 號與登錄檔的訊息：
    要注意的是，雖然我們已經驅動了 script 了，不過，你仍然不會知道，那個 script 是否真的讓你的 service 啟動了哪？所以，在啟動任何的服務之後，觀察一下兩個東西，一個是 port 是否以啟動，另一個則是到登錄檔去查詢一下訊息！這都是很重要的資訊呢！所以，你應該這樣做：

    1. 最重要的就是察看登錄檔！也就是 /var/log/messages 這個檔案了！
    [root @test root]# vi /var/log/messages 先看看登錄擋吧！
    Nov 23 23:35:09 vbird dhcpd: Wrote 0 deleted host decls to leases file.
    Nov 23 23:35:09 vbird dhcpd: Wrote 0 new dynamic host decls to leases file.
    Nov 23 23:35:09 vbird dhcpd: Wrote 0 leases to leases file.
    Nov 23 23:35:09 vbird dhcpd: dhcpd startup succeeded
    一定要看到 Wrote xxxx to leases file 以及 succeeded 的字眼，
    才能確定啟動成功！

    2. 再來，觀察一下 port 有沒有在 listen
    [root @test root]# netstat -utl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    udp 0 0 *:bootps *:*
    [root@vbird dhcp]# netstat -utln
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    udp 0 0 0.0.0.0:67 0.0.0.0:*

    仔細的看到喔！ DHCP 顯示的是 bootps 這個字樣！ WHY ？沒有什麼奇特的原因啦，因為 DHCP 的前身就是 bootps 這個 protocol ，所以當然就沿用啦！如果你想要修改這個字眼使成為 dhcp 的話，可以修改 /etc/services ：

    [root @test root]# vi /etc/services
    找到這兩行：
    bootps 67/tcp # BOOTP server
    bootps 67/udp

    將他改成
    dhcp 67/tcp
    dhcp 67/udp

    那未來使用 netstat -tln 就可以得到 dhcp 的顯示了！嗄！忘記 netstat 後面的參數意義！喂！不要再混了！趕快回到前幾篇提過的『Linux 常用網路指令介紹』練一練基本功吧！

  9. 修改 /etc/hosts 檔案內容對應：
    如果你有仔細的瞧過前幾章的 網路基礎 的話，那麼應該還會記得那個 /etc/hosts 會影響內部電腦的連線速度很大吧？！那麼我現在使用 DHCP 之後，糟糕！我怎麼知道哪一部 PC 連上我的主機，那麼要怎麼填寫 /etc/hosts 的內容呢？這真是太簡單了！那就將所有可能的電腦 IP 都加進去該檔案呀！ ^_^ ！以我為例，在這個例子中，我的分配的 IP 至少有 192.168.1.5, 192.168.1.21 ~ 192.168.1.100 ，所以我的 /etc/hosts 可以寫成：

    [root @test root]# vi /etc/hosts
    127.0.0.1　　 localhost.localdomain localhost
    192.168.1.2　 vbird-server
    192.168.1.5　 static-ip
    192.168.1.21　dynamic-021
    192.168.1.22　dynamic-022
    .....
    192.168.1.100 dynamic-100

    這樣一來，所有可能連進來的 IP 都已經有紀錄了，哈哈！當然沒有什麼大問題囉！ ^_^
設定 DHCP Client ：
DHCP 的 Client 端，可以是 Windows 也可以是 Linux 呢！由於我的領域內剛好有兩部 Client 端的電腦，一部為 Linux ( Red Hat 7.3 ) 另一部為 Windows 2000 ，這裡就提一下，分別是怎樣設定的呢？
  • Linux 的 DHCP Client 端設定：
    設定還真是簡單的不行∼直接修改一個檔案即可！由於我的 Linux 電腦有兩塊網路卡，其中， eth0 為使用 DHCP 來啟動的，所以我就可以修改底下的檔案呢：

    [root @test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=dhcp <==只要這一行設定對了，其他的不要管！
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.235
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=yes
    GATEWAY=192.168.1.2

    需要特別強調的是，Mandrake 與 Red Hat 都使用『 BOOTPROTO=dhcp 』來設定的！但是， OpenLinux 卻是使用『DYNAMIC=dhcp』來設定的！所以要注意你的 Linux distribution 喔！改完之後，就將我們的網路卡關掉再開！請注意，如果你是在遠端進行這個動作，你的連線『肯定會掛掉！』，因為網路卡被你關了嘛！呵呵！所以請在本機前面才進行喔！

    [root @test root]# ifdown eth0; ifup eth0
    Determining IP information for eth0 ..... done
    [root @test root]# ifconfig eth0
    eth0 Link encap:Ethernet HWaddr 00:54:DG:08:QE:BE
    inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:590 errors:0 dropped:0 overruns:0 frame:0
    TX packets:208 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:55145 (53.8 Kb) TX bytes:29113 (28.4 Kb)
    Interrupt:10 Base address:0xd000

    棒吧！已經正確的取得 IP 的資料囉！
  • Windows 2000 底下的 DHCP Client 設定方式：
    在 Windows 底下的設定也真是太簡單了！
    1. 直接在『網路上的芳鄰』按右鍵，選內容；
    2. 然後選擇『區域連線』那一項，之後會出現如下的圖示：
    3. 在上圖當中，按下『內容』則會出現下面的圖示：
    4. 然後選擇『Internet Protocol (TCP/IP) 』那一項，之後按下內容，會出現選項：
    5. 然後自然就是一直按下『確定』！直到回到正常的桌面為止！這樣就已經正確的啟動了！哇！就是這麼簡單！
    6. 手動修訂一下網路設定的方式：
      • 在 Windows 底下，要修訂 IP 的方式依據不同的版本而有不同！如果是 Windows 98 系列的版本，就需要使用『winipcfg』，出現的是視窗畫面，您可以自己調一下；
      • 在 Windows 2000 底下，我不知道怎麼叫出視窗畫面，所以直接開啟一個『 C:>提示字元』，在『開始』==>『程式集』==>『附屬應用程式』裡面的『命令提示字元』那個就是啦！
        C:\>ipconfig /all <==秀出所有的屬性

        Windows 2000 IP Configuration

        Ethernet adapter 區域連線:

        Connection-specific DNS Suffix . : dhcp.vbird.org
        Description . . . . . . . . . . . : Realtek RTL8139(A) PCI Fast Ethernet Adapter
        Physical Address. . . . . . . . . : 00-40-95-30-43-B4
        DHCP Enabled. . . . . . . . . . . : Yes
        Autoconfiguration Enabled . . . . : Yes
        IP Address. . . . . . . . . . . . : 192.168.1.99
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.1.2
        DHCP Server . . . . . . . . . . . : 192.168.1.2
        DNS Servers . . . . . . . . . . . : 168.95.1.1
        139.175.10.20
        Lease Obtained. . . . . . . . . . : 2002年11月24日 AM 12:32:54
        Lease Expires . . . . . . . . . . : 2002年11月27日 AM 12:32:54

        C:\> ipconfig /renew <==重新捉 IP 啦！

    這樣就 OK 啦！！很簡單吧！
除錯與檢視租約檔案：
接著下來，我們就要努力的來除蟲了！除蟲的第一步，就是察看登錄檔啦！最常發生的錯誤其實大概就是：
  1. 寫錯字：不要笑！真的很容易寫錯字的！這很正常！所以大家要多多的去檢查一下：
  2. 沒有加上 ; 號：是的，這也是最常發生的錯誤啦！
  3. 新版 DHCP 新增的功能限制：有時後也會有這樣的訊息出現呢！
例如底下就是錯誤訊息的一般顯示狀態：

[root @test root]# vi /var/log/messages
Nov 23 23:32:25 vbird dhcpd: /etc/dhcpd.conf line 6: semicolon expected.
Nov 23 23:32:25 vbird dhcpd: option
Nov 23 23:32:25 vbird dhcpd: ^
Nov 23 23:32:25 vbird dhcpd: Configuration file errors encountered -- exiting
Nov 23 23:32:25 vbird dhcpd:
這一個例子告訴你，在第六行有錯誤！什麼錯誤？呵呵！/etc/dhcpd.conf 中仔細檢查囉！

Nov 23 23:34:12 vbird dhcpd: ** You must add a ddns-update-style statement to /etc/dhcpd.conf.
Nov 23 23:34:12 vbird dhcpd: To get the same behaviour as in 3.0b2pl11 and previous
Nov 23 23:34:12 vbird dhcpd: versions, add a line that says "ddns-update-style ad-hoc;"
Nov 23 23:34:12 vbird dhcpd: Please read the dhcpd.conf manual page for more information. **
Nov 23 23:34:12 vbird dhcpd:
這個例子則在告訴你，你必須要新增一行字喔！不然不給你啟動！ ^_^

這樣就能夠檢驗成功了！修改上面是很容易的啦！
再來要討論的則是那個租約檔案的內容問題！去看一下 /var/lib/dhcp/dhcpd.lease 的內容吧！

[root @test root]# vi /var/lib/dhcp/dhcpd.lease
lease 192.168.1.100 {
starts 6 2002/11/23 16:15:22;
ends 5 2002/11/29 16:15:22;
tstp 5 2002/11/29 16:15:22;
binding state active;
next binding state free;
hardware ethernet 00:90:cc:08:49:13;
uid "\001\000\220\314\010I\023";
}
lease 192.168.1.99 {
starts 6 2002/11/23 16:33:16;
ends 2 2002/11/26 16:33:16;
binding state active;
next binding state free;
hardware ethernet 00:40:95:30:43:b4;
uid "\001\000@\2250C\264";
client-hostname "tools";
}
lease 192.168.1.99 {
starts 6 2002/11/23 16:33:21;
ends 2 2002/11/26 16:33:21;
binding state active;
next binding state free;
hardware ethernet 00:40:95:30:43:b4;
uid "\001\000@\2250C\264";
client-hostname "tools";
}

看到了吧！這個就是租約檔案的內容啦！詳細的記載何時申請的租約，以及期限在哪兒！嗯！這樣就完成記錄囉！
重點回顧
  • DHCP ( Dynamic Host Configuration Protocol ) 可以提供網路參數給用戶端 (client) 電腦自動設定其網路的功能；
  • 透過 DHCP 的統一管理，在同一網域當中就比較不容易出現 IP 衝突的情況發生；
  • DHCP 可以透過 MAC 的比對，來提供 Static IP (或稱為靜態 IP)，否則，通常提供用戶端 dynamic IP (或稱為動態 IP)；
  • DHCP 除了 Static IP 與 Dynamic IP 之外，還可以提供租約行為之設定；
  • 用戶端離線、不明原因的當機、超過租約期限等機會下，DHCP Server 與用戶端的租約行為會終止！
  • DHCP 可以提供的 MAC 比對、Dynamic IP 的 IP 範圍以及租約期限等等，都在 dhcpd.conf 這個檔案當中設定的；
  • 一般的情況之下，使用者需要自行設定 dhcpd.leases 這個檔案，不過，真正的租約檔案記錄是在 /var/lib/dhcp/dhcpd.leases 裡面；
  • 在新版的 DHCP 的設定檔 dhcpd.conf 當中，有時候需要加入『ddns-update-style ad-hoc;』才會正常的啟動；
參考資源：
  • Linux Magazine：http://www.linux-mag.com/2000-04/networknirvana_01.html
  • DHCP mini HOWTO：http://www.tldp.org/HOWTO/mini/DHCP/index.html
  • Internet Software consortium：http://www.isc.org/products/DHCP/
  • Study Area：http://www.study-area.org/linux/servers/linux_dhcp.htm
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • DHCP 的主要用途為何？
    答：
      DHCP 主機的主要用途就是在於自動分配網路參數給 Client 端的電腦，以降低網域當中可能發生的 IP 衝突問題，以及減少網管人員到處檢查錯誤的傷腦筋！

  • DHCP 主要的兩種 IP 分配模式為何？
    答：
      主要的兩種分配模式分別為 Dynamic IP 與 Static IP ， Static IP 透過 MAC 的比對，至於 Dynamic IP 則是直接取用網域中尚未被使用到的 IP 來進行 Client 端的分配。

  • 在有 DHCP 主機存在的網域當中，且 client 端亦使用 DHCP 來規劃用戶端的網路參數，那麼請問，在該網域當中，Client 端是如何取得 IP 的呢？？
    答：
    1. 首先， Client 端會發出一個 DHCP 要求封包；
    2. Server 端接收到要求會，會主動的回應資訊給 Client ；
    3. Client 若接受該 DHCP 主機所提供的參數，則主機會記錄下租約資訊，至於 client 端則開始以主機提供的參數設定其網路；

  • DHCP 是如何發送 Static IP 的？可以使用何種指令取得該資訊？
    答：
      DHCP 主要利用網路卡的硬體位址，亦即俗稱的『網路卡卡號』，也就是 MAC 來進行 Client 端的比對的，至於主動取得 Client 端的方式，可以透過 ping 以及 arp 來獲得。

  • 在 DHCP 的租約檔，亦即 /var/lib/dhcp/dhcpd.leases 當中，記錄了什麼資訊？
    答：
      這個檔案主要記錄了 Client 端連上 Server 端的紀錄資料，他會被 DHCP 主機用來判定與 Client 端的租約行為喔！

  • DHCP 的登錄檔放置於何處？
    答：
      就是最重要的 /var/log/messages 這個檔案啦(預設狀況下！)

簡易 DHCP 伺服器設定
2002/11/23：第一次完成
2003/03/15：加入相關重點回顧、與練習題
2002/11/24以來統計人數


簡易 DNS 伺服器設定
最近更新日期：2003/03/10

無論任何時刻，主機名稱與 IP 對應的查詢都是很重要的一環！因為人腦對於數字組成的 IP 的記憶實在是.....不怎麼樣，所以，才會發展出可以經由主機名稱(hostname)對應到電腦 IP 的一個模式，這樣我們就可以輕輕鬆鬆的記住主機名稱即可，電腦 IP 那就交給 Domain Name System 去搞定即可！那個 DNS 系統則是由柏克萊大學發展的 bind 這個套件啦(Berkeley Internet Name Domain)所提供的啦！基本上，DNS 最大的工作就是將 Hostname 對應到 IP 這個功能了，不過，要架設一個成功的 DNS 主機的話，還得要對於 DNS 的運作很清楚才行啊！否則架設的不對，還反而會造成大家的問題喔！這個章節當中，要學會的資料其實還蠻多的，需要瞭解：什麼是正解、什麼是反解、什麼是Zone、客戶端 (Client) 是經由什麼咚咚來查詢得到 IP 的呢？！以及 DNS 的授權問題等等，哇！趕快清一清腦門，要好好的用功囉！ ^_^

原理部分：
    什麼是 Domain Name System：
    DNS 的查詢過程：
    關於『授權』的意義：
    網站代管還是自己設定 DNS：
    正解與反解的 Zone 意義：
安裝部分：
    架設 DNS 所需要的套件：
設定部分：
    設定一：單純的 forward DNS 主機設定：
    設定二：DNS 主機的詳細設定：
Client 端的設定：
    /etc/nsswitch.conf
    /etc/hosts
    /etc/resolv.conf
    查詢指令：host, nslookup, dig, whois
進階設定：
    子網域授權問題：
    架設一個合法授權的 DNS 主機：
重點回顧
本章與 LPI 的關係
參考資源：
本章習題練習
原理部分
    要設定 DNS 之前，必須要瞭解什麼是 FQDN 呢？什麼是 Hostname 與對應到 IP 的流程呢？還有，為什麼要有 DNS 這個系統呢？以及我們常常會提到的『什麼是正解、反解啊！』這些都是很基礎的咚咚，得要理解得很清楚才行！這個 DNS 可以說是架設網站的第一步啦！因為我們總是希望自己的網站容易讓人家來記憶嘛！那麼總不能叫大家被你的主機所在的 IP 吧！您說是吧！因此，申請一個合法的主機名稱，或者設定一部經過合法授權的 DNS 主機，那可是相當重要的一件事啊！

  • 什麼是 Domain Name System：

    DNS 的全名是『 Domain name system 』是也，中文譯名為『領域名稱系統』，這個咚咚的用途是什麼哇！為什麼我們的電腦或者是 Internet 一定需要他 ( 尤其是以 WWW 的方式來上網時 ) ？呵呵！他最大的用途就是『造福懶惰與記憶性薄弱的人類∼』哈哈！沒錯！為什麼說他是造福人類呢？且聽我娓娓道來：
    • /etc/hosts 的歷史：
      還記得我們在前幾章當中提過的 網路基礎 裡面吧？目前在 Internet 上面通用的通訊協定為 TCP/IP ，那麼資料傳送是以 TCP 封包來傳送，他還是建置在 IP 協定之上的，而眾所皆知的， IP 是由四組 8 bit 的號碼組成的，也就是類似『 xxx.yyy.zzz.www 』這樣的型態，好啦，那麼如果我們要連上某一部電腦，就要在網址列輸入該電腦主機的 IP 才能連接的上，如果是一部或兩部電腦那還無所謂，如果像目前這種 Internet 的主機數目.....嘿！誰記得住這麼多的 IP 呀！？由於 IP 是一堆沒有意義的數字所組成的，實在不容易被懶惰與記憶性薄弱的人類所接受 ( 說的是鳥哥自己 ....) ，那如果將這些數字以『名字』來取代呢？那又如何？也就是說，只要輸入一個『電腦的名字』而我們的系統就會自動的將這個名字轉成電腦瞭解的 IP ！嘿嘿！如此一來，我要記得『名字』總是比 IP 容易的多了！早期的人類早就想到這個簡單又偷懶的方式了，那就是 /etc/hosts 這個檔案的由來！例如，只要你輸入『 ping -c 5 localhost 』你的 Linux 馬上可以印出 127.0.0.1 這個 IP ， Why ？你去看一下 /etc/hosts 就知道為什麼了！所以囉，只要將你常常上網的『網址對應的 IP 』寫到這個 /etc/hosts 底下，你的 IP 搜尋速度就會快上很多∼(註：再次強調，在妳的私有網域內部，最好將所有的 IP 都寫入這個檔案中啦！)
    • DNS 的歷史：
      早期(大約20~30年前)的電腦可是貴重物資，一般人是可望而不可及的，因為電腦數量太少，所以可以使用 /etc/hosts 來記憶這些 IP 與名稱的對應。但是在現代， Internet 上面這麼多主機，並且常常會突然的『噗通』又多出一部主機來服務，那麼我們總不能一個一個的將他輸入在 /etc/hosts 裡面吧！？對呀！真不聰明！所以後來的這個時候就有所謂的『領域名稱解析系統, DNS』出現啦！DNS 利用類似樹狀目錄的型態，將主機名稱的管理分配在不同層級的 DNS 主機當中，經由分層管理，所以每一部主機的記憶的資訊就不會很多，而且異動上面也相當的容易修改！那麼這個 DNS 的功能你知道了嗎？對啦！就是『將電腦主機的名稱轉譯成 IP 』就是了！當然囉，他的額外功能還很多！總之，他的最大功能就是『讓有意義的，人類較容易記憶的主機名稱(英文字母)，轉譯成為電腦所熟悉的 IP 位址！』舉個例子來說好了，奇摩雅虎的網站的 IP 是 202.1.237.21 ，所以你可以在你的瀏覽器上面輸入『 http://202.1.237.21 』來連上奇摩雅虎！不過，我想沒有幾個人能夠將這個 IP 背的起來的吧？！反之，我們卻都知道奇摩雅虎的網址為 tw.yahoo.com ，那麼你只要輸入『 http://tw.yahoo.com 』就可以連上 Internet 啦！很容易記憶吧！
    /etc/hosts ：直接在檔案內輸入主機名稱對應的 IP 來查詢；
    DNS 系統 ：在 Client 端以 resolver 的方式到 DNS 主機上面搜尋 IP 與名稱的對應！
    • Fully Qualified Domain Name ( FQDN )
      在提到名稱與 IP 的解析之前，我們還必需來討論一下『什麼是 domain name 與 host name ？』也就是，領域名稱與主機名稱。在討論這個主題之前，我們來聊一聊比較生活化的話題，請注意喔！底下的例子不涉及政治！呵呵！先提一下，免得大家敏感：

      • 我們曉得全台灣有很多個『李登輝』，這個『李登輝』就代表每一個獨立的個人！但是妳怎麼知道這個李登輝跟前總統李登輝是否為同一個人？咦！每個李登輝都來自不同的縣市嘛！對啦，所以我們就以縣市來做為區分，所以有台北的李登輝跟高雄的李登輝，這兩個就可以分辨了！嗄！萬一不幸，台北還有兩個李登輝怎麼辦？那就用鄉鎮來分呀！所以有台北、三芝的李登輝跟台北、仁愛的李登輝，如果我們將他列出來，可以這樣看：
        李登輝、三芝、台北
        李登輝、仁愛、台北
        李登輝、高雄
        ....
        是否就可以分辨他的不同點了呢？呵呵！沒錯！就是這樣！

      • 另外一個例子可以使用電話來看，假如高雄有個 1234567 而台南也有個 1234567 ，那麼(1)妳在高雄直接撥接 1234567 時，他會直接掛入高雄的 1234567 電話中，(2)但如果妳要撥到台南去，就得加入(06)這個區碼才行！我們就是使用區碼來做為辨識之用的！

      是否還不清楚我要說什麼？呵呵！我們常常會發現主機名稱都是 www 的網站，例如 www.gov.tw, www.seednet.net, www.hinet.net 等等，那麼我們怎麼知道這些 www 名稱的主機在不同的地方呢？就需要給他領域名稱囉！也就是 gov.tw, seednet.net, hinet.net 等等的不同，所以即使妳的主機名稱相同，但是只要不是在同一個領域內，那麼就可以被接受囉！基本上，我們知道 DNS 是有層級之分的，那麼每個層級的 Hostname 與 Domain name 可是不一樣的咚咚ㄋㄟ∼我們可以使用我們的主機來加以說明，如下圖所示：
    在上面的例子當中，第二層裡面，那個 .tw 是 domain name ，而 com, edu, gov 則是主機的名稱，而在這個主機的名稱之管理下，還有其他更小網域的主機，所以在第三層的時候，基本上，那個 edu.tw 就變成了 domain name 了！而成大與中山的 ncku, nsysu 則成為了 hostname 囉！呵呵！以此類推，最後得到我們的主機那個 aerosol 是主機名稱，而 domain name 是由 ev.ncku.edu.tw 那個名字所決定的！自然，我們的主機就是讓管理 ev.ncku.edu.tw 這個 domain name 的 DNS 主機所管理的囉！這樣是否瞭解了 domain name 與 hostname 的不同了呢？

  • DNS 的查詢過程：

    接下來我們要談一談，那麼 DNS 的 (1)架構是怎樣？ (2)查詢原理是怎樣？總是要先知道架構才能知道如何查詢的吶！所以底下我們先來介紹一下整體的架構。
    • DNS 的架構：
      上面就是一個簡單的 DNS 階層架構囉，最上方一定是 . 這個 root 的 DNS 主機，他底下管理的就只有 com, edu, gov, mil, org 與以國家為分類的第二層的主機名稱了！例如台灣地區最上層的領域名稱是以 .tw 為開頭，管理這個領域名稱的這部機器的 IP 是在台灣，但是他的記錄則是記錄在 . (root)那部機器裡面的！還有其他的國家的最上層如 .cn 指的是大陸，.de 指的是德國一樣！那麼每個國家之下記錄的主要的下層有哪些領域呢？呵呵！主要就是有這六大類：

      名稱 | 代表意義
com | 公司、行號、企業
org | 組織、機構
edu | 教育單位
gov | 政府單位
net | 網路、通訊
mil | 軍事單位

      其實最早之前在 . (root)之下只有這六大類的 domain name ，但是網路成長的速度太快了，因此後來又多出這些以國碼來分的 domain name ，如此一來，在該國家之內，只要向該國家申請 domain name 即可，不需要再到最上層去申請囉！也因此，在這些國碼之下，還是有這六大類的 domain name 為主的哩！當然啦，在目前，由於網際網路持續的發燒，說實在的 domain name 實在是有點不太夠用，所以又有相當多的領域名稱被設計出來，例如目前台灣 ISP 提供的 .idv.tw 的個人網站啦！
      好了，再強調一次， DNS 系統是以所謂的階層式的管理，所以，請注意喔！那個 .tw 只記錄底下那一層的這六個主要的 domain 的主機而已！至於例如 edu.tw 底下還有個 ncku.edu.tw 這部機器，那就直接授權交給 edu.tw 那部機器去管理了！也就是說『每個上一層的 DNS 主機，所記錄的資訊，其實只有其下一層的主機名稱而已！』至於再下一層，則直接『授權』給下層的某部主機來管理囉！呵呵！所以您就應該會知道 DNS 到底是如何管理的吧！ ^_^ 會這樣設定的原因不是沒有道理的！這樣設計的好處就是：每部機器管理的只有下一層的 hostname 對應 IP 而已，所以減少了管理上的困擾！而下層 Client 端如果有問題，只要詢問上一層的 DNS server 即可！不需要跨越上層，除錯上面也會比較簡單呢！
    • DNS 的搜尋流程：
      剛剛說過 DNS 是以類似『樹狀目錄』的型態來進行名稱的管理的！所以每一部 DNS 主機都『僅管理下一層 DNS 主機的名稱轉譯』而已，至於下層的下層，則『授權』給下層的 DNS 主機來管理啦！這樣說好像很繞口，好吧！我們就以下圖來說一說原理囉：
      首先，當你在網址列輸入 http://aerosol.ev.ncku.edu.tw 時，你的電腦就會依據 /etc/resolv.conf 所提供的 DNS 的 IP 去進行連線查詢，好了，由於目前最常見的 DNS 主機就屬 Hinet 的 168.95.1.1 這個 DNS 了，所以我們就拿他來做例子吧！嗯！這個時候， hinet 的這部主機會這樣工作：

      1. 先查看本身有沒有紀錄：剛剛說過啦，由於 DNS 是層階式的架構，任何一部 DNS 都僅記錄下一層裡面的主機名稱對應的 IP 而已，由於 hinet 並非學術網路裡面的主機，所以自然也就沒有辦法直接提供給 client 端關於 aerosol.ev.ncku.edu.tw 這部機器的 IP 了，所以啦，一般而言，這個時候 168.95.1.1 就會向最頂層，也就是 . (root) 的主機查詢 .tw 這部機器的位址；

      2. 向最頂層 ( root )查詢：由於 168.95.1.1 沒有紀錄我們主機的 IP ，這個時候他就會向『最頂層』的 . (root) 這部主機來查詢 . (root) 的下一層，也就是 .tw 這部機器的資料了！這個時候， . (root) 就會告訴 168.95.1.1 說『嘿！你要查 .tw 這個網域的管理者呀！？喝！我這裡有 .tw 這個網域的管理的主機之 IP 資訊，妳可以直接去找他！』；

      3. 向第二層查詢：168.95.1.1 接著又到 .tw 去查詢，而該部機器管理的又僅有 .edu.tw, .com.tw, gov.tw... 那幾部主機，經過比對後發現我們要的是 .edu.tw 的網域，所以這個時候 .tw 又告訴 168.95.1.1 說：『你要去管理 .edu.tw 這個網域的主機那裡查詢，我有他的 IP ！』；

      4. 向下層持續查詢：好了，一步一步下來， .edu.tw 可以查到管理 .ncku.edu.tw 的主機 IP ； .ncku.edu.tw 可以查到管理 .ev.ncku.edu.tw 的主機 IP ，而最後我們 aerosol.ev.ncku.edu.tw 就可在管理 .ev.ncku.edu.tw 網域的那部主機的設定紀錄當中查詢到啦！

      5. 記錄暫存記憶體：查到了 IP 之後，這部 168.95.1.1 的 DNS 機器總不會在下次有人查詢 aerosol.ev.ncku.edu.tw 的時候再跑一次這樣的流程吧！粉遠粉累的吶！而且也很耗系統的資源與網路的頻寬，所以呢， 168.95.1.1 這個 DNS 很聰明的會先記錄一份 aerosol.ev.ncku.edu.tw 對應 IP 的資訊在自己的暫存記憶體當中，以方便下一次又有人對同一個主機名稱的要求之查詢！最後則將結果回報給 client 端！當然啦，那個記憶在 cache 當中的資料，其實是有時間性的，當過了 DNS 設定記憶的時間(通常可能是 24 小時)，那麼該記錄就會被釋放喔！

      由這樣的分層負責你發現了什麼？嗯！那就是：

      • 當一個『合法』的 DNS 主機裡面的設定修改了之後，來自世界各地任何一個 DNS 的要求，都會正確無誤的顯示正確的主機名稱對應 IP 的資訊，因為他們會一層一層的尋找下來，所以，要找妳的主機名稱對應的 IP 就一定得要透過你的上層 DNS 主機的紀錄才行！所以只要妳的主機名字是經過上層『合法的 DNS』主機的設定的，那麼就可以在 Internet 上面被查詢到啦！呵呵！很簡單維護吧，機動性也很高。

      • 在主機的暫存記憶體記錄當中，由於是有時間性的，所以當妳的主機名稱在 DNS 當中被修改了之後，但是由於之前的舊資訊還記憶在其他的 DNS 主機的暫存記憶體裡面，所以啦，可能在別人以非妳的 DNS 主機來查詢你的主機名稱時，就會得到先前的舊資訊，這個時間差不多可能是 10 分鐘到 2 天左右，這也是為什麼我們常說當妳修改了一個 domain name 之後，可能要 2 ~ 3 天候才能全面的啟用的緣故啦！

      好啦！哇！既然 DNS 這麼棒，然後我們又需要架站，所以需要一個主機的名稱，因此，那麼我們需要架設 DNS 了嗎？！哈哈！當然不是，為什麼呢？剛剛鳥哥提到了很多次的『合法』的字眼，因為他就牽涉到『授權』的問題了！
    • DNS 使用的 port number ：
      好了，既然 DNS 系統使用的是網路的查詢，那麼自然需要有開 Listen 的 port 囉 ( 監聽的埠號 )！沒錯！很合理！那麼 DNS 使用的是那一個 port 呢？那就是 53 這個 port 啦！你可以到你的 Linux 底下的 /etc/services 這個檔案看看！搜尋一下 domain 這個關鍵字，就可以查到 53 這個 port 啦！但是這裡需要跟大家報告的是，通常， DNS 查詢的時候，是以 udp 這個較快速的資料傳輸協定 ( protocol ) 來查詢的，但是萬一沒有辦法查詢到完整的資訊時，就會再次的以 TCP 這個協定來重新查詢的！所以啟動 DNS 的 daemon (就是 named 啦) 時，會同時啟動 TCP 及 udp 的 53 這個 port number 喔！

  • 關於『授權』的意義：

    很多朋友都認為『架設 DNS 可以設定主機的名稱，而我要架站需要主機有名字，因此一定需要架設 DNS ，只要有 DNS，我的主機就可以有名字了！』是這樣嗎？當然不是！這是錯誤的觀念！怎麼說呢？從上面的圖示當中，你應該不難發現，當我要搜尋 aerosol.ev.ncku.edu.tw 主機時，就需要向管理 .ev.ncku.edu.tw 這個網域的那部機器查詢才行，而要查詢 .ev.ncku.edu.tw 則需要在 .ncku.edu.tw 上面詢問才可以！這是因為『上層 DNS 主機 .ncku.edu.tw 已經將 .ev.ncku.edu.tw 這個網域的管理權 "授權" 給 green.ev.ncku.edu.tw 這部機器，當有人要查詢 .ev.ncku.edu.tw 這個網域的主機 IP 時， .ncku.edu.tw 將會把查詢的任務直接轉給 green.ev.ncku.edu.tw 去管理了！從此， .ncku.edu.tw 這個網域的管理主機，將不會再接管 ev.ncku.edu.tw 這個網域的名稱管理！』是否很像人類社會的『授權』的概念？也就是說，當你老闆充分的『授權』給你某項工作的時候，從此，要進行該項工作的任何人，從老闆那邊知道你才是真正『有權』的人之後，都必須要向你請示一樣！ ^_^！所以囉，如果你要架設 DNS ，而且是可以連上 Internet 上面的 DNS 時，你就必須要透過『上層 DNS 主機的授權』才行！這是很重要的觀念喔！等一下我們在底下會介紹一個如何架設一個『經過合法授權的 DNS 主機』哩！
    其實，如果將上面的話改換成：『我要架站，所以我要讓我的主機有一個合法的名字！』那樣就合理了！怎麼說呢？因為我可以請上層 DNS 幫我設定主機名稱對應 IP 就可以啦！如此一來，要找我的 hostname 對應 IP 的人，都可以直接在我的上層 DNS 裡面找到，根本不需要透過我的 Linux 主機吶！例如我們研究室的 aerosol.ev.ncku.edu.tw 就可以在 green.ev.ncku.edu.tw 這部管理 DNS 的 server 上面找到ㄋㄟ∼不必親自來我的 aerosol.ev.ncku.edu.tw 上面找！也就是說，藉由 DNS 系統最大的功能『主機名稱轉譯成 IP 』這個動作，那麼你只要向任何一個合法的 DNS 主機申請一個『主機名稱, hostname 』給你的 Linux 主機，讓大家都可以藉由該 DNS 主機來查詢到你的 Linux 之 IP ，就可以使用該主機名稱來架站啦！就是這麼簡單！
    好了，那麼你就應該知道了，要讓你的主機名稱對應 IP 且讓 Internet 上面的電腦都可以查詢的到，就需要：

    1. 上層 DNS 的授權讓你設定 DNS 主機，或者是；
    2. 直接請上層 DNS 主機來幫你設定！

    這兩種模式，那麼哪種模式比較好呢？這沒有一定的答案，底下我們來談一談，你比較適合哪一種模式的設定呢？

  • 網站代管還是自己設定 DNS：

    如果你曾經申請過 domain name 的話，例如向 Hinet 或 Seednet 等台灣各大主要 ISP 申請 domain name 的話，應該都會知道有兩種主要的模式，就是剛剛上頭提到的 DNS 授權，或者是直接交給 ISP 來管理。交給 ISP 管理的，就可以稱作是網站代管啦！當然啦，如果你是學校單位的話，或者是企業內部的小單位，那麼就得請您向上層 DNS 主機的負責人要求囉！無論如何，您只能有兩個選擇就是了，要不就是請他幫忙你設定好 hostname 對應 IP ，要嘛就是請他直接將某個 domain name 段授權給你做為 DNS 的主要管理網域。那麼我怎麼知道那個方式對我比較好呢？請注意，由於 DNS 架設之後，會多出一個監聽的 port ，所以理論上，是比較不安全的！因此，能不設當然就不要設定比較好囉！所以，這裡的建議如下：

    • 需要架設 DNS 的時機：
      • 你所負責需要連上 Internet 的主機數量龐大：例如你一個人負責整個公司十幾部的網路 Server ，而這些 Server 都是掛載你的公司網域之下的。這個時候想要不架設 DNS 也粉難啦！
      • 你可能需要時常的修改你的 Server 的名字，或者是你的 Server 有隨時增加的可能性與變動性；

    • 不需要架設 DNS 的時機：
      • 網路主機數量很少：例如家裡或公司只有需要一部 mail server 時；
      • 你可以直接請上層 DNS 主機管理員幫你設定好 Hostname 的對應時；
      • 你對於 DNS 的認知不足時，如果架設反而容易造成網路壅塞的情況；
      • 架設 DNS 的費用很高時！

  • 正解與反解的 Zone 意義：

    講了這許多，還得再提一提關於正解、反解與 Zone 的問題才行啊！

    • 什麼是正解與反解？
      我們在前頭的開宗明義當中就提到啦， DNS 系統本來最主要的功能就是在轉譯 hostname 與 IP 囉，由於電腦在網路上面其實認識的只是 IP 啦，所以，一般來說，我們稱『由 hostname 去尋找出 IP 的程序稱為 正解 』，至於由 IP 去查詢得到 hostname 那就被稱為反解了！正反解的設定情況是差異性很大的！怎麼說呢？

      • 正解：在正解的情況之下，我們可以透過主機分層設定的方式來查詢(例如上面的一些圖示囉！)，而因為是 Hostname 對應 IP ，所以即使在不同網段的 IP ，仍然可以寫在同一個 domain 之中！例如我的主機是在學校裡面 ( 140.116.xxx.xxx )，但是我申請的是 vbird.idv.tw 這個 domain 的名稱，而很多朋友則是以 ISP 提供的 IP ( 例如 61.xxx.xxx.xxx ) 來進行 *.idv.tw 的申請的！呵呵！那麼一來，我的 vbird.idv.tw 就與大家的 *.idv.tw 在同一個 domain 的設定當中囉，但是這些主機卻是在不同的網域之中喔(140.116.xxx.xxx 不會跟 61.xxx.xxx.xxx 在同一個網段中吧！ ^_^) ！所以囉，任何一部 DNS 都可以將你的 IP 寫入他們的正解當中囉！

      • 反解：但是反之則不行！怎麼說呢？因為當初 IP 規劃分配的時候，就必需要一個區域一個區域的劃分的，所以當然不可能同一個網段的 IP 在不同的地方出現吧！因為這涉及到 TCP/IP 的協定與 router 的架構ㄋㄟ∼因此，同一個 IP 網段的反解就真的得要透過上層主機的設定才行了！所以由 IP 反查 hostname 的話，那麼大部分的情況下，就需要向直屬的上層申請了！

      舉個例子來說：我想要自己的領域名稱的名字，所以我可以去外面的 ISP 申請註冊一個合法的名字來架設我的 DNS ！從此之後，別人就可以經過我的 DNS 正解查詢得到我的主機 IP。但是如果要由 IP 反查回 hostname 的話，我就『一定必需要』請管理我主機所在網域的上層的 DNS 管理員來設定才行ㄋㄟ！這也是目前比較麻煩的地方，因為正解你可以自行設定，但是反解則必需要請上層的管理員設定！如果是向 ISP 申請的 IP ，那就得向 ISP 申請反解名稱改換，這個部分通常很麻煩∼

    • 什麼是 Zone ？
      知道正反解之後，再來要來知道一下，什麼又是 Zone ( 區域 ) 呢？說的簡單一點的話，一個正解或反解的設定就是一個 zone ，例如我要規範 vbird.idv.tw 這個 domain 的設定內容，那麼他就是一個 zone ！通常，『一個設定檔就是一個 zone 』！在我的例子中，我的 vbird.idv.tw 這個 domain 的 DNS 設定檔裡面，必需要有：

      • hint( root ) 的設定；
      • vbird.idv.tw 這個 domain 的正解設定；
      • localhost 的正解設定；
      • localhost 的反解設定。

      那麼我就有四個 zone 了！如果以我們系館的 DNS 主機 green.ev.ncku.edu.tw 來說的話，他至少要有：

      • hint(root)；
      • ev.ncku.edu.tw 正解；
      • ev.ncku.edu.tw 反解以及 ；
      • localhost 正解；
      • localhost 反解。

      等五個 zone 的定義囉！嘿！你會發現，我沒有 vbird.idv.tw 這個 domain 的反解設定∼為什麼呢？請參考上面的說明吧！因為反解需要要求 IP 協定的上層來設定才行！並且，需要特別留意的是，『每一個 zone 都有一個設定檔，而規定這些設定檔檔名的，就交給 /etc/named.conf 這個參數檔來設定！』也就是說， DNS server 使用的 bind 這個套件中，他的主要參數檔是 /etc/named.conf ，而這個檔案當中就是記錄了每一個 zone 的設定檔檔名！實際上，在設定正反解的，就是每一個 zone 的設定檔啦！

    • 正反解一定要成套嗎？
      好了，正反解需不需要成套產生，在這裡不用多說明了吧！？ ^_^！請注意喔，在很多的情況下，尤其是目前好多莫名其妙的領域名稱產生出來，所以，常常會只有正解的設定需求而已。不過也不需要太過擔心啦，因為通常在反查的情況中，如果你是使用目前台灣地區最流行的 ADSL 上網的話，那麼 ISP 早就已經幫你設定好反解了！例如：211.74.253.91這個 seednet 的浮動式 IP 反查的結果會得到91.253.74.211.in-addr.arpa 這樣的主機名稱！所以在一般我們自行申請領域名稱的時候，你只要擔心正解的設定即可！不然的話，反正反解的授權根本也不會開放給你，你自己設定得很高興也沒有用呀！ ^_^
架設 DNS 所需要的套件：
  • 安裝 DNS 套件： BIND
    終於廢話都說完了！相信您大概也有點累的吧！？鳥哥是蠻累的啦，因為手臂、肩頸酸痛的毛病頗嚴重....咦！講這個幹嘛！？ @_@ 好啦，我們終於要來安裝 DNS 所需要的套件了！還記得前面提過的，我們要使用的 DNS 就是使用柏克萊大學發展出來的 BIND ( Berkeley Internet Name Domain, BIND ) 這個套件啦！那麼怎麼知道你安裝了沒？還記得基礎篇裡面的 RPM 嗎？對啦！就是使用 RPM 來檢驗囉：

    [root @test root]# rpm -qa | grep bind
    bind-9.2.1-4mdk　　　　　　　　　<==這個是用來安裝 Server 的
    bind-utils-9.2.1-4mdk　　　　　　<==這個是用來做為 Client 端搜尋 domain name 的指令

    萬一沒裝怎麼辦？嗄！還問我ㄌㄟ∼趕快將你的原版光碟拿出來，然後將他安裝上去先∼不會安裝？請自行拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』去觀察一下 RPM 的用法吧！
  • BIND 的預設路徑設定：
    基本上， BIND 的主要設定檔為 /etc/named.conf這一支檔案，各種針對主機的設定值都在這個檔案中設定的！但是對於 hostname <--> IP 的對應關係，就需要由 zone 來設定了！但是這個 zone 的檔案名稱是在 /etc/named.conf 裡面規定的！所以，請注意喔，每一個 zone 的名稱都是可變的，但是需要在 /etc/named.conf 裡面命名好！此外，最好將 zone 規定出來的檔案直接放置到 BIND 的預設 zone 擺放的目錄，就是 /var/named 裡面去！比較好管理囉！
  • BIND 的升級：
    必須請大家注意的是，這個 DNS 的 53 port 其實也不是個很安全的咚咚，所以呢，非必要，其實是不太建議起用 DNS 的啦！不過，如果真的要安裝的話，那麼請隨時注意你的 Linux distribution 是否有定時的公告的漏洞修補套件呢？這個真的很重要，因為鳥哥很久很久以前，就是被這個 port 53 給種植了一個蠕蟲，真是討厭的很！ @_@
設定部分
    在 DNS 的設定上面，基本上，你必須要已經很清楚 zone 是什麼了，否則很難繼續設定喔！會搞的一塌糊塗的∼無論如何，你一定要知道的是， bind 的設定檔，就是 /etc/named.conf 這個檔案，如果他不存在的話，請自行建立吧！另外，針對 DNS server 的類型大致上可以分為三類，分別是：

    • Master：這種類型的 DNS 本身含有領域名稱的設定檔(就是有Zone啦！)，這個設定檔就是設定正解或者是反解的『Database』囉！所以他本身是具有提供 Internet 查詢所需的資料喔！例如我可以在我的主機上面設定提供 vbird.idv.tw 這個網域，那麼我的主機就是 master 類型的主機啦！

    • Slave：這種類型的主機本身不必直接由 DNS 系統管理員手動設定 DNS 的正反解資料庫檔案，而是對應到這部 Slave 所支援的 Master 主機去備份 DNS 的設定檔案資料，也就是說， Slave 會將 Master 上面已經訂定好的正反解對應資料檔案備份一份在自己的系統當中喔！( 註：當然囉，這個 Master 必須要開放 Slave 來更新 Slave 的資料對應檔喔！ ) 此外，需要特別留意的是， Slave 主機並不是在 Master 掛點時才會『活起來』的，而是他與 Master 相同，都同時負責 Internet 上面的 domain 查尋！那麼架設這個 Slave 有什麼好處呢？呵呵！最大的好處就是『單點維護』啦！怎麼說呢？假設你有三部 DNS 主機，那麼萬一你所管理的網域之內要加入一部新的主機名稱，試問，你是要手動修改 3 部電腦還是僅修改一部電腦，其他的兩部讓他自動的更新其設定呢？這樣說親愛的朋友們，您應該可以理解了吧！ ^_^！由於這個 Slave 並不是在 Master 掛點時才會活起來的一個 DNS 主機，因此，如果你向 ISP 訂定兩部 DNS 主機時，千萬要讓這兩部都活起來喔！因為不論是 Master 或是 Slave ，在 Internet 上面並非循序來查尋 domain name 的，而是先找到先贏的，所以我們不會曉得哪一部主機會先被查詢到！當然啦！因此兩部 Master/Slave 的機器就需要通通可以在 Internet 上面工作啦！

    • Cache-only：通常設定在防火牆上面的呢！這種類型的 DNS 主機沒有自己的資料庫，單純僅幫助 Client 端向外部的 DNS 主機要求資料而已∼簡單的來說，他可以想成是一個『代理人』的角色而已∼

    底下我們就來談一談兩個簡單的 DNS 主機，分別是 cache-only ( 單純 forward ) 與較為詳細的 Master 類型的 DNS 主機吧！至於 slave 與 Master 的設定蠻類似的，這裡我們就不多加介紹了！

  • 單純的 forward DNS 主機設定：

    什麼是單純的 forward DNS 的主機呢？
    好了，瞭解了 BIND 的預設路徑之後，我們知道了主要設定檔是 /etc/named.conf 這個檔案，但是偏偏我的 /etc 底下就沒有這個檔案！哈哈！因為你要自行建立啦！ ^_^！在介紹怎麼設定每一個 zone 之前，我們先來玩一個簡單的 DNS 主機！就是 cache-only DNS server ！也稱為 forward DNS 囉！顧名思義，這個 DNS server 只有 cache ( 快取 ) 的功能，也就是說，他本身沒有設定檔，完全是由對外的查詢來提供他的資料來源！因為他沒有設定檔，所以他就必須要連上一部合法的 DNS 才行！整個運作的流程可以看成是這個樣子：
    由上面的圖示來看，你可以發現，其實，我們 Client 端雖然都是使用 Cache-Only 的 DNS 再搜尋，但是，實際上 Cache-only 的主機都是請一個 ( Forwarders ) DNS 主機來幫忙查詢的，本身並沒有設定檔的啦！所以說，基本上， cache-only 的 DNS 只是一個中間傳遞資料的 DNS 主機罷了！那麼為什麼要架設這樣的一個 DNS 主機呢？閒閒沒事幹？當然不是！這是有原因的啦！底下說給你聽囉！
    什麼時候使用 cache-only DNS？
    在某些公司行號裡頭，為了預防員工利用公司的網路資源作自己的事情，所以都會規定 Internet 的連線上面相當的嚴格，所以說，有的時候，連自己都會被擋住！自然，這個 port 53 也就同樣的，可能被擋住啦！那麼我們知道說，如果沒有 port 53 這個 DNS ，那麼自然就無法解析出 hostname 對應 IP 囉！是的！怎麼辦？這個時候，您可以在『防火牆的那部機器上面，加裝一個 cache-only 的 DNS 服務！』這是什麼意思呢？很簡單啊！就是你自己利用自己的 firewall 與 DNS 去幫你的 Client 端解譯 hostname <--> IP 囉！因為 firewall 可以設定放行自己的 DNS 外出，而 Client 端的 DNS server IP 就設定自己的 firewall ，哈哈！這樣就可以取得轉譯啦！
    簡易的 cache-only DNS 設定：
    設定一個 cache-only 的 DNS 主機其實真的很簡單的啦！因為不需要設定正反解的 Zone ，所以只要設定一個檔案即可！真是快樂得不得了吶！

    1. 編輯 /etc/named.conf
      在這個檔案中，主要是定義跟主機有關的事項，以及各個 Zone 的代表含意與檔案，因為 cache-only 沒有 Zone ，所以我們只要設定好跟主機有關的設定即可。設定這個檔案的時候請注意：

      • 註解資料是以『 // 』來作設定的！
      • 每個段落之後都需要以『 ; 』來做為結尾！

      那麼你可以這樣設定這個檔案啦！

      [root @test root]# vi /etc/named.conf
      // This settings is only for forwarding DNS Server
      options {
      pid-file "/var/run/named/named.pid"; //我這裡設定 pid-file ！這個時候，
                                                    //請特別留意該路徑的所有人 ( owner )
                                                    //一定是要 named 這個人才行！
      forward only;　　　　　　　　　　　　 //只允許 forward!
      forwarders {
      168.95.1.1;　　　　　　　　　 //我這裡使用 hinet 的 DNS ！
      139.175.10.20;　　　　　　　　//這個是 seednet 的 DNS ！
      };
      };

      [root @test root]# ls -al /var/run/named
      total 12
      drwxr-xr-x 2 named named 4096 Dec 5 02:28 ./ <==注意這個 owner 喔！
      drwxr-xr-x 10 root root 4096 Dec 5 02:01 ../

      • options 的內容指的是在主機內的主要設定值，裡頭的設定為：
        • pid-file 指的是每一個 services 的記錄自己的 PID ( Process ID ) 的檔案囉！這個檔案通常用在重新啟動或者是 reload 整個 services 最常被使用到的！因為可以使用 kill -1 PID 來重新啟動啊！嗄！忘記什麼是 PID ？趕快拿出基礎篇複習一下！
        • forwarders (不要忘記那個 s 喔！)就是要設定往前尋找的那個『合法』的 DNS 囉！每一個 forward 的主機之 IP 都需要有『 ; 』來做為結尾！
        • forward only：這個設定可以讓你的 DNS 主機僅進行 forward 而已！是 Cache-Only 主機最常見的設定了！

      很簡單吧！這樣就已經設定完成了最簡單的 cache-only 的 DNS 主機了！

    2. 啟動 named
      啟動總不會忘記吧！？趕快去啟動一下吧！

      [root @test root]# /etc/rc.d/init.d/named start
      Starting named: [ OK ]

    3. 觀察 port 的變化
      請特別的注意喔！並不是啟動的時候顯示 OK 就會成功的！所以，還要趕快的來看一下你的 port 53 有沒有啟動ㄋㄟ∼

      [root @test root]# netstat -utln
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 192.168.1.2:53 0.0.0.0:* LISTEN
      tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
      udp 0 0 192.168.1.2:53 0.0.0.0:*
      udp 0 0 127.0.0.1:53 0.0.0.0:*

      特別需要留意的是，如果沒有指定介面的話，那麼所有的網路介面，包含 lo, eth0, ... 等介面都會被設定為可以接受 domain name 要求的回應介面！此外，還記得我們在前面提到的，每個介面同時都會提供 TCP 與 UDP 封包的服務喔！這樣看起來似乎真的有啟動的樣子，不過，我們還是得瞧一瞧設定方面有沒有什麼大問題呢？

    4. 檢查 /var/log/messages 的內容訊息
      named 這個服務的記錄檔就直接給他放置在 /var/log/messages 裡面啦，所以來看看裡面的幾行吧！

      [root @test root]# tail -n 15 /var/log/messages | grep named
      Dec 5 02:33:33 test named[3010]: starting BIND 9.2.1 -u named
      Dec 5 02:33:33 test named[3010]: using 1 CPU
      Dec 5 02:33:33 test named[3015]: loading configuration from '/etc/named.conf'
      Dec 5 02:33:33 test named[3015]: no IPv6 interfaces found
      Dec 5 02:33:33 test named[3015]: listening on IPv4 interface lo, 127.0.0.1#53
      Dec 5 02:33:33 test named[3015]: listening on IPv4 interface eth0, 192.168.1.2#53
      Dec 5 02:33:33 test named[3015]: running
      Dec 5 02:33:33 test named: named startup succeeded

      呵呵！看起來似乎是沒有問題的樣子了！好了！那麼就直接來測試看看吧！

    5. 測試( 請觀看 Client 端的測試項目 )
    Forwarders 的好處與問題分析
    關於 forwarder 的好處與壞處，其實有很多種的意見！大致的意見可分為這兩派：

    • 利用 Forwarder 的功能來增進效能的理論：這些朋友們認為，當很多的下層 DNS 主機都使用 forwarder 時，那麼那個被設定為 forwarder 的主機，由於會記錄很多的資訊記錄，因此，對於那些下層的 DNS 主機而言，會增快很多，亦即會節省很多的查詢時間！基本上，這些基本的流程可以看成如下圖所示：

      所有的 cache-only 都設定 forwarder 為『主 DNS 主機』那一部，則由於主 DNS 主機已經記錄了較多的資訊了(每個人都來要求嘛！)所以，當其他人來要求相同的查詢資料時，則主 DNS 那部機器將會直接由其 cache 當中讀取，因此，查詢效率就變快了！

    • 利用 Forwarder 反而會使整體的效能降低：但是另外一派則持相反的見解！這是因為當主 DNS 本身的『業務量』就很繁忙的時候，那麼你的 cache-only 主機還向他要求資料，那麼因為他的資料傳輸量太大，頻寬方面可能負荷不量，而太多的下層 DNS 又向他要求資料，所以他的查詢速度會變慢！因為查詢速度變慢了，而你的 cache-only 主機又是向他提出要求的，所以自然兩邊的查詢速度就會同步下降！

    很多種說法啦！鳥哥本人也覺得很有趣哩！只是不知道哪一派較正確就是了 >_<"" ，不過可以知道的是，如果上層的 DNS 速度很快的話，那麼他被設定為 forwarder 時，或許真的可以增加不少效能哩！

  • DNS 主機的詳細設定：

    那麼我們就來架設一部完整的 DNS 主機吧！如同前面說的，我們必須要設定的檔案有幾個呢？

    1. /etc/named.conf
    2. /var/named/named.root
    3. /var/named/named.localhost
    4. /var/named/named.127.0.0
    5. /var/named/named.正解檔案
    6. /var/named/named.反解檔案

    大概就是這幾個！要注意的是，除了第一個 /etc/named.conf 的檔名是預設的之外，其他的檔名都是在 /etc/named.conf 裡面設定的！那麼底下我們就以鳥哥家裡的連線狀態來說明一下俺是如何設定我的 domain name 囉！要注意的是，這裡的 DNS 設定是『私有網域的設定』狀態，如果您剛剛看過了『授權』的概念，那麼將會知道，底下我所設定的皆是屬於『不合法的 DNS 主機』，這意味著我的 DNS 主機只能夠向外查詢，但是別人是查不到我的 DNS 主機裡面的設定內容的！除非他使用我的 DNS 主機的 IP 囉！不過，嘿嘿！我使用的是私有 IP ，想要使用我的 DNS ！哈哈！門都沒有∼

    1. 手動規劃 hostname 與 IP 的對應表：
      在作任何事之前，先動手設計一下是好事吶！我假設我的 domain name 是 vbird.org 而網域為 192.168.1.0/24，而主機的名稱配合 domain name 來設計的共有三部電腦，分別為：

      電腦系統 | 電腦 IP | 電腦名稱 | 說明
      Mandrake 9.0 192.168.1.2 mdk90.vbird.org
      phorum.mdk90.vbird.org
      www.mdk90.vbird.org
      ftp.mdk90.vbird.org       		1. 這是主要的 DNS 設定主機；
      2. 我的主要名稱為 mdk90.vbird.org
      3. 總共有三個『別名』在這部主機上！
      Windows 2000 | 192.168.1.100 | win2k.vbird.org | 記錄在 mdk90.vbird.org 裡面的紀錄資料。
      Windows XP | 192.168.1.200 | winxp.vbird.org | 記錄在 mdk90.vbird.org 裡面的紀錄資料。

      要注意的是，在 mdk90 那部機器中，因為我的用途相當的多，所以我希望我的一部主機有多個名稱！那麼我目前又只有一個正解的領域，所以就僅設定了這個 domain 裡面的三個別名了！總共有四個名字吶！

    2. 設定簡易的 /etc/named.conf 檔案：
      還記得上面提過的，這個檔案才是主要的設定檔，而其他的 hostname <--> IP 則是在各個 zone 的設定檔中！那麼這個檔案主要的設定首先在於針對主機的設定，這一點剛剛 forwarder DNS 主機已經說過了！那另一個則是在定義每一個 zone 的檔案名稱與該設定 domain 的 『 Type (類型)』，目前有三種類型，分別為master ( 主要設定檔 ) 、 hint ( 就是 root 啦 ) 以及 slave ( 針對 master 來進行資料同步化的設定檔 ) 。好了，那麼如果以我們剛剛上面規劃的設定來看，那麼應該有的 /etc/named.conf 設定就會變成底下的模樣了：

      [root @test root]# vi /etc/named.conf
      // 設定整體的主機規劃！重點在 directory 的意義！
      options {
      directory "/var/named";　　　　//這個是在規定『我的正反解檔案放置的目錄』
      forwarders {
      168.95.1.1; 　　 　　　//不管怎麼說，俺就是喜歡 forwarder 的設定
      };
      pid-file "/var/run/named/named.pid"; //每個 distribution 可能都不同！
      allow-query { any; };　　　　　//是否允許他人查詢？當然啦！
      allow-transfer { any; };　　　 //是否允許 slave 的同步！當然啦！
      };　　　　　　　　　　　　　　　　　　 //上面這兩個設不設定都無所謂啦！預設值！

      // 首先定義出 . (root) 這個 hint type 的檔案內容！
      zone "." {　　　　　　　　　　　　　　 //看到了沒！？這個就是所謂的 zone 啦！
      type hint;　　　　　　　　　　 //選擇的 type 為 hint (root . 專用)
      file "named.root";　　　　　　 //設定檔案的檔名！很多時候預設為 named.root
      };

      // 再來則是定義出 localhost 的正反解了！很簡單啦！就是 127.0.0.1 而已
      zone "localhost" {　　　　　　　　　　 //這個 zone 表示設定檔的預設 domain name 為
                                             //localhost 的意思喔！這裡請『特別』搞清楚！
      type master;　　　　　　　　　 //主要的在本機的設定檔！
      file "named.localhost";　　　　//檔名！可以隨自己高興隨便取！
      };
      zone "0.0.127.in-addr.arpa" {　　　　　//反解的 IP 網段！那個 in-addr.arpa 是
                                             //固定的 IP 段寫法！
      type master;
      file "named.127.0.0";
      };

      //
          定義出我自己的這一組正反解設定！
zone "vbird.org" {　　　　　　　　　　//我的 zone 的 domain name 為
          vbird.org
type master;
file "named.vbird.org";
};
zone
          "1.168.192.in-addr.arpa" {
type
          master;
file "named.192.168.1";
};

      要特別留意的是：
      • options
        • 裡面多定義了一個 directory 的咚咚，這個就是設定檔放置的目錄了！以底下的檔案為例，如果是 localhost 的正解檔，亦即是 named.localhost 時，那麼這個檔案的放置位置就是在 /var/named/named.localhost 啦！這樣可以瞭解嗎？未來你可以自己改變自己檔案放置的地方，就可以分的比較清楚！
        • pid-file 指的是每一個 services 的記錄自己的 PID ( Process ID ) 的檔案囉！這個檔案通常用在重新啟動或者是 reload 整個 services 最常被使用到的！因為可以使用 kill -1 PID 來重新啟動啊！嗄！忘記什麼是 PID ？趕快拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』複習一下！
        • forwarders (不要忘記那個 s 喔！)就是要設定往前尋找的那個『合法』的 DNS 囉！每一個 forward 的主機之 IP 都需要有『 ; 』來做為結尾！
      • 關於 . (root) 的內容：root 最重要的就是那個 hint 的 type 啦！記得寫對喔！
      • 關於 localhost 的正反解：正反解的名稱都可以隨意設定，不過，要特別留意的就是那個 zone 後面接的其實就是『 domain name 』！這個 domain name 未來在設定檔當中會使用得很頻繁喔！
      • 關於其他 domain 的正反解：其實與 localhost 沒有什麼不同的，就只是不同的 domain name 就是了！
      • 反解的寫法：反解的 Zone 的寫法較為特殊，他必須要將 IP 反過來寫的，例如 127.0.0.1/24 這個 C class 的網域，要寫的話，則必須要反過來寫成 0.0.127 這樣的形式！其中需要注意的是，最後面務必要加上『in-addr.arpa』的咚咚！不要忘記了喔！

    3. 設定 . ( root ) 的內容：
      一般而言，反正本機查不到，又沒有設定 forwarder 的時候，那麼通常就是直接到 . ( root ) 去查詢囉！但是我們怎麼知道 root 在哪裡呢？總還是需要有 IP 吧！沒錯囉！如果是舊的 Red Hat 或是 Mandrake 都會提供這個 hint type 的檔案，但是 Open Linux 裡面卻沒有提供！並且，有的時候，這些主機的 IP 還是可能會變動的啦！因此呢，我們可以連接上管理國際 domain name 的機器，那就是 rs.internic.net 這部機器去下載囉！你可以這樣做：

      [root @test root]# ftp rs.internic.net
      Connected to rs.internic.net.
      Name (rs.internic.net:root): anonymous
      331 Guest login ok, send your complete e-mail address as password.
      Password: <==your password
      230 User ftp logged in. Access restrictions apply.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp> cd domain
      ftp> get named.root
      ftp> bye

      完成之後，我們來看一下 named.root 這個檔案吧！

      [root @test root]# vi named.root
      ; This file holds the information on root name servers needed to
      ; initialize cache of Internet domain name servers
      ; (e.g. reference this file in the "cache . <file>"
      ; configuration file of BIND domain name servers).
      ;
      ; This file is made available by InterNIC
      ; under anonymous FTP as
      ; file /domain/named.root
      ; on server FTP.INTERNIC.NET
      ;
      ; last update: Nov 5, 2002
      ; related version of root zone: 2002110501
      ;
      ;
      ; formerly NS.INTERNIC.NET
      ;
      . 3600000 IN NS A.ROOT-SERVERS.NET.
      A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
      ;
      ; formerly NS1.ISI.EDU
      ;
      . 3600000 NS B.ROOT-SERVERS.NET.
      B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
      ;
      ; formerly C.PSI.NET
      ;
      . 3600000 NS C.ROOT-SERVERS.NET.
      C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
      ;
      ; formerly TERP.UMD.EDU
      ;
      . 3600000 NS D.ROOT-SERVERS.NET.
      D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
      ;
      ; formerly NS.NASA.GOV
      以下省略

      共有若干個的主機，注意喔！那個『 ; 』是設定檔的註解，與 /etc/named.conf 又不一樣！特別留意，不要搞錯了！然後你會發現每個『 . 』都有個 NS 與 A 的對應，注意看到黃色的那兩行，第一行意思是 . 的 name server (NS) 為 『A.ROOT-SERVERS.NET. 』最後面有沒有加上 . 是不一樣的！特別留意！而這個 nameserver 的 IP ( 用A對應 ) 為 198.41.0.4 ！！其他的用途我們在下一個檔案再來談！總而言之，這個檔案不要去改他！因為這個是國際上通用的資料，不能修改啦！改了反而會找不到 . 哩！

    4. 設定本機端 ( localhost ) 的正解檔案：
      每一部機器都有 localhost 嘛！所以呢，我們就先來針對 localhost 這個網域的電腦對應來設定一下囉！而由於 localhost 通常其對應的 IP 就是 127.0.0.1 ，所以就直接給他正解有這兩個就行啦！但是要特別留意的是，『我的正解要找哪一個 nameserver ！？』因此，在底下的設定檔當中，最重要的其實就是要使用 NS 這個 nameserver 的『主機名稱』標誌啦！

      [root @test root]# cd /var/named
      [root @test named]# vi named.localhost
      $TTL 600　　　　　　　　　; 這個跟清除 cache 的時間有關係！單位是秒！
      @ IN SOA localhost. root.localhost. (
      2002120601 ; Serial 與 master 及 slave 是否同步有關！
                                   ; 一般而言，如果這個數值變大了， slave 才會同步更新！
      28800 ; Refresh 定義出 slave 多久會主動的檢查 serial 的值，
                                   ; 以便主動的更新資料庫！
      14400 ; Retry 定義出，如果 slave 沒有連上 master DNS 主機
                                   ; 則多久之後會重新再次的主動檢查！
      720000 ; Expire 如果一直沒有連接上 mater ，那麼到了這個時候
                                   ; slave 就會放棄檢查的動作了，不再更新！
      86400 ) ; Minimum 這個其實就是 TTL 啦！如果你沒有定義 TTL ，
                                   ; 那麼 TTL 的值就以這個來設定！
      ; 開始設定正解的資訊內容：
      @ IN NS localhost. ; 特別留意最後面有個 . 喔！
      localhost. IN A 127.0.0.1 ; A 是正解裡面 hostname 對應 IP 的標誌

      上面有很多的怪怪的字眼，我們得要先說明一下，否則後面您會『霧煞煞』的！

      符號 說明
      $TTL
      1. 這個東西主要在：『定義出向外查詢的資料可以記錄在 DNS 的 cache 當中多久』的意思；
      2. 後面接的數字單位為秒；
      3. 通常這個數字如果定義太大的話，例如一天(86400)時，那麼當別人更改了他的 DNS 訊息時，由於你的 cache 更新時間為一天，所以得要一天之後 cache 當中的資料才會被取代，因此，在一天之內，你查詢到的資訊『都會是舊的！』
      4. 但是這個數字如果定的太小的話，例如五分鐘(300)那麼這部 DNS 將會不斷的向外要求資料，則負荷會變的較大啦！
      5. 其實，除非是在測試階段，不然的話，通常都會建議定義一天的 cache 時間囉！
      6. 注意：某些套件上面並不能定義這個咚咚！
      @
               這個就是 zone 定義出的那個咚咚啦！以這個檔案內容為例，因為我們在 /etc/named.conf 當中就是定義出 localhost 這個 domain name 為一個 zone 的，因此，呵呵！在這裡，這個符號就代表 localhost 啦！
      SOA
      1. 這個是 Start of Authority 開始設定的內容的意思啦！也就是接在後面的設定要開始了！請注意，這個咚咚在每個『zone 的設定檔』當中都會存在！所以，每個 zone 的設定都一樣即可！
      2. 在 SOA 後面會接兩個咚咚，第一個為主機名稱( localhost. )，請特別留意那個 localhost 後面有個小數點 (.) 這個東西很重要！他代表『一個完整的 hostname + domain name 了』！如果沒有加上 (.) 的話，那麼就表示該文字『僅為 hostname ，還需要加上 domain name 』！這裡是新手最容易出現的錯誤喔！第二個為管理員的 e-mail ！因為不能使用 @ (已經是特殊符號了)，所以這裡也同樣的以 (.) 來取代！例如上面我以 root@localhost 來做為我的 e-mail ，所以就寫成了 root.localhost. ，同樣的，最後面有個 (.) 喔！
      3. 在最後，會有小刮號 ( ) 括起了五個數字，這五個數字除了最後一個與 TTL 有關之外，其他的都跟 slave 與 master 的資料同步運作有關！
        • Serial ：這個數字僅是用來做為 master 與 slave 之間的 update 的參考數值也就是說，當 Slave 的 serial 小於 Master 時，那麼 update 才會動作！由於擔心設定者的設定技巧問題，因此通常我們以時間來做為 Serial 的訂定依據，例如 2002 年 12 月 6 日第一次設定，可以寫成『2002120601』請注意，這個數字不可超過 10 個數字。
        • Refresh ：命令 slave 多久進行主動更新的時間；
        • Retry ：如果到了 Refresh 的時間，但是 slave 卻無法連接到 master 時，那麼在多久之後，slave 會再次的主動嘗試與主機連線；
        • Expire ：如果 slave 一直無法與 master 連接上，那麼經過多久的時間之後，則命令 slave 不要再連接 master 了！
        • Minimun ：這個就有點像是 TTL 啦！
      NS
      • 表示 name server 的意思，後面接的都是『hostname 或 FQDN』這個表示前面的 domain 是由後面的這個主機所管理的啦！
      • 『 @ IN NS localhost. 』這一行的意思是說，@ ( zone ，亦即是 localhost 這個 domain ) 的管理的 Name Server 為 localhost 這部主機，請注意，那個 localhost 後面一定要接 (.) 才行！為什麼呢？因為如果沒有加上 (.) 的話，那麼主機名稱將會變成 localhost.localhost ！ Why ？這是因為 BIND 預設情況中，沒有寫 . 的話，那麼則表示該名稱為 Hostname 而已，需要再加上 domain name 才行！
      • 由於 Name Server 為主機的名稱，所以後續還要加上這個 name server 的正解的 IP 對應(就是底下要談的 A )才行！
      A
               這是正解的符號啦！也就是說，前面的 localhost. (還是得要注意那個 . )所對應的 IP 為 127.0.0.1 的意思啦！
      .
               呵呵！再次的給他強調下，在 BIND 的設定檔當中，關於主機名稱的話，最後面有沒有加上 . 是差很多的！加上了 . 表示這個『完整的主機名稱，亦即是 hostname + domain name 』了，如果沒有加上 . 的話，表示該名稱僅為『 hostname 』而已！切記切記！

      • Slave DNS ： 所謂的 slave DNS 主機，就是說，當你的 master 主機掛點的時候，那麼 slave 主機才會接管原本 master 所管理的 domain name 的設定！而在 master DNS 主機活的好好的時，那麼 slave 將不會有接管的動作發生。這樣看起來 slave 就有點像是 master 的備份 DNS 主機囉？！答對了！大部分的時候， slave 主機確實是有點像是備份的的後援機器！因為他只有在 master 死掉時，才會顯示出管理者的威力出來的！而重點在於，既然有『slave 備份』的功能，那麼自然其資料就需要『同步化』囉！因此， SOA 才會定義出數個關於資料同步化的數字出來！

      這樣可以瞭解上面的意思了嗎？呵呵！這個是最基礎的幾個項目喔！千萬要記得！不要忘記了∼好了，知道了正解之後，我們要來談一談那個反解的東西啦！

    5. 設定本機端 ( localhost ) 的反解檔案：
      反解跟正解一樣，還都需要 SOA 的標號，也需要 NS 這個咚咚，唯一不同的大概就是由 IP 對應成為 hostname 的不同了吧！

      [root @test root]# cd /var/named
      [root @test named]# vi named.127.0.0 <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL 600
      ; This is about DNS server's settings
      @ IN SOA localhost. root.localhost. (
      2002120601 ; Serial
      28800 ; Refresh
      14400 ; Retry
      720000 ; Expire
      86400 ) ; Minimum
      ; The server's infomations
      @ IN NS localhost.
      1 IN PTR localhost.

      上面前幾行跟前面一樣，就不提了！只有最後一行不一樣，那個是什麼呢？

      符號 說明
      PTR
      • 這是反解的符號啦！主要還是在於 IP 對應主機名稱的咚咚！要注意的是，由於這個檔案的 zone 為 127.0.0 ，所以我們只要加一個數字(最後一個數字)就可以啦！而那個 1 表示的就成為了 127.0.0.1 囉！
      • 那麼萬一今天我們規劃的是 B Class 的 zone 呢？例如 127.0 這樣的 zone 呢？很簡單啦！就填兩個數字即可！也就是 0.1 囉！
      • 最重要的東西就是：在規劃 zone 的時候，是很重要的，而反解的 zone 的名稱最後需要接上 in-addr.arpa，這點也請千萬不要忘記了！

      因為這個 domain (localhost) 就只有一部機器，所以我們很簡單的就可以將他設定完成了！底下，我們將要設定我們自行假設定三部主機喔！

    6. 設定 domain name 的正解：
      再來設定的就是剛剛我們先前提到的三部主機了，你可以這樣設定：

      [root @test root]# cd /var/named
      [root @test named]# vi named.vbird.org <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL 600
      ; 跟上面提到的一樣，設定主機的一些基本資訊，包含 master 與 slave ！
      @ IN SOA mdk90.vbird.org. root.mdk90.vbird.org. (
      2002120601 ; Serial
      28800 ; Refresh
      14400 ; Retry
      720000 ; Expire
      86400 ) ; minimum
      ; 主機的設定參數部分
      @ IN NS mdk90.vbird.org.　; 這個 zone (vbird.org) 的主機
      @ IN MX 10 mdk90.vbird.org.　; 郵件轉遞的主要郵件主機！
      mdk90 IN A 192.168.1.2
      mdk90 IN TXT "The testing DNS server"　; 僅是說明文件
      phorum.mdk90 IN CNAME mdk90　　　　　　;注意這行與下一行的寫法！
      www.mdk90 IN CNAME mdk90.vbird.org.
      ; 其他主機的設定資訊上面
      win2k IN A 192.168.1.100
      win2k IN HINFO "AMD-K6-III""Windows 2000"
      winxp IN A 192.168.1.200

      除了先前的 master 與 slave 相關的時間參數之外，還有那個重要的 NS 以及 A 這些參數之外，裡面的參數主要有底下幾個新鮮玩意兒：

      符號 說明
      SOA
      • 特別注意到 SOA 那一行的設定喔！因為我們要設定的已經是 vbird.org 這個 Zone 了，所以請修改一下你的主機名稱，還有 DNS 主機的管理員郵件位址喔！
      • 另外，還是再次的提醒那個 . 是什麼東西！
      MX
      • 這個東西就是 Mail eXchanger (MX) 的簡寫，他的用途在使用於郵件主機時，需要的信件轉遞站！用於一般主機是沒有多大的影響，但是對於 mail server 則有相當重要的影響哩！
      • 如果不知道如何使用這個玩意兒，沒有關係，你可以直接將你的主機名稱(FQDN)寫入！以我上面的例子來說，我就將郵件主機寫成我自己的主機，注意，最好是 FQDN 喔！
      • 如果你的郵件主機沒有 MX 這個設定其實也沒有關係啦，信件還是可以傳送到達的，但是，有時後就是會比較慢一些些收到對方寄來的信件就是了！
      • 請注意 MX 後面要接上一個數值喔！你可以設定多個郵件主機，但是請特別留意的是，被設定的郵件主機必須要能夠支援你的郵件之 relay 才行，否則設定會變成無效的！
      TXT
      • 這個東西在進行『說明』而已！亦即是前面那部主機的一些資訊。
      • 特別注意的是，沒事的話，『資訊不要寫得太詳細，有的時候甚至應該要寫些錯誤的訊息！』為什麼呢？如果寫得太詳細的話，那麼那些個 cracker 不就很簡單的就可以將你的網站資訊取得，並進而入侵了嗎？ @_@
      CNAME
               這個東西就是設定主機別名的咚咚啦！因為我們的主機有很多個名字，沒有必要為每個名字都建立一個 A 的標號，這個時候，我們就可以使用 CNAME 來設定另外一個別名！以上面為例，我設定了兩個別名在我的主機上面，特別留意的是兩個 CNAME 的寫法都指向同一部機器，上面關於 CNAME 的那兩行最大差異性在於寫的是否為 FQDN 與後面有沒有加上 . 這個標誌啦！ ^_^
      HINFO
               這個東西後面接兩個咚咚，第一個接的是硬體的等級，第二個接的則是作業系統，這兩個咚咚最好不要用在公開的 DNS 主機上面，跟 TXT 一樣的問題啦！如果要設定的話，最好使用雙引號分隔開來喔！

      這樣應該就設定妥當囉！請額外注意喔！在 DNS 的正解部分，他的重要資訊特別的多，比較難設定的意思就對了∼所以，您需要特別留意每個設定值是否為正確喔！一般而言，我們會建議大家，設定完成之後，並且執行完啟動的 script ，千萬要記得去 /var/log/messages 裡頭看一看有沒有錯誤訊息喔！

    7. 設定 domain name 的反解：
      設定反解要簡單的多了∼只要找到對應的 hostname 即可：

      [root @test root]# cd /var/named
      [root @test named]# vi named.192.168.1 <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL 600
      @ IN SOA mdk90.vbird.org. root.mdk90.vbird.org. (
      2002120601 ; Serial
      28800 ; Refresh
      14400 ; Retry
      720000 ; Expire
      86400 ) ; minimum
      ; 其他主機的資訊！
      @ IN NS mdk90.vbird.org.
      2 IN PTR mdk90.vbird.org.
      ; The following is about other hosts
      100 IN PTR win2k.vbird.org.
      200 IN PTR winxp.vbird.org.

      很簡單吧！就是 IP 的對應即可！

    8. 啟動 named 與 port 及訊息確認：
      又到了啟動的時刻了！加油！

      1. 開始啟動！
      [root @test root]# /etc/rc.d/init.d/named start
      Starting named: [ OK ]

      2. 關於 port 觀察：
      [root @test root]# netstat -tuln | grep 53
      tcp 0 0 192.168.1.2:53 0.0.0.0:* LISTEN
      tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
      udp 0 0 192.168.1.2:53 0.0.0.0:*
      udp 0 0 127.0.0.1:53 0.0.0.0:*

      3. 關於訊息的內容！
      Dec 8 23:27:39 test named[8106]: starting BIND 9.2.1 -u named
      Dec 8 23:27:39 test named[8106]: using 1 CPU
      Dec 8 23:27:39 test named: named startup succeeded
      Dec 8 23:27:40 test named[8111]: loading configuration from '/etc/named.conf'
      Dec 8 23:27:40 test named[8111]: no IPv6 interfaces found
      Dec 8 23:27:40 test named[8111]: listening on IPv4 interface lo, 127.0.0.1#53
      Dec 8 23:27:40 test named[8111]: listening on IPv4 interface eth0, 192.168.1.2#53
      Dec 8 23:27:40 test named[8111]: couldn't add command channel 127.0.0.1#953: not found
      Dec 8 23:27:40 test named[8111]: zone 0.0.127.in-addr.arpa/IN: loaded serial 2002080601
      Dec 8 23:27:40 test named[8111]: zone 1.168.192.in-addr.arpa/IN: loaded serial 2002120601
      Dec 8 23:27:40 test named[8111]: zone localhost/IN: loaded serial 2002080601
      Dec 8 23:27:40 test named[8111]: zone vbird.org/IN: loaded serial 2002120601
      Dec 8 23:27:40 test named[8111]: running

    9. 可能的設定錯誤問題：
      基本上，DNS 算是很難設定的一個 Server 了，所以在除錯方面請務必小心！他的設定錯誤通常有兩種情況：
      • 語法設定錯誤：這個問題比較好解決，因為在 /var/log/messages 裡面都已經說的很清楚了！按照內容去修訂即可；
      • 邏輯設定錯誤：這個就比較困擾了！為什麼呢？因為他主要發生在您設定 DNS 主機的時候，考慮不週所產生的問題！例如忘記加上 (.) ，系統不會顯示錯誤訊息，但是卻會造成查詢的誤判，而 MX 設定的主機名稱錯誤，也不會出現有問題的訊息，但是 mail server 就是會收不到信等等∼這些錯誤都需要很詳細的 DNS client 的測試才能知道問題的所在。
      我們這裡先就語法設定錯誤方面進行介紹，至於邏輯設定的問題，那個就需要多多的進行測試才能知道了∼

      Dec 10 11:34:21 test named[31185]: loading configuration from '/etc/named.conf'
      Dec 10 11:34:21 test named[31185]: /etc/named.conf:18: missing ';' before '}'
      Dec 10 11:34:21 test named[31185]: loading configuration: failure
      Dec 10 11:34:21 test named[31185]: exiting (due to fatal error)
      這樣的錯誤就是發生在 /etc/named.conf 的地 18 行，忘記加上 ; 符號了！去修正即可！

      Dec 10 11:37:20 test named[31236]: dns_rdata_fromtext: named.localhost:9: near eol: unexpected end of input
      Dec 10 11:37:20 test named[31236]: zone localhost/IN: loading master file named.localhost: unexpected end of input
      這樣的錯誤通常就是發生在 named.localhost 的第 9 行處，去修正看看，通常在前面幾行很有可能是 SOA 後面接的五個數字沒有寫全的原因！

      Dec 10 11:42:28 test named[31338]: dns_master_load: named.localhost:14: unexpected end of line
      Dec 10 11:42:28 test named[31338]: dns_master_load: named.localhost:13: unexpected end of input
      Dec 10 11:42:28 test named[31338]: zone localhost/IN: loading master file named.localhost: unexpected end of input
      同樣的，告訴你在該檔案 named.localhost 有問題！請查證！

      通常最大的原因真的就是打錯字啦！總之，趕緊去看看 /var/log/messages 的內容，一定可以讓您更瞭解錯誤的問題喔！

    10. 測試：這樣就設定完成了！請前往 Client 端觀察吧！
Client 端的設定：
  • 檔案設定：
既然已經完成了 DNS 主機的設定，接下來自然要進行 Client 端的連線測試啦！要怎麼測試呢？底下有幾個檔案請特別留意喔：
  • /etc/hosts ：剛剛上面就提過了，這個是最早的 hostname 對應 IP 的檔案；
  • /etc/resolv.conf ：這個就是設定你 Client 端連上 DNS 主機的 IP 設定檔；
  • /etc/nsswitch.conf：這個檔案則是在『決定』先要使用 /etc/hosts 還是 /etc/resolv.conf 的設定！
一般而言， Linux 的預設 hostname 搜尋都是先 /etc/hosts 來的，為什麼呢？你可以查看一下 /etc/nsswitch.conf ，並找到 hosts 的項目：

[root @test root]# vi /etc/nsswitch.conf
hosts: files nisplus nis dns

上面那個 files 就是使用 /etc/hosts 而最後的 dns 則是使用 /etc/resolv.conf 的 DNS 主機 IP 搜尋啦！因此，你可以先以 /etc/hosts 來設定 IP 對應ㄋㄟ！當然啦，你也可以將他調換過來，不過，總是 /etc/hosts 比較簡單，所以將他擺在前面比較好啦！
好啦，既然我們是要進行 DNS 測試的，那麼 /etc/resolv.conf 的內容，自然就要填寫我們自己的 IP 囉！所以你應該這樣寫：

[root @test root]# vi /etc/resolv.conf
nameserver 192.168.1.2
nameserver 163.28.112.1
nameserver 163.28.113.1

nameserver 可以設定多個，但是由於 nameserver 是一個一個的追查下來的，所以，你的 DNS 主機的 IP 要寫在最上面喔！然後就可以開始測試了！
  • 測試 DNS 設定：
測試 DNS 的程式有很多，我們先來使用最簡單的 host 吧！然後還有 nslookup 及 dig 哩！

host：
語法：
[root @test root]# host [-a] [FQDN]
[root @test root]# host -l [domain]
參數說明：
-a ：所有的資訊都列出來；
-l ：將後面接的 domain 內的所有的 host 都列出來！
範例：
[root @test root]# host mdk90.vbird.org
mdk90.vbird.org has address 192.168.1.2
很單純的只列出來 hostname 對應 IP 而已！其他的資訊則一概不印出！

[root @test root]# host -a mdk90.vbird.org
Trying "mdk90.vbird.org"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51741
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mdk90.vbird.org. IN ANY

;; ANSWER SECTION:
mdk90.vbird.org. 600 IN A 192.168.1.2
mdk90.vbird.org. 600 IN TXT "The testing DNS server"

;; AUTHORITY SECTION:
vbird.org. 600 IN NS mdk90.vbird.org.

Received 98 bytes from 192.168.1.2#53 in 9 ms
注意看上面的說明，上面的 600 就是我們訂定的 TTL 的數值， A, TXT, NS 則是在 master file ，也就是 named.vbird.org 裡面設定的資訊！了不了ㄋㄟ？

[root @test root]# host -l vbird.org
vbird.org SOA mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400
vbird.org name server mdk90.vbird.org.
vbird.org mail is handled by 10 mdk90.vbird.org.
mdk90.vbird.org has address 192.168.1.2
mdk90.vbird.org text "The testing DNS server"
phorum.mdk90.vbird.org is an alias for mdk90.vbird.org.
www.mdk90.vbird.org is an alias for mdk90.vbird.org.
win2k.vbird.org has address 192.168.1.100
win2k.vbird.org host information "AMD-K6-III" "Windows 2000"
winxp.vbird.org has address 192.168.1.200
vbird.org SOA mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400
上面的資訊有沒有很熟悉呢？對啦！那就是我們在設定 named.vbird.org 裡面的所有的設定資訊！

基本上，如果沒有特殊的需求，那麼 host 這個程式就實在是很好用了！而且還粉方便ㄋㄟ！

nslookup ：
語法：
[root @test root]# nslookup [FQDN]
[root @test root]# nslookup
參數說明：
set type=any ：列出所有的資訊『正解方面設定檔』
set type=mx ：列出與 mx 相關的資訊！
範例：
[root @test root]# nslookup win2k.vbird.org
Server: 192.168.1.2
Address: 192.168.1.2#53

Name: win2k.vbird.org
Address: 192.168.1.100
亦是單純的將 hostname 對應的 IP 列出來而已！蠻方便的啦！而且前面亦會顯示出是哪一部 DNS 主機去查詢的！

[root @test root]# nslookup
> 192.168.1.2　　 　　　<==檢查反解！
Server: 192.168.1.2
Address: 192.168.1.2#53

2.1.168.192.in-addr.arpa name = mdk90.vbird.org.
> www.mdk90.vbird.org　　<==檢查正解！
Server: 192.168.1.2
Address: 192.168.1.2#53

www.mdk90.vbird.org canonical name = mdk90.vbird.org.
Name: mdk90.vbird.org
Address: 192.168.1.2
> tw.yahoo.com　　　　　<==檢查非本機端的正解！
Server: 192.168.1.2
Address: 192.168.1.2#53

Non-authoritative answer: <==這一行在說明，這個資訊得自『非認證！』亦即由 cache 取得的！
Name: tw.yahoo.com
Address: 202.1.237.21
> set type=any　　　　　<==顯示所有的資訊！僅針對正解而言！
> mdk90.vbird.org
Server: 192.168.1.2
Address: 192.168.1.2#53

Name: mdk90.vbird.org
Address: 192.168.1.2
mdk90.vbird.org text = "The testing DNS server"
> exit

nslookup 也是一個很不錯用的資訊喔！不過，底下的 dig 又更厲害了！

dig：
語法：
[root @test root]# dig [-t type] [FQDN]
參數說明：
-t type ：查詢某種 type ，主要有 any 及 mx 等！
範例：
[root @test root]# dig mdk90.vbird.org

; <<>> DiG 9.2.1 <<>> mdk90.vbird.org
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41014
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mdk90.vbird.org. IN A

;; ANSWER SECTION:
mdk90.vbird.org. 600 IN A 192.168.1.2

;; AUTHORITY SECTION:
vbird.org. 600 IN NS mdk90.vbird.org.

;; Query time: 10 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Tue Dec 10 13:50:38 2002
;; MSG SIZE rcvd: 63
由上面的資訊我們可以得到 A 的正解及 NS 的主機名稱喔！

[root @test root]# dig -t mx mkd90.vbird.org

; <<>> DiG 9.2.1 <<>> -t mx mkd90.vbird.org
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39261
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mkd90.vbird.org. IN MX

;; AUTHORITY SECTION:
vbird.org. 600 IN SOA mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400

;; Query time: 9 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Tue Dec 10 13:53:10 2002
;; MSG SIZE rcvd: 80
主要是取得 MX 的相關資訊啦！

這樣的查詢方式是不是也很方便呢！？趕快去試看看你的設定對不對吧！

whois：
語法：
[root @test root]# whois hostname
參數說明：
範例：
[root @test root]# whois redhat.com

Domain Name: REDHAT.COM
Registrar: NETWORK SOLUTIONS, INC.
Whois Server: whois.networksolutions.com
Referral URL: http://www.networksolutions.com
Name Server: NS2.REDHAT.COM
Name Server: NS3.REDHAT.COM
Name Server: NS1.REDHAT.COM
Status: ACTIVE
Updated Date: 09-jan-2003
Creation Date: 26-may-1994
Expiration Date: 25-may-2006

Registrant:
Red Hat, Inc. (REDHAT-DOM)
P.O. Box 13588
Research Triangle Park, NC 27709
US

Domain Name: REDHAT.COM

Administrative Contact, Technical Contact:
Network Operations Center (NOC144-ORG) noc@REDHAT.COM
Red Hat, Inc.
P.O. Box 13588
Research Triangle Park, NC 27709
US
919-547-0012Fax- 919-547-0024
Fax- - 919-547-0024

Record expires on 27-May-2006.
Record created on 26-May-1994.
Database last updated on 9-Mar-2003 11:44:55 EST.

Domain servers in listed order:

NS3.REDHAT.COM 66.187.229.10
NS1.REDHAT.COM 66.187.233.210
NS2.REDHAT.COM 66.187.224.210

whois 可以用來查詢某一部主機或某個 domain 主要是經過那個人的註冊？那個人的設定內容與哪部機器呢！這個指令也很是好用，例如上面的範例當中，我們可以知道 redhat.com 這部機器的 IP 與註冊的狀態喔！很不錯用吧！ ^_^
進階設定
    還有一些比較進階的內容可以提供給大家做為參考喔！例如子網域的授權問題與架設一個合法的 hostname 機器喔！∼

  • 子網域授權問題：

    好了，那麼萬一我的網路很大，我只負責上層的 DNS 而已，下層希望直接交給各單位的負責人來負責，要怎麼設定呢？舉個例子來說，以成大為例，成大計中僅管理各個系所的的主機 IP 而已，由於各個系所的主機數量可能很大，如果每個人都要請計中來設定，那麼管理員可能會瘋掉，而且在實際設計上也不太人性化。所以囉，計中就將各個 subdomain 的管理權交給各個系所的主機管理員去管理，如此一來，各系所的設定上面會比較靈活，且上層 DNS 主機也不用太麻煩吶！
好了，那麼如何開放子網域授權呢？我這裡僅說明正解的部分，因為在 ISP 方面通常已經幫我們搞定反解了，所以先不理他！而目前我們去註冊的資訊上面，通常僅取得的是正解的設定權，例如我的 vbird.idv.tw 就是一個例子！好了，現在假設在我的 mdk90.vbird.org 上面，要將 win2k.vbird.org 這個子網域切割出去給 win2k.vbird.org 管理，那麼該怎麼辦呢？
    主機 mdk90.vbird.org 的設定部分：
    主機 mdk90.vbird.org 的設定其實很簡單啦！只要將子網域開放出來給別人使用就對了！怎麼設定呢？你可以直接修改 /var/named/named.vbird.org ，使他變成：

    [root @test root]# cd /var/named
    [root @test named]# vi named.vbird.org <==這個檔案名稱是在 /etc/named.conf 裡面設定
    $TTL 600
    @ IN SOA mdk90.vbird.org. root.mdk90.vbird.org. (
    2002120601 ; Serial
    28800 ; Refresh
    14400 ; Retry
    720000 ; Expire
    86400 ) ; minimum
    ; 主機的設定參數部分
    @ IN NS mdk90.vbird.org.
    @ IN MX 10 mdk90.vbird.org.
    mdk90 IN A 192.168.1.2
    mdk90 IN TXT "The testing DNS server"
    phorum.mdk90 IN CNAME mdk90
    www.mdk90 IN CNAME mdk90.vbird.org.
    ; 子網域分割出去給其他主機管理的例子！
    win2k.vbird.org. IN　　　NS　 win2k.vbird.org.
    win2k IN A 192.168.1.100
    ; 本機上面其他主機的設定資訊方面
    winxp IN A 192.168.1.200

    上面的粗體字就是最重要的地方啦！我將 win2k.vbird.org. 這個網域的 NS 權限(name server)轉給 win2k.vbird.org 這部主機來管理，而底下列出來 win2k.vbird.org 這部主機的正解資訊！那麼未來當有人要查詢類似 www.win2k.vbird.org 時，則先會到 mdk90.vbird.org 來查詢，而查到 win2k.vbird.org 的網域，因此就會向下游的 DNS 亦即是 win2k.vbird.org 這部機器查詢了！
    下游主機 win2k.vbird.org 的設定：
    這個設定就簡單啦！直接參考一下我們上面寫的資料，跟著設定，但是你的 domain name 變成 win2k.vbird.org 就是了！簡單的很吶！

  • 架設一個合法授權的 DNS 主機：

    好啦！現在你應該知道什麼是『經上游授權的合法 DNS 主機』了吧？！沒錯！就是上游的 DNS 主機將子網域的查核權開放給你來設定就對啦！嗯！雖然知道原理，但是那麼我要如何來架設一個合法的 DNS 主機呢？好讓我自己管理自己的 domain ！例如我的 vbird.idv.tw 就是 VBird 自己管理的ㄋㄟ∼底下我們就來談一談怎麼設定吧！

    1. 申請一個合法的 domain name ：
      既然是要建立一個合法的 domain name server ，自然就要向合法的 DNS 主機申請授權囉！目前你可以到底下的地方去申請喔！

      • http://www.twnic.net/index3.php

      其實台灣地區的一些 domain 已經不再於 TWNIC 受理了，所以你連上上述的網站之後，可以點選裡頭相關的連結到各大 ISP 去註冊！例如我就註冊了 vbird.idv.tw 這個網域！現在以 Hinet 的註冊做為說明吧！

      • 進入主畫面：直接連結到底下的網頁去：http://nweb.hinet.net/
      • 選擇需要的網域名稱，並查詢該網域是否以存在：因為網域必需是獨一無二的，所以你必需使用該網頁當中提供的查詢功能，去查詢一下你想要的網域是否已經被註冊了呢？一定要沒有被註冊的網域才可以喔！
      • 逐步進行註冊：然後以該網站提供的功能一步一步的往下去進行，例如以我的『個人網址』之註冊為例，按下個人網址之後，會出現流程步驟為：
      • 選擇網站代管或架設 DNS 模式：還記得前面提到的資訊吧？對啦！我們可以直接請 ISP 幫我們設定好 host 對應 IP 就好(最多三部)，當然也可以自行設定一下我們所需要的 DNS 主機啦！因為未來您可能會架設 mail server ，所以還是自行設定 DNS 主機好了！選擇上面圖示的第五項『DNS指定/異動』項目，會出現下面圖示。記得選擇『DNS』及填寫你的 hostname 與正確的 IP 即可喔！注意：要填選這個項目，最好你的 IP 是固定制的，浮動制的 IP 不建議用這個選項！
      • 註冊完畢！

    2. 以 DNS 主機的詳細設定 之設定內容來設定你的主機，請注意，這個情況之下，你只要設定你的註冊的網域的正解即可！反解部分則先不要理會，當然，如果您有辦法的話，最好還是請上層的 ISP 幫你設定囉！

    3. 測試！
    如此一來，你的 DNS 主機上面設定的任何資訊，都可以透過 Internet 上面的任何一部主機來查詢到喔！夠棒吧！心動了嗎？趕快去試看看吧！ ^_^
重點回顧
  • 在 Internet 當中，任何一部合法的主機都具有獨一無二的主機名稱，這個主機名稱包含了 hostname 與 domain name ，並稱為 Fully Qualified Domain Name (FQDN)；
  • 為了克服人類對於 IP 不易記憶的困擾，而有名稱解析器的產生，首先是 /etc/hosts ，而後則是 DNS 系統的產生；
  • DNS 伺服器的類型主要分為 master, slave 以及只進行快取記錄的 cache-only 的 DNS 主機；
  • Internet 上面的主機預設先向 master DNS 查詢資料，而 slave 的主要功能在於『備份 master 的設定資料庫』檔案！並且在 master 掛點時，可做為備援的系統；
  • 目前 Unix Like 的機器當中，都是以 BIND 這個柏克萊大學發展的 DNS 套件；
  • 在 DNS 系統中，正解為由 hostname 找 IP ，而反解則是由 IP 找 hostname ，至於 zone 則是一個或者是部分網域的設定值；
  • bind 的設定檔為 /etc/named.conf ，而 named.conf 可以規範出正反解 zone 的檔案所在；
  • 正解的紀錄(record)主要有：SOA, A, MX, NS, CNAME, TXT 及 HINFO 等；
  • 反解的紀錄主要有： SOA, PTR 等；
  • 在 client 端設定 DNS 查詢順序與相關功能的幾個重要檔案為： /etc/nsswitch.conf, /etc/hosts, /etc/resolv.conf 等；
  • DNS 查詢的指令主要有： host, nslookup, dig, whois 等等；
  • 在載入了 named 這個 daemon 之後，請務必前往 /var/log/messages 察看此 daemon 的成功與否。
本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的，關於 NFS 的考試題庫的地方，只有在 LPI level 1 的 102 ，裡面的 topic 113 Networking Services ，第五點當中，簡易的 DNS 設定。強調的是『應試者需瞭解何謂正、反解、Zone 與 cache-only 的 DNS 主機』至於會考的檔案與指令可能有這些：
  • /etc/hosts
  • /etc/nsswitch.conf
  • /etc/resolv.conf
  • /etc/named.boot(V4)及 /etc/named.conf(V8)
  • named (這個 daemon )
參考資源：
  • BIND 官方網站：http://www.isc.org/products/BIND/
  • Study Area 學習網站：http://www.study-area.org/linux/servers/linux_dns.htm
  • 優客筆記：http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 為何要有 DNS 系統：
    答：
      最主要的功能其實在於 Hostname 對應 IP 的查詢，可以讓我們的電腦連上 Internet 呢！

  • 那麼請教 Unix Like 系統當中，主要使用那個套件做為 DNS 主機的架設，同時，他又是使用那個 daemon 來啟動 DNS 系統？
    答：
      在 Unix Like 系統當中，使用 BIND 這個套件做為 DNS 的架設，至於 daemon 則是使用 named 這個 daemon ！

  • 最早的 Internet 其實是為了政府人員可以連上網路以進行資源的分享，另外，則是電子郵件的使用。而在早期使用的重要檔案只有 /etc/hosts 這個，請教這個 hosts 檔案的內容含有什麼項目？
    答：
      這個檔案的『格式』為 <IP> <主機名稱> <主機別名(aliase)>，而，這個檔案裡面放置了至少一行，也就是：
      127.0.0.1 localhost localhost.localdomain
      另外，也可以將經常連接的主機 IP 與 HOSTNAME 的對應給他寫進來！

  • 請說明 DNS 的三種類型與相關的內容：
    答：
      master, slave 與 cache-only ，slave 主要在於備份， cache-only 僅進行快取的紀錄，本身並無資料庫檔案！更詳細的說明請參考上面。

  • 正解檔案(forward)反解檔案(reverse)與內部迴圈使用的檔案(loopback)主要的紀錄功能為：
    答：
      正解檔在設定 hostname 對應到 IP 的紀錄，主要的紀錄有 A, NS, SOA, MX, CNAME 等等；
      反解檔主要設定 IP 對應到 Hostname 的紀錄，主要的紀錄為 SOA, NS 與 PTR 等。
      內部迴圈則是 localhost 與 127.0.0.1 的對應啦！

  • 在主要的 DNS 設定檔 /etc/named.conf 當中，有一個較為特殊的檔案，他的類型為 hint ，請問這個檔案的功能為何？
    答：
      這個檔案主要是由 rs.internic.net 所下載下來的，主要記錄了 root (.) 這個 zone 的 IP ！可以讓我們的 DNS Server 在找不到資料庫時，可以到這個 root 去查詢資料！

  • 在 client 端搜尋 HOSTNAME 對應到 IP 的查詢時，最重要的檔案，以及該檔案的主要用途為何？
    答：
      /etc/nsswitch.conf ：可以用來設定查詢主機名稱的順序！例如先查詢 /etc/hosts 再查詢 DNS 系統；
      /etc/hosts ：最早的名稱解析器；
      /etc/resolv.conf：這就是 DNS 系統的 resolver (解析器)了。

  • 一般來說，在 Client 端使用的查詢 HOSTNAME 的指令大多使用什麼？
    答：
      nslookup ：可以用來收集一部主機的相關資訊；
      dig：可以用來收集詳細的主機資訊；
      whois ：可以用來收集詳盡的 DNS 主機資訊。
      host 則較為簡單喔！

  • 請問 named 重要的資訊登錄在在那個檔案中？
    答：
      在 /var/log/messages 當中，
簡易 DNS 伺服器設定
2002/12/10：首次完成
2003/03/10：修改部分內容，並且新增 LPI 相關性與重點整理部分！
2002/12/10 以來統計人數


簡易 WWW 伺服器設定
最近更新日期：2003/05/30

我們最常講的『架站』其實就是架設一個 Web 網站啦！那麼什麼是 Web 呢？說穿了，就是全球資訊廣播的意思(World Wide Web)，或者也可以稱之為互連網吧！這個是我們目前的人類最常使用的 Internet 的協定之一啦！通常說的上網就是使用 WWW 來查詢使用者所需要的資訊囉！^_^！目前的 WWW 伺服器主要分為兩大陣營，分別是 Unix-Like 上面的 Apache 與 Windows 上面的 IIS ，就以價格效能比來說，當然是 Linux 上面的 Apache 最棒啦！至於 WWW 伺服器的類型可以分為靜態與動態，而這些動態的網站裡面，很多都是以目前的當紅炸子雞 Linux + Apache + MySQL + PHP 架設而成的，簡稱為 LAMP 的咯！這種動態 WWW 主機很有趣喔！他可以溝通 Server 與 Client 端的資料呢！趕緊來進入這個 LAMP 的世界吧！

原理：什麼是 WWW 與網址( URL )
    ：Client 如何向 Server 要求資料
    ：有哪些類型的 WWW 網站？什麼是 LAMP
    ：SSL 與 CA 的認證機制
套件安裝：RPM 安裝 LAMP 方式
        ：Tarball 安裝 LAMP 方式 ( Apache 2.xx 2002/12/18 前 )
        ：升級與安裝方式的選擇建議
主機設定：1. 基本要求
        ：2. 最簡易 Apache 設定(含關於中文顯示之設定)
        ：3. 啟動 httpd
        ：4. 測試結果
        ：5. 用戶的個人網頁啟動
進階安全設定：1. CGI ( Perl 檔案 ) 之執行、Index 顯示、查無網頁顯示之設定
            ：2. 抵擋 IP 與限制使用者動作的設定(allow, deny, limit)
            ：3. 主機狀態說明網頁設定
            ：4. 關於權限的意義說明與設定
            ：5. 設定認證網頁
            ：6. .htaccess 檔案與 AllowOverride 的用途
            ：7. 防火牆
登錄檔分析與其重要性：
          ：1. syslog 與 logrotate
          ：2. Web Analyser
虛擬主機架設：
客戶端的文字介面 Web 功能：
增強 PHP 程式碼執行速度的模組：
    ：MM Cache
    ：Apache 的效能測試
砍站軟體與 Nimda 病毒的抵擋 scripts：
安裝 phpBB2 討論板：
問題討論：
          ：1. 關於顯示中文的額外說明：
          ：2. 關於無法執行 PHP 的說明：
原理：什麼是 WWW 與網址
WWW 是 World Wide Web 的縮寫，其中， Web 有廣播網的意思存在，所以，簡單的說，WWW就是全球資訊網，可以結合文字、圖形、影像及聲音等多媒體，並透過超連結 ( HyperText ) 的方式，將資訊透過 Internet 傳遞到世界各處！那 WWW 的資料是如何傳遞的呢？
如果你常上網瀏覽的話 ( 不論是使用 Mosilla 、IE 或是 Netscape )，你應該會知道，臺灣有個蠻有名氣的入口網站：奇摩雅虎站 ( tw.yahoo.com )，所以你只要在網址列上面輸入『 http://tw.yahoo.com 』就可以瀏覽到奇摩雅虎的網頁資訊囉！這個『 http://tw.yahoo.com 』就是所謂的 URL ( Uniform Resource Locator ) ，其中 tw.yahoo.com 就是所謂的主機名稱，亦即是我們前面剛剛提過的 DNS 裡頭的 FQDN ( Fully Qualified Domain Name ) ，即是主機名稱加上領域名稱所得的一個獨一無二的 Internet 上面之名字啦！由於電腦在網路裡面僅認識 IP 而已，所以，奇摩雅虎站的真實 IP 就是透過 DNS 解析 tw.yahoo.com 而找到這部電腦，然後經過 WWW 的協定功能將資料傳到你的眼前來！那麼有哪些格式的 URL 呢？呵呵！整個來說，網址列可以輸入這些咚咚：
<協定>://<主機位址>[:port]/<目錄資源>
  • 協定：包括 http, ftp, news, gopher, telnet 這幾種常見的方法！ 其中呢，http 是利用『主機的 http port ，通常為 80 』，至於 ftp 這個方法則是利用『主機的 ftp port ，通常為 21 這個埠口』，請注意喔，我們使用的 80 與 21 都是主機所提供的服務喔！而不是我們 client 端的 port ㄋㄟ，所以，使用 http 與 ftp 連上同一部電腦，所取得的資訊並不見得會一樣，因為服務本身就不同嘛！一個是 WWW 一個是 ftp 怎麼會相同。此外，如果你沒有指定協定的話，那麼預設的協定就需要看客戶端 ( Client ) 使用的那個連線程式的預設協定了！舉個例子來說，如果你是使用 Netscape 的話，呵呵！那麼預設的協定就是 http 囉，因此，你在網址列輸入 tw.yahoo.com 時， Netscape 立刻就會以 http 來連接出去囉！ ^_^；

  • 主機位址：剛剛才提過的 FQDN 應該還沒有忘記吧！由於電腦僅認識 IP ，所以，如果你輸入 IP 的話，同樣的可以連線喔！但是，如果是輸入主機名稱 ( domain name ) 的話，那麼你就必需要讓該主機名稱可以經由轉譯器得到對應的 IP 喔！轉譯器是什麼？就是 /etc/hosts 或者是 /etc/resolv.conf 裡面的設定啊！當然，對外提供正常的 WWW 服務時，你的 host name 就必需要讓大家可以轉譯到 IP ，就需要去申請一個合法的領域名稱囉！ ^_^

  • 目錄資源：其實這個是 Uniform Resource Indicator, URI 的意思，如果你要去的網站網頁在目錄的目錄底下，那麼你可以直接輸入目錄與網頁的名稱，就可以直接取得那個頁面的資料囉！此外，如果你只輸入網址而已呢？並沒有輸入網頁名稱呢？那麼在 Server 端將會自動的判斷 ( 看 Server 自己的設定而定 ) 該目錄下是否有設定中引用的網頁名稱囉！這個在底下我們會再次的提到喔！

  • :port：一般而言，各個協定都有其獨特的使用的 port ，例如眾所皆知的 http 使用的是 80 而 ftp 使用的是 21 這些個 port，所以，當你要連接到某個網站時，輸入 http://that.host.name 就會主動的利用 80 那個 port 來嘗試連接到對方主機！但是如果你不想要使用該 port 呢？舉個例子來說，假如你的網站使用的是 8080 這個 port 來進行 WWW 的服務，果真如此的話，那麼除非你有進行防火牆內的 port 對應，否則直接在網址列輸入 http://your.host.name 結果將無法連接到你的 WWW 伺服器，因為他會主動的連接到 80 那個 port 吶！所以，我們就要告訴瀏覽器，要向 Server 要求服務的是哪一個 port ，因此，你就要將他寫成： http://your.host.name:8080！才可以連接到對方的 8080 那個 port 喔！
舉個例子來說，我們通常去到中山大學的 FTP 網站都是以 Web 介面進入的，因為可以直接以瀏覽與搜尋的功能去捉取資料，因此，這個時候我們可以在網址列輸入：『 http://ftp.nsysu.edu.tw 』以進入 WWW 介面的 FTP 網站！請注意，是 WWW 介面喔！那麼如果我想要直接以 FTP 的模式來進行資料的瀏覽與傳輸呢？呵呵！直接在網址列輸入以 ftp 為方法的網址：『 ftp://ftp.nsysu.edu.tw 』呵呵！是否發現兩者顯示的咚咚不太相同？！沒錯啦！那就是因為我們所連接的主機的協定不一樣的緣故，所以主機回應的資料當然就不同啦！請特別留意這種網址列的格式喔！
Client 如何向 Server 要求資料：
那麼 WWW 是透過什麼樣的協定來傳達資料的呢？呵呵！沒有看到網址列的 http 嗎？對啦！ WWW 就是使用所謂的 http 這個協定來傳送資料的，HTTP 即是 HyperText Transfer Protocol 的簡寫，亦即是目前 WWW 的資料傳遞主流協定啦！而在網站上面供人瀏覽的網頁，則大部分需要符合 HyperText Markup Language (HTML) 的語法囉！也就是說，當我們在網址列輸入主機的網址之後：
  1. Client 端先經過 DNS 解析得到 WWW 主機的 IP ，然後會發出一個資料封包，以 http 這個協定( 或方法 )聯繫到 WWW 主機，告知 WWW 主機我們要以 http 的方法來取得資料，同時，這個時候使用的是 TCP 協定，亦即需要經過三向交握的過程喔；
  2. WWW 主機收到這個資料封包之後，會根據 Client 端的要求，提供相關的訊息來回應，大部分的情況下皆是使用 http 的協定傳送具有 HTML 語法的網頁資料到 Client 端的瀏覽器上；
  3. 最後 Client 端的瀏覽器將 HTML 的語法經過解析後，以相關的畫面來顯示到螢幕上，提供用戶來觀賞喔！
這就是主要的流程啦，不過，Client 傳到到 WWW 主機，與 WWW 主機回應的訊息裡面，可包含有哪些可能的動作呢？
  • GET：這是最常見的，就是 Client 端向WWW 主機要求的資源，也可以看成 Client 端向主機取得的資料；
  • HEAD：主機端回應給 Client 端的一些資料檔頭而已；
  • POST：Client 端傳送到 WWW 主機端的資料；
  • OPTIONS：主機端回應給 Client 端的一些允許的功能與方法；
  • DELETE：刪除某些資源的舉動。
大致上就有這些功能，當然啦，最主要的就是 GET 這個功能啦！畢竟我們連上 WWW 主機就是為了要取得他的資料嘛！ ^_^。要記住的是，因為未來我們可能會去分析網站上的資料，所以，你必需要瞭解一下什麼是 GET 或 HEAD 等等的意思！不然很多東西很難理解喔！ ^_^
有哪些類型的 WWW 網站？什麼是 LAMP？
剛剛前頭我們提到的都是關於 Client 端相對於 Server 端求取資料方面的問題，那麼再來要談的，是『咦！到底有哪些主要的 WWW 主機作業系統與軟體之搭配呢？』呵呵！問的好！在回答這樣的問題之前，我們先來討論一下， WWW 主機的主要類型好了。基本的類型我們可以分為兩種：
  • 僅提供使用者瀏覽的網站：這種類型的網站大多是提供『靜態』的網頁，或許有提供一些動畫圖示，但基本上就僅止於此啦！因為他僅提供你來瀏覽，不需要與 Client 端互動，所以你可以到該網站上去瀏覽，但是無法進行進行資料的上傳喔！目前主要的免費虛擬主機大多是這種類型，所以，你只要依照 HTML 的語法寫好你的網頁，並且上傳到該網站空間上，那麼你的資料就可以讓大家瀏覽了！
  • 提供與使用者互動介面的資料庫網站：這類型的網站可就多采多姿啦！因為他提供了與使用者互動的資料庫軟體，因此，使用者可以依據主機提供的服務，來進行留言、資料上傳、存取的服務。由於 Server 與 Client 是互動的，因此一個介面良好的『資料庫軟體』就相當的重要！因為他可以即時線上來更新使用者所傳遞的資料訊息！這方面的網站例如最簡單的留言版、討論區、phpBB 架站論壇、phpnuke 架站論壇、金流與物流的商業型網站等等，都是屬於這種互動類型的主機喔！
呵呵！這麼看起來的話，似乎動態網頁比較精彩喔！因為他可以跟使用者互動，也就更增加 WWW 主機的可變性與靈活運用之性質！所以囉，有辦法的話，當然是選擇動態網站的 WWW 主機架設比較好囉！那麼動態網頁的 WWW 主機需要些什麼呢？就如同剛剛我們提到的，最重要的是那個可以隨時更新資料的『資料庫軟體』所提供的資訊，來與使用者互動，因此，一定要有資料庫軟體喔！再來，只有資料庫，沒有存取介面來溝通 Server 與 Client 端的資料傳遞當然還是無法直接在 Web 介面上面存取資料庫的內容啦！因此，我們還需要一個『網頁程式語言』來進行這個介面的編寫哩！當然啦，最主要的還有就是需要 WWW 運作的軟體啦！所以你需要：
  • WWW 運作的主要軟體：(目前有 Apache 與 IIS 兩大系統)
  • 資料庫軟體：(例如 MySQL, MS 的 SQL, 及其他相關的資料庫)
  • 編寫網頁的網頁語言：(例如 shell scripts, perl scripts, Java, PHP CGI 等等)
那目前有哪些主流的個人動態 WWW 主機系統呢？大致上可以分為兩種：一種是 Windows 系統的 IIS + MS 的 SQL + ASP WWW伺服器，這種 WWW 主機架設上蠻容易的，不過由於 Windows 的某些特性，所以很容易被 Cracker 所破壞；另外一種則是 Linux 系統上面的 Apache + MySQL + PHP 的 WWW 伺服器 ( 簡稱 LAMP ) ，這種伺服器架設上有一定程度的困難度，尤其在升級與維護的方面，但是運作妥當的話，他的硬體要求、性能、安全性等方面，則相對的較佳喔！我們這裡本來就是練習 Linux 的嘛！因此底下鳥哥將針對 Linux 系統上面的動態 WWW 主機進行介紹，當然啦，主角是 WWW 套件的 Apache 啦！至於需要瞭解的是 PHP 與 MySQL 分別是兩個獨立於 Apache 的套件，因此要讓 Apache 這個 WWW 軟體能夠啟用 PHP 與 MySQL 的功能，就必需要啟動 Apache 裡面的 PHP 與 MySQL 的模組啦！首先，不能免俗的，我們還是得分別介紹一下 LAMP 裡面各個小東西的說明：
  • Apache ：在 1995 年之前就有蠻多的 Web 架設伺服器軟體的出現，不過，真正到了 1995 年之後，由國際超級電腦應用中心 ( National Center for Supercomputing Applications, NCSA ) 主導並克服了一些 Web 主機的臭蟲之後，才讓這個 http 協定的 WWW 套件得到了更廣泛的應用！而因為這個釋出的版本是來自於一些臭蟲的克服，因此，這個 WWW 套件被戲稱為『 A patchy server 』，意思就是說，一個經過更新後的 Server 的意思！後來，因為要將名字確定下來，乾脆就直接取其諧音，用『 Apache 』，這也就是我們要介紹的 WWW 軟體啦！
  • PHP：官方的說法為：『PHP is a tool that lets you create dynamic web pages. PHP-enabled web pages are treated just like regular HTML pages and you can create and edit them the same way you normally create regular HTML pages.』所以說， PHP 可簡單的視為一種程式語言，可以用來設計留言版、討論區、或聊天室等等的動態網頁的咚咚！由於他具有免費、跨平台、易學及效率高等等的優點，目前算是很盛行的一種設計網頁的咚咚啦！ ( 基本上，PHP是使用來設計網頁的程式語言，當然其功能不只如此！你可以輕易的在市面上找到相關的書籍喔 )
  • MySQL：將官方網站上的翻譯文件中這麼說：『MySQL是一個真正的多使用者、多執行緒SQL資料庫伺服器。SQL（結構化查詢語言）是世界上最流行的和標準化的資料庫語言。MySQL是以一個客戶機/伺服器結構的實現，它由一個伺服器背景執行程式mysqld和很多不同的客戶程式和庫組成。SQL是一種標準化的語言，它使得儲存、更新和存取資訊更容易。例如，你能用SQL語言為一個網站檢索產品資訊及儲存顧客資訊，同時MySQL也足夠快和靈活以允許你儲存記錄文件和圖像。MySQL 主要目標是快速、健壯和易用。』簡單一點來說，這個東西就是一個資料庫軟體啦！例如：你在設計討論區的時候，由於討論的文章會日漸增多，因此就會有所謂的資料庫處理的情況，MySQL 的目的就是在處理你這些由用戶端傳送來的資料。當然，其功能還不只此，我這裡僅說一些我們可能用的到的咚咚！
SSL 與 CA 的認證機制：
我們在前頭有提過關於 HTTP 使用在傳輸上面的協定仍然是以 TCP/IP 為準，他傳輸的時候是使用明碼來傳送的，也就是說，在 Internet 上面流竄的 WWW 資料，基本上，都是以沒有加密過的形式在傳送資料！那麼，當有些有心人士，利用 TCP Listen 的功能，即可將 Internet 上面的資料封包捉下來進行解析，並可能進一步取得該資料封包內的資訊！『嗄！這有什麼了不起，不過就是 WWW 資訊而已，又不像 SSH 這種遠端連線伺服器的重要！』嘿嘿！這您可就有所不知了。要曉得的是，我們的網站並不涉及金流及物流的資訊，所以當然沒有什麼『隱密性』可言，但是，如果今天換成是一個交易網站呢？例如網路書店的信用卡交易，例如一些金融公司提供的網路交易行為！這些訊息當中，很多都是含有相當重要的私人訊息ㄋㄟ∼例如信用卡、身份證等待表個人的證號。萬一被人擷取，呵呵！那可不是鬧著玩的！所以囉，這個時候就需要有『資料加密』的動作了！目前用在 WWW 上面的主要加密功能，有 Secure Socket Layer ( SSL ) 及 Certificate Authorities ( CA )兩個主要的模式。
Secure Socket Layer ( SSL )
不曉得您是否還記得我們在 遠端連線伺服器 裡面提到的關於 SSH 這個伺服器的連線過程！？也就是利用 Server 提供的 Public Key 並配合 Client 端隨機產生的 Private Key 來組成一組加密( Public Key )與解密( Private Key )的方法！呵呵！這個方法同樣的也被運用於 WWW 主機的設定啦！而支援這個 WWW 主機進行 Public 與 Private 加密的套件，就是很多時候都被拿出來使用的 OpenSSL 這個好傢伙了！所以囉，要讓你的 WWW 具有 SSL 加密的功能，就必需要安裝 OpenSSL 這個套件才成吶！基本上，當 Client 端要向 Server 端求取資料的時候，則利用 Server 端本身提供的 Public Key 及 Client 端隨機產生的 Private Key 組成一組可供利用的密碼組合！則資料由 Server 傳送到 Client 端之前，會先經由 Server 的 Public Key 將資料封包加密，而到了 Client 之後，才經由 Private Key 將資料解密！所以，當資料在 Internet 上面跑時，他是加密過的資料封包喔！即使被人劫取下來，他不曉得 Public 與 Private ，那麼要解密可能也得費上幾天幾夜，甚至是好幾年的功夫ㄋㄟ！因此，資料就會比較安全啦！當然啦，以我們這種主要以分享為主的網站，自然不需要使用這種技術！反正資料本來就是 Open 的！ ^_^
Cerificate Authorities ( CA )
CA 這個方法同樣也是使用 Public 與 Private Key 的方式， ( 呵呵！我們可以說，目前加密與解密的行為大部分都是使用這種類似的觀念來進行的啦！ ) 由於 SSL 使用的 Public 是 WWW Server 自行建立與產生的，所以具不具有公信力我們還不是很清楚！萬一你連上去的 WWW 網站是個騙人的集團建立的，那麼有沒有加密對你而言，不都是粉危險的嗎？咦！那麼是否可以透過第三公證人來查驗這個 Server 的 Public Key 呢？呵呵！ CA 這個方法就是要達成這個目的啦！基本上， CA 是一個公認的合法組織，他可以用來查驗 WWW Server 提供的 Public Key 是否合法！以保障 Client 者的權益。因此， CA 是要錢的喔！
我們這裡對於 SSL 及 CA 這兩個咚咚僅提及他的概念，底下的文章並沒有提到要怎麼製作！有興趣的朋友得自行到相關的網站去查詢喔：
  • SSL ： http://www.modssl.org/
  • CA 組織之一：https://digitalid.verisign.com/server/apacheNotice.htm
套件安裝：
好了，終於提到了我們要安裝的 LAMP 的地方啦！如何安裝 LAMP 呢？基本上仍然是有兩種方式的，一個是 RPM 另一個就是 Tarball 啦！詳細的觀念請參考 RPM 與 Tarball 這篇文章吧！請仔細的閱讀喔！因為兩種方法安裝上的難易度差異性很大，而且眾所皆知的， RPM 的檔案與 (1)Linux 發行廠商與版本 (2)及其他相依套件 之間有很大的相依性，所以你不能隨便的拿網路上得到的 RPM 檔案來安裝！但是 Tarball 又很難安裝完整！唉∼真是兩難！底下我們分別以 RPM 與 Tarball 的安裝來說明！此外，因為目前的主流 RPM 檔案還是以提供 Apache 1.3.xx 版為準，所以我們以 Mandrake 9.0 的 Apache + MySQL 與 PHP 來安裝，至於 Tarball 的方式，則都以最新的 Apache + MySQL 及 PHP ( 2002/12/18 )來安裝啦！如果您還是希望以 Apache 1.3.xx 版本來安裝您的 LAMP 時，那麼請參考這篇： LAMP 的安裝方法。底下的安裝方式僅適合 Apache 2.xx 版喔！不要搞錯囉！ ^_^
RPM 安裝 LAMP 方式：以 Mandrake 9.0 為例
既然要安裝 LAMP 自然需要 Linux 系統，以及 Apache, MySQL 及 PHP 囉！我們以 Mandrake 9.0 提供的作業系統，及預設的相關檔案來安裝起所需要的套件！需要的套件至少有：
  • 相關的函式庫安裝：
    • libmm1-1.1.3-10mdk.i586.rpm
    • libmm1-devel-1.1.3-10mdk.i586.rpm
    • libmm1-static-devel-1.1.3-10mdk.i586.rpm
  • PHP 安裝：
    • php-common-4.2.3-1mdk.i586.rpm
    • php-4.2.3-1mdk.i586.rpm
    • php-devel-4.2.3-1mdk.i586.rpm
    • php-imap-4.2.3-1mdk.i586.rpm
    • t1lib1-1.3.1-6mdk.i586.rpm
    • php-gd-4.2.3-1mdk.i586.rpm
  • MySQL 安裝：
    • libmysql10-3.23.52-1mdk.i586.rpm
    • MySQL-client-3.23.52-1mdk.i586.rpm
    • MySQL-3.23.52-1mdk.i586.rpm
    • php-mysql-4.2.3-1mdk.i586.rpm
  • Apache 安裝：
    • apache-common-1.3.26-6mdk.i586.rpm
    • apache-conf-1.3.26-3mdk.i586.rpm
    • apache-modules-1.3.26-6mdk.i586.rpm
    • apache-1.3.26-6mdk.i586.rpm
    • apache-manual-1.3.26-6mdk.i586.rpm
    • libgdbm2-devel-1.8.0-18mdk.i586.rpm
    • libdbtcl3.3-3.3.11-11mdk.i586.rpm
    • libdb3.3-devel-3.3.11-11mdk.i586.rpm
    • db1-devel-1.85-8mdk.i586.rpm
    • apache-devel-1.3.26-6mdk.i586.rpm
    • mod_php-4.2.3-1mdk.i586.rpm
    • mod_perl-common-1.3.26_1.27-7mdk.i586.rpm
    • apache-mod_perl-1.3.26_1.27-7mdk.i586.rpm
檔案可不少哪！所以需要好好的選擇來安裝才行！『請依照上面的順序一個一個的安裝下去吧！』
鳥哥的特別告知：特別注意到，這裡是以 Mandrake 9.0 做為介紹的，如果您不是以這個版本來安裝你的 Linux 系統的話，那麼在檔案的名稱上面可能會有一點點的不同！不過不要緊啦！因為你可以使用：
  1. 直接 mount 你的 CDROM ，不會 mount 我可是會 K 人的喔！ ^_^：例如『mount -t iso9660 /dev/cdrom /mnt/cdrom 』；
  2. 然後以 find 搭配 grep 來找出相關的 php, apache, 或 mysql 的字眼，注意到， mysql 有時候會有大寫，有的套件僅要小寫即可！都不太一樣啦：例如『 find /mnt/cdrom -type f | grep php 』將資料都給他找出來啦！
  3. 最後就一個一個的裝上去，不過，這裡會出現很多的問題，那就是各個套件的屬性相依的問題啦！這個時候怎麼辦呢？沒辦法啦，就只有將需要的相依屬性的檔案一個一個的裝上去囉！還要再找出來其他的檔案來裝的意思啦！ @_@
這裡不談完全的安裝，我們僅安裝可以讓 Apache 跑 MySQL 及 PHP 等基本的套件，不玩 LDAP 及其他的咚咚！等到您對於 Apache 有一定的概念之後，自然就可以針對你希望的模組來加以設計了！ ^_^其中，最重要的是 mod_php 喔！如果你沒有安裝下去的話，那麼很可能會造成 apache 無法執行 PHP 的困擾喔！OK！這樣就安裝完畢了！如果你不想要使用 Tarball 安裝的話，可以跳到 主機設定 去瞧一瞧設定的步驟囉！
關於 Apache 的路徑問題：
那麼我怎麼知道我目前的 WWW 主機的首頁，以及設定檔在哪裡呢？基本上，如果是以 RPM 的方式來安裝的，你可以在底下發現相對應的檔案與其功能：
  • /etc/httpd ： 關於 httpd 設定的檔案、相關功能的模組等等放置的目錄，基本上，主要設定檔為 /etc/httpd/conf/httpd.conf 這一個；
  • /usr/bin ： apache 會將很多的程式放置在這個目錄當中；
  • /var/www/html ： 這個是目前 1.3.xx 版本中，預設做為首頁的路徑；
  • /var/www/icons ： 儲存很多的小圖案，可做為預設的小圖案之用喔！
  • /var/www/cgi-bin ： 可以用來放置以 CGI 語法寫成的網頁資料，因為他必需要可以執行，所以特別定義出一個目錄來放置這方面的檔案，集中管理比較好啦！
  • /var/log/httpd ： 這是登錄檔放置的目錄！
特別注意到，設定檔通常放置在 /etc/httpd 這個目錄中，而 RPM 的啟動 script 是在 /etc/rc.d/init.d/httpd 這個檔案喔！不要與底下的檔案搞混了！ @_@
關於 MySQL 的路徑問題：
MySQL 是資料庫軟體呀！所以最重要的當然就是他的資料庫放置的目錄囉！呵呵！答對了！那麼這個資料庫放在哪裡呢？預設是在/var/lib/mysql 裡面的！所以如果你有使用 MySQL 做為你的網頁或者是論壇的話，那麼請將這個目錄的咚咚備份下來吧！很重要的喔！
關於 PHP 的模組問題：
一般而言，我們大多以『動態函式庫』的方式來進行 PHP 的模組編譯的！最大的優點就是可以在升級的時候，只要直接升級 PHP 即可！與 Apache 的相關性就比較小一點，因此，在升級某個套件的時候，不需要全部的套件都一起升級的啦！這樣真的是比較簡單喔！
Tarball 安裝 LAMP 方式 ( Apache 2.xx 2002/12/18 前 )
Tarball 的安裝方式方面，我們選擇最新的套件來安裝，如果您想要安裝舊版的 1.3.xx 的 Apache 時，請參考 LAMP 的安裝方法 一文。
  • 下載各個套件：
要架設這樣的一個主機需要哪些套件呢？不就是： Apache、MySQL及 PHP 囉！要從何處下載呢？你可以到中山大學的 FTP 站去搜尋，因為他提供的介面鳥哥真是蠻喜歡的，而且也真的很實用喔！尋找檔案快又正確！
  • 中山大學 FTP 站
當然，你也可以到各個套件的發展處去下載：
  • Apache：目前 Apache 已經出到了 2.0.X版，但是最廣泛使用的還是屬於 1.3.X 版本。你可以上 Apache 主網頁去看看相關的資訊：
    • Apache 主頁 ( 英文 )：
    • Apache 套件 ( 由主頁下載 )：
    • 台灣的映射站台：
  • PHP：目前最新的是 4.2.3 版 ( 2002/12/18 ) ，你可以上 php 的主網頁去看看一些相關的咚咚喔！
    • PHP 主頁 ( 英文 )：
    • PHP 主頁下載：
    • 台灣映射站台：
  • MySQL：目前最新的版本是 3.23.54，同樣的，你也可以上 MySQL 官方網頁去看看喔！
    • MySQL 主頁 ( 英文 )：
    • MySQL 主頁下載：
    • 台灣映設站台：
也就是說，我們需要的檔案有三個，分別是：
  • httpd-2.0.43.tar.gz
  • mysql-3.23.54a-pc-linux-i686.tar.gz
  • php-4.2.3.tar.gz
  • 依序安裝：
還記得我們在 Tarball 與 RPM 一文裡面提到的 Tarball 的安裝方法嗎？沒錯！基本上，就是幾個步驟而已：
  • ./config ( 或 ./configuration ) 建立 Makefile
  • make 開始編譯
  • make install 開始安裝到設定的目錄去
大致上只有這樣而已ㄋㄟ！簡單吧！但是 Apache 的安裝方法卻不太簡單！ Why ？？這是因為他還需要支援 PHP 這個玩意兒！所以就顯的特別的麻煩∼不過，現在有比較簡單的方式了！呵呵！就是使用 Dynamic library 的方式 ( 動態函式庫 ) 來安裝 PHP ，哈哈！那麼就不需要將他 compile 到 apache 裡面去，而可以將他視作一個獨立的模組！如此一來， PHP 的升級與安裝就顯的很簡單囉！不過，由於動態函式庫的安裝雖然有好處，然而缺點就是....你的模組路徑不能夠隨便亂擺！好在我們很少將編譯好的模組隨便移動的∼呵呵！所以請注意：底下我們將 PHP 以『動態函式庫』的形式來安裝。
  1. 先安裝最簡單的 MySQL ：
    為什麼說 MySQL 最簡單呢？這是因為在 官方網站 上面提到了一個問題，也就是使用 source code ( Tarball ) 的方式來編譯時，如果您的 compiler ( GCC ) 版本高於 2.96 時，那麼您所編譯出來的 MySQL 程式，『有可能』會有資料庫突然死掉的情況發生！因此， MySQL 的官方網站上面『建議』在目前的版本當中，最好直接以他們編譯好的 MySQL 的 binary 版本來進行安裝的動作！因為他已經幫你編譯好了啊！所以，我們就不需要 make 囉！因此就變的很簡單啦！此外，如果你的 Linux 版本中，你的 GCC 大於 2.96 時，且你使用的就是該 Linux 版本提供的 MySQL 時，官方網站上面，亦建議你直接將該 MySQL 移除，然後以他們的版本來安裝，會比較沒有問題啦！看來我們可能也需要升級一下 MySQL 啦！( 無論如何， MySQL 僅是提出『有網友回報出有這個問題』，所以，如果您的 MySQL 向來就沒有問題，那麼就不用理會這個困擾了！)

    另外，我怎麼知道我目前的 GCC 版本呢？可以這樣做：

    1. 查詢可以使用：
    [root @test root]# rpm -qa | grep gcc
    libgcc1-3.2-1mdk
    gcc-cpp-3.2-1mdk
    gcc-3.2-1mdk
    gcc-c++-3.2-1mdk

    2. 移除可以使用：
    [root @test root]# rpm -e MySQL

    如果還不會使用 RPM ，那麼就不要玩架站吧！說過好多次囉！ ^_^！上面的結果就顯示我的 gcc 是 3.2 版，哇！太新了！比 2.96 版要更新的多！那麼照 MySQL 官方網站的建議，還是置換成舊版本會比較好ㄋㄟ！如果要移除的話，那麼就使用 -e 的參數來移除吧！( 註：還是那句老話，請特別留意你的每個動作代表的意義，尤其是如果您的 MySQL 已經運作了一段時間了，請將 /var/lib/mysql 這個目錄內的所有資料備份下來！ ) 好了！假設我已經將 mysql-3.23.54a-pc-linux-i686.tar.gz 這個檔案捉下來了，那麼要如何安裝呢？假設該檔案在 /root 底下時：

    0. 查詢是否已經有 mysql 的帳號：
    [root @test root]# grep mysql /etc/passwd
    如果沒有 mysql 出現的話，那麼請建立一個名為 mysql 的帳號！
    這個是要給 MySQL 的 Process 使用的！為了安全性，請務必建立！
    如果之前已經建立過了，那麼底下這一步建置的工作就可以跳過，
    直接到 1. 解壓縮與建立連結去安裝囉！

    [root @test root]# groupadd -g 315 mysql
    因為我剛好沒有 315 這個 GID ，而 mysql 是系統使用的帳號，我希望他在 500 以內，
    因此就選擇 315 做為 mysql 的 gid 囉！你當然可以變更這個數字，
    使用小於 500 的 GID 做為系統的帳號之用只是慣用的習慣而已啦！ ^_^

    [root @test root]# useradd -u 315 -g mysql -d /usr/local/mysql/data -M mysql
    我使用 315 做為 mysql 這個帳號(與群組同名！)的 UID 啦！
    並且建立他的家目錄在 /usr/local/mysql/data 裡面！

    1. 解壓縮與建立連結：
    [root @test root]# cd /usr/local <==因為已經是 binary 的套件，不用 make ！
    [root @test local]# tar -zxvf /root/mysql-3.23.54a-pc-linux-i686.tar.gz
    ...(訊息略過)....
    最後會產生一個目錄： mysql-3.23.54a-pc-linux-i686

    [root @test local]# ln -s mysql-3.23.54a-pc-linux-i686 mysql
    通常習慣將 MySQL 安裝在 /usr/local/mysql 當中！但為了未來升級版本的確認，
    官方網站上面建議使用連結的方式來進行 MySQL 的使用！

    3. 建立資料庫：
    [root @test local]# cd mysql
    [root @test mysql]# ./scripts/mysql_install_db
    這個步驟會在 /usr/local/mysql/data 裡面建立好 MySQL 的資料庫！
    由於 /usr/local/mysql/data 是 MySQL 的資料庫目錄，所以很重要喔！請多加備份！

    4. 檔案權限修正：
    [root @test mysql]# chown -R root:mysql /usr/local/mysql-3.23*
    [root @test mysql]# chown -R mysql:mysql /usr/local/mysql/data
    修改成較為安全，且資料庫所屬人為 mysql 喔！特別留意啦！

    5. 啟動測試：
    [root @test mysql]# /usr/local/mysql/bin/safe_mysqld --user=mysql &
    Starting mysqld daemon with databases from /usr/local/mysql/data
    [root @test mysql]# netstat -tl | grep mysql
    tcp 0 0 *:mysql *:* LISTEN
    [root @test mysql]# ps -aux | grep mysql
    mysql 6394 0.0 1.5 10528 992 pts/3 S 16:16 0:00 /usr/local/mysql/
    mysql 6395 0.0 1.5 10528 992 pts/3 S 16:16 0:00 /usr/local/mysql/
    mysql 6396 0.0 1.5 10528 992 pts/3 S 16:16 0:00 /usr/local/mysql/
    root 6422 0.0 1.1 2408 732 pts/3 S 16:20 0:00 grep mysql
    呵呵！這樣就應該是搞定了！ MySQL 已經在監聽要求囉！而且所有人為 mysql ！

    6. 開機後立即啟動！
    [root @test mysql]# vi /etc/rc.d/rc.local
    將底下這一行加入這個檔案的最後面一行喔！
    cd /usr/local/mysql; /usr/local/mysql/bin/safe_mysqld --user=mysql &
    這樣一來，每次開機就可以自動的啟動 MySQL 囉！
    註：由於很多網友回覆之問題中發現，如果沒有加上 cd /usr/local/mysql 時，
    會導致無法自動於開機的時候啟動，因此，請大家記得加上這個動作呢！

    7. 進階設定內容：
    由於我們 MySQL 放置的地點在 /usr/local/mysql 內，這個目錄並不在 PATH 當中！
    且 man page 亦不在 MANPATH 裡面，所以，我們要手動的幫他加入囉！

    [root @test mysql]# vi /etc/profile
    大約在 33 行的地方，而且每個 distribution 設定的地方都不太相同！
    請找到 export PATH ... 那一行，以 Mandrake 9.0 來說，大概在 33 行左右，
    新加入一行：
    PATH="$PATH":/usr/local/mysql/bin
    export PATH ....(略)....

    [root @test mysql]# vi /etc/man.config( 有的 distribution 為 /etc/man.conf )
    可以在這個檔案的任何地方加入底下這一行：
    MANPATH /usr/local/mysql/man
    就可以具有 man page 的能力了！

    8. 建立 MySQL 的 root 帳號密碼！
    [root @test mysql]# /usr/local/mysql/bin/mysqladmin -u root password 'your.password'
    請建立密碼！為了安全起見！否則你的 MySQL 資料庫，將預設所有人都可以登入喔！
    [root @test mysql]# /usr/local/mysql/bin/mysql -u root -p
    Enter password: <==這裡輸入你剛剛建立的那個密碼喔！
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 2 to server version: 3.23.54

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> exit
    Bye

    這樣就是可以確認已經可以連接到你的 MySQL 資料庫了！請特別留意，有的朋友沒有移除
    RPM 的 MySQL 時，那麼您可能會有兩個 mysql 的執行程式，一個在 /usr/bin/mysql ，
    一個在 /usr/local/mysql/bin 裡面，不要使用錯檔案，否則可能會顯示如下的錯誤訊息：
    ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有這幾個步驟就 OK 啦！您的 MySQL 已經建立了，而且管理者的帳號 root 也已經建立的密碼啦！請特別留意的是，這個 root 是 MySQL 的帳號，與 Linux 在 /etc/passwd 裡面的 root 是完全沒有關係的喔！因為 MySQL 只是 Linux 裡面的一個軟體，任何 Linux 裡面的使用者，只要知道 MySQL 的 root 密碼，就可以使用 MySQL 的 root 功能！ 此外，特別需要留意的還有，由於我們使用的是 Tarball 的方式來安裝的 MySQL ，所以我們的 data directory 會是擺在 /usr/local/mysql/data 當中！因此，有必要針對這個目錄進行『備份』的工作！千萬不要大意備份的舉動喔！

  2. 再安裝需要編譯的新版 Apache 2.xx ：
    因為目前有所謂的這個動態函式庫，因此，我們在安裝 Apache 的時候，請特別要『向 Apache 宣告 PHP 模組使用動態函式庫的模式』來進行 PHP 的執行！這個時候，你可以這樣的來安裝你的 Apache 喔！

    0. 解壓縮：
    [root @test root]# cd /usr/local/src
    [root @test src]# tar -zxvf /root/httpd-2.0.43.tar.gz
    .....(訊息略)....
    最後會產生一個 /usr/local/src/httpd-2.0.43 的目錄

    1. 搜尋設定內容：
    [root @test src]# cd httpd-2.0.43
    [root @test httpd-2.0.43]# ./configure --prefix=/usr/local/apache2 \
    > --enable-so --enable-rewrite
    上面請特別注意到：
    --prefix=/安裝的路徑：這個項目在設定未來你的 Apache 安裝在那個目錄當中？！
    --enable-so 　　　　：這個項目則是在宣告使用動態函式庫啦！特別重要！
    --enable-rewrite　　：這個項目只是預防用的！可以先設定，不過不一定會用到！
    其他的額外項目請使用 ./configure --help 來察看吧！
    按下 Enter 之後，會開始偵測你的主機內容！如果發生找不到 gcc 或 cc ，
    那麼肯定就是沒有安裝 make 或一些編譯軟體！請自行再加以安裝吧！

    2. 開始編譯與安裝：
    [root @test httpd-2.0.43]# make; make install
    如果沒有錯誤的話，那麼在 /usr/local/apache2 這個目錄當中就已經將你的 Apache 安裝了

    [root @test httpd-2.0.43]# cd /usr/local/apache2
    [root @test apache2]# ls -l
    bin/　　　　　：預設的 Apache 所有執行檔案的放置目錄
    build/　　　　：一些編譯過程中安裝好的咚咚
    cgi-bin/　　　：預設的可以執行 CGI 的目錄！！粉重要！
    conf/　　　　：預設的 Apache 的參數檔放置的目錄！！粉重要！！
    error/　　　　：當使用者連上 server 有問題時，顯示的錯誤網頁在這裡提供！
    htdocs/　　　：這個就是預設的主機的主頁！！粉重要！
    icons/　　　　：預設的一些小圖示 ( icon ) 放置的目錄
    include/　　　：其他一些 Apache 相關的函式庫放置的目錄
    lib/　　　　　：其他函式庫放置的目錄
    logs/　　　　：登錄訊息檔案放置的目錄喔！
    man/　　　　　：這個就是 man page 放置的目錄
    manual/　　　：使用說明喔！
    modules/　　　：其他 Apache 使用的模組放置的目錄！

    3. 做個簡易的修改：
       奇怪的很，在 httpd.conf 這個 Apache 的設定檔當中，竟然啟用的 User
       與 Group 有點怪怪的，所以這個時候我們必須要修正一下這個項目啦！
    [root @test httpd-2.0.43]# vi /usr/local/apache2/conf/httpd.conf
    找到底下這兩行：
    User nobody
    Group #-1
    粉奇怪吧！竟然是 #-1 那！而且 nobody 也不見得每部機器上面都有這個
    系統帳號，請查出您的 /etc/passwd 裡面，是否有 nobody 這個帳號，如果
    沒有 nobody 這個帳號，可以使用 useradd -r nobody 來新增系統帳號。同時，
    查看一下您的 /etc/group 裡面是否有 nobody 或者是 nogroup 的存在？
    通常 Mandrake 會存在 nogroup 這個群組，至於 Red Hat 則會有 nobody 這個群組，
    所以將上面兩的項目改成底下的模樣吧！
    User nobody
    Group nogroup
    然後儲存後離開！

    4. 確定啟動狀態：
    [root @test httpd-2.0.43]# /usr/local/apache2/bin/apachectl start
    [root @test httpd-2.0.43]# netstat -utl
    tcp 0 0 *:http *:* LISTEN
    呵呵！看到上面這行就表示您的 Apache 已經啟動囉！當然啦！
    有的人會看到的是：
    tcp 0 0 *:www *:* LISTEN
    daemon 的名字會依照 /etc/services 而變呢！
    而那個 apachectl 檔案，就是啟動的 scripts 啦！若要開機時啟動 apache ，
    那麼將 /usr/local/apache2/bin/apachectl start 放在 /etc/rc.d/rc.local 內吧！

    5. 進階設定：
    [root @test httpd-2.0.43]# vi /etc/profile
    將剛剛我們上面 MySQL 時新增的一行，重新再改為如下所示：
    PATH="$PATH":/usr/local/mysql/bin:/usr/local/apache2/bin

    [root @test httpd-2.0.43]# vi /etc/man.config
    再新加一行！
    MANPATH /usr/local/apache2/man

    6. 使用文字介面瀏覽器測試：
    [root @test httpd-2.0.43]# lynx http://localhost
    Test Page for Apache Installation
    If you can see this, it means that the installation of the Apache web
    server software on this system was successful. You may now add content
    to this directory and replace this page.
    ___________________________________

    Seeing this instead of the website you expected?

    This page is here because the site administrator has changed the
    configuration of this web server. Please contact the person responsible
    for maintaining this server with questions. The Apache Software
    Foundation, which wrote the web server software this site administrator
    is using, has nothing to do with maintaining this site and cannot help
    resolve configuration issues.
    ___________________________________

    The Apache documentation has been included with this distribution.

    You are free to use the image below on an Apache-powered web server.
    Thanks for using Apache!
    當然啦！要使用 lynx 必須先安裝他！所以，請先將您的光碟 mount 然後安裝 lynx 吧！
    如果出現上面的測試網頁，呵呵！恭喜您，您的 Apache2 已經可以正常的啟動囉！

    為什麼一定要在 /usr/local/src 底下進行 Tarball 呢？這僅是約定俗成的啦！因為如此一來，大家都安裝在這個地方，以後主機的維護與移交都很簡易！並且，對於您未來在主機上面的『升級』與『版本判別』都有很好的幫助呢！基本上，如果上面的過程都沒有錯誤發生，那麼恭喜您，已經可以順利的來啟動你的 Apache 了！並且應該有第一個主機網頁產生啦！呵呵！真是快樂喔！但是如果有問題呢？通常最大的問題排除打字的錯誤之外，應該就是來自於我們在 Tarball 與 RPM 一文當中提到的，忘記安裝那個 make, gcc 等套件！這個時候，請拿出您的光碟，一個一個的將套件安裝上去吧！粉麻煩的啦！好了！接著下來看看怎麼安裝 PHP 咯！而這個方式安裝下來的 Apache 首頁就在 /usr/local/apache2/htdocs 這裡啦！[ 注意：在這個安裝的方法之後，很奇怪的是，並沒有將中文的首頁設定正確！你可以到 /usr/local/apache2/htdocs 裡頭，下達 cp index.html.zh index.html.tw.Big5 即可！ ]

  3. 安裝 PHP 在您的系統中：
    沒有 PHP 時，您的網頁將變的很單調ㄟ∼而且粉多的 PHP 論壇都沒能架設，很可惜！所以底下我們來談談怎麼讓你的 LAMP 正確的支援 PHP 囉！

    0. 解壓縮：
    [root @test root]# cd /usr/local/src
    [root @test src]# tar -zxvf /root/php-4.2.3.tar.gz
    .....(訊息略)....
    最後會產生一個 /usr/local/src/php-4.2.3 的目錄

    1. 搜尋設定內容：
    [root @test src]# cd php-4.2.3
    [root @test php-4.2.3]# ./configure --prefix=/usr/local/php4 \
    >--with-apxs2=/usr/local/apache2/bin/apxs \
    >--with-mysql=/usr/local/mysql \
    >--with-config-file-path=/usr/local/php4
    上面請特別注意到：
    --prefix=/安裝的路徑：這個項目在設定未來你的 Apache 安裝在那個目錄當中？！
    --with-apxs2　　　　：這個則是 Apache2 專用的選項喔！請針對您的主機情況設定！
    --with-mysql　　　　：這個則是針對 MySQL 啦！當然啦，就寫我剛剛搞定的咚咚！
    --with-config-file-path：這個又是什麼？呵呵！是 php 的設定檔 php.ini 放置的目錄啦！
    其他的額外項目請使用 ./configure --help 來察看吧！

    2. 開始編譯與安裝：
    [root @test php-4.2.3]# make; make install
    如果沒有錯誤的話，那麼在 /usr/local/php4 這個目錄當中就已經將你的 php 安裝好了！

    3. 轉存 PHP 基本組態檔案：
    [root @test php-4.2.3]# cp php.ini-dist /usr/local/php4/php.ini
    這個路徑與你剛剛在 ./configure 當中那個 --with-config-file-path 設定有關！

    4. 啟動 Apache 當中的 PHP 選項：
    [root @test php-4.2.3]# vi /usr/local/apache2/conf/httpd.conf
    找到底下兩行：
    LoadModule php4_module modules/libphp4.so <==大約在 230 行處
    AddType application/x-httpd-php .php <==這一行可以在 823 行處自行增加！

    5. 重新啟動 Apache ：
    [root @test php-4.2.3]# /usr/local/apache2/bin/apachectl stop
    [root @test php-4.2.3]# /usr/local/apache2/bin/apachectl start

    6. 測試 PHP 是否是正常工作的：
    [root @test php-4.2.3]# cd /usr/local/apache2/htdocs
    [root @test htdocs]# vi test.php
    <?
    phpinfo( );
    ?>
    以我的測試主機為例，我的測試主機 IP 為 192.168.1.2 ，所以隨便以一部可以連線的PC，
    在網址列輸入 http://192.168.1.2/test.php
    或者直接在本機的 X-Window 上面輸入 http://localhost/test.php 亦可！

    在上面的最後一個步驟中，如果你的瀏覽器有出現類似底下的畫面，那麼就是編譯成功啦！ ^_^，而且，主要的 PHP 組態檔案會是在 /usr/local/php4/php.ini 這個檔案喔！
哈哈！費了九牛二虎之力，終於將 LAMP 以 Tarball 安裝完畢，並且也測試 OK 囉！
升級與安裝方式的選擇建議：
推薦使用 RPM 的原因：
一般而言，如果沒有特別的需求的話，那麼使用 Tarball 通常已經可以滿足大家的需求了！並且在安裝上面確實比較容易！此外，未來在升級方面，可以由各家的 Linux distributions 來提供適當的升級版套件，因此，升級上面也是絕對沒有問題的！所以這裡特別推薦使用 RPM 的方式來進行您的 LAMP 的架設！不但方便簡單，而且基礎功能都已經含有了！不需要再考慮有的沒的咚咚！
有些時候， Tarball 也是不得已的：
不過，有些時候也是不得不升級的吶！或許是因為 distribution 廠商提供的版本速度更新太慢，或者是網路上的 Bug 問題太多，或者是你需要新版本的某些功能時，那麼您只好自行以 Tarball 的方式來安裝了！而這裡需要特別強調的是，如果您使用 Tarball 來安裝 LAMP 時，需要整體考量喔！因為 PHP 有使用到 Apache 2.xx 版本的某些功能，所以重新編譯 Apache 時，需不需要重新編譯 PHP 呢？絕大部分的情況之下，由於 Apache 支援動態函式庫，因此或許不需要重新的編譯 PHP ，不過，還是需要注意的！並且，使用 Tarball 的時候，最好全部這三個咚咚都使用 Tarball ，不要一個 RPM 一些 Tarball 的，容易錯亂啦！
主機設定：
終於來到主機設定的地方了！在底下的設定裡面，我們講的是大方向喔！還有很多的設定可能要大家有興趣的多多自行試看看囉！此外，由於每個版本的 Linux distribution 都會將 Apache 作一些調整，因此，不見得每個 Linux distribution 的設定檔案都會在同一個地方！舉個例子來說， Red Hat 6.x 版本以前的 Apache 會用到三個設定檔案，但是目前新推出的幾個 Red Hat 版本中，只要 httpd.conf 這個檔案設定 OK 就好了！另外， Mandrake 使用 RPM 安裝後， httpd.conf 竟然不是主要設定檔！他的 Apache 已經改到 commonhttpd.conf 囉！還真是奇怪∼無論如何，如果您使用的是 Tarball 安裝 Apache 2.x 的話，那麼設定檔與套件的目錄架構，應該就會差不多了！而且，請善用 locate 與 find 來搜尋 Apache 與 PHP 還有 MySQL 的設定檔喔！因為他們的設定檔名稱應該是不變的！即使 Mandrake 修改了部分內容到 commondhttpd.conf ，但同目錄之下，仍然有 httpd.conf ㄋㄟ！此外，底下我們的設定主要以 Apache 2.xx 版本來談論，至於 1.3.xx 版本，可以參考這裡： Apache 1.3.xx 的簡易設定。基本上，不論是 1.3.xx 還是 2.xx 版本，主要設定的內容都大同小異啦！看看就能夠明瞭了！
基本要求：
要讓您的 Apache 就是 WWW 能夠在 Internet 上面被搜尋到，您的主機最好要有個 domain name ，亦即是有個獨一無二的名字啦！如此一來，在 Internet 上面，大家比較容易找的到您的主機！並且，如果您主機的內容已經大致上完備的話，那麼可以到各大搜尋引擎去註冊(免費)一下，例如奇摩雅虎、蕃薯藤、新浪網等等去註冊一下！這樣就可以讓大家搜尋到你的網站囉！所以，你需要：
  1. 連上 Internet ：這不是囉唆的很嗎？沒錯啦！但還是要提醒，既然要對 Internet 公開，第一件事就是要連上 Internet 吶！

  2. 申請領域名稱 ( domain name )：其實應該稱為 FQDN 比較好的！ ^_^ ！如果你使用的連線方式取得的 IP 是非固定的，亦即俗稱的浮動式 IP ，那麼可以選擇類似 www.adsldns.org 之類的免費動態 IP 之 DNS 系統！還頗好用的！詳情請參考：動態 DNS 技巧。那麼如果想要自行申請 domain name 的話，那麼就可以參考 DNS 的設定啦！但請注意，該服務『最好有固定 IP 』者才適用喔！總而言之，就是找 domain name 就需要找到 IP 啦！但要特別留意，如果您希望未來架設虛擬主機的話，那麼就務必要有授權的 DNS 囉！

  3. 安裝好 LAMP ：又是廢話！ @_@ 反正一定要好好的安裝就是了。這裡又要特別強調，除非你有很好的邏輯觀念，那麼你同時安裝 RPM 與 Tarball 還沒有關係 ( 同時存在兩套 LAMP ) ，反正可以讀到正確的即可！但是，如果你沒有良好的邏輯概念，那麼，如果要安裝 RPM ，請將 Tarball 的移除！如果要安裝 Tarball ，請將 RPM 移除！當然，資料庫與網頁的資料請記得備份！這樣會比較簡單啦，而且不容易發生錯誤！
  4. 具備簡易的 HTML 語法概念：這個我就沒有辦法教大家了！因為不在 Linux 範圍內∼有興趣的可以到一個十分棒的網頁建置教學網站：網站建置百寶箱！因為具備簡易的 HTML 觀念後，才比較容易理解整個 Apache 運作的傳遞之資料的狀況！
好了！不囉唆，立刻來實作看看先！
最簡易 Apache 設定
為什麼掛了個『最簡易』呢？呵呵！因為那就是沒有任何麻煩的設定嘛！基本上，如果你按照鳥哥上面 Tarball 的方法安裝好之後，其實立刻就有主機的首頁了！當然，使用 RPM 也有首頁啦！因此，用最原始的設定其實就可以進行主機的首頁瀏覽了！需要特別注意的是，第一次進入到 Apache 之後，你會發現有個 documentation ，在那個超連結當中，對於 Apache 有『相當完整的介紹！』如果有任何問題，可以到該連結裡面去搜尋！絕對可以找到您要的資訊喔！底下我們就以 Apache 2.xx 版本的設定檔案來介紹，如果您是 1.3.xx 版本，請自行參考底下的設定來解決您的 httpd.conf ！設定方面差不多啦！ ^_^
此外，需要注意的是基本的環境設定方法為：
<設定項目>
    ......
    ......
</設定項目>
例如：
<Directory>
    Options Indexs
</Directory>
幾乎都是這樣的設定方式喔！請注意一下即可！特別留意的是，如果你有額外的設定時，不能隨便在 httpd.conf 裡頭找地方寫入！否則如果剛好寫在 <Directory>...</Directory> 裡面，呼呼！那麼就會發生錯誤啦！需要前前後後的找一找喔！
  • 基礎環境設定：

    [root @test root]# cd /usr/local/apache2/conf
    [root @test root]# vi httpd.conf

    ServerRoot "/usr/local/apache2"
    最上層的 Apache 目錄！我們安裝的時候，以這個目錄來安裝的，他就是 ServerRoot 囉！
    其實，也就是說，如果底下以『相對路徑』的方式寫的，那麼就是相對於這個路徑！
    當然，寫絕對路徑就沒有任何影響啦！

    PidFile logs/httpd.pid
    不要跟我說不曉得 PID 是什麼？查看一下 Linux 基礎的資源管理去！
    這個項目在設定 Apache 的 PID 記錄檔！可以用在重新讀取設定檔等等的功能！
    如上面所言，因為寫了相對路徑，所以實際的目錄為 /usr/local/apache2/logs/httpd.pid
    通常我也喜歡將他移動到 /var/log/httpd 底下去，統一管理較方便！
    我喜歡將這行改變為 PidFile /var/log/httpd/httpd.pid

    Timeout 300
    這是用來設定連接到你這部主機的用戶端，當超過 300 秒用戶端還沒有
    辦法連上你的主機時，就予以斷線處理！

    KeepAlive On
    是否允許持續性連線，亦即一個連線有多個要求！這裡通常設定為 On 比較好，
    就鳥哥的經驗來看，設定為 Off 似乎會產生很多 Time_Wait 的封包！粉怪！

    MaxKeepAliveRequests 100
    在持續性的連線當中，最多允許的連線數目！如果不要限制，可以設定為 0 ，
    當然，官方網站上面說，要有較佳的效能，最好設定大一點，所以我都將他改為 200 以上。

    KeepAliveTimeout 15
    同一個連線的 Client 下次的需求沒有在 15 秒內送出，那麼該連線會被視同斷線喔！

    <IfModule prefork.c>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxClients 150
    MaxRequestsPerChild 0
    </IfModule>
    <IfModule worker.c>
    StartServers 2
    MaxClients 150
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestsPerChild 0
    </IfModule>
    這兩段主要是與系統的效能較有關係！如果不需要效能設定的話，那麼使用預設值就很夠了！
    1. MinSpareServers 與 MaxSpareServers 是開啟 httpd 服務數目的地方，當你執行
    /usr/local/apache/bin/apachectl start 之後， 在 shell 下執行
    ps -aux|grep http 就可以看到 http 的數量， 通常這與你的 RAM 有關。
    如果是小站的話，可以設小一點， 例如最小設 3 最大設 5 即可！
    2. 而 StartServers 則設與 Min 相同即可！
    3. 至於 MaxClients 則可以設小一點，因為設定太大很耗系統資源，
    而太小則無法讓很多人連上來！所以可以設成例如 100

    Listen 80
    設定監聽的 port ，如果你要更改 WWW 的 port number ，可以在這裡修改，例如 8080

    User nobody
    Group nogroup
    這個是設定 apache 所產生的，就是剛剛我們上頭所設定的 MinSpareServers ，之後會產生
    一些 process ，那麼這些 processes 的擁有者與擁有群組 ( owerner & group ) 是誰！
    這個與未來的『 PID 權限及 Linux 權限設定』有關！通常如果是 RPM 安裝的話，
    大致上都會是 apache ，而如果是 Tarball 安裝，通常是 nobody 與 nogroup 吧！
    是否有該 user 還要查看 /etc/passwd 及 /etc/group 喔！不能設錯！否則無法啟動 apache

    ServerAdmin root@localhost
    這個是設定你的機器的 httpd 管理員帳號！設成你的e-mail吧！例如我都設定為：
    我的機器上： ServerAdmin test@localhost

    #ServerName new.host.name:80
    設定主機名稱的地方，若有需要的話才設定，否則可以將他 mark 掉也沒關係！
    但如果你需要讓 Apache 自動幫你將其他名稱連過來的主機名稱修改時(下一個設定)，
    那麼這裡就需要填寫囉！此外的此外，需要瞭解的是，有時，例如 Openlinux server 3.1.1
    如果沒有設定這個的話，那麼你的 WWW 將無法啟動！另外，如果設定錯誤，同樣無法啟用！
    因此，沒有特別要求的話，那麼這個就暫時不要設定吧！免得自找麻煩∼

    UseCanonicalName Off
    主機的別名啦！例如你的主機有三個名稱時，那麼這個 Off 的設定，會讓 Client 端
    可以分別使用三個名稱顯示在他們的瀏覽器上面，如果是 On 的話，那麼將以上面的
    ServerName 內容來顯示在他們的瀏覽器上面，而不是原來他們寫的主機名稱喔！
    說是這樣說，但是我試不出來這個功能∼∼ @_@

    AddDefaultCharset ISO-8859-1
    LanguagePriority en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv tw
    Apache 的預設顯示語言編碼！請特別留意，因為這裡的設定並不適合台灣的繁體中文，呵呵！
    所以底下請『務必』修改成這樣！否則您的網頁總是無法顯示中文喔！
    這兩行大概在 httpd.conf 的 750 ~ 800 行之間！請以搜尋的方式找一下！
    AddDefaultCharset Big5
    LanguagePriority tw en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv

    HostnameLookups Off
    在記錄檔案的時候，登錄檔的內容，來捉取我們資料的主機是以 IP 還是主機名稱來顯示？
    當然是 IP 來顯示比較快喔！所以，這裡通常設定為 Off ，不需要轉譯 IP 成為主機名！

  • 目錄路徑設定：

    [root @test root]# cd /usr/local/apache2/conf
    [root @test root]# vi httpd.conf

    DocumentRoot "/usr/local/apache2/htdocs"
    將 /usr/local/apache2/htdocs 設定為 Apache 的根目錄！
    這個就是主機的主網頁啦！你可以將他移到任何你高興的地方！
    不過，比較重要的限制是，最好這個目錄底下不要包含重要的資訊，例如你不要將 Linux /
    設定為這個 DocumentRoot 吧！ ^_^ 否則你的主機下的任何資料，不就任何人都可以使用
    瀏覽器來查看？豈不是很危險！

    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    這個是設定根目錄，亦即是 /usr/local/apache2/htdocs 這咚咚的屬性啦！
    使用 Options 來設定相關屬性，相關的屬性還有底下幾個ㄋㄟ！
    ExecCGI　　：使該目錄底下的 CGI 具有可以執行的能力！重要項目！如果您要您的
                某個目錄可以執行 CGI 的程式時，那麼請將該目錄多加 ExecCGI 這個屬性！
    FollowSymLinks　：讓您的 link 的目錄或檔案，雖然在其他的目錄下，仍然可以連接出去！
                      舉個例子來說，目前我的主頁是 /usr/local/apache2/htdocs ，但我想
                      連接到 /home/vbird/testing 底下，然而我又不想多加一個 directory
                      的設定值在 httpd.conf 內，那麼我可以在 /usr/local/apache2/htdocs
                      使用 ln 連結一個名為 vbird 使他指向 /home/vbird/testing ，那麼
                      當我網址輸入 http://localhost/vbird 時，就可以到
                      /home/vbird/testing 了！
                      如果沒有設定這個屬性，那麼就無法連接出去喔！
    Includes　　：在 Server 端的工作可進行！
    Indexes　　：如果在該目錄底下找不到 index.html 時，就顯示整個目錄下的檔案名稱！
                  粉危險吧！ ^_^ 所以囉，盡量不要包含 Indexes 這個項目啦！
    MultiViews　：這個東西有點類似多國語言支援啦！你可在同一目錄下的同一個檔案，
                  編寫多個不同語言的檔案，並且以一個 *.var 的檔案來規範不同編碼！
                  有興趣的話，請自行參考自己的 /usr/local/apache2/htdpc/index.html.var
    All ：全部的屬性都啟動啦！但是不包含 MultiViews ！

    <Directory "/usr/local/apache2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>
    1. 這段主要在設定 / 的屬性啦！可以看到預設的情況中有 indexes 喔！所以趕緊將他拿掉！
    2. 至於 AllowOverride 主要與認證網頁的設定有關啦！亦即 .htaccess 檔案！意思是說，
    httpd.conf 在與 .htaccess 相同目錄下的設定中，哪些設定會用來取代 .htaccess 的
    設定內容？當然啦， .htaccess 這個檔案設定較為靈活，所以當然設定為 None 囉！
    仍然是以 .htaccess 的設定為主啦！
    3. Order allow,deny 注意喔，那個 allow,deny 中間是以 , 隔開，並沒有空格！不要
    設定錯了！這個東西與底下的 Allow 在設定『權限』的啦！我們後面會再詳談！

    UserDir public_html
    這玩意兒在設定個人家目錄下的首頁在何處啦！這裡預設是 public_html ，舉例來說，
    我的家目錄是 /home/test ，那麼這個使用者的首頁目錄在 /home/test/public_html ！
    當然，這個目錄是可變的！就看你要怎麼設定囉！ ^_^
    例如很多人都喜歡將這個目錄設定為 www ㄋㄟ！呵呵！也順道去修改一下 /etc/skel 的內容

    DirectoryIndex index.html index.html.var
    這個就是當我們輸入 http://192.168.1.2 時，那麼 Apache 將會去搜尋該目錄底下的檔名！
    預設只有兩個，太少了！如果我們使用 php 之類的，哇！那可就糗了！所以，這裡可以改成
    DirectoryIndex index.html index.htm index.php index.cgi index.php3 index.html.var
    如果還有喜歡的預設檔名，將他加進去吧！這就是首頁的網頁名稱囉！ ^_^

    Alias /icons/ "/usr/local/apache2/icons/"
    <Directory "/usr/local/apache2/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>
    Aliase 之設定主要也是在簡化一些繁複的連結內容啦！舉上面的例子來說，我們的 Apache
    根目錄在 /usr/local/apache2/htdocs 裡面，那麼輸入網址 http://localhost 則到該目錄，
    在上面的設定中，則輸入 http://localhost/icons 會跑到 /usr/local/apache2/icons
    的意思！如此一來，設定上較為簡便了！

    Alias /manual "/usr/local/apache2/manual"
    <Directory "/usr/local/apache2/manual">
    Options Indexes FollowSymLinks MultiViews IncludesNoExec
    AddOutputFilter Includes html
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>
    這個與上面的設定相同！所以，未來只要輸入 http://localhost/manual 即可到達自己的
    主機上面的說明文件喔！很簡易吧！ ^_^

    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    <Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    </Directory>
    ScriptAlias 這部份則大概專屬於 CGI 之類的可執行程式吧！呵呵！要瞭解一下，
    我們預設都是將 http://localhost/cgi-bin 設定為可執行的 CGI 程式放置區！
    那麼 CGI 程式要開放的權限有哪些！呵呵！就上面設定的囉！

  • 啟動 PHP 與 CGI 相關模組，及預設的登錄檔修訂！：

    [root @test root]# cd /usr/local/apache2/conf
    [root @test root]# vi httpd.conf

    LoadModule php4_module modules/libphp4.so
    AddType application/x-httpd-php .php
    AddHandler cgi-script .cgi .pl
    至少這三行必須要啟動喔！尤其是第三行，通常預設都是關閉的！所以，你必須要將 # 移除，
    否則你將無法執行 CGI 的程式ㄋㄟ∼

    ErrorLog logs/error_log
    LogLevel warn
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    CustomLog logs/access_log combined
    上面全部都跟 log 有關，因為鳥哥真的比較喜歡將 log file 放在一起處理，所以我都會
    這樣改：
    ErrorLog /var/log/httpd/error_log
    CustomLog /var/log/httpd/access_log combined
    只改這兩行，其他的保留預設值咯！ ^_^

這樣就給他設定完成了啦！粉不錯吧！ ^_^接下來，介紹一下怎麼啟動吧！
啟動 httpd
    要啟動 WWW 實在是太簡單啦！直接給他啟動即可！如果是以 RPM 安裝的，那麼啟動檔案預設在 /etc/rc.d/init.d/httpd 這個檔案，所以，你可以這樣啟動：

    [root @test root]# /etc/rc.d/init.d/httpd start (啟動)
    [root @test root]# /etc/rc.d/init.d/httpd stop (關閉)

    至於 Tarball 則是以 apachectl 來作的：

    [root @test root]# /usr/local/apache2/bin/apachectl start (啟動)
    [root @test root]# /usr/local/apache2/bin/apachectl stop (關閉)

    無論如何，啟動之後請立即察看一下 port 是否已經開啟了？！

    [root @test root]# netstat -tuln | grep ':80'
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

    並且需要在登錄檔當中發現底下這一行才算成功喔！

    [root @test root]# vi /var/log/httpd/error_log
    [Thu Dec 26 20:16:53 2002] [notice] Apache/2.0.43 (Unix) PHP/4.2.3 configured -- resuming normal operations

    測試結果：
    相信您應該都會自行測試您的 WWW 是否正常了吧？！沒錯！ Apache 是否正常，直接在遠端的主機，或者是近端的本機上面，以瀏覽器直接輸入你的 IP 來試看看即可知道！而測試 PHP 呢？就用上面我們提到的那支小小的 PHP 程式來進行 PHP 的內容顯示，成功就是 OK 啦！ MySQL 呢？直接給他 mysql -u username -p 再輸入密碼，就可以知道有沒有設定成功啦！整個的設定真的是粉簡單的啦！通常，如果上面的測試沒有成功的話，最大的可能為：

    • 網路問題：雖然在本機上沒有問題，但不代表網路一定是通的！請確認一下網路狀態！例如 Route table, 撥接情況等等；
    • 網頁問題：例如鳥哥第一次以 Tarball 安裝好之後，竟然發現無法顯示主機的首頁！後來才發現是主機的首頁設定錯誤！導致找不到網頁，這個時候，請特別留意瀏覽器上面的顯示訊息，裡面包含了無法連進來主機的問題！請提供這樣的訊息到討論區，大家才知道問題出在哪裡吶！
    • 權限問題：例如你剛剛在上面的 user 設定為 nobody 了，但偏偏要被瀏覽的目錄權限為 750 ，自然就無法讓人家連線進去啦！
    • 問題的解決之道：如果還是沒有辦法連接上來你的 Linux Apache 主機，那麼請：
      1. 察看 /var/log/httpd/error_log 這個檔案吧！他應該可以告訴你很多的資訊喔！
      2. 另外，也要仔細的察看一下你的瀏覽器上面顯示的資訊，這樣才能夠知道問題出在哪裡！ ^_^
      3. 另一個可能則是防火牆啦！察看一下 iptables 的訊息！
用戶的個人網頁啟動
    呵呵！再來則是個人用戶啦！如果是個人用戶要自己的首頁時，要怎麼辦呢？剛剛我們不是提到了 httpd.conf 中有一項關於個人首頁的設定，通常如果你不另行修改 httpd.conf 檔案的話，他的預設值都是『 public_html 』這個設定，好了，那要如何設定個人網頁呢？假設以 test 這個帳號為例，我們可以這樣進行：

    [test @test test]$ cd (回到自己的家目錄)
    [test @test test]$ mkdir public_html
    [test @test test]$ chmod 755 public_html
    [test @test test]$ chmod 755 /home/test
    在你的用戶端家目錄中建立了一個 public_html 的目錄，
    並將此目錄的權限改成可以讓其他人觀看，注意喔， apache
    預設是 public_html ，但是如果你在 httpd.conf 這個檔案中
    改變了目錄名稱，則必須作適當的修正喔！

    然後在你的目錄中，亦即 /home/test/public_html 當中，建立一個檔名為 index.html 的 HTML 檔案，然後在 IE 的網址列打入
      http://你的網站名稱/~test/
    則 apache 會自動將 IE 的訊息傳到 /home/test/public_html 這個目錄中，並搜尋檔名為 index.html 或 index.htm 或 index.php 的檔名！所以說， index.html 是 apache 第一個找尋的檔名喔！這就是你的首頁啦！
    不過，如果您覺得這樣實在很討厭，怎麼需要多加一個毛毛蟲的符號『 ~ 』呢！真煩，可不可以只使用：
      http://你的網站名稱/test
    就好啦！？當然沒問題啦！但是就需要動一點手腳了！最常見的有兩種方式：
    • 建立連結檔：
      這是最簡單的方法啦，還記得我們的主頁有 Options FollowSymLinks 吧？！呵呵！所以利用 ln 就可以達到我們的需求了！首先，需要找到首頁，然後在首頁底下輸入連結的方法：
      [root @test root]# cd /usr/local/apache2/htdocs
      [root @test htdocs]# ln -s /home/test/public_html test
      這樣立刻生效啦！不需要重新修改喔！厲害吧！！ ^_^

    • 建立 Alias：
      另一種方是就是使用我們剛剛提到的那個 Alias 功能啦！也是粉簡單的ㄋㄟ：
      [root @test root]# vi /usr/local/apache2/conf/httpd.conf
      Alias /test/ "/home/test/public_html/"
      <Directory "/home/test/public_html">
      Options FollowSymLinks
      AllowOverride None
      Order allow,deny
      Allow from all
      </Directory>

      [root @test root]# /usr/local/apache2/bin/apachectl stop
      [root @test root]# /usr/local/apache2/bin/apachectl start

      請注意：
      1. 在 Alias 後面雙引號接的目錄『務必』於最後面加上一個 / ，亦即 ....public_html/ 才行！若沒有加上 / ，則該行字串會被視為『檔案』而非目錄！特別留意這一點！
      2. 那個 <Directory ....> 裡面的設定中，關於目錄 /home/test/public_html 請『務必』幫他加上雙引號喔！否則可能會無法成功的啟動！！
      好啦！這樣你的用戶之個人網頁就 OK 囉！ ^_^
進階安全設定：
接著下來，我們想要瞭解一下，那麼 Apache 有沒有其他額外的設定呢？
CGI 之執行、Index 顯示、查無網頁顯示之設定：
CGI 之執行：
首先要來提到的是 CGI 的執行問題，這也是很多朋友想要提出的問題啦！到底要怎麼設定才可以在某些路徑裡面執行 CGI 的程式呢？而不是使用純文字將他 show 出來？！難道要執行 CGI 就非得在 /usr/local/apache2/cgi-bin 這個目錄下不可嗎？當然不是！有很多的方法可以來設定的！舉個例子來說，假設今天有個一般身份的使用者 test ，他想要可以執行 CGI ，那麼他的家目錄在 /home/test/public_html 底下，而他的程式是放在 /home/test/public_html/cgi 這個目錄中，那我可以怎麼作呢？同樣有兩種作法：
  • 使用 Options 及 ExecCGI
    你可以在 httpd.conf 這個檔案中，找個地方加入底下的文字：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf

    方法一：
    先確認在 httpd.conf 當中，底下這一行已經將註解拿掉了！
    AddHandler cgi-script .cgi
    請注意，如果是想要讓 .pl 的檔案可以執行 ( Perl )，那麼上面那行要改寫成：
    AddHandler cgi-script .cgi .pl

    再加入底下幾行：
    <Directory "/home/test/public_html/cgi">
    Options ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    方法二：
    直接加入底下這幾行即可！
    <Directory "/home/*/public_html/cgi">
    Options ExecCGI
    SetHandler cgi-script
    </Directory>

    [root @test root]# /usr/local/apache2/bin/apachectl stop
    [root @test root]# /usr/local/apache2/bin/apachectl start

    呵呵！這樣該目錄立刻就可以執行 CGI 的程式啦！當然啦，那個 cgi 的檔案，權限當中也必須要有『可執行, x 』的權限喔！而，如果你要執行某個 cgi 程式，例如 index.cgi 好了，那麼就需要填入：http://your.server.name/~test/cgi/index.cgi 囉！

  • 使用 ScriptAlias 功能：
    還有另外一個功能也可以達到同樣的效果，那就是使用 ScriptAlias 喔！你可以在 httpd.conf 這個檔案中，找個地方加入底下的文字：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf

    先確認在 httpd.conf 當中，底下這一行已經將註解拿掉了！
    AddHandler cgi-script .cgi

    再加入底下這一行：
    ScriptAlias /testcgi/ "/home/test/public_html/cgi/"

    [root @test root]# /usr/local/apache2/bin/apachectl stop
    [root @test root]# /usr/local/apache2/bin/apachectl start

    呵呵！這樣也是可以啦！假設你要執行的檔案仍然是 index.cgi ，那麼，你的執行網址會變成： http://your.server.name/testcgi/index.cgi ！就是這點不同囉！其他的都一樣啦！
Index 顯示：
剛剛我們前面不是提到 Options 關於 Indexes 的說明嗎？對啦！由於 Indexes 加入的時候，找不到 index.html 時，會將該目錄下的所有檔案以類似 FTP 的畫面秀出來，所以很危險，因此，可以的話，盡量不要在 Options 後面加 Indexes 喔！記得將他拿掉！會比較稍微安全一些！
查無網頁：
那麼好啦，既然不要秀出沒有 Index.html 的目錄下的所有檔案，有沒有什麼替代的方法，可以讓使用者知道該目錄下沒有這個檔案，並提供他另一個網頁的連結呢？再舉個另外的例子，如果你的網頁經過了大量的改版，所以某些原來的檔案已經不見了！但是你有很多的老網友，那麼他們連過來的時候，將會發生很多的錯誤，怎麼辦？
沒關係，還記得當你查不到網頁的時候， IE 或者是其他的搜尋引擎，會自動的跑出一個視窗，警告說，查無該網頁，並提供另一個可能的連結給您是吧？！同樣的，我們也可以利用這樣的機制，自己建立一個額外的連結資料來給大家使用！如此一來，嘿嘿！找不到網頁也沒關係，我們已經提供了其他的連結，這樣就可以很輕易的引導使用者到適當的目錄去瀏覽啦
  • 設定 httpd.conf
    又要設定這個 httpd.conf 檔案啦！找到底下的地方，並且將他開啟吧：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf

    大概在 880 行左右，可以找到下面這一行：
    ErrorDocument 404 /missing.html
    將前面的 # 拿掉喔！由於我們的 code 有：
    100-199：一些基本的訊息
    200-299：要求成功的達成
    300-399：Client 的需求需要其他額外的動作，例如 redirected 等等
    400-499：Client 的要求沒有辦法完成(例如找不到網頁)
    500-599：主機的設定錯誤問題
    所以，上面的 ErrorDocument 404 就是在無法查詢到網頁的代號之一啦！
    而接在這個項目後面的就是網頁的名稱咯！因為在 / ，所以可以瞭解他的檔案全名為：
    /usr/local/apache2/htdocs/missing.html 還記得 / 在 Apache 就是 DocumentRoot 吧！^_^

    [root @test root]# /usr/local/apache2/bin/apachectl stop
    [root @test root]# /usr/local/apache2/bin/apachectl start

  • 編輯 /usr/local/apache2/htdocs/missing.html
    再來則是要編輯這個檔案囉！因為只要沒有找到對應的網頁時，這個網頁就會被顯示在 Client 端的瀏覽器上面，喝！你可以這樣編啦：
    [root @test root]# vi /usr/local/apache2/htdocs/missing.html
    <html>
    <center>
    Missing HTML Web Page<br><br>
    I can't find any web page for you, <br>
    Please contact with me root@localhost, <br>
    or press <a href="http://192.168.1.2/manual/">here</a> to see the manual of Apache 2.xx
    </center>
    </html>
    打上面那個 192.168.1.2 改成你的 IP ，這樣就可以啦！註：這個版本很是奇怪！同樣的方法，我在其他的所有 distribution 上面都可以成功，唯獨以 Mandrake 9.0 即使用 Tarball 方式安裝的此一方法，卻無法成功！然而若使用 Apache 所預設提供的功能，那麼就又可以成功！還真的是很奇怪.....
抵擋 IP 與限制使用者動作的設定(allow, deny, limit)
任何的 Service 都一樣，應該都會有『限制連線登入者』的功能！當然， Apache 也不例外！他提供了抵擋 IP 或者是限制使用者進行某些工作的方法！那就是 Allow 與 Deny 的功能，另外，亦有 Limit 的功能可以來使用！
  • 抵擋某些 IP 或 domain 來源：
    很多時候我們發現有某些來源的使用者似乎沒有很遵守我們網站的約定，可能會砍站啦，或者是可能從事一些讓管理員很生氣的勾當！當然，你可以使用 iptables 等之類的防火牆功能來擋掉他，不過，我們也可以額外的再以 Apache 來擋他喔！還記得我們在前面的 <Directory> 裡面的設定時，常常會看到 order allow,deny 那一行吧！呵呵！那就是我們可以針對的某些設定啦！舉例來說，假如你知道 192.168.1.100 這個 IP 的使用者不乖以及 testing.idv.tw 這個 domain 的來源不被信任，你就不讓他進入某個目錄內，例如 /home/test/public_html/cgi，那麼你可以這樣做：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf
    額外再新增幾行吧！
    <Directory "/home/test/public_html/cgi">
    Options ExecCGI
    SetHandler cgi-script
    order allow,deny
    deny from 192.168.1.100
    deny from testing.idv.tw
    allow from all
    </Directory>
    如此一來，嘿嘿！那個 192.168.1.100 及所有來自 testing.idv.tw 這個領域的主機就無法進入你的 /home/test/public_html/cgi 這個目錄囉！不過，其他的目錄還是可以進入喔！請留意這個現象！所以，如果要將他全部的權限都關閉的話，或許 iptables 還是比較好的選擇，不過，如果只是在乎某些目錄而已，那麼這個選項就不錯用了！

  • 限制某些功能：
    一般來說， Client 端有哪些功能可以動作呢？大概有：GET, POST, OPTIONS, DELETE 等等，由於 POST 與 DELETE 算是比較高權限的功能，如果今天您有一個目錄，在這個目錄中對於 192.168.1.50 這個 IP 來源你只許他觀看，而不許他貼上資料，那麼你要怎樣設定呢？我們繼續以上面的例子來進行說明好了，在 /home/test/public_html/cgi 這個目錄中，你要限制讓 192.168.100.0/24 這個網段不能『瀏覽』，至於張貼文章方面，則僅有 192.168.1.50 這個 IP 可以具有這樣的的功能，那麼你可以這樣修改：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf
    額外再新增幾行吧！
    <Directory "/home/test/public_html/cgi">
    Options ExecCGI
    SetHandler cgi-script
    <Limit GET>
    order allow,deny
    deny from 192.168.100
    allow from all
    </Limit>
    <Limit POST>
    order allow,deny
    allow from 192.168.1.50
    deny from all
    </Limit>
    order allow,deny
    deny from 192.168.1.100
    allow from all
    </Directory>
    嘿嘿！如此一來，就可以將我們的網頁資料搞的更安全啦！！ ^_^
主機狀態說明網頁設定
既然已經安裝好了 WWW 主機，除了提供服務之外，重要的是要如何維護囉！嘿嘿！那麼是否一定要額外安裝其他的套件才能知道目前的主機狀態呢？當然不需要啦！我們可以透過 Apache 提供的特別功能來查詢主機目前的狀態！那就是 mod_status 這個模組囉！如何使用呢？由於 mod_status 是預設一定會安裝的模組，所以根本不需要擔心載入與否的問題，唯一要擔心的，則是需要啟動這個模組的相關設定而已！同樣的，也是編輯 httpd.conf 這個檔案即可，可以這樣做：

[root @test root]# vi /usr/local/apache2/conf/httpd.conf
找到底下這幾行，並且將他修改一下：
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.1.11
</Location>

[root @test root]# /usr/local/apache2/bin/apachectl stop
[root @test root]# /usr/local/apache2/bin/apachectl start

在上面的設定中，必須要特別留意那個 Deny 與 Allow 的設定，說明的是，要察看這個訊息的，只有 192.168.1.11 這個 IP 來的要求才提供！否則一切則予以禁止。當然啦，主機的安全是需要維護與保密的，當然不讓人家知道是比較好的呢！然後直接在網址上面輸入： http://your.server.name/server-status 這樣就可以看到你的主機的一些狀態囉！有點像底下的樣子：

Apache Server Status for 192.168.1.2
Server Version: Apache/2.0.43 (Unix) PHP/4.2.3
Server Built: Dec 26 2002 01:59:03

------------------------------------------------------------------------------

Current Time: Monday, 30-Dec-2002 01:31:28 CST
Restart Time: Monday, 30-Dec-2002 01:31:13 CST
Parent Server Generation: 0
Server uptime: 15 seconds
1 requests currently being processed, 4 idle workers
W____...........................................................
................................................................
................................................................
................................................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

PID Key:

31027 in state: W , 31028 in state: _ , 31029 in state: _
31030 in state: _ , 31031 in state: _ ,

------------------------------------------------------------------------------
To obtain a full report with current status information you need to use the ExtendedStatus On directive.
------------------------------------------------------------------------------

Apache/2.0.43 Server at 192.168.1.2 Port 80

上面說明的，除了顯示出主機目前的 IP 與 時間 之外，亦列出 Linux Server 上面，關於 Apache 的使用程序狀態！雖然很簡單且陽春，不過該有的還都是有了！蠻不錯的ㄋㄟ∼有空的時候，可以多多的察看一下 Apache 的狀態！不過，特別需要注意一下能夠使用這個路徑的，最好侷限在少數人會較為安全喔！
關於權限的意義說明與設定
在網路的服務當中，最麻煩的地方可以說是『權限』的問題了！怎麼說呢？剛剛上面提到了提到了 httpd.conf 當中有設定 User 與 Group 這幾個咚咚，而這兩個屬性是針對 Process 來設定的，也就是說，當你啟動了 apache 之後，就會有 httpd 這個服務的 Process 在你的 Linux 系統(記憶體當中)的背景中執行了，而且這個 httpd 屬於剛剛我們設定的 nobody 使用者與 nobody 群組(註：剛好 User 與 Group 的名稱都叫做 nobody 啦！^_^)！所以囉，當使用 httpd 這個 Process 來進行 Linux 資料的存取時，那麼如何設定 Linux 底下最重要的『權限』問題呢？還記得我們在 Linux 主機之資源管理 裡面提到的，所謂的 PID 就是 Process 的 ID，當我們觸發一個事件時，Linux 就會給這個事件一個 ID 當作執行時候的識別碼，例如當 test 這個人下達『 vi /etc/fstab 』的時候，主機就會給這個事件一個 ID ，此外，這個 PID 還會記錄其他的權限喔！例如，因為啟動 vi 這個事件的使用者是 test ，所以這個 PID 當然就屬於 test 囉！所以當 vi 執行期間所開啟的所有檔案，都需要針對 test 來察看他是否可以具有讀、寫、執行的權限呢！
這樣說您應該有點瞭解了吧？是的，你在 Client 是否能瀏覽 Server 所提供的資料，是跟 Server 內的『權限』設定有關吶！舉個例子來說，還記得剛剛我們有將 /home/test/public_html 這個目錄設定成可瀏覽吧！而這個目錄屬於誰呢？沒有錯，是屬於 test 這個人的！那麼我們的 apache 所啟動的 process 屬於誰呢？以上面的例子為例，那就是 nobody 這個人的！那麼萬一 /home/test 的屬性是『drwx------』，請問你，Client 端的使用者能否瀏覽這個目錄呢？呵呵！由於 Apache 的 nobody 在 /home/test 的權限當中要尋找的是 others 的屬性，嗄！怎麼是『 --- 』，自然就是『不行瀏覽！』無論你的 /home/test/public_html 權限開放的有多大！這樣可以瞭解嗎？也就是說，萬一上層目錄就不許進入了，那麼底下的目錄當然也就無法被登入囉！
一般而言，使用者容易在個人首頁發現『Permission deny』的字眼，最常見的問題就是『Linux 權限設定錯誤』了！只要針對你的權限去修訂，那麼差不多就可以解決絕大部分的 Apache 權限問題喔！另外，需要特別留意的是，使用者能否進入一個目錄，主要是與可執行與否的權限(也就是 x )有關，因此，如果您要開放靜態網頁的瀏覽，那麼至少應該要將 /home/test 設定成 drwxr-xr-x ，亦即是 755 才行，不過，如果您要執行的是 PHP 之類的網頁程式語言，呵呵！那麼您只要設定 drwx--x--x 就可以囉！也就是 711 啦！因為畢竟 Client 只要能夠執行 PHP 程式即可，因為結果的顯示是在 Client 端吶！與是否能在 Server 端瀏覽是沒有關係的ㄋㄟ∼
設定認證網頁
是不是有過進入某個網站之後，按下某些連結，竟然出現一個對話框框，告訴你要登入該目錄，需要輸入帳號與密碼才能登入？呵呵！那就是所謂的『認證網頁』囉！這種認證的模式最起碼可以達到最小的保護作用，使你的資料比較保險啦！咦！那麼使用 Limit 不就好了？但是 Limit 的規定較為嚴格，若是改天你去外頭的網咖店，然後想要連線進入你的主機作一些事情，如果你設定除了內部 IP 之外，外部就無法以 Web 介面連進來的話，那麼不就糗了嗎？呵呵！這個時候認證網頁可就是你的好幫手囉！另外，目前很多學校老師也會將自己的講義放在網站上，然後以認證網頁的方式提供自己的學生下載使用！所以說，這個也是蠻不錯的一個變通方式哩！
那麼認證網頁怎麼搞呀！？說來還真的是很容易ㄋㄟ！
  1. 既然我們是『按了某個連結進入某個目錄之後，才會出現對話視窗』，那麼首先當然就是要有那個設定為認證網頁的『目錄』囉！請注意，是要目錄才行喔！
  2. 然後，在對會視窗中，既然我們需要輸入 ID 與密碼，那麼自然就需要密碼檔囉！另外，雖然 Apache 有支援 LDAP 及 MySQL 等等的認證機制，不過我們這裡並不討論其他的認證機制，完全使用 Apache 的預設功能而已，所以，底下我們會使用基本 ( Basic ) 的認證模式喔！
  3. 再來，當然就是到 httpd.conf 檔案中去設定我們剛剛建立的那個目錄的相關資訊囉！
  4. 最後，重新啟動就 OK 啦！
好了，那麼我們來作個例子吧！假設，我要在 http://localhost/protect/ 這個目錄下作一個認證資料，在這個目錄當中僅有 test.html 這個檔案，此外，我要讓 test 這個 ID ，密碼為 testing 及 qqq 這個帳號，密碼為 qqqpass 做為登入的帳號，那麼我該如何設定我的資料呢？一樣的，一步一步來進行吧！
  1. 製作保護目錄：
    第一步驟當然是製作保護目錄囉！既然這個目錄在 http://localhost/protect/ 底下，那麼有哪些方式可以達成呢？
    • 最簡單的方是就是直接在 /usr/local/apache2/html 這個目錄下再建立一個名為 protect 的子目錄囉！不過，這樣似乎太簡單了 ^_^
    • 再來，如果您的網頁支援 FollowSymLinks 這個參數(options)的話，那麼在任何一個目錄下，只要你在 /usr/local/apache2/html 利用 link ( ln ) 製作一個連結檔，那麼也可以達成所要的目的！
    • 最後，哈哈！直接使用 Alias 就可以啦！
    我們選擇使用最簡單的目錄方式來達成好了：
    [root @test root]# mkdir -p /usr/local/apache2/htdocs/protect
    [root @test root]# cd /usr/local/apache2/htdocs/protect
    [root @test root]# echo "This is a protect page" > test.html
    上面我加一個 -p 的參數可以幫我遞迴的一直建立好這個目錄喔！然後立刻就又做好一個檔案ㄋㄟ∼

  2. 製作密碼檔：
    製作密碼檔只要使用 htpasswd 這個命令就可以啦！他的語法是這樣的：
    htpasswd
    語法：
    [root @test root]# htpasswd [-c] password_file_name User_name
    說明：
    -c ：當後面的 password_file_name 這個密碼檔不存在時，那麼就建立該檔案

    範例一：
    新建一個檔案，並建立 test 這個 ID
    [root @test root]# cd /usr/local/apache2
    [root @test apache2]# htpasswd -c apache.passwd test
    New password:
    Re-type new password:
    Adding password for user test

    範例二：
    已經存在密碼檔了，要新增使用者帳號
    [root @test apache2]# htpasswd apache.passwd qqq
    New password:
    Re-type new password:
    Adding password for user qqq

    [root @test apache2]# more apache.passwd
    test:gPxbCD4QIGFwg
    qqq:5qPxrLrxRyRrg

    沒錯！這樣就 OK 啦！你已經有兩個帳號( test 與 qqq )在 /usr/local/apache2/apache.passwd 這個檔案中囉！不過，這裡請注意，由於你的密碼檔可以存放在任何地方，但是畢竟這裡面有你的重要資訊，所以，請特別留意的是，『不要將這個檔案放置在瀏覽器可以瀏覽到的目錄！』舉個例子來說，放在 /usr/local/apache2/htdocs 就不是一個明智的選擇！因為很可能會被別人瀏覽到這個檔案而失去『認證密碼』了，那麼豈不是很危險！？所以，盡量給他放在瀏覽器無法瀏覽到的地方，例如我們提到的 /usr/local/apache2 這個目錄就是一個還不錯的目錄！

  3. 針對保護的目錄設定認證的內容：
    當然接下來我們要針對那個受保護的目錄進行設定啦！就是要又開始搞設定檔囉！怎麼搞？！就是要加入資訊吶！加入哪些資訊呢？這當中當然就包含了『密碼檔的完整目錄與檔名、認證的類型、提示的字元、與允許登入的使用者』如果你看到認證網頁的登入視窗時，通常就會看到兩個輸入 ID 與密碼的格子，所以自然要設定密碼檔的檔案，而你也會看到該視窗上面有一些提示字元告訴你這個網頁是幹嘛用的！另外，像我們剛剛製作了兩個帳號，那萬一你只允許一個帳號登入，另一個帳號不許登入，那要如何搞呢？可以這樣搞喔：
    [root @test root]# vi /usr/local/apache2/conf/httpd.conf
    在這個檔案的設定中，請特別留意設定的地方，不要設定錯誤地方，
    一般而言，新的咚咚可以加在最後面一行開始，比較不會搞錯地方！
    加入底下這幾行：
    <Directory "/usr/local/apache2/htdocs/protect">
        AuthName "Protected Directory"　　　　　　　　　#這個是顯示在視窗上面的提示字元
        AuthType Basic　　　　　　　　　　　　　　　　　#這個則是認證的類型！就選Basic即可，Apache的預設功能
        AuthUserFile /usr/local/apache2/apache.passwd　 #密碼檔放置的地方啦！完整的目錄與檔名
        require valid-user　　　　　　　　　　　　　　　#允許的使用者，valid-user為任何一個在認證檔案當中的帳號皆可
        #require user test　　　　　　　　　　　　　　　#若將 # 移除，則表示只有 test 才是可以登入的帳號！
    </Directory>
    真的很簡單啦！就只要上面的四行設定內容就夠了！ AuthName 就是在出現要你輸入ID與密碼的那個提示字元啦！至於誰可以登入呢？以上面的說明為例，當設定為 valid-user 時，表示任何在認證檔案中出現的使用者都接受登入，至於如果是 require user test 那一行，則表示可以登入者僅有 test ，如果有兩個以上呢？可以寫成『 require user test qqq 』的樣式喔！

  4. 重新啟動與測試：
    這個不用再講了吧？！：
    [root @test root]# /usr/local/apache2/bin/apachectl stop
    [root @test root]# /usr/local/apache2/bin/apachectl start
    測試怎麼測試？直接連上網頁吶！在網址列輸入：『http://your.host.name.or.IP/protect/test.html』然後應該就會出現：

    看到那個 Protected Directory 的字眼了吧！那就是 AuthName 囉！然後使用者名稱與密碼即是我們剛剛建立的密碼檔之內容啦！認證網頁設定成功！恭喜喔！
.htaccess 檔案與 AllowOverride 設定的用途：
從頭到現在有的學的吧？ ^_^ 粉累喔！呵呵！尤其最累的是，如果萬一你真的設定好了一個 Apache ，而且也真的很高興的對外開放了！那麼你是否會注意到一件事情，那就是，萬一你有 20 的使用者，每個使用者都要求由他設定自己風格的家目錄，亦即他們想要自己設定自己的認證網頁，想要自行管理自己的 Apache 底下的其他功能，怎麼辦？由於有關 Apache 的設定就一定需要：
  1. 修改 httpd.conf這個檔案；
  2. 然後再重新開機，好讓設定的結果可以正確的顯現出來！
如此一來的話，難道：
  • 我就要把 root 的密碼給他們嗎？好讓他們可以自行修改 httpd.conf ？如此一來的話，不就粉危險，而且，難保 A 君的設定被 B 君不小心給修改了∼哇！真是傷腦筋∼
  • 我就要一個一個的幫他們修改嗎？誰來就要幫誰改，難道改天我有 200 的使用者時，若一天分配給一個人，我就要改 200 天的 Apache ，豈不討厭∼
這不是很累嗎？呵呵！這個時候， .htaccess 的檔案就『英雄有用武之地』咯！這個檔案的最大功能就是『可以取代 httpd.conf 裡面，對於這個 .htacces 所在目錄的設定內容！』也就是說，如此一來，每個目錄下的 .htaccess 可以讓該目錄擁有相關的權限、風格等等的設定！如此一來， root 也就不會這麼累了，並且，修改完這個檔案之後，也不需要重新開機ㄋㄟ！棒吧！ ^_^，不過，到底 .htaccess 這個檔案可以工作的內容有哪些呢？呵呵！這個時候，可就需要 AllowOverride 在 httpd.conf 裡面的設定來規定囉！所謂的 AllowOverride 說的是『允許取代某些設定內容』的意思，而這個 AllowOverride 可以取代的資料有：
  • Options：就是允許自行設定一些網頁參數，例如 Index, ExecCGI....等等
  • AuthConfig：就是網頁認證的設定內容啦！
  • Limit：就是上面我們提到過的關於安全的設定咯！
  • All：上面的規定都可以允許 .htaccess 裡面來設定
  • None：上面的規定都不許由 .htaccess 來規定！
如果你想讓 .htaccess 這個檔案有最大的取代內容時，可以選擇 AllowOverride All，若僅想讓這個檔案具有取代網頁認證的功能，那麼就可以使用 AllowOverride AuthConfig 即可！
舉個例子來說，剛剛我們設定 /usr/local/apache2/htdocs/protect 為保護目錄，需要做的事情最重要的為設定 httpd.conf 這個檔案，並且需要設定有的沒的一大堆，好了，現在假如我想讓所有的 user 都能自行在自己的家目錄內進行？怎麼利用 .htaccess 這個風格檔案呢？這其中當然涉及了(1)root 對於 httpd.conf 的設定以及(2)一般身份使用者對於自己家目錄下的設定！好了，現在我們分別以兩種身份來設定自己家目錄下的咚咚，以 test 這個使用者為例好了，來看看怎麼使用認證網頁在一般使用者家目錄下！

        關於 root 的設定項目：

0. 先確認底下這些資訊可以在您的 httpd.conf 裡面發現：
[root @test root]# cd /usr/local/apache2/conf
[root @test conf]# vi httpd.conf
AccessFileName .htaccess <==表示你的設定檔案的檔名！
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
上面這個資訊主要就是定義出你在某個目錄底下有個控制檔案，那個檔案的檔名啦！

1. 建立讓每個使用者家目錄下都能自行設定 AuthConfig 的規則！
[root @test root]# vi /usr/local/apache2/conf/httpd.conf
在一個新的角落(可以在最後一行加入)加入底下的字眼
<Directory "/home/*/public_html/">
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
上面的說明是：在每個使用者家目錄下，都可以使用 AuthConfig 的設定
在 .htaccess 這個檔案中！設定完畢之後重新啟動 Apache
3. 重新啟動 Apache 囉！
[root @test root]# /usr/local/apache2/bin/apachectl stop
[root @test root]# /usr/local/apache2/bin/apachectl start

        關於一般身份使用者 (test 為例) 的設定項目：

0. 以一般身份使用者登入，或者使用 su 轉換 test 的身份
[root @test root]# su test

1. 建立保護目錄與網頁內容
[test @test test]$ mkdir public_html
上面說明的是我要建立 test 底下的一個名為 public_html 的目錄！
還記得上面提到的個人首頁的設定吧！對啦！這個 public_html 請依你的規定設定！
此外，這個 test 必需已經存在你的 /etc/passwd 當中了！
[test @test test]$ cd public_html
[test @test public_html]$ mkdir protect2; cd protect2
[test @test protect2]$ echo "protect2 web page" > testing.html
上面可以建立目錄與網頁內容喔！

2. 建立 test 自己的密碼檔
[test @test test]$ htpasswd -c /home/test/apache.passwd test
New password:
Re-type new password:
Adding password for user test
在 /home/test 底下建立密碼記錄檔，檔名 apache.passwd ，
並且建立起一個名為 test 的使用者！

3. 建立 .htaccess 檔案的內容！
[test @test protect2]$ vi .htaccess
加入底下的字眼：
# This file is used to test the .htacces function
AuthName "Protect test by .htaccess"
Authtype Basic
AuthUserFile /home/test/apache.passwd
require user test
不論你信不信，這個時候當你要進入 http://your.host.name/~test/protect2/testing.html
就需要有認證密碼才行了！很快樂吧！

趕快去測試看看吧！這樣對於 Root 來說，是比較輕鬆一點，對於使用者來說，可以使用的規範也比較多樣化！但是，衍生出來的安全問題，可能就需要大家共同的維護了！當然啦，你也可以使用 AllowOverride 來設定更多 .htaccess 可以規範的項目呢！
防火牆
一句老話啦！就是『如果你的 Server 不能動，但是確定設定都沒有問題，那麼除了持續查詢 log file 之外，最大的可能就是防火牆擋住了！』這句話應該沒有什麼太大的疑問才對∼所以呢，萬一你的 Apache 不能動，那麼請看看你的防火牆設定規則吧！因為防火牆我們已經提過了，請參考『簡易防火牆設定』一文，這裡不再贅述！
登錄檔分析與其重要性：
無論怎麼說，登錄檔永遠是相當重要的！尤其是在 /var/log/httpd 裡面的 error_log 這個檔案！因為：
  1. 他記錄了所有試圖進入你主機讀取 apache 的網頁資料，但是卻失敗的所有紀錄，
  2. 此外，如果你的 Apache 設定錯誤，那麼問題也是記錄在這個檔案中；
而至於其他相關的檔案，嘿嘿！那個 /var/log/httpd/access_log 檔案也需要注意一下，因為他記錄了所有來自 Client 端的 IP 以及其他相關的讀取資料之訊息！這個檔案對於未來分析你的 Apache ( WWW )被讀取網頁的所有紀錄喔！相當的重要的啦！
syslog 與 logrotate：
首先針對 Apache 的設定檔當中，要注意的就是那個 syslog 與 logrotate 囉！詳細的資訊可以參考一下底下這一篇：
認識登錄檔
好了，那麼你的 syslog 應該要怎麼設定呢？因為我們畢竟是使用 tarball 安裝的，所以根本就沒有所謂的 syslog 的設定，不過，這個不需要擔心，這是因為 Apache 裡面本來就有 syslog 的設定存在了！所以，這點我們不需要重新來設定啦！只要記得你的登錄檔目錄是在哪裡就可以啦！目前我的登錄檔與 pid file 是在：
  • /var/log/httpd/access_log
  • /var/log/httpd/error_log
  • /var/log/httpd/pid
然後，我的 logrotate 的紀錄目錄在 /etc/logrotate.d 裡面，因此，我就在裡面新增一個檔案，稱做是 apache，你可以這樣做：

[root @test root]# cd /etc/logrotate.d
[root @test logrotate.d]# vi apache
新加入這幾行
/var/log/httpd/access_log /var/log/httpd/error_log {
rotate 4
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/log/httpd/httpd.pid 2>/dev/null` 2> /dev/null || true
endscript
compress
}

如果不知道上面的每個資料代表的意義，還是請前往 認識登錄檔 一文喔！然後趕快試看看是否可以執行 logrotate 呢？
logrotate -f /etc/logrotagte.conf
呵呵！這樣就對啦！那麼為什麼要加入這個 logrotate 呢？這是因為，未來，如果你的 WWW 伺服器越來越大時，那麼應該 access_log 檔案會『很可怕的大！』例如目前本小站的流量每週可以造成我的登錄檔長大到 400MB 以上∼如果不將他 rotate 的話，哈哈！不出幾個星期，我的硬碟就爆了∼所以， logrotate 是很重要的喔！
Web Analyser
如果我想要知道最近有誰曾經來我的網頁上面逛過，以及該使用者使用的是什麼樣的作業系統呢？該怎麼看？！很簡單吶！直接跑到 /var/log/httpd/access_log 這個檔案裡頭去瞧一瞧就知道啦！裡面的紀錄有點像這樣：

192.168.1.11 - - [27/Dec/2002:00:20:24 +0800] "GET /manual/ HTTP/1.1" 200 7340
  來源 IP　　　　　　　日期與時間　　　　　　 　動作與網頁　　　　　 動作代碼

立刻可以知道在何時，那個 IP 對於本機的動作是什麼，以及是否有成功？很清楚對吧！所以我們可以藉由這個檔案知道我們的主機被利用的狀態！但是，如果像我的主機一樣，一下子就有 400 多 MB 的檔案，您要怎麼分析？看都看不完ㄋㄟ∼呵呵這個時候，就需要使用 Shell scripts 的幫助啦！你可以自行寫一個適合您自己的分析工作，來進行解析的行為！不過，由於目前網路上已經有很多的好用的 Web 分析的工具啦！所以呢，我們只要進行他的安裝即可喔！很方便吧！底下我們介紹幾個好用的 Web 分析工具來給大家瞧一瞧！
  • Webalizer 網頁分析工具

    • 官方網站：http://www.mrunix.net/webalizer/
    • 設定難度：簡單，極適合新手架設
    • 軟體特色：大致上，所有分析的內容他都有了！雖然圖表比較沒有那麼炫...
    • 授權模式：GPL

    這個是很不錯，也且功能也都很完備的一個網頁分析軟體！不論是在安裝與設定上面，都是粉簡單的ㄋㄟ∼所以才說他是極適合新手來安裝的一個軟體吶！此外，由於他是 GPL 授權碼的軟體，所以呢，嘿嘿！很快樂的下載吧！請趕快到官方網站下載一下囉！

    整個安裝流程上面很簡單，最重要的地方只有在設定的一些小步驟需要留意而已，好了，廢話不多說，我們直接來安裝與測試一下，就知道他是怎麼回事啦！不過，在安裝與設定之前，你必須要先知道你系統裡面的 log file 在哪裡，以及未來要安裝在何處？！我的規劃是這樣的：

    • 我的 Apache 登錄檔案為 /var/log/httpd/access_log 這個檔案！
    • 預計直接將軟體安裝在 /usr/local 底下(Webalizer 提供了反安裝！)
    • 預計將輸出的內容傳導到 /usr/local/apache2/htdocs/webalizer

    好了，開始來下載、安裝與設定吧！你可以依照底下的網站來下載，不過不保證該檔案會繼續存在∼你也可以按『這裡』來下載檔案！

    0. 確認一些必須要的繪圖相關 RPM 已經安裝！
    因為這個套件需要 gd, zlib 與 png 才行，所以，你需要安裝這三個咚咚！
    在 Mandrake 9.0 當中，你所需要的套件在光碟中的名稱為：
    libpng3-devel-1.2.4-3mdk
    libpng3-1.2.4-3mdk
    zlib1-1.1.4-3mdk
    zlib1-devel-1.1.4-3mdk
    libgd1-1.8.4-6mdk
    libgd1-devel-1.8.4-6mdk
    至於在 Red Hat 7.2 當中，你要的套件名稱為：
    zlib-1.1.3-25.7
    zlib-devel-1.1.3-25.7
    libpng-devel-1.0.14-0.7x.3
    libpng-1.0.14-0.7x.3
    gd-1.8.4-4
    gd-devel-1.8.4-4
    請一定要安裝喔！不然肯定無法安裝這套軟體的！

    1. 下載軟體：可以直接到官方網站，或者到我們網站上下載：
    [root @test root]# wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-10-src.tgz

    2. 安裝軟體，同樣的，到 /usr/local/src 下面解壓縮喔！
    [root @test root]# cd /usr/local/src
    [root @test src]# tar -zxvf /root/webalizer-2.01-10-src.tgz
    [root @test src]# cd webalizer-2.01-10
    [root @test webalizer-2.01-10]# ./configure --prefix=/usr/local \
    > --with-language=chinese
    [root @test webalizer-2.01-10]# make
    [root @test webalizer-2.01-10]# mkdir -p /usr/local/man/man1
    [root @test webalizer-2.01-10]# make install
    [root @test webalizer-2.01-10]# mkdir -p /usr/local/apache2/htdocs/webalizer
    這個時候系統就已經將軟體安裝在你的系統上囉！你看，很簡單吧！ ^_^

    3. 設定檔編修：
    由於 webalizer 的基本設定檔在 /etc/ 底下，不過你需要更改名稱之後才行動作！
    [root @test root]# cd /etc
    [root @test etc]# cp webalizer.conf.sample webalizer.conf
    [root @test etc]# vi webalizer.conf
    只要修改底下這幾個重要的資訊即可：
    LogFile　　　/var/log/httpd/access_log 　#這個就是你的 Apache 登錄檔完整路徑與檔名
    LogType　　　clf　　　　　　　　　　　　 #選擇 log file 的格式，就是 clf 這種啦！
    OutputDir　　/usr/local/apache2/htdocs/webalizer #當資料處理完畢之後，輸出的目錄
    Incremental yes　　　　　　　　　　　　 #當你的 logrotate 不是一個月一次時，必需設定！
    HostName test.vbird.idv.tw　　　　　 #輸出檔案的時候，顯示在最上方的主機名稱
    其他的則使用預設值就可以啦！很簡單的啦！

    4. 測試 Run 的結果
    [root @test etc]# webalizer
    Webalizer V2.01-10 (Linux 2.4.19) Chinese
    使用記錄檔 /var/log/httpd/access_log (clf)
    產生輸出於 /usr/local/apache2/htdocs/webalizer
    主機名稱是 'test.vbird.idv.tw'
    歷史記錄(history file)找不到…
    Previous run data not found...
    產生報表給十二月 2002
    Saving current run data... [01/09/2003 16:57:18]
    產生報表給一月 2003
    產生彙總報表
    儲存歷史記錄資訊
    2687 記錄 in 1.15 秒, 2336/sec
    瞧！這樣就是執行 OK 啦！然後規定一下，每天跑一次ㄋㄟ！

    [root @test etc]# vi /etc/crontab
    加入底下這一行：
    20 2 * * * root /usr/local/bin/webalizer
    說的是每天的 2:20 執行一次 webalizer 喔！

    接下來要測試啦，直接給他 http://your.host.name/webalizer 這個目錄的最後面那個 webalizer 跟上面你設定的 Output 的目錄有關，請依照你的主機剛剛的設定去規定他吧！結果呢？呵呵！你可以到我們的流量統計單去觀察一下就知道啦！畫面也是很不錯的囉！

      linux.vbird.idv.tw 主機流量統計表

    如此一來，你就可以很輕鬆的觀察你的主機的任何資訊囉！包括來自於其他地方的 IP ，網頁瀏覽數等等的！很棒吧！
  • awstats 網頁分析利器：

    • 官方網站：http://awstats.sourceforge.net/
    • 設定難度：較難，需要有點技巧！
    • 軟體特色：中文化的很完整，而且該有的都有了，相當炫的一個分析利器！
    • 授權模式：GPL

    這套軟體相當的不錯！很棒，他提供了 CGI 程式執行與指令列模式執行，不過，我個人不太喜歡使用 CGI 的模式，所以我是使用指令列模式來進行這個程式的圖形製作的！如果你是由官方網站下載新的版本來安裝的話，那麼底下的流程可能不是很適合你，目前我已經將一些需要修正的項目變更過，並且擺在我的網頁上面，如果有需要的話，可以『按這裡』來下載喔！

    1. 下載軟體：可以直接到官方網站，或者到我們網站上下載：
    使用瀏覽器將網站上面提供的資料拿回去！當然，你也可以直接到官方網站上面去下載最新的版本！
    假設你已經將資料捉回去，並且放置在 /root 這個目錄當中了，檔名為：
    awstats.tar.gz

    2. 安裝軟體：
    由於我已經將資料都丟在一起了，所以請到 /usr/local/apache2/htdocs 或者其他瀏覽器可以
    進入瀏覽的目錄下面，直接將上面捉到的檔案解壓縮即可！
    [root @test root]# cd /usr/local/apache2/htdocs
    [root @test htdocs]# tar -zxvf /root/awstats.tar.gz
    會產生一個名為 awstats-5.3 的目錄喔！

    3. 設定檔編修：
    這個設定檔比較奇怪一點，他一定是 awstats.{your.hostname}.conf 的格式，所以，以我為例，
    我的主機名稱為 test.vbird.idv.tw 好了，那麼就可以取名為 test ，所以，
    [root @test htdocs]# cd /usr/local/apache2/htdocs/awstats-5.3
    [root @test awstats-5.3]# cp awstats.HOSTNAME.conf awstats.test.conf
    [root @test awstats-5.3]# vi awstats.test.conf
    只要編輯前面幾行就夠了！
    LogFile="/var/log/httpd/access_log" # Apache 的登錄檔，請依你的設定寫入！
    SiteDomain="test.vbird.idv.tw" # 你的主機名稱，請修改吧！
    HostAliases="localhost 127.0.0.1 192.168.1.2" # 主機還有別名的話，請將他加入！
    DirIcons="/awstats-5.3/icons" # The output's icons
    DirCgi="/awstats-5.3"
    DirData="/usr/local/apache2/htdocs/awstats-5.3/data" # The output directory
    DNSStaticCacheFile="/usr/local/apache2/htdocs/awstats-5.3/cache/dnscache.txt"
    DNSLastUpdateCacheFile="/usr/local/apache2/htdocs/awstats-5.3/cache/dnscachelastupdate.txt"
    再改一個小地方
    [root @test awstats-5.3]# vi awstats.sh
    cd /usr/local/apache2/htdocs/awstats-5.3
    ./awstats.pl -config=test -update -output > awstats.html
    路徑名稱與 config 後面接的你剛剛 copy 的那個檔案的檔名(中間部分的名稱)

    4. 修改一下 httpd.conf 的設定內容：
    [root @test awstats-5.3]# vi /usr/local/apache2/conf/httpd.conf
    在最後一行給他加入底下的咚咚：
    <Directory "/usr/local/apache2/htdocs/awstats-5.3">
    AddHandler cgi-script .cgi .pl
    AllowOverride AuthConfig
    Options +ExecCGI
    </Directory>
    [root @test awstats-5.3]# /usr/local/apache2/bin/apachectl stop
    [root @test awstats-5.3]# /usr/local/apache2/bin/apachectl start

    5. 測試 Run 的結果
    [root @test awstats-5.3]# cd /usr/local/apache2/htdocs/awstats-5.3
    [root @test awstats-5.3]# ./awstats.sh
    [root @test awstats-5.3]# ls -l data
    -rw-rw-rw- 1 root root 4776 Jan 10 14:46 awstats012003.test.txt
    如果有看到類似上面的檔案出現在 data 當中，哈哈！那就是成功啦！

    6. 設定每日執行！
    [root @test root]# vi /etc/crontab
    加入底下這一行：
    25 03 * * * root /usr/local/apache2/htdocs/awstats-5.3/awstats.sh

    這樣也就修改妥當囉！詳細的圖形示意圖可以參考： http://awstats.sourceforge.net/cgi-bin/awstats.pl 相當的不賴吧！趕快試看看！
虛擬主機架設：
  • 什麼是虛擬主機 ( Virtual Host )？
    咦！虛擬主機是什麼東西吶！怎麼說的好像很神奇的樣子呢？他有什麼功能？為什麼大家都想要玩一下虛擬主機吶？呵呵！所謂的虛擬主機，基本上，就是『讓你的一部主機上面，有好多個"主網頁"存在，也就是說，硬體實際上只有一部主機，但是由網站網址上來看，則似乎有多部主機存在的樣子！』，舉個例子來說好了，你可以由我的網頁上面知道一件事情，那就是我的 WWW 主機其實只有一部，那就是 pc510.ev.ncku.edu.tw 。不過，我這部主機其實有很多個 Domain name 存在，例如 linux.vbird.idv.tw 與 phorum.vbird.idv.tw 這兩個網址。不過，上面這兩個網址其實也同時指到 pc510.ev.ncku.edu.tw 這部機器上面，亦即是 pc510.ev.ncku.edu.tw, linux.vbird.idv.tw, phorum.vbird.idv.tw 這三個不同的主機名稱，其實都是指向同一部電腦主機！你可以在你的 Linux 機器上面以 nslookup 的指令搜尋一下這三個主機名稱，你就曉得為什麼了！但是，當你在瀏覽器上面輸入：

    • http://pc510.ev.ncku.edu.tw
    • http://linux.vbird.org
    • http://phorum.vbird.org

    怪了！怎麼會顯示不同的網頁內容呢？好像是存在三部主機對吧！呵呵！這就是所謂的虛擬主機啦！讓你的一部機器上面，搞的好像好多部同的主機一樣的一個簡易的功能啦！ ^_^

  • 架設的大前提：
    那麼要架設虛擬主機需要什麼咚咚呢？呵呵！以剛剛我的網站的結果為例，我要架設三個主網頁，也就是必須要有多個 domain name 囉！對啦！這就是虛擬主機的大前提啦！『你必須要有多個主機名稱，亦即是需要多個 domain name, FQDN 』，例如上面我就具有三個 domain name 囉！在需要多個 domain name 的情況下，你可以做的方式就是：

    • 申請多個 host name 在 ISP 的管理上面；
    • 自行設定經過合法授權的 DNS 主機來自行設定自己的 domain name ！

    沒錯，就是這幾個方法，因此，請確定你的主機名稱已經搞定了！不然的話，怎麼架設虛擬主機呢？您說是吧！ ^_^

  • 實際架設：
    好了！又要來搞設定啦！又是 httpd.conf 這個檔案啦！反正幾乎只要跟 Apache 有關的，就是動這個檔案就對啦！這裡先來說一下我的大前提設定囉！

    • 已經設定好了三個 domain name ，分別是 mdk90.vbird.org, www.mdk90.vbird.org, phorum.mdk90.vbird.org ，此外，這三個網域的主網頁個別放置在 /home/mdk90, /home/www.mdk90, /home/phorum.mdk90 ，亦即是：
      • mdk90.vbird.org --> /home/mdk90
      • www.mdk90.vbird.org --> /home/www.mdk90
      • phorum.mdk90.vbird.org --> /home/phorum.mdk90
至於這個設定嘛！真的是很簡單耶！只要幾行就搞定了，設定完成之後還會讓你偷笑ㄋㄟ∼呵呵！看看實例吧！

[root @test root]# cd /usr/local/apache2/conf
[root @test root]# vi httpd.conf
在這個檔案的最下方加入底下這些字眼！

NameVirtualHost *　　　　 # 設定你的虛擬主機判定的依據！這裡是＊ 亦即是
                          # 所有連上這部機器的名稱都會被使用來當作虛擬主機的設定之用！

<VirtualHost *>
ServerName mdk90.vbird.net
DocumentRoot /home/mdk90
</VirtualHost>

<VirtualHost *>
ServerName www.mdk90.vbird.net
DocumentRoot /home/www.mdk90
CustomLog /var/log/httpd/www.access_log combined # 特別將登錄檔額外分離出來
</VirtualHost>

<VirtualHost *>
ServerName phorum.mdk90.vbird.net
DocumentRoot /home/phorum.mdk90
</VirtualHost>

要注意的是：
  1. 在虛擬主機的設定上還有很多的可用的功能，不過，最低的限度是需要有 ServerName 及 DocumentRoot 這兩個即可！
  2. 雖然原來我就有 mdk90.vbird.net 這個網域，但是因為設定了虛擬主機之後，自己的原來名稱可能會不見去，所以，這裡必須將自己的名稱也寫入才行！
  3. 上面有發現一個 CustomLog 的設定喔！該設定會讓以 www.mkd90.vbird.net 這個網域登入的登錄檔不再寫入原來的 /var/log/httpd/access_log 檔案，而是自行寫入 /var/log/httpd/www.access_log 這個檔案！
馬上測試看看！呵呵！會發現，咦！我真的有三個主網頁了哩！很不錯吧！這個作法可以讓你的 WWW 網頁更有靈活度喔！舉個例子來說，前一陣子因為酷學園討論區常常掛點，所以我就自告奮勇的跟站長說，只要將 phorum.study-area.org 這個 domain name 指向我的主機 IP ，那麼也可以直接進入我的討論區，如此一來，只要修改一下 DNS 即可轉換到我的討論區啦！並且不需要再進行任何額外的設定！對於網頁維護的靈活度是真的很有幫助的喔！

  • 需要注意的事項：

    虛擬主機並沒有什麼值得特別注意的地方，只要設定正確，大致上就不會有太大的問題！不過，你可能需要特別注意剛剛我們建立起來的新的登錄檔喔！為什麼呢？我們上面不是提過說，登錄檔在大型的網站上面成長的幅度是很可觀的嗎？所以需要進行 logrotate ，但是你剛剛建立的檔案並不在原本的 logrotate 檔案之內呀！呵呵！這個時候請自行加入 logrotate 個手續喔！否則.....嘿嘿嘿嘿！硬碟空間被用光可不要怪鳥哥喔！ ^_^
    • 客戶端的文字介面 Web 功能：
    什麼！？客戶端竟然也有文字介面的瀏覽器？！哈哈！當然是有啦！不然這裡幹嘛要介紹？！那就是鼎鼎大名的 lynx 以及 wget 囉！請注意的是，這兩個套件並不一定會在安裝的時候就已經安裝在你的系統中，所以請先使用 RPM 查詢一下他是否存在於你的系統當中，然後才能執行喔！他的用途是：
    • lynx：文字介面的瀏覽器，相當的輕巧與快速！
    • wget ：文字介面下使用來擷取檔案的指令！
    這兩個指令之前已經介紹過了！請大家按一下連結，前往觀察一下囉！加油啦！
    增強 PHP 程式碼執行速度的模組：
    • MM Cache 增強速度模組：

      我們上面的介紹都是在於安裝與架設 LAMP 伺服器(Linux + Apache + MySQL + PHP )，不過，如果您曾經瀏覽過 PHP 的網頁時，或許會發現：『咦！怎麼 PHP 的速度慢慢的.....』，這是怎麼一回事啊！？PHP 不是號稱速度上面的反應是很快速的嗎？怎麼會慢慢的呢？這是由於 PHP 的程式碼去呼叫了太多的函式庫，而這些函式庫每次呼叫的時候都需要由硬碟讀出來，唉啊！硬碟可是粉慢速的儲存介面啊！那怎麼辦呢？有沒有辦法提升 PHP 的執行速度啊？！呵呵！當然是有啊！如果我們可以將這些在硬碟裡面的函式庫先讀到快取記憶體中( Cache )，由於記憶體的速度可比硬碟快多了！如此一來的話，當然可以提升不少速度囉！呵呵！這個時候就需要感謝我們一些 GPL 上面的偉大的團體了！這裡我們介紹一款授權在 GPL 上面的可以對 PHP 程式碼進行快取並且予以優化的軟體，那就是 MM Cache 囉！他的官方網站在：http://www.turcksoft.com/en/e_mmc.htm。目前 MM Cache 已經出到了2.3.9 ( 2003/04/10 釋出)，不過，他僅在 PHP 4.1 以上版本以及 Apache 1.3 與 2.xx 版本測試過，如果你的 Apache 與 PHP 不是這些版本，那就抱歉啦！不一定可以使用的！不過，呵呵！我們上面提供的 Tarball 的安裝方法本來就是這樣的版本，所以您可以輕易的安裝好 MM Cache 喔！廢話不多說，趕緊來安裝吧！

      • 下載：
        你可以在官方網站下載最新的版本(http://www.turcksoft.com/en/e_mmc.htm)，也可以在我們網站下載鳥哥試過的版本：
        http://linux.vbird.org/download/index.php#www_mmcache

      • 安裝：
        安裝 MM Cache 真的是很簡單喔！趕緊來安裝吧！
        [root @test root]# cd /usr/local/src
        [root @test src]# tar -zxvf /完整路徑/turck-mmcache-2.3.9.tar.gz
        會產生一個名為 turck-mmcache-2.3.9 的目錄

        [root @test src]# cd turck-mmcache-2.3.9
        [root @test turck-mmcache-2.3.9]# phpize
        這個指令是 PHP 套件所提供的！可以建置好你的 mmcache 原始碼

        [root @test turck-mmcache-2.3.9]# ./configure --enable-mmcache=shared
        [root @test turck-mmcache-2.3.9]# make && make install
        這個動作會編譯一個名為 mmcache.so 的動態函式庫模組，
        並且會主動的將他安裝在 /usr/lib/php4 這個目錄當中！
        這樣就安裝完畢了！很簡單吧！

      • 設定：
        在 MM Cache 的設定方面需要更動兩個地方，第一個是動態函式庫載入的設定，第二個則是 PHP 的設定！
        1. 設定主動載入動態函式庫模組：
        [root @test root]# vi /etc/ld.so.conf
        #在這個檔案內加入底下這一行：
        /usr/lib/php4

        [root @test root]# ldconfig
        上面這兩個步驟比較有趣一點，在 ldconfig 這個指令的功能是：
        『載入動態函式庫到記憶體當中做為快取』之用，至於載入的動態函式庫則是
        根據 /etc/ld.so.conf 這個檔案的設定為準！這的動作只要第一次設定時進行
        即可，未來在開機完成之後，系統會主動的載入動態函式庫的！
        另外請注意， ld.so.conf 裡面只要寫『目錄』即可！

        2. 修改 php.ini
        請注意，由於每個人的 php.ini 都不相同，例如使用 RPM 安裝者，應該是
        /etc/php.ini ，但是我上面的安裝設定卻是 /usr/local/php4/php.ini
        請依照您的主機來設定喔！
        [root @test root]# vi /完整路徑/php.ini
        在這個檔案的最後一行加入底下這幾行：
        ;;;;;;;;;;;;
        ; MM Cache ;
        ;;;;;;;;;;;;
        extension="mmcache.so"
        mmcache.shm_size="16"
        mmcache.cache_dir="/tmp/mmcache"
        mmcache.enable="1"
        mmcache.optimizer="1"
        mmcache.check_mtime="1"
        mmcache.debug="0"
        mmcache.filter=""
        ; end of mmcache

        3. 建立快取目錄：
        [root @test root]# mkdir /tmp/mmcache
        [root @test root]# chmod 0777 /tmp/mmcache

        4.重新啟動 Apache
        [root @test root]# /etc/rc.d/init.d/httpd restart
        或
        [root @test root]# /usr/local/apache2/bin/apachectl restart
        這樣一個簡單的小步驟，嘿嘿！您的 PHP 程式碼的反應性∼啊∼增快很多很多喔！ ^_^

    • Apache 的效能測試

      事實上，安裝 Apache 的時候，Apache 就已經提供了一個效能測試 ( benchmark ) 的軟體了！那就是 ab 這個程式！怎麼用呢？就直接用啊！

      [root @test root]# /usr/sbin/ab [-dSk] [-c number] [-n number] 網頁.php
      參數說明：
      -d ：不要顯示 saved table 的百分比資料；通常不要那個資料，所以會加 -d
      -k ：還記得上面的 KeepAlive 吧！加入 -k 才會以這樣的功能測試；
      -S ：不顯示長訊息，僅顯示類似 min/avg/max 的簡短易懂訊息！
      -c ：同時有多少個『同時連線』的設定(可想成同時連線的 IP )
      -n ：同一個連線建立幾個要求通道！(可想成同一個 IP 要求的幾條連線)
      更多的訊息請自行 man ab 喔！
      範例：
      [root @test root]# /usr/sbin/ab -dSk -c100 -n100 \
      > http://linux.vbird.org/home.php
      This is ApacheBench, Version 1.3d <$Revision: 1.67 $> apache-1.3
      Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
      Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

      Benchmarking linux.vbird.org (be patient).....done
      Server Software: Apache/1.3.27
      Server Hostname: linux.vbird.org
      Server Port: 80

      Document Path: /home.php
      Document Length: 51736 bytes

      Concurrency Level: 100
      Time taken for tests: 1.648 seconds
      Complete requests: 100
      Failed requests: 0
      Broken pipe errors: 0
      Keep-Alive requests: 0
      Total transferred: 5795454 bytes
      HTML transferred: 5775070 bytes
      Requests per second: 60.68 [#/sec] (mean)
      Time per request: 1648.00 [ms] (mean)
      Time per request: 16.48 [ms] (mean, across all concurrent requests)
      Transfer rate: 3516.66 [Kbytes/sec] received

      Connnection Times (ms)
      min avg max
      Connect: 52 309 369
      Processing: 467 687 1079
      Total: 467 996 1405

      這樣就能夠瞭解您的 Apache 效能了！因為我是在本機上面測試的，所以速度上面當然是很快囉！建議可以到遠端同樣使用 ab 來測試一下你的 Apache 效能，尤其是加上了 mm cache 之後，看看能不能增快速度呢？ ( 註：這個 ab 程式對於讀取 MySQL 之類的網頁似乎沒有辦法成功的完成測試的樣子，所以請不要使用 phpBB2 的網頁來測試喔！盡量直接以 PHP 的網頁來測試！ ) 嘿嘿！
    砍站軟體與 Nimda 病毒的抵擋 scripts：
    幾個比較知名的網站管理員大概都有這樣的困擾，那就是網站常被砍站軟體所強力下載，結果造成主機的 CPU loading 過重，最後竟然會導致死掉∼唉！真是的∼人怕出名豬怕肥吶！先來解釋一下什麼是砍站吧！所謂的『砍站』，就是以類似多點連線下載的持續性訊息傳遞軟體進行網站資料的下載，而且，一啟用該軟體，該軟體就將『整個網站』的內容都給他 download 下來，很厲害吧！沒錯！是很厲害，但是卻也害死人了∼怎麼說呢？因為這種軟體常常會為了加快 download 的速度，所以採用多點連線的方式，也就是會持續不斷的向 Server 發出要求封包，而由於這些封包並不見得能夠成功的讓 Server 把資料傳導給 Client 端，常常會無法投遞就是啦！這樣的結果就是.....造成 Server 要一直不斷的回應，又無法正確的回應出去，此外，要求太過頻繁，結果主機應接不暇，最後....就當機了...真的是林老師ㄌㄟ∼我們這個小站的主機古早以前，就是因為這樣的原因，導致服務常常斷斷續續的，並且，由於 CPU loading 太高，結果讓正常連線進來看資料的網友沒有足夠的資源，因此網頁開啟的速度就變的很慢∼唉∼這些砍站的人，也太不道德啦！
    由於這種砍站軟體真的很麻煩，一不注意馬上就又會被砍站而當機，三天兩頭就要重新開機一次，完全讓 Linux 的穩定性無法發揮！真是氣死了∼後來，我就自行寫了一個 scripts 來擋這樣的 IP ！我的作法是這樣的：
    1. 由於砍站軟體要多點連續下載，因此，同一個 IP 在同一個時間內，會有相當多的連線發生；
    2. 由於他是重複不斷的要求連線，因此剛剛建立的連線在達成下載的目的後，會立刻死掉，而又多生出其他的連線出來，因此，這個時候他的連線情況就變的相當的不正常了！
    3. 由於某些較舊的砍站軟體並不會『欺騙』主機，所以，會在主機的登錄檔裡面記錄住 Teleport 的標記！
    4. 既然如此的話，那麼我就讓我的主機每分鐘去檢查兩個東西(1)先檢查 log file ，如果有發現到相關的 Teleport 字詞，就將該 IP 抵擋掉；(2)使用 netstat 來檢查同一個 IP 的同時連線，如果該連線超過一個值(例如同時有 12 個連線)的話，那麼就將該 IP 抵擋掉！
    5. 此外，由於上面的方案可能會將 Proxy 的 Client 端也同時抵擋掉，真是可憐啊！這個時候，這支程式就會主動的將(1)的情況的主機抵擋 3 天，至於(2)的情況則抵擋2小時！過了該抵擋的時限後，該 IP 即可又連上我們的主機了！
    大致上就是這樣吧！這樣的一程式需要與 iptables 相互配合，所以，請先查閱一下簡易防火牆設定那一篇文章，然後再來下載這支程式吧！這支程式您可以在底下的網址下載喔！
    http://linux.vbird.org/download/index.php#http-netstat.sh
    詳細的安裝步驟我已經以中文寫在該檔案裡面了，所以請先查看一下該檔案的前面說明部分吧！此外，Study Area 的 netman 大哥也已經開發了一套很棒的防砍站的程式了！在防堵砍站的原理上面是完全相同的，不過寫法可能不是很雷同就是了！如果有需要的話，也可以前往 Study-Area 搜尋一下囉！
    http://phorum.study-area.org/viewtopic.php?t=13643
    安裝 phpBB2 討論板：
    上面這樣一路走來，哈哈！終於我們的 LAMP 伺服器就已經大致上搞定啦！那麼接下來你可以利用這個 WWW 主機幫你做什麼事呢？嗄！能作的事情可多囉！目前很多支援 PHP 的架站軟體已經被很完整的開發了，例如 PHPNuke 以及鳥哥很喜歡的 phpBB 呢！這些架站軟體都是建構在 LAMP 上面的，而既然我們的 LAMP 已經搞定了，那麼其他的架站軟體的安裝就真的是相當的快速呢！底下介紹 phpBB 的安裝！你可以到底下的連結去看看喔：
    • phpBB 官方網站：http://www.phpbb.com/
    • phpBB 正體中文網站『竹貓星球』：http://phpbb-tw.net/phpbb/
    • 簡易 phpBB2 的安裝與設定方法：
    上面最後一個是鳥哥前一陣子寫的，目前已經有出較新版本的 phpBB2 囉！所以，請記得到官方網站下載最新的 phpBB 來安裝喔！畢竟比較新的不但功能比較多，而且臭蟲(Bug)也清理的差不多了！另外，由竹貓星球的竹貓三兄弟也有出一本『phpBB 論壇架設寶典』，裡面也有提到相當多的有用的架站心得與技巧的說明！有興趣的可以先到竹貓星球看看其風格與內容，然後再考慮要不要架站吧！ ^_^目前我對 phpBB 倒是蠻喜歡的！
    問題討論：
    • 怪了！怎麼我按照上面文章的設定，設定了底下的咚咚，但是卻還是無法顯示中文？為什麼？
      AddDefaultCharset Big5
      LanguagePriority tw en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv
      答：
        一般而言，按照上面的設定來編寫 httpd.conf 這個檔案的內容之後，就可以正確無誤的顯示中文字碼才對∼但是很多朋友還是來信說到，怪了！怎麼會還是無法顯示中文呢？研究了一下其中的原因，發現其實大家都有個錯誤的用法啦！就是因為，目前的瀏覽器上面都有所謂的快取 ( Cache ) 功能，這個功能主要會將瀏覽過的網頁及其相關資訊，例如圖片、與最重要的網頁的紀錄等，先以檔案的型態儲存在電腦的硬碟中，若下次您在短時間內拜訪該網站時，那麼瀏覽器將會直接由硬碟 ( Cache ) 將資料拿出來使用，所以就不會再次到遠方讀取資料！這可以節省相當多網路流量頻寬，以及縮短等待的時間喔！不過，也由於如此，所以，你上次看到顯示亂碼的那個網頁，也就會被儲存在硬碟當中，因此，在你修改完成 httpd.conf 並且重新啟動 Apache 之後，再次瀏覽該網頁，仍然可能無法顯示出正確的中文的啦！就是因為你曾經瀏覽過啦！那麼要如何解決呢？
        1. 最簡單的方法就是按下『Reload, 重新讀入』，不過，因為有的瀏覽器是藉由『比對網頁資料與自己儲存的 cache 資料是否相同』來做為 cache 更新的依據，而由於你僅修改了 httpd.conf 這個檔案，對於網頁並沒有關係，因此，可能還是會顯示出不正確的中文字喔！
        2. 再來的方法就是『改檔案名稱！』，既然名稱已經跟硬碟的紀錄不一樣了，因此，該筆資料就會被重新讀取，自然就會更新囉！
        3. 不過，最有效的方法，還是直接將你的瀏覽器內的快取記憶體 ( Cache ) 清除掉就可以啦！以 IE 為例：點選『工具』選擇『Internet 選項』，按下『刪除檔案』就可以啦！不過，如此一來，你曾經瀏覽過的網頁的快取資料同時也會被清除掉就是了！
    • 傷腦筋吶！怎麼完全按照上面文章的方法，結果 Apache 與 MySQL 是啟動了，但是 PHP 就是無法啟動？害得我的 PHP 老是直接顯示出原始的檔案內容，而不是執行呢？
      答：
        這個問題並不會存在於舊版的 PHP 當中，只有新版的 PHP 才有此一問題！這與 php.ini 的設定有關啦其實，與 Apache 的設定可就沒有關係啦！解決的方法可以有兩種方式：
        1. 直接在你的 php 檔案中，在 <? 的地方，都改寫成 <?php 就可以啦！例如
          <?
          phpinfo( );
          ?>
          改成
          <?php
          phpinfo( );
          ?>
          就可以啦！
        2. 如果不想要這麼麻煩的話，可以直接修改 PHP 的設定檔，亦即是 php.ini 這個檔案，在我們上面文章的例子中，使用的是 /usr/local/php4/php.ini 這個目錄下的檔案，但如果是一般 distribution 提供的 PHP 的話，例如 Red Hat 8.0 ，那麼該檔案將會放置在 /etc/php.ini ，總之，請以搜尋的指令找出該檔案就對了！然後，以 vi 編輯該檔案，找到 short_open_tag 那一段，將該設定改成：
            short_open_tag = On
          這樣就可以不需要在 <? 右邊加上 php 而可以執行 PHP 囉！
    2003/01/14：第一次完成
    2003/01/18：新增問題討論：關於中文的說明
    2003/01/21：新增問題討論：關於 PHP 無法使用的問題說明
    2003/04/28：加入砍站軟體的程式說明
    2003/04/29：加入 PHP 原始碼程式優化模組 MM Cache 說明。
    2003/05/07：加入 ab 這個效能測試的說明！
    2003/05/30：使用 Tarball 安裝時常常發生一些困擾，加入 User/Group 的設定說明！
    2003/01/14 以來統計人數


設定 SAMBA 伺服器
最近更新日期：2001/09/17
什麼是 SAMBA 伺服器
區域網路設定
Linux 上的設定
Windows 上的設定

什麼是 SAMBA 伺服器
如果你已經依序一步一步的將你的 Linux 當作主機安裝好了，這時，你會不會覺得，Linux 跟你的日常工作的 Windows 電腦的互動不是很好呢？在這兩部機器之間的資料互傳必須經過 FTP 協定才能傳送，真麻煩！不是嗎？呵呵！這時， SAMBA Server 就是你的救星了！使用了 SAMBA Server 可以讓你的 Linux 與 Windows 透過『網路上的芳鄰』來互傳資料，安裝了 SAMBA 之後，從此，你的資料都可以使用『網路上的芳鄰』來傳送囉！真好！不是嗎？
應用實例一：以鳥哥為例，由於我都是使用 Windows 系統來編輯我的網頁畫面，然後再傳到我的 Linux 機器上。一開始，鳥哥也是以 FTP 來傳送我的網頁的，後來發現，這樣在我的 Windows 上面需要有一份網頁資料，然後修改完成之後又要傳到 Linux 上面，如此便有兩個相同的檔案，真是討厭！後來，鳥哥就安裝了 SAMBA 伺服器，將 Linux 上我的網頁目錄打開成可以資源分享，如此一來，鳥哥就可以直接透過 Windows 的『網路上的芳鄰』來修改我的網頁資料囉！
應用實例二：另外，在我的實驗室中，由於常常有比較大量的文件資料需要備份，然後我們研究室的電腦也不少，我就在我們 Linux 主機上，利用 SAMBA 開放一個大的磁碟空間，讓每個人都可以透過 Windows 的『網芳』將自己的資料傳上這部電腦來做為備份之用，這樣也比較容易備份的工作呀！

區域網路設定
要架設 SAMBA 之前，你得先將你的區域網路內的電腦連線架好，這可以分為兩部分來說明：
  • 硬體連線：基本上每部電腦都以 Hub 連接，並請注意你的網路線應該都是 RJ-45 接頭的平行線，連接的方式可以參考之前的『區域網路』說明。
  • 網路設定：除了硬體方面的連線需要注意之外，每一部 Windows 的電腦都需要在網路組態中設定以下的通訊協定：
    • TCP/IC
    • NetBEUI
    • IPX/SPX
    這些協定的設定方式你可以來這裡看看。
你必須先在 Windows 當中設定這些通訊協定之後，才有辦法連上所有其他的電腦呀！因此，請先設定你的區域網路吧！

Linux 上的設定
假設我們要分享 Linux 上面的網頁目錄（例如我們這個網頁的教學中，預設的網頁目錄是 /usr/local/apache/htdocs 這一個），並且，假設我們的 Windows 的 IP 為 192.168.1.11 這一個，而你的區域網路設定中，群組名稱為 VBIRDHOME ，Linux 主機的名稱為 vbird ，而 Windows 想設定為 VBird_windows，想要使用的人員為 vbird ，也就是：
  • Linux 主機對內 IP 為 192.168.1.2 而名稱為 vbird；
  • Windows 機器 IP 為 192.168.1.11 而名稱為 VBird_Windows；
  • 工作群組為 VBirdHome；
  • 欲分享的 Linux 目錄為 /usr/local/apache/htdocs；
  • 欲使用這部機器的人員為 vbird
上面注意一下，為了避免設定上的困擾，主機的名稱最好一定以主機名稱（就是你登入你的系統之後，在指令列中，顯示在 @ 之後的名稱，以我為例，我的 DNS 為 vbird.adsldns.org ，而主機名稱則為 vbird 囉）來設定，鳥哥曾經以不同的名稱設定，結果是...殘念....。那要如何設定呢？其實很簡單的！
  1. 修改 /etc/lmhosts 這個檔案：
    這個檔案的目的是列出你的區域網路中的所有 PC 的『IP』 與 『電腦名稱』，檔案有點像這樣：
    [root@tsai /etc]# vi /etc/lmhosts

    127.0.0.1 localhost
    192.168.1.2 VBird_Linux
    192.168.1.11 VBird_win2000

    你可以將上面的『127.0.0.1 localhost』這一行預設的主機名稱取消，這一行是 PC 中預設的遞迴網路，每部機器上都會有的喔！如果還有其他的機器，就一起加上去吧！
  2. 設定 /etc/smb.conf 主要設定：
    如果照我們剛剛的要求來設定的話，就會像這樣：
    [root@tsai /etc]# vi /etc/smb.conf
    底下為 smb.conf 這個檔案的主要內容

    [global]
client code page = 950
          <==這一行請自行輸入，可以看見中文！
workgroup = VBirdHome <==這裡輸入群組名稱（重要，需與你的工作群組相同）
server string = VBird's ADSL Server <==這裡只是說明列（不打緊）

security = user       <==這是說明密碼為使用者

    encrypt passwords = yes
    smb passwd file = /etc/smbpasswd
    上面這兩行很重要，請在 /etc/smb.conf 檔案中找到這兩行，
    並將前面的註解（;符號）拿掉！重要！

    以下是開啟使用者的家目錄與網頁目錄打開的意思
    [homes]
    comment = Home Directories
    browseable = no
    writable = yes

    [apache]
    comment = apache_home_page <==這是說明列
    path = /usr/local/apache/htdocs <==欲分享的目錄
    read only = no <==是否唯讀，設定為 no 則你在 windows 中可以讀寫！
    public = yes <==是否公開，是的，請公開！

    信不信，這樣就設定妥當囉！其他的設定都不用改變，只要自行增加上面的 client code page = 950 那一行，及 [apache] 後面那幾行，並將 encrypt passwords = yes 那兩行的註解拿掉，就 OK 喔！
  3. 測試 smb.conf 的語法：
    設定完了 smb.conf 之後，為了保險，請預先測試看看語法有沒有錯誤，請輸入：
    [root@tsai /etc]# testparm
    Load smb config files from /etc/smb.conf
    Processing section "[homes]"
    Processing section "[apache]"
    Processing section "[printers]"
    Loaded services file OK.
    Press enter to see a dump of your service definitions
    可以看到，在執行了 testparm 之後，系統告訴你，你總共開了三個資源分享，其中， home 與 printers 是預設的，只有 apache 是你新加的分享喔！（按 Enter 後就可以離開囉）
  4. 開始設定使用者密碼：
    我們是設定這部主機上有紀錄的使用者才可以使用這部主機的資源分享，如上面的設定，我們假設使用者為 vbird ，那樣的話，你要如何設定使用者呢？
    [root@tsai /etc]# touch /etc/smbpasswd <==這是建立密碼檔案的指令
    [root@tsai /etc]# chmod 600 /etc/smbpasswd <==將密碼變成只有 root 可讀寫
    [root@tsai /etc]# smbpasswd -a vbird <==增加 SAMBA 使用者 vbird
    New SMB password: <==輸入密碼
    Retype new SMB password: <==再一次輸入密碼
    Password changed for user vbird.
    可是要記得， vbird 必須已經在你的系統中登入為使用者了！
  5. 開始啟動 SAMBA 伺服器：
    啟動的方法真是簡單：
    [root@vbird /etc]# /etc/rc.d/init.d/smb start
    [root@vbird /etc]# setup
    選擇 System services 後，再選擇
    [*]smb
    如此一來，每次開機都會自動執行 SAMBA 囉！
    這樣就 OK 囉！沒錯，這樣就設定完成了！
  6. 設定使用者權限：
    好啦，剛剛我們不是已經設定要開放主機的網頁目錄嗎？就是 /usr/local/apache/htdocs 這個目錄，但是這個目錄應該是 nobody 的喔，而且權限大概只會開放到可讀與可執行，那樣的話，不就沒有辦法寫入或者更改檔案了嗎？別擔心，請將上面的檔案設成：
      chmod 777 /usr/local/apache/htdocs
    就可以了！不過要小心的是，如此一來大家都可能可以修改你的檔案了，不可不防喔！如果你要考慮的多一點時，可以將目錄的所有人設成是你自己（如上面例子，可以用 chown -R vbird:vbird /usr/local/apache/htdocs 來取代之），不過，仍要小心相關套件的配合喔！基本上，比較簡單的方法仍然是直接以 chmod 777 來做是比較快！

Windows 上的設定
好了，已經在 Linux 上面設定好了，區域網路也設定完成了，接下來就是直接使用網路上的芳鄰來連線了，不過，這裡有一些限制喔，請你需要注意一下，不然你一定連不上 Linux 的哩！
  • 你的 Linux 的 /etc/smb.conf 檔案中，設定的工作群組，必須與你的 Windows 內的工作群組相同；
  • 你在登入 Windows 的時候（就是開機畫面之後），一定要使用 smbpasswd 檔案中有的人名，以我為例，我必須以 vbird 登入我的 Windows 系統。
  • 在 /etc/lmhosts 檔案中，你的 Linux 主機 IP 對應的 主機名稱 必須是 Linux 主機的名稱！
呵呵！那樣就 OK 囉！從此之後，只要以『網路上的芳鄰』來連線 Linux 以傳送檔案資料就可以囉！
2002/ 01/01以來統計人數


簡易 Mail Server 架設 -- Sendmail 設定
最近更新日期：2003/03/14

在這個郵件伺服器的架設中，我們首先談論 Mail 與 DNS 的重要相關性，然後依序介紹 Mail Server 的相關名詞，以及 Mail Server 的運作基本流程與協定，也會談到相關的 Relay 與 郵件認證機制 等項目，這些項目對於未來郵件主機的管理與設定是重要的，請不要忽略了這方面問題的討論喔。當然，主要的目的還是在於架設 Sendmail 這個使用最為廣泛的郵件主機伺服器軟體囉！這裡我們以 Red Hat 7.x 為主體來說明 Sendmail 的主要架構，要說明的是，雖然本文是以 Red Hat 為主體，但是 Sendmail 的架構仍然可以在其他使用 Sendmail 的 Linux 系統當中成立的。而重頭戲則在最後面的 Tarball 安裝一套完整的 Sendmail 喔 ( 我是以 Mandrake 9.0 及 Red Hat 7.x 版本來測試的 )！如果您的 Linux 上面本來就沒有 Sendmail ，並且您還是習慣 Sendmail 這個套件，那麼，這篇文章仍然相當的適合您查閱！

前言：
郵件伺服器運作原理：
    ：1. Mail 與 DNS 系統的相關性
    ：2. 郵件的傳送流程、MUA、MTA、MDA
    ：3. 使用的協定
    ：4. 什麼是 Relay 與認證機制
套件安裝：
    ：1. 使用 RPM 安裝 Sendmail
    ：2. 使用 RPM 安裝 IMAP 套件
主機的設定：
    ：1. Sendmail Server 的檔案架構與基礎說明
    ：2. 使用 m4 來簡易設定 sendmail
    ：3. 啟動 Mail Server
    ：4. 設定主機名稱 local-host-names
    ：5. 設定郵件伺服器使用權限 /etc/mail/access
    ：6. 重要觀念：一封信件的收受流程
    ：7. 設定使用者別名 /etc/aliases
    ：8. 設定郵件轉遞 ~/.forward
    ：9. 察看信件佇列 ( mailq ) 與 mailers 狀態
用戶端的使用說明：
    ：1. Linux 下使用 mail 功能 ( IP寄信, 夾帶檔案 )
    ：2. Linux 下使用 telnet 功能
    ：3. X-Window 與 Windows 的 MUA 功能
關於郵件主機安全的設定：
    ：0. sendmail 本身的安全設定項目( Sendmail 本身的建議 )
    ：1. SMTP 認證
    ：2. 關於 ORDB 抵擋 open relay 郵件主機之機制說明與實作
    ：3. Procmail 相關說明
以 Tarball 完整安裝 Sendmail (含 SMTP 郵件認證、procmail 與 ORGB 的完全安裝！ )
其他應用說明：
    ：0. 無法寄信時的可能問題說明與解決之道
    ：1. 關於備份
    ：2. 關於 quota 的設定與 /var/spool/mail 目錄的轉移
    ：3. 檢查信箱是否太久沒有用的 scripts ！(施工中)
本章與 LPI 的關係
參考資源：
本章習題練習
前言：
電子郵件帶來的好處：
在目前的社會當中，沒有電子郵件 ( e-mail ) 似乎是蠻奇怪的一件事！。可以說，現在 e-mail 已經成為一個很普遍的人與人之間的溝通管道了，電子郵件可以很快速的幫你將文件或訊息傳送到地球上的任何一個有網路存在的角落，當然，你也可以在任何有網路的地方，連上 Internet 去收取你的信件！很快樂不是嗎？是的！e-mail 的存在是相當重要的，你可以藉由這個電子郵件取得最即時的一手資料！你也可以利用他幫你聯絡好朋友，還可以用來把馬子哩！君不見前一陣子相當有名的『電子情書, You got a mail』這部電影嗎？呵呵！反正，電子郵件真的帶給目前繁忙的人們一個相當輕鬆獲得資訊的方式！
電子郵件衍生的問題：
不過，遺憾的是，只要是有人類的地方，就會有很多你意想不到的事情會出現了，當然，e-mail 也不例外，怎麼說呢？ 我們來慢慢的分析一下吧：
  1. 電子郵件夾帶病毒：你可以常常聽到電子郵件所夾帶的病毒對吧！沒錯，利用電子郵件以及人們對於電子郵件的漫不經心的態度，使得以電子郵件為媒介的電腦病毒更容易『深入人群』當中吶！這個問題造成大大小小的傷害，如果發生在大企業當中，那可真是受不了那∼那個主管受的了一天到晚電腦重新安裝的∼而且萬一中毒的是大型主機，光是資料的損毀就可能讓公司倒閉了....
  2. 怪客入侵事件：沒錯！ e-mail 也是一個相當不安全的網路協定，你可以輕易的使用怪客軟體 ( Cracker ) 就可以取得使用者在利用 e-mail 傳送過程當中的，將他的帳號與密碼擷取下來，分析之後，並進一步的破解對方的郵件主機∼哇！真是亂可怕一把的！
  3. 廣告與垃圾信件：這個可說是目前各大 ISP 心中永遠的痛∼這些垃圾信件可以佔掉很多那少的可憐的頻寬，使得正常使用者連線速度與品質下降，更可能造成網路的停頓∼當然，常常收到垃圾信件的你，大概也不好過吧！
  4. 暴力攻擊事件：萬一你沒有將郵件主機設定好，嘿嘿！送信者可以藉由你主機收信的功能，發送大量的信件，讓你『一次收個夠！』灌爆你的主機硬碟，想要不當機都粉難∼
  5. 真實社會的討厭事情：『黑函』！聽到會不會很害怕？當然很害怕啦！偏偏，使用 e-mail 就可以作很多的壞事∼這真是太不道德了∼
  6. 不實的信件內容：只要注意到消基會的訊息就可以知道啦，不明來源的電子郵件說的內容，嘿嘿！不要輕易的相信，因為，很多可是以訛傳訛，結果，大家都被耍了的∼例如，你的朋友收到一封信，認為『哇！這是大事情』，所以在沒有求證的情況下，將信『轉寄』給你看，嘿！你的朋友寄給你的，當然要相信他啦！立刻再轉寄，如此一再地循環，嘿嘿！這個錯誤內容的訊息馬上就讓大家知道，更可怕的是『還會讓大家接受∼』所以，看到任何訊息時，請千萬要記得求證一下吶！
可怕吧！電子郵件會衍生出這麼多的問題說∼
網管人員的痛：
因為 e-mail 的便利性，與郵件主機的容易受到惡意的攻擊，這兩個事件真的是很難分的清，怎麼說呢？如果為了使用者的便利性而大開便利之門，那麼，您的郵件主機大概用不了多久，就會被列入黑名單之中，進而成為大家的拒絕往來戶，呵呵！反而成為笑柄，並且反而造成了使用者的不便∼而如果管制得太嚴格，又顯的不夠人性化∼最起碼，你的主管就會不太滿意∼怎麼辦呢？！哈哈！沒錯啦！郵件主機就是這麼回事∼讓人又愛又怕的一個玩意兒，搞的定他，恭喜你，一切圓滿順利，搞不定他，主機被當成垃圾信件轉運站事小，丟掉工作可就『茲事體大』啦∼就因為他是這麼重要，但是又這麼難以搞定，所以啦，我們可要好好的學一學他吶！
原理：
既然要使用 e-mail ，當然就需要郵件主機伺服器囉 ( Mail Server )！不然你的信要怎樣寄出去呢？事實上，mail server 的原理說難不難，但是說簡單嗎∼似乎又有點難以理解ㄋㄟ∼，所以，底下我們要來談一談他的原理部分，然後再針對主機的設定來進行說明咯！底下，我們首先要講的，就是『Mail server 系統與 DNS 系統有什麼關連性？』這個部分新手最容易被搞混哩，是否要架設 mail server 就『宿命』的一定得架設 DNS 主機在你的主機上面嗎？
Mail 與 DNS 系統的相關性：
一直以來，Mail server 與 DNS 系統就是分不開的，怎麼說呢？今天如果你要寄電子郵件的話，那麼就得藉由郵件主機幫你將信件送出去，對吧！那麼我們在 DNS 那個篇幅裡面也談到了相當多的概念了，就是，人腦實在無法記憶住電腦網路的 IP 資料，因此，才會有所謂的 Domain Name System, DNS 主機，這個 DNS 主要的功能之一，就是將主機名稱轉譯成為 IP ，我想，這裡您應該也已經瞭解了，對吧！如果是『不瞭解』，那麼不要往下看了，請前往 簡易 DNS 伺服器 去瞧一瞧，瞧完了再回來繼續吧！OK！好了，既然如此的話，那麼使用郵件主機來寄信，並且不想要背主機所在的 IP ，那麼自然就一定需要讓你的主機名稱可以經由 DNS 系統來找到你的 IP 囉！對吧！沒錯，如果你真的要提供一個 Internet 上面的郵件主機，最好還是註冊一個合法的主機名稱，比較好記憶ㄋㄟ∼
好了，接下來要討論的就是，既然我的主機需要 DNS 來轉譯主機名稱使成為 IP ，那麼我真的就得必須要架設 DNS 嗎？當然不是！要注意的是，我們剛剛提到的是『我就得在 Internet 上面註冊一個合法的主機名稱來對應 IP 』而不是『一定得要架設 DNS 在我的主機上面！』這個很重要，因為有太多的新手被 mail server 與 DNS server 的關係搞錯亂了！如果到這裡又混亂了！那麼請，真的，一定，回到 DNS 伺服器那篇去慢慢的在從頭讀一次，否則.....也就是說，我們需要的是『合法註冊過的 IP 對應主機名稱』就是了！所以，你可以使用動態 IP 去申請一個動態 IP 的領域名稱，也可以使用各大 ISP 提供的各項功能來註冊，反正只要能夠註冊一個領域名稱就是了！當然，你也可以自行去註冊一個 DNS 主機，並且在你的主機上面建立 DNS 系統，但這並非是必要的！
那麼，假設我的主機名稱對應 IP 已經成功的在 Internet 上面完成合法註冊了，這樣就好了嗎？是這樣沒錯啦！確實，只要有主機名稱對應到 IP ，亦即是有 A ( Address ) 這個 DNS 的標誌後，那麼就可以架設 mail server 了，並且，一般來說，應該不會有問題的！然而， DNS 系統本身還有其他的功能可以支援 mail server ，使 mail server 更穩定與具有更佳的避免信件遺失功能，所以，就有 MX 這個 DNS 的標號產生啦！MX 這個 DNS 設定中的標號，主要就是要給 mail server 用的，基本上， MX 就是 Mail eXchanger 的縮寫，他可以讓 Internet 上面的信件馬上找尋到 Mail 主機的位置，此外，由於 MX 後面可以接數字，因次，一個 domain 或者是一部主機，可以有多個 MX 標誌，這有什麼好處呢？主要的好處就是可以讓，當主要的 mail server 掛點時，由於有 mx 標號，因此，信件不會直接退回，而是跑到下一個 MX 設定的主機去，並且暫存在該處，等到主要的 mail server 起來之後，這個 MX 設定的主機就會將信件給他傳送到目的地！如此一來，甚至可以達到異地備援的功效呢！不只如此喔！MX 的功效還很多！最大的優點就是有點類似 router 的功能，我們或許可以稱之為 郵件路由 吧！當有了 MX 標誌之後，由於這是 DNS 的設定，所以當你要傳送 mail 的時候，那麼就可以直接依據 DNS 的 MX 標誌直接將信件傳送到該設定的 mx 郵件主機，而不需要去尋問到底郵件要寄到哪裡去！這功能相當的不錯的！因為可以讓你的郵件很快的而且正確的送達到目的地呢！此外，由於可以設定多個 mx ，因此，假設『此路不通』，也就是先使用的 mx 郵件主機不通的時候，那麼信件就會往下一個 mx 郵件主機傳送！這樣可以避免信件被退信的機會！當然就更加的穩定囉！不過，這裡也要特別強調， MX 『一定』要設定正確，否則，呵呵！反而會讓你的信件永遠在 Internet 上面流浪呢！
一般來說，郵件位址的寫法為： account@server.name 的寫法，在小老鼠 ( @ ) 前面的指的是『帳號』，至於 @ 後面的則是主機的名稱！當你寄出這樣的一封信時，首先，你的郵件主機會先去 DNS 系統尋找 server.name 這個主機名稱對應的 IP 與 MX 標誌，若有 mx 標誌，那麼這封 e-mail 將會把信先送到該 mx 主機，然後再由該 mx 主機將信件送達目的地 ( 就是 server.name 這個主機啦 ) ，而如果有多個 mx 標誌時，那麼這封 e-mail 會送到最優先的 mx 主機去(也有可能這部主機就是目的地主機喔！)，然後交給該主機來處理囉！而如果沒有 mx 標誌的話，那麼在查得 IP 之後，信件才會慢慢的送達該郵件主機囉！在送達到郵件主機後，該主機則以前面的『帳號』將信件發送到各個使用者的郵件目錄下！所以囉，為什麼說 mail 與 DNS 系統相關性很高呢？嘿嘿！由上面的說明您應該就不難瞭解啦！ ^_^
郵件的傳送流程、MUA、MTA、MDA
約略瞭解了 DNS 與 mail server 之間的關係之後，在接下來我們要瞭解的是，那麼 mail 到底是如何傳送到目的郵件主機的呢？底下我們分成『寄信』與『收信』兩個主要的郵件主機使用方式來加以介紹囉！先說明一下關於『寄信』的部分好了，通常我們都是使用桌上型電腦來寄信的，舉個例子來說好了，如果你已 Netscape 或者 Kmail 或者 OutLook Express 來寄信的時候，那麼那封信到底是怎麼送出去的呢？可以參考一下底下的圖示來說明：

先來說明一下什麼是 MUA, MTA 與 MDA 什麼的，再來說信件怎麼傳送的好了！
  • MUA ( Mail User Agent )：顧名思義， MUA 就是『郵件使用者代理人』，華特(what)？郵件還需要代理人，怎麼回事呢？喔！這是由於通常我們 Client 端的電腦都無法直接寄信的(不然幹嘛要郵件主機？)，所以，需要透過 MUA 來幫我們傳達信件，不論是送信還是收信，Client 端的用戶都需要透過各個作業系統提供的 MUA 才能夠使用郵件系統。舉個例子來說， Windows 裡面的 OutLook Express, Netscape 裡面的 mail 功能與 KDE 裡面的 Kmail 都是 MUA 啦！ MUA 主要的功能就是收受郵件主機的電子郵件，以及提供使用者瀏覽與編寫郵件的功能！
  • MTA ( Mail Transfer Agent ) ： MUA 是用在 Client 端上面的軟體，那麼這個 MTA 就是用在郵件主機上面的軟體啦！他也是主要的郵件伺服器喔！這個 MTA 就是『郵件傳送代理人』的意思。也來顧名思義一下，既然是『傳送代理人』，那麼使用者寄出的信，與使用者要收信時，就是找他 ( MTA ) 就對啦！因為他要負責幫我們使用者傳送嘛！沒錯！基本上， MTA 的功能有這些：
    1. 收受外部主機寄來的信件：既然是郵件主機，那麼『接收信件』想必就是主要的功能囉！呵呵，答對了！所以囉， MTA 最主要的功能就是收受外部來的信件，只要這個信件裡面有 MTA 內部的帳號時，那麼這封信就會被 MTA 收下來；
    2. 幫使用者傳送 ( 寄出 ) 信件：既然可以收信，那麼自然也就可以發信囉！沒錯啦！只要使用者具有合法的使用 MTA 的權力，那麼該使用者就可以利用這部 MTA 將他把信傳送出去！不過需要注意的是， MTA 會將信件送給目的地的 MTA 而不是目的地的 MUA 喔！不要搞錯了！(註：曾經有個朋友跟我說，要我傳資料給他，而因為他要接收我的信件，所以他的電腦 "指的是 Windows 那個 Client 端的電腦" 得一直開著，真是不方便！聽到這句話時，害我嚇了一跳∼這個觀念是不對的∼因為使用者使用的是 MUA ，而信件『僅會送達到 MTA 主機上面』而已，收、發信件時，都需要透過 MTA 來幫忙處理的！所以，使用者在使用郵件編輯器"MUA"將資料編輯完畢之後，按下送出，並且成功的送到 MTA 之後，接下來的事情就是 MTA 的工作了，跟使用者的 Client 端這部電腦 "一點關係也沒有了" )
    3. 讓使用者自己的信可以收回去：使用者可以將放置在郵件主機的信件收到自己的個人電腦上面收看。
    大致的功能就是這些啦！通常我們所說的 Mail server ( 郵件伺服器 ) 就是指 MTA 而言的！
  • MDA ( Mail Delivery Agent ) ： 『郵件遞送代理人』主要的功能就是將 MTA 所收受的信件，依照信件的流向 ( 送到哪裡去 ) 來將該信件放置到本機帳戶下的郵件檔案中 ( Mailbox )！或者是再經由 MTA 將這個信件送到下個 MTA 去！而如果信件的流向是到本機當中時，這個郵件代理人的功能可不止是將由 MTA 傳來的郵件放置到每個使用者的 Mailbox 而已，他還可以具有郵件分析 ( filtering ) 與其他相關的功能呢！這個功能很了不起喔！怎麼說呢？具兩個例子來說好了：
    1. 如果你知道某個廣告信件的主旨都是固定的，例如『AV情色XXX』，你想將這種信件直接給他丟掉垃圾桶，可以嗎？當然可以囉！透過 MDA 郵件分析的功能，就可以將信件丟棄啦！
    2. 如果有一天你要出差去，看樣子可能一個星期碰不到電子郵件了，但是你又不想讓一些朋友認為你在耍大牌都不回信的....這個時候你就可以利用 MDA 的功能，讓郵件主機分析到，當要送給你這個使用者的帳號的信出現時，就自動回覆一封回信，讓寄件者知道你在忙碌中....呵呵！這樣的功能是否很不錯呢？還不止這樣喔！其他的等一下後面再提吧！
  • Mailbox ：『郵件信箱』說穿了，就是在你主機上面的一個目錄下的，某個人『專用』的信件收受檔案啦！舉個例子來說，系統管理員 root ，在預設的情況下，他會有個信箱，預設的檔案是在 /var/spool/mail/root 這個檔案就是了，一個帳號都會有一個自己的信箱喔！然後，當 MTA 收到 root 的信時，就會將該封信件存到 /var/spool/mail/root 這個檔案中囉！使用者可以透過程式來將這個檔案裡面的信件資料讀取回去喔！
好了，瞭解了 MUA, MTA 與 MDA 之後，再來說到那麼如何將信寄出去呢？可以分為底下幾個步驟：
  1. Step 1 使用者利用 MUA 寄信到 MTA 上面：通常我們使用 MUA ( 例如 Outlook express ) 寫信的時候，你總是要定義出幾個咚咚：
    • 發信人與發信網站：對啦，總是要有這個資訊才行的嘛！這個發信網站就是等一下 Step 2 接收信件的那個 MTA 啦；
    • 收信人與收信網站：是的，就是 account@e-mai.server 的樣式啦！那個 account 就是該 e-mail.server 裡面的帳號啦！
    好了，你在左上角的那部機器上面，也就是『本地端用戶使用電腦』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 寫好了信之後，按下 MUA 的那個『傳送』的按鍵，MUA 就會依據你所定義的主機位址將信發送到 MTA 上面；

  2. Step 2 MTA 收到自己的信件，交由 MDA 發送到該帳號的 MailBox 當中：如果在 Step 1 所收到的信件中，那個 e-mail.server 就是 MTA 自己，此時 MTA 會將該信件交由 MDA 去處理，將信件放置在收進者的信箱中；

  3. Step 3 MTA 將信再轉送出去：如果由 Step 1 來的信件的收件人並不是 MTA 的內部帳號，那麼該封信將會被再轉送出去！由 Step 1 及 Step 3 的動作，我們也稱為 Relay (郵件轉遞) 的功能喔！

  4. Step 4 遠端 MTA 收受本地的 MTA 所發出的郵件：遠端的 MTA 會收受我們這部 MTA 的信件，並將該信件交給他的 MDA 來處理 ( Step 5 ) ，此時，信件會存放在遠端的 MTA 上面，等待使用者登錄讀取或者下載回去！
整個流程大致上就是這樣。這個時候，你由左上角的 MUA 將信件寄出之後，最後信件將會存放在右邊那部 MTA 主機裡面喔！還沒有到達你的朋友的電腦 ( 就是右邊的 MUA 那部電腦 ) ！這個時候，就要繼續談到收信的動作了！收信的動作有點像這樣：

遠端用戶使用的電腦直接連接到他的 MTA ，跟 MTA 要求察看自己的 mailbox 是否有信件，而 MTA 透過 MDA 去檢查之後，如果有信件的話，就會將他傳送回使用者的 MUA 中！同時，根據 MUA 的不同設定， MTA 會選擇將該 mailbox 清除掉，或者繼續保留！若繼續保留的話，那麼下次使用者再次的接收信件時，保留的信件會再次的被下載，因此，通常使用者 MUA 都是預設刪除掉 MTA 上面的 Mailbox 內容的！接下來我們得談一談，那麼寄信與收信使用的是什麼協定呢？
使用的協定
總是得瞭解一下使用的協定吶！我們在寄信的時候，亦即由 MUA 將信件發送到 MTA 的過程中，以及 MTA 將信轉遞到下一個 MTA 的功能，目前絕大部分的郵件主機都是使用 SMTP ( Simple Mail Transfer Protocol ) 這個協定，port number 為 25 啦！在寄信的時候，你的 MUA 會主動的連接 MTA 的 port 25 ，然後將信經由 MTA 的 smtp 協定 ( port 25 ) 而送出去！而郵件主機 MTA 在轉遞的時候，也是經由下一部 MTA 的 port 25 來將信送出去的！所以囉，不論你是使用什麼 MUA 或 MTA 郵件架設軟體，只要大家都支援 smtp ，那麼信件就可以順利的流傳囉！
收信呢？收信則是 MUA 經由 POP ( Post Office Protocol ) 協定來連接到 MTA 的使用者 Mailbox，以讀取或者下載使用者在 Mailbox 當中的信件。，目前常用的 POP 協定為 POP3 ( Post Office Protocol version 3 )，這個協定產生的 port number 為 110 ，所以，你的 MUA 經由 MTA 的 port 110 將信件由 MTA 的 mailbox 當中將信件收到本地端的 MUA 上面供你瀏覽！同樣的，只要 MTA 與 MUA 同時支援 POP3 這個協定，那麼信件就可以自由的收受了！此外，目前也很流行使用 IMAP 這個協定來收受信件。在 pop3 的收信協定中，一般來說，當 client 端收完了主機端的信件之後，則該信件會主動的被主機端所刪除！不過， IMAP 則可以避免這個問題！ IMAP 具有讓使用者 ( client 用戶端 ) 自行定義信件放置的目錄功能，以及是否要儲存下載的信件之後，原信件是否保留在主機上面的功能！目前我們常見的 Web 介面的電子郵件使用，大部分就是以 imap 來達成的！
所以我們知道了！通常一部提供收發信件的 MTA ( 不考慮 Web 介面的郵件主機 ) 至少需要兩個協定，分別是 SMTP 與 POP3 ！而且，只要你的 MUA 與 MTA 同時均支援 SMTP 與 POP3 ，那麼彼此就可以溝通囉！這也是為什麼你使用 Outlook express 寄出的信，但是你的朋友可以使用 Netscape 收下來的原因！總之，就是『網路協定』的溝通啦！

什麼是 Relay 與認證機制
由寄信流程圖裡面的第三步驟 ( step 3 ) 中，我們知道， MTA 在分析收到的郵件之後，如果收件者不是本身主機的帳號，則會將該信件再傳送到下一個 MTA 上面，這個由 MTA 幫忙轉信的功能就稱為 Relay 啦。那麼在這個功能當中，您有沒有發現一件奇怪的事情啊！那就是：『是否任何人都可以使用我的 MTA 郵件主機伺服器來傳送他的郵件呢？』這個問題涉及到 Mail Server 的設定技巧了！如果設定不良的話，例如早期的 Sendmail 版本中，他就沒有針對使用者來進行管制，也就是說，任何人都可以使用這樣的一部郵件主機來達到信件傳送的目的！這種主機我們稱為『Open Relay』的電子郵件主機喔！這裡請仔細的思考一下，如果我的 MTA 對於寄信的人沒有一個限制的話，結果會如何呢？呵呵！沒有錯，結果就是任何人都可以使用你的 MTA 來發信了！那有什麼好可怕的？我們在前言的地方就已經稍微說過了，那個所謂的『廣告信、垃圾信件』的問題，而如果你的 MTA 沒有對寄信的人作限制的話，由於任何人都可以使用你的 MTA 來發信，你的 MTA 將會變的『很笨重！』什麼意思？那就是，你的 MTA 將會幫任何人寄信，如此一來，你的『網路頻寬將會被廣告信件所用光！』結果將導致你的 MTA 變成『Open Relay 主機黑名單的一份子∼』！！！

為了避免這個問題，所以，目前所有新版的郵件主機伺服器架設軟體 ( Mail server packages ) 預設的情況之下，都不會對外完全的開放 Relay 的功能的！預設通常僅『針對主機 ( localhost ) 開放 Relay 的功能！』，不過，這樣的 MTA 是可以收受來自 Internet 上面的，註明收件者是我們 MTA 主機內部帳號的信件的，因此， MTA 在『收信』上面是沒有問題的！

但是關閉了 Relay 之後，雖然可以避免掉我們 MTA 主機被當成廣告信發送站，不過如此一來又造成了一些困擾！何解？因為通常我們僅針對主機，或者一些規範的 IP 或者是網段等信任的主機來開放他們的 Relay 的功能，所以在這個設定的範圍內的 Client 端電腦可以自由的收發信件，至於沒有規範到的 IP 來源的寄信信件，將完全的擋掉。然而萬一您使用的是 ADSL 計時制的呢？又或者您是常常在外面出差的大老闆，則你的 IP 將『不會固定』，完蛋啦∼怎麼辦？既不能完全開放 Relay ，又沒有固定 IP ，無解了嗎？呵呵！還好，有所謂的 郵件認證機制 來幫我們解決這個困境啦！

所謂的『郵件認證機制』就是在剛剛我們寄信流程圖中，在 MTA 當中加入需要檢查發信者的『帳號與密碼』比對的功能，當 MTA 接到來自 Client 端的傳信需求時，會檢查來自 Client 端的認證比對(帳號密碼)，如果帳號與密碼比對正確，則開始接受信件並幫忙轉信，如果比對不正確則將該 MTA 並不會接受該封信件，直接在 Client 端顯示『不接受您的信件』之類的訊息喔！目前有相當多種的郵件認證機制，這裡我們偏向於介紹目前廣為使用的 SMTP 郵件認證這個機制。

所謂的 SMTP 郵件認證機制，顧名思義，就是在 smtp 這個協定上面動手腳的一個機制囉！亦即是在寄信的時候，(由 MUA 到 MTA 那個 step 1 的步驟中 )，我們的 MTA 主機『一定要求檢驗 MUA 發信者的帳號與密碼！』這樣的功能！果真能做到這一點的話，那麼你的 MTA 就可以在經過認證之後，提供認證者的 Relay 功能，而不需要針對某些信任網域或 IP 來分別設定開放 Relay 的功能啦！因為經由『認證』的機制，你的 MTA 會去分析寄信者的相關資訊，通過後才會接受信件並幫他們寄信，否則就不接受信件！呵呵！沒錯！就是這樣！透過這樣的機制，您將不需要規範 Relay 的 IP 或網段，直接交給 SMTP 郵件認證來幫你管理你寄件者的 Relay 功能，從此以後，你的 Clients 就不會常常向你抱怨說 MTA 不穩定囉！

我們底下將介紹使用 cyrus-sasl 這種密碼驗證的認證機制囉！好了！底下我們將要介紹一下目前郵件伺服器佔有率上面應該依然是第一的 sendmail 這個 mail server 的架設！
套件安裝：
使用 RPM 來安裝 Sendmail 實在是『快樂得不得了∼』太簡單了∼目前提供 Sendmail 做為郵件主機伺服器的主要為 Red Hat 7.x 版本，至於其他的 Linux distribution 是否提供 Sendmail 就得請您自行到該官方網站上面查詢一下囉！底下我們主要是以 Red Hat 7.x 版本的 Linux 系統做為 Sendmail 的介紹，此外， OpenLinux server 3.1.1 亦是使用此一相關功能套件的喔！那麼需要安裝哪些套件呢？還記得我們在 Mail Server 使用的協定裡面談到的幾個基本的協定吧？亦即是 SMTP 與 POP3 這兩個，此外，由於 Sendmail 必須『讀入』一些資料庫格式，所以也必須要安裝相關的資料庫的函式庫喔！

不過，如果您的系統是比較老舊的，例如 Red Hat 6.x ，又或者是您的系統本來就不存在 Sendmail ，例如 Mandrake 等其他版本的 Linux distribution 時，那麼您就得使用 Tarball 的方式來安裝了！ ( 事實上，幾乎所有的 Linux distribution 都會納入 sendmail ，只是有些套件，例如 Mandrake 預設是安裝 postfix 就是了！ ) 安裝 Tarball 的 Sendmail 真是一件很『雪特』的苦差事，而且安裝的不夠好的話，還有可能產生一些設定上的困擾，此外，安裝的過程當中，使用到很多的『天書一般的設定檔案與牛屎一般的一大沱設定資料』，這些資料如果沒有一定程度的 Sendmail 架構知識，是無法安裝起來的，還有還有， Tarball 安裝的話，最好是所有的 Sendmail 相關套件都一起安裝，而不是分開來安裝，所以，鳥哥將 Sendmail 的 Tarball 安裝方法放在最後面，希望您至少看完『主機的設定』該節的完整內容，以及瀏覽過『關於郵件主機安全的設定』之後，再來嘗試以 Tarball 完整的安裝起屬於您自己的 Sendmail 郵件主機喔！

好了，底下我們就來安裝 Sendmail 及 POP3 這兩個郵件伺服器上面的元件吧！
使用 RPM 安裝 sendmail ( 適用於原本 Linux 就是使用 sendmail )
如果您是使用 Red Hat 7.3 以前的版本，例如 Red Hat 7.1, 7.2, 7.3 ，或者是 Open Linux Server 3.1.1 的話，那麼請先確定一下底下的套件是否已經安裝上去了呢？

[root @test root]# rpm -qa | grep sendmail
sendmail-cf-8.11.6-3
sendmail-8.11.6-3
若有屬性相依的問題時，請將您的原版安裝光碟拿出來， mount 上去後，
仔細的，一個一個的將相依的套件安裝上去囉！ ^_^
[root @test root]# rpm -qa | grep m4
m4-1.4.1-5
[root @test root]# rpm -q mailx
mailx-8.1.1-22

那個 sendmail 就是主要的郵件伺服器程式， sendmail-cf 是一些設定檔案， 這兩個套件是『一定』要安裝的！至於那個 m4 的套件，則是轉換 sendmail 設定檔的一支程式囉！也要安裝喔！而那個 mailx 就是提供最簡單的 mail 這支寄信與收信的套件啦！由於我的測試系統是 Red Hat 7.2 ，所以使用的算是比較舊一點點的 sendmail 8.11.6 版，如果您想要換裝新版的 sendmail 8.12.xx 的話，請參考底下『Tarball 完整安裝 Sendmail 伺服器』的步驟！不過，這裡我們先還是玩一玩這個預設的版本即可！記得喔！安裝完畢之後，請到 Red Hat 的網站上面去下載更新的 RPM 來更新吧 http://www.redhat.com/apps/support/errata/！或者是台灣的映射站喔！ftp://linux.sinica.edu.tw/pub1/redhat/updates/

使用 RPM 安裝 IMAP 套件
這個 IMAP 套件，就是負責收信的 POP3 那個協定啦！請使用 RPM 確認他已經安裝在您的系統上面囉！

[root @test root]# rpm -qa | grep imap
imap-devel-2001a-1.72.0
imap-2001a-1.72.0

那個 imap 就是我們主要的 POP3 那個協定的套件囉！如果您是使用 Open Linux 的話，那麼設定檔應該會是在 /etc/inet.d 內，而如果是使用新的 xinetd 的話，那麼設定檔就會是在 /etc/xinetd.d 裡面囉！等一下我們再來好好的談一談啦！ ( 註：本章節並沒有談到 imap 這個協定的設定與應用，事實上， imap 這個套件同時提供了 pop2, pop3, imap 等協定的設定與相關功能喔！ )
主機的設定：
知道如何安裝 Sendmail 之後，接下來，我們得瞭解一下在郵件伺服器架設之前，您需要先進行什麼樣的工作呢？
  • 若想要架設的郵件主機未來是對 Internet 提供服務的，那麼請確定您已經申請了『主機名稱』或者已經具備有『經過合法授權的 DNS 主機』的服務了！重要的地方在於你的主機必須能夠讓大家在 Internet 上面查詢的到啊！
  • 雖然有 A 這個 DNS 的標號就可以架設 Mail server ，不過，畢竟有 MX 還是比較好的，所以，特別提醒大家，如果要架設 Mail Server ，最好(非必要)還是請您的上層 DNS 主機幫您設定 MX ，或者，您自己擁有 DNS 主機管理權時，可以自行設定 MX 這個標號才好！
好了，既然是玩 Sendmail ，那麼就得瞭解一下 sendmail 的相關檔案與說明囉！

Sendmail Server 的檔案架構與基礎說明

Sendmail 幾乎所有的設定檔都安置在 /etc/mail 底下，不過，如果你是以 RPM 安裝的話，那麼還有所謂的 sendmail-cf 的設定檔，這個就是使用 M4 在進行 sendmail.cf 設定的程式！由於 Sendmail Server 所使用到的套件並不少，這包括有 sendmail, imap 以及 m4 等等，我們針對這些套件來談一談每個目錄與檔案下的資料吧！
  • 設定檔：
    Sendmail 的設定檔幾乎全部都在 /etc/mail 底下，但是也不一定！因為還需要看當初你建立 sendmail.cf 這個主要設定檔時，將各個檔案放置的地點而定！這部份可以使用 RPM 的方式來反查出你的設定檔案的路徑。Sendmail 與相關套件的設定檔與相關的說明為：

    • /etc/mail/sendmail.cf 或 /etc/sendmail.cf：這個就是 sendmail 的主要設定檔，所有的參數都是他在管理的！但是，這個檔案內的各個設定被號稱為『天書』，所謂的天書就是『非一般人看的懂得！』，就連 sendmai 官方網站自行開發出來的設定程式也都『告誡大家不要手動編輯這個檔案』，所以這裡我們也不談這個檔案的內容啦！但是既然這個是主要設定檔，那麼又不要讓大家手動編輯，那我要怎樣進行 sendmail 設定的修改呢？這個時候就需要使用到 M4 這個指令了！ m4 可以將簡單的一些環境設定參數，重新以內定的函式庫或者函式定義來『製作』 sendmail.cf 這個設定檔呢！sendmail 預設的 sendmail.cf 放置在 /etc/mail/sendmail.cf ，但是 Red Hat 則將他改放在 /etc/sendmail.cf 這裡∼

    • /usr/share/sendmail-cf/cf/xxxx.m4 ：剛剛我們提過那個 sendmail.cf 對吧！而由於這個檔案最好不要手動修改，所以需要使用到 m4 這支程式。 m4 可以將一個簡單的環境設定檔轉成 sendmail.cf ，那個環境設定檔就是 sendmail-cf 這個套件所提供的啦。在 Red Hat 7.x 的系統中，主要的環境設定檔就是 /usr/share/sendmail-cf/cf/redhat.mc 這個檔案喔！不過，在 Red Hat 7.3 當中，這個檔案被移動到 /etc/mail/sendmail.mc 了！至於其他的 Linux 版本則請參考你的 sendmail-cf 套件的內容！

    • /etc/mail/local-host-names ：這個檔案主要用來處理一個主機同時擁有多個主機名稱時候的收發信件主機名稱問題。這個檔案的用途可大了！當你的主機擁有多個 HOSTNAME 的時候，例如我的主機擁有三、四個主機名稱，那麼是否每個名稱都可以用來做為收受信件的主機名稱 ( To: .. ) 呢？並非如此！如果你的主機名稱為 test1.your.domain 以及 test2.your.domain ，而且這兩個 hostname 您都希望可以用在收受電子郵件，果真如此，那麼，你就必需將這兩個名字都寫入 local-host-names 這個檔案當中，一個名字佔用一行。注意：沒有寫入這個檔案的『你的主機名稱』，那信件將無法正確的寄達這部主機喔∼例如：www.vbird.adsldns.org、vbird.adsldns.org這兩個主機名稱的 ip 都是相同的，也就是指向同一台機器上。假設這台主機名稱預設為 vbird.adsldns.org，那在預設情況下，寄給 userid@vbird.adsldns.org 都是 ok 沒有問題的！但是寄給 userid@www.vbird.adsldns.org 就會出現錯誤。其中原因是因為沒有告訴 MTA 除了 vbird.adsldns.org 這個主機名稱外，還有 www.vbird.adsldns.org 也是指向這台主機上。所以寄給 userid@www.vbird.adsldns.org 會出現錯誤，通常就是 mail loop to me，要不然就是不允許 relay 的錯誤情況。

    • /etc/mail/access.db ：這個是『規定誰可以或不可以使用本郵件伺服器的資料庫』，要轉成這個資料庫需要藉由 makemap 以及 /etc/mail/access 檔案的配合！這個檔案可以說是 Sendmail 裡面最重要的『使用者權限管理』的資料了！在後面我們會繼續說明。

    • /etc/mail/aliases.db 或 /etc/aliases.db ：這個 aliases.db 是用來設定『信箱別名』的一個咚咚！你可以藉由這個檔案的設定來規範你的『群組收信』喔！不過，還需要藉由 aliases 及 newaliases 來做成這個檔案才行！

    • /etc/mail/statistics ：這個檔案在記錄 Sendmail 收發信件的相關資訊喔！
  • 執行檔：
    Sendmail 的執行檔也不少，得說一說：

    • /usr/sbin/sendmail：就是 sendmail 的主要執行檔啦！他會讀取 sendmail.cf 這個檔案的設定內容喔。你在發送信件時，就是使用這支程式啦！啟用這支程式之後，預設的啟用的 port 是 25 咯。

    • /usr/sbin/ipop3d：sendmail 的功能是在處理寄信問題，而 ipop3d 就是處理 client 的收信問題啦！如果你的 Mail Server 希望提供用戶端使用 Netscape 或 OutLook express 來收信，那麼就需要提供這個服務才行！這個服務的設定檔在 Red Hat 當中是在 /etc/xinetd.d/ipop3 ，如果是 Open Linux server 3.1.1 的話，那就會變成在 /etc/inet.d/imap 這個檔案中。注意： pop3 是由 imap 套件所提供的，並沒有包含在 sendmail 套件之中喔！

    • /usr/sbin/makemap：主要將 access 轉成 access.db 的資料庫製作的執行檔；

    • /usr/sbin/mailstats：將 /etc/mail/statistics 檔案讀出來的一支程式！可以查看到目前為止 Sendmail 工作共傳送、接收多少郵件囉！

    • /usr/bin/newaliases：將 /etc/mail/aliases 轉成 /etc/mail/aliases.db 的執行檔！

    • /usr/bin/mailq：用來觀察 /var/spool/mqueue 這個郵件暫存目錄的資料情況的指令！

    • /usr/bin/m4：這個就是將 *.mc 檔案轉成 *.cf 檔案的主要執行檔囉！需要搭配 sendmail 原始碼，或者是 sendmail-cf 這個套件才行！注意： m4 是也需要額外的安裝的一個套件喔！sendmail 原本套件中並未包含 m4 這個套件！
  • 郵件相關目錄：
    sendmail 接收下來的郵件放置在哪裡呢？

    • /var/spool/mail ：這個是郵件『收受下來之後，每個使用者信件放置的目錄』，一個帳號會使用掉一個檔案，例如你的帳號為 test ，那麼你的信在 Server 中時，就是 /var/spool/mail/test 這個檔案了！此外，你的 POP3 的協定亦是使用這個目錄中的 mailbox 做為預設的郵件取得的檔案資料。

    • /var/spool/mqueue：當郵件由於對方主機的問題，或者是網路的問題，而無法送出去時，那麼該封郵件將會暫時的存放在這個目錄下，然後主機會每隔大約 30 ~ 60 分鐘重新嘗試傳送一遍，通常設定在五天內該封信件還寄不出去，那就會退給原發信者了！

    • /var/spool/clientmqueue：這是新的 sendmail 8.12 版本才會出現的佇列目錄 (您如果想要以 tarball 安裝 sendmail 的話，請務必參考本章底下的說明，這個目錄的權限設定相當的重要喔！) 。
    大致上的檔案就是這樣啦！接下來談一下如何設定 sendmail 吧！
使用 m4 來簡易設定 sendmail

一般來說，只要您在安裝完了 sendmail 之後，您的 Mail Server 就可以正式的來啟動了！但是不幸的是，在 Red Hat 7.xx 版本中，為了杜絕廣告信件的問題，所以在預設的情況下，您的 sendmail 將『只會監聽 127.0.0.1 這個介面的收發信件需求！』至於非 Red Hat 7.x 版本的 sendmail 則可以正常的來啟動喔！為了解決這個問題，所以我們勢必要針對 sendmail.cf 這個設定檔案來進行修訂，但是這個檔案原本即建議需要由 m4 來進行修改，所以，我們就得瞭解一下使用 m4 來轉換成為 sendmail.cf 的設定檔 file.mc 的相關參數囉！
  • 建立 M4 參數檔：
    m4 的參數檔通常檔名均取為 filename.mc 這樣的附檔名格式，你可以在 /usr/share/sendmail-cf/cf 裡面找到相當多的範例檔案喔！例如 Red Hat 的設定範例檔為 /usr/share/sendmail-cf/cf/redhat.mc 。這個環境參數設定檔的設定項目很多，其格式為：

      設定元件(`設定項目', `參數一', `參數二')

    仔細看到上面的例子當中，在設定的元件後面接上小括號，而小括號內則為該設定元件的項目內容，以及該項目內容的參數！而將設定項目與各參數包起來的『並不是單引號』，要注意的是，在『設定項目』左右兩邊的：
    1. 左邊的是 quod ，也就是鍵盤上面數字鍵 1 的左邊那個按鍵『`』；
    2. 右邊的才是單引號『'』。
    這裡很容易被搞錯！請特別注意，而每個設定項目與參數之間，則是以逗號『,』來做為分隔喔！底下我們談一談幾個主要的設定元件與各個設定元件底下的設定項目吧！

    • divert ：這個元件僅是在於提供『是否要將說明資料(或者是註解資料)寫入輸出的檔案中』而已，如果在 filename.mc 檔案當中具有註解符號時，(注意， *.mc 的註解符號可以是 # 也可以是 dnl 這個字串！)而你輸出資料時不想將這些說明資料也輸出，那就可以使用 divert (-1) 。反之，如果你想將這些說明資料同時輸出，那就使用 divert (0)。由於我們不想要手動修改 sendmail.cf ，所以輸出的資料當然就不太需要註明啦！只要在環境設定檔 *.mc 裡面說明清楚即可！因此，你應該會常常在檔案當中看到 diver (-1) 才對！範例為：

        divert (-1)

    • OSTYPE：這個元件功能在設定使用的作業系統類別！ Sendmail 預設提供數種作業系統的模式，你可以在 /usr/share/sendmail-cf/ostype 這個目錄當中找到所支援的作業系統模式。因為我們是使用 Linux ，所以範例為：

        OSTYPE(`linux')

    • define：這個元件的作用比較多喔！他可以定義出許多有用的 sendmail 需要的參數，舉個例子來說，如果我要將郵件別名設定檔放置在 /etc/aliases 底下，那麼我可以使用底下的範例：

        define(`ALIAS_FILE', `/etc/aliases')

      那個 ALIASE_FILE 就是主要的設定項目啦！而這個項目主要規定郵件者別名的檔案所在地，所以囉，後面就直接接上完整的檔案名稱啦！更多詳細的 define 說明，可以參考您電腦中的 /usr/share/sendmail-cf/README 這個檔案喔！

    • undefine：恰恰與 define 相反啦！ Sendmail 預設會支援定義很多的項目，而如果您不需要定義該項目，則可以使用 undefine 來將他移除掉喔！例如：

        undefine(`UUCP_RELAY')

    • FEATURE：這個元件 FEATURE 字面上的意思是『特徵、特色』，那也就是說，這個元件裡面會規定出 sendmail 所額外新增的一些任務啦！這些任務的支援必需要 sendmail 有提供才可以！你可以在 /usr/share/sendmail-cf/feature 這個目錄當中找到 sendmail 所提供的各個功能喔！舉個例子來說，如果我們要規定 sendmail 存取權限設定的檔案，也就是 /etc/mail/access.db 時，你可以這樣寫：

        FEATURE(`access_db',`hash -o /etc/mail/access.db')

      注意：上面 access_db 是某個任務的項目，而後面接的 hash 是資料庫格式，至於 sendmail 所使用的資料庫則是 /etc/mail/access.db ！更多的 FEATURE 相關設定項目可以參考 /usr/share/sendmail-cf/README

    • MAILER：這個元件在設定所使用的郵件主機傳送郵件(遞送, delivery)的代理人，一般而言，我們的代理人都是 smpt 協定啊，不過，如果我們主機內的用戶(主機 /etc/passwd 存在的實體用戶)想要使用 sendmail 來寄信，那是否仍然要透過 smtp 這個代理人呢？不太需要的， sendmail 本身就提供發信的功能，而要讓主機上面的實體用戶可以在登入主機環境的中使用 sendmail ，那你就必需要啟動 local 這個本地端的郵件遞送功能啦！因此，通常這個元件會設定為：

        MAILER(local)
        MAILER(smtp)

      如此一來，當 sendmail 發現信件來自於主機內部，那就會使用 local 來傳送信件，當信件來自於主機外部時，那才會使用 smpt 協定來寄信喔！未來還可以新增 procmail 這個 MDA 呢！ sendmail 支援的 MAILER 可以在 /usr/share/sendmail-cf/mailer 這個目錄中查詢的到！

    各個設定元件我們先介紹到這裡，至於更詳細的說明，請務必到 /usr/share/sendmail-cf/README 這個檔案當中尋找！至於其他更完整與新鮮的 M4 設定項目，請到 http://www.sendmail.org/m4/readme.html 查詢喔！底下我們來聊一聊這個環境參數檔設定完畢之後(或者稱為 M4 scripts )，要怎樣來『製作』sendmail.cf 呢？

  • m4 程式的執行

    m4 程式在執行的時候，必需要先讀入相關的參數項目才行，這個參數項目在 /usr/share/sendmail-cf/m4/cf.m4 這個檔案當中，因此，如果你的 *.mc 檔案裡面沒有這一行：

      include(`/usr/share/sendmail-cf/m4/cf.m4')

    那麼你就必需要執行兩個檔案的 m4 轉換，否則只要執行一個即可！假設您的 m4 script 檔名為 redhat.mc ，那麼您可以這樣轉換 sendmail 所需要的 sendmail.cf ：

    1. 若 redhat.mc 裡面沒有 include 的項目，則：
    [root @test root]# cd /usr/share/sendmail-cf/cf
    [root @test cf]# m4 /usr/share/sendmail-cf/m4/cf.m4 \
    > redhat.mc > redhat.cf

    2. 若 redhat.mc 裡面已經包含了 include 的項目，則：
    [root @test cf]# m4 redhat.mc > redhat.cf

    上面製作而成的 redhat.cf 就是 sendmail.cf 的內容啦！然後請將你的 sendmail.cf 備份，舉個例子來說， Red Hat 的 sendmail.cf 在 /etc/ 底下，所以我可以這樣做：

    [root @test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.old
    [root @test cf]# cp redhat.cf /etc/sendmail.cf

    這樣就成功啦！

  • 修改 Red Hat 7.x 的設定檔：

    我們說過， Red Hat 7.x 的設定檔裡面已經將郵件來源的介面定義為『僅來自 127.0.0.1 這個介面』，所以我們必需要開放監聽的介面才行！請注意，這裡僅開放『監聽』而不是開放 Relay 喔！如果您使用 Red Hat 7.1/7.2 ，那麼請修改您的 /usr/share/sendmail-cf/cf/redhat.mc ，如果是 Red Hat 7.3 ，則修改 /etc/mail/sendmail.mc ！我們這裡都以 redhat.mc 為主來說明，如果您是使用 Red Hat 7.3 ，請記得搜尋相關的檔案喔！至於非 Red Hat 系統，例如 Open Linux ，則可以略過這個步驟喔！

    1. 尋找檔案的內容
    [root @test root]# cd /usr/share/sendmail-cf/cf/
    [root @test cf]# vi redhat.mc
    找到下面這一段：
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
    將他改成
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
    儲存後離開

    2. 重新製作檔案：
    [root @test cf]# m4 redhat.mc > redhat.cf
    [root @test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.old
    [root @test cf]# cp redhat.cf /etc/sendmail.cf

    這樣就大功告成囉！
啟動 Mail Server

Mail Server 的啟動是相當的簡單的，在 Red Hat 的系統當中，你可以依序啟動 sendmail 以及 POP3 這個服務喔：

1. 啟動 sendmail
[root @test root]# /etc/rc.d/init.d/sendamil start
Starting sendmail: [ OK ]

2. 啟動 POP3 這個協定
[root @test root]# cd /etc/xinetd.d
[root @test xinetd.d]# vi ipop3
找到下面這一行：
disable = yes
將他改成
disable = no
儲存後離開！至於更詳細的說明，可以參考『認識服務』喔！

[root @test cf]# /etc/rc.d/init.d/xinetd restart
[root @test cf]# netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN

看到了嗎？這樣我們的 Mail Serve 就已經啟動了！他已經可以進行收信與送信的工作囉！事實上，如果您曾經以 vi 檢查過 /etc/rc.d/init.d/sendmail 這個檔案的話，你會發現他其實就是使用 /usr/sbin/sendmail 這支程式在工作的啦！他通常的指令下達方式為：

[root @test root]# /usr/sbin/sendmail -bd -q30m
參數說明：
-bd ： 表示將 sendmail 以 daemon (可以想成常駐記憶體的類型) 的類型啟動！
-q ： queue 的意思，後面接的是時間參數，時間參數有：
       s (秒) m(分) h(小時) 及 d(天)
       -q30m 表示每隔三十分鐘，會將放置在郵件佇列 ( 一般是在 /var/spool/mqueue )
       的郵件嘗試寄出一次！所以，上面的例子當中，說的是將 sendmail 以 daemon
       的類型啟動之後，並且每 30 分鐘去將郵件佇列(為寄出的郵件)嘗試寄出一次！

而 Red Hat 針對郵件佇列寄送郵件的時間，則是設定在 /etc/sysconfig/sendmail 這個檔案裡面喔！

註：
如果您在啟動 sendmail 的時候，出現類似這段文字：
*** Warning: File `virtusertable.db' has modification time in the future (2003-01-13 11:57:26 > 2003-01-13 06:04:40)
make: warning: Clock skew detected. Your build may be incomplete.
這表示您在安裝 Linux 的時候，可能發生一些時間上面的錯誤判斷了！導致於你的 sendmail 相關的設定檔竟然比目前的時間還要新，也就是該檔案乃『來自未來』∼這個時候你可以使用：
touch /etc/mail/*
來將檔案的時間更新為目前的時間，那就可以順利的啟動 Sendmail 囉！ ^_^

設定主機名稱

啟動了 Sendmail 之後，還需要規定你的主機名稱喔，這樣，你的郵件主機才能正常無誤的開始工作吶！假設您的主機 IP 可以在 Internet 上面以 DNS 系統查詢到，以我為例，我的機器上面有 www.tsai.adsldns.org 及 tsai.adsldns.org 兩個主機名稱，並且這兩個主機名稱均指向我家裡的那一部機器，那麼假如我只要 tsai.adsldns.org 具有收信的資格，如果人家寄信到 www.tsai.adsldns.org 則不予以接受，並將該封信件退回去時，可以這樣做：

[root @test root]# cd /etc/mail
[root @test mail]# vi local-host-names
tsai.adsldns.org

在該檔案裡面僅存在一個主機名稱即可！那麼萬一我有三個主機名稱，分別是 tsai.adsldns.org, www.tsai.asdldns.org 及 tsai.linux-site.net，而且我這三個主機名稱都希望可以收到信件時，那麼你就必需要這樣修改囉：

[root @test root]# cd /etc/mail
[root @test mail]# vi local-host-names
tsai.adsldns.org
www.tsai.adsldns.org
tsai.linux-site.net

每一行有一個主機名稱！請記住，未來如果您的主機新增了不同的 HOSTNAME ，並且你希望該主機名稱可以用來收發信件，那麼要修改 local-host-names 喔！

設定郵件伺服器使用權限 /etc/mail/access

在你啟動了 Sendmail 以及設定好主機名稱 ( local-host-names )之後，那你就可以利用『在你的主機上面利用你的主機來寄信』了！為什麼要加上『在你的主機上面』呢？還記得我們在前面有提過，為了杜絕廣告與垃圾信件，所以預設的情況中， Sendmail 是關閉 Relay 的對吧！但是為了主機使用者的方便，所以我們預設是有啟動 local 這個 Mailer ，也就是說：
  1. 只有使用者是在主機上面發信的，例如使用 SSH 登入主機後，以 mail 這個指令來發信；
  2. 又或者使用者直接在主機上面使用 X-Window System 裡面的郵件代理人，亦即是 Netscape 或者是 Kmail 等軟體來發信
的時候，我們的 Sendmail 才會幫使用者『寄信』喔！至於其他的電腦來源的『寄信』郵件，Sendmail 一概將他退信回去！那麼如果我想要在其他的電腦上面使用我這部 Mail Server 來寄信呢？這個時候就要編輯『/etc/mail/access』這個信任網域設定的檔案啦！假設一個例子好了：
  • 我的 Sendmail 主機想要支援我內部網域的所有電腦來寄信，而我內部網域的電腦 IP 網段為 192.168.0.0/24 這一段；
  • 還有，我另外有一個公有的 IP ( Public IP )為 140.116.44.125 ，也想要讓他可以寄信；
  • 此外，我發現 192.168.1.100 電腦使用者都會亂寄垃圾給我的郵件主機，所以我想要擋掉他；
  • 那個 h8h.com 也有問題，我也要擋掉這個網域 (domain) 的來源；
  • 更發現有個使用者叫做 test@testing.domain.name 也是色情廣告信業者！
那麼我可以怎樣設定 Sendmail 的存取權限呢？

[root @test root]# vi /etc/mail/access
# 預設情況下有啟用的 IP
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY

# 想要開放權限的 IP 與網域
192.168.0　　　　　　　　　　　RELAY
140.116.44.125　　　　　　　　 RELAY

# 擋掉的 IP、主機名稱與 E-mail
h8h.com　　　　　　　DISCARD
192.168.1.100　　　　DISCARD
test@testing.domain.name　　REJECT

儲存後離開

[root @test root]# makemap hash /etc/mail/access < /etc/mail/access

在 /etc/mail/access 當中，只要有加上 # 就是註解內容，所以不會被讀入資料庫當中！其實真正的 Sendmail 可以讀得到的資料庫是 /etc/mail/access.db 這個檔案，不過，我們必需先在 /etc/mail/access 編輯完畢後，再以 makemap 這支程式將他改寫成為資料庫！所以，不要忘記 makemap 那個步驟喔！由上面的檔案我們就可以知道啦， access 的語法為
規定的範圍　　　　　　　　　　規定可以在sendmail上面的動作
IP/不完整IP/主機名稱/E-mail RELAY/DISCARD/REJECT
在『規定範圍』與『規定可以在 sendmail 上面的動作』兩項目之間最好以 <tab> 按鍵來隔開會比較正確！『規定的範圍』還可以設定『來源』與『目的』喔！例如：
from:test@your-domain.com.tw REJECT
to: blah@your-domain.com.tw REJECT
至於可以指定的動作主要有：
  • RELAY：允許規定範圍的電腦主機可以使用 Sendmail 來寄信；
  • REJECT：將規定範圍內電腦主機欲進行 RELAY 動作的信件退回原發信主機；
  • DISCARD：與 REJECT 相似，亦即關閉規定範圍內的電腦主機的 RELAY 功能，不過， Sendmail 會直接將該信件『丟棄』而不會『退回』！
通常我們比較建議使用 DISCARD 啦！再來，由於 access 不支援網域的寫法，亦即
192.168.0.0/24
192.168.0.0/255.255.255.0
這種類型的網域寫法並不能被使用的！所以，只能以 192.168.0 這種寫法來達成整個網域的設定了！也就是說， access 裡面大概只能支援 A/B/C Class 的網域， subnet 大概就無法達成了！只能一個一個 IP 的 Keyin 囉！編輯完這個檔案之後，就可以讓你的其他主機使用 Sendmail 的 Relay 功能囉！還不賴吧！

重要觀念：一封信件的收受流程

OK！到目前為止的 Sendmail 主機設定而言，你的 Mail Server 應該已經能夠應付一個小型的企業單位了，不過，為了讓您能夠更清楚的知道『我要如何控制我的 Mail Server 』，我們底下將會以 Sendmail 收受一封信件的流程，來介紹信件的傳送方向，好讓您更清楚的瞭解到你的 Mail Server 在幹啥好事喔！一般而言，當你的 Sendmail 收到一封信件時，他是怎樣判斷這封信件要怎樣傳送的呢？我們先談一談如果 Sendmail 收到一封『非本機端送出的來信』時，他是怎樣處理這封信件的？
  1. 當 MTA 收到一封郵件，並且該郵件的『信件收件者』為 MTA 本身的用戶帳號時，此時將會以本機端 ( local ) 的收件規則來進行收件，如果 /etc/mail/access.db 沒有針對來源 IP 或者 host 或者 e-mail 抵擋時，則該封信會被我們的 MTA 收下來，並且儲存到 /var/spool/mail 裡面。例如，當我的 tsai.adsldns.org 收到一封給 vbird@tsai.adsldns.org 的郵件，並且 /etc/mail/access.db 沒有針對來源抵擋 ( 在不考慮 procmail 的情況下 ) ，那麼我的 tsai.adsldns.org 這部主機，會立刻將該封郵件存放到 /var/spool/mail/vbird 裡面去，而不必經由『認證』或者抵擋的機制。請注意，在這個情況中， Sendmail 並不會去檢查送件者是否來自於信任網域喔 ( 只要 /etc/mail/access 沒有擋到的主機或IP或其他的 e-mail 資訊 )！

  2. 如果這封郵件的『信件收件者』並沒有 MTA 本身的用戶帳號時，那麼 MTA 會以 SMTP 這個外送規則來傳信，此時 MTA 會開始去檢查 /etc/mail/access.db 這個資料庫裡面，任何有關於送件者的 IP、E-mail 以及相關的動作等，如果該封郵件有相關的資料在 /etc/mail/access.db 裡面時 ( 不論是 RELAY, REJECT 或是 DISCARD ) 那麼該封郵件就會依照 /etc/mail/access.db 裡面指定的行為進行郵件的動作(可能是 RELAY 或 DISCARD 等等)！

  3. 如果該封郵件經過上面兩道手續後，仍然找不到任何有關的動作訊息，那麼這封郵件將會退回給原發信者！
上面的信件收受行為是在沒有 SMTP 郵件認證以及 procmail 這個 MDA 管理的時候所具備的動作！如果加入 SMTP 或者 procmail 之後，會變成怎樣呢？呵呵！先不告訴你，待會繼續往下看再說吧！

關於廣告信的收受

很多人常常會發現這樣的一件事，就是：『為什麼有人利用我的 mail server 寄信給我？』舉個例子來說，假如我的一部 Mail server 主機名稱為 mta.domain.name ，而他上面有個實體郵件用戶為 user@mta.domain.name ！這個 MTA 主機並沒有對外開放 RELAY 的功能喔！但是有一天， user 這個人還是接到廣告信了！更神奇的是，該封廣告信的發信者為 someother@mta.domain.name ！怪怪！明明我的 mta.domain.name 就是沒有 someother 這個用戶，怎麼還可以用我的主機寄信給我自己呢？

好了，現在請仔細的參考一下上面的三個步驟，你會發現一件事情，就是『第一個步驟中，如果發現該封信的收件者有本機的帳號時，且 /etc/mail/access 沒有抵擋到該封信時，則該封信件就會被接收下來！』對啦！就是因為如此，因此，對方可以用你的 mail server 寄信給你！不過，還好的是，這樣的情況中，該封廣告信只會在你的 Mail Server 內傳送，並不會寄出去外部的！註：因為要寄到外部去，就需要 RELAY 的功能啦！

上面提到的是關於『來自 MTA 外部的信件』時的處理動作，那麼如果這封郵件是來自於『主機內部』的行為呢？例如：使用者以 SSH 登入後，使用 mail 這個指令來執行寄信的動作，又或者是直接在 MTA 這部主機上面的 X Window System 內的 Kmail 來發信呢？由於我們剛剛在設定 redhat.mc 這個檔案的時候，你會發現一句設定值：
MAILER(local)
或者是
Cwlocalhost.localdomain
這兩個設定都代表『本機寄出的郵件可以不用經過 SMTP 的手續，將直接以 sendmail 的功能寄出』，這也就是說，無論如何，來自主機內部的信件都將被傳送出去！這也是為什麼有的時候明明你的 sendmail 沒有正常的啟動，但是在主機上面直接以 mail 這個指令卻還是可以將郵件送出的原因啦！
例題：曾經有朋友發現一個有趣的現象，那就是他的 WWW 網站提供 CGI 的功能 ( 所謂的 CGI 指的是一些動態的網頁內容，例如鳥哥的私房菜裡面的留言版，這些功能很多是利用 perl 語言或者其他語言寫成的程式喔！)，他所提供的 CGI 程式的功能可以幫助使用者寄信，後來發現很多人便藉由這個 CGI 的網路功能，使用他的 WWW 主機發送大量的廣告信，他就很生氣的將他自己的 WWW 主機的 Sendmail 關閉，也就是將 smtp 的 port (25) 關掉，以為這樣就可以將廣告信杜絕啦！但是，廣告信卻還是一直的發送！並沒有停下來！您知道為什麼嗎？！
答：
原因應該很簡單吧！因為 WWW 在 Linux 本機上面跑，而管理員提供的的 CGI 是在 WWW 上面跑，也就是說，這個 CGI 本來就是利用 Linux 的 Sendmail 在傳送郵件的，那既然 sendmail 本來就可以不需要透過 smtp 的 port 來傳送郵件，自然你的廣告信就還是可以自由的發送出去囉！
設定使用者別名 /etc/aliases

一、群組寄信的功能：
約略了解了 Sendmail 整體之後，目前你的 Sendmail 應該也可以順利正常的運作了！不過，還有個重要的課題要來討論，那就是關於『群組寄信』的問題啦！假設你是在學校單位裡面，在這所學校裡面的每個同學都有自己的帳號，而學校的老師也都是使用同學的電子郵件來聯絡感情！不過，要記住一個班級 30~50 個同學的電子郵件位址實在不怎麼好記，加上未來同學們畢業，新的同學又加進來，哇！豈不頭疼∼這個時候您可以幫助這些善良的老師們啦！就利用這個『使用者別名設定』的功能即可！怎麼作呢？我們可以將一個班級取一個代號，例如預計 92 年畢業的 13 班，就稱為 student9213 這樣的帳號，但是這個帳號並非是實體用戶喔！他僅是一個別名而已！基本上，他代表了 92 年畢業的 13 班的全體同學的電子郵件！這個功能可以透過編輯 /etc/aliases 來達成喔！( 註：這個檔案不一定在 /etc/aliases ，有時後會在 /etc/mail/aliases ，完全依照當時使用 filename.mc 定義時的路徑而定的！ ) 這個 /etc/aliases 的語法有點像這樣：
在郵件上面的收件者帳號：　　真實帳號1, 真實帳號2, 真實帳號3....
birdhouse:　　　　　　　　　 bird1, bird2, bird3, bird4
在上面的例子中，『真實帳號1...帳號3 中間的所有帳號與帳號之間都以逗號隔開而已！』你也可以在逗號後面接空白字元，這是沒有關係的！但是不能只接空白字元而沒有逗號喔，不然就會造成人名的誤判！而 birdhouse 那一行就更清楚啦！當我寄出一封信給 birdhost@tsai.adsldns.org 時，在 tsai.adsldns.org 主機收到這封信之後，會將該封信複製成四封並分別寄給 bird1, bird2, bird3, 及 bird4 四個使用者，所以你只要記住 birdhouse 就行了！所以，如果用在上面學校單位的那個例子時，就可以這樣進行：

1. 編輯別名設定檔：
[root @test root]# vi /etc/aliases
新加入這一行在 aliases 的最底下：
student9213: st001,st002,st003,st004.st005,st006,st007.....

2. 製作資料庫 /etc/aliases.db
[root @test root]# newaliases

要注意的是，與 /etc/mail/access.db 相似的，我們 sendmail 讀取的資料庫格式其實是 /etc/aliases.db 這個檔案，所以當你編輯完成 /etc/aliases 之後，記得一定要使用 newaliases 這個指令來將資料變成資料庫喔！否則 sendmail 將不會讀取到您剛剛修改完成的變動！這個群組寄信功能相當的不賴，如果你有四個計畫在你的 Linux 主機上面，而這四組人都是你管的，但是這四組人又互相沒有資訊的交流，那麼你就可以進行這四組人的郵件群組功能，同時，將你的實體帳號分別加入這四個群組中！哈哈！就可以收到這四個群組的信件囉！

二、使用者的別名設定與重要郵件備份：
除了群組功能之外， aliases 還可以用來做為一個用戶多個郵件名稱的設定喔！例如，小老弟我，鳥哥的渾號僅在 Linux 裡面通稱而已，一般的上班單位裡面，仍然主要以我的名字記憶我的郵件的！也就是說，我具有兩個帳號在我的 tsai.adsldns.org 上面，分別是 vbird@tsai.adsldns.org 及 dmtsai@tsai.adsldns.org ！那麼我是否還要建造另一個實體使用者帳號呢？當然不需要，我只要在 /etc/aliases 裡面加入一行：

1. 編輯別名設定檔：
[root @test root]# vi /etc/aliases
dmtsai:　　vbird

2. 製作資料庫 /etc/aliases.db
[root @test root]# newaliases

那麼未來這兩個電子郵件均將寄到我的 /var/spool/mail/vbird 信箱裡面去喔！所以，不論是寄給 dmtsai 還是 vbird ，我都可以直接以 vbird 這個帳號來取得這兩個郵件位址的信件，因為都這兩個郵件都放到 /var/spool/mail/vbird 這個信箱嘛！相當的方便吧！ ^_^另外，如果我要將某個帳號在收信時，順便備份一份到系統當中時，例如寄信到 vbird 時，順道寄一份到 testing 時，可以這樣做：

1. 編輯別名設定檔：
[root @test root]# vi /etc/aliases
dmtsai:　　vbird
vbird: vbird,testing

2. 製作資料庫 /etc/aliases.db
[root @test root]# newaliases

如此一來，則寄給 vbird 的信件，vbird 自己保留一份之外，也會再寄給 testing 這個人喔！可以做為備份的需要啦！

三、外部信件的寄送
另外，如果你的電子郵件想要將該郵件外傳的話，要怎麼做？這個同樣可以做為郵件的『異地備援』之用！怎麼說呢？同樣用我們的 tsai.adsldns.org 來做說明吧！假設我的帳號 vbird@tsai.adsldns.org 送到 tsai.adsldns.org 之後，要再傳送一份給 vbird@vbird.adsldns.org ，也就是說，信件傳送到 tsai.adsldns.org 這部主機的 vbird 後， tsai.adsldns.org 會主動的再將該信件外傳到 vbird.adsldns.org 這一部上面去！怎麼做呢？你可以這樣搞定：

1. 編輯別名設定檔：
[root @test root]# vi /etc/aliases
dmtsai: vbird
vbird: vbird,vbird@vbird.adsldns.org

2. 製作資料庫 /etc/aliases.db
[root @test root]# newaliases

如此一來，任何人寄給 vbird@tsai.adsldns.org 的郵件，都會額外再多寄一份給 vbird@vbird.adsldns.org ！就可以達到異地備援的目的啦！很方便吧！此外，你也可以用來做為 Mail list 呢！嘻嘻！

四、檔案類型的別名 include
再讓我們回到第一點『群組寄信』的地方，您會不會覺得，如此一般的設定方法，在經過了幾年之後，你的這個 aliases 會變的亂七八糟的！所以這裡再讓我們學個有用的技巧，就是利用 aliases 裡面的 include (包括) 功能，使用檔案類型的方法來達成群組寄信的目的！舉上面學校相同的例子來說明好了，今天我的 student9213 這個群組帳號中，所有的人員都給他寫入 /etc/mail/student9213 這個檔案當中，然後再以 include 的功能給他寫入 aliases 這個檔案中∼你可以這樣做：

1. 編輯 /etc/mail/student9213 ：
[root @test root]# vi /etc/mail/student9213
st001, \
st002, \
st003, \
st004, \
....
st050
假設共 50 個學生，則最後一個不用加上『 , \』！與變數設定規則相符！

2. 還是要編輯 aliases 的！
[root @test root]# vi /etc/aliases
dmtsai: vbird
vbird: vbird,vbird@vbird.adsldns.org
student9213: :include:/etc/mail/student9213

3. 製作資料庫 /etc/aliases.db
[root @test root]# newaliases

整個寫法是：
群組帳號： ：include：使用的檔案完整檔名
請注意，這個檔案類型的格式為『:include:』亦即 include 兩邊都有冒號，並且，在最前面帳號的地方也有冒號喔！不要記錯了∼至於在 /etc/mail/student9213 這個檔案中的寫法與 aliases 後面接的帳號或 E-mail 類型寫法相同，例如：
vbird, vbird@vbird.adsldns.org, userID@host.domain.name
不過，我們也可以利用跳脫字元『\』來加以格式美觀化，會比較整齊畫一喔！但是，仍然不要忘記了那個可愛的『逗號』喔！例如上面表格裡面的 st001, .... 說明的樣式！這部份如果不太明瞭的話，請拿出鳥哥的私房菜 Linux 基礎學習篇，好好的看一看 BASH Shell 裡面介紹的變數設定規則吧！ ^_^！

上面提到的都是關於系統管理員設定的資料部分，那麼預設的 aliases 裡面有什麼東西呢？通常有這些資料存在的喔：

[root @test root]# vi /etc/aliases
# 基礎 sendmail 資料！由於 sendmail 預設使用 mailer-daemon 與
# postmaster 做為資料發送者，或者是信件被退回時的帳號！但是我
# 們的系統並沒有這兩個帳號，因此，必需要使用 aliases 的功能！
# 如果是使用 sendmail ，那麼底下這兩行『務必存在』才行！
mailer-daemon: postmaster
postmaster: root

# pseudo accounts. 也就是系統的帳號，這些帳號是給系統來使用的，
# 基本上，這些帳號並無法登入主機，但是偏偏某些程式進行時，產生
# 的錯誤訊息可能會寄給該系統帳號，但該帳號無法登入，所以會讓系統
# 無形之中遺失許多的資訊，所以囉，這些帳號也需要來做 aliases
# 並且將收件者交給系統一定會有的人物！ root 是耶！通常這些帳號
# 常見的有 bin, daemon, adm, lp, sync, shutdown, halt, mail, news
# uucp, operator, games, gopher, ftp, nobody, named, xfs, system,
# 等等等等！
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
....(略).....

# trap decode to catch security attacks 有些攻擊者在攻擊你的主機時，
# 該相關的資訊會寄給你的 decode 這個帳號，將他轉成 root 吧！
decode: root

# 這是 root 的收件信者！ 由於預設狀況中， root 是不能在主機外部
# 的任何一部電腦收信的！如果您想要讓你的一般帳號可以接收 root 的
# 信件，以即時掌握主機資訊，那麼底下的 # 將他打開，後面接你的
# 帳號吧！
#root: your_account

這些資料在 aliases 當中是必需要的喔！如果你是自行以 Tarball 建立 Sendmail 的話，那麼這個 aliases 可是需要加入的吶！
  • 什麼是 Mailling list ：我們剛剛在 aliases 裡面有進行過群組寄信對吧！那麼你寄給某個帳號時，該帳號會將你的來信再寄給該群組帳號的所有人員，此外，還可能將該封信件也備份一份在自己的機器上，這個功能就可以稱為是 Mailling list 啦！有點像是目前很流行的『電子報』之類的咚咚！也就是說，我們可以用這個很簡單的 aliases 這個檔案就可以達到 Mailling list 的功能了！
設定郵件轉遞 ~/.forward

瞭解了 aliases 之後，是否會發現一個問題呢？那就是，雖然 aliases 可以幫我們達到 mailling list 的功能，但是『只有 root 才可以修改該 aliases 檔案』，那麼萬一我並不是網站管理員，怎麼辦？是否還是可以建立一個 mail 轉寄的功能呢？確實還是可以啦！這個時候可以使用郵件轉寄 ( mail forward ) 的功能喔！你可以在該帳號的家目錄之下建立一個檔案，檔名為 ~/.forward ，利用該檔案就可以達到 Mailling list 的功能啦！

還是來假設個案例囉：假設我有一個帳號，名稱為 birdhouse ，而我希望寄信給該 birdhouse 時，就可以將信件分送給該 MTA 主機上面的 bird1, bird2, bird3, 及 bird4 之外，還可以寄給外部的 bird@yahoo.com 及 bird@pchome.com 此外，還記錄一份給 birdhouse 這個主要帳號！這個時候你可以這樣做：

[birdhouse @test birdhouse]# cd ~
[birdhouse @test birdhouse]# vi .forward
birdhouse
bird1
bird2
bird3
bird4
bird@yahoo.com
bird@pchome.com
[birdhouse @test birdhouse]# chmod 644 .forward

直接將你要寄出去的郵件位址都寫到 ~/.forward 裡面去，每個位址都佔用一行，如此一來，嘿嘿！只要是寄給 birdhouse@tsai.adsldns.org 的郵件，就可以自動的來傳送到 ~/.forward 內部所設定的郵件位址囉！同時，這個檔案除了可以用來建立類似 mailling list 的功能外，也可以讓你自己設定『異地備份郵件』的功能呢！就是在該檔案內寫入你自己的帳號以及外部信件的郵件位址，那麼當你的主機收到要給你的信時，除了給你一份外，還會再轉一份給你訂定的郵件位址！而最大的優點是，『不需要建立資料庫或者重新啟動 sendmail ！』以 vi 設定完，並且儲存後，立刻生效！好用的很∼

不過需要注意的是，由於這個檔案是這樣的方便設定，萬一被某些居心不良的人看到甚至可以修改時，那可就不得了了！你能想像你的信件都會被複製一份到某人的信箱嗎？所以囉，這個檔案必需只有你能修改，其他人則僅能查閱而無法修改才行喔！亦即這個 .forward 檔案的權限必需要：
  1. 該檔案所在使用者家目錄權限，其 group、other 不可以有寫入權限。
  2. .forward 檔案權限，其 group、other 不可以有寫入權限。
察看信件佇列 ( mailq )與 Mailers 狀態

關於信件佇列：
對於 Sendmail 設定到目前為止，應該也可以正常的應付蠻多工作的啦！但是我們還是得要瞭解一下的是：『如果我將郵件送到 Sendmail 主機後，Sendmail 便會幫我將該封郵件傳送到目的地的 MTA ，不過，如果目的地 MTA 主機有問題時，這封信會怎麼跑？』一般來說，如果 DNS 設定正確的話，也就是說目的地 MTA 有 MX 標號存在時，只是剛好這部主機暫時無法連線，或者是有些問題，導致無法立即接受來自你的 MTA 的郵件，此時這封郵件將會被放置到你的 MTA 主機的佇列目錄去，通常預設是在 /var/spool/mqueue 當中！然後在一定的週期時間內， Sendmail 會定時的嘗試將郵件寄送出去，一般 Sendmail 的預設設定是：
  1. 如果該封信在五分鐘之內無法寄出，則系統會發出一封『警告信』給原發信者，告知該封郵件尚無法被寄送出去，不過，系統仍會持續的嘗試寄出該封郵件；
  2. 如果在四小時候仍無法寄出，系統會再次的發出警告信給原發信者；
  3. 如果持續進行五天都無法將信件送出，那麼該封郵件就會退回給原發信者了！
在 Red Hat 的預設條件中，在 /var/spool/mqueue 當中的信件會每隔 60 分鐘由 Sendmail 嘗試重新傳送一次到目的地去！這個嘗試的時間是可以改變的！可以利用 sendmail 的指令或者直接修改 /etc/sysconfig/sendmail 裡面的 『QUEUE=時間』來修訂！例如，如果你想要讓 Sendmail 每隔 30 分鐘就幫你嘗試傳送 /var/spool/mqueue 裡面的未寄出的信件時，那麼就將 /etc/sysconfig/sendmail 這個檔案裡面的『QUEUE=1h 』改成『QUEUE=30m 』即可！

信件佇列的內容：
老實說，信件佇列的內容是給 Sendmail 看的，不是給人看的，所以我們都不可能看的懂他的訊息！這個時候，只得以 Sendmail 的指令來反查這些郵件佇列到底是什麼咚咚了！很簡單的，只要下達 mailq 或者是 sendmail -bp 就可以這些郵件佇列的基本資料！

[root @test root]# mailq
/var/spool/mqueue (1 requests)
----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------
h1LEKYR23711 36414 Fri Feb 21 22:20 <gold@tsai.adsldns.org>
(Deferred: Connection refused by vbird.adsldns.org)
<qqq@vbird.adsldns.org>

Q-ID：表示此封郵件佇列的代表號 ( ID )；
Size ：這封信有多大容量 ( bytes )的意思；
Q-Time：這封信什麼時候進入 /var/spool/mqueue 這個目錄的，並且說明無法立即傳送出去的原因 (例如上面的 Deferred )；
Sender/Recipient：送信與收信者的電子郵件囉！

如果您有開放郵件的話，那麼記得偶而要去看一看您的郵件佇列 ( mailq ) 是否存在大量的未寄出信件喔！好讓你知道是否可能被當作轉信站啦！

關於郵件在 Mailer 中的統計狀態 ( mailstats )
除了 mailq 記錄了在信件佇列的資訊之外，還有一個檔案可以紀錄 sendmail 由『開始運作到目前為止，郵件的收發總計資料』喔！預設就是 /etc/mail/statistics 這個屬性為 data 的檔案，那麼我怎麼將這個檔案的資料讀出來呢？很簡單啊！就藉由 mailstats 這個小指令來讀取即可！讀取出來的結果有點像這樣：

[root @test root]# mailstats
Statistics from Sat Mar 23 21:34:09 2002
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis Mailer
4 50752 9126380K 23617 5425714K 1070 122 esmtp
9 21329 5919236K 65162 13364494K 1068 8 local
=============================================================
T 72081 15045616K 88779 18790208K 2138 130
C 72081 88779 2655

上面共出現七行，第一行只是顯示目前的時間而已，至於每個直列的意義為：
  • M ：只是一些郵件工作(Mailer)代號的標題啦！不過，重要的地方在第六行的 T ，那個是『Total 總和』的意思∼
  • msgsfr：共有多少封信由這個郵件工作 ( mailer ) 所發出去的呢？以第四行最右邊看到的 local 為例，這表示由 local 發出的信件共有 21329 封的意思∼
  • bytes_from：表示的是信件資料容量，同樣以第四行 local 為例，他發出的 21329 封信，共有 5919236K 喔！
  • megsto：與 msgsfr 類似，只是 msgsfr 是寄出資料，而 megsto 則是『收到的信件封數』以上面的資料來看，則 local 收到的共有 65162 封信！
  • bytes_to：這就不需要解釋了吧！ ^_^
  • msgsrej：那個 rej 是 reject (拒絕) 的意思，這一列是信件被 deny 的次數；
  • msgsdis：那個 dis 是 discard 的意思，同樣是 deny ，只是經由 discard 的程序就是了！
  • Mailer ：就是 sendmail 許多 mailers 當中的一個啦！那個 esmtp 主要用來對外，至於 local 則主要針對本機端的 mailbox 囉！
由上面的資料你會發現，哇！怎麼鳥哥的信箱 15GB 的信件啊！真可怕∼別擔心，那個資料是由『 sendmail 開始運作到現今』的結果，我的 sendmail 運作了若干年了，有這樣的信件資料量其實不怎麼吃驚啦！ ^_^
用戶端的使用說明
設定 Mail Server 就是要拿來用的！所以，當然要介紹一下怎麼使用 Mail Server 啦！我們分為 Linux 與 Windows 稍微做介紹囉！
  • Linux 下使用 mail 功能
    在 Linux 的系統當中，一定會存在的用戶端當中的郵件指令就是 mail 這個指令啦！由於這個 mail 指令是直接使用 sendmail 的 local 端的功能，所以使用 mail 時，即使你的 port 25 沒有啟動，仍然可以寄信喔！早期沒有 POP3 這個協定的服務時，用戶在使用 mail 都需要登入主機之後，才能以 mail 這個指令來操作郵件呢！現在就幸福多了，可以直接用 Netscape 之類的軟體來收發電子郵件說。來談一談怎麼發信與收信吧！

    • 用 mail 直接編輯文字郵件與寄信：
      使用 mail 最簡單的方式就是直接的使用線上編輯的方式來將文字資料傳送出去囉！假如你要發一封信給 vbird@qqdomain.name 時，你可以使用『 mail user@email.domain.name 』的格式，所以你可以這樣做：
      [root @test root]# mail vbird@qqdomain.name
      Subject: This is a test mail
      There are writing area!
      You can't use the Up/Down button in this form...
      you can finish with "."
      . <==這個『.』就是結束符號！要正常離開編輯畫面就是 . ！
      Cc: <==這就是副本！
      如同上面的樣式，mail 會主動的顯示 Subject 給你，你可以輸入這封信的標題在此∼然後就進入編輯畫面啦！你可以在編輯畫面中寫入中英文喔！之後，最重要的是，一定要在開頭的地方輸入那個句號『.』，這樣 mail 就會開始將信傳送出去。在 Red Hat 的預設狀況中，還包含提供了一個副本收受者的郵件位址，就是出現 Cc: 那邊，你可以在後面再接上另一個郵件地址，那就是副本啦！這樣就將信寄出囉！

    • 使用 IP 測試寄信：
      萬一你的 Linux server 並沒有 domain name 時，是否就無法建置 Mail Server 了呢？當然不是啦！還是可以架設 Mail Server 的啦，還記得我們在前面的網路基礎裡面有提過啦，既然有內部 lo 的介面，自然就一定可以讓我們『測試 tcp/ip 架構』的設定啦！既然如此，我又沒有 domain name ，又架設了一個提供只有少數人知道的 mail server 時，那麼人家怎麼寄信給我啊！呵呵！很簡單啊！就利用 IP 來寄信啊！怎麼寄出去？
      [root @test root]# mail vbird@[127.0.0.1]
      [root @test root]# mail vbird@[192.168.0.100]
      看到了嗎？就是將 domain name (FQDN) 以 IP 來置換，而且，使用中括號將 IP 包起來，這個中括號很重要啊！不要忘記了喔！使用 IP 寄信僅是一個權宜之計，畢竟沒有多少人會記得你的主機 IP 啊！並且，若是使用 ADSL 計時制的撥接方式，那麼得到的 IP 是 ISP 動態分配的 ( dynamic )，所以可能每次上網的 IP 都不固定∼那麼不是會搞死人....所以啦，申請一個 domain name ，如果每次上線都會不同 IP 的情況下，也可以申請免費的動態 DNS 系統的領域名稱，而使用國內的 ISP 提供的主機名稱自動對應 IP 的功能也可以啦！這些名稱都可以用來架設 mail server 喔！

    • 用 mail 寄出純文字檔案：
      還記得鳥哥的 Linux 私房菜 -- 基礎學習篇裡面的 Bash shell 提到的標準輸入 ( < ) 嗎？既然我使用 mail 的時候需要用到鍵盤輸入，那麼我當然可以利用『標準輸入』來使檔案替代鍵盤的 Keyin 囉！因為在 mail 的編輯畫面中，我們無法使用上下左右按鍵，而且，如果你剛剛在上一行寫錯字了，還沒有辦法回到上一行呢！編輯上面實在不怎麼人性化。所以，我可以使用任何的文字編輯軟體，將我的信件編輯成檔案，請注意，必需是純文字檔喔！然後再將該檔案寄出即可！例如我要將 root 家目錄底下的 .bashrc 寄出去給 vbird ，可以這樣做：
      語法：
      [root @test root]# mail -s　'這裡可以接郵件標題'　這裡是郵件收件者 < 檔案名稱
      範例：
      [root @test root]# mail -s 'This is a test mail' vbird < /root/.bashrc
      需要注意的是，如果 mail 給帳號而已，那麼就是寄給本機的使用者，如果是以電子郵件地址的寫法，才是向外面寄出去的郵件喔！

    • 用 mail 接收 mailbox 的信件：
      寄信還比較簡單，那麼收信呢？同樣的啦，收信還是使用 mail ，直接在提示字元之後輸入 mail 時，會主動的捉取使用者在 /var/spool/mail 底下的郵件信箱 ( mailbox )，例如我 vbird 這個帳號在 shell 的環境中，輸入 mail 後，就會將 /var/spool/mail/vbird 這個檔案的內容讀出來，並且顯示給 vbird 看！
      語法：
      [vbird @test vbird]# mail
      範例：
      [vbird @test vbird]# mail
      Mail version 8.1.1 6/6/93. Type ? for help.
      "/var/spool/mail/vbird": 2 messages 2 new
      >N 1 root@vbird.adsldns.o Sat Feb 22 13:01 24/945 "test uuencode"
      N 2 root@vbird.adsldns.o Sat Feb 22 13:12 26/838 "This is a test mail"
      &
      在上面的畫面中，顯示 vbird 共有兩封『新信』此外，底下會附上這兩封新信的發信站與標題及時間等。

      • 讀信：有看到『>』那個符號吧！那表示目前 mail 所在的郵件欄位，你可以直接輸入 Enter 即可看到該封信件的內容！另外，你也可以在『&』之後的游標位置輸入號碼，就可以看該封信件的內容了！(註：如果持續按 Enter ，則會自『 > 』符號所在的郵件逐次向後讀取每封信件內容！)
      • 顯示標題：如果要重新顯示每封信的標題，可以輸入 h 即可；
      • 回覆郵件：如果要回覆目前『 > 』符號所在的郵件，直接按下『R』即可進入剛剛前面介紹過的 mail 文字編輯畫面囉！你可以編輯信件後傳回去囉！
      • 刪除郵件：按下『 d## 』即可刪除郵件！例如我要刪除掉第 2 封郵件，可以輸入『d2』如果是要刪除第10-50封郵件，可以輸入『d10-50』來刪除喔！請記得，如果有刪除郵件的話，離開 mail box 時，要使用『q』才行！
      • 儲存郵件到檔案：如果要將郵件資料存下來，可以輸入『 s ## filename』，例如我要將上面第一封郵件存下來，可以輸入『 s 1 uuencode 』即可將第一封郵件內容存成 uuencode 這個檔案！
      • 離開 mail ：要離開 mail 可以輸入 q 或者是 x ，請注意『輸入 x 可以在不更動 mail box 的情況下離開 mail 程式，不管你剛剛有沒有使用 d 刪除資料；使用 q 才會將刪除的資料移除，並且會將所有已讀過的信件內容轉存到你家目錄下的 mbox 檔案！』也就是說，如果你不想更動 mail box 那就使用 x 或 exit 離開，如果想要使剛剛移除的動作生效，就要使用 q 啦！不過，使用 q 之後，只有未讀的信件才會保留在 /var/spool/mail/accout 裡面，其他已讀的資料都會被存入 ~/mbox 當中！例如 /home/vbird/mbox 為儲存 vbird 已讀過的信件！
      • 請求協助：關於 mail 更詳細的用法可以輸入 help 就可以顯現目前的 mail 所有功能！

      上面是簡易的 mail 收信功能！不過，如果離開 mail 時按下 q ，不是會有信件轉存到 ~/mbox 這個郵件信箱嗎？那麼我要如何讀取這個檔案內的信件資料呢？可以簡單的使用這個方式來讀取：
      [vbird @test vbird]# mail -f ~/mbox
      使用『-f file 』規定新的 mail box 檔案，如果沒有 -f file 的話，就會直接使用 /var/spool/mail 裡面的 mailbox 啦！

    • 設定檢查郵件的間隔時間 MAILCHECK：
      如果在你的 Shell 環境下有新信進來時，通常我們的 bash 會很好心的告訴你有來信了！預設的條件中是 60 秒鐘檢查一次 /var/spool/mail 當中是否有新信！如果想要改成 30 秒呢？可以的！直接設定『 MAILCHECK 』(大寫字母)這個變數即可！
      [vbird @test vbird]# MAILCHECK=30
      或者直接將該變數寫入你的 ~/.bashrc 當中亦可！

    • 用 mail 夾帶檔案寄信與收信：
      上面的方法都僅提供『純文字』的寄件而已，如果我想要『夾帶檔案』在郵件當中呢？可以使用 mail 這個指令來達成嗎？呼呼！確實是可行的！不過，單純的 mail 無法達到這個目的，我們還必需要使用檔案譯碼 ( encode ) 的功能才能達到這個夾帶檔案的目的喔！
      寄信：
      [vbird @test vbird]# uuencode 欲夾帶的檔案檔名 編碼的標題 | mail -s 'title' 收件者
      範例：
      [vbird @test vbird]# uuencode ~/.bashrc bashrc | mail -s 'test uuencode' \
      > vbird@tsai.adsldns.org
      這樣信件就送出去啦！而且是附件夾帶喔！你可以使用 Netscape 或者 Outlook 之類的軟體直接收受該檔案，如果是在 shell 環境中，你可以這樣做：
      1. 儲存該郵件使成為檔案：
      [vbird @test vbird]# mail
      Mail version 8.1.1 6/6/93. Type ? for help.
      "/var/spool/mail/vbird": 2 messages 2 new
      >N 1 root@vbird.adsldns.o Sat Feb 22 13:01 24/945 "test uuencode"
      & s 1 testfile
      目前的目錄下會產生一個 testfile 的新檔案

      2. 將捉下來的檔案解碼
      [vbird @test vbird]# uudecode testfile -o outfile
                           uudecode 讀入檔案 輸出的檔案

      如此一來， outfile 就是解碼後的檔案內容啦！至於 testfile 內容有點像這樣：
      From root@vbird.adsldns.org Sat Feb 22 13:01:05 2003
      Return-Path: <root@vbird.adsldns.org>
      Received: from vbird.adsldns.org (localhost [127.0.0.1])
      by vbird.adsldns.org (8.12.7/8.12.7) with ESMTP id h1M514Jc022610
      for <vbird@vbird.adsldns.org>; Sat, 22 Feb 2003 13:01:05 +0800
      Received: (from root@localhost)
      by vbird.adsldns.org (8.12.7/8.12.7/Submit) id h1M514dg022608
      for vbird; Sat, 22 Feb 2003 13:01:04 +0800
      Date: Sat, 22 Feb 2003 13:01:04 +0800
      From: root <root@vbird.adsldns.org>
      Message-Id: <200302220501.h1M514dg022608@vbird.adsldns.org>
      To: vbird@vbird.adsldns.org
      Subject: test uuencode
      Status: R

      begin 666 bashrc
      M(R`N8F%S:')C"@HC(%-O=7)C92!G;&]B86P@9&5F:6YI=&EO;G,*:68@6R`M
      M9B`O971C+V)A<VAR8R!=.R!T:&5N"@DN("]E=&,O8F%S:')C"F9I"@I0051(
      M/2]S8FEN.B]U<W(O<V)I;CHO8FEN.B]U<W(O8FEN.B]U<W(O6#$Q4C8O8FEN
      M.B]U<W(O;&]C86PO8FEN.B]U<W(O;&]C86PO<V)I;CHO=7-R+VQO8V%L+V%P
      M86-H93(O8FEN"F5X<&]R="!0051("@IA;&EA<R!L;3TG;',@+6%L?&UO<F4G
      ""@H`
      `
      end

      真正的檔案內容是 begin 到 end 的那些黃色字體！使用 uudecode 時， uudecode 會主動的分析 begin 開始的欄位，然後將 begin 後面的內容解譯還原成為原來的檔案內容！呵呵！恭喜您！

  • Linux 下使用 telnet 功能
    我們上面提到的是 mail 使用 sendmail 的預設功能，那是屬於 local mailer 的功用！那麼我是否可以藉由 smtp 來寄信呢？亦即使用 SMTP 這個服務來寄信！可以的啦，那就必需要使用 telnet 的功能囉！
    1. 寄信：
    [vbird @test vbird]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Sat, 22 Feb 2003 13:52:52 +0800
    ehlo localhost <==必需先跟主機打招呼喔！
    250-vbird.adsldns.org Hello localhost [127.0.0.1], pleased to meet you
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-8BITMIME
    250-SIZE
    250-DSN
    250-ETRN
    250-AUTH LOGIN PLAIN
    250-DELIVERBY
    250 HELP
    mail from: "Myname"<vbird@vbird.adsldns.org>
    這裡輸入我要寄信的來源郵件地址，請記住，前面""裡頭是顯示在信件表頭的說明，
    後面< >裡面接的才是你真正的郵件地址喔！
    250 2.1.0 vbird@vbird.adsldns.org... Sender ok
    rcpt to: <root@vbird.adsldns.org> <==輸入郵件送達的目的端郵件地址
    250 2.1.5 root@vbird.adsldns.org... Recipient ok
    data　<==要開始寫信了喔！告知 data ！
    354 Enter mail, end with "." on a line by itself
    This is just testing
    .　　　　　　　<==這兩行是內容！不要忘記 . 這個咚咚！
    250 2.0.0 h1M5qqJc022990 Message accepted for delivery
    quit<==離開 telnet 程式！
    這樣信件就寄出去啦！
    這樣就 OK 啦！ ^_^！
    註：Linux 下使用 telnet 功能，在 MAIL FROM、RCPT TO 內，後面接的項目若是 e-mail 的話，應該使用 "< >" 包起來，這樣子才正確。
      MAIL FROM: usersname<userid@hostname.domainname>
      MAIL FROM: "users name"<userid@hostname.domainname>
    另外許多 MTA 目前都會限制再使用 MAIL FROM 時要先使用 HELO或者是 EHLO 先打招呼過，要不然會不允許進行後續溝通。

  • X-Window 與 Windows 的 MUA 功能
    Outlook 與 Netscape 會用吧？！由於是全圖形介面，所以也沒有什麼好特別說明的地方，底下就來說一說關於 outlook 的設定方法，其他的 MUA 介面設定的方法都差不多啦！仔細參考一下即可囉！
    1. 開啟 OutLook，點選『工具』裡面的『帳號』；
    2. 點選『新增』選擇『郵件』來設定；
    3. 輸入顯示名稱：這個名稱是別人在收信的時候，可以看到的寄件人稱謂；
    4. 接著下來比較重要了，請使用你的 ID@hostname.adsldns.org 登入你的郵件伺服器；
    5. 然後，當然郵件伺服器收發都是同一個，請使用你的 DNS 申請的名稱；
    6. 輸入帳號與密碼，也可以選擇『記憶密碼』，然後按下一步，就完成了。
    基本上，Windows 這邊只要設定如此即可！然後你就可以用你的 Linux 來當郵件伺服器囉！！
關於郵件主機安全的設定
Sendmail 常常被傳成『安全性很差的郵件伺服器！』當然， Sendmail 官方網站也很不滿的回應說『其實， Sendmail 的問題來自於一些"該死的"檔案權限設定錯誤的狀況！』也就是說，其實 sendmail 常常會因為『系統管理員』設定檔案或者目錄不良的情況下，導致 Mail Server 發生問題囉！所以，底下我們就來說一說這個 sendmail 的安全性與其他相關的安全方面設定吧！
    sendmail 本身的安全設定項目( Sendmail 官方的建議 )

    sendmail 本身已經提供相當多的安全項目建議，其中，大部分是在於『目錄與檔案權限』的設定要求上面！

    • 請確定 aliases 這個檔案的權限，僅能系統信任的 User 可以存取，通常其權限為 644 ；
    • 請確定 sendmail 讀取的資料庫 ( 多半在 /etc/mail 底下的 *.db 檔案 )，例如 mailertable, access, virtusertable 等等，僅能由系統信任的使用者讀取，其他一概不能讀取，通常權限為 640 ；
    • 系統的佇列目錄 ( /var/spool/mqueue ) 僅允許系統讀取，通常權限為 700 ；
    • 請確定 .forward 這個檔案的權限也不能設定成為任何人均可查閱的權限，否則您的 e-mail 資料可能會被竊取∼
    • 總之，一般用戶能夠不用 .forward 與 aliases 的功能，就不要使用！

    不過，這樣的設定自然不夠安全的啦！在 Sendmail 8.12 版本以後，甚至嚴格的規定系統的操作者為 smmsp 這個使用者呢！會更加的安全一些∼如果您有興趣的話，不妨將您的 sendmail 以底下介紹的 Tarball 的方式升級更新到 sendmail 8.12 版喔！

    SMTP 認證

    由前面的 Sendmail 的設定說明當中，您是否覺得上面所設定的 Sendmail 已經夠用了呢？呵呵！想必是不夠的！鳥哥我就覺得，嗯！還是有待加強！怎麼說呢？想個例子好了，由於我的 sendmail 為了 Open Relay 的問題，所以勢必要關閉所有的 relay ，而僅開放 Mail 本機以及部分網域或者主機的 Relay 使用權！不過，我總有在外面工作的時候吧！我總是有使用計時制 ADSL 這種非固定 IP 的連線模式來上網的時候吧！我的 Mail Server 上面的用戶總有使用 notebook 而到處跑得吧！如此一來，這個 /etc/mail/access 的設定勢必是不夠的∼那要怎麼辦呢？

    想像一下，如果我的 sendmail 也跟 pop3 這個收信服務一樣，在要求傳信的時候，必須提供帳號與密碼讓 Mail 主機來認證，如此一來，不就可以藉由這帳號、密碼的機制來限制使用者的使用了嗎？！呵呵！好樣的！沒錯，確實可以使用這樣的機制。事實上，目前較常被使用的這種認證機制為 SMTP 郵件認證機制 ( SMTP Authorization ) ，主要透過 cyrus sasl 這個套件來達成郵件的認證動作，那麼到底他是如何達到認證的呢？

    • Cyrus SASL 的動作：
      Cyrus Simple Authentication and Security Layer 簡稱為 Cyrus-SASL ，他最大的功能在提供一些應用程式所使用的認證函式庫！這裡頭最有名的例如 Sendmail 這個郵件伺服器了！ 應用程式可以透過 SASL 所提供的函式庫功能，並且定義出認證的方式，讓 SASL 透過與主機的溝通動作，提供應用程式來達到認證的目的！舉個例子來說，如果我的 sendmail 已經提供了 SMTP 認證的功能，那當使用者進入認證階段時：

      1. 首先， sendmail 會去取用 SASL 的函式庫資料；
      2. 此外，由於 SASL 可以進行的認證機制相當的多，所以 sendmail 必須要指定 SASL 的認證方式，一般而言，我們都會直接以 /etc/shadow 裡面的帳號密碼來進行認證！至於針對 sendmail 的 SASL 認證方法則預設設定在 /usr/lib/sasl/Sendmail.conf 或 /usr/lib/sasl2/Sendmail.conf (根據 cyrus SASL 版本的不同而異！)
      3. SASL 根據設定的方法去取用密碼與帳號內容，並且加以比對，回應給 sendmail 該次比對是否成功！

      基礎的流程是這樣，不過 SASL 除了 Sendmail 的認證模式之外，其實他還提供很多的功能啦！因為 SASL 主要就是一個函式庫，而這個函式庫還具有額外的提供『密碼認證檔案』的功能，所以，只要是能夠支援 SASL 的應用程式，就可以利用 SASL 所提供的這個認證功能來達到共享同一認證的好處！例如同一個 user 在 LDAP 與 Sendmail 這兩個軟體中，均可以使用同一組帳號與密碼！而不需要額外的針對不同的套件來設定額外的帳號與密碼！

      若單純的指 Sendmail 這個應用程式的話，那麼 SASL 至少可以提供使用 /etc/shadow 與 PAM 這兩個密碼驗證機制，不過請特別留意的是， cyrus SASL 目前已經出到第二版了，而現今的 sendmail 大部分還是以 1.5.xx 版本進行設定的。實際上，這兩個版本的認證原理與方法雖然一樣，但是認證使用的執行檔已經不同了！所以在 /usr/lib/sasl2/Sendmail.conf 這個檔案當中的設定內容也不一樣了！如果您要設定 SMTP 的 AUTH 的話，請特別留意這個不同點喔！

    • 實作的流程說明：
      由前面的介紹我們知道，要使用 SMTP AUTH 這個功能，你必須要：

      1. 你的 Linux Server 必須要已經安裝 Cyrus SASL 函式庫；
      2. 你的 /usr/sbin/sendmail 這支程式必須要將 SASL 的函式庫功能編譯在內；
      3. sendmail 設定檔 ( sendmail.cf ) 必須要將 SASL 的功能啟動 ( 註：/usr/sbin/sendmail 雖然已經將 SASL 函式庫編譯在內，但是 sendmail.cf 這個檔案仍然要將 SASL 的支援啟動之後，才能使用 SMTP )；
      4. 必須指定 sendmail 的 SASL 認證模式，通常有 pam 與 shadow 兩種模式，在 SASL version 1 當中， sendmail 的 SASL 認證模式設定檔為 /usr/lib/sasl/Sendmail.conf ( S 為大寫 )，若為 SASL version 2 則在 /usr/lib/sasl2/Sendmail.conf ！而如果 Sendmail 裡面設定為 pam 的話，那麼 /etc/pam.d 裡面亦需存在 smtp 這個檔案才行！(所以我們通常都使用 shadow 而已∼)
      5. 重新啟動 sendmail 即可！

      可以看得出來，要讓你的 Sendmail 由無到有的支援 SMTP AUTH 的話，那麼就必須要重新編譯 /usr/sbin/sendmail 這個執行檔！哇！那就必須要使用 Tarball 的方式，並且依照上面的動作，一步一步的進行啦！過程還頗為繁複呢！這個動作我們在底下 以 Tarball 完整安裝具有 SMTP 的 sendmail 部分再來講解，如果您的 sendmail 並非為 Red Hat 的話，就得前往 Tarball 安裝 sendmail 的章節了，不過，如果是 Red Hat 呢？恭喜您啦！因為 Red Hat 的 Sendmail 預設已經包含了 SASL 的函式庫功能，只是預設的參數設定檔 ( sendmail.cf ) 並沒有啟用這個功能而已∼底下我們就先以簡單的 Red Hat 的 sendmail 來說明啟動 SMTP AUTH 的流程吧！

    • Red Hat 的 SMTP 認證啟用流程：
      很棒的是， Red Hat 的 sendmail ( /usr/sbin/sendmail 執行檔 ) 已經支援 Cyrus SASL 了，只要將 sendmail.cf 裡面關於 SMTP 認證的功能啟動即可！所以，只要去編輯 /usr/share/sendmail-cf/cf/redhat.mc 即可 ( 註：這個檔案在不同的版本中，也會有被放在 /etc/mail/sendmail.mc 的時候！反正只要找到 sendmail.mc 或 redhat.mc 就對啦！ ) ：

      1. 修改 m4 script :
      [root @test root]# cd /usr/share/sendmail-cf/cf
      [root @test cf]# vi redhat.mc　　　<==也有可能是 /etc/mail/sendmail.mc
      找到這幾行：
      dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA') <==這一行應該已經改過了！看上面
      將他修改成底下這樣：
      TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')

      2. 開始製作 sendmail.cf 檔案：
      [root @test cf]# m4 redhat.mc > redhat.cf
      [root @test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.20030224
      [root @test cf]# cp redhat.cf /etc/sendmail.cf

      3. 啟動 sendmail 與測試 SMTP AUTH
      [root @test cf]# /etc/rc.d/init.d/sendmail restart
      Shutting down sendmail: [ OK ]
      Starting sendmail: [ OK ]

      [root @test cf]# telnet localhost 25
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      220 test.adsldns.org ESMTP Sendmail 8.11.6/8.11.6; Mon, 24 Feb 2003 11:51:04 +0800
      ehlo localhost <==輸入本機狀態的測試
      250-test.adsldns.org Hello tsai.adsldns.org [127.0.0.1], pleased to meet you
      250-ENHANCEDSTATUSCODES
      250-8BITMIME
      250-SIZE
      250-DSN
      250-ONEX
      250-ETRN
      250-XUSR
      250-AUTH LOGIN PLAIN <==出現這行就對啦！
      250 HELP
      quit

      如果出現上面的 AUTH LOGIN PLAIN 那一行的話，就表示 SMTP AUTH 已經正確的啟用啦！這個時候，你就可以將 /etc/mail/access 這個檔案裡面的相關設定給他取消掉！直接以 SMTP 來抵擋囉！不過，無論如何，如果是內部的信件，使用 /etc/mail/access 的設定還是比較簡單啦！ ^_^

    • 用戶端 Client 的設定：
      既然 SMTP AUTH 是使用使用者提供的帳號密碼來進行身份的確認，那麼自然我們就得在 Client 的 MUA 上面進行帳號密碼的設定囉！如果你的系統是 Windows ，使用的 OutLook 的話，那麼應該要勾選底下這個咚咚：

      如果是 Netscape 的話，那就需要填寫發信者姓名囉：

      這樣您就可以使用 SMTP AUTH 帶來的方便性囉！

    那麼 SMTP 到底在那個步驟生效的呢？如果我們以前面提到的 一封郵件的收受流程 當中，再加入這個帳號與密碼的功能時，那信件會變成怎麼跑呢？

    1. 還是會先判斷是否有收件人在本機帳號中，若有則收，沒有則下一步；
    2. 還是會判斷 /etc/mail/access.db 的動作設定，若有則作動作，否則下一步；
    3. 開始啟動帳號密碼的機制判斷，若使用者提供的帳號密碼可以通過這個機制，則信件開始 relay ，否則下一步；
    4. 將原信件退給發信者！

    大致的流程就是這樣啦！所以囉， /etc/mail/access 還是有存在的價值喔！尤其針對內部網域而言∼

    關於 ORDB 抵擋 open relay 郵件主機之機制說明與實作

    什麼是 Open Relay 呢？我們還記得在原理說明的地方曾經提過 Relay 這個玩意吧！目前預設的 Mail Server 都已經將 Relay 關閉了，而僅開放部分的信任網域，或者是直接經由類似 SMTP AUTH 的認證機制來進行 Relay 的功能！而如果一個 Mail Server 對於 Client 端的 Relay 需求完全的接受，那就是 Open Relay 啦！如果你的 Mail Server 被測試出有 Open Relay 的情況，那麼你的郵件主機將會被當成是『黑名單』的一員，情節較輕者，可能會被停止使用 mail 的權力，情節較重者，則可能被完全停止使用網路的權力！關於台灣地區『學術網路黑名單』的 IP 資料，您可以在底下的網址查詢到：

    http://140.111.1.22/tanet/spam.html

    我們上面介紹了很多的 Sendmail 相關的技巧與設定，可以讓我們的主機不至於被當成『黑名單』的一員，不過，由於開放 Open Relay 的郵件主機對於網域內的網路具有相當大的破壞力，因為頻寬會被吃光光，所以，如果我們發現有 Open Relay 的主機，其實也可以抵制我們的用戶將信送到對方的主機的，以提醒我們的用戶端『咦！應該要強迫對方郵件主機管理員進行維護了！』

    可不可能達到這樣的目的呢？可以的，就使用 Internet 上面提供的 Open Relay 名單資料庫來進行『校閱』的動作啦！那麼這個方法是如何工作的呢？是這樣的：『當我們的 Sendmail 要傳送信件到下一個 MTA 時，會先到 Open Relay 黑名單資料庫查詢該主機 IP 或主機名稱是否在黑名單中，若不在黑名單中，則進行 Relay ，若在黑名單當中，則停止 Relay 的動作，並將信件退回，且在退回的信件上面註明此信被退回的原因，以提供使用者向網站管理員申訴的意見之用！』那麼那個網路黑名單資料庫在哪裡呢？目前有很多黑名單資料庫，鳥哥我使用的是 http://www.ordb.org 這個網站提供的資料庫確認喔！

    • 如何確認一部主機是否具有 Open Relay 的問題？
      有 Open Relay 可是很危險的呢！那麼如何確定我自己的主機有 Open Relay 呢？
      1. 是否已在黑名單資料庫中：確認的方法很簡單，直接到『http://www.ordb.org/lookup/』輸入您的主機名稱或者是 IP ，就可以檢查是否已經在黑名單當中；
      2. 是否具有 Open Relay ：如果要測試你的主機有沒有 Open Relay ，直接到『http://www.ordb.org/submit/』這個網頁，同樣輸入主機或者 IP ，就可以將你的 IP 加入 Open Relay 的排程中，此時 ORDB 會主動的寄信給你的 Mail Server ，以確認該主機是否為 Open Relay 呢！
      3. 如何移除：如果被檢查出，您的主機已經在黑名單當中，那麼請立刻將 Open Relay 的功能關閉，改善你的 Mail Server 之後，再以移除的方法『http://www.ordb.org/submit/』進行檢查，如果檢查出已經改善了，那就會自動將該黑名單資料庫中移除！

    在 Sendmail 上面啟用 ORDB 網站提供的功能實在很簡單，請依照底下的步驟進行即可：

    1. 修改 m4 script :
    [root @test root]# cd /usr/share/sendmail-cf/cf
    [root @test cf]# vi redhat.mc　　　<==也有可能是 /etc/mail/sendmail.mc
    在 MAILER 之前加入這一行，請注意，底下是『同一行』：
    FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

    2. 開始製作 sendmail.cf 檔案並啟動 sendmail：
    [root @test cf]# m4 redhat.mc > redhat.cf
    [root @test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.20030224
    [root @test cf]# cp redhat.cf /etc/sendmail.cf
    [root @test cf]# /etc/rc.d/init.d/sendmail restart
    Shutting down sendmail: [ OK ]
    Starting sendmail: [ OK ]

    千萬不要懷疑，這樣即刻生效了啦！ ^_^

    Procmail 相關說明

    什麼是 Procmail ：
    什麼是 procmail 呢？簡單的說， Procmail 可以被視為一個 MDA 啦，也就是說，當 mail server 取得了自家的信之後，會將該封信件交給 procmail 來進行處理，而 procmail 會經由分析該郵件的內容，以及使用者設定的相對應狀態，來將信件進一步過濾 ( filter )！舉個例子來說，你曉得有一個以『AV情色』為郵件主旨的信件，其實他是一個廣告信，那麼你想讓 mail server 主動的將這種信件『丟掉』的話，那麼可以在 procmail 的設定檔當中，加入分析此一郵件主旨，以後，若來信符合這個設定時，就會被 procmail 丟棄了！當然 procmail 的功能還不止於此，這僅是最簡單的功能而已∼

    啟用 Procmail 的支援：
    基本上，如果你要啟動 procmail 的話，就必需要再次的修改您的 m4 scripts 檔案，也就是 redhat.mc 那個檔案啦！不過， Red Hat 各個版本的 sendmail 預設都已經啟動 procmail 啦！所以你可以不需要修改呢！無論如何，我們還是來看一下 與 procmail 有關的 m4 script 設定內容吧！

    [root @test root]# cd /usr/share/sendmail-cf/cf
    [root @test cf]# vi redhat.mc　　　<==也有可能是 /etc/mail/sendmail.mc
    底下僅列出與 procmail 有關的設定
    define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl <==procmail 的執行檔完整檔名
    FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl <==加入 procmail 之設定
    MAILER(smtp)dnl
    MAILER(procmail)dnl <==procmail 請放置在 smtp 後面喔！

    是的，就是這幾行而已，你的 procmail 就已經被支援成為 MDA 啦！如果您是以 Tarball 安裝 Procmail 的話，那麼請記得將上面那幾行對應到你的系統當中喔！切記切記！

    開始設定 Procmail 的過濾規則：
    剛剛說過， Procmail 是利用『使用者定義出的過濾規則』來進行郵件的過濾的，那麼這個檔案預設放在哪裡呢？預設就是放在 /etc/procmailrc 這個檔案啦！不過，這個檔案預設是不存在的，也就是說，雖然你啟動的 procmail 的 MDA 功能，但是你並沒有啟用任何的規則，所以當然進入 mail server 的郵件，就不需要被『過濾』啦！而如果你定義出規則在 /etc/procmailrc 之後，以後信件就會拿該規則來進行過濾囉！在此需要先介紹一下，一封郵件的內容主要分為兩部分：
    1. 表頭 ( Header ) 一些基本資訊如寄件者、標題等等；
    2. 主要內文 ( Body ) 部分
    至於 Procmail 過濾規則的設定方法是這樣的：

    一組規則設定共含有三行：
    :0 [flags] [ : [locallockfile] ] <==設定要被過濾郵件的檢查地方
    <zero or more conditions (one per line)> <==被檢查的規則內容
    <exactly one action line> <==若符合所定義的規則內容，則郵件要進行的動作！

    參數說明：
    a. 關於檢查郵件的部分(第一行)，flags 包含有：
        H : Header 的檢查
        B : Body 的檢查
        h : 提供 Header 的資料，進入 pipe 、 file 及 mail 等的檢查
        b : 提供 Body 的資料進入 pipe, file 及 mail 等的檢查！
    b. 關於檢查內容的部分：
        ! : 這是反向選擇的意思
        < : 檢查 mail 的總長度是否小於設定值 ( bytes )
        > : 與 < 相反的選擇囉！
    c. 關於動作的部分
        | : 開始啟用後續的 shell 程式工作！
    d. 其他的環境變數部分：
        PATH　　　　搜尋執行檔的路徑
        SENDMAIL　　那個 /usr/sbin/sendmail 囉！
        LOGFILE　　登錄檔！通常設定在 /var/log/procmail.log
    e. 與 Regular express 相關的部分：
        ^ : 開始(同一行最左邊)字元
        $ : 本行的結束字元(最右邊)的比對
        . : 除了新增一行之外的任何字元！
        \ : 跳脫字元
    更詳細的內容請務必參考：
    man procmailrc
    man procmailex

    如果有興趣的話，可以參考我設定的 /etc/procmailrc 的檔案內容喔！你也可以下載喔！

    # History of procmail RC file,
    # Written by VBird
    ############ History ############################################
    # Day Who What
    # ---------- ------ ---------------------------------------
    # 2002/05/04 VBird First build, all is the same with
    # 臥龍小三 ftp://ftp.tnc.edu.tw/pub/Sysop/MAIL/procmailrc
    # 林克敏 http://freebsd.lab.mlc.edu.tw/procmail.htm
    # 2002/05/04 VBird 新增廣告信件移除兩個！
    # 2002/05/06 VBird 新增 Klez.W32 病毒的針測
    #################################################################
    ############ Globle settings ####################################
    LOGFILE=/var/log/procmail.log

    ################ Virus scanner ##################################
    ############# 1. KLEZ.G Virus ###################################
    :0b
    * ^Subject:.*(Let's be friends)
    /dev/null

    :0b
    * ^Subject:.*A funny game
    /dev/null

    :0b
    * ^Subject:.*Hello\,.*\,how are you.*
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-wav.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-midi.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*application/octet-stream.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 Bb
    * ^This game is my first work.*
    * ^You\'re the first player.*
    * I.*you would .* it.*
    /dev/null

    :0 Bb
    * Hello,This is a.*
    * I.*you would.*it.*
    /dev/null

    :0 Bb
    * ^This is a.*
    * ^I.*you would.*it.*
    /dev/null

    :0 Bb
    * .*This is a.*patch.*
    * ^I .* you would.*it.*
    /dev/null

    :0 Bb
    * .*iframe src=3Dcid.*height=3D0 width=3D0.*
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="ANTI_CIH.EXE"
    /dev/null

    :0b
    * ^Subject:.*W32.*removal tools$
    /dev/null

    :0b
    * ^Subject:.*Worm Klez.*immunity.*
    /dev/null

    ############# 2. Nimda Virus ####################################
    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="readme.exe"
    /dev/null

    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="sample.exe"
    /dev/null

    ############# 3. SirCam Virus ###################################
    :0 Bh
    * I send you this file in order to have your advice
    /dev/null

    #################################################################
    ############# 廣告信 ###########################################
    :0 Bh
    * ^Content-Type:.*image/jpeg.*
    * name=.*188088.*jpg.*
    /dev/null

    :0 Bh
    * .*03\)3674213
    /dev/null

    :0 Bh
    * ^filename="文字檔.*txt"
    /dev/null

    :0 Bh
    * src=3D"http://www.hotrank.com.tw/.*
    /dev/null

    :0 Bh
    * http://directU.to/evo.*
    /dev/null

    :0 Bh
    * ^Subject:.*七色彩---
    /dev/null

    :0 Bh
    * Subject:.*:::.*FLASH
    /dev/null

    :0 Bh
    * Subject:.*同樣是家具.*
    /dev/null

    :0 Bh
    * Subject:.*告別水患夢夢靨.*
    /dev/null

    :0 Bh
    * .*02-22703023
    /dev/null

    :0 Bh
    * http://www.5800.idv.tw
    /dev/null

    :0 Bh
    * Subject:.*2002.*年最新完全燒錄教學
    /dev/null

    :0 Bh
    * http://61.220.96.168/
    /dev/null

    :0 Bh
    * http://rainbow9988.123go.cx/
    /dev/null

    :0 Bh
    * ^Subject:.*--DVD--
    /dev/null

    :0 Bh
    * ^Subject:.*線上網路購物商店
    /dev/null

    :0 Bh
    * http://www.sitea.org.tw
    /dev/null

    :0 Bh
    * http://www.twlife.com.tw
    /dev/null

    :0 Bh
    * http://61.218.160.190/cgi-bin
    /dev/null

    :0 Bh
    * http://dvd-dhl.iscool.net
    /dev/null

    :0 Bh
    * toolking.idv.tw/
    /dev/null

    :0 Bh
    * Subject:.*中英文簡訊至全球.*
    /dev/null

    :0 Bh
    * Subject:.*網路行銷者的必備利器.*
    /dev/null

    :0 Bh
    * 亞洲美女圖鑑
    /dev/null

    :0 Bh
    * http://www.xline.com.tw
    /dev/null

    :0 Bh
    * 全部軟體序號.保證100%可執行
    /dev/null

    :0 Bh
    * 鉅靡新片
    /dev/null

    :0 Bb
    * Content-Type:.*/image/gif
    * name=.*Index.gif
    /dev/null

    :0 Bh
    * DVD.*IMAX
    /dev/null

    :0 Bh
    * Begess滿足您的需求
    /dev/null

    :0 Bbh
    * http://landy.h8h.com.tw
    /dev/null

    :0 Bbh
    * 010-62568919
    /dev/null

    :0 Bbh
    * 床上技術及挑逗技巧嗎
    /dev/null

    :0 Bbh
    * 正宗亞熱系列套圖
    /dev/null

    :0 Bbh
    * 您知道亞熱系列嗎
    /dev/null

    :0 Bbh
    * 設計專家教程光碟
    /dev/null

    :0 Bbh
    * http://0933.to/lkk
    /dev/null

    :0 Bbh
    * 3D全系列特效立體DVD
    /dev/null

    :0 Bh
    * http://home.kimo.com.tw/amity54088
    /dev/null

    :0 Bh
    * http://home.kimo.com.tw/kklife0001
    /dev/null

    :0 Bh
    * http://rich4u.24cc.com/
    /dev/null

    :0 Bh
    * http://susan88.126.com
    /dev/null

    :0 Bh
    * Subject:.*AV66情色派
    /dev/null

    此外，您還要新增一個檔案在 /etc/logrotate.d 裡面才行！因為你會多一個 /var/log/procmailrc 的檔案啊！

    [root @test root]# vi /etc/logrotate.d
    /var/log/procmail.log {
    monthly
    rotate 5
    nocompress
    }

    其他 Procmail 相關的資訊可以查詢底下的網站喔！
    http://www.procmail.org
    http://www.sektorn.mooo.com/era/procmail/mini-faq.html
Tarball 的安裝方式 ( 適用於原本 Linux 沒有 sendmail 或者是認證機制的！ )
Sendmail 的安裝方面真的是相當的『雪特！』比那個 LAMP 還要麻煩的多∼所以，如果你的系統當中主要是以 sendmail 做為你的郵件伺服器軟體，例如 Red Hat 7.2, Red Hat 7.3 等等的，那麼就以你的 distribution 提供的軟體來安裝！不要直接使用 Tarball 的方式安裝，因為要配合的套件實在太多了，鳥哥也說不準是否有什麼咚咚忘記給他安裝上來ㄋㄟ！所以，除非你是最近釋出的 distribution 例如 Mandrake 9.0 ，因為他使用的並非是 sendmail ，或者是 OpenLinux Server 3.1.1 ，因為他的 sendmail 預設沒有 認證機制 存在，否則，盡量以你的 distribution 提供的 sendmail ( RPM 版本 ) 來安裝你的郵件伺服器吧！例如 Red Hat 7.x 版的就直接由 Red Hat 提供的 sendmail 為準吧！

如果你是使用 OpenLinux Server 3.1.1 以及 Mandrake 或者是其他並非使用 sendmail 的 Linux distribution 時，由於這些 distribution 不是提供其他的 mail server package 而沒有 sendmail ，就是在郵件伺服器套件上面缺東缺西的，例如缺乏 procmail, cyrus-sasl....等等的套件，所以，看來您也只好摸摸鼻子，好好的自行加油努力以 tarball 的方式來安裝囉！那麼與 RPM 版本類似的，你需要的套件有哪些呢？至少需要有底下這幾個，郵件伺服器的功能才夠完整喔：
  • sendmail：http://www.sendmail.org/
  • cyrus-sasl：http://asg.web.cmu.edu/cyrus/download/
  • procmail：http://www.procmail.org
基本上，我們目前僅安裝 sendmail 及 cyrus-sasl 就好了！不過，考慮有些 Linux Distribution 並沒有提供相關的功能，所以我們還是安裝一下 procmail 好了！因為那個 Cyrus SASL 就是要達成 SMTP 認證的重要工具，而我們的 senmdail 是用他來做認證的，所以兩者要一起編譯與安裝才行吶！！直到目前為止 ( 2003/02/20 ) 我們使用最新的 Cyrus-SASL 2.1.12 版以及 procmail 3.22，至於 sendmail 則使用 8.12.7 版！首先，我們必需先建立密碼資料的函式庫，亦即 Cyrus SASL 這個套件與 Procmail 喔： ( 註：目前 sendmail 或其他的，例如 postfix 等郵件伺服器軟體，主要仍以 Cyrus-sasl 1.5.28 這個版本來安裝的，包括 sendmail 官方網站的介紹「http://www.sendmail.org/~ca/email/auth.html」亦是使用 1.5.28 來做介紹！不過， Cyrus SASL 的官方網站說， 2.xx 版本的 SASL 比較優良，所以，這裡我們參考了 sendmail 官方網站，以及 Cyrus SASL 的官方網站的文章，整理出底下的安裝步驟囉！ )

安裝 Cyrus SASL 2.xx 版本！
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了！)
[root @test root]# cd /usr/local/src
[root @test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最後建立一個 cyrus-sasl-2.1.12 的目錄

2. 再來就是設定你的 cyrus SASL 的參數以及編譯囉！
[root @test src]# cd cyrus-sasl-2.1.12
[root @test cyrus-sasl-2.1.12]# ./configure \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run
注意上面的語法！！那個 \ 是跳脫字元喔！後面直接 Enter ！
不要接任何空白或者是 tab 按鍵！若有問題，請到 Shell 看看！
至於那個 pwcheck 的項目，就是要用來做為密碼確認的一個咚咚囉！

[root @test cyrus-sasl-2.1.12]# make clean && make
[root @test cyrus-sasl-2.1.12]# make install
上面三個步驟會花去一些時間，請耐心等待∼
而由於我們剛剛設定了 --prefix=/usr/local/cyrus-sasl2 這個參數，
所以， make install 之後，我們有用的函式庫會在
/usr/local/cyrus-sasl2/lib/sasl2 這個路徑當中，但是， cyrus 程式
會主動去找 /usr/lib/sasl2 這個目錄！所以，我們必需要做連結檔！

[root @test cyrus-sasl-2.1.12]# cd /usr/lib
[root@vbird lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
這樣就建立起連結檔囉！很厲害喔！

3. 準備建立 sendmail 與 cyrus SASL 使用的簡易設定檔：
[root @test lib]# cd /usr/lib/sasl2
[root @test sasl2]# echo 'pwcheck_method: saslauthd' > Sendmail.conf
注意了！一般來說， sendmail 會使用 SASL 這個函式庫裡面，
在 /usr/lib/sasl2/Sendmail.conf 這個檔案的設定做為他的預設使用 SASL 的
參數檔案，那個 Sendmail 的 S 是大寫，請不要寫錯了！我們使用 SASL 預設的
saslauthd 這支程式做為密碼認證的 daemon 囉！

4. 建立一些需要的參數：
[root @test sasl2]# vi /etc/man.config
新增一行：
MANPATH /usr/local/cyrus-sasl2/man

5. 檢驗 saslauthd 這支程式是否可行！
[root @test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
[root @test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root @test saslauthd]# make testsaslauthd
[root @test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
若顯示 OK 的話！那麼就是成功啦！很好！我喜歡∼

6. 設定開機時啟動
[root @test saslauthd]# vi /etc/rc.d/rc.local
加入這一行：
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

安裝 Procmail
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了！)
[root @test root]# cd /usr/local/src
[root @test src]# tar -zxvf /root/procmail-3.22.tar.gz
.....(略).....最後建立一個 procmail-3.22 的目錄

2. 直接給他安裝！
[root @test src]# cd procmail-3.22
[root @test procmail-3.22]# make install
[root @test procmail-3.22]# which procmail
/usr/bin/procmail

這樣就大功告成了！接下來準備安裝 Sendmail 囉！

0. 首先將原有的 sendmail 資料備份例如 /etc/mail 目錄底下的檔案！
   並且，必需要確定有安裝 Berkeley DB 等相關的函式庫！這是 makemap 要用的喔！
[root @test root]# mv /etc/mail /etc/mail.old
請注意！如果您使用的 Linux Distribution 並非為 sendmail ，那麼上面的
目錄可能不會存在！請詳細的參考您的主機上面的說明喔！

[root @test root]# locate libdb.so
/lib/libdb.so
這個檔案請『務必存在！』可能是 libdb.so 或 libdb.a 的形式！
這個檔案是 Berkeley 資料庫的主要函式庫，這是用來做為 makemap
的一些資料庫格式所必需要的函式庫，如果你的系統不存在，那麼請
拿出你的原版光碟片來安裝！通常這個套件的檔名應該是 db3-devel.....
或者是 libdb3..... 的檔案名稱！請以 RPM 來安裝吧！
基本上，反正你的光碟片上(不管幾片，全部拿出來喔！)所有
檔名為 db#### 及 libdb### 的檔案都裝上去就對了！
至於相關的屬性相依問題，請參考 RPM 與 Tarball 的安裝一文。

[root @test root]# locate libwrap
/usr/lib/libwrap.a
這個檔案與等一下我們要建立的 TCP_Wrappers 的支援有關，
請確定他的存在喔！如果不存在的話，而你的系統又是 MDK 9.0 時，
可以拿出第三片來安裝 tcp_wrappers-devel..... 那個 RPM 檔案，
如果是其他的 distribution 同時又找不到 libwrap.a 時，
那底下 site.config.m4 裡面的 -DTCPWRAPPERS 及 -lwrap 都拿掉！
不要支援也沒有關係！

1. 將 sendmail 解壓縮，假設您下載的資料在 /root 底下
[root @test root]# cd /usr/local/src
[root @test src]# tar -zxvf /root/sendmail.8.12.7.tar.gz
.....(略).....會建立一個名為 sendmail-8.12.7 的目錄

2. 建立 sendmail 所需要的 Cyrus SASL 支援之設定項目：
[root @test src]# cd /usr/local/src/sendmail-8.12.7/devtools/Site
[root @test Site]# vi site.config.m4
PREPENDDEF(`confMAPDEF', `-DMAP_REGEX')
APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl2')
APPENDDEF(`confLIBDIRS', `-L/usr/local/cyrus-sasl2/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/cyrus-sasl2/include')
define(`confMANROOT', `/usr/share/man/man')
這個 site.config.m4 是 sendmail 在編譯的時候會主動去讀取的主機自行設定檔。
上面這六行是需要自行建立的！請特別注意， cyrus sasl 的 2.x 與 1.5 版
在安裝與設定上是不一樣的！所以這裡請特別留意喔！不要搞錯了！
第一行：上面第一行與一些正規表示法有點關係，可加可不加！
第二行：第二行在設定支援的模式，我們支援了 TCP_Wrappers 及 SASL 身份認證！
        關於 TCP_Wrappers 請參考前面『簡易防火牆』的說明吧！
        至於 -DSASL=2 則是 SASL 第二版的格式！
第三行：第三行與第二行有點關係，使用 TCP 時需要用到 libwrap.a 這個檔案，
        那就是 lwrap 這個標誌！至於 -lsasl2 就是 libsasl2.so 那個檔案啦！
第四行與第五行：這兩行 /usr/local/cyrus-sasl2 指的是我的 SASL 的資料庫所在目錄，
如果你不是安裝在這個目錄的話，請依照您剛剛在建立 cyrus sasl 下達的
--prefix=/你的/目錄來填寫喔！還有其他相關的說明，請參考您主機內的
/usr/local/src/sendmail-8.12.7/sendmail/README
請注意，如果您確定可以支援 TCP_Wrappers 之後，那麼你就可以在
/etc/hosts.deny, /etc/hosts.allow 以底下的樣式來抵擋 IP 或主機名稱
sendmail: 192.168.0.0/255.255.255.0 :Allow
sendmail: 192.168.0.100: deny
更多的 TCP_Wrappers 資訊請參考『認識網路安全』

3. 開始編譯 sendmail 囉與新增 sendmail 管理員 smmsp
[root @test Site]# cd /usr/local/src/sendmail-8.12.7/sendmail
[root @test sendmail]# sh Build -c
......(略).....會花很多時間喔！
[root @test sendmail]# groupadd -g 40 smmsp
[root @test sendmail]# useradd -M -g smmsp -u 40 -d /var/spool/clientmqueue -s /dev/null smmsp
[root @test sendmail]# mkdir -p /var/spool/clientmqueue
[root @test sendmail]# chown -R smmsp:smmsp /var/spool/clientmqueue
[root @test sendmail]# chmod -R 770 /var/spool/clientmqueue
新增一個使用者，他無法登入，ID 是 40 號！ 這個使用者的家目錄是 /var/spool/clientmqueue
主要僅用於郵件的收受與傳遞！增加這個使用者是 sendmail 8.12 板後新增的功能！主要的目的在於
提供更安全的 sendmail 使用環境！

4. 設定 macro 檔案
[root @test sendmail]# cd /usr/local/src/sendmail-8.12.7/cf/cf
[root @test cf]# vi sendmail.mc
這個檔案的內容是你必需要建立的！如果你要跟我一樣的話，就用底下的設定吧！
divert(-1)
dnl ================================================================================
dnl This file is modified from Red Hat 7.2's redhat.mc file. VBird 2003/02/20
dnl The functions of sendmail are as following
dnl dnl ==> Just mark, such as # in shell scripts
dnl VERSIONID ==> The version of sendmail and vender
dnl OSTYPE ==> The Operation System type
dnl define ==> difine some usefull functions
dnl FEATURE ==> some functions and files' location !
dnl other settings ==> Other settings.
dnl MAILER ==> mail protocol and featurs.
dnl
dnl The following is the command to macro the *.mc to *.cf !
dnl
dnl sh Build sendmail.cf
dnl cp sendmailcf /etc/mail
dnl
dnl ======1. Some informations =====================================================
include(`../m4/cf.m4')
VERSIONID(`Sendmail for Linux using Mandrake 9.0')
OSTYPE(`linux')
define(`confDEF_USER_ID',``8:12'')

dnl ======2. Some settings =========================================================
define(`confTO_CONNECT', `1m')dnl The timeout waiting for an initial connect (1 minute here)
define(`confTRY_NULL_MX_LIST',true)dnl If this host is the best MX for a host and other arrangements haven't been made, try connecting to the host directly; normally this would be a config error.
define(`confDONT_PROBE_INTERFACES',true)dnl About /etc/mail/mailertables !
define(`ALIAS_FILE', `/etc/mail/aliases')dnl About username aliases
define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl

dnl ======3. About some other important settings ===================================
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl About procmail settings
define(`confAUTH_OPTIONS', `A')dnl The following three lines are about SASL settings
TRUST_AUTH_MECH(`LOGIN PLAIN')
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')

dnl ======4. important settings here! ==============================================
FEATURE(`no_default_msa',`dnl')dnl Don't generate the default MSA daemon,
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl This must be set because the up line
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl About Redirect the address to another one mail server !
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl useing /etc/mail/local-host-names
FEATURE(use_ct_file)dnl useing /etc/mail/trusted-users
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl about procmail
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
FEATURE(`accept_unresolvable_domains')dnl

dnl ======5. About ORDB deny the open relay mail servers ===========================
FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

dnl ======6. MAILER settings here ==================================================
MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain
重點是上面三行黃色字體喔！特別留意了！

5. 開始給他製作 sendmail.cf 這個檔案囉！
[root @test cf]# sh Build sendmail.cf <==這個在製作 sendmail.cf 這個檔案
[root @test cf]# mkdir -p /etc/mail
[root @test cf]# sh Build install-cf <==這個在安裝 sendmail.cf 到 /etc/mail 底下去！

6. 開始安裝 sendmail 主程式，以及其他相關的程式，例如 makemap 等等的！
[root @test cf]# cd /usr/local/src/sendmail-8.12.7/sendmail/
[root @test sendmail]# sh Build install
[root @test sendmail]# cd ../makemap
[root @test makemap]# sh Build install
[root @test makemap]# cd ../mailstats
[root @test mailstats]# sh Build install

7. 其他檔案的建立與修訂！
[root @test sendmail]# cd /etc/mail
[root @test mail]# echo 'test.adsldns.org' >> local-host-names <==這裡請輸入你的主機名稱
[root @test mail]# echo 'localhost RELAY' >> access
[root @test mail]# makemap hash access < access
[root @test mail]# touch domaintable
[root @test mail]# makemap hash domaintable < domaintable
[root @test mail]# touch mailertable
[root @test mail]# makemap hash mailertable < mailertable
[root @test mail]# touch trusted-users
[root @test mail]# touch virtusertable
[root @test mail]# makemap hash virtusertable < virtusertable
[root @test mail]# mkdir -p /var/spool/mqueue
[root @test mail]# chown root:wheel /var/spool/mqueue/
[root @test mail]# chmod 700 /var/spool/mqueue
[root @test mail]# touch aliases
[root @test mail]# sendmail -v -bi
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
若是出現上面的字樣的話(不一定是這樣的！但反正就是不會顯示錯誤訊息就是了！)
就表示您的 sendmail 應該已經『沒問題啦！』
[root @test mail]# sendmail -bd -q30m <==啟動 sendmail 看看吧！
[root @test mail]# telnet localhost 25 <==試看看連的上嗎？！
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 test.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Tue, 18 Feb 2003 21:56:00 +0800
ehlo localhost <==這裡輸入測試列！
250-test.adsldns.org Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
quit <==這裡輸入離開字樣！
221 2.0.0 test.adsldns.org closing connection
Connection closed by foreign host.
如果看到出現上面的那行黃色加粗字體，呵呵！那就是 OK 啦！

上面的 site.config.m4 及 sendmail.mc 可以在網站上面下載喔！免得打錯字.....基本上， Tarball 的安裝方式有點麻煩，此外，又容易發生問題，所以，除非必要，否則建議還是使用原本 Linux distribution 所提供的 RPM 或者其他的套件管理員的方式來安裝吧！此外，關於 aliases 與啟動 sendmail 的 script 也可以下載喔！安裝方式中，需要注意的是在您下載完畢之後，請：
  1. Procmail 如果本機上面已經安裝了，不需要重新移除後再安裝！直接使用本機原有的即可！
  2. 依照上面的方法安裝所有的套件；
  3. 將 aliases 放置在 /etc/mail 底下；
  4. 將 procmailrc 放置在 /etc/ 底下；
  5. 在 /etc/logrotate.d 增加 procmail 的 logrotate 資料；
  6. 將 sendmail 放置在 /etc/rc.d/init.d/ 底下
  7. 在 /etc/rc.d/rc.local/ 最底下新增一行即可開機時啟動：
    /etc/rc.d/init.d/sendmail start
這樣就已經安裝好整個 Sendmail 囉！設定上是很容易啦！不過，維護上面可就要多費心囉！
其他應用說明：
上面的 Sendmail 說明，如果您都已經詳細的參詳之後，應該對於你的 Mail Server 管理的能力具有蠻強的認知了！不過，系統管理員無時無刻總是會遇到突發狀況的！所以，這裡我們來聊一聊一些可能會發生在你我身上的 Mail Server 可能會遇到的問題吧！
無法寄信時的可能問題說明與解決之道

雖然 Mail 很方便，但是仍然會有無法將信件寄出的時候！如果您已經設定好 Sendmail 了，但是總是無法將郵件寄出去，那可能是什麼問題呢？
  1. 關於硬體配備：無論任何情況之下，如果硬體出問題，那麼所有的服務都將不正常啦！所以，請先檢查您的硬體是否『怪怪的！』這個先確認 OK 吧！
  2. 關於網路參數的問題：如果連不上 Internet ，那麼哪裡來的 Mail Server 呢？所以請先確認你的網路已經正常的啟用了！關於網路的確認問題，請查閱前幾篇『Linux 網路偵錯』的內容介紹；
  3. 關於服務的問題：請務必確認 port 25 與 port 110 已經正確的啟動了！使用 netstat 指令即可瞭解是否已經啟動該服務！
  4. 關於防火牆的問題：很多時候，很多朋友使用 Red Hat 或者其他 Linux distribution 提供的防火牆設定軟體，結果忘了啟動 port 25 與 port 110 的設定，導致無法收發信件！請特別留意這個問題喔！可以使用 iptables ( 核心為 2.4.xx 版本 ) 或者是 ipchains ( 核心為 2.2.xx 版本 ) 來檢查是否已經啟用該 port 呢！其餘請參考簡易防火牆設定那一章喔！
  5. 關於 TCP_Wrappers 的問題：如果你的 sendmail 還有支援 tcpd 這個程式 (或者說是 libwrap 這個函式庫 ) 的話，那麼在 /etc/hosts.allow 與 /etc/hosts.deny 的設定也會影響到收發信件的正常與否！如果 /etc/hosts.deny 有設定『ALL: ALL』的話，那麼請務必在 /etc/hosts.allow 裡面加設『 sendmail: ALL 』喔！
  6. 關於設定檔的問題：在 sendmail 8.11 版本中，僅有 sendmail.cf 這個設定檔，但是在 8.12 當中多了個 submit.cf 這個寄信功能檔案，請務必確定您的 *.mc 設定是正確的！說說鳥哥的經驗，有一次在測試的時候，一直發信無法將信件寄出去！明明 sendmail.mc 都沒有什麼問題，就是 local 無法寄信！後來才發現，因為我更動過 submit.mc 這個檔案，重新以 m4 跑過之後，忘記將他給改回來了！結果花了我兩天的時間在搞 sendmail.mc ....所以，在作任何一步動作的時候，請千萬記住『作筆記』或者『將動作記下來！』
  7. 關於檔案權限的問題：一般來說，如果以 RPM 安裝 sendmail 會比較沒有問題，而如果以 Sendmail 8.12 以後版本手動安裝的話，那由於 sendmail 對於安全的要求越來越嚴格，所以你必須針對每個目錄或檔案進行檢查才行！通常檢查的目錄為：
    • /etc/mail ：裡面的檔案至少都為 644 或 640 的權限！
    • /var/spool/mqueue ：務必為 700 的權限
    • /var/spool/clientmqueue：這在 8.12 才有，所有人與群組務必為 smmsp ，而權限務必為 770 ；
    • 每個 ./forward 的檔案需要控制其權限喔！在 8.12 版本中， .forward 的『擁有群組』必須要為 smmsp ，並且其權限必須要為 640 才行喔！
  8. 關於使用者的設定問題：一般而言，如果使用者不登入 sendmail 主機進行寄信的動作( local mailer )，那麼 /etc/passwd 裡面的設定就無關緊要了！不過，如果該使用者想要在 sendmail 本機上面使用 mail 的功能，那麼在 8.12 版本當中，您就必須要：
    • 使用者的 primary 群組必須要為 smmsp ！
    • 使用者的 shell 必須要可以登入才行！
    • 其他使用者的相關檔案當中，最明顯的 .forward 權限必須設定正確！
  9. 其他檔案的設定問題：
    • 如果發現只有某個 domain 可以寄信，其他的同一主機的 domain 無法寄信，需要檢查 local-host-names 這個檔案的設定；
    • 如果發現郵件被擋下來了！而且老是顯示 reject 的字樣，那麼可能被 /etc/mail/access 擋住了；
    • 如果發現郵件佇列 (mailq) 存在很多的郵件，可能是 DNS 死掉了，請檢查 /etc/resolv.conf 的設定是否正確！
  10. 其他可能的問題：最常發生的就是認證的問題了！這是由於使用者沒有在 MUA 上面設定『我的郵件需要認證』的選項啦！請叫你的 client 端用戶趕緊勾選吧！
  11. 還是不知道問題的解決方案：一般而言，上面的幾個訊息應該可以提供您校正 sendmail 的問題了，不過，如果還是查不出問題的話，那麼請務必檢查您的 /var/log/maillog (有的時候是 /var/log/mail ，這個要看 /etc/syslog.conf 的設定 )，當你寄出一封信的時候，例如 vbird 寄給 bird2@tsai.adsldns.org 時，那麼 maillog 檔案裡面會顯示出兩行，一行為 from vbird一行為 to bird2@tsai.adsldns.org，也就是『我由哪裡收到信，而這封信會寄到哪裡去！』的意思，由這兩行就可以瞭解問題了！尤其是 to 的那一行，裡面包含了相當多的有用資訊，包括郵件無法傳送的錯誤原因的紀錄！如果您對於登錄檔不熟，請拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的『認識登錄檔』一文吧！(註：這就是鳥哥為什麼老是希望大家能夠先看完基礎篇的原因，太重要了！)
關於備份

不管什麼時候，備份總是重要的！那麼如果我是單純的 Mail Server 而已，我需要的備份資料有哪些呢？
  1. /etc/procmailrc 這個檔案；
  2. /etc/passwd, /etc/shadow, /etc/group 等與帳號有關的資料；
  3. /etc/mail 底下的所有檔案資料；
  4. /etc/sendmailcf 或者 /etc/aliases 等等 sendmail 相關檔案(因為可能不放在 /etc/mail 當中！ )
  5. /home 底下的所有使用者資料；
  6. /var/spool/mail 底下的檔案與 /var/spool/mqueue 郵件佇列檔案；
  7. 如果是 Sendmail 8.12 則可以考慮儲存 /var/spool/clientmqueue。
如果真的僅要備份這些資料的話，我可以寫一支程式讓他每週備份一次喔！假設該程式可以放置在 /usr/local/backup/backup.sh 這裡，並且備份的資料也都放置在此！當然，可以的話，應該是要放置在另一顆硬碟，甚至是另一個儲存裝置，例如 tape 等等比較好的啦！底下提供一個程式範例囉：

#!/bin/bash
# 這支程式可以用來備份 mail server 的帳號資料喔！
# 撰寫者 VBird 2003/02/24

# 0. 設定目錄與相關的變數：
dir=/usr/local/backup
[ -z "$dir" ] || mkdir -p "$dir"
[ -f "$dir" ] && echo "$dir exist, but is not a directory, stop here" && exit

# 開始備份一些檔案：
cp -a /etc/passwd $dir
cp -a /etc/shadow $dir
cp -a /etc/group $dir
[ -z /etc/procmailrc ] && cp -a /etc/procmailrc $dir
[ -z /etc/sendmail.cf ] && cp -a /etc/sendmail.cf $dir
[ -z /etc/aliases ] && cp -a /etc/aliases

# 開始備份目錄：
tar -zcvf $dir/home.tar.gz /home
tar -zcvf $dir/etcmail.tar.gz /etc/mail
tar -zcvf $dir/varmail.tar.gz /var/spool/mail
tar -zcvf $dir/mqueue.tar.gz /var/spool/mqueue
[-z /var/spool/clientmqueue ] && \
tar -zcvf $dir/clientmqueue.tar.gz /var/spool/clientmqueue

你可以在網站下載(http://linux.vbird.org/download)然後將這支程式改變一下屬性『chmod 755 backup.sh』之後，放到 crontab 裡面去執行就可以啦！

關於 quota 的設定與 /var/spool/mail 目錄的轉移

網路上有很多『免費的電子郵件信箱』空間，一般而言，使用的就是 quota 這個磁碟配額工具！因為我們的 Linux 主機硬碟空間就是這麼多！當然囉，使用磁碟配額 (quota) 會是一個對大家比較公平的方法！使用 quota 的技巧已經在『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面介紹過了，這裡不再重複介紹，要介紹的是幾個可能會發生在實際的案例中的一些小技巧：
  • 郵件信箱所在的磁碟空間不足了：
    這是很可能會發生的問題啊！尤其是在用量很大的網站上面！這個時候你的解決方法主要有：
    1. 新增加一顆硬碟，格式化好之後將他 mount 到 /var/spool/mail 這個目錄下；
    2. 如果主機裡面還有其他目錄具有很大的空間，例如 /home 這個地方，那麼就可以：
      cd /var/spool
      mv mail /home
      ln -s /home/mail mail

  • 使用 quota 設定：
    一般而言，我們通常會將 /home 做為 quota 的 partition ，那麼 /var/spool/mail 其實也可以依附在 /home 這個 partition 之下，來達到 quota 對於使用者的規範喔！達成的方法很簡單啦：
    1. 先在主機規劃與安裝的時候，讓 /home 獨立於一個 partition 當中；
    2. 以『鳥哥的 Linux 私房菜 -- 基礎學習篇』的 quota 內容為範例，建立好 /home 的 quota 限額；
    3. 將 /var/spool/mail 整個搬到 /home 底下，並做好連結的動作就可以立即生效啦：
      cd /var/spool
      mv mail /home
      ln -s /home/mail mail

  • 關於使用者郵件的放置地點：
    很多的讀者可能喜歡讓每個使用者去到自己的家目錄讀取 mail box 的咚咚，亦即是將 /var/spool/mail 的內容給他搬到個別的家目錄去！例如 vbird 的 mail box 變成的 /home/vbird/vbird 這個檔案！不過，如此一來的話， sendmail 與 pop 都將需要改寫其 source code ！所以『不建議這麼搞喔！』
本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的，關於 Sendmail 的考試題庫的地方，只有在 LPI level 1 的 102 ，裡面的 topic 113 Networking Services ，第二點當中，簡易的 Sendmail 設定。強調的是『應試者必須簡單的設定 sendmail (指的應該是 m4 scripts ，不過會很簡單！不要擔心∼)、能夠建立 mail aliases 、能夠管理郵件佇列、能夠啟動或者是關閉 sendmail 這個服務、瞭解使用者的郵件轉遞 ( forward 功能 )，以及簡單的 sendmail 除錯！此外，應試者也需要瞭解什麼是 Open Relay 與避免 Open Relay 才行！』至於會考的檔案與指令可能有這些：
  • /etc/sendmail.cf ( 或是 /etc/mail/sendmailcd )
  • /etc/aliases 或是 /etc/mail/aliases
  • /etc/mail/*
  • ~/.forward
  • mailq
  • sendmail
  • newaliases
參考資源：
  • Sendmail 官方網站： http://www.sendmail.org
  • Cyrus-SASL 官方網站： http://asg.web.cmu.edu/cyrus/download/sasl/doc/
  • Procmail 官方網站： http://www.procmail.org
  • Open Relay Database： http://www.ordb.org/
  • Study Area 之郵件架設：http://www.study-area.org/linux/servers/linux_mail.htm
  • SMTP 認證系統的建置：http://beta.wsl.sinica.edu.tw/~ylchang/Email/sendmail-auth/
  • 台灣學術網路黑名單網頁： http://140.111.1.22/tanet/spam.html
  • 臥龍小三的 Procmailrc 範例：ftp://ftp.tnc.edu.tw/pub/Sysop/MAIL/procmailrc
  • 林克敏主任文件集之 Procmail 範例：http://freebsd.lab.mlc.edu.tw/procmail.htm
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 我在使用 Sendmail 寄信時，卻發生底下這個問題，請問可能的發生原因為何？
    答：
      可能的問題有兩個：
    1. 你的 Client 端電腦的 IP 或者是網域位址被 /etc/mail/access 所擋住，或者是 /etc/mail/access 沒有打開你的 RELAY 權力；
    2. 你有進行 SMTP 郵件認證的設定，但是忘記在 MUA 當中設定帳號與密碼的項目了！
      如果不是這兩個原因，那麼可能的問題就多了！請詳細的檢查您的網路設定！
  • 請列出四個 Mail Server 的相關的元件，以及其功用為何？
    答：
    1. Mail Client ：郵件用戶端，其實就是使用 mail 的那位使用者所在的電腦即可稱為 mail client ；
    2. Mail User Agent ：為一個應用軟體，主要的功能就是收受郵件主機的電子郵件，以及提供使用者瀏覽與編寫郵件的功能；
    3. Mail Transfer Agent ：為在電腦與本地端 Mail server 或 Internet 上面的 Mail server 傳送訊息與郵件的主機；
    4. Mail Dilivery Agent ：主要的功能就是將 MTA 所收受的本機信件，放置到本機帳戶下的郵件檔案中 ( Mailbox )！
  • POP3 與 SMTP 的功能為何？
    答：
    • SMTP 為使用於 MUA 或 MTA 與 MTA 之間的傳輸協定，通常使用 port 25 ，只要主機支援 SMTP ，並且其他 relay 的條件能配合，就可以進行郵件傳遞！
    • POP3 可以提供使用者經由 MUA 到 MTA 下載郵件，同時並可將郵件從主機上面刪除！
  • 請簡單的說明 DNS 裡面 MX 標誌與 Mail 的關係為何？
    答：
      MX recode 可以可以讓 mail server 經由 MX 以及 A ( address ) 這個記錄來進行 mail gateway 與 mail route 的功能！能夠達到的作用相當的多！
  • 今天我突然興起，想要修改我的 sendmail ，請問， sendmail 的設定檔在哪裡？而我要以什麼程式修改 sendmail 呢？
    答：
      Sendmail 的設定檔為 sendmail.cf ，這個檔案通常放置在 /etc/sendmail.cf 或者 /etc/mail/sendmail.cf ！您可以手動的編輯這個檔案，不過不建議如此，取得代之的，可以使用 m4 這個程式來進行 macro 的動作，進一步的完成 sendmail.cf 的修改！至於使用 m4 時，需要先建立 m4 scripts ，再以 m4 轉換才能形成 sendmail.cf 喔！
  • 什麼是 mailling list ？在 sendmail 底下有什麼方法可以不藉由其他的軟體達到 mailling list 的功能？
    答：
      Mailling list 就是將使用者寄給一個帳號郵件時，該帳號會主動的將該郵件傳送到所有的用戶去！有點類似目前的電子報！在 sendmail 底下，我們可以透過 aliases (需配合 newaliases) 以及 ~/.forward 來達成喔！

  • 如何察看郵件佇列的內容，以及郵件佇列內容放置在何方？
    答：
      使用 mailq 即可知道目前郵件佇列的內容，而郵件佇列雖然可以透過 sendmail.cf 來修改，不過，預設情況下，都是以 /var/spool/mqueue 為郵件佇列目錄。

  • 若我的 sendmail 主機有很多名稱，我想讓這些名稱都可以進行 mail 的傳送，應該修改什麼檔案？
    答：
      可以修改 /etc/mail/local-host-names 來達成！

簡易 Mail Server 架設 -- Sendmail 設定
2003/02/24：第一次完成
2003/02/25：根據小州與網中人兄的建議，修改一些 Sendmail 相關的說明與內容，建議的內容請參考這裡！
2003/02/28：加入使用 IP 寄信的方法！
2003/03/01：增加 Tarball 安裝時，TCP_Wrappers 的支援！
2003/03/14：增加 mailstats 的說明！
2003/02/24以來統計人數


簡易 Mail Server 架設 -- Postfix 設定
最近更新日期：2003/04/19

在介紹完了 sendmail 之後，您是否覺得∼唉！怎麼 sendmail.cf 這個設定檔這麼難搞定∼還得藉由 m4 scripts 才能搞定！而且， sendmail 需要考慮到相當多的安全設定項目 ( Security )，否則很容易一不小心就被攻擊了！那麼有沒有更簡單、更安全的郵件系統啊！當然有啊！那就是 Postfix 這個咚咚！Postfix 的作者有鑑於 sendmail 是這樣成功的一個 MTA ，但是偏偏有點小問題，所以該作者站在兼容的立場上面寫出這個幾乎可以完全取代 sendmail 的 MTA ！此外， Postfix 還更加的安全呢，真是很不錯的一個 mail server 的替代方案啊！

前言：
    ：本章學習之前你需要先知道的知識
    ：為什麼要有 Postfix 呢？
套件安裝：
    ：使用 RPM 安裝完整的 Postfix + POP3 + SMTP + Procmail (Cyrus-SASL 1.5.xx 設定方式)
    ：使用 Tarball 安裝完整的 Postfix + POP3 + SMTP + Procmail (Cyrus-SASL 2.xx 設定方式)
主機的設定：
    ：Postfix 的結構
    ：基礎設定 (設定接受的主機名稱)
    ：重要觀念：預設 Relay 與 收信 流程
    ：啟動 smtp 郵件認證功能
    ：幾個相關的檔案說明
用戶端的使用說明：
關於郵件主機安全的設定：
    ：關於 Open Relay Data Base
    ：關於 Procmail 用法
    ：關於郵件過濾的規則設定
    ：問題信件的送達
其他應用說明：
參考資源
本章習題練習
前言：
在開始介紹 Postfix 這個伺服器之前，得先告訴您的是，這個 Postfix 的用途是『郵件伺服器』，那麼我們在前一章『Sendmail 伺服器』裡面已經提過了 mail server 的相關原理與運作過程，這個 Postfix 與 sendmail 是類似的東西，那就是『MTA』啦，既然都是 MTA ，使用的協定也相同，同時，這個 Postfix 最早之前的用途也是想要用來『取代 sendmail 』。所以，為了節省筆墨，也為了未來進行修改的時候不要有太多的版本 ( 意思是這裡 copy 一份 mail 原理，那裡又有一份原稿∼ ) ，因此上，在進行本章的學習之前，請『務必』前往『簡易 Mail server -- sendmail』讀一讀 Mail server 的原理與相關的說明啊！

本章學習之前你需要先知道的知識：

上面剛剛提到，學習本章你必須要知道 Mail Server 的相關知識才行，在這裡，我們不再說明已經提過的咚咚，請自行再前往翻閱。由於架設某種伺服器的第一步就是要瞭解該伺服器的工作原理，因此，在架設 Postfix 之前，您至少要知道以下的幾個咚咚：
  1. Mail Server 能否運作與 DNS ( MX 與 A recode )的相關性為何？
  2. 什麼是 MTA, MUA, MDA 與 Mail box, Mailing list 等相關的術語，及其內容所代表的意義！
  3. 什麼是 smtp, pop3 以及 imap 協定，他們的用途分別是什麼？
  4. 什麼是 Relay 與 Open Relay ？
  5. 什麼是 SMTP 郵件認證？
  6. 什麼是郵件的別名與轉遞( aliases 與 forward )？
  7. 什麼是 Procmail 與什麼是 ORDB 呢？
如果您不曉得上面問題的答案，請不要『白目』的繼續往下看 ^_^，先前往『簡易的 sendmail 伺服器』瞧一瞧相關的原理之後，再來這裡吧！慢點學習不打緊，學的不精....可能會有害啊！ @_@

為什麼要有 Postfix 呢？

這是個很有趣的問題：『為什麼要有 Postfix 呢？有了 sendmail 不就可以了嗎？！』說到這個就要談到 postfix 的由來了！

Postfix 是由 Wietse Zweitze Venema 先生(http://www.porcupine.org/wietse/)所發展的。早期的 mail server 都是使用 sendmail 架設的，還真的是『僅此一家，絕無分號！』 ^_^ ！不過，Venema 博士覺得 sendmail 雖然很好用，但是畢竟不夠安全，尤其效能上面並不十分的理想，最大的困擾是....他的設定檔 sendmail.cf 真的是太難懂了！對於網管人員來說，要設定好 sendmail.cf 這個檔案，真不是人作的工作∼

為了改善這些問題， Venema 博士就在 1998 年利用他老大在 IBM 公司第一個休假年進行一個計畫：『設計一個可以取代 sendmail 的軟體套件，可以提供網站管理員一個更快速、更安全、而且"完全相容"於 sendmail 的 mail server 軟體！』這個計畫還真的成功了！而且也成功的使用在 IBM 內部，可以說是完全取代了 sendmail 這個郵件伺服器！在這個計畫成功之後， Venema 博士也在 1998 年首次釋出這個自行發展的郵件伺服器，並定名為 VMailer。不過， IBM 的律師卻發現一件事，那就是 VMailer 這個名字與其他已註冊的商標很類似，這樣可能會引起一些註冊上面的困擾。為了避免這個問題，所以 Venema 博士就將名稱改為 Postfix ！這個 Postfix 有『在什麼什麼之後修正』的意思。鳥哥個人認為， Venema 先生最早的構想並不是想要『創造一個全新的 Mail server 軟體，而是想要製造一個可以完全相容於 sendmail 的軟體』，所以，Venema 先生認為他自行發展的軟體應該是『改良 sendmail 的缺失』，所以才稱為 Postfix 吧！取其意為：『在 sendmail 之後的改良的郵件軟體！』

所以啦， Postfix 設計的理念上面，主要是針對『想要完全相容於 sendmail』所設計出來的一款『內在部分完全新穎』的一個郵件伺服器軟體。就是由於這個理念，因此，Postfix 改善了 sendmail 安全性上面的問題，改良了 mail server 的工作效率，更由於其設定檔完全為 ASCII 碼，且設定內容都是『人類看的懂得語言！』因此，你可以輕易的由 sendmail 改良到 Postfix 上面！這也是當初 Venema 博士的最初構想啊！就是基於這個構想，所以， Postfix 在外部設定檔案的支援度，與 sendmail 幾乎沒有兩樣，同樣的支援 aliases 這個檔案，同樣的支援 ~/.forward 這個檔案，也同樣的支援 SASL 的 SMTP 郵件認證功能等等！所以，呵呵！趕緊來學一學怎樣架設 Postfix 這個相當出色的郵件伺服器吧！ ^_^
套件安裝
跟之前一樣的，我們需要的 mail server 功能有哪些呢？
  • 具有 smtp 的功能；
  • 具有 pop3 的功能；
  • 具有 procmail 過濾郵件的功能；
  • 具有 Open Relay Data Base 抵擋的功能；
為達成上述的功能，所以你至少需要底下的幾個套件：
  • cyrus-sasl
  • procmail
  • postfix
  • imap(同時支援 pop3 及 imap 兩個協定)
如果您是使用 Mandrake 的話，那麼恭喜您，由於 Mandrake 預設就是使用 Postfix 做為郵件伺服器，並且在安裝的時候就已經將 Postfix 安裝到你的系統當中了。而如果您是使用非 postfix 為郵件伺服器的 Linux distribution ，呵呵！仔細的查看後面介紹的 Tarball 安裝的方式吧！

使用 RPM 安裝完整的 Postfix + POP3 + SMTP + Procmail ( 以 Mandrake 9.0 為例 )

如果你是使用 Mandrake 之類的 Linux distribution 的話，由於他預設是以 Postfix 這個優良的郵件伺服器系統，所以您可以不費吹灰之力的，就將 Postfix 以 RPM 安裝完畢囉！基本上，如果是 Mandrake 的話，你需要安裝的套件大致上有：
  • SMTP 認證套件： cyrus-sasl ( cyrus-sasl-1.5.27-5mdk 以及其他認證機制函式庫 )
  • Postfix 郵件伺服器： postfix ( postfix-1.1.11-4mdk )
  • POP3 伺服器： imap ( imap-2001a-9mdk, imap-devel-2001a-9mdk 兩個 )
  • 郵件分析軟體：procmail ( procmail-3.22-3mdk )
你至少要安裝的套件就有上面這幾個，同時，請拿出您的原版光碟將上面的套件全部安裝吧！安裝的方法我們在『鳥哥的 Linux 私房菜 -- 基礎學習篇』介紹過的 RPM 與 Tarball 安裝方法裡面提過多次了，請自行參考喔！安裝完畢之後，你的主機就已經具有 Postfix 這個系統啦！不過，由於我們還要提供 SMTP 以及其他相關的功能，所以這裡我們必需要確認一下各個套件是否都完全的安裝了呢？底下我們就一個一個的來設定吧！(註：請特別留意 Cyrus-sasl 的版本，因為不同的版本他的函式庫所在目錄與設定檔都不相同！因此，在本篇文章中，您會發現我使用 Tarball 安裝的 2.xx 版本與使用 RPM 安裝的 1.5.xx 版本設定檔的內容不相同，不要懷疑，確實是如此的喔！ )

安裝 cyrus-sasl
1. 安裝
安裝的方法很簡單，就是使用 RPM 即可！不過，請先確認是否已經安裝！
[root @test root]# rpm -qa | grep sasl
libsasl7-1.5.27-5mdk
cyrus-sasl-1.5.27-5mdk
libsasl7-devel-1.5.27-5mdk
libsasl7-plug-plain-1.5.27-5mdk
libsasl7-plug-login-1.5.27-5mdk

如果尚未安裝該套件，請拿出你的光碟片， mount 光碟，然後找尋該檔案，
直接安裝他吧！不過要注意的是，上面的檔案都要安裝喔！因為我們使用的
是最基本的 plain 與 login 這兩個機制，所以至少我們要安裝上面五個咚咚！
[root @test root]# rpm -ivh cyrus-sasl-1.5.27-5mdk.i586.rpm
如果有發生屬性相依的問題，請自行再將需要的檔案自光碟當中找出，
然後加以安裝吧！

2. 設定與啟動
由於 Cyrus-sasl 在 Mandrake 當中是 1.5.27 版本，所以他能支援的項目有：
shadow : 使用 /etc/shadow 做為認證碼；
pam　　: 使用 pam 模組做為認證，這個需要在 /etc/pam.d 這個目錄下新增
         一個名為 smtp 的檔案，並設定檔案內容才行！
sasldb : 使用 SASL 的認證函式庫，使用這個功能時，你必需要額外的
         指定 1.函式庫的名稱； 2.使用 saslpasswd 程式增加使用者！
         鳥哥個人認為這個功能不太好用，因為每新增一個使用者需要主動的
         幫使用者新增帳號、密碼到認證函式庫中，不太方便！
         不過如果您還使用其他的伺服器如 LDAP, MySQL 等等軟體時，
         則這個功能可就大大的有幫助啦！因為他可以分享帳號與密碼吶！
pwcheck: 這個功能就不錯啦！ pwcheck 是一個服務(daemon)，必需要在
         啟動 postfix 之前就啟動啦，因為 sasl 的認證就靠這個 daemon，
         基本上，他可以經由讀取 /etc/shadow 的資料來提供 client 端
         認證的功能！目前我們 Mandrake 9.0 預設使用的是這個 daemon！
給他設定開機時啟動 pwcheck 的功能吧！
[root @test root]# vi /etc/rc.d/rc.local
在這個檔案當中最底下新增一行：
/usr/sbin/pwcheck
並且立刻執行這個 daemon 喔：
[root @test root]# /usr/sbin/pwcheck
[root @test root]# ps -aux | grep pwcheck
root 12602 0.0 0.5 1460 348 ? S 02:59 0:00 /usr/sbin/pwcheck
看到沒！要出現這個咚咚才算是有啟動 pwcheck 喔！

在 Sendmail 當中，我們必需建立一個名為 Sendmail.conf 的檔案，來告訴
sasl 我們所需要的認證模式，那麼在 postfix 當中也一樣，我們必需要建立
一個檔案名稱為smtpd.conf來告訴 sasl ，喝！我 postfix 要的認證方式為何！
所以你需要這樣做：
[root @test root]# cd /usr/lib/sasl
[root @test sasl]# echo 'pwcheck_method: pwcheck' > smtpd.conf

上面這樣做完之後，系統就知道了：
1. postfix 要用 SMTP 認證時會去讀取 /usr/lib/sasl/smtpd.conf 並且知道
   是以 pwcheck 這支程式進行身份認證的動作；
2. 而 pwcheck 這支程式會主動去讀取 /etc/shadow ，裡面的密碼做認證
到此為止，就已經設定好了 cyrus sasl 的部分啦！

安裝 postfix
1. 安裝
安裝的方法很簡單，就是使用 RPM 即可！不過，請先確認是否已經安裝！
[root @test root]# rpm -qa | grep postfix
postfix-1.1.11-4mdk

如果尚未安裝該套件，請拿出你的光碟片， mount 光碟，然後找尋該檔案，
直接安裝他吧！
[root @test root]# rpm -ivh postfix-1.1.11-4mdk.i586.rpm

這樣就安裝完畢啦！主機設定的部分請參考下一節喔！

安裝 procmail
1. 安裝
[root @test root]# rpm -qa | grep procmail
procmail-3.22-3mdk

2. 設定：
在設定方面，這主要與 procmail 有關而已，您可以下載 procmailrc
並放置到 /etc/ 底下即可詳細的資料請參考上一章簡易 sendmail 之說明！

安裝 imap
1. 安裝
[root @test root]# rpm -qa | grep procmail
imap-2001a-9mdk
imap-devel-2001a-9mdk

2. 設定：
直接設定成為開機啟動即可：
[root @test root]# chkconfig --add ipop3
[root @test root]# /etc/rc.d/init.d/xinetd restart
這樣就已經可以收信件啦！

安裝的地方當中，重點在於 Cyrus-SASL 的安裝啦！由於我們需要有 SASL 的支援，所以必需要安裝這個咚咚！並且也需要設定 smtpd.conf 這個檔案！這樣就已經差不多 OK 啦！接下來請繼續參考主機設定的地方嚕！

使用 Tarball 安裝完整的 Postfix + POP3 + SMTP + Procmail (適用任何版本的 Linux 喔！)

以 Tarball 安裝 Postfix 也不困難，比起 sendmail 來說，要簡單的很多喔！我們這裡選擇的主要套件有：
  • cyrus-sasl-2.1.12.tar.gz
  • postfix-2.0.4.tar.gz
至於 procmail 與 imap 兩個套件都使用 Linux distribution 提供的 RPM 版本就好了，不需要額外的改裝啊！那麼底下就來談一談怎麼安裝吧！(註： Cyrus SASL 與 Cyrus SASL2 這兩個不同版本的 SASL 函式庫放置的目錄並不相同，所以你可以分別安裝 cyrus version 1 與 version 2 喔！在鳥哥的案例當中，還不會發生問題就是了！)

安裝 Cyrus SASL 2.xx 版本！
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了！)
[root @test root]# cd /usr/local/src
[root @test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最後建立一個 cyrus-sasl-2.1.12 的目錄

2. 再來就是設定你的 cyrus SASL 的參數以及編譯囉！
[root @test src]# cd cyrus-sasl-2.1.12
[root @test cyrus-sasl-2.1.12]# ./configure \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run \
注意上面的語法！！那個 \ 是跳脫字元喔！後面直接 Enter ！
不要接任何空白或者是 tab 按鍵！若有問題，請到 Shell 看看！
至於那個 pwcheck 的項目，就是要用來做為密碼確認的一個咚咚囉！

[root @test cyrus-sasl-2.1.12]# make clean && make
[root @test cyrus-sasl-2.1.12]# make install
上面三個步驟會花去一些時間，請耐心等待∼
而由於我們剛剛設定了 --prefix=/usr/local/cyrus-sasl2 這個參數，
所以， make install 之後，我們有用的函式庫會在
/usr/local/cyrus-sasl2/lib/sasl2 這個路徑當中，但是， cyrus 程式
會主動去找 /usr/lib/sasl2 這個目錄！所以，我們必需要做連結檔！
才可以讓未來我們的 postfix 可以直接找的到我們所要的函式庫喔！

[root @test cyrus-sasl-2.1.12]# cd /usr/lib
[root@vbird lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
這樣就建立起連結檔囉！很簡單吧！ ^_^不過要注意喔，
上面這一行最後面那個小數點『.』不要忘記加了！

3. 準備建立 Postfix 與 cyrus SASL 使用的簡易設定檔：
[root @test lib]# cd /usr/lib/sasl2
[root @test sasl2]# echo 'pwcheck_method: saslauthd' > smtpd.conf
[root @test sasl2]# echo 'mech_list:plain login' >> smtpd.conf
注意了！一般來說， Postfix 會使用 SASL 這個函式庫裡面相關的設定檔，
/usr/lib/sasl2/smtpd.conf 這個檔案的設定就是 Postfix 的預設使用 SASL 的
參數檔案，與 1.5.xx 版本不太相同的地方是， 2.xx 版本使用不同的機制：
auxprop　：使用 sasldb2 這個共享資料庫，同樣需要使用共享密碼檔案喔！
          所以一般來說，單純的 Postfix 比較少使用這種機制；
saslauthd：使用 saslauthd 這個 daemon 進行認證的工作，所以幾乎
          不需要其他的設定值哪，指定 saslauthd 就好啦！ ^_^
pwcheck　：使用與 1.5 版相似的認證 daemon ，不過在 2.xx 版本裡面這個模式
          支援度比較沒有這麼好的啦，所以請愛用 saslauthd 囉！
我們使用 SASL 預設的 saslauthd 這支程式做為密碼認證的 daemon。
至於 mech_list:plain login 是列出支援的認證機制的意思，我們使用的
是極為簡單的 login 與 plain 兩種機制而已！

4. 建立一些需要的參數：
[root @test sasl2]# vi /etc/man.config
新增底下這一行之後，未來我們就可以透過 man 這個工具來查詢 sasl
相關的指令的用法了！而不需要修改任何咚咚！不過要注意的是，
這個檔案在每個 Linux distributions 當中不見得相同，例如 Open Linux
檔名是 /etc/man.conf 呢！
MANPATH /usr/local/cyrus-sasl2/man

5. 檢驗 saslauthd 這支程式是否可行！
在 cyrus-sasl 的原始碼裡面提供了一支小程式用來判斷 saslauthd 的認證機制
是否成功的啟動了，這個小程式就是 testsaslauthd 囉！在剛剛原始碼目錄下，
所以你可以這樣做：
[root @test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
執行之後， saslauthd 的 PID 會被紀錄到 /var/run/mux.pid 這個檔案！
[root @test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root @test saslauthd]# make testsaslauthd
[root @test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
若顯示 OK 的話！那麼就是成功啦！很好！我喜歡∼

6. 設定開機時啟動
[root @test saslauthd]# vi /etc/rc.d/rc.local
加入這一行：
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

安裝 Postfix 2.xx 版本！
0. 先確認有沒有這個檔案存在！因為我們的 Postfix 會使用到很多資料庫啊！
[root @test root]# locate pcre.h | grep include
/usr/include/pcre.h
這個檔案也有可能存在於 /usr/include/pcre/pcre.h 裡面！不要擔心，存在就好了
如果沒有存在的話，例如 Mandrake 9.0 預設狀態可能並不會主動安裝這個套件，
請自行拿出原版光碟，安裝 MDK 的 libpcre0xxxx 檔案，至於 redhat 等
其他版本，請自行安裝 pcre 相關的套件吧！

1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了！)
[root @test root]# cd /usr/local/src
[root @test src]# tar -zxvf /root/postfix-2.0.4.tar.gz
.....(略).....最後建立一個 postfix-2.0.4 的目錄

2. 清除規則並且建立新的使用 SMTP 的規則給 postfix
[root @test src]# cd /usr/local/src/postfix-2.0.4
[root @test postfix-2.0.4]# make tidy<==清除規則
[root @test postfix-2.0.4]# make makefiles CCARGS="-DUSE_SASL_AUTH \
> -I/usr/local/cyrus-sasl2/include/sasl/" \
> AUXLIBS="-L/usr/local/cyrus-sasl2/lib -lsasl2"
上面的動作在建立 Makefile 囉！
[root @test postfix-2.0.4]# make
就是開始編譯啦！過程有點久喔！如果有出現任何 Error 時，
請將 error 仔細的查看一下吧！通常最大的原因都是一些
include 檔案沒有安裝，也就是某些重要的套件沒有安裝之故，
例如 pcre.h 這個檔案就是一個例子囉！
解決的方法就是將該缺乏的套件安裝進去系統啦！

3. 安裝前準備工作：
如果您的系統是由 sendmail 要改換到 Postfix 的話，你不需要移除 sendmail ，
不過卻需要進行一些小手術喔！
[root @test postfix-2.0.4]# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
[root @test postfix-2.0.4]# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
[root @test postfix-2.0.4]# mv /usr/bin/mailq /usr/bin/mailq.OFF
[root @test postfix-2.0.4]# chmod 755 /usr/sbin/sendmail.OFF \
> /usr/bin/newaliases.OFF /usr/bin/mailq.OFF

此外，還需要建立一個名為 postdrop 的群組與 postfix 的使用者喔！
[root @test postfix-2.0.4]# groupadd -r postdrop
[root @test postfix-2.0.4]# useradd -r -s /bin/false postfix
建立一個系統資料帳號吶！
[root @test postfix-2.0.4]# echo 'postfix: root' >> /etc/aliases
請注意，如果您之前安裝過 sendmail 的話，那麼不同版本的 sendmail 他的
aliases 放置的目錄並不相同，所以上面這行指令請依您的主機來設定！

4. 開始安裝 Postfix 到 /etc/postfix 這個目錄下：
[root @test postfix-2.0.4]# make install
底下會出現一大堆的問題集，不管如何，幾乎按下 enter 就對啦！
除了底下這兩個問題(最後兩個)可以選擇將 readme 檔案存下來喔！
Please specify the destination directory for the Postfix sample
configuration files.
sample_directory: [/etc/postfix] /etc/postfix/sample

Please specify the destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no] /etc/postfix/readme_files

這樣就安裝成功啦！接下來請開始查閱 主機的設定 那一節囉！

主機的設定
    安裝完畢 postfix 之後，接著下來就是設定了！同樣的，在設定主機之前，有幾個東西是您必需先取得的喔：

    1. 具有合法的 hostname ，或者是經過授權的 DNS 主機來設定您自己的主機名稱(hostname)；
    2. 您的 hostname 最好擁有一個 MX 的紀錄(record)；
    3. 至少一定要瞭解到什麼是 Relay 的問題，以及規劃一下您所想要開放 relay 的網域；

    你至少需要有這些資料才行吶！好了，我先假設一下我的案例好了：

    1. 我的 hostname 為 vbird.adsldns.org；
    2. 我的 hostname 還有個別名為 www.vbird.adsldns.org ，也就是說， vbird.adsldns.org 與 www.vbird.adsldns.org 都指向同一個 IP ；
    3. 我的 domain name 為 adsldns.org ；
    4. 我預計開放的 relay 網域為 vbird.org 這個網域，與內部的 192.168.1.0/24 這個網域，還要可以使用 access 這個檔案的設定功能！

    開始來瞭解 postfix 囉！ ^_^

  • Postfix 的結構

    在主機的設定之前我們得先瞭解一下 postfix 的整體構造，以方便以後來處理我們的檔案吶！所以底下我們會先針對 postfix 這個套件的結構做個簡單的說明，然後再針對各個設定項目來進行說明囉！Postfix 的設定檔幾乎完全都在 /etc/postfix 裡面，至於執行檔則在 /usr/sbin 裡面，我們分別來談一談幾個主要的注意事項吧！

    • 設定檔：Postfix 的設定檔都在 /etc/postfix 裡面，主要的設定檔有：

      • /etc/postfix/main.cf ：這個就是最重要的 postfix 的設定檔了！等一下我們談到的設定都在這個檔案裡面進行修改的動作！基本上，他本身就是一個簡單的說明文件檔啦！不過，要注意的是，在你修改完成了 main.cf 之後，請記得『一定要重新 reload 或重新 restart postfix 才行！』

      • /etc/postfix/master.cf：這個檔案是另外一個重要的 postfix 設定檔！他主要是規定了 postfix 每個程序的運作參數！

      • /etc/postfix/access ：這個檔案與 sendmail 的 access 是相同的！都是用來做為 relay 或者是 deny 某些 IP 與 hostname 的檔案！不過，要啟用他還是得要修改 main.cf 才行！

      • /etc/postfix/aliases ： 這個檔案與 sendmail 的 aliases 也是相同的！同樣的可以做為別名之用，所以您可以回頭去翻一翻這個檔案的用法喔！

      • /etc/postfix/pcre_table regexp_table relocated ： 這幾個檔案可以做為郵件的過濾之用喔！可以使用正規表示法來進行郵件過濾(filter)的規則，呵呵！會使用這幾個檔案，或許連 procmail 也不需要使用了呢！ ^_^

    • 執行檔：Postfix 的執行檔可不少啊！約略提幾個主要的執行檔吧！

      • /usr/sbin/postfix：這就是 postfix 的主要執行檔案啦！啟動與簡單的關閉 postfix 可以使用：
          postfix check ：檢查 postfix 相關的檔案、權限等是否正確！
          postfix start ：開始 postfix 的執行
          postfix stop ：關閉 postfix
          postfix flush ：強制將目前正在郵件佇列的郵件寄出！
          postfix reload：重新讀入設定檔，也就是 /etc/postfix/main.cf
        要注意的是，每次更動了 /etc/postfix/main.cf 之後，一定需要執行 postfix reload 喔！

      • /usr/sbin/postalias：這個指令是 sendmail 的 newaliases 啦！他可以用來將上面提到的設定檔 aliases 製作成為 postfix 看的懂得『資料庫』格式化檔案！由於一般來說，我們都是使用 hash 這一種資料格式，所以囉，你可以簡單的使用底下的指令方式來格式化。
          postalias 資料庫格式:檔名
          postalias hash:/etc/postfix/aliases ==>自動建立 /etc/postfix/aliases.db 這個資料庫檔案！
      • /usr/sbin/postcat ：這個指令可以用來觀察某個郵件佇列裡面檔案的資訊！postfix 的郵件佇列放置在 /var/spool/postfix 裡面，但是這個目錄裡面的檔案格式是 postfix 看的懂得，我們人類看不懂∼為了取得這些在郵件佇列裡面的檔案資訊，所以我們得使用 postcat 這個指令來讀取出資訊喔！假如有個檔案放在 /var/spool/postfix/deferred，你可以這樣看：
          postcat /var/spool/postfix/deferred/filename

      • /usr/sbin/postconf ：可以用來讀取 main.cf 這個檔案裡面的設定資料的一個指令！用途多多啊！簡單的來說，可以直接將你的 main.cf 裡面的設定分門別類的顯示給你看，可以幫助除錯 (debug) 啦！不錯的工具，鳥哥個人蠻喜歡加入 -n 這個參數來瞭解目前的主要規範檔放置在那個目錄下！
          postconf -n
        顯示的結果為：
          alias_database = hash:/etc/postfix/aliases
          alias_maps = hash:/etc/postfix/aliases
          command_directory = /usr/sbin
          config_directory = /etc/postfix
          daemon_directory = /usr/lib/postfix
          debug_peer_level = 2
          .......
        看到了吧！你想要知道的資料立刻一目了然，可以加快你的除錯喔！不必每次都要進入 main.cf 裡面找好久呢！

      • /usr/sbin/postmap：怪怪！這個指令的用法跟上面提到的 postalias 幾乎完全一模一樣啊！ ^_^不過，他是用來取代 sendmail 的 makemap 的！用法是：
          postmap hash:/etc/postfix/access ==>自動建立 /etc/postfix/access.db 這個資料庫檔案！

      • /usr/sbin/postqueue ：這個是在觀察郵件佇列的一個指令啦！你可以使用 postqueue -p 來顯示目前的郵件佇列內容！這個：
          postqueue -p 與 mailq 顯示的內容會一模一樣喔！

    • 目錄：同樣的具有郵件佇列與郵件信箱的放置目錄啊！

      • /var/spool/mail ：電子郵件信箱放置目錄
      • /var/spool/postfix ：郵件佇列，裡面還有很多次目錄，都是一些其他功能的咚咚啊！

    整體的架構大致是如此，好啦！瞭解的一定程度的架構之後，我們要開始來談談主機的最基礎設定了吧！

  • 基礎設定

    終於要來搞定我們的設定檔 /etc/postfix/main.cf 啦！先來搞定比較簡單的幾個部分喔！在 Postfix 安裝完畢之初，他僅支援本機寄信而已，如果您想要開放外送郵件，那就必需要做一些手術啦！底下幾個重要的項目先來觀察一下囉！(註：請使用 vi 來編輯喔！)
    在 main.cf 這個檔案當中，設定的項目都是以類似變數的設定方法來設定的，例如要設定 postfix 主機名稱時，就以：
    myhostname = vbird.adsldns.org
    這樣的方式來設定的，那麼什麼是『變數』呢？如果還不清楚，趕緊拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』翻到『認識 BASH 』的章節，好好的瞧一瞧去吧！尤其變數的內容顯示需要用 $ 來領頭的用法，千萬不可忘記！例如：
    myorigin = $myhostname ==> myorigin = vbird.adsldns.org
    上面兩個是一模一樣的，只是藉由變數來讓我們的設定更加的簡單化！不過，與變數設定規則當中比較不同的，在 main.cf 當中的等號兩邊需要有空白！此外，如果有兩個以上的設定呢？那你就必須要逗號『,』或者是空白字元『』來做為分隔了！例如：
    mydestination = $myhostname, $mydomain
    mydestination = $myhostname　$mydomain
    在底下的設定當中請特別留意這些設定喔！

    • 主機名稱的設定：myhostname 與 mydomain (極重要)
      這個設定蠻重要的喔！就是在設定你的主機名稱囉！請特別留意，這個『 myhostname 』的變數在 main.cf 設定檔的後面會持續的被使用到，所以，不要寫錯了！至於 mydomain 則是你的網域啦！以鳥哥的 linux.vbird.org 為例，我的主機名稱為 linux.vbird.org (用 FQDN 的方式來寫)，此時，我的 domain 就是 vbird.org 啦！在本章的例子當中，主機名稱為 vbird.adsldns.org 網域名稱為 adsldns.org ，所以你要這樣設定：
      myhostname = vbird.adsldns.org <==這裡請書寫你的主機名稱喔！
      mydomain = adsldns.org　　　　　 <==這裡則是你的 domain 名稱！

    • 送件來源的主機名稱：myorigin
      這個項目在設定『郵件標頭上面的 mail from 的那個位址』！當我們在本機端使用 mail 這個程式發送信件時，由於沒有定義送件者的位址，一般而言， 郵件主機會以目前的主機名稱做為郵件的 FROM 的那個主機名稱。例如在我的 postfix 上面使用 mail 發送信件時，在發送的郵件當中，就會顯示發信人為 vbird@vbird.adsldns.org 的意思啦！不過，我也可以自行指定來源主機的名稱，就是在這個 myorigin 設定的！通常，使用 $myhostname 來設定 myorigin 即可，不過，在某些大型主機當中，由於這個大型網域內可能有多部的郵件主機，在此時可指定 myorigin 為 $mydomain ，不過，如此一來還得替每個 user 指定其他相關的參數！所以，如果沒有其他要求的話，這個地方設定為底下的樣子即可：
      myorigin = $myhostname

    • 可用來收件的主機名稱：mydestination (極重要)
      這個項目可就重要的太多太多了！這個項目就是 sendmail 當中的 /etc/mail/local-host-names 相同的意義啦！你的 postfix 只有在發現 mydestination 這個項目中有寫入的主機名稱做為收信主機時，才會將該封信件收下來！例如，當你的主機名稱有 vbird.adsldns.org 與 www.vbird.adsldns.org ，這兩個主機名稱均指向同一部主機，那麼只有在你將這兩個名稱都寫入 mydestination 項目中，那麼兩個主機的來信才可以被接受，否則就會被退回喔！這個項目有多種設定方法，最簡單的就是直接寫入檔案中，另外，也可以設定的跟 sendmail 一樣，用外部的檔案來取代喔！
      方法一：利用變數的型態
      mydestination = $myhostname, www.$myhostname

      方法二：直接給他寫入名稱
      mydestination = vbird.adsldns.org, www.vbird.adsldns.org

      方法三：使用檔案型態
      mydestination = /etc/postfix/local-host-names
      上面的名稱可以隨便你取喔！然後在該檔案內設定
      [root@test root]# vi /etc/postfix/local-host-names
      vbird.adsldns.org,
      www.vbird.adsldns.org

      一般來說，除非您對於 local-host-names 這個檔案名稱情有獨鍾，否則的話，鳥哥個人建議您直接在 mail.cf 裡面直接設定好你的可接受的主機名稱即可！特別留意的是，如果你的 DNS 裡頭的設定有 MX 的話，那麼請將 MX 指向的那個主機名稱一定要寫在這個 mydestination 內！否則很容易出現錯誤訊息喔！特別的給他注意這一點！『一般來說，使用者最常發生錯誤的地方就在這個設定裡頭呢！需要搭配你的 DNS 設定喔！』

    • 簡易的 Relay 控制：inet_interfaces mynetworks_style mynetworks relay_domains (極重要)
      這個項目在控制誰可以利用我們的主機來寄信呢？也就是在 sendmail 裡面的 access 那個檔案的咚咚啦！分別說明一下幾個東西囉！

      • inet_interfaces：你的 Postfix 主機能被用來使用的介面，假如你的 Linux 主機有多個介面，例如多張網路卡或者是撥接之後又會產生的 ppp0 這些介面時，如果你不想要全部的介面都開放 postfix 功能，那麼就可以在這裡指定能用的介面囉 (註：指定的方式是以主機名稱為主喔！) 一般預設只有自己的內部迴圈網路可以使用 (localhost) ，不過，如果要連上 Internet 的話，建議就要全部都開放啦！ inet_interfaces = all

      • mynetworks_style：這是用來設定你所想要的 relay 的信任(trust)網域型態！一般來說，有三種主要的型態，分別是：

        • class ：表示為 A/B/C 三種 class 其中之一，在撥接或者是 ADSL 的情況下，這種型態設定並不好！因為他會主動的去找你目前的 IP 所在的網域來進行 relay 的功能開放！舉個例子來說，如果你是以中華電信的 ADSL 撥接情況，那麼你的 IP 很可能會是 61.59.xxx.yyy ，那如果你設定為 A class 的話 ( postfix 會自動的判斷，請至"網路基礎"一文當中查看 A/B/C 三個 class 的說明 ) ，那麼只要是 61 開頭的 IP 都可以用你的 postfix 喔！很嚴重吧！這個設定通常只給內部私有網域來使用的囉！

        • subnet：這是 postfix 的預設值，使用 subnet 的型態來設定喔！意義是說，你的網路卡 IP 所在網域的任何一個 IP 都會被接受的意思！例如我的主機網卡私有 IP 為 192.168.1.2 那麼所有我內部網域連接到這個網卡的 192.168.1.0/24 這個網域的所有 IP 都會被認為是『合法的』！而自動的提供其 Relay 的功能呢！

        • host ：在這個設定時， postfix 僅會知道 localhost 設定為 trust (信任) 的網域而已！

        基本上，這個設定值你可以指定為 mynetworks_style = subnet ，不過，也可以不要設定啦！直接以底下 mynetworks 來設定 relay 的網域即可！另外，如果您有設定 mynetworks_style 以及 mynetwork 時，那麼 mynetworks 這個設定會取代掉 mynetworks_style 喔！因為如此，所以鳥哥個人是不設定 mynetworks_style 的，只設定 mynetworks 而已！

      • mynetworks ：這個也是用來開放 Relay domain 的一個設定項目！一般來說，也可以設定成很多的方式，包括檔案與變數或直接書寫需要的 IP/netmask 類型！這裡我們假設有 192.168.1.0/24, 127.0.0.0/8 以及 192.168.1.100 這幾個咚咚要開放，所以我可以這樣寫：『mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32』！如此一來，連 access 都不需要設定呢！ ^_^ ( 註：請注意，如果你沒有設定 mynetworks 的話，一定要將 mynetworks_style 設定為 host 喔！不然你的 IP 所在的子網域的 IP 會被自動的認為是『合法的』呢！)另外，如果你想要啟用 /etc/postfix/access 這個檔案的設定功能時，那就必需要再加以修改喔！例如：『mynetworks = 127.0.0.0/8, hash:/etc/postfix/access 』注意檔案名稱使用完整檔名！

      • relay_domains：相對於 mynetworks 設定的專門針對『來源』的 IP 來設定，那麼如果是以主機名稱，或者是領域名稱( domain )時，要如何設定呢？那就可以使用這個項目來設定啦！ mynetworks 設定『信任網域的來源 IP 』而 relay_domains 則可以設定『信任網域的來源與目標之主機或領域名稱』啦！舉個例子來說，如果你的主機要開放 vbird.org 這個網域的主機的 Relay 功能，那麼你將 vbird.org 寫入 relay_domains 當中時，那麼：

        1. 任何由 vbird.org 來的信件都會被認為是『信任』的，所以 postfix 主機會自動幫忙 relay ；
        2. 由任何地方來的信件，"並且"要往 vbird.org 這個網域去的信件，postfix 主機也會幫忙 Relay 的！

        所以說，這個 relay_domains 可以設定『來源』與『目標』的主機或領域名稱喔！一般來說，relay_domains 預設就是我們自己的主機啦！！

      上面的設定項目當中，我們可以僅設定兩個即可啦！其他的不用管也沒有關係！不過，由於我預設還有啟動 vbird.org 這個 relay domain ，所以說，整體架設如下：
      inet_interfaces = all
      mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32,
      hash:/etc/postfix/access
      relay_domains = vbird.org

      設定完成之後還需要啟動 access 喔！
      1. 先手動修改完任何你想要的動作在 /etc/postfix/access 當中；
      2. 完成資料庫的建置：
      [root @test root]# postmap hash:/etc/postfix/access

    • 設定帳號別名的資料庫：aliases_maps (極重要)
      還記得 aliases 這個帳號別名的用途吧？！如果你是以 RPM 的方式來安裝 Postfix ，那麼這個設定值是沒有問題的，但是，如果你是以 Tarball 來安裝你的系統時，並且是由 sendmail 升級的，那麼由於 sendmail 將 aliases 放置在 /etc/aliases (要視你的 Linux 版本而定！)，不過，比較好的作法是將 aliases 放置在 /etc/postfix/aliases 裡面，這樣設定與目錄之間的關係比較容易找啦！那要如何修改呢？首先，你可以將舊有的 aliases 移動到 /etc/postfix/aliases 裡面，並且請特別注意，這個舊有的檔案裡面，一定要存在有『 postfix: root 』這一個設定才行喔！然後透過 /etc/postfix/main.cf 裡面的 alias_maps 來修改，通常鳥哥個人喜歡改成這樣：
      alias_maps = hash:/etc/postfix/aliases
      alias_database = hash:/etc/postfix/aliases
      改完之後還需要以 postalias 來建置成為 postfix 可以讀取的資料庫格式喔！
      [root @test root]# postalias hash:/etc/postfix/aliases

    呵呵！設定完上面這幾個重要的項目之後，基本上，你的 postfix 主機『已經準備好上路啦！』所以，這個時候請將他啟動吧！或者是重新啟動他吧！

    先確認設定檔有沒有錯誤：
    [root @test root]# postfix check <==檢查錯誤，若沒有任何顯示，表示正確

    如果是 RPM 安裝的情況：
    [root @test root]# /etc/rc.d/init.d/postfix restart

    如果是 Tarball 安裝的情況：
    [root @test root]# postfix start

    檢查是否正確的啟動了呢？
    [root @test root]# netstat -tl | grep smtp
    tcp 0 0 *:smtp *:* LISTEN

    設定開機的時候立刻啟動：
    [root @test root]# chkconfig --add postfix <== RPM 安裝時
    [root @test root]# vi /etc/rc.d/rc.local 　 <== Tarball 安裝時
    加入下面這行：
    /usr/sbin/postfix start

    當出現上面白色的那行顯示的內容 ( LISTEN ) 時，哈哈！你的 postfix 已經啟動啦！這個時候 postfix 已經可以：

    1. 針對 mynetworks 設定的 Client 端，進行 relay 的動作；
    2. 針對信件目的為 mydestination 設定的主機名稱『接收該信件』！

    雖然你是使用 Tarball 方式安裝 Postfix 的，但是如果你想要使用 /etc/rc.d/init.d/postfix restart 的語法來啟動的話，鳥哥已經寫了一支簡單的 scripts 提供大家這樣進行工作呢！可以 前往下載 喔！

  • 重要觀念：Postfix 預設的 Relay 流程與收受信件流程：
    在預設的情況下 ( 也就是說，在沒有開放 SMTP 這個郵件認證時！ ) Postfix 對於收信與寄信的流程是如何呢？！這裡我們得分別來談一談幾個主要的設定項目與郵件傳輸的動作喔！

    • 幫助 Client 發送信件，也就是 Relay 的功能開放的需求項目：在開放哪些項目之後，你的 postfix 主機才會幫助『信任』的 Client 端 Relay 呢？
      1. 當 Client 來自信任的網域，也就是 IP 符合 $mynetworks 的設定值時；
      2. 當 Client 來自信任的機器，也就是主機名稱符合 $relay_domains 的設定項目時；
      3. 當 Client 來自不信任的網域，但是去的目的地主機端符合 $relay_domains 的設定時。
      當符合上面三點的任何一點時，那麼 postfix 將對該信件進行 relay 的動作喔！

    • 收信程序：在哪些情況之下，我們的 postfix 會將該封信件收下來呢？
      1. 收件者主機名稱符合 $inet_interfaces 的設定；
      2. 收件者主機名稱符合 $mydestination 的設定；
      3. 收件者主機名稱符合 $virtual_maps 的設定。
      符合上面三點的任何一項時，那麼該封信件就會被我們的 postfix 收下來！所以，如果你的 postfix 能寄不能收，或者是能收不能寄，請仔細的觀察一下上面的幾個重大的設定項目，仔細的在你的 main.cf 重新設定一下，基本上，應該就不會有太大的問題啦！

  • 啟動 smtp 郵件認證功能

    談完了 Relay 的功能之後，接下來自然就是重要的『SMTP』郵件認證的部分了！目前郵件認證的功能有相當多種類，請特別留意的是，鳥哥這裡使用的是 SASL 釋出的 pwcheck 與 saslauthd 這兩個 daemons 提供的功能喔！這兩個功能分別在 cyrus-sasl 1.5.xx(pwcheck) 裡頭與 2.xx(saslauthd) 裡頭設定的啦！請回到前面的 Postfix 安裝裡面瞧一瞧 RPM 的 1.5.xx 與 Tarball 的 2.xx 好嘛！你要作的動作有：

    1. 確定 cyrus-sasl 已經安裝，並且同時必須要安裝 libsasl 相關的 LOGIN 及 PLAIN 的函式庫(這個在前面 Postfix 套件安裝 當中已經說明了，分別參考 Tarball 與 RPM 的安裝，請前往參考)；
    2. 確定在 sasl 函式庫內已經存在有 smtpd.conf 這個檔案 (注意，cyrus-sasl 第一版函式庫在 /usr/lib/sasl 而第二版則在 /usr/lib/sasl2 ，目錄並不相同，請仔細察看一下您的 sasl 喔！ )，這個檔案的內容在 Postfix 套件安裝裡面已經說明了！並且 sasl 與 sasl2 設定並不相同，請自行參考；
    3. 確定已經使用 pwcheck(cyrus-sasl 1.5.xx) 或 saslauthd(cyrus-sasl 2.xx) 這兩個 daemon 了，並且已經成功的啟動 daemon 了！可以使用『ps -aux | grep pwcheck 』或『ps -aux | grep saslauth 』察看是否有 process 存在；
    4. 修改 /etc/postfix/main.cf 這個檔案的設定 (請參考底下的說明)；
    5. 重新啟動 postfix 。

    基本上，大部分的內容我們在安裝的時候已經搞定啦，就剩下需要設定 main.cf 這個檔案而已，那麼有哪些資料必須要設定的呢？

    針對主機設定：
    • smtpd_sasl_auth_enable：『確定是否要針對 Client 啟動 sasl 的認證呢？』預設是不啟用，這裡我們必須要將他給啟用才行啊！所以要『smtpd_sasl_auth_enable = yes』

    • smtpd_sasl_local_domain：『確認已經經過認證的網域』，就是不需要身份認證也可以是『信任』的網域囉，在 1.5.xx 版的 cyrus 可以直接填寫為 $myhostname 啦！不過，在 2.xx 版本時，就不能設定了！很重要喔！

    • smtpd_recipient_restrictions：『信件收件的限制規則』，既然已經啟動了 sasl 的郵件認證，此時必須要規定一下，到底在什麼條件之下，我們的 postfix 可以接受 Client 端的 Relay 的功能呢？主要有底下這幾種限制的規則：
      • permit_mynetworks：在 mynetworks 這個項目設定的網域 IP 都可以被允許連線喔；
      • permit_authenticated：允許使用者經過 SASL 的認證方式寄信！
      • check_relay_domains：通過一些測試之後的主機可以進行 relay ，與剛剛前幾節的 relay_domains 有點關係！不過，在 2.xx 版本下，需要變成底下的項目了！
      • reject_unauth_destination：這是在 2.xx 版本時的設定項目，取代了 check_relay_domains 的設定項目囉！
      通常我們會設定上面這三個就差不多啦！

    • smtpd_client_restrictions：『針對 client 端的限制規則』，經過 mynetworks 這個信任網域的 IP 之後，那未經信任的 Client端 IP 來源你要限制他使用你的 postfix 時，這個項目就要啟動 permit_sasl_authenticated 囉！

    • smtpd_sasl_security_options：『取消某些登入的方式』，在 Postfix 裡面，預設是使用 Plaintext 的方式來認證的，所以自然不能取消掉這個認證囉(noplaintext)！但是我們可以取消掉匿名登入的型態喔(noanonymous)！可以這樣做『smtpd_sasl_security_options = noanonymous』

    針對 Client 設定：
    • smtp_sasl_auth_enable：上面是針對主機來設定的，這個項目則是針對 Client 來設定的，在預設的情況之下， Postfix 並不會對 client 提供認證的功能，也就是說， postfix 只會依據 mynetworks 之類的信任網域來提供 Relay 的功能，那麼我們要啟動對於 client 的身份認證功能時，這裡就必需要設定為 yes 才行！不過，如果是在 2.xx 版本時，這個設定就不需要啦！

    所以整個設定值就變成這樣啦：

    [root @test root]# vi /etc/postfix/main.cf
    1.5.xx 版本的 Cyrus SASL
    底下請自行新增在這個檔案的最後面：
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $myhostname
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
    check_relay_domains
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous
    smtp_sasl_auth_enable = yes

    2.xx 版本的 Cyrus SASL
    底下請自行新增在這個檔案的最後面：
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain =
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
    reject_unauth_destination
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous

    另外，由於 RPM 版本的 Postfix 預設會使用 chroot jail 這個比較安全的動作，所以，如果是 RPM 安裝時，你還必需要修改一個檔案：

    [root @test root]# vi /etc/postfix/master.cf
    找到底下的這一行：
    smtp inet n - y - - smtpd
    將他改成為：
    smtp inet n - n - - smtpd

    註：chroot jail 的功能在於『使用權限較低的一般身份使用者來進行 postfix 的工作程序，只有在需要的時候才可以進入 /var/spool/postfix 這個郵件佇列目錄！』，對於系統來說，是有一定程度的安全保障的！所以， Postfix 才會在預設的情況之下以 chroot 的功能來進行 postfix 的！不過，再加上了 SMTP 這個認證機制之後，由於他必需要以比較高等級的使用者來執行一些認證個功能，所以除非您額外的加入很多的函式庫去到 chroot jail 目錄下，否則的話，就不能使用 chroot 啦！所以，如果要啟動 SMTP 的話，請務必將 master.cf 這個檔案修改過喔！ ^_^

    這樣就算設定完畢啦！然後重新啟動 postfix 看看情況是如何：

    [root @test root]# /etc/rc.d/init.d/postfix restart
    [root @test root]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix (1.1.11) (Mandrake Linux)
    ehlo localhost <==確認一下你的主機狀態
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH PLAIN LOGIN <==出現這個就是成功囉！
    250-XVERP
    250 8BITMIME
    quit <==離開吧！
    221 Bye
    Connection closed by foreign host.

    然後確定一下你的機器是否真的有在進行認證的工作呢？首先，先取得你的密碼，然後再以密碼來測試看看認證是否可以通過！舉例來說，假如我有一個使用者 test ，test 的密碼為 abc 的時候，那麼你可以這樣做：

    [root @test root]# printf 'test\0test\0abc' | mmencode
    dGVzdAB0ZXN0AGFiYw== <==這個東西就是你的密碼啦！
    [root @test root]# telnet localhost 25
    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix
    ehlo localhost <==先打招呼
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN
    250-XVERP
    250 8BITMIME
    auth plain dGVzdAB0ZXN0AGFiYw==
    235 Authentication successful <==如果出現這一行就表示你的 SMTP 已經運作正常
    quit

  • 幾個相關的檔案說明

    在 sendmail 當中有幾個頗為重要的檔案，例如 ~/.forward 等等的檔案！在這裡我們也必需說明一下這幾個檔案在 postfix 裡面的應用情況：

    • /etc/mail/local-host-names：這個檔案是用來書寫你的 mail server 可以接收『目的 e-mail server』的名稱的一個檔案，這在先前的設定項目中已經提過了，就是 /etc/postfix/main.cf 裡面的 mydestination 的設定內容啦！

    • /etc/mail/access ：這個檔案用來規定可以 Relay 或者需要 discard 的動作！在 postfix 當中預設是不開啟這個檔案的設定的，如果要啟用的話，需要在 mynetworks 裡面規定好檔案名稱喔！設定方法請參考前幾節的說明！

    • ~/.forward ：這個檔案在 sendmail 與 postfix 當中的設定是一模一樣的，都是用來幫忙郵件的轉遞的，可以參考 sendmail 的設定項目！

    • /usr/sbin/mailq：這個執行檔已經被更改過了！目前可以使用 postqueue -p 來顯示出還在郵件佇列的信件標題喔！

    基本上，在 sendmail 當中可以使用的外部設定檔案，在 postfix 底下幾乎都能再被使用！所以，由 sendmail 升級到 postfix 真是相當的簡便啊！ ^_^
用戶端的使用說明
所有在 sendmail 當中需要注意的與可以使用的 Client 端的功能，在 postfix 當中都同樣的可以使用喔！所以，這部份請回到『sendmail 伺服器』那一章去瞧一瞧怎麼使用 client 來進行 Mail server 的種種工作吶！其中，需要特別強調的有幾個小細節：
  • 如果您有啟動 SMTP 的認證時，請千萬注意在 client 端的 MUA 必需要啟動『我的寄件人需要密碼』的項目，詳情請參考 sendmail 的設定一文；
  • 在 sendmail 當中，不論 port 25 有沒有啟動， Linux 本機上面使用 mail 寄信，『還是可以』將信傳送出去，不過在 postfix 可不是這麼回事了！你若沒有啟動 port 25 時，那麼使用 mail 將會把信暫時的放置郵件佇列當中 (/var/spool/postfix) ，直到再次開啟 port 25 之後，信件才有可能再次的備傳送出去喔！
關於郵件主機安全的設定
    關於郵件主機的安全性方面，我們已經啟動了 SMTP 了，那麼還有 Open Relay 主機的抵擋，以及 Procmail 的規則要規定呢！關於原理部分我們就不再提了，有興趣的回到上一篇去瞧一瞧，這裡僅介紹作法喔！

  • 關於 Open Relay Data Base

    啟動 ORDB 的功能只要：

    1. 設定 /etc/postfix/main.cf
    2. 重新載入 postfix

    就可以啦！我們可以這樣做：

    [root @test root]# vi /etc/postfix/main.cf
    maps_rbl_domains = relays.ordb.org
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
    reject_unauth_destination, reject_maps_rbl
    這兩行當中，第一行是新增的，第二行則是累加上來的！

    [root @test root]# /etc/rc.d/init.d/postfix reload

    還有更多的 Open Relay 的機制可以參考這個網頁喔：
    http://jimsun.linxnet.com/misc/postfix-anti-UCE.txt

  • 關於 Procmail 用法

    在 Postfix 當中啟用 procmail 真是太簡單啦！同樣的設定只要一行就夠了！

    [root @test root]# vi /etc/postfix/main.cf
    mailbox_command = /usr/bin/procmail

    [root @test root]# /etc/rc.d/init.d/postfix reload

    就是這麼簡單！至於 procmailrc 這個檔案，請參考 sendmail 的簡易設定一文喔！不過，事實上，使用 Procmail 在 Postfix 上面屬於額外新增一項功能的設定，其實我們可以使用 Postfix 預設的郵件過濾功能即可，那就是使用信件的 header 與 body 過濾機制來達成囉！至於作法我們在底下進行介紹囉！

  • 關於郵件過濾的規則設定

    相信您如果架設過郵件主機的話，一定有曾經 (1)被廣告信件轟炸與 (2)被莫名的病毒信件攻擊的窘境發生過∼真的是很討厭！我們一般的作法有可能是利用額外的 Procmail 來進行郵件的分析與過濾，這是一個不錯的選擇啦！不過，由於使用 Procmail 時，他是另外一支程序，所以可能會造成程序與登錄檔屬性不合的問題發生呢！那怎麼辦呢？呵呵！其實在 Postfix 裡面他原本就預設了兩個郵件過濾的機制了，分別是標頭( Header )與內容( Body )這兩部份的過濾機制喔！

    先來說明一下，什麼是 Header 與 Body 呢？最簡單的想法你可以這樣想：在你接到的一封信中，這封信主要分為底下這兩部份：

    • 信封上面的資訊 ( Header )：這包含了寄件者、收件者、地址、與信件標題等等！至於在 E-mail 上面，就是所謂的標題 ( Subject ) 、送件者 (From: )、收件者 ( To: )以及其他相關的資訊等等囉！

    • 信封內的信紙資訊 ( Body )：這就是對方寄信給你的時候所書寫的內容啦！

    如果我們能夠針對這兩者來進行規則的過濾，如此一來，呵呵！當然就可以抵擋掉大部分的問題信件咯！這些問題信件主要就是病毒信與廣告信了。不過，您必須要瞭解的是，這個過濾的規則是以正規表示法 ( Regular Expression, RE ) 來進行設定的！因此，您最好能夠具有初階的 RE 概念，如此一來會比較容易看懂底下的資料喔！

    1. 啟用 Postfix 設定檔裡頭的設定：
      好了，首先我們當然必須要啟動設定檔裡面針對這個郵件過濾的設定了！這裡我們訂定為這樣：
      • 對於 Header 的過濾規則以 /etc/postfix/header_checks 來進行設定；
      • 對於 body 的過濾規則以 /etc/postfix/body_checks 來進行設定。
      然後下達這樣的參數：
      [root @test root]# vi /etc/postfix/main.cf
      # 在這個檔案的最底下加入這兩行
      header_checks = regexp:/etc/postfix/header_checks
      body_checks = regexp:/etc/postfix/body_checks
      # 注意一下，那個 regexp 表示『我使用正規表示法來進行過濾的規則訂定』的意思
      # 至於後面接的檔案就是設定檔啦！

      [root @test root]# postfix reload

    2. 開始設定規則：
      對於規則的訂定其實並不簡單的！我們有必要針對 RE 的規則來進行約略的說明：
      • 在規則設定檔裡面 ( 就是 header_checks 與 body_checks ) 只要是 # 代表該行為註解，系統或直接略過；
      • 所謂的過濾規則即是 Header 與 body 裡面的『關鍵字』，例如我不想讓 192.168.100.5 這個 IP 寄件到我的 mail server ，那麼這個 From:.* 192.168.100.5 就是一條規則了！那個 .* 代表什麼意思呢？他代表『沒有或多個任意字元』的意思∼更詳細的說明請參考各個正規表示法的標準說明了！常見的正規表示法特殊字元與意義為：
          『.』：代表任意字元
          『\』：代表跳脫字元，可以讓後面接的一個字元變成一般字元；
          『*』：代表重複零個或多個前一個 RE 的字元，例如『.*』則代表任意零個或多個字元的意思；
          『^』：代表『這一行的第一個字元需要符合規則』的意思；
          『$』：代表這一行的最後一個字元必須要符合這個字元的意思，
      • 單一規則的設定方法為：
          /規則/ 動作 顯示在登錄檔裡面的訊息
        請注意，要使用兩個『 / 』將規則包起來喔！舉個例子來說明：例如我想要 (1)抵擋掉標題為 A funny game 的信件，(2)並且在登錄檔裡面顯示 drop header deny，我可以這樣寫：
          /^Subject:.*A funny game/ DISCARD drop header deny
      • 在預設的規則當中，大小寫是視為相同的；
      • 如果有兩條以上的規則，那麼就必須要使用 if 了，例如底下的案例：
          if /^Content\-Type:.*audio.*x\-midi/
          /^.*name\=.*\.scr/ DISCARD drop the header inavalid
          endif
        上面的意思是，當一封郵件裡面同時包含『 Content-Type: audio.x-midi 』與『name=*.scr』時，該封信件就會被丟棄了！那麼如果有三條以上的規則時呢？呵呵！就是使用多個 if 來進行啦！
          if /rule1/
          if /rule2/
          /rule3/ 動作 顯示字眼
          endif
          endif
        不過請特別留意，這個 if .... endif 的設定我僅在 2.x 版本上面試過，是沒有問題的，不過，已經有很多的朋友提出說，在 1.xx 版本上面執行時會有問題發生，所以如果您的 Postfix 不是 2.xx 版本，那麼底下鳥哥列出的兩個範例就參考看看即可，不可直接套用喔！
      • 關於動作有底下幾個動作：
          REJECT ：將該封信件退回給原發信者；
          WARN ：將信件收下來，但是將該封信的基本資料記錄在登錄檔內；
          DISCARD：將該封信件丟棄，並不給予原發信者回應！
        一般來說我是比較喜歡以 DISCARD 將信件直接丟棄的啦！ ^_^
      底下列出鳥哥的兩個範本：
      header_checks 範本
      body_checks 範本

    3. 檢查規則檔案設定是否正確：
      請注意！不是設定好了就 OK 了！你必須要檢查一下剛剛設定的規則是否正確？請特別留意喔！如果設定錯誤的話，很有可能會造成郵件無法順利的被你的 Mail server 接收下來的困境呢！檢查的方法很簡單的，利用 postmap 來檢查即可！如下所示：
      [root @test root]# postmap -q - regexp:/etc/postfix/header_checks < \
      > /etc/postfix/header_checks
      上面這些字眼『postmap -q - regexp:/etc/postfix/header_checks < /etc/postfix/header_checks』是同一行喔！如果螢幕上沒有出現任何的訊息，就表示至少您的規則訂定沒有疑問了！然後不需要重新啟動 postfix ，剛剛的設定立刻生效啦！

    藉由一個這樣簡單的郵件過濾機制，您就可以輕易的設定個人的郵件規則，並且將他抵擋在你的 mail server 之外呢！很不錯吧！此外，你可以在接收完信件之後，如果有發現任何不滿意的郵件時，想要將他過濾掉，那麼：

    1. 開啟該不滿意的郵件，並且進入查看『郵件原始檔』的內容，找尋出該郵件的『關鍵字』；
    2. 查尋一下該關鍵字是在 Header 還是在 Body 呢？
    3. 將該規則加入 header_checks 或者是 body_checks ；
    4. 以 postmap 檢查一下該規則是否設定無誤，如果顯示出錯誤訊息請持續修改至無錯誤為只；

    這樣就 OK 啦！簡單的很∼ ^_^

  • 問題信件的送達 notify_classes

    如果你的 postfix 發生了郵件或者其他方面的問題，應該通知誰呢？預設情況下， Postfix 會通知 postmaster 這個人的，所以，你必須要在 aliases 這個檔案裡面設定 postmaster 對應的實體用戶才行！一般來說，預設的 postfix 已經設定好 postmaster 的郵件會轉交給 root 了！所以這裡還可以比較不用理他！重要的是，我們必須要將哪些訊息送給 postmaster 呢？有底下這幾樣：

    • bounce：將無法寄出的信件複製一份給 postmaster 囉！不過，為了寄件者的隱私，postmaster 接到的是已經去除原始標頭(headers)的郵件；
    • 2bounce：將兩次無法寄出的郵件複製一份給 postmaster ；
    • delay ：將延誤寄出的信件的標頭(headers)通知 postmaster ；
    • policy：用戶端的寄件需求被 postfix 訂定的規則所拒絕時，發送錯誤的訊息給 postmaster 觀察用！
    • protocol：當由於 client 端或者是主機端因為執行某些程式，造成不完整的執行程序時(就是有錯誤發生啦！)，則通知 postmaster 一個協定錯誤的訊息(protocol errors)；
    • resource：當無法寄出的郵件是由於本身 postfix 的資源(resource)所造成的，例如 queue 檔案無法寫入的錯誤訊息等，則通知 postmaster 該問題！
    • software：由於相關軟體的問題造成無法寄出信件時的通知！

    一般來說，預設值是以 notify_classes = resource, software 來設定的！如果我們僅只要這樣的功能，那麼就直接將『notify_classes = resource, software 』加在 main.cf 當中吧！
其他應用說明：
在其他應用方面，基本上，與 sendmail 相似的，我們都需要：
  1. 進行備份；
  2. 進行磁碟配額限制(quota)；
  3. 進行登錄檔的查詢與記錄
這些動作與 sendmail 都很類似啦！所以您可以回上一章去參考一下喔！那麼萬一是無法使用 postfix 來寄信呢？你可以這樣試看看：
  1. 回歸到最原始的狀態，也就是不開放任何 SMTP, Open Relay, procmail 等等，以最原始的 main.cf 檔案進行 postfix 的運作，然後檢查一下重要的 myhostname, mydestination 以及 mynetwork 的設定，來看看 postfix 是否工作的很順暢，然後再來一個一個的啟用其他相關的控制喔！
  2. 萬一無法進行 SMTP 時，請確認您的 cyrus SASL 函式庫是第幾版的，然後在依照本文上面的設定來設定看看，應該不成問題吧！
  3. 還是無法解決您的問題時，請檢查一下您的 /var/log/maillog 這個登錄檔，問題的解決都在裡面啊！！！
另外，我們的網友 yangsman 提供了一支不錯的 script 用來啟動 pwcheck 之用，有興趣的朋友也可以參考喔！ script 內容如下：

[root @test root]# vi /etc/rc.d/init.d/pwcheck
#!/bin/sh
#
# Written By Yangsman 2003/05/5
#
#
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -f /usr/sbin/pwcheck ] || exit 0

# See how we were called.
case "$1" in
start)
# Start daemons.
if [ ! -f /var/lock/subsys/pwcheck ]; then
gprintf "Starting pwcheck: "
/usr/sbin/pwcheck 2>/dev/null
echo pwcheck
touch /var/lock/subsys/pwcheck
else
$0 status
fi
;;
stop)
# Stop daemons.
if [ -f /var/lock/subsys/pwcheck ]; then
gprintf "Shutting down pwcheck: "
kill `ps -aux|grep -v ps |grep "/usr/sbin/pwcheck"| \
gawk '{print $2}'` 2>/dev/null
echo pwcheck
rm -f /var/lock/subsys/pwcheck
else
$0 status
fi
;;
restart)
$0 stop
$0 start
;;
status)
if [ -f /var/lock/subsys/pwcheck ]; then
gprintf "pwcheck (pid \c"
gprintf "`ps -aux|grep -v ps |grep "/usr/sbin/pwcheck"| \
gawk '{print $2}' 2>/dev/null`\c"
gprintf ")is runing ...\n"
else
gprintf "pwcheck is't stopped \n"
fi
;;
*)
gprintf "Usage: %s {start|stop|restart|status}\n" "$0"
exit 1
esac

exit 0

參考資源
  • Postfix 官方網站：http://www.postfix.org
  • Cyrus-SASL 官方網站： http://asg.web.cmu.edu/cyrus/download/sasl/doc/
  • Open Relay Database： http://www.ordb.org/
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
簡易 Mail Server 架設 -- Postfix 設定
2003/03/07：第一次完成
2003/04/19：加入 Posfix 的郵件過濾規則訂定
2003/03/07以來統計人數


簡易 FTP Server 架設 -- Wu FTP 設定
最近更新日期：2003/03/26

在 Internet 上面的傳輸協定當中， FTP ( File Transfer Protocol ) 算是一個最古老的協定之一了！早期還沒有這麼多好用的協定之前( 例如 SAMBA )，都是使用 FTP 來進行資料的傳遞的呢！另外，一般來說，資料的傳輸以 FTP 這個協定來傳送是相當的快速的，而且某些場合當中其實也相當的方便。不過，值得注意的是，使用 FTP 來傳輸時，其實是具有一定程度的『危險性』，因為資料在 Internet 上面是完全沒有受到保護的『明碼』機制！所以，其實鳥哥不太建議大家使用這個伺服器的啦！尤其當你建置好了 FTP 之後，如果經常進行資料的傳遞，對於您的網路頻寬『真的有很大的損害』啊！不過，無論如何， FTP 仍然有其存在的必要！例如中山大學的 FTP 站就作的相當的棒啊！所以，底下我們就來談一談用在這個古老的協定上面，最古老的伺服器之一： Wu FTP

原理：
    ：FTP 的功能簡介
    ：FTP 的運作流程與使用到的 Port
    ：什麼是『被動, passive』的連線？
    ：FTP 的替代方案與安全性問題
    ：什麼時候才要設定 FTP 啊！開放誰人連進來？
套件安裝：
Server 端設定：
    ：Wu FTP 的結構
    ：最簡單的 ftpaccess 設定檔
    ：使用 Super daemon 管理 FTP 的情況
    ：歡迎畫面的建立、 Readme 檔案與關閉 FTP 訊息內容
    ：限制最大線上人數
    ：限制與取消使用者的家目錄規範
    ：時間相關的設定項目
    ：流量與上傳下載總量的限制項目
    ：創造 guest user 與 guest user 的家目錄問題
    ：anonymous 的根目錄與建立可上傳目錄
    ：針對人物(real, guest, anonymous)的限制設定項目
    ：拒絕某些使用者與開放某些使用者的登入(/etc/ftphosts, deny-uid, allow-uid)
    ：目錄與連結檔的問題
    ：建立 passive port 提供 client 端登入
    ：修改 FTP 預設的 port 21 的連線
    ：一個多樣化的實例
Client 端的使用 FTP 軟體：
    ：ftp
    ：ncftp
Server 端的安全設定項目：
    ：iptables
    ：TCP_Wrappers
    ：pam 模組與 /etc/ftpusers 的關係
    ：FTP 本身提供的抵擋 username 或 host 的控制項目
重點回顧
參考資源
本章習題練習
原理：
    File Transfer Protocol ( FTP ) 是相當古老的網路協定之一，他最主要的功能就是進行 Server 端與 Client 端之間的檔案傳送的功能啦！FTP 其實是以 TCP 封包的模式進行 Server 與 Client 之間的連線，當連線建立之後，使用者可以在 Client 端連上 Server 端進行檔案的下載與上傳，此外，還可以直接管理用戶在 Server 上面的檔案呢，相當的方便！而這個最古老的 FTP 伺服器軟體，大概要算是 Wu FTP 了，所以，底下我們將針對 Wu FTP 進行設定的說明喔！

  • FTP 的功能簡介

    FTP 主機除了單純的進行檔案的傳輸與管理之外，其實他還提供了幾個主要的功能，底下我們約略的來談一談：

    1. 不同等級的使用者身份：FTP 預設的情況下可以提供三種主要的身份，分別是(1)實體帳號,real user；(2)訪客, guest；(3)匿名登入者, anonymous 這三種。分成三種身份主要可以做為主機的控管上面的便利性，而且也可以將使用者作一個有效的管理呢！例如實體用戶可以進行的動作可能會比較多一些，至於匿名登入者，大概我們就僅提供他下載一下資源而已，並不許匿名者動作太多主機的資源啊！當然，這三種人物能夠使用的『線上指令』自然也就不相同囉！ ^_^

    2. 命令記錄與登錄檔記錄：FTP 可以利用系統的 syslogd 這個 daemon 來進行資料的紀錄，而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料的紀錄呢！

    3. 限制或解除使用者家目錄所在：為了避免使用者在您的 Linux 系統當中隨意逛大街，所以將他的工作範圍『侷限』在使用者的家目錄底下，嗯！實在是個不錯的好主意！FTP 可以限制使用者僅能在自己的家目錄當中活動喔！

  • FTP 的運作流程與使用到的 port

    FTP 正常情況下的連線方向：
    我們在網路基礎當中得知，TCP 這種封包由於需要經過 Server 端與 Client 端兩邊的『三向交握』之後，才能確定連線，因此，他可以說是一個比較『可靠』的連線模式，因為雙邊都已經經過確認(ACK)的動作，所以，當然會較為『可靠了』！那麼既然 FTP 主要的工作是讓 Client 與 Server 端可以進行檔案的傳輸，自然需要較為可靠的連線囉，不然檔案資料傳到一半竟然損毀時，怎麼辦？！因此，FTP 當然就是以 TCP 這種封包來進行連線的。在這裡，我們不厭其煩的，再次說明一下 FTP 在正常模式情況(或者稱為主動模式, active)下，主機與 client 端到底是如何建立連線的呢(在不考慮防火牆與其他不知名因素的情況下)？

    1. Client 端主動向 Server 端發送連線需求：由於是用戶端想要連上 FTP 主機，所以呢，當然連線的方向首先會由 Client 發起！此時，Client 端隨機選取一個大於 1024 以上的 port 來主動的連線到 FTP 主機提供的 FTP 埠口(通常為port 21)，而由於是主動的連線封包，所以這個連線會帶有 SYN 的標誌在；

    2. Server 端接受後，回應給 Client 端：當 Server 接收到 Client 的要求之後，會回應 Client 端的需求，此時 Server 端會建立等待連線的資源，並且將一帶有 SYN 與確認 (ACK) 的封包送回 Client 端；

    3. Client 端回應確認封包：在 Client 端接收到來自 Server 端告知的封包後，會再次的發送一個確認封包給主機，此時，兩邊才會正式的建立起連線的通道，這個步驟 1 ~ 3 就是 Three-Way Handshake(三向交握的啦！)。需要注意的是，這個已經建立連線的通道(通常是 port 21)僅能進行 FTP 的『指令』而已，如果該指令涉及到資料的傳送(data transfer)時，例如上傳或下載等等，那麼就需要額外建立一條資料傳輸的通道才行！而資料傳輸的通道建立則需要繼續底下的步驟；

    4. Client 端發送資料傳輸要求的命令給 Server：當需要進行資料的傳輸時，Client 端會啟用另一個高於 1024 的埠口來做為連線的準備(這個高於 1024 的埠口與步驟 1 那個埠口不是同一個！)，並且 Client 端會主動的利用剛剛已經建立的指令通道(通常是 port 21)發送一個命令告訴 Server 說：『我已經準備好一個資料傳輸的埠口了，請準備進行傳輸吧』！特別留意喔，這個時候 Client 是透過『命令通道』來對 Server 下達命令的，而且已經通知 Server 我(client)要啟用的埠口了喔！

    5. Server 端以 ftp-data 埠口主動連線到 Client ：收到命令之後的 Server 會『主動』的以 ftp-data 埠口(一般為 port 20)向 Client 端通知的那個高於 1024 的埠口進行連線，特別需要留意的是，此時是『Server 端主動向 Client 端的連線』喔，所以該連線的 TCP 封包會帶有一個 SYN 的標誌在；

    6. Client 端回應主機端，並繼續完成三向交握：在接到 Server 來的封包之後， Client 會回應一個帶有 ACK 確認的封包，並繼續來完成另一個三向交握的程序，此時，資料傳輸的通道才正式的建立。

    如此一來則成功的建立起『命令』與『資料傳輸』兩個通道！不過，要注意的是，『資料傳輸通道』是在有資料傳輸的行為時才會建立的通道喔！並不是一開始連接到 Server 就立刻建立的通道呢！留意一下囉！

    使用到的 port：
    由上面的連線資料來看，其實我們會用到的主機的兩個埠口分別是：
      (1)命令通道的 ftp (預設為 port 21 ) 與
      (2)資料傳輸的 ftp-data (預設為port 20)。
    這兩個埠口的工作是不一樣的，首先，那個 port 21 主要是用在接收 Client 端下達的命令之用，例如顯示目錄內的檔案內容 dir 以及上傳下載 (put, get) 等等的指令的；至於 port 20 剛剛上頭約略提過了，就是用在資料傳輸的時候才會建立的一個連線呢！而且，重要的是，兩者的連線方向是不一樣的！首先， port 21 主要接受來自 Client 端的主動連線，至於 port 20 則為主動連線至 Client 端呢！這樣的情況在 Server 與 Client 兩者同時為公共 IP (Public IP) 的 Internet 上面，通常沒有太大的問題，不過，萬一你的 Client 端是在防火牆後端，或者是 NAT 後端呢？會有什麼問題發生呢？底下我們來談一談這個嚴重的問題！

    在 NAT 或者防火牆後端的 FTP Client 連線問題：
    萬一你的 FTP client 是在 NAT 主機的後端，那由於我們的 NAT 主機會自動的紀錄 client 端向外連線的資訊，所以在 Client 依上面步驟 1 送出要求封包後，步驟 2 的 FTP 回傳的封包可以透過 NAT 轉交給 client ，這沒有問題！所以， Client 連接到 Server 的命令通道 ( port 21 )可以正確的被建立起來的。不過，萬一 Client 端在建立起了命令通道之後，對 Server 下達資料傳輸的命令呢？連線會是如何？我們以底下的圖示來說明好了：
    1. 由於目前的 NAT 主機可以記錄由內部電腦連線出去的資訊，因此，藉由 port 21 的連線可以順利的被建立起來；
    2. 當 Client 端由 port 21 下達資料傳輸的命令時，此時『個人PC』會告訴 FTP Server 說：『我開了一個 >1024 的埠口等你來連線喔』！
    3. 這個時候要特別留意的是，『個人PC』經過NAT主機連線後，在 FTP Server 看到的『個人PC』的 IP 其實是 NAT 那部主機的！所以，這個時候 FTP Server 會主動的由 port 20 向 NAT 主機的 >1024 那個 port 要求建立連線！(請翻閱NAT主機一章)

    瞭解問題的所在了嗎？原本我們的 FTP 主機要連線的其實是『個人PC』這部電腦的 >1024 那個 port ，不過，由於 NAT 的關係，所以卻造成了連線是向 NAT 主機的 >1024 那個 port 進行主動連線的！如此一來，想當然爾，NAT 主機並沒有啟動 >1024 那個 port 等 FTP 主機來連線，所以自然無法成功的建立起連線，這個時候你就會看到『Can't build data connection: Connection refused, 無法進行資料傳輸』之類的訊息了！啊！真是慘啊！ @_@

    那有沒有辦法可以克服這個問題呢？難道真的在 NAT 主機後面就一定無法使用 FTP 嗎？當然不是！目前有兩個簡易的方法可以克服這個問題：

    1. 使用 Linux NAT 主機的 iptables 預設模組，亦即 ip_conntrack_ftp 與 ip_nat_ftp 這兩個核心模組！應用 modprobe 這個指令就可以將這兩個模組載入了！我們剛剛說過，既然 iptables (NAT 主機)可以記錄 client 端向外連線的資訊，而 client 端向 server 端要求資料傳輸時，會主動告知 Server 我(client) 要等你來連線的 port ，因此，這兩個聰明的模組可以透過檢查 NAT 主機內的資訊而加以應用，那就可以讓 Server 與 Client 端建立 ftp-data 的連線啦！不過，這兩個模組並不是萬能的，因為這兩個模組目前僅能針對預設的 ftp-data(port 20) 進行檢驗的工作，萬一您連線的是一個使用非 port 20 為 ftp-data 傳輸的主機時，那這兩個模組就沒有辦法發揮其效能了！

    2. 另一個方法就是使用被動式連線 (passive)！什麼是被動式連線呢？想一想，既然『主機主動』連線到我的 NAT 後面的 client 不能成功，那麼我反其道而行，如果以 client 來連到 server 呢？是否就變成如同 port 21 相似的連線方向，如此一來不就可以成功的建立連線了嗎？呵呵！沒錯，而且也不需要啟動上面兩個模組了，並且也不擔心 FTP Server 是否啟用非 port 20 的 ftp-data port 啦！這部份我們底下說明喔。

  • 什麼是『被動, passive』的連線

    既然在 NAT (或防火牆) 後端的 client 無法讓主機主動的來建立連線，那麼我就讓主機『被動的等我 client 去連線』啊！果真如此的話，那麼我的連線狀態變成如何了呢？

    1. Client 端主動向 Server 端發送連線需求：

    2. Server 端接受後，回應給 Client 端：

    3. Client 端回應確認封包：上面這三個步驟與主動式連線一樣，同樣的完成三向交握後，建立命令通道了！底下說明被動式資料傳輸通道的建立。

    4. Client 端發送資料傳輸要求的命令給 Server：與主動式連線不一樣的是，在被動式連線時，Client 端在下達命令之後，並告訴 FTP Server 說『我要使用 PASV 模式(就是 passive 啦！)的方式來進行資料傳輸』；

    5. Server 端挑選 > 1024 的埠口等待連線：在接受 client 的 PASV 要求之後，如果沒有特別的設定時 (目前的 FTP 伺服器版本已經可以指定 passive port 來規定被動式連接的埠口號碼 ) ，Server 會隨機選取一個大於 1024 的埠口，並經由命令通道告訴 client 端那個大於 1024 的埠口，開始等待 client 端的連線；

    6. Client 端主動向 Server 端建立連線並繼續完成三向交握：經由命令通道得知 Server 的埠口之後， Client 端會隨機挑選另一個大於 1024 的埠口，並主動向 Server 端的等待連線的埠口進行連線動作，所以此連線封包是帶有 SYN 的標誌的喔！然後 Server 會回應一個帶有 ACK 確認的封包，並繼續來完成另一個三向交握的程序，此時，資料傳輸的通道就正式的建立。

    發現上面的不同點了嗎？呵呵！如此一來，在 NAT 主機內部的 Client 就可以順利的連接上 FTP Server 了！這就是在 FTP 連線裡面的所謂被動式連線囉！但是，萬一 FTP 主機是在 NAT 後端那怎麼辦.....呵呵！那可就糗了吧∼ @_@這裡就牽涉到更深入的 DMZ 技巧了，我們這裡暫不介紹這些深入的技巧，先理解一下這些特殊的連線方向，這將有助於您未來伺服器架設時候的考慮因素喔！

    此外，不曉得您有無發現，呵呵！透過 PASV 模式，Server 在沒有特別設定的情況下，會隨機選取大於 1024 的 port 來提供 Client 端連接之用。那麼萬一主機啟用的 port 被搞鬼怎麼辦？而且，如此一來也很難追蹤來自入侵者攻擊的登錄資訊啊！所以，這個時候我們可以透過 passive ports 的功能來『限定』主機取用的 port number 喔！

  • FTP 的安全性問題與替代方案

    事實上，FTP 是一個不太安全的協定呢！怎麼說呢？很簡單啊！因為 FTP 與 Telnet 相似的，他是以『明碼』的狀態在 Internet 上面流竄的，所以當然就容易被有心人士將你的資料給他抓下來，並且加以利用啦！因此，他當然不是很安全啊！所以，在網路上大家才會常常告誡說，不要隨意架設 FTP 網站啊！否則主機怎麼被破解的都不曉得哩！此外，由於 FTP 軟體常常會有漏洞的問題，因此也要常常更新套件喔！另外，其實拜 SSH 所賜，目前我們已經有較為安全的 FTP 了，那就是 ssh 提供的 sftp 這個 server 啊！這個 sftp-server 最大的優點就是：『他是經過加密的資料！』所以在 Internet 上面流竄的時候，嘿嘿！畢竟是比較安全一些啦！所以，建議您，除非必要，否則的話，使用 SSH 提供的 sftp-server 功能即可∼然而這個功能對於一些習慣了圖形介面，或者是有中文檔名的使用者來說，實在是不怎麼方便，因為目前還沒有很棒的 sftp-server 的圖形介面軟體說∼所以，有的時候，FTP 站還是有其存在的需要的。如果真的要架設 FTP 網站，那麼還是得需要注意幾個事項喔：

    1. 隨時更新到最新版本的 FTP 軟體，並隨時注意漏洞訊息；
    2. 善用 iptables 來規定可以使用 FTP 的網域；
    3. 善用 TCP_Wrappers 來規範可以登入的網域；
    4. 善用 FTP 軟體的設定來限制使用您 FTP 主機的使用者的不同權限啊；
    5. 使用 Super daemon 來進階管理您的 FTP 主機；
    6. 隨時注意使用者的家目錄、以及匿名使用者登入的目錄的『檔案權限』；
    7. 若不對外公開的話，或許也可以修改 FTP 的 port 。

    無論如何，在網路上聽過太多人都是由於開放 FTP 這個伺服器而導致整個主機被入侵的事件，所以，這裡真的要給他一直不斷的強調，要注意安全啊！

  • 什麼時候才要設定 FTP 啊！開放誰人連進來

    既然(1)FTP 不怎麼安全(2)FTP 的使用者身份至少有三種，那麼在設定 FTP 伺服器之前就需要針對這些不同身份者的登入限制來做規劃囉！以達成較為安全的管理啊！底下我們談一些大致的概念性問題，這些真的是蠻概念的∼看看即可！

    開放的用戶身份與可能造成的危害
    建議事項
    實體用戶(Real user)
    • 在預設的條件下，開放 FTP 本來就提供了實體用戶登入之用。
    • 不過，需要瞭解的是，以實體用戶做為 FTP 登入者身份時，基本上，系統並沒有針對實體用戶來進行『限制』的，所以他可以針對整個檔案系統進行任何的工作。因此，如果您的 FTP 使用者沒能好好的保護自己的密碼，導致被入侵，那麼你的整個 Linux 系統將很有可能被毀滅啊！
    • 由於實體用戶本來就可以透過網路連接到主機來進行工作，因此實在沒有特別的需要開放 FTP 的服務啊！例如 sftp 本來就能達到傳輸檔案的功能囉！
    • 如果確定要讓實體用戶使用者利用 FTP 伺服器的話，那麼您就需要避免讓幾個系統用的帳號可以登入！這個時候可以將『不想讓他登入』的帳號寫入 /etc/ftpusrs 這個檔案當中啊！例如 root 就是個很好的例子！
    訪客(Guest)
    • 通常會建立 guest 身份的案例當中，多半是由於主機提供了類似『個人 Web 首頁』的功能給一般身份使用者，那麼這些使用者總是需要管理自己的網頁空間吧？這個時候將使用者的身份壓縮成為 guest ，並且將他的可用目錄設定好，即可提供使用者一個方便的使用環境了！且不需要提供他 real user 的權限喔！
    • 僅提供需要登入的帳號即可，不需要提供系統上面所有人均可登入的環境啊！
    • 當然，我們在主機的設定當中，需要針對不同的訪客給他們不一樣的『家目錄』，而這個家目錄與使用者的權限設定需要相符合喔！例如要提供 test 這個人管理他的網頁空間，而他的網頁空間放置在 /home/test/www 底下，那我就將 test 在 FTP 提供的目錄僅有 /home/test/www 而已，比較安全啦！而且也方便使用者啊！
    • 針對這樣的身份者，需要設定較多的限制，包括：上下傳檔案數目與硬碟容量的限制、連線登入的時間限制、許可使用的指令要減少很多很多，例如 chmod 就不要允許他使用等等！
    匿名者(anonymoust)
    • 提供匿名登入實在不是個好主意∼因為畢竟你的系統為何要讓別人登入利用呢？
    • 不過，如果是提供整個學校單位來利用的話，那就另當別論了！
    • 無論如何，提供匿名登入都是一件相當危險的事情，因為，只要您一不小心，將重要的資料放置到匿名者可以讀取的目錄中時，那麼就很有可能會洩密！與其戰戰兢兢，不如就不要設定啊∼
    • 果真要開放匿名登入時，很多限制都要進行的，這包括：(1)允許的工作指令要減低很多，幾乎就不許匿名者使用指令啦、(2)限制檔案傳輸的數量，盡量不要允許『上傳』資料的設定、(3)限制匿名者同時登入的最大連線數量，可以控制盜連喔！

套件安裝：
事實上，使用 Wu ftp 來架設你的 FTP 伺服器時，還是以 RPM 的方式來安裝比較好啦！另外，如果您的 Linux distribution 提供其他版本的 FTP 伺服器，呵呵！那麼就不要使用 wu ftp 也沒有關係啊！這是因為 wu ftp 實在是太古老了，所以很多的駭客軟體都是針對他來設計的，也因為如此啊，所以才會產生『Wu FTP 伺服器比較不安全』的情況啊！好了，底下我們以 Red Hat 7.x 的版本來進行說明吧。基本上，一個 FTP 伺服器包含 Server 與 Client 用途的套件至少要有：

[root @test root]# rpm -qa | grep ftp
ncftp-3.0.3-6
ftp-0.17-12
wu-ftpd-2.6.1-20

其中：
  • wu-ftpd ：這就是主要的 FTP 伺服器套件啦！
  • ftp ：提供 ftp 指令，就是 client 端的工具啦！
  • ncftp ：提供匿名登入的 FTP 網站的 client 端相當棒的另一套連線 FTP 軟體！
如果沒有安裝，請馬上安裝吧！如果不曉得怎麼安裝，那麼請拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』好好的將 mount CD 的指令、搜尋的指令，以及 RPM 的指令瞧一瞧先！
Server 端設定：
    其實 Server 端的設定最主要的就僅有 /etc/ftpaccess 這個主要設定檔啦！幾乎只要他搞定了，FTP 就不會有問題說∼不過，由於 FTP 的高危險性，所以其他幾個跟安全較有相關的檔案我們也得來瞧一瞧才行啊！因此上，我們首先就需要來瞭解一下 wu ftp 到底有哪些設定檔案與執行檔呢？

  • Wu FTP 的結構

    Wu FTP 的檔案結構先來瞭解一下，才好繼續進行說明啊！底下主要粗分為設定檔與執行檔進行說明喔！

    設定檔： Wu FTP 的設定檔主要有底下這幾個：
    • /etc/ftpaccess：這是最主要的設定檔了！所有跟 Wu FTP 有關的設定內容，都可以在這個檔案做修訂；
    • /etc/pam.d/ftp, 與 /etc/ftpusers：這兩個檔案與 PAM 模組關係較大！在預設的情況中，只要在 /etc/ftpusers 這個檔案內的使用者『都不能使用 FTP 的服務』
    • /etc/ftphosts：用來允許或拒絕(allow/deny)某部主機或者某位使用者是否能夠登入 FTP 主機的設定檔案，基本上，這檔案裡面的設定也可以直接在 /etc/ftpaccess 當中設定喔！
    • /etc/xinetd.d/wu-ftpd：這個是用來啟動 FTP 的 daemon 設定檔案∼當然啦，主要是掛在 xinetd 這個 daemon 下的，如果是掛在 inetd 這個 daemon 時，就有可能是 /etc/inet.d 底下的檔案囉！

    執行檔：除了上面提到的這些設定檔之外，還有一些執行檔也需要瞭解一下：
    • ftpcount ：主要用來計算『目前連線的人數』，可以計算出各種身份的連線人數啊！
    • ftpwho：可以顯示出『目前連線的使用者是那個 User ？使用那個 PID？動作多久了？』等等的資訊呢！
    • ftprestart：重新啟動 ftp 啊！
    • ftpshut：指定時候關閉 FTP 的一個指令喔！
    • in.ftpd：這個就是主要的 Wu FTP 的 daemon 囉！我們啟動的 wu ftp 就是他的工作呢！

    用戶端的使用執行檔：這個部分的指令並不是 wu ftp 所提供的，但是粉重要，所以先提出說明喔！
    • ftp：就是最陽春的 client 端軟體囉！
    • ncftp：可以使用在匿名 FTP 網站喔！相當棒的軟體！可以支援整個目錄的下載呢！

    呵呵！接下來就是那個主要的 FTP 設定檔的設定部分啦！

  • 最簡單的 ftpaccess 設定檔

    事實上，與 Wu FTP 關係最大的就是 /etc/ftpaccess 這個檔案啦！只要他設定好，其他的地方相對都不成問題的！而其實 Wu FTP 一開始已經幫我們設定好一個最簡單的 ftpaccess 檔案，我們先來談一談這個檔案的幾個主要的設定項目，然後再來繼續其他的設定項目呢！

    [root @test root]# vi /etc/ftpaccess
    # 1. 設定人物群組名稱
    # 　 設定這個 FTP 伺服器的人物身份設定，使用 class 來設定的！他的語法是：
    # 　 class　<人物群組名稱>　<用戶身份1,用戶身份2,..>　<允許連線的來源>

    class all real,guest,anonymous *

    # 上面的意思是說，我設定一個類別群組為 all ，這個 all 裡面就包含了
    # 三種身份的使用者，就是 FTP 預設的 real, guest 與 anonymous 這三個，
    # 需要注意的是，這三個類別的使用者之間是以逗號『,』隔開的，並沒有空白字元
    # 而這個 class 允許的來源來自任何地方『*』。
    # 這個 class 可以多重設定，並且，萬一重複設定時，以第一個出現的 class 類別
    # 為準！舉個例子，假如我的 FTP 裡面的 real 僅允許學術網路登入，至於其他
    # 的 guest 與 anonymous 則雖然可以由任何地方登入，但是不可以由 chinait.com
    # 這個網域以及 61.141.0.0/16 這個網域登入時，那我可以這樣設定兩個 class 喔：
    # class　allone　real,guest,anonymous　*.edu.tw
    # class　alltwo　guest,anonymous　　!*.chinait.com　!61.141.0.0/16　*
    # 請注意到，驚嘆號『!』有代表『否，不允許』的意思存在，而星號『*』則代表
    # 任何地方的意思，則如上面所設定時，如此一來，學術單位可以連到我的 FTP ，
    # 至於 guest 與 anonymous 則可以任何地方連進，當然，除了上面的兩個網域之外
    # 所以說，經由這個 class 的設定，就可以輕易的將三種身份是否可以登入主機的
    # 狀態搞定了！ ^_^

    # 2. 設定系統的 FTP 管理員的 e-mail 信箱位址，與主機名稱！
    # 　 單純的就是顯示出系統當中 FTP 伺服器管理員的網址啦！預設的設定如下：

    email root@localhost
    hostname vbird.adsldns.org

    # 一般來說，我會將這個 e-mail 後面的位址寫上可以被使用者發信的信箱，例如：
    # email testing@test.adsldns.org
    # 這樣的格式！這個 email 可能會出現在進出網站時的歡迎畫面當中！
    # 最大的任務是：當使用者發現問題的時候，可以跟系統的管理員聯絡啊！
    # 所以當然要寫下『可以收信』的正常 email 囉！
    # 至於那個 hostname 則僅與歡迎畫面時的變數有關！

    # 3. 允許同一次連線當中，錯誤登入的次數
    # 　 為了避免被不明攻擊者的『暴力攻擊』法，所以在一次連線當中，
    # 　 僅允許對方最多有 5 次的登入機會，如果密碼或 ID 一直發生錯誤，
    # 　 則會將該連線『踢』掉的啦！

    loginfails 5

    # 當然囉！如果您想將登入的次數改小一點的話，也可以使用『loginfails 3』

    # 4. 向使用者顯示『README, 讀我』檔案的內容訊息！
    #　　當使用者登入或者變換目錄時，若目的端目錄有 README 這個檔案時
    #　　(可以附加檔名)，則向使用者顯示該檔案的內容！語法為：
    #　　<readme>　<README*>　<動作>
    #　　一般來說，動作有『登入』與『變換目錄』，代號為 login 與 cwd=*

    readme README* login
    readme README* cwd=*

    # 舉個例子來說，我是 testing 這個身份的使用者，在我的家目錄內有個檔案：
    # /home/testing/data/README.important
    # 那麼當我使用 FTP 軟體連進我的家目錄 (/home/testing) 然後切換目錄到
    # /home/testing/data 後，我的螢幕就會出現『請讀取 README.important』
    # 的字樣囉！以提醒使用者之用！

    # 5. 與 readme 的意義蠻相同的！不過這個 message 卻會將後面所接的檔案的
    #　　內容直接顯示在螢幕上面，而不僅是告知使用者去讀取而已∼

    message /welcome.msg login
    message .message cwd=*

    # 上面的意思是說，當我 login 或者切換到任何有檔名為 .message 的目錄時，
    # 該檔案的內容就會顯示到螢幕上面！一般來說，那個 /welcome.msg 就是
    # 『進站歡迎畫面』囉！這個等一下我們在底下會獨立出一小節來介紹他！

    # 6. 是否提供使用者線上立即執行的指令！
    #　　一般的格式為：
    #　　<指令名稱>　<是否允許/yes/no>　<針對的對象是誰>

    compress yes all
    tar yes all
    chmod no guest,anonymous
    delete no anonymous
    overwrite no anonymous
    rename no anonymous
    umask no all

    # 以上面的例子來說，我允許任何成功登入我主機的使用者(all)使用我的
    # FTP 主機來執行壓縮這個指令的動作！但是我不許匿名者(anonymous)
    # 使用我的 FTP 主機進行刪除(delete)以及改名(rename)的動作！
    # 你當然還可以增加自己所想要提供，或者減少提供使用者使用的指令！
    # 當然啦，既然 FTP 主要是針對『檔案』，所以指令以檔案的刪除、移動、
    # 更改與壓縮為主！

    # 7. 將使用者執行的部分指令歷程記錄到 /var/log/xferlog 這個檔案
    #　　FTP 進行上傳、下載或者其他使用者動作時，可以將過程訊息記錄下來，
    #　　記錄的檔案就是 /var/log/xferlog 這個檔案囉！語法為：
    #　　<log>　<欲登錄的項目>　<記錄的使用者身份>　<何種動作>

    log transfers anonymous,guest,real inbound,outbound

    # 上面說明的是『針對檔案傳輸(transfers)進行記錄，而針對所有人均紀錄，
    # 分別記錄上傳與下載(inbound,outbound)』，請注意，身份如果有多種，要以
    # 逗號『,』隔開，不要加空白喔！所以，當你的 FTP 使用者連上主機，
    # 並且有任何檔案傳輸的動作時，則檔案大小以及檔案數等資訊，就會被紀錄
    # 到 /var/log/xferlog 裡面去啦！而除了檔案傳輸之外，還有什麼可以紀錄的呢？
    # 基本上，那個『欲登錄的項目』內容就包含了下面幾項資料：
    # a. log commands <身份> ：例如『log commands real,anonymous』，表示
    #　　real 與 anonymous 這兩種身份的人，在 FTP 上面所下達的任何指令君會
    #　　被紀錄在 /var/log/xferlog 裡面
    # b. log security <typelist> ：例如『log security guest,anonymous』
    #　　表示當 guest 與 anonymous 使用者『違反安全機制』時，則會將當時
    #　　使用者所下達的指令或者其他動作紀錄下來！

    # 8. 關閉 FTP 的設定檔！
    #　　我們可以設定關閉 FTP 這個服務的時間，就利用 shutdown 後面接的檔案！

    shutdown /etc/shutmsg

    # 如果 /etc/shutmsg 不存在，則 FTP 服務就不會被關閉！所以不存在沒關係！
    # 而如果 /etc/shutmsg 存在的話，他的內容包含有底下這些資料(注意：
    # 第一行為時間參數，共有七個時間參數，用空白鍵分隔，而提示文字可以隨便
    # 編寫內容喔！也可以使用變數啊！)：
    # <年> <月> <日> <時> <分> <抵擋新連線> <刪除已連線>
    # <提示文字>
    # 年：任何大於 1970 年的年份；月：0-11！請注意啊！是由 0-11 喔！
    # 0 代表 1 月、 1 代表 2 月！
    # 日：當然就是 1-31 囉！　　；時：由 0-23 ；分：0-59
    # 抵擋新連線與刪除已連線：格式是 HHMM 例如 90 分鐘則是 0130 ，在關機前的
    # 設定時內，會拒絕新連線與將以連線之通道切除喔！例如：
    # 『2003 5 30 12 0 0230 0030
    # I will shutdown my FTP server !sorry!』
    # 在 2003/6/30 的 12:00 要關閉 FTP ，而 12:00 之前的兩小時30分內(09:30)
    # 就不許新的嘗試登入的連線，而在 30 分鐘前(11:30)就切掉已經已經連線之
    # 使用者連線！

    # 9. 匿名者的密碼驗證：
    #　　如果您的 FTP 允許 anonymous 的話，那麼還是需要讓匿名者輸入密碼的，
    #　　不過就是密碼的設定比較鬆散就是了！目前的密碼格式為：
    #　　<passwd-check>　<no|trivial|rfc822>　<動作>

    passwd-check rfc822 warn

    # 上面說的是，以匿名者登入的使用者也需要輸入密碼，而密碼的格式為 rfc822，
    # 如果使用者的密碼不合格，那麼就警告(warn)使用者，但仍允許使用者登入！
    # 密碼的格式方面目前有兩種(no是不需要密碼確認，所以不討論！)
    # trivial：密碼當中必須含有 @ 這個 e-mail 的字元；
    # rfc822 ：密碼必須符合 frc822 的規範！
    # 通常我們使用的是 rfc822 即可！至於動作主要有兩種動作：
    # warn ：使用者輸入錯誤的密碼時，僅顯示警告訊息，仍允許其登入；
    # enforce：使用者若輸入錯誤密碼，儲顯示警告訊息，並中斷連線喔！
    # 注意：
    # 如果你不想讓某個 email 的型態通過認證時，可以使用 deny-email 這個
    # 項目來抵擋！舉個例子來說，你不想讓 IE 的預設郵件地址通過認證，可使用
    # deny-email IE?0User@
    # deny-email mozilla@
    # 上面這兩個項目可以同時存在，如果還有不想讓他通過的 email address
    # 可以持續上面的設定多行！這有什麼用途呢？如果您不想讓 web browsers
    # 通過密碼的確認，而僅想讓類似一般的 FTP client 來連線，那麼這個
    # 限制項目就有用的很了！因為他可以將 IE 之類的 browsers 擋下來啊！

    # 10. 設定允許與不許登入 FTP 伺服器的使用者與群組

    deny-uid %-99 %65534-
    deny-gid %-99 %65534-
    allow-uid ftp
    allow-gid ftp

    # 這個是在 Red Hat 系統上面新增出來的設定啦！在一般正常的系統當中，
    # UID 小於 100 通常是系統帳號，而 UID 大於 65534 可能有安全上的問題，
    # 所以，我們就直接將這兩段 UID 與 GID 切掉啊！讓他們無法登入，也就可以
    # 拒絕某些不當的入侵攻擊了！那就是 deny-uid 與 deny-gid 的功效！
    # 所以，上面的意義是，小於99與大於65534 的UID/GID都予以抵擋連線；
    # 而開放的 UID 與 GID 則僅有 ftp 這個群組與使用者喔！
    # deny-uid 後面除了接數字外，也可以直接接帳號名稱，例如要擋住 testing
    # 與 testqq 這個用戶時，可以設定：
    # deny-uid testing testqq
    # 後面可以接多個 UID 或帳號或者使用範圍，例如抵擋 100 到 1000 之間的 UID
    # deny-uid 100-1000
    # 至於 allow-uid 則恰好相反啊！就是允許的意思∼

    事實上，上面的設定並不麻煩，只有幾行而已，只是我們需要瞭解一下每個項目之間的相關性，所以鳥哥我加註了一些說明而已∼您可以參考參考的啦！這樣就完成了一個最最簡單的 ftpaccess 這個設定檔囉！準備來去啟動 FTP 囉！

  • 使用 Super daemon 管理 FTP 的情況

    目前一般常見的 FTP 伺服器(除非是大型的 FTP 主機)大多是使用 super daemon 來進行統一管理的，而由於目前多半的 super daemon 都使用 xinetd 這個 super daemon ，所以底下我們僅針對這個 xinetd 來進行說明喔！事實上，由於 FTP 是掛在 super daemon 底下的一個服務，所以我們僅需要設定好 xinetd 裡面關於 wu-ftpd 的設定檔，然後『重新啟動 xinetd 』就可以啟動 FTP 囉！在一般的情況下，我們可以發現 /etc/xinetd.d/wu-ftpd 這個主要設定檔內容為：

    [root @test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
    disable = yes <==就是他，將他改為 no 即可！
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/in.ftpd
    server_args = -l -a
    log_on_success += DURATION USERID
    log_on_failure += USERID
    nice = 10
    }

    在上面粗體的地方將 yes 改為 no 即可！因為 disable 是『取消』的意思，那 disable = no 當然就表示『不取消』的意思∼這是一個相當簡單的 xinetd 的設定檔，如果要進行多重控制的話，例如：我的主機有兩塊介面卡，一塊對內一塊對外，對內與對外的『開放時間』與『開放網域』及『相關權限』都不相同時，就可以使用其他額外的設定來控制這些參數！由於相關的說明我們已經在『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的『認識服務』談過多次，而且，在架站篇裡面的 Telnet 伺服器當中也提過一個簡單的範例，所以這裡就不再多作贅述，請自行前往查閱！

    好了，那麼最終終於要來啟動 FTP 囉！趕緊動手重新啟動 xinetd ，並且使用 netstat 來察看一下 port 喔！

    [root @test root]# /etc/rc.d/init.d/xinetd restart

    [root @test root]# netstat -tl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:ftp *:* LISTEN

    [root @test root]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 localhost.localdomain FTP server (Version wu-2.6.1-20) ready.
    Name (localhost:testing): testing <==輸入登入者帳號
    331 Password required for testing.
    Password: <==輸入你的密碼
    230 User testing logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> exit<==離開 FTP

    這樣就 OK 的啦！( 註：還是得注意一下你的防火牆機制與 /etc/hosts.deny 裡面是否將 in.ftpd 這個服務關掉了？！會造成無法連線的原因有很多都是因為沒有將防火牆的機制打開的緣故！請再回頭詳細看一下簡易防火牆設定一文)。如果要關閉 FTP 的話，那就將上面 disable = no 改成 disable = yes 然後再重新啟動 xinetd 即可！相當的簡單吧！ ^_^

  • 歡迎畫面的建立、 Readme 檔案與關閉 FTP 訊息內容

    歡迎畫面的建立：
    呵呵！建立進站歡迎畫面可就快樂的很了！可以讓大家知道您這位 FTP 主機管理員所下達的『公告』事項喔！我們剛剛在前頭已經設定了進站歡迎畫面(login)的檔案是 /welcome.msg ，注意喔！是放在『根目錄, root』底下，那麼到底 / 是怎麼定義的？是與 Linux 的檔案系統相同還是有其他的規定！？是這樣的：

    • 如果您的使用者可以到達系統的根目錄，那麼他將取用 /welcome.msg 這個檔案；
    • 如果使用者只能在自己的家目錄內活動時，那麼此時他的『根目錄』會變成他的『家目錄』！因為這樣他才離不開自己目前所在的目錄啊！例如 test 這個使用者被限制在自己的家目錄內活動，那麼他的進站歡迎畫面則是取用 /home/test/welcome.msg 喔！
    • 至於如果是匿名者登入的話，由於匿名者一定都會被限制在匿名者登入的目錄，所以您也必需要將該檔案放置在他們的根目錄喔！

    那麼由於 welcome.msg 裡面其實包含有相當多的可用變數，包括目前的主機、遠端主機名稱、FTP 管理員的 email 以及目前時間等等的變數，我們先來談一談有哪些變數吧：

    %T　　本地端的主機時間(格式為 Fri Mar 21 11:28:50 2003)
    %F　　使用者目前所在目錄之 partition 所剩空間(不一定支援所有系統)
    %C　　使用者目前所在的目錄
    %E　　系統管理員的 email ，這個就是剛剛設定 ftpaccess 內的 email 值
    %R　　遠端主機的 IP 或 hostname ！
    %L　　本地端主機的名稱或 IP
    %U　　使用者的登入帳號名稱
    %M　　FTP 主機所能允許的使用者最大連線數量
    %N　　FTP 主機目前已經連線的使用者數量
    %B　　關於硬碟容量的限額
    %Q　　目前的 block 數量
    %I　　最大的可用 inodes
    %i　　針對 inodes 的限額
    %H　　當過度使用硬碟空間時的時間限制
    %h　　當使用過度檔案時的時間限制
    %s　　預計關閉 FTP 的時間(與 /etc/shutmsg 有關)
    %r　　預計關閉 FTP 前禁止再連線的時間(與 /etc/shutmsg 有關)
    %d　　預計關閉 FTP 前已連線的中斷時間(與 /etc/shutmsg 有關)

    上面的表格是用在顯示歡迎的訊息的，我們可以建立一個這樣的檔案喔！
    [root @test root]# vi /welcome.msg
    Welcome to my FTP site.
    Now is the time ==> %T
    The host name is %L
    You are %U and from %R
    There are %N person in my site, now.
    If you have any problem please call me
    %E

    是的！內容只要上面這樣即可！，馬上來測試一下設定的結果

    [root @test root]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 vbird.adsldns.org FTP server (Version wu-2.6.1-20) ready.
    Name (192.168.1.100:test): test
    331 Password required for test.
    Password: <==輸入密碼
    230-Welcome to my FTP site.
    230-Now is the time ==> Fri Mar 21 12:03:49 2003
    230-The host name is vbird.adsldns.org
    230-You are vbird and from 192.168.1.100
    230-There are 1 person in my site, now.
    230-If you have any problem please call me
    230-root@localhost
    230-
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bye

    歡迎畫面已經進入囉！ ^_^！就是這麼簡單即可建立一個漂漂亮亮的歡迎畫面呢！甚至您也可以自行設計中文訊息，以輔助中文閱讀啊！此外，您也可以在不同的目錄下編輯『.message』這個檔案，則也可以在使用者進入該目錄時，可以顯示出該目錄當中需要注意的事項喔！這些都是可以使您的 FTP 網站更佳的人性化的工具啦！

    關閉 FTP 喔！
    在某些特殊的情況下，可能您會要讓您的 FTP 服務關閉！例如：已經預先知道時間的停電通知、已經規劃好的硬體維護時間、已經設定好的系統停機時間等等，這些時候都需要關閉 FTP 。在這種情況下，通知使用者關機的時間就是一個相當好的設定啦！這個時候您就可以使用 /etc/shutmsg 這個檔案囉！( 註：某些情況當中，使用者可能會希望一天之中某些時候啟動 FTP 而某些時刻關閉 FTP ，例如 8-16 點啟動 FTP 而 16-隔天8點關閉 FTP ，這種情況下，您可以藉由 xinetd 這個 super daemon 的功能來達到這個目的！而不是使用這個 shutmsg 喔！切記 )

    我們假設這樣的情況：假設我在 2003/03/30 的 12:00 要關機，並且在關機前的 60 分鐘不許新的連線登入，至於已建立的連線則在關機的 30 分鐘前切斷連線，那麼我就可以這樣編輯 /etc/shutmsg 囉！(特別注意其格式！)

    [root @test root]# vi /etc/shutmsg
    2003 2 30 12 00 0100 0030
    我將要關閉連線、請不要再進行連線啦！
    即將關機的時間：%s
    新連線失敗的時間：%r
    已連線關閉的時間：%d

    註：上面的內容格式為兩段，第一段就是時間的參數，分別是：
    年 月 日 小時分鐘 HHMM HHMM (最後兩個分別是新連線與已連線的斷線時間)
    第二行以後則是一些文字的敘述！可以參考 message 裡面的變數！

    如此一來，則當 2003/03/30 的 11:00 以後，新的 FTP 要求封包將不會被連線，至於已經連線的 FTP 則在 11:30 分時，會自動的被系統踢出去喔！此外，上面這一段文字會在你登入 FTP 時顯示在螢幕上面呢！可以讓您很清楚的知道什麼時候主機會終止 FTP 的連線啊！ ^_^！特別留意：這個檔案並不會自動的消除，並且，如果設定錯誤，您可能無法連上 FTP ，因此，在過了那個關閉 FTP 的時間點之後，以上面的例子來說，就是 2003/03/30 ，您最好將該檔案刪除啊！不然可能會查不出來『到底是那個環節造成我的 FTP 無法連線』的窘境喔！ ^_^

  • 限制最大線上人數

    如果由於自己本身的硬體設備問題或者是頻寬的問題，所以不想提供太多的同時連線使用者數量時，可以使用『最大線上人數限制』的項目來規範呢！規範的內容很簡單，同樣的僅要編寫 /etc/ftpaccess 即可！加入底下這一段：

    [root @test root]# vi /etc/ftpaccess
    # 規範的格式為：
    # <limit> <人物群組名稱> <最大連線數> <時間> <被拒絕時顯示的文件檔案>

    limit all 20 Any 　　　　 /etc/ftpmaxnumber
    limit guest 10 Any 　　　　 /etc/ftpmaxnumber
    limit anonymous 5 Any0800-2000 /etc/ftpmaxnumber

    由上面的限制當中，我們知道，在 all 這個人物群組當中，最大的同時上線
    人數為 20 人，並且，這個設定是任何時刻均有效(Any)，如果你是第 21 個
    連線進來我的 FTP 的人，那麼您的螢幕將會出現 /etc/ftpmaxnumber 這個檔案
    的內容，並且『無法連線進入我的 FTP 』！請特別留意 Any 的大小寫，若
    寫錯時，這個設定將不會生效！

    [root @test root]# vi /etc/ftpmaxnumber
    這裡已經太多人啦！請您等一下再進入！ ^_^

    [root @test root]# /etc/rc.d/init.d/xinetd restart

    這樣就設定完成啦！記得重新啟動 xinetd 喔！我們可以針對不同身份的使用者進行連線數目的限制呢！如同上面的設定，(請注意，那個 Any 大小寫不要搞錯了！另外， Any 後面沒接資料，表示『任何時間』的意思，否則需要以 HHMM 的格式來書寫時間的樣式！)所有的連線最多只能有 20 個，至於 guest 則最多有 10 個，但是 anonymous 則在每天的 8:00 到 20:00 時限制只能有 5 個連線而已∼這樣就可以分別限制 OK 啦！ ^_^

  • 限制與取消使用者的家目錄規範

    這個設定僅對 real users 有用啦！在早期的 Wu FTP 伺服器中，由於沒有考慮到一般用戶可能會胡搞的問題，所以預設所有 real users 登入 FTP 主機後，可以到達任何使用者權限範圍內的所有目錄！例如我是 /home/test 這個使用者，那我可以進入 /etc, /var, /tmp, ... 等等目錄來下載資料，無形之中對於系統的安全性有點『危險』囉！這個時候，如果我們能夠將使用者『侷限』在個別的家目錄當中，例如 /home/test 就成為我 test 這個人的根目錄 / ，由於已經被設定為根目錄啦，自然也就無法去到其他的目錄囉！我們可以這樣做：

    [root @test root]# vi /etc/ftpaccess

    restricted-uid *
    restricted-uid 200-400 test testing

    [root @test root]# /etc/rc.d/init.d/xinetd restart

    上面是兩個例子喔！不要搞錯了！可以分別設定，不要同時設定的啦！如果是星號『*』表示『任何身份 UID』都予以限制其家目錄！如果是底下的設定，則是限制 200-400 以及 test testing 這兩個使用者，讓他們的家目錄變成根目錄，這也就是所謂的 chroot 囉！ ^_^！同時可以設定的就是限制 GID 囉！那就是 restricted-gid 啦！

    那如果反過來呢？目前較新的版本(例如 Red Hat 7.3)預設情況下就是設定為 restricted-uid * 的！不過，我就是要讓某幾個使用者可以到處瀏覽啊！那就使用 unrestricted-uid 以及 restricted-gid 即可！例如

    [root @test root]# vi /etc/ftpaccess
    unrestricted-uid test testing

    可以理解嗎？加油喔！ ^_^

  • 時間相關的設定項目

    或許有的時候你會發現一件事情，那就是『怎麼我幾分鐘沒有動作，我的 FTP 主機就將我踢出來咯？』就是說，當我們登入 FTP 主機後，如果隔了一段時間沒有動作 ( 這個沒有動作的時間我們叫做 idle ，也就是停頓的意思 )，那麼 FTP 主機會主動的認為 client 端可能使用者忘記登出了！因此會自動的將使用者踢出系統！不止如此喔！有的時候，如果您下載一個大型的檔案，例如 100 MB 的資料檔好了，偏偏您是使用撥接 (理論最大下載速度 8KBytes/second )，所以應該會下載粉久粉久！但是偏偏就是 20 分鐘後， FTP 主機卻主動的將這個持續下載的連線關閉！這又是為什麼？這是顧慮到可能有惡意者在『盜連』網站，所以才會有這樣的設定！

    這些時間的設定是蠻重要的啦！如果您不希望才離開一下子怎麼 FTP 就踢人∼那麼就可以修改一下這些預設的數值囉！我們來看看底下的這些設定吧！您都可以自行修改這些設定喔！不過，請依您的需求來考量！

    [root @test root]# vi /etc/ftpaccess
    # 時間參數預設都是以秒 為單位的！

    timeout accept 120
    # FTP 這個 daemon 會等待一個 PASV 的連線多久？由於 client 端的連線可能
    # 受限於一些網路頻寬或者其他的因素，導致無法立即連上時，我們的 daemon
    # 預設就會等待 120 秒來期待 client 端的連線成功！

    timeout connect 120
    # 與 accept 有點類似，不過 accept 是在等待 client 端的要求之回應，而
    # connect 則是在等待確認的回應！亦即三向交握內的 client 端回應 ACK 的
    # 封包囉！

    timeout data 2400
    # 當我們下載檔案的時候，最多 FTP 可以讓我們下載或上傳一個檔案多久？
    # 一般來說，由於目前大家都使用 ADSL 來傳輸，所以資料傳送不算慢，
    # 不過，萬一您的檔案太大了，導致傳送速度很慢，那就比較麻煩啦！
    # 通常這個設定的預設值是 1200 ，不過，建議可以大一點，例如 2400 可達 40
    # 分鐘，對於傳輸速度較慢的使用者會比較好一點！

    timeout idle 1800
    # 就是我們上面提到的，多久沒有動作會被踢掉？預設是 900 ，你可以改大一點！

    timeout maxidle 1800
    # 與 idle 類似！不過由於 Client 端可以要求延長 idle 的時間，因此，
    # 還會有所謂的 maxidle 喔！您大可將這兩個咚咚都設定一樣即可！

    limit-time anonymous 30
    limit-time guest 100
    # 這個項目在設定『一次連線內，多久會被強制斷線？』以上面的例子來說，
    # anonymous 每次登入之後，可以取得 30 分鐘的工作時間，如果超過 30 分鐘，
    # 系統會主動的將他踢出去！(強制斷線！)這個項目對於 real user 沒有效果！

    這樣就算是設定完畢啦！記得重新啟動 xinetd 喔！這樣子您就比較不用擔心 idle 的問題啦！ ^_^

  • 流量與上傳下載的限制項目

    關於流量上下傳的限制與總體流量的限制方面， wu ftp 也提供了許多的設定來規範！我們分別來談一談幾個常見的流量控制方法：

    整體檔案數目與檔案容量的限額：
    如果你要限制整組人員每次登入時，在該次登入可以上下傳輸的檔案數量或容量的限額時，就需要使用到 file-limit 與 data-limit 了！可以這樣使用的啦：

    [root @test root]# vi /etc/ftpaccess
    # 給予的限制情況：
    # <file-limit> <in|out|total> <數目或 bytes 數> <身份群組>

    file-limit out 32 　 alltwo
    data-limit in 10240 alltwo

    # 上面的設定說明是這樣的， alltwo 是一個 class 群組，這個在最前頭
    # 規定出來的啦！而 in 代表上傳、out 代表下載， total 則代表總量！
    # 第一個範例是說， alltwo 這個群組當中的任何使用者，在一次登入當中，
    # 可以下載的檔案總數，這是以檔案數量來計算的！至於第二個範例，則是說
    # 在 alltwo 這個群組中的任何使用者，均僅可『上傳 10KB 的容量』！
    # 注意喔！那個數字代表的是 Bytes 的，要換算成 KBytes 則需要除以 1024

    這個東西可以限制的有趣啦！不過他僅針對整個群組來進行限額的設定！這個群組是由 class 的項目來規範出來的！而且，這個規定是針對『一次登入』來規範的，也就是說，以第一個範例來說，你這次登入可以下載 32 個檔案，然後就無法下載了，沒關係，離線，再連線，又可以下載 32 個檔案，這樣應該可以理解吧？！這樣也可以優化你的頻寬喔！

    限制流量的方法 throughput：
    使用 throughput 可以限制使用者在不同的目錄底下的傳輸速率喔！查看一下方式：

    [root @test root]# vi /etc/ftpaccess
    # 給予的限制情況：
    # <throughput> <根目錄> <次目錄> <檔名> <bytes/s> <倍數> <位址>

    throughput /var/ftp　　　*　　　　　　　*　10240　-　*
    throughput /home/test　　/public_html　 *　51200　-　*
    throughput /home/test　　/realdown　　　*　oo　　 -　*.vbird.org

    # 上面我設定了兩個有被限制的下載目錄，分別是 /var/ftp 這個目錄，以及
    # /home/test/public_html 這個目錄，需要注意的是， 10240 代表 10Kbytes
    # 喔！設定錯誤會讓使用者下載到瘋掉啊！此外，那個 /home/test/realdown
    # 則是『全速』開放給使用者下載喔！

    這個指令對於想要優化自己主機網路頻寬的朋友真是太有用了！我們可以限制使用者(不論任何身份，均有效)在不同的目錄底下，具有不一樣的下載速度，如此一來，可以讓主機的頻寬花在該花的地方，而不至於被其他不明使用者佔用了太多的頻寬去呢！我就蠻喜歡的說∼一般來說，如果您將您所提供的檔案放置在一個下載目錄，而這個目錄裡面又分為多個次目錄，那麼可以使用上面第二個範例的例子，將根目錄與次目錄分開來書寫，然後可以指定不同次目錄底下的傳輸速度，例如第二與第三個範例的樣式啊！另外，特別留意的是：
    • 如果想要開放全部的頻寬 (就是全速、不限制下載的速度) 那就需要使用 oo 才行！注意喔！不是數字的零，而是英文字母小寫的 o 喔！
    • 那麼什麼是倍數呢？倍數就是下載的速度乘上的一個倍數值，舉個例子好了，如果我的下載速度是 51200 (50KBytes)，而我想要開放到 1000KBytes ，那麼那個倍數的地方就寫上 20 就對了！但是，如果是 1.0 倍呢？這個時候可以寫 1 也可以寫『 - 』這個減號！
    • 最後一個是 Client 端的主機名稱或位址 (IP)。

    上傳、下載的比例 ratio 設定：
    如果想要使用上傳、下載比例的用處時，那很有可能需要重新編譯你的 wu-ftp 喔！因為他需要額外的參數來加入這個功能！無論如何，我們先介紹如何使用這個設定，有興趣的朋友可以自行研究編譯的問題啊！

    [root @test root]# vi /etc/ftpaccess
    # 給予的限制情況：
    # ud-dl-rate <數字> <使用者身份群組>

    ul-dl-rate 2 all

    # 這表示 所有的人物可以上傳 1M 下載 2M 的意思！

    請特別留意的是，這個設定項目要『Wu FTP 有支援才行』，所謂的有支援就是他必需要被編譯到執行程式當中！一般來說，預設的 distribution 是有支援這個項目的，所以您可以發現這個設定是可以生效的！不過，要注意的是，由於最後面接的是『使用者群組身份』而不是 real, guest 與 anonymous 的設定，這個與 class 的相關設定有關！因此，在設定之初，最好就已經將這三組人物分別歸類於三個群組當中，會比較妥當一點啦！ ^_^！也就是說，這個設定項目不能使用 real, guest 與 anonymous 等！

    而如果想讓使用者知道『他的上下傳資料』，可以使用底下的變數功能喔！

    %xu　　可上傳的 bytes 數
    %xd　　可下載的 bytes 數
    %xR　　上傳與下載的比例 (1:n)
    %xc　　剩下的可用 bytes 數
    %xT　　時間限制 (分鐘)
    %xE　　由開始登入到目前的時間預估(分鐘)
    %xU　　上傳限制 (與 file-limit 及 data-limit 的 in 有關)
    %xD　　下載限制 (與 file-limit 及 data-limit 的 out 有關)

    例如編輯一個檔案名稱為 .message 在使用者常常下載的目錄底下，讓他一登入該目錄就會顯示該檔案內容啊！內容有點像這樣：

    [root @test root]# vi .message
    您可以上傳/下載的比例為 1:%xR
    您此次登入至目前剩下的時間：%xT
    由登入到目前為止使用的時間：%xE
    您可以上傳的最大容量(KBytes)：%xU
    您可以下載的最大容量(KBytes)：%xD

    是不是很方便呢？！ ^_^

  • 創造 guest user 與 guest user 的家目錄問題

    什麼是 guest 呢？剛剛我們上面談了這麼多的資訊，還是沒能提到這個 guest 是什麼咚咚？事實上，在 Wu FTP 當中，這個 guest 也必須要存在 /etc/passwd 當中的！他的密碼也是經由比對 /etc/shadow 來達成的！那不就是『Real Users』嗎？怎麼會是訪客？是這樣的，由於擔心某些使用者會使用其他的系統資源，因此，僅讓這個 User 可以使用被限制住很多權限的帳號，也就是說，我們將他的權限『壓縮』成為訪客而已，而不是讓他以 real user 的身份登入我們的系統啦！

    那麼什麼時候會用到 guest 呢？舉個例子來說，如果我的主機是 WWW 伺服器，而且我有開放給外部電腦 (例如我的好朋友啊等等的) 來使用時，那麼我的朋友自然需要將網頁資料傳送上來對吧！然而我又不希望他會使用我主機裡面其他的功能，此時，我就可以將他的帳號裡面關於 shell 的部分設定成為怪怪的 shell ！例如 /sbin/nologin！這樣他就無法登入主機，但是還是可以進行 FTP 的連線的啦！

    假如我有一個使用者帳號為 test ，雖然他的家目錄是 /home/test ，但是我僅想要讓他可以在 /home/test/public_html 這個目錄下活動，而且還可以在他進入主機給予一些訊息，此外，我也不許他可以登入系統，那該怎麼作呢？

    1. 修改一下該帳號的 shell 部分欄位，舉個例子來說，假如我的帳號是 test ，那麼在 /etc/passwd 裡面應該就會變成：
      [root @test root]# vi /etc/passwd
      .... 略 ....
      test:x:511:100:testacount:/home/test:/sbin/nologin
      .... 略 ....
      修改一下該使用者，讓他的 shell 成為 /sbin/nologin 吧！

    2. 再來將上面使用的怪怪 shell 加入到 /etc/shells 當中：
      [root @test root]# vi /etc/shells
      /bin/sh
      /bin/bash
      /bin/tcsh
      /bin/csh
      /bin/zsh
      /sbin/nologin
      最底下一行是我們加入的喔！為了讓 FTP 能被使用的啦！

    3. 修改一下 ftpaccess 裡面相關的設定囉：
      [root @test root]# vi /etc/ftpaccess
      # 幾乎就是新增兩行即可： guestuser 與 guest-root

      guestuser　test
      guest-root /home/test/public_html test

      # 第一行說的是要將 test 這個使用者變成 guest 啦！
      # 第二行則是說， test 這個使用者的家目錄是在 /home/test/public_html

    4. 重新啟動 xinetd 即可！

    作一個簡易的 guest user 真的不難喔！此外，這個使用者的 FTP 家目錄就是 /home/test/public_html ，並且，無法離開這個目錄到其他的 Linux 下的目錄喔！比較安全的啦！^_^！與此同時，需要來強調的是，既然 guestuser 比較安全，那麼可以將我整個系統裡面的 User 都變成是 guest user ，而僅有一兩個帳號是 real user 嗎？當然可以囉！假設我的 test1, test2 這兩個是實體用戶，其他的都將成為訪客，那我就給他：

    [root @test root]# vi /etc/ftpaccess

    guestuser　*
    realuser test1 test2

    # test1 與 test2 中間用空格隔開！這樣就成功啦！

    很簡單不是嗎？！

  • anonymous 的根目錄與建立可上傳目錄

    瞭解了 guest 的家目錄設定之後，那麼我們再來談到更為麻煩的，就是那個 anonymous 啦！我們曉得在 Red Hat 7.2 當中預設的 anonymous 家目錄是在 /var/ftp 當中，那麼是否可以使用其他的目錄來取代這個目錄呢？確實是可以的，假設我們以 /home/ftp/public 做為 FTP 預設的 anonymous 家目錄時，我可以加入一行設定使得這個家目錄生效：

    [root @test root]# vi /etc/ftpaccess

    anonymous-root /home/ftp/public

    不論您是否多麼不願意相信，這一行就可以讓您的 anonymous 家目錄的所在生效囉！不過，在預設的狀態中， anonymous 是『不許上傳資料』的！怎麼辦？沒關係，我們可以設定 upload 這個參數來允許使用者上傳資料到主機端呢！假設我的 anonymous 可以傳送資料(檔案與目錄)到 /home/ftp/public/upload ，而且傳送到主機的檔案所屬人為 ftp 所屬群組則是 sys ，不過，卻僅能傳送檔案到 /home/ftp/public/upfiles 但是不可以在這個目錄當中建立其他目錄！此時可以這麼做：

    [root @test root]# vi /etc/ftpaccess
    # 格式很簡單，就是：
    # upload <家目錄> <次目錄> <yes|no> <檔案所屬人> <群組> <權限> <目錄>

    anonymous-root /home/ftp/public
    upload /home/ftp/public /upload yes ftp sys 0666
    upload /home/ftp/public /upfiles yes ftp sys 0666 nodirs

    # 第二行顯示的是，我的 /home/ftp/public/upload 可以允許匿名者上傳資料，
    # 並且上傳到主機的檔案所屬人與群組為 ftp/sys ，此外，檔案的權限為 0666
    # 至於 /home/ftp/public/upfiles 這個目錄當中則僅能上傳檔案，不能建立目錄

    由於登入者為匿名者 ( anonymous ) ，所以預設是『沒有身份』的，這個時候我們就必須要讓上傳的檔案具有『身份』才行，所以才會要指定目錄之外，還需要指定檔案的身份啊！此外，要『真正可以讓 anonymous 上傳資料』還需要 Linux 檔案權限的配合，舉個例子來說，在 Linux 當中，我們就必須要讓 /home/ftp/public/upload 這個目錄可以讓 ftp 使用者與 sys 群組來進行寫入的工作才行！

  • 針對人物(real, guest, anonymous)的限制設定項目

    除了預設的一些設定值之外，我們還可以針對各個不同身份的使用者進行『檔案權限』的控制喔！那就是跟檔案權限有關的以及程序執行順序有關的 umask 以及 nice 值啦！在設定之前，請先瞭解一下什麼是 umask 與 nice 喔！請再次的拿出『基礎學習篇』讀一下裡面的內容吧！底下我們就實際來介紹一下囉！

    [root @test root]# vi /etc/ftpaccess
    # nice 　　<數值> <使用者群組或身份>
    # defumask <數值> <使用者群組或身份>

    nice 10 anonymous
    nice -5 real
    defumask 022 real
    defumask 002 anonymous

    # 請務必搞懂什麼是 nice 與 umask 喔！上面的 defumask 就是 default umask
    # 的意思！不難理解吧？！

    需要注意的是， nice 值只有 root 可以設定為負值，而且 nice 值越小表示這個執行程序『越快』被執行！而 umask 則是預設取消的權限，相關的說明請務必瞭解！(這是很重要的觀念！)

  • 拒絕某些使用者與開放某些使用者的登入

    拒絕不良的 IP 或網域或 domain ：
    如果您發現惡意的使用者來自於某些 IP 或者是主機名稱時，而想將他抵擋住的時候，當然最好的方法還是以 iptables 將他整個踢出系統之外。但是，如果您發現的情況是，某些使用者暫時的使用方式讓您的 FTP 產生了困擾，例如大量下載某些檔案，或者是不當的使用 FTP 所提供的資源時，所以想暫時讓他無法使用 FTP 。您想讓他瞭解一下『為何會被取消使用 FTP 的權力』的情況下，可以使用下列的參數來進行這樣的設定資訊：

    [root @test root]# vi /etc/ftpaccess
    # 準備抵擋囉！就以 <deny> <位址或主機名稱> <回覆給使用者訊息的文件>

    deny 192.168.0.100 /etc/ftpdeny.msg
    deny *.adsldns.org /etc/ftpdeny.msg

    # 上面的設定當中，當 192.168.0.100 這個 IP 來的 FTP 要求封包時，
    # 不僅不提供其 FTP 的連線，並且會顯示 /etc/ftpdeny.msg 這個檔案的內容！
    # 同樣的，只要來自 .adsldns.org 的網域的電腦也都會被抵擋啊！

    [root @test root]# vi /etc/ftpdeny.msg
    您無法直接登入這部主機，請與您的 FTP 管理員聯絡！
    管理員 E-Mail 位址為： %E

    如此一來，則當 192.168.0.100 這個來源 IP 的任何使用者來連接 FTP 時，在他們的 FTP 軟體上面，就會顯示出問題的所在啦！至於聯絡人則是以 %E 這個 email 變數做為聯繫的！

    拒絕某些危險的帳號：
    在我們的 Linux 系統上面，由於主機套件上面的需求，所以都會預設有一些基本的帳號存在的！例如常見的 adm, bin, sys, 以及 mail 上面常見的 mail ！同時，也有一些常見的群組存在的！要注意的是，這些帳號通常僅有系統工作的時候才會用到，其他一般身份使用者不太會使用這些帳號的啦！此外，由於系統帳號常常會侷限在 UID 1~499 以內，而大於 65000 以上的帳號應該不常見的！所以，我們可以拒絕使用這些 UID 與 GID 來登入 FTP 主機的！這就需要用到 deny-uid 與 deny-gid 的設定項目啦！此外，事實上，如果您也發現某些可疑的帳號時，也可以先以這個設定項目將他拒絕在您的系統之外喔！使用的方法如下：

    [root @test root]# vi /etc/ftpaccess
    # 就直接使用最初的設定 deny-uid <帳號、UID或範圍>

    deny-uid %-499 %65000-
    deny-gid %-499 %65000-
    allow-uid ftp
    allow-gid ftp

    這樣的方式也可以用來抵擋一些不合法的 UID 啊！

    使用額外檔案來抵擋：/etc/ftphosts
    我們也可以使用 /etc/ftphosts 來進行使用者僅可以用來連線的主機喔！這個檔案的設定方法有點像底下這樣：

    [root @test root]# vi /etc/ftphosts
    # 格式為 <deny> <使用者帳號> <不許連線的IP或主機名稱>
    # 格式為<allow> <使用者帳號> <不許連線的IP或主機名稱>

    deny　test 　 192.168.0.0/24
    allow testing 192.168.1.0:255.255.255.0
    # 注意上面這兩種書寫方式的不同的！

    deny test2 192.168.5.10 allow test2 *

    上面說明的是，我不許 test 由 192.168.0.0/24 這個網域來！但是允許 testing 這個使用者來自 192.168.1.0/24 ！請注意這兩種方式！當以 bit 書寫時，就直接加上 / ，至於如果是以 netmask 來書寫時，則是加上冒號『:』。需要特別注意的是，如果同時存在兩條同一個人的設定，例如：
      deny test *
      allow test *
    這樣的情況下『最後出現的那一條規則為預設的規則！』所以結果就是 test 可以由任何地方進來 FTP 主機喔！這裡還請特別留意啊！此外，進行完上面的設定後，請記得重新啟動 xinetd 啊！

    使用 PAM 模組的機制來抵擋：
    上面的幾個案例都是在 FTP 的設定檔裡面規定的，也就是說，上面的設定都是您的 Client 端已經進入在 FTP 裡面之後再來進行抵擋的動作的！那麼有沒有還不需要動到 FTP 就抵擋的機制呢？除了我們後面才會提到的 iptables 以及 TCP_Wrappers 之外，我們還有個 PAM 密碼驗證模組可以利用呢！首先來看一下 PAM 模組裡面關於 FTP 的基本內容：

    [root @test root]# vi /etc/pam.d/ftp
    #%PAM-1.0
    auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed <==此行與上行為同一行
    auth required /lib/security/pam_stack.so service=system-auth
    auth required /lib/security/pam_shells.so
    account required /lib/security/pam_stack.so service=system-auth
    session required /lib/security/pam_stack.so service=system-auth

    仔細的看一下上面的檔案喔！粗體的部分那一行裡面的 sense 是 deny 喔！這表示寫到 /etc/ftpusers 裡面的使用者名稱代表『無法登入 FTP 系統的使用者』！哈哈！所以說，只要是這個檔案裡面的任何使用者就無法通過密碼驗證 (由 PAM 模組管理的 ) 這一關，自然也就無法使用 FTP 了！因此，當您不想讓某個 User 進入你的 FTP 使用者，只要將他的名字寫入這個 /etc/ftpusers 當中，那該使用者就無法使用 FTP 了！但是不會影響到其他的 daemons 的服務喔！還不錯吧！ ^_^

    讓 root 可以使用 FTP 功能：
    除了上面提到的之外， /etc/ftpusers 裡面的內容大部分的帳號都是來自於系統帳號，這包括每個 Linux 都會存在的 root 這個帳號！所以 root 自然也就無法登入系統的 FTP 服務了。如果我真的想要讓 root 可以使用 FTP 的功能，我需要怎麼作呢？
    1. 首先，請先將 /etc/ftpusers 裡面的 root 拿掉；
    2. 確認 /etc/ftphosts 沒有擋掉欲登入的主機的 IP 或者是 hostname；
    3. 確認 /etc/ftpaccess 裡頭關於 deny-uid 與 deny-gid 沒有 0 這個數字存在！
    4. 重新啟動 /etc/rc.d/init.d/xinetd 這個 daemon ！
    這樣大概就可以讓 root 登入啦！不過『強烈建議不要這麼做！』

  • 目錄與連結檔的問題

    除了使用連結檔之外，我們可以直接讓使用者以『 cd {某目錄名稱} 』進入到該目錄下！而且是不論在任何目錄下均可進行這個動作喔！這樣一來有個好處啦，就是如果很多 real user 的檔案當是集中在某個目錄底下的，那麼直接使用這個功能就不需要到每個使用者的家目錄裡面建立連結檔囉！

    [root @test root]# vi /etc/ftpaccess
    # alias <你想要給這個目錄起的名字> <實際 Linux 系統的目錄>

    alias anonymousdir /var/ftp

    如同上面的設定，當使用者在任何地方只要下達『 cd anonymousdir 』就可以進入到 /var/ftp 這個目錄當中啦！請注意，這個 alias 『僅針對 cd 這個指令有用』！您可以將這個 anonymousdir 目錄定義寫在 /welcome.msg 當中，讓使用者可以知道有什麼功能呢！還不錯吧！但是有個問題必須要瞭解的，那就是我們知道了 restricted-uid 可以限制住某個使用者讓他僅能在『家目錄』當中活動，而無法移動到其他目錄去！現在想像一個案例，如果我的 test 這個使用者被限制在家目錄 /home/test 裡面，那麼如果我在 /home/test 裡面建立一個連結檔，連結到 /home/ftp 這個目錄，那麼是否 test 就可以利用這個連結檔移動到 /home/ftp 去呢？還有，這個 alias 所建立的目錄是否可以讓使用者離開自己的家目錄呢？『很抱歉』答案是否定的！也就是說，不論是建立連結檔或者使用 alias ，您都無法離開被限制住的目錄喔！

    此外，為了避免 anonymous 這些匿名者上傳的時候傳送一些奇怪的檔名，例如傳送 windows 裡面的檔案名稱，那就有可能包含了很多怪異的特殊字元，這些特殊字元可能會造成我們 Linux 系統的一些困擾。為了避免這些問題，我們可以『指定』anonymous 不能上傳某些怪異的檔案名稱的檔案，使用下面的過濾機制：

    [root @test root]# vi /etc/ftpaccess
    # path-filter <群組> <訊息檔案> <允許字元> <不許字元1> <不許字元2> ...

    paht-filter　anonymous　/etc/pathmsg　^[-A-Za-Z0-9._]*$　^\.　^-

    [root @test root]# vi /etc/pathmsg
    請注意，您的檔案名稱不符合本站的限制，請檢查：
    1. 檔名起始字元需為英文或數字或底線；
    2. 檔名起始字元不可為 . 或者減號 -

    在上面的設定當中，我們可以發現，在 /etc/pathmsg 後面除了第一個是『允許』的字元外，其他後續接的都是『不允許的字元！』至於這些字元的規格則與正規表示法『Regular Expression』有關喔！上面的意思是說，檔名開頭(^符號表示開頭)只能是英數字，而不能是小數點與減號！這裡請特別注意正規表示法喔！他是很重要的！請再次的勞駕到『基礎學習篇』察看正規表示法吧！而萬一使用者上傳的檔案檔名是『錯誤的，主機不允許的』情況時，則會將 /etc/pathmsg 這個檔案裡面的訊息告知使用者！當然，這個檔名是可以變動的！

  • 建立 passive port 提供 client 端登入

    建立 passive port 給 client 端使用是有其必要性的！這個我們在前言的部分已經提過了！但是，又由於可能會導致『難以追蹤入侵者』的問題，讓這個 passive 變的棘手∼此時， passive ports 這個可以指定 port number 的設定就可以讓我們定義出少量的 port 來做為 passive 之用囉！那該怎麼作呢？更加的簡單！只要幾個設定就可以搞定啦！

    [root @test root]# vi /etc/ftpaccess
    # passive ports <CIDR 位址> <最小 port> <最大 port>
    # pasv-allow 　 <人員身份> <位址>

    passive ports 0.0.0.0/0 65501 65505
    pasv-allow all *

    # 這代表來自任何地方的 IP 在要求 passive 連線模式時，將以 65501 ~ 65505
    # 之間的 port 來做為他們 PASV 連線的要求啦！如此一來，則 passive ports
    # 將僅會隨機選取 65501 ~ 65505 之間的 5 個 port 來做為 PASV 之用，
    # 其他的 port 將不會使用到 FTP 的 passive 模式！如此一來還可以建置
    # 防火牆上面的 port mapping 呢！很不錯吧！ ^_^

    就這樣一個設定就可以讓您的 passive 模式的連線當中，限制他的相關的 ports 囉！此外，如果您的 FTP 是在 NAT 內部的話，那麼就可以就由 firewall 的 port mapping 的動作來進行 PASV 的轉 port 作用來達成內部 FTP 主機的被動連線喔！ ^_^

  • 修改 FTP 預設的 port 21 的連線

    在約略瞭解了大部分常用的 Wu FTP 功能之後，咦！如果我不想使用 21 這個 port 做為我 FTP 預設的指令通道，那麼是否有辦法修改這個 port 號碼呢？舉個例子來說，我希望我的 FTP port 為 3366，有的！就是利用兩個檔案，分別是：

    • Xinetd 這個 Super daemon 的設定檔：/etc/xinetd.d/wu-ftpd
    • Port 對應 daemon 名稱的檔案：/etc/services

    修改的方法很簡單！我們先來看一下 wu-ftpd 這個檔案的內容之後，再來進行進一步的說明：

    [root @test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/in.ftpd
    server_args = -l -a
    log_on_success += DURATION USERID
    log_on_failure += USERID
    nice = 10
    }

    事實上，重要的地方就是那個 service ftp 的地方！這個 ftp 的 port 就是寫在 /etc/services 當中的啦！所以說，如果我將 /etc/services 裡面的 ftp port 修改一下，那就可以改 port number 啦！不過，這還不是個好主意∼我還可以透過自行給予的 daemon name 來進行設定喔！舉個例子來說，如果我要建立一個名為 vbftp 的 daemon 名稱，那我可以這樣做：

    1. 修改 wu-ftpd 這個裡面關於 daemon 的名稱：

    [root @test root]# vi /etc/xinetd.d/wu-ftpd
    service vbftp <==修改這裡就對啦！
    {
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/in.ftpd
    server_args = -l -a
    log_on_success += DURATION USERID
    log_on_failure += USERID
    nice = 10
    }

    2. 修改 /etc/services 的 daemon 相關設定內容
    [root @test root]# vi /etc/services

    vbftp　　　　3366/tcp

    # 上面這一行可以加在這個 /etc/services 裡面的最後一行！自己設定的啦！

    3. 重新啟動 xinetd

    [root @test root]# /etc/rc.d/init.d/xinetd restart

    這樣就可以修改您的預設 FTP port 囉！加油是看看！

  • 一個多樣化的實例

    好了，大致上 Wu FTP 的設定您應該可以理解了吧！那麼現在出個例題給大家思考一下，假如我需要達成底下的規範，那麼應該如何設定 Wu FTP 相關的檔案呢？

    1. 將群組設定成為 real, guest, anonymous 這三個群組分別控制！(用 class 來區分喔！)；
    2. 用戶身份有 real, guest, anonymous，其中， real 僅允許來自 140.116.0.0/16 這個 B class 的網域，其他兩者雖可來自於所有網域，但不允許來自 61.141.0.0/16 這個 B Class 的網域；
    3. 允許使用 passive ports ，port number 設定為 65501 - 65510 這 10 個 ports ；
    4. 系統裡面小於 499 以及大於 65000 的 UID 與 GID 都被拒絕登入；
    5. 任何時刻，最大線上人數限制為 30 人，其中， guest 最多 10 人，而 anonymous 最多為 5 人；
    6. 實體用戶 mysiteuser 被限制他僅能在他的家目錄當中工作，無法離開其家目錄，至於其他實體用戶則不在此限；
    7. 我有兩個 WWW 的個人用戶 wwwuser1 與 wwwuser2 ，我將這兩個用戶訂為 guest 身份，為使他的網頁資料傳輸方便，將他的 FTP 主機的家目錄設定為他的 WWW 家目錄，亦即為 /home/wwwuser1/public_html ，並且設定傳輸速度最大為 100 Kbytes/second。注意，我的 ftp 使用者預設的群組為自行建立的 myftpusers；
    8. 我有一個 FTP 交換連結用戶 ftpuser，我與他交換連結，連上下傳都需要注意！上下傳比例為 1.0 ，並且限制他傳輸的速度為 64 Kbytes/second ；
    9. 其他的匿名登入者的家目錄設定為 /var/ftp 這個目錄當中，並且限制 anonymous 一次連線最久 10 分鐘，而且最多僅能下載 20 個文件，以及 10MB 的資料量，此外，傳輸速度最快僅能到達 32 Kbytes/second。至於上傳的設定方面，僅允許上傳到 /var/ftp/upload 這個檔案，此外，預設檔案擁有者為 ftp 群組是 sys，上傳速度最快為 16 Kbytes/second；

    似乎很麻煩，那我們就來一個一個的設定吧！

    1. 先設定使用者的帳號：
      上面的案例中，我們共有 wwwuser1, wwwuser2, ftpuser 與 mysiteuser 這四個人，由於 mysiteuser 為實體用戶，所以不要去改他的登入 shell ，至於 wwwuser1, wwwuser2 與 ftpuser 由於他的群組需建立成為 myftpusers ，所以需要設定一下啦！假設 myftpusers 尚未建立，所以得先建立群組才能建立使用者！並且這兩個使用者單純的想要使用 FTP 而已，所以直接加上 shell 為 /sbin/nologin：
      [root @test root]# groupadd myftpusers
      [root @test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser1
      [root @test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser2
      [root @test root]# useradd -m -g myftpusers -s /sbin/nologin ftpuser
      [root @test root]# passwd wwwuser1 <==不要忘記給三個人密碼！

    2. 開始設定我們的 /etc/ftpaccess 內容：
      設定的項目我們將他分為(1)主機設定(2)實體用戶設定(3)訪客(4)匿名者等部分來設定囉：
      [root @test root]# vi /etc/ftpaccess
      # 底下的資料為 VBird 的 FTP 主機設定範例
      #
      ########################################################################
      # 1. 針對 Server 的設定項目：
      ########################################################################
      # 1.1 針對群組的設定項目
      class all real,guest,anonymous 140.116.0.0/16
      class allreal real 140.116.0.0/16
      class allguest guest !61.141.0.0/16 *
      class allanonymous anonymous !61.141.0.0/16 *

      # 1.2 其他主機相關的設定項目
      email vbird@tsai.adsldns.org
      hostname tsai.adsldns.org
      shutdown /etc/shutmsg
      loginfails 3
      log transfers anonymous,guest,real inbound,outbound
      passwd-check rfc822 warn

      # 1.3 訊息管理
      readme README* login
      readme README* cwd=*
      message /welcome.msg login
      message .message cwd=*

      # 1.4 指令管理
      compress yes all
      tar yes all
      chmod no guest,anonymous
      delete no anonymous
      overwrite no anonymous
      rename no anonymous

      # 1.5 人物登入管理
      deny-uid %-499 %65000-
      deny-gid %-499 %65000-
      allow-gid myftpusers

      # 1.6 時間相關的設定值
      timeout data 2400
      timeout idle 1800
      timeout maxidle 1800

      # 1.7 主機最大連線人數設定
      limit all 30 Any /etc/ftpmaxnumber

      # 1.8 被動的 port 設定
      passive ports 0.0.0.0/0 65501 65510

      ########################################################################
      # 2. 針對實體用戶的設定
      ########################################################################
      restricted-uid mysiteuser

      ########################################################################
      # 3. 針對 guest 用戶的設定
      ########################################################################
      limit allguest 10 Any /etc/ftpmaxnumber
      guestuser wwwuser1 wwwuser2 ftpuser

      # 3.1 www users
      guest-root /home/wwwuser1/public_html wwwuser1
      guest-root /home/wwwuser2/public_html wwwuser2
      throughput /home/wwwuser1/public_html * * 102400 - *
      throughput /home/wwwuser2/public_html * * 102400 - *

      # 3.2 FTP users
      guest-root /home/ftpuser ftpuser
      ul-dl-rate 1 allguest
      throughput /home/ftpuser * * 64000 - *

      ########################################################################
      # 4. 針對 anonymous 用戶的設定
      ########################################################################
      limit allanonymous 5 Any /etc/ftpmaxnumber
      anonymous-root /var/ftp
      limit-time anonymous 10
      file-limit out 20 allanonymous
      data-limit out 10000000 allanonymous
      throughput /var/ftp * * 32000 - *
      throughput /var/ftp /upload * 16000 - *
      upload /var/ftp/upload yes ftp sys 0666

    3. 建立可上傳目錄與使用者家目錄：
      由於我們設定了 /var/ftp/upload 為可上傳的目錄，所以需要動手設定一下囉：
      [root @test root]# mkdir /var/ftp/upload
      [root @test root]# chown ftp:sys /var/ftp/upload
      [root @test root]# mkdir /home/wwwuser1/public_html
      [root @test root]# mkdir /home/wwwuser2/public_html
      [root @tset root]# chown wwwuser1:myftpusers /home/wwwuser1/public_html
      [root @tset root]# chown wwwuser2:myftpusers /home/wwwuser2/public_html

    4. 修訂一下 /etc/shells：
      必須要確認 /sbin/nologin 在這個檔案內
      [root @test root]# vi /etc/shells
      /bin/bash
      ....(略)...
      /sbin/nologin

    5. 修改一下歡迎畫面檔案：
      你可以建立一下歡迎畫面喔！檔案有這些：
        /welcome.msg
        /home/wwwuser1/public_html/.message
        /home/wwwuser2/public_html/.message
        /var/ftp/welcome.msg
      如果想要一勞永逸，那麼將 /welcome.msg 這個檔案複製到 /etc/skel/welcome.msg 以及 /etc/skel/public_html/.message 則是一個不錯的主意！

    6. 重新啟動 xinetd 囉！

    大致的流程就是這樣啦！ ^_^
Client 端的使用 FTP 軟體：
事實上，我們在網路常用指令那個章節當中已經介紹過了 ftp 與 ncftp 這兩個很好用的 client 端軟體了，在這裡我們再次的強調一下這兩個軟體，其中，比較重要的是強調傳輸的模式。在 Server 與 Client 傳輸的過程中，資料的流動主要分為 binary 與 ascii 兩種模式，需要注意的是：
  • Binary 的傳送方式當中，FTP Server 並不會去改變檔案的內容，所以資料得以完整的呈現；
  • 但在 ASCII 傳輸模式當中，主要將資料視為一般的純文字檔，例如：原始碼或者是設定檔等等，在這種傳輸模式當中，Server 會將檔案以一行一行來傳送，所以如果您以 ASCII 傳送經過編譯過的 binary program 時，將可能導致無法執行的問題(因為被轉成文字檔啦！)
底下我們就來介紹兩個軟體吧！

  • ftp
    遠端傳送資料當中，速度最快的協定之一
    語法：
    [root @test /root]# ftp [-p] host [port]
    參數說明：
    -p ：啟動 PASSIVE 模式！
    範例：
    [root @test /root]# ftp localhost 　　　　<==預設是以 port 21 來進行連線
    [root @test /root]# ftp localhost 1354
    如果你設定的 ftp 的 port 非正規的 21 ，則可以這樣！

    [root @test /root]# ftp localhost　　<==連接到遠端主機
    Connected to localhost (127.0.0.1).
    220 localhost FTP server (Version wu-2.6.1-20) ready.
    Name (127.0.0.1:test): test
    331 Password required for test.
    Password: <==輸入密碼
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> dir 　　　　　　　　　<==顯示遠方主機的內容
    ftp> cd 　　　　　　　　　 <==變換遠端主機的目錄
    ftp> close or bye or exit　<==離開遠端主機
    ftp> get file　　　　　　　<==取得遠端主機的檔案
    ftp> mget file　　　　　　 <==取得所有的檔案，例如 mget .bash* ！
    ftp> put file　　　　　　　<==將本地端檔案 file 丟到遠端主機上
    ftp> mput file　　　　　　 <==與 mget 差不多意思啦！
    ftp> delete file　 　　　　<==殺掉遠端主機的 file 檔案
    ftp> help　　　　　　　　　<==顯示求救指令！
    ftp> mkdir dir　　　　　　 <==在遠端主機上面建立目錄
    ftp> lcd　　　　　　　　　 <==變換本地端路徑！
    ftp> ascii or binary　　　 <==重要的很！上面提過的！

  • ncftp
    登入匿名主機最好用的文字介面 FTP 軟體！
    語法：
    [root @test /root]# ncftp [host]
    [root @test /root]# ncftp [ftp://domain.name/path]
    參數說明：
    可以直接連接到 host 主機，也可以直接連接到主機的某個路徑之下，相當的方便
    範例：
    [root @test /root]# ncftp ftp.nsysu.edu.tw　　 <==連接到中山大學 FTP 站
    [root @test /root]# ncftp ftp://ftp.nsysu.edu.tw/Linux
    直接連接到 Linux 底下的 Linux 目錄下！

    遠端主機的一些服務指令：
    ncftp /pub/Linux > cd Redhat　　　　　　<==變換目錄
    ncftp /pub/Linux > dir　　　　　　　　　<==顯示目前目錄下的檔案與目錄資訊
    ncftp /pub/Linux > get file1 　　　　　 <==將 file1 的資料存到本地端
    ncftp /pub/Linux > get -z file1 file2　 <==將 file1 存到本地改檔名為 fill2
    ncftp /pub/Linux > get -A file1 file2
    將 file1 以累積的方式(append)增加到 file2 這個檔案
    ncftp /pub/Linux > pub file　　　　　　 <==將檔案由本地端上傳至遠端！
    ncftp /pub/Linux > rename file1 file2　 <==將遠端的主機之 file1 更名為 file2
    ncftp /pub/Linux > rm file　　　　　　　<==刪除檔案
    ncftp /pub/Linux > rmdir directory　　　<==刪除目錄
    ncftp /pub/Linux > mget directory　　<==可以下載『整個目錄』的資料！很棒吧！

    本地端主機的一些指令功能：
    ncftp /pub/Linux > lcd 　　　　 <==變更本地端目前所在的目錄
    ncftp /pub/Linux > lls 　　　　 <==顯示目前本地端所在目錄的檔案與目錄資訊
    ncftp /pub/Linux > lmkdir 　　　<==在本地端建立目錄
    ncftp /pub/Linux > lpwd　　　　 <==顯示目前本地端主機的所在目錄
    ncftp /pub/Linux > lrm　　　　　<==刪除本地端的檔案
    ncftp /pub/Linux > lrmdir　　　 <==刪除本地端的『目錄』

    • Server 端的安全設定項目：
      事實上，由近年來公佈的安全漏洞資訊來看，這個 Wu FTP 所造成的漏洞真的是不少，所以，在架設 Wu FTP 時，一定要注意到安全性的設定項目上面，這個真的很重要！因為由網路上朋友回報的資訊來看，目前最大宗的 Linux distribution (7.x 版本) 連上 Internet 之後，被入侵的最熱門 port 就是 Wu FTP 囉！所以，我們才會一再地強調『非必要，不要架設 FTP 』。一般來說，我們會這樣建議大家：

      1. 除非真的必要，否則盡量將 FTP 的 port 21 關掉；
      2. 如果真的要架設 Wu FTP ，請『一定要』將 Wu FTP 更新到最新的版本；
      3. 更新完畢之後，在架設之前，一定要考慮清楚，是否要開放 anonymous 的連線？除非必要，否則僅開放 Real 以及 guest 使用者登入即可；
      4. 設定時，最好在 /etc/ftpaccess 就限制連線者的位址，以杜絕可能的入侵者的嘗試；
      5. 盡量將使用者限制在他們自己的家目錄內；
      6. 將不想讓他連線的帳號以 PAM 模組來抵擋，亦即將使用者帳號寫入 /etc/ftpusers 裡面即可；
      7. 可以的話，以 iptables 以及 TCP_Wrappers 架設兩層防火牆，限制住開放的網域即可。

      由設定、PAM 模組、TCP_Wrappers、iptables 共有四層防火牆，這樣會比較安全一些，不能說就『高枕無憂』啦，但是會比較放心一些！我們約略的提一下防火牆的相關設定吧！

    • iptalbes

      最外層的防火牆可以說就是這樣 iptables 了，在設定之前，我們就必需要瞭解的是，我的 port 是幾號？一般來說， port 至少有 21 以及 20 兩個，但是不要忘記了，還有 passive ports 喔！這裡我們假設 FTP 僅允許來自 140.116.0.0/16 這個 B Class ，而 passive ports (假設我們沒有使用 related 那個防火牆設定項目)開放 65501 至 65505 共五個，那麼我就應該在我的防火牆規則加入這幾段：

      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 20:21 \
          -j ACCEPT
      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 65501:65505\
          -j ACCEPT

      這樣就限制了 FTP 僅可以使用的 ports ，其他更多的防火牆規劃，請參考『簡易防火牆』那個章節吧！

    • TCP_Wrappers

      TCP_Wrappers 的設定我們在『簡易防火牆』那一章節已經提過了，這裡僅針對 FTP 提出設定項目：

      [root @test /root]# vi /etc/hosts.allow
      in.ftpd : 140.116.0.0/255.255.0.0

      [root @test /root]# vi /etc/hosts.deny
      in.ftpd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
      /bin/echo; /usr/sbin/safe_finger @%h ) | \
      /bin/mail -s "%d -%h security" root@localhost & \
      : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

      這樣一個小型的防火牆就建置起來啦！而且，只要有人 scan 你主機的 ftp port ，就會立刻被記錄下來喔！

    • pam 模組與 /etc/ftpusers 的關係

      要登入 FTP 之前需要輸入密碼對吧！輸入密碼就可以利用 PAM 模組來進行過濾囉！目前我們使用的 PAM 模組是放置在 /etc/pam.d 這個目錄中，而 ftp 則是 /etc/pam.d/ftp 這個檔案，在前頭我們也約略提過這個檔案啦，主要就是將要被抵擋的使用者帳號寫入到 /etc/ftpusers ，那麼該帳號想要登入 FTP 時，就會被 PAM 模組的過濾系統擋掉！相當簡易吧！而且還很有效呢！ ^_^

    • FTP 本身提供的抵擋 username 或 host 的控制項目

      除此之外， FTP 的設定檔裡面 /etc/ftpaccess 也有 deny 與 deny-uid 等等的抵擋機制，您也可以使用 /etc/ftphosts 來抵擋，關於這些檔案的設定在本章前面都提過了，請翻閱參考囉！ ^_^
    重點回顧
    • FTP 是 File Transfer Protocol 的簡寫，主要的功能是進行 Server 與 Client 端的檔案管理、傳輸等事項；
    • Wu FTP 是很常見的一個 FTP 軟體，不過由於安全性，建議務必升級到最新版本，此外，他的主要設定檔是 /etc/ftpaccess 這一個；
    • 除了 Wu FTP 這個 FTP 軟體之外，其實可以使用 SSH 提供的 sftp 功能來取代 FTP；
    • FTP 這個 daemon 比較常以 super daemon 來管理，亦即 xinetd 或者是 inet 這兩個 super daemon ；
    • FTP 這個 daemon 所開啟的正規的 port 為 20 與 21 ，其中， 21 為指令通道， 20 為資料傳輸通道；
    • FTP 的傳輸路線主要分為主動與被動(Passive, PASV)，如果是主動的話，則 ftp-data 以 20 傳送，否則則以 /etc/ftpaccess 規定的 passive ports 或者隨機選取大於 1024 的 port 來進行被動式連線模式；
    • 一般來說， FTP 上面共有三個群組，分別是實體用戶、訪客與匿名登入者(real, guest, anonymous)；
    • 可以藉由修改 /etc/passwd 裡面的 Shell 欄位，來讓使用者僅能使用 FTP 而無法登入主機；
    • 可以使用 guestuser 及 guest-root 來限制實體用戶，使成為訪客用戶；
    • 需要以 upload 來設定可以讓 anonymous 上傳的目錄，並設定好其權限喔！
    • FTP 的指令、與使用者活動所造成的登錄檔是放置在 /var/log/xferlog 裡面；
    • 在 Client 端使用 ftp 這個程式時，可以加上『 ftp -p hostname』來讓連線變成 passive 模式。
    參考資源
    • man ftpaccess
    • Study Area ：http://www.study-area.org
    • Wu FTP 官方網站：http://www.wu-ftpd.org
    本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
    • FTP 在建立連線以及資料傳輸時，會建立哪些連線？
      答：
        需建立兩種連線，分別是 command 與 data transfer 的連線，就是命令通道與資料傳輸通道。一般來說，就是 port 21(ftp) 與 port 20(ftp-data)。

    • FTP 主動式與被動式連線有何不同？
      答：
        主動式連線的時候， command 連線是由 client 端主動連接到主機端，但是 ftp-data 則是由主機端主動的連線到 client 端。至於被動式連線的時候，則不論 command 還是 ftp-data 的連線，主機端都是 Listen 客戶端的要求的！

    • 有哪些動作可以讓您的 FTP 主機更為安全 ( secure ) ？
      答：
        有很多的方法，在設定上面有這些方法：
        • 讓 guest 與 anonymous 的家目錄限制在固定的目錄中(chroot 或是 restricted)；
        • 使用 TCP_Wrappers 啟動 FTP ，並以他來控制可連線的 IP；
        • 拒絕 guest 與 anonymous 使用 change, delete, rename 等等指令；
        • 拒絕 root 的登入或者其他系統帳號的登入；
        • 拒絕大部分的 upload 行為！

    • 我們知道 ftp 會啟用兩個 ports ，請問這兩個 port 在哪裡規範的？而且，一般正規的 port 是幾號？
      答：
        是在 /etc/services 裡面規範的，此外，正規的 ports 在 command 是 21 而 data 是 20 。

    • Wu FTP 的主要設定檔在哪裡？
      答：
        /etc/ftpaccess

    • 在 Wu FTP 的設定檔當中，那個 log transfer 是幹嘛用的？
      答：
        log transfer 可以將使用者進行資料傳輸的時候，將傳輸的檔案大小、內容等等記錄到 /var/log/xferlog 裡面去！

    • 在 Wu FTP 的設定檔當中，那個 passive ports 是幹嘛用的？
      答：
        我們知道 FTP 有主動與被動連線兩種方式，如果 FTP 主機允許被動連線，那麼 Client 端連線時，主機端將會隨機取大於 1024 的 port 來進行 data transfer ，為了避免隨機取 port 的問題，所以 passive ports 可以指定固定的幾個小範圍的 ports ，比較安全。

    • 那一個檔案可以用來抵擋類似 root 這種系統帳號的登入 FTP？
      答：
        /etc/ftpusers！

    • 在 FTP 的 server 與 client 端進行資料傳輸時，有哪兩種模式？為何這兩種模式影響資料的傳輸很重要？
      答：
        資料的傳輸有 ASCII 與 Binary 兩種方式，在進行 ascii 傳送方式時，被傳送的檔案將會以文字模式來進行傳送的行為，因此，檔案的屬性會被修改過，可能造成執行檔最後卻無法執行等的問題！一般來說，ASCII 通常僅用在文字檔案與一些原始碼檔案的傳送。
    簡易 FTP Server 架設 -- Wu FTP 設定
    2003/03/26：第一次完成
    2003/03/26以來統計人數


簡易 Proxy Server 架設
最近更新日期：2003/04/11

代理伺服器的功能可多的呢！在中大型的企業當中，可以藉由單點對外的 Proxy 主機來達到『節省頻寬』的目的，同時，也可以透過這樣的 Proxy 架構來達成『高階防火牆』的設定，這裡的『高階』指的是 OSI 七層協定裡面比較高階段的層級，那就是應用與表現層方面的防火牆啦！那如果對於小型的企業呢？這個 Proxy 也可以達到分流的作用，讓不同的目標網站可以透過不同的上層 Proxy 來取得資料！啊！真是很不錯的一個伺服器啊！不過，這個 Proxy 伺服器也是幾個常見的伺服器裡面，硬體要求相對比較高的一個咚咚！因為 Proxy 要求的是『快速』，所以呢，呵呵！當然硬體等級的要求是相當的『像一回事』的！^_^

原理：
    ：什麼是代理伺服器
    ：代理伺服器的運作方式
    ：代理伺服器的用途與優缺點
    ：什麼是上層代理伺服器？哪裡有上層代理伺服器
    ：我是否一定要設定 Proxy ？
    ：所需要的硬體要求與最佳硬體配置方式
    ：代理伺服器與 NAT 主機的差異
套件安裝：
    ：使用 RPM 方式安裝 squid
    ：使用 Tarball 方式安裝 squid
Server 端設定：
    ：squid 的結構
    ：squid 的 process owner 與 cache directory owner
    ：最簡易的 squid 設定方法
    ：記憶體與磁碟快取留存百分比設定
    ：acl 的用法與用途
    ：上層 Proxy 的選擇與負載分流的設定方法
    ：與時間相關的設定值 ( connect_timeout, request_timeout )
    ：總是系統自己來捉資料(always_direct)
    ：限制使用 proxy 使用者與 proxy 目標的方式 (acl and http_access )
    ：額外的功能參數
Client 端設定：
    ：Netscape
    ：Internet Explorer
Server 端進階設定：
    ：末端資料分析 pwebstat
    ：末端資料分析 sarg
    ：防火牆的規劃
    ：NAT 與 Proxy 透過 transparent proxy 設定加快網路傳輸
    ：squid 的注意事項
重點回顧
參考資源
本章習題練習
原理：
    代理伺服器的原理其實很簡單啦！就是以類似代理人的角度去取得使用者所需要的資料就是了！但是由於他的功用，使得我們可以透過代理伺服器來額外的達成防火牆的功能！此外，也可以藉由代理伺服器 ( Proxy ) 來達成節省頻寬的目的，以及加快內部網路的 WWW 存取速度！總之， Proxy 對於大型的企業來說，實在是一個很不錯的東西啊！

  • 什麼是代理伺服器

    在真實世界中，我們或許會幫忙家人去辦理一些雜務吧！舉個例子來說，例如繳費或者是申辦提款卡等等的，那麼由於你並不是『申請者本人』而是『代理人』的角色，因此有時候會需要秀出一些證件就是了。那麼在網路上面的代理伺服器是怎麼回事呢？他就是 Proxy Server 囉！他最主要的功能就如同我們上面提的真實世界一樣， Proxy 會幫 Client 端的用戶去向目的地取得用戶端所需要的資料。所以，當 Client 端指定代理伺服器之後，您的所有相關要求( 例如 WWW 的要求 )就會通過代理伺服器去捉取囉！整個代理伺服器與用戶端的相關性可以由下圖約略看出一個端倪：

    在內部的電腦都是透過 Proxy 來向 Internet 求取資料的，這就是所謂的『代理伺服器』啦！當然，上面的架構僅只是一個案例，還有相當多的非 Intranet 的 Proxy 架構，亦即是你的 PC 與 Proxy 均在 Internet 上面，但是您一樣可以透過這個 Proxy 來幫您達到代理人身份的目的呢！

    在 Proxy 與 Client 的相關性當中，您必需要瞭解的是：您向外部要求的資料事實上都是 Proxy 幫你取得的！怎麼說呢？舉個例子來說，假如我在我的瀏覽器 ( 假設是 Netscape 好了 )設定了我們學校的代理伺服器主機 proxy.ncku.edu.tw 做為我的 Proxy 好了，再假設我的 IP 是 140.116.44.125 ，那麼當我想要取得奇摩網站的新聞資訊時，事實上，都是 proxy.ncku.edu.tw 幫我去取得的，所以在奇摩的網站上面看到向他要求資料的人是誰呢？呵呵！當然就是 proxy.ncku.edu.tw 而不是我 140.116.44.125 囉！這樣可以瞭解 Proxy 的功能了嗎？

    除了這點功能之外， Proxy 還有一個很棒的額外功能喔，那就是防火牆的功能！怎麼說呢？看一下上面的圖示，您可以發現一件事情，那就是 Client 端的個人電腦要連上 Internet 一定要經過 Proxy 伺服器，並且，如果有人想要入侵你的系統時，由於你的 proxy 在最外部啊，所以攻擊者就會攻擊錯方向，如此一來，不就比較安全！此外，由於整個 Intranet 對外都是經過 proxy ，也就是『單點對外』的情況，這種狀態底下要來管理防火牆也是比較簡單的喔！^_^

  • 代理伺服器的運作方式

    瞭解的 Proxy 的功能之後，我們來談一談那麼 Proxy 到底是怎樣運作的呢？為何他會有『加快網路存取效率』的情況？這就必需要以底下的圖示來說明了！

    當 Client 端設定了代理伺服器之後，在 Client 端想要取得 Internet 上面的資訊時，他是這樣取得資料的 (註：那個 Cache 表示為 Proxy 主機的硬碟的意思 )：

    一、Proxy 有使用者預計要求的資料時( Step 1, 2, 3,4 )：
    1. Client 端向 Server 端發送一個資料需求封包；
    2. Server 端接收之後，先比對這個封包的『來源』與預計要前往的『目標』網站是否為可接受？如果來源與目標都是合法的，或者說，來源與目標網站我們的 Proxy 都能幫忙取得資料時，那麼 Server 端會預計開始替 Client 取得資料。這個步驟中比較重要的就是『比對政策』啦，有點像是認證的感覺啦；
    3. Server 首先會到自己的硬碟裡面，也就是所謂的 cache (快取) 查看一下有沒有 Client 端所需要的資料，如果有的話，那就將資料直接送到 Client 端 (步驟4) 而不經過向 Internet 要求資料的程序；

    二、Proxy 沒有使用者預計要求的資料時 ( Step 1, 2, 3, 5, 6, 2, 3, 7 )：
    1. 在經過 1, 2, 3 查尋知道 cache 沒有資料，或者資料過期之後， Proxy 會向 Internet 上面的目標網站要求資料；
    2. 在將資料取回之後， proxy 會先將取得的資料『儲存一份到 cache 當中』；
    3. 最後才將資料傳回給 Client 端使用。

    整個 Proxy 的工作流程就是這個樣子，所以，我們就可以知道的是， Proxy 對於 cache 是很要求的，而這個 cache 就是硬碟啦！當然，硬碟容量必需要足夠大，而且還要『足夠快』才行！因為由上面的流程當中，我們不難發現， Cache 是一直被重複存取的一個地方喔！所以硬碟的好壞就差別很大啦！可以說他是影響一個 Proxy 效能好壞的關鍵點呢！

  • 代理伺服器的用途與優缺點

    一般來說，代理伺服器的用途主要有兩個：

    • WWW 網頁代理人：最主要的用途當然就是做為網頁資料取得代理人囉，也就是說， Proxy 可以幫我們取得 Internet 上面的 WWW 資料就是了！那麼能不能取得其他非 WWW 的資料呢？那就不一定了，要看 Proxy 主機是否有設定該服務。一般來說， Proxy 主要還是針對 WWW 網頁的代理取得；

    • 做為 Intranet 的單點對外防火牆系統：就如同前面的圖示， Proxy 如果架設在 Intranet 對外的連接點上面，那麼他就可以被用來做為『應用層』階段的防火牆了！而且，這個時候不需要設定 NAT 就可以讓 Intranet 內部的私有 IP 的電腦連接上 Internet 了！這是因為您想要的資料是向 proxy 要求，所以真正去取得資料的人是『Proxy』而不是你的電腦啊！所以，只要 Proxy 可以接受私有 IP 的電腦要求，那這些私有 IP 的電腦就可以連上 WWW 啦！不過，也由於 Proxy 為一個 應用層 階段的防火牆系統，所以，他並無法進行較低階的封包過濾！因此，在內部電腦想要透過 Proxy 來取得郵件、或者是其他的服務，呵呵！那就比較麻煩，簡直就是麻煩的多啦！

    由於 Proxy 的這種特性，讓他很常被使用於大型的企業內部，因為可以達到杜絕內部人員上班時使用非 WWW 以外的網路服務，而且還可以監測使用者的資料要求流向與流量呢！很不錯吧！ ^_^好了，接下來我們來談一談 Proxy 主要的優缺點吧：

    • 快速的存取動作：一般來說， Proxy 主機的頻寬以及硬體配備會比較高檔！所以 Proxy 最大的優點就是可以提供用戶端較為快速的瀏覽！咦！但是我們向 Proxy 要求資料的時候， Proxy 不是會自行再儲存一份嗎？這樣不是會多花很多時間？是這樣沒有錯，但是，換一個角度來想，如果在第一位使用者要求過 A 資料後，由於 Proxy 就會自動放一放 A 資料在 Cache 當中，之後的所有使用者只要是重複要求這個 A 資料， Proxy 可以立刻將資料傳給使用者，您瞧！這樣這個 Client 等於是直接向 Proxy 取得這份 A 資料了！是否更加的快速！這是因為 Proxy 就在您的 Intranet 之內，傳輸速度可是相當快的！這也就是說：如果您要設定代理伺服器的時候，一定要找距離我們的機器最近的那一部，否則就沒有達到代理伺服器的功用了！通常快速的存取動作最明顯的大概是連去國外的網站了！這裡要強烈的建議，如果你需要連上國外的網頁，請一定使用代理伺服器，因為不但可以節省頻寬，並且速度上會快上很多很多 ( 例如美國 EPA 網站！ )

    • 降低網路的負荷：由於我們是項代理伺服器要求資料，如果代理伺服器內剛好有你要的資料，將會直接傳給你，則你的要求將不會到真實的那一個網頁去 ( 除非你在 IE 內按下『重新整理』這個按鈕 ) ，而如果沒有你要求的資料，那他也會去捉一份你要的資料給你，並存下來，以後如果有與你相同需要的用戶，那他就可以直接傳送給用戶，如此當可降低網路的負荷！

    • 資料分流：由於各家 ISP 對於不同國家的頻寬是有差異的，因此，假設如果您要去美國時使用 Proxy1 速度較快，而 Proxy2 則是去日本比較快，至於台灣本地則 Proxy3 較快，如此一來，我們可以透過設定將不同目標的代理伺服器分開來，以達到分流的目的！則你的網域終將可以達到很好的分流效果，網路會比較快速喔！

    • 提供防火牆內部的電腦連上 Internet：這個是一般企業比較常用的情況！由於企業內部害怕被駭客侵入，通常會設立一些比較嚴密的防火牆，然而如此一來公司內部的電腦可能面臨無法連上 Internet 的窘境，那使用 proxy 讓你的內部電腦可以透過這一架主機的代理服務而取得 Internet 上的資訊，就是一個很好的方法啦！

    • 多層次的管道 ( 上層代理伺服器 )：代理伺服器可以提供多重的管道設定，例如，當你需要國內的資料時，代理伺服器將直接去捉取，而需要國外的資料時，才連到上一層的代理伺服器！如此將可達到你的需求 ( 而不用常常在你的 IE 等瀏覽器上更改所需的代理伺服器 ) ，這個部分我們在底下還會進行額外的說明。

    有利就有弊，當然 Proxy 也不是萬能的天神∼他有什麼可能潛藏的缺點呢？

    • 容易為 Intranet 的內部人員濫用：因為 Proxy 是對內部的電腦捉取資料 ( 當然也可以對 Internet 上面的使用者捉取資料啦！ ) ，而且在 Internet 上面看到的實際上是你的 Proxy 在捉資料喔！如果你的使用者大量的以瀏覽器下載 A 圖啊，還是透過你的 Proxy 幹壞事啦，這樣一來可就累了∼因為實在不容易輕易的管理！所以，為了杜絕這個狀況，強烈的建議多加安裝登錄檔案分析的軟體，在管理上面會輕鬆很多喔！

    • 需要較高超的設定技巧與除錯程序：在我設定過的 Server 當中， Proxy 算是比較不容易設定好『效能』的一個伺服器了！由上面的傳輸過程中，您不難發現 Proxy 的 Cache 與他的『上層代理伺服器』的關係是很緊密的，萬一設定錯誤的話，很有可能反而讓您的 Proxy 拖垮 WWW 的瀏覽速度！最嚴重的是造成無法連線 ( 在上層 Proxy 與您的 Proxy 之間構成 loop 而跑不出去！ )，因此，這對於管理員來說是比較困擾的一件事。

    • 可能會取得舊的錯誤資料：由前面的 Proxy 運作過程當中不難發現，Client 端向 Server 端求取資料時，Server 會先向自己的 cache 查尋，如果有該索求資料，就立即將資料送給 Client 。現在假設個例子來說明，萬一我的網頁三天兩頭改變一次，那麼那個 cache 事實上並沒有天天更新啊！這個時候， Client 端所取得的資料就有可能是網頁修改之前的舊資料咯！所以，使用者得常常按下『更新』才能取得新的資料啊！

    總之， Proxy 的優點是很多的，但是缺點卻需要網管人員的操心啊！

  • 什麼是上層代理伺服器？哪裡有上層代理伺服器

    什麼是上層代理伺服器：
    好了，上面提到過所謂的『上層代理伺服器』這又是什麼咚咚？事實上，上層代理伺服器就是一個 Proxy 啦，只是，我們自己設定的這個區域 Proxy 會將自己當作 Client 而去要求另外一個 Proxy 求取資料來給我們的使用者就是了！整個流程圖可以這樣看：

    就是我們的 Local proxy 並不會主動的去捉資料，而是透過『上層代理伺服器』去向 Internet 要求資料！這樣有什麼好處呢？剛剛上面也曾經提過了，由於這些上層代理伺服器才是真正對外頻寬最大的幾部機器之一，所以透過他來要求資料一定又比我們的 Local proxy 還要來的快啊！所以我當然會喜歡設定上層 Proxy 嚕！這個現象最常發生在對國外的連線上面，有沒有設定 Proxy 差異是相當大的呢！上層代理伺服器除了頻寬更大之外，還有沒有什麼好處啊？當然有，最大的好處就是達到分流的效應！例如下圖的說明：

    我總共設定了三個上層代理伺服器，由於這三個代理伺服器對外的速度都不相同，所以，當我要去美國時，就以 Proxy1 來要求資料，要連歐洲就以 Proxy2 ，至於要連台灣，就以 Proxy 3 來要求我所需要的資料，如此一來，呵呵！可以讓我的 Proxy 達到最佳的效能喔！很不錯吧！ ^_^！所以上層代理伺服器是很重要的呢！

    哪裡有上層代理伺服器？
    目前有哪些流量大、然後又開放出來的 Proxy 呢？我這裡舉幾個網頁給大家參考參考：

    • SeedNet 的代理伺服器(http://service.seed.net.tw/dial/server.shtml)；
    • Hinet 的代理伺服器(http://www.hinet.net/support/new_adsl04.htm)；
    • 一些台灣學術網路的代理伺服器(http://turtle.ee.ncku.edu.tw/~tung/proxy/proxylst.html)。

    由前面的介紹中，我們不難發現 Proxy 有可能會被 Client 端過度的濫用，同時也有可能會被拿來為非作歹啊！所以，目前絕大部分的 Proxy 已經『停止對外開放』了，僅針對自己的網域內的 Client 提供 Proxy 的服務而已∼因此，如果您要自行設定 Proxy 的時候，請記得去您當初申請網路的 ISP ( 如果是學術單位，就到上面介紹的學術網路查看看即可！) 查尋一下，才能比較有效的設定好您的主機喔！因為設定錯誤的話，呵呵！上層 Proxy 根本不提供服務，或者是上層 Proxy 的效能並不好，那個時候您的 Proxy 也會連帶的受到很大的影響啊！慎選！慎選！

  • 我是否一定要設定 Proxy ？

    話又說回來，到底我應不應該設定 Proxy 呢？還是得由理論與實際上的狀態來進行說明。事實上，我們的 Proxy 感覺上會加快傳輸的速度，主要的因素是來自於 cache 已經記錄了一份資料了，所以 Client 端取得的其實是這一份資料，而不是真的來自於 Internet 上面的即時資料！這樣的好處前面提過了，就是可以增加內部網路傳輸的效能啊！但是，這要在一個前提之下，就是我的使用者很多時，那麼由於來自四面八方的人會四處去求取資料，讓我的 Cache 擁有較大的資料庫，那麼內部傳輸的速度自然就會有所助益！所以，要架設 Proxy 的情況可以是：

    • 我的 Client 端用戶不少，而且大部分僅需要 WWW 這個網路服務而已；
    • 我的 Proxy 還兼做防火牆的任務；
    • 我的 Client 端常常需要連線到傳輸速度很慢的網站，例如國外的網站；
    • 我的 Client 端常常瀏覽的網站是『靜態』網站，而不是動態網站(例如討論區的 PHP )。

    相反的來說，要是 (1)我的 Client 端很少，那麼每次上去 WWW 都是求取新的資料，有沒有 Proxy 反而看不出效益∼此外，(2)Proxy 由於屬於應用層了，對於 Internet 的規劃上彈性較不足！不像 NAT 主機可以進行很多的功能！(3)我常常上的網站是類似討論區那種一日多變的網站，在這樣的情況下，實在是沒有必要架設 Proxy 的！

    但是，如果對於學校單位那原本頻寬就不足的環境中，架設 Proxy 來讓校內的網路速度提昇，呵呵！就是有那個必要性的啦！所以要不要架設 Proxy 呢？請好好的依據您的環境來考量喔！

  • 所需要的硬體要求與最佳硬體配置方式

    假設您一定需要架設 Proxy ，那麼到底什麼樣的配備是必需的呢？我們剛剛提到 Proxy 對於硬體的要求相當的高！因為我們架設 Proxy 的目的就是希望能夠加快網路的傳輸效能嘛！因此，雖然 Proxy Server 幾乎在任何的 Linux 系統上面都能跑 ( 例如我的 P 133 MMX ) ，但是您的 Proxy Server 最好還是能有以下的硬體等級：

    • CPU 最好能夠 P III 550 以上等級；
    • RAM 最好能夠大於 512 MB ，這也是很重要的一個硬體參數！
    • Hard Disk 最好能用 SCSI 介面的，因為速度與穩定度都比較好！如果不能的話，那麼 IDE 介面的硬碟由於目前速度也越來越快，所以使用 IDE 也沒有問題，但是最好是『多顆硬碟』的架構，例如我總共需要 30 GB 的硬碟空間，那麼最好是 10 GB 的硬碟三顆這樣的架構較佳！為什麼呢？由於 cache 對於 Proxy 的重要性相當的大，所以 cache 讀取速度越快的話，代表 Proxy 的效能也會越好！那由於 Proxy 對每筆資料寫入 cache 時，是『平均分攤在各個 cache 的目錄中 』，所以當然硬碟數越多越好囉！例如我原本有 10 MB 的資料要寫入 cache ，那麼這 10MB 寫入同一顆硬碟快？還是 10MB 被分散寫入三顆硬碟，因此每一顆硬碟僅記錄 3.3MB ，那一個快？當然是三顆硬碟的架構會比較快，因為我有三個磁頭在幫我寫入資料嘛！^_^！請注意喔！這裡我們說的是『多顆硬碟』而不是『多個 Partition 』喔！因為如果我將 30GB 的硬碟切割成三塊 partition 的狀態下，由於還是只有一個磁頭啊，所以寫入的速度差異不會很大！這裡要特別留意與瞭解呢！
    • 網路卡與網路周邊最好使用 GBytes 的網路卡，當然啦，一般的公司行號應該不需要用到這樣的網路卡才是！我這裡指的是較高檔的配備啦！

    事實上，最重要的還是 RAM 與 HD 這兩樣，當然，網路介面也絕對不能忽視就是了！針對硬碟來說，最好使用 SCSI 這個穩定的介面，當然，使用 IDE 也是不錯啦！但是要注意保養就是了。此外，就如同上面提到的，在硬碟的架構上是相當的重要的！一般來說，使用磁碟陣列應該是不錯的想法，如果沒有辦法的話，使用多顆硬碟取代單顆硬碟的架構，在效能上也會有不錯的顯著提昇呢！

    既然硬碟這麼重要，我們也約略談一談硬碟的基礎規劃應該有哪些需要注意的呢？

    • 最好在架設 Proxy 時，將整體主機的規劃做好，並且讓 Proxy 主機的服務簡單一點，就是僅負責 Proxy 就好了！
    • 每顆硬碟的容量不需要太大，大約在 9 GB 以內即可，此外，最好將硬碟分割一下，一塊 Partition 差不多在 2~4 GB 之間即可，因為切太大的話資料的搜尋耗費時間較長，但是 Partition 太小又可能造成空間的浪費∼所以差不多的大小就限制在 2~4 GB 吧！
    • 我們剛剛上面有提過，cache 是放置在某個目錄下的，而最好一個目錄底下就是獨立的一個 partition 。此外，由於 cache 所在的硬碟常常會有資料的存取，因此可能此一硬碟的損耗率會比較大，所以這個 cache 所在的硬碟最好不要跟重要資料檔案，例如 /, /etc, /usr, /home 等等重要的系統檔案放在一起，以免危險啊！
    • 也由於 cache 所在的硬碟資料存取太密集了，所以，硬碟的選擇上面需要 (1)轉速不能太低； (2)磁頭的機械臂需要可以忍受頻繁的動作； (3)發熱量不可太大，或者可以考慮加裝硬碟用風扇。

  • 代理伺服器與 NAT 主機的差異

    或許您已經發現了一件事，那就是：在內部區域網路使用私有 IP 的 Client 端不論透過 Proxy 或者 NAT 均可以直接取得 WWW 這個 Internet 的服務，那麼 NAT 與 Proxy 有沒有什麼不同的地方啊？他們不都是可以讓內部的 Client 連接出去嗎？其實這兩個玩意兒差異性是『相當大』的：

    • NAT 是一個利用 TCP/IP 的 packet filter ( 封包過濾機制 )來進行封包處理的一個機制，所以他是『直接分析 TCP/IP 』，所以在設定防火牆的時候，他的彈性比較高，只要能過 NAT 這一關，那麼大部分的網路服務都可以使用，因為 TCP/IP 是比較底層的協定啊！要知道的是，TCP/IP 上頭還有 port 、還有 IP 等等的資訊，單是 port 就可以讓我們使用很多的不同的協定了！例如 port 20, 21 是 FTP 啊， 80 是 WWW 啊等等的！所以 NAT 能做的事情事很多的！

    • 至於 Proxy 就不一樣了， Proxy 主要透過類似 Squid 這一類的軟體來達成的一個服務，基本上，一般來說他是透過 port 3128 來進行資料的監聽與傳輸，單是看到這個 port 3128 就應該要曉得他僅是一個 daemon 而已。Proxy 已經是應用層這個階段的網路項目了，所以他並沒有去分析 TCP 的封包，只要 Client 來源合乎他的需求 (例如 IP 是被支援的 ) ，那麼他將透過 daemon 的功能幫使用者達成使用者所想要的任務！所以說，能不能做某些事情，與 Proxy 伺服器上面負責的那個 daemon 是有關的！萬一 daemon 無法進行 FTP 資料的取得，那麼您再怎麼努力的嘗試上網也是枉然的啊！

    這樣說有沒有比較有點概念了呢？NAT 是由較底層的網路去進行分析的工作，至於通過 NAT 的封包是幹嘛用的， NAT 不去管他！至於 proxy 則主要是由一個 daemon 的功能達成的，所以必需要符合該 daemon 的需求，才能達到某些功能！

    談完了這些基本的原理之後，我們可得來玩一玩 Proxy 了吧？！事實上，目前有很多的 Proxy 軟體，例如 apache 也有提供 proxy 模組的功能喔！但是，最好不要用 Apache 當作您的 Proxy server ，因為.....效能真的太差了∼會讓您的網路停頓的更厲害∼目前 Proxy 的伺服器軟體當中，以 squid 這個咚咚最出名，會出名的原因是因為他的效能高！真的很不錯的一套軟體，所以底下我們就針對 squid 來做說明吧！
套件安裝
    我們的 Proxy 伺服器軟體選擇 squid 這個效能很高的套件來安裝，目前 ( 2003/03 ) Squid 已經出到了 2.5 版了，您可以到官方網站上面下載，或者是到中山大學的 FTP 網站上面下載，底下提供一下聯繫的網址：

    • 官方網站：http://www.squid-cache.org/Versions/v2/2.5/
    • 中山大學：http://ftp.nsysu.edu.tw/Unix/Proxy/squid/source/STABLE/

    同樣的， squid 也有兩種主要的安裝模式，分別是 RPM 版本與 Tarball 版本，不過，由於我們會加入一些不同的參數設定值，所以預設的 RPM 檔案並無法滿足我們的需求，除非使用 SRPM 來進行重新 configuration 的動作，否則比較不能讓我們滿意啦！因此，習慣上我們都是以 Tarball 的方式來進行編譯、設定與安裝，所以底下我們會比較偏重以 Tarball 的安裝來進行介紹，如果有興趣的話，可以嘗試以 SRPM 進行修訂的工作喔！

  • 使用 RPM 方式安裝 squid

    一般來說，使用您的 Linux distribution 提供的 Squid 也就夠了，但是，就如同上面提到的，可能會有一些設定值您無法自由自在的設定，不過。不過，無論如何，以 RPM 來安裝是最簡便的啦！那麼就請拿出您的原版光碟，將他 Mount 上來，查詢一下是否有 squid 字樣的檔案名稱？沒錯，就將他安裝上去吧！目前主要的幾個 distribution 都有提供這個套件，所以應該可以很快的找到這個套件才是！怎麼使用 RPM 呢？沒這麼難吧！

    [root @test root]# rpm -ivh squidxxxxxxx

    一再地強調， RPM 是粉重要的，請好好的使用他吧！ ^_^！這個指令就安裝完畢囉！只是要注意的是，由於 squid 2.2 版以前的設定與 2.4 版以後的設定差異性很大，所以請特別留意您的 squid 版本，如果是使用舊的 Linux distribution 的使用者，例如 Red Hat 6.xx 版本，或者是 Mandrake 7.xx 版本，那麼就不要再以 RPM 來升級了！直接使用底下的 Tarball 吧！反正才安裝一個檔案，還不會太難啦！

  • 使用 Tarball 方式安裝 squid

    一般來說，我還真是蠻喜歡中山大學的 FTP 站 ( 怪了，好像一直在幫人家打廣告！ ^_^ ) 沒辦法，我們南部人嘛！當然是南部的 FTP 站比較親切囉！這個時候，您可以直接在 Linux 底下使用 wget 來取得我們所需要的 squid 喔！目前我取得的版本是 2.5.STABLE2 版本，取得的方法如下：(註：您也可以到鳥哥的私房菜下載 http://linux.vbird.org/download)

    [root @test root]# wget \
    http://ftp.nsysu.edu.tw/Unix/Proxy/squid/source/STABLE/squid-2.5.STABLE2.tar.gz

    好了，這個檔案應該就是 /root/squid-2.5.STABLE2.tar.gz 囉！那麼就開始來給他安裝吧！過程很簡單啦，重要的地方只有在下達 ./configure 的地方需要很多的額外參數支援就是了！

    0. 解壓縮：
    [root @test root]# cd /usr/local/src
    [root @test src]# tar -zxvf /root/squid-2.5.STABLE2.tar.gz
    ....(略)....會產生一個 squid-2.5.STABLE2 的目錄
    [root @test src]# cd squid-2.5.STABLE2.tar.gz

    1. 開始設定參數：
    [root @test squid-2.5.STABLE2]# export CFLAGES='-O2 -mcpu=i586'
    這是一個額外的參數啦！因為我們使用的是 Linux ，而我們的 GNU gcc
    有針對每種不同的 CPU 來進行套件的最佳化編譯！所以啦，就加入我們的
    CPU 型號吧！因為我的 CPU 是 P-166 ，反正是個小案例啦！所以才會是 i586，
    您的 CPU 只要超過賽揚等級以上，就會是 i686 囉！此外，除了
    i386, i486, i586, i686 還有 pentium, pentium3, pentium4, athlon,
    athlon-tbird, athlon-4, athlon-x, athlon-mp, k6, k6-2, k6-3 等等！
    如果不確定您的 CPU 那麼就用 ix86 之類的方式來命名吧！不過，即使沒有
    寫入這個參數也無所謂啦！至於那個 O2 是最佳化參數啦！

    [root @test squid-2.5.STABLE2]# ./configure --prefix=/usr/local/squid \
    > --enable-gnuregex --enable-async-io=80 --enable-icmp \
    > --enable-kill-parent-hack --enable-snmp \
    > --disable-ident-lookups --enable-cahce-digests \
    > --enable-err-language="Traditional_Chinese" \
    > --enable-poll --enable-linux-netfilter
    這個咚咚就有趣啦！因為實在有相當多的參數可以使用，你可以使用
    ./configure --help 來察看可以使用的許多參數啊！稍微解釋一下各個設定值：
    --prefix=/usr/local/squid：未來程式編譯完成後放置的安裝目錄；
    --enable-gnuregex：使用 GNU 提供的正規表示法的原則來進行編譯，請注意，
        因為在 Proxy 未來的規劃當中，很可能會動用到正規表示法的方式來
        抵擋一些惡意的網站，所以這裡應該要加入這個參數的！
    --enable-async-io=80：這個項目主要在控制一些輸出入的元件，使用這個項目
        可以讓您的 Proxy 效能提升很多喔，因為是非同步輸出 (async) 的模式啊！
        後面接的數值是可以變動的，如果您的網站配備很高檔，可以嘗試將這個數字
        提升到 160 以上，如果是小網站的話，那麼可以考慮將他降低至 40 左右。
    --enable-icmp：要不要支援 ICMP 啊！當然是要的！
    --enbale-kill-parent-hack：在我關掉 squid 的時候，要不要連同
        parent process 一起關掉，當然也是要的啦！
    --enable-snmp：這個與製圖的 MRTG 比較有關啦！如果沒有用到的話，
        可以考慮將這個項目拿掉也沒有關係！
    --enable-cache-digests：這個項目很重要的啦，我們在底下再進行說明。
    --enable-err-language="Traditional_Chinese"：不需要寫了吧？
        只要有任何的錯誤訊息，網頁上面顯示的語系會是中文喔！
    --enable-poll ：可以提升效能；
    --enable-linux-netfilter：可以增加通透式 Proxy 的設定！後面再提啦！

    2. 開始編譯以及 Install 囉！
    [root @test root]# make && make install

    3. 開始設定其他的相關參數
    [root @test root]# vi /etc/man.config
    # 在這個檔案當中新加入一行：
    MANPATH /usr/local/squid/man # 與 Squid 有關的 man page
    # 可以讓 squid 提供的說明文件讓 man 指令可以查到！

    就這樣幾個簡單的步驟就將 squid 給他安裝完畢啦！很快速吧！所以我說，使用 Tarball 來安裝 squid 其實是很快的，不用太擔心囉！
Server 端設定：
    終於來到了主機端的設定項目啦！以下我們會分門別類的介紹各個主要的參數值，這些參數不見得適合您的 Proxy 環境，所以使用的時候敬請特別小心喔！每個項目都要好好的瞭解一下吶！另外，底下我主要是以 Tarball 安裝的目錄為主要的介紹狀態，如果您是以 RPM 來安裝的話，那麼所有的檔案原理與設定還是一樣的，只不過檔案存放的路徑就不太一樣就是了！請以 RPM 的指令或者是 locate 與 find 的方式找出來您的設定檔吧！

  • squid 的結構

    剛剛安裝的目錄其實是在 /usr/local/squid 這個目錄下，而這個目錄又分為幾個主要的子目錄，分別為：

    • bin/ ：放置主要的 squid 執行 scripts 的目錄，重要的是 RunCache 那個檔案；
    • etc/ ：幾乎所有的 squid 設定檔都在這裡；
    • libexec/ ：一些函式庫；
    • man/ ：就是一些線上文件查尋檔啦！
    • sbin/ ：重要的就是那個 squid 的執行檔！
    • share/ ：一些錯誤訊息代碼表示檔案，以及一些小圖示放置的目錄；
    • var/ ：預設是放置 log file 的，不過我不喜歡放在這裡，這點等一下我們會修改的！

    那麼主要的設定檔有哪些呢？其實可以說只有兩個啦：

    • /usr/local/squid/etc/squid.conf ：這個是主要的設定檔，所有的 squid 所需要的設定都是放置在這個檔案當中的！鳥哥底下提到的種種設定方法幾乎都是這個檔案裡面的說明喔！所以，如果您英文不錯，那麼就直接看一下這個檔案就知道如何設定 squid 啦！
    • /usr/local/squid/etc/mime.conf ：這個檔案則是在設定 squid 所支援的 Internet 上面的檔案格式，就是所謂的 mime 格式囉！一般來說，這個檔案的預設內容已經能夠符合我們的需求了，所以不需要更動他，除非您很清楚的知道您所需要額外支援的 mime 檔案格式。

    而執行檔其實只有一個，那就是 squid 啦！不過， Squid 這個套件額外的提供了兩個可執行的 scripts 來幫助大家執行 squid ，那就是在 bin/ 裡面的 RunAccel 與 RunCache ：

    • /usr/local/squid/sbin/squid ：就是我們說的 squid 的執行檔囉！要知道這個指令的參數嗎？就使用『 ./squid --help 』就能知道有什麼參數啦！
    • /usr/local/squid/bin/RunCache ：這個是主要的執行 squid 的一支簡單的 script ，主要是利用 squid.conf 設定檔案的內容來啟用 squid 喔！
    • /usr/local/squid/bin/RunAccel ：如果您的 WWW 服務也想要透過 Squid 來進行『加速』的話，那就可以使用 RunAccel 來取代 RunCache 了，不過，我通常還是使用 RunCache 而已！

  • squid 的 process owner 與 cache directory owner

    我們前面的原理部分稍微提過， squid 主要是以 daemon 提供的 Proxy 功能，而這個 daemon 最大的功能就是將 Internet 上面捉取的資料給他放入 Cache 目錄當中啦！而由於 daemon 會產生一些 processes ( 程序 )，這些程序都會有 Owner 以及 Group 。這樣曉得我要講什麼了吧？呵呵！沒錯，那個放置 cache 的目錄 ( 底下簡稱 cache dir ) 的擁有者以及擁有群組就必需要與 squid 產生的 process 的擁有者與群組相同才行！而為了保險起見，通常 squid 不會以 root 來啟動，最好是以 nobody 或者是一些權限比較低的系統帳號來啟動他！假設我們的 squid 這個 daemon 是由 nobody 所啟動的好了，而假設我的 cache dir 是放置在 /var/spool/squid 下面，則這個 /var/spool/squid 的 Owner 與 group 就必需要是 nobody, nobody 才行！這個很重要喔！因為大部分無法啟用 squid 的朋友都是這個動作沒有搞正確的原因啊！

    squid 的 Owner 與 Group 是在 squid.conf 裡面設定的，而至於 cache dir 則是需要我們手動來設定好他的權限呢！

  • 最簡易的 squid 設定方法

    設定 squid 僅要修改一個檔案而已，那就是 /usr/local/squid/etc/squid.conf 囉( RPM 版本就不相同囉！請自行找出來吧！ )！請注意，在這個例子當中，我們並沒有介紹高檔配備的設定，僅只是列出重要的設定項目還有一些觀念，您所想要的設定必需要視您的主機規劃而定，例如 cache dir 每個人所放置的目錄都不相同啊，所以直接拿我的設定來啟動時，可能會完蛋啊！請注意需要修改成您所想要的樣式才行！好了，在這個小節當中，我們僅列出來幾個一定要設定的參數，至於更進階的參數將留待後面分別介紹。

    另外要額外提醒的是，在 squid.conf 這個檔案當中，預設的情況下是『除了本機可以使用 squid 的少部分功能外，其他所有的項目都沒有被啟動』，所以您必需以 vi 的搜尋功能找到下列的設定項目後，將註解符號 (#) 拿掉，或者是自行輸入底下的設定才行喔！不囉唆，馬上進行吧！

    [root @test root]# cd /usr/local/squid/etc
    [root @test root]# vi squid.conf
    # 1. 關於網路的參數設定部分
    # 　 在這個部分當中，最重要的就是啟用 squid 這個 daemon 的 port 了！
    #　　在預設的情況下，公認的標準 proxy port 為 3128 ，至於被查詢封包
    #　　觀察的則是 3130 這個 port，這裡我們分別啟用這兩個 port ！如果您的
    #　　Proxy 還有幫人家代理 https 這個由 SSL 協定啟用的 port ，那麼還需要
    #　　啟動 https_port ，但是我們這裡不談論 SSL 啦！太危險了∼
    http_port 3128
    icp_port 3130

    # 2. 設定快取目錄 ( Cache dir ) 的大小與記錄檔案所在的目錄
    #　　這個設定是重要到爆的地方，一定得設定正確才行啊！上面我們不是
    #　　提過關於硬碟與目錄嗎？好了，現在這樣假設：我有兩塊 partition ，
    #　　這兩塊 partition 分別掛載在 /usr/local/squid/var/cache1
    #　　以及 /usr/local/squid/var/cache2 這兩個區域，此外，兩塊
    #　　partition 一塊為 1GB (cache1) 另一塊為 2 GB (cache2) ，則設定為：
    #　　<cache_dir> <aufs|ufs> <目錄所在> <MBytes大小> <dir1> <dir2>
    #　　那個 aufs 只有在編譯的時候加入 --enable-async-io 那個項目才有支援，
    #　　至於目錄所在地與所佔用的磁碟大小則請視您的主機情況而定，
    #　　而後面 dir1, dir2 則是兩個次目錄的大小，通常 16 256 或 64 64 皆可，
    #　　一般來說，數字最好是 16 的倍數，據說效能會比較好啦！
    #　　注意1：下面兩行需要『視您的主機而定！』不要照抄！
    #　　注意2：在底下的例子中，我的兩塊 partition 已經 mount 上該目錄了！
    #　　　　　　這也就是說，底下的兩個目錄是『已經存在的！』
    cache_dir aufs /usr/local/squid/var/cache1 1000 16 256
    cache_dir aufs /usr/local/squid/var/cache2 2000 16 256
    #　　底下則是關於記錄檔的放置目錄與檔名！
    cache_access_log /usr/local/squid/var/logs/access.log
    cache_log /usr/local/squid/var/logs/cache.log
    cache_store_log /usr/local/squid/var/logs/store.log
    pid_filename /usr/local/squid/var/logs/squid.pid

    # 3. 關閉認證機制
    #　　不曉得為什麼，這一版的 squid 會自動的加入認證機制，請找到底下
    #　　幾行，將他 mark 起來！
    #auth_param basic children 5
    #auth_param basic realm Squid proxy-caching web server
    #auth_param basic credentialsttl 2 hours

    # 4. 提供 squid 服務
    #　　預設的情況下，僅有本機可以使用 squid ，我們先將所有的權限開放
    #　　然後在一個一個的關閉囉！先找到底下這一行：
    http_access deny all
    #　　將他改成
    http_access allow all

    # 5. 設定 squid 的擁有者與系統管理員信箱：
    #　　就是剛剛我們上一小節提到的 squid 的擁有者，請注意，這個
    #　　user 與 group 必需要在 /etc/passwd 及 /etc/group 裡面存在方可成功！
    #　　我這裡以權限最小的 nobody, nogroup 來做為範例，您也可以自行設定！
    #　　另外，cache_mgr 則是 squid 管理員的信箱，當 squid 發生問題時，
    #　　螢幕上就會出現這個信箱給使用者聯繫管理員之用！
    cache_effective_user nobody
    cache_effective_group nogroup
    cache_mgr youraccount@your.e.mail

    # 6. 變更目錄權限：
    #　　在預設的情況下，我們主要的紀錄資訊都寫入 /usr/local/squid/var 裡面，
    #　　所以這個時候需要將這個目錄的權限改變成為 nobody 與 nogroup 所有！
    #　　當然囉，如果您的 cache_dir 不在這個目錄當中，那麼還需要額外自行建立，
    #　　例如我的 cache_dir 萬一是在 /proxy1 與 /proxy2 時，那麼我就必需要：
    #　　chown -R nobody:nogroup /proxy1
    #　　chown -R nobody:nogroup /proxy2
    #　　關於權限的問題是很重要的！請不要忘記了！
    [root @test root]# chown -R nobody:nogroup /usr/local/squid/var

    # 7. 開始啟動 squid：
    #　　啟動 squid 來試看看吧！不過，首先我們必需要建立快取目錄的格式
    #　　才行，此外，由於我們想要以 nobody 來啟動 squid ，所以你需要這樣：
    [root @test root]# /usr/local/squid/sbin/squid -z# 建立 cache_dir
    [root @test root]# su nobody -c "/usr/local/squid/bin/RunCache &"

    # 8. 查看是否真的啟動了 squid 了？
    [root @test root]# netstat -tln | grep 3128
    tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN

    # 9. 重新讀取設定檔 squid.conf 的方法：
    [root @test root]# /usr/local/squid/sbin/squid -k reconfigure

    在上面的設定中，重要的地方在於：

    • 你的硬碟規劃與 cache_dir 的設定是否吻合：請注意，除非您是『架設著玩的，純粹鍛鍊功力』的角度來設定 Proxy ，那麼可以直接以預設的設定來搞定您的 cache_dir ，不然的話，前面我們提過，這個 Cache dir 可是影響 Proxy 效能的相當重要的因素之一，因此，千萬不可大意啊！

    • 關於權限的大問題：由於我們常常提倡『不要以 root 來啟動 daemon 』，所以這個 squid 我們是以 nobody 與 nogroup 來啟動的！而 Process 與權限的關係是相當相當的重要的，因此，您必需要將上面剛剛建立的 cache_dir 更動整個目錄的擁有者才行！如果是鍛鍊功力而已，那麼隨意建立一個目錄更動一下他的擁有者與群組，就行了，不然的話，請依照您的硬碟規劃好好的設計一番！

    • 關於 cache_dir 重新建置的步驟：在上面的第 7 個步驟當中，我們必需以 squid -z 來重建一下 cache_dir 的格式，這個步驟在第一次啟動 squid 時才做，其他時候就不需要進行了！而進行這個步驟之前，請務必將上面提到的兩點注意事項先搞定，否則您的 squid 很難啟動喔！

    • 實際瀏覽器的查驗：雖然上面第 8 個步驟已經確認了 squid 啟動了，但是還不能肯定工作正常，這個時候如果您有 client 端的電腦，假設是 Windows 的 IE 好了，那麼就趕緊來測試看看能不能使用 squid 囉！啟動 IE 後，按下：
        『工具』->
        『Internet 選項』->
        『連線』->
        『區域網路設定』中，點選
        『使用 Proxy 伺服器』
      並在網址列輸入你的主機名稱 ( 或者是 IP 均可 )，然後按確定離開！然後在 IE 中按按看網頁的設定有沒有成功，如果可以讀到網頁的話，表示 squid 可以正常的被使用了！

    • cache_dir 這個參數的意義與存取格式的類型：
      這個設定項目就是限制暫存區大小的地方啦，格式為：

        cache_dir ufs /usr/local/squid/var/cache 100 16 256

      上面的說明是：暫存區目錄為 /usr/local/squid/var/cache ，而暫存空間大小為 100M ， 在這個暫存目錄下有 16 個目錄，而每個目錄中又有 256 個目錄 ( 你可以實際進入 /usr/local/squid/cache 當中去看看 ) 。如果你要改變暫存檔目錄及這個目錄的大小時，可以在這裡修改！不建議修改 16, 256 這兩個數值。另外，通常，如果是我們一般小型的區網 ( 不超過10個人 ) ，那設定個 500 應該夠了，如果你的硬碟夠大，設定成 1000 以上更好，當然，與第一個注意事項相符的，需要與您的實際硬碟大小以及 Partition 放置的目錄互相配合才行。修改過這個指令後，要再重新啟動 squid 之前，請先使用下面的指令來使你的目錄可以進行存取的動作，否則你的 squid 是不會工作的！例如你將上面的參數修改成：

        cache_dir ufs /usr/local/squid/var/cache 1000 16 256

      然後再進行下面的指令：

        rm -rf /usr/local/squid/var/cache
        mkdir /usr/local/squid/var/cache
        chown nobody:nogroup /usr/local/squid/var/cache
        /usr/local/squid/sbin/squid -z

      這樣你的squid暫存目錄就可以使用囉！另外，如果你在編譯 (configure 過程中) 的時候有將 --enable-async-io 這一個參數加進來的話，將可以增加 aufs 這一個資料存取的格式！這個存取的格式可以將你的硬碟發揮到最極限的速度喔！雖然在 squid.conf 檔案中有提及，這個 type 可能會有 bug 存在，不過，據鳥哥的使用結果，發現，沒啥大問題！好用的很！所以，你可以將上面的咚咚改成下面的樣子：
        cache_dir aufs /usr/local/squid/var/cache 1000 16 256

    這樣就算已經完成了一個『很陽春』的小型 proxy 了！為什麼說很陽春呢？這是因為這個 Proxy 並沒有上層 Proxy 餵資料，所以 Client 端的任何要求這個 Proxy 都需要『自己去捉』啊！哇！那麼這個 Proxy 還真累啊！沒錯啊，所以底下我們要再來談一談其他幾個增加 proxy 效能的方法，好讓大家的 Proxy Server 可以真的加快您瀏覽的速度啊！

  • 記憶體與磁碟快取留存百分比設定

    記憶體與磁碟快取在 squid.conf 當中的相關簡易設定如下所示，至於更詳細的說明則在下表之後進行解說：

    # 與記憶體有關的設定：因為我的系統很小，所以只給 8 MB！如果您的實體記憶體
    # 很大的情況下，例如 512 MB，可以考慮加大到 64 或 128 MB。
    cache_mem 8 MB
    # 與磁碟容量有關的設定(註：下列的 90 與 95 是百分比 )
    # 如果您的 cache_dir 所在磁碟很大時，可以考慮將 4096 改成 32768 KB
    cache_swap_low 90
    cache_swap_high 95
    maximum_object_size 4096 KB
    # 與記憶體保存資料有關的設定
    maximum_object_size_in_memory 8 KB
    # 我們經由 dns 正反解以及 IP 的結果，記錄在暫存區啊！
    ipcache_size 1024
    ipcache_low 90
    ipcache_high 95
    fqdncache_size 1024

    記憶體的需求數量：
    事實上，除了硬碟之外，記憶體可能是另一個相當重要的影響 Proxy 效能的因子！怎麼說呢？因為 Proxy 會將資料存一份在 Cache 硬碟中，但是同時也會將資料暫存在記憶體當中啊，以加快未來使用者存取同一份資料的速度！所以囉，記憶體本來就會被 squid 的程式所消耗掉一些！一般來說，被 squid 消耗掉的記憶體約略每 1GBytes 的 cache_dir 空間就消耗 10MB 的記憶體容量，所以，如果以上面我們的設定為例 (cache1, cache2 共有 3GB)， 那麼就有 30MB 以上的記憶體被消耗掉了！除此之外， squid 程式執行當中亦會額外的消耗掉一些實體記憶體，這部份佔用掉的記憶體約為 10-20 MB 。

    除了這些記憶體是必須要的之外，您還可以額外的指定一些記憶體來進行比較『熱門』的資料存取！也就是說，可以額外的再加一些記憶體來幫助 squid 工作，而不僅只是上面提到的記憶體使用量！那個就是 cache_mem 這個設定參數的用途啦！所以，請特別留意啊，『 cache_mem 並不是指我要使用多少記憶體給 squid 使用，而是指 "我還要額外提供多少記憶體給 squid 使用" 的意思』！因此，假設我有 X GB 的磁碟快取空間，而且 squid 程式使用掉 15 MB 的記憶體，那麼我 squid 使用掉的記憶體就有：

      X * 10 + 15 + "cache_mem 設定值"

    您可以自行計算一下您的 squid 消耗掉多少記憶體喔！此外， squid 官方網站建議您的實體記憶體 (不含 swap 的記憶體容量) 最好是上面數值的兩倍，也就是說，假如我的快取容量為 3 GB ， cache_mem 設定為 16MB ，那麼我的 squid 至少會消耗掉 3*10+15+16 = 61MB，則我的實體記憶體最好至少要有 122 MB 以上，才會有比較好的效能！當然，這個單指 Proxy 部分而已，如果您的該部主機還有負責其他的工作，呵呵！那麼記憶體就得在累加上去啦！一般來說，如果您的 Proxy 很多人使用時，這個值越大越好，但是最好也要符合上面的需求喔！

    關於磁碟容量的設定：
    請注意，如果您的磁碟快取空間額滿了，那麼您的 squid 也就『掛點』了！因此，請隨時注意你的磁碟快取空間！但是，要我天天去注意 squid 的 cache_dir 裡面的容量，也太勞神了吧？！這個時候就必須要『cache_swap_low, cache_swap_high 』這些設定的幫忙了！如果以上面表格的設定為例時，他的說明是『當我的快取目錄所佔容量為總快取量的 95% 時，那麼我的 squid 將會自動的將快取目錄內的容量減低至剩下 90% 的容量！』注意，那個 90 與 95 為百分比例喔！以我們的設定為例，我的 cache_dir 總共有 3GB ，那麼當快取空間被使用了 3*0.95=2.85GB 時，我的 squid 會自動的將 2.85GB 裡面較舊的資料刪除，使快取目錄內剩下 3*0.9=2.7GB 的空間！這樣能瞭解了吧？請特別注意，如果您的 proxy 容易很多人同時上線時，請將這兩個數值更動一下，例如變更為 70 85 ，為什麼呢？萬一您的使用者突然間都上線了，然後下載大量的檔案，那麼『瞬間』可能會使您的 cache 目錄超過額度，導致 cache 死掉！所以降低 cache_swap_high 對於大型 proxy 是有需要的！

    是否需要記錄捉到的資料：
    還有一個小問題要說明的，是否使用者要求過的資料我都要記錄呢？呵呵！那當然不是啦！如果都記錄的話，萬一像最近好多 Linux distribution 都釋出了他們新版的 Linux ISO 檔案，那些檔案一個都有 600 MB 以上的容量，萬一使用者下載個幾個這樣的檔案，我們的 Proxy 想不爆掉都很難∼所以這個時候就要限制一下需要記錄的『最大檔案』啦！在預設的情況下，我們的 squid 對於超過 4MB 的檔案是不記錄的，但是如果您的硬碟夠大的話，我都喜歡將這個數值調大一點，為什麼呢？萬一我的使用者常常下載一些 10~20 MB 的套件檔案，難道我每次都要到官方網站去下載一次嗎？當然我不想這樣啊！所以我通常將這個數值調大到 32MB ，或者是 32768 KB 囉！除了磁碟快取之外，記憶體的快取可以記錄的最大檔案容量也可以修正一下喔！但是我們的記憶體可就珍貴的多了！不要開太大，大約預設值就很不錯了！

    關於 IP 與完整主機名稱的紀錄：
    如果能將 IP 與主機名稱記錄下來的話，搜尋的腳步也會加快一些的！所以以上面的表格為例，我們分別開啟了 ipcache_size 與 fqdncache_size( 後面接的數值是 bytes )的記憶容量，由於這些資料都是 ASCII 的資料，用不了什麼空間，因此 1024 bytes 已經足夠了！至於後面的 low 與 high 則與前面說明的相同！

  • acl 的用法與用途

    在 squid.conf 這個檔案裡面最常看到的大概就是 acl 這個設定項目了！他可是整個 squid.conf 的重頭戲啊！很多的來源與目的管制都是靠他來設定完成的呢！我們底下就稍微談一談這個重要的咚咚吧！首先，他的語法為：

    <acl> <acl名稱> <acl類型> <設定的內容>

    上面那個 <acl名稱> 可以想成是一個暱稱就是了！別想太多∼就只是一個代名詞，至於 acl 類型可就有趣的多了，他主要有下面這幾大類：

    以來源端來控制：
    • src　 ip-address/netmask：主要控制『來源的 IP 位址』，例如『acl nckuip src 140.116.0.0/16』，這表示未來在 squid.conf 裡面，任何使用到 nckuip 這個代名詞時，就表示他是『來源為 140.116.0.0/16 的位址』！
    • src　addr1-addr2/netmask：主要控制『一段範圍來源的 IP 位址』，例如『acl nckuevoffice src 140.116.44.120-140.116.44.130/24』就表示 nckuevoffice 這個代名詞為來自 140.116.44.120 到 140.116.44.130 之間這 11 個 IP 的要求！』請注意，是『來源』喔！
    • srcdomain　.foo.com：主要控制『來源為一某個網域的電腦』的意思，例如：『acl vbirdhome srcdomain .vbird.org』，與 src 很類似，都是控制來源的用戶端，只不過 src 控制的是 IP 而 srcdomain 則是控制 domain name 就是了！

    以目的端來控制：
    • dst　ip-address/netmask：主要控制『目的端的 IP 位址』，與 src 類似，只不過是用來控制『目的端』的位址！
    • dstdomain　.foo.com：這個就沒問題了吧？就是用來控制『目的端的網域』囉！與 srcdomain 類似喔！

    以正規表示法的方式來控制：
    • url_regex [-i] ^http:// ：除了上面兩種基本的方法之外，我們也可以使用正規表示法的方式來控制『網域』的設定值呢！例如『 acl urlname url_regex ^http://linux.vbird.org 』這表示 urlname 代表的就是 http://linux.vbird.org 的意思∼而且請注意啊！這個 url_regex 表示的是『完整的 URL 名稱』喔！如果僅只是一些檔名，例如 gif 這一類的檔名時，要怎麼作呢？就如底下的說明啦！
    • urlpath_regex [-i] \.gif$：上面提到的是關於整個網址的名稱，這裡則是只要『URL 部分相同』就可以啦！例如『acl gifname urlpath_regex \.gif$ 』則是代表 gifname 代表的是 url 後面是 .gif 的網址，呵呵！那就是 gif 的圖檔附檔名嘛！！這樣應該不難理解了吧！

    由於在 squid 當中很多時候都會用到一些 IP 網域啦，以及 domain name 等等的資料，這個時候這個 acl 就可以看做與 bash 裡面的『變數』很類似囉！您可以參考看看的啦！只是他的用途相當的廣泛，這個在底下我們會進一步的使用 acl 搭配各種設定值來進行說明的！

  • 上層 Proxy 的選擇與負載分流的設定方法

    上層 Proxy 的設定方式： cache_peer
    我們在上面的原理部分說明過，一部有效能的 Proxy server 必須要能利用上層 Proxy 所提供的效能，才能達到我們所想要的『加速』功能！那麼當然大前提之下就是需要先找到『最佳效能的上層 Proxy 主機』囉！沒錯！就是這樣的啦！在這裡，我們以成功大學的學術網路為架構進行說明，如果您的網路架構並非為學術單位的話，請依照您能找到的上層 Proxy 來進行設定喔！需要特別留意的是，由於成大有許多的上層代理伺服器，這些伺服器都可以做為我個人 proxy 的 parent proxy 主機，不過，由於各個主要的 parent proxy 所提供的網域服務都不盡相同，所以我們得先將主要的幾個伺服器對應的網域給他找出來，底下是一個例子：

    gate.ncku.edu.tw 主要服務 .com 的網域
    gate3.ncku.edu.tw 主要服務 .net .edu 的網域
    gate2.ncku.edu.tw 主要服務非 .com .net 與 .edu 的網域
    proxy.ncku.edu.tw 主要服務任何網址

    至於在 squid.conf 當中設定的參數則是『cache_peer 』這個項目，設定的樣式為：

    <cache_peer> <主機名稱> <類別> <http_port> <icp_port> <其他參數>
    類別：主要有上層(parent) 與同一層 (sibling) 兩種，我們這裡主要介紹的是
          上層 Proxy 也就是 parent 這一大類，如果您想要架設一個小型的 Proxy
          Cluster 的話，可以考慮組成 sibling 的功能，由於我們僅想要架設單部
          Proxy Server ，所以這裡我們就不探討 sibling 了！
    http_port icp_port：就是我們最前面設定的啦！ Internet 上面預設是
          3128 3130 這兩個！
    其他參數：其他參數的部分就很重要了，主要有底下幾個重要參數：
        proxy-only ：只取出上層 Proxy 的 cache 給 client ，並不會將上層 Proxy
            的資料存在自己的 cache 硬碟中；
        weight=n　：權重的意思，因為我們可以指定多部上層 Proxy 主機，哪一部
            最重要？就可以利用這個 weight 來設定， n 越大表示這部 Proxy
            越重要！
        no-query　：一般來說，如果要向 sibling 要求資料時，會向 sibling 送出
            icp 的要求封包，使用 no-query 就可以取消。一般來說，如果向上層
            Proxy 要求資料時，可以不需要發送 icp 封包，以降低主機的負擔
        default　　：表示該部主機為預設的 Proxy 主機的意思；
        no-netdb-exchange：表示不向附近的 Proxy 主機送出 imcp 的封包要求
        no-digest　：表示不向附近主機要求建立 digest 紀錄表格。
    範例：
    cache_peer gate.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
    cache_peer gate2.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
    cache_peer gate3.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
    cache_peer proxy.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange

    基本上，由於我們向上層 Proxy 要求資料的時候，也是需要時間的，因此，這裡我們建議您不要設定太多的上層 proxy 主機，一般來說， 2~4 部也就足夠了，太多部 上層Proxy 的情況反而可能會拖垮您的 Proxy 速度呢！OK！既然有了上層 Proxy ，而且每一部所負責的網域並不相同，所以我們當然就需要將網域分門別類囉！如何將這些網域分門別類呢？那就需要 acl 的幫忙啦！先提醒一下，由於我們的 Proxy 旨在幫助 client 端取得資料，所以使用 acl 的時候，是針對『目標』來進行設定的，因此，使用的是 dst 與 dstdomain 喔！在這裡，我們將主要的網域分成底下這幾大類：

    0. 自己想要直接使用自己的 Proxy 捉取的資料
    acl directip dst 140.116.44.0/24
    acl directdn dstdomain .vbird.org tw.yaoo.com tw.news.yahoo.com

    1. 成大附近的網域
    acl nckudn dstdomain .ncku.edu.tw
    acl nckuip dst 140.116.0.0/16 163.28.112.0/24 163.28.113.0/24 163.28.114.0/24 163.28.115.0/24 163.28.116.0/24 163.28.117.0/24

    2. 台灣的網域 (請注意：底下為同一行)
    acl twdn dstdomain .tw .twnic.net .hinet.net .acer.net .wownet.net .seeder.net .silkera.net .neto.net timenet.net tw.aunet.net .adsldns.org

    3. 台灣的 IP (注意：底下為同一行)
    acl twip dst 163.28.0.0/16 140.96.0.0/11 140.128.0.0/12 140.92.0.0/16 139.175.0.0/16 139.223.0.0/16 163.12.0.0/14 163.16.0.0/14 168.95.0.0/16 192.72.0.0/16 192.83.160.0/19 192.83.192.0/22 192.192.0.0/16 202.39.0.0/16 202.132.128.0/17 202.145.224.0/19 203.64.0.0/12 210.64.0.0/13 210.60.0.0/14

    4. 一些商業、網域、教育、以及其他的網域
    acl comdn dstdomain .com
    acl netdn dstdomain .net
    acl edudn dstdomain .edu

    這樣子就作好了基礎的工作了！接著下來，我們要開始來設定『各個主要的網域要透過哪一個上層 Proxy 來進行資料的取得？』這裡就有點難度啦！得小心在意一下！我們的基本假設為這樣：
    gate.ncku.edu.tw 僅負責 .com 的網域；
    gate3.ncku.edu.tw 僅負責 .net 與 .edu 的網域
    gate2.ncku.edu.tw 不負責上面的三個網域
    proxy.ncku.edu.tw 不負責上面三個網域
    這麼一來，使用 cache_peer_access 這個設定項目時，我們的設定會變成這樣喔！

    # 主要的格式範例：
    # <cache_peer_access> <上層 Proxy > <allow|deny> <acl名稱>
    cache_peer_access gate.ncku.edu.tw allow comdn
    cache_peer_access gate.ncku.edu.tw deny !comdn
    cache_peer_access gate3.ncku.edu.tw allow netdn
    cache_peer_access gate3.ncku.edu.tw allow edudn
    cache_peer_access gate3.ncku.edu.tw deny !netdn
    cache_peer_access gate3.ncku.edu.tw deny !edudn
    cache_peer_access gate2.ncku.edu.tw deny comdn
    cache_peer_access gate2.ncku.edu.tw deny netdn
    cache_peer_access gate2.ncku.edu.tw deny edudn
    cache_peer_access gate2.ncku.edu.tw deny directdn
    cache_peer_access gate2.ncku.edu.tw deny directip
    cache_peer_access gate2.ncku.edu.tw deny twdn
    cache_peer_access gate2.ncku.edu.tw deny twip
    cache_peer_access gate2.ncku.edu.tw deny nckudn
    cache_peer_access gate2.ncku.edu.tw deny nckuip
    cache_peer_access proxy.ncku.edu.tw deny comdn
    cache_peer_access proxy.ncku.edu.tw deny netdn
    cache_peer_access proxy.ncku.edu.tw deny edudn
    cache_peer_access proxy.ncku.edu.tw deny directdn
    cache_peer_access proxy.ncku.edu.tw deny directip
    cache_peer_access proxy.ncku.edu.tw deny twdn
    cache_peer_access proxy.ncku.edu.tw deny twip
    cache_peer_access proxy.ncku.edu.tw deny nckudn
    cache_peer_access proxy.ncku.edu.tw deny nckuip

    經過上面這個動作，我們就可以將 .com 的要求經過 gate.ncku.edu.tw 這一部，並且將 .net 與 .edu 給 gate3.ncku.edu.tw 來服務！此外，將沒有被自己定義出來的 IP 或者是網域就丟給 gate2 以及 proxy 這兩部來服務，至於我們既然是在台灣，所以自己定義出來的四個 acl 名字 (directdn, directip, twdn, twip) 當然是直接交給我們自己的 Proxy 來捉取了，相信速度上面應該不會有任何的影響的！因此，那四個主要的 acl 名稱將在後面繼續介紹如何不要透過上層 Proxy 來捉取資料喔！ ( 請參考 always_direct 與 never_direct 的設定值 )

    不要進行 cache 的設定值：
    就如同我們在原理的部分提到的，有些網站的資料事實上並沒有做為 cache 的需要，例如 CGI 檔案就是一個很鮮明的案例！所以，一般而言， squid 在一開始就會自動幫我們設定好底下這三行：

    hierarchy_stoplist cgi-bin ?
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY

    上面這三行的意思是：『只要在網址列出現了 cgi-bin 的字樣時，該網頁資料就不進行 cache 的動作！』這樣一來，可以避免我們的主機存放太多的垃圾啊！ ^_^！當然啦，在某些時候，例如您所在的網域真的是很慢，同時又沒有適合的上層 Proxy 的環境下，那麼將 cgi 之類的網頁 cache 下來，也未嘗不是一個可以節省瀏覽時間的一個方法！如果確定要將 cgi-bin 底下的網頁也存下來的話，那麼就將上面三行註解掉囉！

  • 與時間相關的設定值 ( connect_timeout, request_timeout )

    由於 Proxy 的設定除了防火牆的額外功能外，最主要的目的還是在於將網頁資料 cache 下來！既然如此的話，那麼與 Server 的連線時間的確認就顯的很重要啦！怎麼說呢？萬一今天您有設定三部上層 Proxy ，每一部的要求時間都控制在 5 分鐘，如此一來，呵呵！萬一今天剛好三部上層 Proxy 都掛點，難道我們就宿命似的要等待 15 分鐘嗎？當然不是啦！所以這個時候，我們可以將連線的等待時間縮短，好讓 Proxy 可以發揮更為強大的功能啊！

    # 1. 關於 cache 的更新時間趨勢
    # 我們在快取當中的資料總是需要更新的對吧！那麼如何設定更新的時間呢？
    # <refresh_pattern> <regex> <最小時間> <百分比> <最大時間>
    # 注意，那個 regex 指的是『目標』，這個『目標』大部分為網址，而這個網址
    # 使用正規表示法來表示就是了！上面的意義是說：最小的時間內 (分鐘)，如果
    # 檔案有更動，就直接更新，或者是目標檔案上次更新的時間到現在已經經過最大
    # 時間的『百分比』時，就予以更新！範例如下：
    refresh_pattern ^ftp: 1440 20% 10080
    refresh_pattern ^gopher: 1440 0% 1440
    refresh_pattern . 0 20% 4320
    # 第一行的意思是，如果網址裂開頭是 ftp 的話，那麼在一天(1440分鐘)後，如果
    # proxy 再次取用這個檔案時，則 cache 內的資料會被更新！

    # 2. 關於連線時間限制
    # connect_timeout 指的是連接到其他主機的時間多久之後算失敗，預設是兩分鐘
    #　　　　　　　　不過我覺得我的機器連線速度還算快速，所以減低了時間
    # peer_connect_timeout 指的是連接到上層 Proxy 多久不成功就算失敗，
    #　　　　　　　　由於上層 Proxy 與我的環境息息相關，不可能連不上，
    #　　　　　　　　所以我這裡將時間調整的很短！
    # request_timeout 指的是，連線上了，但是要求的時間會多長？
    # persistent_request_timeout 指的是連續要求時間會有多長？
    connect_timeout 30 seconds
    peer_connect_timeout 10 seconds
    request_timeout 1 minutes
    persistent_request_timeout 20 seconds
    # 請特別注意喔！上面的設定當中，是因為我的環境『還算不錯』，所以我將
    # 時間調整的很短，因為我曉得我的環境當中不會有花很長時間的狀況，
    # 這裡請依照您的網路環境來調整喔！或者乾脆不要設定也沒有關係！

  • 總是系統自己來捉資料(always_direct)

    剛剛我們在主機分流的地方有提過，有些資料我們要讓我們自己的 Proxy 去捉取資料即可，而不透過上層 Proxy ，那麼怎麼達到這樣的目的呢？也不是很難啦！就告訴 Proxy 不要去捉就好啦！怎麼告訴他呢？使用 always_direct 或 never_direct 即可！

    # 1. 使用 acl 先定義出要直接或者不要直接去的網址或 IP ，
    # 　 這個部分我們剛剛在上面已經設定好了，就是 directip 與 directdn，
    #　　還有 twdn 與 twip 這幾個咚咚！
    # 2. 如果是直接要 Proxy 出去捉資料，可以使用 always_direct
    always_direct allow directip directdn

    # 3. 如果一定『拒絕經由上層 Proxy 出去』的話，可以使用 never_direct
    never_direct deny twdn twip

    # never_direct allow 表示一定會經由上層 Proxy 來捉資料，
    # never_direct deny 當然就表示一定是自己向外頭捉資料囉！

    事實上，這個東西可以讓我們的 Proxy 變的很靈活！假設這樣的一個案例，我們自己有一個內部的 WWW 網站，這個網站的網址為 192.168.0.100 ，如果我要經由上層 Proxy 去捉資料的話，那不就完蛋了∼因為這個是『私有 IP 』的網域啊！所以，我將他寫入 directip 那個 acl 的設定當中，如此一來，呵呵！我們的 Proxy 會自動的經由自己的 route table 去到內部網域讀取資料給你，您根本不需要變更您的其他設定就可以自由自在的讀取內部與外部的主機資料！此外，如果您發現同一網域還有其他的 WWW 主機，把這些主機的 IP 或主機名稱寫入 directdn 或 directip 的 acl 設定當中吧！因為在同一網域時，您自己去捉一定會比上層 proxy 捉完之後再傳給你來的快吧！

    當然還不只如此啦，有的 WWW主機由於設定的關係，他們並不允許我們的上層 Proxy 來捉取資料，最常見的例子就是類似總圖對校內的 client 端開放的圖書查尋的軟體了！因為如果開放了這些上層 proxy 的話，那麼全台灣所有的人只要將他們的瀏覽器 proxy 設定為成大的上層 proxy 主機，就可以使用成大的資源了！那豈不麻煩？因為這些資源是需要花費經費的啊！這個時候，您也就必須要讓這些網址經由我們的 Proxy 自己去捉取囉！這樣可以瞭解乎！

  • 限制使用 proxy 使用者與 proxy 目標的方式 (acl and http_access )

    既然 proxy 有一定的風險存在，自然就不能讓任何人都能使用你的 proxy 主機囉！沒錯！所以我們必須要管制連線的使用者！管制的方法真是簡單的很！就是使用 acl 配合 http_access 即可！在預設的情況中， squid 已經幫我們設定好一些安全的可以連線的 port 了，此外，也只有本機可以使用 proxy 功能呢！

    那麼萬一如果我樣讓內部 192.168.0.0/24 這個網域的使用者可以使用我的 proxy 呢？該如何設定？呵呵！您可以這樣做：

    # 1. 先設定這個內部網域的 acl 名稱
    acl inside src 192.168.0.0.24

    # 2. 設定 http_access 讓他可以使用
    http_access allow inside
    http_access deny all

    那個 http_access deny all 是系統預設的項目！剛剛我們在 最簡單的 squid.conf 設定 時已經將他改成 http_access allow all 了！所以請記得將他給改回來啊！不然的話，您的 Proxy 很有可能會被人家利用喔！

    這裡再提供一個值得思考的咚咚，如果您跟我一樣，都是使用撥接的 ADSL ，這樣一來，由於我們的 IP 都不是固定的，如果要讓我們的 ADSL 撥接的 client 可以使用我們剛剛設定的 Proxy 時，該怎麼辦？啊！這樣就不能使用『 acl 配合 src 』的設定方式了嗎？呵呵！當然不是，您可以這樣想像：

    1. 我先申請一個動態 DNS 的網域名稱，例如我的 tsai.adsldns.org ；
    2. 雖然我可以直接在 squid.conf 當中設定 acl 並使用 srcdomain 來設定我的 tsai.adsldns.org ，但是很抱歉的是，如果我的 tsai.adsldns.org 來連接到 Proxy 主機時，事實上，我的撥接制 IP 反查得到的主機名稱一定不是 tsai.adsldns.org ，如此一來則 srcdomain 一點用處也沒有了；
    3. 再換個方式，如果我寫一支 script 來偵測 tsai.adsldns.org 所對應的 IP 呢？並且將他寫入一個自訂的設定檔當中，這樣一來，這個檔案會隨時記錄最新的 tsai.adsldns.org 的 IP ，如此一來，我就可以使用 acl 配合 src 的設定方式了！

    很麻煩嗎？一點也不會，整個 script 可以像底下這樣：

    [root @test root]# cd /usr/local/squid/etc
    [root @test etc]# vi squid.allow.sh
    #!/bin/bash
    # 這支程式可以用來查尋您的 IP 喔！

    # 1. 請輸入您的主機名稱，請注意，如果有兩個以上的主機名稱，
    # 請分別以空格分開各個主機名稱
    hostnames='tsai.adsldns.org test.adsldns.org'
    basedir=/usr/local/squid/etc/
    email=root@localhost
    squid=/usr/local/squid/sbin/squid

    # 2. 以下為程式段，看看就好了！
    [ -f $basedir/squid.allow.hosts.raw ] || \
    touch $basedir/squid.allow.hosts.raw

    cat /dev/null > $basedir/squid.allow.hosts.now
    runornot=no

    for host in $hostnames
    do
    hostip=`host $host | awk '{print $4}'`
    if [ "$hostip" == "out;" ]; then
    echo 'Proxy 回應：沒有 DNS 的訊息！' |\
    mail -s 'Proxy 主機回應' $email
    exit
    fi
    fileraw="$basedir"/squid.allow.`echo $host|cut -d '.' -f1`
    [ -f $fileraw ] || touch $fileraw
    hostraw=`cat $fileraw`
    if [ "$hostraw" != "$hostip" ]; then
    runornot="yes"
    echo $hostip > $fileraw
    fi
    echo $hostip >> $basedir/squid.allow.hosts.now
    done

    if [ "$runornot" == "yes" ]; then
    cat $basedir/squid.allow.hosts.raw > $basedir/squid.allow.hosts
    cat $basedir/squid.allow.hosts.now >> $basedir/squid.allow.hosts
    $squid -k reconfigure
    mail -s 'Proxy 主機回應！Client IP 已經改變' $email < $basedir/squid.allow.hosts
    fi

    如此一來，我將可以把我的隨時最新的 IP 紀錄在 /usr/local/squid/etc/squid.allow.hosts 這個檔案當中！那麼要如何更新這個檔案的內容在 squid 的設定檔中呢！就這樣設定即可：

    # 1. 先設定這個檔案的名稱吧！
    acl allowhost src "/usr/local/squid/etc/squid.allow.hosts"

    # 2. 設定 http_access 讓他可以使用
    http_access allow allowhost
    http_access deny all

    然後將上面這個 squid.allow.sh 給他丟進去 crontab 當中，我預設都是在 30 分鐘跑一次！

    [root @test root]# vi /etc/crontab
    10,30 * * * * root /usr/local/squid/etc/squid.allow.sh

    這樣就完整的啦！ ^_^

  • 額外的功能參數

    除了上面提到的這些關於網頁快取的功能之外， Proxy 還可以幫我們進行 FTP 的服務取得資料喔！我們可以透過瀏覽器，經由 proxy 提供的 FTP 功能來登入對方主機，當然，對方主機必須要能夠提供匿名登入啊！好了，我們來看看要怎樣設定呢？

    # 與 FTP 有關的設定項目，主要是針對被動式連線方式來設定喔！
    ftp_user Squid@
    ftp_passive on

    # 主要與 DNS 的設定值有關，如果在高負載的 Proxy 環境下，可以考慮將
    # dns_children 提高到 20 左右，這個值最大為 32
    dns_timeout 1 minutes
    hosts_file /etc/hosts

    還有一些額外的範例可以參考看看喔：
鳥哥的範例
成大 gate.ncku.edu.tw 的 squid.conf 設定
電機系 turtle.ee.ncku.edu.tw 的 squid.conf 設定
台南學校範例 proxy.school.tn.edu.tw 的 squid.conf 設定
Client 端設定
    既然 proxy 是給瀏覽器用的，那麼自然在瀏覽器上面就需要設定一些參數囉！呵呵，沒錯！那麼如何設定呢？由於不同的瀏覽器在設定 Proxy 的地方也都不同，所以底下我們介紹目前比較常見的兩款瀏覽器，分別是 Netscape 以及 IE 的設定，至於其他的瀏覽器，請參考各瀏覽器的相關說明啊！

  • Netscape

    Netscape 的設定並不難，只要修改一個小地方即可！

    1. 開啟 Netscape 之後，啟用『編輯』並選擇『偏好設定』項目，如下所示：

    2. 在出現的畫面當中，先按下『進階』左邊的展開模式，然後選擇底下的『代理伺服器』，則畫面會出現如下的模樣。之後，在右邊的視窗當中選擇『自行設定代理伺服器的組態』項目，並且再按下『檢視』，則到下一步去設定：

    3. 在出現的方框中，由於我們通常僅針對 WWW 進行快取，所以可以僅針對 HTTP 的項目進行設定！在下面的畫面當中，請輸入『Proxy 主機的 IP 或者是 domain name 』，以及『連接的 port number』，這樣就可以了。不過，如果有某些網域您想要直接讓你的 PC 去捉取資料時，可以將該網域名稱填寫在最下方的方框中！以下面的畫面為例，我的 PC 要連接到 linux.vbird.org 以及 www.study-area.org 時，就可以不透過 Proxy 啦！這個功能也挺適合可以自行調配流量、流速的朋友！

    4. 再按下『確定』之後，立刻就生效了！

  • Internet Explorer

    在 IE 的設定上面也一點都不難啊！

    1. 開啟 IE ，然後在『工具』內選擇『Internet 選項』：

    2. 在開啟的視窗內選擇『連線』並點選下方的『區域網路設定』：

    3. 在出現的方框中，先在下方打勾起『使用 Proxy 伺服器』，然後依序在網址列填入『 Proxy 的網址或者是 IP 』以及連接埠填入『 Proxy 所開放的 port number』，如下方的設定即可。

    4. 另外，如果有某些網域不想透過這個上層 Proxy 的話，點選上圖的 『進階』那一項，在出現的框框的最底下，可以填入你不想透過 Proxy 捉取的網站網址，如下所示：

    如此一來則設定好了 Proxy Server 囉！
Server 端進階設定
    既然一些主機的設定已經搞定了，接著下來又是到了 Server 的安全與進階設定時間啦！那麼在安全的設定方面，最重要的自然又是我們一再強調的登錄檔的分析囉！如何分析登錄檔呢？難道又要自己動手寫分析的 scripts ？？呵呵！不用麻煩了，我們可以使用前輩智慧的結晶，直接有軟體可以來進行分析喔！還有，既然強調 Proxy 可能會被濫用，所以當然要適當的管理了！這個時候的防火牆設定又要出現啦！呵呵！趕緊來看一下怎麼處理吧！

  • 末端資料分析 pwebstat

    事實上， squid 已經有眾多的登錄檔分析軟體了，而且大多是免費的 (http://www.squid-cache.org/Scripts/) ，您可以依照自己的喜好來加以安裝與分析你的 squid 喔！我這裡僅介紹目前很常被使用的一套軟體，也就是 pwebstats 這一套！你可以在 pwebstats 的官方網站上面查得更新的資料 ( http://martin.gleeson.com/pwebstats/installation.html )。不過，由於 pwebstats 在安裝的時候需要使用到其他的函式庫，因此，你必須要先安裝 fly 這套軟體才行啊！而在安裝 fly 之前，又需要先安裝一些必備的圖示用的函式庫才行，那就是類似 gd, libpng, zlib 等等的套件喔！聽起來似乎很多東西要做，但是事實上卻非常簡單的啦！好吧！那麼我們就一步一步的來安裝這個 pwebstats 吧！

    安裝所需要的套件資料：
    除了系統自己可能已經安裝好的 gd, libpng, zlib 之外，您可以由文末提供的官方網站的連結來取得最新的 fly 與 pwebstats 套件，而如果您不需要使用最新的資料，那麼也可以經由 鳥哥的私房菜 提供的比較舊的套件版本來安裝 ( http://linux.vbird.org/download/ )。我這裡假設您已經將所需要的 fly-2.0.0.tar.gz 與 pwebstats-1.3.8.tar.gz 套件都下載到 /root 底下了，那麼您可以這樣做：

      1. 確認一下到底有沒有我們需要的一些相關套件？
      [root @test root]# rpm -qa | egrep '(^gd-|^zlib-|^libpng-)'
      libpng-devel-1.0.14-0.7x.4
      gd-1.8.4-4
      zlib-1.1.3-25.7
      zlib-devel-1.1.3-25.7
      libpng-1.0.14-0.7x.4
      gd-devel-1.8.4-4
      請注意，我是以 Red Hat 7.2 為例，如果您的系統並非 RH 7.2 ，那麼可能
      套件後面接的版本會不太一樣，不過，至少都需要有上面的幾樣套件就是了！
      就是 gd, zlib, libpng 這三個套件啦！有的 distribution 還會有 xxx-devel
      之類的名稱，那個也需要安裝喔！如果發現沒有安裝的話，請拿出您的原版光碟片，
      將他 mount 上之後，好好的將他搜尋一下，並且安裝上去吧！很重要，一定要
      安裝這些套件之後，底下的動作才會成功呢！

      2. 開始安裝 fly 這支程式
      [root @test root]# cd /usr/local/src
      [root @test src]# tar -zxvf /root/fly-2.0.0.tar.gz
      ....會產生一個 fly-2.0.0 的目錄
      [root @test src]# cd fly-2.0.0
      [root @test fly-2.0.0]# make
      註：
      ....如果沒有出現底下的字樣那麼就是成功了！
      /usr/bin/ld: cannot find -lttf (或者是 ljpeng ...)
      collect2: ld returned 1 exit status
      make: *** [fly] Error 1
      如果是出現 warning 的話，還不打緊，因為僅只是警告而已，所以問題不大，
      但是如果出現上面的字樣時，就會連帶出現第三行的 Error ，那就是編譯失敗了
      果真如此的話，請先尋找一下，以上面為例，找不到 lttf ，而 lttf 其實
      就是 libttf 檔名啦！(所以 ljpeg 就是 libjpeg )所以給他下達：
      loate libttf
      /usr/lib/libttf.so.2
      嗯！找到了！其實是 libttf.so.2 啦！如果你的系統跟我的不同，有可能檔名
      會不一樣，所以請依照你的螢幕顯示的訊息來下達指令喔！但是這個編譯程式
      有點笨，不認識這個檔案，所以我們要欺騙他一下，就是下達：
      ln -s /usr/lib/libttf.so.2 /usr/lib/libttf.so
      這樣就可以啦！如果還有找不到的檔案，同樣的方式給他連結一下即可！然後
      再次的給他執行一次 make 即可！最後會產生一個檔名為 fly 的執行檔，
      如果沒有產生執行檔，那就是有問題啦！請趕緊再回頭去查一查是否有某些
      套件沒有安裝，或者沒有依照上面的方式建立連結檔案！

      [root @test fly-2.0.0]# cp fly /usr/local/bin
      我們先將 fly 這支程式給他複製到 /usr/local/bin 這個目錄去，可以直接使用
      這樣就 OK 了！

      3. 開始安裝 pwebstats 套件
      [root @test root]# cd /usr/local/src
      [root @test src]# tar -zxvf /root/pwebstats-1.3.8.tar.gz
      此時會產生 /usr/local/src/pwebstats-1.3.8 這個目錄，這目錄裡面
      已經是可以執行的資料了，不需要進行任何的編譯，所以我們將他直接移動到
      /usr/local/ 裡面去！
      [root @test src]# mv pwebstats-1.3.8 /usr/local/pwebstats
      [root @test src]# cd /usr/local/pwebstats
      [root @test pwebstats]# vi pwebstats <==這個是主要的執行檔！
      由於我們的 perl 這個程式語言的執行檔是放置在 /usr/bin/perl ，但是
      這支程式預設是書寫為：
      #!/usr/local/bin/perl
      將上面改寫為
      #!/usr/bin/perl
      這樣就可以了！繼續下一步！

      4. 開始設定 squid 的輸出輸入參數：
      前提要件：
      a. 我的 WWW 主頁目錄在 /var/www/html
      b. 我的 pwebstats 整個資料庫放置在 /usr/local/pwebstats
      c. 我的 squid 登錄檔放置在 /usr/local/squid/var/logs/access.log.0
      d. 我的 squid 的執行檔為 /usr/local/squid/sbin/squid
      e. 我的 pwebstats 輸出的資料放置在 /var/www/html/pwebstats
      f. 我的 fly 是放在 /usr/local/bin/fly
      [root @test pwebstats]# mkdir /var/www/html/pwebstats<=請依您的主機而定
      [root @test pwebstats]# cd /usr/local/pwebstats/conf
      [root @test conf]# vi squid-proxy.conf <==這個就是主要的設定檔！
      # 底下請填寫你的主機的『暱稱』！
      server:My_Proxy_Server
      # 這個是顯示在網頁上面的標題內容！
      Server_header:我的代理伺服器
      # squid 登錄檔放置的完整檔名
      logfile:/usr/local/squid/var/logs/access.log.0
      # 我們使用的就是 squid 的登錄檔啊！所以這裡不需改變
      logtype:squid
      # 剛剛提到的，網頁資料要輸出到底下的目錄
      outdir:/var/www/html/pwebstats
      # 一些圖像檔案的預設目錄，這裡我們使用 pwebstats 提供的目錄！
      templates:/usr/local/pwebstats/templates
      # 嗯！我們就天天來進行一次吧！可以用 weekly 或 daily
      interval:daily
      # 是否在執行的過程中給他輸出訊息呢？好吧！
      verbose:true
      # fly 放置的目錄，剛剛我們移動的目錄啊！
      fly_prog:/usr/local/bin/fly
      # 本機端的要求，這裡可以不用設定喔！
      local_patt:
      # 列出幾部 client 電腦？我給他來個 50 部好了！
      host_threshold:50
      # 列出幾部 Server (被要求資料者)，還是給個 100 部吧！
      remote_host_threshold:100
      # 統計的次數，給他 100 次好了！
      item_threshold:100
      # 做多少個 domain 的分析？給他 15 個就夠多了！
      domain_threshold:15
      # 底下保留預設值即可！ (最後面的 dns 反查可以啟動！)
      exclude_reqs:true
      #complete_exclude_host:
      #complete_exclude_url_patt:
      #complete_exclude_user:
      dns_lookup:true
      # 事實上，只要上面粗體字的地方寫對就好了！其他的保留預設值即可！

      5. 測試執行一次看看：
      [root @test conf]# /usr/local/squid/sbin/squid -k rotate
      上面這個動作會將 squid 的登錄檔進行 logrotate 的動作喔！就會更新了
      /usr/local/squid/var/logs/access.log.0 這個檔案啦！
      [root @test conf]# /usr/local/pwebstats/pwebstats -c \
      > /usr/local/pwebstats/conf/squid-proxy.conf
      .....(略)......
      -- Reading in log file /usr/local/squid/var/logs/access.log.0:
      The logfile has 27 entries.
      Processing...
      0% 50% 100%
      |-----------------------|------------------------|
      ##################################################
      Finished.
      .....(略)......
      呵呵！這樣就是成功啦！！！！

      6. 將每天執行的指令寫成 scripts 吧！
      我將他寫在/usr/local/pwebstats/pwebstats.sh 這個檔案當中喔！
      [root @test conf]# vi /usr/local/pwebstats/pwebstats.sh
      #!/bin/bash
      /usr/local/squid/sbin/squid -k rotate
      sync; sleep 5s
      /usr/local/pwebstats/pwebstats -c /usr/local/pwebstats/conf/squid-proxy.conf
      [root @test conf]# chmod 755 /usr/local/pwebstats/pwebstats.sh
      [root @test conf]# vi /etc/crontab
      加入底下這一行吧！
      59 2 * * * root /usr/local/pwebstats/pwebstats.sh >/dev/null 2>&1

    很簡單吧！這樣就安裝完畢了！不過，由於我們安裝的 fly 可能有點問題啦！就我的系統來說，這個 fly 總是編的怪怪的∼如果您的 fly 無法編譯成功的話，那麼直接由鳥哥的私房菜提供的檔案來直些下載使用算了！ http://linux.vbird.org/download 找一下 fly 的 binary ，下載完畢之後，請記得：

      gzip -d fly.gz
      chmod 755 fly
      mv fly /usr/local/bin

    這樣就可以了！而剛剛我們不是有執行過一次嗎？你的登錄資料會被放置在 /var/www/html/pwebstats 這個目錄當中！假如我的首頁就是 /var/www/html/ 的話，那麼我的網址列輸入 http://myIP/pwebstats 就可以看到類似下圖：

    在按下了『Day 1』之後，會出現如下的畫面：

    呵呵！更詳細的內容您就可以自行看看囉！加油的啦！！

  • 末端資料分析 sarg

    除了上面介紹的 pwebstats 之外，其實還有一套相當棒而且功能相當強悍的分析軟體，那就是 Squid Analysis Report Generator ( Squid 分析報告製作者)，他的官方網站在：http://web.onda.com.br/orso/sarg.html，他的原理相當的簡單，就是將 logfile 拿出來，然後進行一下解析，依據不同的時間、網站、與熱門網站等等來進行資料的輸出，由於輸出的結果實在是太詳細了！所以.....呵呵！如果你是老闆的話，用這個軟體會讓你『愛不釋手』啊！因為每個人的每個小動作都會被記錄下來，我的天吶！當我第一次看到這個分析的畫面時，真的給他嚇了老大一跳得說∼因為連每個 IP 在『每個小時所連上的每個網站資料』都有紀錄∼∼害怕了吧∼

    不過，有優點就有缺點啦！怎麼說呢？因為 SARG 功能太強大了，所以記錄的『資料量』就實在是多了點，如果您的 Proxy 網站屬於那種很大流量的網站時，那麼就不要使用『日報表』，也就是每天產生一份報表的那種方式！那麼由於資料一天可能會有幾 MB 的資料，一兩個月還沒有關係，如果記錄了幾年，那麼光是這些記錄就會花掉好幾 GB 的硬碟空間了∼此外，也可以使用『覆蓋舊有資料』的方式不要留存舊資料，這樣也可以節省硬碟的空間啦！

    這個 SARG 軟體已經出到 1.4 版，更好的是，他支援『多國語系』呢！目前鳥哥已經翻譯了一部分的資料，希望能對大家有點幫助啊！對於這個套件，你可以到官方網站上下載最新的版本 ( http://web.onda.com.br/orso/sarg.html ) ，而鳥哥這裡也有提供啦！我提供的版本是 1.4 的( 在 2003/03/16 釋出的版本 )，已經經過了 patch (套件修補) 的動作，並且加入中文化的語言檔案，所以直接下載就有中文顯示囉！請到檔案下載中心下載：

    • http://linux.vbird.org/download#squid_ap

    整個安裝與執行的過程很簡單的！我們來試看看吧！(註：假設您已經將 sarg-1.4.taiwan_big5.tar.gz 放置在 /root 底下了！)：

    # 1. 解壓縮：
    [root @test root]# cd /usr/local/src
    [root @test src]# tar -zxvf /root/sarg-1.4.taiwan_big5.tar.gz
    ....(略).....
    這個時候會產生一個名為 sarg-1.4 的目錄出來！

    # 2. 設定、編譯與安裝
    [root @test src]# cd sarg-1.4
    [root @test sarg-1.4]# mkdir /usr/local/sarg
    [root @test sarg-1.4]# ./configure --prefix=/usr/local/sarg \
    > --enable-mandir=/usr/local/sarg/man1 \
    > --enable-bindir=/usr/local/sarg/bin \
    > && make && make install
    這樣可以快速的設定、編譯與安裝，一次完成！
    安裝的資料當中：
    a. 設定檔 /usr/local/sarg/sarg.conf
    b. 執行檔 /usr/local/sarg/bin/sarg
    c. 說明檔 /usr/local/sarg/man1/sarg.1

    # 3. 額外設定 ( 說明文件的路徑 )
    [root @test root]# vi /etc/man.config (有時為 man.conf 檔名不同！)
    新增加這一行
    MANPATH /usr/local/sarg

    相信嗎？這樣就安裝完畢了！很快速吧！接下來你要做的就是設定囉！設定之前請先注意您的相關資料，以我為例，我的相關資料為：

    • 登錄檔使用 /usr/local/squid/var/logs/access.log.0 這一個經過 rotation 的檔案；
    • 計算的暫存檔放置在 /tmp 底下；
    • 我的 SARG 輸出的首頁放置在 /var/www/html/sarg 這個『目錄』之中；
    • 我想要讓我的網頁以 big5 的字元編碼格式輸出！

    這個時候我只要修改一個檔案，也就是 /usr/local/sarg/sarg.conf 即可，內容有點像這樣：

    [root @test root]# mkdir /var/www/html/sarg
    [root @test root]# vi /usr/local/sarg/sarg.conf
    # 這個檔案是 sarg 的設定檔，裡面已經將整個設定參數講的很清楚了，
    # 你可以依照你的情況來調整這個檔案的參數，無論如何，這個檔案裡面
    # 應該至少要有底下這幾個資料，其他的請自行使用喔！
    language Taiwan_big5
    access_log /usr/local/squid/var/logs/access.log.0
    title "Squid 使用狀態報告"
    temporary_dir /tmp
    output_dir /var/www/html/sarg
    overwrite_report no
    mail_utility /bin/mail
    topsites_num 100
    exclude_codes /usr/local/sarg/exclude_codes
    max_elapsed 28800000
    charset big5

    [root @test root]# /usr/local/sarg/bin/sarg
    SARG: 製作報告完成於 /var/www/html/sarg/2003Apr10-2003Apr11

    試跑一下，嘿嘿！已經成功的輸出資料囉！這個時候，請在您的瀏覽器上面輸入 http://your.domain.or.IP/sarg 即可看到剛剛跑出來的資料了！很棒吧！好了，我總不能常常這樣手動的跑分析資料吧？OK！那麼怎麼將這個動作放到 crontab 當中呢？！呵呵！我們底下寫了一支 script 來同時跑 pwebstats 及 SARG 這兩個玩意兒∼這支 script 是長這樣的：

    1. 建立這支程式：我將他取名為 /usr/local/squid/etc/squid.logrotate
    [root @test root]# vi /usr/local/squid/etc/squid.logrotate
    #!/bin/bash
    # 這支程式是要寫來做為 squid 的 log files analysis 之用的！
    # 執行的方法為 crontab 囉！
    # vi /etc/crontab 加入底下這一行：
    # 59 23 * * * root /usr/local/squid/etc/squid.logrotate

    # 1. parameters settings
    PATH=/sbin:/bin:/usr/sbin:/usr/bin

    # 2. stoping and rotating squid
    sleep 50s
    /usr/local/squid/sbin/squid -k rotate
    /usr/local/squid/sbin/squid -k shutdown

    # 3. pwebstats processing
    /var/www/html/pwebstats/pwebstats -c \
    /var/www/html/pwebstats/conf/squid-proxy.conf \
    > /dev/null 2>&1

    # 4. sarg processing
    /usr/local/sarg/bin/sarg > /dev/null 2>&1

    # 5. starting squid
    sleep 11s
    su nobody -c "/usr/local/squid/bin/RunCache &" > /dev/null 2>&1

    # 2. 改變檔案權限與加入 crontab 排程當中！
    [root @test root]# chmod 744 /usr/local/squid/etc/squid.logrotate
    [root @test root]# vi /etc/crontab
    加入這一行：
    59 23 * * * root /usr/local/squid/etc/squid.logrotate

    這一支程式有什麼特點呢？由於我是在 23:59 開始執行，而且執行時期先等待 (sleep) 50 秒鐘，且工作完畢後再等 10 秒鐘，也就是說，我的 squid 的 log 檔案一定會是以天為單位來分隔，所以我們所看到的資料就會『一」天一天』的顯示，而不會跨了不同的兩天了！我是比較喜歡這樣啦！但是每個人的觀點不同，您可以自由調配喔！

  • 防火牆的規劃

    事實上， Proxy 本身就已經可以做為一個防火牆啦！為何還需要針對 Proxy 來進行防火牆的規劃？話是這樣沒錯啦！但是我們的 Proxy 是開放 3128 與 3130 這兩個 port 啊！您總不能這兩個 port 沒有開放吧！所以囉，要讓您的 Proxy 可以對外面開始服務，就需要啟用 3128 這個標準的 Proxy port 囉！所以需要在您的防火牆 scripts 當中加入這一行：

      /sbin/iptables -A INPUT -p TCP -i eth0 --dport 3128:3130 -j ACCEPT

    一般來說，這樣就可以正常的啟動 Proxy 的服務了！那麼至於 Proxy 本身提供的防火牆內容呢？呵呵！就利用 acl 配合 http_access 就能夠管制使用者的使用空間了！真是相當的具有彈性啊！ ^_^

  • NAT 與 Proxy 透過 transparent proxy 設定加快網路傳輸

    讓我們現在來想像一個連線狀態，就是你有一整組內部網路，而這個內部網路都是透過 NAT 主機連線出去的。那麼我們談過，就是在一個內部網域很大的情況下，使用 Proxy 是一個很不錯的選擇，因為至少他可以減輕頻寬的負荷啊！OK！那麼我們就架設 Proxy 好了，不過，遺憾的是，架設 Proxy 的時候，也要使用者在瀏覽器上面設定了你架設好的瀏覽器才有用啊！否則那部 Proxy 沒有人使用的話，架了也是白搭！好了，那麼有沒有辦法在『使用者不需要在瀏覽器上面進行任何設定，就可以實現以 Proxy 幫助使用者捉取 WWW 資料 』呢？當然有啦！那就是 Transparent Proxy 啦！也有人翻譯成『通透式代理伺服器』，為什麼這麼翻譯我也不曉得？？不過，他的原理是這樣的：

    • 當使用者經過 NAT 伺服器來連線進入 Internet 時，假如使用的 Internet 協定為 80 (也就是 WWW) ，那麼就將這個要求交給 Proxy 來工作，以達到代理伺服器的功能。

    呵呵！也就是說，當使用者是經過 NAT 主機連線出去時，只要讓 NAT 主機發現『咦！你是要去捉 WWW 的資料對吧！好！那麼這個動作由 Proxy 主機幫你搞定！』如此一來，使用者根本就不需要在瀏覽器上面設定 Proxy 的相關資料，因為這個動作是『由 NAT 主機自己決定的』，所以只要在 NAT 主機上面設定妥當即可，使用者不必設定任何資料呢！呵呵！真是不錯！那麼要怎麼進行呢？只要兩個步驟即可：

    1. 設定 Proxy 主機：
      設定 proxy 主機當然就是要又修改 squid.conf 囉！而這個設定相當的簡單喔！只要幾行就可以搞定：

      [root @test root]# vi /usr/local/squid/etc/squid.conf
      # 這裡請填入你的 Proxy 主機名稱 與 port ！
      httpd_accel_host vbird.adsldns.org
      # 因為我們是要進行 WWW 的資料快取，所以 port 當然就是 80 囉！
      httpd_accel_port 80
      # 這個很重要！因為設定 httpd_accel_host 之後， cache 的設定會自動被終止，
      # 必須要加上這個設定為 on 之後，才能提供 cache 的功能！
      httpd_access_with_proxy on
      httpd_accel_uses_host_header on

      [root @test root]# /usr/local/squid/sbin/squid -k reconfigure

      總共就是這四行啦！這樣就設定好一個 squid 的 transparent proxy 的功能囉！

    2. 設定 NAT 主機的 port map ：
      再來讓我們到 NAT 主機上面看看先，因為需要將 80 這個 port 交給 Proxy 的 3128 來幫忙協助，所以你的防火牆 script 必須要加入這一段才行：

      iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.0.0/24 \
      --dport 80 -j REDIRECT --to-ports 3128

      注意一下，那個 eth0 是『你的 NAT 對內的網路卡裝置代號』，至於 192.168.0.0/24 則是你的內部網域，請依照你的主機實際狀態來設定喔！

    完全不需要懷疑！這樣一來，您的 client 端完全不需要進行任何的設定，立刻就可以使用 Proxy 的好處囉！很不錯吧！呵呵！

  • squid 的注意事項

    使用代理伺服器後，瀏覽國外的網頁應該是可以變快的！但是，你要小心幾件事：

    1. 若 squid 內設定的使用空間滿了，則 squid 將不會運作！
    2. 若 squid 的紀錄檔太大了，則工作效率會變慢！

    由於我們已經安裝的 pwebstats 了，並且已經設定好了 squid -k rotate 的工作，所以第二個問題並不嚴重，嚴重的可能會是第一個問題！所以有可能我們會自行手動的刪除 Proxy 的快取目錄，如何刪除呢？雖然上面已經提過了一些注意事項，這裡我們再次的說明吧！

    1. 停止 squid
    [root @test root]# kill -9 `cat /usr/local/squid/var/logs/squid.pid`
    (可能會重複做 5 次左右才會完全砍掉！)

    2. 刪除暫存目錄 (這個目錄請依您的系統而定！)
    [root @test root]# rm -rf /usr/local/squid/var/cache1
    [root @test root]# mkdir /usr/local/squid/var/cache1

    3. 重建快取目錄並重新啟動
    [root @test root]# /usr/local/squid/sbin/squid -z
    [root @test root]# su nobody -c "/usr/local/squid/bin/RunCache &"

    其他的建議：

    1. 關於上層代理伺服器：用 cache_peer 設定上層代理伺服器的數目不要太多，只要 2-5 個之間就好了，而且上層代理伺服器一定要找距離你最近，並且具有較大頻寬的主機，如果是在台南，那 proxy.ncku.edu.tw 就是不錯的主機，或者向您的 ISP 詢問喔；

    2. 關於暫存目錄的設定：以 cache_dir ufs 設定的目錄，最好是單獨割出來的約 1-2 GB 的硬碟槽，以我為例，我將另外一台主機的 30GB 的硬碟割兩槽給 proxy 用，而每一槽只有 2GB ，分別命名為 proxy1 與 proxy2 ，則可以寫成

        cache_dir ufs /proxy1 2000 16 256
        cache_dir ufs /proxy2 2000 16 256

      由於分成兩槽來存取，所以整體效率上會比較好，但這是針對一般比較大型的代理伺服器的設定了，我們這個小主機就不用如此設定(但是效率真的有差哩！)。

    3. 善用 acl, always_direct, never_direct：就如同上面提到的，因為你的目的不同，所以會使用到不同的 proxy 作為你的上層代理伺服器，如果你發現你的上層代理伺服器無法針對你常上的網站來求取資料時，就將那個網站加入你的 always_direct 吧！另外，也可以使用 cache_peer_access 來處理喔！

    4. 在 ./configure 的時候增加 --enable-async-io=80 這一個指令：基本上，增加這個指令之後，將可以使您的磁碟多一個 type ，亦即是 aufs ，這個 type 的速度較快！
重點回顧
  • 代理伺服器 ( Proxy ) 最大的功能是在代理使用者向 Internet 要求 Web page 的資料，同時達成 Web pages 的快取記錄 (Cache) ，以達到假性的頻寬節省目的；此外，還可以額外的達成防火牆的功能；
  • 目前 Unix Like 的機器中，做為 proxy 功能的伺服器軟體幾乎都是使用 squid ，而 squid 僅需要設定 squid.conf 這個設定檔即可使用；
  • 設定 Proxy 時，如果能以頻寬更大的上層 Proxy 來幫助，將有助於 Client 端瀏覽速度的提昇；
  • 以防火牆的功能來說， Proxy 使用應用層的方式來達成防火牆功能，至於 iptables 則是更為底層的 TCP/IP 分析的方式；
  • Proxy 對於硬體的要求較高，尤其是硬碟的 partition 與記憶體，一般來說，一個 cache 目錄最好就是一個 partition ，而一個 cache partition 最好容量在 2-4 GB 之間即可；
  • transparent proxy 的功能就是可以讓 client 端不需要設定瀏覽器的 proxy 功能，即可進行 proxy 的工作；
參考資源
  • 優客筆記本：http://turtle.ee.ncku.edu.tw/~tung/proxy/
  • 台北市教育網路中心：http://www.tp.edu.tw/document/squid/index.files/frame.htm
  • squid 官方網站：http://www.squid-cache.org/
  • squid 說明文件計畫：http://squid-docs.sourceforge.net/
  • 中山大學資訊工程所：http://www.cc.nsysu.edu.tw/~lmj/Squid.files/frame.htm
  • 鷺江國小：http://proxy.lcps.tpc.edu.tw/
  • fly 官方網站：http://martin.gleeson.com/fly/index.html
  • pwebstats 官方網站：http://martin.gleeson.com/pwebstats/index.html
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 請說明 Proxy 伺服器的功能為何？
    答：
      Proxy 伺服器的功能在於代理來自 client 的上網需求，並向目地端主機送出 client 端的要求，以協助 client 端取得所需要的瀏覽網頁。此外，並可將網頁資料進行 cache 的功能。

  • 試說明為何 Proxy 伺服器可以提昇網域之內的網路安全性？
    答：
      由於 Proxy 伺服器通常架設之後，會讓網域僅有一個 Proxy 主機的出口，亦即單點對外的伺服器，可以強化網路的管理！
簡易 Proxy Server 架設
2001/??/??：第一次完成日期，其實已經忘記了∼
2001/11/09：加入增加 Proxy 效能的方法，就是使用多顆硬碟做成的資料儲存方式！
2003/04/04：完成大幅度的改寫動作！加入了完整的 Proxy 說明，與 pwebstats 的架設！
2003/04/11：完成了另一個末端分析的強大軟體 SARG 分析套件！
2002/ 01/01以來統計人數


簡易 Network Information Service, NIS Server 架設
最近更新日期：2003/05/06

有沒有想過，如果我有十部 Linux 主機，這十部主機僅負責不同的功能，事實上，所有的主機帳號與對應的密碼都相同！那麼我是將帳號與密碼分別設定置在十部電腦上面，還是可以透過一部主機做為帳號管理的功能，然後其他的主機只要當用戶用登入時，就必須要到管理帳號的主機上面確認其帳號與密碼呢？哪一個比較方便而且靈活？當然是找一個帳號管理的主機比較方便的多啦！如果有使用者要修改密碼，不必要去到十部主機修改密碼啦！只要到主要管理主機去修改，其他的主機根本就不需要更動！哈哈！輕鬆又愉快呢！這個功能的達成有很多的方式，在這裡，我們介紹一個很簡單的方式，那就是 Network Information Service 這個 NIS 伺服器的架設啦！

原理：
    ：什麼是 NIS 與 NIS 的主要功能
    ：NIS 的運作流程
    ：NIS 與 RPC 的關係
    ：NIS Server 的 master 與 slave 架構
套件安裝：
Server 端設定：
    ：NIS Server 的結構
    ：NIS Server 設定流程
Client 端設定：
    ：NIS Client 的結構
    ：NIS Client 的設定流程
    ：NIC Client 端檢驗 NIS 設定：yptest, ypwhich, ypcat
    ：修改使用者密碼 ( 需要有 root 身份 )： yppasswd, ypchfn, ypchsh
主機進階設定：
    ：NIS 與 NFS 的結合設定
    ：防火牆的規劃
重點回顧
參考資源
本章習題練習
原理：
    在一個大型的網域當中，如果有多部 Linux 主機時，萬一要每部主機都設定相同的帳號與密碼的設定，還真是囉唆。所以，適時的使用一部主要主機 ( master server ) 管理網域中的所有帳號，其他的主機則使用這部主要主機提供的帳號與密碼來達成讓使用者『登入』的作用即可！這樣的功能有很多的伺服器軟體可以達成，這裡我們要介紹的則是 Network Information Services, NIS server 這個伺服器軟體喔！

  • 什麼是 NIS 與 NIS 的主要功能：

    通常我們都會建議，一部 Linux 主機的功能越簡單越好，也就是說，一部 Linux 就專門進行一項服務，這樣有許多的好處，這包含功能簡單所以系統資源得以完整運用，並且在發生入侵或者是系統產生狀況的時候，也比較容易追查問題所在。因此，一個公司內部常常會有好幾部 Linux 主機，有的專門負責 WWW 、有的專門負責 Mail 、有的專門負責 SAMBA 等等的服務。不過，這樣雖然有分散風險、問題追蹤容易的好處，不過，由於主機數量多了，然而因為是同一個公司裡面，所以，事實上所有的 Linux 主機的帳號與密碼都是一樣的！哇！如果公司裡面有 100 的人的話，那麼我們就需要針對這麼多部的主機去設定帳號密碼了！而且，如果未來還有新進員工的話，呵呵！那麼光是設定密碼就會使系統管理員抓狂了！

    這個時候，如果我們換一個角度來思考：如果我設計了一部專門管理帳號與密碼的主機，而其他的 Linux 主機當有用戶端要登入的時候，就必須要到這部管理密碼的主機來查尋使用者的帳號與密碼，如此一來，哈哈！我要管理所有的 Linux 主機的帳號與密碼，只要到那部主要主機上面去進行設定即可！包括新進人員的設定，反正其他的 Linux 主機都是向他查尋的嘛！沒錯！真是好∼這個就是 Network Information Service, NIS 主機的主要功能啦！

    事實上， Network Information Service 最早應該是稱為 Sun Yellow Pages ( 簡稱 yp )，也就是 Sun 這家公司出的一個名為 Yellow Pages 的伺服器軟體，請注意， NIS 與 YP 是一模一樣的咚咚喔！這個 Yellow Pages 名字取的真是好！怎麼說呢？知道黃頁( Yellow Pages )是什麼嗎？沒錯！就是我們家裡的電話簿啦！今天如果你要查尋一家廠商的電話號碼，通常就是直接去查黃頁上面的紀錄來取得電話號碼啊！而這個 NIS 也一樣，當使用者要登入時， Linux 系統就會到 NIS 主機上面去找尋這個使用的帳號與密碼資訊來加以比對，以提供使用者登入之用的檢驗啊！很棒吧！ ^_^

    那麼 NIS 主機提供了哪些資訊呢？還記得帳號與密碼放置在哪裡吧？！那麼 NIS 就是提供那些資料啦！有底下這些基本的資料提供給 Client 端喔：

    • 登入帳號/密碼/家目錄：就是 /etc/passwd 這個檔案
    • 群組資訊：就是 /etc/group 這個檔案
    • 相關主機名稱與IP：就是 /etc/hosts 這個檔案。

  • NIS 的運作流程

    事實上， NIS 的運作流程一點也不困難。如果在一個不是很大的網域當中，那麼大約會有一部 NIS Server ，並且同時有很多部的 NIS Client 才對！這裡我們不談 NIS Server 的 Primary 與 Slave 架構，僅談 NIS Server 與 NIS Client 的架構，整體架構有點像底下的圖示：

    就如同上面圖示的模樣。我們已經曉得 NIS 提供的其實就是 /etc/passwd, /etc/group 以及 /etc/hosts 等 ASCII 格式檔案的資訊，而 NIS Server 會將前述幾個 ASCII 檔案內容複製成為 DBM 資料庫格式的檔案，當用戶藉由個人電腦連線到 NIS Client 主機嘗試登入時， NIS Client 將會到 NIS Server 去查尋該用戶的帳號與密碼，以做為用戶登入驗證的依據。

    • NIS Server 將自己系統內的 /etc/passwd, /etc/group, /etc/hosts 等製作成為 DBM 的資料庫格式檔案；
    • NIS Client 若有用戶登入的要求時，會前往 NIS Server 搜尋資料庫裡面的資料做為驗證之用。
    • 每次更動 NIS Server 上面的用戶資料時，則 NIS Server 需要重新製作 DBM 資料庫檔案才行！

    這樣可以瞭解嗎？！很簡單的啦！不過，需要特別留意的是，我們需要設定的有：

    • NIS Server 端；
    • NIS Client 端。

    設定方面需要兩者的設定喔！

  • NIS 與 RPC 的關係

    還記得另一個 Sun 公司開發的伺服器軟體 NFS 嗎？他是由 RPC (Remote Procedure Call) 所統一管理的。呵呵！我們這個 NIS 也是使用 RPC 來管理的喔！所以囉！您最好回到前面 NFS 的章節去瞧一瞧 RPC 的一些相關說明比較好喔！那個 RPC 就是我們常常見到的 Portmapper 啦！也就是 sunrpc ( port 111 ) 囉！在 NIS 裡面，我們不但需要啟動 portmap ，還需要啟動另一個玩意兒，那就是由 super daemon 管理的 time 與 time-udp 這兩個寶貝蛋了！嗯！底下我們將會來探討一下各個套件囉！

  • NIS Server 的 master 與 slave 架構

    剛剛我們僅提到只有一部 NIS Server 在整個網域之中，這是一般比較小型的網域常見的方法。萬一，如果我們的網域裡面有幾乎 100 部以上的主機呢？而且每一部的流量還真的很大的時候，這個時候，只有一部 NIS Server 可能無法提供快速的資料查尋與回應的狀態！這個時候就需要 NIS Sever 的 master 與 slave 的架構了。

    還記得在 DNS 主機架設當中，我們曾經提過關於 master 與 slave 的關係吧？！就是 slave 主要是藉由將來自 master 主機的資料加以更新到自己的資料庫當中，並且提供與 master 相同的查尋功能！這個 NIS 的 master 與 slave 架構則完全相同！

    • NIS Server 的 master 先將自己的帳號、密碼相關檔案製作成為資料庫檔案(database file)；
    • NIS Server 的 master 將自己的資料庫檔案傳送到 slave 上面；
    • NIS Server 的 slave 接收來自『信任的 NIS Server master 主機』的資料後，更新自己的資料庫，使自己的資料庫與 master 主機的資料同步；
    • 網域當中的所有 NIS Client 查尋 NIS Server 時，會找尋『最先回應的那一部 NIS 主機的資料庫內容』。

    所以，我們可以知道的是，NIS 的 master 與 slave 架構主要在分散查尋 NIS 時候的主機負荷，因此，除非您的網域真的很大，否則是沒有必要架設 NIS Slave 與 master 的架構的啦！底下我們沒有架設 master 與 slave 喔！只有一部主要的 master 而已啦！
套件安裝
    基本上， NIS 建議直接使用原版光碟上面給我們的 RPM 來安裝即可！但是需要安裝哪些套件呢？您至少需要底下幾個套件才行：

    • yp-tools ：提供 NIS 相關的查尋指令功能
    • ypbind ：提供 NIS Client 端的設定套件
    • ypserv ：提供 NIS Server 端的設定套件
    • portmap ：就是 RPM 一定需要的資料啊！

    我是在 Red Hat 系統上面使用的設定，所以檔名是這樣的一個模樣，你可以使用『 rpm -qa | grep yp 』來檢查一下是否真的有安裝這些個套件才行！不過，為什麼 NIS Server 的套件名稱會是 yp 呢？還記得我們在上面提到的資訊嗎？ NIS 最早的名稱是 Sun Yellow Pages ，所以囉，套件名稱才會是 yp 啊！ ^_^！這樣好記多了吧！閒話不多說，馬上來進行設定吧！
Server 端設定：
    終於來到了設定的地方了， NIS 的設定與 NFS 的設定有點小小的相同之處，就是他的設定『粉簡單！』的啦！架設他吧！

  • NIS Server 的結構

    NIS Server 主要以 ypserv 這個套件提供的資料來進行設定的，他主要的內容有：

    • /etc/ypserv.conf ：就是主要的設定檔了
    • /usr/sbin/ypserv ：主要的服務(daemon)執行檔
    • /usr/sbin/rpc.yppasswdd：RPC 的服務囉！
    • /usr/sbin/rpc.ypxfrd ：同樣的， RPC 的服務囉！
    • /usr/lib/yp/ypinit ：建立 NIS 資料庫的執行程式

    所以，事實上我們最重要的就是設定 ypserv.conf 這個檔案而已啦！至於 RPC 的設定，就直接啟動他即可！另外，還有 yp-tools 會提供的相關資料喔：

    • /usr/bin/yppasswd ：更改你在 NIS database (NIS Server 所製作的資料庫) 的密碼
    • /usr/bin/ypchsh ：同上，但是是更改 shell
    • /usr/bin/ypchfn ：同上，但是是更改一些使用者的訊息！

  • NIS Server 設定流程

    開始設定吧！在我的系統當中，假定我的網路狀況如下：

    • 網域為 192.168.10.0/24
    • NIS Server 的 IP 為 192.168.10.30，對應的主機名稱為 server.cluster
    • NIS 的領域名稱設定為 cluster

    在 NIS Server 端以 root 身份登入後，進行下面的工作：

    1. 啟動 portmap 並設定開機時啟動：
      這個應該不難吧！使用：
      [root @test root]# /etc/rc.d/init.d/portmap
      [root @test root]# netstat -tl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 *:sunrpc *:* LISTEN
      如果看到 sunrpc 的話，就表示啟動成功了！
      [root @test root]# chkconfig --level 35 portmap on
      上面這一行在設定 portmap 在 run-level 為 3, 5 的時候就開機時啟動！
      很簡單吧！這樣 portmap 就啟動了！

    2. 啟動 time 與 time-udp ：
      由於 time 與 time-upd 是在 NIS 運作時所需要的 daemon ，所以也必須要啟動他啦！啟動的方式也很簡單，就是利用 xinet 這個 super daemon 來進行即可！
      [root @test root]# vi /etc/xinetd.d/time
      # 找到底下這一行：
      disable = yes
      # 將他改成
      disable = no
      # 儲存後離開
      [root @test root]# vi /etc/xinetd.d/time-udp
      # 同樣的將 disable = yes 改成 disable = no 即可！

      [root @test root]# /etc/rc.d/init.d/xinetd restart
      [root @test root]# netstat -utl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 *:time *:* LISTEN
      tcp 0 0 *:sunrpc *:* LISTEN
      udp 0 0 *:time *:*
      udp 0 0 *:sunrpc *:*
      注意喔！目前至少也要有上面四個 LISTEN 的 port 才行喔！分別是 UDP 與 TCP 封包的啦！

    3. 建立 NIS 的領域名稱 ( nisdomainname )
      在 NIS 的系統當中，他的領域名稱 (domain name) 是與 DNS 沒有絕對關係的，由於這個領域名稱會常被使用到，因此我們需要將他建立起來！建立起來的方法很簡單，直接執行一個指令，並修改一個檔案即可！
      1. 建立 NIS 的領域名稱 (我這裡是設定為 cluster )：
      [root @test root]# nisdomainname cluster
      [root @test root]# vi /etc/rc.d/rc.local
      # 將底下這一行加入這個檔案的最後一行內：
      /bin/nisdomainname cluster

      2. 設定好網路參數：
      [root @test root]# vi /etc/sysconfig/network
      # 加入底下這一行：
      NISDOMAIN=cluster

    4. 設定 ypserv 的設定檔： ypserv.conf
      這個設定檔的內容其實也是很簡單，大概只有幾行而已，設定的主要語法為：
      <設定項目>:<設定項目的值>
      我們先談一談他裡面的幾個設定細項：
      [root @test root]# vi /etc/ypserv.conf
      files: 30
      # 這說的是『有多少資料庫檔案(database file)會被先讀進快取記憶體當中』
      # 的意思，一般來說， 30 是已經很足夠的數值了，不需要更動他；

      trusted_master: your.master.servers.name
      xfr_check_port: yes
      # 上面這兩個都僅與 Master + Slave 架構有關的設定值，一般來說，
      # 只有一部主要 NIS Server 的系統中是用不到這兩個設定值的！
      # 如果你的 NIS 是 slave 的架構，那麼需要指定一部 master 做為資料庫內容的
      # 同步時候的主機，那就是 trusted_master 的設定內容囉！
      # 如果沒有 master/slave 架構時，那就不需要 trusted_master 這個設定了！
      # 至於 xfr_check_port 則是指定 master 與 slave 是否都要以 < 1024
      # 以下的 port 來進行溝通的訊息！通常預設就是 yes ，不需要更動他！

      # <主機名稱/IP>:<網域名稱>:<資料庫類別>:<安全性>
      # 這個是這個檔案裡面最重要的部分了！主要在設定安全性的方面，
      # 可以設定多行，而是否能夠通過的規則是『一行一行檢查』的方式！
      # 所以這裡的設定應該是：先開放要開放的網域，然後全部都關閉！
      # 先談一談各個相關的項目：
      # 1. 主機名稱/IP：這裡可以這樣設定：192.168.1.0/255.255.255.0
      # 2. 網域名稱：通常都設定成為 * 即可！
      # 3. 資料庫類別：可以使用 * 來表示所有的資料庫！
      # 4. 安全性：主要有三種參數：
      #　　　　　　none ：無論如何就是可以無條件進入本機；
      #　　　　　　port ：僅允許 < 1024 以下的 port 進入；
      #　　　　　　deny ：無論如何就是關閉不讓人家登入主機！
      # 由於我是允許 127.0.0.0/255.0.0.0 以及 192.168.10.0/255.255.255.0 進入，
      # 其他的都關閉！所以我可以這樣設定：
      127.0.0.0/255.255.255.0 : * : * : none
      192.168.10.0/255.255.255.0: * : * : none
      * : * : * : deny
      # 但是因為 /etc/shadow 裡面的檔案總不好讓人看到吧！而又由於 Linux
      # 系統當中，只有 root 可以啟用 < 1024 以下的 port ，因此，更安全的設定，
      可以這樣做：
      127.0.0.0/255.255.255.0 : * : * : port
      192.168.10.0/255.255.255.0: * : * : port
      * : * : * : deny
      # 三行也就夠了！
      # 無論如何，如果您想要讓您的 NIS Server 運作的較為快速，並且安全性上面
      # 沒有太多的考量(內部網域時！)，那麼使用 none 是一個不錯的主意！

    5. 建立網路信任群組：
      這個 /etc/netgroup 檔案可以記錄在我們網域裡面被信任的群，這個檔案的內容當中，每一行都有三個欄位，分別以逗號『,』隔開，意義為：
      <host>,<user>,<domain>
      主機,使用者帳號,領域名稱
      事實上，如果這個檔案是『空的』的話，那麼代表著『全部的主機、帳號與領域名稱都接受』的意思，因為我們已經在 /etc/ypserv.conf 裡頭設定好了關於安全的項目了，所以這個檔案只要建立即可(本來是不存在的！)：
      [root @test root]# touch /etc/netgroup

    6. 啟動 ypserv 這個 daemon ，並且設定開機時啟動：
      好了！都設定完成之後，在接下來自然就是要啟動了！啟動有兩個 daemons ，啟動的方式為：
      1. 啟動囉！
      [root @test root]# /etc/rc.d/init.d/ypserv start
      [root @test root]# /etc/rc.d/init.d/yppasswdd start

      2. 觀察一下是否真的有動作？
      [root @test root]# rpcinfo -u localhost ypserv
      program 100004 version 1 ready and waiting
      program 100004 version 2 ready and waiting
      [root @test root]# rpcinfo -u localhost yppasswdd
      program 100009 version 1 ready and waiting
      這個 rpcinfo 就是在觀察與 RPC Server 有關的 program 目前的狀況！
      因此可以用他來觀察你的 ypserv 喔！

      3. 設定開機時啟動：
      # 你可以使用 ntsysv ，這裡我們使用 chkconfig 囉！
      [root @test root]# chkconfig --level 35 ypserv on
      [root @test root]# chkconfig --level 35 yppasswdd on

    7. 製作資料庫、並重新啟動 ypserv 與 yppasswd ：
      好了，既然 NIS Server 主要是要提供資料庫給大家參考用的，所以當然要製作資料庫囉！然後，我們又將這些資料庫讀入快取當中，所以資料庫製作完畢之後，一定要重新啟動 ypserv 與 yppasswdd 才行！
      1. 製作資料庫：
      [root @test root]# /usr/lib/yp/ypinit -m
      At this point, we have to construct a list of the hosts which will run NIS
      servers. server.cluster is in the list of NIS server hosts. Please continue to add
      the names for the other hosts, one per line. When you are done with the
      list, type a <control D>.
      next host to add: server.cluster
      next host to add: <==在這裡按下[ctrl + d]跳出
      The current list of NIS servers looks like this:

      server.cluster

      Is this correct? [y/n: y] y
      We need a few minutes to build the databases...
      Building /var/yp/cluster/ypservers...
      Running /var/yp/Makefile...
      gmake[1]: Entering directory `/var/yp/cluster'
      Updating passwd.byname...
      Updating passwd.byuid...
      Updating group.byname...
      Updating group.bygid...
      Updating hosts.byname...
      Updating hosts.byaddr...
      Updating rpc.byname...
      Updating rpc.bynumber...
      Updating services.byname...
      Updating services.byservicename...
      Updating netid.byname...
      Updating protocols.bynumber...
      Updating protocols.byname...
      Updating mail.aliases...
      gmake[1]: Leaving directory `/var/yp/cluster'
      server.cluster has been set up as a NIS master server.
      Now you can run ypinit -s server.cluster on all slave server.

      這個動作是每次修改使用者資料後一定要做的動作！，就是重新製作資料庫，
      然後並且需要重新啟動 ypserv 與 yppasswdd 喔！

      2. 重新啟動服務：
      [root @test root]# /etc/rc.d/init.d/ypserv restart
      [root @test root]# /etc/rc.d/init.d/yppasswdd restart

      這個動作的重點是在 /var/yp 這個目錄當中，製作了多個的等待 NIS Clients 查尋的資料庫！請注意的是，每次在 NIS server 上面更動使用者的資料時，一定需要重新做這個步驟喔！

    這樣 Server 的部分就設定妥當了！如果您還想要玩一玩 master 與 slave 的架構的話，那就請參考：
    NIS HOW-TO：http://www.linux-nis.org/nis-howto/HOWTO/index.html
Client 端設定
    設定完了 Sever 之後， NIS Client 也需要設定喔！( 註：在 NIS clients 主機記錄的登入者的資訊中，僅記錄 UID 大於 500 以上的使用者喔！因為小於 500 以下的 UID 都是預設給系統使用的，因此是預設不開放給 NIS 來查尋，自然也就不會被寫入 NIS 資料庫檔案當中了！ )

  • NIS Client 的結構

    還記得上面提過的，NIS Client 需要的套件是：

    • ypbind
    • yp-tools

    至少也要這兩個套件才可以喔！至於相關的設定檔為：

    • /etc/yp.conf ：設定 NIS Server 的主機名稱與領域名稱
    • /etc/hosts ：至少需要設定 NIS server 主機 IP 對應的主機名稱喔！
    • /etc/passwd ：指定需要查尋的是什麼；
    • /etc/nsswitch.conf ：指定要使用什麼 daemon 查尋帳號與密碼。

    大致上就是如此啦！我們要設定的資訊也就是如同上面的檔案囉！好！設定吧！

  • NIS Client 的設定流程

    請留意的是，底下的設定都是在 Client 端喔！不要在主機端作這些設定了！^_^

    1. 啟動 portmap 並設定開機時啟動：
      不論是 RPC Server 還是 RPC Client ，反正只要是 RPC 的相關服務要應用，就一定要有 portmap 的輔助才行！所以，啟動並設定開機時啟動吧！
      [root @client root]# /etc/rc.d/init.d/portmap
      [root @client root]# netstat -tl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address Foreign Address State
      tcp 0 0 *:sunrpc *:* LISTEN
      如果看到 sunrpc 的話，就表示啟動成功了！
      [root @test root]# chkconfig --level 35 portmap on
      上面這一行在設定 portmap 在 run-level 為 3, 5 的時候就開機時啟動！
      很簡單吧！這樣 portmap 就啟動了！

    2. 設定 NIS Server 的 IP 對應主機名稱：
      請看上面 Server 設定之前的假設，我的 NIS Server 的 IP 與主機名稱記錄在 Client 端的 /etc/hosts 上面：
      [root @client root]# vi /etc/hosts
      # 要有底下這一行喔！
      192.168.10.30 server.cluster

    3. 設定 NIS 的 domain 與 NIS 的主機：
      NIS Server 與 Client 的 NIS domain 一定要相同，所以我們必須要花一點時間來將這個咚咚搞定：
      1. 建立 NIS domain name：
      [root @client root]# nisdomainname cluster
      [root @client root]# vi /etc/rc.d/rc.local
      # 加入底下這一行：
      /bin/nisdomainname cluster
      [root @client root]# vi /etc/sysconfig/network
      # 加入底下這一行：
      NISDOMAIN=cluster

      2. 建立 NIS 查尋的主機名稱
      [root @client root]# vi /etc/yp.conf
      # 加入這兩行：
      domain cluster
      ypserver server.cluster
      # 還是要記得，那個 cluster 是你的 NIS 的 domain ，至於 server.cluster
      # 則是 NIS Server 的主機名稱，我這裡是使用內部私有 IP ，所以名稱可以隨便
      # 我喜歡來選擇的喔！

    4. 修改密碼驗證的方式：
      密碼驗證的方式是一定要修改的，不然你的系統怎麼知道要去哪裡使用什麼方式查尋帳號、密碼資料呢？！所以您至少需要更改兩個檔案喔！
      1. 密碼檔的修改：
      [root @client root]# vi /etc/passwd
      # 還記得這個檔案嗎？這個檔案總共有七個欄位，而每個欄位都以分號『:』隔開，
      # 相關的資訊請參考基礎學習篇裡面的帳號管理章節。由於我們要將資料
      # 設定以 NIS Server 的資料庫來驗證，因此，
      # 在這個檔案的最後面加入這一行：
      +::::::
      # 注意喔！在 + 之後連續加六個 : ，並且中間沒有空白字元！

      2. 查尋密碼的程序：
      # 因為我們有很多方式來查尋密碼，需要修改 /etc/nsswitch.conf 這個檔案才行
      [root @client root]# vi /etc/nsswitch.conf
      # 找到相關的參數，並改成底下這樣：
      passwd: files nis nisplus
      shadow: files nis nisplus
      group: files nis nisplus
      hosts: files nis dns
      # 這個檔案在設定一些資訊的查尋程序！那個 files 指的是本機的相關檔案，
      # 至於 nis 則是透過 NIS 來進行查尋，至於 nisplus 則是 NIS+ 這是比較新
      # 版的 NIS 啦！不過，官方網站上面說，目前這個發展的計畫已經暫停了！
      # 1. passwd: 就是使用者相關資訊查尋，分別為 /etc/passwd, nis 與 nisplus
      # 2. shadow: 就是使用者密碼的查尋， /etc/shadow, nis 及 nisplus
      # 3. group: 就是使用者的群組資訊查尋， /etc/group, nis 及 nisplus
      # 4. hosts: 就是主機名稱與IP對應的查尋，/etc/hosts, nis 及 /etc/resolv.conf

    5. 啟動 ypbind 與設定開機啟動：
      這樣幾乎就設定完成了！而我們前面說過， NIS Client 也需要啟動 ypbind 這個 daemon 的，所以就給他啟動吧！
      1. 直接手動啟動 ypbind 吧：
      [root @client root]# /etc/rc.d/init.d/ypbind start
      [root @client root]# rpcinfo -p localhost
      program vers proto port
      100000 2 tcp 111 portmapper
      100000 2 udp 111 portmapper
      100007 2 udp 735 ypbind
      100007 1 udp 735 ypbind
      100007 2 tcp 738 ypbind
      100007 1 tcp 738 ypbind
      # 至少要有上面幾個資訊才是對的喔！不過，需要記得的是，那個 port number
      # 是系統隨機啟動的，所以 port number 每次都會不太一樣啊！
      # 記得要經常用 rpcinfo 去檢查一下 RPC Server 相關的服務才行！

      2. 設定開機時啟動：
      [root @client root]# chkconfig --level 35 ypbind on

    基本上，上面的動作就已經設定好了一部 NIS Client 主機了！而且已經可以跑囉！不過，我們畢竟不知道到底目前我們的 NIS Client 主機使用的 NIS Server 主機裡面的哪些資料，並且如何去確認我們的資料庫與設定值都沒有問題呢？！呵呵！所以底下我們就來談一談那個 yp-tools 提供的相關好用的工具程式來檢驗囉！

  • NIC Client 端檢驗 NIS 設定：yptest, ypwhich, ypcat

    設定好了 NIS Client 之後，先以 netstat 與 rpcinfo 檢驗一下是否成功的啟動之後，接下來就是要測試到底我們的 NIS Client 與 NIS Server 之間溝通的情況如何了！此時就需要使用到 NIS 提供的 yp-tools 這個套件，裡面的幾個小小的執行程式來動作了：

    • yptest ：主要在測試 yp 的設定內容、資料庫內容等等所有 NIS 相關的資料測試；
    • ypwhich：主要在測試 NIS Client 與 Server 之間溝通的資料庫 (database) 到底是哪幾個檔案；
    • ypcat ：主要在取得 NIS Server 上面的使用者密碼資訊！

    分別談一談每個程式的用途與說明吧！

      yptest
      [root @client root]# yptest
      Test 1: domainname
      Configured domainname is "cluster"

      Test 2: ypbind
      Used NIS server: server.cluster
      ....
      ....
      Test 8: yp_maplist
      rpc.bynumber
      rpc.byname
      hosts.byaddr
      hosts.byname
      group.byname
      passwd.byname
      ypservers
      passwd.byuid

      Test 9: yp_all
      test test:dkoUW2XHV30sEV5gLM4NapyuhBcpVs.:500:500::/home/test:/bin/bash

      看到了嗎？會有很多的資料一項一項的去測試，測試的結果都會顯示在螢幕上面，最好都沒有問題之後再開始 NIS Client 的服務吧！ ^_^

      ypwhich
      [root @client root]# ypwhich
      server.cluster
      [root@node1 root]# ypwhich -x
      Use "ethers" for map "ethers.byname"
      Use "aliases" for map "mail.aliases"
      Use "services" for map "services.byname"
      Use "protocols" for map "protocols.bynumber"
      Use "hosts" for map "hosts.byname"
      Use "networks" for map "networks.byaddr"
      Use "group" for map "group.byname"
      Use "passwd" for map "passwd.byname"
      單純使用 ypwhich 的時候顯示的是『NIS Client 的 domain』名稱，而當加入 -x 這個參數時，則是顯示『NIS Client 與 Server 之間溝通的資料庫有哪些？』由上面我們可以很清楚的就看到相關的檔案啦！這些資料庫檔案則是放置在我的 NIS Server 的 /var/yp/cluster/* 裡面囉！

      ypcat
      [root @client root]# ypcat -x
      Use "ethers" for map "ethers.byname"
      Use "aliases" for map "mail.aliases"
      Use "services" for map "services.byname"
      Use "protocols" for map "protocols.bynumber"
      Use "hosts" for map "hosts.byname"
      Use "networks" for map "networks.byaddr"
      Use "group" for map "group.byname"
      Use "passwd" for map "passwd.byname"
      # 主要的功能就是『列出資料庫』囉！與 ypwhich -x 相同功能！
      # 所以我們有 ethers, aliases......passwd 等資料庫名稱與檔名！

      [root @client root]# ypcat [資料庫名稱或功能]
      # 這個指令可以用來取得 NIS Server 上面各個資料庫的內容！
      # 舉例來說，我們想要知道 passwd ( 密碼資料 ) 的所有使用者內容，就需要：
      [root @client root]# ypcat passwd (或 ypcat passwd.byname )
      test:dkoUW2XHV30sEV5gLM4NapyuhBcpVs.:500:500::/home/test:/bin/bash
      # 如果是想要知道 hosts 的內容 (NIS Server 主機上面 /etc/hosts 的內容)：
      [root @client root]# ypcat hosts
      127.0.0.1 localhost localhost.localdomain
      192.168.10.30 server.cluster
      # 反正就是加上資料庫，你就可以取得 NIS server 主機上面的資料庫內容啦！

    這三個指令在進行 NIS Client 端的檢驗時，是相當有用的喔！不要忽略了他的存在啊！尤其是剛架設好 NIS Client 時，一定要使用 yptest 去檢查看看有沒有設定錯誤喔！根據螢幕顯示的訊息去一個一個校正錯誤才行啊！

  • 修改使用者密碼 ( 需要有 root 身份 )： yppasswd, ypchfn, ypchsh

    好了，既然 NIS Client 已經可以正式的來 run 了，那麼還可能有什麼大問題呢！？最大的問題在於....我能不能在 NIS Client 端修改各個帳號的密碼呢？答案是『能！』但是不怎麼方便∼因為，我們要修改的是 NIS Server 端的資料庫喔！也就是說，我們在 NIS Client 端登入之後，要修改自己這個帳號的密碼，其實改到的是 NIS Server 的資料庫密碼啊！而要修改資料庫密碼時，需要使用 root 的身份，所以一定需要 root 的密碼∼如此一來，實在是不太方便∼如果真的要修改的話，那麼可以使用底下三個小指令來進行修改，不過，不怎麼建議這樣做就是了！

    • yppasswd ：與 passwd 指令相同功能；
    • ypchfn ：與 chfn 相同功能；
    • ypchsh ：與 chsh 相同功能。

    無論如何，我是不太建議大家使用這些指令去修改資料庫的內容啦！比較建議這樣做：

    1. 登入到 NIS Server 主機裡面去，進行 useradd 或者是 passwd 修改帳號與密碼等等的更動；
    2. 使用 /usr/lib/yp/ypinit -m 重新製作資料庫檔案！

    這樣就 OK 啦！比較簡單啦我想∼至於上面三個指令，請使用 Linux 的好朋友 man 來查看一下吧！ ^_^
主機進階設定
  • NIS 與 NFS 的結合設定：

    不曉得您有沒有發現一件事情啊！那就是：我們的 NIS Server 設定的使用者家目錄是在 /home 底下，例如 test 這個人的家目錄在 /home/test (這個目錄在 server.cluster 這部主機上面才有)，問題是，當我們登入 NIS Client 主機時，那麼我們取得的家目錄資料還是在 /home/test ，問題是，NIS Client 主機並沒有 /home/test 這個目錄啊：

    • test 這個 User 是在 server 上面建立的，所以有 /home/test 這個目錄；
    • 在 NIS Client 上面沒有真正的 test 這個帳號，因為他是由 NIS server 上面取得的，所以自然也就沒有 /home/test 這個目錄在 NIS client 上面。

    這樣會造成什麼問題呢？呵呵！就是你的 test 這個使用者，登入 NIS client 的時候，『會找不到自己的家目錄』！啊！真是糟糕∼而且，因為我們的 NIS client 可能有很多部，要是每次登入 NIS Clients 主機的時候，所擁有的家目錄都是個別 NIS client 上面的目錄，那麼就沒有達到 NIS 的功能啦！您說是吧！所以，如果你需要『登入的每個 NIS Client 所擁有的家目錄都是相同的！』的一個情況，呵呵！就可以使用 NFS 來加以設定啦！詳細的 NFS 設定我們之前已經提過了，這裡不在贅言，單純談一下簡單的設定技巧：

    • 在 NIS Server 上面開放 /home 這個目錄出來；
    • 在 NIS Client 上面， mount NIS 主機的 /home 到自己的 /home 裡面去！
    • 如此一來，不論登入哪一部 NIS Server 或 client ，使用者都是進入到 NIS Server 的 /home 裡面的家目錄囉！

    設定的方法也不難，我們就簡單的談一談吧！

    1. 設定 NIS Server 主機的 NFS 開放目錄：
    [root @test root]# vi /etc/exports
    /home 192.168.10.0/24(rw,async,no_root_squash)

    [root @test root]# exportfs -rv
    exporting 192.168.10.0/24:/home

    [root @test root]# /etc/rc.d/init.d/nfs start
    Starting NFS services: [ OK ]
    Starting NFS quotas: [ OK ]
    Starting NFS daemon: [ OK ]
    Starting NFS mountd: [ OK ]

    [root @test root]# chkconfig --level 35 nfs on

    2. 設定 NIS Client 的 mount 資料！
    # 先以 root 的身份登入到 NIS Client 主機上面：
    [root @client root]# mount -t nfs 192.168.10.30:/home /home
    # 如果沒有問題了，就將上面這一行加入 /etc/rc.d/rc.local 當中吧！

    這樣一來，您的 NIS Clients 就具有和 NIS Server 主機一模一樣的家目錄了！現在您可以立刻登入看看喔！

    • 不過，很可惜的是，目前安裝妥當的系統當中， NIS 並沒有辦法讓 SSH 順利的登入的！這牽涉到整個 key pair 的問題，比較麻煩，或許可以藉由 NIS+ (nisplus) 來克服這個問題，網路上目前有相當多的討論在討論這個情況，由於 NIS plus 與 NIS 功能差不多，實在不想再 NIS 上面又架設一部 NIS+，因此目前傾向於不要管 ssh 這種登入的方法，反正做了 NIS 在內部網路當中，最主要的功能其實是在於 R shell 這個比較危險等級的 shell 說！

  • 防火牆的規劃

    又來到了防火牆的規劃了！要注意的是，我們的 NIS 與 NFS 都是使用 RPC Server 的，所以囉，都可以直接管制 111 這個 port 即可！能夠直接以 iptables 管理 111 這個 port ，例如僅允許 192.168.10.0/24 這個網域進來的話，可以在你的防火牆規則上面加上：

    /sbin/iptables -A -s 192.168.10.0/24 --dport 111 -j ACCEPT
    /sbin/iptables -A --dport 111 -j DROP

    此外，你也可以使用 TCP_Wrappers 來掌管喔：

    [root @test root]# vi /etc/hosts.allow
    portmap: 192.168.10.0/255.255.255.0

    [root @test root]# vi /etc/hosts.deny
    portmap: ALL

    至於其他的管理，嘿嘿！就得靠您自己發揮創意囉！ ^_^
重點回顧
  • Network Information Service ( NIS ) 也可以稱為 Sun Yellow Pages (yp) 主要是負責在網域當中幫忙 NIS Client 端查尋帳號與密碼以及其他相關網路參數的服務，只是在 Linux 上面稱為 NIS 而在 Sun Unix 上面稱為 Yellow Pages 而已∼
  • 網域當中有很多 linux 主機時，可以讓一台 Linux 主機做為 NIS Server 主機，負責整個網域當中帳號與密碼的資料庫檔案製作；至於其他的 Linux 主機則設定為 NIS client 端，當有用戶要進行登入的行為時， NIS client 會前往 NIS server 搜尋資料庫裡面記錄的內容，以做為用戶登入的驗證資訊。
  • 不論是 NIS 或者是 NFS 都是藉由 RPC Server 所啟用的，因此，都可以使用 rpcinfo 來查尋 NIS 是否已經啟動，以及該 daemon 是否已經向 portmapper ( RPC server ) 註冊了！
  • NIS 使用的套件就是 yp 這個套件，主要分為兩部份， ypserv 用在 NIS Server，至於 ypbind 與 yp-tools 則用在 NIS Client 上面。
  • NIS server 其實就是提供本身的 /etc/passwd, /etc/shadow, /etc/group, /etc/hosts 等帳號密碼資料，以及相關的網路參數等，以提供網域當中 NIS Client 的搜尋之用；
  • 在 NIS Server 的設定當中，最重要的一個步驟就是將帳號、密碼、網路參數等 ASCII 格式檔案轉成資料庫檔案( database file )，以提供 NIS client 的查尋！而啟動 ASCII 轉成 database 的程式可以使用 /usr/lib/yp/ypinit -m 或者到 /var/yp 底下執行 make 均可。
  • NIS client 端的設定當中，最重要的為 /etc/passwd 裡面的設定，需要讓 NIS Server 的資料加在 /etc/passwd 後面；
  • NIS client 端的設定當中，另一個重要的設定檔為 /etc/nsswitch.conf ，裡頭設定了相當多的資料查尋程序。
參考資源
  • Study Area 之 NIS 伺服器架設：http://www.study-area.org/linux/servers/linux_nfs.htm
  • NIS 官方網站：http://www.linux-nis.org/
  • NIS HOW-TO：http://www.linux-nis.org/nis-howto/HOWTO/index.html
本章習題練習 ( 要看答案請將滑鼠移動到『答：』底下的空白處，按下左鍵圈選空白處即可察看 )
  • 請簡單說明 NIS server 的功能與工作流程
  • 請簡單說明 NIS Server/client 的架構
  • NIS 啟動之前需要先啟動那個服務，否則就無法啟動成功 ( 提示：RPC Server )
  • 我的 NIS 網域名稱為 bird ，另外，我主機的 IP 與主機名稱為 192.168.5.1/bird.nis.org ，請問要這些資訊需要設定在 NIS Server 的哪些檔案之內？
  • /etc/nsswitch.conf 的功能為何？如果我想要讓密碼查尋先本地的密碼檔，再查尋 NIS ，需要如何設定？
  • NIS Server 將密碼等檔案做成資料庫以提供 NIS client 來查尋，那麼請問使用什麼動作後，可以將密碼檔案轉成 NIS 的資料庫格式檔案？
  • 如果我想要增加網域當中一個新的帳號：newaccount，並且這個 newaccount 可以讓 NIS Client 查尋到他的帳號與密碼，需要進行哪些步驟？
  • 實作範例題：底下是我的網域參數特徵：
    network/netmask:192.168.1.0/255.255.255.0
    NIS server : 192.168.1.100 (hostname: server.nis.test )
    NIS cient: 192.168.1.200 (hostname: client1.nis.test )
    NIS domain name: nis.test
    利用上面的參數來設定 NIS 架構，請一步一步的寫下你的設定。
  • 承上題：如果我的網域太大了，所以有一部 NIS slave 主機，這部主機的 IP 為 192.168.1.50 ，請問這部主機該如何設定？
簡易 Network Information Service, NIS Server 架設
2003/05/06：第一次完成日期！
2003/ 05/06以來統計人數


簡易 Cluster 架設
最近更新日期：2003/05/20

近年來因為數值模式模擬的盛行，所以『平行運算』的架構也就越來越重要了！什麼是數值模擬呢？主要就是藉由一些物理理論去開發出來的一些『計算公式』，而這些計算公式藉由程式語言(例如C、Fortran等等)實際的將他編譯成為可執行的程式，最常見的例如中央氣象局不是每天都會預報天氣嗎？這個預報的動作就是利用數值計算去演算出來的。另外，還有空氣品質模式模擬，也是經過運算出來的，除此之外，例如天文、物理、水文等等很多方面的工作，都是利用這種數值模擬的運算的喔！不過，這些程式是很大型的！也就是說，他們在運算的時間是很長的，如果使用單顆 CPU 的話，不論這顆 CPU 的頻率與效能有多高，還是得要運算個好幾個鐘頭的∼如此一來，對於像氣象預報這個急需時效性的工作可能就會有所延誤啊！不過，如果我將這個運算的工作同時丟給多顆 CPU 呢？也就是讓多顆 CPU 同時進行這個程式的運算工作，如此一來，將可以大大的減低時間的損耗了∼這就是平行運算的簡單說明。在 Linux 平台上面，要達成簡單的平行運算，可以透過 MPI 的函式庫，例如 MPICH 就是一個很有名的 MPI 軟體喔！馬上來給他看看平行運算類型的 Cluster 建置吧！

原理：
    ：什麼是 Cluster 與 Cluster 的優點
    ：Cluster 的主從架構
    ：達成 Cluster 所需要額外功能 ( RSH ) 與軟體 ( MPICH )
架設流程：
    ：整體架構
    ：鳥哥的一個實例規範
    ：系統安裝 ( Red Hat 9 )
    ：防火牆 ( 含 NAT 主機 ) 與網路設定
    ：NFS 架設規劃(相當重要，參考說明)
    ：NIS 架設規劃
    ：RSH 設定
    ：安裝 Fortran 90 的編譯程式 PGI pgf90 ( PS. server version )
    ：安裝 MPICH
其他主機相關設定：
    ：X-Window Server/Slave 架構
重點回顧
參考資源
原理：
  • 什麼是 Cluster 與 Cluster 的優點

    什麼是 Cluster 呢？目前常見的 Cluster (叢集)架構有兩種，一種是 Web / Internet cluster system，這種架構主要是將資料放置在不同的主機上面，亦即由多部主機同時負責一項服務；而另外一種則是所謂的平行運算了！平行運算其實就是將同一個運算的工作，交給整個 Cluster 裡面的所有 CPU 來進行同步運算的一個功能。由於使用到多個 CPU 的運算能力，所以可以加快運算的速度。目前比較常見於平行運算功能的，通常需要在超級電腦上面才看的到，這些超級電腦主要是用在天文、軍事、物理等需要很精密的、大量的運算的工作中，而考慮到穩定性，則通常是用在 Unix 系統上面的硬體架構上。不過，目前由於 PC 上面的 CPU 的運算功能越來越強大了∼因此，當然很多程式開發者就動腦筋到 PC 上面來製作平行電腦的系統囉！我們這篇短文主要在介紹的就是『平行運算』這一類的 Cluster 了！

    由於 Cluster 主要是用在平行運算上面的，而所謂的平行運算是使用到多顆 CPU 的運算功能，因此可以讓您的大型運算的程式很快的執行完畢！因此，如果你的工作環境當中，常常會使用到很耗 CPU 運算功能的程式時，就可以嘗試使用 Cluster 來進行工作囉！應該可以節省您不少的時間吶！此外，我們這篇短文主要是在 X86 架構下的 PC 來架設 Cluster 的喔！

    不過，也需要特別留意的是，由於我們的 Cluster 是將一個工作平均分給所有的 node (註：一顆 CPU 在一個 Cluster 架構下，就稱為一個 node 囉！)，所以，萬一您做成的 Cluster 系統當中，所有的 node 並非完全相同的運算等級，那麼先做完工作的 node 將會暫停工作，會等到所有的 node 都進行完畢後，才會在進行下一動∼所以啦！強烈的建議在同一個 cluster 的架構中，盡量所有的 CPU 都使用相同的 CPU 型號，應該會比較好一點喔！

  • Cluster 的主從架構

    最簡單的 Cluster 其實就是以一種主從架構來進行資料的運算工作的，圖示如下：
    • 上面的 Master 與 Slave 指的都是 CPU 喔！

    • Master 那部機器上面必須要有可以將工作分配給各個 node 去工作的函式庫，也就是 MPI ，他最重要的功能就是將工作給他分配下去的啦！而最重要的軟體就是：(1)MPICH；(2)編譯器(compiler, 例如 Fortran)；

    • 什麼是網路功能呢？如果 master 與 slave 是在同一部機器當中，例如雙 CPU 的主機板，那麼這裡就不需要網路功能啦！不過，如果我是使用四台雙 CPU 的 PC 呢？呵呵！那麼這四部主機就需要以高速網路架構進行連線啦！此外，還需要在這四部主機之間建立可以互通訊息的通訊協定才行，這方面的功能就含有：(1)R Shell, 亦即稱為 RSH；(2)NIS，使 Master 與 Slave 具有相同的帳號群組關係；(3)NFS，使讀取寫入的資料可以在同一個 partition 上面；

    • Slave 就是單純的將來自 Master 的任務給他做完就是了！

    整個主從架構大致上就是這樣啦！因此，可以知道的是，我們需要的就是上面那些咚咚囉！

  • 達成 Cluster 所需要額外功能 ( RSH ) 與軟體 ( MPICH )

    由上面的 Cluster 主從架構當中，我們知道 Master 與 Slave 之間的網路溝通很重要的一個咚咚，那就是 R Shell 囉！此外，還有將一個工作傳送給不同的 node 來進行計算的任務，就需要 MPICH 這個函式庫來進行！簡單的談一談這兩個玩意兒吧！

    • RSH：
      在我們的 Linux 主機上面工作，通常使用 BASH 這個 shell 來傳達給 kernel 工作的訊息，以使主機正確的工作；而如果在不同的主機之間，那就可以使用 R Shell 來進行指令的下達喔，如此一來，我們就可以直接在 A 機器，向 B 機器下達工作的指令，而不需要登入 B 機器呢∼那就是 RSH 的主要功能啦！最常見的 RSH 指令就是 rcp 與 rsh 了！有興趣的朋友應該知道以 man 來查尋一下該指令的用法囉！
      需要附帶一提的是，這個 RSH 是『相當危險』的一個服務喔！由於我們可以直接登入 RSH 主機，並且在上面進行指令的下達，為了避免還要輸入密碼的問題，因此通常 RSH 已經將信任主機設定好了，不過，由於 RSH 會啟動一些 port 來監聽 Clients 的需求，而偏偏這些 port 與 daemon 都還挺危險的，因此，『Cluster 最好是設定在內部網域當中，並使用私有 IP ，比較能夠避免危險』喔！此外，那個 Master 也必須要設定好一定程度的嚴密防火牆喔！

    • MPICH：
      MPI 是 Messages Passing Interface 的縮寫，他本身是一個規格很嚴密的通訊標準，主要的功能是在處理平行運算之間各個 node 的資料交換，請注意， MPI 並不是一套軟體喔！而至於 MPICH 就是符合 MPI 這個標準通訊協定的一套軟體了！因此，我們可以經由 MPICH 這個軟體提供的 MPI 函式庫來達成平行運算的功能喔！也就是說，我們所寫的程式，只要能夠使用 MPICH 提供的函式庫，那麼該程式就可以進行平行運算時候所需要的功能了，這就可以避免程式開發者還要去處理通訊節點上面的問題，而可以將程式開發的重心著重在程式本身的問題上面！
      MPICH 是由 Mathematics and Computer Science Division的 Argonne 實驗室所發展，詳細的資料可以參考：http://www-unix.mcs.anl.gov/mpi/mpich/

    除了這兩個軟體之外，還需要 NIS 與 NFS 喔！所以啦！要建置一個 Cluster 的話，身為系統管理員的您，必須要學會的技能真是相當的多的，至少需要：

    • 熟悉 Linux 的操作技巧；
    • 熟悉 Linux 基礎網路參數設定；
    • 熟悉 Linux 相關的 Server 架設(這方面請參考鳥哥的私房菜架站篇)；
    • 瞭解 RSH 的相關功能與設定技巧；
    • 瞭解 MPICH 的設定與相關功能；
    • 熟悉至少一種程式語言。

    還真的是不好學啊！鳥哥也是新手玩弄 Cluster 說∼大家一起研究研究吧！ ^_^
架設流程
    要架設 Cluster 當然就是需要多部的 PC 來連線啦！不然怎麼稱為 Cluster 呢？您說是吧！所以，無論如何，在架設 Cluster 之前，請務必要確認您的『所有硬體以及網路功能都是完整無缺的！』否則就無法繼續下去啦！另外，建議 Cluster 的所有主機規格盡量相同，可以避免等待的困擾呢！底下就來談一談整個架設流程吧！

  • 整體架構

    整體架構的架設當中，需要的所有軟體為：

    • Master 主機安裝需要：
      • 防火牆的設定(含 NAT 架設)；
      • RSH
      • NIS Server
      • NFS Server
      • Compiler Install
      • MPICH Install
      • 其他特殊功能

    • Slave 主機安裝需要：
      • 防火牆的設定
      • RSH
      • NIS Client
      • NFS Client

    基本上，幾乎所有的工作都是在 Master 上面做啦！ Slave 最大的任務就是進行來自 Master 所要求的計算工作，因此，Slave 能夠越簡單越好∼至於 Master 上面，由於我們都是在 Master 主機上面下達工作指令，而總不能老是在螢幕前面下達指令吧！因此上，Master 通常會有兩個網路介面，分別是對外的 Public IP 與對內的 Priavte IP。而既然 Master 有提供 Public IP 的設定，自然就比較擔心所謂的駭客入侵問題，所以啦，您的 Master 主機，要嗎就不要開放 Public IP ，要嗎就務必要設定很嚴密的防火牆，並且不必要的服務就盡量關閉他∼畢竟我們的 Cluster 是要用來做為計算運作的，所以不必要的網路協定服務，當然就是關閉他啦！底下鳥哥將以自己的一個實際案例進行說明的啦！參考看看吧！

  • 鳥哥的一個實例規範

    在我這個案例當中， Cluster 主要的功能為：進行 MM5 這個氣象模式的運算以及 Models-3/CMAQ 這個空氣品質模式的運算，而由於這兩個咚咚都是使用 PGI Fortran 90 做為 Compiler ，因此，我就必須要進行 PGI 的安裝啦！而我的硬體架構主要是這樣的：

    • Master ： 為雙 CPU 主機，使用 AMD MP 的 CPU ，並且有一顆 120 GB 的硬碟，此外，由於我的數值模式需要 PGI Fortran ，所以就必須要安裝 Server 版的 PGI Fortran 喔！
    • Slave ： 共有三部 Slave ，每一部均為雙 CPU 的 AMD MP 的 CPU ，並且有一顆 120 GB 的硬碟；
    • 連接 Master 與 Slave 的為 10/100/1000 的 Switch ，當然，四部主機(1 x master + 3 x slave)都是安裝 Intel 的 1GB 網路卡喔！

    硬體連接有點像這樣：
    那麼底下就來談一談怎麼安裝他吧！

  • 系統安裝( Red Hat 9 )

    我的這個系統使用的是最新的 Red Hat 出版的 Red Hat 9 ，會用這個玩意兒最大的原因是因為 Red Hat 是目前支援的 Linux 軟體最多的一個 Linux Distribution 了，安裝他之後，就比較不會欠東欠西的，此外，很多的軟體都是以 Red Hat 做為測試的平台，因此我就選擇他來做為我的系統平台啊！另外，需要留意的是，由於 Slave 並不需要使用到圖形介面的功能，他單純是用在計算上面，因此我沒有在 slave 上面安裝圖形介面的打算∼至於 Master 則安裝了 KDE 這個咚咚喔！好了，Linux 的安裝相信大家應該都要很熟悉了，所以我就不再談安裝的詳細步驟，僅提幾個特別需要注意的地方囉：

    • Partition 方面：
      因為我的硬碟實在是在蠻大的，並且在 Slave 上面也是 120 GB 的硬碟，如果不將 Slave 的硬碟使用的話，實在覺得很浪費，因此，一開始我就規劃將四部主機的硬碟全部都以 NFS 分享到內部網域當中，而為了避免跟系統的檔案放在一起，因此，我就將硬碟分割出除了必要的 partition 之外，其他的就掛載在 /disk1 這個目錄當中，四部主機的 parition 都相同，分別是：

      • / : 10 GB
      • /var : 5 GB
      • /tmp : 3 GB
      • Swap : 3 GB ( 因為我每部 Linux 主機上面都有 1.5 GB 的記憶體 )
      • /disk1: 96 GB

    • 安裝時選擇的套件：
      所有的主機都需要底下的套件安裝(註：因為原本的筆記記錄的很亂，所以如果找不到相同的字眼，那就是我寫錯啦！)：
      • Administrator Tools
      • Development Tools
      • Editor
      • Enginerring
      • Kernel Development
      • Network Servers
      • Server configure
      • Sound and vedio tools
      • System Tools
      • Text-based
      • Windows servers
      不過， Master 需要額外再增加 X Window 方面的支援，例如 KDE 與 X-Window System 這兩個主要的套件要勾選喔！

    系統安裝大致上就是這些吧，如果有疏漏的，請未來在安裝完畢之後，再以原本 Red Hat 9 的光碟來重新安裝他吧！反正 Red Hat 系統都是以 rpm 來安裝的，挺容易安裝的喔！整個安裝完畢後，還花不到幾分鐘呢！

  • 防火牆 ( 含 NAT 主機 ) 與網路設定

    由於我們的 Cluster 主要是用在數值運算，因此，當然不需要對外開放網路服務啦！所以，最好就是以私有 IP 來進行網路的設定是比較好的！此外，最好還是要設定好防火牆的啦！我的網域參數預設是這樣的：

    • Network/netmask：192.168.10.0/255.255.255.0
    • Master：(對外)140.116.xxx.yyy；(對內)192.168.10.30, Gateway 為對外的 Gateway 喔！並且有設定 NAT 啊！
    • Slave：192.168.10.10, 192.168.10.20, 192.168.10.40 三部，Gateway 為 192.168.10.30

    網路參數的各個檔案是這樣的：

    • 各個主機的主機名稱請修改：/etc/sysconfig/network
    • 各個主機的網路卡設定項目請修改：/etc/sysconfig/network-scripts/ifcfg-eth0
    • 各個主機的 DNS 查尋系統請修改：/etc/resolv.conf
    • 各個主機的內部主機名稱查尋系統請修改：/etc/hosts，我的 /etc/hosts 如下：
      127.0.0.1 localhost localhost.localdomain
      192.168.10.10 node1.cluster
      192.168.10.20 node2.cluster
      192.168.10.30 server.cluster
      192.168.10.40 node4.cluster

    而我的每部主機先將所有的網路服務都給他關掉去，僅剩下 SSH 這個網路協定存在而已∼所以，我利用 Red Hat 提供的 ntsysv 這個指令來選擇開機時啟動的項目有：

    • atd
    • crond
    • iptables
    • keytable
    • network
    • random
    • sshd
    • syslogd
    • xinetd

    至於防火牆系統的規劃上面，由於 Master 主機 (192.168.10.30) 具有 NAT 的功能，所以必須要修改一下他的防火牆機制，因此，就有兩個不同的防火牆機制 scripts 囉！另外，由於擔心外來的入侵攻擊，因此，在這個 Cluster 的系統當中，我的 iptables 防火牆機制是使用『MAC(網路卡卡號)』來做為設定的基準，而不是使用 IP 啊！為什麼呢？因為反正我僅允許我自己同網域內的幾部電腦連進來而已，當然沒有必要針對 IP 啊！所以囉，就必須要收集四部主機的網路卡來允許他進入囉。此外，由於我可能並不在 Cluster 前面操作，因此會啟用一兩部主機的網路卡卡號，好讓他能夠進入 Cluster 呦！底下就將我的防火牆機制給他列出來一下：

    • Master：
      #!/bin/bash
      # This program is for iptables' rules
      # VBird 2003/05/02
      #
      # 0. PATH and modules
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      export PATH
      modprobe ip_tables
      modprobe iptable_nat
      modprobe ip_nat_ftp
      modprobe ip_nat_irc
      modprobe ip_conntrack
      modprobe ip_conntrack_ftp
      modprobe ip_conntrack_irc
      #
      # 1. clear the rules and make the policys
      iptables -F
      iptables -X
      iptables -Z
      iptables -F -t nat
      iptables -X -t nat
      iptables -Z -t nat
      iptables -P INPUT DROP
      iptables -P OUTPUT ACCEPT
      iptables -P FORWARD ACCEPT
      iptables -t nat -P PREROUTING ACCEPT
      iptables -t nat -P POSTROUTING ACCEPT
      iptables -t nat -P OUTPUT ACCEPT

      #
      # 2. NAT services
      echo "1" > /proc/sys/net/ipv4/ip_forward
      iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE
      #
      # 3. Trust network and conditions
      iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      iptables -A INPUT -i lo -j ACCEPT
      iptables -A INPUT -m mac --mac-source XX:YY:ZZ:WW:QQ:PP -j ACCEPT
      # 上面這一行就是網路卡的卡號啦！

    • Slave：
      Slave 的防火牆機制跟 Master 幾乎一模一樣，只是因為在內部啊，所以不需要啟動 NAT 的服務即可！上面的給改一改先∼

    好啦！網路的設定與防火牆就到這裡為止，要記得喔，你的網路必須要已經能夠正確的啟動了！如果還是無法啟動網路，或者是防火牆機制還是有問題，那麼對外的那個網路卡的網路線還是先給他拔掉吧！比較安全一些些的啦！等到都設定妥當，尤其是防火牆，然後才來啟動他吧！

  • NFS 架設規劃

    由於我這裡預計要設定 NIS ，並且每部主機的 /disk1 都要分享出去，因此，每部主機都必須要開放 NFS 的服務喔！並且，每一部主機的設定都可以相同吶！這樣比較容易來設定囉∼此外，比較不一樣的地方在於 Master 這一部，由於我的 Cluster 所有的帳號都在 NIS 的管制之中，因此，我將 Master 的 /home 也分享出來，並且每部 Slave 主機都掛載 Master 的 /home 才成！

    這個 NFS 在 Cluster 當中是相當重要的，為什麼呢？因為我們不是在四部主機上面工作嗎，而這四部主機會去讀取的『資料』其實都是『在本機上面可以看的到的』資料才行，這還包括底下我們會持續介紹的 mpich 這個軟體的函式庫呢！也就是說：『在 Cluster 裡面，所有的機器會使用到的資料必須都在相同的目錄當中！』所以，這就是為什麼我們要對 /home 進行分享，以及進行 NIS 的設定了！此外，因為我的 Server 這部 Master 機器分享出去的目錄中，已經含有 /disk1 這個 partition，此外，還通通將他掛載在 /cluster/server 底下，因此，可以建議：『未來在安裝所有的 Cluster 需要的套件資料時，例如 Compiler 以及 MPICH 等等，都可以安裝到 /cluster/server 這個目錄底下，以使所有的主機都能夠使用同一個 partition 來源的資料喔！』

    設定程序：

    • Master：
      1. 啟動 portmap 並且設定開機啟動：
      [root @server root]# /etc/rc.d/init.d/portmap
      [root @server root]# chkconfig --level 35 portmap on

      2. 設定 NFS 分享出去：
      [root @server root]# vi /etc/exports
      /home 192.168.10.0/24(rw,async,no_root_squash)
      /disk1 192.168.10.0/24(rw,async,no_root_squash)
      [root @server root]# exportfs -rv
      [root @server root]# /etc/rc.d/init.d/nfs start
      [root @server root]# chkconfig --level 35 nfs on

      3. 設定預計的掛載點：
      [root @server root]# mkdir -p /cluster/node1
      [root @server root]# mkdir -p /cluster/node2
      [root @server root]# mkdir -p /cluster/node4
      [root @server root]# mkdir -p /cluster/server

    • Slave：
      1. 啟動 portmap 並且設定開機啟動：
      [root @node1 root]# /etc/rc.d/init.d/portmap
      [root @node1 root]# chkconfig --level 35 portmap on

      2. 設定 NFS 分享出去：
      [root @node1 root]# vi /etc/exports
      /disk1 192.168.10.0/24(rw,async,no_root_squash)
      [root @node1 root]# exportfs -rv
      [root @node1 root]# /etc/rc.d/init.d/nfs start
      [root @node1 root]# chkconfig --level 35 nfs on

      3. 設定預計的掛載點：
      [root @node1 root]# mkdir -p /cluster/node1
      [root @node1 root]# mkdir -p /cluster/node2
      [root @node1 root]# mkdir -p /cluster/node4
      [root @node1 root]# mkdir -p /cluster/server

    掛載程序：

    • Master：
      將底下這些指令測試執行一下，如果成功後，將指令寫入 /etc/rc.d/rc.local 當中
      [root @node1 root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
      [root @node1 root]# mount -t nfs -o bg,intr node1.cluster:/disk1 /cluster/node1
      [root @node1 root]# mount -t nfs -o bg,intr node2.cluster:/disk1 /cluster/node2
      [root @node1 root]# mount -t nfs -o bg,intr node4.cluster:/disk1 /cluster/node4

    • Slave：
      將底下這些指令測試執行一下，如果成功後，將指令寫入 /etc/rc.d/rc.local 當中
      [root @server root]# mount -t nfs server.cluster:/home /home
      [root @server root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
      [root @server root]# mount -t nfs -o bg,intr node1.cluster:/disk1 /cluster/node1
      [root @server root]# mount -t nfs -o bg,intr node2.cluster:/disk1 /cluster/node2
      [root @server root]# mount -t nfs -o bg,intr node4.cluster:/disk1 /cluster/node4

    呵呵！這樣就設定成功了！我們每一部主機『看起來』就好像有 400 GB 的硬碟空間啊！可怕了吧！ ^_^

  • NIS 架設規劃

    NIS 的設定也是很簡單，不過主要還是需要分為 NIS Server 與 NIS Client 兩部份來設定的！請注意，在設定之前，就已經要將 NFS 搞定喔！這些流程都是有一定程度的相關性的呢！

    • Master：
      在 Master 上面需要進行的工作很多喔！首先，一定要修改 ypserv.conf 以及其他相關的檔案的吶！
      1. 啟動 time 與 time-udp 這兩個預先要啟動的 daemon
      [root @server root]# chkconfig --level 35 time on
      [root @server root]# chkconfig --level 35 time-upd on
      [root @server root]# /etc/rc.d/init.d/xinetd restart

      2. 建立 NIS 的領域名稱 (我這裡是設定為 cluster )：
      [root @server root]# nisdomainname cluster
      [root @server root]# echo "/bin/nisdomainname cluster" >> /etc/rc.d/rc.local
      [root @server root]# echo "NISDOMAIN=cluster" >> vi /etc/sysconfig/network

      3. 建立 NIS 設定檔：
      [root @server root]# vi /etc/ypserv.conf (在這個檔案內增加三行即可)
      127.0.0.0/255.255.255.0 : * : * : none
      192.168.10.0/255.255.255.0: * : * : none
      * : * : * : deny
      [root @server root]# touch /etc/netgroup

      4. 啟動 NIS：
      [root @server root]# /etc/rc.d/init.d/ypserv start
      [root @server root]# /etc/rc.d/init.d/yppasswdd start
      [root @server root]# chkconfig --level 35 ypserv on
      [root @server root]# chkconfig --level 35 yppasswdd on

      5. 製作資料庫：(每次有更動使用者資訊時，就必須要進行這個步驟！)
      [root @server root]# /usr/lib/yp/ypinit -m
      [root @server root]# chkconfig --level 35 ypserv on
      [root @server root]# chkconfig --level 35 yppasswdd on

    • Slave：
      至於 NIS Client 則是需要設定 yp.conf 這個檔案呢！
      1. 建立 NIS 的領域名稱 (我這裡是設定為 cluster )：
      [root @node1 root]# nisdomainname cluster
      [root @node1 root]# echo "/bin/nisdomainname cluster" >> /etc/rc.d/rc.local
      [root @node1 root]# echo "NISDOMAIN=cluster" >> vi /etc/sysconfig/network

      2. 建立 NIS 查尋的主機名稱：
      [root @node1 root]# vi /etc/yp.conf
      domain cluster
      ypserver server.cluster

      3. 修改密碼驗證方式：
      [root @node1 root]# vi /etc/passwd (在這個檔案的最底下新增如下一行)
      +::::::
      [root @node1 root]# vi /etc/nsswitch.conf
      passwd: files nis nisplus
      shadow: files nis nisplus
      group: files nis nisplus
      hosts: files nis dns

      4. 啟動 NIS：
      [root @server root]# /etc/rc.d/init.d/ypbind start
      [root @server root]# chkconfig --level 35 ypbind on

    呵呵！不囉唆！馬上就設定妥當啦！

  • RSH 設定

    這個 RSH 已經提過了，主要的功能是提供 Master 可以使用 R 指令(如 rsh, rlogin, rcp 等等)來進行 slave 端主機的操控的！所以啦， RSH daemon 主要是在 slave 機器上面架設的喔！與 Master 就無關啦！Master 只要能夠執行 R command 即可！雖然是如此，不過，在我的測試當中，最好 Master 也啟動 RSH 比較好一些些囉！在底下的設定當中，我們假設 Server 上面的所有使用者都可以使用 R command 呢！設定的方法很簡單啊！

    • Slave & Master：
      底下的設定在 Master 與 Slave 上面都需要動作喔！設定一樣即可！
      1. 啟動 RSH 囉！
      [root @node1 root]# chkconfig --level 35 rsh on
      [root @node1 root]# /etc/rc.d/init.d/xinetd restart

      2. 編輯可使用 R command 的主機設定檔：
      [root @node1 root]# vi /etc/hosts.equiv
      server.cluster +

      特別注意，由於 RSH 預設就是不支援 root 使用 R command ，所以您必須要到 master 上面去，並以一般身份使用者進行 R command 的測試才行喔！不要直接以 root 工作，會無法成功的啦！(顯示 permission deny 的啦！)

    • Master：
      由於 RSH Server 上面的設定中，您的 User 家目錄必須要存在一個名為 .rhosts 的檔案，原本我的 Server 上面就有一個名為 test 的使用者，而並且為了讓我未來新建立的使用者都能夠使用 R command ，所以我在 Master 這部機器上面做了這樣的動作喔：
      [root @server root]# vi /home/test/.rhosts
      server.cluster
      [root @server root]# vi /etc/skel/.rhosts
      server.cluster
      [root @server root]# chmod 644 /etc/skel/.rhosts

    這樣就妥當的設定好了 RSH 囉！

  • 安裝 Fortran 90 的編譯程式 PGI pgf90 ( PS. server version )

    我由 PGI 的官方網站下載了最新的 PGI Server 套件，請特別留意的是，由於 PGI 有兩種模式，一種是工作站(Workstation)一種則是伺服器(Server)模式，其中，工作站僅能提供單一主機來操作，無法進行 Cluster 的功能的！因此，請務必要下載 Server 的版本，並且是支援 Linux 版本的喔！不要搞混了！ PGI Fortran Server version 的下載網址在這個地方：http://www.pgroup.com/downloads.htm，請自行下載吧！比較需要留意的是，從上面這個網站下載的版本僅是分享軟體的版本，您安裝之後可以具有 15 天的免費使用期限，超過期限之後，又需要重新安裝一次，很是麻煩的啦！如果您的 Cluster 是用來進行學術研究的，那麼在測試完成之後，可能需要去他的網站註冊，這個註冊的費用差異可就很大了∼因為未來我的 Cluster 需要一直不斷的運作，因此是需要去註冊的啦！並且，我只會用到 Fortran 這個編譯器，因此，我就直接使用 PGIHPF 這個版本來測試安裝而已，而不是使用全部 ( 含 PGI Fortran 與 C ) 的版本喔！因為註冊的價差差了兩∼三萬台幣啊！安裝 Fortran 真是很簡單的啦！假設您將 linux86-HPF.tar.gz 放置在 /root/software 底下，則：(註：以下的動作僅只要在 Master 上面進行即可喔！)

    1. 建立 pgi fortran 在 /cluster/server/program/pgi 底下：
    [root @server root]# cd /usr/local/src
    [root @server src]# mkdir pgi-fortran; cd pgi-fortran
    [root @server pgi-fortran]# tar -zxvf /root/software/linux86-HPF.tar.gz
    [root @server pgi-fortran]# ./install
    接下來會有一些問題，請依序回答您的問題喔！
    至於授權嘛！請建立吧！
    最重要的地方，是在第三個問題，他會問你要安裝的目錄，請選擇
    /cluster/server/program/pgi

    2. 修改個人參數：由於 RSH 不以 root 工作，所以我以使用者 test 來測試：
    [root @serer root]# vi /home/test/.bashrc
    # 加入這幾行關於 PGI 的咚咚：
    PGI=/cluster/server/program/pgi
    export PGI
    PATH=$PGI/linux86/bin:$PATH

    3. 設定查尋路徑：
    [root @server root]# vi /etc/man.config
    # 加入這一行：
    MANPATH /cluster/server/program/pgi/man

    這樣就好了嗎？！沒錯！確實是這樣就完成了！很是簡單吧！ ^_^要注意的是：

    • 記得 pgf90 必須要讓所有的 node 都能夠讀的到，所以一定要安裝在 Server 的分享出去的目錄當中，我這裡的例子就是安裝在 /cluster/server/program/gpi 這個目錄當中囉！
    • 執行檔要能夠執行，當然是必須要讓目錄在 PATH 這個變數底下，而我的 pgf90 是在 /cluster/server/program/pgi/linux86/bin 底下，所以，您的 PATH 必須要含有這個目錄才行！

    大概就是如此囉！

  • 安裝 MPICH

    前面我們提過了，安裝 MPICH 是平行運算裡面最重要的一項工作了！因為我們就是靠他來幫我們達成運作的啊！那麼怎麼來安裝呢？又是簡單得不得了啊！首先，請先下載 mpich 吧！下載的網址在底下，我是以 mpich 1.2.5-1a 來測試的喔！

      http://www-unix.mcs.anl.gov/mpi/mpich/download.html

    假設您將 mpich 下載在 /root/software 裡面，並且預計要安裝到 /cluster/server/program/mpich 當中，而且僅安裝 Fortran 而已的話，可以這樣做：

    1. 建立 mpich 在 /cluster/server/program/mpich 底下：
    [root @server root]# cd /usr/local/src
    [root @server src]# tar -zxvf /root/software/mpich.tar.gz
    [root @server src]# cd mpich-1.2.5
    [root @server mpich-1.2.5]# ./configure --enable-debug \
    > -fc=pgf77 -f90=pgf90 \
    > --prefix=/cluster/server/program/mpich
    [root @server mpich-1.2.5]# make && make install

    2. 建立可以利用的主機狀態：
    [root @server mpich-1.2.5]# cd /cluster/server/program/mpich/share
    [root @server share]# vi machines.LINUX
    node1.cluster:2
    node2.cluster:2
    node4.cluster:2
    server.cluster:2
    # 這個檔案當中，格式為 <主機名稱>:<主機的 CPU 個數>

    3. 建立需要的變數：(又是以 test 為準喔！)
    [root @server root]# vi /home/test/.bashrc
    # 加入這一些資料：
    PATH=$PATH:/cluster/server/program/mpich/bin
    export PATH
    MPI_HOME=/cluster/server/program/mpich
    MPI_ARCH=$MPI_HOME/bin/tarch
    export MPI_ARCH MPI_HOME
    [root @server root]# vi /etc/man.config
    # 加入這一行：
    MANPATH /cluster/server/program/mpich/man

    呵呵！這樣就已經完成了 MPICH 的安裝與設定了！就跟你說很簡單吧！但是呢，要測試可就得需要特別留意了，因為 root 預設是不許使用 RSH 的，所以測試一定要使用一般身份的使用者，這裡我以 test 這個人做為測試的使用者喔！所以，請以 test 的身份登入主機，並且，這個 test 必須要在所有的主機上面都可以被查詢的到才行(請參考 NIS 的設定喔！)。

    [test @server test]$ cp -r /cluster/server/program/mpich/examples/ .
    [test @server test]$ cd examples
    [test @server examples]$ make pi3f90
    [test @server examples]$ mpirun -np 8 pi3f90
    # 上面那個 -np 後面接的就是使用 CPU 的個數啦！因為我有 8 個 node ，
    # 所以當然就以最大的 CPU 個數來測試看看，如果要看到底 CPU 有沒有啟動的話，
    # 可以先登入各個 slave 的主機，然後執行『 top -d 1 』來觀察 CPU 的使用率，
    # 再執行上面這個程式，就能夠知道 CPU 有沒有運作了！ ^_^

    呵呵！沒想到 PGI 的試用版本就能夠提供多顆 CPU 的 Cluster 運作，真是給他很高興！這樣既然可以測試成功了，自然就可以去向 PGI 的官方網站註冊了！註冊費用不低，但是挺值得的啊！
其他主機相關設定：
    除了一些基本的 Cluster 設定之外，您的主機其實可能還需要其他的設定項目的！最常見的可能就是 X-Window System 的 server/slave 架構了！您總不希望老是呆在 cluster 前面吧？！粉吵的呢！這個時候，或許就會希望可以在 Client 端連接上 Server 的 X Server 囉！

  • X-Window Server/Slave 架構

    架設一個很簡單的 X Server 真的是很容易，容易到讓你會很想笑出來∼在上面的環境設定好了之後，請注意：『您的主機應該是在 run-level 為三的文字模式底下，也就是沒有 X Window 存在』才對！這個時候，要設定完成 X Server ，僅要修改一個檔案，並且啟動一支程式即可！先說明一下我的環境：

    X Server 主機的 IP 是 192.168.10.30，作業系統是 Red Hat 9；
    X Client 的 IP 是 192.168.10.100 ，作業系統同時是 Linux 與 Windows 2000 。

    • X Server 的設定：
      由於我們需要啟動監聽來自 X Client 的要求，這個時候需要重新做一下設定：
      1. 先備份原先的設定檔：
      [root @server root]# cd /etc/X11/gdm
      [root @server gdm]# mv gdm.conf gdm.conf.bak

      2. 編輯設定檔，只要底下兩行即可！
      [root @server gdm]# vi gdm.conf
      [xdmcp]
      Enable=1

      3. 啟動 gdm ：
      [root @server gdm]# gdm
      [root @server gdm]# netstat -uln
      udp 0 0 0.0.0.0:177 0.0.0.0:*
      # 如果有出現上面這行就對了！
      [root @server gdm]# echo "/usr/bin/gdm" >> /etc/rc.d/rc.local
      # 上面這行在設定開機時啟動 gdm 囉！

    • X Client 的設定(在 Linux 上面)：
      如果您的 X Client 同樣是 Linux ，那麼：『在這目前這個 Client 端連接到 X Server 端執行 X 視窗』的功能，只要進行幾個步驟就可以了！
      0. 請務必要在 X Window 當中，進入 X Window 的方式有：
      [root @client root]# startx
      或
      [root @client root]# init 5

      1. 在 X Window 的畫面當中，啟用一個 shell ，然後輸入：
      [root @client root]# xhost + 192.168.10.30
      192.168.10.30 being added to access control list
      [root @client root]# init 3 (離開 X Window)

      2. 在文字介面下輸入：
      [root @client root]# X -query 192.168.10.30
      .....(進入 X Window 囉！)

    • X Client 的設定(在 Windows 上面)：
      如果您的 X Client 是在 Windows 上面，那麼就必須要額外的來執行其他的軟體了！目前您可以選擇購買 Exceed 這個連線軟體，或者是先『試用』 X-Win 這個軟體！都是用在 Windows 上面模擬連接到 Linux X Server 用的軟體啦！我這裡是以 X-Win 這套程式做為介紹的，您可以在各大學的 FTP 網站上面捉到這個軟體，當然，也可以在我這裡下載 5.4 版。

      http://linux.vbird.org/download/#x-win54

      1. 在 Windows 上的安裝步驟，就是執行他即可啊！然後一直給他下一步就是了！

      2. 執行 X-Win32 這個程式，在出現如下的圖示後，按下 Evaluation 這個試用按鈕；

      3. 按下確認按鈕；

      4. 在右下角的小圖示當中，例如： 給他按下那個 X 囉，就會出現如下的圖示：

      5. 按下 Add 之後，會出現如下的圖示：

      6. 上面選擇 XDMCP 這個項目，然後選擇 Next 之後，會出現：

      7. 重要的地方在於 Query 這個選項，以及 192.168.10.30 這個 IP 指向喔！都設定好之後，給他 Save 一下，會出現：

      8. 上面的圖示當中，給他按下確定吧！然後呢？在右下角的 X 小圖示中 ( [image] ) 按一下 X 之後，就會出現剛剛我們建立的 My Linux X Server 這個選項，給他選擇下去的啦，呵呵！就會出現囉：

        很棒吧！這樣就能在 Windows 上面連線進入 Linux 使用他的 X Window 功能囉！

    後記：雖然架設一個 X Server/Client 是很簡單的一件事，不過，如果您的機器並不是在 LAN 裡面的話，而是在 Internet 上面進行 Server/Client 的 X 系統架構的連結，請特別留意的是，由於 X Window 的圖形介面需要一直傳輸圖形到您的工作機上面來，如此一來，將會損耗掉大部分的頻寬喔！在我的實際案例當中，發現到我的 X Server/Client 之間流量傳輸達到 2000 Kbits/second, 亦即是 250KBytes/second ，還記得流量的算法吧？！如果是 ADSL 撥接架構的話，目前已經蠻常見 下載/上傳 = 1.5M/386K 的傳輸速度，不過，即使下載達到 1.5M 了，不過在我的案例中竟然高達了 2.0M 的傳輸！呵呵！瞭解吧！所以囉，這個 X Window 的 Server/Client 架構請務必在內部網路架設就好，不要想連上 Internet 啊！會等的快睡著.....
重點回顧
  • Cluster 可以是平行計算的一種，主要除了雙 CPU 系統外，也可以用在多主機架構下的一種增快數值計算的方式；
  • 平行計算的 Cluster 主要是藉由主從的架構去運行的，其主要的設定都在 Master 上面設定的， Slave 主要是計算功能而已，
  • Cluster 上面相當重要的地方在於 NFS 的設定，因為 Master/Slaves 都需要讀取同樣的資料，所以 NFS 分享的檔案資料就極其重要了；
  • 除了 NFS 之外，還需要 MPI 這個平行計算的函式庫之安裝，有了 MPI ，Cluster 才能真的運作起來；
  • 在 Cluster 當中，所有的主機之指令的溝通主要亦經過 RSH 的運作；
參考資源
  • Marty's Linux Cluster 架設日誌：http://web.csie.chu.edu.tw/~cs87668/cluster.htm
  • 張裕麟先生的小文章：http://www.se.ntou.edu.tw/~ylchang/MyDocuments/MPICH-ins.txt
  • 國家高速電腦中心：http://binfo.ym.edu.tw/edu/seminars/200201.files/frame.htm
  • MPICH官方網站：http://www-unix.mcs.anl.gov/mpi/mpich/
簡易 Cluster 架設
2003/05/12：第一次完成日期！
2003/05/20：加入了 X Server/Client 的架構！
2003/ 05/12以來統計人數


學習 Linux 的文件
註：這裡的文章都很舊了，而且版本也不太相容目前的 Red Hat 系列
    請前往 Linux 架站文件 學習架設安全網站呦！
最近更新日期：2002/01/10
架個小站篇（網路）
區域網路架構 | 網路的第一門課就是將你家的電腦全部連在一起啦！所以，你預計有幾台 PC 在你的主機附近？怎樣接線呢？如何設定你的網路參數？
進入 Internet | 除了使用固定 IP 上網之外，這裡提供一個在 Linux 下以 ADSL 撥接上 Internet 的連線方法，並且以一個小程式隨時注意網路的狀況...
NAT 架站 | 架個小站最重要的是讓你區域內的網路可以通通連上 Internet 啦！這裡介紹用一個 IP 進行多部電腦的 Internet 連線方法！
動態 DNS 申請 | 以浮動式 IP 架站最麻煩的就是如何讓別人隨時知道你主機的 IP 了！所以趕快去申請一個動態 DNS ，讓大家都知道你的主機位置！
Proxy server | 代理伺服器可以代理你區域網路內的電腦去 WWW 中捉資料，這裡提供了代理伺服器（proxy server 使用 squid） 的設定方法...
Mail server 架站 | 會不會覺得 Internet 上面的免費信箱空間不夠大？Linux 可以讓你收發自己的信件囉！並且，郵件的大小是不受限的喔！
Web server 架站 | 連免費 mail 信箱都覺得不夠大了，免費網頁空間自然一定更不夠囉！那你可以自己架一個 WWW 站啦！這裡提供一個 MySQL+PHP+Apache 的 WWW 架站方法喔！
Samba Server 架站 | 在 windows 工作時，是否一定要透過 FTP 才能到 Linux 上面傳遞資料呢？那可不是！使用 Samba 服務後，讓你的區域網路內的 Windows 及 Linux 主機可以透過『網路上的芳鄰』看到對方！

2002/ 01/01以來統計人數


區域網路的架構
(本文已不再維護，請前往新文章)
最近更新日期：2001/08/14
如何連線
要安裝哪些通訊協定
確定你的網路參數

如何連線
基本上，我們的對於區域網路連線方式大概都是使用以下這一種方式：
各電腦之間是以 Hub 或 switch 作為連線的介面，然後跟 Linux 主機之間以 NAT 方式相連，最後，透過固定IP的學術網路，或者是自家的 ADSL 數據機來連上 Internet。所以，基本上主機是需要兩塊網路卡的，而且一塊是與內部網路連線的，這個內部網路通常是使用虛擬 IP 來進行連線溝通的！我們比較常使用的虛擬 IP 是在 192.168.0.0 到 192.168.255.255 這一段，以鳥哥為例，個人是比較喜歡 192.168.1.0∼192.168.1.255 這一段的網路，沒有任何原因，單純是因為喜歡！呵呵！

在上面的圖示中，應該可以很容易的發現，內部網路其實就是指：個人電腦一、個人電腦二、個人電腦三、Linux 主機的一塊網路卡以上這四個介面（其實就是四張網路卡啦！）。基本上，我們希望內部網路可以很輕鬆的進行各種網路溝通，所以以上這四張網路卡的 IP 我們希望他可以在同一個網段之內，例如：我們可以設定 Linux 主機用來連接內部網路的 IP 為 192.168.1.2 ，而其他三張網路卡則分別設定為 192.168.1.11 ∼ 192.168.1.13 就可以了，然後子遮罩網路都是 255.255.255.0 ，則四張網路卡都屬於同一網段，網路卡之間就可以直接連線而不用透過 Getway 了！

關於 Hub ：上面還要注意到，如果你只是一般的家庭的話，則 Hub 可以選擇很便宜的五孔的那一種（一個大概只要 500-600 元），但是如果你是一個宿網，而且你們同學之間常常有大流量的文件傳輸（例如由個人電腦一傳到個人電腦二），為了增加傳輸的效率，個人是建議使用可以自動分辨 10/100Mbps 的集線器或者是 switch 來使用，因為他的傳輸速率是一般 10Mbps 的10倍！

關於網路線：這個是特別需要注意的地方，由於目前最常使用的網路線接頭為 RJ45 的網路線，而這種網路線又因為接頭部分有沒有經過跳線處理而分為兩種線材，一種是平行線（就是沒有經過跳線處理的），一種就稱為跳線。上面的圖形中，連接到 Hub 的網路線都是正常的網路線，亦即是 平行線 ，而由 Linux 主機接到 ADSL 數據機的線段則是使用跳線！由於線材使用錯誤將造成無法連線，所以這裡請特別注意喔！

要安裝哪些通訊協定
由於我們主要是使用 Linux 主機來連線上 Windows 系統的個人電腦，所以在你的 Windows 系統中，網路就需要有以下的設定才能讓每台電腦看到對方！（注意，以下的說明摘自 Study-Area 的文章）
  • NetBEUI
    讓我們回到IBM最初進軍個人電腦網路的時代﹐他們當時的確需要一個很基本的網路通訊協定﹐但他們並不打算用此來建構大型網路﹐僅僅供數十台電腦甚至更小的網路而已。基于這個訴求﹐就誕生了Network Basic Input/Output System﹐或稱NetBIOS。

    NetBIOS其實只有18個命令(command)來讓網路的電腦能夠建立?維持?和使用連接服務。不過IBM在不久後又再推出了NetBIOS的延伸版本﹕NetBIOS Extened User Interface﹐或稱NetBEUI﹐基本上是NetBIOS的改良版本而已。然而﹐NetBIOS和NetBEUI終究是不同的﹕NetBEUI事實上可以說是一個傳輸協定﹐而NetBIOS充其量只是一組命令來讓系統可以使用網路而已﹐在技術角度來看﹐它是一個Application Program Interface (API)。

    NetBEUI可以算是您能夠用到的最快通訊協定了。這個“最快”是指它可以將格式化資料放進封包裡面﹐而接收節點又可以迅速的解讀到內容。然而﹐NetBEUI卻有一個最致命的弱點﹕它不是可路由(routable)協定﹐也就是不能夠和其它網路的機器對講。NetBEUI在本地網路裡面是非常優秀的協定﹐但如果您想和設在其它網路的機器溝通﹐NetBEUI就不是您所需要的了。如果您想實現和其它網路的電腦溝通﹐您極有可能必需通過路由設備或路由軟體來實現﹐但無論用哪一樣﹐很遺憾﹐NetBEUI都做不到。

    不過﹐Microsoft 網路則運用一種叫 NetBIOS over IP 的技術﹐來連接不同網路的 NetBEUI 客戶。但歸根結底﹐用來達成路由的不是 NetBIOS 而是 TCP/IP。

  • IPX/SPX
    Internetwork Packet Exchange (IPX) 是一個Novell協定﹐可以在網路設備之間建立?維持和終止通訊連接﹐他既負責數據的傳出﹐也負責傳入。當數據抵達的時候﹐IPX會讀取數據的地址﹐和將之搬運到網路伺服器或工作站的正確地方。如果伺服器或工作站需要送出數據﹐IPX則會確定好數據封包地址﹐然後再通過網路路由出去。

    Sequenced Packet Exchange (SPX) 協定則是用來控制網路處理過程﹐諸如處理丟失封包或其它狀況。

    雖然IPX和SPX都是屬于Novell的﹐但他們的使用並不限制於Novell網路。作為一個傳輸協定﹐IPX/SPX可以被用在許多不同的硬體上面﹐所以IPX/SPX也是一個可路由協定。

  • TCP/IP
    美國國防部開發的 Transmission Control Protocol / Internet Protocol (TCP/IP)﹐當初是用來配合ARPANET (Advanced Research Projects Agency Net)來處理不同硬體之間的連接問題的﹐比如Sun系統和Mainframe?Mainframe和個人電腦之間的連接。

    Internet Protocol (IP)工作於網路層(以後會繼續和大家探討 OSI 的網路層級)﹐它提供了一套標準讓不同的網路有規則可循﹐當然﹐前提是您想使用IP從一個網路將封包路由到另一個網路。IP在設計上是用來在LAN和LAN及PC和PC之間進行傳輸的。

    您可以把IP看成是游戲規則﹐而TCP則用來詮釋這些規則的。雖然TCP/IP原先是專門為幾所大學和機構的使用而設計的﹐但現在TCP/IP已經成為最流行的通訊協定了﹐我們使用的Internet就是用TCP/IP來傳送封包的了。下面就讓我們看看TCP/IP是怎樣工作的﹕

    假如您的公司在好些地方都有分公司﹐各自都有著自己的本地網路(LAN)﹐在總公司跑的是Novell網路﹐但分公司大部份都是用麥金塔電腦。當Mac有數據要傳送給PC的時候將會如何呢﹖

    首先﹐TCP會在這兩個平臺建立起一個可以提供全雙工檢錯(對雙向的數據都進行錯誤檢測)的連接。

    接著﹐IP制定好溝通規則以及Mac和PC之間的連接port。到這裡為止﹐TCP已經準備好數據了﹐如果數據太大﹐IP就將之分拆成幾份較小的封包﹐並且在封包上面加上一個新的header(轉送地址)﹐確保封包會被正確傳送。TCP還會加上標籤說明數據的種類及其長度。

    再下來﹐IP將封包轉換成標準的編碼格式並將之傳送給PC。

    最後﹐在PC上面的TCP將封包解碼並翻譯成PC能夠懂的格式﹐也就是它自己所使用的網路協定。TCP/IP可以說是現行協定中用途最廣的協定之一﹐由于它嘗試在所有硬體上實現所有事情。不過﹐它也是最慢的傳輸協定之一﹐在某些情形之下﹐它的速度只有NetBEUI的七成。

在安裝完成了上面的通訊協定之後，相信你的區域網路之中，所有的 Windows 個人電腦已經可以看到對方了，只要在開啟資源分享項目，即可達到區域網路的目的。

確定你的網路參數
  • 連上 Internet 的方式：由於目前最常用來連線的方式，主要分為：固定IP（例如學術網路，或者是固定制IP的專線），浮動式IP（例如目前最流行的 ADSL 計時制）兩種，這兩種網路的設定方式雖是大同小異，但是仍有部分不同的，所以你要先確定你的連線上 Internet 的方式為何！如果是固定制的 IP 的話，請務必取得你的 IP 及 子遮罩網路IP 與 Getway 的IP等三組 IP 位址，另外亦需要 DNS 的 IP 一組。那如果是浮動式 IP 的連線方式，則僅需要你的連線帳號、連線密碼、及 DNS 的 IP 即可。
  • 設定 Linux 主機成為 NAT 主機：由於內部網路是由虛擬 IP 所構成的，虛擬 IP 並不能與外界的 Internet 溝通，所以你如果要連上 Internet 的話，就必須透過具有實體 IP 的 Linux 主機來連線了！因此，你的 Linux 主機必須有兩張網路卡：
    1. 一張以實體IP（不論是固定的或者是浮動的）與 Internet 連線，
    2. 一張則以虛擬IP與你的內部網路連線。
    3. 然後將這兩塊在 Linux 主機內的網路卡經由 Linux 內部的 NAT 設定來達成使 虛擬 IP 連上 Internet 的功能。
  • Linux 主機上的設定：如上面所說的，Linux 主機上面有兩塊網路卡，如何設定呢？
    1. 與外界溝通的網路卡：這一張網路卡的設定中，如果是固定 IP 的話，則直接輸入 IP 及子遮罩網路，就可以直接連上 Internet 了；而如果是使用撥接（或者是 ADSL 計時制），則必須使用 rp-pppoe 之類的軟體來連上網路！
    2. 與內部網路溝通的網路卡：這一張卡的 IP 必須與你的內部網路的所有的電腦之 IP 都在同一網段內，例如 192.168.1.0-192.168.1.255 之內，另外，這一張網路卡的 IP 將是你內部網路的所有電腦的『通訊閘』。
  • Windows 個人電腦上的設定：在個人電腦方面，由於我們已經設定了 NAT 主機，這一個主機有一個固定的虛擬 IP 、子遮罩網路，因此，Windows 系統則直接輸入一個固定的虛擬 IP 、子遮罩網路，而通訊閘則設定為 NAT 主機的 IP 即可！
透過上面的連線、在 Windows 上面增加通訊協定，並將你的 Linux 主機設定成為 NAT 主機，則你的區域網路就可以成功的架設起來，並且可以透過 NAT 的技術來達成每部電腦都可以連上 Internet 的功能喔！（相關的設定你可以來這裡看看喔）
2002/ 01/01以來統計人數


連上 Internet
(本文已不再維護，請前往新文章)
最近更新日期：2001/10/17
安裝網路卡
連上 Internet（固定IP與gateway）
連上 Internet（ADSL 撥接系統）
設定網路-使用 netconf
問題討論

安裝網路卡
要連上 Internet 最重要的當然是要先讓你的『網路卡』可以正常工作囉！如果您是照鳥哥推薦的，使用 RLT 8139 晶片的網路卡，那您應該在安裝 Linux 的時候就已經捉到網路卡了，那真是恭喜您啦！因為您的網路卡應該已經可以正常的工作囉！那如果在安裝的時候並沒有捉到網路卡呢？該如何是好？那也不用擔心，因為您也可以事後才安裝網路卡的驅動程式呀！不過，因為 Linux 並不像 Windows 是那樣的隨插即用，所以需要動一些手術的！

如果很不幸的，您使用的是比較罕見的一些晶片組網路卡，以致於在安裝 Linux 時，並無法捉到這張卡，那也不用擔心，在這裡，鳥哥提供一個奇怪的卡的安裝方法，其他的驅動程式安裝法大致上是大同小異的！這張卡的型號是：FNW-9702-T，是日本製的。

  1. 下載驅動程式：
    你在選購網路卡的時候，只要看到是 RLT 8139 系列晶片的網路卡，則 Linux 肯定是有支援的！若是想要買雜牌的卡或是特別想要的卡（例如 D-Link 530 TX），那你就必須要注意這些卡的包裝上面是否有提及『支援 Linux 』字樣！如果有支援的話就可以買了，因為一定會有驅動程式附在上面的磁片中的，以鳥哥的 FNW-9702-T 為例，他就有附上一塊驅動程式片，裡頭有一個 linux 目錄，裡面就是安裝驅動程式的原始碼啦！如果找不到驅動程式的話，你可以到下面的網站去找找看有沒有你需要的驅動程式原始檔案，例如上面提到的 D-Link 530TX的驅動程式原始碼在這個網站中就有提供下載！
    Linux Network Drivers
  2. 在 Linux 下編譯驅動程式模組：
    下載了驅動程式原始碼之後，再來就是開始編譯了！ FNW-9702-T 這塊卡的驅動程式放在軟碟的 linux 目錄下，檔名為 viarhine.c 並附上一個可執行的批次檔 trans，其實，沒有 trans 也沒有關係，只要有 viarhine.c 這個檔案就行了！(1)先將軟碟 mount 上系統，(2)然後將原始碼複製到 /tmp 目錄下，(3)開始編譯。整個指令為：
    [root@tsai /root]# mount -t vfat /dev/fd0 /mnt/floppy
    [root@tsai /root]# cp /mnt/floppy/linux/viarhine.c /tmp
    [root@tsai /root]# cd /tmp
    [root@tsai /tmp]# gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c viarhine.c
    如上所示，最後一行 viarhine.c 就是你的驅動程式原始碼啦（要改成你的檔名）！而 gcc 是系統預設的 C 語言編譯程式，後面接的是編譯成 Modules 的參數，照著打就對了！這樣執行完畢之後，會在 /tmp 下產生一個名為 viarhine.o 的檔案。（當然，如果你是使用別的原始碼，則你的檔名會成為==>filename.o）
  3. 將編譯好的模組安裝在 Linux 中：
    基本上，如果你以鳥哥的系統為範例的話，會發現你的驅動程式模組都放在 /lib/modules/2.2.12-20/ 底下，而網路的驅動程式則放在：
    • /lib/modules/2.2.12-20/net/ （2.2.12-20是你的核心版本）
    安裝的步驟是：
      • 將你剛剛編譯完成的模組放置到這個目錄來：
        cp /tmp/viarhine.o /lib/modules/2.2.12-20/net/
      • 然後在 /etc/conf.modules 這個檔案中，將這個模組加入！
        vi /etc/conf.modules （使用 vi 修改 conf.modules 這個檔案）
        alias eth0 viarhine
        install viarhine insmod viarhine
    基本上在 /etc/conf.modules 加入上面那兩行字之後，系統就可以捉到這張網路卡了！ conf.modules 有點像這樣：
    alias eth0 rtl8139
    alias eth1 viarhine
    install viarhine insmod viarhine
    上面是兩張網路卡的系統，其中，第一張網路卡的晶片是 rtl8139 而第二張網路卡的型號則是 viarhine ！
  4. 開始於 /etc/sysconfig 中進行設定：
    設定 /etc/sysconfig/network 檔案：
    在設定完了上面的驅動程式後，接下來是要開始設定系統了！請先進入 /etc/sysconfig 這個目錄中，在這個目錄下有一個檔案名為 network，這是網路的基本設定檔，有點像這樣：
    [root@tsai sysconfig]# more network
    NETWORKING=yes
    FORWARD_IPV4=yes
    HOSTNAME=tsai.adsldns.org
    GATEWAY=
    GATEWAYDEV=eth0
    在上表中每個咚咚的意義為：
    • NETWORKING=yes：代表網路正在運作中，若為 no 則沒有運作網路；
    • FORWARD_IPV4=yes：代表這個系統可被當作 NAT 使用；
    • HOSTNAME=tsai.adsldns.org：代表這個系統主機的名稱（要改主機名稱由此改變）；
    • GATEWAY：這表示你的通訊閘為哪一個位址，由於我們是使用撥接的，所以一般通訊閘會自動由撥接程式所給予！然而由於我們在這個機器上使用了 NAT 技術，因此 GATEWAYDEV=eth0 就會多出這一行！
    而如果你改過了 network 這個檔案的時候，記得要重新啟動 network 喔，使用下列參數啟動：
      /etc/rc.d/init.d/network reload
    設定 /etc/sysconfig/network-scripts/ifcfg-eth0：
    接下來我們要開始設定執行檔了！在 /etc/sysconfig/network-scripts 中有很多各 ifcfg-XXX 的型式的檔案，這些就是執行檔，其中 ifcfg-lo 是每部機器都會有的內部網路系統，而由於我們剛剛設定完了驅動程式，不見得會有 ifcfg-eth0 這個檔案，你可以自己以 vi 來編輯這個檔案。如果是第一張網路卡，則為 ifcfg-eth0 ，第二張為 ifcfg-eth1 ，以此類推！
    [root@tsai network-scripts]# more ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=static
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=yes
    • DEVICE=eth0：這個裝置的名稱；
    • BOOTPROTO=static：使用我們給的網路名稱（若為浮動 IP 則為 dhcp ）
    • BROADCAST=192.168.1.255：這是節點的網域；
    • IPADDR=192.168.1.2：這是這塊網路卡的位址；
    • NETMASL=255.255.255.0：子遮罩網路；
    • NETWORK=192.168.1.0：工作的網域；
    • ONBOOT=yes：開機自動開啟網路卡。
    在上面的例子中，我們以虛擬 IP 來作為示範，假定這部機器的 IP 為 192.168.1.2 ，則 BROADCAST 就是 192.168.1.255 （xxx.xxx.xxx.255），NETMASL 通常是 255.255.255.0 （與你的 IP class 有關，不過，通常我們就設成 255.255.255.0 也就是了）， NETWORK 就設為 192.168.1.0 (xxx.xxx.xxx.0）。如果你的網路位址是固定的，那上面的網址就跟著改變即可！
  5. 啟動網路卡：
    再來就是啟動網路卡啦，啟動的方式很簡單，只要輸入 ifup eth0 即可：
    [root@tsai network-scripts]# ifup eth0
    [root@tsai network-scripts]# ifdown eth0
    上表中，『 ifup 裝置』就是啟動裝置的意思，所以如果你有多張網路卡的話，就由此來設定吧！至於 ifdown 就是關閉網路卡的意思！
  6. 確認網路卡正常工作：
    一切工作都完成之後，當然要確認網路卡是否可以正常工作了，即使沒有連上 Internet 也沒有關係，使用了虛擬 IP 仍然可以使你的網路卡正常工作的，所以在 ifup eth0 之後，可以用 ifconfig 來視察一下你的網路情況：
    [root@tsai network-scripts]# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:50:FC:20:F1:4D
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:8568007 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8351854 errors:0 dropped:0 overruns:0 carrier:0
    collisions:986 txqueuelen:100
    Interrupt:10 Base address:0x6100

    eth1 Link encap:Ethernet HWaddr 00:80:C8:5A:87:01
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:8381302 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532065 errors:0 dropped:0 overruns:0 carrier:0
    collisions:317 txqueuelen:100
    Interrupt:9 Base address:0x6200

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:3924 Metric:1
    RX packets:567 errors:0 dropped:0 overruns:0 frame:0
    TX packets:567 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0

    ppp0 Link encap:Point-to-Point Protocol
    inet addr:211.74.249.38 P-t-P:172.16.11.8 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
    RX packets:8356088 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532063 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:10

    正常來講，如果你尚未連上 Internet 的話，則只有 eth0, lo 兩個系統在上面！
  7. 完成安裝。

連上 Internet（固定IP與gateway）
確定了 網路卡 沒有問題之後，再來則是網路連線的問題了！請先確認你的網路硬體連線沒有問題，請到前面看看去。這裡先說說如果以固定制（或者是校園網路系統）的情況之下，你已經知道了你的 IP 與 gateway 的 address 的話，該如何設定以登上網路呢？『請特別注意，這是給已經知道你的 IP 與 Gateway 的情況下使用的方法，若是使用 ADSL 撥接系統上網的話，請使用下面的方法！』
  1. 在安裝 Linux 的時候設定：
    如果你還沒有忘記安裝的步驟，並且使用的網路卡為 Linux 支援的 RTL 8139 系列晶片的話，在安裝過程中應該就已經輸入好 IP address 及 通訊閘（gateway）了！果真如此的話，當真恭喜你，因為你應該已經可以順利的連上網路了！如果沒有的話，請以以下的方法修改設定檔吧！
  2. 修改 /etc/sysconfig/network-scripts/ifcfg-ethX 檔案：
    如果你是新增加網路卡的話，且使用的是 Linux 支援的網路晶片，那在開機過程中， Linux 會詢問你是否要輸入 IP address 、子遮罩網路以及相關的 gateway 與 DNS server 的 IP，如果沒有的話，就必須修改 network 與 ifcfg-eth0 這兩個檔案了。
    以下我們假設：
    • IP為 192.168.1.2；
    • 子遮罩網路為 255.255.255.0；
    • gateway 為 192.168.1.1；
    • 慣用的 DNS server 為 139.175.10.20；
    • 主機名稱設定為 test-redhat.adsldns.org

    第一步：修改 network 檔案：

      在 /etc/config/network 這個檔案中，修改成下面的模樣：
      NETWORKING=yes
      FORWARD_IPV4=yes
      HOSTNAME=test-redhat.adsldns.org
      GATEWAY=192.168.1.1
      GATEWAYDEV=
    第二步：修改 ifcfg-eth0 檔案：
      在 /etc/config/network-scripts/ifcfg-eth0 這個檔案，需要修改成這個模樣：
      DEVICE=eth0
      BOOTPROTO=static
      BROADCAST=192.168.1.255
      IPADDR=192.168.1.2
      NETMASK=255.255.255.0
      NETWORK=192.168.1.0
      ONBOOT=yes
    第三步：修改 resolv.conf 檔案：
      在 /etc/resolv.conf 這個檔案主要是用來設定你慣用的 DNS 用的，需要改成如下模樣：
      search
      nameserver 139.175.10.20
      nameserver 139.175.55.244
  3. 啟動：
    修改完上述三個檔案之後，再來就是啟動網路啦：
    [root@tsai network-scripts]# ifup eth0
    啟動後在使用 ifconfig 去觀察一下你的網路情況，使用 hostname 去察看一下你的網路名稱，也可以使用 route 去看看你的路由表！
  4. 完成。

連上 Internet（ADSL 撥接系統）
在 Linux 系統中，要以 ADSL 連上 Internet 是一件很簡單的事情，使用 rp-pppoe 軟體就可以進行撥接了！安裝也很方便喔！請先確認你的網路硬體連線沒有問題，請到前面看看去。再來要注意的是，目前有兩種安裝的方法，分別是使用 rpm 檔案來安裝，或者直接以 binary (*.tar.gz) 的檔案來安裝！最近在網路上大家都常常會問到，怎麼有些版本下的 Linux 無法編譯 RPM 的檔案呢？於是鳥哥就將 binary 的安裝方法順便也寫上來吧！所以，如果使用 rpm 檔案無法順利安裝 OK 的話，就直接使用 binary 的方法吧！
    RPM 安裝方法：
  1. 取得 ADSL 的 Linux 撥接程式 rp-pppoe：
    如果你是使用 ADSL 撥接系統的話，那就要使用特殊的撥接程式了！在 Linux 中使用最多的大概就是 rp-pppoe 這套程式囉！目前比較新的版本是 3.xx 版，不過目前鳥哥使用的是 rp-pppoe-2.6-1 這一版，如果需要的話，你可以按這裡取得。你也可以在各大搜尋網站找尋比較新的版本（如中山大學FTP站）
  2. 編譯並安裝 rp-pppoe 程式：
    如果你是由本網頁下載 rp-pppoe 程式的話，由於這個檔案是 SRPM 檔案，所以需要先經過編譯才行。另外附帶一提的是， rp-pppoe 可以用很多種方法來安裝，不過個人是比較喜好使用 rpm 的型態來安裝的！因為不但安裝方便，而且未來升級或者是取消安裝或者是察看版本資訊，都比較簡單！詳細的編譯及安裝步驟如下表所示：
    step 1:
    [root@tsai /root]# cp rp-pppoe-2.6-1.src.rpm /usr/src/redhat/SRPMS
    [root@tsai /root]# cd /usr/src/redhat/SRPMS
    將檔案移動至系統預設的 SRPM 的放置目錄（方便以後查詢）

    step 2:
    [root@tsai /root]# rpm --rebuild rp-pppoe-2.6-1.src.rpm
    這時就可以進行編譯了，用 rpm 以 --rebuild 編譯，而編譯完的
    i386.rpm 檔案會被放置在 /usr/src/redhat/RPMS/i386 中！

    step 3:
    [root@tsai /root]# cd /usr/src/redhat/RPMS/i386
    [root@tsai /root]# rpm -ivh rp-pppoe-2.6-1.i386.rpm
    這樣就安裝完畢了！簡單吧！如果不相信，可以查詢看看！

    [root@tsai /root]# rpm -q rp-pppoe
    rp-pppoe-2.6-1

    安裝完畢之後，會在 /usr/sbin 當中多了 adsl-start, adsl-stop, adsl-setup, adsl-status 等檔案，至於設定檔則在 /etc/ppp 當中！如果你要詳細的看每一個指令的用法，可以使用 man adsl-setup ....等指令名稱來觀察！我們這裡僅提供設定的方法及執行的方法！

  3. 申請 ADSL 帳號與密碼：
    我想，如果你看到這裡還沒有 ADSL 帳號的話，也未免不太可能吧？果真如此的話，請上各主要的 ISP 網站去看看如何申請吧！
      中華電信HINET
      SeedNet
      台灣固網
      東森寬頻
      Giga超網路
    申請完了之後，你應該會有一組帳號與密碼才對！
  4. 設定 rp-pppoe ：
    rp-pppoe 的設定非常簡單，只要透過 /usr/sbin/adsl-setup 這個程式來設定就 OK 了！另外有一點蠻重要的，如果你是以第一塊網路卡連線的話，請將 eth0 斷線，若是以第二塊網路卡的話，就將 eth1 斷線！方法如下：
    step 1:
    [root@tsai /root]# /sbin/ifdown eth0
    [root@tsai /root]# /usr/sbin/adsl-setup
    假設我們以第一塊網路卡連上 ADSL ，所以先斷掉 eth0 的連線！

    step 2:
    >>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca):
    這個時候請輸入你在 ADSL 的帳號，
    如果是 seednet 的話，應該有點像這樣==> T0123456
    注意大小寫喔！

    step 3:
    >>> Enter the Ethernet interface connected to the ADSL modem
    For Solaris, this is likely to be something like /dev/hme0.
    For Linux, it will be ethn, where 'n' is a number.
    (default eth1):eth0
    因為我們使用 eth0 連線的呀！

    step 4:
    >>> Enter the demand value (default no):
    這裡按 enter 不用設定就好了！

    step 5:
    >>> Enter the DNS information here: 139.175.10.20
    >>> Enter the secondary DNS server address here: 163.28.112.1
    這裡要你輸入慣用的 DNS 主機，若使用 seednet 的話，可以打入
    139.175.10.20
    若在台南地區的話，可以使用成大的 DNS => 163.28.112.1

    step 6:
    >>> Please enter your PPPoE password:
    >>> Please re-enter your PPPoE password:
    這裡就輸入你的 ADSL 密碼啦，要輸入兩次喔！

    step 7:
    The firewall choices are:
    0 - NONE: This script will not set any firewall rules. You are responsible
    for ensuring the security of your machine. You are STRONGLY
    recommended to use some kind of firewall rules.
    1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
    2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
    for a LAN
    >>> Choose a type of firewall (0-2):0
    這裡要你選擇防火牆 的形式，通常我是不設火牆的，
    所以直接選 0 就對了！

    step 8:
    Ethernet Interface: eth0
    User name: T0123456
    Activate-on-demand: No
    Primary DNS: 139.175.10.20
    Secondary DNS: 163.28.112.1
    Firewalling: NONE

    >>> Accept these settings and adjust configuration files (y/n)? y
    接下來將你的設定作一個整合結果輸出，如果沒有問題的話，
    輸入 y 之後就完成設定啦！
    基本上，設定完成之後以下的檔案會被自動改變，
    有影響的是 resolv.conf 這個檔案，你可以手動改變這個檔案喔！

    Adjusting /etc/ppp/pppoe.conf
    Adjusting /etc/resolv.conf
    (But first backing it up to /etc/resolv.conf-bak)
    Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
    (But first backing it up to /etc/ppp/pap-secrets-bak)
    (But first backing it up to /etc/ppp/chap-secrets-bak)

  5. 連上 Internet 啦：
    連上 Internet 之前，請先確認 eth0 或 eth1（用來連接線到 Modem 的那一張網路卡）已經斷線了，可以使用 /sbin/ifconfig 來確認，然後直接輸入
      /usr/sbin/adsl-start
    即可連上網路啦！
    通常比較容易出問題的地方在於硬體的連線情況，請先確認所有的硬體連線沒有問題喔！通常，如果你使用小烏龜（ATU-R）時，請使用跳線連接網路卡與ATU-R。另外一個容易出錯的地方在於輸入的帳號與密碼，帳號與密碼都是你的 ISP 給你的，並且注意大小寫。
  6. 察看你的 IP 使用情況：
    連上 Internet 之後，當然就是要去瞭解你的真實 IP 啦，使用 /sbin/ifconfig 即可知道，如下表：
    [root@tsai network-scripts]# /sbin/ifconfig
    eth0 Link encap:Ethernet HWaddr 00:50:FC:20:F1:4D
    inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:8568007 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8351854 errors:0 dropped:0 overruns:0 carrier:0
    collisions:986 txqueuelen:100
    Interrupt:10 Base address:0x6100

    eth1 Link encap:Ethernet HWaddr 00:80:C8:5A:87:01
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:8381302 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532065 errors:0 dropped:0 overruns:0 carrier:0
    collisions:317 txqueuelen:100
    Interrupt:9 Base address:0x6200

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    UP LOOPBACK RUNNING MTU:3924 Metric:1
    RX packets:567 errors:0 dropped:0 overruns:0 frame:0
    TX packets:567 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0

    ppp0 Link encap:Point-to-Point Protocol
    inet addr:211.74.249.38 P-t-P:172.16.11.8 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
    RX packets:8356088 errors:0 dropped:0 overruns:0 frame:0
    TX packets:8532063 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:10

    在上表中顯示，ppp0（就是 ADSL 的 ISP 給你的真實 IP）的網址是 211.74.249.38，而 eth1 由於是使用來作為 pppoe 的介面，所以就沒有網址啦，而 eth0 則是內部的虛擬網路，因此他的 IP 是 192.168.1.2 這一個區段內的虛擬 IP 啦！
  7. 開機自動連線：
    如果想在開機之後自動讓你的 Linux 撥接連上 Internet ，你可以在 /etc/rc.d/rc.local 這個檔案的最底下一行加入：
      /usr/sbin/adsl-start
    如此一來就可以在啟動 Linux 之後自動撥接囉！
  8. 自動偵測連線狀況：
    這種撥接系統最怕的就是 ISP 突然的斷線了！你可以利用 crontab 這一個例行性執行檔案系統來設定你的自動偵測連線！如果功力高強一點的話，你可以自己寫一個小程式來判斷你的連線情況，如果功力不夠強的話，就讓系統自動在 3 分鐘撥接一次，反正如果在連線狀態中，再撥接一次也沒關係，系統會自動判斷是否要繼續進行撥接工作！如何執行 crontab 呢？請你以 root 的身份執行下面的工作：
    [root@tsai /root]# crontab -e
    進入 iv 編輯畫面，將下面的字寫進去：

    01-59/3 * * * * root /usr/sbin/adsl-start
    按下了 :wq 即可！

    如果再懶一點的話，請直接在 /etc/cron.hourly 這個目錄之下執行：
    [root@tsai cron.hourly]# echo /usr/sbin/adsl-start > adsl-start.sh
    將 /usr/sbin/adsl-start 這個指令寫進去 adsl-start.sh 這個檔案中；

    [root@tsai cron.hourly]# chmod 744 adsl-start.sh
    更改成可以執行的檔案！

    由於 /etc/cron.hourly 是系統預設的每小時均要執行的檔案夾，所以你將 adsl-start.sh 放置在這個資料夾中，則每小時系統會自動的執行這個指令一次喔！

    Binary 安裝的方法：
  1. 下載 binary 檔案的 rp-pppoe 檔案：
    目前鳥哥測試過的版本為 rp-pppoe-2.8.tar.gz 這一版，，你可以直接按檔案名稱來下載耶！或者是那句老話，到一般比較有名的大型 FTP 站搜尋比較新的版本吧！
  2. 接下來，就是解壓縮、./configure、make 及 make install 等程序囉：
    [root@tsai root]# mv rp-pppoe-2.8.tar.gz /usr/local/src/
    [root@tsai root]# cd /usr/local/src
    [root@tsai src]# tar -zxvf rp-pppoe-2.8.tar.gz
    [root@tsai src]# cd rp-pppoe-2.8
    上面的指令只是在解壓縮罷了，有概念的玩家不用照作！

    [root@tsai rp-pppoe-2.8]# ./configure --prefix=/usr/local
    上面的指令在自動讀取系統的相關設定參數，以產生 Makefile 檔案
    我們預設安裝在 /usr/local/sbin 底下！

    [root@tsai rp-pppoe-2.8]# make; make install
    將 rp-pppoe 編譯完成之後，直接安裝！

    上面這樣就已經安裝好 binary 的 rp-pppoe 囉！很簡單吧！但是，需要注意的是，安裝之後的 adsl-setup 及 adsl-start 是在 /usr/local/sbin 這個目錄中，你可以將這個路徑加到你的 /root/.bashrc 檔案中，或者直接將 /usr/local/sbin/adsl-* 拷貝到 /sbin 當中亦可。
    [root@tsai root]# vi .bashrc

    PATH="/usr/local/bin:/usr/local/sbin:/usr/local/snmp/sbin:/usr/local/snmp/bin:/usr/local/squid/bin:/bin:/sbin:/usr/bin:/usr/sbin"
    export PATH

    [root@tsai root]# source /root/.bashrc

  3. 接下來則是與安裝 RPM 檔案相同的步驟囉，設定 adsl-setup 後，以 adsl-start 進行連線，上去看看吧！

設定網路-使用 netconf
其實你也可以使用 userconf 這個圖形介面的網路設定程式來設定你的網路，基本上他的設定與我們手動的設定差不多的，有興趣的話你可以連線到 study-area 這裡看看，以下節錄出一些片段：
  1. 您可以在文字模式下(不是在 X Window 裡面)輸入﹕netconf
  2. 然後選擇﹕Basic host information
  3. 按 Enter 之後﹐在Host name 那裡輸入您的機器名稱﹐如﹕redhat52.siyongc.domain
  4. 然後按向下的方向鍵(不要用 Tab 鍵)﹐跳到Config mode那裡﹐選擇 Enable 和 Manual。至於 Dhcp 和 Bootp﹐除非您確定網路上面有提供這個兩種服務﹐否則不要選擇。這裡的 Menual 是使用靜態 IP 的意思。
  5. 然後是Primary name + domain﹐其格式是﹕“機器名稱.網域名稱”﹐如﹕redhat52.siyongc.domain
  6. 在Aliases (opt) 裡面輸入機器的別名﹐我這裡使用﹕redhat52。這樣﹐如果您嫌機器名稱太長大話﹐就可以使用別名來代替機器全稱了。例如執行 ping redhat52.siyongc.domain 和 ping redhat52 是一樣的。
  7. 再來是IP address和Netmask﹐如﹕192.168.0.17/255.255.255.0﹐這對寶貝通常都要同時指定。如果您不清楚怎麼設定 IP 和 Mask﹐請到“網路基礎”中的“IP基礎”看看。
  8. 再下來是Net device﹐我們先從第一張網路卡開始﹕eth0。‘eth’就是Ethernet 的意思﹐這是我們最常見的網路類型了。而通常電腦設備都是從 0 開始排列的﹐所以 eth0 就是裝在本機的第一張 ethernet 網路卡。
  9. 如果您使用的網路卡是 NE2000 兼容 PCI 網路卡﹐在 Kernel module 那裡輸入 ne2k-pci 。假如您是按上面的例子裝的NE2000 兼容卡﹐則改為 ne 。無論如何﹐您必須知道您的網路卡使用什麼 module。您可以在 /lib/modules/`uname -r`/ 下面的 net 和 pcmcia 這兩個目錄中找到各種網路卡的 module。
  10. 如果您使用 PCI 或 pcmcia 網路卡﹐您應該不用理會I/O port (opt) 和 Irq (opt) 這個兩項。不過﹐如果您確切知道設備使用的資源是什麼﹐倒也可以指定的﹐尤其在多網路卡的情況下。
  11. 如果您繼續按向下的方向鍵﹐則可以設定其他的網路卡了﹐其設定項目都是一樣的。
  12. 當所有設備設定好之後﹐您可以按 ‘Tab’鍵跳到“Accept”鍵﹐然後按 Enter 回到上一級畫面。
  13. 然後按方向鍵選擇“Name serve specification (DNS)”﹐再按 Enter 。
  14. 首先在DNS usage那裡確定 DNS is required for normal operation 被選擇了。
  15. 然後輸入default domain﹐我這裡是 siyongc.domain。
  16. 然後是nameserver 1﹐因為我打算用本機架設 DNS 伺服器的﹐所以輸入本機 IP 地址﹕192.168.0.17 。
  17. 接著是nameserver 2 (opt)﹐您可以考慮將上游網路的 DNS 伺服器放這了﹐如您的 ISP 提供的 DNS。
  18. 如果您知道您可能還需要其他的 DNS 伺服器﹐可以將之放在nameserver 3 (opt) 那裡。
  19. 再來是指定 search domain 1 (opt)﹐這裡可以考慮您的上游 domain 名稱。
  20. 如果您的網路還連接到其他的網路去掉話﹐可以分別將之放進search domain 2 3 4.... (opt)中去。
  21. 如果都設定好了﹐請按Accept 鍵回到上一級畫面。
  22. 進入Routing and gateways﹐如果您的機器通過 router 連接上游網路的話﹐可以將預設網關寫進Default gateway裡面。假如您的機器本身用來做 router 的話﹐則指向自己的 IP 地址﹐同時將 Enable routing 選擇。不過﹐如果您只是使用接撥連線到 ISP 的話﹐則不指定任何 Default gateway。
  23. 完成之後按Accept。
  24. 如果您的網路還連接到其他網路的話﹐請一一在orther routes to networks 及其他項目指定好。如果您對 routing 設定(這非常重要)不是很清楚﹐請參考“網路基礎”。
  25. 至於其他項目﹐暫時不用設定。等以後講到該題目了再回來設定。
  26. 然後選擇Quit 。
  27. 如果您要設定馬上生效﹐選擇Active the changes然後 Enter。否則跳到 Quit 。

本章問題討論：
  1. Q：
    A：

  2. 等待加入新討論：
2002/ 01/01以來統計人數


NAT Server (適用於 ipchains)
(請注意，若您使用 kernel 2.4 ，請前往新文件)
最近更新日期：2001/08/14
虛擬 IP 與 NAT 技術
安裝第二塊網路卡
區域網路與 Internet 連線示意圖
架設 NAT
問題討論

虛擬 IP 與 NAT 技術
當你已經學會使用 ipchains 這一個 Linux 的功能來實現 IP 偽裝和為網路建立簡單的防範之後（這個功能等一下就會提到了），你就可以利用 Linux 來為您做更多的事情﹕其中有一個非常好的功能叫 NAT (Network Address Translating) 。使用 NAT有什麼好處呢﹖

首先﹐如果您當初架設的網路使用了私有位址（就是虛擬 IP），而現在又想連上 internet ，雖然您可以對您的網路重新分配 IP 地址﹐但這樣做是非常費心和隱藏的問題多多。這時候﹐ NAT 就可以幫到您了﹕您只需用一台 Linux 主機安裝兩片網路卡﹐一張使用合法 IP 地址來擔當對外地連線﹐另外一張使用私有 IP 負責和內部網路溝通。

然後﹐您為那張對外連線的網卡建立多個 IP alias ﹐當收到傳給那些 IP alias 的請求的時候﹐可以把這些請求通過 NAT 轉送給內部真正負責網路服務的伺服器﹐而那些伺服器根本無需更改 IP 地址﹐依舊使用原來的私有 IP 就可以。

使用 NAT 還有一個好處是﹐可以分流網路負擔 (load balancing) ﹐也就是說﹐您可以將同一個 IP alias 的請求分別導向好幾台執行相同服務的伺服器。這樣對於處理大量數據的服務是非常好用的。

安裝第二塊網路卡
好了，由『區域網路的架構』及上面提到的『NAT主機的設定』都可以知道，由於我們需要提供區域內的虛擬網路系統（區域網路，LAN），所以在你的 Linux 主機中應該要安裝兩塊網路卡才是。不過，對於第二塊網路卡的安裝，在這裡有些建議：基本上，第二張網路卡最好不用使用與第一張相同晶片的卡，例如你第一張卡使用 RTL 8139，那第二張卡最好使用別的卡。因為鳥哥曾經發現，在鳥哥的 RedHat 6.1 英文版中，安裝兩塊相同的（同公司出的） RTL8139 ，結果竟然兩張卡的輸出輸入都是經由第一張！也就是說，第二張卡根本就沒有用處！並且，也很容易發生 eth1 與 eth0 捉錯的情況！所以，請記得，『第二張網路卡不要使用與第一張網路卡相同晶片的卡！』

好了！假設你已經安裝了第一塊網路卡，而且也已經由『連上 Internet』的方法連上網際網路了，那接下來就是要開始安裝第二塊網路卡了，如何安裝第二張網路卡呢？依序以下列的步驟安裝就可以完成囉！

  1. 關機、硬體安裝：這個不用再提了吧！，先關機，然後拆開外殼，插入PCI網路卡即可；
  2. 開機、硬體掃瞄：然後再開機，而於開機的過程中，你的 Linux 會主動去找到這一張網路卡（如果這張卡是有被 Linux 支援的！），果真如此的話，那在這一步驟中， Linux 會要求你輸入 IP 與 GateWay 等等的 IP 位址，由於這一張網路卡是定義在內部網路使用的介面，因此你可以輸入 192.168.1.2，而 子遮罩網路為 255.255.255.0，DNS與Gateway都寫成自己 192.168.1.2 即可！
  3. 安裝網路卡驅動程式：如果在上一步驟中，你的網路卡並不能被捉到，哪就比較傷腦筋！請到前一個頁面參考特殊的網路卡的驅動程式安裝方法。
  4. 檢視設定 /etc/sysconfig/network-scripts/ifcfg-eth1：在安裝完了網路卡的驅動程式之後，在 /etc/sysconfig/network-scripts/ 中，應該會有 ifcfg-eth1 這一個檔案。這一個檔案可以設定如下（當然，你也可以依自己的喜好設定）：
    [root@tsai network-scripts]# more ifcfg-eth1
    DEVICE=eth1
    BOOTPROTO=static
    BROADCAST=192.168.1.255
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    ONBOOT=yes
    上面的設定中，就變成了：eth0為對外的連接介面，eth1為對內的連接介面！
  5. 啟動第二張網路卡：使用『ifup eth1』 來啟動之。

區域網路與 Internet 連線示意圖
基本上，我們連線區域網路的連線方法有如下面所示：

透過具有 NAT 功能的 Linux 主機來達成內部網路與外部網路的溝通！詳細的說明可以到『區域網路的架構』來看看。

架設 NAT
好了，說了這麼多，終於要實地的演練 NAT 機器了！如何設定呢？這裡要再提醒一下：
  • 第一張網路卡 eth0 為對外的連線介面，具有實體 IP；
  • 第二張網路卡 eth1 為對內的連線介面，為虛擬 IP。
基本上，你要做的事情其實真的很簡單，只要：
  1. 確定第一張網路卡可以連上網際網路：關於對外的連線上網際網路方法請參考『連上 Internet 』的說明，這裡就不多說了；
  2. 確定第二張網路卡可以正常的啟動：這是一張具有虛擬 IP 的網路卡，請確定他可以被啟動，另外，這裡的設定是這樣的：
    • IP為 192.168.1.2；
    • 子遮罩網路為 255.255.255.0；
    • gateway 為 192.168.1.2；
    • 慣用的 DNS server 為 139.175.10.20；
  3. 開啟 IPV4：確定 /etc/sysconfig/network 這個檔案中，有下列這一行：FORWARD_IPV4=yes，這是開啟傳送 IP 服務的一個設定。如果沒有的話，請將這一行加入 network 這個檔案中，然後執行：
    # /etc/rc.d/init.d/network reload
  4. 確定 ipchains 已經編譯進核心：這個比較麻煩，不過，如果你是用這個網頁提供的方法進行安裝 Linux 的話，這個程式已經被編譯進核心了，所以不用理他沒關係！
  5. 設定 192.168.1.0-192.168.1.255 這一個網段的 IP 可進行 NAT 服務：接下來就是直接設定了，只要依序執行底下的咚咚：
    /sbin/ipchains -P forward DENY
    /sbin/ipchains -A forward -j MASQ -s 192.168.1.0/24 -d 0.0.0.0/0
    /sbin/depmod -a
    /sbin/modprobe ip_masq_ftp
    /sbin/modprobe ip_masq_raudio
    /sbin/modprobe ip_masq_irc
    /sbin/modprobe ip_masq_autofw
    /sbin/modprobe ip_masq_cuseeme
    /sbin/modprobe ip_masq_portfw
    /sbin/modprobe ip_masq_quake
    /sbin/modprobe ip_masq_vdolive
    /sbin/modprobe ip_masq_user
    /sbin/modprobe ip_masq_mfw
    這樣就可以了！如果你覺得這樣很麻煩的話，這裡鳥哥已經有一個寫好的批次檔，與說明檔，你可以下載使用，使用的方法就更簡單了：
    # mkdir /usr/driver
    # mkdir /usr/driver/nat <== 建立一個 nat 的子目錄
    # mv nat.sh /usr/driver/nat <== 將檔案移動到 nat 這個目錄下
    # cd /usr/driver/nat
    # chmod 744 nat.sh <== 修改 nat 成為可執行的檔案
    # ./nat.sh all <== 開始執行
    加上一個參數 all 是讓兩個網域可以連上這部 NAT 主機！
    不要懷疑，這樣就已經作好 NAT 主機的基本設定了！如果你還要設定更精細的防火牆的話，你可以去找一些比較高深的 HOWTO 的文件去鑽研，我這裡就只介紹你可以作為 NAT 的基本設定喔！
  6. 將上面的咚咚寫入開機自動執行檔：由於每次開機都要進行一次 NAT 的設定是很煩的一件事，因此我們可以將上面的一大串字全部寫在 /etc/rc.d/rc.local 這個開機自動執行檔案的最底下，如此一來，每次開機就會自動將 NAT 的設定載入你的主機中了！
  7. 設定 Windows 的網路設定：好了，主機的部分設定完了，接下來就是各個 Windows 個人電腦的設定了，以 Windows 98 為例，
    • 你可以在『開始』->『設定』->『控制台』->『網路』開啟網路相關設定，或者是在『網路上的芳鄰』按右鍵，選內容，也可以進入網路設定內容；
    • 在網路的內容中，察看你所需要的通訊協定是否存在了，主要是有 NetBEUI 、IPX/SPX 、及TCP/IP 這幾個設定，如果不存在的話，請按『新增』->『通訊協定』->選『MicroSoft』便可選擇相關的通訊協定了；
    • 進入 TCP/IP 中，在 IP 項目，填入 192.168.1.xxx ，然後子遮罩網路填選 255.255.255.0，在通訊閘（最重要）的部分填入 NAT 主機的虛擬 IP（這裡是用 192.168.1.2），然後再到 DNS 填入慣用的 DNS 主機（可以是 192.168.1.2 或者是 139.175.10.20）；
    • 重新開機後，就可以連上 Internet 囉！（以上相關的設定請參考小弟寫的一篇咚咚）
  8. 設定完成！

本章問題討論：
  1. Q：何謂『虛擬 IP 』，與『實體 IP 』或者『固定 IP 』『動態 IP 』有啥不同？
    A：
    『實體 IP 』：在網路的世界裡，為了要辨識每一部電腦的位置，因此有了電腦 IP 位址的定義。一個 IP 就好似一個門牌！例如，你要去微軟的網站的話，就要去『 207.46.197.101 』這個 IP 位置！這些可以直接在網際網路上溝通的 IP 就被稱為『實體 IP 』了。

    『虛擬 IP 』：不過，眾所皆知的，IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態，其中， xxx 為 1-255 間的整數，由於近來電腦的成長速度太快，實體的 IP 已經有點不足了，好在早在規劃 IP 時就已經預留了三個網段的 IP 做為內部網域的虛擬 IP 之用。這三個預留的 IP 分別為：

      10.0.0.0 - 10.255.255.255
      172.16.0.0 - 172.31.255.255
      192.168.0.0 - 192.168.255.255
    不過，由於是虛擬 IP ，所以當您使用這些地址的時候﹐當然是有所限制的，限制如下：
      私有位址的路由資訊不能對外散播
      使用私有位址作為來源或目的地址的封包﹐不能透過Internet來轉送
      關於私有位址的參考紀錄(如DNS)﹐只能限于內部網路使用
    這給我們架設IP網路做成很大的方便﹐比如﹕即使您目前的公司還沒有連上Internet﹐但不保證將來不會啊。如果使用公共IP的話﹐如果沒經過註冊﹐等到以後真正要連上網路的時候﹐就很可能和別人衝突了。也正如前面所分析的﹐到時候再重新規劃IP的話﹐將是件非常頭痛的問題。這時候﹐我們可以先利用私有位址來架設網路﹐等到真要連上intetnet的時候﹐我們可以使用IP轉換協定﹐如NAT (Network Addresss Translation)等技術﹐配合新註冊的IP就可以了。

    『固定 IP 』與『動態 IP 』：基本上，這兩個東西是由於近來網路公司大量的成長下的產物，例如，你如果向中華電信申請一個商業型態的 ADSL 專線，那他會給你一個固定的實體 IP ，這個實體 IP 就被稱為『固定 IP 』了。而若你是申請計時制的 ADSL ，那由於你的 IP 可能是由數十人共同使用，因此你每次重新開機上網時，你這部電腦的 IP 都不會是固定的！於是就被稱為『動態 IP』或者是『浮動式IP』。基本上，這兩個都是『實體IP』，只是網路公司用來分配給用戶的方法不同而產生不同的名稱而已！

    這裡只有說了一些概念性的東西，基本是，IP是很麻煩的，小弟也不甚瞭解，例如子網路遮罩的計算等等！強烈的建議初學者到 study-area 這個網站去看看，相信對你往後的電腦網路概念有很大的幫助喔！

  2. 等待加入新討論：
2002/ 01/01以來統計人數


動態 DNS 申請
(本文已不再維護，請前往新文章)
最近更新日期：2001/08/21
什麼是 DNS ？
去申請免費的動態 DNS 系統
偵測小技巧

什麼是 DNS ？
如果你常常在台灣上網路的話，應該都知道奇摩站的網址為 www.kimo.com.tw 吧！所以你在瀏覽器的網址列上打入 http://www.kimo.com.tw 就可以連上 奇摩站了！好啦，那我們知道其實 Internet 上面用來認識你的電腦的門牌都是使用 IP 來進行的，例如 奇摩站 的 IP 其實是 202.1.237.21，所以如果你在網址列打上 http://202.1.237.21 同樣也可以連上 奇摩站 的！雖然使用 IP 即可連上主機，但是由於 IP 是一堆數字的集合，很難記憶，所以才會有 DNS 這種網址列的出現，這樣一來，只要你記得 kimo 就大概可以知道他的網址列，而不用死記一堆 IP 數字了！

舉個簡單的例子，你知道教育的英文吧（education），另外我們也知道 WWW 為一般的網頁主機開頭，所以如果你要登入台灣的教育部首頁，直接在網址列打上 www.edu.tw 就可以啦，那你就不用去記 IP 了！所以，簡單的來說，DNS只是要幫我們記憶一些名稱以對應相對的 IP 的一個系統。

那網址列的名稱有沒有什麼意義呢？其實是有的，網址列的最後幾個字母代表的意義如下：
名稱 | 代表意義
com | 公司、行號、企業
org | 組織、機構
edu | 教育單位
gov | 政府單位
net | 網路、通訊
mil | 軍事單位

我對 DNS 的瞭解也不是很深，大概有的只是一些概念而已，如果你想要對 DNS 有更深一層的瞭解，建議到 study-area 來看看！

去申請免費的動態 DNS 系統
好了，既然知道了 DNS 系統了，那什麼叫 動態DNS 呢？這是由於近年來撥接網路的盛行，而撥接網路所分給你的 IP 並非固定的，例如以 seednet 為例，你每次重新開機而 seednet 給你的 IP 大致上是分佈在 211.74.XXX.XXX 這一個 IP ！所以你每次撥接上網的 IP 是隨機分配的！

那就會產生一個問題，如果你架設了一個網站，但是你的 IP 卻一直變來變去，那用戶端如何跟你連線呢？這時就有所謂的動態 DNS 出現了，他的運作原理是這樣：你每次開機的時候，寫一個小程式去向這個動態DNS主機 要求更改你的 IP ，這個主機會將你申請的名稱與 IP 重新作一個調整，因此，只要別人知道你的主機名稱，不論你的 IP 為何，他一定可以連上你的主機（因為 IP 跟著你的主機而變！）這對於我們這種使用動態 IP 的人是很有幫助的！

目前就我所知，台灣地區有一個試驗性的免費動態 IP 系統，由於是試驗性的，所以他並不保證完全可以讓你的DNS永遠沒有問題！不過，如果你有心去架設一個網站的話，可以去申請需要付費的動態DNS系統！那應該會比較好一些！至於申請的方式，你可以到底下的網址去看看，這裡就不多作介紹了！

免費動態 DNS ：
台灣地區免費動態DNS系統
付費動態 DNS 系統：
荻恩斯科技
當然還有很多的動態DNS系統，你可以多多比較了！不過，目前我所申請的是免費的 DNS 系統，你可以上去看看囉。

偵測小技巧
申請了 動態DNS系統 當然是希望在每次重新連線的時候可以自動將你的 IP 送上主機去更改了，這時你就需要用到 crontab 這種例行性檢查的服務了！

crontab：
在 Linux 系統當中，由於有些服務是必須在某些時刻開啟的，因此就有 crontab 服務的產生， crontab 可以讓你在固定的時候執行某些動作！關於系統的 crontab 你可以到 /etc/crontab 這個檔案去看看， RedHat 6.1 預設的 crontab 有點像這樣：
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01-59/3 * * * * root run-parts /etc/cron.min <= 我加上的一行
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

上面的說明是這樣的：

MAILTO：如果底下執行的動作發生了一些訊息，這些訊息應該傳給誰？由於 root 沒有辦法在其他的機器上登入以取得郵件，因此這一行我都會改成我的 ID帳號！
另外，在 run-parts 部分，（注意： # 後面接的是註解，並不會被執行）共有五個數字（如果沒有數字的話，必須以 * 來代替），這五個數字的意義是：
1 | 2 | 3 | 4 | 5
分鐘（0-59） | 小時（0-23） | 每月的第幾天 | 月份（1-12） | 星期幾（0-6）
例如 01 * * * * root run-parts /etc/cron.hourly 表示每個小時的 1 分鐘執行 /etc/cron.hourly 這個目錄中的所有執行檔，而 42 4 1 * * root run-parts /etc/cron.monthly 則表示每個月的一號的4點42分執行 /etc/cron.montly 這個目錄下的所有執行檔，然後我通常會在run-parts 當中加入如上表中黃色顯示的那一行，那一行表示：在每隔三分鐘之後執行 /etc/cron.min 這個目錄下的所有執行檔！因此，我必須在 /etc 中先建立一個名為 cron.min 的目錄： mkdir /etc/cron.min，然後將我所需要的例行性執行檔寫在這個目錄中！

一個範例：
以下是我寫的一個小程式，你可以看看：
#!/bin/sh
# 這個小批次檔將可以讓你的 DNS 更改你目前的 IP ，
# 並請注意，這個批次檔是在 seednet 的網域中寫的，
# 在 hinet 或其他的 ISP 中我還不能肯定是否可以執行！
# 我的系統是 Redhat 6.1，核心是 2.2.18 ，
# 另外，我的 eth0 是內部網路的接線， eth1 是連接到 ATU-R 上的！
# 我使用的撥接程式是 rp-pppoe-2.6.1 這一個！
# 所以我的撥接執行檔在 /usr/sbin/adsl-start ！

# VBird 2001/08/18
# ============== 請輸入必要的參數 ==========================
# 1. 請輸入你的 eth0 這張網路卡的 IP （虛擬 IP ）
# 以我為例，我是使用 192.168.1.2 這一個 IP ，請依你的設定來寫！
ETH0IP=192.168.1.2
PASSWD=xxxxxx
EMAIL=xxx@xxx.xxx.xxx
HOSTNAME=xxx.adsldns.org
# ===========================================================
PATH=$PATH:/sbin

# 建立搜尋檔案！
Base=`pwd`
CardFile="no"
[ -f ${Base}/card1 ] && CardFile="yes"
if [ "$CardFile" = "no" ]; then
echo card1 > ${Base}/card1
else
qq=qq
fi

# 搜尋你目前主機上的 IP
IP1=`/sbin/ifconfig eth0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP2=`/sbin/ifconfig eth1|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP11=`echo $IP1 |awk -F '.' '{print $1}'`
IP21=`echo $IP2 |awk -F '.' '{print $1}'`
IP31=`echo $IP3 |awk -F '.' '{print $1}'`
workIP=`ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
LANIP=`ifconfig eth0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`

# 你上一次登入的 IP 為何？
CARDIP=`cat ${Base}/card1`

# 1. 沒有任何的撥接網路被啟動
if [ "$IP3" = "" ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi
if [ "$IP3" = " " ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi

# 2. 舊的登錄 IP 是錯的！
if [ "$CARDIP" = " " ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi
if [ "$CARDIP" = "" ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi

# 3. 是否需要重新修改你的 IP ?
if [ "$IP3" = "$CARDIP" ]; then
exit 1
else
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
# send your IP to kevin.adsldns.org
echo 'passwd='$PASSWD'&email='$EMAIL'&hostname='$HOSTNAME'&debug=1&forceip='$IP3'' | lynx http://www.adsldns.org/clientupdate.php -post_data
# repleas your card1 file
echo $IP3 > ${Base}/card1
fi

上面這個批次檔你可以在這裡下載，並請注意，上面黃色的字的地方是你需要修改的東西，ETH0IP為你的內部網路的通訊閘的 IP ，其他的項目則是你在 www.adsldns.org 申請的時候所附上的資訊！請填寫這些東西就可以了，然後將這個檔案放置到你剛剛建立的 /etc/cron.min 這個目錄中，然後修改他的屬性成為： chmod 744 /etc/cron.min/ping_net_card.sh，如此一來，則每三分鐘系統會去偵測你的網路是否存在，若不存在則會重新啟動你的撥接程式，並且在撥接之後將會直接更新你在 www.adsldns.org 的 DNS 囉！

2002/ 01/01以來統計人數


設定代理伺服器（Proxy Server）
(本文已不再維護，請前往新文章)
最近更新日期：2001/11/09
什麼是代理伺服器
代理伺服器的優缺點
哪裡有代理伺服器
下載安裝 squid
設定代理伺服器
Windows 內的設定
squid 的注意事項 （增進 proxy 效能的方法 ）(update 2001/11/09)
什麼是代理伺服器
從字面上的意義來看，代理伺服器(proxy)就是幫用戶端（就是你啦）去向目的地的機器要求用戶需求的主機，因為他是你的代理人嘛！所以，當你設定代理伺服器之後，你的所有相關的要求均會經過代理伺服器去搜尋！例如，當你設定你在 windows 的 IE 下的代理伺服器是 seednet 在南部的代理伺服器（ksproxy.seed.net.tw、port: 8080），則當你要去奇摩的網站時，奇摩的網頁資料將會先經過 ksproxy.seed.net.tw 這一部主機的存取之後，再傳送到你的 windows 中！有點像下面這個流程：
你的 Windows ---> ksproxy.seed.net.tw ---> www.kimo.com.tw
你的 Windows <--- ksproxy.seed.net.tw <-----------」
這裡請注意，通常 proxy 都會將用戶端要求的資料作一個備份在硬碟中！所以，當你要求過一次 www.kimo.com.tw 的資料後，這份網頁資料就會暫存在 ksproxy.seed.net.tw 這架 proxy 中，而暫存的時間長短是依主機的設定而定的！

多層次的代理伺服器
好了，那如果你設定了一個代理伺服器在你的 Linux 中，但是這個代理伺服器的設定中，又會設定你的代理伺服器的上層代理伺服器？？此話何解？也就是說，當你的代理伺服器被要求去作某些工作的時候，他將會再透過向其他地方的代理伺服器要求，來達到你的需求，例如你的代理伺服器的上層代理伺服器是 ksproxy 這一部，則用戶端對你的 Linux 代理伺服器的要求就會變成這樣：

你的 Windows --> 你的 proxy --> ksproxy.seed.net.tw ---> www.kimo.com.tw
你的 Windows <-- 你的 proxy <-- ksproxy.seed.net.tw <-----------」
也就是說，從用戶端對你的要求到 www.kimo.com.tw 的東西，必須經過兩個 proxy 主機的存取之後，才能到你的 windows 當中！

更詳細的說明你可以看一下這裡。

代理伺服器的優缺點
那代理伺服器有何優點呢？當然囉，沒有優點幹嘛架設代理伺服器？呵呵！底下說說他的優點吧：
  • 快速的存取動作：他最大的優點就是可以提供用戶端較為快速的瀏覽或者是資料的存取！咦！由剛剛的說明來看，你直接向 www.kimo.com.tw 的要求需要經過一個主機的存取動作，甚至是多個主機的存取，那理應更慢才對，為何會造成較快的情況呢？如果你仔細的看一下上面的流程，你會發現，當第一個人要求過 www.kimo.com.tw 的資料後， ksproxy.seed.net.tw 就已經保存有這份資料了，所以以後向這部 proxy 要求相同資料的用戶端，將會直接取用這份資料，而不用到 www.kimo.com.tw 去了！故，通常我們設定代理伺服器的時候，一定要找距離我們的機器最近的那一部，否則就沒有達到代理伺服器的功用了！通常快速的存取動作最明顯的大概是連去國外的網站了！這裡要強烈的建議，如果你需要連上國外的網頁，請一定使用代理伺服器，因為不但可以節省頻寬，並且速度上會快上很多很多（例如美國 EPA 網站！！）。
  • 降低網路的負荷：由於我們是項代理伺服器要求資料，如果代理伺服器內剛好有你要的資料，將會直接傳給你，則你的要求將不會到真實的那一個網頁去（除非你在 IE 內按下『重新整理』這個按鈕），而如果沒有你要求的資料，那他也會去捉一份你要的資料給你，並存下來，以後如果有與你相同需要的用戶，那他就可以直接傳送給用戶，如此當可降低網路的負荷！另外，有些企業部門會將不同目標的代理伺服器分開來，達到分流的目的！例如：proxy1主要為找尋台灣的網站，proxy2 為找國外的網站，則你的網域終將可以達到很好的分流效果，網路會比較快速喔！
  • 提供防火牆內部的電腦連上 Internet：這個是一般企業比較常用的情況！由於企業內部害怕被駭客侵入，通常會設立一些比較嚴密的防火牆，然而如此一來公司內部的電腦可能面臨無法連上 Internet 的窘境，那使用 proxy 讓你的內部電腦可以透過這一架主機的代理服務而取得 Internet 上的資訊，就是一個很好的方法啦！
  • 多層次的管道：代理伺服器可以提供多重的管道設定，例如，當你需要國內的資料時，代理伺服器將直接去捉取，而需要國外的資料時，才連到上一層的代理伺服器！如此將可達到你的需求（而不用常常在你的 IE 等瀏覽器上更改所需的代理伺服器）
但是有利就有弊，代理伺服器有何缺點呢？由於代理伺服器的設定中，通常會設定其上層代理伺服器，如果你沒有設定好，則如果你要讀取近端的網頁資料，可能會造成繞了一圈才又回到你的伺服器的情況！因此設定上需要比較小心。
哪裡有上層代理伺服器
如果你需要設定代理伺服器的話，底下有一些在網路上公開的代理伺服器可供參考喔！
  • SeedNet 的代理伺服器；
  • Hinet 的代理伺服器；
  • 一些台灣學術網路的代理伺服器。
同時這裡要補充的是，在一些私人單位的 Proxy （如 SeedNet 與 Hinet）設定中，他們僅提供給使用自家 ISP 的用戶，因此不同的 ISP 之 Proxy 設定是會不同的！
下載安裝 squid
安裝各種套件的方法主要可以分成 rpm 升級以及用來源檔（binary檔案）升級，以 rpm 方法升級是比較簡單的方法，而且以 rpm -q 的指令可以來查詢目前你的系統中的套件版本！不過由於 rpm 出來的時間會比較慢，並且不同 Linux 版本之間可能會有版本相容性的問題，所以你也可以直接以 binary 升級（就是使用 *.tar.gz 的檔案升級的方法）。要注意的是，你只要以其中一種方法升級就好了，不用重複升級喔！
下載：
目前使用最多的代理伺服器程式，大概是 squid 這一套程式了！在 Redhat 6.1 中就已經有這套軟體，只是版本比較舊（2.2.stable-4），通常我會喜歡把這一套軟體升級後才予以設定！升級的方式有兩種，一個是使用 rpm 升級，另一個則是直接使用 source code 升級，以下提供的是 squid-2.4.STABLE1-5.src.rpm 的升級方式。不過，由於 squid 在安裝的時候需要其他的附屬套件的安裝，所以還需要一些套件，這裡提供了使用 rpm 升級的所有需要的套件，你可以下載回去用用看！另外，如果你需要使用到原始碼來安裝的話，這個網站你也可以去看看！

rpm 安裝方法：
我是以 RPM 程式來安裝的，安裝的附屬套件要先安裝才行，過程如下：
[root@tsai /root]# tar -zxvf squid-2.4.STABLE1-5.tar.gz
先解壓縮吧，這時會有一些檔案會產生出來，然後請接著執行下面的動作！

[root@tsai /root]# /bin/rpm --rebuild pam-0.74-22.src.rpm
[root@tsai /root]# /bin/rpm -ivh /usr/src/redhat/RPMS/i386/pam-0.74-22.i386.rpm
[root@tsai /root]# /bin/rpm -ivh /usr/src/redhat/RPMS/i386/pam-devel-0.74-22.i386.rpm
[root@tsai /root]# /bin/rpm --rebuild sgml-common-0.5-7.src.rpm
[root@tsai /root]# /bin/rpm --rebuild sgml-tools-1.0.9-12.src.rpm
[root@tsai /root]# /bin/rpm -ivh /usr/src/redhat/RPMS/noarch/sqml-common-0.5-7.noarch.rpm
[root@tsai /root]# /bin/rpm -Uvh --nodeps /usr/src/redhat/RPMS/i386/sqml-tools-1.0.9-12.i386.rpm
[root@tsai /root]# /bin/rpm --rebuild openjade-1.3-13.src.rpm
[root@tsai /root]# /bin/rpm -ivh /usr/src/redhat/RPMS/i386/openjade-1.3-13.i386.rpm
[root@tsai /root]# /bin/rpm --rebuild bash-2.05-8.src.rpm
[root@tsai /root]# /bin/rpm -Uvh /usr/src/redhat/RPMS/i386/bash-2.05-8.i386.rpm
[root@tsai /root]# /bin/rpm --rebuild squid.2.4.STABLE1-5.src.rpm
[root@tsai /root]# /bin/rpm -Uvh --nodeps /usr/src/redhat/RPMS/i386/squid.2.4.STABLE1-5.i386.rpm

請注意，由於有些套件有點小錯誤，所以需要強制安裝，因此有些安裝過程需要加上 --nodeps 這個參數才能安裝！！至於 --rebuild 是重新編譯的意思，若對於 rpm 不明瞭，請在往前看看以 rpm 升級的辦法一文吧！

基本上，經過上面的安裝之後，應該就可以把 squid 升級了，你可以察看一下：
[root@tsai /root]# rpm -q squid
squid-2.4.STABLE1-5
這樣就安裝好囉！

來源檔升級：(update 2001/11/09)
那如果你想要以最新版的 squid 來升級的話呢，要如何是好？這裡提供了目前（2001/09/xx）最新的 squid 版本 squid-2.4.STABLE2-src.tar.gz ，新版的功能是比較多的。
安裝的方法很簡單，只是你要先將 RedHat 6.1 原先的 squid 移除，然後將剛剛捉下去的檔案。整個安裝的方法，簡單的來說，有下列幾個步驟：
[root@tsai /root]# cp squid-2.4.STABLE2-src.tar.gz /usr/local
將檔案拷貝到 Linux 預設的本機安裝套件的目錄 /usr/local 中！

[root@tsai /root]# cd /usr/local
[root@tsai local]# tar -zxvf squid-2.4.STABLE2-src.tar.gz
這時會產生一個名為 squid-2.4.STABLE2 的目錄！
在這個目錄中有一個 INSTALL 的檔案，你可以看一下裡面的流程！

[root@tsai local]# cd squid-2.4.STABLE2
[root@tsai squid-2.4.STABL2]# ./configure --prefix=/usr/local/squid \
--enable-icmp --enable-async-io=40 \
--enable-err-language="Traditional_Chinese" \
--enable-cache-digests
上面 --prefix 後面接的是 squid 即將安裝的目的目錄，
也就是說，你的這一版 squid 會安裝在 /usr/local/squid 中！
另外， --enable-async-io=40 這一個咚咚最好加上去！
會增加很多的總體效能喔！（快得不得了！）
至於 --enable-err-language-"Traditional_Chinese" 是指將錯誤訊息
以中文輸出！

[root@tsai squid-2.4.STABL2]# make
[root@tsai squid-2.4.STABL2]# make install
上面就是在編譯及安裝啦！

這樣就安裝完畢囉！
設定代理伺服器
這裡僅提供簡單的代理伺服器的設定，如果你需要更詳細的設定的話，請到 squid 的網頁去看看吧！

需要給予設定的檔案：

  • 基本上，需要給予設定的檔案只有一個，即是 squid.conf 這個檔案。要注意的是，如果你是以 rpm 安裝的，則這個檔案會放在 /etc/squid/ 中，如果你是以 binary 安裝的，那這個檔案就會放在 /usr/local/squid/conf 當中！
  • 另外，程式預設的啟動批次檔， rpm 的是 /etc/rc.d/init.d/squid 這個檔案，而 binary 則在 /usr/local/squid/bin/squid 這個檔案；
  • 而程式預設的暫存目錄在 /var/spool/squid ！
    以下我將以 rpm 的檔案進行說明，當然囉， binary 的修改是一樣的，只是檔案放置的地點不一樣罷了！
確定 squid 可以正常執行：
    我們先簡單修改一下 /etc/squid/squid.conf 這個檔案，讓他可以被啟動，然後再繼續往下修改！
  • 找到下面幾行，將註解（#）拿掉：
    http_port 3128
    icp_port 3130
    cache_mem 8 MB
    cache_dir ufs /var/spool/squid 100 16 256
    cache_access_log /var/log/squid/access.log
    cache_log /var/log/squid/cache.log
    cache_store_log /var/log/squid/store.log
  • 找到下面這行，並改成下列情況：
    http_access deny all ==> http_access allow all
  • 上面那一行改好之後，儲存並離開 vi ，然後執行：
    /etc/rc.d/init.d/squid start
    或者是
    /usr/local/squid/bin/squid
    如此則 squid 應該可以正常執行了！接下來請到 IE 中，如果你是 IE 5.0 以後的版本，請到：
      『工具』->
      『Internet 選項』->
      『連線』->
      『區域網路設定』中，點選
      『使用 Proxy 伺服器』
    並在網址列輸入你的主機名稱（或者是 IP 均可），然後按確定離開！然後在 IE 中按按看網頁的設定有沒有成功，如果可以讀到網頁的話，表示 squid 可以正常的被使用了！
    雖然 squid 可以被使用，但是要讓你的 squid 實際發揮應有的能力時，你應該最少要設定一些基礎的參數的！所以請繼續往下看吧！
進階的 squid.conf 設定：
在完成了上述的設定之後，你的 Proxy Server 就可以啟動了，不過，如果你想要再進一步進行設定的話，例如剛剛提過的，你想要讓 squid 的上層代理伺服器具有選擇性，以及想讓 squid 的暫存空間更大，那你就必須要再設定了，以下提供幾個不錯的網頁提供給你做為參考！
  • 優克筆記本；
  • 台北市教育網路中心；
基本上，需要注意的地方主要可以分為底下幾個：
  • http_port 3128：
    這個東西是用來設定你的 Proxy 監聽訊息的 port ，目前 proxy 通用的 port 是 3128 ，但是你也可以自行設定一個大於 1024 的 port ，例如另一個常用的 port 是 8080 這一個。不過我並不建議你修改這個 port ，因為如果你修改了之後，很有可能會造成無法連線的情況，所以還是使用預設值 3128 吧！
  • cache_peer：（相當重要的！）
    這個就是用來設定上層代理伺服器的指令，剛剛有提過『代理伺服器可以設定多個』，而且你可以將代理伺服器分類，以我為例，因為我住台南，所以成大計中對我而言是一個很不錯的伺服器，則我如果要向上層代理伺服器要求訊息，可以指向成大計中（快很多喔！），亦即是 proxy.ncku.edu.tw 3128 這一個，請你依照你的所在地來設定你的代理伺服器吧。
    • cache_peer proxy.ncku.edu.tw parent 3128 3130
      上面的說明是，使用 proxy.ncku.edu.tw 這個主機當作 主要的（parent，就是父母的意思）上層代理伺服器，另外，如果你想要向對等的伺服器要求東西，就可以將 parent 寫成 slbling 囉！除此之外，這一個指令可以重複寫入，也就是說，你可以同時設定多個上層代理伺服器！不過這裡要向大家報告一下，如果設太多上層伺服器的話，由於資料會一層層的去要求，所以速度反而會變慢！基本上是建議大家只要設定兩個到三個左右的上層代理伺服器就好了。
      再者，3128是 squid 主要的 port ，而 3130 則是另外一個監聽的 port ，也要寫上去喔！
  • cache_peer_domain：（相當重要的！）
    這個參數可以用來分別指定不同網域的代理伺服器，以我為例，因為常上美國 EPA 的網站，而 proxy.ncku.edu.tw 對於這個網站的讀取能力很強，另外，gate.ncku.edu.tw 這個 proxy 則對 ucar.edu 這個美國網域的讀取能力較強，那我可以使這兩個網域向不同的 proxy 索取資料：
    • cache_peer_domain proxy.ncku.edu.tw .epa.gov
    • cache_peer_domain gate.ncku.edu.tw .ucar.edu
      那你曉得了嗎？只要你在這裡分別指定不同的代理伺服器，那你自己的這個代理伺服器就自動的幫你完成你需要的資料來源了！很重要吧！
  • cache_mem 8 MB：
    這東西與你的記憶體有關，如果你的記憶體夠大的話，這個 8 可以變大一些，例如你的記憶體有 256 MB 時，你可以設成 256*1/4 ==> 64 MB，如果你只有 64MB，而且主機還有其他用途，那使用預設的 8 MB 就好了。
  • cache_dir ufs /var/spool/squid 100 16 256：(update 2001/11/09)
    這個指令就是限制暫存區大小的地方啦，上面的說明是：暫存區目錄為 /var/spool/squid ，而暫存空間大小為 100M ， 在這個暫存目錄下有 16 個目錄，而每個目錄中又有 256 個目錄（你可以實際進入 /var/spool/squid 當中去看看）。如果你要改變暫存檔目錄及這個目錄的大小時，可以在這裡修改！不建議修改 16, 256 這兩個數值。另外，通常，如果是我們一般小型的區網（不超過10個人），那設定個 500 應該夠了，如果你的硬碟夠大，設定成 1000 以上更好。修改過這個指令後，要再重新啟動 squid 之前，請先使用下面的指令來使你的目錄可以進行存取的動作，否則你的 squid 是不會工作的！例如你將上面的參數修改成：
      cache_dir ufs /var/spool/squid 1000 16 256
    然後再進行下面的指令：
      rm -rf /var/spool/squid
      mkdir /var/spool/squid
      chown squid:squid /var/spool/squid
      /usr/sbin/squid -z
    這樣你的squid暫存目錄就可以使用囉！
    另外，如果你剛剛在安裝的時候有將 --enable-async-io=40 這一個加進來的話，將可以增加 aufs 這一個磁碟的用途！這個東西可真是好呀！可以將你的硬碟發揮到最極限的速度喔！雖然在 squid.conf 檔案中有提及，這個 type 可能會有 bug 存在，不過，據鳥哥的使用結果，發現，沒啥大問題！好用的很！所以，你可以將上面的咚咚改成下面的樣子：
      cache_dir aufs /var/spool/squid 1000 16 256
  • acl 與 http_access：
    這兩個檔案是相互輝映的，例如：如果你只要將這個 Proxy 開放給內部網路 192.168.1.XXX 用的話，你可以增加這三行：
    • acl insidenet src 192.168.1.0/255.255.255.0 （insidenet 只是一個代號，你可以任意設定，但須與底下的相同名稱。而 src 代表後面接的是 IP 的意思，而後面的 IP(255.255.255.0) 表示 192.168.1.0~192.168.1.255 均為此設定中！）
    • http_access deny all（關於 proxy 全部的服務均取消）
    • http_access allow insidenet localhost（僅開放 Proxy 給 insidenet 及 localhost 兩個網域使用）
  • cache_mgr root：
    當 squid 有問題的時候，要聯絡誰？通常我都將 root 改成我自己的 ID ，如此才能在其他的機器上收到信！
    • cache_mgr vbird@tsai.adsldns.org
  • acl 與 always_direct：（很重要）
    這個就是是否需要直接去讀取你要的網頁，而不要透過上層代理伺服器的指令（重要）。例如：我們不需要在台灣地區的學術網路還透過上層代理伺服器的話，可以寫入這兩行：
    • acl Taiwan-net dstdomain .edu.tw（就是設定網址，其中 dstdomain 後面接的就是網址，網址的型態亦可僅寫成 .tw 即可）
    • always_direct allow Taiwan-net（這個網址的網頁，直接由我們這個 Proxy 去捉，而不透過上層 Proxy）
  • acl 與 never_direct：
    這個就是不要直接去取得資料的設定處，例如我們常去的美國環保署網站，我們希望關於這個網頁的資料一定由上層 Proxy 去捉取，則可以這樣設定：
    • acl usepa dstdomain .epa.gov
    • never_direct allow usepa
    上面這個 always_direct 與 never_direct 的設定可以是多重的，你可以多寫入幾個對應的網址，去定義你的上層 Proxy 的工作路徑！
  • prefer_direct off：
    上面這個選項一定要設定為 off ，不然的話你的 squid 將會嘗試直接到網站去捉資料，而不會透過上層 proxy 喔！
  • 重新啟動：
    設定完成之後，最重要的就是重新啟動了，你可以這樣來啟動：
    • /etc/rc.d/init.d/squid restart
    • /usr/local/squid/bin/squid -k reconfigure
  • 特別需要注意的地方：基本上這樣的 squid 設定應該能滿足你的需求了，如果你的上層代理伺服器設定妥當的話，那你應該會感受到代理伺服器帶給你的網路連線速度上的快樂喔！不過有些地方還是需要注意一下的：
    1. 目前作為代理伺服器的主機，大都由於頻寬的問題，所以會限制連線上來的使用者，就是上面的 http_access 這個參數的設定值，因此，你應該針對你所在的網域去調查你的上層代理伺服器，若可能的話，可以提出申請，請管理員幫你開啟使用，否則對 squid 是不會有幫助的！
    2. 在 acl 後面接了代號及 dstdomain 之後，如果你要接一個網域的話，請在前面加 . 例如美國環保署的網站（不論是 www 或其他）就要寫成 .epa.gov 而不是 epa.gov（先前我搞錯了！向大家對不起！），這樣一來，不論 www.epa.gov 或 adb.epa.gov 才會經過你的上層 proxy 喔！
    3. 請依照你實際的需求來設定 acl 與 never_direct 與 always_direct ，例如你人在台灣，那幾乎所有 com.tw 的網站都不用透過 proxy 也可以捉得很好！反而透過 proxy 會變慢哩，同樣的，如果是學術網路的話，就直接把 .edu.tw 加入到 always_direct 當中吧！
    4. 也需要注意一下 cache_peer_domain 用來分流的方法喔！
設定的幾個範例：
這裡有幾個設定的範例可以參考一下：
  • 成大 gate.ncku.edu.tw 的 squid.conf 設定
  • 電機系 turtle.ee.ncku.edu.tw 的 squid.conf 設定
  • 台南學校範例 proxy.school.tn.edu.tw 的 squid.conf 設定

Windows 內的設定
以下使用 IE 作為說明，如果是 Netcape 的話，基本上的設定是相同的：
  • 開啟 IE ，然後在『工具』內選擇『Internet 選項』：
  • 在開啟的視窗內選擇『連線』並點選下方的『區域網路設定』：
  • 在新的框框中，填入你所需要的 Proxy 的網址或者是 IP 均可，而 port 則需視你的代理伺服器而定，以我為例，我都是使用 192.168.1.2 作為我的主機（NAT、Proxy、Web 都是同一台機器），而 port 也僅是設定為通用的 3128 ，所以如下方設定即可，當然，如果你是在南部的 seednet 用戶，或者可以填入 ksproxy.seed.net.tw，port 則填入 8080 即可。
  • 另外，你也可以在 IE 中直接設定你要直接去捉取的網頁名稱，點選上個圖的 『進階』那一項，在出現的框框的最底下，可以填入你不想透過 Proxy 捉取的網站網址！
如此一來則設定好了 Proxy Server 囉！

squid 的注意事項
使用代理伺服器後，瀏覽國外的網頁應該是可以變快的！但是，你要小心幾件事：
  1. 若 squid 內設定的使用空間滿了，則 squid 將不會運作！
  2. 若 squid 的紀錄檔太大了，則工作效率會變慢！
如上所述，由於 squid 可能會讓你的硬碟空間飽和（尤其我們都是使用舊電腦，硬碟容量本來就不是很足夠），如果每隔幾個月就要去清理硬碟一次，那可能會造成人力的浪費，這個時候，使用例行性的工作就是個好方法啦！
  • 刪除記錄檔的方法：
    基本上，記錄檔不需要保存太久的時間，你可以在 /etc/cron.daily 這個目錄中增加一個檔案（檔名隨便取都可以），假設檔名為 system_do.sh，則在這個檔案中，你可以增加這一行：
    /usr/sbin/squid -k rotate <==/usr/sbin/squid 這個路徑要指向你的 squid 執行檔
    這個方法在使你的紀錄檔可以被轉成備份檔案！而且每天都更新備份，不過，你必須將 system_do.sh 這個檔案更改成可執行檔，例如： chmod 700 system_do.sh

    然後在你的 /etc/cron.weekly 目錄中，也增加一個檔案，裡頭也增加一行：
    rm -rf /var/log/squid/*.gz
    同樣的做成可執行檔，如此，則每個禮拜系統可將你的備份檔案殺掉囉！

  • 刪除記錄目錄的方法：
    同樣的，你可以在每個月清理一次你的暫存目錄，你可以將你的 /etc/cron.monthly 裡面增加一個檔案，增加下面這幾行：
    echo Now, restart Proxy Service
    /etc/rc.d/init.d/./squid stop
    echo removing directory "/var/spool/squid"
    rm -rf /var/spool/squid <==與你的暫存目錄設定有關
    echo recreated directory "/var/spool/squid"
    mkdir /var/spool/squid <==與你的暫存目錄設定有關
    echo chang owner to squid
    chown squid:squid /var/spool/squid
    echo recreated swap directory, using /usr/sbin/squid
    /usr/sbin/squid -z
    echo starting proxy server!
    /etc/rc.d/init.d/squid start
    則每個月系統會自動的將 squid 暫存於 /var/spool/squid 的資料全部殺掉，再重新建造一個新的目錄，另外，將目錄改變成 squid 所有（避免不能讀寫的情況！）之後，啟動這個暫存目錄的格式化（squid -z），最後再重新啟動！如此則不需害怕暫存目錄會被吃光光了！
  • 增加 proxy 效能的方法：
    1. 關於上層代理伺服器：用 cache_peer 設定上層代理伺服器的數目不要太多，只要 2-5 個之間就好了，而且上層代理伺服器一定要找距離你最近，並且具有較大頻寬的主機，如果是在台南，那 proxy.ncku.edu.tw 就是不錯的主機；
    2. 關於暫存目錄的設定：以 cache_dir ufs 設定的目錄，最好是單獨割出來的約 1-2 GB 的硬碟槽，以我為例，我將另外一台主機的 30GB 的硬碟割兩槽給 proxy 用，而每一槽只有 2GB ，分別命名為 proxy1 與 proxy2 ，則可以寫成
      cache_dir ufs /proxy1 2000 16 256
      cache_dir ufs /proxy2 2000 16 256
      由於分成兩槽來存取，所以整體效率上會比較好，但這是針對一般比較大型的代理伺服器的設定了，我們這個小主機就不用如此設定（但是效率真的有差哩！）。
    3. 善用 acl, always_direct, never_direct：就如同上面提到的，因為你的目的不同，所以會使用到不同的 proxy 作為你的上層代理伺服器，如果你發現你的上層代理伺服器無法針對你常上的網站來求取資料時，就將那個網站加入你的 always_direct 吧！另外，也可以使用 cache_peer_domain 來處理喔！
    4. 在 ./configure 的時候增加 --enable-async-io=40 這一個指令：基本上，增加這個指令之後，將可以使您的磁碟多一個 type ，亦即是 aufs ，這個 type 的速度較快！
2002/ 01/01以來統計人數


設定郵件伺服器（Mail Server）
(本文已不再維護，請前往新文章)
最近更新日期：2001/08/21
注意：本文件僅適用於 Red Hat 6.2 以下版本
認識郵件運送的過程
簡易的設定 sendmail
Windows 設定
設定郵件別名轉寄
使用 Linux 系統寄信

認識郵件運送的過程
基本上，當你使用 E-Mail 訊息時，信件是如何運送的呢？通常是如下圖這樣運送的：
你的信件將經過 smtp 協定傳送至 郵件伺服器 ，然後郵件伺服器將視有無設定轉信主機（Mail eXchanger, MX），若有轉信主機，則信件先經過轉信主機後再傳到目的郵件伺服器，若無轉信主機，則信件將直接由你的郵件伺服器送至目的郵件伺服器，最後，由你的收件者以 pop-3 協定，將信件由對方的郵件伺服器中捉下來！舉個例子來說，如果你要從 kimo 寄信給鳥哥的話（tsai.adsldns.org），那信件是如何傳送的呢？
  1. 你在 Windows 系統中寫完了信，以 smtp 協定將你的信傳送至 kimo.com.tw 這個郵件伺服器；
  2. kimo.com.tw 這個郵件伺服器將你的信轉送至鳥哥的 tsai.adsldns.org 這個郵件伺服器；
  3. 鳥哥在 Windows 系統中，以 pop-3 協定將這封信由 tsai.adsldns.org 捉下來電腦中！
大致的流程就是這樣而已。底下來說說一些郵件的術語（以下的術語摘至 study-area ）：
  • MUA（Mail User Agent ）：照字面的意義來說，就是所謂的『郵件代理人』，MUA 從字面上看似乎好容易給它嚇死﹐但說穿了您可能會笑耶﹕我們平時用的 Outlook Express、Netscape Mail，或是 Linux 上面的 pine ﹐它們都是 MUA 。簡單說﹐MUA 是用來給使用者流覽郵件和書寫郵件的程式；
  • MTA（Mail Transfer Agent ）：照字面的意義來說，就是『郵件傳送代理人』，我們管它叫郵件伺服器好了﹐它負責 MUA 的請求﹐也負責將郵件從一個 MTA 傳到另一個 MTA 。通常一個 MTA 都可以支持好幾種郵件協定﹐例如﹕ UUCP、SMTP、POP 等。 UUCP (Unix to Unix Communication Protocol) 現在已經比較少用了﹐取而代之的是 SMTP (Simple Mail Transfer Protocol) 和 POP (Post Office Protocol) 這兩個協定。 SMTP 負責的將郵件從 MUA 上傳給 MTA﹐也是 MTA 和 MTA 之間的郵件傳遞協定﹔而在沒有 POP 之前﹐email 的使用者一般都要用 telnet 或其它遠端控制程式連上 MTA 那裡﹐然後在那裡閱讀郵件﹐而有了 POP 之後﹐ MTA 可以將使用者的郵件存在一個檔案裡﹐然後使用者通過 MUA 連到 MTA ﹐再將信件下載回本地機器閱讀。另外﹐ MUA 和 MTA 都無需是同一個廠家的軟體﹐只要雙方都支持 POP 協定就可以了﹐其靈活性是不言而喻的了。有些程式﹐如 sendmail ﹐表面來說﹐就同時具備 MUA 和 MTA 功能了。
  • 我們用 MUA 撰寫郵件之後﹐是通過 SMTP 協定上傳給 MTA 的﹔而閱讀郵件則是通過 POP 從 MTA 那裡下載回來。
Mail 與 DNS 的相關性：
與 mail 最具相關的大概就是 DNS 的設定了，例如你要寄信給我的話，就要寄到 vbird@tsai.adsldns.org 這個信箱，因此，如果你要架設郵件伺服器的話，請務必將你的 DNS 設定正確！否則一定信件是寄不到你的信箱的喔！而由於我們是使用 ADSL撥接系統 來上網的，所以只好申請動態 IP 囉！

簡易的設定 sendmail
開始設定前的準備工作：
在開始設定你的郵件伺服器之前，請先讓你的主機具有 DNS 可以追查到的功能囉！申請 DNS 主要有兩種方法：
  • 若你在學術系統中，你可以直接向您的上一層 DNS Server 的管理員申請，由於你具有固定 IP ，所以架設上會很方便；
  • 再來，如果你與我相同是使用 ADSL撥接系統 的話，由於沒有辦法具有固定 IP，所以只好申請動態 IP 的 DNS 系統了，詳細的申請步驟請至『動態 DNS 申請』中察看。
請千萬注意，由於 DNS 設定錯誤將使你的信件無法收取（不過發信可能沒有問題！）因此這一部分請仔細的設定喔！
    設定 sendmail ：
    如果你是使用這個網頁介紹的 Redhat 6.1 來安裝你的 Linux 的話，那在你安裝好了 Linux 時，你的郵件伺服器已經架設好了！不相信嗎？假設你的 ID 是 test，則你可以進入 Linux 之後，輸入這樣的字眼：
    [test@tsai test]# mail test
    Subject: test <==這裡輸入信件標題
    this is a test mail <==從這裡是信的內容
    . <==要結束就輸入一個 . 即可
    Cc: <==這個是提供副本寄送的地方

    然後你只要輸入 mail 即可收信喔！
    [test@tsai test]# mail
    Mail version 8.1 6/6/93. Type ? for help.
    "/var/spool/mail/test": 1 message 1 new
    >N 1 test@localhost.local Tue Aug 21 15:39 13/388 "test"
    & 1 <==輸入 1 來看第一封信！
    Message 1:
    From test Tue Aug 21 15:39:05 2007
    Date: Tue, 21 Aug 2007 15:39:05 +0800
    From: test <test@localhost.localdomain>
    To: test@localhost.localdomain
    Subject: test

    this is a test mail

    & exit <==輸入 exit 即可離開 mail ！

    雖然你的 Linux 已經具有收發信件的能力，但是你也可以看到，上面的例子中，所顯示的郵件主機是 localhost.localdomain ，這是不對的！寄給別人的信也是使用這一個名稱的話，當然人家一定寄不到你這裡來啦！所以要設定一下你的 sendmail 啦！

  • netconf 設定郵件伺服器：
    基本上，設定郵件伺服器只要兩個步驟：
    1. 一個是使用 netconf 簡易的設定好主機的名稱與其他與主機相關的事項；
    2. 然後再修改 /etc/inetd.conf 這個檔案，開啟 pop-3、smtp 及 imap 的服務即可！
    這個 IMAP 是目前新的郵件協定﹐通過 IMAP﹐ 使用者在 MUA 那端就無需分別指定 SMTP 和 POP 作為上傳和下載協定了﹐而只一個 IMAP 協定就可以﹐而且 IMAP 還可以讓不同的使用者共用一個 MUA﹐非常方便哦。
    netconf：好了，現在來設定一下主機吧：
    1. 以 root 的身份執行 『netconf』，會出現一個視窗；
    2. 向下移動游標到 『Mail delivery system (sendmail)』 這一項，並按下 enter 鍵；
    3. 在出現的框框中選擇 『basic information』 這一項；
    4. 在 『Present your system as』 及 『Mail server』 這兩個地方，都輸入你在 動態 DNS 系統中申請到的名稱（以我為例，在這兩個地方都輸入 tsai.adsldns.org 即可）；另外，在這勾選兩行中間的 『[X] Accept email for adsldns.org』 這一個咚咚，這樣就設定好了！
    5. 以 Tab 鍵將游標移動到 Accept 這一項，按下 enter，回到剛剛的畫面；
    6. 按一次 Quit 出來主選單，選擇『Basic host information』這一項，按 Enter 進入；
    7. 在 『Host name』的地方輸入你的主機名稱，另外，在 『Primary name + domain』 的地方也要輸入一次剛剛輸入的名稱喔！（就是 hostname.adsldns.org這一個！）；
    8. 按下 Accept 退出來之後，回到剛剛的畫面；
    9. 由於 Redhat 6.1 中的 sendmail 『不許直接修改 /etc/sendmail.cf 』這個檔案，所以請到『Generate /etc/sendmail.cf』這個選項按下 enter！重新再產生一個，以符合你剛剛設定的參數；
    10. 然後選擇 Quit 退出，這時系統會自動偵測一些設定，等到出現：
        Activate the changes
        Preview what has to be done
        Don't quit
      這三個選項時，請選擇 Activate the changes 即可！
      注意喔，這個時候系統會先將你的網路停止再重新開啟，所以，如果你是在外部電腦作業的話，請先確認你的撥接系統可以自動撥接上網路喔！
    11. 若有一些錯誤訊息的話，也沒有關係，你可以看看，也可以直接按 enter 離開！
    12. 設定完成！
    很簡單吧，這樣就設定好你的郵件伺服器了！不過，這時候還沒有辦法在 Windows 上面以 pop-3 及 smtp 協定收發信件，所以你接著要修改 /etc/inetd.conf 這個檔案！
    /etc/inetd.conf 檔案設定：
    1. 以 vi 編輯這個檔案：
      [root@tsai /root]# vi /etc/inetd.conf
      找到底下這三行：
      #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
      #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
      #imap stream tcp nowait root /usr/sbin/tcpd imapd
      將上面這三行的註解符號 # 取消即可，再以 :wq 退出！
    2. 退出之後再重新開機！
    這樣子，郵件伺服器在你重新開機啟動後，就可以正常運作了！

    限制：

    • 雖然設定上是很簡單的，不過，這裡有件事要說，就是，在 sendmail 當中，預設值是『無法讓大寫的ID收發信件的』，例如 VBird@hostname.adsldns.org 就沒有辦法使用 sendmail 來收發信件！如果要讓你的 sendmail 可以支援大寫的 ID ，則必須直接修改 /etc/sendmail.cf 這個檔案，而，Redhat 是無法直接讓你修改這個檔案....所以，只好請您在設定 ID 的時候，以小寫來設定吧！
    • 在收發信件的時間上，如果一封信無法寄出，則會等待四小時、一天，這兩個時段，分別發一封警告信給你，到第五天還無法將此信投遞的時候，系統就會將原信退還給你啦！

Windows 設定
好了，現在開始要來設定用戶的收信方法了，在此我仍然以 Outlook 來作介紹， Netscape 的方法是差不多的！你只要知道你的郵件伺服器的名稱就好了（這裡假設你的郵件名稱是 hostname.adsldns.org）：
  1. 開啟 OutLook，點選『工具』裡面的『帳號』；
  2. 點選『新增』選擇『郵件』來設定；
  3. 輸入顯示名稱：這個名稱是別人在收信的時候，可以看到的寄件人稱謂；
  4. 接著下來比較重要了，請使用你的 ID@hostname.adsldns.org 登入你的郵件伺服器；
  5. 然後，當然郵件伺服器收發都是同一個，請使用你的 DNS 申請的名稱；
  6. 輸入帳號與密碼，也可以選擇『記憶密碼』，然後按下一步，就完成了。
基本上，Windows 這邊只要設定如此即可！然後你就可以用你的 Linux 來當郵件伺服器囉！！

設定郵件別名轉寄
你有沒有發現，通常一個人在一個機器上只有一個 ID ，但是，如果你想要讓你的很多別名都可以直接寄到你的帳號中的話，要如何是好？又，如果你想要讓你的小組成員都可以收到同一個帳號的信，要如何設定呢？
  1. 一個人擁有多個不同的虛擬信箱：
    假如你的 ID 喜歡以 nice name 來取，例如 pig ，不過，當你進入工作中，總不好意思還用這一個 ID 吧，假如你的姓名是 王小明 （全中華民國最倒楣的名字！？）那你應該會想要使用 smwang@hostname.adsldns.org 來當你的信箱，那要不要在開一個帳號給你呢？其實不需要的，只要設定一個別名給 pig 這個帳號就可以了！也就是說，當外面的信件收件人寫 smwang@hostname.adsldns.org 的時候， Linux 系統就會主動的將信傳到 pig@hostname.adsldns.org 這個信箱中，也就是說，根本沒有 smwang@hostname.adsldns.org 這個信箱，他只要用來將信件轉到你 pig 帳號中的一個手續而已！
    那要如何設定呢？很簡單，直接以 userconf 來解決就可以了！
    • 執行 /bin/userconf；
    • 選擇 User accounts ；
    • 選擇 pig 這個帳號；
    • 在出現的框框中，將游標往下移動，直到出現如下圖所示：
    • 在上面 Email alias （帳號別名）的地方輸入你想要的別名（可以多重設定喔！）
    好了！設定完成之後，只要選擇 Accept ，不用進行任何其他的步驟， smwang 這個虛擬的信箱就啟用了！方便吧！另外，你一個帳號可以多重設定很多的虛擬信箱喔！
  2. 多人共用一個帳號：
    相反的，假如你們一票同學都希望擁有同一個信箱，如此一來，當 Linux 系統收到一封信時，大家都可以收到了！這時，如果只有一個實體信箱的時候，因為信被 Outlook 收走時，伺服器信箱裡的信也就被刪掉了！後面的人不就收不到了？要如何作呢？其實也是很簡單，如果你有四個人 bird1, bird2, bird3, bird4 希望收到同一個信箱的信，例如 birdhome@hostname.adsldns.org ，那也很簡單，只要在四個人的 Email alias 都設定一個別名為 birdhome ，那四個人就都可以收到 birdhome 這個信箱的信了！
    Linux 的運作過程是這樣的，Linux 當收到 birdhome 這個信箱的信時，會去查每一個實體帳號的 email alias 設定，有設定這個 alias （別名）的人就寄一份資料給他，因此， Linux 總共會寄出四份資料，分別傳送到 bird1, bird2, bird3, bird4 這四個人的信箱中，所以這四個人只要開啟自己的信箱就可以收到同一封信了！
其實，上面兩個方法僅要改變一個檔案即可做到，就是修改 /etc/aliases 這個檔案，這個檔案有點像這樣：
#
# @(#)aliases 8.2 (Berkeley) 3/5/94
#
# Aliases in this file will NOT be expanded in the header from
# Mail, but WILL be visible over networks or from /bin/mail.
#
# >>>>>>>>>> The program "newaliases" must be run after
# >> NOTE >> this file is updated for any changes to
# >>>>>>>>>> show through to sendmail.
#
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
games: root
ingres: root
nobody: root
system: root
toor: root
uucp: root
# Well-known aliases.
manager: root
dumper: root
operator: root
# trap decode to catch security attacks
decode: root
# Person who should get root's mail
#root: marc
smwang: pig
birdhome: bird1 ,bird2 ,bird3 ,bird4
有沒有看到最後一行，smwang: pig ，在虛擬帳號後面接實體帳號，而每個帳號名稱中間以『,』符號分隔！因此，當你需要設定郵件別名的時候，除了 userconf 之外，也可以使用這個檔案來修改！
但是請注意，修改完成之後，還必須執行 newaliases 來載入這個檔案的設定進入 sendmail 中才行！也就是說你必須：
  • 修改 aliases 檔案；
  • 執行 newaliases 來啟動。

使用 Linux 系統寄信
用 Linux 來寄信，最常使用的就是 mail 這個指令了，基本的使用情況是這樣的：
  • 寄出一般文字信件：
    可以輸入 mail id@person.domain.name 來寄出信件。
    [test@tsai test]# mail id@person.domain.name
    Subject: test <==這裡輸入信件標題
    this is a test mail <==從這裡是信的內容
    . <==要結束就輸入一個 . 即可
    Cc: <==這個是提供副本寄送的地方
  • 寄出檔案：
    你也可以直接以 vi 先編輯好一個檔案之後，再傳送出去！例如你寫好了一個檔案，名稱為 mail_raw 則寄出去可以寫成這樣：
    [test@tsai test]# mail id@person.domain.name < mail_raw
  • 看信件：
    直接以 mail 進入後，輸入每一封信件的號碼來看信的內容！
當然還有很多的功能可以使用的，就要讓你自己來摸索囉！
2002/ 01/01以來統計人數


設定 Web 伺服器（適用於 Apache 1.3.xx Server）
(本文已不再維護，請前往新文章)
最近更新日期：2001/09/05
需要哪些 WWW 服務
行前準備
下載 MySQL, php, apache 套件
安裝 MySQL php 與 apache
簡易設定 apache
測試 MySQL 及 PHP 套件
寫入第一個個人首頁
其他的好用小程式（計數器、流量統計等等！）

需要哪些 WWW 服務？
其實，在你一安裝好 Linux 時，就有兩個服務開放了：一個是前面提到的 sendmail （郵件伺服器），另外一個就是 WWW 伺服器啦！在 RedHat 中預設的 WWW 伺服器是很有名的 Apache 這一套，而這一套 www 軟體目前最熱門的是 1.3.XX 版，截至目前為止（2001/08/30）這一版最新出到了 1.3.20 版！以下我們要介紹的就是 Apache 這一套 Web 架站軟體啦！

先來瞭解一下何謂 WWW ，WWW 是 World Wide Web 的縮寫，其中， Web 有廣播網的意思存在，所以，簡單的說，WWW就是全球資訊網，可以結合文字、圖形、影像及聲音等多媒體，並透過超連結（Hypertext） 的方式，將資訊透過 Internet 傳遞到世界各處！那 WWW 的資料是如何傳遞的呢？如果你常上網瀏覽的話（不論是使用 IE 或是 Netscape），你應該會知道，臺灣最大的入口網站是奇摩站（www.kimo.com.tw），所以你只要在網址列上面輸入 http://www.kimo.com.tw 就可以將奇摩站的資料捉到你的瀏覽器中，以供你觀看！這個 http://www.kimo.com.tw 就是所謂的 URL ，其中 www.kimo.com.tw 就是所謂的領域名稱（Domain name）也是前面我們稍微提過的咚咚，奇摩的真實 IP 就是透過 www.kimo.com.tw 經由 DNS 的解析而找到這部電腦，然後經過 http 的功能將資料傳到你的眼前來！因此，要你的 WWW 可以運作正常並且可以讓大家都可以連的進來，就最好一定要申請一個名稱啦！也就是說，你的 DNS 一定要設定正確無誤才行！所以，進行 WWW 的設定之前，你一定要『先具有 DNS 可以找到的主機名稱，並且可以連上 Internet』！

不過，在開始進行 WWW 的設定之前，你可能要先瞭解一下你要你的 WWW 伺服器為你作些什麼？是簡單的『靜態網頁』就夠了嗎？還是需要活潑熱鬧的 PHP+MySQL 的『動態網頁』，或者是另外一套 apache + asp 的動態網頁呢？如果你只要你的 WWW 提供給你最簡單的靜態網頁空間，那你可以只安裝 Apache 即可，而由於 Linux 安裝完畢後即提供WWW的服務了，因此你只要去設定WWW即可。不過，如果你還要其他的較為活潑的動態網頁的話，基本上，目前比較流行的就是 PHP+MySQL+Apache 以及 Apache+ASP 這兩組人馬，這裡我們將提供的是 PHP+MySQL+Apache 的架站，不過，由於 MySQL 及 PHP 的功能也是很強大的，但是在這裡我們僅將 MySQL 及 PHP 視為 Apache 的一個模組，你應該要有個觀念，我們這裡提供的只是很基礎的咚咚， PHP 與 MySQL 並非僅是一個 Apache 的模組喔！這裡要小心！

行前準備
在開始進行 WWW 的實作之前，要跟大家報告的是，由於 WWW 需要在網路的情況下執行運作，因此你一定要：
  • 可以連上 Internet：如果不行的話，請參考 連上 Internet 一文；
  • 具有 DNS 反查的功能：由於我預設你是以 ADSL 計時制的連線方式，因此你應該要去 申請動態 DNS。
具有這兩個先決條件之後，再來架設 WWW 主機吧！然後，如果你有製作過網頁的話，應該會有聽過所謂的Perl、ASP、Java等等的咚咚，這些咚咚的功能之一，就是可以使用來作為設計 WWW 的程式語言的一種！那 PHP 是目前新興的一種程式語言，可以附在 WWW 中執行喔！
好了，我們來瞭解一下什麼是 PHP 與 MySQL 這兩個套件：
  • PHP：官方的說法為：『PHP is a tool that lets you create dynamic web pages. PHP-enabled web pages are treated just like regular HTML pages and you can create and edit them the same way you normally create regular HTML pages.』所以說， PHP 可簡單的視為一種程式語言，可以用來設計留言版、討論區、或聊天室等等的動態網頁的咚咚！由於他具有免費、跨平台、易學及效率高等等的優點，目前算是很盛行的一種設計網頁的咚咚啦！（基本上，PHP與ASP都是使用來設計網頁的程式語言，當然其功能不只如此！你可以輕易的在市面上找到相關的書籍喔）
  • MySQL：將官方網站上的翻譯文件中這麼說：『MySQL是一個真正的多使用者、多執行緒SQL資料庫伺服器。SQL（結構化查詢語言）是世界上最流行的和標準化的資料庫語言。MySQL是以一個客戶機/伺服器結構的實現，它由一個伺服器背景執行程式mysqld和很多不同的客戶程式和庫組成。SQL是一種標準化的語言，它使得儲存、更新和存取資訊更容易。例如，你能用SQL語言為一個網站檢索產品資訊及儲存顧客資訊，同時MySQL也足夠快和靈活以允許你儲存記錄文件和圖像。MySQL 主要目標是快速、健壯和易用。』
    簡單一點來說，這個東西就是一個資料庫處理模組，例如：你在設計討論區的時候，由於討論的文章會日漸增多，因此就會有所謂的資料庫處理的情況，MySQL 的目的就是在處理你這些由用戶端傳送來的資料。當然，其功能還不只此，我這裡僅說一些我們可能用的到的咚咚！
OK！那你應該知道為何我們這裡需要的網站型態是 Apache + MySQL + PHP 的主機狀態了，為了因應未來你的主機可能會支援討論區、留言版、等動態網頁，因此需要有 PHP 這個咚咚，而由於你的討論區資料庫會越來越大，所以需要有 MySQL 套件的支援囉！當然，別忘記這些套件是附在 WWW 下執行的，所以當然就需要 apache 啦！再來當然就是又要捉網路上的東西啦！

下載 MySQL, php, apache 套件
要架設這樣的一個主機需要哪些套件呢？不就是： Apache、MySQL及 PHP 囉！要從何處下載呢？你可以到中山大學的 FTP 站去搜尋，因為他提供的介面鳥哥真是蠻喜歡的，而且也真的很實用喔！尋找檔案快又正確！
  • 中山大學 FTP 站
當然，你也可以到各個套件的發展處去下載：
  • Apache：目前 Apache 已經出到了 2.0.X 版，但是最廣泛使用的還是屬於 1.3.X 版本，這一版本目前出到最新的 1.3.20 版，你可以上 Apache 主網頁去看看相關的資訊：
    • Apache 主頁（英文）：
    • Apache 套件（由主頁下載）：
    • 台灣的映射站台：
    • 由本站下載 apache-1.3.20.tar.gz。
  • PHP：目前最新的是 4.0.6 版（2001年6月才出來的喔），你可以上 php 的主網頁去看看一些相關的咚咚喔！
    • PHP 主頁（英文）：
    • PHP 主頁下載：
    • 台灣映射站台：
    • 由本站下載 php-4.0.6.tar.gz。
  • MySQL：目前最新的版本是 3.23.41，同樣的，你也可以上 MySQL 官方網頁去看看喔！
    • MySQL 主頁（英文）：
    • MySQL 主頁下載：
    • 台灣映射站台：
    • 由本站下載 mysql-3.23.41.tar.gz 。
也就是說，我們需要的檔案有三個，分別是：
  • apache-1.3.20.tar.gz
  • php-4.0.6.tar.gz
  • mysql-3.23.41.tar.gz

安裝 MySQL,php 與 apache
安裝這三個套件比較需要小心，因為使用 RPM 升級的話，可能沒有辦法取得最新的套件版本，所以這裡我們使用最原始的原始碼升級方法。安裝的方法如下：
  • 去除舊版的咚咚與解壓縮：
    1. 去除相關的舊版資料，如果你是 RedHat 6.1 的話，則下面的套件你可以先去除喔！
      [root@tsai /root]# rpm -e mod_perl
      [root@tsai /root]# rpm -e phpfi
      [root@tsai /root]# rpm -e apache
      當然囉，如果你之前安裝了舊版的 Apache 、 PHP、或 MySQL，那你也可以移除。其實這是個人習慣，有的人喜歡保存兩種版本在他們的系統中，若你也想安裝兩種版本在你的系統中，那你也不需要移除 rpm 的安裝套件喔！不過，為了怕系統衝突，你必須要以 setup 的程式來取消 httpd, php 及 mysql 的服務喔！
    2. 解壓縮：
      假如你將 Apache, MySQL 及 PHP 三個檔案放置在 /home/test 這個目錄中，而要將資料解壓縮到 /usr/local 當中，則可以這樣下指令：
      [root@tsai /root]# cd /usr/local
      [root@tsai local]# tar -zxvf /home/test/apache_1.3.20.tar.gz
      [root@tsai local]# tar -zxvf /home/test/mysql-3.23.41.tar.gz
      [root@tsai local]# tar -zxvf /home/test/tar -zxvf /test/php-4.0.6.tar.gz
      則在 /usr/local 中會多出三個目錄，分別是：apache_1.3.20, mysql-3.23.41, php-4.0.6。
  • 安裝 MySQL 套件：
      如果你英文夠好的話，你可以到 /usr/local/mysql-3.23.41 這個目錄中察看一下 INSTALL-SOURCE 這個檔案，裡面對於如何安裝適合你的 MySQL 有很詳盡的說明。如果你要照我的步驟作的話，請往下看吧！
      [root@tsai /root]# cd /usr/local/mysql-3.23.41

      [root@tsai mysql-3.23.41]# ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/var
      上面這個步驟在檢查你的系統，以設定適合你的系統的資料！
      其中， --prefix 後面接你要安裝的 MySQL 目錄所在，而 --localstatedir
      後面則是接你要將資料庫放置的地方，通常我們都會設定在 var 裡面。

      [root@tsai mysql-3.23.41]# make
      [root@tsai mysql-3.23.41]# make install
      上面兩個步驟在安裝 mysql 到你剛剛設定的 /usr/local/mysql 路徑中。
      注意囉，上面的步驟按你的 CPU 而可以耗掉很長的時間！

      [root@tsai mysql-3.23.41]# ./scripts/mysql_install_db
      如果你之前已經安裝過 MySQL 的話，這一步驟就不用安裝了，
      這個步驟在產生 grant tables 這個東西！也就是資料庫啦！
      這個步驟很是重要，如果沒有此步驟，則你的 MySQL 是不會動作的！

      [root@tsai mysql]# adduser mysql
      [root@tsai mysql]# chown -R mysql:mysql /usr/local/mysql
      上面這個步驟在產生 mysql 這個帳號及群組名稱，另外，
      將 /usr/local/mysql 這個剛安裝完畢的咚咚指定為 mysql 的所有，
      這是為了安全性的考量，因為 mysql 的帳號與你原本 Linux 的帳號是不同的喔！

      [root@tsai mysql]# cd /usr/local/mysql/share/mysql
      [root@tsai mysql]# chmod 777 mysql.server
      上面這個步驟再將你的 mysql.server 這個啟動 mysql 的執行檔，
      設定成大家都可以使用的格式。

      [root@tsai mysql]# /usr/local/mysql/bin/safe_mysqld --user=mysql &
      上面這一行在以 mysql 這個人來啟動 mysql 的服務喔！

      [root@tsai mysql]# /usr/local/mysql/bin/mysqladmin -u root password abcde
      上面這一行在設定 root 的 mysql 密碼，其中 abcde 是密碼，你可以自行設定喔！

      上面這樣就安裝完畢了！完成安裝後就要開始測試你的 MySQL 囉！
  • 增加 PHP 模組：
      基本上，PHP 可視為 Apache 的一個模組，由於是屬於 apache 的一個模組，因此我們必須先針對 Apache 進行一次 configure 的設定偵測，這樣才能將 php 增加至 apache 當中，詳細步驟如下：
      [root@tsai /root]# cd /usr/local/apache_1.3.20
      [root@tsai apache_1.3.20]# ./configure --prefix=/usr/local/apache
      上面的指令是要將 apache 安裝在 /usr/local/apache 的意思，
      請注意，要先針對 apache 設定偵測一次才行安裝 php 喔！

      [root@tsai apache_1.3.20]# cd /usr/local/php-4.0.6
      [root@tsai php-4.0.6]# ./configure --with-apache=/usr/local/apache_1.3.20 \
      > --with-mysql=/usr/local/mysql \
      > --enable-track-vars
      請注意上面的指令，中間那三行後面都要接一個 \ 的符號，這是指令繼續的意思，
      也就是說，其實上面最後四行視為同一行的指令！你也可以將上面的指令寫成一長串
      另外，要注意的是，apache 需要指向剛剛偵測過設定的目錄，而 mysql 則指向
      已經安裝完畢的目錄！千萬不要搞錯囉！

      [root@tsai php-4.0.6]# make
      [root@tsai php-4.0.6]# make install
      開始安裝囉！安裝完畢之後，會在 /usr/local/apache_1.3.20/src/modules 中
      多一個 php4 的子目錄，裡面就存在了 php4 的主要程式庫囉！

      [root@tsai php-4.0.6]# cp /usr/local/php-4.0.6/php.ini-dist /usr/local/lib/php.ini
      將主要的 php 設定檔 php.ini-dist 拷貝成 /usr/local/lib/php.ini 這個檔案，
      這是因為 apache 或其他程式執行 php 時需要到 usr/local/lib/ 中去使用這檔案，
      如果您對 php 熟悉的話，可以修改 /usr/local/lib/php.ini 這個檔案，以符合你的設定。

      上面這樣就安裝完 php 套件囉！
  • 安裝 Apache 套件：
      再來就是重頭戲啦，開始安裝 apache 囉！由於已經安裝了 php ，所以在 /usr/local/apache_1.3.20/src/modules 中就會存在 php4 的目錄！
      [root@tsai /root]# cd /usr/local/apache_1.3.20
      [root@tsai apache_1.3.20]# ./configure --prefix=/usr/local/apache \
      >--activate-module=src/modules/php4/libphp4.a
      上面這兩行是同一行啦，要注意的是 --activate-module 這一行，這個得先
      安裝過 php 才能使用這一個模組！

      [root@tsai apache_1.3.20]# make; make install

      這樣就安裝完畢啦！開始來設定 WWW 與測試相關的模組啦！

簡易設定 apache
要來啟動 Apache 囉，在這一版（1.3.20）當中，已經只剩下一個參數設定檔『httpd.conf』這個檔案。如果你是使用 RedHat6.1 原本的 apache 則有三個檔案，分別是：
  • httpd.conf
  • access.conf
  • srm.conf
以下鳥哥將以 apache_1.3.20 版進行說明，如果你是以舊版的 apache 安裝的話，請在其他兩個檔案中找尋相關的設定吧！
Apache 的主要目錄型態：
這是蠻重要的一個地方，因為不同版本的 Redhat 及不同的安裝方法，會產生蠻大差異的目錄型態，以下以 Redhat6.1, RedHat7.0+CLE0.9, 及使用原始碼安裝 1.3.20 的目錄型態：
  • Redhat 6.1：若使用原始的 apache 1.3.9 的話，則你的參數設定檔會在 /etc/httpd/conf 當中，而主機的網頁放置於 /home/httpd/html 中，至於 cgi 的咚咚則放在 /home/httpd/cgi-bin 當中；
  • RedHat7.0 + CLE 0.9：同樣的，這個系統的預設 apache 的參數檔，放置在 /etc/httpd/conf 中，不過主機網頁移至 /var/www/html 當中，cgi-bin 則放置在 /var/www/cgi-bin 中；
  • 原始碼安裝：若使用原始碼安裝，且將預設的路徑設置在 /usr/local/apache 時，你的參數設定檔會在 /usr/local/apache/conf 中，而更動較大的是主機網頁的放置目錄，更改成 /usr/local/apache/htdocs 這個目錄中，至於 cgi 也是放置在 /usr/local/apache/cgi-bin 當中。
底下將以原始碼安裝的方法所產生的檔案來介紹 apache 的設定。
基本設定：
  • 1. 啟動 apache 服務：基本上，只要你啟動 apache 之後，應該就可以在用戶端的瀏覽器程式上看到你的主機預設的網頁了！啟動的方式為：
    [root @tsai /root]# /usr/local/apache/bin/apachectl start <=啟動
    同時， apachectl 還有其他的參數如下：
    • apachectl stop：停止 WWW 的服務；
    • apachectl restart：重新啟動 WWW 的服務，這個指令比較常用在你修改了 apache 的參數後，重新啟動用的。
    • apachectl status：偵測 WWW 的狀態。
  • 2. 更改中文首頁：由於 WWW 的原始設定中，指定你的首頁名稱為 index.html 或者是 index.htm ，然而這一版的首頁支援比較多的語言，因此你必須將首頁檔案名稱修改一下：
    [root @tsai /root]# cd /usr/local/apache/htdocs/
    [root @tsai htdocs]# cp index.html.zh.Big5 index.html
    上面這個步驟在設定你的首頁
    現在你應該可以在其他的用戶端機器上連進來了！你現在可以開啟 IE 或其他瀏覽器，然後在你的網址上打入你的DNS名稱（如果有的話），或者是你的 IP 號碼，就可以看到你自己主機的首頁囉！
  • 3. 設定使用者權限：由於你是以 root 的身份安裝 Apache 這個套件，所以如果無法連上你的主機首頁，有可能是 WWW 的首頁放置的地方可能會有權限上的問題，需要設定權限的地方在 /usr/local/apache/htdocs 及 /usr/local/apache/cgi-bin 這兩個目錄，你可以這樣設定：
    [root @tsai apache]# chmod 755 /usr/local/apache/cgi-bin
    [root @tsai apache]# chmod 755 /usr/local/apache/htdocs
    你也可以設定成 744 的權限喔！
  • 4. 設定自動執行：另外，為了讓你的 WWW 及 MySQL 服務可以一開機就執行，所以你可以將下面兩行啟動的 scripts 寫在你的 /etc/rc.d/rc.local 的最後面：
    [root @tsai /root]# vi /etc/rc.d/rc.local
    /usr/local/apache/bin/apachectl start
    /usr/local/mysql/share/mysql/mysql.server start
    這樣一來，每次你開機時， Linux 就會自動去執行 apache 及 MySQL 囉！
開始設定 httpd.conf 檔案：
說了一些拉拉雜雜的話後，終於要來實際設定 httpd.conf 這個檔案囉，請以 vi 來編輯吧。
[root @tsai /root]# cd /usr/local/apache/conf
[root @tsai conf]# vi httpd.conf
  • 1. 基礎環境設定：以下這些在 httpd.conf 中的選項分別代表的意義為：
    ServerType standalone
    上面在設定啟動 apache 的狀態，如果是 standalone 表示開機即執行，
    通常我們都是選擇 standalone 這個（預設值），不過，若選擇：
    ServerType inetd ：則表示使用網際網路的服務來連線時才啟動！

    ServerRoot "/usr/local/apache"
    表示 apache 的目錄所在地

    Timeout 300
    這是用來設定連接到你這部主機的用戶端，當超過 300 秒用戶端還沒有
    辦法連上你的主機時，就予以斷線處理！

    MinSpareServers 5 <=若是小站或是一般小型個人網站，可以改成 3
    MaxSpareServers 10 <=若是小站或是一般小型個人網站，可以改成 5
    StartServers 5
    MaxClients 150 <=若是小站或是一般小型個人網站，可以改成 100
    上面兩個是開啟 httpd 服務數目的地方，當你執行 httpd 之後，
    在 shell 下執行 ps -aux|grep httpd 就可以看到 httpd 的數目量，
    通常這與你的 RAM 有關，如果是小站的話，可以設小一點，
    例如最小設 3 最大設 5 即可！而 StartServers 則設與 Min 相同即可！
    至於 MaxClients 則可以設小一點，因為設定太大很耗系統資源，
    而太小則無法讓很多人連上來！所以可以設成例如 100。

    Port 80
    這東西盡量不用動，因為 www 服務的預設通訊口(port)就是 80，
    除非你要自己架一個別人連不進來的網站（內部網站），

    User nobody
    Group nobody
    將 apache 預設為 nobody 這個人及群組！意即所有人皆可以使用

    ServerAdmin vbird@vbird.adsldns.org
    這個是設定你的機器的 httpd 管理員帳號！設成你的帳號吧！

    ServerName vbird.adsldns.org
    這是你主機的名稱，先將前面的註解符號拿掉吧！
    請設定吧，如果你沒有主機名稱，就選 localhost 吧！

    BindAddress *
    這是用來允許你的 WWW 接受虛擬 IP 的機器的項目，例如你的虛擬網域為
    192.168.1.0 ，則可以將 * 改成 192.168.1.0 喔！通常如果要接受虛擬 IP 的話，
    直接打 * 就好了！

  • 2. 路徑設定：以下的參數在設定每一個網頁或者是服務的路徑所在！（舊版在 access.conf 中）
    DocumentRoot "/usr/local/apache/htdocs"
    上面這個在設定你的主機的主要首頁所在，由於我們設定主機名稱
    為：vbird.adsldns.org ，則當別人在網址列上打入 vbird.adsldns.org 時，
    系統將會把 /usr/local/apache/htdocs 這個路徑下的首頁檔案傳出去！
    你也可以自行改變這個路徑！

    <Directory "/usr/local/apache/htdocs">
    Options Indexes ExecCGI FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>
    上面顯示在主機主網頁放置的目錄下 WWW 所可以進行的事情！
    options 為網頁可以進行的工作，可以複選，有以下的幾個項目：
    ExecCGI：表示可以在這個目錄中執行 CGI 程式；
    FollowSymLinks：表示可以連結至他處；
    MultiViews：表示可以執行動畫、音樂等項目
    AllowOverride None 表示任何人都可以讀取資料；
    至於Allow from all 則表示你的主機接受任何位置來源的連接。

    <IfModule mod_userdir.c>
    UserDir public_html
    </IfModule>
    上面這個選項需要開啟，那樣你的用戶帳號才可以有首頁！
    而你用戶的首頁放置在 /home/user/public_html 下，你可以將
    public_html 改成 WWW ，則用戶的首頁就需要放在
    /home/user/www，若以上面的設定，則以我為例，我的首頁需要放在
    /home/vbird/public_html 底下才行！

    <IfModule mod_dir.c>
    DirectoryIndex index.html index.htm index.php
    </IfModule>
    這個是用來說明首頁的檔案名稱，通常預設值是 index.html，但是有些
    網頁編輯器的附檔名是 index.htm ，所以你可以加上後面的幾個檔名，
    如此一來，你的首頁就可以支援多種檔名了！

    基本上均使用預設值也就可以了！
  • 3. 開啟 PHP 與其他模組：由於我們需要可以支援 php 模組的 apache ，所以需要將這個模組開啟喔！
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    將這兩個模組的註解取消，請注意，這個是 php4 的模組，不要與 php3 模組搞混了！
    因為我們是安裝 php4 版的幽！

    AddHandler cgi-script .cgi
    上面這一行的註解也可以拿掉，這樣用戶端才能使用 CGI 程式！

  • 4. 開啟 Apache 狀態列：我們可以透過 IE 等瀏覽器來觀看主機的 apache 執行情況，若你需要這個服務，就要將下面的註解取消掉：
    <Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from .your_domain.com
    </Location>
    <Location /server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from .your_domain.com
    </Location>
    將上面的 .your_domain.com 改成你的 DNS ，
    例如我可以改成 .adsldns.org 喔！這樣一來，
    只有 adsldns.org 的機器可以看到你的 apache 的執行狀態！
    如何觀看，以我為例，只要在網址列輸入
    http://www.vbird.adsldns.org/server-status
    http://www.vbird.adsldns.org/server-info
    則來自 adsldns.org 的用戶即可看到我的主機狀態！
  • 5. 重新啟動：只要下達 /usr/local/apache/bin/apachectl restart 即可執行 httpd 囉！到這裡就設定完畢了，執行你的 IE 連上你的網路看看吧！（如果有問題的話，請重新啟動 Linux 吧！）

測試 MySQL 及 PHP 套件
    要測試這兩個套件前請先確定 MySQL 及 Apache 已經被啟動了！OK，來做測試吧！
  • php 測試：
    你可以編輯一個檔案，檔案名稱可以為 test.php ，然後將這個檔案放置在 /usr/local/apache/htdocs 當中（就是你的主機的網頁所在地喔！）
    [root @tsai /root]# vi /usr/local/apache/htdocs/test.php
    <?
    phpinfo( );
    ?>
    然後連上你的主機，以我為例，我就要輸入 http://vbird.adsldns.org/test.php 這樣就可以看到你的 php 狀態囉！也就是你的 php 就可以執行了！
  • MySQL 測試：
    同樣的， MySQL 也是編輯一個檔案，執行看看可不可以即可：
    [root @tsai /root]# vi /usr/local/apache/htdocs/mysqltest.html
    <html>
    <body>
    <?
    $link=mysql_connect('localhost','root');
    mysql_select_db('mysql');
    $str="select * from user;";
    $result=mysql_query($str,$link);
    $show=mysql_num_rows($result);
    mysql_close($link);
    for ($i=0;$i < $show;$i++)
    {
    $arr[$i]=mysql_fetch_array($result);
    };
    ?>
    <table align=center border=1>
    <tr align=center>
    <td>Host</td>
    <td>User</td>
    <td>Password</td>
    </tr>
    <?for ($i=0;$i<$show;$i++){?>
    <tr>
    <td><?echo $arr[$i][Host]?></td>
    <td><?echo $arr[$i][User]?></td>
    <td><?echo $arr[$i][Password]?></td>
    </tr>
    <?};?>
    </body>
    </html>
    然後同樣的執行 http://vbird.adsldns.org/mysqltest.html 即可知道你的 mysql 是否可以執行！

寫入第一個個人首頁
如果你的網站支援給用戶放置個人網頁的話，那你的個人網頁在哪裡呢？剛剛我們有提到在 httpd.conf 的設定中，有一項關於個人首頁的設定，通常如果你不設定 httpd.conf 檔案的話，他的預設值都是 public_html ，好了，那要如何設定個人網頁呢？假設以 vbird 這個帳號為例，我們可以這樣進行：
[vbird @vbird vbird]$ mkdir public_html
[vbird @vbird vbird]$ chmod 755 public_html
[vbird @vbird vbird]$ chmod 755 /home/vbird
在你的用戶端家目錄中建立了一個 public_html 的目錄，
並將此目錄的權限改成可以讓其他人觀看，注意喔， apache
預設是 public_html ，但是如果你在 httpd.conf 這個檔案中
改變了目錄名稱，則必須作適當的修正喔！
然後在你的目錄中，亦即 /home/vbird/public_html 當中，建立一個檔名為 index.html 的 HTML 檔案，例如我們剛剛測試的 php 的檔案，然後在 IE 的網址列打入 http://你的網站名稱/~vbird/ 則 apache 會自動將 IE 的訊息傳到 /home/vbird/public_html 這個目錄中，並搜尋檔名為 index.html 或 index.htm 或 index.php 的檔名！所以說， index.html 是 apache 第一個找尋的檔名喔！這就是你的首頁啦！
然後你就可以經由 php 寫你的網頁資料，並將之放置在 public_html 這個目錄下，就好了！不過用這個方法寫網頁時，需要注意的是，附檔名是 php3 的檔案將不會被執行，所以你要將 php3 改成 php 比較妥當！
2002/ 01/01以來統計人數


網路安全管理文件
最近更新日期：2002/10/25
  • 主題十(2002/10/25)：實作 VPN
    感謝網友 Rafael 提供的實作經驗！歡迎有興趣的朋友們一起來加強您的網路安全呦！加油阿！
  • 主題九(2002/01/18)：如何以 SSH 取代 Telnet 連上遠端主機
    我們都知道 telnet 是一個以『明碼』傳送你的資訊到主機的一種連線方式，非常的不安全，所以近來 Red Hat Linux 在 7.X 版本之後，預設都不以 Telnet 開啟連線的服務了！目前比較好的替代方案是以較為安全的 SSH 取代囉！建議您一定要將 telnet 換成 ssh 喔！在這裡，VBird 也提供 Red Hat 6.x 以前的 Red Hat 系統，改換成 SSH 的安裝方法！
  • 主題八(2002/01/01)：如何讓你的 Red Hat 可以線上更新套件
    我們都曉得在 Windows 底下有個 update 的選項，在一些防毒軟體的附屬功能中，由於病毒隨時在變種，所以病毒碼也要常常線上更新（Live Update），那麼你曉不曉得 Red Hat Linux 也有線上更新的功能呢？呵呵！答案是有的，那就是 up2date 這個套件了！
  • 主題七(2001/12/10)：如何讓 sendmail 在寄信的時候具有認證機制：
    網管人員對於郵件伺服器最厭煩的地方大概就是在管理郵件傳遞（Relay）的問題了！因為如果將郵件傳遞的範圍限制的太小，那麼只要一個不小心，使用者在能轉遞信件的 domain 之外，就無法使用郵件主機！而如果沒有設定的很好，那麼郵件主機又很容易被拿來當成廣告垃圾信件的中繼站！這裡提供一個郵件認證的機制，讓你的使用者方便而郵件主機又不會有被做為廣告中繼站的問題！
  • 主題六(2001/10/12)：偵測網路的流量-- MRTG --套件安裝：
    網管人員最麻煩的地方在於需要瞭解整個網路的運作狀況了，當網路流量很高，CPU使用率很大的時候，可能會造成系統的不穩定，因此有需要針對整個系統的 CPU 使用率、網路流量等進行統計分析，以瞭解整個網路的實際運作情況！並以利於追蹤！
  • 主題五(2001/10/02)：確認服務通道 port 開啟哪些：
    要知道你的 Linux 主機中，有哪些 port 被打開了呢？http 是 80 ， squid 是 3128 ，telnet 是 23 那還有沒有其他的 port 呢？如何偵測？
  • 主題四(2001/10/02)：限制主機的連線範圍：
    那如果你已經將一些可能造成侵入的服務關掉之後，下一步要作什麼呢？當然就是限制連線進來電腦囉！基本上，我們並不希望有任何人以 telnet 登入我們的主機，（除非你有架設 BBS）因為如果你開放 telnet 的話，那等於是請所有的人進入你的主機中，竊取你的資料，甚至以你的主機為中繼站去攻擊別人！因此，最好限制每一台主機可以連線的網域才好。
  • 主題三(2001/10/02)：移除不必要的服務項目：
    在你安裝了 Linux 之後呢，相信有很多的朋友會開始想要作一些很炫的服務，例如 WWW 或者是 mail 亦或是 FTP 的服務，但是，這些服務都有潛在性的危險喔，很多的駭客就是利用你開啟的這些服務來進行網站的破壞！基本上，比較麻煩的是『特洛伊木馬』程式這一類的後門程式，以你的網站做為中繼站去攻擊駭客想要攻擊的目標。所以囉，灌完了 Linux 之後，先將一些不必要的程式或服務移除吧！
  • 主題二(2001/09/20)：針對上週才剛剛發佈的 Nimda （妠坦）病蟲的偵測方法：
    這隻病蟲可以說是 CodeRed 的改良加強版！具有相當威力的攻擊性！尤其他可以透過三重管道來自行擴張攻擊的範圍！除了 port 80 之外，亦可經由郵件及網路上的芳鄰（資源分享）來達到病毒擴散的目的！很是可怕喔！
  • 主題一(2001/09/10)：針對目前很兇狠的 CodeRed（紅色警戒病蟲）在 RedHat 下的偵測方法：
    這隻病蟲對於微軟的視窗（尤其是 windows2000 伺服器）攻擊得很凶，雖然有消息指出可能是大陸方面的傑作，但是已經造成這麼大的問題了，我們應該好好來防制一下囉！
2002/ 01/01以來統計人數


偵測紅色警戒文件
最近更新日期：2001/09/17

針對目前很兇狠的 CodeRed（紅色警戒病蟲）在 RedHat 下的偵測方法：
    前言：
    這隻病蟲對於 Linux 並不會有危害，但是對於微軟的視窗（尤其是 windows2000 伺服器）則攻擊得很凶，雖然有消息指出可能是大陸方面的傑作，但是已經造成這麼大的問題了，我們應該好好來防制一下囉！
    入侵方向與分析原理：
    其實這隻病蟲主要是針對微軟在 WWW server 的漏洞進行破壞的行為，我們知道 WWW Server 的 port （可想成是通訊通道）是 80 （請參考 WWW Server 那一篇文章吧），而紅色警戒就是藉由 80 port 來登入伺服器的 WWW 服務，然後再進行破壞行為。那由於 Linux 的主機若有開放 port 80 作為 WWW 伺服器的話，就會有登錄檔呀！那如果紅色警戒這隻病蟲嘗試來登入你的 Linux 系統時，由於他是經由 port 80，所以就會在你的網頁伺服器的登錄檔中留下記錄，通常如果你是照鳥哥的方法來編譯的你的 WWW Apache Server 時，則你的 WWW 網頁登錄檔應該是在 /usr/local/apache/logs/access_log 這個檔案，這個檔案的內容有點像這樣：
    61.224.44.98 - - [17/Sep/2001:15:43:28 +0800] "GET /~vbird/linux_live/index.php HTTP/1.0" 200 893
    211.74.244.91 - - [17/Sep/2001:15:43:28 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 905
    211.74.210.189 - - [17/Sep/2001:15:43:29 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 905
    140.116.44.172 - - [17/Sep/2001:15:43:33 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 977
    61.217.51.146 - - [17/Sep/2001:15:43:53 +0800] "GET /favicon.ico HTTP/1.1" 404 294
    140.116.227.80 - - [17/Sep/2001:15:43:56 +0800] "GET /default.ida?XXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090
    %u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u
    531b%u53ff%u0078%u0000%u00=a HTTP/1.0" 404 282
    211.74.244.91 - - [17/Sep/2001:15:43:59 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 827
    像上面這個例子中，第一行中，61.224.44.98 指的是使用你 WWW 伺服器的主機名稱，後面接的是登入的日期，然後 GET 後面接的是 WWW 伺服器傳送的檔案，而在黃色的部分則是當 CodeRed 嘗試登入你的 WWW 伺服器時，由於系統不是 Windows2000 所以會顯示的錯誤訊息！因此，我們只要分析登錄檔（access_log）就可以知道哪一個 IP 已經中毒了！（就是看前面的 IP 囉）
    病蟲的危害性質：
    在已經公布的資料中， Code Red 的危害程度與性質你可以到下面的網頁中查詢道：
    • 金帥（ZLock）防毒中心；
    • 趨勢（Trend）；
    • 技術通報；
    實例：
    • 在 Linux 下面的第一個例子（參考仁德醫專 周定賢老師 的寫法）：
      這個例子可以每天將你的主機中，將嘗試侵入你主機的電腦 IP 列出來，並且每 5 分鐘更新一次！


偵測 Nimda 文件
最近更新日期：2001/09/20

上週（2001/09/13）才剛剛發佈的 Nimda （妠坦病蟲）在 RedHat 下的偵測方法：
    前言：
    這隻病蟲對於 Linux 並不會有危害，但是對於微軟的視窗（尤其是 windows2000 伺服器）則攻擊得很凶，甚至於比 Code Red 還要來得凶！尤其他的擴散管道非常的多，除了常使用的郵件傳送之外，亦可經由 WWW 伺服器的 port 80 來傳播，此外，亦可以經由『網路上的芳鄰』（資源分享）來傳播病毒！真是可怕！
    入侵方向與分析原理：
    由於 Nimda 可以經由三重管道傳播病毒，我們並無法得知他經由『網芳』傳播的情況（其實還是可以的，只要分析 SAMBA 伺服器的登錄檔就可以知道連上線的用戶端情況了！），因此以下仍然是以 WWW 伺服器的 port 80 作為偵測的方向。

    在 WWW 伺服器方面，基本上，與 Code Red 相同的， Nimda 是以微軟的 WWW Server 的 port 80 侵入伺服器的 WWW 服務，然後再進行破壞行為。當 Nimda 嘗試侵入 Linux 的 port 80 時，就會被檔下來（因為沒有 Nimda 預設要入侵的檔案系統），而在 Linux 的 Apache 登錄檔上面就會有紀錄，亦即在你的 WWW 網頁登錄檔（應該是在 /usr/local/apache/logs/access_log 這個檔案）留下記錄，這個檔案的內容有點像這樣：

    61.224.44.98 - - [17/Sep/2001:15:43:28 +0800] "GET /~vbird/linux_live/index.php HTTP/1.0" 200 893
    211.74.244.91 - - [17/Sep/2001:15:43:28 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 905
    211.74.210.189 - - [17/Sep/2001:15:43:29 +0800] "GET /~vbird/linux_live/index.php HTTP/1.1" 200 905
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /scripts/root.exe?/c+dir HTTP/1.0" 404 287
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /MSADC/root.exe?/c+dir HTTP/1.0" 404 285
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /c/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 295
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /d/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 295
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /scripts/..%255c../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 309
    140.116.44.156 - - [19/Sep/2001:10:36:30 +0800] "GET /_vti_bin/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+dir TTP/1.0" 404 326

    像上面這個例子中，第一行中，61.224.44.98 指的是使用你 WWW 伺服器的主機名稱，後面接的是登入的日期，然後 GET 後面接的是 WWW 伺服器傳送的檔案，而在黃色的部分則是當 Nimda 嘗試登入你的 WWW 伺服器時，由於系統不是 Windows2000 所以會顯示的錯誤訊息！（Nimda 在一次的嘗試登錄中，就會有差不多15行的錯誤訊息出現），因此，我們只要分析登錄檔（access_log）就可以知道哪一個 IP 已經中毒了！（就是看前面的 IP 囉）
    病蟲的危害性質：
    在已經公布的資料中， Nimda 的危害程度與性質你可以到下面的網頁中查詢道：
    • 金帥（ZLock）防毒中心；
    • 趨勢（Trend）；趨勢二（Trend）
    • 賽門鐵克（symante.）；臺灣賽門鐵克
    • 台灣危機處理小組；
    偵測實例：
    • 經由修改周定賢老師 針對 Code Red 的小程式加以改良（搜尋字串改變） ：
      這個例子可以每天將你的主機中，將嘗試侵入你主機的電腦 IP 列出來，並且每 5 分鐘更新一次！你可以將上面的文字檔拷貝下來，貼在你的 Linux 系統中，建立一個檔案，並改成可執行來測試！
    解毒方法：
    趨勢與賽門鐵克已經公布了解決辦法，你可以去看看，這裡也提供他們提供的方法解釋：（資料來源：趨勢與賽門鐵克公司）
    • 趨勢：
      1. 電腦族如果收到Readme.exe(讀我)檔案，請直接刪除，勿開啟以免中毒。
      2. 趨勢科技產品用戶請立即更新掃瞄引擎至5.20以上和病毒碼至942(含)以上，以偵測及清除此病毒。
      3. 由於病毒會搜尋網路上的磁碟機，企業若安裝了IIS主機，請至微軟網站下載最新的Service Pack及修正程式!!
        http://www.microsoft.com/taiwan/support/content/6496.htm
      4. 若你連接至中毒的網頁伺服器，會自動下載病毒檔案，請將防毒軟體開啟至常駐狀態。
      5. 如果您有安裝eManager可以設定收到readme.exe, readme.wav及readme.com三個檔案附件移除。
      6. 如果您使用微軟IE 瀏覽器,請連接下列微軟公司網站更新 IE 的修正程式
        http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/bulletin/MS01-020.asp
      7. 手動解決方法：
        (1) 請關閉資源分享功能
        (2)連接至趨勢網站下載清除程式
        (3)將清除程式存放至暫存目錄中.並執行以解壓縮
        (4)關閉防毒軟體的即時掃瞄功能
        (5)執行FIX_NIMDA.EXE
        (6)重新啟動電腦.使用防毒軟體掃瞄所有檔案.
        (7)若您發現 RICHED20.DLL 及 LOAD.EXE 檔案無法清除.請由平時備份還原
        (8)請您將防毒軟體設定為掃瞄所有檔案.您可參考
        http://www.trend.com.tw/EncyclopediaV2/download/Troj_Sircam_pre.doc 說明設定
    • 賽門鐵克：
      1. 執行 LiveUpdate 線上更新至最新版的病毒定義碼；
      2. 開始執行 Norton AntiVirus 防毒軟體（NAV，在右下方的諾頓小圖示中點兩下），並請將掃瞄選項設定為全部檔案均掃瞄；
      3. 開始執行『全系統掃瞄』；
      4. 若有發現任何 W32.Nimda.A@mm 或 W32.Nimda.A@mm(html) 的病毒，選擇『修復』；
      5. 若有發現任何 W32.Nimda.A@mm(dr) 或 W32.Nimda.A@mm(dll) 的病毒，選擇『刪除』；
      6. 若無法刪除 admin.dll 及 riched20.dll 檔案時，以備份（或者其他相同作業系統的電腦上）的 admin.dll 及 riched20.dll 檔案覆蓋中毒的電腦檔案；
      7. 將電腦重新開機；
      8. 重複上面的步驟1-6，直到 NAV 找不到任何毒為止；
      9. 刪除 \windows\system.ini 的下面一行字（應該是第二行左右）：
        Shell= load.exe -dontrunold
      10. 關閉不必要的資源分享；


偵測 Nimda 文件
最近更新日期：2001/09/24

Nimda （妠坦病蟲）於『網芳』的攻擊模式中，在 RedHat 下的偵測方法：
    前言：
    我們知道 Nimda 除了會以 WWW 伺服器的 port 80 攻擊模式之外，也會以『網路上的芳鄰』模式攻擊鄰近的電腦，也就是說，你的 Windows 系統只要有開啟『資源分享』或者是 win2000 底下所謂的『共用』時，就有可能被攻擊了！那我們的主機如果有開啟『SAMBA』服務時，由於 SAMBA 也是以『網芳』相同的 NetBIOS 通訊協定來作為資料傳遞的協定，因此也是會被 nimda 攻擊的，只是 Linux 即使被攻擊了，也不會發病就是了。通常，你的 Linux 主機如果被攻擊了，應該在 /var/log/samba/log.smb 裡面會出現類似的字眼：

    [2001/09/23 12:33:34, 0] lib/access.c:check_access(262)
    Denied connection from nbchang1.ev.ncku.edu.tw (140.116.44.156)
    [2001/09/23 12:33:34, 1] smbd/process.c:process_smb(608)
    Connection denied from 140.116.44.156
    [2001/09/23 12:33:34, 0] lib/access.c:check_access(262)
    Denied connection from nbchang1.ev.ncku.edu.tw (140.116.44.156)
    [2001/09/23 12:33:34, 1] smbd/process.c:process_smb(608)
    Connection denied from 140.116.44.156
    [2001/09/23 12:39:05, 1] lib/util_sock.c:client_name(1030)

    我不知道如何修改 SAMBA 的 log 檔案之 format ，所以只好設定每天 零點 將 samba 的 log file 移除，因此藉由分析當天的 log file 就可以知道當天有多少次被攻擊，當然了，這個攻擊也包括了不明人士試圖進入你主機的錯誤訊息！

    寫法：
    同樣的，偵測的方法也是參考兩位老師的大作所設計出來的，只是分析的 log file 不一樣，同時由於 format 不同了，也需要動一下 count.awk 這個檔案的手腳，其他的地方就都與兩位老師的大作相同了！看看實例吧！


移除 Linux 上面不必要的服務
最近更新日期：2001/10/02
針對安全的考量，移除不必要的服務通道
    前言：
    這篇文章是參考網路上一些前輩的資料寫下來的，如果有興趣的話，不妨去看一下原作者的內容：
    • 簡易駭客防制法：臥龍小三的大作；
    • 自己架一個安全的伺服器環境（二）：Linux 安全交流網
    在你安裝了 Linux 之後呢，相信有很多的朋友會開始想要作一些很炫的服務，例如 WWW 或者是 mail 亦或是 FTP 的服務，但是，這些服務都有潛在性的危險喔，很多的駭客就是利用你開啟的這些服務來進行網站的破壞！基本上，比較麻煩的是『特洛伊木馬』程式這一類的後門程式，以你的網站做為中繼站去攻擊駭客想要攻擊的目標。所以囉，灌完了 Linux 之後，先將一些不必要的程式或服務移除吧！以保障您的網路安全！
  • 關閉一些服務：
    在你開始 Linux 的網路功能之後，建議您關閉一些網路上的服務，通常，這些服務並不會使用到！所以對於您的日常行為（如 e-mail, WWW, FTP ）是不會有影響的，既然對於日常行為不會有影響，又可以增進您網路的安全性，當然是需要進行囉！
    1. 關閉一些服務：
      關閉的方法有很多，通常我是使用 /usr/sbin/setup 來關閉的，只是用這樣的方式來關閉的話，需要重新啟動 Linux ，比較麻煩一些些，如果您是使用我們這個網頁的 RedHat6.1 系統的話，那就執行 /usr/sbin/setup 吧！然後選擇 System services，將所有的服務啟動項目開到剩下如下的幾個：
      • atd
      • crond
      • inet
      • keytable
      • kudzu
      • network
      • random
      • sendmai（如果你有開啟 e-mail 服務的話）
      • smb（如果你有開啟 SAMBA 服務的話）
      • syslog
      • xfs（如果你有執行 X-windows 的話）
      其他的服務就是你的要求來開啟囉，其實，除非你真的瞭解該服務是作何用的，否則可以先予以關閉之，但是上面的幾個項目則必須要開啟的！
    2. 設定啟動時的服務：
      另外還有一個檔案在設定開機時的服務設定，那就是/etc/inetd.conf這個檔案，在這個檔案中，開啟到剩下四個服務就好，其他的服務就把他註解掉（加上一個 # 符號即可）。
      • ftp stream tcp nowait root /usr/sbin/tcpd in.proftpd
      • telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
      • pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
      • imap stream tcp nowait root /usr/sbin/tcpd imapd
      另外，如果您的 RedHat 版本在 7.0 以後的話，那關於各項服務的目錄就會是在 /etc/xinetd.d 這個目錄中了！由於 xinetd 是將所有的服務個別放置於不同的檔案中，因此你需要針對所有的檔案進行修正！通常，只要將每個檔案中的 disable = no 改寫成 disable = yes 就可以了！
    3. 從 Linux 系統上移除一些套件：
      雖然我們已經將一些服務關掉了，但是最好還是從根本上將這個套件給他移除吧！以下這些套件是不必要的套件，你可以移除：
      • git
      • finger
      • talk
      • ytalk
      • ucd-snmp-utils
      另外，還有一些 ftp 的套件也可以將之移除喔！（如果你不需要的話！！）移除的方法很簡單，就用 rpm 吧：
      • rpm -e git finger talk ytalk ucd-snmp-utils
    4. 重新開機：
      這個不用教吧！ reboot 即可
2002/ 01/01以來統計人數


限制連接上您 Linux 主機的電腦網域
最近更新日期：2001/10/02
    前言：
    那如果你已經將一些可能造成侵入的服務關掉之後，下一步要作什麼呢？當然就是限制連線進來電腦囉！通常，若你有開啟 http 或 mail 的情況下，在 apache 與 sendmail 的設定檔中限制連線的電腦，可能會造成一些網域無法登入，當然，除非你只對內部開放，否則的話，通常是不在該服務下關閉某一網域的電腦的！但是 telnet 這個服務就不是這樣囉！基本上，我們並不希望有任何人以 telnet 登入我們的主機，（除非你有架設 BBS）因為如果你開放 telnet 的話，那等於是請所有的人進入你的主機中，竊取你的資料，甚至以你的主機為中繼站去攻擊別人！因此，最好限制每一台主機可以連線的網域才好。
  • 參考資料：
    以下的部分內容，我是參考 study-area 『我本善良』兄寫的文章，另外，『臥龍小三』的文章也很值得參考！
  • 限制連線的範圍：
    其實，你服務的項目除了 Proxy, WWW 與 e-mail 等之外，若要使用 Telnet 或其他的連線軟體連上你的主機的話，應該是要經過你的控管的，所以，限制適當的連線網路是有其必要性的。通常，我都只設定我上網工作（Windows 平台）的那部機器，及可能會使用到的外部網路的機器，讓他可以登入這部主機，其他的就將之deny（取消）掉！基本上，要設定連線範圍的程式與檔案有幾個：
    • tcp_wrappers 套件；
    • /etc/hosts.allow；
    • /etc/hosts.deny。
    簡單的說， hosts.allow 與 hosts.deny 這兩個檔案就是在限制 /etc/inetd.conf 這個檔案中，所允許的服務內容啦！
    1. 察看是否具有 tcp_wrappers 套件：
      要使連線電腦的設定啟動，以使用 /etc/hosts.allow 與 /etc/hosts.deny 檔案的話，需要這一套軟體『tcp_wrappers』，要察看你的 Linux 主機內是否有這一套軟體的話，請使用：
        rpm -q tcp_wrappers 或者 rpm -qa | grep tcp

      如果有這套軟體的話，自然就會顯示出來，如果沒有的話，請放入你的 Linux 光碟片，將 rpm 檔案裝上去吧！

    2. 設定允許登入的電腦(/etc/hosts.allow)：
      其實很簡單，只要修改 /etc/hosts.allow（如果沒有此檔，請自行以 vi 編輯）這這檔案即可，例如，我家裡的電腦中，我的內部網域（區域網路）是 192.168.1.0/255.255.255.0，這樣的網域代表電腦 IP 在於 192.168.1.1 - 192.168.1.255 之間！所以，我就將 /etc/hosts.allow 這個檔案的內容設定成為如此：
        in.telnetd: 192.168.1.0/255.255.255.0, .ncku.edu.tw : Allow

      加入 .ncku.edu.tw 的原因是因為我人在成大，所以加入此行的話，可以使我在成大連上我家裡的 Linux 主機。

    3. 設定不許登入的電腦(/etc/hosts.deny)：
      由於正常的情況下， Linux 會先判斷 hosts.allow 這個檔案，這個檔案中的電腦如果設定為可連線的話，則 hosts.deny 就不會被使用，因此，設定好了 hosts.allow 之後，將 /etc/hosts.deny 設定為『所有電腦都不許登入』的情況，如下所示：
        in.telnetd: ALL : Deny

      這樣一來，基本的防護措施就有了（不用重新開機就自動執行了！）。

  • 記錄限制登入的主機 IP：
    通常我們會希望如果有人嘗試登入我們的系統時，系統不但可以將他摒棄在外，並且可以將他的嘗試記錄下來！這時，我們可以藉由 /etc/hosts.deny 來達成這個目標！在這個檔案中（當然，您的 /etc/hosts.allow 必須已經先完成編輯了！），你可以這樣輸入：
    [root @tsai /etc]# vi hosts.deny

    in.telnetd: ALL : spawn (echo Security notice from host `/bin/hostname`; \
    echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d-%h security" root & \
    : twist ( /bin/echo -e "\n\nWARNING connection not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入，您的連線將會被紀錄，並且作為以後的參考\n\n ". )

    在上面的例子中，黃色的 root 部分，可以寫成你的個人帳號或者其他 e-mail ，以免很少以 root 身份登入 Linux 主機時，容易造成不知道的情況，另外，最後幾行（顏色怪怪的那一行）為同一行。如此一來，當未經允許的電腦嘗試登入你的主機時，他的畫面就會顯示上面的最後一行，並且將他的 IP 寄到 root （或者是你自己的信箱）那裡去！

2002/ 01/01以來統計人數


偵測 Linux 開啟的服務通道（port）
最近更新日期：2002/01/28
    前言：
    常常看到有些人想要知道自己的 Linux 主機到底開放了多少的 port 呢？要如何來偵測？通常我們知道的 port 有下面這幾個：
    • ftp:21
    • telnet:23
    • smtp:25
    • http:80
    • pop-3:110
    • netbios-ssn:139
    • squid:3128
    • mysql:3306
    當然還不只這些哩，如何知道 port 被開啟與否呢？
  • 偵測你開啟的服務有哪些？使用功能強大的 netstat 指令
    在做為主機的 Linux 系統中，服務項目是越少越好！這樣可以避免不必要的入侵管道喔！因此，這個時候請瞭解一下您的系統當中，有沒有哪些服務被開啟了呢？要瞭解自己的系統當中的服務項目，最簡便的方法就是使用 netstat 了！這個東西不但簡單（每一部 Linux 機器當中預設都會安裝的套件喔！），而且功能也是很不錯的，例如我們在偵測線上 WWW 使用者的人數時，就很需要這個咚咚囉！好了，我們來看一下 netstat 的使用方法：
    [vbird @tsai vbird]# netstat
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 20 192.168.1.2:ssh 192.168.1.11:1391 ESTABLISHED
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785
    如上所示，單純使用 netstat 的時候，僅『列出目前已經接通的服務項目與服務名稱』所以你可以看到，由於目前僅有一個 ssh 的連線建立成功，所以就只有顯示出一個 ESTABLISHED （連線中的意思）的項目。上面淺黃色的那一行，表示『有一個 ssh 的服務開啟通道連線中，是由遠端的 192.168.1.11 這個 IP 連接到 192.168.1.2 的主機上面的這個 IP ，而連線的通道是以 1391 這個通道連接進入 ssh 的服務中的！』。那如果我需要將所有的項目都列出來呢？
    [vbird @tsai vbird]# netstat -a
    AActive Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:pop3 *:* LISTEN
    tcp 0 0 *:imap *:* LISTEN
    tcp 0 0 *:ftp *:* LISTEN
    tcp 0 0 *:ssh *:* LISTEN
    tcp 0 0 *:smtp *:* LISTEN
    tcp 0 20 192.168.1.2:ssh 192.168.1.11:1391 ESTABLISHED
    udp 0 0 *:1238 *:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785
    如上所示，加入 -a 就是說將所有在機器上『監聽(LISTEM)』或者是『建立連線』的服務通通列出的意思，不過，服務的名稱已經使用 /etc/services 裡面的名稱了，而不是使用 port 的數字！如上所示，目前我主機上面的服務共開啟了
    • pop3
    • imap
    • ftp
    • ssh
    • smtp
    等服務（就是 LISTEN 的那幾個咚咚囉！）至於已經建立的服務就只有 ssh 這一個囉！那如果我想要知道 port 呢？呵呵，就使用底下的指令吧！
    [vbird @tsai vbird]# netstat -an
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
    tcp 0 20 192.168.1.2:22 192.168.1.11:1391 ESTABLISHED
    udp 0 0 0.0.0.0:1238 0.0.0.0:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags Type State I-Node Path
    unix 10 [ ] DGRAM 768 /dev/log
    unix 2 [ ] DGRAM 304058
    unix 2 [ ] DGRAM 303994
    unix 2 [ ] DGRAM 303972
    unix 2 [ ] DGRAM 70794
    unix 2 [ ] DGRAM 70743
    unix 2 [ ] DGRAM 27533
    unix 2 [ ] DGRAM 895
    unix 2 [ ] DGRAM 785
    如上所示，我接通的服務通道只有 22 這一個，而其他的你可以參照上面的指令輸出結果來對照，所以你就可以知道囉：pop3 為 110 而 imap 為 143 呵呵！就是這樣囉！因此，透過此一指令，就可以輕易的瞭解目前主機的運作狀況與服務狀態囉！當然囉， netstat 的用途不止於此，您可以使用 man netstat 來查閱一番喔！相信對你的主機會有更大的瞭解呦！
  • 偵測你開啟的通訊閘道（port）：使用 nmap 套件
    將一些不必要的套件移除之後，再來則是要來偵測一下你目前開啟的閘道有哪些？這時就需要使用到 nmap 這個軟體了，你可以按一下 這裡 下載。
    1. 安裝：就是使用 rpm 安裝呀！直接下達：rpm -ivh nmap-2.54BETA25-1.i386.rpm 即可。
    2. 偵測：下達 nmap your.host.IP ，例如我的主機 IP 為 192.168.1.2 則 nmap 192.168.1.2。
        結果有點像這樣：
        Starting nmap V. 2.54BETA25 ( www.insecure.org/nmap/ )
        Interesting ports on tsai.adsldns.org (192.168.1.2):
        (The 1534 ports scanned but not shown below are in state: closed)
        Port State Service
        21/tcp open ftp
        23/tcp open telnet
        25/tcp open smtp
        80/tcp open http
        109/tcp open pop-2
        110/tcp open pop-3
        139/tcp open netbios-ssn
        143/tcp open imap2
        3128/tcp open squid-http
        3306/tcp open mysql
        上面就是我們有開啟的服務 port 啦，WWW為 80 port 而 telnet 使用 23 port ，郵件的傳送則使用 25 與 110 port ！
    3. 限制：這個軟體請千萬不要去偵測他人的網站，否則可能會被提出告訴喔！
    4. 解除安裝：如果確定執行完畢了，瞭解你所開啟的服務之後，你可以直接將這套軟體移除之，以免不小心執行後，導致別人的抗議：rpm -e nmap 即可。
    網路上一些玩家都建議大家在使用 Linux 的時候，以較安全的方式來開啟你的網站，當然，這是網管人員所必須要注意的事項！如果你對於網管很有興趣的話，就一定需要注意一下這些網路安全的課題！當然囉，建立防火牆也是蠻必須的！另外，也必須常常的更新你的 Linux 套件的最新版本的資訊喔！我想，過一陣子我可能會專門闢一區來說明 RedHat 6.1 的安全升級套件的說明資料。
    需要注意的是，由於你剛剛這樣子下來，可能動到了系統的一些設定了，因此，對於你的 sendmail 可能會有若干的不良影響（以我為例，我完成的上面的動作之後，雖然 port 110 與 port 25 是正常的，但是寄信就是很慢很慢，這個時候，就得需要以 netconf 這個程式來重新產生 sendmail 的程式碼。）因此，建議完成的上面的動作之後，請到 mail server 那一篇文章中，看一看如何使用 netconf 來重新設定與產生 sendmail.cf 檔案！
2002/ 01/01以來統計人數


偵測 Linux 上面的流量
最近更新日期：2001/11/10
前言 MRTG運作過程
安裝前的準備工作
開始安裝 MRTG
偵測網路卡流量
偵測 CPU 負載量
即時偵測線上人數 (2001/10/29 update)
在 Linux 上面偵測 Win2000 的流量 (2001/11/05 update)
在 Linux 上面偵測 Windows98 的流量 (2001/11/06 update)
一些問題彙整
  • 前言：
    先來『看看我們的流量統計範例』吧。
    網路伺服器主機的資料總流量（網路卡的資料傳送總數），以及 CPU 使用率和特殊服務（例如 squid 的代理服務）等等的封包傳送率（或者說是流量），是網路管理人員所必須要注意的事項，因為當主機的 CPU 使用率過高的時候，系統可能呈現不穩定的狀態，而當流量過高的時候，就需要注意是哪一個服務或者是哪一個傢伙在嘗試竊取我們的資料呢？因此，網路管理方面，有必要瞭解一下，我們主機的流量狀態，並視流量來加以限制或者是加大頻寬！
    目前網路上有一套蠻好用軟體可以用來偵測主機的資料流量，這也是各大伺服器常使用的軟體，就是 MRTG (Multi Router Traffic Grapher) 這一套軟體。MRTG 耗用的系統資源很小，因此有很多外掛的程式也依附在 MRTG 底下，因為 MRTG 的繪圖挺漂漂的說！我們這裡僅提供下面的偵測方法：
    1. 網路卡整體流量；（或者說是 Router 整體流量）
    2. CPU 使用率；
    3. RAM 使用率。
  • MRTG 的運作過程：
    要瞭解 MRTG 的運作，就必須瞭解一下 SNMP (Simple Network Management Protocol) 這個協定，因為 MRTG 是透過 SNMP 協定來監控流量的。所以，所有的 MRTG 所偵測的裝置都必須符合 SNMP 的協定。那什麼是 SNMP 呢？簡單的說，就是一種可以提供裝置（主機設備）的各類資訊的一種協定，諸如：網路流量、主機名稱、CPU用量等等的資訊都可以藉由此一協定來提供。不過，由於不同廠牌的裝置可能會有無法相容的情況，因而後來又有所謂 MIB (Management Information Base) 的協定產生。不論如何， MRTG 就是藉由 SNMP 這個協定來監測與取得相關的資訊以製作圖表的！詳細的 SNMP 你可以在 http://www.net-snmp.org/ 查得。
    所以我們可以知道，MRTG 基本上是透過以 SNMP 的協定，向主機詢問相關的資料後，主機傳遞數值給 MRTG 程式，然後 MRTG 再繪製成網頁上的圖表。由於 MRTG 是以 SNMP 協定來向主機要求資料，因此，您要使用 MRTG 來製作圖表時，必須先確定您的機器（或者說是設備）必須支援 SNMP 協定。好在 Linux 上面的網路卡，通常已經支援了 SNMP 協定了！當然， Windows 2000 也可以被偵測的到喔！
    另外，有一點是特別需要注意的，在 mrtg 這個程式中，其實他總共需要要求四個數據（前兩個用來作圖，後兩個提供相關資訊，基本上，繪圖只會用到前兩個數據），因此，你可以隨時製作 MRTG 的圖表，只要你能提供兩個數字（當然要是數字了，不然如何作圖！）給 mrtg 即可製圖！這個在後面的偵測 CPU 或者是 RAM 的地方，加掛自己寫的程式後，就可以得到啦！
  • 安裝前的準備工作：
    MRTG 為使用 Perl 程式寫成的，並且使用到 zlib 、 gd 及 png 的函式庫（zlib 用來壓縮圖表、gd 用來繪製圖表），且由於 MRTG 乃使用 SNMP 協定，並且最後是以 HTTP 的網頁型態輸出成圖表，因此，你需要確定 Linux 主機中已經含有下列的套件：
    • perl (perl-5.0xx 以上)
    • zlib (zlib-1.1.3-xx 以上)
    • gd (gd-1.3.xx 以上)
    • libpng
    • apache
    確定的方法就以 RPM 來確認吧：
    • rpm -qa | grep perl
    • rpm -qa | grep zlib
    • rpm -qa | grep gd
    • rpm -qa | grep libpng
    另外的另外，由於 MRTG 的圖表顯示是以 HTTP 的型態（Web 的型態）來顯示的，因此，你也必須安裝好了 Apache 這個套件，如果沒有安裝好的話，請到這個網頁的 Linux 架站文件去看看吧！以下，我們使用了預設的 Apache 路徑，為 /usr/local/apache/htdocs 這個路徑來安裝 mrtg 輸出的圖表，要注意，如果沒有 apache 的話，那就沒有辦法顯示圖表了（雖然可以執行 MRTG !!）
    其實在 Linux 安裝完畢之後，上面的幾個（除了 apache 可能會更新之外）套件都已經安裝好了！所以你可以直接來安裝 MRTG 囉！（基本上，我們這個網頁的 RedHat 6.1 已經包含了這些套件了，所以如果你在安裝的時候是選擇 All 的話，那就直接安裝下列的套件吧）
  • 開始安裝 MRTG
    由於 MRTG 是透過 SNMP 通訊協定來要求資料，因此你的 Linux 上面需要先安裝相關的軟體，通常我們都是安裝 ucd-snmp 這套軟體的，那就來安裝吧！
    1. 下載 ucd-snmp-4.2.1.tar.gz, mrtg-2.9.17.tar.gz ；
    2. 安裝 ucd-snmp-4.2.1.tar.gz：
      [root @tsai /root]# cd /usr/local/src
      [root @tsai src]# cp /root/ucd-snmp-4.2.1.tar.gz .
      [root @tsai src]# tar -zxvf ucd-snmp-4.2.1.tar.gz
      [root @tsai src]# cd ucd-snmp-4.2.1
      [root @tsai ucd-snmp-4.2.1]# ./configure --prefix=/usr/local/snmp
      .......（過程我就省略了）
      ************** Configuration Section **************

      You are about to be prompted by a series of questions. Answer
      them carefully, as they determine how the snmp agent and related
      applications are to function.

      After the configure script finishes, you can browse the newly
      created config.h file for further - less important - parameters to
      modify. Be careful if you re-run configure though since config.h will
      be over written.

      -Press return to continue- （這裡按 enter 吧）

      disabling above prompt for future runs... yes
      checking System Contact Information...

      *** System Contact Information:

      Describes who should be contacted about the host the agent is
      running on. This information is available in the MIB-II tree. This
      Can Also Be Over-Ridden Using The "syscontact" Syntax In The Agent'S
      Configuration Files.

      System Contact Information (root@):root@tsai.adsldns.org （這裡輸入你的 e-mail）
      setting System Contact Information to... root@tsai.adsldns.org
      checking System Location...

      *** System Location:

      Describes the location of the system. This information is
      available in the MIB-II tree. This Can also be over-ridden using the
      "syslocation" syntax in the agent's configuration files.

      System Location (Unknown):RedHat 6.1 （這裡可以隨便輸入，不正確也沒關係）
      setting System Location to... RedHat 6.1
      checking Location to write logfile...

      *** Logfile location:

      Enter the default location for the snmpd agent to dump
      information & errors to. If not defined (enter the keyword "none"
      at the prompt below) the agent will use stdout and stderr instead.
      (Note: This value can be over-ridden using command line options.)

      Location to write logfile (/var/log/snmpd.log):（按 enter 即可）
      setting Location to write logfile to... /var/log/snmpd.log
      checking Location to write persistent information...

      *** snmpd persistent storage location:

      Enter a directory for the snmp library to store persistent
      data in the form of a configuration file.

      Location to write persistent information (/var/ucd-snmp):（按 enter 即可）

      [root @tsai ucd-snmp-4.2.1]# make
      [root @tsai ucd-snmp-4.2.1]# make install

      上面輸入的資訊，在進行 MRTG 的製圖時，會顯示在圖表上面，不過，這也是可以改的資訊，所以，如果不小心輸入錯誤也沒關係的。這樣就將 ucd-snmp 安裝妥當了！
    3. 啟動 ucd-snmp ：
      直接在 shell 下面打上 /usr/local/snmp/sbin/snmpd 即可！或者直接加在 /etc/rc.d/rc.local 當中，就可以自動開機時啟動了！
    4. 安裝 MRTG ：
      [root @tsai /root]# cd /usr/local/src
      [root @tsai src]# cp /root/mrtg-2.9.17.tar.gz .
      [root @tsai src]# tar -zxvf mrtg-2.9.17.tar.gz
      [root @tsai src]# cd mrtg-2.9.17
      [root @tsai mrtg-2.9.17]# ./configure --prefix=/usr/local/mrtg-2 \
      > --with-gd=/usr/include \
      > --with-gd-lib=/usr/lib \
      > --with-gd-inc=/usr/include \
      > --with-png=/usr/include \
      > --with-zlib=/usr/include

      [root @tsai mrtg-2.9.17]# make; make install
      [root @tsai mrtg-2.9.17]# mkdir /usr/local/apache/htdocs/mrtg (請注意，這裡與你的 WWW 主頁的放置地點有關，請依你的系統來設定，另外，由於我們需要設定 網路流量、CPU與RAM使用率，因此在 mrtg 中，可以再建立三個子目錄，比較容易管理啦！)
      [root @tsai mrtg-2.9.17]# mkdir /usr/local/apache/htdocs/mrtg/net
      [root @tsai mrtg-2.9.17]# cp images/* /usr/local/apache/htdocs/mrtg/net (將一些影像檔拷貝到即將使用的目錄中去備用)

      就樣就安裝妥當了！再來就是開始要設定 MRTG 的組態囉！
  • 偵測網路卡流量
    要使用 mrtg 來作圖真的是太簡單了，只要幾個小步驟就可以自動的監測流量喔！首先以 mrtg 附的程式來製作一個參數檔 （預設檔名是 mrtg.cfg），然後修改一下 mrtg.cfg 這個參數檔之後，在直接執行三次參數檔，之後以 mrtg 程式附的小軟體，直接製作成首頁，就可以察看圖表囉！看下去吧！
    1. 設定 MRTG：
      [root @tsai mrtg-2.9.17]# cd /usr/local/mrtg-2/bin
      [root @tsai bin]# ./cfgmaker --output=/usr/local/apache/htdocs/mrtg/net/mrtg.cfg \
      > public@vbird.adsldns.org
      上面這個步驟會在你的主機上面製造一個參數檔，
      而你未來的設定都會自動的在這個參數檔中設定完成了！

      [root @tsai bin]# vi /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
      不過由於程式自動設定的 mrtg.cfg 有些地方會有瑕疵，
      因此，請將底下這三行修改成你的樣式喔！
      WorkDir: /usr/local/apache/htdocs/mrtg/net/
      Options[_]: growright, bits
      Language: big5

      [root @tsai bin]# ./mrtg /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
      開始測試你的參數檔，正常的話，進行
      這個動作要執行三次，就可以正常工作了，
      不過，若是有問題的話，就需要改 mrtg.cfg ，再執行直到沒有錯誤發生為止！

      [root @tsai bin]# ./indexmaker \
      > --output=/usr/local/apache/htdocs/mrtg/net/index.html \
      > --title=VBird主機流量統計表 \
      > /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
      上面這個程式 indexmaker 是在製作首頁！當然，你也可以自訂首頁！
      上面是說，會自動的輸出一個 index.html 的檔案到
      /usr/local/apache/htdocs/mrtg/net 中，就是主網頁啦！

      上面請特別注意：在 public@vbird.adsldns.org 這一行呢，public 是有其意義的（在 snmp 這個通訊服務裡面的預設搜尋的一個代碼），所以，如果你的主機的動態 DNS 名稱為 your.domain.name 則你就『一定』要寫成 public@your.domain.name 才行！千萬不要弄錯了！已經有很多網友遇到這個問題！
    2. 設定五分鐘偵測一次：
      好了，開始偵測吧，就修改 /etc/crontab 吧！
      [root @tsai bin]# vi /etc/crontab

      #1. Runing The MRTG Net Flow Control
      */5 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/net/mrtg.cfg > /dev/null 2>&1

      這樣就每五分鐘可以自動偵測一次網路卡的流量囉！
    3. 設定 Web site：
      以上面的例子為例，則你的 mrtg 圖表在：
      http://your.host.domain/mrtg/net/index.html
      就可以看到你的主機上網路卡的流量囉！
    好了，重點說完了，再來說說在 mrtg.cfg 這個參數檔當中你看到的幾個參數的意義吧！
  • Target[裝置名稱]：
    • Target[vbird.adsldns.org_2]: 2: public@192.168.1.2
      上面是一般的用法，其中半括號內的是裝置的名稱，同一個裝置的各參數中，這個名稱要一致！
    • Target[vbird.adsldns.org_3]:`/usr/local/apache/htdocs/mrtg/cpu/mrtg.cpu`
      後面接的是一個自訂的加掛的可執行檔案，這個檔案執行之後，會顯示四個數據，這樣就可以繪圖了！在繪製非 MRTG 程式的預設咚咚中，這個是最常使用的方法了！
  • MaxBytes[裝置名稱]：
    • MaxBytes[vbird.adsldns.org_2]: 1250000
      後面的數字代表資料監測時，最大的傳送速率，使用 bytes，所以 10Mbps 則為 1.25MBytes，大約是 1250000 Bytes。這個數值程式會自動判斷啦！不過你也可以自己修改，用到這個數字的時候是在你的圖表下方，每一個說明後面的(xx%)時用到的。
    • MaxBytes[vbird.adsldns.org_3]: 100
      如果你的資料並不是 Bytes 時，例如監測 CPU 負載率時，那這個數值就需要改變啦！
  • Options[裝置名稱]：
    • Options[vbird.adsldns.org_2]: growright, bits （用在網路流量中）
    • Options[vbird.adsldns.org_3]: growright, nopercent, gauge （用在 CPU 負載中）
      growright:將資料隨時間變化的順序以右而左繪圖；
      bits:資料單位為 bits；
      nopercent:在圖下方的說明文字中，不顯示百分比；
      gauge:圖表的上限固定！
  • 偵測 CPU 負載量：
    偵測 CPU 負載量時，需要使用到額外的外掛程式，就是 sysstat 這個程式，我只使用在 RedHat 6.1 上面過，是可以使用的！
    1. 下載並安裝 sysstat-4.0.2-1.i386.rpm：
      不要說還不會使用 rpm 安裝套件喔！打屁屁！
      rpm -ivh sysstat-4.0.2-1.i386.rpm
    2. 編寫外掛程式：
      以安裝完 sysstat 套件後，產生的 /usr/bin/sar 程式進行外掛程式的編寫，我寫了一個監測 CPU 的小程式，使用 bash 寫的，可以參考看看：
      [root @tsai cpu]# vi mrtg.cpu

      ---- 檔案開始 ----
      #!/bin/bash
      # 這個程式是用來偵測 CPU 的小外掛程式！
      # 1. 開始使用 sar 來監測 CPU 的 user 及 System 負載率
      cpuusr=`/usr/bin/sar -u 1 3 | grep Average | awk '{print $3}'`
      cpusys=`/usr/bin/sar -u 1 3 | grep Average | awk '{print $5}'`
      UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}'`

      # 2. 列出四個數據（前兩個為數字）
      echo $cpuusr
      echo $cpusys
      echo $UPtime
      echo vbird.adsldns.org （這裡寫你的主機名稱）
      ---- 檔案結束 ----

      [root @tsai cpu]# chmod 755 mrtg.cpu （設定成可執行）
      [root @tsai cpu]# ./mrtg.cpu （測試看可執行否）
      2.0
      5.4
      1 day, 22:30,
      vbird.adsldns.org

    3. 開始設定 mrtg 參數檔：
      我的參數檔有點像這樣：
      [root @tsai cpu]# vi mrtg.cfg.cpu

      ---- 檔案開始 ----
      ### Global Config Options
      ### To get bits instead of bytes and graphs growing to the right
      WorkDir: /usr/local/apache/htdocs/mrtg/cpu/
      Language: big5

      Target[localhost]: `/usr/local/apache/htdocs/mrtg/cpu/mrtg.cpu`
      MaxBytes[localhost]: 100
      Options[localhost]: gauge, nopercent, growright
      YLegend[localhost]: CPU loading (%)
      ShortLegend[localhost]: %
      LegendO[localhost]: &nbsp; CPU 使用者負載;
      LegendI[localhost]: &nbsp; CPU 純系統負載;
      Title[localhost]: CPU ?t???v
      PageTop[localhost]: <H1>VBird 主機 CPU 負載率</H1>
      <TABLE>
      <TR><TD>System:</TD> <TD>RedHat 6.1 in Linux Kernel 2.2.19</TD></TR>
      </TABLE>
      ---- 檔案結束 ----

    4. 開始執行參數檔：（一樣，要執行三次以上）
      /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/cpu/mrtg.cfg.cpu
    5. 寫入 /etc/crontab 當中：
      */2 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/cpu/mrtg.cfg.cpu > /dev/null 2>&1

      這樣就OK了，直接將 Web 指向 http://your.host.domain/mrtg/cpu/localhost.html

重點說完了！再來說說 sar 吧！基本上， sar 可以用來偵測很多的咚咚，例如：
  • sar -u 1 5 ：每一秒鐘測一次 cpu ，共計五次後算平均；
  • sar -r 3 3：每三秒看一次實體與虛擬記憶體用量，三次後算平均！
  • 其他的功能有待你的發掘囉！
  • 即時偵測線上人數
    如果您曾經上過中山大學的 FTP 網站的話，您會發現『咦！他們有偵測即時的上線人數(online users)呢！』同樣的，她們也是使用 MRTG 這一套相當漂亮的軟體來達成這個目標！那，要如何達到這個目標呢？其實也是很簡單，我們剛剛不是已經介紹了， mrtg 其實只要接受到 2 個數字就可以繪圖了嗎？那這裡就給他兩個數字就可以啦！兩個數字從何而來？如果您知道 netstat 這個指令的話，就會發現，當您下達 netstat -a 的時候，會有這個咚咚會出現：
    [root @tsai root]# netstat -a | more
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:ftp *:* LISTEN
    tcp 0 0 *:telnet *:* LISTEN
    tcp 0 0 *:pop-2 *:* LISTEN
    tcp 0 0 *:pop-3 *:* LISTEN
    tcp 0 0 *:imap2 *:* LISTEN
    tcp 0 0 *:smtp *:* LISTEN
    tcp 0 0 *:www *:* LISTEN
    tcp 0 0 tsai.adsldns.org:www 211.72.119.19:58298 SYN_RECV
    tcp 0 0 *:mysql *:* LISTEN
    tcp 0 0 *:netbios-ssn *:* LISTEN
    tcp 0 57920 tsai.adsldns.org:www 211.75.193.100:2965 ESTABLISHED
    tcp 0 57920 tsai.adsldns.org:www 211.75.193.100:2966 ESTABLISHED
    tcp 0 57920 tsai.adsldns.org:www 211.75.193.100:2967 ESTABLISHED
    tcp 0 57920 tsai.adsldns.org:www 211.75.193.100:2968 ESTABLISHED
    tcp 0 57920 tsai.adsldns.org:www 211.75.193.100:2969 ESTABLISHED
    tcp 0 1 tsai.adsldns.org:www 202.98.131.11:4374 FIN_WAIT1
    tcp 0 1 tsai.adsldns.org:www 202.98.131.11:4404 FIN_WAIT1
    tcp 0 1 tsai.adsldns.org:www 202.98.131.11:4413 FIN_WAIT1
    tcp 0 1 tsai.adsldns.org:www 202.98.131.11:4453 FIN_WAIT1
    以下省略！

    我們可以很清楚的發現：使用 netstat 可以查到 WWW 的連線數目，那只要將這些數目作一些重複性分析，以去除重複的 IP 網址後，不就可以知道以 WWW 方法上網連線的即時人數了嘛！這就是我們偵測的主要原理了！

    那要如何寫這個偵測的批次檔呢？以下就是鳥哥嘗試寫的一個批次檔！你可以將一些註解符號取消，就可以知道為何這麼寫了：
    [root @tsai root]# vi mrtg.person.sh
    檔案開始：
    #!/bin/bash
    # 這個程式主要在計算有多少人以 WWW 的方式連線進我們的主機！

    # 1. 計算連線的數目
    echo `netstat -a | grep www|awk '{print $5}'|sort | wc -l|awk '{print$1 - 1}'`
    # 底下在說明整個咚咚的列出（檢查用）
    # netstat -a | grep www|awk '{print $5}'|sort| uniq

    # 2. 計算連線人數：
    echo `netstat -a | grep www|awk '{print $5}'|cut -d":" -f1|sort| uniq |wc -l | awk '{print $1 - 1}'`
    # netstat -a | grep www|awk '{print $5}'|cut -d":" -f1|sort| uniq

    # 3. 輸出時間咚咚
    UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}'`
    echo $UPtime
    echo your.host.name
    檔案結束！

    在上面的式子中，你可以執行出你所需要的咚咚囉！你也可以將 mrtg.person.sh 這個檔案捉下去直接修改！所需要變更的就只有 最後一行的 your.host.name 要改囉！改成您的主機名稱吧！並且將這個檔案改成可以執行的狀態：

      chmod 755 mrtg.person
    即可！
    接下來則是修改 mrtg 的參數檔啦！我們可以建立一個名稱為 mrtg.cfg.person 的參數檔，內容有點像這樣！
    [root @tsai root]# vi mrtg.cfg.person
    檔案開始：
    # Created by
    # VBird 2001/10/29

    ### Global Config Options
    WorkDir: /usr/local/apache/htdocs/mrtg <==請改成您圖表放置的目錄
    Language: big5

    ### CPU Loading detecting ...
    Target[tsai.adsldns.org_person]: `/usr/local/mrtg-2/bin/mrtg.person.sh` <==檔案放置的路徑與檔名
    MaxBytes[tsai.adsldns.org_person]: 500
    Options[tsai.adsldns.org_person]: gauge, nopercent, growright
    YLegend[tsai.adsldns.org_person]: Online Users
    ShortLegend[tsai.adsldns.org_person]: %
    LegendI[tsai.adsldns.org_person]: &nbsp; 連線數目 :
    LegendO[tsai.adsldns.org_person]: &nbsp; 上線人數 :
    Title[tsai.adsldns.org_person]: WWW 上線人數統計表
    PageTop[tsai.adsldns.org_person]: <H1> WWW 主機上線人數 </H1>
    <TABLE>
    <TR><TD>System:</TD> <TD>Aerosol Lab. in Redhat 6.1 Kernel 2.2.18</TD></TR>
    <TR><TD>Maintainer:</TD> <TD>VBird</TD></TR>
    </TABLE>
    檔案結束！

    要注意的僅是 `/usr/local/mrtg-2/bin/mrtg.person.sh` 這一行字！這個就是我們剛剛才寫成的 scripts 啦！然後同樣的，執行

      ./mrtg mrtg.cfg.person
    三次之後，就可以正常的產生圖表啦！
    然後在將您的圖表加在 index.html 網頁中，如此則可以即時的偵測與記錄上線人數的統計囉！當然，如果您修改一下上面的 script (mrtg.person.sh)，將 www 改成 ftp 的話，那就等於是偵測 ftp 的即時上線人數！如何！簡單吧！
    祝大家架站愉快！
  • 在 Linux 主機上偵測 windows 2000 的網路流量
    好了！我們現在已經可以在 Linux 系統上面偵測任何咚咚啦！那如果要偵測 windows 2000 要如何作呢？其實也真是很簡單，(1) 你要先在 windows 2000 上面安裝 SNMP 通訊協定的套件；(2) 在 Linux 上面針對 windows 2000 進行參數檔的偵測； (3) 做成網頁輸出！簡單的很！
    1. Windows 2000 下啟動 snmp 服務：
      windows 2000 這個系統底下已經有預設的 snmp 通訊協定了，只要開放他即可！那要如何開放呢？你可以開啟『開始』>『設定』>『控制台』>『新增移除程式』>『新增/移除 Windows 元件』。然後就像下面兩張圖一樣，先勾選 Management and Monitoring Tools ，之後選擇 『詳細資料』之後，出現的圖示中，選擇勾選 Simple Network Management Protocol ，然後按下確定之後，就開始安裝啦！在安裝的過程中，安裝程式會要求你放入 windows 2000 的 CD 進入 CD-ROM ，安裝完畢之後就已經有 SNMP 的通訊協定啦！

    2. 在 Linux 上面針對 windows 2000 進行 MRTG 的參數偵測：
      接下來的工作跟之前的工作就差不多啦！先來建立參數檔吧，如何建立呢？假設你的 Windows 2000 的 IP 是 192.168.1.11 ，那麼你就必須要這樣來偵測 Windows 2000 的參數：
      [root@vbird mrtg]# /usr/local/mrtg-2/bin/cfgmaker public@192.168.1.11 > mrtg.cfg.vbird

      注意囉！ public 是預設的指令，後面接的是你的 IP （當然也可以是 domain 說）。這樣一來，就可以做出一個參數檔案，名稱為 mrtg.cfg.vbird，我們來看一看這個檔案的大概內容吧！
      [root@vbird mrtg]# vi mrtg.cfg.vbird
      # Created by
      # /usr/local/mrtg-2/bin/cfgmaker public@192.168.1.11
      ### Global Config Options
      WorkDir: /usr/local/apache/htdocs/mrtg/
      Options[_]: growright, bits

      Target[192.168.1.11_16777219]: 16777219:public@192.168.1.11:
      SetEnv[192.168.1.11_16777219]: MRTG_INT_IP="192.168.1.11" MRTG_INT_DESCR="NDIS 5
      .0 driver"
      MaxBytes[192.168.1.11_16777219]: 1250000
      Title[192.168.1.11_16777219]: Traffic Analysis for 16777219 -- VBLAB2
      PageTop[192.168.1.11_16777219]: <H1>Traffic Analysis for 16777219 -- VBLAB2</H1>
      <TABLE>
      <TR><TD>System:</TD> <TD>VBLAB2 in </TD></TR>
      <TR><TD>Maintainer:</TD> <TD></TD></TR>
      <TR><TD>Description:</TD><TD>NDIS 5.0 driver</TD></TR>
      <TR><TD>ifType:</TD> <TD>ethernetCsmacd (6)</TD></TR>
      <TR><TD>ifName:</TD> <TD></TD></TR>
      <TR><TD>Max Speed:</TD> <TD>1250.0 kBytes/s</TD></TR>
      <TR><TD>Ip:</TD> <TD>192.168.1.11 ()</TD></TR>
      </TABLE>

      其他的設定不太需要改變，但是上面黃色的那兩行字中，請注意，修改成你的『工作目錄』與一些設定吧！最好是將一些圖表資料都放一起就好了！這樣子大概就OK啦！

    3. 做成網頁輸出：
      這一步跟前面就都一樣啦，先執行 mrtg mrtg.cfg.vbird（你的參數檔名）三次，然後在將輸出的圖表寫在你的 index.html 上面即可！這樣就已經可以偵測 windows 2000 的網路流量啦！而且還不需要在 windows 2000 上面有任何的咚咚發生喔！
  • 在 Linux 主機上偵測 windows 98 的網路流量
MRTG 流量偵測到此為止介紹的都是屬於 NT 或者是 Linux 上面的訊息，那要如何偵測 Windows 98 的系統呢？畢竟使用這個系統的用戶並不少呀！OK！偵測 Windows 系統，最主要的就是要有 snmp 啦！只要有 snmp 之後，往後的工作就都完全一模一樣了！哪我們就在 Windows98 上面安裝 snmp 的服務吧！其實， snmp 套件已經在 windows 98 的原版光碟中了，你可以到原版 98 光碟的 /tools/reskit/netadmin/snmp 這個路徑下找到以下僅提供 snmp 在 windows98 下的安裝方法，至於偵測的方法則與 Windows 2000 的情況一模一樣！目前我已經在 Linux 上以 MRTG 成功的將研究室所有的電腦之網路卡流量偵測了！往後將可便利於管理整個研究室的網路流量，並可以藉以分析是否有不明人士亂玩網路.....
  1. 你可以在 windows 98 下按下『開始』>『控制台』>『網路』，或者是在桌面的『網路上的芳鄰』按『右鍵』選『內容』，會出現如下方框：
  2. 請按下『新增』之後，出現：
  3. 選擇『服務』的項目後，並按下『新增』：
  4. 然後再選擇『從磁片安裝』這一項！並將你的 snmp 套件指向你的原版 windows 98 光碟！
  5. 按下確定之後，再按一次確定！即可安裝 snmp 套件囉！
  6. 就像這樣，出現了這個東西！按下確定吧！開始安裝囉！
  7. 有沒有看到如下圖所示！ Microsoft SNMP agent 已經出現了！表示安裝完畢！
  • 一些問題彙整
在寫出這一篇文章之後，收到網友們的熱情支持！讓小弟不甚惶恐！不過，這裡面也出現了一些問題是當初所沒有發現的！以下就來說說問題的所在吧！
  1. 我的 Red Hat 本身就有 snmp 了，可不可以不要安裝 ucd-snmp 這個套件呢？
    當然了，Red Hat 本身就有 snmp 這個通訊服務存在了，可能的話當然就不要去動他比較好囉！不過，要讓你的 Red Hat 預設的 snmp 能動，那就一定需要修改 /etc/snmp/snmpd.conf 這個檔案！不過，小弟對於 snmpd.conf 的設定還不是很瞭解！因此，就會直接建議您，乾脆移除預設的 ucd-snmp 之後，重新安裝新版的吧！設定上比較簡單啦！當然，如果您英文不錯的話， /etc/snmp/snmpd.conf 這個檔案可要多看一些喔！
  2. 為何作完了 ./cfgmaker 這個動作之後，再執行 ./mrtg 時，會出現：『ERROR: Line 9 』的問題？
    這個是大家最容易犯的錯了，其實，就是在 public@your.hosts.name 這一個地方寫錯了！請千萬注意， public 是有意義的代碼，請不要將這一行寫成你的 e-mail 了！不然就會造成錯誤情況發生！
    參考資料：
    高健智、賴阿福：Linux 網路實作經典之高手究極篇，知城出版社；
    苗栗大南國小架站日誌
    張宏明的個人筆記簿
2002/ 01/01以來統計人數


郵件主機在寄信時的 SMTP 認證問題
最近更新日期：2001/12/13
Red Hat 7.1 的方法：
其他 Red Hat (以 Red Hat 6.1 為例) 的方法：
Red Hat 7.1 的方法：
    前言：
    網管人員對於郵件伺服器最厭煩的地方大概就是在管理郵件傳遞（Relay）的問題了！因為如果將郵件傳遞的範圍限制的太小，那麼只要一個不小心，使用者在能轉遞信件的 domain 之外，就無法使用郵件主機！而如果沒有設定的很好，那麼郵件主機又很容易被拿來當成廣告垃圾信件的中繼站！這裡提供一個郵件認證的機制，讓你的使用者方便而郵件主機又不會有被做為廣告中繼站的問題！
    郵件主機是如何運作的呢？你可以看一下 Mail Server 這一篇文章，相信就可以約略瞭解郵件的傳送過程了！不過，這裡有個觀念要讓大家瞭解一下：就是 sendmail 在寄信與收信的通訊協定是不一樣的！你在用戶端(Client)使用的收信程式在接收信件時，是使用 pop3 的協定，至於寄信的時候就是需要 smtp 的通訊協定了。常常會發現到郵件主機掛掉的時候並不是兩者同時掛掉，有時候只掛掉 smtp 的協定，那麼此時這個郵件主機還是可以在用戶端收信的，只是就會無法寄信就是了！
  • 關於 Relay 的問題：
    很多的網管人員對於郵件主機最感到棘手的，應該是 Relay 的問題！在 Red Hat 6.x 以前的 Sendmail 版本中，郵件主機預設是可以讓所有的用戶端電腦傳遞信件的！此話何解？剛剛說到郵件主機有兩個通訊協定，分別是 pop3 與 smtp ，你會發現到，如果是使用 Red Hat 6.x 以前版本的主機系統時，收信是一定需要帳號與密碼的（使用 pop3 協定），但是寄信呢？寄信者只要隨便取一個帳號名稱（這個帳號不一定要在 Red Hat Linux 中存在），然後直接按下寄信之後，郵件主機不會判別 smtp 的來向，一律通通予以接受，並且予以轉寄！那你就知道了！廣告信件從此將可以直接經由你的主機來將信件送出去！這就是問題啦！
    這個問題的解決方法大概就是在 /etc/mail 當中的 access 檔案中，將你所發現的亂發垃圾廣告的電腦 IP Reject 掉，不過，由於目前發廣告信件的電腦實在太多了，你根本就擋不完！那如果使用了將所有的電腦都 deny 掉之後，再開放一些可以 Relay 的電腦呢？這樣一來不就可以擋掉所有的廣告信了嗎？沒錯！但是如此一來卻也讓你的信任用戶合理的使用權也遭受到同樣被擋掉的命運！
    除了這個問題之外，在目前的 Red Hat 7.x 版本的 sendmail 中，也將預設的 Relay 功能取消了，因此，你必須設定 /etc/mail/access 這個檔案的內容，才能將合法的使用者的權限開放！這樣是不是很麻煩呢？我覺得，很麻煩......
  • 設定 SMTP 認證機制簡介：
    為了讓使用者可以很方便的就擁有寄信的權力，也為了讓廣告信件可以有效的被擋掉，因此 sendmail 本身也提供了一個有效的管理辦法，那就是 SMTP 的身份認證機制了！這個機制的好處在於讓 SMTP 與 pop3 一樣，都需要輸入帳號與密碼之後，才可以進行寄信的動作！則如此一來，將可以讓廣告信件的發送者無法經由匿名來轉寄，而您的信任的使用者仍然可以快快樂樂的使用您的郵件主機囉！以下將介紹 Red Hat 7.x 以後版本的認證方法，在 Red Hat 6.x 以前的版本的認證機制可以參考 Yu-Lin Chang 先生的文章。
  • 系統需求：
    由於要使 smtp 通訊協定具有身份認證的功能，則必須要有底下的版本的套件才有支援！
    1. 由 Sendmail Inc. 發行的 8.10.0 以上版本的 Sendmail 套件；
    2. 由 Carnegie Mellon University 發行的 Cyrus SASL (Simple Authentication and Security Layer) 認證程式庫；
    3. C 語言的編輯器。
    很幸運的， Red Hat 7.x 以後的版本中，以上的套件都已經含有了！所以我們並不需要重新安裝上面的套件喔！不過，如果您是使用 Red Hat 6.x 以前版本的 Linux 系統，那麼您只好更新您的 Sendmail 及 Cyrus SASL 套件囉！
  • 設定方法：
    在 Red Hat 7.x 版本中的設定真的是很簡單！你只要依序做底下的動作就可以了！
    • 修改 /usr/share/sendmail-cf/cf 底下的 redhat.mc 檔案：
      [root@tsai /root]# cd /usr/share/sendmail-cf/cf
      [root@tsai cf]# vi redhat.mc
      ..........
      dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      ..........
      DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
      ..........
      將上面的三行改成中，前兩行 dnl 去掉，第三行則將 127.0.0.1 改成 0.0.0.0 如下所示：
      ..........
      TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      ..........
      DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
      ..........
    • 製作 sendmail 參數檔與重新啟動 sendmail：
      修改完成之後，再來則是製作 sendmail 的參數檔 sendmail.cf 了，指令下達：
      [root@tsai /root]# cd /usr/share/sendmail-cf/cf
      [root@tsai cf]# sh Build redhat.cf
      [root@tsai cf]# mv /etc/sendmail.cf /etc/sendmail.cf.old <==備份舊的檔案
      [root@tsai cf]# cp redhat.cf /etc/sendmail.cf <==加入新的參數檔
      [root@tsai cf]# /etc/rc.d/init.d/sendmail restart <==重新啟動 sendmail
      相信嗎？這樣的步驟一完成，你的郵件主機就具有 smtp 身份認證的功能囉！
  • 用戶端的設定方法：
    主機設定完成之後，再來則是用戶端電腦的設定囉，設定的方法也是簡單的很，只要多出一個勾勾，就可以完成設定了：
    1. 開啟 OutLook
      開啟 Out Look 之後，點選『工具』內的『帳號』，如下圖所示：

    2. 點選主機的郵件帳號：
      接著下來點選『郵件』，並選擇你的設定檔，如下圖所示：

    3. 在上圖中再點選內容後，會出現如下畫面：
      在下圖的畫面中，只要點選『伺服器』的內容，然後將你的帳號與密碼均設定完全，並將『我的伺服器需要查驗身份』那一項，也就是下圖中箭頭指的那個地方，將他打勾，然後再按下『確定』後離開，如此一來便完成設定了！那往後在收發信件的時候就可以有保護囉！而且也不怕郵件主機會被誤用！
其他 Red Hat (以 Red Hat 6.1 為例) 的方法：
既然 Red Hat 7.1 可以具有身份認證的功能，那麼其他版本的 Red Hat 是否可以呢？當然可以了！只是動作會變的比較麻煩就是了！因為 Cyrus-sasl 這個套件所支援的 Sendmail 版本需要大於 8.10.0 以上，而且 Red Hat 6.X 版並無預設的 Cyrus-sasl 套件，所以你必須要捉下這兩個套件來安裝才行！
  • 下載所需套件：
    sendmail：sendmail 可以到 sendmail 的網站上下載最新的套件，或者由『這裡』下載；
    cyrus-sasl：這個認證函式庫可以到 Carnegie Mellon University 網站上看看，或者由『這裡』下載；
  • 移除與備份之前版本的 sendmail 設定：
    為了讓你未來還可以使用舊的 sendmail 來安裝你的原先的設定，所以請備份以下的檔案吧（使用 tar 是一個不錯的主意！）：
    • /etc/sendmail.cf (或 /etc/mail/sendmail.cf)
    • /etc/mail/*
    • /usr/sbin/sendmail
    再來則是移除一些舊的套件：
    • rpm -e mutt
    • rpm -e fetchmail
    • rpm -e fetchmailconf
    • rpm -e --nodeps sendmail
  • 安裝 Cyrus-sasl 函式庫：
    假設你的 cyrus-sasl-1.5.27.tar.gz 放置在 root 底下，我預設的解壓縮目錄是在 /usr/local/src 底下，那我的步驟就是：
    [root@tsai /root]# cd /usr/local/src
    [root@tsai src]# tar -zxvf /root/cyrus-sasl-1.5.27.tar.gz
    ..........（略）

    [root@tsai src]# cd cyrus-sasl-1.5.27
    [root@tsai cyrus-sasl-1.5.27]# ./configure --prefix=/usr/local \
    > --enable-plain --enable-login --enable-pwcheck
    上面這一行，在於使你的 cyrus-sasl 安裝在 /usr/local 目錄中；
    並且已經啟動了 password_check 的模式。
    ..........（略）

    [root@tsai cyrus-sasl-1.5.27]# make clean; make ; make install
    ..........（略）

    [root@tsai cyrus-sasl-1.5.27]# cd /usr/lib
    [root@tsai lib]# ln -s /usr/local/lib/sasl .
    [root@tsai lib]# ln -s /usr/local/lib/libsasl* .
    上面這幾行在將你的資料 Link 到 Red Hat 的預設路徑中。

    [root@tsai sbin]# cd /usr/lib/sasl
    [root@tsai sasl]# echo 'pwcheck_method: shadow' > Sendmail.conf
    這個目的在於產生一個 Red Hat 的密碼認證資料庫。

    基本上大概這樣就安裝完成 cyrus-sasl 這個套件了！
  • 安裝 sendmail 最新版（到 2001/12 為止）：
    假設我們的 sendmail.8.12.1.tar.gz 同樣是放置在 /root 底下，而解壓縮檔案要放在 /usr/local/src 底下：
    [root@tsai /root]# cd /usr/local/src
    [root@tsai src]# tar -zxvf /root/sendmail.8.12.1.tar.gz
    .........(略)

    [root@tsai src]# cd sendmail-8.12.1
    [root@tsai sendmail-8.12.1]# cd /usr/local/src/sendmail-8.12.1/devtools/Site
    [root@tsai Site]# vi site.config.m4 <==這個檔案內容如下：

    PREPENDDEF(`confMAPDEF', `-DMAP_REGEX')
    PREPENDDEF(`confOPTIMIZE', `-O2')
    APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL')
    APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl')
    APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
    APPENDDEF(`confINCDIRS', `-I/usr/local/include')

    [root@tsai bin]# cd /usr/local/src/sendmail-8.12.1/sendmail
    [root@tsai sendmail]# sh Build -c -f /usr/local/src/sendamil-8.12.1/devtools/Site/site.config.m4
    .........(開始編譯，略)

    底下為 sendmail 8.12 的新功能，需要增加一個 smmsp 及 smmsp
    使用者，這樣才可以確保安全性！
    [root@tsai sendmail]# groupadd -g 25 smmsp
    [root@tsai sendmail]# useradd -g smmsp -u 25 -d /var/spool/clientmqueue -s /dev/null smmsp
    [root@tsai mail]# chown -R smmsp:smmsp /var/spool/clientmqueue
    [root@tsai mail]# chmod -R 770 /var/spool/clientmqueue
    新增一個使用者，他無法登入，ID 是 25 號！
    這個使用者的家目錄是 /var/spool/clientmqueue
    主要僅用於郵件的收受與傳遞！增加這個使用者是
    sendmail 8.12 板後新增的功能！主要的目的在於
    提供更安全的 sendmail 使用環境！

    [root@tsai sendmail]# cd /usr/local/src/sendmail-8.12.1/cf/cf
    [root@tsai cf]# cp generic-linux.mc sendmail.mc
    [root@tsai cf]# cat ../feature/access_db.m4 >> sendmail.mc
    [root@tsai cf]# cat ../feature/delay_checks.m4 >> sendmail.mc
    [root@tsai cf]# cat ../feature/virtusertable.m4 >> sendmail.mc
    [root@tsai cf]# vi sendmail.mc <==在最後面加上兩行
    TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
    define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl

    [root@tsai cf]# sh Build sendmail.cf
    [root@tsai cf]# sh Build install-cf
    [root@tsai cf]# cd /usr/local/src/sendmail-8.12.1/sendmail
    [root@tsai sendmail]# sh Build install
    [root@tsai sendmail]# cd ../makemap
    [root@tsai makemap]# sh Build install
    [root@tsai makemap]# cd ../mailstats
    [root@tsai mailstats]# sh Build install
    [root@tsai mailstats]# cd /usr/local/src/sendmail-8.12.1
    [root@tsai sendmail-8.12.1]# sh Build install

    [root@tsai mail]# vi access <==這個檔案內容如下：
    # makemap hash /etc/mail/access_db < /etc/mail/access
    localhost.localdomain RELAY
    localhost RELAY
    127.0.0.1 RELAY

    [root@tsai mail]# vi local-host-names
    tsai.adsldns.org

    [root@tsai mail]# vi aliases <==aliases的內容！
    mailer-daemon: postmaster
    postmaster: root
    bin: root
    daemon: root
    adm: root
    lp: root
    sync: root
    shutdown: root
    halt: root
    news: root
    uucp: root
    news: root
    uucp: root
    operator: root
    games: root
    gopher: root
    ftp: root
    nobody: root
    apache: root
    named: root
    xfs: root
    gdm: root
    mailnull: root
    postgres: root
    squid: root
    rpcuser: root
    rpc: root
    ingres: root
    system: root
    toor: root
    manager: root
    dumper: root
    abuse: root
    newsadm: news
    newsadmin: news
    usenet: news
    ftpadm: ftp
    ftpadmin: ftp
    ftp-adm: ftp
    ftp-admin: ftp
    decode: root
    root: vbird
    上面的設定是隨系統而變的喔！
    不過，最後一行是將 root 的信都寄一份給 vbird 的意思！

    [root@tsai mail]# touch virtusertable
    [root@tsai mail]# makemap hash access.db < access
    [root@tsai mail]# makemap hash virtusertable.db < virtusertable
    [root@tsai mail]# newaliases

    [root@tsai mail]# /usr/sbin/sendmail -bd -q30m
    啟動 sendmail 囉！

    開始進行測試一下！
    [root@tsai mail]# telnet 127.0.0.1 25
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    220 tsai.adsldns.org ESMTP Sendmail 8.12.1/8.12.1; Thu, 13 Dec 2001 14:02:30 +0800
    ehlo localhost <==這裡輸入測試點！
    250-tsai.adsldns.org Hello localhost [127.0.0.1] (may be forged), pleased to meet you
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-EXPN
    250-VERB
    250-8BITMIME
    250-SIZE
    250-DSN
    250-ETRN
    250-AUTH LOGIN PLAIN <==有這一行就是成功啦！
    250-DELIVERBY
    250 HELP

    基本上這樣就設定完成了！不過要注意的是，還需要做一下測試！因為在我的系統中，雖然可以具有身份認證的功能，但是一開始卻是捉不到 /etc/sasldb 這個檔案！真是很奇怪！後來，我在 /usr/local/sbin 底下，執行了 ./saslpasswd 及 ./sasldblistusers 這樣就可以了！或者是我的系統太舊了吧！
  • 設定開機時載入：
    剩下一個重要的步驟了！就是在開機的時候載入 Sendmail 啦！直接修改 /etc/rc.d/rc.local 在最後一行加入：
      /usr/sbin/sendmail -bd -q30m
    就可以啦！OK！
  • 設定用戶端：
    就跟上面的設定相同，去試試看吧：
2002/ 01/01以來統計人數


以 up2date 使用實例
最近更新日期：2002/01/01
    前言：
    我們都曉得在 Windows 底下有個 update 的選項，在一些防毒軟體的附屬功能中，由於病毒隨時在變種，所以病毒碼也要常常線上更新（Live Update），那麼你曉不曉得 Red Hat Linux 也有線上更新的功能呢？呵呵！答案是有的，那就是 up2date 這個套件了！這個東西很好用的，你只要註冊好了之後，就可以使用 Red Hat 提供的線上更新資訊來更新你的 Red Hat 囉！不過，有一點必須要曉得，由於線上更新主要為更新 rpm 的版本，所以你可要千萬小心，『更新的套件為 rpm 的版本， tarball 的版本是無法藉由 up2date 來更新的』。此外，為了怕有些資訊在你的系統操作過程中遺失了，那麼就必須要先以 rpm --rebuilddb 建議資料庫囉。
  • 如何實作：
    其實實作的過程很簡單，只要：
    1. 下載並更新 up2date 與 rhn_register 套件；
    2. 確定可以登入 Internet ，可能的話，並找尋可支援的近端 proxy ；
    3. 執行 rhn_register 線上註冊；
    4. 執行 up2date 更新套件。
    這樣就可以囉。不過有一點必須說明一下，由於 up2date 推出的時間不長，所以舊版本的 Red Hat 本身並沒有 up2date 的功能（例如 Red Hat 6.1），所以你必須先安裝 up2date 套件。但是，由於 up2date 套件使用之前必須先登入 Red Hat 總公司，所以你必須先註冊才行。 Red Hat 就提供一個註冊程式，即為 rhn_register ！因此，整個流程就是先註冊，然後就可以線上更新囉。此外的此外，由於 rpm 套件只有 root 可以來變更系統，所以『以下的指令都必須以 root 的身份來安裝』
    • 下載並更新 up2date 與 rhn_register 套件：
      各版本（Red Hat 6.2 - Red Hat 7.2）詳細的 up2date 與 rhn_register 在 Red Hat 網頁 上，你可以直接去下載，如果是 Red Hat 6.1 怎辦？呵呵，你可以在這裡 下載 Red Hat 6.1 的 up2date 套件。另外，這裡也有 Red Hat 7.1 的套件。安裝的過程如下：

      Red Hat 6.1：

      1. 將 up2date_6.1.tar.gz 解壓縮，會產生 up2date_6.1 裡面有 i386 及 srpm 兩個目錄；
      2. 你可以直接將 i386 裡面的 *.i386.rpm 全部安裝，順序依序為：
        • python-popt...
        • openssl-0.95.......
        • python-1.5.2......
        • python-xmlrpc..
        • usermode-1.37...
        • pam-0.72...
        • pygnome-libglade
        • rhn_register...
        • gnupg...
        • up2date...
        注意喔，由於有些套件有屬性相依的疑問，所以必須依序安裝才可以。此外，若你之前已經安裝過該套件（使用『 rpm -q 套件名稱 』來查詢），則以『 rpm -Uvh 套件名稱』來升級，否則需要用『 rpm -ivh 套件名稱』來安裝。由於擔心有版本不合的疑問，所以我也將 SRPM 附上，你可以使用 rpm --rebuild 來重新編譯一次！
      Red Hat 7.1：
      1. 將 up2date_7.1.tar.gz 解壓縮；
      2. 將裡頭的四個 SRPM 檔案以 rpm --rebuild * 來重新編譯打包一次；
      3. 到 /usr/src/redhat/RPMS/i386 這個目錄底下，將剛剛編譯完成的六個檔案安裝起來：
        • python-popt
        • python-xmlrpc
        • rhn_register-2.7.2-7.x.8.i386.rpm
        • rhn_register-gnome-2.7.2-7.x.8.i386.rpm
        • up2date-2.7.11-7.x.1.i386.rpm
        • up2date-gnome-2.7.11-7.x.1.i386.rpm
        這樣就算安裝完畢了！
    • 註冊：
      註冊可以使用 http://rhn.redhat.com/network 這個網址的功能來註冊，或者直接以底下的方式來註冊：
      • 先重建一下你的 rpm 套件資料庫：
        rpm --rebuilddb
      • 執行 rhn_register：
        [root@tsai /root]# rhn_register
        This is the first time you have ran rhn_register.
        If you need special network configuration, such as a web proxy,
        please enter that info here.

        0. enableProxyAuth No
        1. httpProxy
        2. proxyUser
        3. proxyPassword

        Enter number of item to edit <return to exit, q to quit without saving>: 1 <==我有 proxy
        Attribute Name: httpProxy
        Comment: HTTP proxy in host:port format, e.g. squid.redhat.com:3128
        Current value:
        <return for default, enter two spaces and return to clear>
        New Value: proxy.ncku.edu.tw:3128
        This is the first time you have ran rhn_register.
        If you need special network configuration, such as a web proxy,
        please enter that info here.

        0. enableProxyAuth No
        1. httpProxy proxy.ncku.edu.tw:3128
        2. proxyUser
        3. proxyPassword

        Enter number of item to edit <return to exit, q to quit without saving>: <==按 enter 離開

        在上面中，由於我有 proxy ，所以選擇 1 ，如果你沒有的話，就選 0 吧！然後，再執行一次 ：
        rhn_register （請以 root 的身份喔）這次由於需要連線到 Red Hat 公司，所以時間很久，請稍待喔！
        這裡請輸入你的使用名稱，如果已經註冊過，那麼這裡就要填寫正確，如果從未註冊過，那麼這裡就請填寫你要的使用者名稱與密碼。並且，請將你的使用者名稱與密碼『記下來』，以後可以直接使用，而不需要底下的步驟囉！
        上面會列出你的軟硬體資訊，這個時候請注意看一下你的軟硬體設定是否正確！注意，如果到這一步結果發現有問題時，通常是找不到你的系統資訊，這時，請以 rpm --rebuilddb 來重建你的資料庫。
        這樣就註冊完畢了，開始使用 up2date 吧！
      • 啟動註冊碼：
        /usr/bin/gpg --import /usr/share/rhn/RPM-GPG-KEY
    • 開始使用 up2date 功能：
      其實，使用 man up2date 就可以知道很多的功能囉！不過，這裡列出幾個可能比較常用的：
      • up2date -l：列出可以安裝的套件；
      • up2date --showall：列出你的版本的 Red Hat 有沒有可以安裝的套件；
      • up2date -i package：其中package 指的是套件的名稱，你可以直接將這個套件捉下來並安裝喔；
      • up2date -u：全部的套件升級！等於是升級你的 Red Hat 系統的意思。
  • 使用感想：
    其實我一直覺得 up2date 是很方便沒錯，但是對於我們這些使用 ADSL 或者是對國外連線很慢的系統來說，使用 up2date 可能是一件很痛苦的事情！！Why？這是因為 up2date 的功能是將你的網路直接連到美國 Red Hat 總公司，這可是跨洋的線路呢，你要下載的速度有多快呢？我們又不是在美國使用這一個功能.....所以，除非是在網路並沒有很繁忙的時候，否則，我們還是乖乖的去找一些臺灣已經有人幫忙捉下來的檔案，還是比較快一些.....
2002/01/01以來統計人數


以 Openssh 取代 Telnet 的連線方式
最近更新日期：2002/01/18
前言
主機端設定(Red Hat 7.x 與 6.x)
用戶端的連線軟體
安全性的設定
前言：
    不知道您有沒有發現，最近的 Linux 套件中，都將 telnet 的功能自『預設啟動』的條件，改為需要由使用者開啟的狀態？也就是說， Red Hat 在 7.x 版本以後，如果您需要 telnet 的服務，那麼你就必須要自行啟動他，因為他已經被排除在『預設啟動』的服務項目之外了！為什麼呢？這是由於 telnet 本身在傳送資料或者是在進行任何工作的時候，都是以『明碼』的狀態來傳送指令，這樣一來，當有心人士以 listen 的功能監聽你的資料封包時，那麼你所傳送的資料將會被擷取而遭到竊取了！所以，基本上，那是非常不安全的一種傳輸資料方式！因此，在最近所釋出的 Linux 版本中，例如 Red Hat 7.x 版本，他們的 telnet 服務就已經不再是『預設啟動』的功能了！
    那如果我們要從遠端連線到主機的話，應該怎麼辦？既然使用 telnet 這種明碼的方式行不通的話，那麼我們要使用何種方式呢？呵呵，現在有更好的方式來提供喔！那就是使用 openssh 這個套件啦！這個 SSH 的服務，最重要的是可以使用『非明碼』的方式來傳送你所鍵入的資料封包，也就是說，你的資料在網路上，即使被監聽而遭竊取了，由於 SSH 是一種加密過後的封包，故而即使被竊取了，該資料要經過解密也不是三天兩頭的事情，所以呢，就可以比較安全的工作啦！此外， SSH 同時也提供配合 PAM 的安全模組，與 TCP Wrappers 的封包限制（也就是 /etc/hosts.allow 與 /etc/hosts.deny 的機制），因此呢，安全性也就比較高一些囉！此外，最便利的一點是，你可以使用 root 的身份經由 ssh 登入你的主機喔！
    好了！底下我們就來說一說，要如何將你的 telnet 改成以 ssh 來連接呢？由於 Red Hat 7.x 以後，預設的 ssh 是『開啟』的狀態，所以你幾乎不需要任何設定就可以使用 ssh 囉，那如果是 Red Hat 6.x 以前的系統呢？那也很簡單的，你只要安裝底下兩個套件（假如您安裝 Red Hat 6.x 是以完全安裝為主）就可以囉！
主機系統的 SSH 建置：
  • Red Hat 7.x 系統：
    由於 Red Hat 7.x 系統本身就已經開啟了 sshd 了，所以你可以直接以 ssh 來連上你的主機囉！不過，如果沒有正常開啟 SSH 的話，那樣要如何啟動呢？也是很簡單的，你可以這樣：
    1. 以 『/usr/sbin/setup』程式進入 setup 的話面中；
    2. 選擇 『System Services』這個項目；
    3. 然後向下移動到『 [*] sshd 』，將 [*] 勾選（按下空白鍵即可）；
    4. 然後以 tab 按鍵移動到『 OK 』按下 enter；
    這樣就設定完開機啟動了！然後以底下的方式來啟動 ssh 服務：
      /etc/rc.d/init.d/sshd start
    來啟動 sshd 這個服務，要知道有沒有正常的啟動 ssh 呢？呵呵，只要輸入底下的指令：
      netstat -a | more
    如果一切正常的話，你將會看到類似底下的這一行：
      tcp 0 0 *:ssh *:* LISTEN
    那就表示 ssh 已經成功的啟動了！不過，如果萬一你的 Linux 系統並沒有安裝 ssh 這個服務呢？呵呵！那就安裝他吧！其實，ssh 這支服務的主要程式稱為 openSSH 囉！然後，如果您想要重先安裝 openssh 來提供 ssh 的服務，那麼 Red Hat 的網站上隨時更新的 Errata 您就不能不去看看！你可以按底下的連結上去 Red Hat 下載屬於您系統的最新的 openssh 這個套件！
      小紅帽的 Errata 網頁
    然後按下您的 Red Hat 版本，進入後，去尋找 openssh 字眼的套件，那個就是啦！然後按下連結之後，直接找到屬於您的系統版本，例如我都是直接捉 i386 的 RPM 檔案，然後回來以 root 身份執行：
      rpm -ivh openssh*
    如果您只是要升級 openssh 的話，那就使用：
      rpm -Uvh openssh*
    更有甚者，直接以 up2date 來升級，（不過會比較慢一些喔！）
      up2date -i openssh
    升級成功之後，就可以直接的以上面的方式來啟動 ssh 這個服務了！
    VBird 的經驗
    在上一次更新 openSSH 套件的時候，那是因為網路上發表了舊的 openssh 可能有些安全方面的問題，所以 VBird 就去更新了，但是沒想到更新完成之後 SSH 竟然不會動！當真是嚇了一大跳！後來，找了一些檔案之後，才發現，原來預設的 PAM 模組的屬性搞錯了！你可以到 /etc/pam.d 這個目錄下去看一下，會發現 sshd 的屬性竟然是 600，與其他的檔案屬性都不同，後來執行了：
    chmod 644 sshd
    就 OK 囉！如果你也更新之後發現有這個問題，可以參考看看囉！
  • Red Hat 6.x 以前版本的 Linux 啟動 ssh 服務：
    好了，那麼要如何的在 Red Hat 6.x 以前的版本上執行 ssh 這個服務呢？其實也是很簡單的，如前所說的， ssh 其實是 openssh 套件的一種，而 openssh 有使用到 openssl 這個資料保密的套件，（其實還有其他的套件需要安裝，不過，由於我這裡預設條件是您已經用『完整安裝』來安裝您的 Linux 系統，所以其他的套件應該都已經安裝完整了才對！） VBird 不是很建議使用 RPM 來安裝 openssh ，因為在 Red Hat 6.x 以前的版本上面安裝 openssh 的 RPM 實在是太麻煩了！所以，我們就使用 tarball 的方式來安裝吧！
    下載 openssl 與 openssh：
    到哪裡下載呢？直接到他們的網站上去看看相關的訊息吧！到目前為止(2002/01/18)，openssh 最新版本為 3.0.2 (2001/12/3 釋出)，而 openssl 最新則是 0.9.6c (2001/12/21) 這個版本：
      openSSH 網站
      openSSL 網站
    或者您也可以在這裡下載 OpenSSH 與 OpenSSL 這兩個檔案。
    安裝：
    由於 openssh 會使用到 openssl 的資料，所以當然需要先安裝 openssl 之後，在安裝 openssh 囉：
    [root @tsai root]# cd /usr/local/src
    [root @tsai src]# tar -zxvf /root/openssh-3.0.2p1.tar.gz
    [root @tsai src]# tar -zxvf /root/openssl-0.9.6c.tar.gz
    [root @tsai src]# cd openssl-0.9.6c
    [root @tsai openssl-0.9.6c]# ./config --prefix=./usr/local/openssl
    將資料安裝在 /usr/local/openssl 這個目錄，這樣安裝的好處是，
    往後在移除該套件較為容易！直接移除該目錄就好了！
    ......
    [root @tsai openssl-0.9.6c]# make
    開始編譯囉！

    [root @tsai openssl-0.9.6c]# make test
    測試一下是否正常，應該不會有問題才是！

    [root @tsai openssl-0.9.6c]# make install
    安裝到 /usr/local/openssl 中囉！安裝好 openssl 之後，他的函式庫
    馬上就自動啟動了！然後開始安裝 openssh 吧！

    [root @tsai openssl-0.9.6c]# cd ../openssh-3.0.2p1
    [root @tsai openssh-3.0.2p1]# ./configure --prefix=/usr/local/openssh --with-pam --with-tcp-wrappers
    注意喔！上面是同一行喔！ --with-pam 在加入 PAM 模組的安全防護，
    而 --with-tcp-wrappers 則是加入 TCP Wrappers 的安全防護囉！
    ......

    [root @tsai openssh-3.0.2p1]# cd contrib/redhat
    [root @tsai redhat]# cp sshd.pam /etc/pam.d/sshd
    這個步驟在將 PAM 這個安全模組拷貝到 PAM 的預設路徑去，
    也就是 /etc/pam.d 這個目錄啦！另外，特別注意， sshd
    這個檔案的屬性必須為 644 ，而所有人是 root 才行，
    否則 ssh 不會動！！

    [root @tsai redhat]# cd ../..
    [root @tsai openssh-3.0.2p1]# make <==編譯
    [root @tsai openssh-3.0.2p1]# make install

    上面這樣就安裝完畢啦！

    啟動：
    再來就是需要啟動 SSH 這個套件了，你應該可以到 /usr/local/openssh 去，進入 /usr/local/openssh/sbin 去執行 sshd 這個檔案，也就是：
      /usr/local/openssh/sbin/sshd
    就完成啟動的程序囉！如果不相信的話，那就執行 netstat -a | more 看看有沒有 ssh 這個服務吧！
    既然啟動了 ssh 那麼 telnet 自然就不需要繼續存在囉！沒錯，因為 ssh 可以完全取代 telnet 的功能的！所以呢，請：
      vi /etc/inetd.conf
    找到底下這一行：
      telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
    在前面加上一個註解符號『#』就可以啦！然後退出之後，執行：
      /etc/rc.d/init.d/inet restart
    重新啟動 inet 這個服務，然後以 netstat -a | more 看一下，嘿嘿嘿嘿！ telnet 的服務就不見了！那我們就可以使用 ssh 來取代囉！
用戶端的 SSH 連線軟體
    Linux sysem:
    好了，現在我們知道主機可以使用 ssh 來進行連線的服務，但是怎樣在用戶端（ Client ）執行連線的軟體呢？哈哈！很簡單，如果你是以 Linux 系統來連線的話，那麼你應該可以在 /usr/bin 裡面找到一個 ssh 的軟體，（如果是使用 tarball 的話，那麼 ssh 就會在 /usr/local/openssh/bin 裡面囉！）你可以這樣來執行連線程式：
      ssh -l username host.name.domain
    假設我要以 vbird 這個帳號登入一個名為 testing.adsldns.org 的主機，那麼就以： ssh -l vbird testing.adsldns.org 來執行登入連線的程序！然後如果是第一次登入的話，你會發現到有一個訊息，告訴你要不要接受一個認證碼，直接選擇 yes 就可以連線囉！使用 ssh 最大的另一個好處，root 也可以登入喔！
    Windows system:
    那萬一你是使用 Windows 為 Client 呢？那也沒問題，你可以到 PuTTy 的網站上下載 putty 這支程式：
      http://www.chiark.greenend.org.uk/~sgtatham/putty/
    或者是在 這裡 下載。這支程式完全不需要安裝，直接以滑鼠雙擊他，就會自動的執行了！
安全性的設定
    好了！雖然 openssh 是比較安全沒錯，但是並不是一定安全的！所以，你仍然可以設定一些簡單的安全防護來防止一些問題的發生！其實，說穿了，就是將一些你不想要讓他登入的 IP 擋掉他就是了，然後只開放一些可以登入的 IP 就是了！
    防火牆：
    由於 ssh 這個服務是開啟在 port 22 ，所以你可以使用 ipchains 或 iptables 來開放一些你允許的 IP 以 port 22 進入！
    TCP Wrappers:
    如果不會設定 ipchains 或 iptables ，那也沒關係！剛剛我們在安裝的時候不是有選擇 --with-tcp-wrappers 嗎？呵呵，這個時候就派的上用場了！你可以到 /etc/hosts.allow 去設定你允許的 IP 連線到你的主機裡面，例如你允許 192.168.1.1-192.168.1.255 連線到你的主機，那麼你可以：
      sshd : 192.168.1.0/24: Allow
    而將其他的 IP 都擋掉在 /etc/hosts.deny 當中：
      sshd : ALL : Deny
    如此一來則 ssh 只會開放給 192.168.1.1-255 之間的電腦囉！以後要再開放的話，那就再將其他的 IP 加到 /etc/hosts.allow 當中去就好囉！
2002/01/01以來統計人數


一些 ADSL 頻寬分享的基礎文件彙整
最近更新日期：2002/04/16
話說從頭：
  • 關於 VBird
  • 舊的文件資料

ADSL 文件分享：

  • ADSL 寬頻簡介
  • 內部網路：區域網路的做成
  • 幾種主要的連線分享方式
    • 以 Hub 直接分享：僅適合計時制提供多個浮動式 IP
    • 以 Windows 2000 提供分享：主機一張網卡，適合計時制 ADSL
    • 以 Windows 2000 提供分享：主機兩張網卡，適合固定 IP
    • 以 Linux 提供分享：附加價值最高
    • 以 軟體模擬 提供分享：
  • 連線方式的建議
  • 誰需要架站
  • 一些 FAQ（整理中）
2002/ 04/16以來統計人數


ADSL 寬頻簡介
最近更新日期：2002/01/20
傳統撥接還是 ADSL 寬頻
ADSL 的兩三事
計時制還是固定制
傳統撥接還是 ADSL 寬頻？
目前台灣地區的網路連線方式中，除了學術網路可直接連上網際網路之外，一般的用戶或企業用戶則必須透過電話撥接，或者是近來流行的寬頻系統（或者說成是拉專線）進行連線。由於傳統的電話撥接系統之傳輸速率實在太慢了（最高到 56 Kbps ），所以才會有 ADSL 或者是 Cable Modem 等寬頻系統的產生。簡單的講，所謂的『寬頻』其實是利用較新的技術，以讓用戶在撥接時獲得比較高流量的資料傳輸。
那連上網際網路之好處為何？為何大家一窩蜂的想連上網際網路呢？由於網際網路上的豐富資訊，你可以想像不用出門便知天下事的情況，例如，研究生查詢paper資料再也不用直接跑到圖書館去，也可以使用關鍵字查詢的方法來尋找個人適合的資訊。因此，網際網路可以預見的，會越來越熱門，尤其是下一波傳統商業行為配合網際網路銷售行為的消費型態！更有甚者，如果你想要自己架設一些網站的話（例如WWW站、FTP站、mail-server站等等），那就一定要連上網際網路啦！
傳輸速率的問題：
這裡就產生了一個問題，你連上網路後，實際的資料傳輸行為或許你可以不理（就是一些IP協定等等的），但是實際有關的下載速度你可能就不會不 care 了吧！傳統的電話撥接網路，最高僅可至 56Kbps（這個 Kbps 是 Kbit/second ，當實際轉換成 KBytes 時，只有每秒 7KBytes 的傳輸量！）如果你要下載的資料超過 10MBytes 時（例如某些驅動程式，即使壓縮檔也會到10MB以上！），換算一下，你可能需要 25分鐘 以上的時間才能下載完畢！所以才會有越來越多的網路族群申請資料傳輸速度較快的 ADSL 或cable等寬頻傳輸的服務！
另外有一個最大的問題，目前在網路上所謂的傳輸速率均是使用 Kbps ，亦即是 Kbits / second，與我們一般在 PC 上頭檔案總管上看到的檔案大小（KBytes）是不一樣的，因為 8bits=1byte ，所以你所看到的網路傳輸速率都要在除上 8 這個因子。舉個例子，目前市面上看到的網路卡所標示的網路速率是 10/100Mbps，這個 bps 就是 bits/second ，因此，實際上的傳輸速率是 1.25/12.5 MBytes/second；而一些固網公司提出的計時制 ADSL 之傳輸速率可到 512/64 Kbps 也同樣要在除上 8 ，就變成了 64/8 KBytes/second 了！
傳統撥接還是 ADSL 撥接系統？
很多人都有疑問在這裡！『我是否需要 ADSL 這套設備？』基本上，如果你是常常上網的族群，而且你又很不喜歡等待，那最好申請一下寬頻系統吧，因為傳統撥接系統是一定無法滿足您的！但如果你只是偶爾才上一下網路的話（可能一個月不到 10 小時），那根本不需要 ADSL 系統，因為你用不著那樣的速度呀！而且 ADSL 系統就算你都不使用，每個月還是得負擔一定的費用！當然，如果你有錢的話就沒啥大不了的囉！
ADSL 的兩三事
下面是關於計時制 ADSL 的相關說明（資料來源在中華電信的網頁）：
ADSL的全名為"Asymmetric Digital Subscriber Line"，它是一種利用傳統電話線(亦稱為雙絞線)來提供高速網際網路上網服務的調變/解調變技術。在提供上網服務的同時，並可提供一般電話語音服務。ADSL的關鍵觀念在於其上行與下行的頻寬是不對稱的，事實上，從網路提供者到用戶家(俗稱下行)的頻寬是比較高的，這樣的設計符合了一般使用網際網路的使用習慣與特性，也就是使用者接收的資料量遠比其送出的資料量來得多。
而計時型ADSL則是利用PPP over Ethernet 通訊協定，在ADSL網路架構上認證用戶、記錄用戶的連線時間，並取得動態IP。對一般家庭及個人用戶提供更經濟價格的上網服務。
由上面的說明可以看出，ADSL 具有比較快的網際網路資料傳輸速率，而計時制的 ADSL 撥接系統是在用戶撥接上網時才予以配發 IP （可以想成是你的電腦在網路上的門牌），這個 IP 是隨機給的，亦即你每上次網可能都會使用不同的 IP ，這樣一來有個好處，由於用戶不太可能 24 小時均在線上，因而或許可以 100 個人使用 50 個 IP ，如此將可增加 ISP 的 IP 調度！但是這也造成一個問題，就是當你需要架站的時候，由於你的 IP 不固定，將導致別人無法連接上你的網路系統（當然，這可以經由動態 IP 之 DNS 系統來克服）。不過，如果你並不想要架站，只想上網打打 Game 或者瀏覽一下網頁，那，計時制的 ADSL 是比較適合您的！當然，架站比較好的選擇仍然是固定制的（不過，如果您跟 VBird 一樣是窮學生的話，申請計時制的 ADSL 仍然是可以架站的喔！）。
動態 IP 、固定 IP 、實體 IP 與虛擬 IP？
講了老半天，計時制與固定制不就是 IP 取得的方式不同嗎？那 IP 是啥？有啥 IP 需要注意的呢？以下簡單的說明一下。
  • 實體 IP：在網路的世界裡，為了要辨識每一部電腦的位置，因此有了電腦 IP 位址的定義。一個 IP 就好似一個門牌！例如，你要去微軟的網站的話，就要去『 207.46.197.101 』這個 IP 位置！這些可以直接在網際網路上溝通的 IP 就被稱為『實體 IP 』了。
  • 虛擬 IP：不過，眾所皆知的，IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態，其中， xxx 為 1-255 間的整數，由於近來電腦的成長速度太快，實體的 IP 已經有點不足了，好在早在規劃 IP 時就已經預留了三個網段的 IP 做為內部網域的虛擬 IP 之用。這三個預留的 IP 分別為：
        • A級：10.0.0.0 - 10.255.255.255
        B級：172.16.0.0 - 172.31.255.255
        C級：192.168.0.0 - 192.168.255.255
      上述中最常用的是192.168.0.0這一組。不過，由於是虛擬 IP ，所以當您使用這些地址的時候﹐當然是有所限制的，限制如下：
      • 私有位址的路由資訊不能對外散播
      • 使用私有位址作為來源或目的地址的封包﹐不能透過Internet來轉送
      • 關於私有位址的參考紀錄(如DNS)﹐只能限于內部網路使用
      由於虛擬 IP 的電腦並不能直接連上 Internet ，因此需要特別的功能才能上網。不過，這給我們架設IP網路做成很大的方便﹐比如﹕即使您目前的公司還沒有連上Internet﹐但不保證將來不會啊。如果使用公共IP的話﹐如果沒經過註冊﹐等到以後真正要連上網路的時候﹐就很可能和別人衝突了。也正如前面所分析的﹐到時候再重新規劃IP的話﹐將是件非常頭痛的問題。這時候﹐我們可以先利用私有位址來架設網路﹐等到真要連上intetnet的時候﹐我們可以使用IP轉換協定﹐如 NAT (Network Addresss Translation)等技術﹐配合新註冊的IP就可以了。
  • 固定 IP 與 動態 IP：基本上，這兩個東西是由於近來網路公司大量的成長下的產物，例如，你如果向中華電信申請一個商業型態的 ADSL 專線，那他會給你一個固定的實體 IP ，這個實體 IP 就被稱為『固定 IP 』了。而若你是申請計時制的 ADSL ，那由於你的 IP 可能是由數十人共同使用，因此你每次重新開機上網時，你這部電腦的 IP 都不會是固定的！於是就被稱為『動態 IP』或者是『浮動式IP』。基本上，這兩個都是『實體IP』，只是網路公司用來分配給用戶的方法不同而產生不同的名稱而已！
    • 計時制還是固定制？
    如果您已經確定要使用 ADSL 來作為連接 Internet 的系統，那下一個問題是：要使用較便宜的 計時制 還是較貴但是有固定 IP 的 固定制 呢？若以省錢為導向，那不用說，一定是申請計時制的 ADSL 系統，因為確實有比較便宜；若以目標為導向，如果你需要穩定的架站環境，自然選擇固定制的會比較好；那若以網路頻寬分享為導向呢？例如你在宿舍大約有 5 個人要使用一條專線，或者是家中有少於 5 部電腦使用一條電話線連線至 Internet ，那最好是選擇計時制的 ADSL ，因為計時制的 ADSL 在中華電信可同時開放兩個 IP 而 Seednet 更可開放到 5 個 IP 讓同一個帳號上網使用，如此，則連線分享僅需要一棵不用 1000 元的集線器 (Hub) 就可以囉！如使用固定制的話，由於只有一個固定的 IP ，則你要使用連線分享頻寬，就必須要比較瞭解連線的方式，或者加裝 IP 分享器，或者自己架個具有 NAT 功能的小站了！
    如果你肯定要使用計時制 的 ADSL ，又想要使用頻寬分享，以下是需要注意的幾個地方：
      • 少於 5 部電腦要連線：如果只有少於 5 部電腦要使用這條 ADSL 線，那直接申請 Seednet 或 Hinet （中華電信僅提供兩個 IP 喔），再加裝一個 Hub 作為 ATU-R 及 PCs 的連接中介就可以分享了；
      • 多於 5 部電腦要連線：多於 5 部電腦想要同時連線的話，大概只有兩個方法：
        • 加裝一個 IP 分享器以及多孔的 Hub ：利用 IP 分享器來分享同一個 IP 的網路系統，不過，通常 IP 分享器不是很便宜！
        • 自己架一個 Server：這是比較合適的分享方法，而架 Server 的方式有很多種，簡單可分為兩種：（1）直接以使用中的電腦加裝一塊網路卡（亦即這部電腦中有兩塊網路卡）來作為 Server ，不過這個功能目前僅能在 Windows 2000 這個系統中使用（好像 windows me 也可以，但鳥哥沒試過）；（2）以淘汰掉的舊電腦來架個 Linux 站，並開啟 NAT 功能，即可達到頻寬分享的目的：這是目前鳥哥家中使用的頻寬分享方法，不但電腦一開機立即上線（不用再撥接），而且也沒有同時一堆人連線就有點延遲的現象！
    2002/ 01/21以來統計人數


內部區域網路的架構
最近更新日期：2002/01/20
網路的第一課：網路上的芳鄰
如何連線
要安裝哪些通訊協定
確定 Windows 網路參數
會不會中毒！當然會！
網路的第一課：網路上的芳鄰
我想，很多朋友都是住在宿舍，同學之間都各自擁有電腦，即使在家裡，可能也由於兄弟姊妹們眾多，而使得家裡有兩部以上的電腦。在早期，由於網路尚未發達，那個時候如果要從一部電腦上將資料拷貝到另一部電腦上，是一件相當困擾的事情，例如，你再你的 PC1 上面畫了一張 BMP 的圖形檔，一個檔案可大到 5MB 好了，那麼你要如何將這個檔案拷貝到另一部電腦呢？最簡單的方是就是以壓縮軟體將檔案切割成數個小檔案，然後再以軟碟一個一個的轉到另一部電腦上，然後再解壓縮將各個小檔案結合成原來的圖形檔！不過，要知道，這樣的方式可是很慢的！
現在可有很好的方式來互相分享檔案了，以 Windows 為例，如果你裝有『網路卡』的話，那麼你的桌面上一定會有『網路上的芳鄰』這一個東西，您只要設定好網路的一些參數，那麼直接以滑鼠點兩下『網芳』，然後選擇您想要連線的電腦，呵呵，直接就可以連結到另一部電腦上了（當然囉，另一部電腦也需要設定資源分享才行！）。其實，『網路上的芳鄰』這個東西基本上就是 NetBIOS 的通訊協定而已，如果您對於 NetBIOS 並不知情，那麼把他想成是『網芳』就好了，當然，您也可以看一下 學習網路 裡面的資料囉。
基本上，把兩部以上的電腦連接起來，就可以說是一個小型的『區域網路』(Intranet)了！好了，底下我們就來說一說，要如何達到這樣的一種區域網路的設定呢？而首先，我們先讓 Windows 可以連接起來吧！然後只要將一個缺口連上 Linux Server ，就可以進行各種型式的架站啦！所以，這可是網路基礎的第一課喔！
如何連線
基本上，VBird 特別建議將『對內』與『對外』的連線分開來，亦即在 Linux 主機上面以兩塊網路卡來分隔對內與對外的連線，這樣有個最大的好處，就是您的資料封包比較不容易碰撞而損壞！所以，個人推薦區域網路連線方式為使用以下這一種方式：
  • 各網域內的電腦之間是以 Hub 或 switch 作為連線的介面；
  • Hub 跟 Linux 主機之間以平行線（正常的一般網路線）連接；
  • Linux 主機（或者是其他的主機，例如 IP 分享器，或者是 Windows 2000）開啟 NAT 的功能，將兩塊網路卡進行 IP 偽裝的工作，使得內部的網路卡資料可以透過外部的網路卡資料傳送上 Internet ；
  • 最後，透過固定IP的學術網路，或者是自家的 ADSL 數據機來連上 Internet （註：目前較新的 ADSL Modem 與 Linux 的網路卡相連接的時候，需要使用『跳線』）。
    • 所以，基本上主機是需要兩塊網路卡的，而且一塊是與內部網路連線的，這個內部網路通常是使用虛擬 IP 來進行連線溝通的！我們比較常使用的虛擬 IP 是在 192.168.0.0 到 192.168.255.255 這一段，以我為例，個人是比較喜歡 192.168.1.0∼192.168.1.255 這一段的網路，沒有任何原因，單純是因為喜歡！呵呵！
  • 內部網路『區域網路』：
    在上面的圖示中，應該可以很容易的發現，內部網路其實就是指：個人電腦一、個人電腦二、個人電腦三、Linux 主機的一塊網路卡以上這四個介面（其實就是四張網路卡啦！）。基本上，我們希望內部網路可以很輕鬆的進行各種網路溝通，所以以上這四張網路卡的 IP 我們希望他可以在同一個網段之內，例如：我們可以設定 Linux 主機用來連接內部網路的 IP 為 192.168.1.2 ，而其他三張網路卡則分別設定為 192.168.1.11 ∼ 192.168.1.13 就可以了，然後子遮罩網路都是 255.255.255.0 ，則四張網路卡都屬於同一網段，網路卡之間就可以直接連線而不用透過 Getway 了！如果對於是否為同一網段不是很熟悉，建議先看一下 網路基礎 吧！
    容易發生錯誤的地方
    區域網路包括了 Linux 主機上面的一塊對內的網路卡，因為這些卡都在同一個網段上，所以使用廣播的方式就可以傳輸資料，而不需要透過通訊閘亦即 gate way 來聯繫！如果以上面的圖示為例，那麼 192.168.1.11 連到 192.168.1.13 可以直接使用網路上的芳鄰『直接』連線。不過，如果需要連到外部 Internet 上面，那麼就需要設定 gate way 了！另外， Gate way 通常就是區域網路中的一塊網路卡界面，以上面的圖示為例，區域網路的 Gate way 自然就是 Linux 的對內網路卡囉，那你的區域網路內的電腦如何連上 Internet 呢？以上圖為例：192.168.1.11 的電腦與 192.168.1.2 為同一網域內，所以資料可以直接傳輸，而網卡 192.168.1.2 可以透過 NAT 連上對外的網卡而連上 Internet ！然後你就可以上網啦！這裡需要特別注意了， Gateway 的設定常常是大家容易錯誤的地方。
    另外，以 Windows 為例，他預設的 Gateway （對內網路卡界面的 IP ）為 192.168.0.1 這一個，所以你的區域網路內的所有電腦 IP 需要設定在 192.168.0.2-192.168.0.255 之間喔！並且 Netmask 為 255.255.255.0 囉！

    關於 Hub ：上面還要注意到，如果你只是一般的家庭的話，則 Hub 可以選擇很便宜的五孔的那一種（一個大概只要 500-600 元），但是如果你是一個宿網，而且你們同學之間常常有大流量的文件傳輸（例如由個人電腦一傳到個人電腦二），為了增加傳輸的效率，個人是建議使用可以自動分辨 10/100Mbps 的集線器或者是 switch 來使用，因為他的傳輸速率是一般 10Mbps 的10倍！當然，如果有錢的話，那麼買 Swith 更好！你可以看看底下的文章，看看 Switch 與 Hub 有什麼不同：

    Hub 與 Switch 的分別
    • 關於網路卡：目前的網路卡都太便宜了，一張 10/100 Mbps 的卡只要 200-300 就買的到了！基本上，買螃蟹卡就很夠用了！不過，如果你要在 Linux 安裝兩塊網路卡的話，那麼建議買兩種不同晶片的網路卡會比較好喔！基本上，這裡教大家的是 ADSL 系統，所以囉，隨便一張網路卡就都可以啦！不用太擔心喔！
    關於網路線：這個是特別需要注意的地方，由於目前最常使用的網路線接頭為 RJ45 的網路線，而這種網路線又因為接頭部分有沒有經過跳線處理而分為兩種線材，一種是平行線（就是沒有經過跳線處理的），一種就稱為跳線。上面的圖形中，連接到 Hub 的網路線都是正常的網路線，亦即是 平行線 ，而由 Linux 主機接到 ADSL 數據機的線段則是使用跳線！由於線材使用錯誤將造成無法連線，所以這裡請特別注意喔！
    要安裝哪些通訊協定
    由於我們主要是使用 Linux 主機來連線上 Windows 系統的個人電腦，所以在你的 Windows 系統中，網路就需要有以下的設定才能讓每台電腦看到對方！
    • NetBEUI
      讓我們回到IBM最初進軍個人電腦網路的時代﹐他們當時的確需要一個很基本的網路通訊協定﹐但他們並不打算用此來建構大型網路﹐僅僅供數十台電腦甚至更小的網路而已。基于這個訴求﹐就誕生了Network Basic Input/Output System﹐或稱NetBIOS。
      NetBIOS其實只有18個命令(command)來讓網路的電腦能夠建立?維持?和使用連接服務。不過IBM在不久後又再推出了NetBIOS的延伸版本﹕NetBIOS Extened User Interface﹐或稱NetBEUI﹐基本上是NetBIOS的改良版本而已。然而﹐NetBIOS和NetBEUI終究是不同的﹕NetBEUI事實上可以說是一個傳輸協定﹐而NetBIOS充其量只是一組命令來讓系統可以使用網路而已﹐在技術角度來看﹐它是一個Application Program Interface (API)。
      NetBEUI可以算是您能夠用到的最快通訊協定了。這個“最快”是指它可以將格式化資料放進封包裡面﹐而接收節點又可以迅速的解讀到內容。然而﹐NetBEUI卻有一個最致命的弱點﹕它不是可路由(routable)協定﹐也就是不能夠和其它網路的機器對講。NetBEUI在本地網路裡面是非常優秀的協定﹐但如果您想和設在其它網路的機器溝通﹐NetBEUI就不是您所需要的了。如果您想實現和其它網路的電腦溝通﹐您極有可能必需通過路由設備或路由軟體來實現﹐但無論用哪一樣﹐很遺憾﹐NetBEUI都做不到。
      不過﹐Microsoft 網路則運用一種叫 NetBIOS over IP 的技術﹐來連接不同網路的 NetBEUI 客戶。但歸根結底﹐用來達成路由的不是 NetBIOS 而是 TCP/IP。
    • TCP/IP
      美國國防部開發的 Transmission Control Protocol / Internet Protocol (TCP/IP)﹐當初是用來配合ARPANET (Advanced Research Projects Agency Net)來處理不同硬體之間的連接問題的﹐比如Sun系統和Mainframe?Mainframe和個人電腦之間的連接。
      Internet Protocol (IP)工作於網路層(以後會繼續和大家探討 OSI 的網路層級)﹐它提供了一套標準讓不同的網路有規則可循﹐當然﹐前提是您想使用IP從一個網路將封包路由到另一個網路。IP在設計上是用來在LAN和LAN及PC和PC之間進行傳輸的。
      您可以把IP看成是游戲規則﹐而TCP則用來詮釋這些規則的。雖然TCP/IP原先是專門為幾所大學和機構的使用而設計的﹐但現在TCP/IP已經成為最流行的通訊協定了﹐我們使用的Internet就是用TCP/IP來傳送封包的了。下面就讓我們看看TCP/IP是怎樣工作的﹕
      假如您的公司在好些地方都有分公司﹐各自都有著自己的本地網路(LAN)﹐在總公司跑的是Novell網路﹐但分公司大部份都是用麥金塔電腦。當Mac有數據要傳送給PC的時候將會如何呢﹖
      首先﹐TCP會在這兩個平臺建立起一個可以提供全雙工檢錯(對雙向的數據都進行錯誤檢測)的連接。
      接著﹐IP制定好溝通規則以及Mac和PC之間的連接port。到這裡為止﹐TCP已經準備好數據了﹐如果數據太大﹐IP就將之分拆成幾份較小的封包﹐並且在封包上面加上一個新的header(轉送地址)﹐確保封包會被正確傳送。TCP還會加上標籤說明數據的種類及其長度。
      再下來﹐IP將封包轉換成標準的編碼格式並將之傳送給PC。
      最後﹐在PC上面的TCP將封包解碼並翻譯成PC能夠懂的格式﹐也就是它自己所使用的網路協定。TCP/IP可以說是現行協定中用途最廣的協定之一﹐由于它嘗試在所有硬體上實現所有事情。不過﹐它也是最慢的傳輸協定之一﹐在某些情形之下﹐它的速度只有NetBEUI的七成。
      沒錯！不要懷疑！只要這兩個通訊協定就夠了！通訊協定越多反而越容易造成網路的延遲現象呢！在安裝完成了上面的通訊協定之後，相信你的區域網路之中，所有的 Windows 個人電腦已經可以看到對方了，只要在開啟資源分享項目，即可達到區域網路的目的。此外，到底要不要安裝 NetBIOS （或者是 NetBEUI）呢，建議您可以看一下底下這一篇：
        TCP/IP 的迷思
      如果你的區域網路中並沒有其他的伺服器，那麼真的只要有這兩個通訊協定就夠了喔！千萬注意了！否則 Windows 98 與 Windows 2000 的互相連線速度會很慢喔！
      Windows 2000 與 Windows 98 『網芳』連線的速度很慢？
      這個問題很有可能是來自於網路的通訊協定的問題，先前 VBird 也發生了錯誤的認知，認為通訊協定設定越多就會支援越多的網路服務，後來才知道，原來服務越多反而可能造成網路的停頓現象！在 VBird 的研究室中，就發生了 Windows 98 與 Windows 2000 的『網芳』連線速度非常之慢，甚至會有無法連線的問題。後來修改了網路的通訊協定之後，就已經得到了改善。
      解決方法：Windows98
      在 Windows98 中，將滑鼠移動『網芳』上，按右鍵，選內容，進入網路設定項目；
      你應該會看到一些有的沒的網路設定，而通訊協定中，請將所有的通訊協定拿掉，只剩下兩個：
      • NetBEUI
      • TCP/IP
      • 重新開機。
      解決方法：Windows2000
      進入網路設定中，同樣的，將通訊協定刪除到只剩下兩個即可！
    確定 Windows 網路參數
    • 連上 Internet 的方式：由於目前最常用來連線的方式，主要分為：固定IP（例如學術網路，或者是固定制IP的專線），浮動式IP（例如目前最流行的 ADSL 計時制）兩種，這兩種網路的設定方式雖是大同小異，但是仍有部分不同的，所以你要先確定你的連線上 Internet 的方式為何！不過，無論如何，在您的電腦上都需要底下的各項參數：
      • 你的電腦 IP 及；
      • 子遮罩網路 IP 與；
      • Getway 的 IP 還有；
      • DNS 的 IP 一組。
      另外，大家最常搞錯的就是 DNS 這個東西啦，請記住『 DNS 這個 IP 位址並不是你的主機的 IP ，而是你的 ISP 提供給你的 DNS 主機位址』舉例來說，南部的 Seednet 的 DNS 為 139.175.10.20，這個就是 DNS 啦！
    • 設定 Linux 主機成為 NAT 主機：由於內部網路是由虛擬 IP 所構成的，虛擬 IP 並不能與外界的 Internet 溝通，所以你如果要連上 Internet 的話，就必須透過具有實體 IP 的 Linux 主機來連線了！因此，你的 Linux 主機必須有兩張網路卡：
      1. 一張以實體IP（不論是固定的或者是浮動的）與 Internet 連線，
      2. 一張則以虛擬IP與你的內部網路連線。
      3. 然後將這兩塊在 Linux 主機內的網路卡經由 Linux 內部的 NAT 設定來達成使 虛擬 IP 連上 Internet 的功能。
    • Linux 主機上的設定：如上面所說的，Linux 主機上面有兩塊網路卡，如何設定呢？
      1. 與外界溝通的網路卡：這一張網路卡的設定中，如果是固定 IP 的話，則直接輸入 IP 及子遮罩網路，就可以直接連上 Internet 了；而如果是使用撥接（或者是 ADSL 計時制），則必須使用 rp-pppoe 之類的軟體來連上網路！
      2. 與內部網路溝通的網路卡：這一張卡的 IP 必須與你的內部網路的所有的電腦之 IP 都在同一網段內，例如 192.168.1.0-192.168.1.255 之內，另外，這一張網路卡的 IP 將是你內部網路的所有電腦的『通訊閘』。
    • Windows 個人電腦上的設定：在個人電腦方面，由於我們已經設定了 NAT 主機，這一個主機有一個固定的虛擬 IP 、子遮罩網路，因此，Windows 系統則直接輸入：
      1. 確定網路卡沒有問題；
      2. 在網路的設定項目中，設定通訊協定『TCP/IP』與『BetBEUI』；
      3. 在 TCP/IP 的項目中輸入：
        • 一個固定的虛擬 IP
        • 子遮罩網路
        • 而通訊閘則設定為 NAT 主機的 IP
        • DNS 的設定為 ISP 所提供的 DNS 主機，而不是你的 NAT 主機！
      基本上，網路的狀態可以有點像下圖：
      TCP/IP 的狀態則有點像下圖：
      透過上面的連線、在 Windows 上面增加通訊協定，並將你的 Linux 主機設定成為 NAT 主機，則你的區域網路就可以成功的架設起來，並且可以透過 NAT 的技術來達成每部電腦都可以連上 Internet 的功能喔！（相關的設定你可以來這裡看看喔）
    會不會中毒？當然會！
    基本上，只要您設定好了 Windows 系統之後，設定了：
    • 區域網路中，其 IP 與 Netmask 為同一網段；
    • 在網路的設定中，區域網路的每一部電腦具有『相同的工作群組』與『不同的電腦名稱』；
    • 在網路的設定中，已經開啟了『Files and Printer Sharing for MicroSoft 』這個項目，亦即『別人也可以使用我的電腦、印表機』之類的設定必需要開啟；
    • 欲被分享的電腦已經開啟了『資源分享』或者是 NT 系列所謂的『共用』了（可直接在檔案總管按右鍵來選擇）。
    如果上面的手續都達到了，那麼您的電腦就可以達到資源分享的目的囉！不過，由於去年九月份以來（2001/09）有一支嚴重的病毒『Nimda』病毒大肆的搞破壞！這支病毒恐怖的地方在於他可以使用 NetBIOS 這一個通訊協定來感染，說的簡單一點，就是『Nimda 病毒可以由網路上的芳鄰的傳輸方式來感染！』在剛發病的時候，幾乎同一個網域的只要有開啟資源分享的電腦都中毒了！很是恐怖的！所以囉，這裡要建議大家的是：
    • 如果需要資源分享，那麼才開啟資源分享；
    • 並且在分享完畢之後，趕快將您開啟的分享關閉！
    • 可以的話，嚴格的控制您區域內的電腦流量！
    尤其像我們研究室，由於系上所有的電腦都是在同一個網域中，即使您的研究室控制得很好，您也不敢肯定別的研究室可以很完備的抵擋病毒的入侵，所以，請盡量做好防護的工作，包括安裝防毒軟體、盡量減少資源分享的機會等等！
    2002/ 01/21以來統計人數


數種 ADSL 連線方式介紹
最近更新日期：2002/01/23
前言
不需要主機：僅需以 Hub 連接，僅適合 ADSL 計時制
需要主機： Windows 2000 主機 + 一張網卡 + 計時制
需要主機： Windows 2000 主機 + 兩張網卡 + 固定制 IP
需要主機： Linux 主機 + 兩張網卡 + 計時制(or 固定制)
那麼 IP 分享器跟連線模擬主機軟體呢？
前言
就如同前面所說的， ADSL 相對於傳統的撥接而言，他算是非常快速的一種網路連接方式了！並且，最大的優點是：『由於 ADSL 的網路連接頻率與電話頻率在不同的階段，因此上網的時候可以同時接聽電話！』。不過，由於目前家家戶戶的電腦量都非常的驚人！例如，家裡有三個小孩的人家，那麼很可能就有三部電腦在這戶家庭內（不然怎麼分配時間來玩電腦？！），另外，宿舍裡面的電腦量就更恐怖了，因為每個人都不希望自己的電腦被別人東摸摸西敲敲的吧！因此很可能是人手一機的情況。所以囉，如果同一個家庭或宿舍同時有好幾部電腦的話，是不是就需要相當數量的電話線來提供 ADSL 的連線呢？！其實不需要的，這裡提供了主要的連接方法，讓你的一條 ADSL 電話線，可以透過幾種不同的方法來達到頻寬分享的目的喔！
基本上，頻寬分享的連線方式與你的 ISP 提供的 ADSL 服務有關的！舉個例子來說： Seednet 同時提供五個可以使用的 IP ，但是這五個實體 IP 卻都是『浮動式』的情況，因此你每次上網的 IP 都會不相同（因為 IP 是在你撥接的時候， ISP 的電腦分配給你的！）。至於 Giga 則是號稱提供一個『固定 IP』，雖然他是撥接上網的，不過由於他使用了記憶某些資料的功能，（有點類似 DHCP 的記憶網址功能）因此你每次撥接上網的 IP 都是固定的，但是相對的，他僅提供一組 IP 給你囉。那麼說來的話：
  • 使用 Seednet 計時制 ADSL 的用戶，只要買 Hub 或者是 Switch ，並且在每部電腦上面都安裝連線程式，就可以直接上網了（不需要再有其他的怪異設定），當然了，電腦數量需要在五部以內；
  • 使用 Giga 的用戶就必須架設主機，或者購買 IP 分享器之後，才能分享頻寬，因為他一個電話僅能提供一組 IP 而已.....
這樣說不知道您了了嗎？好，沒關係，底下繼續來說說各種不同的分享頻寬的接法與適用的 ADSL 狀態！

不需要主機：僅需以 Hub 連接，僅適合 ADSL 計時制
  • 適用情況：僅適合提供多個浮動式 IP 的撥接制 ADSL
    請特別注意：這種方法的頻寬分享『僅適用於提供多個浮動式 IP 的 ADSL 計時制』，最顯目的例子就是 Seednet 與 Hinet 這兩家，當然，好像亞太線上也提供兩個浮動式 IP 的樣子，不過 VBird 對於各大 ISP 的服務並不熟悉，所以，欲知每個 ISP 在計時制 ADSL 提供的服務型態，請參考各大 ISP 的網頁囉。另外，每個 ISP 提供的連線數量也不盡相同！例如 Seednet 提供了『 五個 浮動 IP 』，而 Hinet 則提供『兩個浮動 IP 』。如果您選擇以 Hub 來分享的，那麼請特別留意您的電腦數量，因為如果選擇 Hinet 並且使用 Hub 這個方式，那麼你只能有兩部電腦上網了，第三部以後就無法上網囉！另外， Giga 之類的提供一個 IP 的服務者，這個方法並不適用。
  • 硬體連接方式：
    這種連線方式為一般家庭中最常見的模式，每部電腦均需要一張網路卡，而且均需要安裝連線軟體；而連接各電腦與 ATU-R 的配備，僅只要一個 Hub 就能搞定！是一種比較經濟的連線方式。需要的硬體除了電腦之外：
    1. 每部電腦需要一塊網路卡；
    2. 需要一個 Hub 或者是 Switch ；
    3. 如果有 n 部電腦，那麼需要 n+1 條網路線（其中一條可能為跳線！）
需要主機： Windows 2000 主機 + 一張網卡 + 計時制
  • 適用情況：適合任何一種以撥接上 Internet 的 ADSL
    以下的方法均需要一部主機來進行分享的介面站！在計時制的情況下，你在 Windows 2000 的系統中撥接時，會產生一個 ppp 的介面（不同的撥接程式所產生的介面名稱可能會有些許的差異），這個時候在 Windows 2000 這個系統中會有兩個網路卡介面喔！然後你可以使用 Windows 2000 提供的『網路共用』機制來分享你的頻寬咯！可以適用在每一種計時制的 ADSL 當中，例如 Seednet 、 Hinet 、 giga 等等都可以適用。不過，最大的問題是：『當 Windows 2000 那部主機掛掉的時候，所有的電腦都無法連上 Internet 喔！而且，只要有人要上網，你的 Windows 2000 必須一定要開機才行！』，而且，由於 Windows 提供的分享有點小問題，所以有些網站無法上線，這個時候，你還必須在其他電腦（非 Windows 2000 這個主機）上面修改 MTU 喔！另外， Client 端只要開機就已經上網了！
  • 硬體連接方式：
    基本上， Windows 2000 分享的時候，你的區域網路網域必須為 192.168.0.0/24 這一個，硬體要求為：
    1. 每部電腦需要一塊網路卡；
    2. 需要一個 Hub 或者是 Switch ；
    3. 如果有 n 部電腦，那麼需要 n+1 條網路線（其中一條可能為跳線！）
需要主機： Windows 2000 主機 + 兩張網卡 + 固定制 IP
  • 適用情況：具有固定的 IP 時（如固定制 ADSL 或者是學術網路之類的，不需要撥接的情況！）
    就如同 VBird 在最前面說到的，我最喜歡將網路『對內』與『對外』分的清清楚楚的，因此，以下的兩個方法是在你架設主機的時候，我比較建議的方法！如果你是一個企業的內部網路網管人員，這種連接方式會是比較不錯的，因為所有的電腦均需要透過你這部 Win2000 的電腦之後，才可以與外界連線！所以你可以很容易的掌控住你企業內部的資料流向！當然，這種連線方式也是有點問題的，就是，你的 Win2000 主機『一定不能掛點』，因為主機掛點，所有的電腦都將無法與外界連線嚕！！另外，由主機到 ATU-R 的連線是以『跳線』來連接的！當然囉，如果你將 Win2000 主機以 『IP分享器』（或其他的硬體設備）來取代，也是可以的！！
    特別適合於固定制的 ADSL ，當然也適合計時制的，需要 Hub ，主機需要兩塊網路卡，及一條跳線。Client 端只要開機就已經上網了！
  • 硬體連接方式：
    基本上，主機一定需要兩塊網路卡才好哩！當然了， Windows 2000 內定的虛擬網路是 192.168.0.0/24 。
    1. 用戶端( Client )電腦需要一塊網路卡；
    2. Windows 2000 主機需要兩塊（強烈建議）網路卡；
    3. 需要一個 Hub 或 Switch；
    4. 同樣的，需要 n+1 條網路線，其中， Windows 2000 對外的網路卡與 ATU-R 連接的網路線為『跳線』
需要主機： Linux 主機 + 兩張網卡 + 計時制 （固定制也相當棒！）
  • 適用條件：
    這個方法是『任何 ADSL 的形式都適用，也適合任何形式的 Internet 連線分享！』這是 VBird 最喜歡的方式了！為何呢？說給你聽：相信有很多人都有一些廢棄的電腦在手邊，這是因為電腦硬體升級的太快，所以會有一些較慢的電腦就被淘汰了（因為這些慢速電腦根本沒有辦法玩 3D 的遊戲），但是這些電腦在處理網路的傳輸速度方面實在已經足夠了，所以我們可以利用 Linux 這套不耗硬體資源的作業系統來架一個 NAT 主機。那麼這個方式與 Windows 2000 有何不同呢（就是上面那一個）？呵呵，最大的不同就在於 Linux 的超強穩定性（幾乎可以說他完全不會莫名的當機）與強大的網路功能。如果你常常上 VBird 的網站的話，那麼你會常常聽到『我們架站都是使用被你淘汰的舊電腦』，目前 VBird 的主機是 P-166 ，RAM 是 64 MB，硬碟稍微大一點，有 3.6 GB，另外，提供的服務除了頻寬分享之外，也提供『Web, Mail, Proxy, Samba, FTP』等等的服務！我們的大哥 netman 使用的主機還只是 P-90 的哩！嘿嘿嘿！如果以這樣的狀況來移植到 Windows 2000 裡面，你認為 P-166 可以跑得動嗎？Client 端只要開機就已經上網了！
    不過，這個方法有一個最大的『不適』那就是 Linux 的操作介面需要比較有恆心的人來學習囉！
  • 硬體連接方法：
    基本上，連線的特色與上面那一個相同，不過由於 Linux 超穩定的網路環境，將可以讓你沒有時時可能當機的困擾！
    1. 用戶端( Client )電腦需要一塊網路卡；
    2. Linux 主機需要兩塊（強烈建議）網路卡；
    3. 需要一個 Hub 或 Switch；
    4. 同樣的，需要 n+1 條網路線，其中， Windows 2000 對外的網路卡與 ATU-R 連接的網路線為『跳線』
那麼 IP 分享器跟連線模擬主機軟體呢
除了這些頻寬分享的方式之外，常常還會聽到『 IP 分享器』以及『連線模擬軟體』等等，在 IP 分享器方面，基本上 IP 分享器就可以想成是一個簡單的 Linux 主機啦！所以連接的方法與 Linux 幾乎一模一樣！只是由於 IP 分享器的形式很多，你比需好好的仔細的選擇呦！最需要注意的就是你的 IP 分享器最好已經『內建 Hub 的功能』，也就是你不必要在去買一個 Hub （多累人呀！）。不過，這個 IP 分享器沒有 Linux 可以作為 mail server 的功能，但是，最大的優勢是『安裝方便！』是懶人一族的最愛吧我想！ ^_^
那麼還有模擬軟體呢？這是 VBird 最不感興趣的一種分享方式了，因為缺點很多，例如：
  • 需要額外去修改 MTU 值；
  • 做為主機的常常是 Windows 98 這個宇宙超級無敵當機王，讓你的網路動不動就當機；
  • 作為模擬的主機的網路傳輸分享速度非常的慢；
  • 總之，我就是不喜歡！
不過，他最大的優勢就是『很便宜！不需要額外的裝置』！好啦！以下就來說說每一種分享的方式的方法吧！

2002/ 01/24以來統計人數


直接以 Hub 分享 ADSL 的頻寬
最近更新日期：2002/01/24
目的與適用性
準備工作
申請 ADSL計時制
在 Windows 作業系統下架設網路卡
硬體之間的線路連接
移除或增加通訊協定
內部網路：啟動網路上的資源分享
外部網路：連線上 Internet
觀察 IP 的情況！
目的與適用性
    目的：
    基本上，就如同前面我們一直強調的，只要有兩部以上的電腦即可做成區域網路！而由於計時制的 ADSL 系統中，通常可以開放 2∼5 個 IP 給同一個帳號使用，因此，我們僅需要：
    • 使用 Hub 完成連線；
    • 每一部電腦獨立安裝撥接程式，每一部電腦可以獨立上網，不受主機的限制。
    如此即可完成頻寬分享的目的，當然，頻寬分享最大的享受就是可以僅使用一條電話線，即可隨意上網與線上玩連線遊戲。當然囉，這個方法有個先天上的限制：『這個方法並不適合僅提供一個 IP 的撥接制 ADSL ，例如 Giga 就不適合本方法！』

    適用性：

    • 適合 ADSL 計時制（中華電信僅支援兩部、Seednet支援 5 部電腦連線）；
    • 本方法所適用的情況是每部電腦『都可以獨立直接撥接上網』的情況！
    所需要的軟硬體配備：
    • 個人電腦（PC）；
    • 網路卡（每部電腦均要一塊）；
    • 正常的 RJ-45 網路線，亦即是平行線（連接電腦與Hub及ATU-R）；
    • 集線器（就是 Hub 或者是 Switch 啦）；
    • ADSL 計時制（連同 ATU-R）。
    • 在中華電信的網頁中有圖解說明每一種網路連線應該注意的硬體設備，您可以去看看。
準備工作：
  1. 個人電腦，且已安裝任何一版的 Windows 作業系統；
  2. Seednet ADSL 或 Hinet ADSL 或其他 ADSL 皆可（可提供多個 IP 給一個帳號使用）；
  3. 任一款 10/100M 的網路卡，每部電腦都要一塊；
  4. 夠長與足夠的正常的 RJ-45 網路線（如果你有 N 台電腦，則你至少需要 N+1 條網路線，N 條接 Hub至 PC，一條接 Hub 至 ATU-R ）；
  5. 集線器（或者是交換器，即 Hub 或 Switch） ，任一款皆可，不過需配合你的網路架構，如果您想要同時連線五台以上的電腦，則您的 Hub 應該買有 8 個網路孔的形式，不過 VBird 特別建議買可以分辨 10/100 的 Hub 或 Switch ，如果您的經費足夠的話！
  6. 範例：我有三台電腦要連成區域網路，則我需要的網路配備為（1）三塊網路卡；（2）一個五孔的集線器（Hub）；（3）四條網路線；（4）ADSL設備為Modem、電話線，這樣就可以囉！
申請 ADSL 計時制：
目前Hinet計時制提供同時兩部電腦連線，而Seednet則提供五部電腦連線，但是Seednet若開啟三個以上的電腦連線帳號時，在連線之前必須先打電話至 Seednet 要求開啟！關於 ADSL 的申請方式在此就不囉唆了，請至各服務網站查詢。這裡再次重申，這個方法『僅適合提供多個浮動 IP 的撥接式 ADSL ，例如 Seednet 或 Hinet』
  • 中華電信HINET
  • SeedNet
  • 台灣固網
  • 東森寬頻
  • Giga超網路
申請 ADSL 需要一段時間，而且並不是只要家裡有電話就可以申請 ADSL ！這是由於 ADSL 的網路傳輸訊號與機房到你家裡的距離有關，基本上，通常電信人員會建議你『家裡需要距離中華電信機房 4 公里內』才來安裝 ADSL ！此外， ADSL 等待來安裝的時間通常是因為：(1) 該地區申請的人太多，排不出時間來替你安裝；(2)機房的機器還在準備當中。所以呢，申請 ADSL 到中華電信的人員來你家裡安裝，大概需要 2 個星期左右，但是又因為一些基本環境的不同（例如你的居家附近突然有很多人申請，那麼肯定就會很慢啦！），所以來裝機的時間並不固定喔！如果真的等的不像話，應該打電話到申請的 ISP 去詢問看看囉！
在 Windows 作業系統下安裝網路卡：
在電腦連線的網路卡選擇方面，因為是家庭式的網路架構，基本上傳輸速率與流量均不會太大，因此隨便一塊網路卡也就可以了。且由於目前的網路卡幾乎清一色都是 10/100M 的網路卡了，所以選擇一張不太貴的也不太怪的網路卡（當然最好是PCI介面的啦）就可以了。但是記得，千萬不要買只有 10M 的網卡（其實現在要買到 10M 的網卡也蠻難的），至於若是你買到比較怪異的網路卡時，記得，不要使用 Windows 內建的驅動程式，因為一定會有問題，這時一定要使用你的網卡所附的驅動程式，這樣會比較容易安裝喔！例如 VBird 用過一塊日本製的網路卡，型號是FNW-9702-T，這塊卡的安裝就很麻煩，他一定要有驅動程式，不然一定不讓你捉的到.....。
安裝方式
  • 拆開每台電腦機殼將 10/100M 網路卡安插至 PCI 槽；啟動電腦後，通常 Windows 系統會自動地幫你安裝好網路卡的驅動程式，不過，如果你的網路卡並不被 Windows 所支援，則使用網路卡附的驅動程式，請將驅動程式片放置於 A： 或CD-ROM中，其他只要等待重新開機就可。
    • 確認硬體安裝完整
  • 硬體安裝完畢之後，請一定要到系統（開始-->設定-->控制台-->系統）中的『裝置管理員』去看看你的網路卡有沒有問題！！如下圖所示：
  • 如果有問題的話，在下面的圖示中，點選網路卡那一項，選擇『移除』，之後再按『重新整理』即會捉到網路卡，然後再將驅動程式的安裝路徑指向正確的地方（通常是 A 槽或是 CD-ROM）。如果你的網路卡太舊，以致於沒有網路卡的驅動程式，建議你來老伯的硬體小站看看：
  • 通常第一次安裝網路卡後，系統都會給兩個網卡的型式，一個是正確的網路卡（如下圖框起來的部分），另一個則是給傳統的撥號網路用的！如果你不用傳統的撥號網路（就是 56Kbps 那一種），這個介面是可以移除的！
  • 如果你還是沒有辦法確定網路卡是否安裝完畢，請到這裡來看看如何解決！
    前往老伯的硬體小站
    • 　請到【控制台\系統\裝置管理員】看看網路卡是否安裝正確.
    硬體間線路連接：
    我們是以 Hub 直接作為連接各硬體設備的介面，但是因為不同時期使用的 ATU-R 的支援性不同， 所以您必須特別注意每一種 ATU-R 的規格。基本上需要注意：
    • 舊式的 ATU-R ：有一種是直立型的 ATU-R ，而且他的外表示黑色的，那個是早期的小烏龜！那種型式的小烏龜可以用『平行線』與 Hub 的『一般孔』連接就可以了；
    • 新式的 ATU-R ：就像 VBird 目前用的這一款，是 Alctel 公司的 speed touch 340 這一機型，平躺的造型，而且是白色的。這一款的 ATU-R 就必須要使用『跳線』連接到『 Hub 』的『 Up-Link 』孔才行！
    總之，您在測試 Hub 的連接是否正常的時候，請務必記得『網路卡的燈與 Hub 上面接上線的燈必須亮著』才行！如果燈沒有亮的話，那麼就肯定在連線的部分就有問題了！請設法解決之。而連線的裝置圖有點像底下的圖示。
    附帶說明一下，在選擇集線器的時候，一定要注意的是你需要的傳輸速度，一般來說若無特殊需求，一部 10M 的集線器對於一般家庭來說已經夠用了，但是如果是企業內部用的（當然，這不在我們的討論範圍內），可能就需要買可以自動辨識 10/100M 的集線器囉！如果你對於傳輸速度很要求，那除了集線器之外，你的ADSL當然不可能選計時制的，因為傳輸速度確實比較慢喔！至於每部電腦的連線方式，可依照個人喜好選擇你適合的連線程式囉！
    另外，關於 Hub 的規格亦有所不同，通常五埠的集線器中有一埠(UpLink)是專門用來溝通兩台集線器用的，所以正常的情況之下，那一埠是不可以使用的。但是每一種集線器的規格畢竟不同，我就曾經用過一台五埠的集線器，他的 UpLink 埠竟然可以使用跳線來與其他的設備溝通！但是另一款的就不行了！此外，所有接上 Hub 的電腦，都是使用『平行線』來連上 Hub 的呦！
    增加有用的通訊協定設定（針對區域網路）
    由於區域網路是由一些網路的通訊協定所驅動形成的（關於各種通訊協定請參考 study-area 的說明），所以請一定要在網路的組態內加入下列的通訊協定，當然，在您網域內的所有電腦均需要做以下的設定！
  • TCP/IP
  • NetBEUI（或 NetBIOS ）
    • 要確認您的設定有沒有問題，請到這裡一步一步的檢查一下您的設定喔！OK！那我們開始安裝通訊協定吧！請特別注意，除非你的網路系統中有 IPX/SPX 之類的伺服器，否則就不要安裝 IPX/SPX 這一個通訊協定，不然你的 Windows98 連 Windows2000 的速度會跟烏龜一樣慢喔！
  • 安裝區域網路的各種通訊協定
    開啟方式：
    a. 在【網路上的芳鄰】按滑鼠左鍵點選擇【內容】；或
    b. 至【開始-->設定-->控制台-->網路】開啟【網路】組態頁面，開啟後會如下所示：
    • 當然，上面是已經安裝完成的圖示（而且已經砍掉了『撥號配接卡』那一項囉）。通常 Windows 系統安裝完畢之後均會有『撥號配接卡』這一項，這是給傳統的電話撥接 Modem 用的介面，如果你還有撥號 Modem 在你的電腦上，那這個地方就不能刪除。不過，像我的電腦中，因為我不用撥號網路，所以就把這個介面給殺掉了！注意：TCP/IP是最基礎也是最重要的通訊協定，請一定不要刪掉他！
    由於我們是使用ADSL撥接的，所以必須要有P.P.P.o.E.Adapter (NTSP3)這個介面，（如下圖所示），若您是使用 Windows 98 系列的系統，則安裝完撥號程式之後，介面卡也就安裝好了，但如果您是使用 Windows Me 系統的話，那就必須增加這一個介面囉。增加的方式為：『開始』-->『設定』-->『控制台』-->『加入新的硬體』。按兩次『下一步』之後，選擇『否，我想從清單上選擇硬體』，選擇『網路配接卡』，之後選擇正確的介面卡就可以了！
    好了，現在安裝通訊協定：
    如上圖所示，按【新增】鈕後出現下面視窗。
    點選【通訊協定】-->按【新增】鈕。
    點選【Microsoft】-->點選【NetBEUI】通訊協定-->按【確定】鈕。按完『確定』之後會顯示成如下圖所示。重複上面新增的步驟，以增加其他的通訊協定。
    然後開始增加使他人可以用你的檔案及印表機的選項：

      上圖的（1）即是剛安裝的【NetBEUI】通訊協定，先點選【Windows 登入】，通常我都將之改選為『Client for Microsoft Networks』這一項-->按【檔案及列印分享】鈕，將兩分享項目都加以核選！
  • 建立虛擬 IP 於每部電腦中
      在你設定好了所有的通訊協定之後，再來就是要修改 TCP/IP 中的設定了！通常，你應該給網路卡一個 IP 位置，關於 IP 位址的意義你可以到這裡去看看。基本上，由於我們都是使用『虛擬 IP 』來給你的區域網路運作，因此，回到剛剛的圖，然後點選『TCP/IP』這一個項目，會出現如下的畫面：
      • 我們設置的這個虛擬網路 IP 是 192.168.XXX.XXX 的形式，你可以完全照 VBird上面的設定來輸入，亦即輸入 192.168.1.2 這一個 IP ，子網路遮罩則同樣的輸入：255.255.255.0，你可以不用知道子網路遮罩的意義，不過，如果你想要有更深入的認識，還是建議你到這裡來學習一下吧！另外，需要注意：
      • 每一部電腦的 IP 前面三組號碼需要完全相同（192.168.1）至於最後面的號碼則一定要『不同』（在 1-254 之間）；
      • 所有電腦的『子網路遮罩』必須完全相同（都是 255.255.255.0）！
  • 開始設定你的區域網路的工作群組與電腦名稱：
      點選【識別資料】頁面，如下圖所示分別輸入您想要的工作群組與電腦名稱：
    • 這裡要注意的是，由於工作群組設定不同的時候，你將會在網路上的芳鄰看不到你設定的其他區域網路上的電腦，要在『整個網路』中才會看到，所以：
    • 請將每台電腦的工作群組名稱設定為一樣！但
    • 個別電腦的名稱請設定為不一樣！
    最後，按【確定】鈕回到【組態】頁面再按【確定】鈕等待 Windows 更新網路組態..再從新啟動電腦即可！這樣一來就可以開始資源分享的設定囉！
    啟動網路上的芳鄰與資源分享裝置
    在檔案總管中，在想要分享的磁碟機或者是資料夾按滑鼠右鍵點選【內容】，如下圖所示：

    在下圖中核選【資源分享】，請設定資源分享的名稱，然後存取類型可依個別喜好來設定，如果你這個資料很重要，不希望被刪除掉的話，最好選擇唯讀；但如果是一般家庭的網路系統的話，通常就直接設『完整』了，反正都是自家人，不過，由於最近的 Nimda 病毒相當的恐怖，所以這裡還是建議：
    • 使用完資源分享之後，立刻將資源分享關閉吧！不然的話，請三天兩頭更新一次您的病毒碼吧！免得中毒了！
    另外要注意的是，如果你選擇了『按照密碼決定』時，你就必須要輸入兩組密碼喔！
      基本上，以上的設定就已經足夠了，再接下來就是每台電腦之間的連接方法了！
    連上 Internet
    在你依序做完了硬體的連接與通訊協定的安裝並開啟了資源分享後，基本上，集線器的電源一開，你網路上的芳鄰中即可看到剛剛設定的所有相同工作群組的電腦名稱在你的網芳中了！接下來就是安裝連線程式以連上 Internet 啦！
    安裝連線程式：
    這裡以 EnterNet 300 v1.41 為例！
  • 下載EnterNet 300 v1.41，或到 史萊姆的第一個家 去看看
  • 將壓縮檔解開至你所要的目錄中，並執行Setup程式；
  • 執行Setup，若是怕麻煩，直接選擇 Quick setup 就可以囉！
  • 重新開機；
  • 執行中文化軟體（如果有的話），將這套軟體中文化吧！
  • 在桌面上會有一個 EnterNet 300 的圖示，執行他！
  • 輸入
    1. 帳號
    2. 密碼及
    3. 你要的連線代號就可以囉，這樣就會在連線圖示上出現一個你的代號的連線圖示；
  • 執行你的連線圖示，以連上 Internet。
    • 以下圖示各步驟：
    1.點選連線.
    2.點選設定.
    1.核選【1】與【2】項目.
    2.在第【2】項目內輸入連線後開啟的首頁.
    3.如要在起始 Wimdows 時即自動連線上網 ,
    請核選第【3】項.(電腦開機後就自動連線)

    按 Seednet ADSL 連線程式
    在【1】與【2】,【3】欄位輸入 Seednet
    給你的【使用者名稱】與【密碼】.

    1.設定完成後直接將 Seednet ADSL 連線程式拖放於桌面供以後手動連線.
    完成了上面所有的設定之後，從此，每部電腦一開機，便可以直接連上 Internet 啦！很簡單吧！
    註：各家 ADSL 固網公司所給的連線軟體都不太相同，而且不同的作業系統（ windows98, windows me, windows2000 ）所適用的連線軟體亦不盡相同，這裡僅是介紹一種連線軟體，你可以選擇適合你的作業系統的連線軟體幽！
    觀察你的 IP 情況：
    一般而言，欲檢查你這部電腦的 IP 可以使用 Windows 98 的一個小程式，名稱為：Winipcfg.exe（在C:\windows\winipcfg.exe），雙擊這個程式即可知道您電腦的 IP 位址啦！注意喔！由於你有設定虛擬IP，所以每部電腦應該都會有兩個 IP ！一個為實體IP一個為虛擬IP！
    據說設定虛擬IP的好處在於可以加快區域網路的連線情況，並且也可以加快開機時的網路偵測速度喔！
    另外，你也可以用下面的方法來瞭解你的 IP 狀況！
    在連線的常駐圖示上雙擊滑鼠左鍵
    這就是你目前連線的 IP 位址！此外，以下提供一些有關測速、IP的網站提供給大家囉！（感謝小紅帽上面技術討論版板主schnaufer 提供的相關訊息！真的很棒！）
    • 測速網站
      http://www.linkwan.com/big5/broadmeter/speed/speedthermoeter.htm
      http://cs.giga.net.tw/TestSpeed/TestSpeed.HTML
      http://netcity1.web.hinet.net/UserData/r1034230/
      http://speed.anet.net.tw/speedtest/speedtest.htm
      http://www.computers4sure.com/speed2.asp
    • 檢視您的真實 IP (給撥接ADSL找到真實IP)
      http://checkip.dyndns.org/
      http://ehome.asdf.com.tw/check_ip/
      http://library.cc.va.us/cgi-bin/ipaddr.pl?This-is-text
    • TCP/IP 分析
      http://forums.speedguide.net:8117/
    • Who Is
      http://www.whois.twnic.net.tw/
      http://www.apnic.net/search/index.html
      http://www.arin.net/whois/index.html
      http://www.ripe.net/perl/whois

    2002/ 01/24以來統計人數


使用 Windows 2000 做為主機分享 ADSL 的頻寬
適合 ADSL 撥接制
最近更新日期：2002/04/05
目的與適用性
準備工作
申請 ADSL
安裝 Windows 網路卡
硬體之間的線路連接
移除或增加通訊協定
內部網路：啟動網路上的資源分享
外部網路：連線上 Internet
啟動連線分享
Windows 用戶端電腦的設定
連不上一些網站的處理方法-MTU 修改
目的與適用性
    目的：
    直接以 Hub 連線進行分享的好處是簡單，但是缺點則是受限太多，因為連線電腦的上限被限制在你的 ISP 所提供的連線數，例如中華電信僅支援兩個 IP 給一個帳號使用，Seednet 雖然可提供 5 個 IP ，但是對於學生宿舍族群來說，畢竟還是不夠的！因此我們可以藉由伺服器的架設來達成頻寬分享的目的。那為何選擇 Windows 2000 而不使用 IP 分享器？
    • 由於 Windows 2000 通常都是隨機附贈的隨機版，為合法軟體；
    • Windows 2000 不但可做為伺服器，目前的硬體配備跑 Windows2000 也是綽綽有餘；
    • Windows 2000 的相容性還算不錯，做為伺服器的這架主機仍然可以讓你來玩 Game 或者是作為你的工作環境（office工作）！
    • 並且， Windows 2000 亦具有良好的圖形界面！
    因此也適合做為伺服器！
    原理：
    以伺服器連接上 Internet 的原理其實很簡單，主要分為以下的步驟：
    1. 讓 Windows 2000 的虛擬網路（區域網路）與 Client 電腦相通（可參考 Hub 的連接方法）；
    2. 將 Windows 2000 撥接之後，使產生 PPP 的虛擬網路介面；
    3. 利用 Windows 2000 預設的『網路共享機制』啟動 NAT 服務；
    不過這裡必須注意：Windows 2000 預設的網段為 192.168.0.0/24 這一段，所以您的虛擬網路中，所有的 IP 都必須在這一個網段之內！另外，由於您的區域網路的電腦都是透過 Windows 2000 上網，所以所有的連線出去的電腦，在 Internet 上面看起來的 IP 都是同一個。
    缺點：
    雖然以 Windows2000 作為連線伺服器，對於不想多花錢買一個 IP 分享器的學生族群有一定的吸引力，但是，做為伺服器的這架 Win2000 在使用中一定要小心，因為如果他一掛點的話，所有藉由這架主機連線出去的電腦通通都會無法連線！你得期待使用這架主機的同學們不會亂搞喔！另外， Windows2000 對於硬體資源的要求比較高，因此你沒有辦法使用淘汰掉的舊電腦來作為 Windows2000 伺服器。此外，由於 Windows 2000 的 NAT 有部分的功能怪怪的（牽涉到網路傳輸的一些情況），所以您必須在每一部 Client 電腦上修改 MTU 值才能連接上所有的 Web Site 喔！不過，雖然如此，他還是有可用之處啦！
    適用性：
    • Windows 2000 只有一塊網路卡的情況，在此針對 ADSL 計時制；
    • 可連接的電腦數量比較多（理論上可達 250 部）
    • 做為主機的 windows2000 電腦不可關機，且開機後即需要連上 Internet，
    • 其他用戶端電腦開機後立即直接連上 Internet ，而不用再撥接！
    所需要的軟硬體配備：
    • 個人電腦（PC）其中一部需要使用 Windows2000 作業系統；
    • 每部電腦均需要一塊網路卡；
    • n+1 條網路線（其中可能需要一條跳線）；
    • 一個集線器（就是 Hub 啦）；
    • 撥接制 ADSL （連同 ATU-R）。
    在中華電信的網頁中有圖解說明每一種網路連線應該注意的硬體設備，您可以去看看。
準備工作
申請 ADSL
安裝 Windows 網路卡
硬體之間的線路連接
移除或增加通訊協定
內部網路：啟動網路上的資源分享
硬體之間的線路連接有點像底下這樣：
至於其他的部分，請參考 以 Hub 連線分享 那一篇文章，裡面的內容都一樣喔！
外部網路：連線上 Internet
基本上， Windows 2000 連上 internet 的方法與 Windows 98 可以說是完全一模一樣的！由於我們這裡只有一塊網路卡，所以安裝 Enternet 300 的步驟與方法可以參考 以 Hub 分享頻寬 一文！此外，安裝完成之後會產生一個虛擬的介面喔！千萬注意囉！而，如果您使用 Seednet 的話，那麼底下的介紹撥接的網頁也可以看一看：
Seednet 客服部網頁
啟動連線分享
在你安裝完了 ADSL 撥接程式之後，在您的網路介面中應該會有兩個介面才對！如果沒有兩個介面的話，表示有點問題囉！這點請特別小心。然後你將滑鼠移動到『網路上的芳鄰』上面按『右鍵』選『內容』之後，應該會出現幾個『區域網路』的小圖示，隨便點選一個圖示，會出現如下的畫面
這個畫面告訴你目前的網路狀態，然後按下『內容』會出現如下的畫面：
上圖中告訴你『這個網路卡介面為 PPP:Windows 95/98/NT4/2000 的虛擬介面』，而中間則是列出各種通訊協定。這個時候請『特別』注意囉，就如同前所說，我們有兩個網路介面，一個是真實的一個是虛擬的，由於實際上對外的連線為『PPP』這一個虛擬網路介面，因此，要開啟網路頻寬資源分享的時候，是需要勾選『PPP』這一個介面才對喔！另外，『通訊協定都是由撥接程式之後，由 ISP 分配給你的，所以在 PPP 當中的通訊協定不要去改變他！』好了，就如同上面的圖示，請按下『共用』項目：
然後將『啟動這個連線的 Internet 連線共用』打勾，再按確定，會出現下面的畫面：
    這個地方告訴你，你的內部網路的那張網路卡（就是實體網路卡），已經被設定為內部網路的通訊閘，而且通訊閘的 IP 被設定為 192.168.0.1 這一個虛擬 IP ！請特別注意，如果您勾選錯誤的網路介面來共用，你的網路將會不通！好了！然後你在另外一個『區域連線』小圖示上面按兩下，並選擇『內容』後，會出現如下的畫面：
然後點選『Internet Protocol (TCP/IP)』這一項，出現下面畫面：
上面就明白的告訴你，這一張被作為內部網路的通訊閘的網路卡，其 IP 為 192.168.0.1 ，且子網路遮罩為 255.255.255.0，所以你在設定其他的電腦時需要注意道：
  • Client 的電腦 IP 必須在：192.168.0.2~192.168.0.255 之間；
  • Client 的電腦 Netmask 必須為： 255.255.255.0；
  • Client 的電腦通訊閘必須為：192.168.0.1；
  • Client 的電腦 DNS 設定與主機的 DNS 設定相同（這裡最容易搞錯！在 Client 端的電腦的 DNS 必須設定為類似 139.175.10.20 這個 Seednet 提供的 DNS 主機 IP 才行，當然，如果您是 Hinet 的用戶，那麼也需要輸入 hinet 的 DNS 主機 IP ，千萬記住，這裡『不是輸入你的 Windows 2000 的 IP』，網友們最容易出現錯誤的地方就是在這裡，大家常常會將 DNS 輸入成 192.168.0.1 ，這是『錯誤的』，請特別小心囉）
這樣就 OK 囉！從此以後，你的 Client 端電腦就可以上網囉！阿∼∼福氣啦！
Windows 用戶端電腦的設定
在主機端設定完畢之後，用戶端的設定就簡單很多啦！因為你已經知道你的通訊閘是 192.168.0.1，所以你要先確定連線上這部主機的其他電腦有幾部，在這些欲連上主機的電腦的 IP 必須是 192.168.0.XXX，其中XXX為 2-254 之間的整數，且『每一部電腦的 IP 都不可以相同』，好啦！讓我們來做設定吧！
  • 在 Windows 系統下，在『網路上的芳鄰』按右鍵選內容後出現如下畫面，當然，一些通訊協定你要先安裝喔！安裝的方法可以看這裡說明。：
  • 上圖中，點選『TCP/IP』這一項，出現：
    在上圖中，輸入這部電腦的 IP （192.168.0.xxx），而且子網路遮罩一定是『255.255.255.0』
  • 在上圖中點選通訊閘，出現下面畫面：
    在這個畫面中，輸入 192.168.0.1，並按『新增』則電腦會將你的網路卡連接到主機那張網路卡上面去啦！基本上，到這裡就已經設定完畢了！不過，你可以再輸入一下你慣用的 DNS 喔！什麼是 DNS，簡單的說，就是將類似 kimo.com.tw 這樣的文字轉換成 實體IP號碼 的一部機器啦！
  • 在上面的畫面中，按下『DNS組態』後，出現：
    以鳥哥為例，鳥哥是使用 Seednet 的帳號，所以鳥哥的慣用 DNS 則成為了 139.175.10.20 啦！另外，主電腦及網域可以寫也可以不用管他，隨便輸入都可以喔！這個 DNS 如果設定錯誤的話，那麼你將無法用 IE 連上 Internet 喔！千萬注意了！
  • 再來就是設定你的檔案可以給其他人使用啦，回到第一面，點選『檔案及列印分享』，並勾選兩者，按確定後離開！
    最後，當然就是重新開機啦！這樣一來，當 Windows 2000 那部主機只要在開機而且連線的情況下，所有的內部網路讀電腦均可以透過他來連接上 Internet 啦！
連不上一些網站的處理方法 MTU 修改
    常常我們若使用 Windows 2000 作為連線分享的軟體的時候，總是有些網站無法順利的接上去！但是在主機端則沒有問題！這真是傷腦筋呀！其實，這個問題需要藉由修改『每一個 Client 端電腦的 MTU 來修正』之。
    其實不只是 windows 2000 ，就是使用 windows 98 以一些連線分享的軟體來作為頻寬分享工具時，同樣也會有這個問題產生的！就是用戶端無法瀏覽某些網站或是無法發送內含附件的電子郵件。而造成這個問題的原因就是 MTU 的問題啦！什麼是 MTU 呢？那就是 Maximum Transmission Unit 的縮寫！那是啥？其實 VBird 也不是很清楚，只知道不同的介面具有不同的 MTU 要求，當 MTU 的需求與你的網路介面不同時，就會有問題發生啦！一般而言，MTU 在網路卡（EtherNet）的預設值為 1500 單位！好啦！剛剛說到不同的網路介面具有不同的 MTU 要求，那以下就列出一下各主要的網路介面之 MTU 的要求啦！
    網路介面 | MTU
EtherNet （一般的網路介面，這是預設值） | 1500
PPPoE(ADSL用的) | 1492
Dial-up(modem) | 576

    由上面的表格我們可以知道，預設的網路介面 MTU 是 1500 ，那 PPPOE 使用的是 1492，自然而然的 MTU 要求並不相同，所以啦！有一些網頁、郵件資料等等的咚咚就無法合理的讓你使用啦！

    那該如何解決呢？ 其實只要調整 Client 端網路卡的 MTU 值即可完全解決此一問題！而且藉由調整 MTU 值也可以增進網路效率呢。 那首要課題自然就是知道你的網路卡所可以負荷的 MTU 啦！因此我們第一步就是要找到適合的 MTU ：
  • 找出 MTU 值：
    在 windows 底下要找出 MTU 值就必須進入 DOS 模式，並且知道你的分享的主機的 IP 才行！例如你的主機是 windows 2000 且對內的分享的 IP 是 192.168.1.2，那麼你可以這麼做：
    • 進入 MS DOS 模式；
    • 打入 ping -f -l 1500 192.168.1.2
        C:\WINDOWS>ping -f -l 1500 192.168.1.2

        Pinging 192.168.1.2 with 1500 bytes of data:

        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.

        Ping statistics for 192.168.1.2:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
        Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum = 0ms, Average = 0ms

        上面的式子中，-l 是 L 的小寫（不是 1 喔），1500 是我們要測的 MTU 值，結果出現了 Packet needs to be fragmented but DF set. 這個東西，那表示MTU值太大了，你需要更小的 MTU 值才行！好啦！那假設我們使用 1464 來測試時：
        C:\WINDOWS>ping -f -l 1464 192.168.1.2

        Pinging 192.168.1.2 with 1464 bytes of data:

        Reply from 192.168.1.2: bytes=1464 time=10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128

        Ping statistics for 192.168.1.2:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
        Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum = 10ms, Average = 2ms

        結果出現了回應了！這表示這一個 MTU 值是可行的！不過，強烈建議找出可行的最大 MTU 值！這樣一來，在設定的時候，才可以達到最佳的網路速率！
    • 找出 MTU 值：利用上面這個方法找到的數值還不是 MTU 喔！由於一些封包上面的問題，上面這個值再加上 28 才是我們所需要的 MTU 值！所以，在上面的例子中，我們所需要的 MTU 值是 1464+28=1492 啦！
  • 修改 MTU 值：
    OK！我們已經找出 MTU 值啦，那下一步自然就是修改囉！要如何修改呢？其實也是很簡單，只要透過 Windows 本身預設的 registry 修改即可！
      Windows 98：
      1. 在 『開始』>『執行』中，鍵入<regedit>，會出現一個大框框；
      2. 選擇：『HKEY_Local_Machine』>『System』>『CurrentControlSet』>『Services』>『Class』>『NetTrans』>『000n』
        上面最後一個數據是 000n，那個 n 指的是數字，以我為例，在 NetTrans 底下有兩個數字，分別為 0000 與 0002，若按下 0000 會顯示我的 Gate Way 以及我的網路卡的 IP 項目，至於 0002 則沒有我的網路卡的相關資訊，所以 0000 那這一個就是我的網路卡介面啦！請依你的情況選擇！
      3. 選擇你的網路卡介面後（以我為例，按一下 0000 那一個機碼），按下『編輯』>『新增』，然後選擇增加『DWORD』值；
      4. 將新增的機碼取名為『MaxMTM』，並且在新增加的那個機碼上面按右鍵，選『修改』，會出現如下畫面，選擇『十進位』後，輸入剛剛我們找到的那一個 MTU 值：
      5. 改完之後你應該會看到如下的畫面喔！那就是成功了！
      Windows 2000：
      1. 在 『開始』>『執行』中，鍵入<regedit>，會出現一個大框框（注意，也有可能是 regedit32 這個執行檔，請依你的機器來作業）；
      2. 選擇『HKEY_Local_Machine』>『SYSTEM』>『CurrentControlSet』>『Services』>『Tcpip』>『Parameters』>『interface』，有點像下面的圖示：
      3. 在 interface 底下可能有很多的介面，你一個一個的去看，會有一個介面與你的網路卡的 IP 相同，那個就是你要挑選的介面啦！然後同樣的在該介面上選擇『編輯』>『新增』>『DWORD值』之後，建立一個名為『MTU』的機碼，然後選右鍵『修改』，選擇十進位，填入我們剛剛找出來的 MTU 值！大功告成！
    基本上，這樣應該已經可以解決你的問題了！相關的網頁你可以到底下兩個網頁去看看！
    http://www.microsoft.com/taiwan/msclub/member/TIPS/Spring_2001/tip1to3/tip1to3_2.htm
    http://redhat.ecenter.idv.tw/bbs/showthread.php?s=&threadid=21620&highlight=MTU
      • 另外，網友有建議另一個測試 MTU 的網頁，你也可以上去瞧一瞧，不過，要上這個網頁之前，『請先將你的代理伺服器設定 取消』否則測到的會是你的 Proxy 而不是你的真實 IP 喔！
      http://forums.speedguide.net:8117/
      此外，網友『許先生』來信告知小弟對於 MTU 的認知可能較為不足，底下將許先生的來信附在文末，希望對大家有點幫助：
      你好：

      在拜讀了先生的網站關於MTU的文章之後,對於其中某些部分有點小意見,在此提出以供參考,若有錯誤也還請指教：
      MTU並不是越大越好,也不是越小越好.應說是看你的網路來作最佳化.假設MTU非常大,就好比一台車可以坐1500人,但是現在總共有3001個人,你必須開3台車,其中一台雖然可以載1500人,但是卻只有一個人在使用,浪費了1499個資源.如果是有一部車可坐150人的話,那麼同樣3001人,需21台車,但是卻只浪費149個位置,以此類推,似乎是越小越好.實際上也不盡然,因為每個封包都有一些檔頭之類其他供人辨識的資料,所以內容是1500,但是前面所提的檔頭,卻也要18,所以總共是1518才是正確的.

      假設封包內容都是非常小,反而那些佔18的檔頭會重複浪費.所以切的越小,就好比只有幾個人坐飛機,但是機上的服務人員等,都比乘客還多.因此MTU不是越大越好,也不是越小越好

      剛剛看了其他部分,好像NAT的地方和小弟所知有一點不一樣,在win2k的設定網路共享部分,那不是NAT.你應該是用professional吧,其實在server版的設定中有一項,在路由及遠端存取才是喔.在貴網頁所提的是ICS,那只可以設定在192.168.0.x這個網段,也所以只可以分享到253台,其實所謂NAT是網路位址之間的轉換,不一定是真實ip轉換到虛擬ip,也可以是虛擬ip轉換到虛擬ip,像class a轉換到class c.所以嚴格說來ICS算是NAT的一種,但是並不是真正的NAT.
    2002/ 01/21以來統計人數


使用 Windows 2000 做為主機分享網路的頻寬
適合 ADSL 固定制與固定 IP （如學術網路）
最近更新日期：2002/01/26
目的與適用性
準備工作
申請 ADSL
安裝 Windows 網路卡
硬體之間的線路連接
移除或增加通訊協定
內部網路：啟動網路上的資源分享
外部網路：連線上 Internet
啟動連線分享
Windows 用戶端電腦的設定
連不上一些網站的處理方法-MTU 修改
目的與適用性
    目的：
    就如同前面幾篇所說的：直接以 Hub 連線進行分享的好處是簡單，但是缺點則是受限太多，因為連線電腦的上限被限制在你的 ISP 所提供的連線數，例如中華電信僅支援兩個 IP 給一個帳號使用，Seednet 雖然可提供 5 個 IP ，但是對於學生宿舍族群來說，畢竟還是不夠的！因此我們可以藉由伺服器的架設來達成頻寬分享的目的。那為何選擇 Windows 2000 而不使用 IP 分享器？
    • 由於 Windows 2000 通常都是隨機附贈的隨機版，為合法軟體；
    • Windows 2000 不但可做為伺服器，目前的硬體配備跑 Windows2000 也是綽綽有餘；
    • Windows 2000 的相容性還算不錯，做為伺服器的這架主機仍然可以讓你來玩 Game 或者是作為你的工作環境（office工作）！
    • 並且， Windows 2000 亦具有良好的圖形界面！
    因此也適合做為伺服器！但是，在前面提到的 適合 ADSL 撥接制的 Windows 2000 伺服器僅需要一塊網路卡即可達到分享的目的，然而若是固定制的 ADSL 呢？就是具有固定 IP 的 ADSL 呢？由於這種固定制的 IP 是固定的，所以根本就不會有撥接之後產生的所謂的『虛擬界面』這一個虛擬的網路卡，嘿！那要如何分享頻寬呢？因為一般固定制的 ADSL 了不起就是給了 5∼8 個 IP ，根本也不夠一些公司行號來使用呀！所以我們要來介紹一下以 Windows 2000 分享頻寬的方法囉！
    原理：
    以伺服器連接上 Internet 的原理其實很簡單，主要分為以下的步驟：
    1. 在 Windows 2000 主機上面安裝兩塊網路卡（最好選擇兩款不同晶片組的網路卡）；
    2. 一張網路卡專門對內，直接以『平行線』連接到 Hub 或 Switch 上面；
    3. 另一張網路卡專門對外，直接以『跳線』或『平行線』（依據不同的配備而異）連接到外部的數據機或者是網路插孔；
    4. 利用 Windows 2000 預設的『網路共享機制』啟動 NAT 服務；
    5. 將所有用戶端（ Client ）電腦以『平行線』接上 Hub 或 Switch。
    特別注意 Windows 2000 上面需要有兩張網路卡，其中一張對內一張對外，由於作業系統的問題，很有可能網路卡會捉錯！因此，建議選擇兩款『不同晶片』的網路卡來進行此一分享！例如選擇一塊『螃蟹卡』而另一塊則可以選擇『D-Link 的 530 系列』的網路卡。請留意， D-Link 530 系列網路卡在 Windows 上面其實是一塊相當棒的網卡，然而在 Linux 的系統當中卻相當的有問題，所以如果您是『雙作業系統』的架構，那麼則不建議選擇『D-Link 530』系列的網路卡喔！另外這裡必須注意：Windows 2000 預設的網段為 192.168.0.0/24 這一段，所以您的虛擬網路中，所有的 IP 都必須在這一個網段之內！此外，由於您的區域網路的電腦都是透過 Windows 2000 上網，所以所有的連線出去的電腦，在 Internet 上面看起來的 IP 都是同一個。
    缺點：
    雖然以 Windows2000 作為連線伺服器，對於不想多花錢買一個 IP 分享器的學生族群有一定的吸引力，但是，做為伺服器的這架 Win2000 在使用中一定要小心，因為如果他一掛點的話，所有藉由這架主機連線出去的電腦通通都會無法連線！你得期待使用這架主機的同學們不會亂搞喔！另外， Windows2000 對於硬體資源的要求比較高，因此你沒有辦法使用淘汰掉的舊電腦來作為 Windows2000 伺服器。此外，由於 Windows 2000 的 NAT 有部分的功能怪怪的（牽涉到網路傳輸的一些情況），所以您必須在每一部 Client 電腦上修改 MTU 值才能連接上所有的 Web Site 喔！不過，雖然如此，他還是有可用之處啦！
    適用性：
    • Windows 2000 主機上面安裝兩塊網路卡，特別適合固定制的 ADSL ，以及一般固定 IP 的網路情況（如學術網路）；
    • 不過這裡請特別留意， Giga 的撥接制 ADSL 雖然號稱固定 IP ，但是由於他仍然是藉由撥接來達成網路連接，因此仍然會有虛擬的網路界面卡，所以『Giga 的撥接制 ADSL 並不適用於本方法中』；
    • 可連接的電腦數量比較多（理論上可達 250 部）
    • 做為主機的 windows2000 電腦不可關機，且開機後即需要連上 Internet，
    • 其他用戶端電腦開機後立即直接連上 Internet ，而不用再撥接！
    所需要的軟硬體配備：
    • 一部具有兩塊網路卡的 Windows 2000 主機（Windows 2000 使用一般的版本即可，不需要特別的 Server 版）；
    • 用戶端電腦（ Client ）電腦均需要一塊網路卡；
    • n+1 條網路線（其中可能需要一條跳線）；
    • 一個集線器（就是 Hub 啦）；
    • 固定制 ADSL （連同 ATU-R）或者是固定 IP 的學術網路。
    在中華電信的網頁中有圖解說明每一種網路連線應該注意的硬體設備，您可以去看看。
準備工作
申請 ADSL
這部份請參考 Hub 連線分享 的部分！
安裝 Windows 網路卡
安裝網路卡誰不會！？但是由於 Windows 2000 主機上面乃是安裝兩塊網路卡，所以在網路卡的選擇及安裝上面較不相同喔！基本上 VBird 的建議是：
  • 在主機內的兩張網路卡的型號最好不要相同，也是要避免你在設定的時候發生錯誤的情況。如前所述，一塊網路卡選『螃蟹卡』另一塊可以考慮其他的晶片，例如 D-Link 530 等等的卡；
  • 安裝網路卡的時候，先安裝一塊，開機後讓 Windows 2000 捉一遍，等設定完成之後，再關機安裝第二塊網路卡，然後在開機讓 Windows 2000 捉第二遍。這樣有一個好處，就是可以避免由於如果選擇相同晶片的網路卡時，可以避免 Windows 2000 在設定上的一些誤判！
  • 做為主機的那一台 Windows2000 電腦的第二張網路卡，最好等到這架主機已經可以經由撥接或者是固接的方式連上 Internet 之後再安裝，以避免在您做 NAT 轉換時設定錯誤；
  • 在主機內的兩張網路卡的速度選擇上，當然最好都是 10/100Mbps 的，如果你有 10Mbps 的老舊網路卡，那可以將這一張較慢的網路卡作為『對外連線的卡』，因為對外連線的速度通常不可能高於 10Mbps 的！至於對內的卡則可以選擇較快一點的；
  • 在 Hub 的選擇上，如果你每一部電腦都是使用 10/100Mbps 的網路卡，哪你可以直接選買 100Mbps 的 Hub （不用自動辨識也沒關係），因為只有 ATU-R 的速度較慢，但 ATU-R 是直接與主機連接的呀！所以所有連上 Hub 的介面都是以 100Mbps 在跑，速度真的是很快（ VBird 有試過，當全部的介面（包含 Hub ）都是以 100Mbps 在跑的時候，最大的傳輸速率可以到達 12MBytes/second，一個 600MB 的檔案在你的網內機器上不到 1 分鐘就傳送完畢了！！）
基本上，安裝網路卡的方式不外乎：
（1）將硬體安裝好；
（2）開機讓 Windows 找驅動程式；
（3）Windows 找不到驅動程式的話，就放入驅動程式片，讓 Windows 去捉；
（4）如果還不行安裝的話，就直接到『開始』->『設定』->『控制台』->『新增移除硬體』去搜尋一下囉！
硬體之間的線路連接
硬體的線路連接跟前面兩種方法就不太一樣了！他需要將 Windows 2000 的對內與對外網路分別開來，所以基本圖示如下圖所示：
基本上，連線的設備順序可以是這樣：
    • 先安裝 Windows 2000 的第一塊網路卡；
    • 先將 Windows 2000 主機以『跳線』將第一張網路卡與 ATU-R 數據機連接；當然了，如果你是類似學術網路之類固定 IP 的網路條件下，那麼就必須要視您的網路設備來選擇您的網路連線之線材了。以 VBird 為例，我們研究室只有一個對外孔，而這個對外孔與內部電腦的連接基本上已經是『跳線』型態了，所以我們可以直接將這個對外網路線接到 Windows 系統的電腦中。不過，基本上是無法接到 Hub 的正常孔中！
    • ATU-R 與電話線連接之後，先輸入您的固定 IP 與所需要的各項網路參數。說穿了其實也只有：IP、Netmask、Gateway、DNS 這幾個東西而已。然後接上 Internet ，並確定 Internet 沒問題！
    • 將第二張網路卡安裝上 win2000 主機，並以正常的 RJ-45 網路線『平行線』連接上 Hub 的正常孔；
    • 將所有其他電腦安裝上網路卡後，並將網路卡與 Hub 的正常孔以『平行線』連接；
    • 開啟 Hub 電源，並開始 windows 的設定。（注意，並沒有用到 Hub 的 Up-Link 孔）；
    • 如果你有兩個以上的 Hub 的話，以正常線連接第一個 Hub 的 Up-Link 孔，並串接到第二個 Hub 的正常孔就可以了。
移除或增加通訊協定
內部網路：啟動網路上的資源分享
至於其他的部分，請參考 以 Hub 連線分享 那一篇文章，裡面的內容都一樣喔！
外部網路：連線上 Internet
在我們的分享中，最重要的自然就是 Windows 2000 是否可以正確無誤的連接上 Internet 囉！OK！那以下我們來測試看看吧！
  • 視察網路卡形式：
    在你兩張網路卡安裝完成之後，於系統中應該可以看到如下的畫面：（滑鼠移動到『我的電腦』按『右鍵』選『內容』按下『硬體』再按下『裝置管理員』）
上圖中，我們選擇 D-Link 做為內部網路而 PLANEX 則做為外部網路的界面卡。要注意的是『硬體裝置中是否有出現？符號的咚咚！如果有，那就是該裝置有問題，請更新其驅動程式吧！如果沒問題的話，就可以關掉這個視窗囉！
  • 連上 Internet：
    基本上有幾樣東西我們一定需要知道：
    1. ISP 給我們的 IP；
    2. ISP 給我們的 netmask；
    3. ISP 給我們的 Gateway ；
    4. 以及 ISP 自己的 DNS 。
    在『網路上的芳鄰』按右鍵，選內容後會出現如下的畫面，其中，區域連線為 PLANEX 對外的介面，區域連線2則為對內的連線。
    在上圖中於『區域連線』按右鍵選內容，會出現如下畫面，顯示使用的界面為 PLANEX 這塊卡，並且已經安裝了一些常用的通訊協定，如果你沒有這些通訊協定的話請按『安裝』選擇『通訊協定』後，增加通訊協定吧！（請注意喔！只要 TCP/IP 及 NetBEUI 即可，其他的不需要喔，詳細請看一下 TCP/IP 的迷思 一文！）
    接下來則是輸入固定制時， ISP 給你的（1）IP（2）通訊閘（3）DNS等，按上圖中的『Internet Protocol (TCP/IP) 』這一項，會出現下面畫面，然後分別輸入你的IP，預設閘道（通訊閘）及 DNS，完成後按『確定』即可連線上網；
這樣應該就可以連上 Internet 了，如果不行的話，請詳細的檢查一下您的：
  1. 硬體連線有無錯誤？
  2. 中華電信機房有無問題？（或學術網路是否又斷線了？）
  3. ISP 的伺服器是否正常？
  4. ISP 給的網路參數有沒有錯誤？
  5. 我的 Windows 2000 設定是否正確？（最常錯誤的地方出現在 DNS 喔！）
啟動連線分享
在你安裝完了 ADSL 撥接程式之後，在您的網路介面中應該會有兩個介面才對！如果沒有兩個介面的話，表示有點問題囉！這點請特別小心。然後你將滑鼠移動到『網路上的芳鄰』上面按『右鍵』選『內容』之後，應該會出現幾個『區域網路』的小圖示，隨便點選一個圖示，會出現如下的畫面
這個畫面告訴你目前的網路狀態，然後按下『內容』會出現如下的畫面：
好了，就如同上面的圖示，請按下『共用』項目：
然後將『啟動這個連線的 Internet 連線共用』打勾，再按確定，會出現下面的畫面：
    這個地方告訴你，你的內部網路的那張網路卡（就是實體網路卡），已經被設定為內部網路的通訊閘，而且通訊閘的 IP 被設定為 192.168.0.1 這一個虛擬 IP ！請特別注意，如果您勾選錯誤的網路介面來共用，你的網路將會不通！好了！然後你在另外一個『區域連線』小圖示上面按兩下，並選擇『內容』後，會出現如下的畫面：
然後點選『Internet Protocol (TCP/IP)』這一項，出現下面畫面（注意囉，底下的界面會自動設定，如果沒有自動設定的話，那麼表示有地方一定有問題囉！
上面就明白的告訴你，這一張被作為內部網路的通訊閘的網路卡，其 IP 為 192.168.0.1 ，且子網路遮罩為 255.255.255.0，所以你在設定其他的電腦時需要注意道：
  • Client 的電腦 IP 必須在：192.168.0.2~192.168.0.255 之間；
  • Client 的電腦 Netmask 必須為： 255.255.255.0；
  • Client 的電腦通訊閘必須為：192.168.0.1；
  • Client 的電腦 DNS 設定與主機的 DNS 設定相同（這裡最容易搞錯！在 Client 端的電腦的 DNS 必須設定為類似 139.175.10.20 這個 Seednet 提供的 DNS 主機 IP 才行，當然，如果您是 Hinet 的用戶，那麼也需要輸入 hinet 的 DNS 主機 IP ，千萬記住，這裡『不是輸入你的 Windows 2000 的 IP』，網友們最容易出現錯誤的地方就是在這裡，大家常常會將 DNS 輸入成 192.168.0.1 ，這是『錯誤的』，請特別小心囉）
這樣就 OK 囉！從此以後，你的 Client 端電腦就可以上網囉！阿∼∼福氣啦！
Windows 用戶端電腦的設定
在主機端設定完畢之後，用戶端的設定就簡單很多啦！因為你已經知道你的通訊閘是 192.168.0.1，所以你要先確定連線上這部主機的其他電腦有幾部，在這些欲連上主機的電腦的 IP 必須是 192.168.0.XXX，其中XXX為 2-254 之間的整數，且『每一部電腦的 IP 都不可以相同』，好啦！讓我們來做設定吧！
  • 在 Windows 系統下，在『網路上的芳鄰』按右鍵選內容後出現如下畫面，當然，一些通訊協定你要先安裝喔！安裝的方法可以看這裡說明。：
  • 上圖中，點選『TCP/IP』這一項，出現：
    在上圖中，輸入這部電腦的 IP （192.168.0.xxx），而且子網路遮罩一定是『255.255.255.0』
  • 在上圖中點選通訊閘，出現下面畫面：
    在這個畫面中，輸入 192.168.0.1，並按『新增』則電腦會將你的網路卡連接到主機那張網路卡上面去啦！基本上，到這裡就已經設定完畢了！不過，你可以再輸入一下你慣用的 DNS 喔！什麼是 DNS，簡單的說，就是將類似 kimo.com.tw 這樣的文字轉換成 實體IP號碼 的一部機器啦！
  • 在上面的畫面中，按下『DNS組態』後，出現：
    以鳥哥為例，鳥哥是使用 Seednet 的帳號，所以鳥哥的慣用 DNS 則成為了 139.175.10.20 啦！另外，主電腦及網域可以寫也可以不用管他，隨便輸入都可以喔！這個 DNS 如果設定錯誤的話，那麼你將無法用 IE 連上 Internet 喔！千萬注意了！
  • 再來就是設定你的檔案可以給其他人使用啦，回到第一面，點選『檔案及列印分享』，並勾選兩者，按確定後離開！
    最後，當然就是重新開機啦！這樣一來，當 Windows 2000 那部主機只要在開機而且連線的情況下，所有的內部網路讀電腦均可以透過他來連接上 Internet 啦！
連不上一些網站的處理方法 MTU 修改
    常常我們若使用 Windows 2000 作為連線分享的軟體的時候，總是有些網站無法順利的接上去！但是在主機端則沒有問題！這真是傷腦筋呀！其實，這個問題需要藉由修改『每一個 Client 端電腦的 MTU 來修正』之。
    其實不只是 windows 2000 ，就是使用 windows 98 以一些連線分享的軟體來作為頻寬分享工具時，同樣也會有這個問題產生的！就是用戶端無法瀏覽某些網站或是無法發送內含附件的電子郵件。而造成這個問題的原因就是 MTU 的問題啦！什麼是 MTU 呢？那就是 Maximum Transmission Unit 的縮寫！那是啥？其實 VBird 也不是很清楚，只知道不同的介面具有不同的 MTU 要求，當 MTU 的需求與你的網路介面不同時，就會有問題發生啦！一般而言，MTU 在網路卡（EtherNet）的預設值為 1500 單位！好啦！剛剛說到不同的網路介面具有不同的 MTU 要求，那以下就列出一下各主要的網路介面之 MTU 的要求啦！
    網路介面 | MTU
EtherNet （一般的網路介面，這是預設值） | 1500
PPPoE(ADSL用的) | 1492
Dial-up(modem) | 576

    由上面的表格我們可以知道，預設的網路介面 MTU 是 1500 ，那 PPPOE 使用的是 1492，自然而然的 MTU 要求並不相同，所以啦！有一些網頁、郵件資料等等的咚咚就無法合理的讓你使用啦！

    那該如何解決呢？ 其實只要調整 Client 端網路卡的 MTU 值即可完全解決此一問題！而且藉由調整 MTU 值也可以增進網路效率呢。 那首要課題自然就是知道你的網路卡所可以負荷的 MTU 啦！因此我們第一步就是要找到適合的 MTU ：
  • 找出 MTU 值：
    在 windows 底下要找出 MTU 值就必須進入 DOS 模式，並且知道你的分享的主機的 IP 才行！例如你的主機是 windows 2000 且對內的分享的 IP 是 192.168.1.2，那麼你可以這麼做：
    • 進入 MS DOS 模式；
    • 打入 ping -f -l 1500 192.168.1.2
        C:\WINDOWS>ping -f -l 1500 192.168.1.2

        Pinging 192.168.1.2 with 1500 bytes of data:

        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.
        Packet needs to be fragmented but DF set.

        Ping statistics for 192.168.1.2:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
        Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum = 0ms, Average = 0ms

        上面的式子中，-l 是 L 的小寫（不是 1 喔），1500 是我們要測的 MTU 值，結果出現了 Packet needs to be fragmented but DF set. 這個東西，那表示MTU值太大了，你需要更小的 MTU 值才行！好啦！那假設我們使用 1464 來測試時：
        C:\WINDOWS>ping -f -l 1464 192.168.1.2

        Pinging 192.168.1.2 with 1464 bytes of data:

        Reply from 192.168.1.2: bytes=1464 time=10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128
        Reply from 192.168.1.2: bytes=1464 time<10ms TTL=128

        Ping statistics for 192.168.1.2:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
        Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum = 10ms, Average = 2ms

        結果出現了回應了！這表示這一個 MTU 值是可行的！不過，強烈建議找出可行的最大 MTU 值！這樣一來，在設定的時候，才可以達到最佳的網路速率！
    • 找出 MTU 值：利用上面這個方法找到的數值還不是 MTU 喔！由於一些封包上面的問題，上面這個值再加上 28 才是我們所需要的 MTU 值！所以，在上面的例子中，我們所需要的 MTU 值是 1464+28=1492 啦！
  • 修改 MTU 值：
    OK！我們已經找出 MTU 值啦，那下一步自然就是修改囉！要如何修改呢？其實也是很簡單，只要透過 Windows 本身預設的 registry 修改即可！
      Windows 98：
      1. 在 『開始』>『執行』中，鍵入<regedit>，會出現一個大框框；
      2. 選擇：『HKEY_Local_Machine』>『System』>『CurrentControlSet』>『Services』>『Class』>『NetTrans』>『000n』
        上面最後一個數據是 000n，那個 n 指的是數字，以我為例，在 NetTrans 底下有兩個數字，分別為 0000 與 0002，若按下 0000 會顯示我的 Gate Way 以及我的網路卡的 IP 項目，至於 0002 則沒有我的網路卡的相關資訊，所以 0000 那這一個就是我的網路卡介面啦！請依你的情況選擇！
      3. 選擇你的網路卡介面後（以我為例，按一下 0000 那一個機碼），按下『編輯』>『新增』，然後選擇增加『DWORD』值；
      4. 將新增的機碼取名為『MaxMTM』，並且在新增加的那個機碼上面按右鍵，選『修改』，會出現如下畫面，選擇『十進位』後，輸入剛剛我們找到的那一個 MTU 值：
      5. 改完之後你應該會看到如下的畫面喔！那就是成功了！
      Windows 2000：
      1. 在 『開始』>『執行』中，鍵入<regedit>，會出現一個大框框（注意，也有可能是 regedit32 這個執行檔，請依你的機器來作業）；
      2. 選擇『HKEY_Local_Machine』>『SYSTEM』>『CurrentControlSet』>『Services』>『Tcpip』>『Parameters』>『interface』，有點像下面的圖示：
      3. 在 interface 底下可能有很多的介面，你一個一個的去看，會有一個介面與你的網路卡的 IP 相同，那個就是你要挑選的介面啦！然後同樣的在該介面上選擇『編輯』>『新增』>『DWORD值』之後，建立一個名為『MTU』的機碼，然後選右鍵『修改』，選擇十進位，填入我們剛剛找出來的 MTU 值！大功告成！
    基本上，這樣應該已經可以解決你的問題了！相關的網頁你可以到底下兩個網頁去看看！
    http://www.microsoft.com/taiwan/msclub/member/TIPS/Spring_2001/tip1to3/tip1to3_2.htm
    http://redhat.ecenter.idv.tw/bbs/showthread.php?s=&threadid=21620&highlight=MTU
      • 另外，網友有建議另一個測試 MTU 的網頁，你也可以上去瞧一瞧，不過，要上這個網頁之前，『請先將你的代理伺服器設定 取消』否則測到的會是你的 Proxy 而不是你的真實 IP 喔！
      http://forums.speedguide.net:8117/

    2002/ 01/27以來統計人數


以淘汰電腦安裝 Linux 做為伺服器分享 ADSL 的頻寬
最近更新日期：2002/01/27
目的與適用性
Linux 所需硬體與安裝 Linux 所需套件
安裝第二塊網路卡
在 Linux 上面的 ADSL 撥接方法
啟動 Linux 上面的 NAT 設定
設定 Windows 用戶端的電腦設定
要不要設定 MTU ！嘿！當然不需要
還有什麼可以玩得！呵！架站來玩玩！
目的與適用性
目的：
就如同前面所說的：
  • 直接以 Hub 連線進行分享的好處是簡單，但是缺點則是缺乏彈性。因為連線電腦的上限被限制在你的 ISP 所提供的連線數，例如中華電信僅支援兩個 IP 給一個帳號使用，Seednet 雖然可提供 5 個 IP ，但是對於學生宿舍族群來說，畢竟還是不夠的！
  • 若使用 Windows2000 做為伺服器分享頻寬，又礙於 win2000 需要的高檔配備！否則跑不動的啦！
  • 現在電腦進步的很快，很多人手邊都有一些廢棄的電腦。
因此，將廢棄電腦拿來當主機，嘿！是一件非常棒的利用方式！不過，以目前的主機系統來說，我們可以將他約略分成兩大類，分別是 MicroSoft 的 NT 系列（ Windows 2000 也是屬於 NT 系列的喔！）與 Unix-Like 如 Linux 、 Solaris 、 FreeBSD 等等都是！好了，我們都知道要使用 Windows 作業軟體時，整體的硬體系統就不能太差，否則電腦的執行速度一定讓你等到肝火上升，所以，為了您的健康著想，這個時候安裝 Windows 在廢棄電腦上面，似乎不太妥當。OK！那另一個 Linux 系統如何呢？哈哈！他只要 p-100 等級的 CPU 加上 32 MB 左右的 RAM 就可以跑了！而且在『不執行 X-Window 』的情況下，執行的效率是不錯的！所以，以下我們就來談一談怎樣在 Linux 上面架設一個 NAT 主機來提供網路的頻寬分享！
原理：
以 Linux 伺服器連接上 Internet 的原理其實很簡單（其實就是 NAT 功能啦），主要分為兩步驟：
  • Linux 主機強烈建議需要兩張網路卡，而且晶片組最好不要相同。如果相同也沒有關系，但是不要一次安裝兩塊，最好安裝一塊並設定好之後，再安裝另一塊比較妥當；
  • 一張網路卡對內，並在啟動的時候就驅動；
  • 一張網路卡對外，在啟動的時候不要驅動他；
  • 在 Linux 上面安裝 rp-pppoe 來撥接上 Internet ；
  • 將內部網路與 Linux 對內的那張網路卡具有相同網段的『 虛擬IP 』，由於相同網段的虛擬IP可以直接連線，因此所有的電腦就可以直接連上主機啦；
  • 啟動 Linux 的 NAT 功能，將對內網路卡的對外連線轉成可以連上 Internet 的第一張網路卡，因此所有來自內部網卡的要求便都可以透過具有連上 Internet 功能的第一張網路卡來完成工作！
同樣的，這裡要注意，由於所有的虛擬IP的電腦均是透過第一張網卡對外連線，所以在 Internet 上看到的從你的主機連出去的電腦之 IP 都是同一個（就是對外網路卡的 IP 啦）。
優點與缺點：
使用 Linux 來架設 NAT 主機，優點是：網路的傳輸速度很快，比 Windows 2000 的分享還要快。另外， Linux 主機有相當多的附加價值，不但可以作為郵件主機、WWW主機、FTP主機，並且可以作為你區域網路的中心站！此外， Linux 是一套管理記憶體很好的作業軟體，所以平時沒有大量工作的時候，CPU是在待機的狀況，所以並不會發生高熱（就是說比較不會當機啦）！在 VBird 家中的 P-166 超頻至 P-200，連續開機到目前（從 2001/02 到目前）沒有關機過，使用上一切正常！不過缺點就是學習 Linux 的時間需要比較長一些，而且對於用慣了 Windows 並且沒有學過程式語言的朋友來說， Linux 倒真的是很難入門！然而，如果您只是需要安裝一個可以轉換 IP 的 NAT 主機，那麼照以下的步驟一步一步來，呵呵！也是可以達成你的需求啦！
適用性：
  • 同時適合 ADSL 固定制與計時制；
  • 可連接的電腦數量比較多（理論上可達無限多部電腦的連接）
  • 做為 Linux 主機的電腦不可關機，且開機後即需要連上 Internet，
  • 其他用戶端電腦開機後立即直接連上 Internet ，而不用再撥接！
所需要的軟硬體配備：
  • 一台淘汰的電腦（最好是 P-100 以上等級，32MB以上RAM，2GB硬碟即可）；
  • 個人電腦（PC）；
  • 網路卡（每部電腦均要一塊，但做為主機的 Linux 需要兩塊）；
  • 正常的 RJ-45 網路線（連接電腦與Hub及主機）；
  • 一條跳線（連接主機與ATU-R）
  • 集線器（就是 Hub 啦）；
  • ADSL （連同 ATU-R）。
Linux 所需硬體與安裝 Linux 所需套件
OK！既然我們使用的是『即將被淘汰的電腦』也就是 P-166 以下等級的電腦（當然可以選擇更好的，這裡僅說明最低的硬體配備啦！）那我們需要怎樣的硬體呢？以 VBird 來說，我建議的配備有點像這樣：
  • P-166 左右等級的 CPU + 適合的主機板：基本上， 486 電腦也可以安裝沒問題的！
  • 至少 32 MB 以上的 RAM ：建議最好可以加到 64 MB 以上的 RAM ！其實，在 Linux 主機上面，CPU 往往不是重點，最大的問題應該是出現在 RAM 上面，所以，如果你的主機除了 NAT 功能外，還要進行一些哩哩摳摳的伺服器（例如 mail 與 proxy 等等），那麼建議 RAM 是越大越好！
  • 容易支援的網路卡：目前最建議的是使用 10/100 MB 的螃蟹卡，這種卡不但便宜，而且 Linux 的支援度蠻高的！另外，第二塊網路卡建議使用 via-rhine 這個晶片的網路卡，因為這個晶片 Linux 也有支援喔！
  • 大於等於 500 MB 的硬碟：基本上，如果你未來知道如何安裝 Linux 之後，只要 200 MB 的硬碟就可以進行 NAT 的架設了。但是由於 VBird 也不是很會挑選這個東西，所以目前建議大約 500 MB 的硬碟來進行安裝才好！
  • 隨便一塊 PCI 的顯示卡：目前最建議的是 S3 的顯示卡，例如 Virge 系列，或者 S3-775 系列等等的顯示卡都可以喔！
  • 安裝時需要的 CDROM、鍵盤與滑鼠：這幾個東西在安裝的時候是必須的，但是安裝完畢之後就可以拔掉了！不過，在 BIOS 當中，需要將 ERROR 設定成『 NO ERROR 』或者是『ALL but Keyboard』才行！甚至，你連顯示卡都可以拔掉！因為根本就不需要顯示呀！（呵呵！所以除了安裝過程當中需要螢幕，安裝完畢之後，你的 NAT 主機是不需要螢幕、鍵盤、滑鼠、CDROM 及顯示卡的喔！）
好了，確認完你的硬體之後，開始要來安裝囉，如果要瞭解每一個步驟代表的意義，那麼請到 鳥哥的私房菜館 來看看，底下僅列出需要注意的幾個步驟囉（底下先以一塊網路卡來安裝喔！）：
  • 確認系統可以被支援：盡可能的找到 Linux 可以支援的界面卡，例如 VBird 上面推薦的幾張卡，這樣在安裝的時候比較簡單；
  • 下載可開機的 Linux 光碟：由於 VBird 都是使用 Red Hat 這個公司出的 Linux 套件，所以我推薦他，你可以在 中山大學 FTP 站 找到相關的檔案（請下載有 i386 的那兩個檔案），下載完畢之後，可以使用類似 Nero 的檔案將這個映像檔燒錄成可以開機的光碟！
  • 修改 BIOS 設定：通常，如果你的主機板可以設定為 CDROM 開機的話，呵呵！那麼恭喜你，你可以進入 BIOS 當中，設定使用 CDROM 來開機，並馬上進入安裝畫面，如果沒有辦法的話，那麼只好製作可開機的軟碟囉！製作開機軟碟的方法如下：
    1. 隨便找一部 Windows 電腦，並放入剛剛燒錄完成的光碟片；
    2. 進入 MS DOS 模式（或者是 windows 2000 的命令提示字元），
      C:\WINDOWS> cd E:\dosutils
      上面的 E 為你的光碟機代號；
    3. E:\dosutils> rawrite -f e:\images\boot.img -d a:
  • 開機，並進入 text 模式安裝：不論使用光碟或者軟碟開機都是一樣的！會出現一個指示的話面，這個時候請輸入 text 則可以進入文字模式安裝，安裝的過程：
    1. 選擇語系為『 English 』
    2. 使用鍵盤為『 us keyboard 』
    3. 使用滑鼠為，由於我沒有安裝滑鼠，所以選『 No 』
    4. 選擇安裝模式為『 Custom 』自訂安裝
    5. 使用的硬碟分割工具為『 Disk Druid 』，開始進入硬碟分割畫面，我的動作都是先將所有的硬碟都 delete 掉，然後分割 64 MB 給 swap ，將所有的 500 MB 都分割給 / 即可！
    6. 開機的選項，我喜歡使用『 Lilo 』這一個；
    7. 安裝啟動磁區，呵呵『/dev/hda MBR(Master Boot Record) 』這一項囉；
    8. 要不要在核心輸入其他的設定『 OK 』直接跳過；
    9. Network Card 要設定喔！（這一個是對內（eth0）卡喔）
      IP=192.168.1.2
      NetMask = 255.255.255.0
      Gateway = 192.168.1.2
      DNS = 139.175.10.20
    10. 主機名稱 hostname 『隨便你取囉』；
    11. firewall 防火牆的設定，呵呵，選擇『 No Firewall 』吧！
    12. 選擇語系，不希望有中文，所以選擇『 English 』
    13. 選擇時區，那就是『 Asia/ Taipei 』
    14. Pass Word 的輸入；
    15. 設定使用者 ID ：先不要設定囉！
    16. 加密的幾個重點，都不要改啦！保持預設值；
    17. 套件的選擇：這裡最重要了，你只要選擇底下這幾個即可：
        Network Support
        Dialup Support
        Messaging and Web Tools
        Router / Firewall
        Network / Managed Workstation
        Utilities
      這幾個套件選擇完畢之後，大概需要 366 MB 的空間吧！
    18. 照螢幕顯示一步一步安裝吧！
    這樣子就安裝完畢了！在你開機完成之後，就可以使用 root 的身份登入 Linux 主機囉！
安裝第二塊網路卡
怎樣安裝第二塊網路卡呢？就是將 Linux 關機囉，然後安裝第二塊卡，然後開機，然後就可以自動的被捉到囉！如果無法被自動的捉到，那麼就麻煩了！請參考這一篇看看如何安裝第二塊網路卡吧！
連上 Internet
另外，全部的硬體連接之後是怎樣呢？可以這樣看：
  • 先將 Linux 主機以跳線將第一張網路卡與 ATU-R 數據機以『跳線』連接；
  • 將第二張網路卡安裝上 Linux 主機，並以正常的 RJ-45 網路線連接上 Hub 的正常孔；
  • 將所有其他電腦安裝上網路卡後，並將網路卡與 Hub 的正常孔以正常的 RJ-45 網路線連接；
  • 開啟 Hub 電源，並開始 windows 的設定。（注意，並沒有用到 Hub 的 Up-Link 孔）
  • 如果你有兩個以上的 Hub 的話，以正常線連接第一個 Hub 的 Up-Link 孔，並串接到第二個 Hub 的正常孔就可以了。
所有硬體連接完畢之後就會像底下的圖示這樣！
在 Linux 上面的 ADSL 撥接方法
在 Linux 上面撥接到 ADSL 計時制是使用 rp-pppoe 這一個套件至於 Red Hat 7.2 VBird 建議使用 rp-pppoe-2.6.5 這一個版本就可以囉！安裝的步驟可以直接以 rpm 來安裝即可；
那如何撥接呢？詳細的步驟我寫在 這裡 了，簡單的很：
step 1:
[root@tsai /root]# /sbin/ifdown eth0
[root@tsai /root]# /usr/sbin/adsl-setup
假設我們以第一塊網路卡連上 ADSL ，所以先斷掉 eth0 的連線！

step 2:
>>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca):
這個時候請輸入你在 ADSL 的帳號，
如果是 seednet 的話，應該有點像這樣==> T0123456
注意大小寫喔！

step 3:
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth1):eth0
因為我們使用 eth0 連線的呀！

step 4:
>>> Enter the demand value (default no):
這裡按 enter 不用設定就好了！

step 5:
>>> Enter the DNS information here: 139.175.10.20
>>> Enter the secondary DNS server address here: 163.28.112.1
這裡要你輸入慣用的 DNS 主機，若使用 seednet 的話，可以打入
139.175.10.20
若在台南地區的話，可以使用成大的 DNS => 163.28.112.1

step 6:
>>> Please enter your PPPoE password:
>>> Please re-enter your PPPoE password:
這裡就輸入你的 ADSL 密碼啦，要輸入兩次喔！

step 7:
The firewall choices are:
0 - NONE: This script will not set any firewall rules. You are responsible
for ensuring the security of your machine. You are STRONGLY
recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
for a LAN
>>> Choose a type of firewall (0-2):0
這裡要你選擇防火牆 的形式，通常我是不設火牆的，
所以直接選 0 就對了！

step 8:
Ethernet Interface: eth0
User name: T0123456
Activate-on-demand: No
Primary DNS: 139.175.10.20
Secondary DNS: 163.28.112.1
Firewalling: NONE

>>> Accept these settings and adjust configuration files (y/n)? y
接下來將你的設定作一個整合結果輸出，如果沒有問題的話，
輸入 y 之後就完成設定啦！
基本上，設定完成之後以下的檔案會被自動改變，
有影響的是 resolv.conf 這個檔案，你可以手動改變這個檔案喔！

Adjusting /etc/ppp/pppoe.conf
Adjusting /etc/resolv.conf
(But first backing it up to /etc/resolv.conf-bak)
Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
(But first backing it up to /etc/ppp/pap-secrets-bak)
(But first backing it up to /etc/ppp/chap-secrets-bak)

連上 Internet 之前，請先確認 eth0 或 eth1（用來連接線到 Modem 的那一張網路卡）已經斷線了，可以使用 /sbin/ifconfig 來確認，然後直接輸入
    /usr/sbin/adsl-start
即可連上網路啦！通常比較容易出問題的地方在於硬體的連線情況，請先確認所有的硬體連線沒有問題喔！通常，如果你使用小烏龜（ATU-R）時，請使用跳線連接網路卡與ATU-R。另外一個容易出錯的地方在於輸入的帳號與密碼，帳號與密碼都是你的 ISP 給你的，並且注意大小寫。
啟動 Linux 上面的 NAT 設定
NAT 設定由於 Linux 核心的不同而有點差異性，如果您是使用舊的 2.2.x 核心的話，也就是 Red Hat 7.0 以前的版本時，那麼你可以使用下面的指令來啟動 NAT 的功能：
echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -j MASQ -s 192.168.1.0/24 -d 0.0.0.0/0
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_autofw
/sbin/modprobe ip_masq_cuseeme
/sbin/modprobe ip_masq_portfw
/sbin/modprobe ip_masq_quake
/sbin/modprobe ip_masq_vdolive
/sbin/modprobe ip_masq_user
/sbin/modprobe ip_masq_mfw
當然囉，您必須是使用 ipchains 這一個咚咚。至於若您使用的是 Red Hat 7.1 以後的系統，例如我們介紹的 Red Hat 7.2 的話，那麼就必須以下面的方法來啟動 NAT 囉：
echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_nat_ftp
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
/sbin/iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
當然囉，如果您希望每次開機都可以自動的載入上面的咚咚，那麼你就可以將上面的資料寫入 /etc/rc.d/rc.local 裡面的最後一行中！
詳細的 NAT 功能與相關設定可以看一下底下這兩篇文章，一定可以對你有幫助喔：
鳥哥的私房菜館--NAT 設定
Study-Area 的技巧心得--NAT 設定
容易出錯的地方
前一些時候幫一些網友在討論 NAT 的問題，後來發現大家的問題都差不多！最容易發生錯誤的地方在於 default gateway 的問題，在 /etc/sysconfig/network 這個檔案中，或許有個 GATEWAYDEV 的咚咚，那個東西是你的 Linux 主機預設的通訊閘，由於我們是使用 ADSL 撥接制的，所以撥接之後會有一個 ppp0 的界面，因此呢，你就必須在 GATEWAYDEV=ppp0 這一個設定才對喔！另外，將 GATEWAY= 這一行空下來不要設定！
如果你還是有解決不了的問題，請先參考一下底下這一篇探討網路問題的心得分享囉！
檢查 Linux 網路問題
設定 Windows 用戶端的電腦設定
我們的 Linux 主機已經架設完畢囉！而且，如果你沒有更改上面的一些設定的話，那麼你的區域網路內的 Windows 電腦所需要注意的事項為：
  1. Windows 的 IP 在 192.168.1.3∼192.168.1.254 之間均可接受；
  2. 子遮罩網路 Netmask 為 255.255.255.0 這一個；
  3. 通訊閘為 192.168.1.2 ，這個需要與你的設定相呼應喔！
  4. DNS 主機可以設定為 139.175.10.20 這一個 seednet 的 DNS 主機，如果你的 ISP 有提供其他的主機的話，那麼請參考吧！
這樣就夠你設定的資訊了吧！還是不會嗎？看一下 Hub 的連接一文吧！
要不要設定 Client 的 MTU 值！？當然不需要！
使用 Windows 2000 最討厭的地方就是需要一大堆的 MTU 偵測與設定了！在 Linux 裡面可就沒有這個困擾了！我的經驗裡面，呵呵！這個 Linux 做為網路頻寬的分享，不但速度快，而且夠穩定的了！我使用 Seednet 這一家 ISP 來說，最長的連線時間為兩個月左右沒有斷線過！而且，即使斷線了，使用 Linux 的設定功能，可以立即自動的連接上 Internet 喔！好用的很！
另外一個最棒的是， Linux 可以支援架站喔！不論是目錄伺服器、檔案伺服器、郵件伺服器、網頁伺服器、FTP 伺服器等等的服務，只要你的頻寬夠大，硬碟夠大，都可以架設喔！提供兩個架站的網站給你瞧一瞧：
鳥哥的私房菜館
Study-Area 的 Linux 架站說明

2002/ 01/27以來統計人數


以軟體模擬分享 ADSL 的頻寬
最近更新日期：2002/01/27
目的與適用性
申請 ADSL 帳號
在 Windows 作業系統下安裝網路卡
連接硬體配備
增加通訊協定（確定網路上的芳鄰工作正常）
做為主機（Server）的 PC 安裝 All Aboard
做為用戶端（Client）的 PC 安裝 All Aboard
老問題：修改 Client 電腦的 MTU
目的與適用性
目的：
如果你不想使用伺服器（Server）的架構來連線分享頻寬的話，可以使用一些連線分享的軟體來達成頻寬分享的目的。使用連線分享的軟體時，連線的方法與使用 Hub 同時連接所有的電腦是一樣的，而且做為主機的機器可以不用插兩塊卡，僅只要一塊網路卡就可以達到連線分享的目的。
下載：
VBird 是在很久以前拿到這套試用軟體的，VBird 也不知道這家公司還在不在....你可以在這個網頁上下載，請按這裡下載。
適用性：
基本上，本方法適用於只有一個固定 IP 的情況（例如 Giga ADSL），當然，也適用於其他的計時制撥接 ADSL 系統。
缺點：
雖然這個是最便宜的方式，而且也不需要更新您的系統，因為在 Windows 98 底下就可以進行這一種頻寬分享囉！但是，由於這個方法是使用軟體來控制硬體，所以當做為主機的 PC 有問題時，會造成相當大的困擾！並且，由於是軟體來控制硬體，基本上，在傳輸速率方面，可能作為用戶端的電腦會有較慢的情況發生！說實在的，除非您真的不願意花時間在 Linux 或 Windows 2000 底下架設 NAT，又或者您不想要購買 IP 分享器，否則 VBird 真的不建議安裝這一種頻寬分享耶！
原理：
說穿了，這種方法的工作原理也不是很難，這類軟體只是將你的網路卡另外再設一個子網段的虛擬 IP ，利用這個『虛擬IP』來分享你的網路頻寬罷了！在 Linux 當中就有這一種方法的使用哩！
申請 ADSL 帳號
    目前Hinet計時制提供同時兩部電腦連線，而Seednet則提供五部電腦連線，另外， Giga 的 ADSL 則提供一個固定的 IP 給使用者。關於 ADSL 的申請方式在此就不囉唆了，請至各服務網站查詢。
    • 中華電信HINET
    • SeedNet
    • 台灣固網
    • 東森寬頻
    • Giga超網路
Windows 系統下安裝網路卡
      其實，安裝網路卡的方法都一樣，就是：
        （1）將硬體安裝好；
        （2）開機讓 Windows 找驅動程式；
        （3）Windows 找不到驅動程式的話，就放入驅動程式片，讓 Windows 去捉；
        （4）如果還不行安裝的話，就直接到『開始』->『設定』->『控制台』->『新增移除硬體』去搜尋一下囉！
      詳細的安裝方法可以到使用 Hub 連線分享那一篇去看看。
連接硬體配備：
基本上，連接硬體的方式與 Hub 直接連接的方式相同，所以你可以參考一下 以 Hub 連線分享的方式那一篇
增加通訊協定（確定網路上的芳鄰可正常工作）：
基本上，在你完成了硬體的連線以及網路卡的安裝之後，如果沒有意外的話，通常 Windows 內的『網路上的芳鄰』就可以工作了，亦即是你可以在你的電腦中看到你『區域網路』內的所有電腦。如果不行的話，應該就是網路有點問題了。要確認問題的所在，你可以先：
  1. 確定通訊協定都正常：
  2. 確認連線設備完全沒有問題：
總而言之，在安裝這套連線分享程式之前，你一定要：
  1. 先確認你的 『區域網路』 沒有問題，而且，
  2. 做為主機的那台電腦也可以正常的撥接上 Internet 才行！
否則如果出問題，你一定會不曉得是哪一個部分出現問題的！
做為主機（Server）的 PC 安裝 All Aboard
這套軟體的安裝方法非常簡單，只有幾個步驟而已，而且通常使用程式的預設值就可以了！除非你需要更多的支援！
0. 按這裡下載軟體：
1. 在檔案總管中雙擊這個程式，會出現如下的歡迎畫面：
2. 按下 Next 之後出現如下的版權宣告畫面：
3. 按下 Yes 之後，會出現底下的畫面：
上圖中告訴你，這部安裝中的電腦是主機還是用戶端？由於我們是安裝主機，所以當然選擇『Base Computer』
4. 選擇了 Base Computer 之後，或出現要你輸入密碼的資料，由於我們是試用版，所以直接以預設的 DEMO 就可以了！
5. 在按下了 Next 之後，會出現要你選擇網路卡的設備。由於我們只有一張網路卡，所以下圖其實只有一個網路卡的型號。因此，你直接選擇空白框框裡的網路卡之後（你的網路卡型號與鳥哥的會有所不同喔！），再按下 Next。
6. 然後會出現設定的畫面，這個時候使用程式的預設值（Express Setup）就可以了。
7. 按下 Next 之後出現安裝目錄的畫面，若不使用其他的目錄，則直接按下 Next 即可。
8. 再來則是軟體會自動的設定好你的系統，你只要按下 確定 就可以了！
9. 再來軟體會告訴你 OK 了，按下 是 即可。
10. 安裝完成之後，請重新開機吧！
到此為止，主機端的設定就 OK 了！在你重新開機之後，你會發現螢幕右下方多了一個有點像是恐龍的小圖示，那就是安裝完成啦！這時候你要做的就是請撥接上網吧，撥接完成之後，請確定你的 Internet 是沒問題的，然後請再繼續安裝你的用戶端 PC ！
註：最重要的是第三步驟，請必定選擇 Base Computer！
做為用戶端（Client）的 PC 安裝 All Aboard
安裝用戶端的電腦就更簡單了。由於主機在安裝完了 All Aboard 之後，就成了具有 DHCP 服務的主機，所以在你的用戶端電腦上，安裝 All Aboard 就很簡單。
1. 在上面的第三個步驟中，如下圖所示，由於我們是安裝用戶端電腦 (Client PC)，所以請選擇『2nd Computer(Client Computer)』這一項。
2. 然後與上面的步驟都一樣，等到出現下面的畫面時，由於你的電腦可以直接由主機來供應你的 IP ，所以選擇『Set the client to obtain an IP Address automatically』這一項即可。
然後又與安裝主機時相同的訊息，（但是步驟被省略很多了），反正最後就是重新開機了！
3. 重新開機之後，你的這部用戶端電腦應該就可以直接透過主機來連線囉！如果不行的話，應該就是你的 IP 沒有捉對，這時候在你的 Client 電腦上：
『開始』-> 『執行』-> 輸入『winipcfg』
會出現一個小框框的畫面告訴你，這部電腦的 IP 情況。看看你的IP是否為 192.168.244.151，如果前面三位數字不對的話，請按
『全部釋放』
『重新捉一次IP』（朝意思一樣的鈕就按下去吧），
那用戶端應該就可以捉到你的主機了！
老問題：請修改 MTU 吧！
使用這一種模擬的方式所提供的連線分享方式，仍然需要特別留意某些網站無法連上去，所以你就必須又要修改 MTU 值啦！如何修改？請參考前面的 Windows 2000 之修改的那一篇吧！這裡就不再贅述了！

2002/ 01/27以來統計人數


連線分享頻寬方法的建議
最近更新日期：2002/01/27
看完了上面的幾篇心得分享之後，相信大家對於以 ADSL 作為連線分享的方法大致上應該有了一些瞭解了！好了，那麼現在來出個考題給大家作作..........喔！不是啦！是要大家來想一想，如果是『我自己要頻寬分享』的話，應該要如何選擇連線的方法呢？以我而言，由於目前 ADSL 裡面，最熱門的應該還是 計時制 的撥接方法，因為他畢竟最便宜，一個月大約費用（2002/01/27日為止前）在 1100~ 1300 新台幣之間，至於略高一級的固定制就需要這個價格的兩倍！對於窮學生的我，以及上網的頻寬不需要太高的人們來說，計時制的也實在是足夠了！那麼如果要我建議『最簡單』的頻寬分享方式的話（大概就是針對計時制的囉），那麼我會建議如此的順序：
  • 買 IP 分享器：
    其實 IP 分享器的功能就有點像是 Linux 的 NAT 主機，好一點的 IP 分享器不但提供直接以 Web 界面管理，以及同時具備 DHCP （自動分配 IP 位址的功能之服務的名稱）的功能，另外，同時提供 Hub （或者是 Switch ）的連接孔，所以呢，一部 IP 分享器完全解決您上網的需求之需要！而且，要架設區域內的主機時，可以透過 IP 分享器的 port 對應設定來將某些服務封包轉送到你的區域網路內，也就是說，你使用了 IP 分享器之後，你的區域內的電腦『全部的 IP 都是 虛擬 IP』，但是你卻可以『透過 IP 分享器的 port 對應』（簡單的說，有點像是 Linux 的 NAT 設定囉）來讓你的虛擬 IP 的電腦也可以架站，並且與 Internet 相連接！
    這是所有分享頻寬的方法裡面最簡單的了，因為所有的撥接工作都交給 IP 分享器，你的電腦只要接到 IP 分享器上，就等於上網了，不過，就是費用上高了點，而且 port 對應的設定方法也比較麻煩一點。不過，如果你很有錢，而且也很怕麻煩，再加上你只是要分享頻寬的話，那麼 IP 分享器是最簡單的囉！
  • 申請 Seednet 或 hinet 等提供多個浮動式 IP 的 ISP：
    另外一個最簡單的方式發生在『連線的電腦數量不多』的情況下。據我所知，目前小於五部電腦的 ADSL 連線分享方式裡面，最簡便的就是申請 Seednet 的計時制 ADSL 了！因為 Seednet 提供 5 個浮動式 IP 給一個帳號，所以，在你申請的線路上最多可以五部獨立安裝撥接程式來上網！只要買個 Hub 或者是 Switch 就可以了！如果沒錢的話，買個不用 1000 元的 Hub 就可以分享囉！又簡單又方便！所以，這裡告訴大家，如果您的區域網路內的電腦數量真的不多的時候，然後又沒有所謂的架站問題，那麼使用 Seednet 可以說是最佳的解決方案了！當然囉，如果你的電腦只有兩部的話，那麼 Hinet 也是蠻好的一個選擇。至於使用 Giga 的朋友，雖然可以獲得一個固定的 IP ，但是就無法使用此一方法囉！
  • 建置 Linux 或 Windows 2000 主機：
    如果，真的，萬一，不幸，你選擇了類似 giga 的撥接制，或者是你的電腦數量超過了 5 部以上，那麼要如何來分享你那小小的 ADSL 頻寬呢？沒辦法了，除了 IP 分享器這個最簡單的方法之外，就是架設 Windows 2000 或者是 Linux 這種主機來分享囉！使用Windows2000 提供分享較為簡單，你只要有 Hub 配合每部電腦一個網路卡，就可以分享了，不過缺點是，你還需要在每部用戶端電腦上設定 MTU 的值！比較麻煩一些些！
    而使用 linux 架設伺服器是我最喜歡的方式了，不過，也是所有分享頻寬的方法裡面，技術性較高的一種方法，不過，以 Linux 架設主機有相當多的附加價值，就是可以架設非常多的伺服器，並且，個人認為，以 Linux 主機架設伺服器的頻寬分享速度是所有方法裡面幾乎是最快的（請注意，其實 IP 分享器也是主機的一種！只是他的功能被簡化而已！），並且，你只要有不要用的 p-100 左右等級的電腦配合 500 MB 的硬碟與 32MB 的 RAM 就可以架設了！而主機也不需要螢幕、鍵盤、滑鼠、甚至，安裝完畢之後，連顯示卡都可以拔掉不使用！只要有『主機板、CPU、RAM、硬碟、網路卡』就可以了，當然，安裝的時候這些東西都還是需要的，只是安裝完畢之後，就可以拔掉了！並且，Linux 的資源耗費的非常的少，所以你也不用擔心 CPU 會燒掉的問題！
    使用主機來架設頻寬分享的方式可能是彈性最高的一種了，其中，Linux 分享的情況更是如此，因為你的配備不需要太高，並且，一塊網路卡可以分享的電腦理論上是『無限多部』的，（當然囉，由於資料封包的碰撞問題，自然不會接太多部電腦在一個網路卡上面！）而且 Linux 也提供轉 port 的功能，只要幾個指令就可以達到這樣的功能，好的很！並且，速度要比 Windows 2000 快的多囉！
  • 使用軟體來模擬主機：
    這是我最不喜歡的連線方式，因為問題多多，並且安裝方面也需要蠻大的除錯功夫！而連線方式也是所有方法裡面最慢的！容易 Delay ，此外，如果主機有點小問題（其實，哪一部 windows 系統的電腦會沒有『小問題』的？）那麼你的用戶端電腦，呵呵！跟著一起掛！超不穩定的！不過，這個方法是最便宜的方式了，因為只要 windows 98 的系統就都可以使用！
好了！說了這麼多關於『簡單的』連線方式建議，那麼有沒有『最推薦的方式』建議呢？當然有囉！最推薦的方式自然就是 Linux 的架站囉！理由有幾點：
  • 以 Linux 進行撥接來分享頻寬，他網路的速度可以說是最快的一種了，在我的經驗裡面，幾乎不會有 delay 的問題，而且相當的穩定；
  • 以 Linux 進行分享的配備可以使用廢棄不用的 486 以上等級電腦就夠了，可以達到廢物再利用的『環保概念』，呵呵！此外，硬體配備幾乎並不會影響到網路傳輸速度的問題；
  • 架設 Linux 可以讓你的一些電腦觀念與網路基礎更清楚，因為所有的設定都可以修改，以符合你的需要，所以，當然可以更清楚的瞭解你的需要囉！
  • Linux 的附加價值相當的高，你只要將硬碟加大一些些，並將 RAM 也擴充一些些，就可以進行很多的主機架設，我最常架設的就是 mail server 了！假如你今天要將十份資料寄給同一個人，而且你的時間又不多，並且也很怕會影響到其他人使用網路的權力，那麼你只能在夜深人靜的時候才能寄信了，而且一封 5MB 的信件可能要等待超過 10 分鐘的時間才能傳送完畢！要寄 10 封的時候，哈哈，想不瘋掉也很難，真可憐！如果架設了郵件主機之後，那麼你只要按下傳送鍵，由於對內的 Hub 最低也有 1.2MBytes/second 的速度，呵呵，機秒鐘就傳送完畢了，你就可以關掉你的 Windows 機器去睡覺囉，其他的郵件傳送全部交給 Linux 主機去負責，呵呵，輕鬆又方便！此外，人家寄大量信件給你的時候，由於是直接寄到你的 Linux 主機上面，所以你在收信的時候根本就不需要幾秒鐘就可以收受完畢！並且不需要連接到 Internet 上面，呵呵！很簡便吧！
  • Linux 可以設定偵測的時段，使斷線了之後可以立即撥接，這個功能在 Windows 底下也有對不對，但是呢，Linux 可以在 IP 被改變了之後，立即以 e-mail 通知你，讓你可以隨時知道你的 IP 情況，這個功能就不簡單了吧！此外，在你於外部電腦中（例如在公司內部）也可以透過 Internet 連線到你家中去進行修改的動作！呵呵！很方便吧！
基於這些理由，所以我最喜歡的方是就是 Linux 分享頻寬了！但是，並不是所有人都適合架設 Linux 的，例如如果你是一家公司的主管，平時忙都忙斃了，還要架設 Linux 嗎？可能沒時間對不對！是的，架設 Linux 真的需要花一些時間，所以沒有耐性的朋友們，呵呵，先想其他的方法吧！好了，那有沒有第二推薦？！當然有囉，可以選擇 Windows 2000 這個作業系統來分享呀！他的理由有幾點：
  • Windows 2000 目前很多都是『隨機版』，所以是正版的軟體，這個對於一般的公司行號是很重要的！
  • Windows 2000 的使用方法與界面與 windows 98 或 windows xp 幾乎完全一模一樣，你根本就不需要在花時間去學新的東西，所以很適合立即的架設分享頻寬！
  • Windows 2000 的架設方法很簡單，接線方法就更簡單了，另外，你可以使用你目前既有的設備來架設 Windows 2000 的連線分享機制，不需要在花額外的設備（當然， Hub 是一定要的啦！），既省錢，又簡單！何樂不為？
好了，那有沒有適合懶人的方法。ㄟ！當然有，買 IP 分享器吧！除了貴了一點，個人覺得 IP 分享器算是一個不錯的解決方案囉！

2002/ 01/27以來統計人數


誰需要架站
最近更新日期：2002/01/27
看完了『最推薦的方法』建議中，是否很想立刻架設 Linux 呢？呵呵！這裡可要提供大家一個想法喔！基本上， Linux 架設的主機功能是真的很強，我個人真的是很喜歡！但是，近來我越來越不推薦大家架設 Linux 了，為什麼？！因為近來發現網路上實在有太多的閒人在隨意的入侵人家的主機，包括我的主機也常常被莫名其妙的人們嘗試入侵，所以，網路的安全是越來越重要了。因此呢，如果你沒有隨時注意你主機的時間與精力，那麼架設 Linux 主機可能並不是那麼樣的適合您！因為，太不安全了。已我見過的朋友為例，幾乎多多少少都有被入侵過的經驗，包括我早期架設的 Linux 網站，也都被入侵過（更可惡的是，他甚至改變了我的一些程式碼，害我找不到某些資料，真是的！），所以呢，真的需要特別留意。那麼你會說，『咦！Windows 不是更容易被入侵嗎？』話是沒錯，但是 Windows 被入侵之後，大概受傷的只是你自己，然而你的 Linux 被入侵之後，呵呵，受害者可能不只是你，你的 Linux 若被怪客（Cracker）拿來作為跳板的話，哈哈，那你可糗了！
OK！但是萬一如果你是 Giga 的用戶，而且你手邊剛好又有一些不要的電腦，並且你也很有心想要學習一些新的玩意！呵呵！恭喜你，那就架設 Linux 吧！底下是我在網路上回答一些朋友所謂『網管人員需要什麼能力？』一文，希望大家可以看一看，然後再想一想囉！
網管人員需要什麼能力？
我想，架幾個站跟作一個稱職的網管人員，相差是甚遠的！架站，說真的，是一件很簡單的事情，看著書本一步一步的作上去，一定可以成功的！但是，很多人都只曉得『如何架站』卻不知到『如何維護一個網站的安全』！基本上，維護一個已經架設好的網站的正常運作，真的要比架設一個網站難的多了！你得要隨時知道你的系統狀況，隨時注意是否有新的套件漏洞而去修補他，隨時要注意各種服務的登錄檔案(logfile)以瞭解系統的運作情況！得知道發生問題的時候，到底問題點是在哪一個！比如說當機了，那麼你知道當機的原因嗎？！即使不知道，也可得需要約略猜得出來才行。而，如果安全出了問題，被入侵了，除了format + 重灌之外，可有辦法在不移除系統的情況下修補漏洞？！這些都是網管人員需要學習的，而且，通常都是需要經驗的累積才會知道問題的所在！此外，保持身心的活力以隨時注意線上公布的安全防備資訊等等！都需要具備的！
最後，最嚴重的問題是，網管人員其實最需要的是『道德感與責任感』！你可要曉得你的機器上所有人的隱私都在你的監控之下，如果您本身就已經有偷窺慾了，可知道這有多可怕嗎？！另外，如果沒有責任感的人作為一個網管，可能會瘋掉，因為不論何時何地，只要是你監控的主機出了問題，嘿嘿嘿嘿，你一定是第一個被想到的人物，所以，你給隨時隨地做好可能隨時會被召喚回主機跟前的心理準備！更可笑的是，如果你服務的人群中，有幾個連開機的時候軟碟機塞了一塊不可開機的軟碟，導致無法正常開機，也都會跟你抱怨說『唉呦！你經手的電腦怎麼這麼爛，動不動就不能開機』的時候，你得要有容人的雅量，說說冷笑話解解悶吧！
總之，網管人員並不是只要會架站就可以了，『道德感』『責任感』還有『耐心』呵呵！套一句現在人喜歡說的口頭禪『這是一定要的啦！』
網管人員是什麼？
今天剛剛看到了報紙的一篇報導，內容大概是說：
臺灣的網路管理人員對於『網路安全性防護』的認知不夠，或許是防火牆機制建立不完整，或者是認為駭客不會入侵小型網站，所以在不甚瞭解的情況下，被所謂的『中東駭客組織』所入侵，然後以臺灣被入侵的電腦為跳板，去攻擊賓拉登的仇敵美國，然後引起美國高度的不滿。由於臺灣的立場有點得罪不得美國（這邊不提及政治因素，反正目前的情況是這樣。），所以一接到美國來的抗議信函就很棘手。
這只是一個事件問題，不過這個事件問題也點出了一個重點，就是我們的網路資訊可能真的是蠻發達的，不過，管理網路的人員可能在認知的程度上就有點參差不齊了！網路安全是蠻重要的，不過，大家常常會忘記他！個人認為，網管是蠻重要的角色，應該不能等閒視之才對。

2002/ 01/27以來統計人數


Linux 相關

系統環境：Redhat Linux 7.3 (請務必安裝 APT)

  1. Redhat Linux 7.3 快速安裝指引
  2. apt - 用來更新你的系統
  3. awstats - 一個專業的網站流量統計
  4. FrontPage Sever Extensions
  5. Mrtg 懶惰蟲安裝法
  6. NTP 設定時間同步
  7. Open WebMail 2.xx
  8. Open WebMail 2.0 懶惰蟲安裝法
  9. ProFTP
  10. Quota 磁碟配額
  11. Redhat Linux 7.3 模組列示
  12. Redhat Linux 7.3 模組說明
  13. SendMail
  14. UebiMiau 2.78 懶惰蟲安裝法
  15. 發送中文傳真
  16. 安裝 Linux 於磁碟陣列系統

JSP

  1. 安裝 JSP 環境 - tomcat
  2. 安裝 JSP 環境 - resin

尚未完成，僅供參考

  1. Apache 小技巧
  2. DNS Server
  3. FreeISP
  4. htaccess 認證方式
  5. NFS
  6. NIS
  7. Perl 的模組
  8. Postfix
  9. Postfix & Vm-pop3d
  10. procmail
  11. 主機及網路設定

MySQL

  1. 資料庫操作
  2. 資料表操作
  3. 建立資料表

JavaScript

  1. 新進病毒
  2. 年度10大病毒排名
  3. 10大病毒謠言

Linux 架站筆記 - www.dreamer.cc


Redhat Linux 7.3 快速安裝指引

更新時間：05/21/2003 15:57:38

特點及功能如下

  1. 提供主流服務，使用單純的結構，但不安裝 X-Window 介面
  2. 具備 DNS、FTP、Mail、WebMail、WWW 及資料庫(MySQL)的服務
  3. 使用 SMTP 寄件需經過認證
  4. 可在線上做系統管理(WebMin)、資料庫維護(phpMyAdmin)及流量監控(Mrtg)
  5. 每天與時間伺服器對時、每週自動更新系統的套件

安裝 Redhat Linux 7.3

  1. 安裝類型 (Installation Type)
    選取 "伺服器(Server)"
  2. 碟碟分割的順序及容量
    1. /boot : 64MB
    2. /home : 約硬碟總容量的四分之一
    3. /var : 約硬碟總容量的二分之一
    4. SWAP : 實體記憶體的兩倍
    5. / : 剩餘的容量
  3. 選擇時區 (Time Zone Selection)
    選取 "Asia/Taipei"
  4. 選擇套件群組 (Package Group Selection)
    1. 取消 "Classic X Window System"
    2. 選取 "SQL Database Server"
    3. 選取 "Web Server"
    4. 選取 "DNS Name Server"
    5. 選取 "選擇個別套件(Select individual packages)"
  5. 選擇個別套件 (Individual Package Selection)
    1. Applications/Databases
      1. 選取 "mysql"
      2. 選取 "mysql-devel"
      3. 選取 "mysql-server"
      4. 選取 "mysqlclient9"
      5. 取消 "postgresql"
      6. 取消 "postgresql-libs"
      7. 取消 "postgresql-server"
    2. Development/Languages
      1. 選取 "perl-DBD-MySQL"
      2. 選取 "perl-suidperl"
      3. 選取 "php-mysql"
  6. 套件相依性 (Package Dependencies)
    選取 "Do not install packages that have dependencies"

取得原始檔

以下的步驟所需要的原始檔，我已經整合在 src.tgz，請使用下列指令下載，並解壓縮於根目錄:
cd /
wget http://www.dreamer.cc/source/src.tgz
tar -xzvf src.tgz

安裝 qe

rpm -ivh /src/qe/qe-0.2.0-3.i386.rpm
mv /usr/share/qe/qe.pro /usr/share/qe/qe.pro.old
cp /src/qe/qe.pro /usr/share/qe/

安裝 Apt-Get 並更新系統

cd /src/apt-get/
rpm -ivh *.rpm
mv /etc/apt/sources.list /etc/apt/sources.list.old
cp sources.list /etc/apt/
apt-get update
apt-get -y upgrade
apt-get clean

讓系統每週都能自動更新一次

  1. 於 /etc/cron.weekly/ 新增指令檔 "upgrade"，內容如下:
    #! /bin/bash
apt-get update
apt-get -y dist-upgrade
apt-get clean
  2. 更改檔案屬性為 755:
    chmod 755 /etc/cron.weekly/upgrade

安裝 iMap

apt-get -y install imap

安裝 ProFtpd

apt-get -y install proftpd
rm -rf /etc/xinetd.d/proftpd
mv /etc/proftpd.conf /etc/proftpd.conf.old
cp /src/proftpd/proftpd.conf /etc

安裝 WebMin

rpm -ivh /src/webmin/webmin-1.080-1.noarch.rpm

設定 SMTP 寄件認証

  1. 開啟 /etc/mail/sendmail.mc，搜尋下列文字:
    dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    將這兩行前面的 "dnl " 給刪掉，繼續搜尋:
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
    將 "127.0.0.1" 改成 "0.0.0.0"，改好之後，存檔離開。
  2. 重新製作 /etc/sendmail.cf:
    m4 /etc/mail/sendmail.mc > /etc/sendmail.cf

設定磁碟配額

編輯 /etc/fstab，在欲設定磁碟配額的分割區加入兩個啟動參數 "usrquota" 及 "grpquota"，例如:
LABEL=/home     /home   ext3    defaults                1 2
改為
LABEL=/home	/home   ext3    defaults,usrquota,grpquota        1 2

更改系統啟動的服務項目

執行 "ntsysv"，僅允許下列的服務啟動:

  1. atd
  2. crond
  3. httpd
  4. ipop3
  5. iptables
  6. keytable
  7. mysqld
  8. named
  9. network
  10. proftpd
  11. random
  12. sendmail
  13. sshd
  14. syslog
  15. webmin
  16. xinetd

減少虛擬終端機數量

修改 /etc/inittab，找到終端機項目，將項目 3~6 設為註解:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

增加網路安全性

修改 /etc/sysctl.conf，加入下列幾行:

# Enable ignoring ping request
net.ipv4.icmp_echo_ignore_all = 1

# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0

# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1

# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0

# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Enable IP spoofing protection, turn on Source Address Verification
net.ipv4.conf.all.rp_filter = 1

# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1

重新開機

sync;sync;sync;reboot

掃描磁碟並啟用磁碟配額

quotacheck -avug
quotaon -av

讓系統與遠端的時間伺服器對時

apt-get -y install ntp
ntpdate -s time.stdtime.gov.tw
hwclock --systohc

讓系統每天自動對時一次

  1. 於 /etc/cron.daily/ 新增指令檔 "ntpdate"，內容如下:
    #! /bin/sh
ntpdate -s time.stdtime.gov.tw
hwclock --systohc
  2. 更改檔案屬性為 755:
    chmod 755 /etc/cron.daily/ntpdate

安裝 phpMyAdmin

cd /var/www/html
tar -xzvf /src/phpMyAdmin/phpMyAdmin-2.5.0-rc2-20030506-tw.tgz

變更 MySQL 的管理者密碼

  1. 使用下列指令進入 MySQL，並開啟 MySQL 的系統資料庫:
    mysql mysql
  2. 於 MySQL 中，輸入下列指令變更 root 的密碼，並限定 root 只能從本機登入:
    update user set password=password("新的密碼") where user="root";
delete from user where user="root" and host<>"localhost";
delete from user where user="";
delete from db where user="";
flush privileges;
exit;

安裝 Open-WebMail

請參考 "Open WebMail 2.0 懶惰蟲安裝法"。

安裝 Mrtg

請參考 "Mrtg 懶惰蟲安裝法"。

安裝完畢

  1. 線上系統管理 (WebMin) 網址：http://host.domain.tld:10000/
  2. 資料庫維護 (phpMyAdmin) 網址：http://host.domain.tld/mysql/index.php
  3. WebMail 網址：http://host.domain.tld/cgi-bin/openwebmail/openwebmail.pl
  4. 流量監控 (Mrtg) 網址：http://host.domain.tld/mrtg/index.html
  5. 磁碟配額的管理，請透過 WebMin。
  6. 你可以新增一個 "webmaster" 帳號，用來管理網站。該使用者使用 FTP 登入後，其根目錄為 /var/www/ (此使用者已設定於 ProFtpd 的設定檔)。
  7. 最後，請自行新增一個普通使用者的帳號 (例如 "admin")，並將 root 的郵件轉寄到該帳號 (編輯 /root/.forward)，並減少使用 root 登入系統。

返回首頁 Linux 架站筆記 - www.dreamer.cc


APT

更新時間：05/20/2003 16:35:30

說明

APT 就像 Microsoft 的 WindowsUpdate 及 RedHat 的 up2date，它強化 RPM 的功能，可以解決 RPM 有套件相依性的問題。

安裝 APT 除了可以讓你很方便且快速地安裝 RPM 套件之外，你也可以用它來更新系統。而且 APT 不需註冊，完全免費，更可以安裝非 RedHat 提供的套件 (跟你指定的來源伺服器有關)。

安裝 APT 並更新系統

  1. 從本站下載 APT 的安裝檔至 /tmp (你也可以到 http://apt.freshrpms.net/ 下載)，並執行安裝:
    cd /tmp
wget http://www.dreamer.cc/source/apt-get/apt-0.3.19cnc55-fr8.i386.rpm
wget http://www.dreamer.cc/source/apt-get/apt-devel-0.3.19cnc55-fr8.i386.rpm
rpm -Uvh apt-0.3.19cnc55-fr8.i386.rpm
rpm -Uvh apt-devel-0.3.19cnc55-fr8.i386.rpm
  2. 安裝完成之後，其執行檔為 /usr/bin/apt-get，相關設定檔放在 /etc/apt/。
  3. 編輯來源伺服器設定檔 /etc/apt/source.list，請先將裡面的內容全部清除，因為本系統是 RedHat Linux 7.3，故將下列幾列新增到此設定檔:
    # 交通大學
rpm ftp://linux.nctu.edu.tw/dists/redhat/apt i386 redhat-7.3-updates
rpm-src ftp://linux.nctu.edu.tw/dists/redhat/apt i386 redhat-7.3-updates

# freshrpms.net
rpm http://apt.freshrpms.net redhat/7.3/en/i386 os updates freshrpms
rpm-src http://apt.freshrpms.net redhat/7.3/en/i386 os updates freshrpms
    如果你是其它版本的 Linux，請參考 "來源伺服器設定"，依照你的系統環境做修改。
  4. 更新系統:
    apt-get update
apt-get -y upgrade
apt-get clean

常用參數

update | 與來源伺服器 (source.list) 資料比對，更新套件的資訊。
check | 檢查目前主機上套件的相依性。
upgrade | 進行主機上所有套件的昇級。
dist-upgrade | 進行主機上所有套件的昇級。
install <套件名稱> | 下載及安裝套件，若有相依屬性的套件則會詢問你是否一併安裝。
remove <套件名稱> | 移除套件，若有相依屬性的套件則會詢問你是否確定要移除。
source <套件名稱> | 下載 Source 套件。
clean | 清除下載回來的檔案。
-f install | 檢查系統套件的相依性，並修正錯誤。
-y | 程式執行中，若有任何詢問皆自動回答 "Yes"。

讓系統每週都能自動更新一次

  1. 於 /etc/cron.weekly/ 新增一個指令檔 "upgrade"，內容如下:
    #! /bin/bash
apt-get update
apt-get -y dist-upgrade
apt-get clean
  2. 更改檔案屬性為 755:
    chmod 755 /etc/cron.weekly/upgrade

來源伺服器設定

APT 會從伺服器下載套件回來更新系統，其來源伺服器設定檔為 /etc/apt/sources.list，請依系統環境修改設定:
  • Redhat Linux 7.3
    # 交通大學
rpm ftp://linux.nctu.edu.tw/dists/redhat/apt i386 redhat-7.3-updates
rpm-src ftp://linux.nctu.edu.tw/dists/redhat/apt i386 redhat-7.3-updates

# freshrpms.net
rpm http://apt.freshrpms.net redhat/7.3/en/i386 os updates freshrpms
rpm-src http://apt.freshrpms.net redhat/7.3/en/i386 os updates freshrpms
  • CLE 1.1(gaga)
    # CLE 1.1(gaga)
rpm ftp://cle.linux.org.tw/pub/CLE/i386 RedHat gaga
rpm-src ftp://cle.linux.org.tw/pub/CLE/i386 RedHat gaga

# CLE 1.1(gaga)
rpm ftp://linux.csie.nctu.edu.tw/CLE/i386 RedHat gaga
rpm-src ftp://linux.csie.nctu.edu.tw/CLE/i386 RedHat gaga

# CLE 1.1(gaga)
rpm ftp://linux.nctu.edu.tw/dists/CLE/i386 RedHat gaga
rpm-src ftp://linux.nctu.edu.tw/dists/CLE/i386 RedHat gaga

# CLE 1.1(gaga)
rpm ftp://tlug.sinica.edu.tw/pub3/CLE/gaga/i386 RedHat gaga
rpm-src ftp://tlug.sinica.edu.tw/pub3/CLE/gaga/i386 RedHat gaga
  • Red Hat Linux 7.2
    # freshrpms.net
rpm http://apt.freshrpms.net redhat/7.2/en/i386 os updates freshrpms
rpm-src http://apt.freshrpms.net redhat/7.2/en/i386 os updates freshrpms
rpm http://apt.freshrpms.net redhat/7.2/ja/i386 os
rpm-src http://apt.freshrpms.net redhat/7.2/ja/i386 os
  • Red Hat Linux 7.1
    # freshrpms.net
rpm http://apt.freshrpms.net redhat/7.1/en/i386 os powertools dma updates freshrpms
rpm-src http://apt.freshrpms.net redhat/7.1/en/i386 os powertools dma updates freshrpms
rpm http://apt.freshrpms.net redhat/7.1/en/ia64 os updates
rpm-src http://apt.freshrpms.net redhat/7.1/en/ia64 os updates
  • Red Hat Linux 7.0
    # freshrpms.net
rpm http://apt.freshrpms.net redhat/7.0/en/i386 os powertools dma updates freshrpms
rpm-src http://apt.freshrpms.net redhat/7.0/en/i386 os powertools dma updates freshrpms
rpm http://apt.freshrpms.net redhat/7.0/ja/i386 os updates
rpm-src http://apt.freshrpms.net redhat/7.0/ja/i386 os updates
rpm http://apt.freshrpms.net redhat/7.0/tc/i386 os
rpm-src http://apt.freshrpms.net redhat/7.0/tc/i386 os

返回首頁 Linux 架站筆記 - www.dreamer.cc


Awstats

更新時間：05/20/2003 16:36:10

說明

Awstats 是一套網站流量統計程式 (包括虛擬主機)，藉由網站的 Log 檔做分析，分析的內容還滿詳盡的。

以下的安裝步驟是下載本人修改過的原始檔來安裝 Awstats(修改自 Awstats 5.4)。

安裝 GeoIP

  1. 從本站下載 GeoIP C Library 原始檔到 /tmp，解壓縮並安裝:
    cd /tmp
wget http://www.dreamer.cc/source/awstats/GeoIP-1.1.9.tar.gz
tar -xzvf GeoIP-1.1.9.tar.gz
cd GeoIP-1.1.9
./configure
make
make check
make install
  2. 從本站下載 GeoIP Perl API 原始檔到 /tmp，解壓縮並安裝:
    cd /tmp
wget http://www.dreamer.cc/source/awstats/Geo-IP-1.15.tar.gz
tar -xzvf Geo-IP-1.15.tar.gz
cd Geo-IP-1.15
perl Makefile.PL
make
make test
make install

安裝 awstats

  1. 先修改 Apache 的設定檔 (/etc/httpd/conf/httpd.conf)，將
    CustomLog logs/access_log common
    改成
    CustomLog logs/access_log combined
    如果有設定虛擬伺服器，則再將所有虛擬伺服器的
    CustomLog logs/dummy-host.domain.tld-access_log common
    改成
    CustomLog logs/dummy-host.domain.tld-access_log combined
  2. 從本站下載 awstats 原始檔至 /var/www/，並解壓縮:
    cd /var/www
wget http://www.dreamer.cc/source/awstats/awstats-5.4-tw.tgz
tar -xzvf awstats-5.4-tw.tgz
  3. 將設定檔 awstats.model.conf 複製成 awstats.host.domain.tld.conf:
    cd cgi-bin/awstats
cp awstats.model.conf awstats.host.domain.tld.conf
  4. 編輯 awstats.host.domain.tld.conf，將
    SiteDomain=""
    改成
    SiteDomain="host.domain.tld"
    若本設定檔是針對虛擬伺服器，則再將
    LogFile="/var/log/httpd/access_log"
    改成
    LogFile="/var/log/httpd/host.domain.tld.access_log"
  5. 執行流量分析:
    ./awstats.pl -config=host.domain.tld -update

安裝完成

連上網址看流量分析:
http://defaultserver.domain.tld/cgi-bin/awstats/awstats.pl?config=host.domain.tld

定時流量分析(一個小時)

  1. 於 /etc/cron.hourly 新增指令檔 "awstats.sh"，內容如下:
    #! /bin/bash
/var/www/cgi-bin/awstats/awstats.pl -config=host.domain.tld -update > /dev/null
  2. 更改檔案屬性為 755:
    chmod 755 /etc/cron.hourly/awstats.sh

返回首頁 Linux 架站筆記 - www.dreamer.cc


FrontPage Sever Extensions

更新時間：05/20/2003 16:34:00

說明

FrontPage Server Extensions 是 Microsoft FrontPage 網站建置及管理工具的延伸程式，是一套安裝於伺服器端的應用軟體，讓使用者可以直接在網站伺服器上直接進行編輯作業，以及允許使用者在網站上使用下列的FrontPage元件：表單處理元件、討論區元件、全文檢索元件以及計數器元件。

以下的安裝步驟僅針對虛擬主機做配置。

安裝 FrontPage Sever Extensions

  1. 從本站下載 FrontPage Server Extenstions 的原始檔至 /usr/local/，並解壓縮：
    cd /usr/local/
wget http://www.dreamer.cc/source/frontpage/fp40.linux.tar.gz
tar -zxvf fp40.linux.tar.gz
  2. 開始安裝 FrontPage Server Extensions：
    frontpage/version4.0/fp_install.sh

Step 1. Setting Up Installation Environment

Setting umask 002
Logged in as root.

fp_install.sh

Revision: 1.1
Date: 1998/12/02 21:58:21

This script will step the user through upgrading existing and installing
new servers and webs. As with any software installation, a backup should be
done before continuing. It is recommended that the FrontPage installation
directory, server configuration file directory, and all web content be
backed up before continuing with this installation.

Are you satisfied with your backup of the system (y/n) [N]? y

Directory /usr/local exists.
Root has necessary access to /usr/local.

Where would you like to install the FrontPage Extensions. If you
select a location other than /usr/local/frontpage/ then a symbolic
link will be created from /usr/local/frontpage/ to the location that
is chosen.

FrontPage Extensions directory [/usr/local/frontpage/]: <Enter>
WARNING: Directory /usr/local/frontpage already exists.
Installation will overwrite existing files.

Continue the installation (y/n) [N]? y

Step 2. Untarring the Extensions and Checking Protections

Version 4.0 FrontPage Server Extensions found.
Would you like to overwrite? (y/n) [Y]? n

No need to un-tar the extensions. Continuing...
echo Step 3. Upgrading/Installing the extensions

Checking for existing web servers to upgrade...
No existing web servers found to upgrade.

Note: If you have not installed the root web then you need to do it now.

Do you want to install a root web (y/n) [Y]? n

Installation completed! Exiting...

新增虛擬主機，並結合使用者帳號

  1. 欲使用虛擬主機，須確定伺服器有支援 Name-Based 虛擬主機的設定。請檢查 httpd 的設定檔是否有啟用下列選項:
    NameVirtualHost *
  2. 新增使用者帳號，並建立網頁及 CGI 目錄:
    useradd username
chmod 711 /home/username
su username
mkdir /home/username/public_html
mkdir /home/username/public_html/cgi-bin
exit
passwd username
  3. 編輯 /etc/httpd/conf/httpd.conf，新增虛擬伺服器資料:
    <VirtualHost *>
    ServerAdmin username@domain.tld
    DocumentRoot /home/username/public_html
    ServerName username.domain.tld
    ErrorLog logs/username-error_log
    CustomLog logs/username-access_log common
        <Directory "/home/username/public_html/">
        AllowOverride All
    </Directory>

    <Directory "/home/username/public_html/cgi-bin/">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
    ScriptAlias /cgi-bin/ /home/username/public_html/cgi-bin/
</VirtualHost>
  4. 加入 Frontpage Server Extensions 支援:
    cd /usr/local/frontpage/version4.0/bin
./fpsrvadm.exe
Type "fpsrvadm -h" for help on command line options

Please enter command:
0) quit
1) install
2) upgrade
3) uninstall
4) check and fix
5) enable authoring
6) disable authoring
7) change security settings
8) recalculate links
9) delete
10) rename
11) set directory executable
12) set directory no executable
13) putfile
14) recalcfile
15) create a subweb
16) merge a subweb into its parent web
17) full uninstall of all FrontPage information
18) chown
Your choice [1]: 1

Please enter server type:
0) apache
1) apache-fp
2) ncsa
3) netscape-enterprise
4) netscape-fasttrack
5) stronghold
Your choice [0]: 0
Enter server config filename: /etc/httpd/conf/httpd.conf
Enter host name for multi-hosting []: username.domain.tld
No ServerRoot directive in server config file, using /etc/httpd
No ServerRoot directive in server config file, using /etc/httpd

Starting install, port: user.attractive.idv.tw:80, web: "root web"

Enter UNIX username []: username
Enter UNIX group []: username
No ServerRoot directive in server config file, using /etc/httpd

User name to add to FrontPage group "administrators" [administrator]: username
Password for user "user": <設定使用者密碼>
Confirm password: <再輸入一次密碼>
No ServerRoot directive in server config file, using /etc/httpd
Creating web http://user.attractive.idv.tw
Chowning Content in service root web
Chmoding Extensions in service root web
Install completed.
  5. 重新啟動網頁伺服器:
    service httpd restart

進階功能設定

  • FrontPage Server Extensions 可讓你加入郵寄表單功能，欲啟用本功能，請編輯 /usr/local/frontpage/host.domain.tld:80.cnf ，加入:
    sendmailcommand:/usr/sbin/sendmail %r

返回首頁 Linux 架站筆記 - www.dreamer.cc


MRTG 懶惰蟲安裝法

更新時間：05/21/2003 15:51:02

說明

MRTG 主要是用來偵測主機上的資料流量，將流量繪製成漂亮的統計圖表。另外，我們也可以自行寫一些 SCRIPT，加掛於 MRTG 上，只要你提供給 MRTG 它兩個數值，它就可以做為流量的依據，幫我們產生統計圖表。

以下的步驟是使用本人修改過的設定檔來啟用 mrtg，除了原來的網路流量，尚可偵測 CPU 負載、記憶體負載、網站線上人數、FTP 線上人數及 SSH 線上人數及 TELNET 線上人數，適用於 Redhat Linux 7.3。

在偵測記憶體負載方面，本人已將緩衝區及快取所佔用的記憶體排除在外，這點可能有別於其它教學文章。因為 Linux 在執行上，並不會自動釋放這兩者所佔用的記憶體，如果併入計算，則在圖表上所看到的記憶體負載，將永遠居高不下，除非重新開機，否則不會有什麼起落。

安裝 ucd-snmp

  1. 檢查系統是否已安裝 perl,zlib,gd,libpng,mrtg 這五個模組，沒有的話，請自行安裝。
  2. 因為系統預設安裝的 ucd-snmp 在執行上有問題，所以請移除 ucd-snmp 及相關套件:
    apt-get remove ucd-snmp
  3. 從本站下載 ucd-snmp 的原始檔至 /tmp，並解壓縮:
    cd /tmp
wget http://www.dreamer.cc/source/mrtg/ucd-snmp-4.2.5.tar.gz
tar -zxvf ucd-snmp-4.2.5.tar.gz
  4. 開始安裝 ucd-snmp:
    cd ucd-snmp-4.2.5
./configure --prefix=/usr/local/snmp

    。
    。
    。
 ************** Configuration Section **************

You are about to be prompted with a series of questions. Answer
them carefully, as they determine how the snmp agent and related
applications are to function.

After the configure script finishes, you can browse the newly
created config.h file for further - less important - parameters to
modify. Be careful if you re-run configure though, since config.h will
be overwritten.

-Press return to continue- <按 "Enter" 繼續>

disabling above prompt for future runs... yes
checking System Contact Information...

*** System Contact Information:

Describes who should be contacted about the host the agent is
running on. This information is available in the MIB-II tree. This
can also be over-ridden using the "syscontact" syntax in the agent's
configuration files.

System Contact Information (root@domain.com): root@localhost
setting System Contact Information to... root@localhost
checking System Location...

*** System Location:

Describes the location of the system. This information is
available in the MIB-II tree. this can also be over-ridden using the
"syslocation" syntax in the agent's configuration files.

System Location (Unknown): RedHat 7.3
setting System Location to... RedHat 7.3
checking Location to write logfile...

*** Logfile location:

Enter the default location for the snmpd agent to dump
information & errors to. If not defined (enter the keyword "none"
at the prompt below) the agent will use stdout and stderr instead.
(Note: This value can be over-ridden using command line options.)

Location to write logfile (/var/log/snmpd.log): <按 "Enter" 繼續>
setting Location to write logfile to... /var/log/snmpd.log
checking Location to write persistent information...

*** snmpd persistent storage location:

Enter a directory for the snmp library to store persistent
data in the form of a configuration file.

Location to write persistent information (/var/ucd-snmp): <按 "Enter" 繼續>
setting Location to write persistent information to... /var/ucd-snmp
    。
    。
    。
  5. 繼續編譯檔案:
    make
make install
  6. 啟動 snmp:
    /usr/local/snmp/sbin/snmpd
  7. 要讓 snmp 在開機時啟動，請修改 /etc/rc.d/rc.local，加入:
    /usr/local/snmp/sbin/snmpd

安裝 mrtg

  1. 從本站下載 mrtg 的原始檔至 /var/www/html/，並解壓縮:
    cd /var/www/html
wget http://www.dreamer.cc/source/mrtg/mrtg-2.9.17-tw.tgz
tar -xzvf mrtg-2.9.17-tw.tgz
  2. 執行一次下列指令，產生流量統計圖 (執行時會產生錯誤訊息，忽略即可):
    /usr/bin/mrtg /var/www/html/mrtg/net/mrtg.cfg.net
/usr/bin/mrtg /var/www/html/mrtg/cpu/mrtg.cfg.cpu
/usr/bin/mrtg /var/www/html/mrtg/ram/mrtg.cfg.ram
/usr/bin/mrtg /var/www/html/mrtg/www/mrtg.cfg.www
/usr/bin/mrtg /var/www/html/mrtg/ftp/mrtg.cfg.ftp
/usr/bin/mrtg /var/www/html/mrtg/ssh/mrtg.cfg.ssh
/usr/bin/mrtg /var/www/html/mrtg/telnet/mrtg.cfg.telnet
  3. 編輯 /etc/crontab，依需求建立下列指令:
    #mrtg
*/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/net/mrtg.cfg.net > /dev/null 2>&1
*/3 * * * * root /usr/bin/mrtg /var/www/html/mrtg/cpu/mrtg.cfg.cpu > /dev/null 2>&1
*/3 * * * * root /usr/bin/mrtg /var/www/html/mrtg/ram/mrtg.cfg.ram > /dev/null 2>&1
*/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/www/mrtg.cfg.www > /dev/null 2>&1
*/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/ftp/mrtg.cfg.ftp > /dev/null 2>&1
*/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/ssh/mrtg.cfg.ssh > /dev/null 2>&1
*/5 * * * * root /usr/bin/mrtg /var/www/html/mrtg/telnet/mrtg.cfg.telnet > /dev/null 2>&1
  4. 連上你的網址看流量統計:
    http://host.domain.tld/mrtg/index.html

返回首頁 Linux 架站筆記 - www.dreamer.cc


NTP

更新時間：05/20/2003 16:51:25

說明

讓你校正系統的時間。

安裝 NTP 模組

檢查系統是否已安裝 ntp 這個套件，沒有的話，請使用 apt 自行安裝。

系統對時及定時執行

  1. 校正系統時間:
    ntpdate -s time.stdtime.gov.tw
hwclock --systohc
  2. 若要設定每天執行一次，可於 /etc/cron.daily 新增指令檔 "ntpdate"，內容如下:
    #!/bin/sh
ntpdate -s time.stdtime.gov.tw
hwclock --systohc
  3. 更改檔案屬性為 755:
    chmod 755 /etc/cron.daily/ntpdate

返回首頁 Linux 架站筆記 - www.dreamer.cc


安裝 Open WebMail 2.xx

更新時間：05/20/2003 17:09:46

安裝步驟

  1. 檢查系統是否已安裝 perl-CGI、perl-MIME-Base64、perl-libnet、perl-suidperl 這四個套件，沒有的話，請 使用 apt 自行安裝。
  2. 安裝 perl-Text-Iconv 模組:
    cd /tmp
wget http://openwebmail.org/openwebmail/download/redhat/rpm/packages/rh73/perl-Text-Iconv-1.2-RH73.i386.rpm
rpm -ivh perl-Text-Iconv-1.2-RH73.i386.rpm

  3. 下載並安裝 Open WebMail:
    cd /var/www
wget http://openwebmail.org/openwebmail/download/openwebmail-current.tgz
tar -xzvf openwebmail-current.tgz
mv data/openwebmail html
rm -rf data
執行完上列步驟，Open WebMail 的系統檔將存放在 /var/www/cgi-bin/openwebmail/，而相關網頁則放在 /var/www/html/openwebmail/。

參數設定

因為本主機的系統是 Redhat Linux 7.3，所以需修改 Open WebMail 下使用者登入的驗證方式及相關檔案之路徑。

  1. 修改使用者登入的驗證方式，請編輯 auth_unix.pl:
    $unix_passwdfile_encrypted à /etc/shadow
$unix_passwdmkdb à none
  2. 修改相關檔案的路徑及預設語系，請編輯 etc/openwebmail.conf:
    mailspool à /var/spool/mail
ow_cgidir à /var/www/cgi-bin/openwebmail
ow_htmldir à /var/www/html/openwebmail
spellcheck à /usr/bin/aspell
default_language à zh_TW.Big5
  3. 修改相關檔案的路徑及其它需求，請編輯 etc/openwebmail.conf.default (建議改成如下的設定):
    (049)ow_cgidir à /var/www/cgi-bin/openwebmail
(051)ow_htmldir à /var/www/html/openwebmail
(124)enable_webdisk à no
(125)enable_sshterm à no
(204)default_iconset à Cool3D.Chinese.Traditional
(206)default_bgrepeat à no
(207)default_fontsize à 11pt
(212)default_msgsperpage à 20
(234)default_sendbuttonposition à both
(236)default_replywithorigmsg à at_end
(271)default_webdisk_dirnumitems à 20
  4. 初始化 Open WebMail 相關資料庫:
    cgi-bin/openwebmail/openwebmail-tool.pl --init

安裝成功

  • 連上你的網站使用 Open WebMail:
    http://host.domain.tld/cgi-bin/openwebmail/openwebmail.pl

啟用自動回信功能

  • 將 vacation.pl 建立連結於 /etc/smrsh:
    ln -s /var/www/cgi-bin/openwebmail/vacation.pl /etc/smrsh/vacation.pl

每隔一個小時自動檢查 POP3 及行事曆

  • 於 /etc/crontab 加入:
    #openwebmail
30 */1 * * * root /var/www/cgi-bin/openwebmail/openwebmail-tool.pl -a -i -n -p -q

Open WebMail 載入程序

Open WebMail 的載入程序如下:
  1. 載入 etc/openwebmail.conf.default。
  2. 載入 etc/openwebmail.conf。
  3. 載入虛擬主機設定檔 etc/sites.conf/host.domain.tld。(如果有的話)
  4. 顯示登入畫面。
  5. 載入相關認證模組。
  6. 檢查 etc/mail/virtualtable，將登入的帳號配合網域名稱，對映到本機上的真實使用者。(如果有的話)
  7. 載入使用者設定檔 etc/users.conf/username。 (如果有的話)

由以上步驟可知，某些選項放到使用者設定檔是沒有效果的。而同樣的選項如果出現在不同的設定檔中，後面載入的會蓋掉前面的。

虛擬主機設定檔

  • 虛擬主機設定檔的建立方式就是將 etc/openwebmail.conf 複製到 etc/site.conf/host.doman.name:
    cd /var/www/cgi-bin/openwebmail/etc/sites.conf/
cp ../openwebmail.conf ./host.domain.tld
    然後再依該虛擬主機的需求編輯 host.domain.tld。

使用者設定檔

  • 使用者設定檔的建立方式就是將 etc/users.conf/SAMPLE 複製成 username:
    cd /var/www/cgi-bin/openwebmail/etc/users.conf/
cp SAMPLE username
    然後再依使用者的需求編輯 username。

啟用 SSH 及 WebDisk

  • 因為參數設定的第 3 個步驟已關閉了 SSH 及 WebDisk 的功能，如果要讓特定的主機成員或使用者擁有 SSH 及 WebDisk 的權限，可編輯 相關的虛擬主機設定檔 (etc/sites.conf/host.domain.tld) 或使用者設定檔 (etc/users.conf/username)，加入啟用 SSH 及 WebDisk 的項目即可：
    enable_webdisk yes
enable_sshterm yes

Open WebMail 中文說明

  • 中文說明請參閱 http://openwebmail.org/openwebmail/download/help/zh_TW.Big5/
  • 進階說明請參閱 http://turtle.ee.ncku.edu.tw/~tung/openwebmail/
  • 更新記錄 http://openwebmail.com/openwebmail/download/doc/changes.txt

返回首頁 Linux 架站筆記 - www.dreamer.cc


Open WebMail 2.0 懶惰蟲安裝法

更新時間：05/22/2003 16:33:10

說明

Open WebMail 是一套多功能的 WebMail 系統，除了支援多種系統認證之外，更增加 SSH 及 WebDisk 的功能。

以下的安裝步驟是下載本人修改的原始檔來安裝 Open WebMail，已更改所有路徑、中文語系及預設值，適用於 Redhat Linux 7.3。

安裝步驟

  1. 檢查系統是否已安裝 perl-CGI、perl-MIME-Base64、perl-libnet、perl-suidperl 這四個套件，沒有的話，請使用 apt 自行安裝。
  2. 安裝 perl-Text-Iconv 模組:
    cd /tmp
wget http://www.dreamer.cc/source/openwebmail/perl-Text-Iconv-1.2-RH73.i386.rpm
rpm -ivh perl-Text-Iconv-1.2-RH73.i386.rpm

  3. 從本站下載原始檔，並安裝 Open WebMail:
    cd /var/www
wget http://www.dreamer.cc/source/openwebmail/openwebmail-2.01-20030521-tw.tgz
tar -xzvf openwebmail-2.01-20030521-tw.tgz
  4. 初始化 Open WebMail 相關資料庫:
    cgi-bin/openwebmail/openwebmail-tool.pl --init

安裝完成

  • 連上你的網站使用 Open WebMail:
    http://host.domain.tld/cgi-bin/openwebmail/openwebmail.pl

返回首頁 Linux 架站筆記 - www.dreamer.cc

啟用自動回信功能

  • 將 vacation.pl 建立連結於 /etc/smrsh:
    ln -s /var/www/cgi-bin/openwebmail/vacation.pl /etc/smrsh/vacation.pl

每隔一個小時自動檢查 POP3 及行事曆

  • 於 /etc/crontab 加入:
    #openwebmail
30 */1 * * * root /var/www/cgi-bin/openwebmail/openwebmail-tool.pl -a -i -n -p -q


ProFTP

更新時間：05/07/2003 11:31:30

安裝 ProFTP 套件程式

  1. 移除 wu-ftpd 及 anonftp：
    apt-get remove anonftp
apt-get remove wu-ftpd
  2. 安裝 ProFtp：
    apt-get install proftpd
  3. 因為由 apt-get 安裝的 proftpd 同時啟用了 standalone 及 inetd 的啟動方式，而我只要保留 standalone，所以刪除 inetd 的啟動設定：
    rm -rf /etc/xinetd.d/proftpd

相關程式與設定檔

  1. /etc/proftpd.conf
    ProFTP 的設定檔。
  2. /etc/ftpuser
    設定不可用 FTP 登入的使用者 id，加入在該檔內的 id 將會被拒絕登入。
  3. /usr/sbin/ftpshut
    關閉 FTP 服務。關閉後，在 /etc 下會產生一個名稱為 "shutmsg" 的檔案，把它刪除即可恢復啟動狀態。
  4. /usr/bin/ftpcount
    查看目前連線數量。
  5. /usr/bin/ftpwho
    查看目前的連線者。

ProFTP 的設定檔參數

  • ServerName: 設定登入 FTP 主機要顯示的名稱
    ServerName	"Welcome to My FTP Server"
  • ServerType: 設定啟動型態。standalone | inetd
    ServerType	standalone
  • DefaultServer: 設定未知的連線是否由預設的主機來處理
    DefaultServer	on
  • Port: 設定啟動時要監聽哪個 port (若為啟動型態為"inetd"，則此設定會無效)
    Port		21
  • umask: 設定建立檔案目錄時，使用的權限遮罩 ("022" 代表 755)
    Umask		022
  • MaxInstances: 指定當啟動型態為 "standalone" 時，最多允許多少程序啟動。
    MaxInstances	20
  • User/Group: 設定啟動時切換的身份與群組
    User 		nobody
Group		nobody
  • AllowOverwrite: 設定是否可以覆寫檔案(預設是 off，可以適用於整體設定與目錄區段設定)
    AllowOverwrte	on
  • ServerIdent: 是否於使用者登入時顯示伺服器的類型
    ServerIdent	off
  • DefaultRoot: 指定特定使用者登入後的根目錄
    DefaultRoot	/var/www admin
    設定每個使用者登入後的根目錄("!" 後為排除的使用者)
    DefaultRoot	/var/www !admin
    限制每個使用者都登入在自己的家目錄("!" 後為排除的使用者)
    DefaultRoot	~ !admin
  • AllowStoreRestart: 允許上傳續傳
    AllowStoreRestart	on
  • DisplayLogin: 設定登入伺服器時，要顯示的內容(僅適用於 anonymous 與 VirtualHost)
    DisPlayLogin	welcome.msg
  • DisplayFirstChdir: 設定切換目錄時要顯示的內容(僅適用於 anonymous 與 VirtualHost)
    DisplayFirstChdir	.message
  • DisplayQuit: 設定結束連線時要顯示的內容(僅適用於 anonymous 與 VirtualHost)
    DisplayQuit	goodbye.msg
  • MaxClients: 設定伺服器最多允許多少個使用者(不同IP)登入，後面為超過數量時顯示的訊息
    MaxClients	5 "Sorry, max %m users -- try again later"
  • MaxClientsPerHost: 設定同一個 IP 的使用者最多能登入幾個程序
    MaxClientsPerHost	2
  • MaxLoginAttempts: 設定使用者嘗試登入失敗後幾次斷線
    MaxLoginAttempts	3
  • RateReadBPS: 限制每秒下載的速度(單位為 bytes)
    RateReadBPS	10240
  • RateWriteBPS: 限制每秒上傳的速度(單位為 bytes)
    RateWriteBPS	10240
  • RequireValidShell: 檢查使用者的 shell 程式是否合法
    RequireValidShell	on
  • RootLogin: 設定是否可以使用 root 帳號登入
    RootLogin	off
  • TimeoutLogin: 指定連線後多久沒有登入就斷線(秒)
    TimeoutLogin	100
  • TimeoutIdle: 設定登入主機後閒置多久就斷線(秒)
    TimeoutIdle	600
  • TimeoutNoTransfer: 設定多久沒傳輸資料就斷線(秒)
    TimeoutNoTransfer	600
  • UseHostsAllowFile: 指定允許連線的主機，指定檔案，其語法與 [/etc/hosts.allow] 一樣。
  • UseHostsDenyFile: 指定拒絕服務的連線主機，指定檔案，其語法與 [/etc/hosts.deny] 一樣。
  • Class: 定義一個類別(需要搭配 Classes on 時才有效)，語法: Class "name" limit | regex | ip)
    Class local limit 100
Class default limit 10
    Class local regex .*foo.com
    Class local ip 172.16.1.0/24

存取權限設定

ProFTP 的權限控管可針對一般使用者及匿名登入的使用者，匿名使用者的部分，是規範在 <Anonymous anonymous-path> ~ </Anonymous> 區段內。

設定方式與 apache 的 httpd.conf 類似，可指定 <Directory> ~ </Directory> 區段做設定。

目錄存取權限設定

  • <Directory path> ~ </Directory>: 指定某個目錄的存取設定
  • <LIMIT priv> ~ </LIMIT>: 設定該目錄的存取動作，priv 的方式如下:
    • ALL (identical to READ WRITE DIRS)
    • CWD (Change Working Directory)
    • DELE (DELEte)
    • DIRS
    • LOGIN
    • MKD (MaKe Directory)
    • READ (RETR, STAT)
    • RETR (RETRieve)
    • RMD (ReMove Directory)
    • RNFR (ReName FRom)
    • RNTO (ReName TO)
    • STOR (STORe)
    • WRITE (also include MKD and RMD)
  • 指定存取的權限
    • Allow [from] all | none | host1[,host2,...]
    • Deny [from] all | none | host[,host,...]
    • AllowAll
    • DenyAll
    • AllowUser UserName
    • AllowGroup GroupName
    • DenyUser UserName
    • DenyGroup GroupName
    • Order allow,deny | deny,allow
  • 使用範例
    <Directory /path>
    <Limit CWD>
        Order Allow,Deny
        Allow from 128.44.26.,128.44.26.
        Allow From myhost.mydomain.com
        Deny from all
    </Limit>
</Directory>

匿名區域開放上傳的設定範例

<Anonymous ~ftp>
    User ftp
    Group ftp
    UserAlias anonymous ftp
    MaxClients 5
    AnonRequirePassword off
    RequireValidShell off
    <Directory upload/>
        <Limit STOR CWD MKD>
            AllowAll
        </Limit>
        <Limit READ RMD DELE>
            DenyAll
        </Limit>
    </Directory>
</Anonymous>

返回首頁 Linux 架站筆記 - www.dreamer.cc


Quota 磁碟配額

更新時間：05/20/2003 17:01:49

啟用步驟

  1. 編輯 /etc/fstab，在欲啟用磁碟配額的分割區加入兩個參數 "usrquota" 及 "grpquota"，例如:
    LABEL=/home	/home	ext3	defaults		1 2
    改為
    LABEL=/home	/home	ext3	defaults,usrquota,grpquota	 1 2
  2. 重新啟動電腦:
    sync;sync;sync;reboot
  3. 掃瞄磁碟的使用狀況:
    quotacheck -avug
  4. 如果掃瞄成功，則會在該掛載的目錄產生 [aquota.group] 與 [aquota.user]。如果掃瞄失敗，可改用強制檢查的方式:
    quotacheck -avugm
  5. 啟動 quota:
    quotaon -av

編輯使用者的配額及寬限時間

這部份建議用 webmin 來編輯使用者的配額，過程會比較簡單。如果沒有 webmin 的話，可依下列步驟執行:

  1. 設定使用者的配額:
    edquota -u user1

Disk quotas for user user1 (uid 500):
  Filesystem	blocks	soft	hard		inodes	soft	hard
  /dev/sda3	16012	20480	24576		52	0	0
    以上的設定表示 user1 之額度為 20MB 的磁碟空間，超額可用到 24MB，但不限制該使用者可建立的檔案數量。 其中 "blocks" 是指該使用者已使用的磁碟配額(單位是 "KBytes")，"inodes" 是指該使用者目前已使用的檔案配額(單位是 "個")，其後所接的 "soft" 是設定給該使用者正常使用的額 度，而 "hard" 則是該使用者超額使用的最大額度，若其值有為 "0" 者，表示不限制額度。
  2. 將同樣的配額方式指定給其它使用者:
    edquota -p user1 -u user2
  3. 設定群組的配額:
    edquota -g group1
  4. 設定超額時的寬限時間:
    edquota -t

Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem	Block grace period	Inode grace period
  /dev/sda2	7days			7days
    以上的設定表示磁碟及檔案額度可超額使用的時間皆為 "7天"。其中 "Block grace period" 及 "Inode grace period" 分別是設定磁碟及檔案配額可超額使用的時間，可設定的單位有 "days","hours","minutes","seconds"。

其它

  1. 觀看使用者的配額
    quota -v user1
  2. 觀看群組的配額
    quota -vg group1
  3. 關閉 Quota
    quotaoff

返回首頁 Linux 架站筆記 - www.dreamer.cc


Redhat Linux 7.3 Packages

更新時間：05/07/2003 11:32:28

Amusements/Games

  1. Maelstrom
  2. chromium
  3. fortune-mod
  4. freeciv
  5. gnome-games
  6. gnuchess
  7. kdegames
  8. tuxracer
  9. xbill
  10. xpilot

Amusements/Graphics

  1. kdetoys
  2. xdaliclock
  3. xloadimage
  4. xlockmore
  5. xscreensaver
  6. xsnow
  7. xsri

Applications/Archiving

  1. ark
  2. cdrecord
  3. dump
  4. dvdrecord
  5. gtoaster
  6. koncd
  7. lha
  8. pax
  9. rmt
  10. sharutils
  11. taper
  12. unarj
  13. unzip
  14. zip

Applications/CPAN

  1. perl-Crypt-SSLeay
  2. perl-DateManip
  3. perl-Devel-Sysdump
  4. perl-Frontier-RPC
  5. perl-Time-HiRes
  6. perl-TimeDate

Applications/Communications

  1. ami-gnome
  2. dip
  3. efax
  4. epic
  5. gkermit
  6. gnome-pilot
  7. gnomeicu
  8. gnomemeeting
  9. isdn4k-utils-vboxgetty
  10. kfax
  11. licq
  12. licq-gnome
  13. licq-kde
  14. licq-qt
  15. licq-text
  16. lrzsz
  17. mgetty
  18. mgetty-sendfax
  19. mgetty-viewfax
  20. mgetty-voice
  21. minicom
  22. pilot-link
  23. sliplogin
  24. uucp

Applications/Databases

  1. db3-utils
  2. mysql
  3. mysql-devel
  4. mysql-server
  5. mysqlclient9
  6. postgresql
  7. postgresql-contrib
  8. postgresql-docs
  9. postgresql-jdbc
  10. postgresql-libs
  11. postgresql-odbc
  12. postgresql-perl
  13. postgresql-python
  14. postgresql-server
  15. postgresql-tcl
  16. postgresql-tk
  17. tora

Applications/Editors

  1. Abiword
  2. apel
  3. ddskk-xemacs
  4. emacs
  5. emacs-el
  6. emacs-leim
  7. emacspeak
  8. flim
  9. flim-xemacs
  10. gedit
  11. hexedit
  12. jed
  13. jed-common
  14. jed-xjed
  15. joe
  16. kedit
  17. khexedit
  18. nedit
  19. nvi-m17n-canna
  20. nvi-m17n-nocanna
  21. psgml
  22. quanta
  23. ruby-mode
  24. ruby-mode-xemacs
  25. semi
  26. semi-xemacs
  27. vim-X11
  28. vim-enhanced
  29. xemacs
  30. xemacs-el
  31. xemacs-info

Applications/Emulators

  1. wine

Applications/Engineering

  1. Guppi
  2. bc
  3. gnuplot
  4. kcalc
  5. kfract
  6. octave
  7. units

Applications/File

  1. kfile-pdf
  2. kfile-png
  3. ncompress
  4. perl-Digest-MD5
  5. perl-File-MMagic
  6. recode
  7. stat
  8. tree

Applications/Internet

  1. balsa
  2. cadaver
  3. curl
  4. dictd
  5. elinks
  6. elm
  7. ethereal
  8. ethereal-gnome
  9. exmh
  10. fetchmail
  11. fetchmailconf
  12. finger
  13. ftp
  14. ftpcopy
  15. gaim
  16. galeon
  17. gftp
  18. gnome-lokkit
  19. gq
  20. htdig
  21. htdig-web
  22. htmlview
  23. kdessh
  24. kdict
  25. kit
  26. kmail
  27. knewsticker
  28. knode
  29. korn
  30. kpf
  31. kppp
  32. kpppload
  33. ksirc
  34. ktalkd
  35. kxmlrpcd
  36. lftp
  37. lisa
  38. lynx
  39. mailman
  40. netamail
  41. new
  42. new-common
  43. new-xemacs
  44. micq
  45. mozilla
  46. mozilla-chat
  47. mozilla-dom-inspector
  48. mozilla-js-debugger
  49. mozilla-mail
  50. mozilla-nspr
  51. mozilla-nss
  52. mozilla-nss-devel
  53. mozilla-psm
  54. mrtg
  55. mtr
  56. mtr-gtk
  57. mutt
  58. nc
  59. ncftp
  60. netscape-common
  61. netscape-communicator
  62. netscape-navigator
  63. nmh
  64. openldap-clients
  65. openssh
  66. openssh-askpass
  67. openssh-askpass-gnome
  68. openssh-clients
  69. openssl-perl
  70. pan
  71. pine
  72. plugger
  73. rsh
  74. rsync
  75. slrn
  76. slrn-pull
  77. stunnel
  78. sylpheed
  79. talk
  80. tcpdump
  81. telnet
  82. tftp
  83. traceroute
  84. ttcp
  85. w3c-libwww-apps
  86. w3m
  87. w3m-el
  88. w3m-el-common
  89. w3m-el-xemacs
  90. webalizer
  91. wget
  92. whois
  93. wl
  94. wl-common
  95. wl-xemacs
  96. x3270-text
  97. x3270-x11
  98. xchat
  99. xtraceroute
  100. ytalk

Applications/Multimedia

  1. ImageMagick
  2. aumix
  3. aumix-x11
  4. awesfx
  5. cdda2wav
  6. cdp
  7. cdparanoia
  8. desktop-backgrounds
  9. dia
  10. ee
  11. extace
  12. festival
  13. gd-progs
  14. giftrans
  15. gimp
  16. gimp-data-extras
  17. gimp-devel
  18. gimp-perl
  19. gnome-audio
  20. gnome-media
  21. gphoto2
  22. grip
  23. gtkam
  24. gtkam-gimp
  25. kaboodle
  26. kamera
  27. kcoloredit
  28. kdeaddons-noatun
  29. kdemultimedia-arts
  30. kdemultimedia-kfile
  31. kdesdk-gimp
  32. kiconedit
  33. kmid
  34. kmidi
  35. kmix
  36. kooka
  37. kpaint
  38. kruler
  39. kscd
  40. ksnapshot
  41. kuickshow
  42. kview
  43. kviewshell
  44. libkscan
  45. libkscan-devel
  46. libungif-progs
  47. mikmod
  48. mpg321
  49. netpbm-progs
  50. noatun
  51. playmidi
  52. playmidi-X11
  53. smpeg-gtv
  54. sndconfig
  55. sox
  56. timidity++
  57. transfig
  58. vorbis-tools
  59. xawtv
  60. xcdroast
  61. xfig
  62. xine
  63. xmms
  64. xmms-gnome
  65. xmms-skins
  66. xsane
  67. xsane-gimp

Applications/Productivity

  1. MagicPoint
  2. evolution
  3. gnucash
  4. gnumeric
  5. ical
  6. jpilot
  7. karm
  8. kdepim
  9. kdepim-cellphone
  10. kdepim-pilot
  11. knotes
  12. mrproject
  13. wordtrans
  14. wordtrans-kde
  15. wordtrans-qt
  16. wordtrans-web

Applications/Publishing

  1. Omni
  2. VFlib2-VFjfm
  3. a2ps
  4. bg5ps
  5. cdlabelgen
  6. enscript
  7. freetype-utils
  8. ggv
  9. ghostscript
  10. ghostscript-fonts
  11. gimp-print-cups
  12. gphoto
  13. groff-gxditview
  14. groff-perl
  15. gv
  16. hpijs
  17. jadetex
  18. kdvi
  19. kghostview
  20. kljettool
  21. linuxdoc-tools
  22. mpage
  23. passivetex
  24. pnm2ppa
  25. psutils
  26. tetex
  27. tetex-afm
  28. tetex-doc
  29. tetex-dvilj
  30. tetex-dvips
  31. tetex-fonts
  32. tetex-latex
  33. tetex-xdvi
  34. textinfo
  35. watanabe-vf
  36. xmltex
  37. xpdf
  38. xpdf-chinese-simplified
  39. xpdf-chinese-traditional
  40. xpdf-japanese
  41. xpdf-korean

Applications/System

  1. FreeWnn
  2. FreeWnn-common
  3. Xdialig
  4. amanda
  5. amanada-client
  6. amanda-server
  7. anaconda
  8. anaconda-help
  9. anaconda-images
  10. anaconda-runtime
  11. apacheconf
  12. arpwatch
  13. auth_ldap
  14. autorun
  15. bind-utils
  16. bindconf
  17. bug-buddy
  18. cWnn
  19. cWnn-common
  20. cdrdao
  21. dbskkd-cdb
  22. ddskk
  23. dialog
  24. diskcheck
  25. dtach
  26. ethtool
  27. fbset
  28. firewall-config
  29. gkrellm
  30. gnome-utils
  31. gnorpm
  32. gnupg
  33. gtop
  34. hotplug-gtk
  35. hwbrowser
  36. iptraf
  37. ipxutils
  38. irda-utils
  39. isdn4k-utils
  40. isicom
  41. junkbuster
  42. kWnn
  43. kdf
  44. kfloppy
  45. klpq
  46. klprfax
  47. kon2
  48. kon2-fonts
  49. krbafs-utils
  50. kregexpeditor
  51. lm_sensors
  52. locale_config
  53. logwatch
  54. macutils
  55. magicdev
  56. mkisofs
  57. mkxauth
  58. mtools
  59. mtx
  60. ncpfs
  61. nmap
  62. nmap-frontend
  63. nut
  64. nut-cgi
  65. nut-client
  66. open
  67. patchutils
  68. procinof
  69. procps-X11
  70. psacct
  71. pvm-gui
  72. qtcups
  73. rdate
  74. rdist
  75. redhat-config-network
  76. redhat-config-users
  77. redhat-switch-printer
  78. redhat-switch-printer-gnome
  79. redhat-switchmail
  80. redhat-switchmail-gnome
  81. rhmask
  82. rpm2html
  83. rpmfind
  84. samba-client
  85. samba-common
  86. samba-swat
  87. sane-frontends
  88. screen
  89. serviceconf
  90. statserial
  91. sudo
  92. symlinks
  93. sysctlconfig
  94. sysstat
  95. tWnn
  96. tripwire
  97. ucd-snmp-utils
  98. usbview
  99. usermode-gtk
  100. vlock
  101. xcpustate
  102. xisdnload
  103. xmlto
  104. xosview
  105. xtoolwait
  106. zisofs-tools

Applications/Text

  1. aspell
  2. aspell-ca
  3. aspell-da
  4. aspell-de
  5. aspell-en-ca
  6. aspell-en-gb
  7. aspell-es
  8. aspell-fr
  9. aspell-it
  10. aspell-nl
  11. aspell-no
  12. aspell-pt
  13. aspell-pt_BR
  14. aspel-sv
  15. autoconvert
  16. autoconvert-xchat
  17. docbook-dtds
  18. docbook-style-dsssl
  19. docbook-style-xsl
  20. docbook-utils
  21. docbook-utils-pdf
  22. dos2unix
  23. gnome-spell
  24. h2ps
  25. indent
  26. kakasi
  27. kakasi-dict
  28. kcc
  29. kdoc
  30. lv
  31. m4
  32. namazu
  33. namazu-cgi
  34. nhpf
  35. nkf
  36. openjade
  37. perl-NKF
  38. perl-SGMLSpm
  39. perl-Text-Kakasi
  40. pspell
  41. pydict
  42. sgml-common
  43. stardict
  44. tamago
  45. unix2dos
  46. xml-common

Applications/Utilities

  1. kdesdk-kompare

Development/Debuggers

  1. ddd
  2. gdb
  3. kdbg
  4. lslk
  5. lsof
  6. ltrace
  7. memprof
  8. pstack
  9. strace
  10. sysreport

Development/Languages

  1. PyQt
  2. PyQt-devel
  3. PyQt-examples
  4. compat-egcs
  5. compat-egcs-c++
  6. compat-egcs-g77
  7. compat-egcs-objc
  8. cpp
  9. dev86
  10. eruby
  11. eruby-devel
  12. eruby-libs
  13. expect
  14. gcc
  15. gcc-c++
  16. gcc-chill
  17. gcc-g77
  18. gcc-java
  19. gcc-objc
  20. guile
  21. irb
  22. itcl
  23. jikes
  24. libgcj-devel
  25. librep
  26. librep-devel
  27. nasm
  28. nasm-doc
  29. perl-DBD-MySQL
  30. perl-DBD-Pg
  31. perl-DBI
  32. perl-suidperl
  33. php
  34. php-dbg
  35. php-imap
  36. php-ldap
  37. php-mysql
  38. php-odbc
  39. php-pgsql
  40. php-snmp
  41. pygnome
  42. pygnome-applet
  43. pygnome-capplet
  44. pygnome-devel
  45. pygnome-gtkhtml
  46. pygnome-libglade
  47. pygtk
  48. pygtk-devel
  49. pygtk-glarea
  50. pygtk-libglade
  51. pygtk2
  52. pygtk2-devel
  53. pygtk2-libglade
  54. python
  55. python2
  56. rep-gtk
  57. rep-gtk-gnome
  58. rep-gtk-libglade
  59. rpm-perl
  60. ruby
  61. ruby-devel
  62. ruby-tcltk
  63. tcl
  64. tclx
  65. tix
  66. tk
  67. tkinter
  68. tkinter2
  69. umb-scheme

Developemnt/Libraries

  1. 4Suite
  2. Canna-devel
  3. Distutils
  4. FreeWnn-devel
  5. GConf-devel
  6. Glide3-devel
  7. Guppi-devel
  8. ImageMagick-c++-devel
  9. ImageMagick-devel
  10. MySQL-python
  11. ORBit-devel
  12. PyXML
  13. SDL-devel
  14. SDL_image-devel
  15. SDL_mixer-devel
  16. SDL_net-devel
  17. VFlib2-devel
  18. Wnn6-SDK-devel
  19. XFree86-devel
  20. Xaw3d-devel
  21. ac-archive
  22. alchemist-devel
  23. amanda-devel
  24. apache-devel
  25. atrs-devel
  26. aspell-devel
  27. atk-devel
  28. audiofile-devel
  29. bind-devel
  30. blas
  31. bonobo-conf-devel
  32. bonobo-devel
  33. bridge-utils-devel
  34. bzip2-devel
  35. cWnn-devel
  36. cdparanoia-devel
  37. cdparanoia-libs
  38. cdrecord-devel
  39. compat-glibc
  40. compat-libs
  41. control-center-devel
  42. cups-devel
  43. curl-devel
  44. cyrus-sasl-devel
  45. db1-devel
  46. db2-devel
  47. dietlibs
  48. e2fsprogs-devel
  49. eel-devel
  50. esound-devel
  51. expat-devel
  52. fam-devel
  53. festival-devel
  54. freetype-devel
  55. g-wrap
  56. g-wrap-devel
  57. gal-devel
  58. gd-devel
  59. gdbm-devel
  60. gdk-pixbuf-devel
  61. glib-devel
  62. glib2-devel
  63. blibc-debug
  64. glibc-debug-static
  65. glibc-devel
  66. blibc-profile
  67. glut-devel
  68. gmp-devel
  69. gnome-core-devel
  70. gnome-games-devel
  71. gnome-libs-devel
  72. gnome-pilot-devel
  73. gnome-print-devel
  74. gnome-vfs-devel
  75. gnumeric-devel
  76. gphoto2-devel
  77. gpm-devel
  78. gsl-devel
  79. gtk+-devel
  80. gtk2-devel
  81. gtkhtml-devel
  82. guild-devel
  83. hesiod-devel
  84. imap-devel
  85. imlib-devel
  86. inn-devel
  87. isdn4k-utils-devel
  88. kWnn-devel
  89. kakasi-devel
  90. kde1-compat-devel
  91. kdebase-devel
  92. kdebindings-devel
  93. kdegames-devel
  94. kdelibs-devel
  95. kdemultimedia-devel
  96. kdenetwork-devel
  97. kdepim-devel
  98. koffice-devel
  99. krb5-devel
  100. krbafs-devel
  101. kregexpeditor-devel
  102. kudzu-devel
  103. kviewshell-devel
  104. lam
  105. lapack
  106. lesstif
  107. lesstif-devel
  108. libao-devel
  109. libdbi
  110. libdbi-dbd-mysql
  111. libdbi-dbd-pgsql
  112. libdbi-devel
  113. libesmtp-devel
  114. libghttp-devel
  115. libglade-devel
  116. libglade2-devel
  117. libgtop-devel
  118. libjpeg-devel
  119. libmad
  120. ligmng-devel
  121. libmng-static
  122. libogg-devel
  123. libole2-devel
  124. libpcap
  125. libpng-devel
  126. librsvg-devel
  127. libsigc++-devel
  128. libstdc++-devel
  129. libtabe-devel
  130. libtermcap-devel
  131. libtiff-devel
  132. libungif-devel
  133. libunicode-devel
  134. libusb-devel
  135. libuser-devel
  136. libvorbis-devel
  137. libxml-devel
  138. libxml2
  139. libxml2-devel
  140. libxml2-python
  141. libxslt
  142. libxslt-devel
  143. libxslt-python
  144. mm-devel
  145. modutils-devel
  146. mozilla-devel
  147. mozilla-nspr-devel
  148. mx
  149. namazu-devel
  150. nautilus-devel
  151. ncurses-devel
  152. netatalk-devel
  153. netpbm-devel
  154. newt-devel
  155. openh323-devel
  156. openldap-devel
  157. openmotif-devel
  158. openssl-devel
  159. pam-devel
  160. pango-devel
  161. parted-devel
  162. pciutils-devel
  163. pcre-devel
  164. perl-Archive-Tar
  165. perl-BSD-Resource
  166. perl-Bit-Vector
  167. perl-Date-Calc
  168. perl-TermReadKey
  169. php-devel
  170. pilot-link-devel
  171. postgresql-devel
  172. pspell-devel
  173. pump-devel
  174. pvm
  175. pwlib-devel
  176. python-clap
  177. python-devel
  178. python-popt
  179. python-xmlrpc
  180. python2-devel
  181. qt-devel
  182. qt-static
  183. qt1x-devel
  184. qt2-devel
  185. qt2-static
  186. readline-devel
  187. recode-devel
  188. rpm-devel
  189. rpm-python
  190. ruby-libs
  191. sane-backends-devel
  192. sip-devel
  193. slang-devel
  194. smpeg-devel
  195. sox-devel
  196. tcllib
  197. ucd-snmp-devel
  198. unixODBC-devel
  199. w3c-libwww-devel
  200. xdelta-devel
  201. xine-devel
  202. xmms-devel
  203. zlib-devel

Development/System

  1. glibc-kernheaders
  2. kernel-source
  3. libaio-devel
  4. lm_sensors-devel
  5. rpmdb-redhat
  6. rpmlint

Development/Tools

  1. ElectricFence
  2. alien
  3. asp2php
  4. asp2php-gtk
  5. autoconf
  6. autoconf253
  7. automake
  8. automake15
  9. binutils
  10. bison
  11. blt
  12. byacc
  13. cdecl
  14. cervisia
  15. cproto
  16. ctags
  17. cvs
  18. dejagnu
  19. diffstat
  20. dmalloc
  21. doxygen
  22. flex
  23. gettext
  24. glade
  25. glibc-utils
  26. gperf
  27. gtk-doc
  28. intltool
  29. kdesdk-kapptemplate
  30. kdesdk-kbabel
  31. kdesdk-kbugbuster
  32. kdesdk-kmtrace
  33. kdesdk-kspy
  34. kdevelop
  35. libtool
  36. libtool-libs13
  37. make
  38. nasm-rdoff
  39. njamd
  40. patch
  41. pccts
  42. pkgconfig
  43. pmake
  44. pychecker
  45. python-tools
  46. qt-designer
  47. qt2-desinger
  48. rcs
  49. rpm-build
  50. sip
  51. snavigator
  52. splint
  53. swig
  54. tmake
  55. xdelta

Documentation

  1. XFree86-doc
  2. apache-manual
  3. bash-doc
  4. blas-man
  5. gnome-user-docs
  6. kernel-doc
  7. lapack-man
  8. man-pages-cs
  9. man-pages-da
  10. man-pages-de
  11. man-pages-es
  12. man-pages-fr
  13. man-pages-it
  14. man-pages-ja
  15. man-pages-ko
  16. man-pages-pl
  17. man-pages-ru
  18. php-manual
  19. python-docs
  20. python2-docs
  21. ruby-docs
  22. sendmail-docs

System Environment/Base

  1. GConf
  2. VFlib2-conf-ja
  3. adjtimex
  4. alchemist
  5. authconfig-gtk
  6. bridge-utils
  7. chkfontpath
  8. dateconfig
  9. genromfs
  10. gnome-print
  11. hwcrypto
  12. iptables-ipv6
  13. jfsutils
  14. joystick
  15. kernel-utils
  16. krb5-workstation
  17. ksconfig
  18. libgnomeprint15
  19. lvm
  20. nss_ldap
  21. pam_krb5
  22. pam_smb
  23. pinfo
  24. redhat-lsb
  25. rhn-applet
  26. rhn_register
  27. rhn_register-gnome
  28. scrollkeeper
  29. shapecfg
  30. ttfprint
  31. up2date
  32. up2date-gnome
  33. wireless-tools
  34. yp-tools

System Environment/Daemons

  1. LPRng
  2. ORBit
  3. XFree86-xfs
  4. am-utils
  5. anonftp
  6. apache
  7. autofs
  8. bind
  9. bootparamd
  10. caching-nameserver
  11. cipe
  12. cleanfeed
  13. comsat
  14. cups
  15. cups-drivers
  16. cups-drivers-hpijs
  17. cups-drivers-pnm2ppa
  18. dhcp
  19. esound
  20. fam
  21. finger-server
  22. gated
  23. imap
  24. inews
  25. inn
  26. iscsi
  27. krb5-server
  28. mars-nwe
  29. mod_auth_any
  30. mod_auth_mysql
  31. mod_auth_pgsql
  32. mod_bandwidth
  33. mod_dav
  34. mod_perl
  35. mod_put
  36. mod_python
  37. mod_roaming
  38. mod_ssl
  39. mod_throttle
  40. netatalk
  41. netdump
  42. netdump-server
  43. nfs-utils
  44. nscd
  45. ntp
  46. openldap-servers
  47. openldap12
  48. openssh-server
  49. pidentd
  50. portmap
  51. postfix
  52. ppp
  53. printconf
  54. printconf-gui
  55. pump
  56. pxe
  57. radvd
  58. rarpd
  59. routed
  60. rp-pppoe
  61. rsh-server
  62. rusers
  63. rusers-server
  64. rwall
  65. rwall-server
  66. rwho
  67. samba
  68. sendmail-cf
  69. sendmail-devel
  70. squid
  71. talk-server
  72. tcp_wrappers
  73. telnet-server
  74. tftp-server
  75. tux
  76. ucd-snmp
  77. vsftpd
  78. wu-ftpd
  79. wvdial
  80. xinetd
  81. ypbind
  82. ypserv
  83. zebra

System Environment/Kernel

  1. kernel-BOOT
  2. kernel-bigmem
  3. kernel-debug
  4. kernel-pcmcia-cs
  5. kernel-smp

System Environment/Libraries

  1. Canna
  2. Canna-libs
  3. FreeWnn-libs
  4. Gtk-Perl
  5. ImageMagick-c++
  6. ImageMagick-perl
  7. MyODBC
  8. Omni-foomatic
  9. SDL
  10. SDL_image
  11. SDL_mixer
  12. SDL_net
  13. VFlib2
  14. WindowMaker-libs
  15. Wnn6-SDK
  16. XFree86-compat-libs
  17. XFree86-libs
  18. Xaw3d
  19. arts
  20. atk
  21. audiofile
  22. bonobo
  23. bonobo-conf
  24. compat-libstdc++
  25. cups-libs
  26. cyrus-sasl-gssapi
  27. db3-devel
  28. db3x
  29. eel
  30. expat
  31. foomatic
  32. freetype
  33. freetype-demos
  34. gal
  35. gd
  36. gdk-pixbuf
  37. gdk-pixbuf-gnome
  38. glib10
  39. blut
  40. gmp
  41. gnome-audio-extra
  42. gnome-core
  43. gnome-libs
  44. gnome-mime-data
  45. gnome-vfs
  46. gnome-vfs-extras
  47. gsl
  48. gtk+
  49. gtk+10
  50. gtk-engines
  51. gtk2
  52. gtkglarea
  53. gtkhtml
  54. imlib
  55. imlib-cfgeditor
  56. jcode.pl
  57. kde1-compat
  58. kde2-compat
  59. kdelibs
  60. kdemultimedia-libs
  61. kdenetwork-libs
  62. krbafs
  63. libaio
  64. libao
  65. libcap
  66. libelf
  67. libesmtp
  68. libgal19
  69. libgal7
  70. libgcj
  71. libghttp
  72. libglade
  73. libglade2
  74. libgtkhtml9
  75. libgtop
  76. libgtop-examples
  77. libjpeg
  78. ligjpeg6a
  79. libmng
  80. libogg
  81. libold2
  82. libpng
  83. librsvg
  84. libsigc++
  85. libtiff
  86. libtool-libs
  87. libungif
  88. libunicode
  89. libusb
  90. libvorbis
  91. libxml
  92. libxml10
  93. lockdev
  94. lockdev-devel
  95. m2crypto
  96. mm
  97. ncurses-c++-devel
  98. ncurses4
  99. netpbm
  100. nss_db
  101. nss_db-compat
  102. oaf
  103. oaf-devel
  104. openh323
  105. openmotif
  106. openmotif21
  107. openssl095a
  108. openssl096
  109. pango
  110. perl-HTML-Parser
  111. perl-HTML-Tagset
  112. perl-MIME-Base64
  113. perl-Parse-Yapp
  114. perl-Storable
  115. perl-URI
  116. perl-XML-Dumper
  117. perl-XML-Encoding
  118. perl-XML-Grove
  119. perl-XML-Parser
  120. perl-XML-Twig
  121. perl-libnet
  122. perl-libwww-perl
  123. perl-libxml-enno
  124. perl-libxml-perl
  125. pwlib
  126. qt
  127. qt-MySQL
  128. qt-ODBC
  129. qt-PostgreSQL
  130. qt-Xt
  131. qt1x
  132. qt1x-GL
  133. qt2
  134. qt2-Xt
  135. qtcups-devel
  136. readline2.2.1
  137. readline41
  138. sane-backends
  139. skkdic
  140. smpeg
  141. smpeg-xmms
  142. unixODBC
  143. unixODBC-kde
  144. w3c-libwww
  145. wine-devel

System Environment/Shells

  1. busybox
  2. busybox-anaconda
  3. mc
  4. pdksh
  5. sash
  6. zsh

User Interface/Desktops

  1. WindowMaker
  2. control-center
  3. fvwm2
  4. fvwm2-icons
  5. gnome-applets
  6. kcharselect
  7. kde-i18n-Afrikaans
  8. kde-i18n-Brazil
  9. kde-i18n-British
  10. kde-i18n-Catalan
  11. kde-i18n-Chinese
  12. kde-i18n-Chinese-Big5
  13. kde-i18n-Czech
  14. kde-i18n-Danish
  15. kde-i18n-Dutch
  16. kde-i18n-Estonian
  17. kde-i18n-Finnish
  18. kde-i18n-French
  19. kde-i18n-German
  20. kde-i18n-Greek
  21. kde-i18n-Hebrew
  22. kde-i18n-Hungarian
  23. kde-i18n-Icelandic
  24. kde-i18n-Italian
  25. kde-i18n-Japanese
  26. kde-i18n-Korean
  27. kde-i18n-Norwegian
  28. kde-i18n-Norwegian-Nynorsk
  29. kde-i18n-Polish
  30. kde-i18n-Portuguese
  31. kde-i18n-Romanian
  32. kde-i18n-Russian
  33. kde-i18n-Serbian
  34. kde-i18n-Slovak
  35. kde-i18n-Slovenian
  36. kde-i18n-Spanish
  37. kde-i18n-Swedish
  38. kde-i18n-Turkish
  39. kde-i18n-Ukrainian
  40. kdeaddons-kate
  41. kdeaddons-kicker
  42. kdeaddons-knewsticker
  43. kdeaddons-konqueror
  44. kdeadmin
  45. kdeartwork
  46. kdeartwork-kworldclock
  47. kdeartwork-locolor
  48. kdeartwork-screensavers
  49. kdebase
  50. kdebindings
  51. kdebindings-kmozilla
  52. kdepasswd
  53. kdeutils-laptop
  54. kjots
  55. koffice
  56. kontrol-panel
  57. ktimer
  58. nautilus
  59. nautilus-mozilla
  60. sawfish
  61. sawfish-themer
  62. switchdesk
  63. switchdesk-gnome
  64. switchdesk-kde
  65. vnc
  66. vnc-doc

User Interface/X

  1. XFree86
  2. XFree86-100dpi-fonts
  3. XFree86-75dpi-fonts
  4. XFree86-ISO8859-15-100dpi-fonts
  5. XFree86-ISO8869-15-75dpi-fonts
  6. XFree86-ISO8869-2-100dpi-fonts
  7. XFree86-ISO8869-2-75dbi-fonts
  8. XFree86-ISO8869-9-100dpi-fonts
  9. XFree86-ISO8869-9-75dpi-fonts
  10. XFree86-base-fonts
  11. XFree86-cyrillic-fonts
  12. XFree86-tools
  13. XFree86-truetype-fonts
  14. XFree86-twm
  15. XFree86-xdm
  16. XFree86-xf86cfg
  17. XFree86-xtrap-clients
  18. ami
  19. doxygen-doxywizard
  20. fonts-ISO8859-2
  21. fonts-ISO8859-2-100dpi
  22. fonts-ISO8859-2-75dpi
  23. fonts-ISO8859-2-Type1
  24. fonts-ISO8859-7
  25. fonts-ISO8859-7-100dpi
  26. fonts-ISO8859-7-75dpi
  27. fonts-ISO8859-7-Type1
  28. fonts-KOI8-R
  29. fonts-KOI8-R-100dpi
  30. fonts-KOI8-R-75dpi
  31. fonts-ja
  32. gdm
  33. glms
  34. gnome-kerberos
  35. gqview
  36. hanterm-xf
  37. im-sdk
  38. jisksp14
  39. jisksp16-1990
  40. kappa20
  41. kinput2-canna-wnn6
  42. knm_new
  43. kterm
  44. libtabe
  45. miniChinput
  46. rxvt
  47. skkinput
  48. taipeifonts
  49. ttfonts
  50. ttfonts-ja
  51. ttfonts-ko
  52. ttfonts-zh_CN
  53. ttfonts-zh_TW
  54. urw-fonts
  55. vnc-server
  56. wmapm
  57. wmclock
  58. wmix
  59. x3270
  60. xalf
  61. xcin
  62. xinitrc

User Interface/X Hardware Support

  1. Glide3
  2. XFree86-3DLabs
  3. XFree86-8514
  4. XFree86-AGX
  5. XFree86-FBDev
  6. XFree86-Mach32
  7. XFree86-Mach64
  8. XFree86-Mach8
  9. XFree86-Mono
  10. XFree86-P9000
  11. XFree86-S3
  12. XFree86-S3V
  13. XFree86-SVGA
  14. XFree86-VGA16
  15. XFree86-W32
  16. XFree86-Xnest
  17. XFree86-Xvfb
  18. XFree86-compat-modules
  19. Xconfigurator

返回首頁 Linux 架站筆記 - www.dreamer.cc


Redhat Linux 7.3 Packages

更新時間：05/07/2003 11:33:23

Amusements/Games

  1. chromium-0.9.12-13
    Chromium B.S.U. is a fast paced, arcade-style space shooter. linux/i386
  2. fortune-mod-1.0-20
    A program which will display a fortune. linux/i386
  3. freeciv-1.12.0-1
    The Freeciv multi-player strategy game. linux/i386
  4. gnome-games-1.4.0.1-5
    GNOME games. linux/i386
  5. gnuchess-4.0.pl80-8
    The GNU chess program. linux/i386
  6. kdegames-3.0.0-2
    K Desktop Environment - Games linux/i386
  7. Maelstrom-3.0.1-18
    A space combat game. linux/i386
  8. tuxracer-0.61-8
    Tux Racer. linux/i386
  9. xbill-2.0-16
    Stop Bill from loading his OS into all the computers. linux/i386
  10. xboard-4.2.3-2
    An X Window System graphical chessboard. linux/i386
  11. xpilot-4.4.3-5
    An X Window System based multiplayer aerial combat game. linux/i386

Amusements/Graphics

  1. kdetoys-3.0.0-3
    K Desktop Environment - Toys and Amusements linux/i386
  2. xdaliclock-2.18-8
    A clock for the X Window System. linux/i386
  3. xloadimage-4.1-21
    An X Window System based image viewer. linux/i386
  4. xlockmore-4.17.2-5
    An X terminal locking program. linux/i386
  5. xscreensaver-3.33-4
    A set of X Window System screensavers. linux/i386
  6. xsnow-1.42-3
    An X Window System based dose of Christmas cheer. linux/i386
  7. xsri-2.0.3-1
    A program for displaying images on the background for X. linux/i386

Applications/Archiving

  1. ark-3.0.0-4
    GUI frontend for handling archive files linux/i386
  2. cdrecord-1.10-11
    A command line CD/DVD recording program. linux/i386
  3. cpio-2.4.2-26
    A GNU archiving program. linux/i386
  4. dump-0.4b27-3
    Programs for backing up and restoring ext2/ext3 filesystems. linux/i386
  5. dvdrecord-0.1.2-1
    A command line CD/DVD recording program. linux/i386
  6. gtoaster-1.0beta5-2
    A versatile CD recording package for both sound and data linux/i386
  7. koncd-3.0.0-3
    Frontend for mastering and burning CDs linux/i386
  8. lha-1.14i-4
    An archiving and compression utility for LHarc format archives. linux/i386
  9. pax-3.0-1
    POSIX File System Archiver linux/i386
  10. rmt-0.4b27-3
    Provides certain programs with access to remote tape devices. linux/i386
  11. sharutils-4.2.1-9
    The GNU shar utilities for packaging and unpackaging shell archives. linux/i386
  12. taper-6.9b-4
    A menu-driven file backup system. linux/i386
  13. tar-1.13.25-4
    A GNU file archiving program. linux/i386
  14. unarj-2.43-10
    An uncompressor for .arj format archive files. linux/i386
  15. unzip-5.50-2
    A utility for unpacking zip files. linux/i386
  16. zip-2.3-12
    A file compression and packaging utility compatible with PKZIP. linux/i386

Applications/CPAN

  1. perl-DateManip-5.40-15
    DateManip module for perl (/disk1/nfs/CPAN/authors/id/S/SB/SBECK) linux/i386
  2. perl-libnet-1.0901-17
    libnet module for perl (/disk1/nfs/CPAN/modules/by-module/Net) linux/i386
  3. perl-URI-1.17-16
    URI module for perl (/disk1/nfs/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/URI) linux/i386
  4. perl-TimeDate-1.10-14
    TimeDate module for perl (/disk1/nfs/CPAN/modules/by-module/Time) linux/i386
  5. perl-Storable-1.0.14-15
    Storable module for perl (/disk1/nfs/CPAN/modules/by-module/Storable) linux/i386
  6. perl-Crypt-SSLeay-0.35-15
    Crypt-SSLeay module for perl (/disk1/nfs/CPAN/modules/by-category/14_Security_and_Encryption/Crypt) linux/i386
  7. perl-Devel-Symdump-2.01-15
    Devel-Symdump module for perl (Development_Support/Devel) linux/i386
  8. perl-Digest-MD5-2.16-15
    Digest-MD5 module for perl (/disk1/nfs/CPAN/modules/by-category/14_Security_and_Encryption/Digest) linux/i386
  9. perl-File-MMagic-1.13-14
    File-MMagic module for perl (/disk1/nfs/CPAN/modules/by-category/10_File_Names_Systems_Locking/File) linux/i386
  10. perl-Frontier-RPC-0.06-14
    Frontier-RPC module for perl (String_Lang_Text_Proc/Frontier) linux/i386
  11. perl-HTML-Tagset-3.03-14
    HTML-Tagset module for perl (World_Wide_Web_HTML_HTTP_CGI/HTML) linux/i386
  12. perl-libwww-perl-5.63-9
    libwww-perl module for perl (/disk1/nfs/CPAN/modules/by-module/WWW) linux/i386
  13. perl-libxml-enno-1.02-15
    libxml-enno module for perl (/disk1/nfs/CPAN/modules/by-module/XML) linux/i386
  14. perl-Parse-Yapp-1.05-15
    Parse-Yapp module for perl (/disk1/nfs/CPAN/modules/by-module/Parse) linux/i386
  15. perl-Time-HiRes-1.20-14
    Time-HiRes module for perl (Data_Type_Utilities/Time) linux/i386
  16. perl-XML-Parser-2.30-15
    XML-Parser module for perl (/disk1/nfs/CPAN/modules/by-module/XML) linux/i386

Applications/Communications

  1. ami-gnome-1.0.11-9
    Korean IMS AMI, GNOME Applet mode linux/i386
  2. dip-3.3.7o-23
    Handles the connections needed for dialup IP links. linux/i386
  3. efax-0.9-12
    A program for faxing using a Class 1, 2 or 2.0 fax modem. linux/i386
  4. epic-1.0.1-4
    An ircII chat client. linux/i386
  5. gkermit-1.0-9
    A utility for transferring files using the Kermit protocol. linux/i386
  6. gnome-pilot-0.1.64-3
    GNOME pilot programs linux/i386
  7. gnomeicu-0.96.1-3
    An ICQ client. linux/i386
  8. gnomemeeting-0.85.1-3
    A Gnome based H323 teleconferencing application linux/i386
  9. isdn4k-utils-vboxgetty-3.1-53
    ISDN voice box (getty). linux/i386
  10. kfax-3.0.0-5
    KDE Fax viewer linux/i386
  11. licq-1.1.0-0.cvs20020416.1
    An ICQ clone for online messaging. linux/i386
  12. licq-gnome-1.1.0-0.cvs20020416.1
    GNOME frontend for licq. linux/i386
  13. licq-kde-1.1.0-0.cvs20020416.1
    KDE frontend for licq. linux/i386
  14. licq-qt-1.1.0-0.cvs20020416.1
    Qt frontend for licq. linux/i386
  15. licq-text-1.1.0-0.cvs20020416.1
    Text mode frontend for licq. linux/i386
  16. lrzsz-0.12.20-12
    The lrz and lsz modem communications programs. linux/i386
  17. mgetty-1.1.28-3
    A getty replacement for use with data and fax modems. linux/i386
  18. mgetty-sendfax-1.1.28-3
    Provides support for sending faxes over a modem. linux/i386
  19. mgetty-viewfax-1.1.28-3
    An X Window System fax viewer. linux/i386
  20. mgetty-voice-1.1.28-3
    A program for using your modem and mgetty as an answering machine. linux/i386
  21. minicom-2.00.0-3
    A text-based modem control and terminal emulation program. linux/i386
  22. pilot-link-0.9.5-13
    File transfer utilities between Linux and PalmPilots. linux/i386
  23. sliplogin-2.1.1-12
    A login program for SLIP connections. linux/i386
  24. uucp-1.06.1-33.7.2
    The uucp utility for copying files between systems. linux/i386

Applications/Databases

  1. db3-utils-3.3.11-6
    Command line tools for managing Berkeley DB (version 3) databases. linux/i386
  2. mysql-3.23.49-3
    MySQL client programs and shared library. linux/i386
  3. mysql-devel-3.23.49-3
    Files for development of MySQL applications. linux/i386
  4. mysql-server-3.23.49-3
    The MySQL server and related files. linux/i386
  5. mysqlclient9-3.23.22-6
    MySQL client program and shared library linux/i386
  6. perl-DBI-1.21-1
    A database access API for perl linux/i386
  7. perl-DBD-MySQL-1.2219-6
    A MySQL interface for perl linux/i386
  8. perl-DBD-Pg-1.01-8
    A PostgresSQL interface for perl linux/i386
  9. postgresql-7.2.1-5
    PostgreSQL client programs and libraries. linux/i386
  10. postgresql-contrib-7.2.1-5
    Contributed source and binaries distributed with PostgreSQL linux/i386
  11. postgresql-docs-7.2.1-5
    Extra documentation for PostgreSQL linux/i386
  12. postgresql-jdbc-7.2.1-5
    Files needed for Java programs to access a PostgreSQL database. linux/i386
  13. postgresql-libs-7.2.1-5
    The shared libraries required for any PostgreSQL clients. linux/i386
  14. postgresql-odbc-7.2.1-5
    The ODBC driver needed for accessing a PostgreSQL DB using ODBC. linux/i386
  15. postgresql-perl-7.2.1-5
    Development module needed for Perl code to access a PostgreSQL DB. linux/i386
  16. postgresql-python-7.2.1-5
    Development module for Python code to access a PostgreSQL DB. linux/i386
  17. postgresql-server-7.2.1-5
    The programs needed to create and run a PostgreSQL server. linux/i386
  18. postgresql-tcl-7.2.1-5
    A Tcl client library, and the PL/Tcl procedural language for PostgreSQL. linux/i386
  19. postgresql-tk-7.2.1-5
    Tk shell and tk-based GUI for PostgreSQL. linux/i386
  20. tora-1.2.3-2
    A GUI-based database development program. linux/i386

Applications/Editors

  1. abiword-0.99.5-2
    The AbiWord word processor linux/i386
  2. apel-10.3-4
    A Portable Emacs Library linux/noarch
  3. ddskk-11.6.0-6
    Daredevil SKK - Simple Kana to Kanji conversion program for Emacs linux/noarch
  4. ddskk-xemacs-11.6.0-6
    Daredevil SKK - Simple Kana to Kanji conversion program for XEmacs linux/noarch
  5. emacs-21.2-2
    The libraries needed to run the GNU Emacs text editor. linux/i386
  6. emacs-el-21.2-2
    The sources for elisp programs included with Emacs. linux/i386
  7. emacs-leim-21.2-2
    Emacs Lisp code for input methods for international characters. linux/i386
  8. emacspeak-15.0-4
    emacspeak -- The Complete Audio Desktop linux/i386
  9. flim-1.14.3-4
    Library to provide basic features about message for Emacs linux/noarch
  10. flim-xemacs-1.14.3-4
    Library to provide basic features about message for XEmacs linux/noarch
  11. gedit-0.9.7-8
    gEdit is a small but powerful text editor for GNOME. linux/i386
  12. hexedit-1.2.2-3
    A hexadecimal file viewer and editor. linux/i386
  13. jed-0.99.14-2
    A fast, compact editor based on the S-Lang screen library. linux/i386
  14. jed-common-0.99.14-2
    Files needed by any Jed text editor. linux/i386
  15. jed-xjed-0.99.14-2
    The X Window System version of the Jed text editor. linux/i386
  16. joe-2.9.7-4
    An easy to use, modeless text editor. linux/i386
  17. kedit-3.0.0-4
    An easy to use text editor linux/i386
  18. khexedit-3.0.0-4
    Hex editor linux/i386
  19. nedit-5.2-2
    A GUI text editor for systems with X and Motif. linux/i386
  20. nvi-m17n-1.79-20011024.2
    Common files for the nvi multilingualized text editor. linux/i386
  21. nvi-m17n-canna-1.79-20011024.2
    The nvi multiligualized text editor with support for Canna. linux/i386
  22. nvi-m17n-nocanna-1.79-20011024.2
    The nvi multiligualized text editor without support for Canna. linux/i386
  23. psgml-1.2.3-3
    A GNU Emacs major mode for editing SGML documents. linux/noarch
  24. quanta-2.1-0.cvs20020404.2
    An HTML editor for KDE. linux/i386
  25. ruby-mode-1.6.7-2
    Emacs Lisp ruby-mode for the scripting language Ruby linux/i386
  26. ruby-mode-xemacs-1.6.7-2
    Emacs Lisp ruby-mode for the scripting language Ruby linux/i386
  27. semi-1.14.3-11
    A library which provides MIME features for Emacs linux/noarch
  28. semi-xemacs-1.14.3-11
    A library which provides MIME features for XEmacs linux/noarch
  29. vim-common-6.1-2
    The common files needed by any version of the VIM editor. linux/i386
  30. vim-enhanced-6.1-2
    A version of the VIM editor which includes recent enhancements. linux/i386
  31. vim-minimal-6.1-2
    A minimal version of the VIM editor. linux/i386
  32. vim-X11-6.1-2
    The VIM version of the vi editor for the X Window System. linux/i386
  33. xemacs-21.4.6-7
    An X Window System based version of GNU Emacs. linux/i386
  34. xemacs-el-21.4.6-7
    The .el source files for XEmacs. linux/i386
  35. xemacs-info-21.4.6-7
    Information files for XEmacs. linux/i386

Applications/Emulators

  1. wine-20020327-1
    A Windows 16/32 bit emulator. linux/i386

Applications/Engineering

  1. bc-1.06-8
    GNU's bc (a numeric processing language) and dc (a calculator). linux/i386
  2. gnuplot-3.7.1-17
    A program for plotting mathematical expressions and data. linux/i386
  3. Guppi-0.40.3-5
    GNOME Data Analysis and Visualization. linux/i386
  4. kcalc-3.0.0-4
    KDE pocket calculator linux/i386
  5. kfract-3.0.0-5
    KDE Fractal Generator linux/i386
  6. octave-2.1.35-4
    A high-level language for numerical computations. linux/i386
  7. units-1.74-1
    A utility for converting amounts from one unit to another. linux/i386

Applications/File

  1. bzip2-1.0.2-2
    A file compression utility. linux/i386
  2. file-3.37-5
    A utility for determining file types. linux/i386
  3. fileutils-4.1-10
    The GNU versions of common file management utilities. linux/i386
  4. findutils-4.1.7-4
    The GNU versions of find utilities (find and xargs). linux/i386
  5. gzip-1.3.3-1
    The GNU data compression program. linux/i386
  6. kfile-pdf-3.0.0-5
    KFile module for reading PDF file information linux/i386
  7. kfile-png-3.0.0-5
    KFile module for reading PNG file information linux/i386
  8. ncompress-4.2.4-28
    Fast compression and decompression utilities. linux/i386
  9. recode-3.6-4
    Conversion between character sets and surfaces. linux/i386
  10. slocate-2.6-1
    Finds files on a system via a central database. linux/i386
  11. stat-2.5-5
    A tool for finding out information about a specified file. linux/i386
  12. tree-1.2-17
    A utility which displays a tree view of the contents of directories. linux/i386

Applications/Internet

  1. balsa-1.2.4-1
    An email client for GNOME. linux/i386
  2. cadaver-0.19.1-3
    A command-line WebDAV client. linux/i386
  3. curl-7.9.5-2
    A utility for getting files from remote servers (FTP, HTTP, and others). linux/i386
  4. dictd-1.5.5-1
    DICT protocol (RFC 2229) command-line client linux/i386
  5. elinks-0.3.0-1
    text mode www browser with support for frames linux/i386
  6. elm-2.5.6-2
    The elm mail user agent. linux/i386
  7. ethereal-0.9.3-3
    Network traffic analyzer linux/i386
  8. ethereal-gnome-0.9.3-3
    Red Hat Gnome integration for ethereal and ethereal-usermode linux/i386
  9. exmh-2.4-2
    The exmh mail handling system. linux/noarch
  10. fetchmail-5.9.0-5
    A remote mail retrieval and forwarding utility. linux/i386
  11. fetchmailconf-5.9.0-5
    A GUI utility for configuring your fetchmail preferences. linux/i386
  12. finger-0.17-9
    The finger client. linux/i386
  13. ftp-0.17-13
    The standard UNIX FTP (File Transfer Protocol) client. linux/i386
  14. ftpcopy-0.3.9-1
    A mirroring tool. linux/i386
  15. gaim-0.53-1
    A GTK+ clone of the AOL Instant Messenger client. linux/i386
  16. galeon-1.2.0-7
    Gnome browser based on Gecko (Mozilla rendering engine). linux/i386
  17. gftp-2.0.11-2
    A multi-threaded FTP client for the X Window System. linux/i386
  18. gnome-lokkit-0.50-8
    A firewall configuration application for an average end user. linux/i386
  19. gq-0.4.0-5
    A graphical LDAP directory browser and editor. linux/i386
  20. htdig-3.2.0-2.011302
    ht://Dig - Web search engine linux/i386
  21. htdig-web-3.2.0-2.011302
    Scripts and HTML code needed for using ht://Dig as a web search engine linux/i386
  22. htmlview-2.0.0-1
    A script which calls an installed HTML viewer. linux/noarch
  23. kdessh-3.0.0-4
    KDE frontend to ssh linux/i386
  24. kdict-3.0.0-4
    A DICT (net dictionary) client for KDE linux/i386
  25. kit-3.0.0-4
    KIT - An AIM client for KDE linux/i386
  26. kmail-3.0.0-4
    A mail client for KDE linux/i386
  27. knewsticker-3.0.0-4
    A News Ticker for KDE linux/i386
  28. knode-3.0.0-4
    A newsgroup (NNTP) reader for KDE linux/i386
  29. korn-3.0.0-4
    Multi-folder new mail monitor for KDE linux/i386
  30. kpf-3.0.0-4
    KDE Public Fileserver linux/i386
  31. kppp-3.0.0-4
    K Desktop Environment - PPP Network Applications linux/i386
  32. kpppload-1.04-36
    A PPP connection load monitor for KDE. linux/i386
  33. ksirc-3.0.0-4
    IRC client for KDE linux/i386
  34. ktalkd-3.0.0-4
    Talk (chat) protocol implementation for KDE linux/i386
  35. kxmlrpcd-3.0.0-4
    Remote scripting capability for KDE linux/i386
  36. lftp-2.4.9-1
    A sophisticated file transfer program linux/i386
  37. lisa-3.0.0-4
    LAN browser linux/i386
  38. lokkit-0.50-8
    Firewall configuration application for an average end user. linux/i386
  39. lynx-2.8.4-18
    A text-based Web browser. linux/i386
  40. mailman-2.0.9-1
    Mailing list manager with built in Web access. linux/i386
  41. mailx-8.1.1-22
    The /bin/mail program for sending e-mail messages. linux/i386
  42. metamail-2.7-28
    A program for handling multimedia mail using the mailcap file. linux/i386
  43. mew-2.2-2
    Mew - Messaging in the Emacs World. linux/i386
  44. mew-common-2.2-2
    Mew - Common files of Messagin in the Emacs World linux/i386
  45. mew-xemacs-2.2-2
    Mew - Messaging in the Emacs World for XEmacs linux/i386
  46. micq-0.4.6.p1-2
    A clone of the Mirabilis ICQ online messaging program. linux/i386
  47. mozilla-0.9.9-7
    A Web browser. linux/i386
  48. mozilla-chat-0.9.9-7
    IRC client integrated with Mozilla. linux/i386
  49. mozilla-mail-0.9.9-7
    A Mozilla-based mail client. linux/i386
  50. mozilla-nspr-0.9.9-7
    Netscape Portable Runtime linux/i386
  51. mozilla-nss-0.9.9-7
    Network Security Services linux/i386
  52. mozilla-psm-0.9.9-7
    SSL support for Mozilla. linux/i386
  53. mozilla-dom-inspector-0.9.9-7
    A tool for inspecting the DOM of pages in Mozilla. linux/i386
  54. mozilla-js-debugger-0.9.9-7
    JavaScript debugger for use with Mozilla linux/i386
  55. mozilla-nss-devel-0.9.9-7
    Development Libraries for Network Security Services linux/i386
  56. mrtg-2.9.17-3
    Multi Router Traffic Grapher linux/i386
  57. mtr-0.49-1
    A network diagnostic tool. linux/i386
  58. mtr-gtk-0.49-1
    The GTK+ interface for mtr. linux/i386
  59. mutt-1.2.5.1-1
    A text mode mail user agent. linux/i386
  60. nc-1.10-11
    Reads and writes data across network connections using TCP or UDP. linux/i386
  61. ncftp-3.1.3-3
    An improved FTP client. linux/i386
  62. netscape-common-4.79-1
    Files shared by Netscape Navigator and Communicator. linux/i386
  63. netscape-communicator-4.79-1
    The Netscape Communicator suite of tools. linux/i386
  64. netscape-navigator-4.79-1
    The Netscape Navigator Web browser. linux/i386
  65. nmh-1.0.4-9
    A capable mail handling system with a command line interface. linux/i386
  66. openldap-clients-2.0.23-4
    Client programs for OpenLDAP. linux/i386
  67. openssh-3.1p1-3
    The OpenSSH implementation of SSH. linux/i386
  68. openssh-askpass-3.1p1-3
    A passphrase dialog for OpenSSH and X. linux/i386
  69. openssh-clients-3.1p1-3
    OpenSSH clients. linux/i386
  70. openssh-askpass-gnome-3.1p1-3
    A passphrase dialog for OpenSSH, X, and GNOME. linux/i386
  71. openssl-perl-0.9.6b-18
    Perl scripts provided with OpenSSL. linux/i386
  72. pan-0.11.2-2
    A GNOME/GTK+ news reader for X. linux/i386
  73. pine-4.44-7
    A commonly used, MIME compliant mail and news reader. linux/i386
  74. plugger-4.0-6
    A generic netscape plug-in linux/i386
  75. rsh-0.17-5
    Clients for remote access commands (rsh, rlogin, rcp). linux/i386
  76. rsync-2.5.4-2
    A program for synchronizing files over a network. linux/i386
  77. slrn-0.9.7.4-1
    A threaded Internet news reader. linux/i386
  78. slrn-pull-0.9.7.4-1
    Offline news reading support for the SLRN news reader. linux/i386
  79. stunnel-3.22-1
    An SSL-encrypting socket wrapper. linux/i386
  80. sylpheed-0.7.3-1
    A GTK+ based, lightweight, and fast email client. linux/i386
  81. talk-0.17-12
    Talk client for one-on-one Internet chatting. linux/i386
  82. tcpdump-3.6.2-12
    A network traffic monitoring tool. linux/i386
  83. telnet-0.17-20
    The client program for the telnet remote login protocol. linux/i386
  84. tftp-0.28-2
    The client for the Trivial File Transfer Protocol (TFTP). linux/i386
  85. traceroute-1.4a12-2
    Traces the route taken by packets over a TCP/IP network. linux/i386
  86. ttcp-1.12-2
    A tool for testing TCP connections. linux/i386
  87. w3c-libwww-apps-5.3.2-5
    Applications built using Libwww web library: e.g. Robot, command line tool, etc. linux/i386
  88. w3m-el-1.2.6-1
    W3m interface for Emacs linux/i386
  89. w3m-0.3-1
    A pager with Web browsing abilities. linux/i386
  90. w3m-el-common-1.2.6-1
    Common files for W3m interface of emacsen linux/i386
  91. w3m-el-xemacs-1.2.6-1
    W3m interface for XEmacs linux/i386
  92. webalizer-2.01_10-1
    A flexible Web server log file analysis program. linux/i386
  93. wget-1.8.1-4
    A utility for retrieving files using the HTTP or FTP protocols. linux/i386
  94. whois-1.0.10-1
    Internet whois/nicname client. linux/i386
  95. wl-2.8.1-5
    An IMAP4, POP, and NNTP client for GNU Emacs. linux/noarch
  96. wl-common-2.8.1-5
    An IMAP4, POP, and NNTP client for XEmacs. linux/noarch
  97. wl-xemacs-2.8.1-5
    An IMAP4, POP, and NNTP client for XEmacs. linux/noarch
  98. x3270-3.2.18-2
    An X Window System based IBM 3278/3279 terminal emulator. linux/i386
  99. x3270-text-3.2.18-2
    IBM 3278/3279 terminal emulator for text mode. linux/i386
  100. x3270-x11-3.2.18-2
    IBM 3278/3279 terminal emulator for the X Window System. linux/i386
  101. xchat-1.8.8-5
    A GTK+ IRC (chat) client. linux/i386
  102. xtraceroute-0.9.0-6
    An X and GTK+ based graphical display of traceroute's output. linux/i386
  103. ytalk-3.1.1-7
    A chat program for multiple users. linux/i386

Applications/Multimedia

  1. aumix-2.7-8
    An ncurses-based audio mixer. linux/i386
  2. aumix-X11-2.7-8
    An X11-based audio mixer linux/i386
  3. awesfx-0.4.3a-8
    Utility programs for the AWE32 sound driver. linux/i386
  4. cdda2wav-1.10-11
    A utility for sampling/copying .wav files from digital audio CDs. linux/i386
  5. cdp-0.33-22
    An interactive text-mode program for playing audio CD-ROMs. linux/i386
  6. cdparanoia-alpha9.8-8
    A Compact Disc Digital Audio (CDDA) extraction tool (or ripper). linux/i386
  7. desktop-backgrounds-1.1-4
    Desktop background images. Linux/noarch
  8. dia-0.88.1-3
    A diagram drawing program. linux/i386
  9. ee-0.3.12-5
    The Electric Eyes image viewer application. linux/i386
  10. extace-1.5.1-3
    A GNOME sound displayer. linux/i386
  11. festival-1.4.2-3
    A free speech synthesizer linux/i386
  12. gd-progs-1.8.4-4
    Utility programs that use libgd. linux/i386
  13. giftrans-1.12.2-11
    A program for making transparent GIFs from non-transparent GIFs. linux/i386
  14. gimp-1.2.3-4
    The GNU Image Manipulation Program. linux/i386
  15. gimp-devel-1.2.3-4
    The GIMP plug-in and extension development kit. linux/i386
  16. gimp-perl-1.2.3-4
    Perl extensions and plug-ins for the GIMP. linux/i386
  17. gimp-data-extras-1.2.0-4
    Extra files for the GIMP. linux/noarch
  18. gnome-audio-1.4.0-1
    Sounds for GNOME events. linux/noarch
  19. gnome-media-1.2.3-4
    GNOME media programs. linux/i386
  20. gphoto2-2.0-4
    Software for accessing digital cameras linux/i386
  21. grip-2.96-2
    A GTK+ based front-end for CD rippers and MP3 encoders. linux/i386
  22. gtkam-0.1.3-0.cvs20020225.2
    A GTK front-end for gPhoto2 linux/i386
  23. gtkam-gimp-0.1.3-0.cvs20020225.2
    GIMP plug-in for digital camera access through gPhoto2 linux/i386
  24. ImageMagick-5.4.3.11-1
    An X application for displaying and manipulating images. linux/i386
  25. kaboodle-3.0.0-3
    A KDE media player linux/i386
  26. kamera-3.0.0-5
    Digital camera support for KDE linux/i386
  27. kcoloredit-3.0.0-5
    KDE palette editor and color chooser linux/i386
  28. kdeaddons-noatun-3.0.0-4
    Plugins extending the functionality of the noatun media player linux/i386
  29. kdemultimedia-arts-3.0.0-3
    Additional functionality for the aRts sound system linux/i386
  30. kdemultimedia-kfile-3.0.0-3
    KFile support for audio files linux/i386
  31. kdesdk-gimp-3.0.0-5
    KDE palette for GIMP linux/i386
  32. kiconedit-3.0.0-5
    An icon editor for creating KDE icons linux/i386
  33. kmid-3.0.0-3
    A MIDI player (using the soundcard's sequencer functionality) linux/i386
  34. kmidi-3.0.0-3
    A MIDI player (converting to digital audio) linux/i386
  35. kmix-3.0.0-3
    KDE sound mixer applet linux/i386
  36. kooka-3.0.0-5
    KDE scanner application linux/i386
  37. kpaint-3.0.0-5
    A simple paint program for KDE linux/i386
  38. kruler-3.0.0-5
    A screen ruler and color measurement tool linux/i386
  39. kscd-3.0.0-3
    Audio-CD player for KDE linux/i386
  40. ksnapshot-3.0.0-5
    A KDE applet for taking snapshots of the desktop linux/i386
  41. kuickshow-3.0.0-5
    Quick picture viewer for KDE linux/i386
  42. kview-3.0.0-5
    KDE Image Viewer linux/i386
  43. kviewshell-3.0.0-5
    Plugin integration for KView linux/i386
  44. libkscan-3.0.0-5
    KDE library for scanner support. linux/i386
  45. libkscan-devel-3.0.0-5
    Development files for libkscan linux/i386
  46. libungif-progs-4.1.0-10
    Programs for manipulating GIF format image files. linux/i386
  47. mikmod-3.1.6-12
    A MOD music file player. linux/i386
  48. mpg321-0.2.9-3
    An MPEG audio player. linux/i386
  49. netpbm-progs-9.24-3
    Tools for manipulating graphics files in netpbm supported formats. linux/i386
  50. noatun-3.0.0-3
    A KDE media player linux/i386
  51. playmidi-2.4-16
    A MIDI sound file player. linux/i386
  52. playmidi-X11-2.4-16
    An X Window System based MIDI sound file player. linux/i386
  53. smpeg-gtv-0.4.4-9
    A simple MPEG video and audio player linux/i386
  54. sndconfig-0.68-1
    The Red Hat Linux sound configuration tool. linux/i386
  55. sox-12.17.3-4
    A general purpose sound file conversion tool. linux/i386
  56. timidity++-2.11.3-1
    A software wavetable MIDI synthesizer. linux/i386
  57. transfig-3.2.3d-2
    A utility for converting FIG files (made by xfig) to other formats. linux/i386
  58. vorbis-tools-1.0rc3-3
    The Vorbis General Audio Compression Codec tools. linux/i386
  59. xawtv-3.73-3
    A TV application for video4linux compliant devices. linux/i386
  60. xcdroast-0.98a9-8
    An X Window System based tool for creating CDs. linux/i386
  61. xfig-3.2.3d-3
    An X Window System tool for drawing basic vector graphics. linux/i386
  62. xine-0.9.8-4
    A free video player. linux/i386
  63. xmms-1.2.7-1
    An MP3 player for X which resembles Winamp. linux/i386
  64. xmms-gnome-1.2.7-1
    A GNOME panel applet for the Xmms multimedia player. linux/i386
  65. xmms-skins-1.2.7-1
    Skins for the xmms multimedia player. linux/i386
  66. xsane-0.84-2
    An X Window System front-end for the SANE scanner interface. linux/i386
  67. xsane-gimp-0.84-2
    A GIMP plug-in which provides the SANE scanner interface. linux/i386

Applications/Productivity

  1. evolution-1.0.3-4
    GNOME's next-generation groupware suite linux/i386
  2. gnucash-1.6.6-3
    GnuCash is an application to keep track of your finances. linux/i386
  3. gnumeric-1.0.5-3
    A spreadsheet program for GNOME. linux/i386
  4. ical-2.2-26
    An X Window System-based calendar program. linux/i386
  5. jpilot-0.99-87
    Jpilot pilot desktop software linux/i386
  6. karm-3.0.0-3
    Time tracking tool linux/i386
  7. kdepim-3.0.0-3
    PIM (Personal Information Manager) for KDE linux/i386
  8. kdepim-cellphone-3.0.0-3
    KDE support for synchronizing data with cellphones linux/i386
  9. kdepim-pilot-3.0.0-3
    KDE support for synchronizing data with a Palm(tm) or compatible PDA linux/i386
  10. knotes-3.0.0-3
    Post-It notes on the desktop linux/i386
  11. MagicPoint-1.09a-1
    X based presentation software. linux/i386
  12. mrproject-0.5.1-8
    MrProject linux/i386
  13. wordtrans-1.1pre8-10
    Multi Language Word Translator for Linux linux/i386
  14. wordtrans-kde-1.1pre8-10
    KDE front-end for wordtrans linux/i386
  15. wordtrans-qt-1.1pre8-10
    Qt front-end for wordtrans linux/i386
  16. wordtrans-web-1.1pre8-10
    Web front-end for wordtrans linux/i386

Applications/Publishing

  1. a2ps-4.13b-19
    Converts text and other types of files to PostScript(TM). linux/i386
  2. bg5ps-1.3.0-7
    Converts Big5 encoded Chinese into printable postscript. linux/i386
  3. cdlabelgen-1.5.0-11
    Generates frontcards and traycards for inserting in CD jewelcases. linux/noarch
  4. enscript-1.6.1-19
    A plain ASCII to PostScript converter. linux/i386
  5. ggv-1.0.2-4
    GNOME Ghostview (ggv) is a frontend for Ghostscript linux/i386
  6. ghostscript-6.52-8
    A PostScript(TM) interpreter and renderer. linux/i386
  7. ghostscript-fonts-5.50-3
    Fonts for the Ghostscript PostScript(TM) interpreter. Linux/noarch
  8. gimp-print-cups-4.2.0-9
    CUPS drivers for Canon, Epson, HP and compatible printers linux/i386
  9. gphoto-0.4.3-17
    Digital camera software. linux/i386
  10. groff-1.17.2-12
    A document formatting system. linux/i386
  11. groff-gxditview-1.17.2-12
    An X previewer for groff text processor output. linux/i386
  12. groff-perl-1.17.2-12
    Parts of the groff formatting system that require Perl. linux/i386
  13. gv-3.5.8-15
    A X front-end for the Ghostscript PostScript(TM) interpreter. linux/i386
  14. hpijs-1.0.2-8
    HP Printer Drivers linux/i386
  15. jadetex-3.12-2
    TeX macros used by Jade TeX output. linux/noarch
  16. kdvi-3.0.0-5
    KDE DVI (TeX output) file viewer linux/i386
  17. kghostview-3.0.0-5
    PostScript viewer for KDE linux/i386
  18. kljettool-3.0.0-4
    Configuration tool for LaserJet and similar printers linux/i386
  19. linuxdoc-tools-0.9.16-4
    A text formatting package based on SGML. linux/i386
  20. mpage-2.5.1-9
    A tool for printing multiple pages of text on each printed page. linux/i386
  21. Omni-0.5.1-3
    The Omni Print Driver System linux/i386
  22. passivetex-1.12-3
    Macros to process XSL formatting objects. linux/noarch
  23. pnm2ppa-1.04-2
    Drivers for printing to HP PPA printers. linux/i386
  24. psutils-1.17-13
    PostScript Utilities linux/i386
  25. tetex-1.0.7-47
    The TeX text formatting system. linux/i386
  26. tetex-afm-1.0.7-47
    A converter for PostScript(TM) font metric files, for use with TeX. linux/i386
  27. tetex-doc-1.0.7-47
    The documentation files for the TeX text formatting system. linux/i386
  28. tetex-dvilj-1.0.7-47
    A DVI to HP PCL (Printer Control Language) converter. linux/i386
  29. tetex-dvips-1.0.7-47
    A DVI to PostScript converter for the TeX text formatting system. linux/i386
  30. tetex-fonts-1.0.7-47
    The font files for the TeX text formatting system. linux/i386
  31. tetex-latex-1.0.7-47
    The LaTeX front end for the TeX text formatting system. linux/i386
  32. tetex-xdvi-1.0.7-47
    An X viewer for DVI files. linux/i386
  33. texinfo-4.1-1
    Tools needed to create Texinfo format documentation files. linux/i386
  34. VFlib2-VFjfm-2.25.6-4
    Extra files and scripts for use with the VFlib library. linux/i386
  35. watanabe-vf-1.0-5
    Watanabe font in SYOTAI CLUB format linux/noarch
  36. xmltex-20000118-8
    Namespace-aware XML parser written in TeX. linux/noarch
  37. xpdf-1.00-3
    A PDF file viewer for the X Window System. linux/i386
  38. xpdf-japanese-1.00-3
    Japanese support linux/i386
  39. xpdf-korean-1.00-3
    Korean support linux/i386
  40. xpdf-chinese-simplified-1.00-3
    Chinese Simplified support linux/i386
  41. xpdf-chinese-traditional-1.00-3
    Chinese Traditional support linux/i386

Applications/System

  1. amanda-2.4.2p2-7
    A network-capable tape backup solution. linux/i386
  2. amanda-client-2.4.2p2-7
    The client component of the AMANDA tape backup system. linux/i386
  3. amanda-server-2.4.2p2-7
    The server side of the AMANDA tape backup system. linux/i386
  4. anaconda-7.3-7
    The Red Hat Linux installation program. linux/i386
  5. anaconda-runtime-7.3-7
    Red Hat Linux installer portions needed only for fresh installs. linux/i386
  6. anaconda-images-7.3-6
    Images used in the Red Hat Linux installer linux/noarch
  7. anaconda-help-7.3-2
    Help files for use in the Red Hat Linux installer linux/noarch
  8. apacheconf-0.8.2-2
    Apache configuration tool linux/noarch
  9. arpwatch-2.1a11-12
    Network monitoring tools for tracking IP addresses on a network. linux/i386
  10. auth_ldap-1.6.0-4
    This is an LDAP authentication module for Apache. linux/i386
  11. autorun-2.73-1
    A CD-ROM mounting utility. linux/i386
  12. bind-utils-9.2.0-8
    Utilities for querying DNS name servers. linux/i386
  13. bindconf-1.6.3-1
    A Red Hat DNS configuration tool. linux/noarch
  14. bug-buddy-2.0.6-9
    A bug reporting utility for GNOME. linux/i386
  15. cdrdao-1.1.5-5
    Writes audio CD-Rs in disk-at-once (DAO) mode. linux/i386
  16. console-tools-19990829-40
    Tools for configuring the console. linux/i386
  17. cWnn-1.11-20
    A Chinese character input system. linux/i386
  18. cWnn-common-1.11-20
    Common files needed by both the cWnn and tWnn Chinese input systems. linux/i386
  19. dbskkd-cdb-1.01-13
    A dictionary server for the SKK Japanese input method system linux/i386
  20. dialog-0.9a-5
    A utility for creating TTY dialog boxes. linux/i386
  21. diskcheck-1.2-1
    A hard drive space monitor. linux/noarch
  22. dosfstools-2.8-1
    Utilities for making and checking MS-DOS FAT filesystems on Linux. linux/i386
  23. dtach-0.5-3
    A simple program that emulates the detach feature of screen. linux/i386
  24. ethtool-1.5-1
    Ethernet settings tool for PCI ethernet cards linux/i386
  25. fbset-2.1-8
    Tools for managing a frame buffer's video mode properties. linux/i386
  26. firewall-config-0.97-2
    A configuration tool for IP firewalls and masquerading. linux/i386
  27. FreeWnn-1.11-20
    A Japanese character set conversion system. linux/i386
  28. FreeWnn-common-1.11-20
    Common files needed for Wnn Kana-to-Kanji conversion. linux/i386
  29. gkrellm-1.2.9-1
    Multiple stacked system monitors in one process. linux/i386
  30. gnome-utils-1.4.0-9
    GNOME utility programs. linux/i386
  31. gnorpm-0.96-14
    A graphical front-end to RPM for GNOME. linux/i386
  32. gnupg-1.0.6-5
    A GNU utility for secure communication and data storage. linux/i386
  33. gtop-1.0.13-4
    A system monitor for GNOME. linux/i386
  34. hdparm-4.6-1
    A utility for displaying and/or setting hard disk parameters. linux/i386
  35. hotplug-gtk-2002_04_01-3
    GTK control interface for Hotplug PCI linux/i386
  36. hwbrowser-0.3.8-1
    A hardware browser. linux/noarch
  37. iproute-2.4.7-1
    Advanced IP routing and network device configuration tools. linux/i386
  38. iptraf-2.5.0-3
    A console-based network monitoring utility. linux/i386
  39. ipxutils-2.2.0.18-6
    Tools for configuring and debugging IPX interfaces and networks. linux/i386
  40. irda-utils-0.9.14-3
    Utilities for infrared communication between devices. linux/i386
  41. isdn4k-utils-3.1-53
    Utilities for configuring an ISDN subsystem. linux/i386
  42. isicom-3.05-3
    Multitech Intelligent Serial Internal (ISI) support tools. linux/i386
  43. junkbuster-2.0.2-31
    Stops browsers from displaying ads in web pages. linux/i386
  44. kdf-3.0.0-4
    Application and KDE applet to monitor available diskspace linux/i386
  45. kfloppy-3.0.0-4
    Floppy disk formatter linux/i386
  46. klpq-3.0.0-4
    KDE tool for managing your print spooler linux/i386
  47. klprfax-3.0.0-4
    Fax sending support for KDE linux/i386
  48. kon2-0.3.9b-7
    KON - Kanji ON Linux console linux/i386
  49. kon2-fonts-0.3.9b-7
    Fonts for KON linux/i386
  50. krbafs-utils-1.1.1-1
    Kerberos/AFS utilities. linux/i386
  51. kregexpeditor-3.0.0-4
    Regular Expressions Editor linux/i386
  52. kudzu-0.99.52-1
    The Red Hat Linux hardware probing tool. linux/i386
  53. kWnn-1.11-20
    A Korean character set input system. linux/i386
  54. lm_sensors-2.6.1-1
    Hardware monitoring tools. linux/i386
  55. locale_config-0.3.4-2
    Locale configuration linux/i386
  56. logwatch-2.6-2
    A log file analysis program. linux/noarch
  57. macutils-2.0b3-19
    Utilities for manipulating Macintosh file formats. linux/i386
  58. magicdev-0.3.6-6
    A GNOME daemon for automatically mounting/playing CDs. linux/i386
  59. mkisofs-1.10-11
    Creates an image of an ISO9660 filesystem. linux/i386
  60. mkxauth-1.7-18
    A utility for managing .Xauthority files. linux/noarch
  61. mt-st-0.7-3
    Install mt-st if you need a tool to control tape drives. linux/i386
  62. mtools-3.9.8-2
    Programs for accessing MS-DOS disks without mounting the disks. linux/i386
  63. mtx-1.2.16-2
    A SCSI media changer control program. linux/i386
  64. ncpfs-2.2.0.18-6
    Utilities for the ncpfs filesystem, a NetWare client for Linux. linux/i386
  65. netconfig-0.8.11-7
    A text-based tool for simple configuration of ethernet devices. linux/i386
  66. nmap-2.54BETA31-1
    Network exploration tool and security scanner linux/i386
  67. nmap-frontend-2.54BETA31-1
    Gtk+ frontend for nmap linux/i386
  68. nut-0.45.4-1
    Network UPS Tools linux/i386
  69. nut-cgi-0.45.4-1
    CGI utilities for the Network UPS Tools linux/i386
  70. nut-client-0.45.4-1
    Network UPS Tools client monitoring utilities linux/i386
  71. open-1.4-14
    A tool which will start a program on a virtual console. linux/i386
  72. parted-1.4.24-3
    The GNU disk partition manipulation program. linux/i386
  73. patchutils-0.2.11-2
    A collection of programs for manipulating patch files linux/i386
  74. pciutils-2.1.9-2
    PCI bus related utilities. linux/i386
  75. procinfo-18-2
    A tool for gathering and displaying system information. linux/i386
  76. procps-2.0.7-12
    System and process monitoring utilities. linux/i386
  77. procps-X11-2.0.7-12
    An X-based system message monitoring utility. linux/i386
  78. psacct-6.3.2-19
    Utilities for monitoring process activities. linux/i386
  79. psmisc-20.2-2
    Utilities for managing processes on your system. linux/i386
  80. pvm-gui-3.4.4-2
    TCL/TK graphical frontend to monitor and manage a PVM cluster. linux/i386
  81. qtcups-2.0-7
    CUPS front-end and library for Qt linux/i386
  82. rdate-1.2-1
    Tool for getting the date/time from a remote machine. linux/i386
  83. rdist-6.1.5-16
    Maintains identical copies of files on multiple machines. linux/i386
  84. redhat-switchmail-0.5.1-1
    The Mail Transport Agent Switcher for Red Hat Linux linux/noarch
  85. redhat-config-users-1.0.1-5
    A graphical interface for administering users and groups linux/noarch
  86. redhat-config-network-1.0.0-1
    The NEtwork Adminstration Tool for Red Hat Linux linux/i386
  87. redhat-switch-printer-0.5.1-2
    The Printing System Switcher for Red Hat Linux linux/noarch
  88. redhat-switch-printer-gnome-0.5.1-2
    A GUI interface for Printing System Switcher. linux/noarch
  89. redhat-switchmail-gnome-0.5.1-1
    A GUI interface for Mail Transport Agent Switcher. linux/noarch
  90. rhmask-1.0-10
    Generates and restores mask files. linux/i386
  91. rpm2html-1.7-6
    Translates an RPM database and dependency information into HTML. linux/i386
  92. rpmfind-1.7-7
    Locate and transfer automatically RPM using HTTP and an RDF database linux/i386
  93. samba-client-2.2.3a-6
    Samba (SMB) client programs. linux/i386
  94. samba-common-2.2.3a-6
    Files used by both Samba servers and clients. linux/i386
  95. samba-swat-2.2.3a-6
    The Samba SMB server configuration program. linux/i386
  96. sane-frontends-1.0.7-2
    Graphical frontend to SANE linux/i386
  97. screen-3.9.11-3
    A screen manager that supports multiple logins on one terminal. linux/i386
  98. serviceconf-0.7.0-3
    serviceconf is an initscript and xinetd configuration utility linux/noarch
  99. setserial-2.17-5
    A utility for configuring serial ports. linux/i386
  100. setuptool-1.8-2
    A text mode system configuration tool. linux/i386
  101. statserial-1.1-27
    A tool which displays the status of serial port modem lines. linux/i386
  102. sudo-1.6.5p2-2
    Allows restricted root access for specified users. linux/i386
  103. symlinks-1.2-13
    A utility which maintains a system's symbolic links. linux/i386
  104. sysctlconfig-0.15-1
    A configuration tool for operating system tunable parameters linux/i386
  105. syslinux-1.52-2
    Simple kernel loader which boots from a FAT filesystem linux/i386
  106. sysstat-4.0.3-2
    The sar and iostat system monitoring commands. linux/i386
  107. tamago-4.0.6-5
    Tamago Version 4 linux/noarch
  108. time-1.7-16
    A GNU utility for monitoring a program's use of system resources. linux/i386
  109. timeconfig-3.2.7-1
    Text mode tools for setting system time parameters. linux/i386
  110. tripwire-2.3.1-10
    A system integrity assessment tool. linux/i386
  111. tWnn-1.11-20
    The tWnn Chinese character set input system. linux/i386
  112. ucd-snmp-utils-4.2.4-3
    Network management utilities using SNMP, from the UCD-SNMP project. linux/i386
  113. usbutils-0.9-5
    Linux USB utilities. linux/i386
  114. usbview-1.0-5
    USB topology and device viewer linux/i386
  115. usermode-1.53-2
    Tools for certain user account management tasks. linux/i386
  116. usermode-gtk-1.53-2
    Graphical tools for certain user account management tasks. linux/i386
  117. vlock-1.3-8
    A program which locks one or more virtual consoles. linux/i386
  118. which-2.13-3
    Displays where a particular program in your path is located. linux/i386
  119. xcpustate-2.5-11
    An X Window System based CPU state monitor. linux/i386
  120. Xdialog-2.0.5-1
    Xdialog in replacement for the cdialog program. linux/i386
  121. xisdnload-1.38-53
    An ISDN connection load average display for the X Window System. linux/i386
  122. xmlto-0.0.8-3
    A tool for converting XML files to various formats. linux/noarch
  123. xosview-1.7.3-10
    An X Window System utility for monitoring system resources. linux/i386
  124. xtoolwait-1.3-1
    A utility which aims to decrease X session startup time. linux/i386
  125. zisofs-tools-1.0.3-3
    Utilities to create compressed CD-ROM filesystems. linux/i386

Applications/Text

  1. aspell-pt_BR-2.4-7
    An aspell dictionary for Brazilian Portuguese. linux/i386
  2. aspell-da-1.4.22-2
    Danish files for aspell. linux/i386
  3. aspell-sv-1.3.6-2
    Swedish files for aspell linux/i386
  4. aspell-0.33.7.1-9
    A spelling checker. linux/i386
  5. aspell-no-0.3-1
    Norwegian files for aspell linux/i386
  6. aspell-es-0.2-8
    Spanish files for aspell. linux/i386
  7. aspell-de-0.1.1-12
    German files for aspell linux/i386
  8. aspell-ca-0.1-13
    Catalan files for aspell. linux/i386
  9. aspell-nl-0.1-12
    Dutch files for aspell. linux/i386
  10. aspell-it-0.1-11
    Italian files for aspell linux/i386
  11. aspell-pt-0.1-6
    Portuguese files for aspell. linux/i386
  12. aspell-fr-0.1-1
    French files for aspell linux/i386
  13. aspell-en-ca-0.33.7.1-9
    A Canadian English dictionary for aspell. linux/i386
  14. aspell-en-gb-0.33.7.1-9
    A British English dictionary for aspell. linux/i386
  15. autoconvert-0.3.7-6
    Chinese HZ/GB/BIG5 encodings auto-converter linux/i386
  16. autoconvert-xchat-0.3.7-6
    Auto-convert xchat plugins linux/i386
  17. diffutils-2.7.2-5
    A GNU collection of diff utilities. linux/i386
  18. docbook-dtds-1.0-8
    XML document type definition for DocBook 4.1.2 linux/noarch
  19. docbook-utils-0.6.9-25
    Shell scripts for managing DocBook documents. linux/noarch
  20. docbook-style-dsssl-1.76-1
    Norman Walsh's modular stylesheets for DocBook. linux/noarch
  21. docbook-style-xsl-1.49-1
    Norman Walsh's XSL stylesheets for DocBook XML. linux/noarch
  22. docbook-utils-pdf-0.6.9-25
    A script for converting DocBook documents to PDF format. linux/noarch
  23. dos2unix-3.1-10
    Text file format converter linux/i386
  24. ed-0.2-25
    The GNU line editor. linux/i386
  25. gawk-3.1.0-4
    The GNU version of the awk text processing utility. linux/i386
  26. gnome-spell-0.4.1-0.7x
    Bonobo component for spell checking linux/i386
  27. grep-2.5.1-1
    The GNU versions of grep pattern matching utilities. linux/i386
  28. h2ps-2.06-2
    Korean Hangul coverter from text file to postscript linux/i386
  29. indent-2.2.7-3
    A GNU program for formatting C code. linux/i386
  30. kakasi-2.3.4-3
    A Japanese character set conversion filter. linux/i386
  31. kakasi-dict-2.3.4-3
    The base dictionary for KAKASI. linux/i386
  32. kcc-2.3-10
    Kanji Code Converter linux/i386
  33. kdoc-3.0.0-0.cvs20020321.1
    Documentation for the K Desktop Environment (KDE) linux/noarch
  34. less-358-24
    A text file browser similar to more, but better. linux/i386
  35. lv-4.49.4-3
    A Powerful Multilingual File Viewer linux/i386
  36. m4-1.4.1-7
    The GNU macro processor. linux/i386
  37. namazu-2.0.10-4
    Namazu is a full-text search engine linux/i386
  38. namazu-cgi-2.0.10-4
    a CGI interface for Namazu linux/i386
  39. nhpf-1.42-2
    Hangul Printing Filter for Netscape (2.0 or later) PS-saved file linux/i386
  40. nkf-1.92-6
    A Kanji code conversion filter. linux/i386
  41. openjade-1.3.1-4
    A DSSSL implementation. linux/i386
  42. perl-NKF-1.71-2
    Perl extension for Network Kanji Filter linux/i386
  43. perl-SGMLSpm-1.03ii-4
    Perl library for parsing the output of nsgmls. linux/noarch
  44. perl-Text-Kakasi-1.04-4
    kakasi library module for perl linux/i386
  45. pspell-0.12.2-8
    Portable Spell Checker Interface Library. linux/i386
  46. pydict-0.2.5.1-8
    English/Chinese Dictionary written with python/gtk linux/noarch
  47. sed-3.02-11
    A GNU stream text editor. linux/i386
  48. sgml-common-0.6.3-9
    Common SGML catalog and DTD files. linux/noarch
  49. stardict-1.31-7
    An English to Chinese for words on screen linux/i386
  50. textutils-2.0.21-1
    A set of GNU text file modifying utilities. linux/i386
  51. unix2dos-2.2-15
    unix2dos - UNIX to DOS text file format converter linux/i386
  52. xml-common-0.6.3-9
    Common XML catalog and DTD files. linux/noarch

Applications/Utilities

  1. kdesdk-kompare-3.0.0-5
    File comparison tool for KDE linux/i386

Development/Debuggers

  1. ddd-3.3.1-13
    A GUI for several command-line debuggers. linux/i386
  2. gdb-5.1.90CVS-5
    A GNU source-level debugger for C, C++ and other languages. linux/i386
  3. kdbg-1.2.4-4
    A GUI for gdb, the GNU debugger, and KDE. linux/i386
  4. lslk-1.29-3
    A lock file lister. linux/i386
  5. lsof-4.51-2
    A utility which lists open files on a Linux/UNIX system. linux/i386
  6. ltrace-0.3.10-7
    Tracks runtime library calls from dynamically linked executables. linux/i386
  7. memprof-0.4.1-5
    Tool for memory profiling and leak detection linux/i386
  8. pstack-1.1-1
    Display stack trace of a running process linux/i386
  9. strace-4.4-4
    Tracks and displays system calls associated with a running process. linux/i386
  10. sysreport-1.3-2
    Gathers system hardware and configuration information. linux/noarch

Development/Languages

  1. compat-egcs-6.2-1.1.2.16
    The GNU Compiler Collection for Red Hat 6.2 backwards compatibility linux/i386
  2. compat-egcs-c++-6.2-1.1.2.16
    C++ support for Red Hat 6.2 backwards compatibility C compiler linux/i386
  3. compat-egcs-g77-6.2-1.1.2.16
    Fortran 77 support for Red Hat 6.2 backwards compatibility C compiler linux/i386
  4. compat-egcs-objc-6.2-1.1.2.16
    Ojective C support for Red Hat 6.2 backwards compatibility C compiler linux/i386
  5. cpp-2.96-110
    The C Preprocessor. linux/i386
  6. dev86-0.15.5-1
    A real mode 80x86 assembler and linker. linux/i386
  7. eruby-0.9.7-1
    An interpreter of embedded Ruby language linux/i386
  8. eruby-devel-0.9.7-1
    Development files for eRuby. linux/i386
  9. eruby-libs-0.9.7-1
    Library for eRuby linux/i386
  10. expect-5.32.2-67
    A program-script interaction and testing utility linux/i386
  11. gcc-2.96-110
    Various compilers (C, C++, Objective-C, Java, ...) linux/i386
  12. gcc-c++-2.96-110
    C++ support for gcc linux/i386
  13. gcc-chill-2.96-110
    CHILL support for gcc linux/i386
  14. gcc-g77-2.96-110
    Fortran 77 support for gcc linux/i386
  15. gcc-java-2.96-110
    Java support for gcc linux/i386
  16. gcc-objc-2.96-110
    Objective C support for gcc linux/i386
  17. guile-1.3.4-19
    A GNU implementation of Scheme for application extensibility. linux/i386
  18. irb-1.6.7-2
    The Intaractive Ruby. linux/i386
  19. itcl-3.2-67
    Tcl object-oriented extensions linux/i386
  20. jikes-1.15-1
    A Java source file to bytecode compiler. linux/i386
  21. libgcj-devel-2.96-29
    Libraries for Java development using gcc. linux/i386
  22. librep-0.15.1-3
    A shared library that implements a Lisp dialect. linux/i386
  23. librep-devel-0.15.1-3
    Include files and link libraries for librep development. linux/i386
  24. nasm-0.98.22-2
    A portable x86 assembler which uses Intel-like syntax. linux/i386
  25. nasm-doc-0.98.22-2
    Documentation for NASM. linux/i386
  26. perl-5.6.1-34.99.6
    The Perl programming language. linux/i386
  27. perl-suidperl-5.6.1-34.99.6
    suidperl, for use with setuid perl scripts linux/i386
  28. perl-CGI-2.752-34.99.6
    CGI modules for Perl linux/i386
  29. perl-DB_File-1.75-34.99.6
    DB_File module for Perl linux/i386
  30. perl-NDBM_File-1.75-34.99.6
    NDBM_File module for Perl linux/i386
  31. perl-CPAN-1.59_54-34.99.6
    CPAN module for Perl linux/i386
  32. php-4.1.2-7
    The PHP HTML-embedded scripting language. (PHP: Hypertext Preprocessor) linux/i386
  33. php-dbg-4.1.2-7
    A debugging extension for PHP. Provides hooks for dbg. linux/i386
  34. php-imap-4.1.2-7
    An Apache module for PHP applications that use IMAP. linux/i386
  35. php-ldap-4.1.2-7
    A module for PHP applications that use LDAP. linux/i386
  36. php-mysql-4.1.2-7
    A module for PHP applications that use MySQL databases. linux/i386
  37. php-odbc-4.1.2-7
    A module for PHP applications that use ODBC databases. linux/i386
  38. php-pgsql-4.1.2-7
    A PostgreSQL database module for PHP. linux/i386
  39. php-snmp-4.1.2-7
    A module for PHP applications that query SNMP-managed devices. linux/i386
  40. pygnome-1.4.2-3
    Python bindings for the GNOME libraries. linux/i386
  41. pygnome-applet-1.4.2-3
    Python bindings for GNOME Panel applets. linux/i386
  42. pygnome-capplet-1.4.2-3
    Python bindings for GNOME Panel applets. linux/i386
  43. pygnome-devel-1.4.2-3
    Files that are useful for wrapping GNOME addon libraries. linux/i386
  44. pygnome-gtkhtml-1.4.2-3
    Python bindings for GtkHTML. linux/i386
  45. pygnome-libglade-1.4.2-3
    GNOME support for the libglade python wrapper linux/i386
  46. pygtk-0.6.9-3
    Python bindings for the GTK+ widget set. linux/i386
  47. pygtk-devel-0.6.9-3
    files needed to build wrappers for GTK+ addon libraries linux/i386
  48. pygtk-glarea-0.6.9-3
    A wrapper for the GtkGLArea widget for use with PyGTK linux/i386
  49. pygtk-libglade-0.6.9-3
    A wrapper for the libglade library for use with PyGTK linux/i386
  50. pygtk2-1.99.8-7
    Python bindings for the GTK+ widget set. linux/i386
  51. pygtk2-devel-1.99.8-7
    files needed to build wrappers for GTK+ addon libraries linux/i386
  52. pygtk2-libglade-1.99.8-7
    A wrapper for the libglade library for use with PyGTK linux/i386
  53. PyQt-3.1-2
    Python bindings for Qt linux/i386
  54. PyQt-devel-3.1-2
    Files needed to build other bindings based on Qt linux/i386
  55. PyQt-examples-3.1-2
    Examples for PyQt linux/i386
  56. python-1.5.2-38
    An interpreted, interactive object-oriented programming language. linux/i386
  57. python2-2.2-16
    An interpreted, interactive, object-oriented programming language. linux/i386
  58. rep-gtk-0.15-7
    GTK+ bindings for librep Lisp environment. linux/i386
  59. rep-gtk-gnome-0.15-7
    GNOME bindings for the librep Lisp interpreter. linux/i386
  60. rep-gtk-libglade-0.15-7
    A librep binding of libglade, for loading user interfaces. linux/i386
  61. rpm-perl-4.0.4-7x.18
    Native bindings to the RPM API for Perl. linux/i386
  62. ruby-1.6.7-2
    An interpreter of object-oriented scripting language linux/i386
  63. ruby-devel-1.6.7-2
    A Ruby development environment. linux/i386
  64. ruby-tcltk-1.6.7-2
    Tcl/Tk interface for scripting language Ruby. linux/i386
  65. tcl-8.3.3-67
    Tcl scripting language development environment linux/i386
  66. tclx-8.3-67
    Extensions for Tcl linux/i386
  67. tix-8.2.0b1-67
    A set of extension widgets for Tk linux/i386
  68. tk-8.3.3-67
    Tk graphical toolkit for the Tcl scripting language linux/i386
  69. tkinter-1.5.2-38
    A graphical user interface for the Python scripting language. linux/i386
  70. tkinter2-2.2-16
    A graphical user interface for the Python scripting language. linux/i386
  71. umb-scheme-3.2-21
    An implementation of the Scheme programming language. linux/i386

Developemnt/Libraries

  1. 4Suite-0.11.1-8
    A collections of XML-related technologies for python linux/i386
  2. ac-archive-0.5.34-1
    autoconf extensions archive linux/noarch
  3. alchemist-devel-1.0.23-1
    Files needed for developing programs which use alchemist. linux/i386
  4. amanda-devel-2.4.2p2-7
    Libraries and documentation of the AMANDA tape backup system. linux/i386
  5. apache-devel-1.3.23-11
    Development tools for the Apache Web server. linux/i386
  6. arts-devel-1.0.0-4
    Development files for the aRts sound server linux/i386
  7. aspell-devel-0.33.7.1-9
    Static libraries and header files for Aspell development. linux/i386
  8. atk-devel-1.0.1-1
    System for layout and rendering of internationalized text. linux/i386
  9. audiofile-devel-0.2.3-1
    Development files for Audio File applications. linux/i386
  10. bind-devel-9.2.0-8
    Include files and libraries needed for bind DNS development. linux/i386
  11. blas-3.0-14
    The BLAS (Basic Linear Algebra Subprograms) library. linux/i386
  12. bonobo-devel-1.0.19-2
    Libraries and include files for the Bonobo document model. linux/i386
  13. bonobo-conf-devel-0.14-5
    Libraries and include files for bonobo-conf linux/i386
  14. bridge-utils-devel-0.9.3-4
    Utilities for configuring the linux ethernet bridge. linux/i386
  15. bzip2-devel-1.0.2-2
    Header files and libraries for developing apps which will use bzip2. linux/i386
  16. Canna-devel-3.5b2-62
    Header file and library for developing programs which use Canna. linux/i386
  17. cdparanoia-devel-alpha9.8-8
    Development tools for libcdda_paranoia (Paranoia III). linux/i386
  18. cdparanoia-libs-alpha9.8-8
    Libraries for libcdda_paranoia (Paranoia III). linux/i386
  19. cdrecord-devel-1.10-11
    The libschily SCSI user level transport library. linux/i386
  20. compat-libs-6.2-3
    Runtime and developemnt libraries for Red Hat Linux 5.2 backwards compatibility Linux/i386
  21. compat-glibc-6.2-2.1.3.2
    GNU libc for Red Hat Linux 6.2 backwards compatibility Linux/i386
  22. control-center-devel-1.4.0.1-31
    The GNOME Control Center development environment. linux/i386
  23. cups-devel-1.1.14-15
    Common Unix Printing System - development environment linux/i386
  24. curl-devel-7.9.5-2
    Files needed for building applications with libcurl. linux/i386
  25. cWnn-devel-1.11-20
    Files needed for development of cWnn and tWnn applications. linux/i386
  26. cyrus-sasl-devel-1.5.24-25
    Files needed for developing applications with Cyrus SASL. linux/i386
  27. db1-devel-1.85-8
    Development files for Berkeley DB (version 1) library. linux/i386
  28. db2-devel-2.4.14-10
    Development files for Berkeley DB (version 2) library. linux/i386
  29. dietlibc-0.15-2
    A small libc implementation linux/i386
  30. Distutils-1.0.2-2
    Python Distribution Utilities linux/noarch
  31. e2fsprogs-devel-1.27-3
    Ext2 filesystem-specific static libraries and headers. linux/i386
  32. eel-devel-1.0.2-11
    Libraries and include files for developing with Eel. linux/i386
  33. esound-devel-0.2.24-1
    Development files for EsounD applications. linux/i386
  34. expat-devel-1.95.2-2
    Libraries and include files to develop XML applications with expat. linux/i386
  35. fam-devel-2.6.7-6
    FAM, the File Alteration Monitor development files. linux/i386
  36. festival-devel-1.4.2-3
    Development files for the festival speech synthesizer linux/i386
  37. freetype-devel-2.0.9-2
    FreeType development libraries and header files linux/i386
  38. FreeWnn-devel-1.11-20
    Development library and header files for FreeWnn. linux/i386
  39. g-wrap-1.2.1-4
    A tool for creating Scheme interfaces to C libraries linux/i386
  40. g-wrap-devel-1.2.1-4
    Include files and libraries needed for g-wrap development. linux/i386
  41. gal-devel-0.19.1-2
    Development files for the GNOME Applications library linux/i386
  42. GConf-devel-1.0.9-4
    The Gnome Config System development package. linux/i386
  43. gd-devel-1.8.4-4
    The development libraries and header files for gd. linux/i386
  44. gdbm-devel-1.8.0-14
    Development libraries and header files for the gdbm library. linux/i386
  45. gdk-pixbuf-devel-0.14.0-8
    Files needed for developing apps to work with the GdkPixBuf library. linux/i386
  46. glib-devel-1.2.10-5
    The GIMP ToolKit (GTK+) and GIMP Drawing Kit (GDK) support library. linux/i386
  47. glib2-devel-2.0.1-2
    The GIMP ToolKit (GTK+) and GIMP Drawing Kit (GDK) support library linux/i386
  48. glibc-debug-2.2.5-34
    Shared standard C libraries with debugging information linux/i686
  49. glibc-debug-2.2.5-34
    Shared standard C libraries with debugging information linux/i386
linux/i686
  • openssl095a-0.9.5a-11
    The OpenSSL toolkit. linux/i386
  • openssl096-0.9.6-6
    Secure Sockets Layer Toolkit. linux/i386
  • pango-1.0.1-1
    System for layout and rendering of internationalized text. linux/i386
  • pcre-3.9-2
    Perl-compatible regular expression library linux/i386
  • perl-HTML-Parser-3.26-2
    HTML-Parser module for perl (World_Wide_Web_HTML_HTTP_CGI/HTML) linux/i386
  • perl-libxml-perl-0.07-14
    libxml-perl module for perl linux/noarch
  • perl-MIME-Base64-2.12-14
    Perl module for MIME encoding/decoding (base64 and quoted-printable) linux/i386
  • perl-XML-Twig-2.02-9
    XML-Twig module for perl linux/noarch
  • perl-XML-Encoding-1.01-9
    XML-Encoding module for perl linux/noarch
  • perl-XML-Grove-0.46alpha-11
    XML-Grove module for perl linux/noarch
  • perl-XML-Dumper-0.4-12
    Perl module for dumping Perl objects from/to XML linux/noarch
  • pwlib-1.2.12-3
    Portable Windows Libary linux/i386
  • qt-3.0.3-11
    The shared library for the Qt GUI toolkit. linux/i386
  • qt-MySQL-3.0.3-11
    MySQL drivers for Qt's SQL classes. linux/i386
  • qt-ODBC-3.0.3-11
    ODBC drivers for Qt's SQL classes. linux/i386
  • qt-PostgreSQL-3.0.3-11
    PostgreSQL drivers for Qt's SQL classes. linux/i386
  • qt-Xt-3.0.3-11
    An Xt (X Toolkit) compatibility add-on for the Qt GUI toolkit. linux/i386
  • qt1x-1.45-16
    A backward compatible library for apps linked to Qt 1.x. linux/i386
  • qt1x-GL-1.45-16
    An OpenGL (3-D graphics) add-on for the Qt GUI toolkit. linux/i386
  • qt2-2.3.1-3
    The shared library for the Qt 2.x GUI toolkit. linux/i386
  • qt2-Xt-2.3.1-3
    An Xt (X Toolkit) compatibility add-on for the Qt GUI toolkit. linux/i386
  • qtcups-devel-2.0-7
    CUPS front-end and library for Qt linux/i386
  • readline-4.2a-4
    A library for editing typed command lines. linux/i386
  • readline2.2.1-2.2.1-4
    A library for reading and returning lines from a terminal. linux/i386
  • readline41-4.1-10
    A library for editing typed in command lines. linux/i386
  • sane-backends-1.0.7-6
    Scanner access software. linux/i386
  • SDL-1.2.3-7
    A cross-platform multimedia library. linux/i386
  • SDL_image-1.2.1-4
    A sample image loading library for SDL. linux/i386
  • SDL_mixer-1.2.1-4
    Simple DirectMedia Layer - Sample Mixer Library linux/i386
  • SDL_net-1.2.3-2
    SDL portable network library linux/i386
  • skkdic-20020220-2
    Dictionaries for SKK (Simple Kana-Kanji conversion program) linux/noarch
  • slang-1.4.5-2
    The shared library for the S-Lang extension language. linux/i386
  • smpeg-0.4.4-9
    SDL MPEG Library linux/i386
  • smpeg-xmms-0.3.4-6
    MPEG video plugin for XMMS. linux/i386
  • unixODBC-2.2.0-5
    A complete ODBC driver manager for Linux. linux/i386
  • unixODBC-kde-2.2.0-5
    KDE driver manager components for ODBC. linux/i386
  • VFlib2-2.25.6-4
    A vector font library used for Japanese document processing. linux/i386
  • w3c-libwww-5.3.2-5
    HTTP library of common code linux/i386
  • WindowMaker-libs-0.80.0-9
    Window Maker libraries. linux/i386
  • wine-devel-20020327-1
    Wine development environment. linux/i386
  • Wnn6-SDK-1.0-18
    Wnn6 Client Library linux/i386
  • words-2-18
    A dictionary of English words for the /usr/share/dict directory. linux/noarch
  • Xaw3d-1.5-12
    A version of the MIT Athena widget set for X. linux/i386
  • XFree86-libs-4.2.0-8
    Shared libraries needed by the X Window System version 11 release 6.4 linux/i386
  • XFree86-compat-libs-4.0.3-2
    The Xv and Xxfdga shared libraries linux/i386
  • zlib-1.1.3-25.7
    The zlib compression and decompression library. linux/i386

      System Environment/Shells

      1. ash-0.3.7-2
        A smaller version of the Bourne shell (sh). linux/i386
      2. bash-2.05a-13
        The GNU Bourne Again shell (bash) version 2.05a. linux/i386
      3. busybox-0.60.2-4
        Statically linked binary providing simplified versions of system commands linux/i386
      4. busybox-anaconda-0.60.2-4
        Version of busybox configured for use with anaconda linux/i386
      5. mc-4.5.55-5
        A user-friendly file manager and visual shell. linux/i386
      6. pdksh-5.2.14-16
        A public domain clone of the Korn shell (ksh). linux/i386
      7. sash-3.4-11
        A statically-linked shell, including some built-in basic commands. linux/i386
      8. sh-utils-2.0.11-14
        A set of GNU utilities commonly used in shell scripts. linux/i386
      9. tcsh-6.10-6
        An enhanced version of csh, the C shell. linux/i386
      10. zsh-4.0.4-5
        A shell similar to ksh, but with improvements. linux/i386

      User Interface/Desktops

      1. control-center-1.4.0.1-31
        The GNOME Control Center. linux/i386
      2. fvwm2-2.4.6-1
        An improved version of the FVWM window manager for X. linux/i386
      3. fvwm2-icons-2.4.6-1
        Graphics used by the FVWM and FVWM2 window managers. linux/i386
      4. gnome-applets-1.4.0.5-6
        Small applications for the GNOME panel. linux/i386
      5. kcharselect-3.0.0-4
        Character Selector linux/i386
      6. kde-i18n-Afrikaans-3.0.0-5
        Afrikaans language support for KDE linux/noarch
      7. kde-i18n-Brazil-3.0.0-5
        Brazil Portuguese language support for KDE linux/noarch
      8. kde-i18n-British-3.0.0-5
        Brisish English support for KDE linux/noarch
      9. kde-i18n-Catalan-3.0.0-5
        Catalan language support for KDE linux/noarch
      10. kde-i18n-Chinese-3.0.0-5
        Chinese (Simplified Chinese) language support for KDE linux/noarch
      11. kde-i18n-Czech-3.0.0-5
        Czech language support for KDE linux/noarch
      12. kde-i18n-Danish-3.0.0-5
        Danish language support for KDE linux/noarch
      13. kde-i18n-Dutch-3.0.0-5
        Dutch language support for KDE linux/noarch
      14. kde-i18n-Estonian-3.0.0-5
        Estonian language support for KDE linux/noarch
      15. kde-i18n-Finnish-3.0.0-5
        Finnish language support for KDE linux/noarch
      16. kde-i18n-French-3.0.0-5
        French language support for KDE linux/noarch
      17. kde-i18n-German-3.0.0-5
        German language support for KDE linux/noarch
      18. kde-i18n-Greek-3.0.0-5
        Greek language support for KDE linux/noarch
      19. kde-i18n-Hebrew-3.0.0-5
        Hebrew language support for KDE linux/noarch
      20. kde-i18n-Hungarian-3.0.0-5
        Hungarian language support for KDE linux/noarch
      21. kde-i18n-Icelandic-3.0.0-5
        Icelandic language support for KDE linux/noarch
      22. kde-i18n-Italian-3.0.0-5
        Italian language support for KDE linux/noarch
      23. kde-i18n-Japanese-3.0.0-5
        Japanese language support for KDE linux/noarch
      24. kde-i18n-Korean-3.0.0-5
        Korean language support for KDE linux/noarch
      25. kde-i18n-Norwegian-3.0.0-5
        Norwegian (Bokmaal) language support for KDE linux/noarch
      26. kde-i18n-Polish-3.0.0-5
        Polish language support for KDE linux/noarch
      27. kde-i18n-Portuguese-3.0.0-5
        Portuguese language support for KDE linux/noarch
      28. kde-i18n-Romanian-3.0.0-5
        Romanian language support for KDE linux/noarch
      29. kde-i18n-Russian-3.0.0-5
        Russian language support for KDE linux/noarch
      30. kde-i18n-Serbian-3.0.0-5
        Serbian language support for KDE linux/noarch
      31. kde-i18n-Slovak-3.0.0-5
        Slovak language support for KDE linux/noarch
      32. kde-i18n-Slovenian-3.0.0-5
        Slovenian language support for KDE linux/noarch
      33. kde-i18n-Spanish-3.0.0-5
        Spanish language support for KDE linux/noarch
      34. kde-i18n-Swedish-3.0.0-5
        Swedish language support for KDE linux/noarch
      35. kde-i18n-Turkish-3.0.0-5
        Turkish language support for KDE linux/noarch
      36. kde-i18n-Ukrainian-3.0.0-5
        Ukrainian language support for KDE linux/noarch
      37. kde-i18n-Chinese-Big5-3.0.0-5
        Chinese (Big5) language support for KDE linux/noarch
      38. kde-i18n-Norwegian-Nynorsk-3.0.0-5
        Norwegian (Nynorsk) language support for KDE linux/noarch
      39. kdeaddons-kate-3.0.0-4
        Plugins for the Kate text editor linux/i386
      40. kdeaddons-kicker-3.0.0-4
        Plugins and additional applets for Kicker (the KDE panel) linux/i386
      41. kdeaddons-knewsticker-3.0.0-4
        Scripts extending the functionality of KNewsTicker linux/i386
      42. kdeaddons-konqueror-3.0.0-4
        Plugins extending the functionality of Konqueror linux/i386
      43. kdeadmin-3.0.0-4
        Administrative tools for KDE. linux/i386
      44. kdeartwork-3.0.0-4
        Additional artwork (themes, sound themes, ...) for KDE linux/i386
      45. kdeartwork-kworldclock-3.0.0-4
        Themes for KWorldClock linux/i386
      46. kdeartwork-locolor-3.0.0-4
        Low-color icons for KDE linux/i386
      47. kdeartwork-screensavers-3.0.0-4
        Additional screensavers for KDE linux/i386
      48. kdebase-3.0.0-12
        K Desktop Environment - core files linux/i386
      49. kdebindings-3.0.0-1
        KDE bindings to non-C++ languages linux/i386
      50. kdebindings-kmozilla-3.0.0-1
        KDE bindings to mozilla linux/i386
      51. kdepasswd-3.0.0-4
        KDE frontend to changing your password linux/i386
      52. kdeutils-laptop-3.0.0-4
        Laptop utilities for KDE linux/i386
      53. kjots-3.0.0-4
        Virtual notepad linux/i386
      54. koffice-1.1.1-5
        A set of office applications for KDE. linux/i386
      55. kontrol-panel-4.2.3-2
        System configuration tool launcher linux/i386
      56. ktimer-3.0.0-4
        A timer (stop watch). linux/i386
      57. nautilus-1.0.6-15
        Nautilus is a network user environment linux/i386
      58. nautilus-mozilla-1.0.6-15
        Nautilus component for use with Mozilla linux/i386
      59. sawfish-1.0.1-9
        An extensible window manager for the X Window System. linux/i386
      60. sawfish-themer-1.0.1-9
        A GUI for creating sawfish window manager themes. linux/i386
      61. switchdesk-3.9.8-2
        A desktop environment switcher for GNOME, KDE and AnotherLevel. linux/i386
      62. switchdesk-gnome-3.9.8-2
        A GNOME interface for the Desktop Switcher. linux/i386
      63. switchdesk-kde-3.9.8-2
        A KDE interface for the Desktop Switcher. linux/i386
      64. vnc-3.3.3r2-28
        A remote display system. linux/i386
      65. vnc-doc-3.3.3r2-28
        Complete documentation for VNC. linux/i386
      66. WindowMaker-0.80.0-9
        A window manager for the X Window System. linux/i386

      User Interface/X

      1. ami-1.0.11-9
        Ami- a Korean Imput Method System linux/i386
      2. doxygen-doxywizard-1.2.14-4
        A GUI for creating and editing configuration files. linux/i386
      3. fonts-ja-7.x-1
        Japanese bitmap fonts linux/noarch
      4. fonts-ISO8859-2-1.0-4
        Central European language fonts for the X Window System. linux/noarch
      5. fonts-ISO8859-7-1.0-2
        Greek language fonts for the X Window System. linux/noarch
      6. fonts-ISO8859-2-100dpi-1.0-4
        A set of 100dpi Central European language fonts for X. linux/noarch
      7. fonts-ISO8859-2-75dpi-1.0-4
        A set of 75dpi Central European language fonts for X. linux/noarch
      8. fonts-ISO8859-7-100dpi-1.0-2
        ISO 8859-7 fonts in 100 dpi resolution for the X Window System. linux/noarch
      9. fonts-ISO8859-7-75dpi-1.0-2
        ISO 8859-7 fonts in 75 dpi resolution for the X Window System. linux/noarch
      10. fonts-ISO8859-7-Type1-1.0-2
        Type 1 scalable Greek (ISO 8859-7 ) fonts linux/noarch
      11. fonts-KOI8-R-1.0-1
        Russian and Ukrainian language fonts for the X Window System. linux/noarch
      12. fonts-KOI8-R-100dpi-1.0-1
        KOI8-R fonts in 100 dpi resolution for the X Window System. linux/noarch
      13. fonts-KOI8-R-75dpi-1.0-1
        A set of 75 dpi Russian and Ukrainian language fonts for X. linux/noarch
      14. gdm-2.2.3.1-22
        The GNOME Display Manager. linux/i386
      15. glms-1.03-14
        A GNOME hardware monitoring applet. linux/i386
      16. gnome-kerberos-0.3-4
        Kerberos 5 tools for GNOME. linux/i386
      17. gqview-0.8.1-5
        An image viewer. linux/i386
      18. hanterm-xf-p19-15
        Hangul Terminal for X Window System. linux/i386
      19. im-sdk-20011223-3
        IIIMF linux/i386
      20. jisksp14-0.1-7
        14 dots jis auxiliary kanji font linux/noarch
      21. jisksp16-1990-0.1-6
        16 dots jis auxiliary kanji font linux/noarch
      22. kappa20-0.3-7
        Kappa 20dot Font linux/noarch
      23. kinput2-canna-wnn6-v3-14
        kinput2 for both Canna and Wnn6 linux/i386
      24. knm_new-1.1-5
        Kaname-cho font, revised version linux/noarch
      25. kterm-6.2.0-28
        A Kanji (Japanese character set) terminal emulator for X. linux/i386
      26. libtabe-0.2.4a-10
        Chinese lexicons library for xcin-2.5.3 linux/i386
      27. miniChinput-0.0.3-18
        A Chinese XIM server. linux/i386
      28. rxvt-2.7.8-3
        A color VT102 terminal emulator for the X Window System. linux/i386
      29. skkinput-2.03-9
        SKK like Japanese-input application linux/i386
      30. taipeifonts-1.2-16
        Taipei Chinese Big 5 Fonts linux/noarch
      31. ttfonts-zh_CN-2.11-21
        TrueType Fonts -- GB ming and kai face and Zhongyi 18030 Song face. linux/noarch
      32. ttfonts-zh_TW-2.11-10
        Arphic TrueType Font -- Big5 ming and kai face. linux/noarch
      33. ttfonts-ja-1.2-8
        Free Japanese TrueType fonts linux/noarch
      34. ttfonts-ko-1.0.11-9
        Baekmuk Korean TrueType fonts. linux/noarch
      35. ttfonts-1.0-9
        Some TrueType fonts linux/noarch
      36. urw-fonts-2.0-17
        Free versions of the 35 standard PostScript fonts. linux/noarch
      37. vnc-server-3.3.3r2-28
        A VNC server. linux/i386
      38. wmapm-1.1-1
        dockable clock applet for Window Maker linux/i386
      39. wmclock-1.0.12.2-2
        dockable clock applet for Window Maker linux/i386
      40. wmix-3.0-2
        dockable clock applet for Window Maker linux/i386
      41. xalf-0.11-5
        A utility to provide feedback when starting X11 applications. linux/i386
      42. xcin-2.5.3.pre2-10
        An X Input Method Server for Chinese. linux/i386
      43. XFree86-4.2.0-8
        The basic fonts, programs and docs for an X workstation. linux/i386
      44. XFree86-tools-4.2.0-8
        Various tools for XFree86 linux/i386
      45. XFree86-twm-4.2.0-8
        A simple window manager linux/i386
      46. XFree86-xdm-4.2.0-8
        X Display Manager linux/i386
      47. XFree86-xf86cfg-4.2.0-8
        XFree86 configuration program linux/i386
      48. XFree86-100dpi-fonts-4.2.0-8
        A set of 100dpi resolution fonts for the X Window System. linux/i386
      49. XFree86-75dpi-fonts-4.2.0-8
        A set of 75dpi resolution fonts for the X Window System. linux/i386
      50. XFree86-base-fonts-4.2.0-8
        The collection of XFree86 core base fonts linux/i386
      51. XFree86-cyrillic-fonts-4.2.0-8
        Cyrillic fonts for X. linux/i386
      52. XFree86-font-utils-4.2.0-8
        Font utilities required for installing fonts linux/i386
      53. XFree86-ISO8859-15-100dpi-fonts-4.2.0-8
        ISO8859-15-100dpi-fonts linux/i386
      54. XFree86-ISO8859-15-75dpi-fonts-4.2.0-8
        ISO8859-15-75dpi-fonts linux/i386
      55. XFree86-ISO8859-2-100dpi-fonts-4.2.0-8
        A set of 100dpi Central European language fonts for X. linux/i386
      56. XFree86-ISO8859-2-75dpi-fonts-4.2.0-8
        A set of 75dpi Central European language fonts for X. linux/i386
      57. XFree86-ISO8859-9-100dpi-fonts-4.2.0-8
        ISO8859-9-100dpi-fonts linux/i386
      58. XFree86-ISO8859-9-75dpi-fonts-4.2.0-8
        ISO8859-9-75dpi-fonts linux/i386
      59. XFree86-truetype-fonts-4.2.0-8
        XFree86 Luxi TrueType fonts by Bigelow and Holmes linux/i386
      60. XFree86-xtrap-clients-4.2.0-8
        Xtrap client utilities linux/i386

      User Interface/X Hardware Support

      1. Glide3-20010520-13
        Glide runtime for the 3Dfx Voodoo family of cards linux/i386
      2. Xconfigurator-4.10.7-1
        The Red Hat Linux configuration tool for the X Window System. linux/i386
      3. XFree86-Xnest-4.2.0-8
        A nested XFree86 server. linux/i386
      4. XFree86-Xvfb-4.2.0-8
        A virtual framebuffer X Windows System server for XFree86. linux/i386
      5. XFree86-3DLabs-3.3.6-44
        The XFree86 server for 3Dlabs video cards. linux/i386
      6. XFree86-8514-3.3.6-44
        XFree86 server program for older IBM 8514 or compatible video cards. linux/i386
      7. XFree86-AGX-3.3.6-44
        The XFree86 server for AGX-based video cards. linux/i386
      8. XFree86-FBDev-3.3.6-44
        The X server for the generic frame buffer device on some machines. linux/i386
      9. XFree86-Mach32-3.3.6-44
        The XFree86 server for Mach32 based video cards. linux/i386
      10. XFree86-Mach64-3.3.6-44
        The XFree86 server for Mach64 based video cards. linux/i386
      11. XFree86-Mach8-3.3.6-44
        The XFree86 server for Mach8 video cards. linux/i386
      12. XFree86-Mono-3.3.6-44
        A generic XFree86 monochrome server for VGA cards. linux/i386
      13. XFree86-P9000-3.3.6-44
        The XFree86 server for P9000 cards. linux/i386
      14. XFree86-S3-3.3.6-44
        The XFree86 server for video cards based on the S3 chip. linux/i386
      15. XFree86-S3V-3.3.6-44
        The XFree86 server for video cards based on the S3 ViRGE chip. linux/i386
      16. XFree86-SVGA-3.3.6-44
        An XFree86 server for most simple framebuffer SVGA devices. linux/i386
      17. XFree86-VGA16-3.3.6-44
        A generic XFree86 server for VGA16 boards. linux/i386
      18. XFree86-W32-3.3.6-44
        The XFree86 server for video cards based on ET4000/W32 chips. linux/i386
      19. XFree86-compat-modules-3.3.6-44
        Compatibility modules required by most XFree86 3.3.6 servers. linux/i386

      返回首頁 Linux 架站筆記 - www.dreamer.cc


SendMail

更新時間：05/07/2003 11:31:36

設定本機收件時的領域名稱

將領域名稱加入到 [/etc/mail/local-host-names]，每個名稱佔一行。
domain.tld
mail.domain.tld

設定 SMTP 寄件認証

  1. 開啟 [/etc/mail/sendmail.mc]，搜尋下列文字
    dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    。
    。
    。
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
    改為
    TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    。
    。
    。
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
  2. 重新製作 [/etc/sendmail.cf]
    m4 /etc/mail/sendmail.mc > /etc/sendmail.cf

站台Relay

  • 方式一：在 [/etc/mail/access] 加入要 Relay 的站台，完成後執行
    makemap -r hash /etc/mail/access.db < /etc/mail/access
  • 方式二：建立或修改 [/etc/mail/relay-domains]，將所有要 Relay 的機器(或領域名稱)寫進這個檔案，每個名稱佔一行。

透過 POP3 收發信

  1. 確認服務裡的 ipop3 有啟動。
  2. 主機預設只能用 telnet 或 ssh 登入主機，在本機收發信，所以須再修改 [/etc/sendmail.cf]
    O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
    改為
    O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA

問題排除

  1. 如要讓使用者可以使用包含有大寫字母的帳號名稱，修改 [/etc/sendmail.cf]
    Mlocal,	P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
    改為
    Mlocal,	P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9u, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
  2. 收發信件速度很慢?!請修改 [/etc/named.conf]
    //query-source address * port 53;
    改為
    query-source address * port 53;
  3. 經常被某些主機退信，可能是因為你未設定領域名稱的反解，請至你申請 IP 的所屬單位建立領域反解，例如 Hinet 的 http://hidomain.hinet.net/ 。

設定虛擬郵件帳號

  1. 編輯 [/etc/mail/virtusertable]，將虛擬郵件位址指定給特定的使用者:
    username1@domain1.tld	UserName
username2@domain2.tld	UserName@domain.tld
username3@domain3.tld	UserName\@domain.tld
    #username1@domain1.tld 將寄給帳號為"UserName"的本機使用者，
    #username2@domain2.tld 將轉寄到郵件為"UserName@domain.tld"的使用者，
    #username3@domain3.tld 將寄給帳號為"UserName@domain.tld"的本機使用者。
  2. 重新產生 [/etc/mail/virtusertable.db]
    makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable

返回首頁 Linux 架站筆記 - www.dreamer.cc


UebiMiau 2.78 懶惰蟲安裝法

更新時間：05/20/2003 17:09:04

說明

UebiMiau 是一個 WebMail 程式，比較特殊的功能是它含有一個 HTML 編輯器，且內建多國語言，可更換佈景主題。另外，因為它是以 POP3 或 IMAP 通訊協定來收取電子郵件，所以，只要你的郵件伺服器有提供這兩種服務，都可以用 UebiMiau 來收信。

以下的安裝步驟是下載本人修改過的原始檔來安裝 UebiMiau (修改自 UebiMiau 2.78 alpha)，裡面的佈景主題也已經改成我自己設計的佈景主題。

安裝步驟

  1. 從本站下載 UebiMiau 的原始檔到 /var/www/html/，並解壓縮:
    cd /var/www/html
wget http://www.dreamer.cc/source/UebiMiau/UebiMiau-2.78-20030518-tw.tgz
tar -xzvf UebiMiau-2.78-20030518-tw.tgz
  2. 解壓縮之後產生一個 webmail 子目錄，裡面就是 UebiMiau 的主程式。
  3. 修改 webmail/inc/config.php，將 156 ~ 163 列的伺服器設定，改成你要用來收取電子郵件的網域、伺服器及通訊協定:
    $mail_servers[] = Array(
    "domain" => "domain.tld",
    "server" => "mail.domain.tld",
    "login_type" => "%user%",
    "protocol" => "pop3",
    "port" => "110",
    "folder_prefix" => ""
);
  4. 如果你有其它的 POP3 或 IMAP 信箱要收取信件，可依照上一步驟的設定模式，繼續新增在本檔案中。

安裝完成

  • 連上你的網站使用 UebiMiau:
    http://host.domain.tld/webmail/index.php


發送中文傳真

更新時間：05/20/2003 17:08:25

安裝模組

檢查系統是否已安裝 bg5ps,ttfonts-zh_TW,ghostscript,ghostscript-fonts,mgetty,mgetty-sendfax 這 六個套件，沒有的話，請使用 apt 自行安裝。

其中，bg5ps 是用來將 Big5 轉 Postscript，ttfonts-zh_TW 是文鼎中文字型，ghostscript 及 ghostscript-fonts 是用來將 Postscript 轉 G3，mgetty 及 mgetty-sendfax 是傳真的程式。

安裝數據機

  • 直接連結 Modem 裝置即可，若 Modem 是接在 com1，則下此指令:
    ln -s /dev/ttyS0 /dev/modem
  • 若 Modem 是接在 com2，則下此指令:
    ln -s /dev/ttyS1 /dev/modem
    依此類推...

轉換及傳真步驟

  1. 將欲傳真的文字檔轉成 Postscript 格式:
    bg5ps -if test.txt -of test.ps
    預設字型為 "Courier"，大小為 12 點。
    若要更改字型，請直接編輯 [/usr/bin/bg5ps]，將 "Courier" 改成你要的字型名稱 (建議改成 "Courier-Bold")。
    若要更改大小，可加參數 "-s"，如要將字型改成 20 點大小:
    bg5ps -s 20 -if test.txt -of test.ps
  2. 再將 Postscript 格式的文字檔轉成 G3 格式 (須將裝置指定為 "faxg3" 或 "dfaxhigh"):
    gs -sDEVICE=faxg3 -dBATCH -sOutputFile=test.g3 test.ps
    若文件多於一頁，則上面的指令會將文件的每一頁都儲存在 "test.g3"，若希望每一頁都有一個檔案儲存，則可在檔名的地方加上 "%d"，例如:
    gs -sDEVICE=faxg3 -dBATCH -sOutputFile=test.g3.%d test.ps
    gs 尚有幾個實用的參數:
    "-q" 不顯示執行過程產生的訊息、
    "-dNOPAUSE" 程式每轉換一頁便會要你按 "Return" 繼續，加上此參數即可取消。
  3. 發送傳真:
    sendfax -v 12345678 test.g3

整合程序檔

建立 [/usr/bin/big5fax] ，內容如下:
#!/bin/sh
/usr/bin/bg5ps -if $1 -of /tmp/FaxFile.ps
gs -sDEVICE=faxg3 -dBATCH -dNOPAUSE -q -sOutputFile=/tmp/FaxFile.g3 /tmp/FaxFile.ps
/usr/sbin/sendfax -v $2 /tmp/FaxFile.g3
rm -f /tmp/FaxFile.ps /tmp/FaxFile.g3
變更執行屬性:
chmod 755 /usr/bin/big5fax
以後只要下指令 "big5fax 文字檔 電話號碼"即可自動轉換及傳真，例如:
big5fax test.txt 12345678

返回首頁 Linux 架站筆記 - www.dreamer.cc


安裝 Linux 於磁碟陣列系統

更新時間：05/20/2003 16:37:34

注意事項

下列步驟及驅動程式僅適用 RedHat Linux 7.1/7.2/7.3，且使用的 RAID 卡為 "Promise FastTrak100 TX2"。

安裝步驟

  1. 下載下列驅動程式，並自行解壓縮至磁碟片:
    • 單處理器的系統請下載：up-1.02.0.22.zip
    • 多處理器的系統請下載：smp-1.02.0.22.zip
  2. 由光碟開機，開始安裝 RedHat Linux ...
  3. 當進入 "Welcome to Red Hat Linux ..." 的安裝啟始畫面，請於左下角 "boot:" 處輸入下列參數：
    expert ide0=0x1f0,0x3f6,14 ide1=0x170,0x376,15 ide2=0 ide3=0 ide4=0 ide5=0 ide6=0 ide7=0 ide8=0 ide9=0
    輸入完畢，按 [Enter] 繼續下一步驟...
  4. 於 "Devices" 對話框時，請插入剛才製作的磁碟片，並選取 [OK] 及 [Yes]，讓安裝程式讀取磁碟片上的檔案。
  5. 當安裝程序進行到 "Boot Loader" 的配置時，輸入下列啟動參數於 "核心參數(Kernel parameters)" 欄位:
    ide0=0x1f0,0x3f6,14 ide1=0x170,0x376,15 ide2=0 ide3=0 ide4=0 ide5=0 ide6=0 ide7=0 ide8=0 ide9=0
  6. 繼續以正常的步驟安裝 Linux ...
  7. 當安裝程序進行到 "Configuration" 畫面，如果你安裝的 Linux 版本是 RedHat 7.1/7.3，請按 "Exit" 結束安裝。如果你安裝的 Linux 版本是 RedHat 7.2，請按 [Ctrl]-[Alt]-[F2] 進入命令列模式，執行下列指令:
    chroot /mnt/sysimage
mount /dev/fd0 /mnt
cd /mnt
sh setup-ft
cd /
umount /mnt
exit
    執行完畢按 [Ctrl]-[Alt]-[F7] 回到安裝畫面，並按 "Exit" 結束安裝。

返回首頁 Linux 架站筆記 - www.dreamer.cc


tomcat

更新時間：05/15/2003 17:52:07

說明

tomcat 可讓 Linux 支援 JSP 的環境，系統必須有支援 Java，所以必須先安裝 Sun 的 J2SDK 之後，再安裝 tomcat。而 tomcat 已是一個可獨立執行的網頁伺服器，也可以跟 apache 相結合。

安裝步驟

  1. 從本站下載 J2SDK 的安裝檔到 /tmp，並執行安裝：
    cd /tmp
wget http://www.dreamer.cc/source/jsp/j2sdk-1_4_1_02-fcs-linux-i586.rpm
rpm -ivh j2sdk-1_4_1_02-fcs-linux-i586.rpm
  2. 從本站下載 tomcat 4.1.24 的原始檔到 /usr，並解壓縮：
    cd /var
wget http://www.dreamer.cc/source/jsp/jakarta-tomcat-4.1.24.tar.gz
tar -xzvf jakarta-tomcat-4.1.24.tar.gz
mv jakarta-tomcat-4.1.24 tomcat
  3. 將 Java 及 tomcat 的相關路徑加到環境變數，請編輯 /etc/profile，在檔案最下方加入：
    PATH=$PATH:/usr/java/j2sdk1.4.1_02/bin
export JAVA_HOME=/usr/java/j2sdk1.4.1_02
export CLASSPATH=$JAVA_HOME/lib
export CATALINA_HOME=/var/tomcat
  4. 重新載入 /etc/profile：
    source /etc/profile
  5. 啟動 tomcat：
    /var/tomcat/bin/startup.sh

安裝成功

連結網址：
http://host.domain.tld:8080/

啟動與停止 tomcat

  • 啟動 tomcat：
    /var/tomcat/bin/startup.sh
  • 停止 tomcat：
    /var/tomcat/bin/shutdown.sh

變更監聽埠

tomcat 預設的監聽埠是 "8080"，如果要拿它來取代 apache，只要改埠號為 "80" 即可。但原則上，因為 tomcat 的伺服器除了提供 jsp 支援外，其它功能較為薄弱，所以不建議取代 apache，比較好的作法是將 tomcat 整合到 apache。

如果你確定要變更埠號，請編輯 /var/tomcat/conf/server.xml，找到 port="8080"，將它改成 prot="80" 或其它埠號，然後重新啟動即可。

將 tomcat 整合到 apache

  1. 編輯 /etc/httpd/conf/httpd.conf，在最下方加入
    LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
JkLogFile /etc/httpd/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
Include /etc/httpd/conf/mod_jk.conf
  2. 從本站下載 mod_jk 的原始檔到 /etc/httpd/，並解壓縮：
    cd /etc/httpd
wget http://www.dreamer.cc/source/jsp/mod_jk.tgz
tar -xzvf mod_jk.tgz
  3. 重新啟動 tomcat 及 apache (須注意順序)：
    /var/tomcat/bin/shutdown.sh
service httpd restart
/var/tomcat/bin/startup.sh
  4. 如果在重新啟動 httpd 時，有出現 mod_jk.so 的警告訊息，請至下列網址下載符合你的 Apache 版本的模組：
    http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk/release/v1.2.3/bin/linux/
    改名成 mod_jk.so，存放到 /etc/httpd/modules/ (本站使用的是 "mod_jk.so.ap1.3.27-eapi.rh72")。
  5. 整合之後，如果用瀏覽器存取網頁，會有四種狀況：
    1. 如果在網址上存取 http://host.domain.tld/examples/ 下的任何檔案，它等於是存取本機 /var/tomcat/webapps/examples/ 下的檔案 (因為這部份有宣告在 mod_jk.conf)。
    2. 如果在網址上存取的是 http://host.domain.tld/*.jsp，則會變成是存取本機 /var/tomcat/webapps/ROOT/ 下的 *.jsp (因為這部份有宣告在 httpd.conf)。
    3. 如果在網址上存取的是 http://host.domain.tld/path/*.jsp，則會變成是存取本機 /var/tomcat/webapps/path/ 或 /var/tomcat/webapps/ROOT/path/ 下的 *.jsp。
    4. 但如果在網址上存取的是 http://host.domain.tld/examples/ 之外的其它檔案，則它又會變成是存取本機 /var/www/html/ 內的檔案。
    所以，為了避免搞亂，應該把 *.jsp 及相關的檔案存放在同一個子目錄 (且這個子目錄必須位於本機 /var/tomcat/webapps/ROOT/ 下)，並將該目錄宣告在 /etc/http/conf/mod_jk.conf。

返回首頁 Linux 架站筆記 - www.dreamer.cc


resin

更新時間：05/15/2003 17:25:09

說明

resin 可讓 Linux 支援 JSP 的環境，系統必須有支援 Java，所以必須先安裝 Sun 的 J2SDK 之後，再安裝 resin。而 resin 已是一個可獨立執行的網頁伺服器。

相較於 tomcat，resin 的穩定性及效能都有比較好。但需注意的是，resin 只有在你用來發展程式的過程時是免費的，其它用途都要付費。

安裝步驟

  1. 從本站下載 J2SDK 的安裝檔到 /tmp，並執行安裝：
    cd /tmp
wget http://www.dreamer.cc/source/jsp/j2sdk-1_4_1_02-fcs-linux-i586.rpm
rpm -ivh j2sdk-1_4_1_02-fcs-linux-i586.rpm
  2. 從本站下載 resin 2.1.9 的原始檔到 /usr，並解壓縮：
    cd /var
wget http://www.dreamer.cc/source/jsp/resin-2.1.9.tar.gz
tar -xzvf resin-2.1.9.tar.gz
mv resin-2.1.9 resin
  3. 將 Java 及 tomcat 的相關路徑加到環境變數，請編輯 /etc/profile，在檔案最下方加入：
    PATH=$PATH:/usr/java/j2sdk1.4.1_02/bin
export JAVA_HOME=/usr/java/j2sdk1.4.1_02
export CLASSPATH=$JAVA_HOME/lib
export RESIN_HOME=/var/resin
  4. 重新載入 /etc/profile：
    source /etc/profile
  5. 啟動 resin：
    /var/resin/bin/httpd.sh start

安裝成功

連結網址：
http://host.domain.tld:8080/

啟動與停止 resin

  • 啟動 resin：
    /var/resin/bin/httpd.sh start
  • 停止 resin：
    /var/resin/bin/httpd.sh stop
  • 重新啟動 resin：
    /var/resin/bin/httpd.sh restart

變更監聽埠

resin 預設的監聽埠是 "8080"，如果你想要變更埠號，請編輯 /var/resin/conf/resin.conf，找到 port='8080'，將它改成其它你想要的編號，再重新啟動 resin 即可 (應避免與 apache 的 port:80 或其它服務相衝突)。

返回首頁 Linux 架站筆記 - www.dreamer.cc


資料庫操作

  1. 建立資料庫
    CREATE DATABASE Database_Name;
  2. 顯示所有的資料庫
    1. SHOW DATABASES;
    2. % mysqlshow
  3. 顯示作用中的資料庫
    SELECT DATABASE();
  4. 切換至某個資料庫
    1. USE Database_Name;
    2. % mysql Database_Name
  5. 移除資料庫
    DROP DATABASE Database_Name;
  6. 印出 MySQL 的環境變數
    % mysqladmin variables
  7. ...


資料表操作

  1. 顯示資料庫內含的資料表
    SHOW TABLES;
  2. 顯示資料表的欄位結構
    1. DESCRIBE Table_Name;
    2. SHOW COLUMNS FROM Table_Name;
    3. SHOW FIELDS FROM Table_Name;
    4. EXPLAIN Table_Name;
    5. % mysqlshow Database_Name Table_Name
  3. 顯示所有資料表的相關資訊
    SHOW TABLE STATUS [FROM Database_Name | LIKE "Table_Name"];
  4. 刪除資料表所有的記錄
    DELETE FROM Table_Name;
  5. 更改資料表名稱
    ALTER TABLE Table_Name_Old RENAME Table_Name_New;
  6. 從外部檔案加入資料
    1. LOAD DATA LOCAL INFILE "Filename.txt" INTO TABLE Table_Name;
# Filename.txt 內需以"跳格"及"換行"來分格的欄位及記錄
    2. % mysqlimport --local Database_Name Table_Name.txt
  7. 顯示資料表的結構指令(含資料)
    % msqldump Database_Name Table_Name
  8. 顯示資料表的結構指令(不含資料)
    % msqldump --no-data Database_Name Table_Name
  9. 移除資料表
    DROP TABLE [IF EXISTS] Table_Name;
  10. 資料表最佳化處理
    OPTIMIZE TABLE Table_Name;
  11. 建立索引
    CREATE INDEX Index_Name ON Table_Name(Column_Name1,Column_Name2,...);
  12. 移除索引
    DROP INDEX Index_Name ON Table_Name;
  13. 顯示資料表的索引資訊
    1. SHOW INDEX FROM Table_Name;
    2. % mysqlshow --keys Database_Name Table_Name;
  14. 鎖定資料表
    LOCK TABLE Table_Name [READ | LOW_PRIORITY_WRITE | WRITE];
  15. 解除所有鎖定的資料表
    UNLOCK TABLES;
  16. ...


建立資料表

  1. 在資料庫中建立一個新的資料表
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] Table_Name(
    Column_Name1 Type(Length) [NOT NULL | DEFAULT n | AUTO_INCREMENT | PRIMARY KEY | UNIQUE | ZEROFILL],
    Column_Name2 Type(Length) [NOT NULL | DEFAULT n | AUTO_INCREMENT | PRIMARY KEY | UNIQUE | ZEROFILL],...
    [INDEX Index_Name(),UNIQUE Index_Name(),PRIMARY KEY()]
)
[AUTO_INCREMENT=n]
[COMMENT="String..."]
[TYPE=ISAM | MYISAM | HEAP];
# AUTO_INCREMENT 型態需與 NOT NULL、PRIMARY KEY 或 UNIQUE 一起使用
    範例：
    CREATE TABLE IF NOT EXISTS member(
    id	INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name	VARCHAR(30) NOT NULL,
    PRIMARY KEY(id,name)
)
AUTO_INCREMENT=100
COMMENT="會員資料表"
TYPE=MYISAM;
  2. 由已存在的資料表建立一個新料表，並複製其記錄
    CREATE TABLE Table_Name_New
SELECT Column_Name1,Column_Name2,...
FROM Table_Name_Old
WHERE ...;
  3. ...


Apache 小技巧

更新時間：05/20/2003 16:29:54

讓使用者可以在自己的家目錄下放置網頁

  • Apache 已預設讓使用者可以在自己的家目錄下放置網頁，使用者只須更改自已家目錄的屬性為 711，並在自己的家目錄下建立一個 public_html 的子目錄，將網頁放置在該目錄即可:
    chmod 711 /home/username
mkdir /home/username/publice_html

讓使用者可以放置 cgi 程式

  1. 修改 /etc/http/conf/http.conf，增加下列設定:
    <Directory "/home/*/public_html/cgi-bin">
    Options ExecCGI
    SetHandler cgi-script
</Directory>
  2. 修改完請重新啟動 apache:
    service httpd restart
  3. 使用者可於自已家目錄下的 public_html 內再建立一個 cgi-bin 的子目錄，裡面即可放置 cgi 程式。須特別注意的是，cgi-bin 這個子目錄及其下的 cgi 程式，其 "擁有者" 及 "擁有群組" 皆必須是該使用者，否則執行時會產生錯誤。

返回首頁 Linux 架站筆記 - www.dreamer.cc


DNS Server

更新時間：05/20/2003 16:32:08

完整領域名稱

完整領域名稱(FQDN) = 區域名稱(Zone) + 領域名稱(Domain)
例如: redhat.test.edu.tw = redhat + test.edu.tw
FQDN=Fully Qualified Domain Name

正解檔的功能

在同一個領域下(例如: test.edu.tw)，由 "區域名稱(Zone)" 取得 IP 。

反解檔的功能

在同一個 IP 領域下(例如: 192.168.1)，由 "IP 尾碼" 取得 "完整領域名稱"。

MX 的說明

設定由某一主機名稱所組成的 FQDN 之郵件伺服器的名稱。

  1. 語法：IN MX
  2. 只能接受主機名稱或 FQDN，不可使用 IP(若使用 IP 會被當成 "主機名稱")。
  3. 不會有遞迴的問題。

返回首頁 Linux 架站筆記 - www.dreamer.cc

其它

  1. 在 /var/named/domain.tld 裡可設定:
    *	IN	A	11.22.33.44
    則 *.domain.tld 的網址皆會連到 11.22.33.44 這台主機，可以用這個方法來發展轉址功能。


FreeISP

更新時間：05/07/2003 11:31:16

ISP | 電話 | 帳號 | 密碼
PCHOME | 449-6688 | pchome | pchome
KKCity | 4050-8888 | kk | kk@u2online
Yam | 4050-6666 | yam | iloveyam
智邦 | 4066-1234 | url | url

返回首頁 Linux 架站筆記 - www.dreamer.cc


htaccess 認證方式

更新時間：05/20/2003 16:34:41

建立使用者驗證檔

  1. 建立使用者驗證檔，並新增一組帳號及密碼:
    htpasswd -c /usr/local/etc/htusers UserName1
  2. 繼續增加一組帳號及密碼到驗證檔:
    htpasswd /usr/local/etc/htusers UserName2

建立群組資料檔

  • 群組資料檔的目的是要將多個使用者設為一個群組，請新增或編輯 /usr/local/etc/htgroups，依需求增加如下的設定:
    Group1:UserName1 UserName2

登入驗證檔

在欲執行使用者驗證的網頁目錄下，建立一個 .htaccess，驗證的方式可針對使用者或群組。

  • 針對使用者:
    Auth Name " 請輸入帳號與密碼"
AuthType Basic
AuthUserFile /usr/local/etc/htusers
require user UserName1
  • 針對群組:
    Auth Name " 請輸入帳號與密碼"
AuthType Basic
AuthUserFile /usr/local/etc/htusers
AuthGroupFile /usr/local/etc/htgroups
require group Group1

返回首頁 Linux 架站筆記 - www.dreamer.cc


NFS

更新時間：05/22/2003 17:34:42

說明

使用 NIS 的方式，可以讓你用一部伺服器統一管理所有伺服器的帳號及密碼。

經測試的結果，SSH、POP3、Sendmail 可以正確做驗證，但 FTP 驗證失敗，Open WebMail 須修改設定檔才能以 Server 端的帳號在 Client 端登入。

目錄分享的語法及參數

  • 語法:
    子目錄 主機1(參數,...) [主機2(參數,...)]
  • 參數:
    rw | 可讀寫的權限。
    ro | 唯讀的權限。
    no_root_squash | 登入 NFS 主機的使用者如果是 root 的話，那麼對於這個分享的目錄來說，他就具有 root 的權限。
    root_squash | 登入 NFS 主機的使用者如果是 root 的話，那麼對於這個分享的目錄來說，他只能有 nobody 的權限。
    all_squash | 不論登入 NFS 的使用者身份為何，對於這個分享的目錄來說，他只能有nobody 的權限。
    anonuid=<uid> | 需配合 "all_squash" 或 "root_squash" 參數使用，可將登入 NFS 的使用者身份改成指定的 uid。
    anongid=<gid> | 需配合 "all_squash" 或 "root_squash" 參數使用，可將登入 NFS 的使用者身份改成指定的 gid。
    sync | 資料同步寫入硬碟。
    async | 資料先暫存於記憶體，再寫入硬碟。

NFS Server 安裝步驟

(以 192.168.1.10 做為 NFS Server，分別有 192.168.1.11 及 192.168.1.12 做為 NFS 的 Clinet 端)

  1. 檢查系統是否已安裝 portmap,nfs-utils 這兩個套件，沒有的話，請自行安裝。
  2. 編輯 /etc/exports，將欲分享的子目錄、允許存取的主機及存取規則寫入，這方面請參考語法及參數，範例如下:
    /var/backup 192.168.1.12(rw,all_squash,anonuid=502,anongid=502,sync)
/home 192.168.1.11(rw,no_root_squash) 192.168.1.12(rw,no_root_squash)
/var/www 192.168.1.11(rw,no_root_squash)
  3. 執行 "ntsysv"，將 portmap 及 nfs 設為啟動:
    ntsysv a 將 portmap 及 nfs 設為啟動
  4. 啟動 portmap 及 nfs:
    service portmap start
service nfs start

NFS Client 安裝步驟

(下列步驟是以 192.168.1.12 做為 NFS 的 Clinet 端)

  1. 檢查系統是否已安裝 portmap 這個套件，沒有的話，請自行安裝。
  2. 執行 "ntsysv"，將 portmap 設為啟動:
    ntsysv a 將 portmap 設為啟動
  3. 啟動 portmap:
    service portmap start
  4. 掛載伺服器分享的子目錄 (將伺服器的 "/home" 掛載到本機的 /home，將伺服器的 "/var/backup" 掛載到本機 /mnt/backup。因為本機的 /mnt/backup 不存在，故要先建立此子目錄):
    mount -t nfs -o bg,soft,intr 192.168.1.10:/home /home
mkdir /mnt/backup
mount -t nfs -o bg,soft,intr 192.168.1.10:/var/backup /mnt/backup
  5. 設定為開機時即自動掛載，請編輯 /etc/rc.d/rc.local，加入:
    mount -t nfs -o bg,soft,intr 192.168.1.10:/home /home
mount -t nfs -o bg,soft,intr 192.168.1.10:/var/backup /mnt/backup

檢視 Server 所分享的子目錄

  • 檢視 NFS Server 所分享的子目錄:
    showmount -e 192.168.1.10

Export list for 192.168.1.10:
/var/backup 192.168.1.12
/home 192.168.1.11,192.168.1.12
/var/www 192.168.1.11

返回首頁 Linux 架站筆記 - www.dreamer.cc


NIS

更新時間：05/20/2003 16:55:17

說明

使用 NIS 的方式，可以讓你用一部伺服器統一管理所有伺服器的帳號及密碼。

經測試的結果，SSH、POP3、Sendmail 可以正確做驗證，但 FTP 驗證失敗，Open WebMail 須修改設定檔才能登入。

NIS Server 安裝步驟

NIS Server 端主要用來統一管理帳號及密碼 (uid 為 500 以上的帳號)，供其它 Client 端做為登入時的驗證。

  1. 檢查系統是否已安裝 portmap,yp-tools,ypserv 這三個套件，沒有的話，請使用 apt 自行安裝。
  2. 啟動 portmap:
    service portmap start
  3. 執行 "ntsysv"，將 portmap,time,time-udp,yppasswdd 及 ypserv 設為啟動，然後重新啟動 portmap 及 xinetd:
    ntsysv a 將 portmap,time,time-udp,yppasswdd 及 ypserv 設為啟動
service xinetd restart
  4. 設定 NIS 的領域名稱:
    /bin/nisdomainname domain.tld
  5. 修改 /etc/sysconfig/network，加入:
    NISDOMAIN=domain.tld
  6. 設定信任的 IP 範圍，請編輯 /etc/ypserv.conf，依你的需求加入:
    127.0.0.0/255.255.255.0	: * : * : port
192.168.1.0/255.255.255.0	: * : * : port
*			: * : * : deny
  7. 建立 /etc/netgroup:
    touch /etc/netgroup
  8. 啟動 ypserv 與 yppasswd:
    service ypserv start
service yppasswdd start
  9. 建立相關資料庫:
    /usr/lib/yp/ypinit -m

At this point, we have to construct a list of the hosts which will run NIS
servers. mail.mioagri.org is in the list of NIS server hosts. Please continue
to add
the names for the other hosts, one per line. When you are done with the
list, type a <control D>.
next host to add: host.domain.tld
next host to add: <按 "Ctrl-D" 結束>
The current list of NIS servers looks like this:

host.domain.tld

Is this correct? [y/n: y] <按 "Enter" 繼續>
We need a few minutes to build the databases...
Building /var/yp/mioagri.org/ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/domain.tld'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
Updating hosts.byaddr...
Updating rpc.byname...
Updating rpc.bynumber...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating protocols.bynumber...
Updating protocols.byname...
Updating mail.aliases...
gmake[1]: Leaving directory `/var/yp/domain.tld'

mail.mioagri.org has been set up as a NIS master server.

Now you can run ypinit -s mail.mioagri.org on all slave server.

NIS Client 安裝步驟

  1. 檢查系統是否已安裝 portmap,yp-tools,ypbind 這三個套件，沒有的話，請使用 apt 自行安裝。
  2. 啟動 portmap:
    service portmap start
  3. 設定 NIS 的領域名稱:
    /bin/nisdomainname domain.tld
  4. 修改 /etc/sysconfig/network，加入:
    NISDOMAIN=domain.tld
  5. 修改 /etc/passwd，在最後加入:
    +::::::
  6. 修改 /etc/nsswitch.conf，找到相關參數，改成如下的設定:
    passwd: files nis nisplus
shadow: files nis nisplus
group: files nis nisplus
hosts: files nis dns
  7. 執行 "ntsysv"，將 protmap 及 ypbind 設為啟動，並啟動 ypbind:
    ntsysv a 將 portmap 及 ypbind 設為啟動
service ypbind start

從 Server 端變更密碼

  1. 執行 "passwd" 變更:
    passwd UserAccount

Changing password for user UserAccount.
New password: <輸入新密碼>
Retype new password: <再輸入一次新密碼>
passwd: all authentication tokens updated successfully.
  2. 重新建立資料庫:
    /usr/lib/yp/ypinit -m

At this point, we have to construct a list of the hosts which will run NIS
servers. mail.mioagri.org is in the list of NIS server hosts. Please continue
to add
the names for the other hosts, one per line. When you are done with the
list, type a <control D>.
next host to add: host.domain.tld
next host to add: <按 "Ctrl-D" 結束>
The current list of NIS servers looks like this:

host.domain.tld

Is this correct? [y/n: y] <按 "Enter" 繼續>
We need a few minutes to build the databases...
Building /var/yp/mioagri.org/ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/domain.tld'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
Updating hosts.byaddr...
Updating rpc.byname...
Updating rpc.bynumber...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating protocols.bynumber...
Updating protocols.byname...
Updating mail.aliases...
gmake[1]: Leaving directory `/var/yp/domain.tld'

mail.mioagri.org has been set up as a NIS master server.

Now you can run ypinit -s mail.mioagri.org on all slave server.

從 Client 端變更密碼

  • 可執行 "yppasswd" 變更使用者密碼，語法同 "passwd"，但必須先輸入 NIS Server 端的 root 密碼:
    yppasswd UserAccount

Changing NIS account information for UserAccount on mail.mioagri.org.
Please enter root password: <輸入 NIS Server 端 root 的密碼>
Changing NIS password for UserAccount on host.domain.tld.
Please enter new password: <輸入新密碼>
Please retype new password: <再輸入一次新密碼>

The NIS password has been changed on host.domain.tld.

Open WebMail 修改

修改使用者的驗證方式，可以讓使用者以遠端的帳號登入 Open WebMail (得先用 NFS 的方式將 /home 掛載到 Client 端的伺服器)，但仍無法在 Open WebMail 內變更密碼。

  • 修改使用者登入的驗證方式，請編輯 auth_unix.pl:
    $unix_passwdfile_encrypted a /usr/bin/ypcat passwd|

返回首頁 Linux 架站筆記 - www.dreamer.cc


Perl 的模組

更新時間：05/20/2003 16:41:34

壓縮功能

  1. Archive::Zip
  2. Compress::Zlib

圖型處理

  1. Image::Magick #安裝時需開啟GIF壓縮功能
  2. Image::Thumbnail #可用 Image::Magick::Thumbnail 取代

寄信相關

  1. MIME::Lite
  2. MIME::Types

Unicode 轉換

  1. Unicode::String
  2. Unicode::Map
  3. Lingua::ZH::HanConvert #支援 Unicode 簡繁互換
  4. Encode::HanConvert #若 Perl 版本小於 5.8，僅可執行中文字簡繁互換；若版本為 5.8 以上，則可再支援 Unicode 的簡繁互換

安裝 ImageMagick 相關模組

  1. 下載 ImageMagick-5.5.4-3.tar.gz 的原始檔於 /tmp，解壓縮及安裝 ImageMagick，且啟用 GIF 的 lzw 壓縮功能:
    cd /tmp
wget http://www.dreamer.cc/source/ImageMagick/ImageMagick-5.5.4-3.tar.gz
tar -xzvf ImageMagick-5.5.4-3.tar.gz
cd ImageMagick-5.5.4
./configure --enable-lzw
make
make install
  2. 繼續安裝 Perl 的 Magick 模組:
    cd PerlMagick
perl Makefile.PL
make
make install

返回首頁 Linux 架站筆記 - www.dreamer.cc


Postfix

更新時間：05/22/2003 17:05:58

安裝步驟

  1. 先移除 sendmail:
    apt-get remove sendmail
  2. 使用 apt 安裝 postfix:
    apt-get install postfix
  3. 編輯 /etc/postfix/main.cf，搜尋下列參數，並修改如下:
    myhostname = host.domain.tld
mydomain = domain.tld
myorigin = $myhostname
inet_interfaces = all
mydestination = $myhostname
mynetworks = 127.0.0.0/8 hash:/etc/postfix/access
relay_domains = $mydestination
alias_maps = hash:/etc/postfix/aliases
  4. 啟動 postfix:
    service postfix start

返回首頁 Linux 架站筆記 - www.dreamer.cc


Postfix & Vm-pop3d

更新時間：05/27/2003 09:01:46

說明

其實，vm-pop3d 的功能很單純，如要登入一部有安裝 vm-pop3d 的伺服器讀取郵件，有兩種驗證使用者的方式:

  • 你可以只輸入使用者名稱做為登入的帳號，則它先去查詢 /etc/passwd 及 /etc/shadow，以驗證帳號、密碼是否正確，如正確，再檢查 /var/spool/mail/UserName 是否有郵件。
  • 如果你輸入的是電子郵件 (UserName@virtual.domain.name) 做為登入的帳號，它就會依據這個帳號，拆解成 "UserName" 及 "virtual.domain.name" 兩個部份，然後查詢 /etc/virtual/virtual.domain.name/passwd，以驗證帳號、密碼是否正確，如正確，則繼續檢查 /var/spool/virtual/virtual.domain.name/UserName 是否有郵件。

所以，你只需要想辨法把虛擬伺服器使用者的郵件放到相對應的子目錄即可。

postfix 基本設定

系統必須先安裝好 postfix，藉由 postfix，將虛擬伺服器之使用者的郵件放到相對應的子目錄。以下步驟僅說明如何設定虛擬伺服器。

  1. 先移除 imap:
    apt-get remove imap
  2. 編輯 /etc/postfix/main.cf，加入:
    default_privs = nobody
mail_spool_directory = /var/spool/mail
propagate_unmatched_extensions = virtual
virtual_mailbox_base = /var/spool/virtual
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_maps = hash:/etc/postfix/virtual
  3. 建立相關子目錄:
    mkdir /var/spool/virtual
mkdir /etc/virtual

安裝 vm-pop3d

  1. 從本站下載 vm-pop3d 的安裝檔至 /tmp，並執行安裝:
    cd /tmp
wget http://www.dreamer.cc/source/vm-pop3d/vm-pop3d-1.1.6-1.i386.rpm
rpm -Uvh vm-pop3d-1.1.6-1.i386.rpm
  2. 刪除 vm-pop3d 的預設的啟動程式:
    rm -rf /etc/init.d/vm-pop3d
  3. 建立 /etc/xinetd.d/vm-pop3d，內容如下:
    service pop3
 {
        disable = no
        socket_type = stream
        protocol = tcp
        wait = no
        user = root
        instances = 25
        server = /usr/sbin/vm-pop3d
        server_args = -u nobody
        log_type = SYSLOG local4 info
        log_on_success = PID HOST EXIT DURATION
        log_on_failure = HOST ATTEMPT
     }
  4. 重新載入 xinetd，以啟動 vm-pop3d:
    service xinetd restart

建立虛擬伺服器

  1. 編輯 /etc/postfix/virtual_mailbox，在最下面加入:
    virtual.domain.tld /var/spool/virtual/virtual.domain.tld
  2. 編輯 /etc/postfix/virtual，在最下面加入:
    virtual.domain.tld anything
UserName@virtual.domain.tld UserName.virtual.domain.tld
  3. 編輯 /etc/postfix/aliases，在最下面加入:
    UserName.virtual.domain.tld: /var/spool/virtual/virtual.domain.tld/UserName
  4. 編輯 /etc/postfix/access，在最下面加入:
    virtual.domain.tld ok
  5. 重新建立資料庫:
    postmap hash:/etc/postfix/virtual_mailbox
postmap hash:/etc/postfix/virtual
postalias hash:/etc/postfix/aliases
postmap hash:/etc/postfix/access
  6. 建立相關子目錄及密碼檔:
    mkdir /var/spool/virtual/virtual.domain.tld
chown nobody.mail /var/spool/virtual/virtual.domain.tld
mkdir /etc/virtual/virtual.domain.tld
touch /etc/virtual/virtual.domain.tld/passwd
chmod 644 /etc/virtual/virtual.domain.tld/passwd
  7. 重新啟動 postfix:
    service postfix restart

建立虛擬伺服器的使用者

對 vm-pop3d 而言，驗證使用者的方式，只是檢查虛擬伺服器的子目錄下，該使用者的密碼是否被建立。

  • 建立使用者的密碼:
    htpasswd /etc/virtual/virtual.domain.tld/passwd UserName

連線方式

  • 如果你只是伺服器上本機的使用者，當登入時，使用原本的 "使用者帳號 (UserName)" 來做驗證即可。
  • 如果你是伺服器上額外設定的虛擬伺服器使用者，登入時，需輸入完整的 "電子郵件 (UserName@virtual.domain.tld)" 做為驗證的帳號。

使用 Open WebMail 讀取郵件

  1. 建立 /var/www/cgi-bin/openwebmail/etc/sites.conf/virtual.domain.tld，內容如下:
    auth_module		auth_vdomain.pl
auth_withdomain		yes
mailspooldir		/var/spool/virtual/virtual.domain.tld
use_syshomedir		no
use_homedirspools	no
enable_autoreply		no
enable_setforward		no
enable_vdomain		yes
vdomain_admlist		sysadmin
vdomain_maxuser		100
vdomain_vmpop3_pwdpath	/etc/virtual
vdomain_vmpop3_pwdname	passwd
vdomain_vmpop3_mailpath	/var/spool/virtual
vdomain_postfix_aliases	/etc/postfix/aliases
vdomain_postfix_virtual	/etc/postfix/virtual
vdomain_postfix_postalias	/usr/sbin/postalias
vdomain_postfix_postmap	/usr/sbin/postmap
  2. 請注意，上面的設定檔有一個 "vdomain_admlist" 的參數，這個參數是用來指定哪些使用者擁有管理者權限。管理者可於該虛擬伺服器下建立、修改或刪除使用者。
  3. 登入 Open WebMail 時...
    • 如果你是本機使用者，則僅需輸入 "使用者名稱 (UserName)" 與 "密碼" 即可登入。
    • 如果你是虛擬伺服器的使用者，且連線的網址與虛擬伺服器位址 (http://virtual.domain.tld) 相同，則僅需輸入 "使用者名稱 (UserName)" 與 "密碼" 即可。
    • 如果你是虛擬伺服器的使用者，且連線的網址也與虛擬伺服器位址不相同，則你必須輸入 "電子郵件 (UserName@virtual.domain.tld)" 與 "密碼" 才能登入。

返回首頁 Linux 架站筆記 - www.dreamer.cc


procmail

更新時間：05/20/2003 16:56:03

啟用 procmail 過濾郵件

  1. 檢查系統是否已安裝 procmail，沒有的話，請使用 apt 自行安裝。
  2. 建立 /etc/procmailrc，內容如下 (過濾的內容可參考 http://www.adj.idv.tw/phpBB2/viewtopic.php?t=946 / http://phorum.vbird.idv.tw/viewtopic.php?t=45):
    MAILDIR=/var/spool/mail
VERBOSE=off
PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin
LOGFILE=/var/log/procmail.log

# 過濾這樣的主旨(WORM_KLEZ.G)：
:0b
* ^Subject:.*(Let's be friends)
/dev/null

# 過濾附件中有下列副檔名的信件。
:0 B
* ^Content-Type:.*
* ^.*name=.*\.(hta|com|pif|vbs|vbe|js|jse|exe|bat|cmd|vxd|scr|shm|dll|SCR)
/dev/null

################ Virus scanner ##################################
############# 1. KLEZ.G Virus ###################################
:0b
* ^Subject:.*(Let's be friends)
/dev/null

:0b
* ^Subject:.*A funny game
/dev/null

:0b
* ^Subject:.*Hello\,.*\,how are you.*
/dev/null

:0 B
* ^Content-Type:.*audio/x-wav.*
* ^.*name=.*\.(scr|SCR)
/dev/null

:0 B
* ^Content-Type:.*audio/x-midi.*
* ^.*name=.*\.(scr|SCR)
/dev/null

:0 B
* ^Content-Type:.*application/octet-stream.*
* ^.*name=.*\.(scr|SCR)
/dev/null

:0 Bb
* ^This game is my first work.*
* ^You\'re the first player.*
* I.*you would .* it.*
/dev/null

:0 Bb
* ^This is a.*patch.*
* ^I .* you would.*it.*
/dev/null

:0 Bb
* .*iframe src=3Dcid.*height=3D0 width=3D0.*
/dev/null

:0 B
* ^Content-Type:.*multipart/mixed.*
* name="ANTI_CIH.EXE"
/dev/null

############# SirCam Virus ###################################
:0 Bh
*I send you this file in order to have your advice
/dev/null

############# Nimda Virus ####################################
:0 Bh
* ^Content-Type:.*audio/x-wav.*
* name="readme.exe"
/dev/null

:0 Bh
* ^Content-Type:.*audio/x-wav.*
* name="sample.exe"
/dev/null

:0 B
* ^Content-Type:.*multipart/mixed.*
* name="readme.exe"
/dev/null

:0 B
* ^Content-Type:.*multipart/mixed.*
* name="sample.exe"
/dev/null

:0 B
* ^Content-Type:.*application.*
* name="readme.exe"
/dev/null

:0 B
* ^Content-Type:.*application.*
* name="sample.exe"
/dev/null
  3. 自行編輯 /etc/logrotate.d/syslog，將 "/var/log/procmail.log" 加入它的 log 清單，讓它可以自動分割 ，以免檔案越來越大。

觀看 procmail 的統計資料

  • 執行下列指令即可:
    mailstat -k /var/log/procmail.log

將每天的統計資料寄給管理者

  1. 於 /etc/cron.daily/ 新增指令檔 "procmail.sh"，內容如下:
    #! /bin/sh
hostname
echo
mailstat -k /var/log/procmail.log
  2. 更改檔案屬性為 755:
    chmod 755 /etc/cron.daily/procmail

返回首頁 Linux 架站筆記 - www.dreamer.cc


主機及網路設定

更新時間：05/20/2003 17:08:39

修改主機名稱

  1. 使用 hostname 指令變更主機名稱:
    hostname 新主機名稱
  2. 修改 [/etc/sysconfig/network] 的 HOSTNAME 變數，改為新設定的主機名稱。
  3. 修改 [/etc/hosts] 內的主機名稱及別名。
  4. 修改 [/etc/resolv.conf]，並依需求修改 search 或 domain 的內容。

修改 IP 需異動到的檔案

  1. 修改 [/etc/hosts]。
  2. 修改 [/etc/resolv.conf]。
  3. 修改 [/etc/named.conf] 及該檔指定的正解檔、反解檔。

返回首頁 Linux 架站筆記 - www.dreamer.cc


Openwebmail 1.90
完成postfix + sasl認證 , 後 , 配合openwebmail來新增主機Mail Server的web介面，並可提供使用者更改密碼的功能。先確認apache(PHP)相關套件的安裝及啟動，另外較需注意的是perl-Text-iconv這個套件是否已安裝妥當->->->重要。
*若系統為Redhat7. 2以後的版本，則必須要有perl-suidperl套件的安裝。
相關套件下載網址
http://openwebmail.org/openwebmail/download/redhat/rpm/release/openwebmail-1.90-1.i386.rpm
http://openwebmail.org/openwebmail/download/redhat/rpm/packages/rh80/perl-Text-Iconv-1.2-RH80.386.rpm
http://openwebmail.org/openwebmail/download/redhat/rpm/packages/rh80/perl-suidperl-5.8.0-55.i386.rpm
下列為原始碼的下載位置
http://openwebmail.org/openwebmail/download/openwebmail-1.90.tgz
http://openwebmail.org/openwebmail/download/packages/Text-Iconv-1.2.tar.gz

如果採用rpm安裝 , 安裝系統會自動對應到正確路徑 ; 若使用手動安裝 , 必須將openwebmail目錄及data目錄移至如下=> /var/www/cgi-bin/openwebmail 及 /var/www/data

#加入openwebmail的權限
vi /etc/httpd/conf/commonhttpd.conf

<Directory /var/www/cgi-bin/openwebmail>
AllowOverride All
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>

ScriptAlias /cgi-bin/openwebmail /var/www/cgi-bin/openwebmail
AddHandler cgi-script .cgi .pl
#存檔後重新啟動~ (service httpd restart)

修改 /var/www/cgi-bin/openwebmail/auth_unix.pl
#下列兩行請改為這樣
my $unix_passwdfile_plaintext="/etc/passwd";
my $unix_passwdfile_encrypted="/etc/shadow";

vi /var/www/cgii-bin/openwebmail/etc/openwebmail.conf
#大致上只需把相對位置設對即可
#要注意的是
：
mailspooldir /var/mail 改為 mailspooldir /var/spool/mail
：
default_language en 改為 default_language zh_TW.Big5
#上列涵義為將語系改為繁體中文
#存檔離開

接下來使用root執行初始化
/var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init
#將openwebmail.conf中的設定改為執行初始化後系統所要求的… 如下~
：
dbm_ext .pag
dbmopen_ext none
dbmopen_haslock no
：
#存檔離開
#再執行一次初使化
/var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init
#(這時便會出現一些訊息)
最後出現一行
Send the site report?(Y/n) 按Enter即可
這樣便完成openwebmail的設定

#重點來了( 這個必須在初始化完成後才修改 , 否則會無法初使化 )
#先在 /var/log中建立一個webmail的目錄
mkdir /var/log/webmail

修改openwebmail.conf
：
dbmopen_haslock no 改為 dbmopen_haslock yes
：
：
logfile /var/log/openwebmail.log 改為 logfile /var/log/webmail/openwebmail.log
：
#存檔離開
#這樣登入便不會有問題 , 否則會發生lock不到檔案的情況!!

完成以上的設定 , 便可開始使用openwebmail囉
http://abc.com.tw/cgi-bin/openwebmail/openwebmail.pl
#若您覺得上列網址太長難記 , 有一解決方法 ~~
在 /var/www/html/ 之下新建立一個檔案
mail.htm
#修改其內容：

<HTML>
<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://abc.com.tw/cgi-bin/openwebmail/openwebmail.pl/">
</HEAD>
</HTML>
#存檔離開
那麼之後只要進入 http://abc.com.tw/mail.htm 即可

PS.
1.Openwebmail 1.90 新增網路硬碟及遠端登入功能
若想關閉 , 可依其修改 ~~
vi /var/www/cgi-bin/openwebmail/etc/openwebmail.conf
#新增下列兩行
enable_webdisk no
enable_sshterm no
#存檔離開
大公告成 , enjoy it !!
註：本文作者為 ultraman@ultraman.adsldns.org


發表人 內容
johntino
漸有心得的小鳥

註冊時間: 2002-07-20
文章: 68
來自: 會淹水的汐止
人氣指數: 37.80
=離線=
發表於: 2003-01-02 17:58 文章標題: 看完Porftp文章後的補充說明

--------------------------------------------------------------------------------

剛剛看完魚子醬所提供的proftp的文章，覺得proftp的功能寫的還不是很夠，所以補充一下我個人測試過的功能給大家！下面的每個功能加在設定檔的最下面就可以了！enjoy

#允許root可登入
RootLogin on

#允許上傳續傳
AllowStoreRestart on

#同個 IP 最多能登入幾個 Session 同一個 IP 只能登入一次
MaxClientsPerHost 1

#下面兩種選一種設定
#設定 FTP 預設路徑在/home/ftp下;所有的帳號進入時都會到這個目錄下
DefaultRoot /home/ftp !david =>除了david之外

#根目錄是自己的home目錄 =>所有的帳號都會到家目錄
DefaultRoot ~ !david =>除了david之外

#流量控管 (25KB/Sec)
RateReadBPS 25600
RateReadFreeBytes 5120
RateReadHardBPS on

#只允許192.168.1的網段連上ftp
<Limit LOGIN /*>
Order allow,deny
Allow from 192.168.1.
Deny from all
</Limit>

#限制一個目錄下的權限
<Directory /home/ftp/upload/*>

<Limit READ> #可讀取
AllowAll
</Limit>

<Limit WRITE> #可寫入
AllowAll
</Limit>

<Limit DELE> #不可刪除
DenyAll
</Limit>

<Limit RNFR> #不可更名
DenyAll
</Limit>

<Limit MKD> #不可創造資料夾
DenyAll
</Limit>

<Directory>


ProFTPD 的設定檔 proftpd.conf 簡易設定
魚子醬
<sexjack@yahoo.com.tw>

#作者說明

#小弟的參考書目：Linux Mandrake8.2玩家實戰-------------旗標出版社
#及小弟使用Webmin設定後的proftpd.conf的資訊
#僅供參考，視各人的架設方式而定。如有不解之處，也可mail給我。設錯不負責的哦！！
#此註解為菜鳥小弟魚子醬(sexjack)有感於設定proftp，參照一些書本時，因所設定之方式(皆教授只單單架立FTP Server的狀況下)
#與所想設定方式不同，此為同時一台主機架有二台server以上的初學者所撰。若有不符不對之處，望能告知小弟我。
#小弟的mail:sexjack@yahoo.com.tw，請各位大哥們多多來信指教小弟的不對之處，我會再次修改的，此外，小弟於下面的其中一行
#甚感不解，MaxClientsPerHost 4 ，此句是何意？？

#鳥哥註：本篇文章為網友魚子醬兄提供的資料，底下的內容為 proftpd 這個很棒的 FTP 架設軟體的主要設定檔 proftpd.conf 的設定內容講解，感謝魚子醬提供的說明！

# This is a basic ProFTPD configuration file (rename it to

# 'proftpd.conf' for actual use. It establishes a single server

# and a single anonymous login. It assumes that you have a user/group

# "nobody" and "ftp" for normal operation and anon.

ServerName "---SEXJACK'S FTP SERVER---" #伺服器在登入時所顯示的伺服器名稱

ServerType standalone #設定伺服器是否常駐於記憶体內；standalone為是；inetd為FTP不常駐於記憶內

DefaultServer on #這部分，若是為單單只架FTP server的話，沒有這一行的。因為，一個IP同時架了多個的伺服器，而這行在為架設一個標準隨虛擬FTP伺服器

ServerIdent off #於登入時，是否顯示所使用的伺服器是何種軟体架設的，off的話是不顯示，反過來當然是on

# Allow FTP resuming.

# Remember to set to off if you have an incoming ftp for upload.

AllowStoreRestart on #這部份為設定是否可關閉重新啟動

#ServerAdmin sexjack@yahoo.com.tw #此行為設定伺服器管理者的E-mail，若sever有問題，則會寄信給管理者

#DefaultRoot ~ #此行為設定FTP的使用者只能在自已的家裡活動

# Port 21 is the standard FTP port.

Port 21 #設定於登入時，主機是Listening那一個port,若為inetd，則自行設定會無效

# Umask 022 is a good standard umask to prevent new dirs and files

# from being group and world writable.

Umask 022 #設定檔案權限遮罩，022則為755，不用我解釋了吧？？

# To prevent DoS attacks, set the maximum number of child processes

# to 30. If you need to allow more than 30 concurrent connections

# at once, simply increase this value. Note that this ONLY works

# in standalone mode, in inetd mode you should use an inetd server

# that allows you to limit maximum number of processes per service

# (such as xinetd)

MaxInstances 30 #設定伺服器於同一時間內可以處理的程序有幾筆，若severtyep設為standalone的話，可設低一點，以避免駭客的DoS攻擊

# Set the user and group that the server normally runs at.

#這空行為在設定可存取此伺服器的隨使用者和群組

# Normally, we want files to be overwriteable.

<Directory /var/ftp> #為登入時想進入的目錄位置

AllowOverwrite on
#是否刪除錯誤的存檔

DeleteAbortedStores off
</Directory>

# Needed for NIS.

PersistentPasswd on #是否需要密碼驗証？若為非開放的FTP，最好是為on

# Default root can be used to put users in a chroot environment.

# As an example if you have a user foo and you want to put foo in /home/foo

# chroot environment you would do this:
# DefaultRoot /home/foo foo

<Global> #標隼的FTP SERVER的設定值

DefaultRoot /var/www/html root #這裡我因為我WBB SERVER在編製，因此特將root指定至/var/www/html的目錄下

DefaultRoot /var/ftp users #這裡設定為user群組所登入的FTP目錄位置

AllowStoreRestart on #這部份為設定是否可關閉重新啟動
MaxClients 4 "IT IS MAX" #此為設定取多可同時在FTP上的人數；後面的那句"IT IS MAX"為後面第五人無法登入時所看到的訊息

RootLogin on #設定權限管理者是否能以root帳號登入，平常不建議開啟

MaxClientsPerHost 4 #....不會翻了....也不大了解

</Global>

UseReverseDNS on #是否開啟DNS

TimeoutNoTransfer 600 #多久的時間沒反應就停止連線，以秒為計算單位

#小弟的參考書目：Linux Mandrake8.2玩家實戰-------------旗標出版社

#及小弟使用Webmin設定後的proftpd.conf的資訊