我的 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.service
:sshd -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登录。
我发现这是一些 VPS privdes 使用的当前版本的 systemd 和旧内核的错误,就像我的情况一样。这个错误不时出现,正如我们在 Launchpad 上看到的那样:错误#45234,错误#1811580;或在 ServerFault 上:为什么每次启动后我都缺少 /var/run/sshd?
这个问题的解决方法很少,它们都集中
/var/run/sshd
在运行 SSH 服务器之前创建的替代方法。以下是三种可能的解决方案。解决方法一:
/usr/lib/tmpfiles.d/sshd.conf
按如下方式修改:正如问题中提到的,
/var/run
是一个符号链接/run
,最终结果是相同的:/var/run/sshd
被创建。我不知道为什么,但这有效。解决方法 2:使用将创建并重新启动 SSH 服务器的 Cron 作业,您可以为此目的
/var/run/sshd
使用 root - 执行并添加以下条目:crontab
sudo crontab -e
目前我正在使用这个解决方案,所以它也经过了测试。
解决方法 3:用于
/etc/rc.local
执行与上述相同的操作,如错误报告 #45234的此评论中所示。您能否检查您的
/
(根文件系统)权限是否未更改?必须root:root
像下面的两行:如果所有者是另一个用户(而不是 root),这将阻止 systemd 在系统启动期间创建所有临时文件。您也可以使用以下命令进行检查:
如果根文件夹(
/
)有不同的权限,请使用以下命令进行更改:感谢大家提供有用的信息。正如 Melebius 和 Stefan 所建议的,我的 Xenial Lubuntu 上的 ssh-server 的问题确实与“/”的所有权有关。
临时手动创建
/var/run/sshd
和重启 ssh.service 临时 ssh-server。编辑sshd.conf
在这个系统中没有帮助。然后按照最后一个建议,我检查了根文件夹的所有权:'
ls -alF /
' 果然,它已被意外更改为本地用户/组。从终端发出:'sudo chown root:root /
'修复了我的系统,无论编辑到sshd.conf
. 所以我把它恢复到原来的状态,即d /var/run/sshd 0755 root root
。当我在一台机器(18.04.02 LTS,OpenSSH 7.6p1)上运行多个 sshd 实例时,我的机器上遇到了这个问题。
问题是 sshd(即命令行或
sshd_config
文件)中没有设置用于更改“权限分离目录”位置的开关。/var/empty
根据 OpenSSH 7.6p1 源代码,该目录应该在.Ubuntu 软件包已将其重新映射为
/run/sshd
.init.d
当两个服务脚本都尝试创建目录时,启动时脚本中存在“线程安全”问题。我已经要求 Ubuntu 和 OpenSSH 解决 sshd 中硬编码的“权限分离目录”路径名的问题。如果我可以上传文件,我会根据 8.0p1 OpenSSH 源代码进行修复。