当前位置:   article > 正文

WSL2 + Docker + xfce4安装及使用_wsl2 ubuntu 22.04 安装xfce4

wsl2 ubuntu 22.04 安装xfce4

WSL2 + Docker + xfce4安装及使用

WSL官方指南:适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

文档比较详细,而且会持续更新,欢迎大家指错。

文章目录

本文内容:主要记录WSL2下安装与使用ubuntu,WSL中ubuntu的图形界面的安装,以及对图形界面的调教,还有 Docker 安装。

一、前言

1.1 什么是WSL?

wsl 是适用于 Linux 的 Windows 子系统(英语:Windows Subsystem for Linux,简称WSL)。是一个为在Windows 10和Windows Server 2019上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层,可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销

简单来说,以前想在windows中使用linux,需要安装vmware虚拟机,现在则不比这么麻烦了,直接安装linux子系统秒开

1.2 比较 WSL 1 和 WSL 2

WSL 2 是WSL 1的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的主要目标是提高文件系统性能,以及支持完全的系统调用兼容性

相对于WSL采用API转换的方式, WSL 2 则完全不同,win10 开始内置了一个轻量级虚拟机,经过不断的优化,这个虚拟机实现了与 windows 的高度集成,实现了虚拟机的高性能运行,WSL2 便是运行在虚拟机上的一个完整的 linux 内核,比如Docker、cgroup、iptables、GPU、图形界面这些功能都能正常工作。。因此 WSL 2 给了在 windows 更接近原生linux的体验,同时WSL 2 的开启速度有了非常明显的提升,几乎不需要再等待。

这一新的体系结构改变了这些 Linux 二进制文件与Windows 和计算机硬件进行交互的方式,但仍然提供与 WSL 1(当前广泛可用的版本)中相同的用户体验。

单个 Linux 分发版可以在 WSL 1 或 WSL 2 体系结构中运行。 每个分发版可随时升级或降级,并且你可以并行运行 WSL 1 和 WSL 2 分发版。 WSL 2 使用全新的体系结构,该体系结构受益于运行真正的 Linux 内核。

WSL 1 和 WSL 2 的主要区别和优势可以参考官方文档:比较 WSL 1 和 WSL 2

1.3 WSL可以做什么?

  • 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
  • 运行常用的命令行软件工具(例如 grepsedawk)或其他 ELF-64 二进制文件。
  • 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序;
    • 工具:vim、emacs、tmux
    • 语言:NodeJS、Javascript、Python、Ruby、C/ C++、C# 与 F#、Rust、Go 等。
    • 服务:SSHD、MySQL、Apache、lighttpd、MongoDBPostgreSQL
  • 使用自己的 GNU/Linux 分发包管理器安装其他软件。
  • 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
  • 在 Windows 上调用 GNU/Linux 应用程序。

装完WSL2后,我就把Windows上跑的Docker、Mysql、nginx 等服务迁进了容器,这就很nice

二、便捷自动安装(本人未测试)

注意:看了官方介绍,感觉手动安装其实并不会比自动安装繁琐,总共也就几步操作而已。自动安装无法把控细节,我倾向手动安装。这里不过多介绍,看官方文档即可

建议浏览WSL官方指南安装 WSL | Microsoft Docs

官方已经更新便捷的安装方式,现在,可以在管理员 PowerShellWindows 命令提示符中输入此命令,然后重启计算机来安装运行适用于 Linux 的 Windows 子系统 (WSL) 所需的全部内容。

wsl --install
  • 1

此命令将启用所需的可选组件,下载最新的 Linux 内核,将 WSL 2 设置为默认值,并安装 Linux 发行版(默认安装 Ubuntu)。

三、手动安装 WSL 2

WSL官方指南旧版 WSL 的手动安装步骤 | Microsoft Docs

3.1 启用适用于 Linux 的 Windows 子系统*

需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。

  • 方法一:通过命令来启用

    管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“,并运行:

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

    执行结果:

    C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    
    部署映像服务和管理工具
    版本: 10.0.18362.1379
    
    映像版本: 10.0.18363.1500
    
    启用一个或多个功能
    [==========================100.0%==========================]
    操作成功完成。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 方法二:在windows功能中手动设置

    在“控制面板\所有控制面板项\程序和功能”中选择“启用或者关闭Windows功能”,勾选对应选项即可:

如果只想安装 WSL 1,现在可以重新启动计算机,然后继续安装所选的 Linux 发行版。 若要更新到 WSL 2,请先继续执行下一步,之后再重新启动计算机。

3.2 更新到 WSL 2

3.2.1 检查运行 WSL 2 的要求

若要更新到 WSL 2,需要运行 Windows 10。

  • 对于 x64 系统:版本 1903 或更高版本,采用 内部版本 18362 或更高版本。
  • 对于 ARM64 系统:版本 2004 或更高版本,采用 内部版本 19041 或更高版本。

若要检查 Windows 版本及内部版本号,选择 Windows 徽标键 + R,然后键入“winver”,选择“确定”。 更新到“设置”菜单中的最新 Windows 版本。

备注:

如果运行的是 Windows 10 版本1903 或 1909,请在 Windows 菜单中打开“设置”,导航到“更新和安全性”,然后选择“检查更新”。 内部版本号必须是 18362.1049+ 或 18363.1049+,次要内部版本号需要高于 .1049。 阅读详细信息:WSL 2 即将支持 Windows 10 版本 1903 和 1909。 请参阅疑难解答说明

3.2.2 启用“虚拟机平台”可选组件*

安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。

  • 方法一:通过命令来启用

    管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“,并运行:

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

    执行结果:

    C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    
    部署映像服务和管理工具
    版本: 10.0.18362.1379
    
    映像版本: 10.0.18363.1500
    
    启用一个或多个功能
    [==========================100.0%==========================]
    操作成功完成。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 方法二:在windows功能中手动设置

    在“控制面板\所有控制面板项\程序和功能”中选择“启用或者关闭Windows功能”,勾选对应选项即可:

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

检测是否开启虚拟化,打开任务管理器 -> 性能 -> 虚拟化已启用

3.2.3 将 WSL 2 设置为默认版本

安装新的 Linux 分发版之前,请以管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“中运行以下命令,以将 WSL 2 设置为默认版本

先检查 WSL 状态,查看有关 WSL 配置的常规信息,例如默认发行版类型、默认发行版和内核版本。

wsl --status
  • 1

如果默认版本不是2,则执行以下命令:

wsl --set-default-version 2
  • 1

正常情况下,出现以下信息

C:\WINDOWS\system32>wsl --set-default-version 2
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
操作成功完成。
  • 1
  • 2
  • 3

但如果执行结果如下,则需要更新 Linux 内核,操作见下一步,更新完,继续设置默认版本

