配置FreeBSD的內核

9   配置FreeBSD的內核

9.1概要

內核是FreeBSD操作系統的核心。它用來管理內存,執行安全控制,網絡,磁盤訪問等等。雖然現在FreeBSD可以更多地進行動態配置,但有時你還是需要重新配置和編譯你的內核。

讀完這章,你將瞭解到:

             爲什麼需要建立一個定製的內核。

             如何寫一個內核配置文件,或修改已存在的配置文件。

             如何使用內核配置文件創建和建立一個新的內核。

             如何安裝一個新內核。

             如何在/dev中創建設備文件的記錄。

             如何解決一些常見的問題。

9.2爲什麼要定製一個的內核?

通常,FreeBSD有一個叫做“monolithic”(高度集成)的內核。這意味着內核是一個巨大的程序,支持很多的設備,如果你想要修改內核的行爲,必須重新編譯一個新的內核,然後用新內核啓動系統。

今天,FreeBSD已經將內核的功能分成了很多的模塊,可以動態地加載和卸載內核模塊。這樣可以快速地調整內核以支持新加入的設備(如在手提計算機中的PCMCIA卡),或加入最初內核編譯時沒有加入的功能。通俗地來講,這種功能叫做KLD

雖然這樣,作一些靜態內核的配置也是必需的。有時,由於有些功能與內核的聯繫非常緊密,所以它不能被動態地加載。另外,有些人不太願意爲實現某些功能而寫一個動態加載的內核模塊,編譯一個靜態內核可能更簡單。

定製內核基本上是每一個UNIX用戶必須經歷的一關。這樣做將會對你的FreeBSD系統帶來很多好處。不像GENERIC內核,它需要支持很廣泛的硬件設備,而定製的內核將只支持你機器的硬件設備,這樣會帶來很多好處:

             快速啓動。既然系統內核只檢測你機器上的硬件,那它所花費的啓動時間將大大減少。

             較少的內存使用。一個定製的內核會比GENERIC內核使用較少的內存。這一點非常重要,因爲內核在處理時必須經常使用內存。所以,一個定製的內核對於內存較少的機器來說是非常有用的。

             額外的硬件支持。一個定製的內核允許你加入像聲卡之類設備的支持,而這恰恰是GENERIC內核所做不到的。

9.3 建立並安裝一個定製的內核

首先,讓我們先來看一下建立內核的目錄。所有提到的目錄都在/usr/src/sys中,也可以通過/sys訪問。有許多子目錄充當了內核的不同部分。但最重要的是/arch/conf,你可以在這兒配置內核,然後進行編譯。這裏的arch也可能是i386alphapc98。在一個特殊的架構目錄中,所有的東西都是爲這個架構服務的,其他部分的代碼是與所有平臺共享的。注意一下這個目錄的邏輯結構,所有支持的硬件驅動程序、文件系統、參數選項,都放在各自的目錄下。另外,所有放在i386目錄下的是隻跟PC硬件有關的,而i386目錄之外的其他目錄,則是FreeBSD可能移植到的平臺會共享到的部分。

注意:如果你的系統沒有這個/usr/src/sys目錄,那麼內核源代碼就沒有被安裝。最快速的安裝方式是以root登陸,然後運行/stand/sysinstall,選擇configure,接着是Distributions,下來是src,最後sys

接下來,切換到arch/conf目錄,拷貝GENERIC配置文件,並給這個文件起一個容易辨認的名稱,它就是你的內核名稱。例如:

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

# cp GENERIC MYKERNEL

通常,這個名稱是大寫的,如果正維護着多臺不同硬件的FreeBSD機器,以你機器的域名來命名是非常好的主意。我們把它命名爲MYKERNEL就是這個原因。

注意:你必須以root帳戶登陸再執行下面的命令,否則你會沒有權限,而導致錯誤。

現在,用你喜歡的文本編輯器編輯MYKERNEL。如果你是初學者,那唯一能用的編輯器可能就是vi,它由於太複雜而不在這兒介紹了,但在參考書目中有許多書會介紹到它。然而,FreeBSD中最容易的編輯器是ee,如果你是一個工程師,它是一個非常好的選擇。你可以很自由地改變註釋行來反映你的配置情況,或你在GERNERIC中已經做的變化。如果你在Sunos或其他BSD系統下定製過內核,那這個文件中的絕大部分將對你非常熟悉。如果你使用的是諸如DOS這樣的系統,那GENERIC配置文件看起來就非常困難,所以在下面的配置文件章節將慢慢地、仔細地進行介紹。

注意:要經常檢查文件/usr/src/UPDATING,在你執行任何修改之前,記得要用最新發布的源代碼來同步你的源代碼樹。在這個文件中所有重要的升級都要記下來。/sur/src/UPDATING總是符合你的FreeBSD源代碼版本,而且總是比手冊所說的信息更加精確。

你現在必須編譯內核的源代碼。你可能需要執行兩種方法,這依賴於你如何重新編譯內核,和你正使用的FreeBSD的版本。

             如果你只安裝內核源代碼,使用方法1

             如果你運行的是FreeBSD 4.0以前的版本的話,你不需要升級到FreeBSD 4.0或更高版本,只要使用方法1

             如果你在沒有升級源代碼的情況下編譯一個新內核(也許你只想爲內核添加一個新的選項,如IPFIREWALL),可以使用任何一種方法。

             如果你正在重新建立的內核作爲“make world”進程的一部分,需要使用方法2

方法1.傳統方法建立一個內核

1.運行config來產生內核源代碼。

# /usr/sbin/config MYKERNEL

2.進入建立內核的目錄。

# cd ../../compile/ MYKERNEL

3.編譯內核。

# make depend

# make

4.安裝新的內核。

# make install

 

方法2.新的方法來建立內核

1.進入/usr/src目錄。

# cd /usr/src

2.編譯內核。

# make buildkernel KERNCONF= MYKERNEL

3.安裝新內核。

# make installkernel KERNCONF=MYKERNEL

注意:FreeBSD 4.2和更老的版本中,你必須用KERNEL=替換KERNCONF=200122日以後生成的4.2-STABLE就可以認出KERNCONF=了。

如果你還沒有升級源代碼樹,那你應當按順序執行:

configmake dependmakemake install

新的內核將會被拷貝到/kernel目錄下,而舊的內核將會被移到/kernel.old。現在,關閉系統,然後重新用內核啓動系統。如果發生錯誤,在這章結尾會有一些故障的解決辦法。如果新內核不能啓動,請務必讀一下有關如何恢復的章節。

注意:如果你已經加入了新的設備(如聲卡),你可能在使用之前,要先在你的/dev目錄下加入這些設備節點。

9.4配置文件

內核設置的格式是很簡單的,每一行包含了一個關鍵詞(keyword)與一個或多個參數,而大多數的設置都只包含一個參數。#號之後的文字都是註釋,會被程序忽略掉。下面的每個小節,將依次介紹每個列在GENERIC中的參數,雖然各相關主題(如網絡)的關鍵詞會放在同一小節,但是這些關鍵詞可能位於GENERIC的很多地方。詳細地列出各個選項(option),而LINT列出了絕大部分的選項(option),比起在同一目錄下的GENERIC,有更詳細的解釋。如果你不能確定某一行設定的目的是否必要,請先看看LINT

目前內核在處理各個選項上正轉到一個比較好的模式。一般地,設置文件中的各個選項都轉換到內核程序的Makefile中,屬於CFLAGS的一個-D參數。時間一長,就造成了一個選項處理機制的問題,沒有人知道在哪個文件中參考使用了那個選項。

在新的機制中,使用#ifdef來參考選項的程序代碼是存放在由執行config時所產生的opt_foo.h。由config所產生的有效的選項清單存儲在兩個文件裏:獨立於系統架構的選項放在/sys/conf/options,與系統架構有關的選項則放在/sys/arch/conf/options.arch,其中arch的一個例子便是i386

數字的引號方式(Quoting numbers):目前所有FreeBSD版本,包括3.x,其內核設置文件中如果有任何屬於文字形式的數字(i386),必須用雙引號引起來,不然執行config時會出錯。

如果數字是表示數目、個數,如maxuser 64這個設置,則不要加雙引號。目前FreeBSD 4.x版本已經去掉上述限制,不論是哪種形式的數字都不需要加雙引號。本章的例子,在文字形式的數字前後仍加了雙引號(“”),如果你使用FreeBSD 4.x版本,請自動去除雙引號。

