做了一个迁移缓存到 win11 dev drive 的脚本, 基于 REfs 支持 COW - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jqknono
V2EX    程序员

做了一个迁移缓存到 win11 dev drive 的脚本, 基于 REfs 支持 COW

  •  
  •   jqknono 68 天前 1888 次点击
    这是一个创建于 68 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开源地址: https://github.com/jqknono/migrate-to-win11-dev-drive

    简而言之, COW 功能识别重复文件, 只保存一份, 减少磁盘占用和磁盘写入.

    简介

    Dev Drive 缓存迁移脚本是一个交互式 PowerShell 工具,旨在帮助开发者将各种开发工具的缓存目录迁移到 Windows 11 的 Dev Drive (ReFS 文件系统) 上,以提高性能、延长硬盘寿命并减少磁盘空间占用。

    核心优势

    • 延长硬盘寿命: 通过将频繁读写的缓存文件移动到 Dev Drive ,可以减少对系统盘 (通常是 SSD) 的写入次数,从而延长其使用寿命。
    • 减少磁盘空间占用: 将庞大的缓存文件 (如 Node.js 的 node_modules 缓存、Python 的 pip 缓存等) 从系统盘移出,可以显著释放宝贵的系统盘空间。
    • 高性能: 利用 Dev Drive 的 ReFS 文件系统和优化特性,可以提升缓存的读写速度,加快构建和开发工具的响应速度。

    Copy-on-Write (COW) 技术

    Dev Drive 基于 ReFS 文件系统,利用了 Copy-on-Write (COW) 技术。COW 是一种资源管理技术,其核心思想是:当多个调用者同时请求相同资源时,它们最初会共享同一份资源。只有当某个调用者需要修改资源时,系统才会为该调用者创建一份资源的副本,然后让其修改这个副本,而不会影响到其他调用者所使用的原始资源。

    在 Dev Drive 的场景中,COW 技术带来了显著的优势:

    1. 高效的文件复制: 当需要复制一个大文件时,ReFS 不会立即进行实际的数据复制,而是创建一个新的文件入口指向相同的磁盘块。只有当源文件或目标文件被修改时,才真正复制被修改的数据块。这使得文件复制操作变得非常快速,并且几乎不占用额外的磁盘空间(直到发生修改)。
    2. 节省磁盘空间: 对于包含大量相似文件的缓存目录(例如,多个项目依赖的相同版本的包),COW 可以有效地共享未修改的数据块,从而减少整体磁盘占用。
    3. 提高性能: 减少了不必要的数据复制操作,提高了文件操作的效率。

    Dev Drive 与 refs 特性

    Windows 11 引入了 Dev Drive ,这是一种专为开发者优化的存储卷。Dev Drive 使用 Resilient File System (ReFS) 作为其文件系统,并启用了专门的优化功能。

    ReFS (Resilient File System) 是微软开发的新一代文件系统,相较于传统的 NTFS ,它具有以下优势:

    • 数据完整性: 通过校验和和自动修复功能提高数据的可靠性。
    • 可扩展性: 支持更大的卷和文件大小。
    • 性能优化: 针对虚拟化和大数据工作负载进行了优化。
    • 集成 COW: 原生支持 Copy-on-Write 语义,这对于开发场景中的文件操作尤其有利。

    Dev Drive 优化: 在 ReFS 的基础上,Dev Drive 进一步为开发者工作负载进行了优化,例如针对包管理器缓存、构建输出等场景的性能提升。

    脚本功能

    本脚本提供以下主要功能:

    • 迁移缓存: 支持将多种开发工具的缓存目录迁移到 Dev Drive 。
      • Node.js (npm, yarn, pnpm)
      • Python (pip)
      • .NET (NuGet)
      • Java (Maven, Gradle)
      • Go (Go modules)
      • Rust (Cargo)
      • VS Code 扩展
      • Windows TEMP/TMP 目录
        • JetBrains IDE (IntelliJ, PyCharm 等)
      • Android SDK
      • Chocolatey (Windows 包管理器)
      • 用户隐藏文件夹 (.xxx)
    • 恢复缓存: 将已迁移到 Dev Drive 的缓存目录恢复到其原始位置。
    • 链接迁移: 通过创建符号链接/联接点迁移缓存目录,不修改任何环境变量。
    • 测试模式: 提供安全的模拟操作,用于测试 Dev Drive 删除等功能,而不会实际修改系统。

    使用说明

    快速开始(推荐)

    以管理员身份运行 PowerShell 7 (pwsh),然后执行以下命令直接下载并运行最新版本的脚本:

    iex "& { $(irm https://raw.githubusercontent.com/jqknono/migrate-to-win11-dev-drive/main/Setup-DevDriveCache.ps1)} -Lang zh" 

    手动安装

    1. 系统要求:
      • Windows 11 (Build 22000 或更高版本)
      • PowerShell 7+ (pwsh)
    2. 运行脚本:
      • 以管理员身份打开 PowerShell 7 (pwsh)。
      • 导航到脚本所在目录。
      • 执行 .\Setup-DevDriveCache.ps1
    3. 交互式操作:
      • 脚本启动后会显示一个交互式菜单,引导您完成各种操作。
      • 选择相应的选项来迁移缓存、创建或删除 Dev Drive 等。
      • 所有关键操作都需要用户确认,确保安全。

    注意事项

    • 目的: 此脚本的目的是迁移缓存文件夹,而不是清理它们。迁移后,原始缓存数据仍然存在,只是存储位置发生了变化。
    • 备份: 在进行重大操作(如删除 Dev Drive )之前,建议备份重要数据。
    • 环境变量: 脚本不会读取或写入用户环境变量;迁移通过符号链接完成。

    参考资料

    idealhs
        1
    idealhs  
       68 天前
    REFS 这玩意网上评价不太好,不过 Dev Drive 我其实一直在用,没有感觉到太大区别。
    jqknono
        2
    jqknono  
    OP
       68 天前
    @idealhs 这个我不太了解, REFS 是有什么问题吗?
    至少如果本地工程很多的话, 三方库不用每次都重复下载了.
    idealhs
        3
    idealhs  
       68 天前
    @jqknono 兼容性,稳定性,工具链都比较差吧。你搜搜看网上骂的一大把,我估计微软本身也没把这个做多完善就先放出来了。REFS 本身还是面向企业级存储的,而且设计瞄准的是存储池,而不是单机硬盘。不知道为什么 MS 把他作为 Dev Drive 用,也许只是想用一下 COW 特性吧。不论如何,我日常使用下倒没有出现 bug 影响工作。
    cheng6563
        4
    cheng6563  
       68 天前
    @jqknono 丢数据
    REFS 这玩意全靠 RAID1 保证数据可靠,没有 RAID1 的情况下若校验不过直接会删除文件,让你 chkdsk /f 的机会都没有。btrfs 还能让文件系统只读呢。
    家用无 ECC 内存校验的情况下这是迟早的事情。
    然后就是 REFS 版本号刷的非常多,出现过升级直接炸盘的先例。
    artiga033
        5
    artiga033  
       68 天前 via Android
    @idealhs 你看网上骂 win11 、win11 的某次更新、某个补丁的也一大把,幸存者偏差罢了。而且 dev drive 本来就不是给普通用户用的,微软也只推荐放缓存之类的丢了也无所谓的内容,虽然我自己其实把代码也放里面了

    dev drive 还有个好处是默认不会被 defender 狂扫,不然 defender 没事就扫两边 node_modules 这种重量级

    不过确实看 benchmark ReFS 性能没比 NTFS 高多少,它又不支持自动去重所以这个 CoW 和硬链接也没差,但有总归没有好,比如 uv 就支持在 ReFS 上使用 CoW ,https://docs.astral.sh/uv/reference/settings/#link-mode
    idealhs
        6
    idealhs  
       68 天前
    @artiga033 我不知道你在哪里看的只推荐放缓存之类的丢了也无所谓的内容。感觉你对这块也没有认真研究。

    另外 ReFS 不向下兼容的同时速刷版本号,真的很难说是个稳定能够使用的文件系统。
    AkaGhost
        7
    AkaGhost  
       68 天前
    REFS 真的很坑,一直在速刷版本号导致主系统一旦挂掉,离线 PE 几乎没几个能读的。紧急情况下没办法把里面的数据临时捞出来。如果一定要用,建议用 vhdx 创建,并放在 NTFS 的分区里,最起码能把 vhdx 捞出来。
    jqknono
        8
    jqknono  
    OP
       68 天前
    @idealhs @cheng6563 感谢科普, 看来确实有风险
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3000 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:42 PVG 21:42 LAX 05:42 JFK 08:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86