NixOS中的NixOS?

use*_*650 4 deployment virtualization nixos nix

我开始尝试NixOS部署。为此,我有一个定义了一些软件包的仓库,以及一个configuration.nix用于服务器的仓库。

看来我以后应该可以在本地测试此配置了(我也正在运行NixOS)。我想将全局 变量更改configuration.nix为指向部署服务器的部署是个坏主意configuration.nix(谁知道会破坏什么);但是是否有一种安全便捷的方法可以在本地“试用”服务器-即构建服务器并引导到服务器中,或者更好地将其作为单独的进程启动?

我当然可以看到docker是一种方式。也许没有别的了。但是我有这种模糊的感觉,尼克斯可能有能力独自做到这一点。

小智 6

默认系统内置了一种相当标准的方法。

nixos-rebuild build-vm。这将使用您当前的配置文件(默认情况下为/etc/nixos/configuration.nix,将其构建并创建一个脚本,使您可以将配置引导到虚拟机中。

脚本完成后,它将在当前目录中保留一个符号链接。然后,您可以通过运行./result/bin/run-$HOSTNAME-vm来启动,这将启动虚拟机的启动,以供您试用。

TLDR;

  1. nixos-rebuild build-vm
  2. ./result/bin/run-$HOSTNAME-vm

  • @0fnt:不,一点也不,它使用主机的存储(只读安装)。 (3认同)
  • 另外,我相信 `-I nixos-config=./path/to/configuration.nix` 可以用来指向配置文件。 (2认同)

Rob*_*ing 5

您可能已经知道,系统配置可以在 Nix 商店中共存而不会出现任何问题。这里的问题是同时运行多个系统。为此,您需要一个隔离或虚拟化工具,例如 Docker、VirtualBox 等。

NixOS 容器

NixOS提供了容器概念的有效实现,由 systemd-nspawn 支持,而不是基于图像的容器运行时。

如果您需要更大的灵活性,可以在configuration.nix命令中以声明方式或命令方式指定这些nixos-container

码头工人

Docker 并不是为了在容器内运行整个操作系统而设计的,因此它可能不适合测试基于Nix OS的部署,这些部署期望并在其部署单元内提供 systemd 和一些服务。虽然您不会通过 Docker获得良好的 Nix OS体验,但 Nix和 Docker 非常适合。更新:“原始”Nix 包和 NixOS 都在 Docker 中运行。例如,Arion支持来自普通 Nix、NixOS 模块和“普通”Docker 图像的图像。

NixOps

要在 NixOS 内部署 Nix OS,最好使用旨在在其中运行完整 Linux 系统的技术。

拥有一个为您管理集成的程序会有所帮助。在 Nix 生态系统中,NixOps 是这方面的第一个候选者。您可以将NixOps与多个后端一起使用,例如QEMU/KVM、VirtualBox、(目前处于实验阶段的)NixOS 容器后端,或者您可以使用none后端部署到您使用其他工具创建的机器上。

是将 NixOps 与 QEMU/KVM 结合使用的完整示例

测试

如果您的目标是运行自动化集成测试,则可以使用NixOS VM 测试框架。这使用 Linux KVM 虚拟化(在沙箱中公开 /dev/kvm)在虚拟机网络上运行集成测试,并将它们作为派生运行。因为它确实是相当有效率具备,因为它安装在虚拟机中的尼克斯店创建虚拟机镜像。这些测试像任何其他派生一样“构建”,使其易于运行。

Nix 商店优化

Nix 的一个独特功能是您可以经常重用主机 Nix 存储,因此能够在容器/虚拟机中挂载主机文件系统是您的解决方案中的一个很好的功能。如果您正在创建自己的解决方案,根据您的需要,您可能希望推迟此优化,因为如果您希望容器/虚拟机能够修改存储,它会变得更加复杂。NixOS 测试通过 VM 中的覆盖文件系统解决了这个问题。另一种方法可能是绑定挂载 Nix 存储转发 Nix 守护程序套接字。


小智 5

nixos-rebuild build-vm然而,这是最简单的方法;您还可以将配置导入 NixOS 容器(请参阅NixOS 手册中的第 47 章容器管理和命令)。nixos-container

这将通过以下方式完成:

containers.mydeploy = {
  privateNetwork = true;
  config = import ../mydeploy-configuration.nix;
};
Run Code Online (Sandbox Code Playgroud)

请注意,如果网络配置是静态的,则您希望在其中指定网络配置,mydeploy-configuration.nix因为这可能会导致与为容器创建的网络子网发生冲突。