下面是一個帶有很多額外註釋的GENERIC內核配置文件的例子。這個例子與/usr/src/sys/i386/conf/GENERIC非常相似。有關內核配置的最詳細的選項,請參看/usr/src/sys/i386/conf/LINT

    #

    # GENERIC -- Generic kernel configuration file for FreeBSD/i386

    #

    # For more information on this file, please read the handbook section on

    # Kernel Configuration Files:

    #

    #    http://www.FreeBSD.org/handbook/kernelconfig-config.html

    #

    # The handbook is also available locally in /usr/share/doc/handbook

    # if you've installed the doc distribution, otherwise always see the

    # FreeBSD World Wide Web server (http://www.FreeBSD.ORG/) for the

    # latest information.

    #

    # An exhaustive list of options and more detailed explanations of the

    # device lines is also present in the ./LINT configuration file. If you are

    # in doubt as to the purpose or necessity of a line, check first in LINT.

    #

    # $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246 2000/03/09 16:32:55 jlemon Exp $

 

下面這個選項在每個內核中都要有:

machine        i386

這是機器的架構。它可能是i386alphapc98

cpu         I386_CPU

cpu               I486_CPU

cpu               I586_CPU

cpu         I686_CPU

上面的選項指出了在你的系統中所用的CPU類型。你可以使用多個CPU類型(例如,你不能確定使用的是I586_CPU還是I686_CPU),然而,對於一個定製的內核,最好是隻指定你所擁有的CPU類型。如果你不能確定CPU類型,可以使用dmesg命令來看看你的啓動信息。

Alpha結構的機器使用下面的選項:

cpu          EV4

cpu          EV5

如果你正使用一臺Alpha機器,應當使用上面的CPU類型。

ident         GENERIC

這是一個內核的標識符。你應該自己命名一個容易辨認的名稱,以有別於GENERIC的名稱——GENERIC。放在ident後的參數,將在你用這個內核啓動時顯示在屏幕上。如果你同時設置了幾個內核,採用不同的名稱是個不錯的主意。(例如,你想定製一個實驗性質的內核)。

       maxusers          32

這個設置的大小值定義了重要的系統表(system tables)。這個數值粗略地假設你的機器同時會有多少用戶。然而,在一般情況下,你最少要設置4個以上,特別是你要執行X Window或是編譯程序。原因是maxusers值決定了系統同時可有多少個進程(process),其算法是20 + 16 * maxusers。如果你設置maxusers值是1,則你的系統只能同時存在36個進程,包括18(或更多)系統啓動要佔去的進程。如果你執行了X Window,則又要用掉15個以上。甚至閱讀一個man page也會使用九個進程來過濾、解壓縮、然後顯示文件。設置maxusers=4,則系統可以同時有84個進程,對任何人應該都是足夠的。當你執行程序時,得到像是“proc table full”這樣的錯誤信息,或者你要建一個同時會有很多人來訪問的網站(ftp.FreeBSD.org)時,你就要增加這個設置的值,然後重新編譯內核。

注意: maxusers這個參數並不限制可以登陸你係統的用戶數目。它只是系統中用戶可以最多執行的程序個數。有一個關鍵詞的值則真的限制了可以同時遠程連接(remote logins)的人數:pseudo-device pty 16

    # Floating point support - do not disable.

    device          npx0     at nexus? port IO_NPX irq 13

npx0是連接FreeBSD中浮點運算處理器的一個接口。不論你用硬件的浮點運算處理器還是使用軟件仿真,都需要這個設置。這個設置並不是可有可無的。

    # Pseudo devices - the number indicates how many units to allocate.

    pseudo-device   loop          # Network loopback

loop是一個通用的TCP/IP接口。如果你用telnetftp連到localhost(等同於127.0.0.1),則該連接會通過這個虛擬設備連回來。這是一定要有的設置,請不要去掉。

    #makeoptions     DEBUG=-g                   #Build kernel with gdb(1) debug symbols

    options          MATH_EMULATE      #Support for x87 emulation

如果你的計算機沒有浮點運算處理器(386486SX),可以加入這行,使得內核提供軟件仿真的浮點運算處理器。如果你用的是486DX或是386SX486SX(還加裝了387487芯片)或更高的(PentiumPentium II)則不需要這行設置。

