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

上传人:b****9 文档编号:25459244 上传时间:2023-06-09 格式:DOCX 页数:9 大小:72.43KB
下载 相关 举报
NFS文件系统源代码剖析.docx_第1页
第1页 / 共9页
NFS文件系统源代码剖析.docx_第2页
第2页 / 共9页
NFS文件系统源代码剖析.docx_第3页
第3页 / 共9页
NFS文件系统源代码剖析.docx_第4页
第4页 / 共9页
NFS文件系统源代码剖析.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

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

《NFS文件系统源代码剖析.docx》由会员分享,可在线阅读,更多相关《NFS文件系统源代码剖析.docx(9页珍藏版)》请在冰豆网上搜索。

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

NFS文件系统源代码剖析

窗体顶端

NFS文件系统源代码剖析

2011-03-2815:

52:

47

标签:

NFS文件系统源代码

NFS文件系统是目前最为成功的网络文件系统,在文件共享领域有着出色的表现,特别是pNFS的出现,使得NFS文件系统在性能和规模上有了大幅提升,为其带了更为广阔的应用空间。

同时,NFS之所以备受关注,还在于它在NAS存储领域的关键作用。

本文剖析了NFSv3文件系统源代码,使开发工程师,技术支持人员,特别是存储领域从业人员对NFS有更为深刻的认识。

NFS文件系统概述

NFS(NetworkFileSystem,网络文件系统)是一种基于网络的文件系统。

它可以将远端服务器文件系统的目录挂载到本地文件系统的目录上,允许用户或者应用程序像访问本地文件系统的目录结构一样,访问远端服务器文件系统的目录结构,而无需理会远端服务器文件系统和本地文件系统的具体类型,非常方便地实现了目录和文件在不同机器上进行共享。

虽然NFS不是唯一实现这个功能的文件系统,但它无疑是最成功一个。

NFS的第一个版本是SUNMicrosystems在20世纪80年代开发出来的,至今为止,NFS经历了NFS,NFSv2,NFSv3和NFSv4共四个版本。

现在,NFS最新的版本是4.1,也被称为pNFS(parallelNFS,并行网络文件系统)。

前四个版本的NFS,作为一个文件系统,它几乎具备了一个传统桌面文件系统最基本的结构特征和访问特征,不同之处在于它的数据存储于远端服务器上,而不是本地设备上,因此不存在磁盘布局的处理。

NFS需要将本地操作转换为网络操作,并在远端服务器上实现,最后返回操作的结果。

因此,NFS更像是远端服务器文件系统在本地的一个文件系统代理,用户或者应用程序通过访问文件系统代理来访问真实的文件系统。

众所周知的是,NFS的客户端在访问远端服务器文件系统时,既需要通过服务器获得文件的属性信息,还需要通过服务器获得文件的数据信息,这使得NFS天然地具备将文件的属性信息和数据信息分离在不同服务器上进行访问的特性,于是最后一个版本NFS4.1/pNFS,将Lustre/CephFS/GFS等集群文件系统的设计思想引入到自身中,成为一个具有里程碑意义的NFS版本。

它使得NFS的数据吞吐的速度和规模都得到了极大提高,为NFS的应用带了更为广阔的空间。

NFS之所以备受瞩目,除了它在文件共享领域上的优异表现外,还有一个关键原因在于它在NAS存储系统上应用。

NAS与DAS和SAN在存储领域的竞争中,NFS发挥了积极的作用,这更使得NFS越来越值得关注。

NFSv3源代码结构

相比之前的两个版本,NFSv3是一个较为稳定和成熟的NFS版本,而之后的NFSv4除了在安全和性能上有所提高外,还在网络连接中加入了状态属性,因此显得复杂一些。

在此,本文以NFSv3为例来剖析NFS文件系统的源代码结构,所用源码来自Linux2.4.9内核。

按照NFS文件系统的设计与实现,NFS文件系统主要分为三个部分:

TheProtocol(网络协议),ClientSide(NFS客户端)和ServerSide(NFS服务器)。

NFS客户端提供了接口,保证用户或者应用程序能像访问本地文件系统一样访问NFS文件系统,NFS服务器作为数据源,为NFS客户端提供真实的文件系统服务,而网络协议则使得NFS客户端和NFS服务器能够高效和可靠地进行通信。

NFS网络协议使用的是RPC(RemoteProcedureCall,远程过程调用)/XDR(ExternalDataRepresentation,外部数据表示)机制,因此本文将剖析的重点放在NFS客户端和NFS服务器上。

ClientSide源代码

ClientSide的头文件在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:

网络数据交换

与文件操作相关的系统调用都在structfile_operations,structinode_operations这两个数据结构里面定义。

文件的读操作nfs_file_read和写操作nfs_file_write被单独提出来,因为文件读写性能将直接关系到文件系统的成败,本文在后面会重点阐述其实现。

ServerSide源代码

ServerSide的头文件在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文件系统的操作转换成具体文件系统的操作

∙nfsproc.c/nfsxdr.c/nfs3proc.c/nfs3xdr.c:

网络数据交换

导出目录的访问管理主要解决网络文件系统实现面临的几个重要问题,包括目录导出服务,外部访问的权限控制,多客户端以及客户端与服务器的文件并发操作等。

一个典型例子:

rename的调用过程

在NFS文件系统的文件操作中,除了read和write操作考虑到性能因素,专门使用了缓存机制外,其它的操作基本上都是同步完成的。

本文以rename为例来进行说明,如下图所示。

首先用户或者应用程序开始调用文件操作,经过系统调用sys_rename,到达虚拟文件系统层vfs_rename,然后交给NFS文件系统nfs_rename来处理。

NFS文件系统无法操作存储介质,它调用NFS客户端函数nfs3_proc_rename和NFS服务器函数nfsd3_proc_rename进行通信,把文件操作转发到NFS服务器的虚拟文件系统层vfs_rename,最后调用具体的文件系统如ext2的函数ext2_raname,完成文件重命名。

rename调用过程

与传统文件系统相同点

在阐述NFS文件系统与传统桌面文件系统的相同点之前,我们首先简要回顾一下Linux操作系统上文件系统的体系结构。

按照Linux文件系统剖析的划分,Linux文件系统从上至下主要由虚拟文件系统层,特定文件系统层和页高速缓存层三部分组成,如下图所示。

当然,这种划分并不是一定的,例如在执行直接I/O调用时,是不需要进行页高速缓存的,另外,对于块设备的读写,进行页高速缓存之后还会有通用块层和I/O调度层的处理。

文件系统体系结构

用户或者应用程序通过统一的系统调用接口对文件系统进行操作,然后系统调用进入虚拟文件系统层,虚拟文件系统根据文件系统类型,调用特定文件系统的操作函数。

对用户和应用程序来说,由于接口完全相同,因此用户感觉不到差异,应用程序也可以无缝地移植到NFS文件系统上。

Linux通过一组对象对文件系统的操作,这组对象是superblock(超级块对象),inode(索引节点对象),dentry(目录项对象)和file(文件对象),如下图所示。

所有文件系统都支持这些对象,正是因为它们,VFS层可以对NFS和其它文件系统一视同仁,只管调用这些对象的数据和函数指针,把具体的文件系统数据布局和操作都留给特定的文件系统来完成。

VFS对象

NFS与其它文件系统一样,向内核声明和注册自己的文件系统类型。

staticDECLARE_FSTYPE(nfs_fs_type,"nfs",nfs_read_super,FS_ODD_RENAME);......module_init(init_nfs_fs)module_exit(exit_nfs_fs)

同样,NFS也需要根据自己的文件类型设置相应的文件操作函数。

如果是正规文件,需要设置inode操作函数,file操作函数,以及address_space操作函数;如果是目录文件,需要设置inode操作函数,file操作函数;如果是链接,则只需设置inode操作函数。

staticvoidnfs_fill_inode(structinode*inode,structnfs_fh*fh,structnfs_fattr*fattr){......inode->i_op=&nfs_file_inode_operations;if(S_ISREG(inode->i_mode)){inode->i_fop=&nfs_file_operations;inode->i_data.a_ops=&nfs_file_aops;}elseif(S_ISDIR(inode->i_mode)){inode->i_op=&nfs_dir_inode_operations;inode->i_fop=&nfs_dir_operations;}elseif(S_ISLNK(inode->i_mode))inode->i_op=&nfs_symlink_inode_operations;elseinit_special_inode(inode,inode->i_mode,fattr->rdev);......}

与传统文件系统不同点

与内存文件系统,闪存文件系统和磁盘文件系统这些本地文件系统最大的不同在于,NFS文件系统的数据是基于网络,而不是基于存储设备的,因此NFS文件系统在设计自己的inode和superblock数据结构,以及实现文件操作函数时,无需考虑数据布局情况。

同样是因为基于网络,NFS文件系统的权限控制和并发访问的要求比本地文件系统更高,读写的缓存机制也大大有别于本地文件系统。

superblock和inode

NFS的superblock定义

structrpc_clnt*client;/*RPC客户端句柄*/structnfs_rpc_ops*rpc_ops;/*RPC客户端函数向量表*/intflags;/*标识信息*/unsignedintrsize;/*每次读请求的最小数据量*/unsignedintrpages;/*每次读请求的最小数据量(以页为单位)*/unsignedintwsize;/*每次写请求的最小数据量*/unsignedintwpages;/*每次写请求的最小数据量(以页为单位)*/unsignedintdtsize;/*每次读目录信息的最小数据量*/unsignedintbsize;/*NFS服务器端的块大小*/unsignedintacregmin;/*正规文件在缓存中驻留的最小允许时间*/unsignedintacregmax;/*正规文件在缓存中驻留的最大允许时间*/unsignedintacdirmin;/*目录文件在缓存中驻留的最小允许时间*/unsignedintacdirmax;/*目录文件在缓存中驻留的最大允许时间*/unsignedintnamelen;/*NFS服务器端的主机名称最大长度*/char*hostname;/*NFS服务器端的主机名称*/structnfs_reqlist*rw_requests;/*异步读写请求队列信息*/

NFS的inode定义

__u64fsid;/*根目录(导出目录)信息*/__u64fileid;/*当前文件信息*/structnfs_fhfh;/*文件句柄*/......structlist_headread;/*读数据页队列*/structlist_headdirty;/*脏数据页队列*/structlist_headcommit;/*提交数据页队列*/structlist_headwriteback;/*写回数据页队列*/unsignedintnread,/*读数据页数量*/ndirty,/*脏数据页数量*/ncommit,/*提交数据页数量*/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服务器相互传递的关键参数,4个页队列用于进行读写缓存,随后两小节将分别予以介绍。

filehandle

filehandle(fh或者fhandle)在NFS客户端和NFS服务器之间相互传递,建立NFS客户端的inode和NFS服务器的inode的关联关系。

它主要表征的是NFS服务器上inode和物理设备的信息。

filehandle对于NFS客户端来说是透明的,NFS客户端不需要知道它的具体内容。

filehandle在NFS客户端的定义是66个字节,前两个字节组成一个无符号short型,表示filehandle的大小,后64个字节组成数据区,存储filehandle的内容。

#defineNFS_MAXFHSIZE64structnfs_fh{unsignedshortsize;unsignedchardata[NFS_MAXFHSIZE];};

