文章目录
- 一、什么是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
计算机上同时访问 Windows
和 Linux
的强大功能。
通过适用于 Linux
的 Windows
子系统 (WSL
),开发人员可以安装 Linux
发行版(例如 Ubuntu
、OpenSUSE
、Kali
、Debian
、Arch Linux
等),并直接在 Windows
上使用 Linux
应用程序、实用程序和 Bash
命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。
如果使用Windows 10 2004
以上,可以通过WSL 2
来窗口化运行桌面应用,也不需要另外安装其他的X 服务器
。
WSL
支持的文件系统需要满足两个目标:
- 提供一个完全支持
Linux
文件系统的环境 - 能够与
Windows
上的设备和文件互通
二、安装WSL
安装WSL
需要具备两个前提:
- 电脑运行的必须是
Windows10
或Windows11
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
”服务,我安装它只是想来快速验证一下,在宿主机同一内网下的其他电脑的浏览器中,能否访问WSL
中CentOS
系统上的服务。
在其他电脑上通过访问宿主机IP地址来访问“httpd
”服务(默认80端口,所以不用带端口号、直接访问IP
即可),显示无法访问。
看了一下宿主机与其他主机之间是可以相互ping
通的,这表明内网网络没问题:
但是排查CentOS
的主机地址却发现它的内网地址是172开头的:
这就意味着,WSL
中的CentOS
服务器网络虽然和宿主机互通,但是和宿主机同一内网下的其他主机却不互通!
那么如何来解决这个问题呢?这就要涉及到WSL
服务器和宿主机之间的端口映射问题了。
六、解决WSL&宿主机端口映射问题
要让宿主机(192.168.31.55)同一内网的其他机器访问 WSL
中 CentOS
服务器(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
实践的全过程。