| 用Perl管理 Linux 配置文件 |
|
使用 Linux 和计算机时,配置文件的用法通常是令人迷惑的。尽管已经提出了一些,但现在还不存在标准。例如,Samba 和 rsync 使用 INI 风格的配置;passwd 用的是几十年前的用冒号隔开的格式,不允许冒号出现在任何域中;sudo 附带了一些 visudo 程序,让人们不会在 sudoers 文件中输入错误的信息;Emacs 使用 Lisp 作为配置文件。还有... 现在,我不再抱怨配置文件的多样性。我理解了这个配置通天塔(Configuration Tower of Babel)的历史原因和实践原因。例如,如果改变了 Samba 配置的格式,就会使上千的管理员面临麻烦。另一个例子,Emacs 的内部语言是 Lisp,这是一门强大的高层次语言,所以,使用任何其他东西作为 Eamcs 的配置文件都是荒谬的。 不,我要指出的是这一多样性对 Linux 用户造成的影响:Linux 用户的计算机时间有一大部分用在学习、编写和调试配置文件。这样,有必要拥有一个系统,在这个系统中这些配置文件(1)是自动备份的,(2)是自动发布的,(3)可以用于多种风格的 UNIX 和多种 Linux 的发行版本。本文阐明了如何达成前两个目标,并引导您走上达成第三个目标的途径。 计划 我们将使用 CVS 来控制配置文件。可以随意使用任何其他版本系统。Subversion 正在迅速流行。FSF 有 GNU tla( GNU arch),是另一个优秀的版本系统。所有那些以及很多其他系统,包括并不免费的 Rational ®ClearCase ® 等,都会提供您所需要的功能。 在我的配置模式中,每个配置文件在一个单独的目录或者其子目录中。配置文件被唯一命名,目录表示的是 机器或者平台,而不是 位置。这样,文件名唯一地映射到文件系统中的一个位置。例如, passwd 将总是用于 /etc/passwd,而 cshrc 将由用户 tzz用于 /home/tzz/.cshrc。 对于我日常使用的一些程序,我将展示如何在我的配置系统的帮助下来管理多个平台,使它们自己修改配置文件。 我展示的所有例子都使用 C shell 来设置环境变量。修改它们以使用 GNU bash 或者其它 shell 应该不是特别困难。 安装设置 CVS 您可能已经在您的机器上安装了 CVS。如果没有,那么获取(查看 参考资料 部分)并安装它。如果您正在使用另一个版本系统,那么尝试设置类似我下面展示的一些内容。 首先,您需要创建一个 CVS 仓库。我将假定您可以通过 OpenSSh 或 Pserver CVS access(Pserver 是 CVS 所使用的一个通信协议;查看 参考资料 以获得更多资料)访问一台可以用作 CVS 服务器的机器。然后,您需要创建一个名为 config 的模块,我将用它来管理示例配置文件。最后,您需要安排一个远程非交互地使用您的 CVS 仓库的途径,可以通过 OpenSSH、Pserver 或者任何可行途径。最后一点极度依赖于您具体的系统管理技巧、偏执程度以及环境,所以我只是在 参考资料 中为您指出了一些资料。在本文的其余部分,我将假定您已经配置了通过 OpenSSH 进行的非交互(ssh-agent)登录。 清单 1. 在一台机器上建立 CVS 仓库 # assume that /cvsroot is your repository's home >; setenv CVSROOT /cvsroot # this will use $CVSROOT if no -d option is specified >; cvs init # check that it worked >; ls /cvsroot # you should see one directory called CVSROOT CVSROOT 既然仓库已经建立起来,您接下来就可以远程使用它(您也可以在 CVS 服务器上执行下面的步骤——只是让 CVSROOT 仍是如清单 1 中所示)。 清单 2. 远程地向 CVS 添加 config 模块 # user tzz, machine home.com, directory /cvsroot is the CVSROOT >; setenv CVSROOT tzz@home.com:/cvsroot # use SSH as the transport >; setenv CVS_RSH ssh # use a temporary directory for the module creation >; cd /tmp >; mkdir config >; cd config # tzz is the "vendor name" and initial is the "release tag", they can # be anything; the -m flag tells CVS not to ask us for a message # if this fails due to SSH problems, see the Resources >; cvs import -m '' config tzz initial No conflicts created by this import # now let's do a test checkout >; cd ~ >; rm -rf /tmp/config >; cvs co config cvs checkout: Updating config # check everything is correct >; ls config CVS 现在您已经在主目录下查验了 config CVS 模块的一个拷贝;我们将以此为出发点。本文中我将使用我的用户名 tzz 以及主目录 /home/tzz,不过,当然,您应该恰当地使用您自己的用户名和目录。 让我们来创建一个单独的文件。CVS 选项文件 cvsrc 看起来比较合适,因为我将会更多地用到 CVS。 清单 3. 创建并添加 cvsrc 文件 >; cd ~/config >; echo "cvs -z3" >; cvsrc >; echo "update -P -d" >;>; cvsrc >; cvs add cvsrc # you really don't need log messages here >; cvs commit -m '' >; ln -s ~/config/cvsrc ~/.cvsrc 从此以后,您的所有的 CVS 选项都将位于 ~/config/cvsrc 中,您将更新那个文件而不是 ~/.cvsrc。您所添加的特定选项告诉 CVS 当目录不存在时重新找回目录,以及删除空目录。这通常是用户所期望的。对于其他您希望这样设置的机器来说,您需要再次查验 config 模块,并重新做链接。 清单 4. 查验 config 模块并构造 cvsrc 链接 >; cd ~ # set the following two for remote access >; setenv CVSROOT ... >; setenv CVS_RSH ... # now check out "config" -- this will get all the files >; cvs checkout config >; cd ~/config >; ln -s ~/config/cvsrc ~/.cvsrc 除了刚才您创建的符号链接以外,您可能知道 Linux 也支持硬链接。出于硬链接的局限性,它们不适用于这一模式。例如,假设您创建了一个 ~/.cvsrc 到 ~/config/cvsrc 的硬链接,而后来您又移动了 ~/config/cvsrc (很多条件下会发生这种情况)。~/.cvsrc 文件将仍然持有 ~/config/cvsrc 的原有的旧内容。现在,您再次查验 ~/config/cvsrc。不过,~/.cvsrc 文件将不会被更新。这就是为什么符号链接在这种情形下更好的原因。 让我们假定您修改 cvsrc 以添加更多选项: 清单 5. 修改并提交 cvsrc >; cd ~/config >; echo "checkout -P" >; cvsrc >; cvs commit -m '' 现在,为了更新您所使用的每一台机器上的 ~/.cvsrc,只需要做下面的工作:
|
||||