nfs 简介

nfs特点

  • NFS(Network File System)网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源
  • 在NFS的应用中的,本地的客户端应用可以透明的读写位于远端NFS服务器上的文件,就像访问本地文件一样 nfs 适用于Linux 与 Unix之间实现文件共享,不能实现Linux与windows 间的文件共享功能 nfs 是运行在应用层的协议,期监听在2049/TCP 和 2049/UDP 套接字上 nfs服务只能基于IP进行认证,这也是它的缺点之一

使用nfs的好处

  1. 节省本地的存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用
  2. 用户不需要在网络中的每个机器上都建立有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用
  3. 一些存储设备如软驱、CDROM和Zip(一种高存储密度的磁盘驱动与磁盘)等都可以在网络上被别的机器使用,可以减少整个网络上可移动介质设备的数量

nfs的体系组成

nfs体系至少有两个主要部分

  1. 一台nfs服务器
  2. 若干台客户机
  • 客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据
  • 在NFS服务器正式启用前,需要根据实际环境和需求来配置NFS参数
nfs的应用场景
  • 不同的客户端可以在NFS上观看影视文件,节省本地空间,一台NFS服务器上可以存放所有用户的home目录,带来便利这些目录被输出到网络以便用户不管在哪台工作站上登录,总是能得到相同的home目录

  • 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下

    nfs 工作机制

  • nfs 是基于rpc来实现网络文件系统的共享的RPC

  • RPC,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议

  • RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据,在OSI网络模型中,RPC跨越了传输层和应用层

  • RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器

这里写图片描述

rpc 工作机制如上图所示,下面来描述

  • 客户端程序发起一个RPC系统调用基于TCP协议发送给另外一台主机(服务端)
  • 服务端监听在某个套接字上,当收到客户端的系统调用请求后,将收到的请求和其所传递的参数通过本地的系统调用执行一遍,并将结果返回给本地的服务进程
  • 服务端的服务进程收到返回的执行结果将其封装成响应报文,在通过rpc协议返回给客户端
  • 客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

NFS 服务器端运行着四个进程:

  • nfsd

  • mountd

  • idmapd

  • portmapper

  • idmapd 实现用户账号的集中映射,把所有的账号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问

  • mountd 用于验证客户端是否在允许访问此NFS文件系统的客户端列表中(发放一个令牌,持令牌去找nfsd),否则拒绝

  • mountd 的服务端口是随机的由rpc 服务(portmapper)提供随机端口号 nfsd
    nfs的守护进程,监听在2049/TCP和2049/UDP端口上,不负责文件的存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的rpc 请求,并将其转交给本地内核,然后存储在指定的文件系统上

  • portmapper NFS服务器的rpc 服务,其监听与111/TCP和111/UDP套接字上,用于管理远程过程调用(RPC)

nfs 的主配置文件: /etc/exports

nfs 主配置文件中的常用选项

选项作用
secure这个选项是缺省项,它使用了1024以下的TCP/IP端口实现NFS的连接,指定insecure可以禁用这个选项
rw允许NFS客户机进行读/写访问,缺省项只是读的
async此选项可以改进性能,但如果没有完全关闭NFS守护进程就重启NFS服务器,这也可能造成数据丢失
no_wdelay此选项关闭写延时,如果设置了async,那么NFS就会忽略此选项
nohide若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来,或看起来像空的一样,要禁用这种行为,需启用hide
no_subtree_check此选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查,缺省选项是启用子树检查
no_auth_nlm此选项可作为insecure_locks指定,它告诉NFS守护进程不要对加锁请求进行认证。若关心安全性问题,就要避免使用此选项,缺省选项是auth_nlm或secure_kocks
mp(mountpoint=path)通过显示的声明此选项,NFS要求挂载所导出的目录fsid=num,此选项通常在NFS故障恢复时使用

用户映射:

  • 通过NFS中的用户映射,可以将伪或实际用户和组的标识赋给一个正在对NFS卷进行操作的用户。这个NFS用户具有映射所允许的用户和组的许可权限
  • 对NFS卷使用一个通用的用户/组可以提供一定的安全性灵活性,而不会带来很多管理负荷
  • 在使用NFS挂载的文件系统上的文件时,用户的访问通常都会受到限制,这就是说用户都是以匿名用户的身份来对文件进行访问的,这些用户缺省情况下对这些文件只有读权限
  • 这种行为对于root
    用户来说尤为重要。然而,实际上的确存在这种情况:希望用户以root用户或所定义的其他用户的身份访问远程文件系统上的文件
  • NFS 允许指定访问远程文件的用户–通过用户标识号(UID)和 组标识号(GID),可以禁用正常的squash行为

用户映射的选项

选项作用
root_squash此选项不允许root用户访问挂载上来的NFS卷
no_root_squash此选项允许root用户访问挂载上来的NFS卷
all_squash此选项对于公共访问的NFS卷来说非常有用,它会限制所有的UID和GID,只使用匿名用户。缺省设置是no_all_squash
anonuid和anongid这两个选项将匿名UID和GID修改成特定用户和组账号

客户端挂载时可以使用的特殊选项

选项作用
rsize其值是从服务器读取的字节数(缓冲)默认为1024。若使用比较高的值,如8192,可以提高传输速度
wsize其值是写入到服务器的字节数(缓冲)默认为1024若使用比较高的值,如8192,可以提高传输速度
exportfs    维护exports文件导出的文件系统表的专用工具
export  -ar    重新导出所有的文件系统
export  -au    关闭导出的所有文件系统
export  -u   FS  关闭指定的导出的文件系统

NFS 的详细配置

环境介绍

服务器IP
nfs-server192.168.169.10
nfs-client192.168.169.20

服务端的配置

  • 关闭防火墙、关闭selinux,并设置开机不启动
[root@nfs-server ~]# systemctl stop firewalld
[root@nfs-server ~]# systemctl disable  firewalld
[root@nfs-server ~]# setenforce 0
[root@nfs-server ~]# sed -ri 's/(^SELINUX=).*/\1disbaled/g' /etc/selinux/config 

2.配置yum 源

[root@nfs-server yum.repos.d]#  curl -o CentOS7-Base-163.repo  http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@nfs-server yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo 
[root@nfs-server yum.repos.d]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@nfs-server yum.repos.d]# yum -y install epel-release

3.安装NFS-server

  • 安装nfs服务主程序
[root@nfs-server ~]# yum -y install nfs-utils rpcbind
  • 启动nfs-server 服务,查看rpc注册信息
[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl start nfs-server
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl enable nfs-server
[root@nfs-server ~]# rpcinfo -p localhost
   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
    100024    1   udp  53070  status
    100024    1   tcp  44752  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
......此处省略
  • 查看系统中运行的NFS相关进程
[root@nfs-server ~]# ps -aux |egrep "rpc|nfs"
rpc      17023  0.0  0.0  64956  1416 ?        Ss   18:47   0:00 /sbin/rpcbind -w
rpcuser  17048  0.0  0.0  42376  1752 ?        Ss   18:47   0:00 /usr/sbin/rpc.statd
root     17049  0.0  0.0      0     0 ?        S<   18:47   0:00 [rpciod]
root     17061  0.0  0.0  42564   944 ?        Ss   18:47   0:00 /usr/sbin/rpc.mountd
root     17062  0.0  0.0  43816   544 ?        Ss   18:47   0:00 /usr/sbin/rpc.idmapd
root     17072  0.0  0.0      0     0 ?        S<   18:47   0:00 [nfsd4_callbacks]
root     17078  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17079  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17080  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17081  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17082  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17083  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17084  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17085  0.0  0.0      0     0 ?        S    18:47   0:00 [nfsd]
root     17133  0.0  0.0 112660   968 pts/0    R+   18:52   0:00 grep -E --color=auto rpc|nfs
  • nfs 服务端配置共享目录,编辑nfs 主配置文件,共享目录/opt/chens到192.168.169.20
[root@nfs-server ~]# vim /etc/exports
/opt/chens   192.168.169.20/24(rw,async,all_squash)
  • 创建需要共享的目录chens
[root@nfs-server ~]# mkdir /opt/chens
  • 重启nfs-server服务,查看文件是否存在
[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# cat /var/lib/nfs/etab 
/opt/chens	192.168.169.20(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)
  • nfs统一给客户端为65534用户权限,查看65534属于哪个用户,修改/opt/chens目录的属主和属组为nfsnobody
[root@nfs-server ~]# grep '65534' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs-server ~]# chown -R nfsnobody.nfsnobody /opt/chens/
[root@nfs-server ~]# ls /opt/chens/ -dl
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Sep  8 19:02 /opt/chens/
  • 重启nfs-server 服务生效
[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# ss -anllt
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128              *:111                          *:*                  
LISTEN     0      128              *:20048                        *:*                  
LISTEN     0      128              *:44752                        *:*                  
LISTEN     0      128              *:22                           *:*                  
LISTEN     0      100      127.0.0.1:25                           *:*                  
LISTEN     0      64               *:33917                        *:*                  
LISTEN     0      64               *:2049                         *:*                  
LISTEN     0      128             :::111                         :::*                  
LISTEN     0      64              :::33392                       :::*                  
LISTEN     0      128             :::20048                       :::*                  
LISTEN     0      128             :::52752                       :::*                  
LISTEN     0      128             :::22                          :::*                  
LISTEN     0      100            ::1:25                          :::*                  
LISTEN     0      64              :::2049                        :::*     
客户端的配置

按照服务端前面的配置搭建yum 源、关闭防火墙、关闭selinux
此处省略步骤…

  • 安装相关的服务,仅启动rpcbind服务即可
[root@nfs-client ~]# yum -y install nfs-utils rpcbind
[root@nfs-client ~]# systemctl start  rpcbind
[root@nfs-client ~]# systemctl enable rpcbind
  • 客户端查看远程服务器提供可挂载信息
[root@nfs-client ~]# showmount -e 192.168.169.10
Export list for 192.168.169.10:
/opt/chens 192.168.169.20
  • 客户端挂载共享data
[root@nfs-client ~]# mount -t nfs 192.168.169.10:/opt/chens   /mnt
[root@nfs-client ~]# df 
Filesystem                1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root     8374272 1749196   6625076  21% /
devtmpfs                    1013260       0   1013260   0% /dev
tmpfs                       1024304       0   1024304   0% /dev/shm
tmpfs                       1024304    8760   1015544   1% /run
tmpfs                       1024304       0   1024304   0% /sys/fs/cgroup
/dev/sda1                   6281216  127440   6153776   3% /boot
tmpfs                        204864       0    204864   0% /run/user/0
192.168.169.10:/opt/chens   9422848 1811968   7610880  20% /mnt
  • 验证是否可以共享资源,在服务端共享的目录下创建目录或者文件,在客户端挂载的目录下查看是否存在

在服务端创建目录,文件

[root@nfs-server chens]# mkdir test{1..3} ; touch  chen{1..3} 
[root@nfs-server chens]# ls
chen1  chen2  chen3  test1  test2  test3

在客户端验证结果,是否存在这些目录、文件

[root@nfs-client ~]# cd /mnt/
[root@nfs-client mnt]# ls
chen1  chen2  chen3  test1  test2  test3

结果存在,nfs-server 搭建完成!

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