# 热迁移操作<a name="ZH-CN_TOPIC_0185970583"></a>

## 前提条件<a name="section1415214341684"></a>

-   进行热迁移之前要确保源端和目的端主机之间的网络是互通的，并且源端和目的获得资源权限是对等的，即两端同时能够访问到相同的存储资源和网络资源。

-   在执行虚拟机热迁移前应当对虚拟机进行健康检查，并确保目的端主机有足够的CPU、内存和存储资源。

## 设置热迁移参数（可选）<a name="section8902796482"></a>

在执行热迁移之前，可以通过使用 virsh migrate-setmaxdowntime命令来指定虚拟机热迁移过程中能够容忍的最大停机时间，这是一个可选的配置项。

例如，指定名为_openEulerVM_的虚拟机最大停机时间为500ms：

```
# virsh migrate-setmaxdowntime openEulerVM 500
```

同时，可以通过调用virsh migrate-setspeed来限制虚拟机热迁移占用的带宽大小，防止当前虚拟机热迁移的时候占用带宽过大，对主机上的其他虚拟机或者业务造成影响，这个选择同样也是热迁移的一个可选项。

例如，指定名为_openEulerVM_的虚拟机热迁带宽为500Mbps：

```
# virsh migrate-setspeed openEulerVM --bandwidth 500
```

用户可以使用migrate-getspeed来查询虚拟机热迁移过程中的最大带宽。

```
# virsh migrate-getspeed openEulerVM
500
```

## 热迁移操作（共享存储场景）<a name="section13981158396"></a>

1.  确认是否为共享存储。

    ```
    # virsh domblklist <VMInstanse>
     Target   Source
    --------------------------------------------
    sda      /dev/mapper/open_euleros_disk
    sdb      /mnt/nfs/images/openeuler-test.qcow2
    ```

    首先，使用virsh domblklist命令查询虚拟机的存储设备信息，例如上面的查询结果显示虚拟机配置有2个存储设备：sda盘和sdb盘，然后再分别查询一下这两个设备对应后端存储是本地存储还是远端存储，如果虚拟机的所有存储设备都在远端共享存储之上，则说明该虚拟机为共享存储虚拟机，否则为非共享存储虚拟机。

2.  执行如下命令，进行虚拟机热迁移。

    例如，将虚拟机_openEulerVM_迁移到目的主机上使用virsh migrate命令。

    ```
    # virsh migrate --live --unsafe openEulerVM qemu+ssh://<destination-host-ip>/system
    ```

    其中，<destination-host-ip\>为目的主机IP地址，热迁移之前需要进行ssh认证以获取目的端主机管理源权限。

    另外，virsh migrate命令还有--auto-converge和--timeout子选项来保证迁移的顺利完成。

    其中，相关子选项：

    --unsafe命令会强制进行热迁移，忽略安全检查步骤。

    --auto-converge命令会对CPU进行降频限速，确保热迁移流程能够收敛。

    --timeout选项会指定一个热迁移超时时间，热迁移超过指定时间后会强制挂起虚拟机让热迁移得以收敛。

3.  热迁移完成后命令返回，虚拟机在目的端主机正常运行。

## 热迁移操作（非共享存储场景）<a name="section292214021717"></a>

1.  首先，先查询虚拟机存储设备列表，确保虚拟机使用的是非共享存储。

    例如，通过virsh domblklist查询到准备迁移的虚拟机有一个qcow2格式的磁盘sda，sda的xml配置为：

    ```
        <disk type='file' device='disk'>
          <driver name='qemu' type='qcow2' cache='none' io='native'/>
          <source file='/mnt/sdb/openeuler/openEulerVM.qcow2'/>
          <target dev='sda' bus='scsi'/>
          <address type='drive' controller='0' bus='0' target='0' unit='0'/>
        </disk>
    ```

    执行热迁移之前需要在目的端主机相同磁盘目录下创建一个虚拟磁盘文件，注意磁盘的格式和大小必须保持一致。

    ```
    # qemu-img create -f qcow2 /mnt/sdb/openeuler/openEulerVM.qcow2 20G
    ```

2.  在源端使用virsh migrate命令来执行热迁移，迁移的时候会将存储也一并迁移到目的端。

    ```
    # virsh migrate --live  --unsafe --copy-storage-all --migrate-disks sda \
    openEulerVM qemu+ssh://<dest-host-ip>/system
    ```

3.  热迁移完成后命令返回，虚拟机在目的端主机行正常运行，存储设备也被迁移到目的主机上。

