Eagles BBS

作者:Ray Rocker
Eagles BBS 的诞生

一切都始于将 Pirates Bulletin Board System (PBBS) 1.6 版本移植到 ESIX/System V。Pirates BBS 由 Ed Luke 于 1989 年夏天在密西西比州立大学编写,并通过现已解散的 Mars Hotel BBS 在互联网上传奇。两位高中好友,当时是南密西西比大学(也是我的母校)的学生,对互联网 BBS 产生了足够的兴趣,从而在计算机科学系的机器上获得了一席之地。我们一起移植了当时严格意义上是 BSD 代码的 Pirates 到 ESIX。Eagle's Nest BBS 于 1992 年 4 月 14 日诞生。

正如任何 Eagle's Nest 的早期用户都会告诉你的那样,这并不容易也不漂亮,但它最终还是成功了。在这个过程中,我从其他 BBS 中添加了许多 Pirates 1.6 没有的功能,引入了后来 Pirates 版本中的东西,甚至还有一些原创的想法。它原本只是一个简单的 PBBS 移植版本,但人们开始对我们“增强的 Pirates”产生兴趣,所以我们给它起了自己的名字——Eagles BBS——以纪念 Eagle's Nest,以及我们学校的吉祥物,这个名字来源于此。

我们在 1992 年 8 月发布了 Eagles BBS 1.0,此后我对其进行了四次更新。我的合作伙伴后来退出了这个项目。感谢互联网上许多热心人士,我收到了它到相当多其他操作系统的移植版本。在发现 Linux 之前,这些移植版本都没有受到过多的关注。在深入探讨 Linux 之前,我应该先介绍一些关于软件本身的技术信息。

什么是 Eagles BBS?

Eagles BBS 是一个独立的、多功能的公告板软件包,通过登录到特殊帐户来访问,可以通过 telnet、拨号或终端。EBBS 系统由三个可执行文件组成:bbsrf、bbs 和 bbs.chatd。

bbsrf 是一个特殊的 setuid root 登录 shell。用户 “bbs” 被放置在 /etc/passwd 中,并将 bbsrf 作为其登录 shell。bbsrf 可选择从 /etc/utmp 中删除登录记录,使其对 “finger” 和 “who” 命令不可见。然后,它会对 bbs 主目录执行 chroot,再对 “bbs” 执行 setuid,并执行 bbs 程序。

chroot 的目的是为了安全。有了 chroot,任何可能从 bbs 程序中突破到 shell 的人都只能访问 bbs 主目录,而不能访问主机系统的其他部分。由于 chroot,BBS 完全包含在 bbs 帐户的主目录中,除了 /etc/passwd 中的记录。BBS 在运行时所需的所有文件都复制在 ~bbs 下;例如,/etc/termcap 文件被复制到 ~bbs/etc,共享 C 库被复制到 ~bbs/lib,等等。这是一个主要的移植难题。稍后会详细介绍。

bbs 程序完成大部分工作。首先,它会提示用户输入用户名和密码,这些用户名和密码通过在 ~bbs/.PASSWDS 文件中查找来验证。这很像标准系统登录程序的工作方式,只是 ~bbs/.PASSWDS 是一个二进制文件。登录后,用户可以浏览一系列菜单,访问 BBS 的各项功能。

菜单系统是全屏的,并使用终端功能数据库(~bbs/etc/termcap)来高效地操作终端。EBBS 不使用

