LINUX.ORG.RU

RFC HOWTO: автологин в иксовую сессию с помощью systemd

 , ,


16

1

Добрый вечер, господа. Это тред-howto о том, как сделать корректный автологин в иксы «на чистом systemd». В вики мне писать влом, да и никто её не читает, а тут и теги указать можно, и людей скастовать. Собственно, да: border-radius, ecko.

В чём вообще проблема? Проблема в том, что значительное количество людей делают это через банальнейшие костыли, настраивая автологин в текстовую консоль и запуская иксы из bashrc (или, чего хуже, из bash_profile). Это плохо по трём причинам:

  • не залогиниться в другую физическую консоль в текстовом режиме
  • оверхед на проделывание цепочки такого вида:
    systemd
    /bin/agetty
    /bin/login
    PAM
    /bin/bash
    ~/.bashrc
    /bin/startx
    
  • в конце концов, это само по себе костыль.

Я предлагаю написать getty-подобный юнит, который будет запускать иксы от фиксированного пользователя с фиксированным номером дисплея на произвольном VT. (Почему так много хардкода? Потому что systemd — не дисплейный менеджер.)

Это тоже неидеальное решение. Например, нафиг идёт мультисит и возникают гонки между запуском иксов и обнаружением видеоустройств. Но этими недостатками мы пренебрежём.

Параграф один. logind, autovt и getty-подобные юниты. Getty могут запускаться двумя способами.

  • Первый — по требованию, через logind. При переключении на ttyN logind запускает юнит autovt@ttyN.service, который засимлинкен на getty@.service. Эта логика работает для tty2-tty6.
  • Второй — статически. Юнит getty@tty1.service включен по умолчанию и втягивается через getty.target. Это даёт нам всегда запущенный getty на tty1.

Соответственно, допустим, у нас есть юнит xorg@.service, который запускает иксы на указанном VT.
Его нужно либо симлинкнуть под именем autovt@ttyN.service, переопределив шаблонный юнит (тогда при переключении на выбранный VT иксы будут запускаться вместо getty — первый способ), либо отключить getty@tty1.service и включить вместо него xorg@tty1.service (тогда мы вместо всегда запущенного getty будем иметь всегда запущенные иксы — второй способ).

Параграф два. Xorg вместо getty. Итак, имеем юнит для иксов, написанный по аналогии с getty@.service: /etc/systemd/system/xorg@.service.

User=<впишитеюзера>
PAMName=login

-- это аналог su.

Conflicts=getty@%i.service
After=getty@%i.service

-- это некоторая защита от одновременного запуска getty на том же терминале.

StandardOutput=tty
StandardInput=tty-fail

-- это указание systemd запускать иксы подсоединёнными напрямую к терминалу, а не к логгеру (нужно для того, чтобы иксы можно было запускать не от рута... ах да, работает только с 1.16 и выше).

ExecStart=/etc/systemd/scripts/startx -D :0

-- это мой велосипед вместо startx с нескучным синтаксисом и exec xinit в конце, что важнее.

Дело в том, что systemd из-за вероятного бага при остановке юнита отправляет SIGTERM/SIGKILL не всем процессам в дереве, начиная с startx, а только самому startx. А поскольку он написан на шелле, то он радостно игнорирует SIGTERM и ждёт завершения xinit, которому никакого сигнала не приходит. Следовательно, проблему решаем переписыванием startx так, чтобы он в конце не запускал xinit подпроцессом, а делал exec xinit, заменяя им собственный процесс. Тогда сигнал приходит xinit'у, а он его корректно ловит и убивает иксы.

Всё остальное скопипащено из getty@.service.

Да, дисплей захардкожен в :0. Пара слов о назначении VT: процесс startx получает номер VT в переменной $XDG_VTNR (её устанавливает pam_systemd), а из startx запускается /etc/X11/xinit/xserverrc, который об этой переменной знает и передаёт X-серверу параметр vt$XDG_VTNR.

Параграф три. Запускаем. Итак, помещаем юнит в /etc/systemd/system/xorg@.service, startx в /etc/systemd/scripts/startx (можно куда угодно) и делаем:

systemctl daemon-reload
systemctl disable getty@tty1
systemctl enable xorg@tty1

