一、NFS介绍

NFS : network file system,中文意思网络文件系统,通过网络让不同主机之间共享文件。 NFS客户端,通过挂载的方式,将服务器端磁盘挂载到本地。

二、企业应用场景

作为公共文件系统,作为web的共享存储。 NFS:性能效率不太高,但是可以使用分布式文件系统代替Moosefs(mfs) glusterfs fastDFS

三、工作原理

1.通过服务器安装nfs服务端,共享文件夹 2.客户端挂在服务器端的目录 3.NFS通过网络传输数据 监听的端口,不同的启动端口不一样,依赖rpc 什么是rpc服务:nfs功能很多,不同的端口

NFS工作流程图: 1.先启动RPC服务 2.再启动NFS服务,并向RPC注册 3.客户通过请求RPC服务,得到NFS端口和地址 4.客户端向NFS端口和地址发出请求

四、服务器端配置

shell>yum -y undate 升级所有包,改变软件设置和系统设置,系统版本内核都升级 shell>yum -y upgrade 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变 shell>yum -y install nfs-utils rpcbind #安装NFS服务器端 (1)启动rpcbind服务 shell>/etc/init.d/rpcbind restart #监听端口主端口111 其他端口894 shell>rpcinfo -p localhost #查看nfs的注册 shell>chkconfig rpcbind on (2)启动nfs服务 shell>/etc/init.d/nfsd restart shell>rpcinfo -p localhost #就可以查看注册的端口信息 shell>chkconfig nfs on 检查: shell>ps -ef | grep "rpc|nfs" rpc.statd ==>检查文件一致性 rpc.rquotad ==>磁盘配额进程(remote quota server) rpc.mount ==>权限管理验证等 nfsd ==>NFS主进程,管理登录 rpc.lock shell>man rpc.statd 可以使用man查看

注意: nfs会自动创建一个nfsnobody, chatt -i /etc/password ,就会装不上 shell>cat /etc/rc.d/rc3.d/| grep -E "nfs|rpc" #服务启动顺序 S13rpcbind S30nfs shell>vim /etc/init.d/nfs
shell>chkconfig: - 30 60 #表示启动顺序

(3)配置共享目录 NFS默认的配置文件/etc/exports ,默认是空的 配置格式: NFS共享的目录 NFS客户端的地址(参数1,参数2...)客户端地址2(参数1,参数2...)

配置命令: shell>mkdir /data shell>chown -R nfsnobody.nfsnobody /data shell>vim /etc/exports /data 192.168.200.*/24(rw,sync) shell>/etc/init.d/nfsd reload //平滑加载 相当于 #exportfs -rv
reload让已经到达服务器的请求,继续处理,让新来的请求,拒绝门外。

服务器端测试:最好自己挂在以下测试服务端是否是好的 shell>showmount -e 127.0.0.1或本机IP 查看是否有共享目录 shell>cat /var/lib/nfs/etab #查看配置的参数,默认会加很多参数 shell>cat /proc/mounts 查看是否挂在了 shell>cat /var/lib/nfs/rmtab 客户端访问服务器exports的信息列表

shell>exportfs -o rw,sync x.x.x.x/24:/shared_dir //通过exportfs共享 shell>showmount -e x.x.x.x

五、客户端配置

(1)客户端配置 1.客户端只需要启动PRC服务 shell>yum -y install rpcbind nfs-utils shell>/etc/init.d/rpcbind start shell>chkconfig rpcbind on shell>chkconfig rpcbind --list

(2)客户端挂载 shell>showmount -e 192.168.200.134 shell>mkdir /nfs_dir shell>mount -t nfs 192.168.200.134:/data /nfs_dir //可以放在/etc/rc.local 建议放在rc.local

注意:放在/etc/fstab下会有问题,因为开机的NFS先挂在,再启网络,导致nfs无法挂在。 如果在开机启动服务里设置并启动了netfs服务,放入fstab里也是可以实现开机挂在的。 shell>vim /etc/fstab 配置自动挂载 192.168.200.134:/data /nfs_dir nfs default 0 0

