NFS网络操作系统介绍以及相关应用
1. NFS服务简介
NFS是Network File System 的缩写,中文名称为网络文件系统,由Sun公司开发,功能是通过网络让不同的机器、不同的操作能够彼此分享数据,让应用程序在客户端通过网恋过访问位于服务器磁盘中的数据,是类Unix系统间实现磁盘文件共享的一种方法。
NFS在文件传送或信息传送的过程中,依赖于RPC协议。RPC(Remote Procedure Call),中文名为远程过程调用,它是一种能使客户端执行其他系统中程序的一种机制,可以说NFS本身是使用RPC进行通讯的一个程序,凡是用到NFS的地方,无论是NFS Server或者NFS Client,都需要开启RPC服务,这样Server和Client才能通过RPC来实现PROGRAM PORT的对于,可以这么来理解,NFS是一个文件系统,RPC是负责信息的传输。
2. NFS安装和配置
在Linux下,安装NFS非常简单,只需要
nfs-utils-* : 包含基本的NFS命令与监控程序
portmap-* : 支持安全NFS RPC服务的连接
当NFS服务启动后,它会有三个守护进程来配合协调工作。
nfsd: 最基本的nfs守护进程,主要功能是管理客户端是否能够登陆服务器并提供服务,使用端口为2049
mountd: RPC的守护进程,主要功能是管理NFS文件系统,当客户端通过nfsd登陆成功NFS服务器后,还需要鉴权操作。鉴权依据NFS的配置文件
/etc/exports
portmap: 主动进行端口映射工作,当客户端尝试连接并且使用NFS时,portmap会将所管理NFS服务端口提供给客户端,从而使客户端可以通过该端口向服务器发出请求,使用端口为111,在新版本中,portmap被rpcbind取代。
上面介绍了NFS的安装和守护进程,一般来说,需要先配置好服务器,再配置好客户端,就可以正常工作。 下面先介绍如何配置NFS服务器。
NFS的常用目录
/etc/exports NFS服务的主要配置文件 /usr/sbin/exportfs NFS服务的管理命令
/usr/sbin/showmount 客户端的查看命令 /var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值 /var/lib/nfs/xtab 记录曾经登录过的客户端信息
NFS服务器的配置主要是对/etc/exports的配置,其文件内容格式如下:
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
共享目录 有权访问共享目录的主机 选项用来设置输出目录的访问权限(ro,rw)、用户映射等
用户映射选项:
- all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
- no_all_squash:与all_squash取反(默认设置);
- root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
- no_root_squash:与rootsquash取反;
- anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
- anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其他选项:
- secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
- insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
- sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
- wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
- no_wdelay:若有写操作则立即执行,应与sync配合使用;
- subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
- no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
例如:将NFS Server 的/home/david/ 共享给192.168.1.0/24网段,权限读写,
配置文件/etc/exports添加一行: /home/david 192.168.1.0/24(rw)
配置好exports文件后,就可以启动NFS服务器,nfs服务器程序依赖protmap和nfs程序,所以要先启动他们两个。
执行 service portmap[nfs] start 启动服务,执行service portmap[nfs] status查看服务状态。
凡是修改/etc/exports文件后,需要先执行service portmap restart,在执行service nfs restart,就可以使设置的参数生效。
exportfs命令可以查看当前nfs配置文件内容。
# exportfs [-aruv]
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
具体例子:
# exportfs -au 卸载所有共享目录
# exportfs -rv 重新共享所有目录并输出详细信息
用户可以通过nfsstat来查看nfs的运行状态,通过rpcinfo来检测rpc运行情况,rpcinfo –p 查看哪些程序使用的RPC端口。
showmount 查看目前有多少客户端连接。
停止NFS服务器,执行service nfs stop,是否停止protmap看系统中还有谁在使用此服务来决定。
服务器端的NFS设置完成后,下面来设置客户端的NFS。
mount NFS服务器IP:共享目录 本地挂载目录
例如: mount 192.168.1.108:/home/hao /mnt/ 表示将108服务器下的/home/hao目录挂载到本地mnt目录下。
将 192.168.1.108:/home/hao /mnt nfs defaults 0 0 写入/etc/fstab文件,就可以让系统开机启动时,自动挂载NFS文件系统。
挂载成功之后,上述两个目录内的文件保持同步变化。卸载已挂账的NFS共享目录umount /home/hao。
新版本上面,已经用rpcbind来代替portmap,用nfs-kernel-server来代替nfs。
上面介绍了nfs挂载的相关知识,如果在共享目录里面创建文件,那么这个文件属于谁呢?这里面就牵涉到NFS的权限问题,下面来介绍。
3. NFS的权限控制
同一个文件夹,在两个不同的Linux系统上可以进行同时更改,创建。如果A系统上是A用户,B系统上是B用户,A用户在自己目录(非NFS共享目录)下创建文件,文件的属主属于A,B用户的属于B,这样是没有冲突的。如果A和B都在NFS共享目录里面创建文件,这又怎么来处理呢?
如果客户端所在的共享目录无法创建文件,原因可能是NFS服务器端的共享目录本身的写权限没有开放给其他用户,这可以通过chmod 777 –R 目录来解决。
NFS有很多默认的参数,打开/var/lib/nfs/etab 查看分享文件夹的完整权限设定值。
root用户创建文件的文件属主和组默认是nfsnobody,而普通用户写入文件时就是自己的名字,这保证了服务器的安全性
3. 在嵌入式领域的应用
使用NFSROOT来启动开发板,可以避免重复制作根文件系统(rootfs)镜像以及烧写文件系统,从而节省大量拷贝、传送文件的操作,节省开发时间。
如何开启nfsroot功能?开启nfsroot功能需要具备如下几个条件:
1. 宿主机(一般为虚拟机里面的Linux系统)要开启nfs server服务
2. 开发板的网口要畅通
3. 开发板的Linux内核要支持nfsroot
1和2是硬件条件,一般都是支持的。第三项需要对内核和uboot进行相关设置才行,下面来介绍:
首先,内核配置里面,要选中有关NFSROOT的选项
选择完毕后,编译运行,然后烧写到Flash指定分区就行。这一步是让kernel有能力去从nfs上挂载rootfs,但具体的路径参数还不知道,剩下的需要通过配置uboot终端bootargs参数,这个参数会传递给kernel,kernel根据此参数去找具体的路径并且挂载。下面介绍在Uboot中,启动nfs的相关参数
在Uboot命令行中,输入
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=192.168.4.165:/home/NFSROOT/rootfs_dir
ip=192.168.4.99:192.168.4.1:255.255.255.0 mtdparts=hi_sfc:256K(boot),256K(env),1792K(kernel),-(rootfs)'