Перейти к содержимому

Getty service что это

  • автор:

systemd: getty-подобный сервис для htop

htop — это интерактивная программа для наблюдения за процессами; она — альтернатива программы top. Каждый, кто работает за машиной с линуксом на борту, хоть раз использовал её: будь то поиск процесса (и его последующее убийство) или тщательный мониторинг используемых ресурсов.

Для удобства это программу можно держать всегда запущенной: в отдельном окне терминала, в его вкладках или на каком-нибудь рабочем столе. Но есть ещё одно решение: запускать его на фиксированном VT, на который можно в любой момент переключиться. Преимущество такого подхода заключается в чистом окружении и независимости от иксов/терминала.

Это возможно (и правильно) сделать с помощью системы инициализации, потому что мы фактичесски хотим получить специальный getty-подобный сервис для htop.

Как запускаются VT1, . VT6?

agetty — это такая программа, которая открывает порт tty, выдаёт prompt для аутентификации и передаёт последующее управление другой программе — login .

$ which agetty login | xargs ls -l -rwxr-xr-x 1 root root 44104 Sep 29 05:21 /usr/bin/agetty -rwxr-xr-x 1 root root 35968 Sep 29 05:21 /usr/bin/login

Традиционные системы инициализации Linux конфигурируются на запуск фиксированного количества agetty при загрузке. В большинстве случаев рождаются шесть инстансов для шести VT: от tty1 до tty6 соответственно. В systemd используется другой подход.

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

systemctl cat getty@.service покажет содержимое этого сервиса. Рассматривать подробно мы его не собираемся, поскольку это для нас не столь важно.

Соответственно, если предположить, что у нас есть некий htop@.service , то и добавить его в автозагрузку можно двумя путями: либо сделать симлинк под именем autovt@ttyN.service — тогда при переключении на выбранный VT htop будет запускаться вместо getty, либо отключить getty@ttyN.service и вместо него включить htop@ttyN.service — это даёт нам всегда запущенный htop на фиксированном VT.

Пишем собственный getty-подобный юнит

Теперь переходим в /etc/systemd/system — одна из директорий, где располагаются юниты, — и создаём собственный сервис:

$ "$EDITOR" htop@.service

Наличие суффикса ( @ ) означает, что стартует не сам по себе сервис, а один из его инстансов. А суффикс передаётся в него парамметром ( %i и %I ).

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

.include /usr/lib/systemd/system/getty@.service

Если учесть, что наш сервис getty-подобный, то эта конструкция избавляет нас от лишнего копирования кода.

Секция Unit

Здесь описываются общие парамметры, применимые к любому типу юнита.

[Unit] Description=htop on %I Documentation=man:htop(1)

Здесь всё прозрачно: директива Description задаёт краткое описание юнита, а Documentation путь к документации. %I — имя инстанса. Важно заметить, что обе переменные, задающие имя инстанса, различны по значению: %I — тоже самое, что и %i , но она не экранирует escape-последовательности.

Секция Service

Эта секция задаёт конфигурацию конкретно сервиса. Иными словами, описывает способ запуска процесса.

[Service] Environment= Environment=TERM=linux HOME=/root ExecStart= ExecStart=/usr/bin/htop StandardInput=tty-fail StandardOutput=tty

Необходимые унаследованные значения директив мы оставим в покое, а некоторые нам необходимо сбросить (задаём для них пустое значение) и определить самостоятельно. К таковым относятся Environment — задание переменных, и ExecStart , — собственно, запуск процесса.

StandardInput=tty-fail StandardOutput=tty

— это указание systemd запускать htop подсоединённым напрямую к терминалу.

Можно, кстати, добавить не мгновенный запуск, а с ожиданием ввода. Для этого создаём простой скрипт на баше:

#!/bin/bash echo "Press a key to launch $(basename "$1")" read exec "$@"

Всё что он делает — ожидает ввода и запускает какую-то программу (которой будет являться htop в нашем случае). Помещаем куда угодно, называем как угодно, делаем его исполняемым ( chmod +x ) и правим ExecStart в нашем сервисе:

ExecStart=/etc/systemd/scripts/run_wait /usr/bin/htop

Ограничиваем права

Если необходимо наложить какие-либо ограничения на права, то сделать это, конечно же, нужно. Для этого мы создадим ещё один сервис и ещё один скрипт, теперь — htop_secure@.service и run_wait_su . Их мы переконфигурируем так, чтобы htop запускался с правами конкретного пользователя и конкретной группы, а также требовал пароль администратора.

