命令记不住

登陆

KVM 运维常用命令

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 -x

virt-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

推荐阅读