
KVM运维常用命令
一、创建KVM
1.安装KVM客户机
1.第一个示例raw
//挂载系统光盘, 建立ISO镜像文件 [root@kvm-node1 ~]# dd if=/dev/cdrom of=/data/centos7u4_x86_64.iso //创建虚拟机磁盘 [root@kvm-node1 ~]# qemu-img create -f raw /opt/centos2.raw 10G //创建虚拟机实例 [root@Web_node01 ~]#virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole # vnc:10.0.0.11:5900 --virt-type kvm 虚拟化的类型(默认:qemu) --os-type=linux 系统类型 --os-variant rhel7 系统版本 --name centos7 虚拟机的名字 --memory 1024 虚拟机的内存 --vcpus 1 虚拟cpu的核数 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default 使用默认NAT的网络,常用bridge --graphics vnc,listen=0.0.0.0 指定虚拟机可连接方式, 比如VNC --noautoconsole 不连接虚拟机图形界面控制台 # raw:10G 不支持做快照,性能好 # qcow2: 支持快照2.第二个示例qcow2
//挂载系统光盘, 建立ISO镜像文件 [root@kvm-node1 ~]# dd if=/dev/cdrom of=/data/centos7u4_x86_64.iso //创建虚拟机磁盘 [root@kvm-node1 ~]# qemu-img create -f qcow2 /data/centos7u4-node1.qcow2 10G //创建虚拟机实例 virt-install --name centos7u4-node1 \ --virt-type kvm \ --ram 1024 \ --cdrom=/data/centos7u4_x86_64.iso \ --disk path=/data/centos7u4-node1.c \ --network bridge=br0 \ --graphics vnc,listen=0.0.0.0 \ --noautoconsole //参数概述 --virt-type:指定虚拟机类型(kvm、qemu、xen) --name:指定虚拟机名称 --raw:指定虚拟机使用内存大小 --cpu:指定cpu的核数(默认为1) --cdrom:指定虚拟机安装的ISO镜像 --disk:指定虚拟机数据存储磁盘qcow2 --network:指定虚拟机网络类型, 默认nat,常用bridge --graphics:指定虚拟机可连接方式, 比如VNC --noautoconsole:不连接虚拟机图形界面控制台 //自动化创建虚拟机,并配置pxe启动方式 virt-install --name centos_VM_70.163 \ --virt-type kvm \ --ram 1024 \ --pxe --disk size=10 \ --network bridge=br1 \ --graphics vnc,listen=0.0.0.0 \ --noautoconsole云主机没有 SWAP 分区的原因为性能太低,本身磁盘就是虚拟化出来的,所以直接不建立 SWAP 分区。
1.安装系统的时候直接建立在根分区上。
2.不启用内核奔溃备份,内存占用较多KVM 虚拟机的配置文件 xlm 所在目录
[root@kvm01 ~]# ls /etc/libvirt/qemu/ centos7.xml networks/写死 vnc 端口号
[root@kvm01 ~]# virsh edit centos7.4 自动获取:<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'> 写死:<graphics type='vnc' port='5902' autoport='no' listen='0.0.0.0'> 命令指定VNC端口: [root@kvm01 ~]# virt-install --help | grep gra --version show program's version number and exit --graphics GRAPHICS Configure guest display settings. Ex: --graphics vnc --graphics spice,port=5901,tlsport=5902 --graphics none --graphics vnc,password=foobar,port=5910,keymap=ja
二、virsh 命令
1.域管理的命令
获取当前节点上所有域的列表
virsh # list Id 名称 状态 ------------------------------ 2 DevEnvTemple running获取一个域的运行状态
virsh # domstate DevEnvTemple running获取一个域的基本信息
virsh # dominfo DevEnvTemple Id: 2 名称: DevEnvTemple UUID: fb8d2a27-40ea-49be-8307-3a908c6a502c OS 类型: hvm 状态: running CPU: 2 CPU 时间: 22.5s 最大内存: 4194304 KiB 使用的内存: 4194304 KiB 持久: 是 自动启动: 禁用 管理的保存: 否 安全性模式: none 安全性 DOI: 0根据域的名称或UUID返回域的ID值
virsh # domid fb8d2a27-40ea-49be-8307-3a908c6a502c 2 virsh # domid DevEnvTemple 2根据域的ID值或UUID返回域的名称
virsh # domname 2 DevEnvTemple virsh # domname fb8d2a27-40ea-49be-8307-3a908c6a502c DevEnvTemple获取一个域的内存使用情况的统计信息
virsh # dommemstat DevEnvTemple actual 4194304 swap_in 0 swap_out 0 major_fault 210 minor_fault 164024 unused 3827452 available 4045052 usable 3723328 last_update 1633517096 rss 1107568设置一个域的内存大小(默认的单位为KB)
# setmem <ID> <mem-size> virsh # dommemstat DevEnvTemple actual 4194304 swap_in 0 swap_out 0 major_fault 210 minor_fault 164024 unused 3827452 available 4045052 usable 3723328 last_update 1633517096 rss 1107568 virsh # setmem 2 1048576 virsh # dommemstat DevEnvTemple actual 1048576 swap_in 0 swap_out 0 major_fault 210 minor_fault 164024 unused 3827452 available 4045052 usable 3723328 last_update 1633517096 rss 1065684获取一个域的vCPU的基本信息
virsh # vcpuinfo DevEnvTemple VCPU: 0 CPU: 2 状态: running CPU 时间: 15.0s CPU关系: yyyyyyyy VCPU: 1 CPU: 6 状态: running CPU 时间: 8.3s CPU关系: yyyyyyyy将一个域的vCPU绑定到某个物理CPU上运行
vcpupin <ID> <vCPU> <pCPU>设置一个域vCPU的个数
setvcpus DevEnvTemple 1获取一个域的VNC连接IP地址和端口
virsh # vncdisplay DevEnvTemple根据域的XML配置文件创建一个域(客户机)
virsh # create test.xml定义一个域(但不启动)
virsh # define test.xml启动一个域
start <ID>暂停一个域
suspend <ID>唤醒一个域
resume <ID>关机一个域
shutdown <ID>重启一个域
reboot <ID>强制重启一个域
rset <ID>立即销毁一个域,相当于直接拔掉物理机的电源
destroy <ID>保存一个运行中的域的状态到一个文件中
virsh save --bypass-cache DevEnvTemple /tmp/DevEnvTemple.img –running # –running 下次恢复,直接启动 # --bypass-cache 保存将避免文件系统缓存从一个被保存的文件中恢复一个域的运行
virsh restore /tmp/DevEnvTemple.img --bypass-cache --running将一个域迁移到另一个目的地址
migrate <ID> <dest_url>coredump一个域保存到一个文件
dump <ID>以XML格式转存出一个域的信息到标准输出中
virsh # dumpxml DevEnvTemple <domain type='kvm' id='2'> <name>DevEnvTemple</name> <uuid>fb8d2a27-40ea-49be-8307-3a908c6a502c</uuid>xxxxxxxxxx dumpxmlvirsh # dumpxml DevEnvTemple <domain type='kvm' id='2'> <name>DevEnvTemple</name> <uuid>fb8d2a27-40ea-49be-8307-3a908c6a502c</uuid>向一个域添加XML文件中的设备(热插拔)
attach-device <ID> <device.xml>将XML文件中的设备从一个域中移除
detach-device <ID> <device.xml>连接到一个域的控制台
console <ID>
2.宿主机和Hypervisor的管理命令
显示libvirt和Hypervisor的版本信息
virsh # version 根据库编译:libvirt 7.8.0 使用库:libvirt 7.8.0 使用的 API: QEMU 7.8.0 运行管理程序: QEMU 6.1.0以XML格式打印宿主机系统的信息
virsh # sysinfo显示该节点的基本信息
virsh # nodeinfo CPU 型号: x86_64 CPU: 8 CPU 频率: 2100 MHz CPU socket: 1 每个 socket 的内核数: 4 每个内核的线程数: 2 NUMA 单元: 1 内存大小: 15286756 KiB显示当前连接的URI
virsh # uri qemu:///system显示当前节点的主机名
virsh # hostname opsxdev.localdomain显示该节点宿主机和客户机的架构和特性
virsh # capabilities <capabilities> <host> <uuid>1a4ac306-3691-4b40-befa-85fd609708d8</uuid> <cpu> <arch>x86_64</arch> <model>EPYC-IBPB</model> <vendor>AMD</vendor> <microcode version='135299330'/> <counter name='tsc' frequency='2096015000' scaling='yes'/> <topology sockets='1' dies='1' cores='4' threads='2'/>显示当前MUMA单元的可用空闲内存
virsh # freecell 总量: 786428 KiB显示该节点内存单元使用情况统计
virsh # nodememstats total : 15286756 KiB free : 796580 KiB buffers: 452920 KiB cached : 4751384 KiB连接到URI指示的Hypervisor
virsh # connect qemu:///system显示该节点的某个CPU使用情况的统计
virsh # nodecpustats 1 用户: 2339640000000 系统: 2504550000000 闲置: 74567680000000 iowait: 76990000000 virsh # nodecpustats 2 用户: 2949790000000 系统: 3068480000000 闲置: 73002500000000 iowait: 145090000000 virsh # nodecpustats 7 用户: 2152540000000 系统: 3156300000000 闲置: 74206810000000 iowait: 73940000000根据PID添加一个QEMU进程到libvirt中
qemu-attach <pid>向域的QEMU monitor中发送一个命令
qemu-monitor-command domain
3.网络管理命令
显示出物理机的网络接口列表
virsh # iface-list 名称 状态 MAC 地址 ------------------------------------ virbr0 活动 52:54:00:5f:58:4b wlan0 活动 d8:12:65:5e:98:63根据网络接口名称查询其对应的MAC地址
virsh # iface-mac virbr0 52:54:00:5f:58:4b根据MAC地址查询其对应的网络接口名称
virsh # iface-name 52:54:00:5f:58:4b virbr0编辑一个物理主机的网络接口的XML配置文件
virsh # iface-edit virbr0 <interface type='bridge' name='virbr0'> <mtu size='1500'/> <bridge stp='on' delay='199'> </bridge> </interface>以XML格式转存出一个网络接口的状态信息
virsh # iface-dumpxml virbr0 <interface type='bridge' name='virbr0'> <mtu size='1500'/> <bridge stp='on' delay='199'> </bridge> </interface>关闭宿主机上的物理网络接口
iface-destroy <if-name-or-uuid>列出libvirt管理的虚拟网络
virsh # net-list 名称 状态 自动开始 持久 ----------------------------------- default 活动 是 是根据名称查询一个虚拟网络的基本信息
virsh # net-info default 名称: default UUID: 2086994e-e1a8-4e20-a749-026a4f7923d7 活跃: 是 持久: 是 自动启动: 是 桥接: virbr0根据名称查询一个网络的UUID
virsh # net-uuid default 2086994e-e1a8-4e20-a749-026a4f7923d7根据UUID查询一个虚拟网络的名称
virsh # net-name 2086994e-e1a8-4e20-a749-026a4f7923d7 default根据一个网络XML配置文件创建一个虚拟网络
net-create <net.xml>编辑一个虚拟网络的XML配置文件
net-edit <net-name-or-uuid>转存一个虚拟网络的XML格式化的配置信息
net-dumpxml <net-name-or-uuid>销毁一个虚拟网络
net-destroy <net-name-or-uuid>
4.存储池和存储卷的管理命令
显示libvirt管理的存储池
virsh # pool-list 名称 状态 自动开始 --------------------------------------- default 活动 是 DevEnvCentos79 活动 是 mirrors 活动 是 os 活动 是 TestSpaceWindows7 活动 是 WorkSpaceWindows10 活动 是根据一个存储池名称查询其基本信息
virsh # pool-info mirrors 名称: mirrors UUID: 9499f3fe-e936-4751-b403-5e35bdbe50ec 状态: running 持久: 是 自动启动: 是 容量: 195.80 GiB 分配: 104.44 GiB 可用: 91.36 GiB根据存储池名称查询UUID
virsh # pool-uuid mirrors 9499f3fe-e936-4751-b403-5e35bdbe50ec根据XML配置文件的信息创建一个存储池
pool-create <pool.xml>编辑一个存储池的XML文件
virsh # pool-edit mirrors <pool type='dir'> <name>mirrors</name> <uuid>9499f3fe-e936-4751-b403-5e35bdbe50ec</uuid> <capacity unit='bytes'>210241560576</capacity> <allocation unit='bytes'>112145739776</allocation> <available unit='bytes'>98095820800</available> <source> </source> <target> <path>/apsarapangu/mirrors</path> <permissions> <mode>0755</mode> <owner>1000</owner> <group>1000</group> </permissions> </target> </pool>关闭一个存储池
pool-destroy <pool-name-or-uuid>删除一个存储池
pool-delete <pool-name-or-uuid>查询一个存储池中的存储卷的列表
virsh # vol-list mirrors 名称 路径 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- CentOS-7.5-x86_64-DVD-1804.iso /apsarapangu/mirrors/CentOS-7.5-x86_64-DVD-1804.iso CentOS-7.9-x86_64-DVD-2009.iso /apsarapangu/mirrors/CentOS-7.9-x86_64-DVD-2009.iso查询一个存储卷的名称
virsh # vol-name /apsarapangu/mirrors/CentOS-7.5-x86_64-DVD-1804.iso CentOS-7.5-x86_64-DVD-1804.iso查询一个存储卷的路径
virsh # vol-path --pool mirrors CentOS-7.5-x86_64-DVD-1804.iso /apsarapangu/mirrors/CentOS-7.5-x86_64-DVD-1804.iso根据XML配置文件创建一个存储池
vol-create <vol.xml>克隆一个存储卷
vol-clone <vol-name-path><name>删除一个存储卷
vol-delete <vol-name-or-key-or-path>
5.其他常用命令
打印当前工作目录
pwd改变当前工作目录
cd图形化查看器
$sudo virsh list Id 名称 状态 --------------------------- 1 DevEnvELK running $sudo virt-viewer DevEnvELK客户机运行状态和资源展示
$sudo virt-top查看客户机文件系统
virt-df 列出虚机文件系统的剩余空间 virt-df - Display free space on virtual filesystems -a:后接镜像 [root@kvm-host ]# virt-df -a centos56x64 Filesystem 1K-blocks Used Available Use% centos56x64:/dev/sda1 194442 12858 171545 7% centos56x64:/dev/vmvg/root 5872136 2155876 3413156 37% -d:后接domain,就是虚机名 [root@kvm-host ]# virt-df cacti Filesystem 1K-blocks Used Available Use% cacti:/dev/sda1 495844 52884 417360 11% cacti:/dev/VolGroup/lv_root 47033288 2281128 42362964 5% -h:以M,G显示分区大小,可读性较强 [root@kvm-host ]# virt-df -a centos56x64 -h Filesystem Size Used Available Use% centos56x64:/dev/sda1 190M 13M 168M 7% centos56x64:/dev/vmvg/root 5.6G 2.1G 3.3G 37% --csv:以表格的形式显示结果,这样可以导入数据库和电子表格里 [root@kvm-host ]# virt-df -a centos56x64 --csv VirtualMachine,Filesystem,1K-blocks,Used,Available,Use% centos56x64,/dev/sda1,194442,12858,171545,6.6 centos56x64,/dev/vmvg/root,5872136,2155876,3413156,36.7 -i:显示inode [root@kvm-host ]# virt-df -a centos56x64 -i Filesystem Inodes IUsed IFree IUse% centos56x64:/dev/sda1 50200 35 50165 1% centos56x64:/dev/vmvg/root 1516032 87962 1428070 6% -V:显示版本号 [root@kvm-host ]# virt-df -a centos56x64 -V virt-df 1.16.19rhel=6,release=1.el6 -x:显示trace信息 [root@kvm-host ]# virt-df -a centos56x64 -xvirt-filesystems列出在虚机或磁盘镜像里的文件系统、分区、块设备、LVM
-a:后接磁盘镜像 [root@kvm-host ]# virt-filesystems -a centos56x64 -l:输出额外的一些分区信息,包括分区的size,label,vfs,type [root@kvm-host ]# virt-filesystems -a centos56x64 -l Name Type VFS Label Size /dev/sda1 filesystem ext3 /boot 205599744 /dev/vmvg/root filesystem ext3 - 6207569920 -d:后面接的是libvirt的domain,就是虚机名 [root@kvm-host ]# virt-filesystems -d nagios -l Name Type VFS Label Size /dev/sda1 filesystem ext3 /boot 205599744 /dev/vmvg/root filesystem ext3 - 102844334080客户机文件复制和拷贝
virt-copy-out用于从客户机往外复制文件或目录 [root@kvm-host ]# virt-copy-out -d DevEnvELK /home/administrator/Documents/sl.sh /tmp virt-copy-in用于往虚拟机复制文件或目录 [root@kvm-host ]# virt-copy-out -d DevEnvELK /etc/passwd /tmp对于windows镜像进行操作需要安装libguestfs-winsupport软件包
查看windows中系统盘C盘目录
virt-ls -d win2012 /查看windows中系统盘文件内容
virt-cat -d win
三、查看宿主机所有虚拟机配置脚本
查看虚拟机磁盘
查看磁盘路径 virsh domblklist
查看磁盘信息 qemu-img info 磁盘路径#!/bin/bash node_name=`virsh hostname` node_ip=$(ifconfig br1|grep 'inet'|grep -v 'inet6'|awk '{print $2}'|tr -d ' ') node_info=`virsh nodeinfo` all_host=`virsh list --all | egrep 'running|off' | awk '{print $2}'` running_host=`virsh list --all | grep 'running' | awk '{print $2}'` running_cpu=0 running_memory=0 all_vm_cpu=0 all_vm_memory=0 echo "=== All vms info ===" for i in $all_host do current_cpu=`virsh dominfo $i | grep 'CPU(s)' | awk '{print $2}'` ((all_vm_cpu=$all_vm_cpu + $current_cpu)) current_memory=`virsh dominfo $i | grep 'Used memory' | awk '{print $3}'` ((current_memory_gb=($current_memory) / 1048576 )) ((all_vm_memory=$all_vm_memory + $current_memory)) echo "$i : ${current_cpu}c${current_memory_gb}g" done #host cpu mem host_cpu=`virsh nodeinfo | grep 'CPU(s)' | awk '{print $2}'` host_memory=`virsh nodeinfo | grep 'Memory size' | awk '{print $3}'` ((reserve_cpu=($host_cpu - $all_vm_cpu) )) ((host_memory_gb=($host_memory) / 1048576 )) ((all_vm_memory_gb=($all_vm_memory) / 1048576 )) ((reserve_memory=($host_memory - $all_vm_memory) / 1048576 )) echo "" echo "=== The Node info ===" echo "node_name: $node_name, $node_ip" echo "vcpus: ${host_cpu}, vcpus_used: ${all_vm_cpu}, vcpus_reserved: ${reserve_cpu}" #echo "vcpus_used: ${all_vm_cpu}" #echo "vcpus_reserved: ${reserve_cpu}" echo "memory: ${host_memory_gb} GiB, memory_used: ${all_vm_memory_gb} GiB, memory_free: ${reserve_memory} GiB" #echo "memory_used: ${all_vm_memory_gb} Gb" #echo "memory_free: ${reserve_memory} Gb"1
1