一般而言,程序之中最最重要的是数据结构,故而我们从查找核心数据结构开始,但最初的表象切入点是libvirt的交互工具virsh。
1. 存储池的核心数据结构
其中的virStoragePoolDefPtr类型是存储池属性数据结构
找到以上两个核心数据结构,就基本上能够了解到如何描述每一个存储池,但是libvirt需要管理的是多个存储池
这时需要用到结构指针: 理解起来也简单,类似于一个数组, *p[1] 可以找到第二个结构变量
<细节>指针可以用malloc在堆上给他分配几个sizeof()的大小,存放几个结构变量,需要改数量时calloc堆上内存块的大小,根据调整变量的位置,通过memmove移动其他结构变量的位置。
实际使用中,又引入了这个结构体,便于获得到结构指针指向内存区域中结构变量的总个数
libvirt.c中conn->storageDriver->pools 就是这个类型的
2. 核心业务流程
表象 -> 细节
virsh的命令行 -> tools/virsh.c代码 -> src/libvirt.c -> src/storage/storage_dirver.c -> src/storage/storage_backend_XX.c
3. 新建存储池类操作
表象: 支持DIR,FS,NetFS,Logical,Disk,IScsi,Scsi,multipath (我们实际上只关=心DIR,FS,NetFs,Iscsi)
细节: DIR,FS,NetFS的卷的一些poolcreate,poolstart等需要实际跟操作系统打交道的功能是走的storage_backend_fs.c这个后端
同样的Logical,Disk,Iscsi,Scsi,mpath都有各自的后端
<一> pool-define virsh命令之一,用于按照提供的XML描述的内容,在存储池列表中新加入一个存储池,只加入不起用
XML描述格式,我们只关心DIR,Fs,NetFs,Iscsi几种
DIR:
Fs:
NetFs: