配置 QEMU 以测试多席位操作系统(多个控制台)

Posted

技术标签:

【中文标题】配置 QEMU 以测试多席位操作系统(多个控制台)【英文标题】:Configure QEMU to test multi-seat operating system (multiple consoles) 【发布时间】:2020-09-25 02:10:57 【问题描述】:

作为学术课程的一部分,我们正在实施一个简单的操作系统。到目前为止,我们已经使用 QEMU 来模拟 x86 处理器来运行我们的操作系统。现在,我们想出了一个想法来扩展我们的操作系统以支持多个用户,最好是以支持同时使用操作系统及其几个资源的方式。

我的问题是,我们是否可以通过某种方式运行 QEMU,例如,打开 2 个 QEMU 监视器/控制台/终端(在这种情况下不确定正确的术语),每个代表不同的用户,以及两者都使用操作系统的单个实例。假设这两个监视器被初始化以运行我们作为用户程序在 out OS 中拥有的不同的 shell 程序实例。

到目前为止,我们看到的一个类似功能是运行 QEMU,同时在某个端口上监听 gdb 连接,我们可以通过运行 gdb 通过另一个控制台连接到该端口,从而进入调试模式。一个控制台将显示我们的操作系统输出,另一个用于 gdb 命令。

有没有人知道怎么做这样的事情?谢谢!

【问题讨论】:

您正在寻找的术语是具有多个 kbd/鼠标/监视器控制台的系统的“多座位”。例如对于 GNU/Linux:wiki.ubuntu.com/Multiseat。 (“多头”是一个键盘/鼠标,多个显示器。)大多数现代操作系统都是多用户的(内存保护等),但普通系统只有一个控制台,因此多个同时用户必须远程登录。无论如何,不​​,我不知道如何配置 QEMU 或 BOCHS 来模拟具有多个输入设备 + 屏幕 = 控制台的机器。作为一个 GDB 远程是完全独立的事情,独立于客户机。 我认为不可能为多个键盘和多个显示器配置 Qemu。作为替代方案,您的操作系统可以支持任何“远程桌面”网络协议(telnet、RDP、RFB、X 等),因此您只需要模拟器提供虚拟网卡。在这种情况下,您可以在与 Qemu 相同的真实计算机上运行“远程桌面客户端”(除了 Qemu 的键盘和显示器)。对于“现实世界的部署”,值得看看现代瘦客户端支持哪些协议(因为“瘦客户端 + 服务器”相对常见)。 【参考方案1】:

是的,有办法。 Peter Cordes said,需要配置多席位虚拟机。 seat 是一组人机界面设备,通常包括显示器、键盘和鼠标。硬件配置的难度不如软件配置那么大。构建多座位(物理)计算机的 Linux 用户圈子很小,因此软件支持稀缺且漏洞百出。下面我描述了我在虚拟机中运行的硬件配置。

硬件

创建具有两个席位的 VM 的示例命令行:

qemu-system-x86_64 -display gtk -enable-kvm -cpu host -monitor stdio\
    -nodefaults\
    -machine q35,accel=kvm -m 1G\
    -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd -drive if=pflash,format=raw,file=OVMF_VARS.fd\
    -device virtio-blk-pci,addr=01.0,drive=root-fs -drive id=root-fs,file="$HOME/temp/qemu/ata.qcow2",if=none\
    -device virtio-gpu-pci,id=seat0-video,addr=08.0,xres=1024,yres=768\
    -device virtio-keyboard-pci,addr=09.0,display=seat0-video\
    -device virtio-tablet-pci,addr=0a.0,display=seat0-video\
    -device virtio-gpu-pci,id=seat1-video,addr=0c.0,xres=600,yres=800\
    -device virtio-keyboard-pci,addr=0d.0,display=seat1-video\
    -device virtio-tablet-pci,addr=0e.0,display=seat1-video

lspci -tv 在 VM 中的输出应该是:

-[0000:00]-+-00.0  Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller
           +-01.0  Red Hat, Inc. Virtio block device
           +-08.0  Red Hat, Inc. Virtio GPU
           +-09.0  Red Hat, Inc. Virtio input
           +-0a.0  Red Hat, Inc. Virtio input
           +-0c.0  Red Hat, Inc. Virtio GPU
           +-0d.0  Red Hat, Inc. Virtio input
           +-0e.0  Red Hat, Inc. Virtio input
           +-1f.0  Intel Corporation 82801IB (ICH9) LPC Interface Controller
           +-1f.2  Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode]
           \-1f.3  Intel Corporation 82801I (ICH9 Family) SMBus Controller

