KVM(Kernel-Based Virtual Machine)虚拟化服务


什么是虚拟化?

虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
这个主要是通过一个叫做 Hypervisor 的程序实现的。

虚拟化的分类

①Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

②物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。
KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

理论上讲:
①号虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
②号虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

KVM的介绍

KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

那 IO 的虚拟化,比如存储和网络设备由谁实现呢?
这个就交给 Linux 内核和Qemu来实现。

Hypervisor
Hypervisor是一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟机监视器。hypervisor是所有虚拟化技术的核心,非中断的支持多工作负载迁移是hypervisor的基本功能。当服务器启动并执行hypervisor时,会给每一台虚拟机分配适量的内存,cpu,网络和磁盘资源,并且加载所有虚拟机的客户操作系统。

说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

Libvrit

Libvirt是KVM的管理工具,Libvirt包含3个组成部分:后台daemon程序libvirtd、API库、和命令行工具virsh
①libvirtd是服务程序,接收和处理API请求;
②API库是可以基于libvirt的开发工具,例如vir-manager
③virsh是KVM的命令行工具,比如在实际生产中,图形界面无法使用或无法通过vnc链接云主机时,可以通过virsh命令行进行操作。

KVM的安装

查看系统是否支持虚拟化

cat /proc/cpuinfo | egrep 'vmx|svm' | wc -l

输出
64

如果为0表示不支持虚拟化

查看是否加载KVM

lsmod | grep kvm

输出
kvm_intel 188688 20
kvm 636965 1 kvm_intel
irqbypass 13503 11 kvm

没有加载请加载

modprobe kvm

表示已加载

安装KVM


图形化安装

virt-manager

物理机需要安装配置Xserver、Xmanager图形化远程管理工具


命令行安装

yum install kvm qemu-kvm qemu-img \
virt-manager libvirt libvirt-python \
libvirt-client virt-install virt-viewer -y

qemu-kvm(用户态管理工具),libvirt(命令行管理工具),virt-install(安装kvm工具)

关闭selinux

setenforce 0
vim /etc/sysconfig/selinux

修改为
SELINUX=disabled

启动libvirtd服务

systemctl enable libvirtd
systemctl start libvirtd

关闭NetworkManager服务

chkconfig NetworkManager off
systemctl stop NetworkManager

桥接设备关联网卡

virsh iface-bridge eno3 br0

查看是否成功

brctl show

创建存放镜像与存储盘目录

mkdir -p /data/images
mkdir -p /data/iso

创建虚拟机
安装kvm虚拟机的需求:硬盘,光盘镜像。

  • 创建的虚拟机内存大小不能超过物理机的大小;
  • 创建的虚拟机不需要每次都安装启动,只需要通过镜像进行启动。
qemu-img create -f raw /data/images/centos01.raw 10G

输出
Formatting '/data/images/centos01.raw', fmt=raw size=10737418240

以上是raw镜像格式创建虚拟机磁盘空间,推荐使用qcow2

raw

"raw" 镜像格式是最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使用dd 命令将 /dev/sda 内容拷贝到一个文件。
raw唯一的缺点在于,ls看起来很大,在scp的时候,这会消耗很多的网络IO,而tar这么大的文件,也是很耗时间跟CPU的,一个解决方法是,把raw转换成qcow2的格式,对空间压缩就很大了。而且速度很快。转换命令如下:

raw转qcow2

qemu-img convert -O qcow2 centos01.raw centos01.qcow2

qcow2转raw

qemu-img convert -O raw centos01.qcow2 centos01.raw

这样转换所消耗的时间远比tar.gz小。

qcow2

qcow2 (QEMU 写时复制版本2)格式通常是KVM使用,相比裸格式,它有额外的特性
例如:

  • 使用稀疏文件呈现方式,因此镜像尺寸更小。
  • 支持快照。
    因为qcow2 镜像是稀疏的,因此,qcow2镜像通常比裸格式镜像小,更小的 文件意味着上传更快,因此通常转换裸格式镜像到qcow2格式上传比直接 上传裸格式镜像文件更快。
qemu-img create -f qcow2 /data/images/centos01.img 10G

输出
Formatting '/data/images/centos01.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off

virt-install --connect qemu:///system \
-n vm10 \
-r 1024 \
--vcpus=2 \
--virt-type kvm \
--disk path=/data/images/centos01.img,size=10 \
-c /data/iso/CentOS-7-x86_64-Minimal-2009.iso \
--graphics vnc,port=5900,listen=0.0.0.0 \
--noautoconsole \
--os-type linux \
--accelerate \
--network=bridge:br0 \
--hvm \
--autostart

输出
Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

参数说明
-n 虚拟机名称
-r 执行内存,单位M
--vcpus=8 #虚拟CPU数量
--connect qemu:///system #以root用户身份运行 qemu:///session 以非root用户身份运行
--accelerate #KVM内核加速(如果支持)建议加上
--noautoconsole 不自动连接控制台
--virt-type kvm #指定虚拟机类型“kvm、qemu、xen”(默认是KVM)
--os-type=linux 指定系统类型(linux or windows)
--autostart 指定虚拟机是否在物理启动后自动启动
--network=bridge:br0 使用桥接网络 default 使用默认网络
--disk 磁盘配置 path指定位置,如果没有会自动创建,size指定磁盘大小,单位G
--hvm 完全虚拟化
--graphics 指定guest图像显示配置,默认vnc,端口默认从5900开始,listen默认127.0.0.1

快速使用TightVNC连接虚拟机,在安装页面按"Tab"键,在文本最后输入:net.ifnames=0 biosdevname=0,更改网卡名称为eth0.按"Enter"进入安装。`


KVM常用命令

启动虚拟机

virsh start centos02

进入虚拟机

virsh console centos02

此时会卡住,需要让ttyS0允许登陆系统,如果没卡当我没说

echo "ttyS0" >> /etc/securetty
grubby --update-kernel=ALL --args="console=ttyS0"
reboot

停止虚拟机

virsh shutdown centos01

虚拟机强制断电

virsh destroy centos01

删除虚拟机

virsh undefine centos01

退出虚拟机

ctrl+]

编辑虚拟机xml配置

virsh edit kvmtest

克隆虚拟机

virt-clone -o centos01 -n centos02 -f ./centos02.img

-o 指定源虚拟机名称
-n 指定新虚拟机名称
-f 指定存储新虚拟机的文件路径

总结思路

1.创建虚拟磁盘
2.通过virt-install安装一台虚拟机
3.通过TightVNC客户端工具连接到192.168.56.11:5900进行安装操作,默认qumu-kvm的端口是5900端口,端口从5900计算.

删除KVM创建的桥接网卡

brctl show
ifconfig br0 down
brctl delbr br0
systemctl restart network
# KVM 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×