(3) NFS挂载常用参数 参数介绍: rw read-write,表示可读写权限 ro read-only,表示只读权限 sync 请求或写入数据时,数据同步写入到nfs server的硬盘后才返回。 async 异步写入,先写入缓冲区,再异步同步到磁盘,数据不保险 no_root_squash 访问nfsserver共享目录的用户如果是root的话,他对该共享目录具有root权限,这个配置一半用在无盘客户端准备的,用户避免使用
root_squash 如果访问nfs server 共享目录的用户时root,则它的权限将被压缩成匿名用户,同时uid和gid通常会变成nfsnobody账号身份 all_squash 不管访问nfsserver共享目录的身份如何,它的权限都被压缩成为匿名用户,同时它的uidhegid都会变成nfsnobody账号身份 anonuid 匿名uid anongid 匿名gid

shell>cat /proc/mount //查看挂载后的参数 fg 后台挂载 soft 当NFSClient 以soft挂载server时,若网络不稳定,造成客户端与服务器无法传输 但有一个超时时间,超过这个超时时间就会不在重试,超时后可能数据会丢失,一般不建议是使用 hard 挂载模式硬盘时,刚好和soft相反,此时客户端会一直连接服务器,如服务器响应就继续连接 intr 当使用hard挂载的资源超时后,若指定intr参数,超时后会终止掉,不会造成nfs锁住 rsize、wsize 在传输数据的时候,一次读多少数据写多少数据,相当linux的block proto=tcp 默认是使用TCP协议

精细化挂载 #mount -t nfs -o fg,hard,intr,rsize=13172,wsize=131072 192.168.200.134:/data /mnt 一般挂载 #mount -t nfs 192.168.200.134:/data /mnt

all_squash; 将所有用户转换成来宾账号, 适合公用目录 anonuid ,anongid;指定映射的来宾账号 root_squash;将root用户映射为来宾账号 rw ro 读写权限 dev nodev 是否保留文件的特殊功能,一般来说只有/dev才会有特殊配置, exec noexec 是否具有执行文件的权限,如果想要挂载的仅是普通资源数据区(图片、附件)那么可以选择noexec user nouser 是否运行用户进行文件的挂载与协助功能?如果要保护文件系统,最好不要提供用户进行挂载与卸载 auto no auto 这个auto是指mount -a 时会不会被挂载的项目,如果不需要这个分区随时被挂载,可以设为noaut async 异步写入磁盘 sync 同步写入磁盘 atime noatime 每一次数据访问时,会同步更新访问文件的inode时间搓,是默认选项,高并发会影响性能 default (rw,suid,dev,exec,auto,nouser,async)默认情况大部分都是默认值(/etc/fstab) remount 当文件系统变成只读,我们要进入单用户模式/救援模式 mount -o rw,remount #mount -t nfs -o fg,hard,intr,rsize=13172,wsize=131072,nosuid,noexec 192.168.200.134:/data /mnt

在企业里面,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频)不需要执行suid、exec等权限,挂载 的这个文件系统只能作为数据存取用,无法执行远程序,对客户端来讲增强了安全性,例如×××站点篡改,上传文件后执行 #mount -o nfs nosuid,noexec,nodev,rw 192.168.200.x:/data /mnt

六、NFS挂载优化参数

(1)硬件优化 使用磁盘整列,高性能存储 千兆、万兆网卡

(2)客户端优化 1)禁止更新项目及文件时间戳挂载,命令如下 #mount -t nfs noatime,nodiratime x.x.x.x:/data /mnt 2)安全加优化的挂载方法 #mount -o nfs nosuid,noexec,nodev,rw,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.200.x:/data /mnt 3)默认的挂载方式 mount -t nfs x.x.x.x:/data /mnt centos6默认已经比较优化了

(3)服务器 NFS内核优化 #vim /etc/exports /data/ x.x.x.x/24(rw,sync,squash,anonuid=65534,anongid=65534)

对NFS服务的所有服务器内核进行优化(读写缓存) #cat /proc/sys/net/core/rmem_default 指定了接收套接字缓冲区大小的默认值(字节为单位)默认:124928 调整到8388608 #cat /proc/sys/net/core/wmem_default 指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置 124928 调整到8388608 #cat /proc/sys/net/core/rmem_max 该文件指定了接收套接字缓冲区大小的最大值(字节为单位)默认:124928 调整到 16777216 #cat /proc/sys/net/core/wmem_max 该文件指定了接收套接字缓冲区大小的最大值(字节为单位)默认:124928 整到 16777216

#sysctl -p 生效 如果卸载的时候提示“umount:/mnt device is busy” 需要推出当前目录进行卸载,如果NFS server 宕机 可以使用 umount -lf /mnt 强制卸载

大型网站NFS网络文件系统的替代软件为分布式文件系统moosefs (mfs)/glusterfs/FastDFS

(4) nfs应用系统的优缺点 NFS服务可以让不同客户端使用同一个共享目录,保证不同节点客户端数据的一致性。 优点: 1、简单、容易上手,容易掌握 2、NFS文件系统内数据是文件系统之上的,即数据是能看的见的。 3、部署快速、容易维护,可控,满足基本需求 4、可靠,从软件层面上是可靠的,稳定性高

缺点: 1、存在单点故障 2、不适合高并发的情况,系能不太好。(2千万/日一下PV的网站不是瓶颈) 3、客户端认证基于IP和主机名,安全性一般(用于局域网问题不大) 4、NFS数据是明文,NFS本身不对数据完整性验证 5、多台客户机挂载一个NFS服务器时,连接管理麻烦。NFS出现问题,所有的客户端都掉,客户端df -h 都hang掉,无法操作,只能 umount -lf /mnt 强制卸载。

七、常见故障

1.iptables 阻挡 2.selinux没关 3.配置文件错误 4.客户端nfs-untils没装 5.服务器端共享目录没有授权 6.命令敲错 7.启动失败,可能nfs-utils-lib没装(不能创建id) 8.nfs与rpc服务启动顺序不对 9.NFS 卸载不了 #umount -lf /mnt 退出当前目录 10.客户端挂载mount.nfs: Stale file handle 解决方法: shell>umount -f 挂载点 shell>重新挂载

八、防火墙放通NFS服务

NFS依靠五种服务运行,mountd,nfs,nlockmgr,portmapper,rquotad放通防火墙也需要放通该五种端口。 shell>rpcinfo -p 查看监听端口 nfs 端口是已经固定的 2049 portmapper 端口是已经固定的 111 shell>vim /etc/sysconfig/nfs 修改配置文件,设置服务的端口 RQUOTAD_PORT=875 LOCKD_TCPPORT=33993 LOCKD_UDPPORT=33993 MOUNTD_PORT=892

shell>vim /etc/service 添加固定端口 mountd 892/udp mountd 892/tcp nlockmgr 33993/udp nlockmgr 33993/tcp rquotad 875/tcp rquotad 875/udp

shell>/etc/init.d/nfs restart 重启服务生效

shell> vim /etc/sysconfig/iptables 添加五个端口 -A INPUT -s 10.10.32.14/32 -m state --state NEW -p tcp --dport 111 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p tcp --dport 892 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p tcp --dport 2049 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p tcp --dport 875 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p tcp --dport 33993 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p udp --dport 111 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p udp --dport 892 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p udp --dport 2049 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p udp --dport 875 -j ACCEPT -A INPUT -s 10.10.32.14/32 -m state --state NEW -p udp --dport 33993 -j ACCEPT

shell>/etc/init.d/iptables 重启防火墙

九、NFS 针对不同用户进行开放权限

需求:linux系统多个用户有读写共享文件夹的权限,创建的文件自带属性 (1)配置文件修改 shell>vim /etc/exports /backup 10.10.32.14(rw,no_root_squash,async) (2)服务端创建和客户端一样的用户 shell>groupadd -g xx shell>useradd -u xx -g xx -s /sbin/nologin xxx

十、NFS挂载文件系统 出现nobody解决方式

NFS共享文件挂载后,文件所属主、所属组都收nobody, 查看了NFS上面创建响应的账号,通过百度查找到需要进行以下设置。

都说要设置idmapd.conf里面的Domain参数,但是,单纯的修改客户端的idmapd.conf并无法解决这一问题。而当服务端和客户端的Domain这个参数都设为一样之后,再重新挂载,就一切正常了。 具体的修改流程是: vim /etc/idmapd.conf 取消Domain前面的注释,改为你所使用的根域名;保存。

重启idmapd服务: service rpcidmapd restart
或者挂载mount指定版本: mount -t nfs -o vers=3 ip:/home /home 挂载使用v3版本就行