2016-01-13 7 views
12

Я только начинаю разбираться с Nix, поэтому извиняюсь, если я пропустил ответ на свой вопрос в документах.Построение и зависимость от работы в Nix

Я хочу использовать Nix для установки безопасной производственной машины с минимальным набором библиотек и исполняемых файлов. Я не хочу, чтобы какие-либо компиляторы или другие инструменты сборки присутствовали, потому что это могут быть риски безопасности.

Когда я устанавливаю некоторые пакеты, кажется, что они зависят только от минимального набора зависимостей времени выполнения. Например, если я устанавливаю apache-tomcat-8.0.23, тогда я получаю Java runtime (JRE) и готовые JAR-файлы, содержащие Tomcat.

С другой стороны, некоторые пакеты, как представляется, включают в себя целую цепочку построения в качестве зависимостей. Сделав еще один пример Java на основе, когда я устанавливаю spark-1.4.0 Никс рушит комплект разработки Java (JDK), который включает в себя компилятор, и он также тянет Maven построить инструмент и т.д.

Итак, мои вопросы заключаются в следующем:

  1. В пакетах Nix существует какое-либо различие между зависимостями между строкой и временем выполнения?
  2. Почему некоторые пакеты зависят от инструментов сборки, тогда как другим требуется только время выполнения? Все дело в том, как автор пакета завернул приложение?
  3. Если пакет содержит зависимостей сборки, которые я не хочу, есть ли что-то, что я, как оператор, могу сделать с этим, кроме разработки моей собственной альтернативной упаковки для того же приложения?

Большое спасибо.

ответ

18
  1. Зависимости времени выполнения является подмножеством сборки времени зависимостей, которые Никс автоматически определяет путем сканирования сгенерированного для хеша-части магазина пути каждого времени построения зависимостей. Например, если вы создаете пакет с помощью компилятора /nix/store/abcdef...-foo-1.20, то Nix будет сканировать все файлы в сгенерированном выходе для хэш-бита abcdef.... Если этот хэш обнаружен, то предполагается, что выход ссылается на компилятор каким-то образом, поэтому он сохраняется как зависимость от времени выполнения. Однако, если этот хэш не возникает, то сгенерированный вывод не имеет ссылки на компилятор и поэтому не может получить к нему доступ во время выполнения, поэтому foo-1.20 рассматривается как зависимость от времени сборки.

  2. Некоторые пакеты записывают большие части своей среды сборки для информационных/отладочных целей. Например, Perl хранит каждую небольшую деталь о инструментах, используемых для ее компиляции, поэтому все эти пути хранилища обрабатываются как зависимости от времени выполнения, несмотря на то, что Perl на самом деле не нуждается в них во время выполнения, но Nix не может знать: он просто знает, что путь хранения в Perl ссылки эти инструменты. Теперь поддерживающие Nixpkgs обычно стараются очистить это, то есть путем обрезки файла журнала, который содержит все эти пути хранилища от установки, и т. Д., Но, наверняка, в базе данных еще много пакетов, которые еще не были оптимизированы для этот конец все же.

  3. Предположим, что вы хотите скомпилировать версию 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 
    
+0

Спасибо за подробный и исчерпывающий ответ. –

+0

Вы упоминаете «автоматически путем сканирования сгенерированного вывода», как Nix на самом деле это делает? Он работает с динамически исполняемыми путями через 'exec' внутри двоичного кода? Или, возможно, сгенерированный файл конфигурации, сохраняющий путь к двоичному файлу другого пакета? – CMCDragonkai

+0

@CMCDragonkai, да, кажется, что nix фактически сканирует двоичные файлы для хешей деривации. К сожалению, я не могу найти фактический код, но вот некоторые подробности https://lethalman.blogspot.ru/2014/08/nix-pill-9-automatic-runtime.html – cvb