You are on page 1of 79

l。;。:..

帅|I{lI l lI |I I|l lIl }Il|{I l | I|Il l|咖


Y1 8027 1 2

独创性声明

本人声明所呈交的学位论文是本人在导师指导下进行的研究工

作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地

方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含

为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。

与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明

确的说明并表示谢意。

躲一吼锄,哞蜥7日
论文使用授权

本学位论文作者完全了解电子科技大学有关保留、使用学位论文

的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁

盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文

的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或

扫描等复制手段保存、汇编学位论文。

(保密的学位论文在解密后应遵守此规定)

日期勃/o"月,7日
摘要

摘要

随着计算机技术的发展和计算机的广泛应用,对计算机的安全的要求也越来

越高。一个主要的问题是保证磁盘中的数据的安全,并能实时地发现其中的异常
运行状况,从而及时地进行系统的改进和维护,这需要实时的监控计算机在进行

文件操作的时候产生的各种信息和数据。当前lirmx平台下并没有很好的工具来
监控文件操作,因此设计一个基于linux平台的文件系统监控系统变得十分重要。

文件系统的监控是保护磁盘数据安全的一种强大的方式,通过在文件系统之

上增加一层文件系统过滤操作,可以达到防止系统的关键文件被进程非法访问的
目的,并为系统安全提供了日志信息以供分析,有着重要的理论和实践意义。
本文阐述了该课题的选题意义以及国内外发展现状,研究了linuX内存文件

系统的实现,提出了以Roo骶t监控文件系统的方式,设计并实现了基于l证ux内
核驱动的文件系统监控系统。该监控系统在1iIlux内核中位于VFs和下层具体的
文件系统之间,它能监控所有文件操作,并根据用户提供的监视信息来过滤需要
监控的进程和关键文件,并在过滤操作完成之后,转发给下层的文件系统操作去

完成。系统分为用户模块,MFs(Mollitor Filesystem)模块和通信模块。用户模块
在用户空间提供监控的进程列表和关键文件列表并提供配置功能,并展示监控之

后的日志信息;MFs模块是核心模块,是一个linux内核可加载内核模块,实现
了一个带有监控功能的文件系统,动态加载在内核的vFS和下层文件系统之间,

根据监控信息来过滤所有文件操作;通信模块则提供MFS模块与用户监视模块之
间的数据通信,将用户模块指定的进程和关键文件信息等配置传递给ⅪS模块以
及将Ⅷs模块得到的日志信息反馈给用户监视模块。本文详细描述各个模块的设
计和具体实现。

关键字:监控,文件系统,内核可加载模块,mS
ABSlRA(了r

ABSTRACT

Wi也廿le devel叩ment of computer tec:Illl010影锄d eXt吼siVe application,me

c0IIlputer se呻requir锄跚tS arc:iIlcreaSiIl酉y hi曲er aIld 11i曲盯.A m勾0r problem is

to ensllre也at tlle sec面t),of t11e data in t11e disk,锄d c跹real-time to 6nd nle dbno肋a1
operating conditioIlS,趾d n1_Ils timely 趾d syst锄atic im】砷V锄ents 缸d
mallit%蛆ce,WIlich requircs real-tiIne缸alysis nle b11ds of inf.0衄ation and d刁忱dIlring

61e 0peratioIls generated.But廿le c11玎髓t lin:11)【platf0锄,aIld tllere is no 900d t00l t0

moIlitor file 0p耐ions,and meref.ore tO design a me system b雒ed limⅨplat内衄


monito血lg sySt锄become importaIlt.
The矗e system mollitoring is to protect me disk data se训饥a prowerfm way by
tlle 6le syStem 0n top of additional layer of丘le systeIIl filter 0perations,the syStem c锄

be a幽eVed to preVent u11aunlo出ed acc器s nle key丘1鹊w嬲nle puIpose of也e

process,and pro、,ides me log iIlformation for姐alysis for也e system secudt)r,、)l,_hich h硒

importand meoretical aIld prac石cal si鲥fica=nce..


111is work describeS nle si911i丘cance of也e subject topics of廿1e d吖elopIlllent of也e

status quo at h咖e and a:board,aIld p呲forward a new memods of moIlitoriIlg me jfile

syStem wllich is designed a11d implemented based on 1inux kemel system越V钉


moIlito曲Qg system.TIlis mollit矾ng system in me 1inux kemcl is equiV a:lent to a丘1e

sySt锄61ter,Iocated at vFS and lower speci6c file syStenls.It m砸torS all矗1c

0p删011S,according to nle user to pr0、,ide moIlito血g info册atioIlS to 6】ter、)Ir!11ich need

me process infomatiolls wllich t0 be moIlitored 孤d key files list.once nle filt耐ng


ope础ons is co如plete,ope枷onal processes、Ⅳi11 be forwarded to me 10wer丘le s)哦em

0pe姐_tion to complete.T11is m011ito血g syStem desi踟is di啊ded i11t0 a lls凹monitoring

module,MFS(Momtor FileSysteIll)module a11d comnnmjcation module,User module

i11 user Space to pr0Vide mollitoring of廿le process 1ist觚d a 1ist of key丘1豁硒d provide

con矗guration劬嘶onali饥锄d diSplay me 109 info咖ation硪er filter opera矗ons.瑚PS


module is t11e c0∞module删ch is a linllX kemel loadable module,dyn锄ic 10ading

bet、)l,een t11eⅥ7S锄d u11d甜yillg丘1e s),st锄.,acC0fdillg me m011ito血g infonn撕0n to


ABSTRACT

filter a11 file operations;communication module proVides me MFS module aIld me user

module data commullication,也e module pecified by me user process aIld tlle key files

infonnation paSsed t0 tlle MFS module缸d也e module、析11 get log inf0册ation w11ich

MFS module feedback to t11e user moIlito曲g module.T协s detailed des嘶ption of each

modllle证the design and inlpl锄entation.

Keywords:MoIlitor,File Syst锄,K锄el Loaderable,Ⅻ7S

IlI
目录

目 录

第一章引言……………………………………………….1
1.1研究背景………………………………………………..1
1.2国内外发展和研究现状…………………………………….2
1.3课题的研究内容和实现目标………………………………….3

1.4论文组织结构…………………………………………….4

第二章文件系统的相关技术…………………………………..5
2.1 LINUX体系结构…………………………………………..5
2.1.1 LINUx内核的主要子系统…………………………………7
2.2虚拟文件系统(VFS)………………………………………7
2.3文件系统的通用文件模型……………………………………9

VFS的基本对象类型…………………………………..10
2.3.1

2.3.2文件系统相关的其他数据结构…………………………..14
2.3.3文件系统的操作……………………………………..16
2.4文件系统监控技术的介绍………………………………….17
INoTIFl『机制…………………………………………18
2.4.1

2.4.2拦截系统调用技术……………………………………19
2.4.3两种监控技术的分析…………………………………..22
2.5 STACKABLE FILESYSTEM……………………………………22
2.5.1 STAcKABLE FILESYsT跚介绍………………………..:…….22
2.5.2 STAcKABLE FILESYsTEM自秉.理………………………………..24
2.6 LKⅥ实现STACKABLE FILESYSTEM…………………………….28
2.7 LINUX下用户空间与内核空间数据交换的方式………………….28
2.8本章小结………………………………………………31


目录

第三章系统设计…………………………………………..32
3.1系统需求………………………………………………32

3.2系统设计……………………………………………….32
3.2.1系统结构…………………………………………..33
3.2.2系统的数据流程……………………………………..35
3.3用户监视模块的设计………………………………………37

3.3.1关键文件配置流程设计…………………………………38
3.3.2进程信息列表例程设计…………………………………38
3.3.3日志处理例程的设计…………………………………..38
3.4 MFS模块的设计………………………………………….38

3.4.1关键文件控制例程的设计……………………………….40
3.4.2进程信息管理例程的设计……………………………….41
3.4.3文件操作过滤例程的设计……………………………….41
3.5通信模块的设计…………………………………………42
3.5.1 PR0c通信子例程的设计…………………………………42
MMAP通信子例程的设计…………………………………43
3.5.2

3.6模块之间的接口设计……………………………………..43
3.6.1外部接口……………………………………………43
3.6.2内部接口……………………………………………43
3.7本章小结……………………………………………….45

第四章系统实现…………………………………………..46
4.1用户监视模块的实现……………………………………..46
4.1.1进程信息展示功能…………………………………….46
4.1.2日志展示功能………………………………………..47
4.1.3配置功能……………………………………………47
4.2 MFS模块的实现………………………………………….47

4.2.1配置关键文件功能实现流程……………………………..47
4.2.2配置进程信息功能实现流程…………………………….48


目录

4.2.3过滤文件操作功能实现流程……………………………..48
4.3 MFS的数据结构实现……………………………………..48

4.3.1 MFS的INoDE结构……………………………………..49
4.3.2 MFS的DENTRY结构…………………………………….49
MFS的FILE结构………………………………………50
4.3.3

4.3.4髓S数据对象存在的问题……………………………….51
4.4 MFS的方法实现………………………………………….52
4.4.1注册和注销MFS文件系统………………………………52
4.4.2挂载和卸载MFS文件系统………………………………53
4.4.3过滤文件操作……………………………………….54
4.5通信模块的实现…………………………………………58

4.5.1从用户空间传递数据…………………………………..58
4.5.2从内核空间传递数据………………………………….58
4.6本章小结………………………………………………59
第五章系统测试…………………………………………..60

5.1测试环境………………………………………………60
5.2将MFS文件系统挂载到内核中……………………………….60
5.3功能测试………………………………………………61

5.3.1监控操作的测试……………………………………..61
5.3.2控制操作的测试……………………………………..62
5.3.3功能测试总结……………………………………….63
5.4性能测试………………………………………………63
5.4.1读文件测试…………………………………………63
5.4.2写文件测试…….j………………………^……….64
5.4.3性能测试总结……………………………………….64
第六章总结与展望…………………………………………65
6.1总结………………………………………………….65
6.1.1缓存一致性…………………………………………65


目录

6.1.2锁机制…………………………………………….66
6.1.3内核支持…………………………………………..66
6.2展望…………………………………………………..66
致谢…………………………………………………..67
参考文献…………………………………………………68

VⅡ
第一章引言

第一章引言

本章介绍课题的研究背景,介绍国内外发展和研究的现状,以及本课题的研

究内容和实现的目标,最后介绍了本篇论文的组织结构。

1.1研究背景

随着计算机技术的不断进步,21世纪早已经迈入了信息时代,互联网快速的
发展正在以惊人的速度改变着世界,同时也带来了各种各样的安全问题。2010年

伊始,国际经济形势进入一个在动荡中恢复的阶段;国内外各种政治势力在激烈
的政治斗争中不断地把信息安全问题推向政治舞台的中心;包括云计算、3G应用

与移动网络、手机移动支付、I江D技术应用与安全、面临破解挑战的某些国外

商业密码技术、国家和公众对于网络的安全与信息净化的要求等等一系列信息化
应用新概念、新技术、新应用、新问题。这些问题给信息安全行业不断地提出新
的挑战。可以说,中国信息安全领域在进入本世纪新的第二个十年伊始,进入了

一个充满全新的挑战与机遇并存的时代。
信息的安全已经成为困扰信息社会的一大难题,保护数据的安全成为信息社

会的一大挑战。计算机系统的数据的危险来自于多方面,有操作系统的漏洞、网
络协议的缺陷以及应用程序存在的漏洞,更多非法的恶意攻击,僵尸网络、木马、

拒绝服务攻击的泛滥,给我们的信息安全敲响了警钟。在世界范围来看,黑色产
业链越来越成为焦点,据统计,我国的木马产业链已经达到了上百亿。黑客技术

的炫耀开始与经济利益越绑越紧;与此想对应,僵尸网络、木马等变得越来越活

跃,而一般性质的蠕虫,尤其是大规模蠕虫则相对比过去暗淡了许多;又有机会
没有遇到太多法律上的对抗,导致黑客对网页的攻击越来越泛化,例如前阵子百
度网站因域名被非法劫持而导致全球多处用户不能正常访问。

在互联网应用与普及方面我国已经进入了世界大国的行列,因此我国的信息
安全问题与国际上的问题基本接轨。我国每年被黑的网页在10万个数量级左右,

钓鱼网站数量占世界总量的比例偏高,位于我国的僵尸网络的肉鸡数量位于世界
的前列,拒绝服务攻击的受害数量非常庞大。

由于信息安全威胁日益复杂多变,同时用户对安全提出更高的要求,如能借
电子科技大学硕士毕业论文

助云计算技术,实现大范围的监控分析,进而实时响应,如告警通知、特征升级
等,最终提高对网络攻击、病毒/木马、钓鱼诈骗等网络威胁的响应速度。目前如

IPs加TM、防病毒软件/网管、终端安全等产品可使用该类服务,还需研究如何应
用到数量更多的老设备如防火墙上。

在信息安全问题日益严峻的背景下,数据作为信息安全存储的核心,应该得
到更多的关注。主流的文件系统都如NFS和Coda都提供了相应的安全保护机制,

它们对用户的进行身份认证和授权,并可以选择使用安全通道传输数据。但是大

部分文件系统的设计都基于这样的一个前提:服务器在安全上是可信任的。所以
数据在服务器上大多都是以明文的形式存放、传输,从而导致了很多安全事故,
很多企业的服务器都因为数据被窃取而遭受巨大的损失。

文件系统的监控技术是数据安全存储的重要组成部分,负责监控文件系统的
一切行为动作,过滤非法进程对关键文件的非法操作,从而保护数据的安全性,

然而主流的文件系统被没有提供这种管理机制,同时用户也无法根据自己需要的
的安全应用需求来选择监控方式。

1.2国内外发展和研究现状

计算机的监控技术起源很早,到现在已经有了长足的发展和广泛的应用。早

在DOS普及的时候就已经有相应的应用了。早期的磁盘写保护软件就是利用了监
控的技术。磁盘写保护软件是将自己的代码驻留在DOS系统无法访问扇区,这些

扇区是从0磁头O柱面1扇区开始,共64个,它修改了DOS的主引导扇区(MaLster
Boot Record),当DOS系统启动的时候,磁盘写保护的代码获取系统的控制权利,

然后修改了BIOS的读写磁盘的中断向量函数,即INTl3号中断向量函数,这样
驻留在内存中的钩子代码可以随时截获对磁盘的所有操作,进而监控对磁盘的操

作,从而可以实现对某一磁盘区域的监控与保护。后来在磁盘写保护的基础上又
诞生了磁盘恢复卡等产品,然而其核心仍是对磁盘读写操作的监控技术。

由于在用户空间是能访问内核中系统的操作,所以应用程序的手段是无法实
现监控功能,监控技术都使用了内核驱动技术,由运行在内核空间的内核代码截

