虚拟化云计算-KVM管理常用命令

时间:2021-07-11 00:53:43

KVM磁盘格式

一般来说,KVM环境使用两种磁盘镜像格式,一种是RAW,一种是qcow2

RAW

raw硬盘格式是KVM虚拟机原始的硬盘镜像,属于二进制镜像文件,性能较好但是功能简单,使用raw格式会占用大量存储空间,一次性会把创建的空间全部使用,比如创建10GB空间直接使用10GB,不管究竟用多少,同时RAW格式需要ext3/ext4文件系统支持。

使用qemu-img create可以创建 raw镜像文件,如果不指定参数,默认创建raw格式。

#创建名为win10的镜像文件
qemu-img create win10 20g
#创建名为win10的镜像文件信息
qemu-img info win10

raw格式支持稀疏文件特性,所谓稀疏文件特性就是文件系统会把分配的空字节文件记录在元数据中,而不会实际占用硬盘空间,使用ls命令或者du命令查看raw镜像文件会得出大小不一样的结果。

整体来说,raw 格式可以满足生产环境的虚拟机使用,但是需要注意的是,raw格式不支持虚拟机快照,如果需要支持快照,则需要通过命令转化为 qcow2格式。

qcow2格式

qcow2格式是qcow格式的升级版,而qcow则一般不再使用。qcow2性能一般,但是功能较多,在使用镜像部署虚拟机使用到,使用 qcow2格式减少空间,类似于精简置备,比如创建了10GB,操作系统只使用了5GB,那么实际使用空间就是5G,硬盘随着使用动态增长。

使用qemu-img 创建

qemu-img create -f qcow2 win10.qcow2 20G


raw/qcow2格式对比

虚拟化云计算-KVM管理常用命令

raw/qcow2格式常见操作

raw转换为qcow2

#关闭虚拟机电源,才能转换
#查看虚拟机运行状态
virsh list --all
#进行格式转换
qemu-img convert -f raw -O qcow2 win7-kvm.raw win7-kvm.qcow2
#查看新文件相关系统
qemu-img info win7-kvm.qcow2
#编辑虚拟机配置文件,修改硬盘文件格式以及路径
virsh edit win7-kvm

=====
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/vm-win/win7-kvm.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
====

# 启动虚拟机然后进行验证
virsh start win7-kvm

增加硬盘容量

#关闭虚拟机
vrish shutdown win7-kvm
#硬盘增加容量10GB
qemu-img reszie win7-kvm.qcow2 +10G
#验证容量是否增加
qemu-img info win7-kvm.qcow2
#启动虚拟机
virsh start win7-kvm

KVM上重要的管理工具

libvirtd

​libvirtd是一个作为libvirt虚拟化管理系统中的服务器端的守护程序,libvirtd负责执行其他管理工具发送它的虚拟化管理操作指令。

如果要让某个节点能够用libvirt进行管理(无论是本地还是远程管理),都需要在这个节点上运行着libvirtd这个守护进程,以便让其他上层管理工具可以连接到该节点。

而 libvirt 的客户端工具(包括virsh、virt-manager等)可以连接到本地或远程的 libvirtd 进程,以便管理节点上的客户机(启动、关闭、重启、迁移等)、收集节点上的宿主机和客户机的配置和资源使用状态


#(1)启动停止libvirtd服务进程
system <start| restart | reload stop> libvirtd
#(2)查看帮助信息
libvirtd --help
Usage:
libvirtd [options]
Options:
-h | --help Display program help:
-v | --verbose Verbose messages. 显示:详细的运行消息
-d | --daemon Run as a daemon & write PID file. 设置:作为<守护进程>运行,并写入<PID进程号文件>
-l | --listen Listen for TCP/IP connections. 设置:侦听<TCP/IP>连接
-t | --timeout <secs> Exit after timeout period. 设置:超时退出
-f | --config <file> Configuration file. 调用:指定的<配置文件>,默认的配置文件是</etc/libvirt/libvirtd.conf>
-V | --version Display version information. 显示:libvirtd版本
-p | --pid-file <file> Change name of PID file. 设置:指定的<PID进程号文件>,默认的PID文件是</var/run/libvirtd.pid>
libvirt management daemon: <---- 以下是libvirt管理进程的默认设置
Default paths: 默认配置文件,当前配置文件的内容全部被注释掉了
Configuration file (unless overridden by -f):
/etc/libvirt/libvirtd.conf
Sockets: 默认socket文件的读取文件路径
/var/run/libvirt/libvirt-sock
/var/run/libvirt/libvirt-sock-ro
TLS: 默认TLS安全传输层密钥的读取文件路径,当前没有密钥文件
CA certificate: /etc/pki/CA/cacert.pem
Server certificate: /etc/pki/libvirt/servercert.pem
Server private key: /etc/pki/libvirt/private/serverkey.pem
PID file (unless overridden by -p): 默认PID进程文件的读取文件路径
/var/run/libvirtd.pid

