Home | SmbFTPD | Forum |
|
第八章 編譯核心 核心 (kernel) 顧名思義是整個作業系統的核心,系統一開機即載入核心,它控制了整個系統的運作,包含和硬體溝通、系統資源配置、記憶體管理、檔案系統管理等等。 本章將介紹如何客製化一個核心,它可以縮小您的系統、增加支援的軟硬體、更改系統限制等。讀完本章後,您將了解下列主題:
8.1 為什麼要重新編譯核心 傳統上,我們將所有支援的硬體、檔案系統等全部放到核心中,每次有新增的硬體或功能都必須重新編譯核心,並重新啟動電腦。但隨著支援的功能越來越多,系統核心變得越來越肥大,而重新開機以載入新加入的功能也不符合現代作業系統的需求。 目前 FreeBSD 許多可以獨立出來的功能都能做成所謂的核心模組 (kernel module),當系統有需要使用該模組時,才將它載入核心中。這麼做的好處就是可以讓我們更快加入硬體驅動程式,更方便地加入我們想要的功能。所有可以獨立出來的模組都可以編譯放入核心中,然而,使用動態載入的方式和直接編入核心中各有優缺,直接編入核心中可以減少載入的時間,而動態載入可以讓我們在不需要用到該功能時立即從系統中移除其所佔用的資源。以 DVD 所使用的檔案系統格式為例,我們平常可能很少用到 DVD,所以並未將它加入核心中。但當需要時,我們可以 kldload 這支程式來動態載入該模組,使用完畢後,也可以立即使用 kldunload 將它從核心中移除,在使用上方便許多。 我們剛安裝完 FreeBSD 時,所使用的核心是一般性的核心,稱之為 GENERIC kernel。為了要支援常見的軟硬體,因此 GENERIC 核心中可能包含了許多我們用不到的驅動程式,也可能不支援一些特殊的硬體。例如,單單網路卡驅動程式就有數十種被加入 GERERIC 核心中,其實我們只需要使用其中一種。在硬體方面,核心中包含了太多的東西不僅會佔去記憶體的空間,不同程式間也有可能造成衝突。 在軟體方面,如果要啟動 FreeBSD 的防火牆功能,或是使用 ADSL 連線 (4.4 以前的版本),都需要重新將支援這些功能的參數加到核心中。另外,如果要改變系統的效率,你必須修改核心中的參數,例如增加同時上線的人數、或最大同時開啟的檔案數等。當然,有的功能在 FreeBSD 中可以經由 sysctl 這個指令來修改,而毋需修改核心,但大部份的功能是一定要修改核心的。過於肥大的核心,開機需要的時間較長,所以我們可以將不必要的設定移除,以加速開機速度。 除此之外,我們常看到 FreeBSD 總部發佈安全性漏洞修補程式,在完成原始碼的修補之後,大多數的修補都必須重新編譯核心。所以我們還是要來了解一下如何為自己量身訂做一個新的核心。 請放心,編譯核心並不難,其實只有幾個步驟,只要依下列的方法去做,相信您對於系統核心將有更深入的了解。 8.2 修改核心 首先,您必須確認在安裝 FreeBSD 時,有將所有 FreeBSD 的原始碼 src 裝進來。請先檢查 /usr/src/sys/i386/conf/ 目錄存在,您可以在這個目錄中看到一個名為 GENERIC 的文字檔,GENERIC 就是安裝時用的一般核心。在 FreeBSD 4.x 的版本中,這個目錄下還有一個 LINT 的檔案,這個檔案中包含了所有可用的核心參數,您可以參考這個檔以取出所需的設定加入自己的核心中。如果您使用的是 FreeBSD 5.x 以後的版本,請參考 NOTES 這個檔。 如果系統中沒有 /usr/src/sys 這個目錄,表示您在安裝時並未安裝 FreeBSD 的原始碼,您可以使用 sysinstall 這個指令來執行安裝的選單工具,並安裝原始碼。執行了 sysinstall 後,請選擇 [Configure] -> [Distribution] -> [src] -> [sys],即可安裝核心的原始碼。除了使用 sysinstall 外,您也可以先將本書所附第一張光碟放入光碟機中,並使用下列指令來安裝: # mount /cdrom # mkdir -p /usr/src/sys # ln -s /usr/src/sys /sys # cat /cdrom/6.0-RELEASE/src/ssys.[a-d]* | tar -xzvf - 有了核心的原始碼後,我們就可以開始進行修改。首先,我們要做的就是將 GENERIC 複製一份,並修改複製的那一份。 # cd /usr/src/sys/i386/conf # cp GENERIC MYKERNEL 上面那一行指令就是把 GENERIC 複製一份叫做 MYKERNEL,新的 KERNEL 要叫什麼名字你可以自己取一個比較有意義的名字。建議您不要將自己所修改的核心設定放在 /usr/src/sys/i386/conf 目錄下,有時候我們可能會因為硬碟空間不足而刪除 /usr/src 這個目錄,或者日後進行升級時忘了備份我們編輯過的核心設定檔。所以建議您將 GENERIC 複製到其他目錄下,再建立一個 link 到 /usr/src/sys/i386/conf,如此一來,我們可以更方便的備份及保存設定。例如,我們可以將它複製到 /root 目錄下: # cd /usr/src/sys/i386/conf # cp GENERIC /root/MYKERNEL # ln -s /root/MYKERNEL 接著就要來修改 MYKERNEL 了,請使用文書處理軟體打開 MYKERNEL 後,再依文件中的說明來修改,把不必要的項目移除。必須要注意的是,核心中有的參數是互相依賴的,也就是說某些參數的存在一定要有某一行的支援。現在使用指令 ee 來修改剛才複製的核心: # ee MYKERNEL 在核心中,如果在一行的開頭有"#"表示該行為註解,以下我們針對 GENERIC 核心中每一個參數的說明。 8.2.1 基本的設定
這一行是必備的,代表的是使用 i386 的計算機架構 (architecture),也就是 IBM 相容個人電腦。FreeBSD 支援的硬體架構包含了 i386、pc98、alpha、sparc64 等。
上面這四行指的是 CPU 的類型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我們可以在開機後使用 dmesg 指令或參考 /var/run/dmesg.boot 來看 CPU 類型,並移除不必要的類型。
這個可以說是核心的名字,我們在開機時會看到這個字串,建議將它修改成和您核心設定檔同名,例如,MYKERNEL 或 WEBSERVER 等。
這個項目在 FreeBSD 5.x 後已經不必設定了。這是用來控制系統內部表格(internal system tables)大小的參數,它的值大約是您期望系統同一時間會上線使用的使用者數量。如果您使用的是 FreeBSD 4.5 以上的版本,建議您將它設定 0。如果設成非 0 的數字,這個值一定要設定大於四,maxusers 的值決定了處理程序所容許的最大值,20+16*maxusers 就是你將得到的所容許處理程序。 系統一開機就必須要有 18 個處理程序 (process),即便是簡單的執行指令 man 又會產生 9 個 process,所以將這個值設為 64 應該是一個合理的數目。如果你的系統會出現 proc table full 的訊息的話,可以就把它設大一點,例如 128。不過現在的 FreeBSD 很聰明,您只要將它設為 0,FreeBSD 會動態分配合理的值。 值得注意的是 maxusers 的值和同時可以上線的最大使用者人數並無關係,它只是決定你的 kernel 中一些資料結構的大小,真正影響上線人數的是 pseudo-device pty。 8.2.2 一般選項
這個參數是用來將核心編輯成除錯模式。加了這個參數之後,核心會包含一些除錯用的資訊,除非您需要做核心開發或協助測試核心程式,否則不需要加入這個參數。除錯模式的核心會比一般核心龐大許多,而且也會影響系統效能。
這是傳統的 FreeBSD 排程方式,它會被用來控制系統中所要執行的工作順序。FreeBSD 5.x 之後加入新的排程方法,稱之為 ULE。ULE 主要是為了 SMP 多顆 CPU 排程而設計,但您也可以用來做為一般排程使用。若您想試試 ULE 排程的功能,您可以將 SCHED_4BSD 改為 SCHED_ULE。
這個參數讓 kernel 用軟體的方式模擬浮點運算,如果你的 CPU 不含浮點運算器,你就必須打開此參數。486-DX 以上的 CPU 可以不需要這一行。不過 FreeBSD 所提供的一般浮點模擬器並不是十分精準,如果你沒有浮點運算器卻又需要最好的準確度,建議你把這一行改成 GPL_MATH_EMULATE 來使用 GNU 浮點模擬。因為 GNU 版權的關係,因此 FreeBSD 不以它來當作內定的模擬器。由於目前我們所使用的 CPU 都支援浮點運算,所以在 FreeBSD 5.x GENERAL kernel 預設並未加入這個參數。
上述這二行是網際網路溝通協定,就算您不打算連上網路,至少必需保留第一個 INET 的設定,因為大多數的程式都會要求使用 lookback 網路 (就是自己的機器和自己的機器溝通)。INET6 指的是 IPv6 協定,如果您要使用 IPv6 則必需加入該參數。 8.2.3 各種檔案系統的支援
這是最基本的檔案系統支援,如果你是從硬碟開機的,你一定需要它。FreeBSD 5.x 已經不再需要 FFS_ROOT 這個選項了,所以如果您使用 5.x 並不會看到這一行。
使用 soft update 可以加速對硬碟的在取速度,我們必須先再核心中加入對於 soft update 的支援,再針對不同的檔案分割區啟動此功能。您可以打指令 mount 來查看各個分割區是否已啟動 soft update,如果沒有,tunefs 這個指令來啟動它。我們在安裝 FreeBSD 時,預設除了根目錄的分割區外,其它的磁碟分割區都會將此功能打開。
FreeBSD 5.x 才加入這個選項,它是一種權限控制的功能,預設是開啟的狀態。一旦這個選項打開始,並開始使用檔案系統之後,最好不要將它關閉,以避免奇怪的問題產生。
這個選項可以加快 FreeBSD 對於大型目錄的處理速度,但將需要很大的記憶體空間。如果此核心是供大型伺服器使用,加入這個參數可以有比較好的效能。
記憶體映對檔案系統 (Memory-mapped Filesystem)。基本上它容許我們將一塊記憶體空間當做檔案系統來使用,以達到快速存取暫存檔的功能。例如,我們可以分割出一個 MFS 供 /tmp 使用,因為許多程式會利用 /tmp 建立暫時檔案,而 MFS 是將檔案系統掛在記憶體中,對於資料的存取會快很多。不過 FreeBSD 5.x 後已經不再使用 MFS 而改由 md-backed 檔案系統所取代。
這些選項是傳統的 UNIX 都支援的網路檔案系統,在 FreeBSD 4.x 中,只有 NFS 及 NFS_ROOT 這二個選項。而 FreeBSD 5.x 將 NFS 分成 NFS 客戶端及伺服器二個選項。傳統的 NFS 是使用 UDP 的方式傳輸。但 FreeBSD 的 NFS 支援 TCP 模式,如果您不打算使用 TCP 模式,您可以將這些選項移除。
支援 MS-DOS 檔案系統。除非你每次開機都要使用 MS-DOS 檔案系統,否則您可以將它移除,系統會在你使用到 MSDOS 檔案系統時自動載入核心模組。除此之外,你也可以使用 mtools來存取 DOS 的軟碟,這並不需要有 MSDOS 檔案系統的支援。
ISO 9660 是 CD-ROM 的檔案系統,如果你只是偶爾用到 CD-ROM,你可以此功能移除,同樣的,系統會在使用到 CD-ROM 時自動載入核心模組。此外,當我們使用 CD-ROM 聽音樂時並不需要 CD9660 的支援。CD9660_ROOT 只有當我們要拿 ISO 9660 檔案系統做根目錄時才需要,FreeBSD 5.x 後預設已將它移除。
處理程序檔案系統,它是將一些系統資訊偽裝成檔案系統並掛入 /proc 目錄下,讓一些系統監控軟體 (如 ps 這個指令) 可以從中得到執行中的處理程序的資訊。在 FreeBSD 5.0 以後的版本預設不再使用 /proc,大多數的監控程式也都改成不必使用 /proc 來得到系統資訊。如果您使用的是 FreeBSD 5.x 以後的版本,要使用 PROCFS 還必須加入下列這一個參數:
這個參數只出現在 FreeBSD 5.x 後,FreeBSD 4.x 並無此參數。 8.2.4 軟硬體相容性設定
這是為了要和 4.3 BSD 相容所使用的參數,請不要將它移除,否則有些應用程式可能會出現奇怪的影響。
FreeBSD 6.x 做了許多修改,為了相容於 FreeBSD 4.x、5.x 的系統呼叫 (system call),建議您保參這個設定。
這個選項控制了開機時尋找 SCSI 設備時要延遲多久 (MILLISECONDS),預設是 5 秒。有的 SCSI 需要一段時間來進行被始化的動作,當使用 IDE 的硬碟開機時,我們可以忽略這一行。如果您是以 SCSI 硬碟開機,您可以把這一行的數字調小一點以加快開機的速度。當然,如果因此抓不到硬碟,您就必須再把這個值調高一點。
允許使用者抓取console 所印出的訊息。這個選項對於 X window 使用者尤其有用。例如,我們可以使用 xterm -C 來模擬 console,以得到 talk、write (一種在 UNIX 網路聊天的功能) 所傳來的訊息,或是任何從系統發出的訊息。不過 FreeBSD 5.x 後已不再需要這個選項。
這個選項可以讓我們在開機時編輯開機選項。FreeBSD 5.x 後已不再支援這二個選項,而改用 device.hints,請 man device.hints。
允許使用核心除錯追蹤,通常只有對於核心開發者比較有用。
這個參數提供 System V 共享記憶體的支援。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些圖形化的程式用使用它來提高執行速度。如果你使用 X Windows 或是 BBS,你一定要打開此參數。
提供 System V messages 的支援,雖然不常用到,但是它只佔一點點 kernel 的空間。如果你架 bbs 站,這是一定要的啦。
提供 System V semaphores 的支援,雖然不常用到,但是它只佔一點點 kernel 的空間。您可以使用 ipcs 這個指令來查看是否有應用程式使用 System V 的這些選項,例如 Postsgre SQL 就必須用到。
Real-time extensions added in the 1993 POSIX。有些程式 (如 star office) 會用到它。FreeBSD 5.x 後不再需要 P1003_1B 這個選項。
這個選項限制 ICMP 封包錯誤回應所使用的頻寬,它可以降低我們被阻斷式攻擊 (denial of service packet) 的危險。如果您使用 FreeBSD 4.x,建議您保留該選項。FreeBSD 5.x 後預設已將此功能打開,所以這個選項在 6.x 已經不需要了。
這二個選項可以使用多顆 CPU,FreeBSD 5.x 後對於多顆 CPU 的支援有更好的效率,如果您只使用單顆 CPU,可以將此選項關閉。 8.2.5 匯流排及軟碟機
所有 FreeBSD 支援的硬體一定有上述其中之一的匯流排,isa 匯流排在現在的 i386 機器上已經很少見了。而 eisa 在 586 以後的主機板已經沒見過了。pci 應該是目前的主流,只要您有 pci 介面卡就必須打開此選項。
這個選項是用來支援 AGP 介面卡,大多數的顯示卡都是 AGP 介面。
以上幾個選項用以支援軟碟機,在 FreeBSD 5.x 後只需要一個 fdc 即可。而使用 FreeBSD 4.x 時,如果您只有一個軟碟機,您可以將 fd1 移除。 8.2.6 IDE 介面裝置
這是 ATA 及 ATAPI 的驅動程式,如果您有 ATA 硬碟或光碟機,一定要打開這個選項。如果要支援以下任何 IDE 介面裝置都必須將這個選項打開。
以上裝置分別是 ATA 硬碟、ATA 磁碟陣列裝置、IDE 光碟機、IDE 軟碟機、及 IDE 磁帶機。您可以將不必要的裝置移除,例如 IDE 軟碟機等。
這個選項用來將 ATA 控置單元設定為固定的控制編號,通常用在一些比較舊的設備上。 8.2.7 SCSI 裝置
以上這些項目都是 SCSI 介面卡的驅動程式,如果您有 SCSI 介面卡,您可以使用 dmesg 去查看您的介面卡型號,並留下所需的驅動程式即可。如果您只有 IDE 設備,您可以將所有項目移除。
這些是 SCSI 介面的設備,如果您有任何 SCSI 介面的設備或是 USB 硬碟、大姆哥,一定要保留 scbus 這個 SCSI 匯流排的選項。ch 是 SCSI media changer (一種備份用的設備)。如果您有 SCSI 硬碟或是 USB 硬碟,請保留 da 這個選項。而 sa 及 cd 分別是 SCSI 磁帶機及光碟機。
以上是磁碟陣列裝置,如果您沒有任何磁碟陣列,可以將它們全部移除。 8.2.8 基本週邊設備
atkbdc 這個選項用來控制鍵盤及滑鼠。而 atkbd 及 psm 分別為 AT 鍵盤及 PS/2 滑鼠的驅動程式。
這是顯示卡的驅動程式。
啟動時更新螢幕,螢幕保護程式會使用到它。FreeBSD 4.x 及 5.x 後所使用的選項不太一樣喔。
這是預設的 console 驅動程式,如果有螢幕一定要保留這個選項。
支援 vt 200 及 vt100 等相容終端機。
這是支援 FreeBSD 浮點運算,請勿移除。
這是用來支援 AGP 顯示卡的驅動程式。
支援 APM 電源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 時能自動關機,請將 disable 字樣移除。FreeBSD 5.x 後請將 apm 該行的井字號移除。接著必須在 /etc/rc.conf 中加入下列二行:
這是用來支援 i82454 休眠待命模式。
這些是 PCMCIA 介面卡的驅動程式,如果您使用的是筆記型電腦,請保留這些項目。FreeBSD 5.x 後支援 32 bit 的 PCMCIA 介面,但 FreeBSD 4.x 不支援喔。
支援序列埠 Serial (COM) ports。在 FreeBSD 4.x 下,sio0、sio1 等分別代表著 COM1、COM2、COM3、COM4。而 FreeBSD 5.x 後只要一個 sio 即可。通常我們只有 COM1 及 COM2,如果您有內接式的數據機,您可能要保留 COM3 或 COM4。
這些是並列埠及其它並列埠裝置 (如列表機) 的驅動程式。 8.2.9 網路卡設定
這些是網路卡的驅動程式,您可以使用 dmesg 去查看自己的網路卡型號,並保留所需要的型號設定即可。
如果您使用的是下列這些 PCI 10/100 的網路卡,請保留 MII bus 這個選項。
上列為 PCI 的網路卡,請使用 dmesg 查看您的網路卡型號,並保留所需的型號即可。請注意上列網路卡都必須要有 MII bus 的支援。
ISA介面的網路卡。如果很不幸的你的網路卡是 ISA 介面,建議你換成 PCI 的介面卡,否則你應該要先知道你使用的 irq 及 port。如果你的型號是 ed0 ,則請勿移除上述的 miibus。
這些是無線網路卡。 8.2.10 虛擬裝置
這二個虛擬的裝置分別用來做隨機運算及 loopback 網路,請保留這二個選項。
這是系統的記憶體裝置。
這是支援 user space 程式直接存取系統 I/O,X Windows 需要這個項目。
這是用來產生隨機密碼數字之類的裝置。
這是用來支援乙太網路,只要您有網路卡都必須保留這個項目。
sl 用以支援 SLIP,SLIP已經幾乎被 PPP 所取代,ppp 可以更簡單、快速的建立 modem-to-modem 連線。在 sl 後面的數字是要模擬多少條 SLIP。
支援 ppp 撥接連線。
tun 會被 ppp 所使用,如果您有撥接網路 (含 ADSL 撥號) 一定要保留這個選項。
最大的 ttys,如 telnet 同時上線最大人數,在 FreeBSD 4.x 預設是 16。你可以在 pty 的後面加上數字來提高人數,最大是 256。FreeBSD 5.x 後則毋需擔心這個問題。
用來支援虛擬的 Memory disk,這是一種將某塊記憶體拿來當成磁碟機使用的虛擬裝置。
支援 IPv6 和 IPv4 之間的溝通。
用以支援 IPv6 和 IPv4 之間的轉換。
這是 Berkeley Packet Filter,可以讓我們的網路卡支援 promiscuous mode,一些網路監控程式會需要使用這個裝置,例如 tcpdump、ethereal 等。 8.2.11 USB 裝置
以上為 USB 裝置的驅動程式,請參考井字號之後的註解。如果您要使用 USB 2.0 的裝置,請記得將 ehci 裝置前面的井號移除。
這些是 USB 介面的網路卡,如果您要支援任何一種,都必須將 miisub 的選項打開。
8.3 編譯與安裝 8.3.1 編譯新的核心 修改完核心之後,記得要先存檔,接著可以開始編譯了。編譯核心有二種方式,大部份的時候,我們可以任意使用這二種方法其中之一,使用第二種方式所需要的時間稍微長一點,以下是一些參考的法則:
FreeBSD 支援一種名為 CVSup 更新所有原始碼的方式,更新完原始碼後,要執行 make world 來重新編譯所有程式,這時候就要使用方式二。 方式一: 第一種是使用傳統的編譯方式,以下範例所使用的核心設定檔名為 MYKERNEL,請改成您所使用的檔名。首先我們先使用 config 這個指令會依照我們所修改的設定檔成出編譯核心所需要的檔案。 # cd /usr/src/sys/i386/conf # config MYKERNEL config 這個指令會產生一個編譯所使用的目錄,如果您在執行 config 後發現錯誤訊息,請檢查您所修改的檔案是否有問題,例如語法錯誤等。
接下來就要到編譯用的目錄下。FreeBSD 5.0 以前的目錄和 5.x 後的目錄不一樣哦: FreeBSD 4.x: # cd ../../compile/MYKERNEL/ FreeBSD 5.x 以後: # cd ../compile/MYKERNEL/ 接下來就可以開始進行編譯了: # make depend # make 上面的指令完成後,應該就完成了核心的編譯。如果在過程中出現錯誤的訊息,注意一下錯誤是什麼,並再次修改核心設定檔。一般常見的錯誤可能是某一個設備的設定需要另一個設定,例如網路卡驅動程式要求 miibus,而卻將它移除了。 完成了上述的步驟確定沒問題時,就要安裝新的核心了。使用下列指令加以安裝: # make install 完成安裝後,我們就可以移除編譯過程所產生的檔案了: 如果是 FreeBSD 4.x: # cd / ; rm -rf /usr/src/sys/compile/MYKERNEL 如果是 FreeBSD 5.x 以後: # cd / ; rm -rf /usr/src/sys/i386/compile/MYKERNEL 方式二: 在 FreeBSD 4.2-STABLE 2001年2月以後的版本,我們可以使用新的方式來編譯及安裝新的核心: # cd /usr/src # make buildkernel KERNCONF=MYKERNEL # make installkernel KERNCONF=MYKERNEL 安裝完成後,將編譯過程中使用的檔案刪除: # rm -rf /usr/obj/usr/src/sys/MYKERNEL 最後我們就可以重新開機了,在重新開機之前,我們多下了幾個 sync 這個指令。這個指令的用意是要求系統將所有暫存在記憶體內的資料都寫入硬碟。 # sync;sync;sync;reboot 8.3.2 新的核心有問題 萬一很不幸的,你發現編完核心後,無法開機進入 FreeBSD,這時候就要使用舊的核心來開機了。 如果是 FreeBSD 4.x,請在開機時看到倒數計時的時候,按 Enter 以外的鍵,會出現 boot: 這時候就先打 unload 來將已載入的資料移除,再打 /kernel.old 以使用舊的核心。 boot: unload boot: /kernel.old 萬一連舊的核心也無法使用時,就使用安裝時的核心。 boot: /kernel.GENERIC 如果您使用的是 FreeBSD 5.x 以後,請在看到開機選單時按 6 以進入 loader 模式,並輸入下列指令以使用舊的 kernel 開機: OK unload OK boot /boot/kernel.old 在 FreeBSD 4.x 下,如果你想要刪除壞的核心,由於 kernel 檔有特殊的檔案屬性,因此必須先使用下列指令修改屬性,之後才可以刪除。 # chflags noschg /kernel # rm -rf /kernel 值得注意的是FreeBSD 5.x 後的 kernel 放在 /boot/kernel 目錄下,而舊的核心在 /boot/kernel.old。
|