一、说明
WSL2和VMware在功能、性能、安装和使用场景等方面存在显著差异。
1、功能和性能
WSL2:WSL2是微软开发的一种技术,允许在Windows操作系统上运行一个完整的Linux内核,通过虚拟化技术实现。它直接在Windows上运行,资源使用更高效,通常性能更好。WSL2支持多种Linux发行版,如Ubuntu、Debian、Fedora等,并且与Windows共享内核和资源,提供了更好的兼容性和性能VMware:VMware是一个完整的虚拟机软件,可以安装和运行任何支持x86架构的操作系统。VMware提供了更复杂的网络设置、多个虚拟机同时运行、图形界面等功能。虽然VMware在性能上可能会有一些开销,尤其是在资源有限的情况下,但其强大的功能使其在复杂环境中表现更出色
2、安装和使用场景
WSL2:安装过程相对简单,可以通过命令行快速启动,不需要额外的虚拟机管理。WSL2适合进行开发和测试,特别是在需要在Windows环境中运行Linux命令行工具和脚本的场景。由于其与Windows的无缝集成,WSL2在开发和测试环境中非常受欢迎VMware:安装过程相对复杂,需要安装虚拟机软件、创建虚拟机、配置虚拟硬件等。VMware适合需要完整Linux系统或图形应用的场景,尤其是在需要隔离环境进行多操作系统并行运行的场景中表现更好
总结就一点,缺钱就用这个
注意注意注意:用win11,win11,win11
二、准备工作
1、 查看先决条件
bios打开虚拟化
打开Windows功能,打开“适用于Linux的Windows子系统”和“虚拟机平台
Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用命令安装 。 如果使用的是更早的版本需要手动安装。
以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”),然后输入以下命令:systeminfoPS C:\Windows\system32> systeminfo
主机名: X58
OS 名称: Microsoft Windows 11 IoT 企业版 LTSC
OS 版本: 10.0.26100 暂缺 Build 26100
OS 制造商: Microsoft Corporation
bcdedit /set hypervisorlaunchtype auto
PS C:\Windows\system32> bcdedit /set hypervisorlaunchtype auto
操作成功完成。
2、查询wsl版本
管理员身份打开 PowerShell
wsl升级到最新版
#wsl升级到最新版 版本为2.4.12
wsl --update
3、其它命令
wsl --list --verbose #列出已安装的 Linux 发行版
wsl --status # 检查 WSL 状态
wsl --help # Help 命令
wsl --shutdown #关闭
wsl hostname -I #标识 IP 地址
三、手动安装ubuntu 24.04
1、下载发行版
2、解压下载的发行版
下载好是一个AppxBundle文件
将后缀AppxBundle改为zip
解压后目录如下
将上面画红色圈圈的 Ubuntu_2404.0.5.0_x64.appx 后缀appx再次改为zip
再次解压,目录如下
3、运行安装
会跳出来安装wsl2.4.12,看来前面没有下载成功啊
这时候正式开始安装,会产生一个ext4的文件,这个就是镜像
创建用户名密码之后就安装成功了
用户名:ubuntu2404
密码:123456
安装完成
4、查询虚拟机
wsl -l --all -v
四、导出虚拟机
为了方便后面移植,导入导出方便,我们先导出一个虚拟机保存在其它地方
1、关闭虚拟机
wsl -t Ubuntu-24.04
#关闭
PS C:\Windows\system32> wsl -t Ubuntu-24.04
操作成功完成。
PS C:\Windows\system32> wsl -l --all -v
NAME STATE VERSION
* Ubuntu-24.04 Stopped 2
看看已经stop了
2、导出虚拟机文件
一定要先关闭在导出,导出是一个tar文件
wsl --export Ubuntu-24.04 D:\WSL\Ubuntu-24.04.tar
3、卸载虚拟机
这个动作一般别做,请确保已经导出保存了虚拟机
wsl --unregister Ubuntu-24.04
PS C:\Windows\system32> wsl --unregister Ubuntu-24.04
正在注销。
操作成功完成。PS C:\Windows\system32> wsl -l --all -v
适用于 Linux 的 Windows 子系统没有已安装的分发。
注销其实就是删掉了,
五、导入虚拟机
1、导入
# wsl --import <虚拟机名称> <新数据镜像文件的存放文件夹路径> <原来导出的备份文件路径>
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu-24.04 D:\WSL\Ubuntu-24.04.tar
2、查看虚拟机
wsl -l --all -v
PS C:\Windows\system32> wsl -l --all -v
NAME STATE VERSION
* Ubuntu-24.04 Stopped 2
这时候没有启动
3、修改默认虚拟机
# wslconfig /setdefault <选定的虚拟机名称>
wslconfig /setdefault Ubuntu-24.04
PS C:\Windows\system32> wslconfig /setdefault Ubuntu-24.04
操作成功完成。
4、修改默认登陆用户
迁移后登录可能会发现使用的是root登录,而非安装时设置的用户
这里我们需要设置wsl.conf文件,一般存储在/etc/wsl.conf,具体可看官方wiki WSL中的高级设置配置
1、先启动ubuntu,直接执行
PS C:\Windows\system32> wsl
root@x58:/mnt/c/Windows/system32#
sudo vi /etc/wsl.conf
在后面添加
[user] default = ubuntu2404
重启
wsl --list --running
wsl --shutdown 或者 wsl --terminate <发行版名称>
wsl
或者
#启动
wsl -d Ubuntu-24.04
PS C:\Windows\system32> wsl --list --running
适用于 Linux 的 Windows 子系统分发:
Ubuntu-24.04 (默认)
PS C:\Windows\system32> wsl --shutdown
PS C:\Windows\system32> wsl
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu2404@x58:/mnt/c/Windows/system32$
我们看到进入的是 ubuntu2404用户而不是root了,修改了默认用户
六、自动安装ubuntu 24.04
1、我们先注销掉上面安装的系统
wsl --unregister Ubuntu-24.04
注销掉后,在查查
wsl -l --all -v
2、安装wsl
#wsl升级到最新版 版本为2.4.12
wsl --update
3、查看Linux分发
# 查看Linux分发(等同于 wsl -list -online)
wsl -l -o
PS C:\Windows\system32> wsl -l -o
以下是可安装的有效分发的列表。
使用 'wsl.exe --install <Distro>' 安装。NAME FRIENDLY NAME
AlmaLinux-8 AlmaLinux OS 8
AlmaLinux-9 AlmaLinux OS 9
AlmaLinux-Kitten-10 AlmaLinux OS Kitten 10
Debian Debian GNU/Linux
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
Ubuntu Ubuntu
Ubuntu-24.04 Ubuntu 24.04 LTS
kali-linux Kali Linux Rolling
openSUSE-Tumbleweed openSUSE Tumbleweed
openSUSE-Leap-15.6 openSUSE Leap 15.6
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
4、安装指定分发
wsl --install -d Ubuntu-24.04
这种安装方式简单,当然里面有你需要的系统才行,没有就得安装前面的手动安装
PS C:\Windows\system32> wsl --install -d Ubuntu-24.04
正在下载: Ubuntu 24.04 LTS
[ 0.4% ]
PS C:\Windows\system32> wsl --install -d Ubuntu-24.04
正在下载: Ubuntu 24.04 LTS
正在安装: Ubuntu 24.04 LTS
已成功安装分发。它可通过 “wsl.exe -d Ubuntu-24.04” 启动
wsl --shutdown # 全部终止 或者 wsl --terminate <发行版名称> # 终止指定
wsl # 启动默认
或者
#启动
wsl -d Ubuntu-24.04
PS C:\Windows\system32> wsl -d Ubuntu-24.04
Provisioning the new WSL instance Ubuntu-24.04
This might take a while...
Create a default Unix user account: x58win
New password:
Retype new password:
passwd: password updated successfully
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/proSystem information as of Thu Mar 13 23:27:25 CST 2025
System load: 0.18 Processes: 31
Usage of /: 0.1% of 1006.85GB Users logged in: 0
Memory usage: 5% IPv4 address for eth0: 172.19.235.201
Swap usage: 0%
This message is shown once a day. To disable it please create the
/home/x58win/.hushlogin file.
5、安装目录
C:\Users\x58win\AppData\Local\wsl\{ab7dfcc1-ebef-42af-af40-398f1e22f605}
同样有一个ext4.vhdx的镜像文件,和前面一样,我们也可以导出导入
我们自己安装前面操作一遍,这个安装简单多了
我们这次进去的默认用户不是root了,为什么呢,前面conf里设置过了,他是wsl设置的,算全局的了
七、目前wsl状态
1、查看一下目前安装运行情况
# 版本查看
PS C:\Windows\system32> wsl --version
WSL 版本: 2.4.12.0
内核版本: 5.15.167.4-1
WSLg 版本: 1.0.65
MSRDC 版本: 1.2.5716
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows 版本: 10.0.26100.3476
PS C:\Windows\system32>
# 目前安装ubuntu状态
PS C:\Windows\system32> wsl -l --all -v
NAME STATE VERSION
* Ubuntu-24.04 Stopped 2
# 启动 进入linux状态了
PS C:\Windows\system32> wsl -d Ubuntu-24.04
x58win@x58:/mnt/c/Windows/system32$
# 再查 注意新打开一个ps窗口
PS C:\Windows\system32> wsl -l --all -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2
2、windows与wsl文件互访
Windows 访问 WSL 文件:通过
\\wsl$\<DistroName>
路径。这里我的是UbuntuWSL 访问 Windows 文件:通过
/mnt/c/
、/mnt/d/
等路径。
八、网络配置
1、宿主机,也就是我们的windows操作系统本身
C:\Users\x58win>ipconfig
Windows IP 配置
以太网适配器 以太网: ###这里是真实网卡的ip地址,也就是我们windows的外网ip地址连接特定的 DNS 后缀 . . . . . . . :
IPv4 地址 . . . . . . . . . . . . : 192.168.1.13
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.1.1以太网适配器 vEthernet (Default Switch): ###虚拟网卡 wsl安装之后就有了
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::3586:8b6e:e9ab:1b1c%9
IPv4 地址 . . . . . . . . . . . . : 172.18.160.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :以太网适配器 vEthernet (WSL (Hyper-V firewall)): ###虚拟网卡 wsl安装之后就有了
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::c6c9:7541:909:fd1b%24
IPv4 地址 . . . . . . . . . . . . : 172.19.224.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
2、安装的ubuntu子系统网络状况
x58win@x58:/mnt/c/Windows/system32$ sudo ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:6a:e1:5f brd ff:ff:ff:ff:ff:ff
inet 172.19.235.201/20 brd 172.19.239.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe6a:e15f/64 scope link
valid_lft forever preferred_lft forever
我们看 inet 172.19.235.201/20 brd 172.19.239.255,
说明ip地址:172.19.235.201,子网掩码:255.255.240.0,brd: 172.19.239.255
3、测试子系统是否能连接外网
x58win@x58:/mnt/c/Windows/system32$ ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from 39.156.66.10: icmp_seq=1 ttl=44 time=31.0 ms
64 bytes from 39.156.66.10: icmp_seq=2 ttl=44 time=29.6 ms
64 bytes from 39.156.66.10: icmp_seq=3 ttl=44 time=28.6 ms
看情况能连接到外网
4、观察子系统与宿主机网络情况
可以看到windows下WSL初始了一个(172.19.235.201)和子系统同网段(172.19.224.1)的一个网络接口vEthernet (WSL (Hyper-V firewall))
一般WSL初始的子系统ip虽然说是随机的,但我观察一般也没什么变化,为了以防万一,我们也可以给添加一个固定IP,不过我们改
wsl -d <子系统版本名> -u root ip addr add <固定IP>/<掩码> [broadcast <广播地址>] dev eth0 label eth0:1
5、安装ssh
# 目前在root下
# 查询是否安装ssh
dpkg -l | grep openssh-server
或者
systemctl list-unit-files | grep ssh.service
都没有,
# 安装
sudo apt-get update
sudo apt-get install openssh-server
sudo systemctl start ssh
sudo systemctl status ssh
sudo systemctl enable ssh
6、如何通过局域网其他机器访问的wls子系统
简单点就是外网能访问到子系统
在wls2 宿主机windows 11系统中设置端口转发, 由于WSL2使用虚拟网络适配器,具有自己的私有IP地址,因此局域网内的其他机器无法直接访问WSL2实例。为了解决这个问题,我们需要在Windows中配置防火墙和端口转发规则
打开Windows PowerShell,以管理员身份运行。运行以下命令,允许传入连接到WSL2:
New-NetFirewallRule -DisplayName "WSL2 SSH" -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
-DisplayName:为规则指定一个显示名称,这里是 “WSL2 SSH”。
-Direction:指定规则的方向,这里是 “Inbound”(入站)。
-LocalPort:指定要允许的本地端口,这里是 22(SSH 通常使用的端口)。
-Action:指定对匹配的流量采取的动作,这里是 “Allow”(允许)。
-Protocol:指定协议类型,这里是 “TCP”。
运行以下命令设置端口转发规则,将传入的连接转发到WSL2实例:
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=<WSL2_IP_Address>
###<WSL2_IP_Address> 需要一起替换掉,这个需要打开WSL2 然后运行ifconfig就能看到了。
就是我们前面看到的172.19.235.201
7、我们执行上面这两条命令
PS C:\Windows\system32> New-NetFirewallRule -DisplayName "WSL2 SSH" -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
Name : {8db73cd9-2edf-48a4-9cf9-140a816420f2}
DisplayName : WSL2 SSH
Description :
DisplayGroup :
Group :
Enabled : True
Profile : Any
Platform : {}
Direction : Inbound
Action : Allow
EdgeTraversalPolicy : Block
LooseSourceMapping : False
LocalOnlyMapping : False
Owner :
PrimaryStatus : OK
Status : 已从存储区成功分析规则。 (65536)
EnforcementStatus : NotApplicable
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
RemoteDynamicKeywordAddresses : {}
PolicyAppId :
PackageFamilyName :
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=172.19.235.201
PS C:\Windows\system32> netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=172.19.235.201
PS C:\Windows\system32>
#这个没有任何输出
检查执行情况 netsh interface portproxy show v4tov4
PS C:\Windows\system32> netsh interface portproxy show v4tov4
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 22 172.19.235.201 22
PS C:\Windows\system32>
8、ssh连接验证
我的wls子系统登录用户名是:x58win
成功登录
我们在部署时就可以这样开发端口了,比方8080,就干上面两步,应该换个名字,把22改为8080就可以了
九、修改主机名
我们在使用时,导入一个同样的子系统,但是用户名和主机名都一样,不好区分,用户名更改麻烦一点,毕竟有些安装的软件和用户名权限有关,但是主机名还是可以修改的。这样有主机名不一样,也可以
1. 修改hostname
目录: /etc/
编译文件: hostname
指令: sudo vim /etc/hostname
操作:将原主机名修改成新主机名。
2. 修改hosts
目录: /etc/
编译文件: hosts
指令: sudo vim /etc/hosts
操作:将原主机名修改成新主机名。
3. 特别注意
如果出现修改完上述两步,还无法修改主机名,执行此步骤。
原因可能是wsl 没有修改配置文件,导致wsl 每次重启都会恢复默认配置的主机名。
目录: /etc/
编译文件: wsl.conf
指令: sudo vim /etc/wsl.conf
操作:添加代码
[network]
hostname = 《新主机名》
generateHosts = false
注释:generateHosts = false,表示不会自动生成主机配置信息
十、修改并固定ip地址
同一个 虚拟机镜像导入的子系统,ip地址是一样的
看看
inet 172.19.235.201/20 brd 172.19.239.255 scope global eth0
inet 172.19.235.201/20 brd 172.19.239.255 scope global eth0
这样感觉不太好,我们当作子系统就是一个系统,那么我们要求每一个系统ip地址都是不一样的,
所以我们修改一下,其实我也不知道如果两个子系统同一个ip地址,会不会有问题,至少觉得会有问题,找不到主机啊,我们访问时间可都是访问ip的
#在子系统中执行
# 添加新的
sudo ip addr del 172.19.235.201/20 broadcast 172.19.239.255 dev eth0
sudo ip addr add 172.19.235.202/20 broadcast 172.19.239.255 dev eth0
修改了,两个ubuntu 子系统都会更改为统一ip
x58win@minio-kk:/mnt/c/Windows/system32$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:0e:cf:33 brd ff:ff:ff:ff:ff:ff
inet 172.19.235.202/20 brd 172.19.239.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe0e:cf33/64 scope link
valid_lft forever preferred_lft forever
x58win@data:/mnt/c/Windows/system32$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:0e:cf:33 brd ff:ff:ff:ff:ff:ff
inet 172.19.235.202/20 brd 172.19.239.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe0e:cf33/64 scope link
valid_lft forever preferred_lft forever
没搞明白,明天研究一下,再来更新
deepseek了一下
需要进一步询问用户是如何安装这两个Ubuntu子系统的。是否通过Microsoft Store安装了两个不同的发行版,还是复制了同一个发行版?如果用户复制了同一个实例,可能会导致网络配置冲突,因为它们可能共享相同的网络命名空间。
另外,用户提到的修改IP后另一个也跟着变化,这可能表明两个实例共享同一个网络接口或命名空间,导致IP配置相互影响。在WSL2中,每个实例通常有独立的网络命名空间,但如果用户手动修改了网络配置而没有正确隔离,可能会导致这个问题。
我就是复制的同一个实例,我还自己改了主机名,连用户名都是一样的,所以应该导致了这个问题,网上有种方法可以解决,就是通过脚本设置ip
也就是不能够拷贝了,得重新装吗?
我准备全部删除了,再装一遍,不用导入功能,单独装
deepseek说
用户想在Windows 11的WSL里安装两个完全独立的Ubuntu 24.04服务器,并且要求它们之间可以互相访问,同时还能被外部访问。首先,我需要理解用户的具体需求。这两个Ubuntu实例需要完全独立,可能意味着各自有不同的文件系统和配置,不能是同一个实例的多个会话。互访意味着它们之间需要网络互通,而外部访问可能需要从Windows主机或局域网内的其他设备访问这两个WSL实例。
十一、总结
1、在固定这个问题上deepseek是不靠谱的,
2、官方文档有说:
Linux 发行版作为独立的容器在 WSL 2 托管 VM 内运行。 通过 WSL 2 运行的 Linux 发行版将共享同一网络命名空间、设备树(而非
/dev/pts
)、CPU/内核/内存/交换空间、/init
二进制文件,但有自己的 PID 命名空间、装载命名空间、用户命名空间、Cgroup 命名空间和init
进程。
3、上一条可以解释为什么我们通过netplan修改ip失败了,也不是失败,而是没有达到目的,我用简单的说法说明这个问题
- linux发行版在vm上运行,比方说我们安装了ubuntu 24.04,他就运行在vm上面,共享了很多东西,然后我们有import出了一个实例,它有自己的 PID 命名空间、装载命名空间、用户命名空间、Cgroup 命名空间和
init
进程,我认为实例没有netplan的所有权,也就是我们执行修改了静态ip,执行netpan apply,其实是在发行版上执行的,而不是在实例上执行的,这就是我们修改静态ip,然后所有的实例都变成了一个相同的ip,而且是最后修改的那个ip - ubuntu发行版是它所有import出来的实例的基座,基座上所有功能都能在实例上运行,但是如果是共享功能,将会导致所有实例都更改,要谨慎使用
- 以netplan方式无法修改静态ip,那么可以用add ip的方式临时修改ip,实例不是拥有
init
进程吗?把add ip 的命令放在这个是否可行,大家可以试试