在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各类实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。
由此,打破实体结构间的不可切割的障碍,使用户能够比本来的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。linux
通常所指的虚拟化资源包括计算能力和数据存储。web
因为目前信息技术领域的不少企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围能够从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。所以各类相关学术论文在谈到虚拟技术时经常提到的即是如前面所提到的那个不严格的定义。shell
同一台物理机运行多个不一样版本应用软件
硬件依赖性较低和便于数据迁移
windows
1.下降运营成本
服务器虚拟化下降了IT基础设施的运营成本,令系统管理员摆脱了繁重的物理服务器、OS、中间件及兼容性的管理工做,减小人工干预频率,使管理更增强大、便捷。
2.提升应用兼容性
服务器虚拟化提供的封装性和隔离性使大量应用独立运行于各类环境中,管理人员不需频繁根据底层环境调整应用,只需构建一个应用版本并将其发布到虚拟化后的不一样类型平台上便可。
3.加速应用部署
采用服务器虚拟化技术只需输入激活配置参数、拷贝虚拟机、启动虚拟机、激活虚拟机便可完成部署,大大缩短了部署时间,免除人工干预,下降了部署成本。
4.提升服务可用性
用户能够方便地备份虚拟机,在进行虚拟机动态迁移后,能够方便的恢复备份,或者在其余物理机上运行备份,大大提升了服务的可用性。
5.提高资源利用率
经过服务器虚拟化的整合,提升了CPU、内存、存储、网络等设备的利用率,同时保证原有服务的可用性,使其安全性及性能不受影响。
6.动态调度资源
在服务器虚拟化技术中,数据中心从传统的单一服务器变成了统一的资源池,用户能够即时地调整虚拟机资源,同时数据中心管理程序和数据中心管理员能够灵活根据虚拟机内部资源使用状况灵活分配调整给虚拟机的资源。
7.下降能源消耗
经过减小运行的物理服务器数量,减小CPU之外各单元的耗电量,达到节能减排的目的。
centos
KVM,基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,能够将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。浏览器
KVM在具有Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。安全
KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。
bash
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。服务器
是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。网络
它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM还须要一个通过修改的QEMU软件(qemu-kvm),做为虚拟机上层控制和界面。
KVM能在不改变linux或windows镜像的状况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)同时KVM还可以使用ksm技术帮助宿主服务器节约内存。
在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
电脑运算中,红帽公司的Virtual Machine Manager是一个虚拟机管理员,可让用户管理多个虚拟机。
基于内核的虚拟机libvirt与Virtual Machine Manager。
Virtual Machine Manager可让用户:
建立、编辑、引导或中止虚拟机。
查看并控制每一个虚拟机的控制台。
查看每部虚拟机的性能以及使用率。
查看每部正在运行中的虚拟机以及主控端的即时性能及使用率信息。
不管是在本机或远程,皆可以使用KVM、Xen、QEMU。
🍪 Xen
Xen是一个开放源代码虚拟机监视器,由XenProject开发。它打算在单个计算机上运行多达128个有彻底功能的操做系统。
在旧(无虚拟硬件)的处理器上执行Xen,操做系统必须进行显式地修改(“移植”)以在Xen上运行(可是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。
🍪 QEMU
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具备某些后二者所不具有的特性,如高速度及跨平台的特性。经由KVM(早期为kqemu加速器,如今kqemu已被KVM取代)这个开源的加速器,QEMU能模拟至接近真实电脑的速度。QEMU有两种主要运做模式:
User mode模拟模式,亦便是用户模式。
QEMU能引导那些为不一样中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。
System mode模拟模式,亦便是系统模式。
QEMU能模拟整个电脑系统,包括中央处理器及其余周边设备。它使得为系统源代码进行测试及除错工做变得容易。其亦能用来在一部主机上模拟数部不一样虚拟电脑。
系统环境说明
[root@kvm01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@kvm01 ~]# uname -r 3.10.0-693.el7.x86_64 [root@kvm01 ~]# sestatus SELinux status: disabled [root@kvm01 ~]# 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@kvm01 ~]# hostname -I 10.0.0.11 # kvm主机内存不能低于4GB
安装依赖包(可使用本地yum源)
[root@kvm01 ~]# yum install libvirt* virt-* qemu-kvm* -y # libvirt # 做用:虚拟机的管理软件 # virt # virt-install virt-clone 做用:虚拟机的安装和克隆 # qemu-kvm # qemu-img 做用:复制管理虚拟机的磁盘 管理虚拟机磁盘
启动服务
[root@kvm01 ~]# systemctl start libvirtd.service [root@kvm01 ~]# systemctl status libvirtd.servic
安装VNC软件(windows版):
下载vnc软件方法,tightvnc官网: http://www.tightvnc.com
VNC软件,用于VNC(Virtual Network Computing),为一种使用RFB协议的显示屏画面分享及远程操做软件。此软件借由网络,可发送键盘与鼠标的动做及即时的显示屏画面。
VNC与操做系统无关,所以可跨平台使用,例如可用Windows链接到某Linux的电脑,反之亦同。甚至在没有安装客户端程序的电脑中,只要有支持JAVA的浏览器,也可以使用。
安装VNC时,使用默认安装便可,无需安装server端。(只安装客户端)
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 \ --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 \ --cdrom /opt/CentOS-7.4-x86_64-DVD-1708.iso --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole
注意:
须要先将镜像文件拷贝到 /opt/目录下。xshell下使用xftp 默认的rz sz不行
VMware须要在配置内开启虚拟化
使用参数说明
参数 | 参数说明 |
---|---|
--virt-type HV_TYPE | 要使用的管理程序名称 (kvm, qemu, xen, ...) |
--os-type | 系统类型 |
--os-variant DISTRO_VARIANT | 在客户机上安装的操做系统,例如:'fedora18'、'rhel6'、'winxp' 等。 |
-n NAME, --name NAME | 客户机实例名称 |
--memory MEMORY | 配置客户机虚拟内存大小 |
--vcpus VCPUS | 配置客户机虚拟 CPU(vcpu) 数量。 |
--disk DISK | 指定存储的各类选项。 |
-cdrom CDROM | 光驱安装介质 |
-w NETWORK, --network NETWORK | 配置客户机网络接口。 |
--graphics GRAPHICS | 配置客户机显示设置。 |
虚拟化平台选项: | |
-v, --hvm | 这个客户机应该是一个全虚拟化客户机 |
-p, --paravirt | 这个客户机应该是一个半虚拟化客户机 |
--container | 这个客户机应该是一个容器客户机 |
--virt-type HV_TYPE | 要使用的管理程序名称 (kvm, qemu, xen, ...) |
--arch ARCH | 模拟 CPU 架构 |
--machine MACHINE | 机器类型为仿真类型 |
其它选项: | |
--noautoconsole | 不要自动尝试链接到客户端控制台 |
--autostart | 主机启动时自动启动域。 |
--noreboot | 安装完成后不启动客户机。 |
以上信息经过 " virt-install --help " 得到。 |
在启动的同时使用vnc链接
virsh命令经常使用参数总结
参数 | 参数说明 |
---|---|
基础操做 | |
list | 查看虚拟机列表,列出域 |
start | 启动虚拟机,开始一个(之前定义的)非活跃的域 |
shutdown | 关闭虚拟机,关闭一个域 |
destroy(危险) | 强制关闭虚拟机,销毁(中止)域 |
vncdisplay | 查询虚拟机vnc端口号 |
reboot | 重启(有些版本不支持) |
配置管理操做 | |
dumpxml | 导出主机配置信息 |
undefine | 删除主机 |
define | 导入主机配置 |
domrename | 对虚拟机进行重命名 |
挂起与恢复 | |
suspend | 挂起虚拟机 |
resume | 恢复虚拟机 |
自启动管理 | |
autostart | 虚拟机开机启动 |
autostart --disable | 取消虚拟机开机启动 |
以上参数经过 “virsh --help” 得到。 |
KVM虚拟机配置文件位置
[root@kvm ~]# ll /etc/libvirt/qemu/centos7.xml
修改KVM虚拟机配置的方法
[root@kvm ~]# virsh edit centos7
使用该命令修改能够对文件进行语法校验。(如crontable -e)
备份虚拟机配置(关机时备份):
[root@kvm ~]# virsh dumpxml centos7 > centos7.xml
# 查看 [root@kvm ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7 关闭 # 删除 [root@kvm ~]# virsh undefine centos7 域 centos7 已经被取消定义 [root@kvm ~]# virsh list --all Id 名称 状态 ----------------------------------------------------
# 导入 备份(dumpxml) [root@kvm ~]# virsh define centos7.xml 定义域 centos7(从 centos7-off.xml) # 查看 [root@kvm ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7 关闭
# 重命名 [root@kvm ~]# virsh domrename centos7 web01 Domain successfully renamed # 查看 [root@kvm ~]# virsh list Id 名称 状态 ---------------------------------------------------- 9 web01 关闭
挂起虚拟机
[root@kvm01 ~]# virsh suspend centos7 域 centos7 被挂起 # 查看状态 [root@kvm01 ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- 9 centos7 暂停
恢复虚拟机
[root@kvm01 ~]# virsh resume centos7 域 centos7 被从新恢复
[root@kvm ~]# virsh vncdisplay centos7 :0 # :0 即 为 5900 端口,以此类推 :1为5901 。
# 设置 libvirtd 服务开机自启动。 [root@kvm ~]# systemctl enabled libvirtd.service enabled
设置宿主机开机虚拟机在其余
[root@kvm ~]# virsh autostart centos7 域 nfsnobody标记为自动开始 # 实质为建立软链接 [root@kvm ~]# ll /etc/libvirt/qemu/autostart/centos7.xml lrwxrwxrwx 1 root root 27 1月 22 12:17 /etc/libvirt/qemu/autostart/centos7.xml -> /etc/libvirt/qemu/centos7.xml
取消开机自启动
[root@kvm ~]# virsh autostart --disable centos7 域 centos7取消标记为自动开始
配置console登陆
在centos7虚拟机内操做(该操做仅限centos7):
[root@kvm01 ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8" [root@kvm01 ~]# reboot # 115200n8:能显示虚拟机的启动过程
重启完成后,使用virsh console 链接虚拟机。
[root@kvm ~]# virsh console centos7 链接到域 centos7 换码符为 ^] CentOS Linux 7 (Core) Kernel 3.10.0-327.el7.x86_64 on an x86_64 centos7 login: root Password: Last login: Mon Jan 22 12:24:48 from 192.168.122.1 [root@centos7 ~]# w 12:26:11 up 0 min, 1 user, load average: 0.09, 0.03, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root ttyS0 12:26 3.00s 0.02s 0.01s w
使用virsh console链接CentOS 6虚拟主机方法:
安装一台centos6的kvm虚拟机
virt-install --virt-type kvm --os-type=linux --os-variant rhel6 \ --name centos6 --memory 1124 --vcpus 1 \ --disk /data/centos6/centos6.raw,format=raw,size=10 \ --cdrom /data/CentOS-6.9-x86_64-bin-DVD1.iso \ --network network=default --graphics vnc,listen=0.0.0.0,port=5901 \ --noautoconsole
新安装一台虚拟机后,是没法经过virsh console 命令连入虚拟机中的,这时咱们须要开启虚拟机的console功能。
如下操做都在虚拟机中进行
一、添加ttyS0的许可,容许root登录
[root@centos6 ~]# echo "ttyS0" >> /etc/securetty
二、编辑/etc/grub.conf中加入console=ttyS0
在该文件的第16行。kernel选项后添加
[root@centos6 ~]# sed -i '/\tkernel/s#.*#& console=ttyS0#g' /etc/grub.conf [root@centos6 ~]# sync # 同步配置到 /boot/grub/grub.conf [root@centos6 ~]# cat -n /etc/grub.conf 1 # grub.conf generated by anaconda 2 # 3 # Note that you do not have to rerun grub after making changes to this file 4 # NOTICE: You have a /boot partition. This means that 5 # all kernel and initrd paths are relative to /boot/, eg. 6 # root (hd0,0) 7 # kernel /vmlinuz-version ro root=/dev/vda3 8 # initrd /initrd-[generic-]version.img 9 #boot=/dev/vda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS 6 (2.6.32-696.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=48532582-c271-4c0a-b55f-395fe16cd8aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0 17 initrd /initramfs-2.6.32-696.el6.x86_64.img
三、编辑/etc/inittab
在最后一行加入内容 S0:12345:respawn:/sbin/agetty ttyS0 115200
[root@centos6 ~]# echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >>/etc/inittab
四、以上操做都完成后,重启虚拟机
[root@centos6 ~]# reboot
如下操做在kvm宿主机上执行
一、检查虚拟机的状态
[root@kvm ~]# virsh list --all Id 名称 状态 ---------------------------------------------------- 11 nfsnobody running 21 nfsnobody6 running
二、进行链接测试
[root@kvm ~]# virsh console nfsnobody6 链接到域 nfsnobody6 换码符为 ^] # 注:退出virsh console链接的方法,使用组合键Ctrl+]便可 CentOS release 6.9 (Final) Kernel 2.6.32-696.el6.x86_64 on an x86_64 nfsnobody6 login: root Password: Last login: Mon Jan 22 05:44:25 on ttyS0 [root@nfsnobody6 ~]# who root ttyS0 2018-01-22 05:50 # 登录成功,查看登录接口为以前设置的ttyS0
KVM qcow二、raw、vmdk等镜像格式说明: http://blog.csdn.net/zhengmx100/article/details/53887162
# 建立一块qcow2的虚拟硬盘(仅测试使用,无实际意义) [root@kvm01 data]# qemu-img create -f qcow2 nfsnobody.qcow2 2G
查看当前虚拟机硬盘信息
[root@kvm01 ~]# qemu-img info /data/nfsnobody.raw image: /data/nfsnobody.raw file format: raw virtual size: 10G (10737418240 bytes) disk size: 1.1G
raw转qcow2格式:
# 参数说明 [root@kvm01 data]# qemu-img --help |grep convert qemu-img convert [-f fmt] [-O output_fmt] filename output_filename
转换原有磁盘格式
[root@kvm01 data]# qemu-img convert -f raw -O qcow2 nfsnobody.raw nfsnobody.qcow2
修改nfsnobody 虚拟机配置文件
[root@kvm01 data]# virsh edit nfsnobody 修改前: <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/data/nfsnobody.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> 修改后: <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/data/nfsnobody.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
删除原磁盘文件
[root@kvm01 data]# \rm nfsnobody.raw
启动虚拟机
[root@kvm01 data]# virsh start nfsnobody [root@kvm01 data]# virsh list --all Id 名称 状态 ---------------------------------------------------- 22 nfsnobody running
连接克隆脚本
#!/bin/bash # kvm link clone scripts # user nfsnobody # blog: https://www.nfsnobody.com # 2018-02-06 ### # init if [ $# -ne 2 ] then echo "Usage: $0 OLD_VMNAME NEW_VMNAME" exit 2 fi LOG=/var/log/messages old_vm=$1 new_vm=$2 new_xml="/tmp/${new_vm}.xml" . /etc/init.d/functions # dump old xmlfile virsh dumpxml $old_vm >$new_xml old_disk=`awk -F "'" '/source file/{print $2}' $new_xml` tmp_dir=`dirname $old_disk` new_disk=${tmp_dir}/${new_vm}.qcow2 # make link disk qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG # make over xml info sed -i '/uuid/d' $new_xml sed -i '/mac address/d' $new_xml sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml sed -i "s#$old_disk#$new_disk#g" $new_xml sed -i '/source mode/d' $new_xml # import new xml file virsh define $new_xml &>> $LOG # start new vm virsh start $new_vm &>> $LOG if [ $? -eq 0 ] then action "vmhost $new_vm start" /bin/true else action "vmhost $new_vm start" /bin/false echo "log info : $LOG" fi # END \rm $new_xml
说明:
第一步:复制虚拟磁盘文件
第二步:修改xml配置文件
1)name
2)uuid
3)虚拟磁盘存储路径
4)mac地址
1) 备份old_vm的配置文件,并重定向生成一个新的虚拟机配置文件 2)取出old_vm的磁盘路径 3)建立新的连接磁盘文件 4) 修改xml配置文件 5) 导入新虚拟机 6)启动测试