首页 > 技术文章 > KVM - 内核虚拟化

zhangguosheng1121 2020-07-21 16:02 原文

一、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
View Code

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
View Code

报错解决:

退出虚拟机:快捷键: 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
View Code

2、查看宿主机网桥:eth0绑定到br0上

3、查看配置文件

cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BRIDGE="br0"
NM_CONTROLLED=no
TYPE=Ethernet
View Code

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
View Code

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
View Code

重启网络: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 ''
View Code

 

十三、执行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)
View Code

 

十四、在宿主机上修改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>   # 删除存储卷
kvm虚拟机信息

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

 

推荐阅读