FreeBSD內(nèi)核定制
首先復(fù)制配置文件:
#cd /usr/src/sys/amd64/conf
#mkdir /root/kernel
#cp GENERIC /root/kernel/MY_KERNEL_CONF
#ln -s /root/kernel/MY_KERNEL_CONF
這樣作的好處是更新源代碼之后如果像要重新編譯內(nèi)核,就不會(huì)需要重新弄一個(gè)配制文件了。
第二步是準(zhǔn)備硬件清單
#dmesg > hardware
#vi hardware
就可以查看機(jī)器的硬件配制了
接下來開始修改配置文件
vi MY_KERNEL_CONF
其中我的改動(dòng)有:
ident GENERIC => ident MY_KERNEL
這個(gè)是內(nèi)核的名字,以此來與之前的內(nèi)核相區(qū)分
接下來的大部分是操作系統(tǒng)核心相關(guān)的東東,如文件系統(tǒng),進(jìn)程調(diào)度等,大部分我都是直接保留,注釋掉了ipv6 相關(guān)的選項(xiàng)以及與FreeBSD4兼容的選項(xiàng),因?yàn)槲以贔reebSD.org上看到的amd64 架構(gòu)是從FreeBSD5.3 開始的
到后面就是根據(jù)硬件配制清單定制驅(qū)動(dòng),根據(jù)需求刪減
配制完畢后開始編譯
#cd /usr/src
#make buildkernel KERNCONF=MY_KERNEL_CONF
很不幸在鏈接時(shí)報(bào)錯(cuò)退出:
linking kernel.debug
umass.o(.text+0xcf): In function `umass_detach':
/usr/src/sys/dev/usb/storage/umass.c:2825: undefined reference to `xpt_bus_deregister'
umass.o(.text+0xf3):/usr/src/sys/dev/usb/storage/umass.c:2828: undefined reference to `cam_sim_free'
umass.o(.text+0xd6c): In function `umass_std_transform':
/usr/src/sys/dev/usb/storage/umass.c:3613: undefined reference to `xpt_done'
u9):/usr/src/sys/dev/usb/storage/umass.c:2689: undefined reference to `cam_sim_alloc'
umass.o(.text+0x2b54):/usr/src/sys/dev/usb/storage/umass.c:2711: undefined reference to `xpt_bus_register'
umass.o(.text+0x2db0):/usr/src/sys/dev/usb/storage/umass.c:2770: undefined reference to `xpt_periph'
umass.o(.text+0x2db5):/usr/src/sys/dev/usb/storage/umass.c:2770: undefined reference to `xpt_create_path'
umass.o(.text+0x2ec9):/usr/src/sys/dev/usb/storage/umass.c:2702: undefined reference to `cam_simq_free'
umass.o(.text+0x2f2d):/usr/src/sys/dev/usb/storage/umass.c:2779: undefined reference `xpt_free_path'
umass.o(.text+0x308d): In function `umass_cam_action':
/usr/src/sys/dev/usb/storage/umass.c:2849: undefined reference to `xpt_done'
umass.o(.text+0x317b):/usr/src/sys/dev/usb/storage/umass.c:3131: undefined reference to `xpt_done'
umass.o(.text+0x31ca):/usr/src/sys/dev/usb/storage/umass.c:2900: undefined reference to `xpt_done'
umass.o(.text+0x329b):/usr/src/sys/dev/usb/storage/umass.c:3121: undefined reference to `xpt_done'
umass.o(.text+0x3324):/usr/src/sys/dev/usb/storage/umass.c:2936: undefined reference to `xpt_done'
umass.o(.text+0x33b2):/usr/src/sys/dev/usb/storage/umass.c:3095: more undefined references to `xpt_done' fo.o(.text+0x35be):/usr/src/sys/dev/usb/storage/umass.c:3073: undefined reference to `xpt_done'
umass.o(.text+0x3819):/usr/src/sys/dev/usb/storage/umass.c:3004: undefined reference to `xpt_done'
umass.o(.text+0x39bf):/usr/src/sys/dev/usb/storage/umass.c:2994: undefined reference to `xpt_done'
umass.o(.text+0x3a07):/usr/src/sys/dev/usb/storage/umass.c:2982: undefined reference to `xpt_done'
umass.o(.text+0xdfa):/usr/src/sys/dev/usb/storage/umass.c:3325: more undefined references to `xpt_done' follow
*** Error code 1
Stop in /usr/
GOOGLE找到答案,原來是我在配置文件里含入了
device umass
卻沒有按照后面的注釋含入
device scbus
device da
解決方法是直接將umass 也給它注釋掉
重新build,成功!
# make installkernel KERNCONF=MY_KERNEL_CONF
搞定,重啟
察看內(nèi)核版本:
uname -i
$ uname -i
MY_KERNEL
然后上網(wǎng)、登錄SSH、VNC、讀光盤等等都沒有問題
【編輯推薦】