NFS(Network File System)是一个网络文件系统协议,用于在不同的计算机之间共享文件和目录。它允许一个计算机上的用户或应用程序通过网络访问另一个计算机上的文件,就像本地文件一样。
那么nfs的应用场景有哪些呢?举个例子,现在我要发布一个视频网站,我会使用多台服务器做负载均衡,那我要在每个服务器上都存放一份视频吗,显然这样做是很不合理的,每个服务器上都放一份相同的数据,容灾能力是提高了,可是利用率也太低了,而且还涉及到一个同步的问题,比如,小明向我的网站上传了一个视频,这个视频可能上传到了服务器A上,其他服务器上没有这个视频,还要考虑服务器的同步问题,在这个场景下,我们就可以使用nfs服务,使用一台服务器作为nfs服务器,将共享目录挂载到每个服务器上,视频都存放在nfs服务器上,这样就方便多了。
nfs中rpcbind是非常重要的一个程序,nfs的所有端口都要向rpcbind注册,客户端的请求也要经过rpcbind,rpcbind就像是一个不可或缺的中间人。在启动nfs服务之前要先启动rpcbind,这一点非常重要。
现在小明要为部门配置nfs共享存储,共享目录名为/data
部门内所有人都可以将该目录挂载到自己本地,并具有读写权限。
1、在服务端安装nfs-utils
,安装nfs-utils
会自动安装rpcbind
,如没有自动安装rpcbind
就再手动安装一下。
yum install -y nfs-utils
2、启动nfs服务,并设置开机自启
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
查看服务运行状态
systemctl status rpcbind nfs-server
mkdir /data
配置/data
权限,挂载之后权限会被压缩成nobody,所以将共享目录的属主属组改为nobody,这样才能正常访问。或者赋予777权限。
chmod 777 /data/
或者:
chown -R nobody.nobody /data/
4、修改配置文件
[root@nfs ~] vim /etc/exports
[root@nfs ~] cat /etc/exports
/data *(rw,sync)
ro:只读权限;
rw:读写权限;
sync:同步,同时将数据写入内存和磁盘中;
async:异步,先将数据写到内存,然后再写入磁盘,效率较高,可能丢失数据;
root_squash:压缩root用户,当NFS客户端以root用户访问时,将其映射为nfsnobody用户;
no_root_squash:不压缩root用户,正常映射为root用户;
all_squash:压缩所有用户,即客户端任何用户访问服务端时,在服务端都将其映射为nfsnobody用户;
no_all_squash:不压缩任何用户;
anonuid:需要配合all_squash使用,将客户端的所有用户在服务端映射为指定UID的用户,该UID在服务端必须存在;
anongid:需要配合all_squash使用,将客户端的所有用户组在服务端映射为指定GID的用户组,该GID在服务端必须存在;
5、重新加载配置文件
[root@nfs ~] exportfs -arv
exporting *:/data
[root@nfs ~]
exportfs: 服务端命令,当/etc/exportfs文件改变时不需要重启服务,只需要使用exportfs命令让新配置文件生效。
常用选项为:
-r:重新导出;
-a:所有文件系统;
-v:详细信息;
-u:取消导出文件系统;
exportfs -arv 表示重读配置文件。
exportfs -auv 表示取消导出的文件系统。
6、防火墙放行服务
[root@nfs ~] firewall-cmd --add-service=nfs --permanent
Warning: ALREADY_ENABLED: nfs
success
[root@nfs ~] firewall-cmd --add-service=rpc-bind --permanent
success
[root@nfs ~] firewall-cmd --add-service=mountd --permanent
success
[root@nfs ~] firewall-cmd --reload
success
[root@nfs ~]
1、客户端安装服务
yum install -y nfs-utils
2、启动客户端程序
systemctl start nfs-client.target
systemctl enable nfs-client.target
查看状态
systemctl status nfs-client
[root@client-php ~] showmount -e 192.168.189.178
Export list for 192.168.189.178:
/data *
[root@client-php ~]
4、尝试挂载
[root@client-php ~] mount -t nfs 192.168.189.178:/data /mnt
[root@client-php mnt] df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 845M 0 845M 0% /dev
tmpfs tmpfs 874M 0 874M 0% /dev/shm
tmpfs tmpfs 874M 9.4M 865M 2% /run
tmpfs tmpfs 874M 0 874M 0% /sys/fs/cgroup
/dev/mapper/cs-root xfs 44G 6.8G 38G 16% /
/dev/nvme0n1p1 xfs 1014M 343M 672M 34% /boot
tmpfs tmpfs 175M 12K 175M 1% /run/user/42
tmpfs tmpfs 175M 0 175M 0% /run/user/0
192.168.189.178:/data nfs4 44G 6.7G 38G 16% /mnt
[root@client-php mnt]#
5、尝试创建文件,验证可用性。
[root@client-php mnt] echo test > /mnt/1.txt
[root@client-php mnt] cat /mnt/1.txt
test
[root@client-php mnt]
如果在创建文件时出现错误:Permission denied
,可能是因为共享目录的权限不够,直接777,见第一部分第3步
[root@client-php mnt]$ touch /mnt/dcr.txt
touch: cannot touch '/mnt/dcr.txt': Permission denied
6、现在出现了一个新问题,一个普通用户dcr创建的文件另一个普通用户operater可以删除,这是不正常的
[root@client-php ~] su - dcr
[dcr@client-php ~]$ echo dcr > /mnt/dcr.txt
[dcr@client-php ~]$ ls /mnt/dcr.txt
/mnt/dcr.txt
[dcr@client-php ~]$ cat /mnt/dcr.txt
dcr
[dcr@client-php ~]$ exit
logout
[root@client-php ~] su - operater
[operater@client-php ~]$ rm -rf /mnt/dcr.txt
[operater@client-php ~]$ ll /mnt/
total 4
-rw-r--r--. 1 nobody nobody 5 Jul 16 10:43 1.txt
[operater@client-php ~]$ exit
要对挂载目录进行权限控制,对共享目录/data
赋予特殊权限:o+t
然后重新加载配置文件,客户端取消挂载重新挂载。这时用户只能删除自己创建的文件。
服务端:
[root@nfs ~] chmod o+t /data/
[root@nfs ~] exportfs -arv
exporting *:/data
客户端:
[root@client-php ~] umount /mnt
[root@client-php ~] mount -t 192.168.189.178 nfs:/data /mnt/
这时,再切换到dcr用户创建一个文件,然后切换到用户operater,尝试删除dcr创建的文件,此时就不能删除了。
[root@client-php ~] su - dcr
[dcr@client-php ~]$ touch /mnt/dcr.txt
[dcr@client-php ~]$ exit
logout
[root@client-php ~] su - operater
[operater@client-php ~]$ ls /mnt/
dcr.txt
[operater@client-php ~]$ rm -rf /mnt/dcr.txt
rm: cannot remove '/mnt/dcr.txt': Operation not permitted
[operater@client-php ~]$
本文参考链接:
1、NFS共享存储
2、在CentOS8上如何安装NFS服务器和客户端