2025-04-30 10:18:19 +08:00
2025-04-29 20:15:06 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00
2025-04-30 10:18:19 +08:00
2025-04-26 19:35:04 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00
2025-04-25 23:10:55 +08:00

NixOS 和 Home Manager 配置

这是一个基于 Nix Flakes 的 NixOS 和 Home Manager 配置仓库,支持多台机器的配置管理。当前系统版本基于 NixOS 24.11。

目录结构

├── home                  # home manager 配置信息
│  ├── core.nix           # 核心的通用配置,由其他配置引入
│  ├── desktop.nix        # 桌面环境配置
│  └── server.nix         # 服务器配置
├── libs                  # 自定义库函数
│  ├── default.nix        # 导出所有库函数
│  └── mkNixosSystem.nix  # 创建nixosSystem的通用函数
├── modules               # 通用模块,不同机器可以根据的需要引入
│  ├── home               # home manager 通用模块
│  │  └── -               # home manager 通用模块
│  └── nixos              # nixos 通用模块
│     └── -               # nixos 通用模块
├── overlays              # 安装包的修改配置
│  └── -                  # 安装包的修改配置
├── pkgs                  # 自定义软件包
│  └── -
├── profiles              # 不同机器的配置文件, 放置只有特定主机可以使用的配置
│  ├── apollo             # 主服务器配置
│  │  ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等
│  │  └── default.nix     # 入口文件负责创建nixosSystem并选择使用的nixpkgs版本
│  ├── gaea               # 主用机配置
│  │  ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等
│  │  └── default.nix     # 入口文件负责创建nixosSystem并选择使用的nixpkgs版本
│  └── luna               # 虚拟机配置
│     ├── configuration.nix # 主要配置文件,包含系统模块、服务、用户设置等
│     └── default.nix     # 入口文件负责创建nixosSystem并选择使用的nixpkgs版本
├── flake.lock            # flake 锁定文件
├── flake.nix             # nix flake 入口
├── nixos-install.sh      # nixos 全新安装脚本
├── nixos-switch.sh       # 日常更新系统脚本
├── non-nixos-install.sh  # 非NixOS系统安装home-manager配置脚本
└── nixpkgs.nix           # 从flake.lock中提取nixpkgs版本信息用于非flake命令

如何安装?

  1. 准备一个 64 位的 nixos minimal iso image 烧录好,然后进入 live 系统。
  2. 分区

使用 fdisk 或 parted 工具进行分区。现在假设两个分区为:/dev/sda1 /dev/sda2

# 使用parted分区
parted /dev/nvme0n1 mklabel gpt
parted /dev/nvme0n1 mkpart primary fat32 1MiB 1024MiB
parted /dev/nvme0n1 mkpart primary btrfs 1024MiB 95%
  1. 格式化分区
  mkfs.fat -F 32 /dev/nvme0n1p1                 # boot / EFI 分区
  mkfs.btrfs /dev/nvme0n1p2                     # 系统分区
  1. 挂载
  mount /dev/nvme0n1p2 /mnt
  btrfs subvolume create /mnt/home   # home 分区
  btrfs subvolume create /mnt/nix    # nix 分区
  btrfs subvolume create /mnt/swap   # swap 分区

  umount /mnt
  mount -o compress=zstd /dev/nvme0n1p2 /mnt
  mkdir -p /mnt/{boot,nix,home,swap}
  mount /dev/nvme0n1p1 /mnt/boot
  mount -o compress=zstd,noatime,subvol=nix /dev/nvme0n1p2 /mnt/nix
  mount -o compress=noatime,subvol=swap /dev/nvme0n1p2 /mnt/swap
  mount -o compress=zstd,subvol=home /dev/nvme0n1p2 /mnt/home

  btrfs filesystem mkswapfile --size 16g --uuid clear /mnt/swap/swapfile

3.1 不变系统

如果希望使用不变原子系统(即系统更新时不会修改当前运行的系统,而是创建新的系统生成),在 profile 中引入 modules/nixos/sysatomic.nix 模块。这种情况下的挂载方式更简单:

  mkdir -p /mnt/{boot,nix}
  mount /dev/nvme0n1p2 /mnt/nix
  mount /dev/nvme0n1p1 /mnt/boot
  1. 生成一个基本的配置
  nixos-generate-config --root /mnt
  1. 克隆仓库到本地
git clone  https://github.com/synebula/.nix.git /mnt/nix/.nix
cd /mnt/nix/.nix
  1. 将 /mnt/etc/nixos 中的 hardware-configuration.nix 拷贝到 /mnt/.nix/profiles/<profile>/hardware-configuration.nix 其中<profile>指需要的 profile。
cp /mnt/etc/nixos/hardware-configuration.nix /mnt/.nix/profiles/<profile>/hardware-configuration.nix
  1. 用户名修改: 编辑 /mnt/.nix/flake.nix 修改 usernameuseremailsysversion(系统版本)变量。

  2. 使用 mkpasswd {PASSWORD} -m sha-512 命令生成的密码哈希串替换掉 /mnt/.nix/modules/nixos/user-group.nix 中的 users.users.<name>.hashedPassword 值替换掉。

  3. 安装

./nixos-install.sh <profile>

# 或者

nixos-install --option substituters "https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org" --no-root-passwd --flake .#<profile>

  1. 重启
reboot

日常使用

NixOS 系统更新

在完成对配置文件的修改后,使用以下命令更新系统:

# 执行 bash alias
nixos-switch

# 或执行本机脚本
./nixos-switch.sh

非 NixOS 系统安装 home-manager 配置

在非 NixOS 系统上(如 Ubuntu、Arch Linux 等),可以使用以下命令安装 home-manager 配置:

./non-nixos-install.sh

自定义配置

要添加新的机器配置,可以在profiles目录下创建新的目录,并根据现有的配置文件进行修改。

要添加新的模块,可以在modules目录下创建新的模块文件,并在相应的配置文件中引入。

profiles 目录和 nixosSystem 创建

在这个配置中,我们使用了一个抽象的方法来创建 nixosSystem同时保留了每个 profile 自行决定使用哪个版本的 nixpkgs 的能力,并简化了参数传递:

  1. libs/mkNixosSystem.nix - 这个文件提供了一个通用函数,用于创建 nixosSystem。它接受以下参数

    • args: 从 flake.nix 传递的所有参数,包含 self、inputs、outputs、username 等
    • nixpkgs: 要使用的 nixpkgs (由 profile 的 default.nix 决定)
    • path: profile 目录的路径
  2. profiles/[hostname]/default.nix - 这是配置的入口文件,负责选择使用的 nixpkgs 版本并调用 libs.mkNixosSystem 函数。

  3. profiles/[hostname]/configuration.nix - 包含实际的配置内容,如系统模块、服务、用户设置等。

Description
No description provided
Readme 1,020 KiB
Languages
Shell 58.5%
Nix 39.8%
CSS 1.5%
Python 0.2%