1、虚拟化是什么

虚拟化是指计算元件在虚拟的基础上而不是真实的基础上运行,是一个为了简化管理,优化资源的解决方案,通过模拟不同的元件做到资源的隔离和资源的充分利用。例如CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

2、虚拟化发展的阶段

到目前为止,虚拟化经历了五个比较明显的阶段,分别是全模拟、分层模拟、半虚拟化、全虚拟化、容器虚拟化。全模拟是指CPU、网卡、芯片、磁盘都是通过软件模拟的,特点是慢;分层模拟采用的是捕获和翻译技术,对全虚拟化进行组合或虚拟化的不同层次;半虚拟化通过改造虚拟机器,让虚拟机明白自己就是一个虚拟机从而执行一些指令;全虚拟化是指2005英特尔支持硬件层面(主要是CPU)的虚拟化之后的时间段,容器虚拟化是现在比较火的虚拟化技术,以docker为代表,主要是进程间的隔离,资源消耗低且具备资源隔离的特性。

3、主流虚拟化软件

目前主流的虚拟化技术主要有: KVM 、 Xen 、 VMware(VirtualBox)、Hyper-v。

Xen 和KVM ,是开源免费的虚拟化软件。

VMware是付费的虚拟化软件。

Hyper-v是微软windows 2008 R2附带的虚拟化组件,需要花钱买授权。

虚拟Linux用哪些软件?

如果是虚拟Linux,建议首先使用Xen ,支持Linux的半虚拟化,可以直接使用主系统的CPU和磁盘及网络资源,达到较少的虚拟化调度操作,可以达到非常高的性能,但Xen 操作复杂,维护成本较高。其次我们推荐KVM 来虚拟Linux,Linux本身支持KVM 的virtio技术,可以达到少量的虚拟化调度操作,得到较高的系统性能。

虚拟windows用那些软件?

在有授权的情况下,虚拟windows,建议使用hyper-v。

没有授权的情况下,实验环境使用VMware,企业生产环境建议使用KVM,可以从redhat那里免费拿到针对windows优化过的磁盘和网络的驱动程序,可以达到较高的性能(几乎与hyper-v性能持平)

不打算买厂商支持,其中vmware和hyper-v,是不建议使用的,主要是授权问题。

4、KVM虚拟化

KVM是指基于Linux内核的虚拟机(Kernel-base Virtual Machine),2010年4月发布的RHEL6.0,将KVM增加到Linux内核是Linux发展的一个重要里程碑,这也是第一个整合到Linux主线内核的虚拟化技术。

一个普通的Linux进程有两种运行模式:内核模式和用户模式( 用户模式是指进程在用户代码中运行。内核模式是指进程进入内核代码,执行内核的代码),KVM增加了第三种模式:客户模式(有自己的内核和用户模式)。这里的客户模式,就相当于你在VMware中安装了自己的某个windows操作系统一样。在KVM模型中,每一个虚拟机都是一个由Linux调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。

简单的类比关系就是,KVM相当于是windows版本的VMware,我们可以在KVM中创建很多其他版本的操作系统实例,只不过KVM在创建实例的时候,需要一些辅助的工具,比如QEMU-KVM和Virt-manager。

5、KVM 的管理工具

KVM仅仅是Linux内核的一个模块

在 Linux 系统中,首先我们可以用modprobe(modprobe是linux的一个命令,可载入指定的个别模块,或是载入一组相依的模块)系统工具去加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。

但KVM仅仅是Linux内核的一个模块,仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。

用户工具QEMU-KVM

QEMU是一套模拟CPU的开源软件。KVM作为内核的一个模块,可以通过QEMU提供的模拟方式,来使用处理器。这样,KVM就提供了一个模拟的(虚拟的)硬件层,虚拟机就运行在这个模拟的硬件层之上。

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化

上图,是KVM虚拟机的整体架构。KVM内核模块在运行时按需加载进入内核空间运行。KVM本身不执行任何硬件设备模拟,需要用户空间程序QEMU通过/dev/kvm接口设置一个虚拟客户机的地址空间,向它提供模拟的I/O等硬件设备。

Libvirt/Virsh/Virt-manager:

尽管 QEMU-KVM 工具可以创建和管理 KVM 虚拟机,RedHat为 KVM 开发了更通用的辅助工具libvirt。Libvirt是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持Xen等其他虚拟机。

