WSL2 SpeedRun Any%

本文最后更新于:2024年10月19日 凌晨

前情提要

众所周知,这个世界对Windows开发者不太友好🥹

大量开源项目很难在Windows上跑起来,要么是依赖支持不完善,要么是噼里啪啦

由于纯Linux笔记本的日常App生态不够完善,因此程序员一般人手一台Mac

但是,我对这Windows爱得深沉😢

不过好消息是 巨硬(微软)推出了WSL(Windows Subsystem for Linux)

至此,Windows成了最好的Linux虚拟机

WSL2

WSL2WSL有着本质的不同

WSL通过指令转译运行于Windows内核之上,没有完整的 Linux 内核,可能会存在兼容性问题

WSL2是运行于Hyper-V虚拟化平台之上,运行一个完整的 Linux 内核,整体性能会更好

此时,WindowsWSL2成了平级关系,均成了虚拟机,会有那么一点点的性能损失

不过WSL2自带显卡直通(nvidia-smi查看),人工智能专业狂喜

缺点是WSL2Windows的文件系统互访会稍慢

总体上来讲,没有特殊需求还是更推荐WSL2(现在默认也是这个版本)

Install

闲话少叙,本篇是速通,还是来讲讲WSL2的安装吧

首先我们需要开启两个Windows功能:

  • 适用于Linux的Windows子系统
  • 虚拟机平台

Windows功能

安装之后会提示重启

接下来,直接到微软商店里搜Ubuntu就有了(推荐22.04版本,24.04可能会有点问题)

或者使用Powershell(管理员权限):

1
wsl --install -d Ubuntu-22.04
  • 不加-d Ubuntu-22.04也可以,会下载默认版本

  • --web-download:从 internet 而不是 Microsoft Store 下载 WSL 的最新版本,如果网络有问题可以试试

wsl --list --online:可以用于列出所有支持的发行版

当Ubuntu下载完毕后,会自动进行安装,大概几分钟就好了

1
2
3
4
正在安装: Ubuntu 22.04 LTS
已安装 Ubuntu 22.04 LTS。
正在启动 Ubuntu 22.04 LTS...
Installing, this may take a few minutes...

然后会提示输入用户名和密码

至此,你就成功地进入了WSL2

完结撒花(🫡🎶😉✌️)

Launch

之后有多种途径可以进入WSL

  1. 命令行

    直接在命令行输入wsl即可

    1
    2
    C:\Windows\System32>wsl
    cls@MrBeanCPC:/mnt/c/Windows/System32$

    但要注意,此时的工作目录是Windows的C盘(/mnt/c)(😾)

    可以通过cd ~切换回去,但不太方便

  2. Windows终端下拉列表

    终端下拉列表

    我们可以看到最后一个就是Ubuntu

  3. 开始菜单

    在开始菜单中(Win键),我们可以看到两个新的应用已经被添加

    WSL & Settings

    WSL Settings是在最近的更新中才添加的可视化配置工具,非常好用

    WSL打开之后就会进入到默认的Linux发行版,也很方便

Get out of C:\

如果你的C盘够大,可以跳过这一节

安装位置

默认情况下,WSL 2 使用一个虚拟硬盘(VHD)来存储文件:

C:\Users\<YourUsername>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_<version>\LocalState\ext4.vhdx

迁移

为了不让C盘爆掉,我们还是需要进行一次迁移

其实也不难,仅数个步骤:

  1. 停止WSL

    1
    wsl --shutdown

    我们还可以通过wsl -l -v查看所有安装的linux子系统状态(Stopped/Running)

    1
    2
    3
    PS C:\WINDOWS\system32> wsl -l -v
    NAME STATE VERSION
    * Ubuntu-22.04 Running 2
  2. 导出

    1
    wsl --export <名称> <要保存的路径>

    例如:wsl --export Ubuntu-22.04 D:\ubuntu.tar

    注意,这里的名称要与wsl -l -v显示的Name对应(😾)

  3. 取消注册

    然后我们需要先把原本的Linux删除(C盘)

    1
    wsl --unregister Ubuntu-22.04

    酱紫,上文提到的VHD就消失了(C盘空间释放)

    需要注意的是,WindowsApps文件夹中还会留有一个Ubuntu-22.04的应用,可以在开始菜单(Win键)右键卸载

    & ↑如果直接点击这个应用的话,会自动在C盘再次重装Ubuntu(😾)

  4. 导入

    此时,我们可以将ubuntu.tar重新导入系统(可选目录)

    1
    wsl --import <Name> <安装目录> <.tar路径> --version 2

    例如:wsl --import Ubuntu D:\WSL-Ubuntu D:\ubuntu.tar --version 2

    此时,我们已经完成了Ubuntu的目录迁移

    可以在终端的下拉列表中看到一个新的配置文件

    小企鹅

    其实这个也没有什么特别的,点进设置我们可以看到其内部也是调用了wsl命令

    终端配置文件

    wsl命令启动了名为Ubuntu的发行版,且cd启动目录到了~, Just

    但是直接进入Ubuntu,我们会发现默认用户是root(为什么root在终端没有高亮!震怒🙃)

  5. 设置默认用户(可选)

    进入WSL2后,我们可以通过编辑/etc/wsl.conf配置默认用户

    1
    2
    [user]
    default=mrbean

    加这两行就行

    然后记得wsl --shutdown关闭重启一下(😾)

    // 什么,你说你不会用vim or nano

    // 别急,直接装个gedit(往下看)

WSLg

