Создайте определение услуги.

Создайте определение услуги.

Я хочу, чтобы centos показывал tui (программу ncurses) после загрузки и без входа в систему. Я не хочу, чтобы отображалось приглашение на вход в систему.

Функции программы: Конфигурация сети, Перезагрузка, Выключение

Есть ли способ этого добиться?

решение1

Ответ M. Dickey по systemd немного расплывчат. Вот подробности по операционной системе systemd.

Служба, которая представляет приглашение на вход, является экземпляром шаблона [email protected], например, [email protected]для службы входа tty6. Чтобы заменить ее на свою собственную службу на таком терминальном устройстве, вам нужно сделать две вещи.

Создайте определение услуги.

Это довольно просто:

# /etc/systemd/system/[email protected]

[Единица]
Описание=Пользовательский интерфейс на %I
Документация=https://unix.stackexchange.com/a/318336/5132
Конфликты=getty@%I.service
До=getty.target

[Услуга]
ExecStart=/usr/local/sbin/мой-пользовательский-интерфейс
Стандартный ввод=tty
СтандартныйВывод=tty
Перезапуск=всегда
RestartSec=1
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=да
TTYVHangup=да
TTYVTDisallocate=да
SendSIGHUP=да

[Установить]
WantedBy=многопользовательский.целевой

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

Убедитесь, что ваша служба автоматически запускается при загрузке.

Это более сложная часть.

Для начала вам нужно решитькоторыйУстройство виртуального терминала ядра, на котором это будет работать. Здесь в игру вступают несколько фрагментов информации:

  • В мире Fedora с 2008 года графический пользовательский интерфейс использует первое виртуальное терминальное устройство ядра, tty1. Вам придется выбирать между неиспользованием этого виртуального терминального устройства и неиспользованием (или ручной настройкой) графического пользовательского интерфейса.
  • logind systemd пытается запускать службы входа по требованию на виртуальных терминалах ядра до максимального значения, установленного NAutoVTsв logind.confфайле конфигурации. Это tty1по tty6умолчанию.
  • Это оставляет tty7free в мире Fedora. Но в мире Debian, даже несмотря на то, что Debian теперь является операционной системой systemd, графический пользовательский интерфейс использует tty7. Вы можете рассмотреть возможность переноса в Debian.
  • Мир systemd пытается сделать виртуальный терминал ядра № 6 тем приглашением для входа в систему, которое «всегда есть», тем, для которого мышечная память заставляет вас нажимать Control+ Alt+ F6.

Допустим, вы выбираете tty5.

Вам нужно остановить logind от запуска по требованию [email protected], что является другим названием для [email protected], всякий раз, когда пользователь переключается на виртуальный терминал ядра № 5. Вы можете сделать это, уменьшив NAutoVTsзначение logind.confс 6 до (скажем) 4.

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

включить systemctl[email protected]

Альтернативы

Есть и другие способы сделать это.

нешаблонная услуга

Вместо того, чтобы [email protected]иметь my-terminal-ui.serviceи жестко закрепить имя терминального устройства в блоке, заменив %Iего на (например) tty5.

Я привел это в качестве шаблонного определения, поскольку это упрощает выбор, отличный от tty5.

используя один изautovt@ttyНвместо своего имени

Вы можете решить использовать в качестве имени определения вашей службы. Это переопределит инстанциацию шаблона ./etc/systemd/system/[email protected][email protected]

Преимущество такого подхода в том, что вам вообще не нужно беспокоиться о NAutoVTsвключении службы, и вы можете просто позволить logind запускать вашу службу по требованию всякий раз, когда пользователь переключается на виртуальный терминал ядра №5.

Недостатком является то, что механизм запуска по требованию был разработанне запускать процессы входа в системуна неиспользуемых виртуальных терминалах ядра. Таким образом, ваша служба не будет запущена при загрузке системы, а будет запущена только в первый раз, когда вы активируете виртуальный терминал ядра № 5. Этот запуск по требованию может быть не тем, что вам нужно. Другие части вашей пользовательской системы могут ожидать, что ваша служба будетуже работаетначиная с bootstrap и далее, например.

редактированиеgetty@ttyН

Люди, погруженные в способы /etc/ttysи /etc/inittabрассматривающие модификацию [email protected]как способ делать вещи. Они запускают команды типа

редактирование systemctl[email protected]

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

[Услуга]
# Это пустое задание не является опечаткой.
ExecStart=
ExecStart=/usr/local/sbin/мой-пользовательский-интерфейс

Здесь есть несколько проблем.

Оказание услугикоторый называется Геттине запускать программу { a, min, f} getty— не очень удобная в обслуживании идея. Спустя годы, когда вы забудете, что вы здесь сделали, или когда кто-то другой придет, чтобы взять на себя администрирование такой системы, не будет очевидно, что службы "getty" не всегда запускают утилиту getty.

Не думайте о нем [email protected]как о пространстве длячто бы ни было запущено на этом терминале, который можно изменять по мере необходимости. Это не совсем то, как думает systemd. [email protected]запускает программу "getty". Служба, которая запускает совершенно другую программу, которая не запускает ничего похожего на службу "getty", должна быть отдельным определением службы.