使用libvirt,你只需要通过libvirt提供的函数连接到 KVM 或Xen宿主机,便可以用同样的命令控制不同的虚拟机了。

Libvirt不仅提供了API,还自带一套基于文本的管理虚拟机的命令virsh,你可以通过使用virsh命令来使用libvirt的全部功能。

同时还能使用图形界面进行管理操作,其工具是Virt-manager。他是一套用 python 编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。Virt-manager 就是利用libvirt的 API 实现的。

6、KVM安装说明

KVM的安装步骤大致如下:

1、准备一台物理机,并安装CentOS 6.x以上的Linux的发行版

这台可以运行最新linux内核的Intel处理器(含VT虚拟化技术)或AMD处理器(含SVM安全虚拟机技术的AMD处理器,也叫AMD-V)

2、安装KVM对应的软件包

3、在KVM中创建虚拟机

通过QEMU-IMG命令创建一个硬盘,第一次接触请选择raw格式

通过virt-install命令安装并启动虚拟机

指定虚拟机的内存、CPU、网络信息

指定虚拟机的网络模式,生产环境使用桥接模式

指定VNC的端口及密码信息

4、下载VNC软件server--client

5、配置VNC软件信息

主要是解决VNC闪退的问题

6、通过VNC连接新创建的虚拟机

根据端口号进行配置

7、在虚拟机中安装系统

8、配置虚拟机的IP地址

7、KVM部署实践

7.1、安装Cent OS 6.X系统

[root@localhost ~]# cat /etc/redhat-release

CentOS release 6.5 (Final)

7.2、检查系统是否支持虚拟化

cat /proc/cpuinfo |grep 'vmx'

cat /proc/cpuinfo |grep 'svm'

依次执行以上两条命令,看看是否有返回值。返回值参考如下:

如果输出的结果包含VMX,它是Intel处理器虚拟机技术标志;

如果包含SVM,它是AMD处理器虚拟机技术的标志,

如果你什么都没有得到,那应你的系统并没有支持虚拟化的处理,不能使用KVM,

另处linux发行版本必须在64bit环境中才能使用KVM。

7.3、更新Linux操作系统软件

yum update

yum upgrade

这两个命令会下载大量的安装包,根据网速不同,需要等待的时长不一。

如果对网速有要求,建议换成国内的yum源地址。

网易Yum源配置

---------------------------------------------------------------

首先备份/etc/yum.repos.d/CentOS-Base.repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下载对应版本repo文件, 放入/etc/yum.repos.d/(操作前请做好相应备份)

CentOS7 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

CentOS6 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

CentOS5 wget http://mirrors.163.com/.help/CentOS5-Base-163.repo

运行以下命令生成缓存

yum clean all

yum makecache

7.4、关闭防火墙

(1) 重启后永久性生效:

开启:chkconfig iptables on

关闭:chkconfig iptables off

(2) 即时生效,重启后失效:

开启:service iptables start

关闭:service iptables stop

内部环境建议永久关闭,永久关闭之后,需要重启

7.5、关闭selinux

(1) 重启后永久性生效:

vi /etc/sysconfig/selinux

SELINUX=disabled

编辑/etc/sysconfig/selinux文件,将文件中的SELINUX配置项改成disabled。

(2) 即时生效,重启后失效:

setenforce 0

SELINUX作为军用级别的防火墙,一般在生产环境中都会关闭掉,不关掉会有很多异常。

建议永久关闭,永久关闭之后,需要重启

7.6、安装KVM相关软件包

yum -y install kvm python-virtinst libvirt bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v

7.7、确认libvirtd是否正常启动

[root@node-3 ~]# /etc/init.d/libvirtd status

libvirtd (pid 3793) is running...

如果没有启动,可以尝试手动启动

/etc/init.d/libvirtd restart

回顾:

RedHat为 KVM 开发了更通用的辅助工具libvirt。Libvirt是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持Xen等其他虚拟机。详见章节5。

7.8、检查KVM是否加载成功

显示结果如下表示kvm模块已经加载,如果没有输出信息,则表示没有加载成功

[root@node-3 ~]# lsmod | grep kvm

kvm_intel 55464 30

kvm 345070 1 kvm_intel

7.9、检查KVM是否成功安装

[root@node-3 ~]# virsh list --all

Id Name State

