8. Virtualization
虚拟化允许在另一个操作环境中作为任务运行完整的操作系统或虚拟机(VM)。有几个商业和开源环境可以模拟另一个处理器或利用主机处理器的硬件虚拟化特性。
8.1 qemu-7.2.0
安装qemu
qemu是x86硬件上的Linux的完全虚拟化解决方案,包含虚拟化扩展(Intel VT或AMD-V)。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://download.qemu.org/qemu-7.2.0.tar.xz
-
下载MD5校验和: 7630d6a9eba7ab2bcb9979d6d24c2697
-
下载大小: 117 MB
-
预计所需磁盘空间: 2.1 GB
-
预计构建时间: 1.3 SBU (为测试添加2.0 SBU,都使用并行度=4)
Qemu 依赖
需要
GLib-2.74.5, 和 a graphical environment
推荐
alsa-lib-1.2.8, Libslirp-4.7.0, 和 SDL2-2.26.3
可选
根据音响系统的不同,ALSA-1.2.7, Python-3.11.2, PulseAudio-16.1, BlueZ-5.66, cURL-7.88.1, Cyrus SASL-2.1.28, GnuTLS-3.8.0, GTK+-2.24.33, GTK+-3.24.36, libusb-1.0.26, libgcrypt-1.10.1, libssh2-1.10.0, LZO-2.10, Nettle-3.8.1, Mesa-22.3.5, SDL-1.2.15, VTE-0.70.3 or Vte-0.28.2, 和 libcacard 中的各种包。
可选 (用于构建文档)
注意
这个可选的依赖项列表并不全面。有关更完整的列表,请参阅./configure –help的输出。
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/qemu
KVM 先决条件
在构建qemu之前,检查您的处理器是否支持虚拟化技术(VT,Virtualization Technology):
grep -E '^flags.*(vmx|svm)' /proc/cpuinfo
如果您得到任何输出,则表示您拥有VT技术(Intel处理器的vmx和AMD处理器的svm)。然后,您需要进入系统BIOS并确保它已启用。启用后,重新启动到LFS实例。
内核配置
在内核配置中启用以下选项,必要时重新编译内核:
[*] Virtualization: ---> [CONFIG_VIRTUALIZATION]
<*/M> Kernel-based Virtual Machine (KVM) support [CONFIG_KVM]
<*/M> KVM for Intel (and compatible) processors support [CONFIG_KVM_INTEL]
<*/M> KVM for AMD processors support [CONFIG_KVM_AMD]
英特尔或AMD的设置不是必需的,但是需要与您的系统处理器匹配的设置。
要使用“桥接”网络设备,如下所述,检查bridge-utils-1.7.1是否已经安装,并在内核配置中启用以下选项:
[*] Networking support ---> [CONFIG_NET]
Networking options --->
<*/M> 802.1d Ethernet Bridging [CONFIG_BRIDGE]
Device Drivers --->
[*] Network device support ---> [CONFIG_NETDEVICES]
<*/M> Universal TUN/TAP device driver support [CONFIG_TUN]
安装qemu
作为root用户,将任何可能使用KVM设备的用户添加到该组中:
usermod -a -G kvm <username>
运行以下命令安装qemu:
注意
Qemu能够攻击很多目标。构建过程还能够一次在一个逗号分隔的列表中构建多个目标,该列表分配给--target-list。运行 ./configure –help 获取可用目标的完整列表。
if [ $(uname -m) = i686 ]; then
QEMU_ARCH=i386-softmmu
else
QEMU_ARCH=x86_64-softmmu
fi
mkdir -vp build &&
cd build &&
../configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--target-list=$QEMU_ARCH \
--audio-drv-list=alsa \
--disable-pa \
--docdir=/usr/share/doc/qemu-7.2.0 &&
unset QEMU_ARCH &&
make
Qemu在构建时使用ninja作为子进程。要运行测试,请执行: ninja test.
现在,作为root用户:
make install
您还需要添加Udev规则,以便KVM设备获得正确的权限。作为root用户,发出:
cat > /lib/udev/rules.d/65-kvm.rules << "EOF"
KERNEL=="kvm", GROUP="kvm", MODE="0660"
EOF
更改helper脚本的权限和所有权,这在使用“桥接”网络设备时是必需的(见下文)。再次作为root用户,问题:
chgrp kvm /usr/libexec/qemu-bridge-helper &&
chmod 4750 /usr/libexec/qemu-bridge-helper
注意
为方便起见,您可能需要创建一个符号链接来运行已安装的程序。例如(作为root用户):
ln -sv qemu-system-`uname -m` /usr/bin/qemu
命令解释
--audio-drv-list=alsa --disable-pa: 此开关将音频驱动设置为ALSA。请参阅下文以启用其他音频驱动程序。
--audio-drv-list=pa --disable-alsa: 此开关将音频驱动程序设置为脉冲音频。对于其他驱动程序,请参见./configure –help输出中的–audio-drv-list选项。默认的音频驱动为OSS。要启用对alsa和pulseaudio的支持,请使用--audio-drv-list=alsa,pa。
使用 Qemu
由于使用qemu意味着使用虚拟计算机,因此设置虚拟机的步骤与设置真实计算机的步骤非常相似。你需要决定CPU、内存、磁盘、USB设备、网卡、屏幕大小等。一旦决定了“硬件”,你将不得不选择如何将机器连接到互联网,和/或安装操作系统。下面,我们将展示执行这些步骤的基本方法。但是qemu的功能远不止于此,强烈建议阅读qemu文档:/usr/share/doc/qemu-7.2.0/qemu-doc.html。
注意
标准做法是将运行qemu的计算机命名为“主机”,将运行qemu的模拟机器命名为“来宾”。我们将在下文中使用这些符号。
注意
下面的说明假设已经创建了可选的符号链接qemu。另外,qemu应该在图形环境中运行。但是可以“headless”或通过SSH使用qemu。请参阅文档了解各种可能性。
Disk
虚拟磁盘可以通过以下方式建立:
VDISK_SIZE=50G
VDISK_FILENAME=vdisk.img
qemu-img create -f qcow2 $VDISK_FILENAME $VDISK_SIZE
应该根据需要调整虚拟磁盘大小和文件名。文件的实际大小将小于指定的大小,但会根据需要扩展,因此设置一个高值是安全的。
操作系统
要安装操作系统,请从首选的Linux发行版下载iso映像。出于本例的目的,我们将使用Fedora-16-x86_64-Live-LXDE.iso。当前目录下的Iso文件。执行如下命令:
qemu -enable-kvm \
-drive file=$VDISK_FILENAME \
-cdrom Fedora-16-x86_64-Live-LXDE.iso \
-boot d \
-m 1G
遵循所选发行版的正常安装过程。-boot选项将驱动器的引导顺序指定为一串驱动器号。有效的驱动器号是:a, b(软盘1和2),c(第一块硬盘),d(第一张CD-ROM)。-m选项是用于虚拟机的内存量。选择取决于主机的负载。现代发行版应该对1GB感到满意。-enable-kvm选项允许硬件加速。如果没有这个开关,仿真就会慢得多。
定义虚拟硬件
虚拟机硬件由qemu命令行定义。下面给出一个示例命令:
qemu -enable-kvm \
-smp 4 \
-cpu host \
-m 1G \
-drive file=$VDISK_FILENAME \
-cdrom grub-img.iso \
-boot order=c,once=d,menu=on \
-net nic,netdev=net0 \
-netdev user,id=net0 \
-device ac97 \
-vga std \
-serial mon:stdio \
-name "fedora-16"
命令行选项的含义
-enable-kvm: 启用完全KVM虚拟化支持。在某些硬件上,为了启用KVM,可能需要添加未记录的-machine smm=off选项。
-smp <N>: 启用对称多处理
-cpu <model>: 模拟CPU
-drive file=<filename>: 定义一个虚拟磁盘,其映像存储在<filename>中。
-cdrom grub-img.iso: 定义要用作cdrom的iso格式文件。这里我们使用grub拯救盘,当启动时出现问题时,它可能会很方便。
-boot order=c,once=d,menu=on: 定义虚拟BIOS的引导顺序。
-net nic,netdev=<netid>: 定义一个连接到id为
-netdev user,id=<netid>: 定义网络“用户”设备。这是一个地址为10.0.2.0/24的虚拟本地网络,其中主机的地址为10.0.2.2,充当到internet的网关,地址为10.0.2.3的名称服务器和地址为10.0.2.4的smb服务器。内置DHCP服务器可以分配10.0.2.15 ~ 10.0.2.31之间的地址。
-soundhw <model>: 定义声卡模型。该列表可以通过-soundhw help获得。
-vga <type>: 定义要模拟的VGA卡的类型。对于-vga std,如果您正在为客户机构建Linux内核,建议启用CONFIG_DRM_BOCHS(作为内核或内核模块的一部分)来驱动模拟VGA卡的所有功能,并启用CONFIG_FB来在其上显示Linux控制台。编辑器不测试其他<type>值,并且可能需要额外的依赖项。
-serial mon:stdio: 将客户机的串行端口(linux客户机上是/dev/ttyS0)与qemu监视器进行多路复用,发送到qemu进程的标准输入和输出。
-name <name>: 设置来宾的名称。此名称显示在来宾窗口标题中。如果您同时运行多个客户机,它可能会很有用。
-pflash /usr/share/qemu/edk2-x86_64-code.fd: 加载预构建的EDK2 UEFI固件,而不是默认的PC BIOS。如果您想用UEFI引导客户机操作系统,请使用此选项。
-drive file=<filename>,if=virtio: 为客户内核提供Virtio接口以访问磁盘映像,而不是模拟真实的磁盘硬件。这可以提高磁盘I/O性能,但它需要在客户内核中安装Virtio驱动程序。如果客户内核支持Virtio,请使用它而不是普通的-drive。要为客户机构建具有Virtio支持的Linux内核,请使用make defconfig && make kvm_guest.config创建启用了Virtio驱动器的初始内核配置,然后进行自定义。而且,如果客户机内核是Linux,那么使用Virtio接口的虚拟磁盘将在devtmpfs中被命名为vdx,而不是sdx。
-net nic,netdev=net0,model=virtio-net-pci: 为来宾内核提供Virtio接口以访问网络接口,而不是模拟真正的网络接口卡。这可以提高网络I/O性能,但它需要在客户内核中安装Virtio驱动程序。如果客户内核支持Virtio,请使用它而不是普通的-net。
控制仿真显示
qemu显示的客户窗口可能不符合模拟VGA卡的全部功能。例如,vmware卡支持1600x900,但默认只显示1024x768。适当的Xorg配置允许使用完整的大小(注意要使用的Xorg视频驱动程序是Xorg VMware Driver-13.4.0):
cat > /usr/share/X11/xorg.conf.d/20-vmware.conf << "EOF"
Section "Monitor"
Identifier "Monitor0"
# cvt 1600 900
# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync
Option "PreferredMode" "1600x900"
HorizSync 1-200
VertRefresh 1-200
EndSection
Section "Device"
Identifier "VMware SVGA II Adapter"
Option "Monitor" "default"
Driver "vmware"
EndSection
Section "Screen"
Identifier "Default Screen"
Device "VMware SVGA II Adapter"
Monitor "Monitor0"
SubSection "Display"
Depth 24
Modes "1600x900" "1440x900" "1366x768" "1280x720" "800x480"
EndSubSection
EndSection
EOF
除了原有的尺寸外,还将提供新的尺寸。您需要重新启动X以获得可用的新大小。
Networking
上面的网络解决方案允许客户机通过主机访问本地网络(也可能通过本地路由器访问internet),但反之则不成立。即使是主机也不能访问客户机,除非启用了端口转发。在几个客人同时运行的情况下,他们无法相互通信。其他网络设备也可以用于此目的。例如,有一个“套接字”设备,它允许多个客户机共享一个公共虚拟网络。在下文中,我们将更详细地描述如何设置“桥接”设备,它允许客户机看起来好像已连接到本地网络。下面的所有命令都应该以root用户的身份运行。
允许主机转发IP报文:
sysctl -w net.ipv4.ip_forward=1
要使其永久存在,请将命令添加到/etc/sysctl.d/60-net-forward.conf:
cat >> /etc/sysctl.d/60-net-forward.conf << EOF
net.ipv4.ip_forward=1
EOF
设置所需的配置文件:
install -vdm 755 /etc/qemu &&
echo allow br0 > /etc/qemu/bridge.conf
在上面的qemu命令行中,替换交换机-netdev user,...使用-netdev bridge,...。
内容
安装程序: elf2dmp, qemu (符号链接), qemu-edid, qemu-ga, qemu-img, qemu-io, qemu-keymap, qemu-nbd, qemu-pr-helper, qemu-storage-daemon, 和 qemu-system-
安装库: None
安装目录: /usr/share/qemu 和 /usr/share/doc/qemu-7.2.0 (可选)
简要描述
elf2dmp 将文件从elf格式转换为dmp格式。
qemu-edid 是qemu EDID生成器的测试工具。
qemu-ga 使用作为QEMU一部分构建的代理实现对QMP (QEMU监视器协议)命令和事件的支持,这些命令和事件分别在客户机内终止和发起。
qemu-img 提供管理QEMU磁盘映像的命令。
qemu-io 是一个用于(虚拟)内存介质的诊断和操作程序。它仍处于发展的早期阶段。
qemu-keymap 从xkb键映射生成qemu反向键映射,它可以与qemu “-k”命令行开关一起使用。
qemu-nbd 使用Qemu磁盘网络块设备(NBD)协议导出Qemu磁盘映像。
qemu-pr-helper 实现 QEMU 的持久保留助手。
qemu-storage-daemon 允许在不运行虚拟机的情况下使用QEMU监视器协议修改磁盘映像。
qemu-system-x86_64 是QEMU PC系统仿真器。