Более того: Отдельное определение сервиса позволяет не определять сервис как что-либо похожее на сервис "getty". Приведенное выше определение сервиса копирует большую часть поведения сервиса "getty", включаяизо всех сил пытаетесь очистить свой экран(как того хочет от вас мир). Но вы, возможно, не захотите, скажем, возиться TTYReset=yesс такой utmpxслужбой, как ваша, которая на самом деле не является службой «входа» и, возможно, не захотите, чтобы ее экран очищался так агрессивно.

Более того: Отдельное определение службы проще изменить в будущем. Изменение с tty5(если это неудовлетворительно) на tty8просто с помощью приведенного выше шаблона. Просто создайте его на tty8вместо на tty5. Несколько сложнее отобрать набор локальных настроек из , [email protected]а затем переделать их для [email protected].

псевдоним autovt@tty5дляmy-terminal-ui@tty5

Это логическое продолжение редактирования [email protected], поскольку очевидно,autovt@ttyНпсевдонимы - этовсе, что должно начаться здесьмеханизм, который позволяет заменять другие вещиgetty@ttyН.

Но он страдает от тех же вышеупомянутых недостатков, что и использование [email protected]имени напрямую, поскольку он становится связанным с попытками logindне запускать службы входачто может быть не тем, что вы хотите. Это на самом делечто бы ни было предназначено бытьтребовать-началось здесьпо логину.

дальнейшее чтение

решение2

Вы можете сделать это, заменив программу входа, используемую для gettyвашей собственной программой. Например, на моей машине Debian вызовы gettyнаходятся в /etc/inittab:

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

в то время как Debian на самом деле использует agetty:

NAME   
       agetty - alternative Linux getty


SYNOPSIS
       agetty  [-8chiLmnsUw]  [-a  user]  [-f  issue_file] [-H login_host] [-I
       init] [-l login_program] [-t timeout] port baud_rate,...  [term]

и который может вызвать другую программу, используя-lвариант:

   -l, --login-program login_program
          Invoke the specified login_program instead of /bin/login.   This
          allows the use of a non-standard login program (for example, one
          that asks for a dial-up password or that uses a different  pass‐
          word file).

Ваша специализированная программа может быть настроена на запуск на каждом "tty". Если вы это сделаете, вам следует уделить внимание тому, чтобы убедиться, что вы можете войти в машину напрямую для обслуживания. Это может быть однопользовательский режим или через ssh. Определения gettyне применимы к ssh.

С CentOS7, используя systemd, все организовано по-другому, но конечный результат тот же. Используя systemctl list-unit-files, соответствующая служба — [email protected]. Как и любую другую службу, ее можно настроить. Используя locateдля получения подсказок:

/etc/selinux/targeted/modules/active/modules/getty.pp
/etc/systemd/system/getty.target.wants
/etc/systemd/system/getty.target.wants/[email protected]
/usr/lib/systemd/system/console-getty.service
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/multi-user.target.wants/getty.target
/usr/lib/systemd/system-generators/systemd-getty-generator

Файлы в /usr/lib/systemd/system/содержат вызовы для agetty(у которого также есть страница руководства по CentOS). Вы можете изменить их:

ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM

Символическая ссылка /usr/lib/systemd/system/multi-user.target.wants/getty.targetи ее цель getty.targetне содержат вызовов agetty.

CentOS6 находится между: на моей машине есть mingettyи нет systemd. Из страницы руководства:

MINGETTY(8)                Linux Programmer's Manual               MINGETTY(8)


NAME   
       mingetty - minimal getty for consoles

SYNOPSIS
       mingetty  [--noclear] [--nonewline] [--noissue] [--nohangup] [--nohost-
       name]    [--long-hostname]     [--loginprog=/bin/login]     [--nice=10]
       [--delay=5]  [--chdir=/home]  [--chroot=/chroot] [--autologin username]
       [--loginpause] tty


DESCRIPTION
       mingetty is a minimal  getty  for  use  on  virtual  consoles.   Unlike
       agetty(8),  mingetty  is  not  suitable  for serial lines.  I recommend
       using mgetty(8) for this purpose.

Например agetty, его можно настроить:

   --loginprog /bin/login
          Change the login app.

Начнем с файла конфигурации:

# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.

stop on runlevel [S016]

respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX  - where X is console id'

Это заставляет нас искать информацию о том tty.override, что согласно этому

это скрипт, который вы предоставляете в /etc/init/tty.override(он показывает пример для автологина на tty1, из которого вы можете получить общее представление о том, что может делать скрипт). Переменная $TTY, кстати, установлена ​​в /etc/init/start-ttys.conf( initscriptsпакет, частью которого они являются, не имеет подробной документации).

решение3

Итак, после некоторого гугления я нашел два решения:

https://serverfault.com/questions/323289/replacing-tty-with-a-script-in-centos-6

и

https://www.centos.org/forums/viewtopic.php?t=2414

Наконец я придумал следующее:

1) Создайте файл «/etc/init/launch.conf» со следующим содержимым:

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup

В этом примере запускается инструмент настройки текстового режима.

2) Отредактируйте '/etc/init/start-ttys.conf', заменив tty на launch:

start on stopped rc RUNLEVEL=[2345]

env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
    . /etc/sysconfig/init
    for tty in $(echo $ACTIVE_CONSOLES) ; do
        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
        #initctl start tty TTY=$tty
        initctl start launch TTY=$tty
    done
end script

Не знаю, является ли это лучшим решением, но оно работает, и программа установки отображается после загрузки.

Связанный контент