一、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