zoukankan      html  css  js  c++  java
  • Linux下的NFS服务

    一:概念:

    NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

    最早由sun公司开发,是类unix系统间实现磁盘共享的一种方法。

    缺点:

    1:nfs属于本地文件系统,在高并发场景和大存储量下,需要使用分布式存储mfs,  FastDFS, tfs(taobao)等。

    2:客户端的数据都是通过明文传送。客户端没有用户认证机制,安全性能一般,所以建议一般在局域网内使用。

    3:容易发生单点故障,即server服务器宕机所有的客户端都不能访问。

    使用场景:web集群中NFS服务器主要用于存储用户上传的信息,方便集群中机器获取用户数据。如图片 附件 头像 视频 音频。

     

    二:工作原理

    NFS服务依赖于RPC(Remote Procedure Call)服务。nfsd默认端口2049,实际使用过程中因为需要提供不同的服务,因此NFS启动时还会随机调用系统的空闲端口。在centos5.x中默认调用1024以下端口,centos6.x后默认调用的端口号一般较大,30000以上。因为NFS随机端口的原因所以需要RPC服务来和client端确认传输端口等。

    因为NFS服务启动时需要向RPC注册端口信息,所以RPC要在NFS服务启动之前启动。

     

    在NFS server上创建用于共享的目录/data,client用mount将/data挂载到自己本地一个目录上,挂载目录可以和/data名称不同。将挂载信息写入本机开机启动文件里 如 /etc/rc.local

    客户端无需启动NFS服务,但需要启动RPC服务。

     

    三:实现 

    主机

    角色

    ip

    cnetos6.5

    NFS server

    192.168.1.240

    centos6.5

    NFS client

    192.168.86.131 

    1:安装软件

    NFS server需要至少安装两个软件nfs-utils 和rpcbind。客户端只要安装rpcbind。

      rpm -qa nfs-utils rpcbind

    安装完nfs服务一般会自动生成配置文件exports,如果没有就自己创建一个 /etc/exports

    1

    2

    yum install -y nfs-utils  rpcbind

    cat /etc/exports

      

    创建共享目录,将文件所有者指定为nfsnobody。nfsnobody用户在安装nfs时会自动创建。

    如果不指定共享用户,则nfs系统在分配权限时会以用户uid为主,客户端如果用root账户会在服务器被自动降级至nfsnobody。

    1

    2

    mkdir  -p /data/nfs

    chown -R nfsnobody:nfsnobody /data/nfs

    2server配置文件

    格式:共享目录     指定共享对象(共享参数)

    例: /data   192.168.1.0/24(rw,sync)

    将 /data  共享给192.168.1.x ,客户端权限rw

    其中共享对象可以用通配符,比如 * 代表所有地址。

    配置参数:

    rw: 读写

    ro :只读

    sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;

    async:是大数据时使用,是先写到缓存区,必要时再写到磁盘里。

    all_squash:所有访问用户都映射为匿名用户或用户组;
    no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;

    root_squash(默认):将来访的root用户映射为匿名用户或用户组;

    no_root_squash:来访的root用户保持root帐号权限;

     

    wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;

    no_wdelay:若有写操作则立即执行,应与sync配合使用;

     

    subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;

    no_subtree_check(默认):即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

     

    配置server参数 

    1

    2

    3

    #nfs dir /data/nfs

    /data/nfs  192.168.1.0/24(rw)

    /data/nfs  192.168.86.131(rw)

    也可以写成一行

    1

    /data/nfs  192.168.1.0/24(rw)  192.168.86.131(rw,sync)

     

    启动服务:注意先启动rpcbind再启动nfs

    1

    2

    3

    4

    5

    6

    7

    8

    [root@localhost data]# service rpcbind start

    Starting rpcbind: [ OK ]

    [root@localhost data]# service nfs start

    Starting NFS services: [ OK ]

    Starting NFS quotas: [ OK ]

    Starting NFS mountd: [ OK ]

    Starting NFS daemon: [ OK ]

    Starting RPC idmapd: [ OK ]

     

    查询nfs挂载,showmount  -e  192.168.1.240 后面可以接ip来查看。

    1

    2

    3

    [root@localhost data]# showmount -e

    Export list for localhost:

    /data/nfs 192.168.1.0/24,192.168.86.131

    NFS服务开启后,查看共享目录参数

    1

    2

    3

    [root@localhost data]# cat /var/lib/nfs/etab

    /data/nfs   192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

    /data/nfs   192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

    让nfs服务开机启动

    1

    2

    3

    4

    5

    6

    7

    [root@localhost ~]# chkconfig rpcbind on

    [root@localhost ~]# chkconfig nfs on

    [root@localhost ~]# chkconfig --list rpcbind

    rpcbind 0:off   1:off   2:on    3:on    4:on    5:on    6:off

    [root@localhost ~]# chkconfig --list nfs

    nfs 0:off   1:off   2:on    3:on    4:on    5:on    6:off

     

    3:客户端配置

    安装rpcbind和nfs,启动rpcbind,nfs可以不启动。

    客户端挂载nfs共享目录

    1

    mount -t nfs 192.168.1.240:/data/nfs /nfs    #挂载nfs server的/data/nfs 到/nfs

    1

    2

    3

    4

    5

    6

    7

    8

    [root@centos68 ~]# df -h

    Filesystem            Size  Used Avail Use% Mounted on

    /dev/sda2             9.5G  2.0G  7.1G  22% /

    tmpfs                 491M     0  491M   0% /dev/shm

    /dev/sda1             190M   33M  147M  19% /boot

    /dev/sdb1             4.8G   11M  4.6G   1% /data

    192.168.1.240:/data/nfs

                          2.9G  2.7G  126M  96% /nfs  # nfs挂载信息

     

    注:一般不将nfs挂载信息写入fstab,因为nfs依赖于rpc服务,rpc服务启动晚于fstab时会出错。可以将挂载信息写入 /etc/rc.local

     

    1

    2

    3

    4

    vim  /etc/rc.local

    #mount nfs_data

    mount -t nfs 192.168.1.240:/data/www/image/  /data/www/image/

    mount -t nfs 192.168.1.240:/data/www/user/  /data/www/user/

      

     

     

    关于默认账户

    nfs客户端写数据除了nfs配置文件要有rw权限,对于目录也要有对应操作权限。

    如果/data/nfs目录没有给写入权限,即使exports里设置了rw也是没有权限写入的。客户端默认操作账户为nfsnobody。

    1

    2

    3

    4

    5

    [root@localhost ~]# cat /var/lib/nfs/etab

    /data/nfs   192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

    /data/nfs   192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)


    查看/var/lib/nfs/etab其中 anonuid=65534,anongid=65534 为默认账户uid,即nfsnobody的默认uid

    查看已挂载设备挂载参数 cat /proc/mounts 

    1

    2

    [root@localhost ~]# cat /proc/mounts |grep 192

    192.168.1.240:/data/nfs /mnt nfs4 rw,noexec,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.240,minorversion=0,local_lock=none,addr=192.168.1.240 0 0

      

    客户端挂载优化参数

    noatime       不更新文件的inode访问时间戳,文件很多时此参数可以提高效率。

    nodiratime   不更新目录的访问时间戳,同上。

    nosuid         关闭挂载目录的suid

    noexec        不允许执行二进制文件。shell脚本无法直接使用,但是用sh  xxx.sh依然可以调用。

    rsize           系统每次读取的最大字节,centos6.5默认131072,此参数过小会影响系统的I/O效率.

    wsize          系统每次写入的最大字节,同上

    defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto  nouser与async。 

    例: mount  -o  nosuid  noexec noatime   -t nfs  192.168.1.240:/data/nfs  /mnt

     

    卸载挂载点,如果提示 /mnt: device is busy ,可以用lf参数强制卸载

    umount  -lf  /mnt  

     

  • 相关阅读:
    基于RMAN从活动数据库异机克隆(rman duplicate from active DB)
    包含min函数的栈
    栈的链表实现
    HDU 2196 树形DP Computer
    linux之access函数解析
    [置顶] sqlplus 使用笔记
    仿新浪微博登陆邮箱提示效果!
    找出数组中出现奇数次的元素<异或的应用>
    SOA体系结构基础培训教程-规范标准篇
    一个寻找.jar 和.zip文件中class文件的工具
  • 原文地址:https://www.cnblogs.com/yangjiquan/p/11368325.html
Copyright © 2011-2022 走看看