精华内容
下载资源
问答
  • 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):

    展开全文
  • qcow2文件分析

    千次阅读 2018-10-29 14:39:27
    A qcow2 virtual disk contains an image header, a twolevel lookup table, a reference table, and data clusters, as shown in Figure 1. The image header resembles the superblock of a file system, which...

    A qcow2 virtual disk contains an image header, a twolevel lookup table, a reference table, and data clusters, as shown in Figure 1. The image header resembles the superblock of a file system, which contains the basic information of the image file such as the base address of the lookup table and the reference table. The image file is organized at the granularity of cluster, and the size of the cluster is stored in the image header. The lookup table is used for address translation. A virtual block address (VBA) a in the guest VM is split into three parts, i.e., a=(a1, a2, a3): a1 is used as the L1 table’s index to locate the corresponding L2 table; a2 is used as the L2 table’s index to locate the corresponding data cluster; a3 is the offset in the data cluster. The reference table is used to track each cluster used by snapshots. The refcount in reference table is set to 1 for a newly allocated cluster, and its value grows when more snapshots use the cluster.

    The process of writing some new data to a virtual disk includes following steps:
    1 Look up the L1 table to get the offset of the L2 table.

    2 If the L2 table is not allocated, then set the corresponding reference table entry to allocate a cluster for the L2 table, and initialize the new L2 table.

    3 Update the L1 table entry to point to the new L2 table if a new L2 table is allocated.

    4 Set the reference table to allocate a cluster for data.

    5 Write the data to the new data cluster. 6 Update the L2 table entry to point to the new data cluster.
    Note that, each step in the whole appending process should not be reordered; otherwise, it may cause metadata inconsistency.

    The organization of qcow2 format requires extra efforts to retain crash consistency such that the dependencies between the metadata and data are respected. For example, a data cluster should be flushed to disk before updating the lookup table; otherwise, the entry in the lookup table may point to some garbage data. The reference table should be updated before updating the lookup table; otherwise, the lookup table may point to some unallocated data cluster.
    We use two simple benchmarks in QEMU-2.1.2 to compare the number of sync operations in the guest VM and the host:

    1) “overwrite benchmark”, which allocates blocks in advance in the disk image (i.e., the qcow2 image size remains the same before and after the test);

    2)“append benchmark”, which allocates new blocks in the disk image during the test (i.e., the image size increases after the test). The test writes 64KB data and calls fdatasync every 50 iterations. We find that the virtual disks introduce more than 3X sync operations for qcow2 and 4X for VMDK images, as shown in Figure 2.As shown in Figure 3, a fdatasync of the user  pplication can cause a transaction commit in the file system. This requires two flushes (in guest VM) to preserve its atomicity, which are then translated into two set of writes in QEMU. The first write puts the data and the journal metadata of the VMto the virtual disk, which in the worst case, causes its size to grow.
    To grow the virtual disk in QEMU, a data block must be allocated, and the corresponding reference table block should be set strictly before other operations. This necessitates the first flush. After that, the L2 data block must be updated strictly before the remaining operations. This necessitates the second flush. (In some extreme cases where the L1 data block should be updated as well, it introduces even more flushes). The third flush is used to update the base image’s reference table. When creating a new image based on the base image, the refcount in the reference table of the base image will be increased by one to indicate that another image uses the base image’s data. When updating the new image, qcow2 will copy data from the base image to a new place and do updates. The new image will use the COW data and will not access the old data in the base image, so the refcount in the base image should be decreased by one. The third flush is used to make the reference table of the base image
    durable. The fourth flush is introduced solely because of the suboptimal implementation in QEMU. The second write is the same as the first one, which needs four flushes. Consequently, we need around eight flushes for one guest fdatasync at most.

    简介

    Qcow2镜像格式是qemu支持的磁盘镜像格式之一。qcow2的表现形式为在一个文件中模拟一个固定大小的块设备。对与qcow2格式,相对于raw格式来说,有几个优点:

    1. 1.更小的文件大小,即使是不支持holes的文件系统也可以(这样的话,ls跟du看到的就一样了);
    2. 2.Copy-on-write的支持;
    3. 3.快照的支持,可以维护多个快照;
    4. 4.基于zlib的压缩;
    5. 5.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 Header
    每一个qcow2文件都是以一个固定格式的数据头开始的,其以大端模式存放,格式如下:
      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结尾;
    • 之后的4个字节包含了这个文件所用的格式版本,当前存在两种版本的格式,版本1和版本2。在本文,我们讨论的是版本2,即qcow2。版本1将在本文最后做简要介绍;
    • backing_file_offset字段给出相对于qcow2文件起始位置的偏移,指出一个字符串的位置,该字符串为backing file文件的绝对路径。由于该字符串不是以'\0'结束,所以backing_file_size指出字符串的长度。如果当前镜像是一个copy-on-write镜像,则存在backing file文件,否则没有;
    • cluster_bits字段,决定了怎样映射镜像偏移地址到文件偏移地址,其决定了在一个簇中,将拿偏移地址的多少位(低位)来作为索引。L2表占据一个单独的簇,包含若干8字节的项,cluster_bits最少用3bits作为L2表的索引。L2表的详细介绍,见下一节的2级索引;
    • size字段指示镜像以块设备呈现时的大小,单位字节;
    • crypt_method只有两种值,0表示没有加密,1表示采用了AES加密;
    • l1_size字段指示了在L1表中,可用的8字节项的个数,l1_table_offset字段给出了L1 table的文件偏移;
    • 相似的,refcount_table_offset字段给出了refcount table的文件偏移,refcount_table_clusters字段描述了refcount table大小(单位为clusters);
    • nb_snapshots字段给出了当前镜像中有多少个快照,snapshots_offset字段给出了QCowSnapshotHeader headers的文件偏移,每个快照都会有这样一个header。
    •  

    一个典型的镜像文件,其布局如下:

    • 一个header, 如上描述;
    • 在下一个簇开始,存放L1 table;
    • refcount table,仍然是簇对齐的;
    • 一个或者多个的refcount blocks;
    • Snapshot headers,第一个header要求簇对齐,之后的header要求8字节对齐;
    • L2 tables,每一个table占据一个单独的cluster;
    • Data clusters。


    2级索引
    对于qcow2格式,块设备的内容被保存在cluster中。每个cluster包含了若干个sector,每个sector有512个字节。
    为了通过给定的镜像地址找到指定的cluster,必须经过1级表和2级表的转换。例如,假设cluster_bits为12,则地址会被切分成如下三份:

    • 低12位用来定位一个4Kb的簇内偏移;
    • 之后的9位为一个512项的数组的偏移,每一项为一个8字节的文件偏移,即L2 table。 这里的9位是这么算出来的, l2_bits = cluster_bits - 3,L2 table是一个单独的包含若干8字节项的cluster;
    • 剩下的43位为另外一个8字节的文件偏移的数组的偏移,即L1 table。

    注意,L1 table的最小值,可以通过给定磁盘镜像的大小来计算,公式如下:
    l1_size = round_up(disk_size / (cluster_size * l2_size), cluster_size)

    总的来说,为了将磁盘镜像地址映射到镜像文件偏移,需要经历以下几步:

    1. 通过qcow2 header中的l1_table_offset字段获取L1 table的地址;
    2. 使用高(64 - l2_bits - cluser_bits)位的地址来索引L1 table,L1 table是一个数组,数组元素是一个64位的数;
    3. 通过L1 table中的表项来获取L2 table的地址;
    4. 通过L2 table中的表项来获取cluster的地址;
    5. 剩余的cluster_bits位来索引cluster内的位置。

    如果找到的L1 table或L2 table的地址偏移为0,则表示磁盘镜像对应的区域尚未分配。

    还需要注意的是,L1或L2 table的地址的高2位被保留下来,拿来置"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镜像可以用来保存其它镜像的变化部分,从而不实际影响到原有磁盘的内容。这就是增量镜像,看着就像一个独立的镜像,其所有数据都是从模板镜像获取的。仅当clusters中的内容跟模板镜像不一样的时候,这些cluster才会被保存到增量镜像中。
    写时复制的实现方式比较简单。增量镜像会在qcow2 header中的backing_file_offset字段指示一个字符串在qcow2文件内的偏移,该字符串是模板镜像文件的绝对路径,backing_file_size字段指明字符串的长度。当要从增量镜像中读取一个cluster时,qemu会先检查这个cluster在增量镜像中有没有被分配。如果没有,则会去读模板镜像中的对应位置。


    快照
    快照跟写时复制的概念比较类似。
    进一步解释——一个增量镜像也可以被说成是一个“快照”,因为它确实可以作为模板镜像的一个快照。我们可以创建多个增量镜像来实现创建多个“快照”,每一个增量镜像都引用同一个模板镜像。模板镜像必须保持为只读,增量镜像则为可写的。
    快照——"实际的快照"——存在于一个镜像里面,这个镜像既当模板,也当增量镜像。每一个快照都是镜像在过去某个瞬间的只读记录。镜像仍然可写,写时复制出来的cluster会被不同的快照引用。

    每个快照都对应一个描述信息结构体:
      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镜像格式支持压缩特性,其允许每一个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格式的不同点有:

    1. 1.支持快照的概念,qcow只支持增量镜像;
    2. 2.在qcow2中,引入了cluster的引用计数的概念;引用计数也被用来支持快照;
    3. 3.在qcow2中,L2 table将一直占一个单独的cluster; 之前,是通过QCowHeader中的l2_bits来确定的;
    4. 4.压缩的cluster的大小,现在单位为sector,之前是字节。
    展开全文
  • ubuntu16.04-arm64.qcow2

    2021-02-23 04:11:35
    ubuntu16.04-arm64.qcow2
  • CentOS7 qcow2模板资源

    2020-09-27 11:11:23
    CentOS7 qcow2模板资源
  • virt-install --name Controller2 --ram 16384 --vcpus=4 --disk path=/data/openstack/controller2.qcow2,format=raw --vnc --vncport=5920 --vnclisten=0.0.0.0 --network=bridge:br0 --network=bridge:br1 --...

    virt-install --name Controller2 --ram 16384 --vcpus=4 --disk path=/data/openstack/controller2.qcow2,format=raw --vnc --vncport=5920 --vnclisten=0.0.0.0 --network=bridge:br0 --network=bridge:br1 --force --import --noautoconsole

    展开全文
  • 一、写本文原因 公司有一台物理服务器,X58架构,挺老了,属于垃圾成色了。后来用U盘装了PVE做了虚拟化,当做线下测试服务器,以及做一些实验用。...待PVE虚拟机部署完成,并且正式运行时,请备份如下目录文件:/etc/p
    一、写本文原因

    公司有一台物理服务器,X58架构,挺老了,属于垃圾成色了。后来用U盘装了PVE做了虚拟化,当做线下测试服务器,以及做一些实验用。
    由于园区经常停电,导致了经常装载U盘上的PVE系统损坏,好在装载U盘,对本地的虚拟机数据没有影响,装了几次也有了一些经验。

    二 、备份文件
    • 2.1 安装时备份
      需要牢记住hostname和IP地址,Hostname直接和你的数据中心名称挂钩,尽量和虚拟保持一致
      在这里插入图片描述
    • 2.2 备份PVE配置文件
      待PVE虚拟机部署完成,并且正式运行时,请备份如下目录文件:/etc/pve/
      其中如下两个比较重要:
      qemu-server:保存了虚机的配置信息
      storage.cfg:保存了PVE的分区信息
    root@zm:/mnt/bak/dump# ls -ll /etc/pve/
    total 4
    -rw-r----- 1 root www-data  451 Nov  2 11:45 authkey.pub
    -rw-r----- 1 root www-data   16 Nov  2 11:40 datacenter.cfg
    drwxr-xr-x 2 root www-data    0 Nov  2 11:45 ha
    lrwxr-xr-x 1 root www-data    0 Jan  1  1970 local -> nodes/zm
    lrwxr-xr-x 1 root www-data    0 Jan  1  1970 lxc -> nodes/zm/lxc
    drwxr-xr-x 2 root www-data    0 Nov  2 11:45 nodes
    lrwxr-xr-x 1 root www-data    0 Jan  1  1970 openvz -> nodes/zm/openvz
    drwx------ 2 root www-data    0 Nov  2 11:45 priv
    -rw-r----- 1 root www-data 2074 Nov  2 11:45 pve-root-ca.pem
    -rw-r----- 1 root www-data 1675 Nov  2 11:45 pve-www.key
    lrwxr-xr-x 1 root www-data    0 Jan  1  1970 qemu-server -> nodes/zm/qemu-server
    drwxr-xr-x 2 root www-data    0 Nov  2 11:45 sdn
    -rw-r----- 1 root www-data  332 Nov  2 12:00 storage.cfg
    -rw-r----- 1 root www-data   39 Nov  2 11:40 user.cfg
    drwxr-xr-x 2 root www-data    0 Nov  2 11:45 virtual-guest
    -rw-r----- 1 root www-data  119 Nov  2 11:45 vzdump.cron
    
    • 2.3.备份分区表
      备份分区表/etc/fstab,这里记载了磁盘的挂载信息,假如丢失或者不记得,会导致虚机磁盘目录不对,无法启动;

    • 2.4.使用PVE备份功备份虚机
      点击虚机–备份,可以看到此虚机的备份信息,如果本机没有备份的话,建议及时进行备份,进行重大操作前也建议进行备份。
      在这里插入图片描述
      备份时默认的模式为快照,默认压缩格式为ZSTD。

    • 快照模式:备份时对服务器进行暂挂处理,来保持数据一致性,假如虚机开启了agent,在暂停备份时由agent来接收数据,如果对数据要求一致性不太高,可以使用从此模式;

    • 挂起模式:进行备份前,会对虚机进行暂挂处理,导致备份时间过长,并且数据一致性不太高,可以PASS此模式;

    • 停止模式:数据一致性最高,用最短的停机时间对虚机进行备份。

    在这里插入图片描述

    三、恢复
    • 3.1 使用配置文件进行恢复
      如果对配置文件进行过备份,可以把对应的conf文件直接复制到/etc/pve/qemu-server/里即可,然后修改存储信息/etc/pve/storage.cfg,修改Linux分区表/etc/fstab,启动虚拟就可以了;

      3.2 没有配置文件进行恢复
      如果没有配置文件,只有虚机硬盘镜像在,不怕,我们还有机会!假如你格式化了硬盘,所有虚机镜像不在了,对不起,这篇文章你应该不用看了,你该考虑怎么跑路了~
      虚机的磁盘影响在设定好的目录下,可以是LVM也可以是standard分区。以我的目录为例子,虚机镜像路径在:/mnt/vm/images/,前面的vm对应的是分区目录,数字编号对应了虚机的编号,disk-0和disk-1对应了虚机的第一块和第二块硬盘;

    ls /mnt/vm/images/
    # 虚机编号
    100  101  102  103  104  105  106
    
    # 查看虚机编号106的镜像文件
    ls 106/
    vm-106-disk-0.qcow2  vm-106-disk-1.qcow2
    

    镜像文件有了,我们该怎么恢复呢?不要急慢慢来,首先在PVE里创建一个虚拟机,编号千万不要和上面的重复。

    然后把创建好的虚机配置文件复制一份,进行修改,我们需要修改如下内容
    name:虚机的名字,可以和之前一样
    虚机的mac地址:可以使用如下命令生成,前面的52:54:00可以自行替换

    echo 52:54:00:`openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'`
    

    smbios1:虚机BIOSUUID,使用如下命令生成uuidgen
    unused0:未使用的硬盘,更改为旧的虚机硬盘路径
    virtio0:引导硬盘,更改为旧的虚机硬盘路径
    vmgenid:虚机UUID, 可以使用uuidgen命令生成
    在这里插入图片描述
    更改完成后可以在PVE管理界面看到更改好的虚机ID,直接右键开机即可;
    在这里插入图片描述

    展开全文
  • 包含qcow2格式的镜像,无需自己重新制作,离线情况下制作镜像非常繁琐,镜像包括windows_server_2012_r2_x64.qcow2.tar win7.qcow2.tar.gz windows_server_2008_r2_x64.qcow2.tar virtio驱动 ubuntu14.04.3_server....
  • qcow2文件跟raw文件
  • qcow2文件压缩

    千次阅读 2019-10-08 17:00:30
    # qemu-img create -f qcow2 centos.qcow2 5G #创建5G的qcow2镜像 # virt-sparsify -x /root/test1.qcow2 --convert qcow2 /root/test2.qcow2 #消除镜像空洞 # virt-sparsify --compress --convert qcow2 centos....
  • 创建qcow2镜像

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

    2021-01-27 17:50:13
    qcow文件格式描述官网说明文档:vim [某虚拟机的qcow2文件]%!xxd0 - 3 : magic QCOW magic string ("QFI\xfb") 4个字节固定的标识符4 - 7 : version Version number (valid values are 2 and 3) 版本号,2或者38 - ...
  • qcow2 WIP绑定用于qcow2文件格式 安装 go get github.com/vbatts/qcow2/cmd/qcow2-info 执照 参见
  • kvm环境导入已经配置好的qcow2文件

    千次阅读 2019-08-29 17:38:15
    要安装的qcow2文件:centos 7 一、需要准备的文件:centos.xml;centos.qcow2 1.centos.xml文件: <!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. ...
  • 在基于qcow2格式的虚拟机中进行删除文件操作后,物理磁盘文件并不会变小。可以用以下方法对磁盘文件瘦身。 linux客户机 1、使用dd命令将客户机未使用的磁盘空间用0填满 $dd if=/dev/zero of=~/junk dd: writing to `...
  • kvm qcow2 文件转化为 vmware文件

    千次阅读 2018-11-20 11:34:43
    1.使用kvm自带的命令: qemu-img convert -f qcow2 myImage.qcow2 -O vmdk myNewImage.vmdk 2.然后创建虚拟机,不安装系统,直接使用转换后的vmdk文件作为虚拟机的硬盘来使用...
  • 创建qcow2文件

    千次阅读 2015-11-05 10:42:03
    创建qcow2文件  qemu-img create -f qcow2 centos_6.5.qcow2 20G 制作linux镜像  /usr/libexec/qemu-kvm -m 1024 -cdrom iso/CentOS-6.5-x86_64-minimal.iso -drive file=centos6.5-30G.qcow2,if=virtio -n
  • 文章目录目的步骤 目的 新建一台Linux虚拟机之后,怕启动之后IP会跟局域网里面的IP冲突,需要先把镜像里面的network interfaces文件...sudo qemu-nbd --connect=/dev/nbd0 $qcow2_file_path sudo fdisk -l /dev/n
  • qcow2 总结

    2021-05-26 11:27:18
    1、qcow2文件分布 对内存不了解的可跳过此部分 MMU虚拟地址和物理地址,TLB(Translation Lookaside Buffer) 4k一个page,需要一个地址存放,4K-->4B,4G-->4MB,100万个页, 100个进程需要400M 将页表(一...
  • QCOW2镜像格式是Qemu支持的磁盘镜像格式之一。它可以使用一个文件来表示一个固定大小的块设备。 创建 qcow2 镜像 # qemu-img create -f qcow2 test.qcow2 200M qemu-img create -f qcow2 advantech_sysuser....
  • 在虚拟机的使用过程中,虚拟机内的文件经过大量的增、删、改等操作后,会使得虚拟机磁盘的体积变大。即使删除了虚拟机内的文件,已经分配给虚拟磁盘的空间却并不会被回收。不过我们可以进行手动回收这些虚拟机没有...
  • KVM 虚拟机 qcow2 格式镜像文件挂载

    千次阅读 2019-09-11 16:30:22
    安装前请先编译 nbd 模块... 1、加载 nbd 模块 modprobe nbd max_part=8 2、将镜像文件映射到网络块设备 qemu-nbd -c /dev/nbd0 /home/image/kvm110.qcow2 3、挂载 mount /dev/nb...
  • qcow2格式文件修改

    千次阅读 2015-10-15 03:06:38
    1、安装相关软件kpartx、qemu-nbd # apt-get intall kpartx 2、加载内核模块 nbd # modprobe nbd max_part=8 3、关联相关镜像文件 qemu-nbd –c /dev/nbd0 /var/lib/libvirt/image/CentOS7.qcow2 4、查看分区并挂载 ...
  • qcow2快照合并或删除

    2021-11-12 16:52:41
    假定当前快照链如下(<-代表backing file 通过qemu-...要合并成一个qcow2文件,从最后一个节点开始顺序执行: 1、qemu-img commitsnap4.qcow2 (将增量数据写入snap3中) 2、qemu-img commitsnap3.qcow2 3、q...
  • 大佬们,本人在VMWare workstation上安装了CentOS虚拟机,在其中又安装了KVM虚拟机,并用KVM导入.qcow2格式镜像文件,出现了如图的错误提示,请问诸位大佬有什么头绪么? ![图片说明]...
  • 下载3.5的 ...新建一个kvm的虚拟主机,然后 找个目录上传openmanage_enterprise.qcow2 qm importdisk 10152 /home/qcow2/openmanage_enterprise.qcow2 local-lvm qm importdisk id /home/qcow2/openmanage_enterprise
  • 制作qcow2镜像

    2021-05-10 07:04:03
    【准备工作】准备ISO源镜像,例如“SLES-11-SP4-DVD-x86_64-GM-DVD1.iso”准备一台linux机器准备vnc工具,例如vnc ...用qemu命令创建qcow2镜像,例qemu-img create -f qcow2 /opt/image/suse11.qcow2 40G3.用qem...
  • KVM环境部署与使用(附导入qcow2镜像及修改qcow2镜像密码)
  • 如何为qemu制作Qcow2格式文件系统

    千次阅读 2020-01-21 20:23:57
    一、 制作8G大小的raw镜像文件 qemu-img create -f raw ./virt-disk 8G" 上面的命名生成一个大小为8G的raw镜像virt-disk。 二、将virt-disk于loop设备关联 sudo losetup /dev/loop1 ./virt-disk 三、对loop1...
  • 配置文件: /etc/libvirt/qemu/test..../var/lib/kimchi/isos/test.qcow2 依赖包: yum -y install libguestfs-tools yum -y install virt-install.noarch virt-install --name test_jf --os-type=linux --os-varia...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,496
精华内容 4,598
关键字:

qcow2文件如何打开