由于缺少 /var/run/sshd,SSH 服务器在重启后停止工作

由于缺少 /var/run/sshd,SSH 服务器在重启后停止工作

我的 VPS 大约 3 个月没有重启过。它托管在具有 OpenVZ 虚拟化类型的服务器上,操作系统是 Ubuntu 16.04。出于某种原因,我重新启动了 VPS,之后我无法通过 ssh 连接到服务器,我收到的消息是:

ssh: connect to host srvname.com port 22: Connection refused

于是我在 VPS 上打开了串行控制台并开始调查...我清除并重新安装了,openssh-server但没有成功。我花了两个小时在网上阅读有关类似问题的文章、问题和答案。

最后我终于明白了,/var/run/sshd系统启动时不会创建该目录。一旦我手动创建它,我就可以毫无问题地启动 SSH 服务,但下次重启时问题仍然存在。我的问题是:

  • 造成此问题的原因可能是什么?为什么/var/run/sshd不在系统启动时创建?

  • 我该如何以适当的方式解决这个问题?我找到了本文末尾提到的临时解决方案。

  • 该问题是否与 VPS 的 OpenVZ 主机有关?我应该要求托管服务提供商解决这个问题吗?


systemctl status ssh.servicesshd -Ddp 22和的输出journalctl -xe为:

# systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since вт 2019-01-15 12:58:08 EET; 22s ago
  Process: 407 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=255)

яну 15 12:58:07 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 12:58:08 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 12:58:08 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.


# $(which sshd) -Ddp 22
debug1: sshd version OpenSSH_7.2, OpenSSL 1.0.2g  1 Mar 2016
debug1: private host key #0: ssh-rsa SHA256:...
debug1: private host key #1: ssh-dss SHA256:...
debug1: private host key #2: ecdsa-sha2-nistp256 SHA256:...
debug1: private host key #3: ssh-ed25519 SHA256:...
Missing privilege separation directory: /var/run/sshd


# journalctl -xe
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:21 srvname sshd[1688]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:21 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:21 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: Starting OpenBSD Secure Shell server...
-- Subject: Unit ssh.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:22 srvname sshd[1691]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:22 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.

/usr/lib/tmpfiles.d/sshd.conf和的内容/etc/init/ssh.conf为:

# cat /usr/lib/tmpfiles.d/sshd.conf 
d /var/run/sshd 0755 root root

# cat /etc/init/ssh.conf | sed '/^#/ d'

description "OpenSSH server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

env SSH_SIGSTOP=1
expect stop

console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

exec /usr/sbin/sshd -D

有关该系统的附加信息:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:    16.04
Codename:   xenial

# uname -a
Linux srvname 2.6.32-042stab127.2 #1 SMP Thu Jan 4 16:41:44 MSK 2018 x86_64 x86_64 x86_64 GNU/Linux

# apt show openssh-server | grep 'Version'
Version: 1:7.2p2-4ubuntu2.6

时间解决方案: 我发现/var/run是一个符号链接/run,我不知道为什么需要这个,但是当我修改文件的内容时/usr/lib/tmpfiles.d/sshd.conf

d /var/run/sshd 0755 root root

到:

d /run/sshd 0755 root root

系统启动一切顺利,SSH 服务正常启动,我可以通过 SSH 登录。

答案1

我发现这是当前版本的 systemd 和一些 VPS 特权使用的旧内核的一个错误,就像我的情况一样。这个错误不时出现,我们可以在 Launchpad 上看到:错误#45234, 漏洞#1811580;或者在 ServerFault 上:为什么每次启动后都会丢失 /var/run/sshd?

这个问题有几种解决方法,它们都包括/var/run/sshd在运行 SSH 服务器之前创建的替代方法。以下是三种可能的解决方案。


解决方法 1:/usr/lib/tmpfiles.d/sshd.conf按如下方式修改:

d /run/sshd 0755 root root

正如问题中提到的,/var/run是指向的符号链接/run,最终结果是相同的:/var/run/sshd创建了。我不知道为什么,但这有效。


解决方法 2:使用 Cron 作业创建/var/run/sshd并重新启动 SSH 服务器,您可以使用 root 用户crontab实现此目的 - 执行sudo crontab -e并添加以下条目:

@reboot mkdir -p -m0755 /var/run/sshd && systemctl restart ssh.service

目前我正在使用这个解决方案,因此它也经过了测试。


解决方法 3:使用/etc/rc.local与上述相同的操作,因为它是如该评论所示关于错误报告#45234。

答案2

您能否检查一下您的/(根文件系统)权限是否没有改变?必须root:root像下面两行:

drwxr-xr-x  25 root root      4096 дек 21 06:45 ..
drwxr-xr-x  25 root root      4096 дек 21 06:45 .

如果所有者是另一个用户(而不是 root 用户),这将阻止 systemd 在系统启动期间创建所有临时文件。您也可以使用以下命令进行检查:

systemd-tmpfiles --create

如果根文件夹(/)具有不同的权限,请使用以下命令进行更改:

chown root: /

答案3

对于@pa4080的修复不起作用的每个人,我通过禁用ssh套接字并直接启用ssh服务解决了错误。我遇到目录/run/sshd在几个小时后被删除的情况,尽管我尝试了这两种解决方案计划任务但也有systemd-tmp文件在 proxmox 上的 debian 11 容器上。

我的设置的解决方案是运行

systemctl disable ssh.socket --now
systemctl enable ssh.service --now

答案4

当我在一台机器上运行多个 sshd 实例(18.04.02 LTS,OpenSSH 7.6p1)时,我的机器遇到了这个问题。

问题在于 sshd(即命令行或文件)中没有提供用于更改“权限分离目录”位置的开关。根据 OpenSSH 7.6p1 源代码,sshd_config该目录应该位于 中。/var/empty

Ubuntu 软件包已将其重新映射到/run/sshd

当两个服务脚本尝试创建目录时,启动时脚本中存在“线程安全”问题init.d。我已要求 Ubuntu 和 OpenSSH 解决 sshd 中硬编码的“特权分离目录”路径名问题。如果我可以上传文件,我已经根据 8.0p1 OpenSSH 源代码进行了修复。

相关内容