WSL从一无所知到略知一二

一、简介

微软“爱” Linux

2014 年 10 月 20 日,出任微软公司首席执行官不久的萨提亚 ∙ 纳德拉第一次公开宣示了微软对 Linux 和开源世界的新感情。事实证明,微软的确是付出了真爱。过去两年,从微软智能云 Azure 到 Windows 10,从开发工具到数据库平台,“把 Linux 放在重中之重”,已经成为微软内部人人皆知的准则。

2019 年微软 Build 开发者大会在雷德蒙德召开。继将 Bash shell、原生 OpenSSH、WSL 引入 Windows,以及在微软商店提供 Ubuntu、SUSE Linux 和 Fedora 等发行版,微软又宣布了一个重大的决定 —— 将完整的 Linux 内核引入 Windows 10。

说句题外话

微软越来越拥抱开源了,.net开源,收购github,并且是github上拥有最多开源项目的企业、组织或团体,我个人相比谷歌更喜欢微软,希望微软越办越好

1
2
3
4
5
6
github 上开源项目数
微软:2.9K
谷歌:1.6K
阿里巴巴:291
腾讯:94
百度:83

WSL

WSL 全称为Windows Subsystem for Linux,最早与2016年微软就推出了BUG众多的WSL1,经过两年的缝缝补补,于2019年6月推出了BUG众多的WSL2。

WSL1是一个为在 Windows 10 上能够原生运行 Linux 二进制可执行文件(ELF格式)的兼容层,而WSL2是基于 HYPER-V 虚拟化技术。

WSL2目前基于Linux4.19内核修改,并在github上开源

https://github.com/microsoft/WSL2-Linux-Kernel

可惜的是截止目前(2020年1月2日),WSL仍不是真正完整独立的Linux系统。

WSL1没有Linux内核(故无法使用docker),WSL2没有systemd包(故无法使用systemctl等命令)。

但是假以时日,也许WSL能成为最流行、最方便、最好用的Linux桌面发行版。

为什么要用WSL

  • 性能更好

与虚拟机(Virtual Box/VMware)相比,WSL更接近底层,占用也小,WSL是Windows本身自带的一个功能,完全使用计算机自身硬件能力,挂起时仅占用1M内存。

  • 功能强大

在Windows下可直接访问WSL内的路径,调用WSL内的service,sh脚本;在WSL里也可以直接访问Windows内的路径,运行exe程序。

  • 更方便

无需多个设备,无需双系统,无需启动虚拟机,就可以体验和使用Linux,在WSL里面跑一些自己写的脚本日常使用根本感知不到,不会有黑框框命令行窗口不能关,不会占用任务栏、通知栏

并且,作为程序猿,其实一直觉得应该学好Linux,拿Linux作为主力使用的操作系统,但是Windows下有太多Linux没法安装的方便工具又不可能舍弃,之前一直用Windows+虚拟机的方案解决总感觉差那么点意思,现在用WSL就很舒服,完全可以将Windows当做一个Linux的桌面发行版用了。

二、安装

如果只需WSL1,则用最新版本的Windows都有,可直接从 3 开始看

1. 确定系统版本

1
设置-->更新和安全-->Windows更新-->OS内部版本信息-->Windows规格-->操作系统版本

请确保版本号大于等于18917,18917后才有WSL2。

但是该版本下,Windows并不能直接通过localhost:端口号访问WSL内的服务,只能在WSL内通过ifconfig获取本次开机分配的内部ip,Windows再通过这个ip:端口号访问。

所幸这么蠢的错误没有持续太久,18945的版本就更改回去了,WSL1和18945以后的版本都可以通过localhost:端口号访问WSL内的服务,但是保险起见还是建议更新至最新的19536及以后的版本

注意

不论是WSL的哪个版本(WSL1/18945前、后的WSL2),访问WSL的服务都只能通过localhost,不能通过127.0.0.1,通过127.0.0.1只能访问到Windows对应的服务

如果版本号大于等于19536,可直接从 3 开始看

2. 更新系统版本至最新预览版

1
更新:大概在2020年3月或者4月,正式版已经支持WSL2了!!!

不出所料的话,大家的电脑系统版本最新不过正式版1909,版本号是18363,只有WSL1,没有WSL2,需要将系统更换至预览版

1
2
3
设置-->更新和安全-->Windows预览体验计划-->选择将账号变更为预览版-->选择更新策略为 FAST

设置-->更新和安全-->Windows更新-->重新检查更新-->安装最新的预览版

注意

这里有可能会更新失败,如果遇到更新失败,并且自己动手能力不够,不会备份和重装系统,手头没有对应工具的话,建议放弃使用WSL2,仍然使用WSL1,用WSL1的话下面的东西大体不变
如果具有动手能力的话,更新失败十有八九是因为,当前的WIN10是通过MBR+UEFI/LEGENCY的方式安装的,所以要将硬盘改为GPT格式,进BIOS更换启动引导方式为单UEFI模式,然后用UEFI引导的U盘重装系统,再更新至最新预览版

3. 打开关于WSL的系统相关设置

1
控制面板-->程序-->启动或关闭Windows功能

Windows虚拟机监控程序平台适用于Linux的Windows子系统虚拟机平台 三个功能面前打勾,确定,安装组件后重启电脑

4. 下载Linux系统

1
Microsoft Store-->搜索Ubuntu(Debian,Kali等自己喜欢的子系统)-->下载-->进入子系统后按提示初始化环境-->设置用户名/密码

5. 更改默认的WSL1为WSL2

1
按WIN+X,点击Windows PowerShell(管理员)【有的版本显示为 命令提示符(管理员)】

输入:

1
2
3
wsl --set-default-version 2

wsl -l -v

打印出来的 VERSION 是 2 就对了

6. 安装docker

1
2
3
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start

7. 设置docker为开机启动项

不是WSL的开机启动,是会随着Windows开机启动而启动
在WSL里:

1
sudo vim /etc/init.wsl

输入:

1
2
#! /bin/sh
service docker start

保存退出,授权:

1
sudo chmod +x /etc/init.wsl

在Windows里,创建TXT,输入:

1
2
Set ws = WScript.CreateObject("WScript.Shell")        
ws.run "wsl -d ubuntu -u root /etc/init.wsl"

给TXT重命名为 linux-start.vbs

WIN+R,输入:

1
shell:startup

给vbs文件放到这里

注意

由于WSL毕竟只是Windows的一个服务,不是一个真正完整独立的Linux系统,所以想要开机启动必须用这种方法调,在rc.local里也好,systemd目录下写service也好,我试过了都不行(也希望大家如果试出来新方法还请告知我),必须写成service,然后在文件里启动,再在Windows启动里面调用WSL内的文件才可以

8. 重启wsl

由于wsl没有systemd这个包,所以没法rebootshutdown来重启,但是有时候确实要重启

因为实际上WSL是Windows的一个服务,所以给服务关了再开就是了
新建一个txt,输入:

1
2
net stop LxssManager
net start LxssManager

给TXT重命名为 reboot.bat 找个地方放就行,需要重启了双击它

9. WSL内执行exe程序

在WSL内切换至 /mnt/ 对应目录,运行XXXX.exe,如直接运行explorer.exe

10. Windows下WSL的路径

WSL2是基于 9p(贝尔实验室九号计划的文件协议) 挂载的 Windows 网络驱动器

打开文件夹,输入: \\wsl$

WSL1是基于 DrvFs 文件系统,直接访问:C:\Users\用户\AppData\Local\Packages\XXXXXXUbuntuXXXXX\LocalState

Comments

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.