对KVM虚拟机的基本管理
管理kvm虚拟机有两种方法:一、图形化管理工具virt-manager,二、命令行工具virsh命令。这两种方法都是通过调用libvirt API来实现虚拟化管理。
使用virsh对KVM虚拟机的基本管理
1、查看虚拟机
virsh list显示运行的虚拟机。
[root@localhost images]# clear
[root@localhost images]# virsh list
Id Name State
----------------------------------------------------
7 rhel7-vm01 running
要查看所有虚拟机就要加参数 --all
[root@localhost images]# virsh list --all
Id Name State
----------------------------------------------------
7 rhel7-vm01 running
2、关闭虚拟机
virsh shutdown 虚拟机名称
[root@localhost images]# virsh shutdown rhel7-vm01
Domain rhel7-vm01 is being shutdown
3、启动虚拟机
virsh start 虚拟机名称
[root@localhost images]# virsh start rhel7-vm01
Domain rhel7-vm01 started
4、关闭虚拟机电源
virsh destroy 虚拟机名称,该命令是直接拔掉虚拟机电源进行关闭虚拟机。
5、挂起(暂停)虚拟机
virsh suspend 虚拟机名称
[root@localhost images]# virsh start rhel7-vm01
Domain rhel7-vm01 started
6、恢复虚拟机
virsh resume 虚拟机名称
[root@localhost images]# virsh resume rhel7-vm01
Domain rhel7-vm01 resumed
7、设置自动启动虚拟机
virsh autostart 虚拟机名称
[root@localhost images]# virsh autostart rhel7-vm01
Domain rhel7-vm01 marked as autostarted
8、禁止自启动虚拟机
virsh autostart 虚拟机 --disable
[root@localhost images]# virsh autostart rhel7-vm01 --disable
Domain rhel7-vm01 unmarked as autostarted
9、查看虚拟机信息
virsh dominfo 虚拟机名称
[root@localhost images]# virsh dominfo rhel7-vm01
Id: 8
Name: rhel7-vm01
UUID: c38aaa91-70ff-4a12-a77c-1cd482948f2e
OS Type: hvm
State: running
CPU(s): 1
CPU time: 51.7s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: enable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c26,c812 (permissive)
10、删除虚拟机
virsh undefine 虚拟机名称
此时虚拟机是在虚拟机管理器里面找不到了。
11、删除虚拟机,并删除磁盘镜像文件
virsh undefine 虚拟机名称 --storage /var/lib/libvirt/images/虚拟机名称.qcow2
此时虚拟机是在虚拟机管理器里面找不到了,同时虚拟的磁盘镜像文件一并删除。
12、删除虚拟机,并删除所有磁盘文件。
virsh undefine 虚拟机名称 --remove-all-storage
13、显示虚拟机当前的配置文件。
virsh dumpxml 虚拟机名称
[root@localhost ~]# virsh dumpxml rhel7-vm01
<domain type='kvm' id='1'>
<name>rhel7-vm01</name>
<uuid>c38aaa91-70ff-4a12-a77c-1cd482948f2e</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<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-noTSX</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'/>
<source file='/var/lib/libvirt/images/rhel7-vm01.qcow2'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<alias name='usb'/>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<alias name='usb'/>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<alias name='usb'/>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='virtio-serial' index='0'>
<alias name='virtio-serial0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<interface type='network'>
<mac address='52:54:00:b2:de:c1'/>
<source network='default' bridge='virbr0'/>
<target dev='vnet0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/1'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/1'>
<source path='/dev/pts/1'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-1-rhel7-vm01/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='disconnected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
<alias name='channel1'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<alias name='input0'/>
<address type='usb' bus='0' port='1'/>
</input>
<input type='keyboard' bus='usb'>
<alias name='input1'/>
<address type='usb' bus='0' port='2'/>
</input>
<input type='mouse' bus='ps2'>
<alias name='input2'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input3'/>
</input>
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<sound model='ich6'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir0'/>
<address type='usb' bus='0' port='3'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir1'/>
<address type='usb' bus='0' port='4'/>
</redirdev>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='selinux' relabel='yes'>
<label>system_u:system_r:svirt_t:s0:c541,c677</label>
<imagelabel>system_u:object_r:svirt_image_t:s0:c541,c677</imagelabel>
</seclabel>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+107:+107</label>
<imagelabel>+107:+107</imagelabel>
</seclabel>
</domain>
对虚拟机进行进阶管理
1、添加网卡
当前虚拟机中默认只有一块网卡。
在宿主机中通过命令也可以查看到网卡信息。
virsh domiflist 虚拟机名称
[root@localhost ~]# virsh domiflist rhel7-vm01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:b2:de:c1
使用virsh命令添加网卡
virsh attach-interface 虚拟机 network default --persistent
其中attach-interface添加接口,network代表网络类型,default代表网络默认NAT方式,–persistent选项代表永久的意思,即重启虚拟机后网卡依旧生效。
[root@localhost ~]# virsh attach-interface rhel7-vm01 network default --persistent
Interface attached successfully
[root@localhost ~]# virsh domiflist rhel7-vm01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:b2:de:c1
vnet1 network default rtl8139 52:54:00:c1:40:d2
如果要删除网卡,使用下面命令
[root@localhost ~]# virsh detach-interface rhel7-vm01 --type network --mac 52:54:00:c1:40:d2Interface detached successfully
[root@localhost ~]# virsh domiflist rhel7-vm01
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:b2:de:c1
此处只是添加网卡,但该网卡并不会绑定具体ip地址。
2、添加磁盘
在宿主机上查看虚拟机磁盘信息。
virsh domblklist 虚拟机
[root@localhost ~]# virsh domblklist rhel7-vm01
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/rhel7-vm01.qcow2
此时虚拟机只有一个磁盘vda,磁盘对应文件是rhel7-vm01.qcow2。
在宿主机上通过dd命令生成一个大小为100M的磁盘文件。
[root@localhost ~]# dd if=/dev/zero of=/var/lib/libvirt/images/rhel7-vm01_1.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 2.41723 s, 43.4 MB/s
dd命令用于从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
if为输入文件名,/dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符。其中的一个常见用法是产生一个特定大小的空白文件。
of为输出文件名。
bs代表同时设置读入/读出的块大小为多少个字节。
count代表拷贝多少个块,每个块大小由bs指定了字节数。
使用virsh attach-disk命令将新生成的磁盘加到虚拟机中,作为虚拟机的vdb。
[root@localhost ~]# virsh attach-disk rhel7-vm01 /var/lib/libvirt/images/rhel7-vm01_1.img vdb
Disk attached successfully
[root@localhost ~]# virsh domblklist rhel7-vm01
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/rhel7-vm01.qcow2
vdb /var/lib/libvirt/images/rhel7-vm01_1.img
在虚拟机中也可以通过命令lsblk查看新的磁盘。
修改CPU与内存
1、修改配置文件调整CPU和内存大小。
在虚拟机中查看当前CPU和内存大小
通过命令virsh edit 虚拟机名称来修改虚拟机的配置文件。
如把CPU改为2个,这个大小是不能超过宿主机的。
[root@localhost ~]# virsh edit rhel7-vm01
<domain type='kvm'>
<name>rhel7-vm01</name>
<uuid>c38aaa91-70ff-4a12-a77c-1cd482948f2e</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>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-noTSX</model>
<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'/>
<source file='/var/lib/libvirt/images/rhel7-vm01.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<interface type='network'>
<mac address='52:54:00:b2:de:c1'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:c1:40:d2'/>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:21:31:0d'/>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='keyboard' bus='usb'>
<address type='usb' bus='0' port='2'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' keymap='en-us'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='3'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='4'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
</domain>
Domain rhel7-vm01 XML configuration edited.
修改保存好后,要将虚拟机关闭,再启动才会生效,直接重启是不会生效的。
[root@localhost ~]# virsh shutdown rhel7-vm01
Domain rhel7-vm01 is being shutdown
[root@localhost ~]# virsh start rhel7-vm01
Domain rhel7-vm01 started
进入虚拟机,查看CPU信息,修改成功!
2、通过图形的方式调整CPU和内存的大小
打开虚拟机图形界面的详情页面。
提示调整配置时,需要在虚拟机关闭的状态下进行。
3、通过命令的方式调整CPU和内存大小
首先关闭虚拟机,然后通过virsh setvcpus命令修改配置文件。
[root@localhost ~]# virsh dominfo rhel7-vm01
Id: 2
Name: rhel7-vm01
UUID: c38aaa91-70ff-4a12-a77c-1cd482948f2e
OS Type: hvm
State: running
CPU(s): 2
CPU time: 67.5s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c514,c640 (permissive)
[root@localhost ~]# virsh shutdown rhel7-vm01
Domain rhel7-vm01 is being shutdown
[root@localhost ~]# virsh setvcpus rhel7-vm01 1 --maximum --config
[root@localhost ~]# virsh dominfo rhel7-vm01
Id: -
Name: rhel7-vm01
UUID: c38aaa91-70ff-4a12-a77c-1cd482948f2e
OS Type: hvm
State: shut off
CPU(s): 1
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
[root@localhost ~]# virsh start rhel7-vm01
Domain rhel7-vm01 started
[root@localhost ~]# virsh dominfo rhel7-vm01
Id: 3
Name: rhel7-vm01
UUID: c38aaa91-70ff-4a12-a77c-1cd482948f2e
OS Type: hvm
State: running
CPU(s): 1
CPU time: 4.8s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c612,c991 (permissive)
在线调整CPU个数时,CPU个数比当前虚拟机个数多时,可以不用重启即可生效,但不能超过最大CPU个数。
[root@localhost ~]# virsh setvcpus rhel7-vm01 2 --live
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 2 > 1
使用virsh setmaxmen修改配置文件中的内存,当然还是要重启之后才会生效。
[root@localhost ~]# virsh setmaxmem rhel7-vm01 4096M --config
[root@localhost ~]# virsh dominfo rhel7-vm01
Id: 3
Name: rhel7-vm01
UUID: c38aaa91-70ff-4a12-a77c-1cd482948f2e
OS Type: hvm
State: running
CPU(s): 1
CPU time: 53.6s
Max memory: 1048576 KiB
Used memory: 1048576 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c612,c991 (permissive)
使用virsh setmem命令调整当前内存大小。调整当前内存大小需要注意不能调整到比最大内存更大,只能调小。
[root@localhost ~]# virsh setmem rhel7-vm01 2048M --current
error: invalid argument: cannot set memory higher than max memory
[root@localhost ~]# virsh setmem rhel7-vm01 1024M --current
[root@localhost ~]#