#Windows #重装恢复 #Ollama #CUDA #SSH #Docker

配套 《RTX 5080 新主机环境配置实录》。记录所有组件的安装目录与可持久化路径,以及重装系统后的最短路径恢复方案。目标:重装后 30 分钟内恢复 SSH + CUDA + Ollama,其余开发工具按需补装。


一、安装目录全览

1.1 C 盘(重装后丢失)

组件 安装路径 重装后
NVIDIA Driver C:\Windows\System32\DriverStore\... 丢失,重装
CUDA Toolkit 12.8 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8 丢失,重装
cuDNN 9.x 同 CUDA 目录(复制进去) 丢失,重装
Ollama 应用 C:\Users\milin\AppData\Local\Programs\Ollama 丢失,重装
Git C:\Program Files\Git 丢失,重装
Node.js C:\Program Files\nodejs 丢失,重装
Claude Code CLI C:\Users\milin\AppData\Roaming\npm\node_modules\@anthropic-ai\claude-code 丢失,npm install -g 即可
VS Code C:\Users\milin\AppData\Local\Programs\Microsoft VS Code 丢失,重装
VS Code 扩展 C:\Users\milin\.vscode\extensions\ 丢失,需备份扩展列表
VS Code 设置 C:\Users\milin\AppData\Roaming\Code\User\settings.json 丢失,需备份
Windows Terminal C:\Users\milin\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\ 丢失,重装
Windows Terminal 配置 ...\LocalState\settings.json 丢失,需备份
JetBrainsMono Nerd Font C:\Windows\Fonts\ 丢失,需重新安装字体
MSVC Build Tools C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools 丢失,重装
Docker Desktop 应用 C:\Program Files\Docker\Docker 丢失,重装
OpenSSH Server Windows 可选功能(系统级) 丢失,重新启用
SSH 私钥 C:\Users\milin\.ssh\id_rsa 丢失,必须提前备份
SSH 公钥 C:\Users\milin\.ssh\id_rsa.pub 丢失,随私钥备份
管理员 authorized_keys C:\ProgramData\ssh\administrators_authorized_keys 丢失,必须提前备份
portproxy 规则 注册表(自动持久化但随系统) 丢失,需重新 netsh 设置
防火墙规则 注册表 丢失,需重新 New-NetFirewallRule
系统环境变量 注册表 HKLM\...\Environment 丢失,需备份
Git 全局配置 C:\Users\milin\.gitconfig 丢失,需备份
v2rayA 应用 C:\Program Files\v2rayA\ 丢失,重装
v2rayA 配置/订阅 C:\Users\milin\AppData\Roaming\v2rayA\ 丢失,需备份
conda init 注入 PowerShell profile(%USERPROFILE%\Documents\WindowsPowerShell\ 丢失,conda init 重新执行

1.2 D 盘(重装后保留)

组件 路径 重装后
Ollama 模型 D:\ollama-models\ ✅ 保留,无需重新下载
Python / Miniconda D:\miniconda3\ ✅ 保留,需重新 conda init powershell
PyTorch 环境 D:\miniconda3\envs\torch\ ✅ 保留,activate 即可用
Docker 数据(WSL VHD) D:\Docker\ ✅ 保留,需重新关联
项目代码 D:\projects\(建议) ✅ 保留
游戏 D:\Games\(Steam 等) ✅ 保留

二、重装前备份清单

在重装系统前执行以下操作,备份全部到 D 盘或 Mac/N100。

备份脚本(PowerShell,管理员运行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 备份目标目录
$backup = "D:\reinstall-backup"
New-Item -Force -Path $backup -ItemType Directory | Out-Null

# 1. SSH 密钥
Copy-Item "$env:USERPROFILE\.ssh" "$backup\ssh-keys" -Recurse -Force

# 2. SSH authorized_keys(管理员密钥)
Copy-Item "C:\ProgramData\ssh\administrators_authorized_keys" "$backup\administrators_authorized_keys" -Force

# 3. Git 全局配置
Copy-Item "$env:USERPROFILE\.gitconfig" "$backup\.gitconfig" -Force -ErrorAction SilentlyContinue

# 4. VS Code 设置
$vscodeUser = "$env:APPDATA\Code\User"
Copy-Item "$vscodeUser\settings.json" "$backup\vscode-settings.json" -Force -ErrorAction SilentlyContinue
Copy-Item "$vscodeUser\keybindings.json" "$backup\vscode-keybindings.json" -Force -ErrorAction SilentlyContinue

# 5. VS Code 扩展列表
code --list-extensions | Out-File "$backup\vscode-extensions.txt"

# 6. 系统环境变量(关键项)
[System.Environment]::GetEnvironmentVariables("Machine") | `
ConvertTo-Json | Out-File "$backup\system-env-vars.json"

# 7. v2rayA 配置与订阅
$v2raya = "$env:APPDATA\v2rayA"
if (Test-Path $v2raya) {
Copy-Item $v2raya "$backup\v2rayA" -Recurse -Force
}

# 8. Windows Terminal 配置
$wtPkg = Get-ChildItem "$env:LOCALAPPDATA\Packages" -Filter "*WindowsTerminal*" |
Select-Object -First 1 -ExpandProperty FullName
if ($wtPkg) {
Copy-Item "$wtPkg\LocalState\settings.json" "$backup\wt-settings.json" -Force
}

# 9. PowerShell Profile(PSReadLine 历史/高亮配置)
if (Test-Path $PROFILE) {
Copy-Item $PROFILE "$backup\ps_profile.ps1" -Force
}

# 8. conda 环境导出(需要 conda 已 init)
$condaEnvs = D:\miniconda3\Scripts\conda.exe env list --json | ConvertFrom-Json
foreach ($env in $condaEnvs.envs) {
$name = Split-Path $env -Leaf
if ($name -ne "base") {
D:\miniconda3\Scripts\conda.exe env export -n $name -f "$backup\conda-env-$name.yml"
}
}

# 9. portproxy 规则导出(便于核对)
netsh interface portproxy show all | Out-File "$backup\portproxy-rules.txt"

Write-Host "备份完成: $backup"
Get-ChildItem $backup

同步到 Mac(可选)

1
2
# 从 Windows 推送到 Mac(需先配置 ③ milin_desktop → Mac 免密 SSH)
scp -r D:\reinstall-backup lin@192.168.2.13:~/Desktop/win11-backup/

三、重装后快速恢复

并行执行路径总览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
【物理操作,约 5 分钟】
├─ 安装 OpenSSH Server → 还原 SSH 密钥 → 还原 authorized_keys
└─ wsl --install(触发重启,建议与 OpenSSH 同步执行后再重启)
↓ 重启
【之后全程可从 Mac 远程 SSH,以下三条 Track 并行推进】

Track A — CUDA 推理栈(约 40 分钟,含下载)
├─ v2rayA 安装 + 还原订阅(其他下载依赖代理,优先完成)
├─ NVIDIA Driver ≥ 575.x(GUI 安装,后台下载期间跑 Track B
├─ CUDA Toolkit 12.8(GUI 安装)
├─ cuDNN 9.x 复制(D 盘已有 zip,约 1 分钟)
├─ winget install Ollama → 设 OLLAMA_MODELS 环境变量
└─ portproxy + 防火墙规则 11434

Track B — 开发工具链(约 20 分钟,与 Track A 并行)
├─ winget install Git / Node.js / VS Code / Windows Terminal
├─ 还原 Windows Terminal settings.json + 安装 Nerd Font
├─ npm install -g @anthropic-ai/claude-code
├─ VS Code 扩展批量还原
└─ conda init powershell(D 盘已有 Miniconda)

Track C — Docker(WSL2 重启后,与 Track A/B 并行)
└─ Docker Desktop 安装 → 关联 D:\Docker

【最后】验证 Ollama GPU 推理 → 验证 OpenClaw → N100 端切换 baseUrl

关键约束

  • Track A 内部串行(Driver → CUDA → cuDNN → Ollama 有依赖顺序)
  • Track B 内各工具之间无依赖,可多开终端同时 winget
  • Claude Code 需先装 Node.js
  • WSL2 重启必须在 OpenSSH 配置完成后执行(否则重启后失去远程入口)

阶段一:SSH + 网络(优先恢复,可立即远程操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# ── 管理员 PowerShell ──

# 1. 安装 OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

# 2. 防火墙(SSH 端口)
New-NetFirewallRule `
-DisplayName 'OpenSSH LAN' `
-Direction Inbound -Protocol TCP -LocalPort 22 `
-Action Allow -Profile Private,Domain

# 3. 还原 SSH 密钥对
New-Item -Force -Path "$env:USERPROFILE\.ssh" -ItemType Directory | Out-Null
Copy-Item "D:\reinstall-backup\ssh-keys\id_rsa" "$env:USERPROFILE\.ssh\id_rsa"
Copy-Item "D:\reinstall-backup\ssh-keys\id_rsa.pub" "$env:USERPROFILE\.ssh\id_rsa.pub"
# 修正权限(Windows SSH 要求严格)
icacls "$env:USERPROFILE\.ssh\id_rsa" /inheritance:r /grant "${env:USERNAME}:F"

# 4. 还原 authorized_keys(让 Mac / N100 / OpenClaw 可登入)
New-Item -Force -Path "C:\ProgramData\ssh" -ItemType Directory | Out-Null
Copy-Item "D:\reinstall-backup\administrators_authorized_keys" `
"C:\ProgramData\ssh\administrators_authorized_keys" -Force
icacls "C:\ProgramData\ssh\administrators_authorized_keys" `
/inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

Write-Host "SSH 配置完成,现在可以从 Mac/N100 远程登入"

# WSL2(Docker 依赖,需要重启——在确认 SSH 可登入后再执行此步)
wsl --install
# 执行后重启,重启完继续后续阶段

完成后从 Mac 验证:

1
ssh milin_desktop "hostname && echo SSH OK"

阶段二(Track A):v2rayA 代理(优先,其他下载依赖代理)

v2rayA 需 GUI 安装,但速度极快,完成后所有后续下载自动走代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 1. 下载安装包(去官网或 GitHub Releases 下载 v2rayA Windows 安装包)
# https://github.com/v2rayA/v2rayA/releases → v2rayA-windows-amd64-installer-vx.x.x.exe

# 2. 安装完成后还原订阅/配置
$v2rayaSrc = "D:\reinstall-backup\v2rayA"
$v2rayaDst = "$env:APPDATA\v2rayA"
if (Test-Path $v2rayaSrc) {
Copy-Item $v2rayaSrc $v2rayaDst -Recurse -Force
Write-Host "v2rayA 配置已还原,重启 v2rayA 服务后生效"
}

# 3. 启动 v2rayA 服务(开始菜单 → v2rayA,或 GUI 托盘)
# 在浏览器打开 http://127.0.0.1:2017 确认节点可用

# 4. 为 CLI 工具配置代理(v2rayA 默认 HTTP 端口 20171)
$proxy = "http://127.0.0.1:20171"

git config --global http.proxy $proxy
git config --global https.proxy $proxy

npm config set proxy $proxy
npm config set https-proxy $proxy

pip config set global.proxy $proxy

# conda(写入 .condarc)
@"
proxy_servers:
http: $proxy
https: $proxy
"@ | Out-File "$env:USERPROFILE\.condarc" -Append

# winget 通常自动使用系统代理(v2rayA 开启"系统代理"选项即可)

# PowerShell 临时代理(当前 session)
$env:HTTP_PROXY = $proxy
$env:HTTPS_PROXY = $proxy

WSL2 中的代理(Docker Desktop / WSL Ubuntu 里):

1
2
3
4
# 在 WSL2 Ubuntu 中(Windows 11 默认镜像网络,直接用 127.0.0.1)
echo 'export http_proxy=http://127.0.0.1:20171' >> ~/.bashrc
echo 'export https_proxy=http://127.0.0.1:20171' >> ~/.bashrc
source ~/.bashrc

开机自动启动 v2ray 核心 + 开启系统代理(Task Scheduler)

v2rayA --lite 模式下,服务启动后不会自动启动 v2ray 核心,也不会自动设置系统代理(WinINet)。通过任务计划程序在登录时运行一个脚本来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 第一步:创建 enable_proxy.ps1(保存到 v2rayA AppData 目录)
# 注意:必须添加 UTF-8 BOM,否则 PowerShell 5.1 会用 GBK 解码导致变量解析失败
$scriptContent = @'
$v2rayaTimeout = 30
$elapsed = 0
while ($elapsed -lt $v2rayaTimeout) {
$svc = Get-Service -Name v2raya -ErrorAction SilentlyContinue
if ($svc -and $svc.Status -eq 'Running') { break }
Start-Sleep -Seconds 2
$elapsed += 2
}

$v2rayProc = Get-Process -Name 'v2ray' -ErrorAction SilentlyContinue
if (-not $v2rayProc) {
$v2rayExe = 'D:\Program Files (x86)\v2raya\v2ray.exe'
$v2rayCfg = 'C:\Users\milin\AppData\Roaming\v2rayA\config.json'
Start-Process -FilePath $v2rayExe -ArgumentList "run --config=$v2rayCfg" -WindowStyle Hidden
}

$portTimeout = 30
$portElapsed = 0
$portReady = $false
while ($portElapsed -lt $portTimeout) {
$conn = netstat -an 2>$null | Select-String ':52345.*LISTENING'
if ($conn) { $portReady = $true; break }
Start-Sleep -Seconds 2
$portElapsed += 2
}

if ($portReady) {
$reg = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1
Set-ItemProperty -Path $reg -Name ProxyServer -Value '127.0.0.1:52345'
Set-ItemProperty -Path $reg -Name ProxyOverride -Value 'localhost;127.*;10.*;192.168.*;<local>'
$sig = '[DllImport("wininet.dll")] public static extern bool InternetSetOption(IntPtr h, int opt, IntPtr buf, int len);'
$type = Add-Type -MemberDefinition $sig -Name WinINet -Namespace WinAPI -PassThru -ErrorAction SilentlyContinue
if ($type) {
$type::InternetSetOption([IntPtr]::Zero, 39, [IntPtr]::Zero, 0) | Out-Null
$type::InternetSetOption([IntPtr]::Zero, 37, [IntPtr]::Zero, 0) | Out-Null
}
}
'@
$scriptPath = "$env:APPDATA\v2rayA\enable_proxy.ps1"
[System.IO.File]::WriteAllText($scriptPath, "`xEF`xBB`xBF" + $scriptContent, [System.Text.Encoding]::UTF8)

# 第二步:注册任务计划
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$scriptPath`""
$trigger = New-ScheduledTaskTrigger -AtLogOn -User ($env:COMPUTERNAME + '\' + $env:USERNAME)
$trigger.Delay = 'PT10S'
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 2)
$principal = New-ScheduledTaskPrincipal -UserId ($env:COMPUTERNAME + '\' + $env:USERNAME) -RunLevel Highest
Register-ScheduledTask -TaskName 'v2rayA-AutoProxy' -Action $action -Trigger $trigger `
-Settings $settings -Principal $principal -Force

注意事项

  • 端口 52345 是 v2rayA 的透明代理(HTTP)端口,也是 Windows 系统代理使用的端口
  • 脚本等待 v2ray 核心真正监听 52345 后才设置注册表,避免代理设置了但核心还没起
  • v2rayA 使用的 config.json 在 %APPDATA%\v2rayA\config.json,脚本直接以同样参数启动 v2ray.exe
  • 如果用户在 web UI 点击 Stop 再 Start,v2rayA 会接管 v2ray 进程,不影响正常使用

阶段三(Track A 续):NVIDIA Driver + CUDA + cuDNN

此阶段需 GUI 操作(下载安装包),SSH 进来后用 PowerShell 辅助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 装好 Driver 后验证(应显示 575.x+,CUDA 12.8)
nvidia-smi

# 装好 CUDA Toolkit 后验证
nvcc --version

# 还原 cuDNN(已备份在 D 盘则无需重装,直接复制)
$cuda = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8"
$cudnn = "D:\cudnn-9.x" # 若上次已下载并保存到 D 盘
if (Test-Path $cudnn) {
Copy-Item "$cudnn\bin\*" "$cuda\bin\" -Recurse -Force
Copy-Item "$cudnn\include\*" "$cuda\include\" -Recurse -Force
Copy-Item "$cudnn\lib\x64\*" "$cuda\lib\x64\" -Recurse -Force
Write-Host "cuDNN 还原完成"
} else {
Write-Host "需手动下载 cuDNN: https://developer.nvidia.com/cudnn"
}

提示:将 cuDNN zip 包保存到 D:\cudnn-9.x\,重装后无需重新下载。


阶段四(Track A 续):Ollama + portproxy + 防火墙

Ollama 模型已在 D 盘,重装后只需重装 Ollama 应用并设环境变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 安装 Ollama
winget install Ollama.Ollama

# 2. 还原 OLLAMA_MODELS 环境变量
[System.Environment]::SetEnvironmentVariable(
"OLLAMA_MODELS", "D:\ollama-models", "Machine"
)
Write-Host "OLLAMA_MODELS = D:\ollama-models(重启 Ollama 托盘 App 后生效)"

# 3. portproxy 规则
netsh interface portproxy add v4tov4 `
listenport=11434 listenaddress=0.0.0.0 `
connectport=11434 connectaddress=127.0.0.1

# 4. 防火墙(Ollama 端口)
New-NetFirewallRule `
-DisplayName 'Ollama LAN' `
-Direction Inbound -Protocol TCP -LocalPort 11434 `
-Action Allow -Profile Private,Domain

模型已存在于 D:\ollama-models,Ollama 重启后自动识别,无需重新下载


阶段五(Track B):开发工具链还原

此阶段与 Track A 完全并行,在单独的 PowerShell 窗口中执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ── 可多开终端并行运行 ──

# Git + 还原全局配置
winget install Git.Git
Copy-Item "D:\reinstall-backup\.gitconfig" "$env:USERPROFILE\.gitconfig" -Force

# Node.js LTS(Claude Code 依赖)
winget install OpenJS.NodeJS.LTS

# VS Code
winget install Microsoft.VisualStudioCode

# Windows Terminal(从 Microsoft Store 或 winget)
winget install Microsoft.WindowsTerminal

# MSVC Build Tools(后台下载,约 8 GB)
winget install Microsoft.VisualStudio.2022.BuildTools

重开 PowerShell 后(PATH 生效):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Claude Code CLI
npm install -g @anthropic-ai/claude-code

# VS Code 设置还原
$dst = "$env:APPDATA\Code\User"
New-Item -Force -Path $dst -ItemType Directory | Out-Null
Copy-Item "D:\reinstall-backup\vscode-settings.json" "$dst\settings.json" -Force

# VS Code 扩展批量还原
Get-Content "D:\reinstall-backup\vscode-extensions.txt" | ForEach-Object {
code --install-extension $_ --force
}

# Miniconda(D 盘已有,只需重新 init)
D:\miniconda3\Scripts\conda.exe init powershell

Windows Terminal 配置还原

参考 milin_win11 机器的终端配置:字体 JetBrainsMono Nerd Font、半透明 PowerShell Profile。

第一步:安装字体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载 JetBrainsMono Nerd Font(约 70 MB)
$nfUrl = "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip"
$nfZip = "D:\installers\JetBrainsMono-NerdFont.zip"
$nfDir = "D:\installers\JetBrainsMono-NF"

Invoke-WebRequest -Uri $nfUrl -OutFile $nfZip
Expand-Archive $nfZip -DestinationPath $nfDir -Force

# 安装所有 ttf 文件(右键菜单也可安装)
Get-ChildItem "$nfDir\*.ttf" | ForEach-Object {
$shell = New-Object -ComObject Shell.Application
$shell.Namespace(0x14).CopyHere($_.FullName, 0x10)
}
Write-Host "字体安装完成,重启 Windows Terminal 后生效"

第二步:还原 settings.json

1
2
3
4
5
6
7
# 找到 Windows Terminal 配置目录
$wtPkg = Get-ChildItem "$env:LOCALAPPDATA\Packages" -Filter "*WindowsTerminal*" |
Select-Object -First 1 -ExpandProperty FullName

# 还原配置
Copy-Item "D:\reinstall-backup\wt-settings.json" "$wtPkg\LocalState\settings.json" -Force
Write-Host "Windows Terminal 配置已还原"

或手动创建 settings.json(基于 milin_win11 配置调整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"$schema": "https://aka.ms/terminal-profiles-schema",
"defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"copyFormatting": "none",
"copyOnSelect": false,
"profiles": {
"defaults": {
"font": {
"face": "JetBrainsMonoNL Nerd Font Mono",
"weight": "bold"
},
"opacity": 50,
"useAcrylic": false
},
"list": [
{
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"name": "Windows PowerShell",
"commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"hidden": false
},
{
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"name": "命令提示符",
"commandline": "%SystemRoot%\\System32\\cmd.exe",
"hidden": false
}
]
},
"keybindings": [
{ "command": { "action": "copy", "singleLine": false }, "keys": "ctrl+c" },
{ "command": "paste", "keys": "ctrl+v" },
{ "command": { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }, "keys": "alt+shift+d" },
{ "command": "find", "keys": "ctrl+shift+f" }
]
}

说明defaults 块中设置字体/透明度后,所有 Profile 自动继承,无需每个 Profile 单独设置。WSL2 Profile 会在安装 Ubuntu 后由 Windows Terminal 自动检测并添加。

第三步:配置 PowerShell 历史记录与命令行高亮(PSReadLine)

WT 本身只负责渲染,历史补全和语法高亮由 PowerShell 的 PSReadLine 模块实现,配置写入 $PROFILE

1
2
3
4
5
6
# 更新 PSReadLine 到最新版(内置版本较旧,部分功能不可用)
Install-Module PSReadLine -Force -SkipPublisherCheck -Scope CurrentUser

# 查看 profile 文件路径
$PROFILE
# 一般为: C:\Users\milin\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

将以下内容写入 profile(追加或新建均可):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ── PSReadLine 历史记录与高亮配置 ──

Import-Module PSReadLine

# 历史记录智能预测(输入时显示灰色内联提示)
Set-PSReadLineOption -PredictionSource History
# 列表视图(按 F2 切换,PowerShell 5.1 只支持 InlineView)
Set-PSReadLineOption -PredictionViewStyle InlineView
Set-PSReadLineOption -HistorySearchCursorMovesToEnd

# 方向键:在已输入内容为前缀时搜索历史
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

# Tab:菜单式补全(显示所有候选项)
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete

# 语法高亮配色(与 One Dark 风格接近)
Set-PSReadLineOption -Colors @{
Command = 'Cyan'
Parameter = 'DarkCyan'
String = '#98C379' # 绿色
Variable = '#E5C07B' # 黄色
Comment = 'DarkGray'
Keyword = '#C678DD' # 紫色
Error = 'Red'
InlinePrediction = 'DarkGray' # 历史预测提示色
}

重装后还原:

1
2
3
4
5
6
7
# 备份 profile 到 D 盘
Copy-Item $PROFILE "D:\reinstall-backup\ps_profile.ps1" -Force

# 还原时
$profileDir = Split-Path $PROFILE
New-Item -Force -Path $profileDir -ItemType Directory | Out-Null
Copy-Item "D:\reinstall-backup\ps_profile.ps1" $PROFILE -Force

效果:输入命令前缀 + 按 ↑ 键即可搜索历史;命令、参数、字符串、变量分色显示;Tab 弹出候选菜单。


阶段六(Track C):Docker Desktop 还原

WSL2 已在阶段一重启时完成,此阶段与 Track A/B 并行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 Docker Desktop
winget install Docker.DockerDesktop

# 启动后关联 D 盘数据(GUI 操作)
# Docker Desktop → Settings → Resources → Advanced
# Disk image location → D:\Docker

# 或 WSL 重新导入方式(若之前用 wsl --export)
wsl --import docker-desktop D:\Docker\desktop D:\wsl-docker-desktop.tar
wsl --import docker-desktop-data D:\Docker\data D:\wsl-docker-desktop-data.tar

# 验证
docker run hello-world
docker run --gpus all nvidia/cuda:12.8.0-base-ubuntu22.04 nvidia-smi

阶段七:验证 OpenClaw(N100 侧)

Ollama baseUrl 对应的 IP 不变(192.168.0.111),重装后无需更改 OpenClaw 配置。

只需从 Mac 验证链路:

1
2
3
4
5
# 验证 Ollama 可达
curl --noproxy '*' -s http://192.168.0.111:11434/api/tags | python3 -m json.tool

# 验证 OpenClaw → Ollama
ssh MyUbuntuLocal "curl -s --noproxy '*' http://192.168.0.111:11434/api/tags | python3 -c 'import json,sys; [print(m[\"name\"]) for m in json.load(sys.stdin)[\"models\"]]'"

四、cuDNN / 大文件持久化建议

文件 建议路径 说明
cuDNN zip 原包 D:\installers\cudnn-windows-x86_64-9.x.zip 重装后直接复制,无需重下
CUDA Toolkit installer D:\installers\cuda_12.8_win.exe 可选保留
Docker WSL export D:\wsl-docker-desktop.tar / data.tar 若用 wsl --export 迁移
Ollama 模型 D:\ollama-models\ 自动关联
Miniconda D:\miniconda3\ 自动关联,conda init 重新执行

五、恢复时间估计

阶段 Track 耗时估计 能否远程 并行说明
阶段一:SSH + wsl --install 5 分钟 + 重启 需物理操作一次 串行,其余全部依赖此步
阶段二:v2rayA A 5 分钟 ✅ 需 GUI 安装 优先,其余下载依赖代理
阶段三:Driver + CUDA + cuDNN A 20-30 分钟 ✅ 需 GUI 安装 与 Track B/C 并行
阶段四:Ollama + portproxy A 5 分钟 ✅ 纯 PowerShell 依赖阶段三完成
阶段五:开发工具链 + Windows Terminal B 20-30 分钟 ✅ 纯 PowerShell 与 Track A/C 并行
阶段六:Docker Desktop C 10 分钟 ✅ 需 GUI 启动 与 Track A/B 并行,依赖 wsl --install
实际墙钟时间(并行后) 约 40 分钟 Track A 是关键路径

Ollama 模型 不需要重新下载(D 盘保留),节省约 27 GB 下载时间(qwen3.5-35b-a3b ~22 GB + qwen3:8b ~5 GB)。


六、快速核验命令(恢复后)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# GPU & CUDA
nvidia-smi
nvcc --version
python -c "import torch; print('CUDA:', torch.cuda.is_available(), torch.cuda.get_device_name(0))"

# Ollama
ollama list

# SSH 服务
Get-Service sshd

# portproxy
netsh interface portproxy show all

# Docker GPU
docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu22.04 nvidia-smi

# 从 Mac 端验证
# ssh milin_desktop "hostname"
# curl --noproxy '*' -s http://192.168.0.111:11434/api/tags

七、其他常用软件(自行下载安装)

以下软件与开发环境无硬性依赖,由用户在环境配置完成后按需自行安装。

软件 用途 获取方式
Listary 文件快速搜索 / 启动器,Ctrl+Ctrl 呼出 listary.com
PowerToys 窗口管理、FancyZones 分屏、PowerRename 等 GitHub Releaseswinget install Microsoft.PowerToys
微信(WeChat) 即时通讯 weixin.qq.comwinget install Tencent.WeChat
QQ 即时通讯 im.qq.comwinget install Tencent.QQ
7-Zip 解压缩(比内置更快,支持更多格式) winget install 7zip.7zip
VLC 本地视频播放 winget install VideoLAN.VLC
PotPlayer 视频播放(支持 GPU 硬解) potplayer.daum.net

winget 批量安装(可选):

1
2
3
4
5
# 一次性安装以上 winget 可管理的软件
winget install Microsoft.PowerToys 7zip.7zip VideoLAN.VLC Tencent.WeChat Tencent.QQ

# Listary 无官方 winget 包,需手动下载安装包
Start-Process "https://www.listary.com/download"

安装顺序建议:先完成环境配置(前六阶段),再统一安装此类软件,避免代理未就绪时下载缓慢。


延伸阅读