Gentoo Linux 2005.0 x86 手冊

內容:

  • 安裝 Gentoo
    這個部份將帶領您進行 Gentoo 的安裝。
    1. 關於 Gentoo Linux 安裝步驟。
      不熟悉 Gentoo 的使用者並不了解 Gentoo 的選擇。
    2. 使用 Universal 安裝光碟開機
      使用 Universal 安裝光碟你可以開機並進入讓你安裝 Gentoo 的執行環境。
    3. 設定網路
      如果你需要網路,這篇就是教你設定網路(包括網際網路)的地方。
    4. 準備磁碟
      為了要安裝 Gentoo,您一定要建立一些所需的分割區。這章的內容將為您解釋如何設定磁碟分割。
    5. Gentoo 安裝檔案
      這一章說明如何解壓縮 stage3 檔案及設定 Portage。
    6. 安裝 Gentoo 基礎系統
      現在 stage3 檔案已經解壓縮好了,我們 chroot 到新的系統及修改 USE 設定。
    7. 設定核心
      Linux kernel 是每個版本的核心。這章將解釋如何編譯您的核心。
    8. 設定您的系統
      您將需要編輯一些重要的設定檔。這章將解釋這些重要設定檔的功能以及設定。
    9. 安裝必要的系統工具
      就如之前所提的,Gentoo 的哲學是選擇。這章將帶領您選擇並且安裝一些重要的工具。
    10. 設定開機管理程式
      在x86架構中已經包含一些開機管理程式。每一種都有各自的設定方法,我們將帶領您一步步設定您的開機管理程式。
    11. 最終化您的 Gentoo 安裝
      到這個步驟時,您已經差不多要完成安裝過程了。我們只需要建立一個(或多個)系統使用者,以及安裝預編套件(自由選擇)。
    12. 然後呢?
      現在您的 Gentoo 系統已經完成安裝了,然後呢?
  • 使用 Gentoo
    學習如何使用 Gentoo:安裝軟體,變數,Portage 的行為等等。
    1. Portage 介紹
      這一章在簡介一些使用者在維護自己系統上的軟體的一些簡單的步驟。
    2. USE 參數
      USE 參數對於 Gentoo 非常的重要。在這章內,您將會學習如何使用 USE 參數和了解 USE 參數如何跟您的系統互動。
    3. Portage 功能
      包括了Portage擁有的特色,就像是軟體的編譯和快取等等。
    4. 起始程序(Initscripts)
      Gentoo 使用一份非常特別的起始程序,包含著其他功能如相依性和虛擬起始程序。這章將解釋所有的概念和如何使用它們。
    5. 環境變數
      使用 Gentoo,您可以很簡單的管理系統上的環境變數。這章將解釋如何管理的方法,也解釋著一些常用的變數。
  • 使用Portage
    "使用Portage"提供一些較深入的Portage功能介紹,Gentoo的軟體管理工具。
    1. 檔案和資料夾
      一旦您想進一步知道Portage,您必須先知道他是怎樣和在哪裡存取他的檔案。
    2. 經由變數來設定
      Portage完全由一堆變數來設定,因此您可以設定這些變數在設定檔或是在環境變數中。
    3. 混用不同分支的軟體
      Gentoo 提供一些已經依據穩定性和架構來分類的軟體在不同的分支中。在"混用不同分支的軟體"中將會教您如何設定這些分支並且如何讓您可以個別的使用這些軟體。
    4. 附加的Portage工具
      Portage另外提供一些工具讓您在使用Gentoo時有更好的經驗。閱讀他您將會學到更多快速的設定方式和其他的工具。
    5. 愉悅的使用官方的Portage Tree
      在這章中會提供您一些小技巧和小方法來使用您自己的Portage Tree,如何同步您需要的目錄,增加目錄等等。
    6. Ebuild的應用方式
      在這章中會告訴您一些有關於當Portage安裝軟體時的步驟和您自己要如何利用ebuild的資訊。
  • Gentoo 網路設定
    廣泛的 Gentoo 網路設定指南
    1. 新手上路
      在大部份的環境下設定及啟動網路介面的指南。
    2. 進階設定
      這裡學習這些設定如何工作 - 在學習網路模組前你需要先了解這一章。
    3. 網路模組
      Gentoo 提供你有彈性的網路設定 - 這篇告訴你如何選擇不同的 DHCP 客戶端程式,設定頻寬合併,橋接,VLAN 等等。
    4. 無線網路
      無線網路的設定並不很直觀。希望這篇能幫你設定!
    5. 新增功能
      如果你想要探險,你可以加上你自己的網路函數。
    6. 網路管理
      給筆記電腦或是移動電腦到不同網路的人參考。

A. 安裝 Gentoo

1. 關於 Gentoo Linux 安裝步驟。

1.a. 介紹

歡迎!

首先,歡迎 使用 Gentoo。您將會進入一個關於選擇和效能的世界。 Gentoo 是代表著選擇。當您安裝 Gentoo 時,我們會清楚地解釋您可用的軟體選擇,安裝的方式,選擇您想要的系統記錄器,等等。

Gentoo 是一個快速,現代化,乾淨,高彈性設計的版本。 Gentoo 基於免費的軟體和絕對不會隱瞞問題。Portage,為 Gentoo 所使用套件維護系統,編寫於 Python 也代表著您可以簡單的查看以及更改原始嗎。 Gentoo 的套件系統使用原始碼 (也支援已編譯的套件)和設定檔都是普通的文字檔。換句話說,到處都是開放性的。

了解您自己的 選擇 是非常重要的,這也是 Gentoo 的哲學。我們將盡力不強迫您安裝任何您不想安裝的軟體。如果您還是覺得我們強迫您安裝了某些您不想要的東西,請 申報錯誤

安裝程序的規劃?

Gentoo 安裝可以分為 10 個步驟,從第二章到第十一章。每個步驟都會完成以下的目的:

  • 第一個步驟後,您就在安裝 Gentoo 的工作環境內
  • 第二個步驟後,如果你需要的話,你的網路連線已經準備好了(這是自由選擇的)。
  • 第三個步驟後,您的硬碟已起始完成,並且可以放置您的 Gentoo 安裝
  • 第四個步驟後,您的安裝環境已經準備完成並且以 chroot 進入了新了環境
  • 第五個步驟後,核心套件,和所有 Gentoo 安裝的一樣都會被安裝
  • 第六個步驟後,您的 Linux 核心已經編譯完成了
  • 第七個步驟後,您已經編寫完大部份的系統設定檔了
  • 第八個步驟後,必要的系統工具(您可以從一份清單內選擇)已經安裝並且設定完成
  • 第九個步驟後,您選擇的開機程式已經安裝並且設定完成在您的新Gentoo系統當中
  • 第十個步驟後,您的Gentoo環境已經準備好讓您去探索了

當您擁有許多選擇時,我們將盡我們所能為您解釋每個的優點及缺點。我們將繼續使用預設的選項,將會以 "預設:" 放在標題。其他選擇將會以 "其他選擇:" 為標題。請 不要 認為我們建議您使用預設的,但這是我們認為多數使用者會使用的設定。

有時候您可以選擇其他選擇性的步驟。這些步驟將會被標為 "選擇性:" 並且對於安裝不是非常的重要。但是,有些選擇性的步驟需要依賴著您之前所做的決定。我們將會在發生時,需要決定時和在選擇性的步驟前面告訴您。

我的選擇有那些?

您可以使用多種方法安裝 Gentoo。您可以下載然後使用我們的光碟安裝,從其他版本,從開機光碟(如 Knoppix),從網路開機的環境,從一個救援磁片,等等。

這份文件將會包含著使用我們的 Universal 光碟為安裝方式,他是一片可開機光碟,包含了全部讓 Gentoo Linux 啟動並執行需要的東西。你也可以使用我們的套件光碟在安裝好 Gentoo 基本系統後幾分鐘裝好整個系統。

這種安裝方法並不會安裝套件的最新版本,如果你想用最新版的話你可以看 Gentoo Linux 手冊 的安裝步驟。

關於其他的安裝方法請參考「其他安裝指南」。我們也提供也同樣有用的 Gentoo/x86 安裝技巧 文件。如果您認為這使用手冊說明的太詳細,您可以使用我們 文件資源中的快速安裝手冊,如果您使用的架構已經有文件。

如果您打算使用以預先編譯的套件安裝 Gentoo,除了使用 LiveCD 的套件外,您將沒有其他選擇。更新版的 Gentoo 發佈也會在網路上提供這些已編譯完成的套件。

碰到問題?

如果您在安裝過程內碰到問題(或是安裝指南)請到 Gentoo Release Engineering Project 查看勘誤表,或是到 臭蟲申報系統 查詢是否有重複或和您相同的申報。如果沒有,請建立一個方便我們維護。請不要害怕我們的開發員 -- 他們大部份不會吃人。

請注意,雖然您正在閱讀的文件針對各種不同架構,但是它還是會包含著一些關於其他架構的資料。這是因為 Gentoo 手冊使用著大量可共用的原始碼軟體(為了減少重複和少許的開發資源)。我們會將疑惑減到最少。

如果您不確定問題是否為使用者相關(有些是粗心的錯誤)還是軟體問題,我們歡迎您到 irc.freenode.net 的 #gentoo (英文)或是 IRCNET 的 #Gentoo.tw 發問。當然,如果您有其他目的,我們也歡迎:)

如果您有關於 Gentoo 的問題,請到 Gentoo 文件 查看我們的 常見問題。您也可以到 FAQs(英文) 或是 Gentoo Taiwan 討論區

1.b. 使用 Gentoo 發行平台(GRP) 快速安裝

GRP 是什麼?

Gentoo 發行平台,縮寫 GRP,是讓想要使用預編套件的使用者(就是你!)可以在安裝過程使用的快照,讓你加速 Gentoo 安裝的過程。GRP 包含了 Gentoo 完整安裝過程中需要的套件。他們不只有在安裝時加速安裝,在所有需要長時間編譯的套件(像 KDE,xorg-x11,GNOME, OpenOffice,Mozilla 等等) 都有 GRP 套件可以用。

然而,這些預編套在 Gentoo 生命週期中並不被維護。這些快照每次 Gentoo 發佈新版本時發佈,實現短時間裝好完整功能的 Gentoo 。你可以在 Gentoo 下工作實在背景更新系統。

Portage 如何處理 GRP 套件

你的 Portage tree - ebuilds 檔的集合(ebuild 是包含了套件資訊的檔案,像是說明,原始檔路徑,編譯過程,相依性等等) - 需要和 GRP 同步:可使用的 ebuild 版本必需符合 GRP 套件。

因為這個原因,你只有在使用目前這種安裝方式時從 GRP 套件得到益處。GRP 對那些想要全部套件都裝最新版本的人並不適用。

有 GRP 可以用嗎?

並不是所有的架構都有 GRP 套件可以用。這並不是說 GRP 不支援其他的平台,而是因為我們沒有足夠資源編譯及測試 GRP 套件。

目前底下這些架構我們有提供 GRP:

  • x86 架構 (x86, athlon-xp, pentium3, pentium4) 注意:x86 套件 (packages-x86-2004.3.iso) 可以在鏡像站上取得,而 pentium3 ,pentium4 及 athlon-xp 只能經由 bittorrent 取得。
  • amd64 架構 (amd64)
  • sparc 架構 (sparc32, sparc64)
  • ppc 架構 (G3, G4, G5)
  • alpha 架構

如果你的架構(或子架構)不在列表的話,你並不能選擇使用 GRP 安裝。

現在這個說明結束了,接下來繼續 使用 Universal LiveCD 開機

2. 使用 Universal 安裝光碟開機

2.a. 硬體需求

介紹

開始前,我們將先列出能成功安裝 Gentoo Linux 的硬體清單。

硬體需求

CPUi486 或更新的
記憶體64 MB
磁碟空間1.5 GB (不包含置換分割區)
置換分割區至少 256 MB

2.b. Gentoo Universal Installation CD

介紹

Gentoo Linux 可以使用三個 stage 壓縮檔之一來安裝。stage 檔是包含了最小環境的壓縮檔。

  • stage1 檔案中只包含了編譯器,Portage (Gentoo 的軟體管理系統) 以及一些編譯器及 Portage 需要的套件。
  • stage2 檔案包含所謂 bootstrap 好的系統,提供一個可以開始編譯其他應用程式,讓 Gentoo 完全弄好的最小環境。
  • stage3 檔案包含預先編譯好的最小系統,幾乎可以使用了。只要選擇某類程式中要安裝 哪一個程式。

在這份文件中,我們將會採用 stage3 安裝方式。如果您想要使用 stage1 或 stage2 檔案進行 Gentoo 的安裝,請使用 Gentoo 手冊 中的安裝指令,但是這會需要可運作的網路連線。

Gentoo Universal Installation CD

Installation CD 是可開機的光碟,包含了一個自足的 Gentoo 環境,他允許您從光碟開機。在開機的過程當中,它會偵測您的硬體設備並且載入合適的區東程式。Gentoo Installation CDs 由 Gentoo 開發員所維護。

我們目前提供兩種 Installation CD:

  • Universal Installation CD 包含了您需要用來安裝 Gentoo 的所有軟體,它為常見的架構提供了 stage3 檔案,您需要選擇的額外應用程式的原始碼,當然,還有適用於您的硬體架構的安裝指令。
  • Minimal Installation CD 僅包含有最小需求的環境來讓您開機並設定您的網路,讓您可以連結上網際網路,它並不包含任何額外的檔案,所以無法在目前的安裝方式中使用。

Gentoo 同時也提供一個套件 CD,這不是 Installation CD,而是一個提供您在安裝您的 Gentoo 系統時可以利用的額外資源。它包含了預先編好的套件(一般所稱的 GRP 包),讓您在 Gentoo 安裝完成之後,更新您的 Portage tree 之前,簡單又快速地安裝額外的應用程式(例如 OpenOffice.org, KDE, GNOME, ...)。

套件 CD 的使用方法稍後會在這份文件中介紹。

2.c. 下載、燒錄、並使用 Gentoo Universal Installation CD 開機

下載並燒錄 Installation CD

您可以從我們的鏡像站中下載 Universla Installation CDs(還有,如果您想要,套件 CD 也一樣)。Installation CDs 放在 releases/x86/2005.0/installcd 目錄下,套件 CD 則放在 releases/x86/2005.0/packagecd 目錄。

i686, athlon-xp, pentium3 和 pentium4 套件 CDs 可透過 BitTorrent 取得。

在這些目錄內,您將可以找到 ISO 的檔案。這些是完整的 CD 映像檔方便讓您寫入 CD-R。

這些檔案下載完成後,您可以確認檔案的完整性,看看有沒有毀損:

  • 您可以檢查檔案的 MD5 checksum,將之與我們提供的 MD5 checksum 相比對(舉例來說,使用 Linux/Unix 下的 md5sum 工具或是 Windows 的 md5sum)。
  • 您可以檢查我們提供的加密簽章(cryptographic signature)。在您進行此步之前,您需要取得我們使用的公開鑰匙(17072058)。

要使用 GnuPG 程式取得我們的公開鑰匙,執行下列指令:

原始碼 1: 取得公開鑰匙

$ gpg --keyserver pgp.mit.edu --recv-keys 17072058

然後檢查簽名:

原始碼 2: 檢查簽名

$ gpg - -verify <簽名檔> <下載的映像檔>

如要燒錄所下載的光碟映像檔,您將需要選擇 raw 的燒錄格式。我們將教使用 cdrecordK3B;關於其他可以到我們的 Gentoo FAQ 找到。

  • 使用 cdrecord,您只需要輸入 cdrecord dev=/dev/hdc <下載的 iso 檔> (將 /dev/hdc 更改為您的燒錄機的位置):)
  • 使用 K3B,選擇工具(tools) > CD(光碟) > 燒錄映像檔(Burn Image)。然後在 '燒錄映像檔(Image to Burn)'然後 選擇正確的 ISO 檔案。最後按下 開始(Start)

使用 Universal Installation CD 開機

重要: 雖然您可能沒有多餘的時間讀完全部,但是請至少讀完這個段落再繼續。

當您完成光碟的燒錄,我們現在要將它用來開機了。移除光碟,將您的系統重新啟動至 BIOS。這通常是按 DEL,F1,或是 ESC,依照您的 BIOS。在 BIOS 裡面,將 boot order 將 CD-ROM 的位址放到 hard disk 前面。這項設定通常會在 "CMOS Setup" 的目錄裡面。如果您沒有做此項動作,系統重新啟動時將會略過光碟機直接從硬碟開機。

現在將安裝光碟放到光碟機內然後重新啟動。你應該會看到開機提示符號u3。在這個畫面,你可直接按下 Enter 用預設開機參數來啟動開機程序。或著你可以在核心後面接著開機參數,來用自訂的參數啟動 Installation CD 的核心。

選擇核心?沒錯,我們在 Installation CD 上提供多個核心讓您使用。預設的為 gentoo。其他的核心則是為了特殊的硬體而製作,而 -nofb 的變數將關閉 framebuffer。

以下的列表為我們所提供的核心以及簡介:

核心介紹
gentoo預設 2.6 核心支援多個 CPU
gentoo-nofbgentoo 一樣,但是關閉了 framebuffer 的支援
memtest86檢查您的記憶體是否有錯誤

您也可以提供核心參數。它們將代表著各個選擇行開啟(或是關閉)的設定。以下的清單將會解釋所有可用的核心選項。

原始碼 3: Options available to pass to your kernel of choice

- agpgart       載入 agpart (如果您有顯示的問題)
- acpi=on       載入 ACPI 軔體支援
- ide=nodma     針對無法使用的 ide 裝置強迫關閉 dma
- doscsi        尋找 scsi 裝置(有時候會讓某些網路卡無法作用)
- dopcmcia      啟用 PCMCIA 光碟機的 pcmcia 服務
- nofirewire    不要在 initrd 載入 firewire 模組(firewire 光碟機,等等)
- nokeymap      關閉 non-us 鍵盤的 keymap 選擇
- docache       在執行時將光碟快取到記憶體,讓您可以在安裝時更換光碟。
- nodetect      讓 hwsetup/kudzu 和 hotplug 無法執行
- nousb         從 initrd 關閉 usb 模組,關閉 hotplug
- nodhcp        如果偵測到網路卡,讓 dhcp 無法自動開始
- nohotplug     關閉 hotplug 服務
- noapic        關閉 apic (如果硬體有問題,網路卡,scsi,等等)
- noevms2	關閉 EVMS2 模組的載入
- nolvm2	關閉 LVM2 模組的載入
- hdx=stroke    允許你在 BIOS 不支援大容量硬碟時,還是可以分割整個硬碟
- noload=module1[,module2[,...]]
		關閉特定核心模組的載入

現在啟動您的光碟,選擇核心(如果您對預設的 gentoo 核心不是很滿意)和開機參數。舉例來說,我們將以 gentoo 核心,使用 dopcmcia 為核心參數:

原始碼 4: 使用 Installation CD 開啟

boot: gentoo dopcmcia

您會看到一個開機歡迎畫面和 progress bar。如果您安裝的 Gentoo 使用 non-US 鍵盤,請確認您按下 F2 轉換到文字模式,並且遵照提示。如果在 10 秒內沒有作出選擇,預設值 (US 鍵盤) 會被選起,然後開機程序會繼續。一旦開機程序完成,您會自動登入為 "Live" Gentoo Linux 的 "root",最高權限使用者。您應該會有一個 root ("#")介面出現在目前的操控台。您可以使用 Alt-F2,Alt-F3, Alt-F4 來回切換。如要回到剛才的畫面請按 Alt-F1。

其他硬體設定

當 Installation CD 開啟時,它將會嘗試偵測所有系統上的硬體然後載入相關的核心模組來支援您的硬體。在大部份的例子,它做的相當不錯。但是,在某些情形下,它將無法自動載入相關的系統模組。如果 PCI 的自動偵測錯過了系統上某些硬體,您將需要手動載入它們。

以下的例子我們將載入 8319too 模組(支援某種網路介面):

原始碼 5: 載入核心模組

# modprobe 8139too

如果你需要 PCMCIA 的支援,啟動 pcmcia init script:

原始碼 6: 啟動 PCMCIA init script

# /etc/init.d/pcmcia start

選擇性:微調硬碟效能

如果您是一個高階使用者,您或許想要使用 hdparm 微調您的 IDE 硬碟。使用 -tT 的參數將讓您測試硬碟的效能(請多執行幾次來確定比較正確的數值):

原始碼 7: 測試磁碟效能

# hdparm -tT /dev/hda

要微調,您可以使用以下任何範例(或是自行測試)。請將 /dev/hda 更改為您所要微調的磁碟:

原始碼 8: 微調硬碟效能

啟動 DMA:                        # hdparm -d 1 /dev/hda
啟動安全的增加效能選項:  # hdparm -d 1 -A 1 -m 16 -u 1 -a 64 /dev/hda

選擇性:使用者帳號

如果您打算給予其他人安裝環境的權限,或是使用非 root 的權限執行 irssi (安全考量)您將需要建立相關的使用者帳號和更改 root 密碼。

要更改 root 密碼,使用 passwd 工具:

原始碼 9: 更改 root 密碼

# passwd
New password: (輸入新密碼)
Re-enter password: (再次輸入新密碼)

要建立使用者帳號,我們先需要輸入他們的帳號然後密碼。我們將使用 useraddpasswd 完成這些工作。下面的例子,我們將建立一個使用者叫做 "john"。

原始碼 10: 建立一個使用者帳號

# useradd -m -G users john
# passwd john
New password: (輸入 john 的密碼)
Re-enter password: (再次輸入 john 的密碼)

您也可以利用 su 從 root 變更到您剛建立的帳號:

原始碼 11: 變更目前使用者者

#  su john -

選擇性:在安裝過程中檢視文件

如果你想要在安裝過程中檢視 Gentoo 手冊(從 CD 或是線上),確定你已經建立使用者帳號(參閱選擇性:使用者帳號)。然後按下 Alt-F2 開啟新的終端機並且登入。

如果你想要檢視 CD 上的文件,你可以馬上執行 links2 來閱讀:

原始碼 12: 檢視 CD 上的文件

# links2 /mnt/cdrom/docs/handbook/html/index.html

然而,如果你因為線上的 Gentoo 手冊比較新而想要閱讀他。你也可以使用 links2 ,但是你需要先完成設定您的網路這一章(否則你不能連接網際網路來檢視文件):

原始碼 13: 檢視線上文件

# links2 http://www.gentoo.org/doc/en/handbook/handbook-x86.xml

你可以按下 Alt-F1 回到原來的終端機。

選擇性:開啟 SSH 伺服器

如果您想在安裝過程中讓其他使用者使用您的電腦(或許是幫忙您安裝 Gentoo 的人),您將需要建立一個使用者帳號給他們,提供您的 root 密碼給他們(只有 在您 完全信任 的狀況下)。

要開啟 SSH 伺服器,執行以下指令:

原始碼 14: 開啟 ssh 伺服器

# /etc/init.d/sshd start

要使用 sshd,您將必須先設定您的網路。現在請繼續看設定您的網路

3. 設定網路

3.a. 你需要網路嗎?

誰可以不用他?

一般來說,你在使用 Universal 安裝光碟安裝 Gentoo 時並不需要連上網路。然而有一些情況你需要使用網路:

  • Universal 安裝光碟上的 stage3 檔案並不適合你的架構,你需要下載正確的 stage3 檔案。
  • 你需要安裝讓你連接到網路的程式,而這些程式在安裝光碟有支援但是原始碼並沒有放在 Universal 安裝光碟中(例如說,你可以使用安裝光碟連到網際網路,但是必需的原始碼 不在安裝光碟中)。
  • 你在安裝時需要遠端協助(使用 SSH 或是在 IRC 上討論)

我需要網路嗎?

如果要確定適合你的架構的 stage3 檔案是否存在,查看 /mnt/cdrom/stages 的內容確認有沒有適合的檔案。如果沒有的話,你仍人可以找一個相容的來用。

如果你反而想要使用針對你的架構最佳化的 stage3 檔案,而這並不存在的話,你需要使用網路下載合適的檔案。

所以,如果你不需要網路,你可以掠過這章繼續閱讀 準備磁碟。不然的話,繼續底下的網路設定部份。

3.b. 自動偵測網路

或許他已經可以工作了?

如果你的電腦是接在有 DHCP 伺服器的乙太網路下,非常有可能網路設定已經自動設好了。如果是這樣的話,你應該可以使用 Installation CD 上許多網路相關指令,像是 sshscppingirssiwgetlinks 之中任何一個。

如果網路已經設好了, /sbin/ifconfig 指令應該會顯示 lo 之外的網路裝置,像是 eth0:

原始碼 1: /sbin/ifconfig for a working network configuration

# /sbin/ifconfig
(...)
eth0      Link encap:Ethernet  HWaddr 00:50:BA:8F:61:7A
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
		  inet6 addr: fe80::50:ba8f:617a/10 Scope:Link
		  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1498792 errors:0 dropped:0 overruns:0 frame:0
		  TX packets:1284980 errors:0 dropped:0 overruns:0 carrier:0
		  collisions:1984 txqueuelen:100
		  RX bytes:485691215 (463.1 Mb)  TX bytes:123951388 (118.2 Mb)
		  Interrupt:11 Base address:0xe800

選擇性:設定代理伺服器

如果您是透過代理伺服器連線至網路,您將需要在安裝過程中設定相關的代理伺服器資料。要定義一個代理伺服器非常簡單:您只需要設定一個變數包含著您的代理伺服器資料。

在大部份的例子裡,您可以直接將變數定義為代理伺服器的主機名稱。舉例來說,我們假設代理伺服器為 proxy.gentoo.org 而 port 為 8080。

原始碼 2: 定義代理伺服器

(如果是 HTTP 代理伺服器)
# export http_proxy="http://proxy.gentoo.org:8080"
(如果是 FTP 代理伺服器)
# export ftp_proxy="ftp://proxy.gentoo.org:8080"
(如果是 RSYNC 代理伺服器)
# export RSYNC_PROXY="proxy.gentoo.org:8080"

如果您的代理伺服器需要使用者帳號及密碼,請按照以下方式定義變數:

原始碼 3: 在代理伺服器變數加入帳號及密碼

http://username:password@proxy.gentoo.org:8080

測試網路

或許您會想要嘗試 ping 網路公司的 DNS 伺服器(可以在 /etc/resov.conf)或是您所選的網址,這只是為了查看您的封包是否能傳送網路,DNS 解析是否正常,等等﹍

原始碼 4: 測試網路

# ping -c 3 www.yahoo.com

您的網路有正常嗎?如果有,請跳過以下部份,從 準備磁碟 繼續。如果沒有,可惜,您將要更好運一點,請往下繼續 :)

3.c. 自動網路設定

如果您的系統擁有多個網路卡,它們將會以 eth0eth1,等以此類推。請確認您的顯示卡可以使用。所有的文件將會以 eth0 為使用範例。

如果您的網路不能自動作用,您可以使用有些安裝媒介提供的 net-setup(正常網路或是無線網路),adsl-setup(ADSL-使用者)。或是 pptp(PPTP使用者 - 只適用於 x86)。

如果您使用的安裝方式沒有提供以上所說明的工具或是無法正常使用網路,請從 手動網路設定 繼續。

預設:使用net-setup

如果網路沒有自動設定,設定網路最間單的方式就是執行 net-setup

原始碼 5: 執行 net-setup

# net-setup eth0

net-setup 將會問您一些關於您的網路環境的問題。當您完成的時候,您應該會有一個可用的網路連線。就和剛剛所講的一樣,您應該要測試您的網路連線。如果測試正常,恭喜!您現在可以開始安裝 Gentoo 了。請跳過以下的部份從 準備磁碟 開始。

如果您的網路還是無法正常運作,請從 手動網路設定 繼續。

其他選擇:使用 RP-PPPoE

假設您需要 PPPoE 連線至網路,Installation CD (任何版本)都會有提供簡單的 rp-pppoe 供您使用。使用我們提供的 adsl-setup 程序來設定您的連線。您將會被帶入網路裝置連線到 adsl 數據機的畫面。這個畫面包括了您的帳號,密碼,DNS IP 和問您是否需要簡易的防火牆。

原始碼 6: 使用 rp-pppoe

# adsl-setup
# adsl-start

如果有出錯,請仔細檢查 /etc/ppp/pap-secrets 或是 /etc/ppp/chap-secrets 查看您的帳號及密碼。如果您的網路裝置不存在,您將要載入相關的網路模組。在這個狀況,您應該從 手動網路設定 繼續。

如果一切正常,請從 準備磁碟 繼續。

其他選擇:使用 PPTP

注意: 只有 x86 架構有 PPTP 支援

如果您需要 PPTP 支援,您可以使用我們的 Installation CD 提供的 pptpclient。但是您將需要先確定您的設定無誤。編輯 /etc/ppp/pap-secrets 或是 /etc/ppp/chap-secrets 確定它包含著正確的帳號及密碼:

原始碼 7: 編輯 /etc/ppp/chap-secrets

# nano -w /etc/ppp/chap-secrets

然後依照需要調整 /etc/ppp/options.pptp

原始碼 8: 編輯 /etc/ppp/options.pptp

# nano -w /etc/ppp/options.pptp

當設定完成,只要執行 pptp(包括您在 options.pptp 不能設定的)連線至伺服器:

原始碼 9: 連線至撥號伺服器

# pptp <server ip>

現在從 準備磁碟 繼續。

3.d. 手動網路設定

載入相關網路模組

當 Installation CD 啟動時,它會偵測您所有的硬體裝置然後載入相關的核心模組(驅動程式)來支援您的硬體。在大部份的例子來說,它做的非常好,但是在某些情況下,它或許無法自動載入您所需要的核心模組。

如果您無法使用 net-setup 或是 adsl-setup,那您就可以假設您的網路卡無法在即時被找到。這代表著您將要手動載入相關核心模組。

要找出我們可以用的核心模組,使用 ls

原始碼 10: 搜尋提供的模組

# ls /lib/modules/`uname -r`/kernel/drivers/net

如果您找到您的網路卡所用的驅動程式,使用 modprobe 載入這個核心模組:

原始碼 11: 使用 modprobe 載入核心模組

(舉例來說,我們將載入 pcnet32 模組)
# modprobe pcnet32

要檢查您的網路卡是否被偵測到,使用 ifconfig 來偵測。一個被偵測到的網路卡將會類似以下被列出來:

原始碼 12: 測試網路卡是否可用,成功

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr FE:FD:00:00:00:00  
          BROADCAST NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

如果您收到以下錯誤,那麼網路卡則是沒被偵測到:

原始碼 13: 測試網路卡是否可用,失敗

# ifconfig eth0
eth0: error fetching interface information: Device not found

假設您現在有一張被偵測到的網路卡,您可以重新嘗試 net-setup 或是 adsl-setup (現在應該可以用了),但是,對於其他人,我們現在將為您解釋如何手動設定網路。

選擇以下其中一個適用的部份來設定您的網路:

使用 DHCP

DHCP (Dynamic Host Configuration Protocol) 可以讓您自動索取相關網路資料( IP位置, netmask,broadcast address,gateway,nameserver 等等)。但是在您的網路內一定要有一個可用的 DHCP 伺服器(或是您的提供商提供 DHCP 服務)。要網路介面自動索取相關資料,使用 dhcpcd

原始碼 14: 使用 dhcpcd

# dhcpcd eth0
一些網路管理員可能會要求你使用
DHCP 伺服器提供的主機名稱及領域名稱。
如果是這種情況,使用
# dhcpcd -HD eth0

如果成功(嘗試 ping 一些網路伺服器,如 Google),那您就可以跳到下個部份到 準備磁碟

準備無線網路

注意: 不是所有的 Installation CD 都有 iwconfig 的指令。如果真的碰上這種情況,您可以參考 linux-wlan-ng 計畫

如果您有一張無線 (802.11)網路卡,您將需要在繼續前先設定好您的無線網路。如要查看目前的設定,您可以使用 iwconfig。執行 iwconfig 將會列出類似以下的訊息:

原始碼 15: 顯示目前的設定

# iwconfig eth0
eth0      IEEE 802.11-DS  ESSID:"GentooNode"
Mode:Managed  Frequency:2.442GHz  Access Point:
00:09:5B:11:CC:F2
Bit Rate:11Mb/s   Tx-Power=20 dBm
Sensitivity=0/65535
Retry limit:16   RTS thr:off
Fragment thr:off
Power Management:off
Link Quality:25/10 Signal level:-51 dBm Noise level:-102 dBm
Rx invalid  nwid:5901 Rx invalid crypt:0 Rx invalid frag:0 Tx
excessive retries:237 Invalid misc:350282 Missed beacon:84

注意: 有些網路卡的裝置名稱或許是 wlan0ra0 而不是 eth0。不要加任何參數執行 iwconfig 確認裝置的名稱。

對於大部份的使用者,只需要更改兩個重要的設定,ESSID(無線網路名稱)或是 WEP 金錀。如果 ESSID 和無限網路連接點已經顯示出您沒有使用 WEP,那您的網路已經好了。如果您需要更改您的 ESSID,或是加入一個 WEP 金錀,您可以執行以下指令:

原始碼 16: 更改 ESSID 和/或 加入 WEP 金錀

(這將會把網路名稱設定為 "GentooNode")
# iwconfig eth0 essid GentooNode

(這將設定一個 hex WEP 金錀)
# iwconfig eth0 key 1234123412341234abcd

(這將設定一個 ASCII 金錀 - 起始為 "s:")
# iwconfig eth0 key s:密碼

您將可以再次使用 iwconfig 來確認您的設定。當您的無線網路已經可以使用,您將可以從下一個部份繼續(了解網路詞彙)或是使用之前所談到的 net-setup 工具設定。

了解網路詞彙

注意: 如果您知道您的 IP 位址,broadcast address,netmask 和 nameserver,那您可以跳過這個階段從 使用 ifconfig 和 route 繼續。

如果以上都失敗,您將需要手動設定網路。不要怕,這個很簡單。但是我們將要為您解釋一些能幫助您的網路資訊方便您進行設定。當您讀完這個部份時,您將會知道什麼是一個 gateway,什麼是 netmask,和 為什麼會有 broadcast 位址和為什麼您需要 nameservers

在一個網路,機器都是用 IP 位置(Internet Protocol address)來辨別的。這些地址為四組於 0 到 255 之間所組合的。這就是我們所看到的。在現實來說,這些 IP 位址是 32 位元的(一和零)。現在來看一個範例:

原始碼 17: IP位址的範例

IP Address (numbers):   192.168.0.2
IP Address (bits):      11000000 10101000 00000000 00000010
                        -------- -------- -------- --------
                           192      168       0        2

在這個網路內這個 IP 位址是獨特的,(例:所有您可以連到的主機都一定有一個個別的 IP 位址)。為了要可以分辨每個網路內的 IP 位址,IP 位址可以分成兩種: 網路主機

netmask 是用來分開,另一個一和零的組合。這將會把一個網路的 IP 區域化。一部份為網路的部份,另一部份為主機的部份。和平常一樣,netmask 可以寫為 IP 位置。

原始碼 18: 網路和主機的區別範例

IP-address:    192      168      0         2
            11000000 10101000 00000000 00000010
Netmask:    11111111 11111111 11111111 00000000
               255      255     255        0
           +--------------------------+--------+
                    網路                 主機

換句話說, 192.168.0.14 還是我們範例網路的一部份,但是 192.168.1.2 不是。

broadcast(廣播)位址為一個 在同一個網路上的一個 IP 位址,但是只有一個主機部份。每個在網路上的主機將聽取這個 IP 位置。這是用來聽取廣播封包的意思。

原始碼 19: 廣播位址

IP-address:    192      168      0         2
            11000000 10101000 00000000 00000010
Broadcast:  11000000 10101000 00000000 11111111
               192      168      0        255
           +--------------------------+--------+
                     網路                主機

為了要確保可以連線至網路,您一定要知道那個主機分享網路連線。這個主機則是叫做 gateway。它也是一個普通的主機,它將會有一個常見的 IP 位置(如 192.168.0.1)。

我們之前講過,每台主機都有自己的 IP 位址。為了要能以名稱(而不是 IP 位置)連線到主機上,您將需要一個翻譯名字的服務(例:dev.gentoo.org)到一個 IP 位址(例:64.5.62.82)。這種服務就叫做 name service(名稱伺服器)。要使用這個服務,您一定要在 /etc/resolv.conf 設定一個相關的 name server

在部份的例子,您的 gateway 也會提供 nameserver。不然您將要輸入您的網路提供商所提供給您的。

總結,您將要在繼續之前擁有以下資料:

網路類別範例
您的 IP 位置192.168.0.2
Netmask255.255.255.0
Broadcast192.168.0.255
Gateway192.168.0.1
Nameserver(s)195.130.130.5, 195.130.130.133

使用 ifconfig 和 route

設定您的網路需要三個步驟。第一,我們將使用 ifconfig 設定我們的 IP 位置。然後我們將需要 route(路由)到我們的 gateway 上。然後在將名稱伺服器放到 /etc/resolv.conf

要設定 IP 位置,您將需要您的 IP 位置,廣播位置和 netmask。然後執行以下指令,將 ${IP_ADDR} 更改成您的 IP 位置, ${BROADCAST} 為您的廣播位置和 ${NETMASK} 為您的 netmask:

原始碼 20: 使用 ifconfig

# ifconfig eth0 ${IP_ADDR} broadcast ${BROADCAST} netmask ${NETMASK} up

現在使用 route 設定您的路由。將 ${GATEWAY} 更改為您的 gateway IP 位置:

原始碼 21: 使用 route

# route add default gw ${GATEWAY}

現在使用您最喜歡的編輯器(以我們的例子,我們使用 nano)編輯 /etc/resolv.conf

原始碼 22: 建立 /etc/resolv.conf

# nano -w /etc/resolv.conf

現在將您的 nameserv (名稱服務器)按照以下的版面填入。請確定將 ${NAMESERVER1}${NAMESERVER2} 更改為相關的名稱服務器的位置:

原始碼 23: /etc/resolv.conf 版面

nameserver ${NAMESERVER1}
nameserver ${NAMESERVER2}

完成了。現在 ping 一些網路伺服器(如 Google)測試您的網路連線。如果成功,恭喜!您現在已經可以準備安裝 Gentoo 了。請從 準備磁碟 繼續

4. 準備磁碟

4.a. 介紹區塊裝置

區塊裝置(Block Devices)

我們將仔細的介紹 Gentoo Linux 和 整體的Linux 的磁碟方式,包括 Linux 檔案系統,分割區,和區塊裝置。然後,當您了解磁碟和檔案系統,您將會學到如何為您的 Gentoo Linux 安裝設定分割區和檔案系統。

首先,我們將要介紹 區塊裝置。最有名的區塊裝置大概就是代表 Linux 系統上的第一個 IDE 磁碟 /dev/hda,如果您的系統使用 SCSI 或 SATA 磁碟,那您的第一個磁碟將會是 /dev/sda

以上的區塊裝置代表著磁碟的介面。使用者可以不用擔心您的磁碟是否為 IDE,SCSI 或是其他,並且使用程式來使用這些區塊裝置。這個程式可以在磁碟上寫入多個隨機的 512 byte 區塊。

分割區

理論上雖然您可以使用整個磁碟放置您的 Linux 系統,但是實務上幾乎沒有人這麼做。整個磁碟將會被分為其他小一點的大小,並可以更好的管理。x86 的系統叫他 分割區(partitions)

分割區總共有三類:primaryextendedlogical

一個 primary 分割區是一個包含 MBR(Master Boot Record)的分割區。一個 MBR 非常小(512 byte)只能定義成四個分割區(從 /dev/hda1/dev/hda4)。

一個 extended 分割區是一個特別的 primary 分割區(意思是說 extended 分割區一定要從四個可用的 primary 分割區內擴展)而可以建立更多的分割區。這種分割區原本是不存在的,但是四個分割區太少了,它會誕生是因為要擴展而不會遺失反向相容。

一個 logical 分割區是在 extended 分割區內。他們的定義不是放在 MBR,但是是放在 extended 分割區。

進階儲存

x86 的 Installation CD 支援 EVMS 和 LVM2。EVMS 和 LVM2 將會增強您設定分割區的彈性度。在安裝過程中,我們將會將焦點放在 "正常" 的分割方式,只是為了讓您知道 EVMS 和 LVM2 有被支援。

4.b. 策劃一個分割區計畫

預設的分割區策劃

如果您不打算策劃一個分割計畫,您可以使用手冊內的分割規劃:

分割區檔案系統大小說明
/dev/hda1ext232M開機分割區(Boot partition)
/dev/hda2(swap)512MSwap 分割區
/dev/hda3ext3磁碟剩下的空間根 或是 主分割區(Root partition)

如果您想知道一個分割區該要多大,或是需要幾個分割區,請繼續閱讀。不然請從 使用 fdisk 分割您的磁碟 開始分割。

多少和多大?

多少分割區通常是按照您的使用環境。舉例來說,如果您有很多個使用者,您就會因為安全問題和能夠簡易備份將您的 /home 分開。如果您將 Gentoo 安裝為郵件伺服器那您的 /var應該分開,因為郵件通常是放在 /var。選擇好的檔案系統將會提昇您的效能。遊戲伺服器因為大多數的遊戲伺服器都是安裝在 /opt 所以通常會將 /opt 分開。原因很和 /home 類似:安全問題和備份。你一定會想分給 /usr 比較大的空間:不只是因為他包含大部份的程式,Portage 樹,除了他儲存的各種原始碼知外,本身需要 500 Mb 的空間。

如您所見,不同的方式是彼此相依的。不同的分割區或是容量將會有以下優點:

  • 您可以選擇適合個別分割區的檔案系統提高效能
  • 您的系統不會因為一個分割區或是容量失效而完全終止
  • 如果必要,檔案系統檢查所費的時間將會減少,並且可以以平行方式進行(雖然這個優點 比較適合多分割區)
  • 安全性可以因為某些分割區以唯讀掛載而加強,nosuid(setuid機會被略過), noexec(執行檔將會被掠過)等等也可以。

但是,多個分割區也有一個很大的缺點:如果沒有完好的設定,您將會看到一個分割區上的空間不夠或是一個分割區上的空間太多。SCSI 和 SATA 也有 15 個分割區的限制。

以範例來分割,我們將使用一個 20GB 的硬碟,為手提電腦的示範(包含著網頁伺服器,郵件伺服器,gnome,﹍):

原始碼 1: 檔案系統使用範例

Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/hda5     ext3    509M  132M  351M  28% /
/dev/hda2     ext3    5.0G  3.0G  1.8G  63% /home
/dev/hda7     ext3    7.9G  6.2G  1.3G  83% /usr
/dev/hda8     ext3   1011M  483M  477M  51% /opt
/dev/hda9     ext3    2.0G  607M  1.3G  32% /var
/dev/hda1     ext2     51M   17M   31M  36% /boot
/dev/hda6     swap    516M   12M  504M   2% <not mounted>
(預留 2GB 空間)

這邊的 /usr 的分割區是快用完的(佔用83%),但是當所有的軟體已經安裝完畢後,/usr就不會再急速的增加。關於/var,大部份的人或許會認為分配給 /var 的空間太大。但是,Gentoo 將會在 /var/tmp/portage 內進行所有檔案的編譯,所以如果您不想編譯大程式的話至少要有 1G,而如果打算同時編譯大的程式如 KDE 和 OpenOffice.org,那麼 /var 最好是有 3G 以上的剩餘空間。

4.c. 使用 fdisk 分割您的磁碟

以下部份將解釋如何使用之前所策劃的進行分割:

分割區說明
/dev/hda1開機分割區
/dev/hda2Swap 分割區
/dev/hda3主分割區(Root)

請按照個人所需更改您的分割架構。

查看目前的規劃的分割區

fdisk 是一個強大並且受歡迎的磁碟分割工具。使用您的磁碟上的 fdisk (按照我們的範例,我們將使用/dev/hda):

原始碼 2: 開始 fdisk

# fdisk /dev/hda

fdisk 開始後,您將會看到以下的畫面:

原始碼 3: fdisk 介面

Command (m for help): 

按下 p 顯示您的磁碟目前的分割區設定:

原始碼 4: 範例分割區設定

Command (m for help): p

Disk /dev/hda: 240 heads, 63 sectors, 2184 cylinders
Units = cylinders of 15120 * 512 bytes

Device Boot    Start       End    Blocks   Id  System
/dev/hda1             1        14    105808+  83  Linux
/dev/hda2            15        49    264600   82  Linux swap
/dev/hda3            50        70    158760   83  Linux
/dev/hda4            71      2184  15981840    5  Extended
/dev/hda5            71       209   1050808+  83  Linux
/dev/hda6           210       348   1050808+  83  Linux
/dev/hda7           349       626   2101648+  83  Linux
/dev/hda8           627       904   2101648+  83  Linux
/dev/hda9           905      2184   9676768+  83  Linux

Command (m for help): 

這個磁碟包含著七個 Linux 檔案系統(顯示為 "Linux")和一個 swap 分割區(顯示為 "Linux Swap")。

移除所有分割區

我們將要先把已經存在的分割區一除掉。按下 d 刪除。舉例來說要刪除已經存在的 /dev/hda1

原始碼 5: 刪除一個分割區

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

這個分割區將會被顯示為刪除。當您輸入 p 的時候您將會看不到所刪除的分割區,但是只會在您儲存後發揮功效。如果誤殺了某個分割區然後想要重來,按下q 然後 enter 您的分割區將不會被刪除。

現在,假設您想要刪除所有系統上的分割區,請先按 d 然後要刪除的分割區編號再按下 p 刷新分割區列表。最後您將會將所有的分割區刪除:

原始碼 6: 空的分割區列表

Disk /dev/hda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot    Start       End    Blocks   Id  System

Command (m for help):

現在您的分割區列表已經空了,我們可以開始建立分割區了。我們將會使用之前所討論到的預設的分割計畫。當然,如果您有自己的分割計畫,請按照我們的方式以此類推!

建立開機分割區

我們將要先建立一個小的開機分割區。按下 n 建立一個分割區然後按下 p 選擇 primary partition,再按下 1 選擇第一個 primary 分割區。當您看到 first cylinder 時,按下 enter,然後看到 last cylinder 輸入 +32M 來建立一個 32 Mbyte 大小的分割區:

原始碼 7: 建立開機分割區

Command (m for help): n
Command action
  e   extended
  p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-3876, default 1): (按下 Enter)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-3876, default 3876): +32M

現在,當您按下 p 時,您將會看到以下的顯示:

原始碼 8: 已建立的開機分割區

Command (m for help): p

Disk /dev/hda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot    Start       End    Blocks   Id  System
/dev/hda1          1        14    105808+  83  Linux

我們將需要將這個分割區設定為可開機。按下 a 的開關然後選擇 1。讓可開機旗標放在這個分割區上。如果您再按一次 p,您將會看到 "Boot" 欄位有一個 *

建立 Swap 分割區

現在我們需要建立 swap 分割區。按下 n 建立一個新的分割區,然後 p 告訴 fdisk 您要一個 primary 分割區。然後按下 2 建立第二個 primary 分割區。當您看到 first cylinder,按下 enter。然後當您看到 last cylinder,輸入 +512M 來建立一個 512MB 大小的分割區。當您完成的時候,按下 t 來選擇分割區類別。接著輸入 82 將分割區類別選為 "Linux Swap"。當您完成的時候,按下p 應該會看到類似以下的畫面:

原始碼 9: 建立 swap 分割區後的列表

Command (m for help): p

Disk /dev/hda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot    Start       End    Blocks   Id  System
/dev/hda1 *        1        14    105808+  83  Linux
/dev/hda2         15        81    506520   82  Linux swap

建立主分割區(Root)

最後,我們需要建立主分割區。按下 n 建立一個新的分割區,然後 p 告訴 fdisk 您要一個 primary 分割區。然後輸入 3 建立第三個 primary 分割區,在我們的例子為 /dev/hda3。當您看到 first cylinder,按下 enter。當您看到 last cylinder,按下 enter 來使用剩餘的空間。完成這些步驟後,按下 p 您應該會看到類似以下的列表:

原始碼 10: 建立主分割區後的列表

Command (m for help): p

Disk /dev/hda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot    Start       End    Blocks   Id  System
/dev/hda1 *        1        14    105808+  83  Linux
/dev/hda2         15        81    506520   82  Linux swap
/dev/hda3         82      3876  28690200   83  Linux

儲存分割區規劃

要儲存然後離開 fdisk,按下 w

原始碼 11: 儲存然後離開 fdisk

Command (m for help): w

現在您的分割區已經建立完成了,您可以從 建立檔案系統 繼續。

4.d. 建立檔案系統

介紹

現在您的分割區已經建立完成了,我們將需要把檔案系統放到它們上面。如果您不在乎該使用那個檔案系統,並且滿意手冊內我們使用的,請從 將檔案系統套用到分割區上 繼續。不然請繼續閱讀關於可用的檔案系統。

檔案系統?

Linux 核心支援多個檔案系統,我們將解釋 ext2,ext3,ReiserFS,XFS 和 JFS。因為這些是最常使用的檔案系統。

ext2 是一個舊的 Linux 檔案系統,沒有日誌功能. 啟用的時間通常需要很久。目前有許多 日誌型態 的檔案系統可以以更快的速度及更好的效率完成系統啟用和檢查。

ext3 為 ext2 的日誌版,提供了 metadata 日誌系統 並且可以快速地使用日誌系統復原。ext3 是個相當不錯並且可靠的檔案系統. 它有額外的 hashed b-tree 索引功能將會開啟幾乎在任何情況內的狀態為高效能。你可以在 mke2fs 指令加上 -O dir_index 啟動這個功能。簡單來說,ext3 是一個很棒的檔案系統。

ReiserFS 整體來說是個相當不錯的系統,它處理小型檔案(少於4kb)時效能會比 ext2 和 ext3 來的好。他使用的是 B*-tree 為基礎的檔案系統. 另外也能很有效率地處理大型檔案。Linux 核心版本 2.4.18+ 後,ReiserFS 是一個相當有值得推薦的系統, 從很少,到很多檔案。ReiserFS 都可以處理的非常好。開機分割區並不建議使用此檔案系統。

XFS 是一個 metadata 日誌系統,並且擁有完整的功能及針對延展性最佳化。如果您使用高速 SCSI或是纖維的儲存裝置,並且有持續不斷的電源供應,我們才推薦您使用 XFS。 如果沒有,請使用其他檔案系統。因為 XFS 大量地將要轉送的資料快取在記憶體中,設計不好的程式(的確有一些程式在寫入磁碟時不做一般的預防措施)可能當系統意外斷電時損失大量的資料。

JFS 是 IBM 發展的高效能日誌系統。目前雖然已經可以算是個完成品,關於他的穩定度並沒有太多的優點及缺點。

將檔案系統套用到分割區上

要把檔案系統建立到一個分割區或是容量上可使用一些為個別檔案系統所設計的工具:

檔案系統建立指令
ext2mke2fs
ext3mke2fs -j
reiserfsmkreiserfs
xfsmkfs.xfs
jfsmkfs.jfs

以我們的範例來說,開機分割區(在我們的例子裡為 /dev/hda1)為 ext2 和主分割區(在我們的例子為 /dev/hda3)為 ext3,您將要使用:

原始碼 12: 將檔案系統套用到分割區上

# mke2fs /dev/hda1
# mke2fs -j /dev/hda3

現在檔案系統已經建立到我們剛建立完成的分割區上了(或是logical 容量)。

啟用 Swap 分割區

mkswap 是用來起始 swap 分割區的指令:

原始碼 13: 建立 swap 簽名

# mkswap /dev/hda2

要啟用 swap,使用 swapon 指令:

原始碼 14: 啟動 swap

# swapon /dev/hda2

現在建立然後啟動 swap。

4.e. 掛載

現在您的分割區已經起始和放置檔案系統了,接下來我們該把這些分割區掛載起來。使用 mount 的指令。不要忘了建立相關的掛載目錄,以我們的分割來說只掛載主分割區和開機分割區:

警告: 由於 e2fsprogs 套件中的某個臭蟲,如果您要使用 ext3 檔案系統,您需要明確的使用 mount -t ext3 選項。

原始碼 15: 掛載分割區

# mount /dev/hda3 /mnt/gentoo
(針對 ext3 分割區:)
# mount -t ext3 /dev/sda1 /mnt/gentoo

# mkdir /mnt/gentoo/boot
# mount /dev/hda1 /mnt/gentoo/boot

注意: 如果您要將 /tmp 放在不同的分割區,記得掛載後將它的權限更改為: chmod 1777 /mnt/gentoo/tmp。這也適用於 /var/tmp

我們將需要掛載 proc 檔案系統(一個核心的虛擬介面)並且把它放在 /proc 。但是我們先需要將我們的檔案放到分割區內。

現在從 使用安裝檔安裝 Gentoo 繼續。

5. Gentoo 安裝檔案

5.a. 安裝一個 Stage 壓縮檔

設定正確的日期/時間

在您繼續之前,您將需要檢查您的日期/時間。一個設定錯誤的時鐘將會在未來的時候造成一些奇怪的錯誤!

要檢查正確的日期/時間,執行date

原始碼 1: 檢查日期/時間

# date
Fri Mar 29 16:21:18 CEST 2005

如果顯示出的日期/時間是錯誤的,使用 date MMDDhhmmYYYY 進行更新(M 為月,D為日,h為時,m為分,和 Y為年份)。舉例來說,要將日期設定為 2005年3月29號,16:21:

原始碼 2: 設定日期/時間

# date 032916212005

找到 Stage3 檔案

如果您已經設定好網路,因為您需要下載屬於您系統架構的 stage3 檔案,請遵照 另種途徑:使用網路上的 Stage3,其他請閱讀 預設:使用 Installation CD 的 Stage3

5.b. 預設:使用 Installation CD 的 Stage3

解壓縮 Stage Tarball

CD 上的 stage 檔案放置在 /mnt/cdrom/stages 目錄中,要查看所有 stages 檔案列表,使用 ls

原始碼 3: 列出所以 stage 檔案

# ls /mnt/cdrom/stages

如果系統回應的是個錯誤訊息,您也許需要先將 CD-ROM 掛載起來:

原始碼 4: 掛載 CD-ROM

# ls /mnt/cdrom/stages
ls: /mnt/cdrom/stages: No such file or directory
# mount /dev/cdroms/cdrom0 /mnt/cdrom
# ls /mnt/cdrom/stages

現在進到您的 Gentoo 掛載點(通常是 /mnt/gentoo):

原始碼 5: 改變所在目錄至 /mnt/gentoo

# cd /mnt/gentoo

我們現在要將您所選定的 stage tarball 解壓縮。我們將使用 GNU tar 工具,請確認您使用相同的選項(-xvjpf)!x 代表著 Extract(解開),v 代表著 Verbose 用來檢視在解壓縮過程中發生的事件(好啦,是的,這是選擇性的),j 代表著Decompress with bzip2(以 bzip2 解開), p 代表著 Preserve permissions(預留的權限)和 f代表著以我們的方式解開而不是標準的輸入。在下面的例子中,我們解壓縮的 stage tarball 是 stage3-<subarch>-2005.0.tar.bz2,請記得將 tarball 檔名用您所選的 stage 檔代換。

原始碼 6: 解壓縮 stage tarball

# tar -xvjpf /mnt/cdrom/stages/stage3-<subarch>-2005.0.tar.bz2

現在 stage 檔已經安裝完成,請繼續下一步 安裝 Portage

5.c. 另種途徑:使用網路上的 Stage

下載 Stage 壓縮檔

先更換到您之前所掛載的目錄下(大部份是/mnt/gentoo):

原始碼 7: 更換到 Gentoo 的掛載點

# cd /mnt/gentoo

依照您的安裝方式,您有幾個可以選擇的工具下載 Stage 壓縮檔。如果您有 links2 ,您就可以馬上連接到 Gentoo 對映站 然後選擇最靠近您的位置。

如果沒有 links2 的話,應該會有 lynx 可以用。假如要透過 proxy,設定 http_proxyftp_proxy 變數:

原始碼 8: 設定 lynx proxy 資訊

# export http_proxy="http://proxy.server.com:port"
# export ftp_proxy="http://proxy.server.com:port"

我們假設你有 links2 可以使用。

選擇releases/的目錄,接著是您所使用的架構(如 x86/)最後則是 Gentoo 的版本(2005.0)最後您就可以看到適合您的架構所使用的 Stage 壓縮檔位於 stages/的列表(他們也許會被放在不同子架構中的子目錄中)。選擇一個然後按下 D 開始下載。當下載完成時,按下Q 離開瀏覽器。

原始碼 9: 使用 links2遊覽對映站

# links2 http://www.gentoo.org/main/en/mirrors.xml
(如果你想要使用 proxy:)
# links2 -http-proxy proxy.server.com:8080 http://www.gentoo.org/main/en/mirrors.xml

如果您想要檢查下載的壓縮檔是否正確,您可以使用 md5sum 然後以 MD5 checksum 輸出進行比較。例如說,檢查 stage 壓縮檔是否正確:

原始碼 10: 檢查 stage 壓縮檔是否下載正確

# md5sum -c stage1-x86-2005.0.tar.bz2.md5
stage1-x86-2005.0.tar.bz2: OK

解開 Stage 壓縮檔

現在解開您剛剛下載到系統上的壓縮檔。我們使用最簡單的 GNU 的 tar 方式進行:

原始碼 11: 解開 Stage 壓縮檔

# tar -xvjpf stage3-*.tar.bz2

確定您有放入一樣的參數(-xvjpf)。x 代表著 Extract(解開),v 代表著 Verbose 用來檢視在解壓縮過程中發生的事件(好啦,是的,這是選擇性的),j 代表著 Decompress with bzip2(以 bzip2 解開),p 代表著 Preserve permissions(預留的權限)和 f代表著以我們的方式解開而不是標準的輸入。

現在 stage 已經安裝完成了,請從 安裝 Porage 繼續。

5.d. 安裝 Portage

解壓縮 Portage 快照

現在你需要安裝 Portage 快照,裡面是告訴 Portage 那些軟體可以安裝,那些 profiles 可以使用等等的檔案集合。

解壓縮 Installation CD 上的快照

要安裝快照,請先看看 /mnt/cdrom/snapshots 目錄中有哪些快照可供選擇:

原始碼 12: 檢查 /mnt/cdrom/snapshots 內容

# ls /mnt/cdrom/snapshots

現在用下列指令解壓縮快照。同樣的,請確認您使用 tar 時有搭配正確的選項,另外 -C 是大寫的 C,不是 c。在下面的範例中,我們使用 portage-<date>.tar.bz2 作為快照檔名,請記得要將它用您 Installation CD 上的快照名稱作代換。

原始碼 13: 解壓縮 Portage 快照

# tar -xvjf /mnt/cdrom/snapshots/portage-20041022.tar.bz2 -C /mnt/gentoo/usr

複製原始碼檔案

您也需要從 Universal Installation CD 複製所有的原始碼。

原始碼 14: 複製原始碼

# mkdir /mnt/gentoo/usr/portage/distfiles
# cp /mnt/cdrom/distfiles/* /mnt/gentoo/usr/portage/distfiles/

5.e. 設定編譯參數

介紹

要自訂 Gentoo,您可以設定很多變數來影響 Portage 的動作。這些變數可以設為環境變數(使用 export)但是非永久性。如果要保留您的設定,可以存在 Portage 提供的 /etc/make.conf,一個 Portage 的設定檔。這也將是我們將要編輯的檔案。

注意: 您將會看到 /mnt/gentoo/etc/make.conf.example裡有一大串註解的可用變數。要完整地安裝 Gentoo 您至少需要按照以下設定變數。

使用您最喜歡的編輯器(這份指南我們使用 nano)然後我們才可以繼續我們稍後會討論到的自訂變數。

原始碼 15: 打開 /etc/make.conf

# nano -w /mnt/gentoo/etc/make.conf

您或許已經發現了,make.conf.example 檔案是基於常用的架構:註解的行數將以 "#" 放在每行的最前面,其他已定義的變數將使用類似 變數="內容"make.conf 也使用相同的語法。許多變數將在下面繼續講解。

警告: 如果您計畫在 stage3 安裝中使用 GRP,請不要對 USE 變數作任何變動,您可以在安裝完所有您想要的套件之後再變更 USE 變數,已知有怪事會發生侵害您的系統,如果您忽視這個警告的話!

CHOST

警告: 雖然這會對一些非 Stage1 的使用者有興趣,但是非 stage1 的使用者 不應該 更改 make.conf 內的 CHOST 的設定。這樣會造成系統不穩。再一次提醒:這只適用於 stage1 的使用者。

無網路安裝程序只支援 stage3 安裝,不要碰觸 CHOST 變數!

CFLAGS 和 CXXFLAGS

CFLAGSCXXFLAGS 變數將定義最佳效能化 gcc C 和 C++ 編譯器的參數。雖然我們以通用的方式定義,您將需要分開定義適合您提高效能的設定。原因是每個程式使用的都不同。

make.conf 您應該要定義一個您認為會最佳化的 通用 參數。不要將測驗性質的參數也放到這裡;太多自訂會讓程式變得怪異(當掉,或是更遭,無法作用)。

我們將不會解釋這些可用的參數選擇。如果您想知道更多,查看 GNU 線上指南 或是 gcc infopage (info gcc -- 只在一個完成的 Linux 系統上可作用)。 make.conf.example 這個檔也包含著許多範例及資料;不要忘了閱讀他們。

第一個設定為 -march= 參數,這代表著電腦架構的目標。可用的參數將會在 make.conf.example 檔案內說明(為註解的方式)。舉例來說,給 x86 Athlon XP 的架構:

原始碼 16: GCC march 設定

# 想要使用原生 64 位元環境的 AMD64 的使用者應該使用 -march=k8
-march=athlon-xp

第二個則是 O(是大寫的 O,不是零) 參數,代表著 gcc 的性能參數。可用的參數為 s (增加檔案大小性能),0 (零 - 沒有提昇性能), 12 或是 3 則關於速度的性能(一個特定的性能加上另外一個或是兩個)。舉例來說,一個 2 的性能參數:

原始碼 17: GCC O 設定

-O2

另一個受歡迎的參數為 -pipe (使用 pipes 進行編譯中的通訊而不是暫存檔)。

值得注意的是,使用 -fomit-frame-pointer (在不需要 frame pointer 的時候不使用)時可能會讓程式除錯時會有嚴重的負面效果。

當您定義 CFLAGSCXXFLAGS後,您應該按照以下範例將他們結合起來:

原始碼 18: 定義 CFLAGS 和 CXXFLAGS 變數

CFLAGS="-march=athlon-xp -pipe -O2"   AMD64 的使用者應該使用 march=k8
CXXFLAGS="${CFLAGS}"                  # 兩個變數使用一樣的設定

MAKEOPTS

MAKEOPTS 將定義的是您需要在安裝一個套件時需要幾個平行編譯。一個好的選擇是為您系統上的 CPU 數目加一,但這準則並不總是完美的。

原始碼 19: 普通的 1-CPU 系統的 MAKEOPTS

MAKEOPTS="-j2"

預備,開始!

依照您個人的選擇編輯 /mnt/gentoo/etc/make.conf 然後儲存 (nano 使用者可以按下 Ctrl-X)。您現在可以從 轉換根目錄進 Gentoo 基礎系統 繼續。

6. 安裝 Gentoo 基礎系統

6.a. 變換根目錄

掛載 proc 檔案系統

掛載 /proc 檔案系統到 /mnt/gentoo/proc,讓安裝過程即便是在轉換根目錄的環境下,也可以使用核心所提供的資訊。

原始碼 1: 掛載 /proc

# mount -t proc none /mnt/gentoo/proc

選擇性:複製 DNS 資訊

如果您設定好您的網路,並打算稍後從網路上抓取合適的 stage 檔案,您需要複製儲存在 /etc/resolv.conf 中的 DNS 資訊到 /mnt/gentoo/etc/resolv.conf,這個檔案包含您系統用來轉譯網名到 IP 位址的名稱伺服器。

原始碼 2: 複製 DNS 設定

# cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

進入新的系統環境

現在所有的分割區都已經初步設定好了而且基本的系統也安裝完畢,現在是用 變換根目錄進入新的系統環境的時候了。這代表我們從目前的安裝環境進入您安裝的系統(就是已經安裝的分割區)。

變換根目錄動作在三步驟內完成。首先我們會用 chroot 讓根目錄從 / (目前安裝的媒體)變換到 /mnt/gentoo (或您安裝的分割區)。然後用 env-update 建立新的環境,這將會建立基本的系統變數。最後,我們用 source 把這些變數載入到記憶體。

原始碼 3: 進入新的環境

# chroot /mnt/gentoo /bin/bash
# env-update
 * Caching service dependencies...
# source /etc/profile

恭喜!您現在在新的 Gentoo Linux 環境當中了。不過離安裝完畢還有一段時間,這就是為什麼安裝指南還有下面這些部份 :-)

6.b. 設定 USE 變數

什麼是 USE 變數?

USE 是 Gentoo 提供給使用者最有威力的變數之一。許多程式可以在編譯時包含或不包含自由選擇的支援。例如,一些程式可以在編譯時包含 gtk 支援,或者是支援 qt。其它程式可以包含或不包含 SSL 支援,也有一些甚至可以使用 framebuffer (svgalib) 而不是 X11 (X-server)。

大部分的安裝套件在編譯時都盡可能地加入最多的支援,增加檔案大小以及程式啟動的時間,更別提複雜的相依性。在 Gentoo 下您可以定義哪些支援編譯時要加入。這就是 USE 的作用。

USE 變數中,您可以加入要在編譯時加入支援的關鍵字。例如,ssl 會在支援 ssl 的程式編譯時加入 ssl 支援。-X 則會移除 X-server 支援(注意前面的減號)。gnome gtk -kde -qt 則會支援 gnome(以及 gtk),而不包含 kde(以及 qt) 的支援,這可以讓您的系統對 GNOME 完整的調節。

修改 USE 變數

警告: 如果您打算要使用預編套件(GRP 包),請先不要對 USE 變數作任何的修改,您可以在安裝完所有您想要的套件之後,再變更 USE 變數。已知會有怪事侵襲您的系統,如果您忽視這個警告的話!

預設的 USE 設定放在 /etc/make.profile/make.defaults,而您在 /etc/make.conf 中的設定會和預設的設定一起考慮。如果您在 USE 設定中新增一些東西,他會加入預設的設定中。如果您從 USE 中移除一些東西(在前面加上減號),他會從預設的設定移除。永遠不要改變任何在 /etc/make.profile 目錄中的東西,他會在您更新 Portage 時被覆蓋!

完整的 USE 說明可以在 Gentoo 手冊中 USE 參數 找到。完整的 USE 參數列表可以在系統中的 /usr/portage/profiles/use.desc 找到。

原始碼 4: 檢視可用的 USE 參數

# less /usr/portage/profiles/use.desc
(你可以使用方向鍵來捲動,按下 'q' 離開)

下面是一個 USE 的設定,在以 KDE 為基礎的系統中支援 DVD, ALSA 以及燒錄機。

原始碼 5: 開啟 /etc/make.conf

# nano -w /etc/make.conf

原始碼 6: USE 設定

USE="-gtk -gnome qt kde dvd alsa cdr"

7. 設定核心

7.a. 時區

為了讓您的系統知道它的位置在那裡,您將需要設定您的系統時區。到 /usr/share/zoneinfo 尋找您的時區,然後使用 ln 建立一個連接到 /etc/localtime 的符號連結。

原始碼 1: 設定時區資訊

# ls /usr/share/zoneinfo
(假設您要使用 GMT)
# ln -sf /usr/share/zoneinfo/GMT /etc/localtime

7.b. 安裝核心原始碼

選擇一個核心

Linux 的核心是所有版本的最中心,也是最重要的。他位於使用者程式和系統硬體之間。 Gentoo 提供使用者很多可用的核心原始碼。您可以到 Gentoo 核心 指南 查看我們所提供的核心。

使用 x86 系統的使用者,我們主要支援的核心名為 gentoo-sources,這個核心是以正式 Linux 原始碼為基礎,但是套用了安全、穩定性、相容性和臭蟲修正。除此之外, vanilla-sources 套件提供單純沒有加上補釘的 Linux 原始碼。

兩個核心原始碼都是以正式的 2.6 核心原始碼為基礎,如果您想要安裝 2.4 為基礎的核心,您將需要有個運作正常的網路連線來安裝 Gentoo,因為我們的 Installation CD 上沒有提供這些原始碼。

選擇適合您的核心原始檔然後使用 emerge 安裝。

原始碼 2: 安裝核心原始碼

# emerge gentoo-sources

當您查看 /usr/src 您將會看到一個 linux 的連接連到您所選的核心,我們會假設要安裝的核心版本是gentoo-sources-2.6.11-r3

原始碼 3: 觀看核心原始碼目錄連接

# ls -l /usr/src/linux
lrwxrwxrwx    1 root     root           12 Oct 13 11:04 /usr/src/linux ->
linux-2.6.11-gentoo-r3

如果這並沒有指向你所選擇的核心(注意 linux-2.6.11-gentoo-r3 只是一個範例),你要把他改成正確的核心:

原始碼 4: 更改核心連接目錄

# rm /usr/src/linux
# cd /usr/src
# ln -s linux-2.6.11-gentoo-r3 linux

現在我們該設定以及編譯您的核心了。您可以使用 genkernel 完成此項步驟,並且將會以和 Installation CD 一樣的通用的方式進行編譯。我們將先解釋如何手動編譯因為這是自訂您的環境的最佳方法。

如果您想要手動編譯您的核心,請從 預設:手動設定 繼續。如果您想要使用 genkernel 請從 其他選擇:使用 genkernel 繼續。

7.c. 預設:手動設定

介紹

手動設定核心常常被 Linux 使用者認為最難完成的步驟。雖然不假 -- 但是當您手動編譯幾次核心後,您應該不會覺得它有多難 ;)

但是,唯一 的重點就是:您必須要了解您的系統才可以開始手動編譯。系統上多數的資料可以安裝 pciutils (emerge pciutils),從裏面包含的 lspci 取得。你可以在 chroot 的環境下執行 lspci,不過可能會碰到一些 lspci 丟出的錯誤訊息(像是 pcilib: cannot open /sys/bus/pci/devices)。此外,你也可以在 未 chroot 執行,兩個結果都一樣。您也可以執行 lsmod 看看安裝光碟使用那些核心模組(這是一個不錯的暗示,教您該開啟那個選項)。

現在到您的核心原始碼目錄然後執行 make menuconfig。這將會啟動一個 ncurses 的設定選單。

原始碼 5: 開始 menuconfig

# cd /usr/src/linux
# make menuconfig

您將會看到一大串的設定部份。我們將列出一些您一定要啟用的選項(不然 Gentoo 無法完善地工作)。

必須開啟的選項

請確定您的系統開機所必需的每個驅動程式(像是 SCSI controller,...)都有 編進 核心而不是編成模組,否則您的系統將無法完成開機程序。

現在,選擇正確的處理器類別:

原始碼 6: General Support and processor family

General setup  --->
    [*] Support for hot-pluggable devices
Processor type and features --->
    Subarchitecture Type (PC-compatible)  --->
 (依照您的處理器所更換)
 (Athlon/Duron/K7) Processor family

現在到 File Systems 然後選擇要支援的檔案系統。記得 不要 將它們編成模組(Module)。還有 /proc file systemVirtual memory不要 勾選 /dev file system

原始碼 7: 選擇相關檔案系統

File systems --->
  Pseudo Filesystems --->
    <*> /proc file system support
    <*> /dev file system support (OBSOLETE)
    <*>   Automatically mount at boot
    <*> Virtual memory file system support (former shm fs)

(按照您系統所需要的檔案系統開啟以下選項)
  <*> Reiserfs support
  <*> Ext3 journalling file system support
  <*> JFS filesystem support
  <*> Second extended fs support
  <*> XFS filesystem support

不要忘了啟動您磁碟的 DMA 功能:

原始碼 8: 啟動 DMA

 
Device Drivers --->
  ATA/IDE/MFM/RLL support ---> 
    [*] Generic PCI bus-master DMA support
    [*]   Use PCI DMA by default when available

如果您需要透過 PPPoE 連線到網路或是數據機撥接,您將需要以下的核心選項:

原始碼 9: 選擇 PPPoE 相關驅動程式

Device Drivers --->
  Networking support --->
    <*> PPP (point-to-point protocol) support
    <*>   PPP support for async serial ports
    <*>   PPP support for sync tty ports

雖然 PPP over Ethernet 選項只有在 rp-pppoe 設定為核心 PPPoE 時需要,但是這兩個壓縮的選項不會造成錯誤。

如果您需要,不要忘了為您的網路卡加入核心的支援。

如果您有一個支援 HyperThreading(tm) 的 Intel CPU,或是有多個 CPU,您應該啟用 "Symmetric multi-processing support":

原始碼 10: 啟用 SMP 支援

Processor type and features  --->
  <*> Symmetric multi-processing support

如果你使用 USB 輸入裝置(像是鍵盤或滑鼠)不要忘記開啟他:

原始碼 11: 啟動 USB 輸入裝置支援

Device Drivers --->
  USB Support --->
  <*>   USB Human Interface Device (full HID) support
  [*]   HID input layer support 

如果您是筆記型電腦的使用者,並且需要 PCMCIA 支援,記得把它編進核心。還有其下的選項,記得要啟動您系統上 PCMCIA card bridge 的支援(在同一個設定選單畫面中可找到)。

原始碼 12: 啟動 PCMCIA 支援

Bus options (PCI, PCMCIA, EISA, MCA, ISA)  --->
  PCCARD (PCMCIA/CardBus) support  --->
    <*> PCCard (PCMCIA/CardBus) support
    (如果您需要支援較老舊的 PCMCIA 卡,勾選 16 bit。多數人會想要加入這個。)
    <*>   16-bit PCMCIA support
    [*]   32-bit CardBus support
    (選取相關的 bridge)
    --- PC-card bridges
    <*> CardBus yenta-compatible bridge support (NEW)
    <*> Cirrus PD6729 compatible bridge support (NEW)
    <*> i82092 compatible bridge support (NEW)
    <*> i82365 compatible bridge support (NEW)
    <*> Databook TCIC host bridge support (NEW)

編譯和安裝

現在您的核心已經設定完成了,我們該來編譯然後安裝它。離開核心設定,然後執行 make dep && make bzImage modules modules_install

原始碼 13: 編譯核心

# make && make modules_install

當核心完成編譯時,將核心映像檔複製到 /boot:從這邊我們將假設您安裝的是 gentoo-sources 的 2.6.11-r3。您可以隨意更改容易記住的檔案名稱,方便稍後的開機程式設定。

原始碼 14: 安裝核心

# cp arch/i386/boot/bzImage /boot/kernel-2.6.11-gentoo-r3

您也可以將您的核心設定檔備份到 /boot,以防萬一 :)

原始碼 15: 備份您的核心設定檔

# cp .config /boot/config-2.6.11-gentoo-r3

現在請從設定核心模組繼續。

7.d. 其他選擇:使用 genkernel

如果您正在讀這個部份,那您應該是選擇使用我們的 genkernel 程序來為您設定核心。

現在您的核心原始碼已經安裝了,我們該使用 genkernel 程序來自動幫您編譯核心。genkernel 是利用類似 Installation CD 的核心設定來進行工作的。這代表著當您使用 genkernel 編譯您的核心,您的系統大致上會在開機時偵測所有的硬體,就和我們的 Installation CD 一樣。因為 genkernel 不需要手動核心設定,所以適合不會編譯核心的使用者。

現在讓我們來看看如何使用 genkernel。首先,安裝 genkernel:

原始碼 16: 安裝 genkernel

# emerge genkernel

接下來,把 Installation CD 上的核心設定複製到 genkernel 找尋預設核心設定的位置:

原始碼 17: 複製 Installation CD 核心設定

# zcat /proc/config.gz > /usr/share/genkernel/x86/kernel-config-2.6

現在,編譯您的核心原始碼。如果您是透過 grp 安裝 genkerenl,直接執行 genkernel all。請注意,當 genkernel 正在編譯所有硬體支援時,等待的時間會有點久!接下來,把 Installation CD 上的核心設定複製到 genkernel 找尋預設核心設定的位置:

如果您的開機分割區沒有使用 ext2 或是 ext3 為檔案系統,您將需要使用 genkernel --menuconfig all 手動設定,然後在核心內加入您所使用的檔案系統支援( 不能 編成模組)。EVMS2 或 LVM2 的使用者可能會想要再加上 --evms2--lvm2 參數。

原始碼 18: 執行 genkernel

# genkernel --udev all

genkernel 完成的時候,一個核心映像檔,一套模組和一個 initial root disk (initrd)將會被建立。我們將在稍後設定開機程式時使用核心映像檔和 initrd。寫下核心和 initrd 的檔名方便您稍後設定開機程式。initrd 將會在開起到"真正的"系統之前馬上偵測硬體支援(就和 Installation CD 一樣)。

原始碼 19: 查看已建立的核心映像檔名和 initrd

# ls /boot/kernel* /boot/initrd*

如果您想要您的系統更像 Installation CD,在 Gentoo 安裝程序完成之後,您需要 emerge coldplug。initrd 會自動偵測您系統開機所需要的硬體,coldplug 擇會自動偵測所有其他事項。coldplug 在套件 CD 上有提供。

原始碼 20: 安裝和開啟 coldplug

(在安裝完成之後,GRP 安裝指令中)
# emerge -k coldplug
# rc-update add coldplug boot

7.e. 核心模組

設定模組

您將需要將想要開機時自動載入的模組放到 /etc/modules.autoload.d/kernel-2.4 (或是 kernel-2.6)。您也可以加上模組的選項。

要查看所有可用的模組,執行 find 指令。不要忘了將 "<kernel version>"更改為您剛剛編譯的版本:

原始碼 21: 查看所有可用的版本

# find /lib/modules/<kernel version>/ -type f -iname '*.o' -or -iname '*.ko'

舉例來說,要自動載入 3c59x.o 模組,編輯 kernel-2.4 或是 kernel-2.6

原始碼 22: 編輯 /etc/modules.autoload.d/kernel-2.4

(2.4核心的範例)
# nano -w /etc/modules.autoload.d/kernel-2.4

原始碼 23: /etc/modules.autoload.d/kernel-2.4 或是 kernel-2.6

3c59x

現在請從 設定您的系統 繼續安裝。

8. 設定您的系統

8.a. 檔案系統資訊

什麼是 fstab?

在 Linux 中,所有在系統中被使用的分割區要被列在 /etc/fstab 之中。在這個檔案之中包含了這些分割區的掛載點(他們在檔案系統中哪裡被存取),他們如何掛載( 一些特別的參數),以及何時掛載(要不要自動掛載,一般使用者可不可以掛載等)。

建立 /etc/fstab

/etc/fstab 使用特別的語法。每一列包含六個欄位,以空格(一個以上)、tab或兩者同時用來分隔。每一個欄位有他自己的定義:

  • 第一個欄位設定分割區的位置(裝置的路徑)
  • 第二個欄位設定分割區要在哪個掛載點被掛載
  • 第三個欄位設定分割區的檔案系統
  • 第四個欄位設定 mount 要掛載時所使用的掛載參數。 因為不同的檔案系統有不同的參數,您要去查詢 manpage (man mount) 來取得完 整的參數列表。這些參數之間以逗號分隔。
  • 第五個欄位被 dump 用來決定這個分割區需不需要被傾印。一般而言您可以設成 0(零)
  • 第六個欄位讓 fsck 決定當系統不正常的關機時,檔案系統檢查的順序。 根目錄要被設成 1 而其他則要設成 2,如果檔案系統不需要被檢查的 話,則設成 0

Gentoo 提供的預設 /etc/fstab 檔案 不是一個有效的 fstab 檔 ,接下來啟動 nano (或您慣用的編輯器)來建立/etc/fstab

原始碼 1: 開啟 /etc/fstab

# nano -w /etc/fstab

接著來看看我們如何設定 /boot 分割區。這只是一個範例,所以如果您的系統不需要 /boot 分割區(如:PPC),不要直接複製它。

在我們的 x86 分割範例中 /boot 是位於 /dev/hda1 分割區中,而且使用 ext2 檔案系統。他不應該在開機時自動掛載 (noauto),但是需要被檢查,所以我們應該記下來:

原始碼 2: /etc/fstab 中 /boot 設定範例

/dev/hda1   /boot     ext2    defaults        1 2

如果您不需要自動掛載 /boot 分割區,來增加您的系統安全性,您將需要將 defaults 更換成 noauto。這代表著您將需要在使用時手動掛載。

為了增進效能,大部分使用者都會在要掛載的分割區掛載參數中設定 noatime,因為這會讓系統不更新上次檔案的存取時間(一般來說您並不需要這個功能),因此可以加快速度:

原始碼 3: etc/fstab 中改進過的 /boot 設定範例

/dev/hda1   /boot     ext2    default,noatime    1 2

接下來,我們繼續完成下面這幾行,包括 /boot/ 還有置換區:

原始碼 4: /etc/fstab 中三行設定

/dev/hda1   /boot     ext2    default,noatime    1 2
/dev/hda2   none      swap    sw                0 0
/dev/hda3   /         ext3    noatime           0 1

最後,您要加入 /proctmpfs (必要),以及CD-ROM。如果您還有其他的裝置,也加到檔案中:

原始碼 5: 完整的 /etc/fstab

/dev/hda1   /boot     ext2    defaults,noatime     1 2
/dev/hda2   none      swap    sw                0 0
/dev/hda3   /         ext3    noatime           0 1

none        /proc     proc    defaults          0 0
none        /dev/shm  tmpfs   nodev,nosuid,noexec  0 0

/dev/cdroms/cdrom0    /mnt/cdrom    auto      noauto,user    0 0

檔案系統設定 automount 猜測使用哪個檔案系統(建議在可卸除的裝置使用,因為他們可能有多種檔案系統),而 user 參數讓一般使用者也能掛載 CD。

如果您使用 SPARC 的話,您也要將下面這一行加入 /etc/fstab 中:

原始碼 6: 在 /etc/fstab 加入 openprom 檔案系統

none        /proc/openprom  openpromfs    defaults      0 0

重新檢查一次 /etc/fstab,儲存離開後進行下面的步驟。

8.b. 網路資訊

主機名稱,領域名稱等

接下來的步驟其中之一就是給您的電腦一個名稱。這步驟相當簡單,但是許多人很難找到一個合適的名稱,記得您設定的名字在之後還是可以改變的,這可以讓您快一點完成。一般而言,您可以設定電腦名稱為 tux 而領域名稱為 homenetwork

我們會使用這些設定來當做範例。首先設定主機名稱:

原始碼 7: 設定主機名稱

# echo tux > /etc/hostname

其次設定領域名稱:

原始碼 8: 設定領域名稱

# echo homenetwork > /etc/dnsdomainname

如果您有 NIS 領域名稱的話(您不知道這是什麼的話,那您就不用設定它),您也需要去設定它:

原始碼 9: 設定 NIS 領域名稱

# echo nis.homenetwork > /etc/nisdomainname

現在加入 domainname script 到預設的 runlevel 中:

原始碼 10: 將 domainname 加到預設 runlevel

# rc-update add domainname default

設定網路

在您覺得 "嗯,我現在已經弄好了" 之前,您要記得在您剛開始安裝 Gentoo 時設定的網路只是在安裝過程中使用。現在您要為您的 Gentoo 系統設定網路。

