- Вопрос или проблема
- Шаг 0. Проверьте и установите последний канал
- Шаг 1. Обновите канал
- Шаг 2. Обновите пакеты
- Примечания
- Кратко use nh с новым --update флагом
- Как обновить каждый пакет на NixOS?
- Сокращение вывода (или если у вас еще нет nh)
- Проблемы с sudo
- Заключение
- Ответ или решение
- Как обновить все пакеты на NixOS
- Шаг 0: Проверьте и настройте последний канал
- Шаг 1: Обновление канала
- Шаг 2: Обновление пакетов
- Особые случаи: использование flakes
- Заключение
Вопрос или проблема
Наконец подобрался к настройке своих систем пару месяцев назад и с тех пор использую их с удовольствием, но понял, что пришло время обновить некоторые вещи. Моя конфигурация NixOS включает в себя декларативное управление пакетами с использованием Home Manager, но я совершенно забыл основы и не был уверен, усложнит ли Home Manager некоторые вещи, поскольку репозиторий упоминает только инструмент home-manager
, который у меня отсутствует.
Кратко
-
Вы находитесь на последнем канале?
(Смотрите, как проверить и установить ниже.) -
sudo nix-channel --update
-
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
)
Но вам может быть удобнее получать меньше информации в выводе. Если это так, тогда вы предпочтете не использовать 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, возможно, имеет смысл рассмотреть этот способ, так как он упрощает управление вашей конфигурацией. Пожалуйста, делитесь вашим опытом и вопросами, если они возникнут!