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

发布于:2024-05-24 ⋅ 阅读:(145) ⋅ 点赞:(0)

什么是NFS

NFS(Network File System,网络文件系统)是一种允许网络上的计算机之间共享文件系统的协议。通过NFS,用户和程序可以像访问本地存储一样访问远程服务器上的文件。NFS广泛应用于各种场景,例如在不同的服务器之间共享配置文件、共享数据存储等。


NFS工作原理

在这里插入图片描述
NFS 服务的实现依赖于 RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。

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


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 *

客户端测试

#想使用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 带有特殊属性的文件。

网站公告

今日签到

点亮在社区的每一天
去签到