内核升级
目标:
升级Linux内核随意改变,可从旧版本到新版本,也可由新版本降低到旧版本。
当前环境:
Vmware虚拟机中安装Ubuntu 14.04 LTS 其Linux内核为3.19.2用uname -a可以查看所有版本信息
虚拟机配置为:内存1G,硬盘20G,其它默认设置。Ubuntu安装时选择的是“使用整块硬盘”。
内核升级准备工作:
1,首先需要到www.kernal.org下载最新的Linux内核源码。这里下载的是3.14.3版本。
2,需要正确编译内核,需要安装gcc以及安装相应的依赖包和库,Ubuntu中已经自带了gcc编译器,但是仍然需要安装一些其它的类库,整个过程可以使用Ubuntu的apt-get install命令方便的完成。
具体命令为:sudo apt-get install build-essential
网络上有些说明中还指出,需要安装 kernel-package这个东西,因此也一并装上了。
sudo apt-get install kernel-package
为了方便下载,我把Linux 3.14.3源码包下载在了windows中文件名为linux-3.14.3.tar.xz,要将它复制到虚拟机的Linux里,直接复制显然不可以,因此使用SSH方式复制。
为实现SSH登录和传送文件,需要安装openSSH,只需要安装Server就可以。同样可以使用sudo apt-get install openssh-server命令完成。
安装完成后使用FileZilla软件,通过sFtp协议登录并将源码复制到linux中。
复制完成后,就可以正式开始升级内核了。
内核编译前的配置:
进入Linux系统,为了不出现权限问题,我直接用su -命令用root用户操作。Ubuntu是一个桌面系统,可能是出于安全性考虑,Ubuntu安装好后不能直接用su命令切换root,会提示su认证失败,这是由于Ubuntu锁住了root用户,这时只需要执行sudo password命令,修改UNIX密码即可,密码就是安装Ubuntu时设置的那个。
创建一个目录(我直接在根目录下创建了一个linux-kernel目录)用来作为编译内核的工作目录,将下载的Linux源码包复制到 /linux-kernel工作目录下并用命令 tar -xvJf解压
tar -xvJf linux-3.14.3.tar.xz
解压后得到一个文件夹,cd 进去之后可以看到目录中有以下内容:
根据readme文档,不建议将内核解压到/usr/src目录下,因此,工作目录设置在/linux-kernel下。但是有好多教程上说放在src目录也没有问题,这里没有尝试。
执行 make mrproper,如果是刚解压的包,没必要执行这个操作,但是为了安全,我也执行了,虽然什么反应都没有。
执行make menuconfig配置:
出现了这个错误,根据提示内容,这是因为缺少ncurses库,根据网上的解决方法,直接用下面的命令就可以自动安装:
sudo apt-get install libncurses5-dev
不过为了练习也是为了测试一下gcc是否工作正常,我从网上下载了源码包,尝试手动安装,首先解压包到一个目录,然后进入该目录,执行sudo ./configure脚本进行配置。
整个过程该脚本会自动完成配置,并且在最后提示各个组件安装到的目录。
配置完成后执行make,等待编译完成……这个大概就用了几分钟时间。
编译完成后,执行 sudo make install安装,没有报错,说明已经安装好了。
回到编译Linux的工作目录,再次进行make menuconfig 这时就可以正常配置了。网上有些教程说可以使用原来系统的配置文件,因此我复制c下原来的内核配置文件,然后命名为 .config
cp /boot/config-3.13.0-24-generic ./.config
此时,工作目录的内容如下
安装好ncurses库之后,再次执行make menuconfig就可以正常配置了,配置界面如下:
在配置界面中选择Load项,然后加载.config 文件,然后Save一下,最后Exit退出。
内核编译:
接下来执行make进行编译,编译过程用了相当长的时间,如果是多核处理器,可以使用make -j4将编译拆分成4个线程进行。下面的图片是编译过程的截图:
由于用的是虚拟机,所以编译过程持续了三个多小时,然而中间竟然出现这个错误……查资料得知,这个错误可能是没有swap分区或者swap分区空间不足导致的。
用free -m查看后如下(这已经是第二天了,中间关闭了电脑,因此数据不是当时出错时的):
swap分区有509M,说明不是没有swap而是分区大小不够,在后来的编译过程中,我用free命令查看过内存,发现swap已经使用了200m多,随着编译过程还会继续增加,所以swap分区大小不够是非常可能的,重新分区不太方便,因此增加一个文件用作swap
创建目录 /swap,在此目录下用dd命令创建一个文件作swapfile作为swap使用,并激活该swap,这里count我写了1024k也就是创建1G大小的空间。
命令如下:
mkdir /swap
cd /swap
dd if=/dev/zero of=swapfile bs=1024 count=1024k
mkswap swapfile
swapon swapfile
现在交换分区已经达到了1533mb,感觉应该足够了。然后进入工作目录,执行make mrproper后重新编译内核……
这个swap文件在每次开机后并不会自动加载,而是每次都需要执行swapon命令才可以,网上有些解决方案是将这个swap信息写到配置文件/etc/fstab中。
再次编译之前,我修改了一些配置,去掉了用不到的文件系统支持模块以及无线网络等功能用来减少编译的文件。
也不知道过了多长时间……反正这次终于没有出错了。
内核安装:
执行make module_install安装内核模块
这个过程要比编译快很多。
最后执行make install安装新内核
执行完成后,新的内核就被自动安装到系统之中,不需要进行额外的配置就可以重启进入新内核。
重启之后,再次使用uname -a之后,可以看到新的版本信息以及编译时间等信息,这时,Linux内核版本已经变成3.14.3
至此,内核升级完成。
总结:
内核升级的过程并不复杂,总结起来,整个过程就是:下载源码包 -- 解压 -- make mrproper清理 -- make menuconfig配置 -- make编译-- make module_install安装模块 -- make install安装内核 -- 重启这几个步骤,其中每次遇到问题都需要根据提示信息自己分析并查找相关资料,查找资料的过程就是一个学习的过程,通过解决这些问题,可以逐步明确Linux系统的内容和“脾气”,Linux说到底还是需要动手,多动手才能理解透彻,才能用的上手。
删除kernel启动项
如果要在GRUB启动项中删除之前自己编译安装的kernel版本,则只需要将/lib/modules和/boot目录下的安装时copy过来的相关东西删除。然后再
调用sudo update-grub,它会自动删除/boot/grub/grub.cfg中对应的kernel版本的启动项。