开机自启Windows子系统WSL的守护进程

说明

Windows的WSL子系统极大的方便了Linux软件在windows下的开发。但其有一个极大的缺陷,即几乎没有Init操作,不会启动后台守护进程(至少到文章编写时)。而有时编写软件时又需要用到一些后台进程,如Rsyslog,虽然可以通过手动执行/etc/init.d下的脚本来启动守护进程,但仍然不方便。

操作系统版本

Microsoft Windows [版本 10.0.19042.685]

WSL

ubuntu focal 20.04

具体思路

通过注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 运行一个WSL下的程序,再由该程序完成以下操作:

  1. 提权。(提升到Root权限)
  2. 依次执行/etc/rc3.d/下的文件

注意:此程序在下称为WslInitMutilUser。

程序代码及安装

编译环境

需要安装build-essential软件包

代码

#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"

int main(int argc ,char *argv[])
{
        if(setuid(0) !=0 || setgid(0) != 0)
        {
                printf("Please Run:\n sudo chown 0:0 %s \n sudo chmod +s %s\n\r",argv[0],argv[0]);
                return -1;
        }
        system("bash -c \'for i in `find /etc/rc3.d/`; do bash -c \"$i restart\"; done\'");
        return 0;

}

编译安装

注意:所有sudo安装操作可能需要输入密码。

编译

 gcc WslInitMutilUser.c  -o WslInitMutilUser

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwW8mJu5-1609562829655)(image-20210102120150180.png)]

安装WSL程序

将程序文件复制到/usr/local/bin/,并赋予setuid权限。

sudo cp WslInitMutilUser /usr/local/bin/
sudo chown 0:0 /usr/local/bin/WslInitMutilUser
sudo chmod +s /usr/local/bin/WslInitMutilUser

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzD4A1W9-1609562829663)(image-20210102120559938.png)]

测试WSL程序

在windows下的cmd.exe执行观察是否能正常工作(主要是测试能否正常启动WslInitMuilUser)。

wsl WslInitMutilUser

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-emzFvXMJ-1609562829665)(image-20210102121050395.png)]

写入注册表自启

名字自定义内容如下:

wsl.exe   /usr/local/bin/WslInitMutilUser

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hHEM85n-1609562829667)(image-20210102123848353.png)]

最终效果

开机登陆后会自动启动后台守护进程(一个黑框一闪而逝)。后台进程均自动启动。可在WSL下使用update-rc.d命令管理守护进程的自启。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kOk3FbQn-1609562829669)(image-20210102123710630.png)]

注意事项

有的后台进程(如openssh-server)可能由于WSL本身的初始根文件系统问题不能自启,卸载相关软件包再重新安装即可。

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...