После этого можно ребутиться и надеяться, что запустится. Ах да, дисплейный менеджер тоже стоит отключить, потому что он запустит свой X-сервер и произойдёт адъ и израиль.

Как-то так. Сейчас три часа семнадцать минут по московскому времени, поэтому прошу меня извинить за упрт стиль изложения, краткость, неконсистентное использование форматирования и так далее.

★★★★★

Последнее исправление: intelfx (всего исправлений: 4)

Побольше бы таких изящных решений на базе systemd самого разного толка.

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

В systemd есть встроенные средства совместимости с sysvinit (генератор юнитов по сервисам sysvinit).

А ман у него есть? Как мне узнать, что он присутствует в моём гентушном системде?

Deleted
()
Ответ на: комментарий от dexpl
 $ stat /lib/systemd/system-generators/systemd-sysv-generator
stat: не удалось выполнить stat для «/lib/systemd/system-generators/systemd-sysv-generator»: Нет такого файла или каталога

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

Вывод — либо в генту генераторы лежат в другом каталоге (что является маловероятной, КМК, спецификой генту), либо они отсутствуют вовсе.

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

Да, считаю. В стартовом посте написано, почему.

«Традиционный» метод:

systemd
/bin/agetty
/bin/login
PAM
/bin/bash
~/.bashrc
/bin/startx
/bin/xinit

Мой метод (плюс замечания от mtk):

systemd
PAM
/bin/xinit

Написать один юнит (точнее, не написать, а скопипастить, заменив три строчки) я не считаю чем-то очень сложным.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от dexpl
$ equery b systemd-sysv-generator
 * Searching for systemd-sysv-generator ...
$ 

Значит нет, или отключен при сборке.

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

Мана у этого генератора нет. Как узнать — dexpl написал. Как включить — ./configure --with-sysvinit-path=/etc/init.d --with-sysvrcnd-path=/etc.

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

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

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

изрядная часть этого howto описывает, как оно работает

Меньше знаешь - крепче спишь. Надо было в начале три команды написать. А остальное мелким шрифтом, чтобы особо впечатлительным в глаза не бросалось :)

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

Пути я написал наобум. Первое — это расположение init-скриптов, а второе — директория, в которой находятся rcN.d. Ты их поправь в соответствии с гентой.

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

У нас здесь всё-таки технический форум, а не первая четверть первого класса... Или я что-то пропустил? :)

intelfx ★★★★★
() автор топика

После этого можно ребутиться и надеяться, что запустится.

Я бы кстати добавила для упрощения жизни экспериментаторов, что вовсе не нужно ломать graphical.target отрезая себе путь к отступлению.

Гораздо правильнее, имхо, сделать отдельную цель для экспериментов и грузиться в graphical.target или в my-super-awesome-direct-to-X.target по необходимости.

alpha ★★★★★
()

Ув. intelfx, вот ты скажи, тебе как ярому продвигателю системд самому не стыдно от того что ты написал? я серьезно, ответь, пожалуйста, зачем нужны такие костыли? Не смотря на то, что ты агент поттеринга я очень уважаю тебя как человека - за сдержанность/воспитанность/целеустремленность. Уже сами по себе эти качества много чего значат, пусть и идут не в то русло с моей точки зрения. Поэтому постарайся ответить честно. Я не троллю и не шучу..

//offtopic:
когда мне нужен был автологин+startx без display manager-а я у себя в freebsd решил эту задачу за пару минут без постройки костылей стандартными средствами. При этом другие физ. консоли доступны, велосипедного оверхеда, о котором ты сказал тоже нет, как и костыльности.

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

когда мне нужен был автологин+startx без display manager-а я у себя в freebsd решил эту задачу за пару минут без постройки костылей стандартными средствами.

Там у вас во фряхе какие-то особенные стандартные средства, к линупсу не применимые? Или почему ты не приводишь описание сделанного тобой в качестве примера для подражания?

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

Отвечаю предельно честно и прямо: поскольку ты, судя по всему, не умеешь или не хочешь читать, я не считаю целесообразным что-либо тебе говорить по теме. Всё уже было сказано.

For reference, в четвёртый раз: RFC HOWTO: автологин в иксовую сессию с помощью systemd (комментарий) RFC HOWTO: автологин в иксовую сессию с помощью systemd (комментарий)

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

Да, ты права.

