admin管理员组

文章数量:1536400

wsl(windows子系统)简要介绍和安装步骤

author:onceday date:2022年6月2日

文章目录

        • wsl(windows子系统)简要介绍和安装步骤
        • 1.简要介绍
        • 2.WSL安装
          • 2.1 自动安装命令
          • 2.2 手动安装步骤
          • 2.3 设置WSL的默认版本
          • 2.4 安装linux分发
          • 2.5 在windows server上安装
        • 3. WSL安装实践教程
          • 3.1 从WSL1切换到WSL2
        • 4.WSL基本操作命令
        • 5.限制WSL2的内存使用
        • 6.迁移备份WSL2的子系统
          • 6.1 查看全部子系统
          • 6.2 关闭子系统
          • 6.3 导出(备份)子系统
          • 6.4 注销原有的`ubuntu-20.04`子系统
          • 6.5 导入备份的`ubuntu-20.04`子系统
          • 6.6 设置默认用户名
          • 6.7 docker connect failed问题
        • 7. 代理网络配置
          • 7.1 WSL1使用Nat转换,私有网络
          • 7.2 WSL2暴露虚拟机网络
          • 7.3 使用代理
          • 7.4 代理网络不起作用
          • 7.5 解开Windows防火墙限制
        • 注:本内容收集整理于互联网,仅供学习交流之用!

1.简要介绍

详情参考官方文档:适用于 Linux 的 Windows 子系统文档 | Microsoft Docs

安装详细可参考:升级Windows中Linux子系统WSL1到WSL2 | Knner.Wang’s Blog

提供linux系统环境,减少传统虚拟机或者双启动的设置开销。

可用功能如下:

  • 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
  • 运行常用的命令行软件工具(例如 grepsedawk)或其他 ELF-64 二进制文件。
  • 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序,包括:
    • 工具:vim、emacs、tmux
    • 语言:NodeJS、Javascript、Python、Ruby、C/C++、C# 与 F#、Rust、Go 等
    • 服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。
  • 使用自己的 GNU/Linux 分发包管理器安装其他软件。
  • 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
  • 在 Windows 上调用 GNU/Linux 应用程序。

wsl1和wsl2的性能比对:

功能WSL 1WSL 2
Windows 和 Linux 之间的集成
启动时间短
与传统虚拟机相比,占用的资源量少
可以与当前版本的 VMware 和 VirtualBox 一起运行
托管 VM
完整的 Linux 内核
完全的系统调用兼容性
跨 OS 文件系统的性能

WSL 2 仅适用于 Windows 10 版本 1903、内部版本 18362 或更高版本。

通过按 Windows 徽标键 + R,检查 Windows 版本,然后键入 winver,选择“确定”。

WSL 2 也适用于 VMware 15.5.5+ 和 VirtualBox 6+。

WSL 2 Linux 内核是开源的。 可查看由构建该内核的团队撰写的博客文章随 Windows 一起提供 Linux 内核。

但目前存在以下问题:

  • WSL 2 不支持访问串行端口。
  • WSL 2 的跨os文件性能较弱
  • WSL 2 的内存使用量会随使用而缩放。 如果有长时间运行的 WSL 会话或访问非常大量的文件,此缓存可能会耗尽 Windows 内存。
2.WSL安装

参考官方文档:安装 WSL | Microsoft Docs

2.1 自动安装命令
wsl --install

请注意,如果已安装wsl,那么上述命令将弹出一个帮助文档:

PS C:\WINDOWS\system32> wsl --install
版权所有(c) Microsoft Corporation。保留所有权利。

用法: wsl.exe [Argument] [Options...] [CommandLine]

运行 Linux 二进制文件的参数:

    如果未提供命令行,wsl.exe 将启动默认 shell。

    --exec, -e <CommandLine>
        在不使用默认 Linux Shell 的情况下执行指定的命令。

    --
        按原样传递其余命令行。
.............省略很多行.............

此时需要使用旧版本的WSL安装步骤(直接跳到下文—手动安装WSL):安装 WSL | Microsoft Docs

在未安装WSL的机器上,该命令可完成自动安装的全部过程:

  • 启动所需的windows组件和功能
  • 下载最新的linux内核
  • 将WSL2设置为默认值
  • 安装LIunx发行版-----Ubuntu。

可通过以下命令安装指定的linux发行版:

  1. 先获取可用的linux发行版列表

    wsl --list --online
    以下是可安装的有效分发的列表。
    请使用“wsl --install -d <分发>”安装。
    
    NAME            FRIENDLY NAME
    Ubuntu          Ubuntu
    Debian          Debian GNU/Linux
    kali-linux      Kali Linux Rolling
    openSUSE-42     openSUSE Leap 42
    SLES-12         SUSE Linux Enterprise Server v12
    Ubuntu-16.04    Ubuntu 16.04 LTS
    Ubuntu-18.04    Ubuntu 18.04 LTS
    Ubuntu-20.04    Ubuntu 20.04 LTS
    
  2. 指定安装的linux发行版名称

    wsl --install -d <Distribution Name> #<Distribution Name>是发行版的名称
    wsl --install -d Ubuntu-20.04
    
2.2 手动安装步骤

参阅官方文档:旧版 WSL 的手动安装步骤 | Microsoft Docs

1.首先启动适用于Linux的Windows子系统(管理员启动powershell)

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

2.检查版本号

  • 对于 x64 系统:版本 1903 或更高版本,采用内部版本 18362 或更高版本。
  • 对于 ARM64 系统:版本 2004 或更高版本,采用内部版本 19041 或更高版本。
  • 低于 18362 的版本不支持 WSL 2。 使用 Windows Update 助手更新 Windows 版本。

3.启动虚拟机功能

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

之后重启计算机,以完成更新安装! 这些也可以图形化操作完成:

控制面板,找到程序,点击进去,选择启用或者关闭Windows功能,里面即可打开上述两种功能。

5.下载Linux内核更新包

  • 适用于 x64 计算机的 WSL2 Linux 内核更新包

可使用systeminfo命令查看处理器信息:

系统类型:         x64-based PC
处理器:           安装了 1 个处理器。
                  [01]: Intel64 Family 6 Model 158 Stepping 10 GenuineIntel ~3696 Mhz

如果使用的是 ARM64 计算机,请下载 ARM64 包。

下载完这些更新包,直接安装即可!

2.3 设置WSL的默认版本
wsl --set-default-version 2
2.4 安装linux分发

可以直接打开Microsoft Store,pc上都预安装了这个软件。

2.5 在windows server上安装

参考文档:在 Windows Server 上安装 Linux 子系统 | Microsoft Docs

3. WSL安装实践教程

官方文档地址:设置 WSL 开发环境 | Microsoft Docs

VS code配套开发入门教程:开始通过 WSL 使用 VS Code | Microsoft Docs

3.1 从WSL1切换到WSL2

如果已安装了windows子系统,那么可以在powershell里面输入以下命令观察当前的版本情况。

PS C:\WINDOWS\system32> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

如果显示的版本号是1,那么需要按一下步骤来升级:

  1. 首先安装内核,即本文2.2节里提到的下载内核步骤

    参阅官方文档:旧版 WSL 的手动安装步骤 | Microsoft Docs

    参阅博客文档:升级Windows中Linux子系统WSL1到WSL2 | Knner.Wang’s Blog

  2. 设置默认版本

    C:\Users\admin>wsl --set-default-version 2
    WSL 2 需要更新其内核组件。有关信息,请访问 https://aka.ms/wsl2kernel
    
  3. 设置当前linux分发版的版本

    wsl --set-version Ubuntu 2
    正在进行转换,这可能需要几分钟时间...
    有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
    转换完成。
    

    这里需要注意:如果这里直接跳过几分钟的过程,直接弹出下一行命令行,并且 “转换完成” 变成 “提示要更新linux的内核”,那么需要执行步骤1安装内核。

    Ubuntu 是安装的linux分发版的名称,可使用wsl -l -v列出当前可用linux版本,然后填入它们的名字。

  4. 完成以上步骤,输入以下指令观察是否成功:

    C:\Users\admin>wsl -l -v
      NAME      STATE           VERSION
    * Ubuntu    Stopped         2
    

    如果成功了,则版本号会显示2,如果还是为1,则可能是内核未更新!

4.WSL基本操作命令

参阅官方文档:WSL 的基本命令 | Microsoft Docs

5.限制WSL2的内存使用

C:\Users\54041里面新建文本文件.wslconfig54041是用户名,然后里面填入以下内容,更多内容参阅官方文档:Advanced settings configuration in WSL | Microsoft Docs

[wsl2]
processors=8
memory=8GB
swap=8GB
localhostForwarding=true

修改完成之后需要重启wsl2才能生效,关闭正在运行的实例

wsl --shutdown

然后重新打开即可!

6.迁移备份WSL2的子系统

默认的wsl2会把Linux子系统虚拟磁盘文件放在C盘下 ,如果在wsl2里面安装了太多的程序,可能空间占用会很大。

有一种简单的方法是使用LxRunOffline工具迁移。但是这里不介绍,直接用wsl命令来实现。

参考文档:

  • Windows WSL2 移动 适用于 Linux 的 Windows 子系统_深色風信子的博客-CSDN博客_移动 windows子系统
6.1 查看全部子系统

需要以管理员权限运行powershell

PS C:\Users\cg> wsl --list --all --v
* Ubuntu-20.04           Running         2
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

如果子系统正在运行,需要关闭它。

6.2 关闭子系统

如下两个命令皆可:

PS C:\Users\cg> wsl --terminate Ubuntu-20.04
PS C:\Users\cg> wsl --shutdown

然后再确认一遍是否关闭准备迁移的子系统

PS C:\Users\cg> wsl --list --all --v
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  Ubuntu-20.04           Stopped         2
  docker-desktop-data    Stopped         2
6.3 导出(备份)子系统

这里准备备份的子系统是ubuntu-20.04,使用下面命令即可。

备份的目的路径是E:\Ubuntu-20.04.tar,路径和名字取自己希望值即可。

PS C:\Users\cg> wsl --export Ubuntu-20.04 E:\Ubuntu-20.04.tar

这个过程需要等待一段时间,如果原有的子系统内容很多,那么可能要等待10+分钟

6.4 注销原有的ubuntu-20.04子系统
PS C:\Users\cg> wsl --unregister Ubuntu-20.04
PS C:\Users\cg> wsl --list --all --v
  NAME                   STATE           VERSION
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

注销完之后,再看列表中的子系统,已经没有ubuntu-20.04了。

6.5 导入备份的ubuntu-20.04子系统

上面的导出过程本质上也是给ubuntu-20.04做了一个备份,里面存储了全部内容。

因此这里实际上在导入一个备份。

首先确定目的文件夹,如果目录不存在,需要手动创建。这里目的目录为E:\ubuntu\。然后该子系统的虚拟磁盘文件就会放在此目录下。

PS C:\Users\cg> wsl --import Ubuntu-20.04 E:\ubuntu\ E:\Ubuntu-20.04.tar --version 2
PS C:\Users\cg> wsl --list --all --v
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  Ubuntu-20.04           Stopped         2
  docker-desktop-data    Stopped         2

导入过程比较快,然后便可以看到刚刚导入的子系统了。

如果版本号不对,可以使用下面命令重设版本号。

PS C:\Users\cg> wsl --set-version Ubuntu-20.04 2
正在进行转换,这可能需要几分钟时间...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
该分发已是请求的版本。
6.6 设置默认用户名

如果不设置默认用户名,那么登入wsl2的ubuntu-22.04时,默认以root用户登入。

一般之间都是默认都不是由root用户登入,所以可以使用下面命令设置默认登入用户。

ubuntu.exe config --default-user <username>

对于ubuntu-22.04,上面命令改写为:

ubuntu2004.exe config --default-user "onceday"

其中“onceday"也要用你自己的username代替

6.7 docker connect failed问题

迁移子系统后,要重启docker desktop应用,此时可能会出现下面问题。

onceday@ubuntu:~$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

