Skip to main content

Linux上的文本终端 - 14.1 Getty(在/ etc / inittab中使用)

Linux终端命令cat (六月 2025)

Linux终端命令cat (六月 2025)
Anonim

14.1 Getty(在/ etc / inittab中使用)

盖蒂介绍

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

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

  • agetty(有时候只叫getty):很容易设置。没有配置文件。见agetty
  • getty(getty_ps的一部分)

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

  • mgetty:调制解调器的最佳选择;虽然适用于终端,但也适用于终端
  • uugetty:仅适用于调制解调器; getty_ps包的一部分

如果你不使用真正的文本终端,可以使用简单的gettys。大多数Linux用户在他们的监视器上使用其中一个:

  • 的mingetty
  • fbgetty
  • fgetty
  • rungetty

您的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,则上述结果将不会产生任何结果。但是如果你有年龄打字:getty -h应该显示选项-hiLmw。

如果你没有getty,你想检查其他发行版和 外侨 程序转换RPM和Debian包。源代码可以从Getty Software下载。

如果您不使用调制解调器控制线(例如,如果您只使用最少数量的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是一种伪装的getty,具有相同的进程ID号。如果bash被杀死就像getty被杀了一样(即使getty不再运行)。这导致了getty respawning。

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

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

你通常应该从内部运行getty / etc / inittab中 而不是从命令行,或者终端上运行的某些程序可能会意外暂停(停止)。这就是原因(如果原因对您不重要,请跳到下一部分)。如果你从另一个终端的命令行开始说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:respawn:/ sbin / getty -L 19200 ttyS1 vt102

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

Agetty自动检测奇偶校验问题

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

平价。乱码提示将阻止访客等尝试登录。那可能就是你想要的。

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

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

为什么不能通过键入的第一个字母来检测奇偶校验?下面是一个例子:假设它检测到一个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中.

请注意,DT38400,DT19200等只是标签,必须与您使用的相同 / etc / inittab中.

如果你愿意,你可以做 盖蒂 在登录横幅中打印有趣的东西。在我的示例中,我打印了系统名称和序列行。你可以添加其他东西:blockquote

遮阳= YES

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

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

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

此时,您应该在终端上看到登录提示。你可能必须回击以引起终端的注意。

mgetty的

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

看看最后几行 /etc/mgetty/mgetty.config 例如,为终端配置它。除非你说“toggle-dtr no”,否则它会认为你有一个调制解调器并丢弃(否定)PC上的DTR引脚,徒劳地试图重置不存在的调制解调器。与其他gettys相比,mgetty不会将自己附加到终端,直到有人点击该终端的任何键,所以你会看到一个?对于终端 最佳 要么 PS 直到发生这种情况登录 在/ var /日志/ mgetty的/ 可能会显示一些警告消息,这些消息仅适用于您可能忽略的调制解调器。

这是你输入的简单线的一个例子 / etc / inittab中: