NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是经过局域网络让不一样的主机系统之间能够共享文件或目录,NFS客户端能够经过挂载的方式将NFS服务端共享数据的文件目录挂载到本地挂载点,这样对本地挂载点目录中的数据进行操做其实就是操做NFS服务端共享数据的文件目录python
为何要使用数据存储共享服务?web
没有共享存储的场景:shell
一、A 用户上传图片通过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。
二、B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,由于 WEB2 上没有这张图片,因此 B用户没法看到 A 用户传的图片vim
有共享存储的场景:安全
1.A 用户上传图片不管被负载均衡调度至 WEB1 仍是 WEB2, 最终数据都被写入至共享存储
2.B 用户访问 A 用户上传图片时,不管调度至 WEB1 仍是 WEB2,最终都会上共享存储访问对应的文件,这样就能够访问到资源bash
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软件包便可app
# 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 --- 容许普通用户能够卸载挂载点