所有的網路設定都集合在 /etc/conf.d/net。如果您不知道如何設定的話,您會覺得這些語法相當不熟悉或是不了解,但不用擔心,我們會解釋每件您該需要的訊息 :)

首先用您慣用的編輯器開啟 /etc/conf.d/net (這個範例中使用 nano):

原始碼 11: 開啟 /etc/conf.d/net 來編輯

# nano -w /etc/conf.d/net

您會看到的第一個變數是 iface_eth0。他的語法如下:

原始碼 12: iface_eth0 語法

iface_eth0="<您的 IP> broadcast <您的廣播位址> netmask 
<網路遮罩>"

如果您使用 DHCP (自動取得 IP),您只要設定 iface_eth0dhcp。如果您使用 rp-pppoe (例如 ADSL),則設定為 up。如果您要手動設定但是對上面的一些專有名詞不了解的話,請閱讀 了解網路專有名詞這一部分。

接這我們給您三個例子;第一個使用 DHCP,第二個設定靜態 IP (192.168.0.2) 以及網路遮罩 255.255.255.0,廣播位址 192.168.0.255 還有閘道 192.168.1.1,第三個則是適合 rp-pppoe 的設定:

原始碼 13: Examples for /etc/conf.d/net

(適用 DHCP)
iface_eth0="dhcp"
#一些網路管理員會要求你使用
#DHCP 伺服器指定的主機名稱和領域名稱。
#在這種情況下,加入底下的東西讓 dhcpcd 使用他們。
#這會取代掉你遠本設定的主機名稱和領域名稱。
dhcpcd_eth0="-HD"
#如果你使用 NTP 來同步你的電腦時間,使用
#-N 參數避免 dhcpcd 覆蓋你的 /etc/ntp.conf
dhcpcd_eth0="-N"

(適用靜態 IP)
iface_eth0="192.168.0.2 broadcast 192.168.0.255 netmask 255.255.255.0"
gateway="eth0/192.168.0.1"

(適用 rp-pppoe) 
iface_eth0="up" 

如果您有數個網路介面,新增額外的 iface_eth 變數,例如 iface_eth1iface_eth2 等。而 gateway 變數在您只有一個閘道時並不用增加。

現在儲存設定然後離開,繼續下面的步驟。

開機時自動啟動網路

讓您的網路介面開機時自動啟動,您要把底下這些加入預設的 runlevel 中。如果您使用 PCMCIA 介面則跳過這一步驟,PCMCIA 是由 PCMCIA 啟動 script 來啟動。

原始碼 14: 加入 net.eth0 到預設的 runlevel

# rc-update add net.eth0 default

如果您有數個網路介面,您要建立對應的 net.eth1net.eth2 等。您可以使用 ln 來完成:

原始碼 15: 建立額外的 initscripts

# cd /etc/init.d
# ln -s net.eth0 net.eth1
# rc-update add net.eth1 default

寫入網路資訊

您需要告訴 Linux 關於您的網路的資訊。這在 /etc/hosts 中定義幫助您將名稱伺服器上查不到的主機名稱反解為 IP。例如您的網路中有三台電腦,分別叫做 jenny (192.168.0.5),benny (192.168.0.6) 和 tux (192.168.0.7 - 這台電腦),您要開啟 /etc/hosts 然後填入這些設定:

原始碼 16: 開啟 /etc/hosts

# nano -w /etc/hosts

原始碼 17: 填入網路資訊

127.0.0.1     localhost
192.168.0.5   jenny.homenetwork jenny
192.168.0.6   benny.homenetwork benny
192.168.0.7   tux.homenetwork tux

如果您的電腦是唯一的一部,或是名稱伺服器有全部的反解,底下這一行已經足夠了,例如說,你想要你的電腦叫做 tux

原始碼 18: 適合單一電腦或是有完整反解的電腦的 /etc/hosts

127.0.0.1     localhost tux

儲存設定然後離開,繼續下面的步驟。

如果您沒有 PCMCIA,您可以繼續進行 系統資訊。 PCMCIA 使用者繼續下面的主題。

非必要:讓 PCMCIA 工作

注意: pcmcia-cs 只可以在 x86, amd64 和 ppc 平台上使用。

PCMCIA 使用者首先要安裝 pcmcia-cs 套件,包含打算使用 2.6 核心的使用者(雖然他們將不會使用套件內的驅動程式)。

原始碼 19: 安裝 pcmcia-cs

# emerge pcmcia-cs

pcmcia-cs 安奘好以後,新增 pcmcia預設 runlevel:

原始碼 20: 新增 pcmcia 到預設 runlevel

# rc-update add pcmcia default

8.c. 系統資訊

Root密碼

我們藉由輸入以下指令來更改Root密碼

原始碼 21: 設定Root密碼

 # passwd

如果您希望讓Root能夠從文字介面登入,請增加tts/0/etc/securetty:

原始碼 22: 增加 tts/0 to /etc/securetty

 # echo "tts/0" >> /etc/securetty

系統資訊

Gentoo 使用 /etc/rc.conf 來設定整個系統的一般設定。開啟 /etc/rc.conf 然後享受裡面完善的注解 :)

原始碼 23: 開啟 /etc/rc.conf

# nano -w /etc/rc.conf

就如同您所看到的,這個檔案有完善的注解讓您設定必要的參數。特別要注意 KEYMAP 變數,如果您設定錯誤的 KEYMAP 當您再用鍵盤輸入時會得到錯誤的結果。

注意: 以 USB 為主的 SPARC 系統或相容的系統可能要選擇 i386 keymap (例如 "us") 而不是 "sunkeymap"。

PPC 在大部份的系統上使用 x86 的 keymaps。想要使用 ADB keymaps 的使用者將需要在開機時啟用核心內的 ADB keycode sendings 然後在 rc.conf 內設定一個 mac/ppc keymap。

如果你的硬體時鐘不是用 UTC,你需要在這個檔案中加入 CLOCK="local",不然會有一些時間偏移。

設定好 /etc/rc.conf 以後,存檔然後離開。接下來繼續 安裝必要的系統工具

9. 安裝必要的系統工具

9.a. 系統記錄器

第一個您需要做決定的工具是用來提供給系統記錄的功能。Unix 和 Linux 擁有一個很好的記錄功能的歷史 -- 若是您想要的話,您可以記錄所有發生在您系統上的事情至 logfiles。這將會需要用到 系統記錄器

Gentoo 提供許多個系統記錄器的選擇。分別為 sysklogd,它是一個傳統的系統記錄伺服器,syslog-ng ,是一個進階的系統記錄器,而 metalog 則是一個高度配置的系統記錄器。Portage 內或許有其他的記錄器 -- 我們提供的套件每天都在增加當中。

假如你打算使用 sysklogdsyslog-ng,你可能想要接著安裝 logrotate 因為這兩個紀錄器不會提供任何輪替紀錄檔的功能。

請用 emerge 指令來安裝您想使用的系統記錄器,並使用 rc-update 將之加入至預設 runlevel。下面是一個安裝 syslog-ng 的例子。當然,它也適用於安裝您要用的系統記錄器:

原始碼 1: 安裝系統記錄器

# emerge syslog-ng
# rc-update add syslog-ng default

9.b. 非必要: Cron 伺服器

接下來的則是 cron 伺服器。雖然您的系統並不一定需要安裝這個伺服器,但我們還是建議您安裝一個。然而,什麼是 cron 伺服器呢?cron 伺服器執行排定的指令。若您需要時常執行一些指令 (每天、每星期、或是每個月),則它將會是一個得力的助手。

針對無網路的安裝,我們只提供 vixie-cron。如果您想要安裝其他 cron ,您將需要等到之後再自行安裝。

原始碼 2: 安裝 cron 伺服器

# emerge vixie-cron
# rc-update add vixie-cron default

9.c. 自由選擇:檔案索引

如果你想要為你系統上的檔案製作索引,讓你可以用 locate 工具快速找到他們的位置,你需要安裝 sys-apps/slocate

原始碼 3: 安裝 slocate

# emerge slocate

9.d. 檔案系統工具

依照您使用的檔案系統,您應該安裝必要的檔案系統工具 (用來檢查檔案系統的正確性、建立額外的檔案系統等等)。

下面的表格列出各檔案系統所需要安裝的工具,不是所有的架構都支援所有的檔案系統。

檔案系統工具安裝指令
XFSxfsprogsemerge xfsprogs
ReiserFSreiserfsprogsemerge reiserfsprogs
JFSjfsutilsemerge jfsutils

如果您不需要使用任何網路相關的程式(例如說 rp-pppoe 或 dhcp 客戶端),可以繼續閱讀 設定開機管理員

9.e. 網路工具

非必要:安裝 DHCP 客戶端

如果你需要 Gentoo 自動取得你網路介面的 IP 位址,你需要在你的系統上安裝 dhcpcd (或其他 DHCP 客戶端)。如果你目前不先做的話,在安裝完成後你可能不能連接網際網路!

原始碼 4: 安裝 dhcpcd

 
# emerge dhcpcd 

非必要:安裝 PPPoE 客戶端

如果您需要 rp-pppoe 來連線至網際網路,您需要安裝它。

原始碼 5: 安裝 rp-pppoe

# USE="-X" emerge rp-pppoe

USE="-X" 將會禁止 xorg-x11 因為依存性而被安裝至系統 (rp-pppoe 有圖型介面工具;如果您想要啟動它們,您可以晚點再重新編譯 rp-pppoe ,但您也可以現在就安裝 xorg-x11 -- 這將會需要更長的編譯時間)。

現在請接著閱讀 設定開機管理員

10. 設定開機管理程式

10.a. 決定您的選擇

介紹

現在您的核心已經設定和已經編譯好相關的系統設定檔了,是時候該安裝一個程式來驅動開機時所需要的核心。這個程式叫做 開機程式。適用於 x86, Gentoo Linux 提供 GRUBLILO。在我們繼續安裝其中一個開機程式之前,我們將會告訴您如何設定 framebuffer (如果您想要的話)。使用 framebuffer,您可以在文字介面下執行有限度的圖示功能(如 Gentoo 提供的漂亮 bootsplash)。

選擇性: Framebuffer

如果 您的核心有設定 framebuffer 的支援(或是您使用 genkernel 的預設核心設定),您可以在開機管理原設定中加入 vga 及/或 video 參數來啟動設定。

首先你需要了解你使用那種 framebuffer 裝置。如果你使用 Gentoo patch 過的核心(像是 gentoo-sources),你可能已經選擇 vesafb-tng 做為 VESA driver type(這類核心的預設值)。如果是這樣的話,你是使用 vesafb-tng 而且不需要 vga 參數。不然的話是使用 vesafb 裝置,需要設定 vga 參數。

vga 參數設定 vesafb 在你的螢幕上使用的解析度及色深。如同 /usr/src/linux/Documentation/fb/vesafb.txt (當你安裝核心套件時就會有這個檔案)中說的,你要傳一個對應解析度及色深的 VESA 編號。

底下列出你需要在 vga 參數中設定的編號及相對應的解析度及色深。

640x480800x6001024x7681280x1024
2560x3010x3030x3050x307
32k0x3100x3130x3160x319
64k0x3110x3140x3170x31A
16M0x3120x3150x3180x31B

video 參數設定 frambuffer 裝置設定。需要給它 frambuffer 裝置(2.6 核心使用 vesafb,2.4 核心使用 vesa),接著是你想要啟動的控制參數。全部的變數都列在 /usr/src/linux/Documentation/fb/vesafb.txt 之中,但我們會告訴你三個最常用到的選項。

選項說明
ywrap假設顯示卡可以循環使用記憶體(例如說當到結尾時自動從開頭繼續)
mtrr設定 MTRR 暫存器
mode( 只適用 vesafb-tng)
設定解析度,色深及更新頻率。例如說,1024x768-32@85 代表解析度 1024x768, 32 bit 色深及 85Hz 更新頻率。

更多的資訊可以在 /usr/src/linux/Documentation/fb/vesafb.txt 找到。

最後這兩個參數可能會像 vga=0x318 video=vesafb:mtrr,ywrapvideo=vesafb:mtrr,ywrap,1024x768-32@85。請記得(或是寫下)您適用的數值;您稍後將需要到它。

現在開始安裝 GRUB 或是 LILO

10.b. 預設: 使用 GRUB

了解 GRUB 的意義

了解 GRUB 的關鍵就是必須了解 GRUB 如何看待相關的硬碟和分割區。您的 Linux 分割區 /dev/hda1 將會被 GRUB 解釋為 (hd0,0)。請注意 hd0,0 外面的括號 - 它們是不可或缺的。

硬碟的計算是從 0 而不是 "a" 開始。請特別注意硬碟,GRUB 將不會計算 atapi-ide 光碟機和燒錄機等裝置。(在正常的情況來說,除非特別從 bios 設定 SCSI 磁碟開機,不然它們將取得比 ide 磁碟更高的號碼。當你要求 BIOS 從別的硬碟開機時,那個 硬碟會被視為 hd0

假如您有一個在 /dev/hda 的硬碟,在 /dev/hdb 的光碟機,在 /dev/hdc 的燒錄機,第二棵硬碟在 /dev/hdd 和沒有任何 SCSI 裝置。 /dev/hdd7 將會被翻譯成 (hd1,6)。這或許聽起來有點詭異,但是我們將可以利用 GRUB 提供的 tab 完成結構(tab complete mechanism)讓您設定許多硬碟和分割區時方便許多。

差點忘記了,我們現在該安裝 GRUB 了。

安裝 GRUB

要安裝 GRUB,我們先需要安裝它:

原始碼 1: 安裝 GRUB

# emerge grub

雖然 GRUB 已安裝完成,我們還需要為它編寫一個設定檔並且將 GRUB 程式安裝在 MBR,如此一來 GRUB 將自動的開啟到您新建立的系統核心。使用 nano (或是其他的編輯器)建立一個 /boot/grub/grub.conf 檔案:

原始碼 2: 建立 /boot/grub/grub.conf

# nano -w /boot/grub/grub.conf

現在我們將要開始編寫grub.conf。您將會在下面找到兩個按照我們的範例所使用的 grub.conf 設定檔,使用的是核心 kernel-2.6.11-gentoo-r3。我們只會在第一個 grub.conf 內進行註解。請確認您的核心映像檔案名稱,如果需要,也請確認您的 initrd 映像檔。

  • 第一個 grub.conf 適用於沒有使用 genkernel 編譯核心的使 用者
  • 第二個 grub.conf 適用於使用 genkernel 的使用者

注意: 如果您的跟目錄檔案系統是 JFS,您 必須kernel 那行文字加入 "ro" ,因為 JFS 在允許可讀寫的掛載前,需要重讀 (replay) 它的記錄檔。

原始碼 3: 未使用 genkernel 的 grub.conf

# 將為開機預設。0為第一,1為第二,以此類推。
default 0
# 使用預設前等待的開機秒數。
timeout 30
# 將漂亮又肥大的 splash-image 啟用:)
# 如果您沒有安裝顯示卡,請註解這行
splashimage=(hd0,0)/grub/splash.xpm.gz

title=Gentoo Linux 2.6.11-r3
# 儲存核心檔的分割區(或是作業系統)
root (hd0,0)
kernel /kernel-2.6.11-gentoo-r3 root=/dev/hda3

# 以下三行為 Windows 系統適合的雙重開機。
# 在我們的例子,Windows是放在 /dev/hda6
title=Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1

原始碼 4: genkernel 使用者適用的 grub.conf

default 0
timeout 30
splashimage=(hd0,0)/grub/splash.xpm.gz

title=Gentoo Linux 2.6.11-r3
root (hd0,0)
kernel /kernel-2.6.11-gentoo-r3 root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/hda3 udev
initrd /initrd-2.6.11-gentoo-r3

# 如果您想要雙重系統開機的話
title=Windows XP
root (hd0,5)
makeactive
chainloader +1

注意: 如果您使用不同的分割設定或是核心檔案,請依個人的設定更改。但是請確認所有 GRUB 相關的裝置(如(hd0,0))和掛載點有相連的,而非 root。換句話說, (hd0,0)/grub/splash.xpm.gz 實際上是放在 /boot/grub/splash.xpm.gz 因為 (hd0,0)/boot

如果您需要自行輸入任何參數給核心,只要將他們放在 kernel 的指令後面。我們已經傳送了一個(root=/dev/hda3 或是 real_root=/dev/hda3),但是您也可以傳送其他的指令。舉例來說,我們使用 video 且/或 vga 來設定之前提過的 framebuffer。

如果你使用 2.6.7 或更新的核心,而且你因為 BIOS 不能處理大容量的硬碟而調整了跳腳,你需要加入 hdx=stroke.

genkernel 使用者應該要知道他們的新使用的和 Installation CD 一樣。舉例來說,如果您有 SCSI 裝置,您應該在核心選項後面加入 doscsi

現在儲存 grub.conf 檔案然後離開。你接下來需要把 GRUB 安裝到 MBR(Master Boot Record) ,讓他開機時自動執行。

GRUB 開發員建議使用 grub-install。然而,如果因為一些原因讓 grub-install 不能正常工作,你依然可以選擇手動安裝 GRUB。

接下來繼續 預設:使用 grub-install 設定 GRUB 或是 另一種選擇:手動設定 GRUB

預設:使用 grub-install 設定 GRUB

你需要輸入 grub-install 指令來安裝 GRUB。然而,因為你是在 chrooted 的環境,grub-install 並不能順利執行。我們需要更新 /etc/mtab (這個檔案包含了所有已掛載的檔案系統的資訊)幸運的,有一個方便的方法來完成 - 只要將 /proc/mounts 複製到 /etc/mtab 就好了:

原始碼 5: 更新 /etc/mtab

# cp /proc/mounts /etc/mtab

現在可以使用 grub-install 安裝 GRUB。

原始碼 6: 執行 grub-install

# grub-install /dev/hda

如果您有更多關於 GRUB 的問題,請參考 GRUB FAQ 或是 GRUB 說明

注意: 當您重新安裝核心時,您不再需要複製其他檔案了。只要在編譯完核心後執行 make install;他就會自動的幫您複製檔案,並且調整GRUB設定檔。

接下來繼續 重新開機系統

另一種選擇:手動設定 GRUB

接下來輸入 grub 來開始設定。你可以看到 grub 的提示符號 grub> 。現在,你需要輸入正確的指令來安裝 GRUB 開機紀錄到硬碟中。

原始碼 7: 啟動 GRUB shell

 
# grub 

注意: 如果你的系統沒有軟碟機,可以在上面的指令加入 --no-floppy 選項來避免 grub 偵測 (不存在的) 軟碟機。

在設定範例檔中我們想要安裝 GRUB 讓他可以從開機分割區 /dev/hda1 讀取資訊,還有安裝 GRUB 開機紀錄到硬碟的 MBR (主開機紀錄) 讓我們打開電腦後所看到的第一個東西就是 GRUB。當然,如果你沒有依照安裝時的範例設定檔,依據你的設定改變指令。

GRUB 的自動完成技巧可以在 GRUB 內使用。例如說,如果你輸入 "root (" 然後按下 TAB,你會看到裝置列表(例如說 hd0)。如果你輸入 "root (hd0," 再按下 TAB,你會看到所有可以選擇的分割區列表(例如說 hd0,0)。

藉著使用 tab 自動完成,設定 GRUB 不再是那麼困難了。所以現在繼續設定 GRUB 吧 :)

原始碼 8: 安裝 GRUB 到 MBR

 
grub> root (hd0,0)          (指定你的 /boot 分割區位置) 
grub> setup (hd0)           (安裝 GRUB 到 MBR) 
grub> quit                  (離開 GRUB shell) 

注意: 如果你想要安裝 GRUB 到某一個分割區而不是 MBR,你需要改變 setup 指令指向正確的分割區。例如說,你想要把 GRUB 安裝到 /dev/hda3,那指令就變成 setup (hd0,2)。然而很少使用者需要知道這個。

如果你使用 GRUB 有任何問題,請查閱GRUB FAQGRUB 手冊

接著繼續重開機系統

10.c. 其他選擇: 使用 LILO

安裝 LILO

LILO,LInuxLOader 是 Linux 開機程式中最穩定的一個。但是,它缺少一些 GRUB 所有的功能(這就是為什麼 GRUB 越來越受歡迎)。原因是 LILO 目前只用在 GRUB 無法使用的系統上,GRUB 不能但是 LILO 能。當然,也是有熟悉 LILO 的使用者繼續愛用著。不論那個, Gentoo 都支援,看到這邊有代表著您有興趣要安裝 LILO。

安裝 LILO 很簡單;只需要使用 emerge

原始碼 9: 安裝 LILO

# emerge --usepkg lilo

設定 LILO

要設定 LILO,您一定要建立 /etc/lilo.conf。開啟您最喜歡的編輯器(在手冊內我們使用 nano 確保所有文件的一慣性)然後建立此檔。

原始碼 10: 建立 /etc/lilo.conf

# nano -w /etc/lilo.conf

不久之前,我們已經請您記住您所建立的核心檔案名稱。以下的 lilo.conf 範例,我們將假設核心名稱為 kernel-2.6.11-gentoo-r3。我們也使用範例內的分割設定為範例。共有兩個部份:

  • 一個適用於沒有使用 genkernel 編譯核心的使用者
  • 另一個則是適用於使用 genkernel 編譯核心的使用者

請確任您的核心映像檔案名稱,如果需要,也確認您的 initrd 檔案名稱。

注意: 如果您的跟目錄檔案系統是 JFS,您 必須kernel 那行文字加入 "ro" ,因為 JFS 在允許可讀寫的掛載前,需要重讀 (replay) 它的記錄檔。

原始碼 11: /etc/lilo.conf 範例

boot=/dev/hda             # 將 LILO 安裝到 MBR
prompt                    # 給予使用者選擇系統的畫面
timeout=50                # 開啟預設選項前等待五秒

default=gentoo            # 當 timeout 所設定的時間超過時,自行開啟 "gentoo"

# 非 genkernel 使用者
image=/boot/kernel-2.6.11-gentoo-r3
  label=gentoo            # 這個部份的名稱
  read-only               # 以唯讀的方式開啟 root
  root=/dev/hda3          # 根(╱)系統的位置

# 使用 genkernel 的使用者
image=/boot/kernel-2.6.11-gentoo-r3
  label=gentoo
  read-only
  root=/dev/ram0
  append="init=/linuxrc ramdisk=8192 real_root=/dev/hda3 udev"
  initrd=/boot/initrd-2.6.11-gentoo-r3

# 以下兩行只使用於多重開機到 Windows 系統。
# 在我們的例子裡,Windows 是放在 /dev/hda6.
other=/dev/hda6
  label=windows

注意: 如果您使用不同的分割方式或是核心檔案,請自行更改。

如果您需要重送其他參數給核心,請加入 append 的語句。舉例來說,我們將加入 video 開啟 framebuffer:

原始碼 12: 使用 append 加入核心參數

image=/boot/kernel-2.6.11-gentoo-r3
  label=gentoo
  read-only
  root=/dev/hda3
  append="video=vesafb:mtrr,ywrap,1024x768-32@85"

如果你使用 2.6.7 或更新的核心,而且你因為 BIOS 不能處理大容量的硬碟而調整了跳腳,你需要加入 hdx=stroke.

genkernel 使用者應該要知道他們的新使用的和 Installation CD 一樣。舉例來說,如果您有 SCSI 裝置,您應該在核心選項後面加入 doscsi

現在儲存檔案然後離開。要完成動作,您需要執行 /sbin/lilo 放 LILO 可以套用 /etc/lilo.conf 到系統上(安裝到磁碟上)。請注意,每次您安裝新的核心時,您將需要再次執行 /sbin/lilo

原始碼 13: 完成 LILO 安裝

# /sbin/lilo

注意: 當您重新安裝核心時,您不再需要複製其他檔案了。只要在編譯完核心後執行 make install;他就會自動的幫您複製檔案,並且調整GRUB設定檔。

接下來請到 重新開機系統

10.d. 重新開機系統

離開 chrooted 的環境然後卸載所有掛載的分割區。接著輸入你已經等很久的神奇指令: reboot

原始碼 14: 卸載所有分割區然後重新開機

# exit
cdimage ~# cd
cdimage ~# umount /mnt/gentoo/boot /mnt/gentoo/proc /mnt/gentoo
cdimage ~# reboot

當然,不要忘了移除可開機的 CD,否則等一下會從 CD 開機而不是你剛裝好的 Gentoo 系統。

重開機好了以後,接著完成 完成你的 Gentoo 安裝

11. 最終化您的 Gentoo 安裝

11.a. 使用者管理

加入一個每天使用的使用者

在 Unix/Linux 系統下登入成 root 工作是危險的,並應該盡量的避免。所以我們 強烈的建議您新增另一個使用者來應付日常的使用。

使用者所在的群組定義了使用者可以執行那些工作?底下的表格列出許多你會想用的重要群組:

群組說明
audio可以存取音效裝置
cdrom可以直接存取光學儲存裝置(ex:光碟機)
floppy可以直接存取磁碟
games可以玩遊戲
usb可以存取 USB 裝置
video可以存取影像擷取器以及使用硬體加速
wheel可以使用 su

例如,建立一個叫做 john 的使用者,他是 wheelusers、以及 audio 群組 的一員,請先用root登入(只有root可以新增使用者),然後執行 useradd

原始碼 1: 加入一個每天使用的使用者

Login: root
Password: (您的root密碼)
# useradd -m -G users,wheel,audio -s /bin/bash john
# passwd john
Password: (輸入 john 使用者的密碼)
Re-enter password: (再次輸入密碼確認)

如果這個使用者需要在 root 下執行一些任務,他們可以使用 su - 暫時取得 root 的權限。另一個方法則是使用 sudo 套件,若是正確的設置該套件,它將是非常安全的。

11.b. 自由選擇:安裝 GRP 套件

重要: 這部份只適用 GRP 使用者。其他使用者請跳過這部份繼續閱讀 然後呢?

現在你的系統開機好了,以你建立的使用者登入(例如 john),然後 su - 取得管理者權限:

原始碼 2: 取得管理者權限

$ su -
Password: (輸入管理者 (root) 密碼)

現在我們要改變 Portage 的設定讓它搜尋第二張光碟(套件光碟)上的預編套件,首先掛載光碟:

原始碼 3: 掛載光碟

(將套件光碟放到光碟機中)
# mount /mnt/cdrom

現在設定 Portage 使用 /mnt/cdrom 目錄中的套件:

原始碼 4: 設定 Portage 使用/mnt/cdrom

# ls /mnt/cdrom

(如果有 /mnt/cdrom/packages 目錄:)
# export PKGDIR="/mnt/cdrom/packages"

(不然的話:)
# export PKGDIR="/mnt/cdrom"

現在安裝你想要用的套件。套件光碟包含多種的預編套件,例如 KDE:

原始碼 5: 安裝 KDE

# emerge --usepkg kde

確定現在就安裝預編套件。當你執行 emerge --sync 更新 Portage (之後你就會學到),預編套件可能不符合你更新後的 ebuild 檔。可可以試試用 emerge --usepkgonly 取代 emerge --usepkg 避免這個問題。

恭喜,你的系統完全搞定了!接下來繼續然後呢? 學習更多關於 Gentoo 的東西。

12. 然後呢?

12.a. 文件

恭喜!您現在有一個可以運行的 Gentoo 系統了。但接下來該何去何從呢?您接下來有什麼選擇?該先探索什麼?Gentoo 提供它的使用者許多的方向,因此,它提供了許多的特點並編寫成文件。

您應該先看一看 Gentoo Handbook 的下一章節名為 使用 Gentoo,它將會告訴您如果讓您的軟體保持在最新的狀態、如果安裝更多的軟體、什麼是 USE 參數、Gentoo Init 系統的運作方式等等。

如果您有興趣將您的系統最佳化成桌面使用,或著您想要學習如果設定您的系統至一個完整的桌面系統,請閱讀 Gentoo 桌面文件資源