注意: 這個仿真的浮點運算處理器並不是很精確。如果你沒有浮點運算器,還需要較高的精度,可以改用GPL_MATH_EMULATE參數,這將會使用GNU的浮點運算仿真器。至於爲什麼這個仿真器不是系統默認值,是因爲GNU使用許可的關係。

    options          INET          #InterNETworking

提供網絡支持。就算你不打算連上網絡,還是要留着這個選項。對於絕大部分的程序,這個選項是一定要有的。

    options          INET6          #IPv6 communications protocols

這個啓用IPv6通信協議。

    options          FFS                   #Berkeley Fast Filesystem

    options          FFS_ROOT            #FFS usable as root device [keep this!]

最基本的硬盤文件系統。如果你要從硬盤啓動,就留着。

    options          MFS            #Memory Filesystem

    options          MD_ROOT      #MD is a potential root device

內存映射(Memory-mapped)文件系統。提供RAM disk,以供需要快速訪問的資料或是暫存資料用。如果你分了很大的swap空間,使用這個選項可以給你不少好處。把/tmp掛到MFS分區是一個相當好的想法,因爲不少程序都會在此暫存資料。要把/tmp掛到MFS RAM disk,可以修改/etc/fstab,加入以下一行:

    /dev/ad1s2b    /tmp mfs rw 0 0

現在重新啓動系統,或是鍵入mount /tmp命令:

    options          NFS                 #Network Filesystem

    options          NFS_ROOT           #NFS usable as root device NFS required

網絡文件系統(NFS),除非你要從網絡上的其他機器加載目錄,不然可以用 # 號註釋掉這行設置。

    options          MSDOSFS      #MSDOS Filesystem

MS-DOS文件系統。除非你要在啓動時掛上一個DOS格式的硬盤,不然你可以放心地把這行註釋掉。如前所述,在你第一次掛上一個DOS分區時,內核將會自動加載模塊來支持它。此外,mtools是個相當不錯的軟件(可在ports裏面找到),可以讓你在訪問DOS磁盤時,不需要掛上或卸載軟盤(而且也不需要MSDOSFS的支持)

    options          CD9660               #ISO 9660 Filesystem

    options          CD9660_ROOT         #CD-ROM usable as root CD9660 required

CD-ROM使用的ISO 9660文件系統。如果你沒有光驅,或是很少用光驅,可以註釋掉這一行(內核會在第一次加載時動態加載模塊以支持它)。音樂CD則不會用到這個文件系統。

    options          PROCFS       #Process filesystem

進程文件系統(Process filesystem)。這是一個虛擬的文件系統,掛在/proc下,允許一些程序,像ps來讀取資料,提供你正在執行的進程的信息。

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

使系統兼容4.3BSD。不要去掉這一行,不然有些程序將無法正常運行。

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

這行設置告訴內核等待15秒鐘,以供SCSI控制器掃描你計算機上的SCSI設備。如果你只有IDE硬盤,你可以不理會這個設置,不然你可能會想要降低這個值,也許會降到五秒,以增加啓動的速度。如果你發現降低後,FreeBSD無法正確辨認你的SCSI設備,那麼你應該提高這個值,延長等待時間。

    options          UCONSOLE            #Allow users to grab the console

允許用戶找到控制檯(console)信息,對X Window很有用。舉例來說,你可以輸入xterm -C來打開一個控制檯xterm,這個窗口將顯示任何writetalk等命令的信息,以及你發出去的信息。當然,kernel產生的信息也會在這裏出現。

    options          USERCONFIG          #boot -c editor

這個選項允許你從啓動菜單啓動配置編輯器。

    options          VISUAL_USERCONFIG   #visual boot -c editor

這個選項允許你從啓動菜單啓動虛擬配置編輯器。

    options          KTRACE              #ktrace support

這個選項啓用內核進程跟蹤,在調試時很有用。

    options          SYSVSHM             #SYSV-style shared memory

提供System V共享內存(SHM)的支持,最常用到SHM的應該是X WindowXSHM延伸,不少繪圖相關程序(像影片播放程序XAnimLinux DOOM遊戲)會自動使用SHM來提供額外的速度。如果你要使用X Window,你最好加入這個選項。

    options          SYSVSEM             #SYSV-style semaphores

