论文部分内容阅读
摘要:针对用户对数据存储的性能和冗余备份等方面的具体要求,提出了基于Samba和Fuse的云存储平台。本文首先对基于Fuse的用户态文件系统做了介绍,然后针对用户的需求,研究设计Fuse文件系统下的文件分块和存储策略,最后加入用户权限认证机制,使Samba可以在运行时定位用户目录,形成用户自己的沙箱。
关键词:Fuse;用户態文件系统;文件分块存储策略;用户权限认证
一、 【分类号】:TP393.09
二、 引言
随着人类社会普遍信息化水平的提高,不同的数据成为驱动人们进行各项活动的源泉和中心。对数据的持久化存储和保护,影响着人们工作和生活的方方面面。
文件系统作为现代计算机存储和管理数据文件的工具,它的设计的合理性和功能的完善性已经越来越得到人们的重视。传统的文件系统是系统内核的重要部分,它向Linux虚拟文件系统中注册一系列的文件操作函数。当用户触发某个文件系统操作,如:打开文件,创建文件夹等,内核会根据注册在VFS上的操作函数及当前文件系统类型把他们替换成支持Ext2、NTFS、NFS等文件系统的实际函数。
实现用户态下实现的文件系统,内核中的文件系统调用全部在用户态下实现,这样开发文件系统就类似于开发普通的用户程序。
用户态下的文件系统极大的满足了开发者对文件系统的特殊要求,使得开发者可以随意的定制文件系统功能和增加文件系统的灵活性,并且便于扩展。
介于上述原因,本文设计了一个用户态文件系统客户端fuseclient,它具有一下显著特点:
1) 提供一般文件系统的所有功能,用户可以像操作Ext3文件系统一样来操作它。
2) 提供samba操作权限,可以将samba的用户目录映射到这个文件系统的根挂载点。
3) 提供完备的用户权限验证,不同的用户有不同的文件目录。
4) 提供文件系统配置接口,用户可以通过配置文件来改变文件系统的功能。
5) 提供读、写等操作的日志记录,以便用户查看操作log。
6) 提供fusedictionary和fusestorage两个目录来存放文件系统中文件的属性信息和文件中实际的数据块,为分布式存储提供基础。
本文一下章节将对这个文件系统进行讨论。
三、 FUSE框架的介绍
FUSE全称“Filesystem in Userspace”,是一个用户态的文件系统框架。Linux2.6.9以后的内核版本都默认地安装Fuse内核模块。内核模块向VFS注册FUSE文件系统(类似ext3传统文件系统),用户将文件系统挂载至FUSE上,当应用程序访问FUSE文件系统时,FUSE内核模块就将请求发送至设备/dev/fuse,FUSE用户态程序通过监听/dev/fuse来读取请求并进行处理后,将结果通过该设备发送至内核。VPS会根据文件系统类型查找已经注册了的操作函数,如果查找到且已经实现,便去调用此用户态方法执行操作,结果通过内核返回给客户应用
在应用层面上,基于fuse开发的文件系统和普通本地文件系统是一样的,支持各个层面的挂载启动。唯一和本地文件系统不同的是,作为用户态文件系统,开发者更加专注于文件系统功能的设计与实现,从而从处理文件系统模块与系统内核之间的交互中解脱出来,所以对于开发者而言,FUSE更像一个重定向器,将VPS发送至内核的请求重定向到开发者自己定义的高级函数来处理。
四、 用户态文件系统fuseclient的设计与实现
fuseclient文件系统不仅实现了一般文件系统所具有的功能,而且还增加了很多用户自定义的功能,诸如,用户权限验证,大文件碎片化存储等。但这些新功能并没有使文件系统的操作复杂化,用户或程序可以使用和操作一般文件系统一样的命令或api来对fuseclient进行操作。
3.1 文件存储模型设计
为了保证系统的吞吐量,以及为了实现文件上传下载可以断点续传,fuseclient中的文件采用分割block的形式存储。每个block的大小由文件系统的配置文件指定,比如在本地文件系统是512K的ext4,那么配置文件的block大小最好是512K的整数倍。Fuseclient有两个额外的目录来放置文件信息。
(1)、/Fusestorage目录放置分割的文件块。每个文件先通过uuid生成算法生成相应的uuid,然后根据block的大小进行分割,每个分割的名字为
UUID+block+N ( N是block的块号。)
(2)、/fusedictionary放置文件的元信息,包括文件名,文件大小,md5值,uuid值,分割块数。
这两个目录独立于fuse,挂载在本地文件系统。Fuse中只保存一个虚拟空壳文件,这个文件会硬连接到fusedictionary中相对应的元数据文件,通过解析元数据文件中的文件名,uuid,md5等信息定位真正的数据block,将block重新组合输出。
3.2用户验证模块设计
作为一个服务型文件系统,给不同的用户设置对应的根目录的重要性是显而易见的。Fuseclient通过内置的sqlite数据库查询得到不同企业不同用户响应的信息。
Kpsqlite数据库mst_user表设计:
User_infoorganize_key:标识用户所属企业ID
User_infoorganize_type:标识企业的类型,针对不同企业类型,文件系统提供不同的服务。
User_infouser_id:用户名
User_infouser_pwd:用户密码,存储格式为32位md5码。 User_infostorage_size:分配给用户的存储容量。
User_infostorage_used_size:用户已经使用的容量。
fuse通常保持对用户的透明。正因为这样,fuse开始运行后,用户对fuse的控制权变得非常有限。所以对fuse的控制和改变的timing变得局限,而kpsqlite提供了一种方式,使得系统管理员可以在fuse运行期改变文件系统结构。
Path模式:
//[organize_id:sqlite]/[user_id:sqlite]/[pass:sqlite]/myfolder
初始化:每隔一段时间(1天/1个小时/其他)会自动遍历sqlite->mst_user表,同步一次sqlite数据库来创建本地的目录结构。
用户根据自己的用户名和密码来创建samba url来创建连接,samba将path参数传递到fuseclient,fuseclient验证当前path是否存在,若存在显示myfolder下的内容,如果不存在则返回错误信息。
3.3 fuseclient配置文件设计
fuse作为用户态文件系统,用户对文件系统的细粒度配置是必备的功能。Fuseclient保证在它挂载前读取配置文件对系统进行配置。
(1)、mountpoint:指定fuse的挂载目录。如果在命令行中显式的指定目录,则忽略这项。
(2)、localdictionarydir:指定存储文件元信息的目录。
(3)、localstoragedir:指定存储文件block的目录。
(4)、fperm:指定file的初始权限值。
(5)、dperm:指定dictionary的初始权限值。
3.4 sharefolder的设计
依照用户目录权限设定,用户的sharefolder分为两个等级共享,全域共享和Organization层次共享。
全域共享将用户的目录链接到文件系统的根目录上,可见范围为所有用户,Path模式:
//[user_id:sqlite]/sharefolder/
同理,Organization層次共享链接用户目录到用户所在Organization目录下面,可见范围为同organization的用户,Path模式:
//[organize_id:sqlite]/[user_id:sqlite]/myfolder/
用户对共享的文件夹需要设置访问权限,设置的信息存放在sqlite中,每当有访问发生,先查询sqlite,给共享目录设置相应的权限。
五、 系统实验结果
fuseclient文件系统在CentOS6.4平台下,用C++实现。目前所采用的数据库系统为sqlite数据库。
将fuseclient文件系统挂载到当前系统文件系统中。对于创建和删除文件夹、创建和删除文件、文件的读写、创建删除链接文件等,fuseclient文件系统都可以做到与系统无缝结合。对于不同用户的访问权限,fuseclient也能通过事先查询sqlite,判断当前用户目录是否可以访问,过滤掉不正确的请求。
参考文献:
[1].FUSE:Filesystem in Userspace. http://fuse.sourceforge.net/.
[2] IBM.OpenAFS helps corral distributed data. developerWorks [M], 1995.
[3] Junpeng Wang .A new simulation model of fuse RF system[J] .Signals Systems and Electronics (ISSSE), 2010 International Symposium on.
[4] Rajgarhia, Aditya Gehani, Ashish. Performance and extension of user space file systems[J].Proceedings of the 2010 ACM Symposium on Applied Computing SAC 10.2010.
[5] Amann, B.Elser, B.Houri, Y.Fuhrmann. IgorFs: A Distributed P2P File System[M], Eighth International Conference, 2008.
[6] 吴一民,刘伟安. 基于FUSE的用户态文件系统设计[A] , 2008.
[7] 周强,李善平.基于Linux的用户态文件系统的设计.计算机应用与软件,2007,10期.
关键词:Fuse;用户態文件系统;文件分块存储策略;用户权限认证
一、 【分类号】:TP393.09
二、 引言
随着人类社会普遍信息化水平的提高,不同的数据成为驱动人们进行各项活动的源泉和中心。对数据的持久化存储和保护,影响着人们工作和生活的方方面面。
文件系统作为现代计算机存储和管理数据文件的工具,它的设计的合理性和功能的完善性已经越来越得到人们的重视。传统的文件系统是系统内核的重要部分,它向Linux虚拟文件系统中注册一系列的文件操作函数。当用户触发某个文件系统操作,如:打开文件,创建文件夹等,内核会根据注册在VFS上的操作函数及当前文件系统类型把他们替换成支持Ext2、NTFS、NFS等文件系统的实际函数。
实现用户态下实现的文件系统,内核中的文件系统调用全部在用户态下实现,这样开发文件系统就类似于开发普通的用户程序。
用户态下的文件系统极大的满足了开发者对文件系统的特殊要求,使得开发者可以随意的定制文件系统功能和增加文件系统的灵活性,并且便于扩展。
介于上述原因,本文设计了一个用户态文件系统客户端fuseclient,它具有一下显著特点:
1) 提供一般文件系统的所有功能,用户可以像操作Ext3文件系统一样来操作它。
2) 提供samba操作权限,可以将samba的用户目录映射到这个文件系统的根挂载点。
3) 提供完备的用户权限验证,不同的用户有不同的文件目录。
4) 提供文件系统配置接口,用户可以通过配置文件来改变文件系统的功能。
5) 提供读、写等操作的日志记录,以便用户查看操作log。
6) 提供fusedictionary和fusestorage两个目录来存放文件系统中文件的属性信息和文件中实际的数据块,为分布式存储提供基础。
本文一下章节将对这个文件系统进行讨论。
三、 FUSE框架的介绍
FUSE全称“Filesystem in Userspace”,是一个用户态的文件系统框架。Linux2.6.9以后的内核版本都默认地安装Fuse内核模块。内核模块向VFS注册FUSE文件系统(类似ext3传统文件系统),用户将文件系统挂载至FUSE上,当应用程序访问FUSE文件系统时,FUSE内核模块就将请求发送至设备/dev/fuse,FUSE用户态程序通过监听/dev/fuse来读取请求并进行处理后,将结果通过该设备发送至内核。VPS会根据文件系统类型查找已经注册了的操作函数,如果查找到且已经实现,便去调用此用户态方法执行操作,结果通过内核返回给客户应用
在应用层面上,基于fuse开发的文件系统和普通本地文件系统是一样的,支持各个层面的挂载启动。唯一和本地文件系统不同的是,作为用户态文件系统,开发者更加专注于文件系统功能的设计与实现,从而从处理文件系统模块与系统内核之间的交互中解脱出来,所以对于开发者而言,FUSE更像一个重定向器,将VPS发送至内核的请求重定向到开发者自己定义的高级函数来处理。
四、 用户态文件系统fuseclient的设计与实现
fuseclient文件系统不仅实现了一般文件系统所具有的功能,而且还增加了很多用户自定义的功能,诸如,用户权限验证,大文件碎片化存储等。但这些新功能并没有使文件系统的操作复杂化,用户或程序可以使用和操作一般文件系统一样的命令或api来对fuseclient进行操作。
3.1 文件存储模型设计
为了保证系统的吞吐量,以及为了实现文件上传下载可以断点续传,fuseclient中的文件采用分割block的形式存储。每个block的大小由文件系统的配置文件指定,比如在本地文件系统是512K的ext4,那么配置文件的block大小最好是512K的整数倍。Fuseclient有两个额外的目录来放置文件信息。
(1)、/Fusestorage目录放置分割的文件块。每个文件先通过uuid生成算法生成相应的uuid,然后根据block的大小进行分割,每个分割的名字为
UUID+block+N ( N是block的块号。)
(2)、/fusedictionary放置文件的元信息,包括文件名,文件大小,md5值,uuid值,分割块数。
这两个目录独立于fuse,挂载在本地文件系统。Fuse中只保存一个虚拟空壳文件,这个文件会硬连接到fusedictionary中相对应的元数据文件,通过解析元数据文件中的文件名,uuid,md5等信息定位真正的数据block,将block重新组合输出。
3.2用户验证模块设计
作为一个服务型文件系统,给不同的用户设置对应的根目录的重要性是显而易见的。Fuseclient通过内置的sqlite数据库查询得到不同企业不同用户响应的信息。
Kpsqlite数据库mst_user表设计:
User_infoorganize_key:标识用户所属企业ID
User_infoorganize_type:标识企业的类型,针对不同企业类型,文件系统提供不同的服务。
User_infouser_id:用户名
User_infouser_pwd:用户密码,存储格式为32位md5码。 User_infostorage_size:分配给用户的存储容量。
User_infostorage_used_size:用户已经使用的容量。
fuse通常保持对用户的透明。正因为这样,fuse开始运行后,用户对fuse的控制权变得非常有限。所以对fuse的控制和改变的timing变得局限,而kpsqlite提供了一种方式,使得系统管理员可以在fuse运行期改变文件系统结构。
Path模式:
/
初始化:每隔一段时间(1天/1个小时/其他)会自动遍历sqlite->mst_user表,同步一次sqlite数据库来创建本地的目录结构。
用户根据自己的用户名和密码来创建samba url来创建连接,samba将path参数传递到fuseclient,fuseclient验证当前path是否存在,若存在显示myfolder下的内容,如果不存在则返回错误信息。
3.3 fuseclient配置文件设计
fuse作为用户态文件系统,用户对文件系统的细粒度配置是必备的功能。Fuseclient保证在它挂载前读取配置文件对系统进行配置。
(1)、mountpoint:指定fuse的挂载目录。如果在命令行中显式的指定目录,则忽略这项。
(2)、localdictionarydir:指定存储文件元信息的目录。
(3)、localstoragedir:指定存储文件block的目录。
(4)、fperm:指定file的初始权限值。
(5)、dperm:指定dictionary的初始权限值。
3.4 sharefolder的设计
依照用户目录权限设定,用户的sharefolder分为两个等级共享,全域共享和Organization层次共享。
全域共享将用户的目录链接到文件系统的根目录上,可见范围为所有用户,Path模式:
/
同理,Organization層次共享链接用户目录到用户所在Organization目录下面,可见范围为同organization的用户,Path模式:
/
用户对共享的文件夹需要设置访问权限,设置的信息存放在sqlite中,每当有访问发生,先查询sqlite,给共享目录设置相应的权限。
五、 系统实验结果
fuseclient文件系统在CentOS6.4平台下,用C++实现。目前所采用的数据库系统为sqlite数据库。
将fuseclient文件系统挂载到当前系统文件系统中。对于创建和删除文件夹、创建和删除文件、文件的读写、创建删除链接文件等,fuseclient文件系统都可以做到与系统无缝结合。对于不同用户的访问权限,fuseclient也能通过事先查询sqlite,判断当前用户目录是否可以访问,过滤掉不正确的请求。
参考文献:
[1].FUSE:Filesystem in Userspace. http://fuse.sourceforge.net/.
[2] IBM.OpenAFS helps corral distributed data. developerWorks [M], 1995.
[3] Junpeng Wang .A new simulation model of fuse RF system[J] .Signals Systems and Electronics (ISSSE), 2010 International Symposium on.
[4] Rajgarhia, Aditya Gehani, Ashish. Performance and extension of user space file systems[J].Proceedings of the 2010 ACM Symposium on Applied Computing SAC 10.2010.
[5] Amann, B.Elser, B.Houri, Y.Fuhrmann. IgorFs: A Distributed P2P File System[M], Eighth International Conference, 2008.
[6] 吴一民,刘伟安. 基于FUSE的用户态文件系统设计[A] , 2008.
[7] 周强,李善平.基于Linux的用户态文件系统的设计.计算机应用与软件,2007,10期.