BLFS QEMU

QEMU 是x86硬件提供了虚拟化扩展(Intel VT / AMD-V)的完全虚拟化解决方案。

依赖

  • 必须:

  • 建议:

    • alsa-lib 考虑到我使用的虚拟机主要用于服务器,对音频没有需求,所以不安装这个ALSA库

    • dtc Device Tree Compiler,用于设备树源代码和二进制文件,例如 libfdt 以二进制格式读取和操作设备树,不确定是否需要,暂时不安装

    • libslirp 用于虚拟机,容器和相关工具的用户模式网络库,感觉有用,且只依赖 glib

    • sdl2 Simple DirectMedia Layer Version 2: 跨平台用于编写多媒体软件,暂不安装

备注

我只依赖编译安装了 libslirp ,不过实践验证使用并没有问题。包括VNC桌面也能够正常使用,见 在QEMU中运行debian

内核

  • 以下内核配置需要激活以支持虚拟化

内核支持
[*] Virtualization --->                                         [VIRTUALIZATION]
  <*/M>   Kernel-based Virtual Machine (KVM) support                       [KVM]
  # Enable the option for your CPU:
  < /*/M>   KVM for Intel (and compatible) processors support        [KVM_INTEL]
  < /*/M>   KVM for AMD processors support                             [KVM_AMD]

[*] Networking support --->                                                [NET]
  Networking options --->
    <*/M> 802.1d Ethernet Bridging                                      [BRIDGE]

Device Drivers --->
  [*] Network device support --->                                   [NETDEVICES]
    [*]   Network core driver support                                 [NET_CORE]
    <*/M>   Universal TUN/TAP device driver support                        [TUN]
  • 编译内核

编译内核
#编译内核映像和模块
make

#安装内核模块
make modules_install

# 复制编译好的内核
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.10.5-lfs-12.2

# System.map 是内核符号文件,它将内核 API 的每个函数入口点和运行时数据结构映射到它们的地址。它被用于调查分析内核可能出现的问题。
cp -iv System.map /boot/System.map-6.10.5

# 内核配置文件 .config 由上述的 make menuconfig 步骤生成,包含编译好的内核的所有配置选项。最好能将它保留下来以供日后参考
cp -iv .config /boot/config-6.10.5

# 安装 Linux 内核文档
cp -r Documentation -T /usr/share/doc/linux-6.10.5

安装

安装qemu
cd /sources

qemu_VERSION=9.0.2
tar xf qemu-${qemu_VERSION}.tar.xz
cd qemu-${qemu_VERSION}

# 添加用户组名
usermod -a -G kvm admin

# qemu可以运行不同平台,当使用 --target-list 并使用逗号分隔的列表,则可以构建多个目标平台
if [ $(uname -m) = i686 ]; then
   QEMU_ARCH=i386-softmmu
else
   QEMU_ARCH=x86_64-softmmu
fi


mkdir -vp build &&
cd        build &&

# BLFS手册配置
# disable-pa表示关闭PalseAudio sound支持

#../configure --prefix=/usr               \
#             --sysconfdir=/etc           \
#             --localstatedir=/var        \
#             --target-list=$QEMU_ARCH    \
#             --audio-drv-list=alsa       \
#             --disable-pa                \
#             --enable-slirp              \
#             --docdir=/usr/share/doc/qemu-${qemu_VERSION} &&

# 我没有启用alsa,所以关闭支持;也关闭docs
../configure --prefix=/usr               \
             --sysconfdir=/etc           \
             --localstatedir=/var        \
             --target-list=$QEMU_ARCH    \
             --disable-pa                \
             --enable-slirp              \
             --disable-docs &&


unset QEMU_ARCH &&

make

make install

#修订helper脚本属主,这个脚本将被 "bridge" 网络设备使用
chgrp kvm  /usr/libexec/qemu-bridge-helper &&
chmod 4750 /usr/libexec/qemu-bridge-helper

# 为方便使用构建软链接
ln -sv qemu-system-`uname -m` /usr/bin/qemu

BLFS qemu使用bridge网络

案例采用 在QEMU中运行debian :

执行安装
qemu-system-x86_64 \
    -nodefaults \
    -enable-kvm \
    -cpu host,kvm=off \
    -m 8G \
    -smp cores=4 \
    -boot order=c,once=d,menu=on \
    -drive file=/sources/images/debian.qcow,if=virtio \
    -cdrom /sources/debian-cd_current_amd64_iso-dvd_debian-12.9.0-amd64-DVD-1.iso \
    -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net bridge,br=br0 \
    -nographic \
    -vga none \
    -serial mon:stdio \
    -name "debian"

添加qemu ACL配置

警告

必须步骤

在BLFS的qemu章节,最后一段配置我最初忽略了,实际上和 bridge配置 br0 有一个对应的 qemu 配置 /etc/qemu/bridge.conf 通过以下命令构建:

生成bridge br0 对应配置指示qemu使用
install -vdm 755 /etc/qemu &&
echo allow br0 > /etc/qemu/bridge.conf

如果没有这个 /etc/qemu/bridge.conf 配置文件,那么在执行 qemu-system-x86_64 ... -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net bridge,br=br0 ... 会提示报错:

缺少 /etc/qemu/bridge.conf 配置导致使用bridge的qemu命令报错
failed to parse default acl file `/etc/qemu/bridge.conf'
qemu-system-x86_64: -net bridge,br=br0: bridge helper failed

加载tun内核模块

使用 bridge 网络时,需要访问 /dev/net/tun 设备,如果内核没有加载这个模块,会提示错误:

内核没有加载 tun 模块,则提示错误
failed to open /dev/net/tun: No such file or directory
qemu-system-x86_64: -net bridge,br=br0: bridge helper failed

手工加载模块:

内核加载 tun 模块
modprobe tun

配置启动加载模块:

内核加载 tun 模块配置文件
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/tun.conf << "EOF"
# Begin /etc/modprobe.d/tun.conf

tun

# End /etc/modprobe.d/tun.conf
EOF

BLFS qemu使用

参考