Зависимости сборки от времени выполнения в Nix
Я только начинаю разбираться с Nix, поэтому извиняюсь, если пропустил ответ на свой вопрос в документации.
Я хочу использовать Nix для настройки защищенной рабочей машины с минимальным набором библиотек и исполняемых файлов. Я не хочу, чтобы присутствовали какие-либо компиляторы или другие инструменты сборки, потому что это может быть угрозой безопасности.
Когда я устанавливаю некоторые пакеты, кажется, что они зависят только от минимального набора зависимостей времени выполнения. Например, если я установлю apache-tomcat-8.0.23
затем я получаю среду выполнения Java (JRE) и предварительно созданные файлы JAR, содержащие Tomcat.
С другой стороны, некоторые пакеты, кажется, включают полный набор инструментов сборки в качестве зависимостей. Принимая другой пример на основе Java, когда я устанавливаю spark-1.4.0
Nix использует пакет разработки Java (JDK), который включает в себя компилятор, а также инструмент сборки Maven и т. Д.
Итак, мои вопросы таковы:
- Делают ли пакеты Nix какие-либо различия между зависимостями сборки и времени выполнения?
- Почему некоторые пакеты зависят от инструментов сборки, тогда как другим требуется только время выполнения? Это все связано с тем, как автор пакета обернул приложение?
- Если пакет содержит зависимости сборки, которые мне не нужны, могу ли я, как оператор, с этим справиться, кроме разработки собственной альтернативной упаковки для того же приложения?
Большое спасибо.
1 ответ
Зависимости времени выполнения - это подмножество зависимостей времени сборки, которые Nix определяет автоматически путем сканирования сгенерированного вывода для хэш-части пути хранения каждой зависимости во время сборки. Например, если вы собираете пакет с использованием компилятора
/nix/store/abcdef...-foo-1.20
затем Nix проверит все файлы в сгенерированном выводе на хэш-битabcdef...
, Если этот хэш найден, то предполагается, что выходные данные ссылаются на компилятор каким-либо образом, поэтому он сохраняется как зависимость времени выполнения. Однако, если этот хэш не возникает, сгенерированный вывод не имеет ссылки на компилятор и, следовательно, не может получить к нему доступ во время выполнения, поэтомуfoo-1.20
рассматривается как зависимость только во время сборки.Некоторые пакеты записывают большие части своей среды сборки для информационных / отладочных целей. Perl, например, хранит каждую мелкую информацию об инструментах, использованных для его компиляции, поэтому все эти пути хранилища в конечном итоге рассматриваются как зависимости времени выполнения, несмотря на тот факт, что Perl на самом деле не нуждается в них во время выполнения, но Nix не может знать: он просто знает, что путь к хранилищу Perl ссылается на эти инструменты. Теперь сопровождающие Nixpkgs обычно прилагают усилия для его очистки, то есть путем удаления файла журнала, который содержит все эти пути к хранилищам из установки и т. Д., Но наверняка в базе данных есть еще много пакетов, которые не были оптимизированы для этот конец еще.
Давайте предположим, что вы хотите скомпилировать версию
openssh
это не зависит от PAM. Затем вы можете удалить входные данные из выражения с помощью переопределения, то есть заменитьpam
Аргумент, который обычно передаетсяopenssh
построить функцию сnull
, Для этого сохраните следующий файл в~/.nixpkgs/config.nix
{ packageOverrides = super: let self = super.pkgs; in { openssh-without-pam = super.openssh.override { pam = null; }; }; }
и теперь установите этот пакет, выполнив:
$ nix-env -f "<nixpkgs>" -iA openssh-without-pam