QEMU

来自 Alpine Linux

QEMU 是一个通用的开源机器模拟器和虚拟化器。

QEMU 可以通过几种不同的方式使用。最常见的是系统模拟,它提供了一个完整机器(CPU、内存和模拟设备)的虚拟模型来运行客户操作系统。在这种模式下,CPU 可以被完全模拟,或者它可以利用硬件虚拟化技术与诸如 KVMXen 或其他框架的虚拟机监控程序一起工作,以允许客户操作系统直接在宿主机 CPU 上运行。

使用 QEMU 的第二种支持方式是用户模式模拟,其中 QEMU 可以在一个 CPU 上启动为另一个 CPU 编译的进程。在这种模式下,CPU 始终被模拟,并且 QEMU 能够虚拟化或模拟 x86、x86_64、PowerPC、ARM 和 S390 客户机。

在 QEMU 中安装 Alpine Linux

开始之前

  • 下载最新的 Alpine 镜像
  • 在您的系统上安装 QEMU(例如 Ubuntu 上使用 sudo apt install qemu,Fedora 上使用 yum -y install qemu

如果您正在使用 Alpine Linux,您可以安装

# apk add qemu qemu-img qemu-system-x86_64 qemu-ui-gtk

创建虚拟机

如果您想安装 Alpine Linux,请创建一个磁盘镜像。

qemu-img create -f qcow2 alpine.qcow2 8G

以下命令使用 Alpine ISO 镜像作为 CDROM 启动 QEMU,使用默认网络配置、512MB 内存、上一步创建的磁盘镜像,并以 CDROM 作为启动设备。

qemu-system-x86_64 -m 512 -nic user -boot d -cdrom alpine-standard-3.21.3-x86_64.iso -hda alpine.qcow2 -display gtk -enable-kvm

提示: 如果您的硬件不支持,请移除选项 -enable-kvm

root 身份登录(无密码)并运行

setup-alpine

按照 setup-alpine 安装步骤操作。

运行 poweroff 关闭机器。

启动虚拟机

安装完成后,QEMU 可以从磁盘镜像启动(-boot c),无需 CDROM。

qemu-system-x86_64 -m 512 -nic user -hda alpine.qcow2

Live 模式

要仅在无盘模式下试用 Alpine Linux,可以使用 qemu 启动 .iso 文件,而无需任何虚拟 HDD 镜像或进一步配置。

qemu-system-x86_64 -m 512 -nic user -boot d -cdrom alpine-3.21.3-x86_64.iso --accel kvm

让 .iso 镜像加载 apkovl

这通过在 /media 下挂载持久性文件系统并选择它来存储 apkovlapkcache 来实现。

准备带有虚拟驱动器的 KVM

mkdir -p /media/usb/images qemu-img create -f raw /media/usb/images/mykvm.config 32M qemu-system-x86_64 -enable-kvm -m 384 \ -name mykvm \ -cdrom /media/usb/images/alpine-3.21.3-x86_64.iso \ -drive file=/media/usb/images/mykvm.config,if=virtio \ -net lan \ -boot d &

在 KVM 内部(运行 Alpine Linux)

fdisk /dev/vda  #creating a partition
mkdosfs /dev/vda1
mkdir -p /media/vda1
echo "/dev/vda1 /media/vda1 vfat rw 0 0" >> /etc/fstab
mount -a
setup-alpine  # (select vda1 for saving configs)
lbu commit

下一次重启将加载在 /dev/vda1 上找到的生成的 apkovl 和 apkcache -- 完全基于最新的官方 ISO 从 RAM 运行。

高级网络配置

为了使网络正确运行,您可以使用 tun/tap 接口,它将成为一个真正的接口。关键是在正确的虚拟 VLAN 上定义虚拟网络接口,以及正确的 ifup 脚本。

您需要在命令行界面上使用 2 个 net 命令,一个用于宿主机

-net tap,vlan=[somenumber],ifname=[host if],script=[some script]

一个用于客户机

-net nic,vlan=[samenumber]

因此,要在连接到物理宿主机上的 tap0 的 qemu 虚拟系统上拥有单个网卡

qemu -net tap,vlan=0,ifname=tap0,script=./qemu-ifup -net nic,vlan0 \
    -boot d -cdrom alpine*.iso}}


要创建具有多个网卡的 qemu 客户机,只需重复 `-net` 命令

qemu -net tap,vlan=0,ifname=tap0,script=./qemu-ifup -net nic,vlan0 \
      -net tap,vlan=0,ifname=tap1,script=./qemu-ifup -net nic,vlan0 \
      -net tap,vlan=0,ifname=tap2,script=./qemu-ifup -net nic,vlan0 \
      -boot d -cdrom alpine*.iso}}

现在您的 Alpine 客户机将拥有 3 个网卡,分别映射到 tap0、tap1 和 tap2。

实际发生的情况是您正在有效地创建一个点对点隧道,其中物理 tap0 设备是一个端点,虚拟机的 eth0 是隧道的另一个端点。

因此,您需要为隧道的两侧都分配 IP 地址。qemu-ifup 脚本是为主机执行此操作的脚本。这是一个示例

#!/bin/sh
case $1 in
      tun0 | tap0 )
              sudo /sbin/ip addr add 192.168.1.100/24 dev $1
              sudo /sbin/ip link set $1 up
              ;;
      tap1 | tun1 )
              sudo /sbin/ip addr add 192.168.2.100/24 dev $1
              sudo /sbin/ip link set $1 up
              ;;
      tap2 | tun2 )
              sudo /sbin/ip addr add 192.168.3.100/24 dev $1
              sudo /sbin/ip link set $1 up
              ;;
      esac

在您的 alpinebox 中,创建如下的接口文件

iface eth0 inet static
      address 192.168.1.1
      netmask 255.255.255.0
      gateway 192.168.1.100

iface eth1 inet static
      address 192.168.2.1
      netmask 255.255.255.0

iface eth0 inet static
      address 192.168.3.1
      netmask 255.255.255.0

如果在您的主机上,您现在为 tap0 向您主机的默认网卡添加一个 MASQUERADE 规则,并在您的主机上启用 ip_forward,您现在可以直接从您的 qemu 客户机执行 svn 更新、浏览、运行传输等操作。

在 QEMU 中使用 Xorg

对于 Alpine 3.17 及更早版本,QEMU 中 Xorg 所需的视频驱动程序是 xf86-video-modesetting。在较新版本的 Alpine 中,该驱动程序会自动作为 setup-xorg-base 的一部分拉取。

提示: 可能对于 KVM/Qemu 客户机,您想使用 qxl 视频和显示 Spice。为此,请在客户机上安装 xf86-video-qxl,并在主机上运行 Spice 客户端

如果您决定在 KVM/Qemu 客户机上使用 qxl 视频,请将此配置添加到 /etc/X11/xorg.conf

内容 /etc/X11/xorg.conf

Section "Device" Identifier "qxl" Driver "qxl" Option "ENABLE_SURFACES" "False" EndSection

在 Alpine Linux 上使用 KVM/QEMU 运行客户操作系统

安装

# apk add qemu-system-x86_64 qemu-modules libvirt libvirt-qemu

注意: 也可以安装 virt-manager 以获得 KVM/QEMU 图形界面

tun 添加到 /etc/modules

# echo tun >> /etc/modules

现在启动 tun

# modprobe tun

将您的用户添加到 kvmqemu

# addgroup <username> kvm

# adduser <username> qemu

注销以使组更改生效

添加服务

# rc-update add libvirtd

# rc-update add libvirt-guests

现在启动服务

# rc-service libvirtd start

# rc-service libvirt-guests start

如果您有兴趣使用桥接网络(以便可以从外部轻松访问客户机),请参阅 Bridge

故障排除

qemu-system-x86_64: 警告: hub 0 没有网卡

发出命令 qemu-system-x86_64 -net user 可能会生成上述错误消息,即使您的宿主机操作系统中有可用的互联网连接,您也无法在客户操作系统中使用网络。这通常是由于 QEMU 缺少对 USB 无线网络适配器等硬件的支持。使用选项 qemu-system-x86_64 -net nic,model=virtio -net user 可以解决上述错误。请注意,-net user 选项使用 NAT 为客户操作系统提供基本的网络访问。

参见

Qemu 官方 Wiki Qemu 入门