ceph-volume inventory

ceph-volume inventory子命令是用来查询当前系统中的磁盘信息。

首先我们先看下代码调用栈,如下图所示:

ceph高可用 openstack ceph-volume_ceph


从前面几篇文章我们知道,ceph-volume命令的入口函数是ceph_volume.main.Volume(),在__init__中调用self.mian(),然后通过terminal.dispatch(self.mapper, subcommand_args)创建对应子命令的实例并调用其main函数:

ceph高可用 openstack ceph-volume_main函数_02


在ceph_volume.inventory的main函数中可以看到支持ceph-volume inventory支持以下几个参数:

ceph高可用 openstack ceph-volume_元数据_03


接下来就是对参数进行解析,根据参数进行不同的格式化处理输出到屏幕

ceph高可用 openstack ceph-volume_ceph高可用 openstack_04


我们以没有path参数为例(即用户输入的命令是ceph-volume inventory)来看下self.format_report是怎么来进行信息输出的。

self.format_report的参数为ceph_volume.util.device中的 Devices类实例:

ceph高可用 openstack ceph-volume_ceph_05


Devices类只包含一个初始化函数和2个格式化输出函数,其中__init__初始化实例的过程中调用了disk.get_devices()函数,该函数的作用是通过lsblk获取当前系统所有块设备(不包括移动设备、逻辑卷、软盘)并读取/sys/block接口为相应磁盘添加元数据信息,如供应商、扇区大小、大小等。

ceph高可用 openstack ceph-volume_元数据_06


ceph高可用 openstack ceph-volume_ceph_07


get_device函数里面主要调用了get_block_devs_lsblk和get_file_contents函数,其中get_block_devs_lsblk通过lsblk获取块设备列表,get_file_contents通过读取/sys/block下面接口获取相应元数据。

ceph高可用 openstack ceph-volume_元数据_08


而get_file_contents其实就读取/sys/block下对应接口路径,需要读取的字段定义在get_devices的facts列表中,如果该块设备接口下不存在对应文件就返回空,若有则返回读取内容。添加完元数据信息后,get_device返回一个字典,key为磁盘名称,value为一个包含元数据信息的字典。

ceph高可用 openstack ceph-volume_main函数_09


最后,返回到Inventory类main函数的self.format_report中:

ceph高可用 openstack ceph-volume_ceph_10

我们上面假设用户输入的命令是ceph-volume inventory,那么就会调用Devices类中的pretty_report函数,其实就是循环调用对应磁盘对象(Device类)的report函数拼接成字符串后格式化输出。

ceph高可用 openstack ceph-volume_ceph_11