支持System V semaphores,不常用到,只在kernel中佔用幾百個字節的空間。

    options          SYSVMSG             #SYSV-style message queues

支持System V messages,一樣的,只佔用kernel幾百字節的空間。

注意: ipcs命令可以顯示出任何使用到上述三個System V功能的進程。

    options     P1003_1B        #Posix P1003_1B real-time extensions

    options     _KPOSIX_PRIORITY_SCHEDULING

1993 POSIX中添加的實時擴展。在ports collection中某些應用程序會用到這些(如Star Office)。

    options        ICMP_BANDLIM        #Rate limit bad replies

這個選項啓用ICMP的帶寬限制的錯誤響應。使用這個選項可以幫助你保護你的機器免受拒絕式服務攻擊。

    # To make an SMP kernel the next two are needed

    #options        SMP                     # Symmetric MultiProcessor Kernel

    #options        APIC_IO                 # Symmetric (APIC) I/O

上面兩個選項都支持SMP

    device          isa

所有FreeBSD支持的PC都需要這行設置。如果你使用IBM PS/2 (微信道架構)計算機,則你無法在該機器上執行FreeBSD

    device          eisa

如果你的主機板上有EISA總線,加入這個設置。使用這個選項可以自動掃描並設置所有連接在EISA總線上的設備。

    device          pci

如果你的主板有PCI總線,就加入這個選項。使用這個選項可以自動掃描PCI卡,並在PCIISA之間建立通路。

    # Floppy drives

    device          fdc0        at isa? port IO_FD1 irq 6 drq 2

    device          fd0         at fdc0 drive 0

    device          fd1         at fdc0 drive 1

軟盤控制器:fd0A: 盤,fd1B: 盤。

    device          ata

這個驅動器支持所有ATAATAPI設備。你只要在內核中加入device ata選項,就可以讓內核支持現代計算機上的所有PCI ATA/ATAPI設備。

    device          atadisk                 # ATA disk drives

這個是ATAPI磁盤驅動器所必須的。

    device          atapicd                 # ATAPI CDROM drives

這個是ATAPI CDROM驅動器所必須的。

    device          atapifd                 # ATAPI floppy drives

這個是ATAPI 軟盤驅動器所必須的。

    device          atapist                 # ATAPI tape drives

這個是ATAPI 磁帶機驅動器所必須的。

    options         ATA_STATIC_ID           #Static device numbering

這個可以靜態分配控制器的編號,也可以動態分配設備的編號。

    # ATA and ATAPI devices

    device          ata0        at isa? port IO_WD1 irq 14

    device          ata1        at isa? port IO_WD2 irq 15

上面的選項用在比較老的,非PCI的系統中。

    # SCSI Controllers

    device          ahb          # EISA AHA1742 family

    device          ahc          # AHA2940 and onboard AIC7xxx devices

    device          amd        # AMD 53C974 (Teckram DC-390(T))

    device          dpt           # DPT Smartcache - See LINT for options!

    device          isp           # Qlogic family

    device          ncr          # NCR/Symbios Logic

    device          sym        # NCR/Symbios Logic (newer chipsets)

    device          adv0       at isa?

    device          adw

    device          bt0        at isa?

    device          aha0       at isa?

    device          aic0       at isa?

SCSI控制器。可以註釋掉你係統中沒有的設備。如果你只有IDE設備,你可以把這些一起刪掉。

    # SCSI peripherals

    device          scbus        # SCSI bus (required)

    device          da           # Direct Access (disks)

    device          sa           # Sequential Access (tape etc)

    device          cd           # CD

    device          pass          # Passthrough device (direct SCSI

    access)

SCSI外圍設備。也可以像上面一樣操作。

    # RAID controllers

    device          ida           # Compaq Smart RAID

    device          amr          # AMI MegaRAID

    device          mlx          # Mylex DAC960 family

支持RAID控制器。如果你沒有這些,可以把它們註釋掉或是刪掉。

    # atkbdc0 controls both the keyboard and the PS/2 mouse

    device          atkbdc0    at isa? port IO_KBD

