前言
NFS 这个藉由网络分享文件系统的服务在架设的时候是很简单的,不过,它最大的问题在于『权限』方面的概念! 因为在客户端与服务器端可能必须要具备相同的账号才能够存取某些目录或档案。 另外,NFS 的启动需要透过所谓的远程过程调用 (RPC),也就是说,我们并不是只要启动 NFS 就好了, 还需要启动 RPC 这个服务。
NFS 通常需要与 NIS 这一个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱。
NFS介绍
NFS=network file system
NFS最早是由Sun公司于1984年开发出来的,其目的就是让不同计算机不同操作系统之间可以彼此共享文件。
由于NFS使用起来非常方便,因此很快得到了大多数的UNIX/Linux系统的广泛支持,而且还被IETE(国际互联网工程组)制定为RFC1904、RFC1813和RFC3010标准
NFS使用的是C/S模式,我们今天会学习服务器的架设,和client的使用。
NFS只有三个系统守护进程(不包含非必要)
rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器
rpc.mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过rpc.nfsd登录NFS服务后,在使用NFS服务所提供的文凭前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
rpc.lockd(非必要):
这个玩意儿可以用在管理档案的锁定 (lock) 用途。为何档案需要『锁定』呢? 因为既然分享的 NFS 档案可以让客户端使用,那么当多个客户端同时尝试写入某个档案时, 就可能对于该档案造成一些问题啦!这个 rpc.lockd 则可以用来克服这个问题。 但 rpc.lockd 必须要同时在客户端与服务器端都开启才行喔!此外, rpc.lockd 也常与 rpc.statd 同时启用。
rpc.statd(非必要):
可以用来检查档案的一致性,与 rpc.lockd 有关!若发生因为客户端同时使用同一档案造成档案可能有所损毁时, rpc.statd 可以用来检测并尝试回复该档案。与 rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效。
portmap:portmap的主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
这些进程都可以在进程中找到。
NFS的软件结构
1. 主要配置文件:/etc/exports
这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
现在的版本都有的,等会我们修改的也就是这个文件
2. NFS文件系统维护指令:/usr/sbin/exportfs
这是维护NFS共享资源的命令,我用的不是很多,我一般在配置文件里面定义
3. 分享资源的登录档:/var/lib/nfs/*tab
其中的etab记录了NFS分享出来的目录的完整权限设定值,另一个是xtab,记录曾经连接到此NFS主机的相关client数据。
4. 客户端查询服务器分享资源的指令:/usr/sbin/showmount
shouwmount命令主要是用在client端,可以用来查看NFS共享出来的目录资源
企业NFS服务器拓扑图
相关阅读:
Ubuntu 12.04安装NFS server http://www.linuxidc.com/Linux/2012-09/70728.htm
NFS服务器安装配置实现Ubuntu 12.04与ARM文件共享 http://www.linuxidc.com/Linux/2012-10/73159.htm
Ubuntu搭建nfs服务器 http://www.linuxidc.com/Linux/2012-10/71930.htm
文件服务器NFS配置详解 http://www.linuxidc.com/Linux/2013-06/86542.htm
Ubuntu下搭建NFS网络文件系统服务器 http://www.linuxidc.com/Linux/2013-07/87367.htm
Heartbeat_ldirector+LB+NFS实现HA及LB、文件共享 http://www.linuxidc.com/Linux/2013-06/85292.htm
CentOS 5.5配置NFS服务器教程 http://www.linuxidc.com/Linux/2013-03/81737.htm
Ubuntu 12.10下NFS的安装使用 http://www.linuxidc.com/Linux/2013-03/80478.htm
NFS Server端的设定
所需软件
RPC主程序:portmap (在 CentOS 5.x 这个软件称为 portmap,在 CentOS 6.x 之后称为 rpcbind)
NFS主程序:nfs-utils
#yum install portmap nfs-utils
/etc/exports 配置文件的语法与参数
# vim /etc/exports
[分享目录] [第一部主机(权限)] [可用主机名] [可用通配符]
/media 192.168.100.0/24(rw) *(ro) #同一目录不同范围设置不同权限
/tmp *(rw,no_root_squash) #所有都可以访问tmp,用通配符处理主机名,特别注意下这里的权限;
/nfs/public *(rw,all_squash,anonuid=45,anongid=45) #开放匿名登录,重点在all_squash,并且要配合anonuid!
………………
权限方面的常见参数
参数值 | 内容说明 |
rw / ro | 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。 |
sync / async | sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘 |
no_root_squash root_squash |
客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行 |
all_squash | 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) |
anonuid anongid |
anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值! 当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID |
Tips:某些Linux发行版不会主动提供exports文件,自行建立即可。
在发布共享目录的格式中除了共享目录是必跟参数外,其他参数都是可选的。并且共享目录与客户端之间及客户端与客户端之间需要使用空格符号,但是客户端与参数之间是不能有空格的
配置nfs固定端口(可选)
vim /etc/sysconfig/nfs
自定义以下端口,然而不能和其他端口冲突
RQUOTAD_PORT=5001
LOCKD_TCPPORT=5002
LOCKD_UDPPORT=5002
MOUNTD_PORT=5003
STATD_PORT=5004
配置iptables策略
iptables -P INPUT -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport –dport 111,2049 -j ACCEPT
iptables -A INPUT -p udp -m multiport –dport 111,2049 -j ACCEPT
iptables -A INPUT -p tcp –dport 5001:5004 -j ACCEPT
iptables -A INPUT -p udp –dport 5001:5004 -j ACCEPT
service iptables save
Tips:iptables开启nfs相关端口TCP和UDP都要开启哈
启动NFS
# /etc/init.d/portmap start
# /etc/init.d/nfs start
也可以用service nfs start / service portmap start
测试
1. 使用rpcinfo命令检测nfs使用的端口
# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100003 2 tcp 2049 nfs
2. 检测nfs的rpc注册状态
# rpcinfo -u localhost nfs
program 100003 version 2 ready and waiting
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
3.查看共享目录和参数设置
# cat /var/lib/nfs/etab
4. 使用showmount命令
#showmount -e 或 showmount -e IP地址
#showmount -d 或 showmount -d IP地址
-a :显示目前主机与客户端的 NFS 联机分享的状态;
-d:列出已经使用的情况;
-e :显示某部主机的 /etc/exports 所分享的目录数据。
NFS管理
如果你想要重新处理 /etc/exports 档案,当重新设定完 /etc/exports 后需不需要重新启动 nfs ?
不需要啦!如果重新启动 nfs 的话,要得再向 RPC 注册!很麻烦~这个时候我们可以透过 exportfs 这个指令来帮忙!
# exportfs [-aruv] 选项与参数:
-a :全部挂载(或卸除) /etc/exports 档案内的设定
-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的内容!
-u :卸除某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上!
NFS客户端设定
1. 确认本地端已经启动了portmap (rpcbind) 服务!
默认系统已经启动,不过建议检查下是否启动;
2. 扫瞄 NFS 服务器分享的目录有哪些,并了解我们是否可以使用 (showmount);
# showmount -e 192.168.100.254 Export list for 192.168.100.254:
/tmp *
/home/test 192.168.100.10
/home/public (everyone)
3. 在本地端建立预计要挂载的挂载点目录 (mkdir);
建立挂载点,根据自己的需要来确定是否要建立;
#mkdir /home/nfs/public
4. 利用 mount 将远程主机直接挂载到相关目录。
# mount -t nfs 192.168.100.254:/home/public /home/nfs/public
挂载后可以用df或者mount查看挂载情况;
NFS客户端可处理的挂载参数与开机挂载
参数 | 参数代表意义 | 系统默认值 |
suid nosuid |
如果挂载的 partition 上面有任何 SUID 的 binary 程序时, 你只要使用 nosuid 就能够取消 SUID 的功能了! | suid |
rw ro |
你可以指定该文件系统是只读 (ro) 或可擦写喔!服务器可以提供给你可擦写, 但是客户端可以仅允许只读的参数设定值! | rw |
dev nodev |
是否可以保留装置档案的特殊功能?一般来说只有 /dev 这个目录才会有特殊的装置,因此你可以选择 nodev 喔! | dev |
exec noexec |
是否具有执行 binary file 的权限? 如果你想要挂载的仅是数据区 (例如 /home),那么可以选择 noexec 啊 | exec |
user nouser |
是否允许使用者进行档案的挂载与卸除功能? 如果要保护文件系统,最好不要提供使用者进行挂载与卸除吧! | nouser |
auto noauto |
这个 auto 指的是『mount -a』时,会不会被挂载的项目。 如果你不需要这个 partition 随时被挂载,可以设定为 noauto。 | auto |
一般来说,如果你的 NFS 服务器所提供的只是类似 /home 底下的个人资料, 应该不需要可执行、SUID 与装置档案,因此当你在挂载的时候,可以这样下达指令:
# mount -t nfs -o nosuid,noexec,nodev,rw192.168.100.254:/home/public /home/nfs/public
这样一来你所挂载的这个文件系统就只能作为资料存取之用,相对来说,对于客户端是比较安全一些的。 所以说,这个nosuid, noexec, nodev等等的参数可得记得啊!
关于NFS特殊的挂载参数
除了上述的 mount 参数之外,其实针对 NFS 服务器,咱们的 Linux 还提供不少有用的额外参数喔!这些特殊参数还非常有用呢! 为什么呢?
举例来说,由于文件系统对 Linux 是非常重要的东西,因为我们进行任何动作时,只要有用到文件系统, 那么整个目录树系统就会主动的去查询全部的挂载点。
如果你的 NFS 服务器与客户端之间的联机因为网络问题, 或者是服务器端先关机了,却没有通知客户端,那么客户端只要动到文件系统的指令 (例如 df, ls, cp 等等) ,整个系统就会慢到爆!
因为你必须要等到文件系统搜寻等待逾时后,系统才会饶了你!
参数 | 参数功能 | 预设参数 |
fg bg |
当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行? 若在前景执行时,则 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 则 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用 bg 比较妥当。 | fg |
soft hard |
如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续的呼叫,直到对方恢复联机为止。如果是 soft 的话,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系统的延迟会比较不这么明显。同上,如果你的服务器可能开开关关,建议用 soft 喔! | hard |
intr | 当你使用上头提到的 hard 方式挂载时,若加上 intr 这个参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。 | 没有 |
rsize wsize |
读出(rsize)与写入(wsize)的区块大小 (block size)。 这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量。一般来说, 如果在局域网络内 (LAN) ,并且客户端与服务器端都具有足够的内存,那这个值可以设定大一点, 比如说 32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力! 但要注意设定的值也不要太大,最好是达到网络能够传输的最大值为限。 |
rsize=1024 wsize=1024 |
如果你的 NFS 是用在高速运作的环境当中的话,那么可以建议加上这些参数的说:
#mount -t nfs -o nosuid,noexec,nodev,rw-o bg,soft,rsize=32768,wsize=32768192.168.100.254:/home/public /home/nfs/public
则当你的 192.168.100.254 这部服务器因为某些因素而脱机时,你的 NFS 可以继续在背景当中重复的呼叫! 直到 NFS 服务器再度上线为止。
这对于系统的持续操作还是有帮助的啦! 当然啦,那个 rsize 与 wsize 的大小则需要依据你的实际网络环境而定
NFS开机即挂载
我们知道开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?非常可惜的是, 不可以呢!为什么呢?
分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的!那怎办?简单!就写入 /etc/rc.d/rc.local 即可!
#vim /etc/rc.d/rc.localmount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \192.168.100.254:/home/public /home/nfs/public
自动挂载Autofs的使用
在一般 NFS 文件系统的使用情况中,如果客户端要使用服务器端所提供的 NFS 文件系统时,
要嘛就是得在 /etc/rc.d/rc.local 当中设定开机时挂载,
要嘛就得要登入系统后手动利用 mount 来挂载。
此外,客户端得要预先手动的建立好挂载点目录,然后挂载上来。但是这样的使用情况恐怕有点小问题。
Autofs的设定概念
autofs 这个服务在客户端计算机上面,会持续的侦测某个指定的目录, 并预先设定当使用到该目录下的某个次目录时,将会取得来自服务器端的 NFS 文件系统资源,并进行自动挂载的动作。
示意图:
如上图所示,我们的autofs 主要配置文件为 /etc/auto.master,这个档案的内容很简单, 如上所示,我只要定义出最上层目录 (/home/nfsfile) 即可,这个目录就是 autofs 会一直持续侦测的目录啦。
至于后续的档案则是该目录底下各次目录的对应。在 /etc/auto.nfs (这个档案的档名可自定义) 里面则可以定义出每个次目录所欲挂载的远程服务器的 NFS 目录资源!
建立主配置文件/etc/auto.master,并指定侦测的特定目录
这个主要配置文件的内容很简单,只要有要被持续侦测的目录及『数据对应文件』即可。 那个数据对应文件的文件名是可以自行设定的,在这个例子当中我使用 /etc/auto.nfs 来命名。
#vim /etc/auto.master/home/nfsfile /etc/auto.nfs
Tips:上述数据中比较需要注意的是,那个 /home/nfsfile 目录不需要存在,因为 autofs 会主动的建立该目录! 如果你建立了,可能反而会出问题~因此,先确定一下没有该目录吧!
建立数据对应文件内(/etc/auto.nfs)的挂载信息与服务器对应资源
格式:
[本地端次目录] [-挂载参数] [服务器所提供的目录]选项与参数:
[本地端次目录] :指的就是在 /etc/auto.master 内指定的目录之次目录[-挂载参数] :就是前一小节提到的 rw,bg,soft 等等的参数啦!可有可无;[服务器所提供的目录] :例如 192.168.100.254:/home/public 等
# vim /etc/auto.nfs
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public
testing -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/test
temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/tmp
配置完毕,启动Autofs
# /etc/init.d/autofs stop
# /etc/init.d/autofs start