快速开始
# 查看WSL版本
>wsl --version
#查看分发版本列表
> wsl --list
适用于 Linux 的 Windows 子系统分发:
Debian (默认)
docker-desktop-data
docker-desktop
# 运行默认的 Linux 发行版(debian),进入WSL命令行
>wsl --user brian
什么是WSL
WSL (Windows Subsystem for Linux)
当点击设置->应用->更多windows功能弹出的对话框中,有一个适用于 Linux 的 Windows 子系统。这就是WSL,它是什么呢?让我们来看看微软官网的解释:
WLS适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
有两个版本:WSL 1 或 WSL 2 。
推荐使用WSL 2. WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。这一新的体系结构改变了这些 Linux 二进制文件与Windows 和计算机硬件进行交互的方式,但仍然提供与 WSL 1(当前广泛可用的版本)中相同的用户体验。
WSL安装
必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用以下命令。 如果使用的是更早的版本,请参阅手动安装页。
在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl --install 命令,然后重启计算机。 --install 命令执行以下操作:
- 启用可选的 WSL 和虚拟机平台组件
- 下载并安装最新 Linux 内核
- 将 WSL 2 设置为默认值
- 下载并安装 Ubuntu Linux 发行版(默认是Ubuntu,可能需要重新启动)
# 查看可通过在线商店下载的可用 Linux 发行版列表
>wsl --list --online
以下是可安装的有效分发的列表。
使默认分发用 “*” 表示。
使用 'wsl --install -d <Distro>' 安装。
NAME FRIENDLY NAME
* Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
openSUSE-Leap-15.5 openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4 SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-Server-15-SP5 SUSE Linux Enterprise Server 15 SP5
openSUSE-Tumbleweed openSUSE Tumbleweed
# 默认启用WSL并安装Linux 分发版为 Ubuntu
>wsl --install
# 如果不想使用Ubuntu,可以使用 -d 标志进行更改默认分发版;后续安装其他发行版也是该命令。
>wsl --install -d <Distribution Name>
> wsl --install -d Debian
无法与服务器建立连接
> wsl --install -d Debian
正在安装: 虚拟机平台
已安装 虚拟机平台。
正在安装: 适用于 Linux 的 Windows 子系统
已安装 适用于 Linux 的 Windows 子系统。
正在安装: Debian GNU/Linux
已安装 Debian GNU/Linux。
请求的操作成功。直到重新启动系统前更改将不会生效。
# 重启后再次运行该命令
PS C:\windows\system32> wsl --install -d Debian
Debian GNU/Linux 已安装。
正在启动 Debian GNU/Linux...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: brian
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
首次启动新安装的 Linux 发行版时,将打开一个控制台窗口,要求你等待将文件解压缩并存储到计算机上。 未来的所有启动时间应不到一秒。
WSL常用命令
通过 WSL 安装的 Linux 发行版最好使用 PowerShell 或 Windows 命令提示符 (CMD) 进行管理。 有关使用 WSL 时需要熟悉的基本命令的列表,请参阅 WSL 命令参考指南。
# 列出已安装的 Linux 发行版 wsl --list, -l [Options], 取值为all, running, quiet, verbose
# 显示所有分发的相关详细信息。
>wsl --list --verbose
NAME STATE VERSION
* Debian Running 2
# 仅列出目前正在运行的分发。
>wsl --list --running
适用于 Linux 的 Windows 子系统分发:
Debian (默认)
# 运行特定的 Linux 发行版
>wsl --distribution <Distribution Name> --user <User Name>
>wsl --distribution Debian --user brian
# 此时PowerShell终端会进入linux
brian@brianomen:~$ pwd
/home/brian
# 将分发设置为默认分发。
>wsl --set-default, -s <Distro>
>wsl --set-default Debian
操作成功完成。
# 立即终止所有正在运行的发行版和 WSL 2 轻量级实用工具虚拟机。
>wsl --shutdown
# 此时,PowerShell终端会变回windows
PS C:\windows\system32> pwd
Path
----
C:\windows\system32
# 运行默认的 Linux 发行版 wsl --user <Username>
>wsl --user brian
# Windows Terminal会变为Linux终端
brian@brianomen:/mnt/c/Users/lhs_3$ pwd
/mnt/c/Users/lhs_3
# 导入和导出发行版
>wsl --export <Distribution Name> <FileName>
>wsl --import <Distribution Name> <InstallLocation> <FileName>
# 若要终止指定的发行版或阻止其运行
>wsl --terminate <Distribution Name>
# 注销并卸载 WSL 发行版:
>wsl --unregister <DistributionName>
# 装载磁盘或设备
>wsl --mount <DiskPath>
>wsl --unmount <DiskPath>
# 查看wsl版本
>wsl --version
WSL 版本: 1.2.5.0
内核版本: 5.15.90.1
WSLg 版本: 1.0.51
MSRDC 版本: 1.2.3770
Direct3D 版本: 1.608.2-61064218
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22621.1848
# 更新WSL(适用于 Linux 的 Windows 子系统程序包)。
>wsl --update
# 显示WSL的状态。
>wsl --status
默认分发: Debian
默认版本: 2
当前计算机配置不支持 WSL1。
若要使用 WSL1,请启用“Windows Subsystem for Linux”可选组件。
# 更多命令(仅保留常用命令):
>wsl --help
用法: wsl.exe [Argument] [Options...] [CommandLine]
管理WSL磁盘空间
WSL 2使用虚拟化平台将 Linux 分发版与主机 Windows 操作系统一起安装,创建虚拟硬盘 (VHD) 来存储安装的每个 Linux 发行版的文件。 这些 VHD 使用 ext4 文件系统类型 ,并在 Windows 硬盘驱动器上表示为 ext4.vhdx 文件。
WSL 2 会自动调整这些 VHD 文件的大小以满足存储需求。 默认情况下,WSL 2分配了 1TB 的最大磁盘空间量。
# 检查可用磁盘空间 wsl --system -d <distribution-name> df -h /mnt/wslg/distro 或 wsl df -h /
> wsl --system -d Debian df -h /mnt/wslg/distro
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 1007G 277M 956G 1% /mnt/wslg/distro
> wsl df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 1007G 277M 956G 1% /
# 如何查找 Linux 分发版的 .vhdx 文件和磁盘路径
```shell
> (Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<Debian>' }).GetValue("BasePath") + "\ext4.vhdx"
不能对 Null 值表达式调用方法。
所在位置 行:1 字符: 1
+ (Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [],RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
# 手工查找 或者使用Everything搜索` ext4.vhdx `
C:\Users\lhs_3\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\ext4.vhdx
跨 Windows 和 Linux 文件系统工作
建议不要跨操作系统使用文件,除非有这么做的特定原因。
若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,前提是在 Linux 命令行(Ubuntu、OpenSUSE 等)中工作。
如果使用 Windows 命令行(PowerShell、命令提示符)工作,请将文件存储在 Windows 文件系统中。
例如,在存储 WSL 项目文件时:
使用 Linux 文件系统根目录:\\wsl$\Ubuntu\home\<user name>\Project
而不使用 Windows 文件系统根目录:/mnt/c/Users/<user name>/Project$
或 C:\Users\<user name>\Project
在 WSL 命令行的文件路径中看到 /mnt/
时,表示你正在使用已装载的驱动器。 因此,Windows 文件系统 C:/
驱动器 (C:\Users\<user name>\Project
) 在 WSL 命令行中装载时将如下所示:/mnt/c/Users/<user name>/Project$
。 你可以将项目文件存储在装载的驱动器上,但如果将其直接存储在 \\wsl$
驱动器上,性能速度会提高。
从 Linux 访问 Windows 文件
从 Linux 访问 Windows 驱动器文件系统 (DrvFS) 中的文件,一般是通过 /mnt/c
。文件权限是根据 Windows 权限计算的,或者是从已由 WSL 添加到文件的元数据中读取的。 默认情况下,此元数据处于未启用状态。
具体参考这里 。
使用\\wsl$
从Windows中访问Linux文件
若要在 Windows 文件资源管理器中查看所有可用的 Linux 发行版及其根文件系统,请在地址栏中输入:\\wsl$
,这里可以查看所有的Linux发行版。选择其中一个如Debian
,打开就进入该发行版的根目录 /
。 它本质上是一种网络计算机访问形式。
在地址栏直接输入powershell
进入Windows PowerShell命令行, 可以在命令行终端通过网络访问方式查看分发版中的文件。
通过 \wsl$ 访问 Linux 文件时将使用 WSL 分发版的默认用户。 因此,任何访问 Linux 文件的 Windows 应用都具有与默认用户相同的权限。
# 进入PowerShell命令行:`PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Debian`
# 查看当前目录: 确为Debian系统的根目录
PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Debian> wsl pwd
/
# 切换到用户目录
PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Debian> cd \\wsl$\Debian\home\brian
# 列出用户目录的文件
PS Microsoft.PowerShell.Core\FileSystem::\\wsl$\Debian\home\brian> ls
目录: \\wsl$\Debian\home\brian
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 2023/6/30 14:25 807 .profile
------ 2023/6/30 14:25 220 .bash_logout
------ 2023/6/30 14:25 3526 .bashrc
借助 WSL,Windows 和 Linux 工具和命令可互换使用。
- 从 Linux 命令行(即 Ubuntu)运行 Windows 工具(即 notepad.exe)。
- 从 Windows 命令行(即 PowerShell)运行 Linux 工具(即 grep)。
- 在 Windows 与 Windows 之间共享环境变量。 (版本 17063+)
从 Windows 命令行运行 Linux 工具
打开 Windows 命令提示符 (CMD) 或 PowerShell ,可以通过使用 wsl <command>
即 wsl + Linux命令
的方式直接使用linux命令行或 Linux 二进制文件。
注意下面示例中Linux的ls命令和windows的dir命令输出的目录列表描述字符串的差异。
# 切换windows目录(使用windows终端命令)
>cd c:\Users
# 查看目录内容(使用windows终端命令)
c:\Users>dir
驱动器 C 中的卷是 Windows
卷的序列号是 EAEB-9726
c:\Users 的目录
2023/05/29 07:36 <DIR> .
2023/06/20 20:13 <DIR> lhs_3
2023/06/01 15:54 <DIR> Public
0 个文件 0 字节
3 个目录 1,879,334,477,824 可用字节
# 查看目录内容(使用wsl + linux命令)
c:\Users>wsl ls -la
total 0
dr-xr-xr-x 1 brian brian 4096 May 29 07:36 .
drwxrwxrwx 1 brian brian 4096 Jun 29 11:06 ..
lrwxrwxrwx 1 brian brian 18 May 7 2022 'All Users' -> /mnt/c/ProgramData
dr-xr-xr-x 1 brian brian 4096 Jun 4 20:40 Default
lrwxrwxrwx 1 brian brian 20 May 7 2022 'Default User' -> /mnt/c/Users/Default
-r-xr-xr-x 1 brian brian 174 May 7 2022 desktop.ini
drwxrwxrwx 1 brian brian 4096 Jun 20 20:13 lhs_3
drwxrwxrwx 1 brian brian 4096 Jun 1 15:54 Public
# 查看当前目录地址(使用windows终端命令)
c:\Users>>chdir 或者>echo %cd%
c:\Users
# 查看当前目录地址(使用wsl + linux命令)
c:\Users>wsl pwd
/mnt/c/Users
PS中混合 Linux 和 Windows 命令
下面是几个使用 PowerShell 混合 Linux 和 Windows 命令的示例。
注意:在PowerShell 命令行终端和Windows命令行终端,都可以采用这种方式运行。注意linux的ls命令和windows的dir命令显示方式的不同。
# 先使用WSL+Linux命令,管道传递,再使用PowerShell命令
>wsl ls -la |findstr "desktop"
-r-xr-xr-x 1 brian brian 174 May 7 2022 desktop.ini
# 先使用WSL+Linux命令,管道传递,再使用WSL+Linux命令
>wsl ls -la |wsl grep "desktop"
-r-xr-xr-x 1 brian brian 174 May 7 2022 desktop.ini
# 先使用PowerShell命令,管道传递,再使用WSL+Linux命令
>dir /a | wsl grep "desktop"
2022/05/07 13:22 174 desktop.ini
# 使用 Linux 命令 ls -la 列出文件,并使用 PowerShell 命令 > out.txt 将该列表输出到名为“out.txt”的文本文件
>C:\temp> wsl ls -la > out.txt
# 列出 /proc/cpuinfo Linux 文件系统路径中的文件(文件路径必须以 WSL 格式或linux方式指定)
>C:\temp> wsl ls -la /proc/cpuinfo
# 先使用PowerShell命令,管道传递,再使用WSL+Linux命令,再管道+WSL+Linux
> ipconfig.exe |wsl grep IPv4 |wsl cut -d: -f2
192.168.2.197
xxx.27.16.1
从 WSL 命令行运行 Windows 工具
以这种方式运行的Windows 工具应用程序具有以下属性:
- 按 WSL 命令提示保留工作目录(大部分情况下是这样 -- 下面所述的情况除外)。
- 拥有与 WSL 进程相同的权限。
- 以活动 Windows 用户的身份运行。
- 显示在 Windows 任务管理器中,就如同直接从 CMD 提示符执行的一样。
在 WSL 中运行的 Windows 可执行文件的处理方式类似于本机 Linux 可执行文件 - 管道处理、重定向,甚至后台处理都可按预期方式工作。
# 运行默认的 Linux 发行版,进入WSL命令行
C:\Users\lhs_3>wsl --user brian
# 在WSL命令行中(即Linux发行版中)查看当前目录
brian@brianomen:/mnt/c/Users/lhs_3$ pwd
/mnt/c/Users/lhs_3
# 切换到Linux发行版的用户目录
brian@brianomen:/mnt/c/Users/lhs_3$ cd /home/brian
brian@brianomen:~$ ls -a
. .. .bash_logout .bashrc .profile
# 直接从 WSL 命令行运行 Windows 工具,参数将按原样传递到 Windows 二进制文件
brian@brianomen:~$ notepad.exe .bashrc
# 使用Linux 命令 ls -la 列出文件,管道传递,使用 PowerShell 工具 findstr.exe 来筛选结果
~$ ls -la | findstr.exe .bash
-rw-r--r-- 1 brian brian 220 Jun 30 14:25 .bash_logout
-rw-r--r-- 1 brian brian 3526 Jun 30 14:25 .bashrc
# 在WSL中使用Windows的 ping 命令
$ ping.exe www.microsoft.com
# 显示当前 TCP/IP 网络配置值,然后通过 Linux 工具 grep 被筛选为仅 IPv4 结果
~$ ipconfig.exe | grep IPv4 | cut -d: -f2
grep: (standard input): binary file matches
# grep添加--text参数或-a参数,等价于 --binary-files=text 详见grep帮助
~$ ipconfig.exe | grep --text IPv4 | cut -d: -f2
192.168.2.197
xxx.27.16.1
WSL 与网络
TODO
参考资料:
https://learn.microsoft.com/zh-cn/windows/wsl/networking
https://zhuanlan.zhihu.com/p/153124468
设置WSL开发环境
设置用户名/密码
使用 WSL 安装 Linux 发行版的过程完成后,使用“开始”菜单打开该发行版(默认情况下为 Ubuntu)。 系统将要求你为 Linux 发行版创建“用户名”和“密码”。
- 此用户名和密码特定于安装的每个单独的 Linux 分发版,与 Windows 用户名无关。
- 输入 密码时,屏幕上不会显示任何内容。 这称为盲目键入。
- 创建用户名和密码后,该帐户将是分发版的默认用户,并将在启动时自动登录。
- 此帐户将被视为 Linux 管理员,能够运行 sudo (Super User Do) 管理命令。
- 在 WSL 上运行的每个 Linux 发行版都有其自己的 Linux 用户帐户和密码。 每当添加分发版、重新安装或重置时,都必须配置一个 Linux 用户帐户。
- 若要更改或重置密码,请打开 Linux 发行版并输入命令:passwd。
- 如果忘记了 Linux 分发版的密码:请打开 PowerShell,使用命令:wsl -d Debian -u root,并将 Debian 替换为目标分发版的名称,如果是Ubuntu可以省略。在 PowerShell 内的根级别打开 WSL 发行版后,可使用此命令更新密码:passwd <username>,其中 <username> 是发行版中帐户的用户名。系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用以下命令在 PowerShell 内关闭 WSL:exit。
更新和升级包
建议使用发行版的首选包管理器定期更新和升级包。 对于 Ubuntu 或 Debian,请使用以下命令:
sudo apt update && sudo apt upgrade
Windows 不会自动更新或升级 Linux 分发版。
使用Code编辑器
分步指南开始将 Visual Studio Code 与 WSL 配合使用,其中包括安装远程开发扩展包。 此扩展使你能够运行 WSL、SSH 或开发容器,以便使用完整的Visual Studio Code功能集进行编辑和调试。 在不同的独立开发环境之间快速切换并进行更新,而无需担心会影响本地计算机。
安装并设置 VS Code 后,可以通过输入以下内容使用 VS Code 远程服务器打开 WSL 项目:code .
使用Docker
分步指南开始使用 WSL 2 上的 Docker 远程容器,并使用 Docker Desktop for Windows 将项目连接到远程开发容器。
安装Docker桌面版
Docker Desktop for Windows 为生成、交付和运行 Docker 化的应用提供了一个开发环境。 通过启用基于 WSL 2 的引擎,可以在同一计算机上的 Docker Desktop 中运行 Linux 和 Windows 容器。
安装 Docker Desktop, 需要重启生成docker用户生效。
配置:
1)“设置”>“常规”中选中“使用基于 WSL 2 的引擎”。
2)“设置”>“资源”>“WSL 集成”,从要启用 Docker 集成的已安装 WSL 2 发行版中 进行选择
确认是否完成安装:
# 启动某个发行版,此处为Debian
C:\Users\user3>wsl --user brian
# 输入 docker --version 来显示版本和内部版本号
brian@brianomen:/mnt/c/Users/user3$ docker --version
Docker version 24.0.6, build ed223bc
# 运行简单的内置 Docker 映像,测试安装是否正常工作
brian@brianomen:/mnt/c/Users/user3$docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:4f53e2564790c8e7856ec08e384732aa38dc43c52f02952483e3f003afbf23db
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
使用 VS Code 在远程容器中开发
若要开始将 Docker 与 WSL 2 配合使用来开发应用,建议使用 VS Code 以及 WSL、开发容器和 Docker 扩展。
安装 VS Code WSL 扩展。 此扩展使你能够在 VS Code 中打开在 WSL 上运行的 Linux 项目(无需担心路径问题、二进制兼容性或其他跨 OS 的难题)。
安装 VS Code 开发容器扩展。 此扩展使你能够打开容器内的项目文件夹或存储库,并利用 Visual Studio Code 的完整功能集在容器中执行开发工作。
安装 VS Code Docker 扩展。 此扩展添加了从 VS Code 内生成、管理和部署容器化应用程序的功能。 (需要开发容器扩展才能将容器实际用作开发环境。)