之前的Fedora Silverblue 虽然能保证系统不被AI搞挂,但是AI执行命令有时候会碰到问题,正好看到这篇文章:nix 真的 agent 时代的天选之子 https://www.v2ex.com/t/1241549 ,于是折腾的心又开始骚动。
由于不需要桌面环境,也不是silverblue这种特殊的发行版,直接就安装在wsl中了。
wsl
C:\Users\Administrator\.wslconfig
1[wsl2]2networkingMode=mirrored # 完全共享主机网络配置3localhostForwarding=true # 自动端口转发4dnsProxy=true5dnsTunneling=true6firewall=true7autoProxy=true8# 限制 WSL 2 最大占用内存,防止 Windows 物理内存吃满9memory=8GB10# 允许 WSL 2 释放空闲内存给宿主机11autoMemoryReclaim=dropcache12# 新建或导入的 VHDX 默认启用稀疏模式13sparseVhd=truewsl安装debian
1wsl --install -d Debian停止运行
1wsl --shutdown迁移到D盘 目标目录 D:\wsl\debian
1# 1. 导出到临时文件2wsl --export Debian D:\wsl\debian\debian_temp.tar3
4# 2. 注销 C 盘的原版5wsl --unregister Debian6
7# 3. 导入到 D 盘目标路径8wsl --import Debian D:\wsl\debian D:\wsl\debian\debian_temp.tar --version 2查看系统发行版信息
1cat /etc/os-release改主机名
1sudo nano /etc/wsl.conf1[network]2hostname = 你的新主机名3generateHosts = false整个文件
1[boot]2systemd=true3command="mount --make-rshared /"4[user]5default=你的用户名6[network]7hostname=你的新主机名8generateHosts=false更新系统 如果碰到网络问题,需关闭主机代理软件的tun模式,只用系统代理
1sudo apt update2sudo apt upgrade安装tailscale
1curl -fsSL https://tailscale.com/install.sh | shssh
1sudo apt update2sudo apt install -y openssh-server1sudo nano /etc/ssh/sshd_config在文件中确认或修改以下关键项(如果前面带 # 请取消注释):
Port 22(如果 Windows 本身也启用了 SSH 服务,建议改为Port 2222以防端口冲突)PasswordAuthentication yes(允许密码登录)PermitRootLogin no(出于安全考虑,禁止 root 直接登录,使用普通用户登录后再sudo)
修改后保存退出(Ctrl + O -> Enter -> Ctrl + X)。
启动 SSH 服务
根据 WSL 是否开启了 systemd,选择对应的启动方式:
情况 A:已开启 systemd(推荐)
如果在 /etc/wsl.conf 中开启了 systemd:
1# 设置开机自启并立即启动2sudo systemctl enable --now ssh情况 B:未开启 systemd
如果使用传统的 WSL 初始化机制:
1sudo service ssh startNix
1.配置 WSL systemd 支持: 前提条件:确保 Nix 和 Podman 能够正常后台运行。
在 Debian WSL 中创建或修改 /etc/wsl.conf:
1[boot]2systemd=true3command="mount --make-rshared /"command="mount --make-rshared /" 在系统启动时自动将根目录设置为共享挂载,解决 "/" is not a shared mount 警告。
保存后,在 Windows PowerShell 中执行 wsl --shutdown 重启 WSL。
2.安装 Nix 包管理器: *推荐使用 Determinate Systems 安装器。 https://docs.determinate.systems *
在 Debian 终端中运行以下命令安装 Nix(此安装器原生对 WSL 及 systemd 做了深度适配,且默认开启 Flakes 功能):
1curl -fsSL https://install.determinate.systems/nix | sh -s -- install安装完成后重启终端,验证安装:nix --version。
3.配置 Home Manager: 声明式管理所有 CLI 工具。
创建配置目录并编写 ~/.config/home-manager/home.nix:
1mkdir -p ~/.config/home-manager填入以下配置文件home.nix:
1{ config, pkgs, ... }:2
3{4 home.username = "your-username"; # 替换为你的 Debian 用户名5 home.homeDirectory = "/home/your-username"; # 替换为你的主目录路径6 home.stateVersion = "26.05";7
8 # 以后如果发生冲突,自动把旧文件加上 .bak 扩展名并备份9 # 独立运行模式(Standalone Mode)不能这样设置10 #home.backupFileExtension = "bak";11
12 # 允许特定过期的不安全软件包(顶层配置)13 nixpkgs.config = {14 allowUnfree = true; # 可选:顺便允许非自由软件(如 unrar 等)15 };207 collapsed lines
16
17
18 # 仅由 Nix 安装的软件列表19 home.packages = with pkgs; [20 unzip21 btop22 eza23 fastfetch24 gnumake25 mosh26 netcat-openbsd27 socat28 jq29 fff30 yazi31 lazygit32 delta33 ripgrep34
35 nodejs36 pnpm37 yarn38 jdk1739 go40 gcc41 android-tools42 typescript-language-server43 prettier44 python31445 uv46 ruff47 php8348 php83Packages.composer49 ];50
51 # 启用了 Home Manager 深度集成的配置模块52 #programs.fish.enable = true;53 programs.fzf.enable = true;54 #programs.zoxide.enable = true;55 #programs.git.enable = true;56 #programs.tmux.enable = true;57
58 # 推荐:开启 Git 并自动配置 Delta 与 Lazygit59 programs.git = {60 enable = true;61 settings.user = {62 user = {63 name = "Your Name";64 email = "your.email@example.com";65 };66 };67 };68
69 # 新版独立的 Delta 配置70 programs.delta = {71 enable = true;72 enableGitIntegration = true; # 显式开启 Git 集成73 };74
75 programs.lazygit = {76 enable = true;77 settings.gui.language = "zh-CN";78 };79
80 # 启用并配置 Neovim 模块81 programs.neovim = {82 enable = true;83 defaultEditor = true; # 自动将系统默认编辑器设为 nvim (代替 nano)84 viAlias = true; # 允许输入 vi 直接启动 nvim85 vimAlias = true; # 允许输入 vim 直接启动 nvim86
87 # 可以在这里提前声明 Neovim 运行时依赖的一些常用小工具88 extraPackages = with pkgs; [89 ripgrep # Telescope 等插件强力依赖90 xclip # 剪贴板支持(WSL 下非常有用)91 ];92 };93
94
95 # Home Manager is pretty good at managing dotfiles. The primary way to manage96 # plain files is through 'home.file'.97 home.file = {98 # # Building this configuration will create a copy of 'dotfiles/screenrc' in99 # # the Nix store. Activating the configuration will then make '~/.screenrc' a100 # # symlink to the Nix store copy.101 # ".screenrc".source = dotfiles/screenrc;102
103 # # You can also set the file content immediately.104 # ".gradle/gradle.properties".text = ''105 # org.gradle.console=verbose106 # org.gradle.daemon.idletimeout=3600000107 # '';108 };109
110 # Home Manager can also manage your environment variables through111 # 'home.sessionVariables'. These will be explicitly sourced when using a112 # shell provided by Home Manager. If you don't want to manage your shell113 # through Home Manager then you have to manually source 'hm-session-vars.sh'114 # located at either115 #116 # ~/.nix-profile/etc/profile.d/hm-session-vars.sh117 #118 # or119 #120 # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh121 #122 # or123 #124 # /etc/profiles/per-user/[user]/etc/profile.d/hm-session-vars.sh125
126 # ==========================================127 # 1. 通用环境变量( Bash 和 Fish 都会自动继承 )128 # ==========================================129
130 # Home Manager 专门用于管理 PATH 环境变量的属性131 home.sessionPath = [132 "$HOME/.local/bin"133 "$HOME/.cargo/bin"134 "$HOME/.npm-global/bin"135 "$HOME/Android/Sdk/platform-tools"136 "$HOME/Android/Sdk/cmdline-tools/latest/bin"137 "$HOME/Android/Sdk/emulator"138 ];139
140 home.sessionVariables = {141 EDITOR = "nvim";142 #PATH = "$HOME/.npm-global/bin:$HOME/.local/bin:$PATH";143
144 # 设置 npm 全局安装路径(防止需要 root 权限)145 NPM_CONFIG_PREFIX = "$HOME/.npm-global";146
147 ANDROID_HOME = "$HOME/Android/Sdk";148 ANDROID_SDK_ROOT = "$HOME/Android/Sdk";149 ANDROID_NDK_HOME = "$HOME/Android/Sdk/ndk/28.0.13004108";150 JAVA_HOME = "${pkgs.jdk17}";151 };152
153
154 # ==========================================155 # 2. Bash 配置156 # ==========================================157 programs.bash = {158 enable = true;159
160 # Bash 专属别名161 shellAliases = {162 ll = "eza -l --icons";163 la = "eza -la --icons";164 lg = "lazygit";165 ff = "fff";166 cd = "z";167 };168
169 # 直接追加到 ~/.bashrc 末尾的自定义命令/逻辑170 bashrcExtra = ''171 if [ -f "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" ]; then172 . "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"173 fi174 # 可以在这里添加只属于 bash 的初始化脚本175 '';176 };177
178 # ==========================================179 # 3. Fish 配置180 # ==========================================181 programs.fish = {182 enable = true;183
184 # Fish 专属别名185 shellAliases = {186 ll = "eza -l --icons";187 la = "eza -la --icons";188 lg = "lazygit";189 ff = "fff";190 cd = "z";191 };192
193 # Fish 启动时的交互初始化脚本194 interactiveShellInit = ''195 # 禁用默认的 Fish 欢迎问候语196 set -g fish_greeting ""197
198 if test -f "$HOME/.nix-profile/etc/profile.d/hm-session-vars.fish"199 source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.fish"200 end201
202 # 将特定路径添加到 Fish 的 PATH 列表中203 #fish_add_path $HOME/.npm-global/bin $HOME/.local/bin204 '';205
206 };207
208 # 启用 zoxide,并自动集成到各 Shell 中209 programs.zoxide = {210 enable = true;211 enableFishIntegration = true; # 自动为 Fish 添加 z 命令212 enableBashIntegration = true; # 自动为 Bash 添加 z 命令213 options = [214 "--cmd cd" # 将 zoxide 的主命令绑定到 cd 上215 ];216 };217
218
219
220 # Let Home Manager install and manage itself.221 programs.home-manager.enable = true;222}首次激活 Home Manager:
1nix run home-manager/master -- init2nix run home-manager/master -- switch3#或4#nix run home-manager/master -- switch -b bak若不能下载安装,记得调整宿主机的代理工具,一般关闭tun模式就行了
4.使用 APT 安装底层容器工具: 配置 Podman 环境。
更新系统的 APT 库并安装 Podman 及相关组件:
1sudo apt update2sudo apt install -y podman podman-docker podman-compose如果需要在 Nix 调用的 Shell 中以 default shell 启动 Fish,可以运行 chsh -s $(nix-build '<nixpkgs>' -A fish)/bin/fish 或在 ~/.bashrc 末尾添加 exec fish。
开启用户 Lingering(常驻会话)
1sudo loginctl enable-linger $USER在 WSL 中将 Fish 设为默认 Shell
Nix 安装的 Fish 位于 /home/[user]/.nix-profile/bin/fish,在 Debian 中将其设为默认 Shell:
1.将 Nix 路径下的 fish 加入系统安全 shell 列表:
1echo "$HOME/.nix-profile/bin/fish" | sudo tee -a /etc/shells2.更改默认 shell:
1chsh -s $HOME/.nix-profile/bin/fish2# 或3chsh -s "$(command -v fish)"3.重新打开 WSL 终端,就会直接进入由 Nix 全权管理的 Fish 环境了。
各类nix外的工具
https://github.com/herdrdev/herdr
1curl -fsSL https://herdr.dev/install.sh | shhttps://github.com/saladday/cc-switch-cli
1curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash1curl -fsSL https://pi.dev/install.sh | sh2# OR3npm install -g --ignore-scripts @earendil-works/pi-coding-agent1curl -fsSL https://omp.sh/install | shpi设置
~\.pi\agent\models.json
1{2 "providers": {3 "asdf": {4 "baseUrl": "https://asdf.com/v1",5 "api": "openai-completions",6 "apiKey": "sk-****",7 "compat": {8 "supportsDeveloperRole": false,9 "supportsReasoningEffort": true10 },11 "models": [12 {13 "id": "gpt-6-sol",14 "contextWindow": 1050000,15 "maxTokens": 128000,37 collapsed lines
16 "reasoning": true,17 "reasoningEffort": "low",18 "compaction": {19 "triggerRatio": 0.8,20 "reserveTokens": 20000,21 "keepRecentMessages": 1022 }23 },24 {25 "id": "gpt-5.6-sol",26 "contextWindow": 1050000,27 "maxTokens": 128000,28 "reasoning": true,29 "reasoningEffort": "low",30 "compaction": {31 "triggerRatio": 0.8,32 "reserveTokens": 20000,33 "keepRecentMessages": 1034 }35 },36 {37 "id": "gpt-6-astra",38 "contextWindow": 1050000,39 "maxTokens": 128000,40 "reasoning": true,41 "reasoningEffort": "low",42 "compaction": {43 "triggerRatio": 0.8,44 "reserveTokens": 20000,45 "keepRecentMessages": 1046 }47 }48 ],49 "name": "asdf"50 }51 }52}~\.pi\agent\settings.json
1{2 "defaultProvider": "asdf",3 "defaultModel": "gpt-6-sol",4 "defaultThinkingLevel": "low",5 "showHardwareCursor": true,6 "lastChangelogVersion": "0.87.1",7 "theme": "dark",8 "outputPad": 0,9 "terminal": {10 "showTerminalProgress": true11 },12 "hideThinkingBlock": false,13 "packages": [14 ]15}pi插件
1pi install npm:pi-web-access2pi install npm:pi-mcp-adapter3pi install npm:pi-subagents4pi install npm:pi-lens5pi install npm:pi-memory6pi install npm:@juicesharp/rpiv-todo7pi install npm:bigpowers8pi install npm:context-mode9pi install npm:pi-powerline-footer10pi install npm:@ff-labs/pi-fff11pi install npm:pi-background-tasks12pi install npm:@vndv/pi-codegraph13pi install npm:pi-cache-optimizer14pi install npm:@juicesharp/rpiv-ask-user-question15pi install npm:pi-zentui4 collapsed lines
16pi install npm:pi-calm17pi install npm:pi-cc-extensions18pi install npm:@narumitw/pi-plan-mode19pi install npm:@paulpham157/apply-patch代理 解决git clone慢的问题
- ~/.ssh/config:为 Host * 设置默认 ProxyCommand,让 SSH 连接经代理转发。
netcat方式
~/.ssh/config
1Host *2 ProxyCommand nc -X 5 -x 127.0.0.1:7897 %h %p正常ssh远程需要:
1ssh -o ProxyCommand=none -o StrictHostKeyChecking=accept-new user@host设置wsl系统随宿主系统一起启动
要实现 Windows 宿主机开机时 WSL 自动运行并对外提供 SSH 服务,需要配置三个核心环节:WSL 内部 SSH 服务自启、Windows 开机唤醒 WSL 以及 网络连通性(镜像模式与防火墙)。
第一步:配置 WSL 内部 SSH 服务自启
1.打开 WSL 终端,编辑 WSL 配置文件:
1sudo nano /etc/wsl.conf2.在文件中添加(或修改)以下内容以启用 systemd 支持:
1[boot]2systemd=true3.保存并退出(Ctrl + O,回车,Ctrl + X),随后设置 SSH 随 systemd 自启:
1sudo systemctl enable ssh第二步:配置 Windows 任务计划程序(宿主开机启动 WSL)
使用 Windows “任务计划程序”可以在系统启动(哪怕尚未登录 Windows 桌面)时自动拉起 WSL:
- 按
Win + R键,输入taskschd.msc并回车。 - 在右侧操作栏点击 “创建任务”(不要选“创建基本任务”):
-
常规选项卡:
- 名称:
AutoStartWSL - 勾选 “不管用户是否登录都要运行”
- 勾选 “使用最高权限运行”
- 名称:
-
触发器选项卡:
- 点击“新建” -> 开始任务选择 “启动时”(如果希望登录桌面后再启动,可选“在登录时”)。
-
操作选项卡:
- 点击“新建” -> 操作选择“启动程序”。
- 程序或脚本:
wsl.exe - 添加参数:
-d <你的分发版名称> --exec true(例如-d Ubuntu --exec true;若不确定名称,可在 PowerShell 中运行wsl -l查看)。
-
条件选项卡:
- 取消勾选 “只有在计算机使用交流电源时才启动此任务”(防止笔记本拔掉电源后失效)。
3.点击“确定”保存,系统会提示输入 Windows 当前管理员账号的密码。
第三步:配置网络与防火墙(确保外部可访问)
WSL 2 默认的 NAT 模式会导致每次重启后 WSL 虚拟 IP 发生变化。最稳妥简便的方式是开启 镜像网络模式(Mirrored Networking),让 WSL 直接共享宿主机的 IP 地址与端口。
- 在 Windows 用户根目录(如
C:\Users\你的用户名\)下创建或编辑.wslconfig文件。 - 添加以下配置:
1[wsl2]2networkingMode=mirrored3.放行 Windows 防火墙端口:
以管理员身份打开 Windows PowerShell,运行以下命令开通 22 端口入站规则:
1New-NetFirewallRule -Name "WSL_SSH_22" -DisplayName "WSL SSH Inbound" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22验证生效
- 在 PowerShell 中运行
wsl --shutdown完全关闭当前 WSL。 - 重启 Windows 宿主机。
- 在局域网内的其他设备上,直接尝试通过 SSH 连接宿主机的 IP 即可:
1ssh <WSL用户名>@<Windows宿主机IP>安卓USB调试
USB 直连到 WSL2
需要在 Windows 侧安装并使用 usbipd-win,把手机的 USB 设备附加给 WSL: https://usbipd-win.en.softonic.com/download
- 手机开启“开发者选项”和“USB 调试”。
- Windows 安装 usbipd-win。
- 在 PowerShell 查看 USB 设备:
1usbipd list- 绑定设备:
1usbipd bind --busid <BUSID>- 附加到 Debian:
1usbipd attach --wsl --busid <BUSID>- 在 Debian 中确认:
lsusb 需单独安装
1sudo apt install usbutils1lsusb2adb devicesadb devices 弹出 no permissions (missing udev rules...等信息的话
1sudo apt install android-sdk-platform-tools-common然后重新连接设备并重启 ADB:
1adb kill-server2adb start-server3adb devices如果仍然没有权限,在 Debian 中添加规则: 2d95 是对应设备id
1sudo tee /etc/udev/rules.d/51-android.rules >/dev/null <<'EOF'2SUBSYSTEM=="usb", ATTR{idVendor}=="2d95", MODE="0660", GROUP="plugdev"3EOF4
5sudo chmod 644 /etc/udev/rules.d/51-android.rules6sudo udevadm control --reload-rules7sudo udevadm trigger重新执行
1adb kill-server2adb start-server3adb devices不弹出允许USB调试的提示 始终是authorizing状态 检查USB线是否有数据传输能力(可能是纯充电线) 换根线
手机第一次连接时会弹出“允许 USB 调试”的授权提示,需要确认。
如果 Debian 中没有 adb,需要安装 Android platform-tools。优先使用已有 Android SDK 中的:
1$ANDROID_HOME/platform-tools/adb devices或者:
1$ANDROID_SDK_ROOT/platform-tools/adb devicesadb devices 正常时应看到类似:
1R58M1234567 device如果显示:
1unauthorized说明手机还没有确认调试授权。