- 28.1 了解虚拟化
- 28.2 常见虚拟化软件
- 28.3 虚拟化架构
- 28.4 KVM简介
- 28.5 Centos7上安装KVM
- 28.6 配置网卡
- 28.7 创建虚拟机安装CentOS7
- 28.8 虚拟机管理
- 28.9 克隆虚拟机
- 28.10 快照管理
- 28.11 磁盘格式
- 28.12 磁盘扩容(raw)
- 28.13 磁盘扩容(qcow2)
- 28.14 调整cpu内存和网卡
- 28.15 迁移虚拟机
1. 了解虚拟化
- 虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,每个逻辑系统都是独立的存在,这样就可以充分利用物理硬件的资源,而且还可以自由分配资源。
- 虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。
- 虚拟化技术起源于20世纪60年代末,美国IBM公司当时开发了一套被称作虚拟机监视器(Virtual Machine Monitor)的软件,该软件作为计算机硬件层上面的一层软件抽象层,将计算机硬件虚拟分区成一个或多个虚拟机,并提供多用户对大型计算机的同时、交互访问。
虚拟化技术主要分为以下几个大类 :
- 平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。
- 资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
- 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。
我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor 或 Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。
示意图:
在之前虚拟化技术分为全虚拟化和半虚拟化,因为早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(Guest OS)要想使用CPU资源,需要通过VMM来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化(例如VMware Workstation)。半虚拟化技术通过修改Guest OS内核,让Guest OS可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(例如XEN),因为有些操作系统的内核是不开源的。后续CPU厂商直接支持虚拟化,不需要通过VMM翻译指令了,就无所谓半虚拟化和全虚拟化了。
虚拟化技术的优点:
- 资源池——一个物理机的资源分配到了不同的虚拟机里
- 很容易扩展——增加物理机或者虚拟机即可,因为虚拟机是可以复制的
- 很容易云化——亚马孙AWS,阿里云,谷歌云等
虚拟化技术的局限性:
- 每一个虚拟机都是一个完整的操作系统,所以需要给其分配物理资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多
- 虚拟化技术没法解决运维环境和开发环境的矛盾,所以后来才出现了容器技术
关于虚拟化技术的更多内容,可参考以下文章:
2. 常见虚拟化软件
VMware系列,商业
- VMware Workstation,适合单机使用
- VMware Vsphere(VMware esxi),适合规模更大的场景
- VMware Fusion(Mac)
Xen 开源,支持半虚拟化
XenServer 商业,Ctirx收购Xen之后研发的,基于Xen的
KVM 开源 ,基于Linux内核模块,目前KVM已经被红帽收购了,大多数系统都倾向于使用KVM
Hyper-V 商业,微软的产品,适合在windows服务器上用
Openvz 开源 ,轻量,基于Linux,虚拟机和宿主机共用一个内核,优点是一台物理机可以虚拟化很多台虚拟机,缺点是不稳定,物理机的内核奔溃,所有的虚拟机都会崩溃,早期vps供应商用得比较多
VirtualBox 开源 ,Sun公司开发 ,Oracle收购Sun之后,现在属于Oracle
3. 虚拟化架构
虚拟化技术有很多,不同的体系都有几十种,但是虚拟化架构主要有两种形式:宿主架构和裸金属架构:
I型:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为“裸机”,也称为裸金属架构。
II型:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为“托管”hypervisor。也称为宿主架构。
Xen属于I型,KVM属于II型。
虚拟化架构是一个大话题,关于这方面的详细内容可参考以下文章:
4. KVM简介
- 这里只介绍KVM而不介绍其他虚拟化软件的原因有两点,一是我们大多数的服务器系统都是Linux内核的操作系统,而KVM是基于Linux内核的。二是KVM是开源、免费的,其他的例如VMware Vsphere、XenServer等都是商业收费的,而Hyper-V 又是Windows的,Openvz 又有局限性(与宿主共用内核,就无法安装其他内核的虚拟机),稳定性也有待考究,VirtualBox又不适合大规模的虚拟化场景,所以最后就只剩下KVM了。
- KVM是Kernel-based Virtual Machine的缩写,意为基于内核的虚拟机。KVM是一个完全开源的系统虚拟化模块,它所基于的是Linux内核,它把Linux内核变成了一个Hypervisor,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
- 最开始KVM是由以色列初创公司Qumranet开发,后来2008年9月RedHat公司收购了Qumranet,RedHat基于KVM的虚拟化解决方案叫做RHEV,不过RHEV是收费的。
- KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
- KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能。但是只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样。所以这就需要提到QEMU了,QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所有的硬件,性能不强。而KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM,KVM里的磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的,所以KVM结合QEMU-KVM工具之后才算完整,KVM和QEMU-KVM通信是通过/dev/kvm实现的。其中libvirt是用来管理KVM虚拟机的API,其命令为virsh。
KVM架构图:
5. Centos7上安装KVM
首先我们需要一台配置较高的CentOS7虚拟机,当然用物理机也可以,我这里用的是虚拟机,配置如下:
硬盘需要新增一个,其中的新硬盘用于在KVM里安装操作系统时需要用到,内存的大小最好有4个G,最低2个G,因为我这里物理机的内存有16G所以就给分了8G。具体的需要根据你物理机的配置进行分配,CPU的核心最少要给2个。
然后最好做一个快照,中途出现什么问题方便重置:
进入到系统后,关闭iptables或者firewalld,关闭selinux。并且检查cpu参数是否支持虚拟化:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl stop iptables
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl disable iptables
[root@localhost ~]# getenforce
Disabled
[root@localhost ~]# grep -Ei 'vmx|svm' /proc/cpuinfo
如果有过滤出vmx或svm关键字就代表支持虚拟化,vmx是Intel的CPU,svm是AMD的CPU。
然后格式化新磁盘,挂载到/kvm_data,当然这个路径可以自定义,我这里使用的是/kvm_data。
[root@localhost ~]# fdisk -l |grep Disk
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk label type: dos
Disk identifier: 0x000f0eb3
Disk /dev/mapper/centos-root: 19.8 GB, 19826475008 bytes, 38723584 sectors
Disk /dev/mapper/centos-swap: 1073 MB, 1073741824 bytes, 2097152 sectors
[root@localhost ~]# mkfs.ext4 /dev/sdb # 会有询问,输入y即可
[root@localhost ~]# blkid /dev/sdb # 检查是否已格式化
/dev/sdb: UUID="5a7cf162-f8f3-4d02-ad72-17bde010efc8" TYPE="ext4"
[root@localhost ~]# mkdir /kvm_data # 创建挂载目录
[root@localhost ~]# mount /dev/sdb /kvm_data # 将新磁盘挂载到/kvm_data目录下
[root@localhost ~]# vim /etc/fstab # 配置开机时挂载
/dev/sdb /kvm_data ext4 defaults 0 0
最后就是安装kvm:
[root@localhost ~]# yum install -y virt-* libvirt bridge-utils qemu-img
6. 配置网卡
安装完KVM之后,需要配置一下网卡,增加一个桥接网卡:
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost /etc/sysconfig/network-scripts]# cp ifcfg-eno16777728 ifcfg-br0 # 拷贝当前的网卡文件
[root@localhost /etc/sysconfig/network-scripts]# vim ifcfg-eno16777728 # 修改文件内容如下,eno16...为当前网卡
TYPE=Ethernet #以太网
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777728
DEVICE=eno16777728
ONBOOT=yes
BRIDGE=br0
[root@localhost /etc/sysconfig/network-scripts]# vim ifcfg-br0 # 修改文件内容如下
TYPE=Bridge
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br0
DEVICE=br0
ONBOOT=yes
[root@localhost /etc/sysconfig/network-scripts]# systemctl restart network # 重启服务
重启完服务后,执行ifconfig命令可以看到此时eno16777728网卡的IP到br0网卡上了,这样我们的网卡就配置完成了:
接下来我们就可以启动KVM的服务了:
[root@localhost ~]# lsmod |grep kvm # 检查KVM模块是否加载,list modules的缩写,即 列出所有模块.
kvm_intel 162153 0
kvm 525259 1 kvm_intel
[root@localhost ~]# systemctl start libvirtd # 启动libvirtd服务
[root@localhost ~]# ps aux |grep libvirtd # 检查服务进程
root 5744 2.2 0.1 614840 14120 ? Ssl 23:02 0:00 /usr/sbin/libvirtd
root 5872 0.0 0.0 112664 964 pts/1 R+ 23:02 0:00 grep --color=auto libvirtd
[root@localhost ~]# brctl show # 可以看到两个网卡
bridge name bridge id STP enabled interfaces
br0 8000.000c29f1912c no eno16777728 # 我们配置的桥接网卡
virbr0 8000.525400240b50 yes virbr0-nic # NAT模式的网卡
7. 创建虚拟机安装CentOS7
将服务成功启动后,我们就可以使用KVM安装虚拟机了,首先需要准备一个操作系统的镜像文件,我这里用的是CentOS7的镜像文件:
[root@localhost ~]# cd /tmp/
[root@localhost /tmp]# ls |grep CentOS
CentOS-7-x86_64-DVD-1511.iso
使用命令行安装这个CentOS7镜像文件:
[root@localhost ~]# virt-install --name=study01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-DVD-1511.iso --disk path=/kvm_data/study01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
命令说明:
- --name 指定虚拟机的名称
- --memory 指定分配给虚拟机的内存资源大小
- maxmemory 指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源
- --vcpus 指定分配给虚拟机的CPU核心数量
- maxvcpus 指定可调节的最大CPU核心数量
- --os-type 指定虚拟机安装的操作系统类型
- --os-variant 指定系统的发行版本
- --location 指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL
- --disk path 指定虚拟硬盘所存放的路径及名称,size 则是指定该硬盘的可用大小,单位是G
- --bridge 指定使用哪一个桥接网卡,也就是说使用桥接的网络模式
- --graphics 指定是否开启图形
- --console 定义终端的属性,target_type 则是定义终端的类型
- --extra-args 定义终端额外的参数
开始安装后,正常的情况下会进入到这样一个界面:
这是让你配置语言、时区、安装源、网络、密码等信息,就和我们在VMware里安装CentOS虚拟机是一样的,只不过这个是命令行形式,而VMware里是图形界面罢了。
首先设置语言,按数字1,回车进入以下界面:
例如我要选Chinese就按数字68并回车即可,回车之后会让你选择是中文简体还是繁体,也是按下相应的数字并回车即可:
配置完成之后又会再次回到配置界面,这次我们来设置时区:
设置系统安装盘:
LVM是 Logical Volume Manager(逻辑卷管理)的简写,方便调整大小
设置root用户的密码:
最后开始安装系统:
安装完成之后就会停止在以下这个界面,按一下回车即可,这时就会重启安装完的系统:
8. 虚拟机管理
重启成功之后就会入到登录界面,可以看到我这里是成功登录的:
这时我们是处于一个虚拟终端的,因为安装了虚拟机,如果要退出来的话,应该说是切出来,按 Ctrl + ]
即可。
切出虚拟机后,可以看到/kvm_data/目录下多了一个虚拟机的磁盘目录:
[root@localhost ~]# ls /kvm_data/
lost+found study01.img
查看KVM进程:
[root@localhost ~]# ps axu |grep kvm
root 880 0.0 0.0 0 0 ? S< Mar07 0:00 [kvm-irqfd-clean]
qemu 6528 6.9 9.1 1568008 734216 ? Sl 00:15 0:40 /usr/libexec/qemu-kvm -name study01 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Haswell,-hle,-rtm -m 1024 -realtime mlock=off -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -uuid eeedcd47-1546-4e5f-ab2a-f62deb0838cf -display none -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-study01/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/kvm_data/study01.img,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=27 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:65:d3:3f,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-2-study01/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
root 6534 0.0 0.0 0 0 ? S 00:15 0:00 [kvm-pit/6528]
root 6687 0.0 0.0 112668 960 pts/1 S+ 00:25 0:00 grep --color=auto kvm
使用以下命令可以列出当前有多少个虚拟机,以及其状态:
[root@localhost ~]# virsh list
Id Name State
----------------------------------------------------
2 study01 running
以上这个命令无法列出关机状态的虚拟机,需要列出关机状态的虚拟机需要加多一个--all参数:
[root@localhost ~]# virsh list --all
Id Name State
----------------------------------------------------
2 study01 running
查看虚拟机配置文件:
[root@localhost ~]# ls /etc/libvirt/qemu/
networks study01.xml
[root@localhost ~]# ls /etc/libvirt/qemu/networks/
autostart default.xml
[root@localhost ~]# ls /etc/libvirt/qemu/networks/autostart/
default.xml
以下介绍一下管理虚拟机的一些常用命令:
[root@localhost ~]# virsh console study01 # 进入指定的虚拟机,进入的时候还需要按一下回车
[root@localhost ~]# virsh start study01 # 启动虚拟机
[root@localhost ~]# virsh shutdown study01 # 关闭虚拟机
[root@localhost ~]# virsh destroy study01 # 强制停止虚拟机
[root@localhost ~]# virsh undefine study01 # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘
[root@localhost ~]# virsh autostart study01 # 设置宿主机开机时该虚拟机也开机
[root@localhost ~]# virsh autostart --disable study01 # 解除开机启动
[root@localhost ~]# virsh suspend study01 # 挂起虚拟机
[root@localhost ~]# virsh resume study01 # 恢复挂起的虚拟机
进入到刚刚安装的虚拟机里配置一下IP:
[root@localhost ~]# virsh console study01
Connected to domain study01
Escape character is ^]
[root@localhost ~]# ip addr # 此时还没有能联网的IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:65:d3:3f brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# dhclient eth0 # 获取IP地址
[root@localhost ~]# ip addr # 此时可以看到已经有IP地址了
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:65:d3:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.77.140/24 brd 192.168.77.255 scope global dynamic eth0
valid_lft 1793sec preferred_lft 1793sec
inet6 fe80::5054:ff:fe65:d33f/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# yum install -y net-tools # 获取到IP能联网后安装网络管理工具
[root@localhost ~]# ifconfig # 安装完之后就可以使用ifconfig命令了
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.77.140 netmask 255.255.255.0 broadcast 192.168.77.255
inet6 fe80::5054:ff:fe65:d33f prefixlen 64 scopeid 0x20<link>
ether 52:54:00:65:d3:3f txqueuelen 1000 (Ethernet)
RX packets 4404 bytes 13614102 (12.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2480 bytes 139445 (136.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
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 ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-eth0 # 修改ONBOOT的值为yes ONBOOT 是否激活网卡
ONBOOT=yes
[root@localhost network-scripts]# systemctl restart network # 重启网卡服务
以上我们就完成了虚拟机的安装以及配置虚拟机的IP,这时就可以像往常一样使用这台虚拟机了。
9. 克隆虚拟机
克隆虚拟机是虚拟机软件必须得有的功能,这样能省去我们安装系统及环境的时间,如果使用过VMware、VirtualBox等虚拟机软件的话,都知道有这个功能,KVM也不例外,只不过我们没有用图形化界面,是命令行形式的而已。
要克隆某个虚拟机,首先这个虚拟机需要为关闭状态:
[root@localhost ~]# virsh list
Id Name State
----------------------------------------------------
1 study01 running
You have new mail in /var/spool/mail/root
[root@localhost ~]# virsh shutdown study01
Domain study01 is being shutdown
[root@localhost ~]# virsh list --all
Id Name State
----------------------------------------------------
- study01 shut off
然后执行以下命令进行克隆:
[root@localhost ~]# virt-clone --original study01 --name study02 --file /kvm_data/study02.img
Allocating 'study02.img' | 10 GB 00:00:42
Clone 'study02' created successfully. # 克隆成功
[root@localhost ~]# ls /kvm_data/
lost+found study01.img study02.img
[root@localhost ~]# ls /etc/libvirt/qemu/
networks study01.xml study02.xml
[root@localhost ~]# virsh list --all
Id Name State
----------------------------------------------------
- study01 shut off
- study02 shut off
[root@localhost ~]# virsh start study02
Domain study02 started
命令说明:
- --original指定克隆源虚拟机,也就是克隆哪一个虚拟机
- --name指定克隆后的虚拟机的名称
- --file指定克隆后的虚拟机的虚拟磁盘文件所存放的目录及名称
10. 快照管理
同样的创建快照也是虚拟机软件的一个很重要的功能,快照能够很方便的帮我们把虚拟机恢复到一个正常的状态下。我们来看看命令行下如何使用KVM创建虚拟机的快照:
[root@localhost ~]# virsh snapshot-create study01 # 创建study01的快照
Domain snapshot 1520519047 created
注:raw格式的虚拟磁盘不支持做快照,qcow2则支持
查看study01.img的信息,同时会查看到快照列表:
[root@localhost ~]# qemu-img info /kvm_data/study01.img
image: /kvm_data/study01.img
file format: qcow2 # qcow2是一种虚拟磁盘的格式
virtual size: 10G (10737418240 bytes) # 虚拟磁盘的总大小
disk size: 1.1G # 虚拟磁盘目前所占用的物理磁盘大小
cluster_size: 65536
Snapshot list: # 快照列表
ID TAG VM SIZE DATE VM CLOCK
1 1520519047 0 2018-03-08 22:24:07 00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: true
使用以下命令可以列出某个虚拟机下的所有快照:
[root@localhost ~]# virsh snapshot-list study01
Name Creation Time State
------------------------------------------------------------
1520519047 2018-03-08 22:24:07 +0800 shutoff
查看某个虚拟机当前快照版本的详细信息,也就是最近的一个快照版本的信息:
[root@localhost ~]# virsh snapshot-current study01
<domainsnapshot>
<name>1520519047</name>
<state>shutoff</state>
<creationTime>1520519047</creationTime>
<memory snapshot='no'/>
<disks>
<disk name='vda' snapshot='internal'/>
<disk name='hda' snapshot='no'/>
</disks>
<domain type='kvm'>
<name>study01</name>
<uuid>eeedcd47-1546-4e5f-ab2a-f62deb0838cf</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static' current='1'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>Haswell-noTSX</model>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/kvm_data/study01.img'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<interface type='bridge'>
<mac address='52:54:00:65:d3:3f'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
</domainsnapshot>
查看所有快照的配置文件:
[root@localhost ~]# virsh snapshot-create study01
Domain snapshot 1520520513 created
[root@localhost ~]# ls /var/lib/libvirt/qemu/snapshot/study01/ # 快照的配置文件都存放在这个目录下
1520519047.xml 1520520513.xml
通过快照的TAG,将虚拟机恢复到指定快照:
[root@localhost ~]# virsh snapshot-revert study01 1520519047
删除某个虚拟机下的某个快照:
[root@localhost ~]# virsh snapshot-delete study01 1520519047
Domain snapshot 1520519047 deleted
11. 磁盘格式
虚拟磁盘常用格式有raw和qcow2,以上我们也提到了raw格式的虚拟磁盘不支持创建快照,qcow2格式的虚拟磁盘才支持创建快照。
查看虚拟磁盘格式的命令:
[root@localhost ~]# qemu-img info /kvm_data/study01.img
image: /kvm_data/study01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.1G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
2 1520520513 0 2018-03-08 22:48:33 00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: true
创建一个2G大小的raw格式的虚拟磁盘,-f选项用于指定虚拟磁盘的格式:
[root@localhost ~]# qemu-img create -f raw /kvm_data/study01_2.img 2G
Formatting '/kvm_data/study01_2.img', fmt=raw size=2147483648
[root@localhost ~]# qemu-img info /kvm_data/study01_2.img
image: /kvm_data/study01_2.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
我们可以把raw格式的磁盘转换为qcow2格式,-O选项指定转换的目标格式:
[root@localhost ~]# qemu-img convert -O qcow2 /kvm_data/study01_2.img /kvm_data/study01_2.qcow2
[root@localhost ~]# ls /kvm_data/study01_2*
/kvm_data/study01_2.img /kvm_data/study01_2.qcow2
[root@localhost ~]# qemu-img info /kvm_data/study01_2.qcow2
image: /kvm_data/study01_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
如上,与其说是转换,不如说是从raw格式的磁盘复制了一份格式为qcow2磁盘出来,因为原本的磁盘并不会发生任何的变化,而是从这个raw格式磁盘的基础上复制出来了一个新的qcow2格式的磁盘。
转换后用ls -lh查看磁盘文件的大小,可以看到qcow2格式的磁盘文件比较小,raw格式的磁盘文件大小和我们指定空间大小一样是2G:
[root@localhost ~]# cd /kvm_data/
[root@localhost /kvm_data]# ls -lh
total 2.3G
drwx------ 2 root root 16K Mar 7 20:56 lost+found
-rw-r--r-- 1 root root 2.0G Mar 8 23:02 study01_2.img
-rw-r--r-- 1 root root 193K Mar 8 23:05 study01_2.qcow2
-rw------- 1 root root 11G Mar 8 22:51 study01.img
-rw------- 1 qemu qemu 1.2G Mar 8 23:11 study02.img
注:raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法制作快照。
使用du -sh命令查看则不一样了,raw格式的磁盘文件大小是0,而qcow2格式的磁盘文件大小则是和我们使用ls -lh查看的一样:
[root@localhost /kvm_data]# du -sh *
16K lost+found
0 study01_2.img
196K study01_2.qcow2
1.2G study01.img
1.2G study02.img
这就是raw格式的虚拟磁盘文件和qcow2格式的虚拟磁盘文件在物理磁盘存储上的区别。
下面我们来将study02虚拟机的虚拟磁盘转换成raw格式的虚拟磁盘,并进行启动:
[root@localhost /kvm_data]# virsh list
Id Name State
----------------------------------------------------
2 study02 running
[root@localhost /kvm_data]# virsh shutdown study02
Domain study02 is being shutdown
[root@localhost /kvm_data]# qemu-img convert -O raw /kvm_data/study02.img /kvm_data/study02_3.raw
[root@localhost /kvm_data]# ls -l
total 3531020
drwx------ 2 root root 16384 Mar 7 20:56 lost+found
-rw-r--r-- 1 root root 2147483648 Mar 8 23:02 study01_2.img
-rw-r--r-- 1 root root 197120 Mar 8 23:05 study01_2.qcow2
-rw------- 1 root root 10739515904 Mar 8 22:51 study01.img
-rw-r--r-- 1 root root 10737418240 Mar 8 23:45 study02_3.raw # 此时的属组属主为root
-rw------- 1 root root 1209008128 Mar 8 23:38 study02.img
[root@localhost /kvm_data]# virsh edit study02 # 更改格式和文件路径,修改如下内容即可
<driver name='qemu' type='raw'/>
<source file='/kvm_data/study02_3.raw'/>
[root@localhost /kvm_data]# virsh start study02
Domain study02 started
[root@localhost /kvm_data]# ls -l # 可以发现启动状态的虚拟机的磁盘文件的属组属主会发生改变
total 3531020
drwx------ 2 root root 16384 Mar 7 20:56 lost+found
-rw-r--r-- 1 root root 2147483648 Mar 8 23:02 study01_2.img
-rw-r--r-- 1 root root 197120 Mar 8 23:05 study01_2.qcow2
-rw------- 1 root root 10739515904 Mar 8 22:51 study01.img
-rw-r--r-- 1 qemu qemu 10737418240 Mar 8 23:45 study02_3.raw # 此时的属组属主为qemu
-rw------- 1 root root 1209008128 Mar 8 23:38 study02.img
此时如果要给study02制作快照就会报如下错误:
[root@localhost /kvm_data]# virsh snapshot-create study02
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw
磁盘扩容(raw)
以上介绍了虚拟磁盘格式的,以及如何转换虚拟磁盘格式,下面我们来看看如何进行磁盘扩容:
[root@localhost ~]# ls -lh /kvm_data/study02_3.raw
-rw-r--r-- 1 qemu qemu 10G Mar 9 01:00 /kvm_data/study02_3.raw
[root@localhost ~]# qemu-img resize /kvm_data/study02_3.raw +2G
Image resized.
[root@localhost ~]# ls -lh /kvm_data/study02_3.raw
-rw-r--r-- 1 qemu qemu 12G Mar 9 01:00 /kvm_data/study02_3.raw
[root@localhost ~]#
如上可以看到,原本的10G变成12G了,但是此时进入虚拟机中会发现磁盘依旧是10G:
[root@localhost ~]# virsh console study02
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00003436
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 3123199 1048576 82 Linux swap / Solaris
/dev/vda3 3123200 20971519 8924160 83 Linux
[root@localhost ~]#
这是因为还没有生效,需要重启虚拟机才能生效,但是注意这个重启要在宿主机上使用virsh命令进行重启,如下:
[root@localhost ~]# virsh destroy study02
Domain study02 destroyed
[root@localhost ~]# virsh start study02
Domain study02 started
[root@localhost ~]#
重启完成之后再查看就生效了:
[root@localhost ~]# virsh console study02
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00003436
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 3123199 1048576 82 Linux swap / Solaris
/dev/vda3 3123200 20971519 8924160 83 Linux
[root@localhost ~]#
然后还需要把这2G的空间分区才可以使用,因为我们安装这个系统的时候选择的是标准分区,所以无法像LVM分区那样直接扩容逻辑卷:
[root@localhost ~]# fdisk /dev/vda
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n # 新建分区
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): p # 选择新建主分区
已选择分区 4
起始 扇区 (20971520-25165823,默认为 20971520): # 默认即可,直接按回车
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823): # 默认即可,直接按回车
将使用默认值 25165823
分区 4 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):p # 再次查看磁盘信息
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00003436
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 3123199 1048576 82 Linux swap / Solaris
/dev/vda3 3123200 20971519 8924160 83 Linux
/dev/vda4 20971520 25165823 2097152 83 Linux # 可以看到多了一个/dev/vda4分区
命令(输入 m 获取帮助):w # 保存退出
除了对已有磁盘扩容外,还可以额外增加磁盘,宿主机下执行以下命令:
[root@localhost ~]# qemu-img create -f raw /kvm_data/study02_2.raw 5G
Formatting '/kvm_data/study02_2.raw', fmt=raw size=5368709120
[root@localhost ~]# qemu-img info /kvm_data/study02_2.raw
image: /kvm_data/study02_2.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0
[root@localhost ~]# virsh edit study02 # 在原本的<disk>标签下增加以下内容
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/kvm_data/study02_2.raw'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
[root@localhost ~]# virsh destroy study02
Domain study02 destroyed
[root@localhost ~]# virsh start study02
Domain study02 started
[root@localhost ~]#
重启完成后进入虚拟机,查看新增的虚拟磁盘是否生效了:
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00003436
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 3123199 1048576 82 Linux swap / Solaris
/dev/vda3 3123200 20971519 8924160 83 Linux
磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区 # 新增的虚拟磁盘
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@localhost ~]#
如上,可以看到新增了一块5G的虚拟磁盘,这时我们只需要对该磁盘进行分区、格式化、挂载后就可以使用了。
磁盘扩容(qcow2)
qcow2格式的虚拟磁盘的扩容方式和raw格式的是一样的,只不过需要注意的是,如果虚拟磁盘保存了快照,则无法扩容会报错,如下:
[root@localhost ~]# qemu-img info /kvm_data/study01.img
image: /kvm_data/study01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.1G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
2 1520520513 0 2018-03-08 22:48:33 00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: true
[root@localhost ~]# qemu-img resize /kvm_data/study01.img +2G # 会报如下错误
qemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize
[root@localhost ~]#
需要把快照删除后才能进行扩容:
[root@localhost ~]# virsh snapshot-delete study01 1520520513
Domain snapshot 1520520513 deleted
[root@localhost ~]# qemu-img resize /kvm_data/study01.img +2G
Image resized.
[root@localhost ~]#
剩下的操作和上面演示的raw是一样的,这里就不再演示了。
如果不希望删除快照的话,就只能是创建一块新的虚拟磁盘,操作方式也是和raw一样的。
建议不管是raw格式的还是qcow2格式的虚拟磁盘需要扩容,最好是使用新增硬盘的方式进行扩容,而不是在原有的磁盘上进行扩容,因为新增磁盘相对独立与已有的磁盘,误操作时也不容易对已有的磁盘造成影响。
调整cpu内存和网卡
介绍完了如何扩容磁盘,我们再来看看如何调整cpu、内存以及网卡,首先查看虚拟机的配置:
[root@localhost ~]# virsh dominfo study01
Id: -
Name: study01
UUID: eeedcd47-1546-4e5f-ab2a-f62deb0838cf
OS Type: hvm
State: shut off
CPU(s): 1
Max memory: 1048576 KiB
Used memory: 524288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0
[root@localhost ~]#
例如我现在要对该虚拟机的内存以及CPU进行调整,编辑该虚拟机的配置文件即可:
[root@localhost ~]# virsh edit study01 # 更改以下标签的值即可
<memory unit='KiB'>2048576</memory> # 内存的最大大小
<currentMemory unit='KiB'>624288</currentMemory> # 目前使用的内存大小
<vcpu placement='static' current='2'>4</vcpu> # CPU的核心数量,current的值为当前使用的核心数量,标签的值则为最大可使用的核心数量
更改完配置文件之后,如果虚拟机是开机状态的话需要重启,关机状态的话则直接启动即可生效:
[root@localhost ~]# virsh list --all
Id Name State
----------------------------------------------------
5 study02 running
- study01 shut off
[root@localhost ~]# virsh start study01
Domain study01 started
[root@localhost ~]#
此时再查看study01虚拟机的配置,会发现Max memory、Used memory以及CPU(s)参数的值发生了改变:
[root@localhost ~]# virsh dominfo study01
Id: 6
Name: study01
UUID: eeedcd47-1546-4e5f-ab2a-f62deb0838cf
OS Type: hvm
State: running
CPU(s): 2
CPU time: 26.7s
Max memory: 2049024 KiB
Used memory: 624288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0
[root@localhost ~]#
这样就完成了内存和CPU的调整,以上我们是通过编辑配置文件来对内存和CPU的资源进行调整,需要重启虚拟机之后才能生效。不过好在KVM是支持动态调整的,但前提是有设置最大的资源大小,例如以上的例子中,我们将内存的最大大小设置了两个G左右,那么我们就可以在这两个G以内动态的调整内存的大小,CPU也是同理。如下示例:
[root@localhost ~]# virsh setmem study01 800m # 动态调整内存大小为800M
[root@localhost ~]# virsh setvcpus study01 3 # 动态调整CPU核心数量为3核
[root@localhost ~]# virsh dominfo study01 # 可以看到无需重启也生效了
Id: 6
Name: study01
UUID: eeedcd47-1546-4e5f-ab2a-f62deb0838cf
OS Type: hvm
State: running
CPU(s): 3
CPU time: 31.2s
Max memory: 2049024 KiB
Used memory: 819200 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0
# 想要动态调整的配置永久生效,则需要把当前配置写入到配置文件里去
[root@localhost ~]# virsh dumpxml study01 > /etc/libvirt/qemu/study01.xml
注:内存资源可以动态的调大调小,而CPU资源只能动态地调大不能调小。
以上介绍了如何调整内存以及CPU资源,下面我们来看看如何增加网卡,首先查看一下网卡:
[root@localhost ~]# virsh domiflist study01
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:65:d3:3f
[root@localhost ~]#
如上,可以看到目前该虚拟机只有一个网卡。
然后我们来增加一块新的网卡,将该网卡设置为NAT网络模式(因为virbr0类似vmware的vmnet8):
[root@localhost ~]# virsh attach-interface study01 --type bridge --source virbr0
Interface attached successfully
[root@localhost ~]# virsh domiflist study01
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:65:d3:3f
vnet2 bridge virbr0 rtl8139 52:54:00:a4:60:b0
[root@localhost ~]#
这条命令末尾如果写的是 --source br0
,则是设置网络模式为桥接,和VMware里的桥接模式一样。--source是用于指定桥接到哪一块网卡上。例如我们也可以桥接到br0上:
[root@localhost ~]# virsh attach-interface study01 --type bridge --source br0
Interface attached successfully
[root@localhost ~]# virsh domiflist study01
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:65:d3:3f
vnet2 bridge virbr0 rtl8139 52:54:00:a4:60:b0
vnet3 bridge br0 rtl8139 52:54:00:e0:6c:da
# 同样的想要动态调整的配置永久生效,则需要把当前配置写入到配置文件里去
[root@localhost ~]# virsh dumpxml study01 > /etc/libvirt/qemu/study01.xml
迁移虚拟机
以上我们介绍完了如何调整资源的大小,下面我们来看看如何迁移虚拟机。迁移虚拟机就是把当前宿主机里的虚拟机迁移到另一台宿主机上去。
首先关闭需要迁移的虚拟机:
[root@localhost ~]# virsh list
Id Name State
----------------------------------------------------
5 study02 running
6 study01 running
[root@localhost ~]# virsh shutdown study01
Domain study01 is being shutdown
[root@localhost ~]#
然后通过rsync命令将配置文件拷贝到另一台机器上:
[root@localhost ~]# rsync -av /etc/libvirt/qemu/study01.xml 192.168.77.128:/etc/libvirt/qemu/study01.xml
接着将虚拟机的磁盘文件也拷贝到另一台机器上:
[root@localhost ~]# virsh domblklist study01 # 查看虚拟机的磁盘文件路径
Target Source
------------------------------------------------
vda /kvm_data/study01.img
hda -
[root@localhost ~]# rsync -av /kvm_data/study01.img 192.168.77.128:/kvm_data/study01.img
最后就是在另一台机器上根据实际情况修改虚拟机的配置文件,例如虚拟机的名称要对得上,虚拟磁盘文件路径要对得上等等,因为我这里两台机器的环境都是一样的,所以就不需要修改配置文件了,直接定义新虚拟机即可。以下这条命令在另一台机器上执行:
[root@192.168.77.128 ~]# virsh define /etc/libvirt/qemu/study01.xml
此时就可以看到新迁移的虚拟机了:
[root@192.168.77.128 ~]# virsh list --all
Id Name State
----------------------------------------------------
- study01 shut off
[root@localhost ~]#