NFS网络文件系统(存储服务),什么是NFS?

NFS是Network File System的缩写,中文意思是网络文件系统,它的主要功能是通过网络(一般是局域网)
让不同的主机系统之间可以共享文件或目录	

什么是文件系统:
知识回顾:
文件系统(装修的风格)--怎么来存放文件的,即存放文件的一种方式
新磁盘要做raid---分区---格式化(文件系统)---挂载使用
centos ext2,3,4
centos 7 xfs
suse reisersfs
分布式文件系统:mfs gfs fastdfs(重点研究的分布式文件系统)

1.3 为什么要NFS服务进行数据存储

a 实现数据信息共享
b 实现数据信息一致

1.4 NFS系统原理介绍

1.4.1 NFS服务工作架构(挂载架构图) a 部署好NFS服务 b web服务器进行挂载nfs共享目录 c 对客户端挂载点目录下的数据进行修改,等价于在服务端共享目录中,对数据的修改

1.4.2 什么叫做rpc服务 rpc服务类似一个中介服务,由于nfs服务启动会产生多个进程和端口(端口号随机产生), 不方便客户端与之建立网络连接 利用rpc服务建立nfs文件共享流程 a 启动rpc服务,创建111端口信息 b 启动nfs服务,向rpc服务注册进程端口号信息 c 客户端访问rpc服务,获取nfs服务信息 d 客户端获取nfs共享目录信息后,进行mount挂载

1.4.3 nfs工作原理图 nfs服务端:做了3件事 nfs客户端:做了3件事

1.5 NFS服务部署过程

1.5.1 确认部署环境 3台服务器:web01 backup nfs01

扩展:实现yum下载数据本地保存
vim /etc/yum.conf     ---修改编写yum配置文件
cachedir=/var/cache/yum/$basearch/$releasever   --- 下载软件保存路径
keepcache=1                                     --- 开启yum下载软件保存功能
[root@nfs01 ~]# yum reinstall telnet -y
[root@nfs01 ~]# cd /var/cache/yum/x86_64/6/
[root@nfs01 6]# tree

1.5.2 nfs服务部署流程

1.5.3 nfs服务端部署 第一个里程碑:确认nfs相关软件是否安装 rpm -qa rpcbind rpm -qa nfs-utils

第二个里程碑:进行nfs相关软件yum安装
yum install -y rpcbind nfs-utils


第三个里程碑:编写nfs配置文件
[root@nfs01 6]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync)

第四个里程碑:创建共享目录
mkdir /data
chown -R nfsnobody.nfsnobody /data

第五个里程碑:启动nfs相关服务
[root@nfs01 data]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ] 
[root@nfs01 data]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

第六个里程碑:检查nfs相关服务是否正常启动
[root@nfs01 data]# rpcinfo -p localhost      --- 确认房源信息是否已经注册到rpc服务中
[root@nfs01 data]# showmount -e 172.16.1.31  --- 确认是否有可以挂载的目录信息
Export list for 172.16.1.31:

/data 172.16.1.0/24 1.5.4 本地测试挂载 [root@nfs01 data]# mount -t nfs 172.16.1.31:/data /mnt --- nfs服务端本地测试挂载 [root@nfs01 data]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.7G 6.8G 20% / tmpfs 931M 0 931M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot 172.16.1.31:/data 8.8G 1.7G 6.8G 20% /mnt

1.5.5 nfs客户端部署 第一个里程碑:安装相应nfs客户端软件 yum install -y rpcbind nfs-utils

第二个里程碑:rpcbind服务可以启动(也可以不启动)
/etc/init.d/rpcbind start

第三个里程碑:进行挂载前测试
[root@nfs01 data]# rpcinfo -p localhost      --- 确认房源信息是否已经注册到rpc服务中
[root@nfs01 data]# showmount -e 172.16.1.31  --- 由于未安装nfs-utils软件,因此没有showmount

第四个里程碑:进行共享目录挂载
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3          8.8G  1.7G  6.8G  20% /
tmpfs              931M     0  931M   0% /dev/shm
/dev/sda1          190M   40M  141M  22% /boot
172.16.1.31:/data  8.8G  1.7G  6.8G  20% /mnt

1.6 NFS服务常见进程详解

查看看以上进程,均可以执行 ”man 进程名“ 命令,例如 “man rpc.idmapd”, 可查看有关NFS服务进程的英文说明参考:

1.7 exports配置文件格式

NFS共享目录 NFS客户端地址1(参数1,参数2,...) 客户端地址2(参数1,参数2,...) 或 NFS共享目录 NFS客户端地址(参数1,参数2,...)

执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式: EXAMPLE # sample /etc/exports file / master(rw) trusty(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash) /srv/www -sync,rw server @trusted @external(ro) /foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw) /build buildhost[0-9].local.domain(rw)

1.8 exports配置文件重要参数说明

no_root_squash --- root用户不进行映射压缩 root_squash --- root用户进行映射压缩 all_squash --- 所有用户都进行压缩 no_all_squash --- 所有用户都不进行压缩

root_squash,no_all_squash参数实践 [root@nfs01 data]# cat /etc/exports /data 172.16.1.0/24(rw,sync,root_squash,no_all_squash)

1.9 NFS在企业生产集群架构中的位置

1.10 NFS存储服务器搭建-同步异步对比及优点缺点

1.11 命令参数

流程图

实践操作:将默认nfsnobody映射用户转为www 第一里程碑:在服务端和客户端创建出相同uid和gid的www用户 [root@nfs01 ~]# useradd -u 666 www [root@nfs01 ~]# id www uid=666(www) gid=666(www) groups=666(www)

[root@web01 ~]# useradd -u 666 www
[root@web01 ~]# id www
uid=666(www) gid=666(www) groups=666(www)

	
第二里程碑:编写nfs服务端配置文件
[root@nfs01 ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666)

第三个里程:修改原有共享目录权限
chown -R www.www /data

第四个里程:客户端进行挂载测试
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 mnt]# touch oldboy.txt
root@web01 mnt]# ll
otal 0
rw-r--r-- 1 www www 0 Dec  1 09:35 oldboy.txt

1.3 为什么用户默认映射为nfsnobody

[root@nfs01 data]# cat /var/lib/nfs/etab     --- nfs默认配置信息记录文件
/data	172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
[root@nfs01 data]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

1.4 实践练习:共享不同的两个目录,分别赋予读和写权限

服务端上面要求: nfs服务器172.16.1.31,共享下面两个目录: /data/w 要求的权限可读写,同步数据sync,所有用户都压缩为匿名用户all_suqash /data/r 要求的权限为只读,同步数据sync,所有用户都压缩为匿名用户all_squash

客户端上面要求: backup服务器 把NFS服务器的/data/r 挂载到/data/r web01服务器 把NFS服务器的/data/w 挂载到/data/w

1.5 配置nfs服务端:

第一个里程:编写nfs配置文件 vim /etc/exports /data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666) /data/w 172.16.1.0/24(rw,sync,all_suqash) /data/r 172.16.1.0/24(ro,sync,all_suqash)

第二个里程:创建新增共享目录 [root@nfs01 data]# mkdir /data/{w,r} -p [root@nfs01 data]# chown -R nfsnobody.nfsnobody /data/ [root@nfs01 data]# ll /data/ total 8 -rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 1 09:35 oldboy.txt drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 1 10:30 r drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 1 10:30 w

第三个里程:平滑重启nfs服务 /etc/init.d/nfs reload

配置nfs客户端: backup服务器配置: 创建挂载点目录:mkdir /data/r -p 进行共享目录挂载:mount -t nfs 172.16.1.31:/data/r /data/r 说明:如果挂载点已经挂载上了,需要卸载重新挂载

web01服务器配置: 创建挂载点目录:mkdir /data/w -p 进行共享目录挂载:mount -t nfs 172.16.1.31:/data/w /data/w 说明:如果挂载点已经挂载上了,需要卸载重新挂载

第四个里程:进行挂载目录权限测试 测试backup挂载目录权限(预期结果:挂载目录中创建信息会权限拒绝) [root@backup ~]# cd /data/r/ [root@backup r]# touch oldboy_backup.txt touch: cannot touch `oldboy_backup.txt': Permission denied

测试web01挂载目录权限(预期结果:挂载目录中创建信息会权限拒绝) [root@web01 w]# touch oldboy_web01.txt [root@web01 w]# ll total 0 -rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 1 10:48 oldboy_web01.txt

注意:nfs配置文件中,配置的共享目录,不要有父目录与子目录的继承关系

1.6 NFS服务的重点知识梳理

NFS客户端权限与三个因素有关:

  1. NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限。  2) NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务器端本地目录的安全权限。  3)每台机器对应存在和NFS默认配置UID的相同UID 65534的nfsnobody用户 (确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)、

重要配置文件与命令总结 /etc/exports --- nfs服务端主配置文件 /usr/sbin/exportfs --- exportfs为nfs服务管理命令,还可以进行命令行配置共享目录信息 /usr/sbin/showmount --- 显示可以挂载的共享目录列表信息 /var/lib/nfs/etab --- 查看nfs服务端默认挂载参数配置信息 /proc/mounts --- 查看nfs客户端默认挂载参数配置信息

umount命令重要参数 -l Lazy unmount --- 懒惰卸载,不用跳出挂载的目录进行卸载 -f Force unmount --- 强制卸载 NFS客户端挂载命令

1.7 客户端挂载可能会遇到的问题

第一个报错: [root@nfs-client1 ~]# showmount -e 10.0.0.7 <- 这里遇到了故障 clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) 问题说明: nfs服务端防火墙没有关闭,防火墙策略阻止掉了

第二个报错: [root@nfs-client1 ~]# showmount -e 10.0.0.7 clnt_create: RPC: Program not registered 问题说明: nfs服务没有启动,只启动了rpcbind服务

第三个报错: [root@nfs01 data]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [FAILED] 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] 问题说明: nfs与rpcbind服务启动顺序不正确,rpcbind服务没有启动,先启动了nfs服务

第四个报错: 示例1:客户端挂载报错“No such file or directory” [root@nfs-client ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 [root@nfs-client ~]# mount -t nfs 172.16.1.31:/data /mnt mount.nfs: mounting 172.16.1.31:/data failed, reason given by server: No such file or directory 解答:原因是NFS服务器端没有共享目录/data,创建即可。命令如下: [root@nfs-server ~]# mkdir /data

第五个报错: 示例4:卸载挂载设备时显示device is busy。 [root@nfs-client mnt]# umount /mnt umount.nfs: /mnt: device is busy umount.nfs: /mnt: device is busy 问题解决: umount -lf /mnt

第六个报错: 示例5:CentOS 6.6客户端NFS挂载时遇到问题。 [root@nfs-client ~]# mount -t nfs 172.16.1.31:/data /mnt mount:wrong fs type,bad option,bad option,bad superblock on 10.0.0.7:/data, missing codepage or helper program,or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program ) In some cases useful info is found in syslog - try meg | tail or so 问题说明: 客户端没有安装nfs-utils软件包,无法识别nfs文件系统类型

第七个报错: 共享目录挂载很卡 mount -t nfs 172.16.1.31:/data /mnt cd /mnt time touch test.txt 原因分析:  NFS服务端重启之后。立刻进行挂载会出现此问题,因为NFS自身重启的时候,拥有无敌的时间,默认是90秒;在无敌时间内,是不能对共享目录进行更改的操作;  在系统配置中/etc/sysconfig/nfs中指定了无敌时间的配置参数 NFSD_V4_GRACE=90 NFSD_V4_LEASE=90 NLM_GRACE_PERI0D=90

第八个报错: Stale file handle 客户端报错 mount -t nfs 172.16.1.31:/data /mnt mount.nfs: Stale file handle 问题原因: 挂载点目录已经在挂载中,一定要卸载后,才能进行重新挂载

1.8 NFS客户端开机自启动挂载

1.8.1 利用rc.local文件实现 将挂载命令追加到/etc/rc.local文件中 echo 'mount -t nfs 172.16.1.31:/data /mnt' >>/etc/rc.local

1.8.2 利用fstab文件实现 vim /etc/fstab 挂载什么 挂载到哪 类型 挂载参数 是否备份 是否检查磁盘 172.16.1.31:/data /mnt nfs defaults 0(dump) 0(fsck) [root@backup ~]# /etc/init.d/netfs start 说明:netfs服务设置开机自启动后,可以让系统网络服务启动后,再次识别fstab文件配置信息

1.8.3 NFS客户端挂载参数说明 1.8.4 NFS客户端优化参数总结

1.8.4.1 有关系统安全挂载参数选项 在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多木马篡改站点文件都是由上传入口上传的程序到存储目录。然后执行的。 因此在挂载的时候,用下面的命令很有必要: mount -t nfs -o nosuid,noexec,nodev,rw 10.0.0.7:/data /mnt 通过mount -o指定挂载参数和在/etc/fstab里指定挂载参数的效果是一样的。 网络文件系统和gf 本地的文件系统效果也是一样的。

1.8.4.2 mount挂载性能优化参数选项 下面介绍几个在企业生产环境下,NFS性能优化挂载的例子。 1)禁止更新目录及文件时间戳挂载,命令如下: mount -t nfs -o noatime,nodiratime 10.0.0.7:/data /mnt