LINUX下的NFS介绍
◎ How NFS Work ?
当我们启动 NFS file server 时,/etc/rc.local 会自动启动exportfs这一个程式,指定可以export的档案或目录,而我们所能mount的也只能是其所指定的目录.
□ NFS 架设在 XDR/RPC的协定之上
XDR : (eXternal Data Representation) 外部资料表示法
XDR(eXternal Data Representation) 提供一种方法把资料从一种格式转换成另一种标准资料格式表示法,确保在不同的电脑,作业系统及电脑语言中,所有资料代表的意义都是相同的
RPC : (Remote Procedure Calls) 远端程序呼叫
RPC(Remote Procedure Calls) 远端程序呼叫, 请求远端电脑给予服务. 委托器(client)就会透过网路传送RPC到远端电脑,请求服务.
(一般 local machine : client remote machine : server )
□ NFS 如何运用 RPC 传送资料
客户端process 主服务端process
┌————┐ ┌—————┐
│ 客户端 │ │ 主服务站 │
│routines│ │ routines │
└—┬——┘ └┬————┘
本地程序呼叫 │ 《 │ 《
(1) │ │ (10) (6) │ │ (5)
》 │ 》 │
┌———┴┐ ┌————┴┐
│ 客户端 │ │ 主服务端 │
│ stub │ │ stub │
└—┬——┘ └┬————┘
系统呼叫 │ 《 │ 《
(2) │ │ (9) (7) │ │ (4)
》 │ 》 │
┌———┴┐ (8) ┌————┴┐
│network │ <——————┤ network │
│routines├——————> │ routines │
└————┘ (3) └—————┘
本地系统核心 网路通讯 远端系统核心
(1) client 送出讯息,请求服务
(2) client stub (客户株) 把client 送出的参数转换成XDR---标准资料格式并用系统呼叫(system call) 把讯息送到网路上
(3) 讯息经过网路送达远端主机系统
(4) 远端主机将接受到的讯息传给server stub (服务站株)
(5) 把XDR形式的资料,转换成符合主机端的格式,取出client发出的服务请求参数,送给server
(6) -- (10) 则是逆向而行 , server 送出服务给 client
□ rc.local 启动守护程式
一个NFS server 要 inet , portmap , nfs , mount 此四个守护程式,保持在背景执行的状态下才能运作. (if running NIS must add ypbind daemon)
◆ 当启动 NFS file server 时,the /etc/rc.local script 会做如下的动作
1. 执行exportfs , 读取server's /etc/exports 告诉kernel所要输出的file hierarchies 和 存取的权限
( exportfs -a )
2. 启动 rpc.mountd daemon 和 nfsd daemon (通常是 8 个)
( rpc.mountd -n nfsd 8 & echo -n 'nfsd' )
◆ 当启动 NFS client 时
rc.local 会做如下的动作
1. 启动 boid daemons 处理读写的程序
(biod 8 echo -n ' biod' )
2. 执行 mount -vat nfs 读取client's /etc/fstab 并且 mount 所有属於 NFS-type 的files
□ NFS daemons (守护程式) 的功用
nfsd, biod, rpc.mountd, inetd, portmap 都可在/usr/etc 下找到
nfsd : 依client 对档案系统的需求情况, 而启动
" file system request daemon "
应付client 的需求,而一般file system request daemon 的数目是 " 8 ", 这也就是我们在rc.local 中写 " nfsd 8 & "的原因了
biod : 此指令是在NFS client上用的 , 用来启动" asynchronous block I/O daemon"用来建立buffer cache , 处理在client上的读写
mountd : mountd 是一台 RPC server ,启动rpc.mountd daemon後 它会读取/etc/xtab 查看哪一台client正在mount 哪一个file system,并回应client 所要mount 的路径
(mountd处理的过程可用 showmount 来看)
inetd : inetd (Internet services daemon) , 当系统启动时rc.local会启动inetd 读取 inetd.conf 这一个 configuration-file,读取网路上所有 server's address , 连结启动inetd.conf中所有的server , 当client 请求服务时, inetd 就会为clinet 启动相关的server daemon 负责任务, 如user 用 telnet 时 , 则inetd 启动telnetd 迎合user telnet 的需求, 其馀像 ftp,finger , rlogin 之类的应用程式 , inetd 也都会启动相对应的daemons, ftpd, fingerd, rloingd
portmap : portmap 是一台server , 主要功能 转换 TCP/IP 通讯协定的port number 变成 RPC program number , 因为这样clinet才能做RPC calls
一般 RPC server 是被inetd 所启动的, 所以portmap 必须在inetd之前启动, 否则无法做 RPC call