virt-manager图形化管理工具----远程连接

virt-manager -c qemu:///system        ## 连接本机的virt-manager图形化控制台
virt-manager -c qemu+ssh://root@192.168.100.21/system ## 连接远程主机的virt-manager图形化控制台

virsh命令行工具----远程连接

virsh -c qemu:///system          ## 连接本机的virsh命令行控制台
欢迎使用 virsh,虚拟化的交互式终端。
输入:'help' 来获得命令的帮助信息
'quit' 退出
virsh #
virsh -c qemu+ssh://root@192.168.100.21/system ## 连接远程主机的virsh命令行控制台
root@192.168.100.21's password:
欢迎使用 virsh,虚拟化的交互式终端。
输入:'help' 来获得命令的帮助信息
'quit' 退出
virsh #

KVM虚拟机部署

virt-install命令说明

使用virt-install命令来创建虚拟机

virt-install命令
定义:虚拟机的OS操作系统的类型,从而自动予以相应的优化
--os-type=linux 定义操作系统的类型,如,linux、windows,从而实现优化
--os-variant rhel6 操作系统类型的变种,如,rhel6,centos6.5,从而实现进一步的优化
--os-variant auto 根据安装媒体,自动检测操作系统类型
定义:虚拟机的名(注意:是在KVM中的标识名,不是虚拟机运行中的主机名)
--name server01 设置虚拟机的标识名
定义:vCPU
--vcpus 1,maxvcpus 2 设置vCPU的最小个数和最大个数,便于今后根据负载情况,进行调节
定义:内存
--memory 512,maxmemory=1024 设置内存的最小个数和最大个数,便于今后根据负载情况,进行调节
定义:网卡,多个网卡,可以定义多行
--network bridge=br0,model=virtio 设置一个网卡,桥接到br0桥接网卡上,型号为virtio
<bridge=br0>桥接到br0桥接网卡上
<virtio>是默认设置,支持半虚拟化
--network network=default,model=virtio 设置一个网卡,采用default网络配置文件中的配置,型号为virtio
default网络配置文件,默认内容是NAT配置
定义:磁盘
--disk device=disk,path=${diskpath}/${name}.disk01,format=qcow2,size=10,bus=virtio,cache=writeback,io=threads
device=disk 磁盘类型为disk硬盘
path=${diskpath}/${name}.disk01 存储卷的名称
format=qcow2 存储卷的格式,可以是'raw', 'qcow2', 'vmdk'格式
<qcow2格式>支持快照功能,这是centos7中的默认格式
size=10 磁盘大小为10GB,单位是GB
bus=virtio 磁盘总线的类型,可以是'ide', 'sata', 'scsi', 'usb', 'virtio' or 'xen'
<virtio>是默认设置,支持半虚拟化,<virtio>半虚拟化是hypervisor虚拟层中的位于设备之上的抽象层
<virtio>的半虚拟化驱动方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能
cache=writeback 设置磁盘的<写入缓存策略>,可以是'none', 'writethrough', 'directsync', 'unsafe' or 'writeback'
writethrough 当写数据进Cache时,也同时更新了相应的Memory里的内容
writeback 只是写到Cache里,Memory的内容要等到cache保存的要被别的数据替换或者系统做cache flush时,才会被更新
directsync CPU直接同步写入磁盘缓存
unsafe 写入所有的数据,忽略系统的cache flush清理请求
默认设置为<管理程序默认>
io=threads 磁盘IO后端机制,可以是"threads线程" or "native本地"
<threads>线程模式,是默认设置
<native>本地模式,只能用于cache mode为none的情况
定义:图形安装方式
--graphics vnc,port=-1 启用VNC服务连接方式,port=-1表示自动分配端口
--graphics spice,port=-1 启用spice服务连接方式,port=-1表示自动分配端口
定义:文本安装方式
--graphics none
-x,--extra-args console=ttyS0 通过<指定的ttyS0串行端口终端>来显示文本安装界面,该参数只能用于<--location媒体安装方式>
定义:console连接
-x,--extra-args console=ttyS0 设置console连接通道是<串行接口ttyS0>
定义:安装媒体
--location/iso/CentOS-6.8-x86_64-bin-DVD1.iso 本地目录的iso映像文件
--cdrom 使用光驱
--pxe 使用网络PXE安装
定义:宿主主机开机后,自动启动来宾虚拟机
--autostart
定义:内核加速
--accelerate KVM或KQEMU内核加速,这个选项是推荐最好加上。
定义:虚拟化类型
-v --hvm 全虚拟化
-p --paravirt 半虚拟化

