wsl 使用笔记

使用wsl很久了,是时候总结一波使用技巧,列出一些踩过的坑 慢慢遇到了再补全

简介

Windows Linux子系统(Windows Subsystem Linux,下简称wsl),是微软官方推出的应用程序。它能让开发人员直接在Windows上使用Linux系统,从而减轻使用虚拟机造成的开销。

大部分问题都可以参考官方文档

wsl能满足部分Linux使用需求,有一部分局限性: - 不支持含有GUI的应用程序。对于ctfer最大的影响在于使用pwntools时会非常难受。同时也不能使用python的opencv等库进行画图 - 不支持docker

那么wsl有什么好处呢?

最重要的一点是快。一些ctfer对linux开发的要求不高。更多是在遇到一道题目时,需要使用一些linux的工具或运行一些程序。这是再开虚拟机会比较繁琐。如果笔记本的配置不太高,开虚拟机又会占用很多开销,频繁切换虚拟机有时候也会非常的头疼,于是wsl成为了不错的选择。

同时wsl可以很方便的和主系统共享文件,主系统的磁盘被“挂载”在了/mnt/下,你可以在/mnt/c/中找到你C盘中的文件。

不过有一说一,对于电脑配置较好的,同时最好有双屏的,还是建议开虚拟机

安装

首先需要在Windows中启用WSL功能。位于控制面板->程序->启用或关闭Windows功能->适用于Linux的Windows子系统

安装过程其实非常简单,在win10的应用商店中搜索wsl,选择一个Linux发行版,我使用的是Ubuntu 18.04,下载。

启动

没错,启动也可以有很多种方法

  1. 在开始菜单中找到Ubuntu并启动
  2. 打开命令提示符(或PowerShell),输入ubuntubashwsl,在当前窗口启动wsl,此时路径为你的cmd或PowerShell的路径(此处可以是任何一个终端,包括但不限于git bash,idea,vscode,cmder等)
  3. 在某个文件夹的导航栏中输入ubuntubashwsl,会在当前文件夹启动wsl,此时linux的路径就是当前文件夹
  4. 在右键菜单中添加在此处打开wsl,在某个文件夹右键并点击此选项,就可以在此文件夹启动wsl了

综合来看第四种的使用体验最佳,具体如何修改注册表加入右键菜单可以参考其他文章

初始化

初次使用wsl的时候需要进行一些初始化。第一次启动Ubuntu后会自动进行安装。如果遇到了

The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.

说明你没有开启wsl服务,参考之前的安装部分

接下来输入用户名密码。和常规linux差不多。

注意,我们设置的是你新建的用户的用户名和密码,root用户的密码并没有被设置,默认情况下root的密码为空,所以当你执行su命令想要切换root用户的时候,此时输入密码是如何也输入不对的。我们需要使用sudo su切换到root,再设置root密码(参考

这样我们得到了一个干净的linux系统,基本等于纯净版,很多应用程序都没有,因此需要安装一些常用应用程序。

在使用apt安装之前,强烈建议更换apt软件源,可以谷歌apt换源或参考我之前的文章。

使用技巧集合

在这里,我将列出使用wsl以来遇到过的坑,以及一些使用技巧。

环境变量问题

默认情况下,wsl再启动的时候会将Windows的环境变量导入,比如Windows的PATH中有一条C:\Program Files\,则wsl中的PATH中会有一条/mnt/c/Program Files

1
2
$ echo $PATH
/home/apeng/.local/bin:/home/apeng/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/mnt/c/Program Files

然而这条没有被双引号包裹起来,空格会将这条截断,有时会出问题,表示找不到/mnt/c/Program这一条。

谷歌了一下,发现了解决办法。

很多时候我们不需要Windows的环境变量PATH,不如直接设置启动wsl的时候就不讲Windows的PATH加入wsl的PATH。

修改wsl的配置文件wsl.conf,位于/etc/wsl.conf。如果没有这个文件,可以新建一个。这个文件服从ini文件标准

根据微软的文档,wsl.conf可以将interop部分的appendWindowsPath设置为false,同时将enable设置为false,从而使wsl启动的时候不将Windows的PATH添加进wsl的$PATH环境变量。只需添加这几行配置:

1
2
3
[interop]
enabled = false
appendWindowPath = false

再查看$PATH,其中已经没有Windows的PATH了:

1
2
echo $PATH
/home/apeng/.local/bin:/home/apeng/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

参考资料

Set WSL launch settings: https://docs.microsoft.com/en-us/windows/wsl/wsl-config#set-wsl-launch-settings ini文件:https://en.wikipedia.org/wiki/INI_file