zoukankan      html  css  js  c++  java
  • 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自动挂载的问题
  • 相关阅读:
    winsock编程WSAAsyncSelect模型
    winsock编程select模型
    socket编程,简单多线程服务端测试程序
    模板singleton模式的C++实现
    windows socket函数详解
    ACE_Message_Block消息数据类
    ACE Socket Wrapper Facade
    ACE_Event_Handler:事件响应入口
    ACE_Time_Value
    华为ICDcomm接口js测试
  • 原文地址:https://www.cnblogs.com/wanjianjun777/p/10483827.html
Copyright © 2011-2022 走看看