(Не подумал об этом, потому что при поломках всегда просто гружусь в rescue.target, и необходимости в отдельной экспериментальной цели не возникало.)

Правда, стартовый пост уже не исправишь.

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

For reference, в четвёртый раз:

Откуда у тебя столько терпения?

Чтобы два раза не вставать, 2all: народ, у вас в `which startx` тоже есть комментарий # Site administrators are STRONGLY urged to write nicer versions.? Это к вопросу о костылях.

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

я видел те посты, и кроме шапки темы прочитал еще и саму тему
Могу лишь процитировать уже отписавшегося:

Топик не читал, но грохот костылей за версту слыхать.

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

Будет неплохо, если ты укажешь на конкретную часть данного HOWTO, попадающую под определение костыля.

Сейчас от тебя слышны лишь пустые слова в стиле «сотрясание воздуха».

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

указываю:

Я предлагаю написать getty-подобный юнит...

и до конца шапки темы

А тот факт, что ты гору костылирования засовываешь в один пункт «systemd» говорит о синдроме журналиста, сравнивая после этого с «длинным» методом systemd-agetty-login-...-startx

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

И каким боком это костыль?

Офигеть, какая в голове у людей бывает каша... ЧСХ, они её заботливо охраняют и выращивают. «All I've said fell short of reaching open ears.»

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

Перечитай исходный пост. Я описал способ запустить иксы, не используя getty, DM или его заменитель. А Qingy — это квази-DM, не использующий иксы для отрисовки GUI.

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

А Qingy — это квази-DM, не использующий иксы для отрисовки GUI.

Сам придумал? qingy — просто замена getty, которая умеет в автологин.

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

Qingy is a replacement for Getty and login-managers like slim, kdm gdm and so on

Getty тоже умеет в автологин. Qingy отличается от getty тем, что GUI.

Хотя чем бы он ни был, он не подходит по постановке задачи.

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

Отлично он подходит. Он делает автологин и запускает иксы, причём именно на какой-то фиксированной физической консоли. Без всяких башекостылей.

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

Здесь башекостыли тоже не нужны (см. одно из уточнений от mtk). В итоге xinit запускается прямо из systemd, без промежуточных слоёв как таковых. А qingy — в любом случае промежуточный слой.

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

По мне так довольно странно одновременно использовать systemd и беспокоиться об одном дополнительном легковесном слое.

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

Ничего странного. systemd легче, чем совокупность sysvinit + sh/bash + coreutils (+ костыли типа start-stop-daemon).

Но это 1) уже много раз обсуждалось и 2) для данного треда оффтопик, поэтому давай не разводить здесь флейм.

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

sysvinit + sh/bash + coreutils (+ костыли типа start-stop-daemon)

