1.
什么是NFS
NFS(网络文件系统)用于在一个网络上共享文件和目录。它是一个基于RPC的系统并且工作在客户-服务器模式。
NFS服务器使它的一些文件系统可以和网络上的其他系统共享。
NFS客户把服务器上的共享文件系统挂起在本地的挂起点上,可以像使用本地文件系统一样使用NFS挂起的文件系统。
在很多平台上包括个人计算机都可以支持NFS,在UNIX中这已经成为一个事实的标准,提供了透明共享的途径。
当NFS和NIS组合时,它使用户很容易地从任何主机登录并找到同样的环境、主目录和邮箱。
NFS用于在很多种方式中节省磁盘空间,所有的静态文件都可以共享到网络上。
为了使用NFS,在内核配置中必须提供网络子系统和NFS子系统。
2.
NFS版本
NFS版本2在HP-UX10.30以前版本支持,现在都是使用版本3,新版本提供了一些额外的功能:
- 支持64位的文件偏移量,版本2限制为32位。版本2只能定址到2G的文件,64位能支持最大128G的文件。
- 版本3使用数据安全性的内核缓冲存储管理来支持I/O异步。
- 可以使用的文件句柄增加到64位。
- 增强了缓冲管理。
3.
NFS客户与服务器的通信规则
当一个NFS服务器使它的一个或多个文件和目录可共享时,这个过程叫做导出。
被导出的文件放在/etc/exports文件中,只有导出的文件能够被客户访问。
一个系统可以同时作为NFS客户和服务器。
一个服务器可以导出一个文件,一个目录或一个完整的文件系统。
一个服务器只能导出本地文件,不能导出在其他服务器上挂起的文件系统。
如果一个目录被导出,这个目录下的所有目录树被自动导出。
一个客户可以挂起被导出的目录或在导出目录下目录树中的一个子目录。
为了适当的权限,在客户和服务器上用户和组ID必须匹配。
4.
如何挂起远程文件系统
当NFS服务器和客户端完成如下步骤后,挂起一个远程文件系统的过程就完成了:
(1)NFS服务器进程在服务器上启动,通过在引导时运行nfs.core与nfs.server脚本实现。
(2)共享的目录位于/etc/exports文件中并且使用exportfs命令导出。
(3)NFS客户进程运行在客户机上,通过启动nis.core与nis.client脚本实现。
(4)在/etc/fstab文件中提供了远程的文件系统名和挂起点。
远程文件系统也可以使用mount命令挂起。
5.
RPC与NFS
RPC(远程过程调用)允许服务器上的过程被一个客户机上的程序调用。
所有的服务器和客户机之间的NFS通信通过RPC实现。由于RPC支持很多操作系统和平台。
为了传送数据岛RPC,在客户和服务器之间必须使用一个通用的数据格式。RPC通过程序号来生成的。
这些程序号在/etc/rpc文件中列出。
在这个文件中每一行由一个RPC服务名开始后跟一个程序号。程序号后可以列出别名。
6.
如何建立连接
在任何RPC客户与服务器之间联系借助于portmap或者rpcbind守护进程启动。
portmap是HP-UX10.30版本以前使用的,后继版本使用rpcbind。我们这里举portmap的例子。
在客户和服务器之间建立一个连接,当RPC服务器启动时,它向portmap注册它的程序号和要监听的端口。
客户使用服务器上的111端口联系portmap来请求由RPC服务器使用的端口号。(客户发送在/etc/rpc文件中定义的服务器程序号)
portmap返回使用那个程序号的服务器所使用的端口号。
客户由portmap返回的端口号联系服务器。
7.
NFS守护进程
NFS使用很多守护进程以提供跨网络的稳定的文件系统。
NFS是一个无状态的服务器,它并不保持一个文件和访问文件的客户的状态记录。
portmap 客户和服务器 用在HP-UX10.30版本前的RPC守护进程
rpcbind 客户和服务器 用在HP-UX10.30版本(及)后的RPC守护进程
rpc.statd 客户和服务器 和rpc.lockd进程一起使用,提供崩溃恢复功能
rpc.lockd 客户和服务器 用于文件锁定
nfsd 服务器 在启动很多服务器守护进程时被启动(默认4个)
rpc.pcnfsd 服务器 用于PCNFS,所有客户机是UNIX则不需要
rpc.mountd 服务器 保持一个被导出和挂起的文件系统记录
biod 客户 用于处理NFS客户的异步I/O的缓冲存储
8.
配置一个NFS服务器
(1)编辑/etc/exports文件并添加要导出的文件系统
这个文件包含一个导出给客户的文件系统的列表,如下为应用这个文件的规则:
- 每一行由一个文件或目录名开始,后面跟着那个文件和目录的选项
- 多个选项可以用逗号分隔
- 导出的文件和目录有严格的访问权限
- 导出目录树时,所有的子目录自动被导出
- 可以导出一个独立文件或一个目录
- 一个从其他NFS服务器挂起的文件系统不能导出
- 你不把根文件系统导出给所有客户,涉及安全
- 如果一个文件系统以root选项被导出,客户在那个文件系统上有root权限
一个文件内容的例子:
/home -access=moko1:moko2 #赋予主机moko1和moko2对/home的访问权限
/usr/share/man -ro #赋予只读访问权限
/opt/apps -ro
用在文件中的选项:
- -ro 只读访问权限
- -rw 读写访问权限
- -access=client1[:client2] 对一个或多个客户赋予访问权限,冒号分隔
- -root=client1[:client2] 对一个或多个客户赋予root权限,冒号分隔
- -anon=uid 对未知用户赋予UID声明的访问权限
- -anon=65534 不赋予未知用户的访问权限
(2)使用exportfs -a命令导出这些文件系统
编辑好/etc/exports文件后,使用exportfs -a 命令导出文件中所有的文件系统。
收回所有导出的文件系统,使用exportfs -au命令。
收回一个特定的文件系统,使用exportfs -u /usr/share/man。
(3)编辑/etc/rc.config.d/nfsconf文件并为不同的变量设置适当的值
启动脚本在启动的时候使用了/etc/rc.config.d/nfsconf文件中的配置参数。
看一个作为NFS服务器上应该提供的配置信息:
NFS_CLIENT=0
NFS_SERVER=1
NUM_NFSD=4
NUM_NFSIOD=4
PCNFS_SERVER=0
START_MOUNTD=1
(4)启动服务器进程
对于NFS,在/sbin/init.d/目录下面有3个启动脚本:
nfs.core脚本在运行级2启动并且用在NFS客户和服务器上,它根据HP-UX版本启动portmap或rpcbind。
nfs.server脚本在一个NFS服务器运行级3执行。
nfs.client脚本在一个NFS客户机运行级2执行。
执行/sbin/init.d/nfs.core start
执行/sbin/init.d/nfs.server start
(5)查看导出和挂起的文件系统
导出的文件系统可以可以使用exportfs命令不带任何参数列出。
为了列出由NFS客户远程挂起的文件系统使用showmount命令。
showmount -e 可以列出由特定的服务器导出的文件系统。
showmount -a以host:filesystem格式列出了由远程主机挂起的文件系统。
所有挂起的文件系统和远程NFS客户在/etc/rmtab文件中提供。
9.
配置一个NFS客户端
(1)编辑/etc/rc.config.d/nfsconf文件在引导时使一个NFS客户端启用
引导时客户脚本/etc/init.d/nfs.client在运行级2启动,在这之间/etc/init.d/nfs.core脚本被执行。
这些脚本从/etc/rc.config.d/nfsconf中获得参数:
NFS_CLIENT=1
NFS_SERVER=0
NUM_NFSD=0
NUM_NFSIOD=4
PCNFS_SERVER=0
START_MOUNTD=0
这些参数用于启动NFS守护进程。
(2)编辑/etc/fstab文件在系统引导时挂起远程的文件系统
例如挂载moko主机上面的/home目录在/home_moko上,添加如下行:
moko:/home /home_moko nfs rw 0 0
(3)为远程的文件系统创建挂载点
mkdir /home_moko
(4)如果NIS或DNS没有使用,确保/etc/hosts文件中提供了NFS服务器的名字
确保客户端能够访通过主机名问到NFS服务器。
(5)同步客户和服务器的时钟以确保被修改文件的时间戳正确
使用NTP或者其他保证时间一致。
(6)或者重新引导系统或者启动NFS客户并手工挂载远程文件系统
如果不想重新启动系统就挂载文件系统,手工启动进程并挂载:
执行/sbin/init.d/nfs.core start
执行/sbin/init.d/nfs.client start
编辑好/etc/fstab后,执行mount -aF nfs挂载NFS文件系统
如若没有编辑/etc/fstab,执行mount moko:/home /home_moko 挂载指定NFS文件系统
可以使用umount卸载一个NFS文件系统。
所有被挂起的文件系统保存在/mnttab文件中。
(7)使用mount命令查看挂起的文件系统
mount命令可以用于列出所有挂起的文件系统。
showmount -e moko 命令列出一个主机名为moko的NFS服务器导出的文件系统。
10.
故障排除
在任何与网络有关的问题中,首先使用ping命令确保网络是可操作的。
大多数NFS问题与守护进程有关,确保服务器和客户机上的守护进程都在运行。
你需要检查一个NFS服务器上的/etc/exports和客户机上的/etc/fstab文件。
启动守护进程的顺序也很重要,例如portmap或rpcbind应该在nfsd守护进程启动前启动,而inetd守护进程必须在NFS守护进程之前被启动。
rpcinfo命令可以确认一个服务是否向portmap或rpcbind注册并在运行,它联系了portmap或rpcbind进程并显示所有已经注册的服务。
rpcinfo -s
rpcinfo moko 显示所有在主机moko上注册的RPC服务
rpcinfo -u moko nfs 对主机Moko上的nfs服务做一个UDP调用(确认一个服务监听你的请求并能够响应)
nfsstat命令显示了一个主机上的NFS行为。默认它显示客户,服务器和RPC的信息。