1、ceph16.2.12 ceph-mon调试启动过程

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::pars
<think> 我们分析用户的问题:在不同服务器(web1、web2、web3)上执行ceph相关命令出现不同输出结果的原因。 已知信息: 1. 在web1上: - `ceph-fuse --version` 输出:ceph version 16.2.15 (618f440892089921c3e944a991122ddc44e60516) pacific (stable) - `ls /usr/lib64/ceph/` 输出:denc libceph-common.so.2 librbd (即存在这些文件) 2. 在web2、web3上: - 执行相同的命令可能没有输出(或缺少某些文件),特别是`/usr/lib64/ceph/librbd`等文件不存在。 另外,通过`rpm -qa | grep ceph-common`查询包,web1和web2、web3的输出也不同。 引用中提到的信息: 引用[2]提到:默认情况下,如果在主机上的/etc/ceph中找到ceph.conf配置文件和ceph.client.admin.keyring文件,则会将它们传递到容器环境中。同时,也提到了可以通过安装ceph-common来获得客户端工具。 原因分析: 1. 文件`/usr/lib64/ceph/`下的文件(如librbd, libceph-common.so.2等)是Ceph的客户端库,这些文件通常由`ceph-common`软件包提供。 2. 在web1上存在这些文件,说明web1已经安装了`ceph-common`或者相关客户端包。 3. 在web2和web3上缺失这些文件,说明它们没有安装`ceph-common`或者安装的版本不完整。 另外,`ceph-fuse`命令也是由某个Ceph客户端包提供的。在web1上可以运行`ceph-fuse --version`,说明web1安装了包含这个工具的包(可能是`ceph-fuse`包,也可能是`ceph-common`包包含了这个工具?)。 在CentOS/RHEL/Rocky Linux等系统中,`ceph-common`包提供了Ceph客户端库和命令行工具(包括`ceph`、`rbd`、`ceph-fuse`等)。因此,我们可以推断: - web1:安装了`ceph-common`(或`ceph-fuse`等客户端包),因此有这些文件和命令。 - web2和web3:没有安装`ceph-common`,或者安装的版本不同,或者安装后又被卸载了。 为了验证,我们可以检查`ceph-common`包的安装情况。用户已经执行了`rpm -qa | grep ceph-common`,并且发现web1和web2、web3的输出不同。这说明包安装情况确实不同。 可能的具体原因: 1. **安装方式不同**:web1可能是通过yum/dnf安装了官方发布的`ceph-common`包,而web2和web3没有安装。 2. **安装源不同**:可能web1使用了正确的Ceph仓库,而web2和web3没有配置该仓库,因此无法安装相同的包。 3. **部分安装**:可能web2和web3只安装了部分Ceph组件(如只安装了ceph-fuse,而没有安装完整的ceph-common),导致缺少某些库文件。 4. **手动编译安装**:web1上的Ceph客户端可能是通过源代码编译安装的,将库文件放在了`/usr/lib64/ceph/`目录下,而web2和web3没有进行同样的操作。 根据引用[2]的内容,还提到了一种情况:在Ceph集群的MON节点上,可能会使用容器化的方式运行Ceph,此时节点上可能不需要安装`ceph-common`,而是通过`cephadm shell`进入容器环境执行命令。但是,用户的环境似乎是普通的客户端节点(web1, web2, web3),并不是MON节点(除非它们同时是MON节点?)。而且,用户是在宿主机上执行命令,而不是在容器内。 如何验证? 1. 在web2和web3上执行: - `rpm -qa | grep ceph`:查看所有与ceph相关的包。 - 检查是否存在`ceph-common`包,以及版本是否与web1一致。 2. 如果web2和web3没有安装`ceph-common`,那么需要安装。安装方法可以参考引用[2]中提到的添加Ceph仓库然后安装。 3. 如果已经安装,但是文件缺失,可能是安装损坏,可以尝试重新安装。 4. 检查web2和web3上的`/etc/yum.repos.d/`目录下是否有Ceph的仓库配置文件(类似于引用[2]中提到的配置仓库的步骤)。 总结:根本原因在于web2和web3没有安装或没有正确安装`ceph-common`软件包。 我们可以建议用户在web2和web3上执行以下步骤: 1. 添加与web1相同的Ceph仓库(Pacfic版本仓库)。 2. 安装ceph-common包: `sudo dnf install ceph-common` 3. 验证安装后的文件是否存在。 参考引用[2]中安装ceph-common的命令和仓库配置方法。 注意:确保web2和web3能够访问相同的仓库,并且版本一致(16.2.15)。 如果用户无法确定web1的仓库配置,可以查看web1上的仓库配置文件(/etc/yum.repos.d/ceph.repo或类似文件),然后复制到web2和web3。 如果用户希望保持版本一致,可以指定版本安装: `sudo dnf install ceph-common-16.2.15` 最后,检查`ceph-fuse --version`和`ls /usr/lib64/ceph/`是否与web1一致。 相关问题: 1. 如何在不同节点上保持Ceph客户端版本一致? 2. 如何配置Ceph的yum仓库? 3. 如果安装ceph-common后仍然缺少文件,该如何处理? </think> ### Ceph 命令输出差异的原因分析 根据提供的服务器状态和引用资料,web1、web2、web3 上 Ceph 相关命令输出不同的原因如下: #### 1. **软件包安装差异(核心原因)** - **web1 状态**: - 存在 `/usr/lib64/ceph/librbd` 等文件 - `ceph-fuse --version` 正常输出 - 说明已完整安装 **ceph-common** 包(包含客户端工具和共享库) - **web2/web3 状态**: - 缺少 `/usr/lib64/ceph/` 下的关键文件 - `ceph-fuse` 命令可能无法执行或报错 - 说明 **ceph-common 未安装或安装不完整** [^2] $$ \text{文件存在性} = \begin{cases} 1 & \text{当 } \texttt{ceph-common} \geq 16.2.15 \text{ 时 (web1)} \\ 0 & \text{当 } \texttt{ceph-common} = \varnothing \text{ 时 (web2/web3)} \end{cases} $$ #### 2. **安装源配置差异** - web1 可能配置了正确的 Ceph 仓库(如引用[2]的 Pacific 仓库): ```ini [ceph-pacific] baseurl=https://download.ceph.com/rpm-pacific/el8/x86_64 ``` - web2/web3 可能: - 未配置 Ceph 官方仓库 - 使用了默认仓库(无 ceph-common- 仓库配置过期导致安装失败 #### 3. **部署方式差异** - 引用[2]显示两种客户端部署方式: - **容器化部署**(通过 `cephadm shell`):不依赖宿主机安装 - **原生安装**:依赖 `ceph-common` 包 - web1 采用原生安装,而 web2/web3 可能: - 错误尝试容器化部署但未完成配置 - 依赖了不完整的容器环境 #### 4. **文件同步问题** - Ceph 客户端文件需通过包管理器安装: ```bash /usr/lib64/ceph/{denc, libceph-common.so*, librbd*} ``` - 这些文件**不可手动复制**(有版本依赖): - 手动复制会导致库版本不匹配 - 缺少符号链接和元数据(`rpm -V ceph-common` 可验证) #### 5. **版本兼容性问题** - web1 运行 Pacific 16.2.15: $$ \text{兼容性矩阵} = \begin{bmatrix} \text{Client} & \text{Server} \\ 16.2.x & 16.2.x & \checkmark \\ 16.2.x & \text{其他版本} & \times \end{bmatrix} $$ - web2/web3 若安装其他版本会导致文件差异 --- ### 验证与解决建议 1. **检查软件包状态**: ```bash # 在所有节点执行 rpm -q ceph-common && ls -l /usr/lib64/ceph/librbd* ``` 2. **验证仓库配置**: ```bash # 比较节点仓库配置 diff /etc/yum.repos.d/ceph.repo web1:/etc/yum.repos.d/ceph.repo ``` 3. **修复 web2/web3**: ```bash # 添加 Pacific 仓库后安装 sudo dnf install -y ceph-common-16.2.15 ``` --- ### 相关问题 1. 如何验证 Ceph 客户端与服务器端的版本兼容性? 2. 使用 Ansible 管理多节点 Ceph 客户端时如何确保一致性? 3. 当 `ceph-fuse` 命令报错 "library not found" 时应如何诊断? 4. 容器化部署与原生安装 Ceph 客户端的优缺点比较? [^1]: 项目文档显示数据迁移到 Ceph FS 的操作,说明环境依赖 Ceph 客户端 [^2]: `ceph-common` 安装是获取客户端工具的标准方式 [^3]: 节点 exporter 部署说明环境采用集中化监控,需统一配置 [^4]: Ceph 集群状态显示 RGW 服务正常,客户端可连接
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值