KVM——虚拟化

KVM——虚拟化
 
虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。
在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,
并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率。
虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,
使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
 
虚拟化层次种类

(1) 完全虚拟化 — 最流行的虚拟化方法使用名为 hypervisor 的一种软件,在虚拟服务器和底层硬件之间建立一个抽象层。
VMware 和微软的VirtualPC 是代表该方法的两个商用产品,而基于核心的虚拟机 (KVM) 是面向 Linux 系统的开源产品hypervisor
可以捕获 CPU 指令,为指令访问硬件控制器和外设充当中介。
因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。
主要缺点是, hypervisor 给处理器带来开销。
(2)准虚拟化 — 完全虚拟化是处理器密集型技术,因为它要求 hypervisor管理各个虚拟服务器,并让它们彼此独立。
减轻这种负担的一种方法就是,改动客户端操作系统,让它以为自己运行在虚拟环境下,能够与hypervisor 协同工作。
这种方法就叫准虚拟化 (para-virtualization)Xen 是开源准虚拟化技术的一个例子。
操作系统作为虚拟服务器在 Xen hypervisor 上运行之前,它必须在核心层面进行某些改变。
因此, Xen 适用于 BSD 、 Linux 、 Solaris 及其他开源操作系统,但不适合对像Windows 这些专有的操作系统进行虚拟化处理,因为它们无法改动。
准虚拟化技术的优点是性能高。经过准虚拟化处理的服务器可与hypervisor 协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。
准虚拟化与完全虚拟化相比优点明显,以至于微软和 VMware 都在开发这项技术,以完善各自的产品。
(3)系统虚拟化 — 就操作系统层的虚拟化而言,没有独立的hypervisor 层。
相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。
一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统 ( 不过每个实例有各自的应用程序和用户。
账户 ) 。虽然操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。
此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。
(4)桌面虚拟化 — 服务器虚拟化主要针对服务器而言,而虚拟化最接近用户的还是要算的上桌面虚拟化了,
桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。
桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新。
终端数据可以集中存储在中心机房里,安全性相对传统桌面应用要高很多。
桌面虚拟化可以使得一个人拥有多个桌面环境,也可以把一个桌面环境供多人使用。
 
KVM
 
全称是基于内核的虚拟机(Kernel-based Virtual Machine)
是一个开源软件,基于内核的虚拟化技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用虚拟技术,
该内核模块使得 Linux 变成了一个Hypervisor,虚拟机使用 Linux 自身的调度器进行管理。
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。
KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。
这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,
需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。
目前这个应用程序是 QEMU。
 
安装kvm前准备工作
1. 确定处理器有 VT
命令行: grep vmx /proc/cpuinfo (INTEL 芯片 )
grep svm /proc/cpuinfo (AMD 芯片 )
cat /proc/cpuinfo | grep -e vmx -e nx -e svm
不知道芯片的生产厂商则输入:egrep ‘(vmx|svm)’ /proc/cpuinfo
如果 flags: 里有 vmx 或者 svm 就说明支持 VT ;如果没有任何的输出,说明你的 cpu 不支持,将无法成功安装 KVM 虚拟机。
[jerry@centos ~]$ egrep "svm|vmx" /proc/cpuinfo | wc -l
24
2. 当你硬件本身支持虚拟化,但查询相应参数无果时,请检查 BIOS 设定,确认你的 BIOS 中开启了硬件支持虚拟化的功能!
将如下选项设为Enabled
Intel(R) Virtualization Tech [Enabled]
 
安装kvm:
yum install kvm virt-manager virt-install  libvirt libvirt-python python-virtinst libvirt-client qemu-kvm qemu-img -y
kvm虚拟化所需组件介绍
kvm: 核心套件
virt-manager: 图形化 KVM 管理软件,也就是说你要有图形化的操作界面。
libvirt: 提供虚拟机与宿主相互通信的机制
libvirt-python: 允许使用 libvirt API
python-virtinst:CLI 下创建 KVM 的工具
libvirt-client: 提供 client 访问 kvm 服务器的机制 ,并包含 virsh 命令进行管理和控制 VMs
qemu-kvm: 提供用户级 KVM 环境
qemu-img:VMs 磁盘管理
virt-install 克隆虚拟机
 
