我曾经听说过一个巧妙的错误,它是由缺少某些电子设备的某些硬件和某些只是按指示执行操作的软件的交互引起的。它与你在一台对世界来说已经死了的机器上使用的“最后手段的访问”有关:控制台。
想象一个运行着数万台 Linux 机器的数据中心。有时,它们会中断并脱离网络。幸运的是,它们附有一个“迷你我”类型的东西,可以让您访问串行控制台。这与在盒子里插入显示器和键盘并不完全相同,但它经常足以在不上车(或更糟)的情况下从真正的混乱中挖掘出来。
似乎人们一直在尝试启动他们系统上的控制台,但没有得到预期的结果。应该发生的是他们连接,按一次或两次 ENTER,它应该弹出这样的回复:
Linux xyz (something-arcane.foo.bar.company.example)
登录:
他们会按 ENTER 键,充其量也不会发生任何事情。有时,它只是一团糟。显然,如果机器无法通过网络访问,我们就无法对其进行解码,因此需要花费一些时间才能找到控制台损坏但仍可通过网络访问的机器。
我们的发现很有趣。实际提出登录提示的是一个名为 getty(或某些变体,如“agetty”)的进程。它的工作只是坐在那儿处理串行线路,读取您的登录名,然后让您连接到登录过程以从那里继续。
为此,agetty 和主机上的串行端口必须在波特率方面与客户端上的串行端口一致(以及其他事项,但让我们保持这个故事简单)。如果你让其中一端不同步,另一端将不知道你在说什么。
如果您以前从未遇到过这种情况,请想象您是一只只能听到一组特定音高的口哨声的狗:一个高,一个低。使用错误频率集的人对您来说意义不大。波特率有点像那样。
不知何故,这些机器上的 getty 进入了一种状态,即它运行的波特率与提供对串行控制台的远程访问的实际系统不同。我们知道 getty 中有一个功能会寻找“串行中断” (想象一下狗类比中的一个非常长的低声哨子)并且它会导致它在波特率列表中轮换。
此功能可能旨在避免鸡生蛋还是蛋生鸡的情况,即您将终端插入某个 Unix 机器上的串行端口,但无法与其通信,因为它处于您无法更改的某种速率。所以,你一直用 BREAKs 戳它,直到它到达你可以到达的地方,然后你从那里继续。
我们没有能力从远程控制台客户端系统中断 BREAK,那又如何呢?这是两个子系统,它们是一个更大的机架式野兽的一部分,所以它们之间不像是老式的串行电缆。它们可能只是某处板上的痕迹。有些事情没有加起来。
这是当我从真正了解这些东西的人(即,不是我)那里听到一些非常巧妙的故障排除时:他们知道在其他硬件上,他们已经在两个系统之间安装了缓冲区,以防止启动时的低电状态触发打破行为。
不幸的是,他们没有在这种特定类型的硬件上做同样的事情。它缺少必要的电子魔法(他们称之为“上拉”)来防止控制器重新启动时事情失控。糟糕。
他们的解决方案是在他们的 getty 配置中禁用该行为。由于服务器被硬连线到它曾经拥有的唯一客户端,因此没有理由让它接受 BREAK 来做那种事情。
就是这样。直到今天,这些机器可能仍然有相同的电气情况,并且当它们的控制器重新启动时会发送各种疯狂的垃圾,但至少它们的 gettys 不会在意。
如果您是一个从未在模糊的 Unixy 机器上做过连续工作的人,并且您在假期里感到无聊,也许现在是您检查它的时候了。找到一个带串口的盒子(祝你好运!),在上面放一个 getty,然后将它连接到另一个带串口的盒子(祝你好运!),看看你是否能让它们互相交谈。
如果做不到这一点,请检查已经做过的人的魔法,然后再检查一些人。享受!