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'...
同步 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
查看 相关的 配置 说明 。
配置 选项 –enable-bpf 需要 库 libbpf 支持 。
而 Ubuntu 20.04 没有 该库包 而是 提供了 libbcc .
到 网站 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 。
还有 其他的 配置 需要的 库 或者 其他 的可行文件 。 类似 方法 解决 问题 。
如 有的 老机器 不支持 浮点运算, 不支持 openGL ,不支持 KVM 等等 。。。
相关的 使能 选项 没有 意义。 正所谓 “巧妇难为无米之炊”
比如 选项 –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 种 存在 三种 生效 环境变量的 文件 。 分别是 :
针对不同 用户 ,不同 场景 用法 不同 。
终极 即时 生效 命令 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 .
根据 实际需求 调试 安装 不同的 开发 版本 。
哈哈 !!