[ここで部分的に扱われました:https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9;しかし完全ではない]
アップグレードするたびに、Hydraからすべてのアイテムをインポートしないように、NixOSシステムの1つをパッケージ用のキャッシュとして使用したいと思います。だから私はこれを試しました: 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
に電話root
して、この「追加」バイナリキャッシュを「信頼できるバイナリキャッシュ」として登録しても、私が何をしているのかわかるわけではなく、システムが文句を言う必要がないという意味です。です。署名はありませんか? (検査を完全に無効にする必要はありません。)特定の「信頼できる」ソース/ユーザーに対してのみ検証を無効にする方法が見つからず、ほとんど存在しないと疑われます(バグなど)。nix-store --generate-binary-cache-key
この署名メカニズムに準拠するために、nix-push --dest <somewhere> --key-file <secret-1> --none <cherrypicked-paths>
クライアントに公開鍵を登録して「完全な」バイナリキャッシュを設定することもできます。しかし、それは私が望むものではありません。アーカイブを「サーバー」に保存し、nix-push
パスを明示的に設定します。nix-serve
この共有パッケージが出荷前に署名されているので、受信者がnix-env
この特定の情報源が信頼できると確信している場合は、署名の欠如について文句を言わずに喜んでいただけることを願っています!
nix-serve
結論:署名検証メカニズム(またはその両方)が破損しているか維持されていないと確信しています。したがって、これを問題ではなくバグレポート候補と見なすことができます。しかし、私が間違っているなら、それはより良いです。
ベストアンサー1
nix-serve
コマンドによって提供される署名付きバイナリキャッシュを使用するようにサーバーとクライアントを設定する方法は次のとおりです。これはnix-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
cache.example.com
...サーバーに適したホスト名に変更してください。実際のホスト名と一致する必要はありませんが、公開鍵が属するサーバーを簡単に区別できるように一致すると便利です。
キャッシュサーバーが実行されている場合は、NixOS
設定ファイルに次の2行を追加してキャッシュを提供できますNixOS
。
nix-serve = {
enable = true;
secretKeyFile = "/path/to/nix-serve.sec";
};
...ユーザーにnix-serve
キーへの読み取りアクセス権があることを確認してくださいnix-serve.sec
。
キャッシュを指定せずに実行可能ファイルを使用して直接キャッシュを提供するNixOS
には、次のように環境変数を使用してキーパスを指定する必要がnix-serve
あります。NIX_SECRET_KEY_FILE
NIX_SECRET_KEY_FILE=/path/to/nix-serve.sec nix-serve ...
クライアント構成
クライアントシステムが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:...="
];
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:...=
1つのビルドに対してのみバイナリキャッシュを有効にするには、次のようにこれらのバイナリキャッシュ設定フラグを、またはnix-build
同じNixユーティリティに直接渡すことができます。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:...="