NFS文件系统是我们比较熟悉的一类网络协议。在这个网络协议的支持下,可以完成文件的共享和网络存储。对于这方面内容我们接下来主要讲解一下基本监控程序以及配置等相关内容。
基本监控程序
要顺利运行NFS,至少需要五个Linux服务,它们各有不同的功能,有的负责装载服务,有的保证远程命令指向正确的位置.这些服务通过/etc/rc.d/init.d目录中的nfs,nfslock和portmap脚本启动.下面简单介绍每个监控程序:
(1) 基本NFS
rpc.nfsd是NFS服务器监控程序,它通过/etc/rc.d/init.d目录中的nfs脚本启动.NFS监控程序还启动rpc.mountd装载监控程序,并导出共享目录.
(2) RPC装载
可以用mount命令连接本地目录或网络目录,但还需要一个装载NFS目录的特殊监控程序rpc.mountd
(3) 端口映射器
portmap监控程序只是定向RPC通信数据流,但它对于NFS服务很重要.如果不运行portmap,则NFS客户机无法找到从NFS服务器共享的目录.
(4) 重新启动与statd
当NFS服务需要中断或者重新启动时,rpc.statd监控程序和rpc.lockd在服务器重新启动之后使客户机恢复NFS连接.
(5) 锁定
通过共享NFS目录打开文件时,锁定可以使用户不能覆盖同一个文件.锁定通过nfslock脚本并使用rpc.lockd监控程序启动运行.
配置步骤
服务器端的配置及操作:
1、需要运行的守护进程
portmap
nfsd
rpc.mountd
rpc.rquotad
rpc.statd
lockd
启动NFS服务器需要启动portmap和nfs两个服务.并且portmap一定要优先于nfs启动
停止NFS服务器,需要先停止NFS服务再停止portmap服务!
停止:# /etc/rc.d/init.d/nfs stop
# /etc/rc.d/init.d/portmap stop
开始:# /etc/rc.d/init.d/portmap start
# /etc/rc.d/init.d/nfs start
2、NFS文件系统的配置文件
导出目录:当服务器让某个目录能为其它计算机所使用时,通常说这个服务器"导出(export)"了一个目录
/etc/exports 是导出目录的说明清单.
书写规则是:
每个共享规则一行,用反斜线可以续行
能够访问某个给定文件系统的客户机是用一个以空白隔开的列表来表示,每台客户机之后紧跟着用括号括起来,以逗号分隔的一系列选项.
如下所示:
导出目录 客户机(选项1,选项2,……) 客户机(选项1,选项2,……)
例如:
/mnt/cdrom *.abc.com(ro,sync) master.abc.com(rw,sync)
上面的规则代表将/mnt/cdrom目录以只读同步方式共享给*.abc.com域,并且以读写同步方式共享给master.abc.com主机.
/tmp *(rw,no_root_squash)
/home/public 192.168.0.*(rw) *(ro)
/home/test 192.168.0.100(rw)
/home/linux *.the9.com(rw,all_squash,anonuid=40,anongid=40)
/etc/exports 文件中客户机的说明
类型 语法 含义
主机名 hostname 单个主机
网络组 @groupname NIS网络组
通配符 *和? 具有通配符的FQDN(*不匹配.)
IP网络 ipaddr/mask CIDR风格的说明(如:128.138.92.128/25)
/etc/exports 文件中常用的导出选项#p#
选项 说明
ro 只读访问
rw 读写访问
rw=list 大多数客户机为只读.list举出的主机允许以可写方式安装NFS;其它所有主机必须以只读方式安装
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
sSecure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置.
hide 在NFS文件系统的共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录.用于支持PC和不可信的单用户主机
no_all_squash 保留共享文件的UID和GID(默认),运行root正常访问,这很危险
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认),将UID 0和GID 0映射("压制")成anonuid和anongid所制定的值
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定远程root账号应被映射的UID号(该UID应在NFS服务器的/etc/passwd文件中存在)
anongid=xxx 指定远程root账号应被映射的GID号(该GID应在/etc/passwd文件中存在)
noaccess 防止访问这个目录及其子目录(用于嵌套导出)
另外,还需要查看系统的iptables、/etc/hosts.allow、/etc/hosts.deny是否设置了正确的NFS访问规则.
使用命令exportfs
exportfs命令:
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动NFS文件系统呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
exportfs [-aruv]
-a :全部mount或者unmount /etc/exports中的内容
-r :重新mount /etc/exports中分享出来的目录
-u :umount 目录
-v :在 export 的?r候,将详细的信息输出到屏幕上.
具体例子:
[root @test root]# exportfs -rv <==全部重新 export 一次!
exporting 192.168.0.100:/home/test
exporting 192.168.0.*:/home/public
exporting *.the9.com:/home/linux
exporting *:/home/public
exporting *:/tmp
reexporting 192.168.0.100:/home/test to kernel
exportfs -au <==全部都卸载了.
对配置文件的补充说明:
mountd 与 nfsd 共享一个访问控制数据库,除了内核内部的表之外,这个数据库的运行副本通常还保存在一个称为 /var/lib/nfs/xtab 的文件中.
因为xtab并不是供人阅读的所以要使用扶助命令来添加和修改其中的项,就是用exportfs
3、FAQ
1>如何进行NFS文件系统的磁盘限额?
对共享目录的属主和属组作限额即可
2> 如何转储NFS统计信息
# nfsstat -s //显示NFS服务器进程的统计信息
# nfsstat -c //显示与客户端操作相关的信息#p#
客户端的配置及操作
1、需要运行的守护进程
portmap
2、配置
安装NFS文件系统
mount nfs目录的方法:
mount -t nfs -o rw,hard,intr,bg hostname(orIP):/directory /mount/point
NFS文件系统的安装标志
标志 说明
rw 以读写方式安装文件系统(也必须要以相同的方式来导出)
ro 以只读方式安装文件系统
bg 如果安装失败(服务器没有响应),在后台一直尝试,继续发其它的安装请求
hard 以硬方式安装文件系统(这是默认情况).如果服务器当机,让试图访问它的操作被阻塞,直到服务器恢复为止
soft 以软方式安装文件系统.如果服务器当机,让试图访问它的操作失败,返回一条出错消息.这项功能对于避免进程"挂"在无关紧要的安装操作上来说非常有用
intr 允许用户中断被阻塞的操作(并且让它们返回一条出错消息)
nointr 不允许用户中断
retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数
timeo=n 设置请求的超时时间(以十分之一秒为单位)
rsize=n 设置读缓冲的大小为n字节.对TCP和UDP安装都适用,但最优值不一样(32K较好).
wsize=n 设置写缓冲的大小为n字节.对TCP和UDP安装都适用,但最优值不一样(8K较好,默认是1K).
nfsvers=n 设置NFS文件系统的版本 2 或者 3 (在正常情况下是自动的)
tcp 选择通过TCP来传输.默认选择UDP
fg 和bg正好相反,是默认的参数
mountport 设定mount的端口
port 根据server端export出的端口设定,例如如果server使用5555端口输出NFS,那客户端就需要使用这个参数进行同样的设定
udp 使用udp作为NFS文件系统的传输协议(NFS V2只支持UDP)
namlen=n 设定远程服务器所允许的最长文件名.这个值的默认是255
acregmin=n 设定最小的在文件更新之前cache时间,默认是3
acregmax=n 设定最大的在文件更新之前cache时间,默认是60
acdirmin=n 设定最小的在目录更新之前cache时间,默认是30
acdirmax=n 设定最大的在目录更新之前cache时间,默认是60
actimeo=n 将acregmin、acregmax、acdirmin、acdirmax设定为同一个数值,默认是没有启用.
retry=n 设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试.默认的数值是10000 minutes
noac 关闭cache机制.
同时使用多个参数的方法:mount -t nfs -o timeo=3,udp,hard 192.168.0.30:/tmp /nfs
请注意,NFS客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突.比如说服务器以只读的方式导出,客户端却以可写的方式mount,虽然可以成功mount上,但尝试写入的时候就会发生错误.一般服务器和客户端配置冲突的时候,会以服务器的配置为准.
具体例子:
Linux: mount -t nfs 192.168.0.1:/tmp /mnt/nfs
Solaris:mount -F nfs 192.168.0.1:/tmp /mnt/nfs
BSD: mount 192.168.0.1:/tmp /mnt/nfs
在启动时安装远程文件系统
/etc/fstab的设定方法
/etc/fstab的格式如下:
fs_spec mountpoint fs_type fs_options fs_dump fs_pass
fs_spec:该字段定义希望加载的文件系统所在的设备或远程文件系统,对于NFS文件系统的这个参数一般设置为这样:192.168.0.1:/NFS#p#
mountpoint:本地的挂载点,应确保用mkdir创建适当的目录作为安装点
fs_type:对于NFS来说这个字段只要设置成nfs就可以了
fs_options:挂载的参数,可以使用的参数可以参考上面的mount参数.
fs_dump - 该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0
fs_pass - 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2.若该文件系统无需在启动时扫描则设置该字段为0 .
例如:
server1:/home/software /home/software nfs deaults 0 0
挂载上就可以象使用本地硬盘一样了
showmout命令对于NFS的操作和查错有很大的帮助,所以我们先来看一下showmount的用法
showmout
-a :这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机NFS文件系统目录的cline机器.
-e :显示指定的NFS SERVER上export出来的目录.
例如:
showmount -e 192.168.0.30
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100
3、FAQ
1> WIN下能用上NFS文件系统共享出来的目录吗?
可以,需要在客户端另外安装一个软件Microsoft Service for UNIX.
2> 如何从客户机的角度来核实一台服务器已经正确的导出了它的文件系统
# showmount -e server
Export list for server
/home/boggs inura.toadranch.com
指出服务器server上的目录/home/boggs已经被导出给客户系统inura.toadranch.com
3> 如何更改输入队列的大小?
在linux 2.2和2.4内核里,默认的输入队列大小是64K,2.6内核是108K.下面将设置为较合理的值256K
# echo 262144 > /proc/sys/net/core/rmem_default
# echo 262144 > /proc/sys/net/core/rmem_max
4> 如何卸装NFS文件系统
使用umount命令
如果卸装的时候,还有文件正好在用,会得到出错信息:device is busy,可以使用lsof找出打开文件的进程并杀死,然后卸装
用umount -f 强制文件系统被卸装