精华内容
下载资源
问答
  • 创建qcow2镜像

    2021-01-07 06:52:17
    文章目录利用vmware创建一台虚拟机设置虚拟机网络安装虚拟机软件VNC连接操作镜像利用qcow2文件生成虚拟机参考文章 利用vmware创建一台虚拟机 设置虚拟机网络 因是测试练习,这里设置为桥接模式 目标是自己电脑和创建...
  • CentOS7镜像qcow2下载

    2020-06-29 15:30:54
    CentOS7的镜像qcow2格式的下载,可以通过平台进行直接添加,也可用虚拟机平台软件安装添加,支持virtualbox,vmware Station等。
  • CentOS7 qcow2模板资源

    2020-09-27 11:11:23
    CentOS7 qcow2模板资源
  • 包含qcow2格式的镜像,无需自己重新制作,离线情况下制作镜像非常繁琐,镜像包括windows_server_2012_r2_x64.qcow2.tar win7.qcow2.tar.gz windows_server_2008_r2_x64.qcow2.tar virtio驱动 ubuntu14.04.3_server....
  • ubuntu16.04-arm64.qcow2

    2021-02-23 04:11:35
    ubuntu16.04-arm64.qcow2
  • 主要介绍了Linux QCOW2 和 ROW的详解及区别介绍的相关资料,需要的朋友可以参考下
  • Win-qcow2驱动

    2018-01-16 13:56:16
    制作qcow2模板的驱动,适用于Windows,网卡、IO驱动,openstack专用!!
  • 思科2层交换机模拟镜像,GNS3支持,亲测有效,Cisco IOSvL2。思科2层交换机模拟镜像,GNS3支持,亲测有效,Cisco IOSvL2
  • 制作openstack镜像win7.qcow2(centos/ubuntu/win镜像分享)-附件资源
  • nxosv-final.7.0.3.I7.9.qcow2

    2020-09-18 19:43:50
    nxosv-final.7.0.3.I7.9.qcow2 思科Nexus 9000v Linux KVM虚拟机系统镜像。 配置时设置8G内存,SATA磁盘驱动器,e1000网卡。
  • Cisco ASAv 991 . qcow2

    2018-03-06 17:40:25
    Cisco思科官方最新的ASAv虚拟机版防火墙 需导入到GNS3或EVE-ng使用 QEMU镜像
  • asav961.qcow2

    2019-12-25 22:38:13
    gns3 用qemu可以直接用,满足一般的实验。自己转化过的放心使用。网上一直很难找。希望帮到大家。
  • 配合limbo使用
  • cos-i386.qcow2

    2017-11-30 16:32:00
    这是一个微型Linux操作系统,占用看见很小,用于我的博客里安装一个小型虚拟机示例,本镜像结果修改,不需要联网即可运行
  • qcow2 总结

    2021-05-26 11:27:18
    1、qcow2文件分布 对内存不了解的可跳过此部分 MMU虚拟地址和物理地址,TLB(Translation Lookaside Buffer) 4k一个page,需要一个地址存放,4K-->4B,4G-->4MB,100万个页, 100个进程需要400M 将页表(一...


    1、qcow2文件分布

    对内存不了解的可跳过此部分
    MMU虚拟地址和物理地址,TLB(Translation Lookaside Buffer)
        4k一个page,需要一个地址存放,4K-->4B,4G-->4MB,100万个页, 100个进程需要400M
        将页表(一级页表)分为 1024 个页表(二级页表),每个表(二级页表)中包含 1024 个「页表项」
        页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,
            而二级分页则只需要 1024 个页表项
        二级分页再推广到多级页表
        专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer)

    qcow2文件数据和TLB类似,L1,L2和cluster表一起形成三级表
        目的:通过地址快速找到数据
        cluster表中每个条目存放用户数据,L2表条目存放cluster的地址,L1表条目存放L2表的起始地址,
        这里的地址指的是qcow2文件内的偏移,根据这个地址可以在qcow2文件内找到用户数据。


    2、结构
    qemu-5.1.0/block/qcow2.h
    typedef struct QCowHeader {
        uint32_t magic;        //QCOW magic string ("QFI\xfb")
        uint32_t version;    //Version number
        uint64_t backing_file_offset;    //backing file name
        uint32_t backing_file_size;        //less than 1024 bytes
        uint32_t cluster_bits;            //1 << cluster_bits is the cluster size, < 2M 
        uint64_t size; /* in bytes */    //Virtual disk size in bytes.
                                        //L1 table limit of 32MB, with 2M cluster 2Eb, 512 byte 128GB
                                        //L1/L2 layouts limit 64 PB
        uint32_t crypt_method;            //0 for no encryption, 1 for AES, 2 for LUKS
        uint32_t l1_size; /* XXX: save number of clusters instead ? */
                                        //Number of entries in L1 table
        uint64_t l1_table_offset;        //active L1 talbe starts, aligned to a cluster
        uint64_t refcount_table_offset;            //the refcount table starts, aligned to a cluster
        uint32_t refcount_table_clusters;        //Number of clusters that the refcount table occupies
        uint32_t nb_snapshots;            //Number of snapshots contained in the image
        uint64_t snapshots_offset;        //snapshot table starts

        /* The following fields are only valid for version >= 3 */
        uint64_t incompatible_features;            //
        uint64_t compatible_features;            //
        uint64_t autoclear_features;            //https://git.qemu.org/?p=qemu.git;a=blob;f=docs/interop/qcow2.txt

        uint32_t refcount_order;        //Describes the width of a reference count block entry
        uint32_t header_length;            //Length of the header structure in bytes

        /* Additional fields */
        uint8_t compression_type;        //0: zlib, 1: zstd

        /* header must be a multiple of 8 */
        uint8_t padding[7];                //
    } QEMU_PACKED QCowHeader;


    ###偏移地址计算(从客户机的磁盘设备虚拟偏移地址转换为宿主机的镜像文件中的真实偏移地址)
    Given an offset into the virtual disk, the offset into the image file can be obtained as follows:

    // 每个cluster包含的L2表个数
    l2_entries = (cluster_size / sizeof(uint64_t));

    // offset在L2中的索引
    l2_index = (offset / cluster_size) % l2_entries;

    // offset所属的L2在L1中的索引
    l1_index = (offset / cluster_size) / l2_entries;

    // 从L1中获取L2的起始地址”并加载到内存
    l2_table = load_cluster(l1_table[l1_index]);

    // 从offset所在的L2中获取所在簇的起始地址
    cluster_offset = l2_table[l2_index];

    // offset在镜像中的真实地址 = 簇起始地址 + 簇内偏移
    return cluster_offset + (offset % cluster_size);

    ###偏移地址所在簇的refcount获取
    每个cluster都含有2字节的引用计数表,每个表项描述一个“refcount块”的起始地址
    每个refcount块占用一个cluster,每个表项的大小为refcount_bit(qcow2必须为16)

    // 每个refcount块容纳的refcount表项个数
    refcount_block_entries = (cluster_size * 8 / refcount_bits)

    // offset所在的refcount块索引
    refcount_block_index = (offset / cluster_size) % refcount_block_entries

    // offset所在refcount块在refcount表中索引
    refcount_table_index = (offset / cluster_size) / refcount_block_entries

    // 加载offset所在的refcount块到内存
    refcount_block = load_cluster(refcount_table[refcount_table_index]);

    // 获得offset所在簇的refcount值
    return refcount_block[refcount_block_index];

    与操作->右移->与操作。直到最后找到顶级表的索引,这里的地址指的是qcow2文件内的偏移

    3、预分配(preallocation)策略

    旧版本,不准确
    preallocation setting    time to create        phy size
    off                        0.312s                196K
    metadata                0.507s                844K
    full                    39.402s                4.0G
    falloc                    0.015s                4.0G

    For this test each virtual disk is mounted and written to using dd

    preallocation setting    time to create        MB/s
    off                        184.23s                729kB/ s
    metadata                85.87s                1.6MB/ s
    falloc                    100.77s                1.3MB/ s
    full                    84.31s                1.6MB/ s

    4、计算

    镜像的大小计算 https://my.oschina.net/LastRitter/blog/1542075

    cluster_size -- 簇大小,默认为65536字节(64K)
    total_size -- 要分配的镜像大小
    refcount_bits -- refcount占用bit数,qcow2必须为16

    按字节对齐的镜像大小
    aligned_total_size = align_offset(total_size, cluster_size);

    Header 大小
    header_size = cluster_size;

    L2表项个数
    l2_num = aligned_total_size / cluster_size;
    l2_num = align_offset(l2_num, cluster_size / sizeof(uint64_t));

    L2表大小
    l2_size = l2_num * sizeof(uint64_t);

    L1表项个数
    l1_num = l2_num * sizeof(uint64_t) / cluster_size;
    l1_num = align_offset(l1_num, cluster_size / sizeof(uint64_t));

    L1表大小
    l1_size = l1_num * sizeof(uint64_t);

    每个refcount的大小,以及一个refcount块包含的refcount个数
    refcount_size = refcount_bits / 8;
    refcount_num = cluster_size / refcount_size;
        
        /* total size of refcount blocks
    *
    * note: every host cluster is reference-counted, including metadata
    * (even refcount blocks are recursively included).
    * Let:
    *   a = total_size (this is the guest disk size)
    *   m = meta size not including refcount blocks and refcount tables
    *   c = cluster size
    *   y1 = number of refcount blocks entries
    *   y2 = meta size including everything
    *   rces = refcount entry size in bytes
    * then,
    *   y1 = (y2 + a)/c
    *   y2 = y1 * rces + y1 * rces * sizeof(u64) / c + m
    * we can get y1:
    *   y1 = (a + m) / (c - rces - rces * sizeof(u64) / c)
    */

    refcount块个数
    refcount_block_num = (aligned_total_size + header_size + l1_size + l2_size) / 
    (cluster_size – refcount_size - refcount_size * sizeof(uint64_t) / cluster_size)

    refcount块大小
    refcount_block_size = DIV_ROUND_UP(refcount_block_num, refcount_num) * cluster_size;

    refcount表个数
    refcount_table_num = refcount_block_num / refcount_num;
    refcount_table_num = align_offset(refcount_block_num, cluster_size / sizeof(uint64_t));

    refcount表大小
    refcount_table_size = refcount_table_num * sizeof(uint64_t);

    总大小
    使用默认参数(簇大小为65526字节,8字节地址,refcount为16位,2字节),
    不考虑字节对齐,不考虑快照的情况下,镜像为10G的近似计算如下:

    t = total_size;
    c = cluster_size;
    header_size = c;
    l2_size = t/c * 8;
    l1_size = t/c / (c/8) * 8;
    rb_size = t/c * 2;
    rt_size = t/c / (c/2) * 8;
    image_size ≈ t + c + t/c * 8 + t/c / (c/8) * 8 + t/c * 2 + t/c / (c/2) * 8
            = t + c + t/c*10 + t/(c*c)*80
            ≈ 10G + 1.63M
    因此使用默认参数时,元数据的大小大概只占磁盘数据大小的0.02%不到。新分配快照时,
    初始需要的空间为当时的L1表大小,约为160字节,几乎可以忽略不计
    (在修改后,所需空间会大幅增长,具体跟写入的量有关)。


    5、 qcow2的引用计数表和引用计数块

    refcount table:引用计数表;refcount blocks:引用计数块。

    两张表只处理一个问题:cluster的引用计数。如果用一张表,表中每个条目记录一个cluster的引用计数,
    也可以达到目录,但两张表可以提高索引效率,与用L1,L2 ,cluster表存储用户数据的目的相同。

    引用计数块的每个条目存放了cluster的引用计数,引用计数表存放的是引用计数块的起始地址。

    qcow2为啥要记录cluster的引用计数?

    qcow2要实现快照这个高级特性,怎么实现?通过写时复制(cow),复制对象是cluster数据块。
    快照的普遍实现原理就是利用cow,在做快照时将cluster标记为只读,后续有写操作时先检查cluster是否只读,
    如果是就复制一份再写。所以必须有一个标记用来表明cluster是否是只读的,但仅仅是一个标记还不够,
    因为对同一个qcow2可能快照很多次,重复标记只读对删除快照没有帮助,删除快照时,对于做了多次快照的cluster,
    qcow2怎么知道哪些cluster需要被真正删除,哪些还在被其它快照引用呢?

    所以简单实用标记来记录只读属性没有用,因此qcow2引入了引用计数表和引用计数块,这两张表用来记录cluster的引用计数。

    cluster引用计数为0:这个cluster没有被使用。

    cluster引用计数为1:这个cluster正在被使用。

    cluster引用计数为2或者以上:这个cluster正在被使用,并且有快照包含了这个cluster,写这个cluster之前需要执行cow。

    有了引用计数这个基础功能,快照这个高级特性才得以实现。

    因此可以说,引用计数表和引用计数块是为了实现qcow2快照而设计的。


    6、快照

    复制一份L1表,将所有已被分配的L1和L2表项的最高位置位0,以及对应的refcount计数加1;

    在快照表中新分配个表项,把L1属性指向新创建的L1表,Header中的nb_snapshots加1;

    当向镜像写入数据时,对应的L1或者L2表项为0,对应的refcount大于或等于2,
    则需要重新分配对应的L2表项和簇,并让L1表项指向新的L2表,L2表项执行新分配的簇。

    簇分配(不预先分配时的算法,写入时进行分配,读取时不分配,直接填充0)

    当要向偏移地址offset处写入数据时,从Header的l1_table_offset中获得L1表的起始偏移地址;

    用前偏移地址offset的前“64 - l2_bits - cluster_bits“位作为索引从L1表中获取对应L2表的描述符
    (l2_bits为每个簇中保存的L2表项个数,cluster_bits为每个簇大小的比特数);

    如果L2表的表述符的最高位为0(未被分配或者是COW),则需要新分配L2表;

    从refcount表和refcount块中查找2块未被使用的簇,标记为1;

    初始化第一个簇为L2表,并使用它的起始地址初始化对应的L1表项;

    初始化第二个簇,并使用它的地址初始化对应的L2表项;

    使用第二个簇的首地址加上偏移地址的簇内偏移得出其真实地址;

    在此地址进行数据写入。

    展开全文
  • 30s制作qcow2镜像.tar.gz

    2020-09-07 17:24:26
    如何制作qcow2,但是是需要虚拟化环境的,需要的人慎重下载哦。如何制作qcow2,但是是需要虚拟化环境的,需要的人慎重下载哦。如何制作qcow2,但是是需要虚拟化环境的,需要的人慎重下载哦。如何制作qcow2,但是是...
  • iosxrv-k9-demo-6.0.1.qcow2

    2020-06-20 10:25:34
    IOS XRv supports the control plane features introduced in Cisco IOS XR.
  • asav9-12-2.qcow2

    2020-01-03 15:57:22
    ASAv9.12.2 支持GNS3模拟器、eve-ng模拟器等 镜像更新时间:02-Dec-2019
  • qcow2

    2016-12-01 19:40:00
    qemu-img命令可以用来创建qcow2镜像,或者将qcow2文件转换成raw格式文件,等其它功能:  $> qemu-img create -f qcow2 test.qcow2 4G  Formating 'test.qcow2', fmt=qcow2, size=4194304 kB  $> qemu-...

    qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:

    更小的空间占用,即使文件系统不支持空洞(holes);

    支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;

    支持快照(snapshot),镜像文件能够包含多个快照的历史;

    可选择基于 zlib 的压缩方式

    可以选择 AES 加密

     

    qemu-img命令可以用来创建qcow2镜像,或者将qcow2文件转换成raw格式文件,等其它功能:

      $> qemu-img create -f qcow2 test.qcow2 4G

      Formating 'test.qcow2', fmt=qcow2, size=4194304 kB

      $> qemu-img convert test.qcow2 -O raw test.img

     

    qcow2 镜像文件格式

    头部信息

    每一个 qcow2 文件都以一个大端(big-endian)格式的头开始,结构如下:

    typedef struct QCowHeader {

          uint32_t magic;

          uint32_t version;

     

          uint64_t backing_file_offset;

          uint32_t backing_file_size;

     

          uint32_t cluster_bits;

          uint64_t size; /* in bytes */

          uint32_t crypt_method;

     

          uint32_t l1_size;

          uint64_t l1_table_offset;

     

          uint64_t refcount_table_offset;

          uint32_t refcount_table_clusters;

     

          uint32_t nb_snapshots;

          uint64_t snapshots_offset;

      } QcowHeader;

    前 4 个比特包含了字符 Q,F,I,然后是 0xfb,实例中的 5146 49fb 是 magic 字段。

    接下来的 4 个比特包含了该镜像文件的版本号,实例中的 0000 0002 是 version 字段,代表使用的是 qcow2 版本。

    当前存在两种版本的格式,版本1和版本2。

     

    backing_file_offset 占用 8 个字节,实例中 0000 0000 0000 0000,给出相对于qcow2文件起始位置的偏移,指出一个字符串的位置,该字符串为backing file文件的绝对路径。该字符串为backing file文件的绝对路径。由于该字符串不是以'\0'结束,所以backing_file_size指出字符串的长度。如果当前镜像是一个copy-on-write镜像,则存在backing file文件,否则没有;

     

    backing_file_size 给出了一个不以 null 结尾的字符串的长度,实例中为 0000 0000。如果这个镜像文件是一个写时拷贝的,那么它是原始文件的路径。

     

    cluster_bits,32 位(0000 0010),描述了如何映射一个镜像的地址到一个本地文件,它决定了在一个 cluster 中,偏移地址的低位是如何作为索引的。因为 L2 表占用了一个单独的 cluster 并且包含 8 字节的表项(entry),所以 cluster_bits 只有不足 3 个位,作为 L2 表的索引。

     

    接下来的 size ,8 字节代表了该镜像文件所表示的块设备的大小,单位字节;实例中为 0000 0002 8000 0000 字节,也就是 10G 的空间。

     

    crypt_method 如果为 1 代表使用 AES 加密,0表示没有加密。

     

    l1_size(0000 0014)和 l1_table_offset(0000 0000 0003 0000::)分别给出了 L1 表大小和偏移量。

     

    refcount_table_offset 给出 refcount 表的偏移量(0000 0000 0001 0000)而 refcount_table_clusters 描述了以 cluster 为单位的 refcount 表的大小(0000 0001)。

     

    nb_snapshots 给出了该镜像包含的快照数量(0000 0000), snapshots_offset 给出每个快照到 QCowSnapshotHeader 的偏移量(0000 0000 0000 0000),每个快照都会有这样一个header。

     

    一个典型的 qcow2 镜像文件包含一下几部分:

    上文中提到的头部信息

    L1 表

    refcount 表,仍然是簇对齐的

    一个或者多个 refcount 块

    快照头,第一个header要求簇对齐,之后的header要求8字节对齐;

    L2 表,每一个table占据一个单独的cluster;

    数据 cluster

    L2 表,每一个table占据一个单独的cluster;

    数据 cluster

     

     

    2 级查找

    在 qcow2 中,磁盘的内容是保存在 cluster 中(每个 cluster 包含一些大小为 512 字节的扇区)。为了找到给定地址所在的 cluster,我们需要查找两张表,L1->L2。L1 表保存一组到 L2 表的偏移量,L2 表保存一组到 cluster 的偏移量;

    所以一个地址要根据 cluster_bits(64 位)的设置分成 3 部分,比如说 cluster_bits=12;

    低 12 位是一个 4Kb cluster 的偏移(2 的 12 次方=4Kb);

    接下来 9 位是包含 512 个表项目的 L2 表;

    剩下 43 位的代表 L1 表偏移量。

    注意,L1 table的最小值,可以通过给定磁盘镜像的大小来计算,公式如下:

    l1_size = round_up(disk_size / (cluster_size * l2_size), cluster_size)

     

    为了获取一个给定地址(64 位)的偏移位置:

    从 Head 域中的 l1_table_offset 取得 L1 表的地址

    用前(64-l2_bits-cluster_bits)位地址去索引 L1 表

    在 L1 表中的偏移量获得 L2 表的地址

    用地址中的接下来的 l2_bits 去索引 L2 表,获得一个 64 位的表项

    用 L2 表中的偏移量获得 cluster 的地址

    用地址中剩下的 cluster_bits 位去索引该 cluster,获得该数据块

    如果 L1 表和 L2 表中的偏移量都是空,这块区域就尚未被镜像文件分配。

    注意 L1 表和 L2 表中的偏移量的前两位被保留,用做表示'copied' 或'compressed'。

     

     

    引用计数

    每一个cluster都有一个引用计数,cluster可以被删除,但前提条件是没有任何快照再使用这个cluster。

     

    针对每一个cluster的2个字节的引用计数,存放在cluster sized blocks。通过refcount_table_offset字段可以获取到refcount table的位置,refcount_table_clusters字段给出refcount table的大小(单位为cluster),refcount table给出了这些refcount blocks在镜像文件中的偏移地址。

    为了获取一个给定的cluster的引用计数,你需要将cluster offset划分成refcount table offset和refcount block offset。一个refcount block是一个单独的cluster,这个cluster里包含了若干个2字节的项,低(cluster_size -1)位作为block offset,剩余的位作为table offset。

    qcow2有一个优化处理,任何一个L1或L2表项指向的cluster的引用计数为1,则L1/L2表项的最高有效位被置上“copied”标记。这表明没有快照在使用这个cluster,所以这个cluster可以马上写入数据,而不需要复制一份给快照使用。

     

     

    Copy-on-Write 镜像文件

    qcow2 镜像可以用来保存另一个镜像文件的变化,它并不去修改原始镜像文件,只记录与原始镜像文件的不同即可,这种镜像文件就叫做 copy-on-write 镜像。虽然是一个单独的文件,但它的大部分的数据都来自原始镜像,只有跟原始镜像文件相比有变化的 cluster 才会被记录下来。

    这很容易去实现,在头部信息中记录原始文件路径即可。当需要从一个 copy-on-write 镜像文件中读取一个 cluster 的时候,首先检查这块区域是否已经在该镜像文件中被分配,如果没有就从原始文件读取。

     

    快照

    快照有些类似 Copy-On-Write 文件,但区别是快照是一个可写的。快照就是原始文件本身(内部快照)。它既包含做快照之前的原始文件部分,它本身也包含可写的部分。

    每一个快照都包含如下的头部结构:

      typedef struct QCowSnapshotHeader {

          /* header is 8 byte aligned */

          uint64_t l1_table_offset;

     

          uint32_t l1_size;

          uint16_t id_str_size;

          uint16_t name_size;

     

          uint32_t date_sec;

          uint32_t date_nsec;

     

          uint64_t vm_clock_nsec;

     

          uint32_t vm_state_size;

          uint32_t extra_data_size; /* for extension */

          /* extra data follows */

          /* id_str follows */

          /* name follows  */

      } QcowSnapshotHeader;

    各字段介绍如下:

    快照有名字和ID,都是字符串,id_str_size,name_size给出字符串长度,字符串紧接在QCowSnapshotHeader后面;

    快照至少有原来的L1 table的副本,其通过l1_table_offset和l1_size来定位;

    在快照被创建的时候,qemu会调用gettimeofday(),快照时间被保存在date_sec和date_nsec字段中;

    vm_clock_nsec给出VM clock当前的状态;

    vm_state_size表示作为快照的一部分被保存的虚拟机状态的大小。这个状态被保存在原来L1 table的位置,直接在镜像header的后面;

    extra_data_size表示在QCowSnapshotHeader之后的扩展数据的长度,不包括id和name字符串。这一段扩展数据是留给以后用的。

    创建一个快照,就会添加一个QCowSnapshotHeader,然后复制一份L1 table,同时会增加所有L2 table和数据clusters的被L1 table引用的引用计数。打完快照之后,如果任何在这个镜像中的L2 table或者data clusters被修改了——也就是,如果一个cluster的引用计数大于1,且"copied"标记被置上了——qemu则会先复制一份这个cluster,然后再写入数据。就这样,所有的快照都不会被修改。

     

    qcow2 的其他特性

    qcow2 支持压缩,它允许每个簇(cluster)单独使用 zlib 压缩。它也支持使用 128 位的 AES 密钥进行加密。

    qcow2镜像格式支持压缩特性,其允许每一个cluster独立的通过zlib进行压缩。

     

    /*cluster offset表示一个簇在qcow2文件中的偏移,其最高的2位是标记位*/

    从L2 table中获取cluster offset的流程如下:

    如果cluster offset的第二最高有效位是1,则这是一个被压缩的cluster;

    cluster offset中之后的cluster_bits - 8 位是这个压缩过的cluster的大小,单位是sectors;

    cluster offset剩余的位是压缩的cluster在文件中的实际偏移地址。

     

    加密

    qcow2格式,也支持针对cluster的加密。

    如果QCowHeader中的crypt_method字段被置为1,则会采用一个16个字符的密码作为128位AES key。

    每一个Cluster中的每一个sector都是通过AES密码块链接模式来单独加密,采用sector的偏移地址(小端模式)来作为128位初始化向量的头64位。

     

    qcow镜像——上一代镜像

    qcow2格式相对于qcow格式的不同点有:

    支持快照的概念,qcow只支持增量镜像;

    在qcow2中,引入了cluster的引用计数的概念;引用计数也被用来支持快照;

    在qcow2中,L2 table将一直占一个单独的cluster; 之前,是通过QCowHeader中的l2_bits来确定的;

    压缩的cluster的大小,现在单位为sector,之前是字节。

     

    转载于:https://my.oschina.net/dubenju/blog/798443

    展开全文
  • 使用qcow2图像和模板在Proxmox上轻松安装OKD的脚本。 该脚本将帮助部署okd 4.5集群的3个节点 要求 Proxmox 6.x 足够的资源 CPU:16 vcpu(至少12vcpu,每个主节点4个) 内存:64 GB(32GB应该可以) 磁盘:500 ...
  • TiMOS-SR-13.0.qcow2

    2020-06-20 09:57:14
    The Alcatel-Lucent 7750 Service Router (SR) portfolio is a suite of multiservice edge routing platforms that deliver high performance, service richness, and creates exceptional value for networking in...
  • qcow2文件的snapshot管理

    2020-01-18 17:43:23
    qcow2是qemu虚拟机中特别常用的镜像文件格式,QCOW即Qemu Copy-On-Write写时拷贝,后面的2即为版本,因为在qcow2出现之前还有qcow格式的镜像文件。从字面上理解,qcow/qcow2的文件组织形式应该是建立在Copy-On-Write...

    qcow2是qemu虚拟机中特别常用的镜像文件格式,QCOW即Qemu Copy-On-Write写时拷贝,后面的2即为版本,因为在qcow2出现之前还有qcow格式的镜像文件。从字面上理解,qcow/qcow2的文件组织形式应该是建立在Copy-On-Write这个基本的机制上,即当某个数据块被引用多次(两次或两次以上)时,若某个实例尝试写该数据块,为了不让其他实例看到该数据块的变化,就会将该数据块拷贝一份,然后将修改生效到拷贝的数据块上。这个机制和内存的Copy-On-Write的机制是基本一致的。

    qcow2镜像文件组织结构

    qcow2镜像文件以固定大小的单元组成,每个单元称作cluster,每个cluster在物理磁盘中都是连续分布的,便于数据的读取和写入。cluster的大小即为虚拟机看到的虚拟磁盘基本单元大小,类似于机械硬盘的sector大小,一个cluster可能对应一个sector或者连续多个sector,取决与cluster size和sector size的比例。

    虚拟磁盘的数据被拆分为一个个cluster,然后这些cluster用一个二级索引表组织起来,第一级称作L1 Table,第二级称作L2 Table,其组织形式如下所示:

    其中L1 Table的大小可变,可能只占用一个cluster,也可能占用多个连续的cluster,L1 Table的大小在虚拟磁盘创建的那一刻就已经决定,并且在cluster大小相同的情况下,虚拟磁盘的大小越大,L1 Table的size也越大。每个L2 Table则固定占用一个cluster,不同的L2 Table不需要放在相邻的cluster上。L1 Table和L2 Table中每个entry的大小为64bit,因为以目前的磁盘容量来看,64bit的地址已经能够完全满足寻址需求了。

    另外,由于qcow2文件支持在文件内部建立snapshot(在文件外建立snapshot即为差分文件),故需要对每个cluster的使用进行记录,即需要记录下每个cluster被引用的次数,这样当某个snapshot被删除的时候,才能够知道哪些cluster可以释放出来继续使用,哪些cluster还在被使用,主机不能主动修改。为了维持对cluster引用次数的记录,qcow2文件中同样使用一个二级的页表来记录所有cluster的引用计数,如下图所示:

    recfound table为第一级表,refcount block为第二级表,refcount table的大小是可变的,并且需要占用连续的cluster。在cluster size大小一样的情况下,虚拟机磁盘的容量越大,refcount table的大小也越大,就像L1 Table一样。每个refcount block占用一个cluster,并且不同的refcount block不需要占用连续的cluster。refcount block中,每个entry的大小是可以设置的,不一定是类似L2 Table的64bit,默认是16bit,因为每个entry只是一个简单的计数,没必要使用64bit,浪费空间。

    L1 Table和refcount table的索引入口都在qcow2文件的头一个cluster中。qcow2镜像文件的第一个cluster即为qcow2镜像文件的头部,该头部包含了许多重要的信息,其定义位于qemu源码的block/qcow2.h头文件中。

    主要包括:

    • magic: QCOW magic字符串("QFI\xfb")
    • backing_file_offset,该qcow2镜像文件的base文件名字在该qcow2文件中存放的位置。如果该qcow2文件没有base文件,则该offset为0。
    • cluster_bits,即用于定位一个cluster内某个字节数据所需要用到的地址位数,如cluster的大小为512B,则cluster_bits为9,若cluster的大小为4KB,则cluster_bits为12。
    • size,即为虚拟磁盘的大小
    • l1_size,表示L1 table中entry的个数
    • l1_table_offset,表示存放L1 table的cluster在qcow2文件中的位置。
    • refcount_table_offset,在该qcow2文件中refcount table所存放的位置。
    • refcount_table_clusters,用于表示refcount table的大小,即占用的cluster个数。
    • nb_snapshot,即该qcow2文件中,存在的snapshot的个数。
    • snapshot_offset,即存放snapshot的cluster在qcow2文件中的位置。

    qcow2镜像文件snapshot管理

    qcow2文件第一个cluster中定义的l1_table_offset、l1_size、refcount_table_offset/clusters定义了L1 Table和refcount table的入口地址和大小,qcow2程序就可以通过该入口找到虚拟磁盘中的所有数据了。另外头部中还提供了nb_snapshot和snapshot_offset,这两个区域定义了该qcow2文件中存在的snapshot个数和存放snapshot所在的cluster位置。

    snapshot本质上其实是qcow2文件对应的虚拟磁盘的不同入口,即不同的L1 Table,不同的snapshot对应不同的L1 Table,根据Copy-On-Write的基本管理机制,当不同的L1 Table引用相同的L2 Table时,它们将共用一份物理磁盘上的L2 Table,但是若通过L1 Table对对应的L2 Table进行修改时,将会触发L2 Table进行拷贝和修改,使得不同的L1 Table使用不同的L2 Table,所以不同的snapshot只需要维护不同的L1 Table,不需要单独对L2 Table进行维护。另外,一个qcow2镜像文件中,所有的snapshot将会共用同一个refcount table和refcount block页表。

    每个snapshot table entry的格式如下所示:

    对qcow2文件中snapshot的管理对应到qemu-img snapshot命令,snapshot命令支持创建(-c)、删除(-d)、罗列(-l)和应用(-a)的操作。

    • 创建,其底层操作就是将当前使用的L1 Table拷贝一份到新分配的一个或多个连续的cluster中,然后将该新拷贝的L1 Table的地址更新到qcow2头部snapshot_offset指向的snapshot table中。
    • 删除,其底层操作就是将指定snapshot对应的L1 Table删除掉,并且更新snapshot table对应的entry。
    • 罗列,即将snapshot中存放的所有snapshot列出来。
    • 应用,即将指定的snapshot对应的L1 Table更新到qcow2文件头中,若不先将当前qcow2文件header中的L1 Table进行保存,就会造成部分的数据丢失。

    另外,还需要特别注意的是,在对snapshot进行管理的同时,一个特别重要的工作就是对qcow2文件中各个cluster的引用计数进行更新,也就是对refcount table和refcount blocks进行更新,snapshot创建时,需要对应L1 Table所能索引到的cluster的引用计数都加1,而删除snapshot,则将相应的引用计数减1,当引用计数为0时,则表示该cluster没有被使用。

    更新引用计数时,由于L1 Table和L2 Table中,并非所有的entry都是有效的(当虚拟机使用磁盘时,未使用到某个cluster对应的磁盘位置时,qcow2并不会对该cluster分配相应的物理磁盘空间,这也就为什么qcow2文件该开始创建的时候很小(1MB以下),而使用的时候慢慢增加),所以qemu需要遍历整个L1 Table和所有的L2 Table,找出所有有效的entry,然后将相应entry对应的cluster引用计数更新到refcount table和refcount block中,相当于进行snapshot管理(除罗列操作)的时候,将需要遍历L1 Table、所有有效的L2 Table、refcount table和所有有效的refcount block。极端情况下,对snapshot进行管理的时候,cluster的大小将会对snapshot操作的耗时产生比较大的影响,甚至相差两个数量级。

    例如:同样针对40GB大小的虚拟磁盘

    • 若cluster的大小为默认的64KB,则一个L2 Table将包含64KB/8B=8K个entry,每个entry可以记录一个cluster,所以一个L2 Table可以覆盖64KBx8K=512MB的磁盘空间,虚拟磁盘大小为40GB,则需要40GB/512MB=80个L2 Table,即L1 Table需要80个entry,一个cluster即可覆盖。所以需要64KB的L1 Table和80x64K=5120KB,即大概5MB的L2 Table。
    • 若cluster的大小为4KB,则一个L2 Table将包含4KB/8B=512个entry,每个entry可以记录一个cluster,所以一个L2 Table可以覆盖4KBx512=2MB的磁盘空间,虚拟磁盘大小为40G,则需要40GB/2MB=20K个entry,即20K个L2 Table,20K个L1 Table entry将需要占用20K/512=40个cluster,即单纯L1 Table就需要占用40个cluster,即40x4KB=160KB的磁盘空间,而若所有L2 Table都有效,则需要20Kx4KB=80MB的磁盘空间。

    所以64KB cluster size和4KB cluster size对应的L1 Table、L2 Table综合大概是5MB和80MB,更要命的是,这5MB是以64KB大小为单位散落在磁盘中,而80MB则是以4KB大小为单位散落在磁盘中,在一个普通的SSD上,4KB大小的随机读写速度就只有25MB/s和7MB/s,而64KB大小的随机读写则是89MB/s和30MB/s。综合起来,两者snapshot操作的耗时差一两个数量级就能解释得通了。

    所以,若对snapshot操作的性能有要求的话,需要特别注意qcow2文件的cluster大小,该大小可以在qcow2镜像文件时通过-o选项设置,如

    qemu-img create -f qcow2 -o cluster_size=16K test.img 40G

    最后,qcow2程序中,为了加快程序对镜像文件的访问,其实会将L1 Table和refcount table一直存放在内存中,因为这两个表比较小,而且会频繁访问,而针对L2 Table和refcount block,则会建立一个cache机制,该cache会将最近访问到的L2 Table和refcount block放到内存中,从而加快对镜像文件的访问。L2 Table和refcount block的cache大小并不是在创建镜像文件时,通过qemu-img的参数来设定,而是通过qemu的-drive参数来确定,即可以根据虚拟机的运行环境进行设置,如下所示(具体可以参考说明文档docs/qcow2-cache.txt):

    展开全文
  • 虚拟机可用的飞塔防火墙 此为qemu镜像 可导入GNS3使用
  • KVM - qcow2 和 raw 格式对比

    千次阅读 2020-06-28 15:03:47
    以下内容主要介绍 KVM 中最常见的 RAW 和 QCOW2 镜像格式以及一些准备知识,分别说明并加以对比 准备知识 ls 和du的区别 ls - list directory contents du - estimate file space usage 通过man手册可以看出du命令...

    以下内容主要介绍 KVM 中最常见的 RAW 和 QCOW2 镜像格式以及一些准备知识,分别说明并加以对比

    准备知识

    lsdu的区别

    • ls - list directory contents
    • du - estimate file space usage

    通过man手册可以看出du命令查看的是磁盘空间占有数,而ls展示的是文件的一些相关属性。而在Linux中,一个文件占用的磁盘大小和一个文件的大小在众多情况下并不相等,下面通过示例来更清晰的说明。

    # 创建一个13k的文件
    [root@suhw ~]# dd if=/dev/zero of=output count=1 bs=13k
    1+0 records in
    1+0 records out
    13312 bytes (13 kB, 13 KiB) copied, 0.00014904 s, 89.3 MB/s
    
    # 通过 ls 查看文件大小
    [root@suhw ~]# ls -lh output
    -rw-r--r-- 1 root root 13K Jun 28 02:34 output
    
    # 查看文件所占用磁盘大小
    [root@suhw ~]# du -h output
    16K     output
    
    # 查看详细文件信息
    [root@suhw ~]# stat -f output
      File: "output"
        ID: 8ff451b39f9a1bcf Namelen: 255     Type: ext2/ext3
    Block size: 4096       Fundamental block size: 4096
    ...
    

    在上面例子中,先创建了一个13k的文件,通过ls查看文件大小为13k,而通过du查看变成了16k,是因为占用空间取决于文件系统的块(block)的大小,linux一般默认为4k(4096bytes)。所以一个大小为1bytes的文件,最小也要占用4k,例子中13k的文件所占用的空间就是 13 / 4 = 3.25 个block,通常一个block只能被一个文件系统占用,因为实际占用就是4 blocks,就是16k。


    创建指定大小的文件

    在日常开发过程中可能会遇到需要快速创建指定大小文件的场景,其中可能就需要用到文件空洞等概念,常用的命令有以下三个。


    truncate

    用法

    truncate 选项... 文件...

    作用

    将文件缩减或扩展至指定大小。如果指定文件超出指定大小则超出的数据将丢失。
    如果指定文件小于指定大小则用0 补足。(同样形成文件空洞,不会真实文件对应得改变磁盘大小)

    常用操作

    -s, --size=大小 。size后的数字若不指定单位则默认为字节数,也可指定KB/MB...等单位。

    指定大小也可使用以下前缀修饰:

    • “+” 增加,"-" 减少,"<" 至多,">" 至少,
    • “/” 小于等于原尺寸数字的指定数字的最小倍数,"%" 大于等于原尺寸数字的指定数字的最大倍数。

    示例:

    [root@suhw ~]# ls -lh test
    -rw-r--r-- 1 root root 29 Jun 28 09:56 test
    [root@suhw ~]# du -h test
    4.0K    test
    [root@suhw ~]# truncate -s 2M test
    [root@suhw ~]# ls -lh test
    -rw-r--r-- 1 root root 2.0M Jun 28 10:00 test
    [root@suhw ~]# du -h test
    4.0K    test
    

    dd

    作用

    dd命令用于读取、转换并输出数据。

    详细得用法可自行搜索,以下只介绍关于创建大文件相关的部分


    常用参数
    参数作用
    if=file输入文件名,缺省为标准输入。 从file读取,如if=/dev/zero
    of=file输出文件名,缺省为标准输出。 向file写出,可以写文件,可以写裸设备。如of=/dev/null
    ibs=bytes一次读入 bytes 个字节(即一个块大小为 bytes 个字节)
    obs=bytes一次写 bytes 个字节(即一个块大小为 bytes 个字节)
    bs=bytes同时设置读写块的大小为 bytes
    seek=blocks从输出文件开头跳过 blocks 个块后再开始复制
    count=blocks仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数

    示例

    1、不进行偏移,真实占用磁盘空间

    下述命令相当于从/dev/zero中拷贝一个块大小为1G的数据到dd_test文件中

    [root@suhw ~]# dd if=/dev/zero of=dd_test count=1 bs=1G
    1+0 records in
    1+0 records out
    1073741824 bytes (1.1 GB) copied, 5.67934 s, 189 MB/s
    [root@suhw ~]# ls -lh dd_test
    -rw-r--r-- 1 root root 1.0G Jun 28 11:07 dd_test
    [root@suhw ~]# du -h dd_test
    1.1G    dd_test
    

    2、使用文件偏移,形成文件空洞

    若使用seek进行文件偏移,则就会形成文件空洞。

    下述命令相当于从/dev/zero中拷贝一个块大小为4M的数据到dd_test文件中,但先需要跳过输出文件开头的1000个大小为4M的块。所以只拷贝了1*4M个字节大小的内容到dd_seek中(1*4*1024*1024=4194304 bytes),但是由于偏移了1000*4M个字节,导致 ls-lh查看变成了4G

    [root@suhw ~]# dd if=/dev/zero of=dd_seek count=1 bs=4M seek=1000
    1+0 records in
    1+0 records out
    4194304 bytes (4.2 MB) copied, 0.0115562 s, 363 MB/s
    [root@suhw ~]# ls -lh dd_seek
    -rw-r--r-- 1 root root 4.0G Jun 28 11:09 dd_seek
    [root@suhw ~]# du -h dd_seek
    4.0M    dd_seek
    

    注:使用dd对磁盘操作时,最好使用块设备文件。


    fallocate

    fallocate命令可以为文件预分配物理空间。-l后接空间大小,默认单位为字节。也可后跟k、m、g、t、p、e来指定单位,分别代表KB、MB、GB、TB、PB、EB。

    [root@suhw ~]# fallocate -l 1G test_file
    
    [root@csmp-standalone ~]# ll
    -rw-r--r--  1 root root 1073741824 Jun 24 21:41 test_file
    
    # 查看文件占用磁盘大小
    [root@csmp-standalone ~]# du -h test_file
    1.1G    test_file
    

    文件空洞

    UNIX文件操作中,文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,从而形成空洞文件,位于文件中但没有写过的字节都被设为 0。


    文件空洞的表现

    空洞文件在文件系统上表现的还是和普通文件相同,但是实际上文件系统并没有为空洞文件分配与逻辑大小相同的磁盘空间大小

    # 创建一个4M大小得空洞文件
    [root@suhw ~]# dd if=/dev/zero of=test bs=1 count=0 seek=4M
    0+0 records in
    0+0 records out
    0 bytes (0 B) copied, 0.000332336 s, 0.0 kB/s
    
    # 查看文件大小
    [root@suhw ~]# ls -lh test
    -rw-r--r-- 1 root root 4.0M Jun 24 17:23 test
    
    #查看占用磁盘大小
    [root@suhw ~]# du -h test
    0       test
    

    文件空洞作用

    • 迅雷下载文件时,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载的时候如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,此时就会出问题。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。
    • 在创建虚拟机的时候,我们会使用img工具生成一个例如50GB大小的镜像文件,但是其实在安装完系统之后,镜像的大小可能只有4GB,也就是说img并不会马上就占用掉物理存储空间的50GB,而是在未来使用过程中不断增加的。

    稀疏文件

    稀疏文件,这是UNIX类和NTFS等文件系统的一个特性。稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,这些多余得空间并不分配对应的磁盘块。可以参考下图了解

    image-20200624152406451

    优势

    它分配的存储空间只在需要时使用,这样节省了磁盘空间,并且可以创建很大的文件,即使文件系统中的可用空间不足。这也减少了首次写入的时间,因为系统不会分配“跳过”的空间。如果初始分配需要写入全零到空间,这也使得系统不必写入两次。


    镜像格式

    kvm虚拟机中需要选择磁盘镜像的格式,通常的选择就是RAW格式和QCOW2格式。


    qcow2

    介绍

    QCOW2(qemu copy on write 2) 格式包含一些特性,包括支持多重快照,占用更小的存储空间(不支持稀疏特性,也就是不会预先分配指定 size 的空间),可选的 AES 加密和可选的 zlib 压缩方式。

    qcow2是kvm支持的磁盘镜像格式,我们创建一个100G的qcow2磁盘之后,无论用ls来看,还是du来看,都是很小的。这说明了,qcow2本身会记录一些内部块分配的信息的。


    特性

    与普通的 raw 格式的镜像相比,有以下特性:

    1. 更小的空间占用,即使文件系统不支持空洞(holes);
    2. 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
    3. 支持快照(snapshot),镜像文件能够包含多个快照的历史;
    4. 可选择基于 zlib 的压缩方式
    5. 可以选择 AES 加密


    raw

    RAW 的原意是「未被加工的」, 所以 RAW 格式镜像文件又被称为 原始镜像裸设备镜像, 从这些称谓可以看出, RAW 格式镜像文件能够直接当作一个块设备, 以供 GuestOS 使用. 也就是说 KVM 的 GuestOS 可以直接从 RAW 镜像中启动, 就如 HostOS 直接从硬盘中启动一般。至于文件里面的空洞,则是由宿主机的文件系统来管理的,linux下的文件系统可以很好的支持空洞的特性,所以,如果你创建了一个100G的raw格式的文件,ls看的时候,可以看到这个文件是100G的,但是用du 来看,这个文件会很小。


    优点

    • 使用 dd 指令创建一个 File 就能够模拟 RAW 镜像文件
    • 性能较 QCOW2 要更高
    • 支持裸设备的原生特性, 例如: 直接挂载
    • 能够随意转换格式, 甚至作为其他两种格式转换时的中间格式
    • 能够使用 dd 指令来追加 RAW 镜像文件的空间

    缺点

    • 由于支持文件空洞,所以ls查看时文件很大,在scp传输时会消耗很多网络io。所以传输时可通过qemu-img convert转为qcow2再进行传输

    占用空间示例

    首先分别创建大小为10G的 raw 和 qcow2格式的镜像

    [root@suhw ~]# qemu-img create -f qcow2 qcow2-image.qcow2 2G
    Formatting 'qcow2-image.qcow2', fmt=qcow2 size=2147483648 cluster_size=65536 lazy_refcounts=off refcount_bits=16
    
    [root@suhw ~]# qemu-img create -f raw raw-image.raw 2G
    Formatting 'qcow2-image.raw', fmt=raw size=2147483648
    
    

    对比两个镜像文件发现,raw格式的文件没有占用磁盘文件(空洞文件),qcow2的文件占用约200k,同时占用了约400块block

    [root@suhw ~]# ls -lh *-image*
    -rw-r--r-- 1 root root 193K Jun 28 02:14 qcow2-image.qcow2
    -rw-r--r-- 1 root root 2.0G Jun 28 02:14 raw-image.raw
    
    [root@suhw ~]# du -h *-image*
    196K    qcow2-image.qcow2
    0       raw-image.raw
    
    
    [root@suhw ~]# stat qcow2-image.qcow2
      File: 'qcow2-image.qcow2'
      Size: 196640          Blocks: 392        IO Block: 4096   regular file
    ...
    
    [root@suhw ~]# stat raw-image.raw
      File: 'raw-image.raw'
      Size: 2147483648      Blocks: 0          IO Block: 4096   regular file
    ...
    


    镜像格式转换

    QEMU 中提供的 qemu-img 工具可用于镜像的一些常用操作,其中就包含镜像格式的转换。

    转换的命令如下:

    qemu-img convert -f qcow2 -O raw /tmp/test.qcow2 /tmp/test.raw -p
    

    参数介绍

    • -p 显示转换过程
    • -f 原始格式
    • -O 要输出的格式

    rawqcow2 也同理,只需要更换参数顺序和文件

    qemu-img convert -f raw -O qcow2 centos.raw centos.qcow2
    

    参考

    • https://yq.aliyun.com/articles/237275

    • https://www.aikaiyuan.com/8277.html

    • https://banbanpeppa.github.io/2019/08/21/linux/holefile/

    展开全文
  • 2 安装了cloud init 3 支持磁盘根据flavor指定的大小动态调整 flavor分配的磁盘至少应大于10G 4 系统默认使用本地局域网的YUM源 如果你们的openstack环境中没有本地YUM源 请删除 etc yum repos d 下的repo文件 ...
  • KVM环境部署与使用(附导入qcow2镜像及修改qcow2镜像密码)
  • 使用来自 kickstart 文件和最小 iso 的打包程序构建云就绪 qcow2 映像 打包器: ://www.packer.io 这是打包器模板的改编版和一个简单的 kikstart 来生成 openstack 云图像。 实际上它生成了一个 qcow2 云就绪镜像,...
  • 2 安装了cloud init 3 支持磁盘根据flavor指定的大小动态调整 flavor分配的磁盘至少应大于10G 4 系统默认使用本地局域网的YUM源 如果你们的openstack环境中没有本地YUM源 请删除 etc yum repos d 下的repo文件 ...
  • QCOW2镜像格式

    千次阅读 2020-04-01 11:33:15
    QCOW2镜像格式是Qemu支持的磁盘镜像格式之一。它可以使用一个文件来表示一个固定大小的块设备。与Raw镜像格式相比,QCOW2具有如下优点: 更小的文件大小,即便不支持holes(稀疏文件)的文件系统同样适用 支持写时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,929
精华内容 5,971
关键字:

qcow2