3. 创建客户端的根目录

3.1. 创建目录树

首先,你需要创建目录结构本身。我将所有客户端创建在/clients/hostname目录下,并且我将在下面的示例中使用它。当然,你可以将其更改为任何其他目录。第一步是在根目录下创建相关目录。你应该创建以下目录

bin , dev , etc , home , lib , mnt , proc , sbin , server , tmp , usr , var

以及你可能希望在系统上拥有的任何其他目录。

local, proc” 和 “dev” 目录将在每台机器上单独使用,而其余目录将与其余客户端部分或完全共享。

3.2. 创建启动所需的最小文件系统

3.2.1. 创建dev目录

尽管 “dev” 目录可以共享,但最好为每个客户端创建一个单独的目录。你可以使用适当的 MAKEDEV 脚本创建客户端的 “dev” 目录,但在大多数情况下,从服务器复制它更简单。

bash# cp -a /dev /clients/hostname

你应该记住/dev/mouse, /dev/cdrom/dev/modem是实际设备的符号链接,因此你应该确保它们正确链接以适应客户端的硬件。

3.2.2. 复制必要的二进制文件。

虽然我们从服务器挂载所有内容,但我们需要复制到每个客户端的最低要求。首先,我们需要 “init”,我们的系统在 init 之前无法运行任何东西(正如作者在痛苦中发现的那样 ;-)。所以首先,你应该复制/sbin/init到你客户端的sbin目录,然后为了让rc.S运行,你应该复制/bin/sh到客户端的bin目录。此外,为了挂载所有内容,你需要复制/sbin/mount到客户端的sbin目录。这是最低要求,假设你rc.S中的第一行是 mount -av。但是,我建议复制更多文件update, ls, rm, cpumount,以便在客户端挂载出现问题时,你拥有基本工具。如果你选择在挂载之前让你的交换空间在线,你应该也复制swapon二进制文件。

由于大多数这些二进制文件默认是动态链接的,你还需要复制相当一部分/lib:

bash# cp -a /lib/ld* /lib/libc.* /lib/libcursses.* /client/hostname/lib

目录的内容。应该考虑硬链接二进制文件本身,而不是复制它们。请阅读我在本 Howto 的 第 2.1 节中的相关评论。

请注意,以上所有信息都假设内核在启动时已获得网络参数。如果你计划使用 rarp 或 bootp,你可能也需要这些相关的二进制文件。

一般来说,你将需要最小的文件集,使其能够配置网络并运行rc.S,直到挂载其余文件系统为止。确保你查看了你的/etc/initrc.S文件,确保它们中没有任何“惊喜”,这些惊喜需要在第一次挂载之前访问其他文件。但是,如果你确实找到这样的文件,你可以选择也复制它们,或者从你的init和你的rc.S文件中删除相关部分。

3.2.3. “var” 目录

在大多数情况下,var 目录应该为每个客户端单独使用。但是,很多数据可以共享。在服务器目录下创建一个名为var的目录。我们将挂载服务器的var目录到那里。要创建本地var目录,只需输入

bash# cp -a /var /clients/hostname/

现在,你可以选择要分离什么,以及要共享什么。任何你想要共享的目录/文件,只需从客户端的var目录中删除它,并将它符号链接到/server/var/目录。但是请注意,你应该将其符号链接到/server/var或者../server/var但不要链接到/clients/hostname/server/var因为这在根目录更改时将不起作用。

一般来说,我建议分离/var/run, /var/lock, /var/spool” 和 “/var/log.

目录。

  • etc3.2.4. 其余目录

  • mntproc将在下一节中详细解释。

  • usrhome仅用于本地目的。

  • tmp只是挂载点。tmp取决于你。你可以为每个客户端创建一个不同的目录,或者创建一些/clients/tmp/tmp目录,并将它们挂载到每个客户端的tmp目录。

3.3. 构建etc目录和配置客户端

请注意 -

注意:本节指的是构建 etc 目录,该目录主要在客户端之间共享。如果你的无盘客户端有单独的系统管理员,最好为每个客户端设置一个单独的 etc 目录。

3.3.2. 创建客户端的etc” 目录

虽然我们分离了客户端的etc目录,但我们仍然希望共享大部分文件。一般来说,我认为与服务器的/etc共享 etc 文件是个坏主意,因此我建议创建一个/clients/etc目录,它将保存客户端所需的信息。首先,只需复制服务器的etc内容到/clients/etc目录。

。你应该将所有非机器特定的配置文件添加到此目录,例如motd, issue等等,而不是客户端特定的文件(即inittabfstab)

最重要的更改将在你的rc.d目录中。首先,你应该更改rc.inet1以适合你的本地设置。我通过 LILO/Loadlin 将所有网络参数传递给内核,因此我几乎从rc.inet1文件中删除了所有内容。我只留下 localhost 的 ifconfigroute。如果你使用 rarp 或 bootp,你必须相应地构建它。

其次,你应该编辑你的rc.S。首先,删除所有负责 fsck 检查的部分,因为 fsck 将在服务器启动时进行。然后,你应该找到挂载 fstab 的行。它应该看起来像这样

mount -avt nonfs

-t nonfs 在那里是因为普通客户端首先运行rc.S,然后才使用rc.inet1来配置以太网。由于这会导致没有 NFS 分区被挂载,因此应删除此行。因此,将其更改为 mount -av。如果你需要运行 rarp/bootp 来配置你的网络,在rc.S(或从rc.S调用相应的脚本)中执行此操作,在挂载之前,并确保你的物理binsbin目录具有必要的文件可用。

执行 mount -av 之后,你将拥有一个工作文件系统。构建一个通用的 fstab,以便你以后可以将其复制到每个客户端。你的 fstab 应该看起来像这样

表 1. fstab

server:/clients/hostname/nfsdefault11
server:/bin/binnfsdefault11
server:/usr/usrnfsdefault11
server:/sbin/sbinnfsdefault11
erver:/home/homenfsdefault11
server:/lib/libnfsdefault11
server:/clients/etc/server/etcnfsdefault11
server:/clients/var/server/varnfsdefault11
none/procprocdefault11

请注意,关键字 default 可能不适用于所有版本的 mount。你可以将其更改为rwro或删除所有default 1 1部分。

此外,请确保你的服务器的/etc/exports看起来像这样

表 2. /etc/exports

/clients/hostnamehostname.domainname(rw,no_root_squash)
/clients/etchostname.domainname(ro,no_root_squash)
/clients/varhostname.domainname(ro,no_root_squash)
/usrhostname.domainname(ro,no_root_squash)
/sbinhostname.domainname(ro,no_root_squash)
/binhostname.domainname(ro,no_root_squash)
/libhostname.domainname(ro,no_root_squash)
/homehostname.domainname(rw,no_root_squash)

除了第一行应该为每个主机单独设置之外,其余行可以用主机掩码替换以适合所有主机(如 pc*.domain - 但请记住,* 将只替换不带点的字符串)。我建议你将大多数目录设置为只读,但这取决于你。 Theno_root_squash将确保客户端上的 root 用户也对 nfsd 具有实际的 root 权限。查看 man exports(5)。如果你希望用户能够从客户端运行 passwd,请确保/etc具有rw而不是ro权限。但是,不建议这样做。

请注意关于rc.S文件的另一件事。在 Slackware 中,默认情况下,它会创建一个新的/etc/issue/etc/motd每次运行时都如此。如果这些文件是从服务器以 ro 挂载的,则必须禁用此功能,并且我建议在任何情况下都应该禁用它们。

最后,如果你想在服务器上和客户端上拥有相同的用户库,你应该选择 1),使用 NIS(黄页 - 检查 yp-howto),然后每个客户端将拥有一个单独的/etc/passwd/etc/group因为它从 NIS 服务器接收到它。 2) 在大多数情况下,一个简单的符号链接就足够了。因此,你需要将/clients/etc/passwd硬链接到/etc/passwd,或者如果你喜欢符号链接,链接/etc/passwd硬链接到/clients/etc/passwd(而不是相反的方式,因为客户端不挂载服务器的etc目录)。对/etc/group.

执行相同的操作。etc” 目录

3.3.3. 创建客户端的/server/etc一般来说,客户端 etc 中的大多数文件都应该符号链接到etc目录。但是,有些文件对于每台机器都不同,有些文件在内核加载时必须存在。 你需要从

目录中的最小值如下
resolv.conf
inittab
hosts
fstab

rc.d/rc.Src.Sfstab由于这 5 个文件在所有客户端上都可以相同,因此你可以简单地硬链接它们或再次复制它们。但是,对于文件,建议为每个客户端保留单独的副本。你还需要为每个客户端单独设置etc/HOSTNAMErc.d。我个人建议为每个客户端单独设置所有

文件,因为配置和硬件可能因客户端而异。fstab对于每个客户端,将适当的交换行添加到

表 3. fstab

/dev/swap_partitionswapswapdefault11

客户端的其余/etc文件,你可以硬链接到/clients/etc/*文件,或将它们符号链接到/server/etc(它是/clients/etc/).

的挂载点)。确保你的机器可以通过命名或通过主机文件正确解析。etc/hosts将服务器的 IP 地址保存在etc/hosts中,而不是依赖域名解析,这通常是个不错的主意。如果只依赖域名解析,域名解析服务出现问题时,会阻止你的客户端启动。

3.4. 启动

现在,你所要做的就是启动你的机器,祈祷一切都能正常工作 :-)。