Socket Kernel Module
0 序言
本文主要介绍Linux下,对网络部分的内核如何安装卸载Module,从而在内核级别获取、拦截、修改网络传输数据。本文分为4部分,第一部分为"环境搭建";第二部分为"实现自己Module";第三部分"利用proc实现内核和应用层交互",第四部分"利用系统提供Module: Netfilter"。采用的Linux版本为2.6,"Socket Kernel Source"为其基础篇。
1 环境搭建
本环境基于Ubuntu7.1, Linux内核为2.6版本,VMware虚拟机。后文中很多操作需要管理员权限,需要sodu,后文不单独提示了。后文中以#开头的,为console输入内容。
1.1 VMWare下载安装Ubuntu7.1(Desktop):
建议分配空间大于6G,并且先分配好,因为编译内核将占用大量空间,而VMWare进行扩展分配似乎有问题,硬盘明明有地方,就是不能扩展。我第一次就栽在这个地方。
安装过程略,很简单的,一路Next即可,建议选择English,因为对内核来说,中文没有意义:-)
安装后,升不升级无所谓,不过如果是Linux内核升级要小心,最好保留2.6不动(因为其他版本也许不适用本文了,呵呵)。
1.2 安装编译环境
#apt-get install build-essential kernel-package fakeroot libncurses5-dev module-init-tools
其中 build-sessential是提供基本的gcc等编译环境, kernel-package用于简化自定义内核的构建与安装,fakeroot模拟root环境来使我们可以创建一个kernel-image软件包, libncurses5-dev是make menuconfig中用到支持鼠标操作的,module-init-tools是用来帮助创建核心的工具
安装完毕后,#make,测试是否安装正确。
1.3 下载源文件
#uname -all //查看内核版本,比如是Linux-2.6.24.3, 则显示
然后下载对应版本的内核源文件(注意版本号),解压,添加链接"linux"指向对应的目录,源文件比较大,网速不快的,可以干点别
#cd /usr/src
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2
#tar xjf linux-2.6.4.3tar.bz2
#ln -s linux-2.6.4.3 linux
#cd /usr/src/linux
如果嫌麻烦,可以
#apt-get install linux-source-2.6.24.3
#ln -s linux-2.6.4.3 linux
#cd /usr/src/linux
但是这种方法,无法断点续传(也许有,我不知道),一旦失败,就要重新下载,这是我第二个栽的地方,白白下载了3个小时:-( 而第一种方法中的wget可以断点续传的
如果还嫌麻烦,可以用firefox上www.kernel.org,选择好版本后,用firefox下载,也支持断点续传的,适合习惯鼠标的Windows用户。
1.4 配置编译环境
#cp /boot/config-2.6.24.3 ./.config
将当前的配置文件.config,拷贝到当前目录下(/usr/src/linux),再次提示注意版本号。
#make menuconfig
往下移动光标,选择"Load an Alternate Configuration File",后加载.config,
确认"Loadable module support"中,"Module unloading"被选中,现在的版本一般已经选上了
保存确认后退出。
把当前配置文件加载到源文件目录中了,这样可以基本满足当前机器配置,如果愿意也可以自己详细配置。
1.5 编译
准备干些别的,下面步骤很耗时间,尤其机器比较慢,更尤其是在虚拟机时
#make
(建议此时做一个VMWare镜像,因为后面步骤将会影响当前系统,万一有问题可以镜像恢复)
#make bzImage
#make modules
#make modules_install
#mkinitramfs -o /boot/initrd.img-2.6.24.3
#make install
#install //这步没用过,
1.6 修改环境
#gedit /boot/grub/menu.lst
加入如下内容,可以复制前面的配置,(hd0,6), root=UUID=****根据复制内容不用改,其它的修改版本号即可
title Ubuntu, kernel 2.6.24.3
root (hd0,6)
kernel /vmlinuz-2.6.24.3 root=UUID=2f48ce41-ead0-463e-af93-b0503de13273 ro quiet splash
initrd /initrd.img-2.6.24.3
savedefault
这样当启动时就可以通过 'Esc'进入配置菜单,选择内核启动了
注:我在这第三次栽了,选择新的内核后,当启动到Ubuntu开始有进度条时,就死了,毫无反应,现在还不知道问题出在哪里。因此我采用的是和内核相同的版本,这样即使无法更新内核,现有内核也可以使用,否则跨版本编译可能会出现些奇怪的问题