ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:72.43KB ,
资源ID:25459244      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25459244.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NFS文件系统源代码剖析.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NFS文件系统源代码剖析.docx

1、NFS文件系统源代码剖析窗体顶端NFS文件系统源代码剖析 2011-03-28 15:52:47标签:NFS 文件系统 源代码 NFS文件系统是目前最为成功的网络文件系统,在文件共享领域有着出色的表现,特别是pNFS的出现,使得NFS文件系统在性能和规模上有了大幅提升,为其带了更为广阔的应用空间。同时,NFS之所以备受关注,还在于它在NAS存储领域的关键作用。本文剖析了NFSv3文件系统源代码,使开发工程师,技术支持人员,特别是存储领域从业人员对NFS有更为深刻的认识。NFS文件系统概述NFS(Network File System,网络文件系统)是一种基于网络的文件系统。它可以将远端服务器文

2、件系统的目录挂载到本地文件系统的目录上,允许用户或者应用程序像访问本地文件系统的目录结构一样,访问远端服务器文件系统的目录结构,而无需理会远端服务器文件系统和本地文件系统的具体类型,非常方便地实现了目录和文件在不同机器上进行共享。虽然NFS不是唯一实现这个功能的文件系统,但它无疑是最成功一个。NFS的第一个版本是SUN Microsystems在20世纪80年代开发出来的,至今为止,NFS经历了NFS,NFSv2,NFSv3和NFSv4共四个版本。现在,NFS最新的版本是4.1,也被称为pNFS(parallel NFS,并行网络文件系统)。前四个版本的NFS,作为一个文件系统,它几乎具备了一

3、个传统桌面文件系统最基本的结构特征和访问特征,不同之处在于它的数据存储于远端服务器上,而不是本地设备上,因此不存在磁盘布局的处理。NFS需要将本地操作转换为网络操作,并在远端服务器上实现,最后返回操作的结果。因此,NFS更像是远端服务器文件系统在本地的一个文件系统代理,用户或者应用程序通过访问文件系统代理来访问真实的文件系统。众所周知的是,NFS的客户端在访问远端服务器文件系统时,既需要通过服务器获得文件的属性信息,还需要通过服务器获得文件的数据信息,这使得NFS天然地具备将文件的属性信息和数据信息分离在不同服务器上进行访问的特性,于是最后一个版本NFS4.1/pNFS,将Lustre/Cep

4、hFS/GFS等集群文件系统的设计思想引入到自身中,成为一个具有里程碑意义的NFS版本。它使得NFS的数据吞吐的速度和规模都得到了极大提高,为NFS的应用带了更为广阔的空间。NFS之所以备受瞩目,除了它在文件共享领域上的优异表现外,还有一个关键原因在于它在NAS存储系统上应用。NAS与DAS和SAN在存储领域的竞争中,NFS发挥了积极的作用,这更使得NFS越来越值得关注。NFSv3源代码结构相比之前的两个版本,NFSv3是一个较为稳定和成熟的NFS版本,而之后的NFSv4除了在安全和性能上有所提高外,还在网络连接中加入了状态属性,因此显得复杂一些。在此,本文以NFSv3为例来剖析NFS文件系统

5、的源代码结构,所用源码来自Linux 2.4.9内核。按照NFS文件系统的设计与实现,NFS文件系统主要分为三个部分:The Protocol(网络协议),Client Side(NFS客户端)和Server Side(NFS服务器)。NFS客户端提供了接口,保证用户或者应用程序能像访问本地文件系统一样访问NFS文件系统,NFS服务器作为数据源,为NFS客户端提供真实的文件系统服务,而网络协议则使得NFS客户端和NFS服务器能够高效和可靠地进行通信。NFS网络协议使用的是RPC(Remote Procedure Call,远程过程调用)/XDR(External Data Representa

6、tion,外部数据表示)机制,因此本文将剖析的重点放在NFS客户端和NFS服务器上。Client Side源代码Client Side的头文件在include/linux/下面,C文件在fs/nfs下面。 dir.c/file.c/inode.c/symlink.c/unlink.c:与文件操作相关的系统调用 read.c/write.c/flushd.c:文件读写 mount_clnt.c/nfs_root.c:将NFS文件系统作为root目录的相关实现 proc.c/nfs2xdr.c/nfs3proc.c/nfs3xdr.c:网络数据交换 与文件操作相关的系统调用都在struct fil

7、e_operations,struct inode_operations这两个数据结构里面定义。文件的读操作nfs_file_read和写操作nfs_file_write被单独提出来,因为文件读写性能将直接关系到文件系统的成败,本文在后面会重点阐述其实现。Server Side源代码Server Side的头文件在include/linux/nfsd下面,C文件在fs/nfsd下面。 auth.c/lockd.c/export.c/nfsctl.c/nfscache.c/nfsfh.c/stats.c:导出目录的访问管理 nfssvc.c:NFS服务deamon的实现 vfs.c:将NFS文件

8、系统的操作转换成具体文件系统的操作 nfsproc.c/nfsxdr.c/nfs3proc.c/nfs3xdr.c:网络数据交换 导出目录的访问管理主要解决网络文件系统实现面临的几个重要问题,包括目录导出服务,外部访问的权限控制,多客户端以及客户端与服务器的文件并发操作等。一个典型例子:rename的调用过程在NFS文件系统的文件操作中,除了read和write操作考虑到性能因素,专门使用了缓存机制外,其它的操作基本上都是同步完成的。本文以rename为例来进行说明,如下图所示。首先用户或者应用程序开始调用文件操作,经过系统调用sys_rename,到达虚拟文件系统层vfs_rename,然后

9、交给NFS文件系统nfs_rename来处理。NFS文件系统无法操作存储介质,它调用NFS客户端函数nfs3_proc_rename和NFS服务器函数nfsd3_proc_rename进行通信,把文件操作转发到NFS服务器的虚拟文件系统层vfs_rename,最后调用具体的文件系统如ext2的函数ext2_raname,完成文件重命名。rename调用过程与传统文件系统相同点在阐述NFS文件系统与传统桌面文件系统的相同点之前,我们首先简要回顾一下Linux操作系统上文件系统的体系结构。按照Linux文件系统剖析的划分,Linux文件系统从上至下主要由虚拟文件系统层,特定文件系统层和页高速缓存层

10、三部分组成,如下图所示。当然,这种划分并不是一定的,例如在执行直接I/O调用时,是不需要进行页高速缓存的,另外,对于块设备的读写,进行页高速缓存之后还会有通用块层和I/O调度层的处理。文件系统体系结构用户或者应用程序通过统一的系统调用接口对文件系统进行操作,然后系统调用进入虚拟文件系统层,虚拟文件系统根据文件系统类型,调用特定文件系统的操作函数。对用户和应用程序来说,由于接口完全相同,因此用户感觉不到差异,应用程序也可以无缝地移植到NFS文件系统上。Linux通过一组对象对文件系统的操作,这组对象是superblock(超级块对象),inode(索引节点对象),dentry(目录项对象)和fi

11、le(文件对象),如下图所示。所有文件系统都支持这些对象,正是因为它们,VFS层可以对NFS和其它文件系统一视同仁,只管调用这些对象的数据和函数指针,把具体的文件系统数据布局和操作都留给特定的文件系统来完成。VFS对象NFS与其它文件系统一样,向内核声明和注册自己的文件系统类型。static DECLARE_FSTYPE(nfs_fs_type, nfs, nfs_read_super, FS_ODD_RENAME); . . module_init(init_nfs_fs) module_exit(exit_nfs_fs)同样,NFS也需要根据自己的文件类型设置相应的文件操作函数。如果是正规

