Linux内核裁剪——无模块支持
1 要求
1.1 完成无模块支持的Linux内核定制
1.2 生成的新内核在CentOS6.2虚拟机中启动成功,并可登陆进入系统
2 原理
2.1 Linux系统启动过程
2.2 initrd.img的作用
Ø 作为临时根文件系统的载体
Ø 加载必要的驱动以便使内核可以访问真正的根文件系统
Ø 挂载真正的根文件系统
Ø 进行根切换操用真正的根文件系统作为根启动
2.3 grub.config文件
Ø 系统引导程序的配置文件
Ø 加载传输控制到操作系统的内核
配置文件说明:
title - 引导条目的名称。通常使用操作系统的名称做为标识
root - 操作系统内核和引导文件所在的磁盘分区。(hd0,0)表示第一块硬盘的第一个分区,(hd0,2) 表示第一块硬盘的第3个分区,依次类推。
kernel - 系统内核及 boot 命令用到的参数。
initrd - 系统引导程序
2.4 分析
要完成无模块支持的Linux内核的定制就是不使用initrd.img,把系统所必须的磁盘驱动和文件系统等的驱动编译到系统的内核中,然后修改系统的配置文件引导系统找到系统内核所在磁盘的位置,最后完成系统的引导过程,从而顺利的进入并登陆系统。
3 过程
3.1 配置menuconfig
Ø 去勾选模块支持
Ø 加载必要的驱动程序:主要是加载磁盘的驱动和文件的驱动以及一些通常的设置
3.2 编译内核
在内核源码目录执行make命令,编译生成压缩的内核镜像bzImage,适当裁剪后的内核大小为15M
3.3 安装内核
把生成的bzImage拷到/boot目录下重命名为vmlinuz-3.2.18
3.4 修改配置文件
Ø 这里把“root=UUID=….”手动修改成了/dev/sdb2
Ø 没有指定外部模块的位置
3.5 重启选择新的内核重启
3.6 继续裁剪,裁剪之后的内核和原来的内核做对比
4 遇到的问题和解决
4.1 Linux网络配置
刚开始学习Linux所以网络配置一窍不通,而且对虚拟机的桥连,NAT,host-only等方式也不是很了解,虽然虚拟机一开始的时候自动就能上网,但是后来不能连上网了。
bridge: 虚拟网卡和本机物理网卡是一个物理网上,能够连接外网,虚拟机内部和外部要配成和外部主机相同网段的IP
host only: 虚拟网卡VMnet1是一个物理网上,不能连接外网
NAT:和虚拟网VMnet8是一个物理网上,映射成主机的IP 和外部连接,网关只能配成192.168.10.2。
我采用的是桥连的方式内部IP配好之后还需配置网关和DNS服务器
route add default gw 192.168.10.254
在/etc/resolv.conf种添加nameserver8.8.8.8
不过现在还有一点问题就是在实验室用网线连时即使我的配置文件里面写了BOOTPROTO配成dhcp貌似也不能自动分配IP,但是在304用seedclass wifi的时候就可以。这个问题暂时还没有解决,每次手动配置也没问题。
4.2 Kernel Panic
没有意外,第一次编译的时候也遇到了kernelpanic问题
这里是root的值没有传对,也怪自己上课没有认真听讲,仔细看了课件之后才发现这个问题
把root=UUID删除改成root=/dev/sda1,不过还是遇到了同样的问题。
这说明内核已经加载成功,只不过内核没有办法识别磁盘中的内容,于是我把配置文件里面关于SCSI驱动所有选项基本上都加上去了,重新编译,还是不行。
后面以为是加的驱动不全,于是在dmesg中各种检索,重新配置重新编译,最后还是不行。直到今天早上有同学告诉应该让root=/dev/sdb2。
在网上看到有人说由于Linux内核自身的原因磁盘的设备文件比如/dev/sda /dev/sdb等等情况下会发生混乱,由于是Linux内核自身的问题所以也没有办法解决,不禁泪流满面。
不过仔细想想还是对Linux认识的不够深入,在网上找资料的时候也没有什么明确的方向,所以卡在这个点之后就很难再前进了,加上内核编译的时间有相对而言比较长,所以很容易很是锻炼人的耐心啊。不过问题总算是成功的解决了,只是新生成的内核有点大,15M,裁剪的还不够。还需要进一步的配置
4.3 Putty下纠结的Ctrl + S
使用Putty连接Linux Server的时候,偶尔不小心按了Ctrl + S——尤其是在用vim编辑的时候,总是习惯性的按这个快捷键来保存,但是一瞬间整个会话就没有响应了。刚开始的时候以为是putty挂掉了,所以每次都是重新启动,重新连接Linux Server。也没有意识到是因为按了这个快捷键才遇到的。
实际上在使用putty时ctrl + s终止屏幕输出(即停止回显),我们敲的内容依然有效,只是看不见而已,这个快捷键的作用是当现实的内容很快时可以用ctrl+s锁定。实际上我们只要按一下ctrl+q就可以解锁了。
4.4 SElinux延时
这个问题也只有在启动新的内核失败的时候会发生,如果启动新的内核,接着去启动CentOS原来的内核就会出现这种现象。
官方给出的解释如下:
3.As the Linux rootuser, run the reboot command to restart the system. During the next boot, filesystems are labeled. The label process labels all files with an SELinux context。
不过这并不影响系统的启动,过了一段时间之后系统自动重启,又恢复正常,只是启动的时间比平常要久一点。
4.5 Make localyesconfig用不了
自己采用默认的方式稍微的剪裁之后内核大小为15M,然后自己一个一个的去对照每个选项去勾选要不要,但是由于自己对很多的硬件设备根本就不认识,所以很多东西选择也是很纠结。而且裁剪的效率貌似也很低。
从网上看到可以使用makelocalyesconfig和make localmodconfig来精简内核的裁剪,但是我在我的源码目录下输入make localyesconfig命令的时候出现的结果是这样的现象,提示很多的modules找不到,使用make allnoconfig命令之后还是有这样的现象。没办法我又把原来的linux3.2.18的源码又解压了一份出来,执行make localyesconfig就可以了。
其实第一次用这个命令的时候是在我自己编的3.2.18的内核里面,是没有加载内核模块的,自然没有办法加载modules,但是我切换到原来的系统的内核的时候还是没有办法运行make localyesconfig命令。所以这个问题现在还没有找到原因。
4.6 编译速度过慢
不得不提一下本次实验的编译,由于是在虚拟机下面,而且电脑的配置也不是很好,所以编译的速度特别的慢,第一次编译的时候大概编了3个多小时,每次都花费了大量的时间来编译。电脑也经常是动不动就是CPU使用率90%几,内存使用率90%几。
一开始不知道make是可以增量编译,每次都是傻乎乎的make clean然后make这样原本编译过的模块就又编译了一次。
Make –j4选项,使用了多线程之后编译的速度明显的加快了。
把虚拟机的处理器换成了4核之后速度也有一定程度的提升。
5 实验总结
通过这次实验,加深了我对Linux开机过程的理解,让我明白了原本这么简单的开机过程也有这么大的学问在里头,以前在Windows下面总是直接开机,关机就什么都不管了,所以弄明白了这一系列的流程还是有一点小小的成就感的。
熟悉了Linux的很多常用的指令,和Linux文本交互的的模式:虽然之前也接触过Linux但是那仅仅局限在玩的阶段,真真使用起来还是有很多不知道的,不过周围这么多同学一起在努力,效率还是挺高的,不懂的就去man一下,google一把,或者是问问周围的同学、老师。问题往往能够很快的得到解决。渐渐地觉得在Linux下面那样一种交互模式效率挺高的,不像在windows下——图形化的界面虽然改善了用户的体验,但是往往专注度变得不高了。
关于学习方法,钟老师说的对——不要害怕遇见问题,遇到问题越多的人有机会学到更多的知识,我自己以前总是怕遇到问题,总是对自己没有信心,担心自己解决不好这个问题,担心自己会引入更多的问题。其实现在觉得是自己以前思考问题的方法不对,遇到问题的时候总是习惯性的直接去找答案,习惯性的去纠结,而不是理性的思考——为什么会出现这个问题?这个问题是怎么产生的,别人碰到的问题和我碰到的问题有什么不同,为什么别人能够成功解决,而我不能。也就是说我的问题解决不是建立在理性的逻辑之上,而是带有很大的撞大运的成分在里面。这对于技术人员来说,无疑是很可怕的,我们今后要遇到的问题还有很多。如果不能有一个很好的思维的方式,怎么能够以不变应万变?
做实验的过程中不同步骤相互之间的牵涉要少,这样做实验的时候才会更加顺利,从简单到复杂,这样逐步的建立一个完整的知识体系,也有利于问题的解决和学到更多的知识。