2014年10月15日星期三

Linux内核编译和替换

Linux内核编译和替换小结

一 准备工作

1 当前Linux 环境

系统版本为 3.8.13.13-cdos

2 下载内核源码

在网站 www.kernel.org ,选择合适的版本下载。

本次下载版本为官方最新开发版本 linux-3.17.tar.xz


 

二 内核编译

1 解压源码

当前系统的源码位置为 /usr/src/linux-headers-3.8.13.13-cdos

新的源码解压到 /opt/linux-3.17,使用命令 #tar xvf linux-3.17.tar.xz –C /opt


 

2 make mrproper

Remove all generated files + config + various backup files

"make mrproper"命令清理源代码树,包括过去曾经配置的内核配置文件".config"都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。

即检查有无不正确的.o文件和依赖关系,如果使用刚下载的完整的源程序包即第一次进行编译,那么本步可以省略。而如果你多次使用了这些源程序编译内核,则最好要先运行一下这个命令。


 

3 make olddefconfig

将当前系统存在的.config 文件拷贝至3.17.0源码目录,使用make olddefconfig 命令配置内核选项。

make olddefconfig 的含义为:采用已有的.config文件的参数作为默认参数,同时升级依赖属性,新属性设置为默认值不再提醒。


 

也可以使用以下两个命令:

make config:纯文本界面配置。

make menuconfig:基于文本的彩色菜单、单选列表、对话框。(常用)


 

4 make dep

如果内核从未编译过,此步可跳过

根据配置结果,建立文件依赖关系。

该命令将会修改linux中每个子目录下的.depend文件,该文件包含了该目录下每个目标文件所需要的头文件(绝对路径的方式列举)。


 

5 make clean

如果内核从未编译过,此步可跳过

Remove most generated files but keep the config and enough build support to build external modules

清理一些不必要的文件,如果你在上次编译的基础上,删去了一些选项,执行这一步操作,否则,就没有必要了。


 

6 make –j

生成内核模块、bzImage、System.map等文件。

-j[N]: 同时允许N个任务,而如果-j后不跟任何数字,则不限制处理器并行编译的任务数。


 

本步也可以分别执行 make bzImage 、make modules。


 

三 安装内核和模块

1 make modules_install

编译成功后,系统会在/lib/modules目录下生成一个3.17.0子目录,里面存放着新内核的所有可加载模块(即将编译好的modules拷贝到/lib/modules下)。


 

2 make install

执行该命令后,/boot 文件夹下会增加一下内容:

cp .config /boot/config-3.17.0

cp System.map /boot/System.map-3.17.0

cp /arch/i386/boot/bzImage /boot/vmlinuz-3.17.0


 

3 mkinitramfs

敲入命令生成内核版本相对应的img 文件:

#mkinitramfs 3.17.0 –o /boot/initrd.img-3.17.0


 

至此,更换内核所需的所有文件config、System.map、vmlinuz、initrd.img 都已经完成了。


 

4 update-grub2

更新启动文件grub.cfg,将3.17.0添加至系统启动选项中。


 

三 总结

恭喜您,到这里所有的内核更换工作已经完成,可以reboot 检验下了。

 

Linux UML 内核调试方法

Linux UML 内核调试方法小结

一 UML环境的搭建

1 下载內核

从官网www.kernel.org 选择版本 linux-3.10.57.tar.xz

解压到相应路径     /opt/um/linux-3.10.57


 

2 基于 um的内核配置

#cd /opt/um/linux-3.10.57

#cp cd /boot/config-3.8.13.13-cdos .config

# make olddefconfig ARCH=um


 

为方便进行调试,修改配置文件

#make mrproper

#make mrproper ARCH=um

# make menufconfig ARCH=um

在选择配置时确保选中:

Kernel Hacking->

Compile the kernel with debug info(对应的DEBUG_INFO配置为yes)

和Compile the kernel with frame pointers(对应的FRAME_POINTER配置为yes)

这样生成的二进制内核linux中才有详细的调试信息。


 

同时,生成完.config文件后,编译之前,可以用编辑器打开源码根目录下的Makefile文件,把编译优化等级-O2调成-O1,这样可以在保证编译通过的前提下生成的内核文件具有较好的调试效果。

3 编译内核及模块

#make linux ARCH=um

#make modules ARCH=um

#make modules_install ARCH=um


 

生成我们需要的内核了,而且支持调试了。


 

4 制作文件系统

