部分ubuntu-wsl问题汇总

633 阅读2分钟

下面的汇总了部分通过wsl2安装和使用ubuntu的问题。

在某一个distro中获取宿主的ip

宿主的ip地址原则上就是eth0的gateway的ip地址,所以可以通过方式从ip route命令的结果中截取出来

ip route|grep default|grep eth0|cut -d' ' -f 3

wsl kernel需要升级

可以根据 aka.ms/wsl2kernel 中的步骤操作即可,大致如下:

  • 在Windows Features中启用wsl和Virtual Machine Platform
  • 安装wsl内核更新包
  • 设置wsl 2为默认版本,即wsl --set-default-version 2

在wsl可以修改Windows中文件的权限

对于Windows的文件系统中,挂在在/mnt下的各个磁盘,需要重新mount,才可以在wsl中修改器通过chown/chmod等命令修改其中文件的所属和权限。

比如对于Windows的D盘来说,需要通过如下的命令来完成:

sudo umount /mnt/d && sudo mount -t drvfs D: /mnt/d -o metadata

不过这个这是一次性的,如果需要启动wsl distro是自动设置,则需要在distro的/etc/wsl.conf中按照如下方式设置:

[automount]
options = "metadata"

把wsl内启动的服务映射到Winddows宿主机的127.0.0.1

比如wsl的一个distro的ip地址是192.168.120.120,在1234端口启动了一个服务,如果希望在宿主机中以127.0.0.1:1234来访问这个服务,需要通过netsh来做一个端口的映射。那么上面的例子可以在以管理员方式启动的Powershell中通过下面的命令来完成

netsh interface portproxy add v4tov4 listenport=1234 connectaddress=192.168.120.120 connectport=1234 listenaddress=127.0.0.1 protocol=tcp

重启某个wsl dsitro

需要在powershell中,通过wsl -t <DISTRO_NAME>来给这个wsl distro关机,然后再通过wsl -d <DISTRO_NAME>来启动。

完全重启wsl2的服务

目前最新版本的wsl中,只有在admin模式的powershell使用以下命令是可以确实关掉wsl的服务,并且沙雕VMmemWSL进程释放内存的

taskkill /f /im wslservice.exe

报错处理

错误 Wsl/Service/0x800706f7

wsl --update或者wsl --install可能会遇到启动wsl时出现下面的错误而不能启动:

The stub received bad data.
Error code: Wsl/Service/0x800706f7

此时重启wsl的services和计算机都不能解决,可以在Powershell中尝试的通过reset winsock来解决:

netsh winsock reset

错误 The attempted operation is not supported for the type of object referenced.

可能是由于Windows Update造成的,根据 github.com/MicrosoftDo… 的中的一个方案,操作步骤大致如下:

  • 保存下面内容为wsl.reg或按照文本中的内容通过regedit更新注册表
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\0408F7A3]
"AppFullPath"="C:\Windows\System32\wsl.exe"
"PermittedLspCategories"=dword:80000000
  • 重启ubuntu即可

或者另外的方案是:

  • 安装wsl内核更新包
  • 在Powershell中
wsl --shutdown
netsh winsock reset
  • 重启计算机并重新安装wsl distribution