目录
3、将你想共享给客户端的文件路径写入到/etc/exports中
4、使用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效
一、环境
server(服务端) | client1(客户端1) | client2(客户端2) | |
ip | 10.0.0.154 | 10.0.151 | 10.0.0.161 |
操作系统 | Rocky | Rocky | Ubuntu |
软件包 | nfs-utils | nfs-utils | nfs-common |
二、搭建NFS
1、在server上安装NFS服务端
yum -y install nfs-utils
注意:
a、在Rocky中,nfs的客户端以及服务端都在nfs-utils这个包中。
b、而在Ubuntu中,nfs客户端以及服务端的包是分开的。
#安装客户端
apt install nfs-common
#安装服务端
apt install nfs-kernel-server
2、启动nfs服务
systemctl start nfs-server.service
3、将你想共享给客户端的文件路径写入到/etc/exports中
vim /etc/exports
#允许访问的服务端文件+允许访问服务端文件的客户端ip+客户端的权限
#151是读写权限,161只读权限,其他权限默认
/data/nfs 10.0.0.151(rw) 10.0.0.161(ro)
注意:
exports文件内容的格式为:/path/share 192.168.1.20(rw,insecure,sync,all_squash)
ip后的参数默认是(ro,sync,root_squash,no_all_squash)
主要选项
# ro 只读
# rw 读写
# root_squash 远程客户端主机上的 root 用户映射成 NFS 主机上的 UID=65534 的用户
# no_root_squash 远程客户端主机 root 用户映射成 NFS 服务器的 root
# all_squash 远程客户端主机用户都映射成 NFS 主机上的 UID=65534 的用户,此项会覆盖no_root_squash
# anonuid 指定用户映射成特定的用户的UID
# anongid 指定用户映射成特定的用户的GID
# sync 同步落盘,在请求数据时立即写入NFS的磁盘上,性能低,安全性高
# async 异步落盘,数据先暂存于缓冲区,再一次性落盘,性能高,安全性低
# insecure 允许非授权访问
# subtree_check 如果共享子目录,强制NFS 检查父目录权限
# no_subtree_check 不检查父目录权限
# wdelay 多个用户写时等待同时写
# no_wdelay 多个用户写时不等待,立即写,当使用 async 项时,无需此设置
# hide 不共享NFS 服务中的子目录,在 NFSv4中无效
# no_hide 共享NFS 服务器上的子目录,在 NFSv4中无效
# secure NFS 服务通过1024以下的安全TCP/IP端口通讯
# insecure NFS 服务通过1024以上的安全TCP/IP端口通讯
4、使用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效
#读取配置
exportfs -r
#查看配置
exportfs -v
5、安装客户端并在客户端查看服务端共享的目录
#在Ubuntu中安装nfs客户端或在rocky安装客户端
apt install nfs-common 或 yum -y install nfs-utils
#showmount -e 这个命令的功能是显示 NFS 服务器上所有的共享目录
showmount -e 10.0.0.154
6、将服务端共享的目录挂载到客户端主机中
#挂载路径/client/nfs是我自建的(空目录文件),可以选择任意你想要的路径
mount 10.0.0.154:/data/nfs /client/nfs
7、查看挂载路径下的内容是否和服务端共享目录下的一致
可以看到客户端下/client/nfs下目录读取的内容是服务端下/data/nfs,到此为止nfs服务搭建完成。以上搭建过程中,nfs客户端采用的clien2,如果采用client1也是差不多的过程,就不写了,需要注意的是在Ubuntu中和Rocky中安装nfs客户端的方法有所区别,这个我在前面已经强调过了。
三、重点注意的点
1、ro、rw
ro:表示只读,如果需要创建文件或修改文件等操作则需要写权限。
rw:读写权限。
在/etc/exports中可以修改权限,然后重新执行exportfs -r重新读取配置文件
从上图可以明显看到,在执行写操作的时候提示从read only 到Permission denied,说明不是因为ro的原因导致的无法写操作。下面继续分析。
2、root_squash、not_root_squash
squash这个单词的中文释义是“压制、抑制”,所以root_squash这个参数的作用大概也能从字母意思猜到:压制root权限。
root_squash:这个参数表示NFS服务器会把客户端的root用户(UID为0)映射为一个匿名用户(根据UID来进行映射,通常是nobody,跟版本有关,UID为65534),以防止root用户在NFS服务器上拥有超级权限。这是默认的设置,可以提高安全性。
这种情况下如何让客服端拥有写权限呢?
上面提到了,将客户端的root账号映射成了服务端的匿名用户,那么匿名用户的权限就是客户端root的权限,所以只需要给匿名用户加上写权限即可。
#给属主、属组、other添加rwx权限
chomd 777 /data/nfs
从上图可以看出,服务端共享文件加了权限后,客户端拥有了写权限。并且,客户端创建的文件,在服务端显示的属主属组为nobody,这也印证了前面所说的客户端root映射服务端匿名账号。
no_root_squash:这个参数表示NFS服务器不会对客户端的root用户进行映射,而是保留其原始的UID。相当于客户端root账号映射服务端root账号,拥有所有权限,一定程度上会降低安全性。
注意:客户端与服务端账号的映射都是通过UID来映射的,不是通过用户名。
在服务端和客户端创建俩个UID相同的用户,在客户端上创建文件,分别在客户端以及服务端查看属组属主,明显可以看出是通过UID进行映射的。
3、all_squash、not_all_squash
all_squash:这个参数表示NFS服务器会把所有客户端的用户(不管是不是root)都映射为一个匿名用户,此项会覆盖no_root_squash。
这里需要注意,all_squash会把客户端的所有用户进行映射到默认匿名用户,如果配置文件中有anonuid和anongid则按这俩个参数映射到相应的用户和组。这里客户端文件属组显示nogroup的原因是在Ubuntu中GID为65534的组就叫nogroup。
no_all_squash:这个参数表示NFS服务器不会对所有客户端的用户进行映射,而是保留其原始的UID。这个参数是默认的设置。
这里需要注意了,这个普通用户mage并没有映射到nobody,而是保留了原始的UID。
4、anonuid、anongid
NFS服务器可以通过anonuid和anongid这两个参数来指定匿名访问用户的本地用户UID和本地用户组GID。也就是说,anonuid和anongid可以通过这俩个参数在指定客户端映射到服务端的哪个账户。
举例:
①配置文件中加入anonuid=2000,客户端创建a.sh后,在服务端可以看到a.sh的属主是server,而属组是nobody。这是因为我们只指定了anonuid,未指定anongid,所以属组还是按默认的映射。
②配置文件中加入anonuid=2000,anongid=2000,客户端创建b.sh后,在服务端可以看到b.sh的属主属组都是是server。
5、rpcinfo -p
rpcinfo -p:查看注册在指定主机上的rpcbind V2 版本的 RPC 服务。
protmapper是rpcbind以前的名字,这里可以看到nfs中其他服务占用的端口,其中有些端口是固定不变的,有些是会变化的。比如rpcbind一直是占用111。