如何使用 systemd-nspawn 容器设置嵌套的 Wayland 桌面环境,例如 VirtualBox

How to set up nested Wayland Desktop Environment with systemd-nspawn container, like VirtualBox

这是问答,分享我基于 Whosebug 的标题技巧 rule/encouragement

https://Whosebug.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/

https://whosebug.com/help/self-answer

我可以回答我自己的问题吗?

Yes! Stack Exchange has always explicitly encouraged users to answer their own questions. If you have a question that you already know the answer to, and you would like to document that knowledge in public so that others (including yourself) can find it later, it's perfectly okay to ask and answer your own question on a Stack Exchange site.

原始回购是

https://github.com/kenokabe/wayland-desktop-container

如何使用 systemd-nspawn 容器设置嵌套的 Wayland 桌面环境,例如 VirtualBox

本教程将指导您在计算机上设置 Wayland Desktop Environment with linux systemd-nspawn 容器。这类似于 VMware Workstation 或 VirtualBox,但 linux 仅具有最小的开销性能。

快速查看最终结果

特点和优势

✓ 硬件独立容器OS 通过硬件抽象,通过 systemd-nspawn 容器技术以极其高效、最小的性能开销方法
✓ 在启用 systemd 的 linux 主机之间 100% 可移植,轻松备份和恢复
✓ 3D桌面效果等直接渲染作品
✓ 视频和声音作品
✓ 网络开箱即用
✓ 不太可能弄乱主机OS和主机OS和硬件的不频繁重启操作,而是享受容器OS的即时虚拟启动、关机和重启。

方法总结

  1. 启动 kwin_wayland window,
    嵌套在您当前的桌面环境中。

  2. systemd-nspawn

  3. 启动你的容器OS
  4. 来自容器OS控制台:
    (a) 向目标 kwin_wayland window.
    启动桌面环境,例如 XFCE or LXQt (b) 只需准备您最喜欢的启动器应用程序,例如 synapse or xfce4-panel 即可进行最小设置。

遍历

主机OS 最少的应用程序

主机OS可以是任何带有systemd的linuxOS,桌面环境可以是Wayland或legacy X11。

虽然,Wayland hostOS显然更可取,但情况还不成熟。截至 2017 年 3 月,只有 Fedora 25 将基于 Wayland 的 GNOME 会话作为基于 X11 的默认会话,但其他发行版则没有。最新版本的 KDE-Plasma 在 X11/Xorg 下稳定,但在 Wayland 下不稳定。

可能,如果您使用 GNOME 作为主机环境,请选择 Wayland,但如果是 Plasma 或其他 DE,请保守使用 X11/Xorg 以确保稳定性。

这种方法在两种情况下都非常有效,我个人使用Arch Linux with KDE-Plasma(X11/Xorg)

安装systemd-nspawnkwin_wayland

有些发行版如 Arch 已经有 systemd-nspawn,但其他发行版如 Ubuntu 没有。

systemd-nspawn

Binary package “systemd-container” in ubuntu xenial

昆韦兰

Binary package “kwin-wayland” in ubuntu xenial

Arch 可能在 xorg-server-xwayland 包中有 kwin_wayland

启动kwin_waylandwindow

KWin 被誉为功能最齐全、最稳定的 window 管理器之一。 这是一个直接呈现 wayland window space 由 KWin 管理并嵌套在您当前的桌面环境中。

Starting a nested KWin @KWin/Wayland - KDE Community Wiki
Since 5.3 it is possible to start a nested KWin instance under either X11 or Wayland:

export $(dbus-launch); \
kwin_wayland --xwayland &;

for fish shell

export (dbus-launch);

启动你的容器OS

sudo systemd-nspawn \
-bD /YOUR_MACHINE_ROOT_DIRECTORY \
--volatile=no \
--bind-ro=/home/YOUR_USERNAME/.Xauthority \
--bind=/run/user/1000 \
--bind=/tmp/.X11-unix \
--bind=/dev/shm \
--bind=/dev/dri \
--bind=/run/dbus/system_bus_socket \
--bind=/YOUR_DATA_DIRECTORY

