Назад | Перейти на главную страницу

systemd unit не запускается при загрузке в Debian 9, но запускается нормально при запуске вручную после загрузки и при загрузке в Debian 8

У меня есть модуль systemd, предназначенный для создания туннеля SSH между двумя серверами. Сервер, на котором установлен модуль, работает под управлением Debian 9. Так выглядит файл .service, за исключением нескольких Documentation директивы, которые я исключил здесь для краткости (они не проблема, и они прекрасно разбираются systemd):

# cat /etc/systemd/system/ssh-tunnel-remote1.service
[Unit]
Description=SSH tunnel for services on remote1
After=network-online.target
[Install]
WantedBy=networking.target
[Service]
Type=simple
User=ssh-remote1
Group=ssh-remote1
Environment=AUTOSSH_POLL=90
ExecStart=/usr/bin/autossh -M 0 -q -N -p 15539 -o "PubkeyAuthentication yes" -o "PreferredAuthentications publickey" -o "IdentityFile /home/ssh-remote1/.ssh/id_rsa" -L 9999:127.0.0.1:X ssh-tunnel@remote1.example.com
Restart=always
PrivateTmp=true
# 

(Обратите внимание X в -L это реальный номер порта.)

На сервере, на котором запущена эта служба, /usr/bin на /, поэтому проблема не в том, что файловая система не монтируется при запуске службы.

В After=network-online.target должно быть достаточно, чтобы DNS был доступен, и даже если бы это было проблемой, можно было подумать, что systemd перезапустит службу в случае сбоя.

Сама служба выглядит как включенная:

# find /etc/systemd -name ssh-tunnel-remote1\*
/etc/systemd/system/networking.target.wants/ssh-tunnel-remote1.service
/etc/systemd/system/ssh-tunnel-remote1.service
#

но systemctl list-units похоже, не знает об этом:

# systemctl list-units -t service --all | grep ssh-tunnel-remote1
# 

Я пробовал различные варианты systemctl daemon-reload, systemctl reenable ssh-tunnel-remote1, systemctl enable ssh-tunnel-remote1, systemctl disable ssh-tunnel-remote1 и reboot.

Похоже, что бы я ни делал, после загрузки служба отображается как inactive (dead):

# systemctl -o verbose  -l status ssh-tunnel-remote1
● ssh-tunnel-remote1.service - SSH tunnel for services on remote1
   Loaded: loaded (/etc/systemd/system/ssh-tunnel-remote1.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
#

Однако если я сделаю это вручную, все начнется нормально:

# systemctl start ssh-tunnel-remote1
# systemctl status ssh-tunnel-remote1
● ssh-tunnel-remote1.service - SSH tunnel for services on remote1
   Loaded: loaded (/etc/systemd/system/ssh-tunnel-remote1.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-07-10 13:01:11 UTC; 55s ago
 Main PID: 17835 (autossh)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/ssh-tunnel-remote1.service
           ├─17835 /usr/lib/autossh/autossh -M 0 -q -N -p 15539 -o PubkeyAuthentication yes -o PreferredAuthentications publickey -o IdentityFile /home/ssh-remote1/.ssh/id_rsa -L 9999:127.0.0.1:X ssh-tunnel
           └─17838 /usr/bin/ssh -q -N -p 15539 -o PubkeyAuthentication yes -o PreferredAuthentications publickey -o IdentityFile /home/ssh-remote1/.ssh/id_rsa -L 9999:127.0.0.1:X ssh-tunnel@remote1.example.

Jul 10 13:01:11 localhost systemd[1]: Started SSH tunnel for services on remote1.
Jul 10 13:01:11 localhost autossh[17835]: port set to 0, monitoring disabled
Jul 10 13:01:11 localhost autossh[17835]: starting ssh (count 1)
Jul 10 13:01:11 localhost autossh[17835]: ssh child pid is 17838
# telnet 127.0.0.1 9999
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
<usable connection here>
Connection closed by foreign host.
# 

Сразу после перезагрузки journalctl -xru ssh-tunnel-remote1.service просто печатает -- No entries --. Поиск вручную через вывод journalctl и вообще нигде не показывает. Напротив, после запуска службы вручную та же команда выводит что-то очень похожее на:

-- Logs begin at Mon 2017-07-10 12:46:14 UTC, end at Mon 2017-07-10 13:10:24 UTC. --
Jul 10 13:01:11 localhost autossh[17835]: ssh child pid is 17838
Jul 10 13:01:11 localhost autossh[17835]: starting ssh (count 1)
Jul 10 13:01:11 localhost autossh[17835]: port set to 0, monitoring disabled
Jul 10 13:01:11 localhost systemd[1]: Started SSH tunnel for services on remote1.
-- Subject: Unit ssh-tunnel-remote1.service has finished start-up
-- Defined-By: systemd
-- Support: https://www.debian.org/support
-- 
-- Unit ssh-tunnel-remote1.service has finished starting up.
-- 
-- The start-up result is done.

Это самодельный файл .service, но он отлично работает на другом сервере, на котором работает Debian 8.

Я попытался разместить его как в / etc / systemd / system, так и в / lib / systemd / system, без видимой разницы.

При выполнении из командной строки как su -l ssh-remote1 -c '/usr/bin/autossh -M 0 -q ...', autossh и ssh отлично работает на переднем плане и туннель доступен.

Я практически уверен, что мне не хватает простой разницы между systemd 232 в Debian 9 и systemd 215 в Debian 8, но что? Какие заклинания необходимы, чтобы эта служба запускалась при загрузке Debian 9?