筆者在升級(jí)Oracle數(shù)據(jù)庫(kù)時(shí),當(dāng)前老的Linux內(nèi)核無(wú)法滿足新版本的Oracle需要,需要對(duì)Linux內(nèi)核進(jìn)行升級(jí)。其實(shí),在安裝一些新的硬件驅(qū)動(dòng)時(shí),也需要新版本的內(nèi)核支持。提起對(duì)Linux內(nèi)核的編譯,一些用戶(尤其是初學(xué)者)往往感覺(jué)比較高深。其實(shí),從編譯原理和具體過(guò)程來(lái)說(shuō),Linux的內(nèi)核編譯并不復(fù)雜,只要遵循一定的步驟,是比較容易實(shí)現(xiàn)的。對(duì)于新的內(nèi)核,可能存在著一些潛在的問(wèn)題,從系統(tǒng)穩(wěn)定性考慮,不要輕易將程序或者應(yīng)用運(yùn)行在新的內(nèi)核中。
在Linux下執(zhí)行“uname-a”命令,可以查看其內(nèi)核版本信息。例如將版本從2.x升級(jí)到3.x,需要下載Linux-3.x.x的內(nèi)核源碼包,并保證系統(tǒng)已經(jīng)安裝 了 make,gcc,gcc-c++,ncurses-devel等工具。
執(zhí) 行“rpm -qa |grep ncurses”命令,查看ncurses工具是否安裝。如果該包不安裝的話,就無(wú)法顯示Linux內(nèi)核配置界面。執(zhí)行“yum install ncurses ncursesdevel”命令,可以安裝該工具。將內(nèi)核源碼包解壓到指定位置,對(duì)內(nèi)核編譯參數(shù)進(jìn)行配置,執(zhí)行編譯操作。之后安裝編譯好的模塊和內(nèi)核,并修改GRUB啟動(dòng)菜單,添加使用新內(nèi)核的啟動(dòng)項(xiàng)目,重啟系統(tǒng)后,對(duì)新編譯的內(nèi)核進(jìn)行測(cè)試,檢測(cè)其是否可以正常運(yùn)行。
具體方法是執(zhí)行“tar xvfj linux-3.x.x.tar.bz2 -C /usr/src”命令,將內(nèi)核源碼包解壓到指定的路徑中。執(zhí)行“du -sh /usr/src/”命令,查看其解壓后的容量。進(jìn)入“l(fā)inux-3.x.x”目 錄 中,執(zhí) 行“make menuconfig”命令,執(zhí)行編譯操作。也可以執(zhí)行“make xconfig”或者“make gconfig”命令,來(lái)執(zhí)行編譯操作。當(dāng)然,這需要預(yù)先安裝qt,qt-devel,gtk+,gtk+-devel包。
在Linux內(nèi)核配置界面中顯示大量的配置項(xiàng)目,您可以根據(jù)需要進(jìn)行選擇。選擇“File systems”-“DOS/FAT/NT Filesystems” 項(xiàng),在其中選中“NTFS file system support”項(xiàng),在其下選中“NTFS write support”項(xiàng),表示支持NFTS文件系統(tǒng),并可以對(duì)其進(jìn)行寫(xiě)操作。當(dāng)執(zhí)行了保存操作后,選擇的配置信息會(huì)保存在當(dāng)前目錄下的“.config”文件中。如果對(duì)繁多的配置參數(shù)不熟悉的話,可以直接進(jìn)行保存,表示采用默認(rèn)的配置。
執(zhí)行“vi .config”命令,在配置文件中顯示大量的配置項(xiàng)目,對(duì)于值為“y”的項(xiàng)目,表示將其編譯到內(nèi)核中。對(duì)于值為“m”的項(xiàng)目,表示將其編譯為內(nèi)核模塊。對(duì)于前面的例子,“CONFIG_NTFS_FS=m”項(xiàng)表示將NTFS整體編譯為內(nèi)核模塊,“CONFIG_NTFS_RW=y”表示該配置項(xiàng)是前者的功能之一,將其編譯到內(nèi)核中。
實(shí)際上,因?yàn)閮?nèi)核模塊的配置參數(shù)多達(dá)五千多項(xiàng),手工逐個(gè)進(jìn)行判斷選擇是很困難的事情,因?yàn)閷?duì)于一般用戶,不大可能深入了解所有配置參數(shù)的具體功能。為了提高編譯的效率,可以將當(dāng)前內(nèi)核的配置文件復(fù)制過(guò)來(lái)加以利用。執(zhí)行“cp/boot/config-2.6.x.xxxx.el6.i686 .config”命令,將其復(fù)制到當(dāng)前目錄下并更名為“.config”,其中的“x”表示具體的版本信息。這樣,就可以以其為藍(lán)本,對(duì)配置參數(shù)進(jìn)行相應(yīng)的調(diào)整,這無(wú)疑可以大大提高操作效率。
之 后 執(zhí) 行“make gconfig”命令,打開(kāi)Linux內(nèi)核配置界面,在其中根據(jù)需要進(jìn)行調(diào)整。打開(kāi)“File systems”節(jié)點(diǎn),在其中的“XFS filesystem support”欄中選擇所有的項(xiàng)目,表示啟用XFS文件系統(tǒng)。當(dāng)保存之后,執(zhí)行“make bzImage”命令,編譯一個(gè)大的壓縮鏡像。當(dāng)出現(xiàn)“Kernel:arch/x86/boot/bzImage is ready”提示信息,說(shuō)明操作完成。
打開(kāi)源碼路徑下的“arch/x86/boot/”目錄,會(huì)找到生成的“bzImage”文件。執(zhí)行“echo $?”命令,顯示該命令的退出狀態(tài)值為0,表示不存在問(wèn)題。也可以直接執(zhí)行“make”命令,執(zhí)行編譯操作,編譯過(guò)程從十幾分鐘到數(shù)小時(shí)不等,這取決于主機(jī)的運(yùn)行速度。如果是四核的CPU,可以在Make命令后面添加“-j4”參數(shù),讓編譯程序同時(shí)使用四核編譯,來(lái)提高編譯速度。
在編譯過(guò)程中,可能會(huì)出現(xiàn)各種問(wèn)題,這就需要根據(jù)提示信息調(diào)整配置參數(shù)。執(zhí)行“vi .config”命令,在配置文件中查找目標(biāo)參數(shù),根據(jù)情況調(diào)整其狀態(tài)值或者將其刪除。當(dāng)重新調(diào)整了該配置文件,想徹底重新進(jìn)行編譯的話,可以執(zhí)行“make mrproper”命令,清理編譯現(xiàn)場(chǎng),即清除所有的和編譯相關(guān)的臨時(shí)文件,恢復(fù)到升級(jí)包剛解壓完畢時(shí)的原始狀態(tài),便于之后再次編譯。
當(dāng)編譯順利通過(guò)后,執(zhí)行“make modules”命令,來(lái)編譯內(nèi)核模塊。執(zhí)行“make modules_install”命令,來(lái)安裝內(nèi)核模塊。如果在編譯過(guò)程中,想修改某些配置文件,例如執(zhí)行“vi Makefile”命令,為新內(nèi)核版本信息添加后綴等。可以在編譯過(guò)程中點(diǎn)擊“Ctrl+C”鍵中斷編譯,執(zhí)行“make clean”命令,刪除在編譯過(guò)程中生成的臨時(shí)文件,之后重新編譯即可。
注意,這和上述“make mrproper”是不同的,清理的沒(méi)有后者徹底。后者可以將源代碼目錄中所有無(wú)關(guān)文件清除,只保留原始的源代碼文件,讓之后的再次編譯得到最純凈的環(huán)境。
執(zhí)行“l(fā)s /lib/modules/”命令,可以看到為新版本內(nèi)核創(chuàng)建的同版本名稱的目錄,在里面存儲(chǔ)所有編譯的庫(kù)文件。執(zhí)行“make install”命令,可以自動(dòng)修改GRUB啟動(dòng)菜單,添加使用新內(nèi)核的啟動(dòng)項(xiàng)目。將“bzImage”文件復(fù)制到“/boot”目錄中,并將其更名為以“vmlinuz-3.x”開(kāi)頭的內(nèi)科模塊文件,同時(shí)自動(dòng)使用“mkinitrd”或 者“dracut”命令,在該目錄中生成諸如“initramfs-3.x”開(kāi)頭的鏡像文件。
執(zhí)行“cat /etc/grub.conf”命令,可以查看GRUB啟動(dòng)菜單內(nèi)容,在其中會(huì)查看到該新版本的內(nèi)核啟動(dòng)項(xiàng)目,也會(huì)顯示之前的老版本內(nèi)核啟動(dòng)項(xiàng)目。因?yàn)樵诎惭b了新版本內(nèi)核后,并不會(huì)將老版本內(nèi)核刪除,我們可以根據(jù)需要選擇所需的內(nèi)核版本。
執(zhí)行“init 6”命令重啟系統(tǒng),在Grub啟動(dòng)菜單中顯示出了新內(nèi)核啟動(dòng)項(xiàng)目,選擇該菜單項(xiàng),使用新內(nèi)核啟動(dòng)系統(tǒng),使用Root賬戶登錄,執(zhí)行“uname -a”命令,顯示新的內(nèi)核版本。