[此处部分解决:https : //plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9 ; 但不完全]
我想使用我的一台 NixOS 机器作为包的缓存,而不是在每次升级时从 Hydra 中提取所有内容。所以我尝试这样做:https : //nixos.org/nix/manual/#sec-sharing-packages。但
当我尝试使用nix-serve -p <port>
, nix-env --option extra-binary-caches http://<host>:<port>/
(即使以root
!运行时)只是忽略此缓存,说“NAR 信息文件”...“缺少签名”,并尝试切换到cache.nixos.org
. 所以nix-serve
没有按预期工作。这是否意味着文档不再真实,或者nix-serve
已损坏?
虽然nix-copy-closure --to <user>@<host>
确实有效(如果<user>
作为受信任的用户添加到 中nix.trustedUsers
)。但是在每次升级时都这样做会非常不方便。顺便提一句。这里还有什么让我感到困惑的--from
是应该如何使用?
我大致了解加密签名的工作原理,以及为什么使用它们对包(和存储库)进行签名。但
在这些情况下,我根本不需要它:MITM 的风险无需担心。我只想定期且轻松地将少量 GiB 的二进制文件从一台机器复制到另一台机器。当然,我可以简单地通过 完全禁用验证nix.requireSignedBinaryCaches = false
,但没有更彻底的方法吗?例如,如果我调用nix-env
asroot
或作为“受信任的用户”并将这个“额外”的二进制缓存注册为“受信任的二进制缓存”;这不意味着我知道我在做什么,并且不需要系统唠叨丢失的签名吗?(无需完全禁用检查)我还没有找到如何仅为某个“受信任的”来源/用户禁用验证,并且几乎怀疑它不存在(即错误)。
为了遵守这种签名机制,我可能还可以尝试设置一个“成熟的”二进制缓存,方法是使用nix-store --generate-binary-cache-key
、 thennix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>
并在客户端上注册公钥。但这并不是我想要的:将档案存储在“服务器”上并nix-push
明确设置路径。我只是希望nix-serve
在交付前签署那些共享的包裹,以便接收方会很高兴,或者nix-env
如果我绝对确定这个特定来源是值得信赖的,则不要抱怨缺少签名!
总之:我很确定nix-serve
或者签名检查机制(或两者)只是损坏/未维护。因此,人们可以将其视为一个问题,而不是将其视为错误报告的候选者。但如果我错了 - 更好。
以下是您如何配置服务器和客户端以使用通过nix-serve
命令提供的签名二进制缓存。这不需要 usingnix-push
来生成缓存,您可以/nix/store
直接使用此方法为您服务。
这在man
-page 中有记录,nix-push
因此如果您想要更多详细信息,您也可以查看
此示例假定您的服务器的主机名是cache.example.com
.
首先,您需要使用 生成签名密钥对nix-store --generate-binary-cache-key
,如下所示:
$ nix-store --generate-binary-cache-key cache.example.com-1 nix-serve.sec nix-serve.pub
Run Code Online (Sandbox Code Playgroud)
...只需替换cache.example.com
为您的服务器的任何适当的主机名。它不必匹配真实的主机名,但如果它们匹配,则它会有所帮助,这样您就可以轻松区分公钥属于哪个服务器。
如果您的缓存服务器正在运行,NixOS
那么您可以通过将这两行添加到您的NixOS
配置文件来提供您的缓存:
nix-serve = {
enable = true;
secretKeyFile = "/path/to/nix-serve.sec";
};
Run Code Online (Sandbox Code Playgroud)
...并确保nix-serve
用户对nix-serve.sec
密钥具有读访问权限。
如果您不使用NixOS
并且想直接使用nix-serve
可执行文件提供缓存,那么您需要使用NIX_SECRET_KEY_FILE
环境变量来指定密钥的路径,如下所示:
NIX_SECRET_KEY_FILE=/path/to/nix-serve.sec nix-serve ...
Run Code Online (Sandbox Code Playgroud)
如果您的客户端机器是一NixOS
台机器,那么您可以将这些行添加到您的NixOS
配置文件中:
nix.binaryCaches = [
"https://cache.nixos.org/"
# This assumes that you use the default `nix-serve` port of 5000
"http://cache.example.com:5000"
];
nix.binaryCachePublicKeys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
# Replace the following string with the contents of the
# `nix-serve.pub` file you generated in the "Server configuration"
# section above
"cache.example.com-1:...="
];
Run Code Online (Sandbox Code Playgroud)
如果您不在NixOS
机器上,则可以手动编辑nix.conf
文件以进行以下设置:
binary-caches = https://cache.nixos.org/ http://cache.example.com
binary-cache-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...=
Run Code Online (Sandbox Code Playgroud)
如果您只想为一个构建启用二进制缓存,您可以将这些二进制缓存配置标志直接传递给任何 Nix 实用程序,例如nix-build
或nixos-rebuild
,如下所示:
nixos-rebuild build --option binary-caches "https://cache.nixos.org/ http://cache.example.com" --option binary-cache-public-keys "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.example.com-1:...="
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1840 次 |
最近记录: |