libvirt是用来管理虚拟机或虚拟化功能的软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等。Libvirt概括起来包括一个API库(libvirt API)、一个 daemon(libvirtd进程)和一个命令行工具(virsh //'versh//工具集)。
Libvirt的主要目标是:提供一种单一的方式管理多种不同的虚拟化提供方式和 hypervisor。
Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。
libvirtd该后台进程主要实现以下功能
查看libvirtd服务状态
$ systemctl status libvirtd
# 返回runing
# 如果libvirtd服务停止运行,那么你将不能管理虚拟机,也就是不能使用virt-manager 等工具来管理虚拟机。
虚拟机的所有配置是放置在一个xml文件中,位置在/etc/libvirt/qemu/目录中,以后需要调整虚拟机参数时可以修改此配置文件,然后使虚拟机生效。在初次建立虚拟机时里面的参数都是根据第一次生成虚拟机的配置指定的,下面分析一下在此xml配置文件中可以使用的部分参数。
官网链接: https://libvirt.org/formatdomain.html
` <domain type='kvm'>
# domain 是一个所有虚拟机都需要的根元素,它有两个属性,type定义使用哪个虚拟机管理程序,值可以是:xen、kvm、qemu、lxc、kqemu,第二个参数是id,它唯一的标示一个运行的虚拟机,不活跃的客户端没有id。
` <name>kvm_test3</name>
# name参数为虚拟机定义了一个简短的名字,必须唯一。
` <uuid>f7333079-650e-8bea-4c36-184480afa0ba</uuid>
# uuid为虚拟机定义了一个全球唯一的标示符,uuid的格式必须遵循RFC 4122指定的格式,当创建虚拟机没有指定uuid时会随机的生成一个uuid。
` <title>This is my first test kvm</title>
# title参数提供一个对虚拟机简短的说明,它不能包含换行符。
` BIOS bootloader
# 通过BIOS启动支持全虚拟化
` <os>
` <type arch='x86_64'>hvm< pe>
# type参数指定了虚拟机操作系统的类型,内容:hvm表明该OS被设计为直接运行在裸金属上面,需要全虚拟化,而linux(一个不好的名字)指OS支 持XEN3hypervisor的客户端ABI,type同样有两个可选参数:arch指定虚拟机的CPU构架,machine指定机器的类型。
` <boot dev='hd'/>
# dev属性的值可以是:fd、hd、cdrom、network,它经常被用来指定下一次启动。boot的元素可以被设置多个用来建立一个启动优先规则。
` </os>
` <memory unit='KiB'>524288</memory>
# memory 定义客户端启动时可以分配到的最大内存,内存单位由unit定义,单位可以是:K、KiB、M、MiB、G、GiB、T、TiB。默认是KiB。
` <currentMemory>1024000</currentMemory>
# currentMemory 定义实际分给给客户端的内存她小于memory的定义,如果没有定义,值和memory一致。
` <on_poweroff>destroy</on_poweroff>
` <on_reboot>restart</on_reboot>
` <on_crash>restart</on_crash>
# crash[kræʃ]崩溃
# 当一个客户端的OS触发lifecycle [ˈlaɪf saɪkl] 时,它将采取新动作覆盖默认操作,具体状态参数如下:
on_poweroff:当客户端请求poweroff时执行特定的动作
on_reboot:当客户端请求reboot时执行特定的动作
on_crash:当客户端崩溃时执行的动作
# 每种状态下可以允许指定如下四种行为:
1. destory:domain将会被完全终止,domain的所有资源会被释放
2. restart:domain会被终止,然后以相同的配置重新启动
3. preserver:domain会被终止,它的资源会被保留用来分析
4. rename-restart:domain会被终止,然后以一个新名字被重新启动
` <features> <pae/> <acpi/> <apic/> <hap/> <privnet/> </features>
# Hypervisors允许特定的CPU/机器特性打开或关闭,所有的特性都在fearures元素中,以下介绍一些在全虚拟化中常用的标记:
pae:扩展物理地址模式,使32位的客户端支持大于4GB的内存
acpi:用于电源管理
hap:Enable use of Hardware Assisted Paging if available in the hardware.
` <clock offset="localtime" />
# 客户端的时间初始化来自宿主机的时间,大多数操作系统期望硬件时钟保持UTC格式,UTC也是默认格式,然而Windows机器却期望它是’localtime’
# clock的offset属性支持四种格式的时间:UTC localtime timezone variable
UTC:当引导时客户端时钟同步到UTC时钟
localtime:当引导时客户端时钟同步到主机时钟所在的时区
timezone:使用timezone属性,客户时钟将同步到请求的时区。
` <devices>
# 所有的设备都是一个名为devices元素的子设备(All devices occur as children of the main devices element.),以下是一个简单的配置:
`<emulator>/usr/bin/kvm</emulator>
# emulator元素指定模拟设备二进制文件的全路径
`<disk type='block' device='disk'> <driver name='qemu' cache='none'/> <source dev='/dev/cciss/c0d0p6'/> <target dev='vda' bus='virtio'/> </disk> <disk type='block' device='cdrom'> <target dev='hdc' bus='ide'/> <readonly/> </disk>
# 所有的设备看起来就像一个disk、floppy、cdrom或者一个 paravirtualized driver,他们通过一个disk元素指定。disk是一个描述disks的主要容器,type特性包括:file,block,dir,network。device描述disk如何受到客户端 OS的,特性包括:floppy、disk、cdrom、lun,默认是disk。snapshot属性表明默认行为在磁盘做snapshot的时 候,snapshot的参数有:internal ,在snapshot的时候可以存储改变的数据。external,在snapshot时分开活动的数据。no,disk不参加snapshot,只读磁 盘默认是no。
# source元素:在disk的type是file时,file属性指定一个合格的全路径文件映像作为客户端的磁盘,在disk的type是block 时,dev属性指定一个主机设备的路径作为disk,在disk的type是dir时,dir属性指定一个全路径的目录作为disk,在disk的 type是network时,protocol属性指定协议用来访问镜像,镜像的值可以是:nbd,rbd,sheepdog。当protocal的属性 值是rbd或者sheepdog时,必须用一个额外的name属性指定使用那个镜像,当type的值是network时,source可以有0个或者多个 host字属性指定连接哪些主机。
# target元素:控制总线设备在某个磁盘被选为客户端的OS时,dev属性表明本地磁盘在客户端上的实际名称,因为实际设备的名称指定并不能保证映射到 客户端OS上的设备。bus属性指定了哪种类型的磁盘被模拟,值主要有:ide、scsi、virtio、xen、usb、sata。如果省略,总线类型 从设备名来推断,例如设备名是sda,则使用scsi类型的总线。tray属性指定可移动磁盘的状态,例如cdrom或者floppy,它的值是open 或closed,默认是closed。
# driver允许更进一步的指定hypervisor driver的相关细节。如果hypervisor支持多个后端驱动程序,name属性选择一个主要的后端驱动的名称,可选type参数可以指定一个子类 型,例如:xen支持的名称包括tap、tap2、phy、file,qemu只支持qemu名称,但是多类型的包括raw、bochs、qcow2、 qed等。cache属性控制cache机制,值可以是:default、none、writethtough、writeback、 directsync、unsafe。error_policy属性指定当hypervisor在读写磁盘出现错误时的行为,值可以是:stop、 report、ignored、enospace,默认值是report。io属性控制IO策略,qemu客户端支持threads、native。
# readonly元素:指定客户端不能修改设备。当一个disk含有type=cdrom,readonly则是默认值。
# host元素:有两个属性name和port,分别指定了hostname和port。
# 有好几种网络接口访问客户端:Virtual network、Bridge to LAN、Userspace SLIRP stack、Generic ethernet connection、Direct p_w_upload to physical interface。
Virtual network:这种推荐配置一般是对使用动态/无线网络环境访问客户端的情况。
Bridge to LAN:这种推荐配置一般是使用静态有限网络连接客户端的情况。
` <interface type='bridge'> <source bridge='br0'/> <mac address='52:54:00:ad:82:97'/> <model type='virtio'/> </interface>
# 输入设备允许使用图形化界面和虚拟机交互,当有图形化framebuffer的时候,输入设备会被自动提供的。
` <input type='mouse' bus='ps2'/>
# input元素:input元素含有一个强制的属性,type属性的值可以是mouse活tablet,前者使用想对运动,后者使用绝对运动。bus属性指定一个明确的设备类型,值可以是:xen、ps2、usb。
# 图形设备允许有个图形接口和客户端进行交互,客户端有图形接口和text console模式允许admin进行交互。
` <graphics type='vnc' port='-1' keymap='en-us'/> <graphics type='vnc' port='5904'> <listen type='address' address='1.2.3.4'/> </graphics>
# graphics元素:graphics含有一个强制的属性type,type的值可以是:sdl、vnc、rdp、desktop。vnc则启动vnc 服务,port属性指定tcp端口,如果是-1,则表示自动分配,vnc的端口自动分配的话是从5900向上递增。listen属性提供一个IP地址给服 务器监听,可以单独在listen元素中设置。passwd属性提供一个vnc的密码。keymap属性提供一个keymap使用。
#从0.9开始,可以指定一个单独的<graphics>子元素称为<listen>(而不是将用于设置图形类型vnc和spice的侦听套接字的地址信息放在<graphics> listen属性中)(请参见上述示例)。
# <listen>接受以下属性:
#listen元素:listen元素专门针对vnc和spice设置监听端口等。它包含以下属性:type、address、network。type的 值可以是address或network。如果设置了type=address,那么address属性设置一个ip地址或者主机名来监听。如果 type=network,则network属性设置一个网络名称在libvirt‘s的网络配置文件中。
#字符设备提供同虚拟机进行交互的接口,Paravirtualized consoles, serial ports, parallel ports and channels 都是字符设备,它们使用相同的语法
` <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console>
# Pseudo TTY 分配使用/dev/ptmx,A suitable client such as ‘virsh console’ can connect to interact with the serial port locally.
`<parallel type='pty'> <source path='/dev/pts/2'/> <target port='0'/> </parallel>
# 在每组指令中,最顶层的指令(parallel, serial, console, channel)描述设备怎样出现在客户端中,客户端接口通过target配置。
#呈现给主机的接口在顶级元素的type属性中给出。 主机接口由source元素配置
#主机接口通过source元素配置。
` <video> <model type='cirrus'/> </video>
#video元素:是描述声音设备的容器,为了向后完全兼容,如果没有设置video但是有graphics在xml配置文件中,这时libvirt会按照 客户端类型增加一个默认的video,。model元素有一个强制的type属性,它的值可以是:vga、cirrus、vmvga、xen、vbox、 qxl。例如一个客户端类型为kvm,那么默认的type值是cirrus。
`</devices>
virt-manager应用程序是一个桌面用户接口,用于通过libvirt管理虚拟机。它的主要目标是管理KVM,不过也可以管理Xen和LXC(Linux容器)。它提供了运行域的汇总视图,当前性能和资源利用统计。向导可以允许创建新域,以及配置、调整域的资源分配和虚拟硬 件。内嵌的VNC和SPICE的客户端提供了一个全图形控制台。
首先“添加连接”
建立连接,添加必要的参数。连接端需要安装 软件包。连接时使用被连接端宿主机ip。
结果如下
virsh是使用libvirt management API构建的管理工具
virsh的名称的含义是virtualization shell。它有两种工作模式:
立即模式
交互模式
查看命令帮助virsh --help,主要有以下部分管理命令:
常用命令总结 :
$ virsh -h
$ ls -l /etc/libvirt/qemu
总用量 12
drwxr-xr-x. 2 root root 23 9 月 28 17:20 autostart
-rw-------. 1 root root 4364 9 月 27 12:01 centos7.0.xml
drwx------. 3 root root 42 9 月 24 22:54 networks
-rw-------. 1 root root 3847 9 月 28 16:35 vm002.xml
$ virsh list --all
虚拟机关机与开机
$ virsh shutdown vm002
域 vm002 被关闭
$ virsh start vm002
域 vm002 已开始
强制虚拟机系统关闭电源
$ virsh destroy vm002
域 vm002 被删除
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
- vm002 关闭
通过配置文件启动虚拟机系统实例
$ virsh create /etc/libvirt/qemu/vm002.xml
域 vm002 被 创 建 ( 从 /etc/libvirt/qemu/vm002.xml)
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
5 vm002 running
挂起虚拟机
$ virsh suspend vm002
域 vm002 被挂起
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
5 vm002 暂停
恢复虚拟机
$ virsh resume vm002
域 vm002 被重新恢复
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
5 vm002 running
配置虚拟机实例伴随宿主机自动启动
$ virsh autostart vm002
域vm002标记为自动开始
# 上述命令将创建/etc/libvirt/qemu/autostart/目录,里面内容为开机自动启动的系统
$ virsh autostart --disable vm002
域 vm002取消标记为自动开始
导出虚拟机配置
$ virsh dumpxml vm002 > /etc/libvirt/qemu/vm002-bak.xml
虚拟机的删除与添加
$ virsh shutdown vm002
域 vm002 被关闭
$ virsh undefine vm002
域 vm002 已经被取消定义
查看删除结果,vm002的配置文件被删除,但是磁盘文件不会被删除。
$ ls /etc/libvirt/qemu
autostart centos7.0.xml networks vm002-bak.xml
# 通过virsh list --all 查看不到vm002的信息,说明此虚拟机被删除
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
通过备份的配置文件重新定义虚拟机
$ mv /etc/libvirt/qemu/vm002-bak.xml
/etc/libvirt/qemu/vm002.xml
$ virsh define /etc/libvirt/qemu/vm002.xml
定 义 域 vm002( 从 /etc/libvirt/qemu/vm002.xml)
$ virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos7.0 running
- vm002 关闭
修改虚拟机配置信息
```shell
#直接修改配置文件
$ vim /etc/libvirt/qemu/vm002.xml
#通过virsh命令修改
$ virsh edit vm002
```
查看虚拟机信息
$ virsh dominfo vm002
Id: 1
名称: vm002
UUID: e144e9ba-a125-4a97-9cf1-1c571f58817a
OS 类 型: hvm 状态: running CPU: 1
CPU 时间: 72.9s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB持久: 是
自动启动: 禁用
管理的保存: 否 安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c215,c657 (enforcing)
连接虚拟机
$ virsh console vm002
连接到域 vm002
换码符为 ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64
vm002 login: root Password:
Last login: Fri Sep 29 09:00:18 on ttyS0
想成功连接到虚拟机:
如果是CentOS7,需要在虚拟机里运行以下命令
# ttyS0串行终端 grubby[ˈɡrʌbi](肮脏的)
# grubby是一个命令行工具,用于更新和显示有关grub,lilo,elilo (ia64),yaboot(powerpc)和zipl(s390)引导加载程序的配置文件的信息。它主要设计用于安装新内核的脚本,并需要查找有关当前引导环境的信息。
# --update-kernel 指定针对的内核版本。ALL为针对所有内核版本修改参数
# --args新内核的默认参数或正在更新的内核的新参数
$ grubby --update-kernel=ALL --args="console=ttyS0"
$ reboot
如果想退出虚拟机连接,按“Ctrl+]”可以随时退出。如果是CentOS6的系统,需要做以下修改:
# 1. 添加ttyS0的许可,允许root登陆
$ echo "ttyS0" >> /etc/securetty
# 2. 编辑/etc/grub.conf文件,在内核启动参数后面加上console=ttyS0
# 3. reboot重启
通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置文件无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件主要有raw[rɔː] 和qcow2格式。raw格式性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等。要使用镜像功能,磁盘格式必须为qcow2。
raw格式的话,速度稍微快点,在高版本的qemu-kvm中,几乎不比qcow2的格式快,而qcow2格式节省空间,可动态增长,在公有云中广泛使用,建议使用qcow2。所以有时候,我们需要将raw格式的磁盘转换成qcow2格式。
创建一个raw格式的磁盘文件
$ qemu-img create /kvm-vm/vmtest01.img 8G
Formatting '/kvm-vm/vmtest01.img', fmt=raw size=8589934592
查看一下
$ls -lh
总用量 3.0G
-rw-------. 1 qemu qemu 11G 9 月 28 22:40 centos7-vm001.qcow2
-rw-r--r--. 1 qemu qemu 1.3G 9 月 29 09:28 centos7-vm002.qcow2
drwx------. 2 root root 16K 9 月 27 10:45 lost+found
-rw-r--r--. 1 root root 8.0G 9 月 29 09:27 vmtest01.img
$ qemu-img info vmtest01.img
image: vmtest01.img
file format: raw
virtual size: 8.0G (8589934592 bytes)
disk size: 0
# 虽然通过ls命令看到磁盘为8G,但是实际空间大小为0,所以通过qemu-img创建的磁盘为稀疏模式磁盘。
# 通过virt-manager或者virt-install命令创建新虚拟机并安装好
$virt-install --name vmtest02 --vcpus 1 --ram 1024 --disk /kvm-vm/vmtest01.img,format=raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=centos7.0 --location=/iso/CentOS-7-x86_64-DVD-1908.iso
开始安装......
搜索文件 .treeinfo...... | 366 B
00:00:00
搜索文件 vmlinuz...... | 5.1
MB 00:00:00
搜索文件 initrd.img...... | 41
MB 00:00:01
域安装仍在进行。您可以重新连接到控制台以便完成安装进程。
安装完成后,查看虚拟机状态
$ virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm002 running
4 vmtest01 running
- centos7.0 关闭关闭虚拟机:
$ virsh shutdown vmtest01
域 vmtest01 被关闭
$ virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm002 running
- centos7.0 关闭
- vmtest01 关闭
转换磁盘格式为qcow2
$ qemu-img convert -f raw -O qcow2 /kvm-vm/vmtest01.img /kvm-vm/vmtest01.qcow2
$ ls -lh 总用量 5.5G
-rw-------. 1 qemu qemu 11G 9 月 28 22:40 centos7-vm001.qcow2
-rw-r--r--. 1 qemu qemu 1.3G 9 月 29 10:01 centos7-vm002.qcow2
drwx------. 2 root root 16K 9 月 27 10:45 lost+found
-rw-r--r--. 1 root root 8.0G 9 月 29 09:59 vmtest01.img
-rw-r--r--. 1 root root 1.3G 9 月 29 10:01 vmtest01.qcow2
$ qemu-img info vmtest01.qcow2
image: vmtest01.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes) disk size: 1.2G
cluster_size: 65536
Format specific information:
compat: 1.1 lazy refcounts: false
修改vmtest01的xml配置文件,主要是修改type和source部分
$ virsh edit vmtest01
$ virsh start vmtest01
域 vmtest01 已开始
**vrit-edit命令用于编辑文件,用法与vim基本一致 **
$ yum -y install libguestfs-tools virt-top
$ virt-df -h vmtest01
文件系统 大 小 已 用 空 间 可 用 空 间 使 用 百 分 比 % vmtest01:/dev/sda1 1014M 106M 908M 11%
vmtest01:/dev/cl/root 6.2G 917M 5.3G 15%
# virt-copy-out -d domname file|dir [file|dir ...] localdir
# virt-copy-out -a disk.img file|dir [file|dir ...] localdir
如 :
$ virt-copy-out -d vmtest01 /etc/passwd ./
$ ls
anaconda-ks.cfg initial-setup-ks.cfg passwd
$ echo "this is a test" > test.txt
$ virt-copy-in -d vmtest01 test.txt /opt/
上面的这些操作最好要在虚拟机关机状态下做,否则会出错。
# guestfish [--ro|--rw] -i -a /path/to/disk.img
# guestfish [--ro|--rw] -i -d name-of-libvirt-domain
# Guestfish是用于检查和修改虚拟机文件系统的shell程序和命令行工具。
# -r --ro 只读模式
# -i --inspector 检查寻找操作系统的磁盘,并像在真正的虚拟机上一样装载文件系统。
# -d --domain 指定域
# -a --add 指定磁盘文件
guestfish --ro -i -d vm003
$ virsh list --all
Id 名称 状态
----------------------------------------------------
17 vmtest01 running
- centos7.0 关闭
- vm002 关闭
$ virt-clone -o vm002 -n vm003 -f /kvm-vm/vm003.qcow2
查看虚拟机状态
$ virsh list --all
Id 名称 状态
----------------------------------------------------
17 vmtest01 running
- centos7.0 关闭
- vm002 关闭
- vm003 关闭
启动虚拟机
$ virsh start vm003
域 vm003 已开始
$ virsh list --all
Id 名称 状态
----------------------------------------------------
17 vmtest01 running
18 vm003 running
- centos7.0 关闭
- vm002 关闭
快照实际上做的是虚拟机的XML配置文件,默认快照XML文件在/var/lib/libvirt/qemu/snapshot/虚拟机名/下,快照只支持qcow2磁盘格式的系统。
对虚拟机vm002做快照
$ virsh snapshot-create vm002
已生成域快照 1507040414
或者在创建快照的同时给快照一个名字
$ virsh snapshot-create-as vm002 firsh_snap
已生成域快照 firsh_snap
查看快照信息
$ virsh snapshot-list vm002
名称 生成时间 状态
------------------------------------------------------------ 1507040414 2017-10-03 22:20:14 +0800 shutoff
firsh_snap 2017-10-03 22:26:49 +0800 shutoff
查看当前快照信息
$ virsh snapshot-current vm002
<domainsnapshot>
<name>firsh_snap</name> //快照版本号
<state>shutoff</state>
<parent>
<name>1507040414</name>
</parent>
<creationTime>1507040809</creationTime>
<memory snapshot='no'/>
恢复虚拟机状态到1507040414
$ virsh snapshot-revert vm002 1507040414
# 验证是否恢复
$ virsh snapshot-current vm002
<domainsnapshot>
<name>1507040414</name> //快照版本号
<state>shutoff</state>
<creationTime>1507040414</creationTime>
<memory snapshot='no'/>
删除快照
$ virsh snapshot-list vm002
名称 生成时间 状态
------------------------------------------------------------ 1507040414 2017-10-03 22:20:14 +0800 shutoff
firsh_snap 2017-10-03 22:26:49 +0800 shutoff
$ virsh snapshot-delete vm002 firsh_snap
已删除域快照 firsh_snap
$ virsh snapshot-list vm002
名称 生成时间 状态
------------------------------------------------------------ 1507040414 2017-10-03 22:20:14 +0800 shutoff
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。