第八章 編譯核心

核心 (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 基本的設定

machine	i386

這一行是必備的,代表的是使用 i386 的計算機架構 (architecture),也就是 IBM 相容個人電腦。FreeBSD 支援的硬體架構包含了 i386、pc98、alpha、sparc64 等。

cpu	I486_CPU
cpu	I586_CPU
cpu	I686_CPU

上面這四行指的是 CPU 的類型,最近的 CPU 都是 I686_CPU。有些 CPU 如 Cyrix 233Hz CPU 或 Pentume Pro 也都是 I686。我們可以在開機後使用 dmesg 指令或參考 /var/run/dmesg.boot 來看 CPU 類型,並移除不必要的類型。

ident	GENERIC

這個可以說是核心的名字,我們在開機時會看到這個字串,建議將它修改成和您核心設定檔同名,例如,MYKERNEL 或 WEBSERVER 等。

maxusers	0

這個項目在 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 一般選項

#makeoptions	DEBUG=-g

這個參數是用來將核心編輯成除錯模式。加了這個參數之後,核心會包含一些除錯用的資訊,除非您需要做核心開發或協助測試核心程式,否則不需要加入這個參數。除錯模式的核心會比一般核心龐大許多,而且也會影響系統效能。

options	SCHED_4BSD	# 4BSD scheduler

這是傳統的 FreeBSD 排程方式,它會被用來控制系統中所要執行的工作順序。FreeBSD 5.x 之後加入新的排程方法,稱之為 ULE。ULE 主要是為了 SMP 多顆 CPU 排程而設計,但您也可以用來做為一般排程使用。若您想試試 ULE 排程的功能,您可以將 SCHED_4BSD 改為 SCHED_ULE。

options	MATH_EMULATE

這個參數讓 kernel 用軟體的方式模擬浮點運算,如果你的 CPU 不含浮點運算器,你就必須打開此參數。486-DX 以上的 CPU 可以不需要這一行。不過 FreeBSD 所提供的一般浮點模擬器並不是十分精準,如果你沒有浮點運算器卻又需要最好的準確度,建議你把這一行改成 GPL_MATH_EMULATE 來使用 GNU 浮點模擬。因為 GNU 版權的關係,因此 FreeBSD 不以它來當作內定的模擬器。由於目前我們所使用的 CPU 都支援浮點運算,所以在 FreeBSD 5.x GENERAL kernel 預設並未加入這個參數。

options	INET		#InterNETworking
options	INET6		#IPv6 communications protocols

上述這二行是網際網路溝通協定,就算您不打算連上網路,至少必需保留第一個 INET 的設定,因為大多數的程式都會要求使用 lookback 網路 (就是自己的機器和自己的機器溝通)。INET6 指的是 IPv6 協定,如果您要使用 IPv6 則必需加入該參數。

8.2.3 各種檔案系統的支援

options	FFS		#Berkeley Fast Filesystem
options	FFS_ROOT		#FFS usable as root device [請勿刪除]

這是最基本的檔案系統支援,如果你是從硬碟開機的,你一定需要它。FreeBSD 5.x 已經不再需要 FFS_ROOT 這個選項了,所以如果您使用 5.x 並不會看到這一行。

options	SOFTUPDATES	#Enable FFS soft updates support

使用 soft update 可以加速對硬碟的在取速度,我們必須先再核心中加入對於 soft update 的支援,再針對不同的檔案分割區啟動此功能。您可以打指令 mount 來查看各個分割區是否已啟動 soft update,如果沒有,tunefs 這個指令來啟動它。我們在安裝 FreeBSD 時,預設除了根目錄的分割區外,其它的磁碟分割區都會將此功能打開。

options	UFS_ACL		#Support for access control lists

FreeBSD 5.x 才加入這個選項,它是一種權限控制的功能,預設是開啟的狀態。一旦這個選項打開始,並開始使用檔案系統之後,最好不要將它關閉,以避免奇怪的問題產生。

options	UFS_DIRHASH	#Improve performance on big directories

這個選項可以加快 FreeBSD 對於大型目錄的處理速度,但將需要很大的記憶體空間。如果此核心是供大型伺服器使用,加入這個參數可以有比較好的效能。

options	MFS		#Memory Filesystem
options	MD_ROOT		#MD is a potential root device

記憶體映對檔案系統 (Memory-mapped Filesystem)。基本上它容許我們將一塊記憶體空間當做檔案系統來使用,以達到快速存取暫存檔的功能。例如,我們可以分割出一個 MFS 供 /tmp 使用,因為許多程式會利用 /tmp 建立暫時檔案,而 MFS 是將檔案系統掛在記憶體中,對於資料的存取會快很多。不過 FreeBSD 5.x 後已經不再使用 MFS 而改由 md-backed 檔案系統所取代。

options	NFSCLIENT		#Network Filesystem Client
options	NFSSERVER		#Network Filesystem Server
options	NFS			#Network Filesystem (4.x 才有)
options	NFS_ROOT		#NFS usable as /, requires NFSCLIENT

這些選項是傳統的 UNIX 都支援的網路檔案系統,在 FreeBSD 4.x 中,只有 NFS 及 NFS_ROOT 這二個選項。而 FreeBSD 5.x 將 NFS 分成 NFS 客戶端及伺服器二個選項。傳統的 NFS 是使用 UDP 的方式傳輸。但 FreeBSD 的 NFS 支援 TCP 模式,如果您不打算使用 TCP 模式,您可以將這些選項移除。

options	MSDOSFS		#MSDOS Filesystem

支援 MS-DOS 檔案系統。除非你每次開機都要使用 MS-DOS 檔案系統,否則您可以將它移除,系統會在你使用到 MSDOS 檔案系統時自動載入核心模組。除此之外,你也可以使用 mtools來存取 DOS 的軟碟,這並不需要有 MSDOS 檔案系統的支援。

options	CD9660		#ISO 9660 Filesystem
options	CD9660_ROOT	#CD-ROM usable as root, CD9660 required

ISO 9660 是 CD-ROM 的檔案系統,如果你只是偶爾用到 CD-ROM,你可以此功能移除,同樣的,系統會在使用到 CD-ROM 時自動載入核心模組。此外,當我們使用 CD-ROM 聽音樂時並不需要 CD9660 的支援。CD9660_ROOT 只有當我們要拿 ISO 9660 檔案系統做根目錄時才需要,FreeBSD 5.x 後預設已將它移除。

options	PROCFS		#Process filesystem

處理程序檔案系統,它是將一些系統資訊偽裝成檔案系統並掛入 /proc 目錄下,讓一些系統監控軟體 (如 ps 這個指令) 可以從中得到執行中的處理程序的資訊。在 FreeBSD 5.0 以後的版本預設不再使用 /proc,大多數的監控程式也都改成不必使用 /proc 來得到系統資訊。如果您使用的是 FreeBSD 5.x 以後的版本,要使用 PROCFS 還必須加入下列這一個參數:

options	PSEUDOFS		#Pseudo-filesystem framework

這個參數只出現在 FreeBSD 5.x 後,FreeBSD 4.x 並無此參數。

8.2.4 軟硬體相容性設定

options	COMPAT_43		#Compatible with BSD 4.3 [KEEP THIS!]

這是為了要和 4.3 BSD 相容所使用的參數,請不要將它移除,否則有些應用程式可能會出現奇怪的影響。

options	COMPAT_FREEBSD4	#Compatible with FreeBSD4
options	COMPAT_FREEBSD5	#Compatible with FreeBSD5

FreeBSD 6.x 做了許多修改,為了相容於 FreeBSD 4.x、5.x 的系統呼叫 (system call),建議您保參這個設定。

options	SCSI_DELAY=5000	#Delay (in ms) before probing SCSI

這個選項控制了開機時尋找 SCSI 設備時要延遲多久 (MILLISECONDS),預設是 5 秒。有的 SCSI 需要一段時間來進行被始化的動作,當使用 IDE 的硬碟開機時,我們可以忽略這一行。如果您是以 SCSI 硬碟開機,您可以把這一行的數字調小一點以加快開機的速度。當然,如果因此抓不到硬碟,您就必須再把這個值調高一點。

options	UCONSOLE		#Allow users to grab the console

允許使用者抓取console 所印出的訊息。這個選項對於 X window 使用者尤其有用。例如,我們可以使用 xterm -C 來模擬 console,以得到 talk、write (一種在 UNIX 網路聊天的功能) 所傳來的訊息,或是任何從系統發出的訊息。不過 FreeBSD 5.x 後已不再需要這個選項。

options	USERCONFIG		#boot -c editor
options VISUAL_USERCONFIG	#visual boot -c editor

這個選項可以讓我們在開機時編輯開機選項。FreeBSD 5.x 後已不再支援這二個選項,而改用 device.hints,請 man device.hints。

options	KTRACE		#ktrace(1) support

允許使用核心除錯追蹤,通常只有對於核心開發者比較有用。

options	SYSVSHM		#SYSV-style shared memory

這個參數提供 System V 共享記憶體的支援。最常使用 SYSVSHM 的是 X Windows 的 XSHM 功能,有些圖形化的程式用使用它來提高執行速度。如果你使用 X Windows 或是 BBS,你一定要打開此參數。

options	SYSVMSG		#SYSV-style message queues

提供 System V messages 的支援,雖然不常用到,但是它只佔一點點 kernel 的空間。如果你架 bbs 站,這是一定要的啦。

options	SYSVSEM		#SYSV-style semaphores

提供 System V semaphores 的支援,雖然不常用到,但是它只佔一點點 kernel 的空間。您可以使用 ipcs 這個指令來查看是否有應用程式使用 System V 的這些選項,例如 Postsgre SQL 就必須用到。

options	P1003_1B		#Posix P1003_1B real-time extensions
options	_KPOSIX_PRIORITY_SCHEDULING

Real-time extensions added in the 1993 POSIX。有些程式 (如 star office) 會用到它。FreeBSD 5.x 後不再需要 P1003_1B 這個選項。

options	ICMP_BANDLIM	#Rate limit bad replies

這個選項限制 ICMP 封包錯誤回應所使用的頻寬,它可以降低我們被阻斷式攻擊 (denial of service packet) 的危險。如果您使用 FreeBSD 4.x,建議您保留該選項。FreeBSD 5.x 後預設已將此功能打開,所以這個選項在 6.x 已經不需要了。

# To make an SMP kernel, the next two are needed
options	SMP		# Symmetric MultiProcessor Kernel
device	apic		# I/O APIC

這二個選項可以使用多顆 CPU,FreeBSD 5.x 後對於多顆 CPU 的支援有更好的效率,如果您只使用單顆 CPU,可以將此選項關閉。

8.2.5 匯流排及軟碟機

device	isa
device	eisa
device	pci

所有 FreeBSD 支援的硬體一定有上述其中之一的匯流排,isa 匯流排在現在的 i386 機器上已經很少見了。而 eisa 在 586 以後的主機板已經沒見過了。pci 應該是目前的主流,只要您有 pci 介面卡就必須打開此選項。

device	agp		# support several AGP chipsets

這個選項是用來支援 AGP 介面卡,大多數的顯示卡都是 AGP 介面。

#FreeBSD 4.x
device	fdc0 at isa? port IO_FD1 irq 6 drq 2
device	fd0 at fdc0 drive 0
device	fd1 at fdc0 drive 1
# FreeBSD 5.x 以後
device	fdc

以上幾個選項用以支援軟碟機,在 FreeBSD 5.x 後只需要一個 fdc 即可。而使用 FreeBSD 4.x 時,如果您只有一個軟碟機,您可以將 fd1 移除。

8.2.6 IDE 介面裝置

device	ata

這是 ATA 及 ATAPI 的驅動程式,如果您有 ATA 硬碟或光碟機,一定要打開這個選項。如果要支援以下任何 IDE 介面裝置都必須將這個選項打開。

device	atadisk		# ATA disk drives
device	ataraid		# ATA RAID drives
device	atapicd		# ATAPI CDROM drives
device	atapifd		# ATAPI floppy drives
device	atapist		# ATAPI tape drives

以上裝置分別是 ATA 硬碟、ATA 磁碟陣列裝置、IDE 光碟機、IDE 軟碟機、及 IDE 磁帶機。您可以將不必要的裝置移除,例如 IDE 軟碟機等。

options	ATA_STATIC_ID	#Static device numbering

這個選項用來將 ATA 控置單元設定為固定的控制編號,通常用在一些比較舊的設備上。

8.2.7 SCSI 裝置

device	ahb		# EISA AHA1742 family
device	ahc		# AHA2940 and onboard AIC7xxx devices
device	ahd		# AHA39320/29320 and onboard AIC79xx devices
device	amd		# AMD 53C974 (Tekram DC-390(T))
device	isp		# Qlogic family
device	mpt		# LSI-Logic MPT-Fusion
#device	ncr		# NCR/Symbios Logic
device	sym		# NCR/Symbios Logic (newer chipsets + those of `ncr')
device	trm		# Tekram DC395U/UW/F DC315U adapters

device	adv		# Advansys SCSI adapters
device	adw		# Advansys wide SCSI adapters
device	aha		# Adaptec 154x SCSI adapters
device	aic		# Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
device	bt		# Buslogic/Mylex MultiMaster SCSI adapters

device	ncv		# NCR 53C500
device	nsp		# Workbit Ninja SCSI-3
device	stg		# TMC 18C30/18C50

以上這些項目都是 SCSI 介面卡的驅動程式,如果您有 SCSI 介面卡,您可以使用 dmesg 去查看您的介面卡型號,並留下所需的驅動程式即可。如果您只有 IDE 設備,您可以將所有項目移除。

device	scbus # SCSI bus (required for SCSI)
device	ch		# SCSI media changers
device	da		# Direct Access (disks)
device	sa		# Sequential Access (tape etc)
device	cd		# CD
device	pass		# Passthrough device (direct SCSI access)
device	ses		# SCSI Environmental Services (and SAF-TE)

這些是 SCSI 介面的設備,如果您有任何 SCSI 介面的設備或是 USB 硬碟、大姆哥,一定要保留 scbus 這個 SCSI 匯流排的選項。ch 是 SCSI media changer (一種備份用的設備)。如果您有 SCSI 硬碟或是 USB 硬碟,請保留 da 這個選項。而 sa 及 cd 分別是 SCSI 磁帶機及光碟機。

# RAID controllers interfaced to the SCSI subsystem
device	amr		# AMI MegaRAID
device	asr		# DPT SmartRAID V, VI and Adaptec SCSI RAID
device	ciss		# Compaq Smart RAID 5*
device	dpt		# DPT Smartcache III, IV - See NOTES for options
device	iir		# Intel Integrated RAID
device	ips		# IBM (Adaptec) ServeRAID
device	mly		# Mylex AcceleRAID/eXtremeRAID
device	twa		# 3ware 9000 series PATA/SATA RAID


# RAID controllers
device	aac		# Adaptec FSA RAID
device	aacp		# SCSI passthrough for aac (requires CAM)
device	ida		# Compaq Smart RAID
device	mlx		# Mylex DAC960 family
device	pst		# Promise Supertrak SX6000
device	twe		# 3ware ATA RAID

以上是磁碟陣列裝置,如果您沒有任何磁碟陣列,可以將它們全部移除。

8.2.8 基本週邊設備

# atkbdc0 controls both the keyboard and the PS/2 mouse
device	atkbdc		# AT keyboard controller
device	atkbd		# AT keyboard
device	psm		# PS/2 mouse

atkbdc 這個選項用來控制鍵盤及滑鼠。而 atkbd 及 psm 分別為 AT 鍵盤及 PS/2 滑鼠的驅動程式。

device	vga		# VGA video card driver

這是顯示卡的驅動程式。

# FreeBSD 4.x
pseudo-device	splash
# FreeBSD 5.x 以後的版本
device	splash		# Splash screen and screen saver support

啟動時更新螢幕,螢幕保護程式會使用到它。FreeBSD 4.x 及 5.x 後所使用的選項不太一樣喔。

# syscons is the default console driver, resembling an SCO console
# FreeBSD 4.x
device	sc0 at isa? flags 0x100
# FreeBSD 5.x 以後的版本
device	sc

這是預設的 console 驅動程式,如果有螢幕一定要保留這個選項。

# Enable this for the pcvt (VT220 compatible) console driver
#device		vt
#options 	XSERVER		# support for X server on a 
			# vt console
#options 	FAT_CURSOR	# start with block cursor

支援 vt 200 及 vt100 等相容終端機。

# Floating point support - do not disable.
device	npx

這是支援 FreeBSD 浮點運算,請勿移除。

device	agp

這是用來支援 AGP 顯示卡的驅動程式。

# Power management support (see NOTES for more options)
# FreeBSD 4.x
device	apm0	at nexus? disable flags 0x20
# FreeBSD 5.x 以後的版本
#device	apm

支援 APM 電源管理,在 FreeBSD 4.x 下,如果您想要在打指令 shutdown -p 時能自動關機,請將 disable 字樣移除。FreeBSD 5.x 後請將 apm 該行的井字號移除。接著必須在 /etc/rc.conf 中加入下列二行:

apm_enable="YES"
apmd_enable="YES"

 

# Add suspend/resume support for the i8254.
device	pmtimer

這是用來支援 i82454 休眠待命模式。

# PCCARD (PCMCIA) support
# FreeBSD 4.x
device	card
device	pcic0	at isa? irq 0 port 0x3e0 iomem 0xd0000
device	pcic1	at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# FreeBSD 5.x 以後的版本
# Pcmcia and cardbus bridge support
device	cbb		# cardbus (yenta) bridge
device	pccard		# PC Card (16-bit) bus
device	cardbus		# CardBus (32-bit) bus

這些是 PCMCIA 介面卡的驅動程式,如果您使用的是筆記型電腦,請保留這些項目。FreeBSD 5.x 後支援 32 bit 的 PCMCIA 介面,但 FreeBSD 4.x 不支援喔。

# Serial (COM) ports
# FreeBSD 4.x
device	sio0	at isa? port IO_COM1 flags 0x10 irq 4
device	sio1	at isa? port IO_COM2 irq 3
device	sio2	at isa? disable port IO_COM3 irq 5
device	sio3	at isa? disable port IO_COM4 irq 9
# FreeBSD 5.x 以後的版本
device	sio		# 8250, 16[45]50 based serial ports

支援序列埠 Serial (COM) ports。在 FreeBSD 4.x 下,sio0、sio1 等分別代表著 COM1、COM2、COM3、COM4。而 FreeBSD 5.x 後只要一個 sio 即可。通常我們只有 COM1 及 COM2,如果您有內接式的數據機,您可能要保留 COM3 或 COM4。

# Parallel port
device	ppc
device	ppbus		# Parallel port bus (required)
device	lpt		# Printer
device	plip		# TCP/IP over parallel
device	ppi		# Parallel port interface device
#device	vpo		# Requires scbus and da

這些是並列埠及其它並列埠裝置 (如列表機) 的驅動程式。

8.2.9 網路卡設定

device	de		# DEC/Intel DC21x4x (``Tulip'')
device	em		# Intel PRO/1000 adapter Gigabit 
device	ixgb		# Intel PRO/10GbE Ethernet Card
device	txp		# 3Com 3cR990 (``Typhoon'')
device	vx		# 3Com 3c590, 3c595 (``Vortex'')

這些是網路卡的驅動程式,您可以使用 dmesg 去查看自己的網路卡型號,並保留所需要的型號設定即可。

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device	miibus		# MII bus support

如果您使用的是下列這些 PCI 10/100 的網路卡,請保留 MII bus 這個選項。

device	bfe		# Broadcom BCM440x 10/100 ethernet
device	bge		# Broadcom BCM570xx Gigabit Ethernet
device	dc		# DEC/Intel 21143 and various workalikes
device	fxp		# Intel EtherExpress PRO/100B (82557, 82558)
device	lge		# Level 1 LXT1001 gigabit ethernet
device	nge		# NatSemi DP83820 gigabit ethernet
device	pcn		# AMD Am79C97x PCI 10/100 (precedence over 'lnc')
device	re		# RealTek 8139C+/8169/8169S/8110S
device	rl		# RealTek 8129/8139
device	sf		# Adaptec AIC-6915 (``Starfire'')
device	sis		# Silicon Integrated Systems SiS 900/SiS 7016
device	sk		# SysKonnect SK-984x and SK-982x gigabit ethernet
device	ste		# Sundance ST201 (D-Link DFE-550TX)
device	ti		# Alteon Networks Tigon I/II gigabit ethernet
device	tl		# Texas Instruments ThunderLAN
device	tx		# SMC EtherPower II (83c170 ``EPIC'')
device	vge		# VIA VT612x gigabit ethernet
device	vr		# VIA Rhine, Rhine II
device	wb		# Winbond W89C840F
device	xl		# 3Com 3c90x (``Boomerang'', ``Cyclone'')

上列為 PCI 的網路卡,請使用 dmesg 查看您的網路卡型號,並保留所需的型號即可。請注意上列網路卡都必須要有 MII bus 的支援。

# ISA Ethernet NICs.  pccard nics included.
device	cs		# Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
device	ed		# NE[12]000, SMC Ultra, 3c503, DS8390 cards
device	ex		# Intel EtherExpress Pro/10 and Pro/10+
device	ep		# Etherlink III based cards
device	fe		# Fujitsu MB8696x based cards
device	ie		# EtherExpress 8/16, 3C507, StarLAN 10 etc.
device	lnc		# NE2100, NE32-VL Lance Ethernet cards
device	sn		# SMC's 9000 series of ethernet chips
device	xe		# Xircom pccard ethernet
# ISA devices that use the old ISA shims
#device	le

ISA介面的網路卡。如果很不幸的你的網路卡是 ISA 介面,建議你換成 PCI 的介面卡,否則你應該要先知道你使用的 irq 及 port。如果你的型號是 ed0 ,則請勿移除上述的 miibus。

# Wireless NIC cards
device	wlan		# 802.11 support
device	an		# Aironet 4500/4800 802.11 wireless NICs. 
device	awi		# BayStack 660 and others
device	ral		# Ralink Technology RT2500 wireless NICs.
device	wi		# WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device	wl		# Older non 802.11 Wavelan wireless NIC.

這些是無線網路卡。

8.2.10 虛擬裝置

device random # Entropy device
# FreeBSD 4.x
pseudo-device	loop	# Network loopback
# FreeBSD 5.x 以後的版本
device	loop		# Network loopback

這二個虛擬的裝置分別用來做隨機運算及 loopback 網路,請保留這二個選項。

device	mem		# Memory and kernel memory devices

這是系統的記憶體裝置。

device	io		# I/O device

這是支援 user space 程式直接存取系統 I/O,X Windows 需要這個項目。

device	radom		# Entropy device

這是用來產生隨機密碼數字之類的裝置。

# FreeBSD 4.x
pseudo-device	ether	# Ethernet support
# FreeBSD 5.x 以後的版本
device	ether		# Ethernet support

這是用來支援乙太網路,只要您有網路卡都必須保留這個項目。

# FreeBSD 4.x
pseudo-device	sl 1
# FreeBSD 5.x 以後的版本
device	sl		# Kernel SLIP

sl 用以支援 SLIP,SLIP已經幾乎被 PPP 所取代,ppp 可以更簡單、快速的建立 modem-to-modem 連線。在 sl 後面的數字是要模擬多少條 SLIP。

# FreeBSD 4.x
pseudo-device	ppp 1	# Kernel PPP
# FreeBSD 5.x 以後的版本
device	ppp		# Kernel PPP

支援 ppp 撥接連線。

# FreeBSD 4.x
pseudo-device	tun	# Packet tunnel.
# FreeBSD 5.x 以後的版本
device	tun		# Packet tunnel.

tun 會被 ppp 所使用,如果您有撥接網路 (含 ADSL 撥號) 一定要保留這個選項。

# FreeBSD 4.x
pseudo-device	pty	# Pseudo-ttys (telnet etc)
# FreeBSD 5.x 以後的版本
device	pty		# Pseudo-ttys (telnet etc)

最大的 ttys,如 telnet 同時上線最大人數,在 FreeBSD 4.x 預設是 16。你可以在 pty 的後面加上數字來提高人數,最大是 256。FreeBSD 5.x 後則毋需擔心這個問題。

# FreeBSD 4.x
pseudo-device	md	# Memory "disks"
# FreeBSD 5.x 以後的版本
device	md		# Memory "disks"

用來支援虛擬的 Memory disk,這是一種將某塊記憶體拿來當成磁碟機使用的虛擬裝置。

# FreeBSD 4.x
pseudo-device	gif	# IPv6 and IPv4 tunneling
# FreeBSD 5.x 以後的版本
device	gif		# IPv6 and IPv4 tunneling

支援 IPv6 和 IPv4 之間的溝通。

# FreeBSD 4.x
pseudo-device	faith 1	# IPv6-to-IPv4 relaying (translation)
# FreeBSD 5.x 以後的版本
device	faith		# IPv6-to-IPv4 relaying (translation)

用以支援 IPv6 和 IPv4 之間的轉換。

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# FreeBSD 4.x
pseudo-device	bpf	# Berkeley packet filter
# FreeBSD 5.x 以後的版本
device	bpf		# Berkeley packet filter

這是 Berkeley Packet Filter,可以讓我們的網路卡支援 promiscuous mode,一些網路監控程式會需要使用這個裝置,例如 tcpdump、ethereal 等。

8.2.11 USB 裝置

device	uhci		# UHCI PCI->USB interface
device	ohci		# OHCI PCI->USB interface
device	ehci		# EHCI PCI->USB interface (USB 2.0)
device	usb		# USB Bus (required)
#device	udbp		# USB Double Bulk Pipe devices
device	ugen		# Generic
device	uhid		# "Human Interface Devices"
device	ukbd		# Keyboard
device	ulpt		# Printer
device	umass		# Disks/Mass storage - Requires scbus and da
device	ums		# Mouse
device	ural		# Ralink Technology RT2500USB wireless NICs
device	urio		# Diamond Rio 500 MP3 player
device	uscanner	# Scanners

以上為 USB 裝置的驅動程式,請參考井字號之後的註解。如果您要使用 USB 2.0 的裝置,請記得將 ehci 裝置前面的井號移除。

# USB Ethernet, requires mii
device	aue		# ADMtek USB ethernet
device	axe		# ASIX Electronics USB ethernet
device	cdce		# Generic USB over Ethernet
device	cue		# CATC USB Ethernet
device	kue		# Kawasaki LSI USB Ethernet
device	rue		# RealTek RTL8150 USB Ethernett

這些是 USB 介面的網路卡,如果您要支援任何一種,都必須將 miisub 的選項打開。

小提示

看了這麼多項目頭都暈了。如果您不知道怎麼修改,我的建議是:

  1. 移除不必要的網路卡驅動程式。
  2. 移除不必要的 SCSI 裝置。但不要移除 scbus、ch、da 等項目。
  3. 移除不必要的 IDE 裝置,如 IDE 軟碟。
  4. 如果您不使用 USB,也可以將 USB 裝置移除。

8.3 編譯與安裝

8.3.1 編譯新的核心

修改完核心之後,記得要先存檔,接著可以開始編譯了。編譯核心有二種方式,大部份的時候,我們可以任意使用這二種方法其中之一,使用第二種方式所需要的時間稍微長一點,以下是一些參考的法則:

FreeBSD 支援一種名為 CVSup 更新所有原始碼的方式,更新完原始碼後,要執行 make world 來重新編譯所有程式,這時候就要使用方式二。

方式一:

第一種是使用傳統的編譯方式,以下範例所使用的核心設定檔名為 MYKERNEL,請改成您所使用的檔名。首先我們先使用 config 這個指令會依照我們所修改的設定檔成出編譯核心所需要的檔案。

# cd /usr/src/sys/i386/conf
# config MYKERNEL

config 這個指令會產生一個編譯所使用的目錄,如果您在執行 config 後發現錯誤訊息,請檢查您所修改的檔案是否有問題,例如語法錯誤等。

小提示

如果您想要知道您修改過什麼,可以使用下列指令來看二個檔案的差異:

# diff -ub GENERIC MYKERNEL

這樣一來,您就可以看看是改了什麼東西造成錯誤的發生,不錯吧!

接下來就要到編譯用的目錄下。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

小提示

如果您一直卡在 compile kernel 無法成功,不要氣餒,其實使用 GENERIC kernel 也沒什麼不好。您可以先將時間花在系統其他的設定上,等有時間再回來研究,這樣比較不會因為一點小問題拖延您學習的時間。