Как обновить все пакеты на NixOS?

Вопрос или проблема

Наконец подобрался к настройке своих систем пару месяцев назад и с тех пор использую их с удовольствием, но понял, что пришло время обновить некоторые вещи. Моя конфигурация NixOS включает в себя декларативное управление пакетами с использованием Home Manager, но я совершенно забыл основы и не был уверен, усложнит ли Home Manager некоторые вещи, поскольку репозиторий упоминает только инструмент home-manager, который у меня отсутствует.

Кратко

  1. Вы находитесь на последнем канале?
    (Смотрите, как проверить и установить ниже.)

  2. sudo nix-channel --update

  3. a. (декларативный/NixOS) sudo nixos-rebuild switch
    b.                   (по запросу) nix-env -u '*'
    c.     (Home Manager) home-manager switch (Я думаю)

Эти шаги должны работать независимо от того, используете ли вы NixOS или нет.

ПРИМЕЧАНИЕ-1 (flakes): С большой долей вероятности, ничего из этого не сработает, если вы используете flakes.

ПРИМЕЧАНИЕ-2 (NixOS + Home Manager): Если nixos-rebuild switch завершается с неясными сообщениями об ошибках, обратите внимание на вашу конфигурацию Home Manager. По крайней мере, за последние 5 лет, когда ошибка была неясна (например, nix.maxJobs устарела в пользу nix.settings.max-jobs), это всегда было связано с Home Manager.

Шаг 0. Проверьте и установите последний канал

Шаг 1. nix-channel --update только извлечет изменения в канале, который в данный момент установлен! Чтобы проверить текущий, на который вы подписаны, выполните

sudo nix-channel --list

Последняя глава 4. Обновление NixOS в руководстве NixOS всегда будет показывать название и ссылку на последний канал. Страница состояния каналов Nix также является очень хорошим источником.

20.09, поэтому мне нужно было обновить его до 21.11, выполнив

$ sudo nix-channel --list
nixos https://nixos.org/channels/nixos-20.09

$ sudo nix-channel --remove nixos
$ sudo nix-channel --add https://nixos.org/channels/nixos-21.11 nixos

Дополнительная информация:

  • Раздел 4.4 Каналы в руководстве Nix является кратким введением в каналы Nix.

  • Статья Nix каналы в вики NixOS более подробно описывает детали и содержит хорошее резюме базовых команд. (Лично я нашел эту статью более полезной.)

Шаг 1. Обновите канал

Это необходимо как для декларативных, так и для “по запросу” [sic] конфигураций3:

sudo nix-channel --update

Несмотря на то, что в руководстве Nix есть раздел 4.1 Базовое управление пакетами, это лучше всего задокументировано в руководстве NixOS (см. Глава 7. Управление пакетами). (Хотя я не нашел, чтобы было ясно, как правильно организовать порядок шагов; самой большой помощью была эта дискуссия NixOS.)

Home Manager, похоже, не усложняет этот процесс. (По крайней мере, я использую его на NixOS, и nixos-rebuild switch всегда выполняет все с моей конфигурацией.)

Совет для пользователей NIXOS
nixos-rebuild switch --upgrade объединяет Шаг 1 и Шаг 2, так как “эквивалентно более громоздкому nix-channel --update nixos; nixos-rebuild switch“.

Шаг 2. Обновите пакеты

Два прилагательных, “по запросу” [sic] и “декларативный”, введены в руководстве NixOS для различения двух режимов управления пакетами Nix3:

  • по запросу“: Управление пакетами с помощью nix-env.1

  • декларативный“: В руководстве NixOS это относится к объявлению пакетов в виде списка в configuration.nix, но это можно сделать множеством других способов2.

Команды:

a. Чтобы обновить все пакеты, объявленные в configuration.nix NixOS, используйте:

sudo nixos-rebuild switch

b. Чтобы обновить все пакеты, установленные с помощью nix-env:

nix-env -u '*'

c. Чтобы обновить все пакеты, установленные с использованием Home Manager:

home-manager switch

(Я думаю. Опять же, я использую Home Manager в NixOS, и мне никогда не приходилось трогать какие-либо команды Home Manager. См. Эквивалент Home-manager для “apt upgrade”)


Примечания

[1]: Насколько мне известно, руководство NixOS является единственным официальным документом, который использует термин “управление пакетами ad-hoc [sic]” и только для обозначения управления пакетами с использованием nix-env.

(Поэтому я считаю этот термин вводящим в заблуждение, поскольку использование пакетов через команды nix-shell -p или пользовательские shell.nix также являются ad hoc формами управления пакетами. Также nix-env может быть неаккуратным.)

[2]: Например, с Home Manager, используя shell.nix, flakes. (Вероятно, некорректно упоминать flakes, так как это механизм, который можно использовать с Home Manager и Nix выражениями в nix-shell…)

[3]: Не уверен, существует ли консенсус по поводу того, что значит “по запросу”, “декларативный” и “императивный” формы управления пакетами в Nix; в примечании 1 есть мои мысли о “по запросу”, некоторые говорят, что использование каналов всегда является императивной формой управления пакетами, поэтому “декларативный” кажется перегруженным…

Кратко use nh с новым --update флагом

Это новая функция nh, и она выглядит так:

$ nh os switch --update ~/config

Это предполагает:

  • вы используете flakes (через файл по адресу ~/config/flake.nix)
  • ваш выход flake имеет то же название, что и имя вашего компьютера

Это более современная опция.

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

Этот ответ ниже должен быть полезен для

  • кого угодно, кто думает о переходе на использование flakes для своей системы или
  • кого угодно, кто недоволен выводом старого стандартного nixos-build.

Как обновить каждый пакет на NixOS?

Ответ Тораритте охватывает старую установку NixOS с каналами, но не охватывает flakes, поэтому я постараюсь ответить на этот вопрос для NixOS с Home Manager в контексте flakes – что несмотря на совпадение я использую в данный момент.

Я думаю, что в обмен на немного большую сложность в оборачивании вашей конфигурации NixOS, flakes делают обновление каналов и переключение гораздо проще и позволяют вам определять ваши каналы в конфигурации, а не в окружении, что больше соответствует обещанию Nix о воспроизводимости.

Ниже приведен flake nix, адаптированный от моей собственной конфигурации, улучшенный:

