文章

关于WSL2的安装与踩坑

安装这玩意费了我一个下午,踩了无数坑并集合了众多其他博客的经验才有了这篇笔记,主要介绍了在Windows11系统下WSL2的安装和管理、此过程中可能遇到的问题及其解决办法

关于WSL2的安装与踩坑

一、WSL的简介

  • Windows Subsystem for Linux(WSL),即运行在Windows上的Linux子系统,本质是虚拟机
  • WSL2是基于HyperV的虚拟化平台,其结构是最底层是HyperV,其上分别有基于WIndows内核的用户空间和基于Linux内核的用户空间,两个空间之间可以进行网络通信与文件共享

二、搭建WSL2

2.1 两个先决条件

  • CPU虚拟化需要被开启(大部分电脑都开启了),可以在任务管理器的性能栏的CPU子栏中检查

CPU虚拟化的检测.pmg

  • 两个Windows功能需要被打开,如下图找到”启用或关闭Windows功能”设置项

启用或关闭Windows功能.png

  • 如下图所示开启两个对应的Windows功能,然后重启电脑以启用

开启两个对应的Windows功能.png

2.2 发行版的安装、遇到的问题及其解决

默认是安装在C盘,但这样不好,C盘很快就会满,可以export备份导出一份子系统然后再将其import恢复在指定位置达到换盘的目的,或者也可以直接从网络下载WSL对应子系统发行版的安装包将其解压到指定位置达到换盘的目的,在后面的笔记中有具体的方法

  • 以管理员身份打开cmd命令行或者PowerShell(因为--web-download指令需要管理员权限才能使用),WSL相关的命令以wsl或者wsl.exe开头,我暂时不太清楚具体的差别,下面的笔记中使用到的指令如果行不通,那就把两者互换试试
  • 小贴士:以管理员方式打开PowerShell的快捷键Win+X, A
  • 设置WSL默认版本设置为WSL2
1
wsl --set-default-version 2
  • 在安装前请先执行以下命令,--web-download使得我们从GitHub而不是Microsoft Store下载最新更新,该操作需要管理员权限
1
wsl --update --web-download
  • 更新完后,可以选择直接安装,会默认安装Ubuntu发行版
1
wsl --install
  • 如果wsl --install出现了以下报错,可以通过修改IPv4的DNS为114.114.114.114的方式暂时解决,具体操作详见此笔记末尾,实测对于本人此时使用的电脑有效
1
无法解析服务器的名称或地址
  • 还可能会出现下图显示的这个报错

未镜像到WSL.png

  • 解决方案:打开或创建WSL配置文件C:/User/username/.wslconfig并添加以下内容,然后打开命令行并执行wsl --shutdown命令关闭WSL,然后重启WSL即可解决这个问题
1
2
3
4
5
6
[experimental]
autoMemoryReclaim=gradual  
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
  • 使用以下命令可以查询可安装的发行版,如果不想使用命令行安装的话可以参考后面关于从网络上下载发行版的笔记
1
wsl --list --online
  • 使用如下命令可以安装指定的Linux发行版,xxxxxx代指发行版的名称,可以在指令末尾加上--web-download用以减少因网络问题导致安装失败的情况
1
wsl --install -d xxxxxx
  • 每个子系统安装成功后都会要求你设置用户名和密码,如下图所示(用户名要合法),注意了!任何Linux系统的密码输入都是不会显示出来的,不是WSL的问题,也不是你电脑的问题!

安装成功输入用户名.png

2.3 发行版环境的管理及其使用

  • 安装好后可以通过以下两指令之一查看安装过的Linux发行版列表,名字前带*的是当前的默认发行版,可以注意到每个发行版的名称后有一个STATE表示其状态,Stopped显然表示当前未在运行
1
2
wsl -l -v
wsl --list -v

发行版列表.png

  • 可以通过以下指令切换不同的默认发行版
1
wsl --set-default xxxxxx
  • 在cmd或者PowerShell命令行中,可以通过以下命令来打开某Linux发行版的窗口,对应发行版的STATE即变成Running,想要关闭则输入指令exit即可退出,对应系统恢复Stopped状态(不是立刻,得等一会才行)
1
wsl -d xxxxxx
  • 也可以输入以下指令关闭对应的子系统
1
wsl --shutdown xxxxxx
  • 可以使用如下图的UI界面的按钮(只有以非管理员权限打开cmd或者PowerShell才会有如图所示的UI,管理员权限的话打开是没有这个按钮的)进入对应Linux发行版的命令行窗口,将窗口关闭则恢复Stopped状态

PowerShell打开WSL的系统.png

  • 如果unregister了某个发行版后上面所示的UI界面还会有这些图标的残留,并且点击的话还会进入并提示正在安装,解决方法是进入如上图所示的UI界面的设置选项,里面拉到最下面可以看到对应的Linux发行版的图标,点进去删除然后保存即可除去这玩意儿

