您好,欢迎访问这里是深圳市硕远科技有限公司!
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
联系我们
戴尔服务器价格_IBM联想配置_浪潮代理-深圳市硕远科技有限公司
邮箱:2324898850@qq.com
电话:400-080-6079
地址:深圳市龙华区河背工业区108创业园A301
当前位置:主页 > 新闻动态 > 企业新闻 >

企业新闻

kvm是什么设备(nova系列二:kvm介绍)

发布时间:2022-08-22 00:03:08浏览次数:
一 什么是kvm

KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。

Hypervisor即vmm,主要功能就是用来控制生成vm,并管理多个vm的运行,不同的vm中可以安装不同的操作系统,这些操作系统共用一台硬件主机,

因为直接使用linux内核的调度器进行管理,所以比xen的代码少很多

二 为何要用kvm

虚拟化是云计算的基础之一,而无论是在部署,还是在研发、测试方面,kvm都是排在第一位的Hypervisor(即vmm)。

kvm以高性能,可扩展性、高安全性,以及低成本而深受用户喜爱,这一切也与他基于linux内核实现有关。

三 kvm的功能

kvm用一个个进程来运行虚拟机。

最主要的功能:

  1. 基于kvm,可以执行热迁移,将一个运行的虚拟机从一个运行vm从一台物理机移动到另外一台物理主机,而vm里的运行不受影响(几台部署kvm虚拟化的物理机共享一个存储,存储内存放虚拟机的xml文件,这样在另外一台主机启一个虚拟机的进程是很快的,然后关联上待迁移主机的xml文件,就实现了热迁移);
  2. 可以保存当前虚拟机的运行状态到硬盘,然后可以重新启动虚拟机,这是虚拟机的运行状态和之前一样。

其余功能:

  • 支持CPU 和 memory 超分(Overcommit)
  • 支持半虚拟化I/O (virtio)
  • 支持热插拔 (cpu,块设备、网络设备等)
  • 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
  • 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
  • 支持 内核同页合并 (KSM )
  • 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
四 常见虚拟化模式

按照Hypervisor的实现方式和位置不同,常见的形式分两种

1. 全虚拟化

物理机上首先安装常规的操作系统( Redhat、Ubuntu 和 Centos等),然后在操作系统上安装kvm,kvm即Hypervisor,它会 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。除此之外:VirtualBox 和 VMWare Workstation 都属于这个类型。

2. 半虚拟化

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

五 KVM架构

openstack可以兼容很多虚拟化解决方案,其中最主要的就是针对x86平台的kvm。

KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。

具体的:

基于kvm创建的vm就是一个普通的linux进程,由linux内核调度程序进行调度,vm因此可以使用linux内核已有的功能。vm的执行本质就是vm中cpu的执行,因此vm的每个cpu就是普通的linux进程。

KVM有一个内核模块叫 kvm.ko,只提供 CPU 和内存的虚拟化,而针对于IO及其他硬件设备(网络及存储等)的虚拟化,则是交给qemu实现,qemu运行在用户态通过/dev/kvm接口设置一个客户机虚拟机服务器的地址空间,向kvm提供模拟的I/O,并且将它的视频显示映射回宿主的显示屏。

其实qemu本身就是一种虚拟化技术,它与kvm的区别如下

1. 上图的左侧:完全基于Qemu纯软件(不包含操作系统内核)实现的虚拟化。kqemu是通过kqemu模块实现内核态的加速,在用户态的qemu通过访问/dev/kqemu设备文件接口调用改进加速。不过,此类模式主要针对Guest os与Host os属于统一cpu架构(比如都是x86的架构)。一个明显的缺点是性能低下。

2. 上图的右侧:qemu+kvm实现的虚拟化(即qemu-kvm)。具体的,KVM并不能算是一个完整的虚拟化解决方案,kvm只是Linux标准内核加载了一个据说有几万行代码的模块kvm.ko。也就是说KVM仅可以在VT技术的基础上,提供虚拟的处理器和虚拟内存,至于IO硬件的模仿都交给qemu去做。

创建虚拟机流程

  1. 标准的Linux内核中加入KVM的模块kvm.ko变身成为一个VMM(VMM Virtual MachineMonitor)
  2. 在原有的用户模式(工作在ring3)和内核模式(工作在ring0)两种模式的基础上增加了新的客户模式。客户模式存在的特权级别与ring0-3正交。(也就是说客户模式也存在4个特权级别)
  3. 用户创建虚拟机,通过调用用户模式的qemu程序,qemu与kvm提供的libkvm库为接口,传递创建指令。
  4. 打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_KVM,即可创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。
  5. 获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。
  6. 然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。

