LINUX.ORG.RU

Графический планшет в UBUNTU. Автозагрузка драйвера

 ,


0

1

Привет всем.

Используется KUBUNTU 18.10 64bit.

Есть графический планшет. Для использования планшета нужно запустить драйвер планшета через SUDO. Лезть в терминал для запуска драйверов каждый раз не удобно.

Идея в том, что бы драйвер планшета загружался автоматически при запуске системы (или сеанса пользователя). И работал в фоновом режиме, поскольку сам драйвер запускается в графической оболочке, где можно менять параметры поведения пера. Почитав Гугл, понял, что реализовать данное действие правильнее через systemd.

На данный момент:

Создал юнит:

sudo nano /etc/systemd/system/xppen.service

Содержание юнита:

[Unit]
Description=XPPen Image Creative
After=network.target #Этот параметр взят из примера. Чем заменить не знаю. Оставил как есть. Хуже не будет.

[Service]

ExecStart=/bin/bash /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Type=forking

[Install]
WantedBy=multi-user.target
Alias=xppen.service

Затем:

systemctl daemon-reload

В итоге перезагружаемся и... ничего не работает.

Ввожу:

systemctl status xppen.service
показывает это:

● xppen.service - XPPen Image Creative
   Loaded: loaded (/etc/systemd/system/xppen.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2019-11-28 18:04:18 MSK; 23s ago
  Process: 20081 ExecStart=/bin/bash /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh (code=exited, status=1/FAILURE)

ноя 28 18:04:18 Family systemd[1]: Starting XPPen Image Creative...
ноя 28 18:04:18 Family bash[20081]: QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
ноя 28 18:04:18 Family bash[20081]: qt.qpa.screen: QXcbConnection: Could not connect to display
ноя 28 18:04:18 Family bash[20081]: Could not connect to any X display.
ноя 28 18:04:18 Family systemd[1]: xppen.service: Control process exited, code=exited status=1
ноя 28 18:04:18 Family systemd[1]: xppen.service: Failed with result 'exit-code'.
ноя 28 18:04:18 Family systemd[1]: Failed to start XPPen Image Creative.

Сам драйвер запускается через скрипт Sh, который шел в комплекте. Вот содержание скрипта:

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname/lib
export LD_LIBRARY_PATH
$dirname/$appname "$@"

Буду признателен, если направите, куда копать. Может это реализуется вообще по другому принципу?

Что-то я в ваших действиях не увидел этого:

И работал в фоновом режиме, поскольку сам драйвер запускается в графической оболочке, где можно менять параметры поведения пера.

Вы просто пытаетесь запустить драйвер, а он пытается найти запущенные X-ы, которых в этот момент времени ещё нет:

Could not connect to any X display.

Вроде же у KDE есть автостарт, почему его не засунуть туда?

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

Автостарт пробовал. При загрузке системы появляется диалоговое окно, где драйвер говорит, что он работать не будет. Тоже самое происходит если я запускаю скрипт без sudo. Т.е автостарт запускает без прав root получается.

aleksey183 ()

Как уже сказали, глобальный экземпляр systemd не подходит для запуска графических приложений в сессии пользователя, потому что он ничего не знает про время жизни этой сессии и X-сервера.

Тебе нужен systemd --user или автостарт твоего DE. Права выдай через sudo и sudoers, но я бы очень сильно подумал, зачем этому говнокоду нужен root и можно ли без этого как-то обойтись.

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

В общем переместил я мой юнит. Теперь адрес выглядит так

/home/anna/.config/systemd/user/xppen.service
Сделал:
systemctl --user daemon-reload
Затем:
systemctl --user enable xppen.service
И затем:
systemctl --user start xppen.service

Он опять запускается без прав root. Драйвер выводит окно, что без root он работать не будет.

Если в юнит добавляю User=root

[Unit]
Description=XPPen Image Creative

[Service]
ExecStart=/bin/bash /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Type=forking
User=root

[Install]
WantedBy=multi-user.target
Alias=xppen.service

То опять ошибки:

● xppen.service - XPPen Image Creative
   Loaded: loaded (/home/anna/.config/systemd/user/xppen.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2019-11-29 01:06:30 MSK; 54s ago
  Process: 10247 ExecStart=/bin/bash /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh (code=exited, status=216/GROUP)

ноя 29 01:06:30 Family systemd[2616]: Starting XPPen Image Creative...
ноя 29 01:06:30 Family systemd[10247]: xppen.service: Failed to connect stdout to the journal socket, ignoring: Operation not permitted
ноя 29 01:06:30 Family systemd[10247]: xppen.service: Changing group credentials failed: Operation not permitted
ноя 29 01:06:30 Family systemd[10247]: xppen.service: Failed at step GROUP spawning /bin/bash: Operation not permitted
ноя 29 01:06:30 Family systemd[2616]: xppen.service: Control process exited, code=exited status=216
ноя 29 01:06:30 Family systemd[2616]: xppen.service: Failed with result 'exit-code'.
ноя 29 01:06:30 Family systemd[2616]: Failed to start XPPen Image Creative.
Насколько я понимаю нельзя в systemd --user менять пользователя. Т.е. получается нельзя что-ли в этом случае запускать устройства с root?

Права выдай через sudo и sudoers

Куда что нужно дописать?

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

Насколько я понимаю нельзя в systemd –user менять пользователя.

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

Куда что нужно дописать?

В /etc/sudoers право твоему пользователю запускать этот скрипт от рута без пароля, и sudo в юнит.

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

У вас в Kubuntu sudo запрашивает пароль, если вы через него запускаете этот Pentablet_Driver.sh? Если нет, то прописывайте в автостарт именно такую строку, что вводите в терминале (вместе с sudo), или делайте однострочный sh-скрип, в котором будет такое:

#!/bin/sh
sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Файлу со скриптом давайте права на исполнение (chmod a+x), и его засовывайте в автостарт.

Если sudo запрашивает пароль, то редактируйте файл /etc/sudoers, прописывайте NOPASSWD для этого скрипта, как-то так:

ALL ALL=(ALL) NOPASSWD: /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh

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

intelfx и mky спасибо за ответы. Сам не разобрался бы.

sudo запрашивает пароль, если вы через него запускаете этот Pentablet_Driver.sh?

Да, если я запускал через терминал:

sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh

Пароль запрашивал.

Продолжаю...

Через

sudo visudo

изменил sudoers (Может что-то не так?) Он стал выглядеть так:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
anna ALL=(root) NOPASSWD: /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh

Далее я прописал sudo в юнит. После этого он опять не запускался. В итоге в юните

[Service]
ExecStart=/bin/bash sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh

Привел к такому виду:

[Service]
ExecStart=sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh

Теперь юнит выглядит теперь так:

[Unit]
Description=XPPen Image Creative

[Service]
ExecStart=sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Type=forking

[Install]
WantedBy=multi-user.target
Alias=xppen.service

И сейчас, если в терминале:

systemctl --user start xppen.service
то драйвер запускается успешно. Но если перезагрузить систему, то никакого автозапуска драйвера не происходит. В чем причина?

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

После перезагрузки делаю

systemctl --user status xppen.service
Выдает:
● xppen.service - XPPen Image Creative
   Loaded: loaded (/home/anna/.config/systemd/user/xppen.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
Т.е. ошибок нет. Юнит просто не стартует.

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

Вобще не люблю systemd и могу ошибаться, но это неправильно:

WantedBy=multi-user.target

По идее вам нужно что-то наподобие:

[Unit]
Description=XPPen Image Creative
PartOf=graphical-session.target

[Service]
ExecStart=sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Type=oneshot

[Install]
WantedBy=graphical-session.target

Но я бы просто прописывал в автозапуск KDE. С systemd это сложный танец, сначала на старт пользовательской сессии должен появиться процесс ″systemd --user″, потом из xinit скриптов ему должны быть переданы переменные среды DISPLAY и XAUTHORITY, потом он должен запустить ваш юнит. Если эта цепочка где-то нарушается, допустим, он вызвает ваш юнит до передачи ему DISPLAY, то ваш Pentablet_Driver.sh не отработает (на найдёт X-сессию).

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

Так включен же уже юнит. Нет?

● xppen.service - XPPen Image Creative
   Loaded: loaded (/home/anna/.config/systemd/user/xppen.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

sudo systemctl enable xppen.service

Эта команда, я полагаю, не корректна.

Правильнее в моем случае:

systemctl --user enable xppen.service
Но это выдает:
Failed to enable unit: File /home/anna/.config/systemd/user/xppen.service already exists

aleksey183 ()
Ответ на: комментарий от mky

Да, я понимаю, что через автозапуск проще. Но это в моем случае. Кто-то вероятно пользует не Kubuntu, а другую ось, а есть-ли авто запуск в других Линуксах, не знаю. По этому, коли уже столько прокопал, попробую добить и подытожить. Может кому еще пригодится.

Автозапуск попробую обязательно в любом случае.

aleksey183 ()
Ответ на: комментарий от mky

Попробовал через автозапуск.

Создал скрипт

/home/anna/Driver/Linux_Pentablet_V1.3.0.0/AutoStart.sh

Содержимое скрипта:

 
#!/bin/sh
sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh
Указал его в автозапуске.

При перезагрузке ничего не происходит. Если кликаю мышкой на этот скрипт, тоже ничего не происходит.

Если в терминале делаю:

/home/anna/Driver/Linux_Pentablet_V1.3.0.0/AutoStart.sh
тогда все работает. Драйвер запускается.

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

Права на исполнение скрипту поставили? Если поставили и не работает, сделайте запись вывода в файл и после загрузки смотрите, что пишет скрипт. Если ничего не пишет в /tmp/script.log, значит не запускается.

#!/bin/sh
date >> /tmp/script.log
sudo /home/anna/Driver/Linux_Pentablet_V1.3.0.0/Pentablet_Driver.sh >>  /tmp/script.log 2>&1

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

По этому, коли уже столько прокопал, попробую добить и подытожить.

Ну посмотрите вывод команды:

systemctl --user -t target
Может станет понятно, почему «Юнит просто не стартует».

а есть-ли авто запуск в других Линуксах, не знаю

А есть ли там ″systemd --user″, с поддержкой X-ов тоже вопрос.

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

Права на исполнение поставил.

Скрипт изменил. /tmp/script.log даже не появляется после перезагрузки.

Если запускаю скрипт вручную через терминал, тогда лог-файл появляется.

aleksey183 ()
Ответ на: комментарий от mky

Вывод команды systemctl --user -t target

UNIT           LOAD   ACTIVE SUB    DESCRIPTION                                                                                                                                                                                                   
basic.target   loaded active active Basic System                                                                                                                                                                                                  
default.target loaded active active Default                                                                                                                                                                                                       
paths.target   loaded active active Paths                                                                                                                                                                                                         
sockets.target loaded active active Sockets                                                                                                                                                                                                       
timers.target  loaded active active Timers                                                                                                                                                                                                        

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

5 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Может эти цели указать указать в юните xppen.service?

Что бы xppen.service стартовал, когда эти цели тоже запустятся?

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

Может эти цели указать указать в юните xppen.service?

Только эти цели и имеет смысл указывать, иначе ваш юнит не запустится. НО, скорее всего с этими целями ваш юнит (скрип) запустится слишком рано, до того, как X-сервер будет в рабочем состоянии. Не зря же добавили этот graphical-session.target. Я не знаю, почему этой цели у вас нет, вроде в 18.10 её уже добавили.

Вот здесь вот https://ubuntugeeks.com/questions/370070/writing-a-service-that-depends-on-xorg создают эту цель для предыдущей версии. Но делают это через Автозапуск, а если он у вас не работает для одного скрипта, то и для скрипта по ссылке не сработает. И в целом это переусложнение --- засовывать в Автозапуск скрипт, который активирует цель, по которой из юнита вызовется скрипт...

Вам нужно разбираться, почему не работает автозапуск. Что именно вы делали? Может у вас другая версия KDE. Может вам попробовать засунуть вызов скрипта в файл ″~/.xsession″.

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

Не зря же добавили этот graphical-session.target. Я не знаю, почему этой цели у вас нет, вроде в 18.10 её уже добавили.

Видимо всё-таки где-то я сломал свою ось. Предполагаю, что и причина, по которой не стартует автозапуск и systemd одна. Потому как очевидно, что оба решения рабочие, и в обоих случаях скрипт не запускается при запуске, но все работает при запущенном сеансе. Хотя в автозапуске я вижу, что умения там стоит Скайп и утилитка по контролю за температурой, которые исправно стартуют каждый раз. Но это уже выходит за рамки данного вопроса. Видимо придётся создавать новую тему.

aleksey183 ()
Ответ на: комментарий от mky

Ну вроде настроил я все это дело. Вы указали правильное направление.

Мои действия.

Если ввести:

systemctl --user list-unit-files --type=target

то будет видно, что нужная нам цель graphical-session.target уже есть в системе:

UNIT FILE                    STATE 
basic.target                 static
bluetooth.target             static
default.target               static
exit.target                  static
graphical-session-pre.target static
graphical-session.target     masked
paths.target                 static
printer.target               static
shutdown.target              static
smartcard.target             static
sockets.target               static
sound.target                 static
timers.target                static
но она masked. Т.е., как я понял - заблокирована.

Я попробовал:

systemctl unmask graphical-session.target

Но ответ был:

Unit graphical-session.target does not exist, proceeding anyway.

Я открыл этот юнит, но он оказался пустым. Т.е. вообще ни одного символа внутри нет. Где то вычитал, что graphical-session.target пока ни в каких Линуксах не работает так как задумывалось.

По поводу автозапуска. До этого я смотрел автозапуск, который располагается в

/home/anna/.config/autostart
и он не работал для меня. Хотя, как я сказал, там висит Cкайп и Psensor.

Но, в процессе дальнейшего копания, обнаружил

/etc/xdg/autostart/
Вот тут все работает очень хорошо. Единственное - там можно поместить только файл.desktop.

Таким образом я создал файл.desktop в нужной директории:

sudo nano /etc/xdg/autostart/xppen.desktop

Такого содержания:

[Desktop Entry]
Comment=Graphics tablet driver
Exec=systemctl --user start xppen.service
Name[ru_RU]=XPPen
Name=XPPen
StartupNotify=true
Terminal=false
Type=Application
X-KDE-SubstituteUID=false

В этом файле я указал созданный ранее юнит xppen.service. Но можно указать прямой путь к желаемому скрипту/программе. Юнит я указал по причине на перспективу - systemd дает больше возможностей. Может пригодится. И при перезагрузке или при начале сеанса автоматом запускается долгожданный драйвер.

Хотел, что бы он запускался в фоне. Но у меня ничего не получается. Эту проблему решил через модуль настройки «Особые параметры конкретных окон» или «Window Rules». Там создал правило для запускаемого окна и теперь при старте, окно программы (драйвера) запускается в режиме «Свернуто».

mky - спасибо за поддержку.

Позже может в этой теме напишу пошаговое руководство, для таких-же ламеров, как я.

aleksey183 ()