最近有个以前的ssm项目需要在新电脑上运行测试一下,发现需要redis环境,看了官网说:有两种选择:
1. 要么在虚拟机比如vmware安装linux基础环境,然后再安装redis
2. 要么可以利用win10的wsl linux子系统安装ubuntu,然后再安装redis
总之,需要linux环境
由于这是台新台式机,不想使用vmware安装,于是尝试安装了wsl版的ubuntu.
安装方法很简单: 在microsoft store应用商店里搜索ubuntu, 然后点击获取,下载完成以后。
点击打开即可。刚开始会提示初始化用户名,确认点几个回车以后,就可以用了。
但是这个ubuntu系统有个致命的问题: 通过lsof,netstat命令查看端口是没有任何输出的!
换句话说: 你没法使用lsof,netstat命令确定一个服务的状态是否是运行的!
这个问题相当糟糕,是一个非常严重的问题。
我查了很多资料,都没有找到原因,后来在下面的一篇文章中找到了线索:
https://www.reddit.com/r/bashonubuntuonwindows/comments/8cjko7/list_open_files_lsof_not_working/
I think I found the answer.
netstat and lsof both use /proc/net/* files including /proc/net/tcp to identify sockets, their type and status. These files are empty in WSL causing the socket to not be identified.
There is work being done to add netstat support, which leads me to believe that /proc/net/tcp and other files will contain information and thus lsof will work.
简单说: 就是netstat和lsof是使用/proc/net/目录下的文件来查询socket, 因为linux一切皆文件。
但是在wsl系统中/proc/net/目录下的这些文件都是空的!,所以运行netstat和lsof比如没有任何输出!
那么怎么解决这个问题呢,也查了很多资料,据说把wsl有两个版本: wsl1和wsl2,把wsl1升级到wsl2,然后重装ubuntu即可。
先检查一下系统是否满足安装wsl2的要求:
Windows 版本: WSL 2 是从 Windows 10 版本 1903 及更高版本开始引入的。较早的 Windows 版本可能无法使用 WSL 2。
64 位系统: WSL 2 只支持 64 位的 Windows 操作系统。确保你的计算机硬件和操作系统都是 64 位的。
虚拟化支持: WSL 2 使用虚拟化技术(通常是 Hyper-V)来在 Windows 中运行一个真正的 Linux 内核。你的计算机必须支持虚拟化,并且虚拟化选项必须在 BIOS 或 UEFI 中启用。大多数现代计算机默认启用了虚拟化支持,但你可能需要在 BIOS 或 UEFI 设置中检查确认。
首先第一步:升级wsl1到wsl2:
a. 用管理员权限打开powershell,运行下面的命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新启动
然后打开控制面板,在程序与功能
—>启用或关闭Windows功能
,检查下图中红框圈处是否已经勾选;若没有,则需要勾选并确认。
b. 接着安装wsl升级包: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
至此wsl2安装完毕
注意:为了保证wsl2能彻底生效,需要运行下面的命令:
wsl --set-default-version 2
就是默认全局使用wsl2,注意:这一步非常,非常重要!是真正启用wsl2的关键!
然后第二步就是安装ubuntu了:
这里分两种情况:
1. 如果是已经安装过了ubuntu的,需要将其卸载
然后从microsoft store应用商店里搜索ubuntu重新获取并安装即可。
这时候运行wsl -l -v就会发现wsl version版本是2了。
此时再使用lsof命令查询端口就会有输出信息了:
网上有种方法:wsl --set-version Ubuntu 2,进行wsl2的重新绑定并完成迁移,但是我试过了,没有效果。不知道是不是需要:先将ubuntu程序进行重置,然后再通过wsl --set-version命令进行绑定。各位可以试试看。
2. 第二种情况:如果全新安装ubuntu的,直接从microsoft store应用商店里搜索ubuntu获取安装即可。
至此问题全部解决。
然后补充一下关于wsl的知识:
WSL是适用于Linux的Windows子系统(英语:Windows Subsystem for Linux,简称WSL)是一个为在windows10和windows server 2019以上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。
WSL 1是通过适配层实现的,当你在 WSL 1 中运行 Linux 命令时,这些命令会发送到适配层,然后适配层将 Linux 系统调用转换为 Windows 系统调用。
WSL1不是将非原生功能包装到Win32系统调用中,而是利用NT内核执行程序将Linux程序作为特殊的、隔离的最小进程(称为“pico-processes”)作为专用系统连接到内核模式“pico-providers”。
Linux 应用程序实际上是在 Windows 用户模式进程中运行,因此它们与 Windows 主机操作系统共享一些资源。这可能导致一些限制,特别是在内存和进程管理方面。
WSL1 和 WSL2。它们最大的不同是,WSL1 是基于动态翻译的方式将 Linux 的系统调用翻译成 Windows NT的系统调用,所以WSL1并不是原生的linux内核
开发者在 WSL1 中遇到的问题就是,部分 linux 的命令无法成功运行。当你遇到这个问题,将会一件非常恼火的事情。比如,WSL1 中无法成功运行 docker,因为需要 linux 关于命名空间的系统调用,而 WSL1 并不支持。最终,微软还是决定使用虚拟化技术来克服这一问题
而 WSL2 是基于虚拟机的,通过在虚拟机中运行真正的 Linux 内核,显著提高了性能。它更接近于原生 Linux 环境,可以更好地处理文件系统 I/O 和网络性能。
- WSL 1:在WSL 1中,Windows主机操作系统和Linux子系统之间使用了适配层。Linux系统调用被转换为Windows系统调用,但它仍然是运行在Windows宿主操作系统的子系统。
- WSL 2:WSL 2通过在Windows宿主系统上运行一个真正的Linux内核实现了更高的兼容性。它通过虚拟机(基于Hyper-V技术)来运行这个内核,从而更接近于独立的Linux环境。