下面的汇总了部分通过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