我想让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
的。 - 这使得
tty7
Fedora 世界变得自由。但在 Debian 世界中,尽管 Debian 现在是一个 systemd 操作系统,但图形用户界面使用tty7
.您可能需要考虑移植到 Debian。 - systemd 世界试图使内核虚拟终端 #6 成为“始终存在”的登录提示符,肌肉记忆让您点击Control+ Alt+F6来获取该提示符。
假设您选择tty5
.
每当用户切换到内核虚拟终端 #5 时,您都需要停止从按需启动 登录([email protected]
这是 的另一个名称) 。您可以通过将设置从 6 降低到(比如说)4 来[email protected]
实现此目的。NAutoVTs
logind.conf
您需要确保您的服务在系统引导时自动启动,即“启用”:
系统控制启用[电子邮件受保护]
备择方案
还有其他方法可以做到这一点。
非模板化服务
而不是通过替换为(例如)来[email protected]
将my-terminal-ui.service
终端设备名称硬连线到单元中。%I
tty5
我将其作为模板定义,因为这样可以更轻松地做出与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@tty5
为my-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
我不知道这是否是最好的解决方案,但它正在工作并且启动后会显示安装程序。