C:\WINDOWS\system32>wsl --set-default-version 2
WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel
(WSL 2 需要更新其内核组件。有关信息,请访问 https://aka.ms/wsl2kernel)
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
  • 1
  • 2
  • 3
  • 4

设置完后,这会使你安装的任何新发行版均初始化为 WSL 2 发行版。

3.2.4 下载 Linux 内核更新包
  1. 下载最新包:
  • 适用于 x64 计算机的 WSL2 Linux 内核更新包

    备注:

    如果使用的是 ARM64 计算机,请下载 ARM64 包。 如果不确定自己计算机的类型,请打开命令提示符或 PowerShell,并输入:systeminfo | find "System Type"警告: 在非英语 Windows 版本中,你可能需要修改搜索文本,例如在德语中为 systeminfo | find "Systemtyp"

  1. 运行上一步中下载的更新包。 (双击以运行,系统将提示你提供提升的权限,选择“是”以批准此安装。)

安装完成后,请继续执行之前失败的操作。 (如果希望将新的 Linux 安装设置为 WSL 1,请跳过此步骤。)

3.3 安装所选的 Linux 分发版

Windows 10 的 WSL 2 需要依赖于WSL 发行版,Microsoft Store中的WSL 发行版应用。适用于 Linux 的 Windows 子系统安装是会自动装在系统驱动器(通常是 C: 驱动器)中运行,所以注意C盘的空间。(注意:如果需要修改安装位置,请先查看下文自定义安装方法,再来查看本节其他配置介绍)。

查看当前已安装发行版

wslconfig /l
  • 1

wsl --list --all
  • 1
3.3.1 下载 Linux 分发版

注意,如果是自定义安装,则跳过该步骤

  1. 打开 Microsoft Store,并选择你偏好的 Linux 分发版 (如果上述连接打开有错,请直接打开 Microsoft Store 搜索)。这里推荐使用最新得长期稳定版,目前是 Ubuntu 20.04 LTS

单击以下链接会打开每个分发版的 Microsoft Store 页面,(如果下述连接打开有错,请直接打开Microsoft Store搜索)。:

  1. 在分发版的页面中,选择“获取”。

    注意:这样会自动安装到系统盘,如果需要更改安装目录,参考下文[[#3.4 自定义分发版安装目录(可选,推荐)]]

3.3.2 设置新分发版

首次启动新安装的 Linux分发版时,将打开一个控制台窗口。(自定义安装则是双击安装目录的 Ubuntu***.exe 文件,就是之前安装的应用,如果第一次启动ubuntu失败,可以重启电脑再次试下)

如果还是出错,参考下文[[#3.8 可能出现的问题]]

系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。未来的所有启动时间应不到一秒。

然后,需要为新的 Linux 分发版创建用户帐户和密码

祝贺你!现已成功安装并设置了与 Windows 操作系统完全集成的 Linux 分发!

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

安装完后,可用 wsl -l -v 查看Linux 分发版的 WSL 版本(后面有详解)

PS C:\Users\wys> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  • 1
  • 2
  • 3
3.3.3 修改ubuntu的apt安装源

第一步:进入 ubuntu,备份源文件

cp /etc/apt/sources.list /etc/apt/sources.list.bak
  • 1

第二步:编辑 /etc/apt/sources.list 文件,更换成国内源

注意,以下是Ubuntu 20.04版本

  • 网易源
#网易源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
#阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 清华源https
#清华源https

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我这里使用的阿里源,可直接执行如下命令

echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse">/etc/apt/sources.list
  • 1
  • 2
  • 3
  • 4

注意,以下是Ubuntu 22.04版本

  • 网易源

    deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ jammy-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ jammy-backports main restricted universe multiverse
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 阿里源 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区

    deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 清华源

    # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
    # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
    # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
    # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
    # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
    
    # 预发布软件源,不建议启用
    # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
    # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

然后执行更新

apt update && apt upgrade -y
  • 1
3.3.4 重置 Linux 密码(可选)

若要更改密码,请打开 Linux 分发版(例如 Ubuntu)并输入以下命令:passwd

系统会要求你输入当前密码,然后要求输入新密码,之后再确认新密码。

3.3.5 忘记密码(可选)

如果忘记了 Linux 分发版的密码:

  1. 请打开 PowerShell,并使用以下命令直接进入默认 WSL 分发版的根目录:wsl -u root

    如果需要在非默认分发版中更新忘记的密码,请使用命令:wsl -d Debian -u root,记得将 Debian 替换为目标分发版的名称。

  2. PowerShell 内的根级别打开 WSL 发行版后,可使用此命令更新密码:passwd <WSLUsername>,其中 <WSLUsername> 是 DISTRO 中帐户的用户名,而你忘记了它的密码。

  3. 系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用命令 exitPowerShell 内关闭 WSL

3.3.6 修改root用户密码(可选)
  • WSL 默认是没有设置 root 密码的,系统实现的是每次开启时随机设置root密码,导致无法切换到root权限进行操作

  • 设置 root 用户密码,这样要输三次命令,第一次当前用户密码,后两次就是设置密码以及确认密码

    # 语法: sudo passwd 用户名
    sudo passwd root
    
    • 1
    • 2
  • password updated successfully 代表密码更新成功,切换用户

    # 语法: su 用户名
    su root
    
    • 1
    • 2

如果我们想要使用 root 用户的话,为了避免 sudo 切换 root 是需要输入密码,把自己配置的用户名加到sudo免密中,命令如下:

 # 替换leap为自己单独配置的用户名
 sudo echo "leap ALL=(ALL:ALL) NOPASSWD: ALL" >>/etc/sudoers 
  • 1
  • 2
3.3.7 修改默认用户root(可选)
  • 查看自己安装的哪个版本

    可以去 Microsoft Store 商店 - 我的软件 - 已安装, 中查看

我这里安装的是 ubuntu,我就以 ubuntu 为例

  • 查看修改命令,输入ubuntu 按回车会自动补全版本对应的命令

    # 如果安装的是ubuntu1804,则命令可能是 
    ubuntu /?
    或者
    ubuntu1804 /?
    
    • 1
    • 2
    • 3
    • 4

  • 设置默认用户

    # 语法: ubuntu config --default-user 用户名(已存在的)
    # 如果安装的是ubuntu1804(可用wsl -l -v 查看),则命令也可能是ubuntu1804 config --default-user 用户名(已存在的)
    PS C:\WINDOWS\system32> ubuntu config --default-user root
    PS C:\WINDOWS\system32>
    
    # 没有报错就代表成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 注意,如果出现以下错误(一般情况是因为采用自定义分发版安装才会出现该情况

    PS C:\Users\Administrator> ubuntu config --default-user root
    正确,然后再试一次。
    所在位置 行:1 字符: 1
    + ubuntu config --default-user root
    + ~~~~~~
        + CategoryInfo          : ObjectNotFound: (ubuntu:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这个错误是说无法识别该命令。你需要找到以 ubuntu 开头的 exe 文件(即安装目录,可使用强大的绿色搜索工具 everything 搜索),比如我的是 ubuntu.exe,然后在==管理员权限的命令终端==中 cd 进入所在目录,再来执行以上命令

重新打开已经是 root 用户了

3.4 自定义分发版安装目录(可选,推荐)

我的电脑我做主,C盘寸土不让,离线安装

3.4.1 如果未安装分发版

Microsoft Store下载的 WSL 发行版会自动安装到C盘不能手动选择安装位置。微软提供了一个手动下载WSL发行版的网址,可以绕开MS Store的自动安装

  1. 手动下载,下载地址:下载发行版 | Microsoft Docs

  1. 选择想要的发行版下载后,可以得到一个后缀名为 .AppxBundle 的文件。(官方文档说是 .appx的文件,其实是错的,很多博客也跟着瞎抄。)把这个 .AppxBundle 的文件的后缀改为.zip,然后解压到,这才能得到 .appx的文件。

  1. 根据系统型号,选择对应的 .appx的文件后缀改为.zip,然后解压到想要安装 WSL 的目录下,我们可以得到一些文件。

  1. 找到 xxx.exe文件(如ubuntu.exe,其他发行版的话也有类似的程序)双击打开,等待一段时间就可以安装成功。然后就跟上述 [[#3.3.2 设置新分发版]] 一样,开始设置用户名和密码。

注意

安装目录的磁盘不能开==压缩内容以便节省磁盘空间==选项,否则会报错 0xc03a001a

可以右键文件夹–>属性–>常规–>高级找到并关闭这个选项,开了压缩功能的文件夹右上角会有两个蓝色的小箭头

3.4.2 如果已经安装分发版(未测试)
  • 如果之前的数据不重要,可以删除原来安装在C盘的发行版

    首先停止 Linux 发行版在 WSL 的运行(这里以 Ubuntu 18.04 为例):

    wsl -l -v
    wsl -t Ubuntu-18.04
    wsl --shutdown
    wsl -l -v
    
    • 1
    • 2
    • 3
    • 4

    查看 Windows 系统已经安装的软件包:

    Get-AppxPackage -allusers | Select Name, PackageFullName
    
    • 1

    删除 Ubuntu 发行版

    get-appxpackage CanonicalGroupLimited.<发行版名称和版本号>onWindows | remove-Appxpackage
    
    • 1

    这里以 Ubuntu 18.04 为例,所以要将 “<发行版名称和版本号>” 替换为 “Ubuntu18.04” , 如果是 Ubuntu
    20.04 ,那么就应当替换为 “Ubuntu20.04”。

    删除 Ubuntu 18.04

    get-appxpackage CanonicalGroupLimited.Ubuntu18.04onWindows | remove-Appxpackage
    
    • 1

    然后开始重新安装,按照上一步未安装分发版的流程即可。

  • 如果是想直接迁移之前数据,操作如下:

    1. 首先查看所有分发版本

      C:\Users\Administrator>wsl -l -v
        NAME                   STATE           VERSION
      * Ubuntu                 Running         2
      
      • 1
      • 2
      • 3
    2. 导出分发版为tar文件到d盘

      wsl --export Ubuntu D:\wsl\ubuntu\ubuntu.tar
      
      • 1
    3. 注销当前分发版

      wsl --unregister Ubuntu
      
      • 1
    4. 重新导入并安装分发版在 D:\wsl\ubuntu\

      wsl --import Ubuntu D:\wsl\ubuntu D:\wsl\ubuntu\ubuntu.tar --version 2
      
      • 1
    5. 设置默认登陆用户为安装时用户名

      ubuntu config --default-user Username
      
      • 1
    6. 删除tar文件(可选)

      del D:\wsl\ubuntu\ubuntu20.04.tar
      
      • 1

3.5 安装 Windows Terminal终端(可选,推荐安装)

安装 Windows Terminal,可用于和 WSL 子系统交互。强烈推荐

Windows 终端(Windows Terminal)可启用多个选项卡(在多个 Linux 命令行、Windows 命令提示符、PowerShell 和 Azure CLI 等之间快速切换)、创建键绑定(用于打开或关闭选项卡、复制粘贴等的快捷方式键)、使用搜索功能,以及使用自定义主题(配色方案、字体样式和大小、背景图像/模糊/透明度)了解详细信息。

官方文档:安装和设置 Windows 终端

3.5.1 微软商店自动安装

可以从 Microsoft Store 安装 Windows 终端。

3.5.2 手动离线安装

如果你无法访问 Microsoft Store,GitHub 发布页上发布有内部版本。 如果从 GitHub 安装,终端将不会自动更新为新版本。(我就是在github上下载的,因为Microsoft Store突然无法安装应用,网上说是需要更新系统版本,但我系统已经更新过了。)

  1. Windows TerminalGitHub 发布页 下载最新的release包,即以 .msixbundle 为后缀的文件
  2. 将文件后缀名改为 .zip 后解压缩文件
  3. 在解压后的文件夹中找到名为 CascadiaPackage***.msix 的文件,有x86、x64和ARM64版本的,选择x64那个文件,修改后缀名为 .zip,然后解压
  4. 在解压后的文件夹中,找到 WindowsTerminal.exe 的文件,直接双击就能运行了,还是绿色免安装版的
  5. 可以把这个文件夹拷贝到安全的位置,然后将 *.exe 文件添加到桌面快捷方式,就能轻松使用 Windows Terminal

3.6 查询WSL状态、设置分发版版本

可打开 PowerShell 命令行并输入以下命令(仅在 Windows 内部版本 18362 或更高版本中可用),检查分配给每个已安装的 Linux 分发版的 WSL 版本:

wsl -l --all -v
  • 1

或者

wsl --list --all --verbose
  • 1

若要将分发版设置为受某一 WSL 版本支持,请运行:

wsl --set-version <distribution name> <versionNumber>
或者
wsl -s <distribution name> <versionNumber>
  • 1
  • 2
  • 3

请确保将 <distribution name> 替换为你的分发版的实际名称,并将 <versionNumber> 替换为数字“1”或“2”。 可以随时更改回 WSL 1,方法是运行与上面相同的命令,但将“2”替换为“1”。

从 WSL 1 更新到 WSL 2 可能需要几分钟才能完成,具体取决于目标分发版的大小。 如果从 Windows 10 周年更新或创意者更新运行 WSL 1 的旧(历史)安装,可能会遇到更新错误。 按照这些说明卸载并删除任何旧分发

如果 wsl --set-default-version 结果为无效命令,请输入 wsl --help。 如果 --set-default-version 未列出,则表示你的 OS 不支持它,你需要更新到版本 1903(内部版本 18362)或更高版本。 如果你在使用 ARM64 版本 19041,那么当使用 PowerShell 时,此命令可能会失败;在这种情况下,你可使用命令提示符,而不是发出 wsl.exe 命令。

运行命令后如果看到此消息:WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel。 仍需要安装 MSI Linux 内核更新包(见上文)。

此外,如果要使 WSL 2 成为你的默认体系结构,可以通过此命令执行该操作:

wsl --set-default-version 2
  • 1

这会将安装的任何新分发版的版本设置为 WSL 2。

3.7 安装WSL的systemd命令(可选)

由于 Linux 环境应用程序(如Ubuntu,Debian,OpenSuse或Kali)不支持为Linux操作系统提供基本构建块的 Systemd,使用的是经典的SysV init(sysvinit)系统,因此我们无法使用 reboot 或使用 systemctl 命令来管理 systemd 服务。

在 WSL 中可以用SysV init的命令代替 systemd 命令

systemd 还是很重要的(例如:不安装可能会导致下面图形化界面安装失败)。如果需要,可通过以下方式安装:

  1. 安装git

    sudo apt install git
    
    • 1
  2. 运行脚本和命令

    git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
    cd ubuntu-wsl2-systemd-script/
    bash ubuntu-wsl2-systemd-script.sh
    
    • 1
    • 2
    • 3
  3. 然后重新启动 ubuntu shell 并尝试运行 systemctl

    systemctl
    
    • 1

如果报错:System has not been booted with systemd as init system (PID 1). Can’t operate.

root@DESKTOP-58FD2RV:/home# systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
  • 1
  • 2
  • 3

解决办法:

# 安装daemonize
sudo apt-get install daemonize

#执行以下命令开启

sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target

exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.8 可能出现的问题

3.8.1 参考的对象类型不支持尝试的操作(参考问题)
  • 问题:从terminal启动ubuntu1804报错:参考的对象类型不支持尝试的操作。直接启动ubuntu,出现1804报错

    解决办法:以管理员身份打开”Windows PowerShell“,然后执行 netsh winsock reset,然后继续操作(如果还是不行,重启电脑即可)

    操作前记得备份数据,因为可能会丢失docker的镜像容器数据

3.8.2 关于Hyper-V是否需要开启

问题:Windows 10 安装了 wsl2,整个安装过程是不需要启用 Hyper-V,但是网络很多的讨论和教程都提到说 wsl 2 用的时 Hyper-V。

官方文档有提到

WSL 2 is available on all SKUs where WSL is currently available, including Windows 10 Home.

The newest version of WSL uses Hyper-V architecture to enable its virtualization. This architecture will be available in the 'Virtual Machine Platform' optional component. This optional component will be available on all SKUs. 
  • 1
  • 2
  • 3

就是说,WSL 的最新版本使用 Hyper-V 架构来实现虚拟化,该架构可用在“虚拟机平台”可选组件中。因为这个”虚拟机平台“就是一个精简版的 Hyper-v,所以开启“虚拟机平台”即可。

3.8.3 关于Windows 10 家庭版能否安装WSL2的问题

Windows 10 家庭版上没有 Hyper-V 功能。所以网上很多教程都提到需要安装 Hyper-V,这是不对的。

官方解释:WSL 2 在可使用 WSL 的所有桌面 SKU 上都可使用,包括 Windows 10 家庭版。

官方原文:关于适用于 Linux 的 Windows 子系统的常见问题解答 | Microsoft Docs

3.8.4 WSL 转换到版本 2 失败

如果显示错误消息,例如“转换失败”或“错误 0x03a001a 由于虚拟磁盘系统限制,无法完成请求的操作。虚拟磁盘文件必须是未压缩和未加密的,并且不能是稀疏的。”,请尝试检查以下内容。

  • 重新启动系统。
  • 必须在 BIOS 中启用虚拟化扩展,例如 Intel VT-x 或 AMD-V。
  • 必须为 Ubuntu AppData 文件夹禁用压缩和加密(请参阅Github 问题 #4103)。路径看起来像这样。

再次尝试将发行版转换为版本 2,操作应该会成功。

3.8.5 WslRegisterDistribution failed with error: 0x800701bc

造成该问题的原因是WSL版本由原来的 WSL1 升级到 WSL2 后,内核没有升级,前往微软WSL官网下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更新包即可。

3.8.6 其他错误

可参考官方文档 关于适用于 Linux 的 Windows 子系统的常见问题解答 | Microsoft Docs

博客:WSL2 网络异常排查 [ping 不通、网络地址异常、缺少默认路由、被宿主机防火墙拦截]

四、WSL2使用帮助

4.1 网络访问方式(IP)

官方文档:使用 WSL |访问网络应用程序微软文档 (microsoft.com)

注意:在使用win10的wsl2子系统时,windows会通过虚拟交换机给win10本机wsl2子系统各自会分配一个ip地址。

18945之前的WSL2版本,如果我们在容器里运行了一个网络服务,例如启动一个WEB服务。想在 Win10 宿主机中访问这个WEB服务,我们先要通过 ip aifconfig 命令查看其IP地址才能访问,而且更崩溃的是每次重启后再运行WSL2容器,虚拟交换机会被重新创建,其IP地址和网关会重新分配。

但在版本18945之后,支持通过localhost访问WSL2容器,所以我们不用考虑这个问题了(有些博客更新不及时,容易误导新手)。

附上官方发行文档:微软WSL官方发行版本说明

注:可使用以下命令之一获取IP地址

ip addr | grep eth0
ifconfig 
  • 1
  • 2

如果非要固定IP,参考链接:WSL2固定ip地址

4.2 文件系统

WSL2中使用虚拟硬件磁盘来存储文件,在Windows下不能像WSL1一样直接访问C盘中的地址。

建议先浏览官方文档:跨文件系统|工作微软文档 (microsoft.com)

需要在Windows下访问Ubuntu的文件系统的话,可以有两种方式:

  1. 在Linux中运行 explorer.exe .

    可以立即打开Linux当前所在的文件目录,注意:.exe后面还有个空格后面再加一个点

  2. 在windows 的资源管理器的文件路径里、命令行窗口或者PowerShell中运行 \\wsl$\ubuntu,可以立即打开Linux当前所在的文件目录

  3. 添加网络映射的形式添加

4.2.1 设置软连接快捷访问(可选)

你应该注意到了,当进入wsl2 后,默认处于 /mnt/c/Users/wys

查询磁盘,可以发现wsl2的文件结构有点特别,原先windows 系统的C盘和D盘被挂载到 /mnt 下,而且还多了一个 wsl 目录。

root@DESKTOP-58FD2RV:/# ls
bin   dev  home  lib    lib64   lost+found  mnt  proc  run   snap  sys  usr
boot  etc  init  lib32  libx32  media       opt  root  sbin  srv   tmp  var
root@DESKTOP-58FD2RV:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        251G  1.2G  238G   1% /
tmpfs           6.3G     0  6.3G   0% /mnt/wsl
tools           171G  136G   36G  80% /init
none            6.3G     0  6.3G   0% /dev
none            6.3G   12K  6.3G   1% /run
none            6.3G     0  6.3G   0% /run/lock
none            6.3G     0  6.3G   0% /run/shm
none            6.3G     0  6.3G   0% /run/user
tmpfs           6.3G     0  6.3G   0% /sys/fs/cgroup
C:\             171G  136G   36G  80% /mnt/c
D:\              67G   24G   43G  36% /mnt/d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

而Ubuntu的文件,因为通过Microsoft Store安装的,默认在c盘,所以为了避免占用C盘空间,我用软连接,快捷访问D盘。在D盘中创建目录 mnt/d/wsl/Ubuntu ,以后的文件都放在这里。然后在wsl2 中直接访问 /home/ubuntu 即可,这样比较符合linux操作习惯。当然如果不闲麻烦,也可以每次手动进入D盘。

ln -s /mnt/d/wsl/ubuntu /home/ubuntu

root@DESKTOP-58FD2RV:/# ll /home/
total 12
drwxr-xr-x  3 root root 4096 Apr 27 17:33 ./
drwxr-xr-x 19 root root 4096 Apr 26 16:29 ../
lrwxrwxrwx  1 root root   18 Apr 27 17:33 ubuntu -> /mnt/d/wsl/ubuntu//
drwxr-xr-x  3 ycw  ycw  4096 Apr 27 13:19 ycw/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

五、安装Docker

凭借原生 Linux 内核,WSL2 拥有接近原生的文件系统性能,这导致 Docker 宣布其即将推出的Windows Docker版本将利用 WSL2而不是它目前依赖的 Moby Linux VM 在 Hyper-V 中运行 Linux 容器。您不再需要等待 Docker for Windows 启动其 VM。根据 Docker 的说法,WSL2 和 Docker 守护进程在他们的开发笔记本电脑上在 2 秒内启动,这意味着 WSL2 可以在容器启动的同时启动(而不是在启动时)。作为一个额外的好处,从容器到 Windows 主机的绑定挂载将不再依赖于 Samba 服务,而是由 WSL2 以更好的性能本地处理。

三种安装选项

因为 wsl 2 已经完整使用了 linux 内核了,所以现在有三种安装选项,主要是前两种

  • 安装Docker Desktop for Windows(设置wsl2访问)可以参考教程docker官方文档以及Microsoft WSL官方文档
  • 直接在Linux中安装Docker ce(此种方式和在linux虚拟机安装docker类似)可以参考Docker官方文档
  • Docker Toolbox for Windows(兼容Windows 10以下安装的方式,这里不讨论这种方式,不推荐

5.1 原生linux安装docker

因为wsl2已经完整使用了linux内核了,此种方式和先前在linux虚拟机安装docker类似,可以参考我之前的博客

阿里云社区Docker ce安装流程

linux安装方式有很多,这里将使用sh脚本形式来安装

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start
  • 1
  • 2
  • 3

执行脚本安装过程中,脚本提示“建议使用Docker Desktop for windows”,20s内按Ctrl+C会退出安装,所以需要等待20s,另外此种方式需要访问外网。

检查docker安装正常

# 检查dockerd进程启动
service docker status
ps aux|grep docker
# 检查拉取镜像等正常
docker pull busybox
docker images
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:不同于完全linux虚拟机方式,WLS2下通过apt install docker-ce命令安装的docker无法启动,因为WSL2方式的ubuntu里面没有systemd。上述官方get-docker.sh安装的docker,dockerd进程是用ubuntu传统的init方式而非systemd启动的。

vim /lib/systemd/system/docker.service

### 修改文件
[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
### 上面这一行,主要是增加了`-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock`


1. vim /etc/default/docker

2. 修改启动配置文件,如下:

# 开启远程访问 -H tcp://0.0.0.0:2375
# 开启本地套接字访问 -H unix:///var/run/docker.sock
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

重启Docker
sudo service docker restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5.2 Docker Desktop for Windows(推荐)

Docker 也专门开发了可以使用 WSL2 中的 Docker 守护进程的桌面管理程序,具体请查看docker官方文档 Docker Desktop WSL 2 backend (opens new window),打开 Docker Desktop WSL2 backend 页面,查看是否满足安装要求,然后下载最新的 Docker Desktop for Windows 程序 ,建议下载 stable 版本。

5.2.1 准备修改Docker Desktop软件默认安装路径(可选)

win10安装 docker desktop 时,没有提供选择权限,默认直接就安装到了c盘。我们可以修改默认安装路径,但是注意,这里只是修改了这个应用的程序安装位置而已,镜像和容器等数据还是默认存储在C盘。如果要修改镜像和容器等数据存储位置,下文有介绍。

网上总结的方法目前只有一种,就提前将c盘的docker安装路径软连接到其他盘,具体操作如下:

  1. 现在先建立Docker文件夹,例如 D:\software\Docker

  2. 如果已经安装的,需要去控制面板里先卸载

  3. 然后在命令提示符执行下边的命令(注意:需要管理员身份运行命令提示符)

    mklink /j "C:\Program Files\Docker" "D:\software\Docker"
    
    • 1

    成功如下

  4. 最后通过下一步 [[#5.2.2 开始安装]]安装完后,可以发现 docker desktop 已经安装到了d盘

5.2.2 开始安装

官方文档:Install Docker Desktop on Windows | Docker Documentation

  • 手动下载安装

    点击以下 [链接 (opens new window)](https://desktop.docker.com/win/stable/amd64/Docker Desktop Installer.exe)下载 Docker Desktop for Windows。下载好之后双击 Docker Desktop Installer.exe 开始安装。

  • 使用 winget (opens new window) 安装(未测试)

    winget install Docker.DockerDesktop
    
    • 1

    下载后直接安装,(为了避免不可预知的问题,最好用右键“以管理员身份运行”)。跟随安装界面,一路下一步即可。所有的选项都采用默认。安装成功后,点击“Close”关闭窗口。

安装成功后,启动Docker Desktop,然后在终端窗口执行命令检测是否安装成功

# 查询版本
docker version
# 查询详细信息
docker info
  • 1
  • 2
  • 3
  • 4
5.2.3 在 WSL2 运行 Docker

若你的 Windows 版本为 Windows 10 专业版或家庭版 v1903 及以上版本或 Windows 11,可以使用 WSL2 运行 Docker。

注意,这个时候在 WSL 里面执行 docker 命令是找不到的,需要设置一下。

  1. 打开 Docker Desktop Settings,选择General

    勾选Use WSL 2 based engine。(如果在已经支持WSL的操作系统上,安装Docker Desktop,那么这个选项是被默认选中的,无需更改。)

    注意,如果不选中Use WSL 2 based engine,Resources下面就会回到之前版本的模样。自己制定CPU、内存等信息。但是该版本指定这些信息会出错(这是给WSL 1 用的)。

  1. 进入 Settings > Resources > WSL Integration

    在这个界面中,选择任何你想要使用的Linux发行版本(手动选择后,可以在Linux中来操作Docker)。

    点击 Apply & Restart

  2. 重启 Docker desktop for Windows,重启完成后我们就可以在 WSL2里面使用 docker 命令了

在WSL2里面执行 df -Th ,会发现增加了一些新的与docker有关的挂载点。

5.2.4 修改镜像和容器等数据存储位置(可选)

因为我使用的是WSL2的版本,docker 运行数据都在 WSL 发行版中,文件位置都只能由 WSL 管理。因此 docker desktop 在安装的时候创建如下两个发行版(distro)

  • docker-desktop
  • docker-desktop-data

说明

这两个wsl子系统默认存放在系统盘(即使通过上文修改了Docker Desktop的安装路径),默认存储位置: %LOCALAPPDATA%/Docker/wsl (即 C:\Users\xxxxx\AppData\Local\Docker\wsl)。如果访问 %LOCALAPPDATA%/Docker/wsl 目录,就可以看到两个文件夹,同时每个文件夹中都会有一个 vhdx 文件。

  • data/ext4.vhdx 是被 docker-desktop-data 发行版使用,存放镜像
  • distro/ext4.vhdx 是被 docker-desktop 发行版使用,存放程序(内存占用小,根据需要,可以不用修改)

docker-desktop-data 是被用来存储docker images 以及相关的数据。因此,它的大小会随着使用逐步增长,因此导致系统盘空间不足。

vhdx文件最大支持256G,超过此大小,则可能需要对其进行扩展。参见:扩展 WSL 2 虚拟硬盘|的大小微软文档 (microsoft.com)

修改方法如下:

  • 方法一:通过 wsl 命令进行操作

    # 查看已创建子系统
    C:\Users\xxxxx>wsl -l -v --all
      NAME                   STATE           VERSION
    * Ubuntu                 Running         2
      docker-desktop-data    Running         2
      docker-desktop         Running         2
    
    # 终止所有正在运行的docker发行版
    # 可以使用以下命令立即终止所有正在运行的发行版,包括Ubuntu,可以手动退出Docker Desktop也行
    C:\Users\xxxxx>wsl --shutdown
    
    # 再次查看,保证docker发行版也停止运行,
    C:\Users\xxxxx>wsl -l -v
      NAME                   STATE           VERSION
    * Ubuntu                 Running         2
      docker-desktop-data    Stopped         2
      docker-desktop         Stopped         2
    
    # 备份导出wsl子系统镜像(注意,根据官方说明,最好在停止发行版8秒后,再来操作)
    C:\Users\xxxxx>wsl --export docker-desktop E:\Docker\wsl\docker-desktop\docker-desktop.tar
    # 注意,原有的 docker images 也会一起导出
    C:\Users\xxxxx>wsl --export docker-desktop-data E:\Docker\wsl\docker-desktop-data\docker-desktop-data.tar
    
    # 注销删除现有的wsl子系统,注销过后会发现原来在c盘的ext4.vhdx文件已经删除了
    C:\Users\xxxxx>wsl --unregister docker-desktop
    正在注销...
    C:\Users\xxxxx>wsl --unregister docker-desktop-data
    正在注销...
    
    # 重新创建wsl子系统
    C:\Users\xxxxx>wsl --import docker-desktop E:\Docker\wsl\docker-desktop E:\Docker\wsl\docker-desktop\docker-desktop.tar --version 2
    C:\Users\xxxxx>wsl --import docker-desktop-data E:\Docker\wsl\docker-desktop-data E:\Docker\wsl\docker-desktop-data\docker-desktop-data.tar --version 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    根据需要,设置默认分发版(可选,因为我是默认使用Ubuntu,所以不执行)

    wsl -s docker-desktop
    
    • 1

    重新启动 docker desktop,验证docker服务是否可以正常使用。查看新目录中的vhdx的修改时间,如果修改时间是最新时间,就说明配置成功。然后随便拉个nginx下来启动试试。

    验证成功后,上面导出的两个文件根据自己需要进行删除。

    del E:\docker\wsl\docker-desktop\docker-desktop.tar
    del E:\docker\wsl\docker-desktop-data\docker-desktop-data.tar
    
    • 1
    • 2
  • 方法二:通过软链接(未测试)

    1. %LOCALAPPDATA%/Docker/wsl/data 下的 ext4.vhdx 复制到想要的路径下,本文路径为:E:\Docker\wsl\docker-desktop-data

    2. 删除源文件夹,本文是 %LOCALAPPDATA%/Docker/wsl 下的 data 文件夹

    3. 以管理员运行cmd并且使用以下命令创建链接:

      mklink /J C:\Users\xxxxx\AppData\Local\Docker\wsl\data E:\Docker\wsl\docker-desktop-data
      
      • 1

      请大家自行替换路径,本文路径分别为源路径:C:\Users\Administrator\AppData\Local\Docker\wsl\data,以及想要移动的路径:E:\Docker\wsl\docker-desktop-data ,此时可以在源路径看到新建出来的软链接文件夹

    4. %LOCALAPPDATA%/Docker/wsl/distro下的 ext4.vhdx 也是同样的操作,这里不重复介绍

    5. 重新启动 docker desktop,验证docker服务是否可以正常使用。查看新目录中的vhdx的修改时间,如果修改时间是最新时间,就说明配置成功。然后随便拉个nginx下来启动试试。

  • 总结网上的其他方法(这些方法感觉不是很靠谱,未测试。有测试过的同行,麻烦踢我一下)

    • 方法一:打开docker desktop 的 Settings,点击左侧 menu,找到 Resources 按钮,点击并找到 Disk Image Location,然后进行修改(这种方法有很多人找不到这个选项,是因为Docker 被WSL2管理,不允许修改)

    • 方法二:打开docker desktop 的 Settings,点击左侧 Docker Engine,修改配置文件,添加 graph 属性(操作很简单,但我不想测试了)

    参考博客:windows10 docker 安装在D盘

5.2.5 Docker + WSL 2使用手册

官方文档:Docker Desktop for Windows 用户手册|Docker 文档

这里给出一点建议

  1. 使用 Docker 和 WSL 2 进行工作或者开发应用程序。建议使用Linux 容器,这样在 Linux 发行版中,也能方便使用 Docker 。

  2. 如何访问 windows containers 中的数据库或者网站呢?用容器ip访问

  3. 如何访问 linux containers 中的数据库或者网站呢?

    如果是宿主机访问容器:用localhost、127.0.0.1、宿主机局域网ip

    如果是局域网中其他客户端访问:用宿主机局域网ip

5.3 两种安装方式总结

  1. WSL2下原生linux安装docker方式和完全linux虚拟机安装docker类似,区别在于WSL2下的linux不支持systemd。

  2. Docker Desktop for windows方式,其实质是利用docker的C/S架构,将windows模式下的docker对应docker.sock,docker客户端二进制和docker的数据目录挂载到WSL2里面的linux机器,在此linux机器下执行docker命令(docker命令为docker客户端),实质为客户端通过挂载的 /var/run/docker.sock 文件与windows里面的dockerd服务端进程通信。如下图,我们在linux下重新启动linux下dockerd进程,linux模式下下载的busybox镜像又可以看到了,/var/run/docker.sock 的时间戳也被更新了,此时客户端通过 /var/run/docker.sock 文件与linux下的dockerd服务端通信。

    Docker for Desktop 里 Windows ContainerLinux Container 两种 docker 容器化运行时,两种运行时不能同时使用,可以切换,切换过程中数据是不会丢失的,你不可以在 windows container 环境下操作 linux container 的镜像与容器,更不能在 linux container 环境下操作 windows container 的镜像和容器,两者架构上不一致。

    要使用哪个模式下的docker,重启下该模式下的docker服务端即可,本质都是修改 /var/run/docker.sock 文件。理论可以同时使用,但是需要修改docker配置,通过 -H 参数增加dockerd的tcp监听,执行具体docker命令时指定dockerd监听的对应IP和端口即可。

    切换操作如下,右键点击图标,可以切换 containers,**默认安装完就是 Linux Container ,不推荐使用 Windows containers **。

    有些是因为系统版本不太行,不能选择 Windows containers(下图是本人很早时候安装出现的情况)

    windows terminaldocker ps 命令在windows和ubuntu中查看容器进程,查到的结果是一样的。

最后,就可以在win 10 下使用各种 linux 子系统了, 也可以在 win10 和 linux 下使用 docker 和以及 kubernetes 啦。

5.4 检查 WSL 模式

确保Linux发行版本是运行在WSL 2 模式下。WSL 在V1 和 V2 两种模式下都可以运行

首先在 Windows PowerSell 中,输入:

wsl -l -v
  • 1

就可以查看到,多了 docker desktop 的信息。(因为我是安装的Docker Desktop for Windows

PS C:\Users\wys> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
  • 1
  • 2
  • 3
  • 4
  • 5

如果现有的 WSL 是v1,通过下面的命令可以升级为 v2:

wsl --set-version (distro name) 2
  • 1

想要把 v2 设置为默认模式,可以通过下面的命令:

wsl --set-default-version 2
  • 1

开始使用!

在Windows CMD中,通过命令随便运行几个容器。在Linux中,就可以查看到已经运行的容器信息。

5.5 配置镜像加速器(阿里云)

安装 Docker 软件后,可以直接通过 docker pull 命令拉取镜像。如未配置镜像加速源,直接拉取 DockerHub 中的镜像,通常下载速度会比较慢。这里我将用阿里云镜像加速器。

5.5.1 Docker Desktop for Windows

在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Engine。编辑窗口内的JSON串,填写下方加速器地址:

{
  "registry-mirrors": ["https://4bj04jx5.mirror.aliyuncs.com"]
}
  • 1
  • 2
  • 3

编辑完成后点击 Apply 保存按钮,等待 Docker 重启并应用配置的镜像加速器。

5.5.2 Docker ce

这里适用于Ubuntu 和 CentOS

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件 /etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://4bj04jx5.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参考链接:

配置 Docker 镜像加速源地址

阿里云镜像加速

5.6 可能出现的问题

  • docker for windows could not read CA certificate

    问题原因:之前安装过 docker toolbox

    解决步骤:

    1. 删掉四个docker 的环境变量
    2. 执行cmd命令 docker-machine rm default
    3. 以管理员身份执行cmd命令 @FOR /f “tokens=*” %i IN (‘docker-machine env -u’) DO @%i
  • Filesharing has been cancelled

    安装成功后,可能用到docker-compose,对于新手,这部分可能会遇到麻烦。

    问题原因:当前创建的目录没有加入到文件分享当中,导致操作被取消(如果开启WSL 2就没有这个问题)

    解决步骤:

    1. Docker Desktop -> Settings -> Resources -> File Sharing
    2. 将当前项目目录或项目的父级目录(根目录或上几级)添加进去
    3. Apply & Restart
    4. Docker Desktop -> Restart
  • Ubuntu22.04 Dokcer 安装 mysql8.0 失败,日志如下:mysqld: Cannot change permissions of the file ‘ca.pem’ (OS errno 1 - Operation not permitted)

    root@LAPTOP-LHBT0GVK:/home/dockerdata/mysql8.0# docker logs mysql8.0
    2022-10-17 16:24:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
    2022-10-17 16:24:27+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
    2022-10-17 16:24:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
    2022-10-17 16:24:27+08:00 [Note] [Entrypoint]: Initializing database files
    mysqld: [Warning] World-writable config file '/etc/my.cnf' is ignored.
    2022-10-17T08:24:27.814101Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.27) initializing of server in progress as process 43
    2022-10-17T08:24:27.823718Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
    2022-10-17T08:24:27.831806Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
    2022-10-17T08:24:29.447600Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
    mysqld: Cannot change permissions of the file 'ca.pem' (OS errno 1 - Operation not permitted)
    2022-10-17T08:24:31.139785Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for ca.pem
    2022-10-17T08:24:31.139843Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
    2022-10-17T08:24:31.140179Z 0 [ERROR] [MY-010119] [Server] Aborting
    2022-10-17T08:24:32.831797Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27)  MySQL Community Server - GPL.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在 WSL2 发行版中创建。/etc/wsl.conf,输入以下内容

    [automount]
    options = "metadata"
    
    • 1
    • 2

    保存()并重新启动 WSL

    # 关闭所有的wsl
    wsl --shutdown
    # 启动wsl
    wsl
    
    • 1
    • 2
    • 3
    • 4

    参考:Docker安装MYSQL无法运行的天坑 mysqld: Can’t read dir of ‘/etc/mysql/conf.d/’ (OS errno 13 - Permission den…

六、安装桌面环境(可选)

补充:实在没有必要在WSL 中安装桌面环境和输入法等等,感觉就很另类,而且不实用,别整这些花里胡哨的。我写这个流程,单纯是因为公司需要桌面环境,所以尝试了一下,反正我最后卸载了。

6.1 介绍

WSL 2是为开发人员准备的命令行工具,今天突然在官网发现,WSL 2已经支持原生GUI,但有先决条件。

  • 需要 Windows 11 版本22000或更高 版本才能访问此功能。 可以加入 Windows 预览体验计划,以获取最新的预览版。

  • 安装了 vGPU 的驱动程序

    若要运行 Linux GUI 应用,你应该首先安装与你的系统匹配的预览驱动程序。 这使你能够使用虚拟 GPU (vGPU) 以便你可以从硬件加速 OpenGL 呈现中获益。

这里我的电脑系统比较老,同时不愿意加入预览体验计划(不想踩坑),而且也不愿意加入升级 Windows 11(还是不想踩坑),所以不尝试这种方法。有需要的可以参考博客:WSL 2 GUI 原生支持!

因为桌面环境可以在WSL2内部运行,我们可以使用适用于 Windows 的 X 服务器来侦听 Linux 中的 X11(图形)程序。实现原理是,远程桌面启动监听服务用于监听,WSL启动程序后把界面数据发送给远程桌面软件,远程桌面软件接收到数据进行绘制,于是在Win下看到图形界面。

安装流程总共分为三步

  • 安装远程桌面服务(xrdp,Xming或VcXSrv)

  • 安装X11(图形)程序(xfce4,xubuntu-desktop,ubuntu-desktop)

  • 进行配置设置

以下是我找到的大部分方案:

  • 直接安装 xfce4 ,然后设置 xrdp 远程连接,参考这个B站视频教程xfce4 是一个轻量级桌面环境,推荐这个。

  • 安装 xubuntu-desktop ,然后设置 xrdp 远程连接,参考这个教程xubuntu 桌面相当于 xfce4 桌面加上一些小工具。

  • 安装 ubuntu-desktop,使用 X Server,参考:WSL 使用指南——04 安装桌面环境

  • 安装 ubuntu-desktop,并使用 VcXsrv 显示服务器程序显示。参考这个教程

    • 注意这个教程在 WSL2 下 ubuntu18.04LTS 中没有问题。但安装 ubuntu20.04LTS 桌面环境可能会失败。据说是因为 gnome 桌面是基于 systemd,而 WSL 不支持 systemd,所以需要先安装 systemd。操作流程参考流程[[#2.3.4 安装WSL的systemd脚本]]。

6.2 开始

本人安装的WSL 分发版是 Ubuntu 20.04.3 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64) ,准备采用第一种方法xfce4 + xrdp

6.3 源更新与升级依赖

设置国内源,这里省略,可参考流程[[#2.3.3 修改ubuntu的apt安装源]]

sudo apt update
sudo apt upgrade
  • 1
  • 2

6.4 安装桌面环境

在 Ubuntu 源仓库有很多桌面环境供你选择。一个选择是安装 Gnome,它是 Ubuntu 20.04 的默认桌面环境。另外一个选项就是安装 xfce。它是快速,稳定,并且轻量的桌面环境,使得它成为远程服务器的理想桌面。

不同的桌面环境,可以参考文章Ubuntu & XFCE vs Xubuntu区别介绍

6.4.1 安装xfce4
sudo apt install xfce4
  • 1

安装 xfce4 过程中,会弹框出现选择显示管理DM选择 gdm3lightdm 的提示,建议选择 lightdm

如果错过了安装过程中出现的这个向导,那么可以在安装完成后执行下面的命令重新设置DM

sudo dpkg-reconfigure lightdm
  • 1

6.5 为当前用户指定登录session类型

注意这一步很重要,如果不设置的话会导致后面远程桌面连接上闪退

$ vim ~/.xsession

# 写入下面内容(就一行)
xfce4-session
  • 1
  • 2
  • 3
  • 4

或者一步到位

sudo echo xfce4-session > ~/.xsession
  • 1

这是告诉系统,开启桌面环境的时候用 xfce4-session

完成后,执行下面这段代码就可以看到桌面的图形界面了。

xfce4-session
  • 1

6.6 安装远程桌面服务

补充:如果想连接虚拟机或者双系统里面的Ubuntu,同样可以参考此流程。

Xrdp 是一个微软远程桌面协议(RDP)的开源实现,它允许你通过图形界面控制远程系统。通过 RDP,你可以登录远程机器,并且创建一个真实的桌面会话,就像你登录本地机器一样。

6.6.1 安装xrdp

Xrdp 被包含在默认的 Ubuntu 软件源中。想要安装它,运行:

sudo apt-get install xrdp
  • 1

一旦安装完成,Xrdp 服务将会自动启动。你可以输入下面的命令,验证它:

sudo systemctl status xrdp
  • 1

如果提示找不到该命令,那是没有安装 systemd 命令。参考[[#2.3.4 安装WSL的systemd命令]]

输出将会像下面这样:

● xrdp.service - xrdp daemon
     Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-11-02 17:36:16 UTC; 2min 27s ago
  ...
  • 1
  • 2
  • 3
  • 4

默认情况下,Xrdp 使用/etc/ssl/private/ssl-cert-snakeoil.key,它仅仅对“ssl-cert” 用户组成语可读。运行下面的命令,将xrdp用户添加到这个用户组:

sudo adduser xrdp ssl-cert  
  • 1

重启 Xrdp 服务,使得修改生效:

sudo systemctl restart xrdp
  • 1

就这样。Xrdp 已经在你的 Ubuntu 服务器上安装好了,你可以开始使用它了。

6.6.2 修改xrdp配置

Xrdp 配置文件定位在/etc/xrdp目录。对于基本的 Xrdp 连接,你不需要对配置文件做任何改动。

主要的配置文件被命名为 xrdp.ini。这个文件被分成不同的段,允许你设置全局配置,例如安全,监听地址,创建不同的 xrdp 登录会话等。

修改默认端口

由于 xrdp 安装好后,默认配置使用的是和Windows远程桌面相同的 3389 端口,为了防止和Windows系统远程桌面冲突,建议修改成其他的端口。(虚拟机和双系统可忽略

$ sudo vim /etc/xrdp/xrdp.ini
# 修改下面这一行,将默认的3389改成其他端口即可
port=3390
  • 1
  • 2
  • 3

或者

sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
  • 1

修改图像设置(可选)

sudo vim /etc/xrdp/xrdp.ini
  • 1

max_bpp=32 修改为128(最大位图深度)

#xserverbpp=24 修改为128,取消注释‘#’。

设置连接会话进程是否保留

sudo vim /etc/xrdp/sesman.ini
  • 1

KillDisconnected的值修改为 true,保存退出。这样每次断开连接时,linux都会关闭会话进程,连接数量达到上限,出现问题。

设置 Xrdp 连接的桌面环境

Xrdp 使用默认的 X Window 桌面环境(Gnome or XFCE)。Xrdp 使用 startwm.sh 文件启动 X 会话。如果你想使用另外一个 X Window 桌面,编辑这个文件。

sudo vim /etc/xrdp/startwm.sh
  • 1

用#注释末尾两行test和exec:

test -x /etc/X11/Xsession && exec /etc/X11/Xsession exec /bin/sh
/etc/X11/Xsession
  • 1
  • 2

添加一行

startxfce4

# 如果你是装的虚拟机或者双系统Ubuntu桌面版(即桌面环境默认是ubuntu-desktop,Unity桌面),则这里就添加gnome-session
  • 1
  • 2
  • 3

不管什么时候你对配置文件做出修改,你需要重启 Xrdp 服务。

6.6.3 重启一下电脑

本人测试发现,这里需要重启电脑主机,不然可能报错,重启后再启动xrdp。大家可以先跳过这步试试,不行再重启电脑。

6.6.4 启动xrdp

由于WSL2里面没有 systemd ,所以需要手动启动

sudo /etc/init.d/xrdp start
  • 1

或者可以安装 systemd ,参考步骤[[#2.3.4 安装WSL的systemd脚本]]

sudo service xrdp restart
  • 1
6.6.5 查看IP地址
ip a
  • 1

eth0 项中,inet 后面的地址记下来。

6.7 远程连接

按下 windows + R 键,输入 mstsc 打开远程桌面连接

在计算机(Computer)栏输入刚才记下的ip地址及端口3390,或者地址输入localhost:3390,注意这里的端口号应当与上面修改配置中一致。用户名可填可不填,因为之后会提示填写,或者输入 WSL 2 中使用的账号密码

如果连接不上,可以用 telnet 命令测试端口是否开启。如果连接不通,检查 Xrdp 是否启动,同时是否有防火墙设置。

6.7.1 配置防火墙

Xrdp 守护程序在所有的网络接口上默认监听端口3389。如果你在你的 Ubuntu 服务器上运行一个防火墙,你需要打开 Xrdp 端口。

想要允许从某一个指定的 IP 地址或者 IP 范围访问 Xrdp 服务器,例如192.168.33.0/24,你需要运行下面的命令:

sudo ufw allow from 192.168.33.0/24 to any port 3389
  • 1

如果你想允许从任何地方访问(由于安全原因,这种方式不鼓励),运行:

sudo ufw allow 3389
  • 1

想要增加安全,你可以考虑 Xrdp 仅仅监听 localhost,并且创建一个 SSH 隧道,将本地机器的3389端口到远程服务器的同样端口之间的流量加密。

6.8 设置中文以及安装输入法(坑)

本人尝试各种方法,均测试失败,所以下面流程可以跳过。如果有人成功了,麻烦在评论区踢我一脚

6.8.1安装中文语言包

方法一:

sudo dpkg-reconfigure locales
  • 1

然后一直按键盘上的 ↓ 找到 zh_CN UTF-8,然后按空格勾选,再tab切换到ok上回车,接下来的界面选 zh 再回车。
这一步完成后可能会导致键盘不可用,不用激动,点击桌面左上角图标注销后重进就好了。

首次进入中文界面会提示是否重命名那几个文件夹,建议保持英文状态,因为有些路径是写进配置文件了的,重命名会带来不必要的麻烦。

方法二:

sudo apt install language-pack-zh-hans
  • 1
6.8.2 修改默认语言环境为中文

设置本地化环境变量

echo "LANG=zh_CN.UTF-8" >> ~/.profile
  • 1

或者通过 locale-gen

sudo locale-gen zh_CN.UTF-8
  • 1
6.8.3 安装完整的语言支持

打开Applications->Settings->Language Support,按提示安装包就可以。或者执行命令

sudo /usr/bin/gnome-language-selector
  • 1

如果出现闪退,可以在终端中来启动,发现错误:Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

解决办法:

sudo apt-get install dbus

sudo /etc/init.d/dbus start
  • 1
  • 2
  • 3

再次打开语言支持,开始安装

在 system settings->language support->install/remove languages,在弹出的菜单中选择Chinese(simplified),点击apply

为了避免每次重启都得手动运行 dbus,可以在应用程序 - 设置 - 会话与启动 - 应用程序自启动,添加 /etc/init.d/dbus start

6.8.4 安装中文输入法

任选一种

安装中文输入法fcitx-pinyin

参考链接:安装中文输入法

sudo apt install fcitx fcitx-pinyin
echo -e "export XMODIFIERS=@im=fcitx\nexport GTK_IM_MODULE=fcitx\nexport QT_IM_MODULE=fcitx\n" >> ~/.profile
  • 1
  • 2

软件包已装,在应用程序 - 设置 - 会话与启动 - 应用程序自启动,添加 /usr/bin/fcitx

打开系统自带的 Input Method Configuration,直接点击OK、Yes,然后将默认的 ibus 切换为 fcitx,一路OK

搜狗输入法是建立在fcitx框架之上的,所以要将输入法框架选择为fictx,

安装搜狗输入法

官方安装指南

6.9 可能出现的问题

6.9.1 xrdp远程桌面黑屏处理
sudo vim /etc/xrdp/startwm.sh
在上面文件中添加

unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
  • 1
  • 2
  • 3
  • 4
  • 5

添加位置如下图:

重启 xrdp

sudo service xrdp restart

#没效果就用下面的命令:
sudo /etc/init.d/xrdp restart
  • 1
  • 2
  • 3
  • 4
6.9.2 进入图形界面一段时间后黑屏

进入图形界面,点击右上角Applications—>Settings—>Light Locker Settings。

设置 Automatically lock the session 为 Never。

6.9.3 运行一段时间后,出现xrdp_mm_process_login_response: login failed

问题原因:远程桌面没有正确关闭,虽然在windows 系统关闭远程桌面连接,但是在里linux上的进程还在运行,导致连接数量达到上限,出现问题。

解决:通过设置 sesman.in 文件内的参数,解决。

vim /etc/xrdp/sesman.ini
  • 1

可以修改会话设置 :将最大会话限制该大 MaxSessions=50
将KillDisconnected=1;则每次断开连接时,linux都会关闭会话进程。

然后重启/etc/init.d/xrdp restart 就可解决问题

6.10 安装软件

再次提醒先设置好 apt 源,可以手动修改文件,或者从图形界面的设置中进行设置

6.11 安装Chrome

可以直接从软件市场中下载

这种比较方便

命令行安装

  1. 为Google Chrome浏览器创建源列表文件

    sudo vim /etc/apt/sources.list.d/google-chrome.list
    
    • 1
  2. 添加源

    deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main
    
    • 1
  3. 运行以下命令以下载Google的签名密钥

    wget https://dl.google.com/linux/linux_signing_key.pub
    
    • 1
  4. 使用apt-key将其添加到密钥环中,以便包管理器可以验证Google Chrome deb包的完整性

    sudo apt-key add linux_signing_key.pub
    
    • 1
  5. 更新包列表并安装稳定版Google Chrome

    sudo apt update
    
    sudo apt install google-chrome-stable
    
    • 1
    • 2
    • 3
  6. 从命令行启动Chrome浏览器

    google-chrome-stable
    
    如果提示Running as root without --no-sandbox is not supported.
    这是因为当前是root用户下安装的,所以无法打开,而非root用户上启动下,肯定能启动起来。
    
    可以在启动命令后增加“–no-sandbox”
    /usr/bin/google-chrome-stable –no-sandbox
    
    如果不想一直使用命令启动,可以在 /usr/share/applications中找到Chrome的快捷方式,然后右键在其properties中command中增加”–no-sandbox”即可。从此以后,就可以直接在Search中找到Chrome进行启动了,或者将快捷方法发送到桌面来启动。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

七、Ubuntu配置远程SSH登录

局域网电脑如果想远程连接另一台Windows电脑上的WSL2 Ubuntu,网络需要经过PC1 -> PC2(Windows)->PC2(WSL2-Ubuntu)。所以需要经过三个步骤:

  1. WSL的Ubuntu安装ssh-server
  2. 设置Windows主机的端口转发
  3. 开启Windows防火墙端口规则

7.1 WSL的Ubuntu安装ssh-server

WSL2下的Ubuntu默认是支持SSH的,支持默认不被开启。需要开启的,需要手动编辑下SSH服务的配置文件。

首先查询一下是否已经安装openssh-server(一般默认已经安装了)

sudo apt install openssh-server
  • 1

然后修改Ubuntu子系统 /etc/ssh/sshd_config 配置文件

vi /etc/ssh/sshd_config
  • 1

进入之后,修改如下几行配置

  • Port = 22 去掉这行的#,代表启用端口号22
  • ListenAddress 0.0.0.0 去掉这行的#,代表监听所有地址
  • PasswordAuthentication yes,将这行的 no 改成 yes,代表支持账号密码形式的登录
  • #PermitRootLogin prohibit-password 意思是允许root登录,但是禁止root用密码登录,所以保持默认,保留这行的#注释。
  • 新增一行PermitRootLogin yes,默认情况下,root用户只支持用RSA登录,所以需要修改配置

设置后,重新启动ssh服务。在Ubuntu子系统中,执行以下命令

sudo service ssh --full-restart
  • 1

如果 ubuntu 下重新启动ssh服务 sudo service ssh restart,报如下错误:

root@LAPTOP-LHBT0GVK:/etc/ssh# service ssh restart
sshd: no hostkeys available -- exiting.
  • 1
  • 2

解决方法

在 /etc/ssh 路径下输入

ssh-keygen -A
/etc/init.d/ssh start     #完成
  • 1
  • 2

7.2 设置Windows主机的端口转发

安装完重启后,可以使用Windows主机内的shell工具,进行连接测试。首先查询WSL2-Ubuntu的虚拟网卡地址:

ifconfig
或者
ip addr
  • 1
  • 2
  • 3

如上图的虚拟网卡地址为172.22.3.120, 所以在Windows的ssh工具的关键信息如下:

连接地址:172.22.3.120
账户:*User*(Ubuntu的用户名)
密码:*Password*(Ubuntu的用户密码)
端口号:22
  • 1
  • 2
  • 3
  • 4

Windows 自带网络工具 netsh,通过 netsh 可以配置将网络监听到的固定IP地址的固定端口号数据,转发到其他地址。在此会将本机的2222端口转发到WSL2-Ubuntu中为例(Windows本机选用2222的目的是,预留默认的22端口,防止以后其他功能发生冲突),因此按照目前的搭建需求,需要将0.0.0.0:2222的数据转发到172.22.3.120:22。

以管理员权限启动PowerShell,输入以下命令:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.22.3.120 connectport=22
  • 1

参数说明:

标记值listenport:IPv4 侦听端口。
connectaddress:1IPv4 连接地址,这里是2222。
connectport:IPv4 连接端口,这里是172.22.3.120。
listenaddress: IPv4 侦听地址,这里是22。
protocol: 使用的协议。现在只支持 TCP。
说明: 添加通过 IPV4 的 IP4 和代理连接到的侦听项目
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行完成后,调用下面命令查看:

netsh interface portproxy show all
  • 1

7.3 设置Windows防火墙端口规则

防火墙的设置规则,同样使用netsh工具,也同样需要管理员权限运行PowerShell。

netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
  • 1

(也可以在防火墙-高级设置-入站规则中设置)

连接测试:

连接地址:xx.xx.xx.xx(运行WSL的Windows主机地址)
账户:*User*(WSL-Ubuntu的用户名)
密码:*Password*(WSL-Ubuntu的用户密码)
端口号:2222(因为本文使用了2222端口,如果设置为其他,注意修改)
  • 1
  • 2
  • 3
  • 4

完成以上即可连接成功。

如果需要通过公网进行远程ssh连接到WSL,也是可以的,需要在局域网中实现内网穿透。在原有的网络通路加入NAT方法即可,如PC1 -> NAT -> PC2(Windows)-> PC2(WSL2-Ubuntu)

八、问题

  • 参考的对象类型不支持尝试的操作。 Error code: Wsl/Service/0x8007273d [已退出]

    问题原因:Proxifer开发人员解释,原因是Winsock LSP DLL 被加载到其进程中,则wsl.exe将显示此错误。最简单的解决方案是对wsl.exe使用WSCSetApplicationCategory WinAPI 调用来防止这种情况。这会在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog中为 wsl.exe 创建一条记录,这将告诉Windows不要将LSP DLL加载到 wsl.exe 进程中。

    解决步骤:

    方法一临时方案:(每次应用商店 Microsoft Store 版本 WSL 更新时,都会导致这个问题)

    以管理员身份打开”Windows PowerShell“,然后执行 netsh winsock reset,然后继续操作(如果还是不行,重启电脑即可)(操作前记得备份数据,因为可能会丢失docker的镜像容器数据)(已验证确实可以)

    方法二永久方案

    1.先下载nolsp.exe,下载地址1:https://wtto00.github.io/cdn/windows/nolsp.exe,下载地址2:https://files.cnblogs.com/files/turingguo/NoLsp.zip

    2.然后管理员身份打开 powershell

    # 打开nolsp.exe所在目录
    cd E:\Downloads\Other\nolsp.exe
    
    # 执行下面命令
    # 该步骤就相当于添加注册表。
    # 注意:这里的wsl.exe必须是全路径,不能是相对路径
    .\nolsp.exe C:\windows\system32\wsl.exe
    
    # 提示Success!,则操作成功,再打开wsl2 就可以了
    
    # -----------------------------
    # 如果上述命令不行,可以换成下面的命令
    .\nolsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.1.2.0_x64__8wekyb3d8bbwe\wsl.exe"
    .\nolsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.1.2.0_x64__8wekyb3d8bbwe\wslservice.exe"
    # 注意:这里的wsl.exe以及wslservice.exe,必须是全路径,不能是相对路径。(全路径地址,大家自行查询)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这样就可以永久有效了,再也不会报错了!

    可以打开注册表regedit,找到\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog,依次点击此目录的各项,可以找到该注册信息

    至此,就可以打开wsl了。

    如果商店 Microsoft Store 版本 WSL 更新了,需要重新执行一遍此流程

    参考链接:
    win10启动ubuntu报错 参考的对象类型不支持尝试的操作_Chivalrous Expert的博客-CSDN博客

    Winsock 模块中断 WSL2 ·期刊 #4177 ·微软/WSL ·GitHub的

  • 提示:在此 WSL 2 发行版中找不到命令“docker”。我们建议在 Docker 桌面设置中激活 WSL 集成。

    有关将 Docker Desktop 与 WSL 2 结合使用的详细信息,请访问:

    https://docs.docker.com/go/wsl2/

    我已经访问了该链接并按照它提供的所有说明进行操作,从而启用 WSL 与 Ubuntu 的集成,如下所示:

    但是收到的错误仍然是一样的。

    问题原因:不知道什么原因,导致 /usr/bin/docker 是个空目录

    解决步骤:查看/usr/bin/docker是不是一个空目录,先删除掉,然后在Docker Desktop 重新设置一下就好

    # 查看
    ls -l /usr/bin
    
    • 1
    • 2

    下图是正常情况(都是软连接)。

九、WSl 命令参考

命令行官方文档:https://docs.microsoft.com/zh-cn/windows/wsl/basic-commands

以下基本的 WSL 命令以 PowerShell 或 Windows 命令提示符支持的格式列出。 若要通过 Bash/Linux 发行版命令行运行这些命令,必须将 wsl 替换为 wsl.exe

  • 列出已安装的 Linux 发行版

    wsl --list --verbose
    或者
    wsl -l -v
    
    其他选项包括:
    --all(列出所有发行版)
    --running(仅列出当前正在运行的发行版)
    --quite(仅显示发行版名称)。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 列出可用的 Linux 发行版

    查看可通过在线商店获得的 Linux 发行版列表。

    wsl --list --online
    或者
    wsl -l -o
    
    • 1
    • 2
    • 3
  • 设置默认 WSL 版本

    wsl --set-default-version <Version>
    
    • 1

    若要将默认版本设置为 WSL 1 或 WSL 2,请将 <Version> 替换为数字 1 或 2,表示对于安装新的 Linux 发行版,你希望默认使用哪个版本的 WSL。 例如,wsl --set-default-version 2

  • 设置 WSL 版本

    wsl --set-version <distribution name> <versionNumber>
    
    • 1

    若要指定运行 Linux 发行版的 WSL 版本(1 或 2),请将 <distribution name> 替换为发行版的名称,并将 <versionNumber> 替换为 1 或 2。

  • 设置默认 Linux 发行版

    wsl --set-default <Distribution Name>
    或者
    wsl -s <Distribution Name>
    
    • 1
    • 2
    • 3

    若要设置 WSL 命令将用于运行的默认 Linux 发行版,请将 <Distribution Name> 替换为你首选的 Linux 发行版的名称。

  • 通过 PowerShell 或 CMD 运行特定的 Linux 发行版

    wsl --distribution <Distribution Name> --user <User Name>
    
    • 1

    若要通过特定用户运行特定 Linux 发行版,请将 <Distribution Name> 替换为你首选的 Linux 发行版的名称(例如 Debian),将 <User Name> 替换为现有用户的名称(例如 root)。 如果 WSL 发行版中不存在该用户,你将会收到一个错误。 若要输出当前用户名,请使用 whoami 命令。

  • 更新 WSL

    wsl --update
    
    • 1

    手动更新 WSL Linux 内核的版本。 还可以使用 wsl --update rollback 命令回滚到 WSL Linux 内核的上一版本。

  • 检查 WSL 状态

    wsl --status
    
    • 1

    查看有关 WSL 配置的常规信息,例如默认发行版类型、默认发行版和内核版本。

  • Help 命令

    wsl --help
    
    • 1

    查看 WSL 中可用的选项和命令列表。

  • 主目录

    wsl ~
    
    • 1

    ~ 可与 wsl 一起使用,以在用户的主目录中启动。 若要在 WSL 命令提示符中从任何目录跳回到主目录,可使用命令 cd ~

  • 关闭

    wsl --shutdown
    
    • 1

    立即终止所有正在运行的发行版和 WSL 2 轻量级实用工具虚拟机。 在需要重启 WSL 2 虚拟机环境的情形下,例如更改内存使用限制或更改 .wslconfig 文件,可能必须使用此命令。

  • 启动

    wsl
    
    • 1
  • Terminate

    wsl --terminate <Distribution Name>
    
    • 1

    若要终止指定的发行版或阻止其运行,请将 <Distribution Name> 替换为目标发行版的名称。

  • 注销或卸载 Linux 发行版

    wsl --unregister <Distribution Name>
    
    • 1

    通过将 <Distribution Name> 替换为目标发行版的名称,注销或卸载特定发行版。 这会从 WSL 中删除此发行版,并删除所有关联的数据、设置和软件。 还可以像卸载任何其他应用商店应用程序一样卸载 Windows 计算机上的 Linux 发行版应用。

参考链接

【WSL+Docker】新手Win10下的WSL Ubuntu18并使用Docker(两种方式)

WSL(Ubuntu20.04)与其图形界面安装配置

用于 WSL 2 上的 Ubuntu 的 Xfce4 桌面环境和 X 服务器

文章更新日志

  • 2023-11-06 补充可能遇到的问题(解决 wsl 突然不可用问题)
  • 2023-03-31 补充Ubuntu22.04配置远程SSH登录
  • 2022-10-19 补充安装Ubuntu22.04版本遇到的问题
  • 2022-03-03 为每个软件环境安装,增加自定义方案。优化文章结构,更新软件版本变动
  • 2021-05-08 编写文章
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/654289
推荐阅读
相关标签
  

闽ICP备14008679号