夜火笔记

Debian+Nix配置

2026-09-28
linuxdebian
16分钟
3060字

之前的Fedora Silverblue 虽然能保证系统不被AI搞挂,但是AI执行命令有时候会碰到问题,正好看到这篇文章:nix 真的 agent 时代的天选之子 https://www.v2ex.com/t/1241549 ,于是折腾的心又开始骚动。

由于不需要桌面环境,也不是silverblue这种特殊的发行版,直接就安装在wsl中了。

wsl

C:\Users\Administrator\.wslconfig

1
[wsl2]
2
networkingMode=mirrored # 完全共享主机网络配置
3
localhostForwarding=true # 自动端口转发
4
dnsProxy=true
5
dnsTunneling=true
6
firewall=true
7
autoProxy=true
8
# 限制 WSL 2 最大占用内存,防止 Windows 物理内存吃满
9
memory=8GB
10
# 允许 WSL 2 释放空闲内存给宿主机
11
autoMemoryReclaim=dropcache
12
# 新建或导入的 VHDX 默认启用稀疏模式
13
sparseVhd=true

wsl安装debian

Terminal window
1
wsl --install -d Debian

停止运行

Terminal window
1
wsl --shutdown

迁移到D盘 目标目录 D:\wsl\debian

1
# 1. 导出到临时文件
2
wsl --export Debian D:\wsl\debian\debian_temp.tar
3
4
# 2. 注销 C 盘的原版
5
wsl --unregister Debian
6
7
# 3. 导入到 D 盘目标路径
8
wsl --import Debian D:\wsl\debian D:\wsl\debian\debian_temp.tar --version 2

查看系统发行版信息

Terminal window
1
cat /etc/os-release

改主机名

Terminal window
1
sudo nano /etc/wsl.conf
1
[network]
2
hostname = 你的新主机名
3
generateHosts = false

整个文件

1
[boot]
2
systemd=true
3
command="mount --make-rshared /"
4
[user]
5
default=你的用户名
6
[network]
7
hostname=你的新主机名
8
generateHosts=false

更新系统 如果碰到网络问题,需关闭主机代理软件的tun模式,只用系统代理

Terminal window
1
sudo apt update
2
sudo apt upgrade

安装tailscale

Terminal window
1
curl -fsSL https://tailscale.com/install.sh | sh

ssh

Terminal window
1
sudo apt update
2
sudo apt install -y openssh-server
Terminal window
1
sudo 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:

Terminal window
1
# 设置开机自启并立即启动
2
sudo systemctl enable --now ssh

情况 B:未开启 systemd

如果使用传统的 WSL 初始化机制:

Terminal window
1
sudo service ssh start

Nix

1.配置 WSL systemd 支持: 前提条件:确保 Nix 和 Podman 能够正常后台运行。

在 Debian WSL 中创建或修改 /etc/wsl.conf:

1
[boot]
2
systemd=true
3
command="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 功能):

Terminal window
1
curl -fsSL https://install.determinate.systems/nix | sh -s -- install

安装完成后重启终端,验证安装:nix --version。

3.配置 Home Manager: 声明式管理所有 CLI 工具。

创建配置目录并编写 ~/.config/home-manager/home.nix:

Terminal window
1
mkdir -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
unzip
21
btop
22
eza
23
fastfetch
24
gnumake
25
mosh
26
netcat-openbsd
27
socat
28
jq
29
fff
30
yazi
31
lazygit
32
delta
33
ripgrep
34
35
nodejs
36
pnpm
37
yarn
38
jdk17
39
go
40
gcc
41
android-tools
42
typescript-language-server
43
prettier
44
python314
45
uv
46
ruff
47
php83
48
php83Packages.composer
49
];
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 与 Lazygit
59
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 直接启动 nvim
85
vimAlias = true; # 允许输入 vim 直接启动 nvim
86
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 manage
96
# plain files is through 'home.file'.
97
home.file = {
98
# # Building this configuration will create a copy of 'dotfiles/screenrc' in
99
# # the Nix store. Activating the configuration will then make '~/.screenrc' a
100
# # 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=verbose
106
# org.gradle.daemon.idletimeout=3600000
107
# '';
108
};
109
110
# Home Manager can also manage your environment variables through
111
# 'home.sessionVariables'. These will be explicitly sourced when using a
112
# shell provided by Home Manager. If you don't want to manage your shell
113
# through Home Manager then you have to manually source 'hm-session-vars.sh'
114
# located at either
115
#
116
# ~/.nix-profile/etc/profile.d/hm-session-vars.sh
117
#
118
# or
119
#
120
# ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
121
#
122
# or
123
#
124
# /etc/profiles/per-user/[user]/etc/profile.d/hm-session-vars.sh
125
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" ]; then
172
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
173
fi
174
# 可以在这里添加只属于 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
end
201
202
# 将特定路径添加到 Fish 的 PATH 列表中
203
#fish_add_path $HOME/.npm-global/bin $HOME/.local/bin
204
'';
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:

Terminal window
1
nix run home-manager/master -- init
2
nix run home-manager/master -- switch
3
#或
4
#nix run home-manager/master -- switch -b bak

若不能下载安装,记得调整宿主机的代理工具,一般关闭tun模式就行了

4.使用 APT 安装底层容器工具: 配置 Podman 环境。

更新系统的 APT 库并安装 Podman 及相关组件:

1
sudo apt update
2
sudo 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(常驻会话)

Terminal window
1
sudo loginctl enable-linger $USER

在 WSL 中将 Fish 设为默认 Shell

Nix 安装的 Fish 位于 /home/[user]/.nix-profile/bin/fish,在 Debian 中将其设为默认 Shell:

1.将 Nix 路径下的 fish 加入系统安全 shell 列表:

Terminal window
1
echo "$HOME/.nix-profile/bin/fish" | sudo tee -a /etc/shells

2.更改默认 shell:

Terminal window
1
chsh -s $HOME/.nix-profile/bin/fish
2
# 或
3
chsh -s "$(command -v fish)"

3.重新打开 WSL 终端,就会直接进入由 Nix 全权管理的 Fish 环境了。

各类nix外的工具

https://github.com/herdrdev/herdr

Terminal window
1
curl -fsSL https://herdr.dev/install.sh | sh

https://github.com/saladday/cc-switch-cli

Terminal window
1
curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash

https://pi.dev

Terminal window
1
curl -fsSL https://pi.dev/install.sh | sh
2
# OR
3
npm install -g --ignore-scripts @earendil-works/pi-coding-agent

https://omp.sh

Terminal window
1
curl -fsSL https://omp.sh/install | sh

pi设置 ~\.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": true
10
},
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": 10
22
}
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": 10
34
}
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": 10
46
}
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": true
11
},
12
"hideThinkingBlock": false,
13
"packages": [
14
]
15
}

pi插件

Terminal window
1
pi install npm:pi-web-access
2
pi install npm:pi-mcp-adapter
3
pi install npm:pi-subagents
4
pi install npm:pi-lens
5
pi install npm:pi-memory
6
pi install npm:@juicesharp/rpiv-todo
7
pi install npm:bigpowers
8
pi install npm:context-mode
9
pi install npm:pi-powerline-footer
10
pi install npm:@ff-labs/pi-fff
11
pi install npm:pi-background-tasks
12
pi install npm:@vndv/pi-codegraph
13
pi install npm:pi-cache-optimizer
14
pi install npm:@juicesharp/rpiv-ask-user-question
15
pi install npm:pi-zentui
4 collapsed lines
16
pi install npm:pi-calm
17
pi install npm:pi-cc-extensions
18
pi install npm:@narumitw/pi-plan-mode
19
pi install npm:@paulpham157/apply-patch

代理 解决git clone慢的问题

  • ~/.ssh/config:为 Host * 设置默认 ProxyCommand,让 SSH 连接经代理转发。

netcat方式

~/.ssh/config

1
Host *
2
    ProxyCommand nc -X 5 -x 127.0.0.1:7897 %h %p

正常ssh远程需要:

Terminal window
1
ssh -o ProxyCommand=none -o StrictHostKeyChecking=accept-new user@host

设置wsl系统随宿主系统一起启动

要实现 Windows 宿主机开机时 WSL 自动运行并对外提供 SSH 服务,需要配置三个核心环节:WSL 内部 SSH 服务自启、Windows 开机唤醒 WSL 以及 网络连通性(镜像模式与防火墙)。

第一步:配置 WSL 内部 SSH 服务自启

1.打开 WSL 终端,编辑 WSL 配置文件:

Terminal window
1
sudo nano /etc/wsl.conf

2.在文件中添加(或修改)以下内容以启用 systemd 支持:

1
[boot]
2
systemd=true

3.保存并退出(Ctrl + O,回车,Ctrl + X),随后设置 SSH 随 systemd 自启:

Terminal window
1
sudo systemctl enable ssh

第二步:配置 Windows 任务计划程序(宿主开机启动 WSL)

