标签:inf filesyste 服务端 监听 上传 依赖 执行 连接 数据传输
NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录,NFS客户端可以通过挂载的方式将NFS服务端共享数据的文件目录挂载到本地挂载点,这样对本地挂载点目录中的数据进行操作其实就是操作NFS服务端共享数据的文件目录
为什么要使用数据存储共享服务?
没有共享存储的场景:
1、A 用户上传图片经过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。
2、B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,因为 WEB2 上没有这张图片,所以 B用户无法看到 A 用户传的图片
有共享存储的场景:
1.A 用户上传图片无论被负载均衡调度至 WEB1 还是 WEB2, 最终数据都被写入至共享存储
2.B 用户访问 A 用户上传图片时,无论调度至 WEB1 还是 WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源
NFS服务必须依赖于RPC(远程调用服务)才能工作。因为NFS支持的功能特别多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会用一个随机未被使用的端口来传输数据,因此,NFS的功能所对应的端口无法固定。所以客户端要准确的获得NFS服务所使用的端口就需要RPC服务。RPC最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,让客户端可以链接到正确的端口上去,从而实现数据传输。
NFS服务启动时会随机取用多个端口,并主动向RPC服务注册取用的相关端口信息,这样,RPC服务就可以知道每个端口所对应的NFS功能,然后RPC服务使用固定的端口号111来监听NFS客户端提交的请求,并将正确的NFS端口答应给NFS客户端,这样一来,就可以让NFS客户端与服务端进行数据传输了。
yum -y install nfs-utils rpcbind
[root@nfs ~]# vim /etc/exports
# 格式: 01 02(03)
#01: 设置数据存储的目录 /data
#02: 设置网络一个白名单 (允许哪些主机连接到存储服务器进行数据存储)
#03: 配置存储目录的权限信息 存储目录一些功能
/data 172.16.1.0/24(rw,sync)
#注意IP地址和小括号之间没有空格
[root@nfs ~]# mkdir /data -p
root@nfs ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
# 检查nfs服务进程与端口注册信息
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
客户端安装nfs服务十分简单,只需要安装nfs软件包即可
# 1.安装NFS服务软件
[root@web01 ~]# yum -y install nfs
# 2.实现远程挂载共享目录
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
# 3.测试数据是否正常写入
[root@web01 ~]# echo "testtesttest" > /mnt/test.txt
[root@web01 ~]# cat /mnt/test.txt
testtesttest
# 1.利用rc.local
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
# 2.利用fstab文件
vim /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
[root@web01 ~]# umount /mnt
rw ---读写权限
ro ---只读权限
root_squash ---当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户(不常用)
no_root_squash ---当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员(不常用)
all_squash ---无论 NFS 客户端使用什么账户访问,均映射为 NFS 服务器的匿名用户(常用)
no_all_squash ---无论 NFS 客户端使用什么账户访问,都不进行压缩
sync ---同时将数据写入到内存与硬盘中,保证不丢失数据
async ---优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
anonuid ---配置 all_squash 使用,指定 NFS 的用户 UID,必须存在系统
anongid ---配置 all_squash 使用,指定 NFS 的用户 UID,必须存在系统
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# systemctl reload nfs
# restart:将所有连接会话都会直接断开
# reload: 只会将没有数据传输链接断开,重新建立连接,让用户访问感受更好
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 471M 0 471M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 15M 472M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda2 14G 8.6G 5.4G 62% /
/dev/sda1 2.8G 272M 2.6G 10% /boot
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 14G 6.8G 7.3G 49% /mnt
## root用户测试
# 写入测试,不能写入
[root@web01 ~]# echo "hello,hello" > /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system
# 读取测试,可以正常读取数据
[root@web01 ~]# cat /mnt/test.txt
hello,hello
## 普通用户测试
# 读取测试,可以正常读取数据
[python@web01 ~]$ cat /mnt/test.txt
hello,hello
# 写入测试,不能写入
[python@web01 ~]$ echo "hello" > /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=1005,anongid=1005)
[root@nfs ~]# useradd -M -u 1005 www -s /sbin/nologin
[root@nfs ~]# id www
uid=1005(www) gid=1005(www) groups=1005(www)
[root@nfs01 ~]# chown -R www:www /data/
[root@nfs ~]# ll /data/ -d
drwxr-xr-x. 5 www www 67 Jul 7 23:08 /data/
[root@nfs ~]# systemctl reload nfs
[root@nfs ~]# systemctl reload nfs
# 1.创建www用户uid=1005 gid=1005
[root@web01 ~]# useradd -M -u 1005 www -s /sbin/nologin
# 写入数据测试
[root@web01 ~]# echo ‘hello‘ > /mnt/hello.txt
[root@web01 ~]# ll /mnt/hello.txt
-rw-r--r-- 1 www www 6 Jul 8 00:07 /mnt/hello.txt
# 读取数据测试
[root@web01 ~]# cat /mnt/hello.txt
hello
[root@nfs ~]# rpcinfo -p
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 57640 status
100024 1 tcp 56096 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 56967 nlockmgr
100021 3 udp 56967 nlockmgr
100021 4 udp 56967 nlockmgr
100021 1 tcp 44817 nlockmgr
100021 3 tcp 44817 nlockmgr
100021 4 tcp 44817 nlockmgr
rw --- 实现挂载后挂载点目录可读可写 (默认)
ro --- 实现挂载后挂载点目录可读可写
suid --- 在共享目录中可以让setuid权限位生效 (默认)
nosuid --- 在共享目录中可以让setuid权限位失效 提供共享目录的安全性
exec --- 共享目录中的执行文件可以直接执行
noexec --- 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性
auto --- 可以实现自动挂载 mount -a 实现加载fstab文件自动挂载
noauto --- 不可以实现自动挂载
nouser --- 禁止普通用户可以卸载挂载点
user --- 允许普通用户可以卸载挂载点
标签:inf filesyste 服务端 监听 上传 依赖 执行 连接 数据传输
原文地址:https://www.cnblogs.com/Zachariah9426/p/13264333.html