前言
FreeBSD 安裝完成後所使用的核心為「通用核心 (GENERIC KERNEL)」,但裡面其實有許多我們用不到的驅動程式 (例如 Wireless Card Driver...etc),所以我們可依不同的主機硬體來修改核心,讓核心更符合我們的硬體也讓系統效能更好、開機更快。文章目錄
1、實作環境2、安裝及設定
2-1、步驟1 - 複製 GENERIC
2-2、步驟2 - 修改核心
2-3、步驟3 - 編譯核心
3、補充
3-1、當編譯失敗無法開機的處理
3-2、忘了 root 密碼
3-3、如何使核心支援多行程 CPU (SMP / HTT Support)
4、參考
5、Me FAQ
5-1、Q1 - make kernel出現錯誤訊息 undefined reference to `ieee80211_watchdog'?
1、實作環境
- FreeBSD 6.x Release
2、安裝及設定
2-1、步驟 1 - 複製 GENERIC
在 /usr/src/sys/i386/conf 目錄內 GENERIC 為通用核心、NOTES 為完整的核心及說明、LINT 則是所有核心能使用的參數 (需自行編譯產生)。- GENERIC:通用核心
- NOTES:完整的核心及說明
- LINT:核心能使用的參數
我們可利用 make 指令來產生 LINT 檔。
# cd /usr/src/sys/i386/conf
# make LINT
cat ../../conf/NOTES NOTES | sed -E -n -f ../../conf/makeLINT.sed > LINTM
複製通用核心 (GENERIC KERNEL) 來進行修改。
# cd /usr/src/sys/i386/conf
# cp GENERIC /etc/newkernel //複製一份到 etc 下
# ln -s /etc/newkernel //建立連結 (重新 cvsup 就知有差了)
2-2、步驟 2 - 修改核心
執行 vi 指令編輯核心檔案。# vi /etc/newkernel //編輯新 kernel
編輯 kernle 中請注意,下列五項不可註解掉,否則在編譯核心的過程中可能會出現錯誤。
- ident: 修改為新 kernel 的名字
- device isa: ISA 匯流排
- device scbus: SCSI 匯流排
- device miibus: MII 匯流排 (有線網卡支援)
- device wlan: 無線網卡支援
2-3、步驟 3 - 編譯核心
在編譯核心 (Compile kernel) 之前我們先去修改 make.conf 檔案,讓系統知道我們使用的新的核心 (適合我們機器的核心) 檔案名稱,否則屆時系統會去抓預設的通用核心 (GENERIC KERNEL) 來進行編譯。# vi /etc/make.conf
KERNCONF=newkernel //加入此行 (newkernel 為新核心的檔案名稱)
開始編譯核心,下列的 make kernel 指令等於是 make buildkernel 加上 make installkernel,如果你的機器夠強的話你還可加上參數 -j (ex. -j8) 來加快編譯速度,但前提是你的機器必須夠強 (請自行測試適合您機器的參數值)。
# cd /usr/src
# make kernel //開始編譯核心 (多執行序編譯核心 make -j8 kernel)
# rm –rf /usr/obj/usr/src/sys/newkernel //清除編譯過程中產生的檔案
3、補充
3-1、當編譯失敗無法開機的處理
- 首先先要去尋找錯誤訊息。
- 在開機過程中,當倒數 10 秒時按 ENTER 會直接開機的地方,此時按下空白鍵 (只要不是 Enter 即可) 便會進入所謂的使用者模式,開機完後再去把先前 newkernel 錯誤的地方改掉,再去照上面的步驟重新編譯 kernel 就可以了。
boot:? //顯示能用的指令
boot:lsmod //看現在所用的 kernel
boot:unload //將不能開機的 kernel 卸載
boot:load kernel.GENERIC //載入 FreeBSD 預設的 GENERIC kernel
boot:boot //開機
3-2、忘了 root 密碼
在 boot menu 視窗中選擇 Boot FreeBSD in single user mode 項目,接著執行如下指令即可。mount -u /
mount -a
passwd root
Ctrl + D進入系統
3-3、如何使核心支援多行程 CPU (SMP / HTT Support)
Pentium 4-XEON or Pentium 4-HT 都算是 SMP,使用新的 ULE 調度器通常可以獲得更好的性能。它是專門為 FreeBSD 在 SMP 上執行而設計的調度器,但在 ULE 系統上也能工作得很好,這兩個調度器必須選擇一個否則編譯 kernel 時會失敗。#options SCHED_4BSD # 4BSD scheduler (預設值,我把此行 Mark 掉)
options SCHED_ULE # ULE scheduler
device apic # I/O APIC
options SMP # Symmetric MultiProcessor Kernel
options MPTABLE_FORCE_HTT # Enable HTT CPUs with the MP Table
options IPI_PREEMPTION
以我這台機器為例 (HP XW4300 WorkStation P4 HT) 我加上這幾行後 make kernel,重開機後 dmesg 可發現 cpu 是二顆了(記得 BIOS HT 功能要打開)。
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
cpu0 (BSP): APIC ID: 0
cpu1 (AP): APIC ID: 1
或使用 sysctl 指令來查看。
# sysctl -a |grep cpu
kern.threads.virtual_cpu: 2 //表示已支援 HT 功能
kern.smp.cpus: 2 //表示系統認為有二顆 CPUs
4、參考
5、Me FAQ
5-1、Q1 - make kernel出現錯誤訊息 undefined reference to `ieee80211_watchdog'?
Error Message:修改核心檔之後編譯核心卻出現如下錯誤訊息
if_ural.o(.text+0x19c4): In function `ural_watchdog':
/usr/src/sys/dev/usb/if_ural.c:1370: undefined reference to `ieee80211_watchdog'
if_ural.o(.text+0x1ad2): In function `ural_ioctl':
/usr/src/sys/dev/usb/if_ural.c:1417: undefined reference to `ieee80211_ioctl'
if_ural.o(.text+0x1f58): In function `ural_set_chan':
/usr/src/sys/dev/usb/if_ural.c:1606: undefined reference to `ieee80211_chan2ieee'
*** Error code 1
Stop in /usr/obj/usr/src/sys/mykernel.
*** Error code 1
Stop in /usr/src.
*** Error code 1
Stop in /usr/src.
Ans:
找了 google 後發現這也有人回報出現這個錯誤訊息[FreeBSD 6 non-GENERIC kernel build fails]關鍵句子如下:
You have ural(4) in your kernel, but no wlan(4).The ural(4) manual says that wlan(4) is required.
就試試說的方法把 wlan 這行 mark 拿掉在重新編譯一次核心並順利編譯成功。
device wlan # 802.11 support