KVM - 内核虚拟化
一、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 libguestfs-tools
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 autostart --disable 虚拟机名称
8、获取当前路径:virsh pwd
9、查看kvm虚拟机vnc端口号:virsh vncdisplay CentOS-7-x86_64
10、虚拟机xml配置文件路径:/etc/libvirt/qemu
11、虚拟机默认磁盘路径:/var/lib/libvirt/images,当然可以自己定义磁盘存放路径
12、查询虚拟机的mac地址 : virsh dumpxml CentOS-7 | grep 'mac address' |awk -F"'" '{print $2}'
13、根据mac地址查找主机名:
八、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虚拟机网络管理:设置桥接
参考:https://www.cnblogs.com/Zrecret/p/12299128.html
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 NAME=eth0 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 ''
十三、执行virsh命令返回成功信息:中文和英文区分
开机:virsh start kvm_1 Domain kvm_1 started 域 kvm_1 已开始 关闭:virsh shutdown kvm_1 Domain kvm_1 is being shutdown 域 kvm_1 被关闭 断电:virsh destroy kvm_1 Domain kvm_1 destroyed 域 kvm_1 被删除 删除:virsh undefine kvm_1 Domain kvm_1 has been undefined 域 kvm_1 已经被取消定义 暂停:virsh suspend kvm_1 Domain kvm_1 suspended 域 kvm_1 被挂起 恢复:virsh resume kvm_1 Domain kvm_1 resumed 域 kvm_1 被重新恢复 重启:virsh reboot kvm_1 Domain kvm_1 is being rebooted 域 kvm_1 正在被重新启动 克隆:virt-clone -o win2k16 -n Test-1 -f /var/lib/libvirt/images/Test—1.qcow2 Allocating 'Test-3.qcow2' | 80 GB 00:02 Clone 'Test-3' created successfully. if "Clone '{0}' created successfully.".format(kvm_name_clone) or"成功克隆 '{0}'".format(kvm_name_clone) in result['data']: result = '克隆成功。' 定义:virsh define /etc/libvirt/qemu/kvm_1.xml Domain kvm_1 defined from kvm_1 定义域 kvm_1(从 /etc/libvirt/qemu/kvm_1.xml)
十四、在宿主机上修改kvm虚拟机的ip、主机名
1、需要安装guestmount工具
yum install libguestfs-tools -y
2、挂载kvm虚拟机的磁盘文件
guestmount -a /tank/CentOS-7-test1/CentOS-7.qcow2 -i /etc/libvirt/kvm_mount """ /tank/CentOS-7-test1/CentOS-7.qcow2 磁盘路径 /etc/libvirt/kvm_mount 要挂载的目录,没有则创建 """
3、挂载之后修改网卡文件:/etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0
注意:只有挂载成功了之后才能修改网卡文件
注意:路径是否正确
sed -i "/IPADDR/s/=.*/=192.168.1.180/" /etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0 # 修改ip sed -i '/HWADDR/d' /etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0 # 删除MAC地址 echo CentOS-7@test5 > /etc/libvirt/kvm_mount/etc/hostname # 修改主机名
4、修改完成 之后取消挂载:
umount /etc/libvirt/kvm_mount # 取消挂载
5、修改完成,可以启动创建好的虚拟机:ip:192.168.1.180, 主机名:CentOS-7@test5
virsh start CentOS-7@test1
说明:在宿主机上修改kvm虚拟机的ip和主机名,此步骤是为了结合项目的使用需要在宿主机上修改kvm虚拟机的ip和主机名
如果是在本地测试,可以直接使用virsh console CentOS-7@test1 进入虚拟机去虚拟机中修改ip和主机名
十五、宿主机上修改kvm虚拟机密码
需求:要修改Test-1虚拟机的密码,改为123
方式一:通过virt-df
1、安装模块
yum install libguestfs-tools
2、生成新的密码串:openssl passwd -1 -salt 'hello' '123'
说明:openssl是一个加密工具,-1 是指普通加密,hello为key , 123456 才是密码,下面就是是生成的密码串,这样我们只要将这些进行对应的替换就可以了
linux系统的加密密码通常存储在/etc/shadow 文件中
3、修改系统root账户密码:virt-edit -d Test-1 /etc/shadow
保存退出,启动kvm,就可以用新密码进入了,新密码是123
方式二: 通过挂载磁盘修改
1、需要安装guestmount工具 yum install libguestfs-tools -y 2、挂载kvm虚拟机的磁盘文件 guestmount -a /tank/CentOS-7-test1/CentOS-7.qcow2 -i /etc/libvirt/kvm_mount """ /tank/CentOS-7-test1/CentOS-7.qcow2 磁盘路径 /etc/libvirt/kvm_mount 要挂载的目录,没有则创建 """
3、挂载之后修改/etc/shadow文件:/etc/libvirt/kvm_mount/etc/shadow # 只有挂载成功了之后才能修改, 注意路径是否正确 sed -i 's#{旧密码}#{新密码}#g' /etc/libvirt/kvm_mount/etc/shadow # 旧密码替换成新密码
4、修改完成之后取消挂载: umount /etc/libvirt/kvm_mount 5、启动创建好的虚拟机,密码是123
十六、virsh基本命令:
virsh查看kvm
virsh list # 获取当前主机所有虚拟机 virsh domstate <ID or Name or UUID> # 获取虚拟机运行状态 virsh dominfo <ID or Name or UUID> # 获取虚拟机基本信息 virsh domid <Name or UUID> # 根据虚拟机名称或UUID获取ID virsh domname <ID or UUID> # 根据虚拟机ID或UUID获取名称 virsh dommemstat <ID or Name or UUID> # 获取虚拟机内存使用情况 virsh setmem <ID or Name or UUID> # 设置虚拟机内存大小,值不能超过最大分配内存,否则需要关闭虚拟机后设置 virsh vcpuinfo <ID or Name or UUID> # 获取vCPU基本信息 virsh vcpupin <ID or Name or UUID> <vCPU> <pCPU> # 将一个vCPU 绑定到物理CPU virsh setvcpus <ID or Name or UUID> <vCPU num> # 设置虚拟机vCPU 个数 virsh vncdisplay <ID or Name or UUID> # 获取虚拟机的VNC连接参数 virsh create <dom.xml> # 根据XML文件创建虚拟机 virsh define <dom.xml> # 根据XML文件定义虚拟机,但不启动 virsh start <ID or Name or UUID> # 启动(预定义的)虚拟机 virsh suspend <ID or Name or UUID> # 暂停虚拟机 virsh resume <ID or Name or UUID> # 唤醒虚拟机 virsh shutdown <ID or Name or UUID> # 关闭虚拟机 virsh reboot <ID or Name or UUID> # 重启虚拟机 virsh reset <ID or Name or UUID> # 强制重启虚拟机 virsh destory <ID or Name or UUID> # 销毁虚拟机 virsh save <ID> <file.img> # 保存运行中的虚拟机到一个文件 virsh migrate <ID or Name or UUID> <dst url> # 迁移虚拟机 virsh dump <ID or Name or UUID> <core.file> #coredump保存虚拟机到文件 virsh dumpxml <ID or Name or UUID> # 输出虚拟机配置 virsh attach-device <ID or Name or UUID> <device.xml> # 添加设备 virsh detach-device <ID or Name or UUID> <device.xml> # 移除设备 virsh console <ID or Name or UUID> # 连接到虚拟机 virsh autostart <ID or Name or UUID> # 设置虚拟机自动启动 virsh auotstart --disable <ID or Name or UUID> # 取消虚拟机自动启动 virsh pool-list # 获取libvirt管理的存储池 virsh pool-info <pool name> # 获取存储池信息 virsh pool-uuid <pool name> # 获取储存池UUID virsh pool-create <pool.xml> # 根据XML配置文件创建存储池 virsh pool-edit <pool name or uuid> # 编辑存储池配置 virsh pool-destory <pool name or uuid> # 关闭存储池 virsh pool-delete <pool name or uuid> # 删除存储池 virsh vol-list <pool name or uuid> # 获取某个存储池的卷列表 virsh vol-name <vol key or path> # 获取存储卷名称 virsh vol-path --pool <pool name or uuid> <vol name or key> # 获取存储卷路径 virsh vol-create <vol.xml> # 根据XML配置创建存储池 virsh vol-clone <vol name path> <name> # 克隆存储卷 virsh vol-delete <vol name or key or path> # 删除存储卷
virsh查看宿主机
virsh version # 获取libvirt 和hypervisor版本信息 virsh sysinfo # 获取宿主机系统信息 virsh nodeinfo # 获取宿主机CPU,内存,核数等信息 virsh uri # 显示当前连接对象 virsh connect # 连接到指定对象 virsh hostname # 获取宿主机主机名 virsh capabilities # 获取宿主机和虚拟机的架构及特性 virsh freecell # 显示当前MUMA单元空闲内存 virsh nodememstats # 获取宿主机内存使用情况 virsh nodecpustats # 获取宿主机CPU使用情况 virsh qemu-attach # 根据PID添加一个QEMU进程到libvirt中 virsh qemu-monitor-command domain [--hmp] command # 向QEMU monitor发送一个命令 virsh iface-list # 获取宿主机网络接口列表 virsh iface-mac <iface name> # 获取网络接口mac地址 virsh iface-name <mac> # 获取网络接口名称 virsh iface-edit <iface name of uuid> # 编辑网络接口XML配置文件 virsh iface-dumpxml <iface name of uuid> # 输出网络接口XML配置 virsh iface-destory <iface name of uuid> # 关闭网络接口 virsh net-list # 获取libvirt管理的虚拟网络 virsh net-info <net name or uuid> # 获取虚拟网络基本信息 virsh net-uuid <net name> # 获取虚拟网络UUID virsh net-name <net uuid> # 获取虚拟网络名称 virsh net-create <net.xml> # 根据XML配置文件创建虚拟网络 virsh net-edit <net name or uuid> # 编辑虚拟网络信息 virsh net-dumpxml <net name or uuid> # 输出虚拟网络XML配置 virsh net-destory <net name or uuid> # 删除虚拟网络
十七、获取KVM内存、磁盘、CPU使用情况
https://www.cnblogs.com/zhangguosheng1121/p/13719188.html