Gentoo Security Handbook 上也有豐富的文件值得一讀。

請翻閱我們的 文件資源 一頁取得我們提供的完整的文件列表。

12.b. Gentoo 線上

我們永遠歡迎您加入 Gentoo 討論區 或是我們眾多的 Gentoo IRC 頻道

我們也有一些對所有使用者公開的 郵寄列表。這頁將會介紹如何加入的資訊。

我們閉嘴的時間到了,並讓您享受您的安裝過程 :)

12.c. 2005.0 後的改變

改變?

Gentoo 的演進相當快。底下部份說明影響 Gentoo 安裝的重要部份。我們只列出安裝過程中共同的部份,安裝過程中不會用到的套件並不包含在其中。

底下的改變是在你更新完系統(重開機前)需要注意的:

  • baselayout 套件有一些重要的改變,包含在 Gentoo 網路設定中提到的。這些改變包括 /etc/conf.d/net 檔案新的語法(雖然舊的也還支援)。建議你趕快改用新 的設定。

B. 使用 Gentoo

1. Portage 介紹

1.a. 歡迎使用 Portage

Portage 大概是 Gentoo 在軟體管理方面最傑出的創造。因為他具有很高的彈性及數不清的功能,通常被視為 Linux 中最好的軟體管理工具。

Portage 完全以 PythonBash 寫成,因此他可以完全的讓使用者看透,因為這兩個都是草稿語言。

大部分使用者會透過 emerge 工具使用 Portage。這一章並不會重複 emerge man page 中提供的資訊。如果你想要了解完整的 emerge 選項,請查閱 man page:

原始碼 1: 閱讀 emerge man page

$ man emerge

1.b. Portage 樹

Ebuilds

當我們談到套件時,通常是指透過 Portage 樹讓 Gentoo 使用者可以取得的軟體名稱。 Portage 樹是指 ebuilds 的集合,檔案中包含 Portage 維護軟體所需的資訊(安裝,搜尋,查詢,...)。這些 ebuilds 預設存放在 /usr/portage

當你要求 Portage 對某個軟體名稱執行某樣動作時,他都會以系統上的 ebuilds 為基礎。因此定期更新系統上的 ebuilds 讓 Portage 知道新的軟體,安全更新等等是很重要的。

更新 Portage 樹

Portage 樹通常是用 rsync,一個快速的小型檔案傳輸工具,來更新。因為 emerge 指令提供一個 rsync 的前端介面,更新相當的簡單。

原始碼 2: 更新 Portage 樹

# emerge --sync

如果因為防火牆的限制讓你不能使用 rsync,你仍然可以使用每天自動產生的 Portage 快照。emerge-webrsync 工具自動下載及安裝最新的快照到你的系統中:

原始碼 3: 執行 emerge-webrsync

# emerge-webrsync

1.c. 維護軟體

搜尋軟體

你可以使用 emerge 內建的搜尋功能來搜尋軟體。預設上,emerge --search 回覆符合搜尋字串的套件名稱(完全或部分符合)。

例如說,搜尋名稱中有 "pdf" 的所有套件:

原始碼 4: 搜尋以 pdf 命名的套件

$ emerge --search pdf

如果你也想要搜尋套件描述,你可以使用 --searchdesc (或 -S):

原始碼 5: 搜尋 pdf 相關套件

$ emerge --searchdesc pdf

當看到輸出內容時,你會發現他給你很多資訊。這些欄位很清楚的命名所以我們不會深入說明他們的意義:

原始碼 6: 'emerge --search' 輸出範例

*  net-print/cups-pdf
      Latest version available: 1.5.2
      Latest version installed: [ Not Installed ]
      Size of downloaded files: 15 kB
      Homepage:    http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
      Description: Provides a virtual printer for CUPS to produce PDF files.
      License:     GPL-2

安裝軟體

一但你找到你喜歡的軟體,你可以使用 emerge 輕鬆的安裝他:只要加上套件名稱。例如說,安裝 gnumeric

原始碼 7: 安裝 gnumeric

# emerge gnumeric

因為有很多套件都依賴其他套件,任何安裝特定套件的動作可能會導致安裝數個相依套件。別擔心,Portage 會完美的處理相依關係。如果你想要知道當你安裝某個套件時 Portage 可能 會安裝的軟體,加上 --pretend,例如說:

原始碼 8: Pretend to install gnumeric

# emerge --pretend gnumeric

當你要求 Portage 安裝一個套件時,他會從網路上下載需要的原始碼(如果需要的話)並且預設存在 /usr/portage/distfiles。這之後會解壓縮,編譯,然後安裝套件。如果你想要 Portage 只下載原始碼而不安裝,在 emerge 指令後加入 --fetchonly 選項:

原始碼 9: 下載 gnumeric 的原始碼

# emerge --fetchonly gnumeric

尋找已安裝套件的文件

許多套件有提供他們自己的文件。有時候,doc USE 設定決定要不要安裝這些文件。你可以使用 emerge -vp <套件名稱> 指令來檢查是否有 doc USE 設定。

原始碼 10: 檢查 doc USE 設定是否存在

(alsa-lib 當然只是一個範例而已)
# emerge -vp alsa-lib
[ebuild  N    ] media-libs/alsa-lib-1.0.9_rc3  +doc -jack 674 kB

你可以在 /etc/make.conf 檔案中全域啟動或關閉 doc USE 設定,或是在 /etc/portage/package.use 檔案中設定個別套件。USE 設定 這一章包含這些的詳細說明。

在套件安裝完以後,他的文件一般都在 /usr/share/doc 下以套件名稱為名的子目錄下。你也可以用 app-portage/gentoolkit 套件 中的 equery 工具列出所有已安裝的檔案。

原始碼 11: 確認套件文件的位置

# ls -l /usr/share/doc/alsa-lib-1.0.9_rc3
total 28
-rw-r--r--  1 root root  669 May 17 21:54 ChangeLog.gz
-rw-r--r--  1 root root 9373 May 17 21:54 COPYING.gz
drwxr-xr-x  2 root root 8560 May 17 21:54 html
-rw-r--r--  1 root root  196 May 17 21:54 TODO.gz
  	 
(或者是,使用 equery 來找你有興趣的檔案:)
# equery files alsa-lib | less
media-libs/alsa-lib-1.0.9_rc3
* Contents of media-libs/alsa-lib-1.0.9_rc3:
/usr
/usr/bin
/usr/bin/alsalisp
(下略)

移除軟體

當你想從系統上移除軟體,使用 emerge --unmerge。這會告訴 Portage 從你的系統中移除所有這個套件安裝的檔案,除了該套件在安裝後你修改過的設定檔。留下這些設定檔讓你可以繼續使用這個套件,如果你重新安裝他的話。

然而,一個 嚴重警告 是:Portage 並 不會 檢查別的套件是否依賴你要移除的套件。然而他會在你想要移除某些套件時警告你,因為移除後會搞雜系統。

原始碼 12: 從系統上移除 gnumeric

# emerge --unmerge gnumeric

當你從系統上移除套件後,再安裝這個套件時自動安裝的相依套件會被留下來。要讓 Portage 知道相依套件也可以移除,使用 emerge--depclean 功能。我們會在之後討論他。

更新系統

為了讓你的系統保持在最佳狀態(更不用說安裝最新的安全性更新),你需要定期更新系統。因為 Portage 只檢查在 Portage 樹中的 ebuilds,首先你需要更新 Portage 樹。當你更新好了以後,你可以使用 emerge --update world 更新你的系統:

原始碼 13: 更新你的系統

# emerge --update world

Portage 會搜尋你安裝過的程式較新的版本。然而,他只會搜尋你要求安裝的軟體 - 而沒有相依套件。如果你相要更新系統上每一個套件,加上 --deep 參數:

原始碼 14: 更新全系統

# emerge --update --deep world

因為你沒有刻意安裝的套件(因為其他套件相依而安裝)也會有安全更新,建議你偶爾執行這個指令。

如果你最近改變過任何 USE 旗標,你可能會想要加入 --newuse。Portage 會檢查這個改變是否需要安裝新的套件會是重新編譯已安裝的套件:

原始碼 15: 執行完整更新

# emerge --update --deep --newuse world

存根套件

一些在 Portage 樹中的套件實際上並沒有任何內容,而是用在安裝一系列的套件。例如說,kde 套件會設定相依許多 KDE 相關套件來在你的系統上安裝一個完整的 KDE 環境。

如果你想要移除像這樣的套件,執行 emerge --unmerge 並不會有太大幫助,因為他的相依套件還是留在系統上。

Portage 有能力移除孤立相依套件,但是因為套件的相依性是動態的,你首先需要更新整個系統,包括你改變 USE 旗標造成的改變。完成之後你可以執行 emerge --depclean 移除孤立相依套件。做完以後,你需要重新編譯動態連結到已移除軟體,但現在不再需要連結的套件。

這些事情可以用底下的指令處理:

原始碼 16: 移除孤立相依套件

# emerge --update --deep --newuse world
# emerge --depclean
# revdep-rebuild

revdep-rebuild 是由 gentoolkit 套件提供的,不要忘記先安裝他:

原始碼 17: 安裝 gentoolkit 套件

# emerge gentoolkit

1.d. 當 Portage 在編譯時...

關於 SLOT,虛擬,分支,架構,和 Profile

如同我們前面說的,Portage 相當有威力,並且支援許多其他軟體管理工具缺乏的功能。為了了解這些功能,我們會從各角度解釋 Portage 而不會太深入。

借著 Portage 但依套件的不同版本可以共同存在系統上。而其他發行版通常是以套件的版本來命名(像 freetypefreetype2),Portage 使用一種叫做 SLOT 的技術。ebuild 使用它的版本來宣告特定的 SLOT。有著不同 SLOT 的套件可以共存在同一個系統上。例如說,freetype 有著包含 SLOT="1"SLOT="2" 的 ebuild。

也有些套件提供相同的功能但透過不同方法實做。例如說,metalogdsysklogdsyslog-ng 都是系統紀錄器。依賴 "系統紀錄器" 的軟體不能只相依一種紀錄軟體,像是 metalogd,因為其他的紀錄器也是一個不錯的選擇。Portage 允許 virtuals:每一種系統紀錄器提供 virtual/syslog 讓軟體可以相依 virtual/syslog

Portage 樹中的軟體可以存放在不同的分支中。預設系統只接受 Gentoo 視為穩定的套件。大部份新的軟體剛提交時,先加到測試中的分支去,代表在他標示為穩定前需要更多的測試。雖然你可以在 Portage 樹中看到這個軟體的 ebuild,在他標示為穩定分支前 Portage 不會去做更新。

一些軟體只能在特定的硬體架構上使用。可能是在其他架構上不能工作,需要更多測試,或者是提交這個軟體到 Portage 的發展者不能確認這個套件能不能在不同平台工作。

Gentoo 的安裝包括特定的 profile,包含了在其他資訊之外,系統正常工作所需的套件列表。

阻擋的套件

原始碼 18: Portage 警告阻擋套件 (加上 --pretend)

[blocks B     ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)

原始碼 19: Portage 警告阻擋套件 (沒有 --pretend)

!!! Error: the mail-mta/postfix package conflicts with another package.
!!!        both can't be installed on the same system together.
!!!        Please use 'emerge --pretend' to determine blockers. 

Ebuild 包含特殊的區域告訴 Portage 關於他的相依性。相依性關係有兩種:宣告在 DEPEND 以及執行期相依,宣告在 RDEPEND。當其中一個相依關係中標記一個套件或虛擬 相容,他就成為阻擋套件。

要修正阻擋,你可以選擇不要安裝這個套件,或是先移除衝突的套件。在上面的範例中,你可以選擇不要安裝 postfix 或是先移除 ssmtp

也有可能是還沒安裝的兩個套件互相阻擋。在這種很少見的情況下,你應該先找出為什麼需要安裝這兩個套件。大部份的情況裝一個就足夠了。如果不是的話,請送一個錯誤到 Gentoo 錯誤追蹤系統

封鎖的套件

原始碼 20: Portage 警告封鎖的套件

!!! all ebuilds that could satisfy "bootsplash" have been masked. 

原始碼 21: Portage 警告封鎖的套件 - 理由

!!! possible candidates are:

- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)
- dev-util/cvsd-1.0.2 (masked by: missing keyword)
- media-video/ati-gatos-4.3.0 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)

當你想要安裝在你系統上還不能使用的套件時,你會得到封鎖的錯誤。你應該嘗試安裝其他在你系統上可用的軟體,或是等這個軟體可以用時再安裝。這裡總是有封鎖的理由:

  • ~arch keyword 代表這個軟體還沒經過足夠的測試,而不能放到穩定分支。等 幾天或幾個禮拜再試試看。
  • -arch keyword-* keyword 代表這個軟體在你的系統架構下不能工 作。如果你確定這個套件的確可以動作,送出一個 bug 到我們的 bugzilla 網站。
  • missing keyword 代表這個程式還沒在你的系統架構下測試過。要求架構移植 團隊測試或是你幫他們測試,然後回報你的結果到我們的 bugzilla 網站。
  • package.mask 代表這個套件已經被發現毀壞,不穩定或是更糟的情況。而且被 刻意標記成不可使用。
  • profile 代表這個套件被發現不適合你的 profile。安裝這個套件可能毀了你 的系統,或是他就是不相容你用的 profile。

相依性遺失

原始碼 22: Portage 警告相依性遺失

emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".

