第十节 挂载NFS 网络文件系统

2023-11-03

本章节将介绍如何挂载NFS 网络文件系统,为后面的主机编译生成的ARM Linux 应用传输到开发板做准备。

网络文件系统简介

网络文件系统,常被称为NFS(Network File System),它是一种非常便捷的在服务器与客户端通过网络共享文件的方式,具体见下图。

在这里插入图片描述

开启了NFS 服务后,客户端访问服务器共享的文件时如同访问本地存储器(磁盘/SD 卡/NANDFLASH 等)上的文件一样,对于上层应用来说没有任何差别,在嵌入式开发时,我们常常利用这个特性在主机上共享文件,主要应用场景如下:

  • 在NFS 服务器上编译应用软件,客户端(开发板)通过NFS 访问并运行应用程序进行测试。

  • 把NFS 作为根文件系统来启动

使用NFS 的实验环境架构

在后面章节的实验中,我们常常通过NFS 给开发板共享开发主机编写的应用程序,在本节内容将介绍如何在开发板和开发主机之间共享目录。我们要构建的使用NFS 文件系统的实验环境架构如下图所示。

在这里插入图片描述

在这样的环境中,开发板与开发主机接入到同一个局域网中,然后开发主机提供NFS 服务,开发板通过NFS 与开发主机连接共享文件。开发主机生成的目标板应用程序放在NFS 的共享文件夹内,开发板访问该文件夹执行应用程序进行测试。

在另一方面,开发主机与开发板通过串口连接,使用串口终端控制开发板。

搭建NFS 环境

接下来介绍如何利用NFS 搭建上述实验环境。主要包含连接网络、主机开启NFS 服务以及开发板挂载文件系统三个步骤。

我们的目标是使开发主机与开发板的以下目录映射起来:

开发主机共享目录:/home/embedfire/workdir

开发板的挂载目录:/mnt

连接到局域网络

连接到局域网

在本应用场景中开发主机和开发板需要通过网络互相访问,另外由于NFS 文件系统暴露到公网需要处理很多安全问题,为简化操作,我们把开发主机和开发板连接到局域网络,即都使用网线把它们连接到同一个交换机(路由器)上,如上图所示。

如果开发主机是安装在虚拟机上,注意要在VirtualBox 把虚拟机的网络配置改成“桥接网卡”模式,见下图,若修改了该配置,需要重启虚拟机才生效。

在这里插入图片描述

互ping 测试

连接好网络后在开发主机和开发板之间进行互ping 测试,以保证网络互通。ping 命令格式为:

ping [目标主机名或目标ip 地址]

这里以ping 主机名为例,见下图:

开发主机ping 开发板

在这里插入图片描述

开发板ping 主机

在这里插入图片描述

若测试成功,会返回ttl 域和时间,使用Ctrl+c 可退出命令。

在ping 命令的打印信息中,我们还可以了解到本示例中开发主机的IP 为192.168.100.4,开发板的IP 为192.168.100.3,我们也可以使用ifconfig 命令来查看它们的ip 地址和子网掩码,如下图:

在这里插入图片描述

在上图中开发板使用ifconfig 命令可查看到开发板有两个网卡,分别是其两个网络接口的信息,其中eth1 没有接网线,所以不能正常使用,而eth2 可看到其IP 地址为192.168.100.3,在开发主机的终端上可使用该IP 进行ping 测试。

注意:若在开发主机上使用ifconfig 提示找不到命令,请使用如下命令进行安装:

# 以下命令在主机上运行
sudo apt install net-tools

根据开发主机的ip 和子网掩码,我们可以判断开发主板处于192.168.100.* 的网段中,我们只要保证开发主机网络也在同一个局域网网段中,就能让它们通信。

若使用ifconfig 命令查看不到IP 地址,或IP 地址与开发主机的IP 不在同一个网段,请检查网络连接。

如果使用主机名无法ping 通,请直接用IP 地址进行ping 测试,见下图。

开发主机ping 开发板

在这里插入图片描述

开发板ping 开发主机

在这里插入图片描述

在开发主机开启NFS 服务

确认网络并了解局域网IP 地址信息后,可配置开发主机的NFS 服务,以下步骤说明均在开发主机上进行操作。

安装NFS 服务

Ubuntu 系统默认没有安装NFS 服务,需要使用如下命令安装NFS 服务端软件:

# 以下命令在主机上运行
sudo apt install nfs-kernel-server

查看用户id

在配置NFS 时需要使用到用户uid 和组gid,可使用id 命令查看,在开发主机上的终端输入如下命令:

# 以下命令在主机上运行
id

具体见下图。

在这里插入图片描述

上图使用id 命令用户id 和组id

从上图可知本开发主机的用户uid 和组gid 均为998,请使用该命令查看自己的开发主机相关id,在下面的配置文件中将会使用到。

配置NFS

安装NFS 服务后,会新增一个/etc/exports 文件(即/etc 目录下名字为exports 的文件),NFS 服务根据它的配置来运行,其默认内容可通过命令cat /etc/exports 查看,它默认包含了一些配置的范例,内容如所示。

列表1: 文件/etc/exports 的默认内容(/etc/exports 文件)

# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients.
See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)

详细的帮助说明可以使用命令man nfs 查看,此处直接以我们配置的范例进行讲解。

修改配置文件常常需要系统用户权限,所以通常使用sudo vim 或sudo gedit 来打开修改,要使用gedit 编辑器的话,把后面的vim 命令换成gedit 即可。

使用vim 打开/etc/exports 文件命令如下:

# 以下命令在主机上运行,可用gedit 替换vim
sudo vim /etc/exports

在/etc/exports 文件末尾添加如下语句并保存,注意如下语句写到/etc/exports 文件是在同一行。

# 把以下内容添加至/etc/exports 文件末尾,注意以下内容处于同一行
# 以下内容的IP 地址和uid,gid 需要根据自己的环境进行修改
/home/embedfire/workdir 192.168.0.0/24(rw,sync,all_squash,anonuid=998,anongid=998,no_subtree_check)

注意具体的配置需要根据自己的实验环境进行配置,请理解如下说明根据自己的实验环境进行修改:

  • /home/embedfire/workdir:要共享的开发主机目录,注意使用空格与后面的配置隔开。

  • 192.168.0.0/24: 配置谁可以访问, 其中的/24 是掩码, 此处表示24 个1, 即
    11111111.11111111.11111111.00000000,即掩码是255.255.255.0。结合前面192.168.0.0 表示此处配置IP 为192.168.0.* 的主机均可以访问该目录,即局域网上的所有主机。

  • 若局域网是其它网段,请参考此处的配置,不能直接用星号表示,如欲配置192.168.1.*的局域网下所有机器都可以访问,则配置为192.168.1.0/24。

  • 这个配置域也可以直接写可访问的主机名,如把“192.168.0.0/24”替换为开发板主机名“npi”,则仅该开发板能访问共享的目录。

  • rw: 表示客户机的权限,rw 表示可读写,具体的权限还受文件系统的rwx 及用户身份影响。

  • sync:资料同步写入到内存与硬盘中。

  • anonuid=998:将客户机上的用户映射成指定的本地用户ID 的用户,此处998 是开发主机embedfire用户的uid,此处请根据具体的主机用户uid 进行配置。

  • anongid=998:将客户机上的用户映射成属于指定的本地用户组ID,此处998 是开发主机embedfire用户组gid,此处请根据具体的主机用户组gid 进行配置。

  • no_subtree_check:不检查子目录权限,默认配置。

本配置中的anonuid 和anongid 把客户机的用户映射成本地uid/gid 为998 的用户,即开发主机的embedfire,那么当在开发板上使用与开发主机不同的用户访问NFS 共享目录时,都会具有embedfire 的权限,方便互相访问。如开发板上的root 用户创建文件,在开发主机上会被认为是embe dfire 创建的;在开发主机上仅embedfire 能读写的文件,在开发板上的root 或其它用户也能对该文件进行读写(被当成了embedfire)。当然这并不是一种安全的访问设置方式,不过这用在我们的开发中是非常方便的配置。

