有许多文件需要编辑,以设置计算机用于终端。 如果您幸运的话,您只需要编辑 /etc/inittab。 这可以通过在控制台(或任何工作的终端)上编辑来完成。

Getty 简介

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

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

  1. agetty (有时就称为 getty): 易于设置,无需配置。 请参阅 agetty
  2. getty (getty_ps 的一部分) 更高级,带有配置文件。
最适合拨入调制解调器的两个 getty(避免用于直接连接的终端)是
  1. mgetty: 最适合调制解调器; 也适用于终端,但较差
  2. uugetty: 仅适用于调制解调器; getty_ps 软件包的一部分
如果您不使用真正的文本终端,则可以使用简单的 getty。 大多数 Linux 用户在他们的显示器上使用其中一个
  1. mingetty
  2. fbgetty
  3. fgetty
  4. rungetty

您的 Linux 发行版可能带有用于文本终端的 getty_ps 或 agetty。 一些发行版两者都不提供。 不幸的是,他们通常只是将其称为 "getty"。 如果您需要确定您拥有哪一个,请查看 "getty" 的 man 页面。 截至 2007 年,agetty(在 "util-linux" 软件包中)似乎比 getty_ps 更广泛使用,getty_ps 位于: getty_ps

作为确定您拥有哪个 getty 的最后手段,您可以检查其可执行代码(通常在 /sbin 中)。 getty_ps 在此代码中嵌入了 /etc/gettydefs。 要搜索它,请转到 /sbin 并键入
strings getty | grep getty
如果 getty 实际上是 agetty,则以上操作不会产生任何结果。 但是,如果您有 agetty,则键入
getty -h
应该显示 agetty 选项 [-hiLmw]。

各种 getty 的源代码可以从 Getty 软件 下载。

如果您不使用调制解调器控制线(例如,如果您只使用最少数量的 3 根导线:发送、接收和公共信号地),您应该通过使用 "local" 标志告知 getty。 此标志的格式取决于您使用的 getty。

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

登录后,您会注意到(通过使用 "top"、"ps -ax" 或 "ptree")getty 进程不再运行。 它怎么了? 为什么如果您的 shell 被杀死,getty 会再次重启? 原因如下。

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

现在在 /etc/inittab 文件中,getty 应该在被杀死时重新生成(重启)。 调用 getty 的行中是这样说的。 但是,如果 bash shell(或 login 进程)被杀死,getty 会重新生成(重启)。 为什么? 嗯,login 进程和 bash 都是 getty 的替代品,并继承了其前任建立的信号连接。 实际上,如果您观察细节,您会注意到替换进程将具有与原始进程相同的进程 ID。 因此,bash 在某种程度上是伪装的 getty,具有相同的进程 ID 号。 如果 bash 被杀死,就像 getty 被杀死一样(即使 getty 不再运行)。 这导致 getty 重新生成。

当用户注销时,该串行端口上的所有进程(包括 bash shell)都会被杀死。 如果(如果启用)调制解调器 DCD 电压下降向串行端口发送挂断信号,也可能发生这种情况。 注销或 DCD 下降都将导致 getty 重新生成。 可以通过手动杀死 bash(或 login),或者通过在 "top" 中按 k 键等,或者使用 "kill" 命令,来强制 getty 重新生成。 您可能需要使用信号 9(无法忽略)杀死它。

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

您通常应该从 /etc/inittab 内部运行 getty,而不是从命令行运行,否则在终端上运行的某些程序可能会意外挂起(停止)。 原因如下(如果原因对您不重要,请跳到下一节)。 如果您从另一个终端(例如 tty1)的命令行启动 ttyS1 的 getty,那么它将以 tty1 作为其 "控制终端",即使它实际运行的终端是 ttyS1。 因此,它的控制终端是错误的。 但是,如果它在 inittab 文件内部启动,那么它将以 ttyS1 作为控制终端(正确)。

即使控制终端是错误的,ttyS1 上的登录也能正常工作(因为您将 ttyS1 作为参数传递给 getty)。 标准输入和输出设置为 ttyS1,即使控制终端仍然是 tty1。 在 ttyS1 上运行的其他程序可能会继承此标准输入/输出(连接到 ttyS1),并且一切正常。 但是,某些程序可能会错误地尝试从其控制终端 (tty1) 读取,这是错误的。 现在 tty1 可能会认为这些程序是由 tty1 在后台运行的,因此尝试从 tty1 读取(它应该是 ttyS1)会导致停止尝试读取的进程。 (后台进程不允许从其控制终端读取。)。 您可能会在屏幕上看到类似以下的消息: "[1]+ Stopped"。 此时您会陷入困境,因为您无法与尝试通过错误终端与您通信的进程进行交互。 当然,要摆脱这种情况,您可以转到另一个终端并杀死该进程等。

agetty (可能名为 getty)

agetty 的意思是 "alternative getty"(替代 getty),它是原始 getty (getty_ps) 的更易于使用的替代品。
/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 将自动取消设置它,因为它最初希望奇偶校验位像数据位一样传递。 这是因为它需要获取最后一个位(可能是奇偶校验位),当您键入您的登录名时,以便它可以自动检测奇偶校验。 因此,如果您使用奇偶校验,请仅在文本终端内部启用它,并让 agetty 自动检测并在计算机上设置它。 如果您的终端支持接收奇偶校验,则登录提示符看起来会是乱码,直到您键入某些内容,以便 getty 可以检测到奇偶校验。 乱码提示符会阻止访客等尝试登录。 这可能正是您想要的。

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

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

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

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

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

如果您陷入此 "登录循环",一种摆脱它的方法是多次按回车键,直到您获得 getty 登录提示符。 另一种方法是只需等待一分钟左右以超时。 然后 getty 登录提示符将由 getty 程序放在屏幕上,您可以再次尝试登录。

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

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

getty (getty_ps 的一部分)

名称经常被错误拼写为 ps_getty。 (大部分内容来自 Greg Hankins 的旧 Serial-HOWTO)
对于此 getty,您需要同时在配置文件中添加条目,并在 /etc/inittab 中添加条目。 以下是一些示例条目,您可以将它们放入配置文件 /etc/gettydefs 中,用于您的终端。

# 38400 bps Dumb Terminal entry
DT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #@S @L login: #DT38400

# 19200 bps Dumb Terminal entry
DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login: #DT19200

# 9600 bps Dumb Terminal entry
DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S @L login: #DT9600

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

如果您愿意,您可以让 getty 在登录横幅中打印有趣的内容。 在我的示例中,我打印了系统名称和串行线路。 您可以添加其他内容

@B    The current (evaluated at the time the @B is seen) bps rate.
@D    The current date, in MM/DD/YY.
@L    The serial line to which getty is attached.
@S    The system name.
@T    The current time, in HH:MM:SS (24-hour).
@U    The number of currently signed-on users.  This is  a
      count of the number of entries in the /etc/utmp file
      that have a non-null ut_name field.
@V    The value of VERSION, as given in the defaults file.
To display a single '@' character, use either '\@' or '@@'.

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

linux# getty -c /etc/gettydefs

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

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

S1:23:respawn:/sbin/getty ttyS1 DT9600 vt100
重启 init
linux# init q

此时,您应该在终端上看到登录提示符。 您可能需要按回车键以引起终端的注意。

mgetty

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

查看 /etc/mgetty/mgetty.config 的最后几行,了解如何为终端配置它的示例。 除非您说 "toggle-dtr no",否则它会认为您有一个调制解调器,并在 PC 上降低(否定)DTR 引脚,徒劳地尝试重置不存在的调制解调器。 与其他 getty 不同,mgetty 不会将自身附加到终端,直到有人按下该终端的任何键,因此您会在 topps 中看到终端的 ?,直到发生这种情况。 /var/log/mgetty/ 中的日志可能会显示一些警告消息,这些消息仅适用于您可以忽略的调制解调器。

以下是您放入 /etc/inittab 中的简单行的示例:

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

15.2 Stty & Setserial

有 "stty" 命令和 "setserial" 命令用于设置串行端口。 一些(或全部)需要的 stty 设置可以通过 getty 完成,并且可能不需要使用 setserial,因此您可能不需要使用任何一个命令。 这两个命令(stty 和 setserial)设置串行端口的不同方面。 Stty 完成大部分工作,而 setserial 配置低级内容,如中断和端口地址。 要 "保存" 设置,这些命令必须写入在每次计算机启动时运行的某些文件(shell 脚本)中。 Linux 发行版通常提供一个运行 setserial 的 shell 脚本,但很少提供运行 stty 的 shell 脚本,因为很少需要它。

15.3 Setserial

此部分在 3 个 HOWTO 中:调制解调器、串行和文本终端。 根据它出现在哪个 HOWTO 中,存在一些细微的差异。

Setserial 在 linmodems、笔记本电脑上的问题

如果您有笔记本电脑 (PCMCIA),请在阅读 笔记本电脑:PCMCIA 之前不要使用 setserial

简介

setserial 是一个程序,用户可以使用它与串行设备驱动程序通信。 通常您永远不需要使用它,前提是您只使用 PC 标准配置的一个或两个串行端口。 即使在其他情况下,大多数额外的串行端口也应该被现代内核自动检测到。 除非您的物理硬件上使用跳线设置了过时的 ISA 串行端口,或者您的内核(例如 2.2 或更早版本)既不检测也不设置您的附加 PCI 串行端口,否则您才需要使用 setserial。 在某些情况下,setserial 程序可能以前使用过,并且某些过去的用户(可能就是您)手动给出了错误的串行端口数据。 如果 setserial 未配置为接受内核所说的内容,它将使用某人先前设置的内容覆盖(可能是正确的)内核数据。

setserial 允许您(或 shell 脚本)与串行软件对话。 但是还有另一个程序 tt/stty/,它也处理串行端口,并用于设置端口速度等。 setserial 实际上是一个用词不当,它不会在串行卡上设置任何信息。 示例:它无法更改卡上设置的 irq。 稍后会详细介绍。

setserial 处理串行端口的低级配置,例如处理 IRQ(如 5)、端口地址(如 3f8)等。 它的一个主要问题是它无法设置或配置串行端口硬件:它无法将 IRQ 或端口地址设置到硬件中。 此外,当它看似报告硬件的配置时,有时是错误的,因为它实际上并不探测硬件,除非您明确告诉它。 即使那样,它也不会进行现代类型的总线探测,并且某些硬件可能永远无法被它找到。 尽管如此,它显示的内容在大多数情况下都是正确的,但如果您在使串行端口工作方面遇到问题,那么很有可能是错误的。

在过去,当 IRQ 和端口地址由串行卡上的跳线设置时,人们会使用 setserial 来告诉驱动程序这些跳线是如何设置的。 今天,当即插即用方法检测到无跳线串行端口是如何设置时,除非您遇到问题或使用旧硬件,否则不再真正需要 setserial。 此外,如果 setserial 使用的配置文件是错误的,那么就会出现问题。 在这种情况下,如果您使用 setserial 尝试找出端口是如何配置的,它可能只是重复 setserial 配置文件中的不正确信息。

setserial 有时可以帮助找到串行端口。 但只有在您知道端口地址并使用正确的选项时才有用。 对于现代端口,通常有更好的方法通过即插即用方法查找它们。

因此,名称 setserial 在某种程度上是一个用词不当,因为它不会在硬件中设置 I/O 地址或 IRQ,它只是在驱动程序软件中 "设置" 它们。 驱动程序天真地相信 setserial 告诉它的内容,即使它与驱动程序通过使用即插即用方法找到的内容冲突。 遗憾的是,它至少没有为 setserial 发出此类冲突的警告消息。 由于设备驱动程序被认为是内核的一部分,因此在其他文档中经常使用 "内核" 一词,而没有提及任何 "串行驱动程序"。

某些发行版(和版本)设置了一些东西,以便在启动时通过初始化 shell 脚本(在 /etc 目录树中)运行 setserial。 但是此脚本使用的配置文件可能位于 /etc 树或 /var 树中。 在某些情况下,如果您希望 setserial 在启动时运行,您可能需要采取一些操作。 如果内核中内置了串行支持,或者作为模块加载,则 setserial 将无法工作。 如果您(或脚本)尝试使用 setserial,则模块可能会自动加载。

虽然可以使 setserial 探测硬件 IO 端口地址以尝试确定 UART 类型和 IRQ,但这有严重的局限性。 请参阅 探测。 它无法在 PnP 或 PCI 串行端口的硬件中设置 IRQ 或端口地址(但串行驱动程序的即插即用功能可能会做到这一点)。 它也无法直接读取存储在硬件配置寄存器中的 PnP 数据。 但是,由于设备驱动程序可以读取这些寄存器,并且 setserial 会告诉您设备驱动程序的想法,因此它可能是正确的。 或者它可能是在告诉您 setserial 先前(可能错误地)告诉驱动程序的内容。 在不进行其他检查的情况下,无法确定。

串行驱动程序(对于 Linux 内核 2.4 和 2.6)查找一些 "标准" 旧式串行端口、ISA 总线上的 PnP 端口以及 PCI 总线上的所有受支持端口硬件。 如果它正确找到您的端口,则无需使用 setserial,除非它们在 setserial 配置文件中被 "设置" 错误。 驱动程序不会探测使用卡上跳线设置的旧 ISA 串行端口的 IRQ,并且可能会弄错这些 IRQ。

除了 setserial 的 man 页面外,还要查看 /usr/doc/setserial...//usr/share/doc/setserial 中的信息。 这应该告诉您如何处理您的 Linux 发行版的 setserial。 虽然 setserial 在所有发行版中的行为都相同,但运行它的脚本、如何配置此类脚本(包括自动配置)以及脚本文件的名称和位置等都取决于发行版。 如果您的串行端口是即插即用的,您可能需要查阅其他 HOWTO,例如即插即用或串行。

串行模块卸载

如果卸载串行模块,则驱动程序将忘记先前由 setserial 所做的更改。 但是,虽然驱动程序忘记了它,但发行版提供的脚本可能会将其保存在某个文件中,以便在重新加载模块时可以恢复它。 此外,由 setserial 所做的更改可能会存储在 setserial 的配置文件中(请参阅您的发行版的文档,此信息不在 man 页面中)。

给出 setserial 命令

请记住,setserial 无法在硬件中设置任何 I/O 地址或 IRQ。 这是通过即插即用软件(由驱动程序运行)或旧式串行端口的跳线完成的。 即使您通过 setserial 向驱动程序提供 I/O 地址或 IRQ,它也不会设置这些值,而是假定它们已被设置。 如果您给它错误的值,串行端口将无法正常工作(如果可以工作)。

对于旧式端口,如果您知道 I/O 地址但不知道 IRQ,您可以命令 setserial 尝试确定 IRQ。

您可以通过仅键入 setserial 而不带任何参数来查看可能的命令列表。 这未能向您显示单字母选项,例如 -v 用于详细模式,您通常在排除故障时应使用它。 请注意,setserial 将 IO 地址称为 "port"。 如果您键入

setserial -g /dev/ttyS*
您将看到一些关于设备驱动程序如何配置您的端口的信息。 在许多情况下,您会看到一些端口显示的信息乍一看似乎是错误的 IRQ 和地址。 但是,如果您还看到:"UART: unknown",请忽略整行,因为该地址上不存在串行端口。

如果您将 -a 添加到选项 -g,您将看到更多信息,尽管很少有人需要处理(或理解)此附加信息,因为您看到的默认设置通常工作正常。 在正常情况下,硬件的设置方式与 "setserial" 报告的方式相同。 但是,如果您遇到问题,则很可能 setserial 弄错了。 实际上,您可以运行 "setserial" 并分配一个纯粹虚构的 I/O 端口地址、任何 IRQ 以及您想要拥有的任何 uart 类型。 然后,下次您键入 "setserial ..." 时,它将显示您提供给驱动程序的这些伪造值。 它们也将正式注册到内核中,如 "scanport" 命令(Debian)在屏幕顶部显示的那样。 当然,如果您尝试使用此类端口,串行端口驱动程序将无法正常工作(如果可以工作)。 因此,当向 setserial 提供参数时,"一切皆有可能"。 好吧,几乎是这样。 如果您为一个端口分配一个已分配的基地址(例如 3e8),它可能不会接受它。 但是,如果您使用 3e9,它将接受它。 不幸的是,3e9 实际上已被分配,因为它在以基地址 3e8 开头的范围内。 因此,这个故事的寓意是在使用 setserial 分配资源之前,请确保您的数据是正确的。

配置文件

虽然由 setserial 所做的分配在 PC 关闭电源时会丢失,但配置文件可能会在 PC 再次启动时恢复它们。 在较新版本中,您通过 setserial 更改的内容可能会自动保存到配置文件中。 当 setserial 运行时,它使用来自配置文件的信息。

此配置文件的位置取决于您的发行版。 查看 /etc/ 树中的某个位置的启动脚本(例如 /etc/init.d/ 或 /etc/rc.d/),并读取 "serial" 或 "setserial" 或类似的启动脚本。 它应该显示配置文件所在的位置。 在 Debian 中,有 4 个选项可用于此配置文件

  1. 完全不使用此文件。 在每次启动时,仅串行驱动程序检测端口,setserial 永远不会运行。("kernel" 选项)
  2. 保存系统首次关闭时 setserial 报告的内容,并将其放入配置文件中。 之后,即使有人通过在命令行上运行 setserial 命令然后关闭系统进行了更改,也永远不要对配置文件进行任何更改。("autosave-once" 选项)
  3. 在每次关闭时,将 setserial 检测到的任何内容保存到配置文件中。("autosave" 选项)
  4. 手动编辑配置文件以设置配置。 永远不要对其进行任何自动保存。("manual" 选项)

在过去(可能在 2000 年之前),没有任何配置文件,并且配置是手动设置的(硬编码)在运行 setserial 的 shell 脚本内部。 请参阅 编辑脚本(版本 2.15 之前)

探测

仅当您怀疑端口已被启用(通过 PnP 方法、BIOS、跳线等)时,才使用 setserial 探测端口。 否则,setserial 探测永远不会找到它,因为它的地址不存在。 问题是软件在指定的 I/O 地址中查找端口的位置。 在使用 "setserial" 探测之前,可以运行 "scanport" (Debian) 命令以在一个扫描中检查所有可能的端口。 它对某些端口上的内容进行了粗略的猜测,但没有确定 IRQ。 这是一个快速的初步启动。 它可能会使您的 PC 挂起,但到目前为止,它对我来说工作正常。 请注意,非 Debian 发行版似乎不提供 "scanport"。 是否有其他扫描程序?

使用适当的选项,setserial 可以(在给定的 I/O 地址)探测串行端口,但您必须猜测 I/O 地址。 例如,如果您要求它探测 /dev/ttyS2,它将仅在其认为 ttyS2 所在的地址 (2F8) 进行探测。 如果您告诉 setserial ttyS2 位于不同的地址,那么它将在该地址探测,等等。 请参阅 探测

此类探测的目的是查看那里是否有 uart,如果有,它的 IRQ 是什么。 主要将 setserial 用作最后的手段,因为有更快的方法来尝试它,例如 wvdialconf 来检测调制解调器、查看非常早期的启动时消息,或使用 pnpdump --dumpregs 或 lspci -vv。 但是,如果您想使用 setserial 检测硬件,请使用例如
setserial /dev/ttyS2 -v autoconfig
如果结果消息显示 uart 类型(例如 16550A),则您没问题。 相反,如果它显示 uart 类型的 "unknown",则表示该 I/O 地址上据称根本没有串行端口。 一些廉价的串行端口无法正确识别自己,因此如果您看到 "unknown",您可能仍然在那里有一个串行端口。

除了自动探测 uart 类型外,setserial 还可以自动探测 IRQ,但这也不总是能正确工作。 在一种情况下,它首先给出了错误的 irq,但是当重复该命令时,它找到了正确的 irq。 在 setserial >= 2.15 版本中,您上次探测测试的结果可以自动保存并放入特定于发行版的配置文件中,例如 Debian 的 /etc/serial.conf/etc/sysconfig/serial/var/lib/setserial/autoserial.conf。 这将在您下次启动 Linux 时使用。

可能是两个串行端口在硬件中都设置了相同的 IO 地址。 当然,这通常不允许用于 ISA 总线,但有时仍然会发生。 探测检测到一个串行端口,而实际上有两个。 但是,如果它们具有不同的 IRQ,则 IRQ 探测可能会显示 IRQ = 0。 对我来说,只有当我首先使用 setserial 为 IRQ 提供一个虚构值时,才会发生这种情况。

启动时配置

虽然 setserial 可能会通过初始化脚本运行,但在加载串行模块时(或者如果内置串行驱动程序已编译到内核中,则在内核启动时)也会运行类似于 setserial 的东西。 因此,当您观看屏幕上的启动消息时,它可能看起来像运行了两次,实际上确实运行了两次。

如果第一个消息是关于旧式端口的,则显示的 IRQ 可能是不正确的,因为它没有探测 IRQ。 如果有第二个串行端口报告,则可能是 /etc/init.d/setserial 等脚本的结果。 它通常不进行探测,因此可能对硬件的实际设置方式是错误的。 它仅显示保存在配置文件中的配置数据。 版本 2.15 之前的旧方法是将此类数据直接手动写入脚本。

当内核加载串行模块时(或者如果 "模块等效项" 内置到内核中),则会检测到所有受支持的 PnP 端口。 对于旧式(非 PnP)端口,仅自动检测 ttyS{0-3},并且驱动程序设置为仅使用 IRQ 4 和 3(无论硬件中实际设置的 IRQ 是什么)。 不会对 IRQ 进行探测,但可以手动执行此操作。 您会在启动时消息中看到这一点,就像运行了 setserial 一样。

为了纠正 IRQ 中可能的错误(或出于其他原因),可能存在一个脚本文件在某处运行 setserial。 不幸的是,如果此文件中的某些 IRQ 错误,内核仍然会具有关于 IRQ 的不正确信息。 此文件通常是在启动时完成的初始化的一部分。 它是否运行取决于您(和/或您的发行版)如何设置事物。 它也可能取决于运行级别。

在修改配置文件之前,你可以通过在命令行中输入一个“提议的” setserial 命令来对其进行测试。在某些情况下,当你关机时,使用 setserial 的结果将自动保存到某个地方,例如 /etc/serial.conf(或 autoserial.conf 或 serial)。因此,如果它运行良好(并解决了你的问题),则无需修改任何配置文件。请参阅 使用 /etc/serial.conf 等的配置方法

编辑脚本(2.15 版本之前需要)

这是在 setserial 2.15 版本(1999 年)之前完成的方式。目标是修改(或创建)/etc 树中的一个脚本文件,该文件在启动时运行 setserial。大多数发行版都提供了这样的文件(但它最初可能并不位于 /etc 树中)。

因此,在 2.15 版本(1999 年)之前,它更简单。你所做的只是编辑一个脚本。没有 /etc/serial.conf 文件(或类似文件)来配置 setserial。因此,你需要找到在启动时运行 “setserial” 的文件并编辑它。如果它不存在,你需要创建一个(或将命令放在启动时早期运行的文件中)。如果当前正在使用这样的文件,它很可能位于 /etc 目录树中的某个位置。但是 Redhat <6.0 将其放在 /usr/doc/setserial/ 中,但你需要在使用它之前将其移动到 /etc 树中。

脚本 /etc/rc.d/rc.serial 在过去很常用。Debian 发行版使用 /etc/rc.boot/0setserial。曾经使用过的另一个文件是 /etc/rc.d/rc.local,但它可能运行得不够早。据报告,其他进程可能会在 rc.local 运行之前尝试打开串口,从而导致串口通信失败。后来,它很可能位于 /etc/init.d/ 中,但通常不打算被编辑。

如果提供了这样的文件,它可能包含许多注释掉的示例。通过取消注释其中一些和/或修改它们,你可以正确地进行设置。重要的是使用 setserial 的有效路径和有效的设备名称。你可以通过手动执行此文件(只需以超级用户身份键入其名称)来测试它是否正常工作。像这样的测试比重复重启以使其正确要快得多。

对于 >= 2.15 版本(前提是你的发行版实现了更改,Redhat 最初没有),这可能更棘手,因为在启动时运行 setserial 的文件,/etc/init.d/setserial 或类似文件,不打算由用户编辑。请参阅 使用 /etc/serial.conf 等的配置方法

这样一个脚本中的示例行是

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test

或者,如果你希望 setserial 自动确定 ttyS3 的 uart 和 IRQ,你可以使用类似这样的方法

/sbin/setserial  /dev/ttyS3 auto_irq skip_test autoconfig

这是为你想要自动配置的每个串口完成的,使用一个在你的机器上真实存在的设备名称。在某些情况下,由于硬件原因,它可能无法正常工作。

使用 /etc/serial.conf 等的配置方法

在 setserial 2.15 版本(1999 年)之前,配置 setserial 的方法是手动编辑在启动时运行 setserial 的 shell 脚本。请参阅 编辑脚本(2.15 版本之前)。这很简单,但这种简单明了的方法已被更改为不必要地复杂的东西。如今,脚本和配置文件是两个不同的文件,而不是一个。这个 shell 脚本不会被编辑,而是从配置文件(例如 /etc/serial.conf(或 /var/lib/setserial/autoserial.conf))中获取其数据。

此外,你甚至可能不需要编辑 serial.conf(或类似文件),因为在命令行中使用 “setserial” 命令可能会自动导致 serial.conf 被适当地编辑。这样做是为了你可能不需要编辑任何文件来设置(或更改)每次 Linux 启动时 setserial 执行的操作。

通常发生的情况是这样的:当你关闭 PC 时,在启动时运行 “setserial” 的脚本会再次运行,但这次它只执行 “stop” 情况部分所说的操作:它使用 “setserial” 来找出 “setserial” 的当前状态,并将该信息放入串行配置文件中,例如 serial.conf。因此,当你运行 “setserial” 来更改 serial.conf 文件时,它不会立即更改,而只会在你正常关机时才更改。

现在你或许可以猜到可能出现什么问题。假设你没有正常关机(有人关闭了电源等),并且更改没有被保存。假设你使用 “setserial” 进行实验,并忘记最后一次运行它以恢复原始状态(或在恢复原始状态时犯了错误)。那么你的 “实验性” 设置将被保存。最糟糕的是,除非你知道配置文件中设置了哪些选项,否则你不知道会发生什么。Debian(以及可能的其他发行版)中的一个选项被称为 “AUTOSAVE-ONCE”,它仅在你第一次使用 setserial 命令进行更改时保存更改。

如果设置了选项 “###AUTOSAVE###”,并且你手动编辑 serial.conf,那么你的编辑将在你关机时被破坏,因为它会被更改回关机时 setserial 的状态。有一种方法可以禁用在关机时更改 serial.conf,那就是从 serial.conf 的第一行中删除 “###AUTOSAVE###” 或类似内容。在 Debian 发行版中,第一次在你安装后立即关机后,从第一行删除 “###AUTOSAVE###” 曾经是自动完成的。为了保留这种效果,创建了 “AUTOSAVE-ONCE” 选项,该选项仅在系统第一次关机时(在你安装或更新 setserial 程序后)执行保存。

现在最常用于在启动时(根据配置文件)运行 setserial 的文件是 /etc/init.d/setserial (Debian) 或 /etc/init.d/serial (Redhat),或等等,但通常不应编辑它。对于 2.15 版本,Redhat 6.0 只是有一个文件 /usr/doc/setserial-2.15/rc.serial,如果你想在启动时运行 setserial,你必须将其移动到 /etc/init.d/。

要禁用端口,请使用 setserial 将其设置为 “uart none”。这不会被保存。/etc/serial.conf 的格式似乎就像在命令行中 “setserial” 之后放置的参数一样,每个端口一行。如果你不使用自动保存,你可以手动编辑 /etc/serial.conf。

为了强制将 setserial 设置的当前设置保存到配置文件 (serial.conf) 中,而无需关机,请执行通常在关机时发生的操作:运行 shell 脚本 /etc/init.d/{set}serial stop。“stop” 命令将保存当前配置,但串口仍然可以正常工作。

在某些情况下,你可能会同时安装了旧的和新的配置方法,但希望只有其中一种在启动时运行。Debian 将过时的文件标记为 “...pre-2.15”。

IRQs

默认情况下,ttyS0 和 ttyS2 将共享 IRQ 4,而 ttyS1 和 ttyS3 共享 IRQ 3。但是,虽然共享串行中断(在运行程序中使用它们)对于 PCI 总线来说是可以的,但对于 ISA 总线来说是不允许的,除非你:1. 拥有 2.2 或更高版本的内核,并且 2. 你已经编译了对它的支持,并且 3. 你的串行硬件支持它。请参阅 Serial-HOWTO:中断共享和内核 2.2+。

如果你只有两个串口,ttyS0 和 ttyS1,那么你仍然可以,因为对于不存在的设备,IRQ 共享冲突不存在。

如果你添加一个传统的内部调制解调器(没有即插即用)并保留 ttyS0 和 ttyS1,那么你应该尝试找到一个未使用的 IRQ 并在你的串口(或调制解调器卡)中设置它,然后使用 setserial 将其分配给你的设备驱动程序。如果 IRQ 5 没有被声卡使用,则可以将其用于调制解调器。

笔记本电脑:PCMCIA

如果你有笔记本电脑,请阅读 PCMCIA-HOWTO 以获取有关串行配置的信息。对于主板上的串口,setserial 的使用方式与台式机相同。但是对于 PCMCIA 卡(例如调制解调器),情况就不同了。PCMCIA 系统的配置应自动运行 setserial,因此你无需运行它。如果你运行它(通过脚本文件或通过 /etc/serial.conf),它可能会有所不同并导致问题。serial.conf 的自动保存功能不应保存任何 PCMCIA 卡的内容(但 Debian 在 2.15-7 版本之前是这样做的)。当然,始终可以使用 setserial 来查找驱动程序如何为 PCMCIA 卡配置。

15.4 Stty

简介

stty 完成了串口的大部分配置,但由于应用程序(和 getty 程序)经常处理这个问题,你可能不需要经常使用它。如果你遇到问题或想查看端口是如何设置的,它会很方便。它还配置了终端接口,这不仅被串口使用,而且在你每次在 Linux 中使用命令行界面时也会使用。尝试在你的终端/控制台中键入 “stty -a” 以查看它现在的设置方式。也尝试在不带 -a (all) 的情况下键入它,以获得一个简短的列表,显示它与 “normal” 的设置方式有何不同,“normal” 是使用命令 "stty sane" 设置的方式。除非你想成为一名串行历史学家,否则不要试图学习所有设置,因为许多设置仅适用于 1970 年代缓慢的古董哑终端。大多数默认设置应该可以正常工作。

stty 在 man 页面中进行了文档化,并在 info 页面中进行了更详细的说明。键入 "man stty""info stty"

许多 stty 选项(或设置)都以 “o”(输出)或 “i”(输入)开头。例如:onlcr。输出是字节流出计算机,而输入是字节流入计算机。“视角” 是计算机,而不是串口或连接到串口的设备。例如,接收到的输入数据通过电缆进入,并进入串口芯片。该芯片在将来自串行的位转换为并行表示后,然后将其(通过程序读取)发送到主计算机内存中的大型串口缓冲区。因此,芯片既有输入也有输出,但由于它是计算机的输入数据,因此其输出被认为是输入。输出流经该芯片的情况类似。“输入” 和 “输出” 是指相对于计算机而不是串口硬件(芯片)的流动方向。

setserial 仅处理实际的串口,而 stty 用于终端,无论它们是通过串口、网络访问,还是通过 Linux PC 显示器上的虚拟终端或 GUI 终端窗口(如 xterm)访问。对于 PC 显示器、xterm 或网络,许多 stty 设置都是没有意义的。更改波特率等似乎并没有实际作用。

以下是 stty 配置的一些项目:速度(位/秒)、奇偶校验、位/字节、停止位数、剥离第 8 位?、调制解调器控制信号、流控制、中断信号、行尾标记、更改大小写、填充、缓冲区溢出时发出哔哔声?、将你键入的内容回显到屏幕、允许后台任务写入终端?、定义特殊(控制)字符(例如按下哪个键进行中断)。有关更多详细信息,请参阅 stty 的 man 或 info 页面。另请参阅 man 页面:termios,其中涵盖了 stty 设置的相同选项,但(截至 1999 年中期)涵盖了 stty man 页面未能提及的功能。有关某些特殊字符的用法,请参阅 特殊(控制)字符

在 getty 的某些实现(getty_ps 包)中,通常会给 stty 的命令被键入到 getty 配置文件中:/etc/gettydefs。即使没有这个配置文件,getty 命令行也可能足以进行设置,从而使你不需要 stty。

人们可以编写 C 程序来更改 stty 配置等。查看其中一些文档可能有助于更好地理解 stty 命令(及其许多可能的参数)的用法。Serial-Programming-HOWTO 可能有用,但它已过时。手册页:termios 包含对 C 语言结构(类型为 termios)的描述,该结构将 stty 配置存储在计算机内存中。此 C 结构中的许多标志名称与 stty 命令的参数几乎相同(并且执行相同的操作)。

流控制选项

要设置硬件流控制,请使用 “crtscts”。对于软件流控制,有 3 个设置:ixon、ixoff 和 ixany。

ixany:主要用于终端。在流控制停止后,按任意键将重新启动流。如果你使用 “stop scroll” 键(或类似键)停止滚动,则按任意键将恢复滚动。它很少需要,因为再次按下 “scroll lock” 键将执行相同的操作。

ixon:使端口能够监听 Xoff 并在收到 Xoff 时停止传输。同样,如果收到 Xon,它将恢复传输。

ixoff:使端口能够在主内存中的缓冲区几乎已满时,发送 Xoff 信号到传输线。它可以保护端口所在的设备免受溢出。

对于连接到快速 PC 的慢速哑终端(或其他慢速设备),PC 的端口不太可能溢出。因此,你很少真正需要启用 ixoff。但通常会启用它 “以防万一”。

在 “外部” 终端上使用 stty

如何使用 stty 查看或设置你当前未使用的终端?如果外部终端正在使用中并且在其上运行了 shell,通常不可能这样做。在其他情况下,例如在另一个终端(例如 tty1)上键入时处理 ttyS2,请使用 stty -F /dev/ttyS2 ...(或使用 --file 而不是 F)。如果 ... 是 -a,它将显示所有 stty 设置(-a 表示全部)。

但是,如果外部终端(本例中为 ttyS2)在其上运行了 shell,那么你所看到的很可能是具有欺骗性的,并且尝试设置它将不起作用。虚拟终端也存在此问题,例如从 tty1 处理 tty3 等。请参阅 终端上的两种接口模式 以了解它。

终端上的两种接口模式

当使用启用命令行编辑的 shell(例如 bash)时,存在两种不同的终端接口(或线路规程:当你键入 stty -a 时看到的内容)。当你在现代 shell 中在命令行中键入时,你有一个临时的 “raw” 接口(或原始模式),其中每个字符都由 shell 的命令行编辑器在你键入时读取。一旦你按下 <return> 键,命令行编辑器就会退出,并且终端接口会从原始模式更改为终端的名义 “cooked” 接口(cooked 模式),使用上次 cooked 模式使用的 stty 配置(shell 已保存它,并且它会被恢复)。此 cooked 模式会持续到下一个提示符发送到终端为止(这只是很小的一部分时间),但它在命令执行期间(或至少在命令执行的第一阶段期间)存在。请注意,人们永远不会在此 cooked 模式下键入任何命令,但在原始模式下在命令行中键入的内容会在 cooked 模式下由 shell 开始执行。

当提示符发送到终端时,终端从 “cooked” 模式变为 “raw” 模式(就像你启动编辑器(如 vim)时一样。提示符表示启动命令行编辑器。“原始” 模式的设置仅基于从 “cooked” 模式获取的基本 stty 设置。原始模式保留这些设置,但更改其他几个设置以将模式更改为 “raw”。它根本不基于先前 “原始” 模式中使用的设置(与 “cooked” 模式形成对比,后者由 shell 恢复为其先前的设置)。因此,如果有人使用 stty 来更改原始模式的设置,则这些设置将在终端按下 <return> 键后立即永久丢失。

现在,当有人键入 stty 以查看终端接口时,可能会获得 cooked 模式或原始模式的视图。你需要弄清楚你正在查看哪一个。如果你从外部终端(而不是你当前正在键入的终端)使用 stty,那么你很可能会看到原始模式设置,因为终端几乎一直处于原始模式。所做的任何更改都只会对原始模式进行,并且当有人在你尝试 “设置” 的外部终端上按下 <return> 时,这些更改将丢失。但是,如果你键入 stty 命令以查看/更改你正在使用的终端的配置,然后按下 <return>,情况就不同了。<return> 将终端置于 cooked 模式,并且你的更改在 shell 返回到原始模式之前被 shell 保存。由于进入原始模式不会更改所有 stty 设置,因此你通过 stty 进行的一些更改可能仍然存在于原始模式中,并且不会被 <return> 破坏。

这种情况可能会造成问题。例如,假设你损坏了你的终端接口,使其无法显示你键入的内容等。要恢复它,你可以转到同一台 PC 上的另一个终端,然后键入 “stty -F dev/ttyS1 sane”(或类似内容)。它将不起作用,因为终端处于原始模式!当然,你可以尝试在已损坏的终端上键入 “stty sane ...”,但你看不到你键入的内容。以上所有内容不仅适用于哑终端,而且适用于 PC 显示器上使用的虚拟终端以及 X 中的终端窗口。换句话说,它适用于几乎每个使用 Linux 的人。

幸运的是,当你启动 Linux 时,任何在启动时运行 stty 的文件都可能处理没有 shell 在其上运行的终端(或没有终端的串口),因此对于这种特殊情况没有问题。

stty 命令应该放在哪里?

如果你需要每次计算机启动时都让 stty 设置串口接口,那么你需要将 stty 命令放在每次计算机启动时(Linux 启动时)都会执行的文件中。它应该在串口被使用之前运行(包括在端口上运行 getty)。有很多可能的地方可以放置它。如果它被放置在多个地方,而你只知道(或记住)其中一个地方,那么很可能会发生冲突。因此,请务必记录你所做的事情。

一个放置它的位置是在系统启动时运行 setserial 的同一个文件中。位置取决于发行版和版本。最好将其放在 setserial 命令之后,以便首先完成底层操作。如果你的 /etc 树中有目录,其中每个文件都在启动时执行(System V Init),那么你可以为此目的创建一个名为 “stty” 的文件。

过时的重定向方法

在 2000 年左右之前,如果你想在外部终端上使用 stty,你需要使用重定向运算符 “<”。例如,要在 tty1 上使用 stty 在 ttyS2 上,你将键入:stty .... < /dev/ttyS2。2000 年之后(如果你的 setserial 版本 >= 1.17 且 stty >= 2.0),则创建了一种更好的方法,即使用 -F 选项:stty -F /dev/ttyS2。当旧的重定向方法失败时,这将起作用。

上面的旧重定向示例使 ttyS2 成为 stty 的标准输入。这为 stty 程序提供了到 “文件” ttyS2 的链接,以便它可以 “读取” 它。但是,它不是像人们可能期望的那样读取发送到 ttyS2 的字节,而是使用该链接来查找端口的配置设置,以便它可以读取或更改它们。在过去,有些人试图使用 ``stty ... > /dev/ttyS2`` 来设置终端。这不起作用。相反,它获取 stty 命令为你所在的终端(例如 tty1)正常显示的消息,并将此消息发送到 ttyS2。但它不会更改 ttyS2 的任何设置。

这是旧的重定向运算符的一个问题(如果你改用较新的 -F 选项,则不会发生这种情况)。有时,在尝试使用 stty 时,命令会挂起,并且什么也不会发生(即使在按下 <return> 后,你也不会获得下一个命令的提示符)。这很可能是由于端口卡住,因为它正在等待断言其中一个调制解调器控制线。例如,除非你已设置 “clocal” 以忽略调制解调器控制线,否则如果未断言 CD 信号,则端口将不会打开,并且 stty 将无法对其工作(除非你使用较新的 -F 选项)。硬件流控制似乎也存在类似的情况。如果端口的电缆甚至没有需要断言的引脚的导体,那么就没有简单的方法来阻止挂起。

摆脱上述挂起的一种方法是使用较新的 -F 选项并根据需要设置 “clocal” 和/或 “crtscts”。如果你没有 -F 选项,那么你可以尝试在端口上运行一些程序(例如 minicom),这将强制它即使控制线说不要操作也进行操作。然后,希望此程序可能会设置端口,使其将来不需要控制信号即可打开:clocal 或 -crtscts。要使用 “minicom” 执行此操作,你可能需要重新配置 minicom,然后退出并重新启动它。与其如此麻烦,不如简单地重新启动 PC,或者通过使用虚拟终端来杀死进程,使用 “top”(或 “ps” 获取进程号,然后使用 “kill” 杀死该进程)。

过时的重定向方法(在更高版本中仍然有效)是键入 ``stty ... < /dev/ttyS2``。如果使用 -F 的新方法有效,但过时的方法挂起,则意味着端口由于未断言调制解调器控制线而挂起。因此,过时的重定向方法可能仍然对故障排除有用。

15.5 Terminfo 和 Termcap(简述)

有关 termcap 的更详细讨论,请参阅 Terminfo 和 Termcap(详细)。你运行的许多应用程序都使用 terminfo(以前称为 termcap)数据库。这对于每种型号或类型的终端(例如 vt100)都有一个条目(或文件),并告知终端可以做什么,发送哪些代码来执行各种操作,以及发送哪些代码到终端以初始化它。

由于许多终端(以及 PC)也可以模拟其他终端并具有各种 “操作模式”,因此对于给定的物理终端,可能有多个 terminfo 条目可供选择。它们通常具有相似的名称。getty 的最后一个参数(对于 agetty 和 getty_ps)应该是你正在使用的终端(或终端仿真)的 terminfo 名称(例如 vt100)。

terminfo 不仅指定终端能够做什么并公开发送到终端以使其执行这些操作的代码。它还指定 “粗体” 的外观(是反相视频还是高强度等)、光标的外观、字母是黑色、白色还是其他颜色等。在 PC 术语中,这些被称为 “偏好设置”。它还指定要发送到终端的初始化代码(类似于发送到调制解调器的初始化字符串)。Linux 不会自动将此类字符串发送到终端。请参阅 初始化字符串。如果你不喜欢屏幕上显示的外观和行为方式,你可能需要编辑(然后更新)terminfo(或 termcap)文件。请参阅 Terminfo 编译器 (tic),了解如何更新。

15.6 设置 TERM 和 TERMINFO

这些是终端的两个环境变量:TERM 和 TERMINFO,但你可能不需要对它们做任何事情。TERM 必须始终设置为你正在使用的终端类型(例如 vt100)。如果你不知道类型(名称),请参阅 我的终端的 terminfo 名称是什么?。TERMINFO 包含 terminfo 数据库的路径,但如果数据库位于默认位置,则可能不需要它(或者 TERMINFO 可以由 Linux 发行版附带的文件自动设置)。你可能想查看 编译数据库位置

幸运的是,getty 程序通常会在登录前为你设置 TERM。它只是使用在 getty 的命令行(在 /etc/inittab 中)上指定的终端类型。这允许应用程序查找你的终端名称,然后在 terminfo 数据库中查找终端功能。有关 TERM 的更多详细信息,请参阅 TERM 变量

如果找不到你的 terminfo 数据库,你可能会在终端上看到有关它的错误消息。如果发生这种情况,就应该检查 terminfo 所在的​​位置,并在需要时设置 TERMINFO。你可以通过使用 “locate” 命令搜索常见的 terminfo 文件(例如 “vt100”)来找到 terminfo 数据库的位置。确保你的终端在此数据库中。设置 TERMINFO 的一个示例是:export TERMINFO=/usr/share/terminfo(将其放在 /etc/profile 或类似文件中)。如果此数据库中你的终端数据不符合你的喜好,你可能需要编辑它。请参阅 Terminfo 和 Termcap(简述)

我的终端的 terminfo 名称是什么?

你需要确切的名称才能设置 TERM 环境变量或提供给 getty。termcap 和 terminfo 数据库应使用相同的名称,因此你只需要找到一次即可。终端通常具有别名,但如果显示多个名称,请使用第一个。

要找到它,请尝试查看 /etc/termcap... 文件(如果你有)。如果没有,则查看 terminfo 树(请参阅 编译数据库位置)或尝试查找 terminfo 源代码文件(请参阅 源代码数据库位置

15.7 很少需要的 /etc/ttytype 文件

配置文件 /etc/ttytype 用于将 /dev/ttySn 的映射到每个 terminfo 的终端名称。tset/reset 使用它,但如果 TERM 环境变量已正确设置,则不需要此文件。由于 Linux getty 为每个 tty 设置 TERM,因此你不需要此文件。在其他类 Unix 系统(例如 FreeBSD)中,文件 /etc/ttys 将 ttys 映射到更多内容,例如适当的 getty 命令和连接类别(例如 “拨号”)。Linux ttytype 的示例行:vt220 ttyS1

15.8 登录限制

默认情况下,root 用户可能无法从终端登录。要允许这样做,你必须根据手册页 “securetty” 创建(或编辑)文件 /etc/securetty。要限制某些用户和/或某些终端等的登录,请编辑 /etc/login.access(这取代了旧的 /etc/usertty 文件??)。/etc/login.def 确定是否要使用 /etc/securetty,并且可以对其进行编辑,以使 /etc/securetty 不是必需的(或未使用)。/etc/porttime 限制某些 tty 和用户可以使用计算机的时间。如果用户登录尝试失败次数过多,则可能会禁止该用户再次登录。请参阅手册页 “faillog” 以了解如何控制此行为。

15.9 仅当 TERM=my_term_type 时才运行命令

有时,人们希望仅针对某种类型的终端在启动时执行某些命令。对于 stty 命令执行此操作没有问题,因为人们使用重定向运算符 < 来指定命令用于哪个终端。但是 shell 别名或函数呢?你可能想为 ls 命令创建一个函数,以便仅在彩色终端或控制台上对目录列表进行颜色编码。对于单色终端,你希望使用相同的函数名称(但函数体不同),这将使用符号代替颜色编码。将要针对不同终端不同的此类函数定义放在哪里?

你可以将它们放在 /etc/profile 中的 “if” 语句中,该语句在每次登录时在启动时运行。“if” 条件语句仅在终端是指定类型时才定义某些函数等。

ls 函数示例

虽然这个 if 语句的大部分功能都可以在 dircolors 的配置文件中完成,但这里以 bash shell 为例进行说明。例如,它可以让 ls 命令在终端类型为 “linux” 时显示颜色,但在使用哑终端 (VT220) 时使用 ls -F。请注意,`-F` 选项使用符号来提供文件类型信息,就像颜色编码一样。因此,即使彩色显示可能看起来更令人印象深刻,但仍有替代颜色来使用 ls 命令的方法。


if [ "$TERM" = linux ]; then
    eval `dircolors`;
elif [ "$TERM" = vt220 ]; then
    ls () { command ls -F $* ; }# to export the function ls():
    declare -xf ls
else echo "From /etc/profile: Unknown terminal type $TERM"
fi

15.10 字符映射:mapchan

有一个名为 “mapchan” 的免费程序,它可以根据用户提供的映射表,将终端键盘输入的字符(字节)映射为不同的字符。它还可以映射发送到屏幕的字符(输出)。这对于为外语字母表重新映射键盘非常有用。大多数发行版似乎没有提供它(如果任何发行版提供,请告知)。源代码由 Yura Kalinichenko (乌克兰,部分代码为俄语) 提供。 下载 mapchan 等