NFS服务器

简介

NFS背景介绍

  • NFS是一种古老的用于在UNIX/Linux主机之间进行文件共享的协议。它古老到你必须穿着白大褂才能接近一台计算机的年代。在那个年代,所有的联网计算机都被认为是可信的,而不像现今这样,任何人都有多种多样方法能连接到你的计算机。因此,NFS在开发的时候专注于快速及易用的文件共享,而忽视了其安全性设计

  • NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。

  • NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中看来,那个远程主机的目录就好像是自己的一个磁盘分区一样。

  • 由于NFS支持的功能比较多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口并不固定,而是随机取用一些未被使用的小于1024的端口用于传输。但如此一来就会产生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能够连接。此时就需要RPC

  • RPC(Remote Procedure Call,远程过程调用):由于服务器在启动NFS时会随机选取数个端口号,并主动向RPC注册,所以RPC知道每个NFS功能所对应的端口号,RPC将端口号通知给客户端,让客户端可以连接到正确的端口上去。RPC采用固定端口号port 111来监听客户端的需求并向客户端响应正确的端口号。

  • 注:在启动NFS之前,要先启动RPC,否则NFS会无法向RPC注册。另外,RPC若重新启动,原来注册的数据会消失不见,因此RPC重启后,它管理的所有服务都需要重新启动以重新向RPC注册。

生产应用场景

  • NFS网络文件系统很像windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的Samba服务器类似。只不过一般情况下,windows网络共享服务或Samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那可能会用到更复杂的分布式文件系统。

  • 在企业集群架构的工作场景中,NFS作为所有前端web服务的共享存储,存储的内容一般包括网站用户上传的图片、附件、头像等,注意,网站的程序代码就不要放在NFS共享里了,因为网站程序是开发运维人员统一发布,不存在发布延迟问题,直接批量发布到web节点提供访问比共享到NFS里访问效率会更高些。

  • NFS是当前互联网系统架构中常用的数据存储服务之一,中小型网站(2000万pv(页面浏览量)以下)公示应用频率居高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统

NFS工作原理

示例图

流程

  • 首先服务器端启动RPC服务,并开启111端口

  • 服务器端启动NFS服务,并向RPC注册端口信息

  • 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

  • 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。(服务器搭建成功后可以使用下列命令查看,一般都是2049)

复制代码
[root@server ~]# cat  /etc/services | grep  nfs  

NFS的使用

安装

复制代码
[root@server ~]# yum  install  nfs-utils  -y  
[root@server ~]# yum  install  rpcbind  -y   # 默认已安装

配置文件

  • 主配置文件:/etc/exports , 文件不一定存在

  • /usr/sbin/exportfs : 该文件是维护NFS共享目录资源的命令文件,可以使用命令重新共享/etc/exports的目录资源、卸载共享目录

  • 日志目录:/var/lib/nfs

  • 权限设置文件:/var/lib/nfs/etab

主配置文件分析

  • /etc/exports 文件默认为空文件,需要输入nfs共享命令

  • 格式:共享目录的路径 ==允许访问的NFS客户端==(共享权限参数)

  • 分析

    • 允许访问的NFS客户端:可以写完整的IP地址或IP网段,如:

      • 192.168.48.131/24

      • 192.168.48.131/255.255.255.0

      • 192.168.48.0/24

      • *: 允许所有主机都可以访问

    • 权限参数:必须卸载园括号中,且括号是紧挨着主机名的,全选的相关参数如下,多个参数之间使用逗号隔开:

权限参数 作用
ro 只读
rw 读写(最终还要看文件系统rwx权限)
root_squash 当NFS客户端以root账户访问时,映射为NFS服务器端的匿名账户(nobody)
no_root_squash 当NFS客户端以root账户访问时,映射为root账户(不推荐、不安全)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS 服务器的匿名账户(nobody),==推荐==
no_all_squash 客户端普通账户访问服务器的数据时,实际的信息原样显示
anonuid= anongid= 将文件的用户和工作组映射为指定UID和GID,若不指定则默认为65534(nobody)
sync 同步,同时将数据写入内存与硬盘中,保证数据不会丢失,==推荐==
async 异步,优先将数据保存到内存,然后在写入硬盘,效率高,但可能会数据丢失
  • 示例

  • /home/public *(rw,sync,all_squash) 意义:服务器共享/home/public目录中的数据,所有人都可访问,可读可写,同步传输,账户映射为

  • /home/public 192.168.48.131/24(ro,root_squash,sync) 意义:服务器共享/home/public目录中的数据,只允许192.168.48.131主机访问,方式为只读,客户端root账户映射为服务端的nobody,同步读写

  • /home/public 192.168.48.0/24(rw,all_squash,anonuid=2000,anongid=2000) 意义:服务器共享/home/public目录中的数据,允许192.168.48.0网段所有主机访问,方式为可读可写,账户映射为nobody,uid为2000,gid为2000