启动kvm:
modprobe kvm   #kvm是内置的模块,使用时加载即可
lsmod | grep kvm
systemctl restart libvirtd
systemctl enable libvirtd
virsh list --all   #启动并检测kvm

KVM网络模式设置
 
1. NAT ( 默认上网 ) :虚拟机利用 host 机器的 ip 进行上网 . 对外显示一个 ip,
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能,默认ip为192.168.122.1
2. 自带的Bridge : 将虚拟机桥接到 host 机器的网卡上 ,vm和 host 机器都通过 bridge 上网 . 对外有同网段的不同ip,此种方式host却不能和vm联通
3. Linux Bridge : 基本原理就是创建一个桥接接口 br0 ,在物理网卡和虚拟网络接口之间传递数据。此种方式host却可以和vm联通
Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。
多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备
 
kvm虚拟机管理:
#前提是已经安装了图形化操作系统,但如果没有图形化的操作系统,一样可以通过命令行来管理虚拟。
要升级为图形化操作系统:
yum groupinstall "X Window System"  -y
yum groupinstall "GNOME Desktop" "Graphical Administration Tools" -y
#建议搭建本地yum仓库,否则受网速限制,下载耗时长。
通过命令 startx 进入图形界面,第一次进入会比较慢,请耐心等待。(可能需要重启)
virt-manager  #启动图形界面,使用图形界面创建虚机。
创建好虚机之后,通过virsh list --all 来查看。
virsh list --all #只能查看在本机的虚拟机
如果想要查看其他服务器上的虚拟机,那么也可以通过virt-manager来实现。
只需要添加进来即可:File —— Add Connection —— 通过ssh连接 —— 点击链接
可能会提示安装如下的软件在本机,在本机安装即可:
[root@centos ~]# yum install openssh-askpass -y
如果一直出现输入密码的窗口,那么你可能需要ssh免密。
有些情况下,有一个要配置的地方。 因为 KVM(准确说是 Libvirt)默认不接受远程管理,需要按下面的内容配置被管理宿主机中的两个文件:
vim /etc/default/libvirt-bin
start_libvirtd=”yes”
libvirtd_opts=”-d -l”
vim /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
unix_sock_group = “libvirtd”
unix_sock_ro_perms = “0777”
unix_sock_rw_perms = “0770”
auth_unix_ro = “none”
auth_unix_rw = “none”
auth_tcp = “none”
然后重启 Libvirtd 服务就可以远程管理了。
systemctl restart libvirt-bin
 
virsh命令行下管理虚拟机

virsh 既有命令行模式,也有交互模式,在命令行直接输入 virsh 就进入交互模式, virsh 后面跟命令参数,则是命令行模式;
如果不会使用可以--help查看帮助手册。
virsh list           列出当前宿主机上处于运行状态的虚拟机
virsh list –all    列出当前宿主机上所有的虚拟机
virsh start vm1 (虚拟机name) 开启某一台虚拟机
virsh shutdown vm1   (虚拟机name) 正常关闭一台虚拟机
virsh destroy vm1      强制关闭某一台虚拟机
virsh autostart vm1    开机自启动虚拟机vm1
virsh autostart  –disable vm1 关闭开机自启动
virsh edit vm1   编辑某个虚拟机的配置文件
virsh pool-list   列出存储池
#将iso镜像放在/var/lib/libvirt/images/目录下
virsh pool-destroy ken  #删除存储池
qemu-img create -f qcow2 -o size=50G /export/kvm/test.qcow2
创建一个大小为 50G 的,格式为 qcow2 的磁盘镜像
查看磁盘信息:
qemu-img info /export/kvm/test.qcow2
 
