一:实验环境
1):虚拟机
2):linux系统
3):linux系统的硬盘的空余空间要大于7G
4):虚拟机的内存要大于2.5G以上
二:实验目标
1):源码编译Linux内核
2):使用Linux内核模块
3):实战-编译一个NTFS内核模块,实现linux挂载NTFS文件系统并实现读写功能
三:实验脚本
第一块 --源码编译Linux内核
linux系统与windows系统是两种截然不同的系统,windows系统中的软件都是需要付费的,而linux系统中的软件大多数都是开源免费的。因此直接将U盘或者光盘塞进linux系统中是不能够使用的。那么NTFS是属于windows系统下的一种文件系统,linux系统能够使用吗?linux系统实质上是不能够支持NTFS系统的,但是在linux系统中有很多时候是需要用到NTFS文件系统的,因此linux系统在内核中以模块的形式对微软的NTFS文件系统进行编辑,在我们需要使用的时候,只需要将NTFS文件系统的开 启处开启一下就OK了。相对于个人与企业比较来说,个人使用的情况就比较多了,我们直接将NTFS开启了,微软不会告我们侵权的,而大型的企业就不行,需要使用NTFS文件系统,就必须要向微软付费,不然后果就会很严重了,直接告你侵权。 执行步骤: 2、确认你的系统中已经具备了编译软件的基本条件,也就是要安装make ,gcc, gcc-c++ ,ncurses-devel和库工具等等 。 开发工具和库 3、解压内核源码包 4、配置内核编译参数 5、编译内核 6、安装编译好的内核与模块 7、查看或修改GRUB菜单(为了确认你是不是真的把内核安装好了) 8、重新启动系统,测试新内核的工作情况 下面具体来看一下,在RHEL6上如何重新编译内核,并升级到linux-3.19.8.tar.xz 的详细步骤:
查看当前系统的内核版本
root@xuegod163 ~]#uname -r
2.6.32-431.el6.x86_64
添加一块硬盘20G,并分区:
对新添加的硬盘
[iyunv@localhost ~]#fdisk /dev/sdb #分区sdb1,并将所有的空间都给sdb1
[iyunv@localhost ~]#mkdir /sdb1 #创建一个目录,此目录作为挂载点
[iyunv@localhost ~]#mkfs.ext4 /dev/sdb1 #对分区进行格式化
[iyunv@localhost ~]#mount /dev/sdb1 /sdb1 #对分区进行挂载
1:到www.kernel.org上下载相应的内核源码包
[iyunv@localhost ~]# ls #查看,看到linux的内核3.19.8的压缩包已经下载到根目录下了
anaconda-ks.cfg linux-3.19.8.tar.xz 模板 文档 桌面 install.log vmware-tools-distrib 视频 下载 install.log.syslog 公共的 图片 音乐 2、确认你的系统中已经具备了编译软件的基本条件,也就是要安装make、gcc、gcc-c++ 、ncurses-devel和库工具等等
3、解压内核源码包
解压内核: [iyunv@localhost ~]#cp linux-3.19.8.tar.xz /sdb1 #将下载的内核压缩包拷贝到/sdb1下
[iyunv@localhostsdb1]# ls
linux-3.19.8.tar.xz lost+found
[iyunv@localhostsdb1]# xz -d linux-3.19.8.tar.xz #将内核压缩包进行解压
[iyunv@localhostsdb1]# ls
linux-3.19.8.tar linux-3.19.8.tar.xz lost+found
[iyunv@localhostsdb1]# tar xf linux-3.19.8.tar #再次进行解压
[iyunv@localhostsdb1]# ls
linux-3.19.8 linux-3.19.8.tar lost+found
[iyunv@localhostsdb1]# du -sh linux-3.19.8 #查看总的源代码为642M
642M linux-3.19.8
[iyunv@localhostsdb1]# free –m #看到大量的缓存483M
total used free shared buffers cached
Mem: 3009 2104 904 0 68 1552
-/+buffers/cache: 483 2526
Swap: 3999 0 3999
[iyunv@localhostsdb1]# reboot #清除一下缓存
[iyunv@localhost ~]#mount /dev/sdb1 /sdb1 #由于重新启动了,我们并没有设置开机自动挂载,因此,直接查看/sdb1是看不到任何东西的,所以需要重新挂载一下。
[iyunv@localhost ~]#df -h
/dev/sdb1 20G 1.4G 18G 8% /sdb1
[iyunv@localhost ~]#cd /sdb1
[iyunv@localhostsdb1]# ls
linux-3.19.8 linux-3.19.8.tar lost+found
#这个时候我们可以看到,内核压缩包的解压包已经出现了
[root@localhostlinux-3.19.8]# make menuconfig #通过一个图形界面,来配置内核的参数
#打开配置,找到NTFS的位置,使Linux系统支持windows系统下的NTFS文件系统
NTFS的位置如下图
选择“Filesystem” 然后按回车。
选择DOS,回车
选择NTFSfile system support 回车,<>中会出现“M” 下面会自动出现两个选项值。 光标下移到:NTFS write support (NTFS支持).选择,空格, 这样就编辑好了。
选择exit回车退出。
##现在我们已经编译成功了,成功之后会在sdb1下的内核解压包中产生配置文件,
[root@localhostlinux-3.19.8]# vim /sdb1/linux-3.19.8/.config
#可以看到NTFS的配置文件的读写权限已经开启了,Yes是启用了,而linux下内核中默认是不启用NTFS的
NTFS的DEBUG并没有设置
注:
以上的只是修改了下载下来的linux-3.19.8.tar.xz形式的内核包。在图形界面中,我们可以看出有许多需要修改的地方,但是我们并不知道应该修改那一项,这个时候把linux系统中自带的NTFS文件系统的配置文件拷贝到(vim /sdb1/linux-3.19.8/.config)刚才修改之后内核的配置文件中。如果(vim /sdb1/linux-3.19.8/.config)刚才修改之后内核的配置文件目录中有“.config”的文件就进行修改,没有的话就会重新生成。这样的话,填加的NTFS这样的一个支持功能之后,其他需要使用的内容还是会用系统自带的内核编辑好的内容,不需要对他进行修改。
解释:
A=为下载的内核包的配置文件
B=为系统自带的NTFS配置文件
指:将A与B两个配置文件放在同一个目录下,如果A里面有B文件里面以.Config开头的文件就进行修改,如果A里面没有,B里面有,那么A里面就自动生成B有而A没有的文件。
最后在使用NTFS的过程中,就会直接使用B里面的其他内容。
[iyunv@localhost linux-3.19.8]# vim/boot/config-2.6.32-220.el6.x86_64 #查看一下系统中的NTFS的配置文件
#这是系统自带的NTFS配置文件,自带的配置文件中可以看出NTFS并没有开启,这就说明了linux下的系统是能够使用NTFS文件系统的,但是需要开启之后才能够使用
[root@localhostlinux-3.19.8]# cp /boot/config-2.6.32-220.el6.x86_64 /sdb1/linux-3.19.8/.config #将系统自带的NTFS文件系统的配置文件拷贝到刚才生成的配置文件目录中。
拓展:
#在这里,我们不知道选择那一项的时候,可以使用另一种方法
[iyunv@localhost linux-3.19.8]# make menuconfig
#选择<select> =选择,搜索。直接按下空格 输入“/”
#输入你想要搜索的内容
#这样你只需要按照它给出的步骤输入就OK了
下面我们在复制好的.config中只增加一个功能,就是增加对NTFS读写功能。复制完.config后,执行命令:
[iyunv@xuegod163 linux-3.19.8]#pwd
/sdb1/linux-3.19.8
[iyunv@xuegod163 linux-3.19.8]#make menuconfig
向下移动光标找到如下内容:
保存后,按下esc或 选中Exit 进程退出
编译内核
[root@localhostlinux-3.19.8]# make bzImage#生成内核 ,此内核是经过压缩的内核
这里需要一段时间,取决于你的系统性能。
BUILD arch/x86/boot/bzImage
此处省略无数字节……
Kernel: arch/x86/boot/bzImage is ready (#1)
6、下面 生成新内核的驱动模块:
[root@localhostlinux-3.19.8]# make modules
这里也是需要一段时间
此处省略无数字节……
IHEX firmware/edgeport/down3.bin
IHEX2FWfirmware/whiteheat_loader.fw
IHEX2FWfirmware/whiteheat.fw
IHEX2FWfirmware/keyspan_pda/keyspan_pda.fw
IHEX2FWfirmware/keyspan_pda/xircom_pgs.fw
7、安装编译好的内核与模块
(1)安装模块
[iyunv@localhost linux-3.19.8]# make modules_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)安装新编译的系统内核
[iyunv@localhost linux-3.19.8]#make install
sh./arch/x86/boot/install.sh 3.16.2 arch/x86/boot/bzImage \
System.map "/boot"
ERROR:modinfo: could not find module vsock
ERROR:modinfo: could not find module snd_page_alloc
ERROR:modinfo: could not find module vmware_balloon
ERROR:modinfo: could not find module vmci
8、查看或修改GRUB菜单(为了确认你是不是真的把内核安装好了)
[iyunv@localhost linux-3.0.4]# vim /boot/grub/grub.conf
这里的延迟时间可以改为0,建议不要改。
这里的内核名称可以修改,防止黑客的暴力破解,修改问windows7,黑客看到是win7就会使用windows的破解软解来破解,这样就会破解不开来,也可以装一些监控软件,谁来破解的,都会知道。
9、重新启动系统,测试新内核的工作情况
注意,在启动的时候,需要自己进来一下选择,否则默认还是以前的内核启动哦。除非你在上一步把默认启动项给改了。
选择处就是上一步的5秒延迟处
使用新内核启动系统后,查看内核版本:
[iyunv@localhost ~]# uname -r
3.19.8
[iyunv@localhost fs]# vim /boot/grub/grub.conf
#现在可以看到有两个内核,default=1 意思是指启动的时候使用第二个内核,即2.6.32….的,如果将1改为0,那么启动的就直接是3.19.8的内核了。
最后总结一下编译内核的步骤 :
xz -dlinux-3.16.2.tar.xz
tar xf linux-3.16.2.tar #解压文件比较多就不加-v了
make menuconfig
make bzImage
make modules
echo $?
为了确保没有错误,可以用上面的命令来查看是否有错误,如果是0的话,就表示没有错误或警告了
make modules_install
make install
重启,测试
第二块
内核,操作系统,软件
内核模块操作
内核(模块)管理命令:
模块的作用:把具体功能封装好的程序。 比如,冲电宝。可以给所有手机冲电。
存放内核模块的目路径:
[iyunv@localhost fs]# ls/lib/modules/
2.6.32-220.el6.x86_64 3.19.8
#可以看到有两个内核
[iyunv@xuegod163 ~]# cd/lib/modules/3.19.8/kernel/fs/
[iyunv@xuegod163 fs]# cd fat/
[iyunv@xuegod163 fat]# ls
fat.ko msdos.ko vfat.ko
插入模块:
insmod
作用:载入模块
[iyunv@localhost fat]# insmod./fat.ko #相对路径载入内核模块
查看当前系统中加载的模块
#lsmod 列出当前模块
[iyunv@xuegod163 fat]# lsmod |grep fat
fat 59587 0
删除模块
#rmmod fat #删除模块 。跟上模块的名字
[iyunv@localhost fat]# rmmodfat
[iyunv@localhost fat]# lsmod |grep fat
[iyunv@localhost fat]#
#fat内核模块已被删除,可以看出过滤不出模块了
解决依赖关系安装模块
[iyunv@localhost fat]# ls #查看fat下的模块
fat.ko msdos.ko vfat.ko
[iyunv@localhost fat]# insmod./vfat.ko #插入模块
insmod: error inserting './vfat.ko': -1 Unknown symbol in module
#产生了错误,说这个模块有依赖关系,想要插入这个模块就需要将fat模块先插入才行
在不知道这个模块具有依赖关系的时候,我们使用这个命令直接插入模块,会直接加载具有依赖性的fat模块
[iyunv@localhost fat]# modprobevfat
[iyunv@localhost fat]# lsmod |grep vfat
vfat 10575 0
fat 59587 1 vfat
#可以看到两块模块已经插入成功了,***背景中的“1”表示有一个模块对于fat模块具有依赖性的关系
删除模块--(直接连同具有依赖性的模块也一起删除)
[iyunv@localhost fat]# modprobe-r vfat
[iyunv@localhost fat]# lsmod |grep vfat
[iyunv@localhost fat]#
#现在可以看出刚才插入的模块已经被删除了,连同它具有依赖性关系的fat模块也删除了
新添加一个模块后,需要让系统知道:
#depmod
[iyunv@localhost fat]#modprobe vfat
[iyunv@localhost fat]#depmod
注:depmod更新的配置文件,就是这个。
[iyunv@localhost fat]# cd/lib/modules/3.19.8/
[iyunv@localhost 3.19.8]# ls #插入的模块,在这里形成了一个目录
build modules.ccwmap modules.isapnpmap modules.symbols
kernel modules.dep modules.ofmap modules.symbols.bin
modules.alias modules.dep.bin modules.order modules.usbmap
modules.alias.bin modules.ieee1394map modules.pcimap source
modules.builtin modules.inputmap modules.seriomap [iyunv@xuegod163 3.19.8]#vim modules.dep
[root@localhost3.19.8]# vim modules.dep #进入目录,查看刚才插入的模块的配置文件
查看模块间依赖关系:如fat。从下图可以看出,vfat和msdos模块都依赖fat.ko模块
文件格式
模块的路径 : 依赖的模块
#即fat.ko模块依赖于fat模块
查看模块信息
#modinfo 查看模块信息
[iyunv@localhost fat]#ls #查看出有三个模块
fat.ko msdos.ko vfat.ko
[iyunv@localhost fat]#modinfo vfat #可以看到模块信息
filename: /lib/modules/3.19.8/kernel/fs/fat/vfat.ko #文件的名称及目录
author: GordonChaffee #验证性
description: VFAT filesystem support
license: GPL
alias: fs-vfat
srcversion: 3A2520B90FAB5DF5806E200
depends: fat #它依赖于fat
intree: Y
vermagic: 3.19.8 SMP mod_unload modversions
开机自动加载模块
[iyunv@localhost~]#vim/etc/rc.local
.#直接在最后面输入modprobe fat 命令 退出就OK了 ,和光驱实现开机自动挂载是一样的道理!
第三块
注:
在第一块中的编译内核中,我们安装的包需要太长的时间了,一般情况下我们是不会用这种方法的,因为不仅仅是时间很长的问题,而且还会带来一些不安全的问题,所以会用另一种方法,fuse,这种方法安装是时间就要简短很多了,而且安全性也要相较于前面的方法要高的多。
实战-编译一个NTFS内核模块,实现linux挂载NTFS文件系统
安装 fuse:
[iyunv@localhost~]# tar zxvf fuse-2.8.3.tar.gz
[iyunv@localhost~]# ls
fuse-2.8.3.tar.gz ntfs-3g-2011.1.15.tgz fuse-2.8.3
[iyunv@localhost~]# cd fuse-2.8.3
[root@localhostfuse-2.8.3]# ls
compile configure.in example INSTALL Makefile.am README.NFS
[root@localhostfuse-2.8.3]# vim INSTALL
#这里面的内容就是安装的过程
[root@localhostfuse-2.8.3]# ./configure && make && make install #进行对包的安装
[root@localhostfuse-2.8.3]# echo $? #查看是否安装成功,成功的话,返回值为“0”
0
安装:ntfs-3g
[iyunv@localhost~]# tar zxvf ntfs-3g-2011.1.15.tgzcd ntfs-3g-2011.1.15
[iyunv@localhost~]# cd ntfs-3g-2011.1.15
[root@localhostntfs-3g-2011.1.15]# ./configure && make && make install
[root@localhostntfs-3g-2011.1.15]# echo $?
0
将一个U盘插入电脑
导入U盘
[iyunv@localhost 惊羽]# umout /dev/sdc1
[iyunv@ localhost ~]# mount -tntfs-3g /dev/sdc1 /opt/
开机自动挂载:
[iyunv@localhost~]# vim /etc/fstab
/dev/sdc1 /opt ntfs-3g defaults 0 0
四:实验结束
|