kvm系列之二:kvm日常管理

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-31 18:04:09

日常管理概述

接着上一篇,这篇博客主要描述kvm日常管理中使用的一些方法和命令。

kvm的管理主要有以下几个方面:

  • kvm状态和配置管理:包括kvm虚拟机的开启、关闭、挂起、恢复,配置文件的导出导入和编辑,还有虚拟机重命名等
  • 磁盘管理:包括虚拟机磁盘的创建、信息查看、格式转换、容量更改以及格式化、挂载使用
  • kvm的console连接
  • kvm开机自启动
  • kvm快照和克隆
  • 另外,网络模式更改和热添加技术在下一篇描述

kvm状态管理

开启、关闭和查看

  • 状态查看
[root@kvm1 opt]# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     Centos7                        running

[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     Centos7                        running

参数说明:加上--all参数可以显示所有虚拟机,如果不加,就不能显示处于关闭状态的虚拟机了。这个在下面关闭虚拟机的例子中演示

  • 关闭
[root@kvm1 opt]# virsh shutdown Centos7 
Domain Centos7 is being shutdown

[root@kvm1 opt]# virsh list
 Id    Name                           State
----------------------------------------------------

[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     Centos7                        shut off##还有一种方法,是强制关闭,效果如同拔电源[root@timmy ~]# virsh destroy Centos7 
  • 开启
[root@kvm1 opt]# virsh start Centos7 
Domain Centos7 started

[root@kvm1 opt]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     Centos7                        running
  • 挂起
[root@kvm1 opt]# virsh suspend Centos7 
Domain Centos7 suspended

[root@kvm1 opt]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     Centos7                        paused
  • 恢复
[root@kvm1 opt]# virsh resume Centos7 
Domain Centos7 resumed

[root@kvm1 opt]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     Centos7                        running
  • 重启

[root@kvm1 opt]# virsh reboot Centos7 

 

kvm配置导出、导入

首先,一个kvm虚拟机其实只包含了两个文件,一个是磁盘文件,另一个就是配置文件,只要有这两个文件,就可以把虚拟机迁移到别的宿主机上。

在本文所用环境中,磁盘文件是构建kvm时生成的,路径也是那时指定的,就在/opt目录下,那么磁盘文件的路径呢?

[root@kvm1 opt]# ll /opt/*.raw
-rw------- 1 qemu qemu 10737418240 Feb  3 10:43 /opt/centos2.raw
[root@kvm1 opt]# ll /etc/libvirt/qemu/*.xml
-rw------- 1 root root 4075 Feb  3 09:50 /etc/libvirt/qemu/Centos7.xml

如上就是磁盘文件和配置文件存放的路径。需要说明的是,配置的导入导出不是简单copy文件,而必须使用相应命令。

  • 配置文件导出
[root@kvm1 opt]# virsh dumpxml Centos7 >Centos7.xml##当前目录会生成导出的xml配置文件
[root@kvm1 opt]# ls
centos2.raw  CentOS-7-x86_64-Minimal-1804.iso  Centos7.xml  rh
  • 配置文件导入
###首先要关闭、删除虚拟机
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 3     Centos7                        running

[root@kvm1 opt]# virsh destroy Centos7 
Domain Centos7 destroyed

##删除虚拟机
[root@kvm1 opt]# virsh undefine Centos7 
Domain Centos7 has been undefined

##查看虚拟机状态,确认配置文件和虚拟机都已经被删除
[root@kvm1 opt]# ls /etc/libvirt/qemu/
networks
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------

##导入配置文件,开启虚拟机
[root@kvm1 opt]# virsh define Centos7.xml 
Domain Centos7 defined from Centos7.xml
##查看虚拟机状态,确认虚拟机和配置文件都存在
[root@kvm1 opt]# virsh define Centos7.xml 
Domain Centos7 defined from Centos7.xml

[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     Centos7                        shut off

[root@kvm1 opt]# ls /etc/libvirt/qemu/    
Centos7.xml  networks
kvm虚拟机配置导入

当然,最好开启虚拟机并确认运行状态,这里就不贴了

  • 编辑配置文件

这个我们通过一种模拟场景来说明:

如果我们修改了磁盘文件的名称,这时启动虚拟机就会发生错误。这时当然可以通过把磁盘名字改回去,但这就是要吵架的节奏了,能这么干我还要拿这个场景来做什么啊?

那既然问题是因为磁盘真实名称和配置文件名称不一样造成的,那就修改配置文件呗。

配置文件可以使用vim直接修改,也可以使用专业的修改命令,后者包含了语法检查,所以我们使用后者。

这个场景的整体模拟如下:

###修改磁盘名称,然后启动kvm报错(找不到磁盘文件)
[root@kvm1 opt]# mv centos2.raw centos.raw  
[root@kvm1 opt]# virsh start Centos7 
error: Failed to start domain Centos7
error: Cannot access storage file '/opt/centos2.raw': No such file or directory

###修改配置文件,可以和vim一样使用/disk或者/device定位到下面区域
[root@kvm1 opt]# virsh edit Centos7 
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/opt/centos.raw'/>   ###这里修改磁盘名字
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

###修改后就可以正常启动kvm了
[root@kvm1 opt]# virsh start Centos7 
Domain Centos7 started
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 5     Centos7                        running
View Code
  • 虚拟机重命名

这里有两点要说明:一、需要关闭虚拟机后操作;二、早期版本可能不支持重命名,但可以通过修改配置文件来实现

##开机状态下修改会报错(无法重命名开机状态的虚拟机)
[root@kvm1 opt]# virsh domrename Centos7 web01
error: Requested operation is not valid: cannot rename active domain

##关机后可以正常重命名
[root@kvm1 opt]# virsh destroy Centos7 
Domain Centos7 destroyed

[root@kvm1 opt]# virsh domrename Centos7 web01
Domain successfully renamed

##确认状态,虚拟机和配置文件都被重命名了
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     web01                          shut off
[root@kvm1 opt]# ls /etc/libvirt/qemu
networks  web01.xml
View Code
  • 查询vnc端口
##显示的是简明方式,在上一篇中有过描述
[root@kvm1 opt]# virsh vncdisplay web01 
:0
View Code

kvm虚拟机的开机自启动

实现目标:宿主机开机的时候,目标虚拟机自启动。

虚拟机的自启动过程描述:一、设置libvirtd自启动,宿主机开机后自动启用libvirtd服务;二、libvirtd服务自动启用模板kvm虚拟机

实现方式:一、设置libvirtd自启动;二、设置目标kvm虚拟机自启动

过程如下(其中描述了实现libvirtd自动启用kvm虚拟机的原理):

##libvirtd服务自启动
[root@kvm1 opt]# systemctl is-enabled libvirtd.service 
enabled

##设置kvm虚拟机自启动
[root@kvm1 opt]# virsh autostart web01 
Domain web01 marked as autostarted

##虚拟机自启动的原理是创建了如下目录(autostart)和软连接文件
[root@kvm1 opt]# ls /etc/libvirt/qemu
autostart  networks  web01.xml

[root@kvm1 opt]# ll /etc/libvirt/qemu/autostart/
total 0
lrwxrwxrwx 1 root root 27 Feb  3 11:24 web01.xml -> /etc/libvirt/qemu/web01.xml
View Code

重启宿主机,,观察kvm虚拟机自启动效果

这里有个点要注意:

经过验证,关闭libvirtd服务,不会影响已经开启的kvm虚拟机
验证方式:vnc连接虚拟机,关闭libvirtd服务后,vnc还可以正常连接并进行操作

配置console连接

这个需要到kvm虚拟机中去配置内核参数,我们目前有两种方式连接到web01(就是正在使用的kvm虚拟机,之前重命名的章节为web01了):一、vnc;二、到vnc找到ip,然后从宿主机ssh过去。

因为第二种方法可以复制粘贴,我选择第二种,由vnc查找ip的过程就不描述了,直接ssh然后修改,这个过程中顺便把kvm虚拟机的hostname改为web01,方便管理

##ssh然后修改,顺便修改虚拟机的hostname
[root@kvm1 ~]# ssh 192.168.122.67
###...输入密码后就可以登入,登入后修改hostname
[root@localhost ~]# hostnamectl set-hostname web01
[root@localhost ~]# hostname
web01

###首先备份配置文件
[root@localhost ~]#  cp /boot/grub2/grub.cfg /tmp/

##修改内核参数,使支持console连接
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"

###有兴趣的话可以对比修改前后的文件,看看都改了些什么
[root@localhost ~]# diff /boot/grub2/grub.cfg /tmp/grub.cfg 
100c100
<       linux16 /vmlinuz-3.10.0-862.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rhgb quiet LANG=en_US.UTF-8 console=ttyS0,115200n8
---
>       linux16 /vmlinuz-3.10.0-862.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rhgb quiet LANG=en_US.UTF-8
114c114
<       linux16 /vmlinuz-0-rescue-8b69bd3010d14697b7c01af64f5842f0 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rhgb quiet console=ttyS0,115200n8
---
>       linux16 /vmlinuz-0-rescue-8b69bd3010d14697b7c01af64f5842f0 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rhgb quiet

###回到宿主机,重启虚拟机
[root@kvm1 ~]# virsh reboot web01 
Domain web01 is being rebooted


###重启后验证效果
[root@kvm1 ~]# virsh console web01 
Connected to domain web01
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-862.el7.x86_64 on an x86_64

web01 login: root
Password: 
Last login: Sun Feb  3 11:41:18 from gateway
[root@web01 ~]# 
[root@web01 ~]# 
##如上,连接成功,按ctrl+]组合键就可以回到宿主机的命令行界面
View Code

磁盘管理

磁盘管理其实就是qemu-img命令的一系列使用,下面描述比较重要的一些选项。

创建磁盘并使用

  • 创建磁盘
[root@kvm1 opt]# qemu-img create /opt/timmy.raw 10G   ##默认的格式是raw,如果要创建qcow2格式的磁盘,需要-f参数指定,后面会有描述;10G指定磁盘容量
Formatting '/opt/timmy.raw', fmt=raw size=10737418240 
  • 查看磁盘信息
[root@kvm1 opt]# ll *.raw
-rw------- 1 qemu qemu 10737418240 Feb 3 12:03 centos.raw
-rw-r--r-- 1 root root 10737418240 Feb 3 11:59 timmy.raw


[root@kvm1 opt]# qemu-img info timmy.raw 
image: timmy.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0

###可以看到,磁盘的容量是10G,但目前size是0
  • 格式化磁盘
[root@kvm1 opt]# mkfs.xfs /opt/timmy.raw 
  • 挂载
[root@kvm1 opt]# mkdir /timmy
[root@kvm1 opt]# df -h|grep timmy
/dev/loop0       10G   33M   10G   1% /timmy
  • 验证磁盘可用性
[root@kvm1 ~]# cd /timmy/
[root@kvm1 timmy]# echo "my name is tim duncan">name.txt
[root@kvm1 timmy]# cat name.txt
my name is tim duncan

创建qcow2格式的磁盘

大体过程和raw磁盘一样,只是需要指定格式

[root@kvm1 opt]# qemu-img create -f qcow2 /opt/timmy.qcow2 10G

[root@kvm1 opt]# ll -h *.qcow2           
       
-rw-r--r-- 1 root root 193K Feb  3 12:11 timmy.qcow2
[root@kvm1 opt]# qemu-img info /opt/timmy.qcow2 
image: /opt/timmy.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
View Code

改变磁盘容量

有两种方式:一、直接给定容量值;二、在当前容量基础上增加或减少

对于第二种方式,qcow2格式的磁盘只支持扩容,不支持缩容,原因可能与其存储原理有关(非连续性)

要注意的是:生产环境中,就算用的是raw格式,也不要做缩容

这里我修改的是上面创建的timmy.qcow2文件

[root@kvm1 opt]# qemu-img resize /opt/timmy.qcow2 +5G
Image resized.

[root@kvm1 opt]# qemu-img info /opt/timmy.qcow2      
image: /opt/timmy.qcow2
file format: qcow2
virtual size: 15G (16106127360 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

磁盘格式转换

首先需要说明:这里的转换是生成了一个新文件,源文件依然存在,并保持原来的格式。操作过程如下

[root@kvm1 opt]# ll -h *.raw *.qcow2
-rw------- 1 qemu qemu  10G Feb  3 12:26 centos.raw
-rw-r--r-- 1 root root 257K Feb  3 12:25 timmy.qcow2
-rw-r--r-- 1 root root  10G Feb  3 12:09 timmy.raw

##格式转换命令
[root@kvm1 opt]# qemu-img convert -f raw -O qcow2 timmy.raw timmy.raw.qcow2

##查看新生成的磁盘文件
[root@kvm1 opt]# ll -h *.raw *.qcow2
-rw------- 1 qemu qemu  10G Feb  3 12:26 centos.raw
-rw-r--r-- 1 root root 257K Feb  3 12:25 timmy.qcow2
-rw-r--r-- 1 root root  10G Feb  3 12:09 timmy.raw
-rw-r--r-- 1 root root 2.9M Feb  3 12:29 timmy.raw.qcow2

[root@kvm1 opt]# qemu-img info timmy.raw.qcow2 
image: timmy.raw.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 3.0M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
View Code

修改虚拟机web01的磁盘格式为qcow2

注意:修改磁盘格式后,磁盘文件的名字和格式都改变了,就如同之前磁盘重命名一样,需要修改配置文件,否则启动时会报错。

  • 修改磁盘格式
[root@kvm1 opt]# qemu-img convert -f raw -O qcow2 centos.raw centos.qcow2
[root@kvm1 opt]# ll -h *.raw *.qcow2                                     
-rw-r--r-- 1 root root 1.3G Feb  3 12:34 centos.qcow2
-rw------- 1 qemu qemu  10G Feb  3 12:34 centos.raw
-rw-r--r-- 1 root root 257K Feb  3 12:25 timmy.qcow2
-rw-r--r-- 1 root root  10G Feb  3 12:09 timmy.raw
-rw-r--r-- 1 root root 2.9M Feb  3 12:29 timmy.raw.qcow2

[root@kvm1 opt]# qemu-img info centos.qcow2 
image: centos.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
View Code
  • 修改虚拟机配置文件
 [root@kvm1 opt]# virsh edit web01 
   <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>  ###这里修改磁盘格式
      <source file='/opt/centos.qcow2'/>      ###这里修改磁盘文件路径
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
View Code
  • 重启生效

这里有个问题,是后来做快照的时候发现的:我初次重启使用的是virsh reboot,做快找报错显示不能为raw格式的存储设备做快照;随后用destroy关机再重启就可以了

  • 这里补充一下,也可以在初始构建虚拟机的时候指定磁盘格式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name Centos7 --memory 1024 --vcpus 1 --disk /opt/timmy.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-Minimal-1804.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

kvm快照

创建快照

几点需要说明:

raw格式的磁盘不支持快照

kvm虚拟机开启和关闭的时候都可以创建快照

创建快照后,ll -h查看,磁盘占用空间变大了;但删除快照后查看,磁盘占用空间不会变小,这个就不再单独贴上来了

[root@kvm1 opt]# virsh snapshot-create web01
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

##以上报错,这是web01的磁盘还是raw格式,destroy并重新启动后就可以了
[root@kvm1 opt]# virsh destroy web01 
Domain web01 destroyed

[root@kvm1 opt]# virsh start web01 
Domain web01 started

##进入virsh交互操作界面
[root@kvm1 opt]# virsh 
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

##创建快照
virsh # snapshot-create web01
Domain snapshot 1549169536 created
##查看快照
virsh # snapshot-list web01
 Name                 Creation Time             State
------------------------------------------------------------
 1549169536           2019-02-03 12:52:16 +0800 running
View Code

删除快照

virsh # snapshot-create web01
Domain snapshot 1549169814 created
virsh # snapshot-list web01  
 Name                 Creation Time             State
------------------------------------------------------------
 1549169536           2019-02-03 12:52:16 +0800 running
 1549169814           2019-02-03 12:56:54 +0800 running

##删除快照
virsh # snapshot-delete web01 --snapshotname  1549169814
Domain snapshot 1549169814 deleted


##删除后查看快照列表
virsh # snapshot-list web01
 Name                 Creation Time             State
------------------------------------------------------------
 1549169536           2019-02-03 12:52:16 +0800 running
View Code

恢复快照

进行这个操作前可以进入web01,对其做一些修改,作为恢复快照后的比照。我就是在家目录创建了一个文件,恢复快照后这个文件没有了。这个过程就不贴了。

恢复快照的命令如下:

virsh # snapshot-revert web01 --snapshotname  1549169536

kvm克隆

kvm的克隆和VMware虚拟机一样,分完整克隆和链接克隆,这里不再详细描述。

有几点说明:

克隆操作要求虚拟机处于挂起或者关闭状态

克隆不包含快照,所以克隆后的磁盘文件可能比源磁盘文件小

完整克隆

##提示必须在关机或者挂起的状态下克隆
[root@kvm1 opt]# virt-clone --auto-clone -o web01 -n web02
ERROR    Domain with devices to clone must be paused or shutoff.

##挂起虚拟机
[root@kvm1 opt]# virsh suspend web01 
Domain web01 suspended

##完整克隆
[root@kvm1 opt]# virt-clone --auto-clone -o web01 -n web02
WARNING  Setting the graphics device port to autoport, in order to avoid conflicting.
Allocating 'centos-clone.qcow2'                                                                                                             |  10 GB  00:00:14     


##查看可伶后的状态,发现虚拟机web02和配置文件都存在
Clone 'web02' created successfully.
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     web01                          paused
 -     web02                          shut off

[root@kvm1 opt]# ls /etc/libvirt/qemu
autostart  networks  web01.xml  web02.xml
View Code

克隆完毕后可以打开虚拟机查看运行状态,这里不再粘贴。

链接克隆

链接克隆有两种方式,其中一种比较麻烦,现在也不多使用,可以参考https://www.qstack.com.cn/archives/230.html

我们使用另外一种,简单说就是在源虚拟机的磁盘基础上,创建一个新的磁盘,然后用这个新的磁盘来构建虚拟机,过程如下

[root@kvm1 opt]# qemu-img create -f qcow2 -b centos.qcow2 web03.qcow2                  
Formatting 'web03.qcow2', fmt=qcow2 size=10737418240 backing_file='centos.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 

##构建虚拟机,与之前的构建命令做区别,可以理解就是pc机安装完系统后,不再设置从光驱启动,而是直接从硬盘启动了
[root@kvm1 opt]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web03 --memory 1024 --vcpus 1 --disk /opt/web03.qcow2 --boot hd --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

##连接克隆后查看状态,确认web03虚拟机运行状态,也可以看看配置文件,当然最好进入系统去看看虚拟机是否可以正常使用
[root@kvm1 opt]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     web01                          paused
 3     web02                          running
 4     web03                          running

[root@kvm1 opt]# ls /etc/libvirt/qemu
autostart  networks  web01.xml  web02.xml  web03.xml
View Code

 

这篇就到这里,剩下的网卡模式和kvm的热添加技术在下一篇中描述。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!