虚拟化 KVM

27.1 虚拟化介绍

虚拟化简单来讲,就是把一个物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互之间不受影响,这样就可以充分利用物理计算机的硬件资源,从而提高计算机的工作效率。

虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。


Hypervisor

讲到虚拟化,就离不开Hypervisor,可它究竟是什么呢?有什么作用?

Hypervisor一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。

Hypervisor是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。


虚拟化分类

虚拟化技术可以分为全虚拟化半虚拟化

早期CPU硬件不支持虚拟化,当虚拟机上的操作系统(Guest OS)要使用CPU资源时,需要通过VMM来翻译指令,这个过程比较耗费资源,而这种虚拟化技术叫做全虚拟化,我们用的VMware Workstation 和 KVM 就是全虚拟化。

半虚拟化技术通过修改Guest OS内核,让Guest OS可以直接使用CPU资源,这样就不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋,可以虚拟化linux,但无法虚拟化Windows,因为Windows并不是开源的。相对来说有利有弊,我们熟悉的XEN就是半虚拟化。

随着CPU的发展,现在的CPU都可以直接支持虚拟化,不需要VMM翻译指令了,这样也就无所谓全虚拟化和半虚拟化了。


常用虚拟化软件

  • VMware系列:
VMware Workstation,适用于单台机器虚拟化,我们日常学习使用的也是这一款;

VMware vsphere(VMware esxi),适用于多台机器的虚拟化解决方案,图形化操作;

VMware Fusion(Mac),适用于苹果系统。

  • XEN:
开源,半虚拟化,Redhat和CentOS的版本5和版本6可以直接使用xen;

XenServer,商业版本,厂商Ctirx,基于xen。

  • KVM:
开源,基于linux内核模块,不修改linux内核。

  • Hyper-V:
微软开发出来的虚拟化软件,商业版本。

  • Openvz:
开源,基于linux,轻量的虚拟化软件,虚拟机和宿主机需要公用一个内核,这样相同性能的物理机能虚拟出更多的虚拟机,稳定性稍差。

  • Oracle VirtualBox:
开源,Sun公司开发,和VMware Workstation类似,后被Oracle公司收购。


虚拟化架构

云计算离不开底层的虚拟化技术支持。*列举的虚拟化技术有超过60种,基于X86(CISC- Complex Instruction Set Computer)体系的超过50种,也有基于RISC(Reduced Instruction Set Computer)体系的。

其中有4种虚拟化技术是当前最为成熟而且应用最为广泛的,分别是:VMWARE的ESX、微软的Hyper-V、开源的XEN和KVM。

从虚拟化的实现方式来看,虚拟化架构主要有两种形式:宿主架构和裸金属架构。

虚拟化 KVM

I型:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”,也称为裸金属架构。  
II型:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为“托管”hypervisor。也称为宿主架构。    
还有一种容器虚拟化:虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例,指向底层托管操作系统,被称为“操作系统虚拟化。  

I型独立型:VMware vsphere(ESXI)  
I型混合型:XenServer(Xen)、Hyper-V 、Oracle VirtualBox  

I型混合架构包括一个软件模型,一个“瘦”hypervisor联合一个父分区提供硬件虚拟化,它提供了虚拟机监视功能。父分区也叫做Dom0(FC文档描述:一个修改过的Linux kernel,是唯一运行在Xen Hypervisor之上的虚拟机。它拥有访问物理I/O资源的权限,同时和系统上运行的其他虚拟机进行交互。Dom0需要在其他Domain启动之前启动)。  

I型组合型:基于Linux的内核虚拟机(KVM)。
基于Linux的内核虚拟机(KVM)hypervisor模型提供了一个独一无二的I型架构,它不是在裸机上执行hypervisor,KVM利用开源Linux(包括RHEL,SUSE,Ubuntu等)作为基础操作系统,提供一个集成到内核的模块(叫做KVM)实现硬件虚拟化,KVM模块在用户模式下执行(与独立型和混合型hypervisor不一样,它们都运行在内核/根模式下),但可以让虚拟机在内核级权限使用一个新的指令执行上下文,叫做客户机模式。


27.2 KVM介绍

KVM是以色列公司Qumranet开发,后来被Redhat公司收购。KVM是开源的,Redhat基于KVM的虚拟化解决方案叫做RHEV。

