QEMU
QEMU 是一个通用的开源机器模拟器和虚拟化器。
QEMU 可以通过几种不同的方式使用。最常见的是系统模拟,它提供了一个完整机器(CPU、内存和模拟设备)的虚拟模型来运行客户操作系统。在这种模式下,CPU 可以被完全模拟,或者它可以利用硬件虚拟化技术与诸如 KVM、Xen 或其他框架的虚拟机监控程序一起工作,以允许客户操作系统直接在宿主机 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 下挂载持久性文件系统并选择它来存储 apkovl 和 apkcache 来实现。
准备带有虚拟驱动器的 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 视频,请将此配置添加到 /etc/X11/xorg.conf
内容 /etc/X11/xorg.conf
在 Alpine Linux 上使用 KVM/QEMU 运行客户操作系统
安装
# apk add qemu-system-x86_64 qemu-modules libvirt libvirt-qemu
将 tun 添加到 /etc/modules
# echo tun >> /etc/modules
现在启动 tun
# modprobe tun
将您的用户添加到 kvm 和 qemu 组
# 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 为客户操作系统提供基本的网络访问。