创建服务定义。

创建服务定义。

我想让centos在启动后且无需登录的情况下显示tui(ncurses程序)。我不想显示登录提示。

程序功能:网络配置、重启、关机

有什么方法可以实现这一目标吗?

答案1

M. Dickey 的 systemd 答案有点模糊。以下是 systemd 操作系统的详细信息。

显示登录提示的服务是[email protected]模板的一个实例,例如[email protected]登录服务。tty6要在这样的终端设备上将其替换为您自己的服务,您需要做两件事。

创建服务定义。

这相当简单:

# /etc/systemd/系统/[电子邮件受保护]

[单元]
描述=%I 上的自定义用户界面
文档=https://unix.stackexchange.com/a/318336/5132
冲突=getty@%I.service
之前=getty.target

[服务]
ExecStart=/usr/local/sbin/my-custom-user-interface
标准输入=tty
标准输出=tty
重新启动=始终
重启秒=1
UtmpIdentifier=%I
TTYPath=/dev/%I
TTY重置=是
TTYV挂断=是
TTYVTDisallocate=是
发送SIGHUP=是

[安装]
WantedBy=多用户.target

这是一个模板服务单元,它将使用内核虚拟终端设备的名称作为其模板参数进行实例化。

确保您的服务在引导时自动启动。

这是更复杂的部分。

对于初学者来说,您需要决定哪个将在其上运行的内核虚拟终端设备。几条信息在这里发挥作用:

  • 在 Fedora 世界中,自 2008 年以来,图形用户界面使用第一个内核虚拟终端设备tty1.您必须选择不使用该虚拟终端设备和不使用(或手动调整)图形用户界面。
  • systemd 的 logind 尝试在内核虚拟终端上请求启动登录服务,最多可达配置文件NAutoVTs中设置的最大值logind.conf。这是tty1默认tty6的。
  • 这使得tty7Fedora 世界变得自由。但在 Debian 世界中,尽管 Debian 现在是一个 systemd 操作系统,但图形用户界面使用tty7.您可能需要考虑移植到 Debian。
  • systemd 世界试图使内核虚拟终端 #6 成为“始终存在”的登录提示符,肌肉记忆让您点击Control+ Alt+F6来获取该提示符。

假设您选择tty5.

每当用户切换到内核虚拟终端 #5 时,您都需要停止从按需启动 登录([email protected]这是 的另一个名称) 。您可以通过将设置从 6 降低到(比如说)4 来[email protected]实现此目的。NAutoVTslogind.conf

您需要确保您的服务在系统引导时自动启动,即“启用”:

系统控制启用[电子邮件受保护]

备择方案

还有其他方法可以做到这一点。

非模板化服务

而不是通过替换为(例如)来[email protected]my-terminal-ui.service终端设备名称硬连线到单元中。%Itty5

我将其作为模板定义,因为这样可以更轻松地做出与tty5.

使用其中之一autovt@tty而不是你自己的名字

您可以决定用作服务定义的名称。这将覆盖模板的实例化。/etc/systemd/system/[email protected][email protected]

这种方法的优点是,您根本不需要费心NAutoVTs启用该服务,并且只要用户切换到内核虚拟终端#5,就可以保持登录状态以按需启动您的服务。

缺点是设计了按需启动机制不运行登录进程在未使用的内核虚拟终端上。因此,您的服务不会在系统引导时运行,而只会在您第一次激活内核虚拟终端 #5 时运行。这种按需启动可能不是您想要的。您的定制系统的其他部分可能期望您的服务已经运行例如,从引导程序开始。

编辑一个getty@tty

人们沉迷于做事的方式,/etc/ttys并将/etc/inittab改变[email protected]视为做事的方式。他们运行这样的命令

系统控制编辑[电子邮件受保护]

并添加一个覆盖声明

[服务]
# 这个空白作业不是打印错误。
执行开始=
ExecStart=/usr/local/sbin/my-custom-user-interface

这有几个问题。

提供服务那叫盖蒂不运行 { a, min, f}getty程序并不是一个非常易于维护的想法。多年后,当您忘记自己在这里做了什么,或者当其他人接管这样一个系统的管理时,“getty”服务并不总是运行实用getty程序这一点并不明显。

不要将其视为[email protected]一个空间该终端上运行的任何内容,根据需要进行修改。这并不是真正的系统思考方式。 [email protected]运行一个“getty”程序。运行完全不同的程序且不运行类似“getty”服务的服务本身应该是一个单独的服务定义。

此外:单独的服务定义允许人们不将服务定义为类似“getty”服务的服务。上述服务定义复制了“getty”服务的大部分行为,包括努力清洁你的屏幕(正如世界希望你做的那样)。但是,您可能不希望TTYReset=yes继续utmpx使用像您这样的服务,这实际上不是“登录”服务,并且可能不希望如此积极地清除其屏幕。

此外:单独的服务定义将来更容易更改。使用上述模板,从tty5(如果不满意)更改为tty8很简单。只需实例化它 ontty8而不是 on tty5。从 中取消一组本地自定义[email protected]然后重新制作它们会有些困难[email protected]

别名autovt@tty5my-terminal-ui@tty5

这是从编辑开始的逻辑进展[email protected],显然autovt@tty别名是无论要从这里开始允许用其他东西替代的机制getty@tty

但它也有与[email protected]直接使用名称相同的上述缺点,因为它涉及登录的尝试不启动登录服务这可能不是你想要的。它实际上是无论是什么意思要求-从这里开始通过登录

进一步阅读

答案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

我不知道这是否是最好的解决方案,但它正在工作并且启动后会显示安装程序。

相关内容