KVM是linux内核的一个模块,它把linux内核变成了一个Hypervisor。KVM在linux系统里面以进程的形式出现,由标准的linux调度程序进行调度,这使得KVM能够使用linux内核的已有功能,比如说内存管理、CPU调度等。

但是,只有一个KVM内核模块还不能实现虚拟化的全部功能,就像操作系统只有内核还不能成为一个完整的操作系统一样。

QEMU是一个开源的虚拟化软件,可以虚拟化所有的硬件,但性能不强。KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM。这样一来,磁盘、网络设备等都是可以通过QEMU-KVM模拟出来,KVM和QEMU-KVM通信是通过/dev/kvm实现的。另外,libvirt是用来管理KVM虚拟机的接口(API),其命令为virsh。


安装KVM

准备一个虚拟机,内存4G,2核CPU(打开虚拟化引擎),2块硬盘(分别20G即可,一块硬盘给虚拟机上的虚拟机使用)这里我的虚拟机系统是CentOS 7 ,我们要做的是在虚拟机系统之上再虚拟出虚拟机。

  • 关闭防火墙和selinux:
# systemctl stop firewalld# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.# getenforce Enforcing# setenforce 0# vim /etc/selinux/configSELINUX=disabled

  • 检查CPU是否支持虚拟化:
# grep -Ei 'vmx|svm' /proc/cpuinfoflags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep invpcid mpx rdseed smap clflushopt xsaveopt xsavec arat
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep invpcid mpx rdseed smap clflushopt xsaveopt xsavec arat

有vmx或svm的关键字就说明支持虚拟化。

  • 格式化分区并挂载新增的磁盘:
# fdisk -l				#显示所有分区磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000b0925

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41943039    18668544   83  Linux

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区				#新挂载磁盘为/dev/sdbUnits = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节# mkfs.ext4 /dev/sdb				#格式化成ext4格式mke2fs 1.42.9 (28-Dec-2013)/dev/sdb is entire device, not just one partition!无论如何也要继续? (y,n) y				#输入y# blkid /dev/sdb				#查看未挂载的分区类型/dev/sdb: UUID="9425d437-b596-453b-8c04-59be24378ceb" TYPE="ext4"# mkdir /kvm_data# mount /dev/sdb /kvm_data				#挂载# vim /etc/fstab				#新增这一行,让它开机直接挂载/dev/sdb      /kvm_data    ext4      defaults         0 0

  • 安装kvm:
# yum install -y virt-* libvirt bridge-utils qemu-img

  • 增加桥接网卡:
# cd /etc/sysconfig/network-scripts/# cp ifcfg-ens33 ifcfg-br0# vim ifcfg-br0TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.33.127
NETMASK=255.255.255.0
GATEWAY=192.168.33.2
DNS1=8.8.8.8
DNS2=4.4.4.4# vim ifcfg-ens33 TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

# systemctl restart network# ifconfigbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.33.127  netmask 255.255.255.0  broadcast 192.168.33.255
        inet6 fe80::d3a5:5cb8:f917:cbde  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:13:48:42  txqueuelen 1000  (Ethernet)
        RX packets 30  bytes 2480 (2.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 854 (854.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:13:48:42  txqueuelen 1000  (Ethernet)
        RX packets 237  bytes 32478 (31.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 54  bytes 7240 (7.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 40  bytes 3096 (3.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40  bytes 3096 (3.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  • 启动libvirtd服务:
# systemctl start libvirtd# ps aux |grep libvirtdroot       7716  1.5  0.6 701696 24892 ?        Ssl  12:42   0:00 /usr/sbin/libvirtd# brctl showbridge name	bridge id		STP enabled	interfaces
br0		8000.000c29134842	no		ens33
virbr0		8000.5254006471bc	yes		virbr0-nic				#kvm启动起来的桥接网卡


创建虚拟机安装CentOS7

使用xftp上传CentOS7的镜像文件到虚拟机上,xftp下载地址

虚拟化 KVM

# ls1.php  anaconda-ks.cfg  CentOS-7-x86_64-Minimal-1708.iso# mv CentOS-7-x86_64-Minimal-1708.iso /tmp/

  • 安装CentOS7:
# virt-install --name=linux01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-Minimal-1708.iso --disk path=/kvm_data/linux01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"--name定义虚拟机名称;--memory定义磁盘大小,maxmemory为最大磁盘大小,可以支持热调整;--vcpus定义cpu核数,maxcpus为最大cpu核数;--os-type定义系统类型,--os-variant定义具体系统版本;--location定义安装镜像文件所在路径,可以是链接;--disk path定义虚拟磁盘路径、名字及大小;--birdge定义桥接网卡;--graphics定义是否开启图形;--console定义终端属性

到选择这一步,进行操作

虚拟化 KVM

第1项:语言选择        第2项:时间设置
第3项:安装源          第4项:软件选择
第5项:安装目标        第6项:Kdump
第7项:网络设置        第8项:root密码
第9项:是否创建一个普通用户并设置密码

这里其实和我们在VMware Workstation上安装CentOS7类似,只不过换成了命令行下操作。

首先选择语言,按下1

虚拟化 KVM

再按Enter键,选择68

虚拟化 KVM

再选择1,简体中文

虚拟化 KVM

语言设置完毕,配置完成的项就会显示为X。往下继续配置时间,按下2

虚拟化 KVM

再按下1,设置时区

虚拟化 KVM

再按下2,选择亚洲,再按Enter键,选择64,上海,时间设置完毕。

虚拟化 KVM

往下设置安装目标,按下5

虚拟化 KVM

只有一个选项,按下c,继续

虚拟化 KVM

这里默认是2,按下c,继续

虚拟化 KVM

选择1,标准分区

虚拟化 KVM

按下c,继续,安装目标设置完毕

虚拟化 KVM

再来设置root密码,按下8

虚拟化 KVM

输入两遍要设置的密码,root密码设置完毕

虚拟化 KVM

接下来就不需要再设置了,按下b,开始安装

虚拟化 KVM

等待几分钟,安装完毕

虚拟化 KVM

按下Enter键,它会自动重启,重启完提示登录

虚拟化 KVM

输入账号及密码后登录进来

虚拟化 KVM

回到宿主机,按Ctrl + ] 键可以回到宿主机

虚拟化 KVM


虚拟机管理

上面已经安装好了一台虚拟机,那么在宿主机命令行下怎么去管理虚拟机呢?

  • 查看刚安装的虚拟机的虚拟磁盘:
# df -h文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        18G  5.2G   13G   29% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  8.8M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sdb         20G  1.2G   18G    7% /kvm_data
/dev/sda1       197M  115M   83M   59% /boot
tmpfs           378M     0  378M    0% /run/user/0# ls /kvm_data/linux01.img  lost+found				#linux01.img就是虚拟机linux01的虚拟磁盘

  • 列出当前系统所有的虚拟机:
[root@lzx ~]# virsh list --all				#不加--all,只会列出开机状态下的虚拟机
 Id    名称                         状态
----------------------------------------------------
 2     linux01                        running

  • 关闭正在运行的虚拟机:
# virsh shutdown linux01				#关闭正在运行的虚拟机域 linux01 被关闭# virsh list
 Id    名称                         状态
----------------------------------------------------# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     linux01                        关闭

  • 开启关闭中的虚拟机:
# virsh start linux01				#开启关闭中的虚拟机域 linux01 已开始# virsh list
 Id    名称                         状态
----------------------------------------------------
 3     linux01                        running

  • 进入开启中的虚拟机:
关闭的虚拟机是无法进入的# virsh console linux01				#进入开启中的虚拟机连接到域 linux01
换码符为 ^][  157.307403] random: crng init doneCentOS Linux 7 (Core)Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root        
密码:				#输入账号密码登录进来Last login: Sun Sep 30 17:27:39 on ttyS0[root@localhost ~]#

  • 设置虚拟机网卡:
# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:48:71:79 brd ff:ff:ff:ff:ff:ff# dhclient# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:48:71:79 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.33.7/24 brd 192.168.33.255 scope global dynamic eth0				#获取到IP 192.168.33.7,网段与宿主机一致,因为是桥接模式
       valid_lft 1794sec preferred_lft 1794sec
    inet6 fe80::5054:ff:fe48:7179/64 scope link 
       valid_lft forever preferred_lft forever# ping www.qq.comPING https.qq.com (58.247.214.47) 56(84) bytes of data.
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=1 ttl=128 time=13.3 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=2 ttl=128 time=18.2 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=3 ttl=128 time=14.9 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=4 ttl=128 time=15.8 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=5 ttl=128 time=14.0 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=6 ttl=128 time=11.1 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=7 ttl=128 time=14.6 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=8 ttl=128 time=15.0 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=9 ttl=128 time=11.3 ms
64 bytes from 58.247.214.47 (58.247.214.47): icmp_seq=10 ttl=128 time=22.8 ms
 
--- https.qq.com ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9021ms
rtt min/avg/max/mdev = 11.166/15.146/22.820/3.226 ms

  • 查看虚拟机磁盘及cpu核数:
# free -m
              total        used        free      shared  buff/cache   available
Mem:            480         114         145           6         220         194        //总大小为480M
Swap:          1023           0        1023# cat /proc/cpuinfo processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 44
model name	: Westmere E56xx/L56xx/X56xx (Nehalem-C)stepping	: 1
microcode	: 0x1
cpu MHz		: 3696.004
cache size	: 4096 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1				#数量为1核apicid		: 0
initial apicid	: 0
fpu		: yesfpu_exception	: yescpuid level	: 11
wp		: yesflags		: fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc rep_good nopl pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm
bogomips	: 7392.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 43 bits physical, 48 bits virtual
power management:# df -h文件系统        容量  已用  可用 已用% 挂载点
/dev/vda3       8.0G  1.1G  7.0G   13% /
devtmpfs        487M     0  487M    0% /dev
tmpfs           497M     0  497M    0% /dev/shm
tmpfs           497M  6.6M  490M    2% /run
tmpfs           497M     0  497M    0% /sys/fs/cgroup
/dev/vda1      1014M  119M  896M   12% /boot
tmpfs            49M     0   49M    0% /run/user/0

  • 查看宿主机kvm进程:
每一个虚拟机在宿主机上都是一个进程# ps aux |grep kvmroot        492  0.0  0.0      0     0 ?        S<   16:19   0:00 [kvm-irqfd-clean]qemu       2948  4.8 14.8 1597760 573732 ?      Sl   17:41   0:49 /usr/libexec/qemu-kvm -name linux01 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Westmere -m 1024 -realtime mlock=off -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -uuid 9584c1c4-3cf4-48c4-8aae-2268822c0dd1 -display none -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-3-linux01/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/kvm_data/linux01.img,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:48:71:79,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-3-linux01/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
root       2956  0.0  0.0      0     0 ?        S    17:41   0:00 [kvm-pit/2948]

  • 强制关闭虚拟机:
# virsh destroy linux01				#强制关闭虚拟机,等同于断开电源

  • 删除虚拟机:
# virsh undefine linux01				#彻底销毁虚拟机,会删除虚拟机配置文件,但虚拟磁盘不会删除

  • 查看虚拟机的配置文件:
# ls /etc/libvirt/qemulinux01.xml  networks				#linux01.xml就是虚拟机linux01的配置文件# cat /etc/libvirt/qemu/linux01.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 edit linux01
or other application using the libvirt API.
--><domain type='kvm'>
  <name>linux01</name>
  <uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  <vcpu placement='static' current='1'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Westmere</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/linux01.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:48:71:79'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices></domain>

  • 让虚拟机随宿主机开机启动:
# virsh autostart linux01				#虚拟机随宿主机开机启动

  • 解除虚拟机开机启动:
# virsh autostart --disable linux01				#解除虚拟机开机启动

  • 挂起虚拟机:
# virsh suspend linux01				#挂起虚拟机,类似于Windows的睡眠

  • 恢复虚拟机:
# virsh resume linux01				#恢复虚拟机,解除挂起状态


克隆虚拟机

克隆虚拟机,我们在VMware上面操作的时候很方便,接下来我们要在命令行下克隆虚拟机。

  • 克隆需要先关闭虚拟机:
# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     linux01                        running# virsh shutdown linux01域 linux01 被关闭# virsh console linux01错误:域未运行

  • 克隆虚拟机:
# virt-clone --original linux01 --name linux02 --file /kvm_data/linux02.img#		virt-clone 克隆虚拟机;--original 指定克隆源;--name 指定克隆后虚拟机名称;--file 指定新克隆虚拟机的虚拟磁盘路径正在分配 'linux02.img'                              |  10 GB  01:09     

成功克隆 'linux02'。# ls /etc/libvirt/qemu/linux01.xml  linux02.xml  networks				#多出来linux02.xml这个配置文件# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     linux01                        关闭
 -     linux02                        关闭				#多出来linux02这台虚拟机

开启了虚拟机之后,我们可以在宿主机上SSH虚拟机,退出时直接logout,这比使用virsh console 进入虚拟机方便很多。


快照管理

快照,我们可以给虚拟机当前状态做一个记录,这样我们在后面如果遇到什么问题,可以回到我们之前做快照的状态。快照,是在宿主机上给虚拟机做的。

  • 创建快照:
# virsh snapshot-create linux01已生成域快照 1538982866# qemu-img info /kvm_data/linux01.img				#查看linux01的信息,同时会查看到linux01的快照列表image: /kvm_data/linux01.imgfile format: qcow2				#虚拟磁盘格式为qcow2virtual size: 10G (10737418240 bytes)disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1538982866                0 2018-10-08 15:14:26   00:00:00.000				#刚刚做的快照Format specific information:
    compat: 1.1
    lazy refcounts: true

raw格式的虚拟磁盘不支持做快照,qcow2支持做快照。

  • 列出某虚拟机的所有快照:
# virsh snapshot-list linux01				#查看linux01的所有快照
 名称               生成时间              状态
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff

  • 查看当前快照版本:
# virsh snapshot-current linux01				#查看当前状态对应的快照(距离当前状态最近的快照)<domainsnapshot>
  <name>1538982866</name>
  <state>shutoff</state>
  <creationTime>1538982866</creationTime>
  <memory snapshot='no'/>
  <disks>
    <disk name='vda' snapshot='internal'/>
    <disk name='hda' snapshot='no'/>
  </disks>
  <domain type='kvm'>
    <name>linux01</name>
    <uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid>
    <memory unit='KiB'>1048576</memory>
    <currentMemory unit='KiB'>524288</currentMemory>
    <vcpu placement='static' current='1'>2</vcpu>
    <os>
      <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
      <boot dev='hd'/>
    </os>
    <features>
      <acpi/>
      <apic/>
    </features>
    <cpu mode='custom' match='exact' check='partial'>
      <model fallback='allow'>Westmere</model>
    </cpu>
    <clock offset='utc'>
      <timer name='rtc' tickpolicy='catchup'/>
      <timer name='pit' tickpolicy='delay'/>
      <timer name='hpet' present='no'/>
    </clock>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>destroy</on_crash>
    <pm>
      <suspend-to-mem enabled='no'/>
      <suspend-to-disk enabled='no'/>
    </pm>
    <devices>
      <emulator>/usr/libexec/qemu-kvm</emulator>
      <disk type='file' device='disk'>
        <driver name='qemu' type='qcow2'/>
        <source file='/kvm_data/linux01.img'/>
        <target dev='vda' bus='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
      </disk>
      <disk type='file' device='cdrom'>
        <driver name='qemu' type='raw'/>
        <target dev='hda' bus='ide'/>
        <readonly/>
        <address type='drive' controller='0' bus='0' target='0' unit='0'/>
      </disk>
      <controller type='usb' index='0' model='ich9-ehci1'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci1'>
        <master startport='0'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci2'>
        <master startport='2'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
      </controller>
      <controller type='usb' index='0' model='ich9-uhci3'>
        <master startport='4'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
      </controller>
      <controller type='ide' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
      </controller>
      <controller type='virtio-serial' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
      </controller>
      <controller type='pci' index='0' model='pci-root'/>
      <interface type='bridge'>
        <mac address='52:54:00:48:71:79'/>
        <source bridge='br0'/>
        <model type='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      </interface>
      <serial type='pty'>
        <target type='isa-serial' port='0'>
          <model name='isa-serial'/>
        </target>
      </serial>
      <console type='pty'>
        <target type='serial' port='0'/>
      </console>
      <channel type='unix'>
        <target type='virtio' name='org.qemu.guest_agent.0'/>
        <address type='virtio-serial' controller='0' bus='0' port='1'/>
      </channel>
      <input type='mouse' bus='ps2'/>
      <input type='keyboard' bus='ps2'/>
      <memballoon model='virtio'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </memballoon>
    </devices>
  </domain></domainsnapshot>

  • 查看快照配置文件:
# ls /var/lib/libvirt/qemu/snapshot/linux01/1538982866.xml# virsh snapshot-create linux01				#再对linux01创建一个快照已生成域快照 1538983646# ls /var/lib/libvirt/qemu/snapshot/linux01/1538982866.xml  1538983646.xml				#多出来一个快照配置文件# virsh snapshot-list linux01      
 名称               生成时间              状态
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff
 1538983646           2018-10-08 15:27:26 +0800 shutoff

  • 恢复指定快照:
# virsh snapshot-revert linux01 1538982866				#恢复指定快照# virsh snapshot-list linux01
 名称               生成时间              状态
------------------------------------------------------------
 1538982866           2018-10-08 15:14:26 +0800 shutoff
 1538983646           2018-10-08 15:27:26 +0800 shutoff				#恢复前面的快照状态,后面做的快照也不会消失# ls /var/lib/libvirt/qemu/snapshot/linux01/1538982866.xml  1538983646.xml

  • 删除指定快照:
# virsh snapshot-delete linux01 1538982866				#删除指定快照已删除域快照 1538982866# virsh snapshot-list linux01
 名称               生成时间              状态
------------------------------------------------------------
 1538983646           2018-10-08 15:27:26 +0800 shutoff# ls /var/lib/libvirt/qemu/snapshot/linux01/1538983646.xml


虚拟磁盘格式

虚拟磁盘有两种常用格式,分别是 raw 和 qcow2 ,默认格式是qcow2 。其中,qcow2支持做快照,而raw不支持做快照。

  • 查看虚拟磁盘格式:
# qemu-img info /kvm_data/linux01.img				#查看虚拟磁盘格式image: /kvm_data/linux01.imgfile format: qcow2
virtual size: 10G (10737418240 bytes)disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
2         1538983646                0 2018-10-08 15:27:26   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

  • 创建raw格式磁盘:
# qemu-img create -f raw /kvm_data/linux01_2.img 2G#		qemu-img create 创建虚拟磁盘;-f 指定磁盘格式;后面跟磁盘具体路径和大小Formatting '/kvm_data/linux01_2.img', fmt=raw size=2147483648 

# qemu-img info /kvm_data/linux01_2.img     image: /kvm_data/linux01_2.imgfile format: raw
virtual size: 2.0G (2147483648 bytes)disk size: 0

  • 转换磁盘格式:
# qemu-img convert -O qcow2 /kvm_data/linux01_2.img /kvm_data/linux01_2.qcow2#		qemu-img convert 转换磁盘格式;-O 指定目标格式;后面先跟要转换的源磁盘文件,再跟目标磁盘文件。相当于复制,源磁盘文件不发生变化# qemu-img info /kvm_data/linux01_2.qcow2 image: /kvm_data/linux01_2.qcow2file format: qcow2
virtual size: 2.0G (2147483648 bytes)disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

  • 对比两种格式:
# ls -lnth总用量 2.4G
-rw------- 1 107 107 1.2G 10月  8 16:01 linux02.img
-rw-r--r-- 1   0   0 193K 10月  8 15:56 linux01_2.qcow2
-rw-r--r-- 1   0   0 2.0G 10月  8 15:45 linux01_2.img
-rw------- 1   0   0  11G 10月  8 15:33 linux01.img
drwxr-xr-x 2   0   0 4.0K 9月  30 17:35 lost+found# du -sh *0	linux01_2.img
196K	linux01_2.qcow2
1.2G	linux01.img
1.2G	linux02.img
4.0K	lost+found

qcow2格式的磁盘占用多大就显示为多大,而raw格式的磁盘分配给多大就显示为多大,即使并没有占用完。相比较而言,raw格式的磁盘读写性能要比qcow2格式的磁盘更好一些,但raw格式磁盘无法做快照。

  • 更改linux02虚拟磁盘为raw格式并启动:
# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     linux02                        running# virsh shutdown linux02域 linux02 被关闭

# qemu-img convert -O raw /kvm_data/linux02.img /kvm_data/linux02_3.raw# virsh edit linux02				#更改格式和文件路径,类似于vim

      <driver name='qemu' type='raw'/> 
      <source file='/kvm_data/linux02_3.raw'/>

# ll总用量 3597444
-rw-r--r-- 1 root root  2147483648 10月  8 15:45 linux01_2.img
-rw-r--r-- 1 root root      197120 10月  8 15:56 linux01_2.qcow2
-rw------- 1 root root 10739515904 10月  8 15:33 linux01.img
-rw-r--r-- 1 root root 10737418240 10月  8 16:25 linux02_3.raw
-rw------- 1 root root  1229455360 10月  8 16:23 linux02.img
drwxr-xr-x 2 root root        4096 9月  30 17:35 lost+found# virsh start linux02域 linux02 已开始# ll总用量 3597444
-rw-r--r-- 1 root root  2147483648 10月  8 15:45 linux01_2.img
-rw-r--r-- 1 root root      197120 10月  8 15:56 linux01_2.qcow2
-rw------- 1 root root 10739515904 10月  8 15:33 linux01.img
-rw-r--r-- 1 qemu qemu 10737418240 10月  8 16:25 linux02_3.raw				#这里属主属组发生了改变,说明linux02使用的磁盘是这块磁盘文件-rw------- 1 root root  1229455360 10月  8 16:23 linux02.img
drwxr-xr-x 2 root root        4096 9月  30 17:35 lost+found

# virsh snapshot-create linux02       错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照				#这时再来做快照会报错


磁盘扩容(raw)

当虚拟机磁盘空间不足时,需要我们对其扩容,那如何去扩容呢?

  • 增加虚拟磁盘空间:
# qemu-img resize /kvm_data/linux02_3.raw +2G#		qemu-img resize 调整虚拟磁盘大小;+2G 增加2GImage resized.# qemu-img info /kvm_data/linux02_3.raw image: /kvm_data/linux02_3.rawfile format: raw
virtual size: 12G (12884901888 bytes)		#之前是10G,现在是12Gdisk size: 1.1G

但这样还不行,如果这时进入虚拟机linux02查看,会发现还不是12G空间,还需要在宿主机上重启虚拟机。

# virsh shutdown linux02域 linux02 被关闭# virsh start linux02域 linux02 已开始# virsh console linux02连接到域 linux02
换码符为 ^]CentOS Linux 7 (Core)Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密码:
Last login: Mon Oct  8 14:37:53 from 192.168.33.6# fdisk -l磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ad6b3

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

重新分区,但不要破坏原分区。

# fdisk /dev/vda欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):p

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ad6b3

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

命令(输入 m 获取帮助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): p
已选择分区 4
起始 扇区 (20971520-25165823,默认为 20971520):
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823):
将使用默认值 25165823
分区 4 已设置为 Linux 类型,大小设为 2 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ad6b3

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux
/dev/vda4        20971520    25165823     2097152   83  Linux				#这里就是新分出来的2G分区命令(输入 m 获取帮助):q

  • 除了对已有磁盘扩容外,还可以增加新的磁盘:
# qemu-img create -f raw /kvm_data/linux02_4.raw 5GFormatting '/kvm_data/linux02_4.raw', fmt=raw size=5368709120 

# qemu-img info linux02_4.raw image: linux02_4.rawfile format: raw
virtual size: 5.0G (5368709120 bytes)disk size: 0

# virsh edit linux02				#找到部分,粘贴下面内容,相当于多给一块磁盘
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/linux02_4.raw'/>				#路径改变
      <target dev='vdb' bus='virtio'/>				#dev='vdb',不再是'vda'
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08'  function='0x0'/>				#slot改变,不能与上面磁盘的slot相同
    </disk>

# virsh shutdown linux02域 linux02 被关闭# virsh start linux02域 linux02 已开始# virsh console linux02连接到域 linux02
换码符为 ^]CentOS Linux 7 (Core)Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密码:
Last login: Mon Oct  8 16:49:03 on ttyS0# fdisk -l磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ad6b3

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区				#多出来磁盘 /dev/vdbUnits = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘扩容(qcow2)

上面讲的扩容方式是针对raw格式的。针对qcow2格式,在有快照的情况下是无法直接增加虚拟磁盘空间的

# qemu-img resize /kvm_data/linux01.img +2Gqemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize				#这里有报错

除非删除所有快照,然后才可以直接增加磁盘空间。

# virsh snapshot-list linux01
 名称               生成时间              状态
------------------------------------------------------------
 1538983646           2018-10-08 15:27:26 +0800 shutoff# virsh snapshot-delete linux01 1538983646已删除域快照 1538983646# qemu-img resize /kvm_data/linux01.img +2GImage resized.

剩余步骤与上面raw格式的一致。

另外,除了直接增加虚拟磁盘空间外,可以额外增加磁盘,操作方式与raw一致,virsh edit 时都要注意更改source、target、slot 。


调整CPU、内存、网卡

  • 查看虚拟机配置:
# virsh dominfo linux01				#查看虚拟机配置Id:             -
名称:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型:    hvm
状态:       关闭
CPU:          1
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

  • 编辑虚拟机配置文件:
# virsh edit linux01				#编辑虚拟机配置文件<vcpu placement='static' current='2'>2</vcpu># virsh start linux01域 linux01 已开始# virsh dominfo linux01Id:             6
名称:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型:    hvm
状态:       running
CPU:          2				#CPU核数为2CPU 时间:   18.5s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

  • 动态调整内存:
# virsh setmem linux01 800m				#virsh setmem 动态调整内存,增加减小都可以,不需要重启虚拟机# virsh dominfo linux01Id:             6
名称:       linux01
UUID:           9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   19.7s
最大内存: 1048576 KiB
使用的内存: 819200 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

  • 动态调整CPU核数:
# virsh setvcpus linux01 1				#virsh setvcpus 动态调整CPU核数,不需要重启虚拟机错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count				#该方式减小核数会报错,但增加没问题# virsh setvcpus linux01 2

动态调整的前提是提前设置好了最大调整范围,超过这个范围,动态调整不会起作用。

  • 查看网卡:
# virsh domiflist linux01				#查看网卡接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79

  • 增加网卡:
# virsh attach-interface linux01 --type bridge --source virbr0#		virsh attach-interfac 增加网卡;--type 指定连接类型;--source 指定桥接的源网卡成功附加接口# virsh domiflist linux01接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79
vnet2      bridge     virbr0     rtl8139     52:54:00:0c:ac:11

# virsh attach-interface linux01 --type bridge --source br0成功附加接口# virsh domiflist linux01接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:48:71:79
vnet2      bridge     virbr0     rtl8139     52:54:00:0c:ac:11
vnet3      bridge     br0        rtl8139     52:54:00:cf:2f:be

  • 加载配置文件:
# virsh dumpxml linux01 > /etc/libvirt/qemu/linux01.xml				#virsh dumpxml 加载配置文件

上面调整内存、CPU、网卡,没有这一步,下次开机重启后所有配置不会生效。


迁移虚拟机

在生产环境中,我们难免会因为种种原因,需要去迁移虚拟机。

迁移虚拟机需要拷贝两个文件,一个是配置文件,另一个是虚拟磁盘文件。

  • 需要保证虚拟机是关机状态:
# virsh list
 Id    名称                         状态
----------------------------------------------------
 5     linux02                        running
 6     linux01                        running# virsh shutdown linux01域 linux01 被关闭

  • 拷贝配置文件:
# virsh dumpxml linux01 > /etc/libvirt/qemu/linux03.xml				#如果是远程机器,可以使用rsync -av 将配置文件拷贝到远程机器

  • 拷贝磁盘文件:
# virsh domblklist linux01				#查看虚拟机磁盘所在目录目标     源
------------------------------------------------
vda        /kvm_data/linux01.img

# rsync -av /kvm_data/linux01.img /kvm_data/linux03.img				#远程需要加上远程机器ip地址进行拷贝

  • 更改配置文件:
# vi /etc/libvirt/qemu/linux03.xml#		迁移到本机时,配置文件不改会有冲突,如果是远程迁移不需要做修改<domain type='kvm' id='6'>
  <name>linux03</name>
  <uuid>9584c1c4-3cf4-48c4-8aae-2268811c0dd1</uuid>				#随便改下数字,位数不要变

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/linux03.img'/>				#source这里需要修改
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

  • 定义新虚拟机:
# virsh define /etc/libvirt/qemu/linux03.xml				#定义新虚拟机# virsh list --all				#会发现新迁移的linux03虚拟机
 Id    名称                         状态
----------------------------------------------------
 5     linux02                        running
 -     linux01                        关闭
 -     linux03                        关闭

另外,迁移虚拟机时,如果是远程机器,需要远程机器上安装KVM,不然迁移过去也运行不起来。


更多资料参考:

虚拟化KVM

上一篇:KVM虚拟化


下一篇:玩转linux之轻松搭建KVM虚拟化平台