ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

F3(Fight Flash Fraud)闪存卡容量与性能检测实战指南:f3write/f3read/f3probe/f3fix 全解析

F3(Fight Flash Fraud)闪存卡容量与性能检测实战指南:f3write/f3read/f3probe/f3fix 全解析 开发工具存储测试【免费下载链接】f3F3 - Fight Flash Fraud项目地址https://gitcode.com/gh_mirrors/f3/f3点击查看免费下载本指南基于 F3 10.0version.h官方文档 doc/introduction.rst 与仓库源码系统讲解如何识别扩容盘、虚标容量的闪存卡/U 盘先用 f3write/f3read 做全量写入回读校验再用 f3probe 快速探测真实容量最后用 f3fix 把分区修正到实际大小。读完本文你将掌握 F3 五大工具的完整使用流程、全部命令行参数以及其伪随机数据填充 回读比对检测原理的源码级实现。一、F3 是什么写给消费者的闪存反欺诈工具F3 是一款简单但严谨的闪存设备检测工具专门用来验证存储卡的真实容量与真实性能是否达到标称规格。其核心原理非常朴素向设备写入伪随机pseudorandom数据再原样读回并逐位比对。如果写进去 64GB 的数据、却只能读回 8GB那么这张64GB卡就是扩容假卡——这正是市面上最常见、也最难用肉眼识别的闪存骗局。F3 是Fight Flash Fraud对抗闪存欺诈或Fight Fake Flash对抗假闪存的缩写。在 Linux 生态中它常被视为 Windows 平台 H2testw 的开源替代方案仓库还提供了与 H2testw 输出格式完全一致的辅助脚本 scripts/f3write.h2w。工具族由五个命令行程序组成分别覆盖检测链条的不同环节工具定位平台f3write用 1GB 大小的.h2w文件填满设备全平台f3read回读并逐扇区校验这些.h2w文件全平台f3probe直接探测块设备快速定位真实容量仅 Linux扩展应用f3fix按真实容量重建分区表修复假盘仅 Linux扩展应用f3brewf3probe 的封装可定制探测脚本仅 Linux扩展应用注意本文档描述的是官方 stable 版本当前仓库源码标注为 10.0跨平台差异与 Linux 专属能力以下文各节为准。二、三种核心检测场景与完整操作流程下面统一使用/dev/sdX作为设备占位符把X替换成小写字母以匹配目标设备。先用lsblk查看当前系统设备总览确认你要测的是哪块盘——这一步至关重要一旦测错设备数据可能被直接销毁。2.1 性能与容量测试f3write f3read这两个程序必须按顺序搭配使用。f3write 向已挂载的磁盘写入大量文件f3read 再检查磁盘中的文件与写入内容是否完全一致$ build/f3write /media/michel/5EBD-5C80/ $ build/f3read /media/michel/5EBD-5C80/把/media/michel/5EBD-5C80/替换成你实际的挂载路径macOS 上 USB 设备通常挂载在/Volumes下。如果你的 f3write/f3read 已经通过make install安装到了系统 PATH 中直接运行命令名即可无需build/前缀。注意测试会清空目标分区上的所有数据。f3write 的写入机制源码视角在 src/f3write.c 的create_and_fill_file()中每个文件大小固定为 1GB1ULL GIGABYTE_ORDER命名格式为N.h2wN 为数字见 libfile.h 中/^[0-9]\.h2w$/的匹配规则。写入过程在每个数据块落盘后调用fdatasync()强制刷盘、再通过posix_fadvise(POSIX_FADV_DONTNEED)提示内核丢弃页缓存从而绕开写缓存造成的假满盘错觉并保证测出的写入速度接近真实介质速度。当write()返回ENOSPC磁盘写满时程序自动停止——如果设备标称 64GB 却在写入第 8 个 1GB 文件时就报 No space left那么真实容量立刻暴露。f3read 的校验机制源码视角src/f3read.c 的validate_file()以扇区512 字节为单位回读比对每个扇区的判定结果被归类为四种状态ok一致、corrupted损坏、changed内容被改写、overwritten被覆盖。输出头为SECTORS ok/corrupted/changed/overwritten汇总行告诉你总共校验了多少扇区、其中多少个正常、多少个异常。同样地读取前会对每个文件执行fdatasync()与posix_fadvise(POSIX_FADV_DONTNEED)清缓存保证测出的读取速度不被缓存美化。2.2 f3write / f3read 命令行参数详解两个工具的参数结构对称分别定义于 src/f3write.c 与 src/f3read.c长选项短选项参数默认值说明--start-atNUM-sNUM文件序号1从第 NUM 个.h2w文件开始处理--end-atNUM-eNUM文件序号无穷大处理到第 NUM 个.h2w文件为止--max-write-rateKB/s-wf3writeKB/s不限速限制最大写入速率单位 KB/s--max-read-rateKB/s-rf3readKB/s不限速限制最大读取速率单位 KB/s--show-progressNUM-pNUM终端下开启NUM 非 0 时显示进度条两个实用细节值得注意限速防过热源码中对EIO写入错误专门给出了提示——持续最大速率写入可能导致存储卡过热建议冷却后改用--max-write-rate2048即限制为 2MB/s重试。这一提示逻辑位于 src/f3write.c。进度条智能开关默认--show-progress取isatty(STDOUT_FILENO)的值即 stdout 是终端才显示进度重定向到日志文件时自动关闭避免日志被回车刷屏。2.3 快速容量探测f3probef3probe 是最快的盘体检测工具特别适合大容量硬盘它只写入探测所需的必要数据而非全量数据因此能在几分钟内完成过去数小时才能完成的容量判定。它直接操作未挂载unmounted的块设备且必须由特权用户root运行# build/f3probe --destructive --time-ops /dev/sdX警告这会销毁磁盘上任何已存储的数据结合 src/f3probe.c 的选项定义--destructive-n的含义是探测之后不恢复设备上被覆盖的块。也就是说默认情况下 f3probe 会在探测结束后尽量把写入的块恢复原状而加上--destructive则明确放弃恢复——因此务必在确认数据无需保留后再使用。--time-ops-t则让 f3probe 额外统计读、写、重置操作的耗时用于评估设备性能。探测原理源码视角为什么 f3probe 能只写必要数据因为扩容假盘的固件通常维护一个缓存映射表真实容量之外的地址会回绕wrap覆盖到真实存储区域。f3probe 通过 libprobesrc/libprobe.c按特定顺序执行顺序写、随机写、随机读和冲刷缓存overwhelm cache等操作用少量采样块定位出地址回绕点从而推算真实容量。特别地源码注释记录了假盘常见的8KB 小缓存 4MB 大缓存陷阱顺序读会被大缓存掩盖坏块因此 f3probe只使用随机读来识别真实容量边界避免被假盘缓存机制欺骗。f3probe 的完整参数见 src/f3probe.c长选项短选项说明--destructive-n探测后不恢复设备块默认会恢复--min-memory-l用更少内存换取更慢速度--time-ops-t统计读/写/重置操作耗时--verbose-v显示详细进度--show-progressNUM-pNUM 非 0 时显示进度--max-read-rateKB/s-r限制最大读取速率--max-write-rateKB/s-w限制最大写入速率--debug-*系列-d/-a/-f/-m/-b/-c/-o/-k/-u—隐藏调试选项用于单元测试、模拟真实容量/假容量/回绕参数/块大小/缓存大小等假盘场景普通用户无需使用2.4 将容量修正为真实大小f3fixf3probe 探测成功后会输出假盘的真实容量对应的最后一个扇区号--last-sec参数。接下来用 f3fix 在假盘上创建一个恰好覆盖真实容量的单一分区让操作系统只能看到真实大小从而修好这张扩容盘# build/f3fix --last-sec16477878 /dev/sdX示例中的--last-sec16477878来自 f3probe 的输出实际使用时以探测结果为准。f3fix 基于libparted实现见 src/f3fix.c 的#include parted/parted.h参数如下长选项短选项参数说明--last-secSEC-NUM-l扇区号必填分区结束扇区f3probe 输出的真实容量末尾--first-secSEC-NUM-a扇区号分区起始扇区默认从 0 附近开始--disk-typeTYPE-d类型名分区表类型可用--list-disk-types查看--fs-typeTYPE-f类型名分区文件系统类型可用--list-fs-types查看--boot/--no-boot-b/-n—是否将分区标记为可引导--list-disk-types-k—列出所有支持的分区表类型--list-fs-types-s—列出所有支持的文件系统类型修复完成后强烈建议用 f3read 或 f3probe 复测一次确认修复后的分区读写稳定。若修复后仍偶发数据损坏则可能属于劣质闪存flaky flash问题参见后文 四、辅助资源 中的 Flakyflash。三、跨平台安装与编译指南3.1 获取源码从 F3 官方发布的 stable 版本标签下载源码包解压$ unzip f3-10.0.zip当前仓库源码即为 10.0 版本见 version.h 中F3_STR_VERSION 10.0解压后在源码根目录执行下述构建命令。3.2 Linux编译与安装构建 f3write 与 f3read$ make安装 f3write 与 f3read默认安装到/usr/localPREFIX可覆盖$ make installf3probe、f3fix、f3brew 属于Linux 额外应用编译方式见 3.5 节。3.3 FreeBSD编译与安装安装依赖$ sudo pkg install argp-standalone gmake用 GNU make 构建F3 依赖 GNU 参数解析库 argp$ gmake安装$ make install3.4 Windows/Cygwin编译 f3write 与 f3readf3write 与 f3read 可以在 Windows 上运行f3probe、f3fix、f3brew目前仅支持 Linux见 3.5 节说明Windows 用户可改用 Docker 方式见 3.6 节。先安装 Cygwin 包及其依赖gcc-coremakelibargp-devel构建时需传入特殊链接选项增大栈空间并链接 argp$ export LDFLAGS$LDFLAGS -Wl,--stack,4000000 -largp $ make安装$ make install3.5 macOS安装与源码编译f3write 与 f3read 可安装在 Mac 上f3probe、f3fix、f3brew 同样仅支持 LinuxMac 用户可改用 Docker。已安装 Homebrew 时一行搞定$ brew install f3使用 MacPorts 则执行$ port install f3若要从源码编译最新开发版F3 大部分代码可直接用 Xcode 构建唯一缺失的依赖是 GNU C 库argp可自行编译或使用 Homebrew/MacPorts 提供的argp-standalone。以下步骤已在 OS X El Capitan 10.11 上验证安装 Apple 命令行工具xcode-select --install安装 Homebrew 或 MacPorts安装 argp 库$ brew install argp-standalone或 MacPortsport install argp-standalone构建 F3使用 Homebrew 时直接make使用 MacPorts 时需传入 argp-standalone 的安装位置$ make ARGP/opt/local3.6 Docker跨平台快速使用含 f3probe/f3fix官方在 Docker Hub 提供了预构建镜像peron/f3可直接使用。启动 Docker 后运行$ docker run -it --rm --device device peron/f3 f3-command [f3-options] device例如探测挂载在/dev/sdX的驱动器$ docker run -it --rm --device /dev/sdX peron/f3 f3probe --destructive --time-ops /dev/sdX你也可以基于本仓库自行构建镜像仓库自带 Dockerfile基于 ubuntu:22.04 并一次性完成make install与make install-extra$ make docker或等价地$ docker build -t f3:latest .用自建镜像运行各命令$ docker run -it --rm --device /dev/sdX f3:latest f3probe --destructive --time-ops /dev/sdX $ docker run -it --rm -v /path/to/mounted/device:/mnt/ f3:latest f3write /mnt/ $ docker run -it --rm -v /path/to/mounted/device:/mnt/ f3:latest f3read /mnt/设备透传注意事项在 Linux 上--device直通通常可直接工作但在 Mac/Windows 上Docker 倾向于把驱动器映射成普通目录而非挂载设备可能报错如f3probe: Cant open device /opt/usb: Is a directory。解决思路是借助 docker-machine 创建 VirtualBox VMboot2docker让设备先透传给虚拟机再进入容器大致流程为$ docker-machine create -d virtualbox default $ docker-machine stop $ vboxmanage modifyvm default --usb on $ docker-machine start $ vboxmanage usbfilter add 0 --target default --name flashdrive --vendorid 0x0123 --productid 0x4567 $ eval $(docker-machine env default)其中usbfilter add的--name是自定义过滤器名--vendorid与--productid可在 Mac 的系统信息 → USB中查到也可用vboxmanage list usbhost辅助定位设备。也可以在停掉虚拟机后通过 VirtualBox GUI 手动添加设备。完成上述步骤后拔插一次 U 盘用docker-machine ssh default lsblk确认设备sdb是 USB 盘的常见挂载名再执行上文 Quick Start 中的探测命令。如需进入容器检查设备节点可运行$ docker run --rm -it --device /dev/sdX peron/f3 bash随后即可在容器内执行ls /dev/*等命令。3.7 Linux 额外应用f3probe / f3fix / f3brew的编译依赖安装f3probe 和 f3brew 需要 libudev 版本 1 的库f3fix 需要 libparted 版本 0 的库。Ubuntu 上执行$ sudo apt-get install libudev1 libudev-dev libparted-dev若 Ubuntu 版本早于 20.04.1把libparted-dev换成libparted0-dev。Fedora 上执行$ sudo dnf install systemd-devel parted-devel编译与安装$ make extra $ make install-extra需要明确说明的边界额外应用f3probe、f3brew、f3fix仅在 Linux 平台上编译与测试。作者在文档中明确说明希望在其他平台使用这些工具的用户应参与移植并提交补丁而非要求作者代为移植。3.8 构建系统速览仓库根目录的 Makefile 定义了全部构建目标几个关键点CC ? gcc编译标准为-stdc17并开启-Wall -Wextra -pedantic产物输出到build/目录BUILD_DIR buildall目标只构建 f3write/f3readextra目标构建 f3probe/f3fix/f3brew其中 f3probe、f3brew 链接-ludevf3fix 链接-lparted与文档所述依赖一一对应make docker等价于docker build -f Dockerfile -t f3:latest .非 Linux 平台自动追加-largp链接选项并引入 argp 头文件路径macOS 上优先使用 Homebrew 前缀。四、辅助资源与生态4.1 仓库文件清单changelog —— 供软件包维护者使用的变更日志man/f3read.1 —— f3read 与 f3write 的手册页。可执行man man/f3read.1直接阅读安装到系统手册目录的命令为$ install --ownerroot --grouproot --mode644 man/f3read.1 /usr/share/man/man1LICENSE —— 许可证GPLv3Makefile —— make(1) 构建文件src/*.h与src/*.c—— F3 的 C 源码flake.nix —— Nix 包管理器配置可自动构建/安装仓库内容flake.lock —— 锁定构建依赖版本保证 Nix 构建可复现4.2 辅助脚本仓库自带的脚本开箱即用但设计初衷是示范如何编写你自己的 F3 脚本以便针对特定场景个性化scripts/f3write.h2w —— 生成与 H2testw 完全一致的文件。用法scripts/f3write.h2w /media/michel/5EBD-5C80/scripts/log-f3wr —— 依次运行 f3write 和 f3read并把输出记录到日志文件。用法scripts/log-f3wr log-filename /media/michel/5EBD-5C80/注意上述脚本与用法示例均假设 f3write、f3read 和脚本位于同一目录。4.3 图形界面生态社区为 F3 提供了多款图形前端方便不熟悉命令行的用户F3-Gui作者 Daniel TavaresLinux 平台、基于 Flatpak 的 GUI内置 f3write、f3read、f3probe、f3fix特色是可用 f3fix 自动格式化修复后的新分区F3 QT作者 TianzeLinux 平台、基于 Qt 的 GUI支持 f3write、f3read、f3probe、f3fixF3XSwift作者 Volker RunkelmacOS 平台 GUI支持 f3write、f3readFake-USB-Tester作者 shampuanLinux 平台、Python Qt5 编写的 GUI支持 f3write、f3read、f3probe。这些项目的共同价值在于扩大了 F3 的可用人群值得测试并向作者反馈改进意见。4.4 Flakyflash修复劣质闪存如果你的闪存并非扩容假盘或已用 f3fix 修正却仍然偶发数据损坏那么可能属于劣质闪存flaky flash个别存储簇不稳定。对于使用 FAT 文件系统的闪存可借助 Flakyflash 工具找出不稳定的数据簇并将其在 FAT 中标记为坏簇从而让设备多坚持一段时间。需要清醒认识的是这只能缓解问题该闪存仍应被视为故障设备尽快更换才是正解。五、底层原理纵深F3 如何保证测量可信5.1 检测数据的可复现性文件命名与逐扇区校验F3 的检测文件命名为数字.h2w正则/^[0-9]\.h2w$/见 libfile.h每个文件 1GB。文件内的每个扇区都带有基于物理偏移量的确定性伪随机数据fill_buffer_with_block偏移量作为生成因子之一因此回读校验不依赖外部哈希表——读到某个扇区直接重新生成该偏移应有的数据并比对即可。这解释了为什么 f3read 能以扇区粒度报告ok/corrupted/changed/overwritten四种状态。5.2 流量控制与动态块大小libflow 的测量引擎libflow.h 是整个测量体系的核心。struct flow维护总块数、块大小、限速值max_process_rate单位 KB/s与测量窗口blocks_per_delay。限速通过状态机FW_INC/FW_DEC/FW_SEARCH/FW_STEADY自适应调节每个测量周期的块数既保证平均速率不超过--max-write-rate/--max-read-rate设定值又能动态搜索合适的测量块大小rem_chunk_blocks避免缓存效应导致测速失真。fw_measurement结构记录每个周期实际处理的块数与耗时最终汇总出平均/最小/最大速度——f3write/f3read 结尾输出的Avg/Min/Max速度即源于此。5.3 跨平台兼容层为了在 Linux、macOS、FreeBSD、OpenBSD、Cygwin 上统一行为libfile.h 定义了一组兼容宏macOS/OpenBSD 补充POSIX_FADV_SEQUENTIAL、POSIX_FADV_DONTNEED常量及posix_fadvise()/fdatasync()的实现OpenBSD 上将posix_fadvise退化为空操作FreeBSD 上将fdatasync映射为fsync而 Cygwin 的 f3read 则以O_RDWR打开文件以满足内核的fdatasync写权限要求。这正对应前文全平台可编译 f3write/f3read的安装说明。结语从检测到修复的完整闭环一张可疑闪存卡的完整处置链路是lsblk确认设备 → 挂载后f3write全量写入 →f3read回读校验确认容量虚标与否确认假盘后卸载分区用f3probe --destructive --time-ops快速探测真实容量边界最后用f3fix --last-sec探测输出重建分区把设备修回真实容量再复测确认。整个流程既有面向最终用户的傻瓜式命令也有基于 libudev/libparted 的 Linux 原生实现支撑是识别和处置扩容闪存最实用的开源方案之一。赞分享开发工具存储测试【免费下载链接】f3F3 - Fight Flash Fraud项目地址https://gitcode.com/gh_mirrors/f3/f3点击查看免费下载相关推荐feishu2md核心功能解析从飞书文档到纯净Markdown的完美转换feishu2md核心功能解析从飞书文档到纯净Markdown的完美转换 feishu2md是一款强大的飞书文档转换工具能够一键将飞书文档转换为纯净的Mar开发工具CLIF3 项目使用文档全面检测闪存设备真实容量F3 项目使用文档全面检测闪存设备真实容量 概述 F3Fight Flash Fraud对抗闪存欺诈是一个专业的开源工具专门用于检测闪存设备U盘、S开发工具存储测试ONNX.js社区贡献指南如何为开源AI项目做出贡献ONNX.js社区贡献指南如何为开源AI项目做出贡献 ONNX.js是一个能够在浏览器和Node.js环境中运行ONNX模型的开源AI项目它为开发者提供了使上一篇Zed 安装配置10 分钟跑起第一个项目下一篇ACE-Step Transcriber核心功能揭秘从语音识别到歌曲结构自动标注的完整流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进