FreeBSD 中文手册
FreeBSD 中文社区
  • FreeBSD 中文手册
  • 编辑日志
  • 译者说明
  • FreeBSD 中文手册
  • 目录
  • 概述
  • 前言
    • 致读者
    • 第四版
    • 第三版
    • 第二版(2004)
    • 第一版(2001)
    • 本书的组织结构
    • 本书中使用的一些约定
    • 致谢
  • 第一部分:快速开始
  • 第1章 简介
    • 1.1.概述
    • 1.2.欢迎来到 FreeBSD!
    • 1.3.关于 FreeBSD 项目
  • 第2章 安装 FreeBSD
    • 2.1.概述
    • 2.2.最低硬件要求
    • 2.3.安装前的准备工作
    • 2.4.开始安装
    • 2.5.使用 bsdinstall
    • 2.6.分配磁盘空间
    • 2.7.获取安装文件
    • 2.8.账户、时区、服务和安全
    • 2.9.故障排除
    • 2.10.使用 Live CD
  • 第3章 FreeBSD 基础
    • 3.1.概述
    • 3.2.虚拟控制台和终端
    • 3.3.用户和基本账户管理
    • 3.4.权限
    • 3.5.目录结构
    • 3.6.磁盘结构
    • 3.7.文件系统的挂载与卸载
    • 3.8.进程和守护进程
    • 3.9.Shell
    • 3.10.文本编辑器
    • 3.11.设备和设备节点
    • 3.12.手册页
  • 第4章 安装应用程序:软件包和 Ports
    • 4.1.概述
    • 4.2.软件安装的概述
    • 4.3.寻找所需的应用程序
    • 4.4.使用 pkg 管理二进制包
    • 4.5.使用 Ports
    • 4.6.使用 Poudriere 构建软件包
    • 4.7.安装后的注意事项
    • 4.8.如何处理损坏的 port
  • 第5章 X Window 系统
    • 5.1.概述
    • 5.2.安装 Xorg
    • 5.3.显卡驱动
    • 5.4.Xorg 配置
    • 5.5.在 X11 中使用字体
  • 第6章 FreeBSD 中的 Wayland
    • 6.1.简介
    • 6.2.Wayland 概述
    • 6.3.Wayfire 混成器
    • 6.4.Hikari 混成器
    • 6.5.Sway 混成器
    • 6.6.使用 Xwayland
    • 6.7.使用 VNC 进行远程连接
    • 6.8.Wayland 登录管理器
    • 6.9.实用工具
  • 第7章 网络
    • 7.1.概述
    • 7.2.设置网络
    • 7.3.有线网络
    • 7.4.无线网络
    • 7.5.主机名
    • 7.6.DNS
    • 7.7.故障排除
  • 第二部分:常见任务
  • 第8章 桌面环境
    • 8.1.概述
    • 8.2.桌面环境
    • 8.3.浏览器
    • 8.4.开发工具
    • 8.5.桌面办公应用
    • 8.6.文档阅读器
    • 8.7.财务
  • 第9章 多媒体
    • 9.1.概述
    • 9.2.设置声卡
    • 9.3.音频播放器
    • 9.4.视频播放器
    • 9.5.视频会议
    • 9.6.图像扫描仪
  • 第10章 配置 FreeBSD 内核
    • 10.1.概述
    • 10.2.为什么要构建定制内核
    • 10.3.浏览系统硬件
    • 10.4.配置文件
    • 10.5.构建并安装定制内核
    • 10.6.如果发生了错误
  • 第11章 打印
    • 11.1.快速入门
    • 11.2.连接打印机
    • 11.3.常见的页面描述语言(PDL)
    • 11.4.直接打印
    • 11.5.LPD(行式打印机程序)
    • 11.6.其他打印系统
  • 第12章 Linux 二进制兼容层
    • 12.1.概述
    • 12.2.配置 Linux 二进制兼容层
    • 12.3.Linux 用户空间
    • 12.4.高级主题
  • 第13章 WINE
    • 13.1.概述
    • 13.2.WINE 概述和概念
    • 13.3.在 FreeBSD 上安装 WINE
    • 13.4.在 FreeBSD 上运行第一个 WINE 程序
    • 13.5.配置 WINE 安装程序
    • 13.6.WINE 图形化用户管理界面
    • 13.7.多用户 FreeBSD 与 WINE
    • 13.8.FreeBSD 上的 WINE 常见问题
  • 第三部分:系统管理
  • 第14章 配置与优化
    • 14.1.概述
    • 14.2.配置文件
    • 14.3.管理 FreeBSD 中的服务
    • 14.4.Cron 和 Periodic
    • 14.5.配置系统日志
    • 14.6.电源和资源管理
    • 14.7.添加交换空间
  • 第15章 FreeBSD 的引导过程
    • 15.1.概述
    • 15.2.FreeBSD 的引导过程
    • 15.3.Device Hints
    • 15.4.关机流程
  • 第16章 安全
    • 16.1.概述
    • 16.2.简介
    • 16.3.账户安全
    • 16.4.入侵检测系统(IDS)
    • 16.5.安全等级
    • 16.6.文件标志位
    • 16.7.OpenSSH
    • 16.8.OpenSSL
    • 16.9.Kerberos
    • 16.10.TCP 封装器(TCP Wrapper)
    • 16.11.访问控制列表(ACL)
    • 16.12.Capsicum
    • 16.13.进程记账
    • 16.14.资源限制
    • 16.15.监控第三方安全问题
    • 16.16.FreeBSD 安全公告
  • 第17章 jail 与容器
    • 17.1.概述
    • 17.2.jail 的类型
    • 17.3.主机配置
    • 17.4.传统 jail(厚 jail)
    • 17.5.瘦 jail
    • 17.6.管理 jail
    • 17.7.更新 jail
    • 17.8.jail 资源限制
    • 17.9.jail 管理器与容器
  • 第18章 强制访问控制
    • 18.1.概述
    • 18.2.关键术语
    • 18.3.了解 MAC 标签
    • 18.4.规划安全配置
    • 18.5.可用的 MAC 策略
    • 18.6.用户锁定
    • 18.7.MAC Jail 中的 Nagios
    • 18.8.MAC 框架的故障排除
  • 第19章 安全事件审计
    • 19.1.概述
    • 19.2.关键术语
    • 19.3.审计配置
    • 19.4.使用审计跟踪
  • 第20章 存储
    • 20.1.概述
    • 20.2.添加磁盘
    • 20.3.调整和增加磁盘大小
    • 20.4.USB 存储设备
    • 20.5.创建和使用 CD
    • 20.6.创建和使用 DVD
    • 20.7.创建和使用软盘
    • 20.8.备份的基础知识
    • 20.9.内存盘
    • 20.10.文件系统快照
    • 20.11.磁盘配额
    • 20.12.加密磁盘分区
    • 20.13.加密交换分区
    • 20.14.高可用性存储(HAST)
  • 第21章 GEOM: 模块化磁盘转换框架
    • 21.1.概述
    • 21.2.RAID0——条带
    • 21.3.RAID1——镜像
    • 21.4.RAID3——带有专用奇偶校验的字节级条带
    • 21.5.软件 RAID 设备
    • 21.6.GEOM Gate 网络设备
    • 21.7.为磁盘设备添加卷标
    • 21.8.通过 GEOM 实现 UFS 日志
  • 第22章 Z 文件系统(ZFS)
    • 22.1.是什么使 ZFS 与众不同
    • 22.2.快速入门指南
    • 22.3.zpool 管理
    • 22.4.zfs 管理
    • 22.5.委托管理
    • 22.6.高级主题
    • 22.7.更多资源
    • 22.8.ZFS 特性和术语
  • 第23章 其他文件系统
    • 23.1.概述
    • 23.2.Linux® 文件系统
    • 23.3.Windows® 文件系统
    • 23.4.MacOS® 文件系统
  • 第24章 虚拟化
    • 24.1.概述
    • 24.2.使用 macOS® 上的 Parallels Desktop 安装 FreeBSD
    • 24.3.使用 macOS® 上的 VMware Fusion 安装 FreeBSD
    • 24.4.使用 VirtualBox™ 安装 FreeBSD
    • 24.5.在 FreeBSD 上安装 VirtualBox™
    • 24.6.使用 FreeBSD 上的 QEMU 虚拟化
    • 24.7.使用 FreeBSD 上的 bhyve 虚拟机
    • 24.8.基于 FreeBSD 的 Xen™ 虚拟机
  • 第25章 本地化——i18n/L10n 的使用和设置
    • 25.1.概述
    • 25.2.使用本地化
    • 25.3.寻找 i18n 应用程序
    • 25.4.特定语言的区域配置
  • 第26章 FreeBSD 更新与升级
    • 26.1.概述
    • 26.2.更新 FreeBSD
    • 26.3.更新 Bootcode
    • 26.4.更新文档
    • 26.5.追踪开发分支
    • 26.6.从源代码更新 FreeBSD
    • 26.7.多台机器的追踪
    • 26.8.在非 FreeBSD 主机上进行构建
  • 第27章 DTrace
    • 27.1.概述
    • 27.2.实现上的差异
    • 27.3.开启 DTrace 支持
    • 27.4.启用内核外部模块 DTrace
    • 27.5.使用 DTrace
  • 第28章 USB 设备模式/USB OTG
    • 28.1.概述
    • 28.2.USB 虚拟串行端口
    • 28.3.USB 设备模式网络接口
    • 28.4.USB 虚拟存储设备
  • 第四部分:网络通讯
  • 第29章 串行通信
    • 29.1.概述
    • 29.2.串行术语和硬件
    • 29.3.终端
    • 29.4.拨入服务
    • 29.5.拨出服务
    • 29.6.设置串行控制台
  • 第30章 PPP
    • 30.1.概述
    • 30.2.配置 PPP
    • 30.3.PPP 连接的故障排除
    • 30.4.使用以太网 PPP(PPPoE)
    • 30.5.使用 ATM 上的 PPP (PPPoA)
  • 第31章 电子邮件
    • 31.1.概述
    • 31.2.邮件组件
    • 31.3.DragonFly 邮件代理(DMA)
    • 31.4.Sendmail
    • 31.5.修改邮件传输代理
    • 31.6.邮件用户代理
    • 31.7.高级主题
  • 第32章 网络服务器
    • 32.1.概述
    • 32.2.inetd 超级服务器
    • 32.3.网络文件系统(NFS)
    • 32.4.网络信息系统(NIS)
    • 32.5.轻型目录访问协议(LDAP)
    • 32.6.动态主机设置协议(DHCP)
    • 32.7.域名系统(DNS)
    • 32.8.零配置网络(mDNS/DNS-SD)
    • 32.9.Apache HTTP 服务器
    • 32.10.文件传输协议(FTP)
    • 32.11.用于 Microsoft® Windows® 客户端的文件和打印服务(Samba)
    • 32.12.用 NTP 进行时钟同步
    • 32.13.iSCSI target 和 initiator 的配置
  • 第33章 防火墙
    • 33.1.概述
    • 33.2.防火墙的概念
    • 33.3.PF
    • 33.4.IPFW
    • 33.5.IPFILTER(IPF)
    • 33.6.Blacklistd
  • 第34章 高级网络
    • 34.1.概述
    • 34.2.网关和路由
    • 34.3.虚拟主机
    • 34.4.无线高级身份验证
    • 34.5.无线自组织(Ad-hoc)模式
    • 34.6.USB 网络共享
    • 34.7.蓝牙
    • 34.8.桥接
    • 34.9.链路聚合与故障转移
    • 34.10.使用 PXE 进行无盘操作
    • 34.11.共用地址冗余协议(CARP)
    • 34.12.VLAN
  • 第五部分:附录
  • 附录 A.获取 FreeBSD
    • A.1.镜像站
    • A.2.使用 Git
    • A.3.使用 Subversion
    • A.4.光盘
  • 附录 B.书目
    • B.1.FreeBSD 相关书籍
    • B.2.安全性参考文献
    • B.3.UNIX 历史
    • B.4.期刊与杂志
  • 附录 C.网络资源
    • C.1.网站
    • C.2.邮件列表
    • C.3.Usenet 新闻组
  • 附录 D.OpenPGP 密钥
    • D.1.官方成员
  • 术语表
  • 后记
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 24.6.1. 安装 QEMU 软件
  • 24.6.2. 虚拟机安装
  • 24.6.3. 使用提示
  • 24.6.3.1. 使用 X Window 系统
  • 24.6.3.2. 使用 QEMU 窗口
  • 24.6.3.3. 使用 QEMU 窗口菜单
  • 24.6.3.4. 其他 QEMU 窗口菜单选项
  • 24.6.4. 向虚拟机添加串行端口接口
  • 24.6.4.1. 使用串行控制台的注意事项
  • 24.6.5. QEMU 用户模式仿真
  • 24.6.5.1. 在 x86_64 主机上设置 SPARC64 虚拟机
  • 24.6.6. 使用 QEMU 监控器
  • 24.6.6.1. 向虚拟机添加新磁盘
  • 24.6.6.2. 使用 QEMU 监控器管理快照
  • 24.6.7. 使用 QEMU USB 设备
  • 24.6.8. 通过直通使用主机 USB 设备
  • 24.6.9. QEMU 在 FreeBSD 上的总结

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 第24章 虚拟化

