在基于CentOS平臺的工作過(guò)程中,難免有時(shí)需要升級或者降級內核以驗證功能、調試性能或者更新整個(gè)系統。
如果從頭重新編譯一個(gè)內核,由于現在內核特性越來(lái)越復雜,依賴(lài)的庫或者工具也不少,加之重新編譯耗時(shí)不菲,了解更新內核的多種方式就顯得尤為必要。
下面根據筆者最近的工作,總結了三種方法,供大家參考。
方法一
如果機器不能聯(lián)網(wǎng),可以下載現有內核包到本地機器,直接在本地更新
1.從http://ftp.scientificlinux.org/linux/scientific/7.0/x86_64/updates/security/下載需要的頒布rpm
2. [root@localhost os2]# scp root@192.168.1.64:/home/worker/kernel-3.10.0-123.1.2.el7.x86_64.rpm
root@192.168.1.64's password:
kernel-3.10.0-123.1.2.el7.x86_64.rpm 100% 29MB 28.9MB/s 00:00
3.[root@localhost os2]# yum install kernel-3.10.0-123.1.2.el7.x86_64.rpm
Loaded plugins: fastestmirror, langpacks
Examining kernel-3.10.0-123.1.2.el7.x86_64.rpm: kernel-3.10.0-123.1.2.el7.x86_64
Marking kernel-3.10.0-123.1.2.el7.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-123.1.2.el7 will be installed
--> Finished Dependency Resolution
epel/x86_64/metalink | 5.2 kB 00:00:00
epel/x86_64 | 4.3 kB 00:00:01
epel/x86_64/updateinfo | 517 kB 00:00:01
epel/x86_64/primary_db | 4.0 MB 00:02:36
....
方法二
如果機器已經(jīng)聯(lián)網(wǎng),直接利用包管理工具更新,需要注意的是現在3.0以上的內核引入了簽名機制,需要導入簽名的key,參考步驟如下:
1、導入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
當然,如果已經(jīng)修改了repo的gpgcheck=0也可以不導入key
2、安裝elrepo的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
3、安裝內核
在yum的ELRepo源中,有mainline頒布的,可以這樣安裝:
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
當然也可以安裝long term的:
yum --enablerepo=elrepo-kernel install kernel-lt -y
其它:
http://elrepo.org/linux/kernel/el6/x86_64/RPMS/
[root@server-mysql yum.repos.d]# yum --enablerepo=elrepo-kernel list |grep kernel*Unable to read consumer identity * elrepo-kernel: mirrors.tuna.tsinghua.edu.cnabrt-addon-kerneloops.x86_64 2.0.8-6.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3dracut-kernel.noarch 004-283.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3kernel.x86_64 2.6.32-279.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3kernel-devel.x86_64 2.6.32-279.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3kernel-firmware.noarch 2.6.32-279.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3kernel-headers.x86_64 2.6.32-279.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3libreport-plugin-kerneloops.x86_64 2.0.9-5.el6 @anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3abrt-addon-kerneloops.x86_64 2.0.8-40.el6.centos base dracut-kernel.noarch 004-409.el6_8.2 updateskernel.x86_64 2.6.32-642.3.1.el6 updateskernel-abi-whitelists.noarch 2.6.32-642.3.1.el6 updateskernel-debug.x86_64 2.6.32-642.3.1.el6 updateskernel-debug-devel.i686 2.6.32-642.3.1.el6 updateskernel-debug-devel.x86_64 2.6.32-642.3.1.el6 updateskernel-devel.x86_64 2.6.32-642.3.1.el6 updateskernel-doc.noarch 2.6.32-642.3.1.el6 updateskernel-firmware.noarch 2.6.32-642.3.1.el6 updateskernel-headers.x86_64 2.6.32-642.3.1.el6 updates
kernel-lt.x86_64 3.10.102-1.el6.elrepo elrepo-kernelkernel-lt-devel.x86_64 3.10.102-1.el6.elrepo elrepo-kernelkernel-lt-doc.noarch 3.10.102-1.el6.elrepo elrepo-kernelkernel-lt-firmware.noarch 3.10.102-1.el6.elrepo elrepo-kernelkernel-lt-headers.x86_64 3.10.102-1.el6.elrepo elrepo-kernel
kernel-ml.x86_64 4.6.4-1.el6.elrepo elrepo-kernelkernel-ml-devel.x86_64 4.6.4-1.el6.elrepo elrepo-kernelkernel-ml-doc.noarch 4.6.4-1.el6.elrepo elrepo-kernelkernel-ml-firmware.noarch 4.6.4-1.el6.elrepo elrepo-kernelkernel-ml-headers.x86_64 4.6.4-1.el6.elrepo elrepo-kernellibreport-plugin-kerneloops.x86_64 2.0.9-32.el6.centos base perf.x86_64 4.6.4-1.el6.elrepo elrepo-kernel
方法三
實(shí)際工作當中經(jīng)常碰到需要修改內核配置,編譯驅動(dòng),調節相關(guān)參數等,這就需要定制內核,為此需要手動(dòng)生成新的內核。還是以3.10.0-123.el7為例子,一般步驟如下:
1.先下載內核:
wget http://vault.centos.org//7.0.1406/os/Source/SPackages/kernel-3.10.0-123.el7.src.rpm
接著(zhù)解壓相關(guān)代碼:
rpm2cpio kernel-3.10.0-123.el7.src.rpm |cpio -div
默認在/usr/src放有一份kernel的頭文件,這樣在不需要下載整個(gè)內核源代碼的情況下就可以編譯自己編寫(xiě)的內核模塊,如果有patch需要打的話(huà),用patch -p1 *.patch命令給內核打上相應的patch。
2.更新配置文件.config
可以獲取系統當前的config文件,也可以用默認的配置文件,比如x86_64_defconfig:
cp /boot/config-3.10.0-123.el7.x86_64 .config 和make oldconfig生產(chǎn)的config一致
然后用make menuconfig來(lái)配置。
3.編譯和安裝
默認的情況下, 內核和initrd會(huì )安裝到/boot下面,而驅動(dòng)模塊會(huì )安裝到/lib/modules/`uname -r`下,如果可以都安裝都默認的位置,直接運行下面的命令即可:
make -j8;make modules; make modules_install;make install;
如果需要安裝到指定的路徑,請設置下面的環(huán)境變量:
export INSTALL_PATH=….
export INSTALL_MOD_PATH=
4.創(chuàng )建initrd.img
initrd.img即為初始化的ramdisk文件,它是一個(gè)內存鏡像文件。它是把一些最基本的驅動(dòng)程序和命令工具打包而成,作用就是在系統還沒(méi)有掛載根分區前,保證系統能夠執行基礎的初始化和加載一些基本的驅動(dòng),比如掛載scsi驅動(dòng)等。制作initrd傳統的方法是用mkinitramfs這一個(gè)系統工具,現在mkinitrd會(huì )調用dracut完成實(shí)際的工作。比如下面的命令進(jìn)行:
mkinitrd3.0.4 -o /boot/initrd.img-3.0.4
然后把生成的initrd映像拷貝到/boot下面即可。
5.更新grub
為了讓boot loader能夠找到剛生成的內核和initrd映像,需要修改grub。注意如果使用的是grub2,不宜直接修改/boot/grub2/grub.cfg文件,而應該修改grub2的配置文件。grub2默認的配置文件在/etc/grub2.cfg。更新完這個(gè)文件之后,需要運行下面的文件:
grub2-mkconfig
至于啟動(dòng)那個(gè)linux鏡像,由/etc/default/grub的GRUB_DEFAULT=saved來(lái)決定;
其意思是上一次使用的value;
修改內核默認啟動(dòng)項
grub2-set-default 0
這種方法需要注意kernel和模塊簽名的問(wèn)題,如果模塊簽名沒(méi)有通過(guò)內核檢查,將不會(huì )加載,這可能導致生成系統啟動(dòng)失敗。
總而言之,工程師和維護人員需要集合實(shí)際情況靈活選擇合適的方法來(lái)更新內核。
聯(lián)系客服