一:前言
1:内核的概念:
Kernel(内核)是操作系统的核心,掌控着所有硬件设备的控制权。计算机所要完成的各项工作,都需要通过内核的帮助才能完成。内核就是系统上的一个文件,这个文件包含了驱动主机各项硬件的检测程序与驱动模块。
2:什么叫做编译?
如果想要完成的某个功能是内核没有提供的,那我们就无法通过内核来控制计算机完成这项工作。如果我们想让内核去完成这个功能,那就必须将这个模块“添加”到内核中,这就类似于“驱动程序”,有了这样一个“驱动程序的支持后,硬件(CPU、网卡等)”才能去完成之前不能完成的功能。这里的模块“添加”的过程就叫做编译。
3:内核模块
内核模块的存放位置为/lib/modules/$(uname -r)/kernel
,所有以.ko
结尾的文件都是模块文件;其中uname -r
为当前系统内核版本信息。
二:编译前准备(以Centos6.9为例)
1:安装开发包组
# yun groupinstall Development tools`
2:下载内核源码及解压
下载地址https://www.kernel.org/
#cd /usr/src
# tar -xvf linux-3.18.56.tar.xz
3:准备配置文件
# cd /usr/src/
# cp /boot/config-2.6.32-696.el6.x86_64 ./linux-3.18.56/
# grep NTFS ./linux-3.18.56/config-2.6.32-696.el6.x86_64
显示结果为# CONFIG_NTFS_FS is not set
注:从boot下拷贝一个config文件主要是为了方便,这个文件里保存的是之前在安装系统时内核做安装的模块。这里拷贝过来主要是为了方便演示,具体应用中可以根据自己的需要进行模块的筛选。至于grep NTFS 是为了让大家看一下NTFS这个模块没有启动,下面在编译的时候我们就将NTFS启用。
三:编译开始
1:执行make menuconfig
命令(该命令在源码目录下执行)
第一步:先给以后的内核加个名称
2:选择需要启动的内核模块
在编译的第一个界面一次选择File systems -->DOS/FAT/NT file systems -->NTFS file systems support
(利用空格键选中。[M] b表示将模块打进ramdisk中,[*]表示将模块打在内核中。本实验将NTFS模块打在ramdisk中)
保存退出之后
grep NTFS .config
显示修改结果
3:开始进行编译
注:如果编译是在远程连接上的话、make会出问题的、如果远程连接断开的话那运行的进程是不是也都断开了、这个make的进程一定是当前系统上运行的子进程、有些一旦父进程挂了、子进程也将不复存在。
所以我们使用一个叫screen这个命令来操作,没安装自己安装上就是了,可以在一个窗口上启动n个虚拟的桌面,即使退出了也会保留之前的内容,切换进screen就可以看到窗口标题栏上的screen标志了:
具体使用方法如下:
<在源码目录下执行>
-
screen -ls
:可以查看当前启用了多少个screen 按Ctrl+a,松开再按d可以隐藏screen桌面 因为编译内核需要比较长的时间、所以我们在screen上编译、然后再把screen桌面隐藏就可以了;
重新接入screen:
# screen -r
跟上screenID就可以了 然后我们就开始编译吧;
正在编译
4:安装模块
make modules_install
这步完了之后可以查看一下/lib/modules 目录下就会生成一个以版本号命名的一个文件模块了
5:安装内核相关文件
make install
这一步的主要目的是将所有的编译之后的内容拷贝安装到相应的目录。安装完之后会在/boot目录下生成一个内核文件vmlinux-3.13.2,还有一个与当前编译的版本一样的文件,可以查看一下。现在已经编译好了一个新内核了
6:编辑grub配置文件(一般会自动配置,查看一下)
#vim /boot/grub/grub.conf
好了、重启一下试试,如果顺利的话就可以进到内核选择界面了,选项我们编译的新内核就OK了
三:总结
1:步骤整理:
1、获取内核源码,解压至/usr/src
# tar xf linux-3.13.5.tar.xz -C /usr/src
# ln -sv /usr/src/linux-3.13.5 /usr/src/linux
2、配置内核特性(选择一种方法就可以了)
make config:遍历选择所要编译的内核特性
make allyesconfig:配置所有可编译的内核特性
make allnoconfig:并不是所有的都不编译
make menuconfig:这种就是打开一个文件窗口选择菜单
make kconfig(KDE桌面环境下,并且安装了qt开发环境)
make gconfig(Gnome桌面环境,并且安装gtk开发环境)
3、编译内核
# make [-j #] : #号最多为CPU物理核心总数的两倍,这样会快点哦
4、安装内核模块
# make modules_install
5、安装内核
# make install
6、验正并测试
# cat /boot/grub/grub.conf
查看新内核是否已经添加, 而后重启系统并测试
2、配置内核选项
支持“更新”模式进行配置: make help
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面 支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 所有选项均回答为“yes“
(c) make allnoconfig: 所有选项均回答为"no“
3、编译
全编译:make [-j #]
编译内核的一部分功能:
a) 只编译某子目录中的相关代码:
# cd /usr/src/linux
# make dir/
(b) 只编译一个特定的模块:
# cd /usr/src/linux
# make dir/file.ko
例如:只为e1000编译驱动:
#make drivers/net/ethernet/intel/e1000/e1000.ko
4、编译内核
如何交叉编译内核:
编译的目标平台与当前平台不相同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助
# make ARCH=arch_name help
# make ARCH=arm help
5、清理删除
在已经执行过编译操作的内核源码树做重新编译:
需要事先清理操作:
# make clean:清理大多数编译生成的文件,但会保留config文件等
# make mrproper: 清理所有编译生成的文件、 config及某些备份文件
# make distclean: mrproper、 patches以及编辑器备份文件
6: 卸载内核
删除/lib/modules/
目录下不需要的内核库文件
删除/usr/src/linux/
目录下不需要的内核源码
删除/boot
目录下启动的内核和内核映像文件
更改grub
的配置文件,删除不需要的内核启动列表