跳到主要内容

WSL - Windows 系统上的 Linux 子系统

前置知识

开始

首先确认你已安装好 wsl2 (安装文档见参考链接), 在命令行输入

wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04 Stopped 2
docker-desktop Stopped 2
docker-desktop-data Stopped 2

假设你在 Microsoft Store 上装了 Ubuntu20.04, 并设为默认子系统

玩法1 - 使用 Ubuntu 系统

可以在任务栏搜索框、资源管理器地址栏、命令提示符等地方输入 bashwsl 直接进入 Ubuntu 系统的 shell 窗口, 可以尝试输入些 bash 命令看看效果

问题1 - wsl 系统可以读写 Windows 上的文件吗?

答案是肯定的, Windows 上的每个盘符都被挂载到 /mnt 路径下, 在子系统对相应文件的修改都会反映到 Windows 的原文件上

ls /mnt

问题2 - Ubuntu 系统存放位置?

%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState

注意到该目录下有个 ext4.vhdx 文件, 有用过虚拟机的朋友应该能发现, 这是个虚拟磁盘文件, WSL2 的系统本质是运行在虚拟机之上

img

WSL2 还提供一个默认的变量 wsl$ 可以直接指向 WSL 目录, 在资源管理器地址栏输入 \\wsl$ 可以看到已启动系统的目录

img

进入 Ubuntu-20.04 目录就会发现里面是 Linux 系统的文件结构

img

问题3 - 子系统和 Windows 宿主机如何互相访问网络应用?

首先从 Windows 访问子系统的应用是非常方便的, 直接输入 localhost 和对应端口就行

从子系统访问 Windows 相对麻烦, 需要知道宿主机的 IP 地址, 子系统访问宿主机像从局域网访问一样, Windows 的 IP 地址可以通过 ipconfig 查看(注意不是192.168段, 而是 WSL2 设置的虚拟网卡), 或者可以通过更方便的方法, 在子系统输入以下命令, nameserver 后面的 IP 即为宿主机 IP

$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.31.80.1

试着 ping 一下, 有返回数据说明成功

$ ping 172.31.80.1

PING 172.31.80.1 (172.31.80.1) 56(84) bytes of data.
64 bytes from 172.31.80.1: icmp_seq=1 ttl=128 time=0.222 ms
64 bytes from 172.31.80.1: icmp_seq=2 ttl=128 time=0.757 ms
64 bytes from 172.31.80.1: icmp_seq=3 ttl=128 time=0.274 ms
提示

宿主机的应用程序要绑定到 0.0.0.0 而不是 127.0.0.1, 因为子系统的连接被视为来自局域网(LAN)的连接

玩法2 - 使用 Docker

我们知道 Docker 是基于 Linux 内核的, 想在 Windows 上使用 Docker 就需要安装 Linux 虚拟机, 然后把 Docker 跑在虚拟机上. Docker 官方有提供 Docker 的 Windows 版, 一些较旧的资料可能会让你安装 Docker Toolbox, 但是现在我们有了 WSL2, 就可以使用更方便的工具 - Docker Desktop. 具体的安装过程就不详解, 请自己参考官方文档, 试着玩玩

导入自定义的 Linux 系统

参考