BlueFs源代码分析报告

上传人:汽*** 文档编号:457427312 上传时间:2023-04-11 格式:DOCX 页数:19 大小:149.03KB
返回 下载 相关 举报
BlueFs源代码分析报告_第1页
第1页 / 共19页
BlueFs源代码分析报告_第2页
第2页 / 共19页
BlueFs源代码分析报告_第3页
第3页 / 共19页
BlueFs源代码分析报告_第4页
第4页 / 共19页
BlueFs源代码分析报告_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《BlueFs源代码分析报告》由会员分享,可在线阅读,更多相关《BlueFs源代码分析报告(19页珍藏版)》请在金锄头文库上搜索。

1、BlueFs源代码分析报告一、什么是BluefsBluefs是密歇根大学电子工程与计算机科学系的研究者们提出的一个分布式文件系统。由于移动存 储技术的发展,诸如闪存之类的存储设备的出现,让人们可以轻而易举的随身携带大量的数据。然而传 统的数据访问机制并没有考虑到移动存储的大量使用的情况,它们并不是为方便访问移动存储设备而设 计的。使用传统的分布式文件系统所提供的数据存取机制访问移动存储设备可能造成高能耗和数据访问 速度低的问题。Bluefs就是在这种状况下提出的。它让人们对移动存储设备的使用更加自由。二、主要功能首先,Bluefs首先是一个分布式文件系统,它必然有着一般分布式文件系统的共同特点

2、。它必须能 够将操作系统VFS的文件操作命令截获,然后传递给Bluefs自身进行处理。其次,它由客户机和服务器 构成。服务器用来存储数据。客户机接受从VFS截获的文件操作命令,然后进行处理;客户机在进行操 作的时候相应的文件需要从服务器获取或者提交到服务器。在Bluefs中,客户机和服务器的连接是通过 RPC协议包实现的。Bluefs的系统结构如图1所示,服务器部分未画出。对我们研究的代码来说无论是 客户机还是服务器都包含在一个软件包中,然而这并不是必须的。图1 Bluefs的系统结构其次,Bluefs又不同于以往的分布式文件系统,如NFS或者Coda。NFS只是简单的实现了上面提到 的功能。

3、Coda另外还支持无连接操作,也就是在连接不上服务器的时候本地磁盘有部分备份,可以在备 份上进行文件操作,在重新连接到服务器后进行同步。Coda还通过cache的使用提高访问速度。Coda的 这些技术都被Bluefs借鉴。然而Bluefs最大的特点是提供移动存储设备的支持,而且这也是Bluefs的 设计目的所在。因此,Bluefs文件系统功能中最有特色的部分也在于此。我们将在下面粗略的说明一下Bluefs对设备的支持功能特色。详细的说明将在后面分析代码的时候 再进行。首先,Bluefs为每个移动存储设备(其实包括服务器和本地非移动存储)提供了一个“写队 列”结构,来记录文件系统对此设备的操作。

4、这种“写队列”的应用目的在于通过异步操作提高性能, 并减少设备的状态切换从而省电。第二,读数据的时候从各个设备中找出读数据相对“性价比最高”的 设备并从中读取数据。这里,“性价比高”意味着省电并且操作时时延相对较小。这部分功能也是由 Bluefs客户机提供的。第三,enode cache结构的使用从而提高表现,防止从数据不存在的设备上读取 数据。第四,在连接新设备或者去掉一个设备的时候需要有相应的处理操作。第五,有时我们需要某些 文件必须能够存储到某个设备上去,这就是“ Affinity”。Bluefs也提供了这部分功能。数据的经常备 份复制必然产生不一致问题,怎样处理数据的不一致问题也是Bl

5、uefs必须提供的功能。Bluefs从Coda 等文件系统借鉴了 Callback机制。三、典型工作流程本节描述Bluefs的一个典型工作流程。首先,我们要做的当然是启动Bluefs 了。先启动Bluefs的服务器,然后启动客户机,它将会试图 与服务器建立一个RPC连接。连接建立以后,我们就能顺利进行各种操作了。(其实无连接状态下也是 可以操作的,但这不是Bluefs的主要功能)现在某应用程序要存储一个文件到Bluefs文件夹下(即放在Bluefs文件系统中)。首先,应用程 序要调用VFS的文件存储函数,应用程序期望VFS能够帮它完成其余的工作把文件存储到Bluefs文 件夹下。在这里,VFS

6、的操作被传递到Bluefs的kernel模块儿。而kernel模块的功能也就是接受VFS 的存储命令并把它传递给客户机(Wolverine模块)。几乎所有的处理工作都在Wolverine完成。 Wolverine负责把kernel传递过来的数据进行存储。它把数据存储命令加到各个设备(包括server)的 写队列上去。并在合适的时机执行写操作。然后,应用程序就可以在Bluefs文件夹下读取文件了。当 然,这个文件可能并不是放在Bluefs文件夹所在的文件系统的。我们甚至不知道它究竟放在哪里。但是 应用程序只需要给VFS 一个读取命令,VFS自然会告诉Bluefs kernel我们需要读取这个文件

7、,而 kernel会把这个需求告诉Wolverine,Wolverine按照自身的方案从某个设备(可能是server,与服务 器的通信是通过rpc包进行的)将文件取出,然后再经过传递送回应用程序。具体步骤参看图1。上面我们从整体上说明了 Bluefs的工作流程,下面我们将具体的分析bluefs的源代码,使我们对 bluefs文件系统有一个更清楚,详细的认识。四、源代码解析4.1代码结构Bluefs代码的结构如下所示:BluefsAdminbfs.cBarnacle_libDumb_diskcachelibDiskcache.cDumb_ptpcachelibPTPdevice.cForkerl

8、ibforker.cId3mergeLibid3merge.cMemleakLibmemleak.cMemstompLibmemstomp.cNoopLibnoop.c、Noop_pq.cRadioheadbarnacle_ops.c、Id3ops.c、Libradiohead.c、performance_pq.cSegfaultLibsegfault.cCommonConfigsDaemonBluefs_device.cCache_common.cC_lock.cDirectory.cDiskcache.cDumb-scan.cDumbcache.cEcache.cEdda.cFederat

9、e.cSentinel.cWl_diskcache.cWl_dumbcache.cWl_server.cWritelog.cDsIfEdda_if.rpc3IncludeKernelBluefs_dev.cBluefs_dirops.cBluefs_fids.cBluefs_inode.cBluefs_query.cBluefs_super.cDs_list_kernel.cDs_list_kernel_private.cMount_toolScriptsServerCache.cClient.cCreate_vol.cDevices.cDirectory.cDirops.cFileops.c

10、Main.cQuery.cRpccalls.cVolume.cWa_log.cTestMakefileBluefs的各个功能模块基本上是按照以上目录或者文件结构组织在一起的。另外,bluefs的运行仅仅 依靠bluefs自身的代码是不行的。它需要一个运行环境。Bluefs要求运行在linux内核上,并且需要rpc 协议(必需)和stmp协议(可选)的支持。Bluefs客户端和服务器交互的信息通过rpc (远程进程调 用)协议进行通讯;bluefs 一些功能的实现需要stmp电源管理的支持。4.2基本数据结构说明ds_list_t和ds_hash_t数据结构以及在它们之上的有关操作:实际上就是一

11、个普通的链表和哈希链 表的结构和操作的定义。Bluefs的一些通用数据和函数定义:如ALLOC (分配内存空间)、ASSERT (判断条件是否满足)、 MXLOCK (对互斥量加互斥锁)以及一些通用时间操作函数。EFID结构用来标记一个文件,ETYPE_类型结 构定义文件类型,EATTR结构定义文件属性,ECRED结构来确定文件所有者。edda_dirent结构描述目录 的一些额外属性。qheader、qentry结构是当文件类型为query时的有关结构。三个函数 get_sprocket_rdlck、get_sprocket_wrlck、unlock_sprocket_lck 函数分别将 s

12、procket_rwlck 进行读 锁、写锁和解锁。Bluefs的有关数据格式:这些类型的数据都是bluefs内核和设备共享的数据格式。用于bluefs kernel和edda之间的数据传输。这些数据结构包括bfs_kmsg_data、bfs_kmsg_strings、 bfs_kdwncall、 bfs_installpage、 bfs_installfids、 bfs_clearcache、 bfs_installattrs、 bfs_execcb、bfs_fedserver、bluefs_mountdata、bfs_kupcall。主要的数据传输时通过bfs_kdwncall 和bfs_

13、kupcall两个结构进行的。Writelog有关的结构和函数操作:WL_TYPE_类数据表示对文件的操作类型;定义了对文件的各种操 作,如截断、读取、存储等等。数据结构wlogentry将各种操作封装。对writelog的操作包括创建、增 加、匹配、清空等。每个设备以及服务器都有自己的writelogoIpc (进程间通信)相关结构:EDDA_MSGTYPE_类结构定义操作类型,包括mount、unmount、register、 affinity等。edda_msgbuf结构用来传输进程间通信的操作类型。在管理bluefs、对bluefs进行挂载设 备等操作时以及系统测试中使用较多。Call

14、back有关数据结构:devcb、callback_msg结构。它们的存在主要是为了保证数据一致性。 Devcb为设备持有,用于记录对象的状态。Callback_msg是edda要发送给server的,edda改变了某个 设备上的该数据,则它应该告诉其他所有相关设备也必须修改该数据。Barnacle相关:params结构中包含barnacle函数可能用到的参数;listEntry结构。BARNACLE_类型结 构定义barnacle的操作类型。对新文件文件属性的设置函数:new_file_attrs、new_symlink_attrs和new_query_attrs函数针对 文件的类型,来对新

15、建文件的文件属性进行初台设置。对目录的操作函数:create_new_dirchunk函数建立一个新目录块儿,init_dir_data初始化一个目 录块儿,read_dirchunk函数用来读目录项,is_in_dirchunk用来查找目录项,is_in_dirchunk_by_id 也用来查找目录项,add_entry_to_dirchunk和remove_entry_from_dirchunk函数分别向目录块儿中添 加和删除目录项。4.3Kernel 模块kernel模块的主要作用是截获linux的VFS (虚拟文件系统)操作,并通过upcall机制将其传递给 bluefs 的 daemon (Wolverine)。另外它还要在内存中维护一个 linux file cache。先看一下linux的VFS到底是怎么回事。Linux的文件系统主要有三大块,包括上层的文件系统调 用,VFS,以及挂载到VFS中的实际文件系统如ext2, NTFS等。可以把VFS看做文件系统管理者,它用 来管理下层各个文件系统,并向上层的文件系统调用提供通用的接口,屏蔽了低层文件系统之间的技术差异。从这个意义上来说,把VFS看做一个实际文件系统与系统调用之间的接口也未尝不可。如果我们 想要在Linux下实现一个实际文件系统的话,必须遵守VFS与实际文件系统的一些接口规则。1节点裹数据埃

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号