一 、 KVM 介绍 ;
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
① 、它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
②、它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
③ 、它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
④ 、它需要支持虚拟化扩展的 CPU。
⑥ 、它是完全开源的
二 、KVM 架构 ;
KVM 的架构非常简单,KVM 就是一个内核模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux 进程,通过对这个进程的管理就可以完成对虚拟机的管理。
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案,KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
QEMU:修改过的被 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
注意 :KVM 公司使用场景 ;
一般是底层采用 KVM 上层采用 OpenStack ,通过OpenStack 来管理 KVM 的 ;
三 、 KVM 的功能列表 ;
KVM 所支持的功能包括:
① 、支持 CPU 和 memory 超分(Overcommit)
② 、支持半虚拟化 I/O (virtio)
③ 、支持热插拔 (cpu,块设备、网络设备等)
④ 、支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
⑤ 、支持实时迁移(Live Migration)
⑥ 、支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
⑦ 、支持 内核同页合并 (KSM )
⑧ 、支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
四 、 安装部署 KVM ;
安装之前需要确保开启了 BIOS 此功能 ;
4.1 、确保把 disable 改成 enable
4.2 、 配置内存不要少于3G ,配置虚拟机支持KVM虚拟化 ;
4.3 、 基础环境检查 ;
[root@kvm ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@kvm ~]# uname -r
3.10.0-693.el7.x86_64
[root@kvm ~]# getenforce
Disabled
[root@kvm ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@kvm ~]# hostname -I
10.0.0.200 172.16.1.200
[root@kvm ~]#
4.4 、KVM 检查,其实KVM已经内置到了centos7 的内核中 ;
[root@kvm ~]# lsmod |grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
[root@kvm ~]#
[root@kvm ~]# grep -Eo '(vmx|svm)' /proc/cpuinfo
vmx ---->> 这里需要保证 必须要有一个 vmx 一个vmx 表示一个 cpu 也就是一核的 两个表示是两核
[root@kvm ~]#
五 、安装管理kvm 的命令 ;
[root@kvm ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install
查看已经安装的软件包 ;
[root@kvm ~]# rpm -qa|grep -E 'qemu|libvirt|virt'
virt-what-1.13-6.el7.x86_64
libvirt-daemon-driver-storage-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-config-network-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-nodedev-2.0.0-10.el7_3.9.x86_64
libvirt-2.0.0-10.el7_3.9.x86_64
ipxe-roms-qemu-20160127-5.git6366fa7a.el7.noarch
qemu-kvm-common-1.5.3-126.el7_3.10.x86_64
libvirt-client-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-network-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-nwfilter-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-qemu-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-lxc-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-interface-2.0.0-10.el7_3.9.x86_64
libvirt-glib-0.2.3-1.el7.x86_64
virt-manager-common-1.4.0-2.el7.noarch
qemu-kvm-1.5.3-126.el7_3.10.x86_64
virt-manager-1.4.0-2.el7.noarch
qemu-img-1.5.3-126.el7_3.10.x86_64
libvirt-daemon-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-config-nwfilter-2.0.0-10.el7_3.9.x86_64
libvirt-daemon-driver-secret-2.0.0-10.el7_3.9.x86_64
libvirt-python-2.0.0-2.el7.x86_64
virt-install-1.4.0-2.el7.noarch
qemu-kvm-tools-1.5.3-126.el7_3.10.x86_64
[root@localhost ~]#
===========================================================
安装包详解;
python-virtinst-0.600.0-29.el6.noarch # 一套Python的虚拟机安装工具
gpxe-roms-qemu-0.9.7-6.14.el6.noarch # 虚拟机iPXE的启动固件,支持虚拟机从网络启动
virt-manager-0.9.0-29.el6.x86_64 # 基于Libvirt的图像化虚拟机管理软件,需要图形界面操作系统
qemu-img-0.12.1.2-2.479.el6.x86_64 # 用于操作虚拟机硬盘镜像的创建、查看和格式转化
libvirt-python-0.10.2-54.el6.x86_64 # libvirt为Python提供的API
qemu-kvm-0.12.1.2-2.479.el6.x86_64 # KVM在用户空间运行的程序
qemu-kvm-tools-0.12.1.2-2.479.el6.x86_64
libvirt-0.10.2-54.el6.x86_64 # 用于管理虚拟机,它提供了一套虚拟机操作API
libvirt-client-0.10.2-54.el6.x86_64 # Libvirt的客户端,最重要的功能之一就是就在宿主机关机时可以通知虚拟机也关机,使虚拟机系统 正常关机,而不是被强制关机,造成数据丢失
virt-top-1.0.4-3.15.el6.x86_64 # 类似于top命令,查看虚拟机的资源使用情况
virt-what-1.11-1.2.el6.x86_64 # 在虚拟机内部执行,查看虚拟机运行的虚拟化平台
virt-viewer-0.5.6-8.el6.x86_64 # 显示虚拟机的控制台console
5.1 、 启动 libvirtd 服务 ;
[root@kvm ~]# systemctl start libvirtd.service --->> 启动 libvirtd 服务会出现 3 4 网卡信息
[root@kvm ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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 00:0c:29:ed:fb:50 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feed:fb50/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 52:54:00:86:12:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
link/ether 52:54:00:86:12:85 brd ff:ff:ff:ff:ff:ff
[root@kvm ~]#
[root@kvm ~]# systemctl status libvirtd.service --->> 查看服务状态 ;
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-09-21 21:29:26 CST; 1min 23s ago -->> 这里是绿色的表示启动成功 ;
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 18713 (libvirtd)
CGroup: /system.slice/libvirtd.service
├─18713 /usr/sbin/libvirtd
├─18834 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...
└─18835 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...
六 、 开始创建虚拟机 ;
6.1 、创建虚拟硬盘,以后的数据放在哪里 ;
[root@kvm ~]# mkdir -p /application/kvm_data
[root@kvm ~]# cd /application/kvm_data
[root@kvm kvm_data]# qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 10G
[root@kvm kvm_data]# ll -h
total 196K
-rw-r--r-- 1 root root 193K Sep 21 21:35 moban.qcow2
create --->> 创建 ;
-f --->> 指定磁盘格式 ;
moban.qcow2 --->> 虚拟磁盘文件名称 大小为 10G ;
6.2 、查看虚拟磁盘的详细信息 ;
[root@kvm kvm_data]# qemu-img info moban.qcow2
image: moban.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes) ---->> 实际大小
disk size: 196K ---->> 使用中的大小
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@kvm kvm_data]#
6.3 安装虚拟机( 挂载光盘 ) ;
6.4 、创建 挂目录 ;
[root@kvm kvm_data]# mkdir -p /application/tools
[root@kvm kvm_data]# cd /application/tools
[root@kvm kvm_data]# dd if=/dev/sr0 of=/application/tools/CentOS7_2.iso --- >> 挂载镜像
[root@kvm tools]# ll -h
total 4.1G
-rw-r--r-- 1 root root 4.1G Sep 21 22:00 CentOS7_2.iso
[root@kvm tools]#
安装 KVM 图形界面 ;(注意 ; 这里需要一个 VNC 的远程连接软件 )
virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0--noautoconsole --os-type=linux --os-variant=rhel7 --disk
path=/application/kvm_data/moban.qcow2,size=10,format=qcow2
参数注解 ;
--virt-type=kvm --->> 指定 kvm 的虚拟化来安装虚拟机 ;
--name=c72-moban --->> 指定虚拟机的名称 ;
--vcpus=1 --->> 指定cpu 的核数
-r 1024 --->> 指定的是内存 1024 1G 这里最少给1G 少于1G 是看不到图形的 ;
-c --->> 指定了安装镜像的路径 ;
network --->> 指定了网络类型
graphics --->> 指定图形化安装 指定了使用 vnc ;
--os-type=linux --->> 指定linux 系统 ;
--os-variant=rhel7 --->> 指定系统是红帽 7
--disk path --->> 指定了磁盘的系统文件 ;
安装第2台虚拟机需要改动的2 个地方 ;
[root@kvm kvm_data]# virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=10,format=qcow2
Starting install... ------->> 执行以上命令结束之后,到 vnc 界面点击确认确保是可以看到安装页面的表示成功 ;
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
[root@kvm kvm_data]#
之后就是安装系统的界面 。。。。。。。。。。。。。。。。。
VNC 的端口是 5900
七 、 命令行中查看和管理虚拟机的命令 ;
[root@kvm kvm_data]# virsh list --all ---->> 查看正在运行的虚拟机,虚拟机列表
Id Name State
----------------------------------------------------
1 c72-moban running
生成kvm虚拟机: virt-install
查看在运行的虚拟机: virsh list
查看所有虚拟机: virsh list --all
查看kvm虚拟机配置文件: virsh dumpxml name
启动kvm虚拟机: virsh start name
正常关机:virsh shutdown name
非正常关机(相当于物理机直接拔掉电源):virsh destroy name
删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)
根据配置文件定义虚拟机:virsh define file-name.xml
挂起,终止: virsh suspend name
恢复挂起状态: virsh resume name
这两个文件最好长备份一下 ;
KVM 虚拟机在宿主机就是一个进程
当启动第一个虚拟机是用的默认的端口 5900 , 第二个是 5901 依次类推,所以在启动第二台的时候需要加上端口号
磁盘文件格式 ;
八 、虚拟机克隆 ;
8.1 确保虚拟机是关闭状态
[root@kvm kvm_data]# virsh shutdown c72-moban --->> 关闭c72-moban 虚拟机
[root@kvm kvm_data]# virsh list --all
Id Name State
----------------------------------------------------
- c72-moban shut off
8.2 、 克隆
[root@kvm kvm_data]# ls
moban.qcow2
[root@kvm kvm_data]# cp moban.qcow2 clone.qcow2
[root@kvm kvm_data]# ll -h
total 2.1G
-rw-r--r-- 1 root root 1.1G Sep 22 02:25 clone.qcow2
-rw-r--r-- 1 root root 1.1G Sep 22 02:11 moban.qcow2
[root@kvm kvm_data]# pwd
/application/kvm_data
[root@kvm kvm_data]#
root@kvm kvm_data]# virsh dumpxml c72-moban >/tmp/moban.xml --->> 导出模板文件 ;
[root@kvm kvm_data]# cp /tmp/moban.xml{,.ori} --->> 备份模板文件 ;
修改配置文件 ;
uuid 和 mac 随便改几个数字即可,只要保证不一样就行 ;
现在娱有了 虚拟机的新的磁盘文件,需要导入了 ;
[root@kvm tmp]# virsh define moban.xml --->> 导入文件
Domain c72-clone defined from moban.xml
[root@kvm tmp]#
[root@kvm tmp]# virsh list --all
Id Name State
----------------------------------------------------
- c72-clone shut off
- c72-moban shut off
[root@kvm tmp]# virsh start c72-clone --->> 启动这个虚拟机
Domain c72-clone started
[root@kvm tmp]# virsh list --all
Id Name State
----------------------------------------------------
2 c72-clone running
- c72-moban shut off
[root@kvm tmp]#