SSH Server stops working after reboot, caused by missing /var/run/sshd
I found this is a bug with the current version of systemd and old kernels that are used by some VPS privdes as it is in my case. This bug appears time to time, as we can see on Launchpad: Bug #45234, Bug #1811580; or on ServerFault: Why am I missing /var/run/sshd after every boot?
There are few workarounds of this issue, they all come together to alternative way to create /var/run/sshd
before running the SSH server. Here are three possible solutions.
Workaround 1: Modify /usr/lib/tmpfiles.d/sshd.conf
in the following way:
d /run/sshd 0755 root root
As it is mentioned in the question, /var/run
is a symbolic link to /run
, the final result is identical: /var/run/sshd
is created. I do not know why, but this works.
Workaround 2: Use Cron job that will create /var/run/sshd
and restart the SSH server, you can use the root's crontab
for this purpose - execute sudo crontab -e
and add the following entry:
@reboot mkdir -p -m0755 /var/run/sshd && systemctl restart ssh.service
Currently I'm using this solution, so it is also tested.
Workaround 3: Use /etc/rc.local
to do the same as the above, as it is shown in this comment on bug report #45234.
Could you check whether your /
(root filesystem) permissions are not changed? Have to be root:root
like the two lines below:
drwxr-xr-x 25 root root 4096 дек 21 06:45 ..
drwxr-xr-x 25 root root 4096 дек 21 06:45 .
If the owner is another user (and not root) this will prevent creating all temporary files by systemd during system startup. You may check also with the command:
systemd-tmpfiles --create
If the root folder (/
) has different permission, please change it with the following command:
chown root: /
Thanks everyone for helpful information. The problem with ssh-server on my Xenial Lubuntu was indeed related to ownership of '/' as suggested by Melebius & Stefan.
Manually creating /var/run/sshd
and restarting ssh.service temporarily ssh-server temporarily. Editing the sshd.conf
did not help in this system. Then following the last suggestion, I checked the root folder ownership with:
'ls -alF /
' and sure enough, it had been accidentally changed to a local user/group. Issuing from the terminal: 'sudo chown root:root /
' fixed my system, regardless of the edit to sshd.conf
. So I restored that to its original state, i.e. d /var/run/sshd 0755 root root
.
I am having this problem on my machine when I am running multiple instances of sshd on a single machine (18.04.02 LTS, OpenSSH 7.6p1).
The problem is that there are no switches in sshd (i.e. command line or the sshd_config
file) provisioned for changing the location of the "privilege separation directory". The directory should be in the /var/empty
, according to the OpenSSH 7.6p1 source code.
The Ubuntu package has remapped this to /run/sshd
.
There is a "thread safety" issue in the init.d
scripts at boot when both service script attempt to make the directory. I have asked both Ubuntu and OpenSSH to address the issue of hard-coded "privilege separation directory" path names in sshd. If I could upload files, I have the fixed based upon the 8.0p1 OpenSSH source code.