以下解决方法仅适用于Build 21364,后续可能无需采用这些方法。

安装WSL

在最新版系统中,采用wsl --install即可安装WSL

  • 默认直连下载速度会比较慢,执行下面的命令:

    1. wsl --install
  • 默认安装的是WSL2,如需WSL1可以通过 --set-version 配置:

    wsl --set-version ubuntu 1
    

    更改镜像

    默认的ubuntu镜像太慢,替换成阿里云的镜像。

    vim /etc/apt/sources.list
    

    同时按住 Shift: 进入normal模式,分两次输入下列参数替换自带镜像链接

    %s/archive.ubuntu/mirrors.aliyun/g
    
    %s/security.ubuntu/mirrors.aliyun/g
    

    定时释放cache内存

    WSL2最大的问题是占用内存过多和随机IP,我们可以通过设置定时任务手动清除cache

  • 查看内存占用

    ❯ free -h
                total        used        free      shared  buff/cache   available
    Mem:          5.8Gi       123Mi       5.6Gi       0.0Ki        58Mi       5.5Gi
    Swap:         2.0Gi          0B       2.0Gi
    
  • 执行定时任务:每5分钟清除一次缓存

    crontab -e
    
    */5 0 * * * echo 3 > /proc/sys/vm/drop_caches
    

    WSL2

固定IP

wsl -d Ubuntu -u root ip addr add 192.168.50.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1
netsh interface ip add address "vEthernet (WSL)" 192.168.50.88 255.255.255.0

访问WSL2通过192.168.50.16,访问win10通过192.168.50.88,设置WSL2代理是win10的IP。
将上述脚本保存为 .bat 格式到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

服务自启

每次启动WSL后都需要手动启动所有服务,我们可以通过编写脚本在电脑启动时开启WSL并运行服务。

  1. 进入任意 WSL 发行版中,创建并编辑文件
    vim /etc/init.wsl
    
    #! /bin/sh
    /etc/init.d/cron $1
    /etc/init.d/ssh $1
    /etc/init.d/supervisor $1
    

里面调用了我们希望启动的三个服务的启动脚本,设置权限为可执行,所有者为 root,这时候可以通过:

sudo /etc/init.wsl [start|stop|restart]

来启停我们需要的服务,在 Windows 中,开始—>运行,输入:

shell: startup

按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root /etc/init.wsl start", vbhide

这个脚本就会在你登陆的时候自动在名字为 “debian” 的 wsl 发行版中执行 /etc/init.wsl 启动我们的服务了,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide

GUI 安装

GUI界面可参考Windows10访问Ubuntu子系统(WSL)的桌面环境

mobaxterm访问GUI

  1. 选择 Advanced WSL settings
  2. Graphical environment 中选择安装的桌面环境如 XFCE4 Desktop ,保存退出
  3. 双击 WSL session ,即可访问 wsl gui 界面,不想要 gui 可以在第二步保持默认
  4. 访问ubuntu子系统

ubuntu是非常成熟的wsl了,所以没有什么困难,但是想要实现gui还必须配置一下环境变量
对于Gui程序,需要在mobaxterm中运行,因为mobaxterm本身集成了x server,无需再安装,比较方便
执行一下命令后,可直接在windows界面看到gui程序的运行,无需进入wsl的桌面了。

export LIBGL_ALWAYS_INDIRECT=

桌面环境

链接的配置做到 export DISPLAY 即可, WSL 的桌面终归性能太差,仅用于 ics2019 等课程的学习,开启
x11 server display modeMutliwindow mode 就可以在终端运行时,自动打开一个新的 GUI
开启方法:
mobaxterm 设置 x11 的访问权限: settings -> configuration -> x11 -> x11 remote access -> full
image.png

查询端口

netstat.exe -an | grep -i "listen" | grep -v "\[::\]"

挂载U盘

假设U盘挂载的分区是F盘

sudo mkdir /mnt/f
sudo mount -t drvfs F: /mnt/f
sudo umount /mnt/f

挂载网络分区

sudo mount -t drvfs '\\server\share' /mnt/share

写入镜像到U盘

sudo dd if=/mnt/c/Users/dev/Downloads/manjaro-kde-20.2-201207-linux59.iso of=/mnt/f bs=4M

问题

  1. 启动mysql服务报错

    dev@DESKTOP-CTK1QQ1:~$ sudo service mysql start
    * Starting MySQL database server mysqld                                                                                No directory, logging in with HOME=/
    mkdir: cannot create directory ‘//.cache’: Permission denied
    -su: 19: /etc/profile.d/wsl-integration.sh: cannot create //.cache/wslu/integration: Directory nonexistent
    
    sudo usermod -d /var/lib/mysql/ mysql
    
  2. Arch 安装IDEA-UTLIMATE

    error: failed retrieving file ‘intellij-idea-ultimate-edition-2020.1.2-1-any.pkg.tar.zst’ from mirrors.tuna.tsinghua.edu.cn : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds warning: failed to retrieve some files error: failed to commit transaction (download library error) Errors occurred, no packages were upgraded.

Adding --disable-download-timeout appears to work in the meantime, as in pacman -Syu --disable-download-timeout

  1. 安装ubuntu 出现: WslRegisterDistribution failed with error: 0x800701bc

已安装的ubuntu无法启动:Process exited with code 4294967295
下载linux update https://aka.ms/wsl2kernel

参考

  1. WSL2走主机代理
  2. 在WSL中安装ROS - 知乎
  3. WSL文件读写权限的配置方法
  4. WslRegisterDistribution failed with error: 0x800701b #5393c
  5. ss (a substitute for netstat) does not work in WSL1 #2249