02-NFS存储服务

一、NFS存储服务概念

NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是经过局域网络让不一样的主机系统之间能够共享文件或目录,NFS客户端能够经过挂载的方式将NFS服务端共享数据的文件目录挂载到本地挂载点,这样对本地挂载点目录中的数据进行操做其实就是操做NFS服务端共享数据的文件目录python

为何要使用数据存储共享服务?web

  1. 实现多台服务器之间数据共享
  2. 实现多台服务器之间数据一致

二、NFS应用场景

没有共享存储的场景:shell

一、A 用户上传图片通过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。
二、B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,由于 WEB2 上没有这张图片,因此 B用户没法看到 A 用户传的图片vim

有共享存储的场景:安全

1.A 用户上传图片不管被负载均衡调度至 WEB1 仍是 WEB2, 最终数据都被写入至共享存储
2.B 用户访问 A 用户上传图片时,不管调度至 WEB1 仍是 WEB2,最终都会上共享存储访问对应的文件,这样就能够访问到资源bash

三、NFS和RPC

NFS服务必须依赖于RPC(远程调用服务)才能工做。由于NFS支持的功能特别多,而不一样的功能都会使用不一样的程序来启动,每启动一个功能就会用一个随机未被使用的端口来传输数据,所以,NFS的功能所对应的端口没法固定。因此客户端要准确的得到NFS服务所使用的端口就须要RPC服务。RPC最主要的功能就是记录每一个NFS功能所对应的端口号,而且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,让客户端能够连接到正确的端口上去,从而实现数据传输。服务器

NFS服务启动时会随机取用多个端口,并主动向RPC服务注册取用的相关端口信息,这样,RPC服务就能够知道每一个端口所对应的NFS功能,而后RPC服务使用固定的端口号111来监听NFS客户端提交的请求,并将正确的NFS端口答应给NFS客户端,这样一来,就可让NFS客户端与服务端进行数据传输了。网络

四、NFS服务端部署

4-1 安装软件

yum -y install nfs-utils rpcbind

4-2 编写配置文件

[root@nfs ~]# vim /etc/exports
# 格式: 01 02(03)
#01: 设置数据存储的目录 /data
#02: 设置网络一个白名单 (容许哪些主机链接到存储服务器进行数据存储)
#03: 配置存储目录的权限信息 存储目录一些功能
/data   172.16.1.0/24(rw,sync)
#注意IP地址和小括号之间没有空格

4-3 建立共享数据目录并受权

[root@nfs ~]# mkdir /data -p
root@nfs ~]# chown -R nfsnobody.nfsnobody /data

4-4 启动服务

  1. 启动rpc服务,开启111端口
  2. 启动nfs服务
  3. 实现nfs服务进程和端口号的注册
[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

六、NFS存储目录权限

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,必须存在系统

6-1 验证ro权限

  • 服务端配置
[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

6-2 验证all_squash、anonuid、anongid 权限

  • 服务端配置:
[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/
  • 重启NFS服务
[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

七、查看NFS端口

[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

八、客户端mount命令参数

rw   	--- 实现挂载后挂载点目录可读可写  (默认)
ro   	--- 实现挂载后挂载点目录可读可写
suid 	--- 在共享目录中可让setuid权限位生效  (默认)
nosuid 	--- 在共享目录中可让setuid权限位失效   提供共享目录的安全性
exec 	--- 共享目录中的执行文件能够直接执行
noexec 	--- 共享目录中的执行文件能够没法直接执行 提供共享目录的安全性
auto 	--- 能够实现自动挂载     mount -a 实现加载fstab文件自动挂载
noauto 	--- 不能够实现自动挂载
nouser 	--- 禁止普通用户能够卸载挂载点
user 	--- 容许普通用户能够卸载挂载点
相关文章
相关标签/搜索