LINUX.ORG.RU

Косяк с запуском VNC через юнит

 ,


0

3

Не помогли мне прошлый раз www.linux.org.ru/forum/general/12736484 Задам снова вопрос на другой лад.
Нужно, чтобы запускался vnc-сервер x11vnc сразу после запуска lightdm, чтобы можно было логиниться по VNC либо просто подключаться к «рабочему столу» удалённо. Создал юнит /etc/systemd/system/x11vnc.service

[Unit]
Description=VNC-server x11vnc
After=lightdm.service

[Service]
Type=forking
ExecStart=/usr/bin/x11vnc -display :0 -rfbport 5900 -q

[Install]
WantedBy=graphical.target
И не работает. В journalctl пишет:
июл 20 15:33:18 adm-station x11vnc[566]: *** x11vnc was unable to open the X DISPLAY: ":0", it cannot continue.
Как будто x11vnc запускается раньше иксов. Что я сделал не так, я вроде After=lightdm.service указал?
Просто из командной строки при работающих иксах x11vnc запускается нормально

Просто из командной строки при работающих иксах x11vnc запускается нормально

а ты запусти его при работающем lightdm, когда еще никто не залогинился, увидишь что будет

anonymous ()

Буквы dm в lightdm обозначают Display Manager. Фраза «unable to open the X DISPLAY» означает, что ни одного Display ещё не создано. Создаёт Display ихний Manager. Ещё что-то непонятное осталось?

redgremlin ★★★★★ ()
Ответ на: комментарий от redgremlin

Буквы dm в lightdm обозначают Display Manager. Фраза «unable to open the X DISPLAY» означает, что ни одного Display ещё не создано. Создаёт Display ихний Manager. Ещё что-то непонятное осталось?

Э...
Иксы запускаются командой

xinit [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]
Команда эта запускается после активации юнита lightdm.service, хотя я в этом не уверен.
В качестве server - Xorg.
В качестве client - некий скрипт, запускающий lightdm, в этот момент на экране появляется окно логина.
Если запущен Xorg - значит Display создан.
Ну это по логике, хотя я могу заблуждаться.

Создаёт Display ихний Manager

Да, видимо заблуждаюсь. Но ведь все dm нужны для того, чтобы юзеру можно было логиниться в иксах?

Ещё что-то непонятное осталось?

Непонятно, что нужно поменять в юните, чтобы желаемое заработало

sunny1983 ★★★★ ()
Ответ на: комментарий от sunny1983

Иксы запускаются командой

Не только.

Команда эта запускается после активации юнита lightdm.service, хотя я в этом не уверен.

Не уверен — не обгоняй. Это не так. Между запуском lightdm и запуском первого X-сервера может пройти потенциально неограниченное количество времени.

Более того, тот X-сервер, который рисует greeter (окно приветствия и входа в систему), и тот X-сервер, в котором запускается пользовательское DE — две разные вещи, и номера дисплеев у них тоже будут разные.

Поэтому твой юнит вообще всё делает не так. Указывать After=lightdm.service бессмысленно. Указывать -display :0 — это хардкод. Вообще говоря, из systemd нет возможности подождать запуска пользовательского X-сервера, это разные сущности.

Тебе нужно запустить x11vnc из своего ~/.xinitrc (и удостовериться, что скрипт Xsession твоего DM читает и выполняет ~/.xinitrc).

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Более того, тот X-сервер, который рисует greeter (окно приветствия и входа в систему), и тот X-сервер, в котором запускается пользовательское DE — две разные вещи, и номера дисплеев у них тоже будут разные.

То есть один X-сервер завершается, другой - запускается? Почему тогда экран не моргает?

Тебе нужно запустить x11vnc из своего ~/.xinitrc

~/.xinitrc выполняется после логина? То есть задачу логина по VNC это не решает.

sunny1983 ★★★★ ()
# /lib/systemd/system/x11vnc.service
[Unit]
Description="x11vnc"
Requires=display-manager.service
After=display-manager.service

[Service]
ExecStart=/usr/bin/x11vnc -xkb -noxrecord -noxfixes -noxdamage -auth guess  -dis
ExecStop=/usr/bin/killall x11vnc

[Install]
WantedBy=multi-user.target

вот мой

CHIPOK ★★★ ()
Ответ на: комментарий от CHIPOK

Этот вариант тоже не работает. Содержимое лога потом пришлю.
и я так и не понял как именно стартуют иксы из lightdm, куда нужно лезть чтобы исследовать данный процесс, и как решать исходную задачу с запуском VNC до логина.

sunny1983 ★★★★ ()
Ответ на: комментарий от superuser

Для Debian 9.1 & systemd остановился на таком варианте:

$ cat /lib/systemd/system/x11vnc.service

[Unit]
Description=VNC remote access
Requires=display-manager.service
After=display-manager.service

[Service]
ExecStart=/usr/bin/x11vnc -xkb -auth guess -noxrecord -noxfixes -shared -noxdamage -rfbauth /etc/x11vnc.pass -forever -loop -rfbport 5900 -o /var/log/x11vnc.log
ExecStop=/usr/bin/killall x11vnc

