• 【Linux集群教程】05 集群存储 - NFS


    4 文件存储之 NFS

    4.1 NFS 简介

    4.1.1 NFS 发展史

    NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中 的计算机之间通过 TCP/IP 网络共享资源。在 NFS 的应用中,本地 NFS 的客户端应用可以透明地读写 位于远端 NFS 服务器上的文件,就像访问本地文件一样。其实大部分的网络文件共享都是基于TCP/IP(更加的安全)的,极有少部分并不是TCP/IP的,例如:TFTP(走的是UDP协议)等。

    NFS 最早是由 Sun 公司发展出来的,后被逐渐完整以及整合至 Linux 内核。

    4.1.2 NFS 功能

    它就是是可以透过网络,让不同的主机、不同的操作系统可以共享存储

    4.1.3 NFS 原理

    NFS 在文件传送或信息传送过程中依赖于 RPC 协议。远程过程调用 (Remote Procedure Call) 是能使 客户端执行其他系统中程序的一种机制,所以只要用到 NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT 。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责数据信息的传输,NFS 本身只是文件数据的控制和配置。

    img

    4.1.4 NFS 优点

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

    4.1.5 NFS 特点

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

    4.2 NFS 安装构建及配置

    4.2.1 安装软件包介绍

    • nfs-utils:这个是 NFS 服务主程序(包含 rpc.nfsd、rpc.mountd、daemons)
    • rpcbind:这个是 CentOS6.X 的 RPC 主程序(CentOS5.X 的为 portmap),是Linux(CentOS / RHEL)内核本身自带的功能。

    实验环境:两台服务器

    10.10.10.11

    10.10.10.12

    4.2.2 配置文件 /etc/exports 书写规则

    /etc/exports 文件的配置格式为:

    • NFS共享目录 NFS客户端地址1(参数 1,参数 2,参数 3…) 客户端地址 2(参数 1,参数 2,参数 3…)

    • NFS共享目录 NFS客户端地址 (参数 1,参数 2,参数 3…)

      • NFS 共享目录: 共享目录是指 NFS 服务器共享给客户机使用的目录
      • NFS 客户端: 客户端是指网络中可以访问这个 NFS 共享目录的计算机
      • NFS 客户端常用的指定方式:
        • 指定 ip 地址的主机:192.168.0.200
        • 指定子网中的所有主机:192.168.88.0
        • 指定域名的主机:www.baidu.com
        • 指定域中的所有主机:*.baidu.com
        • 所有主机:*

    在 NFS 配置文件中是按行匹配的,一行就是一个完整的共享,另一行就是另外一个共享,以此类推。

    相关的NFS命令

    #显示NFS服务器加载的信息
    showmount [选项] [参数]
    showmount -e ip 	#-e:显示NFS服务器上所有的共享目录
    showmount -d ip 	#-d:仅显示已被NFS客户端加载的目录
    
    #查看挂载
    mount -t nfs ip:/file /file1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.2.3 共享权限解释

    /etc/exports 配置文件参数解释

    rw:read-write,可读可写,注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限 ;

    ro:read-only,只读;

    • 相互冲突的参数不能都使用。

    sync:文件同时写入硬盘和内存,更加的安全,使用的速度会较慢;

    async:文件暂存于内存,而不是直接写入内存;

    no_root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说, 也拥有 root 权限。显然开启这项是不安全的;

    root_squash:NFS 客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥 有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份 ;

    all_squash:不论 NFS 客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;

    anonuid:匿名用户的 UID 值,通常是 nobody 或 nfsnobody,可以在此处自行设定;

    anongid:匿名用户的 GID 值;

    哪怕有一点的安全性提升,都需要管理员进行操作提升系统的安全性。

    4.2.4 NFS Server 配置(10.10.10.11)

    $ yum -y install rpcbind nfs-utils 
    #服务器端安装 rpcbind 和 NFS-utils 软件包 
    $ mkdir /nfs1 /nfs2  
    #共享点
    $ chown -R nobody:nobody /nfs1 /nfs2 
    #给匿名用户权限
    $ ls -ld /nfs1 /nfs2
    drwxr-xr-x 2 nobody nobody 6 Sep  5 11:02 /nfs1
    drwxr-xr-x 2 nobody nobody 6 Sep  5 11:02 /nfs2
    
    $ vim /etc/exports 
    #修改配置文件
    #共享目录的绝对路径 NFS客户端地址(共享权限参数,...,...)
    /nfs1 10.10.10.12(rw,async,no_root_squash)
    /nfs2 10.10.10.0/24(ro,async,no_root_squash)
    
    #CentOS7
    $ systemctl restart nfs && systemctl restart rpcbind
    $ systemctl restart nfs
    #CentOS6
    #$ service nfs restart && service rpcbind restart
    #$ service nfs restart 
    #需要在重启下nfs
    
    #格式: showmount -e 
    #查看挂载情况 
    $ showmount -e 10.10.10.11
    Export list for 10.10.10.11:
    /nfs2 10.10.10.0/24
    /nfs1 10.10.10.12
    
    #拷贝测试文件
    $ cp -a /etc/fstab /nfs1/
    $ cp -a /var/log/messages /nfs2/
    
    $ /etc/init.d/rpcbind status 
    # 查看 rpcbind 当前状态 
    LANG=en # 查看当前语言 
    
    $ rpcinfo -p localhost | grep nfs
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100227    3   tcp   2049  nfs_acl
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100227    3   udp   2049  nfs_acl
    
    $ lsof –i :111
    COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rpcbind 714  rpc    6u  IPv4  18451      0t0  UDP *:sunrpc
    rpcbind 714  rpc    8u  IPv4  18455      0t0  TCP *:sunrpc (LISTEN)
    rpcbind 714  rpc    9u  IPv6  18456      0t0  UDP *:sunrpc
    rpcbind 714  rpc   11u  IPv6  18458      0t0  TCP *:sunrpc (LISTEN)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    4.2.5 NFS Client 配置(10.10.10.12)

    #查看NFS上所有的共享目录
    $ showmount -e 10.10.10.11
    Export list for 10.10.10.11:
    /nfs2 10.10.10.0/24
    /nfs1 10.10.10.12
    
    $ mkdir -pv /nfs1 /nfs2 
    #创建挂载点
    $ chown -R nobody:nobody /nfs1 /nfs2 
    #给匿名用户权限
    
    #格式:mount -t nfs ip:/file /file1 
    #在客户端进行 NFS 的挂载操作
    $ mount -t nfs 10.10.10.11:/nfs1/ /nfs1/
    #把nfs服务器的/nfs1挂载到客户端的/nfs1
    $ mount -t nfs 10.10.10.11:/nfs2/ /nfs2/
    #这两个目录都是同步的,查看文件是否同步
    $ ls -l /nfs1 /nfs2
    /nfs1:
    total 4
    -rw-r--r-- 1 root root 583 Sep  5 11:11 fstab
    
    /nfs2:
    total 824
    -rw------- 1 root root 841478 Sep  5 11:06 messages
    #查看挂载点
    $ mount | grep nfs
    10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
    10.10.10.11:/nfs2 on /nfs2 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
    #10.10.10.12 /nfs1 可读可写测试
    $ cat /nfs1/fstab		#可读该文件
    $ echo "Hello NFS FileSystem" > /nfs1/test.txt
    $ cat /nfs1/test.txt
    Hello NFS FileSystem
    
    #10.10.10.12 /nfs2 只读测试
    $ cat /nfs2/messages #可读该文件
    $ echo "Hello NFS FileSystem" > /nfs2/test.txt
    -bash: /nfs2/test.txt: Read-only file system #只读目录
    
    #卸载客户端的挂载目录
    $ umount 挂载点
    #停止服务器端的共享
    $ exportfs -au
    
    #自动挂载:
    $ vim /etc/fstab
    #格式:服务器ip地址:/服务器共享目录  /本地挂载目录 nfs defaults 0 0 
    10.10.10.11:/nfs1 /nfs1 nfs defaults 0 0 
    
    $ mount -a
    #重启机器后会自动进行挂载操作
    $ reboot 
    ...
    $ mount | grep nfs
    10.10.10.11:/nfs1 on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.12,local_lock=none,addr=10.10.10.11)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    4.2.6 NFS 相关命令介绍

    4.2.6.1 exportfs 命令

    管理NFS共享文件系统列表

    补充说明

    exportfs 命令用来管理当前NFS共享的文件系统列表。

    参数:

    -a 打开或取消所有目录共享。
    -o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
    -i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
    -r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。 
    它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
    
    -u 取消一个或多个目录的共享。
    -f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
    -v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    4.2.6.2 showmount 命令

    显示NFS服务器加载的信息

    补充说明

    showmount命令 查询“mountd”守护进程,以显示NFS服务器加载的信息。

    语法

    showmount(选项)(参数)

    选项

    -d:仅显示已被NFS客户端加载的目录; 
    -e:显示NFS服务器上所有的共享目录。 
    
    • 1
    • 2

    参数

    NFS服务器:指定NFS服务器的ip地址或者主机名。

  • 相关阅读:
    GJB 5000B简介
    FreeRTOS任务运行时间统计
    学习MySQL 临时表
    全网独家首发!一份破解大厂面试官千层套路的Spring源码笔记
    React学习--- 组件
    04-递归练习题
    【多线程】Timer任务定时器实现与盲等原子性问题的解决
    【LeetCode】332. 重新安排行程
    题目0130-IPv4地址转换成整数
    NX/UG二次开发—Parasolid—PK_BODY_pick_topols
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/126882182