|
|
本帖最后由 Stardust0831 于 2026-7-8 05:14 编辑
前言:写本帖的动机是我学校HPC部署了免费的deepseek pro,遂想玩玩看能否沉淀下skill并用Hermeus通过飞书算科学计算,于是激情格式化了一台闲置的一体机电脑来准备wsl及相应的科学计算环境,配置过程中顺手发一下wsl的配置注意点。本贴的初稿借助了一些Codex的帮助,我本身是wsl和应用计算的老手,也有大量早年纯手工玩linux和科学计算时期的实际踩坑经历积累的一些经验,我对内容有逐字的审阅(甚至最后由于表达欲过于旺盛、很多地方几乎全重写),故本文可以放心食用。我之前还写过一篇WSL里编译CP2K的经验分享帖,也提到了一些WSL的小技巧,可以一起看看,和本文互为补充。
很多计算化学同学用Windows做日常办公,但又经常需要Linux环境:装程序、跑脚本、编译包、用conda、ssh到服务器。以前常见做法是 VMware 装一个 Ubuntu 虚拟机。现在更推荐先试试 WSL2。
简单说,WSL2像是嵌在Windows里的Linux。它不是远程服务器,也不是完整桌面虚拟机,但对于大多数命令行工作已经很好用:装conda、跑 Python、编译程序、处理轨迹文件、写 shell 脚本、连接集群,都比较顺手。
WSL和VMware怎么选
社长曾在群里多次提到他本人很钟爱VMware这种完整的linux环境。如果你需要一个完整Linux桌面、要折腾图形界面、驱动、内核模块,VMware仍然更像“真虚拟机”。
但如果你的主要需求是:CP2K、ABACUS和PySCF等通过命令行使用的纯linux程序,那WSL2通常更轻便。它启动快,占用少,Windows和Linux文件可以互相访问,实际科学计算效率也会略好一些。
不过,WSL也有坑。科学计算场景里,最常见的坑有三个:
1.默认内存上限不合适。
2.文件放错位置会很慢。
3.WSL使用.vhdx 虚拟硬盘,其特性是占用空间自动增长但不会自动收缩。即使在 WSL 内部删除了文件,Windows 宿主机上的文件体积依然保持峰值大小。
下面说怎么处理。
wsl --install完成wsl的安装并创建好用户后,先迁移到合适的盘:
WSL默认常常装在C盘,随着WSL里数据的增多,有C盘红掉的风险。建议一开始就迁移到空间大的SSD,比如D盘。
先看已有发行版:
比如我这边看到我的linux发行版叫Ubuntu。这个发行版仍然在跑,所以我们先关闭 WSL:
随后导出已有环境:
- wsl --export Ubuntu D:\wsl-backup\ubuntu.tar
复制代码 此处的D:\wsl-backup可以换成任何一个非C盘的、空间充足的SSD下已存在的目录(不建议机械硬盘)。
确认导出完成后,注销原来的实例:
重新导入到 D 盘:
- wsl --import Ubuntu-22.04 D:\WSL\Ubuntu D:\wsl-backup\ubuntu.tar --version 2
复制代码 再次启动:
如果进去后变成root,可以再设回默认用户。先在WSL里看用户名:
然后在PowerShell里设置:
- wsl --manage Ubuntu --set-default-user 你的用户名
复制代码 最重要的配置:.wslconfig
Windows用户目录下新建这个文件:
- C:\Users\你的用户名\.wslconfig
复制代码 对于我手上这台128GB内存的电脑而言,wslconfig可以这样写:
- [wsl2]
- memory=120GB
- maxCrashDumpCount=-1
- [experimental]
- sparseVhd=true
复制代码 改完.wslconfig后要记得重启WSL:
然后重新打开WSL。
.wslconfig选项解释:
- memory=120GB是给WSL2虚拟机的内存上限。WSL2默认只给Windows总内存的一部分,官方文档里默认是总内存的50%。对于大内存工作站,这个默认值经常不合适。当前机器有128GB内存,只给一半,跑大体系时很容易莫名其妙不够用。这里直接给到120GB,让WSL可以吃到更多内存,同时给Windows留一点余量。
- maxCrashDumpCount=-1是控制WSL崩溃转储数量的配置。我之前在wsl算g16的时候发现有时候Ctrl+C完了以后进程迟迟没有退出,C盘还莫名其妙红了(此时我wsl已经迁移到D盘)。最终发现wsl有崩溃转储机制,设置完这个选项后Ctrl+C能秒结束、C盘也不红了。
- sparseVhd=true是让新建的WSL虚拟硬盘使用sparse VHD。WSL的默认行为是占用空间自动增长但不会自动收缩,所以始终会维持峰值占用;将 VHDX 设置为 sparse 模式后,Windows 会在检测到 WSL 内部删除文件时自动回收空间,无需手动压缩。
注意sparseVhd=true主要影响新建的发行版;已有发行版可以手动开启sparse:
- wsl --shutdown
- wsl --manage Ubuntu-22.04 --set-sparse true随后可以手动查询这个发行版对应的ext4.vhdx来验证sparse是否生效,比如,对于D:\WSL\Ubuntu\ext4.vhdx,可以用:
- [code] fsutil sparse queryflag "D:\WSL\Ubuntu\ext4.vhdx"
复制代码 如果生效,会看到类似:
- This file is set as sparse
复制代码
删除文件后,为什么Windows磁盘空间没回来
这是WSL2的经典问题。Linux里删了文件,df -h可能显示空间已经释放,但Windows看到的ext4.vhdx可能还是很大。
开启sparse VHD后,可以在WSL里执行:
再回到PowerShell:
然后看Windows文件属性里的“占用空间”,可能会降下来。
文件放哪里很关键:
建议把Linux计算环境、conda环境、源码、临时计算目录放在WSL自己的Linux文件系统里,例如:
- /home/你的用户名/project
- /home/你的用户名/software
- /home/你的用户名/miniconda3
复制代码 不建议长期在这里跑大量小文件读写:
- /mnt/c/Users/xxx/Desktop
- /mnt/d/some/windows/path
复制代码 /mnt/c、/mnt/d是Windows磁盘挂进WSL的路径,方便互相拷文件,但I/O性能和权限行为都不如WSL自己的ext4文件系统。
像CP2K不会在任务运行目录有频繁I/O,我实测过没有明显效率损失,所以我喜欢在跨文件系统/mnt/d跑CP2K,这样文件直接就在windows下;但是ORCA这种在运行目录产生大量tmp文件的程序在/mnt/d下就会明显比/home/你的用户名/project这种目录下慢了,所以ORCA这种就不建议跨文件系统。
需要把linux下的计算结果拿回Windows时,复制出来即可:
- cp result.xyz /mnt/d/results/
复制代码 也可以在命令行中输入下面的命令在windows中直接打开wsl系统下的文件夹
事实上,wsl原生也会挂载在windows的文件管理器,在这里蓝笔圈出来的地方可以直接打开:
(顺带一提,你会发现图上还有很多挂载的盘,那些其实都是一些公网上的服务器,我的github仓库里有一个跨系统的基于rclone的挂载gui,可以实现像访问本地U盘一样访问云服务器上的文件,并且得益于VFS缓存机制,会比一些纯SFTP的挂载更为丝滑、文件传输性能更好,我后面会单发博文讲)
WSL文件路径通常写做类似这种,图标找不到的时候也可以直接进:
总结
新机器上可以按这个顺序来:
1.安装WSL2 Ubuntu。
2.迁移到D盘或大容量SSD。
3.写好.wslconfig。
4.把项目目录放在/home/用户名/project。
5.conda、编译工具、计算程序都装在WSL内部。
6.Windows只负责编辑、画图、办公和结果归档。
这样用起来比较接近一台本地Linux小工作站:Windows保持干净,Linux环境也不乱。
WSL不是万能的。真要长时间大规模生产计算,还是建议上服务器或集群;真要完整Linux桌面和底层驱动,VMware也仍然有价值。但对于计算化学日常的“装环境、跑脚本、后处理”,WSL2已经足够好用,而且折腾成本低很多。
参考:
1.Microsoft WSL 官方配置文档https://learn.microsoft.com/en-us/windows/wsl/wsl-config
2.WSL2 磁盘瘦身与空间自动回收指南https://zhuanlan.zhihu.com/p/2001292650641367095
尾声:
最后我把装好了WSL的一体机垫高到我显示屏后面,也是解锁四屏幕,不得不拍照记录这一临时起意的搞怪画面了:
|
评分 Rate
-
查看全部评分 View all ratings
|