NFS是Network File System的简写,即网络文件系统。NFS早期是被sun公司开发的一种在unix,linux系统上实现文件共享的一种协议(windows系统下很难使用这种协议),而且这种协议是直接作进内核的。根据这种协议产生了后来的NFS文件共享,它有如下好处:
1).本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一台机器上而且可以通过网络访问到。
2).用户不必在每个网络上机器里头都有一个home目录。Home目录 可以被放在NFS服务器上并且在网络上处处可用。
3).诸如软驱,CDROM,和 Zip(是指一种高储存密度的磁盘驱动器与磁盘)之类的存储设备可以在网络上面被别的机器使用。这可以减少整个网络上的可移动介质设备的数量。
NFS协议到现在经历了V1,V2,V3,V4版本,但是它有一个缺点就是协议没有用户认证机制,而且数据在网络上传送的时候是明文传送,所以安全性极差,一般只能在局域网中使用。
使用前先介绍些NFS文件共享的一些知识
1).上面说过NFS协议本身没有用户身份认证机制,那么客户端如何使用的服务的的资源的呢?NFS通过映射的方式解决这个问题,这里要提醒的是client端的root用户被映射为nfsnobody,这也是一种安全机制
2).NFS这个协议是依赖于RPC协议的,就是说在客户端请求NFS的时候,请求首先被交给了RPC(监听在TCP和UDP的111端口),RPC这时候检查自己是否检测了NFS,如果是,由RPC随机选择端口给NFS(这有可能占用其他服务的端口,比如mysql3306),然后用户通过这个端口和NFS之间进行通信
#rpcinfo -p //查看RPC检测下的服务
3).NFS启动之后有五个进程
nfsd:服务器端进程,它是一个内核线程(不受rpc的管理,其他四个受rpc管理),监听在TCP和UDP的2049端口
rpc.mounted:这个进程是被RPC监控的
rpc.statd:检测server端和client端之间通信状态的一个进程
locked:这是个内核的锁线程,半随机
rpc.quotad:这是一个定义用户最多使用多少磁盘空间的线程(实现磁盘配额的控制)
4).NFS服务相关的配置文件有两个
/etc/exports:定义sever端共享的目录及可使用此目录用户的文件
/etc/sysconfig/nfs:可以定义NFS使用固定端口的文件
5).挂载权限有以下几种:
rw:允许读写
async:允许异步写入
sync:同步写入
root_squash:当时root的时候被映射为nfsnobody用户
no_root_squash:不映射root用户为nfsnobody
all_squash:映射客户端所有用户为nfsnobody
6).一些命令的介绍
#showmount -e 192.168.2.129 //查看客户端共享出得文件目录有哪些(客户端使用)
#showmount -a //查看共享出的目录被哪些用户使用(服务端的使用)
#exportfs -ar //更改配置文件后重新读取以下(相当于重启服务)
#exportfs -au //关闭所有共享的目录
具体使用过程:
nfs-utils是nfs服务的一个脚本控制工具,使用nfs前要安装上这个包
#yum list nfs-utils //检查是否安装了nfs-utils
sever端(IP:192.168.2.129)
1), #vim /etc/exports //编辑这个文件,加入以下内容
/tmp 192.168.0.0/24(ro,async),172.16.0.0/16(rw) //注意这里格式必须如这个格式,要共享的目录与允许访问的IP地址或者网段之间必须有空格,其他地方不能有空格;挂载权限之间只能用“,”隔开
2), #service nfs start //启动nfs服务
3), #chkconfig nfs on //让nfs服务开机自动启动
client端(IP:192.168.2.130)
1),#showmount -e 192.168.2.129 //显示server段共享出来的目录
2),#mount -t nfs 192.168.2.129:/backup /mnt //挂载server端的/backup目录到client端的/mnt目录
但是我们发现,我们进入挂载目录之后对文件不具有写权限
我们不是root用户吗?为什么我们不具有写权限呢?这就是以下要说明的内容:
客户端挂载的文件系统的权限取决于两项:文件权限和挂载权限,并且nfs文件系统的用户映射是根据ID映射的
如果server端的文件用户为gentoo,id为166,那么client端没有这个用户gentoo,但是有一个id=166的用户jobs,那么server端的文件属主在client端将被映射为jobs
server端把client端的用户映射为两类:
root用户被映射为nfsnobody(通常只有读权限,这是一种安全机制)
一般用户中如果server端的文件ID在client端中存在,则被映射为client端的用户名字,如果不存在,则被映射为其他用户,解决上述问题我们需要明白,此时我们的身份为root用户,但是映射过去之后为nfsnobody用户,所以不具有写权限,此时我们要写这个文件,在服务端给这个文件权限中的其他用户一个写权限即可。
如何让NFS工作在特定的端口上?
1).编辑/etc/sysconfig/nfs文件,加入以下几行
注意这里的端口号是自己跟具实际情况选择的,选择那些没有被占用的即可,但是我们如何知道哪些端口没有被占用呢?
/etc/services 这个文件定义了所有的服务及对应的端口号,我们可以根据这个文件来确定端口号,比如我们想选择4004,那么我们可以使用
#cat /etc/services | grep 4004
如果没显示任何内容,说明没有其他服务在使用这个端口,则4004端口可以被使用