当前位置: 首页 > news >正文

Windows wsl2支持systemd

背景

很多Linux发行版都是使用systemd来管理程序进程,但是在WSL中默认是用init来管理进程的。

为了符合长久的使用习惯,且省去不必要的学习成本,就在WSL的发行版(我这里安装的是Ubuntu20.04)中支持systemd,也就可以使用systemctl命令来启停进程。

相关知识

能够支持使用systemctl命令,提供完整 systemd 的项目有很多:

  • diddledani/one-script-wsl2-systemd: The one-script variant of the systemd hack for WSL2 (github.com)
  • ubuntu-wsl2-systemd-script
  • wsl2-hacks
  • genie
  • subsystemd
  • Angea

这些项目的核心原理并无大异,无非是细节处理的好坏和附加功能的多少,但最重要的一点可能是工作层次不同。

前三个脚本都工作在图中的** shell **层,要依赖外置命令执行系统调用。

genie 工作在应用程序层,它使用 C# 编写,通过 shell 执行系统调用,比前三个还多了一层。

最后两个虽然也是应用程序,但它们由 Rust 编写,不经 shell,而直接由 C system call wrapper 执行系统调用,依赖最少,动态链接编译后只有几百 K。

systemd

在较新的Linux系统上,都使用systemd 管理进程,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

systemd为系统启动和管理提供了完整的解决方案。它提供了一组命令。字母d是守护进程(daemon)的缩写。

init

WSL2 的发行版均拥有微软提供的 init,它是一种 systemd 的替代方案,不支持 systemctl 命令,

WSL2 本身是由 Windows 负责运行的,因此使用 tree 或 ps 命令时会看到根进程不是 systemd,这将导致无法启动 Linux 系统服务的守护进程 (deamon)。

当我们执行 systemctl 命令的时候,会显示出我们的 init system (PID 1) 并非 systemd,而是微软提供的 init。

systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

安装

首先,需要确认使用的是WSL2版本,可以在PowerShell中执行如下命令查看:

wsl -l -v

如果显示为1,可以使用如下命令进行配置,其中<Version>修改成2即可:

wsl --set-default-version <Version>

还可以使用如下方式设置默认的Linux发行版,其中<distro name>替换为要配置的Linux发行版名称。

例如,wsl --set-version Ubuntu-20.04 会将Ubuntu20.04发行版设置为使用WSL2:

wsl --set-version <distro name> 

在网上找到很多种支持的方法,最简单的就是微软官方提供的方法,仅需要添加一个配置文件即可。

  1. 打开PowerShell命令行,更新WSL。

    wsl --update
    
  2. 打开Ubuntu 22.04,在 /etc/目录新建wsl.conf文件,添加如下内容:

    [boot]
    systemd=true
    
  3. 关闭Ubuntu窗口。

  4. 打开PowerShell命令行,重启WSL。

    wsl --shutdown
  5. 重新在Windows Terminal中打开Ubuntu发行版,输入如下命令检查是否成功:

    systemctl
    

    出现上述的结果则代表支持systemd成功。


  • 参考

    Systemd support is now available in WSL!

  • 环境

    Windows 10 专业版 22H2

    Ubuntu 22.04.2

http://www.lryc.cn/news/136039.html

相关文章:

  • NLP - 如何解决ModuleNotFoundError: No module named ‘jieba‘的问题
  • Windows10上VS2022单步调试FFmpeg 4.2源码
  • 【tkinter 专栏】菜单组件
  • 【LeetCode-经典面试150题-day10】
  • Transformer在医学影像中的应用综述-分类
  • 新服务器基本环境下载conda + docker + docker-compose + git
  • Matlab论文插图绘制模板第108期—特征渲染的标签散点图
  • 设计模式之中介者模式(Mediator)的C++实现
  • css弹性布局的方式
  • 阿里云源 Python、npm、git、goproxy
  • 微服务架构1.0
  • iOS开发Swift-基础部分
  • 【LeetCode-经典面试150题-day11】
  • 深度学习入门(三):卷积神经网络(CNN)
  • 网站是如何识别网络爬虫的?
  • TP-Link 智能灯泡缺陷能让黑客窃取用户 WiFi 密码
  • 接口测试,如何测试?
  • React源码解析18(11)------ 实现多次setState的批处理
  • 评测凯迪仕K70「千里眼」智能锁:不忘安全初心,便捷体验更上一层
  • mysql数据库root密码遗忘后,修改root密码
  • 网络安全(黑客)快速入门~
  • 华为OD机试 - 数字颠倒(Java 2023 B卷 100分)
  • leetcode做题笔记87扰乱字符串
  • 第一章 初识Linux(含VMware安装Ubuntu、CentOS、Windows、FinalShell、快照)
  • MATLAB算法实战应用案例精讲-【图像处理】OCR识别方法-CRNN
  • 无涯教程-PHP - preg_grep()函数
  • 【Linux】Nginx解决跨域问题
  • 无涯教程-PHP - preg_split()函数
  • B. Spreadsheets
  • matlab面向对象