勤快学

linux编译内核

运维Linux和python  标签:linux    发布于:2017年01月12日

1、 前言

在有的时候,需要给内核进行打补丁,然后修复一些功能,从而此文主要用来讲述如何编译内核添加新的功能(给iptables增加七层协议过滤功能)。

2、 编译内核

2.1 准备环境

       需要下载的文件如下:

wgethttp://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2

wgethttp://netfilter.org/projects/iptables/files/iptables-1.4.7.tar.bz2

wget http://downloads.sourceforge.net/project/l7-filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz?use_mirror=nchc

wgethttp://downloads.sourceforge.net/project/l7-filter/l7-filter%20kernel%20version/2.22/netfilter-layer7-v2.22.tar.gz?use_mirror=nchc

 

当前内核版本如下:

[root@RH55 ~]#uname -r内核版本

2.6.18-194.el5

[root@RH55 ~]#cat /etc/redhat-release 发行版

Red HatEnterprise Linux Server release 5.5 (Tikanga)

[root@RH55 ~]#iptables -Viptables版本

iptables v1.3.5

首先需要安装编译的相关包,如下所示:

[root@RH55 ~]#yum -y groupinstall 'Development Tools' 安装开发工具

[root@RH55install]# ls -l上传内核源码和补丁包

total 65476

-rw-r--r-- 1root root 66796955 Jan  9 06:06linux-2.6.28.10.tar.gz

-rw-r--r-- 1root root   174853 Jan  9 06:06 netfilter-layer7-v2.22.tar.gz

[root@RH55install]# tar -xf linux-2.6.28.10.tar.gz -C /usr/src 解压到指定路径

[root@RH55install]# tar -xf netfilter-layer7-v2.22.tar.gz -C /usr/src解压到指定路径

[root@RH55install]# cd /usr/src/

[root@RH55 src]#ln -s linux-2.6.28.10/ linux 创建源码软链接

[root@RH55 src]#cd linux

[root@RH55 linux]#patch -p1
< /usr/src/netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
打补丁,将补丁文件加入内核中,在使用patch命令的时候,-pnumber表示strip的层级,一般进入源码目录之后,使用-p1即可

patching filenet/netfilter/Kconfig

patching filenet/netfilter/Makefile

patching filenet/netfilter/xt_layer7.c

patching filenet/netfilter/regexp/regexp.c

patching filenet/netfilter/regexp/regexp.h

patching filenet/netfilter/regexp/regmagic.h

patching filenet/netfilter/regexp/regsub.c

patching filenet/netfilter/nf_conntrack_core.c

patching filenet/netfilter/nf_conntrack_standalone.c

patching fileinclude/net/netfilter/nf_conntrack.h

patching fileinclude/linux/netfilter/xt_layer7.h


2.2 配置文件

配置文件主要是配置生成.config文件,如下:

[root@RH55linux]# cp /boot/config-2.6.18-194.el5 .config

[root@RH55linux]# make menuconfig 必须要安装包ncurses (ncurses-devel)

  HOSTCC scripts/basic/fixdep

  HOSTCC scripts/basic/docproc

  HOSTCC scripts/basic/hash

  HOSTCC scripts/kconfig/conf.o

  HOSTCC scripts/kconfig/kxgettext.o

 *** Unable to find the ncurses libraries orthe

 *** required header files.

 *** 'make menuconfig' requires the ncurseslibraries.

 ***

 *** Install ncurses (ncurses-devel) and try again.

 ***

make[1]: ***[scripts/kconfig/dochecklxdialog] Error 1

make: ***[menuconfig] Error 2

[root@RH55linux]# yum -y install ncurses-devel (安装包ncurses-devel

进入menuconfig的时候,需要选择如下:

 General setup ---> Local version - append to kernel release   ---> 添加自定义版本号


Networkingsupport  --->Networking options  --->[*] Network packet filtering framework(Netfilter)  ---> Core NetfilterConfiguration  --->

<M>Netfilter connection tracking support  

<M>   "string" match support

<M>   "layer7" match support 

<M>   "time" match support  

<M>   "iprange" address range matchsupport

<M>   "connlimit" match support"

<M>   "conntrack" connection trackingmatch support

<M>   "mac" address match support

<M>   "multiport" Multiple port matchsupport                                      

Networkingsupport  --->Networking options  --- [*] Network packet filtering framework(Netfilter)  --->IP: Netfilter Configuration  --->

<M> IPv4connection tracking support (required for NAT)

<M>   Full NAT

       <M>     MASQUERADE target support

       <M>     NETMAP target support

       <M>     REDIRECT target support

未安装IPv4连接追踪会报错:can't load conntrack support forproto=2

未安装Full NAT会出现无法初始化NAT表:

[root@RH55iptables-1.4.7]# iptables -t nat -L -n

iptables v1.4.7: can't initialize iptables table `nat': Table does not exist(do you need to insmod?)

Perhaps iptablesor your kernel needs to be upgraded.

 

/lib/modules/2.6.28.10-kel/kernel/net/ipv4/netfilter(模块路径)

[root@RH55netfilter]# ls|grep filter查看filter模块

arptable_filter.ko

iptable_filter.ko

[root@RH55netfilter]# lsmod|grep filter内存加载的filter模块

iptable_filter         36096 0

ip_tables              49168  1 iptable_filter

       在进行重新选择模块的时候,可以直接进行make modules,然后make modules_install 最后make install,然后再重新编译iptables即可。

[root@RH55 netfilter]# pwd(模块路径)

/lib/modules/2.6.28.10-kel/kernel/net/ipv4/netfilter

[root@RH55 netfilter]# ls|grep nat查看nat模块

iptable_nat.ko

nf_nat_ftp.ko

nf_nat.ko

nf_nat_proto_dccp.ko

nf_nat_proto_sctp.ko

[root@RH55netfilter]# lsmod|grep nat内存加载的nat模块

iptable_nat            38660  0

nf_nat                 52500  1 iptable_nat

nf_conntrack_ipv4      47256 3 iptable_nat,nf_nat

nf_conntrack           97768  3 iptable_nat,nf_nat,nf_conntrack_ipv4

ip_tables              49168  2 iptable_nat,iptable_filter

x_tables               54280  2 iptable_nat,ip_tables

 

2.3 编译

编译花费的时间略长,大约二十分钟或更多,如下:

[root@RH55linux]# make 编译内核

2.4 安装内核模块

安装内核模块,如下所示:

[root@RH55linux]# make modules_install安装内核模块

 

2.5 安装内核

安装内核,如下所示:

[root@RH55linux]# make install 安装内核

2.6 编译grub.conf

编辑grub配置文件:

[root@RH55 ~]#cat /boot/grub/grub.conf 修改grub的默认启动为0

# grub.confgenerated by anaconda

#

# Note that youdo not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths arerelative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version roroot=/dev/VolGroup00/LogVol00

#          initrd /initrd-version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red HatEnterprise Linux Server (2.6.28.10-kel)

       root (hd0,0)

       kernel /vmlinuz-2.6.28.10-kel roroot=/dev/VolGroup00/LogVol00 rhgb quiet

       initrd /initrd-2.6.28.10-kel.img

title Red HatEnterprise Linux Server (2.6.18-194.el5)

       root (hd0,0)

       kernel /vmlinuz-2.6.18-194.el5 roroot=/dev/VolGroup00/LogVol00 rhgb quiet

       initrd /initrd-2.6.18-194.el5.img

[root@RH55 ~]#reboot 重启

 

3、 编译iptables

进行备份原来的iptables脚本和配置文件,如下:

[root@RH55 ~]#cp /etc/init.d/iptables . 备份iptables脚本

[root@RH55 ~]#cp /etc/sysconfig/iptables-config . 备份iptables配置文件

[root@RH55 ~]#rpm -e --nodeps iptables iptables-ipv6 iptstate 卸载原来的iptables

[root@RH55install]# ls -l 上传iptables和支持的l7协议

total 600

-rw-r--r-- 1root root 462420 Jan  9 03:17iptables-1.4.7.tar.bz2

-rw-r--r-- 1 rootroot 142050 Jan  9 03:17l7-protocols-2009-05-28.tar.gz

[root@RH55install]# tar -xf l7-protocols-2009-05-28.tar.gz -C /usr/src/ 解压

[root@RH55install]# tar -jxf iptables-1.4.7.tar.bz2 -C /usr/src/解压

[root@RH55install]# cd /usr/src/iptables-1.4.7/

[root@RH55iptables-1.4.7]#
cp/usr/src/netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/*extensions/
拷贝扩展

[root@RH55iptables-1.4.7]# ./configure --prefix=/usr --with-ksource=/usr/src/linux

[root@RH55iptables-1.4.7]# ./configure --with-ksource=/usr/src/linux 编译iptables

[root@RH55iptables-1.4.7]# make && make install 安装iptables

[root@RH55l7-protocols-2009-05-28]# make install 安装L7协议

[root@RH55 ~]#ls -l /etc/init.d/iptables (配置文件路径,修改其中运行文件的路径)

-rwxr-xr-x 1root root 7458 Jan  9 04:44/etc/init.d/iptables

if [ ! -x /usr/sbin/$IPTABLES ]; then

    echo -n /usr/sbin/$"$IPTABLES does not exist.";warning; echo

    exit 0

fi

4 测试

       在进行配置完成之后,使用如下进行设置是否生效:

[root@RH55 ~]# iptables -A FORWARD -m layer7--l7proto qq -j DROP过滤七层协议,让qq无法登陆)

[root@RH55 ~]# iptables -t filter -L -n -v 查看生成的规则

Chain INPUT (policy ACCEPT 212 packets, 15437 bytes)

 pkts bytestarget     prot opt in     out    source              destination        

 

Chain FORWARD (policyACCEPT 0 packets, 0 bytes)

 pkts bytestarget     prot opt in     out    source               destination        

    0     0DROP       all  -- *      *       0.0.0.0/0            0.0.0.0/0           LAYER7 l7proto qq

 

Chain OUTPUT (policy ACCEPT 166 packets, 23720 bytes)

 pkts bytestarget     prot opt in     out    source               destination 

       在进行测试的时候,可以将客户端换成windows,然后安装QQ,看看是否生效。

       查看内核版本是否生效,如下:

[root@RH55 ~]# uname -r查看内核版本

2.6.28.10-kel

 


上一篇:Shell脚本查看linux系统性能瓶颈

下一篇:一个投资人对于VR 2016发展中8个问题的解答 | VR2048