0%

基于CentOS安装NFS

官方文档

服务端安装nfs-utils

1
2
$ yum -y install nfs-utils
#安装 nfs-utils 时,会自动安装依赖 rpcbind 和 mount 相关包。

  • vim /evtc/exports
1
2
3
4
directory machine(option)
#directory:共享的目录。
#machine:可以访问目录的客户端地址。支持 DNS 和 IP,使用 IP 地址更可靠一些。
#option:选项。

option 选项包含如下:

ro:目录为只读共享,这是默认值。
rw:目录为读写共享。
secure:在小于 1024 的端口上发起请求,这是默认值。应使用 insecure 来关闭它。
insecure:在大于 1024 的端口上发起请求。
async:此选项允许 NFS 服务器违反 NFS 协议,并在数据没有完全写入之前回复请求,即异步请求。可以提高性能,但是在 NFS 服务重启时会导致数据丢失或损坏。
sync:与 async 相反,当数据完全写入之后才回复请求,即同步请求。在1.0.0之后的所有版本中,这是默认值。
no_wdelay:允许提交多个写入请求。如果还设置了 async,则此选项无效。
nohide:共享 NFS 目录的子目录。可以使用 hide 禁用此选项。
crossmnt:与 nohide 类似。
no_subtree_check:如果配置了共享子目录,则不检查父目录的权限。如果还设置了 no_root_squash,则此选项没必要;因为 root 具有所有权限。
subtree_check:与 no_subtree_check 相反,强制检查父目录的权限。如果还设置了 no_root_squash,则此选项无效;因为 root 具有所有权限。
root_squash:将请求从 uid/gid 0 映射到 anonymous uid/gid。
all_squash:将所有 uid/gid 都映射到 anonymous uid/gid。
anonuid and anongid:显式设置 anonymous uid/gid。
no_root_squash:默认情况下,客户端用户 root 发出的任何文件请求都被视为服务端 nobody 用户发出的请求。即请求映射到的 UID 取决于服务端的 nobody 用户的 UID,而不取决于客户端。如果选择 no_root_squash,则客户端 root 具有服务端 root 对系统文件的访问级别。这可能会带来严重的安全隐患。

示例

1
/opt/app/nfs   *(rw,insecure,async,all_squash,no_root_squash)

启动 NFS

注意一: NFS 依赖于端口映射器(portmapper)守护程序,一般的 Linux 系统都会默认启动它。可以使用 rpcinfo 查看:

1
2
3
4
5
6
7
8
$ rpcinfo -p
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

注意二: 需要确保先启动 rpcbind 服务,再启动 nfs,不然使用 showmount 时会报错 “clnt_create: RPC: Program not registered”,不过一般启动 nfs 时会自动先启动 rpcbind。

NFS 服务包含五个守护程序:(包含在 nfs-utils 软件包中)

rpc.nfsd:完成大部分工作。

rpc.lockd 和 rpc.statd:处理文件锁定。从 2.2.18 开始,nfsd 会根据需要调用 lockd。

rpc.mountd:它处理初始安装请求。

rpc.rquotad:处理导出的卷上的用户文件配额。

附加: 重新加载配置文件 /etc/exports 可以使用 exportfs -ra 命令,或者使用 kill -HUP

查看共享信息

  • 如果showmount报如下错误,则依次停止服务 rpcbind、nfs。最后再重启rpcbind和nfs,一定要按顺序启动和停止
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ showmount -e 127.0.0.1
clnt_create: RPC: Program not registered

$ service rpcbind stop
Redirecting to /bin/systemctl stop rpcbind.service
Warning: Stopping rpcbind.service, but it can still be activated by:
rpcbind.socket

$ service nfs stop
Redirecting to /bin/systemctl stop nfs.service

$ service rpcbind start
Redirecting to /bin/systemctl start rpcbind.service

$ service nfs start
Redirecting to /bin/systemctl start nfs.service

$ showmount -e 127.0.0.1
Export list for 127.0.0.1:
/opt/app/nfs 0.0.0.0/24

附加: showmount命令的用法

-e:显示NFS服务器的共享列表

-a:显示本机挂载的文件资源的情况NFS资源的情况

-v:显示版本号

客户端挂载使用

yum 安装 nfs-utils

1
$ yum -y install nfs-utils

查看共享信息

1
2
3
$ showmount -e 192.168.10.148
Export list for 192.168.10.148:
/opt/app/nfs 0.0.0.0/24

挂载目录

  • 将服务器端目录挂在到本地
1
2
$ mount -t nfs 192.168.10.148:/opt/app/nfs /opt/app/nfs
mount.nfs: access denied by server while mounting 172.20.197.142:/opt/app/nfs
  • 使用mount指令挂载是临时的,服务器重启后就会失效。如果想要挂载永久生效,则可以选择修改问题/etc/fstab

使用 mount 选项来控制 NFS 客户端处理当服务端崩溃或网络中断时的反应:

soft:如果文件请求失败,则 NFS 客户端将向请求端报告错误。不建议使用此设置。
hard:当服务器崩溃时,访问 NFS 挂载的文件系统上的文件的程序将挂起。同时指定 intr,可以中断或终止该进程;当 NFS
服务器重新启动时,程序将从原来的位置不受干扰地继续运行。建议在所有 NFS 挂载的文件系统上使用 hard,intr。

示例:

1
2
3
4
vim /etc/fstab
...
192.168.10.148:/data /mnt nfs rw,hard,intr 0 0
...

修改共享目录的权限

  • 一般情况下,nfs客户端会存在无法在共享目录touch文件的权限。此时可以通过检查NFS服务端的共享目录,看属主和组是否为nfsnobody。如果不是,更改之
1
chown -R nfsnobody.nfsnobody /opt/app/nfs/

测试

  • 在nfs服务端的共享目录下创建文件,在客户端mount的目录下查看文件是否存在
  • 在nfs客户端mount的共享目录下,创建或修改文件。是否修改成功。在服务端的共享目录下查看修改结果
-------- 本文结束 感谢阅读 --------