kvm总结(2) : 配置文件和磁盘

KVM是一个专题系列,建议按照顺序阅读这些文章,以便站在前文的基础上去理解,专题链接如下:

https://www.zsythink.net/archives/tag/kvm

前一篇文章中,我们通过图形化界面,创建了第一个kvm虚拟机,在宿主机中查看虚拟机列表,如下

[root@cos7 ~]# virsh list --all
Id Name State
----------------------------------------------------
1 kvm1 running

并且,我们知道,可以使用 virsh dominfo 命令查看kvm的概览信息

[root@cos7 ~]# virsh dominfo kvm1
Id: 1
Name: kvm1
UUID: e79f8f39-9257-4138-a061-fe8b905e6a7b
OS Type: hvm
State: running
CPU(s): 2
CPU time: 157.6s
Max memory: 2097152 KiB
Used memory: 2097152 KiB
Persistent: yes
Autostart: enable
Managed save: no
Security model: none
Security DOI: 0

上述信息只是一些概述信息,那么虚拟机的详细信息在哪里呢?
虚拟机的详细配置默认存放在宿主机的/etc/libvirt/qemu目录中,进入此目录中,查看所有文件,如下所示:

[root@cos7 ~]# cd /etc/libvirt/qemu
[root@cos7 qemu]# ls -l
total 8
drwxr-xr-x 2 root root 22 Sep 28 17:57 autostart
-rw------- 1 root root 4568 Sep 28 14:44 kvm1.xml
drwx------ 3 root root 42 Sep 26 19:31 networks

从上述信息中可以看出,此目录中,有一个以kvm1虚拟机名为前缀的xml文件,这个kvm1.xml中存放的就是kvm1虚拟机的详细配置,查看一下这个文件的内容,大致如下(如下示例省略了很多内容,以便展示):

[root@cos7 qemu]# cat kvm1.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit kvm1
or other application using the libvirt API.
-->
 
<domain type='kvm'>
<name>kvm1</name>
<uuid>e79f8f39-9257-4138-a061-fe8b905e6a7b</uuid>
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
······
<cpu mode='host-model' check='partial'>
<model fallback='allow'/>
</cpu>
······
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
······
<interface type='network'>
<mac address='52:54:00:a4:35:b2'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
······
</devices>
</domain>

聪明如你,一定已经看出来了,kvm1.xml其实就是kvm1这个虚拟机的配置文件,如果在宿主机上创建了多个虚拟机,那么在此路径下,还能够看到其他以对应虚拟机名开头的.xml文件,如果我们想要查看kvm1的硬件配置,查看此文件准没错。
其实,如果想要修改kvm1虚拟机的硬件配置,只需要修改kvm1.xml中的内容就行了,修改成功后,当KVM再次加载此配置文件时,对应虚拟机的硬件配置就会发生改变,但是,需要注意的是,如果想要修改此配置文件的内容,不要直接通过编辑器(如Vim、Emacs、Nano等)打开此文件,因为直接通过编辑器修改的内容会被KVM覆盖掉,如果想要修改虚拟机的硬件配置文件,需要使用一个专门的命令,这个命令就是 virsh edit

virsh edit 命令是专门用于修改虚拟机配置文件的命令,只需要使用此命令加上要修改的虚拟机的名称,就可以编辑对应虚拟机的配置文件,比如,如果想要修改kvm1虚拟机的配置,只要执行如下命令即可

virsh edit kvm1

执行上述命令以后,你会发现,上述命令编辑的内容,其实就是/etc/libvirt/qemu/kvm1.xml这个配置文件中的内容,而且,细心如你肯定已经发现了,/etc/libvirt/qemu/kvm1.xml文件中早就给出了提示,这个文件的最上方有些注释(注释了一条WARNING信息),这条WARNING信息告诉我们,这个kvm1.xml文件是自动生成的(当我们创建虚拟机时,KVM会根据我们的设置自动生成此配置文件),不要直接编辑这个文件,因为如果直接编辑这个文件,更改的内容会被覆盖、会丢失,如果想要修改虚拟机的配置,应该使用 virsh edit 命令。

当然,如果宿主机支持图形化界面,通过virt-manager的图形化界面去修改,是更加直观的,不过这里描述的是一些原理,了解了这些原理以后,通过命令行,也可以修改对应的配置,最终的本质是一样的。

如果只是想要查看配置文件的内容,不进行任何修改,其实也没有必要使用virsh edit命令,也不用进入/etc/libvirt/qemu/目录查看对应的配置文件,直接使用virsh dumpxml命令,加上虚拟机名,即可直接将配置文件的内容输出到终端中,没错,virsh dumpxml命令就是用来导出备份虚拟机配置文件的,比如,想要查看kvm1虚拟机的配置,执行如下命令即可

