RHEL6.5内核编译

本章主要内容:

  1. 源码编译Linux内核

  2. 使用Linux内核模块

  3. 实战-编译一个NTFS内核模块,实现linux挂载NTFS文件系统并实现读写功能

注意:

安装前确保你的硬盘可用空间大于7G,否则编译时,会因为空间不够,提示你安装不成功。另外,安装时为加快速度,把虚拟机内存要调到2.5G以上(越大越好)

本文以RHEL6.5编译内核-kernel-3.19.8为例进行详细讲解

一、内核编译主要执行步骤

1、到www.kernel.org上下载相应的内核源码包

2、确认你的系统中已经具备了编译软件的基本条件,也就是要安装make ,gcc, gcc-c++ ,ncurses-devel和库工具等等 。  开发工具和库

3、解压内核源码包

4、配置内核编译参数

5、编译内核

6、安装编译好的内核与模块

7、查看或修改GRUB菜单(为了确认你是不是真的把内核安装好了)

8、重新启动系统,测试新内核的工作情况

二、源码编译内核

1.编译前准备

首先查看当前系统的内核版本

[root@xuegod164 ~]# uname -r
2.6.32-431.el6.x86_64

添加一块硬盘并分区

[root@xuegod163 ~]# fdisk /dev/sdb
注:把所有的空间(20G)都给sdb1  
[root@xuegod163 ~]# mkdir /sdb1/
[root@xuegod163 ~]# mkfs.ext4 /dev/sdb1
[root@xuegod163 ~]# mount /dev/sdb1/sdb1/

2.到www.kernel.org上下载相应的内核源码包

wget  https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.8.tar.xz

3. 确认你的系统中已经具备了编译软件的基本条件

也就是要安装make、gcc、gcc-c++ 、ncurses-devel和库工具等等

4. 解压内核源码包

解压内核:

将下载好的内核源代码通过xshell上传/sdb1下

[root@xuegod163 sdb1] ls /sdb1
linux-3.16.2.tar.xz
[root@xuegod163 sdb1]# xz -dlinux-3.19.8.tar.xz
注:-d, --decompress    forcedecompression   (di:kmpres解压缩)
[root@xuegod163 sdb1]# tar xflinux-3.19.8.tar
[root@xuegod163 ~]# du -sh linux-3.19.8
642M     linux-3.19.8

#清一下缓存 

[root@xuegod63 sdb1]# reboot

5.通过图形界面配置内核编译参数,生成内核参数配置文件 .config

[root@xuegod163 sdb1]# cd/sdb1/linux-3.16.2
[root@xuegod163 linux-3.19.8]# make menuconfig #通过一个图形界面,来配置内核的参数NTFS的位置如下图

wKioL1Y-1srByRYJAAEYrRwhzt0097.jpg

选择“File system”  然后按回车。

wKioL1Y-1tezxUdrAAEN3i5VSYo697.jpg

选择NTFS file system support  回车,然后光标下移到:NTFS write support .

wKioL1Y-1vCxDmeGAAEmjDPdfb0740.jpg

wKioL1Y-1vDBsH36AADdJLxulmo523.jpg

[root@xuegod163 linux-3.19.8]# vim/sdb1/linux-3.19.8/.config
CONFIG_NTFS_FS=m
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y
[root@xuegod63linux-3.19.8]# vim /boot/con

fig-2.6.32-220.el6.x86_64  #搜索 NTFS,默认系统内核参数中这个一项是空着了

wKiom1Y-1rjivU_cAACvzduooJY670.jpg

注:如是想查询,某个参数在哪里,可以这样,在这个界面下,输入: /

wKioL1Y-1wezfKTQAAEdBSeg_kw186.jpg

然后再输入: NTFS  就显示如下:

wKiom1Y-1s6g47UPAAEfIF065gY933.jpg

6. 通过修改config文件配置内核编译参数

[root@xuegod163 linux-3.19.8]# cp/boot/config-2.6.32-431.el6.x86_64 /sdb1/linux-3.19.8/.config