Ну пошла поехала ложная трихотомия systemd-upstart-sysvinit (ну прямо как в http://uselessd.darknedgy.net/ProSystemdAntiSystemd/ написано, sysvinit: the eternal red herring).
Bash и coreutils — не образцы легковесности, они образцы большей раздутости и переусложнённости, чем, пожалуй, даже сам systemd.

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

Действительно. Мой аргумент некорректен, вот тебе другой: в дистрибутивах, в которых выбор пал на systemd — даром что глобально это не образец легковесности — всё равно может иметь смысл минимизировать оверхед в остальных частях системы. Т. е. «systemd + qingy > systemd».

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

I've took some time, чтобы в N+1-й раз написать развёрнутое сообщение на тему.

По определению, костыль — достижение цели не предназначенными для этого средствами, или же использование таких средств для обхода багов в используемом софте.

В написании «getty-подобного юнита», напрямую запускающего иксы, я не вижу ничего костыльного. Мы используем супервизор процессов, который присутствует в системе по условию задачи, и его штатную функциональность: запуск долгоживущих процессов.

Стоит отметить, что я не призываю никого ставить systemd специально для того, чтобы запускать иксы (вот это уже был бы костыль). Напротив: я описываю, как адекватнее всего их запускать, если systemd в системе уже есть.

Как уже было отмечено, костылём можно считать неиспользование дисплейного менеджера как таковое. С этим отчасти согласен, поскольку DM решает вопросы, связанные с хотплагом дисплейных адаптеров (нет никакой гарантии того, что видеоподсистема/KMS успеет проинициализироваться к моменту запуска иксов нашим методом). Но в данном случае неиспользование DM тоже является частью условия задачи, и данный недостаток отмечен в исходном сообщении.

Ещё костылём можно назвать мой startx-подобный велосипед, который (по сравнению с дефолтным) обеспечивает корректную обработку сигналов останова, но mtk заметил, что можно обойтись и без него. Да и штатный startx — тот ещё ужас (dexpl писал).

Других вещей, которые потенциально можно назвать костылями, в данном HOWTO нет.

говорит о синдроме журналиста, сравнивая

...а тот факт, что ты не можешь корректно согласовать сообщение, тоже о многом говорит...

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

что то не проходит этот юнит проверку: root@debss:/etc/systemd/system# systemctl status xorg.service ● rsyslog.service Loaded: error (Reason: Invalid argument) Active: failed (Result: exit-code) since Ср 2015-03-18 19:05:59 YEKT; 4h 32min left Main PID: 702 (code=exited, status=0/SUCCESS) мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:204] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:205] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:206] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:207] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:208] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:209] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:210] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:211] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: [/lib/systemd/system/rsyslog.service:213] Assignment outside of section. Ignoring. мар 18 14:32:02 debss systemd[1]: rsyslog.service lacks ExecStart setting. Refusing. root@debss:/etc/systemd/system#

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

И при чём тут rsyslog.service? О каком вообще юните ты говоришь? Судя по выводу, у тебя там вообще какой-то треш написан.

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

как быть?

такую вот бяку пишет при проверке сервиса root@debss:/etc/systemd/system# systemctl status xorg.service ● ssh.service - Xorg server on %I Loaded: loaded (/lib/systemd/system/ssh.service; enabled) Active: failed (Result: exit-code) since Чт 2015-04-16 21:12:04 YEKT; 4h 0min left Docs: man:Xorg(1) Main PID: 1308 (code=exited, status=1/FAILURE)

апр 16 21:11:46 debss su[1308]: + ??? root:stan апр 16 21:11:46 debss su[1308]: pam_unix(su:session): session opened for user stan by (uid=0) апр 16 21:12:04 debss systemd[1]: ssh.service: main process exited, code=exited, status=1/FAILURE апр 16 21:12:04 debss systemd[1]: Unit ssh.service entered failed state. апр 16 16:54:22 debss systemd[1]: [/lib/systemd/system/ssh.service:5] Failed to resolve unit specifiers on Xorg server on %I, ignoring: Operation not supported апр 16 16:54:22 debss systemd[1]: [/lib/systemd/system/ssh.service:24] Failed to resolve unit specifiers on /dev/%I, ignoring: Operation not supported апр 16 17:07:18 debss systemd[1]: [/lib/systemd/system/ssh.service:5] Failed to resolve unit specifiers on Xorg server on %I, ignoring: Operation not supported апр 16 17:07:18 debss systemd[1]: [/lib/systemd/system/ssh.service:24] Failed to resolve unit specifiers on /dev/%I, ignoring: Operation not supported апр 16 17:09:22 debss systemd[1]: [/lib/systemd/system/ssh.service:5] Failed to resolve unit specifiers on Xorg server on %I, ignoring: Operation not supported апр 16 17:09:22 debss systemd[1]: [/lib/systemd/system/ssh.service:24] Failed to resolve unit specifiers on /dev/%I, ignoring: Operation not supported

Warning: Unit file changed on disk, 'systemctl daemon-reload' recommended.

stason
()
Ответ на: как быть? от stason

Понятия не имею. Что за дистрибутив? Что ты вообще сделал, что у тебя ssh.service == xorg.service? Создай новую тему лучше.

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

да столько ужо заделал - стыдоба наверно сдамся и переставлю нафиг дебиан 8

stason
()
29 июня 2016 г.
Ответ на: комментарий от intelfx

Ваше решение просто волшебно. Огромное спасибо.

uhbif19
()

Выглядит неплохо. Только хотелось бы уже видеть окончательный вариант. Можно в той же вики.

А чем это лучше xlogin. По-моему,

# systemctl enable xlogin@<username>

лучше, чем хардкод юзера.

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

ответ на твой вопрос прямо в топике, во 2м абзаце написаны ответы ;)

у xlogin больше сервисных файлов и невнятные костыли вокруг dbus_session, а чём написано прямо в его readme

bass ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.