ceph_mon.cc的main函数开始打好断点
void argv_to_vec(int argc, const char **argv,
std::vector<const char*>& args)
{
args.insert(args.end(), argv + 1, argv + argc);
}
将 argv 数组中的参数转换成 char 类型的 vector,存储在 args 指向的 vector 中。
使用了 C++ STL 中的 vector 和 insert 函数,将从 argv + 1 到 argv + argc 的参数插入到 args 数组的尾部。这里 +1 是因为第一个参数通常是程序的名称
if (ceph_argparse_flag(args_copy, i, "--mkfs", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
} else if (ceph_argparse_witharg(args_copy, i, &val, "--inject_monmap", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
} else if (ceph_argparse_witharg(args_copy, i, &val, "--extract-monmap", (char*)NULL)) {flags |= CINIT_FLAG_NO_DAEMON_ACTIONS;
}
使用了 ceph_argparse_flag 函数来判断是否出现了 "--mkfs" 参数,如果出现了,则说明要进行文件系统的创建,于是将 flags 变量的某一位设为 1,代表不需要执行守护程序操作。
当出现了 "--inject_monmap" 或 "--extract-monmap" 这两个参数时,也将 flags 变量中的某一位设置为 1,表示不需要执行守护程序操作。
// don't try to get config from mon cluster during startup flags |= CINIT_FLAG_NO_MON_CONFIG;
Ceph 初始化过程中不尝试从 MON 集群获取配置信息
->调用global_init 开始------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
->调用global_pre_init开始-----------------------------------------------------------------------------------------------------------------------------------------------
->调用common_preinit初始化一个CephContext,这里面最主要的是下面代码 开始
// Create a configuration object CephContext *cct = new CephContext(iparams.module_type, code_env, flags);
主要功能是创建各种组件实例并进行注册
如,
创建了一个 logging::Log 实例,将一个 LogObs 对象作为空间日志观察者注册到 _conf 对象中,在配置改变时接收通知并更新 logging::Log。
创建了一个 CephContextObs 对象作为 Ceph 配置观察者,
创建一个 LockdepObs 对象作为锁依赖观察者,在系统进入死锁时给出帮助信息。
创建了一个 PerfCountersCollection 对象
AdminSocket 对象(用于处理 Ceph 管理命令)并注册了一堆命令,如下图
HeartbeatMap 对象(用于处理心跳)、
PluginRegistry 对象(用于管理各种插件)
最后,调用 lookup_or_create_singleton_object 函数,用于将一个 MempoolObs 实例注册为单例对象,以观察 Ceph 系统中的内存池(mempools)使用情况。
->调用common_preinit初始化一个CephContext,这里面最主要的是下面代码 结束
int ret = conf.parse_config_files(c_str_or_null(conf_file_list),&cerr, flags);
里面主要解析配置文件的是如下代码
int
md_config_t::parse_buffer(ConfigValues& values,
const Confi