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。
从虚拟化的实现方式来看,虚拟化架构主要有两种形式:宿主架构和裸金属架构。
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:
[root@lzx ~]# systemctl stop firewalld
[root@lzx ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@lzx ~]# getenforce
Enforcing
[root@lzx ~]# setenforce 0
[root@lzx ~]# vim /etc/selinux/config
SELINUX=enforcing 改为 SELINUX=disabled
- 检查CPU是否支持虚拟化:
[root@lzx ~]# grep -Ei 'vmx|svm' /proc/cpuinfo
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
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的关键字就说明支持虚拟化
- 格式化分区并挂载新增的磁盘:
[root@lzx ~]# 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/sdb
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@lzx ~]# 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
[root@lzx ~]# blkid /dev/sdb //查看未挂载的分区类型
/dev/sdb: UUID="9425d437-b596-453b-8c04-59be24378ceb" TYPE="ext4"
[root@lzx ~]# mkdir /kvm_data
[root@lzx ~]# mount /dev/sdb /kvm_data //挂载
[root@lzx ~]# vim /etc/fstab //新增这一行,让它开机直接挂载
/dev/sdb /kvm_data ext4 defaults 0 0
- 安装kvm:
[root@lzx ~]# yum install -y virt-* libvirt bridge-utils qemu-img
- 增加桥接网卡:
[root@lzx ~]# cd /etc/sysconfig/network-scripts/
[root@lzx network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@lzx network-scripts]# vim ifcfg-br0
TYPE=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
[root@lzx network-scripts]# 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
[root@lzx network-scripts]# systemctl restart network
[root@lzx network-scripts]# ifconfig
br0: 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服务:
[root@lzx network-scripts]# cd
[root@lzx ~]# systemctl start libvirtd
[root@lzx ~]# ps aux |grep libvirtd
root 7716 1.5 0.6 701696 24892 ? Ssl 12:42 0:00 /usr/sbin/libvirtd
[root@lzx ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29134842 no ens33
virbr0 8000.5254006471bc yes virbr0-nic //kvm启动起来的桥接网卡
创建虚拟机安装CentOS7
使用xftp上传CentOS7的镜像文件到虚拟机上,xftp下载地址:https://www.netsarang.com/download/down_form.html?code=623 。
[root@lzx ~]# ls
1.php anaconda-ks.cfg CentOS-7-x86_64-Minimal-1708.iso
[root@lzx ~]# mv CentOS-7-x86_64-Minimal-1708.iso /tmp/
- 安装CentOS7:
[root@lzx ~]# 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定义终端属性
到选择这一步,进行操作
第1项:语言选择 第2项:时间设置
第3项:安装源 第4项:软件选择
第5项:安装目标 第6项:Kdump
第7项:网络设置 第8项:root密码
第9项:是否创建一个普通用户并设置密码
这里其实和我们在VMware Workstation上安装CentOS7类似,只不过换成了命令行下操作
首先选择语言,按下1
再按Enter键,选择68
再选择1,简体中文
语言设置完毕,配置完成的项就会显示为X。往下继续配置时间,按下2
再按下1,设置时区
再按下2,选择亚洲,再按Enter键,选择64,上海,时间设置完毕。
往下设置安装目标,按下5
只有一个选项,按下c,继续
这里默认是2,按下c,继续
选择1,标准分区
按下c,继续,安装目标设置完毕
再来设置root密码,按下8
输入两遍要设置的密码,root密码设置完毕
接下来就不需要再设置了,按下b,开始安装
等待几分钟,安装完毕
按下Enter键,它会自动重启,重启完提示登录
输入账号及密码后登录进来
回到宿主机,按Ctrl + ] 键可以回到宿主机
虚拟机管理
上面已经安装好了一台虚拟机,那么在宿主机命令行下怎么去管理虚拟机呢?
- 查看刚安装的虚拟机的虚拟磁盘:
[root@lzx ~]# 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
[root@lzx ~]# ls /kvm_data/
linux01.img lost+found //linux01.img就是虚拟机linux01的虚拟磁盘
- 列出当前系统所有的虚拟机:
[root@lzx ~]# virsh list --all //不加--all,只会列出开机状态下的虚拟机
Id 名称 状态
----------------------------------------------------
2 linux01 running
- 关闭正在运行的虚拟机:
[root@lzx ~]# virsh shutdown linux01 //关闭正在运行的虚拟机
域 linux01 被关闭
[root@lzx ~]# virsh list
Id 名称 状态
----------------------------------------------------
[root@lzx ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- linux01 关闭
- 开启关闭中的虚拟机:
[root@lzx ~]# virsh start linux01 //开启关闭中的虚拟机
域 linux01 已开始
[root@lzx ~]# virsh list
Id 名称 状态
----------------------------------------------------
3 linux01 running
- 进入开启中的虚拟机:
关闭的虚拟机是无法进入的
[root@lzx ~]# virsh console linux01 //进入开启中的虚拟机
连接到域 linux01
换码符为 ^]
[ 157.307403] random: crng init done
CentOS 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 ~]#
- 设置虚拟机网卡:
[root@localhost ~]# ip addr
1: 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
[root@localhost ~]# dhclient
[root@localhost ~]# ip addr
1: 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
[root@localhost ~]# ping www.qq.com
PING 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核数:
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 480 114 145 6 220 194 //总大小为480M
Swap: 1023 0 1023
[root@localhost ~]# 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 : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : 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:
[root@localhost ~]# 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进程:
每一个虚拟机在宿主机上都是一个进程
[root@lzx ~]# ps aux |grep kvm
root 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]
- 强制关闭虚拟机:
[root@lzx ~]# virsh destroy linux01 //强制关闭虚拟机,等同于断开电源
- 删除虚拟机:
[root@lzx ~]# virsh undefine linux01 //彻底销毁虚拟机,会删除虚拟机配置文件,但虚拟磁盘不会删除
- 查看虚拟机的配置文件:
[root@lzx ~]# ls /etc/libvirt/qemu
linux01.xml networks //linux01.xml就是虚拟机linux01的配置文件
[root@lzx ~]# 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>
- 让虚拟机随宿主机开机启动:
[root@lzx ~]# virsh autostart linux01 //让虚拟机随宿主机开机启动
- 解除虚拟机开机启动:
[root@lzx ~]# virsh autostart --disable linux01 //解除虚拟机开机启动
- 挂起虚拟机:
[root@lzx ~]# virsh suspend linux01 //挂起虚拟机,类似于Windows的睡眠
- 恢复虚拟机:
[root@lzx ~]# virsh resume linux01 //恢复虚拟机,解除挂起状态
克隆虚拟机
克隆虚拟机,我们在VMware上面操作的时候很方便,接下来我们要在命令行下克隆虚拟机。
- 克隆需要先关闭虚拟机:
[root@lzx ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 linux01 running
[root@lzx ~]# virsh shutdown linux01
域 linux01 被关闭
[root@lzx ~]# virsh console linux01
错误:域未运行
- 克隆虚拟机:
[root@lzx ~]# virt-clone --original linux01 --name linux02 --file /kvm_data/linux02.img //virt-clone 克隆虚拟机;--original 指定克隆源;--name 指定克隆后虚拟机名称;--file 指定新克隆虚拟机的虚拟磁盘路径
正在分配 'linux02.img' | 10 GB 01:09
成功克隆 'linux02'。
[root@lzx ~]# ls /etc/libvirt/qemu/
linux01.xml linux02.xml networks //多出来linux02.xml这个配置文件
[root@lzx ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- linux01 关闭
- linux02 关闭 //多出来linux02这台虚拟机
开启了虚拟机之后,我们可以在宿主机上SSH虚拟机,退出时直接logout,这比使用virsh console 进入虚拟机方便很多。
快照管理
快照,我们可以给虚拟机当前状态做一个记录,这样我们在后面如果遇到什么问题,可以回到我们之前做快照的状态。快照,是在宿主机上给虚拟机做的。
- 创建快照:
[root@lzx ~]# virsh snapshot-create linux01
已生成域快照 1538982866
[root@lzx ~]# qemu-img info /kvm_data/linux01.img //查看linux01的信息,同时会查看到linux01的快照列表
image: /kvm_data/linux01.img
file format: qcow2 //虚拟磁盘格式为qcow2
virtual 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支持做快照。
- 列出某虚拟机的所有快照:
[root@lzx ~]# virsh snapshot-list linux01 //查看linux01的所有快照
名称 生成时间 状态
------------------------------------------------------------
1538982866 2018-10-08 15:14:26 +0800 shutoff
- 查看当前快照版本:
[root@lzx ~]# 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>
- 查看快照配置文件:
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml
[root@lzx ~]# virsh snapshot-create linux01 //再对linux01创建一个快照
已生成域快照 1538983646
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml 1538983646.xml //多出来一个快照配置文件
[root@lzx ~]# virsh snapshot-list linux01
名称 生成时间 状态
------------------------------------------------------------
1538982866 2018-10-08 15:14:26 +0800 shutoff
1538983646 2018-10-08 15:27:26 +0800 shutoff
- 恢复指定快照:
[root@lzx ~]# virsh snapshot-revert linux01 1538982866 //恢复指定快照
[root@lzx ~]# virsh snapshot-list linux01
名称 生成时间 状态
------------------------------------------------------------
1538982866 2018-10-08 15:14:26 +0800 shutoff
1538983646 2018-10-08 15:27:26 +0800 shutoff //恢复前面的快照状态,后面做的快照也不会消失
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538982866.xml 1538983646.xml
- 删除指定快照:
[root@lzx ~]# virsh snapshot-delete linux01 1538982866 //删除指定快照
已删除域快照 1538982866
[root@lzx ~]# virsh snapshot-list linux01
名称 生成时间 状态
------------------------------------------------------------
1538983646 2018-10-08 15:27:26 +0800 shutoff
[root@lzx ~]# ls /var/lib/libvirt/qemu/snapshot/linux01/
1538983646.xml
虚拟磁盘格式
虚拟磁盘有两种常用格式,分别是 raw 和 qcow2 ,默认格式是qcow2 。其中,qcow2支持做快照,而raw不支持做快照。
- 查看虚拟磁盘格式:
[root@lzx ~]# qemu-img info /kvm_data/linux01.img //查看虚拟磁盘格式
image: /kvm_data/linux01.img
file 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格式磁盘:
[root@lzx ~]# 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
[root@lzx ~]# qemu-img info /kvm_data/linux01_2.img
image: /kvm_data/linux01_2.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
- 转换磁盘格式:
[root@lzx ~]# qemu-img convert -O qcow2 /kvm_data/linux01_2.img /kvm_data/linux01_2.qcow2 //qemu-img convert 转换磁盘格式;-O 指定目标格式;后面先跟要转换的源磁盘文件,再跟目标磁盘文件。相当于复制,源磁盘文件不发生变化
[root@lzx ~]# qemu-img info /kvm_data/linux01_2.qcow2
image: /kvm_data/linux01_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
- 对比两种格式:
[root@lzx kvm_data]# 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
[root@lzx kvm_data]# 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格式并启动:
[root@lzx kvm_data]# virsh list
Id 名称 状态
----------------------------------------------------
2 linux02 running
[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被关闭
[root@lzx kvm_data]# qemu-img convert -O raw /kvm_data/linux02.img /kvm_data/linux02_3.raw
[root@lzx kvm_data]# virsh edit linux02 //更改格式和文件路径,类似于vim
<driver name='qemu' type='qcow2'/> 改为 <driver name='qemu' type='raw'/>
<source file='/kvm_data/linux02.img'/> <source file='/kvm_data/linux02_3.raw'/>
[root@lzx kvm_data]# 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
[root@lzx kvm_data]# virsh start linux02
域 linux02 已开始
[root@lzx kvm_data]# 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
[root@lzx kvm_data]# virsh snapshot-create linux02
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照 //这时再来做快照会报错
磁盘扩容(raw)
当虚拟机磁盘空间不足时,需要我们对其扩容,那如何去扩容呢?
- 增加虚拟磁盘空间:
[root@lzx kvm_data]# qemu-img resize /kvm_data/linux02_3.raw +2G //qemu-img resize 调整虚拟磁盘大小;+2G 增加2G
Image resized.
[root@lzx kvm_data]# qemu-img info /kvm_data/linux02_3.raw
image: /kvm_data/linux02_3.raw
file format: raw
virtual size: 12G (12884901888 bytes) //之前是10G,现在是12G
disk size: 1.1G
但这样还不行,如果这时进入虚拟机linux02查看,会发现还不是12G空间,还需要在宿主机上重启虚拟机
[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被关闭
[root@lzx kvm_data]# virsh start linux02
域 linux02 已开始
[root@lzx kvm_data]# 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
[root@localhost ~]# 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
重新分区,但不要破坏原分区
[root@localhost ~]# 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
- 除了对已有磁盘扩容外,还可以增加新的磁盘:
[root@lzx kvm_data]# qemu-img create -f raw /kvm_data/linux02_4.raw 5G
Formatting '/kvm_data/linux02_4.raw', fmt=raw size=5368709120
[root@lzx kvm_data]# qemu-img info linux02_4.raw
image: linux02_4.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0
[root@lzx kvm_data]# virsh edit linux02 //找到<disk type='file' device='disk'>部分,粘贴下面内容,相当于多给一块磁盘
<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>
[root@lzx kvm_data]# virsh shutdown linux02
域 linux02 被关闭
[root@lzx kvm_data]# virsh start linux02
域 linux02 已开始
[root@lzx kvm_data]# 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
[root@localhost ~]# 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/vdb
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘扩容(qcow2)
上面讲的扩容方式是针对raw格式的。针对qcow2格式,在有快照的情况下是无法直接增加虚拟磁盘空间的
[root@lzx kvm_data]# qemu-img resize /kvm_data/linux01.img +2G
qemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize //这里有报错
除非删除所有快照,然后才可以直接增加磁盘空间
[root@lzx kvm_data]# virsh snapshot-list linux01
名称 生成时间 状态
------------------------------------------------------------
1538983646 2018-10-08 15:27:26 +0800 shutoff
[root@lzx kvm_data]# virsh snapshot-delete linux01 1538983646
已删除域快照 1538983646
[root@lzx kvm_data]# qemu-img resize /kvm_data/linux01.img +2G
Image resized.
剩余步骤与上面raw格式的一致
另外,除了直接增加虚拟磁盘空间外,可以额外增加磁盘,操作方式与raw一致,virsh edit 时都要注意更改source、target、slot 。
调整CPU、内存、网卡
- 查看虚拟机配置:
[root@lzx kvm_data]# virsh dominfo linux01 //查看虚拟机配置
Id: -
名称: linux01
UUID: 9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型: hvm
状态: 关闭
CPU: 1
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
- 编辑虚拟机配置文件:
[root@lzx kvm_data]# virsh edit linux01 //编辑虚拟机配置文件
<vcpu placement='static' current='1'>2</vcpu> 改为 <vcpu placement='static' current='2'>2</vcpu>
[root@lzx kvm_data]# virsh start linux01
域 linux01 已开始
[root@lzx kvm_data]# virsh dominfo linux01
Id: 6
名称: linux01
UUID: 9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型: hvm
状态: running
CPU: 2 //CPU核数为2
CPU 时间: 18.5s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
- 动态调整内存:
[root@lzx kvm_data]# virsh setmem linux01 800m //virsh setmem 动态调整内存,增加减小都可以,不需要重启虚拟机
[root@lzx kvm_data]# virsh dominfo linux01
Id: 6
名称: linux01
UUID: 9584c1c4-3cf4-48c4-8aae-2268822c0dd1
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 19.7s
最大内存: 1048576 KiB
使用的内存: 819200 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
- 动态调整CPU核数:
[root@lzx kvm_data]# virsh setvcpus linux01 1 //virsh setvcpus 动态调整CPU核数,不需要重启虚拟机
错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count //该方式减小核数会报错,但增加没问题
[root@lzx kvm_data]# virsh setvcpus linux01 2
动态调整的前提是提前设置好了最大调整范围,超过这个范围,动态调整不会起作用。
- 查看网卡:
[root@lzx kvm_data]# virsh domiflist linux01 //查看网卡
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:48:71:79
- 增加网卡:
[root@lzx kvm_data]# virsh attach-interface linux01 --type bridge --source virbr0 //virsh attach-interfac 增加网卡;--type 指定连接类型;--source 指定桥接的源网卡
成功附加接口
[root@lzx kvm_data]# virsh domiflist linux01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:48:71:79
vnet2 bridge virbr0 rtl8139 52:54:00:0c:ac:11
[root@lzx kvm_data]# virsh attach-interface linux01 --type bridge --source br0
成功附加接口
[root@lzx kvm_data]# 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
- 加载配置文件:
[root@lzx kvm_data]# virsh dumpxml linux01 > /etc/libvirt/qemu/linux01.xml //virsh dumpxml 加载配置文件
上面调整内存、CPU、网卡,没有这一步,下次开机重启后所有配置不会生效。
迁移虚拟机
在生产环境中,我们难免会因为种种原因,需要去迁移虚拟机。
迁移虚拟机需要拷贝两个文件,一个是配置文件,另一个是虚拟磁盘文件。
- 需要保证虚拟机是关机状态
[root@lzx kvm_data]# virsh list
Id 名称 状态
----------------------------------------------------
5 linux02 running
6 linux01 running
[root@lzx kvm_data]# virsh shutdown linux01
域 linux01 被关闭
- 拷贝配置文件
[root@lzx kvm_data]# virsh dumpxml linux01 > /etc/libvirt/qemu/linux03.xml //如果是远程机器,可以使用rsync -av 将配置文件拷贝到远程机器
- 拷贝磁盘文件
[root@lzx kvm_data]# virsh domblklist linux01 //查看虚拟机磁盘所在目录
目标 源
------------------------------------------------
vda /kvm_data/linux01.img
[root@lzx kvm_data]# rsync -av /kvm_data/linux01.img /kvm_data/linux03.img //远程需要加上远程机器ip地址进行拷贝
- 更改配置文件:
[root@lzx kvm_data]# vi /etc/libvirt/qemu/linux03.xml //迁移到本机时,配置文件不改会有冲突,如果是远程迁移不需要做修改
<domain type='kvm' id='6'> 改为 <domain type='kvm' id='6'>
<name>linux01</name> <name>linux03</name>
<uuid>9584c1c4-3cf4-48c4-8aae-2268822c0dd1</uuid> 改为 <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>
- 定义新虚拟机:
[root@lzx kvm_data]# virsh define /etc/libvirt/qemu/linux03.xml //定义新虚拟机
[root@lzx kvm_data]# virsh list --all //会发现新迁移的linux03虚拟机
Id 名称 状态
----------------------------------------------------
5 linux02 running
- linux01 关闭
- linux03 关闭
另外,迁移虚拟机时,如果是远程机器,需要远程机器上安装KVM,不然迁移过去也运行不起来。