我有一个 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 上,如下所述:
答案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
你可以从这个页面下载rpm包:https://github.com/arkane-systems/genie/releases
使用以下命令安装 genie-*.x86_64.rpm
dnf install
通过命令使用 genie
genie -s
使用systemctl启动sshd
systemctl 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
文件以了解它们配置和启动(以及停止/重新启动)服务所采取的步骤。
对于sshd
Fedora 下,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 环境中适用于我。
您可能需要考虑监督者代替systemd
PID 1 init 或另一个 PID 1 init 来管理服务。我在 Docker 容器下使用过它,它对于启动/停止/重新启动简单服务效果很好。您必须滚动自己的配置,但这很简单。最后,如果服务意外停止,增加可管理性和恢复能力是件好事。
还有一点需要注意,因为您正在使用sshd
WSL - 请记住,WSL2 实例始终在 Windows 主机后面的虚拟 NIC 中进行伪 NAT。这意味着ssh
从网络上的另一台计算机(或访问 WSL2 下的任何服务)将需要额外的努力 - 请参阅我的答案这里和这里关于那个话题。