实验1

  • 建立NFS服务器,使的客户端顺序共享数据

  • 第一步:服务端及客户端的准备工作

复制代码
# 恢复快照
[root@server ~]# setenforce  0
​
[root@server ~]# systemctl stop  firewalld
​
[root@server ~]# yum  install  nfs-utils  -y  # 服务端及客户端都安装
  • 第二步:服务端建立共享文件目录,并设置权限
复制代码
[root@server ~]# mkdir  /nfsfile
[root@server ~]# echo  "welcome to www.openlab.com" > /nfsfile/readme
[root@server ~]# chmod  -Rf  777  /nfsfile
  • 第三步:服务端编辑配置文件
复制代码
[root@server ~]# vim  /etc/exports  # 添加以下内容
/nfsfile        192.168.48.131/24(rw,sync,all_squash)
  • 第四步:服务端先启动rpc服务,在启动nfs服务
复制代码
[root@server ~]# systemctl start  rpcbind
[root@server ~]# systemctl start  nfs-server
[root@server ~]# systemctl enable  rpcbind
[root@server ~]# systemctl enable  nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
复制代码
# 注意:若systemctl start  rpcbind后报错,显示启动失败,应先停止服务,在重启服务
[root@server ~]# systemctl stop rpcbind
[root@server ~]# systemctl start  rpcbind
  • 第五步:客户端使用本地挂载方式访问远程共享目录

    • 先查询有哪些远程共享目录可用

    复制代码
    [root@node1 ~]# showmount  -e  192.168.48.130  # 别忘了安装nfs-utils
    # -e 表示显示服务器共享信息列表
    • 新建本地挂载目录

    复制代码
    [root@node1 ~]# mkdir  /nfs1  # 新建本地挂载目录
    ​
    # 使用mount远程挂载命令挂载服务器的目录到客户端本地目录,-t nfs 表示使用的文件系统类型
    [root@node1 ~]# mount -t nfs  192.168.48.130:/nfsfile  /nfs1
    [root@node1 ~]# cd  /nfs1   # 通过本地目录访问远程共享数据
    [root@node1 nfs1]# ls
    readme
    [root@node1 nfs1]# cat  readme 
    welcome to www.openlab.com
    [root@node1 nfs1]# cd   ~
  • 第六步:客户端使用开机挂载实现永久挂载

复制代码
[root@node1 ~]# vim  /etc/fstab   # 编辑开机挂载配置文件,最后一行添加如下内容
192.168.48.130:/nfsfile /nfs1   nfs     defaults        0       0
​
[root@node1 ~]# mount  -a   # 测试
[root@node1 nfs1]# df  -h   # 查看挂载信息
文件系统                    容量  已用  可用 已用% 挂载点
devtmpfs                    4.0M     0  4.0M    0% /dev
tmpfs                       714M     0  714M    0% /dev/shm
tmpfs                       286M  4.2M  282M    2% /run
tmpfs                       4.0M     0  4.0M    0% /sys/fs/cgroup
/dev/mapper/openeuler-root   27G  1.6G   24G    7% /
tmpfs                       714M     0  714M    0% /tmp
/dev/sda1                   974M  151M  756M   17% /boot
192.168.48.130:/nfsfile      27G  1.6G   24G    7% /nfs1
​

NFS账户映射

实验2:
  • 基于上例,将/nfsfile权限修改后,查看客户端是否可以访问成功,是否可以修改数据
复制代码
# 定位服务端
[root@server ~]# cat  /etc/exports   # 确认是否为rw可读可写的权限
[root@server ~]# cd /nfsfile
[root@server nfsfile]# ll     # 查看原有权限
总用量 4
-rwxrwxrwx 1 root   root   27  6月  1 14:43 readme
-rw-r--r-- 1 nobody nobody  0  6月  1 14:56 test1.txt
[root@server nfsfile]# cd  ~   
[root@server ~]# chmod  -Rf  444  /nfsfile  # 设置新权限,没有wx
[root@server ~]# ll  -d  /nfsfile/
dr--r--r-- 2 root root 37  6月  1 14:56 /nfsfile/
[root@server ~]# ll    /nfsfile/
总用量 4
-r--r--r-- 1 root   root   27  6月  1 14:43 readme
-r--r--r-- 1 nobody nobody  0  6月  1 14:56 test1.txt
​
​
# 定位客户端
[root@node1 ~]# cd  /nfs1   
-bash: cd: /nfs1: 权限不够
​
# 显示无权限,即使服务端exports中有rw权限最后还是以文件系统权限为准
实验3
  • 客户端访问服务端,默认使用服务端的账户映射为nobody,uid与gid均为65534,其值可以修改
复制代码
# 定位服务端
[root@server ~]# chmod  -Rf  777  /nfsfile   # 先将上例的权限修改回原样
[root@server ~]# ll  -d  /nfsfile/
drwxrwxrwx 2 root root 37  6月  1 14:56 /nfsfile/
​
[root@server ~]# vim  /etc/exports   # 修改映射方式为
/nfsfile        192.168.48.131/24(rw,sync,root_squash)
​
[root@server ~]# systemctl restart  rpcbind  
[root@server ~]# systemctl restart  nfs-server
​
exporting 192.168.48.131/24:/nfsfile
​
# 定位客户端
[root@node1 ~]# cd  /nfs1
[root@node1 nfs1]# touch  test2.txt
[root@node1 nfs1]# ll
总用量 4
-rwxrwxrwx 1 root   root   27  6月  1 14:43 readme
-rwxrwxrwx 1 nobody nobody  0  6月  1 14:56 test1.txt
-rw-r--r-- 1 nobody nobody  0  6月  1 15:15 test2.txt  # root映射为nobody
[root@node1 nfs1]# su  fox
[fox@node1 nfs1]$ touch  test3.txt
[fox@node1 nfs1]$ ll
总用量 4
-rwxrwxrwx 1 root   root   27  6月  1 14:43 readme
-rwxrwxrwx 1 nobody nobody  0  6月  1 14:56 test1.txt
-rw-r--r-- 1 nobody nobody  0  6月  1 15:15 test2.txt
-rw-rw-r-- 1 fox    fox     0  6月  1 15:16 test3.txt  # fox映射为fox
[fox@node1 nfs1]$ su  root
密码: 
​
# 定位服务端
[root@server ~]# vim  /etc/exports
/nfsfile    192.168.48.131/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
​
[root@server ~]# systemctl restart  rpcbind  
[root@server ~]# systemctl restart  nfs-server
​
# 定位客户端
[root@node1 nfs1]# touch  test4.txt
[root@node1 nfs1]# ll
总用量 4
-rwxrwxrwx 1 root   root   27  6月  1 14:43 readme
-rwxrwxrwx 1 nobody nobody  0  6月  1 14:56 test1.txt
-rw-r--r-- 1 nobody nobody  0  6月  1 15:15 test2.txt
-rw-rw-r-- 1 fox    fox     0  6月  1 15:16 test3.txt
-rw-r--r-- 1   2000   2000  0  6月  1 15:19 test4.txt  # 自定义udi及gid
[root@node1 nfs1]# cd  ~

autofs自动挂载服务

产生原因

  • 在一般NFS文件系统的使用过程中,如果客户端要使用服务端所提供的文件系统,可以在 /etc/fstab中设置开机时自动挂载,也可以在登录系统后手动利用mount来挂载。

  • 由于网络的问题,NFS服务器与客户端的连接不会一直存在,当我们挂载了NFS服务器之后,任何一方脱机都可能造成另外一方等待超时,如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。

  • 为了解决这样的问题,就出现了下面的想法:

    • 当客户端在有使用NFS文件系统的需求时才让系统自动挂载。

    • 当NFS文件系统使用完毕后(autofs默认自动卸载时间为300s即5分钟),让NFS自动卸载。

  • autofs 自动挂载服务可以帮我们解决这一问题,该服务是运行在客户端的一种 Linux 系统守护进程,在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

