使用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:
1 2 | # cat /var/tmp/mars-scsi-controller.xml <controller type='scsi' model='virtio-scsi'/> |
And add it to our guest configuration:
1
|
#
virsh attach-device --config mars /var/tmp/mars-scsi-controller.xml
|
利用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:
1 | # fallocate -l 20480M /var/lib/libvirt/images/mars-dev-sda.img |
Next, I created the appropriate XML configuration for the new disk device:
1
2
3
4
5
6
|
#
cat /var/tmp/mars-dev-sda.xml
<disktype='file'device='disk'>
<drivername='qemu'type='raw'cache='none'/>
<sourcefile='/var/lib/libvirt/images/mars-dev-sda.img'/>
<targetdev='sda'/>
</disk>
|
Trying to attach this device via virsh
yielded
the following unpleasantness:
#
virsh attach-device --config mars /var/tmp/mars-dev-sda.xml
Deviceattachedsuccessfully
|
And on the guest, fdisk
proves
it’s there:
1
2
3
4
5
6
7
8
|
#
fdisk -l /dev/sda
Disk/dev/sda:21.5GB,21474836480bytes
64heads,32sectors/track,20480cylinders
Units=cylindersof2048*512=1048576bytes
Sectorsize(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Diskidentifier:0x00000000
|
在 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 中存儲對象狀態轉換圖
存儲卷從存儲池中劃分出來,存儲卷分配給虛擬機成爲可用的存儲設備。存儲池在 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