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

    一,简介

    NFS是Network File System的缩写,中文称为网络文件系统,由sun 公司所发展出来,主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
    NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似,只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。 

    因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的埠口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关埠口才能够联机吧!

    此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的埠口上去。 那 RPC 又是如何知道每个 NFS 的埠口呢?这是因为当服务器在启动 NFS 时会随机取用数个埠口,并主动的向 RPC 注册,因此 RPC 可以知道每个埠口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的埠口, 所以当然可以让 NFS 的启动更为轻松愉快了!

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

    当客户端有 NFS 档案存取需求时,他会如何向服务器端要求数据呢?

    1. 客户端会向服务器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
    2. 服务器端找到对应的已注册的 NFS daemon 埠口后,会回报给客户端;
    3. 客户端了解正确的埠口后,就可以直接与 NFS daemon 来联机。

    由于 NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能之 port number, PID, NFS 在服务器所监听的 IP 等等,而客户端才能够透过 RPC 的询问找到正确对应的埠口。 也就是说,NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种

    二,环境前的准备:两台服务器测试

    server IP  192.168.0.97 

    系统版本:

    [root@centos6 ~]# uname -r
    2.6.32-431.el6.x86_64

    [root@centos602 ~]# hostname
    nfs01

    client IP  192.168.0.121

    系统版本:

    [root@centos6 ~]# uname -r
    2.6.32-431.el6.x86_64

    [root@centos602 ~]# hostname
    nfs02

    三,安装nfs服务 server端

    1.查看是否安装

    [root@centos602 ~]#  rpm -qa | grep nfs

    [root@centos602 ~]#  rpm -qa | grep rpcbind

    2.安装rpcbind和nfs软件及检查

    [root@centos602 ~]# yum -y install nfs-utils rpcbind

    [root@centos602 ~]#  rpm -qa nfs-utils rpcbind
    rpcbind-0.2.0-16.el6.x86_64
    nfs-utils-1.2.3-78.el6.x86_64

    [root@centos602 ~]#  id nfsnobody
    uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

    3.启动nfs相关服务及启动rpcbinf服务并检查

    启动 

    [root@centos602 ~]# /etc/init.d/rpcbind start
    Starting rpcbind:                                          [  OK  ]

     检查 

    [root@centos602 ~]# /etc/init.d/rpcbind status
    rpcbind (pid  7674) is running...
    查看rpc端口
    [root@centos602 ~]# netstat -tnulp|grep rpc
    tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      7674/rpcbind       
    tcp        0      0 :::111                      :::*                        LISTEN      7674/rpcbind       
    udp        0      0 0.0.0.0:111                 0.0.0.0:*                               7674/rpcbind       
    udp        0      0 0.0.0.0:641                 0.0.0.0:*                               7674/rpcbind       
    udp        0      0 :::111                      :::*                                    7674/rpcbind       
    udp        0      0 :::641                      :::*                                    7674/rpcbind       
    查看端口映射情况:
    [root@centos602 ~]#  rpcinfo -p localhost
       program vers proto   port  service
        100000    4   tcp    111  portmapper
        100000    3   tcp    111  portmapper
        100000    2   tcp    111  portmapper
        100000    4   udp    111  portmapper
        100000    3   udp    111  portmapper
        100000    2   udp    111  portmapper
    注意:在未启动nfs服务时,不能看到nfs端口的映射情况
     
    启动nfs服务并进行检查
    [root@centos602 ~]# /etc/init.d/nfs start
    Starting NFS services:                                     [  OK  ]
    Starting NFS mountd:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
    Starting RPC idmapd:                                       [  OK  ]
    查看端口映射情况:

    [root@centos602 ~]#  rpcinfo -p localhost
       program vers proto   port  service
        100000    4   tcp    111  portmapper
        100000    3   tcp    111  portmapper
        100000    2   tcp    111  portmapper
        100000    4   udp    111  portmapper
        100000    3   udp    111  portmapper
        100000    2   udp    111  portmapper
        100005    1   udp  53090  mountd
        100005    1   tcp  47431  mountd
        100005    2   udp  38644  mountd
        100005    2   tcp  36040  mountd
        100005    3   udp  60435  mountd
        100005    3   tcp  54783  mountd
        100003    2   tcp   2049  nfs
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100227    2   tcp   2049  nfs_acl
        100227    3   tcp   2049  nfs_acl
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100227    2   udp   2049  nfs_acl
        100227    3   udp   2049  nfs_acl
        100021    1   udp  36742  nlockmgr
        100021    3   udp  36742  nlockmgr
        100021    4   udp  36742  nlockmgr
        100021    1   tcp  59477  nlockmgr
        100021    3   tcp  59477  nlockmgr
        100021    4   tcp  59477  nlockmgr
    添加到开机启动中并检查
    [root@centos602 ~]#  echo "/etc/init.d/rpcbind start" >>/etc/rc.local
    [root@centos602 ~]#  echo "/etc/init.d/nfs start" >>/etc/rc.local
    [root@centos602 ~]# cat /etc/rc.local
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.
    touch /var/lock/subsys/local
    /etc/init.d/rpcbind start
    /etc/init.d/nfs start
     
    四,创建共享目录测试并配置nfs服务的配置文件/etc/exports
    创建共享目录
    [root@centos602 ~]# mkdir /data
    [root@centos602 ~]# ll -d /data/
    drwxr-xr-x 2 root root 4096 Dec  8 07:09 /data/
    更改目录权限
    [root@centos602 ~]# chown -R nfsnobody.nfsnobody /data/
    [root@centos602 ~]# ll -d /data/
    drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec  8 07:09 /data/
    默认情况下该配置文件是空的:
    [root@centos602 ~]# cat /etc/exports
    [root@centos602 ~]# ll -h /etc/exports
    -rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
    编辑该配置文件:
     [root@centos602 ~]# vim /etc/exports
    /data    192.168.0.0/24(rw,sync)
    重新加载nfs服务
    [root@centos602 ~]# /etc/init.d/nfs reload
    检查有权限挂载的服务器是否能够挂载
    [root@centos602 ~]# showmount -e 192.168.0.97或者showmount   -e   locahost
    Export list for 192.168.0.97:
    /data 192.168.0.0/24
    也可以进行本机服务器测试
    [root@centos602 ~]# mount -t nfs 192.168.0.97:/data /mnt
    [root@centos602 ~]# df -h
    Filesystem          Size  Used Avail Use% Mounted on
    /dev/sda3            18G 1003M   16G   6% /
    tmpfs               491M     0  491M   0% /dev/shm
    /dev/sda1           194M   27M  158M  15% /boot
    /dev/sr0            4.2G  4.2G     0 100% /yum
    192.168.0.97:/data   18G 1003M   16G   6% /mnt
     

     NFS配置参数权限,具体如下表

    参数名称参数用途
    rw(熟记) 表示可读写权限
    sync(熟记) 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差
    async(熟记) 写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源)
    all_squash(熟记) 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用,在生产环境中配置NFS的重要技巧:1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同)
    anonuid(熟记) 参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好
    anongid(熟记) 同anonuid,区别是把uid(用户id)换成gid(组id)
    ro 表示只读权限
     
    五,nfs客户端的配置
    安装并检查
    [root@centos6 ~]# yum install nfs-utils
    [root@centos6 ~]# rpm -qa  nfs-utils
    nfs-utils-1.2.3-39.el6.x86_64
    检查能否访问服务端
    [root@centos6 mnt]# showmount -e 192.168.0.97
    Export list for 192.168.0.97:
    /data 192.168.0.0/24
    挂载nfs共享目录
    [root@centos6 ~]# mount -t nfs 192.168.0.97:/data /mnt/
    [root@centos6 ~]# df -h
    Filesystem                      Size  Used Avail Use% Mounted on
    /dev/mapper/vg_centos6-lv_root   18G  2.8G   14G  17% /
    tmpfs                           491M     0  491M   0% /dev/shm
    /dev/sda1                       485M   34M  426M   8% /boot
    /dev/sr0                        3.6G  3.6G     0 100% /yum
    192.168.0.97:/data               18G 1003M   16G   6% /mnt
    查看
    [root@centos6 ~]# mount
    /dev/mapper/vg_centos6-lv_root on / type ext4 (rw)
    proc on /proc type proc (rw)
    sysfs on /sys type sysfs (rw)
    devpts on /dev/pts type devpts (rw,gid=5,mode=620)
    tmpfs on /dev/shm type tmpfs (rw)
    /dev/sda1 on /boot type ext4 (rw)
    /dev/sr0 on /yum type iso9660 (ro)
    none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
    sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
    nfsd on /proc/fs/nfsd type nfsd (rw)
    192.168.0.97:/data on /mnt type nfs (rw,vers=4,addr=192.168.0.97,clientaddr=192.168.0.121)
  • 相关阅读:
    不懂就问」CPU 到底是怎么识别代码的?
    StackOverflow经典问题:代码中如何去掉烦人的“!=null"判空语句
    在 Excel 中使用正则表达式进行查找与替换
    从浅入深详解独立ip网站域名恶意解析的解决方案
    CentOS配置防火墙操作实例
    三步解决fiddler升级后https无法通过证书验证问题
    apache http跳转到https代码
    openssl命令行将pfx格式转.key和.crt文件,Apache适用
    宝塔面板常用命令大全!
    CentOS如何挂载硬盘
  • 原文地址:https://www.cnblogs.com/rui517hua20/p/10223212.html
Copyright © 2011-2022 走看看