Windows系统怎么读取Linux RAID阵列?WinMD驱动一次搞定跨平台数据访问
【免费下载链接】winmdWinMD项目地址: https://gitcode.com/gh_mirrors/wi/winmd
你有没有过这样的经历:公司那台跑着 Linux 的服务器突然宕机,你火急火燎地把硬盘拆下来插进 Windows 电脑想抢救数据,结果资源管理器里一片空白,一个盘符都不认。更要命的是,这些盘不是普通硬盘——它们是 Linuxmdadm创建的软件 RAID 阵列,Windows 系统压根不知道该怎么把这些散盘"拼"回一个完整的阵列。WinMD 就是专门解决"Windows读取Linux RAID阵列"这个难题的开源内核驱动,今天我们就把它彻底讲明白。
一句话说清 WinMD 是什么
WinMD 是一款基于 LGPL 开源的 Windows 内核驱动程序,它的唯一使命就是让 Windows 识别并访问 Linux 下用mdadm创建的 MD RAID 软件阵列。如果你需要在两种操作系统之间搬运 RAID 数据,或者正为"Linux 阵列插上 Windows 后无法读取"而头疼,它就是为你准备的。
四个选择理由:为什么值得用它
- 覆盖几乎所有 RAID 级别:RAID 0、RAID 1、RAID 4、RAID 5、RAID 6、RAID 10(near/far/offset 三种布局)以及 Linear,一次全包圆。
- 识别标准超级块:支持 mdraid 1.0、1.1、1.2 三个版本超级块,覆盖绝大多数现代 Linux 系统创建的阵列。
- 不只读还能写:多数同类工具只能只读导出数据,WinMD 直接以磁盘驱动身份工作,支持正常读写,甚至能做 RAID 5/6 的奇偶校验计算。
- 免费开源可玩性高:LGPL 协议授权,源码随便改、随便研究,社区一起维护。
上手路径:从最快到最折腾的三档玩法
第一档:一条命令装好(最快)
如果你电脑里已经装了 Chocolatey 包管理器,那么连下载都不用动手:
choco install winmd装完重启一次,插上你的 Linux 硬盘就能在"磁盘管理"里看到阵列了。
第二档:右键安装(常规操作)
不想用命令行也没关系,传统安装同样简单:
- 把驱动压缩包解压到任意目录
- 找到其中的
winmd.inf文件 - 右键 → 选择"安装",等待系统提示完成
- 重启 Windows,打开"磁盘管理"确认阵列是否被识别
第三档:从源码自己编译(进阶玩家)
项目使用 CMake 构建,源码根目录就放着mingw-amd64.cmake和mingw-x86.cmake两套交叉编译工具链配置,Windows SDK 和 MinGW 环境都能编译。想要源码可以直接拉取仓库:git clone https://gitcode.com/gh_mirrors/wi/winmd。编译产物是标准的winmd.sys,配合src/winmd.inf安装即可。对于想研究内核驱动怎么写的人来说,这是一份质量相当不错的范例。
想卸载怎么办?
从管理员命令行执行下面这条命令(注意给winmd.inf写全路径),重启后驱动即被移除:
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 winmd.inf深度解析:它到底是怎么"认"出阵列的
看点一:藏在磁盘角落里的"身份档案"
Linux 的mdadm会在阵列的每一块成员盘上写一份超级块(superblock),里面记录了阵列的 UUID、RAID 级别、chunk 大小、成员数量等信息。WinMD 工作的第一步,就是把这些信息找出来。
关键在超级块的存放位置:1.2 版固定在磁盘偏移 4KB 处,1.1 版在磁盘最开头,1.0 版则藏在磁盘末尾。所以 WinMD 会按顺序依次扫描这几个位置,读出数据后先核对魔数(0xa92b4efc)和校验和,防止把普通磁盘误认成 RAID 成员。
找到成员盘之后,真正的组装逻辑才登场:驱动按set_uuid把散落的盘归类,只有当found_devices等于阵列声明的磁盘数量时,阵列才会被标记为"加载完成"并暴露给系统。这套机制保证了"缺一块盘就绝不启动阵列"——因为数据不完整时强行挂载只会带来更大的损坏风险。如果你在源码里翻到device_found和volume_arrival这两个函数,就能看到这套完整的识别流程。
看点二:RAID 5/6 的"读改写"魔术
RAID 5 和 RAID 6 的最大难点不在读,而在写小碎片。奇偶校验数据是分散在所有盘上的,当你只修改一小段数据时,对应的奇偶信息也必须同步更新。
想象一下:一个条带横跨多块盘,你只改了其中 4KB,怎么办?直接写会破坏整个条带的奇偶校验一致性。WinMD 的解法是引入partial_chunk(部分块)机制——把"写到一半"的碎片暂存在内存里,用位图记录哪些字节已经有效,最后由一个专门的后台线程把合并后的完整条带连同重新算好的奇偶一起刷回磁盘。
这一设计的思路和 Linux 内核的 md 模块如出一辙,本质上是牺牲一点内存来换取写效率和安全性的平衡。而读路径上,驱动会根据数据在盘上的分布(源码里的get_parity_volume、get_physical_stripe函数)决定哪些盘该读、哪块盘是奇偶盘,再用do_xor做 XOR 恢复计算。这样即使奇偶盘上恰好没有你需要的原始数据,也能从其他盘拼出来。
顺带一提,项目的模块化做得相当清爽:raid0.c、raid1.c、raid45.c、raid6.c、raid10.c、linear.c各管一个级别,读写入口在io.c,核心数据结构集中在winmd.h。想深入理解某个 RAID 级别,只看对应文件就够了。
避坑指南:新手最容易踩的五个坑
- 装了 WinMD 不等于能读数据:它只负责把阵列拼出来,文件系统还得靠其他驱动。ext4 需要 Ext2fsd,Btrfs 需要 WinBtrfs,否则阵列会显示成"未格式化",别误以为驱动坏了。
- 遇到"签名错误"先别慌:新版 Windows 10/11 对内核驱动签名要求大幅收紧,个人开发者无法获取企业级签名证书。真遇到签名报错,去 BIOS 里暂时关闭 Secure Boot 即可。
- chunk size 有硬性限制:源码里明确校验了 chunk 大小必须是 4096 的整数倍,否则直接拒绝加载。当初创建阵列时用了冷门块大小的话,需要提前留意。
- 阵列必须完整健康:当前版本不支持降级挂载,少一块盘就认不出来。另外异常断电后各成员盘的 events 计数可能不一致,驱动也会拒绝组装——这种情况先把盘装回 Linux,让阵列正常 clean 一次再拆出来。
- 卸载不是删文件:直接删驱动文件会导致系统残留异常,按上面的 RUNDLL32 命令卸载,或者改注册表
HKLM\SYSTEM\CurrentControlSet\services\winmd\Start的值为 4 来禁用。
适用场景:三类人分别能得到什么
系统运维人员 → Linux 服务器故障,需要拆盘到 Windows 抢救数据 →直接把成员盘插上 Windows 即可挂载备份,不用再临时搭一台 Linux 环境来恢复。
双系统用户 → 想在 Windows 和 Linux 之间共享同一份 RAID 数据 →不用反复拷贝文件,同一套阵列两个系统都能访问,省时省空间。
跨平台开发者 → 需要在不同操作系统上测试同一套应用和数据 →获得统一的数据访问接口,开发、测试、生产环境之间的数据流转变得顺畅。
对比与边界:客观认识它的能力圈
先说清楚 WinMD 的定位与 Windows 原生方案的差异。微软自带的"存储空间"(Storage Spaces)是 Windows 自家的软 RAID,但它的元数据格式 Linux 完全不认——两者方向正好相反。WinMD 则是向 Linux 的 mdraid 格式看齐,让你在 Windows 侧"读得懂"Linux 的阵列。
与市面上的商业数据恢复工具(如 UFS Explorer、R-Studio 一类)相比,那些工具通常只能只读导出且收费不菲,而 WinMD 免费开源、以内核驱动形态工作、支持正常读写,体验完全不同。
但它的边界也很明确:只支持 1.x 版本超级块(更老的 0.9 版不支持),不支持阵列 reshape、rebuild、一致性检查,不支持在 Windows 侧新建阵列,也不支持热插拔式动态增删成员盘,RAID 4/5/6 journal 和 write-intent bitmap 同样在待办清单里。换句话说,它现阶段是"读取与日常使用型"方案,而不是完整的 RAID 管理工具。
未来方向:项目在往哪走
从项目公开的 TODO 清单看,WinMD 的路线图很清晰:整盘 RAID 识别(能直接识别 MD 设备上的分区)、阵列重塑与数据重建、一致性检查、降级挂载容错、Windows 下动态增删设备、从 Windows 直接创建新阵列,以及老版本 0.9 超级块的支持。这些功能一旦落地,它就不只是"读取工具",而会成长为完整的跨平台 RAID 管理方案。
现在就动手:给数据一个跨平台的通行证
WinMD 的核心价值用一句话概括:把 Linux 和 Windows 之间的软件 RAID 数据壁垒彻底打通。下一步很简单——装好驱动,插上你的 Linux 硬盘,打开磁盘管理看一眼阵列是否被正确识别。如果你希望它变得更好,也欢迎去研究源码、提需求,一个开源项目能走多远,取决于每一个愿意伸手的社区成员。
【免费下载链接】winmdWinMD项目地址: https://gitcode.com/gh_mirrors/wi/winmd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考