感谢支持
我们一直在努力

一次Linux系统内核升级记录

一次Linux系统内核升级记录,附带一些和IPVS内核模块、Linux启动顺序等有关的知识,方便日后参考


升级前OS的信息 


# lsb_release -a
LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.5 (Final)
Release: 5.5
Codename: Final
# uname -r
2.6.18-194.el5
#


升级步骤


最新kernel下载地址,本例直接wget到/usr/src下


一般的安装步骤,或者看下目录下的“readme”有安装方法 cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.tar.bz2
tar -jxvf linux-2.6.37.tar.bz2
ln -s /usr/src/linux-2.6.37 /usr/src/linux
cd linux
make clean
cp /boot/config-2.6.18-194.32.1.el5 .config
make menuconfig
make bzImage
make modules
make modules_install
make install
#



指令理解
make menuconfig \\内核定制(会修改.config文件)
make bzImage     \\生成内核镜像文件于/usr/src/linux/arch/xxx/boot/bzImage
make modules     \\编译模块
make modules_install   \\安装模块,/lib/modules/x目录/附加模块
make install         \\安装新内核到/boot/
mkinitrd /boot/initrd-2.6.23.14.img 2.6.23.14  \\mkinitrd可建立映像文件,以供Linux开机时载入ramdisk


如果如上那样步骤,编译重启后我遇到了2个问题


问题一  MOUNT:count not find filesystem ‘/dev/root’


解决方法如下,在make menuconfig的时候


Linux系统内核升级,Linux


Linux系统内核升级,Linux


Linux系统内核升级,Linux

问题二  insmod:error inserting ‘/lib/dm-region-hash.ko: -1 file exists’


解决方法,方法来自网络 1、解压initrd文件
# cp /boot/initrd-2.6.37.img /tmp/
# cd /tmp/
# mkdir newinitrd
# cd newinitrd/
# zcat ../initrd-2.6.37.img |cpio -i


2、编辑init,删掉其中重复的四行中的两行
echo “Loading dm-region-hash.ko module”
insmod /lib/dm-region-hash.ko
echo “Loading dm-region-hash.ko module”
insmod /lib/dm-region-hash.ko
3、重新打包initrd
# find .|cpio -c -o > ../initrd
# cd ..
# gzip -9 < initrd > initrd.img
OK,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.37.img为initrd.img就可以了。
 


附带,IPVS模块的开机加载方法(来自网络)


一、先来温习“开机关机流程与Loader”:
整个开机流程是
(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号
(2)读取第一个开机装置的MBR的boot Loader (grub)的开机信息
(3)载入OS Kernel信息,解压Kernel,尝试驱动硬件
(4) Kernel执行init程序并获得run-lebel信息(如3或5)
(5) init执行/etc/rc.d/rc.sysinit
(6)启动内核外挂模块(/etc/modprobe.conf)
(7) init执行run-level的各种Scripts,启动服务
(8) init执行/etc/rc.d/rc.local
(9)执行/bin/login,等待用户Login
(10)Login后进入Shell


二、仿效rc.sysinit中其他模块的加载方法,扩展该脚本文件,www.linuxidc.com在最后增加下来一段:


# load LVS IPVS modules  if [ -d /lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs ]; then for module in /lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/* ; do  module=${module##*/}  module=${module%.ko}  modprobe $module >/dev/null 2>&1  done  fi 重启一下,查看


# lsmod |grep ip_vs
ip_vs_wrr              35905  0
ip_vs_wlc              34881  1
ip_vs_sh                35649  0
ip_vs_sed              34881  0
ip_vs_rr                 35009  0
ip_vs_nq                34881  0
ip_vs_lc                  34881  0
ip_vs_lblcr              40136  0
ip_vs_lblc               39241  0
ip_vs_ftp                39109  0
ip_vs_dh                35649  0
ip_vs                   122113  23 ip_vs_wrr,ip_vs_wlc,ip_vs_sh,ip_vs_sed,ip_vs_rr,ip_vs_nq,ip_vs_lc,ip_vs_lblcr,ip_vs_lblc,ip_vs_ftp,ip_vs_dh



if语句检查ipvs模块的目录是否存在
for循环遍历该目录下面的所有文件
module=${module##*/} :其中##表示从前面删除字符,*/表示删除到最后一个/,如果一个#就表示只删除到第一个/。如果变量后面接##,表示在##后面的字符串取最长的(一直到最后面),如果接#,表示取最小的一段。
module=${module%.ko}:表示从后面删除.ko。如果变量后面接%%,表示在%%后面的字符串取最长的(一直到最前面),如果接%,表示取最小的一段。
这样多module的两次修改就得到了模块名,就是文件名不带路径和.ko后缀。
modprobe $module >/dev/null 2>&1:加载模块,输出都指向空设备

赞(0) 打赏
转载请注明出处:服务器评测 » 一次Linux系统内核升级记录
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