KVM二企业级虚拟化技术KVM管理
一、GuestOS安装问题解析
问题1:用图形安装guest os的时候卡住不动
解决:升级系统
[root@server ~]# yum upgrade -y
问题2:升级系统后安装guest os的时候还是卡住不动
解决:需要在安装宿主机的时候安装兼容性程序(有的同学就没有安装也可以使用,这可能是bug)
问题3:如果安装了各种兼容程序之后还是不行
如果所有问题都排查过后还是安装不上guestos,最后的原因就是在安装宿主机系统的时候各种兼容性软件没有安装而且Yum也没有自动处理导致的
二、GuestOS升级配置
- 修改配置文件(比如添加磁盘,那就添加如下配置)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/vm3-1.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x16' function='0x0'/>
</disk>
特别注意:centos8里面硬盘和网卡的添加已经不能修改slot了,要求修改的是bus地址
- 创建新的空磁盘卷:
[root@server ~]# qemu-img create -f qcow2 vm3-1.qcow2 10G
- 重新定义:
[root@server ~]# virsh define /etc/libvirtd/qemu/vm3.xml
三、KVM存储
概念
KVM必须要配置一个目录当作他存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池
默认存储池
/var/lib/libvirt/images/
1、存储池管理
1.创建基于文件夹的存储池(目录)
[root@server ~]# mkdir -p /data/vmfs
2.定义存储池与其目录
[root@server ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs
3.创建已定义的存储池
(1) 创建已定义的存储池
[root@server ~]# virsh pool-build vmdisk
(2) 查看已定义的存储池,存储池不激活无法使用。
#virsh pool-list --all
4.激活并自动启动已定义的存储池
[root@server ~]# virsh pool-start vmdisk
[root@server ~]# virsh pool-autostart vmdisk
这里vmdisk存储池就已经创建好了,可以直接在这个存储池中创建虚拟磁盘文件了。
5.在存储池中创建虚拟机存储卷
[root@server ~]# virsh vol-create-as vmdisk oeltest03.qcow2 20G --format qcow2
注1:KVM存储池主要是体现一种管理方式,可以通过挂载存储目录,lvm逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别了。
注2:KVM存储池也要用于虚拟机迁移任务。
6.存储池相关管理命令
(1)在存储池中删除虚拟机存储卷
[root@server ~]# virsh vol-delete --pool vmdisk oeltest03.qcow2
(2)取消激活存储池
[root@server ~]# virsh pool-destroy vmdisk
(3)删除存储池定义的目录/data/vmfs
[root@server ~]# virsh pool-delete vmdisk
(4)取消定义存储池
[root@server ~]# virsh pool-undefine vmdisk
到此KVM存储池配置与管理操作完毕。
2、生产环境存储池使用
添加lvm和远程存储即可
3、磁盘格式
- 磁盘镜像文件格式
raw
原始格式,性能最好
qcow
先去网上了解一下cow(写时拷贝copy on write) ,性能远不能和raw相比,所以很快夭折了,所以出现了qcow2
qcow2
性能上还是不如raw,但是raw不支持快照,qcow2支持快照。
qed
现在默认安装好的用的是raw格式,所有做快照要把他转换成qcow2格式
什么叫写时拷贝?
raw立刻分配空间,不管你有没有用到那么多空间
qcow2只是承诺给你分配空间,但是只有当你需要用空间的时候,才会给你空间。最多只给你承诺空间的大小,避免空间浪费
工作当中用哪个?看你用不用快照。
工作当中虚拟机会有多个备份,一个坏了,再起一个就行了,所有没必要用快照。当然也不一定。数据绝对不会存储到本地。
- 创建磁盘文件
建立qcow2格式磁盘文件:
#qemu-img create -f qcow2 test.qcow2 20G
建立raw格式磁盘文件:
#qemu-img create -f raw test.raw 20G
查看已经创建的虚拟磁盘文件:
#qemu-img info test.qcow2
4、挂载磁盘
作为虚拟化环境管理员,你肯定遇到过虚拟机无法启动的情况。实施排错时,你需要对虚拟机的内部进行检查。而Libguestfs Linux工具集可以在这种情况下为你提供帮助。
利用Libguestfs找出损坏的虚拟机文件
Libguestfs允许在虚拟机上挂载任何类型的文件系统,以便修复启动故障。
使用Libguestfs,首先需要使用Libvirt。Libvirt是一个管理接口,可以和KVM、Xen和其他一些基于Liunx的虚拟机相互连接。Libguestfs的功能更加强大,可以打开Windows虚拟机上的文件。但是首先你需要将虚拟机迁移到libguestfs可用的环境当中,也就是Linux环境。
假如你是vmware的ESXI虚拟机,为了将虚拟机迁移到Linux当中,你可以使用SSH连接到ESXi主机,这意味着你首先需要启用ESXi主机上的SSH访问方式。完成之后,在Linux平台上运行下面的scp命令:
查看磁盘镜像分区信息:
[root@server ~]# virt-df -h -d vm1
Filesystem Size Used Available Use%
vm1:/dev/sda1 484M 32M 428M 7%
vm1:/dev/sdb1 3.5G 3.5G 0 100%
vm1:/dev/VolGroup/lv_root 6.1G 1.1G 4.7G 18%
[root@server ~]# virt-filesystems -d vm1
/dev/sda1
/dev/sdb1
/dev/VolGroup/lv_root
挂载磁盘镜像分区:
[root@server ~]# guestmount -d vm1 -m /dev/vda1 --rw /mnt
注:
mtab文件在centos7的启动过程中非常有用,删掉会导致不能启动
四、KVM管理
1、KVM基本管理
查看 启动 关闭 重启 重置 查看
查看虚拟机:
[root@server ~]# virsh list
Id Name State
----------------------------------------------------
2 vm1 running
[root@server ~]# virsh list --all
Id Name State
----------------------------------------------------
2 vm1 running
查看KVM虚拟机配置文件(X):
[root@server ~]# virsh dumpxml name
将node4虚拟机的配置文件保存至node6.xml(X):
[root@server ~]# virsh dumpxml node4 > /etc/libvirt/qemu/node6.xml
修改node6的配置文件(X):
[root@server ~]# virsh edit node6
如果直接用vim编辑器修改配置文件的话,需要重启libvirtd服务
启动:
[root@server ~]# virsh start vm1
Domain vm1 started
暂停虚拟机:
#virsh suspend vm_name
恢复虚拟机:
#virsh resume vm_name
关闭:
方法1:
[root@server ~]# virsh shutdown vm1
Domain vm1 is being shutdown
方法2(X):
[root@server ~]# virsh destroy vm1
Domain vm1 destroyed
重启:
[root@server ~]# virsh reboot vm1
Domain vm1 is being reboote
重置:
[root@server ~]# virsh reset vm1
Domain vm1 was reset
删除虚拟机:
[root@server ~]# virsh undefine vm2
Domain vm2 has been undefined
注意:虚拟机在开启的情况下undefine是无法删除的,但是如果再destroy会直接被删除掉
虚拟机开机自动启动:
[root@server ~]# virsh autostart vm1
域 vm1标记为自动开始
[root@server ~]# ls /etc/libvirt/qemu/autostart/ //此目录默认不存在,在有开机启动的虚拟机时自动创建
vm1.xml
[root@server ~]# virsh autostart --disable vm1
域 vm1取消标记为自动开始
查看所有开机自启的guest os:
[root@server ~]# ls /etc/libvirt/qemu/autostart/
[root@server ~]# virsh list --all --autostart
2、虚拟机克隆
1.图形界面
Applications (左上角)-----> System Tools ------>Virtual Machine Manager
关闭要克隆的虚拟机,右键点击虚拟机选择Clone
2.字符终端,命令克隆
[root@server ~]# virt-clone -o vm1 --auto-clone
WARNING 设置图形设备端口为自动端口,以避免相互冲突。
正在分配 'vm1-clone.qcow2' | 6.0 GB 00:00:05
成功克隆 'vm1-clone'。
-o origin
[root@server ~]# virt-clone -o vm1 -n vm2 --auto-clone
WARNING 设置图形设备端口为自动端口,以避免相互冲突。
正在分配 'vm2.qcow2' | 6.0 GB 00:00:06
成功克隆 'vm2'。
[root@server ~]# virt-clone -o vm1 -n vm2 -f /var/lib/libvirt/images/vm2.img
正在克隆
vm1.img | 8.0 GB 01:03
Clone 'vm2' created successfully.
3、增量镜像
注意:扩展内容,了解即可
1、概述
实验目的:
通过一个基础镜像(node.img),里面把各个虚拟机都需要的环境都搭建好,然后基于这个镜像建立起一个个增量镜像,每个增量镜像对应一个虚拟机,虚拟机对镜像中所有的改变都记录在增量镜像里面,基础镜像始终保持不变。
功能:
节省磁盘空间,快速复制虚拟机。
环境:
基本镜像文件:node.img 虚拟机ID:node
增量镜像文件:node4.img 虚拟机ID:node4
要求:
以基本镜像文件node.img为基础,创建一个镜像文件node4.img,以此创建一个虚拟机node4,虚拟机node4的改变将存储于node4.img中。
2、创建增量镜像文件
[root@server ~]# qemu-img create -b node.img -f qcow2 node4.img
[root@server ~]# qemu-img info node4.img
image: node4.img
file format: qcow2
virtual size: 20G (21495808000 bytes)
disk size: 33M
cluster_size: 65536
backing file: node.img (actual path: node.img)
注:该实验只是针对qcow2格式的镜像文件,未测试raw格式的镜像文件是否可行。
3、创建虚拟机node4的XML配置文件
[root@server ~]# cp /etc/libvirt/qemu/node.xml /etc/libvirt/qemu/node4.xml
[root@server ~]# vim /etc/libvirt/qemu/node4.xml
<domain type='KVM'>
<name>node4</name> #node4的虚拟机名,须修改,否则与基本虚拟机冲突
<uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fe4</uuid> #node4的UUID,必须修改,否则与基本虚拟机冲突
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu cpuset='0-1'>2</vcpu>
<os>
<type arch='x86_64' machine='rhel5.4.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-KVM</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/virhost/KVM_node/node4.img'/> #将原指向/virhost/KVM_node/node.img改为node4.img
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:69:d5:f4'/> #修改网卡MAC,防止冲突
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<interface type='bridge'>
<mac address='54:52:00:69:d5:e4'/> #修改网卡MAC,防止冲突
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0' passwd='xiaobai'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</memballoon>
</devices>
</domain>
4、根据xml配置定义虚拟机node4
[root@server ~]#virsh define /etc/libvirt/qemu/node4.xml
[root@server ~]#virsh start node4
5、测试
[root@server ~]# du -h node.img
6.3G node.img
[root@server ~]# du -h node4.img
33M node4.img
[root@server ~]# dd if=/dev/zero of=test bs=1M count=200 #在虚拟机node4上增量200M大小文件
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 1.00361 seconds, 209 MB/s
[root@server ~]# du -h node.img #基本镜像文件node.img大小未变
6.3G node.img
[root@server ~]# du -h node4.img #增量镜像文件node4.img增加200M了
234M node4.img
4、快照
为虚拟机vm8创建一个快照
[root@server ~]# virsh snapshot-create-as vm8 vm8.snap
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw
raw
使用文件来模拟实际的硬盘(当然也可以使用一块真实的硬盘或一个分区)。由于原生的裸格式,不支持snapshot也是很正常的。但如果你使用LVM的裸设备,那就另当别论。说到LVM还是十分的犀利的目前来LVM的snapshot、性能、可扩展性方面都还是有相当的效果的。目前来看的话,备份的话也问题不大。就是在虚拟机迁移方面还是有很大的限制。但目前虚拟化的现状来看,真正需要热迁移的情况目前需求还不是是否的强烈。虽然使用LVM做虚拟机镜像的相关公开资料比较少,但目前来看牺牲一点灵活性,换取性能和便于管理还是不错的选择。
qcow2
现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了
对于qcow2的格式,几点还是比较突出的,qcow2的snapshot,可以在镜像上做N多个快照:
•更小的存储空间
•Copy-on-write support
•支持多个snapshot,对历史snapshot进行管理
•支持zlib的磁盘压缩
•支持AES的加密
查看镜像文件格式:
[root@server ~]# qemu-img info /var/lib/libvirt/images/vm8.img
image: /var/lib/libvirt/images/vm8.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G
格式转换:
把raw格式转换成qcow2格式
[root@server ~]# qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/vm8.img /var/lib/libvirt/images/vm8_qcow2.img
[root@server ~]# ls -l /var/lib/libvirt/images/
total 28381680
-rw-------. 1 qemu qemu 10737418240 Aug 16 01:09 vm8.img
-rw-r--r--. 1 root root 3076521984 Aug 16 01:09 vm8_qcow2.img
[root@server ~]# qemu-img info /var/lib/libvirt/images/vm8_qcow2.img
image: /var/lib/libvirt/images/vm8_qcow2.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.9G
cluster_size: 65536
将虚拟机的硬盘指向转换后的qcow2.img
在虚拟机中创建一个目录,但目录中是空的
[root@server ~]# mkdir /test
[root@server ~]# ls /test
给虚拟机vm8创建第一个快照vm8.snap1
[root@server ~]# virsh snapshot-create-as vm8 vm8.snap1
[root@server ~]# qemu-img info /var/lib/libvirt/images/vm8_qcow2.img
image: /var/lib/libvirt/images/vm8_qcow2.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 3.1G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 vm8.snap1 229M 2013-08-16 01:25:39 00:03:58.995
在虚拟机中,给 /test 中复制2个文件
[root@server ~]# cp install.log anaconda-ks.cfg /test
[root@server ~]# ls /test
anaconda-ks.cfg install.log
给虚拟机vm8创建第二个快照vm8.snap2
[root@server ~]# virsh snapshot-create-as vm8 vm8.snap2
Domain snapshot vm8.snap2 created
[root@server ~]# virsh snapshot-list vm8
关闭虚拟机,恢复到第一个快照
[root@server ~]# virsh shutdown vm8
[root@server ~]# virsh snapshot-revert vm8 vm8.snap1
在虚拟机中,发现 /test 目录为空
[root@server ~]# ls /test
关闭虚拟机,恢复到第二个快照
[root@server ~]# virsh shutdown vm8
[root@server ~]# virsh snapshot-revert vm8 vm8.snap2
在虚拟机中,发现 /test 有拷贝的2个文件
[root@server ~]# ls /test
anaconda-ks.cfg install.log
查看虚拟机快照
[root@server ~]# virsh snapshot-list vm8
删除虚拟机快照
[root@server ~]# virsh snapshot-delete --snapshotname vm8.snap2 vm8
[root@server ~]# virsh snapshot-list vm8