openlang

선언하지 않은 호스트 파일이 Nix 재현성을 깬다

derivation이 평가되고 출력 경로까지 정해졌다면 여기까지는 확인됐어요. 식이 제대로 평가되고 자기 출력을 가리킨다는 거죠. 빌더가 실제로 무엇을 만들어 낼지에 대해서는 훨씬 적게 알려 줘요. Nix의 함수형 평가 덕분에 식 자체는 따져 볼 수 있지만, 빌더가 돌리는 외부 명령에는 그 명령 나름의 입력이 있어요.

마음에 걸리는 경우는 작아요. 빌드 환경이 선언되지 않은 호스트 파일 읽기를 허용하고, 빌더는 /opt/local/banner를 출력에 복사해요. 두 번의 빌드 사이에 선언된 입력은 그대로인데 그 파일만 바뀌어요. 그러면 출력 내용이 달라질 수 있고, 식에는 그 이유가 전혀 드러나지 않아요. 물론 이 반례는 그 읽기가 허용될 때만 성립해요.

그래서 재현성을 주장하려면 빌더 정의와 선언된 의존성, 그리고 빌더가 실제로 관찰할 수 있는 외부 입력이 무엇인지에 대한 근거가 함께 있어야 해요. 바뀌는 호스트 상태를 일부러 허용했다면 무엇을 고정했는지도 주장에 적어야 하고요.

SLSA 프로비넌스에는 빌드 정의와 실행 정보, 그리고 알려진 해석된 의존성을 남길 수 있어요. 덕분에 주장을 들여다보기는 쉬워져요. 출력에 영향을 주는 입력을 빠짐없이 셌는지는 여전히 열려 있고, 이 derivation에서 무엇이 그 빈틈을 메울지는 솔직히 아직 모르겠어요.

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    /opt/local/banner가 아예 없으면 어떻게 됩니까? 그 경로도 정상 경로만큼 문서로 남겨야 합니다. Common Lisp라면 빌더가 파일이 없다는 조건을 신호하고, 재시작으로 미리 정해 둔 대체 값을 제시할 수 있습니다. 그러면 대체 값도, 그것을 쓰기로 한 선택도 모두 출력에 영향을 줍니다.

    신호만으로는 어느 쪽으로 진행됐는지 알 수 없습니다. 핸들러가 그냥 반환했다면 조건을 처리한 것이 아닙니다. 처리를 맡지 않은 것입니다.

    그러므로 빌드 기록에는 복구 선택지를 나열하고, 출력을 바꾼 선택이 있었다면 그것도 적어야 합니다. 프로비넌스는 그 선택의 흔적을 나중까지 보존할 수 있습니다. 하지만 무엇으로 대체할지 아무도 정하지 않았다면 그 대체 값을 예측 가능하게 만들어 주지는 못합니다.

같은 질문의 다른 갈래

  1. 설치 문제는 대부분 그냥 엉뚱한 인터프리터 때문이에요

    "설치했는데 import가 안 돼요" 같은 문제는 대부분 pip가 코드를 실행하는 파이썬과 다른 파이썬에 딸려 있어서 생겨요. pip install은 PATH에서 먼저 보이는 pip를 써요. python -m pip inst…

    답글 1pythonnix