2018-08-18

2019-09-02 00:46:51

Windows Subsystem for Linux,简称 WSL,是在 Windows 里运行的 linux 子系统,是除了虚拟机以外,在 Windows 10 机器上运行 linux 的又一选择,目前最好的 Linux 桌面发行版。体验还不错,可以替代 Linux 虚拟机的大部分作用。

安装

在 windows 10 控制面板的“程序和功能”中,“启用或关闭 windows 功能”处,勾选“适用于 Linux 的 Windows 子系统”,确认、重启。

上述操作也可以在 powershell 里搞定:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

在Microsoft Store 中,找 linux 发行版,https://aka.ms/wslstore ,挑一个安装 。首次运行需要较长时间初始化,不要提前关闭窗口,否则安装不完整,就需要卸载重装了。我是 windows 10 version 1803 上安装的 ubuntu 18.04。

ssh 登陆

实践发现并不需要改端口,22 端口就可以。ssh 服务需要手动启动sudo service ssh start (自动启动见下文),默认的 ssh 有点问题,需要生成一下key:

sudo ssh-keygen -A

sudo service ssh --full-restart

可以编辑配置:sudo vi /etc/ssh/sshd_config, 将 PasswordAuthentication 改为 yes,允许用户名+密码登陆。

ssh key 可以与Windows 系统使用同一个,也可以使用 ssh-keygen 命令生成新的。我之前在用 git 时在 windows 下生成过,直接从用户目录下复制过来:

mkdir .ssh

chmod 700 ~/.ssh

cp /somewherefromwindows/.ssh/id_rsa ~/.ssh/

cp /somewherefromwindows/.ssh/id_rsa.pub ~/.ssh/

chmod 600 ~/.ssh/id_rsa

chmod 644 ~/.ssh/id_rsa.pub

cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

如果碰到问题,可以卸载掉默认的 openssh 重新安装:

sudo apt purge openssh-server

sudo apt install openssh-server

常用软件

Nginx+PHP+MySQL

nginx 直接使用包安装即可:

sudo apt install nginx

sudo service nginx start

注意我在使用 nginx.org 上的源进行包安装时,无论 stable 版本还是 mainline 版本,错误日志里都出现了

io_setup() failed (38: Function not implemented),换成 ubuntu 默认仓库安装就没问题:

➜ ~ nginx -v

nginx version: nginx/1.14.0 (Ubuntu)

➜ ~

PHP 我使用了 ppa 安装:

sudo add-apt-repository ppa:ondrej/php

sudo apt-get update

sudo apt-get install unzip curl php-fpm php-mysql php-mbstring php-xml php-json php-curl php-redis php-intl php-zip php-gd php-sqlite3 php-bcmath

sudo service php7.2-fpm start

安装后配置 nginx + php-fpm 时,发现页面一直加载不停,搜索了一圈后我找到了解决办法,在 nginx 配置的 http 部分加一条设置:

http {

...

fastcgi_buffering off;

...

MySQL、Redis 与一般 ubuntu 下的安装一样。

NodeJS

使用的官方软件包安装:Installing Node.js via package manager | Node.js。

在挂载的其他分区进行操作时,好像对分区的文件系统有要求,我试了在 exFAT 系统上 npm install 失败,需要加 --no-bin-link,并且之后 npm run dev 依然出错(Laravel 项目),换用 NTFS 文件系统的盘则一切正常。

另外 PhpStorm 的 Node.js and NPM 设置里可以选择 WSL 的 node。

IDE 支持

系统自带了 python 3.6.5,可以以 ssh 的方式和 PyCharm 配合。

Clion 支持 WSL 里的 cmake、g++等,在 windows 系统编写 Linux 下的 c/c++ 程序丝滑流畅(File | Settings | Build, Execution, Deployment | Toolchains)。

PyCharm 以 ssh 的形式支持 WSL 里的 PHP(ssh 远程 composer 暂不支持)。

其他

zsh、lrzsz 安装和一般的 ubuntu 系统无异。

PATH 环境变量

我在 windows 下安装了 visual studio code,偶然发现可以在 bash 里输 code 直接启动,windows 版本的 code 也有启动脚本

➜ ~ which code

/mnt/c/Program Files/Microsoft VS Code/bin/code

原来子系统的 bash.exe 会将 windows 系统的path变量加到自己的 path 里面,意味着你在 bash 里输入 cmd.exe 时,可以“穿越”到 windows 的 cmd 里。因为大部分 windows 应用以exe 结尾,所以一般不会和 linux 系统里的命令冲突。也可以通过注册表禁用这一功能:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss]

"AppendNtPath"=dword:00000000

代理

可以共用 windows 系统的代理,比如在 windows 下运行了 ss 客户端后,可以设置命令别名:

alias proxy="export ALL_PROXY=socks5://127.0.0.1:1080"

alias unproxy="unset ALL_PROXY"

服务自启动

没有 systemctl ,服务启动/停止用 service xxx start|stop,Linux 下添加服务自启动的方式也无效,需要在启动 bash.exe 的时候加参数。后来我翻了 issue,找到了这个启动脚本:wsl-autostart。

作者提供的设置是加在了系统级别的自启动,我换到了用户级别,即注册表地址是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,其他地方照着 README 操作即可,注意在将服务加到 commands.txt 之前,要先安装好服务并确认路径,否则遇到不存在的服务,排在后面的服务项会启动不了。

WSL 系统不会开机启动,因此我还将 ubuntu 应用加到了开机启动:将ubuntu 快捷方式固定到开始屏幕,再拖动到桌面,再拖动到 C:\Users\t\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup。作者加了UAC 支持,我还是用的旧版本,附上 start.vbs:

' Start services

Set WinScriptHost = CreateObject("WScript.Shell")

WinScriptHost.Run Chr(34) & CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\control.bat" & " ""start""" & Chr(34), 0

Set WinScriptHost = Nothing

wsl.conf

/etc/wsl.conf 文件里面可以配置各种运行参数,文件不存在可创建。这里将windows 磁盘挂载在根目录而不是默认的 /mnt/ 目录:

[automount]

enabled = true

root = /

options = "metadata,umask=22,fmask=11"

mountFsTab = false

问题

docker container 无法使用

docker 服务端运行需要 linux 内核,目前无解。可以在 windows 系统安装 Docker for Windows,use windows containers,在 WSL 里正常安装 docker-ce,连接到 windows 里的服务端。注意:windows 10 专业版才带有 Hyper-V,家庭版没有所以装不了 Docker for Windows。

elasticsearch 服务无法自启动

上述服务自启动的方法不适用于包安装的 elasticsearch( /etc/init.d/elasticsearch ),原因未知。

软链接

IDE 不能识别 WSL 下创建的软链接。

ESLint

ESLint 不能使用 WSL 下的 node,仍然要安装 windows 版的node。

npm run watch 失败

用 windows 下的IDE,wsl 的终端运行 npm run watch 会失败,只能在 windows 终端运行,windows 下 node 安装不可避。

ssh 连上时提示异常

=> There were exceptions while processing one or more plugins. See

/var/log/landscape/sysinfo.log for more information.

/var/log/landscape/sysinfo.log 里的异常日志:

ERROR Network plugin raised an exception.

Traceback (most recent call last):

File "/usr/lib/python3/dist-packages/landscape/sysinfo/sysinfo.py", line 99, in run

result = plugin.run()

File "/usr/lib/python3/dist-packages/landscape/sysinfo/network.py", line 32, in run

for info in self._get_device_info():

File "/usr/lib/python3/dist-packages/landscape/lib/network.py", line 181, in get_active_device_info

speed, duplex = get_network_interface_speed(sock, interface)

File "/usr/lib/python3/dist-packages/landscape/lib/network.py", line 261, in get_network_interface_speed

raise e

File "/usr/lib/python3/dist-packages/landscape/lib/network.py", line 253, in get_network_interface_speed

fcntl.ioctl(sock, SIOCETHTOOL, packed) # Status ioctl() call

OSError: [Errno 22] Invalid argument

解决方法,修改(创建)配置文件(/etc/landscape/client.conf),禁用 landscape-sysinfo 的 Network plugin:

[sysinfo]

exclude_sysinfo_plugins = Temperature, Network

小结

WSL 已堪用,以后一定会越来越完善,值得一搞。

low.bi 2018 | lowlog

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