
Я хочу, чтобы 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
умолчанию. - Это оставляет
tty7
free в мире 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не запускать службы входачто может быть не тем, что вы хотите. Это на самом делечто бы ни было предназначено бытьтребовать-началось здесьпо логину.
дальнейшее чтение
- https://unix.stackexchange.com/a/194218/5132
- https://unix.stackexchange.com/a/233855/5132
- https://unix.stackexchange.com/a/236959/5132
- https://unix.stackexchange.com/a/316279/5132
- Джонатан де Бойн Поллард (2015).
/etc/inittab
осталось в прошлом.. Часто задаваемые ответы.
решение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
Не знаю, является ли это лучшим решением, но оно работает, и программа установки отображается после загрузки.