linux NFS 配置步骤

本文详细介绍了NFS网络文件系统的原理与配置方法,包括RPC远程过程调用、NFS服务端与客户端的配置步骤、常见问题排查技巧等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什 么是 NFS(Network FileSystem)

NFS 就 是 Network FileSystem 的缩写,最早之 前是由 Sun 所发展出来的。他最大的功

能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案

( share file ) ,所以,也可以简单的把他看做是一个 file server 呢!这个 NFS Server

可以让你的 PC 来把网络远程的 NFS 主 机分享的目录,挂载到本地端的机器当中,所以,

在本地端的机器看起来,那个远程主机的目录就好象是自己的 partition 一般!

虽然 NFS 有属于自己的协议与使用的 port number , 但是在资料传送或者其它相关讯息

传递的时候, NFS 使用的则是一个称为远程过程调用( Remote Procedure Call, RPC )

协议来协助 NFS 本身的运作!

2.RPC

当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的 IP 、服务的 port

number 、 与对应到的服务之 PID 等等,都需要管理与对应!这些管 理 port 的对应与服

务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了

NFS 本 身的服务并没有提供资料传递的协议,但是 NFS 却能让我 们进行档案的分享,这

其中的原因,就是 NFS 使用到一些其它相关的传输协议!而这些传输的协议,就是使用

到这个所谓的 RPC 的功能 !这也就是说, NFS 本 身就是使用 RPC 的一个 program

是了!说的更白话一点, NFS 也可以视作是一个 RPC server 啦!同时要注意到的是,

在某些状况中,不但跑 NFS Server 需 要激活 RPC 的服务,连带的,要挂载 NFS

partition Client 机器,也需要同步激活 RPC 才行!这样 Server 端与 Client 端才

能藉由 RPC 的协议来进行 program port 的 对应喔!NFS 主要在管理分享出来的目录,

而至于资料的传递,就直接把他丢给 RPC 的协议来运作就是了!

3.NFS 激活的 RPC daemons

rpc.nfsd : 这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其

中还包含这个登入者的 ID 的判别

rpc.mountd : 这个 daemon 主要的功能,则是在管理 NFS 的档案系统!当 Client 端顺利

的通过 rpc.nfsd 而登入主机之后,在他可以使用 NFS server 提 供的档案之前,还会经

过档案使用权限 ( 就是那个 -rwxrwxrwx owner, group 那几个权限啦 ) 的认证程序!

他会去读 NFS 的设定档 /etc/exports 来比 对 Client 的权限,当通过这一关之后,

Client 就可以取得使用 NFS 档案的权限啦!( 注:这个也是我们用来管理 NFS 分享之目

录的使用权限与安全设定的地方哩)

4.NFS 需要有两个套件才行,分别是:

nfs-utils

就是提供 rpc.nfsd rpc.mountd 这两个 NFS daemons 与其它相关 documents 与说明文

件、执行档等的套件!这个就是 NFS 的主要套件

portmap

就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC server program ,而要激活任

何一个 RPC server program 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才

行,这个工作其实就是『 portmap 』这个服务所负责的!也就是说,在激活任何一个

RPC server 之前,我们都需要激活 portmap 才 行呢!那么这个 portmap 到底在干嘛呢?

就如同这个服务的名称,哈哈!就是作 port mapping 啊!举个例子来说:当 Client

端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的 port

才能够使用 RPC server 所提供的服务,因此, Client 首先就会去跟 portmap 讲『喂!

可不可以通知一下,给我个 port number ,好让我可以跟 RPC 联络吧!』这个时候

portmap 就自动的把自己管理的 port mapping 告 知 Client ,好让他可以连接上来

server 呢!所以 :『激活 NFS 之前,请先激 活 portmap !』

5.NFS server 端的设定:

a)./etc/exports

分享的目录 主机名称 1 IP1( 参数 1 ,参数 2) 主机名称 2 IP2( 参数 3 ,参数 4)

b). 参 数

rw: 可 擦写的权限

ro: 只 读的权限

no_root_squash: 登入 NFS 主机使用分享目录的使用者, 如果是 root 的话,那么对于这

个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!

root_squash: 在登入 NFS 主机使用分享之目录的使用 者如果是 root 时,那么这个使用

者的权限把被压缩成为匿名使用者,通常他的 UID GID 都会变成 nobody 那个身份;

all_squash: 不论登入 NFS 的使用者身份为何,他的 身份都会被压缩成为匿名使用者,通

常也就是 nobody 啦!

anonuid: 前面关于 *_squash 提到的匿名使 用者的 UID 设定值,通常为 nobody ,但是你

可以自行设定这个 UID 的值!当然,这个 UID 必 需要存在于你的 /etc/passwd 当中!

anongid: anonuid ,但是变成 group ID 就是了

sync: 资料同步写入到内存与硬盘当中

async: 资料会先暂存于内存当中,而非直接写入硬盘

6. 设 置的实例:

a). /tmp *(rw,no_root_squash) //* 号表示所有的 IP 都可以访问

b). /tmp *(rw)

/home/public 192.168.0.*(rw) *(ro) // 下面两行作用一样

/home/public 192.168.0.0/24(rw) *(ro)

c). /home/test 192.168.0.100(rw) // 只对某部机器设置权限

d). /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) //*.linux.org 登陆

NFS 主机,并且在/home/linux 下面 写入档案时,该档案的所有人与所有组,就会变成

/etc/passwd 里面对应的 UID 40 的那个身份的使用者了.

7. 权 限问题

假设/etc/exports 里面的内容为

#vi /etc/exports

/tmp *(rw,no_root_squash)

/home/public 192.168.0.*(rw) *(ro)

/home/test 192.168.0.100(rw)

/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)

假设我们在 192.168.0.100 这个 client 端登陆此 NFS 主机(192.168.0.2), 那么

情况一:192.168.0.100 的帐号为 test 这个身份,同时,NFS 主机上也有 test 这个帐号

a). 由 于 NFS 主机的/tmp 权限为-rwxrwxrwt , 所以我(test 192.168.0.100 )/tmp 下面具

有存取的权限,并且写入档案的所有人为 test.

b)./home/public 中,由于我有读写的权限,如果 NFS 主机在 /home/public 这个目录的

权限对于 test 开放写入的话,那么就可以读写,并且写入档案的所有人是 test 。 如果 NFS

主机的 /home/public 对于 test 这个使用者并没有开放写入 权限时,那就无法写入,虽然

/etc/exports 里面是 rw ,也不起作用.

c)./home/test 中,权限与/home/public 有相同的状态,需要 NFS 主机的/home/test

test 有开放的权限.

d)./home/linux 当中,不论是何种的 user, 身份都会被变成 UID=40 的这个帐号

情况二: 如 果我们在 192.168.0.100 的身份为 test2, 但是 NFS 主机却没有 test2 这个帐号时

a)./tmp 下还是可以写入,但是写入的档案所有人变成 nobody.

b)./home/public /home/test 里面是否可以写入,还需要看/home/public 的权限而定,

不过身份就被变成 nobody

c)/home/linux 下的身份还是变成 UID=40 的帐号.

情况三:192.168.0.100 的身份为 root

a)./tmp 里面可以写入,但是由于 no_root_squash 的参数,改变了预设的 root_squash

的设定值,所以在/tmp 写入档案的所有人为 root .

b)./home/public 底下的身份被压缩成了 nobody, 因为预设的属性都具有 root_squash ,所

以档案所有人就变成了 nobody.

c)./home/test 情况与/home/public 相同.

d)./home/linux 中,root 的身份也被压缩成 UID=40 的那个使用者了.

8. 启 动服务 portmap,nfs

#/etc/rc.d/init.d/portmap start (or:#service portmap start)

#/etc/rc.d/init.d/nfs start (or:#service nfs start)

可以到/var/log/messages 里面查看是否正确激活

9.exportfs 的用法

如果我们修改了/etc/exports 后,并不需要重启 nfs 服务,只要用 exportfs 重新扫描 一

/etc/exports , 并且重新加载即可

语法: exportfs [-aruv]

-a: 全 部挂载( 或卸载) /etc/exports 档案内的设定

-r: 重 新挂载/etc/exports 里面的设定,也同步的更新/etc/exports

/var/lib/nfs/xtab 里面的内容

-u: 卸 载某一目录

-v:export 的时候,把分享的目录显示到荧屏上.

例子

#exportfs -rv // 重新 export 一次

#exportfs -au // 全部卸载

10./var/lib/nfs/xtab 里面可以查看每个目录的分享权限( 但是我怎 么也没有找到,靠,

到了,原来要有人 mount nfs 后才 会出现内容) ,如:

/tmp node3(ro,sync,wdelay,

hide,secure,root_squash,

no_all_squash,subtree_check,

secure_locks,mapping=identity,

anonuid=-2,anongid=-2)

为什么 anonuid=-2 呢?呵呵!其实它说的是把 65536 - 2 的 值,也就是 65534 的那个

UID 啦! 对照一下 /etc/passwd ,你就会发现,哇!原来 那就是 nobody 的啦

11.showmount 命令

语法: showmount [-ae] hostname

-a: 显 示目前主机与 client 所连上来的使用目录的状态

-e: 显 示 hostname /etc/exports 里面共享的目录

12. 查 看激活的 portnumber

#netstat -utln

nfs 自 己所开启的 port ,就是那个 2049 port 啦!就是 NFS 主 要产生的 port NFS

server 在前面我们就提过了,他是 RPC server 的 一种,而 NFS 由于提供了多个

program ( 例如 rpc.mountd, rpc.rquotad, rpc.nfsd... ) ,因此就需要激活多个 port 了!

而且这些 port 是『随机产生的』,也就是那个 port number 不 会是固定的啦!每次

restart nfs 都会得到不一样的 port number 呢! 那么 Client 端怎么知道要连接上那个

port 来呼叫需要的 program 呢?呵呵! 那就是 sunrpc ( port 111 ) 那个 portmap 服务

所产生的 port number 的功用啦!Client 会 先连接到 sunrpc 那个 port 去知道应该到

那个 port 去呼叫所需要的程序!所以 , rpc.xxxx 等 之类的 daemon 自然就不需要有固

定的 port number

***********************************************

NFS 客 户端的设定

#mount -t nfs hostname(orIP):/directory /mountpoint 搞定,就这么简单

为了担心会不小心把 NFS 端挂进来的具有 SUID 权 限档案的程序执行,root 可以把 NFS

所分享的目录以较为安全的情况挂载进来,可以

#mount -t nfs -o nosuid,ro hostname:/directory /mountponit

可能出问题的地方:

1. 权 限的设定不符合

2. 忘 记了激活 portmap, 此时会报错:

mount: RPC: Port mapper failure - RPC: Unable to receive 或者

mount: RPC: Program not registered

那么,启动 portmap ,并且重新启动 nfs

#service portmap start

#service nfs restart

3. 被 防火墙搞掉

重新设置防火墙, 包括 iptables TCP_Wrappers, 因为激活了 portmap ,所以 port 111 必须

提供出去. 因 此在 iptables rules 中,要增加:

iptables -A INPUT -p TCP --dport 111 -j ACCEPT

iptables -A INPUT -p UDP --dport 111 -j ACCEPT

如果还不行,那就是 TCP_Wrappers 的问题,检查/etc/hosts.deny , 如果有一行是:

ALL: ALL: deny

那就必须在/etc/hosts.allow 中增加:

portmap: ALL: allow

如果我们的 NFS 针对内部网络开发,对于外部网络只对学术网络开发(140.0.0.0/8) ,可以:

iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

还可以使用 TCP_Wrappers ,在/etc/hosts.allow 里面规定连上 NFS 主机的主机 IP 与名

称,例如

#vi /.etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 :allow

portmap: 140.113.23.23 :allow

portmap: .sdu.edu.cn :allow

RPC Server 的相关命令

rpcinfo

#rpcinfo -p hostname(orIP)

要注意的问题:

需要注意的是,由于 NFS 使用的这个 RPC client 端连上主机时,那么你的主机想要

关机,那可就会成为『不可能的任务』!我还不知道正确的原因是什么,但是,如果你的

Server 上面还有 Client 在联机,那么你要 关机,可能得要等到数个钟头才能够正常的

关机成功!嗄!真的假的!不相信吗?不然您自个儿试试看! ^_^ !所以 ,建议您的

NFS Server 想要关机之前,能更先『关掉 portmap nfs 』这两个东西!如果无法正

确的把这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 把他关

掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!

TurboLinux8.0 for AMD64 (kernel 2.4.21-4smp),mount NFS 时候报错为:

portmap: server localhost not responding, timed out

解决办法:

mount -t nfs -o nolock node1:/public /public

即增加-o nolock 参数, 原因:

Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started

(which again requires the portmapper to be installed etc.)()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值