深入理解ceph-disk activate 源码逻辑
生活随笔
收集整理的這篇文章主要介紹了
深入理解ceph-disk activate 源码逻辑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 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-disk的activate代碼邏輯
通過main函數的子命令解析器,我這里激活osd主要那個用到的是如下解析結果
#對activate子命令進行解析,并設置參數的函數屬性為main_activate
make_activate_parser(subparsers)
Activate osd的主要邏輯如下
- 將已經prepare且格式化好的磁盤第一分區掛載到臨時目錄 ,默認為
/var/lib/ceph/tmp/mnt.xxx - 根據
/var/lib/ceph/tmp/文件夾下磁盤sdx的osd-lockbox.sdx所在行號分配該磁盤的osd id編號 - 初始化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 - 掛載osd對應id的目錄
/var/lib/ceph/osd/{cluster}-{osd_id} - 啟動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 源码逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个微信网名带圆字的网名
- 下一篇: 坦克多少钱啊?