微软为WSL2提供原生Systemd 支持

2023-04-26 11:55:35 浏览数 (1)

简介

微软发布了一个新的 0.67.6 版本的适用于 Linux 的 Windows 子系统 ,其中包括期待已久的 systemd 支持。在此之前需要使用其它方式来完成,但是多少都会有点问题,可以参考:请参考:https://www.xmmup.com/zaiwsl2zhonganzhuangqitalinuxfaxingban.html

systemd 是一套用于 Linux 系统的基本构建模块,它提供了一个系统和服务管理器,作为 PID 1 运行并启动系统的其他部分。

许多知名的 Linux 发行版(如 Ubuntu、Debian 等)都默认运行 systemd,这一变化意味着 WSL 允许你使用依赖于 systemd 支持的软件,也让 WSL 更贴近于那种在设备上独立安装运行的 Linux 发行版而不是兼容层。

依赖 systemd 的一些知名 Linux 应用程序包括:

  • snap(Canonical 为使用 Linux 内核和 systemd init 系统的操作系统开发的软件打包和部署系统)
  • microk8s(一个轻量级的 Kubernetes,旨在降低 K8s 和云原生应用开发的准入门槛)
  • systemctl(检查和控制 systemd 系统和服务管理器的状态)

如何向 WSL 添加 Systemd 支持?

升级WSL版本到0.67.6

Microsoft 最新发布的适用于 Linux 的 Windows 子系统版本 0.67.6 为 WSL 添加了 systemd 支持。因此,要获得此功能,您必须首先升级您的 WSL 版本。

检查当前使用的 WSL 版本的一种简单方法是运行:

代码语言:javascript复制
wsl --version

请记住,如果该命令失败,则您使用的是 Windows 内版本的 WSL,并且必须升级到 Store 版本。

代码语言:javascript复制
PS C:Userslhr> wsl --version
WSL 版本: 0.66.2.0
内核版本:5.15.57.1
WSLg 版本:1.0.42
MSRDC 版本:1.2.3401
Direct3D 版本:1.606.4
DXCore 版本:10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows版本:10.0.22621.382
PS C:Userslhr> wsl --update
正在检查更新。
已安装最新版本的适用于 Linux 的 Windows 子系统。

然后,使用以下命令将您的 WSL 实例更新到最新版本。

代码语言:javascript复制
wsl --update

WSL 可能会通知您没有可用的新版本。如果是这种情况,请按照以下说明手动升级 WSL 版本。

转到GitHub 项目页面并导航到发布部分以下载最新版本。目前是预发布的0.67.6 (Microsoft.WSL_0.67.6.0_x64_ARM64.msixbundle)。

下载文件后,您可以继续安装。但首先,您必须停止 WSL 服务。否则,安装将失败。

因此,打开服务管理控制台,突出显示“Windows Subsystem for Linux Preview”服务,然后从右键单击上下文菜单中选择“停止”。

最后,使用管理权限打开 Windows Power Shell 控制台(右键单击,然后“以管理员身份运行”)并执行:

代码语言:javascript复制
Add-AppxPackage "f:Microsoft.WSL_0.67.6.0_x64_ARM64.msixbundle"

当然,将实际文件路径替换为您系统的正确路径。安装完成后,启动“Windows Subsystem for Linux Preview”服务。

代码语言:javascript复制
PS C:Userslhr> wsl --version
WSL 版本: 0.67.6.0
内核版本:5.15.62.1
WSLg 版本:1.0.44
MSRDC 版本:1.2.3401
Direct3D 版本:1.606.4
DXCore 版本:10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows版本:10.0.22621.382

在 WSL 发行版中启用 Systemd 支持

到目前为止,一切都很好。您的 WSL 服务现在具有 systemd 支持。但是,请务必记住,这不会自动向您的 Linux 实例添加一个。

换句话说,为每个 Linux 发行版单独手动启用它。幸运的是,这很容易。

在发行版内部,使用您喜欢的文本编辑器打开 /etc 目录中的 wsl.conf文件。如果该文件不可用,只需创建一个新文件。

代码语言:javascript复制
sudo nano /etc/wsl.conf

粘贴以下内容,然后保存文件并退出。

代码语言:javascript复制
[boot]
systemd=true

最后,关闭您的 WSL 发行版窗口,然后在 Power Shell 控制台中,键入以下命令以重新启动您的 WSL 实例:

代码语言:javascript复制
wsl --shutdown

就这样。您的WSL 发行版现在应该具有 systemd 支持。启动发行版,并从其 Shell 运行以下命令以测试此功能。结果应该看起来像屏幕截图中的那个。

错误解决

调用windows程序报错“-bash: ./xxxxxx: cannot execute binary file: Exec format error”

代码语言:javascript复制
[root@lhrxxt ~]# cmd.exe
-bash: /mnt/c/Windows/system32/cmd.exe: cannot execute binary file

解决方案

代码语言:javascript复制
cd /usr/lib/binfmt.d
wget https://raw.githubusercontent.com/arkane-systems/bottle-imp/master/othersrc/usr-lib/binfmt.d/WSLInterop.conf

wsl --shutdown
wsl

这里最好采用wget的方式。

文件内容:

代码语言:javascript复制
root@lhrxxt:/usr/lib/binfmt.d# more WSLInterop.conf
:WSLInterop:M::MZ::/init:PF
参考

https://github.com/microsoft/WSL/issues/8843

报错:WSL (996) ERROR: UtilConnectUnix:511: connect failed 2

原因:export WSL_INTEROP=/run/WSL/8_interop 配置错误

应该配置一个已经存在的文件

代码语言:javascript复制
export WSL_INTEROP="/run/WSL/$(ls -tr /run/WSL | grep -v 2_interop | head -n1)"


for i in $(pstree -np -s $$ | grep -o -E '[0-9] '); do
    if [[ -e "/run/WSL/${i}_interop" ]]; then
        export WSL_INTEROP=/run/WSL/${i}_interop
    fi
done

示例:

代码语言:javascript复制
root@lhrxxt:~# ll /run/WSL/
total 0
drwxrwxrwx  2 root root   80 Sep 26 15:43 ./
drwxr-xr-x 33 root root 1160 Sep 26 15:57 ../
srwxrwxrwx  1 root root    0 Sep 26 15:43 2_interop=
srwxrwxrwx  1 root root    0 Sep 26 15:43 836_interop=
root@lhrxxt:~# export WSL_INTEROP=/run/WSL/8_interop
root@lhrxxt:~# cmd.exe
<3>WSL (5331) ERROR: UtilConnectUnix:511: connect failed 2
                                                          root@lhrxxt:~#
root@lhrxxt:~# export WSL_INTEROP=/run/WSL/836_interop
root@lhrxxt:~# cmd.exe
'\wsl.localhostUbuntu-20.04root'
用作为当前目录的以上路径启动了 CMD.EXE。
UNC 路径不受支持。默认值设为 Windows 目录。
Microsoft Windows [版本 10.0.22621.382]
(c) Microsoft Corporation。保留所有权利。

C:Windows>exit
root@lhrxxt:~#

参考:https://github.com/microsoft/WSL/issues/5065

0 人点赞