总结:

  1. Guest OS(此处vm1的linux os):客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
  2. KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
  3. QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

KVM 是实现拦截虚机的 I/O 请求的原理:

现代 CPU 本身实现了对特殊指令的‘截获’和‘重定向’的硬件支持,甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化从而提高性能。以 X86 平台为例,支持虚拟化技术的 CPU 带有特别优化过的指令集来控制虚拟化过程。通过这些指令集,VMM 很容易将客户机置于一种受限制的模式下运行,一旦客户机视图访问物理资源,硬件会暂停客户机的运行,将控制权交回给 VMM 处理。VMM 还可以利用硬件的虚级化增强机制,将客户机在受限模式下对一些特定资源的访问,完全由硬件重定向到 VMM 指定的虚拟资源,整个过程不需要暂停客户机的运行和 VMM 的参与。由于虚拟化硬件提供全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM的设计,使得VMM性能更加强大。从 2005 年开始,Intel 在其处理器产品线中推广 Intel Virtualization Technology 即 IntelVT 技术。

QEMU-KVM:

其实 QEMU 原本不是 KVM 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。

为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。遇到虚机进行 I/O 操作,KVM 会从上次的系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。

从 QEMU 的角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行说依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。

KVM:

KVM 内核模块在运行时按需加载进入内核空间运行。KVM 本身不执行任何设备模拟,需要 QEMU 通过 /dev/kvm 接口设置一个 GUEST OS 的地址空间,向它提供模拟的 I/O 设备,并将它的视频显示映射回宿主机的显示屏。它是KVM 虚机的核心部分,其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。以在 Intel 上运行为例,KVM 模块被加载的时候,它:

  1. 首先初始化内部的数据结构;
  2. 做好准备后,KVM 模块检测当前的 CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式;
  3. 最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令。

接下来的虚机的创建和运行将是 QEMU 和 KVM 相互配合的过程。两者的通信接口主要是一系列针对特殊设备文件 dev/kvm 的 IOCTL 调用(ioctl是设备驱动程序中对设备的I/O通道进行管理的函数)。其中最重要的是创建虚机。它可以理解成KVM 为了某个特定的虚机创建对应的内核数据结构,同时,KVM 返回一个文件句柄来代表所创建的虚机。

针对该句柄的调用可以对虚机做相应地管理,比如创建用户空间虚拟地址和客户机物理地址、真实物理地址之间的映射关系,再比如创建多个 vCPU。KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定如何处理。

除了 CPU 的虚拟化,内存虚拟化也由 KVM 实现。实际上,内存虚拟化往往是一个虚机实现中最复杂的部分。CPU 中的内存管理单元 MMU 是通过页表的形式将程序运行的虚拟地址转换成实际物理地址。在虚拟机模式下,MMU 的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。

四 KVM工具集合

Libvirt:简单说就是 KVM 的管理工具。并且Libvirt 除了能管理 KVM 这种 Hypervisor,还能同时管理 vmware,XEN,Hyper-v, LXC,QEMU 等多种Hypervisor。

Libvirt 本质就是一组API,通常部署完libvirt后,都会包含 3 样东西:一个API 库,一个后台守护进程libvirtd和一个命令行工具virsh。

  1. API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化管理KVM的常用工具。;
  2. libvirtd是服务程序,接收和处理 API 请求;
  3. virsh :基于 libvirt 的 命令行的常用工具 (CLI)。

一:libvirt实现在一台物理机上同时跑多个虚拟机监控程序vmm

libvirt期初是专门为Xen设计的一种管理API,后来被扩展为可支持多个VMM,libvirt以一组API的形式存在,负责与每个vmm通信,完成API请求

左图是没有引入libvirt时,一台机器只能运行一个Hypervisor/vmm,右图是引入了libvirt时,一台机器可以同时运行多个Hypervisor/vmm,此时需要注意的是,libvirt把物理主机称作节点,将来宾操作系统(guest os)称为域Domain,而libvirt及其应用程序在宿主机Domain 0中运行

二 libvirtd提供从远程应用程序访问本地域的方式

三 libvrt api与相关驱动程序的层次结构。

libvirt 已经为表 1 所列举出来的的虚拟机监控程序实现了驱动程序。随着新的虚拟机监控程序在开源社区出现,其他驱动程序无疑也将可用。

