Linux 通过 NFS 实现文件共享

本贴最后更新于 1502 天前,其中的信息可能已经东海扬尘

在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过 NFS,实现服务器之间共享某一块磁盘,通过网络传输将分散的文件集中存储在一块指定的共享磁盘,实现基本的文件共享。实现这种方案,分服务端和客户端,将服务端的磁盘 mount 到客户端指定目录下,在客户端操作就像操作本地磁盘一样,nfs 基本的安装如下:

模拟环境:

服务端/客户端 服务器 IP
服务端 192.168.3.10
客户端 192.168.3.9

环境要求:

  • 需要安装 nfsrpcbind

1. 服务端安装 NFS

1.1 检查 nfsrpcbind 是否安装

$ rpm -qa |grep nfs
$ rpm -qa |grep rpcbind

image.png

1.2 创建一个共享目录,并配置共享信息

# 创建共享目录,这里假设共享目录为/data01/nfs
$ mkdir -p /data01/nfs
# 配置共享信息  
#在/etc/exports添加以下内容
$ echo '/data01/nfs 192.168.3.9(rw,no_root_squash,no_all_squash,sync)' > /etc/exports

权限说明:
		ro                      只读访问 
        rw                      读写访问 
        sync                    所有数据在请求时写入共享 
        async                   NFS在写入数据前可以相应请求 
        secure                  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,适合公用目录。 
        no_all_squash           保留共享文件的UID和GID(默认) 
        root_squash             root用户的所有请求映射成如anonymous用户一样的权限(默认) 
        no_root_squas           root用户具有根目录的完全管理访问权限 
        anonuid=xxx             指定NFS服务器/etc/passwd文件中匿名用户的UID 
        anongid=xxx             指定NFS服务器/etc/passwd文件中匿名用户的GID

1.3 启动 nfsrpcbind

$ systemctl enable rpcbind
$ systemctl start rpcbind
$ systemctl enable nfs
$ systemctl start nfs

1.4 查看是否共享成功

$ showmount -e localhost

2. 客户端安装并挂载

2.1 检查 nfsrpcbind 是否安装

$ rpm -qa |grep nfs
$ rpm -qa |grep rpcbind

2.2 启动 nfsrpcbind

$ systemctl enable rpcbind
$ systemctl start rpcbind
$ systemctl enable nfs
$ systemctl start nfs

2.3 创建挂载目录

$ mkdir -p /data01/share

2.4 检测远程共享服务器是否共享成功

$ showmount -e 192.168.3.11

2.5 挂载

# mount -t nfs -o nolock 服务端IP:共享目录绝对路径 本地挂载目录
$  mount -t nfs -o nolock 192.168.3.11:/data01/nfs /data01/share

2.6 查看挂载结果

$ df -Th

image.png

如果显示了远程磁盘的挂载信息,则挂载成功

2.7 测试

  • 在/data01/share 下新增一个文件,并写入相关内容,然后到服务器端查看
    image.png

image.png

2.8 卸载

卸载直接在客户端服务器上执行如下操作即可:umount 192.168.3.11:/data01/nfs

2.9 防火墙规则设置

可以通过 rpcinfo -p 查看具体用到的端口。
image.png

NFS 启动时会随机启动多个端口并向 RPC 注册,为了设置安全组以及 iptables 规则,需要设置 NFS 固定端口。
NFS 服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad 这 5 个服务,其中 nfs、portmapper 的端口是固定的,另外三个服务的端口是随机分配的,所以需要给 mountd,nlockmgr,rquotad 设置固定的端口。

  • 其中,给 mountd、rquotad 设置端口的方式很简单,在 /etc/sysconfig/nfs 中添加一下设置即可:

    RQUOTAD_PORT=30001
    LOCKD_TCPPORT=30002
    LOCKD_UDPPORT=30002
    MOUNTD_PORT=30003
    STATD_PORT=30004
    

    添加完后重启 rpc、nfs 的配置与服务

    $ systemctl restart rpcbind
    $ systemctl restart nfs
    
  • 还需在 /etc/modprobe.d/lockd.conf 中添加以下设置:

    options lockd nlm_tcpport=30002
    options lockd nlm_udpport=30002
    

    添加完后重新加载 NFS 配置和服务

    $ systemctl restart nfs-config
    $ systemctl restart nfs-idmap
    $ systemctl restart nfs-lock
    $ systemctl restart nfs-server
    
  • 修改完后查看端口
    image.png

端口 proto 作用
111 tcp portmapper 进程使用,负责分配 rpc server 的端口,并在 client 端请求时,负责响应目的 rpc server 端口返回给 client 端。
111 udp
30002 udp NFS lock manager 进程使用,它允许 NFS 客户端在服务器上对文件加锁。
30002 tcp
2049 tcp nfs 的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户。
2049 udp
30003 udp 是 nfs 服务的认证服务的守护进程,client 在收到返回的真正端口时,就会去连接 mountd,认证取得令牌。
30004 tcp
30004 udp rpc.statd 进程,这个进程实现了网络状态监控(NSM)RPC 协议,通知 NFS 客户端什么时候一个 NFS 服务器非正常重启动。
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    943 引用 • 943 回帖
1 操作
ymxfl 在 2020-10-11 14:21:01 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...