从一滴水开始 的个人博客

纵有疾风起,人生不言弃

Open Source, Open Mind,
Open Sight, Open Future!
  menu
18 文章
8821 浏览
0 当前访客
ღゝ◡╹)ノ❤️

Linux通过NFS实现文件共享

在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过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通过NFS实现文件共享
作者:从一滴水开始
地址:http://lizhenhua.fun/articles/2020/10/11/1602396606689.html