nfs服务器的搭建和使用

更新记录

version status description date author
V1.0 C Create Document 2019.1.11 John Wan

status:
C―― Create,
A—— Add,
M—— Modify,
D—— Delete。

注:内核版本 3.0.15,系统版本 Ubuntu 12.04.2 LTS

1、nfs介绍

1.1 nfs概念

  NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的不同的机器、不同的操作系统共享彼此的文件,共享资源。在NFS的应用中,可将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,这样本地NFS的客户端应用可以透明地读写位于远端NFS服务器上共享的文件,就像访问本地文件一样。

  • 好处:

    以下是NFS最显而易见的好处:

  1. 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
  2. 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
  3. 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。
  • 组成:

    NFS体系至少有两个主要部分:一台NFS服务器和若干台客户机。

    客户机通过网络远程访问存放在NFS服务器上的数据。

    在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。

1.2 nfs工作原理

  NFS服务器的挂载结构图:

01_nfs挂载结构图

  如上图示:

  在NFS服务器设置好一个共享目录/home/public,其他有权访问NFS服务器的NFS客户端就可将该目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。挂载好后客户端可在本地的挂载点看到服务端/home/public的所有数据,读、写、执行操作具体看服务器分配的权限。

  可通过查看磁盘信息命令:“df –h”,查看挂载情况。

1.3 nfs通讯过程

02_nfs通讯过程

图2:nfs通讯过程

  NFS是通过网络来进行服务器端和客户端之间的数据传输,最初是由UDP协议实现的,主要用于局域网(LAN),丢包重传的概率很小。但是随着发展,NFS已经不只使用在局域网中,更广泛地使用在广域网(WAN)中,这种情况下,主要使用的协议为TCP,TCP可以使得文件的操作更快。

注:在迅为iTop4412的教程中,使用的NFS与参考资料中不相同,目前只是记录学迅为的过程。

2、搭建和测试 NFS 服务器

2.1 搭建NFS服务器

2.1.1 下载并安装NFS服务器

  在确保联网的情况下,下载并安装 nfs-kernel-server

apt-get install nfs-kernel-server

2.1.2 修改NFS参数

  在 /etc/exports 文件最后一行添加 /home/work/ *(rw,sync,no_root_squash),各参数含义:

/home/work 要共享的目录
* 代表允许所有的网络段访问
rw 可读写权限
sync 资料同步写入内存和硬盘
no_root_squash: 是Ubuntu nfs 客户端分享目录使用者的权限,如果客户端使用的是root 用户,那么对于该共享目录而言,该客户端就具有root 权限;

其它参数:

ro:只读访问

async :nfs 在写入数据前可以相应请求

secure: nfs 通过以下的安全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_squash root:用户具有根目录的完全管理访问权限

anonuid=xxx:指定nfs 服务器/etc/passwd 文件中匿名用户多的UID

anongid=xxx:指定nfs 服务器/etc/passwd 文件中匿名用户的GID

2.1.3 重启portmap服务

$service portmap restart 或者 $/etc/init.d/portmap restart

2.1.4 重启 nfs 服务

$service nfs-kernel-server restart 或者 $/etc/init.d/nfs-kernel-server restart

2.1.5 portmap与nfs服务启动、停止、查看

  启动NFS服务器,需要启动portmap和nfs两个服务,并且portmap一定要先于nfs启动;

  停止NFS服务器,先停止NFS服务,再停止portmap服务(系统中无其他服务需要使用portmap时)。

启动:
	$service portmap start 或者 $/etc/init.d/portmap start
	$service nfs-kernel-server start 或者 $/etc/init.d/nfs-kernel-server start

查看:
	$service portmap status
	$service nfs-kernel-server status
	
停止:
	$service portmap stop
	$service nfs-kernel-server stop

2.1.6 portmap与nfs服务自动启动

  为了下次在重新启动系统时,NFS服务能够自动运行,可以使用checkconfig命令来进行设置。

  首先检查NFS和portmap服务启动时的运行等级,执行命令:

$chkconfig --list portmap
结果:portmap 0:关闭 1:关闭 2:关闭 3:启动  4:启动 5:启动 6:关闭 

$chkconfig --list nfs
结果:nfs 0:关闭 1:关闭 2:关闭 3:关闭  4:关闭 5:关闭 6:关闭

  即:portmap启动的运行等级为3,4,5,而nfs在任何运行等级中都不会执行。为了让nfs在系统运行级别为3,4,5时也能自动运行,可使用下面的命令进行设置:

$chkconfig --level 345 nfs on

2.2 测试NFS服务器

  前面nfs服务已经配置完成,设置了 /home/minilinux 为共享目录。

  挂载命令:"mount -t nfs localhost:/home/minilinux /mnt"localhost指明本机。

  卸载命令:"umount /home/minilinux /mnt"

  查看:"df" 或 "df -h"

文件目录结构:

root@ubuntu:/# ls /home
minilinux  topeet
root@ubuntu:/# ls /mnt
hgfs
root@ubuntu:/# ls /home/minilinux/
busybox-1.22.1  system  system.img
root@ubuntu:/# ls /home/minilinux/system
bin  dev  etc  lib  linuxrc  mnt  proc  sbin  sys  tmp  usr  var

2.2.1 将 /home/minilinux 挂载到 /mnt 目录下

root@ubuntu:/# mount -t nfs localhost:/home/minilinux/ /mnt
root@ubuntu:/# df
Filesystem                 1K-blocks     Used Available Use% Mounted on
/dev/sda1                   60894268 10281032  47519988  18% /
udev                         1876528        4   1876524   1% /dev
tmpfs                         754320      812    753508   1% /run
none                            5120        0      5120   0% /run/lock
none                         1885796      200   1885596   1% /run/shm
localhost:/home/minilinux/  60894720 10281472  47520256  18% /mnt
root@ubuntu:/# ls /mnt
busybox-1.22.1  system  system.img

root@ubuntu:/# cd /mnt
root@ubuntu:/mnt# ls
busybox-1.22.1  system  system.img
root@ubuntu:/mnt# mkdir helloword
root@ubuntu:/mnt# ls
busybox-1.22.1  helloword  system  system.img
root@ubuntu:/mnt# ls /home/minilinux/
busybox-1.22.1  helloword  system  system.img

  从上面可看到挂载成功之后,在 /mnt 可查看和操作 /home/minilinux中的文件。

2.2.2 将 /home 挂载到 /mnt 目录下

root@ubuntu:/# mount -t nfs localhost:/home /mnt
root@ubuntu:/# df
Filesystem      1K-blocks     Used Available Use% Mounted on
/dev/sda1        60894268 10281036  47519984  18% /
udev              1876528        4   1876524   1% /dev
tmpfs              754320      812    753508   1% /run
none                 5120        0      5120   0% /run/lock
none              1885796      200   1885596   1% /run/shm
localhost:/home  60894720 10281472  47520256  18% /mnt
root@ubuntu:/# ls /mnt
minilinux

  从上面可看到挂载成功之后,如果挂载的文件目录层级比指定的共享目录层级高,那么只能操作指定的共享目录。

2.2.3 将 /home/minilinux/system 挂载到 /mnt 目录下

root@ubuntu:/# mount -t nfs localhost:/home/minilinux/system /mnt
root@ubuntu:/# df
Filesystem                       1K-blocks     Used Available Use% Mounted on
/dev/sda1                         60894268 10281036  47519984  18% /
udev                               1876528        4   1876524   1% /dev
tmpfs                               754320      812    753508   1% /run
none                                  5120        0      5120   0% /run/lock
none                               1885796      200   1885596   1% /run/shm
localhost:/home/minilinux/system  60894720 10281472  47520256  18% /mnt
root@ubuntu:/# ls /mnt
bin  dev  etc  lib  linuxrc  mnt  proc  sbin  sys  tmp  usr  var

  从上面可看到挂载成功之后,如果挂载的文件目录层级比指定的共享目录层级低,那么只能操作挂载的文件目录。

3、在线调试:NFS共享目录

  通过 NFS 服务,可以实现在线调试文件系统或应用程序,开发板可直接访问PC上的文件,而不用烧写到开发板的额MMC中再执行。极大的提高了调试效率。

  前面已经了解了如何在搭建NFS服务器,那么接下来需要配置好一个开启了nfs服务并能通过网络访问NFS服务器的内核,并将其编译烧录到开发板中,这样就能够在开发板上通过NFS服务直接访问PC上的文件。

3.1 配置内核

3.1.1 设备内核参数

  将迅为的内核源码(iTop4412_Kernel_3.0_20170719.tar.gz)拷贝到Ubuntu中,并解压。

  解压命令:"tar -xzvf 文件名"

  在解压的文件中执行:"cp config_for_linux_scp_elite .config",根据买的板子型号进行选择,我的是精英板SCP封装。

  执行:"make menuconfig" 命令,进行配置。

  1. Networking support -->

    ​ Networking options ---> "

    ​ [*] IP: kernel level autoconfiguration

   IP: kernel level autoconfiguration:内核启动时自动配置IP地址、路由表等,需要从网络启动的无盘工作站需要这个,普通用户不需要。

  1. File systems --->

​ [*] Network File Systems --->

​ <*> NFS client support

​ [*] NFS client support for NFS version 3

​ [*] NFS client support for the NFSv3 ACL protocol extension

​ [*] NFS client support for NFS version 4

​ [*] NFS client support for NFSv4.1 (EXPERIMENTAL)

​ [*] Root file system on NFS

   开启内核中NFS相关服务。

  1. 编译内核:执行"make zImage",生成的镜像文件在 "./arch/arm/boot" 中。

3.1.2 烧写内核

  参考烧写内核章节

3.2 挂载 nfs 目录

  首先查看板子的IP,需保证板子的IP与PC处于同一网段。

  IP查看:"ifconfig",IP改写:"vi /etc/eth0-setting"。修改之后要重新确认是否已经改过来,如果未改,重启网卡或重启开发板。

  挂载目录:"mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt"

mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt

1.将NFS服务器的共享文件(192.168.1.103:/home/minilinux/system)挂载到 /mnt 上。

2."-o nolock" 参数:
	nfs mount 默认选项包括文件锁,依赖于portmap提供的动态端口分配功能。
	解决方法:kill 文件锁(lockd)或者 mount -o nolock

    [root@FORLINX6410]# mount -t nfs 192.168.0.1:/home/hellolinux/rootfs /mnt/nfs
    svc: failed to register lockdv1 RPC service (errno 111).
    mount: mounting 192.168.0.1:/home/hellolinux/rootfs on /mnt/nfs failed: Connection refused

  查看挂载情况:"df"

  至此,开发板可以直接访问PC的文件,那么之后在调试时,只要将编译好的文件放入共享的目录中,在开发板上就能够直接进行执行或加载,无需再执行下载到开发板上的操作了。

  以上是手动挂载,如何实现自动挂载呢?

3.3 内核启动自动挂载nfs目录

  通过修改 /etc/init.d/rcS 文件,使得内核启动时,自动运行我们的命令。

  打开开发板的 /etc/init.d/rcS 文件,在文末添加

ifconfig eth0 192.168.1.230 up             
mount -t nfs -o nolock 192.168.1.103:/home/minilinux/system /mnt  
  1. 第一句是使开发板的IP固定,而不用每次都去ifconfig
  2. 第二句,也就是前面手动挂载的命令。放到该文件中,内核启动时,自动运行。

注意:可能出现在开发板上手动mount可以,但自动加载不行的情况,那么在添加mount命令之前添加了 "sleep 5" 这条命令,可能是系统启动时,有些网络服务还未稳定。

参考:

  1. TCP/IP协议学习之六(RPC原理以及NFS协议)
  2. NFS笔记(一)NFS服务器工作原理及详细配置
  3. 迅为iTop4412精英板—linux系统编程—视频10、11
  4. 迅为独立文档和程序源码汇总—关于nfs那几篇文档
  5. 关于在开发板中实现NFS自动挂载的问题
posted on 2019-03-06 16:02  昨天注的册  阅读(732)  评论(0编辑  收藏  举报