virt-install配置举例

#VNC方式连接,本地安装,NAT配置
name="server01"
diskpath="/var/lib/libvirt/images"
virt-install --os-variant rhel6 \
--name ${name} \
--memory 512,maxmemory=1024 \
--vcpus 1,maxvcpus=2 \
--network network=default,model=virtio \
--disk device=disk,path=${diskpath}/${name}.disk01,format=qcow2,size=10,bus=virtio,cache=writeback,io=threads \
--disk device=disk,path=$diskpath/${name}.disk02,format=qcow2,size=5,bus=virtio,cache=writeback,io=threads \
--location /iso/CentOS-6.8-x86_64-bin-DVD1.iso \
--graphics vnc,port=-1 \
--accelerate \
--autostart \

#console文本连接方式,本地安装,Bridge桥接配置
name="server02"
diskpath="/var/lib/libvirt/images" #虚拟机存储位置
virt-install --os-variant rhel6 \
--name ${name} \
--memory 512,maxmemory=1024 \
--vcpus 1,maxvcpus=2 \
--network bridge=br0,model=virtio \
--disk device=disk,path=${diskpath}/${name}.disk01,format=qcow2,size=10,bus=virtio,cache=writeback,io=threads \
--disk device=disk,path=$diskpath/${name}.disk02,format=qcow2,size=5,bus=virtio,cache=writeback,io=threads \
--location /iso/CentOS-6.8-x86_64-bin-DVD1.iso \ #安装光盘位置
--graphics none \
--extra-args console=ttyS0 \
--accelerate \
--autostart \
&
virsh console server02


#VNC连接方式,PEX全自动安装,Bridge桥接配置
name="server03"
diskpath="/var/lib/libvirt/images"
virt-install --os-variant rhel6 \
--name ${name} \
--memory 512,maxmemory=1024 \
--vcpus 1,maxvcpus=2 \
--network bridge=br0,model=virtio \
--disk device=disk,path=${diskpath}/${name}.disk01,format=qcow2,size=10,bus=virtio,cache=writeback,io=threads \
--graphics vnc,port=-1 \
--pxe \
--accelerate \
&

#spice连接方式,PEX全自动安装,Bridge桥接配置
name="server04"
diskpath="/var/lib/libvirt/images"
virt-install --os-variant rhel6 \
--name ${name} \
--memory 512,maxmemory=1024 \
--vcpus 1,maxvcpus=2 \
--network bridge=br0,model=virtio \
--disk device=disk,path=${diskpath}/${name}.disk01,format=qcow2,size=10,bus=virtio,cache=writeback,io=threads \
--graphics spice,port=-1 \
--pxe \
--accelerate \
&

查看虚拟机信息

# 查看:libvirt配置文件目录(保存着每台虚拟机的XML配置文件)
ll /etc/libvirt/
# 查看:libvirt虚拟机存储目录
ll /var/lib/libvirt/
# 查看:所有的虚拟机名称及状态
virsh list --all
Id 名称 状态
----------------------------------------------------
20 server01 running

# 查看:server01虚拟机的域信息
virsh dominfo server01
Id: 20
名称: server01
UUID: f8cef178-f02d-48b8-8bef-f72cf8f6ff6e
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 20.8s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 启用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c241,c270 (enforcing)

