搭建nfs文件共享服务器

一、什么是nfs服务器?

NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不
同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的
目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。

二、原理解读

在这里插入图片描述

  1. 首先NFS服务器端开启rpcbind;
  2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注
    册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad
    等;
  3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端
    口发出NFS文件存取功能的询问请求。
  4. NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知
    NFS客户端的RPC服务。
  5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客
    户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具
    体端口,就可以实现远程调用,即传输)。

三、搭建nfs服务器

  • 环境说明
    在这里插入图片描述

1、服务安装

服务器和客户端都关闭防火墙,装好nfs服务组件:
# 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭selinux:
setenforce 0
# 永久关闭selinux:
sed -i ‘s/=enforcring/=disabled/’ /etc/selinux/config
# 安装nfs服务组件:
yum intall nfs-utils -y

2、服务端配置

134 上编辑/etc/exports 文件,

[root@node1 nfs]# vi /etc/exports
/data/nfs 192.168.10.135(rw,sync)

# 格式:
# /data/jfedu 要共享的目录,需要存在
# 192.168.10.135 谁能挂载使用,可以是具体IP,也可以指定网段,192.168.75.0/24 24表示192.168.75.xx 网段
# (rw,sync) 挂载的一些参数,rw表示挂载为可读可写,sync表
示同步

启动rpcbind服务、nfs服务、广播export文件:

[root@node1 ~]# systemctl start rpcbind
[root@node1 ~]# systemctl start nfs
[root@node1 ~]# exportfs -r
[root@node1 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:37607           0.0.0.0:*               LISTEN      7462/rpc.statd      
tcp        0      0 0.0.0.0:44815           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      7443/rpcbind        
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      7515/rpc.mountd     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6652/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      6800/master         
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::43148                :::*                    LISTEN      -                   
tcp6       0      0 :::111                  :::*                    LISTEN      7443/rpcbind        
tcp6       0      0 :::20048                :::*                    LISTEN      7515/rpc.mountd     
tcp6       0      0 :::22                   :::*                    LISTEN      6652/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      6800/master         
tcp6       0      0 :::34235                :::*                    LISTEN      7462/rpc.statd      
tcp6       0      0 :::2049                 :::*                    LISTEN      -     

3、客户端配置

  • 用showmount搜索网络中可用的共享文件:
[root@node2 ~]# showmount -e 192.168.10.134
Export list for 192.168.10.134:
/data/nfs 192.168.10.135

说明134上的export生效了,接着创建135主机上与/data/nfs 挂载(映射)的目录,并挂载:

[root@node2 ~]# mkdir /mnt/nfs
[root@node2 ~]# mount -t nfs 192.168.10.134:/data/nfs /mnt/nfs
[root@node2 ~]# cd /mnt/nfs
[root@node2 nfs]# ll
总用量 0

当前的目录为空。

  • 推荐使用:
    mount -t nfs -o soft,timeo=1 192.168.75.130:/data/jfedu
    /mnt/nfs
    soft: 软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试
    挂载。
    timeo: 超时时间,如果不设置,一直链接,可以设置小点

4、测试

134 主机上/data/nfs 目录创建aa.txt 文件,看是否会同步到135主机的/mnt/nfs 目录:

[root@node1 ~]# cd /data/nfs
[root@node1 nfs]# ls -ltr
总用量 0
[root@node1 nfs]# touch aa.txt

135主机检查,有同步:

[root@node2 ~]# cd /mnt/nfs
[root@node2 nfs]# ll
总用量 0
[root@node2 nfs]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月  25 01:07 aa.txt

那么在135主机上创建文件,是否会同步呢?

[root@node2 nfs]# touch bb.txt
touch: 无法创建"bb.txt": 权限不够
[root@node2 nfs]# 

发现135客户端上没有权限创建文件,这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份):
134服务端修改export文件,增加权限控制:

[root@node1 nfs]# vi /etc/exports
/data/nfs 192.168.10.135(rw,sync,no_root_squash)
[root@node1 nfs]# exportfs -r

135 客户端再次测试,权限生效:

[root@node2 nfs]# touch bb.txt
[root@node2 nfs]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月  25 01:07 aa.txt
-rw-r--r-- 1 root root 0 4月  25 01:26 bb.txt
[root@node2 nfs]# 

5、export文件其他选项:

[root@localhost ~]# exportfs -v
/data/jfedu
192.168.75.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,
rw,secure,no_root_squash,no_all_squash)
其中:
rw:可读可写
ro:仅可读
sync:是指数据同步写入内存和磁盘
root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受
到限制。
no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,
很危险。
all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。
no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修
改,权限问题,但是可以强制保存。

6、其他报错处理

6.1 客户端挂载时报错bad superblock:

[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount: wrong fs type, bad option, bad superblock on
192.168.75.121:/data/jfedu,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount. helper program)
# 解决办法:
yum install nfs-utils -y

6.2 客户端挂载时报错access denied:

[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount.nfs: access denied by server while mounting
192.168.75.121:/data/jfedu
ps: 客户端IP不在/etc/exports文件中,会报此错。

6.3 卸载时报错:

umount.nfs4: /data/jfedu: device is busy
# 解决办法:
umount -l /data/jfedu 强行解除挂载
或者使用
fuser -m /data/jfedu 将会显示使用这个模块的pid
fuser -mk /data/jfedu 将会直接kill那个pid

猜你喜欢

转载自blog.csdn.net/weixin_42808782/article/details/116120258