Итак, создаём новый сервис и новый скрипт на основе двух предыдущих:

$ cd /etc/systemd $ cp system/htop@.service system/htop_secure@.service $ cp scripts/run_wait scripts/run_wait_su

И редактируем каждый из них. Для сервиса в секции Service изменяем значение Environment и задаём имя пользователя с его группой:

User=kalterfive Group=users Environment=TERM=linux

А в скрипте обращаемся к su(1) :

#!/bin/bash echo "Press a key to launch $(basename "$1")" read exec su -c "$@"

Установка сервиса

Теперь наш сервис готов, осталось только добавить его в автозагрузку:

$ systemctl daemon-reload $ systemctl disable getty@tty2.service $ systemctl enable htop@tty2.service

Первая команда обновляет менеджер конфигурации systemd, а вторая создаёт симлинк на наш сервис в getty.target.wants .

Заключение

Теперь перезагружаемся (либо вручную убиваем getty@ и включаем htop@ для инстанса tty2), переключаемся на второй VT и наблюдаем успешно запущенный htop. Продемонстрированный трюк задевает лишь малую часть systemd, как системы инициализации, от всего простора его возможностей, как универсального plumbing layer-а — набора программ для решения совершенно разных задач. Успехов!

getty (Русский)

Состояние перевода: На этой странице представлен перевод статьи getty. Дата последней синхронизации: 14 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

getty — это общее название программы, которая управляет терминальной линией и подключенным к ней терминалом. Её цель — защитить систему от несанкционированного доступа. Как правило, каждый процесс getty запускается через systemd и управляет одной терминальной линией.

Установка

По умолчанию в Arch Linux используется agetty, который является частью пакета util-linux .

  • mingetty — Минимальный getty, позволяющий автоматически входить в систему.
  • fbgetty — Консольный getty, подобный mingetty, который поддерживает фреймбуфер.
  • mgetty — Универсальная программа для работы со всеми аспектами модема под Unix.

Добавление дополнительных виртуальных консолей

В файле /etc/systemd/logind.conf измените опцию NAutoVTs=6 на желаемое число виртуальных консолей, которые будут доступны после загрузки системы.

При необходимости можно временно запустить новую виртуальную консоль путём запуска службы getty@ttyN.service напрямую.

Автоматический вход в виртуальную консоль

Настройка ведётся через drop-in файлы systemd для переопределения параметров по умолчанию, передаваемых в agetty.

Настройки для виртуальных и последовательных (serial) консолей отличаются. Скорее всего вам нужно настроить автоматический вход в систему на виртуальной консоли (имя устройства которой ttyN , где N — число). Конфигурация автоматического входа для последовательных консолей будет немного отличаться. Имена устройств последовательных консолей выглядят как ttySN , где N — число.

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

Виртуальная консоль

Создайте drop-in файл для getty@tty1.service со следующим содержимым:

/etc/systemd/system/getty@tty1.service.d/autologin.conf
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin пользователь - $TERM
  • Опция Type=idle , присутствующая в стандартном getty@.service , задержит запуск службы до тех пор, пока не будут выполнены все задания (запросы на изменение состояния юнитов), чтобы не засорять приглашение к входу в систему загрузочными сообщениями. При автоматическом запуске X может оказаться полезным сразу запустить getty@tty1.service , добавив Type=simple в drop-in файл. И система инициализации, и startx могут быть заглушены, чтобы избежать перемешивания их сообщений во время загрузки.
  • Приведённый выше фрагмент приведет к тому, что тип сеанса loginctl будет установлен на tty . При желании (например, при автоматическом запуске X можно вручную установить тип сеанса wayland или x11 путём добавления Environment=XDG_SESSION_TYPE=x11 или Environment=XDG_SESSION_TYPE=wayland в этот файл.

Если вам не нужен автовход, но вы не хотите вводить своё имя пользователя, смотрите #Запрос только пароля для пользователя по умолчанию.

Если вам нужен tty отличный от tty1, смотрите systemd FAQ.

Последовательная консоль

/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -f -- \\u' --keep-baud --autologin пользователь 115200,57600,38400,9600 - $TERM

Консоль nspawn

Для настройки автовхода в контейнере systemd-nspawn создайте следующий drop-in файл:

/etc/systemd/system/console-getty.service.d/autologin.conf
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --keep-baud --autologin пользователь - 115200,38400,9600 $TERM

Если для доступа к контейнеру используется метод machinectl login мой-контейнер , также настройте шаблон container-getty@.service , который управляет pts/[0-9] :

/etc/systemd/system/container-getty@.service.d/autologin.conf
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --keep-baud --autologin пользователь - 115200,38400,9600 $TERM

Запрос только пароля для пользователя по умолчанию

Getty можно использовать для входа в систему с виртуальной консоли с пользователем по умолчанию, вводя пароль, но без необходимости вводить имя пользователя. Например, чтобы запросить пароль пользователя пользователь на tty1 :

/etc/systemd/system/getty@tty1.service.d/skip-username.conf
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -- пользователь' --noclear --skip-login - $TERM

Отображение загрузочных сообщений на tty1

По умолчанию в Arch включена служба getty@tty1 . В файле службы уже прописан параметр —noclear , который не позволяет agetty очищать экран. Однако systemd очищает экран перед его запуском. Чтобы отключить это поведение, создайте следующий drop-in файл:

/etc/systemd/system/getty@tty1.service.d/noclear.conf
[Service] TTYVTDisallocate=no
  • Удалите quiet из параметров ядра.
  • Поздний запуск KMS может привести к стиранию первых нескольких сообщений. Смотрите Kernel mode setting (Русский)#Ранний запуск KMS или Kernel mode setting (Русский)#Отключение modesetting.

Смотрите также

  • systemd (Русский)#Изменение цели загрузки по умолчанию
  • The TTY demystified
  • tty — Википедия

Не работает автовход в сессию X без дисплейного менеджера в Debian 9

Вхожу в сессию иксов — в файле ~/.bashrc , в конце добавил:

if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then exec startx fi

Ввожу логин-пароль, все нормально. Решил использовать автовход. Сделал как написано в арчвики:

systemctl edit getty@tty1
[Service] ExecStart= ExecStart=-/usr/bin/agetty --autologin user --noclear %I $TERM 

Сохранилось это все в /etc/systemd/system/getty@tty1.service.d/override.conf .

После загрузки черный экран с мигающим курсором.

С другой виртуальной консоли:

user@a-one:~# sudo systemctl status getty@tty1.service . ● getty@tty1.service - Getty on tty1 Loaded: loaded (/lib/systemd/system/getty@.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/getty@tty1.service.d └─override.conf Active: failed (Result: start-limit-hit) since Wed 2017-02-22 22:28:54 MSK; 1min 29s ago Docs: man:agetty(8) man:systemd-getty-generator(8) http://0pointer.de/blog/projects/serial-console.html Main PID: 559 (code=exited, status=203/EXEC) Feb 22 22:28:54 a-one systemd[1]: getty@tty1.service: Service has no hold-off time, scheduling re Feb 22 22:28:54 a-one systemd[1]: Stopped Getty on tty1. Feb 22 22:28:54 a-one systemd[1]: getty@tty1.service: Start request repeated too quickly. Feb 22 22:28:54 a-one systemd[1]: Failed to start Getty on tty1. Feb 22 22:28:54 a-one systemd[1]: getty@tty1.service: Unit entered failed state. Feb 22 22:28:54 a-one systemd[1]: getty@tty1.service: Failed with result 'start-limit-hit'.
user@a-one:~# systemctl --version systemd 232 +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

Подскажите, кто знает, как решить проблему. Заранее всем спасибо!

[решено] Автозапуск псевдо-графического приложения на tty1 без логина

Никак не могу сформулировать по-англицки и загуглить: как сделать автозапуск программы или скрипта на месте tty1? Ну, чтобы там в runlevel3 не логин просило, а сразу запускалась программа с псевдо-графическом интерфейсом (например, lynx). Что-то вроде киоска, только без иксов и желательно чтоб несколько программ запускать так же на tty2, tty3.

UPD
Для openSUSE 12.2 (которая игнорит /etc/inittab) сделал следующий костыль (по мотивам странной доки https://ru.opensuse.org/SDB:Systemd).

ExecStart=-/sbin/mingetty —autologin kioskuser %I

А юзеру kioskuser в ~/.bashrc вписать нужную команду, например, mc

Таким образом после загрузки системы в init 3 на tty1 запустится Midnight Commander. Аналогично можно настроить автологин и запуск скрипта на tty2. Единственная странность пока — от момента автологина до запуска mc проходит где-то 13 секунд. Не знаю, с чем связана задержка, разбираться дальше не стал, потому что описанный костыль вполне устраивает. Всем спасибо!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *