环境准备

主机名 WanIP(Wide Area Network) LanIP(Local Area Network) 角色
web01 10.0.0.7 172.16.1.7 nfs的客户端
web02 10.0.0.8 172.16.1.8 nfs的客户端
nfs 10.0.0.31 172.16.1.31 nfs的服务端

NFS服务端

NFS(Network File System)和RPC(Remote Procedure Call)

部署NFS服务端,需要安装软件包 nfs-utilsrpcbind,CentOS7中自带rpcbind软件包,NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到了这个RPC功能。可以说NFS服务是需要使用RPC的一个程序。或者说NFS也是一个RPC Server。所以只要用到NFS的地方都要启动RPC服务,不论是NFS Server 或者NFS Client。这样Server和Client 才能通过RPC来实现PROGRAM PORT 的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

安装完成后,修改/etc/exports文件,语法格式如下

[共享的目录] IP网段(参数,参数)

其中参数可以用 man exports命令查到:

参数 参数作用
rw NFS客户端读写权限
ro NFS客户端只读权限
root_squash NFS客户端用root用户访问该共享文件目录时,会将root用户映射成匿名用户
no_root_squash NFS客户端用root访问该共享文件夹时,不映射root用户为匿名用户,但给予root用户的待遇
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
no_all_squash 无论NFS客户端使用什么账户访问,都不映射
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 资料会先暂存于内存中,而非直接写入硬盘,从内存中写入硬盘
anonuid anonymous UID,配合all_squash参数使用,将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户
anongid anonymous GID,配合all_squash参数使用,将远程访问的所有用户组都映射为匿名用户组,并指定该用户组为本地用户组
# CentOS 7,只需要安装nfs-utils
[root@nfs ~]# yum install -y nfs-utils # CentOS 6,需要安装nfs和rpc
[root@nfs ~]# yum install -y nfs-utils rpcbind # 编辑nfs的配置文件
[root@nfs ~]# vi /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) # 检查配置文件是否生效
[root@nfs ~]# cat /var/lib/nfs/etab # 创建匿名用户对应的本地用户
[root@nfs ~]# useradd www -u 666 -r -s /sbin/nologin -M # 创建 /data目录,并改变其 属主和属组
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R www.www /data # 启动 nfs-server 和 rpcbind ,添加开机自启
[root@nfs ~]# systemctl restart nfs-server rpcbind
[root@nfs ~]# systemctl enable nfs-server rpcbind

NFS客户端

# 客户端安装 nfs-utils 软件包(CentOS7)
[root@web01 ~]# yum install -y nfs-utils # 查看 NFS服务端 "房源"
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24 # 将目录挂载到 NFS服务端,此时访问 /var/www/html/upload 目录时,实际上是 NFS服务端的 /data目录
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html/upload # 对应的卸载命令
[root@web01 ~]# umount /var/www/html/upload

部署时常见报错

# no route to host

# 1.网络
[root@web01 ~]# ping 172.16.1.31
# 2.端口,nfs-server 通过 RPC 通讯,没有固定端口,无需检查
# 3.防火墙
[root@nfs ~]# systemctl status firewalld
# 4.selinux
[root@nfs ~]# getenforce
# mount.nfs: access denied

# 检查 nfs服务端的 /etc/exports 文件,是否包含 此主机的IP地址
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
# can't touch "xxx" : permission denied

# 1. 检查 nfs服务端 的共享目录,属主和属组 是否为匿名用户(anonuid=666,anongid=666)
[root@nfs ~]# ll /data -d
drwxr-xr-x 2 wqh wqh 140 May 9 15:24 /data
[root@nfs ~]# id wqh
uid=666(wqh) gid=666(wqh) groups=666(wqh) # 2. 检查 nfs客户端 的配置文件,是否将权限设置为只读
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

httpd服务

# 安装 httpd 服务
[root@web01 ~]# yum -y install httpd php # 完善站点目录,编写代码逻辑,使搭建的网站 可上传文件到 /var/www/html/upload
[root@web01 ~]# ll /var/www/html
total 52
-rw-r--r-- 1 root root 38772 Apr 27 2018 bg.jpg
-rw-r--r-- 1 root root 2633 May 4 2018 index.html
-rw-r--r-- 1 root root 52 May 10 2018 info.php
drwxr-xr-x 2 root root 140 May 9 15:24 upload
-rw-r--r-- 1 root root 1128 May 9 11:58 upload_file.php # 上传的文件路径设置为 /var/www/html/upload,由 apache 用户上传,所以要修改 /var/www/html/upload 的属主和属组,否则 apache 用户没有写入的权限
[root@web01 ~]# chown apache.apache /var/www/html/upload
[root@web01 ~]# ll /var/www/html/upload
drwxr-xr-x 2 apache apache 140 May 9 15:24 upload # 或者不指定为 apache 用户,需要修改配置文件
[root@web01 ~]# vim /etc/httpd/conf/httpd.conf
User www
Group www
[root@web01 ~]# chown www.www /var/www/html/upload
[root@web01 ~]# ll /var/www/html/upload
drwxr-xr-x 2 www www 140 May 9 15:24 upload # 修改后,重启 httpd服务
[root@web01 ~]# systemctl restart httpd ######### 以上是单机架构服务器必须要做的操作 ,若是分布式服务器架构端,有以下补充 ########## # 补充1:NFS的客户端/var/www/html的属主和属组 和 NFS的服务端/data 的属主和属组 一定要同一个 UID,GID,不一定要用同一个用户名,组名,否则没有对应权限位的操作权限!! # 补充2:若不同,执行挂载后,NFS客户端会不识别 /data挂载目录(/var/www/html) 的属主和属组,只显示对应的 UID GID,若 NFS客户端有这个UID的用户,则显示客户端的用户名 # 补充3:在挂载后,对于 NFS服务端的操作,并非任何用户都可执行,除了 ROOT 以外, NFS客户端的用户只有 UID=666,GID=666 才可以操作共享存储的目录

NFS 共享存储的坑

NFS 客户端 /var/www/html 的属主和属组 和 NFS服务端 /data 的属主和属组 一定要同一个 UID,GID,不一定要用同一个用户名,组名,否则没有对应权限位的操作权限!!

例如,NFS 服务端的匿名用户 UID=666、GID=666,而我在 NFS客户端 用一个 UID=777、GID=777 的用户去挂载的共享存储目录中写入文件时,会报错!!

也就是说,NFS客户端,某个用户的 UID 和 GID 不同于 NFS 服务端匿名用户时,是无法拥有对应的权限的,举一个具体的例子,如 phpmyadmin软件 的会话(Session)文件存储:





最新文章

  1. VMware12下安装Debian8.5
  2. supervisor-2:event
  3. iOS开发 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突
  4. entity1
  5. loop 循环次数
  6. oracle的substr函数的用法
  7. WCF初探-21:WCF终结点(endpoint)
  8. 【py分析】
  9. Mybaits 之根据集合查询和逗号分隔的子查询
  10. Spring JTA应用JOTM & Atomikos II JOTM
  11. Ubuntu 12.04 安装Scrapy爬虫框架
  12. 通过布局文件来显示ListView内容并注册 ListView事件
  13. 【Android】创建Popwindow弹出菜单的两种方式
  14. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载
  15. 【转载】wifi一键配网smartconfig原理及应用
  16. 解决微信小程序wepy真机预览跟本地表现不一样,数据变化了视图没变化
  17. DLCI 简介
  18. Redis-5.0.0集群配置
  19. Google CodeJam 2016 round3-A.Teaching Assistant
  20. Atitit.web的自动化操作与信息抓取 attilax总结

热门文章

  1. kubernets之ReplicaSet
  2. LeetCode938. 二叉搜索树的范围和
  3. Linux TCP漏洞 CVE-2019-11477 CentOS7 修复方法
  4. kaggle新手如何在平台学习大神的代码
  5. inode占满导致No space left on device inode快速解决方法
  6. ModelForm的基本用法:
  7. css animation @keyframes 动画
  8. Spring Security 实战干货:分布式对象SharedObject
  9. InnoDB 事务隔离级探索
  10. Map类型数据导出Excel--poi