WSLg是微软的又一黑科技(他真的,我哭死)

aka, WSL GUI

可以直接在Windows中打开并显示LinuxGUI程序(显示在任务栏的那种)

小试牛刀一下:

1
2
sudo apt install gedit
gedit

注意:Ubuntu 24.04启动(非sudo情况下)WSLg可能出现启动慢的情况

gedit in windows

神不神奇,gedit的界面直接无缝显示在了Windows

而且你还能在Windows的开始菜单中看到他(Text Editor)

gedit 开始菜单

貌似是RDP协议巴拉的

但是大部分的GUI程序其实显示的时候都会有一个白色边框

Chome-WSLg

emmmm,非常膈应人

只能说,可以用,但是,aaaa

关于解决方案的话,好像资料并不多,这里有一个issue可以看看:Run X11 windows without windows manager decoration · Issue #530

Linux Chrome安装详见:使用 WSL 运行 Linux GUI 应用 | Microsoft Learn

(否则没有浏览器的话Jetbrains的登录、认证跳转会失败)(😾)

中文支持

WSL2貌似默认不能显示中文(会变成方框)

可以参考一下这篇博客:安装中文环境和字体

  1. 安装中文环境和字体

    1
    sudo apt install language-pack-zh-hans
  2. 手动配置一下locale(选择zh_CN.UTF-8 UTF-8

    1
    sudo dpkg-reconfigure locales

    // 空格选择,TAB切换按钮

  3. 映射Windows字体到Ubuntu

    打开/etc/fonts/local.conf

    1
    sudo vim /etc/fonts/local.conf

    输入以下内容

    1
    2
    3
    4
    5
    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
    </fontconfig>
  4. 刷新字体缓存

    1
    fc-cache -f -v
  5. 最后重启WSL

    1
    wsl --shutdown

WSL Settings

网络

好了,这是一个老生常谈的问题

不过好消息是,近期的WSL2更新了mirrored镜像模式(默认是NAT),可以和主机共用一个IP

开启后,还能自动检测Windows的代理设置,简直不要太方便

WSL2设置网络

只要打开WSL Settings,并将网络-网络模式改为Mirrored,然后重启即可

通过ifconfig命令就可以看到ip的变化了

延迟关闭

空闲超时

这里顺便说一下,关闭Ubuntu命令行界面之后,WSL并不会马上关闭,而是等待60s不活动之后再关闭

WSL2与Windows互通

文件

两个系统分别都可以访问对方的文件系统,但是跨文件系统会比较慢

而且WSL2的文件可以直接在Windows的资源管理器中查看(嘿嘿)

资源管理器-WSL2

WSL2中,Windows的磁盘路径为:/mnt/c, /mnt/d(c d是盘符,以此类推)

而在Windows中,WSL2的路径为:\\wsl.localhost\Ubuntu\

都可以用自身的软件打开对方的文件,没有问题,但是很慢(不建议)

命令

他俩命令也是互通的,惊不惊喜,意不意外

WSL2,可以调用Windows的notepad,explorer等程序,如

1
notepad.exe /etc/wsl.conf

而在Windows中,可以使用wsl xxx这样的形式调用WSL命令,如

1
wsl gedit

甚至可以命令混写:

1
dir | wsl grep power

秀儿

端口无权限问题

注意:开启Hyper-V之后,可能导致某些端口无权限访问,例如heox server默认使用的4000端口(😾)

1
Error: listen EACCES: permission denied 0.0.0.0:4000

这里提示的并不是端口占用,而是无权限

使用netstat -ano|findstr ":4000"也是找不到什么结果的

这是因为开启Hyper-V之后这一段端口被系统保留了,无法使用

可以使用以下命令查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
1462 1462
3437 3536
3537 3636
3783 3882
3883 3982
3983 4082
4083 4182
4283 4382
4383 4482
4483 4582
4683 4782
4783 4882
5357 5357
5358 5457
50000 50059 *

* - 管理的端口排除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ netsh interface ipv4 show excludedportrange protocol=udp

协议 udp 端口排除范围

开始端口 结束端口
---------- --------
50000 50059 *
52672 52771
54373 54472
61228 61327
61432 61531
61673 61772
62278 62377
62378 62477
62478 62577
62578 62677
62778 62877
62978 63077
63178 63277

* - 管理的端口排除。

所以没办法,只能手动改用其他端口了

Peace

Ref

使用 WSL 运行 Linux GUI 应用 | Microsoft Learn

[WSL2教程] WSL安装linux系统以及从C盘迁移至其他盘

超详细的WSL教程:Windows上的Linux子系统_哔哩哔哩_bilibili

Run X11 windows without windows manager decoration · Issue #530 · microsoft/wslg (github.com)

在Windows10\11的WSL2中使用图形化应用Chrome和搜狗拼音输入法_win11 wsl2 图形化-CSDN博客

WSL2 基于WSLg运行Clion等GUI应用 - 知乎 (zhihu.com)

关于适用于 Linux 的 Windows 子系统的常见问题解答 | Microsoft Learn

给WSL应用程序创建Windows快捷方式 - oaksharks - 博客园 (cnblogs.com)

解决Win10 1080端口无权限使用的问题 - 四季天书SkiTiSu’s blog

记录一个端口监听失败问题 - 零零博客 (ll00.cn)


WSL2 SpeedRun Any%
https://mrbeancpp.github.io/2024/10/18/WSL2-SpeedRun/
作者
MrBeanC
发布于
2024年10月18日
许可协议