global_pre_init

预初始化函数,解析ceph.conf配置文件, 初始化定义global_context 和 config的全局变量.

全局预初始化函数

CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS  默认DAEMON ,相对于下面的选项而言,一般会采用这个.

CINIT_FLAG_NO_DEFAULT_CONFIG_FILE 不去读config_file

CINIT_FLAG_NO_CLOSE_STDERR   不关闭stderr

CINIT_FLAG_NO_DAEMON_ACTIONS :

不生成/var/run/ceph 和  不打印banner .

CINIT_FLAG_DEFER_DROP_PRIVILEGES 设置RGW 使用者.uid gid

启动类型:

#define CEPH_ENTITY_TYPE_MON    0x01   :   Monitor

#define CEPH_ENTITY_TYPE_MDS    0x02   :    MDS

#define CEPH_ENTITY_TYPE_OSD    0x04    :    OSD

#define CEPH_ENTITY_TYPE_CLIENT 0x08     :    CLIENT ,RGW网关

#define CEPH_ENTITY_TYPE_AUTH   0x20    : 认证授权类型

#define CEPH_ENTITY_TYPE_ANY    0xFF

CODE_ENVIRONMENT_UTILITY = 0,   工具

CODE_ENVIRONMENT_DAEMON = 1,  DAEMON

CODE_ENVIRONMENT_LIBRARY = 2,    库

CODE_ENVIRONMENT_UTILITY_NODOUT = 3, 工具类型没有stderr的输出

在该函数中进行了配置文件的解析,这是ceph的配置解析模块。整体读取配置文件,然后按照行进行解析。

global_init

初始化函数

作用:

初始化启动模式.

if (g_ceph_context->get_init_flags() != flags) {

g_ceph_context->set_init_flags(flags);

}

错误信号集处理器加载。

int siglist[] = { SIGPIPE, 0 };

block_signals(siglist, NULL);

退出时清空log

if (g_conf->log_flush_on_exit)

g_ceph_context->_log->set_flush_on_exit();

如果不是root用户,如果setuser和setgroup配置了,则将其置为””

// consider --setuser root a no-op, even if we're not root

if (getuid() != 0) {

if (g_conf->setuser.length()) {

cerr << "ignoring --setuser " << g_conf->setuser << " since I am not root"

<< std::endl;

g_conf->set_val("setuser", "", false, false);

}

if (g_conf->setgroup.length()) {

cerr << "ignoring --setgroup " << g_conf->setgroup

<< " since I am not root" << std::endl;

g_conf->set_val("setgroup", "", false, false);

}

}

设置run_dir的权限755

if (g_conf->run_dir.length() &&

code_env == CODE_ENVIRONMENT_DAEMON &&

!(flags & CINIT_FLAG_NO_DAEMON_ACTIONS)) {

int r = ::mkdir(g_conf->run_dir.c_str(), 0755);

if (r < 0 && errno != EEXIST) {

r = -errno;

cerr << "warning: unable to create " << g_conf->run_dir << ": " << cpp_strerror(r) << std::endl;

}

}

设置Assert中cct.

register_assert_context(g_ceph_context);

设置用户对run_dir的权限

if ((flags & CINIT_FLAG_DEFER_DROP_PRIVILEGES) &&

(g_ceph_context->get_set_uid() || g_ceph_context->get_set_gid())) {

// Fix ownership on log files and run directories if needed.

// Admin socket files are chown()'d during the common init path _after_

// the service thread has been started. This is sadly a bit of a hack :(

chown_path(g_conf->run_dir,

g_ceph_context->get_set_uid(),

g_ceph_context->get_set_gid(),

g_ceph_context->get_set_uid_string(),

g_ceph_context->get_set_gid_string());

g_ceph_context->_log->chown_log_file(

g_ceph_context->get_set_uid(),

g_ceph_context->get_set_gid());

}

内存泄漏检测

// test leak checking

if (g_conf->debug_deliberately_leak_memory) {

derr << "deliberately leaking some memory" << dendl;

char *s = new char[1234567];

(void)s;

// cppcheck-suppress memleak

}

打印banner

if (code_env == CODE_ENVIRONMENT_DAEMON && !(flags & CINIT_FLAG_NO_DAEMON_ACTIONS))

output_ceph_version();

common_init_finish函数

void common_init_finish(CephContext *cct)

{

cct->init_crypto();

//初始化压缩库

//如果不是CINIT_FLAG_NO_DAEMON_ACTIONS 启动service线程。

int flags = cct->get_init_flags(); 主要epoll接收外部的socket信号。

if (!(flags & CINIT_FLAG_NO_DAEMON_ACTIONS))

cct->start_service_thread();

if ((flags & CINIT_FLAG_DEFER_DROP_PRIVILEGES) &&

(cct->get_set_uid() || cct->get_set_gid())) {

cct->get_admin_socket()->chown(cct->get_set_uid(), cct->get_set_gid());

}

}

start_service_thread

说明:

Service_thread 启动一些服务类线程,比如:socket_admin线程和RGWAsyncRadosProcessor 和AsyncCompressor::compressor_tp线程等等。

ceph 初始化函数解析的更多相关文章

  1. java中main函数解析(转载)

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  2. driver_register()函数解析

    driver_register()函数解析 /** * driver_register - register driver with bus * @drv: driver to register *  ...

  3. 第3阶段——内核启动分析之start_kernel初始化函数(5)

    内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...

  4. java中main函数解析

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  5. C语言指定初始化器解析及其应用

    指定初始化器的概念 C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同.但是在新标准 C99 中,增加了一个新的特性:指定初始化器.利用该特性可以初始化指定的 ...

  6. c语言中的c语言中realloc()函数解析

    c语言中realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚. realloc(void *__ptr, size_t ...

  7. 大括号之谜:C++的列表初始化语法解析

    有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过. struct S { int x; int y; }; int main() { int a1[3]{1, ...

  8. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

  9. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

随机推荐

  1. Python开发【第八篇】: 网络编程

    内容概要 楔子 软件开发架构 网络基础 套接字(socket) 粘包 socketserver模块 一. 楔子 现在有两个python文件a.py和b.py,分别运行,这两个程序之间需要传递一个数据, ...

  2. 就是要让你彻底学会 @Bean 注解

    @Bean 注解全解析 随着SpringBoot的流行,基于注解式开发的热潮逐渐覆盖了基于XML纯配置的开发,而作为Spring中最核心的bean当然也能够使用注解的方式进行表示.所以本篇就来详细的讨 ...

  3. 页面的隐藏或显示:hidden与visibilityState

    我们在很多地方都需要判断用户是不是在当前页面,如果离开了当前页面我们需要捕捉到并进行一些操作. 例如:当视频处于播放状态时,我们需要判断用户是不是在当前页面以继续播放,如果离开了我们需要暂停播放. 有 ...

  4. css3系列之弹性盒子 flex

    弹性盒子(伸缩盒) 注意,本篇会很长,非常长, 因为弹性盒子的知识点比较多 搜索 弹性盒子的属性  ctrl + F   如果觉得图太小, ctrl + +键 设置弹性盒子的属性: display:f ...

  5. 微信小程序 textarea 层级过高的解决方式

    建立一个新的textarea 组件代替原生textarea ,废话不多说,上代码 <template> <view class="ui-textarea"> ...

  6. 网页学习:day1

    初始准备: Write some function Write a titie Write a article Write some button Button function写法: functio ...

  7. 深度解密Go语言之channel

    目录 并发模型 并发与并行 什么是 CSP 什么是 channel channel 实现 CSP 为什么要 channel channel 实现原理 数据结构 创建 接收 发送 关闭 channel ...

  8. linux 反弹shell

    Linux下反弹shell笔记 0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或 ...

  9. 为什么一直玩A股的股民转战去玩港美股了?港美股系统搭建!

    今天先聊一下,为什么买港美股?不买 A 股? 1.A 股散户太多,港股美股机构居多. A 股市场,散户占据了70%以上交易份额,散户太多有什么坏处?少量的机构和大户很容易坐庄操控股价.A 股几乎所有票 ...

  10. C#中的Contains与IndexOf的区别

     C#中要判断一个字符串是否包含另一个字符串,常用的两种方法是 str.Contains和str.IndexOf 这两个方法的区别是: Contains是找指定字符串是否包含一个字串,返回值的bo ...