admin管理员组

文章数量:1567915

WSL和Linux系统

WSL(windows for linux)是由Microsoft开发的Linux兼容层,运行在Windows系统之上。而Linux系统则是独立的操作系统, 其有很多种大同小异的发行版本,常见的有Ubuntu, CentOS, Mint, Fedora等。主要差别在于:WSL无法使用Linux内核,而是使用微软开发的内核接口换,无法运行尤其是涉及底层系统调用的应用。相同点在于:系统上层应用和系统调度上两者基本一致的。毕竟已经从名字上表明了WSL的使用意图。
总之,wsl是windows子系统,windows可以控制wsl的服务。而且wsl的系统开机逻辑和Linux系统也是一致的。所以解决题目的思路有两个:
思路一,由windows去控制wsl自动启动sshd服务。
思路二,wsl自己设置开机自动启动sshd服务。
本文以WSL2的Ubuntu22.04为例进行讲解,其他操作系统命令大多大同小异,会顺带提一些重点,其他的就不多做赘述了。

方法一:修改windows启动wsl的启动脚本

  1. win+R键调出运行cmd,输入shell:startup,点击确定后进入开始菜单启动程序目录(大致是C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup);
  2. 进入到该目录创建一个StartWsl.vbs的文件(可以先创建一个名StartWsl的txt文件,然后在windows的powershell终端,同样进入到该目录,然后输入命令:mv ./StartWsl.txt ./StartWsl.vbs)。
  3. 编辑该文件
cmd="wsl -d Ubuntu-22.04 -u root -e /etc/init.d/ssh start"
CreateObject("Wscript.Shell").run cmd,vbhide
  1. 重启wsl服务。以管理者身份打开powershell输入以下命令:
wsl --shutdown

方法二:修改wsl伪Linux的启动脚本

Linux/类Unix系统的服务管理方式

在按思路二解决问题先要搞清楚Linux系统的服务管理方式,否则是没法修改开机配置以自动启动sshd服务的,因为不同的管理方式启动命令完全不一样那个。

  1. systemd
    代表系是Ubuntu16+等,systemd是现代Linux系统常用的服务管理工具,它管理系统服务、设备、机器状态、异常处理等。
    主要命令有:
  • systemctl:管理系统服务的启动、停止、重启、启用、禁用等
  • journalctl:查询系统日志
  • loginctl:管理用户登录会话
    配置文件主要为服务单元文件,以.service为后缀。
  1. SysVinit
    代表系统:CentOS等,SysVinit是较早的一种管理方式,主要使用/etc/init.d目录下的服务脚本来启动和停止服务。
    主要命令有:
  • service:启动、停止、重启服务
  • chkconfig:设置服务开机自启动
  1. Upstart
    代表系统:Gentoo/Chromiumos等,Ubuntu早期版本使用Upstart进行服务管理,它的配置文件为/etc/init目录下的.conf文件。
    主要命令有:
  • start/stop/restart 服务:管理服务
  • initctl:管理系统服务
  1. rc.d
    代表系统:Builldroot裁剪的Linux系统,多用于嵌入式。rc是最早的服务管理方式,主要使用/etc/rc.d/init.d目录下的脚本来管理服务。
    主要命令为服务脚本中的start、stop、restart等来启动和停止服务。

WSL2的Ubuntu22.04的服务管理方式默认是SysVinit,但是可切换为systemd。他们开启开机启动sshd服务的命令分别为:

sudo chkconfig sshd on #SysVinit
sudo systemctl enable sshd #systemd

由于systemd作为一种现代的服务管理方式,更加方便和快捷。rc.d和Upstart方式已被主流替代,SysVinit逐渐被替代。所以推荐选择systemd的管理方式,以后使用linux系统服务会方便很多。切换方式为在wsl的Linux系统的终端输入以下命令:

[ -f /etc/wsl.conf ] && sudo touch /etc/wsl.conf
sudo echo "[boot]" >>  /etc/wsl.conf
sudo echo "systemd=true" >> /etc/wsl.conf

然后需要重启wsl服务,以管理者身份打开powershell输入以下命令:

wsl --shutdown

然后重新代开wsl的终端即可。

修改开机脚本

  1. sytemd管理方式
    正常情况下切换到systemd后,不需要做任何事情,因为openssh-server安装后默认开机开启sshd服务。自动开启wsl后,测试命令 ps -aux | grep sshd | wc -l 的值不大于1,就说明sshd服务没有自动开起。大于1就说明成功了。但据网友反馈,wsl原装的openssh-server是有问题的,可能导致服务启动不正常。所以没成功的话请尝试卸载再重装openssh-server,以防万一我们再手动设置开机自动开启sshd服务:
sudo apt remove -purge openssh-server
sudo apt install openssh-server
sudo systemctl enable sshd
  1. SysVinit管理方式
    倘若不想切换管理方式为systemd,要开启开机自动启动sshd服务也是可以的:
sudo chkconfig sshd on

本文标签: 子系统WindowsWSLsshd