获所有的对文件系统的操作。核心技术就是驱动模块挂钩于文件操作之上,对所
有的文件操作(读、写、打开、修删除等)都进行实时监控。DOS的TSR【46】(终止并
等待驻留Temlinate锄d Stay Resident),是一种通过驻留并截获磁盘操作的中断来
实现特定需要的程序。w协dows下可以通过从拦截内核模块NTOsl(I蝌L.EXE的


第一章引言

系统调用,截获对文件系统的所有操作,来达到监控文件系统的目的。“nux 2.6.13

内核引入了文件系统变化的通知机制inoti矽,它监控文件系统操作的相关事件,
并且及时向上层监视的应用程序发出相关的事件警告,比如读、写、删除文件等

操作,还可以跟踪活动的源头和目标等相关细节。
目前国内外的监控软件有很多,比较流行的有以下几种:
FileMon(File Mo砷-0r)是sysnenlal出品的一个出色的文件系统监控软件,可
以监控内存当中的应用程序对磁盘进行读写操作活动,能单独设定对某个磁盘进
行监控,可以自定义过滤机制。通过它可以看到程序使用的所有文件和d11,甚至

能够捕捉到系统和程序的配置问题。它可以记录与文件相关的所有操作(读、写、
操作等)信息都记录下来,并提供对信息进行查找、过滤、保存等功能,给用户提

供了很大的便利。

Re舯on是一个注册表数据库监控工具,它显示并记录所有与注册表数据库
操作相关的信息(如读取、修改、出错信息等),并全部记录下来供用户参考,并
允许用户对记录的信息进行查找、过滤、查找等处理,这为用户对系统的维护提

供了便利。
Process Mollitor是一个用于Windows的高级监视工具,可以显示实时文件

系统、注册表和进程/线程活动。它结合了两个传统sySintenlals实用工具
(Filemon和Re舯on) 的功能,并增加了大量增强功能,其中包括丰富且不具
破坏性的筛选功能、全面的事件属性(如会话D和用户名)、可靠的进程信息、

完整的线程堆栈(支持每个操作的集成符号)、同一文件并行日志记录等功能。异

常强大的功能使Process Mollitor成为系统故障排除和恶意软件捕获工具包的核
心实用工具。
1watch是一个LinuX平台下用来实时监控文件系统变化的工具,它将文件系

统的变化快速的发给管理员。1watCh是基于1inu】【2.6.13新增的ino石f3,机制的,它
的核心功能是允许应用程序对一个事件列表的一组文件的监控,并把这些改变通

知给用户。

1.3课题的研究内容和实现目标

目前1inux平台下通常采用的对文件系统监控的技术主要是挂钩系统调用,

通过在用户模式下挂钩readO、w订teO、openO等文件操作的系统调用来监控对文
件的访问,但是这种方式有一些缺陷。①1凇.4.18以后不再导出系统调用表

电子科技大学硕士毕业论文

syS call table,虽然可以通过读/de训锄锄设备文件得到它的地址,来实现系统调


用的劫持,但是这样会给安全埋下隐患。②劫持系统调用,需要先跳转到自定义
的函数,然后再调用原来的函数。这种方法的缺点是在多线程环境下不健壮。本

文采用的技术是内核模式的驱动,将附在EXT3、I也ISEI讧S等文件系统之上对文
件系统进行监控。相比挂钩系统调用的缺点,还具有实时性、高效性和安全性等
特点。

针对当前LiI眦文件系统的文件系统监控软件的不足,本文主要内容是设计
并实现一个IjnuX平台下的文件系统监控系统,研究的内容和成果将主要包括以
下几个方面:

1.研究“nuX内核的系统结构,特别是“n_u)【文件系统,包括VFS和下层

文件系统之间的操作流程。

2.研究“InⅨ的流行的文件系统监控技术,如inoti匆、挂钩系统调用等,并
提出了一种新的监控方式sFS(staCkable FileSyst锄),它提供了一种更加灵活、高效
的监控方式。

3.设计并实现了一个具有可扩展性文件系统MFS(Mo血tor FileSySteIll),在此
文件系统基础上可以提供文件操作过滤等相关功能。

4.对系统进行测试、优化以及对存在的问题进行分析并提出解决方案,为以
后的扩展奠定基础。

1.4论文组织结构

本文共分为6章,各章节的内容如下:
第一章主要介绍本课题的研究背景,国内外发展和研究现状。

第二章主要介绍Lil眦的通用文件模型,并介绍当前几种文件系统开发技
术,重点介绍了本系统采用的Stackable FileSystem技术和LⅪ订等相关技术。

第三章介绍了系统的具体设计,提出了系统的整体架构和各个子功能模块的
设计。

第四章主要介绍了系统的各个子功能模块的详细实现。
第五章对ⅧS文件系统进行了功能和性能的测试。
第六章对全文进行总结,分析并指出本文工作的不足,指出本论文研究还需
要进一步完善的地方。


第二章文件系统的开发技术

第二章文件系统的相关技术

相比于一般的应用软件,文件系统的监控软件是处于系统的低层,需要对操

作系统以及文件系统有一定的了解和研究,因此实现LiIluX平台下的监控软件首

先要对LillllX内核的系统结构以及文件系统有全面深入的了解。
本章先介绍“nuX文件系统的相关知识,然后介绍并讨论当前流行的各种监
控技术,对比选择合适的文件系统开发方式。

2.1 L i nu×体系结构

本文提出的监控文件系统是在Linu】【平台下完成的。LinuX操作系统是免费
的多用户多任务操作系统,相比于其他的操作系统,Linux的稳定性、多任务处

理能力以及网络功能让很多操作系统望其项背,而Linux的源代码开源,更是学
习和研究操作系统的首选。与其他操作系统相比,Linu)【还具有以下特点【1】:

①稳定性。“n_u)【操作系统的架构完全沿袭了UNⅨ的系统架构,所以先天
就具有成熟稳定的特点。

②安全性。“nu)【在设计的时候就针对多用户环境,对系统文件和用户文件
的权限都做了明确的区分,每个文件都有不同的用户属性,从而限制了非法用户

的访问和误操作。

③支持不同类型的文件系统,如LinuX平台下的EXT3、Winodws平台下的
FA=r32以及网络文件系统NFS等。

④由于其源代码90%以上是用标准C语言实现的,不到10%的由汇编语言实
现,所以LinuX系统具备良好的移植性。

Lillu)【内核实现了很多重要的体系结构属性,在或高或低的层次上,内核被
划分为多个子系统。Linux也可以看作是一个整体,因为它是宏内核,将所有的

基本服务都继承在内核中。
LinuX内核体系结构包括4部分:应用程序,系统内核,系统服务,硬件。

图2.1是一个简化的LiI懈内核体系结构图【l】o
电子科技大学硕士毕业论文

用户程序|. 一 、

标准库
用户态

, l
内核卷 系统调用

£ l占

义仟丁承玩

人 进程阃通信
l l \
高速缓存I \ 进程控制 谰度程序
予系统
; 善
字符设备I块设备 存储管理
: l
设备驱动程序l
王 ,

硬件控制
内孩态 t

硬梓缀

硬件

图2-lI.j玎ux内核体系结构图

从图中可以看到三个不同的层次:用户层、内核层及硬件层,从中我们可以
分析得到三个层次之间的关系,以及各个子系统之间的关系。

1)用户程序通过标准库接口调用了系统调用进入内核,而汇编语言程序可以
不经过标准库而直接引用系统调用。

2)文件子系统使用一个缓冲机制来存取文件数据,缓冲机制缓解在内核与二
级存储设备之间的数据流的速度不匹配。缓冲机制与块I/O设备驱动程序交互,
而字符设备是不需要缓冲的。

3)进程控制子系统负责进程同步、进程间通信及进程调度。进程子系统在执
行一个可执行文件之前,把它读到内存中,进程调度模块把空闲的CPU分配给该

进程,该模块调度各进程依次运行,知道它们因等待资源自愿放弃CPU,或它们


第二章文件系统的开发技术

最近一次的运行时间超过一个时间量,从而内核抢占它们,于是调度程序选择最

高优先权的合格进程投入运行。进程间通信模块负责不同进程之间的数据传输;
进程同步模块处理有逻辑关系的进程。

4)存储管理模块控制存储分配。当系统中没有足够的物理存储供进程使用

时,内核就在主存和二级存储(一般为磁盘)之间对存储数据进行换出操作,以便
进程公平的得到系统的内存资源。

5)硬件控制负责处理中断及设备通信。
Lill.u)【内核拥有5个主要的子系统,其中构成一个操作系统的最重要部分莫

过于进程管理和文件系统,实际上,有些操作系统有进程管理而没有文件系统,
如嵌入式操作系统;有些操作系统有文件系统而没有进程管理,如DOS文件系统。

但是,不存在同时没有进程管理和文件系统的操作系统。

2.1.1 Linu×内核的主要子系统

11进程管理

控制进程对CPU的访问,由调度程序选择最值得运行的进程。

2)内存管理
管理内存,提供内存利用率和提高效率。

3)虚拟文件系统
隐藏各种硬件的具体细节,为所有设备提供了统一的接口。

4)网络接口

提供了对各种网络标准的存取和各种网络硬件的支持。
5)进程间通信

支持进程间各种通信机制。
这些子系统构成了内核的最核心的功能。

2.2虚拟文件系统(VFS)

I.jnu)【成功的关键因素之一是它与许多操作系统的不同类型的文件系统和谐
共存的能力,前提是该文件系统可以被LinuX识别。我们可以透明在LiIluX某个

目录下挂载其他操作系统的文件格式的磁盘或分区,把各种不同文件系统的操作
和管理纳入到一个框架中,为其提供统一的文件操作接口,即虚拟文件系统,也

可以称之为虚拟文件系统转换VFs(virnlal Filesystem switch)【11。虚拟文件系统是



电子科技大学硕士毕业论文

一个内核软件层,用来处理与LinuX文件系统相关的所有文件系统调用,其健壮

性表现在能为各种不同的文件系统格式提供一个通用的接口。
VFS是位于具体的文件系统之上的抽象层,该抽象层主要由一组标准的、抽

象的文件操作构成,这样就可以对用户程序隐藏各种不同的文件系统的实现细节,
为用户程序提供~个统一的、虚拟的文件系统操作界面。

VFS实现了所有的文件系统的相关操作,用户程序可以文件操作,如read()、

、砌teO、1seek(),调用相关的系统调用,然后转发到Ⅵ?s操作流程中。而大部分文
件的系统调用并不是由VFS操作来完成,都需要被转发到下层具体的文件系统来
实现。如果我们形象的把内核比做一块主板,把VFS比做主办上的一个插槽,那

么每个具体的文件系统就插槽上的一块接口卡,不同的接口卡有不同的电子线路,
但是它们与插槽的连接线路都是有明确定义的。同样,不同的文件系统通过不同

的函数来实现其各种功能,但是于VFS之间的界面也是有明确定义的,这就是

file-pperations数据结构中所定义的,该结构体定义于<includ朝inux/fs.h>文件中。
图2.2给出了VFS与下层文件系统之间的关系。

文件系统摄f1
用户进程 用.包括憎df
用户空■ 锿


一 1f 一

{}
、,FS

~‘。01 ‘
‘期越mt结构。
钟安现具体_

. t r :
’ 一

Ⅱ :t j1 : j1 : Ⅱ
彩∥
E脚 FAT32 m 设备文件

≤≮逸. 丝

图2.2 VFS模型
第二章文件系统的开发技术

vFS支持的文件系统类型可以分成三种【l】:

1)磁盘文件系统。这些文件系统在本地磁盘或者其他可以磁盘作用的设备中
有可用的存储空间(比如EXT3、NTFS、USB闪存等)。
2)网络文件系统。这些文件系统允许访问属于网络中的其他计算机的文件系

统所包含的文件。虚拟文件系统所支持的一些网络文件系统有:NFS、CⅢS、NCP

{}o

3)特殊文件系统。这些文件系统没有本地的或远程存储空间,而以一种特殊

的方式存在。proc和sysfS就是存在于内存之中的一种特殊文件系统。
本文阐述的文件系统监控是基于磁盘文件系统,对网络文件系统和特殊文件
系统将不做过多描述。

2.3文件系统的通用文件模型

vFS所隐含的主要思想在于引入一个通用的文件模型(ConHnon File

Module)【l】,这个模型能够表示所有Linu)【支持的文件系统。从本质上说,LinuX

内核不能对一个特定的函数进行硬编码来执行诸如read()和ioctl()这样的操作,而
是对每个操作都必须使用一个指针,指向要访问的具体文件系统中对应的函数。

每个具体的进程在访问一个文件的时候,都会为该文件在内存中创建一个丘le对
象,该对象有一个s仃uct file op酬ions f op的字段,该字段中包含一些指向具体
的文件系统的函数指针。每个文件系统实现了自己的file operations数据结构,结
构中的成员几乎全部都是函数指针,所以这个结构体实际上是个函数跳转表,通

过对该指针的操作,跳转到相应的具体的文件操作函数中,如果该文件系统不支
持某个文件操作,那么file operations结构中的相应函数指针就是NULL。比如在

ExT3文件系统上执行读操作read(),该操作就执行sys_』ead()系统调用,然后通
过VFs接口vfS read()转发到下层具体操作系统的实现该功能的例程,并调用驱

动程序,从磁盘读取文件数据,这样一来应用程序的通用接口read()函数就被转

化为对具体文件操作的实现:readO一>sySjeadO->Vf.s.』ead()->file->£-0p一>readOpj。,
对于EXT3文件系统而言,矗le中f op的read指针对应的是ext3 read()函数,结
构体丘le opemtiolls是在系统引导的时候初始化的,或者通过内核可加载模块动态
加入到内核的时候初始化的。

通用文件模型是面向对象的,不仅需要定义数据结构也需要定义方法,但是,
出于效率的考虑,I.jnuX内核并没有采用面向对象的程序设计语言来编写实现(比


电子科技大学硕士毕业论文

如C抖)。因此在LiImX内核中,对象用C的结构体来实现,结构体中指向函数的
指针字段对应着对象的方法。

图2.3给出了该函数的执行流程。

图2-3体在一个简单的read()操作中的作用

2.3.1

1)

含了文
第二章文件系统的开发技术

通用文件模型无关的数据。通用文件模型的超级块对象是在文件系统在安装的时

候建立的,并在这些文件系统卸载的时候自动删除。对基于网络的文件系统,这
类对象是在文件系统挂载的时候产生的,只存在内存中,没有磁盘映象;对基于

磁盘的文件系统,这类对象一般存放在磁盘的文件系统的控制块中(FCB)。
超级块对象定义与<1inuX/fs.h>中,主要数据结构如表2.1所示,表格中仅列

出比较重要的项。

表2-1 sup哆jlock结构体主要项

s仃uct list head s list 指向超级块链表的指针

unsigned long s blocksize 以字节为单位的块大小


