Вопрос или проблема
Я пытаюсь включить SSH в моей системе Ubuntu, работающей в WSL2:
sudo systemctl status ssh
Я получаю эту ошибку:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Что это значит и как я могу включить ssh?
Обновление #1: Systemd теперь поддерживается на WSL2. Пожалуйста, смотрите этот ответ для деталей о том, как его включить. Как только Systemd будет включен, SSH сервер можно будет автоматически запускать с sudo systemctl enable ssh
и проверять с sudo systemctl status ssh
.
Некоторые моменты, которые стоит учесть при попытке использовать SSH на WSL2:
Как упоминали другие, так как WSL еще не поддерживает систему и инфраструктуру инициализацииsystemd
, вам придется опираться на другие методы. Версия WSL Ubuntu по-прежнему предоставляет старые скрипты в стилеinit.d
для большинства сервисов. Таким образом,sudo service ssh start
(илиrestart
, илиstatus
, илиstop
, и т.д.) – это то, что вы будете использовать.
Кроме включения SSH, однако, вероятно, вы захотите иметь возможность подключиться к нему с удаленной системы. WSL2 работает в ВМ с виртуальным сетевым интерфейсом, который подчинен NAT, так что вы не сможете подключиться по ssh
к WSL инстансу с какого-либо другого устройства в сети без дополнительных усилий. WSL все же предоставляет автоматическую переадресацию localhost, так что вы можете подключиться по ssh
из Windows на том же устройстве или из другого инстанса WSL на том же устройстве.
Обновление #2: Метод ниже больше не работает на последних выпусках WSL, которые установлены из Microsoft Store. Версия WSL из Store имеет известное ограничение, не позволяющее ей запускаться из удаленной SSH сессии. Оставляю ответ здесь на данный момент, но скоро обновлю его другим (менее оптимальным, к сожалению, решением).
Если вам просто нужен терминальный доступ к WSL с удаленного устройства, вот более простое решение:
- Установите OpenSSH сервер в Windows (инструкции).
- Доступ к вашему инстансу WSL удаленно используя
ssh -t windows_user@windows_host wsl
. Это просто подключение к Windows хосту, выделение псевдотерминала с помощью-t
и запуск командыwsl
с использованием этого псевдотерминала.
Если же вам нужен настоящий SSH доступ к инстансу WSL, то “обычный ответ” все еще довольно сложный. Смотрите этот комментарий на Github и поток, а также мой обзор ваших общих вариантов для переадресации портов здесь.
Это “в общем”, однако, для ssh
мы можем сделать это проще, используя ssh сервер как в хосте Windows, так и в инстансе WSL. Смотрите “короткую версию” этого в моем ответе здесь и (гораздо) больше деталей, если они вам нужны в этом ответе.
Ответ с “гораздо большими деталями” также включает в себя решение для удаленного запуска ssh сервера, так как он не будет автоматически запускаться при загрузке в WSL.
Для WSL вам нужно использовать правильный синтаксис:
sudo service ssh status
Это даст вам то, что вы ищете:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-05-22 19:54:00 JST; 3h 25min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 2129 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 2137 (sshd)
Tasks: 1 (limit: 9127)
Memory: 1.8M
CGroup: /system.slice/ssh.service
└─2137 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
5月 22 19:54:00 Carbon systemd[1]: Starting OpenBSD Secure Shell server...
5月 22 19:54:00 Carbon sshd[2137]: Server listening on 0.0.0.0 port 22.
5月 22 19:54:00 Carbon sshd[2137]: Server listening on :: port 22.
5月 22 19:54:00 Carbon systemd[1]: Started OpenBSD Secure Shell server.
Для начала установите OpenSSH-server в системе WSL, это можно сделать следующей командой:
sudo apt-get install openssh-server
Следующим шагом является включение и запуск SSH демона следующей строкой:
sudo systemctl enable ssh --now
И вам понадобится внутренний IP WSL, его можно увидеть по следующей строке:
ip addr | grep eth0
Все следующие команды должны выполняться в PowerShell:
1) для включения переадресации порта в хост-системе Windows
netsh interface portproxy add v4tov4 `
listenaddress=<windows_local_ip> `
listenport=<listen_port_on_windows> `
connectaddress=<wsl_internal_ip> `
connectport=<ssh_service_port>
2) для добавления правила Брандмауэра, позволяющего доступ к порту хост-системы
netsh advfirewall firewall add rule `
name="wsl_sshd" `
dir=in `
action=allow `
protocol=TCP `
localport=<listen_port_on_windows>
Вот и все, вы можете подключиться к вашему SSH серверу WSL, используя командную строку, как
ssh <wsl_username>@<windows_ip> -p <listen_port_on_windows>
P.S. В Windows 11 возникают некоторые проблемы с переадресацией портов, и вам нужно будет перезапускать службу “IP Helper” после каждого перезагрузки операционной системы Windows.
Вы должны включить dbus
, это больше похоже на переадресацию портов
#включить dbus
sudo systemctl enable dbus
sudo /etc/init.d/dbus start
если результат такой же, как на изображении ниже, то не волнуйтесь, это не проблема
а затем
sudo service ssh restart
.
Ответ или решение
Чтобы включить SSH на системе Ubuntu, работающей под WSL2, необходимо учитывать несколько важных моментов. WSL (Windows Subsystem for Linux) позволяет запускать Linux-дистрибутивы внутри Windows, однако из-за архитектурных особенностей эта среда ведет себя несколько иначе, чем стандартные Linux-системы. В частности, WSL2 использует облегченный механизм инициализации вместо полноценной системы инициации, такой как systemd. Это может вызвать сложности при попытках управлять службами стандартными командами systemd.
Теоретическая часть
Проблема отсутствия systemd:
В WSL2 отсутствует поддержка systemd в более ранних версиях, что означает невозможность воспользоваться командами systemctl
для управления службами. Вместо этого применяются более старые службы управления, такие как service
.
SSH в виртуальной среде:
SSH — это протокол удаленного управления, дающий возможность безопасного подключения к удалённой машине. В контексте WSL2 этот доступ обеспечивается через виртуальную сеть, что требует дополнительных настроек для внешнего доступа.
Пример решения и его применение
Настройка SSH в WSL2:
-
Установка OpenSSH-сервера в WSL2:
sudo apt-get update sudo apt-get install openssh-server
-
Запуск и проверка статуса SSH-сервиса:
Поскольку стандартные командыsystemctl
могут работать некорректно, используемservice
:sudo service ssh start sudo service ssh status
-
Подключение из Windows:
WSL2 создает виртуальную сеть с IP-адресом, который вы можете обнаружить командой:ip addr | grep eth0
Далее, для использования SSH к WSL2 через Windows, можно настроить перенаправление портов.
Пример перенаправления портов в Windows:
-
Конфигурация Port Proxy:
Откройте PowerShell от имени администратора и выполните следующую команду:netsh interface portproxy add v4tov4 listenaddress=<windows_local_ip> listenport=<listen_port_on_windows> connectaddress=<wsl_internal_ip> connectport=22
-
Настройка брандмауэра для открытия порта:
netsh advfirewall firewall add rule name="WSL SSH" dir=in action=allow protocol=TCP localport=<listen_port_on_windows>
-
Подключение к SSH из PowerShell или сторонних SSH-клиентов:
ssh <wsl_username>@<windows_ip> -p <listen_port_on_windows>
Учтите:
При использовании Windows 11 могут возникать проблемы с проксированием портов. В таком случае может потребоваться перезапуск службы "IP Helper" после каждого перезагрузки для сохранения настроек.
Заключение
Настройка SSH-сервера на WSL2 может требовать нескольких дополнительных шагов из-за отсутствия нативной поддержки systemd и специфики работы с виртуальными сетями. Тем не менее, используя описанные методы, вы сможете эффективно настроить и управлять SSH, что позволит вам безопасно подключаться к вашему WSL2-окружению как из Windows, так и из других машин внутри одной сети.
Потенциальное включение systemd в последних версиях WSL2 делает процесс более унифицированным и простым, но требует тщательной настройки и проверки всех шагов для обеспечения стабильной работы всех служб.