libcurses,而是使用了从 Pirates 时代开始的精简、简化的 curses 仿制品。由于用户通常是通过 telnet 连接进来的,BBS 并不总是能知道用户的终端类型;但是,菜单中有一个选项供用户指定终端类型。菜单系统是分层的;从顶层主菜单可以访问子菜单,例如 Talk 菜单、Xyz 菜单、File 菜单和 Mail 菜单。菜单中提供的功能大致可以分为七类,我将简要介绍一下

  1. 发送/阅读邮件:邮件可以发送给 BBS 的其他用户。此外,还包括将 BBS 邮件(和帖子)转发到远程互联网邮箱的功能。不支持从互联网接收邮件;由于用户在操作系统方面没有真正的帐户,因此这将有点棘手。

  2. 发布/阅读消息:操作员最多可以设置 80 个版块,用户可以在这些版块上发布公共消息。操作员可以使用权限掩码将版块限制为某些用户组。BBS 版块不与 Usenet 或 Fido 等外部消息服务接口。

  3. 文件上传/下载:BBS 具有文件上传和下载功能,支持 Zmodem 和 Kermit 等串行线路协议,允许文件直接从家用计算机传输到 BBS。但是,通过缓慢的互联网链接使用这些协议通常效果不佳。大多数站点还提供对其文件库的 ftp 访问,因为它更适合远程网络传输。

  4. Talk:提供 Unix “talk” 实用程序的模拟,允许与其他 BBS 用户进行一对一的会话。talk 功能不允许连接到像 Unix talk 那样的远程系统。

  5. Chat:BBS 内置了本地聊天系统。最多可以配置四个独立的房间。当第一个用户进入房间时,会生成一个聊天守护进程(bbs.chatd,构成 BBS 的第三个程序)进程,用于将消息中继给房间内的所有用户。许多类似 IRC 的功能已被添加到聊天功能中,例如私人消息、动作以及显示谁已登录的命令。

  6. 用户实用程序:用于设置昵称(不是登录用户名)、终端类型以及邮件/帖子转发地址等。这些都在 Xyz 菜单上。

  7. 管理员实用程序:这些只有特权用户才能访问。其中包括帐户和版块的创建和删除、设置帐户的权限标志、邮件清理以及欢迎屏幕编辑等。

正如你所看到的,EBBS 像它的 Pirates 前身一样,大部分情况下都是独立的——与其他服务的连接很少。这在很大程度上是由于 chroot 的原因。一些站点已将 Internet Relay Chat 客户端集成到其 BBS 中,但即使这样,内置的聊天系统仍然非常受欢迎。EBBS 在计算机新手之间似乎很受欢迎,因为它具有简单的菜单系统和内置编辑器。同样,高级用户有时会因其局限性而感到沮丧。

PBBS 或 EBBS 系统的孤立性质鼓励了其常客之间一些有趣的关系,尤其是在一个系统存在一段时间之后。发生的一些事情甚至会让最热衷于肥皂剧的粉丝感到惊讶!不过,我将把这个话题留到另一篇文章中讨论。

进入 Linux

回到 Eagle's Nest,在 1993 年末,我们决定将其主机(一台 1990 年代的 25 MHz Cheetah Gold 486 PC)从 ESIX 切换到 Linux,因为 Linux 提供了更多的功能。因此,我被要求再次进行移植。这给了我动力,让我最终购买了一块新的硬盘,并在我自己的 PC 上安装了一个真正的操作系统。凭借 0.99.12 内核和 SLS 1.03 发行版,我着手处理摆在我面前的任务,并发现从我的 System V Release 4 移植的代码到 Linux 非常容易。以下是我遇到的问题列表,对于任何将网络应用程序移植到 Linux 的人来说,这应该是一个初步的 “注意事项” 列表。你会注意到许多与 Michael K. Johnson 在《Linux Journal》第 1 卷第 1 版的优秀文章 “Porting To Linux” 中提到的相同内容。

  • 信号处理。BSD 和 SVR4 通过 signal(2) 调用,具有可重启信号。在 Linux 中,您必须显式请求 BSD 信号处理或使用略有不同的 sigaction 接口。[编者注:请参阅第 33 页 Linux 编程提示的最后一节。] 对我来说,只需更改代码以假设信号处理程序需要重置就更容易了。

  • select(2) 和超时参数。像许多应用程序一样,EBBS 假设 select(2) 会保持 timeval 结构的内容不变。如果您在循环中调用 select,则必须重置超时。

  • FD_SET 宏及其同类宏位于 <sys/time.h> 中。这不应该拖累任何人的移植工作,但值得一提,因为大多数 Unix 系统将这些宏放在 <sys/types.h> 或 <sys/select.h> 中。

  • 终端 I/O。许多 BSD 源代码依赖于 gtty(2) 和 stty(2) 以及晦涩的 ioctl 标志。当我意识到它们不在基本 C 库中时,我将其全部更改为 termio。无论如何,这可能是一个好主意,即使我必须为了 NeXT 移植而放回 PBBS 的 BSD 源代码。

