
я используюNixOS, Nix версии 1.10. nix-env
, Команда установки менеджера пакетов Nix, создает новыйпоколениеКаждый раз, когда вы устанавливаете пакет. Таким образом, различные конфигурации пакетов сохраняются в отдельных поколениях, и вы можете переключаться между ними, чтобы откатиться к предыдущим состояниям системы, где у вас были установлены другие пакеты с этого момента.
Предположим, я установил пакет emacs
, который создал новое поколение:
$ nix-env --list-generations
1 2015-09-18 14:32:51
2 2015-09-19 15:41:58 (current)
Поколение 1 не содержит emacs
, поколение 2 содержит. Если я перейду к поколению 1 и удалю поколение 2, это будет означать, что я потеряю emacs
:
$ nix-env --switch-generation 1
switching from generation 2 to 1
$ nix-env --delete-generations 2
removing generation 2
Информация от запущенной --delete-generations
операции слишком скудна, а добавление --verbose
or --dry-run
не указывает список удаленных пакетов. Даже -vvvvv
не помогает.
$ nix-env --dry-run --delete-generations 14
(dry run; not doing anything)
would remove generation 14
$ nix-env --verbose --dry-run --delete-generations 14
(dry run; not doing anything)
evaluating file ‘/nix/store/13lmbyk148z95sp96gh0vr2b867ypl8g-nix-1.10/share/nix/corepkgs/derivation.nix’
would remove generation 14
Но как я узнаю, что я проигрываю emacs
? Есть ли какая-то команда или очень простой скрипт для просмотра списка пакетов, которые я потеряю, если я навсегда удалю поколение? Или есть ли способ просмотреть разницу между 2 поколениями? Я стремлюсь к самому простому идиоматическому решению.
решение1
Это зависит от того, что вы подразумеваете под «потерей посылки».
Предположим, вы имеете в виду:
не сможет выполнять команды, предоставляемые пакетом, после удаления поколения
Если вы удалите не текущий профиль, все команды останутся. Профиль является самодостаточным.
Чтобы увидеть, что содержит текущий профиль:
nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile
ЭтоПрофиль пользователя. Чтобы просмотреть профиль системы:
nix-store --query --references /nix/var/nix/profiles/system
Возможно, есть более простой способ, но, используя вышеизложенное, мы можем найти ответ:
# Replace $1 by previous profile number
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile} > /tmp/current-packages
nix-store --query --references /nix/var/nix/profiles/{system,per-user/$USER/profile-$1-link} > /tmp/prev-packages
# The packages "lost" by changing profile from current to profile-$1-link is the set difference
comm -32 <(sort /tmp/current-packages) <(sort /tmp/prev-packages)
Если вы имеете в виду:
какие пакеты будут «физически» удалены
Я думаю, что это немного сложнее. Возможная отправная точка — использовать nix-store --query --roots
на каждом пакете в профиле, который нужно удалить.
решение2
Не совсем то, что вам нужно, но если вы знаете номер поколения, вы можете провести различие между двумя поколениями.
Вы можете использовать nix-store -q --references
для получения списка производных ('пакетов'), от которых зависит производная. И ваша 'конфигурация системы' - это просто еще одна производная!
По сути, вот пример:
diff <(nix-store -q --references /nix/var/nix/profiles/system) <(nix-store -q --references /nix/var/nix/profiles/system-615-link)