NFS文件系统

  • 介绍一点之外的知识:
  • 任何可以执行的程序都是工作在用户空间的,内核空间的进程和程序都是由内核进程管理的,文件系统是做进内核文件系统一般是工作在内核空间的,包括NFS:
  • 文件系统是在内核空间提供的,当用户希望在文件系统上面写入数据时,需要借助于内核提供的系统调用,内核对于硬件的操作是通过内核提供的系统调用,也就是内核提供的函数,这个过程也成为过程或者函数调用,本地的文件系统通过本地的过程调用完成对于文件系统的操作,Local Procedure Call,如果需要在两个主机上面来完成,那么自身就需要完善网络模块,
  • RPC:Remote Procedure Call,远程过程调用,RPC客户端的STUB调用, 在进行程序开发时,需要包含特殊的头文件,来完成STUBRPC调用,RPCClient联系RPCServer端,RPCServer端,在完成过程调用之后,将结果返回给RPCClient端,RPC是为多个需要网络通信的程序,提供一个统一的框架;
  • RPC的工作机制:

    • 1.当内核发现某个请求是网络请求时,就会将这个请求转发给RPCClient;
    • 2.RPCClient主动连接RPCServer端,RPCServer处理之后将结果返回值;
    • RPCServer需要工作一个和RPCClient发起请求的对应的Server程序,这个程序也需要监听在某个套接字上面;RPCServer端对应应用程序的的套接字是随机的;两个应用程序可以通过StubClientStubServer来建立通信;还可以第一次通过StubServer端和Client的完成对于套接字的一次封装,之后的通信StubClient去连接监听套接字的对应的应用程序;通过上述的机制,对于监听的套接字只需要告诉给RPC而不需要告诉给客户端程序;
  • RPC是一种编程技术,主要用于实现简化分布式应用程序的开发;Client ---> RPC Client-----> RPC Server -----> Server;通过RPC的封装,Client和Server不再需要关注于报文的封装,RPC可以基于二进制格式或者基于文本格式(XMLRPC,跨主机的报文交换是通过HTTP协议来完成的;);

  • RPC只是一种协议,Linux上面的实现是Portmap,提供客户端以及服务器端,监听在111/tcp,111/udp;

  • NFS就是使用的就是RPC框架进行开发的的应用程序,所以NFSServer需要监听在某个套接字上面,然后项RPC注册使用的端口,RPCClient直接联系NFS注册的端口,NFS只是一种文件系统,在Client是通过NFS模块来完成,网络上面也是属于NFS的,但是对于Server提供的服务的仍然是本地的文件系统类型;

  • nfs:是一种网络文件系统,也是一种协议,由SUN开发;NFSv1:内部使用 NFSv2:公开;
  • nfs基于IP的验证机制,用户认证的功能是很薄弱的,假设NFSClientjerry,UID1000,NFSserver端的Tom用户的UID也是1000,那么这个文件在Sever上面就会被识别为1000;NFS不建议在互联网上面使用,用于在内网的各个主机之间实现文件共享的,也仅仅是用于UnixLinux上面来使用的;

  • NFS:的服务器端的组件nfs-utils.x86_64

/etc/nfsmount.conf: 主配置文件
/etc/rc.d/init.d/nfs  服务脚本
/usr/sbin/rpc.gssd 用于注册给RPC使用
/usr/sbin/rpc.mountd 表示核心程序
/usr/sbin/rpc.nfsd 同样是核心程序
/usr/sbin/showmount 用于查看开放NFS服务的Server
  • 这里可能在启动服务的过程中可能出现一个错误
[root@server2 ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]
  • 出现这个错误的原因是因为RPC服务的组件没有开始
  • rhel5系列上面,请确保service portmap ststus的状态是正常的;
  • rhel6系列上面,请确保rpcbind的状态是正常的,这两个服务监听在111/tcp 111/udp端口

  • 所以启动对应的服务

/etc/init.d/rpcbind start
  • 首先来安装rpcbind软件
[root@server22 ~]# yum install rpcbind.x86_64 -y
  • 然后需要安装nfs软件
[root@server22 ~]# yum install nfs-utils.x86_64 -y
  • 接下来启动服务
[root@server22 ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@server22 ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
  • 这里可以查看rpcbind监听的端口
    这里写图片描述
  • 下面的是向rpcbind注册的服务以及端口信息
    这里写图片描述
  • NFS服务的几个进程
  • nfsd:主服务进程,使用的端口号
  • mountd:挂载进程;
  • quotod:用户配额进程;
  • NFS配置文件的说明
  • man文档提供的信息还是很详细的,这里简要的说明以下一些经常用到的选项,以及需要注意 的问题
  • 对于可访问的主机类型允许下面几种方式进行定义:
    • single host:单一主机,IPV4地址,或者是主机名称;
    • wildcards:表示支持通配符匹配的表示格式;
    • IP networks:使用单一IP地址的表示格式;
  • /home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
  • 对于配置文件的每一行表示的都是一个共享的文件系统,,对于()里面表示Client的访问属性;
  • 介绍几个常用的属性:
  • ro:表示只读;
  • async:表示异步写入;
  • sync:表示同步写入;
  • rw:表示读写访问;
  • root_squash:用于将root用户映射称为来宾帐号,这个权限是默认的;
  • all_squash:所有的用户都转换为来宾帐号;
  • anouid anogid:用于指定映射的UID以及GID;
  • no_acl:不支持acl访问属性;

  • 接下来配置一个比较基础的NFS服务端

  • 添加配置文件里面的一行
[root@server22 ~]# vim /etc/exports 
/shared 172.25.23.0/24(rw,sync)
  • 首先这个目录必须存在,不存在的话,就进行创建
[root@server22 ~]# mkdir /shared
  • 然后需要重新启动服务
[root@server22 ~]# /etc/init.d/nfs restart
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down RPC idmapd:                                  [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
  • clent一段需要安装nfs-utils-1.2.3-39.el6.x86_64;
  • 然后再令一台主机上面使用showmount命令来探测挂载的文件系统
[root@server23 ~]# showmount -e 172.25.23.22
Export list for 172.25.23.22:
/shared 172.25.23.0/24
  • 上面是探测到的文件系统列表,然后进行挂载
[root@server23 ~]# mount -t nfs 172.25.23.22:/shared /mnt/
  • 首先在server端创建文件,然后在client端进行查看
[root@server22 shared]# touch a
[root@server22 shared]# ls
a
[root@server23 mnt]# ls
a
  • 接下来更改这个目录的权限,使挂载用户可以创建文件
  • 这个目录的属主和属组默认是root的,
[root@server22 ~]# ll -ld  /shared/
drwxr-xr-x. 2 root root 4096 418 00:00 /shared/
  • 直接修改文件的属主和属组为执行nfsd进程的用户
[root@server22 ~]# chown nfsnobody.nfsnobody /shared/
  • 然后创建文件,就会成功
[root@server23 mnt]# touch ab
[root@server23 mnt]# ls
a  ab
  • showmount命令的说明:
    • -e:用于查看NFS服务器导出的文件系统;
    • -a:用于查看已经挂载的目录以及被挂载的文件系统列表;
    • -d:用于显示NFS服务器中所有导出的文件系统中被客户端挂载了的文件系统列表;
  • 如果在添加或者修改新的文件系统导出之后,直接重新启动NFS服务,会导致已经挂载的服务出现问题,所以建议使用命令exportfs
  • exportfs:
    • -a:相当于-r -u 表示重新挂载所有文件系统或者取消导出所有文件系统;
    • -r:表示重新导出;
    • -u:表示取消导出;
    • -v:用于显示导出过程;
  • 验证NFS简单的用户管理
  • 实现一个过程用于检测,NFS对于用户的认证仅仅是简单的UID映射:
  • 首先在两个主机上面创建UID以及GID相同,但是用户名不同的两个用户
[root@server22 ~]# id hadoop
uid=500(hadoop) gid=500(hadoop) groups=500(hadoop)

[root@server23 ~]# useradd -g 500 -u 500 openstack
[root@server23 ~]# id openstack 
uid=500(openstack) gid=500(openstack) groups=500(openstack)
  • 接下来在client端进行挂载,然后使用openstack用户创建一个文件
[root@server23 /]# mount -t nfs 172.25.23.22:/shared /mnt/
[root@server23 /]# su - openstack 
[openstack@server23 mnt]$ ll
total 0
-rw-r--r--. 1 nobody nobody 0 Apr 18 00:00 a
-rw-r--r--. 1 nobody nobody 0 Apr 18 00:04 ab
-rw-rw-r--. 1 nobody nobody 0 Apr 19 10:53 ab.openstack
  • 接下来在server端查询创建的文件权限

这里写图片描述
* 这里在创建文件时,可能会出现,权限拒绝的情况
这里写图片描述
* 这个出现权限的原因是因为,常见文件的这个操作需要在server端使用和clientUIDGID的用户来进行,所以需要给/shared其他用户写入文件的权限
这里写图片描述

  • 如果对于是root的文件,被映射过去具有root的权限,就会很危险,可以通过两个选项,来降低权限
    • root_squash:登入NFS时,使用这个目录相当于这个目录的拥有者,但是对于root用户来说,降低权限为nobody;
    • all_squash:无论登入者是什么身份,都被映射成为nobody;
  • NFS自动挂载的实现
  • /etc/fstab配置文件里面添加
172.25.23.2:/shared     /mnt/       nfs     defaults,_netdev        0 0
  • 其中_netdev表示如果NFS挂载,联系不上NFS服务器,就会跳过;

  • NFS使用固定的端口

  • 只需要修改一个配置文件
[root@server22 shared]# vim /etc/sysconfig/nfs 
41 #MOUNTD_PORT=892
13 RQUOTAD_PORT=875
21 #LOCKD_TCPPORT=32803
//根据需要修改上面三个文件的信息
  • 然后重新启动服务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值