stnlCt fileL.Sys仃11ejype卡 s_却e 文件系统类型
S乜1lCt s-op 操作超级块的方法

Super._operations木

s缸uct 1ist head s inodes 所有索引节点的链表

s仃uct dell姆木 S I.oOt 根目录的目录项对象

int S coUnt 引用计数

stmct semaphore s 10ck 超级块信号量

从表中可以看到,超级块中最重要的域无疑是s op【l】,表示超级块对象的函
数操作表。超级块中的操作表用结构体Supcr operations来表示,定义于
<lin耐盘.h>中,结构体中的每一项都是一个函数指针,指向一个文件系统已经实
现的操作超级块对象的函数。

Ⅵ:S通过超级块的操作表来对转发对超级块的某项操作,跳转到对应的具体
方法中。如在通用模型下,读取EXT3文件系统的超级块的操作read sup呶),通

过操作表SbpS_op>read』uper0转发到具体的读取操作eXt3—『ead』perO。
2)索引节点对象‘11(i110de)
Inode对象在内核中代表一个文件或目录,存放着关于这个文件或目录的具
体信息。每个索引节点对象都有一个索引节点号,这个节点号唯一地标识一个文

件系统中的文件。不是所有的文件都有inode的概念,但是ⅦS作为一个通用
模型,在操作没有inode对象的文件系统的时候,会临时生成一个inode对象,
以便提供统一的通用接口,不过会带来一些性能的损耗。

Inode对象定义在<1inu)【/自.h>中,主要数据结构如表2-2所示,表格中仅列出
重要项。
电子科技大学硕士毕业论文

表2.2i110de结构体主要项

unsigned long l 1n0 索引节点号


uid t i uid 所有者标识符

百U i』d 组标识符

unsi盟ed 10ng i blocks 文件的块数


umode t i mode 文件类型与访问权限
s饥1ct inode』)perations宰 1-0p 索引节点的操作表
s仃uct file--operations奉 i-f.op 缺省文件操作
void奉 u・genenc_lp 私有域数据
s觚lct timespec i atime 上次访问文件的时间
s仇lct timespec i mtime 上次写文件的时间
s仃uct timespec i ctime 上次修改索引节点时间
atomic t i count 引用计数

与super bloCk对象类似,inode的操作表是inode operatiolls定义i 0p字段,


它是对inode操作的函数跳转表,任何对inode的操作都是通过该操作表来进行转
发,跳转到具体的inode操作函数中实现。

3)文件对剩11(file)
文件对象表示一个已经被进程打开的文件,存放打开文件与进程之间当前正
在进行交互的有关信息,因此与一个文件仅有一个inode不同的是,进程每次调用

opell()系统调用,都会产生一个文件对象。该对象信息仅当进程访问文件期间存
放于内核内存中,而不存放在磁盘介质上。

file对象定义于<1inuX/fs.h>中,主要数据结构如表2.3所示,表格中仅列出
重要项。

表2.3 file结构体主要项

s觚ct d咖奉 £_denn.y 文件相关的目录项对象

Sn似 t叩 文件操作函数操作表

file-0perations宰

loljF t oos 当前的文件位移量


s缸】Ct addres等-space宰 £mapping 页缓存映射

unsi朗edint f uid 用户的uid

12
第二章文件系统的开发技术

unsigned int £百d 用户的西d


s仃uct vfSmount宰 f vf.Smount 含有该文件的己安装文
件系统

mode t f mode 进程的访问模式


void牛 p—Vattdata 私有域数据

file的函数操作表是丘1e operatioIls定义的f op字段,它是文件操作的函数跳

转表,任何与文件操作相关的函数都将通过该操作表来进行转发,跳转到具体的
文件对象操作函数中。

4)目录项对象Ⅲ(d咖)
den时对象存放与路径有关的有关信息。目录项主要作用方便对文件的查找。
跟矗1e对象一样,dell时对象只存在内存中,当VFS遍历路径的时候将路径中的
目录或文件分析解析成目录项对象。

结构体deIl仃y定义于<1inux/dcache.h>,主要数据结构如表2.4所示,表格中
仅列出重要项。

表2.4d铋仃y结构体主要项

atomic t d coⅦt 引用计数

spilllockj d 10ck 目录项对象的自旋锁


s仃uct inode幸 d inode 与文件名相关索引节点
s缸uct den仃y奉 d_Jar铋t 父目录的目录项对象
s饥lct dent巧operationS枣 d_0p 目录项的函数操作表
stmct Supeoblock宰 d sb 文件的超级块对象
void掌 d fSdata 私有域数据

d锄缸y的函数操作表是dell衄r.operatiolls定义的top字段,任何与目录项相
关的操作都是通过该操作表来进行转发,跳转到具体的目录项操作函数中实现。

d咖对象是连接矗le对象与inode对象的桥梁。VFs在查询文件的时,利用d胁仃y
来逐层解析每一层的路径,从根dell仃y或当前的工作dell巧查找,根据文件名逐
个匹配,直到找到该文件对应的inode对象。
这四个主要的对象构成了通用文件模型的主体,对文件系统的操作将转化成

对这四个主要对象的操作。
四者之间的关系可以通过图24来表示,图中描述了不同的进程打开同一个
文件和不同的文件的情形。
电子科技大学硕士毕业论文

一4
图2-4进程与Ⅵ?S的对象之间的交互

由用户进程通过叩e110函数来打开一个文件,内核为该文件生成一个file对
象来描述该文件与进程的交互信息;如果该文件已经被打开过,那么该丘1e对象

将于其他的file对象共同使用已经创建好的dellt巧对象,如果没有被打开过,将

为其生成一个d锄仃y对象来描述目录信息,并用file的鲫e11时指针指向该deIl仃y
对象;如果该文件之前并不存在,将会根据open()函数的flag来决定是否创新一
个新的indode,如果是,则生成一个新的inode对象,如果不是,当没有找到该文

件对应的inode的话,表明打开一个无效的文件,函数返回。由d咖的d-j110de
指针指向inode对象。

2.3.2文件系统相关的其他数据结构

每个文件系统都有一个初始化例程,它的作用是在系统初始化的时候或者通

14
第二章文件系统的开发技术

过模块动态加载VFS中去,即填写一个:file』yst锄jype的数据结构,该数据结
构包含了文件系统的名称以及一个指向对应VFS超级块读取例程的地址,描述了
文件系统相关属性和行为。

该类型定义于<li删d蠡.h>中,丘le—ystemjype主要的项如表2.5所示。

const c:har枣 n锄e 文件系统的名字


int gs-nags 文件系统的类型
s仃uCt superj)10Ck宰(宰)0 g@ 从磁盘读超级块的方法

Void术(幸)O l【iU Sb 终止超级块访问的方法


s由mct 61eL-syst锄jype幸 neXt 链表的下一项

file-.-Systemjype

所有已向VFS注册的文件系统的file』ySteII】:t),pe结构形成一个链表【31。链表

头由file』ystems变量指定。图2—5给出了文件系统的链表。

n矗me na盯Ie n8me

纛l哆systems
re囊《L.snl姥r( ext3 read--supe“ proc reailjnper( Inl毫
) ) '

neXt、、
一, /‘ 霸ext、—一 -___—,
/’ next

图2.5文件系统注册链表

当文件系统在vFS中注册之后,表明内核可以认识了该文件系统,但是如果
要使用这个文件系统,必须要该文件系统挂载才能使用。把一个文件系统挂载到

一个目录项时要使用一个vfSmo眦数据结构作为来连接目录项对象,由此来申明
从此目录开始的所有目录和文件都是属于挂载上去的文件系统的。
该结构体定义于<linu)【/mount.h>中,vfsmou呲的数据结构的主要项如表2.6

所示。

15
电子科技大学硕士毕业论文

表2.6 vfsmount结构体主要项

struct vfSmount・ mm parent 上一层文件系统


s缸uct dentW牛 砌Lmoun印oint 挂载点的den姆结构
昀mct d豇l缸y宰 埘n£roof 根目录项结构
s仃uct sup呸Jlock宰 mt Sb 该文件系统的超级块
int mnt na簪 挂载参数
char宰 Innt devn锄e 设备文件名

由nmt珊ountpoint指向挂载点的dell仃y结构,瑚nt root指向所安装设备上根
目录的deIl仃y数据结构,这样文件系统和挂载点之间就搭起了一座桥梁。这样,
当文件系统的操作执行到挂载点的时候,就会发现这是文件系统的挂载点,进而

调用与该文件系统相关的操作来实现功能。

2.3.3文件系统的操作

每个文件系统都有自己的文件操作函数。文件系统的索引节点、目录项、文

件对象分别包含了一个函数列表,分别对应于s缸uct inode』perations,s缸uCt

den衄Jperations,s仃uCt fil凹p耐ions,这三个结构体之中,他们构成虚拟文件系
统VFS的界面,所有的具体的文件操作,都要经过这三个函数跳转表进行转发。
图2.6给出了他们与文件系统对象之间的逻辑关系。

16
第二章文件系统的开发技术

图2.6文件系统逻辑结构图

当一个进程需要进行文件操作的时候,操作流程就会执行到d-9p、op、Lop
这三个函数跳转表进行转发。这三个结构体是具体的文件系统在创建目录项、文
件对象和索引节点的时候已经初始化,已经与具体文件系统操作相关。文件操作

就从Ⅵ,S通过这三个函数跳转表将文件操作执行流程转发到具体文件系统的操
作。

2.4文件系统监控技术的介绍

目前基于I,inux平台下文件系统监控技术,主要有两种方式,第一种是i110ti匆
机制,第二种是拦截文件操作的系统调用技术。下面分别来介绍这两种技术的原

17
电子科技大学硕士毕业论文

理。

2.4.1 i not i fy机制

hloti∥381是文件系统事件监控机制,包含在已经发布的Li肌)【2.6.13内核中作
为dnoti矽的有效替代。inoti矽一种强大的、细粒度的、异步的机制,它满足各
种各样的文件监控需要,不仅限于安全和性能。

事实上,在inoti矽出现之前,存在着一个类似的文件变化通知机制,即dIloti母
机制,但是该机制存在着许多不足之处: .

①dnoti母需要为每个想监控的目录打开一个文件描述符。当同时监控多个目
录时,就会打开许多的文件描述符,这不仅会消耗大量的系统资源,甚至有可能
达到每个进程的文件描述符数目的最大限制。除此之外,文件描述符会锁定目录,

从而不允许卸载支持的设备,这也有可能存在问题,当监控的对象是移动介质的
目录,那么将导致无法卸载这些文件系统。

②dnoti匆粒度更大。dnoti匆是基于目录级别的,只能监控目录的变化。而
想通过目录事件来得知哪个文件变化了,需要缓存许多stat结构的数据。首先为

每个被监控的目录申请一个stat结构,用于不同时刻目录状态的对比,从而发现
目录中哪个文件发生了变化。

③dnoti匆的接口不友好,它使用了si朗a1信号机制通知事件。
inoti匆是为了替代dnoti匆而设计的,它克服了以上dIlotif3,的缺陷,提供了
更好用、简洁和强大的文件变化通知机制。

①inoti匆不需要对被监视的目录打开文件描述符号,而且如果正在监控的目

录是可移动介质上的,那么当该文件系统被卸载了,那么监控操作会被移除,得
到一个卸载的事件。

②inoti母不仅能监视目录,,也可以监视文件。

③inotif3,使用文件描述符作为基本接口,可以通过poll【61和印011【6】来操作
文件描述符,比sigal功能更强大。
表2.7给出了inoti匆可以监控的文件系统事件【3引。

表2-7 inoti匆监控的事件

玳OPE]N 文件被打开事件
IN CREAn! 创建文件事件
IN CLOSE 文件被关闭事件

18
第二章文件系统的开发技术

IN DELETE 文件被删除事件
IN MOVED FROM 文件被移走事件
IN MOVED TO 文件被移来事件
IN MOVE 文件被移动事件
IN DELETE SELF 文件自删除事件
IN MOVE SELF 文件自移动事件
IN UNMOUNT 宿主文件系统被卸载事件
IN MODIFY 文件被修改事件
IN久兀RIB 文件属性被修改事件
IN CLOSE WR_ITE 可写文件被关闭事件
..J・

IN CLOSE NOWRITE 不可写文件被关闭事件

当应用于性能监控、调试和自动化领域时,inot毋是一种用于监控LilluX文
件系统的、强大且细粒度的机制。使用inotif3,机制的API,可以编写以最低的性
能开销响应或记录文件系统事件的应用程序。

2.4.2拦截系统调用技术

在介绍该技术之前,要先解释一下内核可加载模块LKM【2】(Linu】【Kenlel
Mo(1ule)和LinuX系统调用的概念。

1) 删(LirnⅨKemel Module)
众所周知,“nux内核是个宏内核,它既对用户程序提供服务功能,同时也
作为管理者该整个系统,由于全部功能集中在一块,系统花在内核功能的切换上
的开销就非常小,提供给用户程序的反映就很快,同时,各个功能之间的耦合度

就很紧,导致内核难以修改和增加新功能,而微内核只完成服务功能,其他的管
理功能就交给一个或多个特权服务程序,所以微内核可以很方便的扩充,但是切

换开销大。为了达到微内核理论上的许多优点而不影响性能,LinuX内核提供了
模块。模块是一个目标文件,其代码可以在运行时链接到内核或从内核解除链接;

这种目标代码通常由一组函数组成,用来实现文件系统、驱动程序或其他内核上
层功能
使用模块的主要优点包括:

①模块化方法
因为任何模块都可以在运行时被链接或解除链接,因此,系统程序员必须提

19
电子科技大学硕士毕业论文

出良好定义的软件接口以访问由模块处理的数据结构。这使得开发新模块变的容
易。
②平台无关性

即使模块依赖于某写特定的硬件特点,但它不依赖于某个固定的硬件平台。

例如,如何scsI标准的磁盘驱动程序模块,在IBM兼容PC和HP的Alpha机上
都能很好地工作。
③节省内存使用

当需要模块功能时,把它链接到正在运行的内核中,否则,将该模块解除链
接。这种机制对于小型嵌入式系统非常有用的。

④无性能损失

模块的目标代码一旦被链接到内核,其作用与静态链接的内核的目标代码完
全等价。因此,当模块的函数被调用的时,无需显示地进行消息传递。

模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有
链界,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以

动态扩展内核的功能,模块最主要的用处就是用力实现设备驱动程序。Linu)【
kenlel中有一个变量叫module list,每当user将一个module加载到kemel的时候,
这个module就会被记录在module 1ist里面。当kemd要使用这个module提供的

函数功能时,就会去查询module list,找到该module,然后再使用其提供的函数或

变量。每个module都可以eXport一些函数或变量来让别人使用。
在LinuX可加载模块出现之前,每次对内核的修改都需要重新编译整个内核,

当进行大量代码修改的时候,即便能够保证内核代码修改没有潜在的问题,花在
编译内核上的时间也是无法容忍的。而可加载模块出现之后,只要把编写的模块

编译之后,执行insmod命令将该模块插入到内核中去,就可以给内核或其他的模
块提供功能。当不需要该模块的时候而且其他的模块对它没有依赖关系,执行
砌IIllode命令将该模块从内核中删除。

每个I,KM模块都有两个函数:i11i iIlit module(Void)和 void

cle a11.—module(void)。其中init.且oduleO在每次模块加载的时候被调用,可以进行

LKM的初始化工作,比如:注册、设备初始化、分配内存等操作;而

dean_up珊odule(void)是在每次模块卸载的时候被调用,比如取消注册,释放内存
等操作。

由于Ll洲以上诸多优点,删常被用来开发设备驱动程序。
2)系统调用
第二章文件系统的开发技术

Linux系统分为内核空间和用户空间,用户进程是禁止访问内核进程空间的

地址和数据,同时内核进程也无法直接访问用户进程空间的数据和地址。两者交
互必须通过一定的机制。

系统调用就是由内核实现的,然后通过一定的方式提供给用户,一般通过门
陷入实现的。系统调用是用户程序和内核进行交互的接口。

利用LKM截获系统调用可以实现对文件系统的实时监控。首先把对每个文
件的读、写、打开、关闭等操作都能实时的截获;其次,把截获的对文件的操作

信息传递到用户空间的守护进程,由此守护进程来接着进行相关处理。

要实时的截获文件的操作信息,在用户空间下是无法实现的,因为我们知道,
任何一个用户进程对文件的读写操作,都是通过系统调用来完成的。当产生一个

系统调用,操作系统进入内核,由内核来执行相关的操作,然后再返回给用户进
程。因此,只要在内核中截获对文件系统的系统调用就可以实时的监控,而对文

件系统的系统调用的截获,可以通过修改系统调用表来实现。
在Linux内核的include/姗.i386/unistd.h文件中有一个完整的系统调用列表。
如下图所示一些与文件相关的操作的系统调用:

如上所示,每个系统调用都有一个系统调用号,该系统调用号是内核中的一

个一维数组系统调用表s怼calljable口的下标,通过这个系统调用号,在发生系
统调用的时候映射到实际的函数中。如下面代码所示:

2l
电子科技大学硕士毕业论文

syscalLpall:

call木syS..Calljable(,%eaX,4)
比如,当发生syS_婶ad(NR_J℃ad)系统调用的时候,系统调用号被压栈,传入

到寄存器eaX中,然后执行call丰syS-call_table(%ea)【,4)这条语句,即eax宰4(每个
函数指针的4个字节),找到对应的函数的指针,然后执行。

在代码中我们可以获取sys call table,修改包含其中的某个函数指针,即可

以修改对应的系统调用。如下面代码所示:
eXtenl Void}s ys.-calljable[】; p导出系统调用表木/

oldJead=syS__calUable【NIo.ead]; 产存放原来的系统调用指针事/

sy吖all—table【NIo.ead]_new-Fad; /奉将系统调用表的系统调用指针替
换为自己编写的函数幸/

通过挂钩文件操作的系统调用,改变文件操作的正常执行流程,添加上监控
操作,可以实现对文件系统的监控功能。

2.4.3两种监控技术的分析

通过以上的介绍,我们知道inoti矽机制是监控文件系统的事件,可以很好的
反映某些事件的发生,如文件被访问、属性被修改、文件被关闭等,但是无法得
到更加详细的访问信息,包括访问该文件的进程名、进程号、读写操作、日期时
间等信息。而使用LKM拦截系统调用是处于系统调用层的,位于VFS之上,不

能得到更多的与文件系统相关的信息,而且修改系统调用表会带来安全隐患,以及

在多线程的环境下不健壮。所以,这两种方式都不是很好的选择,需要寻找一个
健壮、高效的监控方法。 .

2.5 Stackab Ie Fi IeSystem

2.5.1 Stackab Ie Fi IeSystem介绍

要想实现对文件系统的监控,必须挂钩相关函数的,也就是修改文件系统或

者内核代码。然而任何修改文件系统或者内核的代码都是极其困难的。首先,内
核和文件系统的代码本身是很难掌握的,其次,任何可能出现的细小的错误都会

导致严重的系统破坏。而相比之下,文件系统提供了同一的、透明的访问机制在
用户空间和内核空间之间传递数据,我们更愿意通过给文件系统增加一些特性满
第二章文件系统的开发技术

足额外的要求。虽然现在Linllx通过Ⅵ,s机制支持很多文件系统,但是他们都是
相对比较简单的,比如磁盘文件系统、网络文件系统等等,文件系统的的开发人

员把精力更多的放在文件系统的健壮性和效率上,所以,一旦一个文件系统很健
壮和高效的运行,文件系统的开发人员都不会对其进行更多的修改,此外,文件
系统的维护人员很少接受补丁增强文件系统的稳定,因此,可以毫不奇怪的看到

目前主流的文件系统在本质上并没有发生改变。所以,如果我们要对文件系统增
加一些特性,不应该直接修改内核或文件系统的源代码了。

Linux把文件子系统分成了上下两层:上层虚拟文件系统vFS和下层真正的
文件系统。VFS作为一个中间层,处于系统调用和文件系统之间,它提供统一、

透明的机制去访问文件系统而不需要与具体文件系统相关的细节。当发生文件操

作的系统调用时候,由VFS调用通用的函数,VFS不需要知道将要被访问的文件
系统的类型。例如,读操作read()访问eXt3文件系统下的某个文件,触发系统调

用,调用sysjead()例程,调用由VFS调用通用Vf啊adO例程,然后通过前面讲述
的函数跳转表,调用具体文件系统的读操作,对于ExT3文件系统来说,就是

eXt3』ead()例程。
从VFS我们可以得到一些启示,VFS是文件系统的抽象层,为具体文件系统

提供了统一的接口来实现转发操作,屏蔽了具体文件系统的细节问题。为了给现
有的文件系统增加新的功能,实现对文件系统的监控,而又不改变文件系统的源

代码的前提下,我们也可以再添加一个中间层,其功能类似于VFS,不过与VFS
不同的是,新添加的中间层不仅仅对流程进行转发,还要实现文件系统的监控操

作。

该中间层称之为SFS(Stackable FileSystem)【81,可以象VFS一样被上层文件操
作调用,并调用下层的文件操作。图2.7给出了增加一个中间层之后的文件系统
架构。
电子科技大学硕士毕业论文

曩白盘曲
用户进程

妇垃盘信l 1 r
’】协I●’翟

vFs l


SF8


踟3


<!>

磁盘

图2.7增加监控层的架构

新增加的中间层是一个文件系统,是一个堆叠式文件系统【91Stackable
FileSyStem(SFS)。SFS可以单独使用,并挂载在操作系统上任何已经存在的文件

系统的挂载点之上。这样,只要开发一个SFS,就可以应用在任何的文件系统之
上。

以上就是一个stackable Filesystem的框架,在Ⅵ7S和文件之间在加入一个中

间层文件系统SFS,在不改变内核和文件系统的源代码的方式,利用LKM(内核
可加载模块)来实现这个中间层,这个中间层是SFS的一个具体实例,称之为监控
文件系统.MFS(Mointor FileSyst锄)。

2.5。2 Stackab l e Fi l eSystem原理

传统的文件系统开发是很困难的,在现有的文件系统中,即使一个很小的变

化也需要对内核内部的深刻理解和把握,从而使得文件系统的开发难度很大。过
去的建议是,在现有的文件系统中提供可扩展的文件系统接口,这将简化新的文
第二章文件系统的开发技术

件系统的开发,但是文件系统系统的开发和维护人员拒绝对文件系统本身做出任

何大的变化,因为稳定性和性能问题才是文件系统最关心的。
SFs可以向文件系统提供增加特性的机制,它并不需要修改任何内核或文件

系统的代码。SFS作为一个中间层的文件系统,它位于Ⅶs与具体文件系统之间,
与vFS和下层的文件系统进行通信。文件操作流程从VFS转发到SFS,然后再由
SFs转发到具体的文件系统中。我们称sFS为上层文件系统,而具体的文件系统

为下层文件系统。SFS作为一个中间层,可以添加很多有用的功能,比如用于对

数据加密、解密的安全功能【15】;用于过滤文件操作的监控功能【”】;用于数据隐藏
的加密功能等等。

SFS是利用Ⅵlode堆叠技术【13】实现的。Ⅶode是UNⅨ操作系统中虚拟文件【5】
系统表示一个文件或者目录的对象,与之前讲述的Linux操作系统的虚拟文件系

统的inode相似。Ⅶode接口【20】通过分层的方法,抽象了内核对文件系统的具体
操作,形成一个中间层vFS,由vFS来转发对具体文件的操作,从而隐藏了内核

代码直接访问下层文件系统的具体实现过程。对操作系统支持的任何不同的文件
系统的操作都将通过V110de提供的统一接口来访问,从而实现了系统透明的访问

任何一个可支持的文件系统,而不需要关心所访问的文件系统的具体类型。Ⅶode
对内核和具体文件系统之间的进行了抽象,增加一个虚拟文件系统层,提供了统
一的文件操作接口。根据Ⅶode的堆叠技术原理,我们可以加以利用和改进。

为了给文件系统添加新的功能,在不改变原来现有内核和文件系统的前提下,
对Ⅶode接进行再次的分层,实现对文件操作的两次堆叠。存在两个虚拟层,这

样就存在了内核和具体文件系统之间就有两个Ⅶode接口,位于上层的是VFS
的抽象层,而下层是为添加监控功能的抽象层。两次Ⅶode接口的堆叠让上层的

vnode接口操作完成之后再转发到下一层的vnode接口操作,从而对文件系统的
统一文件接口框架进行了再次划分,使功能分层化、模块化。

sFs技术将实现了一个新的Ⅶode接口,并将堆叠在以前的Ⅶode接口之下。
SFS的Ⅶode接口通过上层的Ⅶode接口传递文件操作的对象,使用下层文件系
统进行数据访问和文件操作。SFS在新的Ⅶode接口上添加了文件监控功能,用
于实现对文件系统的监控操作。
sFS实现了自己的Ⅶode接口,拥有自己的数据结构和方法,SFS就象另一

个具体的文件系统一样挂载在VFS的矗1e syst锄eS【4】链表之下工作,但与基于块
设备的文件系统或基于网络的网络文件系统不同,sFS本身的特点只是增加新的

特性,本身并不需要操作和存储数据,所以一般不需要设计新的数据结构以及提
电子科技大学硕士毕业论文

供对这些文件系统对象的基本存储,具体的数据操作和数据存储工作将依赖下层
的具体的文件系统来实现。

sFs的基本工作原理是:接收上层文件系统的调用,对参数进行相关的处理,

然后将文件操作转发到下层具体文件系统获取返回结果。SFS可以在大部分1111ix
或Linux系统中实现。

虚拟文件系统VFS的元数据deIl时、i110de和file对象都包含一个私有域指向
文件系统自己定义的私有数据对象。如file对象中的pfivate date域、d咖对象
的dj.sdata域以及inode对象中的u.gen甜cjp域。当SFS的操作被Ⅵ7S调用的
时候,这些对象传递给了SFS,可以利用对象这些私有域来存放与下层文件系统

相关的信息,其中最重要的是保存指向下层文件系统对应的对象的指针,以便在
执行SFs操作之后可以返回到正常的文件操作流程中。sFS对象可以通过这些私

有域来存放上层Ⅵ,S对象,通过私有域与VFS之间建立对象的联系,实现Ⅶode
接口的堆叠。比如,SFS的操作流程中,一个inode对象,可以通过它的u.gen耐c ip

域保存VFS传递下来的inode对象,在进行过滤操作完成之后,恢复VFS的inode
对象,然后通过inode对象中的文件操作转发表,将文件操作流程转发到具体的
文件操作中。

实际上,Ⅶode堆叠并不是一对一的,上层的Ⅶode和下层的Ⅶode对象并
非是一对一的关系。SFS堆叠技术允许一个文件系统挂载在多个目录之上,从而

产生了多个Ⅶode对象,这样上层的Ⅶode对象将拥有一个由多个下层Ⅶode的
形成的链表,这是sFs的一个重要应用,人们可以使用这种方式来实现一个备份

文件系统的应用,sFS将一个文件系统挂载在两个不同文件系统之上,把其中的
一个文件系统将作为另一个备份:应用程序通过上层文件系统对其中的一个文件

系统进行数据存取,而所有相关的修改操作都被转发到另一个文件系统中,而数
据转发和接收都在sFs的vonode接口中实现,从而实现了数据的备份。

不难看出,SFS是一种叠加式的文件系统开发技术,在具体文件系统之上进
行功能的增加、删除和修改,使得文件系统开发人员不需要关心下层文件系统的

实现细节,而更专注于新加入功能的实现,这就降低了开发和移植的难度。同时,
由于多个SFSⅦode对象可以通过特定的的顺序堆叠在一起,从而可以形成一个

新的具备多种功能的文件系统。因此,SFS也是一种系统开发模块化的技术。例
如,有两个SFS,一个提供数据加密功能,另一个提供数据压缩功能,那么它们

堆叠在一起在效果上就相当于一个同时提供加密和压缩功能的文件系统。使用
SFS进行文件系统开发可按照功能把文件系统划分为多个层次的模块,模块化的
第二章文件系统的开发技术

开发有利于测试和重用。sFS下层可以使用任意的实现Ⅶode接口的文件系统,
这带来了很大的灵活性,更重要的是这意味着它可以与NFS等分布式文件系统联
合工作,有助于把基于磁盘的文件系统和分布式系统统一起来研究。

由于Ⅶode堆叠增加了文件系统的层次,额外的函数调用会必然带来了性能
的开销,但由于新增的功能函数都是在内核模式下进行调度的的,不需要进行频

繁的上下文的切换,所以这些开销不会带来实质性的影响,实验表明,由sFS带
来的性能损失不超过7%,这对于大部分应用来说完全可以接受的。

SFS最基本的功能是传递函数指针和参数到下层的具体的文件系统,由下层

的文件系统对应的函数实现功能。例如read()操作,在没有实现sFS的情况下,

由read()一>sy蹦readO一>V矗』ead()・>eXt3』adO。在实现SFS之后,read()操作就会

多执行一个例程,read()->sys.-read()一>VfsJead()一>mf-s.—read()・>eXt3—删狙()。
通过以上三种技术的介绍,我们知道inoti矽机制是监控文件系统的事件,可
以很好的反映某些事情的发生,如文件被访问、属性被修改、文件被关闭等,但
是无法得到更加详细的访问信息,包括访问该文件的进程名、进程号、读写操作、

日期时间等信息。而使用I,KM拦截系统调用是处于系统调用层的,位于虚拟文
件层之上,不能得到更多的与文件系统相关的信息。所以,这两种方式都不是很

好的文件系统监控的选择。
SFS可以作为一个可装载模块动态的装载到内核中,增加新的特性和功能,

与前面介绍的inotif3,机制和拦截系统调用这两种技术相比,sFs的优势明显,它
具有以下的优点:

11可以挂载在多种类型的文件系统之上,和多种文件系统组合使用。从而更
容易的增加和扩展文件系统的功能。 ..

2’)是基于砌x的Ⅵ10de堆叠技术实现的,可以应用于多种眦ix和类unix系
统,有很好的可移植性,并使用标准的接口。

3)与inoti母比较,不仅仅能监控文件系统的事件,还能够获取文件系统操作
详细的细节信息,如具体文件和进程的信息。

4)与挂钩系统调用只是处于系统调用层,SFS位于VFS和下层文件系统之
间,处于系统调用之下的文件系统层,可以获取更多与文件系统及其文件操作相

关的信息,提供更加确切的监控信息。
综上所述,由于SFS具有良好的性能并且易于移植和开发,我选择了
Stacckable FilesvStem的技术并结合具体的文件操作环境,来实现文件系统的监控

功能。
电子科技大学硕士毕业论文

2.6 LKM实现Stackab l e F i I eSystem

实现文件系统的实时监控,即实现一个SFS的实例,它是基于“nux可加载
模块技术的,作为模块动态的加载到内核中或从内核中卸载。

在SFS中对文件系统的相关操作进行过滤处理,不仅仅需要获得过滤的对象,
也需要对其过滤的信息进行下一步的处理,以友好的方式展示出来。一般有两种
方式来处理:

将数据处理放在内核可加载模块中,即在内核空间进行处理。

将数据处理放在一个用户空间的守护进程处理。 一, .

通过简单的比较,我们可以知道,第2种方式比第1种方式更好,有以下3
点原因:

将数据处理全部放在内核可加载模块中,首先会加大内核模块中的代码量增

加,逻辑复杂,容易出错,而且难以调试。

2)在内核空间下的API功能与数目有限,不及用户空间方便,容易造成编程
的困难,而且在内核空间出错的危害性远远大于用户空间,有可能会造成系统崩
溃。

3)用户空间的守护进程可以利用现有的技术和产品,比如成熟的杀毒软件和
网络安全产品来获取更好的功能。

综合以上三点所述,我们采取了第2种方式来进行数据处理,由于数据需要
从内核空间传递到用户空间以及从用户空间传递给内核空间,这样就带来了另一

个问题,即处于内核空间的内核可加载模块与处于用户空间的进程之间的数据传
递。

2.7 LINUX下用户空间与内核空间数据交换的方式

一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空

间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机

制来实现,众所周知,进程间通信(IPC)机制就是为实现应用进程与应用进程
之间的数据交换而专门实现的,而应用进程与内核空间之间的数据交换机制与
IPC有很的的不同。LinuX系统下内核空间与应用进程进行数据交换的各种方式,

包括内核启动参数、sysfs、procfS、seq 61e、netlillk等。
1)内核启动参数【21
第二章文件系统的开发技术

“1嗽提供了一种通过boonoader向其传输启动参数的功能,内核开发者可以
通过这种方式来向内核传输数据,从而控制内核启动行为。通常的方式是:定义

一个分析参数的函数,而后使用内核提供的宏J酣巾把它注册到内核中。
2)sysfs【2】
内核子系统或设备驱动可以直接编译到内核,也可以编译成模块。如果编译
到内核,可以使用前一种介绍的方法通过内核启动参数来向他们传递参数;

如果编译成模块,则可以通过命令行在插入模块时传递参数,或者在运行时,通

过sySfs来设置或读取模块数据。Sysfs是一个基于内存的文件系统,sysfs提供了
一种把内核数据结构,它们的属性以及属性与数据结构的联系开发给用户态的方

式。用户要想使用sySfs读取和设置内核参数,仅需装载sysfs就可以通过文件操
作应用了读取和设置内核通过syS6开发给用户的各个参数。

3)proc∥
procfs,即proc文件系统,它是一种特殊的文件系统,只存在于内存中,没
有磁盘映象,而不占用外部空间,它用统一的文件系统的接口为访问内核数据的

操作提供接口,用户和应用程序可以通过proc得到系统的信息,并可以改变内核
的某些参数。它是一种比较老的用户态和内核态的数据交换方式。内核中的许多

数据都是通过procfs传递给用户态的,而且内核中的很多配置也是通过它来方便

用户设置。除了sySCn出口到/proc下的参数,proc提供的大部分内核参数都是只
读的。Proc6发展至今,已经有很多应用依赖于它,已经成为必不可少的一个组

件。应用程序可以通过读/proc文件系统中的进程信息。每个进程以一个进程号命
令的目录,该目录之下的子目录和文件都表示该进程的各种信息。在这里做一下

简要的说明。
auXv二进制文件。auxv t结构数组,包含进程执行时传递给动态链接器的初

始值。
cmdline进程启动的命令行参数。

env曲n进程使用的环境变量信息。
eXe符号链接,指向进程的可执行的二进制文件。
趔包含当前进程所有文件描述符的目录。除了系统默认打开的三个描述符的

0(标准输入)、1(标准输出)、2(标准错误)之外,就是该进程自己打开的描述符。
m锄aped baSe该文件的内容表示一个地址,即共享库被加载到内存的起始
地址。默认是o)【40000000。

n11Ilaps保存的内存映象。

29
电子科技大学硕士毕业论文

m锄进程的内存被利用的情况。用于某一应用程序在直接访问另一个应用程
序的内存。其中一种方式就是直接使用mmap()映射。
sm印s是比m印s更详细的内存映象信息。
stat进程状态,列举几个重要的字段。

pid进程(包括轻量级进程)号。
c0111In.应用程序的名字。
taSk stat进程的状态。

ppid父进程号。
utime该进程在用户态运行的时间。
stime该进程在核心态运行的时间。

priodty该进程的动态优先级。
nice该进程的静态优先级。

taSk该目录列出了进程中的所有线程(包括主线程)。每个线程目录下也有自
己的目录和文件。

用户进程,可以很方便的使用叩en()、read()等文件操作来读取这些进程相关
的信息。

4)seq』1e【2】

一般地,内核通过在procfs文件系统建立文件来向用户空间提供输出信息,

用户空间可以通过任何文本阅读应用查看该文件信息,但是profS有一个缺陷,
如果输出内容大于1个内存页,需要多次读,因此处理起来很难,另外,如果输
出太大,速度比较慢,有是会出现一些意想不到的情况。在2.4内核以及之后,

使用seq file可以向内核输出大文件信息更容易。
5)netliIlk【2】

netlink是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户
态应用使用标准的socketAPI就可以使用netlink提供的强大功能,内核态需要
使用专门的内核API来使用netliIll【。

本系统中的用户空间的模块与内核空间的内核模块既有频率高、数据量大的

日志数据交换,也有频率低、数据量小的配置数据交换,针对两种不同类型的数
据交换的特点,采取了两种传输方式:

内核空间从用户空间获取关键文件和进程信息的配置数据,采用procfs方式,
原因有下列3条:

1)proc6本身的设计就是传输少量的数据,用procfS传输配置信息。
第二章文件系统的开发技术

2)经过长期的发展,应用广泛。在GUN/I jn暇系统中已经确立了自己的地

位,即使sysfs吸取了很多/proc的教训,/proc依然长期存在。

3)proc技术成熟,提供友好的接口函数,使用方便。
用户空间从内核空间获取过滤日志信息的数据,采用mmap映射共享内存方
式。
由MFS模块在内核中获取一块共享内存,然后将该共享内存的属性,即起始

地址和长度通过procfS传递给用户空间,用户监视模块读取procfs获取起始地址
和长度,通过信息调用姗印映射到这块共享内存中。MFS模块将过滤日志写入
到这块共享内存中,用户监视模块从这块共享内存中读取日志信息。采用这种方
式有以下3个原因:

1)共享内存是最有效也是最快的礤C通信方式。

2)共享内存的效率高,一次可以传输大量数据。
3)用户空间提供了很好的函数接口支持。

2.8本章小结

本章围绕“nuX文件系统监控所需要知识和技术,重点介绍了Linu)【内核结

构框架、虚拟文件系统VFS、文件通用模型、删(Lin_11)【K锄el Module)以及
hloti~、拦截系统调用和SFS可堆叠文件系统这三种监控技术,比较并选择了SFS

做为本系统的开发技术。
VFs提供了统一的文件操作接口,隐藏了下层具体文件系统的信息,是~个

文件系统的虚拟层。而SFS是一种可堆叠的文件系统技术,跟VFS一样,也隐藏
了下层文件系统的具体信息,通过实现了自己的Ⅶode接口,与vFS的inode接

口顺序叠加,使得VFS的inode接口函数完成之后可以转发到SFs的Ⅶode接口

函数。sFS实现的文件系统挂载在VFS和下层的具体文件系统之间,从而为下层
的文件系统增加新的功能。

3l
电子科技大学硕士毕业论文

弟二早糸现阪丌
第三章系统设计

本章介绍了系统的详细设计,首先介绍了系统整体结构和数据流程,然后分
别介绍了三个子模块的设计。

3.1系统需求

基于Linux内核驱动的文件系统监控系统主要用于监控对文件的操作与记
录进程对关键文件访问的信息。该系统的需求如下:
1)用户模块设置要被监控的进程

对文件操作的主体是进程,通过设置进程的访问权限,可以达到阻止进
程访问关键文件。

2)用户模块设置关键文件的权限(读/写/执行)
针对文件的用户主、文件组、其他用户来设置权限,针对系统中的不同
用户设置不同的访问权限。

3)MFS模块过滤对关键文件的访问(读写/执行)
根据访问该关键文件的进程的权限以及该关键文件本身的访问属性,来
过滤文件操作。

4)MFS模块记录对关键文件的访问
将进程对关键文件操作的信息记录到日志中,提供数据分析。

51通信模块传递用户模块与MFS模块的交互数据。
将用户模块与MFS之间的数据交互通过合适的方式传递。

3.2系统设计

要实现在Ij删x平台下的监控功能,关键的操作是在合适的地方拦截所有对

Linu)【文件系统的操作,并且根据用户设置的过滤规则对文件操作进行过滤操作。
而本系统的核心模块MFS模块是处于内核态的,相对于用户态的开发,内核态的

开发有诸多的限制,如安全、可靠、性能等因素。因此基于Lin_11)【内核驱动的文
件系统监控设计目标:

32
第三章系统设计

1)不需要对内核和文件系统源码做出改动,在内核模式下实现高可靠性和高
性能。

2)利用内核可加载模块实现MFs模块,实现动态加载和卸载,便于在多种
平台下移植。

3)便于系统扩展,利用sFs(Stackable FilesyStem)可堆叠技术,不改变VFS
和下层文件系统的构架,只关注当前所需要增加的特性。很容易在原来的基础上
进行二次开发。

4)能够得到内核模式的保护,安全性有保证。

3.2.1系统结构

本系统共有三个子模块:MFS模块(Mollitor FileSystem)、用户模块(应用程序)
和通信模块。
用户模块的主要功能有:

1)配置进程信息控制列表。提供需要被监控的进程的相关信息,这些信息从
系统中实时获取。

2)配置关键文件权限。设置关键文件的访问属性,并通过通信模块传递给
MFS模块中。

3)日志维护。通过通信模块获取从MFS模块中得到的文件操作的日志,并
以友好的方式展示出来。
MFS模块的主要功能有:

1)获取进程控制列表。从用户模块中获取需要被监控的进程的信息,用于生
成进程访问控制hash表。

2)维护关键文件权限列表。从用户模块获取需要被监控的关键文件的信息,
用于生成文件访问控制haSh表。

3)过滤文件操作。在MFS文件系统中的各个文件操作中,根据进程和文件
访问控制hash表来过滤文件操作。

4)记录日志。记录进程对关键文件的文件操作的日志,并通过通信模块传递
给用户模块。
通信模块的主要功能有:

1)解析参数。解析用户模块发往ms模块的配置信息以及MFs模块发往用
户模块的日志数据。

33
电子科技大学硕士毕业论文

2) 向用户监视模块发送数据。通过内存映射方式向用户模块传输大量的日志

数据。

3) 向MFS模块发送数据。通过proc文件系统向MFs模块传输少量的配置

信息。
图3.3给出了系统的整体架构图。

图3-1系统架构图

关键文件控制例程:从用户空间接收配置信息,并同步更新关键文件hash列
表,提供被监控文件信息。

进程信息控制例程:从用户空间接收进程的信息,并同步更新监控进程信息
hash列表,提供被监控进程的信息。

文件操作过滤例程:过滤read()、、而teO、0pell()、ioctlO、dose()等所有文件
第三章系统设计

操作,根据用户提供的过滤信息,对有访问权限的进程访问关键文件的操作,记
录到日志中,然后操作流程转发到正常的文件操作例程;对没有访问权限的进程
访问关键文件的操作,拒绝之后返回。

关键文件表配置例程:由用户来添加、删除或修改需要被监视的关键文件属
性,并将信息传递给MFS模块。

进程信息列表例程:获取当前系统的所有进程信息,由用户选择需要监视的
进程,并将进程信息传递给MFS模块。

日志处理例程:从MFS模块获取过滤操作的日志文件,并以友好的方式展示
给用户。

proc通信例程:负责在MFS模块与用户监视模块之间传递频率小、数据量

小的配置信息。该例程从用户监视模块获取过滤信息,通过/proc文件系统传递给
MFS模块。

I姗ap通信例程:负责在MFS模块与用户模块之间传递频率高、数据量大的
日志信息。该例程从MFs模块获取日志信息,通过共享内存传递给用户监视模块。

3.2.2系统的数据流程

图3—2给出了系统的数据流程图。

35
电子科技大学硕士毕业论文

图3.2系统数据流程图

关键文件表配置例程》关键文件表控制例程:关键文件表配置例程以结构体

key 6le的形式向关键文件表控制例程发送控制命令和关键文件属性数据。
关键文件控制例程.>关键文件h础列表:关键文件控制例程以结构体
key file haSh item的形式向关键文件列表发送控制命令和关键文件属性,向关键
文件hash列表增加、删除或修改某个关键文件。

进程信息配置例程》进程信息控制例程:进程信息配置例程以结构体

process iIlfo的形式向进程信息控制例程发送控制命令和进程信息数据。
第三章系统设计

进程信息控制例程.>进程信息hash列表:进程信息控制例程以结构体

process info haSh item的形式向进程信息列表发送控制命令和进程信息,向进程

信息h砒列表增加、删除和修改某个进程的信息。
文件过滤操作.>日志队列:各个文件操作过滤例程在过滤操作完成之后,向

日志队列发送结构体log queue item的形式向日志队列中增加一条过滤操作日


志。

日志队列.>日志处理例程:日志处理例程从日志队列中以结构体

109 queue iteIIl的形式取出一条日志。

