WSL2支持systemctl命令

news2024/12/27 17:20:57

文章目录

    • 背景
    • 相关知识
      • systemd
      • init
    • 安装
      • 方法一:微软官方支持方法(推荐)
      • 方法二:安装daemonize实现
    • 参考

背景

微软官方推出Windows Terminal第一时间,我就安装了这个终端软件。现在GitHub已经有86.8k星,且发布了86个版本。我会将它与WSL以及Linux发行版结合使用,在Windows系统下搭建Linux开发环境。很多Linux发行版都是使用systemd来管理程序进程,但是在WSL中默认是用init来管理进程的,所以为了符合自己的使用习惯,且省去不必要的学习成本,就在WSL的发行版(我这里安装的是Ubuntu22.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

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

Pasted image 20220606151803

前三个脚本都工作在图中的 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 负责运行的,因此使用 treeps 命令时会看到根进程不是 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
ps u -q 1
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0    908   592 ?        Sl   10:31   0:00 /init

安装

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

wsl -l -v

image-20230101164832873

如果默认版本是1,可以使用如下命令进行配置,其中<Version>修改成2即可:

wsl --set-default-version <Version>

还可以使用如下方式设置默认的Linux发行版,其中<distro name>替换为要配置的Linux发行版名称。例如,wsl --set-version Ubuntu-20.04 2会将Ubuntu20.04发行版设置为使用WSL2:

wsl --ser-version <distro name> 2

方法一:微软官方支持方法(推荐)

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

  1. 在Windows Terminal中打开Ubuntu22.04

  2. /etc目录新建wsl.conf文件,添加如下内容:

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

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

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

    systemctl list-unit-files --type=service
    

    image-20230101165818434

方法二:安装daemonize实现

在官方支持systemd之前,我是使用这个方法来实现的。

  1. 安装daemonizefontconfig

    sudo apt install -y fontconfig daemonize
    
  2. 修改/etc/profile,末尾添加如下配置

    SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
    
    if [ -z "$SYSTEMD_PID" ]; then
       sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
       SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
    fi
    
    if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
        exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
    fi
    
  3. 在文件/etc/sudoers末尾添加如下内容

    %sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
    %sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
    
  4. 重新加载/etc/profile使新配置生效

    source /etc/profile
    

参考

  1. Systemd support is now available in WSL!

  2. 使用 WSL 在 Windows 上安装 Linux

  3. WSL2开启systemctl命令

  4. WSL2 开启 systemctl 命令简单方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一名普通Java程序员的2022的总结和2023的展望

前言今天是元旦节&#xff0c;也是2023年的第一天&#xff0c;首先祝各位亲朋好友们元旦快乐&#xff0c;在新的一年全家身体康健&#xff0c;诸事顺遂&#xff0c;阖家幸福&#xff0c;最重要的是身体健康&#xff0c;工作顺利&#xff0c;永无BUG永不加班&#xff01;&#x…

计算机组成原理【1】初识硬件

目录 考点1&#xff1a;硬件发展———————————————————————————— 一.计算机硬件的基本组成 1.早期冯诺依曼机 &#xff08;1&#xff09;冯.诺依曼计算机的特点: 2.现代计算机的结构 3.总结图 二.各个硬件的工作原理 1.寄存器MAR,MDR 2.主存…

EMNLP22 外部知识注入:Prompt-Learning for Short Text Classification

Prompt-Learning for Short Text Classification 任务形式&#xff1a;短文本分类问题&#xff0c;但是短文本的短长度、特征稀疏性和高模糊性给分类任务带来了巨大挑战。 1以往的工作&#xff0c;在注入外部信息上 大多数提示学习方法手动扩展标签词或仅考虑类别名称以纳入…

得分_UVa1585分子量_UVa1586数数字_UVa1225周期串_UVa455子序列_UVa10340

目录 P57_习题3-1_得分_UVa1585 P57_习题3-2_分子量_UVa1586 原子数范围0~99 书上给的代码 P57_习题3-3_数数字_UVa1225 P57_习题3-4_周期串_UVa455 P59_习题3-9_子序列_UVa10340 P57_习题3-1_得分_UVa1585 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&a…

网络原理2 TCP协议

TCP协议 文章目录TCP协议TCP的特点TCP的基本特性确认应答机制超时重传机制丢包连接管理机制TCP建立连接---三次握手TCP断开连接---四次挥手滑动窗口机制丢包问题流量控制机制拥塞控制机制延迟应答机制捎带应答机制面向字节流问题TCP中的异常处理程序崩溃了正常关机突然断电关机…

在前端解决跨域

1、环境依赖 C:\Users\cyberzhaohyvm>node -v v14.17.3 C:\Users\cyberzhaohyvm>vue -V vue/cli 5.0.4 2、在项目所在目录&#xff0c;安装axios 进入项目所在目录&#xff1a; D:\01sourcecode\10Tutorial\08Vue\17-2022-12-28-v2\elementui-demo npm install axios …

Redis单线程为什么这么快?

Redis单线程为什么这么快&#xff1f; 第一章 Redis单线程为什么这么快 Redis深度剖析【第一章】Redis单线程为什么这么快&#xff1f;前言一、Redis为什么要使用单线程&#xff0c;而不是多线程&#xff1f;单线程的优势如果Redis使用多线程&#xff1a;既然多线程切换存在消…

【博学谷学习记录】大数据课程-学习第一周总结

Linux服务器 对于Linux操作系统来说&#xff0c;其本身是一个整体&#xff0c;包括Linux内核、系统库和系统程序&#xff0c;Linux内核是其最基础的部分&#xff0c;它实现了对硬件资源的管理&#xff0c;并且提供了使用这些硬件资源的通用接口。 自1991年发布Linux内核来&…

项目实战之旅游网(十四)项目部署-Docker

为了节约资源&#xff0c;在生产环境中我们更多的是使用Docker容器部署SpringBoot应用&#xff0c; 我们要用maven里的docker插件来生成镜像并且远程连接Docker&#xff0c; 开启远程docker服务&#xff1a; # 修改docker配置文件 vim /lib/systemd/system/docker.service 把…

简阅人体姿态估计深度学习方法-simpread-Human Pose Estimation Deep Learning Approach

What is Human Pose Estimation? Human Pose Estimation (HPE) is a way of identifying and classifying the joints in the human body Human Pose Estimation(HPR 人体姿态估计)是一个对人体关节进行识别和分类的方法。 Essentially it is a way to capture a set of co…

Good Bye 2022: 2023 is NEAR C. Koxia and Number Theory

原题链接&#xff1a;Problem - C - Codeforces 题意&#xff1a; 给定一个长度为n的数组&#xff0c;请问是否存在一个数 x &#xff0c;使得任意两个数 与满足 。若是输出 YES &#xff0c;反之输出 NO 。 思路&#xff1a; 我们可以发现一个规律&#xff1a; 规律&#…

本周大新闻|沙特PIF再投Magic Leap,周融资超5.1亿美元

本周大新闻&#xff0c;AR方面&#xff0c;OVER推出众包AR地图Map2Earn&#xff1b;AR房产平台homeAR推扫码看房功能&#xff1b;苹果智能指环专利公布&#xff0c;支持手势和触觉反馈。 VR方面&#xff0c;奇遇MIX正式发布&#xff1b;AjnaLens将发布新XR头显&#xff1b;Gen…

Cartesi 2022 年 12 月回顾

查看你不想错过的更新2022 年 12 月 31 日 &#xff0c;我们将继续保持高昂的建设斗志一直持续到2023年。我们在2022年年底前参加了两次编程马拉松&#xff0c; 并不是一次。我们将 Cartesi 的技术带给了ETH India 活动的2000 多名建设者&#xff0c;我们还与 SuperwomenDAO 合…

RabbitMQ消息确认

目录 1. 消息确认作用 2 开发示例 2.1 生产者确认 2.2 消费者确认 1. 消息确认作用 保证消息的可靠性主要依靠三种机制&#xff1a;一个是消息的持久化&#xff0c;一个是事务机制&#xff0c;一个就是消息的确认机制。 1&#xff09;消息持久化 消息持久化是将消息写入…

卷径计算详解(卷径通过卷绕的膜长和膜厚进行计算)

有关卷绕+张力控制可以参看专栏的系列文章,文章链接如下: 变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环算法,可以查看专栏的其它文章,链接地址如下:PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博客。https://blo…

双向链表的双向冒泡排序、红白蓝砾石排序、算法设计4-5

&#xff08;PS&#xff1a;直接拿的友友zy的&#xff09; 一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.1 Last edited: 2023.1.1 目录 &#xff08;PS&#xff1a;直接拿的友友zy的…

添加USB wifi驱动到RK3568

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、USB接口的wifi芯片二、使用步骤wireless tools 移植wireless tools 工具测试wpa_supplicant 移植openssl 移植libnl 库移植WIFI 联网测试总结前言 在日常开…

CTF-Web渗透(入门|笔记|工具)

php各种漏洞绕过 传送门&#xff1a;https://cloud.tencent.com/developer/article/2127498 php伪协议 详细博客讲解&#xff1a; https://blog.csdn.net/cosmoslin/article/details/120695429 http://hummer.vin/2022/05/10/PHP%E4%BC%AA%E5%8D%8F%E8%AE%AE/ https://ww…

Codeforces Round #833 (Div. 2)

题目链接 A. The Ultimate Square 题意&#xff1a; 给你一个n&#xff0c;表示有n块砖&#xff0c;第i块砖是1*(i/2)&#xff0c;这里是上取整&#xff0c;问你最大能组合成的正方形的边长是多少 思路&#xff1a; 观察样例就会发现是n/2上取整&#xff0c;下面看代码&…

快速了解网络原理

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 局域网和广域网 局域网 局域网组建的方式 广域网 网络通信基础 IP地址 端口号 协议 什么是协议 协议分层 分层模型 OSI七层模型 TCP/IP…