libvirt架构概述
libvirt是用来管理虚拟机或虚拟化功能的软件集合,主要包括:libvirt API,libvirtd进程和virsh工具集三部分。最初的目的是为不同的hypervisor提供统一的管理接口。
libvirtd该后台进程主要实现以下功能:
(1)远程代理所有remote client发送来的命令,由该进程监测执行
(2)本地环境初始化libvirt服务的启停,用户connection的响应等
(3)根据环境注册各种Driver(qemu, xen, storage…)的实现不同虚拟化技术以Driver的形式实现,由于libvirt对外提供的是统一的接口,所以各个Driver就是实现这些接口,即将Driver注册到libvirt中。
查看libvirtd服务状态
如果libvirtd服务停止运行,那么你将不能管理虚拟机,也就是不能使用virt-manager等工具来管理虚拟机。
[root@localhost ~]# systemctl status libvirtd
查看配置文件
虚拟机的所有配置是放置在一个xml文件中,位置在/etc/libvirt/qemu/目录中
1. [root@localhost ~]# ll /etc/libvirt/qemu 2. total 8 3. -rw------- 1 root root 3325 Apr 20 23:29 myvm01.xml 4. -rw------- 1 root root 3325 Apr 20 23:30 myvm02.xml 5. drwx------. 3 root root 42 Apr 17 04:32 networks
可以看到创建的2个虚拟机,libvirt的xml文件分为几个重要部分,整体结构如下:
<domain type='kvm'>
虚拟机整体信息
系统信息
硬件资源特性
突发事件处理
虚拟磁盘(单个或多个)
虚拟光盘(可选)
虚拟网络(单个或多个)
vnc/spice 配置
</domain>
使用virsh管理虚拟机
virsh是使用libvirt management API构建的管理工具,virsh的名称的含义是virtualization shell。它有两种工作模式:
立即模式
1. [root@localhost ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 3 myvm02 running 5. 4 myvm01 running
交互模式
1. [root@localhost ~]# virsh 2. Welcome to virsh, the virtualization interactive terminal. 3. 4. Type: 'help' for help with commands 5. 'quit' to quit 6. 7. virsh # list --all 8. Id Name State 9. ---------------------------------------------------- 10. 3 myvm02 running 11. 4 myvm01 running
常用命令总结
命令 | 描述 |
attach-device | 使用XML文件中的设备定义在虚拟机中添加设备 |
attach-disk | 在虚拟机中附加新磁盘设备 |
attach-interface | 在虚拟机中附加新网络接口 |
create | 在XML配置文件生成虚拟机并启动新虚拟机 |
define | 为虚拟机输出XML配置文件 |
destroy | 强制关闭虚拟机 |
detach-device | 从虚拟机中分离设备,使用同样的XML描述作为命令attach-device |
detach-disk | 从虚拟机中分离磁盘设备 |
detach-interface | 从虚拟机中分离网络接口 |
domblkstat | 显示正在运行的虚拟机的块设备统计 |
domid | 显示虚拟机id |
domifstat | 显示正在运行的虚拟机的网络接口统计 |
dominfo | 显示虚拟机信息 |
domname | 显示虚拟机名称 |
domstate | 显示虚拟机状态 |
domuuid | 显示虚拟机uuid |
dumpxml | 输出虚拟机XML配置文件 |
help | 显示帮助命令 |
list | 列出所有虚拟机 |
migrate | 列出虚拟机迁移到两外一台主机中 |
nodeinfo | 有关管理程序的输出信息 |
quit | 退出交互终端 |
reboot | 重启虚拟机 |
restore | 恢复以前保存在文件中的虚拟机 |
resume | 恢复暂停的虚拟机 |
save | 将虚拟机当前状态保存到某个文件中 |
setmaxmem | 为管理程序设定内存上限 |
setmem | 为虚拟机设定分配的内存 |
setvcpus | 修改为虚拟机分配的虚拟cpu数量 |
shutdown | 关闭虚拟机 |
undefine | 删除与虚拟机关联的所有文件 |
vcpuinfo | 显示虚拟机的虚拟cpu信息 |
vcpupin | 控制虚拟机的虚拟cpu亲和性 |
version | 显示virsh版本 |
start | 启动未激活的虚拟机 |
suspend | 暂停虚拟机 |
kvm基本功能管理
为了区分主机及虚拟机,这里把主机改名为kvmserver
帮助命令
[root@kvmserver ~]# virsh -h
KVM的配置文件存放目录
1. [root@kvmserver ~]# ll /etc/libvirt/qemu 2. total 8 3. -rw------- 1 root root 3325 Apr 20 23:29 myvm01.xml 4. -rw------- 1 root root 3325 Apr 20 23:30 myvm02.xml 5. drwx------. 3 root root 42 Apr 17 04:32 networks
查看虚拟机状态
list只能查看启动状态下的虚拟机,加参数--all可以查看全部虚拟机,但未启动的虚拟机不会有id。
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 5 myvm01 running 5. - myvm02 shut off
虚拟机关机与开机
通过上面查看的虚拟机状态,这里把myvm01关闭,myvm02开启。
1. [root@kvmserver ~]# virsh shutdown myvm01 2. Domain myvm01 is being shutdown 3. 4. [root@kvmserver ~]# virsh start myvm02 5. Domain myvm02 started
强制虚拟机系统关闭电源
当虚拟机出现故障,通过上面温柔的关机方式,无法关闭时。这时你就需要用到暴力(拔电源)关机了,这种方式关机速度快,但是不推荐!!!
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 6 myvm02 running 5. - myvm01 shut off 6. 7. [root@kvmserver ~]# virsh destroy myvm02 8. Domain myvm02 destroyed 9. 10. [root@kvmserver ~]# virsh list --all 11. Id Name State 12. ---------------------------------------------------- 13. - myvm01 shut off 14. - myvm02 shut off
通过配置文件启动虚拟机系统
启动方式不止start一种,也可以通过启动配置文件来开启虚拟机。
1. [root@kvmserver ~]# virsh create /etc/libvirt/qemu/myvm01.xml 2. Domain myvm01 created from /etc/libvirt/qemu/myvm01.xml 3. 4. [root@kvmserver ~]# virsh list --all 5. Id Name State 6. ---------------------------------------------------- 7. 7 myvm01 running 8. - myvm02 shut off
挂起虚拟机
当虚拟机暂时不使用时,可以通过挂起保存当前的状态。当查看虚拟机的状态是,可以看到虚拟机的状态为被挂起。需要注意的是,挂起时的虚拟机必须为启动状态。
1. [root@kvmserver ~]# virsh suspend myvm01 2. Domain myvm01 suspended 3. 4. [root@kvmserver ~]# virsh list --all 5. Id Name State 6. ---------------------------------------------------- 7. 7 myvm01 paused 8. - myvm02 shut off
恢复虚拟机
恢复挂起状态下的主机
1. [root@kvmserver ~]# virsh resume myvm01 2. Domain myvm01 resumed 3. 4. [root@kvmserver ~]# virsh list --all 5. Id Name State 6. ---------------------------------------------------- 7. 7 myvm01 running 8. - myvm02 shut off
设置虚拟机自启
设置虚拟机随宿主机开启而开启,执行创建命令时在/etc/libvirt/qemu/autostart/目录里面创建开机自启的系统文件链接。
1. [root@kvmserver ~]# virsh autostart myvm01 2. Domain myvm01 marked as autostarted 3. 4. [root@kvmserver ~]# cd /etc/libvirt/qemu/autostart/ 5. [root@kvmserver autostart]# ls 6. myvm01.xml 7. [root@kvmserver autostart]# virsh list --autostart 8. Id Name State 9. ---------------------------------------------------- 10. 7 myvm01 running 11. 12. [root@kvmserver autostart]# virsh autostart --disable myvm01 13. Domain myvm01 unmarked as autostarted 14. 15. [root@kvmserver autostart]# virsh list --autostart 16. Id Name State 17. ----------------------------------------------------
导出虚拟机配置
下面命令是备份虚拟机myvm01,路径还是放qemu目录下。
[root@kvmserver ~]# virsh dumpxml myvm01 > /etc/libvirt/qemu/myvm01_bak.xml
删除和导入虚拟机
删除虚拟机前需要先关闭虚拟机,让虚拟机处于关机状态。需要注意的是,上面已经备份了myvm01的虚拟机,如果没有备份,建议先备份,以便后面的导入操作。
1. [root@kvmserver ~]# virsh shutdown myvm01 2. Domain myvm01 is being shutdown 3. 4. [root@kvmserver ~]# virsh undefine myvm01 5. Domain myvm01 has been undefined
查看删除结果,虽然文件myvm01.xml被删除了,但是不会删除磁盘文件。通过list命令查看已经没有myvm01虚拟机了。
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. - myvm02 shut off 5. 6. [root@kvmserver ~]# ll /etc/libvirt/qemu 7. total 8 8. drwxr-xr-x 2 root root 6 Apr 21 05:04 autostart 9. -rw-r--r-- 1 root root 4061 Apr 21 05:10 myvm01_bak.xml 10. -rw------- 1 root root 3325 Apr 20 23:30 myvm02.xml 11. drwx------. 3 root root 42 Apr 17 04:32 networks
通过备份的配置文件重新定义虚拟机
1. [root@kvmserver ~]# mv /etc/libvirt/qemu/myvm01_bak.xml /etc/libvirt/qemu/myvm01.xml 2. [root@kvmserver ~]# virsh define /etc/libvirt/qemu/myvm01.xml 3. Domain myvm01 defined from /etc/libvirt/qemu/myvm01.xml 4. 5. [root@kvmserver ~]# virsh list --all 6. Id Name State 7. ---------------------------------------------------- 8. - myvm01 shut off 9. - myvm02 shut off
修改虚拟机配置文件
1. 通过vim命令直接对配置文件修改 2. [root@kvmserver ~]# vim /etc/libvirt/qemu/myvm01.xml 3. 通过edit命令直接对虚拟修改 4. [root@kvmserver ~]# virsh edit myvm01
查看虚拟机信息
1. [root@kvmserver ~]# virsh dominfo myvm01 2. Id: - 3. Name: myvm01 4. UUID: 59727769-f3a3-418c-936b-8bf4191c766a 5. OS Type: hvm 6. State: shut off 7. CPU(s): 1 8. Max memory: 1048576 KiB 9. Used memory: 1048576 KiB 10. Persistent: yes 11. Autostart: disable 12. Managed save: no 13. Security model: none 14. Security DOI: 0
连接虚拟机
进入虚拟机后按 ctrl + ] 退出虚拟机,注意需要先启动虚拟机,等待开机完成,输入用户密码登录即可。
1. [root@kvmserver ~]# virsh start myvm01 2. Domain myvm01 started 3. 4. [root@kvmserver ~]# virsh console myvm01 5. 6. vm01 login: root 7. Password: 8. Last login: Fri Apr 21 14:18:14 on ttyS0 9. [root@vm01 ~]#
虚拟机克隆
查看虚拟机状态
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 8 myvm01 running 5. - myvm02 shut off
克隆虚拟机
克隆myvm02的虚拟机,到myvm02_clong
1. [root@kvmserver ~]# virt-clone -o myvm02 -n myvm02_clong -f /kvm/img/vm02_clong.qcow2 2. Allocating 'vm02_clong.qcow2' | 8.0 GB 00:00:12 3. 4. Clone 'myvm02_clong' created successfully.
参数:-o 需要克隆的虚拟机名称;-n 新虚拟机名称; -f 指定克隆到哪个文件目录并命名
查看状态并启动
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 8 myvm01 running 5. - myvm02 shut off 6. - myvm02_clong shut off 7. 8. [root@kvmserver ~]# virsh start myvm02_clong 9. Domain myvm02_clong started 10. 11. [root@kvmserver ~]# virsh list --all 12. Id Name State 13. ---------------------------------------------------- 14. 8 myvm01 running 15. 9 myvm02_clong running 16. - myvm02 shut off
虚拟机快照
快照实际上做的是虚拟机的XML配置文件,默认快照XML文件,在/var/lib/libvirt/qemu/snapshot/虚拟机名/下,快照只支持qcow2磁盘格式的系统。
对虚拟机拍摄快照
拍摄快照有两种方式,第一种是随机生成名称,第二种是指定名称,最后查看虚拟机快照,生成两个虚拟机快照。
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 8 myvm01 running 5. 9 myvm02_clong running 6. - myvm02 shut off 7. 8. [root@kvmserver ~]# virsh snapshot-create myvm01 9. Domain snapshot 1682069915 created 10. [root@kvmserver ~]# virsh snapshot-create-as myvm01 as1 11. Domain snapshot as1 created 12. [root@kvmserver ~]# virsh snapshot-list myvm01 13. Name Creation Time State 14. ------------------------------------------------------------ 15. 1682069915 2023-04-21 05:38:35 -0400 running 16. as1 2023-04-21 05:39:04 -0400 running
查看快照详细信息
1. [root@kvmserver ~]# virsh snapshot-current myvm01 2. <domainsnapshot> 3. <name>as1</name> 4. <state>running</state> 5. <parent> 6. <name>1682069915</name> 7. </parent> 8. <creationTime>1682069944</creationTime> 9. #省略部分内容
恢复快照
恢复myvm01虚拟机到快照1682069915
1. [root@kvmserver ~]# virsh snapshot-revert myvm01 1682069915 2. 3. [root@kvmserver ~]# virsh snapshot-current myvm01 4. <domainsnapshot> 5. <name>1682069915</name> 6. <state>running</state> 7. <creationTime>1682069915</creationTime> #虚拟机快照版本号 8. <memory snapshot='internal'/> 9. #省略部分内容
删除快照
先查看myvm01有哪些快照,删除as1快照后查看是否删除。
1. [root@kvmserver ~]# virsh snapshot-list myvm01 2. Name Creation Time State 3. ------------------------------------------------------------ 4. 1682069915 2023-04-21 05:38:35 -0400 running 5. as1 2023-04-21 05:39:04 -0400 running 6. 7. [root@kvmserver ~]# virsh snapshot-delete myvm01 as1 8. Domain snapshot as1 deleted 9. 10. [root@kvmserver ~]# virsh snapshot-list myvm01 11. Name Creation Time State 12. ------------------------------------------------------------ 13. 1682069915 2023-04-21 05:38:35 -0400 running