命令行下创建 && 管理虚拟机
Virt-install:命令行下创建虚拟机的命令,不过在它后面需要跟上很多的参数
-–name: 虚拟机的名字。
-–disk Location: 磁盘映像的位置。
-–graphics : 怎样连接 VM ,通常是 SPICE 。
-–vcpu : 虚拟 CPU 的数量。
-–ram : 以兆字节计算的已分配内存大小。
-–location : 指定安装源路径
-–network : 指定虚拟网络,通常是 virbr0 或者自己设定的 br0
例如:
virt-install –-name=test -–disk path=/export/kvm/test.qcow2 -–ram=1024 –-vcpus=1 –-graphics spice
–-location=/export/download/software/iso/CentOS-7.3-x86_64-DVD.iso -–network bridge=br0
注:以此安装操作之后,会在桌面显示一个 virtviewer ,进入到安装步骤
ssh连接下安装:
qemu-img create -f qcow2 /var/lib/libvirt/imags/ken.qcow2 10G
virt-install --name=test --disk path=/var/lib/libvirt/images/test.qcow2 --ram=1024 --vcpus=1 --nographics --location=/tmp/CentOS-7-x86_64-Minimal-1810.iso
--extra-args='console=ttyS0' --network bridge=br0

除了这些简单命令,实际在 virsh 形式下还有更多的命令:
virsh help     打印帮助
virsh attach-device      从一个 XML 文件附加装置
virsh attach-disk          附加磁盘设备
virsh attach-interface   获得网络界面
virsh destroy                删除一个域
virsh detach-device      从一个 XML 文件分离设备
virsh detach-disk         分离磁盘设备
virsh detach-interface  分离网络界面
virsh define                 从一个 XML 文件定义(但不开始)一个域
virsh undefine             删除一个虚机域

克隆虚机:
virt-clone -o vm2 -n vm4 -f /var/lib/libvirt/images/vm4.qcow2
#将名为vm2的样板机克隆为vm4的新虚机。
KVM 通过virsh console连入虚拟机
 
新安装一台虚拟机后,是无法通过virsh console 命令连入虚拟机中的,这时我们需要开启虚拟机的console功能。
1、centos7以下,及其他情况
(1)添加ttyS0的许可,允许root登陆
[root@localhost ~]# echo “ttyS0” >> /etc/securetty
(2)编辑/etc/grub.conf中加入console=ttyS0   #在kernel的最后面添加。
(3)编辑/etc/inittab,在最后一行加入内容:S0:12345:respawn:/sbin/agetty ttyS0 115200
(4)重启服务器
 reboot
(5)宿主机上测试
 virsh console vm-name
(6)退出console连接的虚拟机li
 按 ctrl+] 组合键退出virsh console
2、对于centos7
(1)在虚机里运行
[root@localhost ~]# grubby –update-kernel=ALL –args=”console=ttyS0″
(2)重启虚机
[root@localhost ~]# reboot
(3)宿主机上测试
virsh console vm-name
(4)退出console连接的虚拟机li
按 ctrl+] 组合键退出virsh console

虚拟化透传

KVM 虚拟化需要处理器对虚拟化技术的支持,当我们需要进行虚拟机嵌套虚拟机时,我们需要让虚拟机中处理器对 VT 功能的支持达到透传的效果。
nested 虚拟机嵌套( kvm on kvm ):nested 技术,简单的说,就是在虚拟机上跑虚拟机。
KVM 虚拟机嵌套和 VMWare 原理不同, VMWare第一层是用的硬件虚拟化技术,第二层就是完全软件模拟出来的,所以 VMWare 只能做两层嵌套。
KVM 是将物理 CPU 的特性全部传给虚拟机,所有理论上可以嵌套 N 多层。

