NixOS 入门指南:从新手到高手的渐进式之路(第二版)

NixOS 入门建议:一天上手,从入门到精通

NixOS 的强大和方便毋庸置疑,但很多新人“止步于入门”并非因为nixos真的难,而是路径走错了。本文旨在为你提供一条不折腾、快速入门的渐进式路线。


一、 准备阶段:你是否适合 NixOS?

在开始之前,请确保你满足以下条件:

  1. Linux 基础:熟悉日常 Linux 操作,有修改 dotfiles 的经验,能解决常见的系统问题。
  2. 编程思维:不要求是经验程序员,但至少能看懂简单的代码逻辑(Nix 语言本质上是函数式配置语言)。
  3. 网络环境至关重要! 必须有稳定的“科研上网”手段(建议在路由器层级实现,或准备好全局代理)。

二、 安装:选择最简单的路径

不要挑战高难度安装!

  • 推荐方式:下载 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"
      ];
    };
  };

}

五、 社区与求助

  1. GitHub 搜索:搜索 filename:configuration.nix + 关键词 是最好的抄作业方式。
  2. Telegram 中文群:NixOS 中文社区非常友好,遇到问题请礼貌描述 ,通常会有大神解答。
  3. 官方维基NixOS Wiki 是最权威的参考资料。
  4. 使用靠谱的AI:Gemini3目前(2025-12)对nix支持还是不错的,小问题可以找他处理。但是别期望它能解决所有的问题,更不要把希望放到那些遥遥领先的AI大模型上。

总结

渐进式入门,抄作业不要搬作业。 先保证系统能用(Docker + Flatpak + 基本配置),再追求纯净(全 Nix 管理),最后再挑战高级技巧(自定义 Overlay、打包)。祝你在 NixOS 的世界里玩得愉快!

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计