docker确实启动了,但是此时无法连接上docker-server

这个时候需要在docker-desktop->setting->Resources->WSL INTEGRATION-里面Enable integration with additional distros:中使能Ubuntu-20.04.

7. 代理网络配置
7.1 WSL1使用Nat转换,私有网络

Windows Subsystem for Linux (WSL) 是一个在 Windows 10 和 Windows Server 2019 上运行 Linux 二进制可执行文件的兼容性层。在 WSL 中,Linux 环境可以访问主机 Windows 系统的网络,但默认情况下,Windows 主机或外部系统不能主动访问 WSL 内部的网络服务。

这是因为 WSL 使用的网络类型是 NAT(网络地址转换),这意味着其 IP 地址是私有的,不直接暴露给外部网络。然而,有一些方法可以使 Windows 或其他外部系统能够连接到 WSL 中的服务。

一种方法是在 Windows 中设置端口转发规则,将请求从 Windows 转发到 WSL。例如,假设你在 WSL 中运行一个在端口 8080 上监听的 web 服务器,你可以使用如下的 netsh 命令在 Windows 中设置端口转发:

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=127.0.0.1

这条命令将 Windows 上的所有到 8080 端口的连接请求都转发到 WSL 的同一端口。

另一种方法是使用 WSL 2,它使用的是虚拟网络,而不是 NAT。在 WSL 2 中,Linux 环境和 Windows 主机在同一虚拟网络中,因此它们可以直接相互通信。

总的来说,虽然默认情况下不能从外部主动访问 WSL 内部的网络服务,但通过设置端口转发或使用 WSL 2,可以实现这一目标。

7.2 WSL2暴露虚拟机网络

WSL 2 使用的是虚拟化技术,所以它有自己的 IP 地址,并且在一个不同的网络子网上。这意味着 Windows 主机和 WSL 2 实例可以看到对方,但 WSL 2 的网络服务默认情况下不对外部暴露。

为了让 Windows 主机或外部系统能够连接到 WSL 2 实例中的服务,你可以采取以下步骤:

  1. 获取 WSL 2 实例的 IP 地址

在 WSL 2 环境中运行 ip addr 命令,查看你的 IP 地址。它通常显示在第二个条目,类似于 inet 172.x.x.x/20 brd 172.x.x.x scope global eth0 中的 172.x.x.x

  1. 在 Windows 中创建防火墙规则

有时,你可能需要在 Windows 防火墙中创建一个新规则,以允许连接到 WSL 2。你可以在 Windows 防火墙中创建一个新的入站规则,允许连接到你的 WSL 2 IP 地址和端口。

  1. 在客户端指定 WSL 2 IP 地址和端口

在你的 Windows 主机或其他客户端系统中,你应该能够使用你在步骤 1 中找到的 IP 地址和你的服务端口连接到 WSL 2 中的服务。

然而,需要注意的是,每次 WSL 2 启动时,其 IP 地址可能会改变。你可能需要创建一个脚本或使用其他方法来自动更新这些 IP 地址。你也可以考虑使用第三方工具,如 WSL Utilities (wslu),这是一套实用程序,用于帮助在 WSL 中进行一些任务,如获取 WSL IP 地址等。

7.3 使用代理

如果在 Windows 主机上设置了代理服务器,但在 WSL 2 中无法使用,你可以尝试以下方法来在 WSL 2 中手动设置代理。

首先,你需要知道代理服务器的地址和端口。这些信息通常可以在 Windows 的网络设置中找到,也可能由你的网络管理员提供。

在得到这些信息后,你可以在 WSL 2 中的 shell 配置文件中设置 http_proxyhttps_proxy 环境变量。你可以选择把它们添加到 ~/.bashrc(如果你正在使用 bash),或者 ~/.zshrc(如果你正在使用 zsh)。

以下是如何在 bash 或 zsh 中设置这些环境变量的示例:

echo "export http_proxy=http://proxyserver:port" >> ~/.bashrc
echo "export https_proxy=https://proxyserver:port" >> ~/.bashrc

