前言

本来打算给本文起个《打造超越 macOS 的 Windows 10 生产力》的标题的,但是作为运维出生的我而言其实从来就没有认可在运维领域macOS生产力如何优秀需要超越,只不过原生带了个shell环境而已而且还不是linux内核的。对于开发而言虽然可以以此搭建一个开发环境,但是这个和生产环境完全不同的环境指不定那天会蹦出个坑让你跳呢,所以标题还是低调一些为好,不然会被 iOS 研发打脸的。
开始先摊个牌,通过本文你将会了解如何通过 Windows 10 2004 版 + WSL(Windows Subsystem for Linux)+ Windows Terminal 打造当今最强的生产力环境(对你没看错没有之一,光原生 linux 内核甩隔壁 macOS 几条街)

话不多说先上图看下最终效果
image.png
Windows 10 虽然已 BUG 多著称,但其实对比隔壁家系统逐年上升的BUG,细品一下反而觉得越来越香了,特别是这两年官方文档的质量逐年上升这个是真的赞,所以偷个懒本文会连接大量官方文档不搬砖了。

一、WSL 安装

作为打造 Window 10 生产力的核心,首先你要了解下 什么是 WSL,以及 WSL1 和 WSL2 的区别(请仔细阅读),当然了其实关于 WSL 一切你都可以从 官网文档 找到。

只有 Windows 10 版本 2004 的内部版本 19041 或更高版本中才提供 WSL 2。 通过按 Windows 徽标键 + R,检查你的 Windows 版本,然后键入 winver,选择“确定”。

image.png
如果你的系统版本低于2004,可以尝试通过 Windows Update 或者安装官方易升工具来进行升级,当然也能下载个2004的iso重装下系统(安装 LTSC 版本的还是重装下吧)。
另外虽然你了解了 WSL1 和 WSL2 的区别,甚至你可能打算就用 WSL1 了,但是很不幸的告诉你如果你同时要考虑使用Docker Desktop,你只能选择WSL2,不然在 WSL Terminal 中是无法完美无缝的使用 docker 命令的,因为Docker官方就只适配了 Docker Desktop WSL 2 backend
image.png

1.1、安装适用于 Linux 的 Windows 子系统

必须先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发版。
以管理员身份打开 PowerShell 并运行:

  1. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

1.2、安装所需的 Linux 发行版本

WSL只是一个统称,其实你有很多种Linux发行版本可以选择,并且可以同时拥有随意切换,我个人还是比较推荐Ubuntu 20.04 LTS 的,因为要跑 Docker 内核新一点总共是有好处的,当然了你挑战自我完全可以自由发挥,就是用那个 Kali 的时候注意安全(别总是想着干点什么大事)。
打开开始菜单寻找下那个你可能从来没打开过的image.png 搜索Linux,并选择你偏好的 Linux 发行版本。
单击以下链接会打开每个分发版的 Microsoft Store 页面:

打造Windows10生产力 - 图6

  • 用户名密码特定于 Linux 分发版,与 Windows 用户名无关。
  • 创建此用户名密码后,该帐户将是分发版的默认用户,并将在启动时自动登录。
  • 此帐户将被视为 Linux 管理员,能够运行 sudo (Super User Do) 管理命令。
  • 在适用于 Linux 的 Windows 子系统上运行的每个 Linux 分发版都有其自身的 Linux 用户帐户和密码。 每当添加分发版、重新安装或重置时,都必须配置一个 Linux 用户帐户。

1.3、更新到 WSL2(可选)

在选择是否使用 WSL2 之前除了前面提过的官网文档WSL1 和 WSL2 的区别(请仔细阅读),这边还是想讲一下我在日常使用 WSL2 中遇到的一些优劣势:

1.3.1、WSL2 的优势

因为 WSL2 是跑在虚拟机中的完整 Linux,所以功能方面要比 WSL 强大一些。从目前的版本看,至少能做到如下这些 WSL 做不到的事情(并没有全部核实,可能有出入):

  1. 网卡管理、网络抓包、查看网络连接状态、防火墙等较底层的网络相关功能。
  2. 挂载文件(如 ext4 文件、squashfs 文件)和网络资源(如 nfs、ssh )到本地。
  3. tmpfs (在 /run/shm 或者 /dev/shm,/tmp 不是)。
  4. 完整的 cgroups,因此可以运行 Docker 等容器。
  5. 完整的 IPC ( WSL 缺失一部分,比如运行不了 fakeroot )。
  6. 可修改内核参数、添加内核模块,以及替换内核。因此可以支持很多更底层的应用。
  7. 因为之上的这些原因,WSL2 可以更好地享受完整 Linux 系统带来的方便,不需要因为 WSL 的功能缺失而使用各种迂回方法。

    1.3.2、WSL2 的劣势

    功能方面的劣势,主要是和本机系统(即 Windows 宿主机)整合相关的。

  8. 进程不再会显示在任务管理器里,也无法在 WSL2 外操作,包括不再支持本机系统的防火墙规则。

  9. 无法通过 localhost ( 127.0.0.1 )访问本机系统监听的端口(也许以后会支持),只能通过虚拟机 IP 访问。
  10. 默认无法从其他机器访问到 WSL2 中监听的端口,需要在本机系统设置端口转发(如 netsh interface portproxy add )。
  11. 由于启用了 Hyper-V 组件,绝大部分 Android 模拟器目前都无法正常运行(mumu、逍遥等)只有台湾版或者国际版 BlueStacks Hyper-V测试版能正常运行,虚拟机软件目前 VMware 15.5.5+VirtualBox 6+最新版本都已兼容。

