嵌入式环境搭建之NFS

Author:tiger-john
Time:2013-08-04
mail:jibo.tiger@gmail.com
Blog:http://blog.csdn.net/tigerjb/article/details/9748561

转载请注明出处!

[摘要]:本文介绍NFS相关概念,NFS配置文件以及介绍如何设置NFS服务端和客户端,并检验是否设置成功;并对出现的异常进行分析,同时给出一个嵌入式配置实例。

一. 网络文件系统简介

1.1.What is NFS ?

NFS就是Network FileSystem的缩写,是由Sun公司发展出来的。其目的是让linux 机器之间彼此分享文档。NFS可以让服务器端共享的目录挂载到本地客户机上,对于本地客户机器来说,远程服务器上的目录就好像自己的一部分。

1.2 whatis NFS, In embedded development engineer ‘s eyes?

它的功能是把NFS服务器(即Linux主机)的某个目录挂载到开发板的文件系统上。这样,开发板就可以执行该目录中的可执行程序。这样做的优点在于:不用将程序写入开发板的Flash,减少了对Flash的损害,同时也方便调试。

在嵌入式系统开发中主要用于NFS网络根文件系统启动或者网络加载调试应用程序。

1.3  NFS工作原理

NFS是基于客户/服务器模式的。NFS服务器是输出一组文件的计算机,而NFS客户端是访问文件的计算机。客户和服务器端通过远程过程调用通信,当客户主机上的应用程序访问远程文件时,客户主机内核向远程NFS服务器发送一个请求,等待服务器响应,而NFS服务器一直处于等待状态,如果接收到客户请求,就处理请求并将结果返回给客户机。NFS服务器上的目录如果可以被远程用户访问,就称为”导出(export)”;客户主机访问服务器导出目录的过程称为“安装(mount)”,或者称为“挂载”,“导入”等。

特点:

(1)Linux主机之间的共享

(2)开发板和开发主机之间的共享

(3)服务器可以是虚拟机,也可是是独立的Linux服务器

(4)在服务器上建立多个账户,多人共享,节省资源

(5)可以有独立的个人目录,安全可靠。

二.NFS server端的设定

NFS服务器的配置包括四个主要的步骤:

(1)安装NFS软件包

(2)在/etc/exprots文件中配置NFS服务器上要导出的文件系统或目录。

(3)启动NFS服务。

(4)导出/etc/exports中配置的文件系统或目录。

2.1 安装NFS

(1)在ubuntu下安装NFS可以通过如下命令:

#sudo  apt-get  install nfs-kernel-server

(2)NFS的启动和停止是通过/etc/init.d目录中的脚本文件nfs实现的。

(3)在命令行重启NFS的命令为/etc/init.d/nfs  restart

note:

在启动NFS服务器之前,先要启动rpcbind

#/etc/init.d/rpcbind restart

2.2  配置NFS服务器

(1)配置NFS主要涉及配置文件/etc/exports,它用于NFS服务器端,其中列出了NFS服务器中要导出的目录、可以访问这些目录的NFS客户机及其访问权限。

(2) /etc/exports文件的格式如下:

dir_to_export  NFS_client (permissions)  [NFS_client (permissions)…]

实例:

#vim  /etc/exports

/tmp       192.168.100.0/24(ro)  localhost(rw)  *(ro,sync)
[分享目录] [第一个客户端(权限)] [可用主机名] [可用通配符]

该实例表示将将/tmp 分别分享给三个不同的主机或网域。

格式中的输出目录和客户端之间,客户端与客户端之间都使用空格分隔,但是客户端和权限参数之间不能有空格。当若权限参数不止一个时,则以逗号(,) 分开。

输出目录:dir_to_export是要导出的文件系统或目录名称,也就是要共享给客户端使用的目录。该目录必须是一个绝对路径。

