目錄
前言? ? ?
1 qemu部分
1.1 磁盤格式驅動創建
1.2 json文件創建數據結構對象:
2 libvirt部分:
2.1 對應關系設置
2.2參設向指令格式轉換
前言? ? ?
qemu中有很多虛擬機磁盤格式,比如較為熟悉的qcow2,luks,raw等。每種磁盤有各自的數據組織模式以及相應實現的獨特功能,比如qcow2虛擬磁盤個格式可以實現快照功能,luks實現的是對數據的加密功能。這些獨特功能是對應數據管理與存儲模式的外在表現,換言之為了實現相應獨特功能,需要合理設置一種數據管理存儲模式,并把這種模式加入到qemu的磁盤格式驅動中。
1 qemu部分
1.1 磁盤格式驅動創建
以raw磁盤格式為例來說明一個磁盤格式注冊模板:
??????? 首先需要初始化類型為BlockDriver類型的對象,在raw磁盤格式中初始化name為“raw“,如果是自定義的則初始化為自定義的磁盤格式名字即可。初始化的對象包含了該磁盤格式所有操作調用函數,比如打開操作(bdrv_open)寫入操作(bdrv_co_pwritev)等,磁盤操作函數的具體邏輯依據具體的數據管理模式而定。
???????? 完成對BlockDriver類型對象初始化后,通過bdrv_register注冊到全局變量bdrv_drivers中,該變量是BlockDriver類型的列表。
1.2 json文件創建數據結構對象:
1:?在block-core.json文件中添加用到的數據結構,以raw類型舉例:
2:然后把該數據類型插入到BlockdevOptions中
3:把該對應的驅動名稱添加到BlockdevDriver中
2 libvirt部分:
2.1 對應關系設置
在libvirt的解析代碼邏輯中,首先我們需要創建磁盤類型字符串與enum之間的對應關系,目的是通過字符串解析找到回應的enum序號,進而做相應的switch處理。
2.2參設向指令格式轉換
libvirt需要根據對應的enum需要把字符串轉化為props對象,進而用來創建qemu-kvm啟動指令,比如這里的VIR_STORAGE_FILE_RAW通過qemuBlockStorageSourceGetFormatRawProps函數把字符串轉化為相應的qemu-kvm指令格式。