Winux探索之路-WSL 2的使用
WSL简介
背景
曾几何时,Windows与Linux作为市面PC上两大常用的桌面操作系统一直水火不容,2001年的时候微软前CEO鲍尔默甚至把Linux系统比作癌症。但是“一切事物总是在不断发展变化的”就如近些年微软对待Linux的看法。
微软现任CEO纳德拉上任以来开始拥抱开源,最近微软甚至超越谷歌成为了开源项目最大贡献者。在微软一系列的动作中我们看到了微软对待开源态度的转变;收购全球最大的同性交友网站Github后推出了一系列叫好又叫座的开源项目产品(Vscode、Windows Terminal、Edge等等)。甚至CEO还喊出了“微软爱Linux!”的口号。这不是仅仅嘴上说说“要!”,微软身体也很“诚实!”随后在Windows 10中就推出了WSL。今年5月份Windows 10的重大更新的2004版更是推出了WSL2,Windows+WSL 2补全了Windows短板,让人着实兴奋不已。我把这种结合称为Winux即Windows与Linux各取几个字母组合,所以有了本文标题。
WSL
WSL全称Windows Subsystem for Linux,官方翻译“适用于Linux的Windows子系统”(个人觉得翻译成Windows的Linux子系统更符合国人语言习惯)。以下是微软官方对WSL的描述
适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
您可以:
- 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
- 运行常用的命令行软件工具(例如 grep、sed、awk)或其他 ELF-64 二进制文件。
- 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序,包括:
- 工具:vim、emacs、tmux
- 语言:NodeJS、Javascript、Python、Ruby、C/ C++、C# 与 F#、Rust、Go 等。
- 服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。
- 使用自己的 GNU/Linux 分发包管理器安装其他软件。
- 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
- 在 Windows 上调用 GNU/Linux 应用程序。
WSL 2
WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。
这一新的体系结构改变了这些 Linux 二进制文件与Windows 和计算机硬件进行交互的方式,但仍然提供与 WSL 1(当前广泛可用的版本)中相同的用户体验。
单个 Linux 分发版可以在 WSL 1 或 WSL 2 体系结构中运行。 每个分发版可随时升级或降级,并且你可以并行运行 WSL 1 和 WSL 2 分发版。 WSL 2 使用全新的体系结构,该体系结构受益于运行真正的 Linux 内核。
简单来说WSL2是WSL的加强版,其实现方式与WSL不同,并且WSL 2拥有完整的Linux内核、更贴近真实Linux的使用场景。
为什么要使用WSL&WSL 2 ?
我们日常工作学习中有很多涉及与Linux系统的交互,学院的课程中也有大量的以Linux为基础的知识和命令,如果我们日常工作与使用环境就是Linux那还好,无需切换就可无缝对接。但Windows毕竟是市场占有率最高的操作系统,有大量的人群办公或日常环境需要Windows,而开发环境需要Linux。这就产生了一些在Windows环境下使用Linux的需求。面对这个需求目前有如下几种常用解决方案:
常用Windows&Linux双环境解决方案:
方案 | 优点 | 缺点 |
---|---|---|
单主机安装双系统 | 真实的操作系统 | 切换麻烦需要重启 |
双主机安装双系统 | 物理隔离 | 成本高需要两台PC |
远程服务器方案 | 真实的Linux可以实现很多服务器功能 | 性能、带宽、流量甚至权限都可能有局限 |
虚拟机安装Linux方案 | 完整的使用体验 | 资源消耗大、启动缓慢、运行效率低 |
WSL方案 | 资源消耗小、启动迅速、无缝切换 | 使用体验可能不完整某些软件无法支持 |
WSL方案是微软近两年拥抱开源后推出的一个非常棒的解决方案;使用WSL,Windows与Linux子系统将共用同一文件系统,Windows创建的文件Linux子系统也可以访问并修改,反之亦然。我们可以在WSL中使用三剑客命令查询分析windows文档、日志、使用shell命令或者bash脚本运行存储在windows中的linux程序、甚至在WSL中创建docker容器,在Windows下使用docker desktop进行可视化管理。特别方便有双系统环境来回切换需求的人。总之使用WSL既可以使用windows的图形化操作界面又可以使用Linux便捷的命令行工具,很好的满足了我在Windows下使用Linux的需求。接下来我将介绍如何打造及使用Winux系统。
如何安装WSL&WSL 2
安装WSL
必须先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发版。
以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
如果仅仅只安装 WSL 1,完成此步骤并重启计算机后安装所选的 Linux 分发版就可以了,如果需要WSL 2还需要进行后续步骤。
更新到 WSL 2
WSL 2 是对基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。WSL 2拥有更加完整的Linux体验。只有 Windows 10 版本 2004 (内部版本 19041) 或更高版本中才提供 WSL 2。如果需要 WSL 2,必须使用2004(内部版本 19041)或更高版本的Windows 10才能支持。
-
WSL与WSL 2差异
启用“虚拟机平台”可选组件
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。
以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新启动计算机,以完成 WSL 安装并更新到 WSL 2。
安装所选的 Linux 分发版
打开 Microsoft Store,并选择你偏好的 Linux 分发版。这里以Ubuntu 20.04 LTS为例:
点击进入并选择“获取”就可以。Windows会自动下载对应版本的Ubuntu镜像,全程不需要再进行其他操作。
首次启动WSL设置
在Microsoft Store找到已安装的Ubuntu,也可以在开始菜单中选择Ubuntu 20.04 LTS进行启动。
首次启动需要设置用户名
输入用户名后进行密码设置,设置好后可以看到Ubuntu启动成功
设置root密码
sudo passwd root
输入“su”来切换到root用户,当看到“$”变为“#”说明用户切换成功
将分发版本设置为 WSL 1 或 WSL 2
可以打开 PowerShell 命令行并输入以下命令检查分配给每个已安装的 Linux 分发版的 WSL 版本:
wsl -l -v
若要将分发版设置为受某一WSL 版本支持,请运行:
wsl --set-version <distribution name> <versionNumber>
其中:为你的分发版的实际名称如Ubuntu-20.04
; 为“1”或“2”,你可以随时更改回 WSL 1,方法是运行与上面相同的命令。
WSL 2的使用
WSL 2的使用方式与Linux别无二致,你可以很方便的在WSL 2中使用Linux的各种命令。但是需要注意的是,WSL中的文件都默认是777权限,这点可能与真实Linux环境不同,某些在WSL中运行正常的程序或者命令,在真实Linux中可能因权限问题而运行失败。
接下来将介绍几个WSL 2的使用场景。
Docker Desktop
WSL 2 推出后Docker立即跟进推出了支持WSL 2的版本。在没有WSL 2之前Docker Desktop一直被人诟病。bug多、改了配置不生效,响应慢等问题不胜枚举。而以上这些问题在WSL 2推出后都有所改善(至少我还没有遇到过以上问题)。
安装Docker Desktop
先决条件:
- 安装Windows 10 2004版或更高版本
- 已开启WSL 2 功能
下载
下载Docker Desktop Stable 2.3.0.2 或更高版本
安装
- 按照正常安装步骤安装Docker Desktop,如果系统支持WSL 2,Docker Desktop在安装过程中会提示开启WSL 2
- 安装完成后运行Docker Desktop,选择Setting>General
- 勾选Use WSL 2 based engine
- 点击Apply & Restart
- 当Docker Desktop重启完成后,依次点击Settings > Resources > WSL Integration
勾选Enable integration with my default WSL distro在默认WSL 2分发上启用WSL集成,并选择需要开启的WSL 2分发版,图中只有一个Ubuntu-20.04
- 点击 Apply & Restart等待Decker重启完成
使用Docker
打开WSL后输入docker info
查看Docker Client与Server信息
同时也可以在Power Shell中输入docker info
查看Docker Client与Server信息
在WSL 2中使用Docker与Linux中使用Docker并无区别,但是在WSL中建立的容器可以在Docker Desktop中查看与管理,非常直观
可以用鼠标启动、停止、重启、删除容器。因为WSL的特性,你可以在Windows的浏览器中访问WSL中的Docker容器,这些特点对于习惯Windows环境的人真的非常棒。
WSL 2下使用adb
WSL中使用adb可以让我们很方便的在Windows环境中使用强大的Linux命令来分析Android设备的日志与文件及进行相关操作。但是WSL毕竟只是子系统,直接sudo apt-get install adb
安装后adb命令是无法使用的,我们需要进行一些设置来指定WSL调用Windows下的adb.exe才可以行:
使用vim打开.bashrc并编辑
sudo vim ~/.bashrc
打开后在最后添加如下几行
alias adb='adb.exe'
alias fastboot='fastboot.exe'
使设置生效
source ~/.bashrc
进行以上操作后,我们需要在windows中的cmd或者power shell中先运行一次adb命令。
再运行Get-Service LxssManager | Restart-Service
重启WSL,然后我们就可以在WSL中使用adb了。
WSL 2填坑
此处仅列举出我在实际使用中遇到的问题,还有一些坑可以查看WSL官方文档
WSL磁盘占用的问题
WSL默认安装在Windows的C盘,单单一个WSL不会造成C盘太大的负担,但是当你对WSL使用增多,尤其一通apt-get install
操作后,C盘容量可能变得捉急。我在使用Docker以后磁盘容量会急剧缩水,眼看着200g的C盘也慢慢变满。所以使用WSL后C盘使用容量这点需要大家注意。网上是有一些迁移WSL的方法,但是我还没有尝试,这里就不写出来了,大家注意就好。
WSL 2兼容性问题
WSL 2与VMWare(或其他使用Intel VT-x技术的软件)不兼容,只能二选其一,我当初为了安装安卓虚拟机在这里折腾好几天,明明bios已经开启了VT-x但是windows内安装死活都说不支持。其实只要在安装需要VT-x支持的软件时关闭虚拟平台,安装后再开启就可以了。这一点日后随着各大软件对WSL的
- 如需使用VMWare等软件那么需要执行如下命令禁用虚拟平台
Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
- 软件安装完成后重新开启虚拟平台
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
WSL&WSL 2中输入reboot
命令报错
在使用Linux的过程中我们可能需要进行一些重启操作,真机环境下我们直接输入reboot
命令即可完成重启操作。但在WSL终端中,无法使用 reboot
命令来重启,使用重启命令将会显示如下的错误信息:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to talk to init daemon.
这是因为WSL是Windows的一个子服务,终端中无法操作宿主机的服务。解决方法如下:
方法一:
在Windows的服务中找到LxssManager 这个服务>右键>重启服务即可,注意此时WSL将会关闭!
方法二:
管理员身份打开PowerShell,使用命令: Get-Service LxssManager | Restart-Service
对服务 LxssManager 进行重启。
此外Power Shell中可以使用如下命令停止\启动LxssManager服务(相当于关机与启动操作)
net stop LxssManager # 停止
net start LxssManager # 启动
WSL无法启动
使用WSL过程中可能会因为一些问题导致WSL无法启动。如果显示如下信息:
参考的对象类型不支持尝试的操作。
[已退出进程,代码为 4294967295]
可是使用管理员模式运行Power Shell或CMD并输入:netsh winsock reset
执行后重启电脑解决。