NixOS 入门建议:一天上手,从入门到精通
NixOS 的强大和方便毋庸置疑,但很多新人“止步于入门”并非因为nixos真的难,而是路径走错了。本文旨在为你提供一条不折腾、快速入门的渐进式路线。
一、 准备阶段:你是否适合 NixOS?
在开始之前,请确保你满足以下条件:
- Linux 基础:熟悉日常 Linux 操作,有修改
dotfiles 的经验,能解决常见的系统问题。 - 编程思维:不要求是经验程序员,但至少能看懂简单的代码逻辑(Nix 语言本质上是函数式配置语言)。
- 网络环境:至关重要! 必须有稳定的“科研上网”手段(建议在路由器层级实现,或准备好全局代理)。
二、 安装:选择最简单的路径
不要挑战高难度安装!
- 推荐方式:下载 NixOS GNOME Live ISO。它提供了图形化安装界面),就像安装 Ubuntu 一样简单。
- 网络代理:如果安装过程下载缓慢,可以在同局域网手机上开启代理工具,并在安装环境中配置代理。
- 进阶方式:如果你有 Arch Linux 手动安装经验,可以参考 官方安装指南。
三、 核心心法:渐进式迁移(拒绝一口吃胖)
这是新手最容易犯的错误:第一天就想搞定全系统的 Flake + Home Manager 托管,或者直接 Clone 别人的复杂仓库。
阶段 1:先跑起来(纯 configuration.nix)
- 只修改
/etc/nixos/configuration.nix。 - 使用
environment.systemPackages 安装软件。 - 临时用软件:学会使用
nix-shell -p pkg_name,随用随装,不用不占空间。
阶段 2:接受“过度方案”(Docker & Flatpak)
- 不要在初期强求所有东西都 Nix 化。
- 服务类:搞不定的一些服务类的例如nginx/数据库/语言运行开发环境,暂时直接用 Docker。
- GUI 软件:Nixpkgs 里没有或有问题的,先用 Flatpak。
- AppImage:看你要用的软件有没有Appimage格式,先对付一下。
阶段 3:引入 Flake 与 Home Manager
- 当你熟悉了 Nix 语法后,再将配置重构为 Flake 结构。
- 使用 Home Manager 管理用户层面的应用的配置项。
四 : 实战配置范例库
以下代码片段涵盖了从系统基础到开发环境的方方面面,按需查阅,不要全盘照抄。
1. 基础Flake 结构 (flake.nix)
这是系统的总入口,建议放在 ~/nixos-config 目录下。
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
| {
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11";
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = inputs@{ nixpkgs, home-manager, ... }: {
nixosConfigurations.my-pc = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix #你原来的 /etc/nixos/configuration.nix
{
nixpkgs.overlays = [
(final: prev: {
stable = import inputs.nixpkgs-stable {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
unstable = import inputs.nixpkgs {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
master = import inputs.nixpkgs-master {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
})
];
}
home-manager.nixosModules.home-manager
];
specialArgs = { inherit inputs; };
};
};
}
|
一个典型的 nixos-config 文件结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| .
├── flake.nix # 系统总入口,定义 inputs 和 outputs
├── flake.lock # 锁定依赖版本 在 nix flake update的时候自动创建
├── machine/ # 硬件与设备特定配置
│ ├── hardware-configuration_thinbook_14p_amd.nix #你原来的 /etc/nixos/hardware-configuration.nix 微调 thinbook_14p_amd是电脑名
│ ├── configuration_thinbook_14p_amd.nix # 你原来的 /etc/nixos/configuration.nix 微调 并作为 import其他文件的入口
│ ├── ....
│ └── subFileList.nix # 核心调度文件,根据主机名加载不同模块 也可以不需要这个文件 集成到configuration_XXX.nix
├── modules/ # 按功能划分的模块化配置
│ ├── application/ # 日常应用 (浏览器、聊天工具、常用工具)
│ ├── desktopEnv/ # 桌面环境 (GNOME, Cosmic、Wayfire、Hyprland、KDE等)
│ ├── ide-editor/ # 编程工具 (VSCode, Zed, Helix、ClaudeCode、GeminiCli 等)
│ ├── lang-sdk-lsp/ # 编程语言 SDK 与 LSP 服务
│ └── service/ # 系统服务 (Docker, SSH, 数据库, 打印等)
├── system-setting/ # 全局系统级别设置
│ ├── bootload.nix # 引导程序配置 (GRUB/Systemd-boot)
│ ├── font-i8n.nix # 字体与国际化
│ ├── networking.nix # 网络与防火墙
│ └── theme.nix # 系统主题与美化
├── script/ # 自动化脚本 (系统更新、备份、清理)
├── security/ # 敏感信息管理 (私钥、代理配置、密码) 可把部分nix文件放这里 比如一些敏感的环境变量 别名等
└── static_file/ # 静态资源 (壁纸、自定义图标、专用字体)
|
2. 现代 Linux 必备:Docker 与 Flatpak 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
| { pkgs, ... }: {
# 开启 Docker
virtualisation.docker.enable = true;
# 开启 Flatpak
services.flatpak.enable = true;
# 支持 AppImage
programs.appimage = {
enable = true;
binfmt = true;
};
environment.systemPackages = with pkgs; [ docker-compose ];
}
|
3. 字体与国际化 (中文环境)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| { pkgs, ... }: {
#i18n.defaultLocale = "zh_CN.UTF-8";
i18n.defaultLocale = "en_US.UTF-8";
fonts = {
packages = with pkgs; [
source-han-sans # 思源黑体
source-han-serif # 思源宋体
lxgw-wenkai # 霞鹜文楷
noto-fonts-emoji
(nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
];
fontconfig.defaultFonts = {
emoji = [ "Noto Color Emoji" ];
monospace = [ "JetBrainsMono Nerd Font" ];
sansSerif = [ "Source Han Sans SC" ];
serif = [ "Source Han Serif SC" ];
};
};
}
|
4. 输入法 (Fcitx5 + 雾凇拼音)
这个看不懂也没关系,照抄就行了。
4.1 主配置 (fcitx5-rime.nix)
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
| { pkgs, username, ... }:
let
rime-ice = pkgs.stdenvNoCC.mkDerivation {
pname = "rime-ice";
version = "2024.12.12";
src = pkgs.fetchFromGitHub {
owner = "iDvel";
repo = "rime-ice";
rev = "2024.12.12";
hash = "sha256-2QZdlLGZwWIesbjYTE/2yhM1hHGVVp7jR02bR0oqxV0=";
};
installPhase = ''
mkdir -p $out/share/rime-data
rm -rf ./others
rm -f README.md LICENSE
rm -rf ./.github
rm squirrel.yaml weasel.yaml
rm default.yaml custom_phrase.txt
cp -r ./* $out/share/rime-data
'';
};
in
{
home-manager.users.${username} = {
xdg.configFile = {
"fcitx5/conf/chttrans.conf" = {
force = true;
text = ''
[Global]
Engine=OpenCC
OpenCCS2TProfile=default
OpenCCT2SProfile=default
[Hotkey]
0=ControlL+Shift+Alt+L
'';
};
};
home.file = {
".local/share/fcitx5/rime" = {
source = "${rime-ice}/share/rime-data";
recursive = true;
onChange = ''
mkdir -p ~/.local/share/fcitx5/rime
chmod -R u+w ~/.local/share/fcitx5/rime
rm -f ~/.local/share/fcitx5/rime/*.bin
rm -f ~/.local/share/fcitx5/rime/build/*
'';
};
".local/share/fcitx5/rime/default.yaml" = {
source = ./rime/default.yaml;
force = true;
};
".local/share/fcitx5/rime/custom_phrase.txt" = {
force = true;
source = ../../../security/file/fcitx5_rime_custom_phrase.txt;
};
};
};
i18n = {
inputMethod = {
type = "fcitx5";
enable = true;
fcitx5 = {
waylandFrontend = true;
addons = with pkgs; [
qt6Packages.fcitx5-configtool
fcitx5-gtk
libsForQt5.fcitx5-qt
kdePackages.fcitx5-qt
fcitx5-lua
fcitx5-fluent
libime
librime-lua
fcitx5-rime
rime-ice
];
settings = {
addons = {
classicui.globalSection = {
Theme = "FluentLight-solid";
DarkTheme = "FluentLight-solid";
};
};
inputMethod = {
"Groups/0" = {
Name = "Default";
"Default Layout" = "us";
DefaultIM = "rime";
};
"Groups/0/Items/0" = {
Name = "rime";
};
GroupOrder = {
"0" = "Default";
};
};
};
};
};
};
}
|
4.2 环境变量配置 (fcitx5-sessionVariables.nix)
1
2
3
4
5
6
7
8
9
10
11
12
| { username, ... }: {
home-manager.users.${username} = {
home.sessionVariables = {
XMODIFIERS = "@im=fcitx";
QT_IM_MODULE = "fcitx";
QT_IM_MODULES = "fcitx;ibus;wayland";
GTK_IM_MODULE = "fcitx";
SDL_IM_MODULE = "fcitx";
GLFW_IM_MODULE = "fcitx";
};
};
}
|
5. 开发环境示例 (分语言配置)
建议将不同语言的配置拆分为独立文件(如 rust.nix, go.nix),在主配置中按需引入。
5.1 通用 C/C++ 与图形开发基础 (lang-common.nix)
包含 C/C++ 编译链、一些通用的开发工具、及 GUI 开发(如 Flutter/Fyne)所需的底层库。
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
| { pkgs, username, ... }: {
home-manager.users.${username} = {
home.packages = with pkgs; [
gcc
gdb
gnumake
cmake
ninja
pkg-config
openssl
openssl.dev
mesa
libglvnd.dev
xorg.libX11.dev
xorg.libXext.dev
xorg.libXi.dev
xorg.libXrandr.dev
xorg.libXrender.dev
xorg.libXcursor
xorg.libXinerama
libxkbcommon
wayland
gtk3
];
home.sessionVariables = {
PKG_CONFIG_PATH = "${pkgs.openssl.dev}/lib/pkgconfig:${pkgs.libglvnd.dev}/lib/pkgconfig:${pkgs.mesa}/lib/pkgconfig:${pkgs.xorg.libX11.dev}/lib/pkgconfig:${pkgs.xorg.libXrandr.dev}/lib/pkgconfig:${pkgs.xorg.libXrender.dev}/lib/pkgconfig:${pkgs.xorg.libXcursor.dev}/lib/pkgconfig:${pkgs.xorg.libXinerama.dev}/lib/pkgconfig:${pkgs.xorg.libXi.dev}/lib/pkgconfig:${pkgs.xorg.libXext.dev}/lib/pkgconfig:${pkgs.xorg.libXfixes.dev}/lib/pkgconfig:${pkgs.xorg.xorgproto}/lib/pkgconfig";
CGO_CFLAGS = "-I${pkgs.xorg.xorgproto}/include -I${pkgs.xorg.libX11.dev}/include -I${pkgs.xorg.libXrandr.dev}/include -I${pkgs.xorg.libXrender.dev}/include -I${pkgs.xorg.libXcursor.dev}/include -I${pkgs.xorg.libXinerama.dev}/include -I${pkgs.xorg.libXi.dev}/include -I${pkgs.xorg.libXext.dev}/include -I${pkgs.xorg.libXfixes.dev}/include -I${pkgs.libglvnd.dev}/include";
CGO_LDFLAGS = "-L${pkgs.libglvnd.dev}/lib -L${pkgs.xorg.libX11}/lib -L${pkgs.xorg.libXrandr}/lib -L${pkgs.xorg.libXxf86vm}/lib -L${pkgs.xorg.libXi}/lib -L${pkgs.xorg.libXcursor}/lib -L${pkgs.xorg.libXinerama}/lib";
};
};
}
|
5.2 Rust 环境 (rust.nix)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| { pkgs, username, ... }: {
home-manager.users.${username} = {
home.packages = with pkgs; [
rustup
rustc
];
home.sessionVariables = {
RUSTUP_HOME = "$HOME/.rustup";
CARGO_HOME = "$HOME/.cargo";
RUSTUP_DIST_SERVER = "https://rsproxy.cn";
RUSTUP_UPDATE_ROOT = "https://rsproxy.cn/rustup";
};
};
}
|
5.3 Go 环境 (golang.nix)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| { pkgs, username, ... }: {
home-manager.users.${username} = {
home.packages = with pkgs; [
go
gopls
golangci-lint
fyne # 依赖 lang-common.nix 内的和图形相关的依赖和环境变量
gofumpt
];
home.sessionVariables = {
GOPROXY = "https://goproxy.cn,direct";
};
home.sessionPath = [ "/home/${username}/go/bin" ]; # 其实最好一个单独的nix文件统一管理 Path
};
}
|
5.4 Node.js / Bun / Deno (node.nix)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| { pkgs, username, ... }: {
home-manager.users.${username} = {
home.packages = with pkgs; [
nodejs_22
pnpm
bun
deno
];
home.sessionVariables = {
PNPM_HOME = "/home/${username}/.local/share/pnpm";
};
home.file.".npmrc".text = ''
registry=https://registry.npmmirror.com/
global-bin-dir=/home/${username}/.local/share/pnpm/bin
store-dir=/home/${username}/.pnpm-store
'';
};
}
|
5.5 Python 与 Zig
1
2
3
4
5
6
7
8
9
10
| { pkgs, username, ... }: {
home-manager.users.${username} = {
home.packages = with pkgs; [
uv
(python313.withPackages (ps: with ps; [ pip requests tkinter django ]))
unstable.zig
unstable.zls
];
};
}
|
5.6 统一管理环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| { username, ... }: {
home-manager = {
users.${username} = {
home.sessionPath = [
"$HOME/.cargo/bin"
"$HOME/go/bin"
"$HOME/myworkspace/my-opt"
"$HOME/.local/share/pnpm/bin"
"$HOME/android_flutter/android-sdk/cmdline-tools/latest/bin"
"$HOME/android_flutter/android-sdk/platform-tools"
];
};
};
}
|
五、 社区与求助
- GitHub 搜索:搜索
filename:configuration.nix + 关键词 是最好的抄作业方式。 - Telegram 中文群:NixOS 中文社区非常友好,遇到问题请礼貌描述 ,通常会有大神解答。
- 官方维基:NixOS Wiki 是最权威的参考资料。
- 使用靠谱的AI:Gemini3目前(2025-12)对nix支持还是不错的,小问题可以找他处理。但是别期望它能解决所有的问题,更不要把希望放到那些遥遥领先的AI大模型上。
总结
渐进式入门,抄作业不要搬作业。
先保证系统能用(Docker + Flatpak + 基本配置),再追求纯净(全 Nix 管理),最后再挑战高级技巧(自定义 Overlay、打包)。祝你在 NixOS 的世界里玩得愉快!