24.6.使用 FreeBSD 上的 QEMU 虚拟化

上一页24.5.在 FreeBSD 上安装 VirtualBox™下一页24.7.使用 FreeBSD 上的 bhyve 虚拟机

最后更新于1个月前

这有帮助吗?

QEMU 是一款通用的机器仿真和虚拟化工具,完全开源,由一个庞大且活跃的社区开发,支持 FreeBSD、OpenBSD 和 NetBSD 以及其他操作系统。

根据 QEMU 文档:

  • QEMU 可以通过多种方式使用。最常见的是系统仿真模式,在该模式下,QEMU 提供了一个完整机器的虚拟模型(包括 CPU、内存和仿真设备),用于运行虚拟机操作系统。在这种模式下,CPU 可以完全仿真,也可以与如 KVM、Xen 或 Hypervisor.Framework 等虚拟化管理程序合作,使虚拟机直接在宿主 CPU 上运行。

  • 第二种使用方式是用户模式仿真,在该模式下,QEMU 可以在一种 CPU 上启动为另一种 CPU 编译的进程。在此模式下,CPU 始终为仿真状态。

  • QEMU 还提供了多个独立的命令行工具,例如 qemu-img(1) 磁盘映像工具,允许用户创建、转换和修改磁盘映像。

QEMU 可以仿真多种体系结构,包括 Arm™、i386、x86_64、MIPS™、s390X、SPARC™(Sparc™ 和 Sparc64™)等。有关 QEMU 系统仿真目标的完整列表,请参阅 QEMU 系统仿真目标,该列表会定期更新。

本节介绍了如何在 FreeBSD 上使用 QEMU 进行系统仿真和用户模式仿真,并提供了 QEMU 命令和命令行工具的使用示例。

24.6.1. 安装 QEMU 软件

QEMU 可以作为 FreeBSD 的一款软件包或在 emulators/qemu 中作为 Port 安装。推荐的安装方法是使用软件包构建,因为它包含了大多数用户需要的合理选项和默认设置。

# pkg install qemu

安装软件包时会包含一些依赖项。安装完成后,创建一个指向宿主版本的 QEMU 链接,通常情况下如果宿主系统是 Intel™ 或 AMD™ 64 位系统,命令为:

# ln -s /usr/local/bin/qemu-system-x86_64 /usr/local/bin/qemu

作为非 root 用户运行以下命令来测试安装:

% qemu

这将打开一个窗口,QEMU 会尝试从硬盘、软盘、DVD/CD 和 PXE 启动。由于尚未设置任何启动映像,因此命令会产生一些错误并以 "No bootable device" 结束,如 图 1 所示。不过,这表明 QEMU 软件已正确安装。

没有可引导映像的 QEMU

图 1. 没有可引导映像的 QEMU

24.6.2. 虚拟机安装

注意

QEMU 处于非常活跃的开发状态,特性和命令选项可能会在不同版本之间发生变化。本节提供了使用 QEMU 版本 9.0.1(2024 年夏季)开发的示例。若有疑问,请始终查阅 QEMU 文档,特别是 关于 QEMU 页面,该页面包含支持的构建平台、仿真、已弃用功能和已移除功能的链接。

按照以下步骤创建两个名为“left”和“right”的虚拟机。大多数命令可以在没有 root 权限的情况下执行。

  1. 创建一个测试环境来与 QEMU 一起使用:

    % mkdir -p ~/QEMU  ~/QEMU/SCRIPTS  ~/QEMU/ISO  ~/QEMU/VM

    SCRIPTS 目录用于存放启动脚本和实用工具。ISO 目录用于存放客户机 ISO 启动映像。VM 目录是虚拟机映像(VMs)的存放位置。

  2. 将最新的 FreeBSD 下载到 ~/QEMU/ISO 目录中:

    % cd ~/QEMU/ISO
    % fetch https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-amd64-bootonly.iso

    下载完成后,创建一个简短的链接。该简短链接将在下面的启动脚本中使用。

    % ln -s FreeBSD-14.1-RELEASE-amd64-bootonly.iso  fbsd.iso
  3. 切换到虚拟机存放位置(~/QEMU/VM)。运行 qemu-img(1) 来为 “left” 虚拟机创建磁盘映像:

    % cd ~/QEMU/VM
    % qemu-img create -f raw  left.img   15G

    QEMU raw 格式旨在提供最佳性能。该格式简单且没有开销,特别适用于高性能或高吞吐量的场景。此格式适用于对性能要求最大化且不需要额外功能(如快照)的情况。以下脚本中使用了此格式来创建 “left” 虚拟机的磁盘映像。

    另一种格式是 qcow2,它使用 QEMU 的“写时复制”技术来管理磁盘空间。这种技术不需要完整的 15G 磁盘,而是直接由虚拟机管理一个简版磁盘,随着虚拟机写入,磁盘大小会动态增长。此格式支持快照、压缩和加密。此格式适用于开发、测试及需要这些高级功能的场景。下面的 “right” 虚拟机脚本使用了此格式。

    再次运行 qemu-img(1) 来为 “right” 虚拟机创建一个 qcow2 格式的磁盘映像:

    % qemu-img create -f qcow2 -o preallocation=full,cluster_size=512K,lazy_refcounts=on right.qcow2 20G

    要查看实际文件大小,可以使用:

    % du -Ah right.qcow2
  4. 使用以下命令为两个虚拟机配置网络。在此示例中,宿主网络接口是 em0。如果有必要,请修改为宿主系统的接口。每次宿主机重启后必须执行这些命令,以便让 QEMU 客户机虚拟机能够进行通信。

    # ifconfig tap0 create
    # ifconfig tap1 create
    # sysctl net.link.tap.up_on_open=1
    net.link.tap.up_on_open: 0 -> 1
    # sysctl net.link.tap.user_open=1
    net.link.tap.user_open: 0 -> 1
    # ifconfig bridge0 create
    # ifconfig bridge0 addm tap0 addm tap1 addm em0
    # ifconfig bridge0 up

    上述命令创建了两个 tap(4) 设备(tap0、tap1)和一个 if_bridge(4) 设备(bridge0)。接着,它们将 tap 设备和本地宿主接口(em0)添加到桥接中,并设置了两个 sysctl(8) 项目,允许普通用户打开 tap 设备。这些命令使虚拟机能够与宿主的网络栈进行通信。

  5. 切换到 ~/QEMU/SCRIPTS 目录,使用以下脚本启动第一个虚拟机 “left”。该脚本使用了 QEMU 的原始磁盘格式。

    /usr/local/bin/qemu-system-x86_64  -monitor none \
      -cpu qemu64 \
      -vga std \
      -m 4096 \
      -smp 4   \
      -cdrom ../ISO/fbsd.iso \
      -boot order=cd,menu=on \
      -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \
      -blockdev driver=raw,node-name=drive0,file=imgleft \
      -device virtio-blk-pci,drive=drive0,bootindex=1  \
      -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \
      -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \
      -name \"left\"

技巧

将上述内容保存到一个文件中(例如 left.sh),并只需运行:% /bin/sh left.sh

QEMU 将在一个单独的窗口中启动虚拟机,并按 图 2 中所示引导 FreeBSD ISO。所有命令选项,如 -cpu 和 -boot,均在 QEMU 的手册页 qemu(1) 中有详细描述。

图 2. FreeBSD 启动加载菜单

技巧

如果在 QEMU 控制台窗口中点击鼠标,QEMU 将“抓取”鼠标,如 图 3 所示。按 Ctl+Alt+G 可以释放鼠标。

图 3. 当 QEMU 抓取鼠标时

注意

在 FreeBSD 上,初始的 QEMU 安装可能会稍慢。这是因为模拟器在第一次使用磁盘时会写入文件系统格式和元数据。随后的操作通常会更快。

安装过程中有几个需要注意的要点:

  • 选择使用 UFS 作为文件系统。ZFS 在小内存的环境下性能不佳。

  • 网络配置使用 DHCP。如果本地局域网支持,也可以配置 IPv6。

  • 在添加默认用户时,请确保该用户是 wheel 组的成员。

安装完成后,虚拟机将重启并进入新安装的 FreeBSD 映像。

以 root 用户登录并按以下方式更新系统:

# freebsd-update fetch install
# reboot

注意

安装成功后,QEMU 将引导已安装的操作系统,而不是安装程序。

注意

QEMU 支持 -runas 选项。为了增加安全性,可以在上述脚本中包括 "-runas your_user_name" 选项。详情请参见 qemu(1)。 再次以 root 用户登录,添加所需的任何软件包。若要在客户机中使用 X Window 系统,请参阅下文的“使用 X Window 系统”部分。

至此,"left" 虚拟机的安装已完成。

要安装 "right" 虚拟机,请运行以下脚本。此脚本包含了 tap1、qcow2 格式、映像文件名、MAC 地址和终端窗口名的修改。如果需要,可以按照上述说明添加 "-runas" 参数。

/usr/local/bin/qemu-system-x86_64  -monitor none \
  -cpu qemu64 \
  -vga cirrus \
  -m 4096  -smp 4   \
  -cdrom ../ISO/fbsd.iso \
  -boot order=cd,menu=on \
  -drive if=none,id=drive0,cache=writeback,aio=threads,format=qcow2,discard=unmap,file=../VM/right.qcow2 \
  -device virtio-blk-pci,drive=drive0,bootindex=1  \
  -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \
  -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \
  -name \"right\"

安装完成后,“left”和“right”虚拟机可以相互通信,并与宿主进行通信。如果宿主机上有严格的防火墙规则,考虑添加或修改规则以允许桥接和 tap 设备之间的通信。

24.6.3. 使用提示

24.6.3.1. 使用 X Window 系统

安装 Xorg 描述了如何设置 X Window 系统。请参考该指南进行初始的 X Window 设置,然后查阅 桌面环境 以了解如何设置完整的桌面环境。

本节演示了 XFCE 桌面环境的使用。

安装完成后,作为常规用户登录,然后输入:

% startx

XFCE4 窗口管理器将启动并呈现一款功能齐全的图形桌面,如 图 4 所示。首次启动时,可能需要一分钟才能显示桌面。有关使用详细信息,请参阅 XFCE 网站。

图 4. 两个 QEMU 虚拟机

技巧

为虚拟系统添加更多内存可能会加速图形用户界面。

在这里,“left”虚拟机已经安装了 X Window 系统,而“right”虚拟机仍处于文本模式。

24.6.3.2. 使用 QEMU 窗口

QEMU 窗口作为一个完整的 FreeBSD 控制台,能够像裸机系统一样运行多个虚拟终端。

要切换到另一个虚拟控制台,单击 QEMU 窗口并输入 Alt+**F2 或 Alt+F3。FreeBSD 应该会切换到另一个虚拟控制台。图 5 显示了 "left" 虚拟机在 ttyv3 上显示虚拟控制台的情况。

图 5. 在 QEMU 窗口中切换到另一个虚拟控制台

技巧

当前主机桌面管理器或窗口管理器可能已经为 Alt+F1、Alt+**F2 键序列设置了其他功能。如果是这样,请尝试输入 Ctl+Alt+F1、Ctl+Alt+F2,或其他类似的键组合。查看窗口管理器或桌面管理器文档以了解详细信息。

24.6.3.3. 使用 QEMU 窗口菜单

QEMU 窗口的另一个功能是 View 菜单和缩放控制。最有用的是 Zoom to Fit。当点击此菜单项时,可以通过点击窗口角部控制并调整窗口大小来调整 QEMU 窗口的大小。图 6 显示了在图形模式下调整“left”窗口大小的效果。

图 6. 使用视图菜单中的 Zoom to Fit 选项

24.6.3.4. 其他 QEMU 窗口菜单选项

在 View 菜单中,还可以看到以下选项:

  • cirrus-vga、serial0 和 parallel0 选项。这些选项允许切换输入/输出到选定设备。

QEMU 窗口中的 Machine 菜单提供了对虚拟机的四种控制:

  • Pause 可暂停 QEMU 虚拟机。这可能对冻结快速滚动的窗口有帮助。

  • Reset 会立即将虚拟机重置为冷启动状态。与实际机器一样,除非绝对必要,否则不建议使用此选项。

  • Power Down 模拟 ACPI 关闭信号,操作系统将执行优雅的关闭过程。

  • Quit 会立即关闭虚拟机电源 — 同样,不建议除非必要时使用此选项。

24.6.4. 向虚拟机添加串行端口接口

为了实现串行控制台,需要在运行 FreeBSD 的虚拟机中插入以下内容:

console="comconsole"

将此行添加到 /boot/loader.conf 文件中,以启用 FreeBSD 串行控制台的使用。

以下更新后的配置演示了如何在虚拟机上实现串行控制台。运行脚本以启动虚拟机。

# left+serial.sh
echo
echo "注意: telnet 启动服务器正在虚拟机上运行!"
echo "要启动 QEMU,请启动另一个会话并通过 telnet 连接到 localhost 的 4410 端口"
echo

/usr/local/bin/qemu-system-x86_64  -monitor none \
  -serial telnet:localhost:4410,server=on,wait=on\
  -cpu qemu64 \
  -vga std \
  -m 4096 \
  -smp 4   \
  -cdrom ../ISO/fbsd.iso \
  -boot order=cd,menu=on \
  -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \
  -blockdev driver=raw,node-name=drive0,file=imgleft \
  -device virtio-blk-pci,drive=drive0,bootindex=1  \
  -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \
  -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \
  -name \"left\"

图 7. 通过 TCP 启用串行端口

在 图 7 中,串行端口被重定向到主机系统的 TCP 端口,并且 QEMU 监视器等待(wait=on)直到在指定的 localhost 端口发生 telnet(1) 连接。当收到来自另一个会话的连接时,FreeBSD 系统开始启动并查找 /boot/loader.conf 中的控制台指令。通过设置 "console=comconsole",FreeBSD 在串行端口上启动一个控制台会话。QEMU 监视器会检测到这一点,并将该串行端口的字符 I/O 导向主机上的 telnet 会话。系统启动完成后,登录提示将在串行端口(ttyu0)和控制台(ttyv0)上启用。

需要注意的是,这种通过 TCP 的串行重定向是在虚拟机之外进行的。它不与虚拟机中的任何网络进行交互,因此不受任何防火墙规则的限制。可以将其视为连接到实际机器的 RS-232 或 USB 端口的傻终端。

24.6.4.1. 使用串行控制台的注意事项

在串行控制台上,如果调整了窗口大小,可以执行 resizewin(1) 来更新终端大小。

有时可能需要(甚至必须)停止将 syslog 消息发送到控制台(包括 QEMU 控制台和串行端口)。有关将控制台消息重定向到其他位置的详细信息,请参考 syslog.conf(5)。

注意

待 /boot.loader.conf 文件已更新以允许串行控制台,虚拟机将在每次启动时尝试从串行端口启动。确保如上所示启用串行端口,或者更新 /boot/loader.conf 文件以不要求使用串行控制台。

24.6.5. QEMU 用户模式仿真

QEMU 还支持在与主机 CPU 架构不同的体系结构上运行预编译的应用程序。例如,可以在 x86_64 主机上运行 Sparc64 架构的操作系统。下一节将展示这一过程。

24.6.5.1. 在 x86_64 主机上设置 SPARC64 虚拟机

设置与主机架构不同的新虚拟机涉及以下几个步骤:

  • 获取将在虚拟机上运行的软件

  • 为虚拟机创建一个新的磁盘镜像

  • 设置一个新 QEMU 脚本,指定新的架构

  • 执行安装

以下过程使用了 OpenBSD 6.8 SPARC64 软件作为本次 QEMU 用户模式仿真练习的示例。

技巧

并非所有版本的 OpenBSD Sparc64 都能在 QEMU 上运行。已知 OpenBSD 版本 6.8 可用,因此作为本节示例。

  1. 从 OpenBSD 存档中下载 OpenBSD 6.8 Sparc64。 在 OpenBSD 下载站点上,仅保留最新版本,需要访问存档以获取过去的版本。

    % cd ~/QEMU/ISO
    % fetch https://mirror.planetunix.net/pub/OpenBSD-archive/6.8/sparc64/install68.iso
  2. 为 Sparc64 虚拟机创建新的磁盘镜像,这与上面的 "right" 虚拟机创建方法类似。在本例中使用 QEMU 的 qcow2 格式:

    % cd ~/QEMU/VM
    qemu-img create -f qcow2 -o preallocation=full,lazy_refcounts=on sparc64.qcow2 16G
  3. 使用以下脚本设置新的 Sparc64 架构。与上面的示例一样,运行该脚本,然后启动一个新的会话并通过 telnet 连接到 localhost 上指定的端口:

    echo
    echo "注意: telnet 启动服务器正在虚拟机上运行!"
    echo "要启动 QEMU,请启动另一个会话并通过 telnet 连接到 localhost 端口 4410"
    echo
    
    /usr/local/bin/qemu-system-sparc64 \
      -serial telnet:localhost:4410,server=on,wait=on \
      -machine sun4u,usb=off \
      -smp 1,sockets=1,cores=1,threads=1 \
      -rtc base=utc \
      -m 1024 \
      -boot d \
      -drive file=../VM/sparc64.qcow2,if=none,id=drive-ide0-0-1,format=qcow2,cache=none \
      -cdrom ../ISO/install68.iso \
      -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-1,id=ide0-0-1 \
      -msg timestamp=on \
      -net nic,model=sunhme -net user \
      -nographic \
      -name \"sparc64\"

注意以下几点:

  • -boot d 选项使 QEMU 从设置为 -cdrom ../ISO/install68.iso 的 QEMU CDROM 设备启动。

  • 如前所述,telnet 服务器选项设置为等待在端口 4410 上接收连接。启动另一个会话并使用 telnet(1) 连接到 localhost 上的 4410 端口。

  • 该脚本设置了 -nographic 选项,意味着只有串行端口 I/O,没有图形界面。

  • 本例中网络未通过 tap(4) / if_bridge(4) 组合设置。这里使用了 QEMU 网络的另一种方法,称为“串行线互联网协议”(SLIRP),有时也称为“用户模式网络”。有关该方法及其他 QEMU 网络方法的文档,请参见 QEMU 网络文档

如果一切设置正确,系统将启动,如 图 8 所示。

图 8. QEMU 在用户模式仿真中从 CDROM 启动 OpenBSD 6.8 Sparc64

安装完成后,修改脚本并将启动参数更改为 -boot c。这将指示 QEMU 从提供的硬盘启动,而不是 CDROM。

安装后的系统可以像其他虚拟机一样使用。然而,虚拟机的底层架构是 Sparc64,而非 x86_64。

技巧

如果系统在 OpenBios 控制台提示 0 > 时停止,请输入 power-off 来退出系统。

图 9 显示了登录已安装系统的 root 用户并运行 uname(1)。

图 9. 在用户模式仿真中从 CDROM 启动 QEMU

24.6.6. 使用 QEMU 监控器

QEMU 监控器 用于控制正在运行的 QEMU 模拟器(虚拟机)。

通过使用监控器,可以:

  • 动态地移除或插入设备,包括磁盘、网络接口、CD-ROM 或软盘

  • 冻结/解冻虚拟机,并将其状态保存或恢复到磁盘文件中

  • 收集有关虚拟机和设备状态的信息

  • 实时更改设备设置

以及许多其他操作。

监控器的最常见用途是检查虚拟机的状态,并添加、删除或更改设备。一些操作,如迁移,仅在支持的虚拟化加速器(如 KVM、Xen 等)下可用,在 FreeBSD 主机上不受支持。

在使用图形桌面环境时,最简单的使用 QEMU 监控器的方法是启动 QEMU 时使用 -monitor stdio 选项。

# /usr/local/bin/qemu-system-x86_64  -monitor stdio \
  -cpu qemu64 \
  -vga cirrus \
  -m 4096  -smp 4   \
  ...

这将在终端窗口中生成一个新的提示符 (qemu),如 图 10 所示。

图 10. QEMU 监控器提示符和“stop”命令

图中还显示了在 FreeBSD 启动序列中使用 stop 命令冻结系统。系统将保持冻结状态,直到在监控器中输入 cont 命令。

24.6.6.1. 向虚拟机添加新磁盘

要向运行中的虚拟机添加新磁盘,首先需要准备磁盘,如下所示:

% cd ~/QEMU/VM
% qemu-img create -f raw  new10G.img  10G

图 11 显示了向虚拟机添加新磁盘所需的监控器命令序列。待使用监控器中的 device_add 命令添加了设备,它将在 FreeBSD 系统控制台中显示(图中的下半部分)。此时可以根据需要配置磁盘。

请注意,如果需要在虚拟机重启后使用新磁盘,必须将其添加到启动脚本中。

图 11. 使用 QEMU 监控器命令添加新磁盘

24.6.6.2. 使用 QEMU 监控器管理快照

QEMU 文档在使用术语 快照 时描述了几个类似的概念。命令行上有 -snapshot 选项,它指的是使用一个磁盘或磁盘的一部分来包含设备的副本。然后是监控器命令 snapshot_blkdev 和 snapshot_blkdev_internal,它们描述了实际的复制块设备的操作。最后,还有监控器命令 savevm、loadvm 和 delvm,它们指的是创建并保存、加载或删除整个虚拟机的副本。结合后者,监控器的 info snapshots 命令列出了最近的快照详情。

本节将重点介绍创建、保存和加载完整的虚拟机镜像,并使用 快照 这一术语。

首先,从头开始重新创建“左”虚拟机,这次使用 qcow2 格式。

% cd ~/QEMU/VM
% rm left.img
% qemu-img create -f qcow2 left.qcow2 16G  # 为新的 FreeBSD 安装创建一个清理的文件。
% cd ../SCRIPTS
# /bin/sh left.sh                     # 参见下面的程序清单。

安装完成后,重新启动虚拟机,这次使用 -monitor stdio 选项来启用监控器。

# 左虚拟机脚本.
/usr/local/bin/qemu-system-x86_64  -monitor stdio \
  -cpu qemu64 \
  -vga std \
  -m 4096 \
  -smp 4   \
  -cdrom ../ISO/fbsd.iso \
  -boot order=cd,menu=on \
  -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.qcow2 \
  -blockdev driver=qcow2,node-name=drive0,file=imgleft \
  -device virtio-blk-pci,drive=drive0,bootindex=1  \
  -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \
  -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \
  -name \"left\"

为了演示快照,可以使用以下步骤:

  1. 从头安装 FreeBSD

  2. 准备环境并使用 savevm 监控器命令创建快照

  3. 安装几个软件包

  4. 关闭系统

  5. 重新启动一个裸 QEMU 实例,并使用监控器命令 loadvm 恢复虚拟机

  6. 观察恢复后的虚拟机没有安装任何软件包

在“准备环境”步骤中,在一个独立的虚拟控制台(ttyv1)中启动一个 vi(1) 编辑会话,模拟用户活动。如果需要,可以启动其他程序。快照应该记录在创建快照时所有正在运行的应用程序的状态。

图 12 显示了全新安装的 FreeBSD 系统,尚未安装任何软件包,并且在 ttyv1 上单独显示了编辑会话。当前, vi(1) 编辑器处于 insert 模式,打字员正在输入“broadcast”一词。

图 12. 第一次快照之前的 QEMU 虚拟机

要生成快照,请在监控器中输入 savevm。确保为其指定标签(例如 original_install)。

QEMU 9.0.1 monitor - type 'help' for more information
(qemu)
(qemu) savevm original_install

接下来,在主控制台窗口中安装一个软件包,例如没有依赖关系的 zip(1)。完成后,重新进入监控器并创建另一个快照(snap1_pkg+zip)。

图 13 显示了上述命令的结果以及 info snapshots 命令的输出。

图 13. 使用监控器命令进行快照

重新启动系统,在 FreeBSD 启动之前,切换到监控器并输入 stop。虚拟机将停止。

输入 loadvm 和之前使用的标签(此处为 original_install)。

QEMU 9.0.1 monitor - type 'help' for more information
(qemu) stop
(qemu) loadvm original_install
(qemu) cont

立即,虚拟机屏幕将切换到执行 savevm 命令时的准确时刻。请注意,虚拟机仍然处于停止状态。

输入 cont 启动虚拟机,切换到 ttyv1 上的编辑会话,并在键盘上输入一个字母。编辑器仍然处于插入模式,应该相应地响应。快照时运行的任何其他程序应该没有受到影响。

上述步骤展示了如何创建快照、修改系统,然后通过恢复之前的快照来“回滚”。

默认情况下,QEMU 将快照数据存储在与镜像相同的文件中。使用 qemu-img(1) 查看快照列表,如下所示,见 图 14。

图 14. 使用 qemu-img(1) 检查快照

24.6.7. 使用 QEMU USB 设备

QEMU 支持创建虚拟 USB 设备,这些设备由映像文件提供支持。它们是虚拟 USB 设备,可以像真实 USB 设备一样进行分区、格式化、挂载和使用。

/usr/local/bin/qemu-system-x86_64  -monitor stdio \
  -cpu qemu64 \
  -vga cirrus \
  -m 4096  -smp 4   \
  -cdrom ../ISO/fbsd.iso \
  -boot order=cd,menu=on \
  -drive if=none,id=usbstick,format=raw,file=../VM/foo.img \
  -usb \
  -device usb-ehci,id=ehci \
  -device usb-storage,bus=ehci.0,drive=usbstick \
  -device usb-mouse \
  -blockdev driver=file,node-name=img1,filename=../VM/right.qcow2 \
  -blockdev driver=qcow2,node-name=drive0,file=img1 \
  -device virtio-blk-pci,drive=drive0,bootindex=1  \
  -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \
  -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \
  -name \"right\"

此配置包括一个 -drive 规范,指定了 id=usbstick、raw 格式和一个映像文件(必须使用 qemu-img(1) 创建)。下一行包含 -device usb-ehci 规范,指定一个 USB EHCI 控制器,并指定 id=ehci。最后,-device usb-storage 规范将上述驱动与 EHCI USB 总线连接起来。

当系统启动时,FreeBSD 会识别到一个 USB 集线器,添加附加的 USB 设备,并将其分配为 da0,如图 15 所示。

图 15. QEMU 创建的 USB 集线器和大容量存储设备

该设备已准备好,可以使用 gpart(8) 进行分区,并使用 newfs(8) 进行格式化。由于 USB 设备由 qemu-img(1) 创建的文件提供支持,写入设备的数据会在重启后保留。

24.6.8. 通过直通使用主机 USB 设备

QEMU USB 直通支持在 9.0.1 版本(2024 年夏季)中列为实验性功能。以下步骤展示了如何使用挂载在主机上的 USB 闪存驱动器。

更多信息和示例,请参见:

  • https://www.qemu.org/docs/master/system/devices/usb.html

图 16 的上部分显示了 QEMU 监视器命令:

  • info usbhost 显示主机系统上所有 USB 设备的信息。找到所需的 USB 设备并记下该行中的两个十六进制值。(在下面的示例中,主机 USB 设备是 Memorex Mini,vendorid 为 0718,productid 为 0619。)在下面的 device_add 步骤中使用 info usbhost 命令显示的两个值。

  • device_add 将 USB 设备添加到虚拟机。

图 16. QEMU 监视器命令访问主机上的 USB 设备

如前所述,device_add 完成后,FreeBSD 内核会识别到新的 USB 设备,如图下部分所示。

在 图 17 中,展示了如何使用新设备。

图 17. 通过直通使用主机的 USB 设备

如果 USB 设备格式化为 FAT16 或 FAT32 文件系统,则可以使用 mount_msdosfs(8) 将其挂载为 MS-DOS™ 文件系统,如示例所示。然后将 /etc/hosts 文件复制到新挂载的驱动器上,并对文件进行校验和验证其完整性。然后使用 umount(8) 卸载设备。

如果 USB 设备格式化为 NTFS,则需要安装 fusefs-ntfs 包并使用 ntfs-3g(8) 访问该设备:

# pkg install fusefs-ntfs
# kldload fusefs
# gpart show da1
# ntfs-3g /dev/da1s1 /mnt

按需访问驱动器。完成后:

# umount /mnt

根据实际硬件修改上述设备标识符。有关 NTFS 文件系统操作的更多信息,请参阅 ntfs-3g(8)。

24.6.9. QEMU 在 FreeBSD 上的总结

如上所述,QEMU 支持多种不同的虚拟化加速器。

QEMU 支持的 虚拟化加速器 包括:

  • 在 Linux 上支持 64 位 Arm、MIPS、PPC、RISC-V、s390x 和 x86 的 KVM

  • 在 Linux 上作为 dom0 支持 Arm、x86 的 Xen

  • 在 MacOS 上支持 x86 和 Arm(仅 64 位)的 Hypervisor Framework (hvf)

  • 在 Windows 上支持 x86 的 Windows Hypervisor Platform (whpx)

  • 在 NetBSD 上支持 x86 的 NetBSD Virtual Machine Monitor (nvmm)

  • 在 Linux 和其他 POSIX 系统、Windows、MacOS 上支持 Arm、x86、Loongarch64、MIPS、PPC、s390x 和 Sparc64 的 Tiny Code Generator (tcg)

本节中的所有示例都使用了 Tiny Code Generator (tcg) 加速器,因为这是当前在 FreeBSD 上支持的唯一加速器。

FreeBSD 启动加载菜单
当 QEMU 抓取鼠标时
两个 QEMU 虚拟机
在 QEMU 窗口中切换到另一个虚拟控制台
使用视图菜单中的 Zoom to Fit 选项
通过 TCP 启用串行端口
qemu freebsd08
qemu freebsd09
qemu freebsd13
qemu freebsd14
qemu freebsd15
qemu freebsd16
qemu freebsd17
qemu freebsd12
qemu freebsd18
qemu freebsd19