`
jiagou
  • 浏览: 2537799 次
文章分类
社区版块
存档分类
最新评论

深入理解Lustre文件系统-第8篇 基础结构支持

 
阅读更多

此节探讨关于Lustre初始化、客户端注册、OBD设备管理等多个方面。

8.1Lustre客户端注册

Lustre客户端或者Lustre Lite以名字lustre注册为一个文件系统,文件系统类型定义为:

structfile_system_type lustre_fs_type = {

.owner = THIS_MODULE,

.name = "lustre",

.get_sb = lustre_get_sb,

.kill_sb = lustre_kill_super,

.fs_flags = FS_BINRARY_MOUNTDATA |FS_REQUIRES_DEV

LL_RENAME_DOES_D_MOVE,

};

另外一个由lustre_register_fs()定义的函数只简单地调用内核函数:

returnregister_filesystem(&lustre_fs_type);

然后注册就结束了。这是当obdclass作为一个模块初始化的时候调用的。

intinit_obdclass(void) {

...

#ifdef __KERNEL__

err = lustre_register_fs()

#endif

}

查看class_obd.c里的更多细节。

8.2超级块和索引节点注册

这应该是一个相对简单的问题,但是可能是因为一些遗留的支持问题,Lustre跳过了几环(hoop)。

当Lustre Lite以一个Linux模块初始化时,init_luster_lite()在super25.c做了定义。在诸如分配索引节点高速缓存的事情中,它(本质上)将*client_fill_super设置为ll_fill_super。

在luster_fill_super()方法中,我们检查这是不是一个客户端模块。如果是,则调用(*client_fill_super)(sb),其中sb就是超级块。

8.3ODB设备

OBD设备用来在Lustre部件上提供一个抽象层,以使得能够应用一般化的操作,而不需要知道你正在处理的设备的特殊性。我们在第5节探讨了定义在其上的方法表。Lustre特提供了一些管理对象设备的一般性基础结构。核心的结构是obd_devices和exports。我们将细致地探讨它们。

每个odb设备都赋值了一个整型数,最多能在一个给定的节点上创建MAX_OBD_DEVICES个obd设备。你能够通过一个整型数(obd_minor)、名字或者uuid找回一个obd设备。在内部,所有的obd设备都存储在一个数组中。然而找回一个obd设备的最好的方式是通过下面介绍的一些API。

structobd_device *obd_devs[MAX_OBD_DEVICES]

API可以粗略地分为四类:

l注册和注销一种设备类型

l分配和释放obd设备。obd_device_alloc()、obd_device_free()。

l创建和解除obd设备。你可以通过向class_newdev()给出字符串类型和字符串名字来创建新的odb设备。你可以通过给出指向obd_device的指针来解除一个obd设备。在两种情形下,它们都在内部调用分配和释放函数。

l搜索。你可以通过class_search_type()来通过类型进行搜索

l转化工具。

8.4输入口和输出口

对于两个互相交流的OBD设备A和B,它们需要一对输入口和输出库Aimport和Bexport。Aimport用来发送请求和接受回复,而Bexport则用来接收请求和发送回复。但是,这同样的一对不可以反过来使用:即你不能通过Bexport来发送一个请求。为了实现这一点,例如在发送AST的情况下,你需要一个所谓的“反向输入口”。本质上,反向输入口将Aimport和Bexport对转化为Aexport和Bimport对。在OBD设备上创建这种对的需求在Figure11中部分地给出了。

注意图中的LOV、OSC和OST都被定义为ODB设备的一种。

本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics