企业 Linux:与行业巨头共存

作者:Markolf Gudjons

在过去的几年里,Linux 已经取得了长足的进步,不再是极客的玩具,并且正在成为主流操作系统。Linus Torvalds 带着一丝玩笑的意味,正在努力实现世界统治;然而,Linux 更引人入胜的优势之一是它与其他系统(无论是否是 UNIX)友好且富有成效的共存。事实上,其基于标准的方法是我区分它和某些商业产品的最喜欢的方式之一。

话虽如此,我想介绍一些将 Linux 机器集成到生产计算机网络中的经验,该网络拥有 1000 多个节点,分为大约三分之二的运行 Sun Solaris 的 SPARC 和三分之一的运行来自华盛顿州雷德蒙德各种软件包的 PC。

任何大型 UNIX 站点通常都采用操作系统简单而有效的机制来维护大量用户在同样大量的机器上工作。为了让 Linux 参与到这样的网络中,它需要能够参与甚至提供这些服务中的任何一种。在我们的站点,这些服务是

  • NIS:Sun 的网络信息服务,以前称为黄页。这是一种经过验证的机制,用于分发任何可以表示为列表的信息,例如用户帐户、密码和打印机定义。

  • NFS:网络文件系统。这允许挂载远程文件系统,通常混合使用静态和自动挂载。前者在每台机器上配置,后者通过 NIS 映射分发。

  • 统一登录脚本:精心设置和维护的 shell 脚本网络,为用户提供使用各自应用程序所需的设置。这消除了每个用户自行拼凑自己的环境以及所有支持含义的需求。

此外,几乎不言而喻的是,Linux 机器应该能够通过 LPR 协议访问联网或基于服务器的打印机,并利用所有其他通信协议,如 HTTP、NNTP、SMTP 或 FTP。Linux 在这方面享有当之无愧的卓越性能声誉。

信息来源:启用 NIS

三步法让 Linux 机器参与到 NIS 域中,首先是安装必要的软件。对于 Red Hat 5.x 发行版,这些软件包含在两个 RPM 包中——ypbindyptools。前者提供 ypbind 可执行文件,它必须作为守护程序在任何 NIS 客户端上运行,并提供与 NIS 服务器的通信。后者包含各种 NIS 相关工具,用于查询 NIS 表格(ypcatypmatchyppoll)和维护客户端配置(ypwhichypset)。

接下来,修改服务器端配置,以允许新的 NIS 客户端参与到域中。NIS 只有基本的安全机制,其中一种常见的机制是“securenets”列表,该列表枚举了被认为安全参与域的网络。如果您的 Linux 机器与您的其他 UNIX 机器位于不同的子网中,请确保该网络存在于您的服务器的 securenets 列表中(通常位于 Sun 服务器上的 /var/yp/securenets 中)。

最后的障碍是客户端配置。首先,ypbind 守护程序需要知道 NIS 域名(另一个安全预防措施,尽管相当脆弱)。这在文件 /etc/yp.conf 中设置,以及 NIS 服务器名称或广播服务器的指令。该文件只需要包含以下格式的单行

domain

服务器 bigboy.my.net 必须在主机数据库 /etc/hosts 中有一个条目。

现在需要设置 NIS 域名。这可以通过 domainname my.NIS.domain 命令完成。为了使此设置在重启后仍然存在,域名也应输入到系统的网络配置中,对于 Red Hat:/etc/sysconfig/network

DOMAINNAME=

在为 ypbind 创建目录 /var/yp/binding 以存储绑定信息后,可以通过其脚本启动 ypbind:/etc/rc.d/init.d/ypbind start。

接下来,我们必须让系统知道实际使用 NIS 来解析主机名、用户 ID 和密码等内容。为此,编辑文件 /etc/nsswitch.conf 并更改您想要使用 NIS 的每个服务的相应行,例如

passwd:     files nis
shadow:     files nis
group:      files nis
hosts:      nis files dns
automount:  files nis

在上面的示例中,尝试验证用户身份的登录程序将查阅 /etc/nsswitch.conf,看到序列 files nis 并在各自的文件中查找信息。失败后,它将查询 NIS 服务以获取用户的密码和影子条目。如果这也失败了,则拒绝登录。将条目列为 files nis 的原因是 root 用户通常未在 NIS 中定义(这被认为是安全漏洞)。在出现网络问题的情况下,首先查看本地 passwd/shadow 文件可以让 root 用户无需进一步问题即可登录。

基本上就是这样。一旦文件被编辑并且 ypbind 运行正常(通过查看 /var/log/messages 中的可疑消息以及 NIS 服务器上的相应文件来验证这一点),您的机器就成为了 NIS 域的一部分。当然,如果这让您感觉更好,您可以重新启动;它还允许您测试系统是否会在正确的配置下启动。

您可以使用 ypwhich 命令验证 ypbind 与服务器的连接(NIS 术语中的“绑定”)。您还可以手动查找信息:命令 ypmatch joe passwd 将显示 Joe 在 NIS 密码映射中的条目。

网络:启用 NFS

现在 NIS 正在工作,让我们来处理 NFS。根据您听取谁的意见,NFS 要么是邪恶的野兽,要么是解决所有用户数据相关问题的灵丹妙药。在我看来,NFS 使拥有大量用户数据的大型网络易于设置且透明,但它带来了所有联网文件系统共有的巨大性能损失。预计 NFS 访问速度比本地硬盘文件访问速度慢十倍左右。无论速度快慢,大型站点都离不开 NFS。

也就是说,设置 NFS 客户端基本上遵循与 NIS 客户端相同的步骤:软件安装、服务器端配置和客户端配置更改。

NFS 需要内核内置对其的支持,大概是以内核模块的形式,但如果您愿意,也可以将其编译到内核本身中。如果您的内核尚不支持 NFS,您需要在“文件系统”下启用它。转到您的内核源代码目录(很可能是 /usr/src/linux)并键入 make xconfigmake menuconfig。显然,要使用 NFS,内核需要启用网络支持。编译并安装 NFS 模块后,您的系统就拥有了所需的所有软件。但我建议您安装一个可选软件,即 showmount。在您的发行版 CD-ROM 上查找一个名为 nfs*client* 之类的软件包。

在 NFS 服务器上,通常有一个文件说明导出了哪些文件系统。根据 UNIX 的版本,它可以称为 /etc/exports (SunOS, Linux, *BSD)、/etc/dfs/dfstab (Solaris, 其他 System V 变体) 或完全不同的名称。查找该信息的与操作系统无关的方式是对 NFS 服务器运行 showmount 命令,例如,showmount -e。这将列出导出的文件系统以及允许挂载它们的机器或机器组。

大型站点通常需要以组为单位管理机器。例如,所有用户的桌面工作站都应该能够挂载任何主目录,而只有服务器可能被允许从联网的自动点唱机挂载 CD。在 NIS 中,这种机制由 netgroup 映射提供,并且 showmount 命令很可能只会列出允许访问特定导出的 netgroup。示例输出将是

/home/ftp      (everyone)
/homedesktops
/var/mail      mailservers

everyone 是一个特殊名称,表示每台机器,而 desktopsmailservers 是 netgroup。执行

ypmatch -k desktops netgroup
可能会产生
desktops: penguin, turkey, heron
为了让您的 Linux 机器能够访问 /home,NFS 共享需要它属于 desktops netgroup。否则,服务器将拒绝访问。

一旦您的服务器允许您进入,最后的障碍是将 NFS 导出通告给您的客户端。处理此问题的最简单方法是在您的 /etc/fstab 中使用永久挂载条目,例如

bigboy:/export/home     /home   nfs     0 0

这样,/home 将在每次启动时硬挂载。虽然这种方法肯定非常有效,但它有局限性。在我们的站点,我们为每个用户的主目录设置一个挂载点;例如,Joe 的 /home/joe 和 Sue 的 /home/sue。对于分布在十台文件服务器上的 1200 多个用户,硬挂载每个目录将需要大量的内务管理,而服务器更换或淘汰将是一个主要的麻烦。

幸运的是,有一种优雅的方法可以解决这个问题,称为 automounter。这个有进取心的小守护程序监视一组在文件中指定的挂载点,以供操作系统访问。一旦检测到访问,automount 守护程序就会尝试挂载属于该挂载点的导出。除了轻微的延迟外,应用程序和用户都不会注意到与常规挂载的区别。正如预期的那样,automounter 会在可配置的不活动时间段后释放 (umount) 已挂载的文件系统。

要使用 automounter,请安装 autofs 软件包并查看它在 /etc/auto 目录中安装的文件。第一个也是最重要的文件是 /etc/auto.master,它列出了要由 automounter 监视的每个挂载点及其关联的映射,通常命名为 /etc/auto.mountpoint。这些映射中的每一个都遵循 /etc/auto.misc 中设置的基本模式

d       -fstype=iso9660,ro,user :/dev/cdrom
fd      -fstype=auto,user :/dev/fd0

在此示例中,/misc/cd 以与 /misc/cd 上的 CD 驱动器关联的常用选项挂载,而当前在驱动器 /dev/fd0 中的软盘则挂载在 /misc/fd 上。请注意,挂载不会发生,直到目录被访问,例如,通过执行 ls /misc/cd,并且 automounter 将自动创建文件中列出的每个挂载点。

“太棒了”,您说,“现在,这与 NFS 和 NIS 有什么关系呢?” 好吧,automount 映射实际上是可以维护在 NIS 服务器上并分发给客户端的列表。例如,一个典型的名为 auto.home 的 NIS 映射将如下所示

joe     bigboy:/export/home/2/joe
sue     beanbox:/export/home/sue

这就是为什么需要前面提到的大量挂载点的原因。如果 Joe 换工作并加入财务部门,他的主目录可以移动到 beanbox。他的新条目将读取

joe     beanbox:/export/home/joe
但他的桌面机器上的挂载点仍然是 /home/joe。换句话说,即使他换到了另一台服务器,他也不需要调整他可能拥有的任何环境设置、应用程序数据路径或 shell 脚本。不相信?键入 grep $HOME $HOME/.* 以查看您的主路径实际保存在多少个地方。

如果在 NIS 配置期间,您编辑了 /etc/nsswitch.conf 以包含以下行

automount:  files nis

automounter 将从 /etc/auto.master 读取其启动文件。之后,它将查询 NIS 服务器以获取名为 auto.master 的 NIS 映射,并将相应地处理条目。因此,对用户 Joe 的上述更改只需要在一个系统(NIS 主服务器)上进行一次,并且所有客户端都知道。没有要忘记的条目,没有冲突的客户端配置。效率如何?

登录脚本:统一方法

到目前为止,我们所做的大部分工作都是面向技术的,以使我们的 Linux 机器成为企业网络的一部分。另一方面,登录脚本要在管理层面理解。只有少数用户的站点可能不需要它们,但是如果您必须支持数百甚至数千名计算机水平参差不齐的用户,并且很可能位于不同的物理位置,您就会开始以不同的眼光看待这种情况。

两个最广泛使用的 shell,tcsh 和 bash,以及它们的前身 csh 和 sh,都使用两步设置过程。无需过多细节,名为 .login 和 .profile 的文件在登录时执行。之后以及每次调用非登录 shell(打开新的 xterm 窗口)时,都会执行名为 .(t)cshrc 或 .bash_profile 的文件。所有这些文件都位于用户的主目录中;/etc 目录中还存储了一个系统默认登录和配置文件(注意缺少“.”)。

当在我们的站点设置新用户时,我们会给她一套默认的 .login 和 .cshrc(csh 变体是标准 shell,但 bash 也可以这样做)以及其他一些文件。唯一需要调整的是 .cshrc 中默认打印机的设置

setenv PRINTER

列表 1

列表 1 显示了一个默认 .login 脚本的示例。首先,脚本计算出主组(在反引号内),并将变量 $SETUP 加载到该组的设置文件的路径,例如,如果用户的主组是 finance,则为 /usr/local/etc/dotfiles/finance。然后,将许多所谓的设置文件源(包含)到当前运行的脚本中,并执行其中的命令。对于 setup.OPENWIN 脚本,它可能如下所示

setenv OPENWINHOME /usr/openwin
setenv MANPATH ${MANPATH}:/usr/openwin/man
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/usr/openwin/lib

这些脚本确保每个用户都获得其特定组的相同环境设置。最后,启动窗口系统(在本例中为 OpenWindows,Sun 版本的 X)。startup.OPENWIN 将在用户显式注销 GUI 之前不会返回,此时将恢复 .login 的执行。它继续删除用户可能留下的某些文件,并将用户注销系统。

同样,这个概念的美妙之处在于它的简单性。如果我们安装一个新的 Web 浏览器,我们只需要更改中央设置文件以指向新安装的版本。在下次登录时,每个用户都会收到成功启动它所需的设置。

相同的概念也用于安排每个用户的 GUI 环境。OpenLook 窗口管理器 OLWM 以及大多数其他窗口管理器都带有一个应用程序菜单,可以自定义该菜单以包含用户可能希望轻松访问的任何应用程序。菜单描述存储在名为 ~/.openwin-menu 的文件中。同样,与其让每个人创建或修改自己的菜单,不如将此文件仅链接到 $SETUP/.openwin-menu 中存储的中央菜单。在其中,对 $HOME/.openwin-private 中存储的私有菜单的引用使每个用户都有轻松添加个人项目的机会。中央菜单文件始终经过精心维护,以确保每个应用程序都按广告宣传的那样工作,并且每次有新应用程序上线时都会更新。支持人员很感激他们可以通过电话引导用户浏览菜单,同时查看完全相同版本的菜单。

融入机构

列表 2

将 Linux 机器集成到此组织中需要基本设置脚本来区分操作系统,如果路径不同或某些功能在不同操作系统上不可用。由于 OpenWindows 是 Sun 的专有软件包,因此必须找到一种方法,让用户在登录 Sun 机器时获得她的 OW 设置,并在 Linux 机器上获得相当类似的 X11 设置。为了最大限度地减少对现有脚本的影响,一种好的方法是将列表 2 中显示的代码段插入到用户的 .login 中。此示例首先源化所有跨平台通用的设置,例如默认 HTTP 代理设置,可能是新闻阅读器和其他程序使用的 NNTPSERVER 变量。然后,switch 语句独立处理每个受支持的操作系统。在本例中,setup.WORDPROC 仅针对 SunOS 执行,因为我们没有 Linux 的文字处理器。setup.WEBBROWSER 脚本也从 $SETUP 目录调用,因为它可以区分操作系统。如果您在所有平台上使用相同的应用程序(例如,gcc 和 Netscape),这将很有意义。OpenWindows 和 X11 脚本是特定于平台的。

以相同的方式轻松实现对其他系统的支持。“default”语句捕获不受支持的系统,并将用户留在 shell 提示符下。退出此 shell,以及退出其他情况下的 GUI,将继续执行 .login 并方便地将用户注销。

在完成了设置脚本之后,要解决的最后一个障碍是 GUI 环境。X11 和 OpenWindows 都使用用户的 .xinitrc 脚本。幸运的是,这只是另一个 shell 脚本,可以像 .login 一样处理:添加一个 switch 语句来区分操作系统。一般来说,如果您注意正确设置路径并在 .xinitrc 中调用启动的任何 X 客户端时不使用完整路径,则不必这样做。因此,与其拥有

/usr/bin/panel
/usr/X11R6/bin/xload
/usr/local/bin/wmaker

启动两个客户端和窗口管理器,不如编写

if [ -x panel ]; then
        panel &
fi
xload
wmaker
这假设可以通过 $PATH 找到 xload 和 WindowMaker。Gnome 面板应用程序可能存在也可能不存在,并且仅在找到时才执行。
结论

将像 Linux 这样的叛逆操作系统引入主要公司生产网络的圣杯需要大量的热情、说服和游说,以及将其尽可能顺利和不显眼地融入其中的良好感觉。如果人们在没有被指明更改的情况下注意到,那就出问题了。

在不牺牲其任何固有灵活性的情况下,Linux 几乎完美地符合要求。每当其商业兄弟未能令人满意地完成某件事时,我总是特别自豪地展示 Linux 可以做什么,无论是与性能问题、开源软件的速度和灵活性,还是操作系统开发的速度有关。这使整个公司受益,并导致 Tux 成为许多办公桌以及服务器机房中备受欢迎的伙伴。这证明了该操作系统的优越性,并且肯定有助于 Linus 最终实现他的目标。

本文中引用的所有列表都可以通过匿名下载在文件 ftp.linuxjournal.com/pub/lj/listings/issue68/3528.tgz 中获得。

Corporate Linux: Coexisting with the Big Boys
Markolf Gudjons (mgu@gmx.net) 在爱立信 Eurolab 担任系统管理员,爱立信 Eurolab 是通信设备制造商爱立信 A/B 的子公司。他在大学时代开始使用 SCO Xenix,并从内核 0.96 开始转向 Linux。他期待着能够在新兴的个人计算平台上随时随地运行它。他的其他爱好包括骑摩托车、摄影和旅行。XX
加载 Disqus 评论