NFS服务介绍与配置

 

NFS服务介绍与配置

  1. 章节重点

NFS服务的访问原理流程(会口述)。

NFS作为集群共享角色的搭建、部署。

NFS作为集群共享角色的排障,高级优化(会口述)。

mount命令的知识及参数-o(noatime,nodirtime,noexec,nosuid,rsize.wsize)等

fstab文件的知识。

常用命令showmount,exportfs,umount(-lf),rpcinfo。

NFS的优点、缺点、适合的应用场景、替代产品(Moosefs(mfs),glusterfs,FastDFS)。

了解autofs

  1. NFS简介

NFS就是Network File System的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目录,访问该目录就像访问本地目录一样,所以也可以简单的将它看作一个文件服务器(FileServer)。注意:一般而言,使用NFS服务能够方便地使各unix-like系统之间实现共享,但如果需要在unix-like和windows系统之间共享,那就得使用samba了。

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是负责负责信息的传输

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

  • 本地工作站可以使用更少的磁盘空间,因为常用数据可以被保存在一台机器上,并让网络上的其他机器可以访问它。
  • 不需要为用户在每台网络机器上放一个用户目录,因为用户目录可以在NFS服务器上设置并使其在整个网络上可用。
  • 存储设备如软盘、光驱及USB设备可以被网络上其它机器使用,这可能可以减少网络上移动设备的数量。
  1. NFS在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,一般是把网站用户上传的文件都放到NFS共享里,例如:BBS产品的图片、附件、头像,注意网站的BBS程序不要放在NFS共享中,然后前端所有节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站公司应用频率更高。大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统Moosefs(mfs),glusters,FastDFS等。

  1. NFS的工作原理:

如下图所示,当访问程序通过NFS客户端向NFS服务端存取文件时,其请求过程大致如下几点:

 

  • 首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap或rpcbind服务)通过网络向NFS服务器端的RPC服务(即portmap或rpcbind)的111端口发出文件存取功能的询问请求。
  • NFS服务端的RPC服务(即portmap或rpcbind服务)找到对应的已注册的daemon端口后,通知NFS客户端的RPC服务(即portmap或rpcbind服务)。
  • 此时NFS客户端就可获得正确的端口,然后直接与NFS daemon联机了
  • NFS客户端把数据存取成功后,返还给前端访问程序,告知给用户存取结果,网站用户,我们就完成了一次存取操作。

由于NFS的各项功能都需要向RPC服务(即portmap或rpcbind服务)注册,所以RPC服务(即portmap或rpcbind服务)才能得到NFS服务的各项功能对应的端口号、PID、NFS在主机所监听的IP等,而NFS客户端才能够通过向RPC服务(即portmap或rpcbind服务)询问从而找到正确的端口。当要使用NFS时,需要首先启动RPC服务(即portmap或rpcbind服务)。再次强调:NFS的RPC服务,在Centos5.x下名称为portmap,在Centos6.x下为rpcbind。

  1. nfs与rpcbind安装之前准备工作
  • NFS服务部署服务器准备
服务器系统 角色 IP
CentOS-6.6-x86_64 NFS服务器端(nfs-server) 192.168.80.100
CentOS-6.6-x86_64 NFS客户端1(nfs-client1) 192.168.80.101
  • CentOS-6.6-x86_64模拟环境信息

NFS服务器端及客户端操作系统及内核版本信息

[root@liwenbin ~]# cat /etc/redhat-release

CentOS release 6.7 (Final)

[root@liwenbin ~]# uname -r

2.6.32-573.8.1.el6.x86_64

[root@liwenbin ~]# uname -m

x86_64

  • 修改IP地址及主机名

ip地址配置过程这里不再描述

[root@liwenbin ~]#hostname nfs-server

[root@liwenbin ~]#vi /etc/sysconfig/network

HOSTNAME=nfs-server

[root@liwenbin ~]#vi /etc/hosts

127.0.0.1   nfs-server

  • NFS软件列表:

nfs-utils:NFS服务主程序,包括rpc.nfsd、rpc.mountd两个daemons和相关文档说明及执行命令文件等

rpcbind:Centos6.x下RPC的主程序

[root@nfs-server ~]# rpm -aq nfs-utils rpcbind  或者

[root@nfs-server ~]# rpm -aq|egrep “nfs-utils|rpcbind”

  1. nfs服务器部署
  • yum安装

[root@nfs-server ~]# yum install nfs-utils rpcbind -y

客户端与服务端都安装,Centos6.4之前客户端可以不用安装nfs-utils。原因:

  • 在4之后由于有依赖关系可能会出现问题
  • 客户端某些命令依赖nfs-utils,例如showmount
  • 启动nfs相关服务

启动rpcbind服务

[root@nfs-server ~]# /etc/init.d/rpcbind status

rpcbind 已停

[root@nfs-server ~]# LANG=en

[root@nfs-server ~]# /etc/init.d/rpcbind start

Starting rpcbind: [  OK  ]

[root@nfs-server ~]# lsof -i :111           #查看端口对应服务或netstat –lntup|grep 111

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1946  rpc    6u  IPv4  16201      0t0  UDP *:sunrpc

rpcbind 1946  rpc    8u  IPv4  16204      0t0  TCP *:sunrpc (LISTEN)

rpcbind 1946  rpc    9u  IPv6  16206      0t0  UDP *:sunrpc

rpcbind 1946  rpc   11u  IPv6  16209      0t0  TCP *:sunrpc (LISTEN)

[root@nfs-server ~]# chkconfig –list rpcbind

rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off

启动nfs服务

[root@nfs-server ~]# /etc/init.d/nfs status

rpc.svcgssd 已停

rpc.mountd is stopped

nfsd is stopped

rpc.rquotad is stopped

[root@nfs-server ~]# /etc/init.d/nfs start

Starting NFS services:  [  OK  ]

Starting NFS quotas: [  OK  ]

Starting NFS mountd: [  OK  ]

Starting NFS daemon: [  OK  ]

正在启动 RPC idmapd:[确定]

[root@nfs-server ~]# netstat -lntup|grep 2049             #nfs主端口

tcp        0      0 0.0.0.0:2049                0.0.0.0:*              LISTEN      –

tcp        0      0 :::2049                     :::*                  LISTEN      –

udp        0      0 0.0.0.0:2049                0.0.0.0:*                         –

udp        0      0 :::2049                     :::*

[root@nfs-server ~]# rpcinfo -p localhost     查看向rpcbind注册的端口。其中nfs为2049

[root@nfs-server ~]# chkconfig –list nfs

nfs             0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@nfs-server ~]# chkconfig nfs on

查看启动顺序得知rpcbind比nfs启动早

[root@nfs-server ~]# cat /etc/init.d/rpcbind|grep chkconfig

# chkconfig: 2345 13 87

[root@nfs-server ~]# cat /etc/init.d/nfs|grep chkconfig

# chkconfig: – 30 60

注:由于在企业中某些软件编译安装,一般将其服务启动命令至于/etc/rc.local中,为了统一管理,因此不使用chkconfig管理服务,而将所有服务启动命令至于/etc/rc.local中,也是为了方便查看服务器所装的服务

[root@nfs-server ~]# echo -e “/etc/init.d/rpcbind start\n/etc/init.d/nfs start” >>/etc/rc.local

[root@nfs-server ~]# tail -n 2 /etc/rc.local

/etc/init.d/rpcbind start

/etc/init.d/nfs start

  • nfs服务常见进程说明

[root@nfs-server ~]# ps -ef|egrep “rpc|nfs”

rpc     1946    1  0 14:25 ?      00:00:00 rpcbind

root    2032    2  0 14:36 ?      00:00:00 [rpciod/0]

root    2041    1  0 14:36 ?      00:00:00 rpc.rquotad               #磁盘配额进程

root    2046    1  0 14:36 ?      00:00:00 rpc.mountd             #权限管理验证等

root    2053    2  0 14:36 ?      00:00:00 [nfsd4]

root    2054    2  0 14:36 ?      00:00:00 [nfsd4_callbacks]

root    2055    2  0 14:36 ?      00:00:00 [nfsd]   #nfs主进程,管理登入,ID身份判别等

root    2056    2  0 14:36 ?      00:00:00 [nfsd]

root    2057    2  0 14:36 ?      00:00:00 [nfsd]

root    2058    2  0 14:36 ?      00:00:00 [nfsd]

root    2059    2  0 14:36 ?      00:00:00 [nfsd]

root    2060    2  0 14:36 ?      00:00:00 [nfsd]

root    2061    2  0 14:36 ?      00:00:00 [nfsd]

root    2062    2  0 14:36 ?      00:00:00 [nfsd]

root    2093    1  0 14:36 ?      00:00:00 rpc.idmapd       #名称映射进程

root    2150 1896  0 15:19 pts/1  00:00:00 egrep rpc|nfs

  • 查看进程功能方式

[root@nfs-server ~]# man rpc.idmapd

RPC.IDMAPD(8)             BSD System Manager’s Manual            RPC.IDMAPD(8)

 

NAME

rpc.idmapd – NFSv4 ID <-> Name Mapper

  • 实战配置nfs服务端
  1. nfs服务端配置文件,默认为空

[root@nfs-server ~]# ls -l /etc/exports

-rw-r–r–. 1 root root 0 Jan 12  2010 /etc/exports

  1. /etc/exports配置文件格式

nfs共享目录1   客户端地址段(参数1,参数2……) 客户端地址段(参数1,参数2……)

nfs共享目录2   客户端地址段(参数1,参数2……) 客户端地址段(参数1,参数2……)

[root@nfs-server ~]# man exports      #查看帮助

/EXAMPLE         #查看例子

  1. 客户端地址段

例子:192.168.80.100、192.168.80.0/24、192.168.80.*、www.baidu.com、lnmp-01

  1. NFS共享的常用配置参数:

在NFS服务端可以通过cat /var/lib/nfs/etab查看NFS服务端配置参数细节

  • ro 只读访问
  • rw读写访问
  • sync所有数据在请求时写入共享
  • async NFS在写入数据前可以相应请求
  • secure NFS通过1024以下的安全TCP/IP端口发送
  • insecure NFS通过1024以上的端口发送
  • wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
  • no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置
  • hide 在NFS共享目录中不共享其子目录
  • no_hide 共享NFS目录的子目录
  • subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
  • no_subtree_check 和上面相对,不检查父目录权限
  • all_squash共享文件的UID和GID映射匿名用户anonymous,适合公用目录
  • no_all_squash 保留共享文件的UID和GID(默认)
  • root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
  • no_root_squash root用户具有根目录的完全管理访问权限
  • anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
  • anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
  1. 重启nfs服务

[root@nfs-server ~]# /etc/init.d/nfs reload平滑重启。等价于

[root@nfs-server ~]# exportfs -r

原因:

[root@nfs-server ~]# grep “reload” -A 1 /etc/init.d/nfs

reload | force-reload)

/usr/sbin/exportfs -r

echo $”reload”; exit 0

fi

echo $”Usage: nfs {start|stop|status|restart|reload|force-reload|condrestart|try-restart|condstop}”

RETVAL=2

  • nfs企业实战案例

案例一:共享/deta目录给192.168.80.0/24整个网段的主机可读写

  1. 服务器段操作

编辑exports文件

[root@nfs-server ~]# vi /etc/exports

/data  192.168.80.0/24(rw,sync,all_squash)

创建共享目录

[root@nfs-server ~]# mkdir /data

查看客户端拥有的权限

[root@nfs-server ~]# cat /var/lib/nfs/etab

/data   192.168.80.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

查看默认用户

[root@nfs-server ~]# grep 65534 /etc/passwd      #确保存在这个用户

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

授权目录属主

[root@nfs-server ~]# chown -R nfsnobody /data

[root@nfs-server ~]# ls -ld /data

drwxr-xr-x. 3 nfsnobody root 4096 Dec  5 10:04 /data

重启nfs服务

[root@nfs-server ~]# /etc/init.d/nfs reload

  1. 客户端操作

[root@lnmp-01 ~]# /etc/init.d/rpcbind start

[root@lnmp-01 ~]# echo “/etc/init.d/rpcbind start” >>/etc/rc.local

[root@lnmp-01 ~]# tail -n 1 /etc/rc.local

/etc/init.d/rpcbind start

[root@lnmp-01 ~]# showmount -e 192.168.80.100

clnt_create: RPC: Port mapper failure – Unable to receive: errno 113 (No route to host)

[root@lnmp-01 ~]# /etc/init.d/iptables stop

[root@lnmp-01 ~]# showmount -e 192.168.80.100

Export list for 192.168.80.100:

/data 192.168.80.0/24

[root@lnmp-01 ~]# mount -t nfs 192.168.80.100:data /mnt/data

[root@lnmp-01 ~]# df -h

Filesystem           Size  Used Avail Use% Mounted on

/dev/sda3             48G  1.8G   44G   4% /

tmpfs                491M     0  491M   0% /dev/shm

/dev/sda1            190M   61M  120M  34% /boot

192.168.80.100:data   48G  1.7G   44G   4% /mnt/data

查看客户端挂载参数(默认)

[root@lnmp-01 ~]# cat /proc/mount

设置开机自动挂载

[root@lnmp-01 ~]# echo “mount -t nfs 192.168.80.100:data /mnt/data” >>/etc/rc.local

注意:在Centos5中,由于/etc/fstab文件在网络启动前加载,所以不能将其配置在/etc/fstab文件中,在Centos6中由于有某个进程,先挂载本地文件系统,然后启动网络,再挂载网络文件系统,所以可以在/etc/fstab文件中挂载

192.168.80.101:/data    /datadir           nfs       nosuid,noexec,nodev,rw  0 0

  1. 快速操作过程(从安装到部署案例一)

服务端:

/etc/init.d/iptables stop

sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

setenforce 0

yum install nfs-utils rpcbind -y

/etc/init.d/rpcbind start

rpcinfo -p localhost

/etc/init.d/nfs start

rpcinfo -p localhost

chkconfig rpcbind on

chkconfig nfs on

echo -e “/etc/init.d/rpcbind start\n/etc/init.d/nfs start” >>/etc/rc.local

echo “/data  192.168.80.0/24(rw,sync,all_squash)” >>/etc/exports

/etc/init.d/nfs reload

mkdir /data

chown -R nfsnobody.nfsnobody /data

showmount -e 192.168.80.106

客户端操作

/etc/init.d/iptables stop

sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

setenforce 0

yum install nfs-utils rpcbind -y

/etc/init.d/rpcbind start

echo “/etc/init.d/rpcbind start” >>/etc/rc.local

mkdir -p /data

echo “/bin/mount -t nfs 192.168.80.106:data /mnt/data” >>/etc/rc.local

mount -t nfs 192.168.80.106:data /data

  • NFS挂载参数
  1. cat /proc/mounts

在NFS客户端可以通过cat /proc/mounts查看客户端挂载参数细节。如果追求极致,可用如下参数man nfs查看

[root@liwenbin ~]# grep data /proc/mounts

192.168.80.100:/data/ /mnt/data nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.101,minorversion=0,local_lock=none,addr=192.168.80.100 0 0

  1. nfs服务器的配置参数
  • ro 该主机对该共享目录有只读权限
  • rw 该主机对该共享目录有读写权限
  • root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
  • no_root_squash 客户机用root访问该共享文件夹时,不映射root用户
  • all_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
  • anonuid 将客户机上的用户映射成指定的本地用户ID的用户
  • anongid 将客户机上的用户映射成属于指定的本地用户组ID
  • sync 资料同步写入到内存与硬盘中
  • async 资料会先暂存于内存中,而非直接写入硬盘
  • insecure 允许从这台机器过来的非授权访问
  1. NFS客户端常见挂载参数:
  • timeo 如果超时,客户端等待的时间,以十分之一秒计算
  • retrans 超时尝试的次数
  • bg 后台挂载(很有用)
  • fg 前台挂载(默认)
  • hard 如果server端没有响应,那么客户端一直尝试挂载(默认)
  • soft如果server端没有响应,那么客户端一直尝试挂载到timeout后显示错误并停止尝试
  • intr 当使用hard挂载时,若有指定intr参数,可以在timeout后显示错误并停止尝试,避免出问题时整个系统被NFS锁死(默认无)
  • rsize 读块大小,如果内存足够大,可以设置大一点
  • wsize 写块大小,如果内存足够大,可以设置大一点
  1. mount命令常见挂载选项
  • async 涉及文件系统I/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但会降低数据安全。一般情况,生产环境下不推荐使用。除非对性能要求很高,对数据可靠性不要求的场合。
  • sync:该参数与async相反。有I/O操作时,都会同步处理I/O,即把数据同步写入磁盘。此参数会牺牲一点I/O性能,但是,换来的是掉电后数据的安全性。
  • atime 在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项,在高并发的情况下,建议通过明确加上notime,来取消这个默认项,以到达提升I/O性能,优化I/O的目的。
  • noatime:访问文件时不更新文件的inode时间戳,高并发环境下,推荐显式应用该选项,可以提高系统I/O性能。
  • auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。
  • noauto 无法使用-a参数来加载。
  • defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。
  • dev 可读文件系统上的字符或块设备,取消选项为nodev。
  • nodev 不读文件系统上的字符或块设备。
  • exec 允许文件系统执行二进制文件,取消这个参数,可以提升系统安全性。
  • noexec:在挂载的文件系统中不允许直接执行任何二进制的程序,注意,仅对二进制程序有效,及时设置了noexec、shell,php程序还是可以执行的。
  • nosuid 关闭set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位
  • nouser 使一位用户无法执行加载操作,默认设置。
  • remount 重新加载设备。通常用于改变设备的设置状态。
  • ro 以只读模式加载。
  • rw 以可读写模式加载。
  • nosuid:不允许set-user-identifier or set-group-identifier位生效。
  • suid 启动set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位,取消选项为nosuid。
  • user 可以让一般用户加载设备。
  • nouser:禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。
  • vers: nfs版本,默认为4,proto为TCP,如果指定2或3,proto为UDP
  • -r 以只读方式加载设备。
  • -t<文件系统类型> 指定设备的文件系统类型。常用的选项说明有:

minix Linux最早使用的文件系统。

ext2 Linux目前的常用文件系统。

msdos MS-DOS 的 FAT。

vfat Win85/98 的 VFAT。

nfs 网络文件系统。

iso9660 CD-ROM光盘的标准文件系统。

ntfs Windows NT的文件系统。

hpfs OS/2文件系统。Windows NT 3.51之前版本的文件系统。

auto 自动检测文件系统

  1. NFS客户端阻塞睡眠问题与配置
  • Hard mount vs Soft mount

挂载NFS目录时可以使用hard或soft参数指定client如何处理server的异常(server崩溃或网络连接异常);它们的区别是:

  • soft:如果一个请求失败,client会将错误返回给发起请求的进程;
  • hard:如果一个请求失败,client会在后台无限重试,直到server从异常恢复;发起请求的进程会被阻塞;默认会采用这个做法;

注:soft挂载可能导致隐性的数据损坏,因而应该在客户端响应性比数据完整性更重要的前提下使用该参数;通过增大retrans参数增加重试次数可以削减soft参数带来的风险;

  • timeo and  retrans

soft超时失败由timeo和retrans参数决定:

  • timeo=n设定一次尝试超时时间为n秒,默认60秒;
  • retrans=n设定失败后重试n次,默认3次,仅soft时有效;

通过测试(在client挂载时指定参数,然后将server进程关闭,使用ls访问nfs目标),发现:

  • 不指定soft或hard,测试后进程阻塞进入D+状态,必须被kill -9杀死;(尝试重启server机器,结果相同)
  • 指定hard,无论设不设置timeo与retrans,与上面結果相同;
  • 指定soft,不设定timeo和retrans,与上面結果相同,一分钟无响应;
  • 指定soft,设定timeo和retrans比较小的数值,很快返回错误:Input/output error

通过测试bg,soft,nodev,noexec,timeo=20,retrans=2只有偶尔出现,偶尔会一直阻塞

  1. php-fpm复现nfs故障阻塞

挂载目录:/home/www/ekwing/data/

  • nginx配置

server {

listen       80;

server_name  192.168.1.91 www.ekwing.com;

index index.php index.html index.htm ;

access_log /data/log/nginx/access.log access;

root /home/www/ekwing;

location / {

root   /home/www/ekwing;

index  index.html index.htm;

}

location ~ .*\.(php|php5)?$ {

fastcgi_pass 127.0.0.1:9010;

fastcgi_index index.php;

include fcgi.conf;

}

location ~ .*\.(png|jpg)?$ {

root   /home/www/ekwing/data;

}

}

  • php代码

[root@node2 ekwing]# cat /home/www/ekwing/index.php

<!DOCTYPE html>

<html lang=”zh-cn”>

<head>

<meta charset=”UTF-8″>

<title>图片</title>

</head>

<?php

echo “<body><center><font size=10 color=red>”;//输出html相关代码

$page=$_GET[‘page’];//获取当前页数

$i=0;

$max=1;//设置每页显示图片最大张数

$handle = opendir(‘./data/‘); //当前目录

while (false !== ($file = readdir($handle))) { //遍历该php文件所在目录

list($filesname,$kzm)=explode(“.”,$file);//获取扩展名

if($kzm==”gif” or $kzm==”jpg” or $kzm==”JPG”) { //文件过滤

if (!is_dir(‘./’.$file)) { //文件夹过滤

$array[]=$file;//把符合条件的文件名存入数组

$i++;//记录图片总张数

}

}

}

 

$Previous_page=$page-1;

$next_page=$page+1;

$last=$i-1;

if ($Previous_page<0){

echo “最开始页 “;

echo “上一页 “;

echo “<a href=?page=$next_page>下一页 </a>”;

echo “<a href=?page=$last>最后一页</a>”;

}

else if ($page<$i/$max-1){

echo “<a href=?page=0>最开始页 </a>”;

echo “<a href=?page=$Previous_page>上一页 </a>”;

echo “<a href=?page=$next_page>下一页 </a>”;

echo “<a href=?page=$last>最后一页</a>”;

}else{

echo “<a href=?page=0>最开始页 </a>”;

echo ” <a href=?page=$Previous_page>上一页 </a>”;

echo “下一页 “;

echo “最后一个”;

}

for ($j=$max*$page;$j<($max*$page+$max)&&$j<$i;++$j){//循环条件控制显示图片张数

echo “<br><img widht=800 height=600 src=\”$array[$j]\”><br>”;//输出图片数组

}

echo “</center></body></html>”;

?>

  • 解决

步骤1:强制卸载所有挂载目录

步骤2:重启php-fpm

步骤3:解决nfs server问题

步骤4挂载目录

  1. nfs客户端挂载优化
  • 安全挂载参数

[root@lnmp-01 ~]# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.80.100:data /data

  • 性能优化挂载参数
  • 禁止更新目录及文件时间戳

[root@lnmp-01 ~]# mount -t nfs -o noatime,nodiratime 192.168.80.100:data /data

  • 安全加优化的挂载参数

[root@lnmp-01 ~]# mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.80.100:data /data

  • 默认的挂载方式(性能还可以)

mount -t nfs 192.168.80.100:data /data

  • 优化挂载建议参数

[root@lnmp-01 ~]# mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rw,bg,hard,intr,rsize=131072,wsize=131072 192.168.80.100:data /data

注意:非性能的参数越多,速度可能会越慢

NFS客户端性能优化主要设置rsize和wsize两个选项的值,如下:

[root@oldboy ~]#umount /mnt

[root@oldboy ~]#mount -t nfs -o nosuid,noexec,rsize=1024,wsize=1024,rw 192.168.0.114:/backup/NFS /mnt

[root@oldboy ~]#grep mnt /proc/mounts

192.168.0.114:/backup/NFS /mnt nfs4 rw,nosuid,noexec,relatime,vers=4,rsize=1024,wsize=1024,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.131,minorversion=0,local_lock=none,addr=192.168.0.114 0 0

[root@oldboy ~]#time dd if=/dev/zero of=/mnt/testfile bs=9k count=20000 #测试文件系统性能(测试单个文件写入速度,虚拟机中网速是瓶颈)

20000+0 records in

20000+0 records out

184320000 bytes (184 MB) copied, 16.6013 s, 11.1 MB/s

real    0m16.802s

user    0m0.000s

sys     0m2.394s

[root@oldboy ~]#umount -lf /mnt #强制卸载文件系统

  • NFS内核相关的优化
  • 内核优化相关参数说明

/proc/sys/net/core/rmem_default

该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)  默认值:124928

/proc/sys/net/core/rmem_max

该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)  默认值:124928

/proc/sys/net/core/wmem_default

该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)  默认值:124928

/proc/sys/net/core/wmem_max

该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)  默认值:124928

  • 上述文件对应的具体内核优化命令

cat >>/etc/sysctl.conf <<EOF

net.core.rmem_default = 8388608

net.core.rmem_max = 8388608

net.core.wmem_default = 16777216

net.core.wmem_max = 16777216

EOF

sysctl -p                        #使配置生效

  1. 企业生产环境NFS共享优化小结
  • 硬件:sas/ssd磁盘,买多块,raid0/raid10,网卡吞吐量大,至少千兆(多块bond)
  • NFS服务器端优化加all_squash,async

/backup/NFS 192.168.0.0/24(rw,async,all_squash)用这两个选项效率高了,但是就不可靠了。

  • 客户端挂载:

rsize,wsize,noatime,nodiratime四个选项为性能优化选项,nosuid,noexec两个选项为安全优化选项

mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.0.114:/backup/NFS /mnt

mount -t nfs -o nosuid,noexec,noatime,nodiratime,rsize=131072,wsize=131072 192.168.0.114:/backup/NFS /mnt

  • 内核优化:

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

  • 如果卸载时提示:

如果发现有提示“device is busy”,找到是什么进程使得他busy

fuser -m /mnt/data 将会显示使用这个模块的pid

fuser -mk /mnt/data 将会直接kill那个pid

也可以强制卸载umount -lf /data

  • 大型网站NFS网络文件系统替代软件:

分布式文件系统Moosefs(mfs),glusterfs,FastDFS

  1. NFS server端的防火墙控制

说明:真正企业生产环境的存储服务器都属于内网环境,都无需防火墙,因此,此处可以不设置防护墙

方法一:仅允许内部IP段访问(最佳)

iptables -A INPUT -s 192.168.80.0/24 -j ACCEPT

方法二:允许IP段加端口访问

iptables -A INPUT -i eth0 -p udp -s 192.168.80.0/24 –dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p udp -s 192.168.80.0/24 –dport 2049 -j ACCEPT

iptables -A INPUT -i eth0 -p udp -s 192.168.80.0/24 -j ACCEPT

  1. NFS的优缺点
  • NFS的优点:
  • 简单–>容易上手,容易掌握,数据是在文件系统之上
  • 方便–>部署快速,维护简单
  • 可靠–>从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
  • 稳定
  • NFS的局限:
  • 局限性是存在单点故障,如果nfs server宕机了所有客户端都不能访问共享目录。
  • 在高并发的场合,NFS效率性能有限(一般几千万以下的PV的网站不是瓶颈,除非网站架构太差,2千万PV/日)。
  • 客户端认证时基于ip和主机名,安全性一般,权限时根据ID识别,安全性一般
  • NFS数据是明文的,对数据完整性不做验证。
  • 多台机器挂载NFS服务器时,连接管理维护麻烦,尤其NFS服务端出现问题后,所有NFS客户端挂掉状态。
  1. NFS服务常见故障查和解决方案
  • NFS服务常见故障排查:

NFS服务出现了故障,主要从以下几个方面检查原因:

  • 检查NFS客户机和服务器的负荷是否太高,Server和Client之间的网络是否正常;
  • 检查/etc/exports文件的正确性;
  • 必要时重启NFS和rpcbind服务;
  • 重新启动rpcbind和NFS服务
  • 检查Client上的mount命令或/etc/fstab的语法是否正确;
  • NFS常见故障解决方法
  • The rpcbind failure error

故障现象:

nfs mount: server1:: RPC: Rpcbind failure

RPC: Timed Out

nfs mount: retrying: /mntpoint

原因:

第一,可能因为客户机的hosts文件中存在错误的ip地址、主机名或节点名组合;

第二,服务器因为过载而暂时停止服务。

  • The server not responding error

现象:

NFS server server2 not responding, still trying

原因:

第一,网络不通,用ping命令检测一下。

第二,服务器关机。

  • The NFS client fails a reboot error

现象:

启动客户机后停住了,不断显示如下提示信息:

Setting default interface for multicast: add net 224.0.0.0: gateway:

client_node_name.

原因:

在etc/vfstab的mount选项中使用了fg而又无法成功mount服务器上的资源,改成bg或将该行注释掉,直到服务器可用为止。

  • The service not responding error

现象:

nfs mount: dbserver: NFS: Service not responding

nfs mount: retrying: /mntpoint

原因:

第一,当前级别不是级别3,用who -r查看,用init 3切换。

第二,NFS Server守护进程不存在,用ps -ef | grep nfs检查,用/etc/init.d/nfs start启动。

  • The program not registered error

现象:

nfs mount: dbserver: RPC: Program not registered

nfs mount: retrying: /mntpoint

原因:

第一,当前级别不是级别3。

第二,mountd守护进程没有启动,用/etc/init.d/nfs脚本启动NFS守护进程。

第三,看/etc/dfs/dfstab中的条目是否正常。

  • The stale file handle error

现象:

stale NFS file handle

原因:

服务器上的共享资源移动位置了,在客户端使用umount和mount重新挂接就可以了。

  • The unknown host error

现象:

nfs mount: sserver1:: RPC: Unknown host

原因:

hosts文件中的内容不正确。

  • The mount point error

现象:

mount: mount-point /DS9 does not exist.

原因:

该挂接点在客户机上不存在,注意检查命令行或/etc/vfstab文件中相关条目的拼写。

  • The no such file error

现象:

No such file or directory.

原因:

该挂接点在服务器上不存在,注意检查命令行或/etc/vfstab文件中相关条目的拼写。

  • No route to host

错误现象:

# mount 10.10.11.211:/opt/data/xmldb /c2c-web1/data/xmldb -t nfs -o rw

mount: mount to NFS server ’10.10.11.211′ failed: System Error: No route to host.

原因:

防火墙被打开,关闭防火墙。

这个原因很多人都忽视了,如果开启了防火墙(包括iptables和硬件防火墙),NFS默认使用111端口,我们先要检测是否打开了这个端口,还要检查TCP_Wrappers的设定。

  • Not owner

现象:

# mount -F nfs -o rw 10.10.2.3:/mnt/c2c/data/resinfo2 /data/data/resinfo2

nfs mount: mount: /data/data/resinfo2: Not owner

原因:

这是Solaris 10版本挂载较低版本nfs时报的错误。

解决:

需要用-o vers=3参数

示例:

# mount -F nfs -o vers=3 10.10.2.3:/mnt/c2c/data/resinfo2 /data/data/resinfo2

  • RPC: Program not registered & retrying

现象:

nfs mount: 10.10.2.3: : RPC: Program not registered

nfs mount: retrying: /data/data/resinfo2

原因:

没有启动NFS共享端服务。

解决:需要重新启动share端的NFS服务,

  • can’t contact portmapper: RPC: Remote system error – Connection refused

现象:

# exportfs -a

can’t contact portmapper: RPC: Remote system error – Connection refused

原因:

出现这个错误信息是由于server端的portmap没有启动。

解决:

# /etc/init.d/portmap start

 

文件系统只读故障修复案例

1、mount:

用于查看哪个模块输入只读,一般显示为:

/dev/hda1 on / type ext3 (rw)

none on /proc type proc (rw)

usbdevfs on /proc/bus/usb type usbdevfs (rw)

none on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/hda5 on /home type ext3 (rw)

none on /dev/shm type tmpfs (rw)

/dev/hda2 on /usr/local type ext3 (rw)

/dev/nb1 on /EarthView/RAW type ext3 (ro)(变为只读了)

2、如果发现有ro,就重新mount,或者umount以后再remount

3、umount /dev/nb1

如果发现有提示“device is busy”,找到是什么进程使得他busy

fuser -m /mnt/data 将会显示使用这个模块的pid

fuser -mk /mnt/data 将会直接kill那个pid

然后重新mount即可。

也可以强制卸载

umount -lf /data

4、还有一种方法是直接remount,命令为

mount -o rw,remount /mnt/data

  • 企业案例
  1. 企业生产环境fstab修改错误导致系统无法启动故障修复案例
  • 用安装光盘或者硬盘安装的方式进入安装界面,在shell 中输入 Linux rescue
  • 然后根据提示选择语言和键盘格式
  • .选择是否配置网卡一般系统到了要rescue了,网络也就不需要了,所以可以选择否跳过网卡配置,当然你如果需要也可以选择是,具体设置过程和安装时一样。
  • 选择是否然让系统查找硬盘上的RHEL系统,选择继续。
  • 硬盘上的系统已经被找到并挂载在/mnt/sysimage 下
  • 按提示chroot /mnt/sysimage
  • chroot 之后你就可以已经在你的要被拯救的系统下了。

grub挂了的,grub-install /dev/hdxx

配置文件改错的,vi /etc/fstab vi /etc/inittab ……

软件包被毁的 rpm -F xxx.rpm

完成修复工作后,exit命令退出chroot,exit退出rescue shell 系统重启。

  1. 企业生产环境文件系统只读案例

解决办法

  • 重启看是否可以修复(很多机器可以)
  • 使用用fsck – y 来修复文件系统
  • 若,在进行修复的时候有的分区会报错,重新启动系统问题依旧

查看下分区结构

[root@localhost mobile]# more /etc/fstab

[root@localhost ~]# more /proc/mounts

[root@localhost ~]# mount

/dev/sda3 on / type ext3 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/sda1 on /boot type ext3 (ro)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

查看ro挂载的分区,如果发现有ro,就重新mount

umount /dev/sda1

mount /dev/sda1 /boot

如果发现有提示“device is busy”,找到是什么进程使得他busy

fuser -m /boot 将会显示使用这个模块的pid

fuser -mk /boot 将会直接kill那个pid

然后重新mount即可。

  • 直接remount,命令为

[root@localhost ~]# mount -o rw,remount /boot

  1. exportfs应用

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

exportfs [-aruv]

-a :全部 mount或者unmount /etc/exports中的内容

-r :重新mount /etc/exports中分享出来的目录

-u :umount 目录

-v :在 export 的?r候,将详细的信息输出到屏幕上.

具体例子:

[root @test root]# exportfs -rv <== 全部重新 export 一次!

exporting 192.168.0.100:/home/test

exporting 192.168.0.*:/home/public

exporting *.the9.com:/home/linux

exporting *:/home/public

exporting *:/tmp

reexporting 192.168.0.100:/home/test to kernel

exportfs -au <== 全部都卸载了.

  • NFS服务参考文献

http://www.tldp.org/HOWTO/NFS-HOWTO/index.html

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