Eagle's Nest 于 1993 年 10 月使用 Linux 上线,此后我们一直忠实地跟随着最新的修订版。与我们在 ESIX 上运行的经验相比,Linux 既有好的一面,也有坏的一面。

好的一面:ext2 文件系统和内核本身。一些需要大量文件访问的 BBS 操作,特别是扫描新消息和 “访问” 功能(将所有消息标记为已读)在 ESIX 下非常缓慢,但在 Linux 下却快如闪电——当然,硬件完全相同。以前可能需要十秒钟的新消息扫描现在在一两秒钟内就可以完成。Linux 所做的所有缓冲确实对我们产生了影响。

坏的一面:TCP/IP 网络。Eagle's Nest 有时每天会收到几百次登录,并且它与匿名 ftp 服务和 WWW 服务器共享带宽。因此,内核在网络方面受到了相当严重的打击。从 0.99 pl13 到当前的 1.1.8 版本,我们看到了许多奇怪的事情,例如 inetd 死亡、频繁重启以恢复网络以及连接在连接和关闭时挂起。幸运的是,情况一直在好转,截至 1.1.8 版本,唯一剩下的烦人问题是偶尔在连接时挂起,并且仅当它必须处理长时间延迟或丢包时才会发生。不幸的是,这种情况在互联网上并不少见。

除此之外,我们在 Eagle's Nest 对 Linux 非常满意,我现在几乎完全使用它。我的磁盘上还有另一个操作系统,但这只是一个模糊的记忆。它的名字以 D 开头。Doom!是的,就是它!

展望未来

正如我已经提到的,EBBS 的任何移植版本都没有像 Linux 移植版本那样引起如此浓厚的兴趣。Linux 的全球范围尤其明显。除了南极洲之外,每个大陆都涌现了对 Linux 版 EBBS 的兴趣,而我几乎没有做任何宣传!请参阅侧边栏,了解互联网上可用的 Linux EBBS 系统的不完整列表。

在完成 Linux 移植后不久,我意识到当前的代码对于任何更重要的添加或增强来说都变得太混乱了。以下是阻碍当前 EBBS 版本发展的一些因素

  • chroot。它是一个安全功能,但也是一个移植噩梦。每种 Unix 版本都需要在 ~bbs 下放置一组不同的系统文件才能使系统正常工作,而且实际上有些文件尚未弄清楚。它也使安装脚本变得一团糟。考虑共享库。在某些系统中,它们位于 /lib 中,在某些系统中位于 /usr/lib 中,在某些系统中位于 /usr/shlib 中。在某些系统中,您只需要 libc.so.*,而在其他系统中(如 Solaris),您需要六个或更多共享库。这真是一团糟。在最新版本 (2.2) 中,我添加了一个编译时选项,可以在需要时关闭 chroot。安全地摆脱它会更好。

  • 由于 chroot,几乎不可能将外部系统的钩子添加到 BBS 中。许多 BBS 运营商表示需要双向互联网邮件和 Usenet,而有了 chroot,即使不是不可能,使用 EBBS 来做到这一点也是不切实际的。BBS 本身之外的一些钩子已经成功完成,例如传出邮件/帖子转发以及 IRC、4m 和 Gopher 客户端。

  • 跟踪已读帖子以及 .DIR 文件。Pirates BBS 跟踪哪个用户已读过哪个帖子的方式是,每个帖子在与每个版块关联的 .DIR 文件中都有一个记录。这些记录包含帖子的所有者和标题等信息,以及系统中每个可能帐户的一个字节。当用户阅读帖子时,他们在帖子在 .DIR 中的记录中的字节会被标记为已读。同时更新这些文件所涉及的竞争条件非常普遍且难以防范。此外,由于每个 .DIR 记录都必须是已知大小,因此 BBS 帐户的数量在编译时是固定的,这不是一个理想的功能。

因此,去年 11 月,我开始进行完全重写,目标是保留所有或大部分现有的 EBBS 功能,但采用全新的基础。五个月后,我几乎完成了第一个版本。这是一个业余时间的项目,加上几次从头开始的重写,因为我感到沮丧,所以进展缓慢。

新版本的开发 100% 在 Linux 上进行,我正在尽力保持 POSIX 兼容性,以便可以轻松完成移植。以下是一些正在开发的功能

  1. 不再使用 chroot。见上文。出于这个原因,我将取消 Shell Escape 菜单功能,因为它有风险,并且禁止在我的代码中的任何地方使用 system(3) C 库调用,因为它也会生成一个 shell。简而言之,我正在努力使突破成为不可能。

  2. 运行时配置,以允许二进制分发(Linux 方式!)。目前,所有 EBBS 可选功能和访问权限都必须在编译时配置。BBS 在运行时读取的一组初始化文件将是一个重大改进。特别是,我正在尝试使任何可能在发行版之间变化的东西都可配置,例如用于转发的邮件程序。此外,我计划使 BBS 使用的所有文件都是 ASCII 而不是二进制,这样如果出现问题,可以轻松地使用编辑器进行修补。这包括 passwds 文件和 boards 文件。

  3. 不再使用 .DIR 文件。我将把显示用户已读过哪些帖子/邮件的位存储在每个用户的配置文件中,从而消除对 .DIR 文件的需求。而且,它消除了对帐户数量的限制。

  4. 用户界面和 BBS 核心的分离,仅通过精心定义的 API 集进行交互。这将允许任何想要构建自己的用户界面(例如 X-Windows GUI)的人轻松地做到这一点,只需了解用于访问 BBS 核心功能的 API 即可。我计划编写一个网络 API 集,允许客户端通过尚未定义的基于 TCP/IP 的协议连接到远程 BBS 服务器。这样,菜单移动和编辑等操作可以在客户端完成,而不会出现越来越拥挤的 “信息高速公路” 上常见的延迟。

  5. 还有一些现在没有的功能:群发邮件、通过邮件回复帖子作者、每个版块的管理员、添加聊天功能,例如私人房间等等。

在撰写本文时,这个重写版本几乎已准备好进行初始测试,只有少数功能尚未添加。如果一切顺利,当您阅读本文时,某个版本将公开发布。我暂时将其命名为 Eagles BBS 3.0,并计划在 GNU copyleft 或类似许可下分发;当然,一切都可能在此时发生变化。

我希望这项工作能为已经令人印象深刻的 Linux 软件阵列增添有用的内容。似乎对 Linux 公告板软件的需求是存在的。对我来说,这是一次富有启发性和教育意义的经历,尽管非常耗时。gcc、gdb 以及无数其他工具提供的开发环境可以说是最好的。起初,文档还有些不足,但现在已经有了显着改进。我想鼓励其他程序员也用他们最喜欢的业余项目做同样的事情——Linux 社区对从建议到开发再到分发的一切都非常积极响应和乐于助人。我很荣幸能参与其中。

在哪里获取 Eagle BBS

运行 Linux 的互联网 BBS

Ray Rocker (rrrocker@ingr.com) (rock@seabass.st.usm.edu) 目前居住在美国阿拉巴马州亨茨维尔,并在那里担任软件分析师。在那些难得的不用面对 SVGA 显示器的时候,他喜欢喝啤酒、举重、慢跑、大学橄榄球和篮球,并且通常可以在业余无线电频段的竞赛周末找到他,呼号为 WQ5L。

加载 Disqus 评论