Linux内核编译

来源:互联网 发布:java高并发服务器 编辑:程序博客网 时间:2024/06/15 00:19

Linux内核编译的大致流程如下:
 
一、获取内核代码:编译内核代码之前一定要获取到内核代码,到http://www.kernel.org/下载
查询当前系统的版本号的命令:uname
切换到root用户: su
 
二、配置内核:内核代码包括有很多功能,通过配置文件,选择编译选项,实现定制内核的目的。
 
1、内核的几种配置方式
1. 如果.config不存在,运行make config/menuconfig时,编译器找到每个子目录下的Kconfig文件,并使用其中的缺省值生成.config文件。
2. 如果.config存在,运行make config/menuconfig时的缺省设置即是当前.config的设置,若对设置进行了修改,.config将被更新。
3. arch/xxx/defconfig是一个缺省的配置文件,make defconfig时会根据这个文件生成当前的.config。
4. arch/xxx/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。
5. make oldconfig的作用和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题,在新内核升级的过程 中,make oldconfig非常有用,用户将旧的配置文件.config复制到新内核的源码中,执行make oldconfig,旧的配置文件.config会被备份,同时用户只需要回答那些针对新增特性的问题。
 一般,就用make menuconfig。
 
2、内核编译选项
编译选项数量众多,详细请参考《Linux内核配置参考》,反正我是直接使用默认生成的.config就可以了。不过以下建议将避免您最终得出一个不能工作的内核:
  1. 除非您使用初始化 ramdisk (initrd),否则绝不要把挂载根文件系统必需的驱动程序(硬件驱动以及文件系统驱动)编译成模块!而如果您确实使用初始化 ramdisk,请为ext2FS 支持选项选择 Y,因为 ramdisk 使用该文件系统。您还需要initrd 支持。

  2. 如果您系统中有网卡,将它们的驱动编译成模块。这样,您就能够在/etc/modules.conf 中用别名定义哪一块网卡第一,哪一块第二,等等。如果您将驱动程序编译进了内核,它们加载的顺序将取决于当初它们链接进内核的顺序,而这不一定是您想要的。

  3. 最后,如果您不清楚某个选项的含义,请阅读其帮助!而如果该帮助信息依然不能解决您的困惑,请保留该选项原来的样子。(在configoldconfig 中可以按 ? 键访问帮助。)

配置最终结束后,请保存您的配置并退出。

三、编译内核
1、编译内核
make或make bzImage
编译好的内核文件名是bzImage,生成的文件放在arch/<cpu>/boot/目录下面。
 
2、编译内核模块
make moudles
 
3、安装内核模块
 make moudles_install
所谓安装,就是将编译好的内核模块从内核源代码目录copy到lib/modules/目录下,并根据被编译内核的版本号生成一个新的子目录。我们在做实验的时候,为了安全起见,最好备份好modules目录。
 
四、制作Ramdisk
首先要了解内核与ramdisk的关系:
Linux系统在启动的过程中,需要mount根文件系统,此时除非将根文件系统涉及的所有模块全部(各种文件系统、各种块设备驱动、IDE、SATA)编译到内核文件,否则内核无法完成根文件系统的mount操作,但是如果都编译的话,内核就太大了,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk和内核一样都是一个内存文件,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了。
 
1、重新制作内核映像
mkinitrd initrd-2.6.29  2.6.29
其中 2.6.29为/lib/modules下的目录名称
 
将内核文件bzImage和镜像文件initrd-2.6.29一起拷贝到/boot/目录下,并将内核改名为vmlinuz-2.6.29。
修改/etc/grub.conf文件
 
title MyZinux (2.6.29)
    root (hd0,0)
    kernel /vmlinuz-2.6.29 ro root=UUID=e7ff8cb4-6560-4c5e-99f3-9314e10ed40d rhgb quiet
    initrd /initrd-2.6.29
 
 
【相关知识】makefile文件:
内核版本号由 Makefile 的第一行决定:

$ head -4 MakefileVERSION = 2PATCHLEVEL = 6SUBLEVEL = 8EXTRAVERSION = -1mdkcustom

Makefile 后面,您会发现内核版本号的组成是:

KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

所以我们可以自定义内核的版本号。做的就是更改这些域之一以定义您自己的版本号。一般只改变 EXTRAVERSION。例如您将其改为-foo。新内核版本就会是 2.6.29-foo。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 档案中的年龄有涂改办理退休怎么办 到办理退休不知档案在那怎么办 职工办理退休时档案丢了怎么办 老婆嫌我穷把我和孩子抛弃了怎么办 我招工表比我实际年龄小一岁怎么办 考上好学校名额被顶替了怎么办 面试题领导越级安排工作你怎么办 一个23岁的大学生身体肥胖怎么办 雷达手表把调时间的把出来了怎么办 农村没有住电表被卸载了怎么办 工商已吊销未注销要恢复营业怎么办 中专类学校取消后在编的老师怎么办 情迁微信内置抢红包版本过低怎么办 船运货给客户货到他不要怎么办 摩拜单车锁了还在计费怎么办 旧公司股份现成立新公司股份怎么办 比亚迪l3线路进水打不着火怎么办 新成立的建筑公司没有业绩怎么办 被骗做了深圳国税实名办税怎么办 天猫精灵生活灯老是离线怎么办 电信合约没到期不想用了怎么办 电信合约卡到期不想用了怎么办 欧普照明平板灯坏了怎么办 交通违章处理了但系统没更新怎么办 车里的空调一直吹的是热气怎么办 丰田雷凌保养手册丢了怎么办 海尔电视两年主板坏了怎么办 海信电视保修期内主板坏了怎么办 乐视电视的主板坏了怎么办 车电瓶没电了打不着火怎么办 面包车没电了打不着火怎么办 汽车电瓶没电了打不着火怎么办 自动挡的车没有电打不起来火怎么办 自动挡汽车没电了打不着火怎么办 自动挡小车没电了打不着火怎么办 被4s店销售骗了怎么办 宇通客车尿素泵不工作怎么办 汽车打蜡不小心打在车帮怎么办 海信电视怎么安装第三方软件怎么办 网上买票的时候不想用学生票怎么办 南方公园完整破碎讲话嘴不动怎么办