Project Icon

nixos-config

基于Nix的跨平台开发环境配置方案

该项目为macOS和NixOS平台提供了基于Nix的开发环境配置方案。通过Flake实现完全声明式管理,涵盖软件包、系统设置和密钥等。配置支持跨平台共享,具备简单的引导过程,集成磁盘和密钥管理等高级特性。项目注重可读性和简洁性,并通过持续集成确保配置的稳定性和更新。

macOS + NixOS 通用 Nix 配置

构建启动模板 Statix 代码检查

概述

嘿,你来了!欢迎。🤓

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-darwinnix-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中可用。在接下来的步骤中你会需要它。

[!重要]

如果使用官方安装说明flakesnix-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_ed25519macOS / NixOS从Github下载密钥。仅在引导过程中使用。
id_ed25519_agenixmacOS / NixOS复制过来,用于加密和解密密钥。

运行以下命令之一:

从USB驱动器复制密钥

这个命令自动检测连接到当前系统的USB驱动器。

密钥必须命名为id_ed25519id_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_64aarch64平台。

1. 刻录并使用最新的ISO

下载并将最小ISO镜像刻录到USB,或使用ISO作为基础创建新的虚拟机。启动安装程序。

如果你在Apple Silicon Mac上构建虚拟机,请选择64位ARM快速链接

2. 可选:设置密钥

如果你使用带有密钥的入门配置,还需要几个额外步骤。

2a. 创建一个私有GitHub仓库来存储你的密钥

在GitHub上,创建一个私有的nix-secrets仓库,至少包含一个文件(如README)。你将在安装过程中输入这个名称。

2b. 安装密钥

在生成你的第一个构建之前,这些密钥必须存在于你的~/.ssh目录中。别担心,我提供了几个命令来帮助你。

密钥名称平台描述
id_ed25519macOS / NixOS从GitHub下载密钥。仅在引导过程中使用。
id_ed25519_agenixmacOS / NixOS复制过来,用于加密和解密密钥。

运行以下命令之一:

从U盘复制密钥

此命令自动检测连接到当前系统的U盘。

密钥必须命名为id_ed25519id_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-darwinhome-manager等完成工作
  • 继续前进并享受声明式环境的好处

尝试软件包

要快速尝试一个软件包而不安装它,我通常运行

nix shell nixpkgs#hello

其中hellonixpkgs中的软件包名称。

兼容性和反馈

平台

此配置已在以下平台上测试并确认可用:

  • 较新的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的工作方式就像您已经熟悉的其他包管理器:npmcargopoetrycomposer等。通道的工作方式更像传统的Linux发行版(如Ubuntu),大多数开发者不熟悉。
  • Flakes不仅封装了项目依赖,还包括Nix表达式、Nix应用程序和其他配置在一个文件中。所有内容都在一个文件中,这很方便。
  • 通道将所有包锁定到一个大的全局nixpkgs版本。Flakes将每个单独的包锁定到一个版本,这更精确,更容易进行整体管理。
  • Flakes有一个不断增长的生态系统(参见Flake HubDev Env),所以您是在为未来做准备。

NixOS组件

组件描述
窗口管理器Xorg + bspwm
终端模拟器alacritty
状态栏polybar
应用程序启动器rofi
通知守护进程dunst
显示管理器lightdm
文件管理器thunar
文本编辑器emacs 守护进程模式
媒体播放器cider
图像查看器feh
截图软件flameshot

许可证

本项目基于 BSD-3-Clause 许可证 发布。

支持

你是否发现我的项目有用或者学到了比你想象中更多的 Nix 知识?你的支持将不胜感激。

给我买杯咖啡

星标

"我们唯一要决定的是如何利用给予我们的时间。" - J.R.R. 托尔金

星标历史图表

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号