
# 通过qemu-img工具转换镜像格式
#### 应用场景
华为云支持导入vhd、vmdk、qcow2、raw、vhdx、qcow、vdi、qed、zvhd或zvhd2格式镜像文件。其他镜像文件，需要转换格式后再导入。本节操作指导您使用开源qemu-img工具转换镜像格式。
#### 方案构架
本节提供本地为Windows操作系统和Linux操作系统的转换镜像格式的操作方法。
#### 资源和成本规划
表1资源和成本规划 
| 资源       | 资源说明                                                                                                                                                          | 成本说明 |
|:---|:---|:---|
| qemu-img | 是一款开源的转换镜像格式的工具。 获取方式： <https://qemu.weilnetz.de/w64/> | 免费   |
   
#### 约束与限制
- qemu-img镜像格式转换工具支持vhd、vmdk、qcow2、raw、vhdx、qcow、vdi或qed社区格式镜像的相互转换。
- zvhd和zvhd2是云服务内部自研格式，qemu-img工具无法识别这两种格式的镜像文件。如需将镜像文件转换为这两种格式，请使用自研qemu-img-hw工具，详细指导参见[转换镜像格式（qemu-img-hw）](https://support.huaweicloud.com/bestpractice-ims/ims_bp_0052.html)。
- vhd格式镜像在执行命令转换格式时请使用vpc代替。 例如，将CentOS 6.9镜像的vhd格式转换为qcow2格式，请执行如下命令：
  ```
  qemu-img convert -p -f vpc -O qcow2 centos6.9.vhd centos6.9.qcow2
  ```
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
  如遇报错，请删除**-f vpc**，qemu-img工具将自动识别镜像格式。
  
 
#### 本地为Windows操作系统
1. 安装qemu-img。
   1. 下载qemu-img安装包至本地：<https://qemu.weilnetz.de/w64/>。
   
   2. 双击setup文件安装qemu-img，以下操作以安装路径为"D:\\Program Files\\qemu"为例。
    
2. 配置环境变量。
   1. 选择"开始 \> 计算机"，右键单击"属性"。
   
   2. 单击"高级系统设置"。
   
   3. 在"系统属性"对话框里，单击"高级 \> 环境变量"。
   
   4. 在环境变量对话框里，在系统变量部分找到Path，并单击"编辑"。在"变量值"里，添加"D:\\Program Files\\qemu"，不同的变量值之间以";"分隔。
      ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
      如果没有Path变量请新建，并补充Path的变量值为"D:\\Program Files\\qemu"。
      
   
   5. 单击"确定"，保存修改。
    
3. 验证安装成功。 单击"开始 \> 运行"，输入"cmd"后按回车键，在"cmd"窗口输入**qemu-img --help**，如回显信息中出现qemu-img工具的版本信息，即表示安装成功。
   
4. 转换镜像格式。
   1. 在"cmd"窗口输入如下命令切换文件目录，以安装目录为"D:\\Program Files\\qemu"为例。
      ```
      d:
      cd D:\Program Files\qemu
      ```
      
   
   
   
   2. 执行如下命令转换镜像文件格式，以转换vmdk格式为qcow2格式的镜像为例。
      ```
      qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2
      ```
      上述命令中各参数对应的说明如下：
      - -p：表示镜像转换的进度。
      
      - -f后面为源镜像格式。
      
      - -O（必须是大写）后面的参数由如下3个部分组成：转换出来的镜像格式 + 源镜像文件名称 + 目标文件名称。
      
      
      转换完成后，目标文件会出现在源镜像文件所在的目录下。
      回显信息如下所示：
      ```
      # qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2
          (100.00/100%)
      ```
      
   
   3. 执行如下命令，查询转换后的qcow2格式镜像文件的详细信息。
      ```
      qemu-img info centos6.9.qcow2
      ```
      回显信息如下所示：
      ```
      # qemu-img info centos6.9.qcow2
      image: centos6.9.qcow2
      file format: qcow2
      virtual size: 1.0G (1073741824 bytes)
      disk size: 200K
      cluster_size: 65536
      Format specific information:
          compat: 1.1
          lazy refcounts: false
      ```
      
    
 
 #### 本地为Linux操作系统
![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
操作过程中如果出现报错，可参考[附2：执行qemu-img-hw常见报错](https://support.huaweicloud.com/bestpractice-ims/ims_bp_0052.html)。
1. 安装qemu-img。
   - Ubuntu、Debian系列操作系统，请执行如下命令：
     ```
     apt install qemu-utils
     ```
     
   
   - CentOS、Red Hat、Oracle系列操作系统，请执行如下命令：
     ```
     yum install -y qemu-img
     ```
     
   
   - SUSE、openSUSE系列操作系统，请执行如下命令：
     ```
     zypper install qemu-img
     ```
     
    
2. 执行如下命令，验证安装成功。
   ```
   qemu-img -V
   ```
   如回显信息中出现qemu-img工具的版本信息和帮助手册，即表示安装成功。以CentOS 7为例，回显信息如下所示：
   ```
   [root@CentOS7 ~]# qemu-img -V
   qemu-img version 1.5.3, Copyright (c) 2004-2008 Fabrice Bellard
   usage: qemu-img command [command options]
   QEMU disk image utility
   Command syntax:
     check [-q] [-f fmt] [--output=ofmt] [-r [leaks | all]] [-T src_cache] filename
     create [-q] [-f fmt] [-o options] filename [size]
     commit [-q] [-f fmt] [-t cache] filename
     compare [-f fmt] [-F fmt] [-T src_cach]
   ```
   
3. 转换镜像格式，以CentOS 7操作系统中转换vmdk格式为qcow2格式的镜像为例。
   1. 执行如下命令转换镜像文件格式。
      ```
      qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2
      ```
      上述命令中各参数对应的说明如下：
      - -p标识转换的进度条。
      
      - -f后面为源镜像格式。
      
      - -O（必须是大写）后面的参数为转换出来的镜像格式 + 源镜像文件名称 + 目标文件名称。
      
      
      转换完成后，目标文件会出现在源镜像文件所在的目录下。
      回显信息如下所示：
      ```
      [root@CentOS7 home]# qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2
          (100.00/100%)
      ```
      
   
   2. 执行如下命令，查询转换后的qcow2格式镜像文件的详细信息。
      ```
      qemu-img info centos6.9.qcow2
      ```
      回显信息如下所示：
      ```
      [root@CentOS7 home]# qemu-img info centos6.9.qcow2
      image: centos6.9.qcow2
      file format: qcow2
      virtual size: 1.0G (1073741824 bytes)
      disk size: 200K
      cluster_size: 65536
      Format specific information:
          compat: 1.1
          lazy refcounts: false
      ```
      
    
 
#### 典型应用举例
- 应用场景 用户从VMware平台导出一个pre-allocated格式的镜像文件（pre-allocated格式是VMDK monolithic Flat子格式类型），pre-allocated格式镜像依赖2个文件"xxxx.vmdk"和"xxxx-flat.vmdk"（"xxxx.vmdk"是一个配置文件，"xxxx-flat.vmdk"是实际数据文件），这两种格式的镜像文件不能直接导入到云平台，需提前转换成通用的vmdk或qcow2格式才能导入。
  以下以镜像文件格式为centos6.9-64bit-flat.vmdk和centos6.9-64bit.vmdk为例，通过qemu-img工具转换镜像格式。
  
- 操作步骤
1. 执行如下命令，查询镜像文件的详细信息。
   ```
   ls -lh centos6.9-64bit*
   qemu-img info centos6.9-64bit.vmdk
   qemu-img info centos6.9-64bit-flat.vmdk
   ```
   回显信息如下所示：
   ```
   [root@CentOS7 tmp]# ls -lh centos6.9-64bit*
   -rw-r--r--. 1 root root 10G Jun 13 05:30 centos6.9-64bit-flat.vmdk
   -rw-r--r--. 1 root root 327 Jun 13 05:30 centos6.9-64bit.vmdk
   [root@CentOS7 tmp]# qemu-img info centos6.9-64bit.vmdk
   image: centos6.9-64bit.vmdk
   file format: vmdk
   virtual size: 10G (10737418240 bytes)
   disk size: 4.0K
   Format specific information:
       cid: 3302005459
       parent cid: 4294967295
       create type: monolithicFlat
       extents:
           [0]:
               virtual size: 10737418240
               filename: centos6.9-64bit-flat.vmdk
               format: FLAT
   [root@CentOS7 tmp]# qemu-img info centos6.9-64bit-flat.vmdk
   image: centos6.9-64bit-flat.vmdk
   file format: raw
   virtual size: 10G (10737418240 bytes)
   disk size: 0
   ```
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   从回显信息中看出，centos6.9-64bit.vmdk文件的格式为vmdk，centos6.9-64bit-flat.vmdk文件的格式为raw，在执行镜像格式转换命令时，源镜像文件必须使用centos6.9-64bit.vmdk（详见步骤[3]）。
   
2. 执行如下命令，查看pre-allocated格式的镜像文件的相关配置信息。
   ```
   cat centos6.9-64bit.vmdk
   ```
   回显信息如下所示：
   ```
   [root@CentOS7 tmp]# cat centos6.9-64bit.vmdk
   # Disk DescriptorFile
   version=1
   CID=c4d09ad3
   parentCID=ffffffff
   createType="monolithicFlat"
    
   # Extent description
   RW 20971520 FLAT "centos6.9-64bit-flat.vmdk" 0
    
   # The Disk Data Base
   #DDB
    
   ddb.virtualHWVersion = "4"
   ddb.geometry.cylinders = "20805"
   ddb.geometry.heads = "16"
   ddb.geometry.sectors = "63"
   ddb.adapterType = "ide"
   ```
   
3. 将centos6.9-64bit-flat.vmdk和centos6.9-64bit.vmdk放在同一个目录下，执行如下命令，通过qemu-img工具转换镜像格式为qcow2。
   ```
   [root@CentOS7 tmp]# qemu-img convert -p -f vmdk -O qcow2 centos6.9-64bit.vmdk centos6.9-64bit.qcow2
       (100.00/100%)
   ```
   
4. 执行如下命令，查询转换后的qcow2格式镜像文件的详细信息。
   ```
   qemu-img info centos6.9-64bit.qcow2
   ```
   回显信息如下所示：
   ```
   [root@CentOS7 tmp]# qemu-img info centos6.9-64bit.qcow2
   image: centos6.9-64bit.qcow2
   file format: qcow2
   virtual size: 10G (10737418240 bytes)
   disk size: 200K
   cluster_size: 65536
   Format specific information:
       compat: 1.1
       lazy refcounts: false
   ```
   
 
#### 后续处理
镜像文件格式完成转换后，您可以通过obsutil工具将其上传至OBS桶，制作私有镜像时使用。使用obsutil工具上传镜像文件的操作指导，请参见[上传对象](https://support.huaweicloud.com/utiltg-obs/obs_11_0013.html)。