----------------------------------------------------

7.10、查看工具版本信息

各版本查询

[root@node-3 ~]# virt-install --version

0.600.0

[root@node-3 ~]# virsh --version

0.10.2

7.11、下载安装VNC-Server服务

目的:通过Windows/Linux上的VNC客户端来远程访问服务器,并且可使服务器的图形化交互界面可见。前提需要在服务器端安装并配置vncserver,在客户端安装vncview。

(1)、VNC-Server的安装

yum -y install vnc *vnc-server*

(2)、修改配置文件

vim /etc/sysconfig/vncservers

VNCSERVERS="1:root 2:lisi"

VNCSERVERARGS[1]="-geometry 1024x768"

上面第一行是设定可以使用VNC服务器的帐号,可以设定多个,但中间要用空格隔开。注意前面的数字“1”或是“2”,当你要从其它电脑来访问VNC服务器时,就需要用IP:1这种方法,而不能直接用IP。

(3)、配置会话密码:

执行命令:vncpasswd

123456

123456

(4)、启动VNC服务:

/etc/init.d/vncserver start

7.12、修改VNC连接权限

通过KVM可以创建虚拟机,在给虚拟机安装操作系统时,有些操作系统的安装需要人为干预进行界面操作,所以我们需要通过远程桌面的方式连接到这些虚拟机。

由于这些虚拟机是使用QEMU-KVM进行管理的,所以我们需要在QEMU的配置文件中进行VNC IP地址的修改。

修改qemu.conf配置

vi /etc/libvirt/qemu.conf

vnc_listen = "0.0.0.0"

打开vnc_listen = "0.0.0.0"选项,否则默认绑定的IP地址是127.0.0.1,远程无法访问。

重要说明

通过以上的步骤,我们就能准备好KVM的环境,接下来,我们需要通过工具创建一个基于KVM的虚拟机。

在创建虚拟机之前,我们有个问题要解决,就是桥接网络的设置。

一般在生产环境中,我们通过KVM虚拟机出来的虚拟机,是需要通过IP地址对外直接提供服务的,这就需要我们配置桥接模式。

回顾

网络链接有几种方式,我们比较常用的有两种,一种是通过NAT(网络地址转换),另一种是桥接的方式。两种链接方式的区别,简单说就是桥接使用的是虚拟机独立的网卡,具有独立的IP地址,该ip地址和虚拟机所在的物理机是同等级的。NAT翻译过来就是网络地址转换,相当于是把虚拟机所在的物理机当做路由器在使用。

7.13、上传镜像文件到宿主机

下载winscp或者是使用yum -y install lrzsz* 安装lrzsz软件,将镜像文件上传到宿主机上。

目标地址:/export/iso/

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_IP_02

7.14、在宿主机上配置桥接网络

cp ifcfg-eth0 ifcfg-br0

修改网桥的网络信息,注意看红色字段

[root@node-3 network-scripts]# vi ifcfg-br0

DEVICE=br0

TYPE=Bridge

BOOTPROTO=static

IPV6INIT=no

ONBOOT=yes

IPADDR=172.16.0.201

NETMASK=255.255.254.0

GATEWAY=192.168.0.1

DNS1=8.8.8.8

DELAY=0

修改当前宿主机的网络信息,注意看红色字段

[root@node-3 network-scripts]# vi ifcfg-eth0

HWADDR=00:25:90:AE:21:C0

DEVICE=eth0

TYPE=Ethernet

BRIDGE=br0

BOOTPROTO=none

IPV6INIT=no

ONBOOT=yes

疑问:宿主机怎么没有设置IP地址,我以后想访问宿主机怎么办?

访问网桥的IP地址就可以访问宿主机,他们是同一台机器。

疑问:是否可以给宿主机单独设置一个IP地址?

也可以,去掉上文配置文件的BOOTPROTO=none

回顾:

BOOTPROTO网络配置参数:

BOOTPROTO=static 静态IP

BOOTPROTO=dhcp 动态IP

BOOTPROTO=none 无(不指定)

通常情况下是dhcp或者static,通过指定方式的办法来获得地址,如果没有指定的话可能会出现问题。

7.15、通过KVM创建虚拟机硬盘

先为虚拟机创建一个硬盘

qemu-img create -f raw /export/vm/devEnv-01.vm.itcast.img 200G

硬盘格式说明:

raw 格式的硬盘,会在创建的时候就占200G的空间

qcow2 格式的硬盘,会随着系统的数据逐渐占用200G的空间

初次使用KVM的时候,建议使用raw格式创建硬盘,不会后期安装操作系统是可能会出现错误。错误如下:

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_IP_03

7.16、通过KVM创建虚拟机

virt-install --name=devEnv-01.vm.itcast --ram=8192 --vcpus=4 --disk path=/export/vm/devEnv-01.vm.itcast.img --accelerate --cdrom /export/iso/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,password=123456,port=5992 --network bridge=br0 --force --autostart

运行以上命令,会创建一个虚拟机。创建成功界面如下

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_虚拟化_04

出现以上界面,表示虚拟机创建成功,紧接着我们需要通过VNC远程连接新创建的虚拟机进行操作系统的安装。

VNC的IP地址:172.16.0.201

当前宿主机的IP地址,也就是网桥的IP地址

VNC的PORT端口号:5992

见命令脚本vnc,password=123456,port=5992

VNC的Password密码:123456

有必要一提的是上文的脚本中有bridge=br0的配置,表示我们新创建的虚拟机使用桥接的网络模式。

7.17、下载安装VNC客户端

https://www.realvnc.com/download/file/vnc.files/VNC-6.0.1-Windows.exe

7.18、解决VNC软件的闪退问题

用VNC Viewer来连接一台服务器,输入密码连上后直接闪退,可能是ColourLevel的问题。

依次点Option-->Advanced-->Expert找到ColourLevel,默认值是pal8,修改为rgb222或full。

重新连接,没有问题了。

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化_05

7.19、VNC软件连接新创建的虚拟机

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化_06

连接成功后,需要输入密码。密码是123456

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_centos_07

点击OK按钮之后,就进入了我们熟悉的界面

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_IP_08

7.20、再次启动虚拟机器

安装完系统之后,需要reboot。一旦执行reboot,虚拟机并不会启动,需要手动在KVM管理工具中启动。

[root@node-3 ~]# virsh

Welcome to virsh, the virtualization interactive terminal.

Type: 'help' for help with commands

'quit' to quit

virsh # list --all

Id Name State

----------------------------------------------------

1 centos64 running

2 centos642 running

3 centos643 running

6 centos648 running

8 centos649 running

- devEnv-01.vm.itcast shut off

virsh # start devEnv-01.vm.itcast

Domain devEnv-01.vm.itcast started

7.21、为虚拟机配置网络

通过VNC创建继续访问

为新创建的虚拟机安装完操作系统之后,修改网络配置如下:

