exfat文件系统无法NFS导出的问题

        最近项目中移植了exfat-linux驱动,但发现exfat格式的U盘无法用exportfs命令在NFS上导出。这篇文章记录了分析、解决方法。

一、问题现象

问题描述:exfat驱动更新后,exfat格式的U盘用exportfs命令NFS导出会报错

$ exportfs -o ro,fsid=0,no_root_squash 192.168.100.74:/storage/9CE5-DFCB/Carlog

报错:"does not support NFS export"


问题原因:

        文件系统要被export必须满足两个条件:第一要有唯一标识,可以是fsid,uuid或者是设备号,第二是文件系统必须设置了export操作集 export_operations。第一个条件可以通过exportfs或在/etc/exports文件中指定fsid的值来满足,第二个条件需要文件系统源代码定义了export_operations

        在exfat-linux驱动源码 fs/exfat/super.c 未定义 export_operations,因此所以exfat文件系统导出NFS会报错。

二、分析过程及思考

1、exportfs命令介绍

        exportfs是Linux中的一个命令,用于将指定的目录或文件系统在NFS上导出,从而实现文件系统的共享和访问控制,通过NFS协议允许其他计算机通过网络访问共享文件。

具体来说,exportfs的作用包括:

  • 共享文件系统:通过exportfs命令,可以将文件系统或目录共享给其他计算机。这样,其他计算机就可以通过NFS协议挂载该共享文件系统,实现文件的共享和访问。
  • 访问权限控制:exportfs命令可以设置文件系统的访问权限,包括读写权限和只读权限。通过配置exportfs,可以控制哪些计算机可以访问共享文件系统以及访问权限的级别。
  • 配置NFS服务:exportfs命令是NFS服务的一部分,通过该命令可以将指定的目录或文件系统添加到NFS服务的导出列表中,从而启用NFS服务并提供共享。

2、分析过程

        首先看下 linux/include/linux/exportfs.h 文档,其中提到 export_operations,详细使用 export_operations 方法需阅读 Documentation/filesystems/nfs/exporting.rst 文档。

      linux/Documentation/filesystems/nfs/exporting.rst 文档,其中有一段:

A file system implementation declares that instances of the filesystem
are exportable by setting the s_export_op field in the struct
super_block.  This field must point to a "struct export_operations"
struct which has the following members:

 encode_fh  (optional)
    Takes a dentry and creates a filehandle fragment which can later be used
    to find or create a dentry for the same object.  The default
    implementation creates a filehandle fragment that encodes a 32bit inode
    and generation number for the inode encoded, and if necessary the
    same information for the parent.

  fh_to_dentry (mandatory)
    Given a filehandle fragment, this should find the implied object and
    create a dentry for it (possibly with d_obtain_alias).

  fh_to_parent (optional but strongly recommended)
    Given a filehandle fragment, this should find the parent of the
    implied object and create a dentry for it (possibly with
    d_obtain_alias).  May fail if the filehandle fragment is too small.

        文件系统导出功能可通过设置 super_block 中的 s_export_op 字段实现。s_export_op 字段必须指向 "struct export_operations"。

        可以看到,exfat-linux驱动源码 fs/exfat/super.c 并未定义 export_operations,因此NFS导出会失败。

3、解决方法

        将老exfat驱动中 s_export_op 相关代码移植到 exfat-linux驱动源码 fs/exfat/super.c 中,方法如下:

 添加 linux/exportfs.h 头文件

#include <linux/exportfs.h>

定义 struct export_operations 结构体

/*======================================================================*/
/*  Export Operations                                                   */
/*======================================================================*/

static struct inode *exfat_nfs_get_inode(struct super_block *sb,
                       u64 ino, u32 generation)
{
    struct inode *inode = NULL;
    if (ino < EXFAT_ROOT_INO)
        return inode;
    inode = ilookup(sb, ino);

    if (inode && generation && (inode->i_generation != generation)) {
        iput(inode);
        inode = NULL;
    }

    return inode;
}

static struct dentry *exfat_fh_to_dentry(struct super_block *sb, struct fid *fid,
                int fh_len, int fh_type)
{
    return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
                    exfat_nfs_get_inode);
}

static struct dentry *exfat_fh_to_parent(struct super_block *sb, struct fid *fid,
                int fh_len, int fh_type)
{
    return generic_fh_to_parent(sb, fid, fh_len, fh_type,
                    exfat_nfs_get_inode);
}

const struct export_operations exfat_export_ops = {
    .fh_to_dentry   = exfat_fh_to_dentry,
    .fh_to_parent   = exfat_fh_to_parent,
};

         s_export_op 指向 struct export_operations 结构体。exfat_fill_super() 函数中添加 sb->s_export_op = &exfat_export_ops;

static int exfat_fill_super(struct super_block *sb, void *data, int silent)
{
	struct exfat_sb_info *sbi;
	struct exfat_mount_options *opts;
	struct inode *root_inode;
	int err;

	err = exfat_init_sb_info(sb);
	if (err) {
		exfat_err(sb, "failed to initialize superblock info");
		goto failed;
	}

	sbi = sb->s_fs_info;
	opts = &sbi->options;

	sb->s_flags |= SB_NODIRATIME;
	sb->s_magic = EXFAT_SUPER_MAGIC;
	sb->s_op = &exfat_sops;
	sb->s_export_op = &exfat_export_ops;
    。。。 。。。
}

代码下载链接:https://download.csdn.net/download/hinewcc/89440534

说明:相关修改请看super.c文件!!!

修改后,重新编译kernel 运行 NFS 导出功能正常!

4、参考文档

Kernel File Handle 详解 - liuchao719 - 博客园 (cnblogs.com)

【linux3.10】【nfs】使文件系统可导出_linuxnfs导出文件-CSDN博客

jffs2文件系统不支持export的问题_sonfs-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快消品经销商如何进行有效的团队激励?

很多经销商会面临员工工作不积极、吃大锅饭的现象&#xff0c;导致企业人力成本浪费严重&#xff0c;工作效率也得不到提升&#xff0c;因此经销商老板们必须进行一些绩效考核&#xff0c;然后开展一些有效的激励政策&#xff0c;这样通过提成激励来提高员工的积极性。 1、梳理…

SQL深度解析:掌握这些技巧,让你的数据库查询如虎添翼!

前言 随着大数据时代的来临&#xff0c;数据库的角色愈发重要。SQL作为使用最为广泛的数据查询语言&#xff0c;其深度解析与优化对于数据密集型应用来说至关重要。掌握高级SQL技巧不仅可以提升开发效率&#xff0c;还能显著提高数据查询的性能和灵活性。本文将探讨一些关键的S…

QT信号与槽/窗口组件优化/使用QT制作QQ登录界面

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…

表面声波滤波器——SAW 基本介绍(1)

声表面波特点与应用 声表面波&#xff0c;也称为表面声波&#xff08;surface acoustic wave&#xff09;&#xff0c;是指在弹性体的自由表面上产生并沿着表面或界面传播的各种模式的波&#xff0c;包括瑞利波(Rayleighwave)&#xff0c;勒夫波(Lovewave)等。 具有以下特点:…

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布&#xff0c;读取&…

MySQL JDBC驱动包引入有版本要求吗

提示&#xff1a;有关数据库的任何操作&#xff0c;请事先都做好备份&#xff0c;一定不会错的&#xff1b; 文章目录 前言一、com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver如何选择&#xff1f;1、概念2、引入驱动3、总结 前言 新老项目的交替中&#xff0c;如果你使用的…

天阳科技集团北京卡洛其项目管理专家李先林受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 天阳科技集团北京卡洛其项目管理专家李先林先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“应用软件项目管理标准化实践探讨”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

基于ChatGPT的大型语言模型试用心得

