背景介绍
由于Linux上缺少很多常用的软件,并且Linux加上图形界面时,有时会出现很多匪夷所思的BUG(包括但不限于压缩文件的默认打开方式变成了文本编辑器、界面卡死等情况),因此将工作流迁移到Windows上也不失为一种选择。
WSL 2相比WSL 1最大的缺点就是它运行在虚拟化层中,并且对NTFS的读写性能极差!(还有一个问题是硬件和网络端口不再共享了)但是优点是它是完整的linux系统,可以发挥Linux全部的功能。
如果要使用WSL 2进行日常工作,就必须避免使用NTFS,而是使用其他Linux上原生支持的文件系统。本篇文章的重点就是如何让WSL 2用上原生支持的文件系统。
配置环境
启用Linux子系统功能(需要管理员权限),下面这个指令可以自动配置好所有环境,默认使用WSL 2,Ubuntu系统。
wsl --install
重启系统,重启后会自动弹出下面这个安装框
按照提示设置好用户名和密码
挂载与准备Ext4分区
通过下面这条指令查看Windows当前磁盘
GET-CimInstance -query "SELECT * from Win32_DiskDrive"
打开磁盘管理器,清空一个需要用于WSL 2的磁盘
下载和安装diskgenius
打开diskgenius,将这个分区格式化为Ext4
执行以下指令进行块设备节点挂载(其实如果把磁盘彻底删除分区表,即把MSR分区也删除就不需要加参数 --bare,也不需要diskgenius进行处理。但是我以前吃过MSR的亏,这个有可能引发Windows的一个BUG,所以就没有彻底删除掉它,具体情况可以看这个链接:Windows 10 开启快速启动关机回到登入界面的问题!原因已经找到,求解决方案! - Microsoft Community)
wsl --mount \\.\PHYSICALDRIVE1 --bare
# 卸载指令是 wsl --unmount \\.\PHYSICALDRIVE1
此时可以看到已经将设备映射到WSL 2中了
此处sdd1是msr分区,sdd2是我创建的新ext4分区,可以用diskgenius观察分区顺序
挂载Ext4分区
mkdir ~/AndroidCodes
sudo mount /dev/sdd2 ~/AndroidCodes
sudo chown [用户名] ~/AndroidCodes/
Windows 11甚至可以直接在文件管理器看到这个WSL 2的目录结构!操作就很方便了!
性能测试
搞份redis代码编译一下,顺便看看时间(尤其是NTFS和Ext4的时间,可以看出WSL 2在NTFS上的IO有多低,以至于一定要挂载一块Ext 4硬盘用于Android编译)
NTFS分区(已经禁用了Windows Security)上redis构建完成时间:4分47秒
Ext4分区上redis构建完成时间:1分37秒
参考资料
Windows 下哪个软件能把硬盘分区转换为 ext4 格式? - 知乎 (zhihu.com)
Get started mounting a Linux disk in WSL 2 | Microsoft Docs
Connecting USB devices to WSL - Windows Command Line (microsoft.com)
附录
挂载块设备节点出现问题
按照提示去看log(WSL 2中)
发现它默认会找ext4,所以就先对这个磁盘创建EXT4分区,然后再回来挂载块设备节点
背景延申
再此之前,我是用虚拟机开虚拟化技术在Windows上构建Android的,性能会有较多的损失。
如果全部换成WSL 2至少性能方面要比虚拟机高不少,但是有个最大的缺点!难以对这块硬盘进行全盘加密…
全盘加密的好处就在于,别人偷了你电脑的硬盘,什么数据都获取不了。
Windows上是BitLocker加密(自动与TPM 2芯片配合),Linux上是Luks加密,macOS上是FileVault加密(自动在T2或M系列芯片加速这个过程)