如何在基于 WSL 的 Fedora 中启动服务?

如何在基于 WSL 的 Fedora 中启动服务?

我有一个 Linux 2 Windows 子系统下的 Fedora 33。

我想运行 sshd。为此我尝试过

$ sudo systemctl start sshd

但我收到了错误消息

System has not been booted with systemd as init system (PID 1). Can't operate

搜索此错误消息我发现

https://linuxhandbook.com/system-has-not-been-booted-with-systemd/

建议在这种情况下使用 service 命令。我试过了,但它说

Redirecting to /bin/systemctl start sshd.service

所以我得到了同样的错误。

我可以在基于 WSL2 的 Fedora 33 上做什么?

更新:我已使用云映像和 wsl 命令将 Fedora 安装到 WSL 上,如下所述:

https://fedoramagazine.org/wsl-fedora-33/

答案1

我使用 fedora 35,但这可能也适用于其他 Fedora 版本。
就像NotTheDr01ds所说,fedora不支持service start sshd。所以你可以通过命令手动运行 sshd nohup /usr/sbin/sshd -D > sshd.log 2>&1 &。或者您需要让 systemd 为 wsl 工作。
由于genie支持fedora,因此您可以尝试使用它来使systemd工作。
这是项目网址:https://github.com/arkane-systems/genie

  1. 你可以从这个页面下载rpm包:https://github.com/arkane-systems/genie/releases

  2. 使用以下命令安装 genie-*.x86_64.rpmdnf install

  3. 通过命令使用 geniegenie -s

  4. 使用systemctl启动sshdsystemctl start sshd

Transport endpoint is not connected您可能会在第四步遇到错误。这是由 wsl ldconfig 的一个已知问题引起的。

请按照以下说明进行修复:
https://github.com/microsoft/WSL/issues/5548#issuecomment-990521993
https://github.com/microsoft/WSL/issues/5548#issuecomment-912495487

答案2

你没有提到你是如何安装它的,但我认为类似于说明这里。我从来没有对 Fedora 做过太多事情,所以我决定使用它加载一个快速 chroot 实例Fedora-容器-Base结合使用上述说明以及一些 chroot 特定信息

在我看来,Fedora 是“全力以赴”的systemd,也许比我见过的大多数其他发行版更是如此。例如,Ubuntu 仍然允许您使用该service命令,但正如您所看到的,Fedorasystemd无论如何都会将其重定向到。在 Fedora 下甚至找不到初始化脚本ssh——全是systemd服务文件。

这篇博文似乎以 Fedora 为例来支持这一点。它为大多数人提供了许多好的建议其他服务:

  • 查看您想要运行的服务的 Dockerfile,了解它们如何启动和停止该服务
  • 无论如何,只需使用 Docker 或 podman 容器即可。

sshd虽然建议很好,但在我看来它们并没有那么有用。

因此,我将添加我自己的建议 - 查看systemd文件以了解它们配置和启动(以及停止/重新启动)服务所采取的步骤。

对于sshdFedora 下,systemd服务 ( usr/lib/systemd/system/sshd.service) 具有检测主机密钥是否已生成的依赖项,如果主机密钥不存在(例如安装后立即生成),则执行此操作。 (我认为——我不能自称是阅读systemd服务的大师。)

因此,对于初学者,您需要手动执行该步骤(如果您还没有这样做):

/usr/libexec/openssh/sshd-keygen ecdsa
/usr/libexec/openssh/sshd-keygen rsa
/usr/libexec/openssh/sshd-keygen ed25519

个人建议/额外提示——将 sshd 端口更改为 22 以外的其他端口。安装Windows OpenSSH 服务器在 Windows 主机上,这将允许您轻松代理到主机上的任何 WSL 实例。

然后,只需使用与使用相同的命令手动启动服务systemd(请参阅上述.service文件):

/usr/sbin/sshd

chroot这在Fedora 33 环境中适用于我。

您可能需要考虑监督者代替systemdPID 1 init 或另一个 PID 1 init 来管理服务。我在 Docker 容器下使用过它,它对于启动/停止/重新启动简单服务效果很好。您必须滚动自己的配置,但这很简单。最后,如果服务意外停止,增加可管理性和恢复能力是件好事。

还有一点需要注意,因为您正在使用sshdWSL - 请记住,WSL2 实例始终在 Windows 主机后面的虚拟 NIC 中进行伪 NAT。这意味着ssh从网络上的另一台计算机(或访问 WSL2 下的任何服务)将需要额外的努力 - 请参阅我的答案这里这里关于那个话题。

答案3

相关内容