赞
踩
WSL官方指南:适用于 Linux 的 Windows 子系统安装指南 (Windows 10)
文档比较详细,而且会持续更新,欢迎大家指错。
本文内容:主要记录WSL2下安装与使用ubuntu,WSL中ubuntu的图形界面的安装,以及对图形界面的调教,还有 Docker 安装。
wsl 是适用于 Linux 的 Windows 子系统(英语:Windows Subsystem for Linux,简称WSL)。是一个为在Windows 10和Windows Server 2019上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层,可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
简单来说,以前想在windows中使用linux,需要安装vmware虚拟机,现在则不比这么麻烦了,直接安装linux子系统,秒开。
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。
grep
、sed
、awk
)或其他 ELF-64 二进制文件。装完WSL2后,我就把Windows上跑的Docker、Mysql、nginx 等服务迁进了容器,这就很nice
注意:看了官方介绍,感觉手动安装其实并不会比自动安装繁琐,总共也就几步操作而已。自动安装无法把控细节,我倾向手动安装。这里不过多介绍,看官方文档即可
建议浏览WSL官方指南:安装 WSL | Microsoft Docs
官方已经更新便捷的安装方式,现在,可以在管理员 PowerShell 或 Windows 命令提示符中输入此命令,然后重启计算机来安装运行适用于 Linux 的 Windows 子系统 (WSL) 所需的全部内容。
wsl --install
此命令将启用所需的可选组件,下载最新的 Linux 内核,将 WSL 2 设置为默认值,并安装 Linux 发行版(默认安装 Ubuntu)。
…
WSL官方指南:旧版 WSL 的手动安装步骤 | Microsoft Docs
需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。
方法一:通过命令来启用
以管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“,并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
执行结果:
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%==========================]
操作成功完成。
方法二:在windows功能中手动设置
在“控制面板\所有控制面板项\程序和功能”中选择“启用或者关闭Windows功能”,勾选对应选项即可:
如果只想安装 WSL 1,现在可以重新启动计算机,然后继续安装所选的 Linux 发行版。 若要更新到 WSL 2,请先继续执行下一步,之后再重新启动计算机。
若要更新到 WSL 2,需要运行 Windows 10。
若要检查 Windows 版本及内部版本号,选择 Windows 徽标键 + R
,然后键入“winver”,选择“确定”。 更新到“设置”菜单中的最新 Windows 版本。
备注:
如果运行的是 Windows 10 版本1903 或 1909,请在 Windows 菜单中打开“设置”,导航到“更新和安全性”,然后选择“检查更新”。 内部版本号必须是 18362.1049+ 或 18363.1049+,次要内部版本号需要高于 .1049。 阅读详细信息:WSL 2 即将支持 Windows 10 版本 1903 和 1909。 请参阅疑难解答说明。
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。
方法一:通过命令来启用
以管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“,并运行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
执行结果:
C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
部署映像服务和管理工具
版本: 10.0.18362.1379
映像版本: 10.0.18363.1500
启用一个或多个功能
[==========================100.0%==========================]
操作成功完成。
方法二:在windows功能中手动设置
在“控制面板\所有控制面板项\程序和功能”中选择“启用或者关闭Windows功能”,勾选对应选项即可:
重新启动计算机,以完成 WSL 安装并更新到 WSL 2。
检测是否开启虚拟化,打开任务管理器 -> 性能 -> 虚拟化已启用
安装新的 Linux 分发版之前,请以管理员身份打开 ”Windows PowerShell“ 或者”命令提示符“中运行以下命令,以将 WSL 2 设置为默认版本
先检查 WSL 状态,查看有关 WSL 配置的常规信息,例如默认发行版类型、默认发行版和内核版本。
wsl --status
如果默认版本不是2,则执行以下命令:
wsl --set-default-version 2
正常情况下,出现以下信息
C:\WINDOWS\system32>wsl --set-default-version 2
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
操作成功完成。
但如果执行结果如下,则需要更新 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
设置完后,这会使你安装的任何新发行版均初始化为 WSL 2 发行版。
备注:
如果使用的是 ARM64 计算机,请下载 ARM64 包。 如果不确定自己计算机的类型,请打开命令提示符或 PowerShell,并输入:
systeminfo | find "System Type"
。 警告: 在非英语 Windows 版本中,你可能需要修改搜索文本,例如在德语中为systeminfo | find "Systemtyp"
。
安装完成后,请继续执行之前失败的操作。 (如果希望将新的 Linux 安装设置为 WSL 1,请跳过此步骤。)
Windows 10 的 WSL 2 需要依赖于WSL 发行版,Microsoft Store中的WSL 发行版应用。适用于 Linux 的 Windows 子系统安装是会自动装在系统驱动器(通常是 C: 驱动器)中运行,所以注意C盘的空间。(注意:如果需要修改安装位置,请先查看下文自定义安装方法,再来查看本节其他配置介绍)。
查看当前已安装发行版
wslconfig /l
或
wsl --list --all
注意,如果是自定义安装,则跳过该步骤
单击以下链接会打开每个分发版的 Microsoft Store 页面,(如果下述连接打开有错,请直接打开Microsoft Store搜索)。:
在分发版的页面中,选择“获取”。
注意:这样会自动安装到系统盘,如果需要更改安装目录,参考下文[[#3.4 自定义分发版安装目录(可选,推荐)]]
首次启动新安装的 Linux分发版时,将打开一个控制台窗口。(自定义安装则是双击安装目录的 Ubuntu***.exe
文件,就是之前安装的应用,如果第一次启动ubuntu失败,可以重启电脑再次试下)
如果还是出错,参考下文[[#3.8 可能出现的问题]]
系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。未来的所有启动时间应不到一秒。
然后,需要为新的 Linux 分发版创建用户帐户和密码。
祝贺你!现已成功安装并设置了与 Windows 操作系统完全集成的 Linux 分发!
sudo
(Super User Do) 管理命令。安装完后,可用 wsl -l -v
查看Linux 分发版的 WSL 版本(后面有详解)
PS C:\Users\wys> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
第一步:进入 ubuntu,备份源文件
cp /etc/apt/sources.list /etc/apt/sources.list.bak
第二步:编辑 /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
#阿里源
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
#清华源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
我这里使用的阿里源,可直接执行如下命令
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
注意,以下是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
阿里源 阿里巴巴开源镜像站-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
清华源
# 默认注释了源码镜像以提高 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
然后执行更新:
apt update && apt upgrade -y
若要更改密码,请打开 Linux 分发版(例如 Ubuntu)并输入以下命令:passwd
系统会要求你输入当前密码,然后要求输入新密码,之后再确认新密码。
如果忘记了 Linux 分发版的密码:
请打开 PowerShell,并使用以下命令直接进入默认 WSL 分发版的根目录:wsl -u root
如果需要在非默认分发版中更新忘记的密码,请使用命令:
wsl -d Debian -u root
,记得将Debian
替换为目标分发版的名称。
在 PowerShell 内的根级别打开 WSL 发行版后,可使用此命令更新密码:passwd <WSLUsername>
,其中 <WSLUsername>
是 DISTRO 中帐户的用户名,而你忘记了它的密码。
系统将提示你输入新的 UNIX 密码,然后确认该密码。 在被告知密码已成功更新后,请使用命令 exit
在 PowerShell 内关闭 WSL
WSL 默认是没有设置 root 密码的,系统实现的是每次开启时随机设置root密码,导致无法切换到root权限进行操作
设置 root 用户密码,这样要输三次命令,第一次当前用户密码,后两次就是设置密码以及确认密码
# 语法: sudo passwd 用户名
sudo passwd root
password updated successfully
代表密码更新成功,切换用户
# 语法: su 用户名
su root
如果我们想要使用 root 用户的话,为了避免 sudo 切换 root 是需要输入密码,把自己配置的用户名加到sudo免密中,命令如下:
# 替换leap为自己单独配置的用户名
sudo echo "leap ALL=(ALL:ALL) NOPASSWD: ALL" >>/etc/sudoers
查看自己安装的哪个版本
可以去 Microsoft Store 商店 - 我的软件 - 已安装, 中查看
我这里安装的是 ubuntu,我就以 ubuntu 为例
查看修改命令,输入ubuntu 按回车会自动补全版本对应的命令
# 如果安装的是ubuntu1804,则命令可能是
ubuntu /?
或者
ubuntu1804 /?
设置默认用户
# 语法: 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>
# 没有报错就代表成功
注意,如果出现以下错误(一般情况是因为采用自定义分发版安装才会出现该情况)
PS C:\Users\Administrator> ubuntu config --default-user root
正确,然后再试一次。
所在位置 行:1 字符: 1
+ ubuntu config --default-user root
+ ~~~~~~
+ CategoryInfo : ObjectNotFound: (ubuntu:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
这个错误是说无法识别该命令。你需要找到以 ubuntu 开头的 exe 文件(即安装目录,可使用强大的绿色搜索工具 everything 搜索),比如我的是 ubuntu.exe,然后在==管理员权限的命令终端==中 cd 进入所在目录,再来执行以上命令
重新打开已经是 root 用户了
我的电脑我做主,C盘寸土不让,离线安装
在 Microsoft Store下载的 WSL 发行版会自动安装到C盘,不能手动选择安装位置。微软提供了一个手动下载WSL发行版的网址,可以绕开MS Store的自动安装
.AppxBundle
的文件。(官方文档说是 .appx
的文件,其实是错的,很多博客也跟着瞎抄。)把这个 .AppxBundle
的文件的后缀改为.zip
,然后解压到,这才能得到 .appx
的文件。.appx
的文件后缀改为.zip
,然后解压到想要安装 WSL 的目录下,我们可以得到一些文件。注意
安装目录的磁盘不能开==压缩内容以便节省磁盘空间==选项,否则会报错 0xc03a001a
可以右键文件夹–>属性–>常规–>高级找到并关闭这个选项,开了压缩功能的文件夹右上角会有两个蓝色的小箭头
如果之前的数据不重要,可以删除原来安装在C盘的发行版
首先停止 Linux 发行版在 WSL 的运行(这里以 Ubuntu 18.04 为例):
wsl -l -v
wsl -t Ubuntu-18.04
wsl --shutdown
wsl -l -v
查看 Windows 系统已经安装的软件包:
Get-AppxPackage -allusers | Select Name, PackageFullName
删除 Ubuntu 发行版
get-appxpackage CanonicalGroupLimited.<发行版名称和版本号>onWindows | remove-Appxpackage
这里以 Ubuntu 18.04 为例,所以要将 “<发行版名称和版本号>” 替换为 “Ubuntu18.04” , 如果是 Ubuntu
20.04 ,那么就应当替换为 “Ubuntu20.04”。
删除 Ubuntu 18.04
get-appxpackage CanonicalGroupLimited.Ubuntu18.04onWindows | remove-Appxpackage
然后开始重新安装,按照上一步未安装分发版的流程即可。
如果是想直接迁移之前数据,操作如下:
首先查看所有分发版本
C:\Users\Administrator>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
导出分发版为tar文件到d盘
wsl --export Ubuntu D:\wsl\ubuntu\ubuntu.tar
注销当前分发版
wsl --unregister Ubuntu
重新导入并安装分发版在 D:\wsl\ubuntu\
wsl --import Ubuntu D:\wsl\ubuntu D:\wsl\ubuntu\ubuntu.tar --version 2
设置默认登陆用户为安装时用户名
ubuntu config --default-user Username
删除tar文件(可选)
del D:\wsl\ubuntu\ubuntu20.04.tar
安装 Windows Terminal,可用于和 WSL 子系统交互。强烈推荐
Windows 终端(Windows Terminal)可启用多个选项卡(在多个 Linux 命令行、Windows 命令提示符、PowerShell 和 Azure CLI 等之间快速切换)、创建键绑定(用于打开或关闭选项卡、复制粘贴等的快捷方式键)、使用搜索功能,以及使用自定义主题(配色方案、字体样式和大小、背景图像/模糊/透明度)。 了解详细信息。
可以从 Microsoft Store 安装 Windows 终端。
如果你无法访问 Microsoft Store,GitHub 发布页上发布有内部版本。 如果从 GitHub 安装,终端将不会自动更新为新版本。(我就是在github上下载的,因为Microsoft Store突然无法安装应用,网上说是需要更新系统版本,但我系统已经更新过了。)
.msixbundle
为后缀的文件.zip
后解压缩文件CascadiaPackage***.msix
的文件,有x86、x64和ARM64版本的,选择x64那个文件,修改后缀名为 .zip
,然后解压可打开 PowerShell 命令行并输入以下命令(仅在 Windows 内部版本 18362 或更高版本中可用),检查分配给每个已安装的 Linux 分发版的 WSL 版本:
wsl -l --all -v
或者
wsl --list --all --verbose
若要将分发版设置为受某一 WSL 版本支持,请运行:
wsl --set-version <distribution name> <versionNumber>
或者
wsl -s <distribution name> <versionNumber>
请确保将 <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
这会将安装的任何新分发版的版本设置为 WSL 2。
由于 Linux 环境应用程序(如Ubuntu,Debian,OpenSuse或Kali)不支持为Linux操作系统提供基本构建块的 Systemd
,使用的是经典的SysV init(sysvinit)
系统,因此我们无法使用 reboot
或使用 systemctl
命令来管理 systemd
服务。
在 WSL 中可以用SysV init
的命令代替 systemd
命令
但 systemd 还是很重要的(例如:不安装可能会导致下面图形化界面安装失败)。如果需要,可通过以下方式安装:
安装git
sudo apt install git
运行脚本和命令
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh
然后重新启动 ubuntu shell
并尝试运行 systemctl
systemctl
如果报错: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
解决办法:
# 安装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
问题:从terminal启动ubuntu1804报错:参考的对象类型不支持尝试的操作。直接启动ubuntu,出现1804报错
解决办法:以管理员身份打开”Windows PowerShell“,然后执行 netsh winsock reset
,然后继续操作(如果还是不行,重启电脑即可)
操作前记得备份数据,因为可能会丢失docker的镜像容器数据
问题: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.
就是说,WSL 的最新版本使用 Hyper-V 架构来实现虚拟化,该架构可用在“虚拟机平台”可选组件中。因为这个”虚拟机平台“就是一个精简版的 Hyper-v,所以开启“虚拟机平台”即可。
Windows 10 家庭版上没有 Hyper-V 功能。所以网上很多教程都提到需要安装 Hyper-V,这是不对的。
官方解释:WSL 2 在可使用 WSL 的所有桌面 SKU 上都可使用,包括 Windows 10 家庭版。
官方原文:关于适用于 Linux 的 Windows 子系统的常见问题解答 | Microsoft Docs
如果显示错误消息,例如“转换失败”或“错误 0x03a001a 由于虚拟磁盘系统限制,无法完成请求的操作。虚拟磁盘文件必须是未压缩和未加密的,并且不能是稀疏的。”,请尝试检查以下内容。
再次尝试将发行版转换为版本 2,操作应该会成功。
造成该问题的原因是WSL版本由原来的 WSL1 升级到 WSL2 后,内核没有升级,前往微软WSL官网下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更新包即可。
可参考官方文档 关于适用于 Linux 的 Windows 子系统的常见问题解答 | Microsoft Docs
博客:WSL2 网络异常排查 [ping 不通、网络地址异常、缺少默认路由、被宿主机防火墙拦截]
官方文档:使用 WSL |访问网络应用程序微软文档 (microsoft.com)
注意:在使用win10的wsl2子系统时,windows会通过虚拟交换机给win10本机与wsl2子系统各自会分配一个ip地址。
18945之前的WSL2版本,如果我们在容器里运行了一个网络服务,例如启动一个WEB服务。想在 Win10 宿主机中访问这个WEB服务,我们先要通过 ip a
或 ifconfig
命令查看其IP地址才能访问,而且更崩溃的是每次重启后再运行WSL2容器,虚拟交换机会被重新创建,其IP地址和网关会重新分配。
但在版本18945之后,支持通过localhost访问WSL2容器,所以我们不用考虑这个问题了(有些博客更新不及时,容易误导新手)。
附上官方发行文档:微软WSL官方发行版本说明
注:可使用以下命令之一获取IP地址
ip addr | grep eth0
ifconfig
如果非要固定IP,参考链接:WSL2固定ip地址
WSL2中使用虚拟硬件磁盘来存储文件,在Windows下不能像WSL1一样直接访问C盘中的地址。
建议先浏览官方文档:跨文件系统|工作微软文档 (microsoft.com)
需要在Windows下访问Ubuntu的文件系统的话,可以有两种方式:
在Linux中运行 explorer.exe .
可以立即打开Linux当前所在的文件目录,注意:.exe后面还有个空格后面再加一个点。
在windows 的资源管理器的文件路径里、命令行窗口或者PowerShell中运行 \\wsl$\ubuntu
,可以立即打开Linux当前所在的文件目录
添加网络映射的形式添加
你应该注意到了,当进入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
而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/
凭借原生 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 内核了,所以现在有三种安装选项,主要是前两种
因为wsl2已经完整使用了linux内核了,此种方式和先前在linux虚拟机安装docker类似,可以参考我之前的博客
linux安装方式有很多,这里将使用sh脚本形式来安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo service docker start
执行脚本安装过程中,脚本提示“建议使用Docker Desktop for windows”,20s内按Ctrl+C会退出安装,所以需要等待20s,另外此种方式需要访问外网。
检查docker安装正常
# 检查dockerd进程启动
service docker status
ps aux|grep docker
# 检查拉取镜像等正常
docker pull busybox
docker images
注意:不同于完全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
Docker 也专门开发了可以使用 WSL2
中的 Docker
守护进程的桌面管理程序,具体请查看docker官方文档 Docker Desktop WSL 2 backend (opens new window),打开 Docker Desktop WSL2 backend 页面,查看是否满足安装要求,然后下载最新的 Docker Desktop for Windows 程序 ,建议下载 stable
版本。
win10安装 docker desktop 时,没有提供选择权限,默认直接就安装到了c盘。我们可以修改默认安装路径,但是注意,这里只是修改了这个应用的程序安装位置而已,镜像和容器等数据还是默认存储在C盘。如果要修改镜像和容器等数据存储位置,下文有介绍。
网上总结的方法目前只有一种,就提前将c盘的docker安装路径软连接到其他盘,具体操作如下:
现在先建立Docker文件夹,例如 D:\software\Docker
如果已经安装的,需要去控制面板里先卸载
然后在命令提示符执行下边的命令(注意:需要管理员身份运行命令提示符)
mklink /j "C:\Program Files\Docker" "D:\software\Docker"
成功如下
最后通过下一步 [[#5.2.2 开始安装]]安装完后,可以发现 docker desktop 已经安装到了d盘
官方文档: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
下载后直接安装,(为了避免不可预知的问题,最好用右键“以管理员身份运行”)。跟随安装界面,一路下一步即可。所有的选项都采用默认。安装成功后,点击“Close”关闭窗口。
安装成功后,启动Docker Desktop,然后在终端窗口执行命令检测是否安装成功
# 查询版本
docker version
# 查询详细信息
docker info
若你的 Windows 版本为 Windows 10 专业版或家庭版 v1903 及以上版本或 Windows 11,可以使用 WSL2 运行 Docker。
注意,这个时候在 WSL 里面执行 docker 命令是找不到的,需要设置一下。
打开 Docker Desktop Settings,选择General
勾选Use WSL 2 based engine。(如果在已经支持WSL的操作系统上,安装Docker Desktop,那么这个选项是被默认选中的,无需更改。)
注意,如果不选中Use WSL 2 based engine
,Resources下面就会回到之前版本的模样。自己制定CPU、内存等信息。但是该版本指定这些信息会出错(这是给WSL 1 用的)。
进入 Settings > Resources > WSL Integration。
在这个界面中,选择任何你想要使用的Linux发行版本(手动选择后,可以在Linux中来操作Docker)。
点击 Apply & Restart
重启 Docker desktop for Windows
,重启完成后我们就可以在 WSL2里面使用 docker 命令了
在WSL2里面执行 df -Th
,会发现增加了一些新的与docker有关的挂载点。
因为我使用的是WSL2的版本,docker 运行数据都在 WSL 发行版中,文件位置都只能由 WSL 管理。因此 docker desktop 在安装的时候创建如下两个发行版(distro)
说明
这两个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
根据需要,设置默认分发版(可选,因为我是默认使用Ubuntu,所以不执行)
wsl -s docker-desktop
重新启动 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
方法二:通过软链接(未测试)
将 %LOCALAPPDATA%/Docker/wsl/data
下的 ext4.vhdx 复制到想要的路径下,本文路径为:E:\Docker\wsl\docker-desktop-data
删除源文件夹,本文是 %LOCALAPPDATA%/Docker/wsl
下的 data 文件夹
以管理员运行cmd并且使用以下命令创建链接:
mklink /J C:\Users\xxxxx\AppData\Local\Docker\wsl\data E:\Docker\wsl\docker-desktop-data
请大家自行替换路径,本文路径分别为源路径:C:\Users\Administrator\AppData\Local\Docker\wsl\data
,以及想要移动的路径:E:\Docker\wsl\docker-desktop-data
,此时可以在源路径看到新建出来的软链接文件夹
而 %LOCALAPPDATA%/Docker/wsl/distro
下的 ext4.vhdx 也是同样的操作,这里不重复介绍
重新启动 docker desktop,验证docker服务是否可以正常使用。查看新目录中的vhdx的修改时间,如果修改时间是最新时间,就说明配置成功。然后随便拉个nginx下来启动试试。
总结网上的其他方法(这些方法感觉不是很靠谱,未测试。有测试过的同行,麻烦踢我一下)
方法一:打开docker desktop 的 Settings,点击左侧 menu,找到 Resources 按钮,点击并找到 Disk Image Location,然后进行修改(这种方法有很多人找不到这个选项,是因为Docker 被WSL2管理,不允许修改)
方法二:打开docker desktop 的 Settings,点击左侧 Docker Engine,修改配置文件,添加 graph
属性(操作很简单,但我不想测试了)
官方文档:Docker Desktop for Windows 用户手册|Docker 文档
这里给出一点建议
使用 Docker 和 WSL 2 进行工作或者开发应用程序。建议使用Linux 容器,这样在 Linux 发行版中,也能方便使用 Docker 。
如何访问 windows containers 中的数据库或者网站呢?用容器ip访问
如何访问 linux containers 中的数据库或者网站呢?
如果是宿主机访问容器:用localhost、127.0.0.1、宿主机局域网ip
如果是局域网中其他客户端访问:用宿主机局域网ip
WSL2下原生linux安装docker方式和完全linux虚拟机安装docker类似,区别在于WSL2下的linux不支持systemd。
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 Container 和 Linux 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 terminal 中 docker ps
命令在windows和ubuntu中查看容器进程,查到的结果是一样的。
最后,就可以在win 10 下使用各种 linux 子系统了, 也可以在 win10 和 linux 下使用 docker 和以及 kubernetes 啦。
确保Linux发行版本是运行在WSL 2 模式下。WSL 在V1 和 V2 两种模式下都可以运行
首先在 Windows PowerSell
中,输入:
wsl -l -v
就可以查看到,多了 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
如果现有的 WSL 是v1,通过下面的命令可以升级为 v2:
wsl --set-version (distro name) 2
想要把 v2 设置为默认模式,可以通过下面的命令:
wsl --set-default-version 2
开始使用!
在Windows CMD中,通过命令随便运行几个容器。在Linux中,就可以查看到已经运行的容器信息。
安装 Docker 软件后,可以直接通过 docker pull 命令拉取镜像。如未配置镜像加速源,直接拉取 DockerHub 中的镜像,通常下载速度会比较慢。这里我将用阿里云镜像加速器。
在系统右下角托盘图标内右键菜单选择 Settings
,打开配置窗口后左侧导航菜单选择 Docker Engine
。编辑窗口内的JSON串,填写下方加速器地址:
{
"registry-mirrors": ["https://4bj04jx5.mirror.aliyuncs.com"]
}
编辑完成后点击 Apply
保存按钮,等待 Docker 重启并应用配置的镜像加速器。
这里适用于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
参考链接:
docker for windows could not read CA certificate
问题原因:之前安装过 docker toolbox。
解决步骤:
docker-machine rm default
@FOR /f “tokens=*” %i IN (‘docker-machine env -u’) DO @%i
Filesharing has been cancelled
安装成功后,可能用到docker-compose,对于新手,这部分可能会遇到麻烦。
问题原因:当前创建的目录没有加入到文件分享当中,导致操作被取消(如果开启WSL 2就没有这个问题)
解决步骤:
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.
在 WSL2 发行版中创建。/etc/wsl.conf
,输入以下内容
[automount]
options = "metadata"
保存()并重新启动 WSL
# 关闭所有的wsl
wsl --shutdown
# 启动wsl
wsl
参考:Docker安装MYSQL无法运行的天坑 mysqld: Can’t read dir of ‘/etc/mysql/conf.d/’ (OS errno 13 - Permission den…
补充:实在没有必要在WSL 中安装桌面环境和输入法等等,感觉就很另类,而且不实用,别整这些花里胡哨的。我写这个流程,单纯是因为公司需要桌面环境,所以尝试了一下,反正我最后卸载了。
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
显示服务器程序显示。参考这个教程
systemd
,而 WSL 不支持 systemd
,所以需要先安装 systemd
。操作流程参考流程[[#2.3.4 安装WSL的systemd脚本]]。本人安装的WSL 分发版是 Ubuntu 20.04.3 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)
,准备采用第一种方法xfce4
+ xrdp
。
设置国内源,这里省略,可参考流程[[#2.3.3 修改ubuntu的apt安装源]]
sudo apt update
sudo apt upgrade
在 Ubuntu 源仓库有很多桌面环境供你选择。一个选择是安装 Gnome,它是 Ubuntu 20.04 的默认桌面环境。另外一个选项就是安装 xfce
。它是快速,稳定,并且轻量的桌面环境,使得它成为远程服务器的理想桌面。
不同的桌面环境,可以参考文章Ubuntu & XFCE vs Xubuntu区别介绍
sudo apt install xfce4
安装 xfce4 过程中,会弹框出现选择显示管理DM选择 gdm3
和 lightdm
的提示,建议选择 lightdm
如果错过了安装过程中出现的这个向导,那么可以在安装完成后执行下面的命令重新设置DM
sudo dpkg-reconfigure lightdm
注意这一步很重要,如果不设置的话会导致后面远程桌面连接上闪退
$ vim ~/.xsession
# 写入下面内容(就一行)
xfce4-session
或者一步到位
sudo echo xfce4-session > ~/.xsession
这是告诉系统,开启桌面环境的时候用 xfce4-session 。
完成后,执行下面这段代码就可以看到桌面的图形界面了。
xfce4-session
补充:如果想连接虚拟机或者双系统里面的Ubuntu,同样可以参考此流程。
Xrdp 是一个微软远程桌面协议(RDP)的开源实现,它允许你通过图形界面控制远程系统。通过 RDP,你可以登录远程机器,并且创建一个真实的桌面会话,就像你登录本地机器一样。
Xrdp 被包含在默认的 Ubuntu 软件源中。想要安装它,运行:
sudo apt-get install xrdp
一旦安装完成,Xrdp 服务将会自动启动。你可以输入下面的命令,验证它:
sudo systemctl status xrdp
如果提示找不到该命令,那是没有安装 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
...
默认情况下,Xrdp 使用/etc/ssl/private/ssl-cert-snakeoil.key
,它仅仅对“ssl-cert” 用户组成语可读。运行下面的命令,将xrdp
用户添加到这个用户组:
sudo adduser xrdp ssl-cert
重启 Xrdp 服务,使得修改生效:
sudo systemctl restart xrdp
就这样。Xrdp 已经在你的 Ubuntu 服务器上安装好了,你可以开始使用它了。
Xrdp 配置文件定位在/etc/xrdp
目录。对于基本的 Xrdp 连接,你不需要对配置文件做任何改动。
主要的配置文件被命名为 xrdp.ini。这个文件被分成不同的段,允许你设置全局配置,例如安全,监听地址,创建不同的 xrdp 登录会话等。
修改默认端口
由于 xrdp
安装好后,默认配置使用的是和Windows远程桌面相同的 3389
端口,为了防止和Windows系统远程桌面冲突,建议修改成其他的端口。(虚拟机和双系统可忽略)
$ sudo vim /etc/xrdp/xrdp.ini
# 修改下面这一行,将默认的3389改成其他端口即可
port=3390
或者
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
修改图像设置(可选)
sudo vim /etc/xrdp/xrdp.ini
max_bpp=32
修改为128(最大位图深度)
#xserverbpp=24
修改为128,取消注释‘#’。
设置连接会话进程是否保留
sudo vim /etc/xrdp/sesman.ini
将KillDisconnected
的值修改为 true
,保存退出。这样每次断开连接时,linux都会关闭会话进程,连接数量达到上限,出现问题。
设置 Xrdp 连接的桌面环境
Xrdp 使用默认的 X Window 桌面环境(Gnome or XFCE)。Xrdp 使用 startwm.sh
文件启动 X 会话。如果你想使用另外一个 X Window 桌面,编辑这个文件。
sudo vim /etc/xrdp/startwm.sh
用#注释末尾两行test和exec:
test -x /etc/X11/Xsession && exec /etc/X11/Xsession exec /bin/sh
/etc/X11/Xsession
添加一行
startxfce4
# 如果你是装的虚拟机或者双系统Ubuntu桌面版(即桌面环境默认是ubuntu-desktop,Unity桌面),则这里就添加gnome-session
不管什么时候你对配置文件做出修改,你需要重启 Xrdp 服务。
本人测试发现,这里需要重启电脑主机,不然可能报错,重启后再启动xrdp。大家可以先跳过这步试试,不行再重启电脑。
由于WSL2里面没有 systemd
,所以需要手动启动
sudo /etc/init.d/xrdp start
或者可以安装 systemd
,参考步骤[[#2.3.4 安装WSL的systemd脚本]]
sudo service xrdp restart
ip a
eth0
项中,inet
后面的地址记下来。
按下 windows + R
键,输入 mstsc
打开远程桌面连接
在计算机(Computer)栏输入刚才记下的ip地址及端口3390,或者地址输入localhost:3390
,注意这里的端口号应当与上面修改配置中一致。用户名可填可不填,因为之后会提示填写,或者输入 WSL 2 中使用的账号密码
如果连接不上,可以用 telnet
命令测试端口是否开启。如果连接不通,检查 Xrdp 是否启动,同时是否有防火墙设置。
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
如果你想允许从任何地方访问(由于安全原因,这种方式不鼓励),运行:
sudo ufw allow 3389
想要增加安全,你可以考虑 Xrdp 仅仅监听 localhost,并且创建一个 SSH 隧道,将本地机器的3389
端口到远程服务器的同样端口之间的流量加密。
本人尝试各种方法,均测试失败,所以下面流程可以跳过。如果有人成功了,麻烦在评论区踢我一脚
方法一:
sudo dpkg-reconfigure locales
然后一直按键盘上的 ↓ 找到 zh_CN UTF-8
,然后按空格勾选,再tab切换到ok上回车,接下来的界面选 zh
再回车。
这一步完成后可能会导致键盘不可用,不用激动,点击桌面左上角图标注销后重进就好了。
首次进入中文界面会提示是否重命名那几个文件夹,建议保持英文状态,因为有些路径是写进配置文件了的,重命名会带来不必要的麻烦。
方法二:
sudo apt install language-pack-zh-hans
设置本地化环境变量
echo "LANG=zh_CN.UTF-8" >> ~/.profile
或者通过 locale-gen
sudo locale-gen zh_CN.UTF-8
打开Applications
->Settings
->Language Support
,按提示安装包就可以。或者执行命令
sudo /usr/bin/gnome-language-selector
如果出现闪退,可以在终端中来启动,发现错误: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
再次打开语言支持,开始安装
在 system settings->language support->install/remove languages,在弹出的菜单中选择Chinese(simplified),点击apply
为了避免每次重启都得手动运行 dbus,可以在应用程序 - 设置 - 会话与启动 - 应用程序自启动,添加 /etc/init.d/dbus start。
任选一种
安装中文输入法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
软件包已装,在应用程序 - 设置 - 会话与启动 - 应用程序自启动,添加 /usr/bin/fcitx。
打开系统自带的 Input Method Configuration,直接点击OK、Yes,然后将默认的 ibus 切换为 fcitx,一路OK
搜狗输入法是建立在fcitx框架之上的,所以要将输入法框架选择为fictx,
安装搜狗输入法
sudo vim /etc/xrdp/startwm.sh
在上面文件中添加
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
添加位置如下图:
重启 xrdp
sudo service xrdp restart
#没效果就用下面的命令:
sudo /etc/init.d/xrdp restart
进入图形界面,点击右上角Applications—>Settings—>Light Locker Settings。
设置 Automatically lock the session 为 Never。
问题原因:远程桌面没有正确关闭,虽然在windows 系统关闭远程桌面连接,但是在里linux上的进程还在运行,导致连接数量达到上限,出现问题。
解决:通过设置 sesman.in 文件内的参数,解决。
vim /etc/xrdp/sesman.ini
可以修改会话设置 :将最大会话限制该大 MaxSessions=50
将KillDisconnected=1;则每次断开连接时,linux都会关闭会话进程。
然后重启/etc/init.d/xrdp restart 就可解决问题
再次提醒先设置好 apt 源,可以手动修改文件,或者从图形界面的设置中进行设置
可以直接从软件市场中下载
这种比较方便
命令行安装
为Google Chrome浏览器创建源列表文件
sudo vim /etc/apt/sources.list.d/google-chrome.list
添加源
deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main
运行以下命令以下载Google的签名密钥
wget https://dl.google.com/linux/linux_signing_key.pub
使用apt-key将其添加到密钥环中,以便包管理器可以验证Google Chrome deb包的完整性
sudo apt-key add linux_signing_key.pub
更新包列表并安装稳定版Google Chrome
sudo apt update
sudo apt install google-chrome-stable
从命令行启动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进行启动了,或者将快捷方法发送到桌面来启动。
局域网电脑如果想远程连接另一台Windows电脑上的WSL2 Ubuntu,网络需要经过PC1 -> PC2(Windows)->PC2(WSL2-Ubuntu)。所以需要经过三个步骤:
WSL2下的Ubuntu默认是支持SSH的,支持默认不被开启。需要开启的,需要手动编辑下SSH服务的配置文件。
首先查询一下是否已经安装openssh-server(一般默认已经安装了)
sudo apt install openssh-server
然后修改Ubuntu子系统 /etc/ssh/sshd_config
配置文件
vi /etc/ssh/sshd_config
进入之后,修改如下几行配置
Port = 22
去掉这行的#,代表启用端口号22ListenAddress 0.0.0.0
去掉这行的#,代表监听所有地址PasswordAuthentication yes
,将这行的 no 改成 yes,代表支持账号密码形式的登录#PermitRootLogin prohibit-password
意思是允许root登录,但是禁止root用密码登录,所以保持默认,保留这行的#注释。PermitRootLogin yes
,默认情况下,root用户只支持用RSA登录,所以需要修改配置设置后,重新启动ssh服务。在Ubuntu子系统中,执行以下命令
sudo service ssh --full-restart
如果 ubuntu
下重新启动ssh服务 sudo service ssh restart
,报如下错误:
root@LAPTOP-LHBT0GVK:/etc/ssh# service ssh restart
sshd: no hostkeys available -- exiting.
解决方法
在 /etc/ssh 路径下输入
ssh-keygen -A
/etc/init.d/ssh start #完成
安装完重启后,可以使用Windows主机内的shell工具,进行连接测试。首先查询WSL2-Ubuntu的虚拟网卡地址:
ifconfig
或者
ip addr
如上图的虚拟网卡地址为172.22.3.120, 所以在Windows的ssh工具的关键信息如下:
连接地址:172.22.3.120
账户:*User*(Ubuntu的用户名)
密码:*Password*(Ubuntu的用户密码)
端口号:22
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
参数说明:
标记值listenport:IPv4 侦听端口。
connectaddress:1IPv4 连接地址,这里是2222。
connectport:IPv4 连接端口,这里是172.22.3.120。
listenaddress: IPv4 侦听地址,这里是22。
protocol: 使用的协议。现在只支持 TCP。
说明: 添加通过 IPV4 的 IP4 和代理连接到的侦听项目
执行完成后,调用下面命令查看:
netsh interface portproxy show all
防火墙的设置规则,同样使用netsh工具,也同样需要管理员权限运行PowerShell。
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
(也可以在防火墙-高级设置-入站规则中设置)
连接测试:
连接地址:xx.xx.xx.xx(运行WSL的Windows主机地址)
账户:*User*(WSL-Ubuntu的用户名)
密码:*Password*(WSL-Ubuntu的用户密码)
端口号:2222(因为本文使用了2222端口,如果设置为其他,注意修改)
完成以上即可连接成功。
如果需要通过公网进行远程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,必须是全路径,不能是相对路径。(全路径地址,大家自行查询)
这样就可以永久有效了,再也不会报错了!
可以打开注册表regedit,找到\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog
,依次点击此目录的各项,可以找到该注册信息
至此,就可以打开wsl了。
如果商店 Microsoft Store 版本 WSL 更新了,需要重新执行一遍此流程
参考链接:
win10启动ubuntu报错 参考的对象类型不支持尝试的操作_Chivalrous Expert的博客-CSDN博客
提示:在此 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
下图是正常情况(都是软连接)。
命令行官方文档: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(仅显示发行版名称)。
列出可用的 Linux 发行版
查看可通过在线商店获得的 Linux 发行版列表。
wsl --list --online
或者
wsl -l -o
设置默认 WSL 版本
wsl --set-default-version <Version>
若要将默认版本设置为 WSL 1 或 WSL 2,请将 <Version>
替换为数字 1 或 2,表示对于安装新的 Linux 发行版,你希望默认使用哪个版本的 WSL。 例如,wsl --set-default-version 2
。
设置 WSL 版本
wsl --set-version <distribution name> <versionNumber>
若要指定运行 Linux 发行版的 WSL 版本(1 或 2),请将 <distribution name>
替换为发行版的名称,并将 <versionNumber>
替换为 1 或 2。
设置默认 Linux 发行版
wsl --set-default <Distribution Name>
或者
wsl -s <Distribution Name>
若要设置 WSL 命令将用于运行的默认 Linux 发行版,请将 <Distribution Name>
替换为你首选的 Linux 发行版的名称。
通过 PowerShell 或 CMD 运行特定的 Linux 发行版
wsl --distribution <Distribution Name> --user <User Name>
若要通过特定用户运行特定 Linux 发行版,请将 <Distribution Name>
替换为你首选的 Linux 发行版的名称(例如 Debian),将 <User Name>
替换为现有用户的名称(例如 root)。 如果 WSL 发行版中不存在该用户,你将会收到一个错误。 若要输出当前用户名,请使用 whoami
命令。
更新 WSL
wsl --update
手动更新 WSL Linux 内核的版本。 还可以使用 wsl --update rollback
命令回滚到 WSL Linux 内核的上一版本。
检查 WSL 状态
wsl --status
查看有关 WSL 配置的常规信息,例如默认发行版类型、默认发行版和内核版本。
Help 命令
wsl --help
查看 WSL 中可用的选项和命令列表。
主目录
wsl ~
~
可与 wsl 一起使用,以在用户的主目录中启动。 若要在 WSL 命令提示符中从任何目录跳回到主目录,可使用命令 cd ~
。
关闭
wsl --shutdown
立即终止所有正在运行的发行版和 WSL 2 轻量级实用工具虚拟机。 在需要重启 WSL 2 虚拟机环境的情形下,例如更改内存使用限制或更改 .wslconfig 文件,可能必须使用此命令。
启动
wsl
Terminate
wsl --terminate <Distribution Name>
若要终止指定的发行版或阻止其运行,请将 <Distribution Name>
替换为目标发行版的名称。
注销或卸载 Linux 发行版
wsl --unregister <Distribution Name>
通过将 <Distribution Name>
替换为目标发行版的名称,注销或卸载特定发行版。 这会从 WSL 中删除此发行版,并删除所有关联的数据、设置和软件。 还可以像卸载任何其他应用商店应用程序一样卸载 Windows 计算机上的 Linux 发行版应用。
【WSL+Docker】新手Win10下的WSL Ubuntu18并使用Docker(两种方式)
用于 WSL 2 上的 Ubuntu 的 Xfce4 桌面环境和 X 服务器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。