filehandle在NFS服务器的定义由knfsd_fh数据结构表示,fh_size表示filehandle的大小,数据区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表示根目录(即导出目录)的信息存储方式,如果是0,那么从fh_auth开始前2个字节表示根目录所在设备的major号,后2个字节表示根目录所在设备的minor号,随后的4个字节表示根目录的inode索引号。

fh_fileid_type表示当前文件的信息存储方式,如果是1,那么在表示完fh_fsid后,紧接着4个字节表示当前文件的inode索引号,之后4个字节表示当前文件的inodegeneration号。

structnfs_fhbase_new{__u8fb_version;/*==1,even=>nfs_fhbase_old*/__u8fb_auth_type;__u8fb_fsid_type;__u8fb_fileid_type;__u32fb_auth[1];};

read和write

前面介绍文件系统体系结构的时候,将它分为了虚拟文件系统,特定文件系统和页高速缓存三个层次。

NFS文件系统使用了这三个层次的功能,它本身完成了特定文件系统的功能,同时既为虚拟文件系统提供了完整的调用接口,也用到了页高速缓存来提高读写性能。

就层次划分而言,与传统桌面文件系统相比,NFS文件系统的读写操作不再需要通用块层和I/O调度层,而是使用了多个列表以及相关操作来进一步缓存数据,增强读写效率。

当然NFS文件系统也不再使用存储设备驱动,而是通过网络协议来获取和提交数据。

读写缓存机制

如上图所示,NFS文件系统使用read,writeback,dirty和commit四个队列,每个队列的单元数据结构都是nfs_page,每个nfs_page都有一个page变量指向页高速缓存。

读方法nfs_readpage首先使用异步方式读取数据,如果异步方式失效,才使用同步方式,nfs_readpage_async所读的数据都进入read队列中。

写方法nfs_writepage如果写数据超过一页(缺省是4096字节),使用异步方式提交数据,否则使用同步方式。

nfs_writepage_async所写的数据首先进入writeback队列,如果数据发生更改,则进入dirty队列,如果将更改的数据提交到NFS服务器上,则进入commit队列。

这些队列或者因为超时,或者因为单元数量多于最大值,将被释放掉。

权限认证和并发锁

NFSv3版本使用nfs_permission做用户权限认证,用nfs_revalidate做文件合法性检查。

前者调用access系统调用同步完成,后者调用getattr同步完成。

为了使多个NFS客户端或者NFS客户端与NFS服务器对相同文件可以实现并发操作,NFS使用NLM(networklockmanagement,网络锁管理)协议在NFS服务器上对文件进行打开,读写和移除,使不同的访问都有及时和同一的语义理解。

总结

本文分析了NFS文件系统的设计,主要分为三个部分,NFS客户端,NFS服务器和网络协议,并阐述了三者的功能划分,介绍了它们是如何组织起来,为用户或者应用程序提供文件服务。

进一步的,本文使用Linux2.4.9内核剖析了NFSv3的源代码实现,从源代码层次说明了NFS文件系统的实现细节,重点介绍了它与传统桌面文件系统的相同和不同之处,使读者能够深入理解NFS文件系统的本质。

pNFS是NFS文件系统从桌面型文件系统到集群型文件系统的一个转折性版本,读者可自行阅读pNFS的源代码实现。

在阅读之前,推荐读者首先阅读Luster/CephFS/GFS等文件系统相关的论文和资料,以便对集群文件系统的设计架构有个基本的认识。

 

参考资料

∙查看文档“DesignandImplementationoftheSunNetworkFilesystem”,了解NFS文件系统的设计原理。

∙查看Wiki“NetworkFileSystem”,了解NFS文件系统的演变过程。

∙查看文章“Linux文件系统剖析”,了解Linux文件系统的体系结构。

∙查看文章“网络文件系统与Linux”,了解NFS文件系统在Linux中的现状。

查看书籍“understandingthelinuxkernel(3rdedition)”第12章,第18章,了解Linux虚拟文件系统,以及Ext2和Ext3文件系统的实现。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

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

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