[여기서 부분적으로 다뤄졌습니다:https://plus.google.com/110416349762686874861/posts/PVGHL1Tpeb9;하지만 완전히는 아님]
업그레이드할 때마다 Hydra에서 모든 항목을 가져오지 않도록 NixOS 시스템 중 하나를 패키지용 캐시로 사용하고 싶습니다. 그래서 나는 이것을 시도했습니다 : 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
구성 파일에 다음 두 줄을 추가하여 캐시를 제공할 수 있습니다 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:...=
하나의 빌드에 대해서만 바이너리 캐싱을 활성화하려면 다음과 같이 이러한 바이너리 캐시 구성 플래그를 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:...="