文章目录

  • CEPH-DISK代码逻辑
    • `Activate osd`的主要逻辑如下
    • DEF main_activate激活osd的入口函数
      • DEF mount_activate挂载临时目录,分配osd id并初始化osd
        • DEF activate 分配osd_id以及初始化osd

CEPH-DISK代码逻辑

本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描述ceph-diskactivate代码逻辑

通过main函数的子命令解析器,我这里激活osd主要那个用到的是如下解析结果

#对activate子命令进行解析,并设置参数的函数属性为main_activate
make_activate_parser(subparsers)

Activate osd的主要逻辑如下

  1. 将已经prepare且格式化好的磁盘第一分区挂载到临时目录 ,默认为/var/lib/ceph/tmp/mnt.xxx
  2. 根据/var/lib/ceph/tmp/文件夹下磁盘sdx的osd-lockbox.sdx所在行号分配该磁盘的osd id编号
  3. 初始化osd
    a. 将osd加入到monmap中,使用命令ceph --cluster ceph --name client.bootstrap-osd --keyring keyring mon getmap -o monmap
    b. 初始化osd id的集群属性以及用户组,包括ceph-osd --cluster ceph --mkfs -i osd_id --monmap monmap --osd-data path --osd-uuid fsid --seruer ceph --setgroup ceph
  4. 挂载osd对应id的目录/var/lib/ceph/osd/{cluster}-{osd_id}
  5. 启动osd进程systemctl start ceph-osd@id

DEF main_activate激活osd的入口函数

def main_activate(args):...#获取到要激活的设备路径dev = str(args.path)[5:]dev = dev[:-1]osd_prepare_lock = ("%s.%s" %(OSD_PREPARE, dev))...#该函数功能主要是以上描述中的激活osd的前三步(cluster, osd_id) = mount_activate(dev=args.path,activate_key_template=args.activate_key_template,init=args.mark_init,dmcrypt=args.dmcrypt,dmcrypt_key_dir=args.dmcrypt_key_dir,reactivate=args.reactivate,)...#启动osd进程if (not args.no_start_daemon andargs.mark_init not in (None, 'none')):start_daemon(cluster=cluster,osd_id=osd_id,)
DEF mount_activate挂载临时目录,分配osd id并初始化osd
def mount_activate(dev,activate_key_template,init,dmcrypt,dmcrypt_key_dir,reactivate=False,
):...#使用ceph-conf命令从指定的ceph.conf中获取挂载属性(一般为挂载的文件系统类型)mount_options = get_mount_options(cluster='ceph', fs_type=fstype)#使用如上步骤中获取到的挂载属性进行挂载,将第一分区挂载到临时文件目录。#该挂载的目的是为了检查磁盘是否处于deactivate的状态,并查看分区所属用户组以及权限是否正确path = mount(dev=dev, fstype=fstype, options=mount_options)...#调用函数activate进行osd id的分配并初始化osd(osd_id, cluster) = activate(path, activate_key_template, init)...#初始化osd已经成功,卸载掉临时目录,挂载osd对应id的目录`/var/lib/ceph/osd/{cluster}-{osd_id}`if active:LOG.info('%s osd.%s already mounted in position; unmounting ours.'% (cluster, osd_id))unmount(path)elif other:raise Error('another %s osd.%s already mounted in position ''(old/different cluster instance?); unmounting ours.'% (cluster, osd_id))else:move_mount(dev=dev,path=path,cluster=cluster,osd_id=osd_id,fstype=fstype,mount_options=mount_options,)
DEF activate 分配osd_id以及初始化osd
def activate(path,activate_key_template,init,
):#检查当前路径是否是osd的data分区(第一分区),否则报错check_osd_magic(path)#从临时目录下获取从集群配置文件以及密钥文件中中获取到的集群相关属性:#ceph_fsid集群唯一标识#cluster集群名称#fsid bluestore唯一标识#keyring osd的启动密钥ceph_fsid = read_one_line(path, 'ceph_fsid')if ceph_fsid is None:raise Error('No cluster uuid assigned.')LOG.debug('Cluster uuid is %s', ceph_fsid)cluster = find_cluster_by_uuid(ceph_fsid)if cluster is None:raise Error('No cluster conf found in ' + SYSCONFDIR +' with fsid %s' % ceph_fsid)LOG.debug('Cluster name is %s', cluster)fsid = read_one_line(path, 'fsid')if fsid is None:raise Error('No OSD uuid assigned.')LOG.debug('OSD uuid is %s', fsid)keyring = activate_key_template.format(cluster=cluster,statedir=STATEDIR)#先从临时目录下/var/lib/ceph/tmp/mnt.xxx 的whoami文件中获取osd idosd_id = get_osd_id(path)#获取不到,则进行创建if osd_id is None:#创建osd_id依赖 /var/lib/ceph/tmp/osd-lockbox.sdx #该文件是prepare过程中为每个磁盘分配的锁文件ceph-osd-lockbox.sdx(sdx为磁盘符号)#osd编号是直接从该锁文件读取得到,该文件是在prepare时创建的osd_id = allocate_osd_id(cluster=cluster,fsid=fsid,keyring=keyring,path=path,)write_one_line(path, 'whoami', osd_id)LOG.debug('OSD id is %s', osd_id)...#通过mkfs初始化osd,设置osd在集群中的属性:#osd加入monmap,osd的数据分区路径,osd所在的bluestore标识,osd各个分区的用户权限以及用户组权限if not os.path.exists(os.path.join(path, 'ready')):LOG.debug('Initializing OSD...')# re-running mkfs is safe, so just run until it completesmkfs(path=path,cluster=cluster,osd_id=osd_id,fsid=fsid,keyring=keyring,)#移除初始化标记,防止其他方式需要初始化osd需要打标for other in INIT_SYSTEMS:if other != init:try:os.unlink(os.path.join(path, other))except OSError:pass#向文件夹中标记activate状态为okif not os.path.exists(os.path.join(path, 'active')):write_one_line(path, 'active', 'ok')