近年来&#xff0c;ChatGPT这样的大型语言模型&#xff0c;它如同一颗冉冉升起的新星&#xff0c;迅速在商业、教育、娱乐等多个领域照亮了创新的天空&#xff0c;极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…

Zabbix Centos8 安装笔记

Zabbix 安装笔记 安装环境 Centos 8 正常发行版 安装版本 Zabbix 7 (LTS) 安装步骤 1、关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/c…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接&#xff08;很讨厌的功能习惯&#xff09;。 而如上两种问题不是互相影响的&#xff0c;就算设置了Edge的粘贴方式&#xff0c;复制到CSDN的文章…

【Kubernetes】Helm--包管理工具

​​​​​​​ 微服务是什么&#xff1f; 微服务把大包解耦成小包&#xff0c;使用的时候使用java -jar包启动服务 Helm 什么是Helm&#xff1f; 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁…

机器,学习没有捷径

1 捷径学习 1.1 你捷径学习了么 深度学习因为其优异的学习能力&#xff0c;已经成为推动人工智能发展当之无愧的主力军。深度学习在NLP和CV等不同的场景下都展现了优异的能力。但深度学习也存在一个与生俱来的问题&#xff1a;捷径学习。 捷径学习中的捷径表示的是一种有缺陷…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读&#xff1a; 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff09;于 2024 年 4 月 25 日- 27 日在南京圆满召开&#xff0c;主题为“ AGI 时代下的空间数据智能”&#xff0c;旨在深入推动空间数据智能研究的理论进步与应…

mysql:简单理解mysql mvcc的可重复读

# 原理 假设有这样的sql begin select&#xff08;或update、insert、delete&#xff09; ... commit当执行【begin】的时候&#xff0c;标记有一个新事务要开始&#xff0c;但是事务还没有真正开始&#xff0c;事务id还没有产生当执行事务里面的第一个sql语句时&#xff08;…

【JS重点15】原型对象概述

目录 一&#xff1a;构造函数缺陷 二&#xff1a;原型 1 原型是是什么 2 原型对象的作用 3 原型对象this指向问题 4 利用原型对象添加方法 给JS内置构造函数Array添加最大值方法 给JS内置构造函数Array添加求和方法 三&#xff1a;Constructor属性 四&#xff1a;如何…

「茶桁 AI 秘籍-CV 篇」预告

Hi, 大家好。 我是茶桁。 咱们的《茶桁的 AI 秘籍》系列距离上一个系列课程《人工智能 BI 核心》已经有一段时间了&#xff0c;终于有时间可以写 CV 部分的课程&#xff0c;主要也是最近一段时间我确实有点忙不过来。 那么咱们 CV 的课程会有一些变化&#xff0c;就是会改为收…

AtCoder Beginner Contest 358 A~E(F,G更新中...)

A.Welcome to AtCoder Land 题意 给出两个字符串 S , T S, T S,T&#xff0c;请你判断是否满足&#xff1a; 字符串 S S S为AtCoder 字符串 T T T为Land 分析 输入后判断即可 代码 #include<bits/stdc.h> using namespace std; void solve() {string s, t;cin &g…

MacOS系统中Java使用Opencv4.10.0库的编译过程和使用方法(附编译后的包)

编译开始 到官方下载源码&#xff1b;官方 解压后进入 opencv-4.10.0 目录 执行命令预编译&#xff0c;查看是否有Java的支持 cmake -S . -B build -DCMAKE_INSTALL_PREFIX/usr/local/opencv开始正式编译 # 进入build目录 cd build # make编译 {N} 取决于你有几个CPU、几个线…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(流程优化)

系列篇章&#x1f4a5; No.文章1AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之知乎网站数据获…

【在线OJ】vue分页+SpringBoot分页模板代码

一、Vue <template><div><el-table:data"user"style"width: 120%"><el-table-columnlabel"id"width"180"><template slot-scope"scope"><i class"el-icon-time"></i>&…