2021-06-24

Ubuntu20.04源码编译 QEMU

Ubuntu20.04源码编译 QEMU


对于嵌入式开发工程师而言 ,QEMU 是一款 很好 用的 开源 软件 ,可以 模拟调试 edk2 ( UEFI的具体实现 ),
u-boot , linuxkernel , ARM开发版 vexpress-a9 , 64位 aarch64 ARM板 Juno , 等等 。
而 Android 的 虚拟机 就是 用的 QEMU .。

开发时 系统自带的 qemu (使用 sudo apt install qemu qemu-system-arm ) 更新慢, 不能 满足 特定的需求, 不利于 开发调试,就需要 自己 编译 定制 QEMU 。 下面 我记录一下 ,遇到的 问题 和 解决 办法 。

下载源码

加速 设置

修改 文件 ~/.gitconfig 没有 就 创建 这个是 用户的 git 全局配置文件

[user]
	email = [email protected]
	name = larphy

[color]
	ui = auto

[url "https://hub.fastgit.org/"]
	insteadof = https://github.com/

[url "https://mirrors.bfsu.edu.cn/git/AOSP/"]
	insteadof = https://android.googlesource.com/

[url "https://raw.githubusercontent.com/"]
	insteadof = https://raw.sevencdn.com/

[http]
	lowSpeedLimit = 1000
	lowSpeedTime = 600
	postBuffer = 5368709120

[credential]
	helper = store

使用 命令 git config --list 查看 :

filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
user.email=[email protected]
user.name=larphy
color.ui=auto
url.https://hub.fastgit.org/.insteadof=https://github.com/
url.https://mirrors.bfsu.edu.cn/git/AOSP/.insteadof=https://android.googlesource.com/
url.https://raw.githubusercontent.com/.insteadof=https://raw.sevencdn.com/
http.lowspeedlimit=1000
http.lowspeedtime=600
http.postbuffer=5368709120
credential.helper=store

源码下载

  git  clone   https://gitlab.com/qemu-project/qemu.git  

  git   submodule   update   --init   --recursive  

子模组 'capstone'(https://gitlab.com/qemu-project/capstone.git)已对路径 'capstone' 注册
子模组 'dtc'(https://gitlab.com/qemu-project/dtc.git)已对路径 'dtc' 注册
子模组 'meson'(https://gitlab.com/qemu-project/meson.git)已对路径 'meson' 注册
子模组 'roms/QemuMacDrivers'(https://gitlab.com/qemu-project/QemuMacDrivers.git)已对路径 'roms/QemuMacDrivers' 注册
子模组 'roms/SLOF'(https://gitlab.com/qemu-project/SLOF.git)已对路径 'roms/SLOF' 注册
子模组 'roms/edk2'(https://gitlab.com/qemu-project/edk2.git)已对路径 'roms/edk2' 注册
子模组 'roms/ipxe'(https://gitlab.com/qemu-project/ipxe.git)已对路径 'roms/ipxe' 注册
子模组 'roms/openbios'(https://gitlab.com/qemu-project/openbios.git)已对路径 'roms/openbios' 注册
子模组 'roms/opensbi'(https://gitlab.com/qemu-project/opensbi.git)已对路径 'roms/opensbi' 注册
子模组 'roms/qboot'(https://gitlab.com/qemu-project/qboot.git)已对路径 'roms/qboot' 注册
子模组 'roms/qemu-palcode'(https://gitlab.com/qemu-project/qemu-palcode.git)已对路径 'roms/qemu-palcode' 注册
子模组 'roms/seabios'(https://gitlab.com/qemu-project/seabios.git/)已对路径 'roms/seabios' 注册
子模组 'roms/seabios-hppa'(https://gitlab.com/qemu-project/seabios-hppa.git)已对路径 'roms/seabios-hppa' 注册
子模组 'roms/sgabios'(https://gitlab.com/qemu-project/sgabios.git)已对路径 'roms/sgabios' 注册
子模组 'roms/skiboot'(https://gitlab.com/qemu-project/skiboot.git)已对路径 'roms/skiboot' 注册
子模组 'roms/u-boot'(https://gitlab.com/qemu-project/u-boot.git)已对路径 'roms/u-boot' 注册
子模组 'roms/u-boot-sam460ex'(https://gitlab.com/qemu-project/u-boot-sam460ex.git)已对路径 'roms/u-boot-sam460ex' 注册
子模组 'roms/vbootrom'(https://gitlab.com/qemu-project/vbootrom.git)已对路径 'roms/vbootrom' 注册
子模组 'slirp'(https://gitlab.com/qemu-project/libslirp.git)已对路径 'slirp' 注册
子模组 'tests/fp/berkeley-softfloat-3'(https://gitlab.com/qemu-project/berkeley-softfloat-3.git)已对路径 'tests/fp/berkeley-softfloat-3' 注册
子模组 'tests/fp/berkeley-testfloat-3'(https://gitlab.com/qemu-project/berkeley-testfloat-3.git)已对路径 'tests/fp/berkeley-testfloat-3' 注册
子模组 'ui/keycodemapdb'(https://gitlab.com/qemu-project/keycodemapdb.git)已对路径 'ui/keycodemapdb' 注册
正克隆到 '/home/larphy/work/qemu/capstone'...
正克隆到 '/home/larphy/work/qemu/dtc'...
正克隆到 '/home/larphy/work/qemu/meson'...
正克隆到 '/home/larphy/work/qemu/roms/QemuMacDrivers'...
正克隆到 '/home/larphy/work/qemu/roms/SLOF'...
正克隆到 '/home/larphy/work/qemu/roms/edk2'...
正克隆到 '/home/larphy/work/qemu/roms/ipxe'...
正克隆到 '/home/larphy/work/qemu/roms/openbios'...
正克隆到 '/home/larphy/work/qemu/roms/opensbi'...
正克隆到 '/home/larphy/work/qemu/roms/qboot'...
正克隆到 '/home/larphy/work/qemu/roms/qemu-palcode'...
正克隆到 '/home/larphy/work/qemu/roms/seabios'...
正克隆到 '/home/larphy/work/qemu/roms/seabios-hppa'...
正克隆到 '/home/larphy/work/qemu/roms/sgabios'...
正克隆到 '/home/larphy/work/qemu/roms/skiboot'...
正克隆到 '/home/larphy/work/qemu/roms/u-boot'...
正克隆到 '/home/larphy/work/qemu/roms/u-boot-sam460ex'...
正克隆到 '/home/larphy/work/qemu/roms/vbootrom'...
正克隆到 '/home/larphy/work/qemu/slirp'...
正克隆到 '/home/larphy/work/qemu/tests/fp/berkeley-softfloat-3'...
正克隆到 '/home/larphy/work/qemu/tests/fp/berkeley-testfloat-3'...
正克隆到 '/home/larphy/work/qemu/ui/keycodemapdb'...
子模组路径 'capstone':检出 'f8b1b833015a4ae47110ed068e0deb7106ced66d'
子模组路径 'dtc':检出 '85e5d839847af54efab170f2b1331b2a6421e647'
子模组路径 'meson':检出 '776acd2a805c9b42b4f0375150977df42130317f'
子模组路径 'roms/QemuMacDrivers':检出 '90c488d5f4a407342247b9ea869df1c2d9c8e266'
子模组路径 'roms/SLOF':检出 '33a7322de13e9dca4b38851a345a58d37e7a441d'
子模组路径 'roms/edk2':检出 '06dc822d045c2bb42e497487935485302486e151'
子模组 'SoftFloat'(https://github.com/ucb-bar/berkeley-softfloat-3.git)已对路径 'roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3' 注册
子模组 'BaseTools/Source/C/BrotliCompress/brotli'(https://github.com/google/brotli)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli' 注册
子模组 'CryptoPkg/Library/OpensslLib/openssl'(https://github.com/openssl/openssl)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl' 注册
子模组 'MdeModulePkg/Library/BrotliCustomDecompressLib/brotli'(https://github.com/google/brotli)已对路径 'roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli' 注册
子模组 'MdeModulePkg/Universal/RegularExpressionDxe/oniguruma'(https://github.com/kkos/oniguruma)已对路径 'roms/edk2/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma' 注册
子模组 'UnitTestFrameworkPkg/Library/CmockaLib/cmocka'(https://git.cryptomilk.org/projects/cmocka.git)已对路径 'roms/edk2/UnitTestFrameworkPkg/Library/CmockaLib/cmocka' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/CryptoPkg/Library/OpensslLib/openssl'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/UnitTestFrameworkPkg/Library/CmockaLib/cmocka'...
子模组路径 'roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3':检出 'b64af41c3276f97f0e181920400ee056b9c88037'
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli':检出 '666c3280cc11dc433c303d79a83d4ffbdd12cc8d'
子模组 'research/esaxx'(https://github.com/hillbig/esaxx)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx' 注册
子模组 'research/libdivsufsort'(https://github.com/y-256/libdivsufsort.git)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort'...
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx':检出 'ca7cb332011ec37a8436487f210f396b84bd8273'
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort':检出 '5f60d6f026c30fb4ac296f696b3c8b0eb71bd428'
子模组路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl':检出 'e2e09d9fba1187f8d6aafaa34d4172f56f1ffb72'
子模组 'boringssl'(https://boringssl.googlesource.com/boringssl)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/boringssl' 注册
子模组 'krb5'(https://github.com/krb5/krb5)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/krb5' 注册
子模组 'pyca.cryptography'(https://github.com/pyca/cryptography.git)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/pyca-cryptography' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/CryptoPkg/Library/OpensslLib/openssl/boringssl'...

boringssl 问题

同步 roms/edk2/CryptoPkg/Library/OpensslLib/openssl 目录下面 的 boringssl 出错

因为 找不到 URL https://boringssl.googlesource.com/boringssl 国内 屏蔽了 google 的下载 。

解决问题 :

打开 快速 github 网页 https://hub.fastgit.org/

搜索 关键字 boringssl

可以搜到 https://hub.fastgit.org/google/boringssl.git 这个 就是 github 的 仓

转到 目录 roms/edk2/CryptoPkg/Library/OpensslLib/openssl 下, 执行

cd   roms/edk2/CryptoPkg/Library/OpensslLib/openssl  

git  clone   https://hub.fastgit.org/google/boringssl.git

gedit  .gitmodules  &

cd -

并且 修改 隐藏文件 .gitmodules 文件 将 boringssl 的 URL 改为 https://hub.fastgit.org/google/boringssl.git

可以保证 下次升级 也不会 报错 了。

返回 qemu 源码 目录下 ,再次 执行 git submodule update --init --recursive 就可以 pass .

至此, 下载到 完整的 QEMU 源码 。

我的 配置 结果 如下 :

# 为了 保持 源码的 整洁 ,建议  返回 源码 上级 目录   创建 build  文件夹 。 
#  执行  
../qemu/configure    --prefix=/usr/local/qemu  \
  --target-list=arm-softmmu,aarch64-softmmu,x86_64-softmmu,riscv32-softmmu,riscv64-softmmu   \
  --audio-drv-list=alsa,pa     --enable-bpf   \
  --enable-vhost-vsock   --enable-vhost-net    --enable-profiler  \
  --enable-plugins    --gdb=/usr/local/bin/gdb   --enable-gprof  \
  --enable-gcov    --enable-modules  --enable-libudev   --enable-kvm  \
  --enable-vvfat  --enable-opengl      --enable-debug    --enable-fuse   \
  --enable-fuse-lseek    --enable-multiprocess       --enable-avx512f   \
  --enable-lto       --enable-linux-aio    --enable-libnfs     --enable-vhost-crypto  \
  --enable-vhost-kernel     --enable-gtk

通过 命令

../qemu/configure     --help 

查看 相关的 配置 说明 。

libbpf 问题

配置 选项 –enable-bpf 需要 库 libbpf 支持 。

而 Ubuntu 20.04 没有 该库包 而是 提供了 libbcc .

解决问题

  • 求助 万能的 github

到 网站 https://hub.fastgit.org/ 而不是 https://github.com/ (太慢,有时还打不开)

搜索 关键字 libbpf

https://hub.fastgit.org/libbpf/libbpf

git clone https://hub.fastgit.org/libbpf/libbpf

,按照 README.md 文件 的 提示 --> 编译 并安装 , 注意 libbpf.pc 文件 复制到 PKG_CONFIG_PATH 可以找到 的 路径

如 我的

/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig

sudo   cp    libbpf.pc    /usr/lib/x86_64-linux-gnu/pkgconfig

这样 配置 和编译 选项 –enable-bpf 都可以 PASS 。

还有 其他的 配置 需要的 库 或者 其他 的可行文件 。 类似 方法 解决 问题 。

解决思路

  • 通过 sudo apt search libxxx 或者 sudo apt search XXXX , 找到相关的 库, 并安装 , 再 配置
  • 求助 于 github . 如上所述 。
  • ​ 查看 官网的 相关 解决办法 。

不能解决的问题

硬件不支持

如 有的 老机器 不支持 浮点运算, 不支持 openGL ,不支持 KVM 等等 。。。

相关的 使能 选项 没有 意义。 正所谓 “巧妇难为无米之炊

需要 链接符号 或者 debug信息的 release 库

比如 选项 –enable-tsan –enable-sanitizers

都会 报出 链接 错误 。。。 。。。

配置结果

Build targets in project: 568

qemu 6.0.50

  Directories
                   Install prefix: /usr/local/qemu
                   BIOS directory: share/qemu
                    firmware path: /usr/local/qemu/share/qemu-firmware
                 binary directory: bin
                library directory: lib
                 module directory: lib/qemu
                libexec directory: libexec
                include directory: include
                 config directory: /usr/local/qemu/etc
            local state directory: /usr/local/qemu/var
                 Manual directory: share/man
                    Doc directory: /usr/local/qemu/share/doc
                  Build directory: /home/larphy/embed/qemu/build
                      Source path: /home/larphy/embed/qemu/source/qemu
                   GIT submodules: ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc capstone slirp

  Host binaries
                              git: git
                             make: make
                           python: /usr/bin/python3 (version: 3.8)
                     sphinx-build: YES
                              gdb: /usr/local/bin/gdb
                      genisoimage: /usr/bin/genisoimage
                             smbd: "/usr/sbin/smbd"

  Configurable features
                    Documentation: YES
            system-mode emulation: YES
              user-mode emulation: NO
                      block layer: YES
                    Install blobs: YES
                   module support: YES
          alternative module path: NO
                   plugin support: YES
                  fuzzing support: NO
                    Audio drivers: alsa pa
                   Trace backends: log
                    QOM debugging: YES
             vhost-kernel support: YES
                vhost-net support: YES
             vhost-crypto support: YES
               vhost-scsi support: YES
              vhost-vsock support: YES
               vhost-user support: YES
    vhost-user-blk server support: YES
            vhost-user-fs support: YES
               vhost-vdpa support: YES
                build guest agent: YES

  Compilation
                         host CPU: x86_64
                  host endianness: little
                       C compiler: cc
                  Host C compiler: cc
                     C++ compiler: c++
                          ARFLAGS: rv
                           CFLAGS: -O0 -g
                         CXXFLAGS: -O0 -g
                      QEMU_CFLAGS: -p -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong
                     QEMU_LDFLAGS: -Wl,--warn-common -p -Wl,-z,relro -Wl,-z,now -m64  -fstack-protector-strong
                         profiler: YES
     link-time optimization (LTO): YES
                              PIE: YES
                     static build: NO
              malloc trim support: YES
                       membarrier: NO
                   preadv support: YES
                        fdatasync: YES
                          madvise: YES
                    posix_madvise: YES
                   posix_memalign: YES
                debug stack usage: NO
                  mutex debugging: YES
                 memory allocator: system
                avx2 optimization: YES
             avx512f optimization: YES
                    gprof enabled: YES
                             gcov: YES
                 thread sanitizer: NO
                      CFI support: NO
                   strip binaries: NO
                           sparse: NO
                  mingw32 support: NO
                        arm tests: arm-linux-gnueabihf-gcc
                    aarch64 tests: aarch64-linux-gnu-gcc
                     x86_64 tests: cc
                    riscv64 tests: riscv64-linux-gnu-gcc via debian-riscv64-cross

  Targets and accelerators
                      KVM support: YES
                      HAX support: NO
                      HVF support: NO
                     WHPX support: NO
                     NVMM support: NO
                      Xen support: YES
                 xen ctrl version: 41100
                      TCG support: YES
                      TCG backend: native (x86_64)
                TCG debug enabled: YES
                      target list: arm-softmmu aarch64-softmmu x86_64-softmmu riscv32-softmmu riscv64-softmmu
                  default devices: YES
         out of process emulation: YES

  Block layer support
                coroutine backend: ucontext
                   coroutine pool: YES
             Block whitelist (rw): 
             Block whitelist (ro): 
                   VirtFS support: YES
            build virtiofs daemon: YES
             Live block migration: YES
              replication support: YES
                    bochs support: YES
                    cloop support: YES
                      dmg support: YES
                  qcow v1 support: YES
                      vdi support: YES
                    vvfat support: YES
                      qed support: YES
                parallels support: YES
                     FUSE exports: YES

  Crypto
                     TLS priority: "NORMAL"
                   GNUTLS support: YES
                        libgcrypt: NO
                           nettle: YES
                              XTS: YES
                     crypto afalg: NO
                         rng-none: NO
                    Linux keyring: YES

  Dependencies
                      SDL support: NO
                SDL image support: NO
                      GTK support: YES
                           pixman: YES
                      VTE support: YES
                    slirp support: system
                         libtasn1: YES
                              PAM: NO
                    iconv support: YES
                   curses support: YES
                    virgl support: YES
                     curl support: YES
                Multipath support: NO
                      VNC support: YES
                 VNC SASL support: YES
                 VNC JPEG support: YES
                  VNC PNG support: YES
                   brlapi support: YES
                      vde support: NO
                   netmap support: NO
                Linux AIO support: YES
           Linux io_uring support: NO
               ATTR/XATTR support: YES
                     RDMA support: YES
                   PVRDMA support: YES
                      fdt support: system
                libcap-ng support: YES
                      bpf support: YES
                    spice support: YES
                      rbd support: YES
                   xfsctl support: YES
                smartcard support: YES
                      U2F support: NO
                           libusb: YES
                    usb net redir: YES
                   OpenGL support: YES
                              GBM: YES
                 libiscsi support: YES
                   libnfs support: YES
                  seccomp support: YES
                GlusterFS support: NO
                      TPM support: YES
                   libssh support: YES
                      lzo support: NO
                   snappy support: NO
                    bzip2 support: YES
                    lzfse support: NO
                     zstd support: NO
                NUMA host support: YES
                          libxml2: YES
                         capstone: internal
                  libpmem support: YES
                libdaxctl support: NO
                          libudev: YES
                       FUSE lseek: YES

  Subprojects
                    libvhost-user: YES

Found ninja-1.10.0 at /usr/bin/ninja


编译 和 安装

make   -j8

sudo  make  install

验证结果

/usr/local/qemu/bin$ ./qemu-system-arm   -M  help./qemu-system-arm: error while loading shared libraries: libbpf.so.0: cannot open shared object file: No such file or directory

查看 上面提到 的 libbpf.pc 文件


libbpf/src$ cat   libbpf.pc
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)

prefix=/usr
libdir=${prefix}/lib64
includedir=${prefix}/include

Name: libbpf
Description: BPF library
Version: 0.5.0
Libs: -L${libdir} -lbpf
Requires.private: libelf zlib
Cflags: -I${includedir}

发现 库文件的 路径 再 /usr/lib64 目录下面 默认 找不到 。

执行 命令 :

libbpf/src$   sudo  cp  -fp  libbpf.so*    /usr/lib

libbpf/src$   sudo  cp  -fp  libbpf.so*    /usr/lib/x86_64-linux-gnu/

就可以 解决 问题 了 。

/usr/local/qemu/bin$ ./qemu-system-arm    --version
QEMU emulator version 6.0.50 (v6.0.0-1902-gb22726abdf-dirty)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
_mcleanup: gmon.out: Permission denied

还有 其他的

/usr/local/qemu/bin$ ls
elf2dmp    qemu-ga   qemu-io      qemu-nbd        qemu-storage-daemon  qemu-system-arm      qemu-system-riscv64
qemu-edid  qemu-img  qemu-keymap  qemu-pr-helper  qemu-system-aarch64  qemu-system-riscv32  qemu-system-x86_64

添加环境变量使用新编译版本

在 ubuntu 种 存在 三种 生效 环境变量的 文件 。 分别是 :

  • $HOME/.bashrc 每次 重启 终端 都会生效 。
  • $HOME/.profile 用户 注销后再次登录 就会 生效 。
  • /etc/profile 重启,开机登录 后, 生效 。

针对不同 用户 ,不同 场景 用法 不同 。

终极 即时 生效 命令 source (上面 三个文件 之一)

如 :

source ~/.bashrc

添加原则: 尽量不影响 原来的 环境 。

我是 修改 $HOME/.profile 实现的 。如下 所示 。

#  add compiled qemu envs for developer
if [ -d "/usr/local/qemu/bin" ] ; then
	export QEMU_HOME=/usr/local/qemu
	export PATH=$QEMU_HOME/bin:$QEMU_HOME/libexec:$PATH
	export LD_LIBRARY_PATH=$QEMU_HOME/lib/qemu:$LD_LIBRARY_PATH
	export MANPATH=$QEMU_HOME/share/man:$MANPATH
fi

使用 source ~/.profile 即时 生效 。

至此 可以 完全 使用 自己编译的 qemu .

根据 实际需求 调试 安装 不同的 开发 版本 。

哈哈 !!

你可能感兴趣的:(github,qemu)