8. 故障排除、技巧、诀窍和实用链接

8.1. 透明地处理工作站的特定文件

前面的章节讨论了一种处理工作站特定文件和目录的简单方法,例如/var。它们中的大多数只是即时构建并放在内存盘上,但您可能更喜欢在 NFS 服务器上处理此问题。clusternfs 项目提供了一个网络文件系统服务器,它可以根据多个标准(包括客户端的 IP 地址或主机名)提供不同的文件。基本思想是,如果 IP 地址为 10.2.12.42 的客户端请求一个名为例如的文件,myfile,服务器将查找一个名为myfile$$IP=10.2.12.42$$的文件,并提供此文件而不是myfile(如果可用)。

8.2. 减少无盘工作站的内存使用量

减少内存消耗的一种简单方法是将多个动态创建的目录放在同一个内存盘上。例如,假设第一个内存盘将包含/tmp目录。然后,可以将/var/tmp目录移动到该内存盘上,并在服务器上执行以下命令
        # mkdir /nfsroot/tmp/var
        # chmod 0 /nfsroot/tmp/var
        # ln -s /tmp/var /nfsroot/var/tmp
      

如果您没有本地硬盘驱动器且不通过网络块设备进行交换,另一种减少内存消耗的好方法是在内核编译期间禁用 Swapping to block devices 选项。

8.3. 通过 NFS 进行交换

如果您的工作站没有足够的内存并且没有本地驱动器,您可能希望通过 NFS 进行交换。您必须注意,执行此操作的代码仍在开发中,并且此方法通常很慢。有关此操作的完整文档,请访问http://www.instmath.rwth-aachen.de/~heine/nfs-swap/

如果要应用此解决方案,首先要做的是修补您的内核(您需要内核版本 2.2 或更高版本)。首先从上面的 url 下载补丁,然后 cd 到/usr/src/linux。我假设补丁在/usr/src/patch。然后执行以下命令
        # cat ../patch | patch -p1 -l -s
      
然后,正常编译您的内核并启用 Swapping via network sockets (EXPERIMENTAL)Swapping via NFS (EXPERIMENTAL) 选项。

然后从 NFS 服务器导出具有读写权限和 no_root_squash 的目录。设置客户端,以便它们将其挂载在某个位置(例如在/mnt/swap)。应该以小于内核使用的页面大小(即 Intel 架构上的 4 千字节)的 rsize 和 wsize 挂载它,否则您的机器可能会因内存碎片而耗尽内存;有关 rsize 和 wsize 的详细信息,请参阅 nfs 手册页。现在,要创建 20MB 的交换文件,请执行以下命令(应将其放在客户端的初始化脚本中)
        # dd if=/dev/zero of=/mnt/swap/swapfile bs=1k count=20480
	# mkswap /mnt/swap/swapfile
	# swapon /mnt/swap/swapfile
      
当然,这只是一个示例,因为如果您有多个工作站,则必须更改交换文件名或目录,否则所有工作站将使用同一个交换文件进行交换...

让我们说一下 NFS 交换的缺点:第一个缺点是它通常很慢,除非您有特别快的网卡。其次,这种可能性尚未经过充分测试。最后,这根本不安全:网络上的任何人都可以读取交换的数据。

8.4. 通过网络块设备进行交换

尽管我个人从未尝试过,但我得到报告说,下面描述的技巧有效,至少对于最近的内核是有效的。

通过网络块设备进行交换的一般原理与通过 NFS 进行交换相同。好处是您不必修补内核。但是,大多数相同的缺点也适用于 NBD 方法。

要创建 20MB 的交换文件,您必须首先在服务器上创建它,将其导出到客户端,并在该文件上执行 mkswap。请注意,mkswap 必须在服务器上完成,因为 mkswap 使用 NBD 不处理的系统调用。此外,此命令必须在服务器开始导出文件后发出,因为当服务器开始导出文件时,文件上的数据可能会被破坏。如果我们假设服务器的名称为 NBDserver,客户端的名称为 NBDclient,并且用于导出的 TCP 端口为 1024,则在服务器上发出的命令如下
        # dd if=/dev/zero of=/swap/swapfile bs=1k count=20480
	# nbd-server NBDclient 1024 /swap/swapfile
	# mkswap /swap/swapfile
      
现在,客户端应使用以下命令
        # swapon /dev/nd0
      

同样,这只是为了说明一般原理。文件名也应取决于工作站的名称或 IP。

通过网络块设备进行交换的另一种解决方案是在 NBD 上创建 ext2 文件系统,然后在该文件系统上创建常规文件,最后使用 mkswapswapon 开始在此文件上进行交换。第二种方法比第一种解决方案更接近通过 NFS 进行交换的方法。

8.5. 消除关于/etc/mtab或关机时未卸载目录的错误消息

在服务器上执行以下命令可能会解决问题
        # ln -s /proc/mounts /nfsroot/etc/mtab
        # touch /nfsroot/proc/mounts
      

8.6. 在工作站上安装新软件包

一种简单的方法是在服务器上使用 chroot,然后正常执行您喜欢的安装命令。要 chroot 到适当的位置,请使用以下命令
        # chroot /nfsroot
      

Debian 用户将对 dpkg 的 --root 选项特别感兴趣,该选项只是告诉 dpkg 目标系统的根目录在哪里。