1. 程式人生 > >rbd map 執行過程分析

rbd map 執行過程分析

分析的 ceph 程式碼版本:  12.2.4

分析的 kernel 程式碼版本:  4.16.0

在執行 `rbd map <pool_name>/<image_name>` ,整個執行流程是如何完成的呢?

這個 map 主要可以分為兩個部分:

1. 通知 kernel ,告知 kernel 需要 map 的資訊(pool_name, image_name, 延伸的還包含 ceph 叢集資訊)

2. kernel 完成剩下的工作

一、通知 kernel

執行 `rbd map <pool_name>/<image_name>`  是怎樣通知 kernel 的呢?

大致流程是通過寫 /sys/bus/rbd 下的檔案來完成,具體過程如下:

1. 命令列的入口 src/tools/rbd/action/Kernel.cc

入口:

 520 Shell::Action action_map(
 521   {"map"}, {}, "Map image to a block device using the kernel.", "",
 522   &get_map_arguments, &execute_map);

2. 呼叫流程:

execute_map --> do_kernel_map --> krbd_map --> map_image --> do_map --> sysfs_write_rbd_add

sysfs_write_rbd_add 就是向 /sys/bus/rbd/add_single_major 寫入新增的 image 及 ceph 叢集資訊,通知 kernel 。

二、kernel 完成剩下的工作

1. 首先會安裝 libceph, rbd 兩個模組

這兩個模組,如果`rbd map` 執行時沒安裝,則會在 map_image 中安裝:

map_image 會探測 rbd 模組是否安裝,沒有會安裝模組:

 302   /*
 303    * Modprobe rbd kernel module.  If it supports single-major device
 304    * number allocation scheme, make sure it's turned on.
305 */ 306 if (access("/sys/bus/rbd", F_OK) != 0) { 307 const char *module_options = NULL; 308 if (module_has_param("rbd", "single_major")) 309 module_options = "single_major=Y"; 310 311 r = module_load("rbd", module_options); 312 if (r) { 313 cerr << "rbd: failed to load rbd kernel module (" << r << ")" 314 << std::endl; 315 /* 316 * Ignore the error: modprobe failing doesn't necessarily prevent 317 * from working. 318 */ 319 } 320 }

2. kernel 入口:

drivers/block/rbd.c

3. rbd_init:

a. rbd_slab_init

b. alloc_workqueue

c. register_blkdev

d. rbd_sysfs_init

4. rbd_sysfs_init 流程 rbd_sysfs_init --> device_register && bus_register

bus_register 註冊時傳入了 rbd_bus_type

rbd_bus_type --> rbd_bus_group --> rbd_bus_attrs

rbd_bus_attrs 中定義了 add/remove 相關的屬性檔案,

如果我們向 add_single_major 檔案寫入時,kernel 將呼叫相應的函式來完成相應工作,這裡的函式是 rbd_add_single_major.

rbd_bus_type --> rbd_bus_group --> rbd_bus_attrs 相關的定義如下:

...

5. rbd_add_single_major 分析:

rbd_add_single_major --> do_rbd_add --> rbd_dev_create

rbd_dev_create 完成了最後的 建立 rbd device 的工作。