2007年10月27日 星期六

FreeBSD Kernel configuration

連結

作者:vving

Q: 什麼是 kernel 呢?
A: 簡單的說, 就是作業系統中最重要的部分, 從各種設備的驅動程式,檔案系統,到 process 排程,都是 kernel 的一部分。

Q: 那為什麼 FreeBSD 要談到怎樣自己 compile kernel 呢?
A: 原因不外乎下列幾個,精簡,速度。 GENERIC 的 kernel,在 5.3 之前,是沒有 smp 支援的, 所以如果機器是兩顆 cpu 以上,GENERIC kernel 只會用到一顆。 再來就是 GENERIC kernel 包括了一堆你可能用不到的 device driver, 這些東西一開始被 load 進記憶體之後,不管你是否用的到, 記憶體就是不會放出來。 基於上面兩個理由,重新 compile kernel 是必要的..

Q: 為什麼使用 windows 都不需要自己做這部分?
A: 如同剛剛講的,kernel 是作業系統最重要的一部分,所以 dos 也有 kernel, windows 也有 kernel,os/2 也有 kernel,但是因為種種原因, 他們應該是不太可能放出原始碼來給你玩。

Q: 那麼,我要怎樣自己 compile kernel 呢?
A: 首先你需要一個 kernel config file,再來是時間。

Q: 如果,我只是小更動,那是不是也要同樣的花費那麼多時間呢?
A: 基本上是,但是還是有小技巧可以避免掉浪費時間的事情,我想大家都知道工程師時間是很寶貴的。
Q: 講了那麼多,你到底要不要講?
A: 好吧,這篇是沒有稿費的,多打幾個字,只是累了自己..

   1: 把 /usr/src/sys/i386/conf/GENERIC cp 到 /etc 下面,
然後把他改成你要的檔名. (ex: CRASHME)
當然其他 arch 的, 請自行變更目錄.

2: 在 /etc/make.conf 裡面加行

KERNCONF=CRASHME

這行的意思, 是讓 make 知道他要去使用哪個 kernel config file,
不然他都會去抓預設的 GENERIC

3: 到 /usr/src/sys/i386/conf 裡面 ln -s /etc/CRASHME
為什麼要這麼做呢? 保險.

以前常常把 source tree 砍掉, 重新 cvsup, 但是 kernel config file
就放在裡面呀, 砍得時候, 是不會有感覺的,
只有在一切都完事之後, 才一邊抽著菸, 一邊痛哭.

把 kernel config file 放在 /etc 下面, symbol link 進去,
source tree 你想怎樣砍, 就可以怎樣砍.

4: GENERIC kernel config 預設很多東西, 下面是本人建議可以拿掉的.
1: cpu 部分, 確定了自己的 cpu 型號, 就可以把其他的拿掉.
例如你是用 p3 cpu 的, 就可以把

cpu I486_CPU
cpu I586_CPU

這兩行都拿掉, 多加這兩行, 速度不會快點.

2: makeoptions DEBUG=-g

這行也建議拿掉, 如果完全不想去抓 kernel debug message
或者根本沒這需求, 就拿掉吧, 會讓產生的 kernel size 小點.

3: options INET6

ipv6 很棒, 但是一般人根本用不到, 如果沒有特殊需求, 拿掉吧.

4: options UFS_ACL

這是讓 ufs 有 acl 的選項, 在特殊需求的環境, 可以做到一般 chmod
權限做不到的控管, 但是如果真的沒需求, 拿掉吧.

5: options MD_ROOT

如果要使用 md (memory disk) 當 root device, 才需要這個選項.

6: options NFSCLIENT
options NFSSERVER
options NFS_ROOT

機器有 nfs 需求時, 才需要加上上面的選項, 並且請依照需求增加,
例如機器不是 diskless 類型的機器時, NFS_ROOT 幾乎都可以拿掉.

7: options MSDOSFS
options CD9660
options PROCFS
options PSEUDOFS

天呀, 為什麼連 procfs 都要拿掉呢? 這樣實在很過分呢.
沒有別的理由, 5.x 預設已經不 mount procfs 了.
而如果真的有使用上面三種 fs 的時候, kldload 就行了.
把他們擺進去吃記憶體, 實在沒道理呀.

(不過某些特殊指令, 確實是需要 procfs 的, 例如 ktrace, truss 之類的,
但是如果這只是台 server, 也沒人會在上面寫程式, 那就算了)

8: options SCSI_DELAY=15000

這個 option 只在你有 scsi device 的時候才會用的到,
目的是讓系統 probe scsi device 前要 delay 多少微秒,
因為比較舊的 scsi 卡跟 hd, 剛開機的時候 init 需要花多點時間.

9: options KTRACE

如果不需要用 ktrace 去 debug 程式, 拿掉吧.

