
yo sueloNixOS, Nix versión 1.10. nix-env
, el comando de instalación del administrador de paquetes Nix, crea un nuevogeneracióncada vez que instalas un paquete. De esta manera, las diferentes configuraciones de paquetes se almacenan en generaciones separadas y puede cambiar entre ellas para retroceder a estados anteriores del sistema, donde tenía diferentes paquetes instalados a partir de ahora.
Supongamos que instalé el paquete emacs
, que creó una nueva generación:
$ nix-env --list-generations
1 2015-09-18 14:32:51
2 2015-09-19 15:41:58 (current)
La generación 1 no contiene emacs
, la generación 2 sí. Si cambio a la generación 1 y elimino la generación 2, eso significa que pierdo emacs
:
$ nix-env --switch-generation 1
switching from generation 2 to 1
$ nix-env --delete-generations 2
removing generation 2
La información de --delete-generations
la operación en ejecución es demasiado escasa y agregar --verbose
o --dry-run
no especificar la lista de paquetes eliminados. Incluso -vvvvv
no es útil.
$ 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
¿Pero cómo sé que pierdo emacs
? ¿Existe algún comando o script muy simple para ver una lista de paquetes que perdería si elimino permanentemente una generación? ¿O hay alguna manera de ver una diferencia entre 2 generaciones? Me esfuerzo por encontrar la solución idiomática más simple.
Respuesta1
Esto depende de lo que quieras decir con "perder un paquete".
Suponiendo que te refieres a:
no podrá ejecutar los comandos proporcionados por el paquete después de eliminar la generación
Si elimina un perfil no actual, todos los comandos seguirán ahí. El perfil es autónomo.
Para ver qué contiene el perfil actual:
nix-store --query --references /nix/var/nix/profiles/per-user/$USER/profile
Eso es elperfil del usuario. Para ver el perfil del sistema:
nix-store --query --references /nix/var/nix/profiles/system
Puede que haya una forma más sencilla, pero utilizando lo anterior podemos encontrar la respuesta:
# 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)
Si en cambio te refieres a:
qué paquetes se eliminarán "físicamente"
Creo que es un poco más complicado. Un posible punto de partida es utilizar nix-store --query --roots
en cada paquete del perfil que se va a eliminar.
Respuesta2
No es exactamente lo que necesitas, pero si conoces el número de generación puedes hacer una diferencia entre dos generaciones.
Puede utilizar nix-store -q --references
para recuperar la lista de derivaciones ("paquetes") de las que depende una derivación. ¡Y su 'configuración del sistema' es solo otra derivación!
Básicamente, un ejemplo sería:
diff <(nix-store -q --references /nix/var/nix/profiles/system) <(nix-store -q --references /nix/var/nix/profiles/system-615-link)