在服务器端,如果您不打算使用旧的用户模式 NFS 守护进程,您需要将 NFS 服务器支持编译进内核(``NFS server support,'' 也称为 knfsd 或 CONFIG_NFSD
)。如果您计划使用较旧的 RARP 协议为客户端分配 IP 地址,那么在服务器内核中启用 RARP 支持可能是一个好主意。(如果您要通过 RARP 启动且不带内核参数,则必须启用此支持。)另一方面,如果客户端与服务器不在同一子网内,则它对您没有帮助。
工作站的内核至少需要以下设置:
CONFIG_NFS_FS
)。请注意,不需要 ext2 支持。CONFIG_ROOT_NFS
)。CONFIG_NET_ETHERNET
)。
对于动态分配的 IP 地址,您还需要选择以下一个或多个内核选项:
CONFIG_IP_PNP
)CONFIG_IP_PNP_RARP
)CONFIG_IP_PNP_BOOTP
)CONFIG_IP_PNP_DHCP
)
如果工作站将在不带内核参数的情况下启动,您还需要将根设备设置为 0:255。通过使用命令 mknod /dev/nfsroot b 0 255
创建一个虚拟设备文件来完成此操作。在创建了这样一个设备文件之后,您可以使用命令 rdev <kernel-image> /dev/nfsroot
设置内核镜像的根设备。[注意:现代内核识别 root=/dev/nfs
作为命令行参数;为了保持一致性和/或兼容性,最好使用 /dev/nfs
作为设备名称,而不是 /dev/nfsroot
。]
警告:虽然这些说明可能对您有效,但在生产环境中绝不是明智之举。为了更好地为客户端设置根文件系统,请参阅 Ofer Maor 编写的 NFS-Root-Client 迷你指南 <ofer@hadar.co.il>
。
在决定将根目录树放在哪里之后,使用(例如) mkdir -p <directory>
和 tar cClf / - | tar xpCf <directory> -
创建它。
如果您在不使用 LILO 的情况下启动内核,那么根目录必须是 /tftpboot/<IP 地址>
。如果您不喜欢这样,您可以在内核源代码的顶层 Makefile 中更改它,查找类似这样的行:NFS_ROOT = -DNFS_ROOT="\"/tftpboot/%s\""
。如果您更改了此项,则必须重新编译内核。
现在删除不需要的文件,并检查 /etc/rc.d 脚本。一些重要的点:
将根目录导出到工作站。基本思路是编辑 /etc/exports
文件,包含类似于以下行的内容:
/path/on/server/to/nfs_root <客户端 IP 地址>(rw,no_root_squash,no_all_squash) <第二个客户端 IP 地址>(rw,no_root_squash,no_all_squash)
/path/on/server/to/nfs_root <客户端 IP 网络>/<客户端 IP 子网掩码>(rw,no_root_squash,no_all_squash)
例如,一个 DHCP 客户端在 C 类子网上接收 IP 地址将需要类似于这样的 exports 条目:
/path/on/server/to/nfs_root 192.168.263.0/255.255.255.0(rw,no_root_squash,no_all_squash)
no_root_squash
参数允许超级用户 (root) 被 NFS 服务器视为超级用户;否则 root 将被重新映射为 nobody,并且通常无法对文件系统执行任何有用的操作。no_all_squash
参数类似,但适用于非 root 用户。详情请参阅 exports(5)
手册页。
在对 exports 文件进行任何更改后,您需要通知 NFS 服务器。在 Red Hat 下,这可以很容易地通过键入 /etc/rc.d/init.d/nfs stop; /etc/rc.d/init.d/nfs start
完成。在其他系统上,一个简单的 /etc/rc.d/init.d/nfs restart
甚至 exportfs -a
可能就足够了,而在运行用户模式 NFS 守护进程的旧机器上,您可能实际上需要 killall -HUP rpc.mountd; killall -HUP rpc.nfsd
。(但是,不要 killall -HUP rpc.portmap
!)
如果安装了 tcp_wrappers,您可能还需要编辑 /etc/hosts.allow
和/或 /etc/hosts.deny
。特别是,如果远程系统(客户端)收到 RPC: connection refused 错误,/etc/hosts.deny
可能包含 portmap: ALL
或 ALL: ALL
。要使客户端能够使用服务器的端口映射器,请在 /etc/hosts.allow
中添加相应的行。
portmap: <client-IP-number>
portmap: <2nd-client-IP-number>
portmap: <client-IP-network>/<client-IP-netmask>
在这种情况下,无需重启任何东西。您可以通过在 NFS 服务器上运行 rpcinfo -p
,以及在允许范围内的 Linux 客户端上运行 rpcinfo -p NFS 服务器
来检查;两者列出的 RPC 服务应该匹配。
如果遇到问题,请检查 /var/log/messages
和 /var/log/syslog
中是否有错误(例如,运行 tail -f /var/log/messages /var/log/syslog
,然后尝试启动客户端),并查看您的手册页(exports、exportfs、portmap 等)。作为最后的手段,重启 NFS 服务器可能会有所帮助,但这有点像微软的做法...
在网络上的某个地方设置 RARP。如果您在不带 nfsroot 参数的情况下启动,RARP 服务器必须是 NFS 服务器。通常这将是 NFS 服务器。要做到这一点,您需要运行一个带有 RARP 支持的内核。
要做到这一点,请执行(并将其安装在服务器的 /etc/rc.d
中的某个位置!):
/sbin/rarp -s <ip-addr> <hardware-addr>
其中:
是工作站的 IP 地址,以及
是工作站网卡的以太网地址。
示例:/sbin/rarp -s 131.131.90.200 00:00:c0:47:10:12
您也可以使用符号名称而不是 IP 地址,只要服务器能够找到 IP 地址。(/etc/hosts 或 DNS 查询)
对于 BOOTP 设置,您需要编辑 /etc/bootptab
。请查阅 bootpd(8) 和 bootptab(5) 手册页。
DHCP 服务器不需要与 NFS 服务器是同一台服务器,在大多数情况下,DHCP 服务器已经设置好。如果没有,请查阅 DHCP 迷你指南以获得更多帮助。
我不知道硬件地址!我该如何找到它?
/sbin/arp -a