Winux探索之路-WSL 2的使用

Winux探索之路-WSL 2的使用

WSL简介

背景

1.MicrosoftLoveLinux

曾几何时,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 2 之前,必须启用“虚拟机平台”可选功能。
以管理员身份打开 PowerShell 并运行:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重新启动计算机,以完成 WSL 安装并更新到 WSL 2。

安装所选的 Linux 分发版

打开 Microsoft Store,并选择你偏好的 Linux 分发版。这里以Ubuntu 20.04 LTS为例:
3.MicrosoftStore

点击进入并选择“获取”就可以。Windows会自动下载对应版本的Ubuntu镜像,全程不需要再进行其他操作。

首次启动WSL设置

在Microsoft Store找到已安装的Ubuntu,也可以在开始菜单中选择Ubuntu 20.04 LTS进行启动。

首次启动需要设置用户名

输入用户名后进行密码设置,设置好后可以看到Ubuntu启动成功

5.SuccessBoot

设置root密码

sudo passwd root

输入“su”来切换到root用户,当看到“$”变为“#”说明用户切换成功
6.SetRootPasswd

将分发版本设置为 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

先决条件:

  1. 安装Windows 10 2004版或更高版本
  2. 已开启WSL 2 功能

下载

下载Docker Desktop Stable 2.3.0.2 或更高版本

安装

  1. 按照正常安装步骤安装Docker Desktop,如果系统支持WSL 2,Docker Desktop在安装过程中会提示开启WSL 2
  2. 安装完成后运行Docker Desktop,选择Setting>General
  3. 勾选Use WSL 2 based engine
  4. 点击Apply & Restart
  5. 当Docker Desktop重启完成后,依次点击Settings > Resources > WSL Integration
    勾选Enable integration with my default WSL distro在默认WSL 2分发上启用WSL集成,并选择需要开启的WSL 2分发版,图中只有一个Ubuntu-20.04
  6. 点击 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将会关闭!
12.SetServers

方法二:

管理员身份打开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执行后重启电脑解决。

参考文档:
微软WSL官方文档
Docker Desktop WSL 2 backend