win 11如何使用Ubuntu

知道win系统Microsoft Store里有Ubuntu应用,一直没有尝试来用,以为像其它软件一样安装即用呢,结果下载下来一顿报错,网上各种所谓的解决方案都试过,还是不行,最后还是胖哥靠谱,这里仅作为记录啊。

作为一个程序员在开发中会经常使用Linux环境进行开发,但并不是每个程序员都能拥有一台自己的苹果笔记本电脑的。毕竟苹果的价格还是比Windows电脑贵很多的。

其实在的Windows10以上的系统是完全可以使用Linux开发环境的,这个救命稻草就是WSL2。这个教程,我们就详细讲解一下Win11下,如何使用WSL2- Windows Subsystem for Linux

BIOS中开启虚拟化

第一步是打开主板BIOS的虚拟化选项,如果你是这几年新买的电脑,默认这项是打开的。注意这一项每个电脑主板型号的不同,设置的方法也不同。所以最好的方法,是你根据自己主板的型号,去百度或者Google去搜索一下开启虚拟话的方法。

  • Windows平台 :Intel(VMX)Virtuallzation Technology 需要到主板中进行开启
  • AMD平台:AMD-V

WSL的两个版本和安装要求

  • WSL :也就是我们常说WSL1,第一个版本,对windows的版本要求较低
  • WSL2:第二个版本,要求WIN10版本高于1903

至于两个版本的区别不是教程的重点,就不做过多的介绍了。

WSL2安装过程

Microsoft英文版文档网址:https://docs.microsoft.com/en-us/windows/wsl/install-manual

  • 第一步:启动WSL。用管理员身份打开PowerShell.(打开方法见视频),然后在PowerShell中,输入下面的命令。
1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 第二步:启动虚拟机给功能。同样在PoweShell中输入下面的命令。输入完命令后,要重启一下电脑,然后再进行第三步。
1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 第三步:下载Linux内核更新包。

下载地址:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

  • 第四步:将WSL2设置为默认版本。打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本,命令如下。
1
wsl --set-default-version 2

第四步安装完成后,你就可以去安装对应的Linux发行版了,这里我们拿Ubuntu举例。

安装Ubuntu发行版

打开Microsoft Store,并选择你偏好的Linux分发版。我这里选择Ubuntu并进行安装。下载时间会根据网络不同,时间不同。我家的网络安装还是比较慢的。

安装完成后,就可以使用了。如果是首次进入,需要你设置用户名和密码。当进入系统后,可以使用下面的命令来查看当前Ubuntu的版本。

1
2
3
4
5
6
tony@DESKTOP-TPUK7BF:/$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy

输入完命令后,就可以看到版本信息了。至此WSL2的安装过程就演示完成了,希望本视频对你有所帮助。

以上内容来源:https://jspang.com/article/80

侵权请联系本人删除

同一局域网下windows主机和wsl子系统相互网络服务访问

从主机访问wsl的服务

本来就是宿主机访问,索性可以将wsl防火墙关掉或者开放指定端口。然后确认wsl的ip

1
2
3
4
5
6
7
8
9
10
11
12
(py3) root@UYYNOT:/home/tony/test/MyDjango# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.137.156 netmask 255.255.240.0 broadcast 172.24.143.255
inet6 fe80::215:5dff:fe87:3dd6 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:87:3d:d6 txqueuelen 1000 (Ethernet)
RX packets 139608 bytes 191405384 (191.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32763 bytes 4764246 (4.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
或者
ip addr | grep eth0
命令都可以

172.24.137.156就是wsl的ip,然后wsl上开启一个0.0.0.0:5001的web服务,宿主机就可以直接使用172.24.137.156:5001就访问该服务。

从wsl访问主机的服务
  1. 在主机上用管理员身份打开powershell

  2. 输入命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    PS C:\WINDOWS\system32> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
    >>


    Name : {065dd160-e6e1-49ed-8ae1-cacd5ab1e84d}
    DisplayName : WSL
    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 : {}
  3. 然后在wsl中输入命令:

    1
    2
    3
    4
    (py3) root@UYYNOT:/home/tony/test/MyDjango# cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
    172.24.128.1
    8.8.8.8
    114.114.114.114

    就会出现一个ip,这个ip可以用ping + ip测试一下,应该可以连通

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (py3) root@UYYNOT:/home/tony/test/MyDjango# ping 172.24.128.1
    PING 172.24.128.1 (172.24.128.1) 56(84) bytes of data.
    64 bytes from 172.24.128.1: icmp_seq=1 ttl=64 time=0.237 ms
    64 bytes from 172.24.128.1: icmp_seq=2 ttl=64 time=0.356 ms
    64 bytes from 172.24.128.1: icmp_seq=3 ttl=64 time=0.216 ms
    64 bytes from 172.24.128.1: icmp_seq=4 ttl=64 time=0.243 ms
    64 bytes from 172.24.128.1: icmp_seq=5 ttl=64 time=0.197 ms
    ^C
    --- 172.24.128.1 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4148ms
    rtt min/avg/max/mdev = 0.197/0.249/0.356/0.055 ms
  4. 主机开启一个http服务,随便一个文件夹cmd执行python -m http.server 8080来启动一个服务。

    1
    2
    D:\neatdownload>python -m http.server 8080
    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
  5. wsl测试访问

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (py3) root@UYYNOT:/home/tony/test/MyDjango# curl http://172.24.128.1:8080
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Directory listing for /</title>
    </head>
    <body>
    <h1>Directory listing for /</h1>
    <hr>
    <ul>
    <li><a href="20141118143101-0001%281%29.pdf">20141118143101-0001(1).pdf</a></li>
    <li><a href="20141118143101-0001%282%29.pdf">20141118143101-0001(2).pdf</a></li>
    <li><a href="20141118143101-0001.pdf">20141118143101-0001.pdf</a></li>
    <li><a href="20201117183252-0001.pdf">20201117183252-0001.pdf</a></li>
    <li><a href="20201117183308-0001.pdf">20201117183308-0001.pdf</a></li>
    <li><a href="20201117183327-0001.pdf">20201117183327-0001.pdf</a></li>

    可以看到已经能访问到宿主机服务

通过远程ip连接wsl中的服务(局域网)

如果多台机器位于同一局域网下,访问的时候可以使用http://ip:port的方式来访问,那如果我们的服务启动在wsl中,同一局域网下的其他机器该怎么访问呢

  1. 在wsl子系统中,使用以下命令,获取wsl的ip

    1
    2
    3
    ip addr | grep eth0
    或者
    ifconfig

    可以看到wsl的ip为:172.24.137.156

  2. 在windows中,用管理员方式打开powershell,输入命令,这里我的wsl的ip为172.24.137.156,要启动服务的端口为5001,因此命令如下:

    1
    netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=5001 connectaddress=172.24.137.156 connectport=5001

    记得在使用的时候,替换connectaddress和listenport、connectport为你需要的值。

    此时我的wsl已经启动了一个端口为5001的django服务了

  3. 然后在Windows的powershell中,输入ipconfig,找到无线局域网适配器 WLAN:IPV4地址,我这里为172.29.95.67,

    我们宿主机使用本地ip看能不能访问到wsl中的服务,图中可以看到,wsl端口已经成功映射到了本地,可以成功访问,局域网中其他ip如何访问呢?

在同一局域网下的另一台设备上,打开浏览器,输入http://172.29.95.67:2345,试试,是不是也能成功访问了呢!!!总结下来是不是跟docker很像?

关于wsl更多的使用方式,可阅读官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/