KVM虚拟机管理

虚拟机的基本管理命令

  • 列出在运行状态中的虚拟机

    [root@kvm-server ~]# virsh list
     Id    名称                         状态
    ----------------------------------------------------
    
    
  • 列出所有的虚拟机

    [root@kvm-server ~]# virsh list --all
     Id    名称                         状态
    ----------------------------------------------------
     -     vm1                            关闭
    
  • 查看kvm虚拟机配置文件

    virsh dumpxml vm_name
    
  • 启动kvm虚拟机

    [root@kvm-server ~]# virsh start vm1
    域 vm1 已开始
    
  • 暂停kvm虚拟机

    [root@kvm-server ~]# virsh suspend vm1
    域 vm1 被挂起
    
  • 恢复kvm虚拟机

    [root@kvm-server ~]# virsh resume vm1
    域 vm1 被重新恢复
    
  • 关闭kvm虚拟机

    [root@kvm-server ~]# virsh shutdown vm1
    域 vm1 被关闭
    
  • 重启kvm虚拟机

    [root@kvm-server ~]# virsh reboot vm1
    域 vm1 正在被重新启动
    
  • 重置kvm虚拟机

    [root@kvm-server ~]# virsh reset vm1  #断电重启。速度快
    Domain vm1 was reset
    
  • 删除kvm虚拟机

    [root@kvm-server ~]# virsh undefine vm1
    Domain vm1 has been undefined
    
    • 注意

      虚拟机在开启的情况下undefine是无法删除的只是将配置文件删除了,不能删除磁盘文件。需要手动rm
      
  • kvm虚拟机开机自动启动

    如果虚拟机开机自启,里面的服务应该设置的有开机自启,不然没有意义

    [root@kvm-server ~]# virsh autostart vm1
    域 vm1 标记为自动开始
    
  • 查看kvm虚拟机开机自启

    此目录默认不存在,在有开机启动的虚拟机时自动创建

    [root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/   
    vm1.xml
    
  • 关闭开机自启kvm虚拟机

    [root@kvm-server ~]# virsh autostart --disable vm1
    域 vm1取消标记为自动开始
    
    • 此时查看开机自启目录

      [root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/   
      [root@kvm-server ~]# 
      
  • 查看已启动的kvm虚拟机的IP地址

    • 前提是vm1虚拟机已启动
    [root@kvm-server ~]# virsh domifaddr vm1
     名称     MAC 地址           Protocol     Address
    -------------------------------------------------------------------------------
     vnet0      52:54:00:82:d6:3c    ipv4         192.168.122.85/24
    
    • 注意

      如果VMware创建时用的是桥接,那么kvm虚拟机可能不显示IP
      解决方法:
      		把VMware改为NAT模式,然后重启,就可以了
      

虚拟机添加设备

1.图形方式

首先,关闭要添加硬件的虚拟机
双击虚拟机,在打开的对话框点击上方的View,点击Details,点击Add Hardware可以选择要添加的虚拟硬件

KVM003.png

KVM004.png

KVM005.png

按需求选择就可以

2.修改配置文件方式

我们给虚拟机vm3添加磁盘为例:

  1. 首先需要创建出要添加的磁盘

    [root@kvm-server ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm4-1.qcow2 5G
    
    • 注意

      创建空的磁盘文件:这里我们创建一个5G的磁盘,不过创建出来,通过ll -h查看大小,看不出它是5G,添加上之后才能看到
      
  2. 修改配置文件

    [root@kvm-server ~]# cd /etc/libvirt/qemu/
    [root@kvm-server qemu]# vim vm3.xml
    

    KVM006.png

  3. 启动虚拟机

    [root@kvm-server qemu]# systemctl restart libvirtd
    [root@kvm-server qemu]# virsh list --all
     Id    名称                         状态
    ----------------------------------------------------
     6     vm1                      	running
     -     vm3                          关闭
    [root@kvm-server qemu]# virsh start vm3
    

    KVM007.png

    可以看到我们新添加的磁盘vdb
    #然后可以正常分区,制作文件系统,进行挂载
    

虚拟机克隆

1.图形界面

  • 步骤

    图形界面:Applications (左上角)-----> System Tools ------>Virtual Machine Manager
       关闭要克隆的虚拟机,右键点击虚拟机选择Clone
    

    KVM008.png

2.终端执行命令克隆

[root@kvm-server ~]# virt-clone -o vm2 --auto-clone
正在分配 'vm2-clone.qcow2'                              | 5.0 GB  00:00     
成功克隆 'vm2-clone'。
-o       origin-原始
    
[root@kvm-server ~]# virt-clone -o vm2 -n vm5 --auto-clone
正在分配 'vm5.qcow2'                                    | 5.0 GB  00:00     
成功克隆 'vm5'。
-n :指定新客户机的名字
        
[root@kvm-server ~]# virt-clone -o vm2 -n vm6 -f /var/lib/libvirt/images/vm6.img 
正在分配 'vm6.img'                                      | 5.0 GB  00:00     
成功克隆 'vm6'。
-f ,--file NEW_DISKFILE:为新客户机使用新的磁盘镜像文件

这条命令在克隆的同时,可以指定镜像文件的位置和名称。

[root@kvm-server ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm2                            关闭
 -     vm2-clone                      关闭
 -     vm3                            关闭
 -     vm5                            关闭
 -     vm6                            关闭

KVM高级命令

建立虚拟机磁盘镜像文件

磁盘镜像文件格式

  1. qed

    已经不用了,这里不做过多讲解
    
  2. raw

    原始格式,性能最好 直接占用你一开始给多少空间 系统就占多少空间 不支持快照
    
  3. qcow

    先去网上了解一下cow(写时拷贝copy on write) ,性能远不能和raw相比,所以很快夭折了,所以出现了qcow2(性能低下 早就被抛弃)
    
  4. qcow2

    性能上还是不如raw,但是raw不支持快照,qcow2支持快照。
    

写时拷贝

  • raw立刻分配空间,不管你有没有用到那么多空间
  • qcow2只是承诺给你分配空间,但是只有当你需要用空间的时候,才会给你空间。最多只给你承诺空间的大小,避免空间浪费

1.建立qcow2格式磁盘文件

[root@kvm-server images]# qemu-img create -f qcow2 test.img 5G
Formatting 'test.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

2.建立raw格式磁盘文件

[root@kvm-server images]# qemu-img create -f raw test.raw 5G
Formatting 'test.raw', fmt=raw size=5368709120 

查看已经创建的虚拟机磁盘文件

[root@kvm-server images]# qemu-img info test.img 
[root@kvm-server images]# qemu-img info test.raw 

挂载磁盘

  • 为什么需要挂载磁盘

    当kvm虚拟机不能正常打开时,里面的内容又比较重要
    所以我们需要把磁盘挂载出来
    把重要文件拷贝一份
    
  • 这么做必须有一个前提

  • 文件系统没有坏掉

这里以vm2虚拟机为例

查看vm2的磁盘镜像分区信息:

[root@kvm-server images]# virt-df -h -d vm2
文件系统                                  大小      已用空间    可用空间     使用百分比%
vm2:/dev/sda1                            1014M        92M       922M         10%
vm2:/dev/centos/root                      3.5G       863M       2.6G         25%

1.创建一个挂载目录

[root@kvm-server images]# mkdir /test

2.挂载虚拟机的根分区到test目录

[root@kvm-server images]# guestmount -d vm2 -m /dev/centos/root --rw /test/
[root@kvm-server images]# cd /test/
[root@kvm-server test]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@kvm-server test]# cat etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

取消挂载

[root@kvm-server ~]# guestunmount /test

KVM存储配置

存储池

  • 概念

    kvm必须要配置一个目录当作存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池
    
  • kvm默认存储池的位置

    /var/lib/libvirt/images/
    

这里只介绍命令方式

  1. 创建基于文件夹的存储池(目录,可自定义)

    [root@kvm-server ~]# mkdir -p /data/vmfs
    
  2. 定义存储池与其目录

    [root@kvm-server ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs
    Pool vmdisk defined
    

    解释:vmdisk是新建的存储池的名称。可自定义

  3. 创建已定义的存储池

    • 创建已定义的存储池

      [root@kvm-server ~]# virsh pool-build vmdisk
      Pool vmdisk built
      
    • 查看已定义的存储池,存储池不激活无法使用

      [root@kvm-server ~]# virsh pool-list --all
      Name                 State      Autostart 
      -------------------------------------------
       default              active     yes       
       ISO                 active     yes       
       vmdisk               inactive   no     
      
  4. 激活并自动启动已定义的存储池

    [root@kvm-server ~]# virsh pool-start vmdisk	#启动
    Pool vmdisk started
    [root@kvm-server ~]# virsh pool-autostart vmdisk	#开机自启
    Pool vmdisk marked as autostarted
    
    [root@kvm-server ~]# virsh pool-list --all
     Name                 State      Autostart 
    -------------------------------------------
     default              active     yes       
     ISO                 active     yes       
     vmdisk               active     yes   
    

    这里vmdisk存储池就已经创建好了,可以直接在这个存储池中创建虚拟磁盘文件了

  5. 在存储池中创建虚拟机存储卷

    [root@kvm-server ~]# virsh vol-create-as vmdisk vm99.qcow2 2G --format qcow2
    Vol vm99.qcow2 created
    

    查看

    [root@kvm-server ~]# ll /data/vmfs/ -h
    总用量 196K
    -rw------- 1 root root 193K 10月 25 16:04 vm99.qcow2
    
  6. 存储池相关管理命令

    • 在存储池中删除虚拟机存储卷

      [root@kvm-server ~]# virsh vol-delete --pool vmdisk vm99.qcow2
      Vol vm99.qcow2 deleted
      
    • 取消激活存储池

      [root@kvm-server ~]# virsh pool-destroy vmdisk
      Pool vmdisk destroyed
      
    • 删除存储池定义的目录/data/vmfs

      [root@kvm-server ~]# virsh pool-delete vmdisk
      Pool vmdisk deleted
      
    • 取消定义存储池

      [root@kvm-server ~]# virsh pool-undefine vmdisk
      Pool vmdisk has been undefined
      

到此kvm存储池配置与管理操作完毕

KVM快照

为虚拟机vm2创建一个快照(磁盘格式必须为qcow2)
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2.snap1


注意:如果在创建快照的时候报错:
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

raw不支持snapshot
查看磁盘文件格式
[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2.qcow2
image: /var/lib/libvirt/images/vm2.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 5.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

[root@kvm-server ~]# virsh snapshot-list  vm2   #查看某台虚拟机设备的快照
 Name                 Creation Time             State
------------------------------------------------------------

创建一块磁盘
[root@kvm-server ~]# qemu-img create -f raw /var/lib/libvirt/images/vm2-1.raw 2G
Formatting '/var/lib/libvirt/images/vm2-1.raw', fmt=raw size=2147483648 

[root@kvm-server ~]# ll -h /var/lib/libvirt/images/vm2-1.raw
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 /var/lib/libvirt/images/vm2-1.raw

将其添加到vm2虚拟机上面
[root@kvm-server ~]# cd /etc/libvirt/qemu/
[root@kvm-server qemu]# vim vm2.xml

KVM009.png

[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml
[root@kvm-server images]# virsh start vm2
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap1
错误:不支持的配置:存储类型 vdb 不支持磁盘 raw 的内部快照



#磁盘格式的转换
由于raw的磁盘格式,不支持快照功能,我们需要将其转换为qcow2的格式
[root@kvm-server qemu]# qemu-img convert -O qcow2 /var/lib/libvirt/images/vm2-1.raw  /var/lib/libvirt/images/vm2-1.qcow2

[root@kvm-server qemu]# cd /var/lib/libvirt/images/
[root@kvm-server images]# ll -h 
总用量 21G
-rw------- 1 root root 5.1G 10月 24 18:59 centos7.0.qcow2
-rw-r--r-- 1 root root 193K 10月 25 16:44 vm2-1.qcow2
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 vm2-1.raw
-rw------- 1 root root 5.1G 10月 25 16:13 vm2.qcow2


[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2-1.qcow2
image: /var/lib/libvirt/images/vm2-1.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false


然后去修改vm2虚拟机的磁盘格式和名称
[root@kvm-server images]# vim /etc/libvirt/qemu/vm2.xml

KVM010.png

[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml

创建快照
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap2
已生成域快照 vm2.snap2

KVM011.png

然后我们开始做快照,图形化方式不再介绍

登录vm2的虚拟机:
[root@vm2 ~]# mkdir /opt/test

[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap3
已生成域快照 vm2-snap3

再次登录vm2的虚拟:
[root@vm2 ~]# rm -rf /opt/test/

[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap4
已生成域快照 vm2-snap4

查看快照
[root@kvm-server ~]# virsh snapshot-list vm2 
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

然后将vm2关闭,恢复到快照vm2.snap3
[root@kvm-server ~]# virsh snapshot-revert vm2 vm2-snap3
[root@kvm-server ~]# virsh start vm2
Domain vm2 started

在vm2虚拟机上查看
[root@vm2 ~]# ls /opt/
test
可以再恢复到vm2.snap4测试一下

删除虚拟机快照操作:
[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-list vm2
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

[root@kvm-server ~]# virsh snapshot-delete --snapshotname vm2-snap3 vm2
已删除域快照 vm2-snap3

[root@kvm-server ~]# virsh snapshot-list vm2
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap4            2019-10-30 15:27:15 +0800 running