基于FUSE的文件系统过滤驱动开发方法

Fuse框架可以直接在用户层挂载一个自定义的文件系统,当将挂载点和挂载内容重叠在一起时就形成了一个文件系统过滤层,如fuse mount ~/A to ~/A

此时可以借助挂载命名空间方式在fuse程序内访问原始文件系统,避免递归回fuse(这样回死锁)

cpp 复制代码
int main(int argc, char *argv[])
{
	try
	{
		// 解析命令行参数<tool> watchingdir
		if (argc < 2)
		{
			std::cerr << "Usage: " << argv[0] << " watchingdir <mount-point>" << std::endl;
			return 1;
		}

		g_Ori_euid = geteuid();
		g_Ori_egid = getegid();

		std::string mount_point = argv[1];
		std::string watch_dir = mount_point;

		int ur = fuse_unmount(mount_point.c_str(), 1);
		printf("ur=%d,%d\n", ur, errno);

		//备份当前的挂载命名空间
		// 1. 保存当前挂载命名空间
		original_mnt_ns_fd = open("/proc/self/ns/mnt", O_RDONLY);
		if (original_mnt_ns_fd == -1)
		{
			perror("open original mnt ns failed");
			exit(EXIT_FAILURE);
		}

		// 2. 创建新的挂载命名空间
		if (unshare(CLONE_NEWNS) == -1)
		{
			perror("unshare failed");
			exit(EXIT_FAILURE);
		}

		// 3. 在新命名空间中挂载根文件系统为私有
		if (mount("/", "/", NULL, MS_REC | MS_PRIVATE, NULL) == -1)
		{
			perror("mount private failed");
			exit(EXIT_FAILURE);
		}
		//备份新命名空间fd
		new_mnt_ns_fd = open("/proc/self/ns/mnt", O_RDONLY);
		if (new_mnt_ns_fd == -1)
		{
			perror("open original mnt ns failed");
			exit(EXIT_FAILURE);
		}
		//切换到原来的空间
		if (0 != switch_namespace(original_mnt_ns_fd))
		{
			perror("switch old");
			exit(EXIT_FAILURE);
		}

		// 创建FuseWatcher实例
		FuseWatcher watcher(watch_dir);

		// 挂载FUSE文件系统
		int ret = watcher.mount(argc, argv);

		if (ret != 0)
		{
			std::cerr << "Failed to mount FUSE filesystem: " << ret << std::endl;
			return ret;
		}

		return 0;
	}
	catch (const std::exception &e)
	{
		std::cerr << "Error: " << e.what() << std::endl;
		return 1;
	}
}

之后在回调时就可以切换命名空间进行访问,也可以模拟调用者身份进行访问,此时默认可以做到一个透明转发的功能,再进行修改就可以完成文件审计功能

相关推荐
木白CPP2 天前
Linux 驱动UART子系统源码分析
linux·运维·服务器·驱动开发·嵌入式硬件·开源软件
恒锐丰-罗生3 天前
小体积大驱动|LTK8833 双通道 H 桥电机驱动芯片,电池供电设备首选动力方案
驱动开发·嵌入式硬件·硬件工程
正点原子6 天前
【正点原子Linux连载】 第十章 pinctrl和gpio子系统实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
星马梦缘6 天前
“零一”智能硬件开发挑战赛 宣传稿
驱动开发·智能硬件·活动·培训·科协
小此方7 天前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
芯片设计-曾工8 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
平凡的小蚂蚁10 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
小此方10 天前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
胡八一10 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
智者知已应修善业11 天前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程