vmx   intel技术
第一步:查看一层客户端是否支持 VT
[jerry@centos ~]$ egrep "vmx" /proc/cpuinfo | wc -l
24
查询未果,证明一层 KVM 的虚拟机,并未将宿主机处理器的 VT 功能成功透传。
所以,没有对 VT功能的支持,我们不能实现在该层虚拟机中嵌套KVM 虚拟机。
第二步:在物理服务器上为嵌套虚拟机做准备 — CPU 虚拟化透传
[root@centos ~]# cat /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1
第三步: 在宿主机启用 kvm_intel 模块的嵌套虚拟化功能,并且使透传永久有效
重新加载 kvm 模块
[root@centos ~]# modprobe -r kvm_intel
[root@centos ~]# modprobe kvm_intel
-r参数:remove掉kvm_intel模块
加载kvm_intel模块
第四步:验证是否加载成功
[root@centos ~]# cat /sys/module/kvm_intel/parameters/nested
Y
Y —“Y” 表示 cpu 虚拟化透传功能开启
第五步:编辑需要做虚拟化透传的虚拟机的配置文件
[root@centos ~]# virsh edit centos7.0   #cpu mode=“host-passthrough”
进入虚拟机查看是否支持透传:
[root@localhost ~]# lsmod | grep kvm
kvm_intel             183621  0
kvm                   586948  1 kvm_intel
irqbypass              13503  1 kvm
#如果出现上面的结果,说明支持透传。可以在虚拟机里创建虚拟机。

虚拟机的配置文件放在:/etc/libvirt/qemu/下,以.xml结尾。
virsh edit centos7.0 实际上编辑的就是这个配置文件。
虚拟机的磁盘放在:/var/lib/libvirt/images/
#命令行创建虚拟机要首先创建磁盘
网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源。
我们创建虚机使用的是Linux-bridge的br0网桥,在此基础上创建出的虚拟机,br0上桥接了ens33(宿主机的网卡)和vnet0(虚机的网卡)
使得虚机和宿主机都可以通过br0来通外网。
通过brctl show 可以查看到桥接的情况。
我们还可以构建一个vlan来实现虚机的隔离和连通。

Vlan介绍
 
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。
一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。
一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。
计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。
简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
比方说,有两组机器,Group A 和 B,我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,
但是 A 和 B 中的机器无法互相访问。 一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。
现在的交换机几乎都是支持 VLAN 的。 通常交换机的端口有两种配置模式: Access 和 Trunk。
Access 口
这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。
Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。
Trunk 口
假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3,那如何让 AB 上相同 VLAN 之间能够通信呢?
办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。
这样的端口就是Trunk口了。 VLAN1, 2, 3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
配置vlan较为繁琐,暂且略过。

kvm的冷热迁移

kvm虚拟化出来的虚拟机主要由两个重要部分组成:
1、配置文件——以.xml结尾。
2、磁盘——一般磁盘格式为qcow2
冷迁移:
将这两个文件复制到另一个宿主机上,为了方便放在同一目录之下。
更改.xml结尾的配置文件,然后将source file的路径改为当前磁盘文件所在的路径。
virsh define xxx.xml  #定义即可实现迁移
#需要注意的是配置文件中定义了去哪儿找磁盘文件,所以路径一定要保证正确。
virsh undefine ken1   #取消定义VM是接的虚机名而不是xml文件。
实现冷迁移,在多个节点迁移,只需要将磁盘和配置文件拷贝过去即可。
热迁移:
VM的迁移都是围绕着配置文件和磁盘文件来做的。
那么通过做一个nfs共享文件系统,将这两个文件放到共享的目录之中,然后在要迁移的各个节点创建同名目录。挂载到这个目录之中使用即可。
然后再各个节点上添加主机域名解析。
在图形界面的虚机状态栏右击,点击迁移,然后选择你要迁移到的主机即可。
 
 
posted @ 2019-10-14 16:05  假如菜鸟不是鸟  阅读(811)  评论(0编辑  收藏  举报