linux下的nfs概述与实验(openEuler22.03)

什么是NFS

NFS(Network File System,网络文件系统)是一种允许网络上的计算机之间共享文件系统的协议。通过NFS,用户和程序可以像访问本地存储一样访问远程服务器上的文件。NFS广泛应用于各种场景,例如在不同的服务器之间共享配置文件、共享数据存储等。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;
NFS一般用来存储共享视频,图片等静态数据。


NFS工作原理

在这里插入图片描述

(1) 首先服务器端启动RPC服务,并开启111端口
(2) 服务器端启动NFS服务,并向RPC注册端口信息
(3) 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
(4) 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
(5) 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

NFS 服务的实现依赖于 RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。

在CentOS 6 以后,已经将RPC从原本的postmapper更名为rpcbind

RPC与NFS通讯原理:

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,使客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
注意:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行systemctl reload nfs或exportfs –rv即可使修改的/etc/exports生效


NFS常用文件

配置文件/指令说明
/etc/exportsNFS的主要配置文件,用于手动配置NFS分享目录。
/usr/sbin/exportfs用于维护NFS共享资源的指令,可以重新分享/etc/exports变更的目录资源,卸载或重新分享NFS Server分享的目录。
/var/lib/nfs/*tabNFS服务器登录文件目录,其中etab记录了NFS所分享出来的目录的完整权限设定值,xtab记录了曾经链接到此NFS服务器的相关客户端数据。
/usr/sbin/showmount客户端查询服务器分享资源的指令,可以用来查看NFS分享出来的目录资源。

/etc/exports文件

/etc/exports 文件是NFS服务器的核心配置文件,它用于定义哪些目录将被导出(即共享)以及导出的目录可以被哪些客户端访问,以及访问权限和选项。每一行都代表一个共享配置。
使用/etc/exports 文件,其实就是在systemctl启动nfs时,调用了exportsfs这个文件。

/etc/exports格式

假设我们有一个共享目录 /data,我们可以为不同的客户端设置不同的访问权限:

/shared 192.168.1.101(rw) 192.168.1.102(ro)
# shared 是本地要共享的目录。
# 192.168.1.101 和 192.168.1.102 是允许访问此共享目录的客户端IP地址。(也可以是网段、域名)
# rw 表示读写权限,ro 表示只读权限。

/var/lib/nfs/etab文件

实际上/etx/exports文件的选项特别多,但是我们最少仅需写共享目录 IP/网段(ro/rw)即可工作,这是因为,nfs有一个默认配置文件。
对于在/etc/exports中的共享目录权限设置,会自动映射到/var/lib/nfs/etab中,并补全默认配置。

假设对所有网段均可以访问/data目录

cat /etc/exports
/data *(rw)
cat /var/lib/nfs/etab
/data   *(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)

NFS常用选项

在上一部分,我们可以看到nfs的选项实际特别多,那么常用的选项及其解释如下:

rw:允许客户端读写访问共享目录。
ro:客户端只能读取共享目录。
sync:同步写操作,数据会在写入请求完成后立即写入到磁盘。
async:异步写操作,数据可能会被缓存在内存中,提高性能但可能在系统崩溃时导致数据丢失。
no_subtree_check:禁用子目录检查,可以提高性能。
subtree_check:启用子目录检查,确保NFS服务器只允许访问被导出的目录,而不是其子目录。
no_root_squash:保留根用户权限,客户端上的root用户在服务器上依然是root用户。
root_squash:将客户端上的root用户映射为匿名用户,默认选项,提高安全性。
all_squash:将所有客户端用户都映射为匿名用户。
anonuid 和 anongid:指定匿名用户的UID和GID。

NFS配置方式

部署:nfs-utils,rpcbind
准备环境:目录,权限
配置服务:/etc/exports
启动服务:rpc,nfs
服务端本地测试

1. 安装NFS和RPC

#检查是否安装
rpm -qa | grep nfs*
rpm -qa | grep rpc*

#安装
yum install -y nfs-utils rpcbind

2. 启动rpcbind和nfs

systemctl enable rpcbind --now
rpcinfo -p #查看rpc注册信息
   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  45864  status
    100024    1   tcp  40741  status

systemctl enable nfs --now
rpcinfo -p  #开启nfs后可以查看到新的信息
   program vers proto   port  service
...
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100021    1   udp  42221  nlockmgr
    100021    3   udp  42221  nlockmgr
    100021    4   udp  42221  nlockmgr
    100021    1   tcp  46639  nlockmgr
...

3. 准备目录

mkdir -p /data
chown -R nobody.nobody /data
# nfs默认的用户是id为65534的用户
# 在centos7中这个用户叫做nfsnobody,在8版本之后,nfsnobody和nobody用户合并了

4. 配置/etc/exports并重启服务

#配置/etc/exports
echo "/data *(rw)" >> /etc/exports
cat /etc/exports
/data *(rw)
cat /var/lib/nfs/etab
/data   *(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)

#重启服务
#reload-已连接nfs服务的用户端不会断开连接
#restart-已连接nfs服务的用户会被强制断开连接
systemctl reload nfs

5. 连接测试

服务端自我测试

mount -t nfs  10.0.0.124::/data/   /mnt/

#查看挂载情况
df -h /mnt
Filesystem        Size  Used Avail Use% Mounted on
10.0.0.124:/data   40G  3.8G   37G  10% /mnt

#查看nfs挂载情况
showmount -e
Export list for ecm:
/data *

showmount命令的用法;

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

客户端测试

#想使用nfs服务的客户端,同样需要安装nfs-utils
yum install -y nfs-utils
#不需要启动nfs服务

#挂载方式如上<服务端测试>
mount -t nfs  10.0.0.124::/data/   /mnt/

补充

常用命令

rpcinfo -p 检查nfs服务端的rpc信息. 主要检查是否有NFS信息即可. showmount -e ip 检查nfs服务端共享信息(共享哪些目录)

永久挂载

  1. /etc/fstab
cat /etc/fstab
设备                 挂载点     文件系统类型   挂载参数   是否检查 是否备份
10.0.0.124:/data/   /upload/     nfs        defaults   0       0
  1. /etc/rc.d/rc.loacl
tail -1 /etc/rc.d/rc.local
mount -t nfs  10.0.0.124::/data/   /mnt/

chmod +x /etc/rc.d/rc.local

注意

如果配置了永久挂载。若在nfs服务器之前启动客户端,因为无法连接到该nfs,客户端启动会卡住(大约90s)。
因此如果配置了永久挂载,nfs服务器需要提前启动。

什么是NFS用户映射

NFS客户端挂载NFS服务端后,创建的文件默认属于nobody,这种操作就叫用户压缩(映射)。

[root@ecm ~]# ll /mnt
total 0
-rw-r--r-- 1 nobody nobody 0 May 19 20:35 test1.txt

用户压缩是通过NFS服务端的配置实现。(所有常用选项见上文)

服务端配置选项-用户压缩系列说明
root_squash如果客户端是root用户访问,则到了nfs服务端会被压缩( 默认的 )
no_all_squash如果客户端不是root用户访问,则不进行压缩(保存原始用户, 默认的 )
all_squash所有用户都进行压缩(不是太安全)
anonuid 和 anongid用于指定压缩的匿名用户(默认是nobody用户)anonuid=65534,anongid=65534

用户压缩/用户映射: NFS客户端访问NFS共享目录的时候变成了什么用户
nfs客户端用户 -> nfs服务端用户
root -> noboby

默认情况下:

  • 所有的root用户的操作都会被映射为anonuid和anongid所指定的用户root_squash
  • 而其他用户则默认保留原始用户no_all_squash
  • 可以通过anonuid anongid 修改映射后的用户。

修改默认的用户映射——实验

设置/nfsdata共享目录,匿名用户为www. 客户端挂载到/upload-video/,www用户的uid,gid:1999 (服务端,客户端)

#创建用户
groupadd -g 1999 www
useradd  -u 1999 -g www  -s /sbin/nologin  -M www

#添加目录映射
echo "/nfsdata *(rw,all_squash,anonuid=1999,anongid=1999)" >> /etc/exports

#创建目录并重启服务
mkdir /nfsdata
chown -R www.www /nfsdata/ #不修改属主会导致创建命令时被拒绝
systemctl reload nfs

#挂载测试
showmount -e
	Export list for ecm:
	/nfsdata *
	/data    *
mount -t nfs 10.0.0.124:/nfsdata testnfswww
touch testnfswww/testa{1..5}.txt
ll testnfswww/
	total 0
	-rw-r--r-- 1 www www 0 May 20 13:05 testa1.txt

NFS安全优化

让客户端挂载只能上传不能执行

mount  -o noexec,nosuid,nodev  -t nfs 10.0.0.124:/data   /video/
#这几个是客户端挂载选项
# noexec 挂载的nfs目录中如果有命令,无法运行。
# nosuid 带有suid的命令
# nodev 带有特殊属性的文件。

Windows挂载

第一步:在控制面板–>添加程序和功能–>添加NFS组件。
在这里插入图片描述

第二步:在此电脑,映射驱动器中添加nfs地址,和要共享的文件夹。

在这里插入图片描述

第三步:如果权限有问题,打开注册表:regedit, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 下新建两个OWORD(64)位值,添加值AnonymousGid,值默认为0,AnonymousUid,值默认为0。

如果无法连接,记得关闭防火墙

  • 33
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值