zoukankan      html  css  js  c++  java
  • 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命令直连到虚拟机的控制台了。

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

    热爱世间万物,无最爱,无例外、
  • 相关阅读:
    电商项目中商品规格数据库的设计
    Spring开发一个简单的starter——c3p0自动配置
    Spring boot 自动配置原理
    Spring MVC中配置静态资源处理的三种方式和区别
    通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明
    基于注解和配置类的SSM(Spring+SpringMVC+Mybatis)项目详细配置
    基于注解和xml配置的SSM(Spring+SpringMVC+Mybatis)项目详细配置
    css position 属性 (absolute 和fixed 区别)
    asp.net 网站所有请求跳转到同一个页面
    Javascript 闭包
  • 原文地址:https://www.cnblogs.com/guarderming/p/15532555.html
Copyright © 2011-2022 走看看