文件过滤操作.>下层文件系统例程:通过保存在MFS中的数据结构
m蠡inode、mfS deIl仃y、mfS 6】e结构体的私有数据域来获取上层文件系统(Ⅵ?S)
例程保存的i110de、den时和file对象,通过这些对象的函数跳转表,转发到下层
文件系统例程中执行,完成本次文件操作流程。

3.3用户监视模块的设计

用户空间的用户监视模块是整个系统的控制台,相当于系统的入口点和终端,
它将数据从用户模块传递到MFS模块,并从MFS模块获取日志信息。用户监视

模块的设计目标:

1)友好的界面设计,便于用户操作。
2)设计出良好的通信协议,方便与通信模块之间的特定数据格式的传输。
图3.3给出了用户模块的架构图。

图3.3用户模块架构图

37
电子科技大学硕士毕业论文

用户模块主要是向MFS模块传递需要被监控的进程和关键文件信息,并获取
由MFS模块过滤文件系统操作的日志信息。它包含三个子例程:
1)关键文件配置例程

2)日志处理例程
3)进程信息列表例程

3.3.1关键文件配置流程设计

1)由用户提供需要监控的关键文件信息,以界面友好的方式展出来。

2)通过与通信模块的接口向MFs接收命令,并将命令和关键文件信息存放

在由MFS创建的/proc文件系统中的文件中,等待通信模块proc通信例程异步通
知MFS模块来读取。

3.3.2进程信息列表例程设计

1)从系统中收集了当前正在运行的所有进程信息,以界面友好方式展示出
来。

2)用户从中选择想要监控的进程,然后通过与通信模块的接口向MFS模块

发送配置进程信息命令,并将命令和进程信息存放在由MFs创建的/proc文件系

统中的文件中,等待通信模块proc通信例程异步通知MFS模块来读取。

3.3.3日志处理例程的设计

1)当MFS的日志队列中有日志时,由通信模块的mm印通信例程异步通知
日志处理例程来读取日志数据。

2)日志处理例程从MFS创建的共享内存中读取日志信息,经过处理之后,
存放在日志缓冲区。

3)从日志缓冲区中提取日志,以友好形式展示出来,并提供查询、删除等操
作。

3.4 MFS模块的设计

基于第二章的讨论得到的结论,基于Ijnu)‘内核驱动的文件系统监控采用了
SFS(Stackable FileSyst锄)可堆叠技术。MFS(Monitor FileSystenl)是SFS的一个具
第三章系统设计

体实现。MFs模块既提供了与通信模块之间的数据传递接口,也提供了统一的文

件的函数接口来解手上层文件系统的操作和转发下层文件系统的操作。图3.4给
出了MFS模块与VFS以及下层文件系统之间的关系。

删山幽煳
,Tj,..‘-I’吁
l 用户进程

re霸哇

内核空阕 v砖rea畦

_-,,k.^--n,- ' P

o。‘1‘_‘・_-

(mon主ter fs)MJi.s VFs

镪t|3 p姻d
旺t3 lIe叠d

- r

。l —J
霄YTl

7l l
ldjsl 【‘l薯阿llead

<参 l

碰囊

图3.4基于SFS接口的MFS

MFs模块将插入在vFS和具体文件系统之间,一方面接收VFs操作例程的

调用,如体readO,另一方面在过滤操作完成之后又调用具体的文件操作
eXt3 readO。从中可以看出,MFS模块只是让文件操作多了一个监控操作,对内
核的调度而言,也就多了一个函数的调用,会在一定程度上对文件系统的性能。’
图3.5给出了MFS模块的结构图。

39
电子科技大学硕士毕业论文

图3.5 MFS模块架构图

如上图所示,MFS从用户监视模块获取监视的数据,当发生文件系统的系统

调用的时,操作流程转发到VFS通用接口,然后再转发MFS的接口,进行文件
过滤操作之后,执行流程最后转发到下层具体的文件系统操作中。

MFS的作用是在VFS和文件系统之间传递所有的函数操作和对象。相对于
VFS,MFS就是一个文件系统;而相对于文件系统,它就是一个VFS。两个角色

决定着MFS必须很小心的处理锁、引用计数、分配内存等操作。
MFS模块主要功能是获取配置信息并过滤文件系统的所有文件操作,它一共

有3个子例程:

1)关键文件控制例程
2)进程信息控制例程
3)文件过滤操作例程

3。4.1关键文件控制例程的设计

1)维护一个关键文件haSh列表,存放着关键文件的属性信息,包括文件名,
文件所属用户、用户组,文件访问权限等属性。

2)接收用户监视模块发送的配置关键文件命令
第三章系统设计

3)接收用户监视模块发送的关键文件属性数据

4)增加、删除或修改关键文件列表。

3.4.2进程信息管理例程的设计 ・:

1.)维护一个进程信息列表,存放着进程的相关属性信息,包括进程名,进程
权限,进程拥有者、进程拥有组等属性。

2)接收用户监视模块发送的配置进程信息命令。

3)接收用户监视模块发送的进程信息数据
4)增加、删除或修改进程信息列表。

3.4.3文件操作过滤例程的设计

MFs模块的文件操作过滤例程,与其他的模块相比,不仅仅是一个内核的可

加载模块,而是被设计成一个可堆叠的文件系统(Stackable FileSystem),挂载在
VFS和下层具体文件系统之间,在文件系统中实现对文件操作的过滤功能。该例
程是整个系统的关键部分,通过它来对文件系统进行过滤操作。因此它的设计目

标包括:
1)可在系统中动态加载和卸载
2、良好切呵Ⅸ和Linux平台的移植性
3)具备硬件和软件的可配置

4)良好的文件系统的监控功能
51实现异步I/O和异步通知的支持

根据以上的设计目标和需求,该例程的设计流程如下:
1)设计并实现MFS文件系统的数据对象。

2)设计并实现MFS文件系统的方法,能够保存上层文件系统(即VFS)传递
下来的数据结构,并实现过滤功能,以及过滤功能完成之后能够转发到下层的文

件系统操作流程中去。
3)将MFS注册到VFS中,让VFS能够识别该文件系统

4)将MFs挂载在系统某个具体的挂载点上,使得该文件系统能够工作。
5)MFS能够接收从VFS通用接口转发的文件系统流程,并执行MFS自己
的文件操作过滤例程。在MFS过滤例程中,对当前进程和关键文件的权限行匹配,

当该进程有权限访问关键文件的时候,将该操作记录在日志中;如果没有权限,

4l
电子科技大学硕士毕业论文

则直接拒绝操作并立即返回。

6)将日志写入到日志队列中,由通信模块异步通知用户监视模块从日志队列
中读取日志信息。

3.5通信模块的设计

通信模块是用来连接用户空间的用户监视模块和内核空间的MFs模块的。由

于用户模块是不能直接访问内核空间的信息,只能通过内核模块来处理,两者直
接必然有数据进行通信,所以说通信模块是连接应用监视模块和MFs模块的纽

带。

通信模块的设计目标:

1)设计出良好的通信协议,方便用户监视模块和MFs模块之间特定的数据

’。

结构的传输。

2)采用异步通知和异步I/O方式,快速、高效的传递数据。
通信模块有两个功能:把用户监视模块的配置数据传递给MFS模块以及把

MFS模块的日志信息反馈给用户监视模块。根据用户监视模块和MFS之间传递
数据的频率和数据量的不同,采取了两种通信方式,所以通信模块有两个子例程:

proc通信子例程和mmap通信子例程:

proc子例程从用户空间向内核空间传递频率小、数据量少的配置信息。
mmap子例程从内核空间向用户空间传递频率高、数据量大的日志信息。
图3.6给出了通信模块的结构图。

,H户模块

地1两儇状
!戳,=!=.4dt,J.^ ‘

Ⅲmp避僻7例襁 pn—锄倌予例程l
t・



m白橱《块

图3.6通信模块框架图

3.5.1 prOC通信子例程的设计

42
第三章系统设计

1)用户监视模块将配置信息传递给该子例程,子例程获取之后,对数据进行

解析,以一定的格式入/proc文件系统中。

3)异步通知MFs模块的关键文件配置例程和进程信息配置例程从/proc文件
系统中获取配置信息。

3.5.2 mmap通信子例程的设计

1)MFS模块将日志信息传递给该子例程,子例程获取之后,对数据进行一
定的解析,写入到共享内存中。

2)异步通知用户监视模块从共享内存中获取日志信息。

3.6模块之间的接口设计

3.6.1外部接口

图3.7给出了配置进程信息接口和配置关键文件信息的接口:

图3-7用户监视模块配置进程信思和配置关键文件的接口

该接口提供四个接口函数:new.上ey二且1tattro、delj(eyjile attIO、
new process.jnf0()和delJprocess_infoO,分别用来实现增加和删除关键文件属性
和进程信息的格式的结构体信息,便于向通信模块传输。该接口依赖于事件触发,
由用户发起配置操作。

3.6.2内部接口

43
电子科技大学硕士毕业论文

1)用户监视模块与通信模块之间有两个接口,图3.8给出了这两个接口。

用户监视模块调用seIld』onfigjnfo(),通过通信模块传递进程信息和关键文
件配置信息。

通信模块调用seIldjog_jnfo(),把从m6模块的共享内存中获取的日志信息
传递给用户监视模块。

send_coll矗gjnf00

∞ndjo&jhlfbO

图3.8用户监视模块与通信模块之间的接口

2)MFS模块与通信模块直接有两个接口。图3.9给出了这两个接口。

通信模块调用get_log_info()方法,接收存储在MFS模块的共享内存中的日
志信息。

MFS模块要调用get-_configjnfo()方法,获取从用户监视模块传递过来的进
程和关键文件信息。

g嚏-log_infoO

图3.9 MFs模块与通信模块之间的接口
第三章系统设计

3.7本章小结

本章主要介绍了基于“11uX内核驱动的文件系统监控的设计,设计了系统和

各个子模块的结构图,并设计了各个子模块之间的接口。
系统由用户监视模块、MFS模块和通信模块三个模块组成。用户监视模块在

用户空间提供进程和关键文件信息;MFS模块在内核空间过滤文件操作;通信模
块负责两个模块之间的数据通信。

45
电子科技大学硕士毕业论文

第四章系统实现

本章介绍了系统的具体实现,分别描述了三个子模块的核心功能的详细实现
过程。

4.1用户监视模块的实现

对当前系统所有正在运行的进程进行实时的监控,用户监视模块要获取进程

的相关的信息,如进程的映象名、用户名、CPU和内存使用情况、I/O吞吐量、
缓存等信息,同时将这些进程的信息友好的展示出用户,用户可以根据自己的需

要对展示的进程选择出需要监控的进程。用户监视模块还要给内核提供关键文件
属性的相关信息,包括文件的所有者、用户组和其他用户对改文件的访问权限。

用户监视模块需要将进程的信息和关键文件信息通过通信模块传递到MFS模块
中,而MFS需要将日志信息反馈给了用户模块。根据用户模块的具体需求,用户

模块有三个功能:进程信息展示功能、日志展示功能、配置功能。
用户模块主要由三个界面组成。第一个界面是实现信息展示功能,展示提供

给用户选择的监控的进程列表信息,提供配置功能和传输功能;第二个界面是展
示反馈给应用层的日志,提供查询、删除功能;第三个界面提供给用户进行配置

进程信息和配置关键文件属性,提供配置和传输功能。

4.1.1进程信息展示功能

该功能的展示界面由进程的映射名称、用户名、CPU和内存使用率、I/O吞
吐量、线程等系统相关的信息组成,提供给用户选择的依据。实现流程如下:

1)依次进入/proc中以数字命令的目录,该目录是以进程号为名字,其保护
的目录和文件都表示了该进程的相关属性信息。

2)在每个进程目录中分别read()操作从每个进程的的相关路径下读取exe、
cmdline、stat、smap来获取可执行文件名、参数、进程号、父进程号、静态优先
级、动态优先级和内存映象等进程信息。

3)将每个进程的信息存放在s仃um process inf0结构中,并链接到链表

process鼯info中。
第四章系统实现

4)依次从processeSjnfo中获取每个进程的信息,通过界面展示给用户使用。
由于系统的运行,进程也不断的变化,为了获得最新的数据,需要不断的读

取数据,并刷新界面中的数据。为了防止数据的不一致性和提高效率,采用每隔
10s一次性读完所有的进程信息,然后刷新界面中的数据。

4.1.2日志展示功能

该功能的展示界面由日志信息组成。记录着被监控的进程访问关键文件的操

作,包括进程号、操作类型(读/写/执行)、访问日期等相关信息。实现流程如下:

1)通过/proc文件系统的文件中读取MFS模块分配的一块共享内存地址的首
地址钮1 addr和长度sm size。

2)调用mmap()【6】映射到这块共享内存上。
3)使用rcad()【6】同步读取由MFS模块写入的日志信息。
钔将日志信息展示给用户
5.)提供查询和删除功能。

4.1.3配置功能

提供配置关键文件的功能。包括增加、修改、删除关键文件属性,然后通过

将控制命令和数据信息写入到由MFS模块创建的/proc文件中,由通信模块通知
MFs模块异步读取数据。关键文件由用户提供,通过图形界面实现配置。

1)进入MFS创建的/proc的kef file/config file文件。

2)使用、柑te()操作向config矗1e写入控制命令和数据。
3)等待MFS模块来读取配置数据。

4.2 MFS模块的实现

.MFS模块是基于Linu)【可加载模块实现的一个sFS实例,它是一个内存文件
系统【141,挂载在VFS与具体文件系统之间。mS模块有三个功能:配置关键文
件功能、配置进程信息功能、过滤文件操作功能。

4.2.1配置关键文件功能实现流程

1)调用proc_础(dir()和create_proc虹lf0即仃y0分别在/proc文件系统建立目

47
电子科技大学硕士毕业论文

录key-丘le以及下属的文件C0nfig』le。
2)通过系统调用s怼叩e110和sy蔓』ead()从/proc文件系统中获取由用户监视
模块写入的关键文件配置命令和配置信息。
3)通过获取的命令来增加、删除或修改关键文件haSh列表。

4.2.2配置进程信息功能实现流程

该功能的实现与配置关键文件功能的实现相似。

1)调用proc_IIlkd域)和create_proc-i心L饥缸y()分别在/proc文件系统建立目
录process info以及下属的文件config process。

2)通过系统调用sys_op髓O和sys-』ad()从/I)rOc文件系统中获取由用户监视
模块写入的控制命令和进程信息。

3)通过获取的控制命令来增加、删除或修改进程信息haSh列表。

4.2.3过滤文件操作功能实现流程

过滤文件操作实现是在VFS和具体文件系统之间再挂载一个文件系统,在操
作传递到具体文件系统之前先进行一次操作的过滤。具体实现是创建新的文件系
统、然后挂载到内核中。