创建共享目录

为了确保共享的配置有效, 我们还需要创建共享的目录, 在本例子中共享的目录
为/home/embedfire/workdir。

本例子中创建的目录命令如下,请根据自己的实验环境设置要共享的目录:

# 以下命令在主机上运行
mkdir /home/embedfire/workdir

更新exports 配置

修改完/etc/exports 文件并保存后,可使用exportfs 命令更新配置:

# 以下命令在主机上运行
sudo exportfs -arv

该命令的参数说明如下:

  • -a:全部mount 或umount 文件/etc/exports 中的内容。

  • -r:重新mount 文件/etc/exports 中的共享内容。

  • -u:umount 目录。

  • -v:在exportfs 的时候,将详细的信息输出到屏幕上。

若配置正常,该命令执行后会列出共享的目录项,本示例的执行结果见下图。

在这里插入图片描述

查看NFS 共享情况

使用showmount –e 可查看当前NFS 服务器的加载情况,具体见下图。

# 以下命令在主机上运行
showmount -e

在这里插入图片描述

安装NFS 客户端

开发主机开启NFS 服务后,我们还需要在开发板安装NFS 客户端,来让开发板使用NFS 服务。

执行安装NFS 客户端命令:

sudo apt install nfs-common -y

查看NFS 服务器共享目录

在开发板上执行“showmount -e +“NFS 服务器IP””命令。注意在不同网络环境下,NFS 服务器IP 可能不一样,以实际情况为准。

showmount -e 192.168.0.219

在这里插入图片描述

临时挂载NFS 文件系统

使用mount 命令挂载NFS 服务器的共享目录到开发板/mnt 目录下:

注意: 需要把下面的192.168.0.219 设置为用户实际网络环境下的NFS 服务器IP

# 以下命令在开发板上运行
sudo mount -t nfs 192.168.0.219:/home/embedfire/workdir /mnt

以上命令使用的各个参数如下:

  • -t nfs:指定挂载的文件系统格式为nfs。

  • 192.168.0.219:指定NFS 服务器的IP 地址。

  • /home/embedfire/workdir:指定NFS 服务器的共享目录。

  • /mnt:本地挂载目录,即要把NFS 服务器的共享目录映射到开发板的/mnt 目录下。

若挂载成功,终端不会有输出,Linux 的哲学思想是“没有消息便是好消息”。

如下图:

在这里插入图片描述

使用这种方式挂载目录只是临时的,开发板在重启后需要重新挂载该NFS 目录才能访问。

测试NFS 共享目录

挂载成功后,在NFS 服务器的共享目录下,输入“sudo touch hello_world.txt”命令,则在共享目录下创建一个hello_world.txt 文件,如下图:

在这里插入图片描述

进入开发板的/mnt 目录下,可以查看到NFS 服务器的共享目录中的hello_world.txt 文件。如下图:

在这里插入图片描述

取消挂载

当客户机在网络上无法找到NFS 共享的目录时,如开发主机关机时,在NFS 的客户机的终端常常会输出一些提示,或在使用ls 命令查看共享目录会导致长时间等待,这时可以对目录使用umount 命令取消挂载,示例如下:

# 以下命令在开发板上运行
sudo umount /mnt

使用该命令时以要取消挂载的目录作为参数即可,没有输出表示执行正常。如果在当前挂载的目录进行umount 操作,会提示“device is busy”。建议取消挂载时,先切换到家目录“~”,在进行umount 操作。