安装

复制代码
[root@node1 ~]# yum install autofs -y   # 客户端安装

配置文件分析

  • 配置文件路径:/etc/auto.master

  • 作用:处于生产环境中的 Linux 服务器,一般会同时管理许多设备的挂载操作。如果把这些设备挂载信息都写入到 autofs 服务的主配置文件中,无疑会让主配置文件臃肿不堪,不利于服务执行效率,也不利于日后修改里面的配置内容,则需要将挂载的设备独立配置形成子文件,主配置文件只存储配置挂载设置的文件名

  • /etc/auto.master文件内容格式:挂载父目录 子配置文件

    • 挂载目录:不需要事先存在,因为autofs会主动建立该目录

    • 子配置文件:文件名可自定义

    • 例:/nfs /etc/auto.nfs

  • 子配置文件由自己创建,内容格式:

    • 本地挂载子目录 [-挂载参数] 服务器地址:目录

    • 例:testmnt 192.168.48.130:/data

    • 挂载参数:

参数 功能
fg/bg 当执行挂载时,该挂载行为会在前台(fg)还是后台(bg)执行,若在前台执行,则mount会持续尝试挂载,直到成功或time out为止;若为后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的程序运行。
soft/hard hard表示当两者之间的任何一台主机脱机,则RPC会持续地呼叫,直到对方恢复连接为止。如果是soft的话,那RPC会在time out后重复呼叫,而非持续呼叫
intr 当使用上面提到的hard方式挂载时,若加上intr这个参数,则当RPC持续呼叫时,该次的呼叫是可以被中断的
rsize/wsize 读出(rsize)与写入(wsize)的区块大小。这个设置值可以影响客户端与服务器

实验4

  • 服务器端创建共享目录,客户端实现自动挂载

  • 第一步:服务端及客户端都恢复快照,关闭安全软件,安装软件

复制代码
# 恢复快照
[root@server ~]# setenforce  0
​
[root@server ~]# systemctl stop  firewalld
​
[root@server ~]# yum  install  nfs-utils  -y  # 服务端及客户端都安装
​
[root@node1 ~]# yum install  nfs-utils autofs -y   # 客户端安装
  • 第二步:定位服务端,编辑nfs配置文件,新建共享目录,并设置权限
复制代码
[root@server ~]# mkdir  /data
[root@server ~]# vim  /etc/exports
/data    *(rw,sync,all_squash)
​
[root@server ~]# chmod  -Rf  777 /data
[root@server ~]# echo  "this is test"  >  /data/file.txt
[root@server ~]# ls  /data
file.txt
  • 第三步:定位服务端,启动服务,必须先启动rpcbind服务
复制代码
[root@server ~]# systemctl start rpcbind
[root@server ~]# systemctl start nfs-server
[root@server ~]# systemctl enable rpcbind
[root@server ~]# systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
  • 第四步:定位客户端,编辑自动挂载配置文件
复制代码
# 设计自动挂载本地目录:/nfs/testmnt
[root@node1 ~]# vim  /etc/auto.master  # 编辑自动挂载配置文件,定位第7行,输入
/nfs    /etc/auto.nfs
# /nfs为本地挂载路径的父目录,可以不用创建,autofs回自动创建,auto.nfs为自配置文件,名称自定义
​
# 查看共享信息
[root@node1 ~]# showmount  -e  192.168.48.130
Export list for 192.168.48.130:
/data *
​
# 编辑自动挂载的子配置文件
[root@node1 ~]# vim  /etc/auto.nfs  # 书写本地挂载目录的子目录及远程共享目录
testmnt   192.168.48.130:/data
  • 第五步:定位客户端,启动服务
复制代码
[root@node1 ~]# systemctl  start  autofs
[root@node1 ~]# systemctl  enable  autofs
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.
  • 第六步:定位客户端,测试
