一,简介
NFS是Network File System的缩写,中文称为网络文件系统,由sun 公司所发展出来,主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似,只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。
因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的埠口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关埠口才能够联机吧!
此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的埠口上去。 那 RPC 又是如何知道每个 NFS 的埠口呢?这是因为当服务器在启动 NFS 时会随机取用数个埠口,并主动的向 RPC 注册,因此 RPC 可以知道每个埠口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的埠口, 所以当然可以让 NFS 的启动更为轻松愉快了!
所以要注意,要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。
当客户端有 NFS 档案存取需求时,他会如何向服务器端要求数据呢?
- 客户端会向服务器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
- 服务器端找到对应的已注册的 NFS daemon 埠口后,会回报给客户端;
- 客户端了解正确的埠口后,就可以直接与 NFS daemon 来联机。
由于 NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能之 port number, PID, NFS 在服务器所监听的 IP 等等,而客户端才能够透过 RPC 的询问找到正确对应的埠口。 也就是说,NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种
二,环境前的准备:两台服务器测试
server IP 192.168.0.97
系统版本:
[root@centos6 ~]# uname -r
2.6.32-431.el6.x86_64
[root@centos602 ~]# hostname
nfs01
client IP 192.168.0.121
系统版本:
[root@centos6 ~]# uname -r
2.6.32-431.el6.x86_64
[root@centos602 ~]# hostname
nfs02
三,安装nfs服务 server端
1.查看是否安装
[root@centos602 ~]# rpm -qa | grep nfs
[root@centos602 ~]# rpm -qa | grep rpcbind
2.安装rpcbind和nfs软件及检查
[root@centos602 ~]# yum -y install nfs-utils rpcbind
[root@centos602 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-16.el6.x86_64
nfs-utils-1.2.3-78.el6.x86_64
[root@centos602 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
3.启动nfs相关服务及启动rpcbinf服务并检查
启动
Starting rpcbind: [ OK ]
检查
rpcbind (pid 7674) is running...
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 7674/rpcbind
tcp 0 0 :::111 :::* LISTEN 7674/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 7674/rpcbind
udp 0 0 0.0.0.0:641 0.0.0.0:* 7674/rpcbind
udp 0 0 :::111 :::* 7674/rpcbind
udp 0 0 :::641 :::* 7674/rpcbind
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@centos602 ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 53090 mountd
100005 1 tcp 47431 mountd
100005 2 udp 38644 mountd
100005 2 tcp 36040 mountd
100005 3 udp 60435 mountd
100005 3 tcp 54783 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 36742 nlockmgr
100021 3 udp 36742 nlockmgr
100021 4 udp 36742 nlockmgr
100021 1 tcp 59477 nlockmgr
100021 3 tcp 59477 nlockmgr
100021 4 tcp 59477 nlockmgr
[root@centos602 ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local
[root@centos602 ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
/etc/init.d/rpcbind start
/etc/init.d/nfs start
drwxr-xr-x 2 root root 4096 Dec 8 07:09 /data/
[root@centos602 ~]# ll -d /data/
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 8 07:09 /data/
[root@centos602 ~]# ll -h /etc/exports
编辑该配置文件:
Export list for 192.168.0.97:
/data 192.168.0.0/24
[root@centos602 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 1003M 16G 6% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 194M 27M 158M 15% /boot
/dev/sr0 4.2G 4.2G 0 100% /yum
192.168.0.97:/data 18G 1003M 16G 6% /mnt
NFS配置参数权限,具体如下表
参数名称 | 参数用途 |
---|---|
rw(熟记) | 表示可读写权限 |
sync(熟记) | 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差 |
async(熟记) | 写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源) |
all_squash(熟记) | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用,在生产环境中配置NFS的重要技巧:1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同) |
anonuid(熟记) | 参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好 |
anongid(熟记) | 同anonuid,区别是把uid(用户id)换成gid(组id) |
ro | 表示只读权限 |
Export list for 192.168.0.97:
/data 192.168.0.0/24
[root@centos6 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos6-lv_root 18G 2.8G 14G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
/dev/sr0 3.6G 3.6G 0 100% /yum
192.168.0.97:/data 18G 1003M 16G 6% /mnt
/dev/mapper/vg_centos6-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/sr0 on /yum type iso9660 (ro)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
192.168.0.97:/data on /mnt type nfs (rw,vers=4,addr=192.168.0.97,clientaddr=192.168.0.121)