参考资料:Linux 基础与应用开发实战指南——基于STM32MP1 系列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十节 挂载NFS 网络文件系统 的相关文章

  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 如何重命名 .tar.gz 文件而不提取内容并在 UBUNTU 中创建新的 .tar.gz 文件?

    我有一个命令将创建一个新的 tar gz现有文件中的文件 sudo tar zcvf Existing tar gz New tar gz 该命令将创建一个新的New tar gz从现有的文件Existing tar gz file 谁能告
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • Rstudio 更有意义的窗口标题

    我在 Ubuntu 16 04 下使用 R studio 版本 1 0 143 窗口标题仅显示一个非常无信息的 RStudio 我希望至少有当前选项卡的名称 或者最好是与此选项卡对应的文件的完整路径 在 Windows 下 完整路径似乎出现
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • dpkg 错误:pycompile:未找到

    sudo apt get remove purge mysql server mysql client mysql common 当我尝试使用上述命令删除 mysql 时 出现以下错误 Reading package lists Done
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • Ubuntu 16.04/Django - Gunicorn - Worker 无法启动

    我正在 Digital Ocean Ubuntu 16 04 VPS 上部署 Django 项目 我使用的是Django的一键安装 然后替换为我的项目 问题是服务器返回502 Error EDIT 没有realestate scanner
  • Nginx 作为负载均衡器,具有 75% 和 25% 加权路由

    我是 Nginx 新手 我有两台服务器 serverA 和 serverB 我希望 75 的请求发送到 serverA 其余 25 的请求发送到 serverB 这可能吗 使用nginx加权路由 stream upstream stream
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • Eclipse Kepler 在 64 位 ubuntu 上冻结

    几天前我刚刚将 Ubuntu 升级到 14 04 并在此过程中从 32 位切换到 64 位 从那时起 Eclipse 就变得非常不稳定 运行几分钟后 它将开始随机冻结越来越长的时间 特别是在代码完成时 已经必须禁用它 而且在剪切 粘贴时 偶
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期

随机推荐

  • Docker - 国内镜像的配置及使用

    开发十年 就只剩下这套Java开发体系了 gt gt gt Docker国内镜像 DaoCloud Docker加速器阿里云 开发者平台 微镜像 希云cSphere镜像广场 时速云灵雀云网易蜂巢 阿里云的Docker加速器 阿里云 开发者平
  • 对老赵写的简单性能计数器的修改

    对老赵写的简单性能计数器的修改 早上看到老赵写的这个性能计数器 感觉很实用 不过老赵用了很多 C 3 0 的新语法 还用了 VISTA 和 Server 2008 下特有的Win32 API 对于还在用C 2 0 或者还工作在 XP 或者
  • nginx启动只有master没有worker_探究Nginx的工作原理,才知道为什么这么高效!

    1 Nginx的模块 Nginx的模块从结构上分为核心模块 基础模块和第三方模块 核心模块 HTTP模块 EVENT模块和MAIL模块 基础模块 HTTP Access模块 HTTP FastCGI模块 HTTP Proxy模块和HTTP
  • 平面设计除了PS还有哪些工具推荐

    平面设计在我们的日常生活中无处不在 无论是传统媒体还是网络媒体 我们每天都会沉浸在大量的平面设计作品中 因此 我们或多或少会对设计有自己的看法 其实 即使是非专业人士 市场上也有很多平面设计软件 本文盘点了平面设计的五大软件 1 即时设计
  • Android 6.0 解决recyclerview 在 scrollview 中不能全部显示,高度不正常的问题。

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 这个问题困扰了我半天 国内百度上的资料非常的烂 根本无法解决问题 在android 4 5 版本中 scrollview 包含了一个recyclerview 滚动一切正常
  • 教你使用windeployqt工具来进行Qt的打包发布

    Qt 官方开发环境使用的动态链接库方式 在发布生成的exe程序时 需要复制一大堆 dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此 Qt 官方开发环境里自带了一个工具 windeployqt exe 问
  • ARM64基础14:ARM64的中断处理之GIC400实现(以树莓派4采用的BCM2711芯片为例)

    接上篇 ARM64基础13 ARM64的异常处理之中断处理 以树莓派4采用的BCM2711芯片为例 1 GIC的诞生背景 传统中断控制器 比如树莓派4b的legacy interrupt controller 具备 中断enable寄存器
  • osgEarth+VS2015开发环境搭建

    前言 osgEarth是基于OpenSceneGraph OSG 实现的3DGIS引擎 而OSG是一个开源的三维实时场景图形开发框架 学习osgEarth之前最好先学习下OSG 这是OSG官网有很多学习资料可以参考 osgEarth同时支持
  • STM32CubeMX官网下载方法

    目录 CubeMX下载 芯片包下载 和CubeIDE区别 CubeMX下载 主要是对下载链接做个记录 不再从打开百度 搜索ST这样一步步记录 点击STM32CubeMX STM32Cube initialization code gener
  • 共识算法 PBFT浅析

    PBFT是PracticalByzantine Fault Tolerance的缩写 意为实用拜占庭容错算法 该算法是Miguel Castro 卡斯特罗 和Barbara Liskov 利斯科夫 在1999年提出来的 解决了原始拜占庭容错
  • 百度深度强化学习框架PARL技术学习笔记

    目录 前言 寄语 基础准备和预习 第一节课 玩个简单的迷宫游戏吧 第二节课 基于表格型方法求解RL 1 SARSA算法 2 Q Learning算法 第三节课 基于神经网络求解RL 第三节课 基于策略梯度求解RL 第四节课 连续动作空间上求
  • 前端开发工程师面试最常见问题(20题&附答案)

    目录 1 在制作一个Web应用或Web站点的过程中 你是如何考虑它的UI 安全性 高性能 SEO 可维护性以及技术因素的 2 谈谈你喜欢的开发环境 例如操作系统 编辑器 浏览器 工具等等 3 你最熟悉哪一套版本控制系统 4 描述一下当你制作
  • 全链接神经网络python简单实现

    什么是全链接神经网络 full connected FC 借用此图来直观的表示一下 规则如下 神经元按照层来布局 最左边的层叫做输入层 负责接收输入数据 最右边的层叫输出层 我们可以从这层获取神经网络输出数据 输入层和输出层之间的层叫做隐藏
  • linux新版本io框架 io_uring

    从别的博主那copy过来 1 io uring是Linux内核的一个新型I O事件通知机制 具有以下特点 高性能 相比传统的select poll epoll等I O多路复用机制 io uring采用了更高效的ring buffer实现方式
  • Qt关于tabWidget中tab样式的重绘

    Qt关于tabWidget中tab样式的重绘 版本说明 版本 作者 日期 备注 0 1 loon 2018 12 29 初稿 目录 文章目录 Qt关于tabWidget中tab样式的重绘 版本说明 目录 一 需求分析 二 最终效果展示 三
  • windows操作系统上启用SSLv3协议引发的威胁

    一 主机启用SSLv3协议引发的威胁 远程主机受到称为POODLE的中间人 MitM 信息泄露漏洞的影响 该漏洞是由于SSL 3 0在解密使用密码块链接 CBC 模式下的块密码加密的消息时处理填充字节的方式 二 建议处置措施 处置措施 禁用
  • Qt应用开发(基础篇)——字体选择器 QFontDialog

    一 前言 QFontDialog类继承于QDialog 是一个设计用来选择字体的对话框部件 对话框窗口QDialog QFontDialog字体选择对话框 设计用来让用户选择某一种字体 一般用于文本编辑窗口 标签显示和一些需要文本输入的场景
  • 第七篇 图像分类的评价指标

    文章目录 摘要 1 混淆矩阵 2 准确率 Accuracy 3 精确率 Precision 4 召回率 Recall 5 F1 score 6 代码样例 摘要 一般情况来说 单一评分标准无法完全评估一个机器学习模型 只用good和bad偏离
  • IDEA调试时的步入(step into)进不去源码怎么办

    文件 gt 设置 gt 构建 执行 部署 gt 调试器 gt 步进 gt 把java 和javax 取消勾选即可
  • 第十节 挂载NFS 网络文件系统

    本章节将介绍如何挂载NFS 网络文件系统 为后面的主机编译生成的ARM Linux 应用传输到开发板做准备 网络文件系统简介 网络文件系统 常被称为NFS Network File System 它是一种非常便捷的在服务器与客户端通过网络共