替换 proxyserver:port 为你的代理服务器的地址和端口。然后,运行 source ~/.bashrc(或 source ~/.zshrc)使更改生效。现在,你在 WSL 2 中运行的命令应该能够使用代理服务器了。

注意,这些环境变量会影响大多数命令行程序的网络连接,包括 curlwgetgit,但不会影响所有程序。某些程序可能需要你在它们自己的配置中设置代理。

此外,这些设置仅影响当前用户。如果有其他用户需要使用代理,他们需要在自己的 shell 配置文件中进行相同的设置。

如果你需要取消代理设置,只需删除 ~/.bashrc~/.zshrc 中的相应行,然后重新加载配置文件即可。

7.4 代理网络不起作用
  • WSL2 的一些网络访问问题 - 野声 (cat.ms)

在某些情况下,由于 WSL 2 使用了与 Windows 不同的网络堆栈,它可能无法直接使用在 Windows 上设置的代理。这可能是由于许多代理客户端默认只监听 localhost(127.0.0.1)或者特定的 IP 地址,而 WSL 2 由于它的网络堆栈的设计,被赋予了一个不同的 IP 地址。

为了解决这个问题,你需要确保你的代理客户端被配置为监听所有的网络接口,或至少包括 WSL 2 的 IP 地址。

如果你使用的是像 Fiddler 或 Charles 这样的 HTTP/HTTPS 代理,你可能需要在其设置中明确允许远程计算机的连接。例如,在 Fiddler 中,你可以在 Tools > Fiddler Options > Connections 中勾选 “Allow remote computers to connect” 选项。然后,你需要重启 Fiddler 以使更改生效。

然后,在 WSL 2 中,你需要将代理环境变量设置为代理服务器的 IP 地址,而不是 localhost 或 127.0.0.1。你可以使用以下命令来进行设置:

export http_proxy=http://windows.ip.address:port
export https_proxy=http://windows.ip.address:port

其中 windows.ip.address 需要被替换为你的 Windows 主机的实际 IP 地址,port 需要被替换为你的代理服务器正在监听的端口。

这样,WSL 2 中的网络连接应该能够通过代理了。记住,每次你打开一个新的 WSL 2 终端,你都需要重新设置这些环境变量,除非你把它们添加到了你的 shell 配置文件(如 ~/.bashrc~/.zshrc)中。

7.5 解开Windows防火墙限制
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL (Hyper-V firewall))" -Action Allow 

这个 PowerShell 命令创建了一个新的入站防火墙规则,允许所有进入 “vEthernet (WSL)” 接口的流量。这个规则应用于运行在 Windows Subsystem for Linux (WSL) 上的所有网络连接。

以下是这个命令各部分的解释:

  • New-NetFirewallRule 是创建新防火墙规则的 PowerShell 命令。

  • -DisplayName "WSL" 设置了这个规则的显示名为 “WSL”。

  • -Direction Inbound 设置了这个规则应用于入站(进入计算机的)网络连接。

  • -InterfaceAlias "vEthernet (WSL)" 设置了这个规则应用于名为 “vEthernet (WSL)” 的网络接口。这是 WSL 的默认虚拟网络接口。

  • -Action Allow 设置了这个规则的动作为允许连接。

在 Windows 防火墙的图形界面中,这个规则对应的设置如下:

  1. 规则类型:自定义规则。

  2. 程序:全部。

  3. 协议和端口:任何协议,任何端口。

  4. 范围:任何 IP 地址。

  5. 操作:允许连接。

  6. 配置文件:所有(域、私有、公用)。

  7. 名称:“WSL”。

  8. 接口类型:特定接口 “vEthernet (WSL)”。

请注意,这个规则可能会使你的计算机暴露于潜在的网络威胁,因为它允许所有进入 “vEthernet (WSL)” 接口的流量,而不仅仅是你想要允许的特定流量。为了安全,你应该尽可能地限制规则的范围,例如只允许来自特定 IP 地址或端口的流量,或者只允许特定的程序或服务。

注:本内容收集整理于互联网,仅供学习交流之用!

本文标签: 子系统简要步骤WSLWindows