深入理解ceph-disk activate 源码逻辑相关推荐

  1. 深入理解ceph-disk prepare 源码逻辑

    文章目录 CEPH-DISK代码逻辑 DEF MAIN: DEF PARSE_ARGS: DEF Prepare.set_subparser(subparsers) def _prepare(self ...

  2. 深入理解Tomcat和Jetty源码之第二篇servlet规范和servlet容器

    深入理解Tomcat和Jetty源码之第二篇servlet规范和servlet容器 思维导图总览 这篇推送主要讲servlet的规范和什么是servlet容器? 1.先来讲讲servlet规范: 2. ...

  3. 深入理解Tomcat和Jetty源码之第一篇前奏知识

    深入理解Tomcat和Jetty源码之第一篇前奏知识 这周开始对Tomcat和Jetty的源码和框架产生了浓厚的兴趣,接下来想记录一下学习Tomcat和Jetty源码的心得和体会,有兴趣的朋友可以关注 ...

  4. 深入理解HashMap(三): 关键源码逐行分析之构造函数

    前言 系列文章目录 上一篇我们说明了HashMap的hash算法, 说到HashMap在构造时会自动将table设为2的整数次幂. 本篇我们就来聊聊HashMap的构造函数. 本文的源码基于 jdk8 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 硬件实现原理 ADSP-EDU ...

  6. U-BOOT介绍以及disk模块源码分析

    一. BootLoader简介 在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行.一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(fir ...

  7. Ceph的Paxos源码注释 - Phase 2

    欢迎关注存储老小伙的博客. 上篇是Phase 1,即leader当选后确定PN的部分.这篇主要是Phase 2,即正常工作过程中的Propose.accept和commit过程. Ceph的paxos ...

  8. 深入理解Tomcat和Jetty源码之第四篇tomcat系统架构上:容器是如何设计的

    今天来介绍一下Tomcat的容器机制: 1.Tomcat的四种容器 2.容器示意图 3.责任链模式介绍 4.Tomcat如何确定请求是哪个Wrapper处理的 5.Tomcat的Context和ser ...

  9. 深入理解Tomcat和Jetty源码之第三篇tomcat系统架构上:连接器是如何设计的

    我们都知道Tomcat服务器是包括连接器和容器,​那他们内部具体是怎么实现的呢?今天让我们一起来学习一下~ 1.tomcat基础知识 2.tomcat和service的关系 3.tomcat的详细介绍 ...

最新文章

  1. 深入python3 (Dive Into Python 3) 在线阅读与下载
  2. LeetCode - Palindrome Number
  3. 加号(+)运算符重载
  4. 1020. Tree Traversals (25) PAT甲级真题
  5. PLSQL DBMS_DDL.ANALYZE_OBJECT
  6. 黑暗爆炸OJ 3028. 食物 生成函数
  7. 编写自定义的AssertJ断言
  8. html post前md5加密,post提交及MD5加密
  9. java 多层异常_Java多层嵌套异常处理的基本流程
  10. Yii2 使用 RESTful 写API接口 实例
  11. 使用Spring-MongoDB访问全球分布数据库Cosmos DB(2)
  12. TIOBE 5 月榜单:时隔五年,C 语言重返第一!
  13. latex 设置pdf的页边距
  14. 51nod 1134最长递增子序列
  15. 解决苹果手机连接了wifi,依旧无法更新系统的问题
  16. The full stack trace of the root cause is available in the server logs.
  17. C语言学习笔记《带你学C带你飞》P41-P61
  18. java生成二维码(底部添加文字+linux安装微软雅黑)
  19. API 的理解与使用- 键管理
  20. TASK 5 ARP Cache Poisoning

热门文章

  1. POJ 1860 Currency Exchange
  2. shellinabox安装
  3. Ubuntu下如何解压缩zip,tar,tar.gz,tar.bz2文件
  4. PHP basename() 函数
  5. 计算机基础知识综合试卷一,计算机基础知识试题及答案a
  6. evt参数是干啥用的_http连接池中非常关键的两个参数,到底是干啥用的?
  7. 多重集合的排列和组合问题
  8. linux终端中运行网银盾,Linux下使用Virtualbox安装 Windows 7 操作网银攻略
  9. vue如何配置服务器端跨域_客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解...
  10. 清华 词向量库_word2vec 构建中文词向量