下面我们在复制好的.config中只增加一个功能,就是增加对NTFS读写功能。复制完.config后,执行命令:

[root@xuegod163linux-3.19.8]# make menuconfig

wKioL1Y-1x7i9sstAADrB-pGvA0601.jpg

向下移动光标找到如下内容:

wKioL1Y-1y-AdphWAADChq4Qhyg120.jpg

wKioL1Y-1zDhJP6SAAD8BORsGlc050.jpg

wKiom1Y-1uzwi5-8AACUxXDSXRM183.jpg

wKioL1Y-1zDh_ZPNAAC543rwp_0525.jpg

wKioL1Y-1zDRCVN7AACaOWlR60o719.jpg


保存后,按下esc选中Exit 进程退出

wKiom1Y-1vyiLi6cAAClVJISd88595.jpg

7.编译内核

[root@xuegod163 linux-3.19.8]# makebzImage

注:生成内核,此内核是经过压缩的内核,这里需要一段时间,取决于你的系统性能。

BUILD   arch/x86/boot/bzImage

此处省略无数字节……

Kernel: arch/x86/boot/bzImage isready  (#1)

8. 生成新内核的驱动模块

[root@xuegod163 linux-3.19.8]# make modules

这里也是需要一段时间

此处省略无数字节……

 

IHEX   firmware/edgeport/down3.bin
  IHEX2FW firmware/whiteheat_loader.fw
  IHEX2FW firmware/whiteheat.fw
  IHEX2FWfirmware/keyspan_pda/keyspan_pda.fw
  IHEX2FWfirmware/keyspan_pda/xircom_pgs.fw

9. 安装编译好的内核与模块

1)安装模块

[root@xuegod163 linux-3.19.8]# makemodules_install

这里也是需要一段时间,这一步就是把编译好的modules拷贝到/lib/modules/相应的内核目录里面

此处省略无数字节

...

INSTALL /lib/firmware/whiteheat.fw
  INSTALL/lib/firmware/keyspan_pda/keyspan_pda.fw
  INSTALL/lib/firmware/keyspan_pda/xircom_pgs.fw
  DEPMOD  3.16.2ZZ

2)安装新编译的系统内核

[root@xuegod163 linux-3.19.8]# makeinstall

10. 查看或修改GRUB菜单(为了确认你是不是真的把内核安装好了)

[root@localhost linux-3.0.4]# vim  /boot/grub/grub.conf

wKiom1Y-1wugVQk7AAGqt-K7po0736.jpg

11. 重新启动系统,测试新内核的工作情况

注意,在启动的时候,需要自己进来一下选择,否则默认还是以前的内核启动哦。除非你在上一步把默认启动项给改了。

使用新内核启动系统后,查看内核版本:

[root@localhost ~]# uname –r

最后总结一下编译内核的步骤 :

1 . xz  -d linux-3.16.2.tar.xz

2 . tar xflinux-3.16.2.tar   #解压文件比较多就不加-v了

3 . make menuconfig

4 . makebzImage

5 . makemodules

 6 . echo $?  #为了确保没有错误,可以用上面的命令来查看是否有错误,如果是0的话,就表示没有错误或警告了

7 . make modules_install

8 . make install

9 . 重启,测试

三、内核模块

1. 内核,操作系统,软件关系图

wKiom1Y-1xThXNwfAAAu52fL7kw881.png

2. 内核模块操作

内核(模块)管理命令:insmod、modinfo、modprobe……等。

模块的作用:把具体功能封装好的程序。   比如,冲电宝。可以给所有手机冲电。

3. 存放内核模块的路径

[root@xuegod163 ~]# ls /lib/modules/
2.6.32-431.el6.x86_64  3.19.8
 
[root@xuegod163 ~]# cd/lib/modules/3.19.8/kernel/fs/
[root@xuegod163 fs]# cd fat/
[root@xuegod163 fat]# ls
fat.ko  msdos.ko  vfat.ko #Linux可以直接支持FAT32文件系统


4. 模块管理命令使用

(1)插入模块 insmod

载入模块fat.ko

[root@xuegod163 fat]# pwd
/lib/modules/3.19.8/kernel/fs/fat
[root@xuegod163 fat]# insmod fat.ko


(2)查看当前系统中加载的模块 lsmod

[root@xuegod163 fat]# lsmod | grep fat
fat     59587  0


(3)删除模块 rmmod

[root@xuegod163 fat]# rmmod fat
[root@xuegod163 fat]# lsmod | grep fat


(4)更新内核对模块的配置文件depmod

[root@xuegod63 fs]# depmod


(5)查看模块之间依赖关系

[root@xuegod163 fat]# cd /lib/modules/3.19.8/
[root@xuegod163 3.19.8]# vim modules.dep


查看模块间依赖关系:如fat。从下图可以看出,vfat和msdos模块都依赖fat.ko模块

文件格式

模块的路径                        :   依赖的模块

wKioL1Y-12WydLsEAAAxjUHoM3M609.png

(6)查看模块信息

#modinfo    查看模块信息

[root@xuegod163 fat]# modinfo vfat
filename:      /lib/modules/3.19.8/kernel/fs/fat/vfat.ko
author:        Gordon Chaffee
description:    VFATfilesystem support
license:       GPL
alias:         fs-vfat
srcversion:    3A2520B90FAB5DF5806E200
depends:       fat
intree:        Y
vermagic:      3.19.8 SMP mod_unload modversions


(7)插入模块 modprobe

modprobe   插入模块(可以自动解决模块之间的依赖关系,像yum可以自动解决rpm之间的依赖关系一样)

插入一个模块

[root@localhost fat]# rmmod vfat   
[root@localhost fat]# rmmod fat
[root@localhost fat]# insmod vfat.ko 
insmod: error inserting 'vfat.ko': -1Unknown symbol in module
[root@localhost fat]# modprobe vfat   #可以成功安装
[root@localhost fat]# lsmod | grep vfat
vfat                   10776  0 
fat                    55184  1 vfat


四、开机自动加载模块

[root@xuegod63 fs]# vim /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* allthe other init scripts.
# You can put your own initialization stuffin here if you don't
# want to do the full Sys V style initstuff.
 
touch /var/lock/subsys/local
modprobe fat


五、实战编译一个NTFS内核模块,实现挂载NTFS文件系统读写

1安装fuse

[root@xuegod163 ~]#tar zxvffuse-2.8.3.tar.gz 
(1) [root@xuegod163 ~]#ls
(2) [root@xuegod163 ~]#cd fuse-2.8.3
(3) [root@xuegod163 fuse-2.8.3]#./configure
(4) [root@xuegod163 fuse-2.8.3]#echo $?
(5) [root@xuegod163 fuse-2.8.3]#make 
(6 [root@xuegod163 fuse-2.8.3]#echo $?
(7) [root@xuegod163 fuse-2.8.3]#makeinstall


2安装ntfs-3g          

(方法同上)

3挂载

插一个NTFS格式分的U盘。然后把U盘导入到虚拟机中

wKioL1Y-12-wenDXAAE9Z4smXf0066.jpg

[root@localhost ~]# mount -t ntfs-3g/dev/sdb1 /opt/


4实现开机自动挂载

[root@localhost ~]#  vim /etc/fstab
/dev/sdb1             /opt      ntfs-3g   defaults        0 0
[root@localhost ~]#mount –a    #进行检查


   本文到此就已经结束了,大家是否觉得内核编译其实也没有想象的复杂,和源码安装一个软件很类似,大家编译时细心一些就可以了,以上有什么不对的地方希望各位大神们多多指正。


学神-IT-教育51cto技术交流群:468845589  快来上我们公开课吧!

 

本文由 学神-IT-教育 1508VIP学员 学神-IT-逍遥 同学 整理提供