对于NFS挂载的研究(1)


对于NFS来说,它的一个非常重要的应用就是挂载。在这方面我们来详细探讨一下。有些人, 想用NFS Root挂载, 来建立其客户端的目录, 这份 Mini-Howto,正是为了帮助这些人而写的. 请注意, 这工作有许多方法可以达成, 端视你的需求与目的而定. 假如客户端彼此独立, 且每个客户端各自有用户群和管理员, 那么, 不和其他客户端, 分享重要的目录, 将是必须的.另一方面, 倘若客户端, 计划用于多种用户, 并且全都由同一人管理(例如电脑课), 这种情形, 为了容易管理, 尽可能要使愈多文档能够分享. 这份 Howto 将焦点于第二种情况.

当建立客户端的根目录, 并尝试去降到最小尺寸时, 我们主要焦点于, 哪个文档可以分享, 或者可从伺服器挂上. 在这份 Howto 中, 我将依自己的经验, 对客户端的组态 (configuration), 提出建议. 但在我们开始前,  请注意:

* 这份 Mini-Howto 并没有实际说明, 如何挂载 NFS Root.如果你需要这方面的进一步信息, 请参考 NFS-Root Mini-Howto.

* 我客户端的组态, 大多基础于 mounts 和 symbolic links. 这些symbolic links, 大部份可取代为 hardlinks. 选择哪种则随个人喜好. 而在 mount 和 symbolic link 之间, 放置 hardlink 作联系,这样有其优点, 但或许会发生混淆. 一个文档, 除非它的 hardlinks全都移除了, 否则将无法删掉. 因此, 当你更新了某个档, 该档的 hardlinks 仍会指到旧的版本, 为了避免这情形, 你必须非常小心, 并要维系好, 你所放置的每个连结.

* 从伺服器挂上信息的方式, 有两种. 第一种 (最普遍), 是将整个伺服器的根目录, 挂在本地端的目录下, 然后只改路径, 或直接连结相关的目录. 就我而言, 我不喜欢把伺服器的 root partitions挂到客户端上. 因此, 这份 Howto 建议一种方式, 把伺服器上相关的目录, 挂到系统适当的位置.

* 这份 Howto 立论于, 我在 Slackware 3.1 based distribution 之上,建立客户端目录的经验. 对其他使用者来说, 可能会有地方不同 (尤其是 rc.* 这些档), 然而观念应该仍旧不变.

建立客户端的根目录

1. 建立目录树

最初, 你需要建立目录本身的架构. 我把所有的客户端, 建在/clients/hostname 之下, 我拿它用于下面的例子. 不过, 这目录也可改为其他路径. 接著第一阶段, 是在这根目录下, 建立相关的目录. 你应该建立下列目录:bin, dev, etc, home, lib, mnt, proc, sbin, server, tmp, usr, var以及其他, 你可能想置于系统上的目录.local, proc, dev 这些目录, 每台机器要各自一份, 而其余目录,则是部分的, 或完整的, 和其他客户端共享.

2. 建立开机所需, 最小的文档系统

2.1. 建立 dev 目录.

尽管目录 dev 可以共享, 但最好还是为每个客户端, 各自建一个.你可以用合适的 MAKEDEV scripts, 来建客端的 dev目录, 不过大多数情况, 直接从伺服器复制, 比较简单:cp -a /dev /clients/hostname你应记住, /dev/mouse, /dev/cdrom, /dev/modem 是 symbolic links,将连结至实际的设备, 因此, 你应确保, 它们连结正确, 而符合客户端的硬件.

2.2. 复制所需的执行档.

