简介
微软发布了一个新的 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
文件。如果该文件不可用,只需创建一个新文件。
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