Chinaunix首页 | 论坛 | 博客
  • 博客访问: 694014
  • 博文数量: 112
  • 博客积分: 3889
  • 博客等级: 少校
  • 技术积分: 1448
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-19 16:35
个人简介

追求卓越,成功就会在不经意间追上你

文章分类

全部博文(112)

文章存档

2015年(1)

2014年(2)

2013年(1)

2012年(16)

2011年(86)

2010年(6)

分类: LINUX

2011-04-29 12:29:03

[本例中客户端为centos 5.6(192.168.229.130),服务器为feodra 14(192.168.1.103)]

NFS:Network File System
最早由SUN公司开发,其最大的功能就是通过网络在不同的机器,不同的OS之间共享彼此的文件。
NFS服务器可以让PC将远程主机共享的目录挂载到本地,就像是自己的东西一样。
NFS进行数据传输时所使用的端口是随机选择的,惟一的限制便是小于1024;这是为什么呢?因为NFS支持的功能相当的多,而不同的功能又要使用不同的的程序来启动,相应的就要启动一些不同的端口来传输数据。
那么客户端是怎样知道通信端口的呢,这就要用到远程过程调用(Remote Procedure Call,RPC)协议啦。

RPC:Remote Procedure Call
RPC最主要的功能便是指定每个NFS功能对应的端口号,并传递信息给客户端,使客户端能连上正确的端口。这下问题又来了,这个RPC又是怎样知道每个NFS的端口的呢?情况是这样滴,因为呢,当这个服务器在启动NFS时会随机取用数个端口并主动向RPC注册,这样这个RPC不就知道每个NFS功能对应的端口了么?然后呢,这个
RPC固定使用111号端口来监听客户端的请求并做出相应的正确的应答。
客户端,NFS,RPC之间的通信应该是这样的:
首先,客户端向服务器端的RPC发送请求;
然后,服务器的RPC找到相应请求对应的NFS daemon端口后,立即通知客户端
最后,客户端收到服务器端RPC发来的端口号后就直接通过该端口与服务器端的NFS daemon建立连接。
**注册NFS服务时一定要先开启RPC,才能保证注册成功。如果RPC重新启动的话,它保存的信息就会丢失,要重新启动NFS服务进程以向RPC注册端口信息,否则客户端无法访问NFS服务器。
目前,NFS包括三个版本NFSv2,NFSv3,NFSv4.RHEL5.x支持NFSv2-v4


运行NFS需要的RPC deamon:
由上面的叙述可知NFS要能启动至少要启动两个deamons,一个用来处理客户端的登录问题,另一个用来处理客户端能够取得的权限问题。对功能单纯的NFS主机来说只要启动如下两个deamon就行啦。
1.rpc.nfsd
这个daemon主要用来管理客户端能否登录主机,其中还包含登入者的ID判别。
2.rpc.mountd
这个daemon主要用来管理NFS的文件系统。当客户端通过rpc.nfsd的认证登录主机后,在其使用NFS服务器提供的服务之前,还要经过文件使用权限的认证程序。它会去读取配置文件/etc/exports来对比客户端的权限,在通过这一关后,客户端才能取得该NFS文件系统的权限。
NFS的文件存取权限:
由于客户端与服务器端的UID,GID,用户名,组名并不一定会形成一一对应的关系,所以在进行操作时可能会出现以下几种情况:
以客户端的centos(501)用户去登录一个NFS服务器为例:
a 客户端与服务器端刚好有相同的账号与组
这时,该用户可以直接用centos身份对服务器提供的服务进行操作
b 客户端与服务器端UID相同但用户名不同
这时,客户端的centos用户只能对服务器端的具有相同UID的用户的文件进行操作。
c 服务器端没有相应的UID
这时,客户端的centos用户将被压缩成匿名者,一般NFS的匿名者会把65534作其ID,早期的linux都把这个账号叫作nobody,而在Red Hat系中则取名为nfsnobody:
[root@novice ~]# less /etc/passwd | grep 65534
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
d 如果用户身份是root
默认情况下root被压缩成匿名者。
总之:客户端的用户能做什么取决于其UID,GID,如果两端对不上号的话文件系统的使用就会出现一些问题。
     若要客户端能正常对NFS文件系统进行操作,还需要以下两个权限:1NFS具有开放的可写入权限;2实际的文件具有可写入权限
     只有满足以下三个条件才有对文件的可写入权限:1用户账号,UID的相关身份;2nfs服务器允许有写入的权限;3文件系统确实具有可写入权限。
     对于身份认证,NFS通常要与NIS搭配使用,以避免身份的错乱。



NFS 服务器端配置
所需软件:
NFS主程序 nfs-utils:NFS的核心提供各个相关的daemons,文档等等;
RPC主程序 portmap:用来管理端口映射,在启动任何一个RPC SERVER之前都要启动portmap;
*可以用rpm -qa|grep package_name或yum list package_name来查看系统是否已安装相关软件。
[root@novice yum.repos.d]# rpm -qa|grep nfs-utils
nfs-utils-lib-1.1.5-2.fc14.i686
nfs-utils-1.2.3-0.fc14.i686
*若没有安装可用yum install package_name直接从网络安装,或使用rpm -ivh package_name从系统安装光盘里安装。
*不过fedora 14里好像没有这个portmap了,取而代之的是rpcbind,关于rpcbind的用法请参照man手册。而centos 5中使用的仍是portmap
[root@novice ~]# yum list portmap
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
Error: No matching Packages to list
[root@novice ~]# yum install portmap
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package rpcbind.i686 0:0.2.0-8.fc14 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================
 Package       Arch       Version              Repository     Size
===================================================================
Updating:
 rpcbind       i686       0.2.0-8.fc14         updates        51 k

Transaction Summary
===================================================================
Upgrade       1 Package(s)

Total download size: 51 k
Is this ok [y/N]: y
...........

与NFS软件相关的一些文件:
1 /etc/exports:NFS的主要配置文件,没有默认值,所以一开始该文件并不一定存在,有时可能需要自己手动建立,如使用vim建立该文件;
[root@novice /]# vim /etc/exports 
有时即使存在也是空的,需要自己添加相关规则。
[root@novice /]# ls -l /etc/exports 
-rw-r--r--. 1 root root 0 Jun 29  2010 /etc/exports
/etc/exports设置相关的语法与参数:
共享目录 [客户端1(参数1[,参数2,参数3,...])] [客户端2(参数1[,参数2,参数3,...])] ...
其中:
a 客户端可以是完整的IP地址或网段,如192.168.71.100或192.168.1.0/24或192.168.1.0/255.255.255.0;还可以是主机名,但是要确保这个主机名在/etc/hosts内或使用DNS可以找到,在此处可使用通配符。
b 各客户端之间用空格隔开,客户端名称与后面的参数之间直接相连,不存在空隙。
c  “#”表示注释
本次实验配置如下:
[root@novice ~]# vim /etc/exports 
/tmp *(rw,root_squash,insecure)
/home/fedora/Desktop centos(ro,root_squash,insecure)
/home/fedora/vmware 192.168.229.130(ro,root_squash,insecure)
另:
关于权限也就是小括号内的参数常用的有以下这些:
ro:read-only ,设置共享为只读,默认选项
rw:read-write,设置共享为读写
root_squash:如果当前客户端用户为root,将被映射为服务器端匿名用户
no_root_squash:如果当前客户端用户为root,将被映射为服务器端的root用户
all_squash:将所有客户端用户映射为服务器端的匿名用户,默认选项
anonuid:设置匿名用户的UID
anongid:设置匿名用户的GID
sync:数据同步写入内存和硬盘,默认选项
async:数据先写入内存再写入硬盘
secure:指定NFS客户端必须使用NFS保留端口(<1024),默认选项
insecure:允许NFS客户端可以不使用NFS保留端口(<1024)
wdelay:如果NFS服务器怀疑有另一个相关的写请求正在处理或马上就要到达,NFS服务器将延迟提交写请求到磁盘,这就允许使用一个操作提交多个请求到磁盘,这样可以改善性能,默认选项
nowdelay:若设置过async则该选项无效,NFS服务器将每次写操作写入磁盘
例 1:让root保有root权限
[root@novice ~]# vim /etc/exports 
#所有用户都能使用/tem,且由no_root_squash指定root(C端)->root(S端)
/tmp *(rw,no_root_squash)
例 2:针对同一个目录开放不同的权限:
[root@novice ~]# vim /etc/exports 
/tmp *(rw,no_root_squash)
/home/public 192.168.229.130(rw) *(ro)

另:RED HAT系列还可以使用system-config-nfs图形工具进行NFS服务器的配置
[root@novice ~]# yum list system-config-nfs
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
Available Packages
system-config-nfs.noarch                  1.3.51-1.fc14                   fedora
[root@novice ~]# yum install system-config-nfs
......
安装完成后可在终端启动:
[root@novice ~]# system-config-nfs
也可以通过点击:system->administration->nfs来启动。

2 /usr/sbin/exportfs:用来维护NFS共享资源的命令,主要用于服务器端。
可以通过该命令重新挂载编辑后的exports文件,而不要重启nfs服务:
如重新挂载一次/etc/exports的设置:
[root@novice ~]# exportfs -arv
exporting *:/tmp
如全部卸载:
[root@novice ~]# exportfs -auv
关于exportfs更多更具体的用法请参照man手册。
3 /usr/sbin/showmount:用来查看NFS服务器共享出来的目录资源,主要用在客户端。
如查看主机上共享的文件:
[root@novice ~]# showmount -e
Export list for novice.fedora:
/tmp *
关于showmount更多更具体的用法请参照man手册。
4 /var/lib/nfs/*tab:NFS的日志文件都存放在/var/lib/nfs下,在该目录中有两个比较重要的日志文件,一个是etab,用来记录NFS共享出去的目录的完整权限设置值;另一个是xtab,记录曾链接到此NFS主机的相关客户端的相关信息。

启动NFS:
配置文件设置好后就能启动NFS啦,不过要记得先启动portmap,即现在的rpcbind.
[root@novice ~]# /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}
可以用如下命令检测rpcbind的状态
[root@novice ~]# /etc/init.d/rpcbind status
rpcbind (pid 1172) is running...
如果未启动的话,可用如下方式启动:
[root@novice ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]

启动rpcbind后,就能启动NFS啦:
[root@novice ~]# /etc/init.d/nfs {start|stop|status|restart|reload|condrestart|condstop}
检测NFS当前状态:
[root@novice ~]# /etc/init.d/nfs status
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped

启动NFS并检测:
[root@novice init.d]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
[root@novice ~]# /etc/init.d/nfs status
rpc.mountd (pid 30206) is running...
nfsd (pid 30203 30202 30201 30200 30199 30198 30197 30196) is running...
rpc.rquotad (pid 30190) is running...

可以用如下命令查看NFS开放的端口:
[root@novice ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:55621               0.0.0.0:*                   LISTEN      30206/rpc.mountd    
tcp        0      0 0.0.0.0:12169               0.0.0.0:*                   LISTEN      30206/rpc.mountd    
tcp        0      0 0.0.0.0:875                 0.0.0.0:*                   LISTEN      30190/rpc.rquotad   
tcp        0      0 0.0.0.0:14926               0.0.0.0:*                   LISTEN      1246/rpc.statd      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      29865/rpcbind       
tcp        0      0 0.0.0.0:24820               0.0.0.0:*                   LISTEN      -                   
..........
可以用如下命令查看RPC服务的注册状况:
[root@novice ~]# rpcinfo -p localhost
   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
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100021    1   udp  26326  nlockmgr
    100021    3   udp  26326  nlockmgr
    100021    4   udp  26326  nlockmgr
    100021    1   tcp  24820  nlockmgr
    100021    3   tcp  24820  nlockmgr
    100021    4   tcp  24820  nlockmgr
    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
    100005    1   udp  59570  mountd
    100005    1   tcp  16470  mountd
    100005    2   udp  35207  mountd
    100005    2   tcp  12169  mountd
    100005    3   udp  45466  mountd
    100005    3   tcp  55621  mountd


NFS客户端设置(本例中客户端为centos 5.6)
远程NFS服务器的挂载,步骤如下:
1.确认本地已经启动了rpcbind(或portmap)服务:
当然要检查软件是否安装,
[root@client ~]# yum list portmap
.....
Installed Packages
portmap.i386                       4.0-65.2.2.1                        installed
已经安装,下面就来确认当前状态
[root@client ~]# /etc/init.d/portmap status
portmap (pid 3568) 正在运行...
如果没有启动,可用如下命令启动(不过这个服务系统是默认启动的):
[root@client ~]# /etc/init.d/portmap start
启动 portmap:                                             [确定]
[root@client ~]# /etc/init.d/portmap status
portmap (pid 5069) 正在运行...

2.扫描NFS服务器端共享的目录有哪些:
[root@novice ~]# showmount -e localhost
Export list for localhost:
/tmp                 *
/home/fedora/vmware  192.168.229.130
/home/fedora/Desktop centos


3.在本地(客户端)建立挂载点:
[root@client ~]# mkdir -p /home/nfs{1,2,3}
[root@client ~]# ls -l /home
总计 20
drwx------ 18 centos centos 4096 04-29 07:58 centos
drwxr-xr-x  2 root   root   4096 04-29 09:59 nfs1
drwxr-xr-x  2 root   root   4096 04-29 09:59 nfs2
drwxr-xr-x  2 root   root   4096 04-29 09:59 nfs3

4.挂载远程主机共享的目录:
[root@client ~]# mount -t nfs 192.168.1.103:/tmp /home/nfs1
[root@client ~]# ls -l /home
总计 20
drwx------ 18 centos centos 4096 04-29 07:58 centos
drwxrwxrwt 28 root   root   4096 04-29 09:56 nfs1
drwxr-xr-x  2 root   root   4096 04-29 09:59 nfs2
drwxr-xr-x  2 root   root   4096 04-29 09:59 nfs3

不好意思,出问题啦。为什么会出这样的问题呢?真是让人揪心!
[root@client ~]# mount 192.168.1.103:/home/fedora/Desktop /home/nfs2
mount: 192.168.1.103:/home/fedora/Desktop failed, reason given by server: Permission denied
[root@client ~]# mount 192.168.1.103:/home/fedora/vmware /home/nfs3
mount: 192.168.1.103:/home/fedora/vmware failed, reason given by server: Permission denied
提示说Permission denied,WHY?
查看服务器日志文件得到如下信息:
[root@novice ~]# less /var/log/messages | grep "Apr 29"
Apr 29 10:00:05 novice rpc.mountd[28418]: authenticated mount request from 192.168.1.103:45572 for /tmp (/tmp)
Apr 29 10:00:54 novice vmnet-dhcpd: DHCPREQUEST for 192.168.229.130 from 00:0c:29:01:e7:f7 via vmnet8
Apr 29 10:00:54 novice vmnet-dhcpd: DHCPACK on 192.168.229.130 to 00:0c:29:01:e7:f7 via vmnet8
Apr 29 10:07:35 novice rpc.mountd[28418]: refused mount request from 192.168.1.103 for /home/fedora/Desktop (/): no export entry
Apr 29 10:09:27 novice rpc.mountd[28418]: refused mount request from 192.168.1.103 for /home/fedora/vmware (/): no export entry
Apr 29 10:12:52 novice vmnet-dhcpd: DHCPREQUEST for 192.168.229.130 from 00:0c:29:01:e7:f7 via vmnet8
Apr 29 10:12:52 novice vmnet-dhcpd: DHCPACK on 192.168.229.130 to 00:0c:29:01:e7:f7 via vmnet8
(问题寻求解决中,待续......)
阅读(4997) | 评论(0) | 转发(1) |
0

上一篇:read 命令用法详解

下一篇:Good Night

给主人留下些什么吧!~~