fuse文件系统调试环境

news2024/9/23 11:26:58

libfuse源码:GitHub - libfuse/libfuse: The reference implementation of the Linux FUSE (Filesystem in Userspace) interface

一、ubuntu20.04挂载fuse文件系统

1,安装编译工具

apt install ninja-build
apt install meson
apt install build-essential
apt install python3-pip
pip install pytest (编译fuse自测模块用到,可选,一般不需要)

2,下载libfuse代码

创建下载目录fuse:
root@linux:/home/gsf# mkdir fuse; cd fuse/

从github下载libfuse代码:
root@linux:/home/gsf/fuse# git clone https://github.com/libfuse/libfuse.git
Cloning into 'libfuse'...
remote: Enumerating objects: 12797, done.
remote: Counting objects: 100% (53/53), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 12797 (delta 26), reused 32 (delta 21), pack-reused 12744
Receiving objects: 100% (12797/12797), 3.57 MiB | 807.00 KiB/s, done.
Resolving deltas: 100% (9867/9867), done.

3,编译libfuse

在源码目录创建build目录,并进入build:
root@linux:/home/gsf/fuse# cd libfuse/; mkdir build; cd build/;

编译:
root@linux:/home/gsf/fuse/libfuse/build# meson ..
root@linux:/home/gsf/fuse/libfuse/build# python3 -m pytest test/ (可选,fuse自测模块,一般不需要)
root@linux:/home/gsf/fuse/libfuse/build# ninja install

4,编译fuse文件系统

将自己写的一个fuse文件系统源码放在fuse源码/libfuse/build目录中,比如从fuse源码/libfuse/example目录中拷贝hello.c(自带的一个简单fuse文件系统)只build目录,单独编译(必须要先编译libfuse,因为会用到其中的库),然后挂载:
root@linux:/home/gsf/fuse/libfuse/build# cp ../example/hello.c .
root@linux:/home/gsf/fuse/libfuse/build# gcc -Wall hello.c `pkg-config fuse3 --cflags --libs` -o hello
root@linux:/home/gsf/fuse/libfuse/build# ./hello /mnt/fusemnt/
root@linux:/home/gsf/fuse/libfuse/build#

5,挂载fuse

编译libfuse时,已经编译了libfuse source code中exampl目录自带的fuse文件系统,这些编译好的文件在libfuse/build/example/目录,比如我们用编译出来的hello执行挂载命令(这个hello就是一个简单的fuse文件系统):

创建挂载点:
root@linux:/home/gsf/fuse/libfuse/build/example# mkdir -p /mnt/fusemnt

挂载fuse文件系统:
root@linux:/home/gsf/fuse/libfuse/build/example# ./hello /mnt/fusemnt

mount命令检查fuse是否挂载成功:
root@linux:/home/gsf/fuse/libfuse/build/example# mount |grep fuse
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/fuse on /run/user/1000/doc type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/home/gsf/fuse/libfuse/build/example/hello on /mnt/fusemnt type fuse.hello (rw,nosuid,nodev,relatime,user_id=0,group_id=0)

二、搭建qemu调试fuse环境

qemu如何运行自己编译的kernel,请参考《linux调试专栏》的其他文章。这里只列出差异化的部分。

1,kenel config需要打开FUSE

kernel source执行make menuconfig:

File systems  --->
       <*> FUSE (Filesystem in Userspace) support

kernel编译后,qemu启动该kernel,会有/sys/fs/fuse目录。

2,静态编译fuse文件系统

默认采用shared library编译,需要将改成static library方式编译,完整的编译命令如下:

root@linux:/home/gsf/code# git clone https://github.com/libfuse/libfuse.git
root@linux:/home/gsf/code# cd libfuse/; mkdir build; cd build/
root@linux:/home/gsf/code/libfuse/build# meson ..
root@linux:/home/gsf/code/libfuse/build# meson configure --default-library static 配置静态编译
root@linux:/home/gsf/code/libfuse/build# ninja install
root@linux:/home/gsf/code/libfuse/build# cp ../example/hello.c .
root@linux:/home/gsf/code/libfuse/build# gcc -Wall hello.c `pkg-config fuse3 --cflags --libs` -static -o hello

可通过在build目录下执行meson configure # list options命令,检查是静态编译还是动态编译,如下图,Current value是动态编译:

如果用动态库方式编译,在qemu kernel中执行hello时则会出错:

# wget http://10.223.11.5/hello
Connecting to 10.223.11.5 (10.223.11.5:80)
saving to 'hello'
hello                100% |********************************| 17736  0:00:00 ETA
'hello' saved
# chmod 777 hello 
# ./hello /mnt/fusemnt/
-sh: ./hello: not found
#

3,fuse文件系统拷贝到qemu kernel并挂载

可以通过多种方式在ubuntu宿主机与qemu kernel虚拟机中共享文件,这里用http方式从ubuntu中下载文件然后挂载,在qemu kernel中执行下面命令:

# wget http://10.223.11.5/hello
Connecting to 10.223.11.5 (10.223.11.5:80)
saving to 'hello'
hello                100% |********************************| 2892k  0:00:00 ETA
'hello' saved
# chmod 777 hello 
# ./hello /mnt/fusemnt/
# 
# mount |grep fuse
hello on /mnt/fusemnt type fuse.hello (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
# 

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

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

相关文章

4. C#语法基础

一、cs文件结构 上面程序的各个部分说明如下&#xff1a; 程序的第一行using System; 其中【using】关键字用于在程序中包含 System 命名空间。一个程序一般有多个 using 语句。程序的第七行是 namespace 声明。一个 namespace 是一系列的类&#xff0c;MyFirstWinFormApp 命名…

SQL语句大全(MySQL入门到精通——基础篇)(基础篇——进阶篇——运维篇)

文章目录前言MySQL——基础篇一、SQL分类二、图形化界面工具三、DDL&#xff08;Data Definition Language|数据定义语言&#xff09;1.SQL-DDL-数据库操作2.SQL-DDL-表操作&查询3.SQL-DDL-数据类型3.SQL-DDL-表操作-修改&删除四、DML&#xff08;Data Manipulation La…

经典模型LeNet跑Fashion-MNIST 代码解析

测试6.6. 卷积神经网络&#xff08;LeNet&#xff09; — 动手学深度学习 2.0.0 documentation import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(#输入通道1表示黑白 输出通道6表示6组取不同特征的卷积核 因为卷积核是5*5,原始图片单通道黑…

面向对象设计模式:行为型模式之模板方法模式

一、模板方法引入&#xff1a;泡茶与冲咖啡 泡茶 烧水泡茶倒入杯子加入柠檬 冲咖啡 烧水冲咖啡倒入杯子加入牛奶和糖 二、模板方法&#xff0c;TemplateMethod 2.1 Intent 意图 Define the skeleton of an algorithm in an operation, deferring some steps to lets subclas…

【深度学习】BERT变体—BERT-wwm

1.BERT-wwm 1-1 Whole Word Masking Whole Word Masking (wwm)是谷歌在2019年5月31日发布的一项BERT的升级版本&#xff0c;主要更改了原预训练阶段的训练样本生成策略。 原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词&#xff0c;在生成训练样本时&#xff…

路由传参含对象数据刷新页面数据丢失

目录 一、问题描述 二、 解决办法 一、问题描述 【1】众所周知&#xff0c;在veu项目开发过程中&#xff0c;我们常常会用到通过路由的方式在页面中传递数据。但是用到this.$route.query.ObjectData的页面&#xff0c;刷新后会导致this.$route.query.ObjectData数据丢失。 …

(小甲鱼python)函数笔记合集七 函数(IX)总结 python实现汉诺塔详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解函数的闭包&#xff08;工厂函…

【LeetCode每日一题】——1323.6 和 9 组成的最大数字

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 贪心算法 二【题目难度】 简单 三【题目编号】 1323.6 和 9 组成的最大数字 四【题目描述】 …

【mediasoup】RtpStreamRecv 对rtp 序号的验证

mediasoup 接收到rtp包D:\XTRANS\soup\mediasoup_offical\worker\src\RTC\RtpStreamRecv.cpp代码竟然跟 https://tools.ietf.org/html/rfc3550#appendix-A.1 stuff. 一样的。RtpStreamRecv的 ReceivePacket(RTC::RtpPacket* packet) 处理收到的rtp包 可能会丢弃 判断丢帧 回卷后…

项目团队沟通管理 5大沟通原则

1、沟通内外有别 沟通需要区分团队内和团队外&#xff0c;在团队对外进行沟通时&#xff0c;团队作为一个整体&#xff0c;对外意见需要一致&#xff0c;一个团队需用一种声音说话。 沟通管理5大原则&#xff1a;沟通内外有别​ 2、重视非正式沟通 非正式的沟通有助于关…

FUNIT

无监督图像到图像转换方法学习将给定类中的图像映射到不同类中的类似图像&#xff0c;使用非结构化(非注册)图像数据集。虽然非常成功&#xff0c;但目前的方法需要在训练时访问源类和目标类中的许多图像。我们认为这极大地限制了它们的使用。从人类从少量示例中提取新对象的本…

用报废耳机自制助听器

平常戴着跑步的外挂耳机被洗衣机洗了&#xff0c;不是进水马上捞起来的那种洗&#xff0c;就是全机包括充电盒都在洗衣机里走了一遍洗衣的流程&#xff0c;在晾晒衣服时才发现衣兜里的这付耳机&#xff0c;再进行啥挽救处理都已为时过晚&#xff0c;好在这付耳机并不贵&#xf…

HBuilderX无线连接真机

说明 安装的是HBuilderX&#xff0c;不是HBuilder&#xff0c;adb.exe所在目录是 x:\HBuilderX\plugins\launcher\tools\adbs\ 里面可能有其他版本&#xff0c;用哪个都&#xff0c;建议使用最新的 配置 首先&#xff0c;将真机使用USB连接到电脑上。 在adb目录中启动命令…

iOS设备管理器有人推荐iTunes,有人推荐iMazing,到底如何选择

一说到iTunes软件&#xff0c;想必苹果用户都不会感觉陌生&#xff0c;它为我们在iPhone、iPad等iOS设备和电脑之间进行文件传输提供了便利&#xff0c;但它并没有那么好用&#xff0c;有时甚至让人抓狂。那我们今天就来分享一款可以取代iTunes的良心好软——iMazing&#xff0…

u盘扫描并修复后文件消失了怎么办?2种方法帮助找回

演示机型&#xff1a;技嘉 H310M HD22.0系统版本&#xff1a;Windows 10 专业版软件版本&#xff1a;云骑士数据恢复软件3.21.0.17案例分享&#xff1a;“我的u盘每次插电脑都会弹出要不要扫描并修复的提示窗口&#xff0c;不懂&#xff0c;然后不小心选择了“扫描并修复”&…

并发编程——CAS

如果有兴趣了解更多相关内容的话&#xff0c;可以来我的个人网站看看&#xff1a;耶瞳空间 一&#xff1a;前言 首先看一个案例&#xff1a;我们开发一个网站&#xff0c;需要对访问量进行统计&#xff0c;用户每发送一次请求&#xff0c;访问量1&#xff0c;如何实现&#x…

前端都在聊什么 - 第 4 期

Hello 小伙伴们早上、中午、下午、晚上、深夜好&#xff0c;我是爱折腾的 jsliang~「前端都在聊什么」是 jsliang 日常写文章/做视频/玩直播过程中&#xff0c;小伙伴们的提问以及我的解疑整理。本文章视频同步&#xff1a;TODO:本期对应 2023.01.28 当天直播间的粉丝互动。主要…

关于Scipy的概念和使用方法及实战

关于scipy的概念和使用方法 什么是Scipy Scipy是一个基于Python的科学计算库&#xff0c;它提供了许多用于数学、科学、工程和技术计算的工具和函数。Scipy的名称是“Scientific Python”的缩写。 Scipy包含了许多子模块&#xff0c;其中一些主要的子模块包括&#xff1a; …

eBPF(内核态)和WebAssembly

1 什么是eBPF 无需修改内核&#xff0c;也不用加载内核模块&#xff0c;程序员就可以在内核中执行执行自定义的字节码。 eBPF&#xff0c;它的全称是“Extended Berkeley Packet Filter”&#xff0c; 网络数据包过滤模块。我们很熟悉的 tcpdump 工具&#xff0c;它就是利用了…

Bellman-ford和SPFA算法

目录 一、前言 二、Bellman-ford算法 1、算法思想 2、算法复杂度 3、判断负圈 4、出差&#xff08;2022第十三届国赛&#xff0c;lanqiaoOJ题号2194&#xff09; 三、SPFA算法&#xff1a;改进的Bellman-Ford 1、随机数据下的最短路问题&#xff08;lanqiaoOJ题号1366&…