其中 2 和 3 后续都可能优化,技术上没有难题,4主要看第三方开发商的态度,跟不跟进微软搞的 Supervisor Platform API。

注意:如果需要用到 Docker Desktop 那其实是必须要启用 Hyper-V,所以使用 WSL2 的一大劣势也就不存在了
如果你确定使用 WSL2,请按照以下方法切换版本。

1.3.3、启用“虚拟机平台”可选组件

安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。
以管理员身份打开 PowerShell 并运行:

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

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

1.3.4、将 WSL 2 设置为默认版本

以管理员身份打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:

wsl --set-default-version 2

运行该命令后,你可能会看到此消息:WSL 2 需要更新其内核组件。有关信息,请访问 https://aka.ms/wsl2kernel,在文档中安装来自该页面的 wsl_update_x64.msi(公司加速下载),以便在计算机上安装 Linux 内核供 WSL 2 使用。 安装内核后,请再次运行该命令,该命令应会成功完成而不显示消息。

最后确认下是否设置成功

wsl --list --verbose

image.png
当你之前安装的发行版本最后的 VERSION 对应是 2 就说明设置成功了,否则你可能还需要手工切换一下对应的发行版本,已 Ubuntu 为例:

wsl --set-version Ubuntu 2

二、Windows Terminal 安装(Windows 终端)

Windows 终端是一个面向命令行工具和 shell(如命令提示符、PowerShell 和适用于 Linux 的 Windows 子系统 (WSL))用户的新式终端应用程序。 它的主要功能包括多个选项卡、窗格、Unicode 和 UTF-8 字符支持、GPU 加速文本呈现引擎,你还可用它来创建你自己的主题并自定义文本、颜色、背景和快捷方式。简单的说你可以把它理解为 macOS 下的 iTerm2
打造Windows10生产力 - 图8

2.1、安装 Windows Terminal

安装同样通过系统Microsoft Store搜索安装,Windows Terminal 下载页面
image.png

2.2、初始化配置

安装完成后默认打开会默认使用 PowerShell 作为终端,我们接下来的目标是把它改造成默认使用 WSL Linux终端,并且使用 oh my zsh 作为 Shell 环境,同时进行简单的美化
改造前:
image.png
改造后:
image.png

2.2.1、默认打开 Ubuntu 终端

我们可以通过下图设置,或者快捷键 Ctrl+, 打开配置文件,对你没看错它目前还没设置界面,只是一个 json 格式的配置文件,所以强烈建议你先安装一个 vscode,这样就能使用 vscode 来编辑 json 了。
image.png
修改打开时默认使用 Ubuntu 终端我们需要修改 defaultProfile

"defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",

当前系统中可以使用的 Profile 可以在配置下方的 profiles list 区块中找到
image.png
如图所示我这个系统 ubuntu 的 guid 为 {2c4de342-38b7-51cf-b940-2309a097f518},我们就把这个值复制下来替换 defaultProfile 后面的值

"defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}",

编辑保存后,可以试试重新打开 Windows Terminal,你会发现默认终端已经变成了 Ubuntu 了
image.png

2.2.2、风格样式、字体设置

Windows Terminal 内置了一些主题风格,包括Campbell、Vintage、One Half、Solarized、Tango,详见:官网文档
也可以自定义,这里给一个自定义 Hopscotch风格的例子,找到 "schemes": [], 替换为:

    "schemes": [
        {
            "name": "Hopscotch",
            "black": "#322931",
            "red": "#dd464c",
            "green": "#8fc13e",
            "yellow": "#fdcc59",
            "blue": "#1290bf",
            "purple": "#c85e7c",
            "cyan": "#149b93",
            "white": "#b9b5b8",
            "brightBlack": "#797379",
            "brightRed": "#fd8b19",
            "brightGreen": "#433b42",
            "brightYellow": "#5c545b",
            "brightBlue": "#989498",
            "brightPurple": "#d5d3d5",
            "brightCyan": "#b33508",
            "brightWhite": "#ffffff",
            "background": "#322931",
            "foreground": "#b9b5b8"
          },
          {
            "name": "Hopscotch.256",
            "black": "#322931",
            "red": "#dd464c",
            "green": "#8fc13e",
            "yellow": "#fdcc59",
            "blue": "#1290bf",
            "purple": "#c85e7c",
            "cyan": "#149b93",
            "white": "#b9b5b8",
            "brightBlack": "#797379",
            "brightRed": "#dd464c",
            "brightGreen": "#8fc13e",
            "brightYellow": "#fdcc59",
            "brightBlue": "#1290bf",
            "brightPurple": "#c85e7c",
            "brightCyan": "#149b93",
            "brightWhite": "#ffffff",
            "background": "#322931",
            "foreground": "#b9b5b8"
          }
    ],

然后在profiles 中定义使用的主题风格,比如下面的例子就是把 Ubuntu 默认主题风格改成 Hopscotch

            {
                "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
                "hidden": false,
                "name": "Ubuntu",
                "source": "Windows.Terminal.Wsl",
                "colorScheme" : "Hopscotch.256"
            },

这个修改只要保存配置文件是会实时生效的,切换到 Windows Terminal 窗口就能看到应用效果,如果你照着上面修改,那现在窗口应该就是这个效果:
image.png
同样字体、背景图、窗口透明度都是通过配置来修改的,详见下方注释说明:

            {
                "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
                "hidden": false,
                "name": "Ubuntu",
                "source": "Windows.Terminal.Wsl",
                "startingDirectory" : "//wsl$/Ubuntu/git",    //启动终端后默认路径
                "fontFace" : "Cascadia Code PL",    //终端字体
                "fontSize" : 11,    //终端字体大小
                "colorScheme" : "Hopscotch.256",    //主题风格
                "historySize" : 9001,        //scroll back的历史信息行数,不配置默认为 9001
                "acrylicOpacity" : 0.9,    //窗口透明度,数值越小越透明
                "useAcrylic": true, //窗口透明开关,设置成 true,acrylicOpacity 的配置才会生效
                "backgroundImage" : "C:/Users/sheav/Pictures/Think_correctly___Ubuntu_by_cyric80.jpg",     //背景图,必须设置绝对路径
                "backgroundImageOpacity" : 0.1,    //背景图的显现度,数值越大越清晰
                "backgroundImageStretchMode": "uniformToFill"    //背景图的填充模式,可选"none", "fill", "uniform", "uniformToFill"
            }

更多配置详见:官网文档

2.2.3、快捷键设置

快捷键部分也可根据自己的习惯来进行调整,下面是我使用的配置,基本看配置就能明白,更多说明见官网文档或百度,这里不过多说明了。

    "keybindings":
    [
        // Copy and paste are bound to Ctrl+Shift+C and Ctrl+Shift+V in your defaults.json.
        // These two lines additionally bind them to Ctrl+C and Ctrl+V.
        // To learn more about selection, visit https://aka.ms/terminal-selection
        { "command": {"action": "copy", "singleLine": false }, "keys": "ctrl+c" },
        { "command": "paste", "keys": "ctrl+v" },

        // Press Ctrl+Shift+F to open the search box
        { "command": "find", "keys": "ctrl+shift+f" },

        // Press Alt+Shift+D to open a new pane.
        // - "split": "auto" makes this pane open in the direction that provides the most surface area.
        // - "splitMode": "duplicate" makes the new pane use the focused pane's profile.
        // To learn more about panes, visit https://aka.ms/terminal-panes
        { "command": { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }, "keys": "alt+shift+d" },

        { "command": "closeTab", "keys": "ctrl+w" },
        { "command": "newTab", "keys": "ctrl+t" },
        { "command": "nextTab", "keys": "ctrl+right" },
        { "command": "prevTab", "keys": "ctrl+left" }
    ]

2.3、一些技巧

更换 Ubuntu 镜像源

//先备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

//替换成阿里云镜像源
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

设置 root 用户密码(可选)

sudo passwd root

设置打开时默认使用 root 用户(可选,设置前必须先设置 root 用户密码)

C:\Users\用户名\AppData\Local\Microsoft\WindowsApps\ubuntu.exe config --default-user root
把用户名修改成你自己电脑的用户名

安装 oh my zsh

sudo apt update
sudo apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

由于国内访问 github 资源时长抽风,也可以用码云的镜像下载安装

wget https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh

编辑 install.sh,找到以下部分

# Default settings
ZSH=${ZSH:-~/.oh-my-zsh}
REPO=${REPO:-ohmyzsh/ohmyzsh}
REMOTE=${REMOTE:-https://github.com/${REPO}.git}
BRANCH=${BRANCH:-master}

REPO=${REPO:-ohmyzsh/ohmyzsh}
REMOTE=${REMOTE:-https://github.com/${REPO}.git}

替换为

REPO=${REPO:-mirrors/oh-my-zsh}
REMOTE=${REMOTE:-https://gitee.com/${REPO}.git}

手动安装

sh -c install.sh

更新仓库地址也修改成码云镜像

cd ~/.oh-my-zsh
git remote set-url origin https://gitee.com/mirrors/oh-my-zsh.git
git pull

未完待续……


三、安装 Docker

安装 WSL2 原生 Docker Engine (Community)

安装 Docker Desktop for Windows

四、在 VSCode 中启用 WSL 开发模式