!!! Problem with ebuild sys-devel/gcc-3.4.2-r2
!!! Possibly a DEPEND/*DEPEND problem. 

你輸入要安裝的套件相依在你的系統上不可取得的套件。請檢查 bugzilla 看看這件事被發現了沒,如果沒有的話,請回報他。除非你使用混合的分支這不應該發生,因此這是一個 bug。

模稜兩可的的 Ebuild 名稱

原始碼 23: Portage 警告模稜兩可的的 Ebuild 名稱

!!! The short ebuild name "aterm" is ambiguous.  Please specify
!!! one of the following fully-qualified ebuild names instead:

    dev-libs/aterm
    x11-terms/aterm

你想要安裝的套件他的名稱符合超過一個套件。你要同時提供他的類別名稱。Portage 會告訴你可能符合的讓你選擇。

循環相依

原始碼 24: Portage 警告循環相依

!!! Error: circular dependencies: 

ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1
ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2 

兩個(或更多)你想要安裝的套件互相依賴,因此不能被安裝。這通常是 Portage 樹中的 bug。請等一下重新作 sync 然後再試一次。你也可以檢查 bugzilla 看看這件事被發現了沒,如果沒有的話,請回報他。

下載失敗

原始碼 25: Portage 警告下載失敗

!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
(...)
!!! Some fetch errors were encountered.  Please see above for details.

Portage 不能下載指定程式的原始碼而會繼續安裝其他的程式(如果可用的話)。這個錯誤可能因為鏡像站還沒正確同步,或是 ebuild 指向錯誤的位置。原始碼存放的伺服器也可能因為一些理由關閉了。

一小時候在看看這個問題是否還存在。

系統 Profile 保護

原始碼 26: Portage warning about profile-protected package

!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.

你已經要求移除屬於系統核心套件一部分的套件。他在 profile 中視為必要的因此不能從系統上移除。

2. USE 參數

2.a. 什麼是 USE 參數?

USE 關鍵字的概念

當您在安裝 Gentoo (或是其他版本,或是作業系統)您將需要依照環境而決定一些選擇。要設定一台伺服器和要設定一台工作站是不一樣的。一個遊戲工作站和一個需要 3D 立體加速的工作站也不同。

這不只是您要選擇安裝什麼套件,但是您也需要某些功能支援於某些套件。如果您不需要 OpenGL,那您為什麼要自找麻煩安裝然後編譯 OpenGL 到您大多數的套件呢呢?如果您不想要使用 KDE,那為什麼要多浪費時間編譯那些可以不用 KDE 也可以完整的執行的套件內的 KDE 支援呢?

為了要幫助使用者決定要安裝/啟用,我們需要使用者簡單的了解他所使用的環境。這將強迫使用者決定他真的要什麼,和了解 Portage 套件管理系統的方便性。

一個 USE 參數的解釋

USE 參數就好像一個包含著相依性支援的關鍵字。如果您定義一個 USE 關鍵字,Portage 將會知道您需要那方面的支援。當然,這也會啟用相關依賴的套件。

讓我們使用一個範例來講解:kde 的關鍵字。如果您的 Use 變數沒有這個,那所有選擇性 的 KDE 支援將 不會 把 KDE 的支援編進去。所有擁有 選擇性的 KDE 相依性套件將不會編入。如果您有將 kde 定義,那麼所有的這些套件將會以滿足相依性安裝。

請正確的定義您所需要的關鍵字。

有那些 USE 關鍵字?

USE 參數總共有分兩種:全區性(Global)區域性(Local)

  • 一個 全區性 的 USE 參數將被許多套件系統共用。這是一個大家所看到的 USE 參數。
  • 一個 區域性 的 USE 參數將被單一的套件用來選擇某些套件決定。

您可以到我們的 現在清單 查看完整的 USE 變數清單或是電腦上的 /usr/portage/profiles/use.desc。以下為一個簡短的列表:

原始碼 1: 簡短的可用 USE 參數

gtk     - Adds support for x11-libs/gtk+ (The GIMP Toolkit)
gtk2    - Use gtk+-2.0.0 over gtk+-1.2 in cases where a program supports both.
gtkhtml - Adds support for gnome-extra/gtkhtml
guile   - Adds support for dev-util/guile (interpreter for Scheme)
icc     - Use the Intel C++ Compiler if the package supports it
icc-pgo - Enable PGO data generation or use when use icc.
imap    - Adds support for IMAP

2.b. 使用 USE 參數

定義永久的 USE 參數

在我們希望您了解 USE 參數的重要性後,您現在需要定義您自己的 USE 參數了。

就如之前所提到的,所有的 USE 參數都是定義到 USE 的變數內。為了要方便使用者可以搜尋和選擇 USE 參數,我們已經提供了 預設的 USE 設定。這個設定包含著我們認為適合 Gentoo 使用者常用的。預設的變數是定義在 make.defaults 檔案。

你系統目前所使用的profile 是由 /etc/make.profile 的符號連結決定的。每一個 profile 屬於另一個更大的profile,最後形成了所有profile 的總和。最上層的 profile 是 base profile (/usr/portage/profiles/base)。

來看看預設的設定:

原始碼 2: 2004.3 profile 中 make.defaults 的加總 USE 變數

(這個範例是在 base,default-linux,default-linux/x86 和 default-linux/x86/2004.3 中設定的總和)
USE="x86 oss apm arts avi berkdb bitmap-fonts crypt cups encode fortran f77
  foomaticdb gdbm gif gpm gtk gtk2 imlib jpeg kde gnome libg++ libwww mad
  mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt
  quicktime readline sdl spell ssl svga tcpd truetype X xml2 xmms xv zlib"

就您所見,這個變數已經包含著許多關鍵字了。請 不要 更改 make.defaults 的檔案。所有的 USE 內的關鍵字將會在每次您更新 Portage 的時候自動被改回預設的方式!

要更改這個預設的設定,您需要在 USE 變數內做更改。您需要更改的是 /etc/make.conf 內的 USE 變數。在這個檔案的變數內,您可以增加您需要的關鍵字或是移除不需要的關鍵字。您可以使用在關鍵字前面加上減號 ("-")。

舉例來說,要移除掉 KDE 和 QT 但是要支援 ldap,您將需要在 /etc/make.conf 內定義類似以下的的變數:

原始碼 3: /etc/make.conf 的範例 USE 設定

USE="-kde -qt ldap"

設定套件自己使用的 USE 設定

有時候你想對一個(或一組)套件使用一個 USE 設定,但是不希望影響到整個系統。為了達成這個,需要先建立 /etc/portage 目錄(如果還沒建立的話),然後編輯 /etc/portage/package.use

例如說,你不想要整個系統都有 berkdb 支援,但是你想要 mysql 支援,你可以加入:

原始碼 4: /etc/portage/package.use 範例

 
dev-db/mysql berkdb 

你當然可以明確關閉某個程式的 USE 設定。例如說,你不想要 PHP 支援 java

原始碼 5: /etc/portage/package.use 第二個範例

 
dev-php/php -java 

定義暫時性的變數

有時候您會想要定義暫時性的變數。或許只使用那麼一次。這樣一來您就可以不用編輯 /etc/make.conf 兩次(先設定,編譯完再復原)您可以直接將 USE 定義成環境變數。記得,當你重新安裝或升級這個程式(不管是只升級他或是升級全系統),你的改變會遺失!

以下的範例,我們將暫時從 USE 設定移除 java 來安裝 mozilla。

原始碼 6: 使用 USE 為環境變數

# USE="-java" emerge mozilla

自動 USE 參數

某些套件安裝完成後,額外的 USE 參數如果你沒有明確關閉的話,會被自動啟動。要查看完整的提供 USE 參數的清單,查看 /etc/make.profile/use.defaults及他上層 profile 的 use.defaults

原始碼 7: 簡短版本的 /etc/make.profile/use.defaults

gnome           gnome-base/gnome
gtk             x11-libs/gtk+
qt              x11-libs/qt
kde             kde-base/kdebase
motif           x11-libs/openmotif

優先度

當然我們有著各個設定的優先度。您不會因為 java 因為較高的優先序而再使用而輸入 USE="-java"。USE 設定的優先度將按照以下的排列(從低到高):

  1. 放在 make.defaults 預設的 USE 設定
  2. use.defaults 承接的 USE 設定
  3. 使用者在 /etc/make.conf 定義的 USE 設定
  4. 使用者在 /etc/portage/package.use 定義的 USE 設定
  5. 以環境變數的方式定義的 USE 設定變數

要查看最後的 USE 設定,執行 emerge --info。這將會看到所有相關的變數(包括 USE 變數)和 Portage 需要使用到的內容。

原始碼 8: 執行 emerge --info

# emerge --info

讓您的系統適應新的 USE 旗標

如果您有更改您的 USE 旗標,並且想將整個系統都套用新的設定,使用 emerge--newuse 參數。

原始碼 9: 重新編譯您的系統

# emerge --update --deep --newuse world

接下來,執行 Portage 的 depclean 移除就系統上不需要的舊相依性套件。

警告: 執行 emerge --depclean 是一件非常危險的動作,請小心執行。請仔細確認列出來的套件沒有包含著您鎖需要的套件。以下的範例我們將加入 -p 的參數來顯示出將要被移除的列表清單。

原始碼 10: 移除不需要的套件

# emerge -p --depclean

當 depclean 完成後,執行 revdep-rebuild 重新編譯動態連結到已移除套件共享函式庫的套件。revdep-rebuildgentoolkit 套件的一部分;不要忘了先安裝他。

原始碼 11: 執行 revdep-rebuild

# revdep-rebuild

當這些都完成後,你的系統就正在使用新的 USE 設定了。

2.c. 套件相關 USE 設定

查看可用的 USE 設定

讓我們使用 mozilla 的範例:它聽取著什麼 USE 關鍵字?要查看,我們使用 emerge 加上 --pretend--verbose 參數:

原始碼 12: 查看 USE 關鍵字

# emerge --pretend --verbose mozilla
These are the packages that I would merge, in order:

Calculating dependencies ...done!
[ebuild  N    ] net-www/mozilla-1.5-r1 +java +crypt -ipv6 -gtk2 +ssl +ldap 
+gnome -debug +mozcalendar -mozaccess -mozxmlterm -moznoirc -moznomail
-moznocompose -moznoxft 

除了emerge 以外還有別的軟體可以完成類似查詢的工作。事實上,我們有一個特別的套件叫做 equery。這是包含在 gentoolkit 的套件內。首先,安裝 gentoolkit

原始碼 13: 安裝 gentoolkit

# emerge gentoolkit

現在執行 equery 然後使用參數查看某個套件的 USE 關鍵字。舉例來說 gnumeric 套件:

原始碼 14: 使用 equery 查看使用的 USE 關鍵字

# equery uses gnumeric
[ Colour Code : set unset ]
[ Legend      : (U) Col 1 - Current USE flags        ]
[             : (I) Col 2 - Installed With USE flags ]

 U I [ Found these USE variables in : app-office/gnumeric-1.2.0 ]
 - - libgda  : Adds GNU Data Access (CORBA wrapper) support for gnumeric
 - - gnomedb : unknown
 + + python  : Adds support/bindings for the Python language
 + + bonobo  : Adds support for gnome-base/bonobo (Gnome CORBA interfaces)

3. Portage 功能

3.a. Portage 功能

Portage 有一些而外的功能讓你的 Gentoo 使用經驗更加美好。這些功能中許多都是依賴特定軟體來加強效能,可靠性,安全...

你需要編輯 /etc/make.conf 包含各種功能關鍵字,以空白分隔的 FEATURES 變數來開啟或關閉特定 Portage 功能。在一些情況你也要安裝這個功能需要的額外套件。

不是所有 Portage 支援的功能都列在這篇文件?請查閱 make.conf 手冊頁來取得完整的列表。

原始碼 1: 查閱 make.conf 手冊頁

$ man make.conf

如果要找到預設啟動那些功能,執行 emerge --info 並在其中尋找 FEATURES 變數或用 grep:

原始碼 2: 找出那些功能已經設定了

$ emerge --info | grep FEATURES

3.b. 分散編譯

使用 distcc

distcc 是一個讓您可以在多台,不一定同一類型的電腦經由網路分別編譯。 distcc 客戶端傳送給伺服器(執行 distccd)必要的資訊讓它可以幫客戶端編譯原始碼的一部份。這會幫您加快編譯時間。

您可以在 Gentoo Distcc 文件中找到關於 distcc 更詳細的資訊(包括他如何在 Gentoo 上工作)。

安裝 distcc

Diskcc 提供一個圖形化的監視程式讓您監視您的電腦送出去的編譯工作。如果您使用 Gnome 的話,在 USE 設定中加入 'gnome'。然而,如果您不是使用 Gnome 但您想使用它的話,您應該在 USE 設定中加入 'gtk'。

原始碼 3: 安裝 distcc

# emerge distcc

啟動 Portage 的支援

/etc/make.conf 之中的 FEATURES 變數加入 distcc。然後依你的喜好編輯 MAKEOPTS 變數。一個常見的法則是填入 "-jX",這裡的 X 是執行 distccd 的總 CPU 數加一(包括目前的電腦),但是填入其他數字你可能會有較好的結果。

現在執行 distcc-config 然後輸入可使用的 distcc 伺服器。舉一個簡單的例子,我們假設可用的 DistCC 伺服器是 192.168.1.102(目前的電腦),192.168.1.103 和 192.168.1.104(兩台遠端電腦):

原始碼 4: 設定 distcc 使用三台可用的 distcc 伺服器

# distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"

當然,不要忘記啟動 distccd 伺服器程式:

原始碼 5: 啟動 distcc 伺服器程式

# rc-update add distccd default
# /etc/init.d/distccd start

3.c. 編譯快取

關於 ccache

ccache 是一個快速的編譯器快取。當您編譯程式時,他會立即快取結果,因此當您重新編譯時,編譯的時間減少相當多。在一般的狀況可以加快 5 到 10 倍的編譯時間。

如果您對 ccache 的詳細內容有興趣,請瀏覽 ccache 首頁

安裝 ccache

要安裝 ccache 的話,執行 emerge ccache

原始碼 6: 安裝 ccache

# emerge ccache

啟動 Portage 支援

開啟 /etc/make.conf 然後在 FEATURES 變數中加入 ccache。接著新增一個叫 CCACHE_SIZE 的變數並設成 "2G":

原始碼 7: 編輯 /etc/make.conf 中的 CCACHE_SIZE

CCACHE_SIZE="2G"

要檢查 ccache 是否在工作,您可以要求 ccache 提供你他的狀態。因為 Portage 使用不同的 ccache 家目錄,你也要設定 CCACHE_DIR 變數。

原始碼 8: 查看 ccache 狀態

# CCACHE_DIR="/var/tmp/ccache" ccache -s

Portage 預設的家目錄是 /var/tmp/ccache。如果你想要改變到別的目錄,你可以設定 /etc/make.conf 之中的 CCACHE_DIR 變數。

然而,如果你執行 ccache,他預設會用 ${HOME}/.ccache,因此你需要設定 CCACHE_DIR 變數,來取得 Portage 的 ccache 統計。

在非 Portage 的 C 程式編譯時使用 ccache

如果你想要在非 Portage 的 C 程式編譯時使用 ccache,在你的 PATH 變數中加入 /usr/lib/ccache/bin(在 /usr/bin 之前)。這可以藉由編輯 /etc/env.d/00basic 來完成,這是第一個定義 PATH 變數的檔案:

原始碼 9: 編輯 /etc/env.d/00basic

 
PATH="/usr/lib/ccache/bin:/opt/bin"

3.d. 已編譯程式套件支援

建立預編程式套件

Portage 支援安裝預先編譯好的套件。雖然 Gentoo 本身不提供預編的套件(除了 GRP 以外),Portage 可以完全明白預編套件。

如果套件已經安裝好的話,你可以使用 quickpkg 來建立預編套件,否則使用 emerge 指令加上 --buildpkg--buildpkgonly 參數。

如果你想要 Portage 把每一個你安裝的套件都建立預編套件,在 FEATURES 變數中加入 buildpkg

可以從 catalyst 得到建立預編套件更多的支援。請閱讀 Catalyst 參考手冊Catalyst Howto 取得更多資訊。

安裝預編套件

雖然 Gentoo 並不提供,你可以建立一個檔案庫來存放預編套件。如果你想要使用這個檔案庫,你需要設定 PORTAGE_BINHOST 變數讓 Portage 知道他。例如說,如果預編套件在 ftp://buildhost/gentoo :

原始碼 10: 設定 /etc/make.conf 中的 PORTAGE_BINHOST

PORTAGE_BINHOST="ftp://buildhost/gentoo"

當你想要安裝預編套件時,在 emerge 指令的 --usepkg 參數旁加上 --getbinpkg。前面的參數要求 emerge 在下載及編譯原始碼前先嘗試安裝預編套件,而後者告訴 emerge 從先前定義的伺服器下載預編套件。

例如說,用預編套件安裝 gnumeric

原始碼 11: 安裝 gnumeric 預編套件

# emerge --usepkg --getbinpkg gnumeric

關於 emerge 的預編套件選項可以在 emerge 手冊頁找到:

原始碼 12: 閱讀 emerge 手冊頁

$ man emerge

4. 起始程序(Initscripts)

4.a. 執行階段(Runlevels)

啟用您的系統

當您開啟您的系統,您將會看到很多文字跳過。如果您注意一點,您將會發現那些文字都是一樣的。這些動作叫做固定式的 開機序列

首先,您的開機程式將會載入您所定義到設定檔內的核心映像檔,並且將他放到記憶體內。這是為了要告訴 CPU 該執行核心。當核心載入完畢開始執行後,它將會起始核心相關的架構和程序然後開始 init 的程序。

這個步驟是為了確保所有的檔案系統(被定義在 /etc/fstab)有被載入並且可以使用。然後將執行一些放在 /etc/init.d 的給個程序,將啟用所有您打算開啟的服務。

最後,當所有的程序都執行後,init 將會啟用終端(在大多的例子裡,只是幾個藏在 Alt-F1 下的虛擬終端,Alt-F2,等等。)包含著一個特別的程序叫做 agetty。然後這個程序將會使用 login 讓您可以登入到這些終端內。

Init 程序

現在 init 不只是執行 /etc/init.d 裡面的程序。更多的是,他還會依照 /etc/runlevels 來選擇要執行的程序。

首先,init 將執行所有 /etc/runlevels/boot 內的連接,這些連接將會連到 /etc/init.d 裡面的程序。大部份來說,這些將會按照字母排列分別起始,但是有些會因為相依性的關係而先執行其他的程序。

/etc/runlevels/boot 內的程序都被執行後,init 將繼續執行 /etc/runlevels/default 內的連接。在一次,這些將會按照字母排列分別起始,但是有些會因為相依性的關係而先執行其他的程序。

Init 是如何執行的

當然 init 不能自己決定所有的選擇。他需要一個設定檔來告訴要有那些動作。這個設定檔為 /etc/inittab

如果您記得剛剛解釋過的開機序列,您將會記得 init 的第一個動作就是掛載所有的檔案系統。這將會按照以下的方式定義在 /etc/inittab

原始碼 1: /etc/inittab 的系統起始

si::sysinit:/sbin/rc sysinit

這行將告訴 init 一定要執行 /sbin/rc sysinit來起始系統。 /sbin/rc 的程序將掌管起始的動作,您也可以說 init 的工作其實不多 -- 它只是指派起始系統的工作給另外一個程序。

第二,init 將執行 /etc/runlevels/boot 內所有的連接。將按照以下定義:

原始碼 2: 繼續系統起始

rc::bootwait:/sbin/rc boot

rc 程序再一次的執行相關工作。但是這是是 rcboot)將會去執行 /etc/runlevels 的相關目錄。

現在 init 將檢察他的設定檔然後查看他應該執行那個階段。要決定這個,它將會從 /etc/inittab 取以下這行:

原始碼 3: init預設(initdefault)

id:3:initdefault:

在這個例子(大多數的 Gentoo 使用者也會使用),將會從第三個執行階段開始。使用這個資訊,init 將會從 執行階段 3 開始:

原始碼 4: 定義執行階段

l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot

這行將定義第三階段,然後執行 rc 程序來選擇要啟用的服務(現在則是更改為 default)。這個 rc 後面的參數將會合 /etc/runlevels 內的子目錄一樣。

rc 完成的時候,init 將會決定應該要啟用那些虛擬終端和在各終端應該執行什麼指令:

原始碼 5: 虛擬終端定義

c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux

什麼是執行階段(runlevel)?

您已經知道了 init 如何使用號碼來決定該啟用那個執行階段。一個 執行階段 將會代表著您的系統將執行那些程序(執行階段程序或是 起始程序(initscripts))

在 Gentoo 內共有定義七個執行階段:三個內部執行階段,和四個使用者定義的執行階段。內部的執行階段叫做 sysinitshoutdownreboot 就和他們的名字一樣:

使用者定義的執行階段包含著 /etc/runlevels 的自目錄: bootdefaultnonetworksingleboot 的執行階段將起始包含其他所有系統相關的服務。剩下的三個執行階段則是依照不同的服務而類別:default 適用於日常運作所需,nonetwork 適用於沒有網路連線的需求,和 single 則是在您需要整理系統時所用。

使用 Init Scripts

rc 的程序叫做 init scripts。每個在 /etc/init.d 的程序都可以使用 startstoprestartpausezapstatusineediuseneedsmeusesme 或是 broken 為參數。

要開始,停止,或是重新啟動一個服務(和所有相依的服務),您應該使用 startstoprestart

原始碼 6: 啟用 Postfix

# /etc/init.d/postfix start

注意: 只有 指定 的服務會被停止或是重開。其他相依的程式(那些使用這個服務但是不需要他的)將不會被影響到。

如果您要停止一個服務,但是不是依賴著它的其他服務,您可以使用 pause

原始碼 7: 停止 Postfix 但是繼續執行其他相依的服務

# /etc/init.d/postfix pause

如果您要查看某個服務的狀態(啟用,停止,暫停﹍)您可以使用 status

原始碼 8: 關於 postfix 的狀態

# /etc/init.d/postfix status

如果狀態告訴您這個服務正在執行,但是您知道這是錯的,那您將可以使用 zap 將狀態重設為 "停止":

原始碼 9: 重設 postfix 的狀態

# /etc/init.d/postfix zap

如果要查看某個服務的相依性有那些,您可以使用 iuse 或是 ineed。您可以使用 ineed 來觀看服務的相關功能。iuse 則是查看服務是否有被其他服務依賴著。

原始碼 10: 查詢 Postfix 依賴的服務

# /etc/init.d/postfix ineed

類似的,您可以查詢那些服務需要那些服務(needsme)或是(usesme):

原始碼 11: 需要用到 Postfix 的服務

# /etc/init.d/postfix needsme

最後您可以查看依賴著某個服務但是壞損的其他服務:

原始碼 12: 查詢 Postifx 需要但是損毀的相依性

# /etc/init.d/postfix broken

4.b. 使用 rc-update

什麼是 rc-update?

Gentoo 的 init 系統使用的是相依性列表來決定那個服務需要先啟用。這是一個複雜的工作,所以我們不會讓我們的使用者手動完成這項工作。所以我們建立了相關的執行階段工具和 init 工具方便管理。

使用 rc-update,您可以從執行階段新增或是移除 init 程序。rc-update 的工具將自動讓 depscan.sh 程序重新建立相依性資料。

新增或是移除服務

您已經在安裝 Gentoo 時將 init 程序加入過 "default" 的執行階段了。當時您應該對 "default" 沒有任何了解,但是您現在應該知道了它的意義。rc-update 程序需要第二個參數來告訴它要執行的動作:adddel 或是 show

要增加或是移除一個 init 程序,只需要在 rc-update 後面放入 add 或是 del 的參數,然後接著就是要加入的 init 程序的名字。舉例來說:

原始碼 13: 執行階段移除 Postfix

# rc-update del postfix default

rc-update show 的指令將會0按照執行順序顯示出所有可能的 init 程序清單:

原始碼 14: 顯示 init 程序資料

# rc-update show

4.c. 設定服務

為什麼需要多餘的設定?

Init 程序可以是很複雜的。所以直接編輯 init 程序會讓使用者感到困難。但是要可以正確的設定這些服務是極為重要的。舉例來說,您或許會想在啟動服務時加入某個參數。

第二個原因是為了要讓 init 程序可以更新原始設定檔以外的設定,而不會直接改到重要的設定檔。

/etc/conf.d 目錄

Gentoo 提供一個簡單的方法設定相關服務:每個 init 程序都有一個可以設定的設定檔放在 /etc/conf.d舉例來說, apache2 的 init 程序(叫做 /etc/init.d/apache2)的設定檔會放在 /etc/conf.d/apache2,這樣可以在啟動 Apache 2 伺服器時加數您需要的參數:

原始碼 15: /etc/conf.d/apache2 的變數定義

APACHE2_OPTS="-D PHP4"

這種設定檔包含的變數(就和 /etc/make.conf 類似),是為了要讓服務的設定更加簡易。它也以註解的方式提供著一些相關的資料和變數用法。

4.d. 編寫 Init 程序

我需要嗎?

不。Gentoo 提供了這些 init 程序,所以您不需要自己編寫一個。但是,如果您安裝了非 Portage 提供的服務,那麼您就需要編寫一個類似 init 的程序。

如果不是針對 Gentoo 所設計的程序,請不要使用:Gentoo 的 init 程序和其他版本的 init 程序不相容!

規劃

以下為一個 init 程序的規劃。

原始碼 16: Basic layout of an init script

#!/sbin/runscript

depend() {
  (相依性資訊)
}

start() {
  (啟動服務的相關指令)
}

stop() {
  (停止服務的相關指令)
}

restart() {
  (重新啟動服務的相關指令)
}

任何 init 程序 都需要 start() 功能的定義。其他的則是非必需。

相依性

您總共有兩種相依性可以定義:useneed。就如我們之前提到的, need 的相依性比 use 來的嚴厲。然後使用 virtual 來選擇所依賴的相依性。

virtual 是一個提供服務的相依性,但是並不是完全由這個服務提供。您的 init 程序可以依賴著系統記錄器,但是我們提供著許多系統記錄器(metalogd,syslog-ng, sysklogd,﹍)當您無法 need 所有的(執行全部的系統記錄器並不合理)我們將確定這些服務可以 提供 一個虛擬相依性。

現在讓我們來看看一個 postfix 服務所依賴的相依性。

原始碼 17: Postfix 的相依性

depend() {
  need net
  use logger dns
  provide mta
}

如擬可見,postfix:

  • 需要所有的(虛擬)net 相依性 (是由 /etc/init.d/net.eth0 所提供)
  • 需要使用(虛擬) logger 相依性(是由 /etc/init.d/syslog-ng 提供)
  • 需要使用(虛擬) dns 相依性(事由 /etc/init.d/named 提供)
  • 提供(虛擬) mta 相依性(常用的郵件伺服器所需)

控制順序

在某些情況下您不需要一個服務,如果在系統可以提供的環境下(沒有相依的問題),但是您想要在這個服務之前 befre(開始) (或是 after(之後) 使用另外一個服務 然後 放到同一個執行階段(只有同執行階段的服務)。您可以使用 before 或是 after 設定來完成這些設定。

我們將查看 Portmap 的設定為範例:

原始碼 18: Portmap 服務的 depend() 功能

depend() {
  need net
  before inetd
  before xinetd
}

您也可以使用 "*" 來選擇同一個執行階段內所有的服務,但是我們並不建議。

原始碼 19: 設定成為第一個同執行階段的 init 程序

depend() {
  before *
}

符合標準的功能

depend() 之後,您將需要定義 start() 的功能。這個將包含著所有相關啟動服務的指令。我們建議您使用 ebegineend 功能來通知使用者正在發生什麼事:

原始碼 20: start() 功能範例

start() {
  ebegin "Starting my_service"
  start-stop-daemon --start --quiet --exec /path/to/my_service
  eend $?
}

如果您需要更多的 start() 功能的範例,請查看您系統中放在 /etc/init.d 目錄裡面的 init 程序。關於 start-stop-daemon,我們有提供著一個很棒的說明頁讓您查閱:

原始碼 21: 查詢更多關於start-stop-daemon 的說明頁

# man start-stop-daemon

其他您可以定義的功能為:stop()restart()。您不一定要定義這些功能!如果您使用 start-stop-daemon,我們 init 系統將會自動填入這些功能。

Gentoo 的 init script 語法是以 Bourne Again Shell (bash) 為基礎,所以你可以在你的 init script 中自由使用和 bash 相容的架構。

加入自訂選項

如果您想要讓您的 init 程序支援更多我們已經提供的選項,您應該將這些選項加入到 opts 變數,然後建立一個功能將此功能的命名為 opt 變數內所定義的。舉例來說,要提供一個 restartdely 的功能:

原始碼 22: 提供 restartdely 選項

opts="${opts} restartdelay"

restartdelay() {
  stop
  sleep 3    # 等待三秒才開始
  start
}

系統設定變數

您不需要任何動作來提供一個 /etc/conf.d 的設定檔:如果您的 init 程序執行了,以下將會自動的載入(例:可用的變數):

  • /etc/conf.d/<您的 init 程序>
  • /etc/conf.d/basic
  • /etc/rc.conf

另外,如果您的 init 程序需要一個虛擬的相依性(如 net),那麼相關的檔案將會也會被載入(如 /etc/conf.d/net)。

4.e. 更改執行階段(RunLevel)的態度

誰會受益?

很多使用手提電腦的使用者將會明白這個狀況:在家裡您需要啟動 net.eth0,在外面因為沒有網路,所以您不想啟動 net.eth0。因此您可以依照您的需求而改變 Gentoo 的執行階段。

舉例來說,您可以建立第二個 "default" 執行階段來讓您執行其他的起始程序(Init Scripts)。然後在開機時選擇使用預設的執行階段。

使用 softlevel

首先,建立第二個 "default" 執行階段。我們將建立 offline 執行階段為這次的範例:

原始碼 23: 建立一個執行階段目錄

# mkdir /etc/runlevels/offline

然後加入相關的起始程序到剛建立完成的目錄內。舉例來說,如果除了 net.eth0 以外,您想要將其他 default 執行階段的內容都複製到新的執行階段:

原始碼 24: 加入相關起始程序

(把所有預設執行階段的服務複製到 offline 執行階段)
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
(將不需要的服務從 offline 執行階段移除)
# rc-update del net.eth0 offline
(顯示 offline 執行階段啟動的服務)
# rc-update show offline
(部分的輸出)
acpid | offline 
domainname | offline 
local | offline 
net.eth0 | 														   

現在編輯您的開機程式設定檔然後加入一個新的 offline 執行階段。舉例來說,在 /boot/grub/grub.conf

原始碼 25: 加入 offline 執行階段

title Gentoo Linux Offline Usage
  root (hd0,0)
  kernel hd(0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline

噹啷!完成了。當您重新啟動系統然後選擇剛加入的選項, offline 將會被執行而不是本來的 default

使用 bootlevel

使用 bootlevelsoftlevel 的方法完全類似。唯一不一樣的就是您需要定義另外一個 "boot" 執行階段而不是第二個 "default" 執行階段。

5. 環境變數

5.a. 系統變數?

這是什麼

系統變數是一個有名稱的物件,包含一個或多個程式要用的資訊。許多使用者(特別是 Linux 新手)覺得這有一些古怪而且難以管理。這想法有一些錯誤:使用者可以用系統變數輕鬆的改變一個或多個程式設定。

重要的範例

下面的表格顯示許多 Linux 使用的變數以及它們的用途。範例在表格後面展示。

變數說明
PATH這個變數包含用冒號分隔的目錄列表,讓系統尋找可執行檔。如果您輸入一個可執行檔 (例如 lsrc-updateemerge)但是這個檔案不在列表中的 目錄,您的系統不會執行它(除非您輸入完整的路徑,如 /bin/ls)。
ROOTPATH這個變數和 PATH 有相同功能,但是這裡面包含的目錄是根使用者數入指令時 才會尋找。
LDPATH這個變數包含以冒號分隔的目錄列表,讓動態連結檔在裡面搜尋函式庫。
MANPATH這個變數包含以冒號分隔的目錄列表,讓 man 指令搜尋手冊頁。
INFODIR這個變數包含以冒號分隔的目錄列表,讓 info 搜尋資訊頁。
PAGER這個變數包含顯示檔案內容的程式路徑(例如 lessmore)。
EDITOR這個變數包含編輯的程式路徑(例如 nanovi)。
KDEDIRS這個變數包含以冒號分隔的目錄列表,設定 KDE 的主要路徑。
CLASSPATH這個變數包含以冒號分隔的目錄列表,設定 Java 程式的路徑。
CONFIG_PROTECT這個變數包含以空白分隔的目錄列表,這些目錄在 Portage 更新時需要被保護。
CONFIG_PROTECT_MASK這個變數包含以空白分隔的目錄列表,這些目錄更新 Portage 時不要被保護。

底下是所有的變數的設定範例:

原始碼 1: Example definitions

PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:."
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf /
                /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ /
                /usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf

5.b. 定義全域變數

/etc/env.d 目錄

為了要集中管理這些變數的設定,Gentoo 使用 /etc/env.d 目錄。在目錄中您會發現許多檔案,例如 00basic05gcc 等。這裡面包含檔案名稱中所提到的程式需要用的變數。

例如,當您安裝 gcc 後,ebulid 會建立一個叫做 05gcc 的檔案,包含下面的變數設定:

原始碼 2: /etc/env.d/05gcc

PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
CC="gcc"
CXX="g++"
LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"

其他的 Linux 套件會告訴您在 /etc/profile 或其他地方新增這些變數。 Gentoo 則讓您很容易(對 Portage 也是)去管理這些變數而不用注意其他設定系統變數的檔案。

舉例來說,當 gcc 更新了之後,/etc/env.d/05gcc 也會同時被更新而使用者不必做任何事。

這不僅對 Portage 有好處,對使用者也是。您或許偶爾會被要求設定一些系統變數。拿 http_proxy 做例子。您不用弄亂 /etc/profile,只要建立一個檔案( /etc/env.d/99local )然後在裡面輸入設定:

原始碼 3: /etc/env.d/99local

http_proxy="proxy.server.com:8080"

藉著將您自己的變數設定放到這個檔案中,您可以很快找到哪些變數是您自己設定的。

env-update 指令稿

/etc/env.d 中的數個檔案同時定義了 PATH 變數。這並沒有錯:當您執行 env-update,他會把數個設定同時加到系統設定中,因此讓軟體套件(或使用者)加入他們自己的設定而不會干擾已經存在的設定。

env-update 指令稿將會以 /etc/env.d 中的檔案名稱以字母順序依序加入系統設定中。檔案名稱開頭必需要是兩位數的數字。

原始碼 4: env-update 的新增順序

         00basic        99kde-env       99local
     +-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"

變數的連結不一定會發生,只有這些變數有:KDEDIRSPATHCLASSPATHLDPATHMANPATHINFODIRINFOPATHROOTPATHCONFIG_PROTECTCONFIG_PROTECT_MASKPRELINK_PATHPRELINK_PATH_MASK。其他的變數使用最後定義的值 (依 /etc/env.d 中檔案的字典順序)。

當您執行 env-update,他會建立所有的系統變數然後寫入 /etc/profile.env 中(這檔案被 /etc/profile 使用)。他也會從 LDPATH 讀取資訊然後建立 /etc/ld.so.conf,之後,他會執行 ldconfig 重新建立動態連結使用的 /etc/ld.so.cache 檔案。

如果您希望 env-update 在您執行它後立刻作用,執行下面的指令來更新。自行安裝 Gentoo 的使用者可能會記得安裝過程中執行過:

原始碼 5: 更新環境變數

# env-update && source /etc/profile

注意: 上面的指令只更新你目前終端機,啟動 consoles,以其他的孩子的環境變數。因此,如果你在 X11,你需要在你每一個新開啟的終端機輸入 source /etc/profile,或是重新啟動 X,讓所有終端機使用新的環境變數。如果你使用圖形化的登入管理員,你需要先變成 root,然後輸入 /etc/init.d/xdm restart。如果不是的話,你要先離開再進入 X,讓所有他生成的孩子都使用新的變數。

5.c. 定義局部變數

使用者自行設定

您或許不想要定義全域變數。例如您可能要加入 /home/my_user/bin 以及目前的工作目錄(你所在的目錄)到 PATH 變數中,但是您不想要其他使用者在他們的 PATH 也有這個設定。如果您想要定義區域變數,您可以加到 ~/.bashrc~/.bash_profile

原始碼 6: 在 ~/.bashrc 中額外增加局部 PATH 設定

(冒號後面什麼都不加代表目前的工作目錄)
PATH="${PATH}:/home/my_user/bin:"

當您重新登入後,您的 PATH 變數就會更新了。

有期限的設定

有的時候需要更嚴格的定義。例如您可能需要從您剛剛建立的暫時目錄執行程式,但您不想輸入完整的路徑或是編輯 ~/.bashrc 只為了在這一小段時間使用。

在這種情況下,您只要使用 export 指令設定 PATH 變數。只要您不登出, PATH 將會使用目前暫時的設定。

原始碼 7: 設定有期限的變數

# export PATH="${PATH}:/home/my_user/tmp/usr/bin"

C. 使用Portage

1. 檔案和資料夾

1.a. Portage 檔案

設定指令

Portage 含有一個預設的設定檔,放在 /etc/make.globals。當你打開來看,你將注意到所有的 Portage 設定配置是以變數的形式處理。後面將會敘述哪些變數 Portage 會聽從,還有他們各代表什麼意思。

因為許多設定指令在不同的電腦架構之間並不相同,在你的 profile 中,Portage 也有一個預設的設定檔案:make.defaults。關於 profiles 和 /etc/make.profile 資料夾,待會我們將解釋更多。

如果你打算變更設定變數,不要修改 /etc/make.globalsmake.defaults。請使用優先權較上面檔案高的 /etc/make.conf。你會發現有個 /etc/make.conf.example。正如他名字,這不過是個樣本 - Portage 並不會讀取這個檔案。

你也可以用環境變數來定義 Portage 設定變數,但是我們並不建議這麼做。

Profile 特定資訊

我們與 /etc/make.profile 資料夾已有過邂逅。但這並不是一個真正的資料夾,只是一個連到 /usr/portage/profiles 其中之一的符號連結。你也可以在別的地方建立你自己的 profiles 然後指向他。該符號連結所指向的 profile,將是你的系統所依賴的。

一個 profile 包含著給 Portage 的特定電腦架構資訊,像是一個與該 profile 相符合系統的套件列表,一個不運作(或被 mask 掉)、給該 profile 用的套件列表等等。

使用者專用設定

當你想要推翻 Portage 中,與軟體安裝有關的特性,你可以開始編輯 /etc/portage 之中的檔案。強烈建議您使用 /etc/portage 中的檔案,千萬不要 以環境變數覆蓋該特性。

你可以建立以下檔案在 /etc/portage 之中:

  • package.mask 列出你不想讓 Portage 安裝的套件。
  • package.unmask 列出你想讓 Portage 能夠安裝的套件,即使 Gentoo 開發 者強烈建議你不要 emerge 他們。
  • package.keywords 列出你想讓 Portage 能夠安裝的套件,即使該套件(還) 沒有被認為適合你的系統或電腦架構。
  • package.use 列出你想給特定套件使用的 USE 旗標,而不必讓整個系統使 用該 USE 旗標。

可以在 Portage man page 找到更多關於 /etc/portage 資料夾的資訊,和可建立的檔案的完整列表。

原始碼 1: 閱讀 Portage man page

$ man portage

改變 Portage 檔案 & 資料夾路徑

之前提到的設定檔並不能存在別的地方 - Portage 總是會到這些地方找這些設定檔。然而因為各種目的:建立資料夾、存放原始碼、Portage 樹狀目錄路徑等等,Portage 還有許多其他的路徑設定。

這些目的都有個眾所皆知的預設存放路徑,但可以透過編輯/etc/make.conf 來改成你自己的品味。這章剩下的部分將解釋哪些特定目的路定 Portage 會去使用,以及如何在你的檔案系統中變更他們。

然而這份文件並不想被當做參考資料來使用。如果你需要百分之百範圍的解說,請查閱 Portage 和 make.conf 的 man page:

原始碼 2: 閱讀 Portage 和 make.conf 的 man pages

$ man portage
$ man make.conf

1.b. 檔案儲存

Portage 樹狀目錄

Portage 樹狀目錄預設路徑是 /usr/portage。這是由 PORTDIR 變數所定義。當你把 Portage 樹狀目錄存在別的地方(透過變更此變數),不要忘記跟著改變 /etc/make.profile 符號連結。

如果你修改了 PORTDIR 變數,你可能也想改變下列的變數,因為他們不會注意到 PORTDIR 改變。這是由於 Portage 處理變數的方式:PKGDIR、DISTDIR、RPMDIR。

預先編譯好的二進位檔

即使 Portage 預設不使用預先編譯好的二進位檔,但 Portage 對他們有廣泛的支援。當你要求 Portage 以預先編譯好套件工作時,他將到 /usr/portage/packages 尋找他們。這個路徑由 PKGDIR 變數定義。

原始碼

應用程式原始碼預設儲存在 /usr/portage/distfiles。這個路徑由 DISTDIR 變數定義。

RPM 檔案

即使 Portage 不能使用 RPM 檔案,但可以使用 ebuild 指令產生他們。(請看 Ebuild 程式)。 Portage 預設存放 RPM 檔案的地方在 /usr/portage/rpm ,他是以 RPMDIR 變數來定義。

Portage 資料庫

Portage 在 /var/db/pkg 中儲存系統的狀態(那些套件已經安裝,什麼檔案屬於什麼套件,...)。不要手動修改裏面的檔案!這可能會破壞 Portage 對系統的了解。

Portage 快取

Portage 的快取(包括修改時間,virtuals,相依資訊,...) 是儲存在 /var/cache/edb。這個位置只是快取而已:如果你當時並沒有在執行任何和 Portage 有關的程式,你可以把他清除。

1.c. 編譯軟體

Portage 暫存檔案

Portage 的暫存檔案預設上放在 /var/tmp。這定義於 PORTAGE_TMPDIR 變數。

如果你改變了 PORTAGE_TMPDIR 變數,你可能也想改變下列的變數,因為他們不會注意到 PORTAGE_TMPDIR 改變。這是由於 Portage 處理變數的方式:BUILD_PREFIX。

編譯資料夾

Portage 在 /var/tmp/portage 裡面建立專用的編譯資料夾,讓各個套件在裡面 emerge。這個路徑由 BUILD_PREFIX 變數定義。

Live 檔案系統路徑

預設上,Portage 安裝所有檔案到當前的檔案系統 (/),但你可以設定 ROOT 環境變數來改變他。當你想要建立一個新的編譯鏡像,這是很有用的。

1.d. 日誌特性

Ebuild 日誌

Portage 可以建立各個 ebuild 的日誌,但只有當 PORT_LOGDIR 變數已設置到一個 Portage 可寫入的路徑(portage 使用者)。預設上,這個變數並無設定。

2. 經由變數來設定

2.a. Portage 設定

如前所述,我們可以透過許多變數來調整 Portage 的行為,這些變數定義在 /etc/make.conf。請參考 make.conf 的 man page,裡面有更詳細而完整的資訊。

原始碼 1: 參考 make.conf 的 man page

$ man make.conf

2.b. 編譯相關的選項

設定和編譯器的選項

當 Portage 編譯程式時,它會將下列變數的數值傳給編譯器和 configure script:

  • CFLAGS 和 CXXFLAGS 設定編譯器編譯 C 和 C++ 程式所使用的 flags。
  • CHOST 設定程式的 configure script 所需要的主機資訊。
  • MAKEOPTS 會傳給 make 指令,通常用來設定編譯時平行處理的程度。更多關於 make 的參數可以在 make 的 man page 中找到。

USE 這個變數也會在 configure 和編譯階段用到,但我們已經在前面的章節講述的非常清楚了。

Merge 選項

Portage 在安裝(merge)某個軟體的新版本之後,會將舊版本相關的檔案從您的系統中移除。在進行這個動作之前,Portage 會給使用者 5 秒鐘的緩衝時間,這個數值是由變數 CLEAN_DELAY 來設定。

2.c. 設定檔的防護

Portage 保護的目錄位置

Portage 會將軟體新版本提供的檔案覆寫到系統上,唯一的例外是存放在protected 位置的檔案。這些受保護的位置定義在 CONFIG_PROTECT 變數下,通常是設定檔的目錄位置。要設定多個目錄位置時,在目錄間用空白(space)分開。

當一個需要被寫入系統的檔案存放在受保護的位置時,Portage 會用別的檔名將檔案寫入系統,然後告知使用者該設定檔新版本的存在。

您可以利用 emerge --info 取得目前 CONFIG_PROTECT 的設定:

原始碼 2: 獲得 CONFIG_PROTECT 的設定

$ emerge --info | grep 'CONFIG_PROTECT='

更多關於 Portage 設定檔防護的資訊可以從 emerge 獲得:

原始碼 3: 得到更多關於設定檔防護的資訊

$ emerge --help config

排除特定目錄

您可以使用 CONFIG_PROTECT_MASK 變數來 '不保護' 受保護位置下的特定子目錄。

2.d. 下載選項

Server 位置

當您的系統上沒有所需要的資訊或是資料時,Portage 會從網路上抓取,而取得這些資訊和資料的 server 位置定義在下列變數內:

  • GENTOO_MIRRORS 設定存放有原始碼(distfiles)的 server 位置。
  • PORTAGE_BINHOST 設定可提供您系統預先編譯套件(prebuilt packages)的 server 位置。

第三個設定是用來更新 Portage tree 的 rsync server 位置:

  • SYNC 設定 Portage 用來取得 Portage tree 的 server。

GENTOO_MIRRORS 和 SYNC 變數可以用 mirrorselect 程式來自動設定。您需要先 emerge mirrorselect。請參考 mirrorselect 的線上輔助來獲知更多資訊:

原始碼 4: 更多關於 mirrorselect 的資訊

# mirrorselect --help

如果您的環境需要您使用 proxy server,您可以用 HTTP_PROXY、FTP_PROXY 和 RSYNC_PROXY 這些變數來指定 proxy server。

抓取指令

當 Portage 需要抓取原始碼時,預設是使用 wget,您可以用 FETCHCOMMAND 變數來更改。

Portage 能夠繼續部份下載的原始碼,而不用重新抓取。預設用來執行這項工作的程式是 wget,但是您可以用 RESUMECOMMAND 變數來改變。

請確認您的 FETCHCOMMAND 和 RESUMECOMMAND 將原始碼存到正確的位置。在這些變數內,您應該分別用 /${URI} 和 /${DISTDIR} 來指到原始碼和 distfiles 的存放位置。

您也可以針對不同的傳輸協定,設定所使用的指令,相關的變數有 FETCHCOMMAND_HTTP、FETCHCOMMAND_FTP、RESUMECOMMAND_HTTP、RESUMECOMMAND_FTP 等等。

Rsync 設定

您無法更動 Portage 用來更新 Portage tree 所使用的 rsync 指令,但是您可以設定一些與 rsync 指令相關的變數:

  • RSYNC_EXCLUDEFROM 指到一個檔案,檔案內列舉 rsync 在更新過程中應該略過的套件和類別。
  • RSYNC_RETRIES 設定 rsync 嘗試連到 mirror 的次數,mirror 由 SYNC 變數指定。預設值是 3。
  • RSYNC_TIMEOUT 設定 rsync 連線因為閒置而被視為 timed-out 的時間(單位為秒)。這個變數預設值是 180,但是使用撥接的使用者可以設成 300 或更長。

2.e. Gentoo 設定

Branch 選擇

您可以用 ACCEPT_KEYWORDS 變數改變預選支系(default branch),預設值是您的系統架構下的 stable branch。更多關於 Gentoo branches 的資訊會在下一章說明。

Portage Features

您可以用 FEATURES 變數來啟用某個 Portage feature。Portage Features 在前面的章節,如 Portage Features,已經討論過。

2.f. Portage 行為

資源管理

透過 PORTAGE_NICENESS 變數,您可以增加或降低 Portage 執行時的 nice 值。PORTAGE_NICENESS 所設定的數值會被 加到 到目前的 nice 值上。

更多關於 nice 值的資訊,請參考 nice 的 man page:

原始碼 5: 更多關於 nice 的資訊

$ man nice

輸出行為

NOCOLOR,預設為 "false",設定 Portage 是否該取消彩色輸出。

3. 混用不同分支的軟體

3.a. 選擇一個分支

穩定分支

變數 ACCEPT_KEYWORDS 定義您的系統使用的軟體分支,預設是軟體在您系統架構下的穩定分支,例如 x86

我們建議您只使用穩定分支(the stable branch)。但是,如果您不是很在意穩定性的問題,而且您願意幫助 Gentoo 偵測臭蟲,回報給 http://bugs.gentoo.org,請您繼續閱讀這份文件。

測試分支

如果您想要使用最新的軟體,您可以考慮選用測試分支(the testing branch)。要讓 Portage 使用測試分支,在您的系統架構前加上 ~。

測試分支就如同他所說的 - 測試。如果一個套件在測試中,這代表發展者覺得他可以運作,但是還沒有詳細的測試。你可以成為第一個發現錯誤的人,在這種狀況你可以回報錯誤讓發展者知道

要小心的是,你可能會捧到一些不穩定的問題,不完美的套件管理(例如錯誤/遺失相依性) ,過於頻繁的更新(導致要花很多時間編譯)或毀損的套件。如過你不清楚 Gentoo 如何運作及如何去修復,我們建議你停留在穩定而且測試過的分枝。

舉例來說,要選擇 x86 架構下的測試分支,編輯 /etc/make.conf,並做如下設定:

原始碼 1: 設定 ACCEPT_KEYWORDS 變數

ACCEPT_KEYWORDS="~x86"

如果您現在要更新您的系統了,您會發現 一大堆 套件都需要升級。必須提醒您的是:當您用測試分支更新完您的系統之後,沒有辦法可以輕易地將系統改回使用官方建議的穩定分支(當然,使用備份例外)。

3.b. 混合使用穩定和測試分支

檔案 package.keywords

您可以要求 Portage 針對特定的套件使用測試分支,而系統其他所有的套件仍使用穩定分支。如果您想要這樣的功能,將您希望使用測試分支的套件類別和名稱加到檔案 /etc/portage/package.keywords 裡面。例如,要使用 gnumeric 的測試分支:

原始碼 2: /etc/portage/package.keywords 內 gnumeric 的設定,完整版

app-office/gnumeric ~x86

測試特定版本

如果您想要使用軟體在測試分支內某個特定的版本,但是您不希望 Portage 在後續的軟體更新上繼續使用測試分支,您可以在檔案 package.keywords 內加入版本資訊。在這種情況下,您 一定要 使用 = 運算子,您也可以使用 <=, <, > 或是 >= 運算子,鍵入一個版本範圍。

在任何情況下,如果您要加入版本資訊,您 一定要 使用運算子。如果您不想加入版本資訊,您 不可以 使用運算子。

在下面的例子中,我們要求 Portage 接受 gnumeric-1.2.13:

原始碼 3: 使用特定 gnumeric 版本

=app-office/gnumeric-1.2.13 ~x86 

3.c. 使用被封鎖的套件

檔案 package.unmask

Gentoo 發展者支援這些檔案的使用。請在練習時小心使用。和 package.unmaskpackage.mask 相關的要求並不會回應。

當一個套件被 Gentoo 開發者封鎖時,在檔案 package.mask 內會陳述套件被封鎖的理由(預設放在 /usr/portage/profiles),如果您仍然想要使用這個套件,將紀錄該套件的那行文字,原封不動 地加到檔案 /etc/portage/package.unmask 內。

舉例來說,如果 =net-mail/hotwayd-0.8 被封鎖了,您可以在 package.unmask 內加入完全相同的文字,而將其解封鎖:

原始碼 4: /etc/portage/package.unmask

=net-mail/hotwayd-0.8

檔案 package.mask

當您不希望 Portage 將某個套件或是套件的某特定版本列入考量範圍,您可以自己將該套件封鎖起來,這只需要在檔案 /etc/portage/package.mask 中加入相對應的紀錄。

例如,如果您不希望 Portage 安裝比 gentoo-sources-2.6.8.1 更新版的 kernel sources,您可以將下列一行文字加入 package.mask

原始碼 5: /etc/portage/package.mask 範例

>sys-kernel/gentoo-sources-2.6.8.1

4. 附加的Portage工具

4.a. etc-update

etc-update 是一個幫助合併 ._cfg0000_<名稱> 檔案的工具。他提供互動式的合併設定,也可以自動處理明顯的改變。 ._cfg0000_<名稱> 檔案是由 Portage 在他想要把檔案複寫到被 CONFIG_PROTECT 變數保護的目錄時產生的。

執行 etc-update 相當的直觀:

原始碼 1: 執行 etc-update

# etc-update

在合併明顯的改變後,你會看到需要更新的受保護檔案列表。在底下有兩個選項:

原始碼 2: etc-update 選項

Please select a file to edit by entering the corresponding number.
              (-1 to exit) (-3 to auto merge all remaining files)
                           (-5 to auto-merge AND not use 'mv -i'):

如果你輸入 -1etc-update 會離開不做任何改變。輸入 -3-5 的話,所有列在上面的設定檔都會用新的覆蓋。因此先選擇不要自動更新的設定檔相當重要。這是很簡單的一件事情,只要輸入列在設定檔左邊的號碼就好。

我們用 /etc/pear.conf 設定檔當作範例:

原始碼 3: 更新特定設定檔

Beginning of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
[...]
End of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
1) Replace original with update
2) Delete update, keeping original as is
3) Interactively merge original with update
4) Show differences again

你現在可以看到新舊設定檔間的不同處。如果你相信更新過的設定檔可以正確無誤的使用,輸入 1。如果你認為更新檔案沒有必要,或沒有提供任何新或有用的資訊,輸入 2。如果你想要互動的更新目前的設定檔,按 3

在這裡更深入的說明互動是並沒有意義。為了完整的理由,我們會列出在你互動合併兩個檔案時可以用的指令。你會看到兩行(原來的,以及新建議的)和你可以輸入下列指令的提示符號:

原始碼 4: 互動合併時可用的指令

ed:     在編輯器中編輯兩種版本,各個版本前加上不同標頭。
eb:     在編輯器中編輯兩種版本。
el:     編輯左邊的版本然後使用。
er:     編輯右邊的版本然後使用。
e:      編輯新的版本。
l:      使用左邊的版本。
r:      使用右邊的版本。
s:      簡潔的包含共同部份。
v:      詳細的包含共同部份。
q:      Quit.

當你更新好這重要的設定檔,你以自動更新所有其他的設定檔。如果沒有其他需要更新的檔案,etc-update 會自動離開。

4.b. dispatch-conf

使用 dispatch-conf 你可以合併更新到你的更新當同時監看所有的改變。 dispatch-conf 以 patch 檔案或是使用 RCS 修訂版系統來儲存設定檔間的不同處。

就像 etc-update,你可以保持原本的設定檔,使用新的設定檔,編輯目前設定檔或互動合併改變。然而 dispatch-conf 也有一些很棒的功能。

  • 自動合併只有註解更新的檔案。
  • 自動合併只有空白的地方修改的檔案。

確定你先編輯過 /etc/dispatch-conf.conf 然後建立 archive-dir 變數設定的目錄。

查看 dispatch-conf 手冊頁取得更多資訊:

原始碼 5: 閱讀 dispatch-conf 手冊頁

$ man dispatch-conf

4.c. quickpkg

使用 quickpkg 你可以建立已經安裝在你系統上軟體的套件檔。這檔案可以當作預先編好的套件。執行 quickpkg 相當直觀:只要加入你想製作的套件名。

例如說,打包 curlartsprocps

原始碼 6: quickpkg 使用範例

# quickpkg curl arts procps

預先編譯好的套件會放在 $PKGDIR/All (預設是 /usr/portage/packages/All)。到這些套件的符號連結在 $PKGDIR/<category>

5. 愉悅的使用官方的Portage Tree

5.a. 使用 Portage 樹子集合

排除套件/類別

你可以選擇只更新某些類別/套件並且忽略其他類別/套件。我們讓 emerge --sync 在執行 rsync 時排除類別/套件來達成這個功能。

預設上,rsync 會檢查 /etc/portage/rsync_excludes 的內容(如果存在的話),裡面包含了你不要 rsync 更新的類別或套件。

然而要注意的是這可能導致相依性問題,因為套件可能相依被排除的套件。

5.b. 加入非官方套件

定義 Portage Overlay 目錄

你可以要求 Portage 使用非官方,但是以透過 Portage 樹使用的 ebuild。建立一個新目錄(例如說 /usr/local/portage)來存放其他人提供的 ebuild。使用和官方 Portage 樹相同的目錄架構!

然後在 /etc/make.conf 中定義 PORTDIR_OVERLAY 指向你使用的目錄。現在當你使用 Portage 時,他也會將這些 ebuild 納入考慮,而且下次你執行 emerge --sync 時不會移除/覆蓋這些 ebuild。

使用多個 Overlay

對於開發多個 overlay 的重度使用者,在更新 Portage tree 前測試或是使用多個來源的非官方 ebuild,app-portage/gentoolkit-dev 套件提供你 gensync,幫助你保持 overlay 在最新的狀態。

你可以用 gensync 一次更新所有 Overlay,或更新其中幾個。每個 Overlay 要在 /etc/gensync/ 目錄中放一個 .syncsource 檔案,包含 Overlay 位置,名稱,ID 等等。

假設你有兩個叫作 java (發展中的 java ebuild) 以及 entapps (你為工作開發的軟體),你可以像這樣更新 overlay:

原始碼 1: 使用 gensync 更新一些 overlay

# gensync java entapps

5.c. 非 Portage 維護的軟體

使用 Portage 和自己維護的軟體

在某些情況你會想要自己設定,安裝,維護軟體而不要 Portage 自動完成這些過程,雖然是 Portage 已經提供這些軟體了。已知的例子是核心原始碼和 nvidia 驅動程式。你可以作一些設定讓 Portage 知道某個套件已經手動裝到系統上了。這個過程叫做 注入 而且透過 /etc/portage/profile/package.provided 檔案 Portage 支援這個功能。

舉例來說,如果你想要告訴 Portage vanilla-sources-2.6.11.6 你已經手動裝好了,把底下幾行加到 /etc/portage/profile/package.provided

原始碼 2: package.provided 範例

sys-kernel/vanilla-sources-2.6.11.6

6. Ebuild的應用方式

6.a. Emerge 與 Ebuild

ebuild 程式是 Portage 系統較低層的操控介面。你可以透過給予 ebuild 檔案,使用這個程式去執行特定動作。例如,你可以單獨執行各個 merge 步驟。

使用 ebuild 大多是為了開發;更多關於 ebuild 的資訊因此可以在 開發者手冊中找到。然而,我們將解釋在 merge 一個確切的軟體名稱時,什麼 ebuild 動作會被 Portage 請求,還有如何執行一些 ebuilds 支援的後端配置。

6.b. 手動安裝軟體

抓取原始碼 & 驗證 checksum

當你使用 ebuild 程式且給他一個 ebuild 檔案,他將驗證所有內涵檔案的 checksums 是否與 Manifest 附帶的,或與 files/digest-<name>-<version> 檔案中的 checksums 相同。這會在下載原始碼之後執行。

使用 ebuild 抓取原始碼, 請執行:

原始碼 1: 抓取原始碼

# ebuild path/to/ebuild fetch

如果 ebuild 的 md5sum 不符合列在 Manifest 檔案裡面的那份,或是下載的原始碼不符合列在 files/digest-<package> 檔案中的那些 checksum,你將收到像是這樣的錯誤訊息:

原始碼 2: Ebuild checksum 錯誤

!!! File is corrupt or incomplete. (Digests do not match)
>>> our recorded digest: db20421ce35e8e54346e3ef19e60e4ee
>>>  your file's digest: f10392b7c0b2bbc463ad09642606a7d6

接著會指出錯誤的檔案。

如果你確定你下載的原始碼和 ebuild 本身正確無誤,你可以使用 ebuild 的 digest 功能重新建立 Manifestdigest-<package>

原始碼 3: 重新建立 Manifest and digest

# ebuild path/to/ebuild digest

解開原始碼包裹

想解開 /var/tmp/portage(或你在 /etc/make.conf 指定的其他目錄路徑)中的原始碼檔案, 可以使用 ebuild 的 unpack 功能:

原始碼 4: 解開原始碼包裹

# ebuild path/to/ebuild unpack

這將執行 ebuild 的 src_unpack() 函式(如果沒有定義 src_unpack() 函式,預設會單純解壓縮)。在這個步驟也會套用所有必須的修補檔。

編譯原始碼

在 merge 程序中,下個步驟就是編譯原始碼。ebuild 的 compile 功能是去執行 ebuild 檔案中的 src_compile() 函式。如果有需要,這也包含著 configure 步驟。

原始碼 5: 編譯原始碼

# ebuild path/to/ebuild compile

如果你想改變編譯指令,建議您編輯 ebuild 檔案中的 src_compile() 函式。然而,你也可以讓 Portage 以為 ebuild 程式已經完成編譯步驟了。自己執行所有必須的命令然後在工作目錄建立一個叫做 .compiled 的空檔案。

原始碼 6: 通知 Portage 編譯工作完成了

# touch .compiled

安裝暫存路徑中的檔案

下個步驟 Portage 將會安裝暫存目錄中的所有必要檔案。這個目錄將會包含所有要被 merge 到 Live 檔案系統的檔案。你可以跑 ebuild 的 install 功能來完成這個動作,他會執行 ebuild 檔案中的 src_install() 函式:

原始碼 7: 安裝檔案

# ebuild path/to/ebuild install

Merge 檔案到 Live 檔案系統

最後一個步驟是把所有檔案 merge 到 Live 檔案系統和登記他們到 Portage 後端。 ebuild 將這個步驟稱做 "qmerge",而且包含下列步驟:

  • 若有指定,將會執行 pkg_preinst() 函式
  • 複製所有檔案到 Live 檔案系統
  • 登記檔案到 Portage 後端
  • 若有指定,將會執行 pkg_postinst() 函式

執行 ebuild 的 qmerge 功能以達成這些步驟:

原始碼 8: Merge 檔案到 Live 檔案系統

# ebuild path/to/ebuild qmerge

清除暫存目錄

最後,你可以使用 ebuild 的 clean 功能清除暫存資料夾:

原始碼 9: 清除暫存目錄

# ebuild path/to/ebuild clean

6.c. 額外的 ebuild 特性

執行所有 Merge 相關命令

使用 ebuild 的 merge 功能,你可以一次執行 fetch、unpack、compile、install、qmerge 命令:

原始碼 10: 安裝軟體

# ebuild path/to/ebuild merge

執行設定動作

某些程式包含對你系統更進一步設定的指令。這些指令可以與人互動,也因此不會自動執行。使用 ebuild 的 config 功能來執行列在 ebuild 檔案裡(非必要)config() 函式中的設定步驟:

原始碼 11: 設定套件

# ebuild path/to/ebuild config

建立一個 (RPM) 套件

你可以叫 Portage 由 ebuild 檔案建立一個二進位的套件,即使是 RPM 檔案。使用 ebuild 的 package 或 rpm 功能去建立這些檔案。然而這兩個功能有些不同:

  • package 功能與 merge 功能非常相像,在建立套件之前,會執行所有必備的動作 (fetch、unpack、compile、install)
  • rpm 功能會把執行 ebuild 的 install 功能之後所建立的檔案 包成 RPM 套件。

原始碼 12: 建立套件

(建立 Portage 相容,已編譯好套件)
# ebuild path/to/ebuild package

(建立 RPM 套件)
# ebuild path/to/ebuild rpm

然而用此方式建立的 RPM 檔案並不包含 ebuild 的相依性相關訊息。

6.d. 更多資訊

要更多關於 Portage、ebuild 程式和 ebuild 檔案的資訊,請查閱下列 man page:

原始碼 13: Man pages

$ man portage    (Portage 本身)
$ man emerge     (emerge 命令)
$ man ebuild     (ebuild command)
$ man 5 ebuild   (The ebuild file syntax)

你也可以在 開發者手冊 找到更多有關開發的資訊

D. Gentoo 網路設定

1. 新手上路

1.a. Getting started

注意: 這篇文件假設你已成功的設定核心,和它的網路設備模組並且知道介面名稱. 我們並且假設你現在在設定eth0,但是也可以是eth1,wlan0,或其他.

注意: 這篇文章適用baselayout-1.11.11或更新的版本.

要開始設定你的網路卡,你需要告訴Gentoo RC系統相關的資訊. 做一個符號連結從 net.lonet.eth0/etc/init.d 目錄以完成這項動作

原始碼 1: 做一個符號連結從 net.eth0 到 net.lo

# cd /etc/init.d
# ln -s net.lo net.eth0

Gentoo's RC 系統現在知道這個介面了.它一樣也需要知道如何設定這個介面.所有的網路介面設定都在 /etc/conf.d/net這個檔案完成.接下來是一個用dhcp和靜態ip的範例設定.

原始碼 2: /etc/conf.d/net範例

# 使用 DHCP
config_eth0=( "dhcp" )

# 設定靜態 IP 使用 CIDR 標記法
config_eth0=( "192.168.0.7/24" )
routes_eth0=( "default via 192.168.0.1" )

# 設定靜態 IP 使用網路遮罩標記法
config_eth0=( "192.168.0.7 netmask 255.255.255.0" )
routes_eth0=( "default gw 192.168.0.1" )

注意: 如果你沒有為你的接面設定的話,我們會假定你使用dhcp取得ip.

注意: CIDR 表示無階級跨網域路由 (Classless InterDomain Routing). 原來, IPv4 位址被分成 A, B, C三個等級. 早期的分類系統並沒有想像到 Internet 的巨大發展,就造成了獨立位址會被用光的危機. CIDR 是一個地址表示規格容許一個 IP 位址去表示很多 IP 位址. A CIDR IP 位址可以看起來很像一般的 IP 位址除了它結束的地方多了一個反斜線和一個數字; 一個範例,192.168.0.0/16. CIDR 的詳細描述在 RFC 1519.

現在我們已經完成設定這個介面,我們可以使用以下的命令來啟動和停止它.

原始碼 3: 啟動和停止網路介面

# /etc/init.d/net.eth0 start
# /etc/init.d/net.eth0 stop

重要: 在我們想要對網路除錯時,我們建議設定 RC_VERBOSE="yes"/etc/conf.d/rc 檔案,我們就可以得到關於發生什麼事情的更多資訊.

.現在我們已經成功開始和停止我們的網路介面,你也許會想要讓它在Gentoo啟動的時候也啟動. 下面就是做法.最後一個"rc" 命令叫 Gentoo 去啟動任何的程式在當時的runlevel還沒有啟動的.

原始碼 4: 設定一個網路介面在開機時啟動

# rc-update add net.eth0 default
# rc

2. 進階設定

2.a. 進階設定

config_eth0 變數是網路介面設定的核心。他是一個高階的網路介面(例子中是 eth0)設定列表。在列表中的每個指令依序執行。當最後一個指令成功後網路介面就視為可以用了。

這是內建指令的列表。

指令說明
null不做任何事
noop如果網路介面啟動而且有一個位址,那就成功離開設定
an IPv4 or IPv6 address為這個介面加上一個網路位址
dhcp, adsl or apipa (或是第三方模組提供的自訂指令) 執行這個指令的模組。例如說 "dhcp" 會執行 dhcp 模組,是 dhcpcd,udhcpc, dhclient 或 pump 其中一個。

如果有一個失敗了,你可以指定 fallback 指令。fallback需要完全符合設定的結構。

你可以把這些指令連在一起。底下是一些實際的範例。

原始碼 1: 設定範例

# 加上三個 IPv4 位址
config_eth0=(
  "192.168.0.2/24"
  "192.168.0.3/24"
  "192.168.0.4/24"
)

# 加上一個 IPv4 位址及兩個 IPv6 位址
config_eth0=(
  "192.168.0.2/24"
  "4321:0:1:2:3:4:567:89ab"
  "4321:0:1:2:3:4:567:89ac"
)

# 使用核心指定的位址,如果網路介面停止的話改用 DHCP。
# DHCP 失敗的話由 APIPA 指定一個位址。
config_eth0=(
  "noop"
  "dhcp"
)
fallback_eth0=(
  "null"
  "apipa"
)

注意: 當使用 ifconfig 模組並且加上超過一個位址,每個位址會建立一個別名。上面的例子你會有 eth0,eth0:1 和 eth0:2 這幾個介面。你不能對多出來的介面做任何事。因為核心和其他程式會把 eth0:1 和 eth0:2 當作 eth0。

重要: fallback 中的順序相當重要!如果你沒有在 "apipa" 之前指定 "null",他只有在 "noop" 指令失敗時才會做。

注意: APIPADHCP 稍後會討論。

2.b. 網路相依性

/etc/init.d 中的 可以依賴某個網路介面或是任一個(net),"net" 可以在 /etc/conf.d/rc 中的 RC_NET_STRICT_CHECKING 變數定義代表那些東西。

說明
nonenet 服務總是被認為啟動了
no這基本上代表除了 net.lo 以外,任一個 net.* 服務啟動才算。這個可以給同時有無 線網路及有線網路的筆記型電腦使用者使用,因為某一時間只要其中之一介面啟動了, net 服務就被視為啟動。
lo這和 'no' 相同,但是 net.lo 也被考慮在內。這對於不在意哪個介面啟動的使用者 很有用。
yes所有的網路介面啟動了 'net' 服務才算啟動。

但是,net.br0 要依賴 net.eth0 還是 net.eth1?net.eth1 可能是一個無線網路或 ppp 裝置,需要在橋接前先做設定。這不能由 /etc/init.d/net.br0 完成,因為他只是一個到 net.lo 的符號連結。

解答是在 /etc/conf.d/net 做一個你自己的 depend() 函數。

原始碼 2: /etc/conf.d/net 中 net.br0 相意關係

# 你可以使用任何在目前檔案的相依關係 (use, after, before)
depend_br0() {
  need net.eth0 net.eth1
}

要取得更多關於相依性的討論。參考 寫 Init Scripts

2.c. 變數名稱及設定值

變數名稱是動態的。他們的結構通常是 variable_${interface|mac|essid|apmac} 。例如說,dhcpcd_eth0 變數代表 eth0 的 dhcpcd 設定。而 dhcpcd_essid 則是任何介面連到這個 "essid" 時的 dhcpcd 設定。

然而,並沒有簡單的法則決定介面的名稱。實際上,許多無線網路介面除了 ethx 以外,也會用像 wlanx,rax 之類的名稱。而且一些使用者定義的介面,像橋接,可以給 foo 之類的自訂名稱。為了讓生活更加有趣,無線網路結點可以在名稱中有非英文,數字的字元 - 因為你要對每個 ESSID 設定參數,這一點相當重要。

Gentoo 在網路設定的缺點是使用 bash 變數 - 不能使用任何數字,英文字母以外的東西。為了突破這個限制,我們把所有非數字,英文字母的字元轉成 _ 字元。

另一個不方便的地方是變數的值 - 需要跳脫一些字元。這可以在需要跳脫的字元前加上 / 字元來完成。底下是需要像這樣跳脫的字元列表:"'/

在範例中為了讓 ESSID 包含最多種的字元,我們使用這個 My "/ NET ESSID:

原始碼 3: 變數名稱範例

# 這可以運作,但是領域名稱是不合法的
dns_domain_My____NET="My /"// NET"

# 上面的例子是當連到 ESSID 是 My "/ NET 的 AP 時,
#把領域名稱設成 My "/ NET 

3. 網路模組

3.a. 網路模組

我們現在支援模組化的網路 script,這代表可以輕鬆的支援新的網路介面和設定模組,而且同時和原來的保持相容性。

如果模組需要的套件已經安裝,他就會自動載入。但是如果你指定一個還沒安裝套件的模組,那你會收到一個錯誤訊息,告訴你要安裝哪個套件。理想上,只有在你安裝兩個以上提供相同功能的套件,而且你比較喜歡某一個時,才需要用模組設定。

原始碼 1: 模組優先權

# 想用 iproute2 而不是 ifconfig
modules=( "iproute2" )

# 你也可以為一個介面指定不同的模組
# 在底下的例子我們比較想用 udhcpc 而不是 dhcpcd
modules_eth0=( "udhcpc" )

# 你也可以指定不要用哪個模組 - 例如說你可能想
# 使用 linux-wlan-ng 來控制無線網路設定
# 但是你仍然想對每一個 ESSID 做設定
modules=( "!iwconfig" )

3.b. 網路介面管理

我們目前提供兩種不同的網路管理程式:ifconfig 及 iproute2。你可以用這兩個其中之一來做任何種類的網路設定。

ifconfig 是目前 Gentoo 預設使用的,並且包含在系統 profile 之中。iproute2 是更有威力及彈性的套件,但是預設並不包含他。

原始碼 2: 安裝 iproute2

# emerge sys-apps/iproute2

# 如果兩個都安裝的話,使用 iproute2
modules=( "iproute2" )

因為 ifconfig 和 iproute2 都是做很類似的事,我們讓這兩個可以使用共同的基本設定。例如說底下兩段程式碼不管對那種都適用。

原始碼 3: ifconfig 和 iproute2 範例

config_eth0=( "192.168.0.2/24" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0" )

# 我們也可以指定廣播位址
config_eth0=( "192.168.0.2/24 brd 192.168.0.255" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255" )

3.c. DHCP

DHCP 是一種從 DHCP 伺服器取得網路資訊(IP 位址,DNS 伺服器,閘道器等等)的方法。這代表如果網路上有一個 DHCP 伺服器,你只要告訴客戶端使用 DHCP 然後他們就會自己把網路設好。當然,如果在使用 DHCP 前必需要用無線網路,ppp 等其他事的話你必需要去設定。

DHCP 功能可以由 dhclient,dhcpcd,pump 或是 udhcpc 提供。每一種 DHCP模組都有他的好處和壞處 - 底下是快速的簡介。

DHCP 模組套件優點缺點
dhclientnet-misc/dhcp由 ISC,和製作 BIND DNS 軟體的同一批人做的。設定非常有彈性。 設定相當複雜,軟體非常肥大,沒辦法從 DHCP 取得 NTP 伺服器,預設不送主機名稱。
dhcpcdnet-misc/dhcpcdGentoo 一直以來的預設套件,不依賴任何其他工具 不再被上游維護,有些時候很慢,當租約無限久時不會變成系統服務
pumpnet-misc/pump輕巧,不依賴任何其他工具 不再被上游維護,不可靠,尤其是在透過數據機時,不能從 DHCP 取得 NIS 伺服器
udhcpcnet-misc/udhcp輕巧 - 最小的 DHCP 客戶端,為嵌入式系統而做的軟體 未知 - 沒有任何套件預設使用他,不能定義三秒以上的 timeout

如果你安裝一種以上的 DHCP 客戶端,你需要指定用那一個 - 否則預設是有 dhcpcd 可以用的話就用他。

要送給 DHCP 客戶端自訂的選項,使用 module_eth0="..." (把 module 改成你在用的 DHCP 模組,例如說 dhcpcd_eth0)

我們嘗試讓 DHCP 相對來說不可知 - 因此在 dhcp_eth0 變數中支援下列指令。預設是不用任何一個。

  • release - 釋放 IP 讓他可以重複使用
  • nodns - 不要複寫 /etc/resolv.conf
  • nontp - 不要複寫 /etc/ntp.conf
  • nonis - 不要複寫 /etc/yp.conf

原始碼 4: /etc/conf.d/net 的 DHCP 範例

# 只有在你安裝一種以上 DHCP 模組才需要
modules=( "dhcpcd" ) 

config_eth0=( "dhcp" )
dhcpcd_eth0="-t 10" # 十秒後 Timeout
dhcp_eth0="release nodns nontp nonis" # 只取得位址

注意: dhcpcd,udhcpc 和 pump 預設會傳送目前的主機名稱給 DHCP 伺服器,所以你不用去指定他。

3.d. ADSL 連線

首先我們要安裝 ADSL 軟體。

原始碼 5: Install the rp-pppoe package

# emerge net-dialup/rp-pppoe

警告: baselayout-1.11.x 目前只支援 PPPOE。我們希望以後的版本可以支援 PPPOA。

現在要設定 eth0 為 ADSL 連接的網路介面,並且輸入使用者名稱。

原始碼 6: 設定 eth0 使用 ADSL

config_eth0=( "adsl" )
adsl_user_eth0="username"

最後你要在 /etc/ppp/pap-secrets 定義使用者名稱及密碼。

原始碼 7: /etc/ppp/pap-secrets 範例

# * 非常重要
"username"  *  "password"

3.e. APIPA (自動取得虛擬 IP)

APIPA 藉由發送arp,詢問在 169.254.0.0-169.254.255.255 中隨機的一個位址來找到一個可以用的 IP。如果沒有收到就是可以用,接著就會把網路介面指定這個 IP。

這只有在沒有 DHCP 伺服器並且沒有連到網際網路,及其他電腦也用 APIPA 時才適用。

為了支援 APIPA,安裝 net-misc/iputils or net-analyzer/arping。

原始碼 8: /etc/conf.d/net 的 APIPA 設定

# 先試 DHCP - 失敗的話再用 APIPA
config_eth0=( "dhcp" )
fallback_eth0=( "apipa" )

# 只使用 APIPA
config_eth0=( "apipa" )

3.f. 頻寬合併

要使用頻寬合併,先安裝 net-misc/ifenslave

頻寬合併用來增加網路頻寬。如果你有兩個連到停一網路的網路介面,你可以把這兩個連結在一起,讓應用程式只看到一個網路介面,但實際上他們正同時使用兩個介面。

原始碼 9: /etc/conf.d/net 頻寬合併設定

把介面連在一起
slaves_bond0="eth0 eth1 eth2"

# 你或許不想給連結的介面 IP
config_bond0=( "null" )

# 因為 eth0,eth1 和 eth2 需要額外的設定,要在相依性中加入這三個
depend_bond0() {
  need net.eth0 net.eth1 net.eth2
}

3.g. 橋接 (802.1d 支援)

橋接的支援要先安裝 net-misc/bridge-utils

橋接是用來兩個網路連接在一起。例如說,你有一台伺服器透過 ADSL 連到網際網路,還有一張無線網路卡讓其他的電腦可以連到網際網路。你可以用橋接把這兩個連在一起。

原始碼 10: /etc/conf.d/net 橋接設定

# 設定橋接 - "man btctl" 取得更多資訊
brctl_br0=( "setfd 0" "sethello 0" "stp off" )

# 增加要橋接在 br0 的 port
bridge_br0="eth0 eth1"

# 你可以設定成 null 讓 dhcp 不會啟動
config_eth0=( "null" )
config_eth1=( "null" )

# 最後給橋接器一個位址 - 你也可以用 DHCP
config_br0=( "192.168.0.1/24" )

# 因為 eth0,eth1 需要額外的設定,要在相依性中加入這三個
depend_br0() {
  need net.eth0 net.eth1
}

重要: 要設定橋接,你可以參考 變數名稱 文件。

3.h. MAC 位址

你不用安裝任何東西就可以改變網路介面的 MAC 位址。然而,如果需要變成隨機的位址,或是某一種類的隨機位址,你需要安裝 net-analyzer/macchanger。

原始碼 11: MAC 改變範例

# 指定網路介面的 MAC 位址
mac_eth0="00:11:22:33:44:55"

# 隨機決定最後三個位元組
mac_eth0="random-ending"

# 在所有品牌,同一種網路類型內(光纖,銅線,無線網路)隨機決定
mac_eth0="random-samekind"

# 在所有品牌,所有網路類型內(光纖,銅線,無線網路)隨機決定
mac_eth0="random-anykind"

# 完全隨機 - 警告:一些由這方法做出來的 MAC 位址可能不能正常工作
mac_eth0="random-full"

3.i. Tunnel

你需要裝任何東西就可以使用 tunnel 了,因為網路介面管理會幫你做這些事。

原始碼 12: /etc/conf.d/net 的 tunnel 設定

# GRE tunnels
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"

# IPIP tunnels
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"

# 設定介面
config_vpn0=( "192.168.0.2 peer 192.168.1.1" ) 

3.j. VLAN (802.1q 支援)

安裝好 net-misc/vconfig 後,就可以支援 VLAN 了。

虛擬區網 (Virtual LAN) 是一組網路裝置運作時有如他們連到同一段區網一樣 - 但實際上可能不是。VLAN 成員即使是連在同一個實體區域網路,也只能看到同一 VLAN 的成員。

原始碼 13: /etc/conf.d/net VLAN 設定

# 像這樣指定 VLAN 號碼
# 確定 VLAN ID 前面沒有加上 0
vlans_eth0="1 2"

# 你也可以修改 VLAN 的設定值
# 看 vconfig 手冊頁取得更多資訊
vconfig_eth0=( "set_name_type VLAN_PLUS_VID_NO_PAD" )
vconfig_vlan1=( "set_flag 1" "set_egress_map 2 6" )

# 如同一般的設定方式設定 vlan
config_vlan1=( "172.16.3.1 netmask 255.255.254.0" )
config_vlan2=( "172.16.2.1 netmask 255.255.254.0" )

重要: 要設定 VLAN,你可以參考 變數名稱 文件。

4. 無線網路

4.a. 介紹

目前我們支援用 wireless-tools 或 wpa_supplicant 來設定無線網路。要記得最重要的一點是無線網路的設定是全域為主,而不是以介面為主。

wpa_suppliant 是最好的選擇,但是他並不支援所有裝置。要看他所有支援的裝置請查看 wpa_supplicant 網站。此外,wpa_supplicant 目前只能連線到你已經設定的 SSID。

wireless-tools 幾乎支援所有的裝置,但是不能連到只使用 WPA 的 AP。

警告: 目前 baselayout 不支援 linux-wlan-ng。因為 linux-wlan-ng 有著和其他完全不同的設定方式。搖傳 linux-wlan-ng 開發者要把他們的設定變成 wireless-tools - 這代表可以在 baselayout 中使用 linux-wlan-ng。

4.b. WPA Supplicant

WPA Supplicant 是讓你連接到啟動 WPA 的 AP 的套件。因為還在測試中,他的設定過程常常改變 - 但是大部份情況都可以正常工作。

原始碼 1: 安裝 wpa_supplicant

# emerge net-wireless/wpa_supplicant

重要: 核心中要啟動 CONFIG_PACKET 才能讓 wpa_supplicant 工作。

現在要設定 /etc/conf.d/net 優先使用 wpa_supplicant 而不是 wireless-tools (兩個都安裝的話,預設會用 wireless-tools)。

原始碼 2: /etc/conf.d/net 設定 wpa_supplicant

# 使用 wpa_supplicant 而不是 wireless-tools
modules=( "wpa_supplicant" )

# 因為他的偵測不是很好,所以要告訴 wpa_supplicant
# 要使用哪個驅動程式
wpa_supplicant_eth0="-Dmadwifi"

注意: 如果你用 host-ap 驅動程式你需要讓網路卡在管理模式,讓 wpa_supplicant 可以正確使用。在 /etc/conf.d/net 中加上 iwconfig_eth0="mode managed" 來設定。

很簡單不是嗎?然而,根據你要連線 AP 的安全程度,還有一些 wpa_supplicant 的設定要調整。底下的例子是從 wpa_supplicant 提供的 /etc/wpa_supplicant.conf.example 簡化而來的。

原始碼 3: /etc/wpa_supplicant.conf 設定

# 不有改變這行,否則他不能工作
ctrl_interface=/var/run/wpa_supplicant

# 確保只有 root 可以讀取 WPA 設定
ctrl_interface_group=0

# 讓 wpa_supplicant 搜尋及選擇 AP
ap_scan=1

# 簡單的例子:WPA-PSK, PSK 使用 ASCII 密碼,只要密碼正確就允許
network={
  ssid="simple"
  psk="very secret passphrase"
  # 越高的優先權越快被使用
  priority=5
}

# 和前一個一樣,但是指定 SSID (適用
# 不廣播 SSID 的 AP)
network={
  ssid="second ssid"
  scan_ssid=1
  psk="very secret passphrase"
  priority=2
}

# 只用 WPA-PSK。任何有效的密碼組合都允許
network={
  ssid="example"
  proto=WPA
  key_mgmt=WPA-PSK
  pairwise=CCMP TKIP
  group=CCMP TKIP WEP104 WEP40
  psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
  priority=2
}

# 明文連線 (不用 WPA,IEEE 802.1X)
network={
  ssid="plaintext-test"
  key_mgmt=NONE
}

# Shared WEP key 連接 (不用 WPA,IEEE 802.1X)
network={
  ssid="static-wep-test"
  key_mgmt=NONE
  wep_key0="abcde"
  wep_key1=0102030405
  wep_key2="1234567890123"
  wep_tx_keyidx=0
  priority=5
}

# Shared WEP key 連接 (不用 WPA,IEEE 802.1X) 使用
# IEEE 802.11 Shared key 認證
network={
  ssid="static-wep-test2"
  key_mgmt=NONE
  wep_key0="abcde"
  wep_key1=0102030405
  wep_key2="1234567890123"
  wep_tx_keyidx=0
  priority=5
  auth_alg=SHARED
}

# IBSS/ad-hoc 網路加上 WPA-None/TKIP
network={
  ssid="test adhoc"
  mode=1
  proto=WPA
  key_mgmt=WPA-NONE
  pairwise=NONE
  group=TKIP
  psk="secret passphrase"
}

4.c. Wireless Tools

初始設定及管理模式

Wireless Tools 提供通用的方法設定無線網路介面使用 WEP 安全等級。雖然 WEP 是脆弱的安全防護,但他也是最普及的。

Wireless Tools 設定是由一些主要的變數控制的。底下的設定檔說明所有你需要知道的東西。要牢記在心理的是不設定代表 "連結到訊號最強,未加密的 AP" we will always try and connect you to something.

原始碼 4: 安裝 wireless-tools

# emerge net-wireless/wireless-tools

注意: 雖然你可以把設定存在 /etc/conf.d/wireless,但是指南中建議你存在 /etc/conf.d/net

重要: 需要查閱 變數名稱 文件。

原始碼 5: /etc/conf.d/net iwconfig 設定範例

# 使用 iwconfig 而不是 wpa_supplicant
modules=( "iwconfig" )

# 設定叫作 ESSID1 及 ESSID2 AP 的 WEP key
# 你最多可以設四個 WEP key,但是只有第一個有作用
# 所以我們用預設的索引 [1] 設定 [1] key
# 然後再把 [1] 設成使用的 key
# 我們這樣做讓你可以設定其他的 ESSID 使用一個以上的 WEP key
# key 前面加上 s: 代表是 ASCII key,不然的話 HEX key
# enc open 指定 open security (較安全)
# enc restricted 指定 restricted security (較不安全)
key_ESSID1="[1] s:yourkeyhere key [1] enc open"
key_ESSID2="[1] aaaa-bbbb-cccc-dd key [1] enc restricted"

# 底下只在掃描可用 AP 時有用

# 有時候找到不只一個可以用的 AP
# 所以們要定義連線的優先順序
preferred_aps=( "ESSID1" "ESSID2" )

AP 選擇的詳細設定

你可以加上一些額外參數來做 AP 選擇的細部設定,但是一般來說這並不需要。

你可以決定是不是只連到優先的 AP。預設如果每個設定都失敗了,會連線到未加密的 AP。這可以用 associate_order 變數控制。這是每個參數控制的說明。

說明
any預設行為
preferredonly只會連到在優先列表上可見的 AP
forcepreferred即使掃描時沒找到,還是會依優先順序強制連到 AP
forcepreferredonly不要掃描 AP - 只依序連到每一個
forceanyforcepreferred 加上連到任何可見的 AP

最侯還有 blacklist_aps 及 unique_ap 選擇。blacklist_aps 和 preferred_aps 運作方法差不多。unique_ap 設定 yes 或 no 決定第二個無線網路介面可不可以連到同一個 AP。

原始碼 6: blacklist_aps 及 unique_ap 範例

# 有時候你不想連到特定 AP
blacklist_aps=( "ESSID3" "ESSID4" )

# 如果你有一個以上的無線網路卡,你可以設定允不允許
# 每張卡連到同一個 AP
# 可以設定 "yes" 及 "no"
# 預設是 "yes"
unique_ap="yes"

Ad-Hoc 及 Master 模式

如果你想要在管理模式連線 AP 失敗時設定成 Ad-Hoc 模式,也可以做的到。

原始碼 7: 失敗後進入 ad-hoc 模式

adhoc_essid_eth0="This Adhoc Node"

要如何連到 Ad-Hoc 網路或是用 Master 模式執行,成為 AP?這裡就是這樣做的設定!你可能需要向下面這樣指定 WEP key。

原始碼 8: ad-hoc/master 設定範例

# 設定模式 - 可以是 managed (預設),ad-hoc 或 master
# 不是全部裝置都支援所有模式
mode_eth0="ad-hoc"

# 設定介面的 ESSID
# 在 managed 模式,這除了強迫介面連到指定的 ESSID 外就沒其他的作用了
essid_eth0="This Adhoc Node"

# 如果沒有指定頻道的話,會使用頻道 3
channel_eth0="9"

重要: 底下是從 NetBSD 文件 中找到的 BSD wavelan 文件複製過來的。一共有 14 個頻道可以用:1-11 在北美是合法的,歐洲則是 1-13,法國是 10-13,日本只有 14。如果你不確定的話,請查閱你的卡或 AP 附的文件。確定你選的頻道和 AP 所使用的(或其他在 ad-hoc 網路中的卡)一樣。在北美及歐洲大部份賣出的網路卡是用頻道 3,法國則是 11,日本是 14。

Wireless Tools 疑難排解

有一些變數可以在裝置或環境有問題時,幫你啟動無線網路。這是你可以嘗試使用的變數列表。

變數預設值說明
iwconfig_eth0查看 iwconfig 手冊頁了解送到 iwconfig 設定的細節
iwpriv_eth0查看 iwpriv 手冊頁了解送到 iwpriv 設定的細節
sleep_scan_eth00在嘗試掃描前睡眠幾秒。當驅動程式/軔體在裝置可以使用前,要花一些使間啟動時使 用。
sleep_associate_eth05當介面從一個 AP 移到另一個 AP 時要等幾秒
associate_test_eth0MAC有些驅動程式在失去或嘗試連線時不會重設 MAC 位址到無效的, 有些驅動程式在失去或嘗試連線時不會重設 quality level。可以設定的值有 MAC,quality 和 all。
scan_mode_eth0一些驅動程式需要在 ad-hoc 模式掃描。所以如果掃描失敗了,試試看把他設成 ad-hoc
iwpriv_scan_pre_eth0在開始掃描前送一些 iwpriv 的指令。查閱 iwpriv 手冊頁取得更多資訊。
iwpriv_scan_post_eth0在掃描後送一些 iwpriv 的指令。查閱 iwpriv 手冊頁取得更多資訊。

4.d. 針對每一個 ESSID 做網路設定

有時候當你連到 ESSID1 時你會用固定 IP,而連到 ESSID2 時使用 DHCP。事實上大部份的模組指令可以針對不同的 ESSID 做設定。底下就說明如何設定。

注意: 在你使用 WPA Supplicant 或 Wireless Tools 時才有作用。

重要: 需要參閱 變數名稱文件。

原始碼 9: override network settings per ESSID

config_ESSID1=( "192.168.0.3/24 brd 192.168.0.255" )
routes_ESSID1=( "default via 192.168.0.1" )

config_ESSID2=( "dhcp" )
fallback_ESSID2=( "192.168.3.4/24" )
fallback_route_ESSID2=( "default via 192.168.3.1" )

# 我們也可以定義 DNS 還有其他東西
# 這意:如果沒有說的話,DHCP 會覆蓋這些設定
dns_servers_ESSID1=( "192.168.0.1" "192.168.0.2" )
dns_domain_ESSID1="some.domain"
dns_search_domains_ESSID1="search.this.domain search.that.domain"

# 由 AP 的 MAC 位址來區別
# 在你到別的地方,但是確有相同的 ESSID 時很有用
config_001122334455=( "dhcp" )
dhcpcd_001122334455="-t 10"
dns_servers_001122334455=( "192.168.0.1" "192.168.0.2" )

5. 新增功能

5.a. 標準函數連結

有四個定義好的函數在 start/stop 動作時會啟動。這些函數開頭都是網路介面的名稱,以便控制多個網路介面。

preup 和 predown 函數應該回傳 0,表示接下來的介面設定或取消設定可以繼續,如果 preup 回傳不為 0 的數值,會結束網路介面的設定。如果 predown 回傳不為 0 的數值,將會不允許繼續這個網路介面的取消設定。

postup 及 postdown 函數會忽略回傳值,因為如果他們有錯誤的話,也沒有什麼要做的。

${IFACE} 是設成要啟動/關閉的網路介面。${IFVAR} 是把 ${IFACE} 轉換成 bash 可以接受的變數名稱。

原始碼 1: pre/post up/down function 範例

preup() {
  # 在啟動前測試網路線是否已接上。
  # 這只在某些網路卡有作用,並且需要安裝 mii-diag 套件
  if mii-tool ${IFACE} 2> /dev/null | grep -q 'no link'; then
    ewarn "No link on ${IFACE}, aborting configuration"
    return 1
  fi

  # 在啟動前測試網路線是否已接上。
  # 這只在某些網路卡有作用,並且需要安裝 ethtool 套件
  if ethtool ${IFACE} | grep -q 'Link detected: no'; then
    ewarn "No link on ${IFACE}, aborting configuration"
    return 1
  fi

  # 記得回傳 0 代表成功
  return 0
}

predown() {
  # script 中預設的是測試是否使用 NFS 當作根目錄,在這種情況不允許停止網路介面。
  # 注意如果你指定一個 predown() 函數,會蓋掉這個判斷。底下就是這個
  #script,如果你還需要他的話...
  if is_net_fs /; then
    eerror "root filesystem is network mounted -- can't stop ${IFACE}"
    return 1
  fi

  # 記得回傳 0 代表成功
  return 0
}

postup() {
  # 這個函數的用處例如說註冊動態 DNS 服務。
  # 另一個例子是在網路卡啟動後傳送/接收郵件。
       return 0
}

postdown() {
  # 這個函數只是為了完整放在這裡...
  # 我還沒想到什麼巧妙的事情可以做的 ;-)
  return 0
}

5.b. 無線網路函數連結

注意: 這對 WPA Supplicant 不能工作 - 但是 ${ESSID}${ESSIDVAR} 變數在 postup() 函數內可以用。

這裡定義兩個結合函數在相關的函數附近被呼叫。這些函數開頭都是網路介面的名稱,以便控制多個網路介面。

preassociate 函數應該回傳 0,表示接下來的介面設定或取消設定可以繼續,如果 preup 回傳不為 0 的數值,會結束網路介面的設定。如果 predown 回傳不為 0 的數值,將會不允許繼續這個網路介面的取消設定。

postassociate 函數會忽略回傳值,因為如果他們有錯誤的話,也沒有什麼要做的。

${ESSID} 是設成你連線 AP 的 ESSID。${ESSIDVAR}${ESSID} 轉換成 bash 可以接受的變數名稱。

原始碼 2: pre/post 結合函數

preassociate() {
  # 底下加了 leap_user_ESSID 及 leap_pass_ESSID 兩個變數
  # 當這些都對你要連線的 ESSID 設好後,執行 CISCO LEAP script

  local user pass
  eval user=/"/$/{leap_user_${ESSIDVAR}/}/"
  eval pass=/"/$/{leap_pass_${ESSIDVAR}/}/"

  if [[ -n ${user} && -n ${pass} ]]; then
    if [[ ! -x /opt/cisco/bin/leapscript ]]; then
      eend "For LEAP support, please emerge net-misc/cisco-aironet-client-utils"
      return 1
    fi
    einfo "Waiting for LEAP Authentication on /"${ESSID////////}/""
    if /opt/cisco/bin/leapscript ${user} ${pass} | grep -q 'Login incorrect'; then
      ewarn "Login Failed for ${user}"
      return 1
    fi
  fi

  return 0
}

postassociate() {
  # 這個函數只是為了完整放在這裡...
    # 我還沒想到什麼巧妙的事情可以做的 ;-)
	
  return 0
}

注意: ${ESSID}${ESSIDVAR} 在 predown() 還有 postdown() 函數不能使用

6. 網路管理

6.a. 網路管理

如果你和你的電腦經常在移動,你可能會沒有網路線或無線網路可以用。而且,你可能希望在你插上網路線或是找到無線網路時網路自動啟動。

這裡你可以找到一些幫你完成的工具。

注意: 這份文件只介紹 ifplugd,但時還有其他像 quickswitch 的工具你可以參考。

6.b. ifplugd

ifplugd 是一個在網路線接上或拔掉時自動啟動,停止網路介面的服務。他也會在新的無線網路結點在範圍內時幫你管理無線網路。

原始碼 1: 安裝 ifplugd

# emerge sys-apps/ifplugd

設定 ifplugd 相當的直觀。設定檔是放在 /etc/conf.d/ifplugd。執行 man ifplugd 取得詳細的變數資訊。

原始碼 2: ifplug 設定範例

# 設定要監視的介面
INTERFACES="eth0"

AUTO="no"
BEEP="yes"
IGNORE_FAIL="yes"
IGNORE_FAIL_POSITIVE="no"
IGNORE_RETVAL="yes"
POLL_TIME="1"
DELAY_UP="0"
DELAY_DOWN="0"
API_MODE="auto"
SHUTDOWN="no"
WAIT_ON_FORK="no"
MONITOR="no"
ARGS=""

# 對某個介面加上 ifplugd 的額外參數
# 注意當像這樣的變數設定時,全域變數會被忽略
# 
MONITOR_wlan0="yes"
DELAY_UP_wlan0="5"
DELAY_DOWN_wlan0="5"
阅读更多
个人分类: BLinux
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