kvm总结(2) : 配置文件和磁盘
KVM是一个专题系列,建议按照顺序阅读这些文章,以便站在前文的基础上去理解,专题链接如下:
前一篇文章中,我们通过图形化界面,创建了第一个kvm虚拟机,在宿主机中查看虚拟机列表,如下
并且,我们知道,可以使用 virsh dominfo 命令查看kvm的概览信息
上述信息只是一些概述信息,那么虚拟机的详细信息在哪里呢?
虚拟机的详细配置默认存放在宿主机的/etc/libvirt/qemu目录中,进入此目录中,查看所有文件,如下所示:
从上述信息中可以看出,此目录中,有一个以kvm1虚拟机名为前缀的xml文件,这个kvm1.xml中存放的就是kvm1虚拟机的详细配置,查看一下这个文件的内容,大致如下(如下示例省略了很多内容,以便展示):
聪明如你,一定已经看出来了,kvm1.xml其实就是kvm1这个虚拟机的配置文件,如果在宿主机上创建了多个虚拟机,那么在此路径下,还能够看到其他以对应虚拟机名开头的.xml文件,如果我们想要查看kvm1的硬件配置,查看此文件准没错。
其实,如果想要修改kvm1虚拟机的硬件配置,只需要修改kvm1.xml中的内容就行了,修改成功后,当KVM再次加载此配置文件时,对应虚拟机的硬件配置就会发生改变,但是,需要注意的是,如果想要修改此配置文件的内容,不要直接通过编辑器(如Vim、Emacs、Nano等)打开此文件,因为直接通过编辑器修改的内容会被KVM覆盖掉,如果想要修改虚拟机的硬件配置文件,需要使用一个专门的命令,这个命令就是 virsh edit
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虚拟机的配置,执行如下命令即可
从刚才的详细配置文件中,可以看到如下<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文件的大小,如下
可以看到,kvm1.qcow2文件占用了宿主机21G的空间,这是因为我们在使用virt-manager的图形化界面创建kvm1虚拟机时,指定了虚拟机的磁盘空间为20G,所以这个镜像文件的大小就会20G起步,直接沾满宿主机20G的空间,其实,在虚拟机中,是根本没有使用到20G空间的,进入虚拟机,查看虚拟机的空间占用情况,如下
可以看到kvm1虚拟机中实际占用的空间不到2G,但是,宿主机中,空间直接就占用了20G,这种情况是非常不划算的,因为有的虚拟机如果没有那么多数据,对应的磁盘空间就浪费了,只有一个虚拟机的情况下,这种浪费的情况可能不太明显,但是如果创建了多个虚拟机,这种情况就比较明显了。
我们知道,在使用vmware时,如果为虚拟机创建vmdk格式的磁盘,会有一个“立即分配所有磁盘空间”选项,如果勾选这个选项,虚拟机磁盘的大小就会被分配满,反之则不会,比如,我们指定虚拟机的磁盘大小为50G,如果勾选了“立即分配所有磁盘空间”选项,虚拟机磁盘就会直接占用宿主机50G的空间,如果不勾选“立即分配所有磁盘空间”选项,那么虚拟机磁盘的初始大小可能只有4G到6G左右,之后会随着虚拟机的实际使用,动态的分配更多空间,直到虚拟机真正使用了50G,磁盘文件才会占用宿主机50G空间,直接分配所有磁盘空间的磁盘效率更高,动态分配磁盘空间的方式效率稍低。
其实,qcow2格式的磁盘也能够动态的分配磁盘空间,只不过,通过virt-manager的图形化界面创建的磁盘默认就是立即分配所有磁盘空间的,如果想要创建一个动态分配磁盘空间的磁盘,需要使用命令提前创建好对应的磁盘,创建磁盘命令如下。
qemu-img命令是一个磁盘镜像管理工具,上述命令表示创建一个格式为qcow2的磁盘(-f选项用于指定磁盘格式),磁盘名为testdisk1.qcow2,磁盘大小为50G,由于我没有指定路径,所以testdisk1.qcow2文件会在当前目录下创建,除了qcow2格式,qemu-img还支持很多种其他的磁盘格式,支持的格式如下
使用qemu-img命令创建qcow2磁盘时,可以指定磁盘空间的预分配策略,当不指定空间预分配策略时,默认就是不会进行预分配空间的(也就是说,不会直接分配所有空间,默认是动态分配空间的),具体的空间预分配策略咱们后面再聊,先来看看默认创建的磁盘文件,占用了宿主机多大空间,如下
可以看到,文件刚刚被创建出来时,是很小的,如果我们想要在宿主机中查看这个磁盘最大能够占用多少空间,可以使用qemu-img info命令查看,如下
可以看到,这个磁盘镜像的virtual size为50G,目前只占用了宿主机196k的空间。
磁盘镜像的话题就先粗略的聊到这里,现在聊聊怎样通过命令行创建虚拟机,之前我们已经通过virt-manager图形化界面创建了虚拟机,现在通过命令来试一试,virt-install命令可以直接在命令行创建虚拟机,示例如下
上述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的虚拟机,所以可以在虚拟机中直接执行如下命令(不同的虚拟机系统方法可能所有差异,重要环境提前做好备份),修改所有内核的参数:
修改后重启虚拟机,即可在宿主机中通过virsh console命令直连到虚拟机的控制台了。
这篇文章先总结到这里,之后咱们在聊。