GNU Guix ( / ɡ iː k s / [2] ) es un gestor de paquetes multiplataforma funcional y una herramienta para instanciar y gestionar sistemas operativos tipo Unix , basado en el gestor de paquetes Nix . La configuración y las recetas de paquetes están escritas en Guile Scheme . GNU Guix es el gestor de paquetes predeterminado de la distribución GNU Guix System . [3]
A diferencia de los gestores de paquetes tradicionales , Guix (al igual que Nix) utiliza un modelo de implementación puramente funcional en el que el software se instala en directorios únicos generados a través de hashes criptográficos . Todas las dependencias de cada software se incluyen dentro de cada hash. [4] [5] Esto resuelve el problema del infierno de dependencias , [6] permitiendo que coexistan varias versiones del mismo software, lo que hace que los paquetes sean portátiles y reproducibles . La realización de cálculos científicos en una configuración de Guix se ha propuesto como una respuesta prometedora a la crisis de replicación . [7] [8]
El desarrollo de GNU Guix está entrelazado con el sistema GNU Guix , [9] una distribución de sistema operativo instalable que utiliza el núcleo Linux-libre y el sistema de inicio GNU Shepherd . [10] [11] [12]
Los paquetes de Guix se definen a través de API funcionales de Guile Scheme diseñadas específicamente para la gestión de paquetes. Las dependencias se rastrean directamente en este lenguaje a través de valores especiales llamados "derivaciones" que son evaluados por el demonio de Guix de forma diferida . Guix realiza un seguimiento de estas referencias automáticamente para que los paquetes instalados puedan ser recolectados como basura cuando ningún otro paquete dependa de ellos; a costa de mayores requisitos de almacenamiento, se garantiza que todas las actualizaciones en Guix sean atómicas y se puedan revertir.
La característica de reversión de Guix se hereda del diseño de Nix y rara vez se encuentra en otros sistemas operativos , ya que requiere un enfoque poco ortodoxo sobre cómo debería funcionar el sistema (ver MicroOS ). Sin embargo, el administrador de paquetes Guix, como Nix , se puede usar en muchas distribuciones como Debian y Parabola . [13] [14] Esto también permite que varios usuarios instalen software de forma segura en el mismo sistema sin privilegios de administrador.
En comparación con los administradores de paquetes tradicionales, los almacenes de paquetes de Guix pueden crecer considerablemente y, por lo tanto, requieren más ancho de banda; aunque en comparación con las soluciones de contenedores (como Docker ) que también se emplean comúnmente para resolver el infierno de dependencias , Guix es más ágil y se ajusta a prácticas como no repetirse y fuente única de verdad . Si el usuario elige construir todo desde la fuente, se requiere un espacio de almacenamiento y un ancho de banda aún mayores.
Heredado del diseño de Nix, la mayor parte del contenido del gestor de paquetes se guarda en un directorio /gnu/store donde solo el demonio Guix tiene acceso de escritura. Esto se consigue mediante montajes de enlaces especializados, donde el Store como sistema de archivos se monta como de solo lectura , prohibiendo la interferencia incluso del usuario root, mientras que el demonio Guix vuelve a montar el Store como de lectura/escritura en su propio espacio de nombres privado. Guix habla con este demonio para construir cosas o buscar sustitutos que se guardan todos en el store. Se desaconseja a los usuarios tocar manualmente el store volviéndolo a montar como de escritura, ya que esto anula todo el propósito del store.
Guix, al igual que Nix, tiene funciones de recolección de basura integradas para ayudar a eliminar los elementos muertos del almacén y conservar los activos . [15]
Este es un ejemplo de una definición de paquete para el paquete hello:
( define-public hello ( package ( name "hello" ) ( version "2.10" ) ( source ( origin ( method url-fetch ) ( uri ( string-append "mirror://gnu/hello/hello-" version ".tar.gz" )) ( sha256 ( base32 "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i" )))) ( build-system gnu-build-system ) ( synopsis "Hola, mundo GNU: Un paquete GNU de ejemplo" ) ( description "GNU Hello imprime el mensaje \" ¡Hola, mundo! \" y luego sale. Sirve como un ejemplo de las prácticas de codificación estándar de GNU. Como tal, admite argumentos de línea de comandos, múltiples idiomas, etc." ) ( home-page "https://www.gnu.org/software/hello/" ) ( licencia gpl3+ )))
Está escrito con Guile. Las recetas de paquetes se pueden inspeccionar fácilmente (ejecutando, por ejemplo, guix edit hello ) y modificar en Guix, lo que hace que el sistema sea transparente y muy fácil de modificar.
Heredado del diseño de Nix, toda manipulación de los elementos de la tienda es independiente entre sí, y los directorios de la tienda comienzan con un hash codificado en base32 del código fuente de la derivación junto con sus entradas.
El paquete Guix utiliza generaciones de perfiles, que son una colección de enlaces simbólicos a elementos específicos de la tienda que juntos comprenden lo que el usuario ha instalado en el perfil. Cada vez que se instala o elimina un paquete, se crea una nueva generación.
Por ejemplo, el perfil de un usuario que solo instaló GNU Hello contiene enlaces al elemento de la tienda que contiene la versión de Hello instalada con el guix utilizado actualmente.
Por ejemplo, en la versión c087a90e06d7b9451f802323e24deb1862a21e0f de guix, esto corresponde al siguiente elemento: /gnu/store/md2plii4g5sk66wg9cgwc964l3xwhrm9-hello-2.10 (construido a partir de la receta anterior).
Además de los enlaces simbólicos, cada perfil que construye Guix también contiene una unión de todos los manuales de información, páginas de manual, íconos, fuentes, etc. para que el usuario pueda explorar la documentación y tener acceso a todos los íconos y fuentes instalados.
Los enlaces simbólicos predeterminados a las generaciones de perfiles se almacenan en /var/guix en el sistema de archivos.
El usuario puede crear cualquier cantidad de perfiles invocando guix package -p PROFILE-NAME COMMAND. Se creará un nuevo directorio con el nombre del perfil y los enlaces simbólicos de generación de perfiles en el directorio actual.
El paquete Guix permite volver instantáneamente a una generación de perfil anterior cambiando el enlace simbólico a una generación de perfil anterior. [16] Los perfiles también se almacenan en la tienda, por ejemplo, este elemento es un perfil que contiene hola arriba: /gnu/store/b4wipjlsapvnijmbawl7sh76087vpl4n-profile (construido y activado al ejecutar guix install hello ).
El shell Guix permite al usuario ingresar fácilmente a un entorno donde están presentes todos los paquetes necesarios para el desarrollo de software sin saturar el perfil predeterminado del usuario con dependencias para múltiples proyectos. [17]
Por ejemplo, al ejecutarse se ingresa a un entorno desechable donde está presente todo lo necesario para compilar hello en guix (gcc, guile, etc.).guix shell --development hello
Sin el indicador, solo se instalaría el paquete hello y no sus dependencias de compilación. Esto reemplaza al comando, que instala las dependencias de un paquete de manera predeterminada, ya que se consideró más intuitivo que el comando instalara los paquetes especificados de manera predeterminada y solo instalara las dependencias de desarrollo con un indicador. [18]--developmentguix environment
Si desea un entorno gc-root persistente que no se recolecte basura en la próxima ejecución de guix gc, puede crear una raíz:
Por ejemplo, al ejecutarse se ingresa a un entorno donde todo lo necesario para compilar guix está presente (gcc, guile, etc.) y registrado como raíz en el directorio actual (mediante un enlace simbólico a los elementos en el almacén).guix shell --root=hello-root --development hello
El paquete Guix permite al usuario agrupar elementos de la tienda y generarlos como una imagen binaria de Docker, un tarball reubicable , un archivo de paquete Debian o un binario squashfs . [19]
El gráfico de Guix permite al usuario ver diferentes gráficos de los paquetes y sus dependencias. [20]
GNU Guix System o Guix System [25] [26] (anteriormente conocido como GuixSD [27] ) es una distribución Linux de código abierto , libre y de lanzamiento continuo construida alrededor de Guix, similar a cómo NixOS está construido alrededor de Nix . [28] [29] Permite una configuración declarativa del sistema operativo [30] y permite actualizaciones del sistema que el usuario puede revertir . [31] Utiliza el sistema de inicio GNU Shepherd [32] [33] y el kernel Linux-libre , con el apoyo del kernel GNU Hurd en desarrollo. [34] El 3 de febrero de 2015, la Free Software Foundation agregó la distribución a su lista de distribuciones Linux libres respaldadas. [35]
Las siguientes arquitecturas de CPU son compatibles actualmente: [36]
Los servicios del sistema, que se definen en el esquema Guile, [40] permiten al usuario componer de forma declarativa la configuración de los daemons y los servicios en segundo plano y especificar configuraciones. Esto permite al usuario, dentro de un único archivo de configuración o configuración modularizada, configurar todo el sistema operativo (por ejemplo, tener un proxy Tor , un servidor ssh y un servidor web que sirva guix-web a través de nginx en un puerto específico en el arranque). Pueden: [41]
El sistema Guix utiliza el GNU Daemon Shepherd, anteriormente conocido como "dmd" ("Daemon Managing Daemons"), como su sistema de inicio , que se desarrolla en conjunto con Guix y está escrito y configurable en Guile . [42] Proporciona funcionalidad de espacio de usuario de forma asincrónica como servicios, que bajo Shepherd son funciones genéricas y tipos de datos de objetos que utiliza para extender el sistema operativo base de una manera definida. A diferencia de systemd , un proceso shepherd de espacio de usuario se ejecuta como el usuario. Central para el modelo Shepherd de inicialización de espacio de usuario es el concepto de extensión , una forma de componibilidad mediante la cual los servicios están diseñados para ser superpuestos a otros servicios, aumentándolos con comportamientos más elaborados o especializados según se desee. [43] Esto expresa las relaciones de dependencia basadas en instanciación que se encuentran en muchos sistemas de inicio modernos, [44] lo que hace que el sistema sea modular, pero también permite que los servicios interactúen de manera variable con otros servicios de formas arbitrarias, por ejemplo, un servicio que extiende otros dos servicios, requiriendo solo que uno esté presente, pero extendiendo fácilmente el segundo si se instancia más tarde sin la necesidad de ninguna reconfiguración o configuración adicional.
Shepherd también proporciona servicios virtuales que permiten el envío dinámico sobre una clase de objetos de servicio relacionados, como todos aquellos que instancian un agente de transferencia de correo (MTA) para el sistema. [45] Un sistema gobernado a través del demonio Shepherd puede representar su espacio de usuario como un gráfico acíclico dirigido , con el "servicio del sistema", que es responsable de las primeras fases de arranque e inicialización, como su raíz, y todos los servicios inicializados posteriormente como extensiones de la funcionalidad del servicio del sistema, ya sea directamente o de forma transitiva sobre otros servicios. [43] [46]
Está destinado a ser altamente programable por el administrador del sistema que utiliza Guile, pero también se puede utilizar para gestionar perfiles por usuario de servicios y demonios sin privilegios. [47] Sus servicios y configuración se almacenan de manera uniforme como código Scheme orientado a objetos , y mientras que un conjunto básico de servicios se proporciona con el sistema Guix básico, [48] se pueden declarar de manera flexible nuevos servicios arbitrarios y, a través del sistema de objetos de Guile , GOOPS, los servicios existentes se pueden redefinir a discreción del usuario pidiendo al Shepherd que reescriba dinámicamente los servicios de formas específicas en la instanciación. [49] [50]
GNU Shepherd fue diseñado originalmente para funcionar con GNU Hurd , y luego fue adoptado por Guix System. [51]
Similar a la característica de reversión de Nix , si una actualización del sistema deja a los usuarios con un sistema roto, los usuarios pueden revertir fácilmente paquetes individuales así como el estado completo del sistema con un simple comando: guix package --roll-back
[52]
Esto significa que el tipo de canal estable que es muy común en otras distribuciones de Linux ya no es necesario para los usuarios que están dispuestos a informar un error y esperar unos minutos, cuando intentan actualizar a través de guix pull . Esto se logra mediante una combinación del administrador de paquetes funcional de Guix , que trata cada paquete y configuración del sistema como una entidad inmutable y reproducible, [53] y el sistema de generación que mantiene un historial de configuraciones del sistema como "generaciones". Estas generaciones se almacenan como perfiles separados, que le permiten volver a cualquier configuración anterior, [54] y puede ver estas generaciones con guix package --list-generations
.
Jesse Smith de DistroWatch Weekly revisó GNU Guix System 0.15.0 (en ese momento llamado GuixSD) y dijo: "GuixSD tiene un administrador de paquetes que me gusta", pero criticó el soporte de hardware limitado y su documentación limitada. [55] Desde entonces, la documentación se ha ampliado y mejorado con videos [56] y un libro de cocina [57] en seis idiomas con tutoriales, guías prácticas y ejemplos.
Un área particular donde Guix puede ofrecer al usuario mejoras sobre los gestores de paquetes tradicionales es en el campo de los flujos de trabajo científicos reproducibles, principalmente en Computación de Alto Rendimiento [58] . De esta manera, Guix ofrecería una forma de compartir un entorno computacional reproducible, es decir, Guix utilizando una receta para el software/entorno científico particular proporcionaría toda la información necesaria para describir de forma única el árbol de dependencias para construir y ejecutar ese software [59] . Esto no sería fácil de lograr, por ejemplo, en otros sistemas mixtos con varios gestores de paquetes para cada lenguaje de programación. Sin embargo, esto solo proporciona una condición necesaria pero no suficiente para que los flujos de trabajo científicos sean reproducibles, ya que es necesario incorporar la recopilación y el procesamiento de datos en el flujo de trabajo, si esto se agrega como parte de la receta de Guix, podría satisfacer los estrictos requisitos de reproducibilidad.
El proyecto fue iniciado en junio de 2012 por Ludovic Courtès, uno de los hackers de GNU Guile. [60]
El Proyecto GNU anunció en noviembre de 2012 el primer lanzamiento de GNU Guix, un gestor de paquetes funcional basado en Nix que proporciona, entre otras cosas, API de Guile Scheme . [61]
El 20 de agosto de 2015, se anunció que Guix había sido portado a GNU Hurd . [62]
El proyecto no tiene un cronograma de lanzamiento fijo y hasta ahora se ha lanzado aproximadamente cada 6 meses.
Hay planes para un próximo lanzamiento de la versión 1.5.0 ya que ha habido una brecha de 20 meses desde el lanzamiento de la versión 1.4.0. [63]