一、虚拟化技术
1、全虚拟化和半虚拟化技术
如果给KVM、XEN简单归类的话,KVM是完全虚拟化技术又叫硬件辅助虚拟化技术(Full Virtualization)。相反,XEN是半虚拟化技术(paravirtualization),也叫做准虚拟化技术。
全虚拟化技术:
半虚拟化技术:
KVM是在虚拟机和硬件之间加了一个软件层--Hypervisor,或者叫做虚拟机管理程序(VMM),KVM的hypervisor是直接运行在物理硬件之上的。
XEN是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,使客户操作系统集成了虚拟化方面的代码,该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。
2、KVM和XEM架构
也有人将KVM架构分解为两部分:KVM驱动,即linux kernel的一个模块和Qemu,Qemu用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。
其最大的优势在于KVM使用Linux内核集成的,所以速度较快。同时,KVM是完全虚拟的,所以不需要区分pv和hvm,可以安装各种Linux发行版和Windows发行版,可以运行在支持虚拟化扩展的X86和X86-64硬件架构上。
XEN实际上出现的时间要早于KVM,它是由剑桥大学开发的,一个开源的虚拟机监视器。半虚拟化架构决定了它注定不是真正的虚拟机,只是自己运行了一个内核的例子,同时区分Xen+pv+和Xen+hvm,其中pv只支持Linux,而hvm则支持Windows系统。
除此之外,XEN还拥有更好的可用资源、平台支持、可管理性、实施、支持动态迁移和性能基准等优势。
3、虚拟化技术对比
KVM、Xen、VMware的对比如下:
KVM 是基于 Linux 内核的虚拟机(Kernel-based VirtualMachine),是第一个整合到 Linux内核的虚拟化技术。
在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可 以在用户空间启劢客户机操作系统。一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己 的内核和用户模式)
XEN 需要升级内核,只能支持和物理机系统一样的操作系统。
KVM支持 linux 以外的其它系统,比如:windows。
从性能和成熟度上而言,XEN要优于KVM,但是红帽等公司在KVM上的投入也越来越多,但诸如AWS、阿里云等云服务提供商仍然使用的XEN半虚拟化技术,XEN也积累了很多优秀的解决方案,稳定性更优,而KVM最大的好处就在于它是与Linux内核集成的,可以说KVM与ESX拥有相同的架构,这也让KVM得到大批用户的支持。
VMware与KVM和XEN最大的不同是VMware是闭源的,而KVM和XEN则是开源的。
VMWare (Virtual Machine ware)是一个“虚拟PC”软件公司,它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。
与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器,VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就像标准Windows应用程序那样切换。
每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。
二、虚拟化服务平台
KVM这样的Hypervisor软件,实际上是提供了一种虚拟化能力,模拟CPU的运行,更为底层。但是它的用户交互并不良好,不方便使用。
于是,为了更好地管理虚拟机,就需要OpenStack这样的云管理平台。云管理平台有点像个商店,负责管理商品(计算资源、存储资源、网络资源等),卖给用户,但它本身不制造商品(不具备虚拟化能力),它的商品,来自于KVM。
当然,如果不用KVM,也可以用Xen等其它hypervisor。
1、虚拟机的组成
虚拟机组成:
- 内核虚拟化模块(KVM)
- 系统设备仿真(QEMU)
- 虚拟机管理程序(LIBVIRT)
- 虚拟机配置声明文件(一个XML,位置: /etc/libvirt/qemu)
- 虚拟机硬盘(一个磁盘镜像文件,位置: /var/lib/libvirt/images)
KVM虚拟机组成:
KVM作为内核的一个模块,来提供虚拟化功能。如果系统需要虚拟化功能,则KVM模块可以被linux内核按需动态加载到内存运行。如果不需要的KVM功能,可以动态卸载该模块。
QEMU是一套模拟CPU的开源软件。KVM作为内核的一个模块,可以通过QEMU提供的模拟方式,来使用处理器。这样,KVM就提供了一个模拟的(虚拟的)硬件层,虚拟机就运行在这个模拟的硬件层之上。
2、Libvirt
Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。
用一句话概括libvirt就是:为了安全高效的管理节点上的各个域,而提供一个公共的稳定的软件层。当然,这里的管理,既包括本地的管理,也包含远程的管理。
它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术,这些API在云计算的解决方案中广泛使用。
libvirt是提供了一个方便的方式来管理虚拟机和其他虚拟化功能的软件的集合,如存储和网络接口管理。这些软件包括一个API库,一个守护进程(Libvirtd),和一个命令行实用程序(virsh)。
libvirt的首要目标是能够管理多个不同的虚拟化供应商/虚拟机管理程序提供一个单一的方式。例如,命令“virsh列表等等都可以用于任何支持现有的虚拟机管理程序列表(KVM、Xen、VMware ESX,等)不需要学习管理程序特定的工具!
支持的虚拟化平台:
- LXC : lightweight Linux container system;
- OpenVZ :lightweight Linux container system;
- Kernel-based Virtual Machine/QEMU (KVM) : open-source hypervisor for Linux and SmartOS;
- Xen : Bare-Metal hypervisor;
- User-mode Linux (UML) :paravirtualized kernel;
- VirtualBox : hypervisor by Oracle (formerly by Sun) for Windows, Linux, Mac OS X, and Solaris;
- VMware ESX and GSX : hypervisors for Intel hardware;
- VMware Workstation and Player : hypervisors for Windows and Linux;
- Hyper-V : hypervisor for Windows by Microsoft;
- PowerVM : hypervisor by IBM for AIX, Linux and IBM i;
- Parallels Workstation : hypervisor for Mac by Parallels IP Holdings GmbH;
- Bhyve : hypervisor for FreeBSD 10+;
libvirt中涉及到几个重要的概念:
- 节点(Node):一个物理机器,上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在Node之上。
- Hypervisor:也称虚拟机监控器(VMM),如KVM、Xen、VMware、Hyper-V等,是虚拟化中的一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟客户机(不同客户机可能有不同的配置和操作系统)。
- 域(Domain):是在Hypervisor上运行的一个客户机操作系统实例。域也被称为实例(instance,如亚马逊的AWS云计算服务中客户机就被称为实例)、客户机操作系统(guest OS)、虚拟机(virtual machine),它们都是指同一个概念。
关于节点、Hypervisor和域的关系,可以简单地用下图来表示。
libvirt的管理功能主要包含如下五个部分:
(1)域的管理:包括对节点上的域的各个生命周期的管理,如:启动、停止、暂停、保存、恢复和动态迁移。也包括对多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU,当然不同的Hypervisor上对这些热插拔的支持程度有所不同。
(2)远程节点的管理:只要物理节点上运行了libvirtd这个守护进程,远程的管理程序就可以连接到该节点进程管理操作,经过认证和授权之后,所有的libvirt功能都可以被访问和使用。libvirt支持多种网络远程传输类型,如SSH、TCP套接字、Unix domain socket、支持TLS的加密传输等。假设使用最简单的SSH,则不需要额外配置工作,比如:example.com节点上运行了libvirtd,而且允许SSH访问,在远程的某台管理机器上就可以用如下的命令行来连接到example.com上,从而管理其上的域。
virsh -c qemu+ssh://root@example.com/system
(3)存储的管理:任何运行了libvirtd守护进程的主机,都可以通过libvirt来管理不同类型的存储,如:创建不同格式的客户机镜像(qcow2、raw、qde、vmdk等)、挂载NFS共享存储系统、查看现有的LVM卷组、创建新的LVM卷组和逻辑卷、对磁盘设备分区、挂载iSCSI共享存储,等等。当然libvirt中,对存储的管理也是支持远程管理的。
(4)网络的管理:任何运行了libvirtd守护进程的主机,都可以通过libvirt来管理物理的和逻辑的网络接口。包括:列出现有的网络接口卡,配置网络接口,创建虚拟网络接口,网络接口的桥接,VLAN管理,NAT网络设置,为客户机分配虚拟网络接口,等等。
(5)提供一个稳定、可靠、高效的应用程序接口(API)以便可以完成前面的4个管理功能。
libvirt主要由三个部分组成,它们分别是:应用程序编程接口(API)库、一个守护进程(libvirtd)和一个默认命令行管理工具(virsh)。
应用程序接口(API)是为了其他虚拟机管理工具(如virsh、virt-manager等)提供虚拟机管理的程序库支持。libvirtd守护进程负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理之时,这个守护进程一定要处于运行状态中,而且这个守护进程可以分为两种:一种是root权限的libvirtd,其权限较大,可以做所有支持的管理工作;一种是普通用户权限的libvirtd,只能做比较受限的管理工作。virsh是libvirt项目中默认的对虚拟机管理的一个命令行工具。
virsh提供管理各虚拟机的命令接口:支持交互模式:
virsh <控制指令> [虚拟机名称] [参数]
virsh list --all # 列出所有虚拟机
virsh nodeindo # 查看KVM节点(真机)服务器信息
virsh net-list # 列出虚拟网络
virsh dominfo <虚拟机名称> # 查看指定虚拟机信息
virsh autostart <虚拟机名称> # 设置虚拟机为开机自启
virsh autostart --disable <虚拟机名称> # 关闭虚拟机开机自启
virsh start|reboot|shutdown <虚拟机名称> # 运行/重启/关闭
virsh destroy <虚拟机名称> # 强制关闭虚拟机
3、KVM相关安装包
KVM有如下安装包:
- qemu-kvm 主要的KVM程序包;
- python-virtinst 创建虚拟机所需要的命令行工具和程序库;
- virt-manager GUI虚拟机管理工具;
- virt-top 虚拟机统计命令;
- virt-viewer GUI连接程序,连接到已配置好的虚拟机;
- libvirt C语言工具包,提供libvirt服务;
- libvirt-client 虚拟客户机提供的C语言工具包;
- virt-install 基于libvirt服务的虚拟机创建命令;
- bridge-utils 创建和管理桥接设备的工具;
必备软件:
- qemu-kvm: 为kvm提供底层仿真支持;
- libvirt-daemon: libvirtd守护进程,管理虚拟机;
- libvirt-client: libvirt客户端软件,提供客户端管理命令(virsh命令);
- libvirt-daemon-driver-qemu: libvirtd连接qemu的驱动程序;
可选::
- virt-install: 系统安装工具;
- virt-manager: 图形管理工具;
- virt-v2v: 虚拟机迁移工具;
- vrit-p2v: 物理机迁移工具;
三、KVM 图形方式安装
检查CPU是否支持虚拟化:
[root@localhost ~]#grep vmx /proc/cpuinfo
查看是否加载了KVM模块:
[root@localhost ~]#lsmod | grep kvm
如果没有加载,运行以下命令:
[root@localhost ~]# modprobe kvm
[root@localhost ~]# modprobe kvm-intel
[root@localhost ~]# lsmod | grep kvm
此时,内核模块导出了一个名为/dev/kvm的设备,这个设备将虚拟机的的地址空间独立于内核或者任何应用程序的地址空间。
[root@localhost ~]#ll /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Jul 24 23:25 /dev/kvm
桥接网络:
安装brctl命令,用于管理网桥的工具:
[root@localhost ~]# yum -y install bridge-utils
重启网络服务:
[root@localhost ~]# systemctl restart network
配置KVM的网桥模式
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@localhost network-scripts]# vi ifcfg-br0
TYPE="Bridge" //类型修改为Bridge
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0" //网卡名修改为br0
#UUID="11b3aae9-6e3b-42ac-a232-d30499756c40" //注释UUID
DEVICE="br0" //设备名称修改为br0
ONBOOT="yes"
IPADDR="192.168.150.131"
PREFIX="24"
GATEWAY="192.168.150.1"
DNS1="8.8.8.8"
[root@localhost network-scripts]# vi ifcfg-ens33
TYPE="Ethernet"
BRIDGE="br0" //添加配置为br0
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="11b3aae9-6e3b-42ac-a232-d30499756c40"
DEVICE="ens33"
ONBOOT="yes"
#IPADDR="192.168.150.131" //注释掉以下几行
#PREFIX="24"
#GATEWAY="192.168.150.1"
#DNS1="8.8.8.8"
重启网卡服务:
[root@localhost ~]# systemctl restart network
查看网卡:
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29866991 no ens33
vnet0
virbr0 8000.525400a69cd1 yes virbr0-nic
查看ip信息:
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 00:0c:29:86:69:91 brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fe86:6991/64 scope link
valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST,UP,LOWER_P> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:86:69:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.150.131/24 brd 192.168.150.255 scope global dynamic br0
valid_lft 1063sec preferred_lft 1063sec
inet6 fe80::20c:29ff:fe86:6991/64 scope link
valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:a6:9c:d1 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
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:a6:9c:d1 brd ff:ff:ff:ff:ff:ff
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:f2:fe:6f brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fef2:fe6f/64 scope link
valid_lft forever preferred_lft forever
安装libvirt及kvm:
[root@localhost ~]# yum -y install libcanberra-gtk2 qemu-kvm.x86_64 qemu-kvm-tools.x86_64 libvirt.x86_64 libvirt-cim.x86_64 libvirt-client.x86_64 libvirt-java.noarch libvirt-python.x86_64 libiscsi-1.7.0-5.el6.x86_64 dbus-devel virt-clone tunctl virt-manager libvirt libvirt-python python-virtinst
简化安装kvm虚拟化套件方法:
[root@localhost ~]# yum -y install virt*
由于要用virt-manager图形化安装虚拟机,所以还需要安装X-window:
[root@localhost ~]# yum groupinstall "X Window System"
安装中文字符,解决界面乱码问题:
[root@localhost ~]# yum install -y dejavu-lgc-sans-fonts
[root@localhost ~]# yum groupinstall -y "Fonts"
启用libvirt:
[root@localhost ~]# systemctl enable libvirtd
[root@localhost ~]# systemctl start libvirtd
使用virt-manager管理虚拟机,通过xmanager工具连接。
xshell ssh 到服务器,执行virt-manager,自动打开已安装的xmanager 虚拟机管理窗口。
创建虚拟机:
选择采用本地光盘镜像安装:
安装方式支持本地安装、远程安装、PXE安装、vmdk磁盘镜像导入安装。
选择安装Red Hat8:
root家目录不能被Libvirt访问:
把光盘放到/tmp下即可。
网卡类型选择:
选择NAT网络。
安装操作系统:
KVM进程:
虚拟化网络配置:
kvm中的virbr0是一个虚拟网桥,也可以当做虚拟交换机用,和vmware创建的虚拟交换机vmnet最大的不同在于,virbr0虚拟交换机是有地址的。
选择NAT模式网络, 自动连到虚拟交换机,virbr0默认自带DHCP功能。
四、KVM命令行方式安装
关闭防火墙和selinux:
[root@localhost ~]# getenforce
Disabled
[root@localhost ~]# systemctl stop firewalld
查看cpu是否开启虚拟化:
[root@localhost ~]# egrep -o ‘(vmx|svm)’ /proc/cpuinfo
vmx
vmx
[root@localhost ~]# dmesg | grep kvm
如果什么也不出来就对了,出来kvm:disabled by blos,就是cpu没有开启虚拟化。
安装KVM套件:
[root@localhost ~]# yum -y install qemu-kvm qemu-kvm-tools libvirt
启动libvirtd之后我们可以使用ifconfig来查看,libvirtd已经为我们安装了一个桥接网卡。
[root@localhost ~]# systemctl start libvirtd
[root@localhost ~]# systemctl enable libvirtd
[root@localhost ~]# systemctl status libvirtd
[root@localhost ~]# ifconfig
virbr0: flags=4099 mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:9a:0e:e3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
准备虚拟机硬盘:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/centos-root 27G 2.2G 25G 8% /
/dev/sda1 1014M 137M 878M 14% /boot
tmpfs 394M 0 394M 0% /run/user/0
[root@localhost ~]# cd /opt/
[root@localhost ~]# ls
CentOS-7-x86_64-Minimal-1810.iso
[root@localhost ~]# dd if=/dev/cdrom of=/opt/CentOS-7-x86_64-Minimal-1810.iso
9109504+0 records in
9109504+0 records out
4664066048 bytes (4.7 GB) copied, 227.7 s, 20.5 MB/s
[root@localhost ~]# qemu-img create -f qcow2 /opt/yyds.qcow2 6G
[root@localhost ~]# ll
total 4555144
-rw-r–r-- 1 root root 197120 May 13 14:31 yyds.qcow2
-rw-r–r-- 1 root root 4664066048 May 13 14:28 CentOS-7-x86_64-Minimal-1810.iso
解释说明:
- -f制定虚拟机格式;
- /opt/Centos 存放路径;
- 6G代表镜像大小的;
命令行安装KVM虚拟机:
[root@localhost ~]# yum -y install virt-install
[root@localhost ~]# virt-install --virt-type=kvm --name=yyds --vcpus=1 -r 1024 --cdrom=/opt/CentOS-7-x86_64-Minimal-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/opt/yyds.qcow2,size=6,format=qcow2
[root@localhost ~]# virsh list --all
Id Name State
1 yyds running
kvm有几种安装方式
--disk 指定虚拟机磁盘镜像创建的位置,创建一个img镜像文件--disk path=/opt/yyds.img,size=6。
默认连接端口是从5900开始的:
[root@localhost ~]# netstat -lntup | grep 5900
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 3032/qemu-kvm
VNC连接虚拟机:
如果查看5900端口开启,但是vnc无法连接虚拟机时,看下防火墙是否开启,创建虚机用vnc连接是从默认端口5900开始。
虚拟机安装完成之后是关闭了,我们需要启动;
[root@localhost ~]# virsh start yyds
[root@localhost ~]# virsh list --all
Id Name State
2 yyds running
查看虚拟机的虚拟网卡:
[root@localhost ~]# bridge link
[root@localhost ~]# ip link
virbr0网桥上接入了两个vnet0和vnet1虚拟网卡,vnet0连接到vmnet2虚拟机,vnet1连接到vmnet8虚拟机,连接到同一个virbr0上的vmnet可以互相访问。
可以自己添加一个虚拟交换机:
可以指定网段:
选择虚拟网络模式,原来的virbr0是NAT模式的,NAT模式会自动做SNAT,如果物理机能访问Inelnet创建的虚拟机也可以访问Inelnet。
virbr1就是新建的虚拟交换机:
也可以自己手动创建一个虚拟交换机:
[root@localhost ~]# nmcli add con-name br-test ifname br-test type bridge ipv4.addresses 10.0.2.1/24 ipv4.method manual
[root@localhost ~]# nmcli device status
在虚拟机中添加一个网卡,连接到br-test虚拟交换机上。
br-test不是kvm提供的原生虚拟机,需要关机添加的网卡才会出现。
想让虚拟机网卡间能够互相通信,只要两个虚拟机的虚拟网卡使用同一个虚拟交换机(虚拟网桥)就可以了。
virsh命令行操作虚拟机:
查看运行的虚拟机列表:
virsh list
调出虚拟机:
virt-viewer rhel8-2
查看所有虚拟机,包括运行和停止的:
virsh list --all
自动启动虚拟机:
virsh autostart +虚拟机名称
连接虚拟机:
virsh console +虚拟机名称
退出虚拟机:
ctrl+]
开启虚拟机:
virsh start +虚拟机名称
关闭虚拟机:
virsh shutdown +虚拟机名称
如果无法关机,需要安装:
yum install -y acpid
删除关闭虚拟机:
virsh destroy +域名
挂起虚拟机:
virsh resume +域名
取消自动启动:
virsh auotstart --disable +域名
彻底删除虚拟机:
virsh destroy +域名
解除标记:
virsh undefine +域名