macOS + NixOS 通用 Nix 配置
概述
嘿,你来了!欢迎。🤓
Nix 是一个强大的 Linux 和 Unix 系统包管理器,确保可重现、声明式和可靠的软件管理。
这个仓库包含了一个通用开发环境的配置,可以在 macOS、NixOS 上运行 Nix,或同时在两者上运行。
我每天都在我的 🧑🏻💻 Macbook Pro 和家庭办公室的 x86 PC 上使用它。它也可以作为虚拟机在 Mac 上运行。许多其他人也报告说它对他们来说也能正常工作。
查看下面的逐步命令开始使用吧!
目录
布局
.
├── apps # 用于引导和构建配置的 Nix 命令
├── hosts # 特定主机的配置
├── modules # macOS 和 nix-darwin、NixOS 以及共享配置
├── overlays # 在此目录中放置覆盖文件,它就会运行。到目前为止,主要是补丁。
├── templates # 此配置的初始版本
特性
- Nix Flakes: 100%基于flake驱动,无需
configuration.nix
,无Nix通道─ 仅需flake.nix
- 处处相同的环境: 轻松在Linux和macOS之间共享配置(包括Nix和Home Manager)
- macOS梦想配置: 完全声明式的macOS(Apple / Intel)配置,包括UI、dock和macOS App Store应用
- 简单引导: 简单的Nix命令即可从零开始,适用于x86和macOS平台
- 管理Homebrew: 通过
nix-darwin
和nix-homebrew
实现零维护的homebrew环境 - 磁盘管理: 使用
disko
进行声明式磁盘管理,告别磁盘工具 - 密钥管理: 使用
agenix
进行声明式密钥管理,适用于SSH、PGP、syncthing等工具 - 超快速Emacs: 前沿Emacs,可自我修复,感谢社区overlay
- 内置Home Manager:
home-manager
模块实现无缝配置(无需额外繁琐的CLI步骤) - NixOS环境: 广泛配置的NixOS,包括清爽美观的界面和窗口动画
- Nix Overlays: 自动加载Nix overlays: 在指定目录放置文件即可运行(非常适合补丁!)
- 声明式同步: 无忧Syncthing:跨平台管理密钥、证书和配置
- Emacs文学化配置: 大型Emacs文学化配置供探索(如果你喜欢的话)
- 简洁易读: 在所有情况下优化简洁性和可读性,而非到处都是小文件
- 持续集成支持: 如果更改不破坏初始构建,Flake每周自动更新
免责声明
在macOS上安装Nix将创建一个完全独立的卷。它可能会占用多个GB的空间。
有些人可能不喜欢这一点。如果你是这样,现在就请停止!
[!注意] 不用担心,你随时可以卸载 Nix。
视频
macOS
一键更新依赖
https://github.com/dustinlyons/nixos-config/assets/1292576/2168d482-6eea-4b51-adc1-2ef1291b6598
得益于守护进程模式,瞬间启动Emacs 29
- 图形界面
https://github.com/dustinlyons/nixos-config/assets/1292576/66001066-2bbf-4492-bc9e-60ea1abeb987
- 终端
https://github.com/dustinlyons/nixos-config/assets/1292576/d96f59ce-f540-4f14-bc61-6126a74f9f52
NixOS
https://github.com/dustinlyons/nixos-config/assets/1292576/fa54a87f-5971-41ee-98ce-09be048018b8
安装
macOS(2024年8月)
此配置支持Intel和Apple Silicon Mac。
1. 安装依赖
xcode-select --install
2. 安装Nix
感谢Determinate Systems提供的安装程序!
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
安装后,打开一个新的终端会话,使nix
可执行文件在你的$PATH
中可用。在接下来的步骤中你会需要它。
[!重要]
如果使用官方安装说明,
flakes
和nix-command
默认不可用。你需要启用它们。
在你的
/etc/nix/nix.conf
文件中添加这一行experimental-features = nix-command flakes
或者
在使用
nix run
时指定实验性功能nix --extra-experimental-features 'nix-command flakes' run .#<命令>
3. 初始化启动模板
选择以下两个选项之一
不包含密钥管理的简化版本
- 非常适合初学者,使你能够快速入门并测试Nix。
- 放弃密钥管理意味着你必须自己配置依赖于密钥、密码等的应用程序。
- 你随时可以在以后添加密钥管理。
mkdir -p nixos-config && cd nixos-config && nix flake --extra-experimental-features 'nix-command flakes' init -t github:dustinlyons/nixos-config#starter
包含密钥管理的完整版本
- 选择这个可以添加更多组件,实现100%声明式配置。
- 此模板为你提供了一个存储密码、私钥等的位置,作为配置的一部分。
mkdir -p nixos-config && cd nixos-config && nix flake --extra-experimental-features 'nix-command flakes' init -t github:dustinlyons/nixos-config#starter-with-secrets
4. 使apps可执行
find apps/$(uname -m | sed 's/arm64/aarch64/')-darwin -type f \( -name apply -o -name build -o -name build-switch -o -name create-keys -o -name copy-keys -o -name check-keys \) -exec chmod +x {} \;
5. 应用你当前的用户信息
运行以下Nix命令,用你的系统属性、用户名、全名和电子邮件替换占位值。
你的电子邮件仅用于
git
配置。
nix run .#apply
[!注意] 如果你正在使用git仓库,只有工作树中的文件会被复制到Nix存储。
你必须先运行
git add .
。
6. 决定要安装的软件包
你可以在NixOS官方网站上搜索软件包。
审查这些文件
7. 审查你的shell配置
添加任何来自你现有~/.zshrc
的内容,或者只审查新的配置。
审查这些文件
8. 可选:设置密钥
如果你在使用带有密钥的启动器,还有一些额外的步骤。
8a. 创建一个私有Github仓库来存放你的密钥
在Github上,创建一个私有的nix-secrets
仓库,至少包含一个文件(如README
)。你将在安装过程中输入这个名称。
8b. 安装密钥
在生成你的第一个构建之前,这些密钥必须存在于你的~/.ssh
目录中。别担心,我提供了一些命令来帮助你。
密钥名称 | 平台 | 描述 |
---|---|---|
id_ed25519 | macOS / NixOS | 从Github下载密钥。仅在引导过程中使用。 |
id_ed25519_agenix | macOS / NixOS | 复制过来,用于加密和解密密钥。 |
运行以下命令之一:
从USB驱动器复制密钥
这个命令自动检测连接到当前系统的USB驱动器。
密钥必须命名为
id_ed25519
和id_ed25519_agenix
。
nix run .#copy-keys
创建新密钥
nix run .#create-keys
[!注意] 如果你选择这个选项,请确保将
id_ed25519.pub
的值保存到Github。cat /Users/$USER/.ssh/id_ed25519.pub | pbcopy # 复制密钥到剪贴板
检查现有密钥
如果你自己处理,只需检查它们是否正确安装。
nix run .#check-keys
9. 安装配置
在部署配置之前,确保构建正常工作,运行:
nix run .#build
[!注意] 如果你正在使用git仓库,只有工作树中的文件会被复制到Nix存储。
你必须先运行
git add .
。
[!警告] 如果
nix-darwin
检测到它将覆盖现有的/etc/
文件,你可能会遇到error: Unexpected files in /etc, aborting activation
错误。错误会列出这些文件,如下所示:以下文件有无法识别的内容,将被覆盖: /etc/nix/nix.conf /etc/bashrc 请检查这些文件中是否有关键内容,通过在文件名末尾添加.before-nix-darwin来重命名它们,然后再试一次。
在继续之前,备份并移动这些文件,或编辑你的Nix配置。
10. 进行更改
最后,使用以下命令修改你的系统:
nix run .#build-switch
[!注意]
~/.zshrc
将被此仓库中的zsh
配置替换。确保这是你想要的。
对于NixOS
此配置支持x86_64
和aarch64
平台。
1. 刻录并使用最新的ISO
下载并将最小ISO镜像刻录到USB,或使用ISO作为基础创建新的虚拟机。启动安装程序。
如果你在Apple Silicon Mac上构建虚拟机,请选择64位ARM。 快速链接
2. 可选:设置密钥
如果你使用带有密钥的入门配置,还需要几个额外步骤。
2a. 创建一个私有GitHub仓库来存储你的密钥
在GitHub上,创建一个私有的nix-secrets
仓库,至少包含一个文件(如README
)。你将在安装过程中输入这个名称。
2b. 安装密钥
在生成你的第一个构建之前,这些密钥必须存在于你的~/.ssh
目录中。别担心,我提供了几个命令来帮助你。
密钥名称 | 平台 | 描述 |
---|---|---|
id_ed25519 | macOS / NixOS | 从GitHub下载密钥。仅在引导过程中使用。 |
id_ed25519_agenix | macOS / NixOS | 复制过来,用于加密和解密密钥。 |
运行以下命令之一:
从U盘复制密钥
此命令自动检测连接到当前系统的U盘。
密钥必须命名为
id_ed25519
和id_ed25519_agenix
。
sudo nix run --extra-experimental-features 'nix-command flakes' github:dustinlyons/nixos-config#copy-keys
创建新密钥
sudo nix run --extra-experimental-features 'nix-command flakes' github:dustinlyons/nixos-config#create-keys
检查现有密钥
如果你自己管理密钥,只需检查它们是否正确安装。
sudo nix run --extra-experimental-features 'nix-command flakes' github:dustinlyons/nixos-config#check-keys
3. 安装配置
选择你的模板
[!重要] 对于Nvidia显卡,在启动安装程序时选择第二个选项
nomodeset
,否则你将看到空白屏幕。
[!警告] 运行此操作将重新格式化你的驱动器为
ext4
文件系统。
简单版
- 非常适合初学者,让你快速上手并测试Nix。
- 不使用密钥意味着你必须自己配置依赖密钥或密码的应用程序。
- 你随时可以稍后添加密钥。
sudo nix run --extra-experimental-features 'nix-command flakes' github:dustinlyons/nixos-config#install
带密钥版
- 选择此选项可以添加更多组件,实现100%声明式配置。
- 此模板为你提供了一个存储密码、私钥等的地方,作为配置的一部分。
sudo nix run --extra-experimental-features 'nix-command flakes' github:dustinlyons/nixos-config#install-with-secrets
4. 设置用户密码
首次启动时在登录屏幕:
- 使用快捷键
Ctrl-Alt-F2
(如果在Mac上则使用Fn-Ctrl-Option-F2
)切换到终端会话 - 以
root
身份登录,使用安装过程中创建的密码 - 使用
passwd <user>
设置用户密码 - 返回登录屏幕:
Ctrl-Alt-F7
如何创建密钥
要创建一个新的密钥secret.age
,首先在你的nix-secrets
仓库根目录下创建一个secrets.nix
文件。使用以下代码:
[!注意]
secrets.nix
由命令式的agenix
命令解释,以为你的密钥选择"正确"的密钥。将此文件视为
agenix
的配置文件。它不是系统配置的一部分。
secrets.nix
let
user1 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL0idNvgGiucWgup/mP78zyC23uFjYq0evcWdjGQUaBH";
users = [ user1 ];
system1 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPJDyIr/FSz1cJdcoW69R+NrWzwGK/+3gJpqD1t8L2zE";
systems = [ system1 ];
in
{
"secret.age".publicKeys = [ user1 system1 ];
}
user1
的值应该是你的公钥,或者如果你更喜欢将密钥附加到主机上,使用system1
声明。
现在我们已经用secrets.nix
配置了agenix
,是时候创建我们的第一个密钥了。
运行以下命令。
EDITOR=vim nix run github:ryantm/agenix -- -e secret.age
这将打开一个编辑器来接受、加密并将你的密钥写入磁盘。
该命令将查找secret.age
的公钥,在你的secrets.nix
中定义,并在~/.ssh/.
中检查其私钥。
要覆盖SSH路径,请使用
-i
标志提供id_ed25519
密钥的路径。
在编辑器中写入你的密钥,保存,并将文件提交到你的nix-secrets
仓库。
现在我们有两个文件:secrets.nix
和我们的secret.age
。
以下是一个更详细的步骤示例:
密钥示例
假设我想创建一个新的密钥来存储我的Github SSH密钥。
我会进入我的nix-secrets
仓库目录,确认agenix
配置文件(名为secrets.nix
)存在,然后运行
EDITOR=vim nix run github:ryantm/agenix -- -e github-ssh-key.age
这会启动一个vim
会话。
我会进入插入模式:i
,复制粘贴密钥,按Esc,然后输入:w
保存,这样就会创建一个新文件github-ssh-key.age
。
然后,我会编辑secrets.nix
,添加一行指定用于新密钥的公钥。我指定了一个用户密钥,但也可以轻松指定主机密钥。
secrets.nix
let
dustin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL0idNvgGiucWgup/mP78zyC23uFjYq0evcWdjGQUaBH";
users = [ dustin ];
systems = [ ];
in
{
"github-ssh-key.age".publicKeys = [ dustin ];
}
最后,我会将所有更改提交到nix-secrets
仓库,回到我的nixos-config
并运行nix flake update
更新锁文件。
密钥现在可以使用了。这里有一个来自我配置的示例。最终,这会在Nix Store中创建一个指向解密文件的符号链接,反映我的原始文件。
进行更改
使用Nix,对系统的更改是通过以下方式完成的:
这些步骤都包含在build-switch
运行命令中。
开发工作流程
因此,通常管理环境的工作流程如下:
- 对配置进行更改
- 运行
nix run .#build-switch
- 观察Nix、
nix-darwin
、home-manager
等完成工作 - 继续前进并享受声明式环境的好处
尝试软件包
要快速尝试一个软件包而不安装它,我通常运行
nix shell nixpkgs#hello
其中hello
是nixpkgs中的软件包名称。
兼容性和反馈
平台
此配置已在以下平台上测试并确认可用:
- 较新的M1/M2/M3 Apple Silicon Mac
- 较旧的x86_64(Intel)Mac
- 裸机x86_64 PC
- macOS上VMWare中的NixOS虚拟机
- macOS上Parallels中的macOS Sonoma虚拟机
反馈和问题
有反馈或问题吗?欢迎使用讨论论坛。
贡献
有兴趣为这个项目做贡献吗?以下是您可以提供帮助的方式:
-
代码贡献:如果您有兴趣贡献代码,请先查看开放的问题或功能请求。Fork仓库,进行更改,然后提交拉取请求。确保您的代码符合现有的风格。对于重大更改,请考虑在开始工作前先开启一个讨论问题。
-
报告错误:如果您遇到错误或问题,请帮助报告它们。打开一个GitHub Issue,并尽可能包含详细信息:出现错误时您在做什么,重现问题的步骤,以及任何相关的日志或错误消息。
附录
为什么选择Nix Flakes
跳过nix-env
、Nix通道等,直接使用flakes的理由
- Flakes的工作方式就像您已经熟悉的其他包管理器:
npm
、cargo
、poetry
、composer
等。通道的工作方式更像传统的Linux发行版(如Ubuntu),大多数开发者不熟悉。 - Flakes不仅封装了项目依赖,还包括Nix表达式、Nix应用程序和其他配置在一个文件中。所有内容都在一个文件中,这很方便。
- 通道将所有包锁定到一个大的全局
nixpkgs
版本。Flakes将每个单独的包锁定到一个版本,这更精确,更容易进行整体管理。 - Flakes有一个不断增长的生态系统(参见Flake Hub或Dev Env),所以您是在为未来做准备。
NixOS组件
组件 | 描述 |
---|---|
窗口管理器 | Xorg + bspwm |
终端模拟器 | alacritty |
状态栏 | polybar |
应用程序启动器 | rofi |
通知守护进程 | dunst |
显示管理器 | lightdm |
文件管理器 | thunar |
文本编辑器 | emacs 守护进程模式 |
媒体播放器 | cider |
图像查看器 | feh |
截图软件 | flameshot |
许可证
本项目基于 BSD-3-Clause 许可证 发布。
支持
你是否发现我的项目有用或者学到了比你想象中更多的 Nix 知识?你的支持将不胜感激。
星标
"我们唯一要决定的是如何利用给予我们的时间。" - J.R.R. 托尔金