鍵盤控制器atkbdc提供AT鍵盤輸入以及PS/2指針設備的I/O服務。鍵盤驅動程序atkbdPS/2鼠標驅動程序psm需要這個控制器,所以不要刪除它。

    device          atkbd0     at atkbdc? irq 1

atkbd驅動程序,與atkbdc控制器一起使用,提供連接到AT鍵盤控制器的AT 84鍵盤與AT加強型鍵盤的訪問服務。

    device          psm0       at atkbdc? irq 12

如果你的鼠標連接到PS/2鼠標端口,就使用這個設備驅動程序。

    device          vga0        at isa?

顯卡驅動。

    # splash screen/screen saver

    pseudo-device          splash

在啓動時的啓動畫面!屏幕保護也需要這個。

    # syscons is the default console driver resembling an SCO console

    device          sc0          at isa?

sc0是默認的控制檯驅動程序,絕大部分全屏幕程序都通過termcap這類terminal database library來訪問控制檯,因此不論你用這個驅動程序或是VT220兼容控制檯驅動程序vt0,這中間並沒有太大差別。如果使用sc0,且你在登陸系統後,執行全屏幕程序時遇到問題,請將你的TERM設置成“scoansi”

    # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver

    #device          vt0     at isa?

    #options         XSERVER                 # support for X server on a vt console

    #options         FAT_CURSOR              # start with block cursor

    # If you have a ThinkPAD uncomment this along with the rest of the PCVT lines

    #options         PCVT_SCANSET=2   # IBM keyboards are non-std

這是一個兼容VT220的控制檯驅動程序,並向下兼容VT100/102。在部分與sc0相沖突的筆記本計算機上,這個驅動程序運作良好。當然,當你登陸系統時,記得設置TERM參數爲vt100或是vt220。當連接到網絡上許多計算機時,這個驅動程序也常是很有用的,這是因爲許多的計算機上的termcap或是terminfo並沒有sc0的資料——而vt100的資料幾乎所有的平臺上都支持。

    # Power management support (see LINT for more options)

    device          apm0     at nexus? disable flags 0x20  # Advanced Power Management

高級電源管理支持。使用在膝上型計算機上。

    # PCCARD (PCMCIA) support

    device          card

    device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000

    device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable

PCMCIA支持。如果你使用膝上型計算機,你需要這個。

    # Serial (COM) ports

    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

sio0sio3可看作是MS-DOS系統中的COM1COM4。如果你使用內置式的數據機,且佔用COM4,而你的系統又有COM2,則你必須修改調制解調器的IRQ2(IRQ 2IRQ 9是一樣的),這樣你才能正常使用調制解調器。部分顯示卡(特別是使用S3芯片的卡),用到0x*2e8這個I/O地址,而一些便宜的串行卡,沒辦法正確譯碼16位的I/O尋址空間,因此兩張卡會衝突,導致COM4無法正常使用。每個串行口都要有一個唯一的IRQ,所以COM3COM4默認的IRQ將無法使用。

    # Parallel port

    device          ppc0    at isa? irq 7

ISA-bus並行接口

    device          ppbus      # Parallel port bus (required)

提供並行總線的支持。

    device          lpt        # Printer

提供並口打印機的支持。

注意: 要使用並口打印機,就必須同時加入上面三行設置。

    device          plip       # TCP/IP over parallel

這是針對並行網絡接口的驅動器。

    device          ppi        # Parallel port interface device

普通用途的I/O (“geek port”) + IEEE1284 I/O

    #device         vpo        # Requires scbus and da

這是針對Iomega Zip驅動器的。它要求scbusda的支持。最好的執行效果是工作在EPP 1.9模式。

    # PCI Ethernet NICs.

    device          de           # DEC/Intel DC21x4x (``Tulip'')

    device          fxp          # Intel EtherExpress PRO/100B (82557 82558)

    device          tx            # SMC 9432TX (83c170 ``EPIC'')

    device          vx           # 3Com 3c590 3c595 (``Vortex'')

    device          wx         # Intel Gigabit Ethernet Card (``Wiseman'')

多種PCI網卡驅動器。註釋或刪除你係統中沒有的設備。

    # PCI Ethernet NICs that use the common MII bus controller code.

    device          miibus     # MII bus support

