Win10 – WSL 使用小贴士

此前多年我都是信仰级的Linux User,不过后来因为工作硬件支持的原因,级别掉到佛系user,有什么用什么。更因为Win10加入了WSL的功能后,开发环境已经足够使用。

对于WSL我几乎是第一批使用的用户,那时候才2015年。Win10 持续更新到现在(1809),WSL环境下总体已经没什么有影响体验的问题了,作为一般的开发环境绝对够用。这里分享下在较新的WSL下依然需要tune的细节。

终端

Windows下的终端一直都是弱项,这都8102年了,cmd都没有类似bash下.profile、.history之类的几十年以来都有的功能。不过WSL里面有bash,就没cmd.exe什么回事;然而,默认启动的wsl,似乎还是cmd.exe的窗体?

还好有第三方终端。有个比较出名的ConEmu,多年以前都是win下终端的首选替代品了,功能也很多,也支持了WSL。不过我不大喜欢,量级略重,启动慢,我日常使用的是wsltty

wsltty是两个小项目:mintty和wslbridge的捆绑发行版,加起来也是几百k的体积,使用时启动非常快,就像linux桌面下启动xterm。

功能也没花俏,就一个“终端该有的样子”。

工作原理上,wslbridge跑在WSL里面运行了shell,然后把stdin/stdout/stderr用管道传给win下的窗体程序mintty,所以比起在wsl内跑sshd,再用ssh客户端链接的方案要方便快捷很多。

Ubuntu

WSL内的发行版我现在是用Debian的,因为比起Ubuntu,默认安装上要更为“轻量”,更重要的是使用Debian unstable的发行有滚动更新,能跟上很多软件包的最新版本。

Ubuntu的重量级体现在其默认安装了很多“友好的工具”。大家应该不陌生在Ubuntu下敲了错误的命令、不存在命令时候,终端提示不是冷冰冰的command not found,而是友好地提示:这个命令没有安装呢,请安装xxx软件包,命令如下;又或者在xxx、yyy、zzz软件包有类似的命令……

但是在WSL Ubuntu下,这个体验就不大友好了,敲错命令了,终端会卡死几秒钟……然后才出现上述的提示。终究原因,还是因为WSL的磁盘IO性能比较差,而ubuntu提供这个提示功能的是有专门的程序在数据库里面搜索一通才完成的,而且这个程序是还Python写的。一个错误命令扯起一套环境读入、读库搜库,即使是SSD硬盘,都能卡上几秒……我宁愿要冷冰冰的command not found.

删掉Ubuntu的预装包就好了:

sudo apt remove python3-commandnotfound command-not-found command-not-found-data

而Debian默认是不会安装这类玩意的,轻量级的跑起来很快。甚至太轻量了,连查文档的man命令都是没有的:

sudo apt install man-db

WSL运行其他发行版

Win10商店内目前只有Ubuntu/Debian/Suse以及一个收费版本WLinux等发行版,选择性还是有点限制;而且,从商店安装的版本只能安装在C盘很深很深的目录,类似%LOCALAPPDATA%\Packages\TheDebianProject.DebianGNULinux_123456789abcd\LocalState\rootfs\home\user这样的目录。

不过开源社区有别的选择,wsldl项目可让其他发行版也作为wsl安装到Win10内,仅仅是解压运行exe,而对应发行版的rootfs就解压到exec的目录。也就是说解压到D:\Archlinux,运行D:\Archlinx\Arch.exe后,Arch就安装到D:\Archlinux\rootfs了。比起用商店安装更方便!

类似的可选发行版还有Arch ,ArtixAplineCentos

服务

如今很多发行版都使用了systemd做服务管理,然而WSL下systemd是不可能跑起来的。当然现在社区都正在为支持WSL努力,不过在可用之前,似乎没什么好办法。

比如安装了mysql,想要启动起来,只能手工地在screen里开个终端运行mysqld。WSL目前对后台确实缺乏友好。

一个方法是把服务管理系统改回SysV之类,但总感觉是伤筋动骨了,目前我没什么好的办法,只能是使用的时候在screen/tmux挂一个专门跑服务进程的终端。

微软的商店里上线了个叫做WLinux的发行版,也是基于Debian的,售价20刀。据说是专门给WSL环境优化的系统环境,完全没有systemd,理论上应该解决这个头痛的问题了。当然作为开源产品,付钱购买不是必须的。不过我还没实践过,可能需要用到这个可以安装任何发行版到WSLLxRunOffline 。不过WLinux的特点是结合linux环境的GUI工具和win下的X-Server配合,重量级的配合,不是我的菜。

VSCode开发集成

WSL存在的价值就是开发环境,所以跟开发工具是离不开的。开箱可用的Visual Studio Code编辑器也成为近来最爱,不过在WSL的支持上,开发者们还在努力。

VSCode默认是支持git的,但是他用的是windows环境的git,WSL里面也有git,虽然都安装的话两套git也能完成代码管理,但是总有点突兀(主要是刷新状态上)。

有个叫wslgit的项目,直接把WSL里面的git“翻译”成原生git,只需要WSL里面配置一下就可以了。

{
    "git.path": "C:\\Users\\xxx\\bin\\wslgit.exe"
}

VSCode里面也集成了终端功能,运行代码时候不用跟终端程序切换的,按ctrl+`就可以,然而默认打开的是cmd.exe,顺便改一下。

{
    "git.path": "C:\\Users\\penti\\bin\\wslgit.exe",
    "terminal.integrated.shell.windows":
         "C:\\Windows\\System32\\bash.exe"
}

其他还有Python/Node这类环境都可以在VSC里面直接调用WSL里面的代码的,其实主要就是处理了Win下D:\Path到WSL内/mnt/d/Path这类的映射问题。更多WSL的增强辅助项目,可查看WSL-Awesome内列出的一堆项目。

 

编辑历史:

2018-11-19:第三方发行版支持部分内容。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.