{ inputs = { # Два ввода, nixpkgs и Home Manager:
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
    home-manager = {
      url = "github:nix-community/home-manager/release-24.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };
  outputs = { self, nixpkgs, home-manager, ...}: { 
    nixosConfigurations.x1 = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [ # Шесть модулей:
        ({ pkgs, ... }: {
          environment.systemPackages = with pkgs; [
            nh
          ];
          programs.bash.interactiveShellInit=""
            switch () { # имя хоста по умолчанию для выходного flake - у меня это `x1`
              nh os switch --update ~/config ;
            }
          '';
        })
        ./console.nix    # модуль консоли/оболочки
        ./gui.nix        # модуль специфичный для gui
        ./x1.nix         # модуль специфичный для машины
        home-manager.nixosModules.home-manager
        { home-manager.useGlobalPkgs = true;
          home-manager.useUserPackages = false;
          home-manager.users.aaron = { imports = [ ./home.nix ]; };
        } 
      ]; 
    }; 
  }; 
}

Эта конфигурация flake.nix адаптирована из моей личной конфигурации и содержит только важные вещи, относящиеся к этому вопросу в первом перечисленном модуле: включение пакета nh и bash команды, которые я использую, чтобы сделать процесс обновления более удобным.

(Обратите внимание, что теперь есть nh опция, которая включает в себя больше функциональных возможностей, чем просто установка пакета, но вам следует рассмотреть это отдельно.)

Я определяю bash функцию switch, которая выполняет nh os switch --update ~/config, где ~/config – это мой репозиторий конфигурации.

Часть --update делает аналогично следующему:

$ nix flake update ~/config
warning: Git tree '/home/aaron/config' is dirty
warning: updating lock file '/home/aaron/config/flake.lock':
...

Вышеуказанный шаг фактически не обновляет вашу систему, он только обновляет вводы вlockfile.

Но с помощью nh вы можете собрать и переключиться на ваши обновленные вводы за один шаг с помощью функции switch, которую мы написали:

$ switch     # выполняет: nh os switch --update ~/config
> Building NixOS configuration
...

С этой командой, которая использует nh, вывод намного более подробный и информативный, чем обычный вывод на сборке nix, где каждая строка лога перезаписывает предыдущую. Я считаю это большим улучшением по сравнению со старым стандартом nixos-build, потому что я хочу видеть как можно больше, и мне кажется, что я каждый раз узнаю что-то новое.

Вот пример вывода с логом, деревом зависимостей и таблицей сборок и загрузок:

nh output

Сокращение вывода (или если у вас еще нет nh)

Но вам может быть удобнее получать меньше информации в выводе. Если это так, тогда вы предпочтете не использовать nh, поэтому вы можете сделать:

switch () {    # использование: switch x1
  sudo nixos-rebuild switch -L --flake ~/config#$1 ;
}
$ switch x1    # где x1 - это мой выход flake и имя хоста

Удалите -L (сокращенно от --print-build-logs), если это все еще слишком многословно, или попробуйте флаг --quiet.

Проблемы с sudo

Команда nh предназначена для использования без sudo и только просит вас ввести пароль там, где это абсолютно необходимо.

Если вы использовали sudo для обновления flakes вашей системы, вы можете обнаружить, что файл flake.lock и файлы .git/index теперь принадлежат root. Чтобы это исправить, выполните

$ sudo chown aaron flake.lock .git/index

Конечно, замените свое имя пользователя на мое выше.

Заключение

Подводя итог, мы рассмотрели, как использовать nh для обновления вашего NixOS через flakes одной командой и как структурировать вашу конфигурацию flake.nix, чтобы справляться с этим, обходя несколько потенциальных проблем.

Ваши отзывы абсолютно приветствуются! Пожалуйста, оставьте комментарий ниже.

Ответ или решение

Как обновить все пакеты на NixOS

Обновление пакетов в NixOS может показаться сложной задачей, особенно если вы ранее не сталкивались с особенностями его декларативного подхода. В данном руководстве мы шаг за шагом рассмотрим, как обновить все пакеты в системе NixOS, включая использование Home Manager и управление через flakes.

Шаг 0: Проверьте и настройте последний канал

Перед обновлением убедитесь, что вы используете последние стабильные каналы. Для этого выполните команду:

sudo nix-channel --list

Эта команда покажет вам текущий канал, к которому вы подписаны. Если ваш канал устарел, вам необходимо его обновить. Например, если вы сейчас подписаны на nixos-20.09, и хотите перейти на nixos-21.11, выполните следующие команды:

sudo nix-channel --remove nixos
sudo nix-channel --add https://nixos.org/channels/nixos-21.11 nixos

Шаг 1: Обновление канала

После проверки и настройки канала выполните команду для обновления:

sudo nix-channel --update

Эта команда обновит ссылки на пакеты, которые будут использованы для обновления системы.

Шаг 2: Обновление пакетов

Теперь нужные пакеты обновлены, и необходимо обновить саму систему. В NixOS для обновления пакетов используется команда nixos-rebuild. Если вы используете декларативный подход (например, прописываете ваши пакеты в configuration.nix), выполните:

sudo nixos-rebuild switch

Если вы устанавливаете пакеты в "ад-хок" режиме через nix-env, используйте:

nix-env -u '*'

Для пользователей Home Manager обновление осуществляется с помощью команды:

home-manager switch

Эти команды обеспечивают обновление всех ваших пакетов, независимо от способа их установки.

Особые случаи: использование flakes

Если вы используете механизм flakes, процесс обновления также станет более простым и удобным. С флагом --update можно легко обновить и вашу конфигурацию, и пакеты:

nh os switch --update ~/config

Здесь предполагается, что вы используете flake, хранящую ваш конфиг в ~/config/flake.nix. Это позволит вам обновить как ваши каналы, так и саму систему в одном действии.

Заключение

Обновление пакетов в NixOS не столь затруднительно, если следовать четкому шаговому процессу. Важно понимать разницу между декларативным и ад-хок подходом к управлению пакетами и быть внимательным к обновлениям ваших каналов. Регулярное обновление системы обеспечит вам актуальность пакетов и устранение уязвимостей в безопасности. Если вы еще не используете flakes, возможно, имеет смысл рассмотреть этот способ, так как он упрощает управление вашей конфигурацией. Пожалуйста, делитесь вашим опытом и вопросами, если они возникнут!

Оцените материал
Добавить комментарий

Капча загружается...