客户端:NFS_client是可以访问该NFS服务器的客户机名称。客户机的指定非常灵活,可以是单个主机的IP地址或域名,也可以是某个子网或域中主机等。

选项:该设置主要是权限(permissions),这是NFS客户机访问导出目录的访问权限,它的可选值为ro(只读)或rw(读写)。

note:

关于以上参数的详细解释,附件一:exportfs中各元素的详细说明。

2.3exportfs维护NFS服务的输出目录列表

(1)当修改了/etc/exprots文件的内容后,不需要重新启动NFS服务,而直接使用命令exportfs就可以使设置其立即生效。

(2)exportfs命令就是用来维护NFS服务的输出目录列表的,命令格式如下:

exportfs  [options]

-a :全部挂载(或卸载)/etc/exports文件中的所设置的所有目录

-r:重新挂载/etc/exports文件中的设置,并使设置立即生效,而不需要重新启动NFS服务。

-u:卸载某一目录

-v:在export的时候,将分享的目录显示到屏幕上。

(3)当修改了/etc/exports文件中的内容后,在命令执行如下命令使其配置立即生效:

# exportfs  -rv。

(4)全部卸载共享目录时,可以使用如下命令:

#exportfs -au

三.NFS客户端的设定

NFS服务器通过/etc/expors共享,并用exportfs发布。目录共享之后,可以用命令shownmount来显示共享目录。

NFS客户端配置需要以下几个步骤:

(1)编译内核时,选择NFS选项。

(2)使用showmount扫描NFS服务器分享的目录有哪些,并了解我们是否可以使用。

(3)在客户端建立预计要挂载的挂载点目录。

(4)利用mount将远程主机直接挂载到相关目录。

(5)查看挂载情况

3.1  NFS客户端的安装(在内核中支持NFS的配置)

要在目标板上运行nfs,必须编译内核,使得其支持NFS

 File systems
netwok file systems
<*>nfs file system support
<*>provide nfsv3 client support
<*>nfs server support

3.2 showmount查看NFS服务器信息

在客户端,要查看NFS服务器上有哪些共享目录,可以使用showmount命令。

(1)showmount的命令格式如下:

showmount  [-ade] [hostname]

-a:列出所有远程加载

-d:列出被远程加载的目录

-e:列出所有共享的文件系统

(2)例如:如果NFS服务器的IP地址为192.168.1.101,可以使用如下命令查看:

#showmount  -e192.168.1.101

3.3连接NFS服务器(mount)

在利用showmount命令得知远程NFS服务器上的共享资源后,接下来就是进行实际的挂载操作。

(1)挂载NFS服务器上的输出目录的命令格式如下:

mount -t nfs NFS_server_name :exported-directory  mount_point

-t nfs:指定文件系统类型。

NFS_server_name:是NFS服务器名称;

exported_directory:是要共享的目录;

mount_point:是在本机的安装位置。

(2)实例:

例如NFS客户端把远程文件系统tiger上导出的/share1目录安装在自己的文件系统/mnt/nfs目录下,以实现共享。

#mount  tiger:/share1  /mnt/nfs

(3)将共享目录挂接进来后,只要键入/mnt/nfs就等于进入了远程主机tiger上的/share1目录中了。

3.4 检查是否加载成功

(1)df可以显示目前系统的盘符,包括挂载的NFS目录。

(2)另外也可以直接查看挂载之后的目录,即可以知道挂载是否成功。

3.5 NFS 文件系统的卸载

使用umount命令

umount /home/think/test

卸载前需要退出当前挂载的目录,否则提示:

the device is busy!

3.6 NFS开机自动挂载

开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?不可以!!!分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦!不过,我们可以将其就写入到 /etc/rc.d/rc.local 即可!

#vim /etc/rc.d/rc.local

开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?不可以!!!分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦!不过,我们可以将其就写入到 /etc/rc.d/rc.local 即可!

#vim /etc/rc.d/rc.local

mout  -t  nfs  192.168.1.100:/home/think//EmbeddedWork  /mnt -o nolock

四. Execption

4.1 开发板和主机的网络不通

连接后若网络端了,则出现

nfs:server 192.168.0.12 not responding ,still trying

4.2连接超时

portmap: server localhost not responding, timed out

解决办法:

#mount -t nfs -o nolock node1:/public /public

即增加-o nolock参数,原因:

Unfsd doesn't support NLMlocking, and it's causing the lockd daemon to be started (which again requiresthe portmapper to be installed。

4.3 访问受限

access denied by server while mounting

可能的原因就是防火墙的问题或者是在配置文件中设置的那个IP段范围设置错了或者设置小了,如果修改之后还没有好的话,那就直接使用一个“*”代替之前的 那个整个IP号,虽然不是很安全,但是一定能解决办法。

4.5 服务器或客户端某些服务未启动

(1)mount: xxxxx failed: System Error:Connection refused

解决方法:

如果使用ping却发现网路与服务器都是好的,那么就是rpcbind没有开启。启动方法:

# /etc/init.d/rpcbind restart.

(2)mout: xxxxx  failed:RPCError:Program not  registered.

重新启动了rpcbind服务后,没有重启启动NFS服务。

解决方法:

# /etc/init.d/rpcbind restart.

#/etc/init.d/nfs  restart.

五.实例

5.1.嵌入式系统的典型设置

(1)嵌入式系统服务器端设定

由于嵌入式系统都是自己的电脑跟开发板相连来开发,对访问IP及权限等都没有太大的安全考虑,所以设置较为简单,一般使用如下的配置:

/home/think/EmbeddedWork  *(rw,sync,no_root_squash)

表示任意客户端都可以挂载服务器/home/think/EmbeddedWork目录。这样就不会因为IP设置问题使得开发板不能访问主机,具备可读写的权限,对于开发板上登陆的root用户,其拥有和主机root一样的权限。

(2)客户端(开发板)使用如下mount命令进行挂载

#mount -t nfs 192.168.1.100:/home/think//EmbeddedWork  /mnt -o nolock

附件一:exportfs中各元素的详细说明

1.客户端常用的指定方式 :

客户端                               说明
192.168.16.20 指定IP地址的主机
192.168.16.0/24(或192.168.16.*) 指定子网中的所有主机
pc1.gdvcp.net 指定域名的主机
*.gdvcp.net 指定域中的所有主机
*(或缺省) 所有主机

2.选项用来设置输出目录的访问权限,用户映射等,在/etc/exports文件中选项,比较多一般可以分成3类

(1)访问权限选项:

用于控制输出目录访问权限的选项

访问权限选项        说明
ro            设置输出目录只读
rw            设置输出目录可读写

(2)用户映射选项:

用户映射选项     说明
all_squash 不论登入 NFS 的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody
no_all_squash 不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)
root_squash 将root用户及所属用户组都映射为匿名用户或用户组(默认设置)
no_root_squash   不将root用户及所属用户组都映射为匿名用户或用户组
anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该匿名用户账户为本地用户账户(UID=xxx)
anongid=xxx 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx)

(3)常用的其他选项

其他选项比较多,可用于对输出目录进行更全面的控制

其他选项          说明
secure 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)
insecure  允许客户端从大于1024的TCP/IP端口连接NFS服务器
sync 将数据同步写入内存缓冲区与磁盘中,虽然这样做效率较低,但可以保证数据的一致性
async  将数据先保存在内存缓冲区中,必要时才写入磁盘。
wdelay 检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可提高效率(默认设置)
no_wdelay 若有写操作则立即执行,应与sync配合使用
subtree_check 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)
no_subtree_check 即使输出目录是一个子目录,NFS服务器也不检查其父目录的权限,这样做可提高效率

嵌入式环境搭建之NFS的更多相关文章

  1. 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  2. gdb调试嵌入式环境搭建

    1.下载gdb源代码 http://ftp.gnu.org/gnu/gdb/ 2.编译 解压#tar zxvf gdb-7.9.1.tar.gz,cd到解压的目录中. 2.1编译arm-linux-g ...

  3. centos7嵌入式环境搭建

    1. 在网上搜索下载交叉编译器arm-linux-gcc文件,我下载的是:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ...

  4. 搭建企业级NFS网络文件共享服务说明[一]

    1.1.0. 概述: 共享/NFS目录给整个192.168.25.0/24网段主机读写 man nfs 可以查看mount的信息 rpc端口111 nfs主端口2049 1.1.1. 搭建NFS环境 ...

  5. ubuntu14.04下嵌入式工作环境搭建

    昨天作死一不小心把小红帽home目录下的东西删光了.跟着国嵌的视频学了这么久,对linux也算是有些熟悉,就决定自己在ubuntu下搭建一个工作环境.整个过程还算比较顺利,不过也有些小波折.下面把这次 ...

  6. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  7. 00.嵌入式Linux开发环境搭建

     3.虚拟机上网配置 虚拟机如果要从网上获取资源,就要能够访问外网.虚拟机有三种上网方式:桥接上网,NAT上网,单主机模式[没用过].本节从原理和操作2个方面讲了NAT方式和桥接方式这2种不同的虚拟机 ...

  8. ubuntu-10.10嵌入式开发环境搭建【转】

    本文转载自:http://blog.csdn.net/zjhsucceed_329/article/details/8036781 版权声明:本文为博主原创文章,未经博主允许不得转载. ubuntu- ...

  9. iMX287A嵌入式Qt环境搭建

    目录 1.嵌入式Qt简介 2.查看开发板Qt库的版本 3.第一个嵌入式Qt程序--Hello World 4.Linux桌面版本Qt环境的搭建 5.注意 @ 1.嵌入式Qt简介 Qt 是一个跨平台的应 ...

随机推荐

  1. POJ 1470 Closest Common Ancestors(LCA&RMQ)

    题意比较费劲:输入看起来很麻烦.处理括号冒号的时候是用%1s就可以.还有就是注意它有根节点...Q次查询 在线st算法 /*************************************** ...

  2. 滑动页面,顶部导航or顶部 固定在一个位置

    现在很多页面 特别是电商用的比较多 比如电商里面某个商品的详细页 往下拉页面 当滚轮到达一定位置的时候  导航栏即固定在顶部 其实他的原理很简单, 就是一开始设置导航为相对定位,然后计算出滚动条离顶部 ...

  3. cancel-ng-swipe-right-on-child

    <!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...

  4. Datables wrning(table id='example'):Cannot reinitialise DataTable.

    出现的问题如下所示: Datables wrning(table id='example' Datables object for this table,please pass eithser no ...

  5. (转)PHP正则表达式的快速学习方法

    1.入门简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或 ...

  6. javascript判断值是否undefined

    function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }

  7. _Obj* __STL_VOLATILE* __my_free_list

    今天在读<STL源码剖析>空间配置器第二级时看到了这句,有点不解,于是查阅后知: obj后面是个指针 STL_VOLATILE也应该是个类型定义的吧,程序中应该有define来对它定义.所 ...

  8. 汇编程序w=x*y+z-200

    DATA   SEGMENTX      DW  1000Y      DW  2000Z      DW  3000W      DW  2 DUP(?)DATA   ENDSCODE   SEGM ...

  9. jQuery autoResize

    这是一个用jQuery实现的, 自动调整textarea高度, 非常的好!但原作者已经把它的相关描述页面移除了, 这里做个备份吧~但js路径还在:full: http://james.padolsey ...

  10. underscorejs-each学习

    2.1 each 2.1.1 语法: _.each(list, iteratee, [context]) 2.1.2 说明: 依次对集合的所有元素进行某种操作,原样返回list.接收3个参数,list ...