NFS学习笔记01

NFS网络文件共享服务

NFS介绍

  • NFS是Network File System的缩写,中文意思是网络文件系统.主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录.NFS客户端(一般为应用服务器,如Web)可以通过挂载(mount)方式将NFS服务器端共享的数据目录挂载到NFS本地客户端(就是某一个挂载点下).从本地客户端来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录

NFS应用场景

  • 在企业架构中,NFS网络文件系统一般用来存储共享视频、图片、附件、头像等静态资源文件,通常网站用户上传的文件都会放到NFS共享文件中.前端所有到的节点访问这些静态资源时都会读取NFS存储上的资源
  • 没有NFS共享存储访问
image.png
  • NFS共享存储访问
image.png

NFS系统原理

image.png
  • NFS服务器端设置好一个共享目录/video后,其他的有NFS服务器端的客户端可以将这个共享目录/video,挂载到客户端本地某个挂载点,挂载点就是一个目录,这个挂载点目录可以自己随意指定,上图中的两个NFS客户端挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同
  • NFS在传输数据时使用的端口会随机选择.是通过RPC(Remote Procedure Call,远程过程调用)协议/服务来实现

RPC

  • NFS支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口作为传输
  • 因为端口不确定,会造成NFS客户端与服务端的通信障碍,这时就需要RPC服务的帮助.NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口,达到数据传输、交互数据的目的.RPC服务类似于NFS服务器端和客户端之间的一个中介
image.png
  • 当NFS服务器端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能,然后RPC服务使用固定的111端口来监听客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端
  • 在启动NFS Server之前,首先要启动RPC服务,否则NFS Server就无法向RPC服务注册.另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册.要特别注意,修改NFS配置文件后是不需要重启NFS,直接在命令行执行systemctl reload nfs即可使修改的/etc/exports生效

NFS工作原理

image.png
image.png
  • 当程序通过NFS客户端向NFS服务端存取文件时,流程是
    1. 用户访问网站程序,由程序在NFS客户端上发出存取NFS文件请求,这是NFS客户端的RPC服务(rpcband)就会通过网络向NFS服务器端的RPC服务的111端口发出NFS文件存取功能的询问请求
    2. NFS服务器RPC服务找到对应已注册的NFS端口后,通知NFS客户端RPC服务
    3. NFS客户端获取到正确的端口,与NFS daemon联机存取数据
    4. NFS客户端将数据存取成功后返回给前端访问程序,告知给用户存取结果
  • 因为NFS的各项功能都需要向RPC服务注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口.也就是说,NFS需要有RPC服务的协助才能成功对外提供服务.NFS服务必须在RPC服务启动之后启动

NFS服务端部署

服务器系统 服务器角色 内外网IP
CentOS 7.6 x86_64 NFS服务器端(NFS01) eth0:10.0.0.31 eth1:172.16.1.31
CentOS 7.6 x86_64 NFS客户端1(Web01) eth0:10.0.0.7 eth1:172.16.1.7
CentOS 7.6 x86_64 NFS客户端2(BACKUP) eth0:10.0.0.41 eth1:172.16.1.41

NFS服务器端安装

  • NFS软件列表
    • nfs-utils:NFS服务的主程序,包括rpc.nfsd、rpc.mountd
    • rpcbind:RPC主程序,NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的映射,由rpcbind服务来完成
  • 安装软件包
    • yum install nfs-utils rpcbind -y
  • 启动NFS相关服务

    1. 启动rpcbind服务
    yum install nfs-utils rpcbind -y
    
    # rpc被systemd接管了
    netstat -tunlp |grep -E 'rpc|111'
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
    
    # 查看NFS服务向ROC服务注册的端口信息
    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
    
    1. 启动NFS服务
    systemctl start nfs
    systemctl enable nfs
    
    # 查看NFS服务向ROC服务注册的端口信息
    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
        100024    1   udp  17969  status
        100024    1   tcp  52251  status
        100005    1   udp  20048  mountd
        100005    1   tcp  20048  mountd
        100005    2   udp  20048  mountd
        100005    2   tcp  20048  mountd
        100005    3   udp  20048  mountd
        100005    3   tcp  20048  mountd
        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
        100021    1   udp  43699  nlockmgr
        100021    3   udp  43699  nlockmgr
        100021    4   udp  43699  nlockmgr
        100021    1   tcp  14415  nlockmgr
        100021    3   tcp  14415  nlockmgr
        100021    4   tcp  14415  nlockmgr
    
  • NFS进程说明
ps -ef|grep -E 'rpc|nfs'
rpc        7924      1  0 20:38 ?        00:00:00 /sbin/rpcbind -w
rpcuser    7959      1  0 20:42 ?        00:00:00 /usr/sbin/rpc.statd
root       7960      2  0 20:42 ?        00:00:00 [rpciod]
root       7968      1  0 20:42 ?        00:00:00 /usr/sbin/rpc.idmapd
root       8012      1  0 20:42 ?        00:00:00 /usr/sbin/rpc.mountd
root       8017      2  0 20:42 ?        00:00:00 [nfsd4_callbacks]
root       8023      2  0 20:42 ?        00:00:00 [nfsd]
root       8024      2  0 20:42 ?        00:00:00 [nfsd]
root       8025      2  0 20:42 ?        00:00:00 [nfsd]
root       8026      2  0 20:42 ?        00:00:00 [nfsd]
root       8027      2  0 20:42 ?        00:00:00 [nfsd]
root       8028      2  0 20:42 ?        00:00:00 [nfsd]
root       8029      2  0 20:42 ?        00:00:00 [nfsd]
root       8030      2  0 20:42 ?        00:00:00 [nfsd]
  • NFS服务的主要任务是共享数据,而数据的共享离不开权限.所以NFS服务器启动时最少需要两个不同的进程,一个是管理NFS客户端是否能够登陆的rpc.nfsd主进程,另一个管理NFS客户端是否能够取得对应权限的rpc.mountd进程.如果还要管理磁盘,则NFS还需要加载rpc.rquotad进程
服务或进程名 用途说明
nfsd(rpc.nfsd) rpc.nfsd的主要功能是管理NFS客户端是否能够登录NFS服务器端主机,其中还包含登录者的ID判别
mountd(rpc.mountd) rpc.mountd的主要功能是管理NFS文件系统.当NFS客户端顺利通过rpc.nfsd登录NFS服务器端主机时,在使用NFS服务器提供数据之前,它会去读NFS的配置文件/etc/exports来比对NFS客户端的权限,通过这一关后,还会经过NFS服务器端本地文件系统使用权限(u,g,o)的认证程序.如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限./etc/exports文件是用来管理NFS共享目录的使用权限与安全设置的依据,强调的是,NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关
rpc.lockd(非必要) 可用来锁定文件,用于多客户端同时写入
rpc.statd(非必要) 检查文件的一致性,与rpc.lockd有关.监听来自其它主机重启的通知,并且管理本地系统重启时的主机列表
rpc.idmapd 名称映射后台进程

配置NFS服务器端

  • NFS服务的默认配置文件路径为/etc/exports

配置文件格式

NFS共享目录    NFS客户端地址(参数1,参数2)
NFS共享目录    NFS客户端地址1(参数1,参数2)  NFS客户端地址2(参数1,参数2)
# sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)
  • 参数含义
    • NFS共享目录:为NFS服务端要共享的实际目录,要用绝对路径,注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnonody)读写
    • NFS客户端地址:为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段,还可以使用"*"来匹配所有客户端服务器,这里的客户端一般来说是前端的业务服务器,如Web服务
    • 权限参数集:对授权的NFS客户端的访问权限设置
客户端地址 具体地址 说明
授权单一客户端访问NFS 172.16.1.7 生产环境使用不多
授权整个网段访问NFS 172.16.1.0/24 最常见的配置.配置简单、维护方便
授权整个网段访问NFS 172.16.1.* 指点网段的其他写法(不推荐)
授权某个域名客户端访问NFS nfs.test.com 生产环境一般不用
授权整个域名客户端访问NFS *.test.com 生产环境一般不用

配置实例

常用格式说明 要共享的目录 客户端IP地址或IP端(参数1,参数2)
配置例一 /data 172.16.1.0/24(rw,sync),允许客户端读写,并且数据同步到服务器端的磁盘 /data172.16.1.0/24(rw,sync) 10.0.0.0/24(ro) 允许同时存在不同的授权
配置例二 /data 172.16.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000),允许客户端读写,并且数据同步到服务器端的磁盘,并且制定客户端的用户UID和GID
配置例三 /home/test 172.16.1.0/24(ro),只读共享
  • /data为要共享的NFS服务器端目录,注意要使用绝对路径
  • 172.16.1.0/24表示运行NFS客户端访问共享目录的网段范围
  • (rw,sync):rw表示读写,sync表示数据同步写入到NFS服务器端的硬盘
  • 可以使用通配符'*'替换iP地址

NFS配置文件权限参数

参数名称 参数用途
rw Read-write,表示可读写权限
ro Read-only,表示只读权限
sync 请求或写入数据时,数据同步写入到NFS Server的硬盘才返回.优点:数据安全不丢失;缺点:性能比不启用该参数时要差
async 写入数据时会写到内存缓冲区,直到硬盘有空档才会再写入磁盘,提示写入效率.风险:服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决方法:服务器主板电池或加UPS不间断电源)
no_root_squash 访问NFS Server共享目录的用户如果是root的话,他对该共享目录具有root权限.避免使用
root_squash 访问NFS Server共享目录的用户时root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份
all_squash 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份
anonuid 参数以anon开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnody的UID值,也可以自行设置,但UID必须存在于/etc/passwd中.在多NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数就可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,一般默认即可*
anongid 同anonuid,区别就是把UID换成GID
  • man exports查看更多参数
  • NFS权限设置参数流程
image.png

NFS实践

  • 共享/data目录给172.16.10/24整个网段,可读写

  • 在NFS Server端执行的操作

    1. 创建共享目录并授权
    mkdir -p /data
    touch /data/1.txt
    chown -R nfsnobody.nfsnobody /data
    
    1. 创建NFS服务配置文件,并在本地查看挂载信息
    vim /etc/exports
    /data 172.16.1.0/24(rw,sync)  # 写入此条内容
    
    # 平滑加载,使修改的配置内容生效
    systemctl reload nfs  
    
    # 查看挂载情况
    showmount -e localhost
    # 输出结果
    Export list for localhost:
    /data 172.16.1.0/24
    
    # 查看NFS Server配置文件参数(包括默认加载的参数)
    cat /var/lib/nfs/etab 
    # 输出结果
    /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
    
    1. 把本地服务器端作为客户端进行挂载测试
    mount -t nfs 172.16.1.31:/data /mnt
    
    ls /mnt
    # 输出结果
    1.txt
    
    df -h|tail -1
    # 输出结果
    172.16.1.31:/data  196G  1.9G  195G    1% /mnt
    
  • 在NFS Client端执行的操作

    1. 安装nfs-utils,rpcbind软件包
    yum install nfs-utils rpcbind -y
    
    1. 启动RPC服务(注意,因为是客户端,所以无须启动NFS服务)
    systemctl enable rpcbind
    systemctl start rpcbind
    
    1. 挂载NFS共享目录/data
    # 挂载前先检查需要挂载的权限信息,是否能够挂载
    showmount -e 172.16.1.31
    # 查看结果
    Export list for 172.16.1.31:
    /data 172.16.1.0/24
    
    mount -t nfs 172.16.1.31:/data /mnt
    ls /mnt
    # 查看结果
    1.txt
    
    # 客户端挂载的mnt目录属主和属组权限和共享目录相同
    ll /mnt -d
    drwxr-xr-x. 2 nfsnobody nfsnobody 32 4月  12 22:24 /mnt
    ll /mnt  
    总用量 8
    -rw-r--r--. 1 nfsnobody nfsnobody 4 4月  12 22:00 1.txt
    
    ll -d /data/
    drwxr-xr-x. 2 nfsnobody nfsnobody 32 4月  12 22:24 /data/
    ll  /data/
    总用量 8
    -rw-r--r--. 1 nfsnobody nfsnobody 4 4月  12 22:00 1.txt
    
    1. 从客户端web01测试读写NFS服务器数据
    touch 2.txt
    echo 222 > 2.txt
    
    # 切换到nfs服务器端进行查看
    ls /data/
    # 输出结果
    1.txt  2.txt
    
    cat /data/2.txt 
    # 输出结果
    222
    

NFS梳理

  • 当多个NFS客户端访问服务器端读写文件时,需要以下几个权限

    • NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限
    • NFS服务器实际要共享的NFS目录权限具有写入的权限,即服务器端本地目录的安全权限
    • 每台机器都对应存在和NFS默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)
  • NFS服务文件或命令的说明

NFS常用路径 说明
/etc/exports NF服务主配置文件,配置NFS具体共享服务的依据,默认为空,以行为单位
/usr/sbin/exportfs NFS服务的管理命令.可以加载NFS配置生效,好可以直接配置NFS共享目录,即无需配置/etc/exports实现共享.exportfs不但可以加载配置生效,也可以通过命令直接共享目录.越过/etc/exports,但是重启失效
/usr/bin/showmount 用来在客户端查看NFS配置及挂载结果的命令
/var/lib/nfs/etab NFS配置文件完整参数文件(有很多没有配置但是默认就有的NFS参数)
/proc/mounts 本地客户端挂载参数和状态信息的文件
/var/lib/nfs/rmtab 客户端访问服务器exports的信息列表(CentOS7取消此功能)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343