复制代码
[root@node1 ~]# df  -h   # 查看挂载信息
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.4M  378M    3% /run
/dev/mapper/rhel-root   16G  4.2G   12G   27% /
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M   92K  194M    1% /run/user/0
/dev/sr0               8.5G  8.5G     0  100% /run/media/root/RHEL-9-1-0-BaseOS-x86_64
[root@node1 ~]# cd  /nfs   # 进入本地挂载目录,会自动新建
[root@node1 nfs]# ls
[root@node1 nfs]# cd  testmnt  # 进入本地挂载目录的下级目录,会触发自动挂载
[root@node1 testmnt]# ls
file.txt
​
[root@node1 ~]# df  -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.4M  378M    3% /run
/dev/mapper/rhel-root   16G  4.2G   12G   27% /
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M   92K  194M    1% /run/user/0
/dev/sr0               8.5G  8.5G     0  100% /run/media/root/RHEL-9-1-0-BaseOS-x86_64
192.168.48.130:/data    16G  4.2G   12G   27% /nfs/testmnt

实验5

  • 本地自动挂载光盘

  • 第一步:定位服务端恢复快照,关闭安全软件,安装软件

复制代码
# 恢复快照
[root@server ~]# setenforce  0
​
[root@server ~]# systemctl stop  firewalld
​
[root@server ~]# yum install autofs -y   # 客户端安装
  • 第二步:修改autofs主配置文件
复制代码
# 设计本地自动挂载目录路径:/media/cdrom
​
# 定位第7行,输入本地挂载路径的父目录和自配置文件
[root@server ~]# vim  /etc/auto.master  
/media  /etc/iso.aa
  • 第三步:编写autofs子配置文件
复制代码
[root@server ~]# vim  /etc/iso.aa
cdrom  -fstype=iso9660,ro,nosuid,nodev  :/dev/sr0   # 冒号前有空格
​
# 注意cdrom为挂载路径/media/cdrom的子目录
# -ftype:为文件系统格式
# iso9660:为光盘设备格式
# ro:以只读模式挂载文件系统
# nodev:不解析文件系统上的块特殊设备
# nosuid:禁止suid操作和设定sgid位(SUID 是 Set User ID, SGID 是 Set Group ID的意思)
  • 第四步:启动服务
复制代码
[root@server ~]# systemctl start autofs
[root@server ~]# systemctl enable autofs
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.
  • 第五步:测试
复制代码
[root@server ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.7M  378M    3% /run
/dev/mapper/rhel-root   16G  4.2G   12G   27% /
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M  104K  194M    1% /run/user/0
/dev/sr0               8.5G  8.5G     0  100% /run/media/root/RHEL-9-1-0-BaseOS-x86_64
​
[root@server ~]# cd /media/
[root@server media]# cd cdrom    # 触发自动挂载
[root@server cdrom]# ls
AppStream  EFI   extra_files.json  images    media.repo                  RPM-GPG-KEY-redhat-release
BaseOS     EULA  GPL               isolinux  RPM-GPG-KEY-redhat-beta
[root@server cdrom]# df -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.7M  378M    3% /run
/dev/mapper/rhel-root   16G  4.2G   12G   27% /
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M  104K  194M    1% /run/user/0
/dev/sr0               8.5G  8.5G     0  100% /media/cdrom   # 已经自动挂载
相关推荐
FJW02081412 分钟前
【Linux】web服务器的部署和优化
linux·运维·服务器·rhce
Linux运维老纪19 分钟前
Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
linux·服务器·数据库·python·云计算·运维开发
平生不喜凡桃李31 分钟前
Linux 进程控制
linux·运维·服务器
鱼与宇1 小时前
Linux常用命令
linux·运维·服务器
小南家的青蛙1 小时前
lspci的资料
linux·运维·服务器
敖云岚1 小时前
【那些年踩过的坑】Docker换源加速详细教程(截至2025年4月)
运维·docker·容器
柳如烟@2 小时前
Docker安装ES :确保 Kibana 正确连接 Elasticsearch
运维·数据库·elasticsearch·docker·容器·kibana
网络工程师_ling2 小时前
【WLAN】华为无线AC双机热备负载分担—双链路热备份
运维·网络
饭来_3 小时前
配置 RDP 远程桌面协议连接ubuntu服务器桌面
linux·运维·服务器
李菠菜3 小时前
Redis主从/哨兵/集群离线部署指南
linux·运维·redis