前言
什么是内核(kernel)
Kernel是操作系统的核心,掌控者所有硬件设备的控制权。也即是说,你所希望计算机帮你完成的各项工作,都需要通过内核的帮助才能完成,当然,如果你想要完成的某个功能是内核没有提供的,那么我们就无法通过内核来控制计算机完成这项工作了。如果我们想要让内核去完成这个功能,那么我们就必须将该功能的模块 “添加” 到内核当中,这就类似于 “驱动程序” ,有了这样一个“驱动程序”的支持之后,我们的硬件(CPU、网卡)才能去完成之前不能完成的功能。这里的模块 “添加” 我们这有一个专业的词语叫做编译。那么内核到底是什么呢?其实内核就是系统上面的一个文件而已,这个文件包含了驱动主机各项硬件的检测程序与驱动模块。我们知道当操作系统读完BIOS并加载MBR中的Boot Loader之后,就能加载内核到内存当中了,然后就开始检测硬件设备、挂载根目录来获取内核模块来驱动所有的硬件设备,之后就开始会叫 /bin/init 进程来完成系统的启动。内核文件是在 /boot 目录下一个以 vmlinuz 开头的文件,有时我们会发现 /boot 目录下有好几个以 vmlinuz 开头的文件,也就是说主机上有多个内核,但是启动的时候仅能选择一个来加载,所以说 Linux 是单内核、模块化体系
什么是模块化
模块化可以这样理解,一个程序可以完成很多个功能,那么每个独立的功能就可以称之为功能模块,这些独立的功能模块组合起来就可以完成一系列的大的功能,这里我们就是将功能进行模块化。内核也是一样的道理,还记得 Linux 的哲学思想之一吗?就是集合小命令完成大人物。这里的小命令相对于大的任务也是模块化的
什么时候我们需要对内核进行编译呢
既然内核文件里面包含了硬件检测与驱动模块,如果一个新的硬件设备在添加的时候发现内核里面没有支持该硬件的驱动模块,那该怎么办呢?难道我们就要重新编译一个内核么?显然这种做法是不恰当的,你要知道编译内核是一件很麻烦的事情,需要专业的管理员需要很长时间来编译的,我们一直说模块的概念,在这里就充分体现了模块化的优势了,就是说我们可以单独的将具有支持该硬件的功能模块编译,,然后让内核去加载它,这样内核不就可以使用了吗?况且也不影响之前内核对原有设备的支持能力。
内核编译过程
一、编译前准备工作
1、获取目标主机硬件设备相关信息:
(1) CPU:
- . # cat /proc/cpuinfo
- · # x86info –a
- . # lscpu
(2) PCI设备:
- .# lspci -v (-v v 详细信息)
- .# lsusb -v (-v v 详细信息)
- .# lsblk 块设备
(3)了解全部硬件设备信息
hal-device
二、开发环境及源码
(1)安装开发包组
# yum groupinstall Development toos
(2)获取内核源码
(3)内核功能的选择
-
# make menuconfig
[ ] : 不启用此功能
[M] : 编译成内核模块
[ * ] : 编译进内核
三、内核编译的步骤
(1)首先下载所需要的内核代码文件
- 通过 https://www.kernel.org/ 进行下载
(2)解压缩源代码文件到指定目录
tar -xvf linux-3.18.60.tar.xz -C /usr/src/
(3)给解压后的文件(linux-3.18.60)建立软连接
- <1> 首先切换到
/usr/src
- <2> 给 linux-3.18.60 建立软连接 :
ln -sv linux-3.18.60 linux
Paste_Image.png
-
注意: 通常有很多应用程序比如额外编译驱动时都会到
/usr/src
下找,而且会到/usr/src
下找linux
的目录,而不是去找linux-3.18.60
,因此我们需要去建立软连接而不是去把linux-3.18.60
改名字为linux
,因为如果我们将来需要多版本并存的时候,我们希望很快找到其中的任何一个版本,如果都改为linux
那么就混乱了,所以最好的方式还是为其建立软连接 -
切换到 linux 目录下
(4)copy 当前系统内核的配置文件模板文件到新内核目录下 :
Paste_Image.png Paste_Image.png解释一下上面的步骤: 从boot目录拷贝一个config文件过来主要是为了方便,这个文件里保存都是之前你在安装系统是内核所安装的模块,这里拷贝过来为了主要为了方便演示,具体各位以后在应用中需要什么的模块那各位就自己去筛选了(这种工作几乎不会做当然除非有特殊需求的)。
(5)选定配置(我们使用 make menuconfig )
- 1、首先执行
make menuconfig
命令(该命令必须在源码目录下执行)
第一步先给内核起个名字:
- 2、选择我们需要启动的内核模块。
在打开这个配置界面的第一个界面下依次选择 File systems -- > DOS/FAT/NT file systems -- > NTFS file systems support (利用空格键选中。[ ] N [M] 表示将模块打在ramdisk中 [*] y 表示将模块打在内核中。本实验将NTFS模块打在ramdisk中。 )
(6)开始进行编译
- 因为远程编译可能终端如果断开那那就前功尽弃了 ,所以诸位在编译前最好使用
screen
这样即使终端断开也不用担心编译中断了。
make -j 2
(cpu 核心数 单一核心就不用写了) (该命令在源码目录下执行) 编译过程可能需要一段时间机器性能好的话 几分钟性能不好的话半小时以上。编译过程总可能会报错最多的报错就是openssl 各位大可以提前安装(yum 安装就好)
<1> 打开虚拟窗口:
Paste_Image.png** <2>编译:**
- 执行命令:
make -j 4
之后就会开始编译。 - 刚刚由于我们开启了 screen 虚拟窗口,我们如果不小心把这个终端关掉也不用担心。当然我们可以按下
Ctrl + A ,然后松手按下 d 键(不是大写D)
,这样我们就可以退出虚拟窗口了,不用担心,因为我们的编译已经交给screen放在后台执行,如果你想打开我们之前关闭的窗口我们可以用命令screen -ls
先列出关闭的screen的编号:
然后我们用命令
screen -r 5014
就可以打开之前关闭的screen窗口了:
Paste_Image.png
(7)安装模块(make modules_install)
在命令行执行命令 : make modules_install
**
**(8)安装内核(make install)
执行命令 make install
安装内核相关文件,主要目的将所有的编译之后的内容拷贝安装到相应的目录。
四、对其编译的内核进行验证
重启系统,选中自己编译的内核对其进行验证
五、清理删除
在已经执行过编译操作的内核源码树做重新编译:
需要事先清理操作:
- 1、
# make clean :
清理大多数编译生成的文件,但会保留config文件等
- 2、
# make mrproper :
清理所有编译生成的文件、 config及某些备份文件
- 3、
# make distclean :
相当于mrproper,以及删除编辑器备份及补丁文件
卸载内核
- 删除/lib/modules/目录下不需要的内核库文件
- 删除/boot目录下启动的内核和内核映像文件
- 删除/usr/src/linux/目录下不需要的内核源码
- 更改grub的配置文件,删除不需要的内核启动列表(下图即为grub的配置文件)
网友评论