
# 通过qemu-img-hw工具转换镜像格式
#### 应用场景
华为云支持导入vhd、vmdk、qcow2、raw、vhdx、qcow、vdi、qed、zvhd或zvhd2格式镜像文件。其他镜像文件，需要使用开源qemu-img工具转换格式后再导入。但是，qemu-img工具不支持zvhd和zvhd2格式，而自研的qemu-img-hw工具弥补了该缺陷。本文介绍如何通过qemu-img-hw工具转换镜像文件格式为zvhd2。
#### 资源和成本规划
表1资源和成本规划 
| 资源          | 资源说明                                                                                                                                                                                                                              | 成本说明 |
|:---|:---|:---|
| qemu-img-hw | 是一款转换镜像格式的工具。 获取方式： <https://cn-south-1-cloud-reset-pwd.obs.cn-south-1.myhuaweicloud.com/imageImportTools/qemu-img-hw.zip> | 免费   |
   
#### 约束与限制
qemu-img-hw工具仅支持在Linux环境中操作，您可以使用本地Linux服务器，也可以使用云平台的Linux云服务器。本文以EulerOS云服务器作为操作环境进行演示。
#### 操作步骤
1. 上传待转换格式的镜像文件至云服务器。
   - 本地主机为Linux系统： 通过scp命令将镜像文件上传至云服务器。以将"image01.qcow2"文件上传至云服务器的"/usr/"目录下为例。
     ```
     scp /var/image01.qcow2 root@xxx.xxx.xx.xxx:/usr/
     ```
     其中，*xxx.xxx.xx.xxx*为云服务器的弹性公网IP。
     
   
   - 本地主机为Windows系统： 使用文件传输工具（例如WinSCP）将镜像文件上传至云服务器。
     
    
2. 获取qemu-img-hw工具并上传至云服务器，然后解压工具包。
   表2qemu-img-hw工具获取方式 
   | 工具包             | 下载地址                                                                                                   |
   |:---|:---|
   | qemu-img-hw.zip | <https://cn-south-1-cloud-reset-pwd.obs.cn-south-1.myhuaweicloud.com/imageImportTools/qemu-img-hw.zip> |
      
   ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
   当前工具仅限在x86架构的服务器下使用。
   
3. 转换镜像格式。
   1. 进入qemu-img-hw存放目录，以存放在"/usr/qemu-img-hw"为例：
      ```
      cd /usr/qemu-img-hw
      ```
      
   
   2. 执行以下命令修改权限：
      ```
      chmod +x qemu-img-hw
      ```
      
   
   3. 执行qemu-img-hw命令将镜像文件转为zvhd2格式。 qemu-img-hw命令格式：
      ```
      ./qemu-img-hw convert -p -O {目标镜像格式} {待转换镜像文件} {目标镜像文件}
      ```
      以将"image01.qcow2"格式文件转换成"image01.zvhd2"格式为例：
      ```
      ./qemu-img-hw convert -p -O zvhd2 image01.qcow2 image01.zvhd2
      ```
      
    
 
#### 附1：qemu-img-hw常用命令
- 镜像文件格式转换：
  ```
  qemu-img-hw convert -p -O {目标镜像格式} {待转换镜像文件} {目标镜像文件}
  ```
  上述命令中各参数对应的说明如下：
  -p：标识转换的进度条
  -O：（必须是大写）后面的参数为转换出来的镜像格式 + 源镜像文件名称 + 目标镜像文件名称
  示例：将qcow2格式转为zvhd2格式
  ```
  qemu-img-hw convert -p -O zvhd2 test.qcow2 test.zvhd2
  ```
  
- 查询镜像文件信息：
  ```
  qemu-img-hw info {镜像文件}
  ```
  示例：
  ```
  qemu-img-hw info test.zvhd2
  ```
  
- 查看帮助：
  ```
  qemu-img-hw -help
  ```
  
 
#### 附2：执行qemu-img-hw常见报错
- 问题描述：
  执行qemu-img-hw命令时回显信息如下：
  ```
  ./qemu-img-hw: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./qemu-img-hw)
  ```
  解决方法：
  执行**strings /lib64/libc.so.6 \| grep GLIBC**查看GLIBC版本，若由于版本过低造成，可安装高版本即可。依次执行下述命令：
  ```
  wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz
  wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz
  tar -xvf glibc-2.15.tar.gz
  tar -xvf glibc-ports-2.15.tar.gz
  mv glibc-ports-2.15 glibc-2.15/ports
  mkdir glibc-build-2.15
  cd glibc-build-2.15
  ../glibc-2.15/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
  ```
  ![](https://support.huaweicloud.com/bestpractice-ims/public_sys-resources/note_3.0-zh-cn.png)
  此命令若报错"configure: error: no acceptable C compiler found in $PATH"，请先执行：**yum -y install gcc**
  ```
  make
  make install
  ```
  
- 问题描述： 执行qemu-img-hw命令时回显信息如下：
  ```
  ./qemu-img-hw: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
  ```
  解决方法：
  请先执行命令
  ```
  yum install libaio
  ```
  
- 问题描述： 执行qemu-img-hw命令时回显信息如下：
  ```
  ./qemu-img-hw: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory
  ```
  解决方法：执行**openssl version**查看当前openssl版本是否大于1.0，若版本大于1.0，需要安装1.0版本。
  请依次执行下述命令：
  ```
  wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2k/openssl-1.0.2k.tar.gz
  tar -xvf openssl-1.0.2k.tar.gz
  cd openssl-1.0.2k
  ./config -d shared --prefix=/tmp/openssl(安装目录，可自定义)
  make
  make install
  cp /tmp/openssl/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10
  ```
  使用完成后，如不需要/usr/lib64/libcrypto.so.10文件，可自行删除。
  
 
#### 后续处理
镜像文件格式完成转换后，您可以通过obsutil工具将其上传至OBS桶，制作私有镜像时使用。使用obsutil工具上传镜像文件的操作指导，请参见[上传对象](https://support.huaweicloud.com/utiltg-obs/obs_11_0013.html)。
