O007、KVM 存储虚拟化
KVM 的存储虚拟化是通过存储池(Storage Pool) 和 卷(Volume)来管理的。
Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论。Volume是在Storage Pool中划出的一块空间,宿主机将 Volume分配给虚拟机,Volume在寻机中看到的就是一块硬盘。
下面我们学习不同类型的 Storage Pool。
目录型 Storage Pool
文件目录是最常用的 Storage Pool类型。KVM将宿主机目录 /var/lib/libvirt/images/ 作为默认的Storage Pool
那么 Volume 是什么呢? 那就是该目录下的文件,一个文件就是一个 Volume。
比如在我们前面的实验中,我们将一个img文件放到了该目录下,这个img文件就是 Volume,对于kvm1来说,这就是他的启动磁盘。
那KVM是怎么知道要把 /var/lib/libvirt/images 这个目录当做默认 Storage Pool 的呢?实际上KVM所有可以使用的Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个Pool 一个xml文件,默认有一个 default.xml ,内容如下:
root@ubuntu:~# cat /etc/libvirt/storage/default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh pool-edit default
or other application using the libvirt API.
-->
<pool type='dir'>
<name>default</name>
<uuid>a57379a4-797d-476f-952b-3bae232035e1</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
</source>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>
上面可以看到 Storage Pool 的类型是 dir ,目录的路径就是 /var/lib/libvirt/images ,下面我们给kvm1 添加一个新的磁盘,看看有什么变化。
root@ubuntu:/var/lib/libvirt/images# ll -h
total 18M
drwx--x--x 2 root root 4.0K May 20 21:05 ./
drwxr-xr-x 7 root root 4.0K May 20 20:25 ../
-rwxrwxrwx 1 libvirt-qemu kvm 14M May 20 20:40 cirros-0.3.3-x86_64-disk.img*
-rw------- 1 root root 21G May 20 21:05 kvm1.qcow2
使用文件做 Volume有很多优点:存储方便、移植性好、可复制、可远程访问。前面几个有点都很好理解,这里对 可远程访问 解释一下。
远程访问的意思是镜像文件不一定都放置到宿主机本地文件系统中,也可以存储在网络上的远程文件系统上,比如 NFS,或者是分布式的文件系统,比如 GlusterFS。
这样镜像文件就可以在多个宿主机之间共享,便于虚拟在不同的宿主机之间做 Live Migration,如果是分布式的文件系统,多副本的特性还可以保证镜像文件的高可用。
KVM 支持多种Volume文件格式,在添加 Volume时可以选择。
raw 是默认格式,即原始磁盘镜像格式,移植性好、性能好、但大小固定,不能节省磁盘空间。
qcow2 是推荐使用的格式, cow 表示 copy on write ,能够节省磁盘空间,支持 AES 加密,支持zlib压缩,支持多快照,功能很多。
vmdk 是 VMWare 的虚拟磁盘格式,也就是说 VMWare虚机可以直接在KVM上运行。