zoukankan      html  css  js  c++  java
  • CentOS7.5搭建NFS(Network File System)

    NFS(Network File System)即网络文件系统,是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案。可以将远程Linux系统上的文件共享资源挂载到本地主机(Linux客户端)的目录上,从而使得本地主机(Linux客户端)基于TCP/IP协议,像使用本地主机上的资源那样读写远程Linux系统上的共享文件。

    一、安装和配置NFS

    yum install nfs-utils rpcbind

    第1步:为了检验NFS服务配置的效果,需要使用两台Linux主机(一台充当NFS服务器,一台充当NFS客户端),下表是它们所使用的操作系统以及IP地址。

    两台Linux主机所使用的操作系统以及IP地址

    主机名称 操作系统 IP地址
    NFS服务端 CentOS7.5 192.168.5.136
    NFS客户端 CentOS7.5 192.168.5.65

    第2步:在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。

    mkdir /nfsfile

    chmod -Rf 777 /nfsfile

    echo "Welcome to NFS" > /nfsfile/readme

    第3步:NFS服务程序的配置文件为/etc/exports,设定哪些客户端可以访问哪些NFS共享文件系统,默认情况下里面没有任何内容,该文件的书写原则如下。

    (1)空白行将被忽略;

    (2)以#符号开头的内容为注释;

    (3)配置文件中可以通过符号转义换行;

    (4)每个共享的文件系统需要独立一行条目;

    (5)客户端主机列表需要使用空格隔开;

    (6)配置文件中支持通配符。

    一条完整的共享条目语法结构如下,定义要共享的目录与相应的权限,其中,客户端主机可以是一个网段、单台主机或主机名。

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

    也可以为多个客户主机设置不同的访问选项,语法结构如下:

    共享目录的路径 允许访问的NFS客户端1(共享权限参数) 允许访问的NFS客户端2(共享权限参数)...

    例如,如果想要把/nfsfile目录共享给192.168.5.0/24网段内的所有主机,让这些主机都拥有读写权限,在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失,以及把来访客户端root管理员映射为本地的匿名用户等,则可以按照下面命令中的格式,将下表中的参数写到NFS服务程序的配置文件中。

    用于配置NFS服务程序配置文件的参数
    参数 作用
    ro 只读
    rw 读写
    wdelay 延迟写操作
    root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
    no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
    all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
    sync 同时将数据写入到内存与硬盘中,保证不丢失数据
    async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

    以上参数中,ro与rw比较容易理解,用来定义客户端访问共享时可以获得的权限是只读访问还是可读写访问。计算机对数据进行修改时会先将修改的内容写入快速的内存,随后才会慢慢写入慢速的硬盘设备中,async选项允许NFS服务器在没有完全把数据写入硬盘前就返回成功消息给客户端,而此时数据实际还存放在内存中,但客户端则显示数据已经写入成功。注意,该选项仅影响操作消息的返回时间,并不决定如何进行写操作,sync选项将确保在数据真正写入存储设备后才会返回成功信息。wdelay为延迟写入选项。也就是说,它决定了先将数据写入内存,再写入硬盘,然后将多个写入请求合并后写入硬盘,这样可以减少对硬盘I/O的次数,从而优化性能,该选项可以优化NFS性能,但有可能导致非正常关闭NFS时数据丢失情况的发生。与此相反的选项是no_wdelay,但该选项与async选项一起使用时将不会生效,因为async是基于wdelay实现对客户端的一种响应功能。默认情况下,NFS会自动屏蔽root用户的权限,root_squash 使得客户端使用root账号访问NFS时,服务器系统默认会自动将root映射为服务器本地的匿名账号,通过anonuid可以指定匿名账号ID,默认anonuid为65534,也就是nfsnobody账号,使用no_root_squash可以防止这种映射而保留root权限,all_squash选项则可以屏蔽所有的账户权限,将所有的用户对NFS的访问自动映射为服务器本地的匿名账户。默认情况下,普通账号的权限是保留的,也就是没有进行squash操作。

    下面进行/etc/exports配置文件的设置:

    vim /etc/exports

    # 需要注意,NFS客户端地址与权限之间没有空格

    /nfsfile 192.168.5.0/24(rw,sync,root_squash)

    注意:最简单的NFS配置可以仅给定一个共享目录的路径与一个允许访问的NFS客户端主机,而不指定选项,因为没有选项时,NFS将使用默认设置,而默认属性为ro、sync、wdelay、root_squash。

    第4步:启动和启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind服务程序,并将这两个服务一并加入开机启动项中。

    systemctl restart rpcbind

    systemctl enable rpcbind

    systemctl start nfs-server

    systemctl enable nfs-server

    NFS默认使用TCP与UDP的2049端口,rpcbind使用TCP与UDP的111端口。

    这里顺便再记录下NFS的工作原理(参考自:https://www.cnblogs.com/JohnABC/p/5868674.html

    NFS并不是单独存在的,它和另外2个模块共同存在,试想两台网络当中的主机如何进行通讯,当然只有通过ip+port来发送数据。

    包括NFS在内,这三个模块(nfs的三个模块的作用?)分别是NFS,RPC,PORTMAP。NFS只负责将数据通过以文件系统的方式共享出去,并进行登录管理和权限管理,并不负责数据的传输,而数据的传输则有RPC(Remote Procedure Call,远程过程调用)来完成。试想远程客户端在进行链接的时候需要知道哪个端口可用,以便将可用的端口用于NFS数据传输(NFS的数据传输方式有端口来完成),而负责维护可用端口与远程主机的映射关系则是有PORTMAP的完成的。

    NFS的两个子模块,登录管理和权限管理分别是由rpc.nfsd和rpc.mountd这两个子模块来完成的。在nfs的启动代码当中可以看到这两个程序的存在。

    不难想出,NFS的工作流程是,远程客户端进行nfs请求,RPC获得请求,通知PORTMAP来获取端口号,然后PORTMAP将可用的端口号传给NFS、RPC,然后NFS模块再进行权限检验,如果有足够的权限,RPC就通过PORTMAP给出的端口进行数据传输,并通过该端口到达客户端。

    nfs的几个模块大致是这样协调的,具体的权限管理,模块配置则可以通过具体的配置文件来完成。

    二、客户端访问NFS共享

    NFS客户端的配置步骤也十分简单。先使用showmount命令(以及必要的参数,见下表)查询NFS服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。

      showmount命令中可用的参数以及作用
    参数 作用
    -e 显示NFS服务器的共享列表
    -a 显示本机挂载的文件资源的情况NFS资源的情况
    -v 显示版本号

    客户端安装nfs-utils后,才能使用showmount命令:

    yum install nfs-utils

    showmount -e 192.168.5.136

    然后在NFS客户端创建一个挂载目录。使用mount命令并结合-t参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。

    挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了

    cat /nfsfile/readme

    如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中: 

    vim /etc/fstab

    如下图所示:

    卸载挂载目录命令:

    umount /nfsfile/

    三、AutoFs自动挂载服务(可参考其他博客:https://blog.51cto.com/andyxu/2171468

    无论是Samba服务还是NFS服务,都要把挂载信息写入到/etc/fstab中,这样远程共享资源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。

    autofs自动挂载服务可以解决这一问题。与mount命令不同,autofs服务程序是一种Linux系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。换句话说,我们将挂载信息填入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

    安装autofs服务:

    yum install autofs

    处于生产环境中的Linux服务器,一般会同时管理许多设备的挂载操作。如果把这些设备挂载信息都写入到autofs服务的主配置文件中,无疑会让主配置文件臃肿不堪,不利于服务执行效率,也不利于日后修改里面的配置内容,因此在autofs服务程序的主配置文件中需要按照“挂载目录 子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如,要将NFS服务器共享文件挂载到客户端 /nfsfile/demo 目录中,那么挂载目录写成 /nfsfile 即可。对应的子配置文件则是对这个挂载目录内的挂载设备信息作进一步的说明。子配置文件需要用户自行定义,文件名字没有严格要求,但后缀建议以.misc结束。具体的配置参数如下图第7行所示。

    vim /etc/auto.master

    保存退出!

    新建文件:vim /var/nfs_auto.misc

    写入以下内容:

    demo 192.168.5.136:/nfsfile

    格式为:客户端本地子目录   [-挂载参数]    NFS服务器共享目录

    挂载参数可不写

    # 重启autofs服务

    systemctl restart autofs

    systemctl enable autofs

    # 验证是否可自动挂载

    可以看到成功了!

     

    本文参考自:《Linux就该这么学》  刘遄  著 

  • 相关阅读:
    caffe常用层: batchNorm层和scale层
    简述configure、pkg-config、pkg_config_path三者的关系
    python删除list中元素的三种方法
    Leetcode 872. Leaf-Similar Trees
    Leetcode 508. Most Frequent Subtree Sum
    Leetcode 572. Subtree of Another Tree
    Leetcode 894. All Possible Full Binary Trees
    Leetcode 814. Binary Tree Pruning
    Leetcode 557. Reverse Words in a String III
    python 多维list声明时的小问题
  • 原文地址:https://www.cnblogs.com/opsprobe/p/11783684.html
Copyright © 2011-2022 走看看