欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 27_03 _nfs服务 有大用

nfs: Network File System 网络文件系统

ext3, ext2: Kernel Space
mke2fs: 用户空间,文件系统内管理工具

ext2,ext3.ko


NFS:(network file system)网络文件系统 

映射到内存 

image.png



image.png


过程调用 

函数调用

本地过程调用 local procedure call

image.png


image.png




image.png



LPC:  local procedure call  本地过程调用

PRC:  remote procedure call  远程过程调用



stub调用,存根调用,本身就是PRC的客户端程序


服务器端的叫  rpc server ,仅仅是用于封装网络报文

image.png


第一种工作机制:rpc 把请求转发给 文件系统服务器

image.png


第二种工作机制:  文件系统的服务器端也可以工作在网络上,只是 初始化时 (刚开始时) 它不接受报文(仍然是rpc服务器端接受报文)

初始化完成后,stub存根直接把请求发给文件系统服务器端,


nfs 就是工作在第二种机制上,


linux:提供rpc服务的程序,,Portmap: 111/tcp 111/udp


image.png



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格式的报文

image.png




lpc 两个进程间通信,或进程与内核通信

image.png



rpc 两个主机通信 (下图未必精确,大意是如此)


image.png




nfs工作原理:不是一种服务,只是一种文件系统,

需要借助于网络进行工作


image.png



NFS系统本身是一个文件系统,又是一个协议

  Sun公司开发的

    NFSv2,NFSv3,NFSv4

红帽5上 v3版本,,,红帽6上 v4版本



nfs 不建议在互联网上使用,因为不安全

nfs 是一种非常好的 用于在内网的各主机之间实现文件共享的服务

image.png



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:端口会变

    半随机的


image.png



nfs 文件系统提供锁

分布式文件锁,这时候就需要 nfslock 这样的服务来提供


假如锁的那个客户端崩溃了,,,,然后那个客户端又恢复了,怎么办? 释放锁,继续锁?

image.png



一般的做法是把 磁盘挂载到某一个目录下,然后再把这个目录共享出去,换句话说,一般不是共享磁盘



[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)

..........................

image.png


/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 表示同步


以井号(#) 开头的都是注释行



image.png






想把 /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

image.png


显示 这台电脑上共享的 目录,,共享的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

image.png



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

image.png

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用户,权限最小

image.png

image.png



把所有的用户账号映射为 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挂载远程的时候,如果 远程主机未开机(或者连不上),就跳过这个挂载,否则的话,开机自动挂载时本身自己就开不了机了

image.png


在客户端 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 ~]#


image.png


image.png


客户端先访问rpc ,rpc让它找mountd

mountd 目的是验证客户端身份,然后发句柄令牌

客户端拿着令牌去访问 nfs 服务器

image.png



让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客户端 能不能访问一模一样的东西

image.png



普通分类: