大家好
:
下面是小弟写的一些介绍
NFS
的文章,
由於想参与网路管理的工作学长指派这一个主题给我报告,
由於本身对这方面并不太懂,
只是找一些书籍随便拼拼凑凑,
不知道有没有写到重点,或是一些要点没有提到,因此post出来希望熟悉NFS
的高手们能花一点时间看看我的文章
然後mail给我,指出错误的地方,或者直接reply也可以,
谢谢
!
:
u3430854@sparc20.ncu.edu.tw
===========================================================================
◎
What
is
NFS
?
Network
File
System
NFS
是由SUN公司发展,
并於1984年推出,
NFS是一个RPC
service
,
它使我们能够达到档案的共享,
它的设计是为了在不同的系统间使用,
所
以它的通讯协定设计与主机及作业系统无关.当使用者想用远端档案时只
要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端
的档案使用上和local机器的档案没两样.
machine
A
machine
B
/
/
bin
etc
usr
bin
etc
usr
man
man
share
local
假如我们在机器A上,
要把机器B上的
/usr/man
挂接到machine
A
的
/usr/man只要下
mount
machine_name:/usr/man
/usr/home
就可mount过来.而我们不只是可以mount目录,就是一个档也是可以的.在
挂接之後我们只能对档案做reading
(or
writing)
的动作,而不能在
remote
machie上把此档或目录move,delete掉
,
但须注意的是如我们
mount
/usr
後
,
不能再mount
/usr底下的目录,
否则会发生错误
□
Servers
&
Clients
NFS就是促使Servers上的档案能被其他的机器mount,而达到资源共享,
享用这些档案的机器就可称为Client,一个client可以从server上mount一
个档或是一个层次的目录(file
hierarchies)
.
然而事实上任何一台机器
都可以做NFS
server
or
NFS
client
,甚至同时为NFS
server
and
NFS
client
也可以.
□
Server's
Exporting
&
Client's
Mounting
NFS
server
所export
出来的档案或目录都记录在
/etc/exports
这
一个档中,当我们启动NFS
server
时
在
/etc/rc.local
的这一个script
会自动的启动
exportfs
这一个程式
,
搜寻
/etc/exports
这一个档是否
存在,
并且赋予正确的权限给所有export出去的
file
hierarchies
.
但须注意的是,只有server所export出去的路径,NFS
client才能够mount
,
同样的当启动client时
,
系统会自动去mount所有server
export的路径,
而mount到的所有路径都会记录在
/etc/fstab
下
,
类似如下的fstab档
/dev/sd0a
/
4.2
rw
1
1
/dev/sd0h
/tmp
4.2
rw
1
3
/dev/sd0g
/usr
4.2
rw
1
2
/dev/fd0
/pcfs
pcfs
rw,noauto
0
0
sparc20:/swap
/swap
nfs
rw,intr,bg,soft
0
0
sparc17:/home
/home
nfs
rw,intr,bg,soft
0
0
sparc17:/home3
/home3
nfs
rw,intr,bg,soft
0
0
sparc14:/home4
/home4
nfs
rw,intr,bg,soft
0
0
sparc20:/home2
/home2
nfs
rw,intr,bg,soft
0
0
sparc20:/var/spool/mail
/var/spool/mail
nfs
rw,intr,bg,soft
0
0
rs970:/home1
/home1
nfs
rw,intr,bg,soft
0
0
★
Noted
:
当client
mount
到一个路径,绝对不是说copy
server上的这一个路径
到local的机器上,我们可以用
cd
进入这一个mount到的路径,就如同是使用
local
directory一样
□
Setting
Up
a
NFS
Server
1.
定义机器为
NFS
file
server
2.
划分server's
disk
,定义哪一些partitions
是要提供出来作为
client
所共享的file
system
3.
在
Client
Form
上定义每一台client
的参数
4.
写出
/etc/exports
(一般系统都有一个default
exports)
5.
重新boot
NFS
server
or
用指令
exportfs
-a
输出所有的
directories
并且用
nfsd
8
&
启动
nfsd守护程式,常驻在背景
※
ps.
一些细节
1.
检查
/etc/exports
输出路径的权限,确定只有root能修改,
all
user只能read
2.
用exportfs
去增加或删除directories
exportfs
-o
access=engineering,ro=dancer
/usr
exportfs
-u
/usr
3.
假如你的机器没有NIS(YP
server)的服务,当更改资料时记得修改
/etc/passwd
/etc/group
/etc/hosts
/etc/ethers
4.
为你自己的network
设置security
exportfs的语法
/usr/etc/exportfs
[
-avu
]
[
-o
option
]
[
directory
]
-a
:
把
/etc/exports
中所有路径export出去
-u
:
把
export出去的路径卸下
,
如
exportfs
-u
/usr
-o
option
:
如
exportfs
-o
ro
/usr
,所有人对/usr
都为read
only
option
还有
root
=
hostname
,
access
=
client
access
=
netgroup
For
example
:
exportfs
-a
把exports中的路径全部export出去
exportfs
-o
access=engineering:other
/usr
/usr
这路径export後只有engineering
and
other
这两个
group
能够
read
&
write
exportfs
-o
access=oak,ro=dancer
/usr
设定dancer
这台client
对
/usr
为read
only
,且只有
oak这一个
group
能做read
/etc/exports
档的□例
●
syntax
:
directory
-option[,option]
(设定两个group能rw)
/usr
-access=engineering:accounting
/home
-access=engineering:accounting
/var/spool/mail
-access=engineering:accounting
/export/exec/sun3
-access=engineering:accounting
/export/exec/sun3.sunos.4.1
-access=engineering:accounting
/export/exec/kvm/sun3.sunos.4.1
-access=engineering:accounting
/export/root/birch
-access=birch,root=birch
/export/swap/birch
-access=birch,root=birch
/export/root/oak
-access=oak,root=oak
/export/swap/oak
-access=oak,root=oak
/export/root/willow
-access=willow,root=willow
/export/swap/willow
-access=willow,root=willow
/export/root/pine
-accsee=pine,root=pine
/export/swap/pine
-accsee=pine,root=pine
(access=client
,
root=hostname
如此只有这一台client的superuser有权力rw)
□
Setting
Up
a
NFS
Client
1.
宣告机器为没有磁碟机或没有资料的Client,在使用SunInstall之前
2.
编辑好
/etc/fstab
这一个档,确定要mount的路径都在fstab中
3.
依照fstab所设的内容,在Client上设定好Mount
points
(mount_points
就是用mkdir
设exports所输出的路径)
4.
确定我们所要mount的路径,都有出现在
/etc/exports
中
5.
可以启动mount去连结server上的directories
(
mount
-a
)
/etc/fstab
档的□例
●
syntax
filesystem
directory
type
options
freq
pass
oak:/export/root/boomer
/
nfs
rw
0
0
^^^
因为档案在server上,not
on
client
所以client的设定为0
oak:/export/exec/sun3
/usr
nfs
ro
0
0
oak:/export/exec/kvm/sun3
/usr/kvm
nfs
ro
0
0
oak:/usr/share
/usr/share
nfs
ro
0
0
oak:/home/oak
/home/oak
nfs
rw,bg
0
0
§
mount
的语法
●
syntax
:
mount
-t
type
[-rv]
-o
[option]
server:pathname
/mount_point
MOUNT
:
mount
-a
把/etc/fstab
中所列的路径全部挂上
mount
-o
ro,soft,bg
dancer:/usr/local
/usr/local/dancer
把dancer
server
的/usr/local
mount
到
client的
/usr/local/dancer
并且是read
only
-t
type
:
你所要mount的型别,
如
nfs
or
4.2
-r
:
所mount的路径定为read
only
-v
:
mount过程的每一个动作,都有messages
传回到萤幕上
hard
:
重复要求,直到server回应为止,但如server一直不回应
the
server
may
be
down
!
soft
:
当client的请求得不到回应,retry
one
time
後
传回
error
message
bg
:
当第一次请求不成功,第二次的mount将放到背景执行
fg
:
retries
mount
都一直在提示符号下进行
intr
:
当正在进行
NFS
请求时,允许用键盘中断
mount
成功时的message
NFS
server
hostname
ok
mount
fail
NFS
server
hostname
not
responding,
still
trying
.
.
.hostname
server
not
reponding:
RPC:
Timed
out
§
UNMOUNT
:
umount
mount_point
umount
-a
卸下所有已经mount上的路径
==========================================================================
◎
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
□
NFS
的网路安全的
NFS
使server上的档案能被client所取用,
乍看之下好像server
上
的档案任何人都可取用没什麽保护性,
其实不是如此的.
一开始server
要
exportfs
之前在
/etc/exporrc
中就已经设定了档案的使用权限,
像
/usr/src
-access=engineering:accounting
就是限定只有
rcgineering
和
accounting
这两台
client
才能
mount
/usr/src
/usr/src
-access=oak,root=oak
这是说只有
oak
这台
cilent
能
mount这一个路径
且只有
oak
client's
superuser
才能行使
read
&
write
的权力
另外管理者为了维护
exported
和
mounted
的安全,
一定要建
立公共(public)和私人(secret)的
key(password),
然而这些安全性
问题是要建立在
NIS
(network
infomation
system)
上的,
有一个
/etc/publickey档
,里面记录了public
and
secret
keys
,
而这些key
是依照
machine_name
和
user_name
,以16
进位码表示出来的,
管理
者可在有NIS的机器上用
newkey
-u
username
给予user
login
权力
newkey
-h
hostname
造出login
此机器时所需的password
在NFS刚安装时
user
是
"nobody"
任何人都可以进入,
所以管理者
一定要做修改,
以保护资料的安全.
当使用者为
nobody
时
publickey
的内容
netname
user's
public
key
:
user's
secret
key
nobody
3d91f44568fbbefada5a7:7675cd9b8753b5db09dabf12
在管理者给予user权力之後,
user
就可使用
chkey
修改自己的
secret
key
创造自己的帐号路口,
willow%
chkey
Generating
new
key
for
username
password
:
Sending
key
change
request
to
server
...
Done.
willow%
所设定的password
是使用者位於
NIS
中的加密键
,
当我们login
时
NIS
就会将此密码解开,(因为publickey中是以16进位码记录)
,
存放到
keyserv
里加以保管,
再将加密键传给client
,
当client
发出请求时
,
此键会附在每个NFS
请求上一起送到
NFS
server
上,
当加密键和server上
所保存的keyserv核对无错後,
请求就会被接受
□
When
fail
to
mount
server
1.
用
rpcinfo
-p
server_name
去查看此server是否存在
2.
用
rpcinfo
-u
server_name
mount
查看mountd
daemon
是否有
在server上执行
3.
假如server
都没问题,检查
server
和
client
之间的
Ethernet
connetions
4.
在client
上
用
ps
ax
看portmap
and
several
biod
daemons
running
or
not
!
(rpcinfo
:
用来对
RPC
server
做
RPC
呼叫,回传远端程序呼叫
过程中的讯息)
一些mount
失败的错误讯息
1.
/etc/mtab
:
No
such
file
or
directory
mtab
这一个路径或是档案必须存在,在mount之前
2.
mount
:
...
Block
device
required
远端的机器名称可能打错了
3.
mount:
...
not
found
in
/etc/fstab
fstab
一定要存在,client
上
/etc下
4.
...
not
in
hosts
database
/etc/hosts
没有这一个
hosts
database
,
或是
NIS
的daemon,
ypbind
没有在执行
5.
Must
be
root
to
use
mount
一般都只有
root
才能mount
,所以mount之前先成
为superuser
6.
Stale
NFS
file
handle
当我们已经mount
上的file
or
directory
,在server
上突然被remove
or
unexport
,就会出现此讯息 (http://www.fanqiang.com) 进入