Skip to content
当前页大纲

在 Windows 系统中,我平时习惯将开发软件安装在D:\Develop目录下

可能用到的软件

科学上网

这年头当个程序员不会点魔法都没法干活了,我自己用的是Clash,Chrome 浏览器插件配合使用的是Proxy SwitchyOmega

至于是哪里的魔法学院我就不细说了,我只讲这两个软件如何搭配使用

  1. 新建一个情景模式,名字取个自己喜欢的

  1. 协议选HTTP,服务器填127.0.0.1,端口7890(因为用的是 Clash),然后保存

  1. 切到自动切换(auto switch)模式,在2的位置填入raw.githubusercontent.com,模式选刚才创建的,我这里创建的是Clash3的位置选刚才创建的模式,4的位置填入规则列表的链接,接着点击5,最后保存

  1. 然后Proxy SwitchyOmega选择使用自动切换模式

  1. 最后 PC 端的 Clash 代理模式选择Global(全局)就行了,对于访问网站来说开不开系统代理都无所谓,如果是给 PC 软件使用的话,打开一下系统代理就行

启用Windows的WSL功能

TIP

可以通过在 PowerShell 执行wsl --install命令进行 WSL 的初始化安装,默认会安装 Ubuntu 作为 Linux 子系统,此时会自动更新到 WSL2。输入wsl -l -o可以查看官方提供的 Linux 发行版列表

下面讲讲手动设置 WSL2 的方式

  1. 启用 win10 的开发者模式

  1. 打开控制面板的Windows功能,勾选
    • Hyper-V
    • Windows 虚拟机监控程序平台
    • 适用于 Linux 的 Windows 子系统
    • 虚拟机平台

只是简单玩玩 WSL 的话,勾选适用于 Linux 的 Windows 子系统就够了,但我这里会后续可能会涉及到KaliDocker,所以干脆一次直接安装完。安装完成后会提示重启一次电脑

  1. 下载WSL2 Linux内核更新包并安装
  2. 将 WSL2 设置为默认版本wsl --set-default-version 2
  3. 在 Win10 应用商店搜索Ubuntu,然后安装它,也可以通过命令wsl --install -d Ubuntu来安装

TIP

如果之前已经安装了 WSL1 版本的子系统,那么在上述第 4 步之后再执行wsl --set-version Ubuntu 2命令将子系统更新到 WSL2

安装完成后根据提示设置系统用户名和密码,输入sudo passwd来初始化root用户的密码,会提示输入当前系统用户的密码,接着才是设置root用户的密码,要输入两次。之后如果想切到root用户的话就键入su

安装Windows Terminal

在微软应用商店搜索Windows Terminal,然后安装它,用它来配合 WSL 的使用体验我个人是觉得很爽的

将 apt 更换为阿里源

切到root用户,使用顺手的编辑器修改文件vim /etc/apt/sources.list,将所有源链接替换为https://mirrors.aliyun.com/ubuntu/

可以使用vim的替换命令进行批量修改,例如::%s#http://cn.archive.ubuntu.com#https://mirrors.aliyun.com#g

接着输入apt-get update刷新源信息

注意

子系统和 win10 是使用的相同网络,端口也都是共用的,避免端口占用冲突

如果要在 Windows 的文件资源管理器中查看 Linux 的文件的话,只需在地址栏中输入\\wsl$即可打开 Linux 的文件系统

WSL端口映射

由于每次重启宿主机后,WSL 的 ip 地址都会发生变化(稍后讲 WSL 设置静态 IP 的方法),所以需要重新映射,在 PowerShell 中执行

sh
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=win10端口 connectaddress=虚拟机的ip connectport=虚拟机的端口

检查是否映射成功netsh interface portproxy show all

在 Ubuntu 中查看 ip 地址的命令是ifconfig,其中eth0中的inet就是虚拟机的 ip 地址

WSL设置静态IP

比如,我要给 WSL 设置的静态 IP 为172.20.19.2,其网关地址为172.20.19.1

首先将 WSL 自动生成resolv.conf的机制关闭,执行sudo vim /etc/wsl.conf,添加如下内容

sh
[network]
generateResolvConf = false

接着执行sudo vim /etc/init.d/ip-setup.sh创建一个脚本,并该脚本添加执行权限sudo chmod +x /etc/init.d/ip-setup.sh,其内容如下

sh
#!/bin/sh

sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 172.20.19.2/24 broadcast 172.20.19.255 dev eth0
sudo ip route add 0.0.0.0/0 via 172.20.19.1 dev eth0
sudo rm -f /etc/resolv.conf
sudo echo nameserver 8.8.8.8 > /etc/resolv.conf

上述命令先删除掉 WSL 已经配置的 IP 地址,然后为其分配172.20.19.2/24,最后配置路由并指定 DNS 服务器为8.8.8.8

这样配置后 WSL 暂时没能联网,还需要到宿主机执行命令修改虚拟网络适配器

sh
Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 172.20.19.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 172.20.19.0/24;

上述命令中,首先找到 vEthernet (WSL) 这个网络适配器,然后将其所有已有的 IP 地址删除,然后为其添加172.20.19.1/24的 IP 地址。接着是设置 NAT:首先删除名字叫做 WSLNat 的 NAT(因为我们后续创建的 NAT 名字叫做 WSLNat,这些命令每次启动系统后都需要执行,因此可能系统中已经存在名为 WSLNat 的 NAT 了,为了防止冲突,如果存在的话就先删掉),然后创建一个名字叫做 WSLNat 的 NAT,设置内部地址为172.20.19.0/24

最后需要将上述两部分指令合并到一个脚本中一起执行

回到宿主机,Win+R打开运行,输入shell:startup,在启动文件夹中新建脚本ubuntu_start.bat,其内容如下

sh
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
wsl -u root /etc/init.d/ip-setup.sh
powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 172.20.19.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 172.20.19.0/24;"
wsl -u root /etc/init.d/wsl-init.sh

第一行的作用是让该脚本获取管理员权限并执行自身,因为其中调用 PowerShell 的部分需要管理员权限。最后一行wsl -u root /etc/init.d/wsl-init.sh是额外的启动配置,后面会讲

如果发现 WSL 内无法 ping 通网关地址172.20.19.1的话,在宿主机中以管理员权限打开 PowerShell 执行如下命令添加一条防火墙入站规则

sh
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

并且启用这一条规则

SSH配置

在新安装的 Ubuntu 中把openssh-server给卸载了,因为它预装的可能不完整,需要重新安装一下,切到root用户

sh
apt remove openssh-server
apt install openssh-server

接着来修改 ssh 的配置,在终端输入vim /etc/ssh/sshd_config,修改或增加以下几个配置项(根据自己的喜好设置端口)

sh
Port 2233
ListenAddress 0.0.0.0
LoginGraceTime 2m
StrictModes yes
PermitRootLogin yes
PasswordAuthentication yes

修改完毕后重启 ssh 服务service ssh --full-restart

在上面,我已经将 WSL 的 IP 地址修改成172.20.19.2(根据自己的情况填写 WSL 的 ip 地址),所以这里要做一下端口映射,回到宿主机执行

sh
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2233 connectaddress=172.20.19.2 connectport=2233

如果遇到端口被防火墙拦截的情况,需在宿主机的 PowerShell 中执行

sh
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2233

注意

如果在使用Xshell连接时提示找不到匹配的key exchange算法找不到匹配的host key算法,更新Xshell到一个比较新的版本就好了,因为服务端的openssh-server加密算法更新了

WSL设置代理

  1. 先在宿主机中查看 vEthernet (WSL)的 ip 地址,我这里的是172.20.19.1,然后确保 WSL 子系统和宿主机之间能够双向 ping 通

  1. 确定魔法工具所使用的代理端口,我这里的是7890,并启用局域网代理

  2. 设置代理的三种方式

    • 临时设置,这种方式设置的代理仅在当前终端生效,关闭当前终端后就会恢复之前的环境变量。在终端输入
    • 修改.bashrc文件,这种方式对当前用户永久生效。在终端输入vim ~/.bashrc,然后在文件末尾添加以下两行后保存退出,最后source .bashrc重载配置使其生效
    • 修改/etc/profile文件,这种方式对所有用户永久生效。在终端输入vim /etc/profile,然后在文件末尾添加以下两行后保存退出,最后在终端输入source /etc/profile重载配置且重启 WSL 才能使配置生效
sh
export http_proxy="http://172.20.19.1:7890"
export https_proxy="http://172.20.19.1:7890"

文件系统

需要注意的是我们现在有了两套系统,两者的文件类型并不一致,跨系统访问和传输文件的话效率会下降很多,最好各存各的,以用户目录为例

  • 如果在 Windows 上开发,就将文件放在:C:\Users\<UserName>\,也可以放在其他盘符的某个文件夹下统一管理,像我就是D:\Workspace
  • 如果在 Ubuntu 上开发,就将文件放在:\\wsl$\ubuntu\home\<UserName>\

创建工作区的软链接,比如我 Windows 系统中的代码是存放在是D:/Workspace,里面有一个前端项目test,那么在子系统中的软链接为

sh
sudo ln -s /home/code/test /mnt/d/Workspace/test

TIP

上面的/mnt可以理解成是Windows系统,然后/d表示 D 盘,后面的文件夹就很好理解了,不再展开说明

WSL迁出系统盘

由于 WSL 是作为一个 WindowsApp 默认安装在系统盘中的,而系统盘的可用空间会随着使用时间的推移而逐渐变少,所以需要将 WSL 迁出到其他盘,比如我这里将 WSL 迁到了D

变少的快慢因人而异,像我有强迫症,对文件管理有很高的要求,120G 的系统盘用了两年多还剩 40G 左右的空间

WSL 的迁移大致分为六步

  1. 查看自己的 WSL 和 Linux 发行版本,可以看到我这里的发行版本是Ubuntu,后续的操作都将围绕这个发行版本来进行

  1. 关闭 WSL 服务wsl --shutdown
  2. 将原位置的 Linux 发行版导出到指定位置,最好要在管理员模式的 PowerShell 执行wsl --export Ubuntu D:\WSL\Ubuntu.tar
  3. 在导出位置确定有Ubuntu.tar备份文件生成之后,执行注销原 WSL 命令wsl --unregister Ubuntu
  4. 在新的位置导入 Linux 发行版,最好要在管理员模式的 PowerShell 执行wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar
  5. 修改用户名为原来的名字,执行Ubuntu config --default-user jandan

迁移完成后把之前生成的备份文件Ubuntu.tar删除

安装Docker

在 Windows 中使用 Docker 有以下两种方式

直接在WSL2里面安装

这种安装方式要求对 docker 非常熟练,因为所有操作全都是执行命令,docker-compose需要单独安装

在用户目录下输入vim install-docker.sh,编写一个脚本用来把 docker 的下载和安装过程整合在一起,其内容如下

sh
#!/bin/sh
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
if [ !$(getent group docker) ];
then
    sudo groupadd docker
else
    echo "docker user group already exists"
fi

sudo gpasswd -a $USER docker
sudo service docker restart

rm -rf get-docker.sh

然后执行sh install-docker.sh等待 docker 的安装

安装完成后执行docker version来检查是否成功,如果发现 Server 没启动的话则执行sudo service docker start

默认情况下,docker server 是不跟随 WSL 的启动而启动的,所以需要手动将其加入自启服务,执行sudo systemctl enable docker即可

在Windows上安装Docker Desktop

这种安装方式使用起来适合 docker 新手,因为有 GUI,而且软件内置有docker-compose

先去下载Docker Desktop

由于Docker Desktop的安装程序不提供设置安装路径的功能,而且默认是安装到C:\Program Files\Docker目录下的,这就很占系统盘的宝贵空间

为了解决这个问题,需要对其默认安装路径做一个软链接处理,先在目标位置创建Docker文件夹,然后管理员模式打开 CMD 执行mklink /j "C:\Program Files\Docker" "D:\Develop\Docker"

软链接做好后再开始安装,记得勾选使用 WSL2 代替 Hyper-V

安装完成后进入软件,打开设置界面,修改 docker 数据和镜像的存储路径

将 Ubuntu 和 docker 关联起来

由于众所周知的原因,Docker 官方源 ban 掉国内 ip 了,所以需要更改为国内镜像源

json
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn"
  ]
}

设置完成后打开 WSL,输入docker ps,看到如下的输出就表示 Docker 和 WSL 连接成功了

在WSL中安装宝塔

上面讲了 Docker 的安装之后,其实宝塔有没有都无所谓了,但它在我还不会玩 Docker 的那段时间还是帮了我不少,姑且还是讲讲吧

切到root用户执行命令

sh
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec

安装完成后会在终端输出面板的登录信息,记得保存下来,内网地址的可以替换成127.0.0.1也是可以打开面板的,外网地址的那个不用管,反正家庭宽带的公网 IP 也是假的

WARNING

接下来安装运行环境的软件时一定要记得选编译安装

设置宝塔面板跟随Windows开机自启

  1. 在 Ubuntu 中创建一个脚本sudo vim /etc/init.d/wsl-init.sh,内容如下
sh
#!/bin/sh

/etc/init.d/nginx start
/etc/init.d/mysqld start
bt start

因为 WSL2 中的 Ubuntu 不能自启软件,所以才这么搞; 然后你会发现宝塔自启后,nginx、mysqld 等服务还是不会自启,可以把相应服务的启动指令同样放在这里来解决

  1. 给该脚本添加执行权限sudo chmod +x /etc/init.d/wsl-init.sh
  2. 将该脚本添加到上面的ubuntu_start.bat开机脚本中,这样每次 Windows 启动时就会自动执行wsl-init.sh脚本了

git和TortoiseGit的配置

先去下载gitTortoiseGit,具体的安装步骤就不说了,百度一搜各种各样的都有,这里主要讲我对 git 的环境变量配置

安装完成后打开 TortoiseGit 设置,并修改其 SSH 客户端为D:\Develop\Git\usr\bin\ssh.exe

给用户变量Path增加以下两个值D:\Develop\Git\cmdD:\Develop\TortoiseGit\bin

接着给 git 设置用户名和邮箱,具体的邮箱地址我就不放出来了,避免泄漏

sh
git config --global user.name Jandan
git config --global user.email ***@gmail.com

生成公钥,输入指令后无脑按回车就行

sh
ssh-keygen -m PEM -t ed25519 -C "***@gmail.com"

打开 github 网站,进入设置,填入刚才生成的ssh key,如果是首次和 github 建立连接,则输入ssh -T git@github.com创建连接信息

对于使用 http 方式连接远程仓库的,输入以下指令用来保存账号和密码

sh
git config credential.helper store

nvm和nodejs的配置

Ubuntu 中安装 nvm

  1. 命令行中执行curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash,脚本运行结束后打开一个新的终端窗口,输入nvm -v查看是否安装成功
  2. 查看所有可用的 node 版本nvm ls-remote
  3. 安装 LTS 版本的 node,nvm install --lts,安装后会自动切到这个版本

Windows中安装nvm

先去 Github 下载nvm

设置安装目录为D:\Develop\nvm

设置 nodejs 软链接指向的目录为D:\Develop\nvm\nodejs,之后就无脑下一步

安装完成后会自动生成两个系统环境变量NVM_HOMENVM_SYMLINK

  • nvm list available 查看所有可用的 nodejs 版本
  • nvm ls 查看当前安装的 nodejs 版本
  • nvm current 查看当前使用的 nodejs 版本

然后使用 nvm 命令安装所需要的 nodejs 版本,我这里安装的是最新的 LTS 版本

sh
nvm install 18.17.1
nvm use 18.17.1

接着在 nvm 安装目录下新建如下几个文件夹

  • node_global
    • node_modules
  • node_cache
  • Yarn
    • Global
    • Cache
  • pnpm
    • .pnpm-store
    • cache
    • global
    • state

创建好上述几个文件夹后开始接着补环境变量

sh
Path => %NVM_HOME%\node_global
NODE_PATH => %NVM_HOME%\node_global\node_modules

修改 npm 的缓存目录、全局包存放目录和设置淘宝源

sh
npm config set prefix "D:\Develop\nvm\node_global"
npm config set cache "D:\Develop\nvm\node_cache"
npm config set registry https://registry.npmmirror.com

⚡ npm 的官方源是 https://registry.npmjs.org

安装yarn

sh
npm i -g yarn

修改 yarn 的缓存目录和全局包存放目录

sh
yarn config set global-folder "D:\Develop\nvm\Yarn\Global"
yarn config set cache-folder "D:\Develop\nvm\Yarn\Cache"

安装pnpm

sh
npm i -g pnpm

修改 pnpm 的缓存目录和全局包存放目录

sh
# 全局仓库路径
pnpm config set store-dir "D:\Develop\nvm\pnpm\.pnpm-store"
# 全局包路径
pnpm config set global-dir "D:\Develop\nvm\pnpm\global"
# 全局缓存路径
pnpm config set cache-dir "D:\Develop\nvm\pnpm\cache"
# pnpm-state.json文件目录
pnpm config set state-dir "D:\Develop\nvm\pnpm\state"

我常用的 npm 全局包

  • yarn
  • pnpm
  • ts-node
  • whistle
  • nodemon
  • pm2
  • live-server
  • prisma
  • appium
  • appium-doctor
  • docsify-cli
  • eas-cli
  • @vue/cli
  • @tarojs/cli
  • @nestjs/cli
  • @ant-design/pro-cli

至此,nvm 和 nodejs 的环境配置结束

JDK配置

  1. 根据所安装的 JDK 版本,新建一个带有大版本号的用户变量,例如JAVA17_HOME,变量值填入安装路径D:\Develop\Java\jdk-17
  2. 再新建一个用户变量JAVA_HOME,变量值填入%JAVA17_HOME%。如果安装有多个 JDK 版本时,只需要修改JAVA_HOME变量的值即可切换全局的 JDK 版本,例如修改为%JAVA11_HOME%
  3. 给用户变量Path添加一个值%JAVA_HOME%\bin

