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 | github 上开源项目数 |
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 | 设置-->更新和安全-->Windows预览体验计划-->选择将账号变更为预览版-->选择更新策略为 FAST |
注意
这里有可能会更新失败,如果遇到更新失败,并且自己动手能力不够,不会备份和重装系统,手头没有对应工具的话,建议放弃使用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 | wsl --set-default-version 2 |
打印出来的 VERSION 是 2 就对了
6. 安装docker
1 | curl -fsSL https://get.docker.com -o get-docker.sh |
7. 设置docker为开机启动项
不是WSL的开机启动,是会随着Windows开机启动而启动
在WSL里:
1 | sudo vim /etc/init.wsl |
输入:
1 |
|
保存退出,授权:
1 | sudo chmod +x /etc/init.wsl |
在Windows里,创建TXT,输入:
1 | Set ws = WScript.CreateObject("WScript.Shell") |
给TXT重命名为 linux-start.vbs
按WIN+R
,输入:
1 | shell:startup |
给vbs文件放到这里
注意
由于WSL毕竟只是Windows的一个服务,不是一个真正完整独立的Linux系统,所以想要开机启动必须用这种方法调,在rc.local里也好,systemd目录下写service也好,我试过了都不行(也希望大家如果试出来新方法还请告知我),必须写成service,然后在文件里启动,再在Windows启动里面调用WSL内的文件才可以
8. 重启wsl
由于wsl没有systemd
这个包,所以没法reboot
、shutdown
来重启,但是有时候确实要重启
因为实际上WSL是Windows的一个服务,所以给服务关了再开就是了
新建一个txt,输入:
1 | net stop 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