2.4 从网络获取发行版

微软提供了一个手动下载WSL发行版的网址

  • 选择想要的发行版下载后,可以得到一个后缀名为.appx的文件,把它的后缀改为.zip,然后解压到想要安装WSL的目录下
  • 解压后文件夹得到一个.exe文件,双击运行
  • 需要注意的是:安装目录的磁盘不能开压缩内容以便节省磁盘空间选项,否则会报错,可以右键文件夹–>属性–>常规–>高级找到并关闭这个选项
  • 安装成功后 文件夹下多一个.vhdx镜像,即为安装的位置,Linux产生的文件默认在刚刚自定义选择的路径下(如果是WSL1的话,其安装位置下的rootfs文件夹用于子系统里的全部文件,WSL2的话都是存放于.vhdx文件内)

2.5 卸载指定的Linux发行版

  • 在Windows命令行中使用如下指令可以卸载某Linux子系统
1
wsl --unregister xxxxxx

2.6 备份与恢复

  • 使用如下指令可以对某Linux子系统进行备份,xxx.tar代表导出备份到我们Windows中的压缩包的名称,这个文件会被导出存放到你输入这个命令时命令行所在的路径位置,如平常我们直接打开命令行的位置C:/User/username/
1
wsl --export xxxxxx xxx.tar
  • 使用如下命令可以将压缩包所备份的Linux子系统导入Windows某盘下的某路径处,其中your_sys_name表示你为这个系统起的名字,后面两个路径第一个表示用于存放该系统的位置,第二个是你要导入的系统压缩包的路径
1
wsl --import your_sys_name X:/aim_dir Y:/tar_dir/xxx.tar
  • 导入成功后你会发现目标路径下显示的是一个.vhdx后缀的HyperV的镜像文件,关于导入的Linux子系统的一切文件皆在此处

三、文件共享

3.1 在Linux查看Windows的文件

  • 在一个Ubuntu系统内使用以下指令,可以显示该系统所有挂载卷
1
df -h
  • 结果如图所示,可以看到我们的Windows的三个盘直接作为目录被挂载在了此处

指令df-h显示挂载的Windows.png

  • 这种使用挂载卷进行文件互通的方式的IO性能较弱,如果需要涉及较大量的IO操作的话,最好直接将需要用到的内容拷贝到Linux子系统内

3.2 在Windows查看Linux的文件

  • 我们安装好任意一个Linux子系统后会发现我们的资源管理器多出了一个目录,如下图所示是其中一个子系统,其文件都在此处展示了出来

文件资源管理器中的Linux文件夹.png

3.3 命令混用

不建议依赖于这样的混用,容易形成不好的习惯,但在特殊的场景下可以使得问题的解决更方便

  • WSL让我们可以在Linux系统命令行里使用某些Windows命令行的指令,比如通过以下命令调出记事本来打开Linux目录下的xxx.txt文件
1
notepad.exe xxx.txt
  • 也可以在Linux中调出文件资源管理器,如下面的指令(后面的.表示当前目录)就可以以文件资源管理器的方式调出当前Linux路径
1
explorer.exe .
  • 我们也可以在Windows中使用部分Linux指令,比如在PowerShell中(cmd无此指令)使用下列指令可以显示当前目录的所有文件
1
Get-ChildItem

Get-ChildItem指令.png

  • 如果我想对这些文件进行过滤筛选但不知道如何在Windows上写,但是我直到在Linux可以用grep过滤,我也可以在WSL的帮助下混用此指令,管道操作符|后跟着的是Linux的指令
1
Get-ChildItem | wsp grep ".gitignore" . -r -n

在PowerShell中利用WSL使用Linux指令.png

四、DNS修改

此处基于Windows11系统操作

  • Win + I快捷键打开设置,在左侧菜单栏找到“网络和Internet”
  • 点击高级网络设置,选中当前使用的网络

网络的查看其它属性.png

  • 此时一种方式是我们可以点击”查看其它属性”下方的”更多适配器选项“后,如下图所示对IPv4或者IPv6进行DNS配置

更多适配器选项的设置.png

更多适配器选项中的IPv4DNS设置.png

  • 另一种方式是在前一步的基础上点击”查看其它属性”,点击”DNS服务器分配”的编辑选项,选择”手动”方式进行设置

打开其它属性中DNS的编辑.png

  • 然后我们可以对IPv4和IPv6进行设置,一般设置IPv4即可,将你选择的DNS地址输入首选DNS栏目即可,也可以设置备用DNS

设置IPv4DNS.png

本文由作者按照 CC BY-NC-SA 4.0 进行授权