天天看点

【网络文件共享】02、NFS服务基础

一、NFS

1、NFS简介

NFS:Network File System

   NFS协议用于unix/linux系统之间通过网络进行文件共享,用户可以把网络中NFS服务器提供的共享目录挂载到本地文件目录中,可以象对本地文件系统一样操作NFS文件系统中的内容。

   NFS协议在内核空间中实现,但需要依赖于用户空间中的功能;

   NFS不适用于windows,只用于unix/linux主机之间进行文件共享;

   NFS是古老的协议了,到了Linux不断更新和完善,从以前只支持UDP,现在支持TCP,现在到了V4版本。不过还是不安全,最大的毛病就是不需要身份认证(可以做IP认证,借助Kerberos也可以做身份认证但很麻烦也很少用到),也只建议在内网用一下;

   NFS的工作机制严重依赖于RPC:Remote Procedure Call Protocol 远程过程调用协议

RPC的工作机制:

   RPC也可以看成一个服务框架,能够帮其它的进程监听在套接字上(和xinetd类似),并将进程的服务提供给远程用户,

NIS:Network Infomation Service  网络信息服务

   也是SUN公司开发的,和kerberos类似也可以实现帐号(用户ID)映射和集中式用户认证

LDAP:取代NIS的协议,认证时虽然传输也是明文,但可以基于ssl工作

2、RPC服务

   NFS也是C/S架构,NFS的客户端和服务端都需要依赖于rpcbind,rpcbind监听UDP和TCP的111端口

查看本机或远程主机的rpc服务信息:

[root@Node5 ~]# rpcinfo
   program version netid     address                service    owner
    100000    4    tcp6      ::.0.111               portmapper superuser
    100000    3    tcp6      ::.0.111               portmapper superuser
    100000    4    udp6      ::.0.111               portmapper superuser
    100000    3    udp6      ::.0.111               portmapper superuser
    100000    4    tcp       0.0.0.0.0.111          portmapper superuser
    100000    3    tcp       0.0.0.0.0.111          portmapper superuser
    100000    2    tcp       0.0.0.0.0.111          portmapper superuser
    100000    4    udp       0.0.0.0.0.111          portmapper superuser
    100000    3    udp       0.0.0.0.0.111          portmapper superuser
    100000    2    udp       0.0.0.0.0.111          portmapper superuser
    100000    4    local     /var/run/rpcbind.sock  portmapper superuser
    100000    3    local     /var/run/rpcbind.sock  portmapper superuser
    100024    1    udp       0.0.0.0.182.117        status     29
    100024    1    tcp       0.0.0.0.178.51         status     29
    100024    1    udp6      ::.147.194             status     29
    100024    1    tcp6      ::.178.119             status     29
    
[root@Node5 ~]# rpcinfo -p
   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
    100024    1   udp  46709  status
    100024    1   tcp  45619  status      

  各基于RPC提供监听服务的进程,在启动时要向RPC注册监听在某端口上,rpc会从各未使用的端口中挑一个给此进程监听,即半随机(80端口没使用时,可能会挑选80给进程监听)。

三、NFS的实现

1、NFS的安装

   NFS本身只提供文件系统,并不负责验证客户端的身份(不验证用户的IP和帐户),也不完成将用户的ID映射为本机的用户ID,这些功能需要依赖于各子组件完成。

NFS由内核实现,服务器端只需安装各子组件就可以:

  服务器端安装程序:

[root@Node5 ~]# yum install nfs-utils

[root@Node5 ~]# rpm -ql nfs-utils
/etc/nfsmount.conf
/etc/rc.d/init.d/nfs         
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/nfs_cache_getent
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
/usr/share/doc/nfs-utils-1.2.3

/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab      

启动nfs服务:

  因为nfs服务依赖于rpcbind分配端口所以rpcbind一定要优先于nfs启动

[root@Node5 ~]# service nfs start
Starting NFS services:                                     [  OK  ]  
    # 主服务进程,文件读写
Starting NFS quotas:                                       [  OK  ]  # 磁盘配额进程
Starting NFS mountd:                                       [  OK  ]
    # 挂载守护进程,负责客户端来源认证的进程;等待客户端挂载进程
Starting NFS daemon:                                       [  OK  ]  # 服务端进程
Starting RPC idmapd:                                       [  OK  ]  
    # 用户ID号映射进程

[root@Node5 ~]# rpcinfo -p
   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
    100024    1   udp  40067  status
    100024    1   tcp  38601  status
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  36049  mountd
    100005    1   tcp  35121  mountd
    100005    2   udp  34402  mountd
    100005    2   tcp  49542  mountd
    100005    3   udp  60394  mountd
    100005    3   tcp  44809  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  60587  nlockmgr      # 锁管理器
    100021    3   udp  60587  nlockmgr
    100021    4   udp  60587  nlockmgr
    100021    1   tcp  34744  nlockmgr
    100021    3   tcp  34744  nlockmgr
    100021    4   tcp  34744  nlockmgr
[root@Node5 ~]# ps aux|grep nfs
root      34060  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd4]
root      34061  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd4_callbacks]
root      34062  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34063  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34064  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34065  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34066  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34067  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34068  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34069  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34101  0.0  0.0 103252   828 pts/1    S+   08:15   0:00 grep nfs      

   NFS监听在UDP和TCP的2049端口,不会发生变化,其它各辅助进程监听的端口号重启会发生变化,也可以修改服务脚本配置文件中的某参数来实现。

三、nfs的配置

  nfs的共享目录配置文件在/etc/exports

1、设置NFS服务器共享目录/etc/exports

语法格式:

   文件系统  客户端1(文件系统导出属性)   客户端2(文件系统到处属性)

 客户端可以使用的格式:  # 不写则为全部主机

    IP:192.168.10.4

    Hostname:*.magedu.com

    Network:192.168.10.0/255.255.255.0 或 192.168.10.0/24

 文件系统导出属性有: 多各属性用逗号分隔

    ro:只读,默认

    rw:读写

    async:异步,默认

    sync:同步,性能差

    root_squash:压缩root用户,基于imapd,root用户通过网络访问时将映射为nfsnobody用户,默认属性

    no_root_squash:不压缩root用户,危险,

    all_squash:映射所有用户,默认映射为nfsnobody,如果没有启用这个选项,客户端创建文件时,那么在服务器端显示文件的属主、属组和客户端用户 UID一样的用户,如果没有该UID则显示nobody。

    anonuid,anongid:指定匿名用户映射为该UID和GID,这个命令要和上面的一起使用

    nohide:是否可以交叉使用nfs,不隐藏目录下的nfs,不安全

    crossmnt:运行交叉使用nfs

showmount:  showmount命令也是由nfs-utils包提供

 -e:在nfs客户端执行,探查某主机所导出的nfs文件系统,使用格式:showmount -e Server_IP

 -d:在nfs服务器端执行,显示哪个导出的文件系统已经被至少一个客户端挂载使用了,测试不显示

 -a:在nfs服务器端显示所有的挂载会话,测试不显示

[root@Node5 ~]# showmount -e localhost
Export list for localhost:
/data 192.168.10.0/24
[root@Node5 ~]# showmount -d localhost
Directories on localhost:
[root@Node5 ~]# showmount -a localhost
All mount points on localhost:      

例:

  允许192.168.10.0网络中所有主机以读写权限访问/data目录

[root@Node5 data]# cat /etc/exports
/data 192.168.10.0/24(rw)
[root@Node5 data]# service nfs restart   # 修改配置文件后需要重启,但此时如果有客户端在读写,就会造成丢失      

客户端挂载使用:

  客户端也需要安装nfs-utils

[root@Node4 ~]# mount -t nfs 192.168.10.5:/data /mnt
[root@Node4 ~]# ls /mnt
test1  test_file
[root@Node4 ~]# mount
/dev/sda2 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)
192.168.10.5:/data on /mnt type nfs (rw,vers=4,addr=192.168.10.5,clientaddr=192.168.10.4)      

exportfs   重新输出共享目录格式

 -a:操作所有文件系统

 -ra:重新导出所有文件系统

 -ua:取消到处的所有文件系统

 -v:显示详细信息

开机时自动挂载NFS共享:

写入/etc/fstab

192.168.10.5:/data /mnt nfs defaults 0 0      
192.168.10.5:/data /mnt nfs defaults,_netdev 0 0