在中国接入互联网30周年之时,搭一台1994年的Linux服务器(一) 作者:蓬岸 Dr.Quest 编号:700400046 创建于:2024-05-30 04:28:38 修改于:2024-08-19 10:14:43 -------------------- 从1994年4月中国接入互联网(开通TCP/IP路由)至今已经整整30年了,其中由 中科院高能所设立的中国第一台WWW服务器,即http://ihep.ac.cn (Link: http ://ihep.ac.cn) 曾经使用过的第一台服务器是最常被提起的服务器设备之一。 (Image: https://picx.zhimg.com/v2-6aac57beaf54a91f8f2f77de2df596a4_720 w.jpg?source=d16d100b) 图片来自:http://www.ihep.cas.cn/zt/bepc30/jnwz/zwxd/201810/t20181015_ 5142417.html但几乎在所有回顾文章中,关于这台服务器的信息都只是一句简单 的“运行在486上的Linux”,但当时的Linux究竟是什么样子,配置和运行它又有 哪些挑战?这激发了我极大的好奇心。 (Image: https://pic1.zhimg.com/v2-e1a74a573adb8c4c7fce810d9d88b78e_720 w.jpg?source=d16d100b) 这是早期的IHEP网站唯一一张截图,从图中我们可以很容易看出,使用的浏览器 的NCSA Mosaic,而熟悉早期Linux的朋友们可能能辨识出它使用的窗口管理器是 FVWM。 (Image: https://picx.zhimg.com/v2-046bdb9936a583556570244bd960d670_720 w.jpg?source=d16d100b) 在如此有限的技术信息下试图复原中科院高能所当年的Web服务器显然很难做到 完全准确,在《计算机六十年》公众号文章《许榕生:从66届到互联网第一人 ( Link: https://mp.weixin.qq.com/s/69bFEhQjycbZe-ruLLVFrQ) 》中,拍摄了 高能所目前展示的情况:486电脑上运行着Windows 95。在我看来,这样的展示 仅完成了一半,因为以计算机作为历史上下文的展览里软件和硬件同样重要。我 希望能够通过实验考古的手段,搭建一套接近当时真实情况的软件环境,解析在 当时和现在运行它们可能遇到的挑战,并展现90年代初使用Linux作为Internet 服务器的情况。 Linux内核1.0和SLS 由于没有任何文章提到当时高能所使用的Linux发行版,因此我只能以“从近”和“ 从广”两个角度来选择,以1994年4~5月间,较新而且容易获得的发行版为基础。 一个最明显的信息是1994年3月Linux 1.0发布。而发行版上,最有可能的选项有 两个Softlanding Linux System 1.0.5(1994年4月5日),和Slackware 1.2.0. 1(1994年4月1日)。 在实际尝试了这两个发行版后,我选择了Softlanding Linux System,通常被称 作“SLS”,一个原因是它的容量更小,如果是需要33张软盘,而完整的Slackware 需要60张!同时它也更易于安装,在Slackware的安装过程中需要用户选择所需 要的安装包,在几乎没有包依赖管理的当时,很容易漏装某些依赖项而导致安装 的程序不能用,而SLS则提供“一键安装”选项。 在Linux世界中,易用性几乎从第一天开始就是一个重大挑战,以“Gentle Touch downs for DOS Bailouts”为口号的SLS以易用性的优势成为当时最流行的Linux 发行版,类似于今天Ubuntu的地位。 Gentle Touchdowns for DOS Bailouts直译成中文非常拗口,“DOS救援的温柔着 陆”,touchdown是美式橄榄球的得分动作,对中国读者来说很陌生,bailout这 个词作为“救助”则偏大,常用与国家或机构之间的经济援助,这句话大致可以翻 译为“为DOS用户提供温柔着陆的救援方案”。最后一个不算成立的理由,是对我 个人而言,SLS在地理上是最近的,其开发者Peter MacDonald住在加拿大西端温 哥华岛上的维多利亚,而我住在温哥华,这两个城市的轮渡只需一个半小时,而 我自己的电话区号和SLS是相同的。 当然,Softlanding Linux System远非完美,甚至在当年就因为bug多而引发诸 多不满,1993年夏天,Patrick Volkerding不满SLS的诸多bug,在修改后重新打 包并以Slackware为名发行。因此,SLS也曾是Slackware的“上游”。 安装SLS 类似于《重现WWW的起源(上):安装并配置X86版NeXTSTEP 3.3》 (Link: http s://zhuanlan.zhihu.com/p/697953965) ,这篇文章一方面服务于对Linux和Int ernet历史感兴趣的个人爱好者,另一方面也服务于希望重现历史场景的科技馆 等公共展示空间,因此我使用86Box模拟器作为我的主要环境的同时,同样会严 谨考量安装完成后的硬盘镜像考虑写入储存卡并在真实硬件上运行的可行性。 由于SLS在当时很流行,近年来复古计算社区尝试重现努力并不算少,我至少能 够找到3~4篇不同语言介绍SLS安装的文章: Linux 1.0 之旅:回顾这一切的开始 (Link: https://linux.cn/article-8836- 1.html) (中文) Softlanding Linux System 1.0.5 (Link: https://casadevall.pro/articles/ 2020/06/softlanding-linux-system-1.0.5/) (英文,来自NCommander) オープンギャラリー:SLS 1.05 (Link: https://www.os-museum.com/linux/sl s105/sls105.htm) (日文,来自OS Museum) sourceforge上有一个完整的tar包,Browse /s/sls at SourceForge.net (Link : https://sourceforge.net/projects/archiveos/files/s/sls/) 其中的文件名都是符合DOS 8.3格式的,因此不用担心它在Windows上解压的问题 ,压缩包中a1.3,a1.5是3.5寸和5.25寸启动盘的镜像,将扩展名改为.img就可 以在大部分虚拟机加载;而以a/b/c/d/s/t/x等编号的文件夹是为软盘安装组织 的,每个文件夹对应一张软盘。 硬盘和BIOS设置 但即使看过上面的文章,我仍然踩到一些坑,下面整理出来: 用软盘安装很慢,30多张盘,可以从硬盘或光盘安装,通常是将所有安装文件夹 放在磁盘根目录的/install下1994年的Linux 1.0不支持IDE光驱(ATAPI标准在 当年才提出),建议以第二块虚拟硬盘安装1994年的Linux 1.0不支持LBA,但支 持超过1024柱面的硬盘,使用540MB以上硬盘需要关闭BIOS的LBA选项,这导致DO S兼容问题1994年的Linux 1.0不完整支持Intel 430FX或更新芯片组上使用的EID E Dual Channel控制器,这会导致只有Primary Master/Slave硬盘被识别,而Se condary Master/Slave不被识别SLS的安装程序会把Lilo安装到PBR(分区引导记 录)而非MBR(主引导记录),需要在安装完成后第一次使用软盘启动,并修复L ilo配置(NCommander文章中有提到)由于上面第2点,我为从硬盘安装创建了两 个磁盘镜像,一个900M用来模拟1GB储存卡,一个100M用来作系统安装源,由于 上面的第4点,硬盘需要配置为0:0和0:1,即Primary Master/Slave。 (Image: https://pic1.zhimg.com/v2-600401fab5027869d90ab5802c435c96_720 w.jpg?source=d16d100b) 此外由于上面第3点,BIOS中硬盘要选NORMAL模式,而不能用LBA (Image: https://picx.zhimg.com/v2-f6c782f144a435c872930dc92691da16_720 w.jpg?source=d16d100b) AMI BIOS的例子,LBA Mode要选Off,不然会导致无法挂载根目录而导致Kernel Panic (Image: https://picx.zhimg.com/v2-dd8270bf1f86be2988bc4c6dbfdc73f2_720 w.jpg?source=d16d100b) 由于上面第1点,使用WinImage或类似的工具将安装盘目录放install目录中 (Image: https://picx.zhimg.com/v2-305e54a8ebb5e68ea5176a3318f56663_720 w.jpg?source=d16d100b) 只要硬盘设置正确,只要有8M以上内存,从386SX到Socket 370级别的机器都可 以安装完成。但由于上面第5点,我们第一次启动仍然需要通过在安装过程中创 建的安装盘完成,之后才能设置lilo。 使用vi编辑器修改/etc/lilo.conf,第一行 boot=/dev/hda1 就是Lilo被写入PB R的罪魁祸首,要改为 boot=/dev/hda才可以将Lilo写入MBR。(以下lilo.conf 样例仅供参考) boot = /dev/hda install = /boot/boot.b delay = 50 #vga=ask image = /zImage label = linux read-only root = /dev/hda1 image = /Image label = linux2 read-only root = /dev/hda1 delay和vga两行可以注释掉,这样Lilo不会等待输入启动参数或者提视选择文本 显示模式,可以加快启动速度,修改完lilo.conf之后,使用lilo命令将其写入 硬盘,之后就可以启动了。 配置交换分区/文件 对于1994年的486电脑来说,内存普遍只有8M甚至4M,因此swap分区几乎是不可 或缺的,不然在编译程序或执行X-Window时很容易因为内存不足而导致程序崩溃 。 今天标准的Linux安装通常会创建一个swap分区,在当时也可以这样做,比如下 面的截图里,就有一个50MB的swap分区/dev/hda2 (Image: https://pica.zhimg.com/v2-c266e46de396b3d364c0f9b9c031c595_720 w.jpg?source=d16d100b) 接下来我们就可以使用mkswap将其设置为swap分区,并用swapon命令挂载它,由 于当时的mkswap程序无法自动识别分区容量,所以必须手工提供分区容量参数, 见FreeBSD提供的Red Hat 4.2的manpage:mkswap (Link: https://man.freebsd .org/cgi/man.cgi?query=mkswap&manpath=Red+Hat+4.2) #查看分区尺寸 fdisk -l #根据分区尺寸创建swap mkswap /dev/hda2 50904 #挂载交换分区 swapon /dev/hda2 #查看可用内存 free 如果你没有在安装系统时创建交换分区,硬盘上也没有额外的空间了,则可以创 建一个交换文件 #创建16MB的空白文件/swapfile作为交换文件 dd if=/dev/zero of=/swapfile bs=1024 count=16384 mkswap /swapfile 16384 #等待硬盘写入完成 sync #启用交换文件 swapon swapfile free 最后,你可以将交换分区设置写入到/etc/fstab里,每次系统启动就会自动启用 交换区了。(以下fstab文件供参考) /dev/hda1 / ext2 defaults /dev/hda2 none swap defaults none /proc proc defaults 配置网卡 由于Linux流行之初就被广泛用作便宜的Unix网络工作站和服务器,因此其网络 支持相对完善,但仍然有一些需要注意的: 不要指望PCI或PnP支持,PCI插槽在1994年下半年才进入市场,Linux在当时作为 爱好者的操作系统,不可能提前获得厂商的硬件支持mcd(Mitsumi CD-ROM)驱 动程序会尝试占用I/O地址0x300,可能会干扰一些网卡的运行SLS的网络配置习 惯和今天不同,比如/etc/hosts同时包含了主机和路由的设置作为参考,我建议 快速阅览Linux 1.0的网络驱动源码:https://github.com/kalamangga-net/lin ux-1.0/tree/master/drivers/net (Link: https://github.com/kalamangga-ne t/linux-1.0/tree/master/drivers/net) 以及Slackware 3.0的Ethernet How-To:http://slackware.cs.utah.edu/pub/s lackware/slackware-3.0/docs/Ethernet-HOWTO (Link: http://slackware.cs. utah.edu/pub/slackware/slackware-3.0/docs/Ethernet-HOWTO) Ethernet How-To这份文件略新,但仍然能覆盖我们遇到的一些问题,比如问题2 就可以通过搜索“mcd=”或“ether=”找到错开I/O地址请求的方法。 (Image: https://picx.zhimg.com/v2-b2a753ea6919b08883a6ec898cefa866_720 w.jpg?source=d16d100b) 图中的声卡搭载了松下和Mitsumi的光驱接口,PCB上预留了索尼接口的焊点,但 没有安装补充一点ATAPI之前光驱的情况,1995年之前,除了存在使用SCSI接口 的光驱之外,数种搭载在声卡上的光驱接口,它们和配套的光驱组成当时常见的 “多媒体个人电脑(MPC)套件”,有时这些接口也被称作“AT接口”。其中最常见 的是索尼、松下和Mitsumi(三美电机,90年代电脑市场多称“米苏米”)。 国内常见的D-Link DE220、Realtek 8019、Accton等ISA PnP NE2000卡应该都可 以支持,但需要DOS启动盘和软跳线配置程序将其设置为非PnP模式并固定I/O Ad dress和IRQ选项 (Image: https://pic1.zhimg.com/v2-ff8a9f227bbd2ca9b445eb542aa8e1c6_720 w.jpg?source=d16d100b) RSET8019可以修改Realtek 8019的I/O地址,IRQ等参数,对于Book8088这类不支 持PnP的设备也是必须的如果网卡识别正常,在系统启动过程中就可以看到提示 的信息,在下面的截图中我们可以看到/etc/http://rc.net (Link: http://rc. net) 在尝试启动TCP/IP (Image: https://pic1.zhimg.com/v2-2f54277be3cdddccde027ce60cd3b941_720 w.jpg?source=d16d100b) 接下来我们可以配置TCP/IP了,首先我们列一个工作清单 主机名(比如softland)IP地址(比如192.168.1.29)网络地址(通常是IP地址 ,以0结尾,如192.168.1.0)路由器(比如192.168.1.254)DNS(许多时候和路 由器相同,有些时候也可以设置为外部的公共DNS)主机名一共要修改两处,都 改成上面列出的主机名: /etc/HOSTNAME/etc/host默认安装的主机名会有后缀http://softlanding.com ( Link: http://softlanding.com) ,请删去。此外/etc/resolv.conf也要删除do main一行,只保留nameserver指向DNS服务器,设置好之后用cat命令检查文件内 容,(以下文本截取自终端输出) 1:softland:/$ cat /etc/HOSTNAME softland 1:softland:/$ cat /etc/host softland 1:softland:/$ cat /etc/resolv.conf nameserver 192.168.1.254 由于前面列出的原因3,IP地址、网关等设置需要在/etc/hosts里设置,注意IP 地址和名称之间以制表符分隔,只用空格的话/etc/http://rc.net (Link: http ://rc.net) 无法正常处理 #以下文本截取自我的/etc/hosts,请根据自己的网络状况进行调整 # Local Hosts Format: # IP_NUMBER HOSTNAME ALIASES # # Here is the name of your host, first, followed by any aliases 192.168.1.29 softland # # Your network number (usually same as above, with last number zero) 192.168.1.0 network # # Uncomment and define IP number of router if not on isolated network. 192.168.1.254 router # # Local host ip num: no need to change this. 127.0.0.1 localhost # 修改完这些文件,重启之后,就可以访问TCP/IP网络了,SLS已经内置了FTP客户 端,可以作为和外接交换数据的窗口 (Image: https://pic1.zhimg.com/v2-2c3cbfa7ddf5f371d305215fa54cbe6d_720 w.jpg?source=d16d100b) 体验基本的Internet服务器 默认安装的SLS自带了FTP、Telnet、UUCP、电子邮件等服务器,可以说,除了没 有WWW、Gopher等信息查询服务,它已经是一台完整的Internet服务器了,具体 开放的服务可以在/etc/inetd.conf中看到 FTP和Telnet Telnet不用多说,在今天,加密的SSH取代了它的地位,FTP文件传输协议则是当 时最重要的Internet服务——当时的Linux本身在互联网上就是依靠FTP传播的。SL S中的FTP跟FileZilla这样的现代FTP客户端连接会有些问题,但Windows下的FTP 命令是没问题的,关于FTP命令的用法,可以参考:CMD中FTP命令大全_cmd ftp 命令-CSDN博客 (Link: https://blog.csdn.net/newbie_907486852/article/de tails/79352217) 在SLS中,默认的FTP根目录是/user/ftp,支持匿名访问。 古老的Finger协议 在SLS上,我们可以体验另一个在教科书上不断出现而今天基本不再使用的协议 :Finger Finger (Link: https://baike.baidu.com/item/Finger/2474497) 我们在Windo ws机器上用Finger命令查询SLS,大概会得到如下结果: C:\Users\Andy>finger @192.168.1.29 [192.168.1.29:79] Login Name Tty Idle Login Time Office Offic e Phone andy Andy Zhou p0 May 29 12:08 321 777-8 88-9999 root 1 10 May 29 11:50 C:\Users\Andy>finger andy@192.168.1.29 [192.168.1.29:79] Login: andy Name: Andy Zhou Directory: /home/andy Shell: /bin/sh Office: 321, 777-888-9999 On since Thu May 29 12:08 (PST) on ttyp0 from MYWIN10- No Plan. 第一条命令直接 finger @<服务器地址> ,会列出服务器上所有用户名和登陆时 间,第二条命令 finger <用户名>@<服务器地址> 则查询某个用户的详细信息。 在互联网的洪荒时代,Finger曾起到过类似公司通讯录的作用,你可以轻易的找 到你想联系的人,并给他发邮件。但很快这一协议就被滥用,成为社会工程攻击 的入口,因此在90年代后期开始,越来越少服务器提供Finger服务,直到今天临 近消失的状态。 关于root密码的特别提示 我本来想下一集再说,但因为SLS的密码系统有个大Bug,我必须先在这一集中提 到。 SLS使用影子密码系统,即用户列表保存在/etc/shadow中,普通用户可以读取/e tc/passwd,没有读取/etc/shadow的权限。但SLS的shadow文件中默认没有root 用户,而passwd命令默认也不会创建这一信息,这就导致了当我们用passwd命令 给root设置密码之后,root用户会被冻结而无法使用。 为了避免这种情况,我们需要在为root设置密码前,提前在/etc/shadow中加入 下面一行 root:*:0:0:99999:7:::: 之后再设置密码,这一行就会变成 root:<加密后的密码>:0:0:99999:7:::: 这样root用户才可以登录,如果你不小心把root用户锁住了,则需要在单用户模 式下修改,在启动到LILO提示符时,按下Alt键,然后输入 linux single 进入单用户模式,然后修复/etc/shadow中的内容,并重设密码,如果你把lilo. conf的delay一行删除或设置为0,可能会一闪而过,此时可以用安装系统时的a1 启动盘启动,在出现LILO提示时按Alt,并输入 harddisk root=/dev/hda1 single 进入单用户模式,/dev/hda1是Linux的安装分区,如果你的分区不同,需要根据 自己的情况进行调整。 下集预告 在下一集里,我们将在已经安装好的Linux 1.0服务器上启动WWW服务,配置X Wi ndow,并体验当时的Mosaic浏览器:在中国接入互联网30周年之时,搭一台1994 年的Linux服务器(二) (Link: https://zhuanlan.zhihu.com/p/700820663)