是的,有办法。 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.0、09.0 和 0a.0 用于 seat0。 PCI 设备0c.0、0d.0 和0e.0 用于seat1。 tablet 实际上是一只老鼠。 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", ENV{DEVPATH}=="/devices/pci0000:00/0000:00:0[cdef].0", ENV{ID_SEAT}="seat1"
TAG=="seat", ENV{DEVPATH}=="/devices/pci0000:00/0000:00:0[cdef].0/*", ENV{ID_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 忽略座位。