linux点滴:NFS

介绍

NFS,Network File System,网络文件系统。主要功能是通过网络让不同的主机系统间共享资源,类似于windows下的文件共享。适用于互联网中小型企业。

工作原理

  • 客户端发送请求
  • 客户端的RPC服务通过111端口向服务端的RPC服务发送请求
  • 服务端的RPC服务找到对应的端口映射,返回给客户端的RPC服务。
  • 客户端获取端口,与服务端建立连接。

部署

准备环境

系统 角色 主机名 IP地址
CentOS 6.7 X86_64 服务端 nfs01 172.16.1.31
CentOS 6.7 X86_64 客户端 web01 172.16.1.8
#服务端nfs01
[root@nfs01 ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@nfs01 ~]# uname -r
2.6.32-573.el6.x86_64
#客户端web01
[root@web01 ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@web01 ~]# uname -r
2.6.32-573.el6.x86_64
#客户端web02
[root@web02 ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@web02 ~]# uname -r
2.6.32-573.el6.x86_64

注:防火墙和SELinux已关闭

服务端

安装软件

#查看软件信息
[root@nfs01 ~]# rpm -qa nfs-utils
nfs-utils-1.2.3-64.el6.x86_64
#如果没有,使用yum安装。
yum install nfs-utils -y
rpm -qa nfs-utils
  • nfs-utils:NFS服务的主程序,包括rpc.nfsdrpc.mountd
  • rpcbind:管理端口映射

注:nfs-utils软件包中含有rpcbind,只需安装nfs-utils即可。

启动服务

#先启动RPC服务
[root@nfs01 ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@nfs01 ~]# /etc/init.d/rpcbind status
rpcbind (pid  1562) is running...
#查看RPC端口映射关系
[root@nfs01 ~]# 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
#后启动NFS服务
[root@nfs01 ~]# /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  ]
[root@nfs01 ~]# /etc/init.d/nfs status
rpc.svcgssd is stopped
rpc.mountd (pid 1623) is running...
nfsd (pid 1639 1638 1637 1636 1635 1634 1633 1632) is running...
rpc.rquotad (pid 1618) is running...
#查看端口映射关系,多出NFS服务端口。
[root@nfs01 ~]# 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
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  32455  mountd
    100005    1   tcp  26030  mountd
    100005    2   udp  14968  mountd
    100005    2   tcp  30778  mountd
    100005    3   udp  59967  mountd
    100005    3   tcp  26265  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  31414  nlockmgr
    100021    3   udp  31414  nlockmgr
    100021    4   udp  31414  nlockmgr
    100021    1   tcp  11059  nlockmgr
    100021    3   tcp  11059  nlockmgr
    100021    4   tcp  11059  nlockmgr
------------------------------------------------------------
Q:如果先启动nfs服务或者未启动rpc服务,会出现如下错误
[root@nfs01 ~]# showmount -e localhost
clnt_create: RPC: Program not registered
Q1:如果先启动nfs服务,再启动rpc服务,会出现如下错误
[root@nfs01 ~]# /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服务?NFS服务的端口是变化的,通过RPC服务来管理端口映射关系,提供给客户端NFS服务的端口信息来访问共享资源。

进程文件说明

[root@nfs01 ~]# ps -ef|egrep "nfs|rpc"
rpc       1562     1  0 03:22 ?        00:00:00 rpcbind
root      1609     2  0 03:23 ?        00:00:00 [rpciod/0]
root      1618     1  0 03:23 ?        00:00:00 rpc.rquotad
root      1623     1  0 03:23 ?        00:00:00 rpc.mountd
root      1630     2  0 03:23 ?        00:00:00 [nfsd4]
root      1631     2  0 03:23 ?        00:00:00 [nfsd4_callbacks]
root      1632     2  0 03:23 ?        00:00:00 [nfsd]
root      1633     2  0 03:23 ?        00:00:00 [nfsd]
root      1634     2  0 03:23 ?        00:00:00 [nfsd]
root      1635     2  0 03:23 ?        00:00:00 [nfsd]
root      1636     2  0 03:23 ?        00:00:00 [nfsd]
root      1637     2  0 03:23 ?        00:00:00 [nfsd]
root      1638     2  0 03:23 ?        00:00:00 [nfsd]
root      1639     2  0 03:23 ?        00:00:00 [nfsd]
root      1670     1  0 03:23 ?        00:00:00 rpc.idmapd
  • nfsd:rpc.nfsd的进程,主进程,管理客户端是否能够登入服务端。
  • mountd:rpc.mountd的进程,管理挂载,包括权限、用户认证等
  • rpc.idmapd:名字映射进程

创建共享目录

[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# ls -ld /data  
drwxr-xr-x. 2 root root 4096 Apr 28 04:32 /data
#将目录拥有者改为nfsnobody
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Apr 28 04:32 /data
-----------------------------------------------------------
Q2:如果没有创建目录,客户端会出现如下错误
[root@web01 mnt]# touch {1..5}
touch: cannot touch `1': No such file or directory
touch: cannot touch `2': No such file or directory
touch: cannot touch `3': No such file or directory
touch: cannot touch `4': No such file or directory
touch: cannot touch `5': No such file or directory
Q3:服务端共享目录丢失,客户端卸载会出现如下错误:
[root@web01 ~]# umount /mnt
umount.nfs: /mnt: device is busy
umount.nfs: /mnt: device is busy
Q4:如果没有给nfsnobody权限,会出现如下错误
[root@web01 ~]# ll /mnt
total 0
-rw-r--r-- 1 root root 0 Apr 28 04:50 1
-rw-r--r-- 1 root root 0 Apr 28 04:50 2
[root@web01 ~]# rm -f /mnt/1 
rm: cannot remove `/mnt/1': Permission denied

配置共享

[root@nfs01 ~]# vim /etc/exports 
/data 172.16.1.0/24(rw,sync)
"/etc/exports" 1L, 29C written                                     
[root@nfs01 ~]# 
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync)
#重启NFS服务
[root@nfs01 ~]# /etc/init.d/nfs reload
#查看exports输出列表
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24
Q5:如果/etc/exports配置有问题,会出现如下错误
[root@nfs01 ~]# /etc/init.d/nfs reload
exportfs: No options for /data 172.16.1.0/24: suggest 172.16.1.0/24(sync) to avoid warning
exportfs: No host name given with /data (rw,sync), suggest *(rw,sync) to avoid warning

注:/etc/exports文件默认是存在的,但是空的,需要自行设置。
文件格式可以使用man exports查看说明。

共享目录 客户端地址 权限
data 172.16.1.0(24) rw,sync

权限说明

  • rw:读写
  • ro:只读
  • sync:同步到磁盘
  • async:异步到磁盘
  • all_aquash:压缩用户
  • anonuid:配置匿名uid
  • anongid:配置匿名gid
    注:可以通过/var/lib/nfs/etab查看NFS配置参数

开机自启动

[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig --list|egrep -w "rpcbind|nfs"
nfs         0:off   1:off   2:on    3:on    4:on    5:on    6:off
nfs-rdma    0:off   1:off   2:off   3:off   4:off   5:off   6:off
rpcbind     0:off   1:off   2:on    3:on    4:on    5:on    6:off

注:chkconfig自动将rpcbind服务开机顺序设为13,将nfs服务开机顺序设为30.也可以将命令放入到/etc/rc.local中,但是要启动netfs服务。linux开机默认是先启动挂载,后启动网卡,但是NFS服务是网络服务,必须先启动网卡才能挂载上去。也可以调整开机顺序,不建议。

小结
先启动RPC服务,再启动NFS服务。
默认配置文件/etc/exports
注意开机启动顺序,使用chkconfig。

客户端

安装软件

[root@web01 ~]# rpm -qa nfs-utils
nfs-utils-1.2.3-64.el6.x86_64
#如果没有,使用yum安装。
yum install nfs-utils -y
rpm -qa nfs-utils

启动服务

#客户端只需要启动rpcbind服务
[root@web01 ~]# /etc/init.d/rpcbind start
[root@web01 ~]# /etc/init.d/rpcbind status
rpcbind (pid  1327) is running...

查看共享资源

[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

挂载共享目录

[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
#查看挂载信息
[root@web01 ~]# mount
/dev/sda3 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)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
172.16.1.31:/data on /mnt type nfs (rw,vers=4,addr=172.16.1.31,clientaddr=172.16.1.8)
[root@web01 ~]# tail -1 /proc/mounts 
172.16.1.31:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.8,minorversion=0,local_lock=none,addr=172.16.1.31 0 0

注:查看挂载信息最好不要使用df,有可能会卡住。可以使用mount/proc/mounts

测试读写

[root@web01 mnt]# touch {1..5}
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 28 04:32 1
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 28 04:32 2
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 28 04:32 3
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 28 04:32 4
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 28 04:32 5
[root@web01 mnt]# echo 4 >4
[root@web01 mnt]# cat 4    
4

开机自启动

[root@web01 mnt]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local 
[root@web01 mnt]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data /mnt

小结
只要启动RPC服务
开机自启动

NFS服务一般结合inotify或者sersync等实时备份,解决单点问题。

作者:kaliylinux
出处:http://www.cnblogs.com/kaliy

posted @ 2016-04-28 18:47  warkly  阅读(277)  评论(0编辑  收藏  举报