WSL2:让 Windows 10 成为完美的开发机器!
免责声明:我在微软工作。你可能认为这让我对当前话题有些偏见。然而,我曾经是一位 MacOS / MacBook 的狂热用户——无论是在私人场合还是在工作中。我作为一名所谓的“云解决方案架构师”,从事开源/云原生应用开发领域——即涉及容器技术、Kubernetes 等的一切。这意味着几乎所有你需要使用的工具都是基于 Unix 的——或者至少,只有在 Unix 平台上才能完美运行。这就是为什么我很早就转向了苹果生态系统,因为它让你的(开发)生活变得轻松很多——尽管你偶尔会在工作中听到一些不太严肃的评论 :)
嗯,事情已经发生了变化……
介绍
在本文中,我想描述我当前的工具/环境在 Windows 10 机器上的设置情况,以及如何在“云原生”领域工作时以最佳方式(至少对我来说)设置最新版本的 Windows Linux 子系统 2(WSL2)。
长话短说...让我们开始吧!
基础知识
适用于 Linux 2 的 Windows 子系统 (WSL2)
整个故事始于 WSL2 的安装,它现在可与当前版本的 Windows(Windows 10,版本 2004,内部版本 19041 或更高版本)一起使用。Linux 子系统已经存在了很长一段时间,但它从未真正可用——至少对于版本 1 来说是这样(在性能、兼容性等方面)。
最重要的是,WSL2 让您能够在 Windows 上运行 ELF64 Linux 二进制文件——具有 100% 的系统调用兼容性和“接近原生”的性能!Linux 内核(针对 WSL2 进行了大小和性能优化)由微软基于“kernel.org”上提供的源代码,从最新的稳定分支构建而成。内核的更新通过 Windows 更新提供。
我不会详细介绍安装过程,因为您可以按照本教程轻松获取 WSL2:https://docs.microsoft.com/en-us/windows/wsl/install-win10
归结为:
- 安装 Linux 子系统
- 启用“虚拟机平台”
- 将 WSL2 设置为默认版本
下一步是安装您选择的发行版……
安装 Ubuntu 20.04
我决定使用 Ubuntu 20.04 LTS,因为我已经很了解这个发行版,并且已经将它用于私人目的一段时间了——当然还有其他的:Debian、openSUSE、Kali Linux 等。无论你选择哪一个,安装本身都非常简单:你所要做的就是打开 Windows 应用商店应用,找到所需的发行版,然后单击“安装”(或者只需单击此 Ubuntu 链接:https://www.microsoft.com/store/apps/9n6svws3rx71)。


安装完成后,您需要检查是否使用了 Linux 子系统的“版本 2”(我们将“版本 2”设置为默认值,但以防万一……)。因此,打开Powershell提示符并执行以下命令:
C:\> wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 2
docker-desktop-data Running 2
docker-desktop Running 2
Ubuntu-18.04 Stopped 2
如果您看到 Ubuntu-20.04 的“版本 1”,请运行...
C:\> wsl --set-version Ubuntu-20.04 2
这将转换发行版以便能够在 WSL2 模式下运行(给自己倒杯咖啡,转换需要一些时间;))。
Windows 终端
接下来,您需要一个现代化、功能丰富且轻量级的终端。幸运的是,微软也提供了这个终端:开源 Windows 终端。它包含 Windows 命令行社区最常请求的许多功能,包括对选项卡、富文本、全球化、可配置性、主题和样式等的支持。
安装也可以通过 Windows 应用商店完成:https://www.microsoft.com/store/productId/9N0DX20HK701
安装到你的机器上后,我们可以调整终端的设置,将 Ubuntu 20.04 用作默认终端。为此,打开 Windows 终端并按“Ctrl+,”(这会在你的默认文本编辑器中打开 settings.json 文件)。
将 Ubuntu 20.04 配置文件的guid添加到“defaultProfile”属性:

最后但同样重要的一点是,我们将升级所有现有软件包以使其保持最新版本。
$ sudo apt upgrade
好了,“基础”已经到位了……我们在 Windows 中拥有了一个运行 Ubuntu Linux 的终端。接下来,让我们赋予它超能力!
设置/调整shell
目前正在安装的软件是我日常工作所需软件的摘录。当然,选择的内容可能与你实际需要的不同(不过我认为这涵盖了“云原生”领域人士会安装的很多软件)。尽管如此,我还是有必要在这里列出几乎所有的内容,因为如果我将来需要再次设置环境,这基本上也会有所帮助 :)
SSH 密钥
由于开发人员的天性就是使用 GitHub(当然还有其他服务 :)),所以我首先需要一个 SSH 密钥来向该服务进行身份验证。为此,我创建了一个新密钥(或将现有密钥复制到~/.ssh/),然后将其发布到 GitHub(通过他们的网站)。
同时密钥也被添加到了ssh-agent中,使用时无需每次都输入相应的密钥短语。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# start the ssh-agent in the background
$ eval $(ssh-agent -s)
> Agent pid 59566
$ ssh-add ~/.ssh/id_rsa
哦我的天啊
现在到了最精彩的部分 :) 为了让 Ubuntu shell(默认是bash)拥有真正的超能力,我把它替换成了zsh,并结合了超棒的项目Oh My Zsh(它提供了数百个插件、自定义选项、调整功能等等)。zsh是一个扩展的bash shell,与bash相比有很多改进和扩展。此外,它还可以设置 shell 主题、调整命令提示符、使用自动完成功能等等。
因此,让我们安装两者:
$ sudo apt install git zsh -y
# After the installation has finished, add OhMyZsh...
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
准备就绪后,您可以通过主目录中的.zshrc文件自定义OhMyZsh(例如启用插件、设置主题)。以下是我通常进行的设置:
- 调整主题
- 激活插件
让我们一步一步来做……
主题
作为主题,我使用powerlevel10k(很棒的东西!),您可以在这里找到。

安装非常简单,首先将 repo 克隆到本地机器,然后在~/.zshrc中激活主题(变量ZSH_THEME,见下面的截图):
$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH\_CUSTOM:-~/.oh-my-zsh/custom}/themes/powerlevel10k

下次打开新 shell 时,向导将引导您完成主题的所有选项,并允许您自定义终端的外观和感觉(如果向导没有自动启动或者您想要重新启动它,只需p10k configure
从命令提示符运行即可)。
该向导提供了很多选项。只需找到适合您的设置,稍微尝试一下,然后尝试其中一种即可。我的设置最终如下所示:

可选,但建议...安装相应的字体(并调整Windows 终端的settings.json以使用这些字体,参见下图):https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k

插件
就 OhMyZsh 插件而言,我使用以下插件:
- git(git快捷方式,例如“ gp ”代表“ git pull ”,“ gc ”代表“ git commit -v ”)
- zsh-autosuggestions / zsh-completions(命令完成/建议)
- kubectl(kubectl快捷方式/补全,例如“ kaf ”代表“ kubectl apply -f ”,“ kgp ”代表“ kubectl get pods ”,“ kgd ”代表“ kubectl get deploy ”等)
- ssh-agent(启动时自动启动 ssh 代理)
您可以通过修改主目录中的.zshrc来添加它们:

其他工具
现在开始设置我每天需要和使用的工具。我不会在这里详细介绍所有工具,因为大多数工具都很有名,或者安装起来非常简单。以下工具不需要太多解释:
- Azure CLI(
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo zsh
)+ kubectl(通过 Azure CLI 便捷安装程序az aks install-cli
:) - Node 版本管理器 NVM(
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | zsh
)和NodeJS LTS版本(当前:nvm install v12.18.0) - Azure Functions 核心工具(npm install -g azure-functions-core-tools@3)
- Terraform(https://www.terraform.io/downloads.html)
- 通过get_helm.sh脚本 (
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
)来控制Helm - 去(
sudo apt install golang
) - .NET Core(只需按照https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-ubuntu-2004)
- jq – 在 shell 中处理 JSON 数据(https://stedolan.github.io/jq/download/)
再給我更多...!
我想更详细地讨论一些工具,因为它们并不一定被广泛使用和了解。这些工具主要与 Kubernetes/Docker 配合使用。kubectx /kubens和stern正是属于这个领域。Docker for Windows和Visual Studio Code无疑是大家熟知的,并且在日常工作中也非常熟悉。我之所以想讨论后两者,是因为它们与 WSL2 紧密集成!
kubectx / kubens
谁不知道呢?你使用 Kubernetes,必须不断地在集群和/或命名空间之间切换……忘记使用正确的命令来正确设置上下文,结果把自己“弄死”。这时,kubectx和kubens工具就派上用场了,它们可以帮助你快速轻松地在不同的集群和命名空间之间切换。说实话,我再也不想使用没有安装这些工具的系统了。要查看kubectx / kubens 的实际操作,以下是来自其GitHub仓库的示例:


要安装这两个工具,请按照以下步骤操作:
$ sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx$ sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx$ sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubensmkdir -p ~/.oh-my-zsh/completionschmod -R 755 ~/.oh-my-zsh/completionsln -s /opt/kubectx/completion/kubectx.zsh ~/.oh-my-zsh/completions/\_kubectx.zshln -s /opt/kubectx/completion/kubens.zsh ~/.oh-my-zsh/completions/\_kubens.zsh
为了能够使用这些工具的自动完成功能,您需要在.zshrc的末尾添加以下行:
autoload -U compinit && compinit
恭喜,生产力提升:100% :)
斯特恩
_ stern _允许您将多个 Pod 的日志同时输出到本地命令行。在 Kubernetes 中,同时运行多个相互通信的服务是很常见的。有时很难跟踪集群中的调用。使用 stern 后,这变得相对容易,因为您可以通过标签选择器等工具来选择要跟踪日志的 Pod。
例如,使用以下命令stern -l application=scmcontacts
,您可以将带有标签application=scmcontacts的所有 pod 的日志流式传输到本地 shell……然后看起来像这样(每种颜色代表另一个 pod!):

要安装 Stern,请使用此脚本:s
$ sudo curl -fsSL -o /usr/local/bin/stern https://github.com/wercker/stern/releases/download/1.11.0/stern\_linux\_amd64
$ sudo chmod 755 /usr/local/bin/stern
还有一件事
Docker for Windows已经存在很长时间了,现在可能就在你的机器上运行。有些人可能不知道,Docker for Windows 与 WSL2 无缝集成。如果你已经在 Windows 上运行 Docker,只需简单调用以下设置即可启用 Docker / WSL2 集成:


如果您想了解有关集成的更多详细信息,请访问此页面:https://www.docker.com/blog/new-docker-desktop-wsl2-backend/对于本文而言,Docker 现在在 WSL2 中运行这一事实就足够了:)
最后,同样重要的是,需要简短说明一下。当然,Visual Studio Code也可以集成到 WSL2 中。如果您在 Windows 中安装了最新版本的编辑器,则所有在 WSL2 中运行 VS Code 的组件都已包含在内。
在相应的目录中,只需使用源代码简单调用code .
即可在 Ubuntu 中安装 Visual Studio Code 服务器( https://github.com/cdr/code-server )。这允许VSCode远程连接到你的发行版,并使用位于 WSL2 中的源代码/框架。
就这样 :)
包起来
我知道这篇博文已经够长了……但它包含了所有必要的工具(对此持保留态度 ;)),让你作为“云原生”领域的开发者或架构师,在 Windows 10 上获得“绝佳体验”。你拥有一个完全兼容的 Linux“系统”,并与 Windows 紧密集成。你拥有 .NET Core、Go、NodeJS、在“Kubernetes 世界”中工作的工具、目前最好的代码编辑器、git、ssh-agent 等等……以及一个美观的终端,让使用变得乐趣十足!
当然,有些东西我可能漏掉了,或者目前还不清楚。如果我忘了要提到的“那一个”工具,我很乐意听听您的意见。期待您的评论/建议!
希望以上信息能帮到大家!保重……
文章来源:https://dev.to/cdennig/wsl2-making-windows-10-the-perfect-dev-machine-391k