这个blog两年没更新过了啊!靠着AI打气又拾起来了!
起因是节前Fusion 360警告我win10不受支持了,Gemini也建议我换个系统,并且疯狂安利Win11,安抚我说Win11已经不是几年前那种费拉不堪的状态了。
再信AI一次。
0 备份 尤其是wsl2! :
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 mkdir -p ~/wsl_backup/manifestscd ~/wsl_backup/manifestscomm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u) > apt-manual-packages.txtapt-mark showmanual > apt-manual-list.txt conda env export --no-builds > conda_environment.yml pip freeze > requirements.txt cargo install --list > cargo-crates.txt npm list -g --depth=0 > npm-global-packages.txt cd ~tar -czvf ~/wsl_backup/dotfiles.tar.gz \ .zshrc \ .bashrc \ .profile \ .zsh_history \ .bash_history .ssh \ .tmux.conf \ .fzf.zsh \ .gitconfig \ .vimrc \ .config/nvim \ .gnupg \ .condarc \ .pip \ .cargo/config.toml \
1 装系统 装专业版即可,需要注意,分区别在跟Linux似的一块/用到底,2T盘可以先给C盘384G($384 \times 1024 = 393216 \text{ MB}$),剩下的给D盘。使用的时候:
wsl2放D盘
尽量用protable软件,全放D盘,那些死皮赖脸要待在C盘的软件再放C盘。
如此,重装的时候不会一锅端。
另外,装好了第一次见到Windows初始化配置的时候,微软强制登录Microsoft账号。此时Shift + F10,输入OOBE\BYPASSNRO自动重启,就可以选“我没有 Internet 连接”跳过账号登录。好处是可以完全自己决定user文件夹的名字。
进了系统先装驱动,尤其是显卡驱动,先装完驱动再装wsl2 ,但是主板带的什么MSI Center装完驱动可以卸了。
NVIDIA APP 选 NVIDIA studio 驱动,对跑CUDA的场景来说,Game Ready 驱动更新过于频繁。
2 清理微软的垃圾 第一时间防火防盗防微软。
彻底禁止 Windows 自动更新驱动: Win + R 输入 gpedit.msc:计算机配置 -> 管理模板 -> Windows 组件 -> Windows 更新 -> 管理从 Windows 更新提供的更新 ,右侧的 “Windows 更新不包括驱动程序” ,选择 “已启用” 。如此,让 Windows Update 只推安全补丁和功能更新,绝不会动显卡、网卡、声卡驱动。
保留 Defender,配置“码农豁免区” 打开 Windows 安全中心 -> 病毒和威胁防护 -> 管理设置 ,下拉找到 “排除项” -> 添加或删除排除项 ,酌情加入:
D:\WSL (放 WSL 镜像,防止扫描 vhdx 读写);
D:\DEV (放代码);
D:\MOEDL (放模型);
etc.
左下角“天气新闻”等等是 小组件” (Widgets):Win + R 输入 gpedit.msc: 计算机配置 -> 管理模板 -> Windows 组件 -> 小组件 ,右侧的 “允许小组件” ,选择 “已禁用” 。
锁屏时“天气新闻”等待是 Windows 聚焦 (Windows Spotlight) :
右键桌面 -> “个性化” -> 选择 “锁屏界面” ,在个 性化锁屏界面 中选择 “图片” (Picture) 。
再往下看,如果有 “在锁屏界面上获取花絮、提示、技巧和更多内容” ,选择 关闭 。
如果有 “锁屏界面状态” ,改为 无 (None) 。
开始菜单里的垃圾,右键桌面 -> “个性化” -> “开始” :
显示最近添加的应用 -> 关 。
显示最常用的应用 -> 关 。
在“开始”菜单中……显示最近打开的项目 -> 关
开始菜单的搜索 强行把本地搜索和 Bing 搜索混合 :
Win + R 输入 gpedit.msc:用户配置 (User Configuration) -> 管理模板 (Administrative Templates) -> Windows 组件 (Windows Components) -> 文件资源管理器 (File Explorer),右侧找: “关闭文件资源管理器搜索框中的最近搜索条目显示” (Turn off display of recent search entries in the Windows Search box) ,选择 “已启用” (Enabled) 。重启资源管理器即可,taskkill /f /im explorer.exe; start explorer.exe。注意:微软经常改这个策略的名字,比如也可能叫“关闭搜索框建议”。
也可以执行 reg add "HKCU\Software\Policies\Microsoft\Windows\Explorer" /v "DisableSearchBoxSuggestions" /t REG_DWORD /d 1 /f 修改。
关闭 “搜索要点” (Search Highlights): 设置 -> 隐私和安全性 -> 搜索权限 ,往下找到 “更多设置” ,关掉 “显示搜索要点” (Show search highlights) 。
任务栏的搜索框,任务栏空白处 右键 -> “任务栏设置” ,第一项就是 “搜索” ,选择 “隐藏” 。
Steam/Epic党可以把XBox相关都端了:
关闭 Xbox Game Bar :在 设置 -> 游戏 -> Xbox Game Bar ,关闭 “允许控制器打开 Game Bar” 。
开始菜单搜 “Xbox”,右键 -> 卸载 。
唯一例外:游戏模式 (Game Mode) ,留着 ,在 设置 -> 游戏 -> 游戏模式 里,保持 开 (ON)。
关闭 OneDrive :
解除“文件夹备份”,任务栏右下角的那个“云朵”图标,右上角齿轮进入 设置 ,找到 “同步并备份” (Sync and backup) -> “管理备份” (Manage backup),把“文档”、“图片”、“桌面”全部关掉(Stop backup)。 ,此时系统会把这些文件夹的路径从 C:\Users\<username>\OneDrive\Desktop 恢复为 C:\Users\<username>\Desktop
取消链接:设置 里 -> “账户” (Account),点击 “取消链接此电脑” (Unlink this PC)。
卸载:设置 -> 应用 -> 安装的应用 ,搜 “OneDrive” -> 卸载 。
至于 基于虚拟化的安全性 (VBS)” / HVCI ,模型和网上的说法都没定论。
Win 键搜索 “内核隔离” -> “内存完整性” ,收益有限,关不关无所谓。
网上流传的 bcdedit /set hypervisorlaunchtype off 不能设置, wsl2 要用。
找回Win10右键菜单:
1 reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
重启资源管理器即可。后悔的话:
1 reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
3 清理其他垃圾,装Windows下的常用工具
搜狗自带桌面壁纸和汪仔,记得删掉和关闭。
取消WPS的云盘资源管理器图标、取消传输助手自启。
装cherrystudio 。
装no machine。
Snipaste用portable。
Motrix用portable。
装Git:
1 winget install --id Git.Git
装微信QQ:
1 2 winget install Tencent.WeChat winget install Tencent.QQ
PotPlayer:
1 winget install Daum.PotPlayer
装powertoys:
1 winget install Microsoft.PowerToys
装Everything和Listary:
1 2 winget install voidtools.Everything winget install -e --id Bopsoft.Listary
4 安装wsl2 有显卡驱动了再装wsl2。
先装 WSL 本体,管理员 PowerShell:
装完建议重启,确认 WSL 版本:
在 D 盘准备一个专门目录 D:\WSL,安装一个临时 Ubuntu(会默认在 C 盘),启动一次 Ubuntu,完成用户名/密码初始化后退出。
把迁移到 D 盘:
1 wsl --export Ubuntu D:\WSL\ubuntu.tar
注销原来的 Ubuntu(这一步会删除 C 盘那个实例的注册与磁盘):
1 wsl --import Ubuntu D:\WSL D:\WSL\ubuntu.tar --version 2
现在 Ubuntu 的 ext4.vhdx 就在 D:\WSL\ 下面了。
wsl2网络配置:建议按老方法,默认NAT,不要配自动代理、DNS隧道等配置。装个clash-verge,用自己写的订阅发布程序让Windows、wsl、PVE、rock5b、o6n等设备同步订阅配置,虽然heavy但是最稳妥:
1 2 3 4 5 [wsl2] networkingMode =natautoProxy =false dnsTunneling =false dnsProxy =false
新wsl2支持mirror,直接走Windows的网卡,别的没什么问题,但是gemini-cli或codex可能会用不了:
1 2 3 4 5 [wsl2] networkingMode =mirroreddnsTunneling =true autoProxy =true firewall =true
此时wget下载chrome会自动拿到autoproxy配置走clash,但是apt不行,还得手动指定proxy
1 2 3 4 sudo tee /etc/apt/apt.conf.d/99proxy <<'EOF' Acquire::http::Proxy "http://127.0.0.1:7897" ; Acquire::https::Proxy "http://127.0.0.1:7897" ; EOF
5 初始化wsl2 用gemini和chatgpt写了个一键安装脚本,也可以一步一步执行。
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 #!/usr/bin/env bash set -eGREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' log () { echo -e "${GREEN} [SETUP] $1${NC} " ; }info () { echo -e "${BLUE} [INFO] $1${NC} " ; }error () { echo -e "${RED} [ERROR] $1${NC} " ; }if [ "$EUID " -eq 0 ]; then error "请不要使用 root 运行此脚本,请使用普通用户运行!" error "脚本内部会在需要时请求 sudo 权限。" exit 1 fi sudo -vwhile true ; do sudo -n true ; sleep 60; kill -0 "$$" || exit ; done 2>/dev/null &touch "$HOME /.bashrc" touch "$HOME /.zshrc" log "📦 1. 更新系统并安装基础依赖..." sudo apt update && sudo apt upgrade -ysudo apt install -y \ git git-lfs curl wget ca-certificates \ build-essential pkg-config libssl-dev \ zip unzip btop tmux zsh \ net-tools iproute2 dnsutils \ jq yq tree procps make \ direnv rsync tldr shellcheck \ software-properties-common ffmpeg \ fonts-noto-cjk fonts-wqy-microhei \ language-pack-zh-hans export http_proxy="http://127.0.0.1:7897" export https_proxy="http://127.0.0.1:7897" sudo --preserve-env=http_proxy,https_proxy add-apt-repository ppa:zhangsongcui3371/fastfetch -ysudo apt updatesudo apt install fastfetch -ylog "🦀 2. 安装 Rust 环境..." if ! command -v rustup >/dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y else info "Rustup 已安装,跳过." fi source "$HOME /.cargo/env" log "🦀 安装 Cargo Binstall (加速工具安装)..." if ! command -v cargo-binstall >/dev/null 2>&1; then curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash fi log "🦀 安装现代命令行工具 (Rust编写)..." export GITHUB_TOKEN="ghp_xxx" cargo binstall -y \ eza bat fd-find ripgrep du-dust procs zoxide hyperfine \ cargo-watch cargo-nextest cargo-update cargo-audit \ starship atuin bob-nvim topgrade tealdeer zellij sudo apt remove -y tldrlog "📝 3. 使用 Bob 安装最新 Neovim..." export PATH="$HOME /.cargo/bin:$PATH " if command -v bob >/dev/null 2>&1; then bob install stable bob use stable if [[ ":$PATH :" != *":$HOME /.local/share/bob/nvim-bin:" * ]]; then info "提示: 请将 $HOME /.local/share/bob/nvim-bin 添加到你的 PATH 中" fi else error "Bob 安装失败,跳过 Neovim 安装。" fi export PATH="$HOME /.local/share/bob/nvim-bin:$PATH " echo 'export PATH="$HOME/.local/share/bob/nvim-bin:$PATH"' >> ~/.bashrcecho 'export PATH="$HOME/.local/share/bob/nvim-bin:$PATH"' >> ~/.zshrcmv ~/.config/nvim{,.bak}mv ~/.local/share/nvim{,.bak}mv ~/.local/state/nvim{,.bak}mv ~/.cache/nvim{,.bak}git clone https://github.com/LazyVim/starter ~/.config/nvim rm -rf ~/.config/nvim/.gitlog "🟢 4. 安装 Node.js 环境..." export NVM_DIR="$HOME /.nvm" if [ ! -d "$NVM_DIR " ]; then curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash fi [ -s "$NVM_DIR /nvm.sh" ] && . "$NVM_DIR /nvm.sh" log "🟢 安装 Node LTS..." nvm install --lts nvm use --lts nvm alias default lts/* log "🟢 安装 pnpm 和常用全局包..." if ! command -v pnpm >/dev/null 2>&1; then curl -fsSL https://get.pnpm.io/install.sh | sh - fi export PATH="$HOME /.local/share/pnpm:$PATH " pnpm add -g typescript tsx eslint prettier @google/gemini-cli @openai/codex pnpm approve-builds -g curl -fsSL https://claude.ai/install.sh | bash echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrclog "🐍 5. 安装 Python 环境 (uv)..." if ! command -v uv >/dev/null 2>&1; then curl -Ls https://astral.sh/uv/install.sh | sh fi export PATH="$HOME /.local/bin:$PATH " log "🐍 安装 Python 工具链..." for tool in ruff mypy black poetry httpie; do uv tool install "$tool " || true done log "🐍 5.5 安装 Miniconda..." MINICONDA_PATH="$HOME /miniconda3" if [ ! -d "$MINICONDA_PATH " ]; then wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh bash miniconda.sh -b -p "$MINICONDA_PATH " rm miniconda.sh "$MINICONDA_PATH /bin/conda" init bash "$MINICONDA_PATH /bin/conda" init zsh "$MINICONDA_PATH /bin/conda" config --set auto_activate_base false log "✅ Miniconda 安装完成 (Base 环境已禁用自动激活)" else info "Miniconda 已存在,跳过安装。" fi log "🐙 6. 安装 Git 工具..." if ! command -v gh >/dev/null 2>&1; then info "安装 gh cli..." sudo mkdir -p -m 755 /etc/apt/keyrings wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null sudo apt update sudo apt install -y gh fi if ! command -v lazygit >/dev/null 2>&1; then info "安装 lazygit..." LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[^"]*' ) ARCH=$(uname -m) case $ARCH in x86_64) LG_ARCH="x86_64" ;; aarch64) LG_ARCH="arm64" ;; *) error "不支持的架构: $ARCH " ; exit 1 ;; esac curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION} /lazygit_${LAZYGIT_VERSION} _Linux_${LG_ARCH} .tar.gz" tar xf lazygit.tar.gz lazygit sudo install lazygit /usr/local/bin rm -f lazygit lazygit.tar.gz fi log "💻 7. 配置 Shell 环境..." if [ ! -d "$HOME /.oh-my-zsh" ]; then info "安装 Oh-My-Zsh..." sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh) " "" --unattended --keep-zshrc fi if [ ! -d "$HOME /.fzf" ]; then info "安装 FZF (命令行模糊搜索)..." git clone --depth 1 https://github.com/junegunn/fzf.git "$HOME /.fzf" "$HOME /.fzf/install" --all else info "FZF 已安装,跳过." fi ZSHRC="$HOME /.zshrc" touch "$ZSHRC " if grep -q 'ZSH_THEME=' "$ZSHRC " ; then sed -i 's/^ZSH_THEME=".*"/ZSH_THEME=""/' "$ZSHRC " fi if [ -f "$ZSHRC " ]; then cp "$ZSHRC " "$ZSHRC .pre-bootstrap" info "已备份现有配置到 .zshrc.pre-bootstrap" fi if [ ! -f "$HOME /.oh-my-zsh/templates/zshrc.zsh-template" ]; then curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/templates/zshrc.zsh-template > temp_zshrc else cp "$HOME /.oh-my-zsh/templates/zshrc.zsh-template" temp_zshrc fi CURRENT_CONTENT=$(cat "$ZSHRC " ) cat temp_zshrc >> "$ZSHRC " echo "" >> "$ZSHRC " echo "$CURRENT_CONTENT " > "$ZSHRC " rm temp_zshrcsed -i 's/^ZSH_THEME=".*"/ZSH_THEME=""/' "$ZSHRC " sed -i 's/^plugins=(git)/plugins=(git extract sudo)/' "$ZSHRC " cat <<EOT >> "$ZSHRC" # --- Bootstrap Generated Config (PATHs & Tools) --- # 1. PATH 补全 (Rust, Node, Bob, Local Bin) # 注意:Miniconda 已经在文件头部配好了,这里不需要重复 export PATH="\$HOME/.local/bin:\$HOME/.cargo/bin:\$HOME/.local/share/bob/nvim-bin:\$HOME/.local/share/pnpm:\$PATH" # 2. 工具启动 eval "\$(starship init zsh)" # 启动 Starship eval "\$(zoxide init zsh)" # 启动 Zoxide (z 命令) # 3. 别名 (Aliases) alias cat='bat' alias ls='eza --icons' # 基础 ls 变彩色+图标 alias ll='eza -lah --icons --git ' # ll 显示详情、Git状态、隐藏文件 alias lt='eza -lah --tree --level=2 --icons' # lt 显示目录树(2层) alias vi='nvim' alias vim='nvim' alias zj='zellij' alias ra='ranger' # 如果装了 ranger # 4. NVM 懒加载 (加快启动速度) export NVM_DIR="\$HOME/.nvm" [ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh" EOT chsh -s $(which zsh) log "✅ .zshrc 修复完成!(Conda + FZF + OMZ + Tools 全部合体)" log "👉 现在输入 'zsh' 进入新环境吧!" curl -fsSL "https://github.com/gpakosz/.tmux/raw/refs/heads/master/install.sh#$(date +%s) " | bash
关于yt-dlp:
1 2 3 4 5 uv tool install yt-dlp --with curl_cffi --with pycryptodomex --upgrade --force vim ~/.config/yt-dlp/config --js-runtimes node --remote-components ejs:github
关于恢复备份的.ssh文件夹,拷过去权限得改对:
1 2 3 4 5 chmod 700 ~/.sshchmod 600 ~/.ssh/id_*chmod 644 ~/.ssh/*.pubchmod 600 ~/.ssh/config
关于中文环境,上面装了字体和中文编码,需要配置语言环境:
1 sudo dpkg-reconfigure locales
选zh_CN.UTF-8 UTF-8即可,echo $LANG还不行的话:
1 2 echo "export LANG=zh_CN.UTF-8" >> ~/.bashrcecho "export LANG=zh_CN.UTF-8" >> ~/.zshrc
现在使用topgrade自动感知并更新安装工具。
6 tailscale 与 ipv6 节后移动给的GPON坏了,运营商换了一个后发现有ipv6了。家里的rock5b、PVE工作站都可以用ipv6直连了。
PVE装tailscale 需要注意的是,PVE默认没打开ipv6支持,所以需要手动设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 vi /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 net.ipv6.conf.all.forwarding = 1 vi /etc/sysctl.d/99-tailscale.conf net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.d/99-tailscale.confecho 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/99-tailscale.confifreload -a
此时用ip -6 addr show会发现vmbr0上多出来一个2409(移动)开头的地址,再用手机等公网设备打开tailscale去ping这台PVE就会从relay转到direct了。
1 2 3 5: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000 inet6 2409:xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr proto kernel_ra valid_lft 86181sec preferred_lft 14181sec
全家搬到tailscale 通过rock5b转发流量,可以把家里的192.168.1.x/24都放在tailscale上。在rock5b上配置系统转发:
1 2 3 4 5 echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.confecho 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.confsudo sysctl -psudo tailscale up --advertise-routes=192.168.1.0/24 --accept-dns=false
出于安全考虑,被“广播”的网段 Tailscale 默认不信任,需要手动确认:
登录 Tailscale Admin Console 。
Rock 5B 点击右侧的 **三个点 (…)**。
选择 Edit route settings 。
在弹出的窗口中,勾选广播的网段 192.168.1.0/24。
点击 Save 。
此时,手机用运营商的网,打开tailscale,也可以使用192.168.1.0/24的IP控制家里的设备了。