嵌入式设备搭建NFS环境(服务器/客户端、源码下载编译、文件系统适配、内核适配)

news2024/9/29 9:25:03

1、什么是nfs

(1)NFS(Network File System)是网络文件系统,能让使用者访问网络上别处的文件就像在使用自己的计算机一样;
(2)NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作;
(3)NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享;
(4)NFS是服务器/客户端架构,服务器可允许多个客户端访问,服务器向客户端提供对本地文件系统的访问权限,实现网络中文件共享;

2、NFS服务器的工作原理

2.1、NFS和RPC的关系

(1)RPC(Remote Procedure Call Protocol)远程过程调用协议,一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;
(2)RPC最主要的功能就是指定每个NFS功能所对应的端口,并返回给客户端,使客户端可以连接到正确的端口上;
(3)NFS是依赖RPC才能工作:NFS是一种文件系统,RPC负责在设备间的通过网络传输信息;
(4)NFS服务端常用的端口为2049,但是NFS功能有很多,每个功能就是一个程序,按照TCP/IP协议,计算机中每个程序在传输层都需要有一个端口号,这些端口都是随机产生并且小于1024;(NFS是基于网络的应用,属于套接字程序,所以需要端口号)
(5)NFS的每个程序都先要向RPC注册端口号,所以必须在启动NFS前先启动RPC服务器;
(6)RPC服务器的端口号是111,NFS客户端挂载NFS服务器时,先通过RPC的客户端连接RPC的服务器端,获取到NFS对应程序的端口号,然后再建立连接;

2.2、NFS服务器工作流程

(1)先启动RPC服务,RPC对外的端口是111;
(2)启动NFS服务器,NFS服务器会向RPC注册相应的端口;

2.3、NFS客户端工作流程

(1)当NFS客户端需要连接到服务器上时,先启动客户端的RPC服务,客户端的RPC向服务端的RPC 111端口索要功能对应的端口号;
(2)向服务器端索要到端口号后,便连接到NFS服务对应功能的端口,随后传输数据;
补充:即使客户端已经获取了端口号,客户端仍会借助rpc做为中间人进行通信;

3、rpcbind和portmap的关系

(1)rpcbind和portmap都是在NFS中提供RPC协议层的工具,功能是类似的;
(2)目前的趋势是用rpcbind来替代portmap;

4、NFS的常用命令

(1)rpcbind:启动RPC服务;
(2)rpc.nfsd:管理客户端是否能够使用服务器文件系统挂载信息等, 其中还包含这个登入者的 ID 的判别;
(3)rpc.mountd:读NFS的配置文件/etc/exports来比对客户端的权限,管理NFS分享之目录的权限与安全设定;
(4)rpc.lockd:解决多个客户端同时操作同一份文件的问题;(同时在客户端与服务器端都开启才行)
(5)rpc.statd:监听来自其他主机的重启通知,与sm-notify配套使用,主要应用与NFS V3协议,NFS V4协议中该功能由内核来完成;
(6)exportfs:导出NFS共享目录,客户端可以通过NFS服务访问服务器的这些共享目录;
(7)showmount:显示服务器端mount相关的配置信息;(showmount -e :查看当前的共享目录)
(8)sm-notify:如果服务器和客户端的重启,向其他NFS终端发送该终端重启的通知,主要应用于NFS V3协议,NFS V4协议中该功能由内核来完成;
(9)umount:卸载网络共享目录;
(10)mount:挂载共享目录;

5、nfs服务器端搭建

5.1、开源工具的移植

5.1.1、libtirpc移植

5.1.1.1、源码下载

(1)源码下载网址:https://sourceforge.net/projects/libtirpc/;

5.1.1.2、源码编译

./configure  --disable-gssapi --prefix=/home/root/NFS/libtirpc/bin --host=aarch64-mix410-linux
make
make install

(1)–disable-gssapi:禁止gssapi功能,改功能不影响主体功能,编译环境不支持可以禁止;
(2)–prefix:指定安装目录,将来执行"make install"命令,会将生成的动态库、静态库、头文件安装到该目录;
(3)–host:指定编译工具;

5.1.2、rpcbind移植

5.1.2.1、源码下载

(1)源码下载网址:https://www.linuxfromscratch.org/blfs/view/8.3/basicnet/rpcbind.html

5.1.2.2、源码编译

./configure TIRPC_CFLAGS="-I/home/root/NFS/libtirpc/bin/include/tirpc" TIRPC_LIBS="-L/home/root/NFS/libtirpc/bin/lib -ltirpc" --without-systemdsystemunitdir --host=aarch64-mix410-linux --prefix=/home/310793/phoneGate/nfs/rpcbind/bin
make
make install

(1)TIRPC_CFLAGS:指定libtirpc库的头文件路径;
(2)TIRPC_LIBS:指定libtirpc.a的路径;
(3)–prefix:指定安装目录,将来执行"make install"命令,会将生成的动态库、静态库、头文件安装到该目录;
(4)–host:指定编译工具;
总结:得到rpcbind和rpcinfo命令;

5.1.3、nfs-utils移植

5.1.3.1、源码下载

(1)源码下载地址:https://www.linuxfromscratch.org/blfs/view/8.3/basicnet/nfs-utils.html;

5.1.3.2、源码编译

./configure  TIRPC_CFLAGS="-I/home/root/NFS/libtirpc/bin/include/tirpc" TIRPC_LIBS="-L/home/root/NFS/libtirpc/bin/lib -ltirpc" --disable-nfsv4 --disable-nfsv41 --disable-gss --disable-uuid  --disable-ipv6 --with-tirpcinclude=/home/root/NFS/libtirpc/bin/include/tirpc --host=aarch64-mix410-linux --prefix=/home/root/NFS/utils/bin --disable-mount
make
make install

(1)TIRPC_CFLAGS:指定libtirpc库的头文件路径;
(2)TIRPC_LIBS:指定libtirpc.a的路径;
(3)–prefix:指定安装目录,将来执行"make install"命令,会将生成的动态库、静态库、头文件安装到该目录;
(4)–host:指定编译工具;
总结:得到rpc.mountd、rpc.nfsd、rpc.statd、sm-notify、showmount等命令;

5.2、内核修改

File systems  --->
	[*] Network File Systems  ---> 
		<*> NFS server support                                                                                           
			-*- NFS server support for NFS version 3                                                                        
			[*] NFS server support for the NFSv3 ACL protocol extension                                                       
			[*]     NFS server support for NFS version 4                                                                     
			[*]   NFSv4.1 server support for pNFS block layouts                                                              
			[*]   NFSv4.1 server support for pNFS SCSI layouts                                                                
			[*]   NFSv4.1 server support for pNFS Flex File layouts  

修改内核的配置文件,支持NFS server功能;

5.3、文件系统修改

5.3.1、启动脚本中开启nfs服务

mkdir /var/lib/nfs
chmod 777 -R /var/lib
mkdir /var/run
touch /var/run/rpcbind.lock
rpcbind
exportfs -av
rpc.mountd
rpc.statd --no-notify
rpc.nfsd
sm-notify

在内核启动脚本中添加上面的脚本开启nfs服务器,可以加在/etc/rcS文件中;

5.3.2、设置nfs共享目录

/data/appdata/ *(rw,no_root_squash,sync)
/mnt/ 192.168.1.1(rw,no_root_squash,sync)

(1)增加/etc/exports文件,设置nfs共享目录的路径;
(2)上面的设置中nfs共享目录有两个,都是可读写、同步、允许非root用户去挂载;
(3)/data/mnt/目录做了额外限制,只允许ip地址是192.168.1.1的设备去挂载,增加安全性;

5.3.3、在网络初始化中增加nfs

nfs 2049/tcp nfsd
nfs 2049/udp nfsd

(1)在/etc/services中保存了主机中所有网络服务的端口号,需要确认文件中是否已经添加上面两句;
(2)不添加上面的代码,执行rpc.nfsd会报错:Starting NFS daemon: rpc.nfsd: unable to resolve ANYADDR:nfs: Servname not supported for ai_socktype;

5.3.4、增加/etc/netconfig文件

#
# The network configuration file. This file is currently only used in
# conjunction with the TI-RPC code in the libtirpc library.
#
# Entries consist of:
#
#       <network_id> <semantics> <flags> <protofamily> <protoname> \
#               <device> <nametoaddr_libs>
#
# The <device> and <nametoaddr_libs> fields are always empty in this
# implementation.
#
udp        tpi_clts      v     inet     udp     -       -
tcp        tpi_cots_ord  v     inet     tcp     -       -
udp6       tpi_clts      v     inet6    udp     -       -
tcp6       tpi_cots_ord  v     inet6    tcp     -       -
rawip      tpi_raw       -     inet      -      -       -
local      tpi_cots_ord  -     loopback  -      -       -
unix       tpi_cots_ord  -     loopback  -      -       -

(1)不添加/etc/netconfig文件,rpcbind命令会异常退出;
(2)netconfig文件可以去已经搭建完成nfs服务器的虚拟机里拷贝出来;

6、nfs客户端搭建

6.1、内核修改

File systems  --->
	[*] Network File Systems  ---> 
		<*>   NFS client support                                                                                       
			<*>     NFS client support for NFS version 2                                                                     
			<*>     NFS client support for NFS version 3                                                                     
			[*] NFS client support for the NFSv3 ACL protocol extension                                                       
			< >     NFS client support for NFS version 4                                                                     
			[*]   NFS: Disable NFS UDP protocol support 

内核开启nfs客户端的支持;

6.2、挂载命令

mount -t nfs 192.168.2.100:/data/appdata/ /tmp/share -o nolock,tcp

7、调试的注意事项

(1)如果nfs共享的目录本身就是只读文件系统,就算以可读写方式挂载,最后也是只读;
(2)客户端挂载不上服务器端的共享目录,检查服务器端是否关闭防火墙、是否允许非root用户挂载;
(3)查看服务器端当前的共享目录:showmount -e;
(4)修改共享目录后要刷新:exportfs -rv;
(5)查看rpc的端口号:rpcinfo -p;

8、nfs版本不匹配引起的报错

8.1、报错信息

unable to get mount port number from server, using default
VFS: Unable to mount root fs via NFS, trying floppy.

8.2、查看支持的nfs版本

# 服务器端
~ # cat /proc/fs/nfsd/versions 
-2 +3 +4 +4.1 +4.2

#客户端:在内核的配置表里可以查看(make menuconfig)
File systems  --->
	[*] Network File Systems  ---> 
		<*>   NFS client support                                                                                       
			<*>     NFS client support for NFS version 2                                                                     
			<*>     NFS client support for NFS version 3                                                                     
			[*] NFS client support for the NFSv3 ACL protocol extension                                                       
			< >     NFS client support for NFS version 4                                                                     
			[*]   NFS: Disable NFS UDP protocol support 

从上面的信息可以看出,服务器端和客户端同时支持3和4版本的nfs;

8.3、解决办法:指定一个同时支持的nfs版本

mount -t nfs 192.168.2.100:/data/appdata/ /tmp/share -o nolock,tcp,nfsvers=3

(1)在用mount命令挂载时,一般是不用指定nfs版本的,会默认使用一个版本;
(2)当出现上面报错,并查看服务器/客户端有同时支持的nfs版本时,可用“nfsvers”关键字在mount时指定nfs版本;

推荐

给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAS详解.

CAS这个机制就给实现线程安全版本的代码&#xff0c;提供了一个新的思路&#xff0c;之前通过加锁&#xff0c;把多个指令打包成整体&#xff0c;来实现线程安全。现在就可以考虑直接基与CAS来实现一些修改操作&#xff0c;也能保证线程安全&#xff08;不需要加锁&#xff09;…

OpenAi-chatgpt注册保姆级全网最详细注册教程2023年2月最新-

废话就不多说了&#xff0c;说多了浪费各位师傅的时间&#xff01;直接冲&#xff0c;在开始之前需要科学上网&#xff0c;就没其他要求了 1、访问https://chat.openai.com/auth/login 2、点击sign up,输入账号密码&#xff0c;点击Continue 3、之后会来到登陆页面&#xff0…

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(03)—— 创建 dataguard 数据库之前的准备工作

Oracle Dataguard&#xff08;主库为 Oracle rac 集群&#xff09;配置教程&#xff08;03&#xff09;—— 创建 dataguard 数据库之前的准备工作 / 本专栏详细讲解 Oracle Dataguard&#xff08;Oracle 版本为11g&#xff0c;主库为双节点 Oracle rac 集群&#xff09;的配置…

云计算|OpenStack|错误记录和解决方案(不定时更新)

前言&#xff1a; openstack的部署和使用是难度比较大的&#xff0c;难免会出现各种各样的问题&#xff0c;因此&#xff0c;本文将把一些在部署和使用openstack社区版时出现的错误做一个记录&#xff0c;并就每一个错误分析和解决问题。&#xff08;尽量记录比较经典的错误&a…

微搭低代码从入门到精通10-tab栏组件

在小程序中&#xff0c;如果你的页面是由多个组成的&#xff0c;往往涉及到页面切换的问题。那如何引导用户访问不同的页面呢&#xff1f;微搭中提供了tab栏组件来实现这个功能&#xff0c;本篇我们介绍一下这个组件的使用方法。 首先呢打开我们的应用编辑器&#xff0c;在左侧…

OJ刷题Day2 · 判断根结点是否等于子结点之和 · 删除有序数组中的重复项 · 合并两个有序链表 · 数组中的第K个最大元素(中等题)

一、判断根结点是否等于子结点之和二、删除有序数组中的重复项三、合并两个有序链表四、数组中的第K个最大元素&#xff08;中等题&#xff09;一、判断根结点是否等于子结点之和 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左…

SpringBoot + kotlin/java + Mybatis-Plus +Sqlite + Gradle多模块项目

前言 我自己的业务项目&#xff0c;先用kotlinspringboot 搭建&#xff0c; 发现gradle支持kts脚本&#xff0c;于是我就搭建试试。我就选用了最流行的Sqlite内嵌数据库,虽然H2也不错&#xff0c;但是Sqlite才是最流行的。orm框架我还是选择了Mybatis-Plus &#xff0c;为此中…

Spring Boot的创建和使用

目录 一、Spring Boot介绍 1.1 Spring Boot 是什么 1.2 Spring Boot的优点 二、Spring Boot 项目的创建 2.1 使用idea创建 2.1.1 安装Spring Boot Helper插件 2.1.2 创建 Spring Boot 项目 2.1.3 验证项目是否创建成功 2.2 使用网页创建 三、输出 hello world 一、S…

前端如何提升To B产品用户体验

云计算产品发展的早期常以技术为核心吸引客户&#xff0c;功能的实现是这一时期产品优先考虑的因素。经过数十年的发展&#xff0c;云计算行业已经进入了深耕细作的时代&#xff0c;市场的激烈竞争与云产品快速发展的同时&#xff0c;用户对产品的可用性与易用性也有了更高的要…

交换机中的冗余链路管理

一 交换机冗余链路许多交换机或交换机设备组成的网络环境中&#xff0c;通常使用一些备份连接&#xff0c;以提高网络的健全性&#xff0c;稳定性。备份连接也叫备份链路&#xff0c;冗余链路等。为了解决共享式局域网的碰撞问题&#xff0c;采用了交换机构成的交换式局域网&am…

C语言静态库、动态库的封装和注意事项

1、动态库、静态库介绍 参考博客&#xff1a;《静态库和动态库介绍以及Makefile》&#xff1b; 2、代码目录结构和编译脚本 参考博客&#xff1a;《实际工作开发中C语言工程的目录结构分析》&#xff1b; 3、编写库的流程 (1)明确需求:需求是否合理、需求的使用场景、需求可能遇…

chatgpt:人工智能的一次突破,如何正确的创建用户及使用

Chatgpt的正确创建及使用 chatgpt最近在国内也开始有声音了&#xff0c;其实早在去年12月初&#xff0c;该网站就已经可以在国外进行使用&#xff0c;而且很快渗透到了国外各行各业各个年龄段 &#xff0c;最火的当属国外很多学生用它来生成论文&#xff0c;关键是语句通顺&am…

如何开启多个独立Chrome浏览器

一、简介 作为测试或者开发人员&#xff0c;有些情况下会用到 Chrome 浏览器&#xff0c;但有时是同一个 Chrome 浏览器无法为我们提供隔离开的不同环境。这样 我们就需要清理 cache 、切换账号等&#xff0c;降低了我们的工作效率。今天的主题是如何开启多个独立的 Chrome 浏…

LayUI模板引擎渲染数据

前端模板引擎介绍 接上节Spring boot项目开发实战——&#xff08;LayUI实现前后端数据交换与定义方法渲染数据&#xff09; 模板引擎能简化开发&#xff0c;极大提高效率&#xff0c;小编之前使用过JSP和Thymeleaf&#xff0c;以及python的jinja2&#xff0c;这些是后端的模…

spring(二)-----------如何注入bean

我们从第三方框架mybatis为引&#xff0c;看看如何往spring中注入一个bean 1、纯mybatis开发生成一个mapper对象 如果不使用spring的情况下&#xff0c;mybatis想生成一个mapper对象大概需要做下面的操作&#xff1a; 假设我们有了一个TMapper接口&#xff0c;此时获取该map…

12款开源数据资产(元数据)管理平台选型分析(三)

如上&#xff0c;是ChatGPT的百度指数和微信指数&#xff0c;继2022年12月上旬技术圈火热之后&#xff0c;因为微软、谷歌等巨头的推广加持&#xff0c;ChatGPT成为全球大众热源的话题。各大媒体都在消费这波舆论红利&#xff0c;打开微信公众号&#xff0c;劈天盖地各种姿势的…

前后端学习

最近和锴哥想搞一下前后端接口的事儿&#xff0c;但是不会&#xff0c;所以打算再学学前后端的基础知识&#xff0c;之后好抄作业&#xff0c;做缝纫机&#xff1b;达哥觉得我浮躁&#xff0c;这次一定要支棱起来&#xff1b;这次开始&#xff0c;面向openai学习。 前后端学习1…

ChatGPT (可能)是怎么炼成的

学习自李宏毅老师的课https://www.youtube.com/watch?ve0aKI2GGZNg 1.学习文字接龙 学习方式 GPT只需要在网上阅读大量的句子&#xff0c;不需要人工标注即可学习到大量句子接龙的知识 然而实际上&#xff0c;“你好”后面可以接的字有很多。实际上&#xff0c;GPT学的就是…

3、Go基础数据类型

目录一、Go数据类型二、字符串三、强制类型转换一、Go数据类型 基础数据类型 类型长度(字节)默认值说明bool1falsebyte10uint8&#xff0c;取值范围[0,255]rune40Unicode Code Point, int32int, uint4或8032 或 64 位&#xff0c;取决于操作系统int8, uint810-128 ~ 127, 0 ~…

Freemarker介绍

2. Freemarker介绍 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它基于模板来生成文本输出。FreeMarker与 Web 容器无关&#xff0c;即在 Web 运行时&#xff0c;它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术&#xff0c;而且还可以用于生成 XML…