KVM(kernel-based VM)和它的伙伴(二)

举报
黄生 发表于 2023/01/02 15:55:44 2023/01/02
【摘要】 上接 KVM(kernel-based VM)和它的伙伴如果是做好的镜像,如qcow2格式的(虽然文件以img结尾),而不是安装介质ISO,可以用virt-install的import导入。https://docs.openstack.org/image-guide/obtain-images.htmlCirrOS is a minimal Linux distribution that w...

上接 KVM(kernel-based VM)和它的伙伴

如果是做好的镜像,如qcow2格式的(虽然文件以img结尾),而不是安装介质ISO,可以用virt-install的import导入。

https://docs.openstack.org/image-guide/obtain-images.html

CirrOS is a minimal Linux distribution that was designed for use as a test image on clouds such as OpenStack Compute. You can download a CirrOS image in various formats from the CirrOS download page.

If your deployment uses QEMU or KVM, we recommend using the images in qcow2 format. The most recent 64-bit qcow2 image as of this writing is cirros-0.5.1-x86_64-disk.img.

QEMU-KVM可以模拟的磁盘类型:

  1. IDE
  2. SATA(Serial Advanced Tech Attachment),取代旧式PATA(Parallel ATA,旧称IDE)。速度更快,支持热插拔;更强纠错。
  3. Virtio
    Virtio是半虚拟化Hypervisor中位于设备之上的抽象层。Virtio半虚拟化驱动的方式,IO性能几乎接近Native。如果宿主机内核和客户机都支持Virtio,一般推荐使用。

缺点:客户机必须安装特定的virtio驱动,以使其知道是运行在虚拟化环境中的,并按照vitio的规定格式进行数据传输。老版本linux不支持virtio(新版本默认已编译为模块),windows需要安装特定驱动来支持virtio。
Centos6只支持IDE和Virtio磁盘类型,Centos7增加支持SATA和virtio-SCSI。virtio-SCSI用于替代virtio_blk

IDE当然是兼容性最好,因为它可以兼容很多低版本的OS的虚拟机。但virtio会比IDE虚拟好很多,因为IDE是全软件模拟,Virtio是半虚拟化驱动,使虚拟机可以直接和虚拟化层通信。
磁盘的缓存方式。存储数据和元数据的缓存限制了在线迁移的配置。

image.png

使用virt-install可以直接进入客户机OS的安装界面,相当于快速完成了图像界面的5个设置步骤(这个步骤完成后,应该要能够输出命令就好了)。
在此之前,可以先手工建立qcow2镜像文件,也可以不建。

qemu-img create -f qcow2 ./cirros.qcow2 1G
#qemu-img info 可以看镜像文件的信息

sudo virt-install --name=centos79-sh --vcpus=2 --memory=2048 --disk path=./centos7-sh.qcow2 --cdrom=/media/icr/DATA/icr-img/CentOS-7-x86_64-DVD-2009.iso --network network=default --graphics vnc,listen=0.0.0.0 --os-variant=centos7.0 --debug

image.png

qemu-img默认的RAW格式是稀疏文件(Sparse File),也就是说支持Hole,没有一开始就实际占用空间。dd创建的镜像也是RAW,但一开始就实际占用了分配的空间。
qcow2,目前推荐。支持稀疏文件、支持加密AES,支持压缩zlib,支持一个镜像文件里有多个虚拟机快照。

稀疏文件Sparse File,以简短的信息(元数据)表示空数据块,而不在磁盘占用实际空间。在读取时,将这些透明转换为“真实”的数据块,即填充为0,应用程序不会觉察这个转换。

关于sparse,可以看下面

HI>sudo qemu-img create  ./t1.img 1G
Formatting './t1.img', fmt=raw size=1073741824

HI>qemu-img info ./t1.img 
image: ./t1.img
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 4 KiB

HI>dd if=/dev/zero of=t2.img bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.320483 s, 3.3 GB/s

HI>qemu-img info ./t2.img 
image: ./t2.img
file format: raw
virtual size: 0.977 GiB (1048576000 bytes)
disk size: 0.977 GiB

HI>dd if=/dev/zero of=t3.img bs=1024k count=0 seek=1024
0+0 records in
0+0 records out
0 bytes copied, 0.000107474 s, 0.0 kB/s

HI>qemu-img info ./t3.img 
image: ./t3.img
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 0 B

HI>cp t2.img --sparse=always t2.1.img
HI>qemu-img info ./t2.1.img 
image: ./t2.1.img
file format: raw
virtual size: 0.977 GiB (1048576000 bytes)
disk size: 0 B

HI>cp t2.img  t2.2.img
HI>qemu-img info ./t2.2.img 
image: ./t2.2.img
file format: raw
virtual size: 0.977 GiB (1048576000 bytes)
disk size: 0.977 GiB

再看一下指定为qcow2格式的

HI>qemu-img create -f qcow2 t1.qcow2 1g
Formatting 't1.qcow2', fmt=qcow2 size=1073741824 cluster_size=65536 lazy_refcounts=off refcount_bits=16
#默认就是 preallocation=off

HI>qemu-img info t1.qcow2 
image: t1.qcow2
file format: qcow2
virtual size: 1 GiB (1073741824 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    
HI>qemu-img create -f qcow2 -o preallocation=metadata t2.qcow2 1g
Formatting 't2.qcow2', fmt=qcow2 size=1073741824 cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16

HI>qemu-img info t2.qcow2 
image: t2.qcow2
file format: qcow2
virtual size: 1 GiB (1073741824 bytes)
disk size: 324 KiB  #因为有metadata,会大一点点;但能提升性能
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

HI>qemu-img info cirros-0.5.1-x86_64-disk.img 
image: cirros-0.5.1-x86_64-disk.img
file format: qcow2
virtual size: 112 MiB (117440512 bytes)
disk size: 15.6 MiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

#创建一个增量镜像。不过不管是增量、还是原镜像,不管是脚本import,还是手工图像界面操作导入后,启动都卡在了,到不了登录界面。从0.5.1换到0.4.0的cirros也一样
HI>qemu-img create -f qcow2 -o backing_file=cirros-0.5.1-x86_64-disk.img t3.qcow2
Formatting 't3.qcow2', fmt=qcow2 size=117440512 backing_file=cirros-0.5.1-x86_64-disk.img cluster_size=65536 lazy_refcounts=off refcount_bits=16
HI>qemu-img info t3.qcow2 
image: t3.qcow2
file format: qcow2
virtual size: 112 MiB (117440512 bytes)
disk size: 196 KiB
cluster_size: 65536
backing file: cirros-0.5.1-x86_64-disk.img
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

qemu-img是qemu的磁盘管理工具。可以调整磁盘大小,resize +1G,但qcow2格式不支持缩减磁盘大小:resize -1G。check 可以检查文件一致性。

创建虚拟机的普遍做法:复制已有镜像,得到相同而独立的镜像,来运行多个虚拟机。
问题:大规模的虚拟化节点,大量复制导致存储空间庞大,而且完全复制导致创建效率低下。
方案:基于虚拟机模板对应的基础镜像文件生成一个内容为空的增量镜像文件,用增量启动虚拟机。运行中,虚拟机对数据的最新修改都保存在增量镜像文件中。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。