我是靠谱客的博主 着急红牛,最近开发中收集的这篇文章主要介绍Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)

概述

文章基于如下环境:

  1. 已开启WSL2的win10或者win11
  2. WSL2下的CentOS7:下载地址为:CentOS7

自从win10支持WSL2以来,可以说大大方便了做开发的猿们;在windows下开启WSL2后;可以部署ubuntu、debian、CentOS等等各种Linux发行版作为开发调试环境。方便地在工作和娱乐之前进行无缝切换,再也不用开启笨重的虚拟机、感叹电脑性能不足了。

WSL2和虚拟机相比,具有启动速度快、占用资源少等优点。微软做过测试,性能和真机下的Linux系统几乎一样。但无如作为生产力工具,仍有一点欠缺;最大的问题就是:不支持systemctl命令!

本文就是记录Win10下的WSL2-CentOS7如何开启systemctl命令的过程的。

实现方式有三种,以下一一道来:

方式一:守护进程daemonize+脚本实现

如果是win10且WSL版本为1.0.0版本以下的,推荐使用此方案。

安装依赖

以下均为CentOS yum命令:

  • 安装字体依赖

    yum install fontconfig -y

  • 安装Linux守护进程运行命令daemonize(需先安装epel模块第三方仓库,否则会找不到包)

    yum install daemonize -y

  • 安装nsenter ; nsenter 位于 util-linux 包中

    yum install util-linux -y

创建脚本开启systemd命令

  • 执行以下命令在启动目录(/etc/profile.d/)下创建一个脚本:00-wsl2-systemd.sh

    vim /etc/profile.d/00-wsl2-systemd.sh

  • 将如下内容写入(复制粘贴到命令行窗口)

    SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk 'NR==1{print $2}')
    if [ -z "$SYSTEMD_PID" ]; then
      sudo 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 'NR==1{print $2}')
    fi
    if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
       exec sudo /usr/bin/nsenter -m -u -i -n -p -t $SYSTEMD_PID /bin/su - $LOGNAME
    fi
    echo "systemctl命令已启用:SYSTEMD_PID=$SYSTEMD_PID"
    

    命令踩坑记录:

    1、第1行和第4行命令:awk ‘NR==1{print $2}’ ;此命令为返回第一行第二个字段; 网上找到的原命令为awk ‘{print $2}’;没有指定行数; 当WSL2冷启动时;会出现返回多行结果,导致第7行命令拼接时,变成2行2个命令;最终报错!报错如图:

    如需更多了解awk命令,请参考:Shell脚本之awk(基础用法)

    2、第7行命令:网上找到的原命令为:exec sudo /usr/bin/nsenter -a -t $SYSTEMD_PID /bin/su - $LOGNAME

    在CentOS中把-a替换为 -m -u -i -n -p;原因是nsenter工具版本不同而导致命令不同,在CentOS中的nsenter工具没有-a指令;参考:巧用 Nsenter 调取宿主机工具调试容器内程序

  • 保存退出

    :wqa

开启效果展示

  • 在Terminal中打开新的命令行窗口查看效果;记住一定要打开新窗口;这是为了预防如果出错,还可以在当前窗口把脚本文件删除进行恢复。我第一次的时候就是把当前窗口关闭后重新打开,结果出错了无法进入CentOS; 只能重新安装重来。不出意外 ,当看到如下红框圈住部分:

    image-20220117160739366

  • 执行systemctl查看效果:

    systemctl list-unit-files --type=service
    image-20221012152305977

方式二:开源项目支持systemd命令

开源项目:wsl-distrod

优势:支持win10,支持多种linux分发版本,例如:Ubuntu, Debian, Arch Linux, Fedora, CentOS, AlmaLinux, Rocky Linux, Kali Linux, Linux Mint, openSUSE, Amazon Linux, Oracle Linux, Gentoo Linux

方式三:官方支持systemd命令(推荐)

具体详见:

Systemd support is now available in WSL!

WSL2正式版本 v1.0.0 发布

2022年11 月 16 日,微软在 GitHub 上线了 WSL 1.0.0 版本,宣布 Windows 11/10 的 Linux 子系统删除 Preview 标签,迎来正式版。

Windows 11/10均可以在应用商店下载安装。或者通过 https://aka.ms/wslstorepage 链接跳转到微软应用商店来安装最新版本的wsl。

需要注意的是,Windows10需要安装KB5020030补丁, WSL 1.0.0 版本 才可以正常运行,否则会报如下错误:

Windows 10 support for WSL

Windows 版本10.0.19045.2251不支持打包版本的 适用于 Linux 的 Windows 子系统。
有关信息,请访问https://aka.ms/wslinstall
按任意键继续...

KB5020030补丁可以使用win10自动检查更新进行安装,如果检查后没有,也可以在 Windows更新补丁下载站 手动下载此补丁进行安装。

systemd 支持

WSL 中的高级设置配置

若要启用 systemd,请使用sudo管理员权限在文本编辑器中打开文件wsl.conf,并将以下行添加到/etc/wsl.conf

[boot]
systemd=true

然后,需要使用 PowerShell 关闭 WSL 分发 wsl.exe --shutdown 版来重启 WSL 实例。 分发重启后,系统应运行。 可以使用以下命令进行确认: systemctl list-unit-files --type=service这将显示服务的状态。

如果需要使用微软官方支持的systmed,在目前(2022-11-18)来说你需要满足这些前置条件:

  1. 操作系统为windows 11且wsl 版本为 0.67.6 或以上
  2. 操作系统为windows 10 22H2 且已安装补丁KB5020030 且 wsl 版本为 1.0.0 或以上

查看wsl版本号命令为: wsl --version,如果此命令未正常回显版本号,或版本号低于0.67.6,那么你安装的wsl还不支持systemd。

备注

备注:systemctl命令开启成功后,可以使用命令:【systemctl enable 服务名 】对服务设置开机启动。

经过测试,对docker设置开机启动成功,但启动较慢,大概需要6分钟左右,docker才完成开机启动,这还是在docker没有安装任何容器的情况下。
此文基本CentOS如果是debian 或者 ubuntu,推荐使用方案三。

最后

以上就是着急红牛为你收集整理的Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)的全部内容,希望文章能够帮你解决Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部