网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。 在嵌入式Linux 的开发过程中,开发者需要在Linux 服务器上进行所有的软件开发,交叉编译后,通用FTP 方式将可执行文件下载到嵌入式系统运行,但这种方式不但效率低下,且无法实现在线的调试。因此,可以通过建立NFS,把Linux 服务器上的特定分区共享到待调试的嵌入式目标系统上,就可以直接在嵌入式目标系统上操作Linux 服务器,同时可以在线对程序进行调试和修改,大大的方便了软件的开发。因此,NFS 的是嵌入式Linux 开发的一个重要的组成部分,本部分内容将详细说明如何配置嵌入式Linux 的NFS 开发环境。 嵌入式Linux 的NFS 开发环境的实现包括两个方面:一是Linux 服务器端的NFS 服务器支持;二是嵌入式目标系统的NFS 客户端的支持。因此,NFS 开发环境的建立需要配置linux 服务器端和嵌入式目标系统端。 一、Linux 服务器端NFS 服务器的配置 以root 身份登陆Linux 服务器,编辑/etc 目录下的共享目录配置文件exports,指定共享目录及权限等。 执行如下命令编辑文件/etc/exports: # vi /etc/exports 在该文件里添加如下内容: /home/work 192.168.0.*(rw,sync,no_root_squash) 然后保存退出。 添加的内容表示:允许ip 地址范围在192.168.0.*的计算机以读写的权限来访问/home/work 目录。 /home/work 也称为服务器输出共享目录。 括号内的参数意义描述如下: rw:读/写权限,只读权限的参数为ro; sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。 no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。 接着执行如下命令,启动端口映射: # /etc/rc.d/init.d/portmap start 最后执行如下命令启动NFS 服务,此时NFS 会激活守护进程,然后就开始监听 Client 端的请求: # /etc/rc.d/init.d/nfs start 用户也可以重新启动Linux 服务器,自动启动NFS 服务。 在NFS 服务器启动后,还需要检查Linux 服务器的防火墙等设置(一般需要关闭防火墙服务),确保没有屏蔽掉NFS 使用的端口和允许通信的主机,主要是检查Linux 服务器iptables,ipchains 等选项的设置,以及/etc/hosts.deny,/etc/hosts.allow 文件。 我们首先在Linux 服务器上进行NFS 服务器的回环测试,验证共享目录是否能够被访问。在Linux 服务器上运行如下命令: # mount –t nfs 192.168.0.20:/home/work /mnt # ls /mnt 命令将Linux 服务器的NFS 输出共享目录挂载到/mnt 目录下,因此,如果NFS 正常工作,应该能够在/mnt 目录看到/home/work 共享目录中的内容。 二、嵌入式目标系统NFS 客户端的配置 在Linux 服务器设置好后,还需要对客户端进行相关配置。在配置内核时选择Load an Alternate Configuration File输入配置文件的路径和文件名添加内核对NFS的支持: 选中networking options-》IP:kernel level auloconfiguralion项 选中file systems-》network file systems-》下的root file system on nfs 和nfs file system support重新编译内核下载bootloader和kernel到开发板上 在嵌入式目标系统的Linux Shell 下,执行如下命令来进行NFS 共享目录挂载: # mkdir /mnt/nfs //建立Linux 服务器输出共享目录的挂载点; # mount –t nfs 192.168.0.20:/home/work /mnt/nfs –o nolock # cd /mnt/nfs # ls 此时,嵌入式目标系统端所显示的内容即为Linux 服务器的输出目录的内容,即Linux 服务器的输出目。 录/home/work 通过NFS 映射到了嵌入式目标系统的/mnt/nfs 目录。用户可以用增/删/修改文件的方式来验证实际效果。mount 命令中的192.168.0.20 为Linux 服务器的IP 地址,/home/work 为Linux 服务器端所配置的共享输出目录,/mnt/nfs 为嵌入式设备上的本地目录。 在开发过程中,来回输入命令非常烦人,我写了两个简单的脚本来完成nfs的启动,挂载。 host启动nfs: snfs #!/bin/bash ifconfig eth0 192.168.0.20 /etc/rc.d/init.d/portmap start /etc/rc.d/init.d/nfs start 嵌入式目标机挂载nfs: mnfs: #!/bin/sh mount -t nfs 192.168.0.20:/home/work/nfs /mnt/nfs -o nolock echo “nfs ok!” 核心提示: nfs 服务是基于 rpc 来实现的一个方便的共享文件系统, linux 和 windows 之间共享的文件非常的便利。 linux 中 nfs 已经被完全整合进了内核,只要在编译内核的时候选择编译文件系统,那么默认就支持 nfs nfs nfs 服务是基于 rpc 来实现的一个方便的共享文件系统, linux 和 windows 之间共享的文件非常的便利。 linux 中 nfs 已经被完全整合进了内核,只要在编译内核的时候选择编译文件系统,那么默认就支持 nfs nfs 主服务进程使用的端口是 2049 udp 和 2049 tcp 其他进程端口都是半随机的基于 portmap 建议在 /etc/sysconfig/nf 将随机端口定义成静态端口,使端口不混乱,并且利于配置 iptables 防火墙策略 nfs 装置包是 nfs-utils 基于 uid 识别用户,配置文件 /etc/export 和 /etc/sysconfig/nf nfs 多进程的 nfsd 主服务进程 工作于内核中的只能以 root 用户来运行 1 rpc.mountd 基于 rpc 实现的挂载监控的进程 2 rpc.srard 用户建立的连接若是断掉,负责通知服务器重新建立 4 连接 3 lockd 处置客户端请求文件锁,防止多用户同时对一个文件写入造成的抵触 4 rpc.rquotad RPC 辅助进程,默认监察随机端口 若是想让系统在启动时自动挂载 NFS 服务器上的输出目录,就编辑 /etc/fstab 加入如下格式 NFS 服务器名或 IP 地址:输出目录 外地挂载目录 nf default 0 0 实现 nfs 服务 只需要编译 /etc/export , 该文件默认为空的每一行表示你共享的一个文件系统 添加格式: 共享文件目录 允许访问的主机(访问权限) 注:被导出的目录为独立的文件系统,若不是则在权限中定义 subtrww_check 使更安全,如果共享文件中有空格用 “ 括起来, 定义允许访问的主机可以是 IP 网段, IP NIS 域( @NIS 域名)并且可以通配) 下面介绍几种常用的访问权限 ro 可读 rw 可读可写 async 异步写入 先将数据保存在内存缓存区中,必要时才写入磁盘 sync 同步写入 将数据同步写入内存缓存区与磁盘中,效率低但是可以保证数据的一致性 用户映射选项 root_squash 如果是 root 用户来挂载的话,权限太大,就把 root 用户映射成来宾账号(默认设置) no_root_squash root 访问时,不把 root 映射成来宾账号 该设置很危险 all_squash 将远程访问的所有用户和所属用户组都映射成匿名用户或用户组 no_all_squash 不将远程访问的所以用户和所属拥护组映射成匿名 默认设置) anonuid=xxx 将远程访问的所以用户都映射成匿名用户,并指定为本地用户( UID=xxx anongid=xxx 将远程访问的所以用户组都映射成匿名用户组账户,并指定为本地用户组( GID=xxx 其他常用项 secure 限制客户端只能从小于 1024 TCP/IP 端口连接 NFS 服务器(默认设置) insecur 允许客户端从大于 1024 TCP/IP 端口连接 NFS 服务器 subtree_check 若输出目录是一个子目录,则 NFS 将检查其父目录的权限(默认设置) no_subtree_check 即使输出的目录是一个子目录, NFS 也不检查其父目录的权限 每当修改了 /etc/export 文件后,不需要重启 NFS 服务,使用 exportfs 就可以使设置立即生效 exportfs 命令就是用来维护 NFS 服务的输出目录列表的 exportfs -r 重新读取 /etc/export 文件设置,并使设置立即生效 exportf – ra 重新导出全部 exportf – v 将当前系统导出项显示在屏幕上 exportf – au 关闭服务 exportf – a 开启所有的全部导出 showmount 命令检查 NFS 服务器上的共享信息 showmount – e localhost 检查当前主机共享的文件系统 只在服务端执行 showmount – a 检查所有被挂载信息 服务端执行) showmount – d 只显示被挂载目录 showmount – e IP 检查该 IP 共享的信息(客户端) 演示挂载过程 1 # vim /etc/exports /var/ftp 192.168.0.71 rw sync 192.168.1.0/24 ro /var/pub * ro 2 #servic nf restart #servic portmap status nfs 基于 portmap 所以确定 portmap 启动的 portmap pid 3110 is running... #rpcinfo – p localhost 显示进去当前 rpc 里 portmap 默认选择的端口 基于 rpc 提供服务 #servic nf restart 重启 nfs 服务,或者 #exportf – r showmount – e localhost 检查当前主机共享的文件系统 切换到 192.168.0.71 #mount – t nf 192.168.0.71:/var/ftp /mnt #cd /mnt l 检查 /var/ftp 下的文件是不是被挂在 /mnt 下了 Debian NFS服务器的启动和设定 NFS是网络文件共享系统。在网络中,这个协议的使用非常广泛,也是基于共享,网络才有了今天的发展。那么现在我们主要讲解一下Debian NFS服务器的一些安装和设置。 Debian下安装NFS服务器 安装Debian NFS服务器端: # aptitude install nfs-common nfs-kernel-server portmap 在客户端则需要安装: # aptitude install nfs-common portmap 启动服务: # /etc/init.d/nfs-kernel-server start 停止服务: # /etc/init.d/nfs-kernel-server stop 重启服务: # /etc/init.d/nfs-kernel-server restart Debian NFS服务器配置: 1、创建共享目录: # mkdir /home/share # chown nobody.nogroup /home/share 2、创建或修改/etc/exports配置文件 当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样: [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)] Debian NFS服务器共享的常用参数: ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async NFS在写入数据前可以相应请求 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 和上面相对,不检查父目录权限 all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 no_all_squash 保留共享文件的UID和GID(默认) root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认) no_root_squas root用户具有根目录的完全管理访问权限 anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID Debian NFS服务器配置文件/etc/exports内容如下: $ cat /etc/exports /home/share 192.168.102.15(rw,sync) *(ro) 配置说明: 对192.168.102.15赋予读写权限,其他机器仅有只读权限。 重启服务器: # /etc/init.d/nfs-kernel-server restart 3、在客户机上查看NFS服务器的资源共享情况: # showmount -e 192.168.102.47 4、在客户端使用mount命令挂载共享目录: # mount 192.168.102.47:/home/share /mnt 是不是我们每次修改了配置文件都需要重启Debian NFS服务器服务呢? 这个时候我们就可以用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效。 比如: # exportfs -au 卸载所有共享目录 # exportfs -rv 重新共享所有目录并输出详细信息 exportfs 命令有软件包 nfs-kernel-server 提供,详细的 exportfs 命令说明请查看: # man exportfs (责任编辑:IT) |