RHCE的学习(7)

第五章 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 ~]# dnf install  nfs-utils  -y  
[root@server ~]# dnf  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 ~]# dnf install nfs-utils -y # 服务端及客户端都安装

  • 第二步:建议服务端先启动rpc服务,在启动nfs服务(但7版本后启动nfs服务会自动启动rpc)

  [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@server ~]# vim /etc/exports # 添加以下内容
    /pub *(rw)

    #共享的目录(文件系统) 可以连接的主机(参数ro/rw)

  • 第四步:服务端建立共享文件目录,并设置权限

    [root@server ~]# mkdir /pub
    [root@server ~]# touch /pub/{1..10}

    [root@server ~]# chmod o+w /pub

  • 第五步:客户端使用本地挂载方式访问远程共享目录

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

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

      [root@node1 ~]# mkdir  /p  # 新建本地挂载目录
    
      # 使用mount远程挂载命令挂载服务器的目录到客户端本地目录,
      #-t nfs 表示使用的文件系统类型
      [root@node1 ~]# mount -t nfs  192.168.40.131:/pub  /p
      [root@node1 ~]#ll /p   # 通过本地目录访问远程共享数据
    
      total 0
      -rw-r--r--. 1 root root 0 Oct 29 11:50 1
      -rw-r--r--. 1 root root 0 Oct 29 11:50 10
      -rw-r--r--. 1 root root 0 Oct 29 11:50 2
      -rw-r--r--. 1 root root 0 Oct 29 11:50 3
      -rw-r--r--. 1 root root 0 Oct 29 11:50 4
      -rw-r--r--. 1 root root 0 Oct 29 11:50 5
      -rw-r--r--. 1 root root 0 Oct 29 11:50 6
      -rw-r--r--. 1 root root 0 Oct 29 11:50 7
      -rw-r--r--. 1 root root 0 Oct 29 11:50 8
      -rw-r--r--. 1 root root 0 Oct 29 11:50 9
    
      [root@localhost p]# touch a
      [root@localhost p]# ll
      total 0
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 1
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 10
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 2
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 3
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 4
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 5
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 6
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 7
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 8
      -rw-r--r--. 1 root   root   0 Oct 29 11:50 9
      -rw-r--r--. 1 nobody nobody 0 Oct 29 12:17 a
    
    复制代码
  • 第六步:客户端使用开机挂载实现永久挂载

    [root@node1 ~]# vim /etc/fstab # 编辑开机挂载配置文件,最后一行添加如下内容
    192.168.40.131:/pub /p nfs defaults 0 0
    文件系统名名称 ​挂载点目录 格式化类型 默认参数 开机是否备份 开机是否检查
    光盘挂载:
    /dev/sr0 /mnt iso9660 defaults 0 0

    [root@node1 ~]# mount -a # 测试,加载所有挂载信息
    mount: /mnt: WARNING: source write-protected, mounted read-only.
    mount: (hint) your fstab has been modified, but systemd still uses
    the old version; use 'systemctl daemon-reload' to reload.
    [root@localhost ~]# systemctl daemon-reload #必须要输入
    [root@localhost ~]# 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.40.131:/pub 27G 1.6G 24G 7% /p

补充(常用):

  • exportfs 导出文件系统 -ra 读取所有配置信息
  • 一个挂载点下只能连接一个nfs系统
  • umount 挂载点目录 取消挂载
  • mount -o ro 192.168.40.131:/pub /p -0加选项 只读挂载
  • mount -o remount,rw 192.168.40.131:/pub /p 以重新挂载方式修改权限为读写

NFS账户映射

实验2:
  • 基于上例,将/pub权限修改后,查看客户端是否可以访问成功,是否可以修改数据

光在/etc/exports 上添加权限不行,还需在外面目录层级修改权限

权限考虑:

  1. 文件系统层(/etc/exports)
  2. 目录层级(chmod)
  3. 挂载时权限设定
实验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 # 已经自动挂载

相关推荐
飞行的俊哥3 分钟前
Linux 内核学习 3b - 和copilot 讨论pci设备的物理地址在内核空间和用户空间映射到虚拟地址的区别
linux·驱动开发·copilot
幽兰的天空2 小时前
介绍 HTTP 请求如何实现跨域
网络·网络协议·http
lisenustc2 小时前
HTTP post请求工具类
网络·网络协议·http
心平气和️2 小时前
HTTP 配置与应用(不同网段)
网络·网络协议·计算机网络·http
心平气和️2 小时前
HTTP 配置与应用(局域网)
网络·计算机网络·http·智能路由器
hunter2062062 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb2 小时前
web服务器 网站部署的架构
服务器·前端·架构
不会飞的小龙人2 小时前
Docker Compose创建镜像服务
linux·运维·docker·容器·镜像
不会飞的小龙人2 小时前
Docker基础安装与使用
linux·运维·docker·容器
Mbblovey3 小时前
Picsart美易照片编辑器和视频编辑器
网络·windows·软件构建·需求分析·软件需求