virsh dumpxml kvm1

从刚才的详细配置文件中,可以看到如下<disk>部分的代码,如下代码对应的是虚拟机硬盘的配置

<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

从上述配置可以看出,虚拟机的磁盘镜像路径为/var/lib/libvirt/images/kvm1.qcow2
在通过KVM创建虚拟机时,如果没有指定磁盘镜像,那么磁盘镜像默认存放在/var/lib/libvirt/images/目录中,磁盘镜像名以虚拟机名为前缀,以qcow2为后缀,qcow2是KVM默认使用的磁盘镜像格式,它既是虚拟机的磁盘,又是虚拟机的镜像,我们可以通过qcow2文件快速的实现虚拟机的迁移,如果你对vmware比较熟,可以类比着vmware默认的磁盘格式vmdk文件去理解。

查看一下/var/lib/libvirt/images/kvm1.qcow2文件的大小,如下

[root@cos7 opt]# ll -h /var/lib/libvirt/images/kvm1.qcow2
-rw------- 1 qemu qemu 21G Oct 9 13:03 /var/lib/libvirt/images/kvm1.qcow2

可以看到,kvm1.qcow2文件占用了宿主机21G的空间,这是因为我们在使用virt-manager的图形化界面创建kvm1虚拟机时,指定了虚拟机的磁盘空间为20G,所以这个镜像文件的大小就会20G起步,直接沾满宿主机20G的空间,其实,在虚拟机中,是根本没有使用到20G空间的,进入虚拟机,查看虚拟机的空间占用情况,如下

[root@kvm1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/vda3 19G 1.4G 18G 8% /
/dev/vda1 497M 135M 362M 28% /boot
tmpfs 184M 0 184M 0% /run/user/0

可以看到kvm1虚拟机中实际占用的空间不到2G,但是,宿主机中,空间直接就占用了20G,这种情况是非常不划算的,因为有的虚拟机如果没有那么多数据,对应的磁盘空间就浪费了,只有一个虚拟机的情况下,这种浪费的情况可能不太明显,但是如果创建了多个虚拟机,这种情况就比较明显了。

我们知道,在使用vmware时,如果为虚拟机创建vmdk格式的磁盘,会有一个“立即分配所有磁盘空间”选项,如果勾选这个选项,虚拟机磁盘的大小就会被分配满,反之则不会,比如,我们指定虚拟机的磁盘大小为50G,如果勾选了“立即分配所有磁盘空间”选项,虚拟机磁盘就会直接占用宿主机50G的空间,如果不勾选“立即分配所有磁盘空间”选项,那么虚拟机磁盘的初始大小可能只有4G到6G左右,之后会随着虚拟机的实际使用,动态的分配更多空间,直到虚拟机真正使用了50G,磁盘文件才会占用宿主机50G空间,直接分配所有磁盘空间的磁盘效率更高,动态分配磁盘空间的方式效率稍低。

其实,qcow2格式的磁盘也能够动态的分配磁盘空间,只不过,通过virt-manager的图形化界面创建的磁盘默认就是立即分配所有磁盘空间的,如果想要创建一个动态分配磁盘空间的磁盘,需要使用命令提前创建好对应的磁盘,创建磁盘命令如下。

qemu-img create -f qcow2 testdisk1.qcow2 50G

qemu-img命令是一个磁盘镜像管理工具,上述命令表示创建一个格式为qcow2的磁盘(-f选项用于指定磁盘格式),磁盘名为testdisk1.qcow2,磁盘大小为50G,由于我没有指定路径,所以testdisk1.qcow2文件会在当前目录下创建,除了qcow2格式,qemu-img还支持很多种其他的磁盘格式,支持的格式如下

[root@cos7 opt]# qemu-img -h | grep Supported
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

使用qemu-img命令创建qcow2磁盘时,可以指定磁盘空间的预分配策略,当不指定空间预分配策略时,默认就是不会进行预分配空间的(也就是说,不会直接分配所有空间,默认是动态分配空间的),具体的空间预分配策略咱们后面再聊,先来看看默认创建的磁盘文件,占用了宿主机多大空间,如下

[root@cos7 opt]# ll -h testdisk1.qcow2
-rw-r--r-- 1 root root 193K Oct 9 15:07 testdisk1.qcow2

可以看到,文件刚刚被创建出来时,是很小的,如果我们想要在宿主机中查看这个磁盘最大能够占用多少空间,可以使用qemu-img info命令查看,如下

[root@cos7 opt]# qemu-img info testdisk1.qcow2
image: testdisk1.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false

可以看到,这个磁盘镜像的virtual size为50G,目前只占用了宿主机196k的空间。

磁盘镜像的话题就先粗略的聊到这里,现在聊聊怎样通过命令行创建虚拟机,之前我们已经通过virt-manager图形化界面创建了虚拟机,现在通过命令来试一试,virt-install命令可以直接在命令行创建虚拟机,示例如下

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network network=default --graphics none --extra-args='console=ttyS0'

上述virt-install命令各个参数含义如下
–name=kvm2表示为创建的虚拟机命名为kvm2。
–vcpus=2表示设置虚拟机cpu有2个核心。
–memory=2048表示设置内存为2G。
–location=/data/iso/CentOS-7-x86_64-DVD-2009.iso表示使用本地iso镜像安装虚拟机。
–disk path=/var/lib/libvirt/images/kvm2.qcow2表示指定虚拟机的磁盘镜像的路径,示例中的路径是我提前通过qemu-img命令创建出来的磁盘,咱们做实验的时候需要自行创建好,如果不想提前创建好磁盘,也可以使用–disk size=50代替–disk path=/var/lib/libvirt/images/kvm2.qcow2,如果使用–disk size=50这个设置,virt-install命令会在/var/lib/libvirt/images/目录中自动创建一个50G的qcow2磁盘,磁盘的前缀名和虚拟机名相同,这个磁盘是预分配所有磁盘空间的,也就是说,会直接占用宿主机50G的磁盘空间。
–network network=default表示使用kvm的默认网络,默认网络就是前一篇文章中提到的IP段为192.168.122.0/24的NAT网络。
–graphics none表示我们安装的过程中,需要使用的图形化控制台,由于我们此处模拟的是纯命令行安装,所以图形化控制台指定为none,表示不使用图形化控制台安装虚拟机。
–extra-args=’console=ttyS0’表示为创建的虚拟机指定内核启动时的内核参数,此处为虚拟机内核添加的参数为console=ttyS0,也就是说,当安装虚拟机时,分配一个ttyS0的虚拟终端,因为我们没有使用图形化控制台安装,所以要分配一个命令行的虚拟终端,以便执行安装操作和安装完成后的登录、执行命令等操作。

上述命令执行后,会卡在如下图的位置,下面这个纯文本的控制台布局是不是很眼熟,没错,下图中的文本就是和图形化中的配置选项位置对应的,具体的安装操作,这里就不再赘述了,根据提示安装即可,这里说明一下,在通过下图中的命令行界面安装centos7系统时,无法为虚拟机磁盘自定义分区,只能使用默认的分区方案,此处只是为了演示安装的方法,我一般不会这样安装系统,而是将一个安装好的虚拟机镜像当做模板,通过模板快速的创建新的虚拟机,这些操作后面再聊。

刚才执行的virt-install命令时,只添加了必要参数,还有很多优化性能的参数没有使用,所以创建出的虚拟机的磁盘性能和网络性能都比较一般,此处只是为了方便演示,先理解,再慢慢的丰富这些参数。

当我们通过上述方式安装完新的kvm2虚拟机以后,会自动连入到一个kvm2虚拟机的控制台,登录后即可在虚拟机中执行命令,如果你想要退出这个控制台,按住 ctrl键 和 ]键 即可退出,如果想要在宿主机中,再次登录kvm2虚拟机的控制台,只需要在宿主机中执行virsh console kvm2命令即可,这样就能在无法远程虚拟机时,通过宿主机登录到虚拟机进行操作了,如下图所示

上述virsh console命令只能对kvm2虚拟机生效,我们之前创建的kvm1虚拟机是无法通过此命令进行连接的,这是因为,我们在创建kvm2虚拟机时,就已经为kvm2的内核传入了参数,在kvm2内核启动时分配了一个终端,而在创建kvm1时,是使用图形化界面创建的,默认没有为kvm1的内核传入任何参数,所以,kvm1内核启动时,是不会分配虚拟终端的,我们可以通过图形化的界面或者远程ssh连接登录到kvm1虚拟机内,修改内核参数,咱们示例中安装的是centos7的虚拟机,所以可以在虚拟机中直接执行如下命令(不同的虚拟机系统方法可能所有差异,重要环境提前做好备份),修改所有内核的参数:

grubby --update-kernel=ALL --args="console=ttyS0"

修改后重启虚拟机,即可在宿主机中通过virsh console命令直连到虚拟机的控制台了。

这篇文章先总结到这里,之后咱们在聊。

posted @ 2021-11-10 11:10  禾子、  阅读(1116)  评论(0编辑  收藏  举报