将 nixpkgs checkout 传播到 NixOps 机器
Propagate nixpkgs checkout to NixOps machines
我在 nixpkgs
上维护我的个人更改,我将其用于系统重建(通过 NixOps)和我的工作站上的开发(主要通过 nix-shell
)。这些更改是基于 nixos-17.09
频道的重新提交,并存储在私人 git 服务器上。部署中的所有计算机都具有对该 git 服务器的读取权限。
在远程机器上使用 nix-shell
时,我得到了来自机器安装时间的旧包(在我的情况下 nixos-17.03
)。
是否有任何方法可以在远程计算机上获得与用于部署的 nixpkgs
完全相同的修订版?
您遇到的问题是因为 NixOps 在本地构建,然后将闭包复制到远程机器,因此不会 运行 nix-channel --update
在远程机器上, Nix 包集合 (nixpkgs) 未在远程计算机上更新。
nix-env
和 nix-shell
等命令依赖于 $NIX_PATH
指向的 nixpkgs
(或您通过 -I
参数提供的任何路径) .
解决方案
解决方案是将您的 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 是您插入 Nix 商店的 nixpkgs
Git 存储库。这是一个如何做到这一点的例子:
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 中性 (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
将在 /nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source
.
处查找 nixpkgs
在 configuration.nix
中设置(或者您构建配置):
{
nix.nixPath = [ "nixpkgs=${pkgs.path}:/other/custom/paths/you/need" ];
}
我在 nixpkgs
上维护我的个人更改,我将其用于系统重建(通过 NixOps)和我的工作站上的开发(主要通过 nix-shell
)。这些更改是基于 nixos-17.09
频道的重新提交,并存储在私人 git 服务器上。部署中的所有计算机都具有对该 git 服务器的读取权限。
在远程机器上使用 nix-shell
时,我得到了来自机器安装时间的旧包(在我的情况下 nixos-17.03
)。
是否有任何方法可以在远程计算机上获得与用于部署的 nixpkgs
完全相同的修订版?
您遇到的问题是因为 NixOps 在本地构建,然后将闭包复制到远程机器,因此不会 运行 nix-channel --update
在远程机器上, Nix 包集合 (nixpkgs) 未在远程计算机上更新。
nix-env
和 nix-shell
等命令依赖于 $NIX_PATH
指向的 nixpkgs
(或您通过 -I
参数提供的任何路径) .
解决方案
解决方案是将您的 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 是您插入 Nix 商店的 nixpkgs
Git 存储库。这是一个如何做到这一点的例子:
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 中性 (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
将在 /nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source
.
nixpkgs
在 configuration.nix
中设置(或者您构建配置):
{
nix.nixPath = [ "nixpkgs=${pkgs.path}:/other/custom/paths/you/need" ];
}