从mac电脑到windows的迁移


起因

  1. mac之后all-in到arm,很多系统和功能都无法使用,需要重新编译,对于后端开发来说实际线上服务器肯定长期还是以linux-X86-64为主,很多软件需要交叉编译
  2. windows的wsl提供了基本无缝+完整的编译环境,同时还支持gpu的port,使用win10+wsl基本能够完成99%的工作

WSL的安装

主要就是按照官方的教程去安装就好,由于网络原因只能选择手动安装,好在实际下载速度都很快

官方安装链接

这块没有遇到什么问题,主要是注意win10加入insider计划之后升级到最新版,默认安装的19H1是没有wsl的.

基本非常快就能搞定

同时也是长期版本ubuntu20.04-lts,基本的包都会默认安装好

遇到的各种兼容性问题

  1. github的代理: 直接参考这篇可选的比较多: https://blog.csdn.net/networken/article/details/105122778

  2. 安装oh-my-zsh的时候如果使用curl的命令,会提示hasdshake的错误,一开始以为是tizi的问题,但是实际上搜索之后并不是,主要是windows默认的intel网卡驱动问题导致gnutls版本问题.解决方案:

    1. 在wsl使用wget下载各种安装的scrips
    2. 在intel的官网下载最新的驱动,覆盖windows的驱动即可

    参考链接:

    讨论的issue: https://github.com/microsoft/WSL/issues/4253
    intel驱动下载地址: https://downloadcenter.intel.com/download/28794/Windows-10-Wi-Fi-Drivers-for-Intel-Wireless-Adapters?product=99446

  3. wsl的服务起起来之后,在windows的浏览器只能使用localhost才能访问,这个是wsl2的实现协议导致的,目前官网也没有很好的解决方案,可以使用一个脚本来批量处理:

    If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
    
    {   
        $arguments = "& '" + $myinvocation.mycommand.definition + "'"
        Start-Process powershell -Verb runAs -ArgumentList $arguments
        Break
    }
    
    $remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
    $found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
    
    if( $found ){
        $remoteport = $matches[0];
    }else{
        echo "The Script Exited, the ip address of WSL 2 cannot be found";
        exit;
    }
    
    $ports=@(3000, 8080);
    
    iex "netsh interface portproxy reset";
    for( $i = 0; $i -lt $ports.length; $i++ ){
        $port = $ports[$i];
        iex "netsh interface portproxy add v4tov4 listenport=$port connectport=$port connectaddress=$remoteport";
    }
    iex "netsh interface portproxy show v4tov4";
    

    注意需要再配置里面开启允许powershell执行脚本文件

    参考链接:

    https://superuser.com/questions/1131874/how-to-access-localhost-of-linux-subsystem-from-windows
    https://dev.to/vishnumohanrk/wsl-port-forwarding-2e22
    https://superuser.com/questions/106360/how-to-enable-execution-of-powershell-scripts https://devblogs.microsoft.com/scripting/use-powershell-to-create-new-windows-firewall-rules/
    https://docs.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule?view=win10-ps
    https://docs.microsoft.com/en-us/powershell/module/netsecurity/enable-netfirewallrule?view=win10-ps
    https://github.com/microsoft/WSL/issues/5439
    https://docs.microsoft.com/en-us/windows/wsl/compare-versions#accessing-a-wsl-2-distribution-from-your-local-area-network-lan
    https://github.com/Microsoft/WSL/issues/1032
    https://github.com/microsoft/WSL/issues/4150
    https://github.com/microsoft/WSL/issues/4150

  4. 在wsl启动的服务有些端口提示冲突的问题,主要是3000与3306等端口都默认被windows的一个动态端口协议占用的 (官方说明从winserver2008之后包括win10都默认修改了,但是安装的系统还是老的,需要手动执行下更新) 还是万能的github之后可以通过命令修改:

    netsh int ipv set dynamic tcp start=49152 num=16384
    

    参考链接:

    https://github.com/docker/for-win/issues/3171#issuecomment-736155035 https://docs.microsoft.com/en-US/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang

comments powered by Disqus