Skip to content

Repository files navigation

目前计划不久后开始维护本项目.

前言

👇下面描述已过期,不久后我将重新更新本项目.


文件黑洞系统,即无论是读取/写入/创建等I/O操作都(欺骗性)返回成功,并未做实际的文件I/O操作.

存在问题:

动态黑名单在某些情况下会崩溃,导致进程卡死.

如不使用动态黑名单,则会导致内存泄露.

用法:

前提:

已安装fuse-t,且有符合本机架构的二进制文件.建议使用自己编译后的二进制文件.Releases中暂只有arm64的二进制文件.

命令行运行编译出的二进制文件,带上参数 [-delete] [-disable_blackMode] <挂载路径> <(可选,默认:/)映射路径> (影响性能,已移除) (没必要,用不上,已移除)

示例: ./virtual_fs /xx/挂载路径

效果:

向 挂载路径 中,读取/写入"任意文件"均返回成功,"任意文件夹"均已创建. (这个效果可能存在一些问题,我只粗略测试通过了,欢迎提PR修复,提issue我不一定会修,也未必有时间搞.)

参数解释:

-delete: 删除挂载路径下的文件 -disable_blackMode: 禁用黑名单模式,启用白名单模式.

目前特殊名单有: apache2

目前黑名单有: (目前已停用⛔️)

目前白名单有: (目前为空️)

目前规则有: 1️⃣以.开头文件名执行策略是报错返回.

(已移除)特殊规则(仅适用与动态黑名单): 以xlog结尾的文件名或以/JetBrains开头的路径,均跳过动态黑名单的检查.

关于模式和名单解释:

特殊名单: 起始路径位于特殊名单单内,对该路径下的任意名称访问均返回文件类型.例如: 获取/apache2/access_log信息,返回信息类型为文件.(算是对仅通过路径判断文件类型的一个补充,如果创建真实文件,就不会有这种问题了.但这使用了磁盘I/O)

(已移除)动态黑名单: 起始路径(除了白名单外)位于动态黑名单内且判定为文件且距上次访问时间之差达TIME_LIMIT * 3(当前为1分钟)且不在特殊规则内,对该路径执行策略是报错返回.目前动态黑名单最大数量设定为10.判定: 30秒内访问次数达到15次将进入动态黑名单.此名单中的记录不会主动移除在时间之差达标时移除,也会被 新数据 且 新数据在主程序中定义的hashFunction函数所得到相同的返回值的情况下 覆写.

黑名单模式: 起始路径位于黑名单内,对该路径执行策略是不伪装,报错返回.因为我搞不好,所以直接拉黑了.(但应该能修好,但不会😂)

白名单模式: 起始路径除了白名单(和根目录)外,都不进行伪装,报错返回.

注: 此处 起始路径 定义为 在原有路径上右移一位,即表示/之后的内容.如/JetBrains/xx,起始路径为JetBrains/xx.

关于日志:

如果发生内存泄露(判定:当主程序内存使用超过MEMORY_THRESHOLD(当前为:15MB)),监控程序会告诉主程序开始记录日志(地址: /tmp/fs_debug.log)

然后监控程序本身会记录内存泄露情况到日志(地址: /tmp/fs_Memory.log)中,并延迟结束主程序,随后监控程序本身也退出.

如果遇到内存泄露,可以将日志发到issue中,我会看看我会修不,不会修就拉黑名单看看OK不,不的话就寄咯.

运行日志(非debug模式将不会显示动态黑名单记录): /private/tmp/fs.log

备注:

版本信息: Apple Silicon macOS Sonoma 14.3 macFUSE 4.6.0 cmake 3.28.1 ninja 1.11.1

任意文件 定义:(判断依据)存在后缀,且不为第一个字符不为数字.其他都识别为文件夹.

文中描述主程序是指: virtual_fs.c ,监控程序是指: virtual_fs_monitor

virtual_fs_macfuse.c 为历史遗留代码,目前已从osxfuse换成fuse-t,取消对内核扩展的依赖.

virtual_fs_origin.c 为遗留代码,将原始函数实现作为参考.

Releases 默认仅适用于macOS arm64,其他平台请自行编译写代码(没全平台的技术力😂).

从v0.0.5版本开始,新增一个用于监控内存占用的二进制程序.程序结束后默认删除空目录.

从v1.1.2版本开始,新增动态黑名单(以解决可能出现的严重内存泄露),当存在某个路径频繁访问时,将会把这个路径加入动态黑名单中.

启动virtual_fs,默认会启动virtual_fs所在路径下的virtual_fs_monitor.

不支持手动指定路径.需要保证这2个二进制在一起.否则启动失败.(我不会怎么弄在一起.就这样了)

不支持SMB作为后端,目前仅支持NFS作为后端.

关于内存泄露,通过leaks工具可以看到存在内存泄露,例如OS_xpc_pipe ObjC libxpc.dylib等.

内存泄露(大概率)不是由我写的代码引入的,而是原本就存在内存泄露的问题.leaks from unclean exit in libfuse.

为了预防某些情况下的进程奔溃和内存泄露等问题,故做了黑名单和监控程序等措施来防止内存泄露并试图结束主程序,当主程序崩溃时,也会尝试重启主进程.

About

基于fuse-t,参考示例代码,制作适用于macOS的读/写为空的文件系统.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages