Osd基本启动过程
Osd基本启动过程:
程序入口: src/ceph_osd.cc main(),通过查询正在运行的osd得知启动命令如下:
/usr/bin/ceph-osd --cluster=ceph -i 0 -f --setuser ceph --setgroup ceph
开始进入main函数
1、argv_to_vec(argc, argv, args); 把以空格分割后的命令行参数 “--cluster=ceph -i 0 -f --setuser ceph --setgroup ceph” 放到一个vector里方便后面处理。
2、global_init.cc : global_init 全局初始化,带参数 CEPH_ENTITY_TYPE_OSD,表示本模块是osd,参数args也就是命令行参数。
2.1、由于run_pre_init为true,进入global_pre_init,解释命令行参数,调用公共代码(mon、osd、mds等模块都会用来的基础代码)初始化。
2.1.1、调用公共代码common/ceph_argparse.cc :ceph_argparse_early_args预解释命令行参数,对于只是显示版本号的命令,只把版本号打出来程序就直接可以exit(0)了;对于其他的参数,解释好后放到CephInitParameters里供后面使用。
2.2、进入common/common_init.cc : common_preinit,主要是实例化new CephContext(iparams.module_type, flags);
2.2.1、CephContext初始化时最重要的就是实例化md_config_t,md_config_t保存了osd的所有默认配置信息,主要是使用OPTION_OPT_INT,OPTION_OPT_LONGLONG等一系列的宏加上common/config_opts.h灵活实现配置字段的定义。同时CephContext实例化时还初始化了adminsocket,log等模块。
2.3、调用conf->parse_config_files读取配置文件内容,命令里不指明的话,默认使用/etc/ceph/ceph.conf。从md_config_t::parse_config_files->md_config_t::parse_config_files_impl->ConfFile::parse_file->ConfFile::load_from_buffer->ConfFile::process_line->ConfFile::normalize_key_namet得知,配置文件里这样的写法是一样的:
cluster network = 192.168.89.0/24
cluster_network = 192.168.89.0/24
- global_init完成后,开始初始化存储相关的操作了。
3.2、为ms_cluster、ms_hbclient、ms_hb_back_server、ms_hb_front_server分别创建AsyncMessenger对象,AsyncMessenger是负责网络通讯的模块,每个模块默认启动4个线程监听4个端口,使用消息队列收发信息,以后细细研究。
3.3、创建OSD实例,调用OSD::init进行一系列核心工作,包括初始化leveldb,FileStore::mount对/var/lib/ceph/osd/ceph-1 下的文件进行加载和检测
3.4、最后启动所有子线程,主线程进入wait等待状态。启动完成。
下期预告:
Ceph AsyncMessenger工作过程