WSL打造Windows下更顺畅的双系统之终篇
2024年08月17日 22:23:56 Windows ⁄ 共 3884字 暂无评论 ⁄ 被围观 231次

​前几天有朋友问我找一下WSL的文章,说公众号里的东西太多没翻到,所以我就定义了一个关键字 wsl 的自动回复,不过还是将二更的文章发给了朋友,又说了下设置开机自启动在一更的文章里。

自己说完之后都感觉很麻烦,所以就想着把两篇合称一篇做一个最终章。

WSL的全称是Windows Subsystem for Linux,是微软拥抱开源的里程碑式功能,从Windows10开始支持,从而使得在Windows系统的基础上可以运行类原生Linux系统,为什么想到了类原生这个概念呢?因为Linux的某些功能确实在WSL上无法实现,比如docker在WSL1上是不可用的。

虽然WSL有一些限制,但是对于日常学习、了解和使用还是非常方便的,那么如何在Windows10以及高版本使用WSL呢?大概分三步:

  1. 开启wsl功能;
  2. 安装一个发行版本;
  3. 初始化:初始化系统、安装其他的服务、开机自启动等。

1、开启WSL功能

默认情况下Windows没有开启WSL的功能,所以第一步就是要在控制面板——程序——启用或关闭Windows功能里开启WSL,开启后需要重启电脑才能生效:

2、安装一个Linux发行版本

开启了WSL功能后,需要安装一个Linux系统,可以通过两种方式安装:

  1. 直接通过微软商店的GUI安装;
  2. 通过wsl命令安装。

2.1、通过微软商店GUI安装

打开微软商店,搜索Linux后就会看到诸多WSL下的Linux发行版本,比如安全类的Kali,日常用的Debian、Ubuntu、Suse等等。

选择一个想使用的版本安装即可,比如我选择的是Ubuntu:

2.2、通过wsl命令行安装

如果微软商店被限制下载非授权的软件或者其他原因等无法使用GUI安装,或者想做自动化开发,可以尝试使用 wsl 命令来安装管理Linux系统。

首先可以通过 wls --list --online 查看可以安装的Linux版本,这里可能会遇到“无法解析服务器名词或地址”的错误:

左右滑动
PS C:\> wsl --list --online
无法解析服务器的名称或地址
PS C:\>
PS C:\>

解决办法是规避魔法的DNS查询,直接将URL的解析放到C:\Windows\System32\drivers\etc\hosts里,这里推荐使用notepad--软件进行更新(懂的都懂!!!),更新内容如下:

##左右滑动
185.199.108.133   raw.githubusercontent.com

然后就可以通过 wsl --list --online查看可以安装的版本了:

左右滑动
PS C:\> wsl --list --online
以下是可安装的有效分发的列表。
请使用“wsl --install -d <分发>”安装。

NAME                   FRIENDLY NAME
Ubuntu                 Ubuntu
Debian                 Debian GNU/Linux
kali-linux             Kali Linux Rolling
Ubuntu-18.04           Ubuntu 18.04 LTS
Ubuntu-20.04           Ubuntu 20.04 LTS
Ubuntu-22.04           Ubuntu 22.04 LTS
Ubuntu-24.04           Ubuntu 24.04 LTS
openSUSE-Tumbleweed    openSUSE Tumbleweed
PS C:\>

之后通过 wsl --install -d <Linux发行版NAME> 安装,比如选择Ubuntu(安装的是最新的Ubuntu版本):

左右滑动
C:\Users\username>wsl --install -d ubuntu 
Downloading: Ubuntu 
Installing: Ubuntu 
Ubuntu has been installed. 
Launching Ubuntu... 

3、初始化Linux系统

不管是通过微软商店GUI后需要手打还是 wsl 命令安装都需要初始化Linux系统。

如果是通过微软商店GUI安装的,需要手动在开始菜单栏打开运行Linux系统(当然也可以直接搜索Linux的名字打开):

打开后等一段时间初始化,就会提示添加一个新用户,此用户会默认带sudo功能(什么是sudo?不知道的可以留言),然后设置用户名密码即可,如果是通过 wsl 命令安装的,安装完成有可能会自动加载(Launch),跳出下图初始化界面了,如果没有,按照上述介绍手动加载(Launch):

4、运行Linux子系统

有三种方法运行Linux系统。

一是搜索bash打开:

二是通过Win下的命令行模式:打开cmd之后运行bash命令,就可以进入Linux系统。

三是通过开始菜单栏打开安装的Linux系统或搜索Linux系统名,比如我使用的Ubuntu:

5、开启远程登录

不管是通过cmd运行bash,还是开始菜单栏运行Linux系统,在使用中不是很方便,比如复制粘贴、记录log等等,都无法很舒服的实现。

在简单的摸索后,终于实现了使用putty、secureCRT、xshell等软件的远程登录。

第一步是要先检查子系统中是否开始了sshd服务,如果没有开启,使用相应命令开启。

然后配置一下sshd服务(vi /etc/ssh/sshd_config),比如修改一下port等等,比较重要的是要检查是否允许使用密码登录,修改完成需要重启ssh服务:

Note:对于图片中could not load host key的错误,可以通过执行“dpkg-reconfigure openssh-server”来解决:

接下来就可以通过远程登录Linux子系统了(IP:127.0.0.1,Port:sshd_config中设置)。

注意:最新的Ubuntu比如24.04已经默认安装了ssh,但是尝试启动ssh服务的时候可能会遇到 no hostkeys available的问题:

左右滑动
[root@wsl:~]# service ssh status 
 * sshd is not running 
[root@wsl:~]# service ssh start 
 * Starting OpenBSD Secure Shell server sshd 
 sshd: no hostkeys available -- exiting. 
[fail]

解决方案是通过ssh-keygen -A创建密钥即可:

左右滑动
[root@wsl:~]# ssh-keygen -A 
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
[root@wsl:~]# 
[root@wsl:~]# service ssh start 
 * Starting OpenBSD Secure Shell server sshd         [ OK ] 
[root@wsl:~]# 
  • -A 对于不存在主机密钥的每种密钥类型(rsa、dsa、ecdsa 和 ed25519),生成具有默认密钥文件路径、空密码、密钥类型的默认位和默认注释的主机密钥。

6、开机自启动安装的Linux中的ssh服务

在使用的过程中发现一个问题,就是每次Windows系统重启后,都需要打开Linux系统,然后开启ssh服务后才能再次远程登录,完全没有了什么便利性。

多次尝试后找到了其解决办法,就是通过Windows开机自启动功能调用一个子系统里的脚本来实现,具体设置如下。

首先,要在Linux系统里写一个脚本,并通过chmod命令给脚本添加运行权限,脚本内容如下:

​##左右滑动
echo "<在第三章初始化中设置的密码>" | sudo -S /usr/sbin/service ssh start

然后在Windows下写一个vbs程序(如wsl.vbs),并放到开机自启动的路径下,vbs内容如下:

set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe",0
ws.run "C:\Windows\System32\bash -c '/usr/sbin/ssh_start'",0

自启动路径:**%AppData%\Microsoft\Windows\Start Menu\Programs\Startup**

接下来就可以开机后直接打开secureCRT等远程登录软件顺畅使用Linux子系统了。

Note:朋友说Mobaxterm直接集成了wsl,所以如果使用Mobaxterm不需要vbs自启动可直接登录wsl。

7、后记和体验

自从电脑使用Win10系统后,Cygwin再也没有安装过,VMWare安装也是为了做K8s等实验,至于其他的日常Linux工作,基本都在使用wsl,wsl的Linux里可以使用几乎所有的Linux服务,比如验证自己写的shell脚本、Python脚本等,而且可以在Windows主系统里写代码,然后直接在wsl中验证,这是因为Linux子系统可以直接读取主系统的文件,主系统的各个分区也是自动挂载的:

最后,虽然wsl还有一些局限,比如没有Linux图形界面(但是Linux使用,尤其是运维,还是得靠CLI),再就是不能使用docker等容器技术(wsl2已经可以了),所以想要做更复杂的实验比如K8s等还是要使用BVirtualBox或者VMWare等虚拟机方案,或者自建服务器。

最最后,公众号后台回复 wsl 可以直接获取相关文章!

话说这好像不会是终章,因为wsl2还没有玩儿o(╯□╰)o ​

原文链接:https://menglanglang.blog.csdn.net/article/details/141287521

给我留言

留言无头像?