WinFsp 文件系统测试套件 winfsp-tests 实战指南:两种运行模式、命令行筛选与故障排查

发布时间:2026/9/26 1:46:00
WinFsp 文件系统测试套件 winfsp-tests 实战指南:两种运行模式、命令行筛选与故障排查 存储驱动开发【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址https://gitcode.com/gh_mirrors/wi/winfsp点击查看免费下载WinFspWindows File System ProxyWindows 文件系统代理即 FUSE for Windows官方自带一套名为winfsp-tests的文件系统测试套件用于对 WinFsp 内核组件及其随附文件系统如 MEMFS进行回归验证同时它也可以以外部模式针对任意第三方的、基于 WinFsp 实现的文件系统进行一致性测试。本文以仓库内 tst/winfsp-tests/README.md 为主干结合 winfsp-tests.c 等源码完整讲解 winfsp-tests 的两种测试模式、全部命令行选项、测试筛选语法*、-、前缀、输出格式以及测试失败时如何结合源码定位问题——读完本文你将能独立搭建并运行针对自己文件系统的外部模式测试。1. 什么是 winfsp-testswinfsp-tests 是一个文件系统测试套件file system test suite用途是测试 WinFsp 本身以及随 WinFsp 分发的文件系统实现。它不是给最终用户使用的工具——如果你下载到了 winfsp-tests大概率你真正需要的是 WinFsp 安装包即名为winfsp-VERSION.msi的安装文件。README 对其定位做了非常直白的警告WINFSP-TESTS IS UNSUPPORTED SOFTWARE. IT MAY CRASH OR LOCK UP YOUR COMPUTER, CREATE ZOMBIE/UNKILLABLE PROCESSES OR CORRUPT YOUR DATA. DO NOT USE UNLESS YOU KNOW WHAT YOU ARE DOING. DO NOT POST BUGS/ISSUES/QUESTIONS AGAINST WINFSP-TESTS UNLESS YOU ALSO POST THE FIX. YOU HAVE BEEN WARNED!翻译过来即winfsp-tests 是不受支持的软件它可能导致系统崩溃或锁死、产生僵尸/不可杀进程、甚至损坏数据除非你清楚自己在做什么否则不要使用除非你同时提交修复补丁否则不要针对 winfsp-tests 提交 bug/问题。这段警告意味着它是开发期工具而非面向最终用户的交付物。从源码结构看winfsp-tests 由以下部分组成测试主程序tst/winfsp-tests/winfsp-tests.c——负责解析全局选项、注册全部测试套件并调用 tlib 测试框架执行公共头文件与辅助函数tst/winfsp-tests/winfsp-tests.h大量按功能划分的测试文件例如 create-test.c创建/删除语义、info-test.c文件属性信息、rdwr-test.c读写、lock-test.c字节范围锁、oplock-test.c机会锁 Oplock、notify-test.c目录变更通知、security-test.c安全描述符、reparse-test.c重解析点/符号链接等底层测试框架 tlibext/tlib/提供TESTSUITE/TEST/TEST_OPT宏、ASSERT断言与tlib_run_tests执行器详见 ext/tlib/testsuite.h 与 ext/tlib/testsuite.c。2. 两种测试模式内部模式与外部模式winfsp-tests 存在两种截然不同的运行方式2.1 默认内部模式internal mode默认情况下winfsp-tests 使用内嵌的 MEMFS 副本作为被测文件系统测试在进程内启动一个 MEMFS 实例磁盘文件系统与网络文件系统各一个并针对其执行全部测试。从 memfs-test.c 可以看出memfs_start_ex会调用MemfsCreateFunnel创建 MEMFS 并MemfsStart启动它memfs_test在WinFspDiskTests与WinFspNetTests均为真时分别对MemfsDisk、MemfsNet两种形态各跑一遍。除非你在做 WinFsp 自身的开发否则通常没有需要运行内部模式的场景。2.2 外部模式external mode外部模式通过--external命令行选项启用它让测试直接针对当前目录所在的文件系统运行。这意味着你可以把任意第三方基于 WinFsp 实现的文件系统挂载到某个驱动器/目录然后 cd 进去运行winfsp-tests --external即可对该文件系统做 WinFsp API 兼容性验证这也是 README 推荐的、测试不随 WinFsp 分发的第三方文件系统的方式从 winfsp-tests.c 的选项解析可见--external以及等价的--ntfs会把OptExternal置真同时关闭WinFspDiskTests/WinFspNetTests即不再自动启动内嵌 MEMFS并置NtfsTests 1开启需要真实文件系统环境支持的用例另外还有--fuse-external语义上与 external 相同但会切换为FUSE 外部模式OptFuseExternal TRUE适用于验证基于 FUSE 层封装的文件系统。2.3 推荐组合README 明确建议外部模式配合--resilient一起使用以通过重试失败操作来降低测试的偶发性flakiness。 winfsp-tests-x64 --external --resilient create_test............................ OK 0.00s create_fileattr_test................... OK 0.00s ... --- COMPLETE ---输出中每个测试一行格式为测试名 状态 耗时全部结束后打印--- COMPLETE ---。3. 全部命令行选项详解结合 winfsp-tests.c 的选项解析循环winfsp-tests 除--list之外的全局选项完整罗列如下选项作用源码依据--external外部模式针对当前目录所在文件系统测试关闭内嵌 MEMFSwinfsp-tests.c--ntfs与--external等价针对 NTFS 等真实文件系统运行语义同为外部模式同上--fuse-external外部模式 FUSE 变体OptFuseExternalwinfsp-tests.c--resilient开启韧性模式对删除等易失败操作进行自动重试减少测试偶发失败winfsp-tests.c--case-insensitive-cmp文件名比较忽略大小写OptCaseInsensitiveCmpwinfsp-tests.c--case-insensitive以大小写不敏感语义启动 MEMFSOptCaseInsensitivewinfsp-tests.c--case-randomize随机翻转文件名大小写隐含大小写不敏感比较用于测试大小写不敏感文件系统winfsp-tests.c--flush-and-purge-on-cleanup在 cleanup 时执行 flush 并清除缓存对应 MEMFS 的MemfsFlushAndPurgeOnCleanupwinfsp-tests.c--legacy-unlink-rename使用旧版 unlink/rename 语义对应MemfsLegacyUnlinkRenamewinfsp-tests.c--notify启用目录变更通知notify相关行为winfsp-tests.c--oplockbatch以 batch oplock 模式运行 Oplock 测试winfsp-tests.c--oplockfilter以 filter oplock 模式运行 Oplock 测试winfsp-tests.c--mountpoint挂载点将 MEMFS 挂载到指定路径如X:或目录替代默认挂载点winfsp-tests.c--share共享名[目标]通过网络共享方式测试如--sharewinfsp-tests-shareM:\可附带目标路径winfsp-tests.c--share-prefix前缀为网络文件系统的名称查询指定前缀配合映射驱动器使用winfsp-tests.c--no-traverse禁用 SE_CHANGE_NOTIFY遍历权限验证无遍历权限场景winfsp-tests.c几点补充说明--share依赖外部模式源码中若!NtfsTests OptShareName会直接ABORT(option --share requires --ntfs/--external)即--share必须与--external/--ntfs联用容器环境自动降级若检测到运行于 Windows 容器注册表ContainerType存在源码会自动WinFspNetTests 0禁用网络文件系统测试--mountpoint的驱动器判定若挂载点不是X:形式的盘符源码会将WinFspNetTests置 0除以上选项外测试筛选相关选项--list、--tap、--no-abort、--repeat-forever由底层 tlib 框架处理见下文第 4 节。3.1--resilient的底层实现README 推荐外部模式配合--resilient其实现位于 tst/winfsp-tests/resilient.c。它通过对 Win32 API 的重定向/包装来增加操作韧性ResilientDeleteFileW/ResilientRemoveDirectoryW删除失败时若错误是ERROR_SHARING_VIOLATION或目录删除时的ERROR_DIR_NOT_EMPTY最多重试DeleteMaxTries 30次、每次间隔DeleteSleepTimeout 300msResilientNtClose/ResilientCloseHandle利用HANDLE_FLAG_PROTECT_FROM_CLOSE记录以FILE_DELETE_ON_CLOSE/FILE_FLAG_DELETE_ON_CLOSE打开的文件在关闭后调用WaitDeletePending等待STATUS_DELETE_PENDING状态消失文件真正从文件系统删除后再继续重试的意义在于真实文件系统尤其第三方实现对删除-重命名-再创建等序列的处理存在时序窗口--resilient能显著降低这类偶发失败。4. 测试筛选语法*、-前缀与前缀winfsp-tests 支持指定运行哪些测试也支持排除某些测试语法全部来自 tlib 框架ext/tlib/testsuite.c 中的tlib_run_tests。4.1 基本规则默认行为不指定任何测试名时运行全部**常规非可选**测试通配符测试名末尾可带一个*例如rename*匹配所有以rename开头的测试-前缀排除-测试名表示排除该测试或该通配匹配集合前缀纳入可选测试测试名表示显式纳入该测试——如果它是可选optional测试则必须用才会执行*运行全部*表示所有测试包括可选测试。从 ext/tlib/testsuite.c 的匹配逻辑可见每个测试名会依次与所有命令行参数比对前缀把该测试标记为要运行-前缀标记为不运行无前缀参数则将常规测试纳入匹配集可选测试默认排除。4.2 示例一按前缀运行运行所有以rename开头的测试 winfsp-tests-x64 --external --resilient rename* rename_test............................ OK 0.01s rename_open_test....................... OK 0.00s ... --- COMPLETE ---4.3 示例二排除指定测试运行所有create测试但排除create_fileattr_test winfsp-tests-x64 --external --resilient create* -create_fileattr_test create_test............................ OK 0.05s create_readonlydir_test................ OK 0.01s ... --- COMPLETE ---4.4 示例三纳入可选测试默认只跑常规测试可选optional或长时间long running测试要用显式开启。运行所有测试用*只跑 oplock 测试用oplock* winfsp-tests-x64 --external --resilient oplock* oplock_level1_test..................... OK 1.26s oplock_level2_test..................... OK 2.46s ... --- COMPLETE ---从 oplock-test.c 可以看到这些测试的真实身份oplock_level1_test、oplock_level2_test等通过FSCTL_REQUEST_OPLOCK_LEVEL_1/FSCTL_REQUEST_OPLOCK_LEVEL_2等控制码发起机会锁请求并借助DeviceIoControl 重叠 I/O RegisterWaitForSingleObject异步等待 oplock 中断验证文件系统对 Oplock 语义acknowledge/break的支持。4.5 示例四只列出测试用--list列出而非运行匹配的测试 winfsp-tests-x64 --external --resilient --list oplock* oplock_level1_test oplock_level2_test ...--list由 tlib 的do_test_list实现仅仅打印测试名不执行任何测试适合在正式运行前确认筛选结果。4.6 其它 tlib 级选项除--list外tlib 还支持见 ext/tlib/testsuite.h--tap以 TAPTest Anything Protocol格式输出便于接入 CI 工具链--no-abort单个测试断言失败时只中止当前测试通过setjmp/longjmp恢复而不是中止整个测试套件--repeat-forever无限循环重复执行测试常用于稳定性压测/复现偶发问题。5. 测试失败的定位方法README 明确说明一旦有测试失败测试套件会立即停止并以断言失败assertion failure告终程序不会给出额外的问题解释你必须去研读 winfsp-tests 源码来理解失败原因并为你的文件系统确定修复方案。此外winfsp-tests 不会事后清理现场文件系统中可能会残留垃圾文件。断言失败信息由 ext/tlib/testsuite.c 的tlib__assert生成形如ASSERT(表达式) failed at 文件:行号:函数 (errNTSTATUS:Win32错误码)其中错误码部分调用RtlGetLastNtStatus与RtlGetLastWin32Error同时给出 NTSTATUS 与 Win32 错误这是判断底层失败原因的第一手线索。此外 winfsp-tests.h 定义了ABORT(s)宏用于在配置非法等情况下直接abort()并打印带函数名的错误消息例如前文提到的--share必须配合--external的校验。5.1 定位建议流程先看失败断言打印的源文件与行号打开对应测试文件如 create-test.c、rdwr-test.c阅读该测试的前置操作序列结合 NTSTATUS/Win32 错误码对照 WinFsp 官方 NTSTATUS 语义仓库 tools/gensrc/ntstatus.py 与src/dll/ntstatus.i有完整的映射表判断是测试期望的操作结果与文件系统实际返回之间的哪一步不一致若开启了--no-abort单个测试失败后套件会继续运行可一次收集多个失败点由于测试不清理现场复现时建议先清空被测文件系统目录再重跑单测避免残留文件干扰。5.2 需要管理员权限的测试注意部分测试需要 Administrator 权限才能运行README 原文 Some tests require Administrator privileges in order to run。例如挂载测试mount-test.c、网络共享测试--share会调用NetShareAdd、事件日志测试eventlog-test.c等通常涉及系统级操作。建议以管理员身份打开命令行执行 winfsp-tests。6. 测试套件全景winfsp-tests 到底测什么main函数winfsp-tests.c通过TESTSUITE(...)注册了全部测试套件覆盖 WinFsp 文件系统的核心能力面套件关注点对应测试文件fuse_opt_tests/fuse_testsFUSE 选项解析与 FUSE 语义兼容fuse-opt-test.c、fuse-test.cposix_testsPOSIX 语义unlink/rename/删除posix-test.cpath_tests/volpath_tests路径解析与卷路径path-test.c、volpath-test.cdirbuf_tests目录缓冲/枚举dirbuf-test.claunch_tests/launcher_ptrans_tests进程启动与 ptrans 协议launch-test.c、launcher-ptrans-test.cmount_tests挂载点管理mount-test.cmemfs_tests内嵌 MEMFS 基本生命周期memfs-test.ccreate_tests文件/目录创建与删除语义create-test.cinfo_tests文件属性/时间戳/大小info-test.csecurity_tests安全描述符与 ACLsecurity-test.crdwr_tests读写与 mmaprdwr-test.cflush_testsFlush/清理语义flush-test.clock_tests字节范围锁lock-test.cdirctl_tests目录控制操作dirctl-test.cexec_tests从文件系统直接执行程序exec-test.cdevctl_tests设备控制devctl-test.creparse_tests重解析点/符号链接reparse-test.cea_tests扩展属性EAea-test.cstream_tests命名数据流ADSstream-tests.coplock_tests机会锁Oplockoplock-test.cnotify_tests目录变更通知ReadDirectoryChangesWnotify-test.cwsl_testsWSL 相关兼容wsl-test.ctimeout_tests/load_unload_tests/uuid5_tests/version_tests/eventlog_tests超时、驱动加载/卸载、UUID5、版本、事件日志对应同名测试文件另外hooks.ctst/winfsp-tests/hooks.c通过重定向CreateFileW/DeleteFileW/MoveFileExW/GetVolumeInformationW等 Win32 API 来捕获测试中的文件操作实现--mountpoint、--share等选项下的路径改写把内嵌 MEMFS 的\memfs\share前缀或盘符路径映射到指定挂载点/共享以及--case-randomize下的文件名大小写随机化。7. 集成到 CIrun-tests.bat 中的真实用法仓库中的 tools/run-tests.bat 是 WinFsp 官方 CIAppVeyor使用的完整测试编排脚本展示了 winfsp-tests 在生产级测试中的真实用法可作为读者搭建自己 CI 的参考先用launchctl-x64 start memfs64 testdsk ... M:等命令把 memfs64/memfs32/memfs-dotnet 的各种形态磁盘/网络、x64/x86/.NET挂载到 M:/N:/O:/P:/Q:/R: 等盘符默认测试矩阵dfl_tests包含大量变体winfsp-tests-x64、winfsp-tests-x64-case-randomize、winfsp-tests-x64-flushpurge、winfsp-tests-x64-legacy-unlink-rename、winfsp-tests-x64-mountpoint-drive、winfsp-tests-x64-mountmgr-drive、winfsp-tests-x64-oplock、winfsp-tests-x64-notify、winfsp-tests-x64-external、winfsp-tests-x64-external-share等具体命令示例节选winfsp-tests-x64 *——运行全部测试含可选winfsp-tests-x64 --case-randomize * ea*——大小写随机化模式winfsp-tests-x64 --flush-and-purge-on-cleanup * ea*——flush/purge 语义winfsp-tests-x64 --mountpointX: --resilient * ea*——挂载到 X: 的外部/挂载点测试winfsp-tests-x64 --mountpointmymnt --case-insensitive * ea*——目录挂载点 大小写不敏感winfsp-tests-x64 --no-traverse * ea*——无遍历权限场景winfsp-tests-x64 --oplockfilter --resilient * ea*——filter oplock 模式winfsp-tests-x64 --notify --resilient * ea*——目录通知模式winfsp-tests-x64.exe --external --resilient *——对挂载的 memfs 跑外部模式全套winfsp-tests-x64.exe --external --sharewinfsp-tests-shareM:\ --resilient -reparse_symlink*——通过网络共享测试并排除符号链接用例脚本还对特定环境做了适配检测到 Avast 杀毒软件fltmc instances -v M: | findstr aswSnx时排除querydir_buffer_overflow_test对 ntptfs 样本文件系统排除需要 POSIX delete 的rename_flipflop_test、rename_mmap_test、exec_rename_dir_test、stream_rename_flipflop_test等每个用例通过call :test-name执行并以ERRORLEVEL判断成败最终汇总 Total: 通过数/总数并执行泄漏检查。这套矩阵说明winfsp-tests 既可以单次简单运行也可以按不同选项组合成大规模回归矩阵覆盖挂载点、大小写、Oplock、通知、网络共享等复杂场景。8. 小结与使用建议winfsp-tests 是 WinFsp 生态中面向开发者的核心验证工具其设计要点可以总结为两种模式内部模式内嵌 MEMFS用于 WinFsp 自身开发与外部模式--external针对当前目录所在文件系统适合第三方文件系统验证筛选灵活名称*前缀匹配、-名称排除、名称/*纳入可选测试配合--list可精确控制测试集选项丰富--resilient、--case-*系列、--oplock、--mountpoint、--share、--notify、--no-traverse等覆盖了文件系统的绝大部分行为面失败即止断言失败立即中止须结合源码与错误码定位问题且测试不清理残留文件权限要求部分测试需要管理员权限。如果你正在开发一个基于 WinFsp 的文件系统最务实的入门路径是以管理员身份运行winfsp-tests-x64 --external --resilient先观察基线通过率再针对你的文件系统特性用oplock*、ea*、notify*等前缀定向加深覆盖最后参考 tools/run-tests.bat 将不同选项组合编排进 CI形成持续的回归保障。测试失败时请牢记 README 的告诫先研读测试源码、修复你的文件系统再把修复补丁一并提交。赞分享存储驱动开发【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址https://gitcode.com/gh_mirrors/wi/winfsp点击查看免费下载相关推荐Nim 增量编译IC测试套件实战指南tests/ic 的体系结构、运行方式与疑难排查Nim 增量编译IC测试套件实战指南 tests/ic 的体系结构、运行方式与疑难排查 导读 tests/ic 是 Nim 编译器增量编译Increme编程语言编译器语言运行时标准库10分钟精通WinFsp文件系统挂载命令行与图形界面全指南10分钟精通WinFsp文件系统挂载命令行与图形界面全指南 引言告别文件系统挂载痛点 你是否还在为Windows下复杂的文件系统挂载流程而困扰作为开发者存储驱动开发NixOS 启动故障排查内核命令行参数、rescue 模式与 initrd 调试实战指南NixOS 启动故障排查内核命令行参数、rescue 模式与 initrd 调试实战指南 导读 当 NixOS 无法正常启动时通过 GRUB 引导菜单临时添包管理器操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询