将宿主机OS的/YOUR_DATA_DIRECTORY绑定到容器OS,这样就可以在两者之间共享数据目录,同时你的容器OS 可以保持尽可能小和干净,有利于便携性和 backup/restore.

登录容器OS控制台。

通常,您从 minimal/server OS 映像构建容器发行版 OS。

记住,您不需要安装 X11/Xorg 显示服务器,或容器的 wayland OS 因为 kwin_wayland window扮演角色。

为目标启动桌面环境 (XFCE) kwin_wayland window。

请记住,KWin 已经 运行ning,它是一个功能完整且功能强大的 WindowManager。您可以通过快捷键使用 KWin 启动和切换任务,或者准备您最喜欢的启动器应用程序,例如 synapsexfce4-panel 以进行最小设置。

但是,如果我们需要对用户更友好的桌面环境,只需安装并启动 XFCELXQt 即可 运行 以及 KWin

来自容器OS控制台:

export XAUTHORITY=/home/YOUR_USERNAME/.Xauthority; \
export XDG_RUNTIME_DIR=/run/user/1000; \
export CLUTTER_BACKEND=x11; \
export QT_X11_NO_MITSHM=1; \
xfce4-session --display :1;

默认最大化并删除 kwin_wayland window 的边框

您可能想删除容器的框架OS,这是在 Plasma(主机的 DEOS)上的方法。

最终结果

确认 XFCE 环境识别 运行ning 在 XWAYLAND 显示器上。

XWayland 实现兼容层以在 Wayland 上无缝 运行 遗留 X11 应用程序。

到目前为止,更像是例外,如果你安装 GUI libraries of wayland,带有特定的标志,你可以在 wayland 上本地看到 GUI 应用程序 运行。

左边是 kate window 与 Xorg/X11 兼容模式。
右边是window with wayland native mode.

如您所见,原生 wayland 应用程序不反映当前 window 主题,XFCE 面板不显示应用程序任务,您无法分辨性能差异,只要您使用PC正常应用。

所以,可能没有太多理由追求 wayland 本机模式应用程序。 但对于 3D 游戏,情况可能会有所不同,并且在 Raspberry Pi.

等小型设备上会大不相同

(可选)旧版 X11/Xorg

尽管本教程主要关注嵌套的 wayland window,Xephyr(运行 作为 X 应用程序的嵌套 X 服务器)已经存在很长时间了。

kwin_wayland 不同,Xepher 未针对直接渲染进行优化并且 KWin Window 管理器未捆绑,因此如果您 运行 KWin 或其他直接渲染作曲家Xepher 的顶部,事情进展缓慢且效率低下,因此不推荐,但方法如下:

Xephyr -ac -screen 1200x700 -resizeable -reset :1 &;

主机OS与容器OS交互

您不能在 HostOS 和 ContainerOS 之间复制和粘贴。
您可以考虑使用 GoogleKeep 在 HostOS 和 ContainerOS 之间共享内容,当然,您应该通过 systemd-nspawn bind 共享目录。

便携性

您可以 "backup/recover" 或 "copy" 或 "move" 大陆 OS 到任何地方,无论

  • 内核更新
  • 硬件驱动
  • 磁盘分区(/etc/fstab等)
  • GRUB/UEFI 配置

或任何其他典型的集成故障!

请注意主机内核版本。

备份

你的机器目录./machines
你的机器备份目录./machines-bak
你的机器映像目录 arch1

cd ~/machines/
sudo tar -cpf ~/machines-bak/arch1.tar arch1 --totals

恢复

cd ~/machines/
sudo tar -xpf ~/machines-bak/arch1.tar --totals

备份工具

上面的 tar 命令可能不是最聪明的方法,但是,它是一种经过验证的可靠方法,无需安装任何额外的工具。通常,简单是最好的。

不过,您可以select各种备份工具以提高效率。

Synchronization and backup programs @ArchWIKI

Git 底座 bup 看起来不错,很新。

您可能会考虑从容器中移除什么 OS

任何硬件相关因素,例如:

  • linux 具有各种驱动程序的内核
  • /etc/fstab
  • NetworkManager.servicesystemd

麻省理工学院许可证