让wsl中的服务随Win10开机自启动
上一级页面:index-wsl
前言
比如让sshd
/cron
等服务或某个命令、脚本在启动win10的时候自动在wsl中启动或执行。
本文演示了采用微软自己的init.d
服务来运行脚本的方法
但这并不是完整的systemd,不能提供systemctl,如果想要使用完整的systemctl,见wsl2开启systemctl命令简单方法
启动服务步骤:
确定要在哪个wsl分发版本上设置自启动:
如果你不知道自己的 WSL 发行版叫做什么名字,可以用 “wsl -l" 来查看。不管你用最初的 bash (ubuntu 16.04) 还是商店里下载的 debian/ubuntu1804 都能顺利启动服务了。
# 在cmd/powershell执行
PS C:\Windows\system32> wsl -l
适用于 Linux 的 Windows 子系统:
Legacy (默认)
Ubuntu-18.04
这里列出了两个wsl分发版本(Legacy和Ubuntu-18.04),如果我想在Ubuntu-18.04上部署开机自启动服务。
注:wsl2是一个完整的虚拟机系统,启动wsl2相比wsl1要慢一些。因此,win10开机就启动wsl2的话,会导致在慢速启动wsl2的过程中一直有一个黑窗口存在。
如果你的启动脚本中有命令需要root权限,那么可能需要在wsl Ubuntu-18.04中设置无密码sudo:(仅Ubuntu)
# 在wsl Ubuntu-18.04内执行
# 注意加%表示整个用户组无密码使用sudo
# sudo bash -c "echo '%$USER ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/$USER"
sudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/$USER"
创建启动脚本:
进入任意 WSL 发行版中,创建并编辑文件:/etc/init.wsl
#! /bin/sh
/etc/init.d/cron $1
/etc/init.d/ssh $1
/etc/init.d/supervisor $1
里面调用了我们希望启动的三个服务的启动脚本,设置权限为可执行,所有者为 root
,这时候可以通过:
sudo /etc/init.wsl [start|stop|restart]
来启停我们需要的服务,
在%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
中创建快捷方式,其命令行大致如下:
在 Windows 中,开始-运行,输入:
shell:startup
按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root /etc/init.wsl start", vbhide
注:-u指定用户为root,这由你启动的脚本中命令所需的权限,以及脚本的所有者决定
这个脚本就会在你登陆的时候自动在名字为 "debian" 的 wsl 发行版中执行 /etc/init.wsl 启动我们的服务了,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide
如果你需要前台运行(显示一个窗口),可以去除,vbhide
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start"
注:
- wsl启动后,不会在关闭终端后自动退出。
- 但是使用
/etc/init.d/xxx start
启动的服务,会在关闭前台的终端窗口后自动退出,所以如果不需要前台运行,就以vbhide
的方式运行。
重启win10验证。
WSL 中有很多有用的服务,你可以按需删改 /etc/init.wsl ,但没必要塞很多东西进去影响你的启动速度,比如 mysql/mongodb 这些重度服务,可以需要的时候再启动,用完就停了。
我自己用的比较多的服务就三个:sshd(启动了以后支持终端软件登陆wsl,像远程服务器一样操作),supervisord(用于托管其他服务,比如 ssr),crond(crontab,自由定制定时任务),大部分时候,用上面三个足以。
启动完整的wsl
过程类似上面,
在%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
中创建快捷方式,其命令行大致如下:
在 Windows 中,开始-运行,输入:
shell:startup
按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root", vbhide
注:-u指定用户为root,这由你启动的脚本中命令所需的权限,以及脚本的所有者决定
这个脚本就会在你登陆的时候自动启动名字为 "debian" 的 wsl 发行版,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs:
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root", vbhide
如果你需要前台运行(显示一个窗口),可以去除,vbhide
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root"
注:
- wsl启动后,不会在关闭终端后自动退出。
- 但是使用
/etc/init.d/xxx start
启动的服务,会在关闭前台的终端窗口后自动退出,所以如果不需要前台运行,就以vbhide
的方式运行。
重启win10验证。
验证方法
在Windows shell中(cmd、powershell等)运行命令
wsl -l -v
可以看到所指定的发行版以vbhide
的形式运行中
关闭指令:
wsl -t DISTRO-NAME
如:
wsl -t Ubuntu
关闭所有发行版指令
wsl --shutdown