欢迎各位兄弟 发布技术文章
这里的技术是共享的
nfs: Network File System 网络文件系统
ext3, ext2: Kernel Space
mke2fs: 用户空间,文件系统内管理工具
ext2,ext3.ko
NFS:(network file system)网络文件系统
映射到内存
过程调用
函数调用
本地过程调用 local procedure call
LPC: local procedure call 本地过程调用
PRC: remote procedure call 远程过程调用
stub调用,存根调用,本身就是PRC的客户端程序
服务器端的叫 rpc server ,仅仅是用于封装网络报文
第一种工作机制:rpc 把请求转发给 文件系统服务器
第二种工作机制: 文件系统的服务器端也可以工作在网络上,只是 初始化时 (刚开始时) 它不接受报文(仍然是rpc服务器端接受报文)
初始化完成后,stub存根直接把请求发给文件系统服务器端,
nfs 就是工作在第二种机制上,
linux:提供rpc服务的程序,,Portmap: 111/tcp 111/udp
nfs 本身需要监听在某个套接字上 (某个端口上)
RPC:编程技术,主要是用于实现简化分布式应用程序的开发,如果需要在两个主机上的进程进行通信, 客户端,服务器端必须要请求处理 网络请求,网络响应等等,RPC简化开发难度,在用户请求的下方建立了一个框架,这个框架能够通过网络进行通信
(程序开发远程调用的时候,不用下功夫处理网络报文的封装了)
PRC: C(客户端 )-->RPC C (RPC的客户端)--> RPC S (RPC的服务器端)-->S (真正处理请求的服务器端)
最开始的C端 ,与 最结束的S端,不需要处理它们之间的报文的理解了
因为 RPC C (RPC的客户端)--> RPC S (RPC的服务器端) 将数据报文格式隐藏起来了,
NFS客户端和服务器交换数据的时候
NFS Client --> NFS Server
web
Browser-->Server html格式的,
RPC:二进制格式,文本格式(XMLRPC)-->SOAP(简单对像访问协议) (Simple Object Access Protocal)
RPC只是一种编程技术,只是一种协议,用于实现协议的,是Portmap,这是linux上实现RPC服务的软件,
RPC可基于http来实现,借助于http,可以传输xml格式的报文
lpc 两个进程间通信,或进程与内核通信
rpc 两个主机通信 (下图未必精确,大意是如此)
nfs工作原理:不是一种服务,只是一种文件系统,
需要借助于网络进行工作
NFS系统本身是一个文件系统,又是一个协议
Sun公司开发的
NFSv2,NFSv3,NFSv4
红帽5上 v3版本,,,红帽6上 v4版本
nfs 不建议在互联网上使用,因为不安全
nfs 是一种非常好的 用于在内网的各主机之间实现文件共享的服务
NFS: Unix/Linux 之间 有点类似于windows的网上邻居
一般不能与 windows交互
服务器端: nfs-utils
[root@mail ~]# rpm -ql nfs-utils
/etc/idmapd.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/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/rpc.lockd
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/nhfsgraph
/usr/sbin/nhfsnums
/usr/sbin/nhfsrun
/usr/sbin/nhfsstone
/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/share/doc/nfs-utils-1.0.9
/usr/share/doc/nfs-utils-1.0.9/ChangeLog
/usr/share/doc/nfs-utils-1.0.9/INSTALL
/usr/share/doc/nfs-utils-1.0.9/KNOWNBUGS
/usr/share/doc/nfs-utils-1.0.9/Makefile
/usr/share/doc/nfs-utils-1.0.9/Makefile.am
/usr/share/doc/nfs-utils-1.0.9/Makefile.in
/usr/share/doc/nfs-utils-1.0.9/NEW
/usr/share/doc/nfs-utils-1.0.9/README
/usr/share/doc/nfs-utils-1.0.9/THANKS
/usr/share/doc/nfs-utils-1.0.9/TODO
/usr/share/man/man5/exports.5.gz
/usr/share/man/man5/idmapd.conf.5.gz
/usr/share/man/man5/nfs.5.gz
/usr/share/man/man7/nfsd.7.gz
/usr/share/man/man8/exportfs.8.gz
/usr/share/man/man8/gssd.8.gz
/usr/share/man/man8/idmapd.8.gz
/usr/share/man/man8/lockd.8.gz
/usr/share/man/man8/mount.nfs.8.gz
/usr/share/man/man8/mount.nfs4.8.gz
/usr/share/man/man8/mountd.8.gz
/usr/share/man/man8/mountstats.8.gz
/usr/share/man/man8/nfsd.8.gz
/usr/share/man/man8/nfsiostat.8.gz
/usr/share/man/man8/nfsstat.8.gz
/usr/share/man/man8/nhfsgraph.8.gz
/usr/share/man/man8/nhfsnums.8.gz
/usr/share/man/man8/nhfsrun.8.gz
/usr/share/man/man8/nhfsstone.8.gz
/usr/share/man/man8/rpc.gssd.8.gz
/usr/share/man/man8/rpc.idmapd.8.gz
/usr/share/man/man8/rpc.lockd.8.gz
/usr/share/man/man8/rpc.mountd.8.gz
/usr/share/man/man8/rpc.nfsd.8.gz
/usr/share/man/man8/rpc.statd.8.gz
/usr/share/man/man8/rpc.svcgssd.8.gz
/usr/share/man/man8/rpcdebug.8.gz
/usr/share/man/man8/showmount.8.gz
/usr/share/man/man8/statd.8.gz
/usr/share/man/man8/svcgssd.8.gz
/usr/share/man/man8/umount.nfs.8.gz
/usr/share/man/man8/umount.nfs4.8.gz
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
[root@mail ~]#
做成nfs服务器的话 只要 service nfs start
会启动好几个进程
[root@mail ~]# service nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
[root@mail ~]#
linux 上 rpc 的实现,就是 portmap,确保它是运行的
[root@mail ~]# service portmap status
portmap (pid 3414) 正在运行...
[root@mail ~]#
portmap 是监听在 111 端口的
[root@mail ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 3845/./hpiod
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:54053 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:678 0.0.0.0:* LISTEN 3464/rpc.statd
tcp 0 0 0.0.0.0:679 0.0.0.0:* LISTEN 16185/rpc.rquotad
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 3858/php-fpm
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4040/mysqld
tcp 0 0 0.0.0.0:718 0.0.0.0:* LISTEN 16227/rpc.mountd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3414/portmap
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3928/vsftpd
tcp 0 0 192.168.1.85:53 0.0.0.0:* LISTEN 3785/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 3785/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3879/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3893/cupsd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4234/master
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3785/named
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 3850/python
tcp 0 0 :::995 :::* LISTEN 4095/dovecot
tcp 0 0 :::110 :::* LISTEN 4095/dovecot
tcp 0 0 :::80 :::* LISTEN 4271/httpd
tcp 0 0 :::22 :::* LISTEN 3879/sshd
tcp 0 0 ::1:953 :::* LISTEN 3785/named
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
udp 0 0 0.0.0.0:40066 0.0.0.0:* 4499/avahi-daemon
udp 0 0 0.0.0.0:672 0.0.0.0:* 3464/rpc.statd
udp 0 0 0.0.0.0:675 0.0.0.0:* 3464/rpc.statd
udp 0 0 0.0.0.0:676 0.0.0.0:* 16185/rpc.rquotad
udp 0 0 192.168.1.85:53 0.0.0.0:* 3785/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 3785/named
udp 0 0 0.0.0.0:55352 0.0.0.0:* -
udp 0 0 0.0.0.0:715 0.0.0.0:* 16227/rpc.mountd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 4499/avahi-daemon
udp 0 0 0.0.0.0:111 0.0.0.0:* 3414/portmap
udp 0 0 0.0.0.0:631 0.0.0.0:* 3893/cupsd
udp 0 0 :::34728 :::* 4499/avahi-daemon
udp 0 0 :::5353 :::* 4499/avahi-daemon
[root@mail ~]#
可以监听本地主机上 rpc 所监听的端口
[root@mail ~]# rpcinfo -p localhost
程序 版本 协议 端口
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 675 status
100024 1 tcp 678 status
100011 1 udp 676 rquotad
100011 2 udp 676 rquotad
100011 1 tcp 679 rquotad
100011 2 tcp 679 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 55352 nlockmgr
100021 3 udp 55352 nlockmgr
100021 4 udp 55352 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 54053 nlockmgr
100021 3 tcp 54053 nlockmgr
100021 4 tcp 54053 nlockmgr
100005 1 udp 715 mountd
100005 1 tcp 718 mountd
100005 2 udp 715 mountd
100005 2 tcp 718 mountd
100005 3 udp 715 mountd
100005 3 tcp 718 mountd
[root@mail ~]#
[root@mail ~]# service nfs stop
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
[root@mail ~]# rpcinfo -p localhost
程序 版本 协议 端口
100000 2 tcp 111 portmapper # rpc服务自己的
100000 2 udp 111 portmapper # rpc服务自己的
100024 1 udp 675 status #另外的应用程序
100024 1 tcp 678 status #另外的应用程序
[root@mail ~]#
[root@mail ~]# service nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
[root@mail ~]#
启动 nfs 后 ,nfs 会向 portmap 注册使用了一堆端口
[root@mail ~]# rpcinfo -p localhost
程序 版本 协议 端口
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 675 status
100024 1 tcp 678 status
100011 1 udp 883 rquotad
100011 2 udp 883 rquotad
100011 1 tcp 886 rquotad
100011 2 tcp 886 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 42965 nlockmgr
100021 3 udp 42965 nlockmgr
100021 4 udp 42965 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 35482 nlockmgr
100021 3 tcp 35482 nlockmgr
100021 4 tcp 35482 nlockmgr
100005 1 udp 898 mountd
100005 1 tcp 901 mountd
100005 2 udp 898 mountd
100005 2 tcp 901 mountd
100005 3 udp 898 mountd
100005 3 tcp 901 mountd
[root@mail ~]#
nfs: nfsd(主服务)(nfs服务,文件传输的进程),mounted(接受客户端的挂载请求)(挂载),quotad(限定客户端在本地能够使用多大磁盘空间)(配额)
nfsd: 2049/tcp ,2049/udp 端口不变,是注册使用的
mounted:端口会变
quotad:端口会变
半随机的
nfs 文件系统提供锁
分布式文件锁,这时候就需要 nfslock 这样的服务来提供
假如锁的那个客户端崩溃了,,,,然后那个客户端又恢复了,怎么办? 释放锁,继续锁?
一般的做法是把 磁盘挂载到某一个目录下,然后再把这个目录共享出去,换句话说,一般不是共享磁盘
[root@mail ~]# service nfs status
rpc.mountd (pid 16410) 正在运行...
nfsd (pid 16407 16406 16405 16404 16403 16402 16401 16400) 正在运行...
rpc.rquotad (pid 16394) 正在运行...
[root@mail ~]#
确保 nfs 开机自动启动
[root@mail ~]# chkconfig nfs on
[root@mail ~]# chkconfig --list | grep nfs
nfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
nfslock 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
[root@mail ~]#
nfs 本身所实现文件输出的时候,所使用的配置文件
/etc/exports
我们只需要 在这个文件中定义共享哪一个目录出去,能够让客户端挂载并直接像使用本地文件系统一样来使用就可以了
[root@mail ~]# man exports
..........................
exports - NFS file systems being exported (for Kernel based NFS)
..........................
/etc/export
/path/to/somedir CLIENT_LIST
多个客户端之间使用空白字符分隔
每个客户端后面必须跟一个小括号(不能有空白字符),里面定义了此客户端的访问特性,如访问权限等
171.16.0.0/16(ro,async) 192.16.0.0/24(rw,sync)
ro 表示只读, rw表示读写
async 表示异步,sync 表示同步
以井号(#) 开头的都是注释行
想把 /shared 目录共享出去
[root@mail ~]# mkdir /shared
[root@mail ~]# vim /etc/exports
/shared 192.168.1.0/24(ro)
想生效,重启 nfs 服务器
[root@mail ~]# service nfs restart
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
[root@mail ~]#
showmount
[root@mail ~]# man showmount
显示 这台电脑上共享的 目录,,共享的ip(段)
对于服务器 192.168.1.85 本机上
[root@mail ~]# showmount -e 192.168.1.85
Export list for 192.168.1.85:
/shared 192.168.1.0/24
[root@mail ~]# showmount -e (对于本机加不加ip都无所谓)
Export list for mail.magedu.com:
/shared 192.168.1.0/24
[root@mail ~]#
[root@mail ~]#
[root@mail ~]#
[root@mail ~]#
[root@mail ~]#
在另一台主机客户端上 192.168.1.15
下面命令报错
[root@mail ~]# showmount -e 192.168.1.85
mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive
[root@mail ~]#
在 192.168.1.85 上关掉防火墙就可以了
[root@mail ~]# iptables -F
[root@mail ~]#
在另一台主机客户端上 192.168.1.15
[root@mail ~]# showmount -e 192.168.1.85
Export list for 192.168.1.85:
/shared 192.168.1.0/24
[root@mail ~]#
showmount -e NFS_SERVER: 查看NFS服务器上共享(导出的)的各文件系统
NFS_SERVER就是IP地址(或主机名)吧
客户端使用mount命令挂载
mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT /PATH/TO.SOMEWHERE
NFS_SERVER:/PATH/TO/SOME_EXPORT 相当于设备,远程的 (NFS_SERVER指的是ip或者域名吧)
/PATH/TO.SOMEWHERE 相当于挂载点(本地的)
在客户端 192.168.1.15 上
[root@mail ~]# mkdir /mnt/nfs
[root@mail ~]# mount -t nfs 192.168.1.85:/shared /mnt/nfs
[root@mail ~]#
[root@mail ~]# cd /mnt/nfs
[root@mail nfs]# ls
[root@mail nfs]#
在服务器 192.168.1.85 上
[root@mail ~]# cp /etc/fstab /shared
[root@mail ~]#
在客户端 192.168.1.15 上 可以看到 fstab 了
[root@mail nfs]# ls
fstab
[root@mail nfs]# cp fstab /tmp
cp:是否覆盖“/tmp/fstab”? y
[root@mail nfs]#
[root@mail nfs]# rm fstab
rm:是否删除有写保护的 一般文件 “fstab”? y
rm: 无法删除 “fstab”: 只读文件系统 #(导出时就是ro 只读的)
[root@mail nfs]#
在服务器 192.168.1.85 上
[root@mail ~]# showmount -a 192.168.1.85 # 查看本机上的共享有哪些客户端挂载了
All mount points on 192.168.1.85:
192.168.1.15:/shared
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail nfs]# showmount -a 192.168.1.85 #在客户端上也可以查看 192.168.1.85 上的共享 被哪些客户端挂载了
All mount points on 192.168.1.85:
192.168.1.15:/shared
[root@mail nfs]#
showmount -a NFS_SERVER: 查看NFS服务器所有被挂载的文件系统及其挂载的客户端对应关系列表
NFS_SERVER就是IP地址(或主机名)吧
[root@mail nfs]# man showmount
showmount -d NFS_SERVER: 显示NFS服务器所有导出的文件系统中被客户端挂载了的文件系统列表 (仅仅显示被挂载了的,,导出的不显示)
NFS_SERVER就是IP地址(或主机名)吧
在服务器 192.168.1.85 上
[root@mail ~]# vim /etc/exports
/shared 192.168.1.0/24(ro)
/var/ftp 192.168.1.0/24(ro)
[root@mail ~]# service nfs restart
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail nfs]# showmount -d 192.168.1.85 # 看到只有 /shared 被挂载了
Directories on 192.168.1.85:
/shared
[root@mail nfs]#
[root@mail nfs]# showmount -a 192.168.1.85
All mount points on 192.168.1.85:
192.168.1.15:/shared
[root@mail nfs]#
不用重启,重新读取配置文件,这里不使用 service nfs reload,而是使用 exportfs
[root@mail ~]# man exportfs
OPTIONS
-a Export or unexport all directories.
exportfs 命令:
-a: 跟 -r 或 -u 选项 同时使用,表示重新挂载所有文件系统或取消导出所有文件系统(目录)
-r:重新导出 Reexport
-u:取消导出 Unexport
-v: 显示详细信息 Be verbose
在服务器 192.168.1.85 上
[root@mail ~]# vim /etc/exports
/shared 192.168.1.0/24(ro)
#/var/ftp 192.168.1.0/24(ro)
在客户端 192.168.1.15 上
[root@mail nfs]# showmount -e 192.168.1.85 #还能看到 /var/ftp
Export list for 192.168.1.85:
/shared 192.168.1.0/24
/var/ftp 192.168.1.0/24
[root@mail nfs]#
在服务器 192.168.1.85 上
[root@mail ~]# exportfs -rav #-r重新导出,-a表示重新导出所有 -v显示这个过程
exporting 192.168.1.0/24:/shared
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail nfs]# showmount -e 192.168.1.85 #此时看不到 /var/ftp
Export list for 192.168.1.85:
/shared 192.168.1.0/24
[root@mail nfs]#
在服务器 192.168.1.85 上
[root@mail ~]# exportfs -ua # 取消导出所有的文件系统
在客户端 192.168.1.15 上
[root@mail nfs]# showmount -e 192.168.1.85 # 任何一个文件系统都没有导出了
Export list for 192.168.1.85:
[root@mail nfs]#
[root@mail nfs]# ls #此时无权限了 (虽然此时己挂载 ,但是仍然访问不到)
ls: .: 权限不够
[root@mail nfs]#
[root@mail nfs]# umount /mnt/nfs
umount: /mnt/nfs: device is busy
umount: /mnt/nfs: device is busy
[root@mail nfs]# cd # 只能到其它目录下卸载了
[root@mail ~]# umount /mnt/nfs
[root@mail ~]#
文件系统导出属性
ro:只读
rw:读写
sync: 同步,性能会差的
async:异步
root_squash:将root用户映射为来宾账号,
no_root_squash:将root用户映射为root账号(很危险),因为别人的root进来就是拥有你的root的权限了
all_squash:客户端来的所有用户都转为来宾账号,这个最安全
anonuid,anongid,映射为指定来宾账号的的uid和gid anonuid(anonymous匿名的意思)
可以实现把所有的客户端的用户都映射为hadoop,或nobody,都可以
在服务器 192.168.1.85 上
[root@mail ~]# setfacl -m u:hadoop:rwx /shared/ #让hadoop有读写执行权限
[root@mail ~]#
[root@mail ~]# su - hadoop
[hadoop@mail ~]$
[hadoop@mail shared]$ ls -l
总计 12
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
[hadoop@mail shared]$
在客户端 192.168.1.15 上
[root@mail ~]# groupadd -g 503 openstack1
[root@mail ~]# useradd -g 503 -u 503 openstack1 (好像是直接 useradd -u 503 openstack1 就会自动建组 openstatck1)
[root@mail ~]#
在服务器 192.168.1.85 上
[root@mail ~]# exportfs -ra #(在root账户下)
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail ~]# mount -t nfs 192.168.1.85:/shared /mnt/nfs
[root@mail ~]#
[root@mail ~]# ls /mnt/nfs
a.hadoop fstab
[root@mail ~]#
[root@mail ~]# ls -l /mnt/nfs
总计 12
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
[root@mail ~]#
在服务器 192.168.1.85 上
[root@mail ~]# vim /etc/exports #让导出具有写权限
/shared 192.168.1.0/24(rw)
#/var/ftp 192.168.1.0/24(ro)
[root@mail ~]# exportfs -ra
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail ~]# su - openstack1
[openstack1@mail ~]$ cd /mnt/nfs/
[openstack1@mail nfs]$ pwd
/mnt/nfs
[openstack1@mail nfs]$ ls -la
总计 28
drwxrwxr-x+ 2 root root 4096 07-29 18:21 .
drwxr-xr-x 3 root root 4096 07-29 16:01 ..
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
[openstack1@mail nfs]$
[openstack1@mail nfs]$ pwd
/mnt/nfs
[openstack1@mail nfs]$
[openstack1@mail nfs]$ touch b.openstack
touch: 无法触碰 “b.openstack”: 权限不够
看到权限不够
如果 有客户机上 的 uid 与 gid (无论哪个用户) 只用uid和gid等于hadoop的uid和gid 它就相当于有权限操作了
在服务器 192.168.1.85 上
[root@mail ~]# ls /shared/ -l
总计 12
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
[root@mail ~]#
在客户端 192.168.1.15 上 此时 root用户身份
[root@mail ~]# cd /mnt/nfs/
You have new mail in /var/spool/mail/root
[root@mail nfs]# ls
a.hadoop fstab
[root@mail nfs]# ll
总计 12
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
[root@mail nfs]# rm a.hadoop
rm:是否删除有写保护的 一般空文件 “a.hadoop”? y
rm: 无法删除 “a.hadoop”: 权限不够 # 客户端上root用户身份权限不够
[root@mail nfs]#
nfs 默认情况下 ,客户端的 root 用户权限是不允许的,不允许具有服务器端上的root权限的
[root@mail ~]# man exports
root_squash 默认就是它 把客户端上的root 默认为nobody用户,权限最小
把所有的用户账号映射为 id为 510的用户
在服务器 192.168.1.85 上
[root@mail ~]# touch /shared/nfstest
[root@mail ~]# id nfstest
uid=510(nfstest) gid=510(nfstest) groups=510(nfstest) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@mail ~]# chown nfstest.nfstest /shared/nfstest
[root@mail ~]# vim /etc/exports
/shared 192.168.1.0/24(rw,all_squash,anonuid=510,anongid=510)
#/var/ftp 192.168.1.0/24(ro)
[root@mail ~]# exportfs -ra #不重启nfs,加载配置文件
[root@mail ~]#
[root@mail ~]# showmount -e 192.168.1.85
Export list for 192.168.1.85:
/shared 192.168.1.0/24
[root@mail ~]#
在客户端 192.168.1.15 上
[root@mail ~]# umount /mnt/nfs/
umount: /mnt/nfs/: not mounted
[root@mail ~]# mount -t nfs 192.168.1.85:/shared /mnt/nfs/
[root@mail ~]#
[root@mail ~]# cd /mnt/nfs/
[root@mail nfs]# ls
a.hadoop fstab nfstest
[root@mail nfs]#
[root@mail nfs]# ls -l #下面看到 uid,gid 510 ( 通通映射为 510 )了 , 在这里510用户没有写权限
总计 16
-rw-rw-r-- 1 hadoop hadoop 0 07-29 18:21 a.hadoop
-rw-r--r-- 1 root root 534 07-29 16:06 fstab
-rw-r--r-- 1 510 510 0 07-30 09:12 nfstest
[root@mail nfs]#
在客户端上开机自动挂载
在客户端 192.168.1.15 上
[root@mail nfs]# vim /etc/fstab #开机自动挂载 nfs
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
192.168.1.85:/shared /mnt/nfs nfs defaults 0 0
[root@mail nfs]# man mount
_rnetdev 作用就是当nfs挂载远程的时候,如果 远程主机未开机(或者连不上),就跳过这个挂载,否则的话,开机自动挂载时本身自己就开不了机了
在客户端 192.168.1.15 上
[root@mail nfs]# vim /etc/fstab #(/etc/fstab 最下面一行要稍微修改下)
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
192.168.1.85:/shared /mnt/nfs nfs defaults,_rnetdev 0 0
[root@mail nfs]# cd
[root@mail ~]# umount /mnt/nfs/
[root@mail ~]# mount -a
[root@mail ~]#
[root@mail ~]# mount
/dev/mapper/VolGroup00-LogVol00 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/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)
nfsd on /proc/fs/nfsd type nfsd (rw)
192.168.1.85:/shared on /mnt/nfs type nfs (rw,addr=192.168.1.85)
[root@mail ~]#
客户端先访问rpc ,rpc让它找mountd
mountd 目的是验证客户端身份,然后发句柄令牌
客户端拿着令牌去访问 nfs 服务器
让mountd和quotad等进程监听在固定端口,编辑配置文件 /etc/sysconfig/nfs
定义 nfs 几个服务的进程为固定端口
在服务器 192.168.1.85 上
[root@mail ~]# vim /etc/sysconfig/nfs
MOUNTD_PORT=892 # mountd监听端口
RQUOTAD_PORT=875 # 配额监听端口
LOCKD_TCPPORT=32803 #锁进程TCP监听端口
LOCKD_UDPPORT=32769 #锁进程UDP监听端口
[root@mail ~]# service nfs restart
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
[root@mail ~]#
看 rpc 相关的进程监听的端口
[root@mail ~]# rpcinfo -p localhost
程序 版本 协议 端口
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 682 status
100024 1 tcp 685 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
[root@mail ~]#
再重启
[root@mail ~]# service nfs restart
关闭 NFS mountd: [确定]
关闭 NFS 守护进程: [确定]
关闭 NFS quotas: [确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
Stopping RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
重启后 监听的端口不变
[root@mail ~]# rpcinfo -p localhost
程序 版本 协议 端口
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 682 status
100024 1 tcp 685 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
[root@mail ~]#
装两个 WebServer: LAMP
NFS服务端: 某一个LAMP 中 /var/www 共享出去,
NFS客户端:让另一个主机挂载,还挂载在 /var/www 目录下,(挂载NFSERVER:/var/www至本地的/var/www)
在 NFS服务端 安装一个phpmyadmin(discuz)
看在 NFS客户端 能不能访问一模一样的东西