// 这里mgs/mds共享一块磁盘,mgs的总共占用的空间不会超过100M,因此没有不要单独弄一块盘来存储MGS的数据,即和MDS共享一块磁盘即可
mkfs.lustre --fsname=bigfs --reformat --mgsnode=CentOS-Lustre-MDS@tcp0 --ost --index=1 /dev/sdb
mount -t lustre /dev/sdb /lustre/ost1
的时候,OSD首先进入内核的do_mount
函数,这个函数是一个函数指针指向真实后端文件系统的mount函数(lustre_mount)/***************** FS registration ******************/
static struct dentry *lustre_mount(struct file_system_type *fs_type, int flags,
const char *devname, void *data)
{
return mount_nodev(fs_type, flags, data, lustre_fill_super);
}
server_fill_super
.核心的逻辑挂载并且读取磁盘中的信息,然后设置本地OBD同时初始化MGC以及和MDC通信的连接// 从挂载开始,读取磁盘中的配置进行初始化OSD
int server_fill_super(struct super_block *sb)
{
// osd中的本地obd设置
osd_start(lsi, sb->s_flags)
// 初始化mgc
lustre_start_mgc(sb)
// osd中obd服务的设置
server_start_targets(sb)
//设定root根目录中的i_op和f_op的操作函数
server_fill_super_common(sb)
}
osd_start
函数核心任务是要完成这几个事情,第一是从磁盘读取osd的信息(格式化时候写入到磁盘信息)进行本地obd对象的空间申请;第二是针对本地obd进行初始化OSD(挂载本地OSD同时初始化OSD的可调参数);第三是创建osd的export和import通信端。// 函数参数struct lustre_sb_info *lsi, unsigned long mflags
static int osd_start(*lsi,mflags)
{
// 从磁盘读取bigfs-OST0001-osd信息并且设置
lustre_start_simple()
{
// 内核中针对bigfs-OST0001-osd对象申请
do_lcfg(...LCFG_ATTACH)
{
class_process_config(...)
{
// attach命令处理函数
class_attach(...)
{
class_newdev(...)
}
}
}
do_lcfg(...LCFG_SETUP)
{
class_process_config(...)
{
// 进入obd_process_config函数实际调用osd_process_config
obd_process_config(...)
{
// 进入osd的配置处理
osd_process_config()
{
// setup的命令的处理函数
osd_mount(...)
{
// scrub相关设置
osd_scrub_setup(...)
// osd可调的参数初始化
osd_procfs_init(...)
}
}
}
}
}
}
// 创建obd的export的通信端负责接受请求
obd_connect(...)
{
osd_obd_connect(...)
{
class_connect(...)
class_conn2export(...)
}
}
}
lustre_start_mgc
函数核心完成MGC OBD 的attatch和setup操作。attatch
是申请mgc的内核对象和导出export通信端;setup
阶段是初始化osd端mgc的import通信端、启动内核线程监听mgs的推送的配置变化apply到本地的osd端int lustre_start_mgc(struct super_block *sb)
{
// 启动mgc MGC10.211.55.16@tcp
lustre_start_simple(...LUSTRE_MGC_NAME)
{
// do_lcfg 命令是LCFG_ATTACH
class_process_config()
{
//
class_attach()
{
class_newdev()
class_new_export_self()
}
}
// do_lcfg 命令是LCFG_SETUP
class_process_config()
{
// obd_setup中实际调用的是mgc_setup
obd_setup()
{
mgc_setup()
{
// osd中客户端的设置,这里核心是设置mgc的import通信端
client_obd_setup(obd, lcfg)
// lustre端mgc的log初始化
mgc_llog_init(NULL, obd)
{
llog_setup(...)
}
// mgc可调参数初始化
mgc_tunables_init(obd)
{
sptlrpc_lprocfs_cliobd_attach(...)
}
//启动内核线程运行mgc_requeue_thread来监听mgs端推送的配置变化
kthread_run(...,mgc_requeue_thread)
}
}
}
}
obd_connect(...)
{
class_connect(...)
}
}
server_start_targets
的核心任务是设置osd端的mgc以及从mgs端获取配置初始化osd的obd stack;其次启动lwp
的obd用来发送quota和查询fld.static int server_start_targets(struct super_block *sb)
{
// 启动osd的oss服务
lustre_start_simple(...LUSTRE_OSS_OBDNAME"_uuid")
{
// 创建oss的OBD
class_process_config()
{
class_attach()
{
class_newdev()
}
}
// 设置oss的OBD
class_process_config()
{
// obd_setup
class_setup()
{
// obd_setup()核心调用的是ost_setup
ost_setup()
{
// ost create service初始化
ost->ost_create_service = ptlrpc_register_service(...);
// ost的IO服务初始化
ost->ost_io_service = ptlrpc_register_service(...);
// sequence服务初始
ost->ost_seq_service =ptlrpc_register_service(...);
// ost out服务初始化
ost->ost_out_service = ptlrpc_register_service(&svc_conf,
&obd->obd_kset,
obd->obd_debugfs_entry);
}
}
}
}
// osd端mgc的设置
server_mgc_set_fs(...)
{
// obd_set_info_async()实际调用的是mgc_set_info_async
mgc_set_info_async()
}
// osd端注册mgc服务
server_register_target(...)
{
obd_set_info_async(...)
{
mgc_set_info_async()
{
mgc_target_register(exp, mti)
}
}
}
// 之前步骤已经把mgc初始化完毕,等待接受来自mgs的配置
// 从mgs端获取获取nodemap、params、 bigfs-OST0001、bigfs-client 读取数据解析log来初始化osd.这里是根据osd自身的obd stack来初始化。 读取配置后再本地的OST上保存一份
lustre_process_log(...)
// 初始化bigfs-MDT0000-lwp-OST0001的obd,用来ost和mds进行通信,这个obd核心用来发送osd的quota和查询fld
lustre_start_lwp(...)
}
server_fill_super_common
函数设置超级快中的s_op和root
根节点的操作文件操作的函数表
// 函数参数struct super_block *sb
static int server_fill_super_common(*sb)
{
struct inode *root = NULL;
sb->s_op = &server_ops;
root = new_inode(sb);
root->i_mode = S_IFDIR;
root->i_op = &server_inode_operations;
root->i_fop = &server_file_operations;
}