[Install]
WantedBy=multi-user.target

superuser ★★ ()
Ответ на: комментарий от sunny1983

не пойму почему тогда у меня стабильно работает если display-manager.service у меня нет:

# systemctl status x11vnc.service
● x11vnc.service - VNC remote access
   Loaded: loaded (/lib/systemd/system/x11vnc.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-11-03 01:00:23 MSK; 8min ago
 Main PID: 1549 (x11vnc)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/x11vnc.service
           ├─1549 /usr/bin/x11vnc -xkb -auth guess -noxrecord -noxfixes -shared -noxdamage -rfbauth /etc/x11vnc.pass 
           └─1550 /usr/bin/x11vnc -xkb -auth guess -noxrecord -noxfixes -shared -noxdamage -rfbauth /etc/x11vnc.pass 

ноя 03 01:00:23 vde systemd[1]: Started VNC remote access.
ноя 03 01:00:23 vde x11vnc[1549]:  --- x11vnc loop: 1 ---
ноя 03 01:00:24 vde x11vnc[1549]:  --- x11vnc loop: waiting for: 1550
ноя 03 01:00:28 vde x11vnc[1549]: PORT=5900
lines 1-13/13 (END)

superuser ★★ ()
Ответ на: комментарий от sunny1983

Нужно, чтобы запускался vnc-сервер x11vnc сразу после запуска lightdm

До меня только сейчас дошло, что без lightdm этот юнит работать не будет

ну здрасте

а через startx

тогда стартуй x11vnc через конфиги там какие-то или вручную

superuser ★★ ()
Ответ на: комментарий от sunny1983

Создавай уже 3-ю тему типа " Универсальный запуск x11vnc с возможностью доступа к DM при его наличии " или "... безотносительно наличия DM ...". Тоже стало интересно.

superuser ★★ ()
Последнее исправление: superuser (всего исправлений: 2)

Мой вариант (применяется мной на практике в связке с lightdm и light-locker)

/etc/systemd/system/x11vnc@.service

[Unit]
Description=VNC Server for X11
Requires=graphical.target
After=graphical.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display WAIT:%i -auth /var/run/lightdm/root/:%i -norc -forever -shared -rfbauth /etc/x11vnc.pass -autoport 5900 -o /var/log/x11vnc-display-%i.log
SuccessExitStatus=2
RestartPreventExitStatus=2
Restart=always

[Install]
WantedBy=graphical.target


[Unit]
Description=X11VNC displays autodetect for light-locker
Requires=graphical.target
After=graphical.target

[Service]
Type=simple
ExecStart=/usr/local/bin/x11vnc-light-locker
Restart=always

[Install]
WantedBy=graphical.target


/usr/local/bin/x11vnc-light-locker
#!/bin/bash

while inotifywait -qq -e modify /sys/class/tty/tty0/active; do
	CURRENTDISPLAY=$(ps -fC Xorg | grep vt$(sed 's/tty//g' /sys/class/tty/tty0/active) | sed -e 's/\(^\)\(.*\)\/run\/lightdm\/root\/\:\s*\(.*\)/\1\3/; s/ .*//')
	/bin/systemctl stop x11vnc@*
	if [[ $CURRENTDISPLAY ]]; then
		/bin/systemctl start x11vnc@$CURRENTDISPLAY
	fi
done


Применять так:
systemctl enable x11vnc@0 --now
systemctl enable x11vnc-light-locker --now

Основной дисплей может быть не 0, но на арче, дебиане и убунту - 0.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от superuser

Как работает эта (@) штука ? Как передача параметров? Где можно почитать на всемогучем?

Да, передача параметров.

Почему такая наркомания в systemd?

В чем наркомания? В классическом sysvinit тоже есть передача параметров.

Где можно почитать на всемогучем?

Вся нормальная документация написана на языке вероятного противника, потому что это их технологии. Что ты делает в ИТ, если не знаешь языка?

pekmop1024 ★★★★★ ()
Ответ на: комментарий от superuser

ну конечно :) и колесо они изобрели и проприетарасты херовы

О, господа!
тут человек утверждает, что Эндрю Таненбаум, Линус Торвальдс и Леннарт Поттеринг - русские православные программисты, но тщательно скрывают это от нас, потому что боятся жЫдорептилоидов!

pekmop1024 ★★★★★ ()
Ответ на: комментарий от superuser

А если серьезно, я использовал в качестве документации первые попавшиеся юниты, маны по системд и доку, которую писал Леннарт. Все, естественно, на языке вероятного противника.

pekmop1024 ★★★★★ ()
Ответ на: комментарий от superuser

Я уже забыл чего хотел изначально, когда год назад тему создавал. А, вот что хотел, чтоб без боли подключаться к GUI удалённо как винде, или чтобы удалённо GUI запускать если он не запущен.

sunny1983 ★★★★ ()