GitHub ↗

这次做了什么

这次做了什么

原来的状态

仓库原本只有 NixOS 输出:

nixosConfigurations = {
  aarch64 = ...;
  hx90 = ...;
  wsl = ...;
};

当前 Mac 没有 Nix,也没有 Darwin 配置。Homebrew 是实际的软件安装来源, chezmoi 和 dotfiles 负责跨平台用户配置;macOS 专属用户配置属于本仓库的 Darwin Home Manager 层。

现在的状态

在同一个 flake 中新增:

darwinConfigurations.macbook-m1-max =
  inputs.nix-darwin.lib.darwinSystem {
    system = "aarch64-darwin";
    modules = [ ./hosts/macbook-m1-max/configuration.nix ];
  };

因此现在有 NixOS 和 Darwin 两类输出:

nixosConfigurations.aarch64
nixosConfigurations.hx90
nixosConfigurations.wsl
darwinConfigurations.macbook-m1-max

新增和修改的文件

  • flake.nix:增加 nix-darwin 输入和 Darwin 输出;
  • flake.lock:锁定 nix-darwin 26.05 的具体提交;
  • hosts/macbook-m1-max/configuration.nix:声明 Apple Silicon 主机;
  • modules/darwin/base.nix:Nix、Zsh、基础 CLI 和环境变量;
  • modules/darwin/packages.nix:开发和诊断工具;
  • modules/darwin/homebrew.nix:GUI cask 和特殊 Homebrew formula;
  • modules/darwin/defaults.nix:暂时为空的 macOS defaults 安全边界;
  • modules/home-manager/darwin-user.nix:Darwin 版最小 Home Manager 配置;
  • modules/home-manager/darwin-files/:AeroSpace、Karabiner、Hammerspoon、skhd 和 macOS 手动维护脚本等 macOS 专属用户文件;
  • docs/macos-nix-darwin.md:总览操作手册;
  • docs/macos-nix-darwin/:本学习目录。

主机配置的职责

主机入口负责:

  • 平台为 aarch64-darwin;
  • 主机名为 macbook-m1-max;
  • 主要用户为 tetsuya;
  • system.primaryUser = "tetsuya",让 Homebrew 知道用户上下文;
  • 启用 Darwin Home Manager;
  • system.stateVersion = 6。

这里没有 NixOS 的 hardware-configuration.nix,因为 macOS 的硬件、APFS 和 Recovery 不由 nix-darwin 接管。

激活过程中遇到的问题

sudo: nix: command not found

普通用户 shell 能通过 Nix profile 找到 nix,但 sudo 使用 root 的精简 PATH。 所以首次激活使用绝对路径:

sudo /nix/var/nix/profiles/default/bin/nix ...

/etc/bashrc 和 /etc/zshrc 冲突

Nix 安装器先修改了这两个文件,nix-darwin 的安全检查发现它们有未声明内容,因而 停止激活。安装器同时创建了:

/etc/bashrc.backup-before-nix
/etc/zshrc.backup-before-nix

恢复这两个备份后重新激活,nix-darwin 才正式接管 shell 初始化文件。以后不要手动 编辑 /etc/bashrc 或 /etc/zshrc,应该修改 flake 后重新 build/switch。

nix-darwin 26.05 的兼容要求

旧式的:

services.nix-daemon.enable = true;

在当前 nix-darwin 中已经没有效果,配置中已移除。Nix daemon 会随 Nix 自动管理。 Homebrew 则需要显式声明:

system.primaryUser = "tetsuya";

当前明确没有迁移的内容

  • NixOS 的 systemd、Hyprland、SDDM、PipeWire、Fcitx5 Wayland、keyd;
  • Linux 硬件、Btrfs、zram、休眠和 AMD GPU 调优;
  • Hammerspoon/Karabiner 的 Accessibility/Input Monitoring 授权;
  • 浏览器 profile、Token、Bitwarden session、.env;
  • Rime 私有数据、Voxtype 模型和 Agent 配置;
  • Finder、Dock、Mission Control 等未经确认的 macOS defaults。

这样先建立可靠的系统层,再逐项迁移用户层,避免一次切换影响整个工作环境。