MII總線支持對於一些PCI 10/100 Ethernet NIC來說是必需的。

    device          dc           # DEC/Intel 21143 and various workalikes

    device          rl            # RealTek 8129/8139

    device          sf            # Adaptec AIC-6915 (``Starfire'')

    device          sis           # Silicon Integrated Systems SiS 900/SiS 7016

    device          ste           # Sundance ST201 (D-Link DFE-550TX)

    device          tl             # Texas Instruments ThunderLAN

    device          vr           # VIA Rhine Rhine II

    device          wb         # Winbond W89C840F

    device          xl            # 3Com 3c90x (``Boomerang'' ``Cyclone'')

使用MII總線控制器代碼的驅動器。

    # ISA Ethernet NICs.

    device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000

    device          ex

    device          ep

    # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really

    # exists only as a PCMCIA device so there is no ISA attachment needed

    # and resources will always be dynamically assigned by the pccard code.

    device          wi

    # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will

    # work for PCMCIA and PCI cards as well as ISA cards set to ISA PnP

    # mode (the factory default). If you set the switches on your ISA

    # card for a manually chosen I/O address and IRQ you must specify

    # those parameters here.

    device          an

    # The probe order of these is presently determined by i386/isa/isa_compat.c.

    device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000

    device          fe0    at isa? port 0x300

    device          le0    at isa? port 0x300 irq 5 iomem 0xd0000

    device          lnc0   at isa? port 0x280 irq 10 drq 0

    device          cs0    at isa? port 0x300

    device          sn0    at isa? port 0x300 irq 10

    # requires PCCARD (PCMCIA) support to be activated

    #device         xe0    at isa?

ISA以太網驅動器。看看/usr/src/sys/i386/conf/LINT瞭解一下哪個卡被哪個驅動器支持。

    pseudo-device   ether         # Ethernet support

如果你有一個以太網卡,ether是必需的。它包含了通用的以太網協議代碼。

    pseudo-device   sl      1     # Kernel SLIP

Sl是針對SLIP支持的。這已經完全被PPP所代替,它是早期使用的協議。

    pseudo-device   ppp     1     # Kernel PPP

ppp提供內核模式(kernel-mode)PPP撥號支持。另外有一個tun則是用戶模式 (user-mode)PPP支持,tun較有彈性且功能較多。如果你要使用這個PPP驅動程序,請參考內核模式PPP這一章節。如同slnumber設置系統最多同時能支持幾個PPP連接。

    pseudo-device   tun           # Packet tunnel.

tun是用戶模式的PPP軟件。這個程序設置相當方便,且速度很快。它有一些特殊的功能,像是在需要連接時自動撥號(dial-on-demand)tun後面接的數字設置系統同時能支持幾個PPP連接。參看這本書的PPP章節(第16.2)以瞭解更多信息。

    pseudo-device   pty           # Pseudo-ttys (telnet etc)

pty是虛擬的終端機,或仿真的登陸端口(login port)。ctelnetrlogin連接,xterm以及其他應用程序如emacs會用到ptynumber設置系統的pty個數。系統默認值是16,如果你要提高同時連接數,可以適當增加這個數值,最高可達256個。

    pseudo-device   md            # Memory “disks”

Memory disk pseudo-devices.

    pseudo-device   gif     4     # IPv6 and IPv4 tunneling

這個執行IPv6 IPv4IPv4IPv6IPv4IPv4 IPv6IPv6之間的轉換.

    pseudo-device   faith   1     # IPv6-to-IPv4 relaying (translation)

這個僞設備能檢測到接收到的數據包,然後把它們發送給IPv4/IPv6翻譯程序。

    # The `bpf' pseudo-device enables the Berkeley Packet Filter.

    # Be aware of the administrative consequences of enabling this!

    pseudo-device   bpf           # Berkeley packet filter

這是Berkeley的封包過濾器。這個僞設備允許網絡接口被放在複雜的模式上,在網絡上捕獲每個封包。這些封包能被磁盤捕獲或被tcpdump程序檢查。

注意:bpf pseudo-device也可以被dhclient用來獲得默認路由的IP地址。如果你使用DHCP,不要註釋掉這行。

    # USB support

    #device         uhci                 # UHCI PCI->USB interface

    #device         ohci                 # OHCI PCI->USB interface

    #device         usb                  # USB Bus (required)

    #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

    # USB Ethernet requires mii

    #device         aue                  # ADMtek USB ethernet

    #device         cue                  # CATC USB ethernet

    #device         kue                  # Kawasaki LSI USB ethernet

支持多種USB設備。更多有關FreeBSD支持的設備請參考/usr/src/sys/i386/conf/LINT

9.5建立設備的節點

幾乎內核中的每個設備在/dev目錄下都有對應的節點。這些節點看上去是些規則文件,但事實上是程序在使用對應的設備時,與內核聯繫的進入點。當你一開始安裝操作系統時,那些可執行的外殼腳本/dev/MAKEDEV就創建了幾乎所有支持的設備。然而,它並不是建立所有設備,所以當你加入對新設備的支持時,注意確信對應的節點在這個目錄下。如果不是,就加入它們。這兒是一個簡單的例子:

確信在內核中加入了IDE CD-ROM的支持。可以這樣加入:

device acd0

這意味着你應當在/dev目錄下找一些以acd0爲起點的入口,通常後面有一個字母,像c或以r開頭表示這是一個raw設備。那些文件不在那兒,必須改變/dev目錄然後鍵入:

# sh MAKEDEV acd0

當這些腳本完成後,你要找一下在/dev目錄下有acd0cracd0c等幾個入口,表示程序已經正確執行。

以下是加入聲卡節點的例子:

# sh MAKEDEV snd0

注意:當創建完諸如聲卡這樣的設備節點時,如果其他人有權訪問你的機器,可能有必要在/etc/fbtab文件中添加這些節點來保護系統安全。可看一下fstab的聯機手冊以瞭解更多信息。

依上述的簡單程序,建立任何不在GENERIC裏的硬件設備節點。

注意: 所有的SCSI控制器都使用一樣的設備節點,所以你無須重新建立節點。另外,網卡與SLIP/PPP虛擬設備並沒有任何設備節點,所以你不必擔心怎麼建立節點。

9.6如果出現問題怎麼辦?

在定製一個內核時,可能會出現四種問題。它們是:

配置失敗

當你在內核描述中看到config命令失敗,可能在某個地方發生了一個小錯誤。幸運的是,config會顯示出錯的那一行的行號,你可以用vi編輯器做修改。例如,如果你看到:config:line 17:syntax error

可以在vi中用命令模式輸入17G來跳到17行。比較GENERIC內核或其他參考資料,以確定你打對了關鍵字。

編譯錯誤

如果編譯失敗,通常會在你的內核描述中提示一個錯誤,但config並沒有找出錯誤。另外,查看一下你的配置信息,如果你仍然無法解決這個問題,可以把你的內核配置信息發郵件到FreeBSD普通問題郵件列表<[email protected]>,它將很快地被解決。

內核無法啓動

如果你的新內核無法啓動,或無法識別你的硬件,不要擔心!幸運的是,BSD有一個解決複雜內核錯誤的很好機制。從FreeBSD的啓動loader中,選擇一個你要啓動的內核。當配置一個內核時,記得在手頭保留一個能正常啓動的內核是個好主意。

在用一個好的內核啓動後,你可以檢查一下配置文件,再設法重新建立一個內核。一個有幫助的文件是/var/log/messages文件,它記載了每個成功啓動的所有內核信息。同樣,dmesg命令會列出當前啓動中的內核信息。

注意:你在編譯內核時,確信保留着一個GENERIC或以其他名字命名的內核。你不能僅依靠kernel.old,因爲當你安裝一個新內核時,kernel.old會被上一次安裝的內核所覆蓋。所以,儘快將當前正常工作的內核移到不能正常工作的內核,可以用ps命令查一下。解開編譯安裝內核文件的正確命令是:

#chflags  noschg /kernel

另外,如果你要設定內核或其他文件的訪問限制,以至它不能被移動或修改,可以用下    面的命令:

#chflags  schg /kernel

內核工作,但ps根本就不工作!

如果你在系統中安裝了一個不同版本的內核,例如,在3.x系統中安裝了4.x內核,許多系統內建的命令像psvmstat會根本不工作。你必須重新編譯libkvm庫以及這些程序。千萬不要隨意從其他系統拷貝不同版本的內核來使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章