12、文件,需要设置inode操作函数,file操作函数,以及address_space操作函数;如果是目录文件,需要设置inode操作函数,file操作函数;如果是链接,则只需设置inode操作函数。static void nfs_fill_inode(struct inode *inode, struct nfs_fh *fh, struct nfs_fattr *fattr) . . inode-i_op = &nfs_file_inode_operations; if (S_ISREG(inode-i_mode) inode-i_fop = &nfs_file_operations; ino

13、de-i_data.a_ops = &nfs_file_aops; else if (S_ISDIR(inode-i_mode) inode-i_op = &nfs_dir_inode_operations; inode-i_fop = &nfs_dir_operations; else if (S_ISLNK(inode-i_mode) inode-i_op = &nfs_symlink_inode_operations; else init_special_inode(inode, inode-i_mode, fattr-rdev); . . 与传统文件系统不同点与内存文件系统,闪存文件系

14、统和磁盘文件系统这些本地文件系统最大的不同在于,NFS文件系统的数据是基于网络,而不是基于存储设备的,因此NFS文件系统在设计自己的inode和superblock数据结构,以及实现文件操作函数时,无需考虑数据布局情况。同样是因为基于网络,NFS文件系统的权限控制和并发访问的要求比本地文件系统更高,读写的缓存机制也大大有别于本地文件系统。superblock和inodeNFS的superblock定义struct rpc_clnt * client; /* RPC客户端句柄 */ struct nfs_rpc_ops * rpc_ops; /* RPC客户端函数向量表 */ int flags

15、; /* 标识信息 */ unsigned int rsize; /* 每次读请求的最小数据量 */ unsigned int rpages; /* 每次读请求的最小数据量(以页为单位)*/ unsigned int wsize; /* 每次写请求的最小数据量 */ unsigned int wpages; /* 每次写请求的最小数据量(以页为单位)*/ unsigned int dtsize; /* 每次读目录信息的最小数据量 */ unsigned int bsize; /* NFS服务器端的块大小 */ unsigned int acregmin; /* 正规文件在缓存中驻留的最小允许时

16、间 */ unsigned int acregmax; /* 正规文件在缓存中驻留的最大允许时间 */ unsigned int acdirmin; /* 目录文件在缓存中驻留的最小允许时间 */ unsigned int acdirmax; /* 目录文件在缓存中驻留的最大允许时间 */ unsigned int namelen; /* NFS服务器端的主机名称最大长度 */ char * hostname; /* NFS服务器端的主机名称 */ struct nfs_reqlist * rw_requests; /* 异步读写请求队列信息 */NFS的inode定义_u64 fsid; /

17、* 根目录(导出目录)信息 */ _u64 fileid; /* 当前文件信息 */ struct nfs_fh fh; /* 文件句柄 */ . . struct list_head read; /* 读数据页队列 */ struct list_head dirty; /* 脏数据页队列 */ struct list_head commit; /* 提交数据页队列 */ struct list_head writeback; /* 写回数据页队列 */ unsigned int nread, /* 读数据页数量 */ ndirty, /* 脏数据页数量 */ ncommit, /* 提交数据

18、页数量 */ npages; /* 写回数据页数量 */ . .以上省略了superblock和inode定义的公共部分,列出的仅是NFS文件系统superblock和inode定义的私有部分,因为只有这些私有定义才能体现出文件系统的设计原则。从这些定义可以看出,私有部分数据结构里面主要包含网络连接和读写请求两个方面相关的信息。superblock里client定义了RPC协议的客户端连接状态,rpc_ops定义了RPC协议的客户端入口函数,如nfs3_proc_read,nfs3_proc_write,nfs3_proc_create等。inode里fh是NFS客户端和NFS服务器相互传递的

19、关键参数,4个页队列用于进行读写缓存,随后两小节将分别予以介绍。file handlefile handle(fh或者fhandle)在NFS客户端和NFS服务器之间相互传递,建立NFS客户端的inode和NFS服务器的inode的关联关系。它主要表征的是NFS服务器上inode和物理设备的信息。file handle对于NFS客户端来说是透明的,NFS客户端不需要知道它的具体内容。file handle在NFS客户端的定义是66个字节,前两个字节组成一个无符号short型,表示file handle的大小,后64个字节组成数据区,存储file handle的内容。#define NFS_MA

20、XFHSIZE 64 struct nfs_fh unsigned short size; unsigned char dataNFS_MAXFHSIZE; ;file handle在NFS服务器的定义由knfsd_fh数据结构表示,fh_size表示file handle的大小,数据区fh_base是一个联合体,有fh_old,fh_pad,fh_new三种定义,最大也是64个字节。考虑到当前的NFS版本是v3,只看fh_new的定义。fh_version表示fh_new定义的版本,当前版本是1。fh_auth_type表示认证方式,0表示不认证。fh_fsid_type表示根目录(即导出目

21、录)的信息存储方式,如果是0,那么从fh_auth开始前2个字节表示根目录所在设备的major号,后2个字节表示根目录所在设备的minor号,随后的4个字节表示根目录的inode索引号。fh_fileid_type表示当前文件的信息存储方式,如果是1,那么在表示完fh_fsid后,紧接着4个字节表示当前文件的inode索引号,之后4个字节表示当前文件的inode generation号。struct nfs_fhbase_new _u8 fb_version; /* = 1, even = nfs_fhbase_old */ _u8 fb_auth_type; _u8 fb_fsid_type

22、; _u8 fb_fileid_type; _u32 fb_auth1; ;read和write前面介绍文件系统体系结构的时候,将它分为了虚拟文件系统,特定文件系统和页高速缓存三个层次。NFS文件系统使用了这三个层次的功能,它本身完成了特定文件系统的功能,同时既为虚拟文件系统提供了完整的调用接口,也用到了页高速缓存来提高读写性能。就层次划分而言,与传统桌面文件系统相比,NFS文件系统的读写操作不再需要通用块层和I/O调度层,而是使用了多个列表以及相关操作来进一步缓存数据,增强读写效率。当然NFS文件系统也不再使用存储设备驱动,而是通过网络协议来获取和提交数据。读写缓存机制如上图所示,NFS文件

23、系统使用read,writeback,dirty和commit四个队列,每个队列的单元数据结构都是nfs_page,每个nfs_page都有一个page变量指向页高速缓存。读方法nfs_readpage首先使用异步方式读取数据,如果异步方式失效,才使用同步方式,nfs_readpage_async所读的数据都进入read队列中。写方法nfs_writepage如果写数据超过一页(缺省是4096字节),使用异步方式提交数据,否则使用同步方式。nfs_writepage_async所写的数据首先进入writeback队列,如果数据发生更改,则进入dirty队列,如果将更改的数据提交到NFS服务器上

24、,则进入commit队列。这些队列或者因为超时,或者因为单元数量多于最大值,将被释放掉。权限认证和并发锁NFSv3版本使用nfs_permission做用户权限认证,用nfs_revalidate做文件合法性检查。前者调用access系统调用同步完成,后者调用getattr同步完成。为了使多个NFS客户端或者NFS客户端与NFS服务器对相同文件可以实现并发操作,NFS使用NLM(network lock management,网络锁管理)协议在NFS服务器上对文件进行打开,读写和移除,使不同的访问都有及时和同一的语义理解。总结本文分析了NFS文件系统的设计,主要分为三个部分,NFS客户端,NF

25、S服务器和网络协议,并阐述了三者的功能划分,介绍了它们是如何组织起来,为用户或者应用程序提供文件服务。进一步的,本文使用Linux 2.4.9内核剖析了NFSv3的源代码实现,从源代码层次说明了NFS文件系统的实现细节,重点介绍了它与传统桌面文件系统的相同和不同之处,使读者能够深入理解NFS文件系统的本质。pNFS是NFS文件系统从桌面型文件系统到集群型文件系统的一个转折性版本,读者可自行阅读pNFS的源代码实现。在阅读之前,推荐读者首先阅读Luster/CephFS/GFS等文件系统相关的论文和资料,以便对集群文件系统的设计架构有个基本的认识。参考资料 查看文档 “Design and Implementation of the Sun Network Filesystem”,了解NFS文件系统的设计原理。 查看Wiki “Network File System”,了解NFS文件系统的演变过程。 查看文章 “Linux 文件系统剖析”,了解Linux文件系统的体系结构。 查看文章 “网络文件系统与 Linux”,了解NFS文件系统在Linux中的现状。 查看书籍 “understanding the linux kernel(3rd edition)”第12章,第18章,了解Linux虚拟文件系统,以及Ext2和Ext3文件系统的实现。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1