文件系统的实现包括文件系统的数据结构和文件操作两部分,由于这部分内

容比较多,该功能的具体实现放在下一节来讲述。

4.3 MFS的数据结构实现

MFS作为一个独立的文件系统插入在VFS和具体文件系统之间,必然要实
现一个文件系统的功能,拥有自己的数据结构和方法。在Linux中每个文件系统
都拥有5个重要的数据结构,即超级块、索引节点、目录项、文件对象、虚拟内

存对象,对MFS来说也是必不可少的。而MFS的主要功能是监控,只需要搜集

相关信息,并不会修改其中的字段,所以不需要创建新的的数据结构,因此在
mfs模块的实现中可以通过包含<linu刈fs.h>就可以使用这些数据结构,而不用自
己设计新的数据结构。

MFS拥有自己的数据结构,但是为了起到“承上启下"的作用,在拥有MFS

自己的inode、d咖和file对象的同时,也必须保留ⅦS操作流程传递下来的
第四章系统实现

inode、d∞仃v和61e对象,这样在实现过滤功能之后,才能找的到返回到下层文

件系统操作的函数指针。在第二章对SFS技术讨论可知,VFS中的inode、dell仃y

和file对象都有私有数据,即inode对象的u.geIl耐c直域,den姆对象的d-.fsdata
域以及file对象的private.data域,可以用来存放从VFS传递下来的对象,在过
滤操作完成之后,再从私有数据中取出VFS层的对象,跳转到下层的文件系统的

执行流程中。
这样我们可以这样来定义MFS的对象:沿用VFS层的对象,并在MFS文件
系统中初始化这三个对象的同时,把从VFS传递下来的VFS的对象存放在MFS

对象对应的私有域中。

4.3.1 MFS的i node垒吉构

在mfS read iIlode(stmct mfS inode info,iIlode)函数中,该函数主要功能初始


化一个mS的inode对象,具体实现如下:
①用Ⅵ7S传递下来的inode对象来初始化MFS文件系统的iIlode对象,由
inode Copy attr all()函数实现,分别被Ⅵ?S的inode对象的各个属性赋值给MFS
的inode对象。
②把该Ⅵ7s的inode对象存放在MFs的iIlode对象的u.gell酣c.jp域中。即
iIlode->u.gen甜c_—jp=Vf.sjnode。

4.3.2 MFs的dentry垒吉构

49
电子科技大学硕士毕业论文

在创建一个新dell仃y结构的时候,也利用了dernry对象的d_fSdata域来存放

VFS传递下来的deIl巧对象,具体实现如下:
①用VFS传递下来的d咖对象初始化MFs的de蛐哕对象,由
dell仃y Copy-a廿Lall()函数实现,分别将Ⅵ7S的dell仃y的各个属性赋值给MFs的
d咖对象。
②把VFs的deIl缸y对象存放在MFs的den时对象的私有域中,即
derltry.>dj|Sdata=V蠡L-dent巧。

4.3.3 MFS的f i I e结构


第四章系统实现

在创建~个新的jcile结构的时候,利用file->private data来保存从VFS传递
下来的file对象,具体实现如下:

用VFS传递下来的61e对象初始化MFS的:file对象,由file』叩y_a啦—a11()
函数实现,分别将VFS的矗1e对象的各个属性赋值给MFS的file对象。

把Ⅵ?S的file对象存放在MFS的file对象的私有域中,即61e.>private data=

Vf啦!e。
虽然MFS层在具体文件系统之上,但是MFs与具体文件系统之间这些对象

的通信就象在同一层通信一样。在MFS中,并没有也不需要对这些对象做相关的

修改,也不需要存储数据,这些都交给下层的具体文件系统去实现。当MFS中调
用一个文件操作,它从前的对象中找到进入下一层文件系统的例程,然后执行,。

这些对象原封不动的从MFS传递到具体的文件系统中,因此就象在同一层操作一
样。图4.1给出了MFS与具体文件系统之间的通信。

图4—1 MFS与具体文件系统之间的通信

4.3.4 MFs数据对象存在的问题

然后以上的设计可能会导致两个问题:
1)第一个导致的额外问题必须小心的处理,即引用计数pj。在LiI嗽中,当
一个或多个对象引用某个对象的时候,m11)【提供一种引用计数来跟踪该对象被
引用的次数,允许多个多个对象共享某一个对象。这种机制经常应用于下面的场

景:简化跟踪对象的过程。一旦一个对象被创造出来,就需要记录谁拥有这个对
象,因为其所有者最终必须负责对删除这个对象。而跟踪一个对象的所有权是很

困难的,因为所有权可以从一个对象传递到另一个对象,所以通过引用计数可以
免除跟踪对象的所有权,因为当使用引用计数后,对象自己就拥有自己了,当没

有人再使用它的时候,也就是引用计数为O了,它就可以自己销毁自己,因此引
用计数是个简单的垃圾回收机制。在LiI嗽文件系统中,索引接点、目录项、文
电子科技大学硕士毕业论文

件对象等对象都有引用计数,MFS与下层的文件系统之间的对象的通信,虽然他
们是相当于在同一层之间通信,但毕竟是在两个不同的文件系统之间,一个引用

计数是无法跟着在两个文件系统中被引用的次数的。

对于引用计数问题,分别对索引节点、目录项、文件对象等对象设置两个引
用计数,其中一个是计数mS文件系统的,另外一个是原来的已经存在的引用计
数,两个引用计数用来区分在两个文件系统之间的引用次数,从而解决同步问题。
2)第二个导致的额外问题是高速缓存【191。MFS作为一个独立的文件系统,

创建并维护着自己的对象,如超级块、索引接点、目录项、文件对象等,这些对
象都是vFS传递来的独立的副本。在没有实现MFS的时候,VFS和具体的文件

系统之间拥有自己的缓存机制,可以很好的实现页缓存、块缓存、目录项缓存和
索引节点缓存。但是在实现MFS之后,MFS与vFs和具体的文件系统之间是分
开的,独立的拥有自己的对象、引用计数和内存页,这就意味着MFS必须管理和

维护这些数据。由于对MFS独立性的设计,必然可能会导致在不同层之间的缓存
的不一致。

对于高速缓存问题,根据历史经验,由于在高速缓存中通常认为上层的数据

更权威些,所以在具体的实现在,采用了上层的数据,即当写入磁盘的时候,用
MFS中的数据覆盖具体文件系统中对应的数据。

4.4 MFS的方法实现

从图2.4可以很清晰的看到文件系统中各个数据结构之间的关系,以及函数
的操作流程图。一个文件系统不仅要有数据对象还要有操作文件和文件系统的函
数。ⅧS的函数要实现如下的功能:
1)注册和注销MFS文件系统
21挂载和卸载MFS文件系统

3)过滤文件操作

下面来分析各种函数的具体实现。

4.4.1注册和注销MFS文件系统

当内核被编译时,就已经确定了可以支持那些文件系统,这些文件系统在系
统引导时,在VFS中进行注册。如果文件系统是作为内核可装载模块,即MFS

文件系统是可以在实际安装时进行注册,并在模块卸载时注销。MFS需要初始化

52
第四章系统实现

一个file-syStem t)Ipe结构然后向VFS注册。

其中n锄e字段标识文件系统的名字;f.S-nags字段标识文件系统类型标志;
get sb字段是个函数指针,该函数是在文件系统安装的时候被调用的,用来从磁

盘中读取该文件系统的超级块,生成内存中的超级块对象;kill sb字段是一个函
数指针,该函数用来终止访问该文件系统的超级块;o、Ⅳner字段标识着文件系统

模块对象。
MFS向VFS注册流程如下:

①初始化file』ySt踟l_t),pe结构,填充各个字段,如mft咖e所示。
②调用re酉st虹filesystem(&m啦ype)函数,将MFs文件系统注册到内核
的file svstems链表中,这样MFS就可以被Ⅵ7S识别。

③当卸载模块的时候,u11re百ste01esyst锄(&mfs fs咖e);就从内核中注销
MFS。

4.4.2挂载和卸载MFS文件系统

①使用mount命令把一个VFS能够识别的文件系统装载在内核中。mount命

令将调用sys mouIlt()系统调用, 由此执行一系列流程,

sys_ⅡlountO->d吖nol】11tO->get fS typeO.>…->readjupero->…等。由get佟typeO
找到我们之前注册.的MFS的mfs fs type结构。在函数read。>supero调用

t),pe中注册的mf啦蛐O函数,接着调用mfnead_pe“)函数,在此函
mfs fS

数中,将文件系统的安装点的d咖对象与MFS文件系统的挂载点对象联系起来,
从而实现文件系统的挂载。
②使用umount命令把MFs从系统中卸载。与mount命令类似,它也将调用

sys啪ount()系统调用,由此执行一系列流程,最终清除文件系统的安装点deIl仃y

53
电子科技大学硕士毕业论文

对象与MFs的挂载点对象之间的联系。

4.4.3过滤文件操作

MFS文件的操作分别对应于iIlode对象的s缸uct inode operations结构,den仃y


对象的s饥烈den缸y operations结构,file对象的s仃uct file operations结构,
address space对象的stmct address space operations结构【l】。他们构成了MFS的
大部分文件操作方法。

我们在初始化inode、dell蚵、file、inode的i』印ping对象的时候分别对这
四个字段进行赋值操作。具体实现如下:

inode对象的inode operations字段,该字段存放的是与索引节点相关的操作。

该字段是在mfs read inode()函数中初始化,当创建了一个新的inode的时候,需


要将该inode数据从磁盘读入内存,而对于MFS而言是没有磁盘映象的,它是把

VFS的inode对象赋给MFS的mode。iIlode.>i op=mfs i110de ops,并将缺省文件


操作字段也赋值,inode.>i f.op=mfS file 0ps;

deIlt巧对象的dell仃y op酬ioIlS字段,该字段存放的是与目录项相关的操作,。
该字段是在mfs 100kup()函数中初始化的,当打开一个文件的时候,需要搜索该

文件的路径的时候,从而需要初始化一个deIl竹对象。dell时>d op=

mf;—4entry』ps;
file对象的file 0peartions字段,该字段存放的是与文件相关的操作。该字段

是在mfs den仃y opeIl()函数中初始化的,从而创建一个新的file对象,它是由


m6 opeIlO打开一个文件的时候被调用的。

file一>f-op=fop啪et(inode一>Lfop),file的op字段来自于对应的inode对象。
inode对象的i mapping字段,它是页高速缓存s缸uct address space对象,该
字段存放的是对高速缓存中的页进行的操作,。该对象的address Space operatioIls

字段是在mfS read inode()函数中初始化的,当创建一个新的inode并对它进行初

始化时,对其赋值。IIlode->i』印pin哥>aJps=m咖pos;
s咖Ct inode op耐ions mfs mde ops的实现方法如表格4.1所示:

表4.1 inode的iIlode 0pe船tions对象的实现

字段 值 说明
Creae mf.s create 建立inode的操作

100kup mfUookup 搜索inode的操作


第四章系统实现

1ink mfS link 建立inode的硬链接操作

u11liIll( mfs ulmnk 取消inode的硬链接操作

symlilll( mf.s.S洲iIlk 建立inode符号链接操作

rename mfIs舰锄e 更改inode文件名操作

p咖11sslon mfIs_permission 更改inode权限操作

setattr m盘seta珩 设置inode属性操作

getattr mf.s.getattr 取得inoe属性操作


1istat竹 mfs 1istat竹 显示inode属性操作

s仃uct矗1e』perations mf.s.』1e-0ps的实现方法如表格4-2所示:

表4.2 file的file ope均tions对象的实现

字段 值 说明

1seek mfS 1seek 设置文件读写位置操作

read mf.S read 读文件操作


write mfS w打te 写文件操作

ai0 read mf.s aio read 异步读文件操作


aio、Ⅳrite n1蠡ai0 write 异步写操作
readdir mfs readdir 读目录操作
ioctl mfs iocⅡ 控制操作

mmap mfS mmap 内存映射操作

open mf.S—open 打开文件操作


nush mfS nush 刷新文件操作
lock mfs lock 锁住文件操作

s讹ct dell缸y 0peratio∞m蠡_--d锄时..opS的实现方法如表格4—3所示:


表4.3 dell缸y的den奶,-operations对象的实现

字段 值 说明

d haSh mfS d hash d咖的haSh操作


蜘nlpare mfS d compare 目录项的比较操作
d realease mfS d realease 释放目录项操作
d delete mfs d delete 删除目录项操作

疋咖Uf mfs i put 减少目录项引用数操作

55
电子科技大学硕士毕业论文

表4—4 imapping的addresS_印ace-叩erations对象的实现

字段 值 说明

wnt印age mf.S-writ印age 写页操作

readpage mf.Sjeadpage 读页操作

sync_Jage mf.S_sync-Jage 进行I/O数据的传输

wTitepages mfs writ印ages 把指定数量的所有者的

脏页写回磁盘

readpages mfiJeadpages 从磁盘中读所有者页的


链表

prepare wnte mf.Sj)r印are write 为写操作做准备


coI】姗it、Ⅳrite mf.S conlmit、Ⅳrite 完成写操作

bmap mf.SJmap 从文件块索引中获取逻


辑块号

这些方法的构成了一个文件系统的主体文件操作方法,在实现这些方法的同
时,可以添加其他的功能。MFS将其实现一个过滤的功能,如果想监控上述的某

个文件操作行为,往里面添加一个过滤的流程即可;如果不想监控某个文件操作
行为,可以不需要添加过滤操作,MFS将直接转发到下层的文件系统操作流程中
去。
第四章系统实现

mfs read()函数的实现流程如下:
获取VFS层的file对象。为了能在过滤操作之后能返回到下层的具体文件系

统,必须要获取从vFs传递下来的file对象,即10wer-file对象,而该对象是在
创建MFs的丘le对象的时候保存在file对象的pdvate』ata域中的,由

g哎Jdvate』le函数实现。
由filter operation()函数实现过滤功能。
该函数的实现流程如下:

①由filter process hash()函数以当前进程的进程号为关键字从进程信息haSh


列表中获取需要被监控进程的信息。如果存在,则说明当前进程是被监视进程。
电子科技大学硕士毕业论文

如果不存在,则返回。

②由61er』le■ash()函数以当前正在操作的文件句柄为关键字从关键文件
h础列表中获取关键文件信息。如果存在,则说明当前文件是需要被监视文件。
如果不存在,则返回。

③对比进程信息和关键文件的权限,如果进程的权限能访问关键文件,则将
访问操作记录在日志队列中。如果不允许,则返回。

④通过保存的下层对象,来调用下层具体文件系统的方法,通过

10w吐file一>£-0p一>read()方法回到下层具体文件系统的流程中,并传递给VFS的
file对象作为参数。

将过滤操作的日志信息写如日志队列中,由、砸te lo甙)函数实现。
通过诸如此类的文件操作过滤操作,实现文件系统的监控功能。

4.5通信模块的实现

