如何从一台主机上esxi5虚拟机迁移到kvm KVM 到另一台主机.txt

KVM学习笔记,康奈尔笔记法 - 科技 - 主客网
&&&&&& & 正文 &
KVM学习笔记
点击:2001次
导读: 一、KVM 原理
二、KVM 基础功能
三、KVM 高级功能
3.1 半虚拟化驱动
3.2 热插拔 (hot plugging)
3.3 动态迁移
四、KVM 管理工具
五、参考文档
一、KVM …
一、KVM 原理二、KVM 基础功能2.1 CPU2.2 内存2.3 存储2.4 网络三、KVM 高级功能3.1 半虚拟化驱动3.2 热插拔 (hot plugging)3.3 动态迁移四、KVM 管理工具libvirt五、参考文档一、KVM 原理KVM「Kernel-based Virtual Machine」,KVM 是基于虚拟化扩展 (Intel VT/AMD-V) 的 X86 硬件,是 Linux 完全原生的全虚拟化解决方案。KVM 本身不执行任何模拟,需要用户空间应用程序QEMU通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,KVM 模块实现处理器的虚拟化和内存虚拟化。在硬件虚拟化技术的支持下,内核的 KVM 模块与 QEMU 的设备模拟协同工作,构成一套和物理计算机系统完全一致的虚拟化计算机软硬件系统。二、KVM 基础功能2.1 CPU在 QEMU/KVM 中,QEMU 提供对 CPU 的模拟,展现给客户机一定的 CPU 数目和 CPU 的特性。在 KVM 打开的情况下,客户机中 CPU 指令的执行由硬件处理器的虚拟化功能「如 Intel VT-x 和 AMD AMD-V」辅助执行,具有非常高的执行效率。在 KVM 环境中,每个客户机都是一个标准的 Linux 进程(QEMU 进程),而每一个 vCPU 在宿主机中是 QEMU 进程派生的一个普通线程。在 Linux 中,一般进程有两种执行模式:内核模式用户模式而在 KVM 环境中,增加了第三条模式:客户模式。vCPU 在三种执行模式下的分工如下:用户模式主要处理 I/O 的模拟和管理,由 QEMU 的代码实现内核模式主要处理特别需要高性能和安全相关的指令,如处理客户模式到内核模式的转换,处理客户模式下的 I/O 指令或其它特权指令引起的 VM-Exit,处理影子内存管理 (shadow MMU)客户模式主要执行 Guest 中的大部分指令,I/O 和一些特权指令除外「它们会引起 VM-Exit,被 hypervisor 截获并模拟」2.2 内存内存是一个非常重要的部件,它是与 CPU 沟通的一个桥梁。在通过 QEMU 命令行启动客户机时设置内存的参数是-m:-mmegs # 设置客户机的内存为 megs MB 大小EPT 和 VPIDEPT(Extended Page Tables,扩展页表),属于 Intel 的第二代硬件虚拟化技术,它是针对内存管理单元(MMU)的虚拟化扩展。如果只是一台物理服务器,这个物理地址就只为一个操作系统服务,但如果进行了虚拟化部署,有多个虚拟机时,就存在着稳定性的隐患。因为在进行 VM Entry(虚拟机进入)与 VM Exit(虚拟机退出)时(尤其是后者),都要对内存页进行修改。但物理内存是多个虚拟机共享的,因此不能让虚拟机直接访问物理地址,否则一个虚拟机出现内存错误,就会殃及整个物理服务器的运行。所以必须要采取虚拟地址,而 EPT 的作用就在于加速从虚拟机地址至主机物理地址的转换过程,节省传统软件处理方式的系统开销。VPID(Virtual-Processor Identifiers,虚拟处理器标识)。是对现在的 CPUID 功能的一个强化,因为在每个 CPU 中都有一个 TLB,用来缓存逻辑地址到物理地址的转换表,而每个虚拟机都有自己的虚拟 CPU 来对应。所以,在进行迁移时要进行 TLB 的转存和清除。而 VPID 则会跟踪每个虚拟 CPU 的 TLB,当进行虚拟机迁移或 VM Entry 与 VM Exit 时,VMM可以动态的分配非零虚拟处理器的 ID 来迅速匹配(0 ID 给 VMM 自己使用),从而避免了 TLB 的转存与清除的操作,节省了系统开销,并提高了迁移速度,同时也降低对系统性能的影响。# grep -E 'ept|vpid' /proc/cpuinfo # 查看 cpu 是否支持相应特性# cat /sys/module/kvm_intel/parameters/{ept,vpid} # 确认是否开启 ept 和 vpidY Y2.3 存储QEMU 提供了对多种块存储设备的模拟,包括 IDE、SCSI、软盘、U盘、virtio 磁盘等。qemu-kvm 提供-drive参数来详细定义一个存储驱动器:-drive option[,option[,option[,...]]]Define a new drive. Valid options are: file=file # 指定硬盘镜像,file=镜像文件名if=interface # 指定驱动器使用的接口类型,如 ide, scsi, sd, mtd, floppy, pflash, virtiosnapshot=snapshot # 是否启动快照snapshot is "on" or "off" and allows to enable snapshot for given drive.Write to temporary files instead of disk image files. In this case, theraw disk image you use is not written back. You can however force thewrite back by pressing C-a s. cache=cache # 设置宿主机对块设备数据访问中的 cache 情况cache is "none", "writeback", "unsafe", or "writethrough" andcontrols how the host cache is used to access block data. format=format # 指定使用的磁盘格式Specify which disk format will be used rather than detecting the format.Can be used to specifiy format=raw to avoid interpreting an untrusted formatheader.... ...cache 不同模式工作原理图:writethrough即直写模式,KVM cache 默认使用writethrough,它是在调用 write 写入数据的同时将数据写入磁盘缓存和后端块设备才返回,缺点是写入性能较低,但是安全性高。qcow2格式在使用writethrough时性能很差writeback即回写模式,在调用 write 写入数据时只将数据写入到主机页缓存中即返回,写入性能高,有安全风险。当使用-snapshot选项的时候,writebackcache 是默认项none关闭缓存,直接从磁盘 IO 读写unsafe这个选项告诉 QEMU 不需要写入任何数据到磁盘,只要保证在缓存即可qemu-imgqemu-img是 QEMU 的磁盘管理工具,支持多种虚拟镜像格式$ qemu-img -h | grep SupportedSupported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfatqcow2 qed parallels nbd blkdebug host_cdrom host_floppy host_device fileqemu-img默认创建的格式是raw,man手册中对几种格式也都有介绍。以下为对 raw 和 qcow2 镜像的详细介绍:raw原始的磁盘镜像格式,qemu-img 默认支持的格式,它的优势在于它非常简单而且非常容易移植到其他模拟器(emulator,QEMU 也是一个 emulator)上去使用。如果客户机文件系统(如 Linux 上的 ext2/ext3/ext4、Windows 的 NTFS)支持“空洞” (hole),那么镜像文件只有在被写有数据的扇区才会真正占用磁盘空间,从而有节省磁盘空间的作用。qemu-img默认的raw格式的文件其实是稀疏文件(sparse file)「稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被 ASCII 码的 NULL 字符占据,并且这些空间相当大,那么这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块」,dd 命令创建的也是 raw 格式,不过 dd 一开始就让镜像实际占用了分配的空间,而没有使用稀疏文件的方式对待空洞而节省磁盘空间。尽管一开始就实际占用磁盘空间的方式没有节省磁盘的效果,不过它在写入新的数据时不需要宿主机从现有磁盘空间中分配,从而在第一次写入数据时性能会比稀疏文件的方式更好一点。简单来说,raw 有以下几个特点:寻址简单,访问效率高可以通过格式转换工具方便地转换为其它格式格式实现简单,不支持压缩、快照和加密能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输qcow2qcow2是 qcow 的一种改进,是 QEMU 实现的一种虚拟机镜像格式。更小的虚拟硬盘空间(尤其是宿主分区不支持 hole 的情况下),支持压缩、加密、快照功能,磁盘读写性能较 raw 差。qemu-img 支持的命令分为以下几种(1)check [-f fmt] filename对磁盘镜像文件进行一致性检查,查找镜像文件中的错误,目前仅支持对qcow2、qed、vdi格式文件的检查。其中,qcow2是 QEMU 0.8.3 版本引入的镜像文件格式,也是目前使用最广泛的格式。qed(QEMU enhanced disk)是从 QEMU 0.14 版开始加入的增强磁盘文件格式,为了避免 qcow2 格式的一些缺点,也为了提高性能,不过目前还不够成熟。而vdi(Virtual Disk Image)是 Oracle 的 VirtualBox 虚拟机中的存储格式。参数-f fmt是指定文件的格式,如果不指定格式qemu-img会自动检测,filename是磁盘镜像文件的名称(包括路径)。$ qemu-img check CentOS6.4-x86_2No errors were found on the image.(2)create [-f fmt] filename [size]创建一个格式为 fmt 大小为 size 文件名为 filename 的镜像文件。$ qemu-img create -f qcow2 2 10GFormatting '2', fmt=qcow2 size= encryption=off cluster_size=65536 $ qemu-img create -f qcow2
10GFormatting '', fmt=qcow2 size= encryption=off cluster_size=65536注意:这里的 qcow2 后缀只是为了便于自己区分格式方便,如果不加后缀也可以通过 qemu-img 来获取镜像的格式。(3)info [-f fmt] filename显示 filename 镜像文件的信息。如果文件是使用稀疏文件的存储方式,也会显示出它的本来分配的大小以及实际已占用的磁盘空间大小。如果文件中存放有客户机快照,快照的信息也会被显示出来。$ qemu-img info 2image: 2file format: qcow2virtual size: 10G ( bytes)disk size: 136Kcluster_size: 65536$ qemu-img info # qemu-img 生成 raw 格式镜像也是采用稀疏文件方式存储的image:file format: qcow2virtual size: 10G ( bytes)disk size: 136Kcluster_size: 65536$ dd
bs=1MB count= records in1000+0 records out bytes (1.0 GB) copied, 1.80597 s, 554 MB/s$ qemu-img info# 可以看到 dd 产生的格式也是 raw 格式的,并且没有用到稀疏存储方式image:file format: rawvirtual size: 954M ( bytes)disk size: 954M(4) convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename2 […]] output_filename镜像格式转换,将 fmt 格式的 filename 镜像文件根据 options 选项转换为格式为output_fmt的名为output_filename的镜像文件。它支持不同格式的镜像文件之间的转换,比如可以用 VMware 用的 vmdk 格式文件转换为 qcow2 文件,这对从其他虚拟化方案转移到 KVM 上的用户非常有用。一般来说,输入文件格式 fmt 由 qemu-img 工具自动检测到,而输出文件格式 output_fmt 根据自己需要来指定,默认会被转换为与 raw 文件格式(且默认使用稀疏文件的方式存储以节省存储空间)。 其中,“-c”参数是对输出的镜像文件进行压缩,不过只有 qcow2 和 qcow 格式的镜像文件才支持压缩,而且这种压缩是只读的,如果压缩的扇区被重写,则会被重写为未压缩的数据。同样可以使用“-o options”来指定各种选项,如:后端镜像、文件大小、是否加密等等。使用backing_file选项来指定后端镜像,让生成的文件是copy-on-write的增量文件,这时必须让转换命令中指定的后端镜像与输入文件的后端镜像的内容是相同的,尽管它们各自后端镜像的目录、格式可能不同。如果使用qcow2、qcow、cow等作为输出文件格式来转换raw格式的镜像文件(非稀疏文件格式),镜像转换还可以起到将镜像文件转化为更小的镜像,因为它可以将空的扇区删除使之在生成的输出文件中并不存在。$ qemu-img infoimage:file format: rawvirtual size: 954M ( bytes)disk size: 954M$ qemu-img convert -O qcow2
test_2$ qemu-img info test_2image: test_2file format: qcow2virtual size: 954M ( bytes)disk size: 136Kcluster_size: 655362.4 网络QEMU 支持的网络模式基于网桥的虚拟网卡基于 NAT 的虚拟网络QEMU 内置的用户模式网络直接分配网络设备的网络「VT-d 和 SR-IOV」qemu-kvm 通过-net参数配置网络选项-netnic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v] Create a new Network Interface Card and connect it to VLAN n (n = 0 isthe default). The NIC is an rtl8139 by default on the PC target. Optionally, the MAC address can be changed to mac, the device address set to addr (PCI cards only), and a name can be assigned for use inmonitor commands. Optionally, for PCI cards, you can specify the number v of MSI-X vectors that
this optioncurrently only
set v = 0 to disable MSI-X. If no-net option is specified, a single NIC is created. Qemu can emulateseveral different models of network card. Valid values for type are"virtio", "i82551", "i82557b", "i82559er", "ne2k_pci", "ne2k_isa", "pcnet", "rtl8139", "e1000", "smc91c111", "lance" and "mcf_fec". Notall devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target.-net nic必需的参数,表明是一个网卡的配置vlan=n表示将网卡放入到编号为 n 的 VLAN,默认为 0macaddr=mac自定义 MAC 地址model=type设置模拟的网卡类型,默认为 rtl8139如果提供 VM 多个网卡,则需要多次使用-net参数。桥接网络手动桥接qemu-kvm安装或者启动虚拟系统的时候如果需要和外界通信,那么就要设置网络桥接/usr/libexec/qemu-kvm -m 1024 \-drive file=/data/images/CentOS6_2,if=virtio \-net nic,model=virtio -net tap,script=no -nographic -vnc :0使用-net tap,script=no方式启动之后,系统会生成 tapX 的虚拟网卡,默认是 DOWN 状态# ip link show dev tap037: tap0:
mtu 1500 qdisc noop state DOWN qlen 500link/ether d2:b0:af:7b:23:0f brd ff:ff:ff:ff:ff:ff如果想和外界通信,可以手动执行生效,如下所示当前与 br0 桥接的设备,并没有 tap 相关的网卡# brctl show br0bridge name bridge id STP enabled interfacesbr0 a626020 no eth0vnet0vnet1我们需要把 tap0 也桥接到 br0 下以便和外界通信,方法如下:# ip link set tap0 up # 使 tap0 状态变为 up# brctl addif br0 tap0 # 桥接 tap0 到 br0# brctl show br0 bridge name bridge id STP enabled interfacesbr0 a626020 no eth0tap0vnet0vnet1brctl delif br0 tap0删除桥接网络,qemu-kvm 工具在客户机关闭时会自动解除 TAP 设备的 bridge 绑定,所以这一步无需操作。脚本实现/usr/libexec/qemu-kvm -m 1024 \-drive file=/data/images/CentOS6_2,if=virtio \-net nic,model=virtio -net tap,script=/tmp/ -nographic -vnc :0如上tap,script=/tmp/指定 script 网络配置启动前启动脚本,脚本内容如下# cat /tmp/ #!/bin/bash# 桥接网络设备switch=br0if [ -n $1 ]; then # $1为qemu-kvm传递值,这里是tapip link set $1 upbrctl addif ${switch} $1exit 0elseecho "no interface!"exit 1fi三、KVM 高级功能3.1 半虚拟化驱动virtioKVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x、AMD-V)的 hypervisor,在 CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。QEMU/KVM 提供了全虚拟化环境,可以让客户机不经过任何修改就能运行在 KVM 环境中。不过,KVM 在 I/O 虚拟化方面,传统的方式是使用 QEMU 纯软件的方式来模拟 I/O 设备(如模拟的网卡、磁盘、显卡等等),其效率并不非常高。在 KVM 中,可以在客户机中使用半虚拟化驱动(Paravirtualized Drivers,PV Drivers)来提高客户机的性能(特别是 I/O 性能)。目前,KVM 中实现半虚拟化驱动的方式是采用了virtio这个 Linux 上的设备驱动标准框架。QEMU 模拟 I/O 设备的基本原理和优缺点使用 QEMU 模拟 I/O 的情况下,当客户机中的设备驱动程序(device driver)发起 I/O 操作请求之时,KVM 模块中的 I/O 操作捕获代码会拦截这次 I/O 请求,然后经过处理后将本次 I/O 请求的信息存放到 I/O 共享页,并通知用户控件的 QEMU 程序。QEMU 模拟程序获得 I/O 操作的具体信息之后,交由硬件模拟代码来模拟出本次的 I/O 操作,完成之后,将结果放回到 I/O 共享页,并通知 KVM 模块中的 I/O 操作捕获代码。最后,由 KVM 模块中的捕获代码读取 I/O 共享页中的操作结果,并把结果返回到客户机中。当然,这个操作过程中客户机作为一个 QEMU 进程在等待I/O时也可能被阻塞。另外,当客户机通过 DMA(Direct Memory Access)访问大块 I/O 之时,QEMU 模拟程序将不会把操作结果放到 I/O 共享页中,而是通过内存映射的方式将结果直接写到客户机的内存中去,然后通过 KVM 模块告诉客户机 DMA 操作已经完成。QEMU 模拟 I/O 设备的方式,其优点是可以通过软件模拟出各种各样的硬件设备,包括一些不常用的或者很老很经典的设备(如 RTL8139 网卡),而且它不用修改客户机操作系统,就可以实现模拟设备在客户机中正常工作。在 KVM 客户机中使用这种方式,对于解决手上没有足够设备的软件开发及调试有非常大的好处。而它的缺点是,每次 I/O 操作的路径比较长,有较多的 VMEntry、VMExit 发生,需要多次上下文切换(context switch),也需要多次数据复制,所以它的性能较差。virtio 的基本原理和优缺点virtio 是一个在 hypervisor 之上的抽象 API 接口,让客户机知道自己运行在虚拟化环境中,从而与 hypervisor 根据 virtio 标准协作,从而在客户机中达到更好的性能(特别是 I/O 性能)。其中前端驱动(frondend,如 virtio-blk、virtio-net 等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在 QEMU 中实现的。在这前后端驱动之间,还定义了两层来支持客户机与 QEMU 之间的通信。其中,virtio 这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可以使用 0 个或多个队列,具体数量取决于需求。例如,virtio-net 网络驱动程序使用两个虚拟队列(一个用于接收,另一个用于发送),而 virtio-blk 块驱动程序仅使用一个虚拟队列。虚拟队列实际上被实现为跨越客户机操作系统和 hypervisor 的衔接点,但它可以通过任意方式实现,前提是客户机操作系统和 virtio 后端程序都遵循一定的标准,以相互匹配的方式实现它。而 virtio-ring 实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息,并且它可以一次性保存前端驱动的多次 I/O 请求,并且交由后端去动去批量处理,最后实际调用宿主机中设备驱动实现物理上的 I/O 操作,这样做就可以根据约定实现批量处理而不是客户机中每次 I/O 请求都需要处理一次,从而提高客户机与 hypervisor 信息交换的效率。Virtio 半虚拟化驱动的方式,可以获得很好的 I/O 性能,其性能几乎可以达到和 native(即:非虚拟化环境中的原生系统)差不多的 I/O 性能。所以,在使用 KVM 之时,如果宿主机内核和客户机都支持 virtio 的情况下,一般推荐使用 virtio 达到更好的性能。当然,virtio 的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照 Virtio 的规定格式进行数据传输,不过客户机中可能有一些老的 Linux 系统不支持 virtio 和主流的Windows系统需要安装特定的驱动才支持 Virtio。不过,较新的一些 Linux 发行版(如 RHEL 6.x、Fedora 17 等)默认都将 virtio 相关驱动编译为模块,可直接作为客户机使用 virtio。Windows 系统需要额外的安装相应的 virtio 区别,virtio-win。virtio_net 和 vhost_net使用 virtio_net 半虚拟化驱动,可以提高网络吞吐量和降低网络延迟。vhost_net 能够把网络 IO 请求的后端处理在内核空间完成,则效率更高,会提高网络吞吐量和减少网络延迟。virtio_blkvirtio_blk 驱动使用 virtio API 为客户机提供了一个高效访问块设备 I/O 的方法。使用 virtio_blk 驱动的磁盘显示为/dev/vd*。Device Assignment and SR-IOV3.2 热插拔 (hot plugging)热插拔可以提高服务器扩展性、灵活性以及对相关硬件问题的及时恢复能力。在服务器中,可以实现热插拔的部件主要是 SATA 硬盘、CPU、内存、USB、网卡、风扇等。在 KVM 虚拟化环境中,也支持客户机相应的设备热插拔。目前,KVM 对热插拔的支持还不是很完善,主要支持 PCI 设备和 CPU 的热插拔,内存的热插拔目前还不是很完善。Red_Hat_Enterprise_Linux_6.5_Release_NotesRHEL 6.5 开始支持 CPU 的热插拔CPU hot plugging and hot unplugging are supported with the help of the QEMU guest agent on L CPUs can be enabled or disabled while the guest is running, thus mimicking the hot plug or hot unplug feature.KVM 热插拔的操作可以参考 KVM 官方文档:CPU HotplugUsing PCI Hotplug Support3.3 动态迁移动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。四、KVM 管理工具libvirtlibvirt 是目前使用最为广泛的对 KVM 虚拟机进行管理的工具和应用程序接口(API),而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如 OpenStack、OpenNebula、Eucalyptus 等)都在底层使用 libvirt 的应用程序接口。libvirt 是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口、守护进程和管理工具,它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。尽管 libvirt 项目最初是为 Xen 设计的一套API,但是目前对KVM等其他 Hypervisor 的支持也非常的好。libvirt 支持多种虚拟化方案,既支持包括 KVM、QEMU、Xen、VMware、VirtualBox 等在内的平台虚拟化方案,又支持 OpenVZ、LXC 等 Linux 容器虚拟化系统,还支持用户态 Linux(UML)的虚拟化。libvirt 作为中间适配层,让底层 Hypervisor 对上层用户空间的管理工具是可以做到完全透明的,因为 libvirt 屏蔽了底层各种 Hypervisor 的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。通过 libvirt,一些用户空间管理工具可以管理各种不同的 Hypervisor 和上面运行的客户机。libvirt的管理功能主要包含如下五个部分:域的管理:包括对节点上的域的各个生命周期的管理,如:启动、停止、暂停、保存、恢复和动态迁移。也包括对多种设备类型的热插拔操作,包括:磁盘、网卡、内存和 CPU,当然不同的 Hypervisor 上对这些热插拔的支持程度有所不同。远程节点的管理:只要物理节点上运行了 libvirtd 这个守护进程,远程的管理程序就可以连接到该节点进程管理操作,经过认证和授权之后,所有的 libvirt 功能都可以被访问和使用。libvirt 支持多种网络远程传输类型,如 SSH、TCP 套接字、Unix domain socket、支持 TLS 的加密传输等。假设使用最简单的 SSH,则不需要额外配置工作,比如: 节点上运行了 libvirtd,而且允许 SSH 访问,在远程的某台管理机器上就可以用如下的命令行来连接到
上,从而管理其上的域。virsh -c qemu+ssh:///system存储的管理:任何运行了 libvirtd 守护进程的主机,都可以通过 libvirt 来管理不同类型的存储,如:创建不同格式的客户机镜像(qcow2、raw、qde、vmdk等)、挂载 NFS 共享存储系统、查看现有的 LVM 卷组、创建新的 LVM 卷组和逻辑卷、对磁盘设备分区、挂载 iSCSI 共享存储,等等。当然 libvirt 中,对存储的管理也是支持远程管理的。网络的管理:任何运行了 libvirtd 守护进程的主机,都可以通过libvirt来管理物理的和逻辑的网络接口。包括:列出现有的网络接口卡,配置网络接口,创建虚拟网络接口,网络接口的桥接,VLAN 管理,NAT 网络设置,为客户机分配虚拟网络接口,等等。提供一个稳定、可靠、高效的应用程序接口(API)以便可以完成前面的 4 个管理功能。libvirt 主要由三个部分组成,它们分别是:应用程序编程接口(API)库、一个守护进程(libvirtd)和一个默认命令行管理工具(virsh)。应用程序接口(API)是为了其他虚拟机管理工具(如 virsh、virt-manager等)提供虚拟机管理的程序库支持。libvirtd 守护进程负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理之时,这个守护进程一定要处于运行状态中,而且这个守护进程可以分为两种:一种是 root 权限的libvirtd,其权限较大,可以做所有支持的管理工作;一种是普通用户权限的 libvirtd,只能做比较受限的管理工作。virsh 是 libvirt 项目中默认的对虚拟机管理的一个命令行工具。3083人阅读
虚拟化(12)
IBM的资料还是挺不错的,留着备用
简介:&虚拟机的迁移使资源配置更加灵活,尤其是在线迁移技术,提高了虚拟服务器的可用性和可靠性。本文是虚拟机迁移技术漫谈系列的第二部分,详细介绍 KVM 虚拟机在物理主机之间的静态迁移和在线迁移特性,而且包括基于数据块的在线迁移实现。
虚拟机的迁移技术为服务器的虚拟化提供简便的方法。目前流行的虚拟化产品 VMware,Xen,Hyper-V,KVM 都提供各自的迁移工具。其中 Linux 平台上开源的虚拟化工具 KVM 发展迅速,基于 KVM 的虚拟机的迁移特性也日趋完善。本文全面介绍 KVM 虚拟机在不同的应用环境下的静态迁移(离线迁移)和动态迁移(在线迁移),并且在最新发布的 Suse Linux Enterprise Edition 11 SP1 上分别演示如何应用 libvirt/virt-manager
图形化工具和基于命令行的 qemu-kvm 工具进行迁移操作。
V2V 虚拟机的迁移是指在 VMM(Virtual Machine Monitor)上运行的虚拟机系统,能够被转移到其他物理主机上的 VMM 上运行。VMM 对硬件资源进行抽象和隔离,屏蔽了底层硬件细节。而迁移技术的出现,使得操作系统能在不同的主机之间动态的转移,进一步解除软,硬件资源之间的相关性。本系列的第一篇文章“虚拟机迁移技术漫谈”中,介绍了 V2V 迁移的三种方式,本文将更加详细的说明三种方式的不同和实现方法。
静态迁移:也叫做常规迁移、离线迁移(Offline Migration)。就是在虚拟机关机或暂停的情况下从一台物理机迁移到另一台物理机。因为虚拟机的文件系统建立在虚拟机镜像上面,所以在虚拟机关机的情况下,只需要简单的迁移虚拟机镜像和相应的配置文件到另外一台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷贝状态至目的主机,最后在目的主机重建虚拟机状态,恢复执行。这种方式的迁移过程需要显式的停止虚拟机的运行。从用户角度看,有明确的一段停机时间,虚拟机上的服务不可用。这种迁移方式简单易行,适用于对服务可用性要求不严格的场合。
共享存储的动态迁移
动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。
目前主流的动态迁移工具,VMware 的 VMotion,Citrix 的 XenMotion,他们都依赖于物理机之间采用 SAN(storage area network)或 NAS(network-attached storage)之类的集中式共享外存设备,因而在迁移时只需要进行虚拟机系统内存执行状态的迁移,从而获得较好的迁移性能。
如图 1 中所示的动态迁移,为了缩短迁移时间和服务中断时间,源主机和目的主机共享了 SAN 存储。这样,动态迁移只需要考虑虚拟机系统内存执行状态的迁移,从而获得较好的性能。
本地存储的动态迁移
动态迁移基于共享存储设备,为的是加速迁移的过程,尽量减少宕机时间。但是在某些情况下需要进行基于本地存储的虚拟机的动态迁移,这就需要存储块动态迁移技术,简称块迁移。
比如某些服务器没有使用 SAN 存储,而且迁移的频率很小,虚拟机上的服务对迁移时间的要求不严格,则可以使用存储块动态迁移技术;另一方面,SAN 存储的价格比较高,尽管 SAN 存储能够提高迁移性能和系统的稳定性,对于中小企业仅仅为了加快迁移速度而配置昂贵的 SAN 存储,性价比不高。
在集中式共享外部存储的环境下,基于共享存储的动态迁移技术无疑能够工作得很好。但是,考虑到目前一些计算机集群并没有采用共享式外存,而是各自独立拥有本地外存的物理主机构成。基于共享存储的迁移技术在这种场合下受到限制,虚拟机迁移到目的主机后,不能访问其原有的外存设备,或者需要源主机为其外存访问提供支持。
为了拓宽动态迁移技术的应用范围,有必要实现一个包括虚拟机外存迁移在内的全系统动态迁移方案。使得在采用分散式本地存储的计算机集群环境下,仍然能够利用迁移技术转移虚拟机环境,并且保证迁移过程中虚拟机系统服务的可用性。
相比较基于共享存储的动态迁移,数据块动态迁移的需要同时迁移虚拟机磁盘镜像和虚拟机系统内存状态,延长了迁移时间,在迁移性能上打了折扣。
准确来说,KVM 仅仅是 Linux 内核的一个模块。管理和创建完整的 KVM 虚拟机,需要更多的辅助工具。
QEMU-KVM:在 Linux 系统中,首先我们可以用 modprobe 系统工具去加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 QEMU。QEMU 是一个强大的虚拟化软件,它可以虚拟不同的 CPU
构架。比如说在 x86 的 CPU 上虚拟一个 Power 的 CPU,并利用它编译出可运行在 Power 上的程序。KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具 QEMU-KVM。所以 Linux 发行版中分为 kernel 部分的 KVM 内核模块和 QEMU-KVM 工具。这就是 KVM 和 QEMU 的关系。
Libvirt、virsh、virt-manager:尽管 QEMU-KVM 工具可以创建和管理 KVM 虚拟机,RedHat 为 KVM 开发了更多的辅助工具,比如 libvirt、libguestfs 等。原因是 QEMU 工具效率不高,不易于使用。Libvirt 是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持 Xen 等其他虚拟机。使用 libvirt,你只需要通过 libvirt 提供的函数连接到
KVM 或 Xen 宿主机,便可以用同样的命令控制不同的虚拟机了。Libvirt 不仅提供了 API,还自带一套基于文本的管理虚拟机的命令—— virsh,你可以通过使用 virsh 命令来使用 libvirt 的全部功能。但最终用户更渴望的是图形用户界面,这就是 virt-manager。他是一套用 python 编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。Virt-manager 就是利用 libvirt 的 API 实现的。
以上这些就是 Linux 系统上 KVM 虚拟化技术的大致架构了。本文正是演示了如何使用这些工具实现了 KVM 虚拟机的迁移操作。
本文中的 KVM 虚拟机软件基于 Novell 公司的 Suse Linux Enterprise Server 11 Service Pack 1 发行版。SLES11 SP1 发布于 2010 年 5 月 19 日,基于 Linux 内核 2.6.32.12,包含了 kvm-0.12.3,libvirt-0.7.6,virt-manager-0.8.4,全面支持 KVM 虚拟机。本文中的物理服务器和外部共享存储配置如下表:
IP Address
Source Host
Xeon(R) E5506 x 4 core
SLES11 SP1
192.168.0.73
Destination Host
Xeon(R) E5506 x 8 core
SLES11 SP1
192.168.0.74
NFS Server
Pentium(R) D x 2 core
SLES11 SP1
192.168.0.17
迁移虚拟机之前,我们需要创建虚拟机。创建虚拟机可以使用 QEMU-KVM 命令或者通过 virt-manager 图形化管理工具。
QEMU-KVM 创建虚拟机镜像文件:见本文的参考资源“KVM 虚拟机在 IBM System x 上应用”。
virt-manager 创建虚拟机:参考 virt-manager 帮助手册。
静态迁移由于允许中断虚拟机的运行,所以相对简单。首先在源主机上关闭虚拟机,然后移动虚拟机的存储镜像和配置文件到目的主机,最后在目的主机上启动虚拟机,恢复服务。根据虚拟机镜像存储方式的不同,静态迁移的实现方法稍有不同。
如果源主机和目的主机都能够访问虚拟机的镜像,则只需要迁移虚拟机配置文件。比如在本例中的 SLES11 SP1 系统,virt-manager 管理的虚拟机配置文件在 /etc/libvirt/qemu/”your vm name.xml”。拷贝 XML 配置文件到目的主机的相同目录后,进行适当的修改,比如:与源主机相关的文件或路径等。无论你何时在 /etc/libvirt/qemu/ 中修改了虚拟机的 XML 文件,必须重新运行 define 命令,以激活新的虚拟机配置文件。
# virsh define /etc/libvirt/qemu/”your vm name.xml”
本地存储是指虚拟机的文件系统建立在本地硬盘上,可以是文件或者磁盘分区。
本地文件存储:如果虚拟机是基于镜像文件,直接从源主机拷贝镜像文件和 XML 配置文件到目的主机中,然后对 XML 进行适当的修改并激活。
本地磁盘分区:如果虚拟机使用了磁盘分区(物理分区或者逻辑分区)为存储设备,首先用 dump 工具把磁盘分区转换成镜像文件再拷贝到目的主机。在目的主机恢复虚拟机时,把镜像文件恢复到目的主机的磁盘分区中去。对于虚拟机系统使用了多个磁盘分区的,需要每个分区单独 dump 成镜像文件。例如使用“/dev/VolGroup00/lv001” LVM 逻辑卷作为存储设备,可以使用下面的命令输出成镜像文件:
dd if=/dev/VolGroup00/lv001 of=lv001.img bs=1M
静态迁移虚拟的过程中,虚拟机系统处于关机状态,这样虚拟机关机前的运行状态不会保留。如果希望保留迁移前的系统状态,并且在迁移后能够恢复,需要对虚拟机做快照备份或者以休眠的方式关闭系统,详细内容和实现方法将在本系列文章的第五部分介绍。
本文前面“V2V 迁移方式的分类”小节中介绍过,跟据虚拟机连接存储方式的不同,动态迁移分为基于共享存储的动态迁移和基于本地存储的存储块迁移。本小节实现了目前使用最广泛的基于共享存储的动态迁移。实现这种实时迁移的条件之一就是把虚拟机存储文件存放在公共的存储空间。因此需要设定一个共享存储空间,让源主机和目的主机都能够连接到共享存储空间上的虚拟媒体文件,包括虚拟磁盘、虚拟光盘和虚拟软盘。否则,即使迁移完成以后,也会因为无法连接虚拟设备,导致无法启动迁移后的虚拟机。
动态迁移实际上是把虚拟机的配置封装在一个文件中,然后通过高速网络,把虚拟机配置和内存运行状态从一台物理机迅速传送到另外一台物理机上,期间虚拟机一直保持运行状态。现有技术条件下,大多虚拟机软件如 VMware、Hyper-V、Xen 进行动态迁移都需要共享存储的支持。典型的共享存储包括 NFS 和 SMB/CIFS 协议的网络文件系统,或者通过 iSCSI 连接到 SAN 网络。选用哪一种网络文件系统,需要根据具体情况而定。本文的实验采用了 NFS 文件系统作为源主机和目的主机之间的共享存储。
确保网络连接正确,源主机、目的主机和 NFS 服务器之间可以互相访问。
确保源主机和目的主机上的 VMM 运行正常。
设置 NFS 服务器的共享目录。本文的 NFS 服务器也安装了 SLES11 SP1 操作系统。
修改 /etc/exports 文件,添加
/home/image *(rw,sync,no_root_squash)
rw:可读写的权限;
ro:只读的权限;
no_root_squash:登入到 NFS 主机的用户如果是 ROOT 用户,他就拥有 ROOT 权限,此参数很不安全,建议不要使用。
sync:资料同步写入存储器中。
async:资料会先暂时存放在内存中,不会直接写入硬盘。
重新启动 nfsserver 服务
# service nfsserver restart
virt-manager 是基于 libvirt 的图像化虚拟机管理软件,请注意不同的发行版上 virt-manager 的版本可能不同,图形界面和操作方法也可能不同。本文使用了 SLES11 SP1 发行版上的 virt-manager-0.8.4。
首先在源主机和目的主机上添加共享存储。这里以源主机为例,目的主机做相同的配置。
添加 NFS 存储池到源主机和目的主机的 vit-manager 中。点击 Edit menu-&Host Details-&Storage tab。&
添加一个新的存储池。点击左下角的“+”号,弹出一个新的窗口。输入以下参数:
Name:存储池的名字。
Type:选择 netfs:Network Exported Directory。因为本文使用了 NFS 作为共享存储协议。&
点击“Forward”后,输入以下参数:
Target Path:共享存储在本地的映射目录。本文中这个目录在源主机和目的主机上必须一致。
Format:选择存储类型。这里必须是 nfs。
Host Name:输入共享存储服务器,也就是 NFS 服务器的 IP 地址或 hostname。
Source Path:NFS 服务器上输出的共享目录。&
点击”Finish”后,共享存储添加成功。此时在物理机上查看 Linux 系统的文件系统列表,可以看到共享存储映射的目录。
源主机上创建基于共享存储的 KVM 虚拟机。
选择共享存储池,点击”New Volume”创建新的存储卷。
输入存储卷参数。本例为虚拟机创建了大小为 10G,格式为 qcow2 的存储卷。&
在这个共享存储卷上创建虚拟机。本文创建了一个基于 Window 2008 R2 系统的虚拟机。创建虚拟机的具体步骤见本文前面“创建 KVM 虚拟机“小节。
连接远程物理主机上的 VMM。这里以源主机为例,目的主机做相同的配置。
在源主机上打开 virt-manager 应用程序,连接 localhost 本机虚拟机列表。点击 File-&Add Connection,弹出添加连接窗口,输入以下各项:
Hypervisor:选择 QEMU。
Connection:选择连接方式 。本文选择 SSH 连接。
Hostname:输入将要连接的主机名或 IP 地址,这里填写目的主机名 victory4。&
点击 Connect,输入 SSH 连接的密码后,将显示源主机和目的主机上的虚拟机列表。&
从源主机动态迁移 KVM 虚拟机到目的主机。
在源主机上启动虚拟机 Windwos 2008 R2。
在虚拟机中,开启实时网络服务(用来验证迁移过程中服务的可用性)。
开启远程连接服务 remote access,在其他主机上远程连接此虚拟机。
开启网络实时服务。例如打开浏览器并且播放一个实时网络视频。
准备动态迁移,确保所有的虚拟存储设备此时是共享的,包括 ISO 和 CDROM。
在源主机的 virt-manager 窗口中,右键点击等待迁移的虚拟机,选择“Migrate ”。
New host:选择目的主机的 hostname。
Address:填入目的主机的 IP 地址。
Port and Bandwith:指定连接目的主机的端口和传输带宽,本文中没有设定,使用默认设置。
点击“Migrate”和“Yes”开始动态迁移虚拟机。&
动态迁移的时间与网络带宽、物理主机的性能和虚拟机的配置相关。本实验中的网络连接基于 100Mbps 的以太网,整个迁移过程大约耗时 150 秒。使用 RDC(Remote Desktop Connection)远程连接虚拟机在迁移过程中没有中断;虚拟机中播放的实时网络视频基本流畅,停顿的时间很短,只有 1 秒左右。如果采用 1000Mbps 的以太网或者光纤网络,迁移时间将会大大减少,而虚拟机服务停顿的时间几乎可以忽略不计。
迁移完成后,目的主机的 VMM 中自动创建了一个同名的 Windows 2008 R2 虚拟机,并且继续提供远程连接服务和播放在线视频。源主机上的虚拟机变为暂停状态,不再提供服务。至此,动态迁移胜利完成。
从 qemu-kvm-0.12.2 版本,引入了 Block Migration (块迁移)的特性。上一小节“基于共享存储的动态迁移”中,为了实现动态迁移,源主机和目的主机需要连接共享存储服务。有了块迁移技术以后,可以在动态迁移过程中,把虚拟磁盘文件从源主机迁移至目的主机。QEMU-KVM 有了这个特性以后,共享存储不再是动态迁移的必要条件,从而降低了动态迁移的难度,扩大了动态迁移的应用范围。SLES11 SP1 集成了 kvm-0.12.3,支持块迁移特性。但是
SLES11 SP1 上的 libvirt-0.7.6、virt-manager-0.8.4 暂时没有引入块迁移的功能。所以本文下面的块迁移实验仅基于 QEMU-KVM 的命令行模式。
块迁移过程中,虚拟机只使用本地存储,因此物理环境非常简单。只需要源主机和目的主机通过以太网连接,如”图 2. 本地存储的动态迁移示意图”所示。
QEMU 的控制终端和迁移命令
QEMU 控制终端的开启,可以在 QEMQ-KVM 的命令中加参数“-monitor”。
-monitor stdio: 输出到文本控制台。
-monitor vc: 输出到图形控制台。
图形控制台和虚拟机 VNC 窗口的切换命令是:
Ctrl+Alt+1: VNC window
Ctrl+Alt+2: monitor console
Ctrl+Alt+3: serial0 console
Ctrl+Alt+4: parallel0 console
QEMU-KVM 提供了的“-incoming”参数在指定的端口监听迁移数据。目的主机上需要此参数接收来自源主机的迁移数据。
(qemu) help migrate
migrate [-d] [-b] [-i] uri -- migrate to URI (using -d to not wait for completion)
-b for migration without shared storage with full copy of disk
-i for migration without shared storage with incremental copy of disk
(base image shared between src and destination)
在源主机上创建和启动虚拟机。
在本地磁盘上创建虚拟机镜像文件。本文创建了大小为 10G,qcow2 格式的本地镜像文件。&
victory3:~ # qemu-img create -f qcow2 /var/lib/kvm/images/sles11.1ga/disk0.qcow2 10G
在镜像文件上安装虚拟机。本文在虚拟机中安装了 SLES11SP1 系统。&
victory3:~ #
/usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-blk-pci,bus=pci.0,
addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 -drive
file=/media/83/software/Distro/SLES-11-SP1-DVD-x86_64-GM-DVD1.iso,
if=none,media=cdrom,id=drive-ide0-1-0 -device ide-drive,bus=ide.1,
unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:3
虚拟机安装完毕后,以下列命令启动虚拟机。添加了“-monitor stdio”是为了开启文本控制台;去掉了虚拟光驱中的 ISO 文件是为了保证迁移时,源主机和目的主机上虚拟设备的一致性。如果你在目的主机的相同路径下存在相同名字的 ISO 文件,则可以在迁移时保留 ISO 文件参数。&
victory3:~ #
/usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/var/lib/kvm/images/sles11.1ga/disk0.qcow2,
if=none,id=drive-virtio-disk0,boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,
drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,
id=drive-ide0-1-0 -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,
id=ide0-1-0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:13:08:96
-net tap -vnc 127.0.0.1:3
在目的主机上创建和启动虚拟机。
在目的主机上为迁移后的系统创建镜像文件,文件的大小必须大于或等于源主机的镜像文件大小。&
victory4:~ #
qemu-img create -f qcow2 dest.img 20G
Formatting 'dest.img', fmt=qcow2 size= encryption=off cluster_size=0
使用与源主机上相同的 qemu-kvm 参数,更改镜像文件为目的主机上创建的镜像文件,加上 -incoming 参数指定动态迁移所使用的协议、IP 地址和端口号。因为 -incoming 参数的作用是监听端口,所以目的主机上的虚拟机一启动就处于 paused 状态,等待源主机上虚拟机开始迁移。本例中块迁移使用 TCP 协议,目的主机上的监听端口是 8888 端口。&
victory4:~ # /usr/bin/qemu-kvm -enable-kvm -m 512 -smp 4 -name sles11.1ga
-monitor stdio -boot c -drive file=/root/dest.img,if=none,id=drive-virtio-disk0,
boot=on -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,
id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0 -device ide-drive,
bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -device virtio-net-pci,vlan=0,
id=net0,mac=52:54:00:13:08:96 -net tap -vnc 127.0.0.1:8 -incoming tcp:0:8888
QEMU 0.12.3 monitor - type 'help' for more information
(qemu) info status
VM status: paused
迁移源主机上的虚拟机到目的主机。
回到源主机上,在等待迁移的虚拟机中开启一些实时服务以验证动态迁移不会中断服务的运行。本例中在虚拟机的终端窗口中用“top -d 1“命令开启 TOP 服务,每秒刷新一次系统进程的信息。&
在源主机的 QEMU 控制台中输入以下迁移命令,迁移开始。&
(qemu) migrate -d -b tcp:victory4:8888
-d 可以在迁移的过程中查询迁移状态,否则只能在迁移结束后查询。
-b 迁移虚拟机存储文件
tcp:ivctory4:8888 数据迁移的协议、目的主机和端口。协议和端口必须和目的主机上虚拟机的 -incoming 参数一致。
动态迁移期间,源主机的虚拟机继续运行,TOP 服务没有中断。同时可以在源主机的 QEMU 控制台查询迁移的状态。目的主机的虚拟机处于 paused 状态,从目的主机的 QEMU 控制台可以看到迁移进度的百分比。&
源主机 QEMU 控制台显示正在迁移的数据
(qemu) info migrate
Migration status: active
transferred ram: 52 kbytes
remaining ram: 541004 kbytes
total ram: 541056 kbytes
transferred disk: 2600960 kbytes
remaining disk: 5787648 kbytes
total disk: 8388608 kbytes
目的主机 QEMU 控制台显示迁移完成的百分比
(qemu) Receiving block device images
Completed 28 %
直到动态迁移完成,源主机的虚拟机变成 paused 状态而目的主机上的虚拟机由 paused 状态变成运行状态,TOP 服务继续运行且没有中断。
关闭源主机的虚拟机,所有服务已经迁移到了目的主机,至此迁移完成。
本文实现了在 Suse Linux Enterprise Server 11 SP1 发行版上 KVM 虚拟机的静态迁移和动态迁移,特别是基于数据块的动态迁移,使虚拟机的资源配置更加灵活。在其他支持 KVM 的 Linux 发行版上如 Ubuntu、Fedora 也可以完成类似的迁移操作。KVM 虚拟机在不断的增强和完善中,开源社区和 Linux 的系统集成商也在开发各种各样的基于 KVM 的管理工具,将来的 KVM 迁移工具会在性能,功能,可操作性和自动化程度上大大增强。
参考 developerWorks 上的文章““,了解关于
Libvirt 的用途和构架。
参考 developerWorks 上的文章“”,了解如何在
Linux 上使用 QEMU-KVM 安装配置 KVM 虚拟机。
参考 developerWorks 上的文章“”,学习
KVM 架构及其优点。
在&寻找为 Linux 开发人员(包括&)准备的更多参考资料,查阅我们&。
在 developerWorks 上查阅所有&和&。
随时关注 developerWorks&和&。
郭晋兵,软件工程师,目前在 IBM 中国软件开发中心从事 KVM 相关软件的开发测试工作。
丛彬彬,软件工程师,目前在 IBM 中国软件开发中心从事 KVM 相关软件的开发测试工作。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:258117次
积分:2387
积分:2387
排名:第13891名
原创:23篇
转载:10篇
评论:83条
本博客主要用于探讨虚拟化相关技术,邮箱
欢迎各位感兴趣的童鞋一起探讨,共同成长
(1)(1)(1)(1)(1)(2)(1)(1)(3)(17)(4)}

我要回帖

更多关于 kvm 热迁移 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信