[root@devEnv-01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

HWADDR=52:54:00:1A:CC:96

TYPE=Ethernet

UUID=d00f89f0-49b0-4252-a6a3-61575e49d8d8

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=dhcp

重启网络

Service network restart

8、KVM常用管理命令

8.1创建虚拟机

[root@localhost ~]# virt-install --name=centos1 \ #生成一个虚拟机

--ram 1024 \ #分配内存大小(默认大小MB)

--vcpus=1 \ #分配CPU核心数

--disk path=/root/centos1.img \ #指定虚拟机镜像(size单位为GB)

--accelerate \ #加速

--cdrom /root/CentOS-6.5-x86_64-bin-DVD1.iso \ # 指定安装镜像iso

--graphics vnc,password=123456,port=5921 \ # 指定vnc的连接密码和监听端口

--network bridge=br0 \ #指定网络

--autostart \ ##自动开启

8.2 virsh的其他操作

[root@localhost /]# virsh start centos1 #启动虚拟机

[root@localhost /]# virt-viewer centos1 #如果有图形界面的话,可以进入虚拟机的界面

[root@localhost ~]# virsh shutdown centos1 #关闭虚拟机

注意:shutdown使用发送acpid指令来控制虚拟机的电源,而KVM虚拟机安装Linux系统时默认没有安装acpid服务,反以导致不能关闭虚拟机,需要安装acpid。

查看acpid服务是否开启:/etc/init.d/acpid status

启动acpid服务:/etc/init.d/acpid start

[root@localhost /]# virsh reboot centos1 #重启虚拟机

[root@localhost /]# virsh suspend centos1 #暂停虚拟机

[root@localhost /]# virsh resume centos1 #恢复虚拟机

[root@localhost /]# virsh autostart centos1 #自动加载虚拟机

[root@localhost /]# virsh undefine centos1 #删除一个虚拟机

virsh参数说明如下:

autostart自动加载指定的一个虚拟机

connect重新连接到hypervisor

console连接到客户会话

create从一个SML文件创建一个虚拟机

start开始一个非活跃的虚拟机

destroy删除一个虚拟机

define从一个XML文件定义一个虚拟机

domid 把一个虚拟机名或UUID转换为ID

domuuid把一个郁闷或ID转换为UUID

dominfo查看虚拟机信息

domstate查看虚拟机状态

domblkstat获取虚拟机设备快状态

domifstat获取虚拟机网络接口状态

dumpxmlXML中的虚拟机信息

edit编辑某个虚拟机的XML文件

list列出虚拟机

migrate将虚拟机迁移到另一台主机

quit退出非交互式终端

reboot重新启动一个虚拟机

resume重新恢复一个虚拟机

save把一个虚拟机的状态保存到一个文件

dump把一个虚拟机的内核dump到一个文件中以方便分析

shutdown关闭一个虚拟机

setmem改变内存的分配

setmaxmem改变最大内存限制值

suspend挂起一个虚拟机

vcpuinfo虚拟机的cpu信息

version显示virsh版本

8.3 virt-clone克隆

当安装完一台后,如何快速的虚拟出第二台呢?

这里就可以采用克隆这种方式

(1)通过命令:

virt-clone -o devEnv-01.vm.itcast -n devEnv-02.vm.itcast -f /home/kvm/centos02.img

参数说明:

-o :指定源虚拟机

-n :命名新克隆的虚拟机

-f :指定新克隆虚拟机的位置

(2)克隆完成后,在生成硬盘映像文件的同时,也会克隆虚拟机的配置文件

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_IP_09



半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_虚拟化_10

(3) 修改克隆出来的心虚拟机的配置文件

通过命令:virsh edit devEnv-02.vm.itcast

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化_11

修改此处的vnc监控的端口号,避免与克隆前的虚拟机端口一样,而出现端口地址被占用。

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_centos_12

(4)启动克隆出来的新的虚拟机devEnv-02.vm.itcast

通过命令: virsh start devEnv-02.vm.itcast

(5) 通过用VNC Viewer来连接该虚拟机

由于是克隆出来的,跟之前我们使用VMware克隆效果是一样的,需要进行相应的修改。

a:修改对应的主机名

进入/etc/sysconfig/network进行相应的修改

b:因为克隆改变新虚拟机的MAC地址,故eth0无法启动,新的虚拟机后网卡变成了 eth1

进入/etc/udev/rules.d/70-persistent-net.rules文件删除之前的eth0这个网卡记录,保留eth1。

进入到/etc/sysconfig/network-scripts/,执行命令mv ifcfg-eth0 ifcfg-eth1 重命名

vi ifcfg-eth1 修改配置

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化_13

c: 重启网卡,通过命令service network restart

8.4 libguestfs-tools安装和使用

libguestfs-tools是虚拟机一个管理包,很有用的工具。

(1)安装

yum -y install libguestfs-tools

(2)使用

查看虚拟机的分区情况

[root@node-1 home]# virt-filesystems -d devEnv-01.vm.itcast

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_虚拟化_14

[root@node-1 home]# virt-list-partitions /home/kvm/devEnv-01.vm.itcast.img

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_半虚拟化和硬件辅助虚拟化_15

[root@node-1 home]# virt-df /home/kvm/devEnv-01.vm.itcast.img

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_centos_16

8.5 kvm虚拟机参数修改

(1) 修改kvm虚拟机的内存大小

[root@node-1 home]# virsh edit devEnv-01.vm.itcast

注意不可直接修改devEnv-01.vm.itcast.xml 文件

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_IP_17

查看内存:free

(2)修改kvm虚拟机的cpu核数大小

[root@node-1 home]# virsh edit devEnv-01.vm.itcast

半虚拟化和硬件辅助虚拟化 虚拟化 半虚拟化_centos_18

查看cpu核数: cat /proc/cpuinfo |grep "processor"|sort -u|wc -l

注意:修改完成之后,都要重启虚拟机

先关闭:virsh shutdown devEnv-01.vm.itcast

再启动:virsh start devEnv-01.vm.itcast

其他参数修改相同。