修改QEMU

若系统环境为openEuler 22.03 LTS Arm系统,可跳过此章节。

操作步骤

  1. 安装必要的工具软件和库文件。

    • 若系统环境为openEuler 22.03 LTS x86/openEuler 20.03 LTS/Kylin V10 SP2/Kylin V10 Arm/BC Linux 21.10/UOS V20(1050e)/CULinux 3.0/CentOS 7.5(5.10.0)操作系统,请执行步骤2
    • 若系统环境为Ubuntu 20.04/Ubuntu 22.04/veLinux 1.1操作系统,请执行步骤3

  2. 执行如下命令,安装必要的工具软件和库文件。

    yum install spice-server spice-server-devel -y

    [root@localhost vm]# yum install spice-server spice-server-devel -y
    Last metadata expiration check: 0:18:11 ago on Tue 10 Jan 2023 09:51:22 AM CST.
    Dependencies resolved.
    =============================================================================================================================================================================================================
     Package                                                Architecture                               Version                                              Repository                                      Size
    =============================================================================================================================================================================================================
    Installing:
     spice-server                                           x86_64                                     0.14.3-3.oe2203                                      everything                                     364 k
     spice-server-devel                                     x86_64                                     0.14.3-3.oe2203                                      everything                                      17 k
    Transaction Summary
    =============================================================================================================================================================================================================
    Install  2 Packages
    Total download size: 382 k
    Installed size: 1.2 M
    Downloading Packages:
    (1/2): spice-server-devel-0.14.3-3.oe2203.x86_64.rpm                                                                                                                          15 kB/s |  17 kB     00:01
    (2/2): spice-server-0.14.3-3.oe2203.x86_64.rpm                                                                                                                               189 kB/s | 364 kB     00:01
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Total                                                                                                                                                                        198 kB/s | 382 kB     00:01
    Running transaction check
    Transaction check succeeded.
    Running transaction test
    Transaction test succeeded.
    Running transaction
      Preparing        :                                                                                                                                                                                     1/1
      Installing       : spice-server-0.14.3-3.oe2203.x86_64                                                                                                                                                 1/2
      Installing       : spice-server-devel-0.14.3-3.oe2203.x86_64                                                                                                                                           2/2
      Running scriptlet: spice-server-devel-0.14.3-3.oe2203.x86_64                                                                                                                                           2/2
      Verifying        : spice-server-0.14.3-3.oe2203.x86_64                                                                                                                                                 1/2
      Verifying        : spice-server-devel-0.14.3-3.oe2203.x86_64                                                                                                                                           2/2
    Installed:
      spice-server-0.14.3-3.oe2203.x86_64                                                                
    spice-server-devel-0.14.3-3.oe2203.x86_64
    Complete!
    [root@localhost vm]#

  3. 执行如下命令,安装必要的工具软件和库文件。

    apt-get install -y ninja-build gcc pkg-config build-essential zlib1g-dev libglib2.0-dev libmount-dev libpixman-1-dev

    root@atlas:~# apt-get install -y ninja-build gcc pkg-config build-essential zlib1g-dev libglib2.0-dev libmount-dev libpixman-1-dev
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following additional packages will be installed:
      binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-9 dpkg-dev fakeroot g++ g++-9 gcc-10-base gcc-9 gcc-9-base libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5
      libatomic1 libbinutils libblkid-dev libblkid1 libc-dev-bin libc6 libc6-dev libcc1-0 libcrypt-dev libctf-nobfd0 libctf0 libdpkg-perl libfakeroot libffi-dev libfile-fcntllock-perl libgcc-9-dev libgcc-s1
      libglib2.0-0 libglib2.0-bin libglib2.0-dev-bin libgomp1 libisl22 libitm1 liblsan0 libmount1 libmpc3 libpcre16-3 libpcre2-16-0 libpcre2-32-0 libpcre2-8-0 libpcre2-dev libpcre2-posix2 libpcre3
      libpcre3-dev libpcre32-3 libpcrecpp0v5 libquadmath0 libselinux1-dev libsepol1 libsepol1-dev libstdc++-9-dev libstdc++6 libtsan0 libubsan1 libuuid1 linux-libc-dev make manpages-dev uuid-dev zlib1g
    Suggested packages:
      binutils-doc cpp-doc gcc-9-locales debian-keyring g++-multilib g++-9-multilib gcc-9-doc gcc-multilib autoconf automake libtool flex bison gdb gcc-doc gcc-9-multilib glibc-doc bzr libgirepository1.0-dev
      libglib2.0-doc libstdc++-9-doc make-doc
    The following NEW packages will be installed:

    apt-get install -y libusbredirhost-dev libusbredirhost1 libusbredirparser-dev libusbredirparser1 usbredirserver

    root@localhost:/home/qemu-4.1.0# apt-get install -y  libusbredirhost-dev libusbredirhost1 libusbredirparser-dev libusbredirparser1 usbredirserver
    Reading package lists... DoneBuilding dependency treeReading state information... Donelibusbredirhost1 is already the newest version (0.8.0-1ubuntu0.1).libusbredirhost1 set to manually installed.libusbredirparser1 is already the newest version (0.8.0-1ubuntu0.1).libusbredirparser1 set to manually installed.The following NEW packages will be installed:  libusbredirhost-dev libusbredirparser-dev usbredirserver0 upgraded, 3 newly installed, 0 to remove and 263 not upgraded.Need to get 30.5 kB of archives.After this operation, 121 kB of additional disk space will be used.Get:1 http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libusbredirparser-dev arm64 0.8.0-1ubuntu0.1 [8,164 B]Get:2 http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libusbredirhost-dev arm64 0.8.0-1ubuntu0.1 [14.4 kB]Get:3 http://ports.ubuntu.com/ubuntu-ports focal-updates/universe arm64 usbredirserver arm64 0.8.0-1ubuntu0.1 [7,896 B]

    apt-get install libspice-server-dev libspice-server1

    root@localhost:~# apt-get install libspice-server-dev libspice-server1
    Reading package lists... DoneBuilding dependency treeReading state information... Donelibspice-server1 is already the newest version (0.14.2-4ubuntu3.1).libspice-server1 set to manually installed.The following NEW packages will be installed:  libspice-protocol-dev libspice-server-dev0 upgraded, 2 newly installed, 0 to remove and 263 not upgraded.Need to get 31.8 kB of archives.After this operation, 198 kB of additional disk space will be used.Get:1 http://ports.ubuntu.com/ubuntu-ports focal/main arm64 libspice-protocol-dev all 0.14.0-0ubuntu1 [21.5 kB]Get:2 http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 libspice-server-dev arm64 0.14.2-4ubuntu3.1 [10.3 kB]Fetched 31.8 kB in 8s (3,903 B/s)Selecting previously unselected package libspice-protocol-dev.(Reading database ... 97326 files and directories currently installed.)Preparing to unpack .../libspice-protocol-dev_0.14.0-0ubuntu1_all.deb ...

  4. 执行如下命令,查看当前环境使用的QEMU版本。

    virsh version

    root@atlas:~# virsh version
    Compiled against library: libvirt 6.0.0
    Using library: libvirt 6.0.0
    Using API: QEMU 6.0.0
    Running hypervisor: QEMU 4.2.1

  5. https://download.qemu.org/下载4.1.0版本的QEMU源码包,并将下载的源码包上传至环境中。

    对于Atlas 200T A2 Box16 异构子框,建议下载5.2.0版本的QEMU源码包。

  6. 执行如下命令,修改目录权限。

    chmod +x ./qemu-4.1.0.tar.xz

  7. 执行如下命令,解压QEMU源码包。

    tar -xf ./qemu-4.1.0.tar.xz

  8. 执行如下命令,进入QEMU源码目录。

    cd qemu-4.1.0/

  9. 修改QEMU源码。

    1. 执行如下命令,修改“pci-quirks.c”文件。

      vi ./hw/vfio/pci-quirks.c

      增加如下加粗字体标注的代码并保存:

      …
      #include "hw/nvram/fw_cfg.h"
      #include "pci.h"
      #include "trace.h"
       
      // ascend-patch begin
      #define PCI_VENDOR_ID_HUAWEI      0x19e5
      #define PCI_DEVICE_ID_ASCEND910   0xd801
      #define PCI_DEVICE_ID_ASCEND910B  0xd802
      #define PCI_DEVICE_ID_ASCEND310P   0xd500
      #define PCI_DEVICE_ID_ASCEND310B   0xd105
      #define PCI_DEVICE_ID_ASCEND310   0xd100
      #define PCI_SUB_DEVICE_ID_ASCEND310P_1P_MIN  0x100
      #define PCI_SUB_DEVICE_ID_ASCEND310P_1P_MAX  0x10f
      #define PCI_SUB_DEVICE_ID_ASCEND310P_2P_MIN  0x110
      #define PCI_SUB_DEVICE_ID_ASCEND310P_2P_MAX  0x11f
      #define ASCEND910_XLOADER_SIZE    4
      #define ASCEND910_XLOADER_OFFSET  0x80400
      #define ASCEND910B_XLOADER_SIZE   4
      #define ASCEND910B_XLOADER_OFFSET    0x18208430
      #define ASCEND310P_2P_BASE         (128 * 1024 * 1024)
      #define ASCEND310P_1P_DEVNUM       1
      #define ASCEND310P_2P_DEVNUM       2
      #define ASCEND310P_XLOADER_SIZE    4
      #define ASCEND310P_XLOADER_OFFSET  0x100430
      #define ASCEND310B_XLOADER_SIZE    4
      #define ASCEND310B_XLOADER_OFFSET  0x4430
      #define ASCEND310_XLOADER_SIZE    4
      #define ASCEND310_XLOADER_OFFSET  0x400
      typedef struct VFIOAscendBarQuirk {
          struct VFIOPCIDevice *vdev;
          pcibus_t offset;
          uint8_t bar;
          MemoryRegion *mem;
      } VFIOAscendBarQuirk;
      static uint64_t vfio_ascend_quirk_read(void *opaque,
                                             hwaddr addr, unsigned size)
      {
          VFIOAscendBarQuirk *quirk = opaque;
          VFIOPCIDevice *vdev = quirk->vdev;
          qemu_log("read RO region! addr=0x%" HWADDR_PRIx ", size=%d\n",
                  addr + quirk->offset, size);
          return vfio_region_read(&vdev->bars[quirk->bar].region,
                                  addr + quirk->offset, size);
      }
      static void vfio_ascend_quirk_write(void *opaque, hwaddr addr,
                                          uint64_t data, unsigned size)
      {
          VFIOAscendBarQuirk *quirk = opaque;
          qemu_log("modifying RO region is not allowed! addr=0x%"
                  HWADDR_PRIx ", data=0x%" PRIx64 ", size=%d\n",
                  addr + quirk->offset, data, size);
      }
      static const MemoryRegionOps vfio_ascend_intercept_regs_quirk = {
          .read = vfio_ascend_quirk_read,
          .write = vfio_ascend_quirk_write,
          .endianness = DEVICE_LITTLE_ENDIAN,
      };
      static void vfio_probe_ascend910b_bar2_quirk(VFIOPCIDevice *vdev, int nr)
      {
          VFIOQuirk *quirk;
          VFIOAscendBarQuirk *bar2_quirk;
       
          if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 2
              || vdev->device_id != PCI_DEVICE_ID_ASCEND910B) {
              return;
          }
       
          quirk = g_malloc0(sizeof(*quirk));
          quirk->nr_mem = 1;
          quirk->mem = g_new0(MemoryRegion, quirk->nr_mem);
          bar2_quirk = quirk->data = g_new0(typeof(*bar2_quirk), quirk->nr_mem);
          bar2_quirk[0].vdev = vdev;
          bar2_quirk[0].offset = ASCEND910B_XLOADER_OFFSET;
          bar2_quirk[0].bar = nr;
       
          /* intercept w/r to the xloader-updating register,
           * so the vm can't enable xloader-updating
           */
          memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
                                &vfio_ascend_intercept_regs_quirk,
                                &bar2_quirk[0],
                                "vfio-ascend910b-bar2-intercept-regs-quirk",
                                ASCEND910B_XLOADER_SIZE);
          memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                              bar2_quirk[0].offset,
                                              &quirk->mem[0], 1);
          QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
      }
      static void vfio_probe_ascend910_bar0_quirk(VFIOPCIDevice *vdev, int nr)
      {
          VFIOQuirk *quirk;
          VFIOAscendBarQuirk *bar0_quirk;
          if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 0 ||
              vdev->device_id != PCI_DEVICE_ID_ASCEND910) {
              return;
          }
          quirk = g_malloc0(sizeof(*quirk));
          quirk->nr_mem = 1;
          quirk->mem = g_new0(MemoryRegion, quirk->nr_mem);
          bar0_quirk = quirk->data = g_new0(typeof(*bar0_quirk), quirk->nr_mem);
          bar0_quirk[0].vdev = vdev;
          bar0_quirk[0].offset = ASCEND910_XLOADER_OFFSET;
          bar0_quirk[0].bar = nr;
          /*
           * intercept w/r to the xloader-updating register,
           * so the vm can't enable xloader-updating
           */
          memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
                                &vfio_ascend_intercept_regs_quirk,
                                &bar0_quirk[0],
                                "vfio-ascend910-bar0-intercept-regs-quirk",
                                ASCEND910_XLOADER_SIZE);
          memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                              bar0_quirk[0].offset,
                                              &quirk->mem[0], 1);
          QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
      }
      static void vfio_probe_ascend310p_bar2_quirk(VFIOPCIDevice *vdev, int nr)
      {
          VFIOQuirk *quirk;
          VFIOAscendBarQuirk *bar2_quirk;
          int sub_device_id;
          int devnum = 0;
          if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 2 ||
              vdev->device_id != PCI_DEVICE_ID_ASCEND310P) {
              return;
          }
          sub_device_id = pci_get_word(vdev->pdev.config + PCI_SUBSYSTEM_ID);
          if (sub_device_id >= PCI_SUB_DEVICE_ID_ASCEND310P_1P_MIN &&
              sub_device_id <= PCI_SUB_DEVICE_ID_ASCEND310P_1P_MAX) {
              devnum = ASCEND310P_1P_DEVNUM;
          } else if (sub_device_id >= PCI_SUB_DEVICE_ID_ASCEND310P_2P_MIN &&
                     sub_device_id <= PCI_SUB_DEVICE_ID_ASCEND310P_2P_MAX) {
              devnum = ASCEND310P_2P_DEVNUM;
          }
          if (devnum != ASCEND310P_1P_DEVNUM && devnum != ASCEND310P_2P_DEVNUM) {
              return;
          }
          quirk = g_malloc0(sizeof(*quirk));
          quirk->nr_mem = devnum;
          quirk->mem = g_new0(MemoryRegion, quirk->nr_mem);
          bar2_quirk = quirk->data = g_new0(typeof(*bar2_quirk), quirk->nr_mem);
          bar2_quirk[0].vdev = vdev;
          bar2_quirk[0].offset = ASCEND310P_XLOADER_OFFSET;
          bar2_quirk[0].bar = nr;
          /*
           * intercept w/r to the xloader-updating register,
           * so the vm can't enable xloader-updating
           */
          memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
                                &vfio_ascend_intercept_regs_quirk,
                                &bar2_quirk[0],
                                "vfio-ascend310p-bar2-1p-intercept-regs-quirk",
                                ASCEND310P_XLOADER_SIZE);
          memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                              bar2_quirk[0].offset,
                                              &quirk->mem[0], 1);
          if (devnum == ASCEND310P_2P_DEVNUM) {
              bar2_quirk[1].vdev = vdev;
              bar2_quirk[1].offset = (ASCEND310P_2P_BASE + ASCEND310P_XLOADER_OFFSET);
              bar2_quirk[1].bar = nr;
              memory_region_init_io(&quirk->mem[1], OBJECT(vdev),
                                    &vfio_ascend_intercept_regs_quirk,
                                    &bar2_quirk[1],
                                    "vfio-ascend310p-bar2-2p-intercept-regs-quirk",
                                    ASCEND310P_XLOADER_SIZE);
              memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                                  bar2_quirk[1].offset,
                                                  &quirk->mem[1], 1);
          }
          QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
      }
      static void vfio_probe_ascend310b_bar2_quirk(VFIOPCIDevice *vdev, int nr)
      {
          VFIOQuirk *quirk;
          VFIOAscendBarQuirk *bar2_quirk;
       
          if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 2
              || vdev->device_id != PCI_DEVICE_ID_ASCEND310B) {
              return;
          }
       
          quirk = g_malloc0(sizeof(*quirk));
          quirk->nr_mem = 1;
          quirk->mem = g_new0(MemoryRegion, quirk->nr_mem);
          bar2_quirk = quirk->data = g_new0(typeof(*bar2_quirk), quirk->nr_mem);
          bar2_quirk[0].vdev = vdev;
          bar2_quirk[0].offset = ASCEND310B_XLOADER_OFFSET;
          bar2_quirk[0].bar = nr;
       
          /* intercept w/r to the xloader-updating register,
           * so the vm can't enable xloader-updating
           */
          memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
                                &vfio_ascend_intercept_regs_quirk,
                                &bar2_quirk[0],
                                "vfio-ascend310b-bar2-intercept-regs-quirk",
                                ASCEND310B_XLOADER_SIZE);
          memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                              bar2_quirk[0].offset,
                                              &quirk->mem[0], 1);
          QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
      }
      static void vfio_probe_ascend310_bar4_quirk(VFIOPCIDevice *vdev, int nr)
      {
          VFIOQuirk *quirk;
          VFIOAscendBarQuirk *bar4_quirk;
          if (vdev->vendor_id != PCI_VENDOR_ID_HUAWEI || nr != 4 ||
              vdev->device_id != PCI_DEVICE_ID_ASCEND310) {
              return;
          }
          quirk = g_malloc0(sizeof(*quirk));
          quirk->nr_mem = 1;
          quirk->mem = g_new0(MemoryRegion, quirk->nr_mem);
          bar4_quirk = quirk->data = g_new0(typeof(*bar4_quirk), quirk->nr_mem);
          bar4_quirk[0].vdev = vdev;
          bar4_quirk[0].offset = ASCEND310_XLOADER_OFFSET;
          bar4_quirk[0].bar = nr;
          /*
           * intercept w/r to the xloader-updating register,
           * so the vm can't enable xloader-updating
           */
          memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
                                &vfio_ascend_intercept_regs_quirk,
                                &bar4_quirk[0],
                                "vfio-ascend310-bar4-intercept-regs-quirk",
                                ASCEND310_XLOADER_SIZE);
          memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
                                              bar4_quirk[0].offset,
                                              &quirk->mem[0], 1);
          QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
      }
      // ascend-patch end
    2. 修改vfio_bar_quirk_setup函数,增加如下加粗字体标注的代码并保存:
      void vfio_bar_quirk_setup(VFIOPCIDevice *vdev, int nr)
      {
          vfio_probe_ati_bar4_quirk(vdev, nr);
          vfio_probe_ati_bar2_quirk(vdev, nr);
          vfio_probe_nvidia_bar5_quirk(vdev, nr);
          vfio_probe_nvidia_bar0_quirk(vdev, nr);
       
          // ascend-patch begin
          vfio_probe_ascend910b_bar2_quirk(vdev, nr);
          vfio_probe_ascend910_bar0_quirk(vdev, nr);
          vfio_probe_ascend310p_bar2_quirk(vdev, nr);
          vfio_probe_ascend310b_bar2_quirk(vdev, nr);
          vfio_probe_ascend310_bar4_quirk(vdev, nr);
          // ascend-patch end
       
          vfio_probe_rtl8168_bar2_quirk(vdev, nr);
          vfio_probe_igd_bar4_quirk(vdev, nr);
      }…
    3. 对于推理服务器,执行如下命令修改配置文件“./linux-user/syscall.c”的TARGET_NR_stime函数。
      • 对于训练服务器,请跳过此步骤。
      • 对于BC Linux 21.10操作系统,需执行此步骤。

      vi ./linux-user/syscall.c

      修改前TARGET_NR_stime函数代码如下:

      #ifdef TARGET_NR_stime /* not on alpha */
             case TARGET_NR_stime:
                   {
                        time_t host_time;
                        if (get_user_sal(host_time, argl))
                             return -TARGET_EFAULT;
                        return get_errno(stime(&host_time));
                   }
      #endif
      修改后TARGET_NR_stime函数的代码段如下加粗字体标注。
      #ifdef TARGET_NR_stime /* not on alpha */
             case TARGET_NR_stime:
                   {
                        time_t host_time;
                        if (get_user_sal(host_time, argl))
                             return -TARGET_EFAULT;
                      struct timespec res;
                      res.tv_sec = host_time;
                      return get_errno(clock_settime(CLOCK_REALTIME, &res));
                   }
      #endif
    4. 对于Atlas 200T A2 Box16 异构子框,执行如下命令修改配置文件“target/i386/cpu.c”的x86_cpu_realizefn函数。

      vi ./target/i386/cpu.c

      修改前x86_cpu_realizefn函数代码如下:

      static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
      {
          …
          if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
              if (accel_uses_host_cpuid()) {
                  uint32_t host_phys_bits = x86_host_phys_bits();
                  static bool warned;
       
                  …
              } else {
                 …
      }
      …
      }

      修改后x86_cpu_realizefn函数段如下加粗字体标注。

      static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
      {
          …
          if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
              if (accel_uses_host_cpuid()) {
                  uint32_t host_phys_bits = x86_host_phys_bits();
                  static bool warned;
                cpu->host_phys_bits = true;
                  …
              } else {
                 …
      }
      …
      }
    5. 对于Atlas 200T A2 Box16 异构子框+CentOS 7.5(5.10.0),执行如下命令修改“linux-user/strace.c”文件。

      vi ./linux-user/strace.c

      增加如下加粗字体内容并保存。

      #include "qemu/osdep.h"
      #include <sys/ipc.h>
      #include <sys/msg.h>
      #include <sys/sem.h>
      #include <sys/shm.h>
      #include <sys/select.h>
      #include <sys/mount.h>
      #include <arpa/inet.h>
      #include <netinet/tcp.h>
      #include <linux/if_packet.h>
      #include <linux/netlink.h>
      #include <linux/falloc.h>
      #include <sched.h>
      #include "qemu.h"
    6. 执行如下命令,修改“configure”文件。

      vi ./configure

      修改如下加粗字体的参数取值为“yes”并保存。

      qom_cast_debug="yes"
      trace_backends="log"
      trace_file="trace"
      spice="yes"
      rbd=""
      smartcard=""
      libusb=""
      usb_redir=""
      opengl=""
      opengl_dmabuf="no"
      cpuid_h="no"
      avx2_opt=""

  10. 构建并安装QEMU。

    1. 对于Atlas 200T A2 Box16 异构子框+CentOS 7.5(5.10.0),需执行如下操作:
      1. 执行如下命令,配置网络源。

        yum install -y http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

        [root@localhost yum.repos.d]# yum install -y http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
        Loaded plugins: fastestmirror, langpacks
        epel-release-latest-7.noarch.rpm                                                                                                                                                                                                                                  |  15 kB  00:00:00     
        Examining /var/tmp/yum-root-eFmD9i/epel-release-latest-7.noarch.rpm: epel-release-7-14.noarch
        Marking /var/tmp/yum-root-eFmD9i/epel-release-latest-7.noarch.rpm to be installed
        Resolving Dependencies
        --> Running transaction check
        ---> Package epel-release.noarch 0:7-14 will be installed
        --> Finished Dependency Resolution
        Dependencies Resolved
        =========================================================================================================================================================================================================================================================================================
         Package                                                            Arch                                                         Version                                                       Repository                                                                           Size
        =========================================================================================================================================================================================================================================================================================
        Installing:
         epel-release                                                       noarch                                                       7-14                                                          /epel-release-latest-7.noarch                                                        25 k
        Transaction Summary
        =========================================================================================================================================================================================================================================================================================
        Install  1 Package
        Total size: 25 k
        Installed size: 25 k
        Downloading packages:
        Running transaction check
        Running transaction test
        Transaction test succeeded
        Running transaction
          Installing : epel-release-7-14.noarch                                                                                                                                                                                                                                              1/1 
          Verifying  : epel-release-7-14.noarch                                                                                                                                                                                                                                              1/1 
        Installed:
          epel-release.noarch 0:7-14                                                                                                                                                                                                                                                             
        Complete!
      2. 执行如下命令,安装依赖。

        yum install -y ninja-build libffi-devel unzip

        root@[10:35:08]|0:~$ yum install -y ninja-build libffi-devel unzip
        Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
        This system is not registered with an entitlement server. You can use subscription-manager to register.
        Loading mirror speeds from cached hostfile
         * base: mirrors.aliyun.com
         * centos-sclo-rh: ftp.sjtu.edu.cn
         * centos-sclo-sclo: mirror.lzu.edu.cn
         * elrepo: dfw.mirror.rackspace.com
         * epel: ftp.iij.ad.jp
         * extras: mirrors.aliyun.com
         * updates: mirrors.aliyun.com
        Resolving Dependencies
        --> Running transaction check
        ---> Package libffi-devel.x86_64 0:3.0.13-19.el7 will be installed
        ---> Package ninja-build.x86_64 0:1.10.2-3.el7 will be installed
        ---> Package unzip.x86_64 0:6.0-24.el7_9 will be installed
        --> Finished Dependency Resolution
        Dependencies Resolved
        ==========================================================================================================================================
         Package                            Arch                         Version                              Repository                     Size
        ==========================================================================================================================================
        Installing:
         libffi-devel                       x86_64                       3.0.13-19.el7                        base                           23 k
         ninja-build                        x86_64                       1.10.2-3.el7                         epel                          144 k
         unzip                              x86_64                       6.0-24.el7_9                         updates                       172 k
        Transaction Summary
        ==========================================================================================================================================
        Install  3 Packages
        Total download size: 340 k
        Installed size: 767 k
        Downloading packages:
        (1/3): libffi-devel-3.0.13-19.el7.x86_64.rpm                                                                       |  23 kB  00:00:00     
        (2/3): ninja-build-1.10.2-3.el7.x86_64.rpm                                                                         | 144 kB  00:00:00     
        (3/3): unzip-6.0-24.el7_9.x86_64.rpm                                                                               | 172 kB  00:00:00     
        ------------------------------------------------------------------------------------------------------------------------------------------
        Total                                                                                                     620 kB/s | 340 kB  00:00:00     
        Running transaction check
        Running transaction test
        Transaction test succeeded
        Running transaction
          Installing : ninja-build-1.10.2-3.el7.x86_64                                                                                        1/3 
          Installing : libffi-devel-3.0.13-19.el7.x86_64                                                                                      2/3 
          Installing : unzip-6.0-24.el7_9.x86_64                                                                                              3/3 
          Verifying  : unzip-6.0-24.el7_9.x86_64                                                                                              1/3 
          Verifying  : libffi-devel-3.0.13-19.el7.x86_64                                                                                      2/3 
          Verifying  : ninja-build-1.10.2-3.el7.x86_64                                                                                        3/3 
        Installed:
          libffi-devel.x86_64 0:3.0.13-19.el7              ninja-build.x86_64 0:1.10.2-3.el7              unzip.x86_64 0:6.0-24.el7_9             
        Complete!
      3. 升级python3(以上以3.75为例)。
        1. 用户自行准备Python-3.7.5源码包并上传至服务器任意目录,执行如下命令解压。

          unzip Python-3.7.5.zip

        2. 进入解压后的文件夹,执行如下命令。

          配置命令:cd Python-3.7.5

          编译命令:./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared

          安装命令:make -j && make install

        3. 安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。

          python3 --version

    2. 执行如下命令,配置QEMU的构建环境和构建参数。

      ./configure --enable-kvm

    3. 执行如下命令,启动构建。

      make -j 64

    4. 执行如下命令,安装QEMU。

      make install

  11. 检查QEMU版本。

    1. 执行如下命令,重启libvirtd服务。

      service libvirtd restart

      [root@localhost etc]# service libvirtd restart
      Redirecting to /bin/systemctl restart libvirtd.service
    2. 执行如下命令,关闭AppArmor

      systemctl disable apparmor

      若系统环境为openEuler 22.03 LTS/openEuler 20.03 LTS/Kylin V10 SP2/Kylin V10/UOS V20(1050e)/CULinux 3.0系统,可跳过此步骤。

    3. 执行如下命令,重启系统。

      reboot

      若系统环境为openEuler 22.03 LTS/openEuler 20.03 LTS/Kylin V10 SP2/Kylin V10/UOS V20(1050e)/CULinux 3.0系统,可跳过此步骤。

    4. 执行如下命令,查看QEMU版本。

      virsh version

      [root@localhost qemu-4.1.0]# virsh version
      Compiled against library: libvirt 6.0.0
      Using library: libvirt 6.0.0
      Using API: QEMU 6.0.0
      Running hypervisor: QEMU 4.1.0