# 查看:server01虚拟机的配置文件
cat /etc/libvirt/qemu/server01.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit server01
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>server01</name>
<uuid>f8cef178-f02d-48b8-8bef-f72cf8f6ff6e</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'>
<model fallback='allow'>Broadwell</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>restart</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' cache='writeback' io='threads'/>
<source file='/var/lib/libvirt/images/server01.qcow2.disk01'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
<source file='/var/lib/libvirt/images/server01.qcow2.disk02'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<disk type='block' 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='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<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='0x04' function='0x0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:d1:85:f3'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-server01/org.qemu.guest_agent.0'/>
<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'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'/>
<video>
<model type='cirrus' vram='16384' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
</domain>

查看虚拟机磁盘文件

虚拟机的磁盘文件,默认存储在</var/lib/libvirt/images/>目录中。

# 查看:存储池列表
virsh pool-list
名称 状态 自动开始
-------------------------------------------
default 活动 是
iso 活动 是

# 查看:指定存储池中的存储卷列表
virsh vol-list default
名称 路径
------------------------------------------------------------------------------
server01.qcow2 /var/lib/libvirt/images/server01.qcow2
server01.qcow2.disk01 /var/lib/libvirt/images/server01.qcow2.disk01
server01.qcow2.disk02 /var/lib/libvirt/images/server01.qcow2.disk02
virsh vol-list iso
名称 路径
------------------------------------------------------------------------------
CentOS-6.8-x86_64-bin-DVD1.iso /iso/CentOS-6.8-x86_64-bin-DVD1.iso


# 查看:指定存储池的指定存储卷的info概要信息
virsh vol-info --pool default server01.qcow2
名称: server01.qcow2
类型: 文件
容量: 9.10 GiB
分配: 1.49 GiB

# 查看:指定存储卷的format格式类型
qemu-img info server01.qcow2.disk01
image: server01.qcow2.disk01
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true


kvm网络

网络原理

桥接网络,也叫物理设备共享,被用作把一个物理设备复制到一台虚拟机。

虚拟化云计算-KVM管理常用命令

NAT地址转换,

虚拟化云计算-KVM管理常用命令

host-only隔离(不能与外部通信,只能在宿主主机和来宾虚拟机之间进行通讯)

虚拟化云计算-KVM管理常用命令

网络命令行工具vrish net

虚拟网络的XML配置文件的默认存储目录是</etc/libvirt/qemu/networks/>目录,以下是常用命令

virsh net-define  ## 从一个预定义的XML文件,来创建一个虚拟网络
virsh net-start ## 激活一个虚拟网络
virsh net-autostart ## 自动激活一个虚拟网络
virsh net-destroy ## 取消激活一个虚拟网络
virsh net-undefine ## 删除一个虚拟网络的XML配置文件
virsh net-list ## 查看虚拟网络列表
virsh net-info ## 查看一个虚拟网络的详情

在宿主机上,需要开启路由转发

CentOS 6.x系统
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
CentOS 7.x系统
sysctl -w net.ipv4.ip_forward=1(这是centos7.x中的配置方式,默认就是开启状态

创建host-only

# 创建Host-Only网络
cat >/etc/libvirt/qemu/networks/my_host_only.xml<<EOF
<network>
<name>my_host_only</name>
<bridge name='virbr1' stp='on' delay='0'/>
<domain name='my_host_only'/>
<ip address='192.168.110.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.110.128' end='192.168.110.254'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define /etc/libvirt/qemu/networks/my_host_only.xml ## 从一个预定义的XML文件,来创建一个虚拟网络
virsh net-start my_host_only ## 激活一个虚拟网络
virsh net-autostart my_host_only ## 自动激活一个虚拟网络
systemctl restart libvirtd
virsh net-list
nmcli conn
systemctl restart libvirtd
## 删除Host-Only网络
virsh net-destroy my_host_only ## 取消激活一个虚拟网络
virsh net-undefine my_host_only ## 删除一个虚拟网络的XML配置文件
systemctl restart libvirtd
virsh net-list
nmcli conn

创建NAT

# 创建NAT网络
cat >/etc/libvirt/qemu/networks/my_nat.xml<<EOF
<network>
<name>my_nat</name>
<forward mode='nat'/>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.110.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.110.2' end='192.168.110.254'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define /etc/libvirt/qemu/networks/my_nat.xml ## 从一个预定义的XML文件,来创建一个虚拟网络
virsh net-start my_nat ## 激活一个虚拟网络
virsh net-autostart my_nat ## 自动激活一个虚拟网络
systemctl restart libvirtd
virsh net-list
nmcli conn
## 删除NAT网络
virsh net-destroy my_nat ## 取消激活一个虚拟网络
virsh net-undefine my_nat ## 删除一个虚拟网络的XML配置文件
systemctl restart libvirtd
virsh net-list
nmcli conn

创建Bridge网络

方法1:nmcli命令(OS桥接网卡,永久生效)
方法2:brctl命令(OS桥接网卡,临时配置,重启失效)
## 创建br0桥接网卡
yum install bridge-utils -y
brctl show
brctl addbr br0
ip link set br0 up
brctl addif br0 eth0
ip addr add 192.168.100.13/24 brd + dev br0
route add default gw 192.168.100.1 dev br0
service network restart
brctl show
ip route list
## 删除br0桥接网卡
ip link set br0 down
brctl delbr br0
route del default gw 192.168.100.1 dev br0
service network restart
brctl show
ip route list
方法3:virsh net-xxx子命令(KVM虚拟路由网络)
## 删除Bridge路由网络
cat >/etc/libvirt/qemu/networks/my_bridge.xml<<EOF
<network>
<name>my_bridge</name>
<forward mode='route'/>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.110.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.110.2' end='192.168.110.254'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define /etc/libvirt/qemu/networks/my_bridge.xml ## 从一个预定义的XML文件,来创建一个虚拟网络
virsh net-start my_bridge ## 激活一个虚拟网络
virsh net-autostart my_bridge ## 自动激活一个虚拟网络
systemctl restart libvirtd
virsh net-list
nmcli conn
## 删除Bridge路由网络
virsh net-destroy my_bridge ## 取消激活一个虚拟网络
virsh net-undefine my_bridge ## 删除一个虚拟网络的XML配置文件
systemctl restart libvirtd
virsh net-list
nmcli conn

KVM存储管理

概念

存储池

是放置虚拟机的存储位置(即:存储目录)。所有的pool存储池的配置文件都放在</etc/libvirt/storage/>目录中。默认情况下,默认pool存储池是在</var/lib/libvirt/images/>目录,如果需要改变,可以自定义存储池。存储池的类别:​

虚拟化云计算-KVM管理常用命令


存储卷

是虚拟机的硬盘文件,虚拟机的数据就保存在一个个的存储卷中。

命令行创建

存储池

#常用命令
virsh pool-define-as ## 创建一个pool存储池XML配置文件
virsh pool-build ## 构建一个pool存储池
virsh pool-start ## 激活一个pool存储池
virsh pool-autostart ## 自动启动一个pool存储池
virsh pool-destroy ## 取消激活一个pool存储池
virsh pool-delete ## 删除一个pool存储池对应的非空目录
virsh pool-undefine ## 删除一个pool存储池的XML配置文件
virsh pool-list ## 查看pool存储池列表
virsh pool-info ## 查看一个pool存储池的详情

# 创建pool池(dir文件系统目录类型)
mkdir -p /my_pool
yum install policycoreutils-python -y
semanage fcontext -a -t virt_image_t / my_pool
virsh pool-define-as my_pool dir --target /my_pool ## 创建一个pool存储池的XML配置文件(即:/etc/libvirt/storage/my_pool.xml配置文件)
virsh pool-build my_pool ## 构建一个pool存储池
virsh pool-start my_pool ## 激活一个pool存储池
virsh pool-autostart my_pool ## 自动激活一个pool存储池
systemctl restart libvirtd

## 查看pool池
virsh pool-list ## 查看pool存储池列表
virsh pool-info my_pool ## 查看一个pool存储池的详情
## 删除pool池
virsh pool-destroy my_pool ## 取消激活一个pool存储池
virsh pool-delete my_pool ## 删除一个pool存储池的目录(即:/my_pool/目录,目录必须是"空")
virsh pool-undefine my_pool ## 删除一个pool存储池的XML配置文件(即:/etc/libvirt/storage/my_pool.xml配置文件)
systemctl restart libvirtd


存储卷

# 常用命令
virsh vol-create-as ## 在指定的pool池中,创建一个vol存储卷
## virsh vol-create-as <pool池名称> <vol卷名称> <vol卷大小> --format <vol卷格式>
virsh vol-delete ## 在指定的pool池中,删除一个vol存储卷
## vrish vol-delete <vol卷名称> --pool <pool池名称>
virsh vol-list ## 针对指定的pool池,查看vol卷列表
## vrish vol-list <pool池名称>
virsh vol-info ## 针对指定的pool池,查看一个vol卷的详情
## virsh vol-info <vol卷名称> --pool <pool池名称>
qemu-img info ## 查看一个vol卷文件的详情
## qemu-img info < vol卷文件路径>
## 创建存储卷
virsh vol-create-as default my_disk01_vol 10GB --format qcow2
## 查看存储卷
virsh vol-list default
## 删除存储卷
virsh vol-delete my_disk01_vol --pool default
## 查看存储卷
virsh vol-list default
virsh vol-list default
名称 路径
------------------------------------------------------------------------------
my_disk01_vol /var/lib/libvirt/images/my_disk01_vol
virsh vol-info my_disk01_vol --pool default
名称: my_disk01_vol
类型: 文件
容量: 9.31 GiB
分配: 196.00 KiB
qemu-img info /var/lib/libvirt/images/my_disk01_vol
image: /var/lib/libvirt/images/my_disk01_vol
file format: qcow2
virtual size: 9.3G (10000000000 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 0.10

# 格式转化
qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/server01.disk01 /var/lib/libvirt/images/server01.disk01.qcow2

# 快照
方案一
创建快照
virsh snapshot-create-as 虚拟机名 快照名 #推荐
virsh snapshot-create-as server02 2045

快照配置文件在/var/lib/libvirt/qemu/snapshot/虚拟机名称/下

查看快照
virsh snapshot-list 虚拟机名 #查看虚拟机server02的所有快照
virsh snapshot-list server02

[root@localhost ~]# virsh snapshot-list server02
名称 生成时间 状态
------------------------------------------------------------
2045 2016-12-15 20:45:19 +0800 running
2055 2016-12-15 20:55:36 +0800 running

virsh snapshot-info server02 2045 #查看虚拟机server02的2045 快照的信息

[root@localhost ~]# virsh snapshot-info server02 2045
名称: 2045
域: server02
当前: 是
状态: running
位置: 内部
上级: -
下级: 1
降序: 1
元数据: 是

恢复快照
使用 virsh snapshot-revert 命令即可。但是在使用virsh snapshot-revert命令恢复虚拟机 server02 状态之前,我们必须要把虚拟机关闭。
可以使用virsh destroy命令进行强制性关机,我们也可以使用virsh shutdown命令进行关机。
注意要使用virsh shutdown命令进行关闭虚拟机的话,一定要安装acpid服务。如果虚拟机有快照的话,就无法使用virsh shutdown/reboot,命令进行关机或者重启。

确认虚拟机是关机状态
virsh domstate 虚拟机名
virsh domstate server02





virsh snapshot-revert 虚拟机名 快照名
virsh snapshot-revert server02 2045

删除快照
如果要删除一个快照,可以使用如下命令:
snapshot-delete server02 2045

[root@localhost ~]# virsh snapshot-list server02
名称 生成时间 状态
------------------------------------------------------------
2045 2016-12-15 20:45:19 +0800 running
2055 2016-12-15 20:55:36 +0800 running

[root@localhost ~]# virsh snapshot-delete server02 2045
已删除域快照 2045

[root@localhost ~]# virsh snapshot-list server02
名称 生成时间 状态
------------------------------------------------------------
2055 2016-12-15 20:55:36 +0800 running



方案二
qemu-img snapshot [-l | -a snapshot_name | -c snapshot_name | -d snapshot_name] vol_filename

-l 选项是查询并列出镜像文件中的所有快照
-a snapshot_name 是让镜像文件使用某个快照
-c snapshot_name 是创建一个快照
-d snapshot_name 是删除一个快照
qemu-img snapshot -c snapshot01 /var/lib/libvirt/images/server01.disk01
qemu-img snapshot -c snapshot02 /var/lib/libvirt/images/server01.disk01
qemu-img snapshot -l /var/lib/libvirt/images/server01.disk01
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 snapshot01 0 2016-11-06 15:01:31 00:00:00.000
2 snapshot02 0 2016-11-06 15:02:29 00:00:00.000
qemu-img snapshot -a snapshot01 /var/lib/libvirt/images/server01.disk01
qemu-img snapshot -d snapshot02 /var/lib/libvirt/images/server01.disk01


虚拟机管理

#开机关机重启
virsh list --all ## 查看所有的虚拟机
virsh start <server_name> ## 开启虚拟机
virsh reboot <server_name> ## 重启虚拟机(在虚拟机内部执行reboot命令)
virsh shutdown <server_name> ## 关闭虚拟机(在虚拟机内部执行shutdown命令)
virsh destroy <server_name> ## 强行关闭虚拟机
virsh undefine <server_name> --remove-all-storage ## 删除虚拟机,并同时删除所有关联的存储卷

#快照
virsh snapshot-create server01
virsh snapshot-create-as server01 --name "第一个快照"
virsh snapshot-list server01 ## 查看:server01虚拟机的snapshot快照的列表
名称 生成时间 状态
------------------------------------------------------------
1478352395 2016-11-05 21:26:35 +0800 running
第一个快照 2016-11-05 21:40:38 +0800 running
virsh snapshot-current server01 ## 查看:server01虚拟机的当前snapshot快照"1478352395"的XML文件内容
<domainsnapshot>
<name>1478352395</name>
<state>running</state>
<creationTime>1478352395</creationTime>

#切换快照
virsh snapshot-current server01 "第一个快照" ## 将"第一个快照"切换到current状态,已便用virsh snapshot-current查看其XML文件内容
已将快照 第一个快照 设定为 current
virsh snapshot-current server01 ## 查看:server01虚拟机的当前snapshot快照"第一个快照"的XML文件内容
<domainsnapshot>
<name>第一个快照</name>
<state>running</state>
<creationTime>1478353238</creationTime>

#恢复
virsh snapshot-revert server01 1478352395

#删除
virsh snapshot-delete server01 1478352395

克隆

## 关闭:源虚拟机
virsh list --all
Id 名称 状态
----------------------------------------------------
- server01 开启
virsh shutdown server01
## 克隆:源虚拟机server01,克隆生成server01-clone虚拟机,server01-clone虚拟机的磁盘文件是server01-clone.disk01
virt-clone --connect qemu:///system -o server01 -n server01-clone -f /var/lib/libvirt/images/server01-clone.disk01
正在分配 ' server01-clone.disk01' | 10 GB 00:00:52
成功克隆 ' server01-clone '
部分参数备注:
--connect qemu:///system 连接本地主机
--auto-clone 从原始虚拟机配置中自动生成克隆名称和存储路径。
--replace 同名替换
--nonsparse 不克隆稀疏文件
--check all=off 覆盖
## 排查XML配置文件中的冲突
grep "mac address" /etc/libvirt/qemu/server01*
/etc/libvirt/qemu/server01-clone.xml: <mac address='52:54:00:f1:00:ce'/>
/etc/libvirt/qemu/server01.xml: <mac address='52:54:00:d0:32:43'/>
grep "source file" /etc/libvirt/qemu/server01*
/etc/libvirt/qemu/server01-clone.xml: <source file='/var/lib/libvirt/images/server02.disk01'/>
/etc/libvirt/qemu/server01.xml: <source file='/var/lib/libvirt/images/server01.disk01'/>
grep "source mode" /etc/libvirt/qemu/server01*
/etc/libvirt/qemu/server01-clone.xml: <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-server01/org.qemu.guest_agent.0'/>
/etc/libvirt/qemu/server01.xml: <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-server01/org.qemu.guest_agent.0'/>
发现冲突:<source mode参数>中的<path路径>相同
virsh edit server01-clone
修改为:<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-server02/org.qemu.guest_agent.0'/>
virsh define server01-clone
## 开启并连接克隆的server01-clone虚拟机
virsh start server01-clone
virsh list --all
Id 名称 状态
----------------------------------------------------
- server01 关闭
- server01-clone running
virsh vol-list default
名称 路径
------------------------------------------------------------------------------
server01.disk01 /var/lib/libvirt/images/server01.disk01
server01-clone.disk01 /var/lib/libvirt/images/server01-clone.disk01

模板

(1)制作磁盘文件和XML模板
准备一个模板虚拟机server01
virsh shutdown server01
cp /var/lib/libvirt/images/server01.disk01 /var/lib/libvirt/images/server03.disk01
virsh dumpxml server01 >/etc/libvirt/qemu/server03.xml
(2)修改XML模板
vi /etc/libvirt/qemu/server03.xml
修改:虚拟机的名字 <name>server03</name>
删除:uuid,删除"<uuid>d9f9aadd-e147-42b8-9e62-52c73e9d4a7b</uuid>"
删除:网卡的mac地址,删除"<mac address='52:54:00:d0:32:43'/>"
修改:磁盘镜像存放路径
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
<source file='/var/lib/libvirt/images/server03.disk01'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
修改:channel通道路径
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-server03/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
其他:至于内存、cpu这些信息看自己的需求
(3)应用XML模板
virsh define /etc/libvirt/qemu/server03.xml
virsh start server03


设备管理

添加vcpu

virsh start server01
virsh dominfo server01
Id: 3
名称: server01
UUID: d9f9aadd-e147-42b8-9e62-52c73e9d4a7b
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 1.8s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c15,c828 (enforcing)
virsh setvcpus server01 2
virsh dominfo server01
Id: 3
名称: server01
UUID: d9f9aadd-e147-42b8-9e62-52c73e9d4a7b
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 23.8s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c15,c828 (enforcing)

添加内存

virsh start server01
virsh dominfo server01
Id: 3
名称: server01
UUID: d9f9aadd-e147-42b8-9e62-52c73e9d4a7b
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 23.8s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c15,c828 (enforcing)
virsh setmem server01 800MB
virsh reboot server01
virsh dominfo server01
Id: 3
名称: server01
UUID: d9f9aadd-e147-42b8-9e62-52c73e9d4a7b
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 27.2s
最大内存: 1048576 KiB
使用的内存: 781252 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c15,c828 (enforcing)

添加网卡

## 在线添加:网卡
virsh domiflist server01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:d0:32:43
virsh attach-interface server01 bridge br0
成功附加接口
virsh domiflist server01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:d0:32:43
vnet1 bridge br0 rtl8139 52:54:00:3d:0b:50
virsh attach-interface server01 bridge br0 --model virtio
成功附加接口
virsh domiflist server01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:d0:32:43
vnet1 bridge br0 rtl8139 52:54:00:3d:0b:50
vnet2 bridge br0 virtio 52:54:00:1c:f3:b4
## 在线分离:网卡
virsh domiflist server01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:d0:32:43
vnet1 bridge br0 rtl8139 52:54:00:3d:0b:50
vnet2 bridge br0 virtio 52:54:00:1c:f3:b4
virsh detach-interface server01 bridge 52:54:00:1c:f3:b4
成功分离接口
virsh detach-interface server01 bridge 52:54:00:3d:0b:50
成功分离接口
virsh domiflist server01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:d0:32:43


添加硬盘

## 在线添加:硬盘
virsh domblklist server01
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/server01.disk01
virsh domblkinfo server01 vda
容量: 10737418240
分配: 7488294400
物理: 1754787840
virsh vol-create-as default server01.disk02 5GB --format qcow2
创建卷 server01.disk02
virsh attach-disk server01 /var/lib/libvirt/images/server01.disk02 vdb
成功附加磁盘
virt-viewer server01
fdisk -l ---->可以看见添加的磁盘设备/dev/vdb
mkfs.ext4 /dev/vdb
mkdir /disk02
mount /dev/vdb /disk02
挂载成功!!!
virsh domblkinfo server01 vdb
容量: 197120
分配: 196096
物理: 200704
备注:
在XML文件中的,磁盘的定义内容如下:
<disk type='file' device='disk'> type=磁盘类型 device=设备类型
<driver name='qemu' type='qcow2'/> dirver name=驱动类型 type=磁盘格式
<source file='/var/lib/libvirt/images/server01.disk02'/> source file=源文件
<target dev='vdb' bus='virtio'/> target dev=目标设备 bus=总线类型
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
其他参数:
缓存模式 writeback
IO模式 threads
存储格式 qcow2
## 在线分离:硬盘
virsh domblklist server01
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/server01.disk01
vdb /var/lib/libvirt/images/server01.disk02
virsh detach-disk server01 vdb
成功分离磁盘
virsh domblklist server01
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/server01.disk01