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 系统
可以在任务栏搜索框、资源管理器地址栏、命令提示符等地方输入 bash
或 wsl
直接进入 Ubuntu 系统的 shell
窗口, 可以尝试输入些 bash
命令看看效果
问题1 - wsl 系统可以读写 Windows 上的文件吗?
答案是肯定的, Windows 上的每个盘符都被挂载到 /mnt
路径下, 在子系统对相应文件的修改都会反映到 Windows 的原文件上
ls /mnt
问题2 - Ubuntu 系统存放位置?
%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState
注意到该目录下有个 ext4.vhdx
文件, 有用过虚拟机的朋友应该能发现, 这是个虚拟磁盘文件, WSL2 的系统本质是运行在虚拟机之上
WSL2 还提供一个默认的变量 wsl$
可以直接指向 WSL 目录, 在资源管理器地址栏输入 \\wsl$
可以看到已启动系统的目录
进入 Ubuntu-20.04 目录就会发现里面是 Linux
系统的文件结构
问题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. 具体的安装过程就不详解, 请自己 参考官方文档, 试着玩玩