首页 > 代码库 > nfs网络文件系统服务介绍与实战第一部
nfs网络文件系统服务介绍与实战第一部
1、NFS原理描述
什么是NFS?NFS是Network File System的缩写,它的主要功能是通过网络让不同的机器之间可以彼此共享文件或目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂在到本地的NFS客户端中。在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样。
NFS一般用来存储共享视频、图片等静态数据,是当前互联网系统架构中最常用的服务之一。
2、NFS挂载结构图
图解:NFS对外共享了video这个目录,下面有两台NFS客户端,客户端可以把服务端的video目录挂载到本地的一个目录下;相当于把本地的目录跟服务端的目录做一个绑定或者说是做一个映射,这个时候访问本地的/data/video就相当于访问NFS Server的/video目录一样,本地的共享目录可以是自己取的名字,当然最好是要做到见名知意了。
3、NFS挂载原理详细介绍
如上图,当我们在NFS服务器端设置好一个共享存储目录/video以后,其他的有权限访问NFS服务器端的NFS客户端可以将这个/video共享目录,挂载到NFS客户端本地系统上的某个挂载点(其实就是一个目录,这个目录可以随意指定,最好还是做到见名知意,便于后期维护),上图客户端本地的挂载点分别为/data/video和/data/video。
当正确挂载完毕后,进入到NFS客户端的/data/video或/data/video目录就可以看到NFS服务器端/video目录下的所有数据。看起来NFS服务器端的/video目录就相当于NFS客户端本地的磁盘分区或者目录一样,根据NFS服务端授予的NFS共享权限,在NFS客户端操作/data/video或/data/video挂载的目录,就可以将数据轻松存取到NFS Server的/video目录中。
挂载后,NFS客户端本地显示如下面所示:
如上所示:挂载信息看起来,和本地的分区一般不二,只是开头是ip地址的形式。
经过上面的介绍,我们知道NFS是通过网络来进行数据传输的(所以叫网络文件系统嘛!,哈哈!),因此,NFS会使用一些端口来传输,那么,NFS到底使用哪些端口来进行传输呢?这个问题比较难于回答。因为NFS在传输数据时使用的端口是随机选择的。可能有朋友会纳闷,既然这样,NFS客户端是怎么知道NFS服务端使用的是哪个端口呢?答案:就是通过远程过程调用(Remote Procedure Call简称RPC)协议/服务来实现的,接下来,我们就谈谈什么是RPC协议/服务。
4、什么是RPC(Remote Procedure Call)
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是随机采用一些未被用的小于1024的端口来作为传输之用。但如此一来就会造成客户端与服务端联机的困扰,因为客户端必须要知道服务器端的数据传输端口才能进行联机交互数据。
要解决上面的问题,我们就需要远程过程调用(RPC)服务了,RPC最主要的功能就是制定每个NFS功能所对应的端口号,并且将该信息传递给NFS客户端,让客户端可以连接到争取的端口上去。那么RPC又是如何知道每个NFS的端口呢?这是因为当NFS服务启动时会随机取用数个端口,并主动向NFS服务注册取用的相关端口信息,这样,RPC服务就可以知道每个端口对应的NFS功能了,然后RPD服务使用固定的Port 111 来监听NFS客户端的请求,并将正确的NFS端口应到给NFS客户端,这样一来,就可以让NFS的客户端与服务端进行数据传输了。
提示:在启动NFSServer之前,首先要启动RPC服务(即portmap服务,下同,否则NFS Server就无法想RPC服务注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据将会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。
特别注意:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs -rv即可,可使/etc/exports生效。
5、描述整个启动过程如下图
如上图所示,当程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程大致如以下几点:
1、首先用户访问应用程序,由应用程序在NFS客户端发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(即Portmap服务就会通过网络向NFS服务器段的portmap的111端口发出FNS文件存取功能的询问请求。
2、NFS服务器端的portmap服务找到对应的已注册的NFS daemon端口后,通知NFS客户端的portmap服务。
3、此时NFS客户端就可以获取到了正确的断藕,然后就直接与NFS daemon联机存取数据了。
4、NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果。
由于NFS的各项功能都要向portmap服务注册,所以portmap服务才能获取到NFS服务的各项功能对应的端口号(port number、PID、NFS在主机所监听的ip等,而NFS客户端才能够通过向portmap服务询问从而找到正确的端口。也就是说,NFS需要有portmap服务的协助才能成功提供服务。由上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当需要使用NFS时,都需要首先启动portmap服务。
5、实验测试
同时打开三台虚拟机,并修改好主机名称,以及标签
NFS-SERVER端配置详解
(1)查看NFS服务端系统信息
[root@nfs-server ~]# cat /etc/redhat-release CentOS release 5.8 (Final)
(2)查看内核版本信息
[root@nfs-server ~]# uname -r 2.6.18-308.el5
(3)安装NFS主程序nfs-utils软件和提供RPC主程序的portmap软件
Portmap提供端口映射 [root@nfs-server ~]# yum -y install nfs-utils portmap [root@nfs-client1 ~]# yum -y install nfs-utils portmap [root@nfs-client2 ~]# yum -y install nfs-utils portmap [root@nfs-server ~]# rpm -qa nfs-utils portmap portmap-4.0-65.2.2.1 nfs-utils-1.0.9-70.el5 [root@nfs-client1 ~]# rpm -qa nfs-utils portmap nfs-utils-1.0.9-70.el5 portmap-4.0-65.2.2.1 [root@nfs-client2 ~]# rpm -qa nfs-utils portmap portmap-4.0-65.2.2.1 nfs-utils-1.0.9-70.el5 也可以使用下列方法查询软件包是否安装 [root@nfs-server ~]# rpm -qa |grep -E "nfs-utils|portmap" portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 nfs-utils-1.0.9-70.el5 [root@nfs-client1 ~]# rpm -qa |grep -E "nfs-utils|portmap" nfs-utils-1.0.9-70.el5 portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 [root@nfs-client2 ~]# rpm -qa |grep -E "nfs-utils|portmap" portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 nfs-utils-1.0.9-70.el5
(4)NFS服务端首先必须要启动portmap服务
因为NFS及其辅助程序都是基于RPC(Remote Procedure Call)协议的(使用的端口为111),所以要首先确保系统中运行了portmap服务。 [root@nfs-server ~]# service portmap status portmap 已停 [root@nfs-server ~]# service portmap start 启动 portmap: [确定] [root@nfs-server ~]# lsof -i:111 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME portmap 3361 rpc 3u IPv4 15366 0t0 UDP *:sunrpc portmap 3361 rpc 4u IPv4 15367 0t0 TCP *:sunrpc (LISTEN) [root@nfs-server ~]# netstat -tulanp |grep :111 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3361/portmap udp 0 0 0.0.0.0:111 0.0.0.0:* 3361/portmap
模拟portmap服务没启动,执行rpcinfo -p localhost会报错
[root@nfs-server ~]# service portmap stop 停止 portmap: [确定] [root@nfs-server ~]# rpcinfo -p localhost rpcinfo:无法同 portmapper 交互: RPC:远程系统错误 - 拒绝连接 [root@nfs-server ~]# export LANG=c [root@nfs-server ~]# rpcinfo -p localhost rpcinfo: can‘t contact portmapper: RPC: Remote system error - Connection refused
以下操作表示RPC服务是正常的。
[root@nfs-server ~]# service portmap start Starting portmap: [ OK ] [root@nfs-server ~]# rpcinfo -p localhost program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper
(5)其次是启动NFS服务,以便向RPC服务来注册
[root@nfs-server ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] [root@nfs-server ~]# ps aux |grep nfs root 3451 0.0 0.0 0 0 ? S< 02:31 0:00 [nfsd4] root 3453 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3454 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3455 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3456 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3457 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3458 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3459 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3460 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3479 0.0 0.0 61152 660 pts/0 R+ 02:31 0:00 grep nfs
(6)配置NFS开机自启动,服务端配置NFS和portmap,客户端只需要配置portmap即可
[root@nfs-server ~]# chkconfig --level 3 nfs on [root@nfs-server ~]# chkconfig --level 3 portmap on [root@nfs-server ~]# chkconfig --list |grep -E "nfs|portmap" nfs 0:off 1:off 2:off 3:on 4:off 5:off 6:off nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off [root@nfs-client1 ~]# chkconfig --level 3 portmap [root@nfs-client1 ~]# chkconfig --list |grep portmap portmap 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [root@nfs-client1 ~]# export LANG=c [root@nfs-client1 ~]# chkconfig --list |grep portmap portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off [root@nfs-client2 ~]# chkconfig --level 3 portmap on [root@nfs-client2 ~]# chkconfig --list |grep portmap portmap 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [root@nfs-client2 ~]# export LANG=c [root@nfs-client2 ~]# chkconfig --list |grep portmap portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
(7)NFS配置文件路径及配置文件格式
NFS默认配置文件路径为/etc/exports,默认为空,无任何内容
/etc/exports 文件配置格式为
NFS共享目录客户端地址1(参数1..参数N),客户端地址2(参数1..参数N),各参数说明
1、NFS共享目录:为NFS服务端要共享的实际目录绝对路径。 2、客户端地址:为服务端授权的访问共享目录的客户端服务器地址,可以作为单独的ip地址或域名,也可以为整个网段,还可以使用*来匹配所有服务器可以访问。 3、参数集:对授权的客户端的访问权限控制,详见下表
客户端地址 | 具体地址案例 | 说明 |
授权单一客户端访问NFS | 192.168.1.51 | 一般情况,生产环境中此配置不常见 |
授权整个网段访问 | 192.168.1.0/24 | 指定网段为生产环境中最常见的配置 |
生产环境常见配置实例
常用格式说明 | 要共享的目录客户端ip地址或ip段(参数1,参数2..参数n) |
配置实例一 | /video 192.168.1.0/24(rw, sync) |
配置实例二 | /data/video 192.168.1.10/24(rs,sync,all_squash,anonuid=3000,anongid=3000)此配置是生产环境中的常用配置,适合多客户端共享一个NFS目录 |
配置实例三 | /data/video 192.168.1.52(ro)只读共享 |
NFS配置实例详解
配置实例一:共享/data/video目录给192.168.1.0/24整个网段可读写
1、在NFS服务端执行如下操作
创建要共享的NFS服务端目录 [root@nfs-server ~]# mkdir /data/ 设置最大权限为777,不安全,后面会进行详解;这里主要是为了方便测试 [root@nfs-server ~]# chmod -R 777 /data/ 相当于使用VIM编辑NFS配置文件一样/etc/exports然后输入/data/ 192.168.1.0/24(rw,sync)一样 [root@nfs-server ~]# echo "/data/ 192.168.1.0/24(rw,sync)">/etc/exports 查看通过echo生成的配置文件结果 [root@nfs-server ~]# tail /etc/exports /data/ 192.168.1.0/24(rw,sync) 查看当前portmap服务运行状态 [root@nfs-server ~]# /etc/init.d/portmap status portmap (pid 3397) is running... 查看当前NFS服务运行状态 [root@nfs-server ~]# /etc/init.d/nfs status rpc.mountd (pid 3463) is running... nfsd (pid 3460 3459 3458 3457 3456 3455 3454 3453) is running... 修改NFS配置文件后,使用reload平滑重启NFS服务使其生效 [root@nfs-server ~]# /etc/init.d/nfs reload 查看NFS配置文件的参数,包括默认加载的参数 [root@nfs-server ~]# cat /var/lib/nfs/etab /data 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
2、在客户端mount目录
首先查看服务端提供了哪些共享 [root@nfs-client1 ~]# showmount -e 192.168.1.50 Export list for 192.168.1.50: /data 192.168.1.0/24 [root@nfs-client2 ~]# showmount -e 192.168.1.50 Export list for 192.168.1.50: /data 192.168.1.0/24 客户端挂载 [root@nfs-client1 ~]# mount -t nfs 192.168.1.50:/data/ /mnt/ [root@nfs-client1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext3 15G 2.3G 12G 17% / /dev/sda6 ext3 9.5G 151M 8.9G 2% /data /dev/sda5 ext3 9.5G 151M 8.9G 2% /app /dev/sda3 ext3 9.5G 151M 8.9G 2% /tools /dev/sda1 ext3 190M 12M 169M 7% /boot tmpfs tmpfs 502M 0 502M 0% /dev/shm 192.168.1.50:/data/ nfs 9.5G 151M 8.9G 2% /mnt [root@nfs-client1 ~]# mount /dev/sda2 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/sda6 on /data type ext3 (rw) /dev/sda5 on /app type ext3 (rw) /dev/sda3 on /tools type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) 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) 192.168.1.50:/data/ on /mnt type nfs (rw,addr=192.168.1.50) [root@nfs-client2 ~]# mount -t nfs 192.168.1.50:/data/ /mnt/ [root@nfs-client1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext3 15G 2.3G 12G 17% / /dev/sda6 ext3 9.5G 151M 8.9G 2% /data /dev/sda5 ext3 9.5G 151M 8.9G 2% /app /dev/sda3 ext3 9.5G 151M 8.9G 2% /tools /dev/sda1 ext3 190M 12M 169M 7% /boot tmpfs tmpfs 502M 0 502M 0% /dev/shm 192.168.1.50:/data/ nfs 9.5G 151M 8.9G 2% /mnt [root@nfs-client1 ~]# mount /dev/sda2 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/sda6 on /data type ext3 (rw) /dev/sda5 on /app type ext3 (rw) /dev/sda3 on /tools type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) 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) 192.168.1.50:/data/ on /mnt type nfs (rw,addr=192.168.1.50)
NFS服务端创建测试目录:服务端往客户端存文件
[root@nfs-server ~]# ls -l /data/ total 0 [root@nfs-server ~]# mkdir /data/123 -pv mkdir: created directory `/data/123‘ [root@nfs-client1 ~]# ls -l /mnt/ total 8 drwxr-xr-x 2 root root 4096 May 1 03:49 123 [root@nfs-client2 ~]# ls -l /mnt/ total 8 drwxr-xr-x 2 root root 4096 May 1 03:49 123
NFS客户端创建测试目录:客户端往服务端存目录
[root@nfs-client1 ~]# mkdir /mnt/test1 -pv mkdir: created directory `/mnt/test1‘ [root@nfs-client2 ~]# mkdir /mnt/test2 -pv mkdir: created directory `/mnt/test2‘ [root@nfs-server ~]# ls -l /data/ total 24 drwxr-xr-x 2 root root 4096 May 1 03:49 123 drwxr-xr-x 2 nfsnobody nfsnobody 4096 May 1 03:54 test1 drwxr-xr-x 2 nfsnobody nfsnobody 4096 May 1 03:55 test2
[root@nfs-client1 ~]# id nfsnobody uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody) context=root:system_r:unconfined_t:SystemLow-SystemHigh [root@nfs-client2 ~]# id nfsnobody uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody) context=root:system_r:unconfined_t:SystemLow-SystemHigh
NFS客户端挂载的命令格式
挂载命令 | 挂载的格式类型 | NFS服务端提供的共享目录 | NFS客户端要挂在的目录 |
mount | -t nfs | 192.168.1.50:/data | /mnt |
完整挂载命令为:mount -t nfs 192.168.1.50:/data /mnt |
附:NFS权限设置常用图解
关于是否开机自动挂载的问题?
在当前目录下,想强制卸载NFS客户端挂载点的问题, umount -l 强制卸载 l--lazy卸载
本文出自 “追风” 博客,请务必保留此出处http://hanyanwei.blog.51cto.com/8672126/1405437