丢失快照配置

丢失快照配置

我在 Windows 11 机器上使用 ubuntu 20.04 WSL2,每次打开 ubuntu 20.04 WSL2 时,我都意识到它丢失了我为 lxc、lxd 家庭实验室创建的快照配置,但容器仍然保存,我只丢失了快照配置,所以我每次都必须运行快照命令老化。

这些是我每次关闭、打开 ubuntu 20.04 WSL2 时必须运行的命令:

sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

答案1

我在这里做了一些假设,但我有一种预感,你列出的第一个命令并不是每次启动时都需要的。如果你的 snap 容器在重新启动后仍然完好无损,那么很可能软件包安装也还在那里。

首先,尝试不重复重新安装(第一行),看看后两个命令(启动 Systemd)在没有它的情况下是否仍然有效。我的直觉是它们会起作用。如果不行,请在评论中告诉我,我们会进一步探讨。

如果重启后只需要第 2 行和第 3 行,那么这将是完全预期的行为。WSL 不会在启动时自动运行任何命令,甚至 Systemd 也不会。

几种可能的解决方案(至少):

通过 shell 启动设置启动时运行的命令,并wsl.conf

由于您运行的是 Windows 11,因此一种解决方案(不一定是正确的解决方案)可能是将行unshare没有 sudo daemonize)/etc/wsl.conf以便它自动运行。但对于其他读者,请注意,此功能在 Windows 10 中不可用。

sudo -e /etc/wsl.conf,然后添加以下内容:

[boot]
command="/usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target"

该命令以 root 身份运行,因此无需使用sudo或输入密码。

然后,您还需要运行nsenter以进入命名空间。这需要在交互式会话中完成。您可以通过wsl在启动时使用命令本身运行的脚本来执行此操作,也可以将其添加到 中~/.bashrc。如果您使用第二种技术,则需要在尝试再次进入之前检查它是否已在运行,否则您将进入无限循环。即便如此,您还需要解决其他问题,这就是我真正推荐的原因...

为 WSL2 使用已建立的 Systemd 脚本

如果您使用问题中提到的命令,那么您的 WSL2/Ubuntu 安装可能存在比您想象的更多问题。如果我没记错的话:

  • Windows 驱动器可能不会自动安装到/mnt/c样式目录中,因为它们通常在 WSL2 下。
  • Windows 可执行文件可能无法运行,因为 Systemd 将清除binfmt_miscWSL 设置的条目。
  • 您可能无法使用 GUI 应用程序,因为 Systemd 启动时还会systemd-tempfiles使用擦除 WSL2 X 套接字的配置运行(出于安全目的)。
  • Windows 路径不会自动附加到 Linux 路径,这只会加剧前面提到的两个问题。

如果你已经解决了这些问题,那就太好了。否则,我建议使用一个成熟的 WSL2 Systemd 脚本,例如精灵或者WSL2Hacks

我个人实际上并没有运行或认可其中任何一个,但如果您要尝试在 WSL 下运行 Systemd/Snap,我建议您使用其中一个,而不是尝试自己动手。

据我所知,他们还将处理启动时自动启动的问题。

替代流程主管

从我的角度来看,这个建议(稍微)未经证实,至少在 Ubuntu 上是如此,但 Systemd 与 WSL 的/initPID 1 冲突使其变得麻烦。

可能发现使用不需要 PID1 的替代进程管理器更容易,然后为 D-Bus 和 Snapd 等推出自己的启动命令。Ubuntu 软件包就是这样一种替代方案supervisor,我已在 Ubuntu 下成功将其用于其他类似用途。

我计划亲自对此进行更多研究,但还不足以提供全面的解决方案。

相关内容