PCI 设备 08.009.00a.0 用于 seat0。 PCI 设备0c.00d.00e.0 用于seat1tablet 实际上是一只老鼠。 GPU 是座位的主要设备。属于座位的非主设备的display 参数应该是该座位的主设备的标识符,以便 QEMU GUI 正确显示座位。

与采用 PCI Express 的物理计算机的拓扑相比,此硬件拓扑得到了简化。在此 VM 中,所有设备都在同一条 PCI 总线上,而具有 PCI Express 的物理计算机为每个物理设备提供一条 PCI 总线。如果此拓扑不起作用,请尝试更接近地模仿 QEMU 的“PCI EXPRESS GUIDELINES” 中描述的物理拓扑。

在显示 GPU 输出和接收鼠标和键盘事件的 QEMU GUI 窗口中,单击主菜单 View → Show Tabs。每个 GPU 都应该有一个选项卡。

需要 OVMF,因为此 VM 运行 UEFI Bios$HOME/temp/qemu/ata.qcow2是一个块设备,包含Linux的根文件系统。

udev

抽象地说,您需要将设备标识符传达给实现 UI 的程序。常见的 GUI 程序,如 Xorg 服务器和 Weston 服务器get this information from udev。系统管理员应通过将设备的ID_SEAT 变量设置为该设备所属的席位名称来将设备附加到席位。然后应该使用命令行选项启动 UI 程序,告诉程序应该在哪个座位上工作。

ID_SEAT 是一个 udev ENV 变量。它可以根据设备的属性进行设置,并使用 udev 规则 放置在硬件拓扑中。如果设备没有ID_SEAT,则假定它属于名为seat0 的席位。

udev 守护进程执行“/etc/udev/rules.d/”中的规则。设置ID_SEAT的示例规则文件“/etc/udev/rules.d/97-seat.rules”:

TAG=="seat", ENVDEVPATH=="/devices/pci0000:00/0000:00:0[cdef].0", ENVID_SEAT="seat1"
TAG=="seat", ENVDEVPATH=="/devices/pci0000:00/0000:00:0[cdef].0/*", ENVID_SEAT="seat1"

上述规则的含义是设置DEVPATH变量匹配指定正则表达式且TAGS变量包含字符串seat的设备的ID_SEAT。设备的DEVPATH 变量将指向该设备的路径存储在sys 文件系统中。规则中的星号匹配 /devices/pci0000:00/0000:00:0[cdef].0 的严格后代,但不匹配此设备本身。这就是为什么需要两条规则的原因。命令udevadm info $DEV_PATH 显示$DEV_PATH 引用的设备的ENV 变量。例如,udevadm info /sys/devices/pci0000:00/0000:00:0c.0/virtio5/drm/card1 应该输出:

P: /devices/pci0000:00/0000:00:0c.0/virtio5/drm/card1
N: dri/card1
L: 0
S: dri/by-path/pci-0000:00:0c.0-card
E: DEVPATH=/devices/pci0000:00/0000:00:0c.0/virtio5/drm/card1
E: DEVNAME=/dev/dri/card1
E: DEVTYPE=drm_minor
E: MAJOR=226
E: MINOR=1
E: SUBSYSTEM=drm
E: USEC_INITIALIZED=1661999
E: ID_PATH=pci-0000:00:0c.0
E: ID_PATH_TAG=pci-0000_00_0c_0
E: ID_FOR_SEAT=drm-pci-0000_00_0c_0
E: ID_SEAT=seat1
E: DEVLINKS=/dev/dri/by-path/pci-0000:00:0c.0-card
E: TAGS=:master-of-seat:uaccess:seat:
E: CURRENT_TAGS=:master-of-seat:uaccess:seat:

显示服务器

如前所述,UI 程序应以座位命令行选项启动。对于 Xorg 服务器,此选项称为 -seat。像 Xorg 服务器这样的显示服务器通常是通过 显示管理器 启动的。我只知道一个支持多座位的显示管理器 LightDM。还有一个indication that SDDM supports multi-seat。 LightDM 在所有座位(具有 GPU)上显示用户登录表单。不幸的是,没有办法让 LightDM 忽略座位。

【讨论】:

以上是关于配置 QEMU 以测试多席位操作系统(多个控制台)的主要内容,如果未能解决你的问题,请参考以下文章

交易所相关网关席位交易单元

路由器逆向分析------MIPS系统网络的配置(QEMU)

testng多线程并行执行测试

SAAS 席位认证

UEFI实战Windows版本QEMU网络配置

UEFI实战Windows版本QEMU网络配置