本文最后更新于 2018-12-08,文章内容可能已经过时。

本文最初在发布于GitHub,在此重新发布是为了汇总作品。本文撰写时(2018)基于第一代WSL技术,在此发布时(2024)微软已经发布第二代WSL技术并被主要应用。如果你在使用 WSL 2,请注意内容适用性。

端口

  WSL和Win10共享同一套端口,如果出现两者监听同一个端口的情况,Windows主系统的程序拥有更高的优先级。也就是说,如果我们在WSL运行需要监听端口的程序,必须确认该端口没有被Windows主系统内的任何程序占用。如果出现冲突,请参阅软件相关文档修改默认配置。

  例如,在WSL中安装SSH Server时,端口冲突将会导致WSL不能按照预期通过SSH连接登陆,但只需修改默认WSL的SSH监听端口,问题便迎刃而解。

众所周知,SSH的默认连接端口是22,但是微软在Win10中内置了SSH Server For Windows并占用了默认的22端口,因此如果要在WSL中开启SSH Server,我们必须修改WSL中的默认SSH监听端口。
——[WSL Guideline 06-配置SSH][@/articles/tech/wsl-guideline/06-配置SSH/index.md]

后台运行Linux程序

  当我们在WSL运行后台程序时(如在命令后加&),后台程序会随着WSL所有Session的关闭而停止运行(每一个Session对应任务管理器中一个Bash进程,如下图)。即,如果我们把WSL的Bash窗口全部关闭的话,WSL的后台程序会被强制停止。这个机制虽然能够避免WSL内程序计划外运行,但是在执行后台任务时WSL命令行图标常驻在任务栏会破坏桌面的简洁……

Bash

  为了取消WSLBash窗口图标常驻在任务栏,我们可以开启一个窗口隐藏Bash进程常驻在后台,这样后台程序就不会因为可见的WSLBash窗口关闭而停止运行了————因为一直都有不可见的WSL命令行常驻在后台~~启动隐藏窗口方法如下:

  1. 打开PowerShell

  2. 执行以下命令

    powershell.exe -WindowStyle Hidden -c bash
    

  之后你会在任务管理器发现这个Bash后台进程,你的Linux程序可以后台运行了。为了省去每次开机输入命令的麻烦,我们可以把此命令添加到任务计划

  如果你的WSL安装了多个Linux发行版,上文命令最后的参数bash只能打开WSL默认的Linux发行版Bash窗口(通常为Ubuntu)。因此,为了打开确定的Linux发行版Bash窗口,我们需要将最后的参数bash修改为我们安装的Linux发行版名。假设我们同时安装了Ubuntu发行版和Kali Linux发行版,那么执行命令

powershell.exe -WindowStyle Hidden -c ubuntu

将打开UbuntuBash进程,执行命令

powershell.exe -WindowStyle Hidden -c kali

将打开Kali LinuxBash进程,但是两者的Bash进程显示名称相同,需要pid来区分对应的Linux发行版。

  关于后台运行Linux程序,在通过脚本提高效率这篇文章中会有进一步的应用。

文件系统

  WSL和Windows主系统之间的文件系统是可以互相访问的。

  如果在WSL中访问Windows系统的文件,可在根目录下/mnt/看到对应Windows盘符字母的文件夹,通过这些文件夹即可访问Windows的文件系统。

  如果在Windows系统中访问WSL的文件,可在Windows系统中找到已安装Linux发行版的应用数据文件夹,所有Linux系统的数据都在那个文件夹(通过应用商店安装的Linux发行版本质上也是一个应用)。Linux发行版的数据文件夹在C:\Users\{你的用户名}\AppData\Local\Packages\{Linux发行版包名}\LocalState\rootfs路径内,在rootfs文件夹内我们会看到在WSL中的根目录。
  确定Linux发行版包名可在上级文件夹Packages内搜索你安装的Linux发行版名称,如图:

Linux发行版包名
  • 注:在Windows下对WSL文件修改可能会造成权限错误

下一步