NFS介绍:
NFS是Network File System的缩写,它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录。NFS客户端(一般为应用服务器,如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据文件目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从本地NFS客户端的机器来看,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样。
NFS一般用来存储共享视频、图片、附件等静态数据,是当前互联网系统架构中最长用的服务之一,特别是中小公司应用频率很高。
NFS挂载结构图
为什么要使用NFS?
现实环境中,当你在QQ空间或者微信朋友圈上传一张照片的时候,是先通过代理访问到第一台服务器,然后你就把照片传到了第一台服务器,那么你第二次访问的时候,就有可能不是第一台了,这时候你就看不到了,你又去传一遍,这样很麻烦,用户不但没有体验,而且对服务器资源也是浪费,这时候就可以把用户访问的资源,统一放到一台NFS服务器上,web服务器就可以通过别的手段去找到这台NFS服务器。总结来说就是,当多台服务器共同使用一个资源的时候,就可以使用NFS
实战
环境准备
NFS-server OS:centos6.5 IP:172.16.50.175 NFS-client OS:centos6.5 IP:172.16.50.171
准备工作
NFS-server [root@localhost ~]# hostname NFS-server [root@localhost ~]# bash [root@NFS-server ~]# sed -i 's#HOSTNAME=localhost.localdomain#HOSTNAME=NFS-server#g' /etc/sysconfig/network [root@NFS-server ~]# /etc/init.d/iptables stop [root@NFS-server~]# setenforce 0 NFS-client [root@localhost ~]# hostname NFS-client [root@localhost ~]# bash [root@NFS-client ~]# sed -i 's#HOSTNAME=localhost.localdomain#HOSTNAME=NFS-client#g' /etc/sysconfig/network [root@NFS-client ~]# /etc/init.d/iptables stop [root@NFS-client ~]# setenforce 0
安装软件
要部署NFS服务,必须安装下面两个软件包 #nfs-utils:这个是NFS服务主程序,包括rpc.nfsd、rpm.mountd两个daemouns和相关文档说明及执行命令文件等 #rpcbin:NFS可以被视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口映射工作,这个映射工作就是有rpcbind服务来完成的。因此,提供NFS服务器之前必须先启动NFS服务 #exports配置文件参数语法详解 格式: NFS共享目录(/nfs_share) NFS客户端地址1(参1,参2) 客户端地址2(参1,参2) 1.NFS共享目录:为NFS服务器端要共享的世纪目录,要用本地绝对路径 2.客户端地址:为服务器授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名、整个网段,还可以用"*"表示所有客户端可以访问,这里所谓的客户端一般来说是前端的业务服务器,例如web服务 3.参数集:对授权的客户端的访问权限设置 NFS-server [root@NFS-server ~]# yum -y install rpcbind nfs-utils [root@NFS-server ~]# service rpcbind start #要先启动rpcbind [root@NFS-server ~]# service nfs start [root@NFS-server ~]# mkdir /NFSdata #创建共享目录 [root@NFS-server ~]# cat /etc/exports /NFSdata 172.16.50.0/24(rw,sync) #让172.16.50.0/24这个网段有读写(rw)的权限访问/NFSdata目录,并且可以实时写入磁盘(sync) [root@NFS-server ~]# /etc/init.d/nfs reload #平滑重启 NFS-client [root@NFS-client ~]# yum -y install rpcbind nfs-utils [root@NFS-client ~]# service rpcbind start [root@NFS-server ~]# service nfs start #使用NFS-client挂载服务 [root@NFS-client ~]# showmount -e 172.16.50.175 Export list for 172.16.50.175: /NFSdata 172.16.50.0/24 #挂载之前我们要先看一下本机是否有挂载权限,用showmount -e 然后指定服务端地址 [root@NFS-client ~]# mount -t nfs 172.16.50.175:/NFSdata /NFSdata/ 挂载到本地 #没有提示就成功了 [root@NFS-client NFSdata]# mkdir qwe #但是我们无法删除或者创建东西,这是因为我们的属主不是nfsnobody mkdir: 无法创建目录"qwe": 权限不够 #server端操作 [root@NFS-server ~]# chown nfsnobody /NFSdata/ #这里也可以给777权限,但是在实际环境中不安全,这里不推荐 #这时候NFS-client再次操作 [root@NFS-client NFSdata]# mkdir qwe [root@NFS-client NFSdata]# ls #成功 qwe #那么我们可不可以更改默认的nfs用户nfsnobody呢?当然可以 [root@NFS-server ~]# vi /etc/exports [root@NFS-server ~]# cat /var/lib/nfs/etab /NFSdata 172.16.50.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@NFS-server ~]# cat /etc/passwd |grep 65534 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin #共享目录权限,uid,gid都为65534,而nfsnobody的uid,gid也为65534 [root@NFS-server ~]# cat /etc/exports /NFSdata 172.16.50.0/24(rw,sync,anonuid=2000,anongid=2000) #修改一下exports文件即可,但是我们现在没有一个uid,gid为2000的用户,所以要创建一个 [root@NFS-server ~]# /etc/init.d/nfs reload [root@NFS-server ~]# useradd -u 2000 Daniel -s /sbin/nologin -M [root@NFS-client NFSdata]# mkdir 123 mkdir: 无法创建目录"123": 权限不够 #这时候我们再次到client上创建,权限又不够了,因为属主已经变了 [root@NFS-server ~]# chown Daniel /NFSdata/ #修改属主,回去再次尝试发现成功
开机挂载挂载文件fstab知识详解
#fstab用于挂载重要的文件系统,比如每个分区的挂载,可以自行查看一下/etc/fstab [root@localhost /]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 8 05:50:59 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=9fbbb74d-caec-4737-8cc8-b82a3a4d91f0 / ext4 defaults 1 1 UUID=e189649f-49f4-480f-af96-11aea700acd4 /home ext4 defaults 1 2 UUID=d289b97c-5b45-460f-96ef-e578d857f8b4 /usr ext4 defaults 1 2 UUID=c1a623dc-fc6b-42d0-b59b-f7e5fb287536 /var ext4 defaults 1 2 UUID=05519a9b-11ff-45d8-8fa2-d35c1efdc74d swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 #第一列:需要挂载的设备(/dev/sda)或者远程的文件系统(NFS) #第二列:文件系统的挂载点 #第三列:要挂载的文件系统类型 #第四列:文件系统关联的mount选项 #对于本地文件系统一般放在fstab里做挂载,并且结尾的两列不要用1 1,用0 0 #mount命令 -o 选项后面可以接的参数 async:All I/O to the file system should be done asynchronously 所以涉及到文件系统I/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但会降低数据安全 atime: Update inode access time for each access. This is the default. 在每一次数据访问时,同步更新每次访问的inode时间,是默认选项,在高并发的情况下,可以通过加上noatime,来取消这个默认项,以达到提升IO性能,优化IO的目的 auto: Can be mounted with the -a option 能够被自动挂载通过-a选项 defaults: Use default options:rw,suid,dev,exec,auto,nouser,and,async 这是个缺省值包括rw,suid....。 cat/etc/fstab的结果默认情况大部分都是缺省值 exec: Permit execution of binaries 允许执行二进制文件 noatime: Do not update inode access times on this file system(e.g, for faster access on the news spool to speed up news servers) 不更新文件系统上的inode访问时间,高并发环境,推荐此选项,提高IO性能 nodiratime: ro:挂载一个只读文件系统 rw:挂载一个可写的文件系统 sync:改参数和async相反、即有I/O操作时,都会同步处理IO。即把数据同步写入硬盘。此参数会牺牲一点IO性能,但是,换来的是掉电后数据的安全性
参数权限讲解
rw #Read-write,表示可读写权限 ro #Read-only,表示只读权限 sync #请求或写入数据时,数据同步写入到NFS server的硬盘后才会返回 async #请求或写入数据时,先返回请求,再将数据写入到缓存和硬盘中。此参数可以提升NFS性能,但是会降低数据的安全。因此,一般情况下建议不用 no_root_squash #访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本是为无盘客户端准备的。用户应避免使用 root_squash #对于访问NFS server共享目录的用户如果是root的话,则它的权限将被压缩成匿名用户。同时的它的uid和gid通常会变成nobody或nfsnobody账号身份 all_squash #不管访问NFS server共享目录身份如何,它的权限都将被压缩成匿名用户,同时它的uid和gid都会变成nobody或nfsbody账号身份 anonuid #匿名用户uid,默认是nobody,nfsnobody,指定了就是指定的uid