四 libvirt主要功能总结

  1. Domain(虚拟机)管理:启动、停止、暂停、保存、恢复和迁移。支持多种涉笔类型的热插拔,如磁盘、网卡、内存和cpu。
  2. 远程访问支持:见图2,只要在一台主机上运行libvirtd守护进程,所有的libvirt功能就都可以访问和使用。支持多种网络远程传播,使用最简单的SSH,不需要额外的配置工作,比如example.com物理机运行了libvirtd,而且允许SSH访问,下面命令就可以在远程的主机上使用virsh命令:virsh -connect qemu+ssh://root@example.com/system
  3. 存储管理:任何运行了libvirtd的主机都可以用来管理不同类型的存储,如创建不同格式的文件映像(qcow2,vmdk,raw等),挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂在iSCSI共享等等,因为libvirt可以远程工作,所有这些都可以通过远程主机来使用。
  4. 网络接口管理:任何运行了libvirtd的主机都可用来管理物理和逻辑的网络接口,可以列出现有的接口、配置参数、桥接、VLAN和关联设备等,也可以创建新的网络接口。
  5. 虚拟NAT和基于路由的网络:任何运行了libvirtd的主机都可以用来管理和创建虚拟网络。libvirt虚拟网络使用防火墙规则作为路由器,让虚拟机可以透明访问主机的网络。

ps:libvirt使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用,OpenStack 底层也使用 libvirt。

除此之外还包含下列工具:

virt-v2v:虚机格式迁移工具

virt-* 工具:包括 virt-install(创建KVM虚机的命令行工具),virt-viewer(连接到虚机屏幕的工具),virt-clone(虚机克隆工具),virt-top 等

sVirt:安全工具

五 kvm部署

5.1 虚拟化支持

KVM虚拟化需要CPU的硬件辅助虚拟化的支持,用来加速,在本环境中为Intel的CPU,使用的Intel VT技术。(该功能在有些主机里面可能需要去BIOS里面开启)

5.2 软件准备

操作系统: CentOS 7.2

软件包: CentOS自带yum源

关闭防火墙

关闭SELinux:将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=disabled

开始安装

5.3 检查CPU虚拟化支持

如果是用vmware workstation的虚拟机做kvm实验的化,需要开启嵌套虚拟化

1.在物理机BIOS设置里开启虚拟化功能

2.此时你的vm仍然不能开启虚拟化,下列两个

3.找到这台虚拟机存在的目录

4.打开该目录找到.vmx结尾的文件,增加一行

apic.xapic.enabled = "FALSE"

5.关闭虚拟机,然后启动,就可以勾选开启虚拟化功能了

进入虚拟机后查看虚拟化支持:

# grep -E 'svm|vmx' /proc/cpuinfo

vmx 为Intel的CPU指令集

svm 为AMD的CPU指令集

5.4 安装软件包

[root@localhost ~]# yum grouplist |grep '虚拟'
 虚拟化主机
[root@localhost ~]# yum -y groupinstall '虚拟化主机'
[root@localhost 桌面]# lsmod |grep kvm
kvm_intel 138567 0
kvm 441119 1 kvm_intel
#以上输出说明内核模块加载成功,其中: kvm作为核心模块,协同QEMU实现整个虚拟化环境的正常运行。 kvm_intel作为平台(Intel)独立模块,激活KVM环境的CPU硬件虚拟化支持。
qemu-kvm:主要的KVM程序包,该软件包主要包含KVM内核模块和基于KVM重构后的QEMU模拟器。KVM模块作为整个虚拟化环境的核心工作在系统空间,负责CPU和内存的调度。QEMU作为模拟器工作在用户空间,负责虚拟机I/O模拟。
qemu-img:主要用来QEMU磁盘镜像的管理,如新建一块磁盘镜像给虚拟机。
libvirt:提供Hypervisor和虚拟机管理的API。
libvirt-client:KVM客户端命令行管理工具virsh,负责虚拟机的启动、停止和管理等。
libvirt-daemon:libvirtd守护进程,作为客户端管理工具跟Hypervisor和虚拟机之间的桥梁。
libvirt-daemon-driver-xxx:从名字来看属于libvirtd服务的驱动文件,作为libvirtd服务跟Hypervisor不同对象(如qemu模拟器,网络,存储等)间的接口。
libvirt-python:python的libvirt库
python-virtinst:创建虚拟机所需要的命令行工具和程序库
virt-install:创建和克隆虚拟机的命令行工具包。
virt-manager:图形界面的KVM管理工具。
virt-top:虚拟机统计命令
virt-viewer:GUI连接程序,连接到已配置好的虚拟机
bridge-utils:网桥管理工具包,负责桥接网络的创建、配置和管理等工作。

5.5 激活并启动libvirtd服务

systemctl enable libvirtd 
systemctl start libvirtd 

5.6 网络模式

详见
http://blog.csdn.net/cooling88/article/details/52203998

NAT方式:

virbr0网桥相当于一个hub或交换机,eth0相当于路由器,virbr0-nic相当于交换机virbr0上的一个接口,这个接口连接一根网线到路由器eth0

Bridge的方式:

br0网桥相当于一个hub或交换机,eth0相当于相当于交换机br0上的一个接口,这个接口连接一根网线到物理网络

尝试着从下图总找出上述所说

5.7 配置桥接网络

默认情况下所有虚拟机只能够在host内部互相通信,如果需要通过局域网访问虚拟机,需要创建一个桥接网络。

1.停止NetworkManager服务

# systemctl stop NetworkManager

该服务开启的情况下直接去修改网卡的配置文件会造成信息的不匹配而导致网卡激活不了。

2.修改以太网卡配置文件

(修改前先备份)

# cd /etc/sysconfig/network-scripts

# vi ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

ONBOOT=yes

BRIDGE=br0

HWADDR=b8:ae:ed:7d:9d:11

NM_CONTROLLED=no

原有的以太网络不需要配置IP地址,指定桥接的网卡设备(如br0)即可。

3.修改桥接网卡配置文件

# cd /etc/sysconfig/network-scripts

# vi ifcfg-br0

TYPE=Bridge

HWADDR=b8:ae:ed:7d:9d:11

BOOTPROTO=static

DEVICE=br0

ONBOOT=yes

IPADDR=192.168.2.10

NETMASK=255.255.255.0

GATEWAY=192.168.2.1

DNS1=202.103.24.68

NM_CONTROLLED=no

#桥接网卡的需要配置IP地址,当然也可以用DHCP。需要注意的是桥接网卡br0中DEVICE的名字一定要与以太网卡eno1中BRIDGE对应。

强调:

1 #网卡配置文件中NM_CONTROLLED参数设置为no
2 
3 #执行:
4 
5 [root@localhost ~]# systemctl stop NetworkManager
6 [root@localhost ~]# systemctl disable NetworkManager

开启主机IP地址

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

# sysctl -p

重启网络服务

# systemctl restart network

ps:针对NAT网路须知

需要掌握iptables:

详细规则参考:

1 #源地址转换:内部访问外部
2 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66
3 iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
4 
5 #目标地址转换:外部访问内部
6 iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112

5.8 验证网络

# ip a

eno1: mtu 1500 qdisc pfifo_fast master br0 state UP

br0: mtu 1500 qdisc noqueue state UP

inet 192.168.2.10/24 brd 192.168.2.255 scope global br0

截取了部分输出,eno1和br0网卡都处于激活状态,eno1桥接到br0,br0被分配了静态IP地址。

5.9 尝试连接Hypervisor

# virsh -c qemu:///system list

# virsh list

Id Name State

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

(由于没有创建虚拟机,所以没有条目显示)

5.10 创建虚拟机

方法一:# virt-manager

针对这种方法,我们可以在服务端部署vncserver,然后用VNC Viewer来连接它的桌面,然后用图形化去创建虚拟机

#安装X-Windows图形界面
yum -y groupinstall "X Window System"
yum -y install gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts
#设置默认启动图形界面
unlink /etc/systemd/system/default.target
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
reboot
#安装vnc服务
yum install tigervnc-server -y
#配置vnc
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
vim /etc/systemd/system/vncserver@\:1.service
#修改内容
#ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
#PIDFile=/root/.vnc/%H%i.pid
#重启systemd
systemctl daemon-reload
#为root用户设置密码
vncpasswd
systemctl enable vncserver@:1.service
systemctl start vncserver@:1.service
#添加防火墙规则,放行vncserver
firewall-cmd --permanent --add-service vnc-server
systemctl restart firewalld.service
#客户端连接
#打开vncviewer客户端工具,然后访问地址是:服务端ip:1

方法二:virt-install

1:粗糙版:执行完了,并不能立即安装操作系统

