买一赠一

作者:R. Scott Gray

在预算不断减少和成本不断增加的时代,有时不可能遵循标准做法,使用不同的计算机系统来实现不同的目标。东田纳西州立大学 (ETSU) 计算机与信息科学系在 1997 年春季面临了这个问题,当时课程要求建议需要两个计算机实验室

  • 一个稳定的计算机实验室,可以支持标准的课堂使用,以及

  • 一个基于 Linux 的实验性计算机实验室 (LBCL),允许学生更改操作系统源代码。

建立独立的实验室这种显而易见的解决方案,由于空间和预算的限制而无法实施。因此,ETSU 系统管理员 Luke Pargiter 决定建立一个单一的网络实验室,它可以作为实验性或稳定平台运行。

Pargiter 支持双重用途实验室的策略是将可用计算机划分为一台受信任的 PC 和一组客户端 PC。受信任的 PC,称为 内核服务器 PC,充当整个网络的安全文件服务器。客户端 PC 被预留用于用户开发。用户被指示仅使用客户端 PC,并根据他们打算如何使用系统来启动这些 PC

  • 那些想要使用标准 Linux 内核的人将使用指定的引导软盘,该软盘指示用户 PC 从内核服务器下载标准 Linux 内核。

  • 那些想要使用实验性 Linux 内核的人将从本地硬盘驱动器引导他们的 PC,他们可以在那里存储实验性内核。

Pargiter 的双启动策略确保了标准网络文件系统的完整性,同时使创建了错误内核(并因此导致 PC 无法从本地硬盘驱动器启动)的实验用户更容易通过从内核服务器 PC 重新启动来恢复。

配置困难

配置六站网络带来了两个关键挑战。第一个挑战源于需要使用带有微通道架构 (MCA) 总线的剩余 PC——标准 Linux 2.0 内核不支持的总线类型。MCA 问题通过使用 Chris Beauregard 的 MCA 内核补丁从 Micro Channel Linux 主页上解决。

第二个与配置相关的挑战源于需要节省内核服务器 PC 上的磁盘空间。将内核服务器 PC 配置为受信任的服务器将有助于确保内核服务器文件系统的完整性,以应对应用于卫星 PC 的随机内核更改。然而,服务器随后将被要求为每个联网的 PC 托管一个 Linux 操作系统副本,几乎没有留下用户主目录的空间。

Linux 内核“磁盘膨胀”问题通过观察到 Linux 发行版中的大多数文件可以存储在服务器上一次并在多个 PC 之间共享来解决。这组共享内核文件包括系统独立文件,如 /etc/passwd,它们在配置中保持不变,以及卫星独立文件,如 /etc/exports,它们只需要配置两次:一次用于内核服务器,一次用于所有客户端 PC。

由于 Linux 发行版通常不划分为系统相关和系统独立文件,因此系统相关的配置文件被移动到一个新目录 /adm。大多数重新定位的文件最初存储在 /etc 中。对于每个移动到 /adm 的文件,在每个客户端的 /etc 目录中创建指向该文件的相应软链接。使用试错法来确定配置文件是否可以移动到 /adm。

服务器海量存储设备配置

海量存储设备配置的主要目标是为系统可执行文件和文件提供足够的磁盘空间,同时为用户文件保留更大的磁盘空间部分。最初,在内核服务器上发现了三个海量存储设备:一个 CD-ROM、一个 320MB 硬盘驱动器和一个 545MB 硬盘驱动器。

320MB 硬盘驱动器被配置为默认启动驱动器 /dev/sda。该驱动器被划分为一个 50MB 交换分区 /dev/sda1 和第二个分区 /dev/sda2,用于服务器的根文件系统。545MB 硬盘驱动器的前 80MB,/dev/sdb1,被保留用于存放客户端的操作系统映像,/tftpboot/Client_IP_Address,以及包含共享操作系统文件的目录 /tfpboot/adm。驱动器的其余部分 /dev/sdb2 被留作服务器的 /usr/local 目录。回顾来看,最好将 /dev/sda 分区为三个逻辑磁盘,将第三个分区保留用于临时文件,例如 /var 目录中找到的文件,因为对临时文件空间的需求会随着系统任务的变化而变化。

CD-ROM 驱动器包含在服务器的初始硬件配置中,以简化和加速 Linux 安装。最后的配置步骤之一是用 320MB 硬盘驱动器替换 CD-ROM。这第三个硬盘驱动器 /dev/sdc 使用一个分区 /dev/sdc1 初始化,用于用户主目录 /home。然后将 CD-ROM 放置在客户端系统 lin2 上,并导出以允许其他客户端和服务器使用该设备。

服务器基本系统安装

MCA Slackware 3.1 安装启动软盘用于启动服务器的安装。遵循了基本的 Slackware 3.1 安装说明。标准的 Linux 2.0 内核系列不提供对 MCA 总线架构的支持;因此,安装在 MCA Slackware 3.1 安装软盘上的内核映像被安装在新系统上。完成 Linux 安装后,系统启动,并将 MCA Linux 内核补丁应用于内核源代码。然后配置、编译和安装修改后的内核源代码。最后,重新启动服务器以加载新的内核映像。

网络准备/配置

基本的网络设置在 Slackware 3.1 安装期间配置,就像任何标准的 Linux 系统一样。当时,Linux 2.0 内核系列不支持令牌环适配器。但是,令牌环适配器支持通过 MCA 内核补丁提供。在内核配置过程中,选择了以下网络支持和网络设备支持选项

  • TCP/IP 网络

  • 丢弃源路由帧

  • 反向 ARP

  • 允许大窗口

  • 网络设备支持

  • 令牌环驱动程序支持

  • IBM tropic 芯片组适配器支持

Slackware 网络初始化脚本 /etc/rc.d/rc.inet1 被编辑以设置令牌环接口 (tr0)。这是通过将提供给 ifconfig 命令的默认网络接口参数 Ethernet, eth0 替换为 tr0 来完成的。

创建了一个非标准 shell 脚本 rarptab 并放置在 /etc 目录中。此脚本使用从 48 位 MAC(强制访问控制)地址到 IP 地址的映射初始化 RARP(反向地址解析协议)表。该脚本弥补了 Slackware RARP 未能响应标准 Linux 初始化脚本中命名的客户端的问题。rarptab 脚本由每个客户端的单个命令组成,形式如下

rarp -a Client_IP_Address Client_MAC_Address

rarptab 脚本在系统启动时从 /etc/rc.local 调用,使用命令

sh -c /etc/rarptab
服务器的 /etc/exports 文件被修改,以使客户端 PC 可以访问以下目录
  • /adm:从 /etc 移动的共享文件

  • /home:用户主目录

  • /root:超级用户的主目录

  • /shlib:可加载库

  • /usr:系统工具和用户目录

  • /var/X11R6:XFree86 共享库

  • /var/openwin:Sun Window 系统共享库

客户端 PC 被授予对 /home 和 /root 目录的读写访问权限。对所有其他目录的访问权限被限制为只读。添加到 /etc/exports 的条目具有以下格式
Shared Directory  Client Hostname \
        (rw, no_root_squash)
Shared
        (ro, no_root_squash)
上面指定的 no_root_squash 选项对于无盘操作非常重要。此选项允许客户端的 SETUID 程序访问仅 root 可访问的系统文件。

取消注释文件 /etc/inetd.conf 中的 tftp 条目,并在文件“/etc/services”中插入以下行

tftp 68/tcp #TFTP server
客户端基本系统安装

在服务器上创建了一个目录 /tftpboot/Client_IP_Address,用于存放单个客户端系统的文件。为了方便起见,在 /tftpboot 中创建了一个指向 Client_IP_Address 目录的软链接 lin2。然后创建 /tftpboot/adm 目录以保存跨系统配置文件。调用 Slackware 的安装例程设置,并在提示安装目标时指定 /tftpboot/lin2。仅选择了 A 节(基本 Linux)和 N 节(网络)中的软件包。在配置客户端的系统文件期间,可以轻松删除 A 节和 N 节中的冗余软件包。拒绝了用于安装 Linux 内核的设置例程选项,因为内核按照设计是从专门准备的启动软盘加载的。也拒绝了运行 LILO 的设置选项。

客户端系统文件配置

列表 1。

文件 /etc/fstab 用于确定在系统启动时要挂载的文件系统。LBLC 上的远程客户端共享列表 1 中显示的通用 fstab 文件。

删除了位于 /tftpboot/lin2/etc 中的可共享系统文件,并软链接到 /tftpboot/adm 目录中的对应文件。编辑了文件 /tftpboot/lin2/rc.inet1 以确保令牌环接口 (tr0) 的初始化。然后从 /tftpboot/lin/2etc/rc.d/rc.S 中删除了所有文件系统完整性检查。服务器必须确保文件系统完整性,因为客户端 PC 无法使用 fsck 实用程序在系统启动时检查文件系统完整性;在发生此类检查时,文件系统已经挂载。

使用以下命令,从 /tftpboot/Client_IP_Address 中删除了内容仅驻留在服务器上(NFS 挂载)的选定目录

rm -rf /tftpboot/linwin2/var/X11R6/*
rm -rf /tftpboot/linwin2/user/*
rm -rf /tftpboot/linwin2/root/*

如前所述,只有有限的 Linux 安装被放置在 /tftpboot/lin2 中;因此,创建了以下目录作为挂载点,以允许 lin2 从服务器导入这些目录

  • /tftpboot/lin2/var/openwin

  • /tftpboot/lin2/shlib

  • /tftpboot/lin2/man

  • /tftpboot/lin2/info

然后编辑 lin2 的 /etc/exports 文件,以允许 lin2 导出稍后将放置在该机器上的 CD-ROM。以下行被添加到 lin2 的 /etc/exports
/cdrom   lin1(rw,no_root_squash)
/cdrom     lin3(rw,no_root_squash)
/cdrom   lin4(rw,no_root_squash)
/cdrom   lin5(rw,no_root_squash)
chmod -R +r /tftpboot/lin2 命令用于使 lin2 目录树中的所有文件都可由 tftp 读取,这是一种本质上只能访问世界可读文件的协议。然后使用 lin2 的配置来配置 lin3 到 lin5。为其余每个客户端创建了 lin2 配置的副本,命令如下
mkdir /tftpboot/Client_IP_Address
ln -s /tftpboot/Client_IP_Address\
/tftpboot/"lin3 through lin5"
cp -Rpd /tftpboot/lin2\
/tftpboot/"lin3 through lin5"
然后修改了一些系统配置文件,以使这些文件特定于其目标主机。最值得注意的更改涉及修改 /tftpboot/Client_IP_Address/etc/rc.d/rc.inet1。具体来说,修改了 rc.inet1 文件中的两行以反映远程系统的 IP 地址和网关
IPADDR="Client_IP_Address" GATEWAY="Client_IP_Address"
此外,修改了文件 /tftpboot/Client_IP_Hostname/etc/HOSTNAME 以反映每个远程系统的正确主机名。最后,修改了文件 /etc/exports,使得 /cdrom 目录不再导出。
创建用于远程引导的软盘

使用两步程序为客户端机器生成远程引导软盘。首先,重新编译服务器上的内核源代码,以包含“NFS(网络文件系统)上的根文件系统”支持。编译完成后,新创建的内核映像从 /usr/src/linux/arch/i386/boot/zImage 移动到 /tftpboot/adm/client_boot_image_remote。在新磁盘上贴上标签并插入服务器的软盘驱动器。使用 mknod 实用程序创建了一个虚拟设备 /dev/boot22。使用 dd 实用程序将 client_boot_image_remote 复制到软盘。然后使用 rdev 实用程序将软盘映像上的内核的根设备设置为虚拟设备 /dev/boot22。以下命令序列用于创建远程引导软盘

mknod /dev/boot255 c 0 255
dd if=/adm/client_boot_image_remote/zImage of=/dev/fd0
rdev /dev/fd0 /dev/boot255

最后,此过程被捕获在 shell 脚本中,并用于创建额外的远程引导软盘。

本地客户端配置

所有客户端系统都包含一个硬盘驱动器,该硬盘驱动器配置为提供单个 50MB 交换分区 /dev/sda1。这将允许实验用户在他们的系统上安装 Linux 时,对驱动器的其余部分进行分区以满足他们的需求。由于唯一的 CD-ROM 位于 lin2 上,因此除了 lin2 之外的任何客户端系统上的 Linux 安装都必须通过 NFS 完成。为了使这种安装成为可能,必须对 MCA Slackware 3.1 启动软盘进行修改。使用命令将启动软盘挂载在 /mnt 目录下

mount -t minix /dev/fd0 /mnt

更新了文件 /mnt/etc/networks,将 LOCALNET 更改为 IP 地址 151.141.99.0。MCA Slackware 3.1 启动软盘假定如果正在进行网络安装,则网络类型为 Ethernet。因此,有必要编辑文件 /mnt/usr/lib/set/INSNFS,将所有出现的 eth0 更改为 tr0。与远程引导软盘一样,编写了一个脚本来自动化上述操作。

结论

磁盘驱动器成本的下降,以及对系统安全性的担忧,使得无盘工作站操作和 RARP 等远程协议的吸引力降低。“相对便宜”仍然不太等于“免费”。我们描述了一种用于实现基于 Linux 的实验室的策略,该策略实际上使用无盘操作来支持常规用户和标准用户,而无需额外成本。

ETSU 基于 Linux 的计算机实验室尚未完全融入 ETSU 课程,这主要是由于不可预见的延迟,包括雷暴造成的设备中断。然而,该实验室已投入运行。1998 年春季,两名学生在该实验室开发了一个用于高级操作系统课程的串行线路驱动程序。目前,正在制定计划在即将到来的学年将该实验室用作教授研究生操作系统和本科生网络课程的工具。

Buy One, Get One Free
Scott Gray (sgray@eolian.com) 是 Eolian Inc. (www.eolian.com) 的高级系统设计师,他目前正在从事 Internet 缓存代理服务器开发工作。Scott 还在东田纳西州立大学完成关于磁盘缓存和自适应块重排的硕士论文。他和他的猫 Sheba 定期往返于他们在田纳西州 Church Hill 的家和 Eolian 在弗吉尼亚州费尔法克斯的办公室之间。

Buy One, Get One Free
Luke Pargiter 目前是 Pilot Corporation 的网络运营主管,Pilot Corporation 是一家价值 20 亿美元的私营石油零售商和旅行中心运营商。他曾任东田纳西州立大学计算机与信息科学系的系统经理。在业余时间,他读书、打高尔夫球和弹吉他,并与妻子 Rose 一起散步。可以通过电子邮件 pargitel@pilotcorp.com 联系 Luke。

Buy One, Get One Free
Phil Pfeiffer,计算机与信息科学助理教授,目前在东田纳西州立大学 (www.etsu-cs.edu) 任教。Phil 于 1991 年在 UW-Madison 获得计算机科学博士学位,目前正在攻读洞穴潜水认证。他还曾在 PPG Industries (1977-1984) 从事系统编程工作,并在东斯特劳兹堡大学 (1991-1996) 教授计算机科学。
加载 Disqus 评论