mount命令的知识及参数-o(noatime,nodirtime,noexec,nosuid,rsize.wsize)等
常用命令showmount,exportfs,umount(-lf),rpcinfo。
NFS的优点、缺点、适合的应用场景、替代产品(Moosefs(mfs),glusterfs,FastDFS)。
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设备可以被网络上其它机器使用,这可能可以减少网络上移动设备的数量。
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,一般是把网站用户上传的文件都放到NFS共享里,例如:BBS产品的图片、附件、头像,注意网站的BBS程序不要放在NFS共享中,然后前端所有节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站公司应用频率更高。大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统Moosefs(mfs),glusters,FastDFS等。
如下图所示,当访问程序通过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。
服务器系统 | 角色 | 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 |
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地址配置过程这里不再描述
[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-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”
[root@nfs-server ~]# yum install nfs-utils rpcbind -y
客户端与服务端都安装,Centos6.4之前客户端可以不用安装nfs-utils。原因:
[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
[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
[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
[root@nfs-server ~]# ls -l /etc/exports
-rw-r–r–. 1 root root 0 Jan 12 2010 /etc/exports
nfs共享目录1 客户端地址段(参数1,参数2……) 客户端地址段(参数1,参数2……)
nfs共享目录2 客户端地址段(参数1,参数2……) 客户端地址段(参数1,参数2……)
[root@nfs-server ~]# man exports #查看帮助
/EXAMPLE #查看例子
例子:192.168.80.100、192.168.80.0/24、192.168.80.*、www.baidu.com、lnmp-01
在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
[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
案例一:共享/deta目录给192.168.80.0/24整个网段的主机可读写
[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
[root@nfs-server ~]# /etc/init.d/nfs reload
[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
/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客户端可以通过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
- ro 该主机对该共享目录有只读权限
- rw 该主机对该共享目录有读写权限
- root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
- no_root_squash 客户机用root访问该共享文件夹时,不映射root用户
- all_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
- anonuid 将客户机上的用户映射成指定的本地用户ID的用户
- anongid 将客户机上的用户映射成属于指定的本地用户组ID
- sync 资料同步写入到内存与硬盘中
- async 资料会先暂存于内存中,而非直接写入硬盘
- insecure 允许从这台机器过来的非授权访问
- timeo 如果超时,客户端等待的时间,以十分之一秒计算
- retrans 超时尝试的次数
- bg 后台挂载(很有用)
- fg 前台挂载(默认)
- hard 如果server端没有响应,那么客户端一直尝试挂载(默认)
- soft如果server端没有响应,那么客户端一直尝试挂载到timeout后显示错误并停止尝试
- intr 当使用hard挂载时,若有指定intr参数,可以在timeout后显示错误并停止尝试,避免出问题时整个系统被NFS锁死(默认无)
- rsize 读块大小,如果内存足够大,可以设置大一点
- wsize 写块大小,如果内存足够大,可以设置大一点
- 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 自动检测文件系统
挂载NFS目录时可以使用hard或soft参数指定client如何处理server的异常(server崩溃或网络连接异常);它们的区别是:
- soft:如果一个请求失败,client会将错误返回给发起请求的进程;
- hard:如果一个请求失败,client会在后台无限重试,直到server从异常恢复;发起请求的进程会被阻塞;默认会采用这个做法;
注:soft挂载可能导致隐性的数据损坏,因而应该在客户端响应性比数据完整性更重要的前提下使用该参数;通过增大retrans参数增加重试次数可以削减soft参数带来的风险;
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只有偶尔出现,偶尔会一直阻塞
- 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挂载目录
- 安全挂载参数
[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 #使配置生效
- 硬件: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
说明:真正企业生产环境的存储服务器都属于内网环境,都无需防火墙,因此,此处可以不设置防护墙
方法一:仅允许内部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
- NFS的优缺点
- NFS的优点:
- 简单–>容易上手,容易掌握,数据是在文件系统之上
- 方便–>部署快速,维护简单
- 可靠–>从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
- 稳定
- NFS的局限:
- 局限性是存在单点故障,如果nfs server宕机了所有客户端都不能访问共享目录。
- 在高并发的场合,NFS效率性能有限(一般几千万以下的PV的网站不是瓶颈,除非网站架构太差,2千万PV/日)。
- 客户端认证时基于ip和主机名,安全性一般,权限时根据ID识别,安全性一般
- NFS数据是明文的,对数据完整性不做验证。
- 多台机器挂载NFS服务器时,连接管理维护麻烦,尤其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地址、主机名或节点名组合;
第二,服务器因为过载而暂时停止服务。
现象:
NFS server server2 not responding, still trying
原因:
第一,网络不通,用ping命令检测一下。
第二,服务器关机。
现象:
启动客户机后停住了,不断显示如下提示信息:
Setting default interface for multicast: add net 224.0.0.0: gateway:
client_node_name.
原因:
在etc/vfstab的mount选项中使用了fg而又无法成功mount服务器上的资源,改成bg或将该行注释掉,直到服务器可用为止。
现象:
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启动。
现象:
nfs mount: dbserver: RPC: Program not registered
nfs mount: retrying: /mntpoint
原因:
第一,当前级别不是级别3。
第二,mountd守护进程没有启动,用/etc/init.d/nfs脚本启动NFS守护进程。
第三,看/etc/dfs/dfstab中的条目是否正常。
现象:
stale NFS file handle
原因:
服务器上的共享资源移动位置了,在客户端使用umount和mount重新挂接就可以了。
现象:
nfs mount: sserver1:: RPC: Unknown host
原因:
hosts文件中的内容不正确。
现象:
mount: mount-point /DS9 does not exist.
原因:
该挂接点在客户机上不存在,注意检查命令行或/etc/vfstab文件中相关条目的拼写。
现象:
No such file or directory.
原因:
该挂接点在服务器上不存在,注意检查命令行或/etc/vfstab文件中相关条目的拼写。
错误现象:
# 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的设定。
现象:
# 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
现象:
nfs mount: 10.10.2.3: : RPC: Program not registered
nfs mount: retrying: /data/data/resinfo2
原因:
没有启动NFS共享端服务。
解决:需要重新启动share端的NFS服务,
现象:
# 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
- 用安装光盘或者硬盘安装的方式进入安装界面,在shell 中输入 Linux rescue
- 然后根据提示选择语言和键盘格式
- .选择是否配置网卡一般系统到了要rescue了,网络也就不需要了,所以可以选择否跳过网卡配置,当然你如果需要也可以选择是,具体设置过程和安装时一样。
- 选择是否然让系统查找硬盘上的RHEL系统,选择继续。
- 硬盘上的系统已经被找到并挂载在/mnt/sysimage 下
- 按提示chroot /mnt/sysimage
- chroot 之后你就可以已经在你的要被拯救的系统下了。
grub挂了的,grub-install /dev/hdxx
配置文件改错的,vi /etc/fstab vi /etc/inittab ……
完成修复工作后,exit命令退出chroot,exit退出rescue shell 系统重启。
解决办法
- 重启看是否可以修复(很多机器可以)
- 使用用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
如果我们在启动了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 <== 全部都卸载了.
http://www.tldp.org/HOWTO/NFS-HOWTO/index.html