#要有桥brctl add-br br0
#安装选项可用virt-install --help查看,写的非常清楚
virt-install \
--name guest1-centos7-64 \
--memory 1024 \
--arch x86_64 \
--vcpus 2 \
--os-variant=rhel7 \
--disk /var/lib/libvirt/images/guest1-centos7-64.img,device=disk,bus=virtio,size=20,sparse=true \
--network bridge=br0 \
--noautoconsole \
--location=/iso/CentOS-7.0-1406-x86_64-DVD.iso
virt-install \ #安装选项可用virt-install --help查看
--name=guest1-centos7-64 \ #虚拟机名称
--ram=1024 \ #内存大小以MB为单位
--arch=x86_64 \ #cpu架构
--vcpus=2 \ #虚拟机cpu的个数
--check-cpu \ #检查确定vcpu是否超过物理cpu个数,超过则发出警告
--os-type=linux \ #要安装的操作系统类型,例如linux,unix,windows
--os-variant=centos7.2 \ #要安装的操作系统版本
--disk path=/var/lib/libvirt/images/guest1-centos7-64.img,device=disk,bus=virtio,size=20,sparse=true \ #虚拟机所用的磁盘文件或镜像文件,size以G为单位
#--diskpath=/data/new.img,format=qcow2,size=10,bus=virtio \ #后面会讲到制作qcow2格式的镜像
#--nonsparse \
--network bridge=br0 \ #指定网络,采用网桥
--noautoconsole \ #不自动开启控制台
--location=http://example1.com/installation_tree/RHEL5.6-Serverx86_64/os \ #指定安装操作系统给的镜像位置
#--pxe \ #也可以是无人值守安装
#--graphics #指定安装通过哪种类型,可以是vnc,也可以没有图形,在这里我们没有使用图形直接使用文本方式

2:改进版:在命令行直接文本的方式装系统

必须先做如下操作:

#针对Centos7+kvm为了执行console功能,即在控制台以文本的方式控制vm
#在虚机里运行
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0"
[root@localhost ~]# reboot

然后才可以在命令行安装操作系统

virt-install \
--name test1 \
--memory 1024 \
--arch x86_64 \
--vcpus 2 \
--os-type linux \
--os-variant=rhel7 \
--disk /data/kvm/test02.qcow2,format=qcow2,size=10,bus=virtio \
--network bridge=virbr0 \
--location=/iso/CentOS-7.0-1406-x86_64-DVD.iso \
--graphics none \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial'

方法三 使用 qemu-img 和 qemu-kvm 命令行方式安装

(1)创建一个空的qcow2格式的镜像文件

qemu-img create -f qcow2 windows-master.qcow2 10G

(2)启动一个虚机,将系统安装盘挂到 cdrom,安装操作系统

qemu-kvm -hda windows-master.qcow2 -m 512 -boot d -cdrom /home/user/isos/en_winxp_pro_with_sp2.iso

(3)现在你就拥有了一个带操作系统的镜像文件。你可以以它为模板创建新的镜像文件。使用模板的好处是,它会被设置为只读所以可以免于破坏。

qemu-img create -b windows-master.qcow2 -f qcow2 windows-clone.qcow2

(4)你可以在新的镜像文件上启动虚机了

qemu-kvm -hda windows-clone.qcow2 -m 400
5.11 虚拟机操作

开关虚拟机

virsh start guest1-centos7-64 #开机
virsh shutdown guest1-centos7-64 #关机
virsh destroy guest1-centos7-64 #强制关闭电源
virsh list --all #查看虚拟机状态

远程管理虚拟机(qemu+ssh连接)

#在被管理的机器上
yum -y install virt-viewer
export DISPLAY=被管理机IP:0.0
virt-virt-viewer -c qemu///system guest1-centos7-64 #本地管理虚拟机,获取system权限,注意qemu后是三个/
#在管理机上
virt-viewer -c qemu+ssh://root@被管理机IP/system guest1-centos7-64 #远程linux通过virt-viewer+ssh管理虚拟机guest1-centos7-64

制作镜像文件

参考
http://www.361way.com/kvm-qcow2-preallocation-metadata/3354.html 示例:qemu-img create -f qcow2 -opreallocation=metadata /data/test02.img 10G;

raw格式与qcow2格式的对比:

raw的优势如下:

  1. 简单,是转为其他虚拟机格式的通用中间格式,并能够到处到其他引进模拟器中去
  2. 在支持稀疏文件的系统上,根据实际使用量来占用空间,而非原先设定的最大值(比如设定最高20GB,而实际只使用3GB)
  3. 以后能够改变空间的最大值(把最高值20GB提高到200GB,qcow2也可以,不过要转换为raw)
  4. 能够直接被宿主机挂载,不用开虚拟机即可在宿主机和vm之间进行数据传输(此时不能开机)
  5. 直接读写虚拟机硬盘里的文件

qocw2性能更好:

  1. 即使在不支持稀疏的文件系统上,也可以获得最小的空间
  2. 可以动态扩大,支持写时复制
  3. AES加密
  4. zlib压缩
  5. 支持多重虚拟机快照
  6. 然而raw的很多优势,必须是在关机是才可以用,如直接挂载。而在生成环境不可能让你这么做。
  7. raw格式不能做快照,后面有说明,需要转换为qcow2格式,如果要使用qcow2格式的虚拟磁盘,需要事先创建qcow2格式的虚拟磁盘。
400-080-6079