[本例中客户端为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
(问题寻求解决中,待续......)