尽管我们从伺服器, 挂载每件东西, 但最低限度, 我们还是需要把些东西, 拷到客户端. 首先, 我们需要 "初始", 在初始化之前, 系统不可能跑任何东西 (虽然作者费了许多工夫, 才发现到这件事 ;-).所以第一, 你应该把 /sbin/init 复制到客户端的目录 sbin 下, 这么一来, 便会执行 rc.S, 接著, 你应复制 /bin/sh 到客户端的目录 bin 下.还有, 为了挂载所有东西, 你需要把 /sbin/mount 拷到客户端的目录 sbin 下. 假设你 rc.S 的第一行是 mount -av, 那这就是最低限度了. 然而, 我建议再多拷些档: update, ls, rm, cp, umount, 如此一来,客户端挂载时若出问题, 就有基本工具可用了. 假如你选择在挂载前启动 swap, 那你还应复制执行档 swapon.因为这些执行档, 多数预设为动态连结, 所以你也需复制等份的 /lib:cp -a /lib/ld* /lib/libc.* /lib/libcursses.* /client/hostname/lib应考虑, 若不用复制, 而是 hardlink 至执行档本身的情形. 请读我对这所作的评语, 在这份 Howto 的 2.1 节.请注意, 上述所有资料, 是假设开机时, 网路组态的参数已传给核心. 如果你打算用 rarp 或 bootp 的话, 与这些相关的执行档, 你也可能需要.一般而言, 你需要的文档, 最少要使你能设定网路以及跑 rc.S, 直到开始挂上文档系统的其他部分. 确定你检查过, 你的 /etc/init 以及 rc.S 档, 确定它们没有任何的 "惊喜", 这是指, 在第一次挂载前,发生存取其他文档的状况. 然而, 倘若你真的发现有这样的档, 你可以也拷过来, 或是从你的 init 档和 rc.S 档, 移除相关的部分.

2.3. 目录 var

大多数情况下, 目录 var 应该, 每个客户端各别一份. 可是, 目录 var 的资料大多都能共享. 请在伺服器的目录下, 建一目录,称作 var. 我们将在那, 挂上伺服器的 var 目录. 要建立本地端的var 目录, 直接键入:cp -a /var /clients/hostname/现在, 你可选择, 何者要区隔开, 何者要共享. 要共享的目录或文档,要先从客户端的 var 目录中, 把它移除, 再把它 symbolic link 至目录 /server/var. 不过请注意, 你应该 symbolic link 至 /server/var 或../server/var, 而非 /clients/hostname/server/var, 因为这么做, 当根目录(指 /clients/hostname/) 更动后, 将会失效.一般而言, 我建议隔开 /var/run, /var/lock, /var/spool, /var/log.

2.4. 其余的目录

* etc 在下节有完整说明.

* mnt 与 proc 用于本地端.

* usr 和 home 仅为挂载点 (mount points).

* tmp 随你决定. 你可以为每个客户端, 各别建立不同的 tmp 目录,也可以建些 /clients/tmp 目录, 然后把它挂到每个客户端的 /tmp之下. 我建议你为每个客户端, 各别提供一 tmp 目录.

3. 建立 etc 目录, 并设定客户端的组态

请注意 - 本节是谈, 建立目录 etc, 此目录大多共享于客户端之间. 假如你哪些无磁盘的客户端, 各有不同的系统管理员, 那最好为每个客户端, 各自设立一 etc 目录.

3.1. 建立多个客户端共用的 etc 目录

虽然我们隔开客户端之间的 etc 目录, 不过我们仍想在那, 分享大部分的文档. 一般而言, 我认为, 和伺服器的 /etc 目录, 共享 etc档, 这样不好, 因此我建议, 开个目录 /clients/etc, 容纳客户端所需的信息. 这样一开始, 只要把伺服器的 etc 目录内容, 复制到/clients/etc 目录下即可.

你应该把所有非硬件规格的组态档, 如 motd, issue 等, 全都加进这个目录, 而不应加入会随客户端硬件而异的文档. (例如, initab或是 fstab)最重大的改变, 是在你的 rc.d 目录里. 首先, 你应该调整 rc.inet1,以适宜于你本地端的设定. 我透过 LILO/Loadlin, 把我网路组态的所有参数, 都传给核心, 因此我几乎移除了 rc.inet1 档的每一行.唯一留下的, 是 localhost 的 ifconfig 和 route. 假如你是用 rarp 或是 bootp, 那你就必须视情况而改.

其次, 你应该编辑你的 rc.S 档. 首先, 移除所有会导致 fsck 检查的部分, 这是因为伺服器开机时, 会启动 fsck. 接著, 你应该把挂载你 fstab 的那一行找出来. 这应该看起来像:

  1. mount -avt nonfs 

-t nonfs 在这, 是因为正常的客户端, 先跑 rc.S, 紧接著以 rc.inet1来组设 Ethernet. 由于这会导致, 不挂载任何的 NFS partitions,所以这行应该删掉. 因此, 把它改成 mount -av. 倘若你需要跑rarp/bootp 来设定你网路的组态, 那就在挂载前, 在 rc.S 作这件事(或者从 rc.S 呼叫适当的 script), 并且确定你磁盘的 bin 和 sbin目录, 提供所需的文档.


相关内容