1
.
NFS
的由来
:
NFS(Network File System)
是一种分布式文件系统,允许网络中的安装不同操作系统
(Linux
和
Unix
间
)
的计算机间共享文件和外设,所以它的通讯协定设计与主机及操作系统无关
.
它是由
SUN
公司于
1984
年推出,使得可以本地机一样的使用另一台联网计算机的文件和外设。
NFS
在文件传送或信息传送过程中依赖于
RPC
协议
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
功能:
当我们的
NFS Server
设定好共享目录后,其他的
NFS Client
端就可以将这个目录挂载到自己系统上面的某个挂载点
(
挂载点可以自定义
)
,进入这个挂载点即可查看共享的文件。
缺陷:
a.
明文传输
b.
只能用于
Linux
和
Unix
间操作系统中
c.
新版的
NFS
服务是置于系统内核中的。
2
.
RPC
:
RPC,
远程过程调用
(remote procedure call)
是能使客户端执行其他系统中程序的一种机制。由于使用
RPC
的程序不必了解支持通信的网络协议的情况,因此
RPC
提高了程序的互操作性。常用于分布式
C/S
模型,发出请求的程序是客户程序,而提供服务的程序是服务器。
功能:
NFS
支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些
端口
来传输文件,因此,
NFS
的功能所对应的端口不固定,而是采用随机取用一些未被使用的小于
1024
的端口来使用,但客户端又不知道服务器端的相关端口,所以需要远程过程调用
(RPC)
的服务,
RPC
最主要的功能就是在指定每个
NFS
功能所对应的
port number
,并且返回给客户端,让客户端可以连结到正确的端口上去。
当服务器在启动
NFS
时会随机取用数个端口,并主动的向
RPC
注册,因此
RPC
可以知道每个端口对应的
NFS
功能,然后
RPC
又是固定使用
port 111
来监听客户端的需求并返回客户端正确的端口。
可以指定的静态端口:
MOUNT_PORT=”4002”
STATD_PORT=”4003”
LOCKD_TCPPORT=”4004”
LOCKD_UDPPORT=”4004”
ROUOTAD_PORT=”4005”
STATD_OUTGOING_PORT=”4006”
3.
NFS
包
:
nfs-utils-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.0.6-65.EL4
脚本
:
nfs
,
nfslock
端口
:
2049
(
Tcp/Udp
)
nfsd
,
其他半随机(
111Tcp/Udp,
及其他的小于
1024
的随机端口。)
配置文件
:/
etc/exports, /etc/sysconfig/nfs
进程:
rpc.mounted
ß
-------mount
lockd
ß
--------NLM
rpc.statd
ß
------NLM
NFS
主程序:
nfs-utils
RPC 主程序: portmap
RPC 主程序: portmap
/var/lib/nfs/*tab
在 NFS 服务器的登录档都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档,一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经连结到此 NFS 主机的相关客户端资料。
/var/lib/nfs/rmtab
状态文件,列出了挂接导出文件的远程客户机清单。
在 NFS 服务器的登录档都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档,一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经连结到此 NFS 主机的相关客户端资料。
/var/lib/nfs/rmtab
状态文件,列出了挂接导出文件的远程客户机清单。
4
.
服务器端得应用及其规则
:
A
.
安装
nfs
软件包
:
yum list all|grep nfs
yum install nfs-utils.i386
B
.启动
RPC
服务:
service portmap start
(
portmap
不需要设定,只要直接启动就行,启动之后,会出现一个
port 111
的
sunrpc
的服务
)
查看
RPC
服务的状态
:
service portmap status
rpcinfo -p localhost
(查看当前主机的
RPC
状态)
启动
nfs
服务
service nfs restart
(开启
nfs
服务)
chkconfig nfs on
(将其加入开机自启行列)
C
.编辑
nfs
的配置文件
:
vi /etc/exports(
默认为空
)
假设为下面所示:
/var/guest 192.168.1.0/24(rw,async)
/var/ftp 192.168.0.0/24(rw,no_root_squash,sync)
保存退出!
注意
:
下面是一些
NFS
共享的常用参数
:
ro: read-only ,只读访问权限
rw: read-write ,可读写的权限
sync: 资料同步写入到内存与硬盘中
async: 资料会先暂存于内存中,而非直接写入硬盘(异步)
secure: NFS 通过 1024 以下的安全 TCP/IP 端口发送
insecure: NFS 通过 1024 以上的端口发送
wdelay: 如果多个客户要写入 NFS 目录,则归组写入(默认)
no_wdelay: 如果多个客户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。
hide: 在 NFS 共享目录中不共享其子目录
no_hide: 共享 NFS 目录的子目录
subtree_check: 如果共享 /usr/bin 之类的子目录时,强制 NFS 检查父目录的权限(默认)
no_subtree_check: 和上面相对,不检查父目录权限
no_all_squash: 保留共享文件的 UID 和 GID (默认)
all_squash
不论登入 NFS 的使用者身份为何, 他的 UID 和 GID 映射匿名客户 anonymous( 通常也就是 nobody(nfsnobody)) ,适合公用目录。
root_squash
在登入 NFS 主机使用共享之目录的使用者如果是 root 时,那么这个使用者的权限将被映射成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody(nfsnobody) 那个系统帐号的身份的权限; uid 和 gid 由 0 变为 65534.
no_root_squash
登入 NFS 主机使用共享目录的使用者,如果是 root 的话,那么对于这个共享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
anonuid=xxx: 指定 NFS 服务器 /etc/passwd 文件中匿名客户的 UID
anongid=xxx: 指定 NFS 服务器 /etc/passwd 文件中匿名客户的 GID
ro: read-only ,只读访问权限
rw: read-write ,可读写的权限
sync: 资料同步写入到内存与硬盘中
async: 资料会先暂存于内存中,而非直接写入硬盘(异步)
secure: NFS 通过 1024 以下的安全 TCP/IP 端口发送
insecure: NFS 通过 1024 以上的端口发送
wdelay: 如果多个客户要写入 NFS 目录,则归组写入(默认)
no_wdelay: 如果多个客户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。
hide: 在 NFS 共享目录中不共享其子目录
no_hide: 共享 NFS 目录的子目录
subtree_check: 如果共享 /usr/bin 之类的子目录时,强制 NFS 检查父目录的权限(默认)
no_subtree_check: 和上面相对,不检查父目录权限
no_all_squash: 保留共享文件的 UID 和 GID (默认)
all_squash
不论登入 NFS 的使用者身份为何, 他的 UID 和 GID 映射匿名客户 anonymous( 通常也就是 nobody(nfsnobody)) ,适合公用目录。
root_squash
在登入 NFS 主机使用共享之目录的使用者如果是 root 时,那么这个使用者的权限将被映射成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody(nfsnobody) 那个系统帐号的身份的权限; uid 和 gid 由 0 变为 65534.
no_root_squash
登入 NFS 主机使用共享目录的使用者,如果是 root 的话,那么对于这个共享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
anonuid=xxx: 指定 NFS 服务器 /etc/passwd 文件中匿名客户的 UID
anongid=xxx: 指定 NFS 服务器 /etc/passwd 文件中匿名客户的 GID
D
.此时我们不需重启服务,可以使用命令将其重新读取:
exportfs –a
注意
:
-a
:全部挂载
(
或卸载和
-u
连用时
)/etc/exports
文件内的设置
-r : 重新挂载 /etc/exports 里面的设置,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容!
-u :卸载某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上 !
-r : 重新挂载 /etc/exports 里面的设置,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容!
-u :卸载某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上 !
exportfs -arv
重新挂载一次
/etc/exports
的设置
exportfs –auv
全部卸载
E
.
此时我们可以自己先检查一下
NFS
服务器是否可以连接
showmount –e localhost
showmount -a localhost
注意:
showmount [-ae] [hostname|IP]
-p
:显示出所有的
port
与
porgram
的信息;
参数:
-a :这个参数是一般在 NFS 服务器上使用,是用来显示已经挂载上本机 nfs 目录的客户机
参数:
-a :这个参数是一般在 NFS 服务器上使用,是用来显示已经挂载上本机 nfs 目录的客户机
-
d
:查看哪个目录已被挂载到
NFS
服务器上。(一般也在
NFS
服务器上使用)
-e :显示主机的 /etc/exports 所共享的目录
-e :显示主机的 /etc/exports 所共享的目录
5.
客户端的配置及规则:
A
.当客户端访问服务器时,我们需要首先建立挂载点
Eg
:
mkdir mnt
B
.挂载共享目录
mount -t nfs 192.168.1.0:/var/ftp mnt/
C.
此时我们可以切换到挂载目录中查看共享目录
showmount –e IP
(服务器的
ip
地址)
cd mnt
ls
如果是
root
用户,即可查看里面的文件,但是只读权限(规定为可读可写,为何为只读呢
?
)
Reason:
因为
root_squash
参数,没有规定时,都将
root
用户映射为匿名用户,将其
uid
和
gid
由
0
变为
65534
,权限缩减。除非声明声明
no_root_squash
,
root
用户登录时才可以保持共享目录中规定的权限。修改如下:
/
var/guest 192.168.1.0/24(rw,
no_root_squash
,
async)
6.
案例:
1.
假如说服务器上有个用户
natasha
,并且他是
/var/guest
目录的所有者,即将目录的用户和组都改为
natasha
,假如
natasha
的
uid
为
2001
,在客户机上有个
natasha
和
mary
两个用户,但
natasha
的
uid
为
2000
,
mary
的
uid
为
2001
,此时
natasha
将无法登录,而
mary
却可以查看(原因很简单,
NFS
是靠
uid
和
gid
来识别用户的身份的。)
2.
同一目录针对不同范围开放不同权限
# vi /etc/exports
/home/public 192.168.0.0/24(rw) *(ro)
/home/public 192.168.0.0/24(rw) *(ro)
即将主机与网域分为两段
(
用空格隔开
)
,
此时当客户机处于
192.168.0.0/24
这个网段中时,针对这个被挂在的目录就具有可读可写的权限;而其他网段的客户机挂载目录后就只有可读权限。
3.
开放匿名登入的情况
# vi /etc/exports
/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40)
# 如果要开放匿名,那么重点是 all_squash ,并且要配合 anonuid
# 如果要开放匿名,那么重点是 all_squash ,并且要配合 anonuid
当
test.linux.org
登入这部
NFS
主机,并且在
/home/linux
写入文件时,该文件的所有人与所有群组,就会变成
/etc/passwd
里面对应的
UID
为
40
的那个身份的使用者
。
总结
:
/etc/exports
中
client
的书写规则
(1) 单个主机
可以用短名及完全限定名( QFDN ),或者用 IP 地址,例如 student1 , student1.test.com.cn 或者 192.168.10.1
(1) 单个主机
可以用短名及完全限定名( QFDN ),或者用 IP 地址,例如 student1 , student1.test.com.cn 或者 192.168.10.1
(2)Net-Group
可以列出 /etc/netgroup 文件中或 NFS 网组映射中定义的整组主机。网组名以 @ 开头。
(3) 通配符主机( * ,?)
.discuz.net *. *.comsenz.com
可以列出 /etc/netgroup 文件中或 NFS 网组映射中定义的整组主机。网组名以 @ 开头。
(3) 通配符主机( * ,?)
.discuz.net *. *.comsenz.com
*
:
匹配零个或多个
?
:只匹配一个
(4) 掩码
192.168.1.0/255.255.255.0
(4) 掩码
192.168.1.0/255.255.255.0
转载于:https://blog.51cto.com/zhuying/284161