1. 硬件层准备
核心目标:物理开启 CPU 的虚拟化功能,这是 WSL 2 运行的硬件基石。
1.1 进入BIOS
重启电脑,在屏幕亮起的瞬间,高频连续敲击启动热键。
-
1.1.1 品牌热键:
- 官网查找,浏览器搜索 ,AI询问
1.2 菜单索引
注意:针对 AMD 处理器,请重点寻找 SVM 关键词;Intel 处理器寻找 VT-x。
-
**1.2.1 AMD 处理器:
- 路径:
Advanced (高级)→CPU Configuration→SVM Mode→ 设置为 Enabled
- 路径:
-
**1.2.2 Intel 处理器:
- 路径:
Security (安全)→Virtualization→Intel Virtualization Technology→ 设置为 Enabled
- 路径:
1.3 操作保存
找到设置项并改为 Enabled 后,必须按 F10 键(Save & Exit),选择 YES 确认重启。
2. 软件层部署
适用场景:BIOS 设置完毕后,在 Windows 侧执行的标准化安装指令。
2.1 核心指令
使用 管理员权限 打开 PowerShell,依次执行以下命令:
# 1. 开启虚拟机平台 (WSL 2 核心依赖)
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 2. 开启 Linux 子系统支持
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 3. [关键修正] 强制设置 Hypervisor 启动类型 (防止 BIOS 已开但 Windows 不加载)
bcdedit /set hypervisorlaunchtype auto
# 4. [防呆设置] 强制 WSL 默认版本为 2 (防止回退到 WSL 1)
wsl --set-default-version 22.2 重启安装
1. 立即重启 执行以下命令立即重启电脑:
shutdown /r /t 0
2. 安装通用版 Ubuntu 重启后打开管理员 PowerShell,执行:
wsl --update
# 这一步非常重要,确保 WSL 内核是最新版,否则可能报 0x800701bc 错误
wsl --install -d Ubuntu
3. 账户初始化 等待终端弹出,设置 UNIX 用户名与密码(注意:输入密码时屏幕无显示,盲打后回车)。
3. 账户凭证
适用场景:管理 Linux 系统的登录凭证,包含 Root 权限解锁、修改密码及异常重置。
3.1 Root配置
重要:Ubuntu 默认禁用 Root 账户登录。若开发需要(如救砖),需手动解锁。
1. 执行解锁指令 在普通用户模式下($ 提示符),执行:
sudo passwd root
2. 交互流程 输入当前普通用户密码 → 输入新的 Root 密码(盲打) → 确认 Root 密码。
3. 验证 输入以下命令,能切换到 # 提示符即成功:
su root
3.2 常规密码
仅需更改当前登录用户的密码。在终端执行:
passwd
3.3 普户密码
如果忘记了密码无法进入系统:
1. 关闭所有 WSL 窗口
2. 以 Root 身份进入 在 Windows PowerShell (管理员) 中执行:
wsl -u root
3. 强制重置密码 进入 Root 命令行后执行以下命令:
passwd <你的用户名>
3.4 系统重置
场景:如果安装中断导致配置文件丢失,或想修改用户名,最彻底的方法是重置。
1. 销毁当前实例 在 Windows PowerShell (管理员) 中执行:
wsl --unregister Ubuntu
2. 重新初始化 执行以下命令,系统会重新请求设置用户名和密码,并自动生成完整的配置文件:
wsl --install -d Ubuntu
4. 网络配置
4.1 方案指南
-
Windows 11:请优先使用 4.2 镜像模式。
-
Windows 10:
-
优先尝试 4.3 TUN 模式(最简单)。
-
如果失败,再使用 4.4 通用脚本方案(最稳健)。
-
4.2 镜像网络
原理:利用 Win11 特性,让 WSL 直接复用 Windows 的网络身份。
1. 创建配置文件 在 %UserProfile% 目录下创建 .wslconfig 文件(注意扩展名)。
2. 写入配置
[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true
memory=8GB # 限制内存占用
3. 重启生效 执行以下命令:
wsl --shutdown
4.3 TUN模式
原理:利用代理软件的 TUN 虚拟网卡配合 WSL 的 VirtioProxy 模式实现透明代理。
1. 前置条件 v2rayN 或 Clash 已开启 TUN 模式。
2. 验证方法 在 Ubuntu 终端直接输入:
ping google.com
如果能通(有时间返回),恭喜!你不需要配置后续的脚本。
4.4 通用脚本
适用场景:如果 TUN 模式失效,或需要精确控制代理端口。
1. 配置 WSL 脚本 (所有用户必做) 在 Ubuntu 中编辑配置文件:
code ~/.bashrc
在底部粘贴以下通用脚本 (Bulletproof Edition):
# ====================================================
# WSL 2 Universal Proxy Switcher (Bulletproof Edition)
# ====================================================
# 1. 自动获取 Windows 宿主机 IP
export hostip=$(ip route show | grep default | awk '{print $3}')
# 2. 通用代理函数 (Clash/v2ray)
# 用法: setproxy (默认7890) 或 setproxy 10809
function setproxy() {
local port=${1:-10809} # 支持自定义端口
# 动态获取 IP,防止 WSL 重启后 IP 变更
export hostip=$(ip route show | grep default | awk '{print $3}')
# [关键修正] 统一使用 http 协议头,防止 v2rayN 协议冲突
export http_proxy="http://${hostip}:${port}"
export https_proxy="http://${hostip}:${port}"
export all_proxy="http://${hostip}:${port}"
# 修复 sudo 无法继承代理的问题 (自动添加 -E 参数)
alias sudo='sudo -E'
echo -e "\033[32m[Proxy Enabled]\033[0m Target: Windows Host (${hostip}) Port: ${port} (Protocol: HTTP)"
}
# 3. WARP 专用函数 (SOCKS5 模式)
# 用法: setwarp (默认40000)
function setwarp() {
local port=${1:-40000}
export hostip=$(ip route show | grep default | awk '{print $3}')
# WARP 通常只提供 SOCKS5
# 注意:apt update 不支持 socks5 代理
export http_proxy="socks5://${hostip}:${port}"
export https_proxy="socks5://${hostip}:${port}"
export all_proxy="socks5://${hostip}:${port}"
echo -e "\033[36m[WARP Enabled]\033[0m Target: Windows Host (${hostip}) Port: ${port} (Protocol: SOCKS5)"
echo -e "\033[33m[Warning]\033[0m 'apt' command does not support SOCKS5. Use 'setproxy' for system updates."
}
# 4. 关闭代理
function unsetproxy() {
unset http_proxy https_proxy all_proxy
# 恢复 sudo 默认行为
unalias sudo 2>/dev/null
echo -e "\033[31m[Proxy Disabled]\033[0m"
}
2. 软件端设置 (分支选择)
-
如果你用 Clash/v2ray/Verge:在软件设置中开启 “Allow LAN” (允许局域网连接)。
-
如果你用 Cloudflare WARP:需在 Windows PowerShell (管理员) 运行以下命令建立“端口桥接”:
# 1. 强制将发往本机的流量转发给 WARP (40000端口)
netsh interface portproxy add v4tov4 listenport=40000 listenaddress=0.0.0.0 connectport=40000 connectaddress=127.0.0.1
# 2. 放行防火墙,允许 WSL 访问这个端口
New-NetFirewallRule -DisplayName "WSL WARP Bridge" -Direction Inbound -LocalPort 40000 -Protocol TCP -Action Allow
3. 使用方法与端口切换
A. 生效配置 执行:
source ~/.bashrc
B. 默认连接 Clash/Verge 输入 (默认 7890):
setproxy
WARP 输入 (默认 40000):
setwarp
C. 指定任意端口 (灵活切换) 如果 v2rayN 端口是 10809:
setproxy 10809
如果 WARP 改成了 12345:
setwarp 12345
4.5 验证Sudo
1. 验证标准 使用以下命令验证连接(不要用 ping):
curl -I [https://www.google.com](https://www.google.com)
2. Sudo 的小脾气 虽然新脚本已优化 sudo 别名,但仍建议了解此原理:安装软件时若超时,使用 -E 参数:
sudo -E apt update
5. 故障排查
记录:安装全周期中遇到的所有阻碍与解决方案。
5.1 启动故障
-
故障码 0x80370102:BIOS 虚拟化已开但报错。
- 解法:执行以下命令:
bcdedit /set hypervisorlaunchtype auto
5.2 网络故障
-
现象:配置了
.wslconfig镜像模式,但无效。-
根因:Windows 10 不支持镜像模式。这是 Win11 22H2+ 的独占功能。
-
解法:删除
.wslconfig,改用 4.4 章节的通用脚本方案。
-
-
现象:Win10 使用 WARP,报错
curl: (7) Failed to connect to ...。-
根因:WARP 只监听
127.0.0.1,而 Win10 WSL 无法直接访问宿主机的 localhost。 -
解法:必须使用 4.4 章节 中的
netsh命令建立端口桥接(需在脚本中配合setwarp)。
-
5.3 WSL入口
-
现象:输入
wsl命令后,进入的是精简版 Linux,无法使用apt命令,且报错cat: /etc/resolv.conf: No such file。 -
根因:安装 Docker Desktop 后,Docker 默认将
docker-desktop设为了 WSL 的默认启动项。 -
诊断方法:在 PowerShell 输入
wsl -l -v,若docker-desktop前有*号,即为此问题。
1. 修复指令 - 夺回控制权 执行以下命令将 Ubuntu 设为默认:
wsl --set-default Ubuntu
2. 验证修复 重新输入以下命令,应看到 username@hostname 的正常终端:
wsl
5.4 WinNat禁用
-
现象:输入
wsl时报错networkingMode Nat;net start WinNat报错 1058。 -
根因:Windows 的 NAT 服务被意外禁用,WSL 强制降级。
1. 强制解禁服务 (关键步骤) 在管理员 PowerShell 执行:
sc.exe config "WinNat" start= auto
2. 启动服务 执行:
net start WinNat
3. 重启 WSL 执行:
wsl --shutdown
5.5 启动路径
-
现象:使用管理员 PowerShell 打开 WSL 时,默认进入
/mnt/c/WINDOWS/system32。 -
解法:修改
.bashrc实现智能跳转。
1. 编辑配置文件
code ~/.bashrc
2. 追加配置 在文件最底部粘贴以下代码,保存并重启终端即可:
# ====================================================
# Auto-Home Strategy (Smart Redirect)
# ====================================================
# 如果 WSL 启动时处于 Windows 系统目录 (管理员默认路径),则自动跳回用户家目录
if [[ "$PWD" == "/mnt/c/WINDOWS/system32" ]]; then
cd ~
fi
6. 操作习惯
-
身份红线:日常开发用普通用户 (
$),严禁一直用 Root (#)。 -
文件红线:代码必须放在
~(Linux 目录) 下,不要放在/mnt/c/。 -
代理习惯:
-
优先使用 TUN 模式。
-
如果遇到
git慢,再考虑启用setproxy脚本。
-