更新记录

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服务器的挂载结构图:

  如上图示:

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

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

1.3 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自动挂载的问题

nfs服务器的搭建和使用的更多相关文章

  1. 自学linux——21. NFS服务器的搭建

    NFS服务器的搭建 1.NFS的认识 NFS(Network File System即网络文件系统)服务最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享文件,可以将远程 Linu ...

  2. 4、nfs服务器的搭建

    4.1.nfs服务介绍: samba服务器一般互联网企业不会使用 nfs服务的端口是不固定的,需要先启动rpc服务对nfs服务端口进行注册 4.2.安装nfs: rpm -qa nfs-utils r ...

  3. 4412开发板学习笔记-NFS服务器的搭建

    转自iTOP-4412讨论群: http://www.topeetboard.com 先来介绍一下NFS: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件 ...

  4. Liunx下NFS服务器的搭建与配置

    一.NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NF ...

  5. Linux下NFS服务器的搭建与配置

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  6. Linux下NFS服务器的搭建与配置(转载)

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  7. Linux下NFS服务器的搭建与配置(转)

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  8. NFS服务器的搭建与使用,实现数据同步

    NFS的基本架构,如下图所示: NFS服务是基本RPC协议的,所以安装NFS的前提要安装RPC协议,就像java语言一定要基于jdk一样! 下面的搭建centos-1作为服务端模拟A服务器,cento ...

  9. CentOS NFS服务器的搭建与配置

    1.查看系统是否已安装NFS [root@bogon ~]# rpm -qa | grep nfs [root@bogon ~]# rpm -qa | grep rpcbind 2.安装NFS [ro ...

随机推荐

  1. vsCode安装todo插件

    使用过IDEA或者WebStrom的阿媛应该都知道他们都有一个TODO功能,方便我们跟踪注释,或者说是我们在项目代码里面所做的标记:但是如果你现在在使用vsCode,你会发现,没有TODO功能,幸好, ...

  2. python之scrapy的debug、shell、settings、pipelines

    1.debug了解 2.scrapy shell了解 Scrapy shell是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath表达式 使用方法: scrap ...

  3. 【转】APIJSON,让接口见鬼去吧!

    我: APIJSON,让接口和文档见鬼去吧! https://github.com/TommyLemon/APIJSON 服务端: 什么鬼? 客户端: APIJSON是啥? 我: APIJSON是一种 ...

  4. 利用Oracle定时任务重置序列

    业务需求是:二元化编号规则:RYH+年月+001(开始),按月计算,每月1号重置为001 数据库中已有序列和函数如下: 解决方法:采用Oracle定时任务,每月1号重置该序列从1开始增长,SQL如下: ...

  5. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  6. Tensorflow 保存模型 & 在java中调用

    本节涉及: 保存TensorFlow 的模型供其他语言使用 java中调用模型并进行预测计算 一.保存TensorFlow 的模型供其他语言使用 如果用户选择“y” ,则执行下面的步骤: 判断程序执行 ...

  7. 【VS开发】关于在CFormView中实现CListCtrl控件的注意事项

    [VS开发]关于在CFormView中实现CListCtrl控件的注意事项 标签(空格分隔): [VS开发] 今天调试中发现了一项非常令人恼怒的事情,本来早都知道在CFormView中没有了像在对话框 ...

  8. 请求头出现Provisional headers are shown

    provisional headers are shown 知多少:https://juejin.im/post/5c00980751882518805add83 请求头出现Provisional h ...

  9. day29 元类及异常处理

    元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'ty ...

  10. 手写Indexof

    String.prototype.indexO = function(st){ // console.log(this.length); let str = this; var j = 0; let ...