直接启动会有问题的,提示找不到root文件系统。这样我们用人家现成的。


http://fs.devloop.org.uk/ 下载 CentOS6.x-x86-root_fs.bz2

通过gunzip2 解压 得到 CentOS6.x-x86-root_fs

注: CentOS 经过实践可用,同样的 Ubuntu Trusty 运行时会遇到各种问题.

当下载或制作好更文件系统中后,可以将上一步生成的modules拷贝到UML根文件系统的对应目录中去。在Host Linux和UML根文件系统之间传递文件,最简单的方式就是使用挂载UML根文件系统到Host Linux中的目录,然后使用cp。拷贝Host Linux中源码根目录下mods中的文件到UML根文件系统中:

#mount -o loop CentOS6.x-x86-root_fs /mnt

#cp –R /opt/um/linux-3.10.57/mods/lib/modules/3.10.57 /mnt/lib/modules

#umount /mnt


 

5 制作文件交换系统

一般情况下不使用交换文件系统也是可以的,使用交换系统可能对系统的稳定性有些好处。

使用以下命令生成:

#dd if=/dev/zero of=swap_fs bs=1M count=512


 

#mkswap ./swap_fs


 


 

二 gdb 调试UML

经过以上步骤,调试所需要的环境已经准备好,接下来就可以开始调试工作了。

1 运行 User-Mode Linux

在 编译好的/opt/um/linux-3.10.57 根目录下,执行Linux运行

# ./vmlinux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs

或者 # ./linux ubda=.CentOS6.x-x86-root_fs ubdb=swap_fs


 

出现以下信息,说明UML运行成功,默认使用root 账户登录,无密码。

CentOS release 6.5 (Final)

Kernel 3.10.57 on an i686


 

localhost login:


 

2 gdb 调试uml

保持上一步中的UML 保持运行状态,开启另一个终端。

首先查询UML 的进程号,可以看到其中的uml根进程号为29142,但是gdb绑定的是其子进程29143。

root@liuyw-OptiPlex-9010:/opt/um/linux-3.10.57# ps -el|grep linux

4 S 0 29413 30142 27 80 0 - 8836 hrtime pts/22 00:00:02 linux

1 S 0 29420 29413 0 80 0 - 8836 SyS_io pts/22 00:00:00 linux

1 S 0 29421 29413 0 80 0 - 8836 unix_s pts/22 00:00:00 linux

1 S 0 29422 29413 0 80 0 - 8836 poll_s pts/22 00:00:00 linux

1 t 0 29423 29413 0 80 0 - 346 ptrace pts/22 00:00:00 linux

1 t 0 29551 29413 0 80 0 - 167 ptrace pts/22 00:00:00 linux

1 t 0 29702 29413 0 80 0 - 172 ptrace pts/22 00:00:00 linux

1 t 0 30000 29413 0 80 0 - 242 ptrace pts/22 00:00:00 linux

1 t 0 30025 29413 0 80 0 - 357 ptrace pts/22 00:00:00 linux

1 t 0 30032 29413 0 80 0 - 381 ptrace pts/22 00:00:00 linux


 

启动gdb,进入gdb调试环境

#gdb linux

#attach 29143


 

3 测试gdb

在gdb 环境中设置断点在sys_clone。

#b sys_clone

#i b


 

在UML环境中执行命令ls -l,系统将会在sys_clone()函数处停下来,现在就可以在gdb中查看sys_clone()函数运行的状态。


 

至此,UML 调试环境已经搭建起来了,我们就可以对linux 内核进行基本的调试了。


 

参考文档

1 http://blog.csdn.net/ztz0223/article/details/7874759

2 http://blog.chinaunix.net/uid-21525518-id-1824661.html

3 http://blog.sina.com.cn/s/blog_70dd16910101akk2.html


 


 


 

2011年12月17日星期六

测试Live Writer

这是一片使用Windows Live Writer发表的日志,呵呵,仅供测试。

2011年4月21日星期四

夏日长眠

冬有冬眠,夏有夏殇。                     
不知道怎么的,伤到肠胃了。医生说,只能喝点稀饭吃点馒头咸菜。  
于是身体立即虚弱下来,精神更显疲惫,从去年到今年的兴奋样一扫而光。
不知道是不是累了,该歇歇了。可是心里面还说着不能,以前不就是这样开始放弃的吗?
就这样抗着,其实也并没有多少收获。可能盲目的前进着,思考的时间太少了些,亦或者无用的思考着太多,行动的太少。
这些话都该写下来,或者用任意方式记录着,不至于我瞬间又忘掉。一遍一遍的做着无用功,更累。
在校园里空旷的路上,又经常想起2501那些大把挥霍青春的岁月,一如现在一样,怀念着,羡慕着。
走吧,用自己的方式,不需要奔跑的姿态,面对人生。

2011年4月17日星期日

爱是情非

     时光如箭,转眼春天或者秋天或者冬天或者夏天又到了。可我们小时候真的不知道他们有什么区别,只不过玩物变了下而已。到了初中,当第一次学到How time  flies的时候,我还不住的惊叹老外的小孩儿不也如此,一样要写这么无聊的作文啊。
   省略此处,从第一次过自己的生肖年到第二次过本命年。上初中也是极为激动的事情,这意味着可以稍微自由些,长大了些以至于可以和心仪的女生说些话了,也意味着可能受到”坏学生”的欺负上交保护费,幸运的是,这些担心多余了。对于我的初中,可以讲三天三夜的故事;而对于我的初中生涯,则太平淡,我无所适从。这句话中,将初中改为高中或者大学,语意竟然同样成立,不能不感到些悲哀。
    基于本文的题目,就只有从我初三的同桌友说起了。友因为是复读生的关系,年龄比我们大了一两岁,再加上比较豪放,有一头郑伊健式的长发,因此称作友。虽然后来我看过古惑仔才知道健哥,但在我们那时候的初中,小帮派倒是到处泛滥。每天晚上聚伙打架,或者偶尔收拾一下爱多管闲事的保安,都是家常便饭,这里面可能有友,但绝对没有我。见别人打人或者被打或者群殴是经常的事,但我第一次参与是在友的带领下。那天晚上自习课的课间,友和我在走廊的角落里,教训了那个不实实务的转校生,我似乎比被打那位还紧张,整个过程没敢出一下手。由此证明,我是多么老实和胆小的娃。
    至于挨打着为什么被打,我一直以为是友青春期的各种躁动引起的,第一位的就是爱情。如果友看到这里会骂我,Y的,你小子这么怂,还在这儿假正经的分析大哥我。如果有第二位,应该是哥们儿义气,当时的我们没有朋友这一说,标定关系只有两种称谓:同学和哥们儿,所以朋友这个词我现在也很少用。
    我初三的同桌是友,友喜欢的女孩叫做静。人如其名,静很安静,很乖。而在当时的我看来,静并没有什么特别之处,但是友却是执迷不悟。具体表现为,每周都要写一封情书,以至于我不明白,到底是因为友的钢笔字写的好才去写情书,还是因为写情书多了练了一手好字。当然了,传递情书的任务大部分都落在了同桌的身上,谁让我又呆呆的呢。这之后,我又不禁为这些作品感到惋惜,它们最后都逃不过被撕碎扔掉命运。也许这个时候流星花园太流行了,似乎被追的女生们都应该是这种反应才对。我的同桌友自然也毫不示弱,每次被拒绝之后,友都做出一些割手指,割腕的傻事来。每当我看到这些,就只有一边被吓得目瞪口呆一边安慰同桌,我也在想我到底懂不懂自己在说些什么。也许就在这些日子里,我学会了孜孜不倦的劝人,尽管我可能连自己都没经历过这些事情,但尽量把事说的很乐观。
    在友一直追静的日子里,我还是那么不开窍,执着的认为早恋就是早恋,却也怎么也没想过早恋与爱与情的关系来,怪不得我情商这么低,耳染目睹下竟然还这么无动于衷。
    友和静并没有以浪漫的童话故事结局,友已经是复读生,本来成绩还可以,这一年有希望考进高中。在爱了恨了之后,成绩自然一落千丈,中考后就去打工了,而静也没有了消息。

2011年4月13日星期三

碎片

小学和初中同学,差不多都已经结婚了,
高中和大学同学,基本上都在考虑什么时候结婚了,
剩下的,
呵呵,
还在为这个问题烦恼着。

放弃人人,腾讯

    逐渐放弃人人网和腾讯空间,不再在这两个上面发表文章和转载帖子了,偶尔发电状态和微博就好。
    要写文章的话,就在这里了。
    今天第一次,在这里写上几句话,共勉。
    附最近的心情:
    处于极度不耐烦,又无处释放的,凌乱的一无是处。