WSL:在Windows上直接运行Linux子系统

文章目录

  • 一、什么是WSL
  • 二、安装WSL
    • 1.WSL准备工作
    • 2.安装WSL
  • 三、WSL安装CentOS
    • 1.下载系统文件并解压
    • 2.导入CentOS
    • 3.启动CentOS
    • 4.WSL其他常用命令
  • 四、解决WSL中systemd支持问题
    • 1.问题始末
    • 2.安装systemd
  • 五、安装“httpd”服务
  • 六、解决WSL&宿主机端口映射问题
    • 1. CentOS防火墙开放指定端口
    • 2. 在宿主机上设置端口转发
    • 3. 开放宿主机防火墙
    • 4. 在内网其他机器上再次访问httpd服务
    • 5. 持久化设置(可选)
  • 写在最后

一、什么是WSL

Windows Subsystem for Linux(简称WSL),是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,开发人员可以在 Windows 计算机上同时访问 WindowsLinux 的强大功能。

通过适用于 LinuxWindows 子系统 (WSL),开发人员可以安装 Linux 发行版(例如 UbuntuOpenSUSEKaliDebianArch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。

如果使用Windows 10 2004以上,可以通过WSL 2来窗口化运行桌面应用,也不需要另外安装其他的X 服务器

WSL支持的文件系统需要满足两个目标:

  1. 提供一个完全支持Linux文件系统的环境
  2. 能够与Windows上的设备和文件互通

二、安装WSL

安装WSL需要具备两个前提:

  • 电脑运行的必须是Windows10Windows11
  • Windows必须开启虚拟化

1.WSL准备工作

① 查看Windows是否开启虚拟化

systeminfo

出现如下提示表示虚拟化正常,可以运行WSL
在这里插入图片描述

2.安装WSL

wsl --install

执行安装命令,自动安装虚拟机平台,同时会默认安装 Ubuntu 系统:
在这里插入图片描述

三、WSL安装CentOS

下面以安装CentOS系统作为演示。

1.下载系统文件并解压

下载地址:https://github.com/mishamosher/CentOS-WSL,选择要下载的版本下载到本地。例如下载CentOS8,选择zip文件下载:
在这里插入图片描述
解压zip文件,解压后会多出来一个rootfs.tar.gz文件
在这里插入图片描述

2.导入CentOS

导入参数释义:

wsl --import <发行版名称> <安装路径> <tar/镜像文件路径> [选项]
  • <发行版名称>:自定义 WSL 实例名
  • <安装路径>WSL 系统的存储目录(如D:\wsl\ubuntu
  • <tar/镜像文件路径>:系统镜像文件(.tar.gz / .vhdx / .img
  • –version <1/2>:指定 WSL 版本(默认 2)

例如,导入CentOS8

wsl --import CentOS8 C:\wsl\CentOS8 C:\wsl\CentOS8\rootfs.tar.gz --version 2

导入成功后会出现如下提示:
在这里插入图片描述

首次导入成功,电脑会弹出一个WSL的欢迎窗口:
在这里插入图片描述
同时本地会多出一个ext4.vhdx文件
在这里插入图片描述

3.启动CentOS

wsl -d CentOS8

设置为默认发行版(可选)

wsl --set-default CentOS8

设置完成后即可直接通过“wsl”命令进入CentOS,不必再指定版本
在这里插入图片描述

4.WSL其他常用命令

wsl --shutdown  # 关机
wsl --unregister  # 注销实例
wsl -l -v  # 查看所有 WSL 发行版及其版本(WSL可以同时安装多个实例)

四、解决WSL中systemd支持问题

1.问题始末

之所以要解决这个问题,是因为我在执行“systemctl”命令想要查看已安装的一个“httpd”服务的状态时出现了报错,导致该命令无法使用:
在这里插入图片描述
后来问了一下大模型,原来是因为 WSL 默认的 init 系统不是 systemd

2.安装systemd

可以通过以下方法解决上面的问题:

① 确保已启用 WSL2

可以在 PowerShell 中使用命令“wsl -l -v”查看当前 WSL 版本,如果不是 WSL2,可以通过命令“wsl --set-version <distribution name> 2”将指定的发行版设置为 WSL2

② 安装 systemd

编辑/etc/wsl.conf文件(如果没有则创建),添加以下内容:

[boot]
systemd=true

③ 重启 WSL

可以在 PowerShell 中使用wsl --shutdown关闭 WSL,然后重新打开。

④ 再次执行“systemctl”命令

通过“systemctl”命令启动和查看“httpd”服务正常:
在这里插入图片描述

五、安装“httpd”服务

这里顺便提一下“httpd”服务,我安装它只是想来快速验证一下,在宿主机同一内网下的其他电脑的浏览器中,能否访问WSLCentOS系统上的服务。

在其他电脑上通过访问宿主机IP地址来访问“httpd”服务(默认80端口,所以不用带端口号、直接访问IP即可),显示无法访问。
在这里插入图片描述
看了一下宿主机与其他主机之间是可以相互ping通的,这表明内网网络没问题:

在这里插入图片描述
但是排查CentOS的主机地址却发现它的内网地址是172开头的:
在这里插入图片描述
这就意味着,WSL中的CentOS服务器网络虽然和宿主机互通,但是和宿主机同一内网下的其他主机却不互通!

那么如何来解决这个问题呢?这就要涉及到WSL服务器和宿主机之间的端口映射问题了。

六、解决WSL&宿主机端口映射问题

要让宿主机(192.168.31.55)同一内网的其他机器访问 WSLCentOS服务器(172.29.217.192)上的服务,需要通过端口转发将请求从宿主机转发到 CentOS。以下是具体步骤:

1. CentOS防火墙开放指定端口

确保 CentOS 中的服务已启动并监听正确端口(例如上面httpd服务的80端口)。防火墙开放相关端口:

# 开放服务端口(例如SSH)
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload

2. 在宿主机上设置端口转发

Windows宿主机的 PowerShell(管理员权限)中执行以下命令,将宿主机的特定端口转发到 CentOS 的对应端口:

# 示例:将宿主机的81端口转发到CentOS的80端口(httpd)
netsh interface portproxy add v4tov4 `
    listenaddress=0.0.0.0 listenport=81 `
    connectaddress=172.29.217.192 connectport=80

3. 开放宿主机防火墙

在宿主机上开放刚才设置的转发端口(例如81):

New-NetFirewallRule -DisplayName "WSL httpd 81" -Direction Inbound -Protocol TCP -LocalPort 81 -Action Allow

在这里插入图片描述

4. 在内网其他机器上再次访问httpd服务

使用宿主机的 IP 地址(192.168.31.55)和转发的端口81再次访问 CentOS 上的httpd服务,打开正常:
在这里插入图片描述

5. 持久化设置(可选)

上述端口转发只是起到临时转发作用,在宿主机或WSL重启后会失效。若需持久化,可创建 PowerShell 脚本并添加到启动项来解决。操作步骤如下:

① 创建脚本文件

# 创建脚本文件(例如D:\wsl\wsl-portproxy.ps1)
@"
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=81 connectaddress=172.29.217.192 connectport=80
"@ | Out-File -FilePath D:\wsl\wsl-portproxy.ps1 -Encoding ASCII

② 添加到任务计划程序(以管理员身份运行)

# 添加到任务计划程序(以管理员身份运行)
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File D:\wsl\wsl-portproxy.ps1"
$trigger = New-ScheduledTaskTrigger -AtLogon
Register-ScheduledTask -TaskName "WSL Port Proxy" -Action $action -Trigger $trigger -User "NT AUTHORITY\SYSTEM" -RunLevel Highest

需要注意的是,后续若继续添加了其他端口号转发,修改了PowerShell 脚本文件后,不能在宿主机上直接再次运行“Register-ScheduledTask”注册命令,因为已经存在调度任务了。需要先运行“Unregister-ScheduledTask”取消注册后,再运行“Register-ScheduledTask”注册命令。
在这里插入图片描述

写在最后

好啦,上述就是WSL实践的全过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjzhang75

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值