什么是NFS ?
NFS 就是network file system 的缩写,中文:网络文件系统,NFS主要的功能是通过网络让不同的机器,不同的系统之间可以共享文件或者目录,可以认为是一个文件服务器。
NFS服务器可以让客户端将网络远程的NFS服务器分享的目录挂载到客户端,在客户端看来,远程的主机(NFS服务器端)就好像是自己的一个磁盘分区一样,使用比较方便。
当NFS服务器设置好了共享目录之后,网络中的NFS客户端就可以将目录挂载到系统上面的某个挂载点,如下图中的NFS client1 与 NFS client2 使用网络挂载NFS服务端的共享目录/data/js到本地/data/nfs/js目录,客户端就可以像本地文件一样使用cp、cat、cd、mv、rm等命令操作客户端的文件。
什么是RPC
上述描述中得知NFS主要是在不同设备之间通过网络传输文件,且每个程序传输数据都需要启动端口,端口随机产生且小于1024,那么就需要使用RPC(远程过程调用协议,RPC描述:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议)
RPC需要先启动,端口111,NFS后启动,服务端在NFS启动之后NFS会随机使用1024内没有被占用的端口,并向RPC注册这些端口,RPC记录端口信息。当NFS客户端需要连接服务端时,会先向服务器端的RPC服务111端口获取对应功能的端口号,然后返回给NFS客户端,客户端获得端口号就可以使用端口连接服务端。下图看可知,客户端和服务端的NFS在使用时都需要启动RPC服务。 NFS简单工作流程图
服务端安装
查看是否安装nfs 和 rpcbind
rpm -qa |egrep "nfs|rpcbind"
安装nfs-utils 和 rpcbind
yum install nfs-utils rpcbind
修改配置文件/etc/exports
cat > /etc/exports <<EOF /data/js 192.168.199.0/24(rw,sync,all_squash) EOF
修改的配置介绍
/data/js 共享的目录 192.168.199.0/24 共享对象 rw 读写访问 sync NFS 服务器在将之前请求所做的更改写入磁盘之前不回复请求(来自文档,网络上基本是“所有数据在请求时写入共享”,不知道共享指的具体是什么? 这里我的理解是内存数据实时写入磁盘,且写入磁盘之前不响应新的请求。) all_squash 无论 NFS 客户端使用什么账户访问,均映射为 NFS 服务器的匿名用户
详细配置介绍
参数(全是英文小写) 作用 rw #读写权限 ro #只读权限 Root_squash #当NFS客户端以root用户访问时,NFS服务端匿名用户 No_root_squash #当NFS客户端以root用户访问时,NFS服务端的root用户 All_squash #无论NFS客户端使用什么账户访问,都映射为NFS服务端的匿名用户 No_all_squash #无论NFS客户端使用什么账户访问,都不进行压缩 sync NFS #服务器在将之前请求所做的更改写入磁盘之前不回复请求(来自文档,网络上基本是“所有数据在请求时写入共享”,不知道共享指的具体是什么? 这里我的理解是内存数据实时写入磁盘,且写入磁盘之前不响应新的请求。) Async #优先将数据保存在内存,然后在写入磁盘,速度更快,但突然断电或者内存故障可能会有数据丢失。 Anonuid=xxxx/anongid=xxxx #要和root_squash 以及all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid
创建数据目录和授权nfs匿名用户权限
mkdir -p /data/js
chown -R nfsnobody:nfsnobody /data/js
nfsnobody 安装nfs后自动创建的用户
启动nfs和rpc
在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call 远程过程调用 服务将 NFS 服务器的IP 地址和端口号信息发送给客户端。因此,在启动 NFS 服务之 前, 需要先重启并启用 rpcbind 服务程序,同时都加入开机自启动
启动nfs 和 rpcbind
systemctl start rpcbind
systemctl start nfs
chowmount -e 192.168.199.23
加入开机自启动
systemctl enable rpcbind
systemctl enable nfs
因为rpc需要优先与nfs启动,所以需要设定systemd启动依赖,具体请查看网络文件,使用开机时自动执行脚本启动。
客户端安装
安装nfs 和rpc
yum install nfs-utils rpcbind
启动rpc,不用启动nfs
systemctl start rpcbind
创建挂载点
mkdir -p /data/nfs/js
测试
关闭firewall
在firewall加入nfs 和 rpcbind 服务 , 或者关闭firewall服务,这里我选择关闭firewall服务
systemctl stop firewalld
在客户端查看可以挂载的目录
showmount -e 192.168.199.23
挂载
mount -t nfs 192.168.199.23:/data/js /data/nfs/js
客户端读写测试
[root@nfs02 js]# pwd
/data/nfs/js
[root@nfs02 js]# ll
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 20 Mar 2 10:27 test_server
[root@nfs02 js]# cat test_server
this is test_server
[root@nfs02 js]# echo "test_client" >> test_server
[root@nfs02 js]# cat test_server
this is test_server
test_client
[root@nfs02 js]# cp test_server /data/
[root@nfs02 js]# cat /data/test_server
this is test_server
test_client
服务端变更,客户端读写测试
服务端执行
[root@nfs03 data]# date >> /data/js/test_server
[root@nfs03 data]# cat /data/js/test_server
this is test_server
test_client
Thu Mar 2 12:53:51 CST 2023
客户端执行
[root@nfs02 js]# cat /data/nfs/js/test_server
this is test_server
test_client
Thu Mar 2 12:53:51 CST 2023
测试nfs01是否也能共享文件
[root@nfs01 js]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.5G 15G 15% /
/dev/sda1 1014M 168M 847M 17% /boot
tmpfs 98M 0 98M 0% /run/user/0
192.168.199.23:/data/js 17G 2.5G 15G 15% /data/nfs/js
[root@nfs01 js]# hostname >> test_server
[root@nfs01 js]# cat test_server
this is test_server
test_client
Thu Mar 2 12:53:51 CST 2023
nfs01
开机自动挂载/etc/fstab
192.168.199.23:/data/js /data/nfs/js nfs defaults,_netdev 1 1
其他
NFS工作原理
1.用户进程访问 NFS 客户端,使用不同的函数对数据进行处理
2.NFS 客户端通过 TCP/IP 的方式传递给 NFS 服务端 3.NFS 服务端接收到请求后,会先调用 portmap 进程进行端口映射。 4.nfsd 进程用于判断 NFS 客户端是否拥有权限连接 NFS 服务端。 5.Rpc.mount 进程判断客户端是否有对应的权限进行验证。 6.idmap 进程实现用户映射和压缩 7.最后 NFS 服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
Rpc.nfsd:NFS守护进程,主要功能是管理客户端是否能够登录服务器; Rpc.mount:主要功能是管理NFS文件系统,当客户端顺利通过NFS登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限验证。它会读取NFS的配置文件/etc/ecports 来对比客户权限 Portmap:主要功能是进行端口映射
NFS服务端停止了服务,服务端卡住
服务端nfs停止服务,客户端没有卸载就会卡住,客户端只能强制卸载nfs (umount -rl 强制卸载)
设置了开机自启动,但是NFS服务没有起动就客户端重启会起不来
客户端在fstab中使用参数“_netdev”,重启能正常启动,后续修复之后在客户端手动挂载mount -a
NFS单点
当nfs服务器故障可能短时间不能恢复,就需要一个替代方案,为nfs服务器做一个备份,当nfs服务器故障之后重新挂载到新服务器上即可。这里就需要使用能够实时同步的工具inotify-tools + rsync、sersync + rsync、lsyncd + rsync实现服务器文件实时同步。
来源:https://www.jianshu.com/p/69fa22529383 (同一个作者)
标签:存储,js,简述,nfs,test,NFS,data,客户端 From: https://blog.51cto.com/u_14593742/6423788