将nixpkgs checkout传播到NixOps机器

时间:2017-12-24 14:36:41

标签: nix nixos nixops

我在nixpkgs上维护我的个人更改,我将其用于系统重建(通过NixOps)和在我的工作站上进行开发(主要通过nix-shell)。这些更改是在nixos-17.09频道的基础上重新提交的,并存储在私有git服务器上。部署中的所有计算机都具有对该git服务器的读访问权限。

在远程计算机上使用nix-shell时,我会从计算机的安装时间(在我的情况下为nixos-17.03)中获取旧包。

有没有办法在远程机器上提供用于部署的完全相同的nixpkgs版本?

1 个答案:

答案 0 :(得分:2)

您遇到的问题是因为NixOps在本地构建然后将闭包复制到远程计算机,因此在远程计算机上不运行nix-channel --update,Nix Packages Collection(nixpkgs)未在远程计算机上更新。

nix-envnix-shell等命令依赖于nixpkgs指向的$NIX_PATH(或您通过-I参数提供的任何路径)。< / p>

解决方案

解决方案是将您的nixpkgs版本放入远程计算机并确保$NIX_PATH指向它。默认情况下,$NIX_PATH如下所示:

nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

所以我的想法是让它看起来像这样:

nixpkgs=/nix/store/blah-blah-blah:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

其中 blah-blah-blah 是你的nixpkgs Git repo插入Nix商店。以下是如何执行此操作的示例:

let
    # This will point to whatever NIX_PATH states on the local machine,
    # unless overwritten with -I.
    hostNixpkgs = import <nixpkgs> {};

    # Some other nixpkgs from a GitHub repo
    romildo = hostNixpkgs.pkgs.fetchFromGitHub {
         owner = "romildo";
         repo = "nixpkgs";
         rev = "b167ba35987c2e69dc1bb91d5c245a04421ee7ed";
         sha256 = "02d8dfvginz45h2zhq745kynzygnsy760qh7yy152wpfhczag180";
    };
in
{
    network.description = "My NixOS VMs";

    vm0 = { config, lib, pkgs, ... }:
    {
      ...

      # This is really hacky, but it works.
      # I'd prefer to set environment.etc.NIX_PATH, but that's not allowed,
      # because that value is "read-only".
      environment.extraInit = "export NIX_PATH=nixpkgs=${romildo}:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels";
    };
}

如何运作

Nix创建/nix/store/BLAH-set-environment,除其他外,它会导出一堆环境变量。此文件在所有shell会话中可用。 environment.extraInit可以将您想要的任何shell-neutral(sh)代码附加到此环境中。因为这个任意代码插入到脚本的末尾,所以它可以用来覆盖环境变量,例如NIX_PATH

需要注意的是,您必须在部署后重新登录才能使更改生效。但结果NIX_PATH看起来像这样:nixpkgs=/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels。因此,在此示例中,nix-shell将在nixpkgs处查找/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source