在 libvirt 上存儲設備管理總結

使用virsh工具添加Local磁盤  


dd if=/dev/zero of=./virtimage1.img bs=1M count=50

virsh attach-disk  test1 --persistent --source /var/crash/xx/vm/extent_disk.qcow2 --target vdb 


在線添加磁盤這個任務,如果使用圖形化工具,比如virt-manager,那是相當簡單,鼠標點擊幾下就成了。今天自我挑戰了一下,看看使用virsh命令行工具如何完成這一任務。

virsh支持attach-disk和attach-device兩個相關子命令,貌似attach-disk是添加磁盤的專用工具,但我研究了 半天,沒研究明白。而attach-device更通用一些,使用xml文件作爲輸入,靈活而強大。作爲輸入的xml文件格式與libvirt中VM的配 置文件格式一樣,下面是一個實例:


1,創建磁盤:

qemu-img create -f qcow2 /data/vm/huge.img 500G

2,編寫一個xml文件(disk.xml):

    <disk type='file' device='disk'>

      <driver name='qemu' type='qcow2' cache='none'/>

      <source file='/data/vm/huge.img'/>

      <target dev='vdb' bus='virtio'/>

    </disk>


3,添加磁盤:

virsh attach-device --persistent vm-name disk.xml

然後登陸到vm系統中,就可以使用fdisk命令看到新的磁盤了。

刪除這個磁盤也很簡單,只需要將attach-device修改爲detach-device即可:

virsh detach-device --persistent vm-name disk.xml

參考文檔:

http://serverfault.com/a/457259


添加SCSI controller:

Let’s create a simple XML configuration file for our new SCSI controller:

And add it to our guest configuration:


利用SCSI controller使用host卷組

用卷組建立pool:

pool-create-as --name cloudvg --type logical   --source-dev /dev/sda2 --target /dev/cloudvg

在池中建立邏輯卷vol:

vol-create-as  --pool cloudvg --name lv_testxx --capacity 3G

將卷分配給虛擬機:
attach-disk --domain test4 --source /dev/cloudvg/lv_testxx  --target sdc



利用SCSI controller使用file disk

I first used my new best friend fallocate to fast-allocate the required image:

Next, I created the appropriate XML configuration for the new disk device:

Trying to attach this device via virsh yielded the following unpleasantness:

And on the guest, fdisk proves it’s there:


在 libvirt 上使用 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 中存儲對象狀態轉換圖
圖 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章