使用 Windows “任务计划程序”可以在系统启动(哪怕尚未登录 Windows 桌面)时自动拉起 WSL:

  1. 按 Win + R 键,输入 taskschd.msc 并回车。
  2. 在右侧操作栏点击 “创建任务”(不要选“创建基本任务”):
  • 常规选项卡:

    • 名称:AutoStartWSL
    • 勾选 “不管用户是否登录都要运行”
    • 勾选 “使用最高权限运行”
  • 触发器选项卡:

    • 点击“新建” -> 开始任务选择 “启动时”(如果希望登录桌面后再启动,可选“在登录时”)。
  • 操作选项卡:

    • 点击“新建” -> 操作选择“启动程序”。
    • 程序或脚本:wsl.exe
    • 添加参数:-d <你的分发版名称> --exec true(例如 -d Ubuntu --exec true;若不确定名称,可在 PowerShell 中运行 wsl -l 查看)。
  • 条件选项卡:

    • 取消勾选 “只有在计算机使用交流电源时才启动此任务”(防止笔记本拔掉电源后失效)。

3.点击“确定”保存,系统会提示输入 Windows 当前管理员账号的密码。

第三步:配置网络与防火墙(确保外部可访问)

WSL 2 默认的 NAT 模式会导致每次重启后 WSL 虚拟 IP 发生变化。最稳妥简便的方式是开启 镜像网络模式(Mirrored Networking),让 WSL 直接共享宿主机的 IP 地址与端口。

  1. 在 Windows 用户根目录(如 C:\Users\你的用户名\)下创建或编辑 .wslconfig 文件。
  2. 添加以下配置:
1
[wsl2]
2
networkingMode=mirrored

3.放行 Windows 防火墙端口:

以管理员身份打开 Windows PowerShell,运行以下命令开通 22 端口入站规则:

1
New-NetFirewallRule -Name "WSL_SSH_22" -DisplayName "WSL SSH Inbound" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22

验证生效

  1. 在 PowerShell 中运行 wsl --shutdown 完全关闭当前 WSL。
  2. 重启 Windows 宿主机。
  3. 在局域网内的其他设备上,直接尝试通过 SSH 连接宿主机的 IP 即可:
Terminal window
1
ssh <WSL用户名>@<Windows宿主机IP>

安卓USB调试

USB 直连到 WSL2

需要在 Windows 侧安装并使用 usbipd-win,把手机的 USB 设备附加给 WSL: https://usbipd-win.en.softonic.com/download

  1. 手机开启“开发者选项”和“USB 调试”。
  2. Windows 安装 usbipd-win。
  3. 在 PowerShell 查看 USB 设备:
Terminal window
1
usbipd list
  1. 绑定设备:
Terminal window
1
usbipd bind --busid <BUSID>
  1. 附加到 Debian:
Terminal window
1
usbipd attach --wsl --busid <BUSID>
  1. 在 Debian 中确认:

lsusb 需单独安装

Terminal window
1
sudo apt install usbutils
Terminal window
1
lsusb
2
adb devices

adb devices 弹出 no permissions (missing udev rules...等信息的话

Terminal window
1
sudo apt install android-sdk-platform-tools-common

然后重新连接设备并重启 ADB:

Terminal window
1
adb kill-server
2
adb start-server
3
adb devices

如果仍然没有权限,在 Debian 中添加规则: 2d95 是对应设备id

Terminal window
1
sudo tee /etc/udev/rules.d/51-android.rules >/dev/null <<'EOF'
2
SUBSYSTEM=="usb", ATTR{idVendor}=="2d95", MODE="0660", GROUP="plugdev"
3
EOF
4
5
sudo chmod 644 /etc/udev/rules.d/51-android.rules
6
sudo udevadm control --reload-rules
7
sudo udevadm trigger

重新执行

Terminal window
1
adb kill-server
2
adb start-server
3
adb devices

不弹出允许USB调试的提示 始终是authorizing状态 检查USB线是否有数据传输能力(可能是纯充电线) 换根线

手机第一次连接时会弹出“允许 USB 调试”的授权提示,需要确认。

如果 Debian 中没有 adb,需要安装 Android platform-tools。优先使用已有 Android SDK 中的:

Terminal window
1
$ANDROID_HOME/platform-tools/adb devices

或者:

Terminal window
1
$ANDROID_SDK_ROOT/platform-tools/adb devices

adb devices 正常时应看到类似:

1
R58M1234567 device

如果显示:

1
unauthorized

说明手机还没有确认调试授权。

本文标题:Debian+Nix配置
文章作者:夜火/xloong
发布时间:2026-09-28
Copyright 2026
站点地图