一、KVM简介
1、概念
KVM,基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。
KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。
KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。
KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。
2、关于KVM
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)同时KVM还能够使用ksm技术帮助宿主服务器节约内存。
在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
二、设置本地虚拟机环境
1、设置大一些的内存
2、修改处理器配置,添加虚拟化引擎(必须要设置)
三、安装KVM所需依赖
1、查看是否存在vmx,存在才能安装kvm虚拟机:grep -E "(vmx|svm)" /proc/cpuinfo
2、查看kvm相关工具包:yum list | grep kvm
3、安装kvm工具包:yum install -y qemu-kvm qumu-kvm-tools libvirt virt-install bridge-utils
4、安装工具包完成之后:设置开机自启动
systemctl start libvirtd
systemctl enable libvirtd
5、执行ifconfig命令:会发现kvm帮你自动创建了一个virbr0的桥接网卡,其中,192.168.122.1地址是不变的
四、创建kvm虚拟机
1、首先下载Centos7镜像,方便后面安装镜像使用
wget -c https://mirrors.aliyun.com/centos-vault/7.1.1503/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso
2、使用tigthVNC工具连接,需要下载此工具:
下载地址:https://www.tightvnc.com/download.php
选择:Installer for Windows (64-bit)
安装:
3、创建虚机镜像:qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G
4、安装虚虚机(注意磁盘和镜像的路径):virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 --cdrom=/opt/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
6、安装操作系统:
用TightVNC工具连接:
跳出界面:移动方向键上下键选择第一个,然后按Tab键,下方出现一行内容,空一格在后面输入 net.ifnames=0 biosdevname=0
(注意:如果连接失败,需要关闭防火墙再次进行连接:systemctl stop firewalld)
以下步骤参照此文档进行安装:https://www.cnblogs.com/zhangguosheng1121/p/13521108.html
以上kvm虚拟机就安装成功。
安装成功之后,此时虚拟机是关闭的状态,不能通过TightVNC连接访问,需要开启虚机,然后再次进行TightVNC连接
五、虚机联网
1、查看所有虚拟机:virsh list --all
2、开启虚拟机:virsh start 虚拟机名称
3、TightVNC连接虚拟机,查看ip
4、设置DNS,联网
修改配置文件:vi /etc/sysconfig/network-scripts/ifcfg-eth0
重启网络:systemctl restart network
查看系统分配的ip:
修改DNS:vi /etc/resolv.conf
查看是否可以上网:ping baidu.com
安装工具:yum install net-tools
六、kvm虚拟机console登录
1、在虚机内操作:用tightVNC连接进入虚拟机
[root@kvm ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@kvm ~]# reboot # 重启
2、在宿主机内操作
[root@admin ~]# virsh console CentOS-7-x86_64
Connected to domain CentOS-7-x86_64
Escape character is ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-229.el7.x86_64 on an x86_64
zgskvm login: root
Password:
Last failed login: Fri Jul 24 08:34:51 CST 2020 on ttyS0
There was 1 failed login attempt since the last successful login.
Last login: Thu Jul 23 17:55:36 on ttyS0
报错解决:
退出虚拟机:快捷键: ctrl+]
七、virsh基本命令
虚拟机管理常用命令
1、备份虚机:virsh dumpxml 虚机名称 > 备份文件名字
2、关闭虚机:virsh shutdown 虚机名称
大前提:使用shutdown关闭虚拟机时,kvm虚拟机需要安装acpid服务,注意是在虚拟机里面安装,不是在宿主机上。
yum install -y acpid
service acpid start
强制关机虚拟机:virsh destroy 虚拟机名称
3、删除虚机:virsh undefine 虚机名称
4、恢复虚机:virsh define 备份文件
5、暂停虚机与恢复暂停的虚机:
6、设置虚拟机自启动:virsh autostart 虚拟机名称
7、关闭虚拟机自启动:virsh auotstart --disable 虚拟机名称
8、获取当前路径:virsh pwd
9、查看kvm虚拟机vnc端口号:virsh vncdisplay CentOS-7-x86_64
10、虚拟机xml配置文件路径:/etc/libvirt/qemu
11、虚拟机默认磁盘路径:/var/lib/libvirt/images,当然可以自己定义磁盘存放路径
八、KVM存储池和存储卷管理
默认储存池路径:/var/lib/libvirt/images
创建基于文件夹的储存池(目录)
定义储存池与其目录:virsh pool-define-as vmdisk --type dir --target /data/vmfs
创建已定义的储存池:virsh pool-build vmdisk
查看已定义的储存池(储存池没有激活无法使用):virsh pool-list --all
激活并自动启动已经定义的储存池:
激活: virsh pool-start vmdisk
自启动: virsh pool-autostart vmdisk
在储存池中创建储存卷: virsh vol-create-as vmdisk 01_CCJ.qcow2 2G --format qcow2
删除储存池中创建的储存卷: virsh vol-delete --pool vmdisk 01_CCJ.qcow2
关闭储存池:virsh pool-destroy vmdisk
获取储存池:virsh pool-list --all
获取储存池信息:virsh pool-info opt
删除储存池:virsh pool-delete vmdisk
取消定义的储存池:virsh pool-undefine vmdisk
获取储存池uuid:virsh pool-uuid vmdisk
编辑储存池配置:virsh pool-edit vmdisk
九、KVM虚拟机磁盘、快照与克隆
1、磁盘镜像文件格式
raw:原始格斯,性能最好,但是不支持快照,创建时会立刻分配空间,不管有没有用到这么多的空间
qcow2:性能上不如raw,但是可以支持快照。创建时只是承诺给你分配空间,只有当你需要空间的时候,才会给你空间,最多只会给你承诺空间的大小,这样可以避免空间浪费
cow(copy on write-写时拷贝)
2、磁盘管理
查看已经创建磁盘信息:qemu-img info CentOS-7-x86_64.raw
检查磁盘有没有问题:qemu-img check CentOS-7-x86_64.qcow2
创建一块qcow2格式的虚拟硬盘:qemu-img create -f qcow2 /opt/CentOS-7-x86_64.qcow2 10G
raw转qcow2格式:(需要注意磁盘镜像文件的路径,转换之前需要创建一块qcow2格式的磁盘,如上)
qemu-img convert -f raw -O qcow2 CentOS-7-x86_64.raw CentOS-7-x86_64.qcow2
转换完成之后,需要更改此虚拟机的配置文件,编辑:virsh edit CentOS-7-x86_64,如下:
注意:修改之后需要重新启动kvm虚拟机
这样就完成了格式的转换,方便进行快照等一系列操作。
3、快照管理(raw格式无法创建快照,安装时是raw格式,需要转换成qcow2格式,参照上述方法转换格式)
查看快照命令:virsh --help | grep snap
创建快照:virsh snapshot-create CentOS-7-x86_64
查看主机快照列表:virsh snapshot-list CentOS-7-x86_64
查看快照信息: virsh snapshot-info CentOS-7-x86_64 --snapshotname 1595568232
还原快照: virsh snapshot-revert CentOS-7-x86_64 --snapshotname 1595568708
删除快照:virsh snapshot-delete CentOS-7-x86_64 --snapshotname 1595568232
查看快照配置文件位置:cd /var/lib/libvirt/qemu/snapshot
4、kvm虚拟机克隆
复制一个虚拟机,需修改如 MAC 地址,名称等所有主机端唯一的配置。虚拟机的内容并没有改变:virt-clone 不修改任何客户机系统内部的配置,它只复制磁盘和主机端的修改。
virt-clone -o CentOS-7-x86_64 -n CentOS-7 -f /var/lib/libvirt/images/CentOS-7.qcow2
注:-o:original 后面跟要克隆的虚拟机名字
-n:name 克隆后虚拟机的名字
-f:file 指定镜像存放的路径
查看原虚拟机与克隆之后的虚拟机xml文件的不同:
十、kvm虚拟机网络管理:设置桥接
1、设置桥接网络
[root@kvm-test ~]# systemctl stop NetworkManager # 停止此服务 [root@kvm-test ~]# virsh iface-bridge ens33 br0 # 执行此命令时,若提示以下信息,不用在意,因为其已经存在了 使用附加设备 br0 生成桥接 ens33 失败 已启动桥接接口 br0
Created bridge br0 with attached device ens33 Bridge interface br0 started
2、查看宿主机网桥:eth0绑定到br0上
3、查看配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE="br0"
NM_CONTROLLED=no
TYPE=Ethernet
cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="10.0.0.200"
NETMASK="255.255.255.0"
GATEWAY="10.0.0.2"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
BOOTPROTO=static
NM_CONTROLLED=no
4、修改kvm虚拟机网络配置:改成桥接模式
virsh edit CentOS-7-x86_64
5、修改kvm虚拟机网卡配置文件:vnc登录进去
vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=no
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
#IPV6INIT=yes
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_PEERDNS=yes
#IPV6_PEERROUTES=yes
#IPV6_FAILURE_FATAL=no
NAME=eth0
#UUID=4a1784c8-64bd-43c4-bc17-fe080d6d788c
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.60
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=8.8.8.8
DNS2=114.114.114.114
重启网络:systemctl restart network
测试:可以ping通网关,可以访问百度,可以使用secureCRT进行连接,则虚拟网桥搭建成功。
十一、安装virt-manager
https://www.cnblogs.com/zhangguosheng1121/p/13521108.html
十二、执行python脚本
#bin/bash import libvirt conn = libvirt.open("qemu:///system") for id in conn.listDomainsID(): dom = conn.lookupByID(id) infos = dom.info() print '' print 'ID = %d'%id print 'Name = %s'%dom.name() print 'Statu = %d' %infos[0] print ''