通信模块在用户监视模块和MFS模块之间传递数据,包括从用户监视模块传

递给MFS模块的配置数据和MFS模块传递给用户监视模块的日志数据,所以本
模块一共有两个功能:从用户空间传递数据和从内核空间传递数据。

4.5.1从用户空间传递数据

该功能把配置信息写入到/proc文件系统【28】中,然后通知MFS模块来读取,
实现流程如下如下:

1)从用户监视模块获取配置信息,通过sent印nfigjnfo()写入到由MFS模
块通过create-pro哟l仃y()建立的/proc的一个文件中。
2)异步通知MFS模块来获取配置信息。

4.5.2从内核空间传递数据

该功能把日志信息写到共享内存中,然后通知用户监视模块来读取。实现流
程如下:

1)从MFS的日志队列中获取日志信息,通过selldjog_info()写入到由MFS
模块通过get_舶e』agesO创建的一块共享内存中。
2)异步通知用户监视模块来读。

58
第四章系统实现

4.6本章小结

本章主要介绍了基于Linux内核驱动的文件系统监控系统的具体实现。系统
分为三部分实现:用户监视模块由LINUX的提供的API实现,提供配置和展示

功能;MFs模块由LinuX内核可加载内核模块实现,实现一个文件系统,并挂载
了系统的具体文件系统之上,提供过滤文件操作系统出功能;通信模块由LIM rx
提供的API实现,提供异步I/O和异步通知的功能。

59
电子科技大学硕士毕业论文

第五章系统测试

本章主要介绍对MFS文件系统的功能和性能进行测试,首先介绍测试的环境,

然后描述对MFS的功能测试以及性能测试。

5.1测试环境

测试环境如下表5.1所示。:
表5—1测试环境

CPU intel Core2 Duo CPU T6400 2.OOGHZ

硬件环境 内存 2G

硬盘 250G SArA

操作系统 Red Hat Ente印rise Linux Server release 5.4

内核版本 2.6.18

软件环境 gcc版本 gcc VerSion 4.1.2 20080704(Red Hat 4.1.2—46)


文件系统 ext3

权限 rOOt

5.2将MFS文件系统挂载到内核中

(1)加载mfS内核模块
捕nsmod mfs.ko

该命令加载1妯模块到内核中。
(2)挂载文件系统
托ount.t mf.s.o dimome/test none/home/mf.S
该命令将MFS文件系统挂载在mome/mfS目录下,挂载点是eXt3文件系统下
的/home/test目录。

(3)查看加载结果。图5。1给出了加载之后的结果。
第五章系统测试

图5.1显示系统中所有文件系统

从图5.1可以看到,在图的最后一行的中有一个新的文件系统类型mfs挂载
在/110me/mfs目录下,挂载点是/llome/test。由图我们可以知道,MFS文件系统作

为一个被内核识别的文件系统挂载在内核中。

5.3功能测试

MFS文件系统的主要作用就是监控文件的操作以及控制非法操作。在功能测

试中,把对文件的操作进行记录;对指定的特殊文件的操作进行限制,并记录在
日志中。

5.3.1监控操作的测试

监控文件系统中对文件的操作,并记录到日志中。
以增加和删除一个在MFS文件系统挂载的/110me/mfs下的目录为例子,写一

个测试小程序来增加和删除一个目录。

6l
电子科技大学硕士毕业论文

执行命令:

撑gcc—c test.c test&&./test

杏看系统日志中的豁控结果,图5.2给出了监控结果。

图5-2显示监控结果

从图5.2中,可以查看的到,pid为3964的进程,执行命令为test,该进程用
户号是O,执行的操作分别是创建文件夹test和删除文件夹test。

5.3.2控制操作的测试

根据进程的权限以及特殊文件的安全性,来控制某些进程对需要保护的文件

进程的访问操作。
以baSh下执行Ⅵm访问MFS文件系统挂在的/110mc/m矗下的test.c为例子。

在进程的访问控制表中添加一项目,添加咖对test.c文件的访问权限为0xOoo,
设置为了禁止读/写/执行该文件,即禁止啊m对test.c文件的一切操作。
电子科技大学硕士毕业论文

我们分别在mfS和ext3文件系统上测试读了1个1KB大小的文件1024木1024

次所需要的时间,然后在读了1个1MB大小的文件1024次所需要的时间。两次
读的数据量是相同的。表5.3给出了读文件对比时间。
表5.3文件系统读文件数据测试
文件系统 读文件所需要的时间
1048576木1KB 1024幸1M
础 3.84s 5.91s

mfs 4.11s 6.03s

5.4.2写文件测试

我们分别在m自和eXt3文件系统上测试写了1个1KB大小的文件1024掌1024

次所需要的时间,然后在写了1个1MB大小的文件1024次所需要的时间。两次

写的数据量是相同的。表5-4给出了写文件的对比时间。
表5.4文件系统写文件数据测试
文件系统 写文件所需要的时间
1048576枣1KB 1024木1M
ext3 34.35s 29.12s
m矗 35.47s 30.58s

5.4.3性能测试总结

读文件的时候,由于mfS与eXte3都对读取的数据进行了缓存,所以在这两个
文件系统的读操作在性能上相差无几。

在写文件的时候,由于m蠡是堆叠在inode节点上的,而且要执行数据的拷贝,
所以与ext3相比,mfs开销的时间更多。

由上述的性能测试的结果可以看出,在性能上,mfs并不会花费很多额外的开

销,相比它提供的功能来说,这点开销完全可以忽略不计。

第五章系统测试

进程名 文件名 权限(读/写/执行)执行


Vlm teSt.C Ox000

执行命令:
撑Vim/home/mfS/test.c

查看执行结果。图5.3给出了控制结果,图5-4给出了监控结果。

图5.3显示控制结果

图5-4显示监控结果

从图5-3可以知道,Villl被禁止访问t鹤t.c文件。从图5-4可以查看,记录着
bash下执行的们m进程访问test.c文件,但是没有权限访问该文件。

5.3.3功能测试总结

从测试结果可以得出,MFS文件系统可以很好的实现了文件系统的文件操作
的监控功能和进程访问文件权限的控制功能。

5.4性能测试

由于MFs文件系统挂载在eXt3文件系统上,而eXt3作为1inuX的主流文件系 .0.-’7。
统,所以我们将eXt3作为评测mfs性能的参考标准。将对mfs和eXt3进行读、写
文件的性能测试。

5.4.1读文件测试
第六章总结与展望

第六章总结与展望

6.1总结

本文设计并实现了一个基于LinuX内核驱动的文件系统监控,用于过滤文件

系统的操作,并提供日志分析功能。其中最重要的模块MFS模块是基于
SFS(Stackable FileSystem)开发的,最主要目标是根据用户提供的关键文件列表对

这些关键文件进行实时的监控,并记录日志。用户可以根据需要选择想要进行监
控的关键文件。

MFS模块是基于“nux内核可加载模块技术,把MFS动态的加载在Linu)【

内核的vFS和具体文件系统之间,接收从VFS传递下来的文件操作流程,根据
提供的关键文件列表,在MFS模块中实现过滤操作,在过滤操作完成之后,返回

到正常的文件操作流程中。实践证明,MFS具有良好的易用性和可移植性。
虽然MFS使用基于SFS的方案是可行的,由于Ijnu】【内核的VFS子系统在

设计的时候并没有把SFS考虑在内,所以并没有给SFS提供很好的支持,因此存
在一系列相关的问题需要解决,从而可以提高MFS的可靠性和高效性。

6.1.1缓存一致性

SFs有两个缓存一致性问题:

①数据缓存一致性【9】

通常,每个文件系统维护一组页来作为页缓存,在理想情况下,所有更改的

数据都经过上层文件系统。因此,无论是上层文件的写iIlode操作或者读page操
作都将数据通过文件系统的缓存机制,通过文件系统再读或写下层的页面中(或者

是磁盘)。当数据不识别sFs的缓存机制的时候,就会直接写入到下层页面,没有
经过SFS的缓存,从而导致SFS中的数据的不一致性。

②元数据缓存数据一致性【9】
类似于页缓存,内核的索引节点缓存和目录项缓存也存在元数据不一致性问
题。

对于SFS可能存在的一致性,有两种方法来解决:
①参照NFs文件系统解决一致性的问题。NFS在使用缓存数据之前要进行相
电子科技大学硕士毕业论文

应的断言,如果断言失败,则缓存的数据无效,而其中的一个断言是对缓存的时

间进行比较,任何可能过时的缓存数据将无效。
②另一个解决方式是修改VFS和VM子系统,告知SFS上的数据被系统修

改过。要实现这种方式,要涉及维护较低的VFS对象的指向上层的指针。
想比较这两种方式,第一种方式简单、实用,而第二种方式需要修改VFS和

ⅥⅥ子系统,不适合可本系统的移植性和扩展性的要求。

6.1.2锁机制

由于SFs在执行文件操作的时候,需要锁定很多递归方式调用的VFS对象,

这可能引起潜在的死锁警告,内核的锁验证机制当发现新的加锁机制对现行的规
则不利的时候就会引起警告信息。如VFS调用vfs readdi“)以调用一个目录,采

取了muteX来实现互斥,而它可能会调用下层的SFS的sfs readdirO,而sfS readir()


也有可能调用了mutex来实现互斥,这就可能引起潜在的死锁,将引起内核锁验
证机制的警告。

解决这一问题的方式是在SFS中添加一个参数,并此向内核锁机制传递sFS
文件系统之间的层次结构关系,从而避免锁验证警告的出现。

6.1.3内核支持

SFS中存在的问题,都是因为内核的其他子系统不识别sFS导致的,在LinuX
2.6.20内核中,增加了一个新的文件fs/stack.c,它提供了很多有用的方法来帮助

SFS解决这些问题。

6.2展望

基于I,jn_11)【内核驱动的文件系统监控系统存在着不少有待改进和完善的地

方,但是由于其本身具备良好的可扩展性,可以在后续的开发中继续完善和做更
深入的研究。
随着系统技术的不断发展,文件系统的安全技术也必将得到快速的发展,相

信未来的的文件系统将集成系统监控、加密和解密、病毒检测等更多安全功能,
从而更好出保护文件系统中数据的安全。。
致谢

致谢

在毕业论文即将结束之际,向关心、教导、帮助我的老师、同学以及家人表

示深深的感谢。
首先,向我的导师左志宏教授表示由衷的感谢。在研究生二年多时间,他在

学习和科研上对我严格要求,让我的学习能力和专业知识得到了很大的提升,成
为一名合格的硕士毕业生。从论文选题、撰写到论文修改,导师都为我指定了很

好的课题研究方向和提供了大量的文献,为我提出了很好的建议,这篇论文也凝

聚了导师的汗水。导师渊博的知识、严谨治学态度、平易近人的处事方式给我留
下深刻的印象,我的成长离不开导师的教诲、鼓励和帮助。在此,向我的导师表

示最真挚的敬意!
感谢电子科技大学的李毅教授、卢显良教授等老师,他们的渊博的知识和严

谨的治学风格让我在计算机海洋中找到了兴趣。同时还要感谢课题组的巩佳知和
聂向倩同学,正是他和我一起完成了这个课题,和他们一起学习、交流让我收益

颇丰。还要感谢我的同窗们,他们让我的生活和学习丰富多彩。
感谢我的家人,他们一直用最无私的爱来关心和支持我的学业,让我安心的

学习,我才能顺利的读完研究生。
最后,再一次祝每一个关心我和帮助过我的人身体健康、工作顺利。

67
电子科技大学硕士毕业论文

参考文献

【l】 Daniel P.Bovet,M盯co Cesati.Understallding The“肌x K册e1.Th埘Edition.USA:OReilly


Media.2007:328.37 1.

【2】 Jon砒姐C0rbet舢cssaIldro Rubini,Cgrg跏all-HanIn姐.mux D州ce脯v粥.Th砌


Editllon.USA:OReilly Media..2006:2 1—234.

【3】 Ma谢ce J.Bach.ne Des啦ofme ID似0peration Syst锄.USA:Pr吼tice a11.2005:70-108.


【4】Robrt LOVe.Li肌x D如10pmeIlt.Second Edition.ClliIla MachiIle r铭s.2006:209-234.
Kc=nlele

[5】 Mel GorM锄.Underst锄ding 111e mu)‘Vmal M锄mory Manage.UsA:Pr锄tice Hall.2006:

[6】 W.砌chard St溯ls,Steph饥A.Rago.AdaIlced Pr0伊嬲uning i11 tlle UNⅨeIlVi珊m∞t.POSTS

&TELECOM PRESS.2008:289.545. .

【7] osef Sipek,Yi眦nis P甜cleous,EDez zadok.K£釉el Supp哪矗盯Stackable File Systems.

http:/^^用确r fil懿弘teIns.or:鲋ocs/sipek-0ls2007他dex.h乜n1.2007

【8】 Erez zadok.wHting Stackable FilesySteIns.h婶:/,w、棚,linuxjoumal.coIIl/缸icle/6485.2003

[9】 Erez zadok,Ion Badul骼c11.A Stackable File Syst锄IIlterface For Linllx.


http:∥、)l,、)lrw.filesystems.o礓/docs/liI瞰-stacl(in咖dex.h仃n1.
【10]Pi锄勰JuaIl,Cortes 1'oni,Garcia Jo嚣M.DualFs:A newjoumaling file syst锄谢thout
meta—data duplication.Proce甜ings of me hlt锄ational Con岛I饥ce on Supe疋锄puting,2002,p
l 37.146.

[11】E.Zadok,J.Nieh,“FiST:A L趾目lage f.0r stackable File Syst锄s”,Proceedings oftlle Annual


USENⅨTccllIlical C0n妇lce,J岫e 2000.
【12】HeideIn猢 JoIlh S,P叩ek Ge豫ld J.File-Syst锄 deVel叩mellt、析t11 stackable

layers.ACM.,Trallsaction8 0n Computcr S),Stem V1 2,Il 1,Feb,,1 994,p 58-59.

【1 3]E.zal【ol【'I.Badul骼cll,A.sheIld%“ExtI%diIlg File Syst锄s Using Stackable T即1plates”,

USENⅨConf.ereIlce Proceed:ing(Mont哟,'Califbmia),J吼e 1 999


【14】Huizinga Dorata MAm懿Cllris血e.M0bile file syst锄 跚pport谢tll咖al device

driVers.Proceeding oftlleACM syⅡlposium onApplied C鲫puting,1999,p 373—381.


【15】S、)I,if【Michad M’Bershad Bdan N,kfv),H%Dr M,InlporVing the陀liabilit)r ofc锄modit),
【16】叩er撕0ng s),st锄s.0peration Syst锄s loevi哪(ACM),V 37,n 5,SOSP’03:Procecdillgs nlc 19也
ACM S卿osi啪on op啪血g Syst锄s P血dples,2003,p 207-222.
68

You might also like