一:NFS网络文件系统
网络文件系统(NFS,NetworkFileSystem)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。因为NFS支援的功能相当的多,而不同的功能都会使用不同的程式来启动,每启动一个功能就会启用一些port来传输资料,因此,NFS的功能所对应的port才没有固定住,而是采用随机取用一些未被使用的小于1024的端口来作为传输之用。 此时我们就得需要远端程序呼叫(RPC)的服务啦。 RPC最主要的功能就是在指定每个NFS功能所对应的port number,并且回报给用户端,让用户端可以连结到正确的埠口上去。那RPC又是如何知道每个NFS的埠口呢?这是因为当伺服器在启动NFS时会随机取用数个端口,并主动的向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC又是固定使用端口111来监听用户端的需求并回报用户端正确的端口,所以当然可以让NFS的启动更为轻松愉快了!
步骤:
用户端会向伺服器端的RPC (port 111)发出NFS档案存取功能的询问要求;
伺服器端找到对应的已注册的NFS daemon端口后,会回报给用户端;
用户端了解正确的端口后,就可以直接与NFSdaemon来连线。由于NFS的各项功能都必须要向RPC来注册,如此一来RPC才能了解NFS这个服务的各项功能之portnumber,PID,NFS在主机所监听的IP等等,而用户端才能够透过RPC的询问找到正确对应的端口。也就是说,NFS必须要有RPC存在时才能成功的提供服务,因此我们称NFS为RPC server的一种。
二:portmap
portmap进程的主要功能是把RPC程序号转化为Internet的端口号,当一个RPC服务器启动时,会选择一个空闲的端口号并在上面监听(每次启动后的端口号各不相同),同时它作为一个可用的服务会在portmap进程注册。一个RPC服务器对应惟一一个RPC程序号,RPC服务器告诉portmap进程它在哪个端口号上监听连接请求和为哪个RPC程序号提供服务。经过这个过程,portmap进程就知道了每一个已注册的RPC服务器所用的Internet端口号,而且还知道哪个程序号在这个端口上是可用的。portmap进程维护着一张RPC程序号到Internet端口号之间的映射表,它的字段包括程序号、版本号、所用协议、端口号和服务名,portmap进程通过这张映射表来提供程序号-端口号之间的转化功能
如果portmap进程停止了运行或异常终止,那么该系统上的所有RPC服务器必须重新启动。首先停止NFS服务器上的所有NFS服务进程,然后启动portmap进程,再启动服务器上的NFS进程。但portmap只在第一次建立连接的时候起作用,帮助网络应用程序找到正确的通讯端口,但是一旦这个双方正确连接,端口和应用就绑定,portmap也就不起作用了。但对其他任何第一次需要找到端口建立通讯的应用仍然有用。
三:配置NFS
1. 安装nfs-utils
[root@www ~]# yum install nfs-utils -y
2. 启动NFS服务
[root@www Packages]# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
报错看这里:
http://blog.chinaunix.net/uid-30212356-id-5193103.html
启动报错:
http://blog.chinaunix.net/uid-30212356-id-5192650.html
3. rpcinfo命令查看本地主机RPC程序所监听的端口:
[root@www ~]# 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
100005 1 udp 43276 mountd
100005 1 tcp 60590 mountd
100005 2 udp 36502 mountd
100005 2 tcp 54145 mountd
100005 3 udp 52666 mountd
100005 3 tcp 48896 mountd
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
100021 1 udp 43275 nlockmgr
100021 3 udp 43275 nlockmgr
100021 4 udp 43275 nlockmgr
100021 1 tcp 43726 nlockmgr
100021 3 tcp 43726 nlockmgr
100021 4 tcp 43726 nlockmgr
4. NFS启动进程介绍:
NFS启动三个进程:
nfsd:NFS主服务进程,监听在tcp/2049和udp/2049端口;
mountd:客户端挂载请求进程,端口向RPC注册;
quotad:磁盘配额进程,端口向RPC注册;
5. 软件包安装的/etc/rc.d/init.d/nfslock文件的作用:
如果两个进程同时对磁盘上的同一个文件进行写操作,那么这会引起文件崩溃,为了避免文件崩溃要对该文件进行加锁,当一个进程对文件进行写操作前会先想NFS服务申请对该文件加锁,而不是本身对该文件进行加锁,因为一个客户端加锁时另一个客户端是看不到这个锁的还是可以对该文件进行写操作,而如果是NFS服务加锁的话就可以避免两个客户端同时写了;
6. NFS服务器配置文件/etc/exports介绍:
/etc/exports中每一行定义了一个共享的文件系统以及哪些客户端能够访问该文件系统,格式是第一段是共享文件路径(可以是目录也可以是单独挂载的文件系统),然后是客户端访问控制列表(多个客户端之间用空格隔开),而每个客户端后面都要跟上一个小括号,里面定义了此客户端的访问特性如访问权限等;
如:/tmp/shared 192.168.85.0/24(ro只读,async异步写入)空格符192.168.84.0/24(rw读写访问,sync同步写入)
对客户端的定义:
客户端可以是单个主机,网络组,通配符(*a.com)和IP/掩码
7. 配置过程
7.1 编辑
/etc/exports文件
[root@www tmp]# mkdir shared #在tmp目录下创建共享目录shared
[root@www tmp]# vim /etc/exports #配置该共享目录
/tmp/shared 192.168.85.0/24(rw,sync)
7.2 重启服务
[root@www tmp]# service nfs reload
7.3 查看是否共享了:
[root@www tmp]# showmount -e 192.168.85.128
Export list for 192.168.85.128:
/tmp/shared 192.168.85.0/24
7.4 打开另外一台主机作为客户端(IP:192.168.85.129)查看shared是否共享:
[root@localhost ]# showmount -e 192.168.85.128
Export list for 192.168.85.128:
/tmp/shared 192.168.85.0/24
[root@localhost ~]# showmount -e 192.168.85.129
Export list for 192.168.85.129:
7.5 客户端上使用mount命令挂载共享目录
格式:mount -t nfs NFS服务器IP:/共享目录路径 本地挂载点
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# mkdir nfs
[root@localhost mnt]# mount -t nfs 192.168.85.128:/tmp/shared /mnt/nfs
7.6 测试
在服务器端:
[root@www ~]# cd /tmp/shared/
[root@www shared]# cp /etc/inittab ./
[root@www shared]# ll
-rw-r--r-- 1 root root 884 Sep 12 01:19 inittab
在客户端:
[root@localhost ]# cd /mnt/nfs/
[root@localhost nfs]# ll
-rw-r--r--. 1 nobody nobody 884 Sep 12 01:19 inittab
7.7 exportfs命令对exports文件进行操作
此时有一个问题:如果在服务器端exports文件中再添加一个共享目录,然后重启NFS服务,但是此时正好有一个客户端正在进行文件操作,那么这会引起操作中断和破坏,为了避免这个问题,可以使用exportfs命令;
exportfs命令介绍:
http://blog.chinaunix.net/uid-30212356-id-5193108.html 最好man exportfs
7.8 实现开机自动挂载:
编辑/etc/fstab添加一行如下:
192.168.85.128(NFS服务端IP):/tmp/shared /mnt/nfs nfs defaults,_rnetdev 0 0
说明:为了防止系统在启动时因为某些原因使挂载点不可用从而导致系统无法正常启动,加入_rnetdev选项,当挂载点不可用时直接跳过;
7.9 配置进程使用固定端口
编辑配置文件/etc/sysconfig/nfs
#MOUNTD_PORT=892 #去掉注释自己定义
#RQUOTAD_PORT=875 #去掉注释自己定义