- 介绍一点之外的知识:
- 任何可以执行的程序都是工作在用户空间的,内核空间的进程和程序都是由内核进程管理的,文件系统是做进内核文件系统一般是工作在内核空间的,包括
NFS
: - 文件系统是在内核空间提供的,当用户希望在文件系统上面写入数据时,需要借助于内核提供的系统调用,内核对于硬件的操作是通过内核提供的系统调用,也就是内核提供的函数,这个过程也成为过程或者函数调用,本地的文件系统通过本地的过程调用完成对于文件系统的操作,
Local Procedure Call
,如果需要在两个主机上面来完成,那么自身就需要完善网络模块, RPC
:Remote Procedure Call
,远程过程调用,RPC
客户端的STUB
调用, 在进行程序开发时,需要包含特殊的头文件,来完成STUB
的RPC
调用,RPC
的Client
联系RPC
的Server
端,RPC
的Server
端,在完成过程调用之后,将结果返回给RPC
的Client
端,RPC
是为多个需要网络通信的程序,提供一个统一的框架;RPC
的工作机制:- 1.当内核发现某个请求是网络请求时,就会将这个请求转发给
RPC
的Client
; - 2.
RPC
的Client
主动连接RPC
的Server
端,RPC
的Server
处理之后将结果返回值; RPC
的Server
需要工作一个和RPC
的Client
发起请求的对应的Server
程序,这个程序也需要监听在某个套接字上面;RPC
的Server
端对应应用程序的的套接字是随机的;两个应用程序可以通过Stub
的Client
和Stub
的Server
来建立通信;还可以第一次通过Stub
的Server
端和Client
的完成对于套接字的一次封装,之后的通信Stub
的Client
去连接监听套接字的对应的应用程序;通过上述的机制,对于监听的套接字只需要告诉给RPC
而不需要告诉给客户端程序;
- 1.当内核发现某个请求是网络请求时,就会将这个请求转发给
RPC
是一种编程技术,主要用于实现简化分布式应用程序的开发;Client ---> RPC Client-----> RPC Server -----> Server
;通过RPC
的封装,Clien
t和Server
不再需要关注于报文的封装,RPC
可以基于二进制格式或者基于文本格式(XMLRPC
,跨主机的报文交换是通过HTTP
协议来完成的;);RPC
只是一种协议,Linux
上面的实现是Portmap
,提供客户端以及服务器端,监听在111/tcp
,111/udp
;NFS
就是使用的就是RPC
框架进行开发的的应用程序,所以NFS
的Server
需要监听在某个套接字上面,然后项RPC
注册使用的端口,RPC
的Client
直接联系NFS
注册的端口,NFS
只是一种文件系统,在Client
是通过NFS
模块来完成,网络上面也是属于NFS
的,但是对于Server
提供的服务的仍然是本地的文件系统类型;nfs
:是一种网络文件系统,也是一种协议,由SUN
开发;NFSv1
:内部使用NFSv2
:公开;nfs
基于IP
的验证机制,用户认证的功能是很薄弱的,假设NFS
的Client
的jerry
,UID
为1000
,NFS
的server
端的Tom
用户的UID
也是1000
,那么这个文件在Sever
上面就会被识别为1000
;NFS
不建议在互联网上面使用,用于在内网的各个主机之间实现文件共享的,也仅仅是用于Unix
和Linux
上面来使用的;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 4月 18 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
端使用和client
同UID
和GID
的用户来进行,所以需要给/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
//根据需要修改上面三个文件的信息
- 然后重新启动服务