Linux上的文本终端

14.1 Getty(用于/ etc / inittab)

盖蒂简介

为了在计算机启动时(或切换运行级别)在串行端口(以及与之连接的终端)上运行登录进程,必须将getty命令放入/ etc / inittab文件中。 从命令行运行getty可能会导致问题(请参阅如果getty从命令行运行:程序停止以查看原因)。 盖蒂获得TTY(终端)。 每个终端都需要自己的getty命令。 每个/ etc / inittab文件中至少还有一个控制台的getty命令。 找到它并将真正终端的getty命令放在它旁边。 该文件可能包含注释掉的文本终端的示例getty行,以便您只需取消注释(删除前导#)并更改一些参数。

允许的参数取决于您使用的getty:
两种最适合直接连接终端的gettys是:

两个最适合拨入调制解调器的gettys(避免直接连接终端)是:

如果您不使用真正的文本终端,则使用简单的gettys。 大多数Linux用户在他们的显示器上使用其中的一种:

您的Linux发行版可能带有用于文本终端的ps_getty或agetty。 有些分配不提供。 不幸的是,他们经常把它称为“getty”,所以您可能需要确定自从您在/ etc / inittab中放入的参数不同之后,您拥有哪一个。 Debian使用agetty(在util-linux软件包中)。 RedHat和Fedora使用了ps_getty,它位于:ps_getty

作为尝试确定您拥有哪个getty的最后手段,您可以查看其可执行代码(通常位于/ sbin中)。 ps_getty在此代码中嵌入了/ etc / gettydefs。 要搜索它,请转到/ sbin并输入:
字符串getty | grep getty
如果getty实际上是agetty,那么上面的内容将不会导致任何结果。 但是,如果你有agetty输入:
getty -h
应该显示选项[-hiLmw]。

如果你没有getty你想检查其他发行版和外星人程序在RPM和Debian软件包之间转换。 源代码可以从Getty软件下载。

如果您不使用调制解调器控制线(例如,如果您只使用最少数量的3个导线:发送,接收和公共信号接地),您应该通过使用“本地”标志让getty知道这一点。 这种格式取决于你使用的getty。

Getty在登录后退出(并可以重新生成)

登录后,您会注意到(通过使用“top”,“ps -ax”或“ptree”)getty进程不再运行。 这是怎么回事? 为什么如果你的shell被杀死了,getty会重新启动? 这是为什么。

在你输入用户名后,getty接收并调用登录程序,告诉它你的用户名。 getty进程被登录进程取代。 登录过程要求输入密码,检查密码并启动密码文件中指定的任何过程。 这个过程通常是bash shell。 如果是这样,bash开始并替换登录过程。 请注意,一个进程会替换另一个进程,并且bash shell进程最初是作为getty进程启动的。 这个的含义将在下面解释。

现在在/ etc / inittab文件中,如果死掉,getty应该重新生成(重新启动)。 它在调用getty的行上表示如此。 但是,如果bash shell(或登录进程)被终止,getty重新生成(重新启动)。 为什么? 那么,登录过程和bash都是getty和inherit的替代品

* 文本终端如何索引

信号连接由其前任建立。 事实上,如果您观察细节,您会注意到替换过程将具有与原始过程相同的过程ID。 因此,bash是一种伪装成相同进程ID号的getty。 如果bash被杀害,它就像getty被杀(即使getty不再运行)。 这导致getty重新生成。

当一个注销时,该串行端口上的所有进程都将被终止,包括bash shell。 如果调制解调器通过降低DCD电压将挂断信号发送到串行端口,也可能发生这种情况(如果启用)。 注销或丢弃DCD将导致getty respawning。 人们可以通过在“top”或“kill”命令中通过按下k键等手动杀死bash(或登录)来强制getty重新生成。 你可能需要用信号9(这是不能忽略的)杀死它。

如果getty从命令行运行:程序停止

通常应该从/ etc / inittab中运行getty,而不是从命令行运行,否则一些运行在终端上的程序可能会意外暂停(停止)。 这就是为什么(如果原因对你不重要,请跳到下一节)​​。 如果你从另一个终端的命令行启动getty,比如说tty1,那么它将把tty1作为它的“控制终端”,即使它运行的实际终端是ttyS1。 因此它有错误的控制终端。 但是,如果它是在inittab文件内部启动的,那么它将具有ttyS1作为控制终端(正确)。

即使控制终端是错误的,在ttyS1上的登录工作正常(因为你给ttyS1作为getty的参数)。 即使控制终端保持tty11,标准输入和输出也会设置为ttyS1。 在ttyS1上运行的其他程序可以继承这个标准输入/输出(连接到ttyS1)并且一切正常。 但是有些程序可能会犯错误,试图从他们的控制终端读取(tty1),这是错误的。 现在tty1可能会认为这些程序是由tty1在后台运行的,因此尝试从tty1读取(应该是ttyS1)会导致尝试读取的进程停止。 (后台进程不允许从其控制终端读取)。 您可能会在屏幕上看到如下信息:“ [1] +停止 ”。 此时,由于您无法与正在尝试通过错误的终端与您通信的进程进行交互,因此您被卡住了。 当然,为了逃避这一点,你可以去另一个终端并杀死进程等。

agetty(可能被命名为getty)

/ etc / inittab中的示例行:

S1:23:重生:/ sbin / getty -L 19200 ttyS1 vt102

S1来自ttyS1。 23表示getty在进入运行级别2或3时运行。respawn意味着如果getty(或替换它的进程,如bash)被杀死,getty将自动重新启动(重新生成)。 / sbin / getty是getty命令。 -L表示本地(忽略调制解调器控制信号)。 -h(在示例中未显示)启用硬件流量控制(与stty crtsct相同)。 19200是波特率。 ttyS1表示/ dev / ttyS1(MS-DOS中的COM2)。 vt102是终端的类型,这个getty会将环境变量TERM设置为这个值。 没有配置文件。 编辑getty后在命令行上键入“init q”,您应该看到一个登录提示。

Agetty自动检测奇偶校验问题

agetty程序将尝试自动检测终端内的奇偶校验集(包括无奇偶校验)。 它不支持8位数据字节加1位奇偶校验。 请参见8位数据字节(外加奇偶校验)。 如果使用stty来设置奇偶校验, agetty会自动取消设置,因为它最初希望校验位通过,就好像它是数据位一样。 这是因为您需要在输入登录名时获取最后一位(可能是奇偶校验位),以便它可以自动检测奇偶校验。 因此,如果您使用奇偶校验,请仅在文本终端内启用它,并让agetty自动检测并将其设置在计算机上。 如果您的终端支持收到奇偶校验,登录提示将显示为乱码,直到您输入某些内容以便getty可以检测到

平价。 乱码提示会阻止访问者等尝试登录。 这可能就是你想要的。

自动检测奇偶校验有时会出现问题。 发生这种情况的原因是,首次输入登录名后, agetty会启动登录程序以完成登录。不幸的是, 登录程序无法检测到奇偶校验,因此如果getty程序未能确定奇偶校验, 登录将无法确定它也是。 如果第一次登录尝试失败,则登录会让您再次尝试,等等(所有奇偶校验设置错误)。 最终,在多次尝试登录失败(或超时后)后, agetty将重新启动并重新开始登录序列。 一旦getty再次运行,它可能能够在第二次尝试中检测到奇偶校验,因此一切都可以正常工作。

如果校验码错误,则登录程序无法正确读取您键入的内容,并且无法登录。如果您的终端支持收到奇偶校验,您将继续看到乱码的屏幕。 如果getty无法检测到奇偶校验,则通常在提示符之前将/ etc / issue文件转储到屏幕上,因此屏幕上可能会出现更多乱码文字。

为什么agetty不能通过输入的第一个字母检测奇偶校验? 这里有一个例子:假设它检测到一个8位的字节,其奇偶校验位为0(高位),奇数个为1位。 它是什么平等? 那么,奇数的1位意味着它是奇数奇偶校验。 但它也可能只是一个没有奇偶校验的8位字符。 目前还没有办法确定哪一个。 但到目前为止,我们已经消除了均等的可能性。 因此,平价检测是通过消除过程来进行的。

如果下一个输入的字节与第一个类似,并且仅消除偶校验的可能性,则仍然不可能确定奇偶校验。 这种情况可能会无限期地持续下去,并且在极少数情况下,登录将会失败,直到您更改登录名。 如果agetty发现奇偶校验位为1,它将假定这是一个奇偶校验位,而不是8位字符的高阶位。 因此,它假设您不使用用户名中的元字符(高位集)(即您的名称是ASCII)。

人们可能以各种方式进入“登录循环”。 假设您只为您的登录名输入一个或两个字母,然后按回车键。 如果这些字母不足以进行奇偶校验检测,则登录在检测到奇偶校验之前运行。 有时如果在agetty首次启动时没有终端和/或连接,则会发生此问题。

如果你陷在这个“登录循环”中,一种方法就是多次点击返回键,直到你得到getty登录提示。 另一种方法是等待一分钟左右超时。 然后,getty程序会将getty登录提示放在屏幕上,然后您可以再次尝试登录。

8位数据字节(加奇偶校验)

不幸的是,agetty无法检测到这种平价。 到1999年末,它无法禁用自动检测奇偶校验,因此会检测到不正确的奇偶校验。 结果是登录过程将会出现乱码,奇偶校验会被设置错误。 因此,尝试使用具有奇偶校验的8位数据字节似乎不可行。

getty(getty_ps的一部分)

(其中大部分来自Greg Hankins的旧版Serial-HOWTO)
对于这个getty,需要将条目放入配置文件并在/ etc / inittab中添加一个条目。 以下是您在终端中使用的一些示例条目,您可以将它们放入配置文件/ etc / gettydefs中

#38400 bps哑终端条目DT38400#B38400 CS8 CLOCAL#B38400 SANE -ISTRIP CLOCAL#@ S @L登录:#DT38400#19200 bps哑终端条目DT19200#B19200 CS8 CLOCAL#B19200 SANE -ISTRIP CLOCAL#@ S @L login: #DT19200#9600 bps哑终端条目DT9600#B9600 CS8 CLOCAL#B9600 SANE -ISTRIP CLOCAL#@ S @L登录:#DT9600

请注意,DT38400,DT19200等仅仅是标签,并且必须与您在/ etc / inittab中使用的相同。

如果你愿意,你可以在登录横幅中使getty打印有趣的东西。 在我的例子中,我打印了系统名称和串行线。 你可以添加其他的东西:[blockquote

遮阳= YES] @B当前(在看到@B时评估)bps速率。 @D当前日期,以MM / DD / YY表示。 @L getty所连接的串行线。 @S系统名称。 @T当前时间,HH:MM:SS(24小时制)。 @U当前登录用户的数量。 这是/ etc / utmp文件中具有非空ut_name字段的条目数的计数。 @V VERSION的值,如默认文件中给出的。 要显示单个'@'字符,请使用'\ @'或'@@'。

编辑完/ etc / gettydefs后 ,可以通过执行以下操作验证语法是否正确:

linux#getty -c / etc / gettydefs

确保您的终端所连接的串行端口没有其他gettyuugetty配置文件,例如( /etc/default/{uu}getty.ttyS N/etc/conf.{uu}getty.ttyS N ) ,因为这可能会干扰在终端上运行getty 。 如果它们退出,请删除这些冲突的文件。

编辑/ etc / inittab文件以在串行端口上运行getty (替换环境的正确信息 - 端口,速度和默认终端类型):

S1:23:重生:/ sbin / getty ttyS1 DT9600 vt100 在里面 linux#init q

此时,您应该在终端上看到登录提示。 你可能不得不回到终端的注意。

mgetty的

“m”代表调制解调器。 这个程序主要用于调制解调器,到2000年中期,它需要重新编译才能用于文本终端(除非你使用硬件流量控制 - 而且通常需要手工制作的电缆)。 有关直接连接终端的文档,请参见手册的“直接”部分: mgetty.texi。

查看/etc/mgetty/mgetty.config的最后一行,为终端配置一个例子。 除非你说“toggle-dtr否”,否则它会认为你有一个调制解调器并在PC上丢弃(取消)DTR引脚,妄图重置不存在的调制解调器。 与其他gettys相比,mgetty不会将自己附加到终端,除非有人点击该终端的任何键,以便您看到一个? 终端在顶部ps,直到发生这种情况。 / var / log / mgetty /中的日志可能会显示一些仅适用于您可能会忽略的调制解调器的警告消息。

以下是您在/ etc / inittab中放置的简单行的示例

s1:23:respawn:/ sbin / mgetty -r ttyS1