簡介: 本文闡述了 libvirt 中管理及使用 LVM 儲存池的方法,並展示了 qemu 虛擬機器使用 LVM 儲存的方法。
轉載地址:http://www.ibm.com/developerworks/cn/linux/l-cn-libvirt-lvm/index.html
引言
libvirt 是一組可與 Linux 上多種虛擬機器互動的管理工具集。它支援的虛擬機器有 KVM/QEMU、Xen、LXC、OpenVZ、virtual Box、vmware ESX/GSX、Hyper-V 等。為了使虛擬機器獲得更強大的後端儲存能力,libvirt 提供了對各種儲存介質的支援,包括本地檔案系統,網路檔案系統,iSCSI,LVM 等多種後端儲存系統。LVM(Linux 卷管理)系統是如今 Linux 伺服器廣泛使用的存放裝置。本文闡述的方法適用於 KVM/QEMU 虛擬機器,主要涉及在 libvirt
中使用 LVM 存放裝置的方法,使用基於 libvirt 的命令列虛擬機器管理工具 virsh。
libvirt 中的儲存管理獨立於虛擬機器管理。也就是儲存池和儲存卷的操作獨立於虛擬機器的操作存在,因此進行儲存管理時,不需要有虛擬機器的存在,可以當虛擬機器需要儲存資源時再進行分配,非常靈活。
回頁首
libvirt 支援後端儲存的類型
為了將不同的後端存放裝置以統一的介面供虛擬機器使用,libvirt 將儲存管理分為兩個方面:儲存卷 (volume) 和儲存池 (pool)。
儲存卷是一種可以分配給虛擬機器使用的存放裝置。在虛擬機器中與一個掛載點對應,而物理上可以是一個虛擬機器磁碟檔案或一個真實的磁碟分割。
儲存池是一種可以從中產生儲存卷的儲存資源,後端可以支援以下儲存介質:
- 目錄池:以主機的一個目錄作為儲存池,這個目錄中包含檔案的類型可以為各種虛擬機器磁碟檔案、鏡像檔案等。
- 本地檔案系統池:使用主機已經格式化好的塊裝置作為儲存池,支援的檔案系統類型包括 ext2,ext3,vfat 等。
- 網路檔案系統池:使用遠端網路檔案系統伺服器的匯出目錄作為儲存池。預設為 NFS 網路檔案系統。
- 邏輯卷池:使用已經建立好的 LVM 卷組,或者提供一系列產生卷組的源裝置,libvirt 會在其上建立卷組,產生儲存池。
- 磁碟卷池:使用磁碟作為儲存池。
- iSCSI 卷池:使用 iSCSI 裝置作為儲存池。
- SCSI 卷池:使用 SCSI 裝置作為儲存池。
- 多路裝置池:使用多路裝置作為儲存池。
回頁首
Libvirt 中儲存物件的狀態轉換
Libvirt 中的三類儲存物件:儲存池、儲存卷、裝置的狀態轉換關係 1 所示。
圖 1.libvirt 中儲存物件狀態轉換圖
儲存卷從儲存池中劃分出來,儲存卷分配給虛擬機器成為可用的存放裝置。儲存池在 libvirt 中分配的 id 標誌著它成為 libvirt 可管理的對象,產生卷組 vg(volume group) 就有了可劃分儲存卷的儲存池,狀態為活躍 (active) 狀態才可以執行劃分儲存卷的操作。
回頁首
libvirt 使用邏輯卷池的準備
重新設定和編譯
由於 libvirt 預設編譯不支援 LVM,因此需要重新編譯 libvirt 方可使用。使用 --with-storage-lvm 選項重新設定 libvirt 源碼並重新編譯 libvirt:
清單 1. 重新編譯 libvirt
$./autogen.sh --with-storage-lvm – system $make |
準備產生卷組的物理磁碟
在 host 中使用 fdisk 工具將物理卷格式化為 Linux LVM 格式(ID 為 8e)。產生的物理卷應為以下格式:
清單 2. 物理卷格式
$sudo fdisk -l /dev/sdc1 1 478 963616+ 8e Linux LVM /dev/sdc2 479 957 965664 8e Linux LVM |
準備產生儲存池的 xml 檔案
將 xml 檔案放在主機目錄 /etc/libvirt/storage 下。以下給出 xml 檔案的例子:
清單 3. 產生儲存池的 xml 檔案
<pool type="logical"> <name>lvm_pool</name> <source> <device path="/dev/sdc1"/> <device path="/dev/sdc2"/> </source> <target> <path>/lvm_pool</path> </target> </pool> |
pool 的類型為 logical 表示使用的儲存池類型為 LVM,源路徑為在 host 中物理卷所在的路徑,目的路徑為 host 機中產生儲存池的目標映射路徑,後續產生的邏輯卷將在 host 的該目錄下。
回頁首
建立 libvirt 儲存池
首次建立儲存池
先由之前的 xml 檔案定義一個儲存池,若 libvirtd 啟動之前 xml 檔案已在 /etc/libvirt/storage 目錄下,則 libvirtd 啟動之後會自動定義儲存池,可省去此步。
清單 4. 定義儲存池
$virsh pool-define /etc/libvirt/storage/lvm_pool.xml |
完成後就會在 libvirt 中定義一個不活躍的儲存池,但這個池對應的卷組還未被初始化。可以看到產生的池狀態為不活躍的:
清單 5. 查看卷組的狀態
$virsh pool-list – all 名稱 狀態 自動開始 ----------------------------------------- default 活動 yes directory_pool 活動 yes lvm_pool 不活躍 no |
建立儲存池將產生儲存池對應的卷組。
清單 6. 建立儲存池
$virsh pool-build lvm_pool |
此步完成後, host 上就產生了一個名為 lvm_pool 的卷組。
清單 7. 查看 host 上產生的卷組
$sudo vgdisplay --- Volume group --- VG Name lvm_pool System ID Format lvm2 |
以下命令在需要使用儲存池時讓儲存池處於活躍狀態
清單 8. 開始儲存池
$virsh pool-start lvm_pool |
建立儲存池
建立儲存池的操作相當於 pool-define 操作和 pool-start 操作的組合,也就是說,建立操作適用於卷組已經產生但還沒有在 libvirt 中被管理起來的情況。
清單 9. 建立儲存池
$virsh pool-create /etc/libvirt/storage/lvm_pool.xml |
清單 10. 完成建立後的狀態
$virsh pool-list 名稱 狀態 自動開始 ----------------------------------------- default 活動 yes directory_pool 活動 yes lvm_pool 活動 no |
回頁首
從儲存池中分配卷
儲存池為活躍的且已經產生了對應的卷組時,便可從儲存池中劃分邏輯卷供後續使用。
清單 11. 建立卷
$virsh vol-create-as --pool lvm_pool --name vol3 --capacity 30M |
其中 --pool 指定分配邏輯卷所屬儲存池(卷組),name 指定邏輯卷名稱,capacity 指定分配的卷大小。
清單 12. 查看儲存池中的卷組
virsh # vol-list pic_pool2 名稱 路徑 ----------------------------------------- vol1 /dev/lvm_pool/vol1 vol2 /dev/lvm_pool2/vol2 vol3 /dev/lvm_pool2/vol3 |
回頁首
在虛擬機器中使用卷
清單 13. 將卷分配給虛擬機器
$virsh attach-disk – domain dom1 – -source /dev/pic_pool2/vol1 – -target sda |
其中 domain 選項指定邏輯卷要附加的虛擬機器,source 選項指定邏輯卷在主機的路徑,target 指定在虛擬機器中的裝置名稱。
這一步完成之後,重啟虛擬機器就可以在虛擬機器中看到 /dev/sda 裝置。在虛擬機器中這個 /dev/sda 是一個裸裝置,只需要進一步分區格式化就可以掛載使用了。
清單 14. 查看卷分配是否成功
$virsh domblklist dom1 Target Source ------------------------------------------------ vda /var/lib/libvirt/images/redhat2.img hdc - sda /dev/pic_pool2/vol3 |
清單 15. 將卷從虛擬機器上分離
virsh # detach-disk – -domain dom1 --target sda |
這時在虛擬機器上就看不到 /dev/sda 裝置了,邏輯卷已從虛擬機器中成功分離。
回頁首
刪除儲存池中的卷
卷被刪除之後,卷所對應的儲存空間即被歸還到儲存池內。
清單 16. 刪除儲存池中的卷
virsh # vol-delete vol3 --pool pic_pool2 卷 vol3 被刪除 |
回頁首
儲存池的停用、刪除和取消定義
停用儲存池
儲存池停止使用之後,它上面的所有儲存卷的狀態都變得不可用,即使用它的虛擬機器都看不見這個裝置。也不能從這個儲存池中建立新卷。
清單 17. 停用儲存池
virsh # pool-destroy pic_pool2 銷毀池 pic_pool2 |
刪除儲存池
徹底刪除一個儲存池後,libvirt 就不再管理這個儲存池所對應的所有資源,儲存池在 host 機中對應的卷組也被刪除。
清單 18. 刪除儲存池
virsh # pool-delete pic_pool2 池 pic_pool2 被刪除 |
取消儲存池定義
即使刪除了儲存池,它仍然在 libvirt 儲存驅動中佔有一定的資源,可以看到這個池。
清單 19. 刪除儲存池後的狀態
$virsh pool-list – all 名稱 狀態 自動開始 ----------------------------------------- default 活動 yes directory_pool 活動 yes lvm_pool 不活躍 no |
使用 pool-undefine 取消儲存池的定義後,儲存池所佔用的資源完全被釋放,儲存磁碟機中查看不到該儲存池的存在了。
清單 20. 取消儲存池定義
$virsh pool-undefine lvm_pool