欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

NFS

程序员文章站 2022-04-24 16:05:14
NFS介绍 NFS RPC NFS 优势 NFS服务介绍 NFS配置 NFS的软件包nfs utils以及相关文件 配置防火墙 NFS配置文件 NFS配置示例 启动NFS 客户端NFS挂载 自动挂载 直接匹配 实现NFS服务 实现NFS伪根 NFS相关SELinux 设置 NFS工具 ......

NFS介绍

NFS

    Network File System 网络文件系统,基于内核的文件系统。
    Sun 公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,主要是基于RPC (RemoteProcedure Call Protocol 远程过程调用)实现。
    NFS服务启动时至少需要两个daemons,一个管理客户端是否能够登入的问题,一个管理客户端能够取得的权限。

RPC

    采用C/S 模式。
    RPC通过函数调用一部分功能由本地程序完成,另一部分功能由远程主机上的函数完成,两者共同完成资源的分享。
    客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
    在服务器端,进程保持睡眠状态直到调用信息到达为止,当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
    RPC最主要的功能就是在指定每个NFS功能所对应的端口号,并且将端口反馈给客户端,让客户端可以连结到正确的端口上去。
    当服务器在启动NFS时会随机取用数个端口,并主动的向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC又是固定使用端口111来监听客户端的需求并向客户端反馈对应的端口,因此NFS的启动必须在PRC相关服务之后,否则NFS的启动是会报错的。

NFS 优势

    节省本地存储空间,将常用的数据如:home 目录,存放在一台NFS 服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用

NFS服务介绍

    软件包:nfs-utils
    相关软件包:rpcbind (必须),tcp_wrappers
    Kernel支持:nfs.ko
    端口:2049(nfsd),其它端口由portmap(111)分配
    配置文件:/etc/exports,/etc/exports.d/*.exports
    日志:/var/lib/nfs/
    CentOS7 不支持同一目录同时用nfs 和samba 共享,因为使用锁机制不同
    CentOS6 开始portmap 进程由rpcbind 代替
    NFS 服务主要进程:
        rpc.nfsd    最主要的NFS 进程,管理客户端是否可登录
        rpc.mountd      挂载和卸载NFS 文件系统,包括权限管理
        rpc.lockd   非必要,管理文件锁,避免同时写出错
        rpc.statd   非必要,检查文件一致性,可修复文件
    要在客户端向NFS服务器端的文件系统写入操作是,需要具有:
        NFS服务器有开放可写入(w)的权限(与/etc/exports设置有关)
        实际的文件权限具有可写入(w)的权限

NFS配置

NFS的软件包nfs-utils以及相关文件

    rpm -ql nfs-utils(centos7)
        /etc/exports.d
        /etc/gssproxy/24-nfs-server.conf
        /etc/modprobe.d/lockd.conf
        /etc/nfs.conf
        /etc/nfsmount.conf
        /etc/request-key.d/id_resolver.conf
        /etc/sysconfig/nfs
        /sbin/mount.nfs
        /sbin/mount.nfs4
        /sbin/osd_login
        /sbin/rpc.statd
        /sbin/umount.nfs
        /sbin/umount.nfs4
        /usr/sbin/blkmapd
        /usr/sbin/exportfs
        /usr/sbin/mountstats
        /usr/sbin/nfsdcltrack
        /usr/sbin/nfsidmap
        /usr/sbin/nfsiostat
        /usr/sbin/nfsstat
        /usr/sbin/rpc.gssd
        /usr/sbin/rpc.idmapd
        /usr/sbin/rpc.mountd
        /usr/sbin/rpc.nfsd
        /usr/sbin/rpcdebug
        /usr/sbin/showmount
        /usr/sbin/sm-notify
        /usr/sbin/start-statd
        /usr/share/doc/nfs-utils-1.3.0/
        /var/lib/nfs
        /var/lib/nfs/etab
        /var/lib/nfs/rmtab
        /var/lib/nfs/rpc_pipefs
        /var/lib/nfs/statd
        /var/lib/nfs/statd/sm
        /var/lib/nfs/statd/sm.bak
        /var/lib/nfs/state
        /var/lib/nfs/v4recovery
        /var/lib/nfs/xtab
    rpm -ql nfs-utils(centos6)
        /etc/nfsmount.conf
        /etc/rc.d/init.d/nfs
        /etc/rc.d/init.d/nfslock
        /etc/rc.d/init.d/rpcgssd
        /etc/rc.d/init.d/rpcidmapd
        /etc/rc.d/init.d/rpcsvcgssd
        /etc/request-key.d/id_resolver.conf
        /etc/sysconfig/nfs
        /sbin/mount.nfs
        /sbin/mount.nfs4
        /sbin/nfs_cache_getent
        /sbin/rpc.statd
        /sbin/umount.nfs
        /sbin/umount.nfs4
        /usr/sbin/exportfs
        /usr/sbin/mountstats
        /usr/sbin/nfsidmap
        /usr/sbin/nfsiostat
        /usr/sbin/nfsstat
        /usr/sbin/rpc.gssd
        /usr/sbin/rpc.idmapd
        /usr/sbin/rpc.mountd
        /usr/sbin/rpc.nfsd
        /usr/sbin/rpc.svcgssd
        /usr/sbin/rpcdebug
        /usr/sbin/showmount
        /usr/sbin/sm-notify
        /usr/sbin/start-statd
        /var/lib/nfs
        /var/lib/nfs/etab
        /var/lib/nfs/rmtab
        /var/lib/nfs/rpc_pipefs
        /var/lib/nfs/statd
        /var/lib/nfs/statd/sm
        /var/lib/nfs/statd/sm.bak
        /var/lib/nfs/state
        /var/lib/nfs/v4recovery
        /var/lib/nfs/xtab
    端口:
        2049(nfsd),其它端口由portmap(111)分配
    配置文件:
        /etc/exports
        /etc/exports.d/*.exports
    日志:
        /var/lib/nfs/

配置防火墙

    配置防火墙,开放NFS 服务
    配置NFS 使用固定端口
        vim /etc/sysconfig/nfs
            RQUOTAD_PORT=875
            LOCKD_TCPPORT=32803
            LOCKD_UDPPORT=32769
            MOUNTD_PORT=892
            STATD_PORT=662
            STATD_OUTGOING_PORT=2020
        防火墙除开放上述端口,还需开放TCP 和UDP 的111 和2049共4个端口 

NFS配置文件

    /etc/exports导出的文件系统的格式:
        /dir  主机1(opt1,opt2)  主机2(opt1,opt2)...
    以#开头的为注释
    主机格式:
        单个主机:
            ipv4 ,ipv6 ,FQDN,
        IP networks:
            两种掩码格式均支持
            172.18.0.0/255.255.0.0
            172.18.0.0/16
        wildcards :
            主机名通配,例如*.magedu.com ,IP 不可以
        netgroups :
            NIS 域的主机组,@group_name
        anonymous :
            表示使用*通配所有客户端
    每个条目指定目录导出到的哪些主机,及相关的权限和选项
        默认选项:(ro,sync,root_squash,no_all_squash)
        ro,rw   只读和读写
        async   异步,数据变化后不立即写磁盘,性能高
        sync (1.0.0 后为默认)   同步,数据在请求时立即写入共享
        no_all_squash  (默认) 保留共享文件的UID 和GID
        all_squash      所有远程用户( 包括root) 都变成nfsnobody
        root_squash  (默认)   远程root 映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
        no_root_squash      远程root 映射成root 用户
        anonuid 和anongid    指明匿名用户映射为特定用户UID 和组GID ,而非nfsnobody, 可配合all_squash

NFS配置示例

    在/etc/exports 文件中定义导出目录
        /myshare server.example.com
        /myshare *.example.com
        /myshare server?.example.com
        /myshare server[0-20].example.com
        /myshare 172.25.11.10
        /myshare 172.25.0.0/16
        /myshare 2000:472:18:b51:c32:a21
        /myshare 2000:472:18:b51::/64
        /myshare *.example.com 172.25.0.0/16
        /myshare desktop.example.com(ro)
        /myshare desktop.example.com(ro) server[0-20].example.com(rw)
        /myshare diskless.example.com(rw,no_root_squash)

启动NFS

    NFS服务依赖于RPC,所以要先启动RPC服务,然后再启动NFS服务
        service rpcbind start
        service nfs start

客户端NFS挂载

    基于安全考虑,建议使用nosuid,nodev,noexec 挂载选项
    NFS 相关的挂载选项:
        fg (默认) 前台挂载,bg 后台挂载
        hard (默认)   持续请求,soft  非持续请求
        intr  和hard 配合  请求可中断
        rsize 和wsize    一次读和写数据最大字节数,rsize=32768
        _netdev     无网络不挂载
        示例:
            mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
    开机挂载:/etc/fstab
        172.16.0.1:/public /mnt/nfs nfs defaults 0 0

自动挂载

    可使用autofs 按需要挂载NFS共享,在空闲时自动卸载
    由autofs 包提供
    系统管理器指定由/etc/auto.master 自动挂载器守护进程控制的挂载点
    自动挂载监视器访问这些目录并按要求挂载文件系统
    文件系统在失活的指定间隔5 分钟后会自动卸载
    为所有导出到网络中的NFS配启用特殊匹配 -host 至 "browse"
    参看帮助:man 5 autofs
    支持含通配符的目录名
        * server:/export/&

直接匹配

    直接匹配包括绝对路径名称
    不会影响本地目录结构
    示例:
        /etc/auto.master:
            /-              /etc/auto.direct
        /etc/auto.direct:
            /foo            server1:/export/foo
            /user/local/    server1:/usr/local

实现NFS服务

    systemctl start nfs-server
    systemctl enable nfs-server
    mkdir /nfsshare
    chown nfsnobody /nfsshare
    vi /etc/exports
        /nfsshare desktop-ip(rw)
    exporfs –r
    mkdir /mnt/nfsshare
    mount server-ip:/nfsshare /mnt/nfsshare(临时)
    vim /etc/fstab
        nfsserver:/nfsshare /mnt/nfsshare nfs defaults 0 0
    mount -a

实现NFS伪根

    配置NFS 服务器
        vi /etc/fstab
            /data/read /exports/read none bind 0 0
            /data2/write /exports/write none bind 0 0
        vi /etc/exports
            /exports *(fsid=o,rw,crossmnt)
            /exports/read 192.168.0.0/24(ro)
            /exports/write 192.168.0.0/24(rw)
    配置NFS 客户端
        mount nfsserver:/ /mnt/nfs
        vi /etc/fstab
            nfsserver:/ /mnt/ nfs4 ro 0 0

NFS相关SELinux 设置

    CentOS7 默认SELinux  的布尔值
        nfs_export_all_ro 和 nfs_export_all_rw 都启用。这允许NFS 服务可以读写任意文件,基于安全考虑可关闭.
    对于只读的NFS 目录SELinux 安全上下文件应设为
        public_content_t 或 nfs_t .
    对于读写的NFS 目录SELinux 安全上下文件应设为
        public_content_rw_t 或 nfs_t context ,并且布尔值nfsd_anon_write Boolean  必须启用,以允许写操作.
    帮助参考nfsd_selinux(8)(selinux-policy-devel包)nfs(5), mount(8), mount.nfs(8), exportfs(8), exports(5), nfsd_selinux(8)

NFS工具

    rpcinfo
        rpcinfo — report RPC information
        rpcinfo makes an RPC call to an RPC server and reports what it finds.
            rpcinfo [-m | -s] [host]
            rpcinfo -p [host]
            rpcinfo -T netid host prognum [versnum]
            rpcinfo -l host prognum versnum
            rpcinfo [-n portnum] -u | -t host prognum [versnum]
            rpcinfo -a serv_address -T netid prognum [version]
            rpcinfo -b prognum versnum
            rpcinfo -d [-T netid] prognum versnum
        例子:
             rpcinfo -p hostname
             rpcinfo –s hostname  查看RPC注册程序
    exportfs
        exportfs - maintain table of exported NFS file systems
        exportfs [-aruv] [host:/path
            –v      查看本机所有NFS 共享
            –r      重读配置文件,并共享目录
            –a      输出本机所有共享
            –au     停止本机所有共享
    showmount
        showmount - show mount information for an NFS server
        showmount [options] [host]
            -a or --all     在主机中列出客户端主机名或IP地址和已装载目录:dir格式
            -d or --directories     仅列出某些客户端安装的目录
            -e or --exports     显示NFS服务的导出文件
            --no-headers    禁止输出中的描述性标题
            例子
                showmount -e hostname
     
    mount,mount.nfs  挂载工具
        NFSv4 支持通过挂载NFS 服务器的共享“根”,从而浏览NFS 服务器上的共享目录列表
        mount nfsserver:/ /mnt/nfs