KVM虛擬機存儲管理
KVM的存儲選項有多種,包括虛擬磁盤文件、基於文件系統的存儲和基於設備的存儲。
一、KVM的存儲性能解析對比
1、虛擬磁盤文件
當系統創建KVM虛擬機的時候,默認使用虛擬磁盤文件作為後端存儲。安裝後,虛擬機認為在使用真實的磁盤,但實際上看到的是用於模擬硬盤的虛擬磁盤文件。這一額外的文件系統層會降低系統速度。
當然,基於磁盤鏡像的虛擬磁盤並非全無益處,磁盤文件系統可以很輕松地用於其它的KVM虛擬化宿主機。但是如果您希望優化KVM虛擬化性能,最好考慮其它的存儲方式。
2、基於文件系統的KVM存儲
在安裝KVM宿主機時,可選文件系統為dir(directory)或fs(formatted block storage)作為初始KVM存儲格式。默認選項為dir,用戶指定本地文件系統中的一個目錄用於創建磁盤鏡像文件。
fs選項可以允許用戶指定某個格式化文件系統的名稱,把它作為專用的磁盤鏡像文件存儲。兩種KVM存儲選項之間最主要的區別在於:fs文件系統不需要掛載到某個特定的分區。
兩種選項所指定的文件系統,都可以是本地文件系統或位於SAN上某個物理宿主機上的網絡文件系統。後者具備一定的優勢,因為SAN可以很輕易地實現多個主機同時訪問,而本地磁盤或文件系統則無法實現。
還有一種基於文件的磁盤存儲方式是netfs,用戶可以指定一個網絡文件系統的名稱,如Samba.用這種方式作為KVM存儲很方便,因為這樣很容易訪問到位於其它服務器上的文件系統,同時用戶也可以通過多臺宿主機訪問磁盤文件。
所有的這些基於文件的KVM存儲方式都有一個缺點:文件系統固有缺陷。因為虛擬機的磁盤文件不能直接讀取或寫入KVM存儲設備,而是寫入宿主機OS之上的文件系統。這也就意味著在訪問和寫入文件時中間增加了額外一層,這通常會降低性能。所以,如果您希望尋找KVM虛擬化性能最優方案,最好考慮基於設備的存儲。
3、基於設備的KVM存儲
另外一種KVM存儲的方式就是使用基於設備的方式。共支持四種不同的物理存儲:磁盤、iSCSI、SCSI和lvm邏輯盤。磁盤方式指直接讀寫硬盤設備。iSCSI和SCSI方式可選,取決於用戶采取SCSI或iSCSI地址把磁盤設備連接。這種KVM存儲方式的優勢在於,磁盤的名稱是固定的,而不需要取決於宿主機OS搜索到磁盤設備的順序。
這種連接磁盤的方式也有缺點:靈活性不足。虛擬磁盤的大小很難改變,而且基於設備的KVM存儲不支持快照。
如果要優化KVM存儲的靈活性,可以使用LVM(Logical Volume Manager)。LVM的優勢在於可以使用快照,而快照並不是KVM虛擬化自帶的功能。
LVM可以把所有存儲放到一個卷組裏,從而輕松創建一個邏輯卷。該卷組是物理磁盤設備的一個抽象,所以如果超出可用磁盤空間最大值,還可以向卷組中添加新的設備,從而極大簡化了增加存儲空間的過程,增加的空間在邏輯卷中直接可以使用。使用LVM使得磁盤空間分配更加靈活,而且增加和刪除存儲也更為容易。
最後,LVM無論是在單宿主機或多宿主機環境中都可以很好工作。在多宿主機環境中,您可以在SAN上創建邏輯卷。如果使用Cluster LVM,可以很容易的配置成多個主機同時訪問某個邏輯卷。
二、KVM存儲池管理
為簡化KVM存儲管理的目的,可以創建存儲池。在宿主機上創建存儲池,可以簡化KVM存儲設備的管理。采用存儲池的方式還可以實現對提前預留的存儲空間的分配。這種策略對於大型應用環境很有效,存儲管理員和創建虛擬機的管理經常不是同一個人。這樣,在創建首臺虛擬機之前先完成KVM存儲池的創建是很好的方法。
1、存儲池的基本概念
存儲池是一個由libvirt管理的文件、目錄或存儲設備,提供給虛擬機使用。存儲池被分為存儲卷,這些存儲卷保存虛擬鏡像或連接到虛擬機作為附加存儲。libvirt通過存儲池的形式對存儲進行統一管理、簡化操作。對於虛擬機操作來說,存儲池和卷並不是必需的。支持以下類型存儲池:
2、virsh中和存儲池相關的命令
pool-autostart 自動啟動某個池
pool-build 建立池
pool-create-as 從一組變量中創建一個池
pool-create 從一個 XML 文件中創建一個池
pool-define-as 在一組變量中定義池
pool-define 在一個XML文件中定義(但不啟動)一個池或修改已有池
pool-delete 刪除池
pool-destroy 銷毀(刪除)池
pool-dumpxml 將池信息保存到XML文檔中
pool-edit 為存儲池編輯 XML 配置
pool-info 查看存儲池信息
pool-list 列出池
pool-name 將池 UUID 轉換為池名稱
pool-refresh 刷新池
pool-start 啟動一個(以前定義的)非活躍的池
pool-undefine 取消定義一個不活躍的池
pool-uuid 把一個池名稱轉換為池 UUID
3、創建基於目錄的存儲池(dir:Filesystem Directory)
virsh pool-define-as test dir --target /kvm/test
virsh pool-build test
virsh pool-start test
virsh pool-autostart test
4、創建基於分區的存儲池(fs:Pre-Formatted Block Device)
Libvirtd會自動掛載mount分區
(1)準備分區並創建文件系統
fdisk /dev/sdc
mkfs.xfs /dev/sdc1
(2)創建:
virsh pool-define-as test fs --source-dev /dev/sdc1 --target /kvm/test
virsh pool-build test
virsh pool-start test
virsh pool-autostart test
5、創建基於磁盤的存儲池(disk:Physical Disk Device)
virsh pool-define-as test disk --source-dev /dev/sdc --source-format gpt --target /dev
virsh pool-define test
virsh pool-start test
virsh pool-autostart test
6、創建基於LVM的存儲池(logical:LVM Volume Group)
基於LVM的存儲池要求使用全部磁盤分區
創建存儲池時,首先準備一個vg,vg中不需要創建lv
virsh pool-define-as kvmvg logical --source-name kvmvg --target /dev/kvmvg
7、創建基於iSCSI的存儲池(iscsi:iSCSI Target)
virsh pool-define-as storage01 iscsi --source-host 192.168.2.20 \ //存儲服務器的地址
> --source-dev iqn.2017-10.com.cloud.www:storage001 \ //target目標
> --target /dev/disk/by-path
virsh pool-start storage01
virsh pool-autostart storage01
8、基於NFS的存儲池(netfs:Network Export Directory)
[root@kvm001 ~]# virsh pool-define-as --name kvmnfs --type netfs \
> --source-host 192.168.2.20 \
> --source-path /nfsshare \
> --target /nfstest //需要提前創建目錄
三、KVM存儲池管理
1、virsh中和存儲池相關的命令
vol-clone 克隆卷。
vol-create-as 從一組變量中創建卷
vol-create 從一個 XML 文件創建一個卷
vol-create-from 生成卷,使用另一個卷作為輸入。
vol-delete 刪除卷
vol-download 將卷內容下載到文件中
vol-dumpxml 保存卷信息到XML文檔中
vol-info 查看存儲卷信息
vol-key 根據卷名或路徑返回卷的key
vol-list 列出卷
vol-name 根據給定卷key或者路徑返回卷名
vol-path 根據卷名或key返回卷路徑
vol-pool 為給定密鑰或者路徑返回存儲池
vol-resize 重新定義卷大小
vol-upload 將文件內容上傳到卷中
vol-wipe 擦除卷
2、在存儲池中創建一個qcow2格式的卷
virsh vol-create-as vm test.qcow2 1G --format qcow2
3、向vm2虛擬機添加test卷
用法:attach-disk <domain> <source> <target>
virsh attach-disk vm2 /kvm/vfs/test.qcow2 /kvm/vfs --cache none
KVM虛擬機存儲管理