前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索Lustre中的OSD的初始化流程

探索Lustre中的OSD的初始化流程

作者头像
用户4700054
发布2023-02-26 14:45:05
5330
发布2023-02-26 14:45:05
举报

OSD初始化流程概览

  • OSD格式化时候制定了MDS/MGS的地址,这个地址会写入到OSD对应的磁盘中,方便后续OSD挂载时候初始化MGC/MDC
代码语言:javascript
复制
// 这里mgs/mds共享一块磁盘,mgs的总共占用的空间不会超过100M,因此没有不要单独弄一块盘来存储MGS的数据,即和MDS共享一块磁盘即可
mkfs.lustre --fsname=bigfs --reformat   --mgsnode=CentOS-Lustre-MDS@tcp0 --ost --index=1 /dev/sdb
  • OSD挂载的入口函数,入口函数制定执行mount操作内核应该执行的lustre的挂载函数来完成整个过程。当用户执行mount -t lustre /dev/sdb /lustre/ost1的时候,OSD首先进入内核的do_mount函数,这个函数是一个函数指针指向真实后端文件系统的mount函数(lustre_mount)
代码语言:javascript
复制
/***************** 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);
}
  • OSD的实际的挂载和启动的服务的实现函数在server_fill_super.核心的逻辑挂载并且读取磁盘中的信息,然后设置本地OBD同时初始化MGC以及和MDC通信的连接
代码语言:javascript
复制
// 从挂载开始,读取磁盘中的配置进行初始化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初始化细节

  • osd_start函数核心任务是要完成这几个事情,第一是从磁盘读取osd的信息(格式化时候写入到磁盘信息)进行本地obd对象的空间申请;第二是针对本地obd进行初始化OSD(挂载本地OSD同时初始化OSD的可调参数);第三是创建osd的export和import通信端。
代码语言:javascript
复制
// 函数参数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端
代码语言:javascript
复制
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.
代码语言:javascript
复制
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根节点的操作文件操作的函数表
代码语言:javascript
复制
// 函数参数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;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OSD初始化流程概览
  • OSD初始化细节
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档