如何在没有窗口管理器的情况下在物理连接的显示器上显示 GUI LXC 容器?

如何在没有窗口管理器的情况下在物理连接的显示器上显示 GUI LXC 容器?

我想要一个设置,其中我有 LXC OS 容器,可以在特定显示器上全屏启动。作为中间步骤,我尝试从容器中获取 X 应用程序以通过主机 X 显示。

我一直用这个作为指导:https://blog.simos.info/running-x11-software-in-lxd-containers/

我的程序是这样的:

创建用于运行 X11 容器的配置文件。

cat<<EOF>x11.profile
config:
  environment.DISPLAY: :0
  environment.PULSE_SERVER: unix:/home/ubuntu/pulse-native
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
  user.user-data: |
    #cloud-config
    runcmd:
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
description: GUI LXD profile
devices:
  PASocket1:
    bind: container
    connect: unix:/run/user/1000/pulse/native
    listen: unix:/home/ubuntu/pulse-native
    security.gid: "1000"
    security.uid: "1000"
    uid: "1000"
    gid: "1000"
    mode: "0777"
    type: proxy
  X0:
    bind: container
    connect: unix:@/tmp/.X11-unix/X0
    listen: unix:@/tmp/.X11-unix/X0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
  mygpu:
    type: gpu
name: x11
used_by: []
EOF


lxc profile create x11
cat x11.profile | lxc profile edit x11

然后我可以创建容器(尽管需要启动 X,但我一开始并没有意识到这是必要的)

$ lxc launch ubuntu:18.04 --profile default --profile x11 mycontainer
Creating mycontainer
Starting mycontainer
Error: Failed to run: /snap/lxd/current/bin/lxd forkstart mycontainer /var/snap/lxd/common/lxd/containers /var/snap/lxd/common/lxd/logs/mycontainer/lxc.conf: 
Try `lxc info --show-log local:mycontainer` for more info


$ sudo startx &
[1] 12745
$ 
X.Org X Server 1.20.11
X Protocol Version 11, Revision 0
Build Operating System: linux Ubuntu
Current Operating System: Linux virtland 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64
Kernel command line: BOOT_IMAGE=/BOOT/ubuntu_2aec3h@/vmlinuz-5.11.0-40-generic root=ZFS=rpool/ROOT/ubuntu_2aec3h ro init_on_alloc=0 amd_iommu=on vfio_pci.ids=10de:1b81,10de:10f0,1002:67df,1002:aaf0,1b21:1242 crashkernel=512M-:192M
Build Date: 06 July 2021  10:17:51AM
xorg-server 2:1.20.11-1ubuntu1~20.04.2 (For technical support please see http://www.ubuntu.com/support) 
Current version of pixman: 0.38.4
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Wed Nov 17 18:29:01 2021
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
$ lxc launch ubuntu:18.04 --profile default --profile x11 mycontainer
Creating mycontainer
Starting mycontainer

当我从容器内运行 xeyes 时,我无法连接到显示器。

我在以前的安装中使用了这个(它会让 xeyes 出现在主机桌面上,但如果没有桌面,它会弹出一个裸露的 xterm 窗口而不是 xeyes),但由于某种原因,现在它根本不起作用,我不能似乎弄清楚我做了什么不同的事情。

~$ lxc exec mycontainer -- sudo --user ubuntu --login
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@mycontainer:~$ xeyes
No protocol specified
Error: Can't open display: :0

因此,对于初学者来说,我希望能够xeyes再次出现在主机桌面上。

最终我希望能够在没有窗口管理器的情况下使用裸 X 来运行它,并最终使用该过程运行一个完整的 DE。

系统信息: 操作系统:Ubuntu Server 20.04 LXD 版本:4.20 LXC 版本:4.20

答案1

我终于在这里找到了答案:为什么我无法从“root”运行 GUI 应用程序:“未指定协议”?

我刚跑:

sudo startx & #I'm pretty sure it isn't ideal to startx as root
sudo -i
xhost si:localuser:MYUSERID
exit

然后当我进入我的容器并运行时xeyes,它就出现在显示屏上,甚至没有窗口管理器。我不确定我做了哪些其他事情也可能产生影响。在这一轮中,我安装了如下驱动程序:

sudo apt install --no-install-recommends nvidia-driver-470-server nvidia-utils-470-server nvidia-prime xfonts-base libc-dev libc6-dev fakeroot build-essential gnupg2 dbus-user-session mesa-vulkan-drivers

我怀疑这一切是否必要,但我没有时间或耐心凭经验将事实与迷信区分开来。如果它有效的话对我来说就足够了。

相关内容