AndroidStudio配置

安装 Android Studio 并下载所需要的相关 SDK 后可以选择设置全局环境变量也可以给某个 Flutter 版本设置局部环境变量:

  • 全局环境变量
    1. 新建用户变量ANDROID_HOMEANDROID_SDK_ROOT,变量值填入D:\Develop\Android\Sdk
    2. 新建用户变量ANDROID_SDK_HOME,变量值填入D:\Develop\Android\AVD,这个是设置虚拟机路径
    3. 给用户变量Path添加以下值%ANDROID_HOME%%ANDROID_SDK_HOME%%ANDROID_HOME%\platform-tools%ANDROID_HOME%\emulator%ANDROID_HOME%\tools%ANDROID_HOME%\tools\bin
  • Flutter 局部环境变量
    1. 给用户变量Path添加%ANDROID_HOME%\platform-tools
    2. 接着在命令行终端输入flutter config --android-sdk D:\Develop\Android\Sdk

由于 gradle 的默认缓存目录是在 C 盘,所以需要更改到其他位置,新建用户变量GRADLE_USER_HOME,变量值填入F:\AndroidStudioCache\.gradle

注意

新安装 Android Studio 时,由于 jre 目录的文件不完整,需要把整个 jre 目录删除,然后在软件根目录下执行命令 mklink /D "jre" "jbr"创建一个软链接即可

一些常用的安卓模拟器命令

  • 查看安装有哪些安卓模拟器:emulator -list-avds
  • 修改安卓模拟器的 dns 网关地址,实现模拟器联网:emulator -avd 模拟器名 -dns-server 局域网网关

Dart、fvm、Flutter的安装配置

先去下载Dart

设置安装目录为D:\Develop\Dart

安装完后会自动生成一个系统环境变量DART_SDK,然后给用户变量Path添加一个值%DART_SDK%\bin

下载 fvm

sh
dart pub global activate fvm

再给用户变量Path添加一个值%LOCALAPPDATA%\Pub\Cache\bin

创建一个系统变量FVM_CACHE_PATH,填入值D:\Develop\fvm

注意

v3版本之前的 fvm 所使用的系统变量名是FVM_HOME

然后使用命令修改 fvm 的缓存路径、禁用git缓存

sh
fvm config --cache-path D:\Develop\fvm
fvm config --no-git-cache false

注意

注意:由于 fvm 是 bat 脚本,需要在 cmd 或 powershell 中才能执行

查看所有可用的 flutter 版本fvm releases

下载安装某个 flutter 版本,这里以 3.13.4 为例:fvm install 3.13.4

设置已下载的某个 flutter 版本作为全局,fvm global 3.13.4

设置了全局版本之后,会在D:\Develop\fvm目录下自动生成一个default目录,其将作为软链接指向某个具体的版本

然后给用户变量Path添加一个值%FVM_CACHE_PATH%\default\bin

最后创建两个用户环境变量FLUTTER_STORAGE_BASE_URLPUB_HOSTED_URL

sh
FLUTTER_STORAGE_BASE_URL => https://storage.flutter-io.cn
PUB_HOSTED_URL => https://pub.flutter-io.cn

更多 fvm 命令可以查看官方文档

注意

在运行flutter doctor进行环境检查时,如果提示 HTTP Host Availability,则按以下处理:

  • 打开flutter\packages\flutter_tools\lib\src\http_host_validator.dart文件
  • 修改kPubDevHttpHost的值为https://pub.flutter-io.cn/
  • 修改kgCloudHttpHost的值为https://storage.flutter-io.cn/
  • 修改androidRequiredHttpHosts的值为https://maven.aliyun.com/repository/google/
  • 删除flutter/bin/cache目录
  • 重新运行flutter doctor

常用的源

  • 国内 Flutter 社区
sh
FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn
PUB_HOSTED_URL: https://pub.flutter-io.cn
  • 上海交通大学
sh
FLUTTER_STORAGE_BASE_URL: https://mirrors.sjtug.sjtu.edu.cn
PUB_HOSTED_URL: https://dart-pub.mirrors.sjtug.sjtu.edu.cn
  • 清华大学 TUNA 协会
sh
FLUTTER_STORAGE_BASE_URL: https://mirrors.tuna.tsinghua.edu.cn/flutter
PUB_HOSTED_URL: https://mirrors.tuna.tsinghua.edu.cn/dart-pub

至此,Dart、fvm 和 flutter 的环境配置结束

MIT License.