虚拟化(KVM)
一、虚拟化介绍
1、简介
- 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。
- 虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率。
2、虚拟化的分类
- 全虚拟化:最流行的虚拟化方法使用名为Hypervisor的一种软件,在虚拟服务器和底层硬件之间建立一个抽象层。Hypervisor可以捕获CPU指令,为指令访问硬件控制器和外设充当中介。因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是,Hypervisor 给处理器带来的负荷会很大。
- 半虚拟化:完全虚拟化是处理器密集型技术,因为它要求Hypervisor管理各个虚拟服务器,并让它们彼此独立。减轻这种负担的一种方法就是,改动客户端操作系统,修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,同时让它以为自己运行在虚拟环境下,能够与Hypervisor 协同工作。这种方法就叫准虚拟化(para-virtualization)Xen。
3、虚拟化架构
- Hypervisor直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Xen和VMWare的ESXi 都属于这个类型。
- 物理机上首先安装常规的操作系统,比如 RedHat、Ubuntu和Windows。Hypervisor作为OS上的一个程序模块运行,并对虚拟机进行管理。KVM、VirtualBox和 VMWare Workstation 都属于这个类型。
二、KVM 介绍
1、简介
-
KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, KVM是Linux内核的一个模块,可以直接将 Linux 内核转换为Hypervisor(系统管理程序)从而使得 Linux 内核能够直接管理虚拟机, 直接调用Linux内核中的内存管理、进程管理子系统来管理虚拟机。
-
KVM的虚拟化需要硬件支持(如[Intel VT](https://baike.baidu.com/item/Intel VT)技术或者AMD V技术)。是基于硬件的完全虚拟化。
-
KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能
-
QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所有的硬件,性能不强
-
KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM
磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的
KVM和QEMU-KVM通信是通过/dev/kvm实现的
libvirt是用来管理KVM虚拟机的API,其命令为virsh
2、架构
三、安装 KVM
1、调整虚拟机
- 增加一个至少 20G 的磁盘
- 编辑虚拟机设置>>处理器 右侧的虚拟化引擎中勾选前两个
2、检查 CPU 个数
# free
total used free shared buff/cache available
Mem: 1868660 109492 1521452 8868 237716 1601524
Swap: 2097148 0 2097148
-
检查 cpu 是否开启虚拟化支持:
# grep -Ei "vmx|svm" /proc/cpuinfo //有内容输出即为支持
3、挂载新磁盘
# lsblk //查看是否有新的磁盘 sdb
# mkfs.ext4 /dev/sdb //格式化磁盘
# lsblk -f //查看格式化是否成功,有 UUID J即为成功
# mkdir /kvm_data //创建过载目录
# mount /dev/sdb /kvm_data //将 sdb 挂载到 /kvm/data/
# lsblk -f //查看挂载是否成功
# vim /etc/fstab
[输入内容如下]
/dev/sdb /kvm_data ext4 defaults 0 0
[精致的结尾]
4、关闭防火墙和 selinux
# systemctl stop firewalld
# systemctl disable firewalld
# vi /etc/selinux/config
[修改内容如下]
SELINUX=disabled
[精致的结尾]
#重启虚拟机
# getenforce //打印 Disabled
5、安装 KVM
]# yum install -y virt-* libvirt bridge-utils qemu-img
四、启动 KVM
1、配置网卡
-
增加桥接网卡
# cd /etc/sysconfig/network-scripts/ # cp ifcfg-eno16777736 ifcfg-br0
-
修改桥接网卡ifcfg-br0的内容
[root@kvm network-scripts]# cat ifcfg-br0 [配置内容如下] TYPE=Bridge BOOTROTO=none NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=192.168.235.131 NETMASK=255.255.255.0 GATEWAY=192.168.235.2 DNS1=119.29.29.29 [配置内容如下]
-
修改NAT网卡ifcfg-eno16777736
[root@kvm network-scripts]# cat ifcfg-eno16777736 [配置内容如下] TYPE=Ethernet BOOTPROTO=none NAME=eno16777736 DEVICE=eno16777736 ONBOOT=yes BRIDGE=br0 [配置内容如下]
-
重新启动网卡服务并查看网卡信息
[root@kvm network-scripts]# service network restart Restarting network (via systemctl): [ OK ] [root@kvm network-scripts]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.235.131 netmask 255.255.255.0 broadcast 192.168.235.255 inet6 fe80::20c:29ff:fe08:cf47 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:08:cf:47 txqueuelen 0 (Ethernet) RX packets 36 bytes 2182 (2.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29 bytes 2582 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:08:cf:47 txqueuelen 1000 (Ethernet) RX packets 5607 bytes 1419872 (1.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1360 bytes 124245 (121.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2.、启动libvirtd服务
-
检查 KVM 模块是否加载
[root@kvm ~]# lsmod | grep kvm //lsmod 用于显示已载入系统的模块 kvm_intel 162153 0 kvm 525259 1 kvm_intel
-
启动libvirtd并检查是否成功启动
# systmctl start libvirtd # ps -ef | grp libvirt //有多行输出
-
启动成功后可以看到两个网卡
[root@kvm ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c2908cf47 no eno16777736 virbr0 8000.000000000000 yes
3、命令行安装 CentOS 7
# virt-install --name=test --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-DVD-1511.iso --disk path=/kvm_data/test.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
-
命令解释:
--name:指定虚拟机的名称。
--memory:指定分配给虚拟机的内存资源大小。
maxmemory:指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源。
--vcpus:指定分配给虚拟机的CPU核心数量。
maxvcpus:指定可调节的最大CPU核心数量。
--os-type:指定虚拟机安装的操作系统类型。
--os-variant:指定系统的发行版本。
--location:指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL。
--disk path:指定虚拟硬盘所存放的路径及名称,size则是指定该硬盘的可用大小,单位是G。
--bridge:指定使用哪一个桥接网卡,也就是说使用桥接的网络模式。
--graphics:指定是否开启图形。
--console:定义终端的属性,target_type 则是定义终端的类型。
--extra-args:定义终端额外的参数。
-
以下操作略
五、虚拟机管理
1、KVM 基本管理
-
virsh list --all
查看所有的虚拟机 -
virsh console test
进入指定的虚拟机
若有error: operation failed: Active console session exists for this domain
报错:# ps -ef |grep console root 11167 console test # kill -9 11167
-
virsh shutdown test
关闭虚拟机 -
virsh start test
开启虚拟机 -
virsh destroy test
强制关闭虚拟机 -
virsh undefine test
彻底销毁虚拟机,会删除虚拟机配置文件 -
virsh autostart test
宿主机开机该虚拟机也开机 -
virsh suspend test
挂起 -
virsh autostart --disable test
解除开机启动 -
virsh resume test
恢复
2、克隆虚拟机
# virsh shutdown test //关闭虚拟机,不然会报错
# virt-clone --original test --name test02 --file
/kvm_data/test02.img
- 命令解释:
--original:指定克隆源虚拟机。
--name:指定克隆后的虚拟机名字。
--file:指定目标虚拟机的虚拟磁盘文件。
3、快照管理
virsh snapshot-create test 创建test虚拟机的快照
virsh snapshot-list test 列出test虚拟机的所有快照
virsh snapshot-current test 查看当前虚拟机快照的详细信息
ls /var/lib/libvirt/qemu/snapshot/test/查看test虚拟机所有的快照配置文件
virsh snapshot-revert test 1588485687恢复指定快照
virsh snapshot-delete test 1588485687 删除指定快照
4、磁盘格式
-
qemu-img ifno /kvm_data/test.img 查看虚拟磁盘格式
-
qemu-img create -f raw /kvm_data/test_1.img 2G 创建2GB的 RAW 格式磁盘
# virsh edit test [在 </disk> 下增加如下内容] <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/kvm_data/test02_3.raw'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00'slot='0x09' function='0x0'/> </disk> [主要修改 file 字段 、 slot 字段 dev 字段]
-
qemu-img convert -O qcow2 /kvm_data/test_1.img /kvm_data/test_1.qcow2 更改磁盘格式
# virsh edit test02 [找到这一部分,并修改如下] <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/kvm_data/test02_2.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> [主要更改 file 段和 type 段]
5、磁盘扩容
emu-img resize /kvm_data/test02_2.img +2G 扩容两个G
6、调整 CPU、网卡
-
virsh dominfo test 查看test 虚拟机配置信息
-
编辑虚拟机内存
# virsh edit test [找到如下内容,并修改] <memory unit='KiB'>1048576</memory> //最大内存 <currentMemory unit='KiB'>624288</currentMemory> //可用内存 <vcpu placement='static' current='1'>2</vcpu> //最大cpu [精致的结尾] # virsh destory test //关闭虚拟机 # virsh start test //开启虚拟机 # virsh dominfo test //查看配置是否成功
-
动态修改
# virsh setmem test 800m //修改动态内存 # virsh setvcpus test 2 //动态修改cpu,只可以增加不可以减少 # virsh dumpxml test > /etc/libvirt/qemu/test.xml //需要把配置写入到配置文件里
-
增加新的网卡
# virsh domiflist test //查看网卡列表 #virsh attach-interface test --type bridge --source virbr0 // virbr0 NAT 模式,br0 桥接 # virsh dumpxml test > /etc/libvirt/qemu/test.xml //备份配置文件
7、迁移虚拟机
# virsh shutdown test
# virsh domblklist test //查看虚拟机磁盘所在目录
# virsh dumpxml test > /etc/libvirt/qemu/test03.xml //创造备份文件
# rsync -av /kvm_data/test.img /kvm_data/test03.img
# vi /etc/libvirt/qemu/test03.xml
[修改如下内容]
//修改domname:
//修改uuid(随便改一下数字,位数不要变)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/kvm_data/test03.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
//修改磁盘路径
[精致的结尾]
# virsh define /etc/libvirt/qemu/test03.xml //定义新的虚拟机
# virsh list --all //查看是否有 test03