10: options AHC_REG_PRETTY_PRINT
options AHD_REG_PRETTY_PRINT

這兩個 options 會把 ahc & ahd 的 register 印的好看點,
但是成本是大概會多 350k 的 kernel size,
如果不需要, 或者沒有這種 device, 拿掉他.

11: options ADAPTIVE_GIANT
options KDB
options DDB
options GDB
options INVARIANTS
options INVARIANT_SUPPORT
options WITNESS
options WITNESS_SKIPSPIN

上面幾個選項, 幾乎都是 -current 建議開啟的項目,
其目的幾乎都是 kernel debug, 開了之後, 整體效能變得很差.

12: device eisa

well, 現在一般的 x86 上面會有 eisa 的, 幾乎很少了.
或許一般人也完全沒聽過這東西.

13: device fdc

"太過分了, 為什麼要把 floopy 也拿掉呢?"

在過去的一年內, 你使用了幾次軟碟呢?

14: device ataraid
device atapifd
device atapist

如果你沒有上面 device 的話, 請選擇性拿掉吧.

15: scsi controllers

device ahb
device ahc
device ahd
device amd
device isp
device mpt
device sym
device trm
device adv
device adw
device aha
device aic
device bt
device ncv
device nsp
device stg

16: scsi peripherals

device scbus
device ch
device da
device sa
device cd
device pass
device ses

17: raid controller

device amr
device asr
device ciss
device dpt
device iir
device ips
device mly
device twa
device aac
device aacp
device ida
device mlx
device pst
device twe

上面三個大項, 請根據自己的設備, 把需要的加入就好.

不過如果要透過 usb & firewire 去使用硬碟, 都會透過 cam 的方式去模擬,
所以 device scbus 及 device da 必須預先被 compile 在 kernel 裡面,
這兩個部分沒得使用 kld 來 load.

18: device agp

如果真的不需要使用到 X, 這個就關掉吧.

19: device cbb
device pccard
device cardbus

用不到 pcmcia 的設備, 就不需要這些選項

20: device ppc
device ppbus
device lpt
device plip
device ppi

如果您不需要使用到 Parallel port 會用到的 device, 例如印表機,
或者是透過 plip (tcp over Parallel) 的話, 就不需要上面這些東西

21: 再來一堆網路卡的 driver, 也是請您根據自己的設備做挑選.

22: device sl
device ppp
device tun
device gif
device faith

前一個是 slip 會用到的 device, 不過 slip, 大概很少人會用,
或者應該說很多人根本沒聽過.
gif & faith 一個是 ipv6 & ipv4 tunneling, 一個是 relay,
如果完全沒有 ipv6 環境, 就不需要.

23: 關於 usb 部分, 預設的 GENERIC kernel 把所有的 usb device driver
一次都加上了, 但是全部都可以透過 kld 來 load, 所以建議全部拿掉.

24: firewire, 也是一樣都可以全部透過 kld load, 建議全部拿掉.
5: 到 /usr/src 下面打 make kernel, 這樣就可以一邊抽煙, 一邊等他做完該做的事情

理論上 make kernel 等同於 make buildkernel & make installkernel

懶惰點可以不用打那麼多東西.

6: 再來就是 reboot 了. 如果新的 kernel 會造成 panic 的話, 可以在 boot prompt
的地方, 讓 boot loader 改用舊的 kernel 開機, 然後找到出問題的地方.

Q: 這麼簡單嘛? 沒有其他東西了? A: 六分鐘護一生,夠簡單吧? 其實還有其他的特殊參數,例如針對各種 cpu 的最佳化等。 被分別放在 /usr/src/sys/conf/NOTES & /usr/src/sys/i386/conf/NOTES 裡面, 如果您求知慾夠強的話,可以去裡面找找。

Q: 我看到了 SCHED_ULE & SCHED_4BSD,這兩個有什麼不同嘛? A: 這兩個選項都是 cpu scheduler,一定要選擇其中一個,預設是使用 4BSD, 這是從很久以前就已經在使用的 scheduler。 而 SCHED_ULE 是在 5.x 之後,由 Jeffrey Roberson (jeff@) 所重新寫的,它有對於 5.x 的 smp & kse 等做最佳化, 根據 paper 裡面所談到的,它甚至可以把 process 黏在某顆 cpu 上面。 但是基於穩定的理由,即將發行的 5.3RELEASE 還不會使用它。

Q: kernel compile 好了,可是很不穩定.. A: 關於這點,如果您是跟著 -release 跑,理論上 code 都是很穩定的, 所以會 panic 大概只能朝著硬體出問題的方向思考, 如果您真的不死心,可以將 kernel debugger 打開, 在 panic 的時候,把一些吐出來的 message 紀錄下來, 到 mailling list 上面問問,給 kernel hacker 們夠多的資訊去追問題。

沒有留言: