Socket Kernel Module 01

来源:互联网 发布:法兰绒哪个牌子好 知乎 编辑:程序博客网 时间:2024/05/18 20:04

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开始有进度条时,就死了,毫无反应,现在还不知道问题出在哪里。因此我采用的是和内核相同的版本,这样即使无法更新内核,现有内核也可以使用,否则跨版本编译可能会出现些奇怪的问题

原创粉丝点击