wsl2配置

WSL2安装、配置docker、X11等过程…

安装wsl2

官网提供了一键安装方法,但实测不好使,所以下面流程参考手动安装方法

  • 管理员PowerShell

    • dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    • dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 重启电脑

  • 下载https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi并安装

  • 管理员PowerShell

    • wsl --set-default-version 2
    • 需要确认有以下输出
      1
      2
      3
      C:\WINDOWS\system32> wsl --set-default-version 2
      有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
      操作成功完成。
  • 打开Microsoft Store 搜索ubuntu,安装合适的版本(22.04LTS)

  • 安装后运行即可

  • 打开cmd确认一下是wsl2而不是wsl1:

    1
    2
    3
    PS C:\Users\X> wsl.exe --list --verbose
    NAME STATE VERSION
    * Ubuntu-22.04 Running 2
    • 如果VERSION=1:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      PS C:\Users\X> wsl.exe --shutdown
      PS C:\Users\X> wsl.exe --list --verbose
      NAME STATE VERSION
      * Ubuntu-22.04 Stopped 1
      PS C:\Users\X> wsl.exe --set-version Ubuntu-22.04 2
      正在进行转换,这可能需要几分钟时间...
      有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
      转换完成。
      PS C:\Users\X> wsl.exe --list --verbose
      NAME STATE VERSION
      * Ubuntu-22.04 Stopped 2
  • /etc/wsl.conf配置

    1
    2
    3
    bon@:~$ cat /etc/wsl.conf
    [boot]
    systemd=true

wsl-ubuntu 环境配置

网络环境配置

主要是防火墙配置,以下针对Macfee防火墙用户

  • Macfee新增用户规则如下:

    • UDP端口 UDP规则
    • TCP端口,其中29418为gerrit端口
    • Xserver所需端口,也是TCP端口
  • ping baidu.com 正常

Docker环境

  • apt安装docker:

    1
    2
    3
    4
    5
    6
    7
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo apt-key fingerprint 0EBFCD88
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  • 由于新的ubuntu系统使用了iptables-nft,而WSL2不支持,需要更换iptable策略,否则dockerd起不来

    1
    update-alternatives --set iptables /usr/sbin/iptables-legacy
  • 配置docker daemon自启动,vi ~/.profile写入

    1
    2
    # run docker daemon startup
    wsl.exe -u root -e sh -c "service docker status || service docker start"
    • 加上 > /dev/null 2>&1 如果不希望有下面的提示
    • 配置dockerd随WSL启动,vi ~/.bashrc 写入下面内容
      1
      2
      3
      4
      5
      RUNNING=`ps aux | grep dockerd | grep -v grep`
      if [ -z "$RUNNING" ]; then
      sudo dockerd > /dev/null 2>&1 &
      disown
      fi
    • 这个方法要求sudo,需要输入密码,所以把用户的sudo密码去掉
      1
      2
      3
      $ sudo visudo
      ## 写入以下内容
      你的用户名 ALL=(ALL) NOPASSWD: ALL
  • wsl.exe --shutdown,重启wsl,docker ps测试正常

任何情况下docker命令显示找不到daemon,都可以执行sudo dockerd看下报错是什么,如果没有报错退出,那就只是没有启动而已。

配置nvidia docker环境

windows安装nvidia驱动,wsl只需要安装cuda toolkit

x11配置

下面步骤参考(https://github.com/microsoft/WSL/issues/4106#issuecomment-876470388) ,并做了一些补充

  • 参考 #网络环境配置 配置x11防火墙,端口6000
  • (应该非必须)PowerShell里配置防火墙New-NetFirewallRule -DisplayName "WSL2" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
  • Install vcxsrv on Windows
  • Start XLaunch on Windows
    • Select Multiple Windows (default)
    • Select Start no client (default)
    • Check✅ Disable access control
    • Uncheck ☐ Native opengl
    • Add -ac to Additional parameters for VcXsrv
    • Save configuration on startup folder, location C:\Users"YOUR_USERNAME”\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup (don’t forget to place YOUR_USERNAME)
  • Open Ubuntu app, run command export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | head -1 | awk '{print $2}'):0.0 ,also put the command in ~/.bashrc
  • run sudo apt install x11-apps -y
  • run xeyes 验证成功

验证xeyes出现问题可以strace xeyes看下问题是什么,比如防火墙问题会有类似log并卡住超时,最终显示无法连接,那就去检查ip以及端口是否被墙

1
2
connect(3, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("172.17.48.1")}, 16)
timeout

把wsl挪到其他盘

  • PowerShell wsl --shutdown
  • 打开CMD
  • 创建目标文件夹 mkdir D:\wsl\Ubuntu-22.04
  • cd C:\Users\Xpeng\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\ 用户名和CanonicalGroupLimited文件夹替换为对应的
  • 挪LocalState文件夹 move LocalState D:\wsl\Ubuntu-22.04\LocalState
  • 创建链接 mklink /J LocalState D:\wsl\Ubuntu-22.04\LocalState
    1
    2
    C:\Users\Xpeng\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc>mklink /J LocalState D:\wsl\Ubuntu-22.04\LocalState
    为 LocalState <<===>> D:\wsl\Ubuntu-22.04\LocalState 创建的联接
  • 完成

历史检索异常

ctrl+r历史检索按tab后会卡住,参考 https://github.com/microsoft/WSL/issues/4966,原因是按tab后会从/mnt/检索所有可执行文件(可以命令行按空格后直接按tab复现,不过在这里为啥要有这个行为?),而wsl2对/mnt/目录的检索效率很低,所以会卡住。

链接中提供了修改环境变量的解决方法,但是会导致部分命令无法执行,解决方法是:不按tab,用→或者end键替代,改变自己的使用习惯:)