NFS实现共享wordpress

实验环境

192.168.68.134 wordpress站点 nfs-server

192.168.68.144 nfs-client

实验要求

nfs server共享/var/www/html目录

nfs clinet挂载nfs-server共享的目录,部署wordpress

nfs server端

先部署wordpress document root 在 /var/ww/html下

vim /etc/exports :/var/www/html/ 192.168.0.0/16(rw)

exportfs -r

systemctl start nfs

nfs client端

[root@centos ~]# showmount -e 192.168.68.134

[root@centos ~]# mount -t nfs 192.168.68.134:/var/www/html /var/www/html

[root@centos ~]# systemctl restart httpd

部署LAMP+NFS实现双Web服务器负载均衡

未分类

一、需求分析

  1. 前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器;

  2. 虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务器都需要在各自的系统中都存有一份静态页面数据呢?那么如果能将静态页面集中存放,所有Web服务器都来集中地取文件,对于文件的一致性就有了保障,这个集中地就叫做“文件共享服务器”;

二、需求实现

  1. web1充当http服务器和DNS解析服务器,客户端到web1和web2的请求,如果是静态资源请求通过php主机的NFS服务挂载的存储返回结果

  2. web1和web2对于客户端动态资源请求都反向代理到后端php服务器进行执行后返回结果

  3. web1和web2实现DNS轮询,客户端访问博客网站是负载均衡的。

  4. 建立wordpress博客

  5. 数据库存储wordpress博客的各种数据

三、架构图

未分类

四、步骤概述

  1. 部署LAMP环境、配置NFS服务器

  2. web1、web2、php服务器全部挂载NFS共享目录为网站根目录

  3. 配置httpd实现动静分离

  4. 配置DNS实现负载均衡

五、详细过程

1. web1、web2服务器编译安装Apache

# 安装依赖包
yum groupinstall "development tools"
yum install openssl-devel expat-devel pcre-devel 
#
# 解压文件
tar xvf apr-1.6.2.tar.gz 
tar xvf apr-util-1.6.0.tar.gz 
tar xvf httpd-2.4.27.tar.bz2 
cp -r apr-1.6.2 httpd-2.4.27/srclib/apr
cp -r apr-util-1.6.0 httpd-2.4.27/srclib/apr-util
#
# 编译安装
cd httpd-2.4.27/
./configure 
--prefix=/app/httpd24 
--sysconfdir=/etc/httpd24 
--enable-so --enable-ssl 
--enable-rewrite --with-zlib 
--with-pcre --with-included-apr 
--enable-modules=most 
--enable-mpms-shared=all 
--with-mpm=prefork
#
make && make install
#
#配置环境变量
vim /etc/profile.d/lamp.sh
    PATH=/app/httpd24/bin/:$PATH
. /etc/profile.d/lamp.sh
#
# 启动服务
apachectl start

2. 数据库服务器二进制安装mariadb

# 解压文件
tar xvf mariadb-10.2.8-linux-x86_64.tar.gz  -C /usr/local/
cd /usr/local
#
# 创建软连接,mariadb在/usr/local下必须名为mysql,可以创建软连接,可以改名
ln -s mariadb-10.2.8-linux-x86_64/ mysql
#
# 创建用户
useradd -r -m -d /app/mysqldb -s /sbin/nologin mysql 
cd mysql/
#
# 初始化数据库
scripts/mysql_install_db --datadir=/app/mysqldb --user=mysql
#
# 创建配置文件
mkdir /etc/mysql
cp support-files/my-large.cnf   /etc/mysql/my.cnf
#
# 修改配置文件,指定数据库存放路径
vim /etc/mysql/my.cnf
[mysqld]
datadir = /app/mysqldb             在mysqld下添加这三行
innodb_file_per_table = ON
skip_name_resolve = ON
#
# 复制启动脚本,添加开机自动启动
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list 
service mysqld start
#
# 创建日志目录
mkdir /var/log/mariadb
chown mysql /var/log/mariadb/
#
#添加环境变量
vim /etc/profile.d/lamp.sh 
   PATH=/app/httpd24/bin/:/usr/local/mysql/bin/:$PATH
. /etc/profile.d/lamp.sh
#
#调用安全加固脚本,加固数据库。汉字为每一项的翻译
mysql_secure_installation
  是否设置root密码
  输入密码
  确认密码
  是否设置匿名用户
  是否允许root远程登录
  删除test数据库
  现在是否生效

3. PHP应用服务器编译安装PHP7

# 安装依赖包
yum install libxml2-devel bzip2-devel libmcrypt-devel gcc openssl-devel
tar xvf  php-7.1.7.tar.bz2
#
#编译安装
cd php-7.1.7.tar.bz2
./configure 
--prefix=/app/php 
--enable-mysqlnd                           #mysqlnd 指明Mysql不再本地
--with-mysqli=mysqlnd 
--with-pdo-mysql=mysqlnd 
--with-openssl 
--enable-mbstring 
--with-freetype-dir  
--with-jpeg-dir 
--with-png-dir 
--with-zlib 
--with-libxml-dir=/usr 
--enable-xml 
--enable-sockets 
--enable-fpm                               #用FPM模式
--with-mcrypt 
--with-config-file-path=/etc/php 
--with-config-file-scan-dir=/etc/php.d 
--with-bz2
#
# 创建PHP配置文件
mkdir /etc/php/
cp php.ini-production /etc/php/php.ini
#
# 复制服务脚本,添加开机自动启动
cp   sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig --list  php-fpm
#
# 创建fpm的配置文件
cd /app/php/etc
cp php-fpm.conf.default php-fpm.conf
cd /app/php/etc/php-fpm.d/
cp www.conf.default www.conf
vim www.conf
    listen = 172.18.68.23:9000              #设置监听的IP,注释监听所有, 只写端口监听鄋
    ;listen.allowed_clients = 127.0.0.1.    #把这项注释掉,分号为注释
systemctl start php-fpm

4. 配置NFS服务器

NFS服务器的配置特别简单,最重要的时配置完后就赶紧将NFS共享目录挂载至web1、web2、PHP服务器的网站根目录。

mkdir -pv /app/nfs/web #创建共享目录,此目录为网站的根目录,实现统一管理。

vim /etc/exports
  /app/nfs/web 172.18.0.0/16(ro,sync,root_squash,no_all_squash)
# 允许172.18.0.1网段挂载NFS共享,如果要提高安全性应该控制到主机
  • Web1服务器

mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs #/app/httpd24/htdocs为httpd.conf中的根目录

  • Web2服务器

mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs #/app/httpd24/htdocs为httpd.conf中的根目录

  • PHP应用服务器

mkdir /app/httpd24/htdocs #PHP没有根目录,/app/httpd24/htdocs为NFS的挂载点。
mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs

5. 配置Apache实现动静分离

  • 加载模块
vim /etc/httpd24/httpd.conf
    LoadModule proxy_module modules/mod_proxy.so                       #取消两行的注释,加载两模块
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
  • 动静分离

在配置文件的末尾追加这四行,利用代理将所有以.php结尾的文件交给PHP服务器处理,实现动静分离

vim /etc/httpd24/httpd.conf
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php-source .phps
  ProxyRequests Off 关闭正向代理
  ProxyPassMatch  ^/(.*.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1  
#要确保PHP服务器中有这个目录,(在NFS中创建这个目录,且将NFS挂载至此目录。)
apachectl restart

6. 部署wordpress博客

因为web1、web2、PHP服务器都使用NFS共享的目录作为根目录,所以只需要将wordpress博客系统部署在NFS服务器上即可让所有服务器得到同样的数据。

  • 安装博客程序
# 解压博客程序
tar xvf wordpress-4.8.1-zh_CN.tar.gz  -C /app/httpd24/htdocs
cd /app/httpd24/htdocs
mv wordpress/ blog/
# 创建配置文件
cd /app/httpd24/htdocs/blog/
cp wp-config-sample.php  wp-config.php
  • 配置数据库

wordpress需要数据库,所以在此先创建一个wordpress专用的数据库,且创建授权用户。

mysql -uroot -pCentOS
create datebase wpdb;
grant all on wpdb.* to wpuser@'172.18.68.%' identified by 'centos';
  • 配置wordpress连接数据库
# 编辑配置文件,写入创建的IP、数据库、与用户性
vim wp-config.php
define('DB_NAME', 'wpdb');
#
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
#
/** MySQL数据库密码 */
define('DB_PASSWORD', 'centos');
#
/** MySQL主机 */
define('DB_HOST', 'localhost');

7. 登录测试

  • 浏览器打开,http://IP,设置管理员的用户名密码,点击安装

未分类

  • 输入用户名密码,即可进入博客网站的后台页面。

未分类

  • 默认风格的博客页面首页,还是比较好看滴

未分类

8. 配置DNS负载均衡

购买了单独域名后,在后台控制面板中添加两条A记录,就可以达到负载均衡。

到这里基于LAMP+NFS架构的双Web服务器、动静分离网站就搭建完成了。
双WEB服务器架构的好处在于如果有一台服务器宕机不会是整个网站瘫痪。

NFS共享存储的好处在于,DNS负载均衡后,不论用户被分配到哪台主机上,都能看到相同的页面得到相同的结果。

Rhel7下NFS的配置以及使用

一、NFS概述

1. NFS概述

NFS 是Network File System的缩写,即网络文件系统。

一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。

功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

NFS 的基本原则是”容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。

RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。

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

2. NFS的一些守护进程

NFS系统守护进程

nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;

mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。

当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。

rpcbind:主要功能是进行端口映射工作。

当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。

二、测试机概述

server端:

  • 主机名:nfsserver
  • ip:192.168.0.110

client端:

  • 主机名:fundation10
  • ip:192.168.0.199

Operating System均为: Red Hat Enterprise Linux Server 7.0 (Maipo)

三、server端NFS服务的搭建

以下操作在server端:

1. 安装NFS服务

  • nfs-utils :包括基本的NFS命令与监控程序
  • rpcbind :支持安全NFS RPC服务的连接

所以需要安装rpcbind和nfs-utils两个包

yum install rpcbind nfs-utils -y

2. NFS服务器的配置

1)查看NFS服务的配置文件

rpm -qc nfs-utils

看到的内容是这些

/etc/nfsmount.conf 
/etc/request-key.d/id_resolver.conf 
/etc/sysconfig/nfs 
/var/lib/nfs/etab 
/var/lib/nfs/rmtab 
/var/lib/nfs/state 
/var/lib/nfs/xtab

但是/etc/exports才是nfs服务的主配置文件

这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。

2)了解server端NFS服务主配置文件的输出目录以及输出属性
首先我们来看一下/etc/exports的格式

<输出目录> [客户端1选项(访问权限,用户映射,其他)] [客户端2选项(访问权限,用户映射,其他)]

其次,详细了解

##############输出目录:###################

输出目录是指NFS系统中需要共享给客户机使用的目录;

##############客户端:####################

客户端是指网络中可以访问这个NFS输出目录的计算机

#############客户端常用的指定方式###########

    指定ip地址的主机:192.168.0.200

    指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
    指定域名的主机:nfs.cnhzz.com
    指定域中的所有主机:*.cnhzz.com
    所有主机:*

##################选项:####################

选项用来设置输出目录的访问权限、用户映射等。

NFS主要有3类选项:
1)访问权限选项
    设置输出目录只读:ro
    设置输出目录读写:rw
2)用户映射选项
    all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
    no_all_squash:与all_squash取反(默认设置);
    root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
    no_root_squash:与rootsquash取反;
    anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
    anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
3)其它选项
    secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
    insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
    sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
    async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
    wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
    no_wdelay:若有写操作则立即执行,应与sync配合使用;
    subtree_check:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
    no_subtree_check:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

3. 正式配置NFS服务的主配置文件

要求:

1.将/testdata作为输出目录(共享目录),
2.只共享给192.168.0网段的主机
3.客户端对该目录可读可写
4.数据要求同步
5.若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);

步骤:

1)建立/testdata

mkdir /testdata

2)写入配置文件

那么就要在server端写入以下:

/testdata 192.168.0.0/24(rw,sync,subtree_check)

!!!注意*和()之间没有空格

4. 开启服务rpcbind,nfs-utils

systemctl start rpcbind nfs

一定先启动rpcbind

5. 查看共享目录

用命令showmount或者exportfs

showmount -e 192.168.0.110
exportfs

未分类

6. 要求server端防火墙通过NFS服务

firewall-cmd --permanent --add-service=nfs
systemctl restart firewalld.service

或者直接关闭防火墙

四、client挂载NFS服务器共享的目录

1. 将NFS服务器共享的目录挂载至client本机的/mnt下

mount 192.168.0.110:/testdata /mnt

2. 尝试ls/touch,了解server端给自己打开了哪些权限
我以client端普通用户root挂载,普通用户没有挂载权限,得到以下结果

未分类

然后查看server端给我client端的权限,果然缺少wx权限

未分类

那么在server端给client端这样的权限,

未分类

再次尝试:

未分类

仍然无法touch,原因何在

未分类

no_root_squash 是让root保持权限,root_squash是将root映射成nobody,而服务器端并没有设置no_root_squash权限

那么我们设置no_root_squash 映射属性吧

未分类

这样就OK了,下面一项就是对它的解释

五、server端开放某些权限,以供client端使用

关于权限的分析

1、客户端连接时候,对普通用户的检查
如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;

如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;

如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;

2、客户端连接的时候,对root的检查

如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;

如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;

如果没有明确指定,此时root用户被压缩为nfsnobody;

如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;

六、客户端取消挂载

使用umount mountpoint

umount /mnt/

七、相关命令介绍

1、exportfs

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

# exportfs [-aruv]
-a    # 全部挂载或卸载 /etc/exports中的内容
-r     #重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u  #卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v     #在export的时候,将详细的信息输出到屏幕上。

具体例子:

[root@server ~]# exportfs -au #卸载所有共享目录

2、nfsstat

查看NFS的运行状态,对于调整NFS的运行有很大帮助。

3、rpcinfo

查看rpc执行信息,可以用于检测rpc运行情况的工具
rpcinfo -p看出RPC开启的端口所提供的程序有哪些。

4、showmount

-a 显示已经于客户端连接上的目录信息
-e IP或者hostname 显示此IP地址分享出来的目录
最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。

NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)

八、处理showmount报错

如果使用showmount报错

类似clnt_create: RPC: Program not registered

解决方式

server端重启nfs,client端重新挂载,给server和client分别在/etc/hosts加上解析

server

192.168.0.110 nfsserver

client

192.168.0.199 fundation10

NFS网络文件系统

说明:以下配置都是以root用户角色执行的,并且基于RHEL7设置的,参考书籍《Linux就该这么学》。

什么是NFS?

NFS就是Network FileSystem的缩写,是由Sun公司发展出来的。其目的是让linux 机器之间彼此分享文档。NFS可以让服务器端共享的目录挂载到本地客户机上,对于本地客户机器来说,远程服务器上的目录就好像自己的一部分。NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,能够让Linux客户端像使用本地资源一样读写远端NFS服务端的文件内容。

NFS有哪些作用?

它的功能是把NFS服务器(即Linux主机)的某个目录挂载到开发板的文件系统上。这样,开发板就可以执行该目录中的可执行程序。这样做的优点在于:不用将程序写入开发板的Flash,减少了对Flash的损害,同时也方便调试。

在嵌入式系统开发中主要用于NFS网络根文件系统启动或者网络加载调试应用程序。

NFS允许系统将其目录和文件共享给网络上的其他系统。通过NFS,用户和应用程序可以访问远程系统上的文件,就像它们是本地文件一样。那么NFS最值得注意的优点有:

(1)本地工作站可以使用更少的磁盘空间,因为常用数据可以被保存在一台机器上,并让网络上的其他机器可以访问它。

(2)不需要为用户在每台网络机器上放一个用户目录,因为用户目录可以在NFS服务器上设置并使其在整个网络上可用。

(3)存储设备如软盘、光驱及USB设备可以被网络上其它机器使用,这可能可以减少网络上移动设备的数量。

NFS运行机制:

NFS是通过网络进行数据传输,并且传输数据时使用的端口是随机的,但是唯一的限制就是端口小于1024。客户端怎么知道服务器使用的是哪个端口,此时就要用到远程过程调用RPC。

其实,NFS运行在SUN的RPC(Remote Procedure
Call,远程过程调用)基础上,RPC定义了一种与系统无关的方法来实现进程间通信,由此,NFS Server也可以看作是RPC
Server。正因为NFS是一个RPC服务程序,所以在使用它之前,先要映射好端口——通过portmap设定。比如:某个NFSClient发起NFS服务请求时,它需要先得到一个端口(port),所以它先通过portmap得到portnumber(不仅是NFS,所有的RPC服务程序启动之前,都需要先设定好portmap)。

注意:在启动RPC服务(比如NFS)之前,需要先启动portmap服务。

NFS具体配置步骤:

一、服务端配置

1、安装NFS服务

yum install nfs-utils

2、在NFS服务端主机上面建立用于NFS文件共享的目录,设置较大的权限来保证其他人也一样有写入的权限:

mkdir /nfsfile
chmod -Rf 777 /nfsfile
echo "This is a test file" > /nfsfile/readme

3、NFS服务程序的配置文件为/etc/exports,默认里面是空白没有内容的,可以按照共享目录的路径 允许访问的NFS资源客户端(共享权限参数)的格式来写入参数,定义要共享的目录与相应的权限。共享权限参数如下:

未分类

例如想要把/nfsfile目录共享给所有属于192.168.10.0/24这个网段的用户主机,并且让这些用户拥有读写权限,自动同步内存数据到本地硬盘,以及把对方root超级用户映射为本地的匿名用户等等特殊权限参数,那么就可以按照下面的格式来写入配置文件:

vim /etc/exports
/nfsfile 192.168.10.*(rw,sync,root_squash)

4、启动运行NFS共享服务程序,由于NFS服务在文件共享过程中是依赖RPC服务进行工作了,RPC服务用于把服务器地址和服务端口号等信息通知给客户端,因此要使用NFS共享服务的话,顺手也要把rpcbind服务程序启动,并且把这两个服务一起加入到开机启动项中:

systemctl restart rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server

二、客户端配置

1、首先用showmount命令查询NFS服务端的远程共享信息,输出格式为“共享的目录名称 允许使用客户端地址”:

常用参数如下:

未分类

showmount -e 192.168.10.10  # 显示远程服务端共享的信息

2、然后在客户端系统上面创建一个挂载目录,使用mount命令的 -t 参数指定挂载文件系统的类型,以及后面写上服务端的IP地址,共享出去的目录以及挂载到系统本地的目录。

mkdir /nfsfile         # 创建本地用来挂载的文件夹
mount -t nfs 192.168.10.10:/nfsfile /nfsfile  # 挂载

3、最后挂载成功后,切换到本地目录就应该能够顺利查看到在服务端写入的文件内容了,如果希望远程NFS文件共享能一直有效,还可以写入到fstab文件中:

cat /nfsfile/readme  # 可以在本地目录查看到之前在服务端写入的文件内容
vim /etc/fstab       # 编辑fstab文件保证开机启动仍然有效
    192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0    #具体写入的内容

CentOS下NFS共享存储环境搭建

在CentOS 6.9环境下搭建NFS共享,使用Yum安装

yum install nfs-utils -y

修改服务端配置文件/etc/exports如下:

# 格式:
# 作为共享的本地目录  主机A(权限)  主机B(权限)
# fsid=0表示客户端挂载时将/data/share映射为/根目录
/data/share 192.168.1.111(rw,sync,fsid=0,no_root_squash) 192.168.1.112(rw,sync,fsid=0,no_root_squash)

设置开机启动并启动服务

chkconfig rpcbind on
chkconfig nfs on
service rpcbind start
service nfs start

客户端也需要安装nfs-utils

yum install nfs-utils -y

客户端挂载直接使用mount命令即可,也可以加入/etc/fstab

不过还是建议放在/etc/rc.local,防止客户端服务器重启时
如果访问NFS服务器超时会导致客户端服务器启动慢或者无法启动

挂载命令

mount -t nfs4 -o rw,intr,hard,proto=tcp,noatime,nodev,noexec,nosuid 192.168.1.22:/ /data/web/wwwroot/upload/

客户端使用NFSv4协议挂载时,访问共享文件会特别慢,查看日志/var/log/message会报以下错误:

Aug 25 16:19:13 localhost nfsidmap[5617]: nss_getpwnam: name 'root@localhost' does not map into domain 'localdomain'
Aug 25 16:19:13 localhost nfsidmap[5619]: nss_name_to_gid: name 'root@localhost' does not map into domain 'localdomain'

如使用chown修改共享文件权限时会报以下错误:

idmapd errors about "localdomain", or chown failing on nfs4 mount, with "invalid argument"

Google后,找到问题解决办法:https://www.novell.com/support/kb/doc.php?id=7014266

原文摘录如下:

NFSv4 handles user identities differently than NFSv3. In v3, an nfs client would simply pass a UID number in chown (and other requests) and the nfs server would accept that (even if the nfs server did not know of an account with that UID number). However, v4 was designed to pass identities in the form of @. To function correctly, that normally requires idmapd (id mapping daemon) to be active at client and server, and for each to consider themselves part of the same id mapping domain.

Chown failures or idmapd errors like the ones documented above are typically a result of either:
1. The username is known to the client but not known to the server, or
2. The idmapd domain name is set differently on the client than it is on the server.

Therefore, this issue can be fixed by insuring that the nfs server and client are configured with the same idmapd domain name (/etc/idmapd.conf) and both have knowledge of the usernames / accounts in question.

However, it is often not convenient to insure that both sides have the same user account knowledge, especially if the nfs server is a filer. The NFS community has recognized that this idmapd feature of NFSv4 is often more troublesome that it is worth, so there are steps and modifications coming into effect to allow the NFSv3 behavior to work even under NFSv4.

SUSE NFS clients on SLES 11 SP2 or higher have this ability, but it is not necessarily always the default behavior. Setting the kernel module parameter as described in the "Resolution" section of this document is needed. In mainstream Linux, the default behavior changes in kernel 3.3, i.e. to already have nfs4_disable_idmapping set to 1. So eventually (as newer kernels come into SUSE products) setting this manually will not be needed.

NOTE: Some NFSv4 servers may not be prepared to accept this behavior, either. Both sides need to understand this change. If using a Linux NFSv4 server, it may be necessary to use a distribution with kernel 3.4 or higher (for example, openSUSE 12.2 or higher, or upcoming SLES 12). For 3rd party filers, check the nfs configuration for settings related to idmap, uids, etc.

原来是因为NFv4使用了idmapd来传递确保用户身份,必须确保服务器和客户度必须具有相同的idmapd域名(/etc/idmapd.conf),但通常服务端是不可控的
因此解决办法就是降级到NFSv3协议,或者是修改NFS服务器端参数nfs4_disable_idmapping改为True

在服务端执行关闭NFSv4的idmapping用户映射的命令,并将其添加到/etc/rc.local里以便下次开机自动关闭,问题解决

echo 1 > /sys/module/nfsd/parameters/nfs4_disable_idmapping

nfs客户端启动报错rpc.mountd: svc_tli_create: could not open connection for tcp6

# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
                                                           [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: address family inet6 not supported by protocol TCP
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]

根据启动提示可以获知,inet6地址族不被支持,原因是当前主机没有加载ipv6的模块,可以重新加载一遍ipv6模块解决这个问题。

由于我的系统不需要ipv6的支持,所以还可以通过下面的操作,取消NFS的ipv6调用。

# cat /etc/netconfig
#
# The network configuration file. This file is currently only used in
# conjunction with the TI-RPC code in the libtirpc library.
#
# Entries consist of:
#
#       <network_id> <semantics> <flags> <protofamily> <protoname> 
#               <device> <nametoaddr_libs>
#
# The <device> and <nametoaddr_libs> fields are always empty in this
# implementation.
#
udp        tpi_clts      v     inet     udp     -       -
tcp        tpi_cots_ord  v     inet     tcp     -       -
udp6       tpi_clts      v     inet6    udp     -       -
tcp6       tpi_cots_ord  v     inet6    tcp     -       -
rawip      tpi_raw       -     inet      -      -       -
local      tpi_cots_ord  -     loopback  -      -       -
unix       tpi_cots_ord  -     loopback  -      -       -
注掉:udp6,tcp6后重启nfs

还是报错:

# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]

还没启动rpcbin

# /etc/init.d/rpc
rpcbind     rpcgssd     rpcidmapd   rpcsvcgssd 
[root@208LBT /]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

nfs故障排查思路介绍

之前开发时就碰到过nfs客户端卡住的情况,umount -f /mnt提示device is busy,并且尝试访问挂载目录、df -h等操作都会使终端卡住,ctrl+c也不能强行退出。

当时忙着赶进度,没研究这个问题。最近倒出功夫研究一下,顺便学习一下nfs的优化。
造成这种现象的原因是nfs服务器/网络挂了,nfs客户端默认采用hard-mount选项,而不是soft-mount。他们的区别是
soft-mount: 当客户端加载NFS不成功时,重试retrans设定的次数.如果retrans次都不成功,则放弃此操作,返回错误信息 “Connect time out”
hard-mount: 当客户端加载NFS不成功时,一直重试,直到NFS服务器有响应。hard-mount 是系统的缺省值。在选定hard-mount 时,最好同时选 intr , 允许中断系统的调用请求,避免引起系统的挂起。当NFS服务器不能响应NFS客户端的 hard-mount请求时, NFS客户端会显示
“NFS server hostname not responding, still trying”

下面列出mount关于nfs相关的参数

(1)-a:把/etc/fstab中列出的路径全部挂载。
(2)-t:需要mount的类型,如nfs等。
(3)-r:将mount的路径定为read only。
(4)-v mount:过程的每一个操作都有message传回到屏幕上。
(5)rsize=n:在NFS服务器读取文件时NFS使用的字节数,默认值是4096个字节。
(6)wsize=n:向NFS服务器写文件时NFS使用的字节数,默认值是4096个字节。
(7)timeo=n:从超时后到第1次重新传送占用的1/7秒的数目,默认值是7/7秒。
(8)retry=n:在放弃后台mount操作之前可以尝试的次数,默认值是7 000次。
(9)soft:使用软挂载的方式挂载系统,若Client的请求得不到回应,则重新请求并传回错误信息。
(10)hard:使用硬挂载的方式挂载系统,该值是默认值,重复请求直到NFS服务器回应。
(11)intr:允许NFS中断文件操作和向调用它的程序返回值,默认不允许文件操作被中断。
(12)fg:一直在提示符下执行重复挂载。
(13)bg:如果第1次挂载文件系统失败,继续在后台尝试执行挂载,默认值是失败后不在后台处理。
(14)tcp:对文件系统的挂载使用TCP,而不是默认的UDP。

如#mount -t nfs -o soft 192.168.1.2:/home/nfs /mnt

至于传输尺寸的选择,可以进行实际测试:

time dd if=/dev/zero of=/mnt/nfs.dat bs=16k count=16384

即向nfs服务器上的nfs.dat文件里写入16384个16KB的块(也有经验说文件大小可以设定为nfs服务器内存的2倍)。
得到输出如:

输出了 16384+0 个块
user    0m0.200s
输出了 66535+0 个块
user    0m0.420s
192.168.1.4:/mnt  /home/nfs  nfs   rsize=8192,wsize=8192,timeo=10,intr

重新挂载nfs服务器,调整读写块大小后重复上述过程,可以找到最佳传输尺寸。

NFS服务器的故障排除

故障排除思路:

NFS出现了故障,可以从以下几个方面着手检查。

(1)NFS客户机和服务器的负荷是否太高,服务器和客户端之间的网络是否正常。
(2)/etc/exports文件的正确性。
(3)必要时重新启动NFS或portmap服务。

运行下列命令重新启动portmap和NFS:

service portmap restart
service nfs start

(4)检查客户端中的mount命令或/etc/fstab的语法是否正确。
(5)查看内核是否支持NFS和RPC服务。

普通的内核应有的选项为CONFIG_NFS_FS=m、CONFIG_NFS_V3=y、CONFIG_ NFSD=m、CONFIG_NFSD_V3=y和CONFIG_SUNRPC=m。
我们可以使用常见的网络连接和测试工具ping及tracerroute来测试网络连接及速度是否正常,网络连接正常是NFS作用的基础。rpcinfo命令用于显示系统的RPC信息
,一般使用-p参数列出某台主机的RPC服务。用rpcinfo-p命令检查服务器时,应该能看到portmapper、status、mountd nfs和nlockmgr。用该命令检查客户端时,应
该至少能看到portmapper服务。

使用nfsstat命令查看NFS服务器状态

nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口的统计信息,也可以使用该命令重新初始化该信息。如果未给定标志,默认是nfsstat -csnr命令。使用该命令显示每条信息,但不能重新初始化任何信息。

nfsstat命令的主要参数如下。

(1)-b:显示NFS V4服务器的其他统计信息。
(2)c:只显示客户机端的NFS和RPC信息,允许用户仅查看客户机数据的报告。nfsstat命令提供关于被客户机发送和拒绝的RPC和NFS调用数目的信息。
要只显示客户机NFS或者RPC信息,将该参数与-n或者-r参数结合。
(3)-d:显示与NFS V4授权相关的信息。
(4)-g:显示RPCSEC_GSS信息。
(5)-m:显示每个NFS文件系统的统计信息,该文件系统和服务器名称、地址、安装标志、当前读和写大小,以及重新传输计数
(6)-n:为客户机和服务器显示NFS信息。要只显示NFS客户机或服务器信息,将该参数与-c和-s参数结合。
(7)-r:显示RPC信息。
(8)-s:显示服务器信息。
(9)-t:显示与NFS标识映射子系统的转换请求相关的统计信息,要只显示NFS客户机或服务器信息,将-c和-s选项结合。
(10)-4:当与-c、-n、-s或-z参数组合使用时,将包含NFS V4客户机或服务器的信息,以及现有的NFS V2和V3数据。
(11)-z:重新初始化统计信息。该参数仅供root用户使用,并且在显示上面的标志后可以和那些标志中的任何一个组合到统计信息的零特殊集合。

要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息,输入:

nfsstat -c

要显示和打印与客户机NFS调用相关的信息,输入如下命令:

nfsstat -cn

要显示和打印客户机和服务器的与RPC调用相关的信息,输入如下命令:

nfsstat -r

要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息,输入如下命令:

nfsstat –s

centos7.1安装配置NFS共享文件系统

环境:centos7.1
server:192.168.0.63
client:192.168.0.64 (centos7.1 客户端)
共享文件的目录用户为:web(uid:1000,gid:1000)

一、安装

yum -y install nfs-utils rpcbind

nfs 的配置文件 /etc/expots
共享目录赋予权限:chmod 755 /home/data
vim /etc/exports
/home/data 192.168.0.0/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)

二、使配置生效

exportfs -rv

配置文件说明:

/opt/test 为共享目录

  • 192.168.1.0/24 可以为一个网段,一个IP,也可以是域名,域名支持通配符 如: *.com
  • rw:read-write,可读写;
  • ro:read-only,只读;
  • sync:文件同时写入硬盘和内存;
  • async:文件暂存于内存,而不是直接写入内存;
  • no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
  • root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
  • all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
  • anonuid:匿名用户的UID值
  • anongid:匿名用户的GID值。备注:其中anonuid=1000,anongid=1000,为此目录用户web的ID号,达到连接NFS用户权限一致。
  • defaults 使用默认的选项。默认选项为rw、suid、dev、exec、auto nouser与async。
  • atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。
  • noatime 每次存取时不更新inode的存取时间。
  • dev 可读文件系统上的字符或块设备,取消选项为nodev。
  • nodev 不读文件系统上的字符或块设备。
  • exec 可执行二进制文件,取消选项为noexec。
  • noexec 无法执行二进制文件。
  • auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。
  • noauto 无法使用auto加载。
  • suid 启动set-user-identifier设置用户ID与set-group-identifer设置组ID设置位,取消选项为nosuid。
  • nosuid 关闭set-user-identifier设置用户ID与set-group-identifer设置组ID设置位。
  • user 普通用户可以执行加载操作。
  • nouser 普通用户无法执行加载操作,默认设置。
  • remount 重新加载设备。通常用于改变设备的设置状态。
  • rsize 读取数据缓冲大小,默认设置1024。–影响性能
  • wsize 写入数据缓冲大小,默认设置1024。
  • fg 以前台形式执行挂载操作,默认设置。在挂载失败时会影响正常操作响应。
  • bg 以后台形式执行挂载操作。
  • hard 硬式挂载,默认设置。如果与服务器通讯失败,让试图访问它的操作被阻塞,直到服务器恢复为止。
  • soft 软式挂载。服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程挂在无关紧要的安装操作上来说非常有用。
  • retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数。
  • nointr 不允许用户中断,默认设置。
  • intr 允许用户中断被阻塞的操作并且让它们返回一条出错消息。
  • timeo=n 设置请求的超时时间以十分之一秒为单位。
  • tcp 传输默认使用udp,可能出现不稳定,使用proto=tcp更改传输协议。客户端参考mountproto=netid

(以上内容:参考:man nfs)

三、启动nfs

systemctl enable rpcbind
systemctl start rpcbind
systemctl enable nfs-server
systemctl start nfs-server

确认NFS服务器启动成功:

rpcinfo -p
查看具体目录挂载权限
cat /var/lib/nfs/etab

四、客户端挂载:

1、linux客户端挂载:

在从机上安装NFS 客户端

首先是安裝nfs,然后启动rpcbind服务

systemctl enable rpcbind.service

systemctl start rpcbind.service

注意:客户端不需要启动nfs服务

检查 NFS 服务器端是否有目录共享:

showmount -e nfs服务器的IP
showmount -e 192.168.0.63     

客户端挂载#开机自动挂载

vim /etc/fstab  
192.168.0.63:/home/data    /home/data     nfs4 rw,hard,intr,proto=tcp,port=2049,noauto    0  0
手工挂载:
mount -t nfs 192.168.0.63:/home/data /home/data
#查看是否挂载成功。
df -h 
NFS默认是用UDP协议,换成TCP协议达到稳定传输目的:
mount -t nfs 192.168.0.63:/home/data /home/data -o proto=tcp -o nolock

2、windows客户端挂载:

  • Win7自带的NFS客户端可以在“控制面板”->“程序”->“WIndows 功能”找到->nfs-安装。

  • 由于自带的客户端功能少,缺少用户名映射,功能,所以必然会遇到权限的问题。所以需要自行配置权限问题

获取nfs server 用户web的gid和uid,并记录uid和gid,当前为:1000

打开注册表编辑器,找到HKEY_LOCAL_MACHINESOFTWAREMicrosoftClientForNFSCurrentVersionDefault,添加两个REG_DWORD值,填上uid和gid(10进制)完成后重启电脑

注册表导出是如下格式 :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftClientForNFSCurrentVersionDefault]
"AnonymousGid"=dword:000003e8
"AnonymousUid"=dword:000003e8
  • 挂载到Z盘
mount -o anon mtype=soft lang=ansi  \192.168.0.63homedata  Z:

事项:一定要用软装载模式(mtype=soft),防止资源管理器停止响应,不能用utf-8

参考:http://nfs.sourceforge.net/nfs-howto/index.html

Nginx负载均衡NFS配置

Nginx配置

首先在两台服务器上部署同一个项目,例如下:
测试网站节点1: http://192.168.168.61/nfstest/
测试网站节点2: http://192.168.64.145/nfstest/

在主站进行nginx配置

upstream nfstest {
    server 192.168.64.145:9575 weight=5;
    server 192.168.168.61:80 weight=5; 
    fair;                           
}

现在负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。

upstream还有其它的分配策略,分别如下:

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。

upstream linuxidc{ 
      server 10.0.0.77 weight=5; 
      server 10.0.0.88 weight=10; 
}

ip_hash(访问ip)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream favresin{ 
      ip_hash; 
      server 10.0.0.10:8080; 
      server 10.0.0.11:8080; 
}

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

 upstream favresin{      
      server 10.0.0.10:8080; 
      server 10.0.0.11:8080; 
      fair; 
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

 upstream resinserver{ 
      server 10.0.0.10:7777; 
      server 10.0.0.11:8888; 
      hash $request_uri; 
      hash_method crc32; 
}

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

  • down 表示单前的server暂时不参与负载.
  • weight 默认为1.weight越大,负载的权重就越大。
  • max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
  • fail_timeout : max_fails次失败后,暂停的时间。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
upstream bakend{ #定义负载均衡设备的Ip及设备状态 
      ip_hash; 
      server 10.0.0.11:9090 down; 
      server 10.0.0.11:8080 weight=2; 
      server 10.0.0.11:6060; 
      server 10.0.0.11:7070 backup; 
}

NFS配置

环境:
两台服务器之间能正常通信
192.168.64.145 A服务器(文件实际保存)
192.168.168.61 B服务器

一、A服务器配置

1、安装NFS

使用rpm -qa | grep nfs 与 rpm -qa | grep rpcbind 可以查看是否有安装。
在CentOS内可以使用『yum install nfs-utils 』来安装。

2、设置服务机上的共享目录

  [root@www ~]# vi /etc/exports 
  /chroot/www/nfstest/WebContent/source 192.168.168.61(rw)
  #为192.168.168.61读写操作source目录权限
  /chroot/www/nfstest/WebContent/source *(rw,no_root_squash) 
  #任何人都可以应用source目录

3、启动NFS

设定文档后,开始启动, NFS启动之前需要先启动rpcbind才行。

  #如果rpcbind本来就已经在执行了,那就不需要启动啊!
  [root@www ~]# /etc/init.d/rpcbind start 
  #启动nfs
  [root@www ~]# /etc/init.d/nfs start 
  #启动nfslock
  [root@www ~]# /etc/init.d/nfslock start 
  [root@www ~]# chkconfig rpcbind on 
  [root@www ~]# chkconfig nfs on 
  [root@www ~]# chkconfig nfslock on

4、NFS 的连线观察

[root@www ~]# showmount [-ae] [hostname|IP]
选项与参数:

-a :显示目前主机与用户端的NFS 连线分享的状态;
-e :显示某部主机的/etc/exports 所分享的目录资料。

显示出刚刚所设定好的相关exports分享目录资讯

  [root@iZuf6ixy03u72vzno4jsiuZ ~]# showmount -e localhost
  Export list for localhost:
  /chroot/www/nfstest/source (everyone)
  /tmp                       (everyone)

二、B服务器配置

1.启动必备的服务
若没有启动才启动,有启动则保持原样不动

[root@clientlinux ~]# /etc/init.d/rpcbind start 
[root@clientlinux ~]# /etc/init.d/nfslock start 

2.查询A服务器提供哪些资源供使用

[root@jstu565zbb65jg ~]# showmount -e 192.168.64.145
Export list for 192.168.64.145:
/chroot/www/nfstest/source (everyone)&lt;==这是等一下要挂载的目录
/tmp
                       (everyone)

3.建立挂载点

[root@clientlinux ~]# mkdir -p /chroot/www/nfstest/source 
[root@clientlinux ~]# mount -t nfs 192.168.64.145:/chroot/www/nfstest/source  /chroot/www/nfstest/source

4.卸载挂载点

[root@clientlinux ~]# umount /chroot/www/nfstest/source

推荐文档:
http://linux.vbird.org/linux_server/0330nfs.php#nfsserver_need

Linux NFS共享文件系统安装配置

一、NFS服务简介

NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

二、系统环境

系统平台:CentOS release 6.6
NFS Server IP:192.168.11.100

NFS Client IP:192.168.11.110
防火墙已关闭/iptables
SELINUX=disabled

三、安装NFS服务

NFS的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的。
nfs-utils-* :包括基本的NFS命令与监控程序
rpcbind-* :支持安全NFS RPC服务的连接

1、查看系统是否已安装NFS

未分类

2、如果没有安装NFS软件包,则可以手动安装

# yum -y install nfs-utils rpcbind

3、安装完成后启动服务。

 注:启动时要先启动rpcbind在启动nfs

未分类

4、停止服务时也要先停止nfs在停止rpcbind

四、NFS配置文件

NFS的常用目录

  • /etc/exports NFS服务的主要配置文件

  • /usr/sbin/exportfs NFS服务的管理命令

  • /usr/sbin/showmount 客户端的查看命令

  • /var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值

  • /var/lib/nfs/xtab 记录曾经登录过的客户端信息

4.1、NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
/etc/exports文件内容格式:

[客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

例:

vim /etc/exports

/home/data 192.168.11.0/24(rw,sync,no_root_squash)

4.2、常用配置项说明

访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw

用户映射选项

  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);

  • no_all_squash:与all_squash取反(默认设置);

  • root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);

  • no_root_squash:与rootsquash取反;

  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);

  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);

其它选项

  • secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);

  • insecure:允许客户端从大于1024的tcp/ip端口连接服务器;

  • sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;

  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘;

  • wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);

  • no_wdelay:若有写操作则立即执行,应与sync配合使用;

  • subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);

  • no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

五、重启服务

 修改过配置文件后需要重启相关服务
#service rpcbind resatrt
#service nfs restart

六、客户端配置

6.1、客户端可通过showmount -e IP来查看NFS共享状态

未分类

6.2、客户端通过mount挂载

未分类

6.3、客户端取消挂载

umount /home/data
注:如遇到umount.nfs: /home/data: device is busy可使用-l参数来取消挂载
umount -l /home/data

6.4、挂载完成后,客户端和服务端做的修改都会及时同步

七、配置自动挂载nfs文件系统

 vim /etc/fstab

未分类

保存重启

八、有关权限的介绍

  1. 客户端连接时候,对普通用户的检查

    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;

    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;

    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;

  2. 客户端连接的时候,对root的检查

    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;

    b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;

    c. 如果没有明确指定,此时root用户被压缩为nfsnobody;

    d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;

九、相关命令

1、exportfs
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

  • exportfs [-aruv]

  • -a 全部挂载或卸载 /etc/exports中的内容

  • -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab

  • -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)

  • -v 在export的时候,将详细的信息输出到屏幕上。

具体例子:

  • exportfs -au 卸载所有共享目录

  • exportfs -rv 重新共享所有目录并输出详细信息

2、nfsstat
查看NFS的运行状态,对于调整NFS的运行有很大帮助。

3、rpcinfo
查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。

4、showmount

  • -a 显示已经于客户端连接上的目录信息

  • -e IP或者hostname 显示此IP地址分享出来的目录

5、netstat

  • 可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。

  • 最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。

  • NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)