解决问题最简单粗暴的方法就是解决提出问题的人,但是我不能解决我自己,哈哈
前面 wsl1 用得挺好的,但是 vscode 推了好几次 wsl2,仔细研究了下觉得,问题应该不大,那就升级了
升级完用着用着发现,这个 ip 是个大问题,试过修改交换机为 nat,但是重启后又回去了,搞的有时候网络连接没有启用 ipv4,神奇
行,那就想办法把 ip 更新到 hosts,试过 https://github.com/shayne/go-wsl2-host 不起作用,没辙那就继续折腾
分析下问题,就是获取到 wsl2 的 ip,然后更新到 hosts 里,然后想办法把这个动作搞成 wsl2 一启动就触发,折腾了好几天,找到了最佳实践
$hostname = "wsl.dev"
# find ip of eth0
$ifconfig = (wsl -- ip -4 addr show eth0)
$ipPattern = "((\d+\.?){4})"
$ip = ([regex]"inet $ipPattern").Match($ifconfig).Groups[1].Value
if (-not $ip) {
exit
}
Write-Host $ip
$hostsPath = "$env:windir/system32/drivers/etc/hosts"
$hosts = (Get-Content -Path $hostsPath -Raw -ErrorAction Ignore)
if ($null -eq $hosts) {
$hosts = ""
}
$hosts = $hosts.Trim()
# update or add wsl ip
$find = "$ipPattern\s+$hostname"
$entry = "$ip $hostname"
$found = $hosts -match $find
if ($found) {
$old_wsl_ip = $matches[0] -replace " $hostname", ''
$hosts = $hosts -replace $old_wsl_ip, $ip
} else {
$hosts = "$hosts`n$entry".Trim()
}
try {
$temp = "$hostsPath.new"
New-Item -Path $temp -ItemType File -Force | Out-Null
Set-Content -Path $temp $hosts
Move-Item -Path $temp -Destination $hostsPath -Force
} catch {
Write-Error "cannot update wsl ip"
}
复制上面的内容保存为 wslhost.ps1 ,然后手动关闭下wsl
wsl --shutdown
打开事件查看器,依次展开 Windows 日志 > 系统,找到事件 ID 为 102 的记录
然后选中,右键打开菜单,选择 “将任务附加到此事件”
再按照对话框填就行了,如果 powershell 的执行策略,不允许执行 .ps1 文件,打开 powershell 执行下面的语句
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
这样,每次 wsl 启动时都会更新 ip 到 hosts 文件