\input texinfo
@c ===========================================================================
@c
@c This file was generated with po4a. Translate the source file.
@c
@c ===========================================================================

@c -*-texinfo-*-

@c %**start of header
@setfilename guix.es.info
@documentencoding UTF-8
@settitle Manual de referencia de GNU Guix
@c %**end of header

@include version-es.texi

@c Identifier of the OpenPGP key used to sign tarballs and such.
@set OPENPGP-SIGNING-KEY-ID 3CE464558A84FDC69DB40CFB090B11993D9AEBB5
@set OPENPGP-SIGNING-KEY-URL https://sv.gnu.org/people/viewgpg.php?user_id=15145

@c Base URL for downloads.
@set BASE-URL https://ftp.gnu.org/gnu/guix

@c The official substitute server used by default.
@set SUBSTITUTE-SERVER-1 ci.guix.gnu.org
@set SUBSTITUTE-SERVER-2 bordeaux.guix.gnu.org
@set SUBSTITUTE-URLS https://@value{SUBSTITUTE-SERVER-1} https://@value{SUBSTITUTE-SERVER-2}

@copying
Copyright @copyright{} 2012-2022 Ludovic Courtès@* Copyright @copyright{}
2013, 2014, 2016 Andreas Enge@* Copyright @copyright{} 2013 Nikita
Karetnikov@* Copyright @copyright{} 2014, 2015, 2016 Alex Kost@* Copyright
@copyright{} 2015, 2016 Mathieu Lirzin@* Copyright @copyright{} 2014
Pierre-Antoine Rault@* Copyright @copyright{} 2015 Taylan Ulrich
Bayırlı/Kammer@* Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021
Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020,
2021, 2022 Ricardo Wurmus@* Copyright @copyright{} 2016 Ben Woodcroft@*
Copyright @copyright{} 2016, 2017, 2018, 2021 Chris Marusich@* Copyright
@copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022 Efraim Flashner@*
Copyright @copyright{} 2016 John Darrington@* Copyright @copyright{} 2016,
2017 Nikita Gillmann@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020
Jan Nieuwenhuizen@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020,
2021 Julien Lepiller@* Copyright @copyright{} 2016 Alex ter Weele@*
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher
Baines@* Copyright @copyright{} 2017, 2018, 2019 Clément Lassieur@*
Copyright @copyright{} 2017, 2018, 2020, 2021, 2022 Mathieu Othacehe@*
Copyright @copyright{} 2017 Federico Beffa@* Copyright @copyright{} 2017,
2018 Carlo Zancanaro@* Copyright @copyright{} 2017 Thomas Danckaert@*
Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017,
2021 Christine Lemmer-Webber@* Copyright @copyright{} 2017, 2018, 2019,
2020, 2021, 2022 Marius Bakke@* Copyright @copyright{} 2017, 2019, 2020,
2022 Hartmut Goebel@* Copyright @copyright{} 2017, 2019, 2020, 2021, 2022
Maxim Cournoyer@* Copyright @copyright{} 2017–2022 Tobias Geerinckx-Rice@*
Copyright @copyright{} 2017 George Clemmer@* Copyright @copyright{} 2017
Andy Wingo@* Copyright @copyright{} 2017, 2018, 2019, 2020 Arun Isaac@*
Copyright @copyright{} 2017 nee@* Copyright @copyright{} 2018 Rutger
Helling@* Copyright @copyright{} 2018, 2021 Oleg Pykhalov@* Copyright
@copyright{} 2018 Mike Gerwitz@* Copyright @copyright{} 2018 Pierre-Antoine
Rouby@* Copyright @copyright{} 2018, 2019 Gábor Boskovits@* Copyright
@copyright{} 2018, 2019, 2020, 2022 Florian Pelz@* Copyright @copyright{}
2018 Laura Lazzati@* Copyright @copyright{} 2018 Alex Vong@* Copyright
@copyright{} 2019 Josh Holland@* Copyright @copyright{} 2019, 2020 Diego
Nicola Barbato@* Copyright @copyright{} 2019 Ivan Petkov@* Copyright
@copyright{} 2019 Jakob L. Kreuze@* Copyright @copyright{} 2019 Kyle
Andrews@* Copyright @copyright{} 2019 Alex Griffin@* Copyright @copyright{}
2019, 2020, 2021, 2022 Guillaume Le Vaillant@* Copyright @copyright{} 2020
Liliana Marie Prikler@* Copyright @copyright{} 2019, 2020, 2021, 2022 Simon
Tournier@* Copyright @copyright{} 2020 Wiktor Żelazny@* Copyright
@copyright{} 2020 Damien Cassou@* Copyright @copyright{} 2020 Jakub
Kądziołka@* Copyright @copyright{} 2020 Jack Hill@* Copyright @copyright{}
2020 Naga Malleswari@* Copyright @copyright{} 2020, 2021 Brice Waegeneire@*
Copyright @copyright{} 2020 R Veera Kumar@* Copyright @copyright{} 2020,
2021 Pierre Langlois@* Copyright @copyright{} 2020 pinoaffe@* Copyright
@copyright{} 2020 André Batista@* Copyright @copyright{} 2020, 2021
Alexandru-Sergiu Marton@* Copyright @copyright{} 2020 raingloom@* Copyright
@copyright{} 2020 Daniel Brooks@* Copyright @copyright{} 2020 John Soo@*
Copyright @copyright{} 2020 Jonathan Brielmaier@* Copyright @copyright{}
2020 Edgar Vincent@* Copyright @copyright{} 2021, 2022 Maxime Devos@*
Copyright @copyright{} 2021 B. Wilson@* Copyright @copyright{} 2021 Xinglu
Chen@* Copyright @copyright{} 2021 Raghav Gururajan@* Copyright @copyright{}
2021 Domagoj Stolfa@* Copyright @copyright{} 2021 Hui Lu@* Copyright
@copyright{} 2021 pukkamustard@* Copyright @copyright{} 2021 Alice Brenon@*
Copyright @copyright{} 2021, 2022 Josselin Poiret@* Copyright @copyright{}
2021 muradm@* Copyright @copyright{} 2021, 2022 Andrew Tropin@* Copyright
@copyright{} 2021 Sarah Morgensen@* Copyright @copyright{} 2022 Remco van 't
Veer@* Copyright @copyright{} 2022 Aleksandr Vityazev@* Copyright
@copyright{} 2022 Philip M@sup{c}Grath@* Copyright @copyright{} 2022 Karl
Hallsby@* Copyright @copyright{} 2022 Justin Veilleux@* Copyright
@copyright{} 2022 Reily Siegel@* Copyright @copyright{} 2022 Simon Streit@*
Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@*

Se garantiza el permiso de copia, distribución y/o modificación de este
documento bajo los términos de la licencia de documentación libre de GNU
(GNU Free Documentation License), versión 1.3 o cualquier versión posterior
publicada por la Free Software Foundation; sin secciones invariantes, sin
textos de cubierta delantera ni trasera. Una copia de la licencia está
incluida en la sección titulada ``GNU Free Documentation License''.
@end copying

@dircategory Administración del sistema
@direntry
* Guix: (guix.es).           Gestión del software instalado y la 
                               configuración del sistema.
* guix package: (guix.es)Invocación de guix package.  Instalación, borrado 
                                                         y actualización de 
                                                         paquetes.
* guix gc: (guix.es)Invocación de guix gc.  Recuperar espacio de disco sin 
                                               usar.
* guix pull: (guix.es)Invocación de guix pull.  Actualización de la lista 
                                                   disponible de paquetes.
* guix system: (guix.es)Invocación de guix system.  Gestión de la 
                                                       configuración del 
                                                       sistema operativo.
* guix deploy: (guix.es)Invocación de guix deploy.  Gestión de 
                                                       configuraciones de 
                                                       sistemas operativos en 
                                                       máquinas remotas.
@end direntry

@dircategory Desarrollo de software
@direntry
* guix shell: (guix)Invoking guix shell.  Creating software environments.
* guix environment: (guix.es)Invocación de guix environment.  Construcción 
                                                                 de entornos 
                                                                 de desarrollo 
                                                                 con Guix.
* guix build: (guix.es)Invocación de guix build.  Construcción de 
                                                     paquetes.
* guix pack: (guix.es)Invocación de guix pack.  Creación de empaquetados 
                                                   binarios.
@end direntry

@titlepage
@title Manual de referencia de GNU Guix
@subtitle Uso del gestor de paquetes funcional GNU Guix.
@author Los desarrolladores de GNU Guix

@page
@vskip 0pt plus 1filll
Edición @value{EDITION} @* @value{UPDATED} @*

@insertcopying
@end titlepage

@contents

@c *********************************************************************
@node Top
@top GNU Guix

Este documento describe GNU Guix versión @value{VERSION}, una herramienta
funcional de gestión de paquetes escrita para el sistema GNU.

@c TRANSLATORS: You can replace the following paragraph with information on
@c how to join your own translation team and how to report issues with the
@c translation.
This manual is also available in Simplified Chinese (@pxref{Top,,,
guix.zh_CN, GNU Guix参考手册}), French (@pxref{Top,,, guix.fr, Manuel de
référence de GNU Guix}), German (@pxref{Top,,, guix.de, Referenzhandbuch zu
GNU Guix}), Spanish (@pxref{Top,,, guix.es, Manual de referencia de GNU
Guix}), Brazilian Portuguese (@pxref{Top,,, guix.pt_BR, Manual de referência
do GNU Guix}), and Russian (@pxref{Top,,, guix.ru, Руководство GNU Guix}).
If you would like to translate it in your native language, consider joining
@uref{https://translate.fedoraproject.org/projects/guix/documentation-manual,
Weblate} (@pxref{Traduciendo Guix}).

@menu
* Introducción::            ¿Qué es esto de Guix?
* Instalación::             Instalar Guix.
* Instalación del sistema::  Instalar el sistema operativo completo.
* System Troubleshooting Tips::  When things don't go as planned.
* Empezando::                Sus primeros pasos.
* Gestión de paquetes::     Instalación de paquetes, actualización, etc.
* Canales::                  Personalizar el recolector de basura.
* Desarrollo::               Desarrollo de software asistido por Guix.
* Interfaz programática::   Uso de Guix en Scheme.
* Utilidades::               Órdenes de gestión de paquetes.
* Foreign Architectures::    Build for foreign architectures.
* Configuración del sistema::  Configurar el sistema operativo.
* Home Configuration::       Configuring the home environment.
* Documentación::           Navegar por los manuales de usuaria del 
                               software.
* Platforms::                Defining platforms.
* System Images::            Creating system images.
* Instalación de archivos de depuración::  Alimentación del depurador.
* Using TeX and LaTeX::      Typesetting.
* Actualizaciones de seguridad::  Desplegar correcciones de seguridad 
                                    rápidamente.
* Lanzamiento inicial::      GNU/Linux construido de cero.
* Transportar::              Adaptación para otra plataforma o núcleo.
* Contribuir::               ¡Se necesita su ayuda!

* Reconocimientos::          ¡Gracias!
* Licencia de documentación libre GNU::  La licencia de este manual.
* Índice de conceptos::     Conceptos.
* Índice programático::    Tipos de datos, funciones y variables.

@detailmenu
 --- La lista detallada de nodos ---



Introducción



* Gestión de software con Guix::  Qué es especial.
* Distribución GNU::        Los paquetes y herramientas.

Instalación



* Instalación binaria::     ¡Poner Guix en funcionamiento en nada de 
                               tiempo!
* Requisitos::               Software necesario para construir y ejecutar 
                               Guix.
* Ejecución de la batería de pruebas::  Probar Guix.
* Preparación del daemon::  Preparar el entorno del daemon de 
                               construcción.
* Invocación de guix-daemon::  Ejecutar el daemon de construcción.
* Configuración de la aplicación::  Configuración específica de la 
                                        aplicación.
* Actualizar Guix::          Actualizar Guix y su daemon de construcción.

Preparación del daemon



* Configuración del entorno de construcción::  Preparar el entorno aislado 
                                                   de construcción.
* Configuración de delegación del daemon::  Delegar construcciones a 
                                                máquinas remotas.
* Soporte de SELinux::       Uso de una política SELinux para el daemon.

Instalación del sistema



* Limitaciones::             Qué puede esperar.
* Consideraciones sobre el hardware::  Hardware soportado.
* Instalación desde memoria USB y DVD::  Preparar el medio de instalación.
* Preparación para la instalación::  Red, particionado, etc.
* Instalación gráfica guiada::  Instalación gráfica fácil.
* Instalación manual::      Instalación manual para artistas del teclado.
* Tras la instalación del sistema::  Cuando la instalación ha finalizado 
                                        satisfactoriamente.
* Instalación de Guix en una máquina virtual::  El patio de recreo del 
                                                    sistema Guix.
* Construcción de la imagen de instalación::  Cómo esto llega a ser.

System Troubleshooting Tips



* Chrooting into an existing system::  Fixing things from a chroot

Instalación manual



* Distribución de teclado y red y particionado::  Configuración inicial.
* Procedimiento de instalación::  Instalación.

Gestión de paquetes



* Características::         Cómo Guix dará brillo a su vida.
* Invocación de guix package::  Instalación de paquetes, borrado, etc.
* Sustituciones::            Descargar binarios pre-construidos.
* Paquetes con múltiples salidas::  Un único paquete de fuentes, 
                                       múltiples salidas.
* Invocación de guix gc::   Ejecutar el recolector de basura.
* Invocación de guix pull::  Obtener la última versión de Guix y la 
                                distribución.
* Invocación de guix time-machine::  Ejecutar una versión antigua de Guix.
* Inferiores::               Interactuar con otra revisión de Guix.
* Invocación de guix describe::  Muestra información acerca de su 
                                    revisión de Guix.
* Invocación de guix archive::  Exportar e importar archivos del almacén.

Sustituciones



* Official Substitute Servers::  Una fuente particular de sustituciones.
* Autorización de servidores de sustituciones::  Cómo activar o desactivar 
                                                    las sustituciones.
* Obtención de sustiticiones desde otros servidores::  Diversidad en las 
                                                          sustituciones.
* Verificación de sustituciones::  Cómo verifica las sustituciones Guix.
* Configuración de la pasarela.::  Cómo obtener sustituciones a través de 
                                      una pasarela.
* Fallos en las sustituciones::  Qué pasa cuando una sustitución falla.
* Sobre la confianza en binarios::  ¿Cómo puede confiar en esa masa amorfa 
                                      de datos binarios?

Canales



* Especificación de canales adicionales::  Extensiones para la recolección 
                                              de paquetes.
* Uso de un canal de Guix personalizado::  Uso de un Guix personalizado.
* Replicación de Guix::     Ejecución de @emph{exáctamente el mismo} 
                               Guix.
* Verificación de canales::  Cómo verifica Guix lo que obtiene.
* Channels with Substitutes::  Using channels with available substitutes.
* Creación de un canal::    Cómo escribir su canal personalizado.
* Módulos de paquetes en un subdirectorio::  Especificación de la 
                                                localización de los módulos 
                                                de paquetes del canal.
* Declaración de dependencias de canales::  Cómo depender de otros 
                                               canales.
* Especificación de autorizaciones del canal::  Definición de 
                                                   autorizaciones para autores 
                                                   de canales.
* URL primaria::             Distinción entre un servidor espejo y el 
                               original.
* Escribir de noticias del canal::  Comunicar información a las usuarias 
                                      del canal.

Desarrollo



* Invoking guix shell::      Spawning one-off software environments.
* Invocación de guix environment::  Configurar entornos de desarrollo.
* Invocación de guix pack::  Creación de empaquetados de software.
* La cadena de herramientas de GCC::  Trabajo con lenguajes implementados 
                                        por GCC.
* Invocación de guix git authenticate::  Verificación de repositorios de 
                                            Git.

Interfaz programática



* Módulos de paquetes::     Paquetes bajo el punto de vista del 
                               programador.
* Definición de paquetes::  Definir nuevos paquetes.
* Definición de variantes de paquetes::  Personalización de paquetes.
* Writing Manifests::        The bill of materials of your environment.
* Sistemas de construcción::  Especificar como se construyen los paquetes.
* Fases de construcción::   Fases del proceso de construcción de un 
                               paquete.
* Utilidades de construcción::  Herramientas para sus definiciones de 
                                   paquete y más.
* Search Paths::             Declaring search path environment variables.
* El almacén::              Manipular el almacén de paquetes.
* Derivaciones::             Interfaz de bajo nivel de las derivaciones de 
                               los paquetes.
* La mónada del almacén::  Interfaz puramente funcional del almacén.
* Expresiones-G::            Manipular expresiones de construcción.
* Invocación de guix repl::  Programación de Guix en Guile.
* Using Guix Interactively::  Fine-grain interaction at the REPL.

Definición de paquetes



* Referencia de package::    El tipo de datos de los paquetes.
* Referencia de origin::     El tipo de datos de orígenes.

Utilidades



* Invocación de guix build::  Construir paquetes desde la línea de 
                                 órdenes.
* Invocación de guix edit::  Editar las definiciones de paquetes.
* Invocación de guix download::  Descargar un archivo e imprimir su hash.
* Invocación de guix hash::  Calcular el hash criptográfico de un archivo.
* Invocación de guix import::  Importar definiciones de paquetes.
* Invocación de guix refresh::  Actualizar definiciones de paquetes.
* Invoking guix style::      Styling package definitions.
* Invocación de guix lint::  Encontrar errores en definiciones de paquetes.
* Invocación de guix size::  Perfilar el uso del disco.
* Invocación de guix graph::  Visualizar el grafo de paquetes.
* Invocación de guix publish::  Compartir sustituciones.
* Invocación de guix challenge::  Poner a prueba servidores de 
                                     sustituciones.
* Invocación de guix copy::  Copiar a y desde un almacén remoto.
* Invocación de guix container::  Aislamiento de procesos.
* Invocación de guix weather::  Comprobar la disponibilidad de 
                                   sustituciones.
* Invocación de guix processes::  Enumerar los procesos cliente.

Invocación de @command{guix build}



* Opciones comunes de construcción::  Opciones de construcción para la 
                                         mayoría de órdenes.
* Opciones de transformación de paquetes::  Crear variantes de paquetes.
* Opciones de construcción adicionales::  Opciones específicas de 'guix 
                                             build'.
* Depuración de fallos de construcción::  Experiencia de empaquetamiento 
                                              en la vida real.

Foreign Architectures
* Cross-Compilation::        Cross-compiling for another architecture.
* Native Builds::            Targeting another architecture through native 
                               builds.

Configuración del sistema



* Uso de la configuración del sistema::  Personalizar su sistema GNU.
* Referencia de operating-system::  Detalle de las declaraciones de sistema 
                                      operativo.
* Sistemas de archivos::     Configurar el montaje de sistemas de archivos.
* Dispositivos traducidos::  Procesamiento adicional de dispositivos de 
                               bloques.
* Swap Space::               Backing RAM with disk space.
* Cuentas de usuaria::       Especificar las cuentas de usuaria.
* Distribución de teclado::  Cómo interpreta el sistema las pulsaciones 
                                del teclado.
* Localizaciones::           Configuración de idioma y convenciones 
                               culturales.
* Servicios::                Especificar los servicios del sistema.
* Programas con setuid::     Programs running with elevated privileges.
* Certificados X.509::       Verificar servidores HTTPS.
* Selector de servicios de nombres::  Configurar el selector de servicios de 
                                        nombres de libc.
* Disco en RAM inicial::     Arranque de Linux-Libre.
* Configuración del gestor de arranque::  Configurar el gestor de arranque.
* Invocación de guix system::  Instanciar una configuración del sistema.
* Invocación de guix deploy::  Despliegue de una configuración del sistema 
                                  en una máquina remota.
* Ejecutar Guix en una máquina virtual::  Cómo ejecutar el sistema Guix en 
                                             una máquina virtual.
* Definición de servicios::  Añadir nuevas definiciones de servicios.

Home Environment Configuration



* Invoking guix home::       Instantiating a home environment configuration.

Servicios



* Servicios base::           Servicios esenciales del sistema.
* Ejecución de tareas programadas::  El servicio mcron.
* Rotación del registro de mensajes::  El servicio rottlog.
* Networking Setup::         Setting up network interfaces.
* Servicios de red::         Firewall, SSH daemon, etc.
* Actualizaciones no-atendidas::  Actualizaciones del sistema automatizadas.
* Sistema X Window::         Interfaz gráfica.
* Servicios de impresión::  Uso de impresoras locales y remotas.
* Servicios de escritorio::  D-Bus y servicios de escritorio.
* Servicios de sonido::      Servicios de ALSA y Pulseaudio.
* Servicios de bases de datos::  Bases de datos SQL, almacenes de 
                                   clave-valor, etc.
* Servicios de correo::      IMAP, POP3, SMTP y todo eso.
* Servicios de mensajería::  Servicios de mensajería.
* Servicios de telefonía::  Servicios de telefonía.
* Servicios de monitorización::  Servicios de monitorización.
* Servicios Kerberos::       Servicios Kerberos.
* Servicios LDAP::           Servicios LDAP.
* Servicios Web::            Servidores Web.
* Servicios de certificados::  Certificados TLS via Let's Encrypt.
* Servicios DNS::            Daemon de DNS.
* Servicios VPN::            Daemon de VPN.
* Sistema de archivos en red::  Servicios relacionados con NFS.
* Samba Services::           Samba services.
* Integración continua::    Cuirass and Laminar services.
* Servicios de gestión de energía::  Extender la vida de la batería.
* Servicios de audio::       El MPD.
* Servicios de virtualización::  Servicios de virtualización.
* Servicios de control de versiones::  Proporcionar acceso remoto a 
                                         repositorios Git.
* Servicios de juegos::      Servidores de juegos.
* Servicio PAM Mount::       Servicio de montado de volúmenes en el ingreso 
                               al sistema.
* Servicios de Guix::        Servicios relacionados específicamente con 
                               Guix.
* Servicios de Linux::       Servicios asociados al núcleo Linux.
* Servicios de Hurd::        Servicios específicos para un sistema Hurd.
* Servicios misceláneos::   Otros servicios.

Definición de servicios



* Composición de servicios::  El modelo para la composición de servicios.
* Tipos de servicios y servicios::  Tipos y servicios
* Referencia de servicios::  Referencia de la API.
* Servicios de Shepherd::    Un tipo de servicio particular.
* Complex Configurations::   Defining bindings for complex configurations.

Platforms



* platform Reference::       Detail of platform declarations.
* Supported Platforms::      Description of the supported platforms.

System Images



* image Reference::          Detail of image declarations.
* Instantiate an Image::     How to instantiate an image record.
* image-type Reference::     Detail of image types declaration.
* Image Modules::            Definition of image modules.

Instalación de archivos de depuración



* Información separada para depuración::  Instalación de las salidas 
                                              'debug'.
* Reconstrucción de la información para depuración::  Construir la 
                                                           información de 
                                                           depuración 
                                                           necesaria.

Lanzamiento inicial



* Lanzamiento inicial a partir de la semilla binaria reducida::  Un 
                                                                   lanzamiento 
                                                                   inicial a 
                                                                   la altura 
                                                                   de GNU.
* Preparación para usar los binarios del lanzamiento inicial::  Construcción 
                                                                   de lo que 
                                                                   más 
                                                                   importa.

@end detailmenu
@end menu

@c *********************************************************************
@node Introducción
@chapter Introducción

@cindex propósito
GNU Guix@footnote{``Guix'' se pronuncia tal y como se escribe en castellano,
``ɡiːks'' en el alfabeto fonético internacional (IPA).} es una herramienta
de gestión de paquetes y una distribución del sistema GNU. Guix facilita a
usuarias sin privilegios la instalación, actualización o borrado de paquetes
de software, la vuelta a un conjunto de paquetes previo atómicamente, la
construcción de paquetes desde las fuentes, y ayuda de forma general en la
creación y mantenimiento de entornos software.

@cindex Sistema Guix
@cindex GuixSD, ahora sistema Guix
@cindex Distribución de Sistema Guix, ahora sistema Guix
Puede instalar GNU@tie{}Guix sobre un sistema GNU/Linux existente, donde
complementará las herramientas disponibles sin interferencias
(@pxref{Instalación}), o puede usarse como un sistema operativo en sí
mismo, el @dfn{sistema@tie{}Guix}@footnote{Solíamos referirnos al sistema
Guix como ``Distribución de sistema Guix'' o ``GuixSD''. Ahora consideramos
que tiene más sentido agrupar todo bajo la etiqueta ``Guix'' ya que, después
de todo, el sistema Guix está inmediatamente disponible a través de la orden
@command{guix system}, ¡incluso cuando usa una distribución distinta por
debajo!}. @xref{Distribución GNU}.

@menu
* Gestión de software con Guix::  Qué es especial.
* Distribución GNU::        Los paquetes y herramientas.
@end menu

@node Gestión de software con Guix
@section Gestión de software con Guix

@cindex interfaces de usuaria
Guix provides a command-line package management interface (@pxref{Gestión de paquetes}), tools to help with software development (@pxref{Desarrollo}),
command-line utilities for more advanced usage (@pxref{Utilidades}), as well
as Scheme programming interfaces (@pxref{Interfaz programática}).
@cindex daemon de construcción
Su @dfn{daemon de construcción} es responsable de la construcción de
paquetes en delegación de las usuarias (@pxref{Preparación del daemon}) y de
la descarga de binarios preconstruidos de fuentes autorizadas
(@pxref{Sustituciones})

@cindex extensibilidad de la distribución
@cindex personalización, de paquetes
Guix incluye definiciones de paquetes para muchos paquetes GNU y no-GNU,
todos los cuales @uref{https://www.gnu.org/philosophy/free-sw.html, respetan
la libertad de computación de la usuaria}. Es @emph{extensible}: las
usuarias pueden escribir sus propias definiciones de paquetes
(@pxref{Definición de paquetes}) y hacerlas disponibles como módulos
independientes de paquetes (@pxref{Módulos de paquetes}). También es
@emph{personalizable}: las usuarias pueden @emph{derivar} definiciones de
paquetes especializadas de las existentes, inclusive desde la línea de
órdenes (@pxref{Opciones de transformación de paquetes}).

@cindex gestión de paquetes funcional
@cindex aislamiento
En su implementación, Guix utiliza la disciplina de @dfn{gestión de paquetes
funcional} en la que Nix fue pionero (@pxref{Reconocimientos}). En Guix, el
proceso de construcción e instalación es visto como una @emph{función}, en
el sentido matemático. Dicha función toma entradas, como los guiones de
construcción, un compilador, unas bibliotecas y devuelve el paquete
instalado. Como función pura, su resultado únicamente depende de sus
entradas---por ejemplo, no puede hacer referencia a software o guiones que
no fuesen pasados explícitamente como entrada. Una función de construcción
siempre produce el mismo resultado cuando se le proporciona un conjunto de
entradas dado. No puede modificar el entorno del sistema que la ejecuta de
ninguna forma; por ejemplo, no puede crear, modificar o borrar archivos
fuera de sus directorios de construcción e instalación. Esto se consigue
ejecutando los procesos de construcción en entornos aislados (o
@dfn{contenedores}), donde únicamente sus entradas explícitas son visibles.

@cindex almacén
El resultado de las funciones de construcción de paquetes es @dfn{almacenado
en la caché} en el sistema de archivos, en un directorio especial llamado
@dfn{el almacén} (@pxref{El almacén}). Cada paquete se instala en un
directorio propio en el almacén---por defecto, bajo @file{/gnu/store}. El
nombre del directorio contiene el hash de todas las entradas usadas para
construir el paquete; por tanto, cambiar una entrada resulta en un nombre de
directorio distinto.

Esta aproximación es el cimiento de las avanzadas características de Guix:
capacidad para la actualización transaccional y vuelta-atrás de paquetes,
instalación en el ámbito de la usuaria y recolección de basura de paquetes
(@pxref{Características}).


@node Distribución GNU
@section Distribución GNU

@cindex Sistema Guix
Guix viene con una distribución del sistema GNU consistente en su totalidad
de software libre@footnote{El término ``libre'' aquí se refiere a la
@url{https://www.gnu.org/philosophy/free-sw.html,libertad proporcionada a
las usuarias de dicho software}.}. La distribución puede instalarse
independientemente (@pxref{Instalación del sistema}), pero también es posible
instalar Guix como un gestor de paquetes sobre un sistema GNU/Linux
existente (@pxref{Instalación}). Para distinguir entre las dos opciones,
nos referimos a la distribución independiente como el sistema@tie{}Guix.

La distribución proporciona paquetes principales de GNU como GNU libc, GCC y
Binutils, así como muchas aplicaciones GNU y no-GNU. La lista completa de
paquetes disponibles se puede explorar
@url{https://www.gnu.org/software/guix/packages,en línea} o ejecutando
@command{guix package} (@pxref{Invocación de guix package}):

@example
guix package --list-available
@end example

Nuestro objetivo es proporcionar una distribución práctica con 100% software
libre basada en Linux y otras variantes de GNU, con un enfoque en la
promoción y la alta integración de componentes GNU, y un énfasis en
programas y herramientas que ayuden a las usuarias a ejercitar esa libertad.

Actualmente hay paquetes disponibles para las siguientes plataformas:

@table @code

@item x86_64-linux
Arquitectura @code{x86_64} de Intel/AMD, con núcleo Linux-Libre.

@item i686-linux
Arquitectura de 32-bits Intel (IA32), con núcleo Linux-Libre.

@item armhf-linux
Arquitectura ARMv7-A con coma flotante hardware, Thumb-2 y NEON, usando la
interfaz binaria de aplicaciones (ABI) EABI con coma flotante hardware, y
con el núcleo Linux-Libre.

@item aarch64-linux
procesadores ARMv8-A de 64 bits little-endian, con el núcleo Linux-Libre.

@item i586-gnu
@uref{https://hurd.gnu.org, GNU/Hurd} en la arquitectura Intel de 32 bits
(IA32).

Esta configuración es experimental y se encuentra en desarrollo. La forma
más fácil de probarla es configurando una instancia del servicio
@code{hurd-vm-service-type} en su máquina GNU/Linux
(@pxref{transparent-emulation-qemu, @code{hurd-vm-service-type}}).
¡@xref{Contribuir} para informarse sobre cómo ayudar!

@item mips64el-linux (unsupported)
little-endian 64-bit MIPS processors, specifically the Loongson series, n32
ABI, and Linux-Libre kernel.  This configuration is no longer fully
supported; in particular, there is no ongoing work to ensure that this
architecture still works.  Should someone decide they wish to revive this
architecture then the code is still available.

@item powerpc-linux (unsupported)
big-endian 32-bit PowerPC processors, specifically the PowerPC G4 with
AltiVec support, and Linux-Libre kernel.  This configuration is not fully
supported and there is no ongoing work to ensure this architecture works.

@item powerpc64le-linux
little-endian 64-bit Power ISA processors, Linux-Libre kernel.  This
includes POWER9 systems such as the
@uref{https://www.fsf.org/news/talos-ii-mainboard-and-talos-ii-lite-mainboard-now-fsf-certified-to-respect-your-freedom,
RYF Talos II mainboard}. This platform is available as a "technology
preview": although it is supported, substitutes are not yet available from
the build farm (@pxref{Sustituciones}), and some packages may fail to build
(@pxref{Seguimiento de errores y parches}).  That said, the Guix community is
actively working on improving this support, and now is a great time to try
it and get involved!

@item riscv64-linux
little-endian 64-bit RISC-V processors, specifically RV64GC, and Linux-Libre
kernel. This platform is available as a "technology preview": although it is
supported, substitutes are not yet available from the build farm
(@pxref{Sustituciones}), and some packages may fail to build (@pxref{Seguimiento de errores y parches}).  That said, the Guix community is actively working on
improving this support, and now is a great time to try it and get involved!

@end table

Con el sistema@tie{}Guix, @emph{declara} todos los aspectos de la
configuración del sistema y Guix se hace cargo de instanciar la
configuración de manera transaccional, reproducible y sin estado global
(@pxref{Configuración del sistema}). El sistema Guix usa el núcleo Linux-libre,
el sistema de inicialización Shepherd (@pxref{Introducción,,, shepherd, The
GNU Shepherd Manual}), las conocidas utilidades y herramientas de
compilación GNU, así como el entorno gráfico o servicios del sistema de su
elección. 

Guix System is available on all the above platforms except
@code{mips64el-linux}, @code{powerpc-linux}, @code{powerpc64le-linux} and
@code{riscv64-linux}.

@noindent
Para información sobre el transporte a otras arquitecturas o núcleos,
@pxref{Transportar}.

La construcción de esta distribución es un esfuerzo cooperativo, ¡y esta
invitada a unirse! @xref{Contribuir}, para información sobre cómo puede
ayudar.


@c *********************************************************************
@node Instalación
@chapter Instalación

@cindex instalar Guix

@quotation Nota
Recomendamos el uso de este
@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh,
guión de instalación} para instalar Guix sobre un sistema GNU/Linux en
ejecución, de aquí en adelante referido como una @dfn{distribución
distinta}.@footnote{Esta sección está dedicada a la instalación del gestor
de paquetes, que puede realizarse sobre un sistema GNU/Linux ya en
ejecución. Si, en vez de eso, desea instalar el sistema operativo GNU
completo, @pxref{Instalación del sistema}.} El guión automatiza la descarga,
instalación y configuración inicial de Guix. Debe ejecutarse como la usuaria
de administración root.
@end quotation

@cindex distribución distinta
@cindex directorios relacionados con una distribución distinta
Cuando está instalado sobre una distribución distinta, GNU@tie{}Guix
complementa las herramientas disponibles sin interferencias. Sus datos
radican exclusivamente en dos directorios, normalmente @file{/gnu/store} y
@file{/var/guix}; otros archivos en su sistema, como @file{/etc}, permanecen
intactos.

Una vez instalado, Guix puede ser actualizado ejecutando @command{guix pull}
(@pxref{Invocación de guix pull}.

Si prefiere realizar los pasos de instalación manualmente o desea
personalizarlos, puede encontrar útiles las siguientes
instrucciones. Describen los requisitos de software de Guix, así como su
instalación manual y la preparación para su uso.

@menu
* Instalación binaria::     ¡Poner Guix en funcionamiento en nada de 
                               tiempo!
* Requisitos::               Software necesario para construir y ejecutar 
                               Guix.
* Ejecución de la batería de pruebas::  Probar Guix.
* Preparación del daemon::  Preparar el entorno del daemon de 
                               construcción.
* Invocación de guix-daemon::  Ejecutar el daemon de construcción.
* Configuración de la aplicación::  Configuración específica de la 
                                        aplicación.
* Actualizar Guix::          Actualizar Guix y su daemon de construcción.
@end menu

@node Instalación binaria
@section Instalación binaria

@cindex instalar Guix desde binarios
@cindex guión del instalador
Esta sección describe cómo instalar Guix en un sistema arbitrario desde un
archivador autocontenido que proporciona los binarios para Guix y todas sus
dependencias. Esto es normalmente más rápido que una instalación desde las
fuentes, la cual es descrita en las siguientes secciones. El único requisito
es tener GNU@tie{}tar y Xz.

@c Note duplicated from the ``Installation'' node.
@quotation Nota
Le recomendamos el uso de este
@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh,
guión de instalación}. Automatiza la descarga, instalación y los pasos
iniciales de configuración descritos a continuación. Debe ser ejecutarse
como root. Mediante el uso de dicha cuenta puede ejecutar esto:

@example
cd /tmp
wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
chmod +x guix-install.sh
./guix-install.sh
@end example

If you're running Debian or a derivative such as Ubuntu, you can instead
install the package (it might be a version older than @value{VERSION} but
you can update it afterwards by running @samp{guix pull}):

@example
sudo apt install guix
@end example

Likewise on openSUSE:

@example
sudo zypper install guix
@end example

Cuando haya terminado, @pxref{Configuración de la aplicación} para obtener información
adicional que pueda necesitar, ¡y @ref{Empezando} para sus primeros
pasos!
@end quotation

La instalación consiste más o menos en los siguientes pasos:

@enumerate
@item
@cindex descargar el binario de Guix
Descargue el archivador con los binarios de
@indicateurl{@value{BASE-URL}/guix-binary-@value{VERSION}.x86_64-linux.tar.xz},
donde, por ejemplo, @code{x86_64-linux} puede sustituirse por
@code{i686-linux} para una máquina @code{i686} (32 bits) que ejecute el
núcleo Linux (@pxref{Distribución GNU}).

@c The following is somewhat duplicated in ``System Installation''.
Asegúrese de descargar el archivo @file{.sig} asociado y de verificar la
autenticidad del archivador con él, más o menos así:

@example
$ wget @value{BASE-URL}/guix-binary-@value{VERSION}.x86_64-linux.tar.xz.sig
$ gpg --verify guix-binary-@value{VERSION}.x86_64-linux.tar.xz.sig
@end example

Si la orden falla porque no dispone de la clave pública necesaria, entonces
ejecute esta otra orden para importarla:

@example
$ wget '@value{OPENPGP-SIGNING-KEY-URL}' \
      -qO - | gpg --import -
@end example

@noindent
y vuelva a ejecutar la orden @code{gpg --verify}.

Tenga en cuenta que un aviso del tipo ``Esta clave no esta certificada con
una firma de confianza'' es normal.

@c end authentication part

@item
Ahora necesita convertirse en la usuaria @code{root}. Dependiendo de su
distribución, puede que tenga que ejecutar @code{su -} o @code{sudo
-i}. Como @code{root}, ejecute:

@example
# cd /tmp
# tar --warning=no-timestamp -xf \
     /ruta/a/guix-binary-@value{VERSION}.x86_64-linux.tar.xz
# mv var/guix /var/ && mv gnu /
@end example

Esto crea @file{/gnu/store} (@pxref{El almacén}) y @file{/var/guix}. El
último contiene un perfil listo para usar para @code{root} (véase el
siguiente paso).

@emph{No} extraiga el archivador en un sistema Guix ya funcionando ya que
sobreescribiría sus propios archivos esenciales.

La opción @option{--warning=no-timestamp} asegura que GNU@tie{}tar no emite
avisos sobre ``marcas de tiempo imposibles'' (dichos avisos eran emitidos
por GNU@tie{}tar 1.26 y anteriores; las versiones recientes están
bien). Parten del hecho de que todos los archivos en el archivador tienen su
tiempo de modificación con valor uno (que significa el 1 de enero de
1970). Esto se hace de manera voluntaria para asegurarse de que el contenido
del archivador es independiente de su fecha de creación, haciendolo por
tanto reproducible.

@item
Ponga disponible el perfil en @file{~root/.config/guix/current}, que es
donde @command{guix pull} instalará las actualizaciones (@pxref{Invocación de guix pull}):

@example
# mkdir -p ~root/.config/guix
# ln -sf /var/guix/profiles/per-user/root/current-guix \
         ~root/.config/guix/current
@end example

Cargue @file{etc/profile} para aumentar @env{PATH} y otras variables de
entorno relevantes:

@example
# GUIX_PROFILE="`echo ~root`/.config/guix/current" ; \
  source $GUIX_PROFILE/etc/profile
@end example

@item
Cree el grupo y las cuentas de usuaria para las usuarias de construcción
como se explica a continuación (@pxref{Configuración del entorno de construcción}).

@item
Ejecute el daemon, y configure su inicio automático durante el arranque.

Si su distribución anfitriona usa el sistema de inicio systemd, puede
hacerlo con las siguientes órdenes:

@c Versions of systemd that supported symlinked service files are not
@c yet widely deployed, so we should suggest that users copy the service
@c files into place.
@c
@c See this thread for more information:
@c https://lists.gnu.org/archive/html/guix-devel/2017-01/msg01199.html

@example
# cp ~root/.config/guix/current/lib/systemd/system/gnu-store.mount \
     ~root/.config/guix/current/lib/systemd/system/guix-daemon.service \
     /etc/systemd/system/
# systemctl enable --now gnu-store.mount guix-daemon
@end example

You may also want to arrange for @command{guix gc} to run periodically:

@example
# cp ~root/.config/guix/current/lib/systemd/system/guix-gc.service \
     ~root/.config/guix/current/lib/systemd/system/guix-gc.timer \
     /etc/systemd/system/
# systemctl enable --now guix-gc.timer
@end example

You may want to edit @file{guix-gc.service} to adjust the command line
options to fit your needs (@pxref{Invocación de guix gc}).

Si su distribución anfitriona usa el sistema de inicio Upstart:

@example
# initctl reload-configuration
# cp ~root/.config/guix/current/lib/upstart/system/guix-daemon.conf \
     /etc/init/
# start guix-daemon
@end example

En otro caso, todavía puede iniciar el daemon manualmente con:

@example
# ~root/.config/guix/current/bin/guix-daemon \
       --build-users-group=guixbuild
@end example

@item
Haga accesible la orden @command{guix} a otras usuarias de la máquina, por
ejemplo con:

@example
# mkdir -p /usr/local/bin
# cd /usr/local/bin
# ln -s /var/guix/profiles/per-user/root/current-guix/bin/guix
@end example

Es también una buena idea poner disponible la versión Info de este manual
ahí:

@example
# mkdir -p /usr/local/share/info
# cd /usr/local/share/info
# for i in /var/guix/profiles/per-user/root/current-guix/share/info/* ;
  do ln -s $i ; done
@end example

De este modo, asumiendo que @file{/usr/local/share/info} está en la ruta de
búsqueda, ejecutar @command{info guix.es} abrirá este manual (@pxref{Other Info Directories,,, texinfo, GNU Texinfo}, para más detalles sobre cómo
cambiar la ruta de búsqueda de Info).

@item
@cindex sustituciones, autorización de las mismas
To use substitutes from @code{@value{SUBSTITUTE-SERVER-1}},
@code{@value{SUBSTITUTE-SERVER-2}} or a mirror (@pxref{Sustituciones}),
authorize them:

@example
# guix archive --authorize < \
     ~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER-1}.pub
# guix archive --authorize < \
     ~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER-2}.pub
@end example

@quotation Nota
If you do not enable substitutes, Guix will end up building
@emph{everything} from source on your machine, making each installation and
upgrade very expensive.  @xref{Sobre la confianza en binarios}, for a discussion of
reasons why one might want do disable substitutes.
@end quotation

@item
Cada usuaria puede necesitar dar algunos pasos adicionales para preparar su
entorno de Guix para el uso diario, @pxref{Configuración de la aplicación}.
@end enumerate

Voilà, ¡la instalación está completa!

Puede confirmar que Guix está funcionando instalando un paquete de ejemplo
en su perfil de root:

@example
# guix install hello
@end example

El archivador de la instalación binaria puede ser (re)producido y verificado
simplemente ejecutando la siguiente orden en el árbol de fuentes de Guix:

@example
make guix-binary.@var{sistema}.tar.xz
@end example

@noindent
...@: que a su vez ejecuta:

@example
guix pack -s @var{sistema} --localstatedir \
  --profile-name=current-guix guix
@end example

@xref{Invocación de guix pack}, para más información sobre esta útil herramienta.

@node Requisitos
@section Requisitos

Esta sección enumera los requisitos para construir Guix desde las
fuentes. El procedimiento de construcción de Guix es el mismo que el de otro
software GNU, y no está cubierto aquí. Por favor, eche un vistazo a los
archivos @file{README} y @file{INSTALL} en el árbol de fuentes de Guix para
obtener detalles adicionales.

@cindex sitio web oficial
GNU Guix está disponible para descarga desde su sitio web en
@url{http://www.gnu.org/software/guix/}.

GNU Guix depende de los siguientes paquetes:

@itemize
@item @url{https://gnu.org/software/guile/, GNU Guile}, version 3.0.x,
version 3.0.3 or later;
@item @url{https://notabug.org/cwebber/guile-gcrypt, Guile-Gcrypt}, versión
0.1.0 o posterior;
@item
@uref{https://gitlab.com/gnutls/guile/, Guile-GnuTLS} (@pxref{Guile Preparations, how to install the GnuTLS bindings for Guile,, gnutls-guile,
GnuTLS-Guile})@footnote{The Guile bindings to @uref{https://gnutls.org/,
GnuTLS} were distributed as part of GnuTLS until version 3.7.8 included.};
@item
@uref{https://notabug.org/guile-sqlite3/guile-sqlite3, Guile-SQLite3},
versión 0.1.0 o posterior;
@item @uref{https://notabug.org/guile-zlib/guile-zlib, Guile-zlib},
version 0.1.0 or later;
@item @uref{https://notabug.org/guile-lzlib/guile-lzlib, Guile-lzlib};
@item @uref{https://www.nongnu.org/guile-avahi/, Guile-Avahi};
@item
@uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, version 0.5.0 or
later;
@item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON}
4.3.0 o posterior;
@item @url{https://www.gnu.org/software/make/, GNU Make}.
@end itemize

Las siguientes dependencias son opcionales:

@itemize
@item
@c Note: We need at least 0.13.0 for #:nodelay.
La delegación de construcciones (@pxref{Configuración de delegación del daemon}) y
@command{guix copy} (@pxref{Invocación de guix copy}) dependen de
@uref{https://github.com/artyom-poptsov/guile-ssh, Guile-SSH}, versión
0.13.0 o posterior.

@item
@uref{https://notabug.org/guile-zstd/guile-zstd, Guile-zstd}, for zstd
compression and decompression in @command{guix publish} and for substitutes
(@pxref{Invocación de guix publish}).

@item
@uref{https://ngyro.com/software/guile-semver.html, Guile-Semver} for the
@code{crate} importer (@pxref{Invocación de guix import}).

@item
@uref{https://www.nongnu.org/guile-lib/doc/ref/htmlprag/, Guile-Lib} for the
@code{go} importer (@pxref{Invocación de guix import}) and for some of the
``updaters'' (@pxref{Invocación de guix refresh}).

@item
Cuando @url{http://www.bzip.org, libbz2} está disponible, @command{guix
daemon} puede usarla para comprimir los registros de construcción.
@end itemize

Si no se ha proporcionado @option{--disable-daemon} a @command{configure},
los siguientes paquetes también son necesarios:

@itemize
@item @url{https://gnupg.org/, GNU libgcrypt};
@item @url{https://sqlite.org, SQLite 3};
@item @url{https://gcc.gnu.org, g++ de GCC}, con implementación
del estándar C++11
@end itemize

@cindex directorio de estado
Cuando se configura Guix en un sistema que ya tiene una instalación de Guix,
asegúrese de especificar el mismo directorio de estado que el de la
instalación existente usando la opción @option{--localstatedir} al guión
@command{configure} (@pxref{Directory Variables, @code{localstatedir},,
standards, GNU Coding Standards}). Habitualmente, esta opción
@var{localstatedir} tiene el valor @file{/var}. El guión @command{configure}
le proteje ante una mala configuración no deseada de @var{localstatedir} de
modo que no pueda corromper inadvertidamente su almacén (@pxref{El almacén}).

@node Ejecución de la batería de pruebas
@section Ejecución de la batería de pruebas

@cindex batería de pruebas
Después de una ejecución exitosa de @command{configure} y @code{make}, es
una buena idea ejecutar la batería de pruebas. Puede ayudar a encontrar
problemas con la configuración o el entorno, o errores en el mismo Guix---e
informar de fallos en las pruebas es realmente una buena forma de ayudar a
mejorar el software. Para ejecutar la batería de pruebas, teclee:

@example
make check
@end example

Los casos de prueba pueden ejecutarse en paralelo: puede usar la opción
@code{-j} de GNU@tie{}make para acelerar las cosas. La primera ejecución
puede tomar algunos minutos en una máquina reciente; las siguientes
ejecuciones serán más rápidas puesto que el almacén creado para las pruebas
ya tendrá varias cosas en la caché.

También es posible ejecutar un subconjunto de las pruebas definiendo la
variable de makefile @code{TESTS} como en el ejemplo:

@example
make check TESTS="tests/store.scm tests/cpio.scm"
@end example

Por defecto, los resultados de las pruebas se muestran a nivel de
archivo. Para ver los detalles de cada caso de prueba individual, es posible
definir la variable de makefile @code{SCM_LOG_DRIVER_FLAGS} como en el
ejemplo:

@example
make check TESTS="tests/base64.scm" SCM_LOG_DRIVER_FLAGS="--brief=no"
@end example

The underlying SRFI 64 custom Automake test driver used for the 'check' test
suite (located at @file{build-aux/test-driver.scm}) also allows selecting
which test cases to run at a finer level, via its @option{--select} and
@option{--exclude} options.  Here's an example, to run all the test cases
from the @file{tests/packages.scm} test file whose names start with
``transaction-upgrade-entry'':

@example
export SCM_LOG_DRIVER_FLAGS="--select=^transaction-upgrade-entry"
make check TESTS="tests/packages.scm"
@end example

Those wishing to inspect the results of failed tests directly from the
command line can add the @option{--errors-only=yes} option to the
@code{SCM_LOG_DRIVER_FLAGS} makefile variable and set the @code{VERBOSE}
Automake makefile variable, as in:

@example
make check SCM_LOG_DRIVER_FLAGS="--brief=no --errors-only=yes" VERBOSE=1
@end example

The @option{--show-duration=yes} option can be used to print the duration of
the individual test cases, when used in combination with
@option{--brief=no}:

@example
make check SCM_LOG_DRIVER_FLAGS="--brief=no --show-duration=yes"
@end example

@xref{Parallel Test Harness,,,automake,GNU Automake} for more information
about the Automake Parallel Test Harness.

En caso de fallo, le rogamos que envíe un correo a @email{bug-guix@@gnu.org}
y adjunte el archivo @file{test-suite.log}. Por favor, especifique la
versión de Guix usada así como los números de versión de las dependencias
(@pxref{Requisitos}) en su mensaje.

Guix también viene como una batería de pruebas del sistema completo que
prueban instancias completas del sistema Guix. Se puede ejecutar únicamente
en sistemas donde Guix ya está instalado, usando:

@example
make check-system
@end example

@noindent
o, de nuevo, definiendo @code{TESTS} para seleccionar un subconjunto de las
pruebas a ejecutar:

@example
make check-system TESTS="basic mcron"
@end example

Estas pruebas de sistema están definidas en los módulos @code{(gnu tests
@dots{})}. Funcionan ejecutando el sistema operativo con una instrumentación
ligera en una máquina virtual (VM). Pueden ser computacionalmente intensivas
o bastante baratas, dependiendo de si hay sustituciones disponibles para sus
dependencias (@pxref{Sustituciones}). Algunas requieren mucho espacio de
almacenamiento para alojar las imágenes de la máquina virtual.

De nuevo, en caso de fallos en las pruebas, le rogamos que envíe a
@email{bug-guix@@gnu.org} todos los detalles.

@node Preparación del daemon
@section Preparación del daemon

@cindex daemon
Operaciones como la construcción de un paquete o la ejecución del recolector
de basura son realizadas por un proceso especializado, el @dfn{daemon de
construcción}, en delegación de sus clientes. Únicamente el daemon puede
acceder al almacén y su base de datos asociada. Por tanto, cualquier
operación que manipula el almacén se realiza a través del daemon. Por
ejemplo, las herramientas de línea de órdenes como @command{guix package} y
@command{guix build} se comunican con el daemon (@i{via} llamadas a
procedimientos remotos) para indicarle qué hacer.

Las siguientes secciones explican cómo preparar el entorno del daemon de
construcción. Véase también @ref{Sustituciones}, para información sobre cómo
permitir al daemon descargar binarios pre-construidos.

@menu
* Configuración del entorno de construcción::  Preparar el entorno aislado 
                                                   de construcción.
* Configuración de delegación del daemon::  Delegar construcciones a 
                                                máquinas remotas.
* Soporte de SELinux::       Uso de una política SELinux para el daemon.
@end menu

@node Configuración del entorno de construcción
@subsection Configuración del entorno de construcción

@cindex entorno de construcción
En una configuración multiusuaria estándar, Guix y su daemon---el programa
@command{guix-daemon}---son instalados por la administradora del sistema;
@file{/gnu/store} pertenece a @code{root} y @command{guix-daemon} se ejecuta
como @code{root}. Usuarias sin privilegios pueden usar las herramientas de
Guix para construir paquetes o acceder al almacén de otro modo, y el daemon
lo hará en delegación suya, asegurando que el almacén permanece en un estado
consistente, y permitiendo compartir entre usuarias los paquetes
construidos.

@cindex usuarias de construcción
Mientras que @command{guix-daemon} se ejecuta como @code{root}, puede que no
desee que los procesos de construcción de paquetes se ejecuten como
@code{root} también, por razones de seguridad obvias. Para evitarlo, una
reserva especial de @dfn{usuarias de construcción} debe ser creada para ser
usada por los procesos de construcción iniciados por el daemon. Estas
usuarias de construcción no necesitan tener un intérprete ni un directorio
home: simplemente serán usadas cuando el daemon se deshaga de los
privilegios de @code{root} en los procesos de construcción. Tener varias de
dichas usuarias permite al daemon lanzar distintos procesos de construcción
bajo UID separados, lo que garantiza que no interferirán entre ellos---una
característica esencial ya que las construcciones se caracterizan como
funciones puras (@pxref{Introducción}).

En un sistema GNU/Linux, una reserva de usuarias de construcción puede ser
creada así (usando la sintaxis de Bash y las órdenes de @code{shadow}):

@c See https://lists.gnu.org/archive/html/bug-guix/2013-01/msg00239.html
@c for why `-G' is needed.
@example
# groupadd --system guixbuild
# for i in $(seq -w 1 10);
  do
    useradd -g guixbuild -G guixbuild           \
            -d /var/empty -s $(which nologin)   \
            -c "Guix build user $i" --system    \
            guixbuilder$i;
  done
@end example

@noindent
El número de usuarias de construcción determina cuantos trabajos de
construcción se pueden ejecutar en paralelo, especificado por la opción
@option{--max-jobs} (@pxref{Invocación de guix-daemon,
@option{--max-jobs}}). Para usar @command{guix system vm} y las órdenes
relacionadas, puede necesitar añadir las usuarias de construcción al grupo
@code{kvm} para que puedan acceder a @file{/dev/kvm}, usando @code{-G
guixbuild,kvm} en vez de @code{-G guixbuild} (@pxref{Invocación de guix system}).

The @code{guix-daemon} program may then be run as @code{root} with the
following command@footnote{If your machine uses the systemd init system,
copying the @file{@var{prefix}/lib/systemd/system/guix-daemon.service} file
to @file{/etc/systemd/system} will ensure that @command{guix-daemon} is
automatically started.  Similarly, if your machine uses the Upstart init
system, copy the @file{@var{prefix}/lib/upstart/system/guix-daemon.conf}
file to @file{/etc/init}.}:

@example
# guix-daemon --build-users-group=guixbuild
@end example

@cindex chroot
@noindent
De este modo, el daemon inicia los procesos de construcción en un
``chroot'', bajo una de las usuarias @code{guixbuilder}. En GNU/Linux, por
defecto, el entorno ``chroot'' contiene únicamente:

@c Keep this list in sync with libstore/build.cc! -----------------------
@itemize
@item
un directorio @code{/dev} mínimo, creado en su mayor parte
independientemente del @code{/dev} del sistema anfitrión@footnote{``En su
mayor parte'' porque, mientras el conjunto de archivos que aparecen en
@code{/dev} es fijo, la mayor parte de estos archivos solo pueden ser
creados si el sistema anfitrión los tiene.};

@item
el directorio @code{/proc}; únicamente muestra los procesos del contenedor
ya que se usa un espacio de nombres de PID separado;

@item
@file{/etc/passwd} con una entrada para la usuaria actual y una entrada para
la usuaria @file{nobody};

@item
@file{/etc/groups} con una entrada para el grupo de la usuaria;

@item
@file{/etc/hosts} con una entrada que asocia @code{localhost} a
@code{127.0.0.1};

@item
un directorio @file{/tmp} con permisos de escritura.
@end itemize

The chroot does not contain a @file{/home} directory, and the @env{HOME}
environment variable is set to the non-existent @file{/homeless-shelter}.
This helps to highlight inappropriate uses of @env{HOME} in the build
scripts of packages.

Puede influir en el directorio que el daemon utiliza para almacenar los
árboles de construcción a través de la variable de entorno @env{TMPDIR}. No
obstante, el árbol de construcción en el ``chroot'' siempre se llama
@file{/tmp/guix-build-@var{nombre}.drv-0}, donde @var{nombre} es el nombre
de la derivación---por ejemplo, @code{coreutils-8.24}. De este modo, el
valor de @env{TMPDIR} no se escapa a los entornos de construcción, lo que
evita discrepancias en caso de que los procesos de construcción capturen el
nombre de su árbol de construcción.

@vindex http_proxy
@vindex https_proxy
El daemon también respeta la variable de entorno @env{http_proxy} y
@env{https_proxy} para las descargas HTTP y HTTPS que realiza, ya sea para
derivaciones de salida fija (@pxref{Derivaciones}) o para sustituciones
(@pxref{Sustituciones}).

Si está instalando Guix como una usuaria sin privilegios, es posible todavía
ejecutar @command{guix-daemon} siempre que proporcione el parámetro
@option{--disable-chroot}. No obstante, los procesos de construcción no
estarán aislados entre sí ni del resto del sistema. Por tanto, los procesos
de construcción pueden interferir entre ellos y pueden acceder a programas,
bibliotecas y otros archivos disponibles en el sistema---haciendo mucho más
difícil verlos como funciones @emph{puras}.


@node Configuración de delegación del daemon
@subsection Uso de la facilidad de delegación de trabajo

@cindex delegación de trabajo
@cindex procedimiento de extensión de construcción
Cuando así se desee, el daemon de construcción puede @dfn{delegar}
construcciones de derivación a otras máquinas ejecutando Guix, usando el
@dfn{procedimiento de extensión de construcción}
@code{offload}@footnote{Esta característica está únicamente disponible
cuando @uref{https://github.com/artyom-potsov/guile-ssh, Guile-SSH} está
presente.}. Cuando dicha característica es activada se lee una lista de
máquinas de construcción especificadas por la usuaria desde
@file{/etc/guix/machines.scm}; cada vez que se solicita una construcción,
por ejemplo via @code{guix build}, el daemon intenta su delegación a una de
las máquinas que satisfaga las condiciones de la derivación, en particular
su tipo de sistema---por ejemplo, @code{x86_64-linux}. Una única máquina
puede usarse para múltiples tipos de sistema, ya sea porque los implemente
su arquitectura de manera nativa, a través de emulación
(@pxref{transparent-emulation-qemu, Transparent Emulation with QEMU}), o
ambas. Los prerrequisitos restantes para la construcción se copian a través
de SSH a la máquina seleccionada, la cual procede con la construcción; con
un resultado satisfactorio la o las salidas de la construcción son copiadas
de vuelta a la máquina inicial. La facilidad de descarga de trabajo
incorpora una planificación básica que intenta seleccionar la mejor máquina,
la cual es seleccionada entre las máquinas disponibles en base a criterios
como los siguientes:

@enumerate
@item
La disponibilidad de un puesto de construcción. Una máquina de construcción
tiene el número de puestos de construcción (conexiones) que indique el valor
de @code{parallel-builds} en su objeto @code{build-machine}.

@item
Su velocidad relativa, a través del campo @code{speed} de su objeto
@code{build-machine}.

@item
Su carga de trabajo. El valor normalizado de carga debe ser menor aun valor
límite, configurable a través del campo @code{overload-threshold} de su
objeto @code{build-machine}.

@item
El espacio disponible en el disco. Debe haber más de 100 MiB disponibles.
@end enumerate

El archivo @file{/etc/guix/machines.scm} normalmente tiene un contenido de
este estilo:

@lisp
(list (build-machine
        (name "ochentayseis.example.org")
        (systems (list "x86_64-linux" "i686-linux"))
        (host-key "ssh-ed25519 AAAAC3Nza@dots{}")
        (user "rober")
        (speed 2.))     ;¡increíblemente rápida!

      (build-machine
        (name "armeight.example.org")
        (systems (list "aarch64-linux"))
        (host-key "ssh-rsa AAAAB3Nza@dots{}")
        (user "alice")

        ;; Remember 'guix offload' is spawned by
        ;; 'guix-daemon' as root.
        (private-key "/root/.ssh/identity-for-guix")))
@end lisp

@noindent
En el ejemplo anterior se especifica una lista de dos máquinas de
construcción, una para las arquitecturas @code{x86_64} y @code{i686}, y otra
para la arquitectura @code{aarch64}.

De hecho, este archivo es---¡sin sorpresa ninguna!---un archivo Scheme que
se evalúa cuando el procedimiento de extensión @code{offload} se inicia. El
valor que devuelve debe ser una lista de objetos
@code{build-machine}. Mientras que este ejemplo muestra una lista fija de
máquinas de construcción, una puede imaginarse, digamos, el uso de DNS-SD
para devolver una lista de máquinas de construcción potenciales descubierta
en la red local (@pxref{Introducción, Guile-Avahi,, guile-avahi, Using Avahi
in Guile Scheme Programs}). El tipo de datos @code{build-machine} se detalla
a continuación.

@deftp {Tipo de datos} build-machine
Este tipo de datos representa las máquinas de construcción a las cuales el
daemon puede delegar construcciones. Los campos importantes son:

@table @code

@item name
El nombre de red de la máquina remota.

@item systems
Los tipos de sistema implementados por la máquina remota---por ejemplo,
@code{(list "x86_64-linux" "i686-linux")}.

@item user
La cuenta de usuaria usada para la conexión a la máquina remota por
SSH. Tenga en cuenta que el par de claves SSH @emph{no} debe estar protegido
por contraseña, para permitir ingresos al sistema no interactivos.

@item host-key
Este campo debe contener la @dfn{clave pública de la máquina} de SSH en
formato OpenSSH. Es usado para autentificar la máquina cuando nos conectamos
a ella. Es una cadena larga más o menos así:

@example
ssh-ed25519 AAAAC3NzaC@dots{}mde+UhL recordatorio@@example.org
@end example

Si la máquina está ejecutando el daemon OpenSSH, @command{sshd}, la clave
pública de la máquina puede encontrarse en un archivo como
@file{/etc/ssh/ssh_host_ed25519_key.pub}.

Si la máquina está ejecutando el daemon SSH GNU@tie{}lsh, @command{lshd}, la
clave de la máquina está en @file{/etc/lsh/host-key.pub} o un archivo
similar. Puede convertirse a formato OpenSSH usando @command{lsh-export-key}
(@pxref{Converting keys,,, lsh, LSH Manual}):

@example
$ lsh-export-key --openssh < /etc/lsh/host-key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAAEOp8FoQAAAQEAs1eB46LV@dots{}
@end example

@end table

Ciertos número de campos opcionales pueden ser especificados:

@table @asis

@item @code{port} (predeterminado: @code{22})
Número de puerto del servidor SSH en la máquina.

@item @code{private-key} (predeterminada: @file{~root/.ssh/id_rsa})
El archivo de clave privada SSH usado para conectarse a la máquina, en
formato OpenSSH. Esta clave no debe estar protegida con una contraseña.

Tenga en cuenta que el valor predeterminado es la clave privada @emph{de la
cuenta de root}. Asegúrese de que existe si usa el valor predeterminado.

@item @code{compression} (predeterminado: @code{"zlib@@openssh.com,zlib"})
@itemx @code{compression-level} (predeterminado: @code{3})
Los métodos de compresión y nivel de compresión a nivel SSH solicitados.

Tenga en cuenta que la delegación de carga depende de la compresión SSH para
reducir el ancho de banda usado cuando se transfieren archivos hacia y desde
máquinas de construcción.

@item @code{daemon-socket} (predeterminado: @code{"/var/guix/daemon-socket/socket"})
Nombre de archivo del socket de dominio Unix en el que @command{guix-daemon}
escucha en esa máquina.

@item @code{overload-threshold} (default: @code{0.8})
El límite superior de carga, el cual se usa en la planificación de
delegación de tareas para descartar potenciales máquinas si superan dicho
límite. Dicho valor más o menos representa el uso del procesador de la
máquina, con un rango de 0.0 (0%) a 1.0 (100%). También se puede desactivar
si se proporciona el valor @code{#f} en @code{overload-threshold}.

@item @code{parallel-builds} (predeterminadas: @code{1})
El número de construcciones que pueden ejecutarse en paralelo en la máquina.

@item @code{speed} (predeterminado: @code{1.0})
Un ``factor de velocidad relativa''. El planificador de delegaciones tenderá
a preferir máquinas con un factor de velocidad mayor.

@item @code{features} (predeterminadas: @code{'()})
Una lista de cadenas denotando las características específicas permitidas
por la máquina. Un ejemplo es @code{"kvm"} para máquinas que tienen los
módulos KVM de Linux y las correspondientes características hardware. Las
derivaciones pueden solicitar las características por nombre, y entonces se
planificarán en las máquinas adecuadas.

@end table
@end deftp

El ejecutable @code{guix} debe estar en la ruta de búsqueda de las máquinas
de construcción. Puede comprobar si es el caso ejecutando:

@example
ssh build-machine guix repl --version
@end example

Hay una última cosa por hacer una vez @file{machines.scm} está en su
lugar. Como se ha explicado anteriormente, cuando se delega, los archivos se
transfieren en ambas direcciones entre los almacenes de las máquinas. Para
que esto funcione, primero debe generar un par de claves en cada máquina
para permitir al daemon exportar los archivos firmados de archivos en el
almacén (@pxref{Invocación de guix archive}):

@example
# guix archive --generate-key
@end example

@noindent
Cada máquina de construcción debe autorizar a la clave de la máquina maestra
para que acepte elementos del almacén que reciba de la maestra:

@example
# guix archive --authorize < clave-publica-maestra.txt
@end example

@noindent
La máquina maestra debe autorizar la clave de cada máquina de construcción
de la misma manera.

Todo este lío con claves está ahí para expresar las mutuas relaciones de
confianza entre pares de la máquina maestra y las máquinas de
construcción. Concretamente, cuando la maestra recibe archivos de una
máquina de construcción (y @i{vice versa}), su daemon de construcción puede
asegurarse de que son genuinos, no han sido modificados, y que están
firmados por una clave autorizada.

@cindex prueba de delegación
Para comprobar si su configuración es operacional, ejecute esta orden en el
nodo maestro:

@example
# guix offload test
@end example

This will attempt to connect to each of the build machines specified in
@file{/etc/guix/machines.scm}, make sure Guix is available on each machine,
attempt to export to the machine and import from it, and report any error in
the process.

Si quiere probar un archivo de máquinas diferente, simplemente lo debe
especificar en la línea de órdenes:

@example
# guix offload test otras-maquinas.scm
@end example

Por último, puede probar un subconjunto de máquinas cuyos nombres coincidan
con una expresión regular así:

@example
# guix offload test maquinas.scm '\.gnu\.org$'
@end example

@cindex estado de delegación
Para mostrar la carga actual de todas las máquinas de construcción, ejecute
esta orden en el nodo principal:

@example
# guix offload status
@end example


@node Soporte de SELinux
@subsection Soporte de SELinux

@cindex SELinux, política del daemon
@cindex control de acceso mandatorio, SELinux
@cindex seguridad, guix-daemon
Guix incluye un archivo de política SELinux en @file{etc/guix-daemon.cil}
que puede ser instalado en un sistema donde SELinux está activado, para
etiquetar los archivos Guix y especificar el comportamiento esperado del
daemon. Ya que el sistema Guix no proporciona una política base de SELinux,
la política del daemon no puede usarse en el sistema Guix.

@subsubsection Instalación de la política de SELinux
@cindex SELinux, instalación de la política
Para instalar la política ejecute esta orden como root:

@example
semodule -i etc/guix-daemon.cil
@end example

Una vez hecho, vuelva a etiquetar el sistema de archivos con
@code{restorecon} o con un mecanismo distinto que proporcione su sistema.

Una vez la política está instalada, el sistema de archivos ha sido
re-etiquetado, y el daemon ha sido reiniciado, debería ejecutarse en el
contexto @code{guix_daemon_t}. Puede confirmarlo con la siguiente orden:

@example
ps -Zax | grep guix-daemon
@end example

Monitorice los archivos de log de SELinux mientras ejecuta una orden como
@code{guix build hello} para convencerse que SELinux permite todas las
operaciones necesarias.

@subsubsection Limitaciones
@cindex SELinux, limitaciones

Esta política no es perfecta. Aquí está una lista de limitaciones o
comportamientos extraños que deben ser considerados al desplegar la política
SELinux provista para el daemon Guix.

@enumerate
@item
@code{guix_daemon_socket_t} isn’t actually used.  None of the socket
operations involve contexts that have anything to do with
@code{guix_daemon_socket_t}.  It doesn’t hurt to have this unused label, but
it would be preferable to define socket rules for only this label.

@item
@code{guix gc} no puede acceder enlaces arbitrarios a los perfiles. Por
diseño, la etiqueta del archivo del destino de un enlace simbólico es
independiente de la etiqueta de archivo del archivo en sí. Aunque todos los
perfiles bajo $localstatedir se etiquetan, los enlaces para estos perfiles
heredan la etiqueta del directorio en el que están. Para enlaces en el
directorio de la usuaria esto será @code{user_home_t}. Pero para los enlaces
del directorio de root, o @file{/tmp}, o del directorio del servidor HTTP,
etc., esto no funcionará. @code{guix gc} se verá incapacitado para leer y
seguir dichos enlaces.

@item
La característica del daemon de esperar conexiones TCP puede que no funcione
más. Esto puede requerir reglas adicionales, ya que SELinux trata los
sockets de red de forma diferente a los archivos.

@item
Actualmente todos los archivos con un nombre coincidente con la expresión
regular @code{/gnu/store.+-(gux-.+|profile)/bin/guix-daemon} tienen asignada
la etiqueta @code{guix_daemon_exec_t}; esto significa que @emph{cualquier}
archivo con ese nombre en cualquier perfil tendrá permitida la ejecución en
el dominio @code{guix_daemon_t}. Esto no es ideal. Una atacante podría
construir un paquete que proporcione este ejecutable y convencer a la
usuaria para instalarlo y ejecutarlo, lo que lo eleva al dominio
@code{guix_daemon_t}. Llegadas a este punto, SELinux no puede prevenir que
acceda a los archivos permitidos para los procesos en dicho dominio.

You will need to relabel the store directory after all upgrades to
@file{guix-daemon}, such as after running @code{guix pull}.  Assuming the
store is in @file{/gnu}, you can do this with @code{restorecon -vR /gnu}, or
by other means provided by your operating system.

Podríamos generar una política mucho más restrictiva en tiempo de
instalación, de modo que solo el nombre @emph{exacto} del archivo del
ejecutable de @code{guix-daemon} actualmente instalado sea marcado como
@code{guix_daemon_exec_t}, en vez de usar una expresión regular amplia. La
desventaja es que root tendría que instalar o actualizar la política en
tiempo de instalación cada vez que se actualizase el paquete de Guix que
proporcione el ejecutable de @code{guix-daemon} realmente en ejecución.
@end enumerate

@node Invocación de guix-daemon
@section Invocación de @command{guix-daemon}
@cindex @command{guix-daemon}
El programa @command{guix-daemon} implementa toda la funcionalidad para
acceder al almacén. Esto incluye iniciar procesos de construcción, ejecutar
el recolector de basura, comprobar la disponibilidad de un resultado de
construcción, etc. Normalmente se ejecuta como @code{root} así:

@example
# guix-daemon --build-users-group=guixbuild
@end example

@cindex socket activation, for @command{guix-daemon}
This daemon can also be started following the systemd ``socket activation''
protocol (@pxref{Service De- and Constructors,
@code{make-systemd-constructor},, shepherd, The GNU Shepherd Manual}).

Para detalles obre como configurarlo, @pxref{Preparación del daemon}.

@cindex chroot
@cindex contenedor, entorno de construcción
@cindex entorno de construcción
@cindex construcciones reproducibles
Por defecto, @command{guix-daemon} inicia los procesos de construcción bajo
distintos UIDs, tomados del grupo de construcción especificado con
@option{--build-users-group}. Además, cada proceso de construcción se
ejecuta en un entorno ``chroot'' que únicamente contiene el subconjunto del
almacén del que depende el proceso de construcción, como especifica su
derivación (@pxref{Interfaz programática, derivación}), más un conjunto
específico de directorios del sistema. Por defecto, estos directorios
contienen @file{/dev} y @file{/dev/pts}. Es más, sobre GNU/Linux, el entorno
de construcción es un @dfn{contenedor}: además de tener su propio árbol del
sistema de archivos, tiene un espacio de nombres de montado separado, su
propio espacio de nombres de PID, de red, etc. Esto ayuda a obtener
construcciones reproducibles (@pxref{Características}).

Cuando el daemon realiza una construcción en delegación de la usuaria, crea
un directorio de construcción bajo @file{/tmp} o bajo el directorio
especificado por su variable de entorno @env{TMPDIR}. Este directorio se
comparte con el contenedor durante toda la construcción, aunque dentro del
contenedor el árbol de construcción siempre se llama
@file{/tmp/guix-build-@var{nombre}.drv-0}.

The build directory is automatically deleted upon completion, unless the
build failed and the client specified @option{--keep-failed} (@pxref{Opciones comunes de construcción, @option{--keep-failed}}).

El daemon espera conexiones y lanza un subproceso por sesión iniciada por
cada cliente (una de las sub-órdenes de @command{guix}). La orden
@command{guix processes} le permite tener una visión general de la actividad
de su sistema mostrando clientes y sesiones activas. @xref{Invocación de guix processes}, para más información.

Se aceptan las siguientes opciones de línea de ordenes:

@table @code
@item --build-users-group=@var{grupo}
Toma las usuarias de @var{grupo} para ejecutar los procesos de construcción
(@pxref{Preparación del daemon, build users}).

@item --no-substitutes
@cindex sustituciones
No usa sustituciones para la construcción de productos. Esto es, siempre
realiza las construcciones localmente en vez de permitir la descarga de
binarios pre-construidos (@pxref{Sustituciones}).

Cuando el daemon se está ejecutando con la opción @option{--no-substitutes},
los clientes aún pueden activar explícitamente las sustituciones a través de
la llamada de procedimiento remoto @code{set-build-options} (@pxref{El almacén}).

@anchor{daemon-substitute-urls}
@item --substitute-urls=@var{urls}
Consider @var{urls} the default whitespace-separated list of substitute
source URLs.  When this option is omitted,
@indicateurl{@value{SUBSTITUTE-URLS}} is used.

Esto significa que las sustituciones puede ser descargadas de @var{urls},
mientras estén firmadas por una firma de confianza (@pxref{Sustituciones}).

@xref{Obtención de sustiticiones desde otros servidores} para obtener más información
sobre cómo configurar el daemon para obtener sustituciones de otros
servidores.

@cindex delegación de trabajo
@item --no-offload
No usa la delegación de construcciones en otras máquinas (@pxref{Configuración de delegación del daemon}). Es decir, siempre realiza las construcciones de manera
local en vez de delegar construcciones a máquinas remotas.

@item --cache-failures
Almacena en la caché los fallos de construcción. Por defecto, únicamente las
construcciones satisfactorias son almacenadas en la caché.

Cuando se usa esta opción, @command{guix gc --list-failures} puede usarse
para consultar el conjunto de elementos del almacén marcados como fallidos;
@command{guix gc --clear-failures} borra los elementos del almacén del
conjunto de fallos existentes en la caché. @xref{Invocación de guix gc}.

@item --cores=@var{n}
@itemx -c @var{n}
Usa @var{n} núcleos de la CPU para construir cada derivación; @code{0}
significa tantos como haya disponibles.

El valor predeterminado es @code{0}, pero puede ser sobreescrito por los
clientes, como la opción @option{--cores} de @command{guix build}
(@pxref{Invocación de guix build}).

El efecto es definir la variable de entorno @env{NIX_BUILD_CORES} en el
proceso de construcción, el cual puede usarla para explotar el paralelismo
interno---por ejemplo, ejecutando @code{make -j$NIX_BUILD_CORES}.

@item --max-jobs=@var{n}
@itemx -M @var{n}
Permite como máximo @var{n} trabajos de construcción en paralelo. El valor
predeterminado es @code{1}. Fijarlo a @code{0} significa que ninguna
construcción se realizará localmente; en vez de eso, el daemon delegará las
construcciones (@pxref{Configuración de delegación del daemon}), o simplemente fallará.

@item --max-silent-time=@var{segundos}
Cuando la construcción o sustitución permanece en silencio más de
@var{segundos}, la finaliza e informa de un fallo de construcción.

El valor predeterminado es @code{0}, que desactiva los plazos.

El valor especificado aquí puede ser sobreescrito por clientes
(@pxref{Opciones comunes de construcción, @option{--max-silent-time}}).

@item --timeout=@var{segundos}
Del mismo modo, cuando el proceso de construcción o sustitución dura más de
@var{segundos}, lo termina e informa un fallo de construcción.

El valor predeterminado es @code{0}, que desactiva los plazos.

El valor especificado aquí puede ser sobreescrito por los clientes
(@pxref{Opciones comunes de construcción, @option{--timeout}}).

@item --rounds=@var{N}
Construye cada derivación @var{n} veces seguidas, y lanza un error si los
resultados de las construcciones consecutivas no son idénticos
bit-a-bit. Fíjese que esta configuración puede ser sobreescrita por clientes
como @command{guix build} (@pxref{Invocación de guix build}).

Cuando se usa conjuntamente con @option{--keep-failed}, la salida que
difiere se mantiene en el almacén, bajo
@file{/gnu/store/@dots{}-check}. Esto hace fácil buscar diferencias entre
los dos resultados.

@item --debug
Produce salida de depuración.

Esto es útil para depurar problemas en el arranque del daemon, pero su
comportamiento puede cambiarse en cada cliente, por ejemplo con la opción
@option{--verbosity} de @command{guix build} (@pxref{Invocación de guix build}).

@item --chroot-directory=@var{dir}
Añade @var{dir} al chroot de construcción.

Hacer esto puede cambiar el resultado del proceso de construcción---por
ejemplo si usa dependencias opcionales, que se encuentren en @var{dir},
cuando están disponibles, y no de otra forma. Por esa razón, no se
recomienda hacerlo. En vez de eso, asegúrese que cada derivación declara
todas las entradas que necesita.

@item --disable-chroot
Desactiva la construcción en un entorno chroot.

No se recomienda el uso de esta opción ya que, de nuevo, podría permitir a
los procesos de construcción ganar acceso a dependencias no declaradas. Es
necesario, no obstante, cuando @command{guix-daemon} se ejecuta bajo una
cuenta de usuaria sin privilegios.

@item --log-compression=@var{tipo}
Comprime los logs de construcción de acuerdo a @var{tipo}, que puede ser
@code{gzip}, @code{bzip2} o @code{none}.

Unless @option{--lose-logs} is used, all the build logs are kept in the
@var{localstatedir}.  To save space, the daemon automatically compresses
them with gzip by default.

@item --discover[=yes|no]
Whether to discover substitute servers on the local network using mDNS and
DNS-SD.

This feature is still experimental.  However, here are a few considerations.

@enumerate
@item
It might be faster/less expensive than fetching from remote servers;
@item
There are no security risks, only genuine substitutes will be used
(@pxref{Verificación de sustituciones});
@item
An attacker advertising @command{guix publish} on your LAN cannot serve you
malicious binaries, but they can learn what software you’re installing;
@item
Servers may serve substitute over HTTP, unencrypted, so anyone on the LAN
can see what software you’re installing.
@end enumerate

It is also possible to enable or disable substitute server discovery at
run-time by running:

@example
herd discover guix-daemon on
herd discover guix-daemon off
@end example

@item --disable-deduplication
@cindex deduplicación
Desactiva la ``deduplicación'' automática en el almacén.

Por defecto, los archivos se añaden al almacén ``deduplicados''
automáticamente: si un nuevo archivo añadido es idéntico a otro que ya se
encuentra en el almacén, el daemon introduce el nuevo archivo como un enlace
duro al otro archivo. Esto puede reducir notablemente el uso del disco, a
expensas de una carga de entrada/salida ligeramente incrementada al
finalizar un proceso de construcción. Esta opción desactiva dicha
optimización.

@item --gc-keep-outputs[=yes|no]
Determina si el recolector de basura (GC) debe mantener salidas de las
derivaciones vivas.

@cindex GC, raíces del recolector de basura
@cindex raíces del recolector de basura
Cuando se usa @code{yes}, el recolector de basura mantendrá las salidas de
cualquier derivación viva disponible en el almacén---los archivos
@code{.drv}. El valor predeterminado es @code{no}, lo que significa que las
salidas de las derivaciones se mantienen únicamente si son alcanzables desde
alguna raíz del recolector de basura. @xref{Invocación de guix gc}, para más
información sobre las raíces del recolector de basura.

@item --gc-keep-derivations[=yes|no]
Determina si el recolector de basura (GC) debe mantener derivaciones
correspondientes a salidas vivas.

Cuando se usa @code{yes}, como es el caso predeterminado, el recolector de
basura mantiene derivaciones---es decir, archivos @code{.drv}---mientras al
menos una de sus salidas está viva. Esto permite a las usuarias seguir la
pista de los orígenes de los elementos en el almacén. El uso de @code{no}
aquí ahorra un poco de espacio en disco.

De este modo, usar @option{--gc-keep-derivations} con valor @code{yes}
provoca que la vitalidad fluya de salidas a derivaciones, y usar
@option{--gc-keep-outputs} con valor @code{yes} provoca que la vitalidad
fluya de derivaciones a salidas. Cuando ambas tienen valor @code{yes}, el
efecto es mantener todos los prerrequisitos de construcción (las fuentes, el
compilador, las bibliotecas y otras herramientas de tiempo de construcción)
de los objetos vivos del almacén, independientemente de que esos
prerrequisitos sean alcanzables desde una raíz del recolector de
basura. Esto es conveniente para desarrolladoras ya que evita
reconstrucciones o descargas.

@item --impersonate-linux-2.6
En sistemas basados en Linux, suplanta a Linux 2.6. Esto significa que la
llamada del sistema @command{uname} del núcleo indicará 2.6 como el número
de versión de la publicación.

Esto puede ser útil para construir programas que (habitualmente de forma
incorrecta) dependen en el número de versión del núcleo.

@item --lose-logs
No guarda logs de construcción. De manera predeterminada se almacenan en el
directorio @file{@var{localstatedir}/guix/log}.

@item --system=@var{sistema}
Asume @var{sistema} como el tipo actual de sistema. Por defecto es el par de
arquitectura/núcleo encontrado durante la configuración, como
@code{x86_64-linux}.

@item --listen=@var{destino}
Espera conexiones en @var{destino}. @var{destino} se interpreta como el
nombre del archivo del socket de dominio Unix si comienza on @code{/} (barra
a la derecha). En otro caso, @var{destino} se interpreta como un nombre de
máquina o un nombre de máquina y puerto a escuchar. Aquí van unos pocos
ejemplos:

@table @code
@item --listen=/gnu/var/daemon
Espera conexiones en el socket de dominio Unix @file{/gnu/var/daemon}, se
crea si es necesario.

@item --listen=localhost
@cindex daemon, acceso remoto
@cindex acceso remoto al daemon
@cindex daemon, configuración en cluster
@cindex daemon, configuración en cluster
Espera conexiones TCP en la interfaz de red correspondiente a
@code{localhost}, en el puerto 44146.

@item --listen=128.0.0.42:1234
Espera conexiones TCP en la interfaz de red correspondiente a
@code{128.0.0.42}, en el puerto 1234.
@end table

Esta opción puede repetirse múltiples veces, en cuyo caso
@command{guix-daemon} acepta conexiones en todos los destinos
especificados. Las usuarias pueden indicar a los clientes a qué destino
conectarse proporcionando el valor deseado a la variable de entorno
@env{GUIX_DAEMON_SOCKET} (@pxref{El almacén, @env{GUIX_DAEMON_SOCKET}}).

@quotation Nota
El protocolo del daemon @code{no está autentificado ni cifrado}. El uso de
@option{--listen=@var{dirección}} es aceptable en redes locales, como
clusters, donde únicamente los nodos de confianza pueden conectarse al
daemon de construcción. En otros casos donde el acceso remoto al daemon es
necesario, recomendamos usar sockets de dominio Unix junto a SSH.
@end quotation

Cuando se omite @option{--listen}, @command{guix-daemon} escucha conexiones
en el socket de dominio Unix que se encuentra en
@file{@var{localstatedir}/guix/daemon-socket/socket}.
@end table


@node Configuración de la aplicación
@section Configuración de la aplicación

@cindex distribución distinta
Cuando se usa Guix sobre una distribución GNU/Linux distinta al sistema
Guix---una @dfn{distribución distinta}---unos pocos pasos adicionales son
necesarios para tener todo preparado. Aquí están algunos de ellos.

@subsection Localizaciones

@anchor{locales-and-locpath}
@cindex localizaciones, cuando no se está en el sistema Guix
@vindex LOCPATH
@vindex GUIX_LOCPATH
Los paquetes instalados a través de Guix no usarán los datos de localización
del sistema anfitrión. En vez de eso, debe instalar primero uno de los
paquetes de localización disponibles con Guix y después definir la variable
de entorno @env{GUIX_LOCPATH}:

@example
$ guix install glibc-locales
$ export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale
@end example

Note that the @code{glibc-locales} package contains data for all the locales
supported by the GNU@tie{}libc and weighs in at around
930@tie{}MiB@footnote{The size of the @code{glibc-locales} package is
reduced down to about 213@tie{}MiB with store deduplication and further down
to about 67@tie{}MiB when using a zstd-compressed Btrfs file system.}.  If
you only need a few locales, you can define your custom locales package via
the @code{make-glibc-utf8-locales} procedure from the @code{(gnu packages
base)} module.  The following example defines a package containing the
various Canadian UTF-8 locales known to the GNU@tie{}libc, that weighs
around 14@tie{}MiB:

@lisp
(use-modules (gnu packages base))

(define my-glibc-locales
  (make-glibc-utf8-locales
   glibc
   #:locales (list "en_CA" "fr_CA" "ik_CA" "iu_CA" "shs_CA")
   #:name "glibc-canadian-utf8-locales"))
@end lisp

La variable @env{GUIX_LOCPATH} juega un rol similar a @env{LOCPATH}
(@pxref{Locale Names, @env{LOCPATH},, libc, The GNU C Library Reference
Manual}). No obstante, hay dos diferencias importantes:

@enumerate
@item
@env{GUIX_LOCPATH} es respetada únicamente por la libc dentro de Guix, y no
por la libc que proporcionan las distribuciones distintas. Por tanto, usar
@env{GUIX_LOCPATH} le permite asegurarse de que los programas de la
distribución distinta no cargarán datos de localización incompatibles.

@item
libc añade un sufijo a cada entrada de @env{GUIX_LOCPATH} con @code{/X.Y},
donde @code{X.Y} es la versión de libc---por ejemplo, @code{2.22}. Esto
significa que, en caso que su perfil Guix contenga una mezcla de programas
enlazados contra diferentes versiones de libc, cada versión de libc
únicamente intentará cargar datos de localización en el formato correcto.
@end enumerate

Esto es importante porque el formato de datos de localización usado por
diferentes versiones de libc puede ser incompatible.

@subsection Selector de servicios de nombres

@cindex selector de servicios de nombres, glibc
@cindex NSS (selector de servicios de nombres), glibc
@cindex ncsd (daemon de caché del servicio de nombres)
@cindex daemon de caché del servicio de nombres (ncsd)
Cuando se usa Guix en una distribución distinta, @emph{recomendamos
encarecidamente} que el sistema ejecute el @dfn{daemon de caché del servicio
de nombres} de la biblioteca de C de GNU, @command{ncsd}, que debe escuchar
en el socket @file{/var/run/nscd/socket}. En caso de no hacerlo, las
aplicaciones instaladas con Guix pueden fallar al buscar nombres de máquinas
o cuentas de usuaria, o incluso pueden terminar abruptamente. Los siguientes
párrafos explican por qué.

@cindex @file{nsswitch.conf}
La biblioteca de C de GNU implementa un @dfn{selector de servicios de
nombres} (NSS), que es un mecanismo extensible para ``búsquedas de nombres''
en general: resolución de nombres de máquinas, cuentas de usuaria y más
(@pxref{Selector de servicios de nombres,,, libc, The GNU C Library Reference Manual}).

@cindex Servicio de información de red (NIS)
@cindex NIS (servicio de información de red)
Al ser extensible, NSS permite el uso de @dfn{módulos}, los cuales
proporcionan nuevas implementaciones de búsqueda de nombres: por ejemplo, el
módulo @code{nss-mdns} permite la resolución de nombres de máquina
@code{.local}, el módulo @code{nis} permite la búsqueda de cuentas de
usuaria usando el servicio de información de red (NIS), etc. Estos
``servicios de búsqueda'' extra se configuran para todo el sistema en
@file{/etc/nsswitch.conf}, y todos los programas en ejecución respetan esta
configuración (@pxref{NSS Configuration File,,, libc, The GNU C Reference
Manual}).

Cuando se realiza una búsqueda de nombres---por ejemplo, llamando a la
función @code{getaddrinfo} en C---las aplicaciones primero intentarán
conectar con nscd; en caso satisfactorio, nscd realiza la búsqueda de
nombres en delegación suya. Si nscd no está ejecutándose, entonces realizan
la búsqueda por ellas mismas, cargando los servicios de búsqueda de nombres
en su propio espacio de direcciones y ejecutándola. Estos servicios de
búsqueda de nombres---los archivos @file{libnss_*.so}---son abiertos con
@code{dlopen}, pero pueden venir de la biblioteca de C del sistema, en vez
de la biblioteca de C contra la que la aplicación está enlazada (la
biblioteca de C que viene en Guix).

Y aquí es donde está el problema: si su aplicación está enlazada contra la
biblioteca de C de Guix (digamos, glibc 2.24) e intenta cargar módulos de
otra biblioteca de C (digamos, @code{libnss_mdns.so} para glibc 2.22),
probablemente terminará abruptamente o sus búsquedas de nombres fallarán
inesperadamente. 

Ejecutar @command{nscd} en el sistema, entre otras ventajas, elimina este
problema de incompatibilidad binaria porque esos archivos @code{libnss_*.so}
se cargan en el proceso @command{nscd}, no en la aplicación misma.

@subsection Tipografías X11

@cindex tipografías
The majority of graphical applications use Fontconfig to locate and load
fonts and perform X11-client-side rendering.  The @code{fontconfig} package
in Guix looks for fonts in @file{$HOME/.guix-profile} by default.  Thus, to
allow graphical applications installed with Guix to display fonts, you have
to install fonts with Guix as well.  Essential font packages include
@code{font-ghostscript}, @code{font-dejavu}, and @code{font-gnu-freefont}.

@cindex @code{fc-cache}
@cindex caché de tipografías
Una vez que haya instalado o borrado tipografías, o cuando se de cuenta de
que una aplicación no encuentra las tipografías, puede que necesite instalar
Fontconfig y forzar una actualización de su caché de tipografías ejecutando:

@example
guix install fontconfig
fc-cache -rv
@end example

Para mostrar texto escrito en lenguas chinas, Japonés o Coreano en
aplicaciones gráficas, considere instalar @code{font-adobe-source-han-sans}
o @code{font-wqy-zenhei}. La anterior tiene múltiples salidas, una por
familia de lengua (@pxref{Paquetes con múltiples salidas}). Por ejemplo, la
siguiente orden instala tipografías para lenguas chinas:

@example
guix install font-adobe-source-han-sans:cn
@end example

@cindex @code{xterm}
Programas más antiguos como @command{xterm} no usan Fontconfig sino que
dependen en el lado del servidor para realizar el renderizado de
tipografías. Dichos programas requieren especificar un nombre completo de
tipografía usando XLFD (Descripción lógica de tipografías X), como esta:

@example
-*-dejavu sans-medium-r-normal-*-*-100-*-*-*-*-*-1
@end example

Para ser capaz de usar estos nombres completos para las tipografías TrueType
instaladas en su perfil Guix, necesita extender la ruta de fuentes del
servidor X:

@c Note: 'xset' does not accept symlinks so the trick below arranges to
@c get at the real directory.  See <https://bugs.gnu.org/30655>.
@example
xset +fp $(dirname $(readlink -f ~/.guix-profile/share/fonts/truetype/fonts.dir))
@end example

@cindex @code{xlsfonts}
Después de eso, puede ejecutar @code{xlsfonts} (del paquete @code{xlsfonts})
para asegurarse que sus tipografías TrueType se enumeran aquí.


@subsection Certificados X.509

@cindex @code{nss-certs}
El paquete @code{nss-certs} proporciona certificados X.509, que permiten a
los programas verificar los servidores accedidos por HTTPS.

Cuando se usa Guix en una distribución distinta, puede instalar este paquete
y definir las variables de entorno relevantes de modo que los paquetes sepan
dónde buscar los certificados. @xref{Certificados X.509}, para información
detallada.

@subsection Paquetes Emacs

@cindex @code{emacs}
Cuando instale paquetes de Emacs con Guix los archivos de Elisp se
encuentran en el directorio @file{share/emacs/site-lisp/} del perfil en el
que se instalen. Las bibliotecas de Elisp se ponen a disposición de Emacs a
través de la variable de entorno @env{EMACSLOADPATH}, a la cual se le asigna
un valor cuando se instale el propio Emacs.

De manera adicional, las definiciones de carga automática se evaluan de
manera automática en la inicialización de Emacs, mediante el procedimiento
@code{guix-emacs-autoload-packages} específico de Guix. Si, por alguna
razón, desea evitar la carga automática de paquetes Emacs instalados con
Guix, puede hacerlo ejecutando Emacs con la opción @option{--no-site-file}
(@pxref{Init File,,, emacs, The GNU Emacs Manual}).

@quotation Nota
Emacs can now compile packages natively.  Under the default configuration,
this means that Emacs packages will now be just-in-time (JIT) compiled as
you use them, and the results stored in a subdirectory of your
@code{user-emacs-directory}.

Furthermore, the build system for Emacs packages transparently supports
native compilation, but note, that @code{emacs-minimal}---the default Emacs
for building packages---has been configured without native compilation.  To
natively compile your emacs packages ahead of time, use a transformation
like @option{--with-input=emacs-minimal=emacs}.
@end quotation

@node Actualizar Guix
@section Actualizar Guix

@cindex Actualizar Guix, en una distribución distinta

Para actualizar Guix ejecute:

@example
guix pull
@end example

@xref{Invocación de guix pull}, para más información.

@cindex actualizar Guix para la usuaria root, en una distribución distinta
@cindex actualización del daemon de Guix, en una distribución distinta
@cindex @command{guix pull} para la usuaria root, en una distribución distinta

En una distribución distinta puede actualizar el daemon de construcción
ejecutando:

@example
sudo -i guix pull
@end example

@noindent
seguido de (asumiendo que su distribución usa la herramienta de gestión de
servicios systemd):

@example
systemctl restart guix-daemon.service
@end example

En el Sistema Guix, la actualización del daemon se lleva a cabo con la
reconfiguración el sistema (@pxref{Invocación de guix system, @code{guix system
reconfigure}}).

@c TODO What else?

@c *********************************************************************
@node Instalación del sistema
@chapter Instalación del sistema

@cindex instalación del sistema Guix
@cindex sistema Guix, instalación
Esta sección explica cómo instalar el sistema Guix en una máquina. Guix,
como gestor de paquetes, puede instalarse sobre un sistema GNU/Linux en
ejecución, @pxref{Instalación}.

@ifinfo
@quotation Nota
@c This paragraph is for people reading this from tty2 of the
@c installation image.
Está leyendo esta documentación con un lector Info. Para obtener detalles
sobre su uso, presione la tecla @key{RET} (``retorno de carro'' o ``intro'')
en el siguiente enlace: @pxref{Top, Info reader,, info-stnd, Stand-alone GNU
Info}. Presione después @kbd{l} para volver aquí.

De manera alternativa, ejecute @command{info info} en otro terminal para
mantener el manual disponible.
@end quotation
@end ifinfo

@menu
* Limitaciones::             Qué puede esperar.
* Consideraciones sobre el hardware::  Hardware soportado.
* Instalación desde memoria USB y DVD::  Preparar el medio de instalación.
* Preparación para la instalación::  Red, particionado, etc.
* Instalación gráfica guiada::  Instalación gráfica fácil.
* Instalación manual::      Instalación manual para artistas del teclado.
* Tras la instalación del sistema::  Cuando la instalación ha finalizado 
                                        satisfactoriamente.
* Instalación de Guix en una máquina virtual::  El patio de recreo del 
                                                    sistema Guix.
* Construcción de la imagen de instalación::  Cómo esto llega a ser.
@end menu

@node Limitaciones
@section Limitaciones

Consideramos que el sistema Guix está listo para un amplio rango de casos de
uso, tanto de servidor como de escritorio. Las garantías que
proporciona---actualizaciones transaccionales y vuelta atrás atómica,
reproducibilidad---lo convierten en un cimiento sólido.

No obstante, antes de que proceda con la instalación, sea consciente de las
siguientes limitaciones apreciables que se conocen en la versión
@value{VERSION}:

@itemize
@item
Se proporcionan más y más servicios del sistema (@pxref{Servicios}), pero
pueden faltar algunos.

@item
Están disponibles GNOME, Xfce, LXDE y Enlightenment (@pxref{Servicios de escritorio}), así como un número de gestores de ventanas X11. No obstante,
actualmente falta KDE.
@end itemize

Más que una descarga de responsabilidades es una invitación a informar de
problemas (¡e historias satisfactorias!), y para unirse a nosotras en su
mejora. @xref{Contribuir}, para más información.


@node Consideraciones sobre el hardware
@section Consideraciones sobre el hardware

@cindex soporte de hardware en el sistema Guix
GNU@tie{}Guix se enfoca en respetar la libertad de computación de las
usuarias. Se construye sobre el núcleo Linux-libre, lo que significa que
únicamente funciona hardware para el que existen controladores y firmware
libres. Hoy en día, un amplio rango del hardware común funciona con
GNU/Linux-libre---desde teclados a tarjetas gráficas a escáneres y
controladoras Ethernet. Desafortunadamente, todavía hay áreas donde los
fabricantes de hardware deniegan a las usuarias el control de su propia
computación, y dicho hardware no funciona en el sistema Guix.

@cindex WiFi, soporte hardware
Una de las áreas principales donde faltan controladores o firmware libre son
los dispositivos WiFi. Los dispositivos WiFi que se sabe que funcionan
incluyen aquellos que usan los chips Atheros (AR9271 y AR7010), que
corresponden al controlador @code{ath9k} de Linux-libre, y aquellos que usan
los chips Broadcom/AirForce (BCM43xx con Wireless-Core Revisión 5), que
corresponden al controlador @code{b43-open} de Linux-libre. Existe firmware
libre para ambos, y está disponible por defecto en el sistema Guix, como
parte de @code{%base-firmware} (@pxref{Referencia de operating-system,
@code{firmware}}).

The installer warns you early on if it detects devices that are known
@emph{not} to work due to the lack of free firmware or free drivers.

@cindex RYF, Respeta Su Libertad
La @uref{https://www.fsf.org/, Fundación del Software Libre} patrocina
@uref{https://www.fsf.org/ryf, @dfn{Respeta Su Libertad}} (RYF), un programa
de certificación para productos hardware que respetan su libertad y su
privacidad y se aseguran de que usted tenga el control sobre su
dispositivo. Le recomendamos que compruebe la lista de dispositivos
certificados RYF.

Otro recurso útil es el sitio web @uref{https://wwww.h-node.org/,
H-Node}. Contiene un catálogo de dispositivos hardware con información
acerca su funcionalidad con GNU/Linux.


@node Instalación desde memoria USB y DVD
@section Instalación desde memoria USB y DVD

Se puede descargar una imagen de instalación ISO-9660 que puede ser escrita
en una memoria USB o grabada en un DVD desde
@indicateurl{@value{BASE-URL}/guix-system-install-@value{VERSION}.x86_64-linux.iso},
donde puede sustituir @code{x86_64-linux} con uno de los siguientes valores:

@table @code
@item x86_64-linux
para un sistema GNU/Linux en CPUs compatibles con la arquitectura de 64-bits
de Intel/AMD;

@item i686-linux
para un sistema GNU/Linux en CPUs compatibles con la arquitectura de 32-bits
de Intel.
@end table

@c start duplication of authentication part from ``Binary Installation''
Asegúrese de descargar el archivo @file{.sig} asociado y de verificar la
autenticidad de la imagen contra él, más o menos así:

@example
$ wget @value{BASE-URL}/guix-system-install-@value{VERSION}.x86_64-linux.iso.sig
$ gpg --verify guix-system-install-@value{VERSION}.x86_64-linux.iso.sig
@end example

Si la orden falla porque no dispone de la clave pública necesaria, entonces
ejecute esta otra orden para importarla:

@example
$ wget @value{OPENPGP-SIGNING-KEY-URL} \
      -qO - | gpg --import -
@end example

@noindent
y vuelva a ejecutar la orden @code{gpg --verify}.

Tenga en cuenta que un aviso del tipo ``Esta clave no esta certificada con
una firma de confianza'' es normal.

@c end duplication

Esta imagen contiene las herramientas necesarias para una instalación. Está
pensada ara ser copiada @emph{tal cual} a una memoria USB o DVD con espacio
suficiente.

@unnumberedsubsec Copiado en una memoria USB

Conecte una memoria USB de 1@tie{}GiB o más a su máquina, y determine su
nombre de dispositivo. Asumiendo que la memoria USB es @file{/dev/sdX} copie
la imagen con:

@example
dd if=guix-system-install-@value{VERSION}.x86_64-linux.iso of=/dev/sdX
sync
@end example

El acceso a @file{/dev/sdX} normalmente necesita privilegios de root.

@unnumberedsubsec Grabación en un DVD

Introduzca un DVD en su máquina para grabarlo, y determine el nombre del
dispositivo. Asumiendo que la unidad DVD es @file{/dev/srX}, copie la imagen
con:

@example
growisofs -dvd-compat -Z /dev/srX=guix-system-install-@value{VERSION}.x86_64-linux.iso
@end example

El acceso a @file{/dev/srX} normalmente necesita privilegios de root.

@unnumberedsubsec Arranque

Once this is done, you should be able to reboot the system and boot from the
USB stick or DVD@.  The latter usually requires you to get in the BIOS or
UEFI boot menu, where you can choose to boot from the USB stick.  In order
to boot from Libreboot, switch to the command mode by pressing the @kbd{c}
key and type @command{search_grub usb}.

@xref{Instalación de Guix en una máquina virtual}, si, en vez de esto, desea instalar el
sistema Guix en una máquina virtual (VM).


@node Preparación para la instalación
@section Preparación para la instalación

Una vez que haya arrancado, puede usar el instalador gráfico guiado, el cual
facilita la introducción al sistema (@pxref{Instalación gráfica guiada}). Alternativamente, si ya es está familiarizada con GNU/Linux
y desea más control que el que proporciona el instalador gráfico, puede
seleccionar el proceso de instalación ``manual'' (@pxref{Instalación manual}).

El instalador gráfico está disponible en TTY1. Puede obtener consolas de
administración (``root'') en los TTY 3 a 6 pulsando @kbd{ctrl-alt-f3},
@kbd{ctrl-alt-f4}, etc. TTY2 muestra esta documentación y se puede cambiar a
dicha consola con @kbd{ctrl-alt-f2}. La documentación es explorable usando
las órdenes del lector Info (@pxref{Top,,, info-stnd, Stand-alone GNU
Info}). El sistema de instalación ejecuta el daemon GPM para ratones, el
cual le permite seleccionar texto con el botón izquierdo y pegarlo con el
botón central.

@quotation Nota
La instalación requiere acceso a Internet de modo que cualquier dependencia
de su configuración de sistema no encontrada pueda ser descargada. Véase la
sección ``Red'' más adelante.
@end quotation

@node Instalación gráfica guiada
@section Instalación gráfica guiada

El instalador gráfico es una interfaz de usuaria basada en texto. Le guiará,
con cajas de diálogo, a través de los pasos necesarios para instalar el
sistema GNU@tie{}Guix.

Las primeras cajas de diálogo le permiten configurar el sistema mientras lo
usa durante la instalación: puede seleccionar el idioma, la distribución del
teclado y configurar la red, la cual se usará durante la instalación. La
siguiente imagen muestra el diálogo de configuración de red.

@image{images/installer-network,5in,, configuración de red en la instalación
gráfica}

Los siguientes pasos le permitirán particionar su disco duro, como se
muestra en la siguiente imagen, elegir si se usarán o no sistemas de
archivos cifrados, introducir el nombre de la máquina, la contraseña de root
y crear cuentas adicionales, entre otras cosas.

@image{images/installer-partitions,5in,, particionado en la instalación
gráfica}

Tenga en cuenta que, en cualquier momento, el instalador le permite salir de
la instalación actual y retomarla en un paso previo, como se muestra en la
siguiente imagen.

@image{images/installer-resume,5in,, retomado del proceso de instalación}

Una vez haya finalizado, el instalador produce una configuración de sistema
operativo y la muestra (@pxref{Uso de la configuración del sistema}). En este
punto puede pulsar ``OK'' y la instalación procederá. En caso de
finalización satisfactoria, puede reiniciar con el nuevo sistema y
disfrutarlo. ¡@xref{Tras la instalación del sistema} para ver cómo proceder a
continuación!


@node Instalación manual
@section Instalación manual

Esta sección describe como podría instalar ``manualmente'' el sistema
GNU@tie{}Guix en su máquina. Esta opción requiere familiaridad con
GNU/Linux, con el intérprete y con las herramientas de administración
comunes. Si piensa que no es para usted, considere el uso del instalador
gráfico guiado (@pxref{Instalación gráfica guiada}).

The installation system provides root shells on TTYs 3 to 6; press
@kbd{ctrl-alt-f3}, @kbd{ctrl-alt-f4}, and so on to reach them.  It includes
many common tools needed to install the system, but is also a full-blown
Guix System.  This means that you can install additional packages, should
you need it, using @command{guix package} (@pxref{Invocación de guix package}).

@menu
* Distribución de teclado y red y particionado::  Configuración inicial.
* Procedimiento de instalación::  Instalación.
@end menu

@node Distribución de teclado y red y particionado
@subsection Distribución de teclado, red y particionado

Antes de instalar el sistema, puede desear ajustar la distribución del
teclado, configurar la red y particionar el disco duro deseado. Esta sección
le guiará durante este proceso.

@subsubsection Distribución de teclado

@cindex distribución de teclado
La imagen de instalación usa la distribución de teclado QWERTY de los
EEUU. Si desea cambiarla, puede usar la orden @command{loadkeys}. Por
ejemplo, la siguiente orden selecciona la distribución de teclado para el
castellano:

@example
loadkeys es
@end example

Véanse los archivos bajo @file{/run/current-system/profile/share/keymaps}
para la obtención de una lista de distribuciones de teclado
disponibles. Ejecute @command{man loadkeys} para más información.

@anchor{manual-installation-networking}
@subsubsection Red

Ejecute la siguiente orden para ver los nombres asignados a sus interfaces
de red:

@example
ifconfig -a
@end example

@noindent
@dots{} o, usando la orden específica de GNU/Linux @command{ip}:

@example
ip address
@end example

@c https://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
El nombre de las interfaces de cable comienza con @samp{e}; por ejemplo, la
interfaz que corresponde a la primera controladora Ethernet en la placa se
llama @samp{eno1}. El nombre de las interfaces inalámbricas comienza con
@samp{w}, como @samp{w1p2s0}.

@table @asis
@item Conexión por cable
Para configurar una red por cable ejecute la siguiente orden, substituyendo
@var{interfaz} con el nombre de la interfaz de cable que desea usar.

@example
ifconfig @var{interfaz} up
@end example

@noindent
@dots{} o, usando la orden específica de GNU/Linux @command{ip}:

@example
ip link set @var{interfaz} up
@end example

@item Conexión sin cable
@cindex sin cables
@cindex WiFi
Para configurar una red inalámbrica, puede crear un archivo de configuración
para la herramienta de configuración @command{wpa_supplicant} (su ruta no es
importante) usando uno de los editores de texto disponibles como
@command{nano}:

@example
nano wpa_supplicant.conf
@end example

Como un ejemplo, la siguiente plantilla puede colocarse en este archivo y
funcionará para muchas redes inalámbricas, siempre que se proporcione el
SSID y la contraseña reales de la red a la que se va a conectar:

@example
network=@{
  ssid="@var{mi-ssid}"
  key_mgmt=WPA-PSK
  psk="la contraseña de la red"
@}
@end example

Inicie el servicio inalámbrico y lance su ejecución en segundo plano con la
siguiente orden (sustituya @var{interfaz} por el nombre de la interfaz de
red que desea usar):

@example
wpa_supplicant -c wpa_supplicant.conf -i @var{interfaz} -B
@end example

Ejecute @command{man wpa_supplicant} para más información.
@end table

@cindex DHCP
En este punto, necesita obtener una dirección IP. En una red donde las
direcciones IP se asignan automáticamente mediante DHCP, puede ejecutar:

@example
dhclient -v @var{interfaz}
@end example

Intente hacer ping a un servidor para comprobar si la red está funcionando
correctamente:

@example
ping -c 3 gnu.org
@end example

Configurar el acceso por red es casi siempre un requisito debido a que la
imagen no contiene todo el software y las herramientas que puedan ser
necesarias.

@cindex proxy (pasarela), durante la instalación del sistema
@cindex pasarela (proxy), durante la instalación del sistema
Si necesita que el acceso a HTTP y HTTPS se produzca a través de una
pasarela (``proxy''), ejecute la siguiente orden:

@example
herd set-http-proxy guix-daemon @var{URL}
@end example

@noindent
donde @var{URL} es la URL de la pasarela, por ejemplo
@code{http://example.org:8118}.

@cindex instalación por SSH
Si lo desea, puede continuar la instalación de forma remota iniciando un
servidor SSH:

@example
herd start ssh-daemon
@end example

Asegúrese de establecer una contraseña con @command{passwd}, o configure la
verificación de clave pública de OpenSSH antes de ingresar al sistema.

@subsubsection Particionado de discos

A menos que se haya realizado previamente, el siguiente paso es el
particionado, y después dar formato a la/s partición/es deseadas.

La imagen de instalación contiene varias herramientas de particionado,
incluyendo Parted (@pxref{Overview,,, parted, GNU Parted User Manual}),
@command{fdisk} y @command{cfdisk}. Invoque su ejecución y configure el mapa
de particiones deseado en su disco:

@example
cfdisk
@end example

Si su disco usa el formato de tabla de particiones GUID (GPT) y tiene
pensado instalar GRUB basado en BIOS (la opción predeterminada), asegúrese
de tener una partición de arranque BIOS disponible (@pxref{BIOS installation,,, grub, GNU GRUB manual}).

@cindex EFI, instalación
@cindex UEFI, instalación
@cindex ESP, partición del sistema EFI
Si en vez de eso desea GRUB basado en EFI, se requiere una @dfn{Partición
del Sistema EFI} (ESP) con formato FAT32. Esta partición puede montarse en
@file{/boot/efi} y debe tener la opción @code{esp} activa. Por ejemplo, en
@command{parted}:

@example
parted /dev/sda set 1 esp on
@end example

@quotation Nota
@vindex grub-bootloader
@vindex grub-efi-bootloader
¿No esta segura si usar GRUB basado en EFI o en BIOS? Si el directorio
@file{/sys/firmware/efi} existe en la imagen de instalación, probablemente
debería realizar una instalación EFI, usando @code{grub-efi-bootloader}. En
otro caso, debe usar GRUB basado en BIOS, conocido como
@code{grub-bootloader}. @xref{Configuración del gestor de arranque}, para más
información sobre cargadores de arranque.
@end quotation

Once you are done partitioning the target hard disk drive, you have to
create a file system on the relevant partition(s)@footnote{Currently Guix
System only supports ext4, btrfs, JFS, F2FS, and XFS file systems.  In
particular, code that reads file system UUIDs and labels only works for
these file system types.}.  For the ESP, if you have one and assuming it is
@file{/dev/sda1}, run:

@example
mkfs.fat -F32 /dev/sda1
@end example

El formato de sistema de archivos ext4 es el formato más ampliamente usado
para el sistema de archivos raíz. Otros sistemas de archivos, como por
ejemplo Btrfs, implementan compresión, la cual complementa adecuadamente la
deduplicación de archivos que el daemon realiza de manera independiente al
sistema de archivos(@pxref{Invocación de guix-daemon, deduplicación}).

Preferentemente, asigne una etiqueta a los sistemas de archivos de modo que
pueda referirse a ellos de forma fácil y precisa en las declaraciones
@code{file-system} (@pxref{Sistemas de archivos}). Esto se consigue habitualmente
con la opción @code{-L} de @command{mkfs.ext4} y las ordenes
relacionadas. Por tanto, asumiendo que la partición de la raíz es
@file{/dev/sda2}, se puede crear un sistema de archivos con la etiqueta
@code{mi-raiz} de esta manera:

@example
mkfs.ext4 -L mi-raiz /dev/sda2
@end example

@cindex disco cifrado
If you are instead planning to encrypt the root partition, you can use the
Cryptsetup/LUKS utilities to do that (see @inlinefmtifelse{html,
@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}},
@code{man cryptsetup}} for more information).

@quotation Aviso
Note that GRUB can unlock LUKS2 devices since version 2.06, but only
supports the PBKDF2 key derivation function, which is not the default for
@command{cryptsetup luksFormat}.  You can check which key derivation
function is being used by a device by running @command{cryptsetup luksDump
@var{device}}, and looking for the PBKDF field of your keyslots.
@end quotation

Assuming you want to store the root partition on @file{/dev/sda2}, the
command sequence to format it as a LUKS2 partition would be along these
lines:

@example
cryptsetup luksFormat --type luks2 --pbkdf pbkdf2 /dev/sda2
cryptsetup open /dev/sda2 my-partition
mkfs.ext4 -L my-root /dev/mapper/my-partition
@end example

Una vez hecho esto, monte el sistema de archivos deseado bajo @file{/mnt}
con una orden como (de nuevo, asumiendo que @code{mi-raiz} es la etiqueta
del sistema de archivos raíz):

@example
mount LABEL=mi-raiz /mnt
@end example

Monte también cualquier otro sistema de archivos que desee usar en el
sistema resultante relativamente a esta ruta. Si ha optado por
@file{/boot/efi} como el punto de montaje de EFI, por ejemplo, ahora debe
ser montada en @file{/mnt/boot/efi} para que @code{guix system init} pueda
encontrarla más adelante.

Finally, if you plan to use one or more swap partitions (@pxref{Swap Space}), make sure to initialize them with @command{mkswap}.  Assuming you
have one swap partition on @file{/dev/sda3}, you would run:

@example
mkswap /dev/sda3
swapon /dev/sda3
@end example

De manera alternativa, puede usar un archivo de intercambio. Por ejemplo,
asumiendo que en el nuevo sistema desea usar el archivo
@file{/archivo-de-intercambio} como tal, ejecutaría@footnote{Este ejemplo
funcionará para muchos tipos de sistemas de archivos (por ejemplo, ext4). No
obstante, para los sistemas de archivos con mecanismos de
copia-durante-escritura (por ejemplo, btrfs) los pasos pueden ser
diferentes. Para obtener más detalles, véanse las páginas de manual para
@command{mkswap} y @command{swapon}.}:

@example
# Esto son 10GiB de espacio de intercambio. Ajuste "count" para
# cambiar el tamaño.
dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240
# Por seguridad, se le conceden permisos de lectura y escritura
# únicamente a root.
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile
@end example

Fíjese que si ha cifrado la partición raíz y creado un archivo de
intercambio en su sistema de archivos como se ha descrito anteriormente, el
cifrado también protege al archivo de intercambio, como a cualquier archivo
en dicho sistema de archivos.

@node Procedimiento de instalación
@subsection Procedimiento de instalación

Con las particiones deseadas listas y la raíz deseada montada en
@file{/mnt}, estamos preparadas para empezar. Primero, ejecute:

@example
herd start cow-store /mnt
@end example

Esto activa la copia-durante-escritura en @file{/gnu/store}, de modo que los
paquetes que se añadan durante la fase de instalación se escriban en el
disco montado en @file{/mnt} en vez de permanecer en memoria. Esto es
necesario debido a que la primera fase de la orden @command{guix system
init} (vea más adelante) implica descargas o construcciones en
@file{/gnu/store}, el cual, inicialmente, está un sistema de archivos en
memoria.

Next, you have to edit a file and provide the declaration of the operating
system to be installed.  To that end, the installation system comes with
three text editors.  We recommend GNU nano (@pxref{Top,,, nano, GNU nano
Manual}), which supports syntax highlighting and parentheses matching; other
editors include mg (an Emacs clone), and nvi (a clone of the original BSD
@command{vi} editor).  We strongly recommend storing that file on the target
root file system, say, as @file{/mnt/etc/config.scm}.  Failing to do that,
you will have lost your configuration file once you have rebooted into the
newly-installed system.

@xref{Uso de la configuración del sistema}, para hacerse una idea del archivo de
configuración. Las configuraciones de ejemplo mencionadas en esa sección
están disponibles bajo @file{/etc/configuration} en la imagen de
instalación. Por tanto, para empezar con una configuración del sistema que
proporcione un servidor gráfico (un sistema de ``escritorio''), puede
ejecutar algo parecido a estas órdenes:

@example
# mkdir /mnt/etc
# cp /etc/configuration/desktop.scm /mnt/etc/config.scm
# nano /mnt/etc/config.scm
@end example

Debe prestar atención a lo que su archivo de configuración contiene, y en
particular:

@itemize
@item
Make sure the @code{bootloader-configuration} form refers to the targets you
want to install GRUB on.  It should mention @code{grub-bootloader} if you
are installing GRUB in the legacy way, or @code{grub-efi-bootloader} for
newer UEFI systems.  For legacy systems, the @code{targets} field contain
the names of the devices, like @code{(list "/dev/sda")}; for UEFI systems it
names the paths to mounted EFI partitions, like @code{(list "/boot/efi")};
do make sure the paths are currently mounted and a @code{file-system} entry
is specified in your configuration.

@item
Asegúrese que las etiquetas de su sistema de archivos corresponden con el
valor de sus campos @code{device} respectivos en su configuración
@code{file-system}, asumiendo que su configuración @code{file-system} usa el
procedimiento @code{file-system-label} en su campo @code{device}.

@item
Si hay particiones cifradas o en RAID, asegúrese de añadir un campo
@code{mapped-devices} para describirlas (@pxref{Dispositivos traducidos}).
@end itemize

Una vez haya terminado de preparar el archivo de configuración, el nuevo
sistema debe ser inicializado (recuerde que el sistema de archivos raíz
deseado está montado bajo @file{/mnt}):

@example
guix system init /mnt/etc/config.scm /mnt
@end example

@noindent
Esto copia todos los archivos necesarios e instala GRUB en @file{/dev/sdX},
a menos que proporcione la opción @option{--no-bootloader}. Para más
información, @pxref{Invocación de guix system}. Esta orden puede desencadenar
descargas o construcciones de paquetes no encontrados, lo cual puede tomar
algún tiempo.

Una vez que la orden se complete---¡y, deseablemente, de forma
satisfactoria!---puede ejecutar @command{reboot} y arrancar con el nuevo
sistema. La contraseña de @code{root} en el nuevo sistema está vacía
inicialmente; otras contraseñas de usuarias tienen que ser inicializadas
ejecutando la orden @command{passwd} como @code{root}, a menos que en su
configuración se especifique de otra manera (@pxref{user-account-password,
contraseñas de cuentas de usuaria}). ¡@xref{Tras la instalación del sistema} para
proceder a continuación!


@node Tras la instalación del sistema
@section Tras la instalación del sistema

¡Éxito! ¡Ha arrancado en el sistema Guix! De ahora en adelante, puede
actualizar el sistema cuando quiera mediante la ejecución de, digamos:

@example
guix pull
sudo guix system reconfigure /etc/config.scm
@end example

@noindent
Esto construye una nueva generación del sistema con los últimos paquetes y
servicios (@pxref{Invocación de guix system}). Recomendamos realizarlo de manera
regular de modo que su sistema incluya las últimas actualizaciones de
seguridad (@pxref{Actualizaciones de seguridad}).

@c See <https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00268.html>.
@quotation Nota
@cindex sudo y @command{guix pull}
Tenga en cuenta que @command{sudo guix} ejecuta el ejecutable @command{guix}
de su usuaria y @emph{no} el de root, ya que @command{sudo} no altera
@env{PATH}. Para ejecutar explícitamente el ejecutable @command{guix} de
root, escriba @command{sudo -i guix @dots{}}.

The difference matters here, because @command{guix pull} updates the
@command{guix} command and package definitions only for the user it is run
as.  This means that if you choose to use @command{guix system reconfigure}
in root's login shell, you'll need to @command{guix pull} separately.
@end quotation

Now, @pxref{Empezando}, and join us on @code{#guix} on the Libera Chat
IRC network or on @email{guix-devel@@gnu.org} to share your experience!


@node Instalación de Guix en una máquina virtual
@section Instalación de Guix en una máquina virtual

@cindex máquina virtual, instalación del sistema Guix
@cindex servidor virtual privado (VPS)
@cindex VPS (servidor virtual privado)
Si desea instalar el sistema Guix en una máquina virtual (VM) o en un
servidor privado virtual (VPS) en vez de en su preciada máquina, esta
sección es para usted.

Si quiere arrancar una VM @uref{https://qemu.org/,QEMU} para instalar el
sistema Guix en una imagen de disco, siga estos pasos:

@enumerate
@item
Primero, obtenga y descomprima la imagen de instalación del sistema Guix
como se ha descrito previamente (@pxref{Instalación desde memoria USB y DVD}).

@item
Cree una imagen de disco que contendrá el sistema instalado. Para crear una
imagen de disco con formato qcow2, use la orden @command{qemu-img}:

@example
qemu-img create -f qcow2 guix-system.img 50G
@end example

El archivo que obtenga será mucho menor de 50GB (típicamente menos de 1MB),
pero crecerá cuando el dispositivo de almacenamiento virtualizado se vaya
llenando.

@item
Arranque la imagen de instalación USB en una máquina virtual:

@example
qemu-system-x86_64 -m 1024 -smp 1 -enable-kvm \
  -nic user,model=virtio-net-pci -boot menu=on,order=d \
  -drive file=guix-system.img \
  -drive media=cdrom,file=guix-system-install-@value{VERSION}.@var{sistema}.iso
@end example

@code{-enable-kvm} es opcional, pero mejora el rendimiento
significativamente, @pxref{Ejecutar Guix en una máquina virtual}.

@item
Ahora es root en la VM, prosiga con el procedimiento de
instalación. @xref{Preparación para la instalación}, y siga las instrucciones.
@end enumerate

Una vez complete la instalación, puede arrancar el sistema que está en la
imagen @file{guix-system.img}. @xref{Ejecutar Guix en una máquina virtual}, para información
sobre cómo hacerlo.

@node Construcción de la imagen de instalación
@section Construcción de la imagen de instalación

@cindex imagen de instalación
La imagen de instalación descrita anteriormente se construyó usando la orden
@command{guix system}, específicamente:

@example
guix system image -t iso9660 gnu/system/install.scm
@end example

Eche un vistazo a @file{gnu/system/install.scm} en el árbol de fuentes, y
vea también @ref{Invocación de guix system} para más información acerca de la
imagen de instalación.

@section Construcción de la imagen de instalación para placas ARM

Muchos dispositivos con procesador ARM necesitan una variante específica del
cargador de arranque @uref{https://www.denx.de/wiki/U-Boot/, U-Boot}.

Si construye una imagen de disco y el cargador de arranque no está
disponible de otro modo (en otra unidad de arranque, etc.), es recomendable
construir una imagen que incluya el cargador, específicamente:

@example
guix system image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")'
@end example

@code{A20-OLinuXino-Lime2} es el nombre de la placa. Si especifica una placa
no válida, una lista de placas posibles será mostrada.

@c *********************************************************************
@cindex troubleshooting, guix system
@cindex guix system troubleshooting
@node System Troubleshooting Tips
@chapter System Troubleshooting Tips

Guix System allows rebooting into a previous generation should the last one
be malfunctioning, which makes it quite robust against being broken
irreversibly.  This feature depends on GRUB being correctly functioning
though, which means that if for whatever reasons your GRUB installation
becomes corrupted during a system reconfiguration, you may not be able to
easily boot into a previous generation.  A technique that can be used in
this case is to @i{chroot} into your broken system and reconfigure it from
there.  Such technique is explained below.

@cindex chroot, guix system
@cindex chrooting, guix system
@cindex repairing GRUB, via chroot
@node Chrooting into an existing system
@section Chrooting into an existing system

This section details how to @i{chroot} to an already installed Guix System
with the aim of reconfiguring it, for example to fix a broken GRUB
installation.  The process is similar to how it would be done on other
GNU/Linux systems, but there are some Guix System particularities such as
the daemon and profiles that make it worthy of explaining here.

@enumerate
@item
Obtain a bootable image of Guix System.  It is recommended the latest
development snapshot so the kernel and the tools used are at least as as new
as those of your installed system; it can be retrieved from the
@url{https://ci.guix.gnu.org/search/latest/ISO-9660?query=spec:images+status:success+system:x86_64-linux+image.iso,
https://ci.guix.gnu.org} URL.  Follow the @pxref{Instalación desde memoria USB y DVD} section for copying it to a bootable media.

@item
Boot the image, and proceed with the graphical text-based installer until
your network is configured.  Alternatively, you could configure the network
manually by following the @ref{manual-installation-networking} section.  If
you get the error @samp{RTNETLINK answers: Operation not possible due to
RF-kill}, try @samp{rfkill list} followed by @samp{rfkill unblock 0}, where
@samp{0} is your device identifier (ID).

@item
Switch to a virtual console (tty) if you haven't already by pressing
simultaneously the @kbd{Control + Alt + F4} keys.  Mount your file system at
@file{/mnt}.  Assuming your root partition is @file{/dev/sda2}, you would
do:

@example sh
mount /dev/sda2 /mnt
@end example

@item
Mount special block devices and Linux-specific directories:

@example sh
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev /mnt/dev
@end example

If your system is EFI-based, you must also mount the ESP partition.
Assuming it is @file{/dev/sda1}, you can do so with:

@example sh
mount /dev/sda1 /mnt/boot/efi
@end example

@item
Enter your system via chroot:

@example sh
chroot /mnt /bin/sh
@end example

@item
Source the system profile as well as your @var{user} profile to setup the
environment, where @var{user} is the user name used for the Guix System you
are attempting to repair:

@example sh
source /var/guix/profiles/system/profile/etc/profile
source /home/@var{user}/.guix-profile/etc/profile
@end example

To ensure you are working with the Guix revision you normally would as your
normal user, also source your current Guix profile:

@example sh
source /home/@var{user}/.config/guix/current/etc/profile
@end example

@item
Start a minimal @command{guix-daemon} in the background:

@example sh
guix-daemon --build-users-group=guixbuild --disable-chroot &
@end example

@item
Edit your Guix System configuration if needed, then reconfigure with:

@example sh
guix system reconfigure your-config.scm
@end example

@item
Finally, you should be good to reboot the system to test your fix.

@end enumerate

@c *********************************************************************
@node Empezando
@chapter Empezando

Es probable que haya llegado a esta sección o bien porque haya instalado
Guix sobre otra distribución (@pxref{Instalación}), o bien porque haya
instalado el sistema Guix completo (@pxref{Instalación del sistema}). Es hora de
dar sus primeros pasos con Guix; esta sección intenta ser de ayuda con estos
primeros pasos y proporcionar una primera impresión sobre Guix.

Guix está orientado a instalar software, por lo que probablemente la primera
cosa que deseará hacer es mirar el software disponible. Digamos, por
ejemplo, que busca un editor de texto. Para ello puede ejecutar:

@example
guix search texto editor
@end example

Esta orden le muestra cierto número de @dfn{paquetes} asociados a dicha
búsqueda, mostrando con cada uno de ellos su nombre, versión, una
descripción e información adicional. Una vez que ha encontrado el que quiere
usar, digamos Emacs (je je je), puede seguir adelante e instalarlo (ejecute
esta orden con su cuenta de usuaria habitual, @emph{¡no necesita privilegios
de administración o usar la cuenta ``root''!}):

@example
guix install emacs
@end example

@cindex perfil
You've installed your first package, congrats! The package is now visible in
your default @dfn{profile}, @file{$HOME/.guix-profile}---a profile is a
directory containing installed packages.  In the process, you've probably
noticed that Guix downloaded pre-built binaries; or, if you explicitly chose
to @emph{not} use pre-built binaries, then probably Guix is still building
software (@pxref{Sustituciones}, for more info).

Si no está usando el sistema Guix, la orden @command{guix install} debe
haber mostrado este consejo:

@example
consejo: Considere proporcionar valor a las variables de entorno necesarias ejecutando:
     GUIX_PROFILE="$HOME/.guix-profile"
     . "$GUIX_PROFILE/etc/profile"

Alternativamente, véase `guix package --search-paths -p "$HOME/.guix-profile"'.
@end example

Indeed, you must now tell your shell where @command{emacs} and other
programs installed with Guix are to be found.  Pasting the two lines above
will do just that: it will add @code{$HOME/.guix-profile/bin}---which is
where the installed package is---to the @code{PATH} environment variable.
You can paste these two lines in your shell so they take effect right away,
but more importantly you should add them to @file{~/.bash_profile} (or
equivalent file if you do not use Bash) so that environment variables are
set next time you spawn a shell.  You only need to do this once and other
search paths environment variables will be taken care of similarly---e.g.,
if you eventually install @code{python} and Python libraries,
@env{GUIX_PYTHONPATH} will be defined.

Puede continuar instalando paquetes cuando quiera. Para enumerar los
paquetes instalados, ejecute:

@example
guix package --list-installed
@end example

Para borrar un paquete, deberá ejecutar @command{guix remove}. Una
característica distintiva es la capacidad de @dfn{revertir} cualquier
operación que haya realizado---instalación, borrado,
actualización---simplemente escribiendo:

@example
guix package --roll-back
@end example

Esto es debido al hecho de que cada operación en realidad es una
@dfn{transacción} que crea una nueva @dfn{generación}. Estas generaciones y
la diferencia entre ellas puede ser visualizada mediante la ejecución de:

@example
guix package --list-generations
@end example

¡Ahora ya conoce lo básico sobre gestión de paquetes!

@quotation Más allá
@xref{Gestión de paquetes}, para más información sobre gestión de
paquetes. Puede que le guste la gestión @dfn{declarativa} de paquetes con
@command{guix package --manifest}, la gestión de distintos @dfn{perfiles}
con @option{--profile}, el borrado de generaciones antiguas, la recolección
de basura y otras interesantes características que le serán útiles una vez
que se familiarice con Guix. Si es desarrolladora, @pxref{Desarrollo} para
herramientas adicionales. Y si simplemente tiene curiosidad,
@pxref{Características}, para echar un vistazo a su funcionamiento interno.
@end quotation

Una vez que haya instalado un conjunto de paquetes, deseará
@emph{actualizarlos} periódicamente a la última y mejor versión. Para
hacerlo, primero debe obtener la última revisión de Guix y su colección de
paquetes:

@example
guix pull
@end example

El resultado final es un nuevo ejecutable @command{guix}, que se encuentra
en @file{~/.config/guix/current/bin}. A menos que use el sistema Guix,
asegúrese de seguir el consejo que la orden muestra y, al igual que vimos
previamente, pegue estas dos líneas en su terminal y en
@file{.bash_profile}:

@example
GUIX_PROFILE="$HOME/.config/guix/current"
. "$GUIX_PROFILE/etc/profile"
@end example

@noindent
También le debe indicar a su intérprete que haga referencia a este nuevo
@command{guix}:

@example
hash guix
@end example

En este momento ya está ejecutando una nueva instalación de Guix. Por lo
tanto puede continuar y actualizar todos los paquetes que haya instalado
previamente:

@example
guix upgrade
@end example

Mientras se ejecuta esta orden verá que se descargan binarios (o quizá que
algunos paquetes se construyen) y tras cierto tiempo obtendrá los paquetes
actualizados. ¡Recuerde que siempre puede revertir esta acción en caso de
que uno de los paquetes no sea de su agrado!

Puede mostrar la revisión exacta de Guix que está ejecutando mediante la
orden:

@example
guix describe
@end example

La información que muestra contiene @emph{todo lo necesario para reproducir
exactamente el mismo Guix}, ya sea en otro momento o en una máquina
diferente.

@quotation Más allá
@xref{Invocación de guix pull}, para más información.  @xref{Canales}, para
saber cómo especificar @dfn{canales} adicionales de los que obtener
paquetes, cómo replicar Guix y más información. La orden
@command{time-machine} también le puede ser de utilidad (@pxref{Invocación de guix time-machine}).
@end quotation

Si ha instalado el sistema Guix, una de las primeras cosas que probablemente
desee hacer es actualizar su sistema. Una vez que haya ejecutado
@command{guix pull} con la última versión de Guix, puede actualizar su
sistema de este modo:

@example
sudo guix system reconfigure /etc/config.scm
@end example

Tras su finalización, el sistema ejecuta las últimas versiones de sus
paquetes de software. Cuando reinicie el sistema verá un menú en el cargador
de arranque que dice ``GNU system, old configurations...'': es lo que le
permite arrancar @emph{una generación anterior de su sistema}, en caso de
que la generación actual falle o resulte insatisfactoria de algún otro
modo. Al igual que con los paquetes, siempre puede @emph{revertir el sistema
completo} a una generación previa:

@example
sudo guix system roll-back
@end example

Habrá muchas cosas que probablemente quiera modificar su sistema para que se
adapte a sus necesidades: añadir nuevas cuentas de acceso, nuevos servicios
del sistema, modificar la configuración de esos servicios, etcétera. La
configuración del sistema se describe @emph{al completo} en el archivo
@file{/etc/config.scm}. @xref{Uso de la configuración del sistema} para aprender
cómo cambiarla.

¡Ya sabe lo suficiente para empezar!

@quotation Recursos
El resto de este manual proporciona una referencia para Guix al
completo. Esta es una lista de recursos adicionales que le pueden resultar
útiles:

@itemize
@item
@xref{Top,,, guix-cookbook, The GNU Guix Cookbook}, que contiene una lista
de recetas tipo ``cómo se hace'' para una variedad de casos.

@item
La @uref{https://guix.gnu.org/guix-refcard.pdf, tarjeta de referencia de GNU
Guix} enumera en dos páginas la mayor parte de las órdenes y opciones que
pueda necesitar en cualquier momento.

@item
La página web contiene @uref{https://guix.gnu.org/es/videos/, medios
audiovisuales instructivos} sobre temas como el uso diario de Guix, cómo
obtener ayuda y cómo contribuir.

@item
@xref{Documentación} para aprender cómo acceder a la documentación en su
máquina.
@end itemize

¡Esperamos que disfrute Guix tanto como la comunidad disfruta en su
construcción!
@end quotation

@c *********************************************************************
@node Gestión de paquetes
@chapter Gestión de paquetes

@cindex paquetes
El propósito de GNU Guix es permitir a las usuarias instalar, actualizar y
borrar fácilmente paquetes de software, sin tener que conocer acerca de sus
procedimientos de construcción o dependencias. Guix también va más allá de
este conjunto obvio de características.

Este capítulo describe las principales características de Guix, así como las
herramientas de gestión de paquetes que ofrece. Junto a la interfaz de línea
de órdenes descrita a continuación (@pxref{Invocación de guix package, @code{guix
package}}, también puede usar la interfaz Emacs-Guix (@pxref{Top,,,
emacs-guix, The Emacs Guix Reference Manual}), tras la instalación del
paquete @code{emacs-guix} (ejecute la orden @kbd{M-x guix-help} para
iniciarse en su uso):

@example
guix install emacs-guix
@end example

@menu
* Características::         Cómo Guix dará brillo a su vida.
* Invocación de guix package::  Instalación de paquetes, borrado, etc.
* Sustituciones::            Descargar binarios pre-construidos.
* Paquetes con múltiples salidas::  Un único paquete de fuentes, 
                                       múltiples salidas.
* Invocación de guix gc::   Ejecutar el recolector de basura.
* Invocación de guix pull::  Obtener la última versión de Guix y la 
                                distribución.
* Invocación de guix time-machine::  Ejecutar una versión antigua de Guix.
* Inferiores::               Interactuar con otra revisión de Guix.
* Invocación de guix describe::  Muestra información acerca de su 
                                    revisión de Guix.
* Invocación de guix archive::  Exportar e importar archivos del almacén.
@end menu

@node Características
@section Características

Se asume que ya ha dado sus primeros pasos con Guix (@pxref{Empezando}) y desea obtener información general sobre cómo funciona la
implementación internamente.

Cuando se usa Guix, cada paquete se encuentra en el @dfn{almacén de
paquetes}, en su propio directorio---algo que se asemeja a
@file{/gnu/store/xxx-paquete-1.2}, donde @code{xxx} es una cadena en base32.

En vez de referirse a estos directorios, las usuarias tienen su propio
@dfn{perfil}, el cual apunta a los paquetes que realmente desean usar. Estos
perfiles se almacenan en el directorio de cada usuaria, en
@code{$HOME/.guix-profile}.

Por ejemplo, @code{alicia} instala GCC 4.7.2. Como resultado,
@file{/home/alicia/.guix-profile/bin/gcc} apunta a
@file{/gnu/store/@dots{}-gcc-4.7.2/bin/gcc}. Ahora, en la misma máquina,
@code{rober} ha instalado ya GCC 4.8.0. El perfil de @code{rober}
simplemente sigue apuntando a
@file{/gnu/store/@dots{}-gcc-4.8.0/bin/gcc}---es decir, ambas versiones de
GCC pueden coexistir en el mismo sistema sin ninguna interferencia.

La orden @command{guix package} es la herramienta central para gestión de
paquetes (@pxref{Invocación de guix package}). Opera en los perfiles de usuaria,
y puede ser usada @emph{con privilegios de usuaria normal}.

@cindex transacciones
La orden proporciona las operaciones obvias de instalación, borrado y
actualización. Cada invocación es en realidad una @emph{transacción}: o bien
la operación especificada se realiza satisfactoriamente, o bien nada
sucede. Por tanto, si el proceso @command{guix package} es finalizado
durante una transacción, o un fallo eléctrico ocurre durante la transacción,
el perfil de usuaria permanece en su estado previo, y permanece usable.

Además, cualquier transacción de paquetes puede ser @emph{vuelta atrás}. Si,
por ejemplo, una actualización instala una nueva versión de un paquete que
resulta tener un error importante, las usuarias pueden volver a la instancia
previa de su perfil, de la cual se tiene constancia que funcionaba bien. De
igual modo, la configuración global del sistema en Guix está sujeta a
actualizaciones transaccionales y vuelta atrás (@pxref{Uso de la configuración del sistema}).

Todos los paquetes en el almacén de paquetes pueden ser @emph{eliminados por
el recolector de basura}. Guix puede determinar a qué paquetes hacen
referencia todavía los perfiles de usuarias, y eliminar aquellos que, de
forma demostrable, no se haga referencia en ningún perfil (@pxref{Invocación de guix gc}). Las usuarias pueden también borrar explícitamente generaciones
antiguas de su perfil para que los paquetes a los que hacen referencia
puedan ser recolectados.

@cindex reproducibilidad
@cindex construcciones reproducibles
Guix toma una aproximación @dfn{puramente funcional} en la gestión de
paquetes, como se describe en la introducción (@pxref{Introducción}). Cada
nombre de directorio de paquete en @file{/gnu/store} contiene un hash de
todas las entradas que fueron usadas para construir el paquete---compilador,
bibliotecas, guiones de construcción, etc. Esta correspondencia directa
permite a las usuarias asegurarse que una instalación dada de un paquete
corresponde al estado actual de su distribución. Esto también ayuda a
maximizar la @dfn{reproducibilidad de la construcción}: gracias al uso de
entornos aislados de construcción, una construcción dada probablemente
generará archivos idénticos bit-a-bit cuando se realice en máquinas
diferentes (@pxref{Invocación de guix-daemon, container}).

@cindex sustituciones
Estos cimientos permiten a Guix ofrecer @dfn{despliegues transparentes de
binarios/fuentes}. Cuando un binario pre-construido para un elemento de
@file{/gnu/store} está disponible para descarga de una fuente externa---una
@dfn{sustitución}, Guix simplemente lo descarga y desempaqueta; en otro caso
construye el paquete de las fuentes, localmente
(@pxref{Sustituciones}). Debido a que los resultados de construcción son
normalmente reproducibles bit-a-bit, las usuarias no tienen que confiar en
los servidores que proporcionan sustituciones: pueden forzar una
construcción local y @emph{retar} a las proveedoras (@pxref{Invocación de guix challenge}).

Control over the build environment is a feature that is also useful for
developers.  The @command{guix shell} command allows developers of a package
to quickly set up the right development environment for their package,
without having to manually install the dependencies of the package into
their profile (@pxref{Invoking guix shell}).

@cindex replicación, de entornos de software
@cindex seguimiento de procedencia, de artefactos de software
Todo Guix y sus definiciones de paquetes están bajo control de versiones, y
@command{guix pull} le permite ``viajar en el tiempo'' por la historia del
mismo Guix (@pxref{Invocación de guix pull}). Esto hace posible replicar una
instancia de Guix en una máquina diferente o en un punto posterior del
tiempo, lo que a su vez le permite @emph{replicar entornos de software
completos}, mientras que mantiene un preciso @dfn{seguimiento de la
procedencia} del software.

@node Invocación de guix package
@section Invocación de @command{guix package}

@cindex instalar paquetes
@cindex borrar paquetes
@cindex instalación de paquetes
@cindex borrado de paquetes
@cindex perfil
@cindex @command{guix package}
The @command{guix package} command is the tool that allows users to install,
upgrade, and remove packages, as well as rolling back to previous
configurations.  These operations work on a user @dfn{profile}---a directory
of installed packages.  Each user has a default profile in
@file{$HOME/.guix-profile}.  The command operates only on the user's own
profile, and works with normal user privileges (@pxref{Características}).  Its
syntax is:

@example
guix package @var{opciones}
@end example

@cindex transacciones
Primariamente, @var{opciones} especifica las operaciones a ser realizadas
durante la transacción. Al completarse, un nuevo perfil es creado, pero las
@dfn{generaciones} previas del perfil permanecen disponibles, en caso de que
la usuaria quisiera volver atrás.

Por ejemplo, para borrar @code{lua} e instalar @code{guile} y
@code{guile-cairo} en una única transacción:

@example
guix package -r lua -i guile guile-cairo
@end example

@cindex alias de @command{guix package}
Para su conveniencia, también se proporcionan los siguientes alias:

@itemize
@item
@command{guix search} es un alias de @command{guix package -s},
@item
@command{guix install} es un alias de @command{guix package -i},
@item
@command{guix remove} es un alias de @command{guix package -r},
@item
@command{guix upgrade} es un alias de @command{guix package -u}
@item
y @command{guix show} es un alias de @command{guix package --show=}.
@end itemize

Estos alias tienen menos capacidad expresiva que @command{guix package} y
proporcionan menos opciones, por lo que en algunos casos es probable que
desee usar @command{guix package} directamente.

@command{guix package} también proporciona una @dfn{aproximación
declarativa}, donde la usuaria especifica el conjunto exacto de paquetes a
poner disponibles y la pasa a través de la opción @option{--manifest}
(@pxref{profile-manifest, @option{--manifest}}).

@cindex perfil
Para cada usuaria, un enlace simbólico al perfil predeterminado de la
usuaria es creado en @file{$HOME/.guix-profile}. Este enlace simbólico
siempre apunta a la generación actual del perfil predeterminado de la
usuaria. Por lo tanto, las usuarias pueden añadir
@file{$HOME/.guix-profile/bin} a su variable de entorno @env{PATH},
etcétera.
@cindex rutas de búsqueda
Si no está usando el sistema Guix, considere la adición de las siguientes
líneas en su @file{~/.bash_profile} (@pxref{Bash Startup Files,,, bash, The
GNU Bash Reference Manual}) de manera que los nuevos intérpretes que ejecute
obtengan todas las definiciones correctas de las variables de entorno:

@example
GUIX_PROFILE="$HOME/.guix-profile" ; \
source "$GUIX_PROFILE/etc/profile"
@end example

En una configuración multiusuaria, los perfiles de usuaria se almacenan en
un lugar registrado como una @dfn{raíz del sistema de archivos}, a la que
apunta @file{$HOME/.guix-profile} (@pxref{Invocación de guix gc}). Ese directorio
normalmente es
@code{@var{localstatedir}/guix/profiles/per-user/@var{usuaria}}, donde
@var{localstatedir} es el valor pasado a @code{configure} como
@option{--localstatedir} y @var{usuaria} es el nombre de usuaria. El
directorio @file{per-user} se crea cuando se lanza @command{guix-daemon}, y
el subdirectorio @var{usuaria} es creado por @command{guix package}.

Las @var{opciones} pueden ser las siguientes:

@table @code

@item --install=@var{paquete} @dots{}
@itemx -i @var{paquete} @dots{}
Instala los @var{paquete}s especificados.

Each @var{package} may specify a simple package name, such as @code{guile},
optionally followed by an at-sign and version number, such as
@code{guile@@3.0.7} or simply @code{guile@@3.0}.  In the latter case, the
newest version prefixed by @code{3.0} is selected.

If no version number is specified, the newest available version will be
selected.  In addition, such a @var{package} specification may contain a
colon, followed by the name of one of the outputs of the package, as in
@code{gcc:doc} or @code{binutils@@2.22:lib} (@pxref{Paquetes con múltiples salidas}).

Packages with a corresponding name (and optionally version) are searched for
among the GNU distribution modules (@pxref{Módulos de paquetes}).

Alternatively, a @var{package} can directly specify a store file name such
as @file{/gnu/store/...-guile-3.0.7}, as produced by, e.g., @code{guix
build}.

@cindex entradas propagadas
A veces los paquetes tienen @dfn{entradas propagadas}: estas son las
dependencias que se instalan automáticamente junto al paquete requerido
(@pxref{package-propagated-inputs, @code{propagated-inputs} in
@code{package} objects}, para información sobre las entradas propagadas en
las definiciones de paquete).

@anchor{package-cmd-propagated-inputs}
Un ejemplo es la biblioteca GNU MPC: sus archivos de cabecera C hacen
referencia a los de la biblioteca GNU MPFR, que a su vez hacen referencia a
los de la biblioteca GMP. Por tanto, cuando se instala MPC, las bibliotecas
MPFR y GMP también se instalan en el perfil; borrar MPC también borra MPFR y
GMP---a menos que también se hayan instalado explícitamente por la usuaria.

Por otra parte, los paquetes a veces dependen de la definición de variables
de entorno para sus rutas de búsqueda (véase a continuación la explicación
de @option{--seach-paths}). Cualquier definición de variable de entorno que
falte o sea posiblemente incorrecta se informa aquí.

@item --install-from-expression=@var{exp}
@itemx -e @var{exp}
Instala el paquete al que @var{exp} evalúa.

@var{exp} debe ser una expresión Scheme que evalúe a un objeto
@code{<package>}. Esta opción es notablemente útil para diferenciar entre
variantes con el mismo nombre de paquete, con expresiones como @code{(@@
(gnu packages base) guile-final)}.

Fíjese que esta opción instala la primera salida del paquete especificado,
lo cual puede ser insuficiente cuando se necesita una salida específica de
un paquete con múltiples salidas.

@item --install-from-file=@var{archivo}
@itemx -f @var{archivo}
Instala el paquete que resulta de evaluar el código en @var{archivo}.

Como un ejemplo, @var{archivo} puede contener una definición como esta
(@pxref{Definición de paquetes}):

@lisp
@include package-hello.scm
@end lisp

Developers may find it useful to include such a @file{guix.scm} file in the
root of their project source tree that can be used to test development
snapshots and create reproducible development environments (@pxref{Invoking guix shell}).

El @var{archivo} puede contener también una representación en JSON de una o
más definiciones de paquetes. Ejecutar @code{guix package -f} en
@file{hello.json} con el contenido mostrado a continuación provocará la
instalación del paquete @code{greeter} tras la construcción de
@code{myhello}:

@example
@verbatiminclude package-hello.json
@end example

@item --remove=@var{paquete} @dots{}
@itemx -r @var{paquete} @dots{}
Borra los @var{paquete}s especificados.

Como en @option{--install}, cada @var{paquete} puede especificar un número
de versión y/o un nombre de salida además del nombre del paquete. Por
ejemplo, @code{-r glibc:debug} eliminaría la salida @code{debug} de
@code{glibc}.

@item --upgrade[=@var{regexp} @dots{}]
@itemx -u [@var{regexp} @dots{}]
@cindex actualizar paquetes
Actualiza todos los paquetes instalados. Si se especifica una o más
expresiones regular @var{regexp}, actualiza únicamente los paquetes
instalados cuyo nombre es aceptado por @var{regexp}. Véase también la opción
@option{--do-not-upgrade} más adelante.

Tenga en cuenta que esto actualiza los paquetes a la última versión
encontrada en la distribución instalada actualmente. Para actualizar su
distribución, debe ejecutar regularmente @command{guix pull}
(@pxref{Invocación de guix pull}).

@cindex transformación de paquetes, actualizaciones
Al actualizar,  las transformaciones que se aplicaron originalmente al crear
el perfil se aplican de nuevo de manera automática (@pxref{Opciones de transformación de paquetes}). Por ejemplo, asumiendo que hubiese instalado Emacs
a partir de la última revisión de su rama de desarrollo con:

@example
guix install emacs-next --with-branch=emacs-next=master
@end example

La próxima vez que ejecute @command{guix upgrade} Guix obtendrá de nuevo la
última revisión de la rama de desarrollo de Emacs y construirá
@code{emacs-next} a partir de ese código.

Tenga en cuenta que las opciones de transformación, como por ejemplo
@option{--with-branch} y @option{--with-source}, dependen de un estado
externo; es su responsabilidad asegurarse de que funcionen de la manera
esperada. También puede deshacer las transformaciones aplicadas a un paquete
con la siguiente orden:

@example
guix install @var{paquete}
@end example

@item --do-not-upgrade[=@var{regexp} @dots{}]
Cuando se usa junto a la opción @option{--upgrade}, @emph{no} actualiza
ningún paquete cuyo nombre sea aceptado por @var{regexp}. Por ejemplo, para
actualizar todos los paquetes en el perfil actual excepto aquellos que
contengan la cadena ``emacs'':

@example
$ guix package --upgrade . --do-not-upgrade emacs
@end example

@item @anchor{profile-manifest}--manifest=@var{archivo}
@itemx -m @var{archivo}
@cindex declaración del perfil
@cindex manifiesto del perfil
Crea una nueva generación del perfil desde el objeto de manifiesto devuelto
por el código Scheme en @var{archivo}. Esta opción puede repetirse varias
veces, en cuyo caso los manifiestos se concatenan.

Esto le permite @emph{declarar} los contenidos del perfil en vez de
construirlo a través de una secuencia de @option{--install} y órdenes
similares. La ventaja es que @var{archivo} puede ponerse bajo control de
versiones, copiarse a máquinas diferentes para reproducir el mismo perfil, y
demás.

@var{archivo} debe devolver un objeto @dfn{manifest}, que es básicamente una
lista de paquetes:

@findex packages->manifest
@lisp
(use-package-modules guile emacs)

(packages->manifest
 (list emacs
       guile-2.0
       ;; Usa una salida específica del paquete.
       (list guile-2.0 "debug")))
@end lisp

@xref{Writing Manifests}, for information on how to write a manifest.
@xref{export-manifest, @option{--export-manifest}}, to learn how to obtain a
manifest file from an existing profile.

@item --roll-back
@cindex revertir (``roll back'')
@cindex deshacer transacciones
@cindex transacciones, deshacer
Vuelve a la @dfn{generación} previa del perfil---es decir, revierte la
última transacción.

Cuando se combina con opciones como @option{--install}, la reversión atrás
ocurre antes que cualquier acción.

Cuando se vuelve atrás en la primera generación que realmente contiene
paquetes instalados, se hace que el perfil apunte a la @dfn{generación
cero}, la cual no contiene ningún archivo a excepción de sus propios
metadatos.

Después de haber vuelto atrás, instalar, borrar o actualizar paquetes
sobreescribe las generaciones futuras previas. Por tanto, la historia de las
generaciones en un perfil es siempre linear.

@item --switch-generation=@var{patrón}
@itemx -S @var{patrón}
@cindex generaciones
Cambia a una generación particular definida por el @var{patrón}.

@var{patrón} puede ser tanto un número de generación como un número
prefijado con ``+'' o ``-''. Esto último significa: mueve atrás/hacia
delante el número especificado de generaciones. Por ejemplo, si quiere
volver a la última generación antes de @option{--roll-back}, use
@option{--switch-generation=+1}.

La diferencia entre @option{--roll-back} y @option{--switch-generation=-1}
es que @option{--switch-generation} no creará una generación cero, así que
si la generación especificada no existe, la generación actual no se verá
cambiada.

@item --search-paths[=@var{tipo}]
@cindex rutas de búsqueda
Informa de variables de entorno, en sintaxis Bash, que pueden necesitarse
para usar el conjunto de paquetes instalado. Estas variables de entorno se
usan para especificar las @dfn{rutas de búsqueda} para archivos usadas por
algunos de los paquetes.

For example, GCC needs the @env{CPATH} and @env{LIBRARY_PATH} environment
variables to be defined so it can look for headers and libraries in the
user's profile (@pxref{Environment Variables,,, gcc, Using the GNU Compiler
Collection (GCC)}).  If GCC and, say, the C library are installed in the
profile, then @option{--search-paths} will suggest setting these variables
to @file{@var{profile}/include} and @file{@var{profile}/lib}, respectively
(@pxref{Search Paths}, for info on search path specifications associated
with packages.)

El caso de uso típico es para definir estas variables de entorno en el
intérprete de consola:

@example
$ eval $(guix package --search-paths)
@end example

@var{tipo} puede ser @code{exact}, @code{prefix} o @code{suffix}, lo que
significa que las definiciones de variables de entorno devueltas serán
respectivamente las configuraciones exactas, prefijos o sufijos del valor
actual de dichas variables. Cuando se omite, el valor predeterminado de
@var{tipo} es @code{exact}.

Esta opción puede usarse para calcular las rutas de búsqueda
@emph{combinadas} de varios perfiles. Considere este ejemplo:

@example
$ guix package -p foo -i guile
$ guix package -p bar -i guile-json
$ guix package -p foo -p bar --search-paths
@end example

La última orden informa sobre la variable @env{GUILE_LOAD_PATH}, aunque,
tomada individualmente, ni @file{foo} ni @file{bar} hubieran llevado a esa
recomendación.


@cindex profile, choosing
@item --profile=@var{perfil}
@itemx -p @var{perfil}
Usa @var{perfil} en vez del perfil predeterminado de la usuaria.

@var{perfil} debe ser el nombre de un archivo que se creará tras completar
las tareas. Concretamente, @var{perfil} sera simplemente un enlace simbólico
(``symlink'') que apunta al verdadero perfil en el que se instalan los
paquetes:

@example
$ guix install hello -p ~/código/mi-perfil
@dots{}
$ ~/código/mi-perfil/bin/hello
¡Hola mundo!
@end example

Todo lo necesario para deshacerse del perfil es borrar dicho enlace
simbólico y sus enlaces relacionados que apuntan a generaciones específicas:

@example
$ rm ~/código/mi-perfil ~/código/mi-perfil-*-link
@end example

@item --list-profiles
Enumera los perfiles de la usuaria:

@example
$ guix package --list-profiles
/home/carlos/.guix-profile
/home/carlos/código/mi-perfil
/home/carlos/código/perfil-desarrollo
/home/carlos/tmp/prueba
@end example

Cuando se ejecuta como root, enumera todos los perfiles de todas las
usuarias.

@cindex colisiones, en un perfil
@cindex paquetes con colisiones en perfiles
@cindex colisiones del perfil
@item --allow-collisions
Permite colisiones de paquetes en el nuevo perfil. ¡Úselo bajo su propio
riesgo!

Por defecto, @command{guix package} informa como un error las
@dfn{colisiones} en el perfil. Las colisiones ocurren cuando dos o más
versiones diferentes o variantes de un paquete dado se han seleccionado para
el perfil.

@item --bootstrap
Use el Guile usado para el lanzamiento para construir el perfil. Esta opción
es util únicamente a las desarrolladoras de la distribución.

@end table

Además de estas acciones, @command{guix package} acepta las siguientes
opciones para consultar el estado actual de un perfil, o la disponibilidad
de paquetes:

@table @option

@item --search=@var{regexp}
@itemx -s @var{regexp}
@anchor{guix-search}
@cindex buscar paquetes
Enumera los paquetes disponibles cuyo nombre, sinopsis o descripción
corresponde con @var{regexp} (sin tener en cuenta la capitalización),
ordenados por relevancia. Imprime todos los metadatos de los paquetes
coincidentes en formato @code{recutils} (@pxref{Top, GNU recutils
databases,, recutils, GNU recutils manual}).

Esto permite extraer campos específicos usando la orden @command{recsel},
por ejemplo:

@example
$ guix package -s malloc | recsel -p name,version,relevance
name: jemalloc
version: 4.5.0
relevance: 6

name: glibc
version: 2.25
relevance: 1

name: libgc
version: 7.6.0
relevance: 1
@end example

De manera similar, para mostrar el nombre de todos los paquetes disponibles
bajo los términos de la GNU@tie{}LGPL versión 3:

@example
$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"'
name: elfutils

name: gmp
@dots{}
@end example

También es posible refinar los resultados de búsqueda mediante el uso de
varias opciones @code{-s}, o varios parámetros a @command{guix search}. Por
ejemplo, la siguiente orden devuelve un lista de juegos de
mesa@footnote{NdT: board en inglés.} (esta vez mediante el uso del alias
@command{guix search}:

@example
$ guix search '\<board\>' game | recsel -p name
name: gnubg
@dots{}
@end example

Si omitimos @code{-s game}, también obtendríamos paquetes de software que
tengan que ver con placas de circuitos impresos ("circuit board" en inglés);
borrar los signos mayor y menor alrededor de @code{board} añadiría paquetes
que tienen que ver con teclados (keyboard en inglés).

Y ahora para un ejemplo más elaborado. La siguiente orden busca bibliotecas
criptográficas, descarta bibliotecas Haskell, Perl, Python y Ruby, e imprime
el nombre y la sinopsis de los paquetes resultantes:

@example
$ guix search crypto library | \
    recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis
@end example

@noindent
@xref{Selection Expressions,,, recutils, GNU recutils manual}, para más
información en @dfn{expresiones de selección} para @code{recsel -e}.

@item --show=@var{paquete}
Muestra los detalles del @var{paquete}, tomado de la lista disponible de
paquetes, en formato @code{recutils} (@pxref{Top, GNU recutils databases,,
recutils, GNU recutils manual}).

@example
$ guix package --show=guile | recsel -p name,version
name: guile
version: 3.0.5

name: guile
version: 3.0.2

name: guile
version: 2.2.7
@dots{}
@end example

También puede especificar el nombre completo de un paquete para únicamente
obtener detalles sobre una versión específica (esta vez usando el alias
@command{guix show}):
@example
$ guix show guile@@3.0.5 | recsel -p name,version
name: guile
version: 3.0.5
@end example

@item --list-installed[=@var{regexp}]
@itemx -I [@var{regexp}]
Enumera los paquetes actualmente instalados en el perfil especificado, con
los últimos paquetes instalados mostrados al final. Cuando se especifica
@var{regexp}, enumera únicamente los paquetes instalados cuyos nombres son
aceptados por @var{regexp}.

Por cada paquete instalado, imprime los siguientes elementos, separados por
tabuladores: el nombre del paquete, la cadena de versión, la parte del
paquete que está instalada (por ejemplo, @code{out} para la salida
predeterminada, @code{include} para sus cabeceras, etc.), y la ruta de este
paquete en el almacén.

@item --list-available[=@var{regexp}]
@itemx -A [@var{regexp}]
Enumera los paquetes disponibles actualmente en la distribución para este
sistema (@pxref{Distribución GNU}). Cuando se especifica @var{regexp},
enumera únicamente paquetes disponibles cuyo nombre coincide con
@var{regexp}.

Por cada paquete, imprime los siguientes elementos separados por
tabuladores: su nombre, su cadena de versión, las partes del paquete
(@pxref{Paquetes con múltiples salidas}) y la dirección de las fuentes de su
definición.

@item --list-generations[=@var{patrón}]
@itemx -l [@var{patrón}]
@cindex generaciones
Devuelve una lista de generaciones junto a sus fechas de creación; para cada
generación, muestra los paquetes instalados, con los paquetes instalados más
recientemente mostrados los últimos. Fíjese que la generación cero nunca se
muestra.

Por cada paquete instalado, imprime los siguientes elementos, separados por
tabuladores: el nombre de un paquete, su cadena de versión, la parte del
paquete que está instalada (@pxref{Paquetes con múltiples salidas}), y la
ruta de este paquete en el almacén.

Cuando se usa @var{patrón}, la orden devuelve únicamente las generaciones
que se ajustan al patrón. Entre los patrones adecuados se encuentran:

@itemize
@item @emph{Enteros y enteros separados por comas}. Ambos patrones denotan
números de generación. Por ejemplo, @option{--list-generations=1} devuelve
la primera.

Y @option{--list-generations=1,8,2} devuelve las tres generaciones en el
orden especificado. No se permiten ni espacios ni una coma al final.

@item @emph{Rangos}.  @option{--list-generations=2..9} imprime
las generaciones especificadas y todas las intermedias. Fíjese que el inicio
de un rango debe ser menor a su fin.

También es posible omitir el destino final. Por ejemplo,
@option{--list-generations=2..} devuelve todas las generaciones empezando
por la segunda.

@item @emph{Duraciones}. Puede también obtener los últimos @emph{N}@tie{}días, semanas,
o meses pasando un entero junto a la primera letra de la duración. Por
ejemplo, @option{--list-generations=20d} enumera las generaciones que tienen
hasta 20 días de antigüedad.
@end itemize

@item --delete-generations[=@var{patrón}]
@itemx -d [@var{patrón}]
Cuando se omite @var{patrón}, borra todas las generaciones excepto la
actual.

Esta orden acepta los mismos patrones que
@option{--list-generations}. Cuando se especifica un @var{patrón}, borra las
generaciones coincidentes. Cuando el @var{patrón} especifica una duración,
las generaciones @emph{más antiguas} que la duración especificada son las
borradas. Por ejemplo, @option{--delete-generations=1m} borra las
generaciones de más de un mes de antigüedad.

Si la generación actual entra en el patrón, @emph{no} es borrada. Tampoco la
generación cero es borrada nunca.

Preste atención a que el borrado de generaciones previas impide la reversión
a su estado. Consecuentemente esta orden debe ser usada con cuidado.

@cindex manifest, exporting
@anchor{export-manifest}
@item --export-manifest
Write to standard output a manifest suitable for @option{--manifest}
corresponding to the chosen profile(s).

This option is meant to help you migrate from the ``imperative'' operating
mode---running @command{guix install}, @command{guix upgrade}, etc.---to the
declarative mode that @option{--manifest} offers.

Be aware that the resulting manifest @emph{approximates} what your profile
actually contains; for instance, depending on how your profile was created,
it can refer to packages or package versions that are not exactly what you
specified.

Keep in mind that a manifest is purely symbolic: it only contains package
names and possibly versions, and their meaning varies over time.  If you
wish to ``pin'' channels to the revisions that were used to build the
profile(s), see @option{--export-channels} below.

@cindex pinning, channel revisions of a profile
@item --export-channels
Write to standard output the list of channels used by the chosen profile(s),
in a format suitable for @command{guix pull --channels} or @command{guix
time-machine --channels} (@pxref{Canales}).

Together with @option{--export-manifest}, this option provides information
allowing you to replicate the current profile (@pxref{Replicación de Guix}).

However, note that the output of this command @emph{approximates} what was
actually used to build this profile.  In particular, a single profile might
have been built from several different revisions of the same channel.  In
that case, @option{--export-manifest} chooses the last one and writes the
list of other revisions in a comment.  If you really need to pick packages
from different channel revisions, you can use inferiors in your manifest to
do so (@pxref{Inferiores}).

Together with @option{--export-manifest}, this is a good starting point if
you are willing to migrate from the ``imperative'' model to the fully
declarative model consisting of a manifest file along with a channels file
pinning the exact channel revision(s) you want.
@end table

Finally, since @command{guix package} may actually start build processes, it
supports all the common build options (@pxref{Opciones comunes de construcción}).  It
also supports package transformation options, such as
@option{--with-source}, and preserves them across upgrades (@pxref{Opciones de transformación de paquetes}).

@node Sustituciones
@section Sustituciones

@cindex sustituciones
@cindex binarios pre-construidos
Guix permite despliegues transparentes de fuentes/binarios, lo que significa
que puede tanto construir cosas localmente, como descargar elementos
preconstruidos de un servidor, o ambas. Llamamos a esos elementos
preconstruidos @dfn{sustituciones}---son sustituciones de los resultados de
construcciones locales. En muchos casos, descargar una sustitución es mucho
más rápido que construirla localmente.

Las sustituciones pueden ser cualquier cosa que resulte de una construcción
de una derivación (@pxref{Derivaciones}). Por supuesto, en el caso común, son
paquetes binarios preconstruidos, pero los archivos de fuentes, por ejemplo,
que también resultan de construcciones de derivaciones, pueden estar
disponibles como sustituciones.

@menu
* Official Substitute Servers::  Una fuente particular de sustituciones.
* Autorización de servidores de sustituciones::  Cómo activar o desactivar 
                                                    las sustituciones.
* Obtención de sustiticiones desde otros servidores::  Diversidad en las 
                                                          sustituciones.
* Verificación de sustituciones::  Cómo verifica las sustituciones Guix.
* Configuración de la pasarela.::  Cómo obtener sustituciones a través de 
                                      una pasarela.
* Fallos en las sustituciones::  Qué pasa cuando una sustitución falla.
* Sobre la confianza en binarios::  ¿Cómo puede confiar en esa masa amorfa 
                                      de datos binarios?
@end menu

@node Official Substitute Servers
@subsection Official Substitute Servers

@cindex granja de construcción
@code{@value{SUBSTITUTE-SERVER-1}} and @code{@value{SUBSTITUTE-SERVER-2}}
are both front-ends to official build farms that build packages from Guix
continuously for some architectures, and make them available as
substitutes.  These are the default source of substitutes; which can be
overridden by passing the @option{--substitute-urls} option either to
@command{guix-daemon} (@pxref{daemon-substitute-urls,, @code{guix-daemon
--substitute-urls}})  or to client tools such as @command{guix package}
(@pxref{client-substitute-urls,, client @option{--substitute-urls} option}).

Las URLs de sustituciones pueden ser tanto HTTP como HTTPS. Se recomienda
HTTPS porque las comunicaciones están cifradas; de modo contrario, usar HTTP
hace visibles todas las comunicaciones para alguien que las intercepte,
quien puede usar la información obtenida para determinar, por ejemplo, si su
sistema tiene vulnerabilidades de seguridad sin parchear.

Substitutes from the official build farms are enabled by default when using
Guix System (@pxref{Distribución GNU}).  However, they are disabled by
default when using Guix on a foreign distribution, unless you have
explicitly enabled them via one of the recommended installation steps
(@pxref{Instalación}).  The following paragraphs describe how to enable or
disable substitutes for the official build farm; the same procedure can also
be used to enable substitutes for any other substitute server.

@node Autorización de servidores de sustituciones
@subsection Autorización de servidores de sustituciones

@cindex seguridad
@cindex sustituciones, autorización de las mismas
@cindex listas de control de acceso (ACL), para sustituciones
@cindex ACL (listas de control de acceso), para sustituciones
To allow Guix to download substitutes from
@code{@value{SUBSTITUTE-SERVER-1}}, @code{@value{SUBSTITUTE-SERVER-2}} or a
mirror, you must add the relevant public key to the access control list
(ACL) of archive imports, using the @command{guix archive} command
(@pxref{Invocación de guix archive}).  Doing so implies that you trust the
substitute server to not be compromised and to serve genuine substitutes.

@quotation Nota
If you are using Guix System, you can skip this section: Guix System
authorizes substitutes from @code{@value{SUBSTITUTE-SERVER-1}} and
@code{@value{SUBSTITUTE-SERVER-2}} by default.
@end quotation

The public keys for each of the project maintained substitute servers are
installed along with Guix, in @code{@var{prefix}/share/guix/}, where
@var{prefix} is the installation prefix of Guix.  If you installed Guix from
source, make sure you checked the GPG signature of
@file{guix-@value{VERSION}.tar.gz}, which contains this public key file.
Then, you can run something like this:

@example
# guix archive --authorize < @var{prefix}/share/guix/@value{SUBSTITUTE-SERVER-1}.pub
# guix archive --authorize < @var{prefix}/share/guix/@value{SUBSTITUTE-SERVER-2}.pub
@end example

Una vez esté autorizada, la salida de una orden como @code{guix build}
debería cambiar de algo como:

@example
$ guix build emacs --dry-run
Se construirían las siguientes derivaciones:
   /gnu/store/yr7bnx8xwcayd6j95r2clmkdl1qh688w-emacs-24.3.drv
   /gnu/store/x8qsh1hlhgjx6cwsjyvybnfv2i37z23w-dbus-1.6.4.tar.gz.drv
   /gnu/store/1ixwp12fl950d15h2cj11c73733jay0z-alsa-lib-1.0.27.1.tar.bz2.drv
   /gnu/store/nlma1pw0p603fpfiqy7kn4zm105r5dmw-util-linux-2.21.drv
@dots{}
@end example

@noindent
a algo así:

@example
$ guix build emacs --dry-run
Se descargarían 112.3 MB:
   /gnu/store/pk3n22lbq6ydamyymqkkz7i69wiwjiwi-emacs-24.3
   /gnu/store/2ygn4ncnhrpr61rssa6z0d9x22si0va3-libjpeg-8d
   /gnu/store/71yz6lgx4dazma9dwn2mcjxaah9w77jq-cairo-1.12.16
   /gnu/store/7zdhgp0n1518lvfn8mb96sxqfmvqrl7v-libxrender-0.9.7
@dots{}
@end example

@noindent
The text changed from ``The following derivations would be built'' to
``112.3 MB would be downloaded''.  This indicates that substitutes from the
configured substitute servers are usable and will be downloaded, when
possible, for future builds.

@cindex sustituciones, cómo desactivar
El mecanismo de sustituciones puede ser desactivado globalmente ejecutando
@code{guix-daemon} con @option{--no-subsitutes} (@pxref{Invocación de guix-daemon}). También puede ser desactivado temporalmente pasando la opción
@option{--no-substitutes} a @command{guix package}, @command{guix build} y
otras herramientas de línea de órdenes.

@node Obtención de sustiticiones desde otros servidores
@subsection Obtención de sustiticiones desde otros servidores

@cindex servidores de sustituciones, añadir más
Guix puede buscar y obtener sustituciones a partir de varios
servidores. Esto es útil cuando se usan paquetes de canales adicionales para
los que el servidor oficial no proporciona sustituciones pero otros
servidores sí. Otra situación donde puede esta característica puede ser útil
es en el caso de que prefiera realizar las descargas desde el servidor de
sustituciones de su organización, accediendo al servidor oficial únicamente
como mecanismo de salvaguarda o no usándolo en absoluto.

Puede proporcionarle a Guix una lista de URL de servidores de los que
obtener sustituciones y las comprobará en el orden especificado. También es
necesario que autorice explícitamente las claves públicas de los servidores
de sustituciones para que Guix acepte las sustituciones firmadas por dichos
claves.

En el sistema Guix esto se consigue modificando la configuración del
servicio @code{guix}. Puesto que el servicio @code{guix} es parte de las
listas de servicios predeterminadas, @code{%base-services} y
@code{%desktop-services}, puede usar @code{modify-services} para cambiar su
configuración y añadir las URL y claves para sustituciones que desee
(@pxref{Referencia de servicios, @code{modify-services}}).

As an example, suppose you want to fetch substitutes from
@code{guix.example.org} and to authorize the signing key of that server, in
addition to the default @code{@value{SUBSTITUTE-SERVER-1}} and
@code{@value{SUBSTITUTE-SERVER-2}}.  The resulting operating system
configuration will look something like:

@lisp
(operating-system
  ;; @dots{}
  (services
    ;; Se asume que se parte de '%desktop-services'. Debe sustituirse
    ;; por la lista de servicios que use en realidad.
    (modify-services %desktop-services
      (guix-service-type config =>
                        (guix-configuration
                          (inherit config)
                          (substitute-urls
                            (append (list "https://guix.example.org")
                                    %default-substitute-urls))
                          (authorized-keys
                            (append (list (local-file "./clave.pub"))
                                    %default-authorized-guix-keys)))))))
@end lisp

Esto asume que el archivo @file{clave.pub} contiene la clave de firma de
@code{guix.example.org}. Cuando haya realizado este cambio en el archivo de
configuración de su sistema operativo (digamos @file{/etc/config.scm}),
puede reconfigurar y reiniciar el servicio @code{guix-daemon} o reiniciar la
máquina para que los cambios se hagan efectivos:

@example
$ sudo guix system reconfigure /etc/config.scm
$ sudo herd restart guix-daemon
@end example

Si por el contrario ejecuta Guix sobre una distribución distinta, deberá
llevar a cabo los siguientes pasos para obtener sustituciones de servidores
adicionales:

@enumerate
@item
Edite el archivo de configuración para el servicio de @code{guix-daemon};
cuando use systemd normalmente se trata de
@file{/etc/systemd/system/guix-daemon.service}. Añada la opción
@option{--substitute-urls} en la línea de ordenes de @command{guix-daemon} y
la lista de URL que desee (@pxref{daemon-substitute-urls, @code{guix-daemon
--substitute-urls}}):

@example
@dots{} --substitute-urls='https://guix.example.org @value{SUBSTITUTE-URLS}'
@end example

@item
Reinicie el daemon. Con systemd estos son los pasos:

@example
systemctl daemon-reload
systemctl restart guix-daemon.service
@end example

@item
Autorice la clave del nuevo servidor (@pxref{Invocación de guix archive}):

@example
guix archive --authorize < clave.pub
@end example

De nuevo se asume que @file{clave.pub} contiene la clave pública usada por
@code{guix.example.org} para firmar las sustituciones.
@end enumerate

Now you're all set! Substitutes will be preferably taken from
@code{https://guix.example.org}, using @code{@value{SUBSTITUTE-SERVER-1}}
then @code{@value{SUBSTITUTE-SERVER-2}} as fallback options.  Of course you
can list as many substitute servers as you like, with the caveat that
substitute lookup can be slowed down if too many servers need to be
contacted.

Tenga en cuenta que existen situaciones en las que se puede desear añadir la
URL de un servidor de sustitucines @emph{sin} autorizar su
clave. @xref{Verificación de sustituciones} para entender este caso específico.

@node Verificación de sustituciones
@subsection Verificación de sustituciones

@cindex firmas digitales
Guix detecta y emite errores cuando se intenta usar una sustitución que ha
sido adulterado. Del mismo modo, ignora las sustituciones que no están
firmadas, o que no están firmadas por una de las firmas enumeradas en la
ACL.

No obstante hay una excepción: si un servidor no autorizado proporciona
sustituciones que son @emph{idénticas bit-a-bit} a aquellas proporcionadas
por un servidor autorizado, entonces el servidor no autorizado puede ser
usado para descargas. Por ejemplo, asumiendo que hemos seleccionado dos
servidores de sustituciones con esta opción:

@example
--substitute-urls="https://a.example.org https://b.example.org"
@end example

@noindent
@cindex construcciones reproducibles
Si la ACL contiene únicamente la clave para @samp{b.example.org}, y si
@samp{a.example.org} resulta que proporciona @emph{exactamente las mismas}
sustituciones, Guix descargará sustituciones de @samp{a.example.org} porque
viene primero en la lista y puede ser considerado un espejo de
@samp{b.example.org}. En la práctica, máquinas de construcción
independientes producen habitualmente los mismos binarios, gracias a las
construcciones reproducibles bit-a-bit (véase a continuación).

Cuando se usa HTTPS, el certificado X.509 del servidor @emph{no} se valida
(en otras palabras, el servidor no está verificado), lo contrario del
comportamiento habitual de los navegadores Web. Esto es debido a que Guix
verifica la información misma de las sustituciones, como se ha explicado
anteriormente, lo cual nos concierne (mientras que los certificados X.509
tratan de verificar las conexiones entre nombres de dominio y claves
públicas).

@node Configuración de la pasarela.
@subsection Configuración de la pasarela.

@vindex http_proxy
@vindex https_proxy
Substitutes are downloaded over HTTP or HTTPS@.  The @env{http_proxy} and
@env{https_proxy} environment variables can be set in the environment of
@command{guix-daemon} and are honored for downloads of substitutes.  Note
that the value of those environment variables in the environment where
@command{guix build}, @command{guix package}, and other client commands are
run has @emph{absolutely no effect}.

@node Fallos en las sustituciones
@subsection Fallos en las sustituciones

Incluso cuando una sustitución de una derivación está disponible, a veces el
intento de sustitución puede fallar. Esto puede suceder por varias razones:
el servidor de sustituciones puede estar desconectado, la sustitución puede
haber sido borrada, la conexión puede interrumpirse, etc.

Cuando las sustituciones están activadas y una sustitución para una
derivación está disponible, pero el intento de sustitución falla, Guix
intentará construir la derivación localmente dependiendo si se proporcionó
la opción @option{--fallback} (@pxref{fallback-option,, opción común de
construcción @option{--fallback}}). Específicamente, si no se pasó
@option{--fallback}, no se realizarán construcciones locales, y la
derivación se considera se considera fallida. No obstante, si se pasó
@option{--fallback}, Guix intentará construir la derivación localmente, y el
éxito o fracaso de la derivación depende del éxito o fracaso de la
construcción local. Fíjese que cuando las sustituciones están desactivadas o
no hay sustituciones disponibles para la derivación en cuestión, la
construcción local se realizará @emph{siempre}, independientemente de si se
pasó la opción @option{--fallback}.

Para hacerse una idea de cuantas sustituciones hay disponibles en este
momento, puede intentar ejecutar la orden @command{guix weather}
(@pxref{Invocación de guix weather}). Esta orden proporciona estadísticas de las
sustituciones proporcionadas por un servidor.

@node Sobre la confianza en binarios
@subsection Sobre la confianza en binarios

@cindex confianza, de binarios pre-construidos
Today, each individual's control over their own computing is at the mercy of
institutions, corporations, and groups with enough power and determination
to subvert the computing infrastructure and exploit its weaknesses.  While
using substitutes can be convenient, we encourage users to also build on
their own, or even run their own build farm, such that the project run
substitute servers are less of an interesting target.  One way to help is by
publishing the software you build using @command{guix publish} so that
others have one more choice of server to download substitutes from
(@pxref{Invocación de guix publish}).

Guix tiene los cimientos para maximizar la reproducibilidad de las
construcciones (@pxref{Características}). En la mayor parte de los casos,
construcciones independientes de un paquete o derivación dada deben emitir
resultados idénticos bit a bit. Por tanto, a través de un conjunto diverso
de construcciones independientes de paquetes, podemos reforzar la integridad
de nuestros sistemas. La orden @command{guix challenge} intenta ayudar a las
usuarias en comprobar servidores de sustituciones, y asiste a las
desarrolladoras encontrando construcciones no deterministas de paquetes
(@pxref{Invocación de guix challenge}). Similarmente, la opción @option{--check}
de @command{guix build} permite a las usuarias si las sustituciones
previamente instaladas son genuinas mediante su reconstrucción local
(@pxref{build-check, @command{guix build --check}}).

En el futuro, queremos que Guix permita la publicación y obtención de
binarios hacia/desde otras usuarias, entre pares (P2P). En caso de
interesarle hablar sobre este proyecto, unase a nosotras en
@email{guix-devel@@gnu.org}.

@node Paquetes con múltiples salidas
@section Paquetes con múltiples salidas

@cindex paquetes de salida múltiple
@cindex salidas del paquete
@cindex salidas

Habitualmente, los paquetes definidos en Guix tienen una @dfn{salida}
única---es decir, el paquete de fuentes proporcionará exactamente un
directorio en el almacén. Cuando se ejecuta @command{guix install glibc}, se
instala la salida predeterminada del paquete GNU libc; la salida
predeterminada se llama @code{out}, pero su nombre puede omitirse como se
mostró en esta orden. En este caso particular, la salida predeterminada de
@code{glibc} contiene todos archivos de cabecera C, bibliotecas dinámicas,
bibliotecas estáticas, documentación Info y otros archivos auxiliares.

A veces es más apropiado separar varios tipos de archivos producidos por un
paquete único de fuentes en salidas separadas. Por ejemplo, la biblioteca C
GLib (usada por GTK+ y paquetes relacionados) instala más de 20 MiB de
documentación de referencia como páginas HTML. Para ahorrar espacio para
usuarias que no la necesiten, la documentación va a una salida separada,
llamada @code{doc}. Para instalar la salida principal de GLib, que contiene
todo menos la documentación, se debe ejecutar:

@example
guix install glib
@end example

@cindex documentación
La orden que instala su documentación es:

@example
guix install glib:doc
@end example

Algunos paquetes instalan programas con diferentes ``huellas de
dependencias''. Por ejemplo, el paquete WordNet instala tanto herramientas
de línea de órdenes como interfaces gráficas de usuaria (IGU). Las primeras
dependen únicamente de la biblioteca de C, mientras que las últimas dependen
en Tcl/Tk y las bibliotecas de X subyacentes. En este caso, dejamos las
herramientas de línea de órdenes en la salida predeterminada, mientras que
las IGU están en una salida separada. Esto permite a las usuarias que no
necesitan una IGU ahorrar espacio. La orden @command{guix size} puede ayudar
a exponer estas situaciones (@pxref{Invocación de guix size}). @command{guix
graph} también puede ser útil (@pxref{Invocación de guix graph}).

Hay varios de estos paquetes con salida múltiple en la distribución
GNU. Otros nombres de salida convencionales incluyen @code{lib} para
bibliotecas y posiblemente archivos de cabecera, @code{bin} para programas
independientes y @code{debug} para información de depuración
(@pxref{Instalación de archivos de depuración}). La salida de los paquetes se enumera
en la tercera columna del resultado de @command{guix package
--list-available} (@pxref{Invocación de guix package}).


@node Invocación de guix gc
@section Invocación de @command{guix gc}

@cindex recolector de basura
@cindex espacio en disco
@cindex @command{guix gc}
Los paquetes instalados, pero no usados, pueden ser @dfn{recolectados}. La
orden @command{guix gc} permite a las usuarias ejecutar explícitamente el
recolector de basura para reclamar espacio del directorio
@file{/gnu/store}---¡borrar archivos o directorios manualmente puede dañar
el almacén sin reparación posible!

@cindex GC, raíces del recolector de basura
@cindex raíces del recolector de basura
El recolector de basura tiene un conjunto de @dfn{raíces} conocidas:
cualquier archivo en @file{/gnu/store} alcanzable desde una raíz se
considera @dfn{vivo} y no puede ser borrado; cualquier otro archivo se
considera @dfn{muerto} y puede ser borrado. El conjunto de raíces del
recolector de basura (``raíces del GC'' para abreviar) incluye los perfiles
predeterminados de las usuarias; por defecto los enlaces bajo
@file{/var/guix/gcroots} representan dichas raíces. Por ejemplo, nuevas
raíces del GC pueden añadirse con @command{guix build --root}
(@pxref{Invocación de guix build}). La orden @command{guix gc --list-roots} las
enumera.

Antes de ejecutar @code{guix gc --collect-garbage} para liberar espacio,
habitualmente es útil borrar generaciones antiguas de los perfiles de
usuaria; de ese modo, las construcciones antiguas de paquetes a las que
dichas generaciones hacen referencia puedan ser reclamadas. Esto se consigue
ejecutando @code{guix package --delete-generations} (@pxref{Invocación de guix package}).

Nuestra recomendación es ejecutar una recolección de basura periódicamente,
o cuando tenga poco espacio en el disco. Por ejemplo, para garantizar que al
menos 5@tie{}GB están disponibles en su disco, simplemente ejecute:

@example
guix gc -F 5G
@end example

Es completamente seguro ejecutarla como un trabajo periódico no-interactivo
(@pxref{Ejecución de tareas programadas}, para la configuración de un trabajo de ese
tipo). La ejecución de @command{guix gc} sin ningún parámetro recolectará
tanta basura como se pueda, pero eso es no es normalmente conveniente: puede
encontrarse teniendo que reconstruir o volviendo a bajar software que está
``muerto'' desde el punto de vista del recolector pero que es necesario para
construir otras piezas de software---por ejemplo, la cadena de herramientas
de compilación.

La orden @command{guix gc} tiene tres modos de operación: puede ser usada
para recolectar archivos muertos (predeterminado), para borrar archivos
específicos (la opción @option{--delete}), para mostrar información sobre la
recolección de basura o para consultas más avanzadas. Las opciones de
recolección de basura son las siguientes:

@table @code
@item --collect-garbage[=@var{min}]
@itemx -C [@var{min}]
Recolecta basura---es decir, archivos no alcanzables de @file{/gnu/store} y
subdirectorios. Esta operación es la predeterminada cuando no se especifican
opciones.

Cuando se proporciona @var{min}, para una vez que @var{min} bytes han sido
recolectados. @var{min} puede ser un número de bytes, o puede incluir una
unidad como sufijo, como @code{MiB} para mebibytes y @code{GB} para
gigabytes (@pxref{Block size, size specifications,, coreutils, GNU
Coreutils}).

Cuando se omite @var{min}, recolecta toda la basura.

@item --free-space=@var{libre}
@itemx -F @var{libre}
Recolecta basura hasta que haya espacio @var{libre} bajo @file{/gnu/store},
si es posible: @var{libre} denota espacio de almacenamiento, por ejemplo
@code{500MiB}, como se ha descrito previamente.

Cuando @var{libre} o más está ya disponible en @file{/gnu/store}, no hace
nada y sale inmediatamente.

@item --delete-generations[=@var{duración}]
@itemx -d [@var{duración}]
Before starting the garbage collection process, delete all the generations
older than @var{duration}, for all the user profiles and home environment
generations; when run as root, this applies to all the profiles @emph{of all
the users}.

Por ejemplo, esta orden borra todas las generaciones de todos sus perfiles
que tengan más de 2 meses de antigüedad (excepto generaciones que sean las
actuales), y una vez hecho procede a liberar espacio hasta que al menos 10
GiB estén disponibles:

@example
guix gc -d 2m -F 10G
@end example

@item --delete
@itemx -D
Intenta borrar todos los archivos del almacén y directorios especificados
como parámetros. Esto falla si alguno de los archivos no están en el
almacén, o todavía están vivos.

@item --list-failures
Enumera los elementos del almacén correspondientes a construcciones fallidas
existentes en la caché.

Esto no muestra nada a menos que el daemon se haya ejecutado pasando
@option{--cache-failures} (@pxref{Invocación de guix-daemon,
@option{--cache-failures}}).

@item --list-roots
Enumera las raíces del recolector de basura poseídas por la usuaria; cuando
se ejecuta como root, enumera @emph{todas} las raíces del recolector de
basura.

@item --list-busy
Enumera los elementos del almacén que actualmente están siendo usados por
procesos en ejecución. Estos elementos del almacén se consideran de manera
efectiva raíces del recolector de basura: no pueden borrarse.

@item --clear-failures
Borra los elementos especificados del almacén de la caché de construcciones
fallidas.

De nuevo, esta opción únicamente tiene sentido cuando el daemon se inicia
con @option{--cache-failures}. De otro modo, no hace nada.

@item --list-dead
Muestra la lista de archivos y directorios muertos todavía presentes en el
almacén---es decir, archivos y directorios que ya no se pueden alcanzar
desde ninguna raíz.

@item --list-live
Muestra la lista de archivos y directorios del almacén vivos.

@end table

Además, las referencias entre los archivos del almacén pueden ser
consultadas:

@table @code

@item --references
@itemx --referrers
@cindex dependencias de un paquete
Enumera las referencias (o, respectivamente, los referentes) de los archivos
del almacén pasados como parámetros.

@item --requisites
@itemx -R
@cindex closure
Enumera los requisitos los archivos del almacén pasados como parámetros. Los
requisitos incluyen los mismos archivos del almacén, sus referencias, las
referencias de estas, recursivamente. En otras palabras, la lista devuelta
es la @dfn{clausura transitiva} de los archivos del almacén.

@xref{Invocación de guix size}, para una herramienta que perfila el tamaño de la
clausura de un elemento. @xref{Invocación de guix graph}, para una herramienta de
visualización del grafo de referencias.

@item --derivers
@cindex derivation
Devuelve la/s derivación/es que conducen a los elementos del almacén dados
(@pxref{Derivaciones}).

Por ejemplo, esta orden:

@example
guix gc --derivers $(guix package -I ^emacs$ | cut -f4)
@end example

@noindent
devuelve el/los archivo/s @file{.drv} que conducen al paquete @code{emacs}
instalado en su perfil.

Fíjese que puede haber cero archivos @file{.drv} encontrados, por ejemplo
porque estos archivos han sido recolectados. Puede haber más de un archivo
@file{.drv} encontrado debido a derivaciones de salida fija.
@end table

Por último, las siguientes opciones le permiten comprobar la integridad del
almacén y controlar el uso del disco.

@table @option

@item --verify[=@var{opciones}]
@cindex integridad, del almacén
@cindex comprobación de integridad
Verifica la integridad del almacén.

Por defecto, comprueba que todos los elementos del almacén marcados como
válidos en la base de datos del daemon realmente existen en
@file{/gnu/store}.

Cuando se proporcionan, @var{opciones} debe ser una lista separada por comas
que contenga uno o más valores @code{contents} and @code{repair}.

Cuando se usa @option{--verify=contents}, el daemon calcula el hash del
contenido de cada elemento del almacén y lo compara contra el hash de su
base de datos. Las incongruencias se muestran como corrupciones de
datos. Debido a que recorre @emph{todos los archivos del almacén}, esta
orden puede tomar mucho tiempo, especialmente en sistemas con una unidad de
disco lenta.

@cindex reparar el almacén
@cindex corrupción, recuperarse de
El uso de @option{--verify=repair} o @option{--verify=contents,repair} hace
que el daemon intente reparar elementos corruptos del almacén obteniendo
sustituciones para dichos elementos (@pxref{Sustituciones}). Debido a que la
reparación no es atómica, y por tanto potencialmente peligrosa, está
disponible únicamente a la administradora del sistema. Una alternativa
ligera, cuando sabe exactamente qué elementos del almacén están corruptos,
es @command{guix build --repair} (@pxref{Invocación de guix build}).

@item --optimize
@cindex deduplicación
Optimiza el almacén sustituyendo archivos idénticos por enlaces duros---esto
es la @dfn{deduplicación}.

El daemon realiza la deduplicación después de cada construcción
satisfactoria o importación de archivos, a menos que se haya lanzado con la
opción @option{--disable-deduplication} (@pxref{Invocación de guix-daemon,
@option{--disable-deduplication}}). Por tanto, esta opción es útil
principalmente cuando el daemon se estaba ejecutando con
@option{--disable-deduplication}.

@item --vacuum-database
@cindex vacuum the store database
@comment Avoid words like 'repair,' 'compress,' and 'optimize.'
Guix uses an sqlite database to keep track of the items in (@pxref{El almacén}).  Over time it is possible that the database may grow to a large
size and become fragmented.  As a result, one may wish to clear the freed
space and join the partially used pages in the database left behind from
removed packages or after running the garbage collector.  Running
@command{sudo guix gc --vacuum-database} will lock the database and
@code{VACUUM} the store, defragmenting the database and purging freed pages,
unlocking the database when it finishes.

@end table

@node Invocación de guix pull
@section Invocación de @command{guix pull}

@cindex actualizar Guix
@cindex actualizar la versión de Guix
@cindex @command{guix pull}
@cindex pull
@cindex seguridad, @command{guix pull}
@cindex veracidad, del código obtenido con @command{guix pull}
Packages are installed or upgraded to the latest version available in the
distribution currently available on your local machine.  To update that
distribution, along with the Guix tools, you must run @command{guix pull}:
the command downloads the latest Guix source code and package descriptions,
and deploys it.  Source code is downloaded from a
@uref{https://git-scm.com/book/en/, Git} repository, by default the official
GNU@tie{}Guix repository, though this can be customized.  @command{guix
pull} ensures that the code it downloads is @emph{authentic} by verifying
that commits are signed by Guix developers.

Específicamente, @command{guix pull} descarga código de los @dfn{canales}
(@pxref{Canales}) especificados en una de las posibilidades siguientes, en
este orden:

@enumerate
@item
la opción @option{--channels};
@item
el archivo @file{~/.config/guix/channels.scm} de la usuaria;
@item
el archivo @file{/etc/guix/channels.scm} común al sistema;
@item
los canales predeterminados en código especificados en la variable
@code{%default-channels}.
@end enumerate

Una vez completada, @command{guix package} usará paquetes y versiones de
paquetes de esta copia recién obtenida de Guix. No solo eso, sino que todas
las órdenes de Guix y los módulos Scheme también se tomarán de la última
versión. Nuevas sub-órdenes @command{guix} incorporadas por la actualización
también estarán disponibles.

Cualquier usuaria puede actualizar su copia de Guix usando @command{guix
pull}, y el efecto está limitado a la usuaria que ejecute @command{guix
pull}. Por ejemplo, cuando la usuaria @code{root} ejecuta @command{guix
pull}, dicha acción no produce ningún efecto en la versión del Guix que la
usuaria @code{alicia} ve, y viceversa.

El resultado de ejecutar @command{guix pull} es un @dfn{perfil} disponible
bajo @file{~/.config/guix/current} conteniendo el último Guix. Por tanto,
asegúrese de añadirlo al inicio de sus rutas de búsqueda de modo que use la
última versión, de modo similar para el manual Info(@pxref{Documentación}).

@example
export PATH="$HOME/.config/guix/current/bin:$PATH"
export INFOPATH="$HOME/.config/guix/current/share/info:$INFOPATH"
@end example

Las opciones @option{--list-generations} o @option{-l} enumeran las
generaciones pasadas producidas por @command{guix pull}, junto a detalles de
su procedencia:

@example
$ guix pull -l
Generación 1	10 jun 2018 00:18:18
  guix 65956ad
    URL del repositorio: https://git.savannah.gnu.org/git/guix.git
    rama: origin/master
    revisión: 65956ad3526ba09e1f7a40722c96c6ef7c0936fe

Generation 2	Jun 11 2018 11:02:49
  guix e0cc7f6
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: origin/master
    commit: e0cc7f669bec22c37481dd03a7941c7d11a64f1d

Generation 3	Jun 13 2018 23:31:07	(current)
  guix 844cc1c
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: origin/master
    commit: 844cc1c8f394f03b404c5bb3aee086922373490c
@end example

@ref{Invocación de guix describe, @command{guix describe}}, para otras formas de
describir el estado actual de Guix.

This @code{~/.config/guix/current} profile works exactly like the profiles
created by @command{guix package} (@pxref{Invocación de guix package}).  That is,
you can list generations, roll back to the previous generation---i.e., the
previous Guix---and so on:

@example
$ guix pull --roll-back
se pasó de la generación 3 a la 2
$ guix pull --delete-generations=1
borrando /var/guix/profiles/per-user/carlos/current-guix-1-link
@end example

También puede usar @command{guix package} (@pxref{Invocación de guix package})
para gestionar el perfil proporcionando su nombre de manera específica:
@example
$ guix package -p ~/.config/guix/current --roll-back
se pasó de la generación 3 a la 2
$ guix package -p ~/.config/guix/current --delete-generations=1
borrando /var/guix/profiles/per-user/carlos/current-guix-1-link
@end example

La orden @command{guix pull} se invoca habitualmente sin parámetros, pero
permite las siguientes opciones:

@table @code
@item --url=@var{url}
@itemx --commit=@var{revisión}
@itemx --branch=@var{rama}
Download code for the @code{guix} channel from the specified @var{url}, at
the given @var{commit} (a valid Git commit ID represented as a hexadecimal
string or the name of a tag), or @var{branch}.

@cindex @file{channels.scm}, archivo de configuración
@cindex archivo de configuración de canales
Estas opciones se proporcionan por conveniencia, pero también puede
especificar su configuración en el archivo
@file{~/.config/guix/channels.scm} o usando la opción @option{--channels}
(vea más adelante).

@item --channels=@var{archivo}
@itemx -C @var{archivo}
Lee la lista de canales de @var{archivo} en vez de
@file{~/.config/guix/channels.scm} o
@file{/etc/guix/channels.scm}. @var{archivo} debe contener código Scheme que
evalúe a una lista de objetos ``channel''. @xref{Canales}, para más
información.

@cindex noticias de los canales
@item --news
@itemx -N
Display news written by channel authors for their users for changes made
since the previous generation (@pxref{Canales, Writing Channel News}).
When @option{--details} is passed, additionally display new and upgraded
packages.

You can view that information for previous generations with @command{guix
pull -l}.

@item --list-generations[=@var{patrón}]
@itemx -l [@var{patrón}]
Enumera todas las generaciones de @file{~/.config/guix/current} o, si se
proporciona un @var{patrón}, el subconjunto de generaciones que correspondan
con el @var{patrón}. La sintaxis de @var{patrón} es la misma que @code{guix
package --list-generations} (@pxref{Invocación de guix package}).

By default, this prints information about the channels used in each revision
as well as the corresponding news entries.  If you pass @option{--details},
it will also print the list of packages added and upgraded in each
generation compared to the previous one.

@item --details
Instruct @option{--list-generations} or @option{--news} to display more
information about the differences between subsequent generations---see
above.

@item --roll-back
@cindex revertir (``roll back'')
@cindex deshacer transacciones
@cindex transacciones, deshacer
Vuelve a la @dfn{generación} previa de @file{~/.config/guix/current}---es
decir, deshace la última transacción.

@item --switch-generation=@var{patrón}
@itemx -S @var{patrón}
@cindex generaciones
Cambia a una generación particular definida por el @var{patrón}.

@var{patrón} puede ser tanto un número de generación como un número
prefijado con ``+'' o ``-''. Esto último significa: mueve atrás/hacia
delante el número especificado de generaciones. Por ejemplo, si quiere
volver a la última generación antes de @option{--roll-back}, use
@option{--switch-generation=+1}.

@item --delete-generations[=@var{patrón}]
@itemx -d [@var{patrón}]
Cuando se omite @var{patrón}, borra todas las generaciones excepto la
actual.

Esta orden acepta los mismos patrones que
@option{--list-generations}. Cuando se especifica un @var{patrón}, borra las
generaciones coincidentes. Cuando el @var{patrón} especifica una duración,
las generaciones @emph{más antiguas} que la duración especificada son las
borradas. Por ejemplo, @option{--delete-generations=1m} borra las
generaciones de más de un mes de antigüedad.

Si la generación actual entra en el patrón, @emph{no} será borrada.

Preste atención a que el borrado de generaciones previas impide la reversión
a su estado. Consecuentemente esta orden debe ser usada con cuidado.

@ref{Invocación de guix describe}, para una forma de mostrar información sobre
únicamente la generación actual.

@item --profile=@var{perfil}
@itemx -p @var{perfil}
Usa @var{perfil} en vez de @file{~/.config/guix/current}.

@item --dry-run
@itemx -n
Muestra qué revisión/es del canal serían usadas y qué se construiría o
sustituiría, sin efectuar ninguna acción real.

@item --allow-downgrades
Permite obtener revisiones de los canales más antiguas o no relacionadas con
aquellas que se encuentran en uso actualmente.

@cindex ataques de versión anterior, protección contra
De manera predeterminada @command{guix pull} proteje contra los llamados
``ataques de versión anterior'' en los que el repositorio Git de un canal se
reinicia a una revisión anterior o no relacionada de sí mismo, provocando
potencialmente la instalación de versiones más antiguas y con
vulnerabilidades conocidas de paquetes de software.

@quotation Nota
Asegúrese de entender las implicaciones de seguridad antes de usar la opción
@option{--allow-downgrades}.
@end quotation

@item --disable-authentication
Permite obtener código de un canal sin verificarlo.

@cindex verificación, del código de un canal
De manera predeterminada, @command{guix pull} valida el código que descarga
de los canales verificando que sus revisiones están firmadas por
desarrolladoras autorizadas, y emite un error si no es el caso. Esta opción
le indica que no debe realizar ninguna de esas verificaciones.

@quotation Nota
Asegúrese de entender las implicaciones de seguridad antes de usar la opción
@option{--disable-authentication}.
@end quotation

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta construir paquetes para @var{sistema}---por ejemplo,
@code{x86_64-linux}---en vez del tipo de sistema de la máquina de
construcción.

@item --bootstrap
Use el Guile usado para el lanzamiento para construir el último Guix. Esta
opción es útil para las desarrolladoras de Guix únicamente.
@end table

El mecanismo de @dfn{canales} le permite instruir a @command{guix pull} de
qué repositorio y rama obtener los datos, así como repositorios
@emph{adicionales} que contengan módulos de paquetes que deben ser
desplegados. @xref{Canales}, para más información.

Además, @command{guix pull} acepta todas las opciones de construcción
comunes (@pxref{Opciones comunes de construcción}).

@node Invocación de guix time-machine
@section Invocación de @command{guix time-machine}

@cindex @command{guix time-machine}
@cindex clavar, canales
@cindex replicar Guix
@cindex reproducibilidad, de Guix

La orden @command{guix time-machine} proporciona acceso a otras revisiones
de Guix, por ejemplo para instalar versiones antiguas de un paquete, o para
reproducir una computación en un entorno idéntico. La revisión de Guix que
se usará se define por el identificador de una revisión o por un archivo de
descripción de canales creado con @command{guix describe} (@pxref{Invocación de guix describe}).

Let's assume that you want to travel to those days of November 2020 when
version 1.2.0 of Guix was released and, once you're there, run the
@command{guile} of that time:

@example
guix time-machine --commit=v1.2.0 -- \
  environment -C --ad-hoc guile -- guile
@end example

The command above fetches Guix@tie{}1.2.0 and runs its @command{guix
environment} command to spawn an environment in a container running
@command{guile} (@command{guix environment} has since been subsumed by
@command{guix shell}; @pxref{Invoking guix shell}).  It's like driving a
DeLorean@footnote{If you don't know what a DeLorean is, consider traveling
back to the 1980's.}! The first @command{guix time-machine} invocation can
be expensive: it may have to download or even build a large number of
packages; the result is cached though and subsequent commands targeting the
same commit are almost instantaneous.

@quotation Nota
The history of Guix is immutable and @command{guix time-machine} provides
the exact same software as they are in a specific Guix revision.  Naturally,
no security fixes are provided for old versions of Guix or its channels.  A
careless use of @command{guix time-machine} opens the door to security
vulnerabilities.  @xref{Invocación de guix pull, @option{--allow-downgrades}}.
@end quotation

La sintaxis general es:

@example
guix time-machine @var{opciones}@dots{} -- @var{orden} @var{param}@dots{}
@end example

donde @var{orden} and @var{param}@dots{} se proporcionan sin modificar a la
orden @command{guix} de la revisión especificada. Las @var{opciones} que
definen esta revisión son las mismas que se usan con @command{guix pull}
(@pxref{Invocación de guix pull}):

@table @code
@item --url=@var{url}
@itemx --commit=@var{revisión}
@itemx --branch=@var{rama}
Use the @code{guix} channel from the specified @var{url}, at the given
@var{commit} (a valid Git commit ID represented as a hexadecimal string or
the name of a tag), or @var{branch}.

@item --channels=@var{archivo}
@itemx -C @var{archivo}
Lee la lista de canales de @var{archivo}. @var{archivo} debe contener código
Scheme que evalúe a una lista de objetos ``channel''. @xref{Canales}, para
más información.
@end table

As for @command{guix pull}, the absence of any options means that the latest
commit on the master branch will be used.  The command

@example
guix time-machine -- build hello
@end example

construirá el paquete @code{hello} como esté definido en la rama master, que
en general es la última revisión de Guix que haya instalado. ¡Los viajes
temporales funcionan en ambas direcciones!

Tenga en cuenta que @command{guix time-machine} puede desencadenar
construcciones de canales y sus dependencias, y que pueden controlarse
mediante las opciones de construcción estándar (@pxref{Opciones comunes de construcción}).

@node Inferiores
@section Inferiores

@c TODO: Remove this once we're more confident about API stability.
@quotation Nota
La funcionalidad descrita aquí es una ``versión de evaluación tecnológica''
en la versión @value{VERSION}. Como tal, la interfaz está sujeta a cambios.
@end quotation

@cindex inferiores
@cindex composición de revisiones de Guix
A veces necesita mezclar paquetes de revisiones de la revisión de Guix que
está ejecutando actualmente con paquetes disponibles en una revisión
diferente. Los @dfn{inferiores} de Guix le permiten conseguirlo componiendo
diferentes revisiones de Guix de modo arbitrario.

@cindex paquetes inferiores
Técnicamente, un ``inferior'' es esencialmente un proceso Guix separado
conectado con su Guix principal a través de una sesión interactiva
(@pxref{Invocación de guix repl}). El módulo @code{(guix inferior)} le permite
crear inferiores y comunicarse con ellos. También proporciona una interfaz
de alto nivel para buscar y manipular los paquetes que un inferior
proporciona---@dfn{paquetes de inferiores}.

When combined with channels (@pxref{Canales}), inferiors provide a simple
way to interact with a separate revision of Guix.  For example, let's assume
you want to install in your profile the current @code{guile} package, along
with the @code{guile-json} as it existed in an older revision of
Guix---perhaps because the newer @code{guile-json} has an incompatible API
and you want to run your code against the old API@.  To do that, you could
write a manifest for use by @code{guix package --manifest} (@pxref{Writing Manifests}); in that manifest, you would create an inferior for that old
Guix revision you care about, and you would look up the @code{guile-json}
package in the inferior:

@lisp
(use-modules (guix inferior) (guix channels)
             (srfi srfi-1))   ;para 'first'

(define channels
  ;; Esta es la revisión antigua de donde queremos
  ;; extraer guile-json.
  (list (channel
         (name 'guix)
         (url "https://git.savannah.gnu.org/git/guix.git")
         (commit
          "65956ad3526ba09e1f7a40722c96c6ef7c0936fe"))))

(define inferior
  ;; Un inferior que representa la revisión previa.
  (inferior-for-channels channels))

;; Ahora crea un manifiesto con el paquete "guile" actual
;; y el antiguo paquete "guile-json".
(packages->manifest
 (list (first (lookup-inferior-packages inferior "guile-json"))
       (specification->package "guile")))
@end lisp

En su primera ejecución, @command{guix package --manifest} puede tener que
construir el canal que especificó antes de crear el inferior; las siguientes
ejecuciones serán mucho más rápidas porque la revisión de Guix estará en la
caché.

El módulo @code{(guix inferior)} proporciona los siguientes procedimientos
para abrir un inferior:

@deffn {Procedimiento Scheme} inferior-for-channels @var{canales} @
   [#:cache-directory] [#:ttl]
Devuelve un inferior para @var{canales}, una lista de canales. Usa la caché
en @var{cache-directory}, donde las entradas pueden ser reclamadas después
de @var{ttl} segundos. Este procedimiento abre una nueva conexión al daemon
de construcción.

Como efecto secundario, este procedimiento puede construir o sustituir
binarios para @var{canales}, lo cual puede tomar cierto tiempo.
@end deffn

@deffn {Procedimiento Scheme} open-inferior @var{directorio} @
  [#:command "bin/guix"]
Abre el Guix inferior en @var{directorio}, ejecutando
@code{@var{directorio}/@var{command} repl} o su equivalente. Devuelve
@code{#f} si el inferior no pudo ser ejecutado.
@end deffn

@cindex paquetes inferiores
Los procedimientos enumerados a continuación le permiten obtener y manipular
paquetes de inferiores.

@deffn {Procedimiento Scheme} inferior-packages @var{inferior}
Devuelve la lista de paquetes conocida por @var{inferior}.
@end deffn

@deffn {Procedimiento Scheme} lookup-inferior-packages @var{inferior} @var{nombre} @
   [@var{versión}]
Devuelve la lista ordenada de paquetes del inferior que corresponden con
@var{nombre} en @var{inferior}, con los números de versión más altos
primero. Si @var{versión} tiene un valor verdadero, devuelve únicamente
paquetes con un número de versión cuyo prefijo es @var{versión}.
@end deffn

@deffn {Procedimiento Scheme} inferior-package? @var{obj}
Devuelve verdadero si @var{obj} es un paquete inferior.
@end deffn

@deffn {Procedimiento Scheme} inferior-package-name @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-version @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-synopsis @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-description @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-home-page @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-location @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-inputs @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-native-inputs @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-propagated-inputs @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-transitive-propagated-inputs @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-native-search-paths @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-transitive-native-search-paths @var{paquete}
@deffnx {Procedimiento Scheme} inferior-package-search-paths @var{paquete}
Estos procedimientos son la contraparte de los accesos a los registros de
paquete (@pxref{Referencia de package}). La mayor parte funcionan interrogando
al inferior del que @var{paquete} viene, por lo que el inferior debe estar
vivo cuando llama a dichos procedimientos.
@end deffn

Inferior packages can be used transparently like any other package or
file-like object in G-expressions (@pxref{Expresiones-G}).  They are also
transparently handled by the @code{packages->manifest} procedure, which is
commonly used in manifests (@pxref{Invocación de guix package, the
@option{--manifest} option of @command{guix package}}).  Thus you can insert
an inferior package pretty much anywhere you would insert a regular package:
in manifests, in the @code{packages} field of your @code{operating-system}
declaration, and so on.

@node Invocación de guix describe
@section Invocación de @command{guix describe}

@cindex reproducibilidad
@cindex replicar Guix
@cindex @command{guix describe}
A menudo desea responder a preguntas como: ``¿Qué revisión de Guix estoy
usando?'' o ``¿Qué canales estoy usando?'' Esto es una información muy útil
en muchas situaciones: si quiere @emph{replicar} un entorno en una máquina
diferente o cuenta de usuaria, si desea informar de un error o determinar
qué cambio en los canales que usa lo causó, o si quiere almacenar el estado
de su sistema por razones de reproducibilidad. La orden @command{guix
describe} responde a estas preguntas.

Cuando se ejecuta desde un @command{guix} bajado con @command{guix pull},
@command{guix describe} muestra el/los canal/es desde el/los que se
construyó, incluyendo la URL de su repositorio y los IDs de las revisiones
(@pxref{Canales}):

@example
$ guix describe
Generation 10	Sep 03 2018 17:32:44	(current)
  guix e0fa68c
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: master
    commit: e0fa68c7718fffd33d81af415279d6ddb518f727
@end example

Si está familiarizado con el sistema de control de versiones Git, esto es
similar a @command{git describe}; la salida también es similar a la de
@command{guix pull --list-generations}, pero limitada a la generación actual
(@pxref{Invocación de guix pull, the @option{--list-generations} option}). Debido
a que el ID de revisión Git mostrado antes refiere sin ambigüedades al
estado de Guix, esta información es todo lo necesario para describir la
revisión de Guix que usa, y también para replicarla.

Para facilitar la replicación de Guix, también se le puede solicitar a
@command{guix describe} devolver una lista de canales en vez de la
descripción legible por humanos mostrada antes:

@example
$ guix describe -f channels
(list (channel
        (name 'guix)
        (url "https://git.savannah.gnu.org/git/guix.git")
        (commit
          "e0fa68c7718fffd33d81af415279d6ddb518f727")
        (introduction
          (make-channel-introduction
            "9edb3f66fd807b096b48283debdcddccfea34bad"
            (openpgp-fingerprint
              "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA")))))
@end example

@noindent
Puede almacenar esto en un archivo y se lo puede proporcionar a
@command{guix pull -C} en otra máquina o en un momento futuro, lo que
instanciará @emph{esta revisión exacta de Guix} (@pxref{Invocación de guix pull,
the @option{-C} option}). De aquí en adelante, ya que puede desplegar la
misma revisión de Guix, puede también @emph{replicar un entorno completo de
software}. Nosotras humildemente consideramos que esto es
@emph{impresionante}, ¡y esperamos que le guste a usted también!

Los detalles de las opciones aceptadas por @command{guix describe} son las
siguientes:

@table @code
@item --format=@var{formato}
@itemx -f @var{formato}
Produce salida en el @var{formato} especificado, uno de:

@table @code
@item human
produce salida legible por humanos;
@item channels
produce una lista de especificaciones de canales que puede ser pasada a
@command{guix pull -C} o instalada como @file{~/.config/guix/channels.scm}
(@pxref{Invocación de guix pull});
@item channels-sans-intro
como @code{channels}, pero se omite el campo @code{introduction}; se puede
usar para producir una especificación de canal adecuada para la versión
1.1.0 de Guix y versiones anteriores---el campo @code{introduction} está
relacionado con la verificación de canales (@pxref{Canales, Verificación de
canales}) y no está implementado en dichas versiones;
@item json
@cindex JSON
produce una lista de especificaciones de canales en formato JSON;
@item recutils
produce una lista de especificaciones de canales en formato Recutils.
@end table

@item --list-formats
Muestra los formatos disponibles para la opción @option{--format}.

@item --profile=@var{perfil}
@itemx -p @var{perfil}
Muestra información acerca del @var{perfil}.
@end table

@node Invocación de guix archive
@section Invocación de @command{guix archive}

@cindex @command{guix archive}
@cindex archivo
@cindex exporting files from the store
@cindex importing files to the store
La orden @command{guix archive} permite a las usuarias @dfn{exportar}
archivos del almacén en un único archivador, e @dfn{importarlos}
posteriormente en una máquina que ejecute Guix. En particular, permite que
los archivos del almacén sean transferidos de una máquina al almacén de otra
máquina.

@quotation Nota
Si está buscando una forma de producir archivos en un formato adecuado para
herramientas distintas a Guix, @pxref{Invocación de guix pack}.
@end quotation

@cindex exportar elementos del almacén
Para exportar archivos del almacén como un archivo por la salida estándar,
ejecute:

@example
guix archive --export @var{opciones} @var{especificaciones}...
@end example

@var{especificaciones} deben ser o bien nombres de archivos del almacén o
especificaciones de paquetes, como las de @command{guix package}
(@pxref{Invocación de guix package}). Por ejemplo, la siguiente orden crea un
archivo que contiene la salida @code{gui} del paquete @code{git} y la salida
principal de @code{emacs}:

@example
guix archive --export git:gui /gnu/store/...-emacs-24.3 > great.nar
@end example

Si los paquetes especificados no están todavía construidos, @command{guix
archive} los construye automáticamente. El proceso de construcción puede
controlarse mediante las opciones de construcción comunes (@pxref{Opciones comunes de construcción}).

Para transferir el paquete @code{emacs} a una máquina conectada por SSH, se
ejecutaría:

@example
guix archive --export -r emacs | ssh otra-maquina guix archive --import
@end example

@noindent
De manera similar, un perfil de usuaria completo puede transferirse de una
máquina a otra de esta manera:

@example
guix archive --export -r $(readlink -f ~/.guix-profile) | \
  ssh otra-maquina guix archive --import
@end example

@noindent
No obstante, fíjese que, en ambos ejemplos, todo @code{emacs} y el perfil
como también todas sus dependencias son transferidas (debido a la
@option{-r}), independiente de lo que estuviese ya disponible en el almacén
de la máquina objetivo. La opción @option{--missing} puede ayudar a
esclarecer qué elementos faltan en el almacén objetivo. La orden
@command{guix copy} simplifica y optimiza este proceso completo, así que
probablemente es lo que debería usar en este caso (@pxref{Invocación de guix copy}).

@cindex nar, formato de archivo
@cindex archivo normalizado (nar)
@cindex empaquetado nar, formato de archivo
Cada elemento del almacén se escribe en formato de @dfn{archivo normalizado}
o @dfn{nar} (descrito a continuación), y la salida de @command{guix archive
--export} (y entrada de @command{guix archive --import}) es un
@dfn{empaquetado nar}.

El formato ``nar'' es comparable a `tar' en el espíritu, pero con
diferencias que lo hacen más apropiado para nuestro propósito. Primero, en
vez de almacenar todos los metadatos Unix de cada archivo, el formato nar
solo menciona el tipo de archivo (normal, directorio o enlace simbólico);
los permisos Unix y el par propietario/grupo se descartan. En segundo lugar,
el orden en el cual las entradas de directorios se almacenan siempre siguen
el orden de los nombres de archivos de acuerdo a la ordenación de cadenas en
la localización C. Esto hace la producción del archivo completamente
determinista.

El formato del empaquetado nar es esencialmente una concatenación de cero o
más nar junto a metadatos para cada elemento del almacén que contiene: su
nombre de archivo, referencias, derivación correspondiente y firma digital.

@c FIXME: Add xref to daemon doc about signatures.
Durante la exportación, el daemon firma digitalmente los contenidos del
archivo, y la firma digital se adjunta. Durante la importación, el daemon
verifica la firma y rechaza la importación en caso de una firma inválida o
si la clave firmante no está autorizada.

Las opciones principales son:

@table @code
@item --export
Exporta los archivos del almacén o paquetes (véase más adelante). Escribe el
archivo resultante a la salida estándar.

Las dependencias @emph{no} están incluidas en la salida, a menos que se use
@option{--recursive}.

@item -r
@itemx --recursive
Cuando se combina con @option{--export}, instruye a @command{guix archive}
para incluir las dependencias de los elementos dados en el archivo. Por
tanto, el archivo resultante está auto-contenido: contiene la clausura de
los elementos exportados del almacén.

@item --import
Lee un archivo de la entrada estándar, e importa los archivos enumerados
allí en el almacén. La operación se aborta si el archivo tiene una firma
digital no válida, o si está firmado por una clave pública que no está entre
las autorizadas (vea @option{--authorize} más adelante).

@item --missing
Lee una lista de nombres de archivos del almacén de la entrada estándar, uno
por línea, y escribe en la salida estándar el subconjunto de estos archivos
que faltan en el almacén.

@item --generate-key[=@var{parámetros}]
@cindex firmar, archivos
Genera un nuevo par de claves para el daemon. Esto es un prerrequisito antes
de que los archivos puedan ser exportados con @option{--export}. Esta
operación es habitualmente instantánea pero puede tomar tiempo si la piscina
de entropía necesita tiene que rellenarse. En el sistema Guix
@code{guix-service-type} se encarga de generar este par de claves en el
primer arranque.

El par de claves generado se almacena típicamente bajo @file{/etc/guix}, en
@file{signing-key.pub} (clave pública) y @file{signing-key.sec} (clave
privada, que se debe mantener secreta). Cuando @var{parámetros} se omite, se
genera una clave ECDSA usando la curva Ed25519, o, en versiones de Libgcrypt
previas a la 1.6.0, es una clave RSA de 4096 bits. De manera alternativa,
los @var{parámetros} pueden especificar parámetros @code{genkey} adecuados
para Libgcrypt (@pxref{General public-key related Functions,
@code{gcry_pk_genkey},, gcrypt, The Libgcrypt Reference Manual}).

@item --authorize
@cindex autorizar, archivos
Autoriza importaciones firmadas con la clave pública pasada por la entrada
estándar. La clave pública debe estar en el ``formato avanzado de
expresiones-s''---es decir, el mismo formato que el archivo
@file{signing-key.pub}.

La lista de claves autorizadas se mantiene en el archivo editable por
personas @file{/etc/guix/acl}. El archivo contiene
@url{https://people.csail.mit.edu/rivest/Sexp.text, ``expresiones-s en
formato avanzado''} y está estructurado como una lista de control de acceso
en el formato @url{https://theworld.com/~cme/spki.txt, Infraestructura
Simple de Clave Pública (SPKI)}.

@item --extract=@var{directorio}
@itemx -x @var{directorio}
Lee un único elemento del archivo como es ofrecido por los servidores de
sustituciones (@pxref{Sustituciones}) y lo extrae a @var{directorio}. Esta es
una operación de bajo nivel necesitada únicamente para casos muy concretos;
véase a continuación.

For example, the following command extracts the substitute for Emacs served
by @code{@value{SUBSTITUTE-SERVER-1}} to @file{/tmp/emacs}:

@example
$ wget -O - \
  https://@value{SUBSTITUTE-SERVER-1}/nar/gzip/@dots{}-emacs-24.5 \
  | gunzip | guix archive -x /tmp/emacs
@end example

Los archivos de un único elemento son diferentes de los archivos de
múltiples elementos producidos por @command{guix archive --export};
contienen un único elemento del almacén, y @emph{no} embeben una firma. Por
tanto esta operación @emph{no} verifica la firma y su salida debe
considerarse insegura.

El propósito primario de esta operación es facilitar la inspección de los
contenidos de un archivo que provenga probablemente de servidores de
sustituciones en los que no se confía (@pxref{Invocación de guix challenge}).

@item --list
@itemx -t
Lee un único elemento del archivo como es ofrecido por los servidores de
sustituciones (@pxref{Sustituciones}) e imprime la lista de archivos que
contiene, como en este ejemplo:

@example
$ wget -O - \
  https://@value{SUBSTITUTE-SERVER-1}/nar/lzip/@dots{}-emacs-26.3 \
  | lzip -d | guix archive -t
@end example

@end table

@c *********************************************************************
@node Canales
@chapter Canales

@cindex channels
@cindex @file{channels.scm}, archivo de configuración
@cindex archivo de configuración de canales
@cindex @command{guix pull}, archivo de configuración
@cindex configuración de @command{guix pull}
Guix y su colección de paquetes se actualizan ejecutando @command{guix pull}
(@pxref{Invocación de guix pull}). Por defecto @command{guix pull} descarga y
despliega el mismo Guix del repositorio oficial de GNU@tie{}Guix. Esto se
puede personalizar definiendo @dfn{canales} en el archivo
@file{~/.config/guix/channels.scm}. Un canal especifica una URL y una rama
de un repositorio Git que será desplegada, y @command{guix pull} puede ser
instruido para tomar los datos de uno o más canales. En otras palabras, los
canales se pueden usar para @emph{personalizar} y para @emph{extender} Guix,
como vemos a continuación. Guix tiene en cuenta consideraciones de seguridad
e implementa actualizaciones verificadas.

@menu
* Especificación de canales adicionales::  Extensiones para la recolección 
                                              de paquetes.
* Uso de un canal de Guix personalizado::  Uso de un Guix personalizado.
* Replicación de Guix::     Ejecución de @emph{exáctamente el mismo} 
                               Guix.
* Verificación de canales::  Cómo verifica Guix lo que obtiene.
* Channels with Substitutes::  Using channels with available substitutes.
* Creación de un canal::    Cómo escribir su canal personalizado.
* Módulos de paquetes en un subdirectorio::  Especificación de la 
                                                localización de los módulos 
                                                de paquetes del canal.
* Declaración de dependencias de canales::  Cómo depender de otros 
                                               canales.
* Especificación de autorizaciones del canal::  Definición de 
                                                   autorizaciones para autores 
                                                   de canales.
* URL primaria::             Distinción entre un servidor espejo y el 
                               original.
* Escribir de noticias del canal::  Comunicar información a las usuarias 
                                      del canal.
@end menu

@node Especificación de canales adicionales
@section Especificación de canales adicionales

@cindex extender la colección de paquetes (canales)
@cindex paquetes personalizados (canales)
You can specify @emph{additional channels} to pull from.  To use a channel,
write @code{~/.config/guix/channels.scm} to instruct @command{guix pull} to
pull from it @emph{in addition} to the default Guix channel(s):

@vindex %default-channels
@lisp
;; Añade variaciones de paquetes sobre los que proporciona Guix.
(cons (channel
        (name 'paquetes-personalizados)
        (url "https://example.org/paquetes-personalizados.git"))
      %default-channels)
@end lisp

@noindent
Fíjese que el fragmento previo es (¡como siempre!)@: código Scheme; usamos
@code{cons} para añadir un canal a la lista de canales a la que la variable
@code{%default-channels} hace referencia (@pxref{Pairs, @code{cons} and
lists,, guile, GNU Guile Reference Manual}). Con el archivo en este lugar,
@command{guix pull} no solo construye Guix sino también los módulos de
paquetes de su propio repositorio. El resultado en
@file{~/.config/guix/current} es la unión de Guix con sus propios módulos de
paquetes:

@example
$ guix describe
Generation 19	Aug 27 2018 16:20:48
  guix d894ab8
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: master
    commit: d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300
  variant-packages dd3df5e
    repository URL: https://example.org/variant-packages.git
    branch: master
    commit: dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb
@end example

@noindent
The output of @command{guix describe} above shows that we're now running
Generation@tie{}19 and that it includes both Guix and packages from the
@code{variant-personal-packages} channel (@pxref{Invocación de guix describe}).

@node Uso de un canal de Guix personalizado
@section Uso de un canal de Guix personalizado

El canal llamado @code{guix} especifica de dónde debe descargarse el mismo
Guix---sus herramientas de línea de órdenes y su colección de
paquetes---. Por ejemplo, suponga que quiere actualizar de otra copia del
repositorio Guix en @code{example.org}, y específicamente la rama
@code{super-hacks}, para ello puede escribir en
@code{~/.config/guix/channels.scm} esta especificación:

@lisp
;; Le dice a 'guix pull' que use mi propio repositorio.
(list (channel
        (name 'guix)
        (url "https://example.org/otro-guix.git")
        (branch "super-hacks")))
@end lisp

@noindent
From there on, @command{guix pull} will fetch code from the
@code{super-hacks} branch of the repository at @code{example.org}.  The
authentication concern is addressed below (@pxref{Verificación de canales}).

@node Replicación de Guix
@section Replicación de Guix

@cindex clavar, canales
@cindex replicar Guix
@cindex reproducibilidad, de Guix
The @command{guix describe} command shows precisely which commits were used
to build the instance of Guix we're using (@pxref{Invocación de guix describe}).
We can replicate this instance on another machine or at a different point in
time by providing a channel specification ``pinned'' to these commits that
looks like this:

@lisp
;; Despliega unas revisiones específicas de mis canales de interés.
(list (channel
       (name 'guix)
       (url "https://git.savannah.gnu.org/git/guix.git")
       (commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300"))
      (channel
       (name 'paquetes-personalizados)
       (url "https://example.org/paquetes-personalizados.git")
       (branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb")))
@end lisp

To obtain this pinned channel specification, the easiest way is to run
@command{guix describe} and to save its output in the @code{channels} format
in a file, like so:

@example
guix describe -f channels > channels.scm
@end example

The resulting @file{channels.scm} file can be passed to the @option{-C}
option of @command{guix pull} (@pxref{Invocación de guix pull}) or @command{guix
time-machine} (@pxref{Invocación de guix time-machine}), as in this example:

@example
guix time-machine -C channels.scm -- shell python -- python3
@end example

Given the @file{channels.scm} file, the command above will always fetch the
@emph{exact same Guix instance}, then use that instance to run the exact
same Python (@pxref{Invoking guix shell}).  On any machine, at any time, it
ends up running the exact same binaries, bit for bit.

@cindex lock files
Pinned channels address a problem similar to ``lock files'' as implemented
by some deployment tools---they let you pin and reproduce a set of
packages.  In the case of Guix though, you are effectively pinning the
entire package set as defined at the given channel commits; in fact, you are
pinning all of Guix, including its core modules and command-line tools.
You're also getting strong guarantees that you are, indeed, obtaining the
exact same software.

Esto le proporciona superpoderes, lo que le permite seguir la pista de la
procedencia de los artefactos binarios con un grano muy fino, y reproducir
entornos de software a su voluntad---un tipo de capacidad de
``meta-reproducibilidad'', si lo desea. @xref{Inferiores}, para otro modo de
tomar ventaja de estos superpoderes.

@node Verificación de canales
@section Verificación de canales

@anchor{channel-authentication}
@cindex verificación, del código de un canal
Las órdenes @command{guix pull} y @command{guix time-machine}
@dfn{verifican} el código obtenido de los canales: se aseguran de que cada
commit que se obtenga se encuentre firmado por una desarrolladora
autorizada. El objetivo es proteger de modificaciones no-autorizadas al
canal que podrían provocar que las usuarias ejecuten código pernicioso.

Como usuaria, debe proporcionar una @dfn{presentación del canal} en su
archivo de canales de modo que Guix sepa como verificar su primera
revision. La especificación de una canal, incluyendo su introducción, es más
o menos así:

@lisp
(channel
  (name 'un-canal)
  (url "https://example.org/un-canal.git")
  (introduction
   (make-channel-introduction
    "6f0d8cc0d88abb59c324b2990bfee2876016bb86"
    (openpgp-fingerprint
     "CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"))))
@end lisp

La especificación previa muestra el nombre y la URL del canal. La llamada a
@code{make-channel-introduction} especifica que la identificación de este
canal empieza en la revisión  @code{6f0d8cc@dots{}}, que está firmada por la
clave de OpenPGP que tiene la huella @code{CABB A931@dots{}}.

En el canal principal, llamado @code{guix}, obtiene esta información de
manera automática desde su instalación de Guix. Para otros canales, incluya
la presentación del canal proporcionada por sus autoras en su archivo
@file{channels.scm}. Asegúrese de obtener la presentación del canal desde
una fuente confiable ya que es la raíz de su confianza.

Si tiene curiosidad sobre los mecanismos de identificación y verificación,
¡siga leyendo!

@node Channels with Substitutes
@section Channels with Substitutes

When running @command{guix pull}, Guix will first compile the definitions of
every available package.  This is an expensive operation for which
substitutes (@pxref{Sustituciones}) may be available.  The following snippet
in @file{channels.scm} will ensure that @command{guix pull} uses the latest
commit with available substitutes for the package definitions: this is done
by querying the continuous integration server at
@url{https://ci.guix.gnu.org}.

@lisp
(use-modules (guix ci))

(list (channel-with-substitutes-available
       %default-guix-channel
       "https://ci.guix.gnu.org"))
@end lisp

Note that this does not mean that all the packages that you will install
after running @command{guix pull} will have available substitutes.  It only
ensures that @command{guix pull} will not try to compile package
definitions.  This is particularly useful when using machines with limited
resources.

@node Creación de un canal
@section Creación de un canal

@cindex paquetes personales (canales)
@cindex canales, para paquetes personales
Digamos que tiene un montón de variaciones personalizadas de paquetes que
piensa que no tiene mucho sentido contribuir al proyecto Guix, pero quiere
tener esos paquetes disponibles en su línea de órdenes de manera
transparente. Primero debería escribir módulos que contengan esas
definiciones de paquete (@pxref{Módulos de paquetes}), mantenerlos en un
repositorio Git, y de esta manera usted y cualquier otra persona podría
usarlos como un canal adicional del que obtener paquetes. Limpio, ¿no?

@c What follows stems from discussions at
@c <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22629#134> as well as
@c earlier discussions on guix-devel@gnu.org.
@quotation Aviso
Antes de que, querida usuaria, grite---``¡Guau, esto es @emph{la
caña}!''---y publique su canal personal al mundo, nos gustaría compartir
algunas palabras de precaución:

@itemize
@item
Antes de publicar un canal, por favor considere contribuir sus definiciones
de paquete al propio Guix (@pxref{Contribuir}). Guix como proyecto es
abierto a software libre de todo tipo, y los paquetes en el propio Guix
están disponibles para todas las usuarias de Guix y se benefician del
proceso de gestión de calidad del proyecto.

@item
Cuando mantiene definiciones de paquete fuera de Guix, nosotras, las
desarrolladoras de Guix, consideramos que @emph{la carga de la
compatibilidad cae de su lado}. Recuerde que los módulos y definiciones de
paquetes son solo código Scheme que usa varias interfaces programáticas
(APIs). Queremos mantener la libertad de cambiar dichas interfaces para
seguir mejorando Guix, posiblemente en formas que pueden romper su
canal. Nunca cambiamos las interfaces gratuitamente, pero @emph{no} vamos
tampoco a congelar las interfaces.

@item
Corolario: si está usando un canal externo y el canal se rompe, por favor
@emph{informe del problema a las autoras del canal}, no al proyecto Guix.
@end itemize

¡Ha quedado advertida! Habiendo dicho esto, creemos que los canales externos
son una forma práctica de ejercitar su libertad para aumentar la colección
de paquetes de Guix y compartir su mejoras, que son pilares básicos del
@uref{https://www.gnu.org/philosophy/free-sw.html, software libre}. Por
favor, envíenos un correo a @email{guix-devel@@gnu.org} si quiere hablar
sobre esto.
@end quotation

Para crear un canal, cree un repositorio Git que contenga sus propios
módulos de paquetes y haga que esté disponible. El repositorio puede
contener cualquier cosa, pero un canal útil contendrá módulos Guile que
exportan paquetes. Una vez comience a usar un canal, Guix se comportará como
si el directorio raíz del repositorio Git de dicho canal hubiese sido
añadido a la ruta de carga de Guile (@pxref{Load Paths,,, guile, GNU Guile
Reference Manual}). Por ejemplo, si su canal contiene un archivo en
@file{mis-paquetes/mis-herramientas.scm} que define un módulo, entonces
dicho módulo estará disponible bajo el nombre @code{(mis-paquetes
mis-herramientas)}, y podrá usarlo como cualquier otro módulo
(@pxref{Módulos,,, guile, GNU Guile Reference Manual}).

Como autora de un canal, considere adjuntar el material para la
identificación a su canal de modo que las usuarias puedan verificarlo.
@xref{Verificación de canales}, y @ref{Especificación de autorizaciones del canal},
para obtener información sobre cómo hacerlo.


@node Módulos de paquetes en un subdirectorio
@section Módulos de paquetes en un subdirectorio

@cindex subdirectorio, canales
Como autora de un canal, es posible que desee mantener los módulos de su
canal en un subdirectorio. Si sus módulos se encuentran en el subdirectorio
@file{guix}, debe añadir un archivo @file{.guix-channel} de metadatos que
contenga:

@lisp
(channel
  (version 0)
  (directory "guix"))
@end lisp

@node Declaración de dependencias de canales
@section Declaración de dependencias de canales

@cindex dependencias, canales
@cindex metadatos, canales
Las autoras de canales pueden decidir aumentar una colección de paquetes
proporcionada por otros canales. Pueden declarar su canal como dependiente
de otros canales en el archivo de metadatos @file{.guix-channel}, que debe
encontrarse en la raíz del repositorio del canal.

Este archivo de metadatos debe contener una expresión-S simple como esta:

@lisp
(channel
 (version 0)
 (dependencies
  (channel
   (name some-collection)
   (url "https://example.org/first-collection.git")

   ;; The 'introduction' bit below is optional: you would
   ;; provide it for dependencies that can be authenticated.
   (introduction
    (channel-introduction
      (version 0)
      (commit "a8883b58dc82e167c96506cf05095f37c2c2c6cd")
      (signer "CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"))))
  (channel
   (name some-other-collection)
   (url "https://example.org/second-collection.git")
   (branch "testing"))))
@end lisp

En el ejemplo previo, este canal se declara como dependiente de otros dos
canales, que se obtendrán de manera automática. Los módulos proporcionados
por el canal se compilarán en un entorno donde los módulos de todos estos
canales declarados estén disponibles.

De cara a la confianza proporcionada y el esfuerzo que supondrá su
mantenimiento, debería evitar depender de canales que no controle, y debería
intentar minimizar el número de dependencias.

@node Especificación de autorizaciones del canal
@section Especificación de autorizaciones del canal

@cindex autorizaciones del canal
@anchor{channel-authorizations}
Como hemos visto previamente, Guix se asegura de que el código fuente que
obtiene de los canales proviene de desarrolladoras autorizadas. Como autora
del canal, es necesario que especifique la lista de desarrolladoras
autorizadas en el archivo @file{.guix-authorizations} del repositorio Git
del canal. Las reglas para la verificación son simples: cada revisión debe
firmarse con una de las claves enumeradas en el archivo
@file{.guix-authorizations} de la revisión o revisiones
anteriores@footnote{Las revisiones en Git forman un @dfn{grafo acíclico
dirigido} (DAG). Cada revisión puede tener cero o más antecesores; las
revisiones ``normales'' tienen un antecesor, y las revisiones de mezcla
tienen dos antecesores.  Lea el artículo en inglés
@uref{https://eagain.net/articles/git-for-computer-scientists/, @i{Git for
Computer Scientists}} para una buena introducción.} El archivo
@file{.guix-authorizations} tiene está estructura básica:

@lisp
;; Archivo '.guix-authorizations' de ejemplo.

(authorizations
 (version 0)               ;versión de formato actual

 (("AD17 A21E F8AE D8F1 CC02  DBD9 F8AE D8F1 765C 61E3"
   (name "alicia"))
  ("CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"
   (name "carlos"))
  ("2A39 3FFF 68F4 EF7A 3D29  12AF 68F4 EF7A 22FB B2D5"
   (name "rober"))))
@end lisp

Cada huella va seguida de pares clave/valor opcionales, como en el ejemplo
siguiente. Actualmente se ignoran dichos pares.

Estas reglas de verificación dan lugar a un problema ``del huevo y la
gallina'': ¿cómo se verifica la primera revisión? En relación con esto:
¿cómo se gestionan los canales cuyo repositorio tiene en su historia
revisiones sin firmar y carece del archivo @file{.guix-authorizations}? ¿Y
cómo creamos un nuevo canal separado en base a un canal ya existente?

@cindex presentación del canal
Channel introductions answer these questions by describing the first commit
of a channel that should be authenticated.  The first time a channel is
fetched with @command{guix pull} or @command{guix time-machine}, the command
looks up the introductory commit and verifies that it is signed by the
specified OpenPGP key.  From then on, it authenticates commits according to
the rule above.  Authentication fails if the target commit is neither a
descendant nor an ancestor of the introductory commit.

De manera adicional, su canal debe proporcionar todas las claves públicas
que hayan sido mencionadas en @file{.guix-authorizations}, almacenadas como
archivos @file{.key}, los cuales pueden ser binarios o tener ``armadura
ASCII''. De manera predeterminada, esos archivos @file{.key} se buscan en la
rama llamada @code{keyring} pero puede especificar una rama diferente en
@code{.guix-channel} de este modo:

@lisp
(channel
  (version 0)
  (keyring-reference "mi-rama-de-claves"))
@end lisp

En resumen, como autora de un canal, hay tres cosas que debe hacer para
permitir que las usuarias verifiquen su código:

@enumerate
@item
Exportar las claves OpenPGP de quienes contribuyan en el presente y quienes
hayan contribuido en el pasado con @command{gpg --export} y almacenarlas en
archivos @file{.key}, de manera predeterminada en una rama llamada
@code{keyring} (recomendamos que sea una @dfn{rama huérfana}).

@item
Introducir un archivo inicial @file{.guix-authorizations} en el repositorio
del canal. Hágalo con una revisión firmada (@pxref{Acceso al repositorio}, para más
información sobre cómo firmar revisiones).

@item
Anuncie la presentación del canal, por ejemplo, en la página web de su
canal. La presentación del canal, como hemos visto antes, es el par
revisión/clave---es decir, la revisión que introdujo el archivo
@file{.guix-authorizations}, y la huella de la clave de OpenPGP usada para
firmarlo.
@end enumerate

Antes de que suba los cambios a su repositorio Git público puede ejecutar
@command{guix git-authenticate} para verificar que ha firmado todas las
revisiones que va a subir con una clave autorizada:

@example
guix git authenticate @var{revisión} @var{firma}
@end example

@noindent
donde @var{revisión} y @var{firma} son la presentación de su canal.
@xref{Invocación de guix git authenticate}, para obtener más detalles.

Publicar un canal firmado requiere disciplina: cualquier error, como una
revisión sin firmar o una revisión firmada por una clave no autorizada,
evitará que las usuarias obtengan nuevas versiones de su canal---bueno, ¡ese
es principalmente el objetivo de la verificación! Preste especial atención a
la mezcla de ramas: las revisiones de mezcla se consideran auténticas
únicamente en caso de que la clave que firma esté presente en el archivo
@file{.guix-authorizations} de @emph{ambas} ramas.

@node URL primaria
@section URL primaria

@cindex URL primaria, canales
Las autoras pueden declarar la URL primaria del repositorio Git de su canal
en el archivo @file{.guix-channel} de esta manera:

@lisp
(channel
  (version 0)
  (url "https://example.org/guix.git"))
@end lisp

This allows @command{guix pull} to determine whether it is pulling code from
a mirror of the channel; when that is the case, it warns the user that the
mirror might be stale and displays the primary URL@.  That way, users cannot
be tricked into fetching code from a stale mirror that does not receive
security updates.

Esta caraterística únicamente tiene sentido en repositorios verificables,
como el canal oficial @code{guix}, en el que @command{guix pull} se asegura
de verificar la autenticidad del código que obtiene.

@node Escribir de noticias del canal
@section Escribir de noticias del canal

@cindex noticias, para canales
Las autoras los canales pueden querer ocasionalmente comunicar información a
sus usuarias acerca de cambios importantes en el canal. Podrían mandar un
correo a todo el mundo, pero esto no es tan conveniente.

En vez de eso, los canales proporcionan un @dfn{archivo de noticias}; cuando
las usuarias de un canal ejecutan @command{guix pull}, dicho archivo de
noticias se lee automáticamente y @command{guix pull --news} puede mostrar
los anuncios que correspondan a las nuevas revisiones que se han obtenido,
si existen.

Para hacerlo, las autoras del canal deben declarar primero el nombre del
archivo de noticias en su archivo @file{.guix-channel}:

@lisp
(channel
  (version 0)
  (news-file "etc/noticias.txt"))
@end lisp

El archivo de noticias en sí, @file{etc/noticias.txt} en este ejemplo, debe
ser similar a este:

@lisp
(channel-news
  (version 0)
  (entry (tag "the-bug-fix")
         (title (en "Fixed terrible bug")
                (fr "Oh la la")
                (es "Podemos volver a dormir en calma"))
         (body (en "@@emph@{Good news@}!  It's fixed!")
               (eo "Certe ĝi pli bone funkcias nun!")
               (es "¡Al fin se ha corregido el error!")))
  (entry (commit "bdcabe815cd28144a2d2b4bc3c5057b051fa9906")
         (title (en "Added a great package")
                (ca "Què vol dir guix?")
                (es "Nuevo paquete añadido"))
         (body (en "Don't miss the @@code@{hello@} package!")
               (es "Atención a la versátil herramienta @@code@{hello@}"))))
@end lisp

Aunque el archivo de noticias use sintaxis de Scheme evite nombrarlo con
@file{.scm} como extensión o se usará cuando se construya el canal, lo que
emitirá un error debido a que no es un módulo válido. También puede mover el
módulo del canal a un subdirectorio y almacenar el archivo de noticias en
otro directorio.

Este archivo consiste en una lista de @dfn{entradas de noticias}. Cada
entrada@footnote{NdT: ``entry'' en inglés} se asocia a una revisión o una
etiqueta: describe los cambios llevados a cabo en ella, y posiblemente
también en revisiones anteriores. Las usuarias ven las entradas únicamente
la primera vez que obtienen la revisión a la que la entrada hace referencia.

El campo del título (@code{title}) debe ser un resumen de una línea mientras
que el cuerpo de la noticia (@code{body}) puede ser arbitrariamente largo, y
ambos pueden contener marcas de Texinfo (@pxref{Overview,,, texinfo, GNU
Texinfo}). Tanto el título como el cuerpo son una lista de tuplas de
etiqueta de lengua y mensaje, lo que permite a @command{guix pull} mostrar
las noticias en la lengua que corresponde a la localización de la usuaria.

Si desea traducir las noticias siguiendo un flujo de trabajo basado en
gettext, puede extraer las cadenas traducibles con @command{xgettext}
(@pxref{xgettext Invocation,,, gettext, GNU Gettext Utilities}). Por
ejemplo, asumiendo que escribe las entradas de noticias primero en inglés,
la siguiente orden crea un archivo PO que contiene las cadenas a traducir:

@example
xgettext -o news.po -l scheme -ken etc/news.txt
@end example

En resumen, sí, puede usar su canal como un blog. Pero tenga en cuenta que
esto puede que @emph{no sea exactamente} lo que sus usuarias podrían
esperar.

@c *********************************************************************
@node Desarrollo
@chapter Desarrollo

@cindex desarrollo de software
Si es una desarrolladora de software, Guix le proporciona herramientas que
debería encontrar útiles---independientemente del lenguaje en el que
desarrolle actualmente. Esto es sobre lo que trata este capítulo.

The @command{guix shell} command provides a convenient way to set up one-off
software environments, be it for development purposes or to run a command
without installing it in your profile.  The @command{guix pack} command
allows you to create @dfn{application bundles} that can be easily
distributed to users who do not run Guix.

@menu
* Invoking guix shell::      Spawning one-off software environments.
* Invocación de guix environment::  Configurar entornos de desarrollo.
* Invocación de guix pack::  Creación de empaquetados de software.
* La cadena de herramientas de GCC::  Trabajo con lenguajes implementados 
                                        por GCC.
* Invocación de guix git authenticate::  Verificación de repositorios de 
                                            Git.
@end menu

@node Invoking guix shell
@section Invoking @command{guix shell}

@cindex entornos de construcción reproducibles
@cindex entornos de desarrollo
@cindex @command{guix environment}
@cindex @command{guix shell}
@cindex entorno, entorno de construcción de paquetes
The purpose of @command{guix shell} is to make it easy to create one-off
software environments, without changing one's profile.  It is typically used
to create development environments; it is also a convenient way to run
applications without ``polluting'' your profile.

@quotation Nota
The @command{guix shell} command was recently introduced to supersede
@command{guix environment} (@pxref{Invocación de guix environment}).  If you are
familiar with @command{guix environment}, you will notice that it is similar
but also---we hope!---more convenient.
@end quotation

La sintaxis general es:

@example
guix shell [@var{options}] [@var{package}@dots{}]
@end example

The following example creates an environment containing Python and NumPy,
building or downloading any missing package, and runs the @command{python3}
command in that environment:

@example
guix shell python python-numpy -- python3
@end example

Development environments can be created as in the example below, which
spawns an interactive shell containing all the dependencies and environment
variables needed to work on Inkscape:

@example
guix shell --development inkscape
@end example

Exiting the shell places the user back in the original environment before
@command{guix shell} was invoked.  The next garbage collection
(@pxref{Invocación de guix gc}) may clean up packages that were installed in the
environment and that are no longer used outside of it.

As an added convenience, @command{guix shell} will try to do what you mean
when it is invoked interactively without any other arguments as in:

@example
guix shell
@end example

If it finds a @file{manifest.scm} in the current working directory or any of
its parents, it uses this manifest as though it was given via
@code{--manifest}.  Likewise, if it finds a @file{guix.scm} in the same
directories, it uses it to build a development profile as though both
@code{--development} and @code{--file} were present.  In either case, the
file will only be loaded if the directory it resides in is listed in
@file{~/.config/guix/shell-authorized-directories}.  This provides an easy
way to define, share, and enter development environments.

By default, the shell session or command runs in an @emph{augmented}
environment, where the new packages are added to search path environment
variables such as @code{PATH}.  You can, instead, choose to create an
@emph{isolated} environment containing nothing but the packages you asked
for.  Passing the @option{--pure} option clears environment variable
definitions found in the parent environment@footnote{Be sure to use the
@option{--check} option the first time you use @command{guix shell}
interactively to make sure the shell does not undo the effect of
@option{--pure}.}; passing @option{--container} goes one step further by
spawning a @dfn{container} isolated from the rest of the system:

@example
guix shell --container emacs gcc-toolchain
@end example

The command above spawns an interactive shell in a container where nothing
but @code{emacs}, @code{gcc-toolchain}, and their dependencies is
available.  The container lacks network access and shares no files other
than the current working directory with the surrounding environment.  This
is useful to prevent access to system-wide resources such as @file{/usr/bin}
on foreign distros.

This @option{--container} option can also prove useful if you wish to run a
security-sensitive application, such as a web browser, in an isolated
environment.  For example, the command below launches Ungoogled-Chromium in
an isolated environment, this time sharing network access with the host and
preserving its @code{DISPLAY} environment variable, but without even sharing
the current directory:

@example
guix shell --container --network --no-cwd ungoogled-chromium \
  --preserve='^DISPLAY$' -- chromium
@end example

@vindex GUIX_ENVIRONMENT
@command{guix shell} defines the @env{GUIX_ENVIRONMENT} variable in the
shell it spawns; its value is the file name of the profile of this
environment.  This allows users to, say, define a specific prompt for
development environments in their @file{.bashrc} (@pxref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}):

@example
if [ -n "$GUIX_ENVIRONMENT" ]
then
    export PS1="\u@@\h \w [dev]\$ "
fi
@end example

@noindent
...@: o para explorar el perfil:

@example
$ ls "$GUIX_ENVIRONMENT/bin"
@end example

Las opciones disponibles se resumen a continuación.

@table @code
@item --check
Set up the environment and check whether the shell would clobber environment
variables.  It's a good idea to use this option the first time you run
@command{guix shell} for an interactive session to make sure your setup is
correct.

For example, if the shell modifies the @env{PATH} environment variable,
report it since you would get a different environment than what you asked
for.

Such problems usually indicate that the shell startup files are unexpectedly
modifying those environment variables.  For example, if you are using Bash,
make sure that environment variables are set or modified in
@file{~/.bash_profile} and @emph{not} in @file{~/.bashrc}---the former is
sourced only by log-in shells.  @xref{Bash Startup Files,,, bash, The GNU
Bash Reference Manual}, for details on Bash start-up files.

@anchor{shell-development-option}
@item --development
@itemx -D
Cause @command{guix shell} to include in the environment the dependencies of
the following package rather than the package itself.  This can be combined
with other packages.  For instance, the command below starts an interactive
shell containing the build-time dependencies of GNU@tie{}Guile, plus
Autoconf, Automake, and Libtool:

@example
guix shell -D guile autoconf automake libtool
@end example

@item --expression=@var{expr}
@itemx -e @var{expr}
Crea un entorno para el paquete o lista de paquetes a los que evalúa
@var{expr}.

Por ejemplo, ejecutando:

@example
guix shell -D -e '(@@ (gnu packages maths) petsc-openmpi)'
@end example

inicia un shell con el entorno para esta variante específica del paquete
PETSc.

Ejecutar:

@example
guix shell -e '(@@ (gnu) %base-packages)'
@end example

inicia un shell con todos los paquetes básicos del sistema disponibles.

Las órdenes previas usan únicamente la salida predeterminada de los paquetes
dados. Para seleccionar otras salidas, tuplas de dos elementos pueden ser
especificadas:

@example
guix shell -e '(list (@@ (gnu packages bash) bash) "include")'
@end example

@xref{package-development-manifest, @code{package->development-manifest}},
for information on how to write a manifest for the development environment
of a package.

@item --file=@var{archivo}
@itemx -f @var{archivo}
Create an environment containing the package or list of packages that the
code within @var{file} evaluates to.

Como un ejemplo, @var{archivo} puede contener una definición como esta
(@pxref{Definición de paquetes}):

@lisp
@verbatiminclude environment-gdb.scm
@end lisp

With the file above, you can enter a development environment for GDB by
running:

@example
guix shell -D -f gdb-devel.scm
@end example

@anchor{shell-manifest}
@item --manifest=@var{archivo}
@itemx -m @var{archivo}
Crea un entorno para los paquetes contenidos en el objeto manifest devuelto
por el código Scheme en @var{file}. Esta opción se puede repetir varias
veces, en cuyo caso los manifiestos se concatenan.

Esto es similar a la opción del mismo nombre en @command{guix package}
(@pxref{profile-manifest, @option{--manifest}}) y usa los mismos archivos de
manifiesto.

@xref{Writing Manifests}, for information on how to write a manifest.  See
@option{--export-manifest} below on how to obtain a first manifest.

@cindex manifest, exporting
@anchor{shell-export-manifest}
@item --export-manifest
Write to standard output a manifest suitable for @option{--manifest}
corresponding to given command-line options.

This is a way to ``convert'' command-line arguments into a manifest.  For
example, imagine you are tired of typing long lines and would like to get a
manifest equivalent to this command line:

@example
guix shell -D guile git emacs emacs-geiser emacs-geiser-guile
@end example

Just add @option{--export-manifest} to the command line above:

@example
guix shell --export-manifest \
  -D guile git emacs emacs-geiser emacs-geiser-guile
@end example

@noindent
... and you get a manifest along these lines:

@lisp
(concatenate-manifests
  (list (specifications->manifest
          (list "git"
                "emacs"
                "emacs-geiser"
                "emacs-geiser-guile"))
        (package->development-manifest
          (specification->package "guile"))))
@end lisp

You can store it into a file, say @file{manifest.scm}, and from there pass
it to @command{guix shell} or indeed pretty much any @command{guix} command:

@example
guix shell -m manifest.scm
@end example

Voilà, you've converted a long command line into a manifest! That conversion
process honors package transformation options (@pxref{Opciones de transformación de paquetes}) so it should be lossless.

@item --profile=@var{perfil}
@itemx -p @var{perfil}
Create an environment containing the packages installed in @var{profile}.
Use @command{guix package} (@pxref{Invocación de guix package}) to create and
manage profiles.

@item --pure
Olvida las variables de entorno existentes cuando se construye un nuevo
entorno, excepto aquellas especificadas con @option{--preserve} (véase más
adelante). Esto tiene el efecto de crear un entorno en el que las rutas de
búsqueda únicamente contienen las entradas del paquete.

@item --preserve=@var{regexp}
@itemx -E @var{regexp}
Cuando se usa junto a @option{--pure}, preserva las variables de entorno que
corresponden con @var{regexp}---en otras palabras, las pone en una lista de
variables de entorno que deben preservarse. Esta opción puede repetirse
varias veces.

@example
guix shell --pure --preserve=^SLURM openmpi @dots{} \
  -- mpirun @dots{}
@end example

Este ejemplo ejecuta @command{mpirun} en un contexto donde las únicas
variables de entorno definidas son @env{PATH}, variables de entorno cuyo
nombre empiece con @samp{SLURM}, así como las variables ``preciosas''
habituales (@env{HOME}, @env{USER}, etc.).

@item --search-paths
Muestra las definiciones de variables de entorno que componen el entorno.

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta construir para @var{sistema}---por ejemplo, @code{i686-linux}.

@item --container
@itemx -C
@cindex container
Ejecuta la @var{orden} en un contenedor aislado. El directorio actual fuera
del contenedor es asociado al interior del contenedor. Adicionalmente, a
menos que se fuerce con @option{--user}, un directorio de prueba de la
usuaria se crea de forma que coincida con el directorio actual de la
usuaria, y @file{/etc/passwd} se configura adecuadamente.

El proceso lanzado se ejecuta como el usuario actual fuera del
contenedor. Dentro del contenedor, tiene el mismo UID y GID que el usuario
actual, a menos que se proporcione @option{--user} (véase más adelante).

@item --network
@itemx -N
Para contenedores, comparte el espacio de nombres de red con el sistema
anfitrión. Los contenedores creados sin esta opción únicamente tienen acceso
a la red local.

@item --link-profile
@itemx -P
For containers, link the environment profile to @file{~/.guix-profile}
within the container and set @code{GUIX_ENVIRONMENT} to that.  This is
equivalent to making @file{~/.guix-profile} a symlink to the actual profile
within the container.  Linking will fail and abort the environment if the
directory already exists, which will certainly be the case if @command{guix
shell} was invoked in the user's home directory.

Determinados paquetes se configuran para buscar en @file{~/.guix-profile}
archivos de configuración y datos;@footnote{Por ejemplo, el paquete
@code{fontconfig} inspecciona @file{~/.guix-profile/share/fonts} en busca de
nuevas tipografías.} @option{--link-profile} permite a estos programas
operar de la manera esperada dentro del entorno.

@item --user=@var{usuaria}
@itemx -u @var{usuaria}
Para contenedores, usa el nombre de usuaria @var{usuaria} en vez de la
actual. La entrada generada en @file{/etc/passwd} dentro del contenedor
contendrá el nombre @var{usuaria}; su directorio será
@file{/home/@var{usuaria}} y ningún dato GECOS de la usuaria se copiará. Más
aún, el UID y GID dentro del contenedor son 1000. @var{usuaria} no debe
existir en el sistema.

Adicionalmente, cualquier ruta compartida o expuesta (véanse
@option{--share} y @option{--expose} respectivamente) cuyo destino esté
dentro de la carpeta actual de la usuaria será reasociada en relación a
@file{/home/@var{usuaria}}; esto incluye la relación automática del
directorio de trabajo actual.

@example
# will expose paths as /home/foo/wd, /home/foo/test, and /home/foo/target
cd $HOME/wd
guix shell --container --user=foo \
     --expose=$HOME/test \
     --expose=/tmp/target=$HOME/target
@end example

Mientras esto limita el escape de la identidad de la usuaria a través de las
rutas de sus directorios y cada uno de los campos de usuaria, esto es
únicamente un componente útil de una solución de privacidad/anonimato más
amplia---no una solución completa.

@item --no-cwd
El comportamiento predeterminado con contenedores es compartir el directorio
de trabajo actual con el contenedor aislado e inmediatamente cambiar a dicho
directorio dentro del contenedor. Si no se desea este comportamiento,
@option{--no-cwd} indica que el directorio actual @emph{no} se compartirá
automáticamente y, en vez de cambiar a dicho directorio, se cambiará al
directorio de la usuaria dentro del contenedor. Véase también
@option{--user}.

@item --expose=@var{fuente}[=@var{destino}]
@itemx --share=@var{fuente}[=@var{destino}]
En contenedores, la @option{--expose} expone el sistema de archivos
@var{fuente} del sistema anfitrión como un sistema de archivos de
solo-lectura @var{destino} dentro del contenedor. @option{--share} de la
misma manera expone el sistema de archivos con posibilidad de escritura. Si
no se especifica @var{destino}, @var{fuente} se usa como el punto de montaje
en el contenedor.

El ejemplo a continuación lanza una sesión interactiva de Guile en un
contenedor donde el directorio principal de la usuaria es accesible en modo
solo-lectura a través del directorio @file{/intercambio}:

@example
guix shell --container --expose=$HOME=/exchange guile -- guile
@end example

@cindex symbolic links, guix shell
@item --symlink=@var{spec}
@itemx -S @var{spec}
For containers, create the symbolic links specified by @var{spec}, as
documented in @ref{pack-symlink-option}.

@cindex file system hierarchy standard (FHS)
@cindex FHS (file system hierarchy standard)
@item --emulate-fhs
@itemx -F
When used with @option{--container}, emulate a
@uref{https://refspecs.linuxfoundation.org/fhs.shtml, Filesystem Hierarchy
Standard (FHS)} configuration within the container, providing @file{/bin},
@file{/lib}, and other directories and files specified by the FHS.

As Guix deviates from the FHS specification, this option sets up the
container to more closely mimic that of other GNU/Linux distributions.  This
is useful for reproducing other development environments, testing, and using
programs which expect the FHS specification to be followed.  With this
option, the container will include a version of glibc that will read
@file{/etc/ld.so.cache} within the container for the shared library cache
(contrary to glibc in regular Guix usage) and set up the expected FHS
directories: @file{/bin}, @file{/etc}, @file{/lib}, and @file{/usr} from the
container's profile.

@item --rebuild-cache
@cindex caching, of profiles
@cindex caching, in @command{guix shell}
In most cases, @command{guix shell} caches the environment so that
subsequent uses are instantaneous.  Least-recently used cache entries are
periodically removed.  The cache is also invalidated, when using
@option{--file} or @option{--manifest}, anytime the corresponding file is
modified.

The @option{--rebuild-cache} forces the cached environment to be refreshed.
This is useful when using @option{--file} or @option{--manifest} and the
@command{guix.scm} or @command{manifest.scm} file has external dependencies,
or if its behavior depends, say, on environment variables.

@item --root=@var{archivo}
@itemx -r @var{archivo}
@cindex entorno persistente
@cindex raíz del recolector de basura, para entornos
Hace que @var{archivo} sea un enlace simbólico al perfil para este entorno,
y lo registra como una raíz del recolector de basura.

Esto es útil si desea proteger su entorno de la recolección de basura,
hacerlo ``persistente''.

When this option is omitted, @command{guix shell} caches profiles so that
subsequent uses of the same environment are instantaneous---this is
comparable to using @option{--root} except that @command{guix shell} takes
care of periodically removing the least-recently used garbage collector
roots.

In some cases, @command{guix shell} does not cache profiles---e.g., if
transformation options such as @option{--with-latest} are used.  In those
cases, the environment is protected from garbage collection only for the
duration of the @command{guix shell} session.  This means that next time you
recreate the same environment, you could have to rebuild or re-download
packages.

@xref{Invocación de guix gc}, for more on GC roots.
@end table

@command{guix shell} also supports all of the common build options that
@command{guix build} supports (@pxref{Opciones comunes de construcción}) as well as
package transformation options (@pxref{Opciones de transformación de paquetes}).

@node Invocación de guix environment
@section Invocación de @command{guix environment}

@cindex @command{guix environment}

The purpose of @command{guix environment} is to assist in creating
development environments.

@quotation Deprecation warning
The @command{guix environment} command is deprecated in favor of
@command{guix shell}, which performs similar functions but is more
convenient to use.  @xref{Invoking guix shell}.

Being deprecated, @command{guix environment} is slated for eventual removal,
but the Guix project is committed to keeping it until May 1st, 2023.  Please
get in touch with us at @email{guix-devel@@gnu.org} if you would like to
discuss it.
@end quotation

La sintaxis general es:

@example
guix environment @var{opciones} @var{paquete}@dots{}
@end example

El ejemplo siguiente lanza un nuevo shell preparado para el desarrollo de
GNU@tie{}Guile:

@example
guix environment guile
@end example

Si las dependencias necesarias no están construidas todavía, @command{guix
environment} las construye automáticamente. El entorno del nuevo shell es
una versión aumentada del entorno en el que @command{guix environment} se
ejecutó. Contiene las rutas de búsqueda necesarias para la construcción del
paquete proporcionado añadidas a las variables ya existentes. Para crear un
entorno ``puro'', donde las variables de entorno previas no existen, use la
opción @option{--pure}@footnote{Las usuarias habitualmente aumentan de forma
incorrecta las variables de entorno como @env{PATH} en su archivo
@file{~/.bashrc}. Como consecuencia, cuando @code{guix environment} se
ejecuta, Bash puede leer @file{~/.bashrc}, por tanto introduciendo
``impurezas'' en esas variables de entorno. Es un error definir dichas
variables de entorno en @file{~/.bashrc}; en vez de ello deben definirse en
@file{.bash_profile}, el cual es únicamente cargado por el shell de ingreso
al sistema. @xref{Bash Startup Files,,, bash, The GNU Bash Reference
Manual}, para detalles sobre los archivos de inicio de Bash.}.

Exiting from a Guix environment is the same as exiting from the shell, and
will place the user back in the old environment before @command{guix
environment} was invoked.  The next garbage collection (@pxref{Invocación de guix gc}) will clean up packages that were installed from within the environment
and are no longer used outside of it.

@vindex GUIX_ENVIRONMENT
@command{guix environment} define la variable @env{GUIX_ENVIRONMENT} en el
shell que lanza; su valor es el nombre de archivo del perfil para este
entorno. Esto permite a las usuarias, digamos, definir un prompt para
entornos de desarrollo en su @file{.bashrc} (@pxref{Bash Startup Files,,,
bash, The GNU Bash Reference Manual}):

@example
if [ -n "$GUIX_ENVIRONMENT" ]
then
    export PS1="\u@@\h \w [dev]\$ "
fi
@end example

@noindent
...@: o para explorar el perfil:

@example
$ ls "$GUIX_ENVIRONMENT/bin"
@end example

Adicionalmente, más de un paquete puede ser especificado, en cuyo caso se
usa la unión de las entradas de los paquetes proporcionados. Por ejemplo, la
siguiente orden lanza un shell donde todas las dependencias tanto de Guile
como de Emacs están disponibles:

@example
guix environment guile emacs
@end example

A veces no se desea una sesión interactiva de shell. Una orden arbitraria se
puede invocar usando el valor @code{--} para separar la orden del resto de
los parámetros:

@example
guix environment guile -- make -j4
@end example

In other situations, it is more convenient to specify the list of packages
needed in the environment.  For example, the following command runs
@command{python} from an environment containing Python@tie{}3 and NumPy:

@example
guix environment --ad-hoc python-numpy python -- python3
@end example

Es más, se pueden desear las dependencias de un paquete y también algunos
paquetes adicionales que no son dependencias ni en tiempo de construcción ni
en el de ejecución, pero son útiles no obstante para el desarrollo. Por esta
razón, la opción @option{--ad-hoc} es posicional. Los paquetes que aparecen
antes de @option{--ad-hoc} se interpretan como paquetes cuyas dependencias
se añadirán al entorno. Los paquetes que aparecen después se interpretan
como paquetes que se añadirán directamente al entorno. Por ejemplo, la
siguiente orden crea un entorno de desarrollo Guix que incluye
adicionalmente Git y strace:

@example
guix environment --pure guix --ad-hoc git strace
@end example

@cindex container
En ocasiones es deseable aislar el entorno tanto como sea posible, para
obtener la máxima pureza y reproducibilidad. En particular, cuando se usa
Guix en una distribución anfitriona que no es el sistema Guix, es deseable
prevenir acceso a @file{/usr/bin} y otros recursos del sistema desde el
entorno de desarrollo. Por ejemplo, la siguiente orden lanza un REPL Guile
en un ``contenedor'' donde únicamente el almacén y el directorio actual
están montados:

@example
guix environment --ad-hoc --container guile -- guile
@end example

@quotation Nota
La opción @option{--container} requiere Linux-libre 3.19 o posterior.
@end quotation

@cindex certificados
Otro caso de uso típico para los contenedores es la ejecución de
aplicaciones sensibles como navegadores web. Para ejecutar Eolie, debemos
exponer y compartir algunos archivos y directorios; incluimos
@code{nss-certs} y exponemos @file{/etc/ssl/certs/} para la identificación
HTTPS; por último preservamos la variable de entorno @env{DISPLAY} ya que
las aplicaciones gráficas en el contenedor no se mostrarían sin ella.

@example
guix environment --preserve='^DISPLAY$' --container --network \
  --expose=/etc/machine-id \
  --expose=/etc/ssl/certs/ \
  --share=$HOME/.local/share/eolie/=$HOME/.local/share/eolie/ \
  --ad-hoc eolie nss-certs dbus --  eolie
@end example

Las opciones disponibles se resumen a continuación.

@table @code
@item --check
Set up the environment and check whether the shell would clobber environment
variables.  @xref{Invoking guix shell, @option{--check}}, for more info.

@item --root=@var{archivo}
@itemx -r @var{archivo}
@cindex entorno persistente
@cindex raíz del recolector de basura, para entornos
Hace que @var{archivo} sea un enlace simbólico al perfil para este entorno,
y lo registra como una raíz del recolector de basura.

Esto es útil si desea proteger su entorno de la recolección de basura,
hacerlo ``persistente''.

Cuando se omite esta opción, el entorno se protege de la recolección de
basura únicamente por la duración de la sesión @command{guix
environment}. Esto significa que la siguiente vez que vuelva a crear el
mismo entorno, puede tener que reconstruir o volver a descargar
paquetes. @xref{Invocación de guix gc}, para más información sobre las raíces del
recolector de basura.

@item --expression=@var{expr}
@itemx -e @var{expr}
Crea un entorno para el paquete o lista de paquetes a los que evalúa
@var{expr}.

Por ejemplo, ejecutando:

@example
guix environment -e '(@@ (gnu packages maths) petsc-openmpi)'
@end example

inicia un shell con el entorno para esta variante específica del paquete
PETSc.

Ejecutar:

@example
guix environment --ad-hoc -e '(@@ (gnu) %base-packages)'
@end example

inicia un shell con todos los paquetes básicos del sistema disponibles.

Las órdenes previas usan únicamente la salida predeterminada de los paquetes
dados. Para seleccionar otras salidas, tuplas de dos elementos pueden ser
especificadas:

@example
guix environment --ad-hoc -e '(list (@@ (gnu packages bash) bash) "include")'
@end example

@item --load=@var{archivo}
@itemx -l @var{archivo}
Crea un entorno para el paquete o la lista de paquetes a la que el código en
@var{archivo} evalúa.

Como un ejemplo, @var{archivo} puede contener una definición como esta
(@pxref{Definición de paquetes}):

@lisp
@verbatiminclude environment-gdb.scm
@end lisp

@item --manifest=@var{archivo}
@itemx -m @var{archivo}
Crea un entorno para los paquetes contenidos en el objeto manifest devuelto
por el código Scheme en @var{file}. Esta opción se puede repetir varias
veces, en cuyo caso los manifiestos se concatenan.

Esto es similar a la opción del mismo nombre en @command{guix package}
(@pxref{profile-manifest, @option{--manifest}}) y usa los mismos archivos de
manifiesto.

@xref{shell-export-manifest, @command{guix shell --export-manifest}}, for
information on how to ``convert'' command-line options into a manifest.

@item --ad-hoc
Incluye todos los paquetes especificados en el entorno resultante, como si
un paquete @i{ad hoc} hubiese sido definido con ellos como entradas. Esta
opción es útil para la creación rápida un entorno sin tener que escribir una
expresión de paquete que contenga las entradas deseadas.

Por ejemplo, la orden:

@example
guix environment --ad-hoc guile guile-sdl -- guile
@end example

ejecuta @command{guile} en un entorno donde están disponibles Guile y
Guile-SDL.

Fíjese que este ejemplo solicita implícitamente la salida predeterminada de
@code{guile} y @code{guile-sdl}, pero es posible solicitar una salida
específica---por ejemplo, @code{glib:bin} solicita la salida @code{bin} de
@code{glib} (@pxref{Paquetes con múltiples salidas}).

Esta opción puede componerse con el comportamiento predeterminado de
@command{guix environment}. Los paquetes que aparecen antes de
@option{--ad-hoc} se interpretan como paquetes cuyas dependencias se
añadirán al entorno, el comportamiento predefinido. Los paquetes que
aparecen después se interpretan como paquetes a añadir directamente al
entorno.

@item --profile=@var{perfil}
@itemx -p @var{perfil}
Create an environment containing the packages installed in @var{profile}.
Use @command{guix package} (@pxref{Invocación de guix package}) to create and
manage profiles.

@item --pure
Olvida las variables de entorno existentes cuando se construye un nuevo
entorno, excepto aquellas especificadas con @option{--preserve} (véase más
adelante). Esto tiene el efecto de crear un entorno en el que las rutas de
búsqueda únicamente contienen las entradas del paquete.

@item --preserve=@var{regexp}
@itemx -E @var{regexp}
Cuando se usa junto a @option{--pure}, preserva las variables de entorno que
corresponden con @var{regexp}---en otras palabras, las pone en una lista de
variables de entorno que deben preservarse. Esta opción puede repetirse
varias veces.

@example
guix environment --pure --preserve=^SLURM --ad-hoc openmpi @dots{} \
  -- mpirun @dots{}
@end example

Este ejemplo ejecuta @command{mpirun} en un contexto donde las únicas
variables de entorno definidas son @env{PATH}, variables de entorno cuyo
nombre empiece con @samp{SLURM}, así como las variables ``preciosas''
habituales (@env{HOME}, @env{USER}, etc.).

@item --search-paths
Muestra las definiciones de variables de entorno que componen el entorno.

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta construir para @var{sistema}---por ejemplo, @code{i686-linux}.

@item --container
@itemx -C
@cindex container
Ejecuta la @var{orden} en un contenedor aislado. El directorio actual fuera
del contenedor es asociado al interior del contenedor. Adicionalmente, a
menos que se fuerce con @option{--user}, un directorio de prueba de la
usuaria se crea de forma que coincida con el directorio actual de la
usuaria, y @file{/etc/passwd} se configura adecuadamente.

El proceso lanzado se ejecuta como el usuario actual fuera del
contenedor. Dentro del contenedor, tiene el mismo UID y GID que el usuario
actual, a menos que se proporcione @option{--user} (véase más adelante).

@item --network
@itemx -N
Para contenedores, comparte el espacio de nombres de red con el sistema
anfitrión. Los contenedores creados sin esta opción únicamente tienen acceso
a la red local.

@item --link-profile
@itemx -P
Para contenedores, enlaza el perfil del entorno a @file{~/.guix-profile}
dentro del contenedor y asigna ese valor a @code{GUIX_ENVIRONMENT}. Es
equivalente a que @file{~/.guix-profile} sea un enlace al perfil real dentro
del contenedor. El enlace fallará e interrumpirá el entorno si el directorio
ya existe, lo cual será probablemente el caso si @command{guix environment}
se invocó en el directorio de la usuaria.

Determinados paquetes se configuran para buscar en @file{~/.guix-profile}
archivos de configuración y datos;@footnote{Por ejemplo, el paquete
@code{fontconfig} inspecciona @file{~/.guix-profile/share/fonts} en busca de
nuevas tipografías.} @option{--link-profile} permite a estos programas
operar de la manera esperada dentro del entorno.

@item --user=@var{usuaria}
@itemx -u @var{usuaria}
Para contenedores, usa el nombre de usuaria @var{usuaria} en vez de la
actual. La entrada generada en @file{/etc/passwd} dentro del contenedor
contendrá el nombre @var{usuaria}; su directorio será
@file{/home/@var{usuaria}} y ningún dato GECOS de la usuaria se copiará. Más
aún, el UID y GID dentro del contenedor son 1000. @var{usuaria} no debe
existir en el sistema.

Adicionalmente, cualquier ruta compartida o expuesta (véanse
@option{--share} y @option{--expose} respectivamente) cuyo destino esté
dentro de la carpeta actual de la usuaria será reasociada en relación a
@file{/home/@var{usuaria}}; esto incluye la relación automática del
directorio de trabajo actual.

@example
# expondrá las rutas /home/foo/ddt, /home/foo/prueba y /home/foo/objetivo
cd $HOME/ddt
guix environment --container --user=foo \
     --expose=$HOME/prueba \
     --expose=/tmp/objetivo=$HOME/objetivo
@end example

Mientras esto limita el escape de la identidad de la usuaria a través de las
rutas de sus directorios y cada uno de los campos de usuaria, esto es
únicamente un componente útil de una solución de privacidad/anonimato más
amplia---no una solución completa.

@item --no-cwd
El comportamiento predeterminado con contenedores es compartir el directorio
de trabajo actual con el contenedor aislado e inmediatamente cambiar a dicho
directorio dentro del contenedor. Si no se desea este comportamiento,
@option{--no-cwd} indica que el directorio actual @emph{no} se compartirá
automáticamente y, en vez de cambiar a dicho directorio, se cambiará al
directorio de la usuaria dentro del contenedor. Véase también
@option{--user}.

@item --expose=@var{fuente}[=@var{destino}]
@itemx --share=@var{fuente}[=@var{destino}]
En contenedores, la @option{--expose} expone el sistema de archivos
@var{fuente} del sistema anfitrión como un sistema de archivos de
solo-lectura @var{destino} dentro del contenedor. @option{--share} de la
misma manera expone el sistema de archivos con posibilidad de escritura. Si
no se especifica @var{destino}, @var{fuente} se usa como el punto de montaje
en el contenedor.

El ejemplo a continuación lanza una sesión interactiva de Guile en un
contenedor donde el directorio principal de la usuaria es accesible en modo
solo-lectura a través del directorio @file{/intercambio}:

@example
guix environment --container --expose=$HOME=/intercambio --ad-hoc guile -- guile
@end example

@item --emulate-fhs
@item -F
For containers, emulate a Filesystem Hierarchy Standard (FHS)  configuration
within the container, see
@uref{https://refspecs.linuxfoundation.org/fhs.shtml, the official
specification}.  As Guix deviates from the FHS specification, this option
sets up the container to more closely mimic that of other GNU/Linux
distributions.  This is useful for reproducing other development
environments, testing, and using programs which expect the FHS specification
to be followed.  With this option, the container will include a version of
@code{glibc} which will read @code{/etc/ld.so.cache} within the container
for the shared library cache (contrary to @code{glibc} in regular Guix
usage) and set up the expected FHS directories: @code{/bin}, @code{/etc},
@code{/lib}, and @code{/usr} from the container's profile.

@end table

Además, @command{guix environment} acepta todas las opciones comunes de
construcción que permite @command{guix build} (@pxref{Opciones comunes de construcción})
así como las opciones de transformación de paquetes (@pxref{Opciones de transformación de paquetes}).

@node Invocación de guix pack
@section Invocación de @command{guix pack}

@cindex @command{guix pack}

De manera ocasional querrá dar software a gente que (¡todavía!) no tiene la
suerte de usar Guix. Usted les diría que ejecuten @command{guix package -i
@var{algo}}, pero eso no es posible en este caso. Aquí es donde viene
@command{guix pack}.

@quotation Nota
Si está buscando formas de intercambiar binarios entre máquinas que ya
ejecutan Guix, @pxref{Invocación de guix copy}, @ref{Invocación de guix publish}, y
@ref{Invocación de guix archive}.
@end quotation

@cindex pack
@cindex empaquetado
@cindex aplicación empaquetada
@cindex empaquetado de software
La orden @command{guix pack} crea un @dfn{paquete} reducido o
@dfn{empaquetado de software}: crea un archivador tar u otro tipo que
contiene los binarios del software en el que está interesada y todas sus
dependencias. El archivo resultante puede ser usado en una máquina que no
tiene Guix, y la gente puede ejecutar exactamente los mismos binarios que
usted tiene con Guix. El paquete en sí es creado de forma reproducible
bit-a-bit, para que cualquiera pueda verificar que realmente contiene los
resultados de construcción que pretende distribuir.

Por ejemplo, para crear un empaquetado que contenga Guile, Emacs, Geiser y
todas sus dependencias, puede ejecutar:

@example
$ guix pack guile emacs emacs-geiser
@dots{}
/gnu/store/@dots{}-pack.tar.gz
@end example

El resultado aquí es un archivador tar que contiene un directorio de
@file{/gnu/store} con todos los paquetes relevantes. El archivador
resultante contiene un @dfn{perfil} con los tres paquetes de interés; el
perfil es el mismo que se hubiera creado por @command{guix package -i}. Este
es el mecanismo usado para crear el propio archivador de binarios separado
de Guix (@pxref{Instalación binaria}).

Las usuarias de este empaquetad tendrán que ejecutar
@file{/gnu/store/@dots{}-profile/bin/guile} para ejecutar guile, lo que
puede resultar inconveniente. Para evitarlo, puede crear, digamos, un enlace
simbólico @file{/opt/gnu/bin} al perfil: 

@example
guix pack -S /opt/gnu/bin=bin guile emacs emacs-geiser
@end example

@noindent
De este modo, las usuarias pueden escribir alegremente
@file{/opt/gnu/bin/guile} y disfrutar.

@cindex binarios reposicionables, con @command{guix pack}
¿Qué pasa se la receptora de su paquete no tiene privilegios de root en su
máquina y por lo tanto no puede desempaquetarlo en la raíz del sistema de
archivos? En ese caso, lo que usted desea es usar la opción
@option{--relocatable} (véase a continuación). Esta opción produce
@dfn{binarios reposicionables}, significando que pueden ser colocados en
cualquier lugar de la jerarquía del sistema de archivos: en el ejemplo
anterior, las usuarias pueden desempaquetar el archivador en su directorio
de usuaria y ejecutar directamente @file{./opt/gnu/bin/guile}.

@cindex Docker, construir una imagen con guix pack
De manera alternativa, puede producir un empaquetado en el formato de imagen
Docker usando la siguiente orden:

@example
guix pack -f docker -S /bin=bin guile guile-readline
@end example

@noindent
El resultado es un archivador ``tar'' que puede ser proporcionado a la orden
@command{docker load}, seguida de @code{docker run}:

@example
docker load < @var{archivo}
docker run -ti guile-guile-readline /bin/guile
@end example

@noindent
donde @var{archivo} es la imagen devuelta por @var{guix pack}, y
@code{guile-guile-readline} es la ``etiqueta de imagen''. Véase la
@uref{https://docs.docker.com/engine/reference/commandline/load/,
documentación de Docker} para más información.

@cindex Singularity, construir una imagen con guix pack
@cindex SquashFS, construir una imagen con guix pack
Otra opción más es producir una imagen SquashFS con la siguiente orden:

@example
guix pack -f squashfs bash guile emacs emacs-geiser
@end example

@noindent
El resultado es una imagen de sistema de archivos SquashFS que puede ser o
bien montada, o bien usada directamente como una imagen contenedora de
sistemas de archivos con el @uref{https://www.sylabs.io/docs/, entorno de
ejecución de contenedores Singularity}, usando órdenes como
@command{singularity shell} o @command{singularity exec}.

Varias opciones de la línea de órdenes le permiten personalizar su
empaquetado:

@table @code
@item --format=@var{formato}
@itemx -f @var{formato}
Produce un empaquetado en el @var{formato} específico.

Los formatos disponibles son:

@table @code
@item tarball
Es el formato predeterminado. Produce un archivador que contiene todos los
binarios y enlaces simbólicos especificados.

@item docker
Produce un archivador que sigue la
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
especificación de imágenes Docker}. El ``nombre de repositorio'' como
aparece en la salida de la orden @command{docker images} se calcula a partir
de los nombres de paquete proporcionados en la línea de órdenes o en el
archivo de manifiesto.

@item squashfs
Produce una imagen SquashFS que contiene todos los binarios y enlaces
simbólicos especificados, así como puntos de montaje vacíos para sistemas de
archivos virtuales como procfs.

@quotation Nota
Singularity @emph{necesita} que proporcione @file{/bin/sh} en la imagen. Por
esta razón, @command{guix pack -f squashfs} siempre implica @code{-S
/bin=bin}. Por tanto, su invocación de @command{guix pack} debe siempre
comenzar de manera similar a esta:

@example
guix pack -f squashfs bash @dots{}
@end example

Si se olvida del paquete @code{bash} (o similar), @command{singularity run}
y @command{singularity exec} fallarán con el mensaje ``no existe el archivo
o directorio'', lo que no sirve de ayuda.
@end quotation

@item deb
This produces a Debian archive (a package with the @samp{.deb} file
extension) containing all the specified binaries and symbolic links, that
can be installed on top of any dpkg-based GNU(/Linux) distribution.
Advanced options can be revealed via the @option{--help-deb-format} option.
They allow embedding control files for more fine-grained control, such as
activating specific triggers or providing a maintainer configure script to
run arbitrary setup code upon installation.

@example
guix pack -f deb -C xz -S /usr/bin/hello=bin/hello hello
@end example

@quotation Nota
Because archives produced with @command{guix pack} contain a collection of
store items and because each @command{dpkg} package must not have
conflicting files, in practice that means you likely won't be able to
install more than one such archive on a given system.
@end quotation

@quotation Aviso
@command{dpkg} will assume ownership of any files contained in the pack that
it does @emph{not} know about.  It is unwise to install Guix-produced
@samp{.deb} files on a system where @file{/gnu/store} is shared by other
software, such as a Guix installation or other, non-deb packs.
@end quotation

@end table

@cindex binarios reposicionables
@item --relocatable
@itemx -R
Produce @dfn{binarios reposicionables}---es decir, binarios que se pueden
encontrar en cualquier lugar de la jerarquía del sistema de archivos, y
ejecutarse desde allí.

Cuando se proporciona una vez la opción, los binarios resultantes necesitan
la implementación de @dfn{espacios de nombres de usuaria} del núcleo Linux;
cuando se proporciona @emph{dos veces}@footnote{Este es un truco para
memorizarlo: @code{-RR}, que añade PRoot, puede pensarse como ``Realmente
Reposicionable''. Curioso, ¿no es cierto?}, los binarios reposicionables
usan otras técnicas si los espacios de nombres de usuaria no están
disponibles, y funcionan esencialmente en cualquier sitio---véase más
adelante las implicaciones.

Por ejemplo, si crea un empaquetado que contiene Bash con:

@example
guix pack -RR -S /mybin=bin bash
@end example

@noindent
...@: puede copiar ese empaquetado a una máquina que no tiene Guix, y desde
su directorio, como una usuaria normal, ejecutar:

@example
tar xf pack.tar.gz
./mibin/sh
@end example

@noindent
En ese shell, si escribe @code{ls /gnu/store}, notará que @file{/gnu/store}
muestra y contiene todas las dependencias de @code{bash}, ¡incluso cuando la
máquina no tiene el directorio @file{/gnu/store}! Esto es probablemente el
modo más simple de desplegar software construido en Guix en una máquina
no-Guix.

@quotation Nota
No obstante hay un punto a tener en cuenta: esta técnica descansa en la
característica de @dfn{espacios de nombres de usuaria} del núcleo Linux, la
cual permite a usuarias no privilegiadas montar o cambiar la raíz. Versiones
antiguas de Linux no los implementan, y algunas distribuciones GNU/Linux los
desactivan.

Para producir binarios reposicionables que funcionen incluso en ausencia de
espacios de nombre de usuaria, proporcione @option{--relocatable} o
@option{-R} @emph{dos veces}. En ese caso, los binarios intentarán el uso de
espacios de nombres de usuaria y usarán otro @dfn{motor de ejecución} si los
espacios de nombres no están disponibles. Existe implementación para
siguientes motores de ejecución:

@table @code
@item default
Intenta usar espacios de nombres de usuaria y usa PRoot en caso de no estar
disponibles (véase a continuación).

@item performance
Intenta usar espacios de nombres de usuaria y usa Fakechroot en caso de no
estar disponibles (véase a continuación).

@item userns
Usa espacios de nombres de usuaria o aborta el programa si no están
disponibles.

@item proot
Ejecución a través de PRoot.  El programa @uref{https://proot-me.github.io/,
PRoot} proporciona el soporte necesario para la virtualización del sistema
de archivos. Lo consigue mediante el uso de la llamada al sistema
@code{ptrace} en el programa en ejecución. Esta aproximación tiene la
ventaja de funcionar sin soporte especial en el núcleo, pero incurre en una
sobrecarga en el tiempo de ejecución cada vez que se realiza una llamada al
sistema.

@item fakechroot
Ejecución a través de Fakechroot.
@uref{https://github.com/dex4er/fakechroot/, Fakechroot} virtualiza los
accesos al sistema de archivos interceptando las llamadas a las funciones de
la biblioteca de C como @code{open}, @code{stat}, @code{exec}, etcétera. Al
contrario que PRoot, el proceso se somete únicamente a una pequeña
sobrecarga. No obstante, no siempre funciona: algunos accesos realizados
dentro de la biblioteca de C no se interceptan, ni tampoco los accesos al
sistema de archivos a través de llamadas al sistema directas, lo que puede
provocar un comportamiento impredecible.
@end table

@vindex GUIX_EXECUTION_ENGINE
Cuando ejecute un programa recubierto puede solicitar explícitamente uno de
los motores de ejecución enumerados previamente proporcionando el valor
adecuado a la variable de entorno @env{GUIX_EXECUTION_ENGINE}.
@end quotation

@cindex punto de entrada, para imágenes de Docker
@item --entry-point=@var{orden}
Usa @var{orden} como el @dfn{punto de entrada} del empaquetado resultante,
si el formato de empaquetado lo permite---actualmente @code{docker} y
@code{squashfs} (Singularity) lo permiten. @var{orden} debe ser una ruta
relativa al perfil contenido en el empaquetado.

El punto de entrada especifica la orden que herramientas como @code{docker
run} o @code{singularity run} arrancan de manera automática de forma
predeterminada. Por ejemplo, puede ejecutar:

@example
guix pack -f docker --entry-point=bin/guile guile
@end example

El empaquetado resultante puede cargarse fácilmente y @code{docker run} sin
parámetros adicionales lanzará @code{bin/guile}:

@example
docker load -i pack.tar.gz
docker run @var{image-id}
@end example

@item --expression=@var{expr}
@itemx -e @var{expr}
Considera el paquete al que evalúa @var{expr}

Su propósito es idéntico a la opción del mismo nombre en @command{guix
build} (@pxref{Opciones de construcción adicionales, @option{--expression} en
@command{guix build}}).

@anchor{pack-manifest}
@item --manifest=@var{archivo}
@itemx -m @var{archivo}
Usa los paquetes contenidos en el objeto manifest devuelto por el código
Scheme en @var{archivo}. Esta opción puede repetirse varias veces, en cuyo
caso los manifiestos se concatenan.

Esto tiene un propósito similar al de la opción del mismo nombre en
@command{guix package} (@pxref{profile-manifest, @option{--manifest}}) y usa
los mismos archivos de manifiesto. Esto le permite definir una colección de
paquetes una vez y usarla tanto para crear perfiles como para crear archivos
en máquinas que no tienen instalado Guix. Fíjese que puede especificar
@emph{o bien} un archivo de manifiesto @emph{o bien} una lista de paquetes,
pero no ambas.

@xref{Writing Manifests}, for information on how to write a manifest.
@xref{shell-export-manifest, @command{guix shell --export-manifest}}, for
information on how to ``convert'' command-line options into a manifest.

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta construir paquetes para @var{sistema}---por ejemplo,
@code{x86_64-linux}---en vez del tipo de sistema de la máquina de
construcción.

@item --target=@var{tripleta}
@cindex compilación cruzada
Compilación cruzada para la @var{tripleta}, que debe ser una tripleta GNU
válida, cómo @code{"aarch64-linux-gnu"} (@pxref{Specifying target triplets,
GNU configuration triplets,, autoconf, Autoconf}).

@item --compression=@var{herramienta}
@itemx -C @var{herramienta}
Comprime el archivador resultante usando @var{herramienta}---un valor que
puede ser @code{gzip}, @code{zstd}, @code{bzip2}, @code{xz}, @code{lzip} o
@code{none} para no usar compresión.

@anchor{pack-symlink-option}
@item --symlink=@var{spec}
@itemx -S @var{spec}
Añade los enlaces simbólicos especificados por @var{spec} al
empaquetado. Esta opción puede aparecer varias veces.

La forma de @var{spec} es @code{@var{fuente}=@var{destino}}, donde
@var{fuente} es el enlace simbólico que será creado y @var{destino} es el
destino del enlace simbólico.

Por ejemplo, @code{-S /opt/gnu/bin=bin} crea un enlace simbólico
@file{/opt/gnu/bin} apuntando al subdirectorio @file{bin} del perfil.

@item --save-provenance
Almacena la información de procedencia para paquetes proporcionados en la
línea de órdenes. La información de procedencia incluye la URL y revisión de
los canales en uso (@pxref{Canales}).

La información de procedencia se almacena en el archivo
@file{/gnu/store/@dots{}-profile/manifest} dentro del empaquetado, junto a
los metadatos habituales del paquete---el nombre y la versión de cada
paquete, sus entradas propagadas, etcétera. Es información útil para la
parte receptora del empaquetado, quien de ese modo conoce como se obtuvo
(supuestamente) dicho empaquetado.

Esta opción no se usa de manera predeterminada debido a que, como las marcas
de tiempo, la información de procedencia no aportan nada al proceso de
construcción. En otras palabras, hay una infinidad de URL de canales e
identificadores de revisiones que pueden llevar al mismo
empaquetado. Almacenar estos metadatos ``silenciosos'' en la salida puede
potencialmente romper la propiedad de reproducibilidad bit a bit entre
fuentes y binarios.

@item --root=@var{archivo}
@itemx -r @var{archivo}
@cindex raíces del recolector de basura, para empaquetados
Hace que @var{archivo} sea un enlace simbólico al empaquetado resultante, y
lo registra como una raíz del recolector de basura.

@item --localstatedir
@itemx --profile-name=@var{nombre}
Incluye el ``directorio de estado local'', @file{/var/guix}, en el
empaquetado resultante, y notablemente el perfil
@file{/var/guix/profiles/per-user/root/@var{nombre}}---por defecto
@var{nombre} es @code{guix-profile}, que corresponde con
@file{~root/.guix-profile}.

@file{/var/guix} contiene la base de datos del almacén (@pxref{El almacén})
así como las raíces del recolector de basura (@pxref{Invocación de guix gc}). Proporcionarlo junto al empaquetado significa que el almacén está
``completo'' y Guix puede trabajar con él; no proporcionarlo significa que
el almacén está ``muerto'': no se pueden añadir o borrar nuevos elementos
después de la extracción del empaquetado.

Un caso de uso para esto es el archivador tar autocontenido de binarios de
Guix (@pxref{Instalación binaria}).

@item --derivation
@itemx -d
Imprime el nombre de la derivación que construye el empaquetado.

@item --bootstrap
Usa los binarios del lanzamiento para construir el empaquetado. Esta opción
es útil únicamente a las desarrolladoras de Guix.
@end table

Además, @command{guix pack} acepta todas las opciones comunes de
construcción (@pxref{Opciones comunes de construcción}) y todas las opciones de
transformación de paquetes (@pxref{Opciones de transformación de paquetes}).


@node La cadena de herramientas de GCC
@section La cadena de herramientas de GCC

@cindex GCC
@cindex ld-wrapper
@cindex recubrimiento del enlazador
@cindex cadena de herramientas de desarrollo, para C
@cindex cadena de herramientas de desarrollo, para Fortran

Si necesita una cadena de herramientas de desarrollo completa para compilar
y enlazar código fuente C o C++, use el paquete @code{gcc-toolchain}. Este
paquete proporciona una cadena de herramientas GCC para desarrollo C/C++,
incluyendo el propio GCC, la biblioteca de C GNU (cabeceras y binarios, más
símbolos de depuración de la salida @code{debug}), Binutils y un
recubrimiento del enlazador.

El propósito del recubrimiento es inspeccionar las opciones @code{-L} y
@code{-l} proporcionadas al enlazador, y los correspondientes parámetros
@code{-rpath}, y llamar al enlazador real con este nuevo conjunto de
parámetros. Puede instruir al recubrimiento para rechazar el enlace contra
bibliotecas que no se encuentren en el almacén proporcionando el valor
@code{no} a la variable de entorno @env{GUIX_LD_WRAPPER_ALLOW_IMPURITIES}.

El paquete @code{gfortran-toolchain} proporciona una cadena de herramientas
de desarrollo completa de GCC para desarrollo en Fortran. Para otros
lenguajes por favor use @samp{guix search gcc toolchain}
(@pxref{guix-search,, Invoking guix package}).


@node Invocación de guix git authenticate
@section Invocación de @command{guix git authenticate}

@cindex @command{guix git authenticate}

La orden @command{guix git authenticate} verifica una revisión de Git
siguiendo las mismas reglas que con los canales
(@pxref{channel-authentication, verificación de canales}). Es decir,
empezando en una revisión dada, se asegura que todas las revisiones
posteriores están firmadas por una clave OpenPGP cuya huella aparece en el
archivo @file{.guix-authorizations} de su revisión o revisiones antecesoras.

Encontrará útil esta orden si mantiene un canal. Pero de hecho, este sistema
de verificación es útil en un contexto más amplio, por lo que quizá quiera
usarlo para repositorios de Git que no estén relacionados con Guix.

La sintaxis general es:

@example
guix git authenticate @var{revisión} @var{firma} [@var{opciones}@dots{}]
@end example

De manera predeterminada esta orden verifica la copia de trabajo de Git en
el directorio actual; no muestra nada y termina con un código de salida cero
en caso satisfactorio y con un valor distinto a cero en caso de
fallo. @var{revisión} denota la primera revisión a partir de la cual la
verificación tiene lugar, y @var{firma} es la huella de OpenPGP de la clave
pública usada para firmar @var{revisión}. Juntas forman la ``presentación
del canal'' (@pxref{channel-authentication, presentación del canal}). Las
siguientes opciones le permiten controlar con más detalle el proceso.

@table @code
@item --repository=@var{directorio}
@itemx -r @var{directorio}
Usa el repositorio Git en @var{directorio} en vez del directorio actual.

@item --keyring=@var{referencia}
@itemx -k @var{referencia}
Carga el anillo de claves desde @var{referencia}, la rama de referencia como
por ejemplo @code{origin/keyring} o @code{mi-anillo-de-claves}. La rama debe
contener las claves públicas de OpenPGP en archivos @file{.key}, binarios o
con ``armadura ASCII'.  De manera predeterminada el anillo de claves se
carga de la rama con nombre @code{keyring}.

@item --stats
Muestra las estadísticas de firmas de revisiones tras finalizar.

@item --cache-key=@var{clave}
Las revisiones verificadas previamente se almacenan en un archivo bajo
@file{~/.cache/guix/authentication}. Esta opción fuerza el almacenamiento en
el archivo @var{clave} de dicho directorio.

@item --historical-authorizations=@var{archivo}
De manera predeterminada, cualquier revisión cuyo antecesor o antecesores
carezcan del archivo @file{.guix-authorizations} no se considera
auténtica. En contraste, esta opción considera las autorizaciones en
@var{archivo} para cualquier revisión que carezca de
@file{.guix-authorizations}. El formato de @var{archivo} es el mismo que el
de @file{.guix-authorizations} (@pxref{channel-authorizations, formato de
@file{.guix-authorizations}}).
@end table


@c *********************************************************************
@node Interfaz programática
@chapter Interfaz programática

GNU Guix proporciona viarias interfaces programáticas Scheme (APIs) para
definir, construir y consultar paquetes. La primera interfaz permite a las
usuarias escribir definiciones de paquetes a alto nivel. Estas definiciones
referencian conceptos familiares de empaquetamiento, como el nombre y la
versión de un paquete, su sistema de construcción y sus dependencias. Estas
definiciones se pueden convertir en acciones concretas de construcción.

Las acciones de construcción son realizadas por el daemon Guix, en
delegación de las usuarias. En una configuración estándar, el daemon tiene
acceso de escritura al almacén---el directorio @file{/gnu/store}---mientras
que las usuarias no. En la configuración recomendada el daemon también
realiza las construcciones en chroots, bajo usuarias específicas de
construcción, para minimizar la interferencia con el resto del sistema.

@cindex derivation
Las APIs de nivel más bajo están disponibles para interactuar con el daemon
y el almacén. Para instruir al daemon para realizar una acción de
construcción, las usuarias realmente proporcionan una @dfn{derivación}. Una
derivación es una representación de bajo nivel de las acciones de
construcción a tomar, y el entorno en el que deberían suceder---las
derivaciones son a las definiciones de paquetes lo que es el ensamblador a
los programas en C. El término ``derivación'' viene del hecho de que los
resultados de la construcción @emph{derivan} de ellas.

Este capítulo describe todas estas APIs en orden, empezando por las
definiciones de alto nivel de paquetes.

@menu
* Módulos de paquetes::     Paquetes bajo el punto de vista del 
                               programador.
* Definición de paquetes::  Definir nuevos paquetes.
* Definición de variantes de paquetes::  Personalización de paquetes.
* Writing Manifests::        The bill of materials of your environment.
* Sistemas de construcción::  Especificar como se construyen los paquetes.
* Fases de construcción::   Fases del proceso de construcción de un 
                               paquete.
* Utilidades de construcción::  Herramientas para sus definiciones de 
                                   paquete y más.
* Search Paths::             Declaring search path environment variables.
* El almacén::              Manipular el almacén de paquetes.
* Derivaciones::             Interfaz de bajo nivel de las derivaciones de 
                               los paquetes.
* La mónada del almacén::  Interfaz puramente funcional del almacén.
* Expresiones-G::            Manipular expresiones de construcción.
* Invocación de guix repl::  Programación de Guix en Guile
* Using Guix Interactively::  Fine-grain interaction at the REPL.
@end menu

@node Módulos de paquetes
@section Módulos de paquetes

Desde un punto de vista programático, las definiciones de paquetes de la
distribución GNU se proporcionan por módulos Guile en el espacio de nombres
@code{(gnu packages @dots{})}@footnote{Fíjese que los paquetes bajo el
espacio de nombres de módulo @code{(gnu packages @dots{})} no son
necesariamente ``paquetes GNU''. Este esquema de nombrado de módulos sigue
la convención habitual de Guile para el nombrado de módulos: @code{gnu}
significa que estos módulos se distribuyen como parte del sistema GNU, y
@code{packages} identifica módulos que definen paquetes.} (@pxref{Módulos,
Guile modules,, guile, GNU Guile Reference Manual}). Por ejemplo, el módulo
@code{(gnu packages emacs)} exporta una variable con nombre @code{emacs},
que está asociada a un objeto @code{<package>} (@pxref{Definición de paquetes}).

El espacio de nombres de módulos @code{(gnu packages @dots{})} se recorre
automáticamente en busca de paquetes en las herramientas de línea de
ordenes. Por ejemplo, cuando se ejecuta @code{guix install emacs}, todos los
módulos @code{(gnu packages @dots{})} son procesados hasta encontrar uno que
exporte un objeto de paquete cuyo nombre sea @code{emacs}. Esta búsqueda de
paquetes se implementa en el módulo @code{(gnu packages)}.

@cindex personalización, de paquetes
@cindex ruta de búsqueda de módulos de paquetes
Las usuarias pueden almacenar definiciones de paquetes en módulos con
nombres diferentes---por ejemplo, @code{(mis-paquetes
emacs)}@footnote{Fíjese que el nombre de archivo y el nombre de módulo deben
coincidir. Por ejemplo, el módulo @code{(mis-paquetes emacs)} debe
almacenarse en el archivo @file{mis-paquetes/emacs.scm} en relación con la
ruta de carga especificada con @option{--load-path} o
@env{GUIX_PACKAGE_PATH}. @xref{Modules and the File System,,, guile, GNU
Guile Reference Manual}, para obtener detalles.}. Existen dos maneras de
hacer visibles estas definiciones de paquetes a las interfaces de usuaria:

@enumerate
@item
Mediante la adición del directorio que contiene sus módulos de paquetes a la
ruta de búsqueda con la opción @code{-L} de @command{guix package} y otras
órdenes (@pxref{Opciones comunes de construcción}), o usando la variable de entorno
@env{GUIX_PACKAGE_PATH} descrita a continuación.

@item
Mediante la definición de un @dfn{canal} y la configuración de @command{guix
pull} de manera que se actualice desde él. Un canal es esencialmente un
repositorio Git que contiene módulos de paquetes. @xref{Canales}, para más
información sobre cómo definir y usar canales.
@end enumerate

@env{GUIX_PACKAGE_PATH} funciona de forma similar a otras variables de rutas
de búsqueda:

@defvr {Variable de entorno} GUIX_PACKAGE_PATH
Es una lista separada por dos puntos de directorios en los que se buscarán
módulos de paquetes adicionales. Los directorios enumerados en esta variable
tienen preferencia sobre los propios módulos de la distribución.
@end defvr

La distribución es @dfn{auto-contenida} y completamente @dfn{basada en el
lanzamiento inicial}: cada paquete se construye basado únicamente en otros
paquetes de la distribución. La raíz de este grafo de dependencias es un
pequeño conjunto de @dfn{binarios del lanzamiento inicial}, proporcionados
por el módulo @code{(gnu packages bootstrap)}. Para más información sobre el
lanzamiento inicial, @pxref{Lanzamiento inicial}.

@node Definición de paquetes
@section Definición de paquetes

La interfaz de alto nivel de las definiciones de paquetes está implementada
en los módulos @code{(guix packages)} y @code{(guix build-system)}. Como un
ejemplo, la definición de paquete, o @dfn{receta}, para el paquete GNU Hello
es como sigue:

@lisp
(define-module (gnu packages hello)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix build-system gnu)
  #:use-module (guix licenses)
  #:use-module (gnu packages gawk))

(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)
    (arguments '(#:configure-flags '("--enable-silent-rules")))
    (inputs (list gawk))
    (synopsis "Hello, GNU world: An example GNU package")
    (description "Guess what GNU Hello prints!")
    (home-page "https://www.gnu.org/software/hello/")
    (license gpl3+)))
@end lisp

@noindent
Sin ser una experta en Scheme---pero conociendo un poco de inglés---, la
lectora puede haber supuesto el significado de varios campos aquí. Esta
expresión asocia la variable @code{hello} al objeto @code{<package>}, que
esencialmente es un registro (@pxref{SRFI-9, Scheme records,, guile, GNU
Guile Reference Manual}). Este objeto de paquete puede ser inspeccionado
usando los procedimientos encontrados en el módulo @code{(guix packages)};
por ejemplo, @code{(package-name hello)}
devuelve---¡sorpresa!---@code{"hello"}.

Con suerte, puede que sea capaz de importar parte o toda la definición del
paquete de su interés de otro repositorio, usando la orden @code{guix
import} (@pxref{Invocación de guix import}).

En el ejemplo previo, @code{hello} se define en un módulo para ella,
@code{(gnu packages hello)}. Técnicamente, esto no es estrictamente
necesario, pero es conveniente hacerlo: todos los paquetes definidos en
módulos bajo @code{(gnu packages @dots{})} se reconocen automáticamente en
las herramientas de línea de órdenes (@pxref{Módulos de paquetes}).

Hay unos pocos puntos que merece la pena destacar de la definición de
paquete previa:

@itemize
@item
El campo @code{source} del paquete es un objeto @code{<origin>}
(@pxref{Referencia de origin}, para la referencia completa). Aquí se usa el
método @code{url-fetch} de @code{(guix download)}, lo que significa que la
fuente es un archivo a descargar por FTP o HTTP.

El prefijo @code{mirror://gnu} instruye a @code{url-fetch} para usar uno de
los espejos GNU definidos en @code{(guix download)}.

El campo @code{sha256} especifica el hash SHA256 esperado del archivo
descargado. Es obligatorio, y permite a Guix comprobar la integridad del
archivo. La forma @code{(base32 @dots{})} introduce la representación base32
del hash. Puede obtener esta información con @code{guix download}
(@pxref{Invocación de guix download}) y @code{guix hash} (@pxref{Invocación de guix hash}).

@cindex parches
Cuando sea necesario, la forma @code{origin} también puede tener un campo
@code{patches} con la lista de parches a ser aplicados, y un campo
@code{snippet} con una expresión Scheme para modificar el código fuente.

@item
@cindex Sistema de construcción GNU
El campo @code{build-system} especifica el procedimiento de construcción del
paquete (@pxref{Sistemas de construcción}). Aquí, @code{gnu-build-system} representa el
familiar sistema de construcción GNU, donde los paquetes pueden
configurarse, construirse e instalarse con la secuencia de ordenes habitual
@code{./configure && make && make check && make install}.

Cuando comience a empaquetar software no trivial puede que necesite
herramientas para manipular estas fases de construcción, manipular archivos,
etcétera. @xref{Utilidades de construcción} para obtener más información sobre este
tema.

@item
El campo @code{arguments} especifica las opciones para el sistema de
construcción (@pxref{Sistemas de construcción}). Aquí son interpretadas por
@code{gnu-build-system} como una petición de ejecutar @file{configure} con
la opción @option{--enable-silent-rules}.

@cindex quote
@cindex literales, inhibición de la evaluación
@findex '
@findex quote
@cindex acento grave (quasiquote)
@findex `
@findex quasiquote
@cindex coma (unquote)
@findex ,
@findex unquote
What about these quote (@code{'}) characters? They are Scheme syntax to
introduce a literal list; @code{'} is synonymous with @code{quote}.
Sometimes you'll also see @code{`} (a backquote, synonymous with
@code{quasiquote}) and @code{,} (a comma, synonymous with @code{unquote}).
@xref{Expression Syntax, quoting,, guile, GNU Guile Reference Manual}, for
details.  Here the value of the @code{arguments} field is a list of
arguments passed to the build system down the road, as with @code{apply}
(@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile Reference Manual}).

La secuencia almohadilla-dos puntos (@code{#:}) define una @dfn{palabra
clave} Scheme (@pxref{Keywords,,, guile, GNU Guile Reference Manual}), y
@code{#:configure-flags} es una palabra clave usada para pasar un parámetro
nominal al sistema de construcción (@pxref{Coding With Keywords,,, guile,
GNU Guile Reference Manual}).

@item
The @code{inputs} field specifies inputs to the build process---i.e.,
build-time or run-time dependencies of the package.  Here, we add an input,
a reference to the @code{gawk} variable; @code{gawk} is itself bound to a
@code{<package>} object.

Fíjese que no hace falta que GCC, Coreutils, Bash y otras herramientas
esenciales se especifiquen como entradas aquí. En vez de eso,
@code{gnu-build-system} se hace cargo de asegurar que están presentes
(@pxref{Sistemas de construcción}).

No obstante, cualquier otra dependencia debe ser especificada en el campo
@code{inputs}. Las dependencias no especificadas aquí simplemente no estarán
disponibles para el proceso de construcción, provocando posiblemente un
fallo de construcción.
@end itemize

@xref{Referencia de package}, para una descripción completa de los campos
posibles.

@quotation Más allá
@cindex Scheme programming language, getting started
Intimidated by the Scheme language or curious about it? The Cookbook has a
short section to get started that recaps some of the things shown above and
explains the fundamentals.  @xref{A Scheme Crash Course,,, guix-cookbook,
GNU Guix Cookbook}, for more information.
@end quotation

Una vez la definición de paquete esté en su lugar, el paquete puede ser
construido realmente usando la herramienta de línea de órdenes @code{guix
build} (@pxref{Invocación de guix build}), pudiendo resolver cualquier fallo de
construcción que encuentre (@pxref{Depuración de fallos de construcción}). Puede volver
a la definición del paquete fácilmente usando la orden @command{guix edit}
(@pxref{Invocación de guix edit}). @xref{Pautas de empaquetamiento}, para más
información sobre cómo probar definiciones de paquetes, y @ref{Invocación de guix lint}, para información sobre cómo comprobar la consistencia del estilo de
una definición.
@vindex GUIX_PACKAGE_PATH
Por último, @pxref{Canales}, para información sobre cómo extender la
distribución añadiendo sus propias definiciones de paquetes en un ``canal''.

Finalmente, la actualización de la definición con una nueva versión oficial
puede ser automatizada parcialmente por la orden @command{guix refresh}
(@pxref{Invocación de guix refresh}).

Tras el telón, una derivación correspondiente al objeto @code{<package>} se
calcula primero mediante el procedimiento @code{package-derivation}. Esta
derivación se almacena en un archivo @code{.drv} bajo @file{/gnu/store}. Las
acciones de construcción que prescribe pueden entonces llevarse a cabo
usando el procedimiento @code{build-derivations} (@pxref{El almacén}).

@deffn {Procedimiento Scheme} package-derivation @var{almacén} @var{paquete} [@var{sistema}]
Devuelve el objeto @code{<derivation>} del @var{paquete} pra el
@var{sistema} (@pxref{Derivaciones}).

@var{paquete} debe ser un objeto @code{<package>} válido, y @var{sistema}
debe ser una cadena que denote el tipo de sistema objetivo---por ejemplo,
@code{"x86_64-linux"} para un sistema GNU x86_64 basado en
Linux. @var{almacén} debe ser una conexión al daemon, que opera en el
almacén (@pxref{El almacén}).
@end deffn

@noindent
@cindex compilación cruzada
De manera similar, es posible calcular una derivación que construye de forma
cruzada un paquete para otro sistema:

@deffn {Procedimiento Scheme} package-cross-derivation @var{almacén} @
            @var{paquete} @var{plataforma} [@var{sistema}]
Devuelve el objeto @code{<derivation>} de @var{paquete} compilado de forma
cruzada desde @var{sistema} a @var{plataforma}.

@var{plataforma} debe ser una tripleta GNU válida que identifique al
hardware y el sistema operativo deseado, como por ejemplo
@code{"aarch64-linux-gnu"} (@pxref{Specifying Target Triplets,,, autoconf,
Autoconf}).
@end deffn

Una vez tenga sus definiciones de paquetes puede definir facilmente
@emph{variantes} de dichos paquetes. @xref{Definición de variantes de paquetes} para
obtener más información sobre ello.

@menu
* Referencia de package::    El tipo de datos de los paquetes.
* Referencia de origin::     El tipo de datos de orígenes.
@end menu


@node Referencia de package
@subsection Referencia de @code{package}

Esta sección resume todas las opciones disponibles en declaraciones
@code{package} (@pxref{Definición de paquetes}).

@deftp {Tipo de datos} package
Este es el tipo de datos que representa la receta de un paquete.

@table @asis
@item @code{name}
El nombre del paquete, como una cadena.

@item @code{version}
The version of the package, as a string.  @xref{Versiones numéricas}, for
guidelines.

@item @code{source}
Un objeto que determina cómo se debería obtener el código fuente del
paquete. La mayor parte del tiempo, es un objeto @code{origin}, que denota
un archivo obtenido de Internet (@pxref{Referencia de origin}). También puede
ser cualquier otro objeto ``tipo-archivo'' como @code{local-file}, que
denota un archivo del sistema local de archivos (@pxref{Expresiones-G,
@code{local-file}}).

@item @code{build-system}
El sistema de construcción que debe ser usado para construir el paquete
(@pxref{Sistemas de construcción}).

@item @code{arguments} (predeterminados: @code{'()})
The arguments that should be passed to the build system (@pxref{Sistemas de construcción}).  This is a list, typically containing sequential keyword-value
pairs, as in this example:

@lisp
(package
  (name "example")
  ;; several fields omitted
  (arguments
    (list #:tests? #f                     ;skip tests
          #:make-flags #~'("VERBOSE=1")   ;pass flags to 'make'
          #:configure-flags #~'("--enable-frobbing"))))
@end lisp

The exact set of supported keywords depends on the build system
(@pxref{Sistemas de construcción}), but you will find that almost all of them honor
@code{#:configure-flags}, @code{#:make-flags}, @code{#:tests?}, and
@code{#:phases}.  The @code{#:phases} keyword in particular lets you modify
the set of build phases for your package (@pxref{Fases de construcción}).

@item @code{inputs} (predeterminadas: @code{'()})
@itemx @code{native-inputs} (predeterminadas: @code{'()})
@itemx @code{propagated-inputs} (predeterminadas: @code{'()})
@cindex entradas, de paquetes
These fields list dependencies of the package.  Each element of these lists
is either a package, origin, or other ``file-like object''
(@pxref{Expresiones-G}); to specify the output of that file-like object that
should be used, pass a two-element list where the second element is the
output (@pxref{Paquetes con múltiples salidas}, for more on package
outputs).  For example, the list below specifies three inputs:

@lisp
(list libffi libunistring
      `(,glib "bin"))      ;the "bin" output of GLib
@end lisp

In the example above, the @code{"out"} output of @code{libffi} and
@code{libunistring} is used.

@quotation Compatibility Note
Until version 1.3.0, input lists were a list of tuples, where each tuple has
a label for the input (a string) as its first element, a package, origin, or
derivation as its second element, and optionally the name of the output
thereof that should be used, which defaults to @code{"out"}.  For example,
the list below is equivalent to the one above, but using the @dfn{old input
style}:

@lisp
;; Old input style (deprecated).
`(("libffi" ,libffi)
  ("libunistring" ,libunistring)
  ("glib:bin" ,glib "bin"))  ;the "bin" output of GLib
@end lisp

This style is now deprecated; it is still supported but support will be
removed in a future version.  It should not be used for new package
definitions.  @xref{Invoking guix style}, on how to migrate to the new
style.
@end quotation

@cindex compilación cruzada, dependencias de paquetes
La distinción entre @code{native-inputs} y @code{inputs} es necesaria cuando
se considera la compilación cruzada. Cuando se compila desde una
arquitectura distinta, las dependencias enumeradas en @code{inputs} son
construidas para la arquitectura @emph{objetivo}; de modo contrario, las
dependencias enumeradas en @code{native-inputs} se construyen para la
arquitectura de la máquina de @emph{construcción}.

@code{native-inputs} se usa típicamente para enumerar herramientas
necesarias en tiempo de construcción, pero no en tiempo de ejecución, como
Autoconf, Automake, pkg-config, Gettext o Bison. @command{guix lint} puede
informar de probables errores en este área (@pxref{Invocación de guix lint}).

@anchor{package-propagated-inputs}
Por último, @code{propagated-inputs} es similar a @code{inputs}, pero los
paquetes especificados se instalarán automáticamente a los perfiles
(@pxref{Características, el rol de los perfiles en Guix}) junto al paquete al que
pertenecen (@pxref{package-cmd-propagated-inputs, @command{guix package}},
para información sobre cómo @command{guix package} gestiona las entradas
propagadas).

Por ejemplo esto es necesario cuando se empaqueta una biblioteca C/C++ que
necesita cabeceras de otra biblioteca para compilar, o cuando un archivo
pkg-config se refiere a otro a través de su campo @code{Requires}.

Otro ejemplo donde @code{propagated-inputs} es útil es en lenguajes que
carecen de la facilidad de almacenar la ruta de búsqueda de tiempo de
ejecución de la misma manera que el campo @code{RUNPATH} de los archivos
ELF; esto incluye Guile, Python, Perl y más. Cuando se empaquetan
bibliotecas escritas en estos lenguajes, enumerar en
@code{propagated-inputs} en vez de en @code{inputs} las dependencias de
tiempo de ejecución permite asegurarse de encontrar el código de las
bibliotecas de las que dependan en tiempo de ejecución.

@item @code{outputs} (predeterminada: @code{'("out")})
La lista de nombres de salidas del paquete. @xref{Paquetes con múltiples salidas}, para usos típicos de salidas adicionales.

@item @code{native-search-paths} (predeterminadas: @code{'()})
@itemx @code{search-paths} (predeterminadas: @code{'()})
A list of @code{search-path-specification} objects describing search-path
environment variables honored by the package.  @xref{Search Paths}, for more
on search path specifications.

As for inputs, the distinction between @code{native-search-paths} and
@code{search-paths} only matters when cross-compiling.  In a
cross-compilation context, @code{native-search-paths} applies exclusively to
native inputs whereas @code{search-paths} applies only to host inputs.

Packages such as cross-compilers care about target inputs---for instance,
our (modified) GCC cross-compiler has @env{CROSS_C_INCLUDE_PATH} in
@code{search-paths}, which allows it to pick @file{.h} files for the target
system and @emph{not} those of native inputs.  For the majority of packages
though, only @code{native-search-paths} makes sense.

@item @code{replacement} (predeterminado: @code{1.0})
Esto debe ser o bien @code{#f} o bien un objeto package que será usado como
@dfn{reemplazo} para ete paquete. @xref{Actualizaciones de seguridad, injertos}, para
más detalles.

@item @code{synopsis}
Una descripción en una línea del paquete.

@item @code{description}
A more elaborate description of the package, as a string in Texinfo syntax.

@item @code{license}
@cindex licencia, de paquetes
La licencia del paquete; un valor de @code{(guix licenses)}, o una lista de
dichos valores.

@item @code{home-page}
La URL de la página principal del paquete, como una cadena.

@item @code{supported-systems} (predeterminados: @code{%supported-systems})
La lista de sistemas en los que se mantiene el paquete, como cadenas de la
forma @code{arquitectura-núcleo}, por ejemplo @code{"x86_64-linux"}.

@item @code{location} (predeterminada: la localización de los fuentes de la forma @code{package})
La localización de las fuentes del paquete. Es útil forzar su valor cuando
se hereda de otro paquete, en cuyo caso este campo no se corrige
automáticamente.
@end table
@end deftp

@deffn {Sintaxis Scheme} this-package
Cuando se usa en el @emph{ámbito léxico} de la definición de un paquete,
este identificador resuelve al paquete que se está definiendo.

El ejemplo previo muestra cómo añadir un paquete como su propia entrada
nativa cuando se compila de forma cruzada:

@lisp
(package
  (name "guile")
  ;; ...

  ;; When cross-compiled, Guile, for example, depends on
  ;; a native version of itself.  Add it here.
  (native-inputs (if (%current-target-system)
                     (list this-package)
                     '())))
@end lisp

Es un error hacer referencia a @code{this-package} fuera de la definición de
un paquete.
@end deffn

The following helper procedures are provided to help deal with package
inputs.

@deffn {Scheme Procedure} lookup-package-input @var{package} @var{name}
@deffnx {Scheme Procedure} lookup-package-native-input @var{package} @var{name}
@deffnx {Scheme Procedure} lookup-package-propagated-input @var{package} @var{name}
@deffnx {Scheme Procedure} lookup-package-direct-input @var{package} @var{name}
Look up @var{name} among @var{package}'s inputs (or native, propagated, or
direct inputs).  Return it if found, @code{#f} otherwise.

@var{name} is the name of a package depended on.  Here's how you might use
it:

@lisp
(use-modules (guix packages) (gnu packages base))

(lookup-package-direct-input coreutils "gmp")
@result{} #<package gmp@@6.2.1 @dots{}>
@end lisp

In this example we obtain the @code{gmp} package that is among the direct
inputs of @code{coreutils}.
@end deffn

@cindex development inputs, of a package
@cindex implicit inputs, of a package
Sometimes you will want to obtain the list of inputs needed to
@emph{develop} a package---all the inputs that are visible when the package
is compiled.  This is what the @code{package-development-inputs} procedure
returns.

@deffn {Scheme Procedure} package-development-inputs @var{package} @
   [@var{system}] [#:target #f] Return the list of inputs required by
@var{package} for development purposes on @var{system}.  When @var{target}
is true, return the inputs needed to cross-compile @var{package} from
@var{system} to @var{target}, where @var{target} is a triplet such as
@code{"aarch64-linux-gnu"}.

Note that the result includes both explicit inputs and implicit
inputs---inputs automatically added by the build system (@pxref{Sistemas de construcción}).  Let us take the @code{hello} package to illustrate that:

@lisp
(use-modules (gnu packages base) (guix packages))

hello
@result{} #<package hello@@2.10 gnu/packages/base.scm:79 7f585d4f6790>

(package-direct-inputs hello)
@result{} ()

(package-development-inputs hello)
@result{} (("source" @dots{}) ("tar" #<package tar@@1.32 @dots{}>) @dots{})
@end lisp

In this example, @code{package-direct-inputs} returns the empty list,
because @code{hello} has zero explicit dependencies.  Conversely,
@code{package-development-inputs} includes inputs implicitly added by
@code{gnu-build-system} that are required to build @code{hello}: tar, gzip,
GCC, libc, Bash, and more.  To visualize it, @command{guix graph hello}
would show you explicit inputs, whereas @command{guix graph -t bag hello}
would include implicit inputs (@pxref{Invocación de guix graph}).
@end deffn

Debido a que los paquetes son objetos Scheme normales que capturan un grafo
de dependencias completo y se asocian a procedimientos de construcción,
habitualmente es útil escribir procedimientos que toman un paquete y
devuelven una versión modificada de acuerdo a ciertos parámetros. A
continuación se muestran algunos ejemplos:

@cindex cadena de herramientas de construcción, selección para un paquete
@deffn {Procedimiento Scheme} package-with-c-toolchain @var{paquete} @var{cadena}
Devuelve una variación de @var{paquete} que usa @var{cadena} en vez de la
cadena de herramientas de construcción de C/C++ de GNU
predeterminada. @var{cadena} debe ser una lista de entradas (tuplas
etiqueta/paquete) que proporcionen una funcionalidad equivalente a la del
paquete @code{gcc-toolchain}.

El siguiente ejemplo devuelve una variación del paquete @code{hello} que se
ha construido con GCC@tie{}10.x y el resto de la cadena de herramientas de
construcción de GNU (Binutils y la biblioteca de C de GNU) en vez de la
cadena de construcción predeterminada:

@lisp
(let ((cadena (specification->package "gcc-toolchain@@10")))
  ;; El nombre de la entrada debe ser "toolchain".
  (package-with-c-toolchain hello `(("toolchain" ,cadena))))
@end lisp

La cadena de herramientas de construcción es parte de las @dfn{entradas
impícitas} de los paquetes---habitualmente no se enumera como parte de los
distintos campos de entrada (``inputs'') sino que el sistema de construcción
es quién la incorpora. Por lo tanto este procedimiento funciona cambiando el
sistema de construcción del @var{paquete} de modo que se incorpora
@var{cadena} en vez de los valores predeterminados. @ref{Sistemas de construcción} para
obtener más información sobre sistemas de construcción.
@end deffn

@node Referencia de origin
@subsection Referencia de @code{origin}

Esta sección documenta los @dfn{orígenes}.  Una declaración de origen
(@code{origin}) especifica datos que se deben ``producir''---descargandose,
habitualmente---y el hash de su contenido se conoce de antemano. Los
origenes se usan habitualmente para reprensentar el código fuente de los
paquetes (@pxref{Definición de paquetes}). Por esta razón la forma sintáctica
@code{origin} le permite declarar tanto parches para aplicar al código
fuente original como fragmentos de código que para su modificación.

@deftp {Tipo de datos} origin
Este es el tipo de datos que representa un origen de código fuente.

@table @asis
@item @code{uri}
Un objeto que contiene el URI de las fuentes. El tipo de objeto depende del
valor de @code{method} (véase a continuación). Por ejemplo, cuando se usa el
método @var{url-fetch} de @code{(guix download)}, los valores adecuados para
@code{uri} son: una cadena que contiene una URL, o una lista de cadenas.

@cindex derivaciones de salida fija, para descarga
@item @code{method}
A monadic procedure that handles the given URI@.  The procedure must accept
at least three arguments: the value of the @code{uri} field and the hash
algorithm and hash value specified by the @code{hash} field.  It must return
a store item or a derivation in the store monad (@pxref{La mónada del almacén});
most methods return a fixed-output derivation (@pxref{Derivaciones}).

Los métodos habitualmente usados incluyen @code{url-fetch}, que obtiene
datos a partir de una URL, y @code{git-fetch}, que obtiene datos de un
repositorio Git (véase a continuación).

@item @code{sha256}
Un vector de bytes que contiene el hash SHA-256 de las fuentes. Es
equivalente a proporcionar un objeto SHA256 @code{content-hash} en el campo
@code{hash} descrito a continuación.

@item @code{hash}
El objeto @code{content-hash} de las fuentes---véase a continuación cómo
usar @code{content-hash}.

Puede obtener esta información usando @code{guix download} (@pxref{Invocación de guix download}) o @code{guix hash} (@pxref{Invocación de guix hash}).

@item @code{file-name} (predeterminado: @code{#f})
El nombre de archivo bajo el que el código fuente se almacenará. Cuando este
es @code{#f}, un valor predeterminado sensato se usará en la mayor parte de
casos. En caso de que las fuentes se obtengan de una URL, el nombre de
archivo de la URL se usará. Para copias de trabajo de sistemas de control de
versiones, se recomienda proporcionar el nombre de archivo explícitamente ya
que el predeterminado no es muy descriptivo.

@item @code{patches} (predeterminados: @code{'()})
Una lista de nombres de archivos, orígenes u objetos tipo-archivo
(@pxref{Expresiones-G, objetos ``tipo-archivo''}) apuntando a parches que
deben ser aplicados a las fuentes.

La lista de parches debe ser incondicional. En particular, no puede depender
del valor de @code{%current-system} o @code{%current-target-system}.

@item @code{snippet} (predeterminado: @code{#f})
Una expresión-G (@pxref{Expresiones-G}) o expresión-S que se ejecutará en el
directorio de fuentes. Esta es una forma conveniente de modificar el
software, a veces más que un parche.

@item @code{patch-flags} (predeterminadas: @code{'("-p1")})
Una lista de opciones de línea de órdenes que deberían ser pasadas a la
orden @code{patch}.

@item @code{patch-inputs} (predeterminada: @code{#f})
Paquetes o derivaciones de entrada al proceso de aplicación de los
parches. Cuando es @code{#f}, se proporciona el conjunto habitual de
entradas necesarias para la aplicación de parches, como GNU@tie{}Patch.

@item @code{modules} (predeterminados: @code{'()})
Una lista de módulos Guile que debe ser cargada durante el proceso de
aplicación de parches y mientras se ejecuta el código del campo
@code{snippet}.

@item @code{patch-guile} (predeterminado: @code{#f})
El paquete Guile que debe ser usado durante la aplicación de parches. Cuando
es @code{#f} se usa un valor predeterminado.
@end table
@end deftp

@deftp {Tipo de datos} content-hash @var{valor} [@var{algoritmo}]
Construye un objeto del hash del contenido para el @var{algoritmo}
proporcionado, y con @var{valor} como su valor. Cuando se omite
@var{algoritmo} se asume que es @code{sha256}.

@var{valor} puede ser una cadena literal, en cuyo caso se decodifica en
base32, o un vector de bytes.

Las siguientes opciones equivalentes entre sí:

@lisp
(content-hash "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj")
(content-hash "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"
              sha256)
(content-hash (base32
               "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"))
(content-hash (base64 "kkb+RPaP7uyMZmu4eXPVkM4BN8yhRd8BTHLslb6f/Rc=")
              sha256)
@end lisp

Técnicamente, @code{content-hash} se implementa actualmente con un
macro. Realiza comprobaciones de seguridad en tiempo de expansión, cuando es
posible, como asegurarse de que @var{valor} tiene el tamaño adecuado para
@var{algoritmo}.
@end deftp

Como se ha visto previamente, la forma exacta en la que un origen hace
referencia a los datos se determina por su campo @code{method}. El módulo
@code{(guix download)} proporciona el método más común, @code{url-fetch},
descrito a continuación.

@deffn {Procedimiento Scheme} url-fetch @var{url} @var{algo-hash} @var{hash} @
           [nombre] [#:executable? #f]
Devuelve una derivación de salida fija que obtiene datos desde @var{url}
(una cadena o una lista de cadenas indicando URL alternativas), la cual se
espera que tenga el hash @var{hash} del tipo @var{algo-hash} (un
símbolo). De manera predeterminada el nombre de archivo es el identificador
final de la URL; de manera opcional se puede usar @var{nombre} para
especificar un nombre de archivo diferente. Cuando @var{executable?} es
verdadero se proporciona el permiso de ejecución al archivo descargado.

Cuando una de las URL comienza con @code{mirror://}, la parte de la máquina
se interpreta como el nombre de un esquema de espejos, obtenido de
@file{%mirror-file}.

De manera alternativa, cuando URL comienza con @code{file://}, devuelve el
nombre de archivo del almacén correspondiente.
@end deffn

De igual modo el módulo @code{(guix git-download)} define el método de
origen @code{git-fetch}, que descarga datos de un repositorio de control de
versiones Git, y el tipo de datos @code{git-reference}, que describe el
repositorio y la revisión que se debe obtener.

@deffn {Procedimiento Scheme} git-fetch @var{url} @var{algo-hash} @var{hash}
Devuelve una derivación de salida fija que obtiene @var{ref}, un objeto
@code{<git-reference>}. El hash recursivo de la salida se espera que tenga
el valor @var{hash} del tipo @var{algo-hash} (un símbolo). Se usa
@var{nombre} para el nombre de archivo, o un nombre genérico si su valor es
@code{#f}.
@end deffn

@deftp {Tipo de datos} git-reference
Este es el tipo de datos que representa una referencia de Git que debe
obtener el módulo @code{git-fetch}.

@table @asis
@item @code{url}
La URL del repositorio Git que debe clonarse.

@item @code{commit}
This string denotes either the commit to fetch (a hexadecimal string), or
the tag to fetch.  You can also use a ``short'' commit ID or a @command{git
describe} style identifier such as @code{v1.0.1-10-g58d7909c97}.

@item @code{recursive?} (predeterminado: @code{#f})
Este valor booleano indica si se obtienen los sub-modulos de Git de manera
recursiva.
@end table

El siguiente ejemplo representa la etiqueta @code{v2.10} del repositorio de
GNU@tie{}Hello:

@lisp
(git-reference
  (url "https://git.savannah.gnu.org/git/hello.git")
  (commit "v2.10"))
@end lisp

Es equivalente a la siguiente referencia, la cual nombra de manera explícita
la revisión:

@lisp
(git-reference
  (url "https://git.savannah.gnu.org/git/hello.git")
  (commit "dc7dc56a00e48fe6f231a58f6537139fe2908fb9"))
@end lisp
@end deftp

For Mercurial repositories, the module @code{(guix hg-download)} defines the
@code{hg-fetch} origin method and @code{hg-reference} data type for support
of the Mercurial version control system.

@deffn {Scheme Procedure} hg-fetch @var{ref} @var{hash-algo} @var{hash} @
           [name] Return a fixed-output derivation that fetches @var{ref}, a
@code{<hg-reference>} object.  The output is expected to have recursive hash
@var{hash} of type @var{hash-algo} (a symbol).  Use @var{name} as the file
name, or a generic name if @code{#false}.
@end deffn

@node Definición de variantes de paquetes
@section Definición de variantes de paquetes

@cindex personalización de paquetes
@cindex variantes de paquetes
One of the nice things with Guix is that, given a package definition, you
can easily @emph{derive} variants of that package---for a different upstream
version, with different dependencies, different compilation options, and so
on.  Some of these custom packages can be defined straight from the command
line (@pxref{Opciones de transformación de paquetes}).  This section describes how
to define package variants in code.  This can be useful in ``manifests''
(@pxref{Writing Manifests})  and in your own package collection
(@pxref{Creación de un canal}), among others!

@cindex herencia, para definiciones de paquetes
Como se ha mostrado previamente, los paquetes son objetos de primera clase
del lenguage Scheme. El módulo @code{(guix packages)} proporciona la forma
sintáctica @code{package} para definir nuevos objetos de paquetes
(@pxref{Referencia de package}).  La forma más fácil de definir una variante de
un paquete es usar la palabra clave @code{inherit} junto a
@code{package}. Esto le permite heredar de una definición de paquete y
modificar únicamente los campos que desee.

Por ejemplo, a partir de la variable @code{hello}, que contiene la
definición de la versión actual de GNU@tie{}Hello, podría definir de esta
forma una variante para la versión 2.2 (publicada 2006, ¡con solera!):

@lisp
(use-modules (gnu packages base))    ;para 'hello'

(define hello-2.2
  (package
    (inherit hello)
    (version "2.2")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/hello/hello-" version
                                  ".tar.gz"))
              (sha256
               (base32
                "0lappv4slgb5spyqbh6yl5r013zv72yqg2pcl30mginf3wdqd8k9"))))))
@end lisp

El ejemplo previo es equivalente a lo que la opción de transformación de
paquetes @option{--with-source} realiza. Esencialmente @code{hello-2.2}
preserva todos los campos de @code{hello}, excepto @code{version} y
@code{source}, los cuales se modifican. Tenca en cuenta que la variable
original @code{hello} todavía está disponible en el módulo @code{(gnu
packages base)} sin sufrir ningún cambio. Cuando define un paquete
personalizado como este realmente está @emph{añadiendo} una nueva definición
de paquete; la orignal sigue disponible.

De igual manera puede definir variantes con un conjunto de dependencias
distinto al del paquete original. Por ejemplo, el paquete @code{gdb}
predeterminado depende de @code{guile} pero, puesto que es una dependencia
opcional, podría definir una variante que elimina dicha dependencia de este
modo:

@lisp
(use-modules (gnu packages gdb))   ;for 'gdb'

(define gdb-sans-guile
  (package
    (inherit gdb)
    (inputs (modify-inputs (package-inputs gdb)
              (delete "guile")))))
@end lisp

The @code{modify-inputs} form above removes the @code{"guile"} package from
the @code{inputs} field of @code{gdb}.  The @code{modify-inputs} macro is a
helper that can prove useful anytime you want to remove, add, or replace
package inputs.

@deffn {Scheme Syntax} modify-inputs @var{inputs} @var{clauses}
Modify the given package inputs, as returned by @code{package-inputs} & co.,
according to the given clauses.  Each clause must have one of the following
forms:

@table @code
@item (delete @var{name}@dots{})
Delete from the inputs packages with the given @var{name}s (strings).

@item (prepend @var{package}@dots{})
Add @var{package}s to the front of the input list.

@item (append @var{package}@dots{})
Add @var{package}s to the end of the input list.
@end table

The example below removes the GMP and ACL inputs of Coreutils and adds
libcap to the front of the input list:

@lisp
(modify-inputs (package-inputs coreutils)
  (delete "gmp" "acl")
  (prepend libcap))
@end lisp

The example below replaces the @code{guile} package from the inputs of
@code{guile-redis} with @code{guile-2.2}:

@lisp
(modify-inputs (package-inputs guile-redis)
  (replace "guile" guile-2.2))
@end lisp

The last type of clause is @code{append}, to add inputs at the back of the
list.
@end deffn

En ciertos casos encontrará útil escribir funciones («procedimientos» en el
vocabulario de Scheme) que devuelven un paquete en base a ciertos
parámetros. Por ejemplo, considere la biblioteca @code{luasocket} para el
lenguaje de programación Lua. Se desea crear paquetes de @code{luasocket}
para las versiones mayores de Lua. Una forma de hacerlo es definir un
procedimiento que recibe un paquete Lua y devuelve un paquete
@code{luasocket} que depende de él:

@lisp
(define (make-lua-socket name lua)
  ;; Return a luasocket package built with LUA.
  (package
    (name name)
    (version "3.0")
    ;; several fields omitted
    (inputs (list lua))
    (synopsis "Socket library for Lua")))

(define-public lua5.1-socket
  (make-lua-socket "lua5.1-socket" lua-5.1))

(define-public lua5.2-socket
  (make-lua-socket "lua5.2-socket" lua-5.2))
@end lisp

En este ejemplo se han definido los paquetes @code{lua5.1-socket} y
@code{lua5.2-socket} llamando a @code{crea-lua-socket} con distintos
parámetros.  @xref{Procedures,,, guile, GNU Guile Reference Manual} para más
información sobre procedimientos. El hecho de disponer de definiciones
públicas de nivel superior de estos dos paquetes permite que se les haga
referencia desde la línea de órdenes (@pxref{Módulos de paquetes}).

@cindex transformación de paquetes
Estas son variantes muy simples. Para facilitar esta tarea, el módulo
@code{(guix transformations)} proporciona una interfaz de alto nivel que se
corresponde directamente con las opciones de transformación de paquetes más
sofisticadas (@pxref{Opciones de transformación de paquetes}):

@deffn {Procedimiento Scheme} options->transformation @var{opciones}
Devuelve un procedimiento que, cuando se le proporciona un objeto que
construir (paquete, derivación, etc.), aplica las transformaciones
especificadas en @var{opciones} y devuelve los objetos resultantes.
@var{opciones} debe ser una lista de pares símbolo/cadena como los
siguientes:

@lisp
((with-branch . "guile-gcrypt=master")
 (without-tests . "libgcrypt"))
@end lisp

Cada símbolo nombra una transformación y la cadena correspondiente es el
parámetro de dicha transformación.
@end deffn

Por ejemplo, un manifiesto equivalente a esta orden:

@example
guix build guix \
  --with-branch=guile-gcrypt=master \
  --with-debug-info=zlib
@end example

@noindent
... sería algo parecido a esto:

@lisp
(use-modules (guix transformations))

(define transforma
  ;; El procedimiento de transformación del paquete.
  (options->transformation
   '((with-branch . "guile-gcrypt=master")
     (with-debug-info . "zlib"))))

(packages->manifest
 (list (transforma (specification->package "guix"))))
@end lisp

@cindex reescritura de entradas
@cindex reescritura del grafo de dependencias
El procedimiento @code{options->transformation} es conveniente, pero quizá
no es tan flexible como pudiese desear. ¿Cómo se ha implementado? Es posible
que ya se haya percatado de que la mayoría de las opciones de transformación
de paquetes van más allá de los cambios superficiales mostrados en los
primeros ejemplos de esta sección: implican @dfn{reescritura de entradas},
lo que significa que el grafo de dependencias de un paquete se reescribe
sustituyendo entradas específicas por otras.

La reescritura del grafo de dependencias, con el propósito de reemplazar
paquetes del grafo, es implementada por el procedimiento
@code{package-input-rewriting} en @code{(guix packages)}.

@deffn {Procedimiento Scheme} package-input-rewriting @var{reemplazos} @
           [@var{nombre-reescrito}] [#:deep? #t]
Devuelve un procedimiento que, cuando se le pasa un paquete, reemplaza sus
dependencias directas e indirectas, incluyendo sus entradas implícitas
cuando @var{deep?} es verdadero, de acuerdo a
@var{reemplazos}. @var{reemplazos} es una lista de pares de paquetes; el
primer elemento de cada par es el paquete a reemplazar, el segundo es el
reemplazo.

Opcionalmente, @var{nombre-reescrito} es un procedimiento de un parámetro
que toma el nombre del paquete y devuelve su nuevo nombre tras la
reescritura.
@end deffn

@noindent
Considere este ejemplo:

@lisp
(define libressl-en-vez-de-openssl
  ;; Esto es un procedimiento para reemplazar OPENSSL
  ;; por LIBRESSL, recursivamente.
  (package-input-rewriting `((,openssl . ,libressl))))

(define git-con-libressl
  (libressl-en-vez-de-openssl git))
@end lisp

@noindent
Aquí primero definimos un procedimiento de reescritura que substituye
@var{openssl} por @var{libressl}. Una vez hecho esto, lo usamos para definir
una @dfn{variante} del paquete @var{git} que usa @var{libressl} en vez de
@var{openssl}. Esto es exactamente lo que hace la opción de línea de órdenes
@option{--with-input} (@pxref{Opciones de transformación de paquetes,
@option{--with-input}}).

La siguiente variante de @code{package-input-rewriting} puede encontrar
paquetes a reemplazar por su nombre en vez de por su identidad.

@deffn {Procedimiento Scheme} package-input-rewriting/spec @var{reemplazos} [#:deep? #t]
Devuelve un procedimiento que, proporcionado un paquete, realiza los
@var{reemplazos} proporcionados sobre todo el grafo del paquete, incluyendo
las entradas implícitas a menos que @var{deep?} sea falso. @var{reemplazos}
es una lista de pares de especificación y procedimiento; cada especificación
es una especificación de paquete como @code{"gcc"} o @code{"guile@@2"}, y
cada procedimiento toma un paquete que corresponda con la especificación y
devuelve un reemplazo para dicho paquete.
@end deffn

El ejemplo previo podría ser reescrito de esta forma:

@lisp
(define libressl-en-vez-de-openssl
  ;; Reemplaza todos los paquetes llamados "openssl" con LibreSSL.
  (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
@end lisp

La diferencia principal en este caso es que, esta vez, los paquetes se
buscan por su especificación y no por su identidad. En otras palabras,
cualquier paquete en el grafo que se llame @code{openssl} será reemplazado.

Un procedimiento más genérico para reescribir el grafo de dependencias de un
paquete es @code{package-mapping}: acepta cambios arbitrarios sobre nodos
del grafo.

@deffn {Scheme Procedure} package-mapping @var{proc} [@var{cortar?}] [#:deep? #f]
Devuelve un procedimiento que, dado un paquete, aplica @var{proc} a todos
los paquetes de los que depende y devuelve el paquete resultante. El
procedimiento para la recursión cuando @var{cortar?} devuelve verdadero para
un paquete dado. Cuando @var{deep?} tiene valor verdadero, @var{proc} se
aplica también a las entradas implícitas.
@end deffn

@node Writing Manifests
@section Writing Manifests

@cindex manifest
@cindex bill of materials (manifests)
@command{guix} commands let you specify package lists on the command line.
This is convenient, but as the command line becomes longer and less trivial,
it quickly becomes more convenient to have that package list in what we call
a @dfn{manifest}.  A manifest is some sort of a ``bill of materials'' that
defines a package set.  You would typically come up with a code snippet that
builds the manifest, store it in a file, say @file{manifest.scm}, and then
pass that file to the @option{-m} (or @option{--manifest}) option that many
@command{guix} commands support.  For example, here's what a manifest for a
simple package set might look like:

@lisp
;; Manifest for three packages.
(specifications->manifest '("gcc-toolchain" "make" "git"))
@end lisp

Once you have that manifest, you can pass it, for example, to @command{guix
package} to install just those three packages to your profile
(@pxref{profile-manifest, @option{-m} option of @command{guix package}}):

@example
guix package -m manifest.scm
@end example

@noindent
... or you can pass it to @command{guix shell} (@pxref{shell-manifest,
@command{-m} option of @command{guix shell}}) to spawn an ephemeral
environment:

@example
guix shell -m manifest.scm
@end example

@noindent
... or you can pass it to @command{guix pack} in pretty much the same way
(@pxref{pack-manifest, @option{-m} option of @command{guix pack}}).  You can
store the manifest under version control, share it with others so they can
easily get set up, etc.

But how do you write your first manifest? To get started, maybe you'll want
to write a manifest that mirrors what you already have in a profile.  Rather
than start from a blank page, @command{guix package} can generate a manifest
for you (@pxref{export-manifest, @command{guix package --export-manifest}}):

@example
# Write to 'manifest.scm' a manifest corresponding to the
# default profile, ~/.guix-profile.
guix package --export-manifest > manifest.scm
@end example

Or maybe you'll want to ``translate'' command-line arguments into a
manifest.  In that case, @command{guix shell} can help
(@pxref{shell-export-manifest, @command{guix shell --export-manifest}}):

@example
# Write a manifest for the packages specified on the command line.
guix shell --export-manifest gcc-toolchain make git > manifest.scm
@end example

In both cases, the @option{--export-manifest} option tries hard to generate
a faithful manifest; in particular, it takes package transformation options
into account (@pxref{Opciones de transformación de paquetes}).

@quotation Nota
Manifests are @emph{symbolic}: they refer to packages of the channels
@emph{currently in use} (@pxref{Canales}).  In the example above,
@code{gcc-toolchain} might refer to version 11 today, but it might refer to
version 13 two years from now.

If you want to ``pin'' your software environment to specific package
versions and variants, you need an additional piece of information: the list
of channel revisions in use, as returned by @command{guix describe}.
@xref{Replicación de Guix}, for more information.
@end quotation

Once you've obtained your first manifest, perhaps you'll want to customize
it.  Since your manifest is code, you now have access to all the Guix
programming interfaces!

Let's assume you want a manifest to deploy a custom variant of GDB, the GNU
Debugger, that does not depend on Guile, together with another package.
Building on the example seen in the previous section (@pxref{Definición de variantes de paquetes}), you can write a manifest along these lines:

@lisp
(use-modules (guix packages)
             (gnu packages gdb)               ;for 'gdb'
             (gnu packages version-control))  ;for 'git'

;; Define a variant of GDB without a dependency on Guile.
(define gdb-sans-guile
  (package
    (inherit gdb)
    (inputs (modify-inputs (package-inputs gdb)
              (delete "guile")))))

;; Return a manifest containing that one package plus Git.
(packages->manifest (list gdb-sans-guile git))
@end lisp

Note that in this example, the manifest directly refers to the @code{gdb}
and @code{git} variables, which are bound to a @code{package} object
(@pxref{Referencia de package}), instead of calling
@code{specifications->manifest} to look up packages by name as we did
before.  The @code{use-modules} form at the top lets us access the core
package interface (@pxref{Definición de paquetes}) and the modules that define
@code{gdb} and @code{git} (@pxref{Módulos de paquetes}).  Seamlessly, we're
weaving all this together---the possibilities are endless, unleash your
creativity!

The data type for manifests as well as supporting procedures are defined in
the @code{(guix profiles)} module, which is automatically available to code
passed to @option{-m}.  The reference follows.

@deftp {Data Type} manifest
Data type representing a manifest.

It currently has one field:

@table @code
@item entries
This must be a list of @code{manifest-entry} records---see below.
@end table
@end deftp

@deftp {Data Type} manifest-entry
Data type representing a manifest entry.  A manifest entry contains
essential metadata: a name and version string, the object (usually a
package) for that entry, the desired output (@pxref{Paquetes con múltiples salidas}), and a number of optional pieces of information detailed below.

Most of the time, you won't build a manifest entry directly; instead, you
will pass a package to @code{package->manifest-entry}, described below.  In
some unusual cases though, you might want to create manifest entries for
things that are @emph{not} packages, as in this example:

@lisp
;; Manually build a single manifest entry for a non-package object.
(let ((hello (program-file "hello" #~(display "Hi!"))))
  (manifest-entry
    (name "foo")
    (version "42")
    (item
     (computed-file "hello-directory"
                     #~(let ((bin (string-append #$output "/bin")))
                         (mkdir #$output) (mkdir bin)
                          (symlink #$hello
                                   (string-append bin "/hello")))))))
@end lisp

The available fields are the following:

@table @asis
@item @code{name}
@itemx @code{version}
Name and version string for this entry.

@item @code{item}
A package or other file-like object (@pxref{Expresiones-G, file-like
objects}).

@item @code{output} (default: @code{"out"})
Output of @code{item} to use, in case @code{item} has multiple outputs
(@pxref{Paquetes con múltiples salidas}).

@item @code{dependencies} (predeterminadas: @code{'()})
List of manifest entries this entry depends on.  When building a profile,
dependencies are added to the profile.

Typically, the propagated inputs of a package (@pxref{Referencia de package,
@code{propagated-inputs}}) end up having a corresponding manifest entry in
among the dependencies of the package's own manifest entry.

@item @code{search-paths} (predeterminadas: @code{'()})
The list of search path specifications honored by this entry (@pxref{Search Paths}).

@item @code{properties} (default: @code{'()})
List of symbol/value pairs.  When building a profile, those properties get
serialized.

This can be used to piggyback additional metadata---e.g., the
transformations applied to a package (@pxref{Opciones de transformación de paquetes}).

@item @code{parent} (default: @code{(delay #f)})
A promise pointing to the ``parent'' manifest entry.

This is used as a hint to provide context when reporting an error related to
a manifest entry coming from a @code{dependencies} field.
@end table
@end deftp

@deffn {Scheme Procedure} concatenate-manifests @var{lst}
Concatenate the manifests listed in @var{lst} and return the resulting
manifest.
@end deffn

@c TODO: <manifest-pattern>, manifest-lookup, manifest-remove, etc.

@deffn {Scheme Procedure} package->manifest-entry @var{package} @
  [@var{output}] [#:properties] Return a manifest entry for the @var{output}
of package @var{package}, where @var{output} defaults to @code{"out"}, and
with the given @var{properties}.  By default @var{properties} is the empty
list or, if one or more package transformations were applied to
@var{package}, it is an association list representing those transformations,
suitable as an argument to @code{options->transformation} (@pxref{Definición de variantes de paquetes, @code{options->transformation}}).

The code snippet below builds a manifest with an entry for the default
output and the @code{send-email} output of the @code{git} package:

@lisp
(use-modules (gnu packages version-control))

(manifest (list (package->manifest-entry git)
                (package->manifest-entry git "send-email")))
@end lisp
@end deffn

@deffn {Scheme Procedure} packages->manifest @var{packages}
Return a list of manifest entries, one for each item listed in
@var{packages}.  Elements of @var{packages} can be either package objects or
package/string tuples denoting a specific output of a package.

Using this procedure, the manifest above may be rewritten more concisely:

@lisp
(use-modules (gnu packages version-control))

(packages->manifest (list git `(,git "send-email")))
@end lisp
@end deffn

@anchor{package-development-manifest}
@deffn {Scheme Procedure} package->development-manifest @var{package} @
  [@var{system}] [#:target] Return a manifest for the @dfn{development inputs}
of @var{package} for @var{system}, optionally when cross-compiling to
@var{target}.  Development inputs include both explicit and implicit inputs
of @var{package}.

Like the @option{-D} option of @command{guix shell}
(@pxref{shell-development-option, @command{guix shell -D}}), the resulting
manifest describes the environment in which one can develop @var{package}.
For example, suppose you're willing to set up a development environment for
Inkscape, with the addition of Git for version control; you can describe
that ``bill of materials'' with the following manifest:

@lisp
(use-modules (gnu packages inkscape)          ;for 'inkscape'
             (gnu packages version-control))  ;for 'git'

(concatenate-manifests
 (list (package->development-manifest inkscape)
       (packages->manifest (list git))))
@end lisp

In this example, the development manifest that
@code{package->development-manifest} returns includes the compiler (GCC),
the many supporting libraries (Boost, GLib, GTK, etc.), and a couple of
additional development tools---these are the dependencies @command{guix show
inkscape} lists.
@end deffn

@c TODO: Move (gnu packages) interface to a section of its own.

Last, the @code{(gnu packages)} module provides higher-level facilities to
build manifests.  In particular, it lets you look up packages by name---see
below.

@deffn {Scheme Procedure} specifications->manifest @var{specs}
Given @var{specs}, a list of specifications such as @code{"emacs@@25.2"} or
@code{"guile:debug"}, return a manifest.  Specs have the format that
command-line tools such as @command{guix install} and @command{guix package}
understand (@pxref{Invocación de guix package}).

As an example, it lets you rewrite the Git manifest that we saw earlier like
this:

@lisp
(specifications->manifest '("git" "git:send-email"))
@end lisp

Notice that we do not need to worry about @code{use-modules}, importing the
right set of modules, and referring to the right variables.  Instead, we
directly refer to packages in the same way as on the command line, which can
often be more convenient.
@end deffn

@c TODO: specifications->package, etc.


@node Sistemas de construcción
@section Sistemas de construcción

@cindex sistema de construcción
Cada definición de paquete especifica un @dfn{sistema de construcción} y
parámetros para dicho sistema de construcción (@pxref{Definición de paquetes}). Este campo @code{build-system} representa el procedimiento de
construcción del paquete, así como las dependencias implícitas de dicho
procedimiento de construcción.

Los sistemas de construcción son objetos @code{<build-system>}. La interfaz
para crear y manipularlos se proporciona en el módulo @code{(guix
build-system)}, y otros módulos exportan sistemas de construcción reales.

@cindex bag (representación de paquetes de bajo nivel)
En su implementación, los sistemas de construcción primero compilan los
objetos package a objetos @dfn{bag}. Una bolsa (traducción de @dfn{bag}) es
como un paquete, pero con menos ornamentos---en otras palabras, una bolsa es
una representación a un nivel más bajo de un paquete, que contiene todas las
entradas de dicho paquete, incluyendo algunas implícitamente añadidas por el
sistema de construcción. Esta representación intermedia se compila entonces
a una derivación (@pxref{Derivaciones}).  EL procedimiento
@code{package-with-c-toolchain} es un ejemplo de una forma de cambiar las
entradas implícitas que el sistema de construcción del paquete incluye
(@pxref{Referencia de package, @code{package-with-c-toolchain}}).

Los sistemas de construcción aceptan una lista opcional de
@dfn{parámetros}. En las definiciones de paquete, estos son pasados @i{vía}
el campo @code{arguments} (@pxref{Definición de paquetes}). Normalmente son
parámetros con palabras clave (@pxref{Optional Arguments, keyword arguments
in Guile,, guile, GNU Guile Reference Manual}). El valor de estos parámetros
normalmente se evalúa en la @dfn{capa de construcción}---es decir, por un
proceso Guile lanzado por el daemon (@pxref{Derivaciones}).

El sistema de construcción principal es @var{gnu-build-system}, el cual
implementa el procedimiento estándar de construcción para GNU y muchos otros
paquetes. Se proporciona por el módulo @code{(guix build-system gnu)}.

@defvr {Variable Scheme} gnu-build-system
@var{gnu-build-system} representa el sistema de construcción GNU y sus
variantes (@pxref{Configuration, configuration and makefile conventions,,
standards, GNU Coding Standards}).

@cindex fases de construcción
In a nutshell, packages using it are configured, built, and installed with
the usual @code{./configure && make && make check && make install} command
sequence.  In practice, a few additional steps are often needed.  All these
steps are split up in separate @dfn{phases}.  @xref{Fases de construcción}, for more
info on build phases and ways to customize them.

Además, este sistema de construcción asegura que el entorno ``estándar''
para paquetes GNU está disponible. Esto incluye herramientas como GCC, libc,
Coreutils, Bash, Make, Diffutils, grep y sed (vea el módulo @code{(guix
build system gnu)} para una lista completa). A estas las llamamos las
@dfn{entradas implícitas} de un paquete, porque las definiciones de paquete
no las mencionan.

This build system supports a number of keyword arguments, which can be
passed @i{via} the @code{arguments} field of a package.  Here are some of
the main parameters:

@table @code
@item #:phases
This argument specifies build-side code that evaluates to an alist of build
phases.  @xref{Fases de construcción}, for more information.

@item #:configure-flags
This is a list of flags (strings) passed to the @command{configure} script.
@xref{Definición de paquetes}, for an example.

@item #:make-flags
This list of strings contains flags passed as arguments to @command{make}
invocations in the @code{build}, @code{check}, and @code{install} phases.

@item #:out-of-source?
This Boolean, @code{#f} by default, indicates whether to run builds in a
build directory separate from the source tree.

When it is true, the @code{configure} phase creates a separate build
directory, changes to that directory, and runs the @code{configure} script
from there.  This is useful for packages that require it, such as
@code{glibc}.

@item #:tests?
This Boolean, @code{#t} by default, indicates whether the @code{check} phase
should run the package's test suite.

@item #:test-target
This string, @code{"check"} by default, gives the name of the makefile
target used by the @code{check} phase.

@item #:parallel-build?
@itemx #:parallel-tests?
These Boolean values specify whether to build, respectively run the test
suite, in parallel, with the @code{-j} flag of @command{make}.  When they
are true, @code{make} is passed @code{-j@var{n}}, where @var{n} is the
number specified as the @option{--cores} option of @command{guix-daemon} or
that of the @command{guix} client command (@pxref{Opciones comunes de construcción,
@option{--cores}}).

@cindex RUNPATH, validation
@item #:validate-runpath?
This Boolean, @code{#t} by default, determines whether to ``validate'' the
@code{RUNPATH} of ELF binaries (@code{.so} shared libraries as well as
executables) previously installed by the @code{install} phase.
@xref{phase-validate-runpath, the @code{validate-runpath} phase}, for
details.

@item #:substitutable?
This Boolean, @code{#t} by default, tells whether the package outputs should
be substitutable---i.e., whether users should be able to obtain substitutes
for them instead of building locally (@pxref{Sustituciones}).

@item #:allowed-references
@itemx #:disallowed-references
When true, these arguments must be a list of dependencies that must not
appear among the references of the build results.  If, upon build
completion, some of these references are retained, the build process fails.

This is useful to ensure that a package does not erroneously keep a
reference to some of it build-time inputs, in cases where doing so would,
for example, unnecessarily increase its size (@pxref{Invocación de guix size}).
@end table

Most other build systems support these keyword arguments.
@end defvr

Hay definidos otros objetos @code{<build-system>} para implementar otras
convenciones y herramientas usadas por paquetes de software libre. Heredan
la mayor parte de @var{gnu-build-system}, y se diferencian principalmente en
el conjunto de entradas implícitamente añadidas al proceso de construcción,
y en la lista de fases ejecutadas. Algunos de estos sistemas de construcción
se enumeran a continuación.

@defvr {Variable Scheme} ant-build-system
@code{(guix build-system ant)} exporta esta variable. Implementa el
procedimiento de construcción de paquetes Java que pueden construirse con
@url{https://ant.apache.org/, la herramienta de construcción Ant}.

Añade tanto @code{ant} como el @dfn{kit de desarrollo Java} (JDK), que
proporciona el paquete @code{icedtea}, al conjunto de entradas. Se pueden
especificar paquetes diferentes con los parámetros @code{#:ant} y
@code{#:jdk}, respectivamente.

Cuando el paquete original no proporciona un archivo Ant apropiado, el
parámetro @code{#:jar-name} puede usarse para generar un archivo de
construcción Ant @file{build.xml} mínimo con tareas para construir el
archivo jar especificado. En este caso, el parámetro @code{#:source-dir} se
puede usar para especificar el subdirectorio de fuentes, con ``src'' como
valor predeterminado.

The @code{#:main-class} parameter can be used with the minimal ant buildfile
to specify the main class of the resulting jar.  This makes the jar file
executable.  The @code{#:test-include} parameter can be used to specify the
list of junit tests to run.  It defaults to @code{(list "**/*Test.java")}.
The @code{#:test-exclude} can be used to disable some tests.  It defaults to
@code{(list "**/Abstract*.java")}, because abstract classes cannot be run as
tests.

El parámetro @code{#:build-target} se puede usar para especificar la tarea
Ant que debe ser ejecutada durante la fase @code{build}. Por defecto se
ejecuta la tarea ``jar''.

@end defvr

@defvr {Variable Scheme} android-ndk-build-system
@cindex distribución Android
@cindex Sistema de construcción NDK de Android
Esta variable es exportada por @code{(guix build-system
android-ndk)}. Implementa un procedimiento de construcción para paquetes
Android NDK (kit de desarrollo nativo) usando un proceso de construcción
específico de Guix.

El sistema de construcción asume que los paquetes instalan sus archivos de
interfaz pública (cabeceras) en el subdirectorio @file{include} de la salida
@code{out} y sus bibliotecas en el subdirectorio @file{lib} de la salida
@code{out}".

También se asume que la unión de todas las dependencias de un paquete no
tiene archivos en conflicto.

En este momento no funciona la compilación cruzada - por lo que las
bibliotecas y los archivos de cabecera se asumen que son locales.

@end defvr

@defvr {Variable Scheme} asdf-build-system/source
@defvrx {Variable Scheme} asdf-build-system/sbcl
@defvrx {Variable Scheme} asdf-build-system/ecl

These variables, exported by @code{(guix build-system asdf)}, implement
build procedures for Common Lisp packages using
@url{https://common-lisp.net/project/asdf/, ``ASDF''}.  ASDF is a system
definition facility for Common Lisp programs and libraries.

The @code{asdf-build-system/source} system installs the packages in source
form, and can be loaded using any common lisp implementation, via ASDF@.
The others, such as @code{asdf-build-system/sbcl}, install binary systems in
the format which a particular implementation understands.  These build
systems can also be used to produce executable programs, or lisp images
which contain a set of packages pre-loaded.

El sistema de construcción usa convenciones de nombres. Para paquetes
binarios, el paquete debería estar prefijado con la implementación lisp,
como @code{sbcl-} para @code{asdf-build-system/sbcl}.

Adicionalmente, el paquete de fuentes correspondiente debe etiquetarse
usando la misma convención que los paquetes python (vea @ref{Módulos Python}), usando el prefijo @code{cl-}.

In order to create executable programs and images, the build-side procedures
@code{build-program} and @code{build-image} can be used.  They should be
called in a build phase after the @code{create-asdf-configuration} phase, so
that the system which was just built can be used within the resulting
image.  @code{build-program} requires a list of Common Lisp expressions to
be passed as the @code{#:entry-program} argument.

By default, all the @file{.asd} files present in the sources are read to
find system definitions.  The @code{#:asd-files} parameter can be used to
specify the list of @file{.asd} files to read.  Furthermore, if the package
defines a system for its tests in a separate file, it will be loaded before
the tests are run if it is specified by the @code{#:test-asd-file}
parameter.  If it is not set, the files @code{<system>-tests.asd},
@code{<system>-test.asd}, @code{tests.asd}, and @code{test.asd} will be
tried if they exist.

If for some reason the package must be named in a different way than the
naming conventions suggest, or if several systems must be compiled, the
@code{#:asd-systems} parameter can be used to specify the list of system
names.

@end defvr

@defvr {Variable Scheme} cargo-build-system
@cindex lenguaje de programación Rust
@cindex Cargo (sistema de construcción de Rust)
Esta variable se exporta en @code{(guix build-system cargo)}. Permite la
construcción de paquetes usando Cargo, la herramienta de construcción del
@uref{https://www.rust-lang.org, lenguaje de programación Rust}.

Automáticamente añade @code{rustc} y @code{cargo} al conjunto de
entradas. Se puede especificar el uso de un paquete Rust distinto con el
parámetro @code{#:rust}.

Regular cargo dependencies should be added to the package definition
similarly to other packages; those needed only at build time to
native-inputs, others to inputs.  If you need to add source-only crates then
you should add them to via the @code{#:cargo-inputs} parameter as a list of
name and spec pairs, where the spec can be a package or a source
definition.  Note that the spec must evaluate to a path to a gzipped tarball
which includes a @code{Cargo.toml} file at its root, or it will be ignored.
Similarly, cargo dev-dependencies should be added to the package definition
via the @code{#:cargo-development-inputs} parameter.

In its @code{configure} phase, this build system will make any source inputs
specified in the @code{#:cargo-inputs} and @code{#:cargo-development-inputs}
parameters available to cargo.  It will also remove an included
@code{Cargo.lock} file to be recreated by @code{cargo} during the
@code{build} phase.  The @code{package} phase will run @code{cargo package}
to create a source crate for future use.  The @code{install} phase installs
the binaries defined by the crate.  Unless @code{install-source? #f} is
defined it will also install a source crate repository of itself and
unpacked sources, to ease in future hacking on rust packages.
@end defvr

@defvr {Scheme Variable} chicken-build-system
This variable is exported by @code{(guix build-system chicken)}.  It builds
@uref{https://call-cc.org/, CHICKEN Scheme} modules, also called ``eggs'' or
``extensions''.  CHICKEN generates C source code, which then gets compiled
by a C compiler, in this case GCC.

This build system adds @code{chicken} to the package inputs, as well as the
packages of @code{gnu-build-system}.

The build system can't (yet) deduce the egg's name automatically, so just
like with @code{go-build-system} and its @code{#:import-path}, you should
define @code{#:egg-name} in the package's @code{arguments} field.

For example, if you are packaging the @code{srfi-1} egg:

@lisp
(arguments '(#:egg-name "srfi-1"))
@end lisp

Egg dependencies must be defined in @code{propagated-inputs}, not
@code{inputs} because CHICKEN doesn't embed absolute references in compiled
eggs.  Test dependencies should go to @code{native-inputs}, as usual.
@end defvr

@defvr {Variable Scheme} copy-build-system
Esta variable se exporta en @code{(guix build-system copy)}. Permite la
construcción de paquetes simples que no necesitan mucha compilación y en su
mayor parte dependen únicamente de la copia de archivos en distintas rutas.

Añade gran parte de los paquetes de @code{gnu-build-system} al conjunto de
entradas. Por esta razón, @code{copy-build-system} no necesita toda la
verborrea que habitualmente requiere @code{trivial-build-system}.

Para simplificar más aún el proceso de instalación de archivos, se expone un
parámetro @code{#:install-plan} para permitir a quien genera el paquete
especificar dónde van los distintos archivos. El plan de instalación
(@code{#:install-plan}) es una lista de @code{(@var{fuente} @var{destino}
[@var{filtro}])}. Los @var{filtro}s son opcionales.

@itemize
@item Cuando @var{fuente} corresponde con un archivo o un directorio sin la barra final, se instala en @var{destino}.
@itemize
@item Si @var{destino} contiene una barra al final, @var{fuente} se instala con su nombre de archivo en la ruta @var{destino}.
@item En otro caso se instala @var{fuente} como @var{destino}.
@end itemize

@item Cuando @var{fuente} es un directorio terminado en una barra, o cuando se usa algún @var{filtro},
la barra al final de @var{destino} tiene el significado que se describió
anteriormente.
@itemize
@item Sin @var{filtros}, instala todo el @emph{contenido} de @var{fuente} en @var{destino}.
@item Cuando @var{filtro} contiene @code{#:include}, @code{#:include-regexp}, @code{#:exclude},
@code{#:exclude-regexp}, únicamente se seleccionan los archivos instalados
dependiendo de los filtros. Cada filtro se especifica como una lista de
cadenas.
@itemize
@item Con @code{#:include}, se instalan todos los archivos de la ruta cuyo sufijo
corresponda con al menos uno de los elementos de la lista proporcionada.
@item Con @code{#:include-regexp} se instalan todos los archivos cuyas
rutas relativas correspondan con al menos una de las expresiones regulares
en la lista proporcionada.
@item Los filtros @code{#:exclude} y @code{#:exclude-regexp}
son complementarios a sus equivalentes inclusivos. Sin opciones
@code{#:include}, se instalan todos los archivos excepto aquellos que
correspondan con los filtros de exclusión. Si se proporcionan tanto
inclusiones como exclusiones, las exclusiones tienen efecto sobre los
resultados de las inclusiones.
@end itemize
@end itemize
En todos los casos, las rutas relativas a @var{fuente} se preservan dentro
de @var{destino}.
@end itemize

Ejemplos:

@itemize
@item @code{("foo/bar" "share/my-app/")}: Instala @file{bar} en @file{share/my-app/bar}.
@item @code{("foo/bar" "share/my-app/baz")}: Instala @file{bar} en @file{share/my-app/baz}.
@item @code{("foo/" "share/my-app")}: Instala el contenido de @file{foo} dentro de @file{share/my-app},
por ejemplo, instala @file{foo/sub/file} en @file{share/my-app/sub/file}.
@item @code{("foo/" "share/my-app" #:include ("sub/file"))}: Instala únicamente @file{foo/sub/file} en
@file{share/my-app/sub/file}.
@item @code{("foo/sub" "share/my-app" #:include ("file"))}: Instala @file{foo/sub/file} en
@file{share/my-app/file}.
@end itemize
@end defvr


@cindex Clojure (lenguaje de programación)
@cindex sistema de construcción simple de Clojure
@defvr {Variable Scheme} clojure-build-system
Esta variable se exporta en @code{(guix build-system clojure)}. Implementa
un procedimiento de construcción simple para paquetes
@uref{https://clojure.org/, Clojure} usando directamente @code{compile} en
Clojure. La compilación cruzada no está disponible todavía.

Añade @code{clojure}, @code{icedtea} y @code{zip} al conjunto de
entradas. Se pueden especificar paquetes diferentes con los parámetros
@code{#:clojure}, @code{#:jdk} y @code{#:zip}, respectivamente.

Una lista de directorios de fuentes, directorios de pruebas y nombres de jar
pueden especificarse con los parámetros @code{#:source-dirs},
@code{#:test-dirs} y @code{#:jar-names}, respectivamente. El directorio de
compilación y la clase principal pueden especificarse con los parámetros
@code{#:compile-dir} y @code{#:main-class}, respectivamente. Otros
parámetros se documentan más adelante.

Este sistema de construcción es una extensión de @var{ant-build-system},
pero con las siguientes fases cambiadas:

@table @code

@item build
Esta fase llama @code{compile} en Clojure para compilar los archivos de
fuentes y ejecuta @command{jar} para crear archivadores jar tanto de
archivos de fuentes y compilados de acuerdo con las listas de inclusión y
exclusión especificadas en @code{#:aot-include} y @code{#:aot-exclude},
respectivamente. La lista de exclusión tiene prioridad sobre la de
inclusión. Estas listas consisten en símbolos que representan bibliotecas
Clojure o la palabra clave especial @code{#:all} que representa todas las
bibliotecas encontradas en los directorios de fuentes. El parámetro
@code{#:omit-source?} determina si las fuentes deben incluirse en los
archivadores jar.

@item check
Esta fase ejecuta las pruebas de acuerdo a las listas de inclusión y
exclusión especificadas en @code{#:test-include} y @code{#:test-exclude},
respectivamente. Sus significados son análogos a los de @code{#:aot-include}
y @code{#:aot-exclude}, excepto que la palabra clave especial @code{#:all}
designa ahora a todas las bibliotecas Clojure encontradas en los directorios
de pruebas. El parámetro @code{#:tests?} determina si se deben ejecutar las
pruebas.

@item install
Esta fase instala todos los archivadores jar construidos previamente.
@end table

Además de las previas, este sistema de construcción contiene una fase
adicional:

@table @code

@item install-doc
Esta fase instala todos los archivos de nivel superior con un nombre que
corresponda con @var{%doc-regex}. Una expresión regular diferente se puede
especificar con el parámetro @code{#:doc-regex}. Todos los archivos dentro
(recursivamente) de los directorios de documentación especificados en
@code{#:doc-dirs} se instalan también.
@end table
@end defvr

@defvr {Variable Scheme} cmake-build-system
Esta variable se exporta en @code{(guix build-system cmake)}. Implementa el
procedimiento de construcción para paquetes que usen la
@url{https://www.cmake.org, herramienta de construcción CMake}.

Automáticamente añade el paquete @code{cmake} al conjunto de entradas. El
paquete usado se puede especificar con el parámetro @code{#:cmake}.

El parámetro @code{#:configure-flags} se toma como una lista de opciones a
pasar a @command{cmake}. El parámetro @code{#:build-type} especifica en
términos abstractos las opciones pasadas al compilador; su valor
predeterminado es @code{"RelWithDebInfo"} (quiere decir ``modo de entrega
con información de depuración''), lo que aproximadamente significa que el
código se compila con @code{-O2 -g}, lo cual es el caso predeterminado en
paquetes basados en Autoconf.
@end defvr

@defvr {Variable Scheme} dune-build-system
Esta variable se exporta en @code{(guix build-system dune)}. Permite la
construcción de paquetes mediante el uso de @uref{https://dune.build/,
Dune}, una herramienta de construcción para el lenguaje de programación
OCaml. Se implementa como una extensión de @code{ocaml-build-system} que se
describe a continuación. Como tal, se pueden proporcionar los parámetros
@code{#:ocaml} y @code{#:findlib} a este sistema de construcción.

Automáticamente añade el paquete @code{dune} al conjunto de entradas. El
paquete usado se puede especificar con el parámetro @code{#:dune}.

No existe una fase @code{configure} debido a que los paquetes dune no
necesitan ser configurados típicamente. El parámetro @code{#:build-flags} se
toma como una lista de opciones proporcionadas a la orden @code{dune}
durante la construcción.

El parámetro @code{#:jbuild?} puede proporcionarse para usar la orden
@code{jbuild} en vez de la más reciente @code{dune} durante la construcción
de un paquete. Su valor predeterminado es @code{#f}.

El parámetro @code{#:package} puede proporcionarse para especificar un
nombre de paquete, lo que resulta útil cuando un paquete contiene múltiples
paquetes y únicamente quiere construir uno de ellos. Es equivalente a
proporcionar el parámetro @code{-p} a @code{dune}.

@end defvr

@defvr {Scheme variable} elm-build-system
This variable is exported by @code{(guix build-system elm)}.  It implements
a build procedure for @url{https://elm-lang.org, Elm} packages similar to
@samp{elm install}.

The build system adds an Elm compiler package to the set of inputs.  The
default compiler package (currently @code{elm-sans-reactor}) can be
overridden using the @code{#:elm} argument.  Additionally, Elm packages
needed by the build system itself are added as implicit inputs if they are
not already present: to suppress this behavior, use the
@code{#:implicit-elm-package-inputs?} argument, which is primarily useful
for bootstrapping.

The @code{"dependencies"} and @code{"test-dependencies"} in an Elm package's
@file{elm.json} file correspond to @code{propagated-inputs} and
@code{inputs}, respectively.

Elm requires a particular structure for package names: @pxref{Paquetes Elm}
for more details, including utilities provided by @code{(guix build-system
elm)}.

There are currently a few noteworthy limitations to @code{elm-build-system}:

@itemize
@item
The build system is focused on @dfn{packages} in the Elm sense of the word:
Elm @dfn{projects} which declare @code{@{ "type": "package" @}} in their
@file{elm.json} files.  Using @code{elm-build-system} to build Elm
@dfn{applications} (which declare @code{@{ "type": "application" @}}) is
possible, but requires ad-hoc modifications to the build phases.  For
examples, see the definitions of the @code{elm-todomvc} example application
and the @code{elm} package itself (because the front-end for the @samp{elm
reactor} command is an Elm application).

@item
Elm supports multiple versions of a package coexisting simultaneously under
@env{ELM_HOME}, but this does not yet work well with
@code{elm-build-system}.  This limitation primarily affects Elm
applications, because they specify exact versions for their dependencies,
whereas Elm packages specify supported version ranges.  As a workaround, the
example applications mentioned above use the
@code{patch-application-dependencies} procedure provided by @code{(guix
build elm-build-system)} to rewrite their @file{elm.json} files to refer to
the package versions actually present in the build environment.
Alternatively, Guix package transformations (@pxref{Definición de variantes de paquetes}) could be used to rewrite an application's entire dependency
graph.

@item
We are not yet able to run tests for Elm projects because neither
@url{https://github.com/mpizenberg/elm-test-rs, @command{elm-test-rs}} nor
the Node.js-based @url{https://github.com/rtfeldman/node-test-runner,
@command{elm-test}} runner has been packaged for Guix yet.
@end itemize
@end defvr

@defvr {Variable Scheme} go-build-system
Esta variable se exporta en @code{(guix build-system go)}. Implementa el
procedimiento de construcción para paquetes Go usando los
@url{https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies,
mecanismos de construcción de Go} estándares.

Se espera que la usuaria proporcione un valor para el parámetro
@code{#:import-path} y, en algunos caso, @code{#:unpack-path}. La
@url{https://golang.org/doc/code.html#ImportPaths, ruta de importación}
corresponde a la ruta del sistema de archivos esperada por los guiones de
construcción del paquete y los paquetes a los que hace referencia, y
proporciona una forma de hacer referencia a un paquete Go unívocamente. Está
basado típicamente en una combinación de la URI remota del paquete de
archivos de fuente y la estructura jerárquica del sistema de archivos. En
algunos casos, necesitará desempaquetar el código fuente del paquete en una
estructura de directorios diferente a la indicada en la ruta de importación,
y @code{#:unpack-path} debe usarse en dichos casos.

Los paquetes que proporcionan bibliotecas Go deben instalar su código fuente
en la salida de la construcción. El parámetro @code{#:install-source?}, cuyo
valor por defecto es @code{#t}, controla si se instalará o no el código
fuente. Puede proporcionarse @code{#f} en paquetes que proporcionan
únicamente archivos ejecutables.

Packages can be cross-built, and if a specific architecture or operating
system is desired then the keywords @code{#:goarch} and @code{#:goos} can be
used to force the package to be built for that architecture and operating
system.  The combinations known to Go can be found
@url{"https://golang.org/doc/install/source#environment", in their
documentation}.
@end defvr

@defvr {Variable Scheme} glib-or-gtk-build-system
Esta variable se exporta en @code{(guix build-system glib-or-gtk)}. Está
pensada para usarse con paquetes que usan GLib o GTK+.

Este sistema de construcción añade las dos fases siguientes a las definidas
en @var{gnu-build-system}:

@table @code
@item glib-or-gtk-wrap
La fase @code{glib-or-gtk-wrap} se asegura de que los programas en
@file{bin/} son capaces de encontrar los ``esquemas'' GLib y los
@uref{https://developer.gnome.org/gtk3/stable/gtk-running.html, módulos
GTK+}. Esto se consigue recubriendo los programas en guiones de lanzamiento
que proporcionan valores apropiados para las variables de entorno
@env{XDG_DATA_DIRS} y @env{GTK_PATH}.

Es posible excluir salidas específicas del paquete del proceso de
recubrimiento enumerando sus nombres en el parámetro
@code{#:glib-org-gtk-wrap-excluded-outputs}. Esto es útil cuando se sabe que
una salida no contiene binarios GLib o GTK+, y cuando empaquetar
gratuitamente añadiría una dependencia de dicha salida en GLib y GTK+.

@item glib-or-gtk-compile-schemas
La fase @code{glib-or-gtk-compile-schemas} se asegura que todos los
@uref{https://developer.gnome.org/gio/stable/glib-compile-schemas.html,
esquemas GSettings} o GLib se compilan. La compilación la realiza el
programa @command{glib-compile-schemas}. Lo proporciona el paquete
@code{glib:bin} que se importa automáticamente por el sistema de
construcción. El paquete @code{glib} que proporciona
@command{glib-compile-schemas} puede especificarse con el parámetro
@code{#:glib}.
@end table

Ambas fases se ejecutan tras la fase @code{install}.
@end defvr

@defvr {Variable Scheme} guile-build-system
Este sistema de construcción es para paquetes Guile que consisten
exclusivamente en código Scheme y son tan simples que no tienen ni siquiera
un archivo Makefile, menos un guión @file{configure}. Compila código Scheme
usando @command{guild compile} (@pxref{Compilation,,, guile, GNU Guile
Reference Manual}) e instala los archivos @file{.scm} y @file{.go} en el
lugar correcto. También instala documentación.

Este sistema de construcción permite la compilación cruzada usando la opción
@option{--target} de @command{guild compile}.

Los paquetes construidos con @code{guile-build-system} deben proporcionar un
paquete Guile en su campo @code{native-inputs}.
@end defvr

@defvr {Variable Scheme} julia-build-system
This variable is exported by @code{(guix build-system julia)}.  It
implements the build procedure used by @uref{https://julialang.org/, julia}
packages, which essentially is similar to running @samp{julia -e 'using Pkg;
Pkg.add(package)'} in an environment where @env{JULIA_LOAD_PATH} contains
the paths to all Julia package inputs.  Tests are run by calling
@code{/test/runtests.jl}.

The Julia package name and uuid is read from the file @file{Project.toml}.
These values can be overridden by passing the argument
@code{#:julia-package-name} (which must be correctly capitalized) or
@code{#:julia-package-uuid}.

Julia packages usually manage their binary dependencies via
@code{JLLWrappers.jl}, a Julia package that creates a module (named after
the wrapped library followed by @code{_jll.jl}.

To add the binary path @code{_jll.jl} packages, you need to patch the files
under @file{src/wrappers/}, replacing the call to the macro
@code{JLLWrappers.@@generate_wrapper_header}, adding as a second argument
containing the store path the binary.

As an example, in the MbedTLS Julia package, we add a build phase
(@pxref{Fases de construcción}) to insert the absolute file name of the wrapped
MbedTLS package:

@lisp
(add-after 'unpack 'override-binary-path
  (lambda* (#:key inputs #:allow-other-keys)
    (for-each (lambda (wrapper)
                (substitute* wrapper
                  (("generate_wrapper_header.*")
                   (string-append
                    "generate_wrapper_header(\"MbedTLS\", \""
                    (assoc-ref inputs "mbedtls-apache") "\")\n"))))
              ;; There's a Julia file for each platform, override them all.
              (find-files "src/wrappers/" "\\.jl$"))))
@end lisp

Some older packages that aren't using @file{Project.toml} yet, will require
this file to be created, too.  It is internally done if the arguments
@code{#:julia-package-name} and @code{#:julia-package-uuid} are provided.
@end defvr

@defvr {Variable Scheme} maven-build-system
Esta variable se exporta en @code{(guix build-system maven)}. Implementa un
procedimiento de construcción para paquetes basados en
@uref{https://maven.apache.org, Maven}. Maven es una herramienta para Java
de gestión de dependencias y ciclo de vida. Las usuarias de Maven
especifican las dependencias y módulos en un archivo @file{pom.xml} que
Maven lee. Cuando Maven no dispone de una de dichas dependencias o módulos
en su repositorio, las descarga y las usa para construir el paquete.

El sistema de compilación de maven se asegura de que maven no intentará
descargar ninguna dependencia ejecutándo maven en modo sin conexión. Maven
fallará si falta alguna dependencia. Antes de ejecutar Maven, el archivo
@file{pom.xml} (y los subproyectos) se modifican para especificar la versión
de las dependencias y módulos que corresponden a las versiones disponibles
en el entorno de construcción de guix. Las dependencias y los módulos se
deben instalar en un repositorio de maven @i{ad hoc} en @file{lib/m2}, y se
enlazan un repositorio real antes de que se ejecute maven. Se le indica a
Maven que use ese repositorio para la construcción e instale los artefactos
generados allí. Los archivos cambiados se copian del directorio
@file{lib/m2} a la salida del paquete.

Puede especificar un archivo @file{pom.xml} con el parámetro
@code{#:pom-file}, o dejar al sistema de construcción usar el archivo
predeterminado @file{pom.xml} en las fuentes.

En caso de que necesite especificar la versión de una dependencia
manualmente puede usar el parámetro @code{#:local-packages}. Toma como valor
una lista asociativa donde la clave es el valor del campo ``groupId'' del
paquete y su valor es una lista asociativa donde la clave es el campo
``artifactId'' del paquete y su valor la versión que quiere forzar en vez de
la que se encuentra en @file{pom.xml}.

Algunos paquetes usan dependencias o módulos que no son útiles en tiempo de
ejecución ni en tiempo de construcción en Guix. Puede modificar el archivo
@file{pom.xml} para eliminarlos usando el parámetro @code{#:exclude}. Su
valor es una lista asociativa donde la clave es el valor del campo
``groupId'' del módulo o dependencia que quiere eliminar, y su valor es una
lista de valores del campo ``artifactId'' que se eliminarán.

Puede usar valores distintos para los paquetes @code{jdk} y @code{maven} con
el parámetro correspondiente, @code{#:jdk} y @code{#:maven}.

El parámetro @code{#:maven-plugins} es una lista de módulos de maven usados
durante la construcción, con el mismo formato que el campo @code{inputs} de
la declaración del paquete. Su valor predeterminado es
@code{(default-maven-plugins)} que también se exporta.
@end defvr

@defvr {Scheme Variable} minetest-mod-build-system
This variable is exported by @code{(guix build-system minetest)}.  It
implements a build procedure for @uref{https://www.minetest.net, Minetest}
mods, which consists of copying Lua code, images and other resources to the
location Minetest searches for mods.  The build system also minimises PNG
images and verifies that Minetest can load the mod without errors.
@end defvr

@defvr {Variable Scheme} minify-build-system
Esta variable se exporta en @code{(guix build-system minify)}. Implementa un
procedimiento de minificación para paquetes JavaScript simples.

Añade @code{uglify-js} al conjunto de entradas y lo utiliza para comprimir
todos los archivos JavaScript en el directorio @file{src}. Un paquete de
minificación diferente puede especificarse con el parámetro
@code{#:uglify-js}, pero se espera que el paquete escriba el código
minificado en la salida estándar.

Cuando los archivos JavaScript de entrada no se encuentran en el directorio
@file{src}, el parámetro @code{#:javascript-files} puede usarse para
especificar una lista de nombres de archivo que proporcionar al minificador.
@end defvr

@defvr {Variable Scheme} ocaml-build-system
Esta variable se exporta en @code{(guix build-system ocaml)}. Implementa un
procedimiento de construcción para paquetes @uref{https://ocaml.org, OCaml},
que consiste en seleccionar el conjunto correcto de órdenes a ejecutar para
cada paquete. Los paquetes OCaml pueden esperar la ejecución de muchas
ordenes diferentes. Este sistema de construcción probará algunas de ellas.

Cuando el paquete tiene un archivo @file{setup.ml} presente en el nivel
superior, se ejecuta @code{ocaml setup.ml -configure}, @code{ocaml setup.ml
-build} y @code{ocaml setup.ml -install}. El sistema de construcción asumirá
que este archivo se generó con @uref{http://oasis.forge.ocamlcore.org/
OASIS} y se encargará de establecer el prefijo y la activación de las
pruebas si no se desactivaron. Puede pasar opciones de configuración y
construcción con @code{#:configure-flags} y @code{#:build-flags},
respectivamente. El parámetro @code{#:test-flags} puede usarse para cambiar
el conjunto de opciones usadas para activar las pruebas. El parámetro
@code{#:use-make?} puede usarse para ignorar este sistema en las fases de
construcción e instalación.

Cuando el paquete tiene un archivo @file{configure}, se asume que es un
guión de configuración hecho a mano que necesita un formato de parámetros
diferente a los del sistema @code{gnu-build-system}. Puede añadir más
opciones con el parámetro @code{#:configure-flags}.

Cuando el paquete tiene un archivo @file{Makefile} (o @code{#:use-make?} es
@code{#t}), será usado y se pueden proporcionar más opciones para las fases
de construcción y e instalación con el parámetro @code{#:make-flags}.

Por último, algunos paquetes no tienen estos archivos y usan unas
localizaciones de algún modo estándares para su sistema de construcción. En
este caso, el sistema de construcción ejecutará @code{ocaml pkg/pkg.ml} o
@code{ocaml pkg/build.ml} y se hará cargo de proporcionar la ruta del módulo
findlib necesario. Se pueden pasar opciones adicionales con el parámetro
@code{#:build-flags}. De la instalación se hace cargo
@command{opam-installer}. En este caso, el paquete @code{opam} debe añadirse
al campo @code{native-inputs} de la definición del paquete.

Fíjese que la mayoría de los paquetes OCaml asumen su instalación en el
mismo directorio que OCaml, lo que no es el comportamiento deseado en
guix. En particular, tratarán de instalar archivos @file{.so} en su
directorio de módulos, lo que normalmente es aceptable puesto que está bajo
el directorio del compilador de OCaml. No obstante, en guix estas
bibliotecas no se pueden instalar ahí, por lo que se usa
@env{CAML_LD_LIBRARY_PATH}. Esta variable apunta a
@file{lib/ocaml/site-lib/stubslibs} y allí es donde se deben instalar las
bibliotecas @file{.so}.
@end defvr

@defvr {Variable Scheme} python-build-system
Esta variable se exporta en @code{(guix build-system python)}. Implementa el
procedimiento más o menos estándar de construcción usado por paquetes
Python, que consiste en la ejecución de @code{python setup.py build} y
@code{python setup.py install --prefix=/gnu/store/@dots{}}.

For packages that install stand-alone Python programs under @code{bin/}, it
takes care of wrapping these programs so that their @env{GUIX_PYTHONPATH}
environment variable points to all the Python libraries they depend on.

Se puede especificar el paquete Python usado para llevar a cabo la
construcción con el parámetro @code{#:python}. Esta es habitualmente una
forma de forzar la construcción de un paquete para una versión específica
del intérprete Python, lo que puede ser necesario si el paquete es
compatible únicamente con una versión del intérprete.

De manera predeterminada guix llama a @code{setup.py} bajo el control de
@code{setuptools} de manera similar a lo realizado por
@command{pip}. Algunos paquetes no son compatibles con setuptools (y pip),
por lo que puede desactivar esta configuración estableciendo el parámetro
@code{#:use-setuptools} a @code{#f}.

If a @code{"python"} output is available, the package is installed into it
instead of the default @code{"out"} output. This is useful for packages that
include a Python package as only a part of the software, and thus want to
combine the phases of @code{python-build-system} with another build system.
Python bindings are a common usecase.
@end defvr

@defvr {Scheme Variable} pyproject-build-system
This is a variable exported by @code{guix build-system pyproject}.  It is
based on @var{python-build-system}, and adds support for
@file{pyproject.toml} and @url{https://peps.python.org/pep-0517/, PEP 517}.
It also supports a variety of build backends and test frameworks.

The API is slightly different from @var{python-build-system}:
@itemize
@item
@code{#:use-setuptools?} and @code{#:test-target} is removed.
@item
@code{#:build-backend} is added.  It defaults to @code{#false} and will try
to guess the appropriate backend based on @file{pyproject.toml}.
@item
@code{#:test-backend} is added.  It defaults to @code{#false} and will guess
an appropriate test backend based on what is available in package inputs.
@item
@code{#:test-flags} is added.  The default is @code{'()}.  These flags are
passed as arguments to the test command.  Note that flags for verbose output
is always enabled on supported backends.
@end itemize

It is considered ``experimental'' in that the implementation details are not
set in stone yet, however users are encouraged to try it for new Python
projects (even those using @file{setup.py}).  The API is subject to change,
but any breaking changes in the Guix channel will be dealt with.

Eventually this build system will be deprecated and merged back into
@var{python-build-system}, probably some time in 2024.
@end defvr

@defvr {Variable Scheme} perl-build-system
Esta variable se exporta en @code{(guix build-system perl)}. Implementa el
procedimiento de construcción estándar para paquetes Perl, lo que o bien
consiste en la ejecución de @code{perl Build.PL
--prefix=/gnu/store/@dots{}}, seguido de @code{Build} y @code{Build
install}; o en la ejecución de @code{perl Makefile.PL
PREFIX=/gnu/store/@dots{}}, seguida de @code{make} y @code{make install},
dependiendo de si @code{Build.PL} o @code{Makefile.PL} están presentes en la
distribución del paquete. El primero tiene preferencia si existen tanto
@code{Build.PL} como @code{Makefile.PL} en la distribución del paquete. Esta
preferencia puede ser invertida mediante la especificación del valor
@code{#t} en el parámetro @code{#:make-maker?}.

La invocación inicial de @code{perl Makefile.PL} o @code{perl Build.PL} pasa
a su vez las opciones especificadas por los parámetros
@code{#:make-maker-flags} o @code{#:module-build-flags}, respectivamente.

El paquete Perl usado puede especificarse con @code{#:perl}.
@end defvr

@defvr {Scheme Variable} renpy-build-system
This variable is exported by @code{(guix build-system renpy)}.  It
implements the more or less standard build procedure used by Ren'py games,
which consists of loading @code{#:game} once, thereby creating bytecode for
it.

It further creates a wrapper script in @code{bin/} and a desktop entry in
@code{share/applications}, both of which can be used to launch the game.

Which Ren'py package is used can be specified with @code{#:renpy}.  Games
can also be installed in outputs other than ``out'' by using
@code{#:output}.
@end defvr

@defvr {Variable Scheme} qt-build-system
Esta variable se exporta en @code{(guix build-system qt)}. Está pensado para
usarse con aplicaciones que usen Qt o KDE.

Este sistema de construcción añade las dos fases siguientes a las definidas
en @var{cmake-build-system}:

@table @code
@item check-setup
La fase @code{check-setup} prepara el entorno para la ejecución de las
comprobaciones usadas habitualmente por los programas de pruebas de Qt. Por
ahora únicamente proporciona valor a algunas variables de entorno:
@code{QT_QPA_PLATFORM=offscreen}, @code{DBUS_FATAL_WARNINGS=0} y
@code{CTEST_OUTPUT_ON_FAILURE=1}.

Esta fase se añade previamente a la fase @code{check}. Es una fase separada
para facilitar el ajuste si fuese necesario.

@item qt-wrap
La fase @code{qt-wrap} busca las rutas de módulos de Qt5, las rutas de QML y
algunas rutas XDG en las entradas y la salida. En caso de que alguna ruta se
encuentra, todos los programas en los directorios @file{bin/}, @file{sbin/},
@file{libexec/} y @file{lib/libexec/} de la salida se envuelven en guiones
que definen las variables de entorno necesarias.

Es posible excluir salidas específicas del paquete del proceso de
recubrimiento enumerando sus nombres en el parámetro
@code{#:qt-wrap-excluded-outputs}. Esto es útil cuando se sabe que una
salida no contiene binarios que usen Qt, y cuando empaquetar gratuitamente
añadiría una dependencia de dicha salida en Qt.

Ambas fases se añaden tras la fase @code{install}.
@end table
@end defvr

@defvr {Variable Scheme} r-build-system
Esta variable se exporta en @code{(guix build-system r)}. Implementa el
procedimiento de construcción usados por paquetes
@uref{https://r-project.org, R}, lo que esencialmente es poco más que la
ejecución de @samp{R CMD INSTALL --library=/gnu/store/@dots{}} en un entorno
donde @env{R_LIBS_SITE} contiene las rutas de todos los paquetes R de
entrada. Las pruebas se ejecutan tras la instalación usando la función R
@code{tools::testInstalledPackage}.
@end defvr

@defvr {Variable Scheme} rakudo-build-system
This variable is exported by @code{(guix build-system rakudo)}.  It
implements the build procedure used by @uref{https://rakudo.org/, Rakudo}
for @uref{https://perl6.org/, Perl6} packages.  It installs the package to
@code{/gnu/store/@dots{}/NAME-VERSION/share/perl6} and installs the
binaries, library files and the resources, as well as wrap the files under
the @code{bin/} directory.  Tests can be skipped by passing @code{#f} to the
@code{tests?} parameter.

El paquete rakudo en uso puede especificarse con @code{rakudo}. El paquete
perl6-tap-harness en uso durante las pruebas puede especificarse con
@code{#:prove6} o eliminarse proporcionando @code{#f} al parámetro
@code{with-prove6?}. El paquete perl6-zef en uso durante las pruebas e
instalación puede especificarse con @code{#:zef} o eliminarse proporcionando
@code{#f} al parámetro @code{with-zef?}.
@end defvr

@defvr {Scheme Variable} rebar-build-system
This variable is exported by @code{(guix build-system rebar)}.  It
implements a build procedure around @uref{https://rebar3.org,rebar3}, a
build system for programs written in the Erlang language.

It adds both @code{rebar3} and the @code{erlang} to the set of inputs.
Different packages can be specified with the @code{#:rebar} and
@code{#:erlang} parameters, respectively.

This build system is based on @code{gnu-build-system}, but with the
following phases changed:

@table @code

@item unpack
This phase, after unpacking the source like the @code{gnu-build-system}
does, checks for a file @code{contents.tar.gz} at the top-level of the
source.  If this file exists, it will be unpacked, too.  This eases handling
of package hosted at @uref{https://hex.pm/}, the Erlang and Elixir package
repository.

@item bootstrap
@item configure
There are no @code{bootstrap} and @code{configure} phase because erlang
packages typically don’t need to be configured.

@item build
This phase runs @code{rebar3 compile} with the flags listed in
@code{#:rebar-flags}.

@item check
Unless @code{#:tests? #f} is passed, this phase runs @code{rebar3 eunit}, or
some other target specified with @code{#:test-target}, with the flags listed
in @code{#:rebar-flags},

@item install
This installs the files created in the @i{default} profile, or some other
profile specified with @code{#:install-profile}.

@end table
@end defvr

@defvr {Variable Scheme} texlive-build-system
Esta variable se exporta en @code{(guix build-system texlive)}. Se usa para
construir paquetes TeX en modo de procesamiento de lotes con el motor
especificado. El sistema de construcción proporciona valor a la variable
@env{TEXINPUTS} para encontrar todos los archivos de fuentes TeX en las
entradas.

Por defecto ejecuta @code{luatex} en todos los archivos que terminan en
@code{ins}. Un motor y formato diferente puede especificarse con el
parámetro @code{#:tex-format}. Los diferentes objetivos de construcción
pueden especificarse con el parámetro @code{#:build-targets}, que espera una
lista de nombres de archivo. El sistema de construcción añade únicamente
@code{texlive-bin} y @code{texlive-latex-base} (ambos desde @code{(gnu
packages tex)} a las entradas. Ambos pueden forzarse con los parámetros
@code{#:texlive-bin} y @code{#:texlive-latex-base} respectivamente.

El parámetro @code{#:tex-directory} le dice al sistema de construcción dónde
instalar los archivos construidos bajo el árbol texmf.
@end defvr

@defvr {Variable Scheme} ruby-build-system
Esta variable se exporta en @code{(guix build-system ruby)}. Implementa el
procedimiento de construcción de RubyGems usado por los paquetes Ruby, que
implica la ejecución de @code{gem build} seguida de @code{gem install}.

El campo @code{source} de un paquete que usa este sistema de construcción
típicamente se refiere a un archivo gem, ya que este es el formato usado por
las desarrolladoras Ruby cuando publican su software. El sistema de
construcción desempaqueta el archivo gem, potencialmente parchea las
fuentes, ejecuta la batería de pruebas, vuelve a empaquetar el archivo gem y
lo instala. Adicionalmente, se puede hacer referencia a directorios y
archivadores tar para permitir la construcción de archivos gem no publicados
desde Git o un archivador tar de publicación de fuentes tradicional.

Se puede especificar el paquete Ruby usado mediante el parámetro
@code{#:ruby}. Una lista de opciones adicionales pueden pasarse a la orden
@command{gem} en el parámetro @code{#:gem-flags}.
@end defvr

@defvr {Variable Scheme} waf-build-system
Esta variable se exporta en @code{(guix build-system waf)}. Implementa un
procedimiento de construcción alrededor del guión @code{waf}. Las fases
comunes---@code{configure}, @code{build} y @code{install}---se implementan
pasando sus nombres como parámetros al guión @code{waf}.

El guión @code{waf} es ejecutado por el intérprete Python. El paquete Python
usado para la ejecución puede ser especificado con el parámetro
@code{#:python}.
@end defvr

@defvr {Variable Scheme} scons-build-system
Esta variable se exporta en @code{(guix build-system scons)}. Implementa en
procedimiento de construcción usado por la herramienta de construcción de
software SCons. Este sistema de construcción ejecuta @code{scons} para
construir el paquete, @code{scons test} para ejecutar las pruebas y después
@code{scons install} para instalar el paquete.

Las opciones adicionales a pasar a @code{scons} se pueden especificar con el
parámetro @code{#:scons-flags}. Los objetivos predeterminados de
construcción (build) e instalación (install) pueden modificarse con
@code{#:build-targets} y @code{#:install-targets} respectivamente. La
versión de Python usada para ejecutar SCons puede especificarse
seleccionando el paquete SCons apropiado con el parámetro @code{#:scons}.
@end defvr

@defvr {Variable Scheme} haskell-build-system
Esta variable se exporta en @code{(guix build-system haskell)}. Implementa
el procedimiento de construcción Cabal usado por paquetes Haskell, el cual
implica la ejecución de @code{runhaskell Setup.hs configure
--prefix=/gnu/store/@dots{}} y @code{runhaskell Setup.hs build}. En vez de
instalar el paquete ejecutando @code{runhaskell Setup.hs install}, para
evitar el intento de registro de bibliotecas en el directorio de
solo-lectura del compilador en el almacén, el sistema de construcción usa
@code{runhaskell Setup.hs copy}, seguido de @code{runhaskell Setup.hs
register}. Además, el sistema de construcción genera la documentación del
paquete ejecutando @code{runhaskell Setup.hs haddock}, a menos que se pasase
@code{#:haddock? #f}. Parámetros opcionales de Haddock pueden proporcionarse
con la ayuda del parámetro @code{#:haddock-flags}. Si el archivo
@code{Setup.hs} no es encontrado, el sistema de construcción busca
@code{Setup.lhs} a su vez.

El compilador Haskell usado puede especificarse con el parámetro
@code{#:haskell} cuyo valor predeterminado es @code{ghc}.
@end defvr

@defvr {Variable Scheme} dub-build-system
Esta variable se exporta en @code{(guix build-system dub)}. Implementa el
procedimiento de construcción Dub usado por los paquetes D, que implica la
ejecución de @code{dub build} y @code{dub run}. La instalación se lleva a
cabo con la copia manual de los archivos.

El compilador D usado puede ser especificado con el parámetro @code{#:ldc}
cuyo valor predeterminado es @code{ldc}.
@end defvr

@anchor{emacs-build-system}
@defvr {Variable Scheme} emacs-build-system
Esta variable se exporta en @code{(guix build-system emacs)}. Implementa un
procedimiento de instalación similar al propio sistema de empaquetado de
Emacs (@pxref{Packages,,, emacs, The GNU Emacs Manual}).

Primero crea el archivo @code{@var{paquete}-autoloads.el}, tras lo que
compila todos los archivos Emacs Lisp. De manera diferente al sistema de
paquetes de Emacs, los archivos de documentación Info se mueven al
directorio estándar de documentación y se borra el archivo @file{dir}. Los
archivos del paquete Elisp se instalan directamente en
@file{share/emacs/site-lisp}.
@end defvr

@defvr {Variable Scheme} font-build-system
Esta variable se exporta en @code{(guix build-system font)}. Implementa un
procedimiento de instalación para paquetes de fuentes donde las proveedoras
originales proporcionan archivos de tipografía TrueType, OpenType, etc.@:
precompilados que simplemente necesitan copiarse en su lugar. Copia los
archivos de tipografías a las localizaciones estándar en el directorio de
salida.
@end defvr

@defvr {Variable Scheme} meson-build-system
Esta variable se exporta en @code{(guix build-system meson)}. Implementa el
procedimiento de construcción para paquetes que usan
@url{https://mesonbuild.com, Meson} como su sistema de construcción.

It adds both Meson and @uref{https://ninja-build.org/, Ninja} to the set of
inputs, and they can be changed with the parameters @code{#:meson} and
@code{#:ninja} if needed.

Este sistema de construcción es una extensión de @var{gnu-build-system},
pero con las siguientes fases cambiadas por otras específicas para Meson:

@table @code

@item configure
Esta fase ejecuta @code{meson} con las opciones especificadas en
@code{#:configure-flags}. La opción @option{--buildtype} recibe el valor
@code{debugoptimized} excepto cuando se especifique algo distinto en
@code{#:build-type}.

@item build
Esta fase ejecuta @code{ninja} para construir el paquete en paralelo por
defecto, pero esto puede cambiarse con @code{#:parallel-build?}.

@item check
The phase runs @samp{meson test} with a base set of options that cannot be
overridden.  This base set of options can be extended via the
@code{#:test-options} argument, for example to select or skip a specific
test suite.

@item install
Esta fase ejecuta @code{ninja install} y no puede cambiarse.
@end table

Aparte de estas, el sistema de ejecución también añade las siguientes fases:

@table @code

@item fix-runpath
This phase ensures that all binaries can find the libraries they need.  It
searches for required libraries in subdirectories of the package being
built, and adds those to @code{RUNPATH} where needed.  It also removes
references to libraries left over from the build phase by @code{meson}, such
as test dependencies, that aren't actually required for the program to run.

@item glib-or-gtk-wrap
Esta fase es la fase proporcionada por @code{glib-or-gtk-build-system}, y no
está activa por defecto. Puede activarse con @code{#:glib-or-gtk}.

@item glib-or-gtk-compile-schemas
Esta fase es la fase proporcionada por @code{glib-or-gtk-build-system}, y no
está activa por defecto. Puede activarse con @code{#:glib-or-gtk}.
@end table
@end defvr

@defvr {Variable Scheme} linux-module-build-system
@var{linux-module-build-system} permite la construcción de módulos del
núcleo Linux.

@cindex fases de construcción
Este sistema de construcción es una extensión de @var{gnu-build-system},
pero con las siguientes fases cambiadas:

@table @code

@item configure
Esta fase configura el entorno de modo que el Makefile del núcleo Linux
pueda usarse para la construcción del módulo externo del núcleo.

@item build
Esta fase usa el Makefile del núcleo Linux para construir el módulo externo
del núcleo.

@item install
Esta fase usa el Makefile del núcleo Linux para instalar el módulo externo
del núcleo.
@end table

Es posible y útil especificar el núcleo Linux usado para la construcción del
módulo (para ello debe usar el parámetro @code{#:linux} a través de la forma
@code{arguments} en un paquete que use @code{linux-module-build-system}).
@end defvr

@defvr {Variable Scheme} node-build-system
Esta variable se exporta en @code{(guix build-system node)}. Implementa el
procedimiento de construcción usado por @uref{https://nodejs.org, Node.js},
que implementa una aproximación de la orden @code{npm install}, seguida de
una orden @code{npm test}.

El paquete Node.js usado para interpretar las órdenes @code{npm} puede
especificarse a través del parámetro @code{#:node} cuyo valor predeterminado
es @code{node}.
@end defvr

Por último, para paquetes que no necesiten nada tan sofisticado se
proporciona un sistema de construcción ``trivial''. Es trivial en el sentido
de que no proporciona prácticamente funcionalidad: no incorpora entradas
implícitas y no tiene una noción de fases de construcción.

@defvr {Variable Scheme} trivial-build-system
Esta variable se exporta en @code{(guix build-system trivial)}.

Este sistema de construcción necesita un parámetro @code{#:builder}. Este
parámetro debe ser una expresión Scheme que construya la(s) salida(s) del
paquete---como en @code{build-expression->derivation} (@pxref{Derivaciones,
@code{build-expression->derivation}}).
@end defvr

@defvr {Scheme Variable} channel-build-system
This variable is exported by @code{(guix build-system channel)}.

This build system is meant primarily for internal use.  A package using this
build system must have a channel specification as its @code{source} field
(@pxref{Canales}); alternatively, its source can be a directory name, in
which case an additional @code{#:commit} argument must be supplied to
specify the commit being built (a hexadecimal string).

The resulting package is a Guix instance of the given channel, similar to
how @command{guix time-machine} would build it.
@end defvr

@node Fases de construcción
@section Fases de construcción

@cindex fases de construcción, para paquetes
Prácticamente todos los sistemas de construcción de paquetes implementan una
noción de @dfn{fases de construcción}: una secuencia de acciones ejecutadas
por el sistema de construcción, cuando usted construya el paquete, que
conducen a la instalación de su producción en el almacén. Una excepción
notable es el sistema de construcción trivial @code{trivial-build-system}
(@pxref{Sistemas de construcción}).

As discussed in the previous section, those build systems provide a standard
list of phases.  For @code{gnu-build-system}, the main build phases are the
following:

@table @code
@item set-paths
Define search path environment variables for all the input packages,
including @env{PATH} (@pxref{Search Paths}).

@item unpack
Extrae el archivador tar de la fuente, y cambia el directorio actual al
directorio recién extraído. Si la fuente es realmente un directorio, lo
copia al árbol de construcción y entra en ese directorio.

@item patch-source-shebangs
Sustituye secuencias ``#!'' encontradas al inicio de los archivos de fuentes
para que hagan referencia a los nombres correctos de archivos del
almacén. Por ejemplo, esto cambia @code{#!/bin/sh} por
@code{#!/gnu/store/@dots{}-bash-4.3/bin/sh}.

@item configure
Ejecuta el guión @file{configure} con algunas opciones predeterminadas, como
@option{--prefix=/gnu/store/@dots{}}, así como las opciones especificadas
por el parámetro @code{#:configure-flags}.

@item build
Ejecuta @code{make} con la lista de opciones especificadas en
@code{#:make-flags}. Si el parámetro @code{#:parallel-build?} es verdadero
(por defecto), construye con @code{make -j}.

@item check
Ejecuta @code{make check}, u otro objetivo especificado con
@code{#:test-target}, a menos que se pasase @code{#:tests? #f}. Si el
parámetro @code{#:parallel-tests?} es verdadero (por defecto), ejecuta
@code{make check -j}.

@item install
Ejecuta @code{make install} con las opciones enumeradas en
@code{#:make-flags}.

@item patch-shebangs
Sustituye las secuencias ``#!'' en los archivos ejecutables instalados.

@item strip
Extrae los símbolos de depuración de archivos ELF (a menos que el valor de
@code{#:strip-binaries?} sea falso), y los copia a la salida @code{debug}
cuando esté disponible (@pxref{Instalación de archivos de depuración}).

@cindex RUNPATH, validation
@anchor{phase-validate-runpath}
@item validate-runpath
Validate the @code{RUNPATH} of ELF binaries, unless
@code{#:validate-runpath?} is false (@pxref{Sistemas de construcción}).

This validation step consists in making sure that all the shared libraries
needed by an ELF binary, which are listed as @code{DT_NEEDED} entries in its
@code{PT_DYNAMIC} segment, appear in the @code{DT_RUNPATH} entry of that
binary.  In other words, it ensures that running or using those binaries
will not result in a ``file not found'' error at run time.  @xref{Options,
@option{-rpath},, ld, The GNU Linker}, for more information on
@code{RUNPATH}.

@end table

Other build systems have similar phases, with some variations.  For example,
@code{cmake-build-system} has same-named phases but its @code{configure}
phases runs @code{cmake} instead of @code{./configure}.  Others, such as
@code{python-build-system}, have a wholly different list of standard
phases.  All this code runs on the @dfn{build side}: it is evaluated when
you actually build the package, in a dedicated build process spawned by the
build daemon (@pxref{Invocación de guix-daemon}).

Las fases de construcción se representan como listas asociativas o
``alists'' (@pxref{Association Lists,,, guile, GNU Guile Reference Manual})
donde cada clave es un símbolo que nombra a la fase y el valor asociado es
un procedimiento que acepta un número arbitrario de parámetros. Por
convención, estos procedimientos reciben información sobre la construcción
en forma de @dfn{parámetros que usan palabras clave}, de los cuales pueden
hacer uso o ignorarlos.

@vindex %standard-phases
Por ejemplo, esta es la forma en la que @code{(guix build gnu-build-system)}
define @code{%standard-phases}, la variable que contiene su lista asociativa
de fases de construcción@footnote{Presentamos una visión simplificada de las
fases de dichas construcción, ¡eche un vistazo al módulo @code{(guix build
gnu-build-system)} para ver todos los detalles!}:

@lisp
;; Las fases de construcción de 'gnu-build-system'.

(define* (unpack #:key source #:allow-other-keys)
  ;; Extracción del archivador tar de las fuentes.
  (invoke "tar" "xvf" source))

(define* (configure #:key outputs #:allow-other-keys)
  ;; Ejecución del guión 'configure'. Instalación de la salida
  ;; en "out".
  (let ((out (assoc-ref outputs "out")))
    (invoke "./configure"
            (string-append "--prefix=" out))))

(define* (build #:allow-other-keys)
  ;; Compilación.
  (invoke "make"))

(define* (check #:key (test-target "check") (tests? #true)
                #:allow-other-keys)
  ;; Ejecución de la batería de pruebas.
  (if tests?
      (invoke "make" test-target)
      (display "test suite not run\n")))

(define* (install #:allow-other-keys)
  ;; Instalación de los archivos en el prefijo especificado
  ;; al guión 'configure'.
  (invoke "make" "install"))

(define %standard-phases
  ;; La lista de las fases estándar (algunas se omiten por
  ;; brevedad). Cada elemento es un par símbolo/procedimiento.
  (list (cons 'unpack unpack)
        (cons 'configure configure)
        (cons 'build build)
        (cons 'check check)
        (cons 'install install)))
@end lisp

Aquí se muestra como @code{%standard-phases} se define como una lista de
pares símbolo/procedimiento (@pxref{Pairs,,, guile, GNU Guile Reference
Manual}). El primer par asocia el procedimiento @code{unpack} con el símbolo
@code{unpack}---un nombre; el segundo par define de manera similar la fase
@code{configure}, etcétera. Cuando se construye un paquete que usa
@code{gnu-build-system}, con su lista predeterminada de fases, estas fases
se ejecutan de manera secuencial. Puede ver el nombre de cada fase a su
inicio y tras su finalización en el registro de construcción de los paquetes
que construya.

Echemos un vistazo a los propios procedimientos. Cada uno se define con
@code{define*}: @code{#:key} enumera parámetros con palabras clave que el
procedimiento acepta, con la posibilidad de proporcionar un valor
predeterminado, y @code{#:allow-other-keys} especifica que se ignora
cualquier otra palabra clave en los parámetros (@pxref{Optional Arguments,,,
guile, GNU Guile Reference Manual}).

El procedimiento @code{unpack} utiliza el valor proporcionado al parámetro
@code{source}, usado por el sistema de construcción usa para proporcionar el
nombre de archivo del archivador de fuentes (o la copia de trabajo del
sistema de control de versiones), e ignora otros parámetros. La fase
@code{configure} únicamente tiene en cuenta el parámetro @code{outputs}, una
lista asociativa de nombres de salida de paquetes con su nombre de archivo
en el almacén (@pxref{Paquetes con múltiples salidas}). Para ello se extrae
el nombre de archivo de @code{out}, la salida predeterminada, y se lo
proporciona a la orden @command{./configure} como el prefijo de la
instalación (@code{./configure --prefix=@var{out}}), lo que significa que
@command{make install} acabará copiando todos los archivos en dicho
directorio (@pxref{Configuration, configuration and makefile conventions,,
standards, GNU Coding Standards}). Tanto @code{build} como @code{install}
ignoran todos los parámetros. @code{check} utiliza el parámetro
@code{test-target}, que especifica el nombre del objetivo del archivo
Makefile que debe ejecutarse para ejecutar las pruebas; se imprime un
mensaje y se omiten las pruebas cuando el parámetro @code{tests?} tiene
falso como valor.

@cindex fases de construcción, personalización
Se puede cambiar con el parámetro @code{#:phases} la lista de fases usada
por el sistema de construcción para un paquete en particular. El cambio del
conjunto de fases de construcción se realiza mediante la construcción de una
nueva lista asociativa basada en la lista asociativa @code{%standard-phases}
descrita previamente. Esto se puede llevar a cabo con procedimientos
estándar para la manipulación de listas asociativas como @code{alist-delete}
(@pxref{SRFI-1 Association Lists,,, guile, GNU Guile Reference Manual}); no
obstante es más conveniente hacerlo con @code{modify-phases} (@pxref{Utilidades de construcción, @code{modify-phases}}).

Aquí se encuentra un ejemplo de una definición de paquete que borra la fase
@code{configure} de @code{%standard-phases} e inserta una nueva fase antes
de la fase @code{build}, llamada @code{proporciona-prefijo-en-makefile}:

@lisp
(define-public example
  (package
    (name "example")
    ;; other fields omitted
    (build-system gnu-build-system)
    (arguments
     '(#:phases (modify-phases %standard-phases
                  (delete 'configure)
                  (add-before 'build 'set-prefix-in-makefile
                    (lambda* (#:key outputs #:allow-other-keys)
                      ;; Modify the makefile so that its
                      ;; 'PREFIX' variable points to "out".
                      (let ((out (assoc-ref outputs "out")))
                        (substitute* "Makefile"
                          (("PREFIX =.*")
                           (string-append "PREFIX = "
                                          out "\n")))))))))))
@end lisp

La nueva fase insertada se escribe como un procedimiento anónimo, generado
con @code{lambda*}; usa el parámetro @code{outputs} visto
anteriormente. @xref{Utilidades de construcción} para obtener más información sobre las
funciones auxiliares usadas en esta fase y donde encontrará más ejemplos de
uso de @code{modify-phases}.

@cindex fases de evaluación, preparación de código para otras
@cindex preparación de código para otras fases de evaluación
Tenga en cuenta que las fases de construcción son código que se evalúa
cuando se realiza la construcción real del paquete. Esto explica por qué la
expresión @code{modify-phases} al completo se encuentra escapada (viene
precedida de @code{'}, un apóstrofe): se ha @dfn{preparado} para una
ejecución posterior. @xref{Expresiones-G} para obener una explicación sobre
esta preparación del código para las distintas fases de ejecución y los
distintos @dfn{estratos de código} implicados.

@node Utilidades de construcción
@section Utilidades de construcción

En cuanto empiece a escribir definiciones de paquete no-triviales
(@pxref{Definición de paquetes}) u otras acciones de construcción
(@pxref{Expresiones-G}), es probable que empiece a buscar funciones
auxiliares parecidas a las habituales en el intérprete de ordenes---creación
de directorios, borrado y copia recursiva de archivos, manipulación de fases
de construcción, etcétera. El módulo @code{(guix build utils)} proporciona
dichos procedimientos auxiliares.

La mayoría de sistemas de construcción cargan @code{(guix build utils)}
(@pxref{Sistemas de construcción}). Por tanto, cuando construya fases de construcción
personalizadas para sus definiciones de paquetes, habitualmente puede asumir
que dichos procedimientos ya han sido incorporados al ámbito de ejecución.

Cuando escriba G-expressions, puede importar @code{(guix build utils)} en el
``lado de la construcción'' mediante el uso @code{with-imported-modules} e
importandolos al ámbito actual con la forma sintáctica @code{use-modules}
(@pxref{Using Guile Modules,,, guile, GNU Guile Reference Manual}):

@lisp
(with-imported-modules '((guix build utils))  ; Se importa.
  (computed-file "empty-tree"
                 #~(begin
                     ;; Se añade al ámbito actual.
                     (use-modules (guix build utils))

                     ;; Se usa su procedimiento 'mkdir-p'.
                     (mkdir-p (string-append #$output "/a/b/c")))))
@end lisp

El resto de esta sección es la referencia de la mayoría de las
procedimientos de utilidad proporcionados por @code{(guix build utils)}.

@c TODO Document what's missing.

@subsection Tratamiento de nombres de archivo del almacén

Esta sección documenta procedimientos para el manejo de nombres de archivo
del almacén.

@deffn {Procedimiento Scheme} %store-directory
Devuelve el nombre del directorio del almacén.
@end deffn

@deffn {Procedimiento Scheme} store-file-name? @var{archivo}
Devuelve verdadero si @var{archivo} está en el almacén.
@end deffn

@deffn {Procedimiento Scheme} strip-store-file-name @var{archivo}
Elimina @file{/gnu/store} y el hash de @var{archivo}, un nombre de archivo
del almacén. El resultado es habitualmente una cadena
@code{"@var{paquete}-@var{versión}"}.
@end deffn

@deffn {Procedimiento Scheme} package-name>name+version @var{nombre}
Cuando se proporciona @var{nombre}, un nombre de paquete como
@code{"foo-0.9.1b"}, devuelve dos valores: @code{"foo"} y
@code{"0.9.1b"}. Cuando la perte de la versión no está disponible, se
devuelve @var{nombre} y @code{#f}. Se considera que el primer guión seguido
de un dígito introduce la parte de la versión.
@end deffn

@subsection Tipos de archivo

Los siguientes procedimientos tratan con archivos y tipos de archivos.

@deffn {Procedimiento Scheme} directory-exists? @var{dir}
Devuelve @code{#t} si @var{dir} existe y es un directorio.
@end deffn

@deffn {Procedimiento Scheme} executable-file @var{archivo}
Devuelve @code{#t} si @var{archivo} existe y es ejecutable.
@end deffn

@deffn {Procedimiento Scheme} symbolic-link= @var{archivo}
Devuelve @code{#t} si @var{archivo} es enlace simbólico (``symlink'').
@end deffn

@deffn {Procedimiento Scheme} elf-file? @var{archivo}
@deffnx {Procedimiento Scheme} ar-file? @var{archivo}
@deffnx {Procedimiento Scheme} gzip-file? @var{archivo}
Devuelve @code{#t} si @var{archivo} es, respectivamente, un archivo ELF, un
archivador @code{ar} (como una biblioteca estática @file{.a}), o un archivo
comprimido con gzip.
@end deffn

@deffn {Procedimiento Scheme} reset-gzip-timestamp @var{archivo} [#:keep-mtime? #t]
Si @var{archivo} es un archivo gzip, reinicia su marca de tiempo embebida
(como con @command{gzip --no-name}) y devuelve un valor verdadero. En otro
caso devuelve @code{#f}. Cuando @var{keep-mtime?} es verdadero, se preserva
el tiempo de modificación del @var{archivo}.
@end deffn

@subsection Manipulación de archivos

Los siguientes procedimientos y macros sirven de ayuda en la creación,
modificación y borrado de archivos. Proporcionan funcionalidades comparables
con las herrambientas comunes del intérprete de órdenes como @command{mkdir
-p}, @command{cp -r}, @command{rm -r} y @command{sed}. Sirven de complemento
a la interfaz de sistema de archivos de Guile, la cual es extensa pero de
bajo nivel (@pxref{POSIX,,, guile, GNU Guile Reference Manual}).

@deffn {Sintaxis Scheme} with-directory-excursion @var{directorio} @var{cuerpo}@dots{}
Ejecuta @var{cuerpo} con @var{directorio} como el directorio actual del
proceso.

Esecialmente este macro cambia el directorio actual a @var{directorio} antes
de evaluar @var{cuerpo}, usando @code{chdir} (@pxref{Processes,,, guile, GNU
Guile Reference Manual}). Se vuelve al directorio inicial en cuanto se
abandone el ámbito dinámico de @var{cuerpo}, ya sea a través de su
finalización normal o de una salida no-local como pueda ser una excepción.
@end deffn

@deffn {Procedimiento Scheme} mkdir-p @var{dir}
Crea el directorio @var{dir} y todos sus predecesores.
@end deffn

@deffn {Procedimiento Scheme} install-file @var{archivo} @var{directorio}
Crea @var{directorio} si no existe y copia @var{archivo} allí con el mismo
nombre.
@end deffn

@deffn {Procedimiento Scheme} make-file-writable @var{archivo}
Activa el permiso de escritura en @var{archivo} para su propietaria.
@end deffn

@deffn {Procedimiento Scheme} copy-recursively @var{fuente} @var{destino} @
  [#:log (current-output-port)] [#:follow-symlinks? #f] @ [#:copy-file
copy-file] [#:keep-mtime? #f] [#:keep-permissions? #t] Copy @var{source}
directory to @var{destination}.  Follow symlinks if @var{follow-symlinks?}
is true; otherwise, just preserve them.  Call @var{copy-file} to copy
regular files.  When @var{keep-mtime?} is true, keep the modification time
of the files in @var{source} on those of @var{destination}.  When
@var{keep-permissions?} is true, preserve file permissions.  Write verbose
output to the @var{log} port.
@end deffn

@deffn {Procedimiento Scheme} delete-file-recursively @var{dir} @
  [#:follow-mounts? #f]
Borra @var{dir} recursivamente, como @command{rm -rf}, sin seguir los
enlaces simbólicos. No atraviesa puntos de montaje tampoco, a no ser que
@var{follow-mounts?} sea verdadero. Informa de los errores, pero no devuelve
error por ellos.
@end deffn

@deffn {Sintaxis Scheme} substitute @var{archivo} @
  ((@var{expreg} @var{var-encontrada}@dots{}) @var{cuerpo}@dots{}) @dots{}

Sustituye @var{expreg} en @var{archivo} con la cadena que devuelve
@var{cuerpo}. La evaluación de @var{cuerpo} se realiza con cada
@var{var-encontrada} asociada con la subexpresión posicional correspondiente
de la expresión regular. Por ejemplo:

@lisp
(substitute* file
  (("hello")
   "good morning\n")
  (("foo([a-z]+)bar(.*)$" all letters end)
   (string-append "baz" letters end)))
@end lisp

En este ejemplo, cada ver que una línea de @var{archivo} contiene
@code{hola}, esto se sustituye por @code{buenos días}. Cada vez que una
línea del @var{archivo} corresponde con la segunda expresión regular,
@code{todo} se asocia con la cadena encontrada al completo, @code{letras}
toma el valor de la primera sub-expresión, y @code{fin} se asocia con la
última.

Cuando una de las @var{var-encontrada} es @code{_}, no se asocia ninguna
variable con la correspondiente subcadena.

También puede proporcionarse una lista como @var{archivo}, en cuyo caso los
nombres de archivo que contenga serán los que se sometan a las
sustituciones.

Tenga cuidado con el uso de @code{$} para marcar el final de una línea; la
cadena encontrada no contiene el caracter de salto de línea al final.
@end deffn

@subsection Búsqueda de archivos

@cindex archivo, buscar
Esta sección documenta procedimientos de búsqueda y filtrado de archivos.

@deffn {Procedimiento Scheme} file-name-predicate @var{expreg}
Devuelve un predicado que devuelve un valor verdadero cuando el nombre del
archivo proporcionado sin la parte del directorio corresponde con
@var{expreg}.
@end deffn

@deffn {Procedimiento Scheme} find-files @var{dir} [@var{pred}] @
  [#:stat lstat] [#:directories? #f] [#:fail-on-error? #f]
Devuelve una lista ordenada lexicográficamente de los archivos que se
encuentran en @var{dir} para los cuales @var{pred} devuelve verdadero. Se le
proporcionan dos parámetros a @var{pred}: la ruta absoluta del archivo y su
búfer de stat; el predicado predeteminado siempre devuelve
verdadero. @var{pred} también puede ser una expresión regular, en cuyo caso
es equivalente a escribir @code{(file-name-predicate
@var{pred})}. @var{stat} se usa para obtener información del archivo; el uso
de @code{lstat} significa que no se siguen los enlaces simbólicos. Si
@var{directories?} es verdadero se incluyen también los directorios. Si
@var{fail-on-error?} es verdadero, se emite una excepción en caso de error.
@end deffn

Aquí se pueden encontrar algunos ejemplos en los que se asume que el
directorio actual es la raíz del arbol de fuentes de Guix:

@lisp
;; Enumera todos los archivos regulares en el directorio actual.
(find-files ".")
@result{} ("./.dir-locals.el" "./.gitignore" @dots{})

;; Enumera todos los archivos .scm en gnu/services.
(find-files "gnu/services" "\\.scm$")
@result{} ("gnu/services/admin.scm" "gnu/services/audio.scm" @dots{})

;; Enumera los archivos ar en el directorio actual.
(find-files "." (lambda (file stat) (ar-file? file)))
@result{} ("./libformat.a" "./libstore.a" @dots{})
@end lisp

@deffn {Procedimiento Scheme} which @var{programa}
Devuelve el nombre de archivo completo para @var{programa} tal y como se
encuentra en @code{$PATH}, o @code{#f} si no se ha encontrado
@var{programa}.
@end deffn

@deffn {Scheme Procedure} search-input-file @var{inputs} @var{name}
@deffnx {Scheme Procedure} search-input-directory @var{inputs} @var{name}
Return the complete file name for @var{name} as found in @var{inputs};
@code{search-input-file} searches for a regular file and
@code{search-input-directory} searches for a directory.  If @var{name} could
not be found, an exception is raised.

Here, @var{inputs} must be an association list like @code{inputs} and
@code{native-inputs} as available to build phases (@pxref{Fases de construcción}).
@end deffn

Here is a (simplified) example of how @code{search-input-file} is used in a
build phase of the @code{wireguard-tools} package:

@lisp
(add-after 'install 'wrap-wg-quick
  (lambda* (#:key inputs outputs #:allow-other-keys)
    (let ((coreutils (string-append (assoc-ref inputs "coreutils")
                                    "/bin")))
      (wrap-program (search-input-file outputs "bin/wg-quick")
        #:sh (search-input-file inputs "bin/bash")
        `("PATH" ":" prefix ,(list coreutils))))))
@end lisp

@subsection Program Invocation

@cindex program invocation, from Scheme
@cindex invoking programs, from Scheme
You'll find handy procedures to spawn processes in this module, essentially
convenient wrappers around Guile's @code{system*} (@pxref{Processes,
@code{system*},, guile, GNU Guile Reference Manual}).

@deffn {Scheme Procedure} invoke @var{program} @var{args}@dots{}
Invoke @var{program} with the given @var{args}.  Raise an
@code{&invoke-error} exception if the exit code is non-zero; otherwise
return @code{#t}.

The advantage compared to @code{system*} is that you do not need to check
the return value.  This reduces boilerplate in shell-script-like snippets
for instance in package build phases.
@end deffn

@deffn {Scheme Procedure} invoke-error? @var{c}
Return true if @var{c} is an @code{&invoke-error} condition.
@end deffn

@deffn {Scheme Procedure} invoke-error-program @var{c}
@deffnx {Scheme Procedure} invoke-error-arguments @var{c}
@deffnx {Scheme Procedure} invoke-error-exit-status @var{c}
@deffnx {Scheme Procedure} invoke-error-term-signal @var{c}
@deffnx {Scheme Procedure} invoke-error-stop-signal @var{c}
Access specific fields of @var{c}, an @code{&invoke-error} condition.
@end deffn

@deffn {Scheme Procedure} report-invoke-error @var{c} [@var{port}]
Report to @var{port} (by default the current error port) about @var{c}, an
@code{&invoke-error} condition, in a human-friendly way.

Typical usage would look like this:

@lisp
(use-modules (srfi srfi-34) ;for 'guard'
             (guix build utils))

(guard (c ((invoke-error? c)
           (report-invoke-error c)))
  (invoke "date" "--imaginary-option"))

@print{} command "date" "--imaginary-option" failed with status 1
@end lisp
@end deffn

@deffn {Scheme Procedure} invoke/quiet @var{program} @var{args}@dots{}
Invoke @var{program} with @var{args} and capture @var{program}'s standard
output and standard error.  If @var{program} succeeds, print nothing and
return the unspecified value; otherwise, raise a @code{&message} error
condition that includes the status code and the output of @var{program}.

Here's an example:

@lisp
(use-modules (srfi srfi-34) ;for 'guard'
             (srfi srfi-35) ;for 'message-condition?'
             (guix build utils))

(guard (c ((message-condition? c)
           (display (condition-message c))))
  (invoke/quiet "date")  ;all is fine
  (invoke/quiet "date" "--imaginary-option"))

@print{} 'date --imaginary-option' exited with status 1; output follows:

    date: unrecognized option '--imaginary-option'
    Try 'date --help' for more information.
@end lisp
@end deffn

@subsection Fases de construcción

@cindex fases de construcción
@code{(guix build utils)} también contiene herramientas para la manipulación
de las fases de construcción usadas por los sistemas de construcción
(@pxref{Sistemas de construcción}). Las fases de construcción se representan como
listas asociativas o ``alists'' (@pxref{Association Lists,,, guile, GNU
Guile Reference Manual}) donde cada clave es un símbolo que nombra a la
fase, y el valor asociado es un procedimiento (@pxref{Fases de construcción}).

Tanto el propio Guile como el módulo @code{(srfi srfi-1)} proporcionan
herramientas para la manipulación de listas asociativas. El módulo
@code{(guix build utils)} complementa estas con herramientas pensadas para
las fases de construcción.

@cindex fases de construcción, modificación
@deffn {Sintaxis Scheme} modify-phases @var{fases} @var{cláusula}@dots{}
Modifica @var{fases} de manera secuencial com cada indique cada
@var{cláusula}, que puede tener una de las siguentes formas:

@lisp
(delete @var{nombre-fase})
(replace @var{nombre-fase} @var{nueva-fase})
(add-before @var{nombre-fase} @var{nombre-nueva-fase} @var{nueva-fase})
(add-after @var{nombre-fase} @var{nombre-nueva-fase} @var{nueva-fase})
@end lisp

Donde cada @var{nombre-fase} y @var{nombre-nueva-fase} es una expresión que
evalúa aun símbolo, y @var{nueva-fase} es una expresión que evalúa a un
procedimiento.
@end deffn

El siguiente ejemplo se ha tomado de la definición del paquete
@code{grep}. Añade una fase que se ejecuta tras la fase @code{install},
llamada @code{fix-egrep-and-fgrep}. Dicha fase es un procedimiento
(@code{lambda*} genera procedimientos anónimos) que toma un parámetro de
palabra clave @code{#:outputs} e ignora el resto (@pxref{Optional Arguments,,, guile, GNU Guile Reference Manual} para obtener más información
sobre @code{lambda*} y los parámetros opcionales y de palabras clave). La
fase usa @code{substitute*} para modificar los guiones @file{egrep} y
@file{fgrep} instalados para que hagan referencia a @code{grep} con su ruta
de archivo absoluta:

@lisp
(modify-phases %standard-phases
  (add-after 'install 'fix-egrep-and-fgrep
    ;; Patch 'egrep' and 'fgrep' to execute 'grep' via its
    ;; absolute file name instead of searching for it in $PATH.
    (lambda* (#:key outputs #:allow-other-keys)
      (let* ((out (assoc-ref outputs "out"))
             (bin (string-append out "/bin")))
        (substitute* (list (string-append bin "/egrep")
                           (string-append bin "/fgrep"))
          (("^exec grep")
           (string-append "exec " bin "/grep")))))))
@end lisp

En el siguiente ejemplo se modifican las fases de dos maneras: se elimina la
fase estándar @code{configure}, posiblemente porque el paquete no tiene un
guión @file{configure} ni nada similar, y la fase @code{install}
predeterminada se sustituye por una que copia manualmente el archivo
ejecutable que se debe instalar:

@lisp
(modify-phases %standard-phases
  (delete 'configure)      ;no 'configure' script
  (replace 'install
    (lambda* (#:key outputs #:allow-other-keys)
      ;; The package's Makefile doesn't provide an "install"
      ;; rule so do it by ourselves.
      (let ((bin (string-append (assoc-ref outputs "out")
                                "/bin")))
        (install-file "footswitch" bin)
        (install-file "scythe" bin)))))
@end lisp

@c TODO: Add more examples.

@subsection Wrappers

@cindex program wrappers
@cindex wrapping programs
It is not unusual for a command to require certain environment variables to
be set for proper functioning, typically search paths (@pxref{Search Paths}).  Failing to do that, the command might fail to find files or other
commands it relies on, or it might pick the ``wrong'' ones---depending on
the environment in which it runs.  Examples include:

@itemize
@item
a shell script that assumes all the commands it uses are in @env{PATH};

@item
a Guile program that assumes all its modules are in @env{GUILE_LOAD_PATH}
and @env{GUILE_LOAD_COMPILED_PATH};

@item
a Qt application that expects to find certain plugins in
@env{QT_PLUGIN_PATH}.
@end itemize

For a package writer, the goal is to make sure commands always work the same
rather than depend on some external settings.  One way to achieve that is to
@dfn{wrap} commands in a thin script that sets those environment variables,
thereby ensuring that those run-time dependencies are always found.  The
wrapper would be used to set @env{PATH}, @env{GUILE_LOAD_PATH}, or
@env{QT_PLUGIN_PATH} in the examples above.

To ease that task, the @code{(guix build utils)} module provides a couple of
helpers to wrap commands.

@deffn {Scheme Procedure} wrap-program @var{program} @
  [#:sh @var{sh}] [#:rest @var{variables}] Make a wrapper for @var{program}.
@var{variables} should look like this:

@lisp
'(@var{variable} @var{delimiter} @var{position} @var{list-of-directories})
@end lisp

where @var{delimiter} is optional.  @code{:} will be used if @var{delimiter}
is not given.

For example, this call:

@lisp
(wrap-program "foo"
              '("PATH" ":" = ("/gnu/.../bar/bin"))
              '("CERT_PATH" suffix ("/gnu/.../baz/certs"
                                    "/qux/certs")))
@end lisp

will copy @file{foo} to @file{.foo-real} and create the file @file{foo} with
the following contents:

@example
#!location/of/bin/bash
export PATH="/gnu/.../bar/bin"
export CERT_PATH="$CERT_PATH$@{CERT_PATH:+:@}/gnu/.../baz/certs:/qux/certs"
exec -a $0 location/of/.foo-real "$@@"
@end example

If @var{program} has previously been wrapped by @code{wrap-program}, the
wrapper is extended with definitions for @var{variables}.  If it is not,
@var{sh} will be used as the interpreter.
@end deffn

@deffn {Scheme Procedure} wrap-script @var{program} @
  [#:guile @var{guile}] [#:rest @var{variables}] Wrap the script @var{program}
such that @var{variables} are set first.  The format of @var{variables} is
the same as in the @code{wrap-program} procedure.  This procedure differs
from @code{wrap-program} in that it does not create a separate shell
script.  Instead, @var{program} is modified directly by prepending a Guile
script, which is interpreted as a comment in the script's language.

Special encoding comments as supported by Python are recreated on the second
line.

Note that this procedure can only be used once per file as Guile scripts are
not supported.
@end deffn

@node Search Paths
@section Search Paths

@cindex search path
Many programs and libraries look for input data in a @dfn{search path}, a
list of directories: shells like Bash look for executables in the command
search path, a C compiler looks for @file{.h} files in its header search
path, the Python interpreter looks for @file{.py} files in its search path,
the spell checker has a search path for dictionaries, and so on.

Search paths can usually be defined or overridden @i{via} environment
variables (@pxref{Environment Variables,,, libc, The GNU C Library Reference
Manual}).  For example, the search paths mentioned above can be changed by
defining the @env{PATH}, @env{C_INCLUDE_PATH}, @env{PYTHONPATH} (or
@env{GUIX_PYTHONPATH}), and @env{DICPATH} environment variables---you know,
all these something-PATH variables that you need to get right or things
``won't be found''.

You may have noticed from the command line that Guix ``knows'' which search
path environment variables should be defined, and how.  When you install
packages in your default profile, the file
@file{~/.guix-profile/etc/profile} is created, which you can ``source'' from
the shell to set those variables.  Likewise, if you ask @command{guix shell}
to create an environment containing Python and NumPy, a Python library, and
if you pass it the @option{--search-paths} option, it will tell you about
@env{PATH} and @env{GUIX_PYTHONPATH} (@pxref{Invoking guix shell}):

@example
$ guix shell python python-numpy --pure --search-paths
export PATH="/gnu/store/@dots{}-profile/bin"
export GUIX_PYTHONPATH="/gnu/store/@dots{}-profile/lib/python3.9/site-packages"
@end example

When you omit @option{--search-paths}, it defines these environment
variables right away, such that Python can readily find NumPy:

@example
$ guix shell python python-numpy -- python3
Python 3.9.6 (default, Jan  1 1970, 00:00:01)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.20.3'
@end example

For this to work, the definition of the @code{python} package
@emph{declares} the search path it cares about and its associated
environment variable, @env{GUIX_PYTHONPATH}.  It looks like this:

@lisp
(package
  (name "python")
  (version "3.9.9")
  ;; some fields omitted...
  (native-search-paths
   (list (search-path-specification
          (variable "GUIX_PYTHONPATH")
          (files (list "lib/python/3.9/site-packages"))))))
@end lisp

What this @code{native-search-paths} field says is that, when the
@code{python} package is used, the @env{GUIX_PYTHONPATH} environment
variable must be defined to include all the
@file{lib/python/3.9/site-packages} sub-directories encountered in its
environment.  (The @code{native-} bit means that, if we are in a
cross-compilation environment, only native inputs may be added to the search
path; @pxref{Referencia de package, @code{search-paths}}.)  In the NumPy example
above, the profile where @code{python} appears contains exactly one such
sub-directory, and @env{GUIX_PYTHONPATH} is set to that.  When there are
several @file{lib/python/3.9/site-packages}---this is the case in package
build environments---they are all added to @env{GUIX_PYTHONPATH}, separated
by colons (@code{:}).

@quotation Nota
Notice that @env{GUIX_PYTHONPATH} is specified as part of the definition of
the @code{python} package, and @emph{not} as part of that of
@code{python-numpy}.  This is because this environment variable ``belongs''
to Python, not NumPy: Python actually reads the value of that variable and
honors it.

Corollary: if you create a profile that does not contain @code{python},
@code{GUIX_PYTHONPATH} will @emph{not} be defined, even if it contains
packages that provide @file{.py} files:

@example
$ guix shell python-numpy --search-paths --pure
export PATH="/gnu/store/@dots{}-profile/bin"
@end example

This makes a lot of sense if we look at this profile in isolation: no
software in this profile would read @env{GUIX_PYTHONPATH}.
@end quotation

Of course, there are many variations on that theme: some packages honor more
than one search path, some use separators other than colon, some accumulate
several directories in their search path, and so on.  A more complex example
is the search path of libxml2: the value of the @env{XML_CATALOG_FILES}
environment variable is space-separated, it must contain a list of
@file{catalog.xml} files (not directories), which are to be found in
@file{xml} sub-directories---nothing less.  The search path specification
looks like this:

@lisp
(package
  (name "libxml2")
  ;; some fields omitted
  (native-search-paths
   (list (search-path-specification
          (variable "XML_CATALOG_FILES")
          (separator " ")
          (files '("xml"))
          (file-pattern "^catalog\\.xml$")
          (file-type 'regular)))))
@end lisp

Worry not, search path specifications are usually not this tricky.

The @code{(guix search-paths)} module defines the data type of search path
specifications and a number of helper procedures.  Below is the reference of
search path specifications.

@deftp {Data Type} search-path-specification
The data type for search path specifications.

@table @asis
@item @code{variable}
The name of the environment variable for this search path (a string).

@item @code{files}
The list of sub-directories (strings) that should be added to the search
path.

@item @code{separator} (default: @code{":"})
The string used to separate search path components.

As a special case, a @code{separator} value of @code{#f} specifies a
``single-component search path''---in other words, a search path that cannot
contain more than one element.  This is useful in some cases, such as the
@code{SSL_CERT_DIR} variable (honored by OpenSSL, cURL, and a few other
packages) or the @code{ASPELL_DICT_DIR} variable (honored by the GNU Aspell
spell checker), both of which must point to a single directory.

@item @code{file-type} (default: @code{'directory})
The type of file being matched---@code{'directory} or @code{'regular},
though it can be any symbol returned by @code{stat:type} (@pxref{File System, @code{stat},, guile, GNU Guile Reference Manual}).

In the libxml2 example above, we would match regular files; in the Python
example, we would match directories.

@item @code{file-pattern} (default: @code{#f})
This must be either @code{#f} or a regular expression specifying files to be
matched @emph{within} the sub-directories specified by the @code{files}
field.

Again, the libxml2 example shows a situation where this is needed.
@end table
@end deftp

Some search paths are not tied by a single package but to many packages.  To
reduce duplications, some of them are pre-defined in @code{(guix
search-paths)}.

@defvr {Scheme Variable} $SSL_CERT_DIR
@defvrx {Scheme Variable} $SSL_CERT_FILE
These two search paths indicate where X.509 certificates can be found
(@pxref{Certificados X.509}).
@end defvr

These pre-defined search paths can be used as in the following example:

@lisp
(package
  (name "curl")
  ;; some fields omitted ...
  (native-search-paths (list $SSL_CERT_DIR $SSL_CERT_FILE)))
@end lisp

How do you turn search path specifications on one hand and a bunch of
directories on the other hand in a set of environment variable definitions?
That's the job of @code{evaluate-search-paths}.

@deffn {Scheme Procedure} evaluate-search-paths @var{search-paths} @
  @var{directories} [@var{getenv}] Evaluate @var{search-paths}, a list of
search-path specifications, for @var{directories}, a list of directory
names, and return a list of specification/value pairs.  Use @var{getenv} to
determine the current settings and report only settings not already
effective.
@end deffn

The @code{(guix profiles)} provides a higher-level helper procedure,
@code{load-profile}, that sets the environment variables of a profile.

@node El almacén
@section El almacén

@cindex almacén
@cindex elementos del almacén
@cindex rutas del almacén

Conceptualmente, el @dfn{almacén} es el lugar donde se almacenan las
derivaciones cuya construcción fue satisfactoria---por defecto,
@file{/gnu/store}. Los subdirectorios en el almacén se denominan
@dfn{elementos del almacén} o @dfn{rutas del almacén} en ocasiones. El
almacén tiene una base de datos asociada que contiene información como las
rutas del almacén a las que referencia cada ruta del almacén, y la lista de
elementos @emph{válidos} del almacén---los resultados de las construcciones
satisfactorias. Esta base de datos reside en
@file{@var{localstatedir}/guix/db}, donde @var{localstatedir} es el
directorio de estado especificado @i{vía} @option{--localstatedir} en tiempo
de configuración, normalmente @file{/var}.

El almacén @emph{siempre} es accedido a través del daemon en delegación de
sus clientes (@pxref{Invocación de guix-daemon}). Para manipular el almacén, los
clientes se conectan al daemon por un socket de dominio Unix, le envían
peticiones y leen el resultado---esto son llamadas a procedimientos remotos,
o RPC.

@quotation Nota
Las usuarias @emph{nunca} deben modificar archivos directamente bajo el
directorio @file{/gnu/store}. Esto llevaría a inconsistencias y rompería las
premisas de inmutabilidad del modelo funcional de Guix
(@pxref{Introducción}).

@xref{Invocación de guix gc, @command{guix gc --verify}}, para información sobre
cómo comprobar la integridad del almacén e intentar recuperarse de
modificaciones accidentales.
@end quotation

El módulo @code{(guix store)} proporciona procedimientos para conectarse al
daemon y realizar RPCs. Estos se describen más adelante.  Por defecto,
@code{open-connection}, y por tanto todas las órdenes @command{guix}, se
conectan al daemon local o a la URI especificada en la variable de entorno
@env{GUIX_DAEMON_SOCKET}.

@defvr {Variable de entorno} GUIX_DAEMON_SOCKET
Cuando se ha definido, el valor de esta variable debe ser un nombre de
archivo o una URI designando el punto de conexión del daemon. Cuando es un
nombre de archivo, denota un socket de dominio Unix al que
conectarse. Además de nombres de archivos, los esquemas de URI aceptados
son:

@table @code
@item file
@itemx unix
Estos son equivalentes a los sockets de dominio
Unix. @code{file:///var/guix/daemon-socket/socket} es equivalente a
@file{/var/guix/daemon-socket/socket}.

@item guix
@cindex daemon, acceso remoto
@cindex acceso remoto al daemon
@cindex daemon, configuración en cluster
@cindex daemon, configuración en cluster
Estas URI denotan conexiones sobre TCP/IP, sin cifrado ni verificación de la
máquina remota. La URI debe especificar el nombre de máquina y opcionalmente
un número de puerto (por defecto se usa el puerto 44146):

@example
guix://principal.guix.example.org:1234
@end example

Esta configuración es apropiada para redes locales, como clusters, donde
únicamente los nodos de confianza pueden conectarse al daemon de
construcción en @code{principal.guix.example.org}.

La opción @option{--listen} de @command{guix-daemon} puede usarse para
indicarle que escuche conexiones TCP (@pxref{Invocación de guix-daemon,
@option{--listen}}).

@item ssh
@cindex acceso SSH a los daemons de construcción
These URIs allow you to connect to a remote daemon over SSH@.  This feature
requires Guile-SSH (@pxref{Requisitos}) and a working @command{guile}
binary in @env{PATH} on the destination machine.  It supports public key and
GSSAPI authentication.  A typical URL might look like this:

@example
ssh://carlos@@guix.example.org:22
@end example

Como con @command{guix copy}, se tienen en cuenta los archivos habituales de
configuración del cliente OpenSSH (@pxref{Invocación de guix copy}).
@end table

Esquemas URI adicionales pueden ser aceptados en el futuro.

@c XXX: Remove this note when the protocol incurs fewer round trips
@c and when (guix derivations) no longer relies on file system access.
@quotation Nota
La conexión con daemon de construcción remotos se considera experimental en
@value{VERSION}. Por favor, contacte con nosotras para compartir cualquier
problema o sugerencias que pueda tener (@pxref{Contribuir}).
@end quotation
@end defvr

@deffn {Procedimiento Scheme} open-connection [@var{uri}] [#:reserve-space? #t]
Abre una conexión al daemon a través del socket de dominio Unix apuntado por
@var{uri} (una cadena). Cuando @var{reserve-space?} es verdadero, le indica
que reserve un poco de espacio extra en el sistema de archivos de modo que
el recolector de basura pueda operar incluso cuando el disco se
llene. Devuelve un objeto servidor.

El valor por defecto de @var{uri} es @code{%default-socket-path}, que ese la
ruta esperada según las opciones proporcionadas a @code{configure}.
@end deffn

@deffn {Procedimiento Scheme} close-connection @var{servidor}
Cierra la conexión al @var{servidor}.
@end deffn

@defvr {Variable Scheme} current-build-output-port
Esta variable está enlazada a un parámetro SRFI-39, que referencia al puerto
donde los logs de construcción y error enviados por el daemon deben
escribirse.
@end defvr

Los procedimientos que realizan RPCs toman todos como primer parámetro un
objeto servidor.

@deffn {Procedimiento Scheme} valid-path? @var{servidor} @var{ruta}
@cindex elementos del almacén no válidos
Devuelve @code{#t} cuando @var{ruta} designa un elemento válido del almacén
y @code{#f} en otro caso (un elemento no-válido puede existir en el disco
pero aun así no ser válido, por ejemplo debido a que es el resultado de una
construcción que se interrumpió o falló).

Una condición @code{&store-protocol-error} se eleva si @var{ruta} no
contiene como prefijo el directorio del almacén (@file{/gnu/store}).
@end deffn

@deffn {Procedimiento Scheme} add-text-to-store @var{servidor} @var{nombre} @var{texto} [@var{referencias}]
Añade @var{texto} bajo el archivo @var{nombre} en el almacén, y devuelve su
ruta en el almacén. @var{referencias} es la lista de rutas del almacén a las
que hace referencia la ruta del almacén resultante.
@end deffn

@deffn {Procedimiento Scheme} build-derivations @var{almacén} @var{derivaciones} @
  [@var{modo}]
Construye @var{derivaciones}, una lista de objetos @code{<derivation>},
nombres de archivo @file{.drv}, o pares derivación/salida, usando el
@var{modo} especificado---@code{(build-mode normal)} en caso de omisión.
@end deffn

Fíjese que el módulo @code{(guix monads)} proporciona una mónada así como
versiones monádicas de los procedimientos previos, con el objetivo de hacer
más conveniente el trabajo con código que accede al almacén (@pxref{La mónada del almacén}).

@c FIXME
@i{Esta sección actualmente está incompleta.}

@node Derivaciones
@section Derivaciones

@cindex derivaciones
Las acciones de construcción a bajo nivel y el entorno en el que se realizan
se representan mediante @dfn{derivaciones}. Una derivación contiene las
siguientes piezas de información:

@itemize
@item
Las salidas de la derivación---las derivaciones producen al menos un archivo
o directorio en el almacén, pero pueden producir más.

@item
@cindex tiempo de construcción, dependencias
@cindex dependencias, tiempo de construcción
Las entradas de las derivaciones---es decir, sus dependencias de tiempo de
construcción---, que pueden ser otras derivaciones o simples archivos en el
almacén (parches, guiones de construcción, etc.).

@item
El tipo de sistema objetivo de la derivación---por ejemplo,
@code{x86_64-linux}.

@item
El nombre de archivo del guión de construcción en el almacén, junto a los
parámetros que se le deben pasar.

@item
Una lista de variables de entorno a ser definidas.

@end itemize

@cindex ruta de derivación
Las derivaciones permiten a los clientes del daemon comunicar acciones de
construcción al almacén. Existen en dos formas: como una representación en
memoria, tanto en el lado del cliente como el del daemon, y como archivos en
el almacén cuyo nombre termina en @file{.drv}---estos archivos se conocen
como @dfn{rutas de derivación}. Las rutas de derivación se pueden
proporcionar al procedimiento @code{build-derivations} para que realice las
acciones de construcción prescritas (@pxref{El almacén}).

@cindex derivaciones de salida fija
Operaciones como la descarga de archivos y las instantáneas de un control de
versiones para las cuales el hash del contenido esperado se conoce
previamente se modelan como @dfn{derivaciones de salida fija}. Al contrario
que las derivaciones normales, las salidas de una derivación de salida fija
son independientes de sus entradas---por ejemplo, la descarga del código
fuente produce el mismo resultado independientemente del método de descarga
y las herramientas usadas.

@cindex references
@cindex tiempo de ejecución, dependencias
@cindex dependencias, tiempo de ejecución
Las derivaciones de salida---es decir, los resultados de
construcción---tienen un conjunto de @dfn{referencias}, del que informa la
RPC @code{references} o la orden @command{guix gc --references}
(@pxref{Invocación de guix gc}). Las referencias son el conjunto de dependencias
en tiempo de ejecución de los resultados de construcción. Las referencias
son un subconjunto de las entradas de la derivación; el daemon de
construcción calcula este subconjunto de forma automática mediante el
procesado de todos los archivos en las salidas.

El módulo @code{(guix derivations)} proporciona una representación de
derivaciones como objetos Scheme, junto a procedimientos para crear y
manipular de otras formas derivaciones. La primitiva de más bajo nivel para
crear una derivación es el procedimiento @code{derivation}:

@deffn {Procedimiento Scheme} derivation @var{almacén} @var{nombre} @var{constructor} @
  @var{args} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @
  [#:recursive? #f] [#:inputs '()] [#:env-vars '()] @
  [#:system (%current-system)] [#:references-graphs #f] @
  [#:allowed-references #f] [#:disallowed-references #f] @
  [#:leaked-env-vars #f] [#:local-build? #f] @
  [#:substitutable? #t] [#:properties '()]
Construye una derivación con los parámetros proporcionados, y devuelve el
objeto @code{<derivation>} resultante.

Cuando se proporcionan @var{hash} y @var{hash-algo}, una @dfn{derivación de
salida fija} se crea---es decir, una cuyo resultado se conoce de antemano,
como la descarga de un archivo. Si, además, @var{recursive?} es verdadero,
entonces la salida fijada puede ser un archivo ejecutable o un directorio y
@var{hash} debe ser el hash de un archivador que contenga esta salida.

Cuando @var{references-graphs} es verdadero, debe ser una lista de pares de
nombre de archivo/ruta del almacén. En ese caso, el grafo de referencias de
cada ruta del almacén se exporta en el entorno de construcción del archivo
correspondiente, en un formato de texto simple.

Cuando @var{allowed-references} es verdadero, debe ser una lista de
elementos del almacén o salidas a las que puede hacer referencia la salida
de la derivación. Del mismo modo, @var{disallowed-references}, en caso de
ser verdadero, debe ser una lista de cosas a las que las salidas @emph{no}
pueden hacer referencia.

Cuando @var{leaked-env-vars} es verdadero, debe ser una lista de cadenas que
denoten variables de entorno que se permite ``escapar'' del entorno del
daemon al entorno de construcción. Esto es únicamente aplicable a
derivaciones de salida fija---es decir, cuando @var{hash} es verdadero. El
uso principal es permitir que variables como @code{http_proxy} sean pasadas
a las derivaciones que descargan archivos.

Cuando @var{local-build?} es verdadero, declara que la derivación no es una
buena candidata para delegación y debe ser construida localmente
(@pxref{Configuración de delegación del daemon}). Este es el caso para pequeñas derivaciones
donde los costes de transferencia de datos sobrepasarían los beneficios.

Cuando @var{substitutable?} es falso, declara que las sustituciones de la
salida de la derivación no deben usarse (@pxref{Sustituciones}). Esto es útil,
por ejemplo, cuando se construyen paquetes que capturan detalles sobre el
conjunto de instrucciones de la CPU anfitriona.

@var{properties} debe ser una lista asociada que describe ``propiedades'' de
la derivación. Debe mantenerse tal cual, sin interpretar, en la derivación.
@end deffn

@noindent
Esto es un ejemplo con un guión de shell como constructor, asumiendo que
@var{almacén} es una conexión abierta al daemon, @var{bash} apunta al
ejecutable Bash en el almacén:

@lisp
(use-modules (guix utils)
             (guix store)
             (guix derivations))

(let ((constructor   ; añade el guión de Bash al almacén
        (add-text-to-store store "mi-constructor.sh"
                           "echo hola mundo > $out\n" '())))
  (derivation almacen "foo"
              bash `("-e" ,builder)
              #:inputs `((,bash) (,constructor))
              #:env-vars '(("HOME" . "/sindirectorio"))))
@result{} #<derivation /gnu/store/@dots{}-foo.drv => /gnu/store/@dots{}-foo>
@end lisp

Como puede suponerse, el uso directo de esta primitiva es algo
enrevesado. Una mejor aproximación es escribir guiones de construcción en
Scheme, ¡por supuesto! La mejor forma de hacerlo es escribir el código de
construcción como una ``expresión-G'', y pasarla a
@code{gexp->derivation}. Para más información, @pxref{Expresiones-G}.

En otros tiempos, @code{gexp->derivation} no existía y la creación de
derivaciones con código de construcción escrito en Scheme se conseguía con
@code{build-expression->derivation}, documentada más adelante. Este
procedimiento está ahora obsoleto en favor del procedimiento
@code{gexp->derivation} mucho más conveniente.

@deffn {Procedimiento Scheme} build-expression->derivation @var{almacén} @
       @var{nombre} @var{exp} @
  [#:system (%current-system)] [#:inputs '()] @
  [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @
  [#:recursive? #f] [#:env-vars '()] [#:modules '()] @
  [#:references-graphs #f] [#:allowed-references #f] @
  [#:disallowed-references #f] @
  [#:local-build? #f] [#:substitutable? #t] [#:guile-for-build #f]
Devuelve una derivación que ejecuta la expresión Scheme @var{exp} como un
constructor para la derivación @var{nombre}. @var{inputs} debe ser una lista
de tuplas @code{(nombre ruta-drv sub-drv)}; cuando @var{sub-drv} se omite,
se asume @code{"out"}. @var{modules} es una lista de nombres de módulos
Guile de la ruta actual de búsqueda a copiar en el almacén, compilados, y
poner a disposición en la ruta de carga durante la ejecución de
@var{exp}---por ejemplo, @code{((guix build utils) (guix build
gnu-build-system))}.

@var{exp} se evalúa en un entorno donde @code{%outputs} está asociada a una
lista de pares salida/ruta, y donde @code{%build-inputs} está asociada a una
lista de pares cadena/ruta-de-salida que provienen de @var{inputs}. De
manera opcional, @var{env-vars} es una lista de pares de cadenas que
especifican el nombre y el valor de las variables de entorno visibles al
constructor. El constructor termina pasando el resultado de @var{exp} a
@code{exit}; por tanto, cuando @var{exp} devuelve @code{#f}, la construcción
se considera fallida.

@var{exp} se construye usando @var{guile-for-build} (una derivación). Cuando
@var{guile-for-build} se omite o es @code{#f}, el valor del fluido
@code{%guile-for-build} se usa en su lugar.

Véase el procedimiento @code{derivation} para el significado de
@var{references-graphs}, @var{allowed-references},
@var{disallowed-references}, @var{local-build?} y @var{substitutable?}.
@end deffn

@noindent
Aquí está un ejemplo de derivación de salida única que crea un directorio
que contiene un archivo:

@lisp
(let ((constructor '(let ((salida (assoc-ref %outputs "out")))
                      (mkdir salida)    ; crea /gnu/store/@dots{}-goo
                      (call-with-output-file (string-append salida "/prueba")
                        (lambda (p)
                          (display '(hola guix) p))))))
  (build-expression->derivation almacen "goo" constructor))

@result{} #<derivation /gnu/store/@dots{}-goo.drv => @dots{}>
@end lisp


@node La mónada del almacén
@section La mónada del almacén

@cindex mónada

Los procedimientos que operan en el almacén descritos en la sección previa
toman todos una conexión abierta al daemon de construcción en su primer
parámetro. Aunque el modelo subyacente es funcional, tienen o bien efectos
secundarios o dependen del estado actual del almacén.

Lo anterior es inconveniente: la conexión al daemon de construcción tiene
que proporcionarse en todas estas funciones, haciendo imposible la
composición de funciones que no toman ese parámetro con funciones que sí lo
hacen. Lo último puede ser problemático: ya que las operaciones del almacén
tienen efectos secundarios y/o dependen del estado externo, deben ser
secuenciadas de manera adecuada.

@cindex valores monádicos
@cindex funciones monádicas
Aquí es donde entra en juego el módulo @code{(guix monads)}. Este módulo
proporciona un entorno para trabajar con @dfn{mónadas}, y una mónada
particularmente útil para nuestros usos, la @dfn{mónada del almacén}. Las
mónadas son una construcción que permite dos cosas: asociar ``contexto'' con
valores (en nuestro caso, el contexto es el almacén), y la construcción de
secuencias de computaciones (aquí computaciones incluye accesos al
almacén). Los valores en una mónada---valores que transportan este contexto
adicional---se llaman @dfn{valores monádicos}; los procedimientos que
devuelven dichos valores se llaman @dfn{procedimientos monádicos}.

Considere este procedimiento ``normal'':

@lisp
(define (enlace-sh almacen)
  ;; Devuelve una derivación que enlaza el ejecutable 'bash'.
  (let* ((drv (package-derivation store bash))
         (out (derivation->output-path drv))
         (sh  (string-append out "/bin/bash")))
    (build-expression->derivation store "sh"
                                  `(symlink ,sh %output))))
@end lisp

Mediante el uso de @code{(guix monads)} y @code{(guix gexp)}, puede
reescribirse como una función monádica:

@lisp
(define (enlace-sh)
  ;; Lo mismo, pero devuelve un valor monádico.
  (mlet %store-monad ((drv (package->derivation bash)))
    (gexp->derivation "sh"
                      #~(symlink (string-append #$drv "/bin/bash")
                                 #$output))))
@end lisp

Hay varias cosas a tener en cuenta en la segunda versión: el parámetro
@code{store} ahora es implícito y es ``hilado en las llamadas a los
procedimientos monádicos @code{package->derivation} y
@code{gexp->derivation}, y el valor monádico devuelto por
@code{package->derivation} es @dfn{asociado} mediante el uso de @code{mlet}
en vez de un simple @code{let}.

Al final, la llamada a @code{package->derivation} puede omitirse ya que
tendrá lugar implícitamente, como veremos más adelante
(@pxref{Expresiones-G}):

@lisp
(define (enlace-sh)
  (gexp->derivation "sh"
                    #~(symlink (string-append #$bash "/bin/bash")
                               #$output)))
@end lisp

@c See
@c <https://syntaxexclamation.wordpress.com/2014/06/26/escaping-continuations/>
@c for the funny quote.
La ejecución del procedimiento monádico @code{enlace-para-sh} no tiene
ningún efecto. Como alguien dijo una vez, ``sales de una mónada como sales
de un edificio en llamas: corriendo'' (run en inglés). Por tanto, para salir
de la mónada y obtener el efecto deseado se debe usar @code{run-with-store}:

@lisp
(run-with-store (open-connection) (enlace-sh))
@result{} /gnu/store/...-enlace-para-sh
@end lisp

Note that the @code{(guix monad-repl)} module extends the Guile REPL with
new ``commands'' to make it easier to deal with monadic procedures:
@code{run-in-store}, and @code{enter-store-monad} (@pxref{Using Guix Interactively}).  The former is used to ``run'' a single monadic value
through the store:

@example
scheme@@(guile-user)> ,run-in-store (package->derivation hello)
$1 = #<derivation /gnu/store/@dots{}-hello-2.9.drv => @dots{}>
@end example

El último entra en un entorno interactivo recursivo, donde todos los valores
devueltos se ejecutan automáticamente a través del almacén:

@example
scheme@@(guile-user)> ,enter-store-monad
store-monad@@(guile-user) [1]> (package->derivation hello)
$2 = #<derivation /gnu/store/@dots{}-hello-2.9.drv => @dots{}>
store-monad@@(guile-user) [1]> (text-file "foo" "Hello!")
$3 = "/gnu/store/@dots{}-foo"
store-monad@@(guile-user) [1]> ,q
scheme@@(guile-user)>
@end example

@noindent
Fíjese que los valores no-monádicos no pueden devolverse en el entorno
interactivo @code{store-monad}.

Other meta-commands are available at the REPL, such as @code{,build} to
build a file-like object (@pxref{Using Guix Interactively}).

Las formas sintácticas principales para tratar con mónadas en general se
proporcionan por el módulo @code{(guix monads)} y se describen a
continuación.

@deffn {Sintaxis Scheme} with-monad @var{mónada} @var{cuerpo} ...
Evalúa cualquier forma @code{>>=} o @code{return} en @var{cuerpo} como
estando en @var{mónada}.
@end deffn

@deffn {Sintaxis Scheme} return @var{val}
Devuelve el valor monádico que encapsula @var{val}.
@end deffn

@deffn {Sintaxis Scheme} >>= @var{mval} @var{mproc} ...
@dfn{Asocia} el valor monádico @var{mval}, pasando su ``contenido'' a los
procedimientos monádicos @var{mproc}@dots{}@footnote{Esta operación es
habitualmente conocida como ``bind'' (asociación), pero ese nombre denota un
procedimiento no relacionado en Guile. Por tanto usamos este símbolo en
cierto modo críptico heredado del lenguaje Haskell.}. Puede haber un
@var{mproc} o varios, como en este ejemplo:

@lisp
(run-with-state
    (with-monad %state-monad
      (>>= (return 1)
           (lambda (x) (return (+ 1 x)))
           (lambda (x) (return (* 2 x)))))
  'un-estado)

@result{} 4
@result{} un-estado
@end lisp
@end deffn

@deffn {Sintaxis Scheme} mlet @var{mónada} ((@var{var} @var{mval}) ...) @
       @var{cuerpo} ...
@deffnx {Sintaxis Scheme} mlet* @var{mónada} ((@var{var} @var{mval}) ...) @
       @var{cuerpo} ... Asocia las variables @var{var} a los valores monádicos
@var{mval} en @var{cuerpo}, el cual es una secuencia de expresiones. Como
con el operador bind, esto puede pensarse como el ``desempaquetado'' del
valor crudo no-monádico dentro del ámbito del @var{cuerpo}. La forma
(@var{var} -> @var{val}) asocia @var{var} al valor ``normal'' @var{val},
como en @code{let}. Las operaciones de asociación ocurren en secuencia de
izquierda a derecha. La última expresión de @var{cuerpo} debe ser una
expresión monádica, y su resultado se convertirá en el resultado de
@code{mlet} o @code{mlet*} cuando se ejecute en la @var{mónada}.

@code{mlet*} es a @code{mlet} lo que @code{let*} es a @code{let}
(@pxref{Local Bindings,,, guile, GNU Guile Reference Manual}).
@end deffn

@deffn {Sistema Scheme} mbegin @var{mónada} @var{mexp} ...
Asocia @var{mexp} y las siguientes expresiones monádicas en secuencia,
devolviendo el resultado de la última expresión. Cada expresión en la
secuencia debe ser una expresión monádica.

Esto es similar a @code{mlet}, excepto que los valores devueltos por las
expresiones monádicas se ignoran. En ese sentido el funcionamiento es
análogo a @code{begin} pero aplicado a expresiones monádicas.
@end deffn

@deffn {Sistema Scheme} mwhen @var{condición} @var{mexp0} @var{mexp*} ...
Cuando @var{condición} es verdadero, evalúa la secuencia de expresiones
monádicas @var{mexp0}..@var{mexp*} como dentro de @code{mbegin}. Cuando
@var{condición} es falso, devuelve @code{*unespecified*} en la mónada
actual. Todas las expresiones en la secuencia deben ser expresiones
monádicas.
@end deffn

@deffn {Sistema Scheme} munless @var{condición} @var{mexp0} @var{mexp*} ...
Cuando @var{condición} es falso, evalúa la secuencia de expresiones
monádicas @var{mexp0}..@var{mexp*} como dentro de @code{mbegin}. Cuando
@var{condición} es verdadero, devuelve @code{*unespecified*} en la mónada
actual. Todas las expresiones en la secuencia deben ser expresiones
monádicas.
@end deffn

@cindex mónada de estado
El módulo @code{(guix monads)} proporciona la @dfn{mónada de estado}, que
permite que un valor adicional---el estado---sea @emph{hilado} a través de
las llamadas a procedimientos monádicos.

@defvr {Variable Scheme} %state-monad
La mónada de estado. Procedimientos en la mónada de estado pueden acceder y
cambiar el estado hilado.

Considere el siguiente ejemplo. El procedimiento @code{cuadrado} devuelve un
valor en la mónada de estado.

@lisp
(define (cuadrado x)
  (mlet %state-monad ((count (current-state)))
    (mbegin %state-monad
      (set-current-state (+ 1 count))
      (return (* x x)))))

(run-with-state (sequence %state-monad (map cuadrado (iota 3))) 0)
@result{} (0 1 4)
@result{} 3
@end lisp

Cuando se ``ejecuta'' a través de @code{%state-monad}, obtenemos un valor
adicional de estado, que es el número de llamadas a @code{cuadrado}.
@end defvr

@deffn {Procedimiento monádico} current-state
Devuelve el estado actual como un valor monádico.
@end deffn

@deffn {Procedimiento monádico} set-current-state @var{valor}
Establece el estado actual a @var{valor} y devuelve el estado previo como un
valor monádico.
@end deffn

@deffn {Procedimiento monádico} state-push @var{valor}
Apila @var{valor} al estado actual, que se asume que es una lista, y
devuelve el estado previo como un valor monádico.
@end deffn

@deffn {Procedimiento monádico} state-pop
Extrae un valor del estado actual y lo devuelve como un valor monádico. Se
asume que el estado es una lista.
@end deffn

@deffn {Procedimiento Scheme} run-with-state @var{mval} [@var{estado}]
Ejecuta un valor monádico @var{mval} comenzando con @var{estado} como el
estado inicial. Devuelve dos valores: el valor resultante y el estado
resultante.
@end deffn

La interfaz principal a la mónada del almacén, proporcionada por el módulo
@code{(guix store)}, es como sigue.

@defvr {Variable Scheme} %store-monad
La mónada del almacén---un alias para @code{%state-monad}.

Los valores en la mónada del almacén encapsulan los accesos al
almacén. Cuando su efecto es necesario, un valor de la mónada del almacén
será ``evaluado'' cuando se proporcione al procedimiento
@code{run-with-store} (véase a continuación).
@end defvr

@deffn {Procedimiento Scheme} run-with-store @var{almacén} @var{mval} [#:guile-for-build] [#:system (%current-system)]
Ejecuta @var{mval}, un valor monádico en la mónada del almacén, en
@var{almacén}, una conexión abierta al almacén.
@end deffn

@deffn {Procedimiento monádico} text-file @var{nombre} @var{texto} [@var{referencias}]
Devuelve como un valor monádico el nombre absoluto del archivo en el almacén
del archivo que contiene @var{ŧexto}, una cadena. @var{referencias} es una
lista de elementos del almacén a los que el archivo de texto referencia; su
valor predeterminado es la lista vacía.
@end deffn

@deffn {Procedimiento monádico} binary-file @var{nombre} @var{datos} [@var{referencias}]
Devuelve como un valor monádico el nombre absoluto del archivo en el almacén
del archivo que contiene @var{datos}, un vector de bytes. @var{referencias}
es una lista de elementos del almacén a los que el archivo binario
referencia; su valor predeterminado es la lista vacía.
@end deffn

@deffn {Procedimiento monádico} interned-file @var{archivo} [@var{nombre}] @
         [#:recursive? #t] [#:select? (const #t)]
Devuelve el nombre del @var{archivo} una vez internado en el almacén. Usa
@var{nombre} como su nombre del almacén, o el nombre base de @var{archivo}
si @var{nombre} se omite.

Cuando @var{recursive?} es verdadero, los contenidos del @var{archivo} se
añaden recursivamente; si @var{archivo} designa un archivo plano y
@var{recursive?} es verdadero, sus contenidos se añaden, y sus bits de
permisos se mantienen.

Cuando @var{recursive?} es verdadero, llama a @code{(@var{select?}
@var{archivo} @var{stat})} por cada entrada del directorio, donde
@var{archivo} es el nombre absoluto de archivo de la entrada y @var{stat} es
el resultado de @code{lstat}; excluyendo las entradas para las cuales
@var{select?} no devuelve verdadero.

El ejemplo siguiente añade un archivo al almacén, bajo dos nombres
diferentes:

@lisp
(run-with-store (open-connection)
  (mlet %store-monad ((a (interned-file "README"))
                      (b (interned-file "README" "LEGU-MIN")))
    (return (list a b))))

@result{} ("/gnu/store/rwm@dots{}-README" "/gnu/store/44i@dots{}-LEGU-MIN")
@end lisp

@end deffn

El módulo @code{(guix packages)} exporta los siguientes procedimientos
monádicos relacionados con paquetes:

@deffn {Procedimiento monádico} package-file @var{paquete} [@var{archivo}] @
       [#:system (%current-system)] [#:target #f] @
  [#:output "out"]
Devuelve como un valor monádico el nombre absoluto de archivo de
@var{archivo} dentro del directorio de salida @var{output} del
@var{paquete}. Cuando se omite @var{archivo}, devuelve el nombre del
directorio de salida @var{output} del @var{paquete}. Cuando @var{target} es
verdadero, se usa como una tripleta de compilación cruzada.

Tenga en cuenta que este procedimiento @emph{no} construye
@var{paquete}. Por lo tanto, el resultado puede designar o no un archivo
existente. Le recomendamos que no use este procedimiento a no ser que sepa
qué está haciendo.
@end deffn

@deffn {Procedimiento monádico} package->derivation @var{paquete} [@var{sistema}]
@deffnx {Procedimiento monádico} package->cross-derivation @var{paquete} @
          @var{objetivo} [@var{sistema}]
Versión monádica de @code{package-derivation} y
@code{package-cross-derivation} (@pxref{Definición de paquetes}).
@end deffn


@node Expresiones-G
@section Expresiones-G

@cindex expresión-G
@cindex escape de código de construcción
Por tanto tenemos ``derivaciones'', que representan una secuencia de
acciones de construcción a realizar para producir un elemento en el almacén
(@pxref{Derivaciones}). Estas acciones de construcción se llevan a cabo
cuando se solicita al daemon construir realmente la derivación; se ejecutan
por el daemon en un contenedor (@pxref{Invocación de guix-daemon}).

@cindex fases de evaluación, preparación de código para otras
@cindex preparación de código para otras fases de evaluación
@cindex estratos de código
No debería ser ninguna sorpresa que nos guste escribir estas acciones de
construcción en Scheme. Cuando lo hacemos, terminamos con dos @dfn{estratos}
de código Scheme@footnote{El término @dfn{estrato} en este contexto se debe
a Manuel Serrano et al.@: en el contexto de su trabajo en Hop. Oleg
Kiselyov, quien ha escrito profundos
@url{http://okmij.org/ftp/meta-programming/#meta-scheme, ensayos sobre el
tema}, se refiere a este tipo de generación de código como separación en
etapas o @dfn{staging}.}: el ``código anfitrión''---código que define
paquetes, habla al daemon, etc.---y el ``código de construcción''---código
que realmente realiza las acciones de construcción, como la creación de
directorios, la invocación de @command{make}, etcétera (@pxref{Fases de construcción}).

Para describir una derivación y sus acciones de construcción, típicamente se
necesita embeber código de construcción dentro del código anfitrión. Se
resume en la manipulación de código de construcción como datos, y la
homoiconicidad de Scheme---el código tiene representación directa como
datos---es útil para ello. Pero necesitamos más que el mecanismo normal de
@code{quasiquote} en Scheme para construir expresiones de construcción.

El módulo @code{(guix gexp)} implementa las @dfn{expresiones-G}, una forma
de expresiones-S adaptada para expresiones de construcción. Las
expresiones-G, o @dfn{gexps}, consiste esencialmente en tres formas
sintácticas: @code{gexp}, @code{ungexp} y @code{ungexp-splicing} (o
simplemente: @code{#~}, @code{#$} y @code{#$@@}), que son comparables a
@code{quasiquote}, @code{unquote} y @code{unquote-splicing}, respectivamente
(@pxref{Expression Syntax, @code{quasiquote},, guile, GNU Guile Reference
Manual}). No obstante, hay importantes diferencias:

@itemize
@item
Las expresiones-G están destinadas a escribirse en un archivo y ser
ejecutadas o manipuladas por otros procesos.

@item
Cuando un objeto de alto nivel como un paquete o una derivación se expande
dentro de una expresión-G, el resultado es el mismo que la introducción de
su nombre de archivo de salida.

@item
Las expresiones-G transportan información acerca de los paquetes o
derivaciones que referencian, y estas referencias se añaden automáticamente
como entradas al proceso de construcción que las usa.
@end itemize

@cindex bajada de nivel, de objetos de alto nivel en expresiones-G
Este mecanismo no se limita a objetos de paquete ni derivación: pueden
definirse @dfn{compiladores} capaces de ``bajar el nivel'' de otros objetos
de alto nivel a derivaciones o archivos en el almacén, de modo que esos
objetos puedan introducirse también en expresiones-G. Por ejemplo, un tipo
útil de objetos de alto nivel que pueden insertarse en una expresión-G son
los ``objetos tipo-archivo'', los cuales facilitan la adición de archivos al
almacén y su referencia en derivaciones y demás (vea @code{local-file} y
@code{plain-file} más adelante).

Para ilustrar la idea, aquí está un ejemplo de expresión-G:

@lisp
(define exp-construccion
  #~(begin
      (mkdir #$output)
      (chdir #$output)
      (symlink (string-append #$coreutils "/bin/ls")
               "enumera-archivos")))
@end lisp

Esta expresión-G puede pasarse a @code{gexp->derivation}; obtenemos una
derivación que construye un directorio que contiene exactamente un enlace
simbólico a @file{/gnu/store/@dots{}-coreutils-8.22/bin/ls}:

@lisp
(gexp->derivation "la-cosa" exp-construccion)
@end lisp

Como se puede esperar, la cadena @code{"/gnu/store/@dots{}-coreutils-8.22"}
se sustituye por la referencia al paquete @var{coreutils} en el código de
construcción real, y @var{coreutils} se marca automáticamente como una
entrada a la derivación. Del mismo modo, @code{#$output} (equivalente a
@code{(ungexp output)}) se reemplaza por una cadena que contiene el nombre
del directorio de la salida de la derivación.

@cindex compilación cruzada
En un contexto de compilación cruzada, es útil distinguir entre referencias
a construcciones @emph{nativas} del paquete---que pueden ejecutarse en el
sistema anfitrión---de referencias de compilaciones cruzadas de un
paquete. Para dicho fin, @code{#+} tiene el mismo papel que @code{#$}, pero
es una referencia a una construcción nativa del paquete:

@lisp
(gexp->derivation "vi"
   #~(begin
       (mkdir #$output)
       (mkdir (string-append #$output "/bin"))
       (system* (string-append #+coreutils "/bin/ln")
                "-s"
                (string-append #$emacs "/bin/emacs")
                (string-append #$output "/bin/vi")))
   #:target "aarch64-linux-gnu")
@end lisp

@noindent
En el ejemplo previo, se usa la construcción nativa de @var{coreutils}, de
modo que @command{ln} pueda realmente ejecutarse en el anfitrión; pero se
hace referencia a la construcción de compilación cruzada de @var{emacs}.

@cindex módulos importados, para expresiones-G
@findex with-imported-modules
Otra característica de las expresiones-G son los @dfn{módulos importados}: a
veces deseará ser capaz de usar determinados módulos Guile del ``entorno
anfitrión'' en la expresión-G, de modo que esos módulos deban ser importados
en el ``entorno de construcción''. La forma @code{with-imported-modules} le
permite expresarlo:

@lisp
(let ((build (with-imported-modules '((guix build utils))
               #~(begin
                   (use-modules (guix build utils))
                   (mkdir-p (string-append #$output "/bin"))))))
  (gexp->derivation "directorio-vacio"
                    #~(begin
                        #$build
                        (display "éxito!\n")
                        #t)))
@end lisp

@noindent
En este ejemplo, el módulo @code{(guix build utils)} se incorpora
automáticamente dentro del entorno de construcción aislado de nuestra
expresión-G, de modo que @code{(use-modules (guix build utils))} funciona
como se espera.

@cindex clausura de módulos
@findex source-module-closure
De manera habitual deseará que la @emph{clausura} del módulo se importe---es
decir, el módulo en sí y todos los módulos de los que depende---en vez del
módulo únicamente; si no se hace, cualquier intento de uso del módulo
fallará porque faltan módulos dependientes. El procedimiento
@code{source-module-closure} computa la clausura de un módulo mirando en las
cabeceras de sus archivos de fuentes, lo que es útil en este caso:

@lisp
(use-modules (guix modules))   ;para 'source-module-closure'

(with-imported-modules (source-module-closure
                         '((guix build utils)
                           (gnu build image)))
  (gexp->derivation "something-with-vms"
                    #~(begin
                        (use-modules (guix build utils)
                                     (gnu build image))
                        @dots{})))
@end lisp

@cindex extensiones, para expresiones G
@findex with-extensions
De la misma manera, a veces deseará importar no únicamente módulos puros de
Scheme, pero también ``extensiones'' como enlaces Guile a bibliotecas C u
otros paquetes ``completos''. Si, digamos, necesitase el paquete
@code{guile-json} disponible en el lado de construcción, esta sería la forma
de hacerlo:

@lisp
(use-modules (gnu packages guile))  ;para 'guile-json'

(with-extensions (list guile-json)
  (gexp->derivation "algo-con-json"
                    #~(begin
                        (use-modules (json))
                        @dots{})))
@end lisp

La forma sintáctica para construir expresiones-G se resume a continuación.

@deffn {Sintaxis Scheme} #~@var{exp}
@deffnx {Sintaxis Scheme} (gexp @var{exp})
Devuelve una expresión-G que contiene @var{exp}. @var{exp} puede contener
una o más de las siguientes formas:

@table @code
@item #$@var{obj}
@itemx (ungexp @var{obj})
Introduce una referencia a @var{obj}. @var{obj} puede tener uno de los tipos
permitidos, por ejemplo un paquete o derivación, en cuyo caso la forma
@code{ungexp} se substituye por el nombre de archivo de su salida---por
ejemplo, @code{"/gnu/store/@dots{}-coreutils-8.22}.

Si @var{obj} es una lista, se recorre y las referencias a objetos permitidos
se substituyen de manera similar.

Si @var{obj} es otra expresión-G, su contenido se inserta y sus dependencias
se añaden a aquellas de la expresión-G que la contiene.

Si @var{obj} es otro tipo de objeto, se inserta tal cual es.

@item #$@var{obj}:@var{salida}
@itemx (ungexp @var{obj} @var{salida})
Como la forma previa, pero referenciando explícitamente la @var{salida} de
@var{obj}---esto es útil cuando @var{obj} produce múltiples salidas
(@pxref{Paquetes con múltiples salidas}).

@item #+@var{obj}
@itemx #+@var{obj}:salida
@itemx (ungexp-native @var{obj})
@itemx (ungexp-native @var{obj} @var{salida})
Igual que @code{ungexp}, pero produce una referencia a la construcción
@emph{nativa} de @var{obj} cuando se usa en un contexto de compilación
cruzada.

@item #$output[:@var{salida}]
@itemx (ungexp output [@var{salida}])
Inserta una referencia a la salida de la derivación @var{salida}, o a la
salida principal cuando @var{salida} se omite.

Esto únicamente tiene sentido para expresiones-G pasadas a
@code{gexp->derivation}.

@item #$@@@var{lst}
@itemx (ungexp-splicing @var{lst})
Lo mismo que la forma previa, pero expande el contenido de la lista
@var{lst} como parte de la lista que la contiene.

@item #+@@@var{lst}
@itemx (ungexp-native-splicing @var{lst})
Lo mismo que la forma previa, pero hace referencia a las construcciones
nativas de los objetos listados en @var{lst}.

@end table

Las expresiones-G creadas por @code{gexp} o @code{#~} son objetos del tipo
@code{gexp?} en tiempo de ejecución (véase a continuación).
@end deffn

@deffn {Sintaxis Scheme} with-imported-modules @var{módulos} @var{cuerpo}@dots{}
Marca las expresiones-G definidas en el @var{cuerpo}@dots{} como si
requiriesen @var{módulos} en su entorno de ejecución.

Cada elemento en @var{módulos} puede ser el nombre de un módulo, como
@code{(guix build utils)}, o puede ser el nombre de un módulo, seguido de
una flecha, seguido de un objeto tipo-archivo:

@lisp
`((guix build utils)
  (guix gcrypt)
  ((guix config) => ,(scheme-file "config.scm"
                                  #~(define-module @dots{}))))
@end lisp

@noindent
En el ejemplo previo, los dos primeros módulos se toman de la ruta de
búsqueda, y el último se crea desde el objeto tipo-archivo proporcionado.

Esta forma tiene ámbito @emph{léxico}: tiene efecto en las expresiones-G
definidas en @var{cuerpo}@dots{}, pero no en aquellas definidas, digamos, en
procedimientos llamados por @var{cuerpo}@dots{}.
@end deffn

@deffn {Sintaxis Scheme} with-extensions @var{extensiones} @var{cuerpo}@dots{}
Marca que las expresiones definidas en @var{cuerpo}@dots{} requieren
@var{extensiones} en su entorno de construcción y
ejecución. @var{extensiones} es típicamente una lista de objetos de paquetes
como los que se definen en el módulo @code{(gnu packages guile)}.

De manera concreta, los paquetes listados en @var{extensiones} se añaden a
la ruta de carga mientras se compilan los módulos importados en
@var{cuerpo}@dots{}; también se añaden a la ruta de carga en la expresión-G
devuelta por @var{cuerpo}@dots{}.
@end deffn

@deffn {Procedimiento Scheme} gexp? @var{obj}
Devuelve @code{#t} si @var{obj} es una expresión-G.
@end deffn

Las expresiones-G están destinadas a escribirse en disco, tanto en código
que construye alguna derivación, como en archivos planos en el almacén. Los
procedimientos monádicos siguientes le permiten hacerlo (@pxref{La mónada del almacén}, para más información sobre mónadas).

@deffn {Procedimiento monádico} gexp->derivation @var{nombre} @var{exp} @
       [#:system (%current-system)] [#:target #f] [#:graft? #t] @
  [#:hash #f] [#:hash-algo #f] @
  [#:recursive? #f] [#:env-vars '()] [#:modules '()] @
  [#:module-path @code{%load-path}] @
  [#:effective-version "2.2"] @
  [#:references-graphs #f] [#:allowed-references #f] @
  [#:disallowed-references #f] @
  [#:leaked-env-vars #f] @
  [#:script-name (string-append @var{nombre} "-builder")] @
  [#:deprecation-warnings #f] @
  [#:local-build? #f] [#:substitutable? #t] @
  [#:properties '()] [#:guile-for-build #f]
Devuelve una derivación @var{nombre} que ejecuta @var{exp} (una expresión-G)
con @var{guile-for-build} (una derivación) en el sistema @var{system};
@var{exp} se almacena en un archivo llamado @var{script-name}. Cuando
@var{target} tiene valor verdadero, se usa como tripleta de compilación
cruzada para paquetes a los que haga referencia @var{exp}.

@var{modules} está obsoleto en favor de @code{with-imported-modules}. Su
significado es hacer que los módulos @var{modules} estén disponibles en el
contexto de evaluación de @var{exp}; @var{modules} es una lista de nombres
de módulos Guile buscados en @var{module-path} para ser copiados al almacén,
compilados y disponibles en la ruta de carga durante la ejecución de
@var{exp}---por ejemplo, @code{((guix build utils) (gui build
gnu-build-system))}.

@var{effective-version} determina la cadena usada cuando se añaden las
extensiones de @var{exp} (vea @code{with-extensions}) a la ruta de
búsqueda---por ejemplo, @code{"2.2"}.

@var{graft?} determina si los paquetes a los que @var{exp} hace referencia
deben ser injertados cuando sea posible.

Cuando @var{references-graphs} es verdadero, debe ser una lista de tuplas de
una de las formas siguientes:

@example
(@var{nombre-archivo} @var{paquete})
(@var{nombre-archivo} @var{paquete} @var{salida})
(@var{nombre-archivo} @var{derivación})
(@var{nombre-archivo} @var{derivación} @var{salida})
(@var{nombre-archivo} @var{elemento-almacén})
@end example

El lado derecho de cada elemento de @var{references-graphs} se convierte
automáticamente en una entrada del proceso de construcción de @var{exp}. En
el entorno de construcción, cada @var{nombre-archivo} contiene el grafo de
referencias del elemento correspondiente, en un formato de texto simple.

@var{allowed-references} debe ser o bien @code{#f} o una lista de nombres y
paquetes de salida. En el último caso, la lista denota elementos del almacén
a los que el resultado puede hacer referencia. Cualquier referencia a otro
elemento del almacén produce un error de construcción. De igual manera con
@var{disallowed-references}, que enumera elementos a los que las salidas no
deben hacer referencia.

@var{deprecation-warnings} determina si mostrar avisos de obsolescencia
durante la compilación de los módulos. Puede ser @code{#f}, @code{#t} o
@code{'detailed}.

El resto de parámetros funcionan como en @code{derivation}
(@pxref{Derivaciones}).
@end deffn

@cindex objetos tipo-archivo
Los procedimientos @code{local-file}, @code{plain-file},
@code{computed-file}, @code{program-file} y @code{scheme-file} a
continuación devuelven @dfn{objetos tipo-archivo}. Esto es, cuando se
expanden en una expresión-G, estos objetos dirigen a un archivo en el
almacén. Considere esta expresión-G:

@lisp
#~(system* #$(file-append glibc "/sbin/nscd") "-f"
           #$(local-file "/tmp/mi-nscd.conf"))
@end lisp

El efecto aquí es el ``internamiento'' de @file{/tmp/mi-nscd.conf} mediante
su copia al almacén. Una vez expandida, por ejemplo @i{vía}
@code{gexp->derivation}, la expresión-G hace referencia a la copia bajo
@file{/gnu/store}; por tanto, la modificación o el borrado del archivo en
@file{/tmp} no tiene ningún efecto en lo que la expresión-G
hace. @code{plain-file} puede usarse de manera similar; se diferencia en que
el contenido del archivo se proporciona directamente como una cadena.

@deffn {Procedimiento Scheme} local-file @var{archivo} [@var{nombre}] @
   [#:recursive? #f] [#:select? (const #t)]
Devuelve un objeto que representa el archivo local @var{archivo} a añadir al
almacén; este objeto puede usarse en una expresión-G. Si @var{archivo} es un
nombre de archivo relativo, se busca de forma relativa al archivo fuente
donde esta forma aparece; si @var{archivo} no es una cadena literal, se
buscará de manera relativa al directorio de trabajo durante la
ejecución. @var{archivo} se añadirá al almacén bajo @var{nombre}---de manera
predeterminada el nombre de @var{archivo} sin los directorios.

Cuando @var{recursive?} es verdadero, los contenidos del @var{archivo} se
añaden recursivamente; si @var{archivo} designa un archivo plano y
@var{recursive?} es verdadero, sus contenidos se añaden, y sus bits de
permisos se mantienen.

Cuando @var{recursive?} es verdadero, llama a @code{(@var{select?}
@var{archivo} @var{stat})} por cada entrada del directorio, donde
@var{archivo} es el nombre absoluto de archivo de la entrada y @var{stat} es
el resultado de @code{lstat}; excluyendo las entradas para las cuales
@var{select?} no devuelve verdadero.

Esta es la contraparte declarativa del procedimiento monádico
@code{interned-file} (@pxref{La mónada del almacén, @code{interned-file}}).
@end deffn

@deffn {Procedimiento Scheme} plain-file @var{nombre} @var{contenido}
Devuelve un objeto que representa un archivo de texto llamado @var{nombre}
con el @var{contenido} proporcionado (una cadena o un vector de bytes) para
ser añadido al almacén.

Esta es la contraparte declarativa de @code{text-file}.
@end deffn

@deffn {Procedimiento Scheme} computed-file @var{nombre} @var{gexp} @
  [#:local-build? #t] [#:options '()]
Devuelve un objeto que representa el elemento del almacén @var{nombre}, un
archivo o un directorio computado por @var{gexp}. Cuando @var{local-build?}
tiene valor verdadero (el caso predeterminado), la derivación se construye
de manera local. @var{options} es una lista de parámetros adicionales
proporcionados a @code{gexp->derivation}.

Esta es la contraparte declarativa de @code{gexp->derivation}.
@end deffn

@deffn {Procedimiento monádico} gexp->script @var{nombre} @var{exp} @
  [#:guile (default-guile)] [#:module-path %load-path] @ [#:system
(%current-system)] [#:target #f]
Devuelve un guión ejecutable @var{nombre} que ejecuta @var{exp} usando
@var{guile}, con los módulos importados por @var{exp} en su ruta de
búsqueda. Busca los módulos de @var{exp} en @var{module-path}.

El ejemplo siguiente construye un guión que simplemente invoca la orden
@command{ls}:

@lisp
(use-modules (guix gexp) (gnu packages base))

(gexp->script "enumera-archivos"
              #~(execl #$(file-append coreutils "/bin/ls")
                       "ls"))
@end lisp

Cuando se ejecuta a través del almacén (@pxref{La mónada del almacén,
@code{run-with-store}}), obtenemos una derivación que produce un archivo
ejecutable @file{/gnu/store/@dots{}-enumera-archivos} más o menos así:

@example
#!/gnu/store/@dots{}-guile-2.0.11/bin/guile -ds
!#
(execl "/gnu/store/@dots{}-coreutils-8.22"/bin/ls" "ls")
@end example
@end deffn

@deffn {Procedimiento Scheme} program-file @var{nombre} @var{exp} @
          [#:guile #f] [#:module-path %load-path]
Devuelve un objeto que representa el elemento ejecutable del almacén
@var{nombre} que ejecuta @var{gexp}. @var{guile} es el paquete Guile usado
para ejecutar el guión. Los módulos importados por @var{gexp} se buscan en
@var{module-path}.

Esta es la contraparte declarativa de @code{gexp->script}.
@end deffn

@deffn {Procedimiento monádico} gexp->file @var{nombre} @var{exp} @
            [#:set-load-path? #t] [#:module-path %load-path] @
  [#:splice? #f] @
  [#:guile (default-guile)]
Devuelve una derivación que construye un archivo @var{nombre} que contiene
@var{exp}. Cuando @var{splice?} es verdadero, se considera que @var{exp} es
una lista de expresiones que deben ser expandidas en el archivo resultante.

Cuando @var{set-load-path} es verdadero, emite código en el archivo
resultante para establecer @code{%load-path} y @code{%load-compiled-path} de
manera que respeten los módulos importados por @var{exp}. Busca los módulos
de @var{exp} en @var{module-path}.

El archivo resultante hace referencia a todas las dependencias de @var{exp}
o a un subconjunto de ellas.
@end deffn

@deffn {Procedimiento Scheme} scheme-file @var{nombre} @var{exp} @
          [#:splice? #f] [#:set-load-path? #t]
Devuelve un objeto que representa el archivo Scheme @var{nombre} que
contiene @var{exp}.

Esta es la contraparte declarativa de @code{gexp->file}.
@end deffn

@deffn {Procedimiento monádico} text-file* @var{nombre} @var{texto} @dots{}
Devuelve como un valor monádico una derivación que construye un archivo de
texto que contiene todo @var{texto}. @var{texto} puede ser una lista de,
además de cadenas, objetos de cualquier tipo que pueda ser usado en
expresiones-G: paquetes, derivaciones, archivos locales, objetos, etc. El
archivo del almacén resultante hace referencia a todos ellos.

Esta variante debe preferirse sobre @code{text-file} cuando el archivo a
crear haga referencia a elementos del almacén. Esto es el caso típico cuando
se construye un archivo de configuración que embebe nombres de archivos del
almacén, como este:

@lisp
(define (perfil.sh)
  ;; Devuelve el nombre de un guión shell en el almacén
  ;; que establece la variable de entorno 'PATH'
  (text-file* "perfil.sh"
              "export PATH=" coreutils "/bin:"
              grep "/bin:" sed "/bin\n"))
@end lisp

En este ejemplo, el archivo @file{/gnu/store/@dots{}-perfil.sh} resultante
hará referencia a @var{coreutils}, @var{grep} y @var{sed}, por tanto
evitando que se recolecten como basura durante su tiempo de vida.
@end deffn

@deffn {Procedimiento Scheme} mixed-text-file @var{nombre} @var{texto} @dots{}
Devuelve un objeto que representa el archivo del almacén @var{nombre} que
contiene @var{texto}. @var{texto} es una secuencia de cadenas y objetos
tipo-archivo, como en:

@lisp
(mixed-text-file "perfil"
                 "export PATH=" coreutils "/bin:" grep "/bin")
@end lisp

Esta es la contraparte declarativa de @code{text-file*}.
@end deffn

@deffn {Procedimiento Scheme} file-union @var{nombre} @var{archivos}
Devuelve un @code{<computed-file>} que construye un directorio que contiene
todos los @var{archivos}. Cada elemento en @var{archivos} debe ser una lista
de dos elementos donde el primer elemento es el nombre de archivo usado en
el nuevo directorio y el segundo elemento es una expresión-G que denota el
archivo de destino. Aquí está un ejemplo:

@lisp
(file-union "etc"
            `(("hosts" ,(plain-file "hosts"
                                    "127.0.0.1 localhost"))
              ("bashrc" ,(plain-file "bashrc"
                                     "alias ls='ls --color=auto'"))))
@end lisp

Esto emite un directorio @code{etc} que contiene estos dos archivos.
@end deffn

@deffn {Procedimiento Scheme} directory-union @var{nombre} @var{cosas}
Devuelve un directorio que es la unión de @var{cosas}, donde @var{cosas} es
una lista de objetos tipo-archivo que denotan directorios. Por ejemplo:

@lisp
(directory-union "guile+emacs" (list guile emacs))
@end lisp

emite un directorio que es la unión de los paquetes @code{guile} y
@code{emacs}.
@end deffn

@deffn {Procedimientos Scheme} file-append @var{obj} @var{sufijo} @dots{}
Devuelve un objeto tipo-archivo que se expande a la concatenación de
@var{obj} y @var{sufijo}, donde @var{obj} es un objeto que se puede bajar de
nivel y cada @var{sufijo} es una cadena.

Como un ejemplo, considere esta expresión-G:

@lisp
(gexp->script "ejecuta-uname"
              #~(system* #$(file-append coreutils
                                        "/bin/uname")))
@end lisp

El mismo efecto podría conseguirse con:

@lisp
(gexp->script "ejecuta-uname"
              #~(system* (string-append #$coreutils
                                        "/bin/uname")))
@end lisp

Hay una diferencia no obstante: en el caso de @code{file-append}, el guión
resultante contiene una ruta absoluta de archivo como una cadena, mientras
que en el segundo caso, el guión resultante contiene una expresión
@code{(string-append @dots{})} para construir el nombre de archivo @emph{en
tiempo de ejecución}.
@end deffn

@deffn {Sintaxis Scheme} let-system @var{sistema} @var{cuerpo}@dots{}
@deffnx {Sintaxis Scheme} let-system (@var{sistema} @var{objetivo}) @var{cuerpo}@dots{}
Asocia @var{sistema} al sistema objetivo actual---por ejemplo,
@code{"x86_64-linux"}---dentro de @var{cuerpo}.

En el segundo caso, asocia también @var{objetivo} al objetivo actual de
compilación cruzada---una tripleta de GNU como
@code{"arm-linux-gnueabihf"}---o @code{#f} si no se trata de una compilación
cruzada.

@code{let-system} es útil en el caso ocasional en el que el objeto
introducido en la expresión-G depende del sistema objetivo, como en este
ejemplo:

@lisp
#~(system*
   #+(let-system system
       (cond ((string-prefix? "armhf-" system)
              (file-append qemu "/bin/qemu-system-arm"))
             ((string-prefix? "x86_64-" system)
              (file-append qemu "/bin/qemu-system-x86_64"))
             (else
              (error "¡ni idea!"))))
   "-net" "user" #$image)
@end lisp
@end deffn

@deffn {Sintaxis Scheme} with-parameters ((@var{parámetro} @var{valor} @dots{}) @var{exp}
Este macro es similar a la forma @code{parameterize} para @dfn{parámetros}
asociados de forma dinámica (@pxref{Parameters,,, guile, GNU Guile Reference
Manual}). La principal diferencia es que se hace efectivo cuando el objeto
tipo-archivo devuelto por @var{exp} se baja de nivel a una derivación o un
elemento del almacén.

Un uso típico de @code{with-parameters} es para forzar el sistema efectivo
de cierto objeto:

@lisp
(with-parameters ((%current-system "i686-linux"))
  coreutils)
@end lisp

El ejemplo previo devuelve un objeto que corresponde a la construcción en
i686 de Coreutils, independientemente del valor actual de
@code{%current-system}.
@end deffn


Por supuesto, además de expresiones-G embebidas en código ``anfitrión'', hay
también módulos que contienen herramientas de construcción. Para clarificar
que están destinados para su uso en el estrato de construcción, estos
módulos se mantienen en el espacio de nombres @code{(guix build @dots{})}.

@cindex bajada de nivel, de objetos de alto nivel en expresiones-G
Internamente, los objetos de alto nivel se @dfn{bajan de nivel}, usando su
compilador, a derivaciones o elementos del almacén. Por ejemplo, bajar de
nivel un paquete emite una derivación, y bajar de nivel un @var{plain-file}
emite un elemento del almacén. Esto se consigue usando el procedimiento
monádico @code{lower-object}.

@deffn {Procedimiento monádico} lower-object @var{obj} [@var{sistema}] @
           [#:target #f]
Devuelve como un valor en @code{%store-monad} la derivación o elemento del
almacén que corresponde a @var{obj} en @var{sistema}, compilando de manera
cruzada para @var{target} si @var{target} es verdadero. @var{obj} debe ser
un objeto que tiene asociado un compilador de expresiones-G, como por
ejemplo un objeto del tipo @code{<package>}.
@end deffn

@deffn {Procedure} gexp->approximate-sexp @var{gexp}
Sometimes, it may be useful to convert a G-exp into a S-exp.  For example,
some linters (@pxref{Invocación de guix lint}) peek into the build phases of a
package to detect potential problems.  This conversion can be achieved with
this procedure.  However, some information can be lost in the process.  More
specifically, lowerable objects will be silently replaced with some
arbitrary object -- currently the list @code{(*approximate*)}, but this may
change.
@end deffn

@node Invocación de guix repl
@section Invocación de @command{guix repl}

@cindex @command{guix repl}
@cindex REPL, sesión interactiva, guión
La orden @command{guix repl} lanza una @dfn{sesión interactiva} Guile (REPL)
para la programación interactiva (@pxref{Using Guile Interactively,,, guile,
GNU Guile Reference Manual}), o para la ejecución de guiones de
Guile. Comparado a simplemente lanzar la orden @command{guile},
@command{guix repl} garantiza que todos los módulos Guix y todas sus
dependencias están disponibles en la ruta de búsqueda.

La sintaxis general es:

@example
guix repl @var{opciones} [@var{archivo} @var{parámetros}]
@end example

Cuando se proporciona @var{archivo}, @var{archivo} se ejecuta como un guión
de Guile:

@example
guix repl mi-guion.scm
@end example

Para proporcionar parámetros al guión, use @code{--} para evitar que se
interpreten como parámetros específicos de @command{guix repl}:

@example
guix repl -- mi-guion.scm --input=foo.txt
@end example

Pare hacer que un guión sea ejecutable directamente desde el shell, mediante
el uso del ejecutable de guix que se encuentre en la ruta de búsqueda de la
usuaria, escriba las siguientes dos líneas al inicio del archivo:

@example
@code{#!/usr/bin/env -S guix repl --}
@code{!#}
@end example

Without a file name argument, a Guile REPL is started, allowing for
interactive use (@pxref{Using Guix Interactively}):

@example
$ guix repl
scheme@@(guile-user)> ,use (gnu packages base)
scheme@@(guile-user)> coreutils
$1 = #<package coreutils@@8.29 gnu/packages/base.scm:327 3e28300>
@end example

@cindex inferiores
Además, @command{guix repl} implementa un protocolo del REPL simple legible
por máquinas para su uso por @code{(guix inferior)}, una facilidad para
interactuar con @dfn{inferiores}, procesos separados que ejecutan una
revisión de Guix potencialmente distinta.

Las opciones disponibles son las siguientes:

@table @code
@item --type=@var{tipo}
@itemx -t @var{tipo}
Inicia un REPL del @var{TIPO} dado, que puede ser uno de los siguientes:

@table @code
@item guile
Es el predeterminado, y lanza una sesión interactiva Guile estándar con
todas las características.
@item machine
Lanza un REPL que usa el protocolo legible por máquinas. Este es el
protocolo con el que el módulo @code{(guix inferior)} se comunica.
@end table

@item --listen=@var{destino}
Por defecto, @command{guix repl} lee de la entrada estándar y escribe en la
salida estándar. Cuando se pasa esta opción, en vez de eso escuchará las
conexiones en @var{destino}. Estos son ejemplos de opciones válidas:

@table @code
@item --listen=tcp:37146
Acepta conexiones locales por el puerto 37146.

@item --listen=unix:/tmp/socket
Acepta conexiones a través del socket de dominio Unix @file{/tmp/socket}.
@end table

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
al guión o a la sesión interactiva.

@item -q
Inhibe la carga del archivo @file{~/.guile}. De manera predeterminada, dicho
archivo de configuración se carga al lanzar una sesión interactiva de
@code{guile}.
@end table

@node Using Guix Interactively
@section Using Guix Interactively

@cindex interactive use
@cindex REPL, read-eval-print loop
The @command{guix repl} command gives you access to a warm and friendly
@dfn{read-eval-print loop} (REPL) (@pxref{Invocación de guix repl}).  If you're
getting into Guix programming---defining your own packages, writing
manifests, defining services for Guix System or Guix Home, etc.---you will
surely find it convenient to toy with ideas at the REPL.

If you use Emacs, the most convenient way to do that is with Geiser
(@pxref{La configuración perfecta}), but you do not have to use Emacs to enjoy the
REPL@.  When using @command{guix repl} or @command{guile} in the terminal,
we recommend using Readline for completion and Colorized to get colorful
output.  To do that, you can run:

@example
guix install guile guile-readline guile-colorized
@end example

@noindent
... and then create a @file{.guile} file in your home directory containing
this:

@lisp
(use-modules (ice-9 readline) (ice-9 colorized))

(activate-readline)
(activate-colorized)
@end lisp

The REPL lets you evaluate Scheme code; you type a Scheme expression at the
prompt, and the REPL prints what it evaluates to:

@example
$ guix repl
scheme@@(guix-user)> (+ 2 3)
$1 = 5
scheme@@(guix-user)> (string-append "a" "b")
$2 = "ab"
@end example

It becomes interesting when you start fiddling with Guix at the REPL.  The
first thing you'll want to do is to ``import'' the @code{(guix)} module,
which gives access to the main part of the programming interface, and
perhaps a bunch of useful Guix modules.  You could type @code{(use-modules
(guix))}, which is valid Scheme code to import a module (@pxref{Using Guile Modules,,, guile, GNU Guile Reference Manual}), but the REPL provides the
@code{use} @dfn{command} as a shorthand notation (@pxref{REPL Commands,,,
guile, GNU Guile Reference Manual}):

@example
scheme@@(guix-user)> ,use (guix)
scheme@@(guix-user)> ,use (gnu packages base)
@end example

Notice that REPL commands are introduced by a leading comma.  A REPL command
like @code{use} is not valid Scheme code; it's interpreted specially by the
REPL.

Guix extends the Guile REPL with additional commands for convenience.  Among
those, the @code{build} command comes in handy: it ensures that the given
file-like object is built, building it if needed, and returns its output
file name(s).  In the example below, we build the @code{coreutils} and
@code{grep} packages, as well as a ``computed file'' (@pxref{Expresiones-G,
@code{computed-file}}), and we use the @code{scandir} procedure to list the
files in Grep's @code{/bin} directory:

@example
scheme@@(guix-user)> ,build coreutils
$1 = "/gnu/store/@dots{}-coreutils-8.32-debug"
$2 = "/gnu/store/@dots{}-coreutils-8.32"
scheme@@(guix-user)> ,build grep
$3 = "/gnu/store/@dots{}-grep-3.6"
scheme@@(guix-user)> ,build (computed-file "x" #~(mkdir #$output))
building /gnu/store/@dots{}-x.drv...
$4 = "/gnu/store/@dots{}-x"
scheme@@(guix-user)> ,use(ice-9 ftw)
scheme@@(guix-user)> (scandir (string-append $3 "/bin"))
$5 = ("." ".." "egrep" "fgrep" "grep")
@end example

At a lower-level, a useful command is @code{lower}: it takes a file-like
object and ``lowers'' it into a derivation (@pxref{Derivaciones}) or a store
file:

@example
scheme@@(guix-user)> ,lower grep
$6 = #<derivation /gnu/store/@dots{}-grep-3.6.drv => /gnu/store/@dots{}-grep-3.6 7f0e639115f0>
scheme@@(guix-user)> ,lower (plain-file "x" "Hello!")
$7 = "/gnu/store/@dots{}-x"
@end example

The full list of REPL commands can be seen by typing @code{,help guix} and
is given below for reference.

@deffn {REPL command} build @var{object}
Lower @var{object} and build it if it's not already built, returning its
output file name(s).
@end deffn

@deffn {REPL command} lower @var{object}
Lower @var{object} into a derivation or store file name and return it.
@end deffn

@deffn {REPL command} verbosity @var{level}
Change build verbosity to @var{level}.

This is similar to the @option{--verbosity} command-line option
(@pxref{Opciones comunes de construcción}): level 0 means total silence, level 1 shows
build events only, and higher levels print build logs.
@end deffn

@deffn {REPL command} run-in-store @var{exp}
Run @var{exp}, a monadic expresssion, through the store monad.  @xref{La mónada del almacén}, for more information.
@end deffn

@deffn {REPL command} enter-store-monad
Enter a new REPL to evaluate monadic expressions (@pxref{La mónada del almacén}).
You can quit this ``inner'' REPL by typing @code{,q}.
@end deffn

@c *********************************************************************
@node Utilidades
@chapter Utilidades

Esta sección describe las utilidades de línea de órdenes de Guix. Algunas de
ellas están orientadas principalmente para desarrolladoras y usuarias que
escriban definiciones de paquetes nuevas, mientras que otras son útiles de
manera más general. Complementan la interfaz programática Scheme de Guix de
modo conveniente.

@menu
* Invocación de guix build::  Construir paquetes desde la línea de 
                                 órdenes.
* Invocación de guix edit::  Editar las definiciones de paquetes.
* Invocación de guix download::  Descargar un archivo e imprimir su hash.
* Invocación de guix hash::  Calcular el hash criptográfico de un archivo.
* Invocación de guix import::  Importar definiciones de paquetes.
* Invocación de guix refresh::  Actualizar definiciones de paquetes.
* Invoking guix style::      Styling package definitions.
* Invocación de guix lint::  Encontrar errores en definiciones de paquetes.
* Invocación de guix size::  Perfilar el uso del disco.
* Invocación de guix graph::  Visualizar el grafo de paquetes.
* Invocación de guix publish::  Compartir sustituciones.
* Invocación de guix challenge::  Poner a prueba servidores de 
                                     sustituciones.
* Invocación de guix copy::  Copiar a y desde un almacén remoto.
* Invocación de guix container::  Aislamiento de procesos.
* Invocación de guix weather::  Comprobar la disponibilidad de 
                                   sustituciones.
* Invocación de guix processes::  Enumerar los procesos cliente.
@end menu

@node Invocación de guix build
@section Invocación de @command{guix build}

@cindex construcción de paquetes
@cindex @command{guix build}
La orden @command{guix build} construye paquetes o derivaciones y sus
dependencias, e imprime las rutas del almacén resultantes. Fíjese que no
modifica el perfil de la usuaria---este es el trabajo de la orden
@command{guix package} (@pxref{Invocación de guix package}). Por tanto, es útil
principalmente para las desarrolladoras de la distribución.

La sintaxis general es:

@example
guix build @var{opciones} @var{paquete-o-derivación}@dots{}
@end example

Como ejemplo, la siguiente orden construye las últimas versiones de Emacs y
Guile, muestra sus log de construcción, y finalmente muestra los directorios
resultantes:

@example
guix build emacs guile
@end example

De forma similar, la siguiente orden construye todos los paquetes
disponibles:

@example
guix build --quiet --keep-going \
  $(guix package -A | awk '@{ print $1 "@@" $2 @}')
@end example

@var{paquete-o-derivación} puede ser tanto el nombre de un paquete que se
encuentra en la distribución de software como @code{coreutils} o
@code{coreutils@@8.20}, o una derivación como
@file{/gnu/store/@dots{}-coreutils-8.19.drv}. En el primer caso, el paquete
de nombre (y opcionalmente versión) correspondiente se busca entre los
módulos de la distribución GNU (@pxref{Módulos de paquetes}).

De manera alternativa, la opción @option{--expression} puede ser usada para
especificar una expresión Scheme que evalúa a un paquete; esto es útil para
diferenciar entre varios paquetes con el mismo nombre o si se necesitan
variaciones del paquete.

Puede haber cero o más @var{opciones}. Las opciones disponibles se describen
en la subsección siguiente.

@menu
* Opciones comunes de construcción::  Opciones de construcción para la 
                                         mayoría de órdenes.
* Opciones de transformación de paquetes::  Crear variantes de paquetes.
* Opciones de construcción adicionales::  Opciones específicas de 'guix 
                                             build'.
* Depuración de fallos de construcción::  Experiencia de empaquetamiento 
                                              en la vida real.
@end menu

@node Opciones comunes de construcción
@subsection Opciones comunes de construcción

Un número de opciones que controlan el proceso de construcción son comunes a
@command{guix build} y otras órdenes que pueden lanzar construcciones, como
@command{guix package} o @command{guix archive}. Son las siguientes:

@table @code

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
a las herramientas de línea de órdenes.

@item --keep-failed
@itemx -K
Mantiene los árboles de construcción de las construcciones fallidas. Por
tanto, si una construcción falla, su árbol de construcción se mantiene bajo
@file{/tmp}, en un directorio cuyo nombre se muestra al final del log de
construcción. Esto es útil cuando se depuran problemas en la
construcción. @xref{Depuración de fallos de construcción}, para trucos y consejos sobre
cómo depurar problemas en la construcción.

Esta opción implica @option{--no-offload}, y no tiene efecto cuando se
conecta a un daemon remoto con una URI @code{guix://} (@pxref{El almacén, la
variable @env{GUIX_DAEMON_SOCKET}}).

@item --keep-going
@itemx -k
Seguir adelante cuando alguna de las derivaciones de un fallo durante la
construcción; devuelve una única vez todas las construcciones que se han
completado o bien han fallado.

El comportamiento predeterminado es parar tan pronto una de las derivaciones
especificadas falle.

@item --dry-run
@itemx -n
No construye las derivaciones.

@anchor{fallback-option}
@item --fallback
Cuando la sustitución de un binario preconstruido falle, intenta la
construcción local de paquetes (@pxref{Fallos en las sustituciones}).

@item --substitute-urls=@var{urls}
@anchor{client-substitute-urls}
Considera @var{urls} la lista separada por espacios de URLs de fuentes de
sustituciones, anulando la lista predeterminada de URLs de
@command{guix-daemon} (@pxref{daemon-substitute-urls,, @command{guix-daemon
URLs}}).

Significa que las sustituciones puede ser descargadas de @var{urls},
mientras que estén firmadas por una clave autorizada por la administradora
del sistema (@pxref{Sustituciones}).

Cuando @var{urls} es la cadena vacía, las sustituciones están efectivamente
desactivadas.

@item --no-substitutes
No usa sustituciones para la construcción de productos. Esto es, siempre
realiza las construcciones localmente en vez de permitir la descarga de
binarios pre-construidos (@pxref{Sustituciones}).

@item --no-grafts
No ``injerta'' paquetes. En la práctica esto significa que las
actualizaciones de paquetes disponibles como injertos no se
aplican. @xref{Actualizaciones de seguridad}, para más información sobre los injertos.

@item --rounds=@var{n}
Construye cada derivación @var{n} veces seguidas, y lanza un error si los
resultados de las construcciones consecutivas no son idénticos bit-a-bit.

Esto es útil para la detección de procesos de construcción
no-deterministas. Los procesos de construcción no-deterministas son un
problema puesto que prácticamente imposibilitan a las usuarias la
@emph{verificación} de la autenticidad de binarios proporcionados por
terceras partes. @xref{Invocación de guix challenge}, para más sobre esto.

Cuando se usa conjuntamente con @option{--keep-failed}, la salida que
difiere se mantiene en el almacén, bajo
@file{/gnu/store/@dots{}-check}. Esto hace fácil buscar diferencias entre
los dos resultados.

@item --no-offload
No usa la delegación de construcciones en otras máquinas (@pxref{Configuración de delegación del daemon}). Es decir, siempre realiza las construcciones de manera
local en vez de delegar construcciones a máquinas remotas.

@item --max-silent-time=@var{segundos}
Cuando la construcción o sustitución permanece en silencio más de
@var{segundos}, la finaliza e informa de un fallo de construcción.

Por defecto, se respeta la configuración del daemon (@pxref{Invocación de guix-daemon, @option{--max-silent-time}}).

@item --timeout=@var{segundos}
Del mismo modo, cuando el proceso de construcción o sustitución dura más de
@var{segundos}, lo termina e informa un fallo de construcción.

Por defecto, se respeta la configuración del daemon (@pxref{Invocación de guix-daemon, @option{--timeout}}).

@c Note: This option is actually not part of %standard-build-options but
@c most programs honor it.
@cindex nivel de detalle de los mensajes, de las herramientas de línea de órdenes
@cindex registro de construcción, nivel de descripción
@item -v @var{nivel}
@itemx --verbosity=@var{nivel}
Use the given verbosity @var{level}, an integer.  Choosing 0 means that no
output is produced, 1 is for quiet output; 2 is similar to 1 but it
additionally displays download URLs; 3 shows all the build log output on
standard error.

@item --cores=@var{n}
@itemx -c @var{n}
Permite usar @var{n} núcleos de la CPU para la construcción. El valor
especial @code{0} significa usar tantos como núcleos haya en la CPU.

@item --max-jobs=@var{n}
@itemx -M @var{n}
Permite como máximo @var{n} trabajos de construcción en
paralelo. @xref{Invocación de guix-daemon, @option{--max-jobs}}, para detalles
acerca de esta opción y la opción equivalente de @command{guix-daemon}.

@item --debug=@var{nivel}
Usa el nivel de detalle proporcionado en los mensajes procedentes del daemon
de construcción. @var{nivel} debe ser un entero entre 0 y 5; valores mayores
indican una salida más detallada. Establecer un nivel de 4 o superior puede
ser útil en la depuración de problemas de configuración con el daemon de
construcción.

@end table

Tras las cortinas, @command{guix build} es esencialmente una interfaz al
procedimiento @code{package-derivation} del módulo @code{(guix packages)}, y
al procedimiento @code{build-derivations} del módulo @code{(guix
derivations)}.

Además de las opciones proporcionadas explícitamente en la línea de órdenes,
@command{guix build} y otras órdenes @command{guix} que permiten la
construcción respetan el contenido de la variable de entorno
@env{GUIX_BUILD_OPTIONS}.

@defvr {Variable de entorno} GUIX_BUILD_OPTIONS
Las usuarias pueden definir esta variable para que contenga una lista de
opciones de línea de órdenes que se usarán automáticamente por @command{guix
build} y otras órdenes @command{guix} que puedan realizar construcciones,
como en el ejemplo siguiente:

@example
$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar"
@end example

Estas opciones se analizan independientemente, y el resultado se añade a
continuación de las opciones de línea de órdenes.
@end defvr


@node Opciones de transformación de paquetes
@subsection Opciones de transformación de paquetes

@cindex variaciones de paquetes
Otro conjunto de opciones de línea de órdenes permitidas por @command{guix
build} y también @command{guix package} son las @dfn{opciones de
transformación de paquetes}. Son opciones que hacen posible la definición de
@dfn{variaciones de paquetes}---por ejemplo, paquetes construidos con un
código fuente diferente. Es una forma conveniente de crear paquetes
personalizados al vuelo sin tener que escribir las definiciones de las
variaciones del paquete (@pxref{Definición de paquetes}).

Las opciones de transformación del paquete se preservan con las
actualizaciones: @command{guix upgrade} intenta aplicar las opciones de
transformación usadas inicialmente al crear el perfil para actualizar los
paquetes.

Las opciones disponibles se enumeran a continuación. La mayor parte de las
ordenes los aceptan, así como la opción @option{--help-transform} que
enumera todas las opciones disponibles y una sinópsis (estas opciones no se
muestran en la salida de @option{--help} por brevedad).

@table @code

@cindex performance, tuning code
@cindex optimization, of package code
@cindex tuning, of package code
@cindex SIMD support
@cindex tunable packages
@cindex package multi-versioning
@item --tune[=@var{cpu}]
Use versions of the packages marked as ``tunable'' optimized for @var{cpu}.
When @var{cpu} is @code{native}, or when it is omitted, tune for the CPU on
which the @command{guix} command is running.

Valid @var{cpu} names are those recognized by the underlying compiler, by
default the GNU Compiler Collection.  On x86_64 processors, this includes
CPU names such as @code{nehalem}, @code{haswell}, and @code{skylake}
(@pxref{x86 Options, @code{-march},, gcc, Using the GNU Compiler Collection
(GCC)}).

As new generations of CPUs come out, they augment the standard instruction
set architecture (ISA) with additional instructions, in particular
instructions for single-instruction/multiple-data (SIMD)  parallel
processing.  For example, while Core2 and Skylake CPUs both implement the
x86_64 ISA, only the latter supports AVX2 SIMD instructions.

The primary gain one can expect from @option{--tune} is for programs that
can make use of those SIMD capabilities @emph{and} that do not already have
a mechanism to select the right optimized code at run time.  Packages that
have the @code{tunable?} property set are considered @dfn{tunable packages}
by the @option{--tune} option; a package definition with the property set
looks like this:

@lisp
(package
  (name "hello-simd")
  ;; ...

  ;; This package may benefit from SIMD extensions so
  ;; mark it as "tunable".
  (properties '((tunable? . #t))))
@end lisp

Other packages are not considered tunable.  This allows Guix to use generic
binaries in the cases where tuning for a specific CPU is unlikely to provide
any gain.

Tuned packages are built with @code{-march=@var{CPU}}; under the hood, the
@option{-march} option is passed to the actual wrapper by a compiler
wrapper.  Since the build machine may not be able to run code for the target
CPU micro-architecture, the test suite is not run when building a tuned
package.

To reduce rebuilds to the minimum, tuned packages are @emph{grafted} onto
packages that depend on them (@pxref{Actualizaciones de seguridad, grafts}).  Thus,
using @option{--no-grafts} cancels the effect of @option{--tune}.

We call this technique @dfn{package multi-versioning}: several variants of
tunable packages may be built, one for each CPU variant.  It is the
coarse-grain counterpart of @dfn{function multi-versioning} as implemented
by the GNU tool chain (@pxref{Function Multiversioning,,, gcc, Using the GNU
Compiler Collection (GCC)}).

@item --with-source=@var{fuente}
@itemx --with-source=@var{paquete}=@var{fuente}
@itemx --with-source=@var{paquete}@@@var{versión}=@var{fuente}
Usa @var{fuente} como la fuente de @var{paquete}, y @var{versión} como su
número de versión. @var{fuente} debe ser un nombre de archivo o una URL,
como en @command{guix download} (@pxref{Invocación de guix download}).

Cuando se omite @var{paquete}, se toma el nombre de paquete especificado en
la línea de ordenes que coincide con el nombre base de @var{fuente}---por
ejemplo, si @var{fuente} fuese @code{/src/guile-2.0.10.tar.gz}, el paquete
correspondiente sería @code{guile}.

Del mismo modo, si se omite @var{versión}, la cadena de versión se deduce de
@var{đuente}; en el ejemplo previo sería @code{2.0.10}.

Esta opción permite a las usuarias probar versiones del paquete distintas a
las proporcionadas en la distribución. El ejemplo siguiente descarga
@file{ed-1.7.tar.gz} de un espejo GNU y lo usa como la fuente para el
paquete @code{ed}:

@example
guix build ed --with-source=mirror://gnu/ed/ed-1.4.tar.gz
@end example

As a developer, @option{--with-source} makes it easy to test release
candidates, and even to test their impact on packages that depend on them:

@example
guix build elogind --with-source=@dots{}/shepherd-0.9.0rc1.tar.gz 
@end example

@dots{} o la construcción desde una revisión en un entorno limpio:

@example
$ git clone git://git.sv.gnu.org/guix.git
$ guix build guix --with-source=guix@@1.0=./guix
@end example

@item --with-input=@var{paquete}=@var{reemplazo}
Substituye dependencias de @var{paquete} por dependencias de
@var{reemplazo}. @var{paquete} debe ser un nombre de paquete, y
@var{reemplazo} debe ser una especificación de paquete como @code{guile} o
@code{guile@@1.8}.

Por ejemplo, la orden siguiente construye Guix, pero substituye su
dependencia de la versión estable actual de Guile con una dependencia en la
versión antigua de Guile, @code{guile@@2.0}:

@example
guix build --with-input=guile=guile@@2.0 guix
@end example

Esta sustitución se realiza de forma recursiva y en profundidad. Por lo que
en este ejemplo, tanto @code{guix} como su dependencia @code{guile-json}
(que también depende de @code{guile}) se reconstruyen contra
@code{guile@@2.0}.

Se implementa usando el procedimiento Scheme @code{package-input-rewriting}
(@pxref{Definición de paquetes, @code{package-input-rewriting}}).

@item --with-graft=@var{paquete}=@var{reemplazo}
Es similar a @option{--with-input} pero con una diferencia importante: en
vez de reconstruir la cadena de dependencias completa, @var{reemplazo} se
construye y se @dfn{injerta} en los binarios que inicialmente hacían
referencia a @var{paquete}. @xref{Actualizaciones de seguridad}, para más información
sobre injertos.

Por ejemplo, la orden siguiente injerta la versión 3.5.4 de GnuTLS en Wget y
todas sus dependencias, substituyendo las referencias a la versión de GnuTLS
que tienen actualmente:

@example
guix build --with-graft=gnutls=gnutls@@3.5.4 wget
@end example

Esta opción tiene la ventaja de ser mucho más rápida que la reconstrucción
de todo. Pero hay una trampa: funciona si y solo si @var{paquete} y
@var{reemplazo} son estrictamente compatibles---por ejemplo, si proporcionan
una biblioteca, la interfaz binaria de aplicación (ABI) de dichas
bibliotecas debe ser compatible. Si @var{reemplazo} es incompatible de
alguna manera con @var{paquete}, el paquete resultante puede no ser
usable. ¡Úsela con precaución!

@cindex información de depuración, reconstrucción
@item --with-debug-info=@var{paquete}
Construye @var{paquete} de modo que preserve su información de depuración y
lo injerta en los paquetes que dependan de él. Es útil si @var{paquete} no
proporciona ya información de depuración como una salida @code{debug}
(@pxref{Instalación de archivos de depuración}).

Por ejemplo, supongamos que está experimentando un fallo en Inkscape y
querría ver qué pasa en GLib, una biblioteca con mucha profundidad en el
grafo de dependencias de Inkscape. GLib no tiene una salida @code{debug}, de
modo que su depuración es difícil. Afortunadamente puede reconstruir GLib
con información de depuración e incorporarla a Inkscape:

@example
guix install inkscape --with-debug-info=glib
@end example

Únicamente GLib necesita una reconstrucción por lo que esto tarda un tiempo
razonable.  @xref{Instalación de archivos de depuración} para obtener más información.

@quotation Nota
Esta opción funciona en su implementación interna proporcionando
@samp{#:strip-binaries? #f} al sistema de construcción del paquete en
cuestión (@pxref{Sistemas de construcción}). La mayor parte de sistemas de construcción
implementan dicha opción, pero algunos no lo hacen. En este caso caso se
emite un error.

De igual modo, si se construye un paquete C/C++ sin la opción @code{-g} (lo
que no es habitual que ocurra), la información de depuración seguirá sin
estar disponible incluso cuando @code{#:strip-binaries?} sea falso.
@end quotation

@cindex cadena de herramientas de construcción, cambiar para un paquete la
@item --with-c-toolchain=@var{paquete}=@var{cadena}
Esta opción cambia la compilación de @var{paquete} y todo lo que dependa de
él de modo que se constuya con @var{cadena} en vez de la cadena de
herramientas de construcción para C/C++ de GNU predeterminada.

Considere este ejemplo:

@example
guix build octave-cli \
  --with-c-toolchain=fftw=gcc-toolchain@@10 \
  --with-c-toolchain=fftwf=gcc-toolchain@@10
@end example

La orden anterior construye una variante de los paquetes @code{fftw} y
@code{fftwf} usando la versión 10 de @code{gcc-toolchain} en vez de la
cadena de herramientas de construcción predeterminada, y construye una
variante de la interfaz de línea de órdenes GNU@tie{}Octave que hace uso de
ellos. El propio paquete de GNU@tie{}Octave también se construye con
@code{gcc-toolchain@@10}.

Este otro ejemplo construye la biblioteca Hardware Locality (@code{hwloc}) y
los paquetes que dependan de ella hasta @code{intel-mpi-benchmarks} con el
compilador de C Clang:

@example
guix build --with-c-toolchain=hwloc=clang-toolchain \
           intel-mpi-benchmarks
@end example

@quotation Nota
There can be application binary interface (ABI) incompatibilities among tool
chains.  This is particularly true of the C++ standard library and run-time
support libraries such as that of OpenMP@.  By rebuilding all dependents
with the same tool chain, @option{--with-c-toolchain} minimizes the risks of
incompatibility but cannot entirely eliminate them.  Choose @var{package}
wisely.
@end quotation

@item --with-git-url=@var{paquete}=@var{url}
@cindex Git, usar la última revisión
@cindex última revisión, construcción
Construye @var{paquete} desde la última revisión de la rama @code{master}
del repositorio Git en @var{url}. Los submódulos del repositorio Git se
obtienen de forma recursiva.

Por ejemplo, la siguiente orden construye la biblioteca NumPy de Python
contra la última revisión de la rama master de Python en sí:

@example
guix build python-numpy \
  --with-git-url=python=https://github.com/python/cpython
@end example

Esta opción también puede combinarse con @option{--with-branch} o
@option{--with-commit} (véase más adelante).

@cindex integración continua
Obviamente, ya que se usa la última revisión de la rama proporcionada, el
resultado de dicha orden varia con el tiempo. No obstante es una forma
conveniente de reconstruir una pila completa de software contra las últimas
revisiones de uno o varios paquetes. Esto es particularmente útil en el
contexto de integración continua (CI).

Los directorios de trabajo se conservan en caché en
@file{~/.cache/guix/checkouts} para agilizar accesos consecutivos al mismo
repositorio. Puede desear limpiarla de vez en cuando para ahorrar espacio en
el disco.

@item --with-branch=@var{paquete}=@var{rama}
Construye @var{paquete} desde la última revisión de @var{rama}. Si el campo
@code{source} de @var{paquete} es un origen con el método @code{git-fetch}
(@pxref{Referencia de origin}) o un objeto @code{git-checkout}, la URL del
repositorio se toma de dicho campo @code{source}. En otro caso, se debe
especificar la URL del repositorio Git mediante el uso de
@option{--with-git-url}.

Por ejemplo, la siguiente orden construye @code{guile-sqlite3} desde la
última revisión de su rama @code{master} y, una vez hecho, construye
@code{guix} (que depende de él) y @code{cuirass} (que depende de
@code{guix}) en base a esta construcción específica de @code{guile-sqlite3}:

@example
guix build --with-branch=guile-sqlite3=master cuirass
@end example

@item --with-commit=@var{paquete}=@var{revisión}
This is similar to @option{--with-branch}, except that it builds from
@var{commit} rather than the tip of a branch.  @var{commit} must be a valid
Git commit SHA1 identifier, a tag, or a @command{git describe} style
identifier such as @code{1.0-3-gabc123}.

@item --with-patch=@var{package}=@var{file}
Add @var{file} to the list of patches applied to @var{package}, where
@var{package} is a spec such as @code{python@@3.8} or @code{glibc}.
@var{file} must contain a patch; it is applied with the flags specified in
the @code{origin} of @var{package} (@pxref{Referencia de origin}), which by
default includes @code{-p1} (@pxref{patch Directories,,, diffutils,
Comparing and Merging Files}).

As an example, the command below rebuilds Coreutils with the GNU C Library
(glibc) patched with the given patch:

@example
guix build coreutils --with-patch=glibc=./glibc-frob.patch
@end example

In this example, glibc itself as well as everything that leads to Coreutils
in the dependency graph is rebuilt.

@cindex upstream, latest version
@item --with-latest=@var{package}
So you like living on the bleeding edge? This option is for you! It replaces
occurrences of @var{package} in the dependency graph with its latest
upstream version, as reported by @command{guix refresh} (@pxref{Invocación de guix refresh}).

It does so by determining the latest upstream release of @var{package} (if
possible), downloading it, and authenticating it @emph{if} it comes with an
OpenPGP signature.

As an example, the command below builds Guix against the latest version of
Guile-JSON:

@example
guix build guix --with-latest=guile-json
@end example

There are limitations.  First, in cases where the tool cannot or does not
know how to authenticate source code, you are at risk of running malicious
code; a warning is emitted in this case.  Second, this option simply changes
the source used in the existing package definitions, which is not always
sufficient: there might be additional dependencies that need to be added,
patches to apply, and more generally the quality assurance work that Guix
developers normally do will be missing.

You've been warned! In all the other cases, it's a snappy way to stay on
top.  We encourage you to submit patches updating the actual package
definitions once you have successfully tested an upgrade
(@pxref{Contribuir}).

@cindex batería de pruebas, omisión de la
@item --without-tests=@var{paquete}
Construye @var{paquete} sin ejecutar su batería de pruebas. Puede ser útil
en situaciones en las que quiera omitir una larga batería de pruebas de un
paquete intermedio, o si la batería de pruebas no falla de manera
determinista. Debe usarse con cuidado, puesto que la ejecución de la batería
de pruebas es una buena forma de asegurarse de que el paquete funciona como
se espera.

La desactivación de las pruebas conduce a diferentes elementos en el
almacén. Por tanto, cuando use esta opción, cualquier objeto que dependa de
@var{paquete} debe ser reconstruido, como en este ejemplo:

@example
guix install --without-tests=python python-notebook
@end example

La orden anterior instala @code{python-notebook} sobre un paquete
@code{python} construido sin ejecutar su batería de pruebas. Para hacerlo,
también reconstruye todos los paquetes que dependen de @code{python},
incluyendo el propio @code{pyhton-notebook}.

De manera interna, @option{--without-tests} depende del cambio de la opción
@code{#:tests?} de la fase @code{check} del paquete (@pxref{Sistemas de construcción}). Tenga en cuenta que algunos paquetes usan una fase @code{check}
personalizada que no respeta el valor de configuración @code{#:tests?
#f}. Por tanto, @option{--without-tests} no tiene ningún efecto en dichos
paquetes.

@end table

¿Se pregunta cómo conseguir el mismo efecto usando código Scheme, por
ejemplo en su manifiesto, o cómo escribir su propia transformación de
paquetes? @xref{Definición de variantes de paquetes} para obtener una descripción de
la interfaz programática disponible.

@node Opciones de construcción adicionales
@subsection Opciones de construcción adicionales

Las opciones de línea de ordenes presentadas a continuación son específicas
de @command{guix build}.

@table @code

@item --quiet
@itemx -q
Construye silenciosamente, sin mostrar el registro de construcción; es
equivalente a @option{--verbosity=0}. Al finalizar, el registro de
construcción se mantiene en @file{/var} (o similar) y puede recuperarse
siempre mediante el uso de la opción @option{--log-file}.

@item --file=@var{archivo}
@itemx -f @var{archivo}
Construye el paquete, derivación u otro objeto tipo-archivo al que evalúa el
código en @var{archivo} (@pxref{Expresiones-G, objetos ``tipo-archivo''}).

Como un ejemplo, @var{archivo} puede contener una definición como esta
(@pxref{Definición de paquetes}):

@lisp
@include package-hello.scm
@end lisp

El @var{archivo} también puede contener una representación en JSON de una o
más definiciones de paquete. Ejecutar @code{guix build -f} en
@file{hello.json} con el siguiente contenido resultaría en la construcción
de los paquetes @code{myhello} y @code{greeter}:

@example
@verbatiminclude package-hello.json
@end example

@item --manifest=@var{manifiesto}
@itemx -m @var{manifiesto}
Construye todos los paquetes listados en el @var{manifiesto} proporcionado
(@pxref{profile-manifest, @option{--manifest}}).

@item --expression=@var{expr}
@itemx -e @var{expr}
Construye el paquete o derivación a la que evalúa @var{expr}.

Por ejemplo, @var{expr} puede ser @code{(@@ (gnu packages guile)
guile-1.8)}, que designa sin ambigüedad a esta variante específica de la
versión 1.8 de Guile.

De manera alternativa, @var{expr} puede ser una expresión-G, en cuyo caso se
usa como un programa de construcción pasado a @code{gexp->derivation}
(@pxref{Expresiones-G}).

Por último, @var{expr} puede hacer referencia a un procedimiento mónadico
sin parámetros (@pxref{La mónada del almacén}). El procedimiento debe devolver una
derivación como un valor monádico, el cual después se pasa a través de
@code{run-with-store}.

@item --source
@itemx -S
Construye las derivaciones de las fuentes de los paquetes, en vez de los
paquetes mismos.

Por ejemplo, @code{guix build -S gcc} devuelve algo como
@file{/gnu/store/@dots{}-gcc-4.7.2.tar.bz2}, el cual es el archivador tar de
fuentes de GCC.

El archivador tar devuelto es el resultado de aplicar cualquier parche y
fragmento de código en el origen (campo @code{origin}) del paquete
(@pxref{Definición de paquetes}).

@cindex source, verification
As with other derivations, the result of building a source derivation can be
verified using the @option{--check} option (@pxref{build-check}).  This is
useful to validate that a (potentially already built or substituted, thus
cached) package source matches against its declared hash.

Tenga en cuenta que @command{guix build -S} compila las fuentes únicamente
de los paquetes especificados. Esto no incluye las dependencias enlazadas
estáticamente y por sí mismas son insuficientes para reproducir los
paquetes.

@item --sources
Obtiene y devuelve las fuentes de @var{paquete-o-derivación} y todas sus
dependencias, de manera recursiva. Esto es útil para obtener una copia local
de todo el código fuente necesario para construir los @var{paquetes}, le
permite construirlos llegado el momento sin acceso a la red. Es una
extensión de la opción @option{--source} y puede aceptar uno de los
siguientes valores opcionales como parámetro:

@table @code
@item package
Este valor hace que la opción @option{--sources} se comporte de la misma
manera que la opción @option{--source}.

@item all
Construye las derivaciones de las fuentes de todos los paquetes, incluyendo
cualquier fuente que pueda enumerarse como entrada (campo
@code{inputs}). Este es el valor predeterminado.

@example
$ guix build --sources tzdata
The following derivations will be built:
   /gnu/store/@dots{}-tzdata2015b.tar.gz.drv
   /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
@end example

@item transitive
Construye las derivaciones de fuentes de todos los paquetes, así como todas
las entradas transitivas de los paquetes. Esto puede usarse, por ejemplo,
para obtener las fuentes de paquetes para una construcción posterior sin
conexión a la red.

@example
$ guix build --sources=transitive tzdata
The following derivations will be built:
   /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
   /gnu/store/@dots{}-findutils-4.4.2.tar.xz.drv
   /gnu/store/@dots{}-grep-2.21.tar.xz.drv
   /gnu/store/@dots{}-coreutils-8.23.tar.xz.drv
   /gnu/store/@dots{}-make-4.1.tar.xz.drv
   /gnu/store/@dots{}-bash-4.3.tar.xz.drv
@dots{}
@end example

@end table

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta la construcción para @var{sistema}---por ejemplo,
@code{i686-linux}---en vez del tipo de sistema de la máquina de
construcción. La orden @command{guix build} le permite repetir esta opción
varias veces, en cuyo caso construye para todos los sistemas especificados;
otras ordenes ignoran opciones @option{-s} extrañas.

@quotation Nota
La opción @option{--system} es para compilación @emph{nativa} y no debe
confundirse con la compilación cruzada. Véase @option{--target} más adelante
para información sobre compilación cruzada.
@end quotation

Un ejemplo de uso de esta opción es en sistemas basados en Linux, que pueden
emular diferentes personalidades. Por ejemplo, proporcionar la opción
@option{--system=i686-linux} en un sistema @code{x86_64-linux}, o la opción
@option{--system=armhf-linux} en un sistema @code{aarch64-linux}, le permite
construir paquetes en un entorno de 32-bits completo.

@quotation Nota
La construcción para un sistema @code{armhf-linux} está disponible de manera
incondicional en máquinas @code{aarch64-linux}, aunque determinadas familias
de procesadores aarch64 no lo permitan, notablemente el ThunderX.
@end quotation

De manera similar, cuando la emulación transparente con QEMU y
@code{binfmt_misc} está activada (@pxref{Servicios de virtualización,
@code{qemu-binfmt-service-type}}), puede construir para cualquier sistema
para el que un manejador QEMU de @code{binfmt_misc} esté instalado.

Las construcciones para un sistema distinto al de la máquina que usa se
pueden delegar también a una máquina remota de la arquitectura
correcta. @xref{Configuración de delegación del daemon}, para más información sobre
delegación.

@item --target=@var{tripleta}
@cindex compilación cruzada
Compilación cruzada para la @var{tripleta}, que debe ser una tripleta GNU
válida, cómo @code{"aarch64-linux-gnu"} (@pxref{Specifying Target triplets,
GNU configuration triplets,, autoconf, Autoconf}).

@item --list-systems
List all the supported systems, that can be passed as an argument to
@option{--system}.

@item --list-targets
List all the supported targets, that can be passed as an argument to
@option{--target}.

@anchor{build-check}
@item --check
@cindex determinismo, comprobación
@cindex reproducibilidad, comprobación
Reconstruye @var{paquete-o-derivación}, que ya está disponible en el
almacén, y emite un error si los resultados de la construcción no son
idénticos bit-a-bit.

Este mecanismo le permite comprobar si sustituciones previamente instaladas
son genuinas (@pxref{Sustituciones}), o si el resultado de la construcción de
un paquete es determinista. @xref{Invocación de guix challenge}, para más
información de referencia y herramientas.

Cuando se usa conjuntamente con @option{--keep-failed}, la salida que
difiere se mantiene en el almacén, bajo
@file{/gnu/store/@dots{}-check}. Esto hace fácil buscar diferencias entre
los dos resultados.

@item --repair
@cindex reparar elementos del almacén
@cindex corrupción, recuperarse de
Intenta reparar los elementos del almacén especificados, si están corruptos,
volviendo a descargarlos o mediante su reconstrucción.

Esta operación no es atómica y por lo tanto está restringida a @code{root}.

@item --derivations
@itemx -d
Devuelve las rutas de derivación, no las rutas de salida, de los paquetes
proporcionados.

@item --root=@var{archivo}
@itemx -r @var{archivo}
@cindex GC, añadir raíces
@cindex raíces del recolector de basura, añadir
Hace que @var{archivo} sea un enlace simbólico al resultado, y lo registra
como una raíz del recolector de basura.

Consecuentemente, los resultados de esta invocación de @command{guix build}
se protegen de la recolección de basura hasta que @var{archivo} se
elimine. Cuando se omite esa opción, los resultados son candidatos a la
recolección de basura en cuanto la construcción se haya
completado. @xref{Invocación de guix gc}, para más sobre las raíces del
recolector de basura.

@item --log-file
@cindex logs de construcción, acceso
Devuelve los nombres de archivos o URL de los log de construcción para el
@var{paquete-o-derivación} proporcionado, o emite un error si no se
encuentran los log de construcción.

Esto funciona independientemente de cómo se especificasen los paquetes o
derivaciones. Por ejemplo, las siguientes invocaciones son equivalentes:

@example
guix build --log-file $(guix build -d guile)
guix build --log-file $(guix build guile)
guix build --log-file guile
guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)'
@end example

Si no está disponible un registro local, y a menos que se proporcione
@option{--no-substitutes}, la orden busca el registro correspondiente en uno
de los servidores de sustituciones (como se especificaron con
@option{--substitute-urls}).

So for instance, imagine you want to see the build log of GDB on
@code{aarch64}, but you are actually on an @code{x86_64} machine:

@example
$ guix build --log-file gdb -s aarch64-linux
https://@value{SUBSTITUTE-SERVER-1}/log/@dots{}-gdb-7.10
@end example

¡Puede acceder libremente a una biblioteca inmensa de log de construcción!
@end table

@node Depuración de fallos de construcción
@subsection Depuración de fallos de construcción

@cindex fallos de construcción, depuración
Cuando esté definiendo un paquete nuevo (@pxref{Definición de paquetes}),
probablemente se encuentre que dedicando algún tiempo a depurar y afinar la
construcción hasta obtener un resultado satisfactorio. Para hacerlo, tiene
que lanzar manualmente las órdenes de construcción en un entorno tan similar
como sea posible al que el daemon de construcción usa.

To that end, the first thing to do is to use the @option{--keep-failed} or
@option{-K} option of @command{guix build}, which will keep the failed build
tree in @file{/tmp} or whatever directory you specified as @env{TMPDIR}
(@pxref{Opciones comunes de construcción, @option{--keep-failed}}).

De ahí en adelante, puede usar @command{cd} para ir al árbol de la
construcción fallida y cargar el archivo @file{environment-variables}, que
contiene todas las definiciones de variables de entorno que existían cuando
la construcción falló. Digamos que está depurando un fallo en la
construcción del paquete @code{foo}; una sesión típica sería así:

@example
$ guix build foo -K
@dots{} @i{build fails}
$ cd /tmp/guix-build-foo.drv-0
$ source ./environment-variables
$ cd foo-1.2
@end example

Ahora puede invocar órdenes (casi) como si fuese el daemon y encontrar los
errores en su proceso de construcción.

A veces ocurre que, por ejemplo, las pruebas de un paquete pasan cuando las
ejecuta manualmente pero fallan cuando el daemon las ejecuta. Esto puede
suceder debido a que el daemon construye dentro de contenedores donde, al
contrario que en nuestro entorno previo, el acceso a la red no está
disponible, @file{/bin/sh} no existe, etc. (@pxref{Configuración del entorno de construcción}).

En esos casos, puede tener que inspeccionar el proceso de construcción desde
un contenedor similar al creado por el daemon de construcción:

@example
$ guix build -K foo
@dots{}
$ cd /tmp/guix-build-foo.drv-0
$ guix shell --no-grafts -C -D foo strace gdb
[env]# source ./environment-variables
[env]# cd foo-1.2
@end example

Here, @command{guix shell -C} creates a container and spawns a new shell in
it (@pxref{Invoking guix shell}).  The @command{strace gdb} part adds the
@command{strace} and @command{gdb} commands to the container, which you may
find handy while debugging.  The @option{--no-grafts} option makes sure we
get the exact same environment, with ungrafted packages (@pxref{Actualizaciones de seguridad}, for more info on grafts).

Para acercarnos más al contenedor usado por el daemon de construcción,
podemos eliminar @file{/bin/sh}:

@example
[env]# rm /bin/sh
@end example

(Don't worry, this is harmless: this is all happening in the throw-away
container created by @command{guix shell}.)

La orden @command{strace} probablemente no esté en la ruta de búsqueda, pero
podemos ejecutar:

@example
[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check
@end example

De este modo, no solo habrá reproducido las variables de entorno que usa el
daemon, también estará ejecutando el proceso de construcción en un
contenedor similar al usado por el daemon.


@node Invocación de guix edit
@section Invocación de @command{guix edit}

@cindex @command{guix edit}
@cindex definición de paquete, edición
¡Tantos paquetes, tantos archivos de fuentes! La orden @command{guix edit}
facilita la vida de las usuarias y empaquetadoras apuntando su editor al
archivo de fuentes que contiene la definición de los paquetes
especificados. Por ejemplo:

@example
guix edit gcc@@4.9 vim
@end example

@noindent
ejecuta el programa especificado en la variable de entorno @env{VISUAL} o en
@env{EDITOR} para ver la receta de GCC@tie{}4.9.3 y la de Vim.

Si está usando una copia de trabajo de Git de Guix (@pxref{Construcción desde Git}), o ha creado sus propios paquetes en @env{GUIX_PACKAGE_PATH}
(@pxref{Módulos de paquetes}), será capaz de editar las recetas de los
paquetes. En otros casos, podrá examinar las recetas en modo de lectura
únicamente para paquetes actualmente en el almacén.

En vez de @env{GUIX_PACKAGE_PATH}, la opción de línea de ordenes
@option{--load-path=@var{directorio}} (o en versión corta @option{-L
@var{directorio}}) le permite añadir @var{directorio} al inicio de la ruta
de búsqueda de módulos de paquete y hacer visibles sus propios paquetes.

@node Invocación de guix download
@section Invocación de @command{guix download}

@cindex @command{guix download}
@cindex descargando las fuentes de paquetes
Durante la escritura de una definición de paquete, las desarrolladoras
típicamente tienen que descargar un archivador tar de fuentes, calcular su
hash SHA256 y escribir ese hash en la definición del paquete
(@pxref{Definición de paquetes}). La herramienta @command{guix download} ayuda
con esta tarea: descarga un archivo de la URI proporcionada, lo añade al
almacén e imprime tanto su nombre de archivo en el almacén como su hash
SHA256.

El hecho de que el archivo descargado se añada al almacén ahorra ancho de
banda: cuando el desarrollador intenta construir el paquete recién definido
con @command{guix build}, el archivador de fuentes no tiene que descargarse
de nuevo porque ya está en el almacén. También es una forma conveniente de
conservar archivos temporalmente, que pueden ser borrados en un momento dado
(@pxref{Invocación de guix gc}).

La orden @command{guix download} acepta las mismas URI que las usadas en las
definiciones de paquetes. En particular, permite URI @code{mirror://}. Las
URI @code{https} (HTTP sobre TLS) se aceptan @emph{cuando} el enlace Guile
con GnuTLS está disponible en el entorno de la usuaria; cuando no está
disponible se emite un error. @xref{Guile Preparations, how to install the
GnuTLS bindings for Guile,, gnutls-guile, GnuTLS-Guile}, para más
información.

@command{guix download} verifica los certificados del servidor HTTPS
cargando las autoridades X.509 del directorio al que apunta la variable de
entorno @env{SSL_CERT_DIR} (@pxref{Certificados X.509}), a menos que se use
@option{--no-check-certificate}.

Las siguientes opciones están disponibles:

@table @code
@item --hash=@var{algoritmo}
@itemx -H @var{algoritmo}
Calcula el resultado del hash usando el @var{algoritmo}
proporcionado. @xref{Invocación de guix hash}, para más información.

@item --format=@var{fmt}
@itemx -f @var{fmt}
Escribe el hash en el formato especificado por @var{fmt}. Para más
información sobre los valores aceptados en @var{fmt}, @pxref{Invocación de guix hash}.

@item --no-check-certificate
No valida los certificados X.509 de los servidores HTTPS.

Cuando se usa esta opción, no tiene @emph{absolutamente ninguna garantía} de
que está comunicando con el servidor responsable de la URL auténtico, lo que
le hace vulnerables a ataques de interceptación (``man-in-the-middle'').

@item --output=@var{archivo}
@itemx -o @var{archivo}
Almacena el archivo descargado en @var{archivo} en vez de añadirlo al
almacén.
@end table

@node Invocación de guix hash
@section Invocación de @command{guix hash}

@cindex @command{guix hash}
The @command{guix hash} command computes the hash of a file.  It is
primarily a convenience tool for anyone contributing to the distribution: it
computes the cryptographic hash of one or more files, which can be used in
the definition of a package (@pxref{Definición de paquetes}).

La sintaxis general es:

@example
guix hash @var{option} @var{file} ...
@end example

Cuando @var{archivo} es @code{-} (un guión), @command{guix hash} calcula el
hash de los datos leídos por la entrada estándar. @command{guix hash} tiene
las siguientes opciones:

@table @code

@item --hash=@var{algoritmo}
@itemx -H @var{algoritmo}
Calcula un hash usando el @var{algoritmo} especificado, @code{sha256} de
manera predeterminada.

@var{algorithm} must be the name of a cryptographic hash algorithm supported
by Libgcrypt @i{via} Guile-Gcrypt---e.g., @code{sha512} or @code{sha3-256}
(@pxref{Hash Functions,,, guile-gcrypt, Guile-Gcrypt Reference Manual}).

@item --format=@var{fmt}
@itemx -f @var{fmt}
Escribe el hash en el formato especificado por @var{fmt}.

Los formatos disponibles son: @code{base64}, @code{nix-base32},
@code{base32}, @code{base16} (se puede usar también @code{hex} y
@code{hexadecimal}).

Si no se especifica la opción @option{--format}, @command{guix hash}
mostrará el hash en @code{nix-base32}. Esta representación es la usada en
las definiciones de paquetes.

@item --recursive
@itemx -r
The @option{--recursive} option is deprecated in favor of
@option{--serializer=nar} (see below); @option{-r} remains accepted as a
convenient shorthand.

@item --serializer=@var{type}
@itemx -S @var{type}
Compute the hash on @var{file} using @var{type} serialization.

@var{type} may be one of the following:

@table @code
@item none
This is the default: it computes the hash of a file's contents.

@item nar
@c FIXME: Replace xref above with xref to an ``Archive'' section when
@c it exists.
Compute the hash of a ``normalized archive'' (or ``nar'') containing
@var{file}, including its children if it is a directory.  Some of the
metadata of @var{file} is part of the archive; for instance, when @var{file}
is a regular file, the hash is different depending on whether @var{file} is
executable or not.  Metadata such as time stamps have no impact on the hash
(@pxref{Invocación de guix archive}, for more info on the nar format).

@item git
Compute the hash of the file or directory as a Git ``tree'', following the
same method as the Git version control system.
@end table

@item --exclude-vcs
@itemx -x
Cuando se combina con @option{--recursive}, excluye los directorios del
sistema de control de versiones (@file{.bzr}, @file{.git}, @file{.hg},
etc.).

@vindex git-fetch
Como un ejemplo, así es como calcularía el hash de una copia de trabajo Git,
lo cual es útil cuando se usa el método @code{git-fetch} (@pxref{Referencia de origin}):

@example
$ git clone http://example.org/foo.git
$ cd foo
$ guix hash -x --serializer=nar .
@end example
@end table

@node Invocación de guix import
@section Invocación de @command{guix import}

@cindex importar paquetes
@cindex importación de un paquete
@cindex conversión de un paquete
@cindex Invocación de @command{guix import}
La orden @command{guix import} es útil para quienes desean añadir un paquete
a la distribución con el menor trabajo posible---una demanda legítima. La
orden conoce algunos repositorios de los que puede ``importar'' metadatos de
paquetes. El resultado es una definición de paquete, o una plantilla de
ella, en el formato que conocemos (@pxref{Definición de paquetes}).

La sintaxis general es:

@example
guix import @var{importador} @var{opciones}@dots{}
@end example

@var{importador} especifica la fuente de la que se importan los metadatos
del paquete, @var{opciones} especifica un identificador de paquete y otras
opciones específicas del @var{importador}.

Algunos de los importadores dependen de poder ejecutar la orden
@command{gpgv}. Para ello, GnuPG debe estar instalado y en @code{$PATH};
ejecute @code{guix install gnupg} si es necesario.

Actualmente los ``importadores'' disponibles son:

@table @code
@item gnu
Importa los metadatos del paquete GNU seleccionado. Proporciona una
plantilla para la última versión de dicho paquete GNU, incluyendo el hash de
su archivador tar de fuentes, y su sinopsis y descripción canónica.

Información adicional como las dependencias del paquete y su licencia deben
ser deducidas manualmente.

Por ejemplo, la siguiente orden devuelve una definición de paquete para
GNU@tie{}Hello.

@example
guix import gnu hello
@end example

Las opciones específicas de línea de ordenes son:

@table @code
@item --key-download=@var{política}
Como en @command{guix refresh}, especifica la política de tratamiento de las
claves OpenPGP no encontradas cuando se verifica la firma del
paquete. @xref{Invocación de guix refresh, @option{--key-download}}.
@end table

@item pypi
@cindex pypi
Importa metadatos desde el @uref{https://pypi.python.org/, índice de
paquetes Python (PyPI)}. La información se toma de la descripción con
formato JSON disponible en @code{pypi.python.org} y habitualmente incluye
toda la información relevante, incluyendo las dependencias del paquete. Para
una máxima eficiencia, se recomienda la instalación de la utilidad
@command{unzip}, de manera que el importador pueda extraer los archivos
wheel de Python y obtener datos de ellos.

The command below imports metadata for the latest version of the
@code{itsdangerous} Python package:

@example
guix import pypi itsdangerous
@end example

You can also ask for a specific version:

@example
guix import pypi itsdangerous@@1.1.0
@end example

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item gem
@cindex gem
Importa metadatos desde @uref{https://rubygems.org/, RubyGems}. La
información se extrae de la descripción en formato JSON disponible en
@code{rubygems.org} e incluye la información más relevante, incluyendo las
dependencias en tiempo de ejecución. Hay algunos puntos a tener en cuenta,
no obstante. Los metadatos no distinguen entre sinopsis y descripción, por
lo que se usa la misma cadena para ambos campos. Adicionalmente, los
detalles de las dependencias no-Ruby necesarias para construir extensiones
nativas no está disponible y se deja como ejercicio a la empaquetadora.

La siguiente orden importa los meta-datos para el paquete de Ruby
@code{rails}:

@example
guix import gem rails
@end example

You can also ask for a specific version:

@example
guix import gem rails@@7.0.4
@end example

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item minetest
@cindex minetest
@cindex ContentDB
Import metadata from @uref{https://content.minetest.net, ContentDB}.
Information is taken from the JSON-formatted metadata provided through
@uref{https://content.minetest.net/help/api/, ContentDB's API} and includes
most relevant information, including dependencies.  There are some caveats,
however.  The license information is often incomplete.  The commit hash is
sometimes missing.  The descriptions are in the Markdown format, but Guix
uses Texinfo instead.  Texture packs and subgames are unsupported.

The command below imports metadata for the Mesecons mod by Jeija:

@example
guix import minetest Jeija/mesecons
@end example

The author name can also be left out:

@example
guix import minetest mesecons
@end example

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item cpan
@cindex CPAN
Importa metadatos desde @uref{https://www.metacpan.org/, MetaCPAN}. La
información se extrae de la descripción en formato JSON disponible a través
del @uref{https://fastapi.metacpan.org/, API de MetaCPAN} e incluye la
información más relevante, como las dependencias de otros módulos. La
información de la licencia debe ser comprobada atentamente. Si Perl está
disponible en el almacén, se usará la utilidad @code{corelist} para borrar
los módulos básicos de la lista de dependencias.

La siguiente orden importa los metadatos del módulo Perl Acme::Boolean:

@example
guix import cpan Acme::Boolean
@end example

@item cran
@cindex CRAN
@cindex Bioconductor
Importa metadatos desde @uref{https://cran.r-project.org/, CRAN}, el
repositorio central para el @uref{https://r-project.org, entorno estadístico
y gráfico GNU@tie{}R}.

La información se extrae del archivo @file{DESCRIPTION} del paquete.

La siguiente orden importa los metadatos del paquete de R Cairo:

@example
guix import cran Cairo
@end example

You can also ask for a specific version:

@example
guix import cran rasterVis@@0.50.3
@end example

Cuando se añade @option{--recursive}, el importador recorrerá el grafo de
dependencias del paquete original proporcionado recursivamente y generará
expresiones de paquetes para todos aquellos que no estén todavía en Guix.

When @option{--style=specification} is added, the importer will generate
package definitions whose inputs are package specifications instead of
references to package variables.  This is useful when generated package
definitions are to be appended to existing user modules, as the list of used
package modules need not be changed.  The default is
@option{--style=variable}.

Cuando se usa @option{--archive=bioconductor}, los metadatos se importan de
@uref{https://www.bioconductor.org, Bioconductor}, un repositorio de
paquetes R para el análisis y comprensión de datos genéticos de alto caudal
en bioinformática.

La información se extrae del archivo @file{DESCRIPTION} contenido en el
archivo del paquete.

La siguiente orden importa los metadatos del paquete de R GenomicRanges:

@example
guix import cran --archive=bioconductor GenomicRanges
@end example

Por último, también puede importar paquetes de R que no se hayan publicado
todavía en CRAN o en Bioconductor siempre que estén en un repositorio
git. Use @option{--archive=git} seguido de la URL del repositorio git:

@example
guix import cran --archive=git https://github.com/immunogenomics/harmony
@end example

@item texlive
@cindex Tex Live
@cindex CTAN
Import TeX package information from the TeX Live package database for TeX
packages that are part of the @uref{https://www.tug.org/texlive/, TeX Live
distribution}.

Information about the package is obtained from the TeX Live package
database, a plain text file that is included in the @code{texlive-bin}
package.  The source code is downloaded from possibly multiple locations in
the SVN repository of the Tex Live project.

La siguiente orden importa los metadatos del paquete de TeX @code{fontspec}:

@example
guix import texlive fontspec
@end example

@item json
@cindex JSON, importación
Importa metadatos de paquetes desde un archivo JSON local. Considere el
siguiente ejemplo de definición de paquete en formato JSON:

@example
@{
  "name": "hello",
  "version": "2.10",
  "source": "mirror://gnu/hello/hello-2.10.tar.gz",
  "build-system": "gnu",
  "home-page": "https://www.gnu.org/software/hello/",
  "synopsis": "Hello, GNU world: An example GNU package",
  "description": "GNU Hello prints a greeting.",
  "license": "GPL-3.0+",
  "native-inputs": ["gettext"]
@}
@end example

Los nombres de los campos son los mismos que para el registro
@code{<package>} (@xref{Definición de paquetes}). Las referencias a otros
paquetes se proporcionan como listas JSON de cadenas de especificación de
paquete entrecomilladas como @code{guile} o @code{guile@@2.0}.

El importador también permite una definición de fuentes más explícita usando
los campos comunes de los registros @code{<origin>}:

@example
@{
  @dots{}
  "source": @{
    "method": "url-fetch",
    "uri": "mirror://gnu/hello/hello-2.10.tar.gz",
    "sha256": @{
      "base32": "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"
    @}
  @}
  @dots{}
@}
@end example

La siguiente orden importa los metadatos desde el archivo JSON
@code{hello.json} y devuelve una expresión de ``package'':

@example
guix import json hello.json
@end example

@item hackage
@cindex hackage
Importa metadatos desde el archivo central de paquetes de la comunidad
Haskell @uref{https://hackage.haskell.org/, Hackage}. La información se
obtiene de archivos Cabal e incluye toda la información relevante,
incluyendo las dependencias del paquete.

Las opciones específicas de línea de ordenes son:

@table @code
@item --stdin
@itemx -s
Lee un archivo Cabal por la entrada estándar.
@item --no-test-dependencies
@itemx -t
No incluye las dependencias necesarias únicamente para las baterías de
pruebas.
@item --cabal-environment=@var{alist}
@itemx -e @var{alist}
@var{alist} es una lista asociativa Scheme que define el entorno en el que
los condicionales Cabal se evalúan. Los valores aceptados son: @code{os},
@code{arch}, @code{impl} y una cadena que representa el nombre de la
condición. El valor asociado a la condición tiene que ser o bien el símbolo
@code{true} o bien @code{false}. Los valores predeterminados asociados a las
claves @code{os}, @code{arch} y @code{impl} son @samp{linux}, @samp{x86_64}
y @samp{ghc}, respectivamente.
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

La siguiente orden importa los metadatos de la última versión del paquete
Haskell HTTP sin incluir las dependencias de las pruebas y especificando la
opción @samp{network-uri} con valor @code{false}:

@example
guix import hackage -t -e "'((\"network-uri\" . false))" HTTP
@end example

Se puede especificar opcionalmente una versión específica del paquete
añadiendo al nombre del paquete una arroba y el número de versión como en el
siguiente ejemplo:

@example
guix import hackage mtl@@2.1.3.1
@end example

@item stackage
@cindex stackage
El importador @code{stackage} es un recubrimiento sobre el de
@code{hackage}. Toma un nombre de paquete, busca la versión de paquete
incluida en una publicación de la versión de mantenimiento extendido (LTS)
@uref{https://www.stackage.org, Stackage} y usa el importador @code{hackage}
para obtener sus metadatos. Fíjese que es su decisión seleccionar una
publicación LTS compatible con el compilador GHC usado en Guix.

Las opciones específicas de línea de ordenes son:

@table @code
@item --no-test-dependencies
@itemx -t
No incluye las dependencias necesarias únicamente para las baterías de
pruebas.
@item --lts-version=@var{versión}
@itemx -l @var{versión}
@var{versión} es la versión LTS de publicación deseada. Si se omite se usa
la última publicación.
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

La siguiente orden importa los metadatos del paquete Haskell HTTP incluido
en la versión de publicación LTS de Stackage 7.18:

@example
guix import stackage --lts-version=7.18 HTTP
@end example

@item elpa
@cindex elpa
Importa metadatos desde el repositorio de archivos de paquetes Emacs Lisp
(ELPA) (@pxref{Packages,,, emacs, The GNU Emacs Manual}).

Las opciones específicas de línea de ordenes son:

@table @code
@item --archive=@var{repo}
@itemx -a @var{repo}
@var{repo} identifica el repositorio de archivos del que obtener la
información. Actualmente los repositorios disponibles y sus identificadores
son:
@itemize -
@item
@uref{https://elpa.gnu.org/packages, GNU}, seleccionado con el identificador
@code{gnu}. Utilizado de manera predeterminada.

Los paquetes de @code{elpa.gnu.org} están firmados con una de las claves que
contiene el anillo de claves GnuPG en
@file{share/emacs/25.1/etc/package-keyring.gpg} (o similar) en el paquete
@code{emacs} (@pxref{Package Installation, ELPA package signatures,, emacs,
The GNU Emacs Manual}).

@item
@uref{https://elpa.nongnu.org/nongnu/, NonGNU}, selected by the
@code{nongnu} identifier.

@item
@uref{https://stable.melpa.org/packages, MELPA-Stable}, seleccionado con el
identificador @code{melpa-stable}.

@item
@uref{https://melpa.org/packages, MELPA}, seleccionado con el identificador
@code{melpa}.
@end itemize

@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item crate
@cindex crate
Importa metadatos desde el repositorio de paquetes Rust
@uref{https://crates.io, crates.io}, como en este ejemplo:

@example
guix import crate blake2-rfc
@end example

El importador de crate también le permite especificar una cadena de versión:

@example
guix import crate constant-time-eq@@0.1.0
@end example

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item elm
@cindex elm
Import metadata from the Elm package repository
@uref{https://package.elm-lang.org, package.elm-lang.org}, as in this
example:

@example
guix import elm elm-explorations/webgl
@end example

The Elm importer also allows you to specify a version string:

@example
guix import elm elm-explorations/webgl@@1.1.3
@end example

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item opam
@cindex OPAM
@cindex OCaml
Importa metadatos desde el repositorio de paquetes
@uref{https://opam.ocaml.org/, OPAM} usado por la comunidad OCaml.

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@item --repo
By default, packages are searched in the official OPAM repository.  This
option, which can be used more than once, lets you add other repositories
which will be searched for packages.  It accepts as valid arguments:

@itemize
@item the name of a known repository - can be one of @code{opam},
      @code{coq} (equivalent to @code{coq-released}), @code{coq-core-dev},
@code{coq-extra-dev} or @code{grew}.
@item the URL of a repository as expected by the
      @code{opam repository add} command (for instance, the URL equivalent of the
above @code{opam} name would be @uref{https://opam.ocaml.org}).
@item the path to a local copy of a repository (a directory containing a
      @file{packages/} sub-directory).
@end itemize

Repositories are assumed to be passed to this option by order of
preference.  The additional repositories will not replace the default
@code{opam} repository, which is always kept as a fallback.

Also, please note that versions are not compared across repositories.  The
first repository (from left to right) that has at least one version of a
given package will prevail over any others, and the version imported will be
the latest one found @emph{in this repository only}.

@end table

@item go
@cindex go
Import metadata for a Go module using @uref{https://proxy.golang.org,
proxy.golang.org}.

@example
guix import go gopkg.in/yaml.v2
@end example

It is possible to use a package specification with a @code{@@VERSION} suffix
to import a specific version.

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@item --pin-versions
When using this option, the importer preserves the exact versions of the Go
modules dependencies instead of using their latest available versions.  This
can be useful when attempting to import packages that recursively depend on
former versions of themselves to build.  When using this mode, the symbol of
the package is made by appending the version to its name, so that multiple
versions of the same package can coexist.
@end table

@item egg
@cindex egg
Import metadata for @uref{https://wiki.call-cc.org/eggs, CHICKEN eggs}.  The
information is taken from @file{PACKAGE.egg} files found in the
@uref{git://code.call-cc.org/eggs-5-all, eggs-5-all} Git repository.
However, it does not provide all the information that we need, there is no
``description'' field, and the licenses used are not always precise (BSD is
often used instead of BSD-N).

@example
guix import egg sourcehut
@end example

You can also ask for a specific version:

@example
guix import egg arrays@@1.0
@end example

La opciones adicionales incluyen:
@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@item hexpm
@cindex hexpm
Import metadata from the hex.pm Erlang and Elixir package repository
@uref{https://hex.pm, hex.pm}, as in this example:

@example
guix import hexpm stun
@end example

The importer tries to determine the build system used by the package.

The hexpm importer also allows you to specify a version string:

@example
guix import hexpm cf@@0.3.0
@end example

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table
@end table

La estructura del código de @command{guix import} es modular. Sería útil
tener más importadores para otros formatos de paquetes, y su ayuda es
bienvenida aquí (@pxref{Contribuir}).

@node Invocación de guix refresh
@section Invocación de @command{guix refresh}

@cindex @command{guix refresh}
The primary audience of the @command{guix refresh} command is packagers.  As
a user, you may be interested in the @option{--with-latest} option, which
can bring you package update superpowers built upon @command{guix refresh}
(@pxref{Opciones de transformación de paquetes, @option{--with-latest}}).  By
default, @command{guix refresh} reports any packages provided by the
distribution that are outdated compared to the latest upstream version, like
this:

@example
$ guix refresh
gnu/packages/gettext.scm:29:13: gettext would be upgraded from 0.18.1.1 to 0.18.2.1
gnu/packages/glib.scm:77:12: glib would be upgraded from 2.34.3 to 2.37.0
@end example

De manera alternativa, se pueden especificar los paquetes a considerar, en
cuyo caso se emite un aviso para paquetes que carezcan de actualizador:

@example
$ guix refresh coreutils guile guile-ssh
gnu/packages/ssh.scm:205:2: warning: no updater for guile-ssh
gnu/packages/guile.scm:136:12: guile would be upgraded from 2.0.12 to 2.0.13
@end example

@command{guix refresh} navega por los repositorios oficiales de cada paquete
y determina el número de versión mayor entre las publicaciones
encontradas. La orden sabe cómo actualizar tipos específicos de paquetes:
paquetes GNU, paquetes ELPA, etc.---vea la documentación de @option{--type}
más adelante. Hay muchos paquetes, no obstante, para los que carece de un
método para determinar si está disponible una versión oficial posterior. No
obstante, el mecanismo es extensible, ¡no tenga problema en contactar con
nosotras para añadir un método nuevo!

@table @code

@item --recursive
Considera los paquetes especificados, y todos los paquetes de los que
dependen.

@example
$ guix refresh --recursive coreutils
gnu/packages/acl.scm:40:13: acl would be upgraded from 2.2.53 to 2.3.1
gnu/packages/m4.scm:30:12: 1.4.18 is already the latest version of m4
gnu/packages/xml.scm:68:2: warning: no updater for expat
gnu/packages/multiprecision.scm:40:12: 6.1.2 is already the latest version of gmp
@dots{}
@end example

@end table

A veces el nombre oficial es diferente al nombre de paquete usado en Guix, y
@command{guix refresh} necesita un poco de ayuda. La mayor parte de los
actualizadores utilizan la propiedad @code{upstream-name} en las
definiciones de paquetes, que puede usarse para obtener dicho efecto:

@lisp
(define-public network-manager
  (package
    (name "network-manager")
    ;; @dots{}
    (properties '((upstream-name . "NetworkManager")))))
@end lisp

Cuando se proporciona @option{--update}, modifica los archivos de fuentes de
la distribución para actualizar los números de versión y hash de los
archivadores tar de fuentes en las recetas de los paquetes (@pxref{Definición de paquetes}). Esto se consigue con la descarga del último archivador de
fuentes del paquete y su firma OpenPGP asociada, seguida de la verificación
del archivador descargado y su firma mediante el uso de @command{gpg}, y
finalmente con el cálculo de su hash---tenga en cuenta que GnuPG debe estar
instalado y en @code{$PATH}; ejecute @code{guix install gnupg} si es
necesario.

Cuando la clave pública usada para firmar el archivador no se encuentra en
el anillo de claves de la usuaria, se intenta automáticamente su obtención
desde un servidor de claves públicas; cuando se encuentra, la clave se añade
al anillo de claves de la usuaria; en otro caso, @command{guix refresh}
informa de un error.

Se aceptan las siguientes opciones:

@table @code

@item --expression=@var{expr}
@itemx -e @var{expr}
Considera el paquete al que evalúa @var{expr}

Es útil para hacer una referencia precisa de un paquete concreto, como en
este ejemplo:

@example
guix refresh -l -e '(@@@@ (gnu packages commencement) glibc-final)'
@end example

Esta orden enumera los paquetes que dependen de la libc ``final''
(esencialmente todos los paquetes).

@item --update
@itemx -u
Actualiza los archivos fuente de la distribución (recetas de paquetes) en su
lugar. Esto se ejecuta habitualmente desde una copia de trabajo del árbol de
fuentes de Guix (@pxref{Ejecución de Guix antes de estar instalado}):

@example
$ ./pre-inst-env guix refresh -s non-core -u
@end example

@xref{Definición de paquetes}, para más información sobre la definición de
paquetes.

@item --select=[@var{subconjunto}]
@itemx -s @var{subconjunto}
Selecciona todos los paquetes en @var{subconjunto}, o bien @code{core} o
bien @code{non-core}.

El subconjunto @code{core} hace referencia a todos los paquetes en el núcleo
de la distribución---es decir, paquetes que se usan para construir ``todo lo
demás''. Esto incluye GCC, libc, Binutils, Bash, etc. Habitualmente, cambiar
uno de esos paquetes en la distribución conlleva la reconstrucción de todos
los demás. Por tanto, esas actualizaciones son una inconveniencia para las
usuarias en términos de tiempo de construcción o ancho de banda usado por la
actualización.

El subconjunto @code{non-core} hace referencia a los paquetes restantes. Es
típicamente útil en casos donde una actualización de paquetes básicos no
sería conveniente.

@item --manifest=@var{archivo}
@itemx -m @var{archivo}
Select all the packages from the manifest in @var{file}.  This is useful to
check if any packages of the user manifest can be updated.

@item --type=@var{actualizador}
@itemx -t @var{actualizador}
Selecciona únicamente paquetes manejados por @var{actualizador} (puede ser
una lista separada por comas de actualizadores). Actualmente,
@var{actualizador} puede ser:

@table @code
@item gnu
el actualizador de paquetes GNU;
@item savannah
el actualizador para paquetes alojados en @uref{https://savannah.gnu.org,
Savannah};
@item sourceforge
the updater for packages hosted at @uref{https://sourceforge.net,
SourceForge};
@item gnome
el actualizador para paquetes GNOME;
@item kde
el actualizador para paquetes KDE;
@item xorg
el actualizador para paquetes X.org;
@item kernel.org
el actualizador para paquetes alojados en kernel.org;
@item egg
the updater for @uref{https://wiki.call-cc.org/eggs/, Egg} packages;
@item elpa
el actualizador para paquetes @uref{https://elpa.gnu.org/, ELPA};
@item cran
el actualizador para paquetes @uref{https://cran.r-project.org/, CRAN};
@item bioconductor
el actualizador para paquetes R @uref{https://www.bioconductor.org/,
Bioconductor};
@item cpan
el actualizador para paquetes @uref{https://www.cpan.org/, CPAN};
@item pypi
el actualizador para paquetes @uref{https://pypi.python.org, PyPI}.
@item gem
el actualizador para paquetes @uref{https://rubygems.org, RubyGems}.
@item github
el actualizador para paquetes @uref{https://github.com, GitHub}.
@item hackage
el actualizador para paquetes @uref{https://hackage.haskell.org, Hackage}.
@item stackage
el actualizador para paquetes @uref{https://www.stackage.org, Stackage}.
@item crate
el actualizador para paquetes @uref{https://crates.io, Crates}.
@item launchpad
el actualizador para paquetes @uref{https://launchpad.net, Launchpad}.
@item generic-html
a generic updater that crawls the HTML page where the source tarball of the
package is hosted, when applicable.

@item generic-git
a generic updater for packages hosted on Git repositories.  It tries to be
smart about parsing Git tag names, but if it is not able to parse the tag
name and compare tags correctly, users can define the following properties
for a package.

@itemize
@item @code{release-tag-prefix}: a regular expression for matching a prefix of
the tag name.

@item @code{release-tag-suffix}: a regular expression for matching a suffix of
the tag name.

@item @code{release-tag-version-delimiter}: a string used as the delimiter in
the tag name for separating the numbers of the version.

@item @code{accept-pre-releases}: by default, the updater will ignore
pre-releases; to make it also look for pre-releases, set the this property
to @code{#t}.

@end itemize

@lisp
(package
  (name "foo")
  ;; ...
  (properties
    '((release-tag-prefix . "^release0-")
      (release-tag-suffix . "[a-z]?$")
      (release-tag-version-delimiter . ":"))))
@end lisp


@end table

Por ejemplo, la siguiente orden únicamente comprueba actualizaciones de
paquetes Emacs alojados en @code{elpa.gnu.org} y actualizaciones de paquetes
CRAN:

@example
$ guix refresh --type=elpa,cran
gnu/packages/statistics.scm:819:13: r-testthat would be upgraded from 0.10.0 to 0.11.0
gnu/packages/emacs.scm:856:13: emacs-auctex would be upgraded from 11.88.6 to 11.88.9
@end example

@item --list-updaters
Enumera los actualizadores disponibles y finaliza (vea la opción previa
@option{--type}).

Para cada actualizador, muestra la fracción de paquetes que cubre; al final
muestra la fracción de paquetes cubiertos por todos estos actualizadores.
@end table

Además, @command{guix refresh} puede recibir uno o más nombres de paquetes,
como en este ejemplo:

@example
$ ./pre-inst-env guix refresh -u emacs idutils gcc@@4.8
@end example

@noindent
The command above specifically updates the @code{emacs} and @code{idutils}
packages.  The @option{--select} option would have no effect in this case.
You might also want to update definitions that correspond to the packages
installed in your profile:

@example
$ ./pre-inst-env guix refresh -u \
       $(guix package --list-installed | cut -f1)
@end example

Cuando se considera la actualización de un paquete, a veces es conveniente
conocer cuantos paquetes se verían afectados por la actualización y su
compatibilidad debería comprobarse. Para ello la siguiente opción puede
usarse cuando se proporcionan uno o más nombres de paquete a @command{guix
refresh}:

@table @code

@item --list-dependent
@itemx -l
Enumera los paquetes de nivel superior dependientes que necesitarían una
reconstrucción como resultado de la actualización de uno o más paquetes.

@xref{Invocación de guix graph, el tipo @code{reverse-package} de @command{guix
graph}}, para información sobre cómo visualizar la lista de paquetes que
dependen de un paquete.

@end table

Sea consciente de que la opción @option{--list-dependent} únicamente
@emph{aproxima} las reconstrucciones necesarias como resultado de una
actualización. Más reconstrucciones pueden ser necesarias bajo algunas
circunstancias.

@example
$ guix refresh --list-dependent flex
Building the following 120 packages would ensure 213 dependent packages are rebuilt:
hop@@2.4.0 emacs-geiser@@0.13 notmuch@@0.18 mu@@0.9.9.5 cflow@@1.4 idutils@@4.6 @dots{}
@end example

La orden previa enumera un conjunto de paquetes que puede ser construido
para comprobar la compatibilidad con una versión actualizada del paquete
@code{flex}.

@table @code

@item --list-transitive
Enumera todos los paquetes de los que uno o más paquetes dependen.

@example
$ guix refresh --list-transitive flex
flex@@2.6.4 depends on the following 25 packages: perl@@5.28.0 help2man@@1.47.6
bison@@3.0.5 indent@@2.2.10 tar@@1.30 gzip@@1.9 bzip2@@1.0.6 xz@@5.2.4 file@@5.33 @dots{}
@end example

@end table

La orden previa enumera un conjunto de paquetes que, en caso de cambiar,
causarían la reconstrucción de @code{flex}.

Las siguientes opciones pueden usarse para personalizar la operación de
GnuPG:

@table @code

@item --gpg=@var{orden}
Use @var{orden} como la orden de GnuPG 2.x. Se busca @var{orden} en
@code{PATH}.

@item --keyring=@var{archivo}
Usa @var{archivo} como el anillo de claves para claves de
proveedoras. @var{archivo} debe estar en el @dfn{formato keybox}. Los
archivos Keybox normalmente tienen un nombre terminado en @file{.kbx} y
GNU@tie{}Privacy Guard (GPG) puede manipular estos archivos (@pxref{kbxutil,
@command{kbxutil},, gnupg, Using the GNU Privacy Guard}, para información
sobre una herramienta para manipular archivos keybox).

Cuando se omite esta opción, @command{guix refresh} usa
@file{~/.config/guix/upstream/trustedkeys.kbx} como el anillo de claves para
las firmas de proveedoras. Las firmas OpenPGP son comprobadas contra claves
de este anillo; las claves que falten son descargadas a este anillo de
claves también (véase @option{--key-download} a continuación).

Puede exportar claves de su anillo de claves GPG predeterminado en un
archivo keybox usando órdenes como esta:

@example
gpg --export rms@@gnu.org | kbxutil --import-openpgp >> mianillo.kbx
@end example

Del mismo modo, puede obtener claves de un archivo keybox específico así:

@example
gpg --no-default-keyring --keyring mianillo.kbx \
  --recv-keys @value{OPENPGP-SIGNING-KEY-ID}
@end example

@xref{GPG Configuration Options, @option{--keyring},, gnupg, Using the GNU
Privacy Guard}, for more information on GPG's @option{--keyring} option.

@item --key-download=@var{política}
Maneja las claves no encontradas de acuerdo a la @var{política}, que puede
ser una de:

@table @code
@item always
Siempre descarga las claves OpenPGP no encontradas del servidor de claves, y
las añade al anillo de claves GnuPG de la usuaria.

@item never
Nunca intenta descargar claves OpenPGP no encontradas. Simplemente propaga
el error.

@item interactive
Cuando se encuentra un paquete firmado por una clave OpenPGP desconocida,
pregunta a la usuaria si descargarla o no. Este es el comportamiento
predeterminado.
@end table

@item --key-server=@var{dirección}
Use @var{dirección} como el servidor de claves OpenPGP cuando se importa una
clave pública.

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
a las herramientas de línea de órdenes.

@end table

El actualizador @code{github} usa la @uref{https://developer.github.com/v3/,
API de GitHub} para consultar nuevas publicaciones. Cuando se usa
repetidamente, por ejemplo al comprobar todos los paquetes, GitHub terminará
rechazando las peticiones siguientes a través de su API. Por defecto se
permiten 60 peticiones por hora a través de su API, y una actualización
completa de todos los paquetes de GitHub en Guix necesita más que eso. La
identificación con GitHub a través del uso de un identificador de su API
(``token'') amplia esos límites. Para usar dicho identificador, establezca
la variable de entorno @env{GUIX_GITHUB_TOKEN} al valor obtenido a través de
@uref{https://github.com/settings/tokens} o de otra manera.


@node Invoking guix style
@section Invoking @command{guix style}

@cindex @command{guix style}
@cindex styling rules
@cindex lint, code style
@cindex format, code style
@cindex format conventions
The @command{guix style} command helps users and packagers alike style their
package definitions and configuration files according to the latest
fashionable trends.  It can either reformat whole files, with the
@option{--whole-file} option, or apply specific @dfn{styling rules} to
individual package definitions.  The command currently provides the
following styling rules:

@itemize
@item
formatting package definitions according to the project's conventions
(@pxref{Formato del código});

@item
rewriting package inputs to the ``new style'', as explained below.
@end itemize

The way package inputs are written is going through a transition
(@pxref{Referencia de package}, for more on package inputs).  Until version
1.3.0, package inputs were written using the ``old style'', where each input
was given an explicit label, most of the time the package name:

@lisp
(package
  ;; @dots{}
  ;; The "old style" (deprecated).
  (inputs `(("libunistring" ,libunistring)
            ("libffi" ,libffi))))
@end lisp

Today, the old style is deprecated and the preferred style looks like this:

@lisp
(package
  ;; @dots{}
  ;; The "new style".
  (inputs (list libunistring libffi)))
@end lisp

Likewise, uses of @code{alist-delete} and friends to manipulate inputs is
now deprecated in favor of @code{modify-inputs} (@pxref{Definición de variantes de paquetes}, for more info on @code{modify-inputs}).

In the vast majority of cases, this is a purely mechanical change on the
surface syntax that does not even incur a package rebuild.  Running
@command{guix style -S inputs} can do that for you, whether you're working
on packages in Guix proper or in an external channel.

La sintaxis general es:

@example
guix style [@var{options}] @var{package}@dots{}
@end example

This causes @command{guix style} to analyze and rewrite the definition of
@var{package}@dots{} or, when @var{package} is omitted, of @emph{all} the
packages.  The @option{--styling} or @option{-S} option allows you to select
the style rule, the default rule being @code{format}---see below.

To reformat entire source files, the syntax is:

@example
guix style --whole-file @var{file}@dots{}
@end example

Las opciones disponibles se enumeran a continuación.

@table @code
@item --dry-run
@itemx -n
Show source file locations that would be edited but do not modify them.

@item --whole-file
@itemx -f
Reformat the given files in their entirety.  In that case, subsequent
arguments are interpreted as file names (rather than package names), and the
@option{--styling} option has no effect.

As an example, here is how you might reformat your operating system
configuration (you need write permissions for the file):

@example
guix style -f /etc/config.scm
@end example

@item --styling=@var{rule}
@itemx -S @var{rule}
Apply @var{rule}, one of the following styling rules:

@table @code
@item format
Format the given package definition(s)---this is the default styling rule.
For example, a packager running Guix on a checkout (@pxref{Ejecución de Guix antes de estar instalado}) might want to reformat the definition of the
Coreutils package like so:

@example
./pre-inst-env guix style coreutils
@end example

@item inputs
Rewrite package inputs to the ``new style'', as described above.  This is
how you would rewrite inputs of package @code{whatnot} in your own channel:

@example
guix style -L ~/my/channel -S inputs whatnot
@end example

Rewriting is done in a conservative way: preserving comments and bailing out
if it cannot make sense of the code that appears in an inputs field.  The
@option{--input-simplification} option described below provides fine-grain
control over when inputs should be simplified.
@end table

@item --list-stylings
@itemx -l
List and describe the available styling rules and exit.

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

@item --expression=@var{expr}
@itemx -e @var{expr}
Style the package @var{expr} evaluates to.

Por ejemplo, ejecutando:

@example
guix style -e '(@@ (gnu packages gcc) gcc-5)'
@end example

styles the @code{gcc-5} package definition.

@item --input-simplification=@var{policy}
When using the @code{inputs} styling rule, with @samp{-S inputs}, this
option specifies the package input simplification policy for cases where an
input label does not match the corresponding package name.  @var{policy} may
be one of the following:

@table @code
@item silent
Simplify inputs only when the change is ``silent'', meaning that the package
does not need to be rebuilt (its derivation is unchanged).

@item safe
Simplify inputs only when that is ``safe'' to do: the package might need to
be rebuilt, but the change is known to have no observable effect.

@item always
Simplify inputs even when input labels do not match package names, and even
if that might have an observable effect.
@end table

The default is @code{silent}, meaning that input simplifications do not
trigger any package rebuild.
@end table

@node Invocación de guix lint
@section Invocación de @command{guix lint}

@cindex @command{guix lint}
@cindex paquete, comprobación de errores
La orden @command{guix lint} sirve para ayudar a las desarrolladoras de
paquetes a evitar errores comunes y usar un estilo consistente. Ejecuta un
número de comprobaciones en un conjunto de paquetes proporcionado para
encontrar errores comunes en sus definiciones. Las @dfn{comprobaciones}
disponibles incluyen (véase @option{--list-checkers} para una lista
completa):

@table @code
@item synopsis
@itemx description
Valida ciertas reglas tipográficas y de estilo en la descripción y sinopsis
de cada paquete.

@item inputs-should-be-native
Identifica entradas que probablemente deberían ser entradas nativas.

@item source
@itemx home-page
@itemx mirror-url
@itemx github-url
@itemx source-file-name
Probe @code{home-page} and @code{source} URLs and report those that are
invalid.  Suggest a @code{mirror://} URL when applicable.  If the
@code{source} URL redirects to a GitHub URL, recommend usage of the GitHub
URL@.  Check that the source file name is meaningful, e.g.@: is not just a
version number or ``git-checkout'', without a declared @code{file-name}
(@pxref{Referencia de origin}).

@item source-unstable-tarball
Analiza la URL @code{source} para determinar si un archivador tar de GitHub
se genera de forma automática o es una publicación
oficial. Desafortunadamente los archivadores tar de GitHub a veces se
regeneran.

@item derivation
Comprueba que la derivación de los paquetes proporcionados pueden ser
calculadas de manera satisfactoria en todos los sistemas implementados
(@pxref{Derivaciones}).

@item profile-collisions
Comprueba si la instalación de los paquetes proporcionados en el perfil
provocaría colisiones. Las colisiones se producen cuando se propagan varios
paquetes con el mismo nombre pero una versión diferente o un nombre de
archivo del almacén.  @xref{Referencia de package, @code{propagated-inputs}},
para más información sobre entradas propagadas.

@item archival
@cindex Software Heritage, archivo de código fuente
@cindex archivado de código fuente, Software Heritage
Comprueba si el código fuente del paquete se encuentra archivado en
@uref{https://www.softwareheritage.org, Software Heritage}.

Cuando el código fuente que no se encuentra archivado proviene de un sistema
de control de versiones@footnote{VCS en inglés}---por ejemplo, se ha
obtenido con @code{git-fetch}---, envía a Software Heritage una petición de
almacenamiento de manera que se archive cuando sea posible. Esto asegura que
las fuentes permanecen disponibles a largo plazo, y que Guix puede usar
Software Heritage como respaldo en caso de que el código fuente
desapareciese de la máquina que lo almacenaba originalmente. El estado de
las peticiones de almacenamiento recientes puede
@uref{https://archive.softwareheritage.org/save/#requests, verse en su
página web}.

Cuando el código fuente es un archivo comprimido que se obtiene con
@code{url-fetch}, simplemente imprime un mensaje cuando no se encuentra
archivado. En el momento de la escritura de este documento, Software
Heritage no permite el almacenamiento de archivos comprimidos arbitrarios;
estamos trabajando en formas de asegurar que también se archive el código
que no se encuentra bajo control de versiones.

Software Heritage
@uref{https://archive.softwareheritage.org/api/#rate-limiting, limita la
tasa de peticiones por dirección IP}. Cuando se alcanza dicho límite,
@command{guix lint} imprime un mensaje y la comprobación @code{archival} no
hace nada hasta que dicho límite se reinicie.

@item cve
@cindex vulnerabilidades de seguridad
@cindex CVE, vulnerabilidades y exposiciones comunes
Informa de vulnerabilidades encontradas en las bases de datos de
vulnerabilidades y exposiciones comunes (CVE) del año actual y el pasado
@uref{https://nvd.nist.gov/vuln/data-feeds, publicadas por el NIST de EEUU}.

Para ver información acerca de una vulnerabilidad particular, visite páginas
como:

@itemize
@item
@indicateurl{https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-YYYY-ABCD}
@item
@indicateurl{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-YYYY-ABCD}
@end itemize

@noindent
donde @code{CVE-YYYY-ABCD} es el identificador CVE---por ejemplo,
@code{CVE-2015-7554}.

Las desarrolladoras de paquetes pueden especificar en las recetas del
paquete el nombre y versión en la @uref{https://nvd.nist.gov/cpe.cfm,
plataforma común de enumeración (CPE)} del paquete cuando el nombre o
versión que usa Guix son diferentes, como en este ejemplo:

@lisp
(package
  (name "grub")
  ;; @dots{}
  ;; CPE llama a este paquete "grub2".
  (properties '((cpe-name . "grub2")
                (cpe-version . "2.3"))))
@end lisp

@c See <https://www.openwall.com/lists/oss-security/2017/03/15/3>.
Algunas entradas en la base de datos CVE no especifican a qué versión del
paquete hacen referencia, y por lo tanto ``permanecen visibles'' para
siempre. Las desarrolladoras de paquetes que encuentren alertas CVE y
verifiquen que pueden ignorarse, pueden declararlas como en este ejemplo:

@lisp
(package
  (name "t1lib")
  ;; @dots{}
  ;; Estas alertas de CVE no aplican y pueden ignorarse
  ;; con seguridad.
  (properties `((lint-hidden-cve . ("CVE-2011-0433"
                                    "CVE-2011-1553"
                                    "CVE-2011-1554"
                                    "CVE-2011-5244")))))
@end lisp

@item formatting
Avisa de problemas de formato obvios en el código fuente: espacios en blanco
al final de las líneas, uso de tabuladores, etc.

@item input-labels
Report old-style input labels that do not match the name of the
corresponding package.  This aims to help migrate from the ``old input
style''.  @xref{Referencia de package}, for more information on package inputs
and input styles.  @xref{Invoking guix style}, on how to migrate to the new
style.
@end table

La sintaxis general es:

@example
guix lint @var{opciones} @var{paquete}@dots{}
@end example

Si no se proporciona ningún paquete en la linea de órdenes, todos los
paquetes se comprueban. Las @var{opciones} pueden ser cero o más de las
siguientes:

@table @code
@item --list-checkers
@itemx -l
Enumera y describe todas las comprobaciones disponibles que se ejecutarán
sobre los paquetes y finaliza.

@item --checkers
@itemx -c
Únicamente activa las comprobaciones especificadas en una lista separada por
comas que use los nombres devueltos por @option{--list-checkers}.

@item --exclude
@itemx -x
Únicamente desactiva las comprobaciones especificadas en una lista separada
por comas que use los nombres devueltos por @option{--list-checkers}.

@item --expression=@var{expr}
@itemx -e @var{expr}
Considera el paquete al que evalúa @var{expr}

This is useful to unambiguously designate packages, as in this example:

@example
guix lint -c archival -e '(@@ (gnu packages guile) guile-3.0)'
@end example

@item --no-network
@itemx -n
Activa únicamente las comprobaciones que no dependen del acceso a internet.

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
a las herramientas de línea de órdenes.

@end table

@node Invocación de guix size
@section Invocación de @command{guix size}

@cindex size
@cindex tamaño del paquete
@cindex closure
@cindex @command{guix size}
La orden @command{guix size} ayuda a las desarrolladoras de paquetes a
perfilar el uso de disco de los paquetes. Es fácil pasar por encima el
impacto que produce añadir una dependencia adicional a un paquete, o el
impacto del uso de una salida única para un paquete que puede ser dividido
fácilmente (@pxref{Paquetes con múltiples salidas}). Estos son los problemas
típicos que @command{guix size} puede resaltar.

Se le pueden proporcionar una o más especificaciones de paquete como
@code{gcc@@4.8} o @code{guile:debug}, o un nombre de archivo en el
almacén. Considere este ejemplo:

@example
$ guix size coreutils
store item                               total    self
/gnu/store/@dots{}-gcc-5.5.0-lib           60.4    30.1  38.1%
/gnu/store/@dots{}-glibc-2.27              30.3    28.8  36.6%
/gnu/store/@dots{}-coreutils-8.28          78.9    15.0  19.0%
/gnu/store/@dots{}-gmp-6.1.2               63.1     2.7   3.4%
/gnu/store/@dots{}-bash-static-4.4.12       1.5     1.5   1.9%
/gnu/store/@dots{}-acl-2.2.52              61.1     0.4   0.5%
/gnu/store/@dots{}-attr-2.4.47             60.6     0.2   0.3%
/gnu/store/@dots{}-libcap-2.25             60.5     0.2   0.2%
total: 78.9 MiB
@end example

@cindex closure
Los elementos del almacén enumerados aquí constituyen la @dfn{clausura
transitiva} de Coreutils---es decir, Coreutils y todas sus dependencias,
recursivamente---como sería devuelto por:

@example
$ guix gc -R /gnu/store/@dots{}-coreutils-8.23
@end example

Aquí la salida muestra tres columnas junto a los elementos del almacén. La
primera columna, etiquetada ``total'', muestra el tamaño en mebibytes (MiB)
de la clausura del elemento del almacén---es decir, su propio tamaño sumado
al tamaño de todas sus dependencias. La siguiente columna, etiquetada
``self'', muestra el tamaño del elemento en sí. La última columna muestra la
relación entre el tamaño del elemento en sí frente al espacio ocupado por
todos los elementos enumerados.

En este ejemplo, vemos que la clausura de Coreutils ocupa 79@tie{}MiB, cuya
mayor parte son libc y las bibliotecas auxiliares de GCC para tiempo de
ejecución. (Que libc y las bibliotecas de GCC representen una fracción
grande de la clausura no es un problema en sí, puesto que siempre están
disponibles en el sistema de todas maneras).

Puesto que la orden también acepta nombres de archivo del almacén, comprobar
el tamaño del resultado de una construcción es una operación directa:

@example
guix size $(guix system build config.scm)
@end example

Cuando los paquetes pasados a @command{guix size} están disponibles en el
almacén@footnote{Más precisamente, @command{guix size} busca la variante
@emph{sin injertos} de los paquetes, como el devuelto por @code{guix build
@var{paquete} --no-grafts}. @xref{Actualizaciones de seguridad}, para información sobre
injertos.} consultando al daemon para determinar sus dependencias, y mide su
tamaño en el almacén, de forma similar a @command{du -ms --apparent-size}
(@pxref{du invocation,,, coreutils, GNU Coreutils}).

Cuando los paquetes proporcionados @emph{no} están en el almacén,
@command{guix size} informa en base de las sustituciones disponibles
(@pxref{Sustituciones}). Esto hace posible perfilar el espacio en disco
incluso de elementos del almacén que no están en el disco, únicamente
disponibles de forma remota.

Puede especificar también varios nombres de paquetes:

@example
$ guix size coreutils grep sed bash
store item                               total    self
/gnu/store/@dots{}-coreutils-8.24          77.8    13.8  13.4%
/gnu/store/@dots{}-grep-2.22               73.1     0.8   0.8%
/gnu/store/@dots{}-bash-4.3.42             72.3     4.7   4.6%
/gnu/store/@dots{}-readline-6.3            67.6     1.2   1.2%
@dots{}
total: 102.3 MiB
@end example

@noindent
En este ejemplo vemos que la combinación de los cuatro paquetes toma
102.3@tie{}MiB en total, lo cual es mucho menos que la suma de cada
clausura, ya que tienen muchas dependencias en común.

Cuando tenga delante el perfil devuelto por @command{guix size} puede
preguntarse cuál es la razón de que cierto paquete aparezca en el
perfil. Para entenderlo puede usar @command{guix graph --path -t references}
para mostrar la ruta más corta entre dos paquetes (@pxref{Invocación de guix graph}).

Las opciones disponibles son:

@table @option

@item --substitute-urls=@var{urls}
Usa la información de sustituciones de
@var{urls}. @xref{client-substitute-urls, la misma opción en @code{guix
build}}.

@item --sort=@var{clave}
Ordena las líneas de acuerdo a @var{clave}, una de las siguientes opciones:

@table @code
@item propio
el tamaño de cada elemento (predeterminada);
@item closure
el tamaño total de la clausura del elemento.
@end table

@item --map-file=@var{archivo}
Escribe un mapa gráfico del uso del disco en formato PNG en el
@var{archivo}.

Para el ejemplo previo, el mapa tiene esta pinta:

@image{images/coreutils-size-map,5in,, mapa del uso del disco de Coreutils
producido por @command{guix size}}

Esta opción necesita que la biblioteca
@uref{https://wingolog.org/software/guile-charting/, Guile-Charting} esté
instalada y visible en la ruta de búsqueda de módulos Guile. Cuando no es el
caso, @command{guix size} produce un error al intentar cargarla.

@item --system=@var{sistema}
@itemx -s @var{sistema}
Considera paquetes para @var{sistema}---por ejemplo, @code{x86_64-linux}.

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
a las herramientas de línea de órdenes.
@end table

@node Invocación de guix graph
@section Invocación de @command{guix graph}

@cindex GAD (DAG en inglés)
@cindex @command{guix graph}
@cindex dependencias de un paquete
Packages and their dependencies form a @dfn{graph}, specifically a directed
acyclic graph (DAG).  It can quickly become difficult to have a mental model
of the package DAG, so the @command{guix graph} command provides a visual
representation of the DAG@.  By default, @command{guix graph} emits a DAG
representation in the input format of @uref{https://www.graphviz.org/,
Graphviz}, so its output can be passed directly to the @command{dot} command
of Graphviz.  It can also emit an HTML page with embedded JavaScript code to
display a ``chord diagram'' in a Web browser, using the
@uref{https://d3js.org/, d3.js} library, or emit Cypher queries to construct
a graph in a graph database supporting the
@uref{https://www.opencypher.org/, openCypher} query language.  With
@option{--path}, it simply displays the shortest path between two packages.
The general syntax is:

@example
guix graph @var{opciones} @var{paquete}@dots{}
@end example

Por ejemplo, la siguiente orden genera un archivo PDF que representa el GAD
para GNU@tie{}Core Utilities, mostrando sus dependencias en tiempo de
construcción:

@example
guix graph coreutils | dot -Tpdf > gad.pdf
@end example

La salida es algo así:

@image{images/coreutils-graph,2in,,Grafo de dependencias de GNU Coreutils}

Bonito y pequeño grafo, ¿no?

Puede encontrar más agradable la navegación interactiva del grafo con la
orden @command{xdot} (del paquete @code{xdot}):

@example
guix graph coreutils | xdot -
@end example

¡Pero hay más de un grafo! El grafo previo es conciso: es el grafo de los
objetos package, omitiendo las entradas implícitas como GCC, libc, grep,
etc. Es habitualmente útil tener un grafo conciso así, pero a veces una
puede querer ver más detalles. @command{guix graph} implementa varios tipos
de grafos, lo que le permite seleccionar el nivel de detalle:

@table @code
@item package
Este es el tipo por defecto usado en el ejemplo previo. Muestra el GAD de
objetos package, excluyendo dependencias implícitas. Es conciso, pero deja
fuera muchos detalles.

@item reverse-package
Esto muestra el GAD @emph{inverso} de paquetes. Por ejemplo:

@example
guix graph --type=reverse-package ocaml
@end example

...@: emite el grafo de paquetes que dependen @emph{explícitamente} de OCaml
(si también tiene interés en casos donde OCaml es una dependencia implícita,
véase @code{reverse-bag} a continuación).

Fíjese que esto puede producir grafos inmensos para los paquetes básicos. Si
todo lo que quiere saber es el número de paquetes que dependen de uno
determinado, use @command{guix refresh --list-dependent} (@pxref{Invocación de guix refresh, @option{--list-dependent}}).

@item bag-emerged
Este es el GAD del paquete, @emph{incluyendo} entradas implícitas.

Por ejemplo, la siguiente orden:

@example
guix graph --type=bag-emerged coreutils
@end example

...@: emite este grafo más grande:

@image{images/coreutils-bag-graph,,5in,Grafo de dependencias detallado de
GNU Coreutils}

En la parte inferior del grafo, vemos todas las entradas implícitas de
@var{gnu-build-system} (@pxref{Sistemas de construcción, @code{gnu-build-system}}).

Ahora bien, fíjese que las dependencias de estas entradas implícitas---es
decir, las @dfn{dependencias del lanzamiento inicial}
(@pxref{Lanzamiento inicial})---no se muestran aquí para mantener una salida
concisa.

@item bag
Similar a @code{bag-emerged}, pero esta vez incluye todas las dependencias
del lanzamiento inicial.

@item bag-with-origins
Similar a @code{bag}, pero también muestra los orígenes y sus dependencias.

@item reverse-bag
Muestra el GAD @emph{inverso} de paquetes. Al contrario que
@code{reverse-package}, también tiene en cuenta las dependencias
implícitas. Por ejemplo:

@example
guix graph -t reverse-bag dune
@end example

@noindent
...@: emite el grafo de tosos los paquetes que dependen de Dune, directa o
indirectamente. Ya que Dune es una dependencia @emph{implícita} de muchos
paquetes @i{vía} @code{dune-build-system}, esto mostrará un gran número de
paquetes, mientras que @code{reverse-package} mostraría muy pocos si muestra
alguno.

@item derivation
Esta es la representación más detallada: muestra el GAD de derivaciones
(@pxref{Derivaciones}) y elementos simples del almacén. Comparada con las
representaciones previas, muchos nodos adicionales son visibles, incluyendo
los guiones de construcción, parches, módulos Guile, etc.

Para este tipo de grafo, también es posible pasar un nombre de archivo
@file{.drv} en vez del nombre del paquete, como en:

@example
guix graph -t derivation $(guix system build -d my-config.scm)
@end example

@item module
Este es el grafo de los @dfn{módulos de paquete} (@pxref{Módulos de paquetes}). Por ejemplo, la siguiente orden muestra el grafo para el módulo
de paquetes que define el paquete @code{guile}:

@example
guix graph -t module guile | xdot -
@end example
@end table

Todos los tipos previos corresponden a las @emph{dependencias durante la
construcción}. El grafo siguiente representa las @emph{dependencias en
tiempo de ejecución}:

@table @code
@item references
Este es el grafo de @dfn{referencias} de la salida de un paquete, como lo
devuelve @command{guix gc --references} (@pxref{Invocación de guix gc}).

Si la salida del paquete proporcionado no está disponible en el almacén,
@command{guix graph} intenta obtener la información de dependencias desde
las sustituciones.

Aquí también puede proporcionar un nombre de archivo del almacén en vez de
un nombre de paquete. Por ejemplo, la siguiente orden produce el grafo de
referencias de su perfil (¡el cuál puede ser grande!):

@example
guix graph -t references $(readlink -f ~/.guix-profile)
@end example

@item referrers
Este es el grafo de @dfn{referentes} de la salida de un paquete, como lo
devuelve @command{guix gc --referrers} (@pxref{Invocación de guix gc}).

Depende exclusivamente de información en su almacén. Por ejemplo, supongamos
que la versión actual de Inkscape está disponible en 10 perfiles en su
máquina; @command{guix graph -t referrers inkscape} mostrará un grafo cuya
raíz es Inkscape y con esos 10 perfiles enlazados a ella.

Puede ayudar a determinar qué impide que un elemento del almacén sea
recolectado.

@end table

@cindex ruta más corta, entre paquetes
Habitualmente el grafo del paquete por el que tiene interés no entrará en su
pantall, y en cualquier caso todo lo que quiere saber es @emph{por qué}
dicho paquete depende de algún paquete que parece no tener relación. La
opción @option{--path} le indica a @command{guix graph} que muestre la ruta
más corta entre dos paquetes (o derivaciones, o elementos del almacén,
etcétera):

@example
$ guix graph --path emacs libunistring
emacs@@26.3
mailutils@@3.9
libunistring@@0.9.10
$ guix graph --path -t derivation emacs libunistring
/gnu/store/@dots{}-emacs-26.3.drv
/gnu/store/@dots{}-mailutils-3.9.drv
/gnu/store/@dots{}-libunistring-0.9.10.drv
$ guix graph --path -t references emacs libunistring
/gnu/store/@dots{}-emacs-26.3
/gnu/store/@dots{}-libidn2-2.2.0
/gnu/store/@dots{}-libunistring-0.9.10
@end example

Sometimes you still want to visualize the graph but would like to trim it so
it can actually be displayed.  One way to do it is via the
@option{--max-depth} (or @option{-M}) option, which lets you specify the
maximum depth of the graph.  In the example below, we visualize only
@code{libreoffice} and the nodes whose distance to @code{libreoffice} is at
most 2:

@example
guix graph -M 2 libreoffice | xdot -f fdp -
@end example

Mind you, that's still a big ball of spaghetti, but at least @command{dot}
can render it quickly and it can be browsed somewhat.

Las opciones disponibles son las siguientes:

@table @option
@item --type=@var{tipo}
@itemx -t @var{tipo}
Produce un grafo de salida de @var{tipo}, donde @var{tipo} debe ser uno de
los valores enumerados previamente.

@item --list-types
Enumera los tipos de grafos implementados.

@item --backend=@var{motor}
@itemx -b @var{motor}
Produce un grafo usando el @var{motor} seleccionado.

@item --list-backends
Enumera los motores de grafos implementados.

Actualmente, los motores disponibles son Graphviz y d3.js.

@item --path
Muestra la ruta más corta entre dos nodos del tipo especificado por la
opción @option{--type}. El ejemplo siguiente muestra la ruta más corta entre
@code{libreoffice} y @code{llvm} de acuerdo con las referencias de
@code{libreoffice}:

@example
$ guix graph --path -t references libreoffice llvm
/gnu/store/@dots{}-libreoffice-6.4.2.2
/gnu/store/@dots{}-libepoxy-1.5.4
/gnu/store/@dots{}-mesa-19.3.4
/gnu/store/@dots{}-llvm-9.0.1
@end example

@item --expression=@var{expr}
@itemx -e @var{expr}
Considera el paquete al que evalúa @var{expr}

Es útil para hacer una referencia precisa de un paquete concreto, como en
este ejemplo:

@example
guix graph -e '(@@@@ (gnu packages commencement) gnu-make-final)'
@end example

@item --system=@var{sistema}
@itemx -s @var{sistema}
Muestra el grafo para @var{sistema}---por ejemplo, @code{i686-linux}.

El grafo de dependencias del paquete es altamente independiente de la
arquitectura, pero existen algunas partes dependientes de la arquitectura
que esta opción le permite visualizar.

@item --load-path=@var{directorio}
@itemx -L @var{directorio}
Añade @var{directorio} al frente de la ruta de búsqueda de módulos de
paquetes (@pxref{Módulos de paquetes}).

Esto permite a las usuarias definir sus propios paquetes y hacerlos visibles
a las herramientas de línea de órdenes.
@end table

Además de esto, @command{guix graph} permite todas las opciones habituales
de transformación de paquetes (@pxref{Opciones de transformación de paquetes}). Esto
facilita la visualización del efecto de una transformación de reescritura de
grafo como @option{--with-input}. Por ejemplo, la siguiente orden muestra el
grafo de @code{git} una vez que @code{openssl} ha sido reemplazado por
@code{libressl} en todos los nodos del grafo:

@example
guix graph git --with-input=openssl=libressl
@end example

¡Tantas posibilidades, tanta diversión!

@node Invocación de guix publish
@section Invocación de @command{guix publish}

@cindex @command{guix publish}
El propósito de @command{guix publish} es permitir a las usuarias compartir
fácilmente su almacén con otras, quienes pueden usarlo como servidor de
sustituciones (@pxref{Sustituciones}).

When @command{guix publish} runs, it spawns an HTTP server which allows
anyone with network access to obtain substitutes from it.  This means that
any machine running Guix can also act as if it were a build farm, since the
HTTP interface is compatible with Cuirass, the software behind the
@code{@value{SUBSTITUTE-SERVER-1}} build farm.

Por seguridad, cada sustitución se firma, permitiendo a las receptoras
comprobar su autenticidad e integridad (@pxref{Sustituciones}). Debido a que
@command{guix publish} usa la clave de firma del sistema, que es únicamente
legible por la administradora del sistema, debe iniciarse como root; la
opción @option{--user} hace que renuncie a sus privilegios tan pronto como
sea posible.

El par claves de firma debe generarse antes de ejecutar @command{guix
publish}, usando @command{guix archive --generate-key} (@pxref{Invocación de guix archive}).

When the @option{--advertise} option is passed, the server advertises its
availability on the local network using multicast DNS (mDNS) and DNS service
discovery (DNS-SD), currently @i{via} Guile-Avahi (@pxref{Top,,,
guile-avahi, Using Avahi in Guile Scheme Programs}).

La sintaxis general es:

@example
guix publish @var{opciones}@dots{}
@end example

La ejecución de @command{guix publish} sin ningún parámetro adicional
lanzará un servidor HTTP en el puerto 8080:

@example
guix publish
@end example

@cindex socket activation, for @command{guix publish}
@command{guix publish} can also be started following the systemd ``socket
activation'' protocol (@pxref{Service De- and Constructors,
@code{make-systemd-constructor},, shepherd, The GNU Shepherd Manual}).

Una vez el servidor de publicación ha sido autorizado, el daemon puede
descargar sustituciones de él. @xref{Obtención de sustiticiones desde otros servidores}.

Por defecto, @command{guix publish} comprime los archivos al vuelo cuando es
necesario. Este modo ``al vuelo'' es conveniente ya que no necesita
configuración y está disponible inmediatamente. No obstante, cuando se
proporciona servicio a muchos clientes, se recomienda usar la opción
@option{--cache}, que activa el almacenamiento en caché de los archivos
antes de enviarlos a los clientes---véase a continuación para más
detalles. La orden @command{guix weather} proporciona una forma fácil de
comprobar lo que proporciona un servidor (@pxref{Invocación de guix weather}).

Además @command{guix publish} también sirve como un espejo de acceso por
contenido a archivos de fuentes a los que los registros @code{origin} hacen
referencia (@pxref{Referencia de origin}). Por ejemplo, si asumimos que
@command{guix publish} se ejecuta en @code{example.org}, la siguiente URL
devuelve directamente el archivo @file{hello-2.10.tar.gz} con el hash SHA256
proporcionado (representado en formato @code{nix-base32}, @pxref{Invocación de guix hash}).

@example
http://example.org/file/hello-2.10.tar.gz/sha256/0ssi1@dots{}ndq1i
@end example

Obviamente estas URL funcionan solamente para archivos que se encuentran en
el almacén; en otros casos devuelven un 404 (``No encontrado'').

@cindex logs de construcción, publicación
Los log de construcción están disponibles desde URL @code{/log} como:

@example
http://example.org/log/gwspk@dots{}-guile-2.2.3
@end example

@noindent
Cuando @command{guix-daemon} está configurado para almacenar comprimidos los
log de construcción, como sucede de forma predeterminada (@pxref{Invocación de guix-daemon}), las URL @code{/log} devuelven los log igualmente comprimidos,
con un @code{Content-Type} adecuado y/o una cabecera
@code{Content-Encoding}. Recomendamos ejecutar @command{guix-daemon} con
@option{--log-compression=gzip} ya que los navegadores Web pueden extraer el
contenido automáticamente, lo cual no es el caso con la compresión bzip2.

Las siguientes opciones están disponibles:

@table @code
@item --port=@var{puerto}
@itemx -p @var{puerto}
Escucha peticiones HTTP en @var{puerto}.

@item --listen=@var{dirección}
Escucha en la interfaz de red de la @var{dirección}. El comportamiento
predeterminado es aceptar conexiones de cualquier interfaz.

@item --user=@var{usuaria}
@itemx -u @var{usuaria}
Cambia los privilegios a los de @var{usuaria} tan pronto como sea
posible---es decir, una vez el socket del servidor esté abierto y la clave
de firma haya sido leída.

@item --compression[=@var{método}[:@var{nivel}]]
@itemx -C [@var{método}[:@var{nivel}]]
Compress data using the given @var{method} and @var{level}.  @var{method} is
one of @code{lzip}, @code{zstd}, and @code{gzip}; when @var{method} is
omitted, @code{gzip} is used.

Cuando el @var{nivel} es cero, desactiva la compresión. El rango 1 a 9
corresponde a distintos niveles de compresión gzip: 1 es el más rápido, y 9
es el mejor (intensivo a nivel de CPU). El valor predeterminado es 3.

Usually, @code{lzip} compresses noticeably better than @code{gzip} for a
small increase in CPU usage; see
@uref{https://nongnu.org/lzip/lzip_benchmark.html,benchmarks on the lzip Web
page}.  However, @code{lzip} achieves low decompression throughput (on the
order of 50@tie{}MiB/s on modern hardware), which can be a bottleneck for
someone who downloads over a fast network connection.

The compression ratio of @code{zstd} is between that of @code{lzip} and that
of @code{gzip}; its main advantage is a
@uref{https://facebook.github.io/zstd/,high decompression speed}.

A menos que se use @option{--cache}, la compresión ocurre al vuelo y los
flujos comprimidos no se almacenan en caché. Por tanto, para reducir la
carga en la máquina que ejecuta @command{guix publish}, puede ser una buena
idea elegir un nivel de compresión bajo, ejecutar @command{guix publish}
detrás de una pasarela con caché o usar @option{--cache}. El uso de
@option{--cache} tiene la ventaja de que permite a @command{guix publish}
añadir la cabecera HTTP @code{Content-Length} a sus respuestas.

Se puede repetir esta opción, en cuyo caso cada sustitución se comprime
usando todos los métodos seleccionados, y todos son anunciados. Esto es útil
cuando las usuarias pueden no implementar todos los métodos de compresión:
pueden seleccionar el que implementan.

@item --cache=@var{directorio}
@itemx -c @var{directorio}
Almacena en caché los archivos y metadatos (URL @code{.narinfo}) en
@var{directorio} y únicamente proporciona archivos que están en la caché.

Cuando se omite esta opción, los archivos y metadatos se crean al
vuelo. Esto puede reducir el ancho de banda disponible, especialmente cuando
la compresión está activa, ya que se puede llegar al límite de la CPU. Otra
desventaja del modo predeterminado es que la longitud de los archivos no se
conoce con anterioridad, por lo que @command{guix publish} no puede añadir
la cabecera HTTP @code{Content-Length} a sus respuestas, lo que a su vez
previene que los clientes conozcan la cantidad de datos a descargar.

De manera contraria, cuando se usa @option{--cache}, la primera petición de
un elemento del almacén (a través de una URL @code{.narinfo}) inicia un
proceso en segundo plano para @dfn{cocinar} el archivo---calcular su
@code{.narinfo} y comprimirlo, en caso necesario. Una vez el archivo está
alojado en la caché de @var{directorio}, las siguientes peticiones obtendrán
un resultado satisfactorio y se ofrecerá el contenido directamente desde la
caché, lo que garantiza que los clientes obtienen el mejor ancho de banda
posible.

La primera petción de @code{.narinfo} devuelve no obstante el código 200, en
el caso de que el elemento del almacén sea ``lo suficientemente pequeño'',
es decir que su tamaño sea inferior al límite de bajo el que se ignora la
caché---véase la opción @option{--cache-bypass-threshold} a continuación. De
este modo, los clientes no deben esperar hasta que el archivo se haya
cocinado. Con elementos del almacén de mayor tamaño la primera petición
@code{.narinfo} devuelve el código 404, lo que significa que los clientes
deben esperar hasta que el archivo se haya cocinado.

El proceso de ``cocinado'' se realiza por hilos de trabajo. Por defecto, se
crea un hilo por núcleo de la CPU, pero puede ser personalizado. Véase
@option{--workers} a continuación.

Cuando se usa @option{--ttl}, las entradas en caché se borran
automáticamente cuando hayan expirado.

@item --workers=@var{N}
Cuando se usa @option{--cache}, solicita la creación de @var{N} hilos de
trabajo para ``cocinar'' archivos.

@item --ttl=@var{ttl}
Produce cabeceras HTTP @code{Cache-Control} que anuncian un tiempo-de-vida
(TTL) de @var{ttl}. @var{ttl} debe indicar una duración: @code{5d} significa
5 días, @code{1m} significa un mes, etc.

Esto permite a la usuaria de Guix mantener información de sustituciones en
la caché durante @var{ttl}. No obstante, fíjese que @code{guix publish} no
garantiza en sí que los elementos del almacén que proporciona de hecho
permanezcan disponibles hasta que @var{ttl} expire.

Adicionalmente, cuando se usa @option{--cache}, las entradas en caché que no
hayan sido accedidas en @var{ttl} y no tengan un elemento correspondiente en
el almacén pueden ser borradas.

@item --negative-ttl=@var{ttl}
Similarly produce @code{Cache-Control} HTTP headers to advertise the
time-to-live (TTL) of @emph{negative} lookups---missing store items, for
which the HTTP 404 code is returned.  By default, no negative TTL is
advertised.

This parameter can help adjust server load and substitute latency by
instructing cooperating clients to be more or less patient when a store item
is missing.

@item --cache-bypass-threshold=@var{tamaño}
Cuando se usa en conjunto con la opción @option{--cache}, los elementos del
almacén cuyo tamaño sea inferior a @var{tamaño} están disponibles de manera
inmediata, incluso cuando no están todavía en la caché. @var{tamaño} es el
número de bytes, o se puedem usar sufijos como @code{M} para megabytes,
etcétera. El valor predeterminado es @code{10M}.

La opción de omisión de la cache le permite reducir la latencia de
publicación a los clientes a expensas de un posible incremento en el uso de
E/S y procesador en el lado del servidor: dependiendo de los patrones de
acceso de los clientes, dichos elementos del almacén pueden ser cocinados
varias veces hasta que una copia se encuentre disponible en la caché.

Incrementar el valor límite puede ser útil para servidores que tengan pocas
usuarias, o para garantizar que dichas usuarias obtienen sustituciones
incluso con elementos del almacén que no son populares.

@item --nar-path=@var{ruta}
Usa @var{ruta} como el prefijo para las URL de los archivos ``nar''
(@pxref{Invocación de guix archive, archivadores normalizados}).

Por defecto, los archivos nar se proporcionan en una URL como
@code{/nar/gzip/@dots{}-coreutils-8.25}. Esta opción le permite cambiar la
parte @code{/nar} por @var{ruta}.

@item --public-key=@var{archivo}
@itemx --private-key=@var{archivo}
Usa los @var{archivo}s específicos como el par de claves pública y privada
usadas para firmar los elementos del almacén publicados.

Los archivos deben corresponder al mismo par de claves (la clave privada se
usa para la firma y la clave pública simplemente se anuncia en los metadatos
de la firma). Deben contener claves en el formato canónico de expresiones-S
como el producido por @command{guix archive --generate-key} (@pxref{Invocación de guix archive}). Por defecto, se usan @file{/etc/guix/signing-key.pub} y
@file{/etc/guix/signing-key.sec}.

@item --repl[=@var{puerto}]
@itemx -r [@var{puerto}]
Lanza un servidor REPL Guile (@pxref{REPL Servers,,, guile, GNU Guile
Reference Manual}) en @var{puerto} (37146 por defecto). Esto se usa
principalmente para la depuración de un servidor @command{guix publish} en
ejecución.
@end table

Activar @command{guix publish} en el sistema Guix consiste en solo una
línea: simplemente instancie un servicio @code{guix-publish-service-type} en
el campo @code{services} de su declaración del sistema operativo
@code{operating-system} (@pxref{guix-publish-service-type,
@code{guix-publish-service-type}})

Si en vez de eso ejecuta Guix en una distribución distinta, siga estas
instrucciones:

@itemize
@item
Si su distribución anfitriona usa el sistema de inicio systemd:

@example
# ln -s ~root/.guix-profile/lib/systemd/system/guix-publish.service \
        /etc/systemd/system/
# systemctl start guix-publish && systemctl enable guix-publish
@end example

@item
Si su distribución anfitriona usa el sistema de inicio Upstart:

@example
# ln -s ~root/.guix-profile/lib/upstart/system/guix-publish.conf /etc/init/
# start guix-publish
@end example

@item
En otro caso, proceda de forma similar con el sistema de inicio de su
distribución.
@end itemize

@node Invocación de guix challenge
@section Invocación de @command{guix challenge}

@cindex construcciones reproducibles
@cindex construcciones verificables
@cindex @command{guix challenge}
@cindex reto (challenge)
¿Los binarios que proporciona este servidor realmente corresponden al código
fuente que dice construir? ¿Es determinista el proceso de construcción de un
paquete? Estas son las preguntas que la orden @command{guix challenge}
intenta responder.

La primera es obviamente una cuestión importante: antes de usar un servidor
de sustituciones (@pxref{Sustituciones}), es importante haber
@emph{verificado} que proporciona los binarios correctos, y por tanto
@emph{ponerlo a prueba}@footnote{NdT: challenge en inglés.}. La segunda es
lo que permite la primera: si las construcciones de los paquetes son
deterministas, construcciones independientes deberían emitir el mismo
resultado, bit a bit; si el servidor proporciona un binario diferente al
obtenido localmente, o bien está corrupto o bien tiene intenciones
perniciosas.

Sabemos que el hash que se muestra en los nombres de archivo en
@file{/gnu/store} es el hash de todas las entradas del proceso que construyó
el archivo o directorio---compiladores, bibliotecas, guiones de
construcción, etc. (@pxref{Introducción}). Asumiendo procesos de
construcción deterministas, un nombre de archivo del almacén debe
corresponder exactamente a una salida de construcción. @command{guix
challenge} comprueba si existe, realmente, una asociación unívoca comparando
la salida de la construcción de varias construcciones independientes de
cualquier elemento del almacén proporcionado.

La salida de la orden muestra algo así:

@smallexample
$ guix challenge \
  --substitute-urls="https://@value{SUBSTITUTE-SERVER-1} https://guix.example.org" \
  openssl git pius coreutils grep
updating substitutes from 'https://@value{SUBSTITUTE-SERVER-1}'... 100.0%
updating substitutes from 'https://guix.example.org'... 100.0%
/gnu/store/@dots{}-openssl-1.0.2d contents differ:
  local hash: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://@value{SUBSTITUTE-SERVER-1}/nar/@dots{}-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
  https://guix.example.org/nar/@dots{}-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
  differing files:
    /lib/libcrypto.so.1.1
    /lib/libssl.so.1.1

/gnu/store/@dots{}-git-2.5.0 contents differ:
  local hash: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
  https://@value{SUBSTITUTE-SERVER-1}/nar/@dots{}-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
  https://guix.example.org/nar/@dots{}-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
  differing file:
    /libexec/git-core/git-fsck

/gnu/store/@dots{}-pius-2.1.1 contents differ:
  local hash: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://@value{SUBSTITUTE-SERVER-1}/nar/@dots{}-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
  https://guix.example.org/nar/@dots{}-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
  differing file:
    /share/man/man1/pius.1.gz

@dots{}

5 store items were analyzed:
  - 2 (40.0%) were identical
  - 3 (60.0%) differed
  - 0 (0.0%) were inconclusive
@end smallexample

@noindent
In this example, @command{guix challenge} queries all the substitute servers
for each of the fives packages specified on the command line.  It then
reports those store items for which the servers obtained a result different
from the local build (if it exists) and/or different from one another; here,
the @samp{local hash} lines indicate that a local build result was available
for each of these packages and shows its hash.

@cindex no-determinismo, en la construcción de paquetes
As an example, @code{guix.example.org} always gets a different answer.
Conversely, @code{@value{SUBSTITUTE-SERVER-1}} agrees with local builds,
except in the case of Git.  This might indicate that the build process of
Git is non-deterministic, meaning that its output varies as a function of
various things that Guix does not fully control, in spite of building
packages in isolated environments (@pxref{Características}).  Most common sources
of non-determinism include the addition of timestamps in build results, the
inclusion of random numbers, and directory listings sorted by inode number.
See @uref{https://reproducible-builds.org/docs/}, for more information.

Para encontrar cuál es el problema con este binario Git, la aproximación más
fácil es ejecutar:

@example
guix challenge git \
  --diff=diffoscope \
  --substitute-urls="https://@value{SUBSTITUTE-SERVER-1} https://guix.example.org"
@end example

Esto invoca automáticamente @command{diffoscope}, que muestra información
detallada sobre los archivos que son diferentes.

De manera alternativa, se puede hacer algo parecido a esto (@pxref{Invocación de guix archive}):

@example
$ wget -q -O - https://@value{SUBSTITUTE-SERVER-1}/nar/lzip/@dots{}-git-2.5.0 \
   | lzip -d | guix archive -x /tmp/git
$ diff -ur --no-dereference /gnu/store/@dots{}-git.2.5.0 /tmp/git
@end example

This command shows the difference between the files resulting from the local
build, and the files resulting from the build on
@code{@value{SUBSTITUTE-SERVER-1}} (@pxref{Overview, Comparing and Merging
Files,, diffutils, Comparing and Merging Files}).  The @command{diff}
command works great for text files.  When binary files differ, a better
option is @uref{https://diffoscope.org/, Diffoscope}, a tool that helps
visualize differences for all kinds of files.

Una vez haya realizado este trabajo, puede determinar si las diferencias son
debidas a un procedimiento de construcción no-determinista o a un servidor
con intenciones ocultas. Intentamos duramente eliminar las fuentes de
indeterminismo en los paquetes para facilitar la verificación de
sustituciones, pero por supuesto es un proceso que implica no solo a Guix,
sino a una gran parte de la comunidad del software libre. Entre tanto,
@command{guix challenge} es una herramienta para ayudar a afrontar el
problema.

If you are writing packages for Guix, you are encouraged to check whether
@code{@value{SUBSTITUTE-SERVER-1}} and other substitute servers obtain the
same build result as you did with:

@example
guix challenge @var{package}
@end example

La sintaxis general es:

@example
guix challenge @var{options} @var{argument}@dots{}
@end example

@noindent
where @var{argument} is a package specification such as @code{guile@@2.0} or
@code{glibc:debug} or, alternatively, a store file name as returned, for
example, by @command{guix build} or @command{guix gc --list-live}.

Cuando se encuentra una diferencia entre el hash de un elemento construido
localmente y el proporcionado por un servidor de sustituciones; o entre las
sustituciones proporcionadas por distintos servidores, esto es mostrado como
en el ejemplo previo y el código de salida es 2 (otros valores código de
salida distintos de cero denominan otros tipos de error).

La única opción de importancia es:

@table @code

@item --substitute-urls=@var{urls}
Considera @var{urls} la lista separada por espacios de URL de fuentes de
sustituciones con las que realizar la comparación.

@item --diff=@var{modo}
Muestra las diferencias encontradas de acuerdo con @var{modo}, uno de los
siguientes:

@table @asis
@item @code{simple} (el predeterminado)
Muestra la lista de archivos que son diferentes.

@item @code{diffoscope}
@itemx @var{orden}
Invoca @uref{https://diffoscope.org/, Diffoscope} y le proporciona los dos
directorios cuyo contenido es diferente.

Cuando @var{orden} es una ruta absoluta, ejecuta @var{orden} en vez de
Diffoscope.

@item @code{none}
No muestra más detalles sobre las diferencias.
@end table

Por tanto, a menos que se proporcione @option{--diff=none}, @command{guix
challenge} descarga los contenidos de los elementos del almacén de los
servidores de sustituciones proporcionados para poder compararlos.

@item --verbose
@itemx -v
Muestra detalles sobre coincidencias (contenidos idénticos) además de
información sobre las discrepancias.

@end table

@node Invocación de guix copy
@section Invocación de @command{guix copy}

@cindex @command{guix copy}
@cindex copiar, elementos del almacén, por SSH
@cindex SSH, copiar elementos del almacén
@cindex compartir elementos del almacén entre máquinas
@cindex transferir elementos del almacén entre máquinas
La orden @command{guix copy} copia elementos del almacén de una máquina al
de otra a través de una conexión de shell seguro (SSH)@footnote{Esta orden
únicamente está disponible cuando ha encontrado
Guile-SSH. @xref{Requisitos}, para detalles.}. Por ejemplo, la siguiente
orden copia el paquete @code{coreutils}, el perfil de la usuaria y todas sus
dependencias a @var{dirección}, ingresando en el sistema como @var{usuaria}:

@example
guix copy --to=@var{user}@@@var{host} \
          coreutils $(readlink -f ~/.guix-profile)
@end example

Si alguno de los elementos del almacén a copiar ya están presentes en
@var{dirección}, no se envían realmente.

La siguiente orden obtiene @code{libreoffice} y @code{gimp} de
@var{dirección}, asumiendo que estén disponibles allí:

@example
guix copy --from=@var{dirección} libreoffice gimp
@end example

La conexión SSH se establece usando el cliente Guile-SSH, que es compatible
con OpenSSH: tiene en cuenta @file{~/.ssh/known_hosts} y
@file{~/.ssh/config}, y usa el agente SSH para la identificación.

La clave usada para firmar los elementos enviados debe estar aceptada por la
máquina remota. Del mismo modo, la clave usada por la máquina remota para
firmar los elementos recibidos debe estar en @file{/etc/guix/acl} de modo
que sea aceptada por su propio daemon. @xref{Invocación de guix archive}, para
más información sobre la verificación de elementos del almacén.

La sintaxis general es:

@example
guix copy [--to=@var{spec}|--from=@var{spec}] @var{elementos}@dots{}
@end example

Siempre debe especificar una de las siguientes opciones:

@table @code
@item --to=@var{spec}
@itemx --from=@var{spec}
Especifica la máquina a la que mandar o desde la que recibir.  @var{spec}
debe ser una especificación SSH como @code{example.org},
@code{carlos@@example.org}, or @code{carlos@@example.org:2222}.
@end table

Los @var{elementos} pueden ser tanto nombres de paquetes, como @code{gimp},
como elementos del almacén, como @file{/gnu/store/@dots{}-idutils-4.6}.

Cuando se especifica el nombre del paquete a enviar, primero se construye si
es necesario, a menos que se use @option{--dry-run}. Se aceptan las opciones
comunes de construcción (@pxref{Opciones comunes de construcción}).


@node Invocación de guix container
@section Invocación de @command{guix container}
@cindex container
@cindex @command{guix container}
@quotation Nota
En la versión @value{VERSION}, esta herramienta es experimental. La interfaz
está sujeta a cambios radicales en el futuro.
@end quotation

The purpose of @command{guix container} is to manipulate processes running
within an isolated environment, commonly known as a ``container'', typically
created by the @command{guix shell} (@pxref{Invoking guix shell}) and
@command{guix system container} (@pxref{Invocación de guix system}) commands.

La sintaxis general es:

@example
guix container @var{acción} @var{opciones}@dots{}
@end example

@var{acción} especifica la operación a realizar con el contenedor, y
@var{opcines} especifica los parámetros específicos del contexto para la
acción.

Las siguientes acciones están disponibles:

@table @code
@item exec
Ejecute una orden en el contexto de un contenedor en ejecución.

La sintaxis es:

@example
guix container exec @var{pid} @var{programa} @var{parámetros}@dots{}
@end example

@var{pid} especifica el ID del proceso del contenedor en
ejecución. @var{programa} especifica el nombre del archivo ejecutable dentro
del sistema de archivos raíz del contenedor. @var{parámetros} son opciones
adicionales que se pasarán a @var{programa}.

La siguiente orden lanza un shell interactivo de ingreso al sistema dentro
de un contenedor del sistema, iniciado por @command{guix system container},
y cuyo ID de proceso es 9001:

@example
guix container exec 9001 /run/current-system/profile/bin/bash --login
@end example

Fíjese que el @var{pid} no puede ser el proceso creador del contenedor. Debe
ser el PID 1 del contenedor o uno de sus procesos hijos.

@end table

@node Invocación de guix weather
@section Invocación de @command{guix weather}

@cindex @command{guix weather}
De manera ocasional tendrá un mal día al no estar las sustituciones
disponibles y le toque construir los paquetes a usted misma
(@pxref{Sustituciones}). La orden @command{guix weather} informa de la
disponibilidad de sustituciones en los servidores especificados de modo que
pueda tener una idea sobre cómo será su día hoy. A veces puede ser una
información útil como usuaria, pero es principalmente útil para quienes
ejecuten @command{guix publish} (@pxref{Invocación de guix publish}).

@cindex estadísticas, para sustituciones
@cindex disponibilidad de sustituciones
@cindex disponibilidad de sustituciones
@cindex weather, disponibilidad de sustituciones
Esta es una ejecución de ejemplo:

@example
$ guix weather --substitute-urls=https://guix.example.org
computing 5,872 package derivations for x86_64-linux...
looking for 6,128 store items on https://guix.example.org..
updating substitutes from 'https://guix.example.org'... 100.0%
https://guix.example.org
  43.4% substitutes available (2,658 out of 6,128)
  7,032.5 MiB of nars (compressed)
  19,824.2 MiB on disk (uncompressed)
  0.030 seconds per request (182.9 seconds in total)
  33.5 requests per second

  9.8% (342 out of 3,470) of the missing items are queued
  867 queued builds
      x86_64-linux: 518 (59.7%)
      i686-linux: 221 (25.5%)
      aarch64-linux: 128 (14.8%)
  build rate: 23.41 builds per hour
      x86_64-linux: 11.16 builds per hour
      i686-linux: 6.03 builds per hour
      aarch64-linux: 6.41 builds per hour
@end example

@cindex integración continua, estadísticas
Como puede ver, informa de la fracción de todos los paquetes para los cuales
hay sustituciones en el servidor---independientemente de que las
sustituciones estén activadas, e independientemente de si la clave de firma
del servidor está autorizada. También informa del tamaño de los archivos
comprimidos (``nar'') proporcionados por el servidor, el tamaño que los
elementos correspondientes del almacén ocupan en el almacén (asumiendo que
la deduplicación está apagada) y el caudal de proceso del servidor. La
segunda parte proporciona estadísticas de integración continua (CI), si el
servidor lo permite. Además, mediante el uso de la opción
@option{--coverage}, @command{guix weather} puede enumerar sustituciones de
paquetes ``importantes'' que no se encuentren en el servidor (véase más
adelante).

Para conseguirlo, @command{guix weather} consulta los metadatos HTTP(S)
(@dfn{narinfo}s) de todos los elementos relevantes del almacén. Como
@command{guix challenge}, ignora las firmas en esas sustituciones, lo cual
es inocuo puesto que la orden únicamente obtiene estadísticas y no puede
instalar esas sustituciones.

La sintaxis general es:

@example
guix weather @var{opciones}@dots{} [@var{paquetes}@dots{}]
@end example

Cuando se omite @var{paquetes}, @command{guix weather} comprueba la
disponibilidad de sustituciones para @emph{todos} los paquetes, o para
aquellos especificados con la opción @option{--manifest}; en otro caso
considera únicamente los paquetes especificados. También es posible
consultar tipos de sistema específicos con @option{--system}. @command{guix
weather} termina con un código de salida distinto a cero cuando la fracción
de sustituciones disponibles se encuentra por debajo del 100%.

Las opciones disponibles se enumeran a continuación.

@table @code
@item --substitute-urls=@var{urls}
@var{urls} es la lista separada por espacios de URL de servidores de
sustituciones a consultar. Cuando se omite esta opción, el conjunto
predeterminado de servidores de sustituciones es el consultado.

@item --system=@var{sistema}
@itemx -s @var{sistema}
Consulta sustituciones para @var{sistema}---por ejemplo,
@code{aarch64-linux}. Esta opción se puede repetir, en cuyo caso
@command{guix weather} consultará las sustituciones para varios tipos de
sistema.

@item --manifest=@var{archivo}
En vez de consultar las sustituciones de todos los paquetes, consulta
únicamente los especificados en @var{archivo}. @var{archivo} debe contener
un @dfn{manifiesto}, como el usado en la opción @code{-m} de @command{guix
package} (@pxref{Invocación de guix package}).

Esta opción puede repetirse varias veces, en cuyo caso los manifiestos se
concatenan.

@item --coverage[=@var{numero}]
@itemx -c [@var{numero}]
Informa de la cobertura de sustituciones para paquetes: enumera paquetes con
al menos @var{número} dependientes (cero por omisión) para los cuales no
haya sustituciones disponibles. Los paquetes dependientes en sí no se
enumeran: si @var{b} depende de @var{a} y @var{a} no tiene sustituciones
disponibles, únicamente se muestra @var{a}, aunque @var{b} normalmente no
tenga sustituciones tampoco. El resultado es más o menos así:

@example
$ guix weather --substitute-urls=@value{SUBSTITUTE-URLS} -c 10
computing 8,983 package derivations for x86_64-linux...
looking for 9,343 store items on @value{SUBSTITUTE-URLS}...
updating substitutes from '@value{SUBSTITUTE-URLS}'... 100.0%
@value{SUBSTITUTE-URLS}
  64.7% substitutes available (6,047 out of 9,343)
@dots{}
2502 packages are missing from '@value{SUBSTITUTE-URLS}' for 'x86_64-linux', among which:
    58  kcoreaddons@@5.49.0      /gnu/store/@dots{}-kcoreaddons-5.49.0
    46  qgpgme@@1.11.1           /gnu/store/@dots{}-qgpgme-1.11.1
    37  perl-http-cookiejar@@0.008  /gnu/store/@dots{}-perl-http-cookiejar-0.008
    @dots{}
@end example

What this example shows is that @code{kcoreaddons} and presumably the 58
packages that depend on it have no substitutes at
@code{@value{SUBSTITUTE-SERVER-1}}; likewise for @code{qgpgme} and the 46
packages that depend on it.

Si es una desarrolladora Guix, o si se encuentra a cargo de esta granja de
construcción, probablemente quiera inspeccionar estos paquetes con más
detalle: simplemente puede que su construcción falle.

@item --display-missing
Muestra los elementos del almacén para los que faltan las sustituciones.
@end table

@node Invocación de guix processes
@section Invocación de @command{guix processes}

@cindex @command{guix processes}
La orden @command{guix processes} puede ser útil a desarrolladoras y
administradoras de sistemas, especialmente en máquinas multiusuaria y en
granjas de construcción: enumera las sesiones actuales (conexiones al
daemon), así como información sobre los procesos envueltos@footnote{Las
sesiones remotas, cuando @command{guix-daemon} se ha iniciado con
@option{--listen} especificando un punto de conexión TCP, @emph{no} son
enumeradas.}. A continuación puede verse un ejemplo de la información que
devuelve:

@example
$ sudo guix processes
SessionPID: 19002
ClientPID: 19090
ClientCommand: guix shell python

SessionPID: 19402
ClientPID: 19367
ClientCommand: guix publish -u guix-publish -p 3000 -C 9 @dots{}

SessionPID: 19444
ClientPID: 19419
ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{}
LockHeld: /gnu/store/@dots{}-perl-ipc-cmd-0.96.lock
LockHeld: /gnu/store/@dots{}-python-six-bootstrap-1.11.0.lock
LockHeld: /gnu/store/@dots{}-libjpeg-turbo-2.0.0.lock
ChildPID: 20495
ChildCommand: guix offload x86_64-linux 7200 1 28800
ChildPID: 27733
ChildCommand: guix offload x86_64-linux 7200 1 28800
ChildPID: 27793
ChildCommand: guix offload x86_64-linux 7200 1 28800
@end example

En este ejemplo vemos que @command{guix-daemon} tiene tres clientes:
@command{guix environment}, @command{guix publish} y la herramienta de
integración continua Cuirass; sus identificadores de proceso (PID) se
muestran en el campo @code{ClientPID}. El campo @code{SessionPID}
proporciona el PID del subproceso de @command{guix-daemon} de cada sesión en
particular.

The @code{LockHeld} fields show which store items are currently locked by
this session, which corresponds to store items being built or substituted
(the @code{LockHeld} field is not displayed when @command{guix processes} is
not running as root).  Last, by looking at the @code{ChildPID} and
@code{ChildCommand} fields, we understand that these three builds are being
offloaded (@pxref{Configuración de delegación del daemon}).

La salida está en formato Recutils por lo que podemos usar la útil orden
@command{recsel} para seleccionar sesiones de interés (@pxref{Selection Expressions,,, recutils, GNU recutils manual}). Como un ejemplo, la
siguiente orden muestra la línea de órdenes y el PID del cliente que inició
la construcción de un paquete Perl:

@example
$ sudo guix processes | \
    recsel -p ClientPID,ClientCommand -e 'LockHeld ~ "perl"'
ClientPID: 19419
ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{}
@end example

Additional options are listed below.

@table @code
@item --format=@var{formato}
@itemx -f @var{formato}
Produce salida en el @var{formato} especificado, uno de:

@table @code
@item recutils
The default option.  It outputs a set of Session recutils records that
include each @code{ChildProcess} as a field.

@item normalized
Normalize the output records into record sets (@pxref{Record Sets,,,
recutils, GNU recutils manual}).  Normalizing into record sets allows joins
across record types.  The example below lists the PID of each
@code{ChildProcess} and the associated PID for @code{Session} that spawned
the @code{ChildProcess} where the @code{Session} was started using
@command{guix build}.

@example
$ guix processes --format=normalized | \
    recsel \
    -j Session \
    -t ChildProcess \
    -p Session.PID,PID \
    -e 'Session.ClientCommand ~ "guix build"'
PID: 4435
Session_PID: 4278

PID: 4554
Session_PID: 4278

PID: 4646
Session_PID: 4278
@end example
@end table
@end table

@node Foreign Architectures
@chapter Foreign Architectures

You can target computers of different CPU architectures when producing
packages (@pxref{Invocación de guix package}), packs (@pxref{Invocación de guix pack})
or full systems (@pxref{Invocación de guix system}).

GNU Guix supports two distinct mechanisms to target foreign architectures:

@enumerate
@item
The traditional
@uref{https://en.wikipedia.org/wiki/Cross_compiler,cross-compilation}
mechanism.
@item
The native building mechanism which consists in building using the CPU
instruction set of the foreign system you are targeting.  It often requires
emulation, using the QEMU program for instance.
@end enumerate

@menu
* Cross-Compilation::        Cross-compiling for another architecture.
* Native Builds::            Targeting another architecture through native 
                               builds.
@end menu

@node Cross-Compilation
@section Cross-Compilation

@cindex foreign architectures
The commands supporting cross-compilation are proposing the
@option{--list-targets} and @option{--target} options.

The @option{--list-targets} option lists all the supported targets that can
be passed as an argument to @option{--target}.

@example
$ guix build --list-targets
The available targets are:

   - aarch64-linux-gnu
   - arm-linux-gnueabihf
   - i586-pc-gnu
   - i686-linux-gnu
   - i686-w64-mingw32
   - mips64el-linux-gnu
   - powerpc-linux-gnu
   - powerpc64le-linux-gnu
   - riscv64-linux-gnu
   - x86_64-linux-gnu
   - x86_64-w64-mingw32
@end example

Targets are specified as GNU triplets (@pxref{Specifying Target Triplets,
GNU configuration triplets,, autoconf, Autoconf}).

Those triplets are passed to GCC and the other underlying compilers possibly
involved when building a package, a system image or any other GNU Guix
output.

@example
$ guix build --target=aarch64-linux-gnu hello
/gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12

$ file /gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12/bin/hello
/gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12/bin/hello: ELF
64-bit LSB executable, ARM aarch64 @dots{}
@end example

The major benefit of cross-compilation is that there are no performance
penaly compared to emulation using QEMU.  There are however higher risks
that some packages fail to cross-compile because few users are using this
mechanism extensively.

@node Native Builds
@section Native Builds

The commands that support impersonating a specific system have the
@option{--list-systems} and @option{--system} options.

The @option{--list-systems} option lists all the supported systems that can
be passed as an argument to @option{--system}.

@example
$ guix build --list-systems
The available systems are:

   - x86_64-linux [current]
   - aarch64-linux
   - armhf-linux
   - i586-gnu
   - i686-linux
   - mips64el-linux
   - powerpc-linux
   - powerpc64le-linux
   - riscv64-linux

$ guix build --system=i686-linux hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12

$ file /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello: ELF
32-bit LSB executable, Intel 80386 @dots{}
@end example

In the above example, the current system is @var{x86_64-linux}.  The
@var{hello} package is however built for the @var{i686-linux} system.

This is possible because the @var{i686} CPU instruction set is a subset of
the @var{x86_64}, hence @var{i686} targeting binaries can be run on
@var{x86_64}.

Still in the context of the previous example, if picking the
@var{aarch64-linux} system and the @command{guix build
--system=aarch64-linux hello} has to build some derivations, an extra step
might be needed.

The @var{aarch64-linux} targeting binaries cannot directly be run on a
@var{x86_64-linux} system.  An emulation layer is requested.  The GNU Guix
daemon can take advantage of the Linux kernel
@uref{https://en.wikipedia.org/wiki/Binfmt_misc,binfmt_misc} mechanism for
that.  In short, the Linux kernel can defer the execution of a binary
targeting a foreign platform, here @var{aarch64-linux}, to a userspace
program, usually an emulator.

There is a service that registers QEMU as a backend for the
@code{binfmt_misc} mechanism (@pxref{Servicios de virtualización,
@code{qemu-binfmt-service-type}}).  On Debian based foreign distributions,
the alternative would be the @code{qemu-user-static} package.

If the @code{binfmt_misc} mechanism is not setup correctly, the building
will fail this way:

@example
$ guix build --system=armhf-linux hello --check
@dots{}
@ unsupported-platform /gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv aarch64-linux
while setting up the build environment: a `aarch64-linux' is required to
build `/gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv', but
I am a `x86_64-linux'@dots{}
@end example

whereas, with the @code{binfmt_misc} mechanism correctly linked with QEMU,
one can expect to see:

@example
$ guix build --system=armhf-linux hello --check
/gnu/store/13xz4nghg39wpymivlwghy08yzj97hlj-hello-2.12
@end example

The main advantage of native building compared to cross-compiling, is that
more packages are likely to build correctly.  However it comes at a price:
compilation backed by QEMU is @emph{way slower} than cross-compilation,
because every instruction needs to be emulated.

The availability of substitutes for the architecture targeted by the
@code{--system} option can mitigate this problem.  An other way to work
around it is to install GNU Guix on a machine whose CPU supports the
targeted instruction set, and set it up as an offload machine (@pxref{Configuración de delegación del daemon}).

@node Configuración del sistema
@chapter Configuración del sistema

@cindex configuración del sistema
El sistema Guix permite un mecanismo de configuración del sistema completo
consistente. Con esto queremos decir que todos los aspectos de la
configuración global del sistema---como los servicios disponibles, la zona
horaria y la configuración de localización, las cuentas de usuarias---se
declaran en un lugar único. Dicha @dfn{configuración del sistema} puede ser
@dfn{instanciada}---es decir, hecha efectiva.

@c Yes, we're talking of Puppet, Chef, & co. here.  ↑
Una de las ventajas de poner toda la configuración del sistema bajo el
control de Guix es que permite actualizaciones transaccionales del sistema,
y hace posible volver a una instanciación previa del sistema, en caso de que
haya algún problema con la nueva (@pxref{Características}). Otra ventaja es que
hace fácil replicar exactamente la misma configuración entre máquinas
diferentes, o en diferentes momentos, sin tener que utilizar herramientas de
administración adicionales sobre las propias herramientas del sistema.

Esta sección describe este mecanismo. Primero nos enfocaremos en el punto de
vista de la administradora del sistema---explicando cómo se configura e
instancia el sistema. Después mostraremos cómo puede extenderse este
mecanismo, por ejemplo para añadir nuevos servicios del sistema.

@menu
* Uso de la configuración del sistema::  Personalizar su sistema GNU.
* Referencia de operating-system::  Detalle de las declaraciones de sistema 
                                      operativo.
* Sistemas de archivos::     Configurar el montaje de sistemas de archivos.
* Dispositivos traducidos::  Procesamiento adicional de dispositivos de 
                               bloques.
* Swap Space::               Backing RAM with disk space.
* Cuentas de usuaria::       Especificar las cuentas de usuaria.
* Distribución de teclado::  Cómo interpreta el sistema las pulsaciones 
                                del teclado.
* Localizaciones::           Configuración de idioma y convenciones 
                               culturales.
* Servicios::                Especificar los servicios del sistema.
* Programas con setuid::     Programs running with elevated privileges.
* Certificados X.509::       Verificar servidores HTTPS.
* Selector de servicios de nombres::  Configurar el selector de servicios de 
                                        nombres de libc.
* Disco en RAM inicial::     Arranque de Linux-Libre.
* Configuración del gestor de arranque::  Configurar el gestor de arranque.
* Invocación de guix system::  Instanciar una configuración del sistema.
* Invocación de guix deploy::  Despliegue de una configuración del sistema 
                                  en una máquina remota.
* Ejecutar Guix en una máquina virtual::  Cómo ejecutar el sistema Guix en 
                                             una máquina virtual.
* Definición de servicios::  Añadir nuevas definiciones de servicios.
@end menu

@node Uso de la configuración del sistema
@section Uso de la configuración del sistema

El sistema operativo se configura proporcionando una declaración
@code{operating-system} en un archivo que pueda ser proporcionado a la orden
@command{guix system} (@pxref{Invocación de guix system}). Una configuración
simple, con los servicios predeterminados del sistema, el núcleo Linux-Libre
predeterminado, un disco de RAM inicial y un cargador de arranque puede ser
como sigue:

@findex operating-system
@lisp
@include os-config-bare-bones.texi
@end lisp

Este ejemplo debería ser auto-descriptivo. Algunos de los campos definidos
anteriormente, como @code{host-name} y @code{bootloader}, son
necesarios. Otros como @code{packages} y @code{services}, pueden omitirse,
en cuyo caso obtienen un valor por defecto.

Más adelante se muestran los efectos de algunos de los campos más
importantes (@pxref{Referencia de operating-system}, para detalles acerca de
todos los campos disponibles), y cómo @dfn{instanciar} el sistema operativo
usando @command{guix system}.

@unnumberedsubsec Cargador de arranque

@cindex arranque obsoleto, en máquinas Intel
@cindex arranque por BIOS, en máquinas Intel
@cindex arranque UEFI
@cindex arranque EFI
El campo @code{bootloader} describe el método que será usado para arrancar
su sistema. Las máquinas basadas en procesadores Intel pueden arrancar en el
``obsoleto'' modo BIOS, como en el ejemplo previo. No obstante, máquinas más
recientes usan la @dfn{Interfaz Unificada Extensible de Firmware} (UEFI)
para arrancar. En ese caso, el capo @code{bootloader} debe contener algo
parecido a esto:

@lisp
(bootloader-configuration
  (bootloader grub-efi-bootloader)
  (targets '("/boot/efi")))
@end lisp

@xref{Configuración del gestor de arranque}, para más información sobre las opciones de
configuración disponibles.

@unnumberedsubsec Paquetes visibles globalmente

@vindex %base-packages
The @code{packages} field lists packages that will be globally visible on
the system, for all user accounts---i.e., in every user's @env{PATH}
environment variable---in addition to the per-user profiles (@pxref{Invocación de guix package}).  The @code{%base-packages} variable provides all the tools
one would expect for basic user and administrator tasks---including the GNU
Core Utilities, the GNU Networking Utilities, the @command{mg} lightweight
text editor, @command{find}, @command{grep}, etc.  The example above adds
GNU@tie{}Screen to those, taken from the @code{(gnu packages screen)} module
(@pxref{Módulos de paquetes}).  The @code{(list package output)} syntax can be
used to add a specific output of a package:

@lisp
(use-modules (gnu packages))
(use-modules (gnu packages dns))

(operating-system
  ;; ...
  (packages (cons (list isc-bind "utils")
                  %base-packages)))
@end lisp

@findex specification->package
Referring to packages by variable name, like @code{isc-bind} above, has the
advantage of being unambiguous; it also allows typos and such to be
diagnosed right away as ``unbound variables''.  The downside is that one
needs to know which module defines which package, and to augment the
@code{use-package-modules} line accordingly.  To avoid that, one can use the
@code{specification->package} procedure of the @code{(gnu packages)} module,
which returns the best package for a given name or name and version:

@lisp
(use-modules (gnu packages))

(operating-system
  ;; ...
  (packages (append (map specification->package
                         '("tcpdump" "htop" "gnupg@@2.0"))
                    %base-packages)))
@end lisp

@unnumberedsubsec Servicios del sistema

@cindex services
@vindex %base-services
El campo @code{services} enumera los @dfn{servicios del sistema} disponibles
cuando el sistema arranque (@pxref{Servicios}). La declaración
@code{operating-system} previa especifica que, además de los servicios
básicos, queremos que el daemon de shell seguro OpenSSH espere conexiones
por el puerto 2222 (@pxref{Servicios de red,
@code{openssh-service-type}}). En su implementación,
@code{openssh-service-type} prepara todo para que @code{sshd} se inicie con
las opciones de la línea de órdenes adecuadas, posiblemente generando bajo
demanda los archivos de configuración necesarios (@pxref{Definición de servicios}).

@cindex personalización, de servicios
@findex modify-services
De manera ocasional, en vez de usar los servicios básicos tal y como vienen,
puede querer personalizarlos. Para hacerlo, use @code{modify-services}
(@pxref{Referencia de servicios, @code{modify-services}}) para modificar la lista.

@anchor{auto-login to TTY} Por ejemplo, supongamos que quiere modificar @code{guix-daemon} y Mingetty
(el punto de acceso al sistema por consola) en la lista
@code{%base-services} (@pxref{Servicios base, @code{%base-services}}). Para
hacerlo, puede escribir lo siguiente en su declaración de sistema operativo:

@lisp
(define %my-services
  ;; My very own list of services.
  (modify-services %base-services
    (guix-service-type config =>
                       (guix-configuration
                        (inherit config)
                        ;; Fetch substitutes from example.org.
                        (substitute-urls
                          (list "https://example.org/guix"
                                "https://ci.guix.gnu.org"))))
    (mingetty-service-type config =>
                           (mingetty-configuration
                            (inherit config)
                            ;; Automatically log in as "guest".
                            (auto-login "guest")))))

(operating-system
  ;; @dots{}
  (services %mis-servicios))
@end lisp

This changes the configuration---i.e., the service parameters---of the
@code{guix-service-type} instance, and that of all the
@code{mingetty-service-type} instances in the @code{%base-services} list
(@pxref{Auto-Login to a Specific TTY, see the cookbook for how to auto-login
one user to a specific TTY,, guix-cookbook, GNU Guix Cookbook})).  Observe
how this is accomplished: first, we arrange for the original configuration
to be bound to the identifier @code{config} in the @var{body}, and then we
write the @var{body} so that it evaluates to the desired configuration.  In
particular, notice how we use @code{inherit} to create a new configuration
which has the same values as the old configuration, but with a few
modifications.

@cindex disco cifrado
The configuration for a typical ``desktop'' usage, with an encrypted root
partition, a swap file on the root partition, the X11 display server, GNOME
and Xfce (users can choose which of these desktop environments to use at the
log-in screen by pressing @kbd{F1}), network management, power management,
and more, would look like this:

@lisp
@include os-config-desktop.texi
@end lisp

Un sistema gráfico con una selección de gestores de ventanas ligeros en vez
de entornos de escritorio completos podría ser así:

@lisp
@include os-config-lightweight-desktop.texi
@end lisp

Este ejemplo se refiere al sistema de archivos @file{/boot/efi} por su UUID
@code{1234-ABCD}. Substituya este UUID con el UUID correcto en su sistema,
como el devuelto por la orden @command{blkid}.

@xref{Servicios de escritorio}, para la lista exacta de servicios proporcionados
por @code{%desktop-services}. @xref{Certificados X.509}, para información
sobre el paquete @code{nss-certs} usado aquí.

De nuevo, @code{%desktop-services} es simplemente una lista de objetos de
servicios. Si desea borrar servicios de aquí, puede hacerlo usando
procedimientos de filtrado de listas (@pxref{SRFI-1 Filtering and Partitioning,,, guile, GNU Guile Reference Manual}). Por ejemplo, la
siguiente expresión devuelve una lista que contiene todos los servicios en
@code{%desktop-services} excepto el servicio Avahi:

@lisp
(remove (lambda (service)
          (eq? (service-kind service) avahi-service-type))
        %desktop-services)
@end lisp

Alternatively, the @code{modify-services} macro can be used:

@lisp
(modify-services %desktop-services
  (delete avahi-service-type))
@end lisp


@unnumberedsubsec Instanciación del sistema

Asumiendo que la declaración de @code{operating-system} se encuentra en el
archivo @file{mi-configuración-del-sistema.scm}, la orden @command{guix
system mi-conf-del-sistema.scm} instancia esa configuración, y la convierte
en la entrada predeterminada de GRUB en el arranque (@pxref{Invocación de guix system}).

@quotation Nota
We recommend that you keep this @file{my-system-config.scm} file safe and
under version control to easily track changes to your configuration.
@end quotation

La manera habitual de cambiar la configuración del sistema es actualizar
este archivo y volver a ejecutar @command{guix system reconfigure}. Nunca se
deberían tocar los archivos en @file{/etc} o ejecutar órdenes que modifiquen
el estado del sistema como @command{useradd} o @command{grub-install}. De
hecho, debe evitarlo ya que no únicamente anularía su garantía sino que
también le impediría volver a una versión previa de su sistema, en caso de
necesitarlo.

@cindex vuelta-atrás, del sistema operativo
Hablando de vuelta atrás, cada vez que ejecuta @command{guix system
reconfigure} se crea una nueva @dfn{generación} del sistema---sin modificar
o borrar generaciones previas. Las generaciones previas tienen una entrada
en el menú del cargador de arranque, lo que permite arrancarlas en caso de
que algo funcionase mal en las últimas generaciones. Tranquilizador, ¿no? La
orden @command{guix system list-generations} enumera las generaciones del
sistema disponibles en el disco. Es también posible volver a una versión
previa con las órdenes @command{guix system roll-back} y @command{guix
system switch-generation}.

Aunque la orden @command{guix system reconfigure} no modificará las
generaciones previas, debe tener cuidado cuando la generación actual no es
la última (por ejemplo, después de invocar @command{guix system roll-back}),
ya que la operación puede sobreescribir una generación posterior
(@pxref{Invocación de guix system}).

@unnumberedsubsec La interfaz programática

A nivel Scheme, el grueso de una declaración @code{operating-system} se
instancia con el siguiente procedimiento monádico (@pxref{La mónada del almacén}):

@deffn {Procedimiento monádico} operating-system-derivation so
Devuelve una derivación que construye @var{so}, un objeto
@code{operating-system} (@pxref{Derivaciones}).

La salida de la derivación es un único directorio que hace referencia a
todos los paquetes, archivos de configuración y otros archivos auxiliares
necesarios para instanciar @var{so}.
@end deffn

Este procedimiento se proporciona por el módulo @code{(gnu system)}. Junto
con @code{(gnu services)} (@pxref{Servicios}), este módulo contiene los
entresijos del sistema Guix. ¡Asegúrese de echarle un vistazo!


@node Referencia de operating-system
@section Referencia de @code{operating-system}

Esta sección resume todas las opciones disponibles en las declaraciones de
@code{operating-system} (@pxref{Uso de la configuración del sistema}).

@deftp {Tipo de datos} operating-system
Este es el tipo de datos que representa la configuración del sistema
operativo. Con ello queremos decir toda la configuración global del sistema,
no la configuración específica de las usuarias (@pxref{Uso de la configuración del sistema}).

@table @asis
@item @code{kernel} (predeterminado: @code{linux-libre})
El objeto del paquete del núcleo del sistema operativo
usado@footnote{Actualmente únicamente está completamente implementado el
núcleo Linux-libre. El uso de GNU@tie{}mach con GNU@tie{}Hurd es
experimental y únicamente está disponible cuando se construye una imagen de
disco para máquina virtual.}.

@cindex hurd
@item @code{hurd} (predeterminado: @code{#f})
El objeto del paquete de Hurd iniciado por el núcleo. Cuando se proporciona
este campo, produce un sistema operativo GNU/Hurd. En ese caso,
@code{kernel} también debe contener el paquete @code{gnumach}---el
micronúcleo sobre el que se ejecuta Hurd.

@quotation Aviso
Esta característica es experimental y únicamente está implementada para
imágenes de disco.
@end quotation

@item @code{kernel-loadable-modules} (predeterminados: @code{'()})
Una lista de objetos (habitualmente paquetes) desde los que se obtendrán los
módulos del núcleo--por ejemplo @code{(list ddcci-driver-linux)}.

@item @code{kernel-arguments} (predeterminados: @code{%default-kernel-arguments})
Lista de cadenas o expresiones-G que representan parámetros adicionales a
pasar en la línea de órdenes del núcleo---por ejemplo,
@code{("console=ttyS0")}.

@item @code{bootloader}
El objeto de configuración del cargador de arranque del
sistema. @xref{Configuración del gestor de arranque}.

@item @code{label}
Es una etiqueta (una cadena) con la que aparecerá en el menú del cargador de
arranque. La etiqueta predeterminada incluye el nombre y la versión del
núcleo.

@item @code{keyboard-layout} (predeterminada: @code{#f})
This field specifies the keyboard layout to use in the console.  It can be
either @code{#f}, in which case the default keyboard layout is used (usually
US English), or a @code{<keyboard-layout>} record. @xref{Distribución de teclado},
for more information.

Esta distribución de teclado se hace efectiva tan pronto el núcleo haya
arrancado. Por ejemplo, la distribución de teclado está en efecto cuando
introduzca una contraseña si su sistema de archivos raíz se encuentra en un
dispositivo traducido @code{luks-device-mapping} (@pxref{Dispositivos traducidos}).

@quotation Nota
Esto @emph{no} especifica la distribución de teclado usada por el cargador
de arranque, ni tampoco la usada por el servidor gráfico. @xref{Configuración del gestor de arranque}, para información sobre cómo especificar la distribución de
teclado del cargador de arranque. @xref{Sistema X Window}, para información sobre
cómo especificar la distribución de teclado usada por el sistema de ventanas
X.
@end quotation

@item @code{initrd-modules} (predeterminados: @code{%base-initrd-modules})
@cindex initrd
@cindex disco inicial en RAM
La lista de módulos del núcleo Linux que deben estar disponibles en el disco
inicial en RAM. @xref{Disco en RAM inicial}.

@item @code{initrd} (predeterminado: @code{base-initrd})
Un procedimiento que devuelve un disco inicial en RAM para el núcleo
Linux. Este campo se proporciona para permitir personalizaciones de bajo
nivel y no debería ser necesario para un uso habitual. @xref{Disco en RAM inicial}.

@item @code{firmware} (predeterminado: @code{%base-firmware})
@cindex firmware
Lista de paquetes de firmware que pueden ser cargados por el núcleo del
sistema operativo.

El valor predeterminado incluye el firmware necesario para dispositivos WiFi
basados en Atheros y Broadcom (módulos Linux-libre @code{ath9k} y
@code{b43-open}, respectivamente). @xref{Consideraciones sobre el hardware}, para más
información sobre hardware soportado.

@item @code{host-name}
El nombre de la máquina.

@item @code{hosts-file}
@cindex el archivo hosts
Un objeto tipo-archivo (@pxref{Expresiones-G, objetos ``tipo-archivo''})
para ser usado como @file{/etc/hosts} (@pxref{Host Names,,, libc, The GNU C
Library Reference Manual}). El predeterminado es un archivo con entradas
para @code{localhost} y @var{host-name}.

@item @code{mapped-devices} (predeterminados: @code{'()})
Una lista de dispositivos traducidos. @xref{Dispositivos traducidos}.

@item @code{file-systems}
Una lista de sistemas de archivos. @xref{Sistemas de archivos}.

@item @code{swap-devices} (predeterminados: @code{'()})
@cindex dispositivos de intercambio
A list of swap spaces.  @xref{Swap Space}.

@item @code{users} (predeterminadas: @code{%base-user-accounts})
@itemx @code{groups} (predeterminados: @code{%base-groups})
Lista de cuentas de usuaria y grupos. @xref{Cuentas de usuaria}.

Si la lista de @code{usuarias} carece de una cuenta de usuaria con
UID@tie{}0, una cuenta ``root'' con UID@tie{}0 se añade automáticamente.

@item @code{skeletons} (predeterminados: @code{(default-skeletons)})
Una lista de tuplas de nombre de archivo de destino/objeto tipo-archivo
(@pxref{Expresiones-G, objetos ``tipo-archivo''}). Estos son los archivos de
esqueleto que se añadirán al directorio de las cuentas de usuaria que se
creen.

Por ejemplo, un valor válido puede parecer algo así:

@lisp
`((".bashrc" ,(plain-file "bashrc" "echo Hola\n"))
  (".guile" ,(plain-file "guile"
                         "(use-modules (ice-9 readline))
                          (activate-readline)")))
@end lisp

@item @code{issue} (predeterminado: @code{%default-issue})
Una cadena que denota el contenido del archivo @file{/etc/issue}, que se
muestra cuando las usuarias ingresan al sistema en una consola de texto.

@item @code{packages} (predeterminados: @code{%base-packages})
Una lista de paquetes instalados en el perfil global, que es accesible en
@file{/run/current-system/profile}. Cada elemento debe ser una variable de
paquete o una tupla paquete/salida. A continuación se muestra un ejemplo de
ambos tipos:

@lisp
(cons* git                     ; la salida predeterminada "out" 
       (list git "send-email") ; otra salida de git
       %base-packages)         ; el conjunto predeterminado
@end lisp

El conjunto predeterminado incluye utilidades básicas y es una buena
práctica instalar utilidades no-básicas en los perfiles de las usuarias
(@pxref{Invocación de guix package}).

@item @code{timezone} (default: @code{"Etc/UTC"})
Una cadena que identifica la zona horaria---por ejemplo,
@code{"Europe/Paris"}.

Puede ejecutar la orden @command{tzselect} para encontrar qué cadena de zona
horaria corresponde con su región. Elegir una zona horaria no válida provoca
un fallo en @command{guix system}.

@item @code{locale} (predeterminado: @code{"en_US.utf8"})
El nombre de la localización predeterminada (@pxref{Locale Names,,, libc,
The GNU C Library Reference Manual}). @xref{Localizaciones}, para más información.

@item @code{locale-definitions} (predeterminadas: @code{%default-locale-definitions})
La lista de definiciones de localizaciones a compilar y que puede ser usada
en tiempo de ejecución. @xref{Localizaciones}.

@item @code{locale-libcs} (predeterminadas: @code{(list @var{glibc})})
La lista de paquetes GNU@tie{}libc cuyos datos de localización y
herramientas son usadas para las definiciones de
localizaciones. @xref{Localizaciones}, para consideraciones de compatibilidad que
justifican esta opción.

@item @code{name-service-switch} (predeterminado: @code{%default-nss})
Configuración del selector de servicios de nombres de libc (NSS)---un objeto
@code{<name-service-switch>}. @xref{Selector de servicios de nombres}, para detalles.

@item @code{services} (predeterminados: @code{%base-services})
Una lista de objetos service denotando los servicios del
sistema. @xref{Servicios}.

@cindex servicios esenciales
@item @code{essential-services} (predeterminados: ...)
La lista de ``servicios esenciales''---es decir, cosas como instancias de
@code{system-service-type} y @code{host-name-service-type} (@pxref{Referencia de servicios}), las cuales se derivan de su definición de sistema operativo en
sí. Como usuaria @emph{nunca} debería modificar este campo.

@item @code{pam-services} (predeterminados: @code{(base-pam-services)})
@cindex PAM
@cindex módulos de identificación conectables
@c FIXME: Add xref to PAM services section.
Servicios de los @dfn{módulos de identificación conectables} (PAM) de Linux.

@item @code{setuid-programs} (predeterminados: @code{%setuid-programs})
List of @code{<setuid-program>}.  @xref{Programas con setuid}, for more
information.

@item @code{sudoers-file} (predeterminado: @code{%sudoers-specification})
@cindex archivo sudoers
El contenido de @file{/etc/sudoers} como un objeto tipo-archivo
(@pxref{Expresiones-G, @code{local-file} y @code{plain-file}}).

Este archivo especifica qué usuarias pueden usar la orden @command{sudo}, lo
que se les permite hacer y qué privilegios pueden obtener. El comportamiento
predefinido es que únicamente @code{root} y los miembros del grupo
@code{wheel} pueden usar @code{sudo}.

@end table

@deffn {Tipo de datos} this-operating-system
Cuando se usa en el @emph{ámbito léxico} de un campo de una definición de
sistema operativo, este identificador está enlazado al sistema operativo en
definición.

El siguiente ejemplo muestra cómo hacer referencia al sistema operativo en
definición en la definición del campo @code{label}:

@lisp
(use-modules (gnu) (guix))

(operating-system
  ;; ...
  (label (package-full-name
          (operating-system-kernel this-operating-system))))
@end lisp

Es un error hacer referencia a @code{this-operating-system} fuera de una
definición de sistema operativo.
@end deffn

@end deftp

@node Sistemas de archivos
@section Sistemas de archivos

La lista de sistemas de archivos que deben montarse se especifica en el
campo @code{file-systems} de la declaración del sistema operativo
(@pxref{Uso de la configuración del sistema}). Cada sistema de archivos se
declara usando la forma @code{file-system}, como en el siguiente ejemplo:

@lisp
(file-system
  (mount-point "/home")
  (device "/dev/sda3")
  (type "ext4"))
@end lisp

Como es habitual, algunos de los campos son obligatorios---aquellos
mostrados en el ejemplo previo---mientras que otros pueden omitirse. Se
describen a continuación.

@deftp {Tipo de datos} file-system
Objetos de este tipo representan los sistemas de archivos a
montar. Contienen los siguientes campos:

@table @asis
@item @code{type}
Este campo es una cadena que especifica el tipo de sistema de archivos---por
ejemplo, @code{"ext4"}.

@item @code{mount-point}
Designa la ruta donde el sistema de archivos debe montarse.

@item @code{device}
Nombra la ``fuente'' del sistema de archivos. Puede ser una de estas tres
opciones: una etiqueta de sistema de archivos, un UUID de sistema de
archivos o el nombre de un nodo @file{/dev}. Las etiquetas y UUID ofrecen
una forma de hacer referencia a sistemas de archivos sin codificar su nombre
de dispositivo actual@footnote{Fíjese que, aunque es tentador usa
@file{/dev/disk/by-uuid} y nombres de dispositivo similares para obtener el
mismo resultado, no es lo recomendado: estos nodo especiales de dispositivos
se crean por el daemon udev y puede no estar disponible cuando el
dispositivo sea montado.}.

@findex file-system-label
Las etiquetas del sistema de archivos se crean mediante el uso del
procedimiento @code{file-system-label}, los UUID se crean mediante el uso de
@code{uuid} y los nodos @file{/dev} son simples cadenas. A continuación se
proporciona un ejemplo de un sistema de archivos al que se hace referencia
mediante su etiqueta, como es mostrada por la orden @command{e2label}:

@lisp
(file-system
  (mount-point "/home")
  (type "ext4")
  (device (file-system-label "mi-home")))
@end lisp

@findex uuid
Los UUID se convierten dede su representación en forma de cadena (como se
muestra con la orden @command{tune2fs -l}) mediante el uso de la forma
@code{uuid}@footnote{La forma @code{uuid} espera un UUID de 16 bytes como se
define en la @uref{https://tools.ietf.org/html/rfc4122, RFC@tie{}4122}. Este
es el formato de UUID que usan la familia de sistemas de archivos ext2 y
otros, pero es diferente de los ``UUID'' de los sistemas de archivos FAT,
por ejemplo.}, como sigue:

@lisp
(file-system
  (mount-point "/home")
  (type "ext4")
  (device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
@end lisp

Cuando la fuente de un sistema de archivos es un dispositivo traducido
(@pxref{Dispositivos traducidos}), su campo @code{device} @emph{debe} hacer
referencia al nombre del dispositivo traducido---por ejemplo,
@file{"/dev/mapper/particion-raiz"}. Esto es necesario para que el sistema
sepa que el montaje del sistema de archivos depende del establecimiento de
la traducción de dispositivos correspondiente.

@item @code{flags} (predeterminadas: @code{'()})
This is a list of symbols denoting mount flags.  Recognized flags include
@code{read-only}, @code{bind-mount}, @code{no-dev} (disallow access to
special files), @code{no-suid} (ignore setuid and setgid bits),
@code{no-atime} (do not update file access times), @code{no-diratime}
(likewise for directories only), @code{strict-atime} (update file access
time), @code{lazy-time} (only update time on the in-memory version of the
file inode), @code{no-exec} (disallow program execution), and @code{shared}
(make the mount shared).  @xref{Mount-Unmount-Remount,,, libc, The GNU C
Library Reference Manual}, for more information on these flags.

@item @code{options} (predeterminadas: @code{#f})
This is either @code{#f}, or a string denoting mount options passed to the
file system driver.  @xref{Mount-Unmount-Remount,,, libc, The GNU C Library
Reference Manual}, for details.

Run @command{man 8 mount} for options for various file systems, but beware
that what it lists as file-system-independent ``mount options'' are in fact
flags, and belong in the @code{flags} field described above.

The @code{file-system-options->alist} and @code{alist->file-system-options}
procedures from @code{(gnu system file-systems)} can be used to convert file
system options given as an association list to the string representation,
and vice-versa.

@item @code{mount?} (predeterminado: @code{#t})
Este valor indica si debe montarse el sistema de archivos automáticamente al
iniciar el sistema. Cuando se establece como @code{#f}, el sistema de
archivos tiene una entrada en @file{/etc/fstab} (el cual es leído por la
orden @command{mount}) pero no se montará automáticamente.

@item @code{needed-for-boot?} (predeterminado: @code{#f})
Este valor lógico indica si el sistema de archivos es necesario para el
arranque. Si es verdadero, el sistema de archivos se monta al cargar el
disco inicial en RAM (initrd). Este es siempre el caso, por ejemplo, para el
sistema de archivos raíz.

@item @code{check?} (predeterminado: @code{#t})
This Boolean indicates whether the file system should be checked for errors
before being mounted.  How and when this happens can be further adjusted
with the following options.

@item @code{skip-check-if-clean?} (default: @code{#t})
When true, this Boolean indicates that a file system check triggered by
@code{check?} may exit early if the file system is marked as ``clean'',
meaning that it was previously correctly unmounted and should not contain
errors.

Setting this to false will always force a full consistency check when
@code{check?} is true.  This may take a very long time and is not
recommended on healthy systems---in fact, it may reduce reliability!

Conversely, some primitive file systems like @code{fat} do not keep track of
clean shutdowns and will perform a full scan regardless of the value of this
option.

@item @code{repair} (default: @code{'preen})
When @code{check?} finds errors, it can (try to) repair them and continue
booting.  This option controls when and how to do so.

If false, try not to modify the file system at all.  Checking certain file
systems like @code{jfs} may still write to the device to replay the
journal.  No repairs will be attempted.

If @code{#t}, try to repair any errors found and assume ``yes'' to all
questions.  This will fix the most errors, but may be risky.

If @code{'preen}, repair only errors that are safe to fix without human
interaction.  What that means is left up to the developers of each file
system and may be equivalent to ``none'' or ``all''.

@item @code{create-mount-point?} (predeterminado: @code{#f})
Cuando es verdadero, el punto de montaje es creado si no existía
previamente.

@item @code{mount-may-fail?} (predeterminado: @code{#f})
Cuando tiene valor verdadero indica que el montaje de este sistema de
archivos puede fallar pero no debe considerarse un error. Es útil en casos
poco habituales; un ejemplo de esto es @code{efivarfs}, un sistema de
archivos que únicamente puede montarse en sistemas EFI/UEFI.

@item @code{dependencies} (predeterminadas: @code{'()})
Una lista de objetos @code{<file-system>} o @code{<mapped-device>} que
representan sistemas de archivos que deben montarse o dispositivos
traducidos que se deben abrir antes (y desmontar o cerrar después) que el
declarado.

Como ejemplo, considere la siguiente jerarquía de montajes:
@file{/sys/fs/cgroup} es una dependencia de @file{/sys/fs/cgroup/cpu} y
@file{/sys/fs/cgroup/memory}.

Otro ejemplo es un sistema de archivos que depende de un dispositivo
traducido, por ejemplo una partición cifrada (@pxref{Dispositivos traducidos}).
@end table
@end deftp

@deffn {Procedimiento Scheme} file-system-label @var{str}
Este procedimiento devuelve un objeto opaco de etiqueta del sistema de
archivos a partir de @var{str}, una cadena:

@lisp
(file-system-label "home")
@result{} #<file-system-label "home">
@end lisp

Las etiquetas del sistema de archivos se usan para hacer referencia a los
sistemas de archivos por etiqueta en vez de por nombre de dispositivo. Puede
haber encontrado previamente ejemplos en el texto.
@end deffn

El módulo @code{(gnu system file-systems)} exporta las siguientes variables
útiles.

@defvr {Variable Scheme} %base-file-systems
Estos son los sistemas de archivos esenciales que se necesitan en sistemas
normales, como @code{%pseudo-terminal-file-system} y @code{%immutable-store}
(véase a continuación). Las declaraciones de sistemas operativos deben
contener siempre estos al menos.
@end defvr

@defvr {Variable Scheme} %pseudo-terminal-file-systems
El sistema de archivos que debe montarse como @file{/dev/pts}. Permite la
creación de @dfn{pseudoterminales} a través de @code{openpty} y funciones
similares (@pxref{Pseudo-Terminals,,, libc, The GNU C Library Reference
Manual}). Los pseudoterminales son usados por emuladores de terminales como
@command{xterm}.
@end defvr

@defvr {Variable Scheme} %shared-memory-file-system
Este sistema de archivos se monta como @file{/dev/shm} y se usa para
permitir el uso de memoria compartida entre procesos (@pxref{Memory-mapped I/O, @code{shm_open},, libc, The GNU C Library Reference Manual}).
@end defvr

@defvr {Variable Scheme} %immutable-store
Este sistema de archivos crea un montaje enlazado (``bind-mount'') de
@file{/gnu/store}, permitiendo solo el acceso de lectura para todas las
usuarias incluyendo a @code{root}. Esto previene modificaciones accidentales
por software que se ejecuta como @code{root} o por las administradoras del
sistema.

El daemon sí es capaz de escribir en el almacén: vuelve a montar
@file{/gnu/store} en modo lectura-escritura en su propio ``espacio de
nombres''.
@end defvr

@defvr {Variable Scheme} %binary-format-file-system
El sistema de archivos @code{binfmt_misc}, que permite que el manejo de
tipos de archivos ejecutables arbitrarios se delegue al espacio de
usuaria. Necesita la carga del módulo del núcleo @code{binfmt.ko}.
@end defvr

@defvr {Variable Scheme} %fuse-control-file-system
El sistema de archivos @code{fusectl}, que permite a usuarias sin
privilegios montar y desmontar sistemas de archivos de espacio de usuaria
FUSE. Necesita la carga del módulo del núcleo @code{fuse.ko}.
@end defvr

El módulo @code{(gnu system uuid)} proporciona herramientas para tratar con
``identificadores únicos'' de sistemas de archivos (UUID).

@deffn {Procedimiento Scheme} uuid @var{str} [@var{tipo}]
Devuelve un objeto opaco de UUID (identificador único) del @var{tipo} (un
símbolo) procesando @var{str} (una cadena):

@lisp
(uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")
@result{} #<<uuid> type: dce bv: @dots{}>

(uuid "1234-ABCD" 'fat)
@result{} #<<uuid> type: fat bv: @dots{}>
@end lisp

@var{tipo} puede ser @code{dce}, @code{iso9660}, @code{fat}, @code{ntfs}, o
uno de sus sinónimos habitualmente usados para estos tipos.

Los UUID son otra forma de hacer referencia de forma inequívoca a sistemas
de archivos en la configuración de sistema operativo. Puede haber encontrado
previamente ejemplos en el texto.
@end deffn


@node Sistema de archivos Btrfs
@subsection Sistema de archivos Btrfs

El sistema de archivos Btrfs tiene características especiales, como los
subvolúmenes, que merecen una explicación más detallada. La siguiente
sección intenta cubrir usos básicos así como usos complejos del sistema de
archivos Btrfs con el sistema Guix.

Con el uso más simple se puede describir un sistema de archivos Btrfs puede
describirse, por ejemplo, del siguiente modo:

@lisp
(file-system
  (mount-point "/home")
  (type "btrfs")
  (device (file-system-label "mi-home")))
@end lisp

El ejemplo siguiente es más complejo, ya que usa un subvolumen de Btrfs,
llamado @code{rootfs}. El sistema de archivos tiene la etiqueta
@code{mi-btrfs}, y se encuentra en un dispositivo cifrado (de aquí la
dependencia de @code{mapped-devices}):

@lisp
(file-system
  (device (file-system-label "mi-btrfs"))
  (mount-point "/")
  (type "btrfs")
  (options "subvol=rootfs")
  (dependencies mapped-devices))
@end lisp

Algunos cargadores de arranque, por ejemplo GRUB, únicamente montan una
partición Btrfs en su nivel superior durante los momentos iniciales del
arranque, y dependen de que su configuración haga referencia a la ruta
correcta del subvolumen dentro de dicho nivel superior. Los cargadores de
arranque que operan de este modo producen habitualmente su configuración en
un sistema en ejecución donde las particiones Btrfs ya se encuentran
montadas y donde la información de subvolúmenes está disponible. Como un
ejemplo, @command{grub-mkconfig}, la herramienta de generación de
configuración que viene con GRUB, lee @file{/proc/self/mountinfo} para
determinar la ruta desde el nivel superior de un subvolumen.

El sistema Guix produce una configuración para el cargador de arranque
usando la configuración del sistema operativo como su única entrada; por lo
tanto es necesario extraer la información del subvolumen en el que se
encuentra @file{/gnu/store} (en caso de estar en alguno) de la configuración
del sistema operativo. Para ilustrar esta situación mejor, considere un
subvolumen que se llama 'rootfs' el cual contiene el sistema de archivos
raiz. En esta situación, el cargador de arranque GRUB únicamente vería el
nivel superior de la partición de raíz de Btrfs, por ejemplo:

@example
/                   (nivel superior)
├── rootfs          (directorio del subvolumen)
    ├── gnu         (directorio normal)
        ├── store   (directorio normal)
[...]
@end example

Por lo tanto, el nombre del subvolumen debe añadirse al inicio de la ruta al
núcleo, los binarios de initrd y otros archivos a los que haga referencia la
configuración de GRUB en @file{/gnu/store}, para que puedan encontrarse en
los momentos iniciales del arranque.

El siguiente ejemplo muestra una jerarquía anidada de subvolúmenes y
directorios:

@example
/                   (nivel superior)
├── rootfs          (subvolumen)
    ├── gnu         (directorio normal)
        ├── store   (subvolumen)
[...]
@end example

Este escenario funcionaría sin montar el subvolumen 'store'. Montar 'rootfs'
es suficiente, puesto que el nombre del subvolumen corresponde con el punto
de montaje deseado en la jerarquía del sistema de archivos. Alternativamente
se puede hacer referencia el subvolumen 'store' proporcionando tanto el
valor @code{/rootfs/gnu/store} como el valor @code{rootfs/gnu/store} a la
opción @code{subvol}.

Por último, un ejemplo más elaborado de subvolúmenes anidados:

@example
/                           (nivel superior)
├── root-snapshots          (subvolumen)
    ├── root-current        (subvolumen)
        ├── guix-store      (subvolumen)
[...]
@end example

Aquí, el subvolumen 'guix-store' no corresponde con el punto de montaje
deseado, por lo que es necesario montarlo. El subvolumen debe ser
especificado completamente proporcionando su nombre de archivo a la opción
@code{subvol}. Para ilustrar este ejemplo, el subvolumen 'guix-store' puede
montarse en @file{/gnu/store} usando una declaración de sistema de archivos
como la siguiente:

@lisp
(file-system
  (device (file-system-label "mi-otro-btrfs"))
  (mount-point "/gnu/store")
  (type "btrfs")
  (options "subvol=root-snapshots/root-current/guix-store,\
compress-force=zstd,space_cache=v2"))
@end lisp

@node Dispositivos traducidos
@section Dispositivos traducidos

@cindex traducción de dispositivos
@cindex dispositivos traducidos
The Linux kernel has a notion of @dfn{device mapping}: a block device, such
as a hard disk partition, can be @dfn{mapped} into another device, usually
in @code{/dev/mapper/}, with additional processing over the data that flows
through it@footnote{Note that the GNU@tie{}Hurd makes no difference between
the concept of a ``mapped device'' and that of a file system: both boil down
to @emph{translating} input/output operations made on a file to operations
on its backing store.  Thus, the Hurd implements mapped devices, like file
systems, using the generic @dfn{translator} mechanism (@pxref{Translators,,,
hurd, The GNU Hurd Reference Manual}).}.  A typical example is encryption
device mapping: all writes to the mapped device are encrypted, and all reads
are deciphered, transparently.  Guix extends this notion by considering any
device or set of devices that are @dfn{transformed} in some way to create a
new device; for instance, RAID devices are obtained by @dfn{assembling}
several other devices, such as hard disks or partitions, into a new one that
behaves as one partition.

Los dispositivos traducidos se declaran mediante el uso de la forma
@code{mapped-device}, definida a continuación; ejemplos más adelante.

@deftp {Tipo de datos} mapped-device
Objetos de este tipo representan traducciones de dispositivo que se llevarán
a cabo cuando el sistema arranque.

@table @code
@item source
This is either a string specifying the name of the block device to be
mapped, such as @code{"/dev/sda3"}, or a list of such strings when several
devices need to be assembled for creating a new one.  In case of LVM this is
a string specifying name of the volume group to be mapped.

@item target
This string specifies the name of the resulting mapped device.  For kernel
mappers such as encrypted devices of type @code{luks-device-mapping},
specifying @code{"my-partition"} leads to the creation of the
@code{"/dev/mapper/my-partition"} device.  For RAID devices of type
@code{raid-device-mapping}, the full device name such as @code{"/dev/md0"}
needs to be given.  LVM logical volumes of type @code{lvm-device-mapping}
need to be specified as @code{"VGNAME-LVNAME"}.

@item targets
This list of strings specifies names of the resulting mapped devices in case
there are several.  The format is identical to @var{target}.

@item type
Debe ser un objeto @code{mapped-device-kind}, que especifica cómo
@var{source} se traduce a @var{target}.
@end table
@end deftp

@defvr {Variable Scheme} luks-device-mapping
Define el cifrado de bloques LUKS mediante el uso de la orden
@command{cryptsetup} del paquete del mismo nombre. Depende del módulo
@code{dm-crypt} del núcleo Linux.
@end defvr

@defvr {Variable Scheme} raid-device-mapping
Define un dispositivo RAID, el cual se ensambla mediante el uso de la orden
@code{mdadm} del paquete del mismo nombre. Requiere la carga del módulo del
núcleo Linux para el nivel RAID apropiado, como @code{raid456} para RAID-4,
RAID-5 o RAID-6, o @code{raid10} para RAID-10.
@end defvr

@cindex LVM, logical volume manager
@defvr {Scheme Variable} lvm-device-mapping
This defines one or more logical volumes for the Linux
@uref{https://www.sourceware.org/lvm2/, Logical Volume Manager (LVM)}.  The
volume group is activated by the @command{vgchange} command from the
@code{lvm2} package.
@end defvr

@cindex cifrado de disco
@cindex LUKS
El siguiente ejemplo especifica una traducción de @file{/dev/sda3} a
@file{/dev/mapper/home} mediante el uso de LUKS---la
@url{https://gitlab.com/cryptsetup/cryptsetup,configuración de claves
unificada de Linux}, un mecanismo estándar para cifrado de disco. El
dispositivo @file{/dev/mapper/home} puede usarse entonces como el campo
@code{device} de una declaración @code{file-system} (@pxref{Sistemas de archivos}).

@lisp
(mapped-device
  (source "/dev/sda3")
  (target "home")
  (type luks-device-mapping))
@end lisp

De manera alternativa, para independizarse de la numeración de dispositivos,
puede obtenerse el UUID LUKS (@dfn{identificador único}) del dispositivo
fuente con una orden así:

@example
cryptsetup luksUUID /dev/sda3
@end example

y usarlo como sigue:

@lisp
(mapped-device
  (source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
  (target "home")
  (type luks-device-mapping))
@end lisp

@cindex cifrado del intercambio
It is also desirable to encrypt swap space, since swap space may contain
sensitive data.  One way to accomplish that is to use a swap file in a file
system on a device mapped via LUKS encryption.  In this way, the swap file
is encrypted because the entire device is encrypted.  @xref{Swap Space}, or
@xref{Preparación para la instalación,,Disk Partitioning}, for an example.

Un dispositivo RAID formado por las particiones @file{/dev/sda1} y
@file{/dev/sdb1} puede declararse como se muestra a continuación:

@lisp
(mapped-device
  (source (list "/dev/sda1" "/dev/sdb1"))
  (target "/dev/md0")
  (type raid-device-mapping))
@end lisp

El dispositivo @file{/dev/md0} puede usarse entonces como el campo
@code{device} de una declaración @code{file-system} (@pxref{Sistemas de archivos}). Fíjese que no necesita proporcionar el nivel RAID; se selecciona
durante la creación inicial y formato del dispositivo RAID y después se
determina automáticamente.

LVM logical volumes ``alpha'' and ``beta'' from volume group ``vg0'' can be
declared as follows:

@lisp
(mapped-device
  (source "vg0")
  (targets (list "vg0-alpha" "vg0-beta"))
  (type lvm-device-mapping))
@end lisp

Devices @file{/dev/mapper/vg0-alpha} and @file{/dev/mapper/vg0-beta} can
then be used as the @code{device} of a @code{file-system} declaration
(@pxref{Sistemas de archivos}).

@node Swap Space
@section Swap Space
@cindex memoria de intercambio

Swap space, as it is commonly called, is a disk area specifically designated
for paging: the process in charge of memory management (the Linux kernel or
Hurd's default pager) can decide that some memory pages stored in RAM which
belong to a running program but are unused should be stored on disk
instead.  It unloads those from the RAM, freeing up precious fast memory,
and writes them to the swap space.  If the program tries to access that very
page, the memory management process loads it back into memory for the
program to use.

A common misconception about swap is that it is only useful when small
amounts of RAM are available to the system.  However, it should be noted
that kernels often use all available RAM for disk access caching to make I/O
faster, and thus paging out unused portions of program memory will expand
the RAM available for such caching.

For a more detailed description of how memory is managed from the viewpoint
of a monolithic kernel, @xref{Memory Concepts,,, libc, The GNU C Library
Reference Manual}.

The Linux kernel has support for swap partitions and swap files: the former
uses a whole disk partition for paging, whereas the second uses a file on a
file system for that (the file system driver needs to support it).  On a
comparable setup, both have the same performance, so one should consider
ease of use when deciding between them.  Partitions are ``simpler'' and do
not need file system support, but need to be allocated at disk formatting
time (logical volumes notwithstanding), whereas files can be allocated and
deallocated at any time.

Note that swap space is not zeroed on shutdown, so sensitive data (such as
passwords) may linger on it if it was paged out.  As such, you should
consider having your swap reside on an encrypted device (@pxref{Dispositivos traducidos}).

@deftp {Data Type} swap-space
Objects of this type represent swap spaces.  They contain the following
members:

@table @asis
@item @code{target}
The device or file to use, either a UUID, a @code{file-system-label} or a
string, as in the definition of a @code{file-system} (@pxref{Sistemas de archivos}).

@item @code{dependencies} (predeterminadas: @code{'()})
A list of @code{file-system} or @code{mapped-device} objects, upon which the
availability of the space depends.  Note that just like for
@code{file-system} objects, dependencies which are needed for boot and
mounted in early userspace are not managed by the Shepherd, and so
automatically filtered out for you.

@item @code{priority} (default: @code{#f})
Only supported by the Linux kernel.  Either @code{#f} to disable swap
priority, or an integer between 0 and 32767.  The kernel will first use swap
spaces of higher priority when paging, and use same priority spaces on a
round-robin basis.  The kernel will use swap spaces without a set priority
after prioritized spaces, and in the order that they appeared in (not
round-robin).

@item @code{discard?} (default: @code{#f})
Only supported by the Linux kernel.  When true, the kernel will notify the
disk controller of discarded pages, for example with the TRIM operation on
Solid State Drives.

@end table
@end deftp

Here are some examples:

@lisp
(swap-space (target (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
@end lisp

Use the swap partition with the given UUID@.  You can learn the UUID of a
Linux swap partition by running @command{swaplabel @var{device}}, where
@var{device} is the @file{/dev} file name of that partition.

@lisp
(swap-space
  (target (file-system-label "swap"))
  (dependencies mapped-devices))
@end lisp

Use the partition with label @code{swap}, which can be found after all the
@var{mapped-devices} mapped devices have been opened.  Again, the
@command{swaplabel} command allows you to view and change the label of a
Linux swap partition.

Here's a more involved example with the corresponding @code{file-systems}
part of an @code{operating-system} declaration.

@lisp
(file-systems
  (list (file-system
          (device (file-system-label "root"))
          (mount-point "/")
          (type "ext4"))
        (file-system
          (device (file-system-label "btrfs"))
          (mount-point "/btrfs")
          (type "btrfs"))))

(swap-devices
  (list
    (swap-space
      (target "/btrfs/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/btrfs")
                            file-systems)))))
@end lisp

Use the file @file{/btrfs/swapfile} as swap space, which depends on the file
system mounted at @file{/btrfs}.  Note how we use Guile's filter to select
the file system in an elegant fashion!

@node Cuentas de usuaria
@section Cuentas de usuaria

@cindex usuarias
@cindex cuentas
@cindex cuentas de usuaria
Los grupos y cuentas de usuaria se gestionan completamente a través de la
declaración @code{operating-system}. Se especifican con las formas
@code{user-account} y @code{user-group}:

@lisp
(user-account
  (name "alicia")
  (group "users")
  (supplementary-groups '("wheel"   ;permite usar sudo, etc.
                          "audio"   ;tarjeta de sonido
                          "video"   ;dispositivos audivisuales como cámaras
                          "cdrom")) ;el veterano CD-ROM
  (comment "hermana de Roberto"))
@end lisp

Esta es una cuenta que usa un shell diferente y un directorio personalizado
(el predeterminado sería @file{"/home/rober"}):

@lisp
(user-account
  (name "rober")
  (group "users")
  (comment "hermano de Alicia")
  (shell (file-append zsh "/bin/zsh"))
  (home-directory "/home/roberto"))
@end lisp

Durante el arranque o tras la finalización de @command{guix system
reconfigure}, el sistema se asegura de que únicamente las cuentas de usuaria
y grupos especificados en la declaración @code{operating-system} existen, y
con las propiedades especificadas. Por tanto, la creación o modificación de
cuentas o grupos realizadas directamente invocando órdenes como
@command{useradd} se pierden al reconfigurar o reiniciar el sistema. Esto
asegura que el sistema permanece exactamente como se declaró.

@deftp {Tipo de datos} user-account
Objetos de este tipo representan cuentas de usuaria. Los siguientes miembros
pueden ser especificados:

@table @asis
@item @code{name}
El nombre de la cuenta de usuaria.

@item @code{group}
@cindex grupos
Este es el nombre (una cadena) o identificador (un número) del grupo de
usuarias al que esta cuenta pertenece.

@item @code{supplementary-groups} (predeterminados: @code{'()})
Opcionalmente, esto puede definirse como una lista de nombres de grupo a los
que esta cuenta pertenece.

@item @code{uid} (predeterminado: @code{#f})
Este es el ID de usuaria para esta cuenta (un número), o @code{#f}. En el
último caso, un número es seleccionado automáticamente por el sistema cuando
la cuenta es creada.

@item @code{comment} (predeterminado: @code{""})
Un comentario sobre la cuenta, como el nombre completo de la propietaria.

Note that, for non-system accounts, users are free to change their real name
as it appears in @file{/etc/passwd} using the @command{chfn} command.  When
they do, their choice prevails over the system administrator's choice;
reconfiguring does @emph{not} change their name.

@item @code{home-directory}
Este es el nombre del directorio de usuaria de la cuenta.

@item @code{create-home-directory?} (predeterminado: @code{#t})
Indica si el directorio de usuaria de esta cuenta debe ser creado si no
existe todavía.

@item @code{shell} (predeterminado: Bash)
Esto es una expresión-G denotando el nombre de archivo de un programa que
será usado como shell (@pxref{Expresiones-G}).  Por ejemplo, podría hacer
referencia al ejecutable de Bash de este modo:

@lisp
(file-append bash "/bin/bash")
@end lisp

@noindent
... y al ejecutable de Zsh de este otro:

@lisp
(file-append zsh "/bin/zsh")
@end lisp

@item @code{system?} (predeterminado: @code{#f})
Este valor lógico indica si la cuenta es una cuenta ``del sistema''. Las
cuentas del sistema se tratan a veces de forma especial; por ejemplo, los
gestores gráficos de inicio no las enumeran.

@anchor{user-account-password}
@cindex contraseña, para cuentas de usuaria
@item @code{password} (predeterminada: @code{#f})
Normalmente debería dejar este campo a @code{#f}, inicializar la contraseña
de usuaria como @code{root} con la orden @command{passwd}, y entonces dejar
a las usuarias cambiarla con @command{passwd}. Las contraseñas establecidas
con @command{passwd} son, por supuesto, preservadas entre reinicio y
reinicio, y entre reconfiguraciones.

Si usted @emph{realmente quiere} tener una contraseña prefijada para una
cuenta, entonces este campo debe contener la contraseña cifrada, como una
cadena. Puede usar el procedimiento @code{crypt} para este fin:

@lisp
(user-account
  (name "carlos")
  (group "users")

  ;; Especifica una contraseña inicial mediante un hash SHA-512.
  (password (crypt "ContraseñaInicial!" "$6$abc")))
@end lisp

@quotation Nota
El hash de esta contraseña inicial estará disponible en un archivo en
@file{/gnu/store}, legible por todas las usuarias, por lo que este método
debe usarse con precaución.
@end quotation

@xref{Passphrase Storage,,, libc, The GNU C Library Reference Manual}, para
más información sobre el cifrado de contraseñas, y @ref{Encryption,,, guile,
GNU Guile Reference Manual}, para información sobre el procedimiento de
Guile @code{crypt}.

@end table
@end deftp

@cindex grupos
Las declaraciones de grupos incluso son más simples:

@lisp
(user-group (name "estudiantes"))
@end lisp

@deftp {Tipo de datos} user-group
Este tipo es para grupos de usuarias. Hay únicamente unos pocos campos:

@table @asis
@item @code{name}
El nombre del grupo.

@item @code{id} (predeterminado: @code{#f})
El identificador del grupo (un número). Si es @code{#f}, un nuevo número es
reservado automáticamente cuando se crea el grupo.

@item @code{system?} (predeterminado: @code{#f})
Este valor booleano indica si el grupo es un grupo ``del sistema''. Los
grupos del sistema tienen identificadores numéricos bajos.

@item @code{password} (predeterminada: @code{#f})
¿Qué? ¿Los grupos de usuarias pueden tener una contraseña? Bueno,
aparentemente sí. A menos que sea @code{#f}, este campo especifica la
contraseña del grupo.

@end table
@end deftp

Por conveniencia, una variable contiene una lista con todos los grupos de
usuarias básicos que se puede esperar:

@defvr {Variable Scheme} %base-groups
Esta es la lista de grupos de usuarias básicos que las usuarias y/o los
paquetes esperan que estén presentes en el sistema. Esto incluye grupos como
``root'', ``wheel'' y ``users'', así como grupos usados para controlar el
acceso a dispositivos específicos como ``audio'', ``disk'' y ``cdrom''.
@end defvr

@defvr {Variable Scheme} %base-user-accounts
Esta es la lista de cuentas de usuaria básicas que los programas pueden
esperar encontrar en un sistema GNU/Linux, como la cuenta ``nobody''.

Fíjese que la cuenta de ``root'' no se incluye aquí. Es un caso especial y
se añade automáticamente esté o no especificada.
@end defvr

@node Distribución de teclado
@section Distribución de teclado

@cindex distribución de teclado
@cindex asociación de teclas
Para especificar qué hace cada tecla de su teclado, necesita decirle al
sistema operativo qué @dfn{distribución de teclado} desea usar. La
predeterminada, cuando no se especifica ninguna, es la distribución QWERTY
de 105 teclas para PC de teclado inglés estadounidense. No obstante, las
personas germano-parlantes habitualmente prefieren la distribución QWERTZ
alemana, las franco-parlantes desearán la distribución AZERTY, etcétera; las
hackers pueden preferir Dvorak o bépo, y pueden incluso desear personalizar
más aún el efecto de determinadas teclas. Esta sección explica cómo hacerlo.

@cindex distribución de teclado, definición
Hay tres componentes que desearán conocer la distribución de su teclado:

@itemize
@item
El @emph{cargador de arranque} puede desear conocer cual es la distribución
de teclado que desea usar (@pxref{Configuración del gestor de arranque,
@code{keyboard-layout}}). Esto es útil si desea, por ejemplo, asegurarse de
que puede introducir la contraseña de cifrado de su partición raíz usando la
distribución correcta.

@item
El @emph{núcleo del sistema operativo}, Linux, la necesitará de manera que
la consola se configure de manera adecuada (@pxref{Referencia de operating-system, @code{keyboard-layout}}).

@item
El @emph{servidor gráfico}, habitualmente Xorg, también tiene su propia idea
de distribución de teclado (@pxref{Sistema X Window, @code{keyboard-layout}}).
@end itemize

Guix le permite configurar las tres distribuciones por separado pero,
afortunadamente, también le permite compartir la misma distribución de
teclado para los tres componentes.

@cindex XKB, distribuciones de teclado
Las distribuciones de teclado se representan mediante registros creados con
el procedimiento @code{keyboard-layout} de @code{(gnu system keyboard)}. A
imagen de la extensión de teclado de X (XKB), cada distribución tiene cuatro
atributos: un nombre (habitualmente un código de idioma como ``fi'' para
finés o ``jp'' para japonés), un nombre opcional de variante, un nombre
opcional de modelo de teclado y una lista, puede que vacía, de opciones
adicionales. En la mayor parte de los casos el nombre de la distribución es
lo único que le interesará.

@deffn {Procedimiento Scheme} keyboard-layout @var{nombre} [@var{variante}] @
                [#:model] [#:options '()]
Devuelve una distribución de teclado para el @var{nombre} y la
@var{variante} que se proporcionan.

@var{nombre} debe ser una cadena como @code{"fr"}; @var{variante} debe ser
una cadena como @code{"bepo"} o @code{"nodeadkeys"}. Véase el paquete
@code{xkeyboard-config} para las opciones válidas.
@end deffn

Estos son algunos ejemplos:

@lisp
;; La distribución QWERTZ alemana. Se asume un modelo de
;; teclado "pc105" estándar.
(keyboard-layout "de")

;; La variante bépo de la distribución francesa.
(keyboard-layout "fr" "bepo")

;; La distribución de teclado catalana.
(keyboard-layout "es" "cat")

;; Distribución de teclado árabe con "Alt-Shift" para cambiar
;; a la distribución de teclado de EEUU.
(keyboard-layout "ar,us" #:options '("grp:alt_shift_toggle"))

;; La distribución de teclado de latinoamérica. Además,
;; la tecla "Bloq Mayús" se usa como una tecla "Ctrl"
;; adicional, y la tecla "Menú" se usa como una tecla
;; "Componer/Compose" para introducir letras acentuadas.
(keyboard-layout "latam"
                 #:options '("ctrl:nocaps" "compose:menu"))

;; La distribución rusa para un teclado ThinkPad.
(keyboard-layout "ru" #:model "thinkpad")

;; La distribución estadounidense internacional, la cual es
;; la distribución estadounidense junto a teclas muertas para
;; introducir caracteres acentuados. Esta es para un teclado
;; Apple MackBook.
(keyboard-layout "us" "intl" #:model "macbook78")
@end lisp

Véase el directorio @file{share/X11/xkb} del paquete @code{xkeyboard-config}
para una lista completa de implementaciones de distribuciones, variantes y
modelos.

@cindex distribución de teclado, configuración
Digamos que desea que su sistema use la distribución de teclado turca a lo
largo de todo su sistema---cargador de arranque, consola y Xorg. Así es como
sería su configuración del sistema:

@findex set-xorg-configuration
@lisp
;; Usando la distribución turca para el cargador de
;; arranque, la consola y Xorg.

(operating-system
  ;; ...
  (keyboard-layout (keyboard-layout "tr"))  ;for the console
  (bootloader (bootloader-configuration
                (bootloader grub-efi-bootloader)
                (targets '("/boot/efi"))
                (keyboard-layout keyboard-layout))) ;for GRUB
  (services (cons (set-xorg-configuration
                    (xorg-configuration             ;for Xorg
                      (keyboard-layout keyboard-layout)))
                  %desktop-services)))
@end lisp

En el ejemplo previo, para GRUB y para Xorg, simplemente hemos hecho
referencia al campo @code{keyboard-layout} definido previamente, pero
también podíamos haber hecho referencia a una distribución diferente. El
procedimiento @code{set-xorg-configuration} comunica la configuración de
Xorg deseada al gestor gráfico de ingreso en el sistema, GDM por omisión.

Hemos tratado cómo especificar la distribución @emph{predeterminada} del
teclado de su sistema cuando arranca, pero también la puede modificar en
tiempo de ejecución:

@itemize
@item
Si usa GNOME, su panel de configuración tiene una entrada de ``Región e
Idioma'' donde puede seleccionar una o más distribuciones de teclado.

@item
En Xorg, la orden @command{setxkbmap} (del paquete con el mismo nombre) le
permite cambiar la distribución en uso actualmente. Por ejemplo, así es como
cambiaría a la distribución Dvorak estadounidense:

@example
setxkbmap us dvorak
@end example

@item
La orden @code{loadkeys} cambia la distribución de teclado en efecto en la
consola Linux. No obstante, tenga en cuenta que @code{loadkeys} @emph{no}
usa la categorización de distribuciones de XKB descrita previamente. La
orden a continuación carga la distribución francesa bépo:

@example
loadkeys fr-bepo
@end example
@end itemize

@node Localizaciones
@section Localizaciones

@cindex localización
Una @dfn{localización} define convenciones culturales para una lengua y
región del mundo particular (@pxref{Localizaciones,,, libc, The GNU C Library
Reference Manual}). Cada localización tiene un nombre que típicamente tiene
la forma de @code{@var{lengua}_@var{territorio}.@var{codificación}}---por
ejemplo, @code{fr_LU.utf8} designa la localización para la lengua francesa,
con las convenciones culturales de Luxemburgo, usando la codificación UTF-8.

@cindex definición de localización
Normalmente deseará especificar la localización predeterminada para la
máquina usando el campo @code{locale} de la declaración
@code{operating-system} (@pxref{Referencia de operating-system, @code{locale}}).

La localización seleccionada es automáticamente añadida a las
@dfn{definiciones de localización} conocidas en el sistema si es necesario,
con su codificación inferida de su nombre---por ejemplo, se asume que
@code{bo_CN.utf8} usa la codificación @code{UTF-8}. Definiciones de
localización adicionales pueden ser especificadas en el campo
@code{locale-definitions} de @code{operating-system}---esto es util, por
ejemplo, si la codificación no puede ser inferida del nombre de la
localización. El conjunto predeterminado de definiciones de localización
incluye algunas localizaciones ampliamente usadas, pero no todas las
disponibles, para ahorrar espacio.

Por ejemplo, para añadir la localización del frisio del norte para Alemania,
el valor de dicho campo puede ser:

@lisp
(cons (locale-definition
        (name "fy_DE.utf8") (source "fy_DE"))
      %default-locale-definitions)
@end lisp

De mismo modo, para ahorrar espacio, se puede desear que
@code{locale-definitions} contenga únicamente las localizaciones que son
realmente usadas, como en:

@lisp
(list (locale-definition
        (name "ja_JP.eucjp") (source "ja_JP")
        (charset "EUC-JP")))
@end lisp

@vindex LOCPATH
Las definiciones de localización compiladas están disponibles en
@file{/run/current-system/locale/X.Y}, donde @code{X.Y} es la versión de
libc, que es la ruta donde la GNU@tie{}libc contenida en Guix buscará los
datos de localización. Esto puede ser sobreescrito usando la variable de
entorno @env{LOCPATH} (@pxref{locales-and-locpath, @env{LOCPATH} and locale
packages}).

La forma @code{locale-definition} es proporcionada por el módulo @code{(gnu
system locale)}. Los detalles se proporcionan a continuación.

@deftp {Tipo de datos} locale-definition
Este es el tipo de datos de una definición de localización.

@table @asis

@item @code{name}
El nombre de la localización.  @xref{Locale Names,,, libc, The GNU C Library
Reference Manual}, para más información sobre nombres de localizaciones.

@item @code{source}
El nombre de la fuente para dicha localización. Habitualmente es la parte
@code{@var{idioma}_@var{territorio}} del nombre de localización.

@item @code{charset} (predeterminado: @code{"UTF-8"})
La ``codificación de caracteres'' o ``conjunto de caracteres'' para dicha
localización, @uref{https://www.iana.org/assignments/character-sets, como lo
define IANA}.

@end table
@end deftp

@defvr {Variable Scheme} %default-locale-definitions
Una lista de localizaciones UTF-8 usadas de forma común, usada como valor
predeterminado del campo @code{locale-definitions} en las declaraciones
@code{operating-system}.

@cindex nombre de localización
@cindex codificación normalizada en los nombres de localizaciones
Estas definiciones de localizaciones usan la @dfn{codificación normalizada}
para el fragmento tras el punto en el nombre (@pxref{Using gettextized software, normalized codeset,, libc, The GNU C Library Reference
Manual}). Por lo que por ejemplo es válido @code{uk_UA.utf8} pero @emph{no},
digamos, @code{uk_UA.UTF-8}.
@end defvr

@subsection Consideraciones sobre la compatibilidad de datos de localización

@cindex incompatibilidad, de datos de localización
Las declaraciones @code{operating-system} proporcionan un campo
@code{locale-libcs} para especificar los paquetes GNU@tie{}libc que se
usarán para compilar las declaraciones de localizaciones
(@pxref{Referencia de operating-system}). ``¿Por qué debo preocuparme?'', puede
preguntarse. Bueno, sucede que el formato binario de los datos de
localización es ocasionalmente incompatible de una versión de libc a otra.

@c See <https://sourceware.org/ml/libc-alpha/2015-09/msg00575.html>
@c and <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
Por ejemplo, un programa enlazado con la versión 2.21 de libc no puede leer
datos de localización producidos con libc 2.22; peor aún, ese programa
@emph{aborta} en vez de simplemente ignorar los datos de localización
incompatibles@footnote{Las versiones 2.23 y posteriores de GNU@tie{}libc
simplemente ignorarán los datos de localización incompatibles, lo cual ya es
un avance.}. De manera similar, un programa enlazado con libc 2.22 puede
leer la mayor parte, pero no todo, de los datos de localización de libc 2.21
(específicamente, los datos @env{LC_COLLATE} son incompatibles); por tanto
las llamadas a @code{setlocale} pueden fallar, pero los programas no
abortarán.

El ``problema'' con Guix es que las usuarias tienen mucha libertad: pueden
elegir cuando e incluso si actualizar el software en sus perfiles, y pueden
estar usando una versión de libc diferente de la que la administradora del
sistema usó para construir los datos de localización comunes a todo el
sistema.

Por suerte, las usuarias sin privilegios también pueden instalar sus propios
datos de localización y definir @env{GUIX_LOCPATH} de manera adecuada
(@pxref{locales-and-locpath, @env{GUIX_LOCPATH} y paquetes de
localizaciones}).

No obstante, es mejor si los datos de localización globales del sistema en
@file{/run/current-system/locale} se construyen para todas las versiones de
libc realmente en uso en el sistema, de manera que todos los programas
puedan acceder a ellos---esto es especialmente crucial en un sistema
multiusuaria. Para hacerlo, la administradora puede especificar varios
paquetes libc en el campo @code{locale-libcs} de @code{operating-system}:

@lisp
(use-package-modules base)

(operating-system
  ;; @dots{}
  (locale-libcs (list glibc-2.21 (canonical-package glibc))))
@end lisp

Este ejemplo llevaría a un sistema que contiene definiciones de localización
tanto para libc 2.21 como para la versión actual de libc en
@file{/run/current-system/locale}.


@node Servicios
@section Servicios

@cindex servicios del sistema
Una parte importante de la preparación de una declaración
@code{operating-system} es listar los @dfn{servicios del sistema} y su
configuración (@pxref{Uso de la configuración del sistema}). Los servicios del
sistema típicamente son daemon lanzados cuando el sistema arrancha, u otras
acciones necesarias en ese momento---por ejemplo, configurar el acceso de
red.

Guix tiene una definición amplia de ``servicio'' (@pxref{Composición de servicios}), pero muchos servicios se gestionan por GNU@tie{}Shepherd
(@pxref{Servicios de Shepherd}). En un sistema en ejecución, la orden
@command{herd} le permite enumerar los servicios disponibles, mostrar su
estado, arrancarlos y pararlos, o realizar otras acciones específicas
(@pxref{Jump Start,,, shepherd, The GNU Shepherd Manual}). Por ejemplo:

@example
# herd status
@end example

La orden previa, ejecutada como @code{root}, enumera los servicios
actualmente definidos. La orden @command{herd doc} muestra una sinopsis del
servicio proporcionado y sus acciones asociadas:

@example
# herd doc nscd
Run libc's name service cache daemon (nscd).

# herd doc nscd action invalidate
invalidate: Invalidate the given cache--e.g., 'hosts' for host name lookups.
@end example

Las ordenes internas @command{start}, @command{stop} y @command{restart}
tienen el efecto de arrancar, parar y reiniciar el servicio,
respectivamente. Por ejemplo, las siguientes órdenes paran el servicio nscd
y reinician el servidor gráfico Xorg:

@example
# herd stop nscd
Service nscd has been stopped.
# herd restart xorg-server
Service xorg-server has been stopped.
Service xorg-server has been started.
@end example

@cindex configuration, action for shepherd services
@cindex configuration file, of a shepherd service
For some services, @command{herd configuration} returns the name of the
service's configuration file, which can be handy to inspect its
configuration:

@example
# herd configuration sshd
/gnu/store/@dots{}-sshd_config
@end example

Las siguientes secciones documentan los servicios disponibles, comenzando
con los servicios básicos, que pueden ser usados en una declaración
@code{operating-system}.

@menu
* Servicios base::           Servicios esenciales del sistema.
* Ejecución de tareas programadas::  El servicio mcron.
* Rotación del registro de mensajes::  El servicio rottlog.
* Networking Setup::         Setting up network interfaces.
* Servicios de red::         Firewall, SSH daemon, etc.
* Actualizaciones no-atendidas::  Actualizaciones del sistema automatizadas.
* Sistema X Window::         Interfaz gráfica.
* Servicios de impresión::  Uso de impresoras locales y remotas.
* Servicios de escritorio::  D-Bus y servicios de escritorio.
* Servicios de sonido::      Servicios de ALSA y Pulseaudio.
* Servicios de bases de datos::  Bases de datos SQL, almacenes de 
                                   clave-valor, etc.
* Servicios de correo::      IMAP, POP3, SMTP y todo eso.
* Servicios de mensajería::  Servicios de mensajería.
* Servicios de telefonía::  Servicios de telefonía.
* File-Sharing Services::    File-sharing services.
* Servicios de monitorización::  Servicios de monitorización.
* Servicios Kerberos::       Servicios Kerberos.
* Servicios LDAP::           Servicios LDAP.
* Servicios Web::            Servidores Web.
* Servicios de certificados::  Certificados TLS via Let's Encrypt.
* Servicios DNS::            Daemon de DNS.
* VNC Services::             VNC daemons.
* Servicios VPN::            Daemon de VPN.
* Sistema de archivos en red::  Servicios relacionados con NFS.
* Samba Services::           Samba services.
* Integración continua::    Cuirass and Laminar services.
* Servicios de gestión de energía::  Extender la vida de la batería.
* Servicios de audio::       El MPD.
* Servicios de virtualización::  Servicios de virtualización.
* Servicios de control de versiones::  Proporcionar acceso remoto a 
                                         repositorios Git.
* Servicios de juegos::      Servidores de juegos.
* Servicio PAM Mount::       Servicio de montado de volúmenes en el ingreso 
                               al sistema.
* Servicios de Guix::        Servicios relacionados específicamente con 
                               Guix.
* Servicios de Linux::       Servicios asociados al núcleo Linux.
* Servicios de Hurd::        Servicios específicos para un sistema Hurd.
* Servicios misceláneos::   Otros servicios.
@end menu

@node Servicios base
@subsection Servicios base

El módulo @code{(gnu services base)} proporciona definiciones para los
servicios básicos que se esperan en el sistema. Los servicios exportados por
este módulo se enumeran a continuación.

@defvr {Variable Scheme} %base-services
Esta variable contiene una lista de servicios básicos (@pxref{Tipos de servicios y servicios}, para más información sobre los objetos servicio) que se
pueden esperar en el sistema: un servicio de ingreso al sistema (mingetty)
en cada tty, syslogd, el daemon de la caché del servicio de nombres (nscd),
el gestor de dispositivos udev, y más.

Este es el valor predeterminado del campo @code{services} de las
declaraciones @code{operating-system}. De manera habitual, cuando se
personaliza el sistema, es deseable agregar servicios a
@code{%base-services}, de esta forma:

@lisp
(append (list (service avahi-service-type)
              (service openssh-service-type))
        %base-services)
@end lisp
@end defvr

@defvr {Variable Scheme} special-files-service-type
El servicio que establece ``archivos especiales'' como @file{/bin/sh}; una
instancia suya es parte de @code{%base-services}.

El valor asociado con servicios @code{special-file-service-type} debe ser
una lista de tuplas donde el primer elemento es el ``archivo especial'' y el
segundo elemento es su destino. El valor predeterminado es:

@cindex @file{/bin/sh}
@cindex @file{sh}, en @file{/bin}
@lisp
`(("/bin/sh" ,(file-append bash "/bin/sh"))
  ("/usr/bin/env" ,(file-append coreutils "/bin/env")))
@end lisp

@cindex @file{/usr/bin/env}
@cindex @file{env}, en @file{/usr/bin}
If you want to add, say, @code{/bin/bash} to your system, you can change it
to:

@lisp
`(("/bin/sh" ,(file-append bash "/bin/sh"))
  ("/usr/bin/env" ,(file-append coreutils "/bin/env"))
  ("/bin/bash" ,(file-append bash "/bin/bash")))
@end lisp

Ya que es parte de @code{%base-services}, puede usar @code{modify-services}
para personalizar el conjunto de archivos especiales (@pxref{Referencia de servicios, @code{modify-services}}). Pero una forma simple de añadir un
archivo especial es usar el procedimiento @code{extra-special-file} (véase a
continuación).
@end defvr

@deffn {Procedimiento Scheme} extra-special-file @var{archivo} @var{destino}
Usa @var{destino} como el ``archivo especial'' @var{archivo}.

Por ejemplo, la adición de las siguientes líneas al campo @code{services} de
su declaración de sistema operativo genera @file{/usr/bin/env} como un
enlace simbólico:

@lisp
(extra-special-file "/usr/bin/env"
                    (file-append coreutils "/bin/env"))
@end lisp
@end deffn

@deffn {Procedimiento Scheme} host-name-service @var{nombre}
Devuelve un servicio que establece el nombre de máquina a @var{nombre}.
@end deffn

@defvr {Variable Scheme} console-font-service-type
Instala las tipografías proporcionadas en las consolas virtuales (tty)
especificados (las tipografías se asocian a cada consola virtual con el
núcleo Linux). El valor de este servicio es una lista de pares
tty/tipografía. La tipografía puede ser el nombre de alguna de las
proporcionadas por el paquete @code{kbd} o cualquier parámetro válido para
la orden @command{setfont}, como en este ejemplo:

@lisp
`(("tty1" . "LatGrkCyr-8x16")
  ("tty2" . ,(file-append
                font-tamzen
                "/share/kbd/consolefonts/TamzenForPowerline10x20.psf"))
  ("tty3" . ,(file-append
                font-terminus
                "/share/consolefonts/ter-132n"))) ; para HDPI
@end lisp
@end defvr

@deffn {Procedimiento Scheme} login-service @var{config}
Devuelve un servicio para ejecutar el ingreso al sistema de acuerdo con
@var{config}, un objeto @code{<login-configuration>}, que especifica el
mensaje del día, entre otras cosas.
@end deffn

@deftp {Tipo de datos} login-configuration
Este es el tipo de datos que representa la configuración del ingreso al
sistema.

@table @asis

@item @code{motd}
@cindex mensaje del día
Un objeto tipo-archivo que contiene el ``mensaje del día''.

@item @code{allow-empty-passwords?} (predeterminado: @code{#t})
Permite contraseñas vacías por defecto para que las primeras usuarias puedan
ingresar en el sistema cuando la cuenta de ``root'' está recién creada.

@end table
@end deftp

@deffn {Procedimiento Scheme} mingetty-service @var{config}
Devuelve un servicio para ejecutar mingetty de acuerdo con @var{config}, un
objeto @code{<mingetty-configuration>}, que especifica el tty a ejecutar
entre otras cosas.
@end deffn

@deftp {Tipo de datos} mingetty-configuration
Este es el tipo de datos que representa la configuración de Mingetty, el
cual proporciona la implementación predeterminada de ingreso al sistema en
las consolas virtuales.

@table @asis

@item @code{tty}
El nombre de la consola en la que se ejecuta este Mingetty---por ejemplo,
@code{"tty1"}.

@item @code{auto-login} (predeterminado: @code{#f})
Cuando sea verdadero, este campo debe ser una cadena que denote el nombre de
usuaria bajo el cual el sistema ingresa automáticamente. Cuando es
@code{#f}, se deben proporcionar un nombre de usuaria y una contraseña para
ingresar en el sistema.

@item @code{login-program} (predeterminado: @code{#f})
Debe ser @code{#f}, en cuyo caso se usa el programa predeterminado de
ingreso al sistema (@command{login} de las herramientas Shadow), o una
expresión-G que determine el nombre del programa de ingreso al sistema.

@item @code{login-pause?} (predeterminado: @code{#f})
Cuando es @code{#t} en conjunción con @var{auto-login}, la usuaria deberá
presionar una tecla para lanzar el shell de ingreso al sistema.

@item @code{clear-on-logout?} (default: @code{#t})
When set to @code{#t}, the screen will be cleared after logout.

@item @code{mingetty} (predeterminado: @var{mingetty})
El paquete Mingetty usado.

@end table
@end deftp

@deffn {Procedure Scheme} agetty-service @var{config}
Devuelve un servicio para ejecutar agetty de acuerdo con @var{config}, un
objeto @code{<agetty-configuration>}, que especifica el tty a ejecutar entre
otras cosas.
@end deffn

@deftp {Tipo de datos} agetty-configuration
Este es el tipo de datos que representa la configuración de agetty, que
implementa el ingreso al sistema en las consolas virtuales y serie. Véase la
página de manual @code{agetty(8)} para más información.

@table @asis

@item @code{tty}
El nombre de la consola en la que se ejecuta este agetty, como una
cadena---por ejemplo, @code{"ttyS0"}. Este parámetro es opcional, su valor
predeterminado es un puerto serie razonable usado por el núcleo Linux.

Para ello, si hay un valor para una opción @code{agetty.tty} en la línea de
órdenes del núcleo, agetty extraerá el nombre del dispositivo del puerto
serie de allí y usará dicho valor.

Si no y hay un valor para la opción @code{console} con un tty en la línea de
órdenes de Linux, agetty extraerá el nombre del dispositivo del puerto serie
de allí y usará dicho valor.

En ambos casos, agetty dejará el resto de configuración de dispositivos
serie (tasa de transmisión, etc.)@: sin modificar---con la esperanza de que
Linux haya proporcionado ya los valores correctos.

@item @code{baud-rate} (predeterminado: @code{#f})
Una cadena que contenga una lista separada por comas de una o más tasas de
transmisión, en orden descendiente.

@item @code{term} (predeterminado: @code{#f})
Una cadena que contiene el valor usado para la variable de entorno
@env{TERM}.

@item @code{eight-bits?} (predeterminado: @code{#f})
En caso de ser @code{#t}, se asume que el tty permite el paso de 8 bits, y
la detección de paridad está desactivada.

@item @code{auto-login} (predeterminado: @code{#f})
Cuando se proporciona un nombre de ingreso al sistema, como una cadena, la
usuaria especificada ingresará automáticamente sin solicitar su nombre de
ingreso ni su contraseña.

@item @code{no-reset?} (predeterminado: @code{#f})
En caso de ser @code{#t}, no reinicia los modos de control del terminal
(cflags).

@item @code{host} (predeterminado: @code{#f})
Acepta una cadena que contenga el ``nombre_de_máquina_de_ingreso'', que será
escrito en el archivo @file{/var/run/utmpx}.

@item @code{remote?} (predeterminado: @code{#f})
Cuando se fija a @code{#t} en conjunción con @var{host}, se añadirá una
opción @code{-r} "fakehost" a la línea de órdenes del programa de ingreso al
sistema especificado en @var{login-program}.

@item @code{flow-control?} (predeterminado: @code{#f})
Cuando es @code{#t}, activa el control de flujo hardware (RTS/CTS).

@item @code{no-issue?} (predeterminado: @code{#f})
Cuando es @code{#t}, el contenido del archivo @file{/etc/issue} no se
mostrará antes de presentar el mensaje de ingreso al sistema.

@item @code{init-string} (predeterminada: @code{#f})
Esto acepta una cadena que se enviará al tty o módem antes de mandar nada
más. Puede usarse para inicializar un modem.

@item @code{no-clear?} (predeterminado: @code{#f})
Cuando es @code{#t}, agetty no limpiará la pantalla antes de mostrar el
mensaje de ingreso al sistema.

@item @code{login-program} (predeterminado: (file-append shadow "/bin/login"))
Esto debe ser o bien una expresión-g que denote el nombre del programa de
ingreso al sistema, o no debe proporcionarse, en cuyo caso el valor
predeterminado es @command{login} del conjunto de herramientas Shadow.

@item @code{local-line} (predeterminado: @code{#f})
Control the CLOCAL line flag.  This accepts one of three symbols as
arguments, @code{'auto}, @code{'always}, or @code{'never}.  If @code{#f},
the default value chosen by agetty is @code{'auto}.

@item @code{extract-baud?} (predeterminado: @code{#f})
Cuando es @code{#t}, instruye a agetty para extraer la tasa de transmisión
de los mensajes de estado producidos por ciertos tipos de módem.

@item @code{skip-login?} (predeterminado: @code{#f})
Cuando es @code{#t}, no solicita el nombre de la usuaria para el ingreso al
sistema. Puede usarse con el campo @var{login-program} para usar sistemas de
ingreso no estándar.

@item @code{no-newline?} (predeterminado: @code{#f})
Cuando es @code{#t}, no imprime una nueva línea antes de imprimir el archivo
@file{/etc/issue}.

@c Is this dangerous only when used with login-program, or always?
@item @code{login-options} (predeterminadas: @code{#f})
Esta opción acepta una cadena que contenga opciones para proporcionar al
programa de ingreso al sistema. Cuando se use con @var{login-program}, sea
consciente de que una usuaria con malas intenciones podría intentar
introducir un nombre que contuviese opciones embebidas que serían procesadas
por el programa de ingreso.

@item @code{login-pause} (predeterminada: @code{#f})
Cuando es @code{#t}, espera la pulsación de cualquier tecla antes de mostrar
el mensaje de ingreso al sistema. Esto puede usarse en conjunción con
@var{auto-login} para ahorrar memoria lanzando cada shell cuando sea
necesario.

@item @code{chroot} (predeterminado: @code{#f})
Cambia la raíz al directorio especificado. Esta opción acepta una ruta de
directorio como una cadena.

@item @code{hangup?} (predeterminado: @code{#f})
Usa la llamada del sistema Linux @code{vhangup} para colgar de forma virtual
el terminal especificado.

@item @code{keep-baud?} (predeterminado: @code{#f})
Cuando es @code{#t}, prueba a mantener la tasa de transmisión existente. Las
tasas de transmisión de @var{baud-rate} se usan cuando agetty recibe un
carácter @key{BREAK}.

@item @code{timeout} (predeterminado: @code{#f})
Cuando sea un valor entero, termina si no se pudo leer ningún nombre de
usuaria en @var{timeout} segundos.

@item @code{detect-case?} (predeterminado: @code{#f})
Cuando es @code{#t}, activa la detección de terminales únicamente con
mayúsculas. ESta configuración detectará un nombre de ingreso que contenga
únicamente letras mayúsculas como un indicativo de un terminal con letras
únicamente mayúsculas y activará las conversiones de mayúscula a
minúscula. Tenga en cuenta que esto no permitirá caracteres Unicode.

@item @code{wait-cr?} (predeterminado: @code{#f})
Cuando es @code{#t}, espera hasta que la usuaria o el modem envíen un
carácter de retorno de carro o de salto de línea antes de mostrar
@file{/etc/issue} o el mensaje de ingreso. Se usa de forma típica junto a la
opción @var{init-string}.

@item @code{no-hints?} (predeterminado: @code{#f})
Cuando es @code{#t}, no imprime avisos sobre el bloqueo numérico, las
mayúsculas o el bloqueo del desplazamiento.

@item @code{no-hostname?} (predeterminado: @code{#f})
El nombre de la máquina se imprime de forma predeterminada. Cuando esta
opción es @code{#t}, no se mostrará ningún nombre de máquina.

@item @code{long-hostname?} (predeterminado: @code{#f})
El nombre de máquina se imprime de forma predeterminada únicamente hasta el
primer punto. Cuando esta opción es @code{#t}, se muestra el nombre
completamente cualificado de la máquina mostrado por @code{gethostname} o
@code{getaddrinfo}.

@item @code{erase-characters} (predeterminado: @code{#f})
Esta opción acepta una cadena de caracteres adicionales que deben
interpretarse como borrado del carácter anterior cuando la usuaria introduce
su nombre de ingreso.

@item @code{kill-characters} (predeterminado: @code{#f})
Esta opción acepta una cadena de que debe ser interpretada como ``ignora
todos los caracteres anteriores'' (también llamado carácter ``kill'') cuando
la usuaria introduce su nombre de ingreso.

@item @code{chdir} (predeterminado: @code{#f})
Esta opción acepta, como una cadena, una ruta de directorio que a la que se
cambiará antes del ingreso al sistema.

@item @code{delay} (predeterminado: @code{#f})
Esta opción acepta, como un entero, el número de segundos a esperar antes de
abrir el tty y mostrar el mensaje de ingreso al sistema.

@item @code{nice} (predeterminado: @code{#f})
Esta opción acepta, como un entero, el valor ``nice'' con el que se
ejecutará el programa @command{login}.

@item @code{extra-options} (predeterminadas: @code{'()})
Esta opción proporciona una ``trampilla de escape'' para que la usuaria
proporcione parámetros de línea de órdenes adicionales a @command{agetty}
como una lista de cadenas.

@item @code{shepherd-requirement} (default: @code{'()})
The option can be used to provides extra shepherd requirements (for example
@code{'syslogd}) to the respective @code{'term-}* shepherd service.

@end table
@end deftp

@deffn {Procedimiento Scheme} kmscon-service-type @var{config}
Devuelve un servicio que ejecuta
@uref{https://www.freedesktop.org/wiki/Software/kmscon,kmscon} de acuerdo a
@var{config}, un objeto @code{<kmscon-configuration>}, que especifica el tty
sobre el que se ejecutará, entre otras cosas.
@end deffn

@deftp {Tipo de datos} kmscon-configuration
Este es el tipo de datos que representa la configuración de Kmscon, que
implementa el ingreso al sistema en consolas virtuales.

@table @asis

@item @code{virtual-terminal}
El nombre de la consola en la que se ejecuta este Kmscon---por ejemplo,
@code{"tty1"}.

@item @code{login-program} (predeterminado: @code{#~(string-append #$shadow "/bin/login")})
A gexp denoting the name of the log-in program.  The default log-in program
is @command{login} from the Shadow tool suite.

@item @code{login-arguments} (predeterminados: @code{'("-p")})
Una lista de parámetros para proporcionar a @command{login}.

@item @code{auto-login} (predeterminado: @code{#f})
Cuando se proporciona un nombre de ingreso al sistema, como una cadena, la
usuaria especificada ingresará automáticamente sin solicitar su nombre de
ingreso ni su contraseña.

@item @code{hardware-acceleration?} (predeterminado: #f)
Determina si se usará aceleración hardware.

@item @code{font-engine} (default: @code{"pango"})
Font engine used in Kmscon.

@item @code{font-size} (default: @code{12})
Font size used in Kmscon.

@item @code{keyboard-layout} (predeterminada: @code{#f})
If this is @code{#f}, Kmscon uses the default keyboard layout---usually US
English (``qwerty'') for a 105-key PC keyboard.

Otherwise this must be a @code{keyboard-layout} object specifying the
keyboard layout.  @xref{Distribución de teclado}, for more information on how to
specify the keyboard layout.

@item @code{kmscon} (predeterminado: @var{kmscon})
El paquete Kmscon usado.

@end table
@end deftp

@cindex daemon de caché del servicio de nombres
@cindex nscd
@deffn {Procedimiento Scheme} nscd-service [@var{configuración}] [#:glibc glibc] @
                [#:name-services '()]
Devuelve un servicio que ejecuta el daemon de la caché del servicio de
nombres (nscd) con la @var{configuración} proporcionada---un objeto
@code{<nscd-configuration>}. @xref{Selector de servicios de nombres}, para un ejemplo.

Por conveniencia, el servicio ncsd de Shepherd proporciona las siguientes
acciones:

@table @code
@item invalidate
@cindex invalidación de caché, nscd
@cindex nscd, invalidación de caché
Esto invalida la caché dada. Por ejemplo, ejecutar:

@example
herd invalidate nscd hosts
@end example

@noindent
invalida la caché de búsqueda de nombres de máquinas de nscd.

@item statistics
Ejecutar @command{herd statistics nscd} muestra información del uso nscd y
la caché.
@end table

@end deffn

@defvr {Variable Scheme} %nscd-default-configuration
El valor del @code{<ncsd-configuration>} predeterminado (véase a
continuación) usado por @code{nscd-service}. Usa los espacios de caché
definidos por @code{%nscd-default-caches}; véase a continuación.
@end defvr

@deftp {Tipo de datos} nscd-configuration
Este tipo de datos representa la configuración del daemon de caché del
servicio de nombres (nscd).

@table @asis

@item @code{name-services} (predeterminados: @code{'()})
Lista de paquetes que indican los @dfn{servicios de nombres} que serán
visibles al nscd---por ejemplo, @code{(list @var{nss-mdns})}.

@item @code{glibc} (predeterminada: @var{glibc})
Paquete que denota la biblioteca C de GNU que proporciona la orden
@command{nscd}.

@item @code{log-file} (predeterminado: @code{"/var/log/nscd.log"})
Nombre del archivo de registro de nscd. Aquí es donde se almacena la salida
de depuración cuando @code{debug-level} es estrictamente positivo.

@item @code{debug-level} (predeterminado: @code{0})
Entero que indica el nivel de depuración. Números mayores significan que se
registra más salida de depuración.

@item @code{caches} (predeterminado: @code{%nscd-default-caches})
Lista de objetos @code{<nscd-cache>} que indican cosas a mantener en caché;
véase a continuación.

@end table
@end deftp

@deftp {Tipo de datos} nscd-cache
Tipo de datos que representa una base de datos de caché de nscd y sus
parámetros.

@table @asis

@item @code{base de datos}
Es un símbolo que representa el nombre de la base de datos de la que se
actúa como caché. Se aceptan los valores @code{passwd}, @code{group},
@code{hosts} y @code{services}, que designan las bases de datos NSS
correspondientes (@pxref{NSS Basics,,, libc, The GNU C Library Reference
Manual}).

@item @code{positive-time-to-live}
@itemx @code{negative-time-to-live} (predeterminado: @code{20})
Un número que representa el número de segundos durante los que una búsqueda
positiva o negativa permanece en la caché.

@item @code{check-files?} (predeterminado: @code{#t})
Si se comprobará en busca de actualizaciones los archivos que correspondan
con @var{database}.

Por ejemplo, cuando @var{database} es @code{hosts}, la activación de esta
opción instruye a nscd para comprobar actualizaciones en @file{/etc/hosts} y
tenerlas en cuenta.

@item @code{persistent?} (predeterminada: @code{#t})
Determina si la caché debe almacenarse de manera persistente en disco.

@item @code{shared?} (predeterminado: @code{#t})
Determina si la caché debe compartirse entre las usuarias.

@item @code{max-database-size} (predeterminado: 32@tie{}MiB)
Tamaño máximo en bytes de la caché de la base de datos.

@c XXX: 'suggested-size' and 'auto-propagate?' seem to be expert
@c settings, so leave them out.

@end table
@end deftp

@defvr {Variable Scheme} %nscd-default-caches
Lista de objetos @code{<nscd-cache>} usados por omisión por
@code{nscd-configuration} (véase en la sección previa)

Activa el almacenamiento en caché persistente y agresivo de búsquedas de
servicios y nombres de máquina. La última proporciona un mejor rendimiento
en la búsqueda de nombres de máquina, resilencia en caso de nombres de
servidor no confiables y también mejor privacidad---a menudo el resultado de
las búsquedas de nombres de máquina está en la caché local, por lo que
incluso ni es necesario consultar servidores de nombres externos.
@end defvr

@anchor{syslog-configuration-type}
@cindex syslog
@cindex logging
@deftp {Tipo de datos} syslog-configuration
Este tipo de datos representa la configuración del daemon syslog.

@table @asis
@item @code{syslogd} (predeterminado: @code{#~(string-append #$inetutils "/libexec/syslogd")})
El daemon syslog usado.

@item @code{config-file} (predeterminado: @code{%default-syslog.conf})
El archivo de configuración de syslog usado.

@end table
@end deftp

@anchor{syslog-service}
@cindex syslog
@deffn {Procedimiento Scheme} syslog-service @var{config}
Devuelve un servicio que ejecuta el daemon de syslog de acuerdo a
@var{config}.

@xref{syslogd invocation,,, inetutils, GNU Inetutils}, para más información
sobre la sintaxis del archivo de configuración.
@end deffn

@defvr {Variable Scheme} guix-service-type
El tipo de servicio que ejecuta el daemon de construcción,
@command{guix-daemon} (@pxref{Invocación de guix-daemon}). Su valor debe ser un
registro @code{guix-configuration} como se describe a continuación.
@end defvr

@anchor{guix-configuration-type}
@deftp {Tipo de datos} guix-configuration
Este tipo de datos representa la configuración del daemon de construcción de
Guix. @xref{Invocación de guix-daemon}, para más información.

@table @asis
@item @code{guix} (predeterminado: @var{guix})
El paquete Guix usado.

@item @code{build-group} (predeterminado: @code{"guixbuild"})
El nombre del grupo de las cuentas de usuarias de construcción.

@item @code{build-accounts} (predeterminadas: @code{10})
Número de cuentas de usuarias de construcción a crear.

@item @code{authorize-key?} (predeterminado: @code{#t})
@cindex sustituciones, autorización de las mismas
Whether to authorize the substitute keys listed in
@code{authorized-keys}---by default that of
@code{@value{SUBSTITUTE-SERVER-1}} and @code{@value{SUBSTITUTE-SERVER-2}}
(@pxref{Sustituciones}).

Cuando @code{authorize-key?} es verdadero, @file{/etc/guix/acl} no se puede
cambiar a través de @command{guix archive --authorize}. En vez de eso debe
ajustar @code{guix-configuration} como desee y reconfigurar el sistema. Esto
asegura que la configuración de su sistema operativo es auto-contenida.

@quotation Nota
Cuando arranque o reconfigure a un sistema donde @code{authorize-key?} sea
verdadero, se crea una copia de seguridad del archivo @file{/etc/guix/acl}
existente como @file{/etc/guix/acl.bak} si se determina que el archivo se ha
modificado de manera manual. Esto facilita la migración desde versiones
anteriores, en las que se permitían las modificaciones directas del archivo
@file{/etc/guix/acl}.
@end quotation

@vindex %default-authorized-guix-keys
@item @code{authorized-keys} (predeterminadas: @code{%default-authorized-guix-keys})
The list of authorized key files for archive imports, as a list of
string-valued gexps (@pxref{Invocación de guix archive}).  By default, it
contains that of @code{@value{SUBSTITUTE-SERVER-1}} and
@code{@value{SUBSTITUTE-SERVER-2}} (@pxref{Sustituciones}).  See
@code{substitute-urls} below for an example on how to change it.

@item @code{use-substitutes?} (predeterminado: @code{#t})
Determina si se usarán sustituciones.

@item @code{substitute-urls} (predeterminado: @code{%default-substitute-urls})
La lista de URLs donde se buscarán sustituciones por defecto.

Suppose you would like to fetch substitutes from @code{guix.example.org} in
addition to @code{@value{SUBSTITUTE-SERVER-1}}.  You will need to do two
things: (1) add @code{guix.example.org} to @code{substitute-urls}, and (2)
authorize its signing key, having done appropriate checks (@pxref{Autorización de servidores de sustituciones}).  The configuration below does exactly that:

@lisp
(guix-configuration
  (substitute-urls
   (append (list "https://guix.example.org")
           %default-substitute-urls))
  (authorized-keys
   (append (list (local-file "./guix.example.org-clave.pub"))
           %default-authorized-guix-keys)))
@end lisp

Este ejemplo asume que el archivo @file{./guix.example.org-clave.pub}
contiene la clave pública que @code{guix.example.org} usa para firmar las
sustituciones.

@item @code{generate-substitute-key?} (default: @code{#t})
Whether to generate a @dfn{substitute key pair} under
@file{/etc/guix/signing-key.pub} and @file{/etc/guix/signing-key.sec} if
there is not already one.

This key pair is used when exporting store items, for instance with
@command{guix publish} (@pxref{Invocación de guix publish}) or @command{guix
archive} (@pxref{Invocación de guix archive}).  Generating a key pair takes a few
seconds when enough entropy is available and is only done once; you might
want to turn it off for instance in a virtual machine that does not need it
and where the extra boot time is a problem.

@item @code{max-silent-time} (predeterminado: @code{0})
@itemx @code{timeout} (predeterminado: @code{0})
El número de segundos de silencio y el número de segundos de actividad
respectivamente, tras los cuales el proceso de construcción supera el
plazo. Un valor de cero proporciona plazos ilimitados.

@item @code{log-compression} (default: @code{'gzip})
El tipo de compresión usado en los log de construcción---o bien @code{gzip},
o bien @code{bzip2} o @code{none}.

@item @code{discover?} (default: @code{#f})
Whether to discover substitute servers on the local network using mDNS and
DNS-SD.

@item @code{extra-options} (predeterminadas: @code{'()})
Lista de opciones de línea de órdenes adicionales para
@command{guix-daemon}.

@item @code{log-file} (predeterminado: @code{"/var/log/guix-daemon.log"})
Archivo al que se escriben la salida estándar y la salida estándar de error
de @command{guix-daemon}.

@cindex HTTP, proxy para @code{guix-daemon}
@cindex proxy, para el acceso HTTP de @code{guix-daemon}
@item @code{http-proxy} (predeterminado: @code{#f})
La URL de los proxy HTTP y HTTPS que se usa para la descarga de derivaciones
de salida fija y sustituciones.

También es posible cambiar la pasarela del daemon en tiempo te ejecución con
la acción @code{set-http-proxy}, la cual lo reinicia:

@example
herd set-http-proxy guix-daemon http://localhost:8118
@end example

Para desactivar el uso actual de una pasarela ejecute:

@example
herd set-http-proxy guix-daemon
@end example

@item @code{tmpdir} (predeterminado: @code{#f})
Una ruta de directorio donde @command{guix-daemon} realiza las
construcciones.

@end table
@end deftp

@deftp {Data Type} guix-extension

This data type represents the parameters of the Guix build daemon that are
extendable. This is the type of the object that must be used within a guix
service extension.  @xref{Composición de servicios}, for more information.

@table @asis
@item @code{authorized-keys} (predeterminadas: @code{'()})
A list of file-like objects where each element contains a public key.

@item @code{substitute-urls} (default: @code{'()})
A list of strings where each element is a substitute URL.

@item @code{chroot-directories} (default: @code{'()})
A list of file-like objects or strings pointing to additional directories
the build daemon can use.
@end table
@end deftp

@deffn {Procedimiento Scheme} udev-service [#:udev @var{eudev} #:rules @code{'()}]
Ejecuta @var{udev}, que gestiona el contenido del directorio @file{/dev} de
forma dinámica. Se pueden proporcionar reglas de udev como una lista de
archivos a través de la variable @var{rules}. Los procedimientos
@code{udev-rule}, @code{udev-rules-service} y @code{file->udev-rule} de
@code{(gnu services base)} simplifican la creación de dichos archivos de
reglas.

The @command{herd rules udev} command, as root, returns the name of the
directory containing all the active udev rules.
@end deffn

@deffn {Procedimiento Scheme} udev-rule [@var{nombre-archivo} @var{contenido}]
Devuelve un archivo de reglas de udev con nombre @var{nombre-archivo} que
contiene las reglas definidas en el literal @var{contenido}.

En el ejemplo siguiente se define una regla para un dispositivo USB que será
almacenada en el archivo @file{90-usb-cosa.rules}. Esta regla ejecuta un
script cuando se detecta un dispositivo USB con un identificador de producto
dado.

@lisp
(define %regla-ejemplo-udev
  (udev-rule
    "90-usb-cosa.rules"
    (string-append "ACTION==\"add\", SUBSYSTEM==\"usb\", "
                   "ATTR@{product@}==\"Ejemplo\", "
                   "RUN+=\"/ruta/al/ejecutable\"")))
@end lisp
@end deffn

@deffn {Procedimiento Scheme} udev-rules-service [@var{nombre} @var{reglas}] @
               [#:groups @var{grupos}]
Devuelve un servicio que extiende @code{udev-service-type} con @var{reglas}
y @code{account-service-type} con @var{grupos} como grupos del sistema. Esto
funciona creando una instancia única del tipo de servicio
@code{@var{nombre}-udev-rules}, del cual el servicio devuelto es una
instancia.

A continuación se muestra cómo se puede usar para extender
@code{udev-service-type} con la regla  @code{%regla-ejemplo-udev} definida
previamente.

@lisp
(operating-system
 ;; @dots{}
 (services
   (cons (udev-rules-service 'usb-thing %regla-ejemplo-udev)
         %desktop-services)))
@end lisp
@end deffn

@deffn {Procedimiento Scheme} file->udev-rule [@var{nombre-archivo} @var{archivo}]
Devuelve un archivo de udev con nombre @var{nombre-archivo} que contiene las
reglas definidas en @var{archivo}, un objeto tipo-archivo.

El ejemplo siguiente muestra cómo podemos usar un archivo de reglas
existente.

@lisp
(use-modules (guix download)     ;para url-fetch
             (guix packages)     ;para origin
             @dots{})

(define %reglas-android-udev
  (file->udev-rule
    "51-android-udev.rules"
    (let ((version "20170910"))
      (origin
       (method url-fetch)
       (uri (string-append "https://raw.githubusercontent.com/M0Rf30/"
                           "android-udev-rules/" version "/51-android.rules"))
       (sha256
        (base32 "0lmmagpyb6xsq6zcr2w1cyx9qmjqmajkvrdbhjx32gqf1d9is003"))))))
@end lisp
@end deffn

Adicionalmente, las definiciones de paquete Gui pueden ser incluidas en
@var{rules} para extender las reglas udev con las definiciones encontradas
bajo su subdirectorio @file{lib/udev/rules.d}. En vez del ejemplo previo de
@var{file->udev-rule}, podíamos haber usado el paquete
@var{android-udev-rules} que existe en Guix en el módulo @code{(gnu packages
android)}.

El siguiente ejemplo muestra cómo usar el paquete @var{android-udev-rules}
para que la herramienta de Android @command{adb} pueda detectar dispositivos
sin privilegios de ``root''. También detalla como crear el grupo
@code{adbusers}, el cual se requiere para el funcionamiento correcto de las
reglas definidas dentro del paquete @code{android-udev-rules}. Para crear
tal grupo, debemos definirlo tanto como parte de @var{supplementary-groups}
de la declaración de nuestra cuenta de usuaria en @var{user-account}, así
como en el parámetro @var{groups} del procedimiento
@code{udev-rules-service}.

@lisp
(use-modules (gnu packages android)  ;para android-udev-rules
             (gnu system shadow)     ;para user-group
             @dots{})

(operating-system
  ;; @dots{}
  (users (cons (user-account
                ;; @dots{}
                (supplementary-groups
                 '("adbusers"   ;for adb
                   "wheel" "netdev" "audio" "video")))))
  ;; @dots{}
  (services
    (cons (udev-rules-service 'android android-udev-rules
                              #:groups '("adbusers"))
          %desktop-services)))
@end lisp

@defvr {Variable Scheme} urandom-seed-service-type
Almacena alguna entropía en @code{%random-seed-file} para alimentar
@file{/dev/urandom} cuando se reinicia. También intenta alimentar
@file{/dev/urandom} con @file{/dev/hwrng} durante el arranque, si
@file{/dev/hwrng} existe y se tienen permisos de lectura.
@end defvr

@defvr {Variable Scheme} %random-seed-file
Es el nombre del archivo donde algunos bytes aleatorios son almacenados por
el servicio @var{urandom-seed-service} para alimentar @file{/dev/urandom}
durante el reinicio. Su valor predeterminado es @file{/var/lib/random-seed}.
@end defvr

@cindex ratón
@cindex gpm
@defvr {Variable Scheme} gpm-service-type
Este es el tipo de servicio que ejecuta GPM, el @dfn{daemon de ratón de
propósito general}, que permite el uso del ratón en la consola Linux. GPM
permite a las usuarias el uso del ratón en la consola, notablemente la
selección, copia y pegado de texto.

El valor para servicios de este tipo debe ser un objeto
@code{gpm-configuration} (véase a continuación). Este servicio no es parte
de @code{%base-services}.
@end defvr

@deftp {Tipo de datos} gpm-configuration
Tipo de datos que representa la configuración de GPM.

@table @asis
@item @code{opciones} (predeterminadas: @code{%default-gpm-options})
Opciones de línea de órdenes proporcionadas a @command{gpm}. El conjunto
predeterminado de opciones instruye a @command{gpm} para esperar eventos de
ratón en @file{/dev/input/mice}. @xref{Command Line,,, gpm, gpm manual},
para más información.

@item @code{gpm} (predeterminado: @code{gpm})
El paquete GPM usado.

@end table
@end deftp

@anchor{guix-publish-service-type}
@deffn {Variable Scheme} guix-publish-service-type
Este es el tipo de servicio para @command{guix publish} (@pxref{Invocación de guix publish}). Su valor debe ser un objeto
@code{guix-publish-configuration}, como se describe a continuación.

Se asume que @file{/etc/guix} ya contiene el par de claves de firma como
@command{guix archive --generate-key} lo crea (@pxref{Invocación de guix archive}). Si no es el caso, el servicio fallará al arrancar.
@end deffn

@deftp {Tipo de datos} guix-publish-configuration
Tipo de datos que representa la configuración del servicio @code{guix
publish}.

@table @asis
@item @code{guix} (predeterminado: @code{guix})
El paquete Guix usado.

@item @code{port} (predeterminado: @code{80})
El puerto TCP en el que se esperan conexiones.

@item @code{host} (predeterminado: @code{"localhost"})
La dirección de red (y, por tanto, la interfaz de red) en la que se
esperarán conexiones. Use @code{"0.0.0.0"} para aceptar conexiones por todas
las interfaces de red.

@item @code{advertise?} (default: @code{#f})
When true, advertise the service on the local network @i{via} the DNS-SD
protocol, using Avahi.

This allows neighboring Guix devices with discovery on (see
@code{guix-configuration} above) to discover this @command{guix publish}
instance and to automatically download substitutes from it.

@item @code{compression} (default: @code{'(("gzip" 3) ("zstd" 3))})
Es una lista de tuplas método de compresión/nivel usadas para la compresión
de sustituciones. Por ejemplo, para comprimir todas las sustituciones
@emph{tanto con} lzip a nivel 8 @emph{como con} gzip a nivel 9, escriba:

@lisp
'(("lzip" 7) ("gzip" 9))
@end lisp

Level 9 achieves the best compression ratio at the expense of increased CPU
usage, whereas level 1 achieves fast compression.  @xref{Invocación de guix publish}, for more information on the available compression methods and the
tradeoffs involved.

Una lista vacía desactiva completamente la compresión.

@item @code{nar-path} (predeterminado: @code{"nar"})
La ruta URL de la que se pueden obtener ``nars''. @xref{Invocación de guix publish, @option{--nar-path}}, para más detalles.

@item @code{cache} (predeterminado: @code{#f})
Cuando es @code{#f}, desactiva la caché y genera los archivos bajo
demanda. De otro modo, debería ser el nombre de un directorio---por ejemplo,
@code{"/var/cache/guix/publish"}---donde @command{guix pubish} almacena los
archivos y metadatos en caché listos para ser enviados. @xref{Invocación de guix publish, @option{--cache}}, para más información sobre sus ventajas e
inconvenientes.

@item @code{workers} (predeterminado: @code{#f})
Cuando es un entero, es el número de hilos de trabajo usados para la caché;
cuando es @code{#f}, se usa el número de procesadores. @xref{Invocación de guix publish, @option{--workers}}, para más información.

@item @code{cache-bypass-threshold} (predeterminado: 10 MiB)
Cuando @code{cache} es verdadero, su valor indica el tamaño máximo en bytes
de un elemento del almacén hasta el cual @command{guix publish} puede
ignorar un fallo de caché y realizar la petición directamente.
@xref{Invocación de guix publish, @option{--cache-bypass-threshold}} para obtener
más información.

@item @code{ttl} (predeterminado: @code{#f})
Cuando es un entero, denota el @dfn{tiempo de vida} en segundos de los
archivos publicados. @xref{Invocación de guix publish, @option{--ttl}}, para más
información.

@item @code{negative-ttl} (default: @code{#f})
When it is an integer, this denotes the @dfn{time-to-live} in seconds for
the negative lookups.  @xref{Invocación de guix publish,
@option{--negative-ttl}}, for more information.
@end table
@end deftp

@anchor{rngd-service}
@deffn {Procedimiento Scheme} rngd-service [#:rng-tools @var{rng-tools}] @
            [#:device "/dev/hwrng"]
Devuelve un servicio que ejecuta el programa @command{rngd} de
@var{rng-tools} para añadir @var{device} a la fuente de entropía del
núcleo. El servicio emitirá un fallo si @var{device} no existe.
@end deffn

@anchor{pam-limits-service}
@cindex límites por sesión
@cindex ulimit
@cindex prioridad
@cindex tiempo real
@cindex jackd
@cindex nofile
@cindex open file descriptors
@deffn {Procedimiento Scheme} pam-limits-service [#:limits @code{'()}]

Return a service that installs a configuration file for the
@uref{http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html,
@code{pam_limits} module}.  The procedure optionally takes a list of
@code{pam-limits-entry} values, which can be used to specify @code{ulimit}
limits and @code{nice} priority limits to user sessions.

Las siguientes definiciones de límites establecen dos límites ``hard'' y
``soft'' para todas las sesiones de ingreso al sistema de usuarias
pertenecientes al grupo @code{realtime}:

@lisp
(pam-limits-service
 (list
  (pam-limits-entry "@@realtime" 'both 'rtprio 99)
  (pam-limits-entry "@@realtime" 'both 'memlock 'unlimited)))
@end lisp

La primera entrada incrementa la prioridad máxima de tiempo real para
procesos sin privilegios; la segunda entrada elimina cualquier restricción
sobre el espacio de direcciones que puede bloquearse en memoria. Estas
configuraciones se usan habitualmente para sistemas de sonido en tiempo
real.

Another useful example is raising the maximum number of open file
descriptors that can be used:

@lisp
(pam-limits-service
 (list
  (pam-limits-entry "*" 'both 'nofile 100000)))
@end lisp

In the above example, the asterisk means the limit should apply to any
user.  It is important to ensure the chosen value doesn't exceed the maximum
system value visible in the @file{/proc/sys/fs/file-max} file, else the
users would be prevented from login in.  For more information about the
Pluggable Authentication Module (PAM) limits, refer to the @samp{pam_limits}
man page from the @code{linux-pam} package.
@end deffn

@defvr {Scheme Variable} greetd-service-type
@uref{https://git.sr.ht/~kennylevinsen/greetd, @code{greetd}} is a minimal
and flexible login manager daemon, that makes no assumptions about what you
want to launch.

If you can run it from your shell in a TTY, greetd can start it. If it can
be taught to speak a simple JSON-based IPC protocol, then it can be a
geeter.

@code{greetd-service-type} provides necessary infrastructure for logging in
users, including:

@itemize @bullet
@item
@code{greetd} PAM service

@item
Special variation of @code{pam-mount} to mount @code{XDG_RUNTIME_DIR}
@end itemize

Here is example of switching from @code{mingetty-service-type} to
@code{greetd-service-type}, and how different terminals could be:

@lisp
  (append
   (modify-services %base-services
     ;; greetd-service-type provides "greetd" PAM service
     (delete login-service-type)
     ;; and can be used in place of mingetty-service-type
     (delete mingetty-service-type))
   (list
    (service greetd-service-type
             (greetd-configuration
              (terminals
               (list
                ;; we can make any terminal active by default
                (greetd-terminal-configuration (terminal-vt "1") (terminal-switch #t))
                ;; we can make environment without XDG_RUNTIME_DIR set
                ;; even provide our own environment variables
                (greetd-terminal-configuration
                 (terminal-vt "2")
                 (default-session-command
                   (greetd-agreety-session
                    (extra-env '(("MY_VAR" . "1")))
                    (xdg-env? #f))))
                ;; we can use different shell instead of default bash
                (greetd-terminal-configuration
                 (terminal-vt "3")
                 (default-session-command
                   (greetd-agreety-session (command (file-append zsh "/bin/zsh")))))
                ;; we can use any other executable command as greeter
                (greetd-terminal-configuration
                 (terminal-vt "4")
                 (default-session-command (program-file "my-noop-greeter" #~(exit))))
                (greetd-terminal-configuration (terminal-vt "5"))
                (greetd-terminal-configuration (terminal-vt "6"))))))
    ;; mingetty-service-type can be used in parallel
    ;; if needed to do so, do not (delete login-service-type)
    ;; as illustrated above
    #| (service mingetty-service-type (mingetty-configuration (tty "tty8"))) |#))
@end lisp
@end defvr

@deftp {Data Type} greetd-configuration
Configuration record for the @code{greetd-service-type}.
@table @asis

@item @code{motd}
Un objeto tipo-archivo que contiene el ``mensaje del día''.

@item @code{allow-empty-passwords?} (predeterminado: @code{#t})
Permite contraseñas vacías por defecto para que las primeras usuarias puedan
ingresar en el sistema cuando la cuenta de ``root'' está recién creada.

@item @code{terminals} (default: @code{'()})
List of @code{greetd-terminal-configuration} per terminal for which
@code{greetd} should be started.

@item @code{greeter-supplementary-groups} (default: @code{'()})
List of groups which should be added to @code{greeter} user. For instance:
@lisp
(greeter-supplementary-groups '("seat" "video"))
@end lisp
Note that this example will fail if @code{seat} group does not exist.
@end table
@end deftp

@deftp {Data Type} greetd-terminal-configuration
Configuration record for per terminal greetd daemon service.

@table @asis
@item @code{greetd} (default: @code{greetd})
The greetd package to use.

@item @code{config-file-name}
Configuration file name to use for greetd daemon. Generally, autogenerated
derivation based on @code{terminal-vt} value.

@item @code{log-file-name}
Log file name to use for greetd daemon. Generally, autogenerated name based
on @code{terminal-vt} value.

@item @code{terminal-vt} (default: @samp{"7"})
The VT to run on. Use of a specific VT with appropriate conflict avoidance
is recommended.

@item @code{terminal-switch} (default: @code{#f})
Make this terminal active on start of @code{greetd}.

@item @code{default-session-user} (default: @samp{"greeter"})
The user to use for running the greeter.

@item @code{default-session-command} (default: @code{(greetd-agreety-session)})
Can be either instance of @code{greetd-agreety-session} configuration or
@code{gexp->script} like object to use as greeter.

@end table
@end deftp

@deftp {Data Type} greetd-agreety-session
Configuration record for the agreety greetd greeter.

@table @asis
@item @code{agreety} (default: @code{greetd})
The package with @command{/bin/agreety} command.

@item @code{command} (default: @code{(file-append bash "/bin/bash")})
Command to be started by @command{/bin/agreety} on successful login.

@item @code{command-args} (default: @code{'("-l")})
Command arguments to pass to command.

@item @code{extra-env} (default: @code{'()})
Extra environment variables to set on login.

@item @code{xdg-env?} (default: @code{#t})
If true @code{XDG_RUNTIME_DIR} and @code{XDG_SESSION_TYPE} will be set
before starting command. One should note that, @code{extra-env} variables
are set right after mentioned variables, so that they can be overriden.

@end table
@end deftp

@deftp {Data Type} greetd-wlgreet-session
Generic configuration record for the wlgreet greetd greeter.

@table @asis
@item @code{wlgreet} (default: @code{wlgreet})
The package with the @command{/bin/wlgreet} command.

@item @code{command} (default: @code{(file-append sway "/bin/sway")})
Command to be started by @command{/bin/wlgreet} on successful login.

@item @code{command-args} (default: @code{'()})
Command arguments to pass to command.

@item @code{output-mode} (default: @code{"all"})
Option to use for @code{outputMode} in the TOML configuration file.

@item @code{scale} (default: @code{1})
Option to use for @code{scale} in the TOML configuration file.

@item @code{background} (default: @code{'(0 0 0 0.9)})
RGBA list to use as the background colour of the login prompt.

@item @code{headline} (default: @code{'(1 1 1 1)})
RGBA list to use as the headline colour of the UI popup.

@item @code{prompt} (default: @code{'(1 1 1 1)})
RGBA list to use as the prompt colour of the UI popup.

@item @code{prompt-error} (default: @code{'(1 1 1 1)})
RGBA list to use as the error colour of the UI popup.

@item @code{border} (default: @code{'(1 1 1 1)})
RGBA list to use as the border colour of the UI popup.

@item @code{extra-env} (default: @code{'()})
Extra environment variables to set on login.

@end table
@end deftp

@deftp {Data Type} greetd-wlgreet-sway-session
Sway-specific configuration record for the wlgreet greetd greeter.

@table @asis
@item @code{wlgreet-session} (default: @code{(greetd-wlgreet-session)})
A @code{greetd-wlgreet-session} record for generic wlgreet configuration, on
top of the Sway-specific @code{greetd-wlgreet-sway-session}.

@item @code{sway} (default: @code{sway})
The package providing the @command{/bin/sway} command.

@item @code{sway-configuration} (default: #f)
File-like object providing an additional Sway configuration file to be
prepended to the mandatory part of the configuration.

@end table

Here is an example of a greetd configuration that uses wlgreet and Sway:

@lisp
  (greetd-configuration
   ;; We need to give the greeter user these permissions, otherwise
   ;; Sway will crash on launch.
   (greeter-supplementary-groups (list "video" "input" "seat"))
   (terminals
    (list (greetd-terminal-configuration
           (terminal-vt "1")
           (terminal-switch #t)
           (default-session-command
            (greetd-wlgreet-sway-session
             (sway-configuration
              (local-file "sway-greetd.conf"))))))))
@end lisp
@end deftp

@node Ejecución de tareas programadas
@subsection Ejecución de tareas programadas

@cindex cron
@cindex mcron
@cindex planificación de trabajos
El módulo @code{(gnu services mcron)} proporciona una interfaz a
GNU@tie{}mcron, un daemon para ejecutar trabajos planificados de antemano
(@pxref{Top,,, mcron, GNU@tie{}mcron}). GNU@tie{}mcron es similar al daemon
tradicional de Unix @command{cron}; la principal diferencia es que está
implementado en Scheme Guile, que proporciona mucha flexibilidad cuando se
especifica la planificación de trabajos y sus acciones.

El siguiente ejemplo define un sistema operativo que ejecuta las órdenes
@command{updatedb} (@pxref{Invoking updatedb,,, find, Finding Files}) y
@command{guix gc} (@pxref{Invocación de guix gc}) de manera diaria, así como la
orden @command{mkid} como una usuaria sin privilegios (@pxref{mkid invocation,,, idutils, ID Database Utilitites}). Usa expresiones-g para
introducir definiciones de trabajos que serán proporcionados a mcron
(@pxref{Expresiones-G}).

@lisp
(use-modules (guix) (gnu) (gnu services mcron))
(use-package-modules base idutils)

(define updatedb-job
  ;; Run 'updatedb' at 3AM every day.  Here we write the
  ;; job's action as a Scheme procedure.
  #~(job '(next-hour '(3))
         (lambda ()
           (execl (string-append #$findutils "/bin/updatedb")
                  "updatedb"
                  "--prunepaths=/tmp /var/tmp /gnu/store"))
         "updatedb"))

(define trabajo-recolector-basura
  ;; Recolecta basura 5 minutos después de media noche,
  ;; todos los días. La acción del trabajo es una orden
  ;; del shell.
  #~(job "5 0 * * *"            ;sintaxis de Vixie cron
         "guix gc -F 1G"))

(define trabajo-idutils
  ;; Actualiza el índice de la base de datos como "carlos" a las
  ;; 12:15 y a las 19:15.  Esto se ejecuta desde su directorio.
  #~(job '(next-minute-from (next-hour '(12 19)) '(15))
         (string-append #$idutils "/bin/mkid src")
         #:user "carlos"))

(operating-system
  ;; @dots{}

  ;; %BASE-SERVICES already includes an instance of
  ;; 'mcron-service-type', which we extend with additional
  ;; jobs using 'simple-service'.
  (services (cons (simple-service 'my-cron-jobs
                                   mcron-service-type
                                   (list garbage-collector-job
                                         updatedb-job
                                         idutils-job))
                  %base-services)))
@end lisp

@quotation Tip
When providing the action of a job specification as a procedure, you should
provide an explicit name for the job via the optional 3rd argument as done
in the @code{updatedb-job} example above.  Otherwise, the job would appear
as ``Lambda function'' in the output of @command{herd schedule mcron}, which
is not nearly descriptive enough!
@end quotation

Para trabajos más complejos definidos en Scheme donde necesita control en el
ámbito global, por ejemplo para introducir una forma @code{use-modules},
puede mover su código a un programa separado usando el procedimiento
@code{program-file} del módulo @code{(guix gexp)}
(@pxref{Expresiones-G}). El siguiente ejemplo ilustra este caso.

@lisp
(define %tarea-alerta-bateria
  ;; Pita cuando la carga de la batería es inferior a %CARGA-MIN
  #~(job
     '(next-minute (range 0 60 1))
     #$(program-file
        "alerta-batería.scm"
        (with-imported-modules (source-module-closure
                                '((guix build utils)))
          #~(begin
              (use-modules (guix build utils)
                           (ice-9 popen)
                           (ice-9 regex)
                           (ice-9 textual-ports)
                           (srfi srfi-2))
              (define %carga-min 20)

              (setenv "LC_ALL" "C")     ;Procesado de cadenas en inglés
              (and-let* ((entrada (open-pipe*
                                   OPEN_READ
                                   #$(file-append acpi "/bin/acpi")))
                         (salida (get-string-all entrada))
                         (m (string-match "Discharging, ([0-9]+)%" output))
                         (carga (string->number (match:substring m 1)))
                         ((< carga %carga-min)))
                (setenv "LC_ALL" "")     ;Mensaje de salida traducido
                (format #t "aviso: La carga de la batería es baja (~a%)~%"
                        carga)
                (invoke #$(file-append beep "/bin/beep") "-r5")))))))
@end lisp

@xref{Guile Syntax, mcron job specifications,, mcron, GNU@tie{}mcron}, para
más información sobre las especificaciones de trabajos de mcron. A
continuación se encuentra la referencia del servicio mcron.

En un sistema en ejecución puede usar la acción @code{schedule} del servicio
para visualizar los siguientes trabajos mcron que se ejecutarán:

@example
# herd schedule mcron
@end example

@noindent
El ejemplo previo enumera las siguientes cinco tareas que se ejecutarán,
pero también puede especificar el número de tareas a mostrar:

@example
# herd schedule mcron 10
@end example

@defvr {Variable Scheme} mcron-service-type
Este es el tipo del servicio @code{mcron}, cuyo valor es un objeto
@code{mcron-configuration}.

This service type can be the target of a service extension that provides
additional job specifications (@pxref{Composición de servicios}).  In other
words, it is possible to define services that provide additional mcron jobs
to run.
@end defvr

@c Generated via (generate-documentation) at the bottom of (gnu services
@c mcron).
@c %start of fragment
@deftp {Tipo de datos} mcron-configuration
Available @code{mcron-configuration} fields are:

@table @asis
@item @code{mcron} (default: @code{mcron}) (type: file-like)
El paquete mcron usado.

@item @code{jobs} (default: @code{()}) (type: list-of-gexps)
This is a list of gexps (@pxref{Expresiones-G}), where each gexp corresponds
to an mcron job specification (@pxref{Syntax, mcron job specifications,,
mcron,GNU@tie{}mcron}).

@item @code{log?} (default: @code{#t}) (type: boolean)
Log messages to standard output.

@item @code{log-format} (default: @code{"~1@@*~a ~a: ~a~%"}) (type: string)
@code{(ice-9 format)} format string for log messages.  The default value
produces messages like "@samp{@var{pid} @var{name}: @var{message}"}
(@pxref{Invoking mcron, Invoking,, mcron,GNU@tie{}mcron}).  Each message is
also prefixed by a timestamp by GNU Shepherd.

@end table
@end deftp
@c %end of fragment

@node Rotación del registro de mensajes
@subsection Rotación del registro de mensajes

@cindex rottlog
@cindex rotación de logs
@cindex logging
Los archivos de registro como los encontrados en @file{/var/log} tienden a
crecer indefinidamente, de modo que es buena idea @dfn{llevar a cabo una
rotación} de vez en cuando---es decir, archivar su contenido en archivos
distintos, posiblemente comprimidos. El módulo @code{(gnu services admin)}
proporciona una interfaz con GNU@tie{}Rot[t]log, una herramienta de rotación
de registros (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}).

Este servicio es parte de @code{%base-services}, y por lo tanto se activa de
manera predeterminada, con la configuración predeterminada, para archivos de
registro que se pueden encontrar habitualmente. El siguiente ejemplo muestra
como extenderlo con una @dfn{rotación} adicional, en caso de que deba
hacerlo (habitualmente los servicios que producen archivos de registro ya lo
hacen ellos mismos):

@lisp
(use-modules (guix) (gnu))
(use-service-modules admin)

(define mis-archivos-de-registro
  ;; Archivos que deseo rotar.
  '("/var/log/un-archivo.log" "/var/log/otro.log"))

(operating-system
  ;; @dots{}
  (services (cons (simple-service 'rota-mis-cosas
                                  rottlog-service-type
                                  (list (log-rotation
                                         (frequency 'daily)
                                         (files mis-archivos-de-registro))))
                  %base-services)))
@end lisp

@defvr {Variable Scheme} rottlog-service-type
Este es el tipo del servicio Rottlog, cuyo valor es un objeto
@code{rottlog-configuration}.

Otros servicios pueden extenderlo con nuevos objetos @code{log-rotation}
(véase a continuación), aumentando de dicho modo el conjunto de archivos a
rotar.

Este servicio puede definir trabajos de mcron (@pxref{Ejecución de tareas programadas}) para ejecutar el servicio rottlog.
@end defvr

@deftp {Tipo de datos} rottlog-configuration
Tipo de datos que representa la configuración de rottlog.

@table @asis
@item @code{rottlog} (predeterminado: @code{rottlog})
El paquete Rottlog usado.

@item @code{rc-file} (predeterminado: @code{(file-append rottlog "/etc/rc")})
El archivo de configuración de Rottlog usado (@pxref{Mandatory RC Variables,,, rottlog, GNU Rot[t]log Manual}).

@item @code{rotations} (predeterminadas: @code{%default-rotations})
Una lista de objetos @code{log-rotation} como se define a continuación.

@item @code{jobs}
Esta es una lista de expresiones-G donde cada expresión-G corresponde a una
especificación de trabajo de mcron (@pxref{Ejecución de tareas programadas}).
@end table
@end deftp

@deftp {Tipo de datos} log-rotation
Tipo de datos que representa la rotación de un grupo de archivos de log.

Tomando el ejemplo del manual de Rottlog (@pxref{Period Related File Examples,,, rottlog, GNU Rot[t]log Manual}), una rotación de registros se
podría definir de esta manera:

@lisp
(log-rotation
  (frequency 'daily)
  (files '("/var/log/apache/*"))
  (options '("storedir apache-archives"
             "rotate 6"
             "notifempty"
             "nocompress")))
@end lisp

La lista de campos es como sigue:

@table @asis
@item @code{frequency} (predeterminada: @code{'weekly})
La frecuencia de rotación de logs, un símbolo.

@item @code{files}
La lista de archivos o patrones extendidos de archivo a rotar.

@vindex %default-log-rotation-options
@item @code{options} (default: @code{%default-log-rotation-options})
The list of rottlog options for this rotation (@pxref{Configuration parameters,,, rottlog, GNU Rot[t]log Manual}).

@item @code{post-rotate} (predeterminado: @code{#f})
O bien @code{#f}, o bien una expresión-G que se ejecutará una vez la
rotación se haya completado.
@end table
@end deftp

@defvr {Variable Scheme} %default-rotations
Especifica la rotación semanal de @code{%rotated-files} y de
@file{/var/log/guix-daemon.log}.
@end defvr

@defvr {Variable Scheme} %rotated-files
La lista de archivos controlados por syslog que deben ser rotados. De manera
predeterminada es @code{'("/var/log/messages" "/var/log/secure"
"/var/log/maillog")}.
@end defvr

Some log files just need to be deleted periodically once they are old,
without any other criterion and without any archival step.  This is the case
of build logs stored by @command{guix-daemon} under
@file{/var/log/guix/drvs} (@pxref{Invocación de guix-daemon}).  The
@code{log-cleanup} service addresses this use case.  For example,
@code{%base-services} (@pxref{Servicios base}) includes the following:

@lisp
;; Periodically delete old build logs.
(service log-cleanup-service-type
         (log-cleanup-configuration
          (directory "/var/log/guix/drvs")))
@end lisp

That ensures build logs do not accumulate endlessly.

@defvr {Scheme Variable} log-cleanup-service-type
This is the type of the service to delete old logs.  Its value must be a
@code{log-cleanup-configuration} record as described below.
@end defvr

@deftp {Data Type} log-cleanup-configuration
Data type representing the log cleanup configuration

@table @asis
@item @code{directory}
Name of the directory containing log files.

@item @code{expiry} (default: @code{(* 6 30 24 3600)})
Age in seconds after which a file is subject to deletion (six months by
default).

@item @code{schedule} (default: @code{"30 12 01,08,15,22 * *"})
String or gexp denoting the corresponding mcron job schedule
(@pxref{Ejecución de tareas programadas}).
@end table
@end deftp

@cindex logging, anonymization
@subheading Anonip Service

Anonip is a privacy filter that removes IP address from web server logs.
This service creates a FIFO and filters any written lines with anonip before
writing the filtered log to a target file.

The following example sets up the FIFO
@file{/var/run/anonip/https.access.log} and writes the filtered log file
@file{/var/log/anonip/https.access.log}.

@lisp
(service anonip-service-type
         (anonip-configuration
           (input  "/var/run/anonip/https.access.log")
           (output "/var/log/anonip/https.access.log")))
@end lisp

Configure your web server to write its logs to the FIFO at
@file{/var/run/anonip/https.access.log} and collect the anonymized log file
at @file{/var/web-logs/https.access.log}.

@deftp {Data Type} anonip-configuration
This data type represents the configuration of anonip.  It has the following
parameters:

@table @asis
@item @code{anonip} (default: @code{anonip})
The anonip package to use.

@item @code{input}
The file name of the input log file to process.  The service creates a FIFO
of this name.  The web server should write its logs to this FIFO.

@item @code{output}
The file name of the processed log file.
@end table

The following optional settings may be provided:

@table @asis
@item @code{skip-private?}
When @code{#true} do not mask addresses in private ranges.

@item @code{column}
A 1-based indexed column number.  Assume IP address is in the specified
column (default is 1).

@item @code{replacement}
Replacement string in case address parsing fails, e.g. @code{"0.0.0.0"}.

@item @code{ipv4mask}
Number of bits to mask in IPv4 addresses.

@item @code{ipv6mask}
Number of bits to mask in IPv6 addresses.

@item @code{increment}
Increment the IP address by the given number.  By default this is zero.

@item @code{delimiter}
Log delimiter string.

@item @code{regex}
Regular expression for detecting IP addresses.  Use this instead of
@code{column}.
@end table
@end deftp


@node Networking Setup
@subsection Networking Setup

The @code{(gnu services networking)} module provides services to configure
network interfaces and set up networking on your machine.  Those services
provide different ways for you to set up your machine: by declaring a static
network configuration, by running a Dynamic Host Configuration Protocol
(DHCP) client, or by running daemons such as NetworkManager and Connman that
automate the whole process, automatically adapt to connectivity changes, and
provide a high-level user interface.

On a laptop, NetworkManager and Connman are by far the most convenient
options, which is why the default desktop services include NetworkManager
(@pxref{Servicios de escritorio, @code{%desktop-services}}).  For a server, or for
a virtual machine or a container, static network configuration or a simple
DHCP client are often more appropriate.

This section describes the various network setup services available,
starting with static network configuration.

@defvr {Variable Scheme} static-networking-service-type
This is the type for statically-configured network interfaces.  Its value
must be a list of @code{static-networking} records.  Each of them declares a
set of @dfn{addresses}, @dfn{routes}, and @dfn{links}, as shown below.

@cindex network interface controller (NIC)
@cindex NIC, networking interface controller
Here is the simplest configuration, with only one network interface
controller (NIC) and only IPv4 connectivity:

@lisp
;; Static networking for one NIC, IPv4-only.
(service static-networking-service-type
         (list (static-networking
                (addresses
                 (list (network-address
                        (device "eno1")
                        (value "10.0.2.15/24"))))
                (routes
                 (list (network-route
                        (destination "default")
                        (gateway "10.0.2.2"))))
                (name-servers '("10.0.2.3")))))
@end lisp

The snippet above can be added to the @code{services} field of your
operating system configuration (@pxref{Uso de la configuración del sistema}).  It
will configure your machine to have 10.0.2.15 as its IP address, with a
24-bit netmask for the local network---meaning that any 10.0.2.@var{x}
address is on the local area network (LAN).  Traffic to addresses outside
the local network is routed @i{via} 10.0.2.2.  Host names are resolved by
sending domain name system (DNS) queries to 10.0.2.3.
@end defvr

@deftp {Data Type} static-networking
This is the data type representing a static network configuration.

As an example, here is how you would declare the configuration of a machine
with a single network interface controller (NIC) available as @code{eno1},
and with one IPv4 and one IPv6 address:

@lisp
;; Network configuration for one NIC, IPv4 + IPv6.
(static-networking
 (addresses (list (network-address
                   (device "eno1")
                   (value "10.0.2.15/24"))
                  (network-address
                   (device "eno1")
                   (value "2001:123:4567:101::1/64"))))
 (routes (list (network-route
                (destination "default")
                (gateway "10.0.2.2"))
               (network-route
                (destination "default")
                (gateway "2020:321:4567:42::1"))))
 (name-servers '("10.0.2.3")))
@end lisp

If you are familiar with the @command{ip} command of the
@uref{https://wiki.linuxfoundation.org/networking/iproute2, @code{iproute2}
package} found on Linux-based systems, the declaration above is equivalent
to typing:

@example
ip address add 10.0.2.15/24 dev eno1
ip address add 2001:123:4567:101::1/64 dev eno1
ip route add default via inet 10.0.2.2
ip route add default via inet6 2020:321:4567:42::1
@end example

Run @command{man 8 ip} for more info.  Venerable GNU/Linux users will
certainly know how to do it with @command{ifconfig} and @command{route}, but
we'll spare you that.

The available fields of this data type are as follows:

@table @asis
@item @code{addresses}
@itemx @code{links} (default: @code{'()})
@itemx @code{routes} (default: @code{'()})
The list of @code{network-address}, @code{network-link}, and
@code{network-route} records for this network (see below).

@item @code{name-servers} (default: @code{'()})
The list of IP addresses (strings) of domain name servers.  These IP
addresses go to @file{/etc/resolv.conf}.

@item @code{provision} (default: @code{'(networking)})
If true, this should be a list of symbols for the Shepherd service
corresponding to this network configuration.

@item @code{requirement} (default @code{'()})
The list of Shepherd services depended on.
@end table
@end deftp

@deftp {Data Type} network-address
This is the data type representing the IP address of a network interface.

@table @code
@item device
The name of the network interface for this address---e.g., @code{"eno1"}.

@item value
The actual IP address and network mask, in
@uref{https://en.wikipedia.org/wiki/CIDR#CIDR_notation, @acronym{CIDR,
Classless Inter-Domain Routing} notation}, as a string.

For example, @code{"10.0.2.15/24"} denotes IPv4 address 10.0.2.15 on a
24-bit sub-network---all 10.0.2.@var{x} addresses are on the same local
network.

@item ipv6?
Whether @code{value} denotes an IPv6 address.  By default this is
automatically determined.
@end table
@end deftp

@deftp {Data Type} network-route
This is the data type representing a network route.

@table @asis
@item @code{destination}
The route destination (a string), either an IP address and network mask or
@code{"default"} to denote the default route.

@item @code{source} (default: @code{#f})
The route source.

@item @code{device} (predeterminado: @code{#f})
The device used for this route---e.g., @code{"eno2"}.

@item @code{ipv6?} (default: auto)
Whether this is an IPv6 route.  By default this is automatically determined
based on @code{destination} or @code{gateway}.

@item @code{gateway} (default: @code{#f})
IP address (a string) through which traffic is routed.
@end table
@end deftp

@deftp {Data Type} network-link
Data type for a network link (@pxref{Link,,, guile-netlink, Guile-Netlink
Manual}).

@table @code
@item name
The name of the link---e.g., @code{"v0p0"}.

@item type
A symbol denoting the type of the link---e.g., @code{'veth}.

@item arguments
List of arguments for this type of link.
@end table
@end deftp

@cindex loopback device
@defvr {Scheme Variable} %loopback-static-networking
This is the @code{static-networking} record representing the ``loopback
device'', @code{lo}, for IP addresses 127.0.0.1 and ::1, and providing the
@code{loopback} Shepherd service.
@end defvr

@cindex networking, with QEMU
@cindex QEMU, networking
@defvr {Scheme Variable} %qemu-static-networking
This is the @code{static-networking} record representing network setup when
using QEMU's user-mode network stack on @code{eth0} (@pxref{Using the user mode network stack,,, QEMU, QEMU Documentation}).
@end defvr

@cindex DHCP, servicio de red
@defvr {Variable Scheme} dhcp-client-service-type
This is the type of services that run @var{dhcp}, a Dynamic Host
Configuration Protocol (DHCP) client.
@end defvr

@deftp {Data Type} dhcp-client-configuration
Data type representing the configuration of the DHCP client service.

@table @asis
@item @code{package} (predeterminado: @code{isc-dhcp})
DHCP client package to use.

@item @code{interfaces} (default: @code{'all})
Either @code{'all} or the list of interface names that the DHCP client
should listen on---e.g., @code{'("eno1")}.

When set to @code{'all}, the DHCP client listens on all the available
non-loopback interfaces that can be activated.  Otherwise the DHCP client
listens only on the specified interfaces.
@end table
@end deftp

@cindex NetworkManager

@defvr {Variable Scheme} network-manager-service-type
Este es el tipo de servicio para el servicio
@uref{https://wiki.gnome.org/Projects/NetworkManager, NetworkManager}. El
valor para este tipo de servicio es un registro
@code{network-manager-configuration}.

Este servicio es parte de @code{%desktop-services} (@pxref{Servicios de escritorio}).
@end defvr

@deftp {Tipo de datos} network-manager-configuration
Tipo de datos que representa la configuración de NetworkManager.

@table @asis
@item @code{network-manager} (predeterminado: @code{network-manager})
El paquete de NetworkManager usado.

@item @code{dns} (predeterminado: @code{"default"})
Modo de procesamiento para DNS, que afecta la manera en la que
NetworkManager usa el archivo de configuración @code{resolv.conf}.

@table @samp
@item default
NetworkManager actualizará @code{resolv.conf} para reflejar los servidores
de nombres proporcionados por las conexiones activas actualmente.

@item dnsmasq
NetworkManager ejecutará @code{dnsmasq} como una caché local del servicio de
nombres, mediante un @dfn{reenvío condicional} si se encuentra conectada a
una VPN, y actualiza posteriormente @code{resolv.conf} para apuntar al
servidor de nombres local.

Con esta configuración puede compartir su conexión de red. Por ejemplo,
cuando desee compartir su conexión de red a otro equipo a través de un cable
Ethernet, puede abrir @command{nm-connection-editor} y configurar el método
de la conexión cableada para IPv4 y IPv6 ``Compartida con otros equipos'' y
restablecer la conexión (o reiniciar).

También puede configurar una @dfn{conexión anfitrión-invitado} a las
máquinas virtuales de QEMU (@pxref{Instalación de Guix en una máquina virtual}).  Con una
conexión anfitrión-invitado puede, por ejemplo, acceder a un servidor web
que se ejecute en la máquina virtual (@pxref{Servicios Web}) desde un
navegador web en su sistema anfitrión, o conectarse a la máquina virtual a
través de SSH (@pxref{Servicios de red,
@code{openssh-service-type}}). Para configurar una conexión
anfitrión-invitado, ejecute esta orden una única vez:

@example
nmcli connection add type tun \
 connection.interface-name tap0 \
 tun.mode tap tun.owner $(id -u) \
 ipv4.method shared \
 ipv4.addresses 172.28.112.1/24
@end example

Cada vez que arranque su máquina virtual de QEMU (@pxref{Ejecutar Guix en una máquina virtual}), proporcione @option{-nic tap,ifname=tap0,script=no,downscript=no} a
@command{qemu-system-...}.

@item none
NetworkManager no modificará @code{resolv.conf}.
@end table

@item @code{vpn-plugins} (predeterminados: @code{'()})
Esta es la lista de módulos disponibles para redes privadas virtuales
(VPN). Un ejemplo es el paquete @code{network-manager-openvpn}, que permite
a NetworkManager la gestión de redes VPN a través de OpenVPN.

@end table
@end deftp

@cindex Connman
@deffn {Variable Scheme} connman-service-type
Este es el tipo de servicio para la ejecución de
@url{https://01.org.connman,Connman}, un gestor de conexiones de red.

Su valor debe ser un registro @code{connman-configuration} como en este
ejemplo:

@lisp
(service connman-service-type
         (connman-configuration
           (disable-vpn? #t)))
@end lisp

Véase a continuación más detalles sobre @code{connman-configuration}.
@end deffn

@deftp {Tipo de datos} connman-configuration
Tipo de datos que representa la configuración de connman.

@table @asis
@item @code{connman} (predeterminado: @var{connman})
El paquete connman usado.

@item @code{disable-vpn?} (predeterminado: @code{#f})
Cuando es verdadero, desactiva el módulo vpn de connman.
@end table
@end deftp

@cindex WPA Supplicant
@defvr {Variable Scheme} wpa-supplicant-service-type
Este es el tipo de servicio para la ejecución de
@url{https://w1.fi/wpa_supplicant/,WPA supplicant}, un daemon de
identificación necesario para la identificación en redes WiFi o ethernet
cifradas.
@end defvr

@deftp {Tipo de datos} wpa-supplicant-configuration
Tipo de datos que representa la configuración de WPA Supplicant.

Toma los siguientes parámetros:

@table @asis
@item @code{wpa-supplicant} (predeterminado: @code{wpa-supplicant})
El paquete de WPA Supplicant usado.

@item @code{requirement} (predeterminados: @code{'(user-processes loopback syslogd)}
Lista de servicios que deben iniciarse antes del arranque de WPA Supplicant.

@item @code{dbus?} (predeterminado: @code{#t})
Si se escuchan o no peticiones en D-Bus.

@item @code{pid-file} (predeterminado: @code{"/var/run/wpa_supplicant.pid"})
Dónde se almacena el archivo con el PID.

@item @code{interface} (predeterminado: @code{#f})
En caso de proporcionarse un valor, debe especificar el nombre de la
interfaz de red que WPA supplicant controlará.

@item @code{config-file} (predeterminado: @code{#f})
Archivo de configuración opcional usado.

@item @code{extra-options} (predeterminadas: @code{'()})
Lista de parámetros adicionales a pasar al daemon en la línea de órdenes.
@end table
@end deftp

@cindex ModemManager
Some networking devices such as modems require special care, and this is
what the services below focus on.

@defvr {Variable Scheme} modem-manager-service-type
This is the service type for the
@uref{https://wiki.gnome.org/Projects/ModemManager, ModemManager} service.
The value for this service type is a @code{modem-manager-configuration}
record.

Este servicio es parte de @code{%desktop-services} (@pxref{Servicios de escritorio}).
@end defvr

@deftp {Tipo de datos} modem-manager-configuration
Tipo de datos que representa la configuración de ModemManager.

@table @asis
@item @code{modem-manager} (predeterminado: @code{modem-manager})
El paquete de ModemManager usado.

@end table
@end deftp

@cindex USB_ModeSwitch
@cindex Cambio de modo (modeswitch)

@defvr {Variable Scheme} usb-modeswitch-service-type
This is the service type for the
@uref{https://www.draisberghof.de/usb_modeswitch/, USB_ModeSwitch} service.
The value for this service type is a @code{usb-modeswitch-configuration}
record.

Cuando se conectan, algunos modem USB (y otros dispositivos USB) se
presentan inicialmente como medios de almacenamiento de sólo-lectura y no
como un modem. Deben @dfn{cambiar de modo} antes de poder usarse. El tipo de
servicio USB_ModeSwitch instala reglas de udev para cambiar automáticamente
de modo cuando se conecten estos dispositivos.

Este servicio es parte de @code{%desktop-services} (@pxref{Servicios de escritorio}).
@end defvr

@deftp {Tipo de datos} usb-modeswitch-configuration
Tipo de datos que representa la configuración de USB_ModeSwitch.

@table @asis
@item @code{usb-modeswitch} (predeterminado: @code{usb-modeswitch})
El paquete USB_ModeSwitch que proporciona los binarios para el cambio de
modo.

@item @code{usb-modeswitch-data} (predeterminado: @code{usb-modeswitch-data})
El paquete que proporciona los datos de dispositivos y las reglas de udev
usadas por USB_ModeSwitch.

@item @code{config-file} (predeterminado: @code{#~(string-append #$usb-modeswitch:dispatcher "/etc/usb_modeswitch.conf")})
Archivo de configuración usado para el gestor de eventos (dispatcher) de
USB_ModeSwitch. De manera predeterminada se usa el archivo que viene con
USB_ModeSwitch, que deshabilita el registro en @file{/var/log} junto a otras
configuraciones. Si se proporciona @code{#f} no se usa ningún archivo de
configuración. 

@end table
@end deftp


@node Servicios de red
@subsection Servicios de red

The @code{(gnu services networking)} module discussed in the previous
section provides services for more advanced setups: providing a DHCP service
for others to use, filtering packets with iptables or nftables, running a
WiFi access point with @command{hostapd}, running the @command{inetd}
``superdaemon'', and more.  This section describes those.

@deffn {Procedimiento Scheme} dhcpd-service-type
Este tipo define un servicio que ejecuta el daemon DHCP. Para crear un
servicio de este tipo debe proporcionar un objeto
@code{<dhcpd-configuration>}. Por ejemplo:

@lisp
(service dhcpd-service-type
         (dhcpd-configuration
          (config-file (local-file "mi-dhcpd.conf"))
          (interfaces '("enp0s25"))))
@end lisp
@end deffn

@deftp {Tipo de datos} dhcpd-configuration
@table @asis
@item @code{package} (predeterminado: @code{isc-dhcp})
The package that provides the DHCP daemon.  This package is expected to
provide the daemon at @file{sbin/dhcpd} relative to its output directory.
The default package is the @uref{https://www.isc.org/dhcp/, ISC's DHCP
server}.
@item @code{config-file} (predeterminado: @code{#f})
El archivo de configuración usado. Esta opción es necesaria. Se le
proporcionará a @code{dhcpd} a través de su opción @code{-cf}. Puede ser
cualquier objeto ``tipo-archivo'' (@pxref{Expresiones-G, objetos
``tipo-archivo''}). Véase @code{man dhcpd.conf} para detalles sobre la
sintaxis del archivo de configuración.
@item @code{version} (predeterminada: @code{"4"})
La versión DHCP usada. El servidor DHCP de ISC permite los valores ``4'',
``6'' y ``4o6''. Corresponden con las opciones @code{-4}, @code{-6} y
@code{-4o6} del programa @code{dhcpd}. Véase @code{man dhcpd} para más
detalles.
@item @code{run-directory} (predeterminado: @code{"/run/dhcpd"})
El directorio de ejecución usado. Durante la activación del servicio se
creará en caso de no existir.
@item @code{pid-file} (predeterminado: @code{"/run/dhcpd/dhcpd.pid"})
El archivo de PID usado. Corresponde con la opción @code{-pf} de
@code{dhcpd}. Véase @code{man dhcpd} para más detalles.
@item @code{interfaces} (predeterminadas: @code{'()})
Los nombres de las interfaces de red en las que dhcpd debería esperar
retransmisiones. Si la lista no está vacía, entonces sus elementos (que
deben ser cadenas) se añadirá a la invocación de @code{dhcpd} cuando se
inicie el daemon. Puede no ser necesaria la especificación explícita aquí de
ninguna interfaz; véase @code{man dhcpd} para más detalles.
@end table
@end deftp

@cindex hostapd, servicio para puntos de acceso inalámbricos
@cindex puntos de acceso inalámbricos, servicio hostapd
@defvr {Variable Scheme} hostapd-service-type
Este es el tipo de servicio que ejecuta el daemon
@uref{https://w1.fi/hostapd/, hostapd} para configurar puntos de acceso WiFi
(IEEE 802.11) y servidores de identificación. Su valor debe ser un registro
@code{hostapd-configuration} como en este ejemplo:

@lisp
;; Use wlan1 para ejecutar el punto de acceso para "Mi red".
(service hostapd-service-type
         (hostapd-configuration
          (interface "wlan1")
          (ssid "Mi red")
          (channel 12)))
@end lisp
@end defvr

@deftp {Tipo de datos} hostapd-configuration
Este tipo de datos representa la configuración del servicio hostapd, y tiene
los siguientes campos:

@table @asis
@item @code{package} (predeterminado: @code{hostapd})
El paquete hostapd usado.

@item @code{interface} (predeterminado: @code{"wlan0"})
La interfaz de red en la que se establece el punto de acceso WiFi.

@item @code{ssid}
El SSID (@dfn{identificador del servicio}, del inglés ``service set
identifier''), una cadena que identifica esta red.

@item @code{broadcast-ssid?} (predeterminado: @code{#t})
Determina si se emite este SSID.

@item @code{channel} (predeterminado: @code{1})
El canal WiFi usado.

@item @code{driver} (predeterminado: @code{"nl80211"})
El tipo de controlador de la interfaz.  @code{"nl80211"} se usa con todos
los controladores de mac80211 de Linux. Use @code{"none"} si está
construyendo hostapd como un servidor RADIUS independiente que no controla
ningún controlador de red cableada o inalámbrica.

@item @code{extra-settings} (predeterminado: @code{""})
Configuración adicional que se añade literalmente al archivo de
configuración de hostapd. Véase
@uref{https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf} para la
referencia del archivo de configuración.
@end table
@end deftp

@defvr {Variable Scheme} simulated-wifi-service-type
Tipo de servicio que simula una red inalámbrica (``WiFi''), lo que puede ser
útil en máquinas virtuales para realizar pruebas. El servicio carga el
@uref{https://www.kernel.org/doc/html/latest/networking/mac80211_hwsim/mac80211_hwsim.html,
módulo @code{mac80211_hwsim}} del núcleo Linux e inicia hostapd para crear
una red inalámbrica virtual que puede verse en @code{wlan0}, de manera
predeterminada.

El valor de este servicio es un registro @code{hostapd-configuration}.
@end defvr


@cindex iptables
@defvr {Variable Scheme} iptables-service-type
Este es el tipo de servicio para la aplicación de configuración de
iptables. iptables es un entorno de trabajo para el filtrado de paquetes
implementado por el núcleo Linux. Este servicio permite la configuración de
iptables tanto para IPv4 como IPv6. Un ejemplo simple de cómo rechazar todas
las conexiones entrantes excepto aquellas al puerto 22 de ssh se muestra a
continuación.

@lisp
(service iptables-service-type
         (iptables-configuration
          (ipv4-rules (plain-file "iptables.rules" "*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT
"))
          (ipv6-rules (plain-file "ip6tables.rules" "*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
COMMIT
"))))
@end lisp
@end defvr

@deftp {Tipo de datos} iptables-configuration
El tipo de datos que representa la configuración de iptables.

@table @asis
@item @code{iptables} (predeterminado: @code{iptables})
El paquete iptables que proporciona @code{iptables-restore} y
@code{ip6tables-restore}.
@item @code{ipv4-rules} (predeterminado: @code{%iptables-accept-all-rules})
Las reglas de iptables usadas. Se le proporcionarán a
@code{iptables-restore}. Puede ser cualquier objeto ``tipo-archivo''
(@pxref{Expresiones-G, objetos ``tipo-archivo''}).
@item @code{ipv6-rules} (predeterminadas: @code{%iptables-accept-all-rules})
Las reglas de ip6tables usadas. Se le proporcionarán a
@code{ip6tables-restore}. Puede ser cualquier objeto ``tipo-archivo''
(@pxref{Expresiones-G, objetos ``tipo-archivo''}).
@end table
@end deftp

@cindex nftables
@defvr {Variable Scheme} nftables-service-type
This is the service type to set up a nftables configuration.  nftables is a
netfilter project that aims to replace the existing iptables, ip6tables,
arptables and ebtables framework.  It provides a new packet filtering
framework, a new user-space utility @command{nft}, and a compatibility layer
for iptables.  This service comes with a default ruleset
@code{%default-nftables-ruleset} that rejecting all incoming connections
except those to the ssh port 22.  To use it, simply write:

@lisp
(service nftables-service-type)
@end lisp
@end defvr

@deftp {Tipo de datos} nftables-configuration
El tipo de datos que representa la configuración de nftables.

@table @asis
@item @code{package} (predeterminado: @code{nftables})
El paquete nftables que proporciona @command{nft}.
@item @code{ruleset} (predeterminados: @code{%default-nftables-ruleset})
El conjunto de reglas de nftables usado. Puede ser cualquier objeto
``tipo-archivo'' (@pxref{Expresiones-G, objetos ``tipo-archivo''}).
@end table
@end deftp

@cindex NTP (protocolo de tiempo de red), servicio
@cindex ntpd, servicio para el daemon del protocolo de tiempo de red NTP
@cindex reloj de tiempo real
@defvr {Variable Scheme} ntp-service-type
Este es el tipo del servicio que ejecuta el daemon del
@uref{https://www.ntp.org, protocolo de tiempo en red (NTP)},
@command{ntpd}. El daemon mantendrá el reloj del sistema sincronizado con el
de los servidores NTP especificados.

El valor de este servicio es un objeto @code{ntpd-configuration}, como se
describe a continuación.
@end defvr

@deftp {Tipo de datos} ntp-configuration
Este es el tipo de datos para la configuración del servicio NTP.

@table @asis
@item @code{servers} (predeterminados: @code{%ntp-servers})
La lista de servidores (registros @code{<ntp-server>}) con los que la
herramienta @command{ntpd} se sincronizará. Véase la información sobre el
tipo de datos @code{ntp-server} a continuación.

@item @code{allow-large-adjustment?} (predeterminado: @code{#t})
Esto determina si se le permite a @command{ntpd} realizar un ajuste inicial
de más de 1000 segundos.

@item @code{ntp} (predeterminado: @code{ntp})
El paquete NTP usado.
@end table
@end deftp

@defvr {Variable Scheme} %ntp-servers
Lista de nombres de máquinas usadas como servidores NTP predeterminados. Son
servidores del @uref{https://www.ntppool.org/en/, NTP Pool Project}.
@end defvr

@deftp {Tipo de datos} ntp-server
Tipo de datos que representa la configuración de un servidor NTP.

@table @asis
@item @code{type} (predeterminado: @code{'server})
The type of the NTP server, given as a symbol.  One of @code{'pool},
@code{'server}, @code{'peer}, @code{'broadcast} or @code{'manycastclient}.

@item @code{address}
La dirección del servidor, como una cadena.

@item @code{options}
NTPD options to use with that specific server, given as a list of option
names and/or of option names and values tuples.  The following example
define a server to use with the options @option{iburst} and @option{prefer},
as well as @option{version} 3 and a @option{maxpoll} time of 16 seconds.

@example
(ntp-server
 (type 'server)
 (address "miservidor.ntp.server.org")
 (options `(iburst (version 3) (maxpoll 16) prefer))))
@end example
@end table
@end deftp

@cindex OpenNTPD
@deffn {Procedimiento Scheme} openntpd-service-type
Ejecuta @command{ntpd}, el daemon del protocolo de tiempo en red (NTP),
implementado por @uref{http://www.openntpd.org, OpenNTPD}. El daemon
mantendrá el reloj del sistema sincronizado con el de los servidores
proporcionados.

@lisp
(service
 openntpd-service-type
 (openntpd-configuration
  (listen-on '("127.0.0.1" "::1"))
  (sensor '("udcf0 correction 70000"))
  (constraint-from '("www.gnu.org"))
  (constraints-from '("https://www.google.com/"))))

@end lisp
@end deffn

@defvr {Variable Scheme} %openntpd-servers
Esta variable es una lista de las direcciones de servidores definidos en
@code{%ntp-servers}.
@end defvr

@deftp {Tipo de datos} openntpd-configuration
@table @asis
@item @code{openntpd} (predeterminado: @code{(file-append openntpd "/sbin/ntpd")})
El ejecutable openntpd usado.
@item @code{listen-on} (predeterminadas: @code{'("127.0.0.1" "::1")})
Una lista de direcciones IP o nombres de máquina en los que el daemon ntpd
debe escuchar conexiones.
@item @code{query-from} (predeterminadas: @code{'()})
Una lista de direcciones IP locales que el daemon ntpd debe usar para
consultas salientes.
@item @code{sensor} (predeterminados: @code{'()})
Especifica una lista de dispositivos de sensores de tiempo de ntpd debería
usar. @code{ntpd} escuchará cada sensor que realmente exista e ignora los
que no. Véase la @uref{https://man.openbsd.org/ntpd.conf, documentación de
las desarrolladoras originales} para más información.
@item @code{server} (predeterminado: @code{'()})
Especifica una lista de direcciones IP o nombres de máquina de servidores
NTP con los que sincronizarse.
@item @code{servers} (predeterminada: @code{%openntp-servers})
Una lista de direcciones IP o nombres de máquina con los que el daemon ntpd
se debe sincronizar.
@item @code{constraint-from} (predeterminado: @code{'()})
@code{ntpd} puede configurarse para que solicite la fecha a través del campo
``Date'' de servidores HTTPS en los que se confíe a través de TLS. Esta
información de tiempo no se usa por precisión pero actúa como una condición
verificada, por tanto reduciendo el impacto de ataques mediante la
intervención del tráfico con servidores NTP no verificados. Especifica una
lista de URL, direcciones IP o nombres de máquina de servidores HTTPS que
proporcionarán la condición.
@item @code{constraints-from} (predeterminadas: @code{'()})
Como en @var{constraint-from}, proporciona una lista de URL, direcciones IP
o nombres de máquina de servidores HTTP para proporcionar la condición. En
caso de que el nombre de máquina resuelva en múltiples direcciones IP,
@code{ntpd} calculará la condición mediana de todas ellas.
@end table
@end deftp

@cindex inetd
@deffn {Variable Scheme} inetd-service-type
Este servicio ejecuta el daemon @command{inetd} (@pxref{inetd invocation,,,
inetutils, GNU Inetutils}). @command{inetd} escucha conexiones en sockets de
internet, e inicia bajo demanda el programa servidor cuando se realiza una
conexión en uno de esos sockets.

El valor de este servicio es un objeto @code{inetd-configuration}. El
ejemplo siguiente configura el daemon @command{inetd} para proporcionar el
servicio @command{echo} implementado por él mismo, así como un servicio smtp
que reenvía el tráfico smtp por ssh a un servidor @code{servidor-smtp} tras
la pasarela @code{máquina}:

@lisp
(service
 inetd-service-type
 (inetd-configuration
  (entries (list
            (inetd-entry
             (name "echo")
             (socket-type 'stream)
             (protocol "tcp")
             (wait? #f)
             (user "root"))
            (inetd-entry
             (node "127.0.0.1")
             (name "smtp")
             (socket-type 'stream)
             (protocol "tcp")
             (wait? #f)
             (user "root")
             (program (file-append openssh "/bin/ssh"))
             (arguments
              '("ssh" "-qT" "-i" "/ruta/de/la/clave_ssh"
                "-W" "servidor-smtp:25" "usuaria@@maquina")))))))
@end lisp

A continuación se proporcionan más detalles acerca de
@code{inetd-configuration}.
@end deffn

@deftp {Tipo de datos} inetd-configuration
Tipo de datos que representa la configuración de @command{inetd}.

@table @asis
@item @code{program} (predeterminado: @code{(file-append inetutils "/libexec/inetd")})
El ejecutable @command{inetd} usado.

@item @code{entries} (predeterminadas: @code{'()})
Una lista de entradas de servicio de @command{inetd}. Cada entrada debe
crearse con el constructor @code{inted-entry}.
@end table
@end deftp

@deftp {Tipo de datos} inetd-entry
Tipo de datos que representa una entrada en la configuración de
@command{inetd}. Cada entrada corresponde a un socket en el que
@command{inetd} escuchará a la espera de peticiones.

@table @asis
@item @code{node} (predeterminado: @code{#f})
Cadena opcional, una lista separada por comas de direcciones locales que
@command{inetd} debería usar cuando se escuche para este
servicio. @xref{Configuration file,,, inetutils, GNU Inetutils} para una
descripción completa de todas las opciones.
@item @code{name}
Una cadena, el nombre debe corresponder con una entrada en
@code{/etc/services}.
@item @code{socket-type}
Puede ser @code{'stream}, @code{'dgram}, @code{'raw}, @code{'rdm} o
@code{'seqpacket}.
@item @code{protocol}
Una cadena, debe corresponder con una entrada en @code{/etc/protocols}.
@item @code{wait?} (predeterminado: @code{#t})
Si @command{inetd} debe esperar la salida del servidor antes de reiniciar la
escucha de nuevas peticiones de servicio.
@item @code{user}
Una cadena que contiene el nombre (y, opcionalmente, el grupo) de la usuaria
como la que se deberá ejecutar el servidor. El nombe de grupo se puede
especificar en un sufijo, separado por dos puntos o un punto normal, es
decir @code{"usuaria"}, @code{"usuaria:grupo"} o @code{"usuaria.grupo"}.
@item @code{program} (predeterminado: @code{"internal"})
El programa servidor que recibirá las peticiones, o @code{"internal"} si
@command{inetd} debería usar un servicio implementado internamente.
@item @code{arguments} (predeterminados: @code{'()})
Una lista de cadenas u objetos ``tipo-archivo'', que serán los parámetros
del programa servidor, empezando con el parámetro 0, es decir, el nombre del
programa en sí mismo. Para los servicios internos de @command{inetd}, esta
entrada debe ser @code{'()} o @code{'("internal")}.
@end table

@xref{Configuration file,,, inetutils, GNU Inetutils}, para una información
más detallada sobre cada campo de la configuración.
@end deftp

@cindex opendht, distributed hash table network service
@cindex dhtproxy, for use with jami
@defvr {Scheme Variable} opendht-service-type
This is the type of the service running a @uref{https://opendht.net,
OpenDHT} node, @command{dhtnode}.  The daemon can be used to host your own
proxy service to the distributed hash table (DHT), for example to connect to
with Jami, among other applications.

@quotation Importante
When using the OpenDHT proxy server, the IP addresses it ``sees'' from the
clients should be addresses reachable from other peers.  In practice this
means that a publicly reachable address is best suited for a proxy server,
outside of your private network.  For example, hosting the proxy server on a
IPv4 private local network and exposing it via port forwarding could work
for external peers, but peers local to the proxy would have their private
addresses shared with the external peers, leading to connectivity problems.
@end quotation

The value of this service is a @code{opendht-configuration} object, as
described below.
@end defvr

@c The fields documentation has been auto-generated using the
@c configuration->documentation procedure from
@c (gnu services configuration).
@deftp {Data Type} opendht-configuration
Available @code{opendht-configuration} fields are:

@table @asis
@item @code{opendht} (default: @code{opendht}) (type: file-like)
The @code{opendht} package to use.

@item @code{peer-discovery?} (default: @code{#f}) (type: boolean)
Whether to enable the multicast local peer discovery mechanism.

@item @code{enable-logging?} (default: @code{#f}) (type: boolean)
Whether to enable logging messages to syslog.  It is disabled by default as
it is rather verbose.

@item @code{debug?} (default: @code{#f}) (type: boolean)
Whether to enable debug-level logging messages.  This has no effect if
logging is disabled.

@item @code{bootstrap-host} (default: @code{"bootstrap.jami.net:4222"}) (type: maybe-string)
The node host name that is used to make the first connection to the
network.  A specific port value can be provided by appending the
@code{:PORT} suffix.  By default, it uses the Jami bootstrap nodes, but any
host can be specified here.  It's also possible to disable bootstrapping by
explicitly setting this field to the @code{%unset-value} value.

@item @code{port} (default: @code{4222}) (type: maybe-number)
The UDP port to bind to.  When left unspecified, an available port is
automatically selected.

@item @code{proxy-server-port} (type: maybe-number)
Spawn a proxy server listening on the specified port.

@item @code{proxy-server-port-tls} (type: maybe-number)
Spawn a proxy server listening to TLS connections on the specified port.

@end table
@end deftp

@cindex Tor
@defvr {Variable Scheme} tor-service-type
Este es el tipo para un servicio que ejecuta el daemon de red anónima
@uref{https://torproject.org, Tor}. El servicio se configura mediante un
registro @code{<tor-configuration>}. De manera predeterminada, el daemon Tor
se ejecuta como la usuaria sin privilegios @code{tor}, que es miembro del
grupo @code{tor}.

@end defvr

@deftp {Tipo de datos} tor-configuration
@table @asis
@item @code{tor} (predeterminado: @code{tor})
El paquete que proporciona el daemon Tor. Se espera que este paquete
proporcione el daemon en @file{bin/tor} de manera relativa al directorio de
su salida. El paquete predeterminado es la implementación del
@uref{https://www.torproject.org, Proyecto Tor}.

@item @code{config-file} (predeterminado: @code{(plain-file "empty" "")})
El archivo de configuración usado. Se agregará al final del archivo de
configuración predeterminado, y se proporcionará el archivo de configuración
resultante a @code{tor} a través de su opción @code{-f}. Puede ser cualquier
objeto ``tipo-archivo'' (@pxref{Expresiones-G, objetos
``tipo-archivo''}). Véase @code{man tor} para detalles sobre la sintaxis del
archivo de configuración.

@item @code{hidden-services} (predeterminados: @code{'()})
La lista de registros de servicios ocultos @code{<hidden-service>}
usados. Para cada servicio oculto que añada en esta lista, se activará la
configuración apropiada para su activación en el archivo de configuración
predeterminado. Puede crear registros @code{<hidden-service>} de manera
conveniente mediante el uso del procedimiento @code{tor-hidden-service}
descrito a continuación.

@item @code{socks-socket-type} (predeterminado: @code{'tcp})
El tipo socket predeterminado que Tor debe usar para su socket SOCKS. Debe
ser @code{'tcp} i @code{'unix}. Si es @code{'tcp}, Tor escuchará en el
puerto TCP 9050 de la interfaz local (es decir, localhost) de manera
predeterminada. Si es @code{'unix}, tor escuchará en el socket de dominio de
UNIX @file{/var/run/tor/socks-sock}, que tendrá permisos de escritura para
miembros del grupo @code{tor}.

Si desea personalizar el socket SOCKS de manera más detallada, mantenga
@code{socks-socket-type} con su valor predeterminado de @code{'tcp} y use
@code{config-file} para modificar el valor predeterminado proporcionando su
propia opción @code{SocksPort}.

@item @code{control-socket?} (default: @code{#f})
Whether or not to provide a ``control socket'' by which Tor can be
controlled to, for instance, dynamically instantiate tor onion services.  If
@code{#t}, Tor will listen for control commands on the UNIX domain socket
@file{/var/run/tor/control-sock}, which will be made writable by members of
the @code{tor} group.

@end table
@end deftp

@cindex servicio oculto
@deffn {Procedimiento Scheme} tor-hidden-service @var{nombre} @var{relación}
Define un @dfn{servicio oculto} Tor llamado @var{nombre} y que implementa la
@var{relación}. @var{relación} es una lista de tuplas puerto/máquina, como:

@example
 '((22 "127.0.0.1:22")
   (80 "127.0.0.1:8080"))
@end example

En este ejemplo, el puerto 22 del servicio oculto se asocia con el puerto 22
local, y el puerto 80 se asocia con el puerto 8080 local.

Esto crea un directorio @file{/var/lib/tor/hidden-services/@var{nombre}},
donde el archivo @file{hostname} contiene el nombre de máquina @code{.onion}
para el servicio oculto.

Véase @uref{https://www.torproject.org/docs/tor-hidden-service.html.en, la
documentación del proyecto Tor} para más información.
@end deffn

El módulo @code{(gnu services rsync)} proporciona los siguientes servicios:

Puede ser que desee un daemon rsync si tiene archivos que desee tener
disponibles de modo que cualquiera (o simplemente usted) pueda descargar
archivos existentes o subir nuevos archivos.

@deffn {Variable Scheme} rsync-service-type
Este es el tipo de servicio para el daemon @uref{https://rsync.samba.org,
rsync}. El valor tipo de servicio es un registro
@command{rsync-configuration} como en este ejemplo.

@lisp
;; Export two directories over rsync.  By default rsync listens on
;; all the network interfaces.
(service rsync-service-type
         (rsync-configuration
           (modules (list (rsync-module
                            (name "music")
                            (file-name "/srv/zik")
                            (read-only? #f))
                          (rsync-module
                            (name "movies")
                            (file-name "/home/charlie/movies"))))))
@end lisp

Véase a continuación para detalles sobre @code{rsync-configuration}.
@end deffn

@deftp {Tipo de datos} rsync-configuration
Tipo de datos que representa la configuración para @code{rsync-service}.

@table @asis
@item @code{package} (predeterminado: @var{rsync})
Paquete @code{rsync} usado.

@item @code{address} (predeterminada: @code{#f})
IP address on which @command{rsync} listens for incoming connections.  If
unspecified, it defaults to listening on all available addresses.

@item @code{port-number} (predeterminado: @code{873})
Puerto TCP en el que @command{rsync} escucha conexiones entrantes. Si el
puerto es menor a @code{1024}, @command{rsync} necesita iniciarse como
@code{root}, tanto usuaria como grupo.

@item @code{pid-file} (predeterminado: @code{"/var/run/rsyncd/rsyncd.pid"})
Nombre del archivo donde @command{rsync} escribe su PID.

@item @code{lock-file} (predeterminado: @code{"/var/run/rsyncd/rsyncd.lock"})
Nombre del archivo donde @command{rsync} escribe su archivo de bloqueo.

@item @code{log-file} (predeterminado: @code{"/var/log/rsyncd.log"})
Nombre del archivo donde @command{rsync} escribe su archivo de registros.

@item @code{user} (predeterminada: @code{"root"})
Propietaria del proceso @code{rsync}.

@item @code{group} (default: @code{"root"})
Grupo del proceso @code{rsync}.

@item @code{uid} (default: @code{"rsyncd"})
Nombre o ID de usuaria bajo la cual se efectúan las transferencias desde y
hacia el módulo cuando el daemon se ejecuta como @code{root}.

@item @code{gid} (default: @code{"rsyncd"})
Nombre o ID de grupo que se usa cuando se accede al módulo.

@item @code{modules} (predeterminados: @code{%default-modules})
List of ``modules''---i.e., directories exported over rsync.  Each element
must be a @code{rsync-module} record, as described below.
@end table
@end deftp

@deftp {Data Type} rsync-module
This is the data type for rsync ``modules''.  A module is a directory
exported over the rsync protocol.  The available fields are as follows:

@table @asis
@item @code{name}
The module name.  This is the name that shows up in URLs.  For example, if
the module is called @code{music}, the corresponding URL will be
@code{rsync://host.example.org/music}.

@item @code{file-name}
Name of the directory being exported.

@item @code{comment} (predeterminado: @code{""})
Comment associated with the module.  Client user interfaces may display it
when they obtain the list of available modules.

@item @code{read-only?} (default: @code{#t})
Whether or not client will be able to upload files.  If this is false, the
uploads will be authorized if permissions on the daemon side permit it.

@item @code{chroot?} (default: @code{#t})
When this is true, the rsync daemon changes root to the module's directory
before starting file transfers with the client.  This improves security, but
requires rsync to run as root.

@item @code{timeout} (predeterminado: @code{300})
Idle time in seconds after which the daemon closes a connection with the
client.
@end table
@end deftp

The @code{(gnu services syncthing)} module provides the following services:
@cindex syncthing

You might want a syncthing daemon if you have files between two or more
computers and want to sync them in real time, safely protected from prying
eyes.

@deffn {Scheme Variable} syncthing-service-type
This is the service type for the @uref{https://syncthing.net/, syncthing}
daemon, The value for this service type is a
@command{syncthing-configuration} record as in this example:

@lisp
(service syncthing-service-type
         (syncthing-configuration (user "alice")))
@end lisp

See below for details about @code{syncthing-configuration}.

@deftp {Data Type} syncthing-configuration
Data type representing the configuration for @code{syncthing-service-type}.

@table @asis
@item @code{syncthing} (default: @var{syncthing})
@code{syncthing} package to use.

@item @code{arguments} (default: @var{'()})
List of command-line arguments passing to @code{syncthing} binary.

@item @code{logflags} (default: @var{0})
Sum of logging flags, see
@uref{https://docs.syncthing.net/users/syncthing.html#cmdoption-logflags,
Syncthing documentation logflags}.

@item @code{user} (default: @var{#f})
The user as which the Syncthing service is to be run.  This assumes that the
specified user exists.

@item @code{group} (default: @var{"users"})
The group as which the Syncthing service is to be run.  This assumes that
the specified group exists.

@item @code{home} (default: @var{#f})
Common configuration and data directory.  The default configuration
directory is @file{$HOME} of the specified Syncthing @code{user}.

@end table
@end deftp
@end deffn

Es más, @code{(gnu services ssh)} proporciona los siguientes servicios.
@cindex SSH
@cindex servidor SSH

@deffn {Procedimiento Scheme} lsh-service [#:host-key "/etc/lsh/host-key"] @
       [#:daemonic? #t] [#:interfaces '()] [#:port-number 22] @
  [#:allow-empty-passwords? #f] [#:root-login? #f] @
  [#:syslog-output? #t] [#:x11-forwarding? #t] @
  [#:tcp/ip-forwarding? #t] [#:password-authentication? #t] @
  [#:public-key-authentication? #t] [#:initialize? #t]
Ejecuta el programa @command{lshd} de @var{lsh} para escuchar en el puerto
@var{port-number}. @var{host-key} debe designar a un archivo que contiene la
clave de la máquina, y que sea legible únicamente por root.

Cuando @var{daemonic?} es verdadero, @command{lshd} se desligará del
terminal de control y registrará su salida con syslogd, a menos que se
establezca @var{syslog-output?} a falso. Obviamente, esto hace que
lsh-dependa de la existencia de un servicio syslogd. Cuando @var{pid-file?}
es verdadero, @command{lshd} escribe su PID al archivo llamado
@var{pid-file}.

Cuando @var{initialize?} es verdadero, crea automáticamente una semilla una
clave de máquina una vez se active el servicio si no existen todavía. Puede
tomar un tiempo prolongado y necesita interacción.

Cuando @var{initialize?} es falso, es cuestión de la usuaria la
inicialización del generador aleatorio (@pxref{lsh-make-seed,,, lsh, LSH
Manual}), la creación de un par de claves y el almacenamiento de la clave
privada en el archivo @var{host-key} (@pxref{lshd basics,,, lsh, LSH
Manual}).

Cuando @var{interfaces} está vacío, lshd escucha conexiones en todas las
interfaces de red; en otro caso, @var{interfaces} debe ser una lista de
nombres de máquina o direcciones.

@var{allow-empty-passwords?} especifica si se aceptará el ingreso al sistema
con una contraseña vacía y @var{root-login?} especifica si se acepta el
ingreso al sistema como root.

El resto de opciones deberían ser autodescriptivas.
@end deffn

@cindex SSH
@cindex servidor SSH
@deffn {Variable Scheme} openssh-service-type
Este es el tipo para el daemon de shell seguro @uref{http://www.openssh.org,
OpenSSH}, @command{sshd}. Su valor debe ser un registro
@code{openssh-configuration} como en este ejemplo:

@lisp
(service openssh-service-type
         (openssh-configuration
           (x11-forwarding? #t)
           (permit-root-login 'prohibit-password)
           (authorized-keys
             `(("alice" ,(local-file "alice.pub"))
               ("bob" ,(local-file "bob.pub"))))))
@end lisp

Véase a continuación detalles sobre @code{openssh-configuration}.

Este servicio se puede extender con claves autorizadas adicionales, como en
este ejemplo:

@lisp
(service-extension openssh-service-type
                   (const `(("carlos"
                             ,(local-file "carlos.pub")))))
@end lisp
@end deffn

@deftp {Tipo de datos} openssh-configuration
Este es el registro de configuración para @command{sshd} de OpenSSH.

@table @asis
@item @code{openssh} (predeterminado: @var{openssh})
The OpenSSH package to use.

@item @code{pid-file} (predeterminado: @code{"/var/run/sshd.pid"})
Nombre del archivo donde @command{sshd} escribe su PID.

@item @code{port-number} (predeterminado: @code{22})
Puerto TCP en el que @command{sshd} espera conexiones entrantes.

@item @code{max-connections} (default: @code{200})
Hard limit on the maximum number of simultaneous client connections,
enforced by the inetd-style Shepherd service (@pxref{Service De- and Constructors, @code{make-inetd-constructor},, shepherd, The GNU Shepherd
Manual}).

@item @code{permit-root-login} (predeterminado: @code{#f})
This field determines whether and when to allow logins as root.  If
@code{#f}, root logins are disallowed; if @code{#t}, they are allowed.  If
it's the symbol @code{'prohibit-password}, then root logins are permitted
but not with password-based authentication.

@item @code{allow-empty-passwords?} (predeterminado: @code{#f})
Cuando es verdadero, las usuarias con contraseñas vacías pueden ingresar en
el sistema. Cuando es falso, no pueden.

@item @code{password-authentication?} (predeterminado: @code{#t})
Cuando es verdadero, las usuarias pueden ingresar al sistema con su
contraseña. En caso falso, tienen otros métodos de identificación.

@item @code{public-key-authentication?} (predeterminado: @code{#t})
Cuando es verdadero, las usuarias pueden ingresar en el sistema mediante el
uso de clave publica para su identificación. Cuando es falso, las usuarias
tienen que usar otros métodos de identificación.

Las claves públicas autorizadas se almacenan en
@file{~/.ssh/authorized_keys}. Se usa únicamente por la versión 2 del
protocolo.

@item @code{x11-forwarding?} (predeterminado: @code{#f})
Cuando verdadero, la retransmisión de conexiones del cliente gráfico X11
está desactivada---en otras palabras, las opciones @option{-X} y @option{-Y}
de @command{ssh} funcionarán.

@item @code{allow-agent-forwarding?} (predeterminado: @code{#t})
Si se permite la retransmisión del agente de claves.

@item @code{allow-tcp-forwarding?} (predeterminado: @code{#t})
Si se permite la retransmisión TCP.

@item @code{gateway-ports?} (predeterminado: @code{#f})
Si se permiten los puertos pasarela.

@item @code{challenge-response-authentication?} (predeterminado: @code{#f})
Especifica si la identificación mediante respuesta de desafío está permitida
(por ejemplo, a través de PAM).

@item @code{use-pam?} (predeterminado: @code{#t})
Permite el uso de la interfaz de módulos de identificación conectables
(PAM). Si es @code{#t} se activará la identificación PAM mediante el uso de
@code{challenge-response-authentication?} y @code{password-authentication?},
además del procesado de los módulos de cuenta usuaria y de sesión de PAM en
todos los tipos de identificación.

Debido a que la identificación mediante respuesta de desafío de PAM tiene un
rol equivalente a la identificación por contraseña habitualmente, debería
desactivar @code{challenge-response-authentication?} o
@code{password-authentication?}.

@item @code{print-last-log?} (predeterminado: @code{#t})
Especifica si @command{sshd} debe imprimir la fecha y hora del último
ingreso al sistema de la usuaria cuando una usuaria ingresa
interactivamente.

@item @code{subsystems} (predeterminados: @code{'(("sftp" "internal-sftp"))})
Configura subsistemas externos (por ejemplo, el daemon de transmisión de
archivos).

Esta es una lista de listas de dos elementos, cada una de las cuales que
contienen el nombre del subsistema y una orden (con parámetros opcionales)
para ejecutar tras petición del subsistema.

La orden @command{internal-sftp} implementa un servidor SFTP dentro del
mismo proceso. De manera alternativa, se puede especificar la orden
@command{sftp-server}:
@lisp
(service openssh-service-type
         (openssh-configuration
          (subsystems
           `(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))
@end lisp

@item @code{accepted-environment} (predeterminado: @code{'()})
Una lista de cadenas que describe qué variables de entorno pueden ser
exportadas.

Cada cadena obtiene su propia línea. Véase la opción @code{AcceptEnv} en
@code{man sshd_config}.

Este ejemplo permite a clientes ssh exportar la variable @env{COLORTERM}. La
establecen emuladores de terminal que implementan colores. Puede usarla en
su archivo de recursos del shell para permitir colores en la línea de
órdenes y las propias ordenes si esta variable está definida.

@lisp
(service openssh-service-type
         (openssh-configuration
           (accepted-environment '("COLORTERM"))))
@end lisp

@item @code{authorized-keys} (predeterminadas: @code{'()})
@cindex claves autorizadas, SSH
@cindex SSH, claves autorizadas
Esta es la lista de claves autorizadas. Cada elemento de la lista es un
nombre de usuaria seguido de uno o más objetos ``tipo-archivo'' que
representan claves públicas SSH. Por ejemplo:

@lisp
(openssh-configuration
  (authorized-keys
    `(("rekado" ,(local-file "rekado.pub"))
      ("chris" ,(local-file "chris.pub"))
      ("root" ,(local-file "rekado.pub") ,(local-file "chris.pub")))))
@end lisp

@noindent
registra las claves públicas especificadas para las cuentas @code{rekado},
@code{chris} y @code{root}.

Se pueden especificar claves autorizadas adicionales a través de
@code{service-extension}.

Tenga en cuenta que esto @emph{no} interfiere con el uso de
@file{~/.ssh/authorized_keys}.

@item @code{generate-host-keys?} (default: @code{#t})
Whether to generate host key pairs with @command{ssh-keygen -A} under
@file{/etc/ssh} if there are none.

Generating key pairs takes a few seconds when enough entropy is available
and is only done once.  You might want to turn it off for instance in a
virtual machine that does not need it because host keys are provided in some
other way, and where the extra boot time is a problem.

@item @code{log-level} (predeterminado: @code{'info})
Es un símbolo que especifica el nivel de detalle en los registros:
@code{quiet}, @code{fatal}, @code{error}, @code{info}, @code{verbose},
@code{debug}, etc. Véase la página del manual de @file{sshd_config} para la
lista completa de los nombres de nivel.

@item @code{extra-content} (predeterminado: @code{""})
Este campo puede usarse para agregar un texto arbitrario al archivo de
configuración. Es especialmente útil para configuraciones elaboradas que no
se puedan expresar de otro modo. Esta configuración, por ejemplo,
generalmente desactivaría el ingreso al sistema como root, pero lo permite
para una dirección IP específica:

@lisp
(openssh-configuration
  (extra-content "\
Match Address 192.168.0.1
  PermitRootLogin yes"))
@end lisp

@end table
@end deftp

@deffn {Procedimiento Scheme} dropbear-service [@var{config}]
Ejecuta el @uref{https://matt.ucc.asn.au/dropbear/dropbear.html,daemon
Dropbear SSH} con la @var{config}uración proporcionada, un objeto
@code{<dropbear-configuration>}.

Por ejemplo, para especificar un servicio Dropbear que escuche en el puerto
1234, añada esta llama al campo @code{services} de su sistema operativo:

@lisp
(dropbear-service (dropbear-configuration
                    (port-number 1234)))
@end lisp
@end deffn

@deftp {Tipo de datos} dropbear-configuration
Este tipo de datos representa la configuración del daemon Dropbear SSH.

@table @asis
@item @code{dropbear} (predeterminado: @var{dropbear})
El paquete de Dropbear usado.

@item @code{port-number} (predeterminado: 22)
Puerto TCP donde el daemon espera conexiones entrantes.

@item @code{syslog-output?} (predeterminado: @code{#t})
Determina si se envía la salida a syslog.

@item @code{pid-file} (predeterminado: @code{"/var/run/dropbear.pid"})
El nombre de archivo del archivo de PID del daemon.

@item @code{root-login?} (predeterminado: @code{#f})
Si se permite el ingreso al sistema como @code{root}.

@item @code{allow-empty-passwords?} (predeterminado: @code{#f})
Si se permiten las contraseñas vacías.

@item @code{password-authentication?} (predeterminado: @code{#t})
Determina si se usará identificación basada en contraseña.
@end table
@end deftp

@cindex AutoSSH
@deffn {Variable Scheme} autossh-service-type
Tipo del servicio para el programa
@uref{https://www.harding.motd.ca/autossh, AutoSSH} que ejecuta una copia de
@command{ssh} y la monitoriza, reiniciando la conexión en caso de que se
rompa la conexión o deje de transmitir datos. AutoSSH puede ejecutarse
manualmente en la línea de órdenes proporcionando los parámetros al binario
@command{autossh} del paquete @code{autossh}, pero también se puede ejecutar
como un servicio de Guix. Este último caso de uso se encuentra documentado
aquí.

AutoSSH se puede usar para retransmitir tráfico local a una máquina remota
usando un túnel SSH, y respeta el archivo de configuración
@file{~/.ssh/config} de la cuenta bajo la que se ejecute.

Por ejemplo, para especificar un servicio que ejecute autossh con la cuenta
@code{pino} y retransmita todas las conexiones locales al puerto @code{8081}
hacia @code{remote:8081} usando un túnel SSH, añada esta llamada al campo
@code{services} del sistema operativo:

@lisp
(service autossh-service-type
         (autossh-configuration
          (user "pino")
          (ssh-options (list "-T" "-N" "-L" "8081:localhost:8081" "remote.net"))))
@end lisp
@end deffn

@deftp {Tipo de datos} autossh-configuration
Este tipo de datos representa la configuración del servicio AutoSSH.

@table @asis

@item @code{user} (predeterminado: @code{"autossh"})
La cuenta de usuaria con la cual se ejecuta el servicio AutoSSH. Se asume
que existe dicha cuenta.

@item @code{poll} (predeterminado: @code{600})
Especifica el tiempo de comprobación de la conexión en segundos.

@item @code{first-poll} (predeterminado: @code{#f})
Especifica cuantos segundos espera AutoSSH antes de la primera prueba de
conexión. Tras esta primera prueba las comprobaciones se realizan con la
frecuencia definida en @code{poll}. Cuando se proporciona el valor @code{#f}
la primera comprobación no se trata de manera especial y también usará el
valor especificado en @code{poll}.

@item @code{gate-time} (predeterminado: @code{30})
Especifica cuantos segundos debe estar activa una conexión SSH antes de que
se considere satisfactoria.

@item @code{log-level} (predeterminado: @code{1})
El nivel de registro, corresponde con los niveles usados por---por lo que
@code{0} es el más silencioso y @code{7} el que contiene más información.

@item @code{max-start} (predeterminado: @code{#f})
El número de veces máximo que puede lanzarse (o reiniciarse) SSH antes de
que AutoSSH termine. Cuando se proporciona @code{#f}, no existe un máximo
por lo que AutoSSH puede reiniciar la conexión indefinidamente.

@item @code{message} (predeterminado: @code{""})
El mensaje que se añade al mensaje de eco que se envía cuando se prueban las
conexiones.

@item @code{port} (predeterminado: @code{"0"})
Los puertos usados para la monitorización de la conexión. Cuando se
proporciona @code{"0"}, se desactiva la monitorización. Cuando se
proporciona @code{"@var{n}"} donde @var{n} es un entero positivo, los
puertos @var{n} y @var{n}+1 se usan para monitorizar la conexión, de tal
modo que el puerto @var{n} es el puerto base de monitorización y @code{n+1}
es el puerto de eco. Cuando se proporciona @code{"@var{n}:@var{m}"} donde
@var{n} y @var{m} son enteros positivos, los puertos @var{n} y @var{m} se
usan para monitorizar la conexión, de tal modo que @var{n} es el puerto base
de monitorización y @var{m} es el puerto de eco.

@item @code{ssh-options} (predeterminados: @code{'()})
Lista de parámetros de línea de órdenes proporcionados a @command{ssh}
cuando se ejecuta. Las opciones @option{-f} y @option{-M} están reservadas
para AutoSSH y pueden causar un comportamiento indefinido.

@end table
@end deftp

@cindex WebSSH
@deffn {Variable Scheme} webssh-service-type
Tipo para el programa @uref{https://webssh.huashengdun.org/, WebSSH} que
ejecuta un cliente SSH web.  WebSSH puede ejecutarse manualmente en la línea
de órdenes proporcionando los parámetros al binario @command{wssh} del
paquete @code{webssh}, pero también se puede ejecutar como un servicio de
Guix. Este último caso de uso se encuentra documentado aquí.

Por ejemplo, para especificar un servicio que ejecute WebSSH en la interfaz
de red local sobre el puerto @code{8888} con una política de rechazo
predeterminado con una lista de máquinas a las que se les permite
explícitamente la conexión, y NGINX como pasarela inversa de este servicio a
la escucha de conexiones HTTPS, añada esta llamada al campo @code{services}
de su declaración de sistema operativo:

@lisp
(service webssh-service-type
  (webssh-configuration (address "127.0.0.1")
                        (port 8888)
                        (policy 'reject)
                        (known-hosts '("localhost ecdsa-sha2-nistp256 AAAA…"
                                       "127.0.0.1 ecdsa-sha2-nistp256 AAAA…"))))

(service nginx-service-type
         (nginx-configuration
          (server-blocks
           (list
            (nginx-server-configuration
             (inherit %webssh-configuration-nginx)
             (server-name '("webssh.example.com"))
             (listen '("443 ssl"))
             (ssl-certificate (letsencrypt-certificate "webssh.example.com"))
             (ssl-certificate-key (letsencrypt-key "webssh.example.com"))
             (locations
              (cons (nginx-location-configuration
                     (uri "/.well-known")
                     (body '("root /var/www;")))
                    (nginx-server-configuration-locations %webssh-configuration-nginx))))))))
@end lisp
@end deffn

@deftp {Tipo de datos} webssh-configuration
Tipo de datos que representa la configuración para @code{webssh-service}.

@table @asis
@item @code{package} (predeterminado: @var{webssh})
Paquete @code{webssh} usado.

@item @code{user-name} (predeterminado: @var{"webssh"})
Nombre o ID de usuaria bajo la cual se efectúan las transferencias desde y
hacia el módulo.

@item @code{group-name} (predeterminado: @var{"webssh"})
Nombre o ID de grupo que se usa cuando se accede al módulo.

@item @code{address} (predeterminada: @var{#f})
Dirección IP en la que @command{webssh} espera conexiones entrantes.

@item @code{port} (predeterminado: @var{8888})
Puerto TCP en el que @command{webssh} espera conexiones entrantes.

@item @code{policy} (predeterminada: @var{#f})
Política de conexión.  La política @var{reject} necesita que se especifique
un valor en @var{known-hosts}.

@item @code{known-hosts} (predeterminada: @var{'()})
Lista de máquinas a las que se permite realizar conexiones SSH desde
@command{webssh}.

@item @code{log-file} (predeterminado: @file{"/var/log/webssh.log"})
Name of the file where @command{webssh} writes its log file.

@item @code{log-level} (predeterminado: @var{#f})
Nivel de registro.

@end table
@end deftp

@defvr {Variable Scheme} %facebook-host-aliases
Esta variable contiene una cadena para su uso en @file{/etc/hosts}
(@pxref{Host Names,,, libc, The GNU C Library Reference Manual}). Cada línea
contiene una entrada que asocia un nombre de servidor conocido del servicio
en línea Facebook---por ejemplo, @code{www.facebook.com}---a la máquina
local---@code{127.0.0.1} o su equivalente IPv6, @code{::1}.

Esta variable habitualmente se usa en el campo @code{hosts-file} de una
declaración @code{operating-system} (@pxref{Referencia de operating-system,
@file{/etc/hosts}}):

@lisp
(use-modules (gnu) (guix))

(operating-system
  (host-name "micompu")
  ;; ...
  (hosts-file
    ;; Crea un archivo /etc/hosts file con alias para "localhost"
    ;; y "micompu", así como los servidores de facebook.
    (plain-file "hosts"
                (string-append (local-host-aliases host-name)
                               %facebook-host-aliases))))
@end lisp

Este mecanismo puede impedir a los programas que se ejecutan localmente,
como navegadores Web, el acceso a Facebook.
@end defvr

El módulo @code{(gnu services avahi)} proporciona la siguiente definición.

@defvr {Variable Scheme} avahi-service-type
Es el servicio que ejecuta @command{avahi-daemon}, un servidor mDNS/DNS-SD a
nivel del sistema que permite el descubrimiento de servicios y la búsqueda
de nombres de máquina ``sin configuración'' (``zero-configuration'', véase
@uref{https://avahi.org/}). Su valor debe ser un registro
@code{avahi-configuration}---véase a continuación. 

Este servicio extiende el daemon de la caché del servicio de nombres (nscd)
de manera que pueda resolver nombres de máquina @code{.local} mediante el
uso de @uref{https://0pointer.de/lennart/projects/nss-mdns,
nss-mds}. @xref{Selector de servicios de nombres}, para información sobre la resolución
de nombres de máquina.

De manera adicional, añade el paquete @var{avahi} al perfil del sistema de
manera que ordenes como @command{avahi-browse} estén disponibles de manera
directa.
@end defvr

@deftp {Tipo de datos} avahi-configuration
Tipo de datos que representa la configuración de Avahi.

@table @asis

@item @code{host-name} (predeterminado: @code{#f})
Si es diferente de @code{#f}, se usa como el nombre de máquina a publicar
para esta máquina; en otro caso, usa el nombre actual de la máquina.

@item @code{publish?} (predeterminado: @code{#t})
Cuando es verdadero, permite la publicación (retransmisión) de nombres de
máquina y servicios a través de la red.

@item @code{publish-workstation?} (predeterminado: @code{#t})
Cuando es verdadero, @command{avahi-daemon} publica el nombre de máquina y
la dirección IP a través de mDNS en la red local. Para ver los nombres de
máquina publicados en su red local, puede ejecutar:

@example
avahi-browse _workstation._tcp
@end example

@item @code{wide-area?} (predeterminado: @code{#f})
Cuando es verdadero, se permite DNS-SD sobre DNS unicast.

@item @code{ipv4?} (predeterminado: @code{#t})
@itemx @code{ipv6?} (predeterminado: @code{#t})
Estos campos determinan si usar sockets IPv4/IPv6.

@item @code{domains-to-browse} (predeterminado: @code{'()})
Esta es la lista de dominios a explorar.
@end table
@end deftp

@deffn {Variable Scheme} openvswitch-service-type
Este es el tipo del servicio @uref{https://www.openvswitch.org, Open
vSwitch}, cuyo valor debe ser un objeto @code{openvswitch-configuration}.
@end deffn

@deftp {Tipo de datos} openvswitch-configuration
Tipo de datos que representa la configuración de Open vSwitch, un switch
virtual multicapa que está diseñado para permitir una automatización masiva
en la red a través de extensión programática.

@table @asis
@item @code{package} (predeterminado: @var{openvswitch})
El objeto paquete de Open vSwitch.

@end table
@end deftp

@defvr {Variable Scheme} pagekite-service-type
El tipo de servicio para el servicio @uref{https://pagekite.net, PageKite},
una solución de encaminado para hacer servidores de la red local visibles
públicamente, incluso detrás de cortafuegos restrictivos o NAT sin
redirección de puertos. El valor para este servicio es un registro
@code{pagekite-configuration}.

Este es un ejemplo que expone los daemon HTTP y SSH locales:

@lisp
(service pagekite-service-type
         (pagekite-configuration
           (kites '("http:@@kitename:localhost:80:@@kitesecret"
                    "raw/22:@@kitename:localhost:22:@@kitesecret"))
           (extra-file "/etc/pagekite.rc")))
@end lisp
@end defvr

@deftp {Tipo de datos} pagekite-configuration
Tipo de datos que representa la configuración de PageKite.

@table @asis
@item @code{package} (predeterminado: @var{pagekite})
El objeto paquete de PageKite.

@item @code{kitename} (predeterminado: @code{#f})
Nombre de PageKite para la identificación con el servidor de fachada.

@item @code{kitesecret} (predeterminado: @code{#f})
Secreto compartido para la comunicación con el servidor. Probablemente
debería almacenarlo dentro @code{extra-file} en vez de aquí.

@item @code{frontend} (predeterminado: @code{#f})
Conecta al servidor de fachada de PageKite con este nombre en vez de al
servicio de @uref{https://pagekite.net,,pagekite.net}.

@item @code{kites} (predeterminados: @code{'("http:@@kitename:localhost:80:@@kitesecret")})
List of service kites to use.  Exposes HTTP on port 80 by default.  The
format is @code{proto:kitename:host:port:secret}.

@item @code{extra-file} (predeterminado: @code{#f})
Archivo adicional de configuración que debe leerse, el cual se espera que
sea creado de forma manual. Úselo para añadir opciones adicionales y
gestionar secretos compartidos fuera de banda.

@end table
@end deftp

@defvr {Scheme Variable} yggdrasil-service-type
The service type for connecting to the
@uref{https://yggdrasil-network.github.io/, Yggdrasil network}, an
early-stage implementation of a fully end-to-end encrypted IPv6 network.

@quotation
Yggdrasil provides name-independent routing with cryptographically generated
addresses.  Static addressing means you can keep the same address as long as
you want, even if you move to a new location, or generate a new address (by
generating new keys) whenever you want.
@uref{https://yggdrasil-network.github.io/2018/07/28/addressing.html}
@end quotation

Pass it a value of @code{yggdrasil-configuration} to connect it to public
peers and/or local peers.

Here is an example using public peers and a static address.  The static
signing and encryption keys are defined in
@file{/etc/yggdrasil-private.conf} (the default value for
@code{config-file}).

@lisp
;; part of the operating-system declaration
(service yggdrasil-service-type
              (yggdrasil-configuration
               (autoconf? #f) ;; use only the public peers
               (json-config
               ;; choose one from
               ;; https://github.com/yggdrasil-network/public-peers
                '((peers . #("tcp://1.2.3.4:1337"))))
               ;; /etc/yggdrasil-private.conf is the default value for config-file
               ))
@end lisp
@example
# sample content for /etc/yggdrasil-private.conf
@{
  # Your public key. Your peers may ask you for this to put
  # into their AllowedPublicKeys configuration.
  PublicKey: 64277...

  # Your private key. DO NOT share this with anyone!
  PrivateKey: 5c750...
@}
@end example
@end defvr

@deftp {Data Type} yggdrasil-configuration
Data type representing the configuration of Yggdrasil.

@table @asis
@item @code{package} (default: @code{yggdrasil})
Package object of Yggdrasil.

@item @code{json-config} (default: @code{'()})
Contents of @file{/etc/yggdrasil.conf}.  Will be merged with
@file{/etc/yggdrasil-private.conf}.  Note that these settings are stored in
the Guix store, which is readable to all users. @strong{Do not store your
private keys in it}.  See the output of @code{yggdrasil -genconf} for a
quick overview of valid keys and their default values.

@item @code{autoconf?} (default: @code{#f})
Whether to use automatic mode.  Enabling it makes Yggdrasil use adynamic IP
and peer with IPv6 neighbors.

@item @code{log-level} (predeterminado: @code{'info})
How much detail to include in logs.  Use @code{'debug} for more detail.

@item @code{log-to} (default: @code{'stdout})
Where to send logs.  By default, the service logs standard output to
@file{/var/log/yggdrasil.log}.  The alternative is @code{'syslog}, which
sends output to the running syslog service.

@item @code{config-file} (default: @code{"/etc/yggdrasil-private.conf"})
What HJSON file to load sensitive data from.  This is where private keys
should be stored, which are necessary to specify if you don't want a
randomized address after each restart.  Use @code{#f} to disable.  Options
defined in this file take precedence over @code{json-config}.  Use the
output of @code{yggdrasil -genconf} as a starting point.  To configure a
static address, delete everything except these options:

@itemize
@item @code{EncryptionPublicKey}
@item @code{EncryptionPrivateKey}
@item @code{SigningPublicKey}
@item @code{SigningPrivateKey}
@end itemize
@end table
@end deftp

@cindex IPFS
@defvr {Scheme Variable} ipfs-service-type
The service type for connecting to the @uref{https://ipfs.io,IPFS network},
a global, versioned, peer-to-peer file system. Pass it a
@code{ipfs-configuration} to change the ports used for the gateway and API.

Here's an example configuration, using some non-standard ports:

@lisp
(service ipfs-service-type
         (ipfs-configuration
          (gateway "/ip4/127.0.0.1/tcp/8880")
          (api "/ip4/127.0.0.1/tcp/8881")))
@end lisp
@end defvr

@deftp {Data Type} ipfs-configuration
Data type representing the configuration of IPFS.

@table @asis
@item @code{package} (default: @code{go-ipfs})
Package object of IPFS.

@item @code{gateway} (default: @code{"/ip4/127.0.0.1/tcp/8082"})
Address of the gateway, in ‘multiaddress’ format.

@item @code{api} (default: @code{"/ip4/127.0.0.1/tcp/5001"})
Address of the API endpoint, in ‘multiaddress’ format.
@end table
@end deftp

@cindex keepalived
@deffn {Scheme Variable} keepalived-service-type
This is the type for the @uref{https://www.keepalived.org/, Keepalived}
routing software, @command{keepalived}.  Its value must be an
@code{keepalived-configuration} record as in this example for master
machine:

@lisp
(service keepalived-service-type
         (keepalived-configuration
           (config-file (local-file "keepalived-master.conf"))))
@end lisp

where @file{keepalived-master.conf}:

@example
vrrp_instance my-group @{
  state MASTER
  interface enp9s0
  virtual_router_id 100
  priority 100
  unicast_peer @{ 10.0.0.2 @}
  virtual_ipaddress @{
    10.0.0.4/24
  @}
@}
@end example

and for backup machine:

@lisp
(service keepalived-service-type
         (keepalived-configuration
          (config-file (local-file "keepalived-backup.conf"))))
@end lisp

where @file{keepalived-backup.conf}:

@example
vrrp_instance my-group @{
  state BACKUP
  interface enp9s0
  virtual_router_id 100
  priority 99
  unicast_peer @{ 10.0.0.3 @}
  virtual_ipaddress @{
    10.0.0.4/24
  @}
@}
@end example
@end deffn

@node Actualizaciones no-atendidas
@subsection Actualizaciones no-atendidas

@cindex actualizaciones desatendidas
@cindex desatendidas, actualizaciones
Guix proporciona un servicio para realizar @emph{actualizaciones
desatendidas}: periodicamente el sistema se reconfigura automáticamente con
la última revisión de Guix. El sistema Guix tiene varias propiedades que
hacen que las actualizaciones desatendidas sean seguras:

@itemize
@item
las actualizaciones son transaccionales (o bien la actualización se lleva a
cabo con éxito o bien falla, pero no puede acabar en un estado
``intermedio'' del sistema);
@item
el registro de actualizaciones se mantiene---puede acceder a dicho registro
con @command{guix system list-generations}---y puede volver a una generación
previa, en caso de que alguna generación no funcione como desee;
@item
el código del canal se verifica de modo que únicamente pueda ejecutar código
que ha sido firmado (@pxref{Canales});
@item
@command{guix system reconfigure} evita la instalación de versiones previas,
que lo hace inmune a @dfn{ataques de versión anterior}.
@end itemize

Para configurar las actualizaciones desatendidas, añada una instancia de
@code{unattended-upgrade-service-type} como la que se muestra a continuación
a la lista de servicios de su sistema operativo:

@lisp
(service unattended-upgrade-service-type)
@end lisp

El valor predeterminado configura actualizaciones semanales: cada domingo a
medianoche. No es necesario que proporcione el archivo de configuración de
su sistema operativo: el servicio usa
@file{/run/current-system/configuration.scm}, lo que asegura el uso de su
última configuración---@pxref{provenance-service-type}, para obtener más
información sobre este archivo.

Hay varios aspectos que se pueden configurar, en particular la periodicidad
y los servicios (daemon) que se reiniciarán tras completar la
actualización. Cuando la actualización se lleva a cabo satisfactoriamente el
servicio se encarga de borrar las generaciones del sistema cuya antigüedad
es superior a determinado valor, usando @command{guix system
delete-generations}. Véase la referencia a continuación para obtener más
detalles.

Para asegurar que las actualizaciones se están levando a cabo realmente,
puede ejecutar @command{guix system describe}. Para investigar fallos en las
actualizaciones, visite el archivo de registro de las actualizaciones
desatendidas (véase a continuación).

@defvr {Variable Scheme} unattended-upgrade-service-type
Es el tipo de servicio para las actualizaciones desatendidas. Configura un
trabajo de mcron (@pxref{Ejecución de tareas programadas}) que ejecuta @command{guix
system reconfigure} a partir de la última versión de los canales
especificados.

Su valor debe ser un registro @code{unattended-upgrade-configuration} (véase
a continuación).
@end defvr

@deftp {Tipo de datos} unattended-upgrade-configuration
Este tipo de datos representa la configuración del servicio de
actualizaciones desatendidas. Los siguientes campos están disponibles:

@table @asis
@item @code{schedule} (predeterminada: @code{"30 01 * * 0"})
La planificación de las actualizaciones, expresada en una expresión-G que
contiene una planificación de trabajo de mcron (@pxref{Syntax, mcron job
specifications,, mcron, GNU@tie{}mcron}).

@item @code{channels} (predeterminada: @code{#~%default-channels})
Esta expresión-G especifica los canales usados para la actualización
(@pxref{Canales}). De manera predeterminada, se usa la última revisión del
canal oficial @code{guix}.

@item @code{operating-system-file} (predeterminado: @code{"/run/current-system/configuration.scm"})
Este campo especifica el archivo de configuración del sistema operativo
usado. El valor predeterminado reutiliza el archivo de configuración de la
configuración actual.

No obstante hay casos en los que no es suficiente hacer referencia a
@file{/run/current-system/configuration.scm}, por ejemplo porque dicho
archivo hace referencia a archivos adicionales (claves públicas de SSH,
archivos de configuración adicionales, etcétera) a través de
@code{local-file} y construcciones similares. Para estos casos recomendamos
una configuración parecida a esta:

@lisp
(unattended-upgrade-configuration
  (operating-system-file
    (file-append (local-file "." "config-dir" #:recursive? #t)
                 "/config.scm")))
@end lisp

El efecto que esto tiene es la importación del directorio actual al completo
en el almacén, y hace referencia a @file{config.scm} dentro de dicho
directorio. Por lo tanto, los usos de @code{local-file} dentro de
@file{config.scm} funcionarán como se espera.  @xref{Expresiones-G} para más
información acerca de @code{local-file} y @code{file-append}.

@item @code{services-to-restart} (predeterminados: @code{'(mcron)})
Este campo especifica los servicios de Shepherd que se reiniciarán cuando se
complete una actualización.

Estos servicios se reinician tras completarse la actualización, como
ejecutando @command{herd restart}, lo que asegura la ejecución de la última
versión---recuerde que de manera predeterminada @command{guix system
reconfigure} únicamente reinicia los servicios que no se están ejecutando en
este momento, lo que es una aproximación conservadora: minimiza la
disrupción pero mantiene servicios en ejecución con código previo a la
actualización.

Use @command{herd status} to find out candidates for restarting.
@xref{Servicios}, for general information about services.  Common services to
restart would include @code{ntpd} and @code{ssh-daemon}.

De manera predeterminada se reinicia el servicio @code{mcron}. Esto asegura
que la última versión del trabajo de actualización desatendida será la que
se use la próxima vez.

@item @code{system-expiration} (predeterminado: @code{(* 3 30 24 3600)})
Tiempo de expiración en segundos de las generaciones del sistema. Las
generaciones del sistema cuya antigüedad sea mayor que esta cantidad de
tiempo se borran con @command{guix system delete-generations} cuando se
completa una actualización.

@quotation Nota
El servicio de actualizaciones desatendidas no ejecuta el proceso de
recolección de basura. Probablemente quiera añadir su propio trabajo a mcron
para ejecutar @command{guix gc} de manera periódica.
@end quotation

@item @code{maximum-duration} (predeterminado: @code{3600})
Duración máxima en segundos de la actualización; tras pasar este tiempo se
aborta la actualización.

Esto es útil principalmente para asegurar que una actualización no
reconstruye o vuelve a descargarse ``el mundo entero''.

@item @code{log-file} (predeterminado: @code{"/var/log/unattended-upgrade.log"})
Archivo donde se registran las actualizaciones desatendidas.
@end table
@end deftp

@node Sistema X Window
@subsection Sistema X Window

@cindex X11
@cindex sistema X Window
@cindex gestor de ingreso en el sistema
El sistema gráfico X Window---específicamente Xorg---se proporciona en el
módulo @code{(gnu services xorg)}. Fíjese que no existe un procedimiento
@code{xorg-service}. En vez de eso, el servidor X se inicia por el
@dfn{gestor de ingreso al sistema}, de manera predeterminada el gestor de
acceso de GNOME (GDM).

@cindex GDM
@cindex GNOME, gestor de ingreso al sistema
@anchor{gdm}
GDM por supuesto que permite a las usuarias ingresar al sistema con gestores
de ventanas y entornos de escritorio distintos a GNOME; para aquellas que
usan GNOME, GDM es necesario para características como el bloqueo automático
de pantalla.

@cindex gestor de ventanas
Para usar X11, debe instalar al menos un @dfn{gestor de ventanas}---por
ejemplo los paquetes @code{windowmaker} o @code{openbox}---, preferiblemente
añadiendo el que desee al campo @code{packages} de su definición de sistema
operativo (@pxref{Referencia de operating-system, paquetes del sistema}).

@anchor{wayland-gdm}
GDM also supports Wayland: it can itself use Wayland instead of X11 for its
user interface, and it can also start Wayland sessions.  The former is
required for the latter, to enable, set @code{wayland?} to @code{#t} in
@code{gdm-configuration}.

@defvr {Variable Scheme} gdm-service-type
Este es el tipo para el @uref{https://wiki.gnome.org/Projects/GDM/, gestor
de acceso de GNOME} (GDM), un programa que gestiona servidores gráficos y
maneja de forma gráfica el ingreso al sistema de usuarias. Su valor debe ser
un@code{gdm-configuration} (véase a continuación). 

@cindex session types
GDM looks for @dfn{session types} described by the @file{.desktop} files in
@file{/run/current-system/profile/share/xsessions} (for X11 sessions) and
@file{/run/current-system/profile/share/wayland-sessions} (for Wayland
sessions) and allows users to choose a session from the log-in screen.
Packages such as @code{gnome}, @code{xfce}, @code{i3} and @code{sway}
provide @file{.desktop} files; adding them to the system-wide set of
packages automatically makes them available at the log-in screen.

Además, se respetan los archivos @file{~/.xsession}. Cuando esté disponible,
@file{~/.xsession} debe ser un ejecutable que inicie un gestor de ventanas
y/o otros clientes de X.
@end defvr

@deftp {Tipo de datos} gdm-configuration
@table @asis
@item @code{auto-login?} (predeterminado: @code{#f})
@itemx @code{default-user} (predeterminado: @code{#f})
Cuando @code{auto-login?} es falso, GDM presenta una pantalla de ingreso.

Cuando @code{auto-login?} es verdadero, GDM ingresa directamente al sistema
como @code{default-user}.

@item @code{auto-suspend?} (default @code{#t})
When true, GDM will automatically suspend to RAM when nobody is physically
connected.  When a machine is used via remote desktop or SSH, this should be
set to false to avoid GDM interrupting remote sessions or rendering the
machine unavailable.

@item @code{debug?} (predeterminado: @code{#f})
Cuando tiene valor verdadero, GDM escribe los mensajes de depuración en su
registro.

@item @code{gnome-shell-assets} (predeterminados: ...)
Lista de activos de GNOME Shell necesarios para GDM: tema de iconos,
fuentes, etc.cc

@item @code{xorg-configuration} (predeterminada: @code{(xorg-configuration)})
Configuración del servidor gráfico Xorg.

@item @code{x-session} (default: @code{(xinitrc)})
Guión a ejecutar antes de iniciar una sesión X.

@item @code{xdmcp?} (default: @code{#f})
When true, enable the X Display Manager Control Protocol (XDMCP).  This
should only be enabled in trusted environments, as the protocol is not
secure.  When enabled, GDM listens for XDMCP queries on the UDP port 177.

@item @code{dbus-daemon} (predeterminado: @code{dbus-daemon-wrapper})
El nombre de archivo del ejecutable @code{dbus-daemon}.

@item @code{gdm} (predeterminado: @code{gdm})
El paquete GDM usado.

@item @code{wayland?} (default: @code{#f})
When true, enables Wayland in GDM, necessary to use Wayland sessions.

@item @code{wayland-session} (default: @code{gdm-wayland-session-wrapper})
The Wayland session wrapper to use, needed to setup the environment.
@end table
@end deftp

@defvr {Variable Scheme} slim-service-type
Este es el tipo para el gestor de ingreso al sistema gráfico para X11 SLiM.

Como GDM, SLiM busca tipos de sesión descritos por archivos @file{.desktop}
y permite a las usuarias la selección de sesión en la pantalla de ingreso al
sistema mediante el uso de @kbd{F1}. También respeta los archivos
@file{~/.xsession}.

Al contrario que GDM, SLiM no lanza las sesiones de las usuarias en
terminales virtuales diferentes al usado para el ingreso, lo que significa
que únicamente puede iniciar una sesión gráfica. Si desea ejecutar varias
sesiones gráficas de manera simultánea, debe añadir múltiples servicios de
SLiM a los servicios de su sistema. El ejemplo siguiente muestra cómo
sustituir el servicio GDM predeterminado con dos servicios de SLiM en tty7 y
tty8.

@lisp
(use-modules (gnu services)
             (gnu services desktop)
             (gnu services xorg))

(operating-system
  ;; ...
  (services (cons* (service slim-service-type (slim-configuration
                                               (display ":0")
                                               (vt "vt7")))
                   (service slim-service-type (slim-configuration
                                               (display ":1")
                                               (vt "vt8")))
                   (modify-services %desktop-services
                     (delete gdm-service-type)))))
@end lisp

@end defvr

@deftp {Tipo de datos} slim-configuration
Tipo de datos que representa la configuración de @code{slim-service-type}.

@table @asis
@item @code{allow-empty-passwords?} (predeterminado: @code{#t})
Si se permite el ingreso al sistema con contraseñas vacías.

@item @code{gnupg?} (default: @code{#f})
If enabled, @code{pam-gnupg} will attempt to automatically unlock the user's
GPG keys with the login password via @code{gpg-agent}.  The keygrips of all
keys to be unlocked should be written to @file{~/.pam-gnupg}, and can be
queried with @code{gpg -K --with-keygrip}.  Presetting passphrases must be
enabled by adding @code{allow-preset-passphrase} in
@file{~/.gnupg/gpg-agent.conf}.

@item @code{auto-login?} (predeterminado: @code{#f})
@itemx @code{default-user} (predeterminado: @code{""})
Cuando @code{auto-login?} es falso, SLiM presenta una pantalla de ingreso.

Cuando @code{auto-login?} es verdadero, SLiM ingresa en el sistema
directamente como @code{default-user}.

@item @code{theme} (predeterminado: @code{%default-slim-theme})
@itemx @code{theme-name} (predeterminado: @code{%default-slim-theme-name})
El tema gráfico usado y su nombre.

@item @code{auto-login-session} (predeterminado: @code{#f})
Si es verdadero, debe ser el nombre del ejecutable a arrancar como la sesión
predeterminada---por ejemplo, @code{(file-append windowmaker
"/bin/windowmaker")}.

Si es falso, se usará una sesión de las descritas en uno de los archivos
@file{.desktop} disponibles en @code{/run/current-system/profile} y
@code{~/.guix-profile}.

@quotation Nota
Debe instalar al menos un gestor de ventanas en el perfil del sistema o en
su perfil de usuaria. En caso de no hacerlo, si @code{auto-login-session} es
falso, no podrá ingresar al sistema.
@end quotation

@item @code{xorg-configuration} (predeterminada @code{(xorg-configuration)})
Configuración del servidor gráfico Xorg.

@item @code{display} (predeterminada: @code{":0"})
La pantalla en la que se iniciará el servidor gráfico Xorg.

@item @code{vt} (predeterminado: @code{"vt7"})
El terminal virtual (VT) en el que se iniciará el servidor gráfico Xorg.

@item @code{xauth} (predeterminado: @code{xauth})
El paquete XAuth usado.

@item @code{shepherd} (predeterminado: @code{shepherd})
El paquete de Shepherd usado para la invocación de @command{halt} y
@command{reboot}.

@item @code{sessreg} (predeterminado: @code{sessreg})
El paquete sessreg usado para el registro de la sesión.

@item @code{slim} (predeterminado: @code{slim})
El paquete SLiM usado.
@end table
@end deftp

@defvr {Variable Scheme} %default-theme
@defvrx {Variable Scheme} %default-theme-name
El tema predeterminado de SLiM y su nombre.
@end defvr


@cindex gestor de ingreso en el sistema
@cindex X11, ingreso al sistema
@defvr {Variable Scheme} sddm-service-type
Es el tipo del servicio que ejecuta el @uref{https://github.com/sddm/sddm,
gestor de entrada SDDM}. Su valor es un registro @code{sddm-configuration}
(véase a continuación).

Este es un ejemplo de su uso:

@lisp
(service sddm-service-type
         (sddm-configuration
           (auto-login-user "alicia")
           (auto-login-session "xfce.desktop")))
@end lisp
@end defvr

@deftp {Tipo de datos} sddm-configuration
Este tipo de datos representa la configuración del gestor de ingreso al
sistema SDDM. Los campos disponibles son:

@table @asis
@item @code{sddm} (predeterminado: @code{sddm})
El paquete SDDM usado.

@item @code{display-server} (predeterminado: "x11")
Selecciona el servidor de pantalla usado para el saludo. Los valores validos
son @samp{"x11"} o @samp{"wayland"}.

@item @code{numlock} (predeterminado: "on")
Son valores válidos @samp{"on"}, @samp{"off"} o @samp{"none"}.

@item @code{halt-command} (default @code{#~(string-append #$shepherd "/sbin/halt")})
Orden a ejecutar para parar el sistema.

@item @code{reboot-command} (predeterminado @code{#~(string-append #$shepherd "/sbin/reboot")})
Orden a ejecutar para reiniciar el sistema.

@item @code{theme} (predeterminado "maldives")
Tema usado. Los temas predeterminados proporcionados por SDDM son
@samp{"elarun"}, @samp{"maldives"} o @samp{"maya"}.

@item @code{themes-directory} (predeterminado "/run/current-system/profile/share/sddm/themes")
Directorio en el que buscar temas.

@item @code{faces-directory} (predeterminado "/run/current-system/profile/share/sddm/faces")
Directorio en el que buscar caras.

@item @code{default-path} (predeterminado "/run/current-system/profile/bin")
El valor predeterminado del PATH.

@item @code{minimum-uid} (predeterminado: 1000)
UID mínimo mostrado en SDDM y al que se le permite el acceso.

@item @code{maximum-uid} (predeterminado: 2000)
UID máximo mostrado en SDDM.

@item @code{remember-last-user?} (predeterminado #t)
Recuerda la última usuaria.

@item @code{remember-last-session?} (predeterminado #t)
Recuerda la última sesión.

@item @code{hide-users} (predeterminado "")
Nombres de usuaria a ocultar de la pantalla de inicio de SDDM.

@item @code{hide-shells} (predeterminado @code{#~(string-append #$shadow "/sbin/nologin")})
Las usuarias que tengan alguno de los shell enumerados se ocultarán de la
pantalla de inicio de SDDM.

@item @code{session-command} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/wayland-session")})
Guión a ejecutar antes de iniciar una sesión wayland.

@item @code{sessions-directory} (predeterminado "/run/current-system/profile/share/wayland-sessions")
Directorio en el que buscar archivos desktop que inicien sesiones wayland.

@item @code{xorg-configuration} (predeterminada @code{(xorg-configuration)})
Configuración del servidor gráfico Xorg.

@item @code{xauth-path} (predeterminado @code{#~(string-append #$xauth "/bin/xauth")})
Ruta de xauth.

@item @code{xephyr-path} (predeterminado @code{#~(string-append #$xorg-server "/bin/Xephyr")})
Ruta de Xephyr.

@item @code{xdisplay-start} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/Xsetup")})
Guión a ejecutar tras iniciar xorg-server.

@item @code{xdisplay-stop} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/Xstop")})
Guión a ejecutar antes de parar xorg-server.

@item @code{xsession-command} (predeterminado: @code{xinitrc})
Guión a ejecutar antes de iniciar una sesión X.

@item @code{xsessions-directory} (predeterminado: "/run/current-system/profile/share/xsessions")
Directorio para buscar archivos desktop que inicien sesiones X.

@item @code{minimum-vt} (predeterminado: 7)
VT mínimo usado.

@item @code{auto-login-user} (predeterminado "")
User account that will be automatically logged in.  Setting this to the
empty string disables auto-login.

@item @code{auto-login-session} (predeterminado "")
The @file{.desktop} file name to use as the auto-login session, or the empty
string.

@item @code{relogin?} (predeterminado #f)
Volver a ingresar en el sistema tras salir.

@end table
@end deftp

@cindex lightdm, graphical login manager
@cindex display manager, lightdm
@anchor{lightdm}
@defvr {Scheme Variable} lightdm-service-type
This is the type of the service to run the
@url{https://github.com/canonical/lightdm,LightDM display manager}.  Its
value must be a @code{lightdm-configuration} record, which is documented
below.  Among its distinguishing features are TigerVNC integration for
easily remoting your desktop as well as support for the XDMCP protocol,
which can be used by remote clients to start a session from the login
manager.

In its most basic form, it can be used simply as:

@lisp
(service lightdm-service-type)
@end lisp

A more elaborate example making use of the VNC capabilities and enabling
more features and verbose logs could look like:

@lisp
(service lightdm-service-type
         (lightdm-configuration
          (allow-empty-passwords? #t)
          (xdmcp? #t)
          (vnc-server? #t)
          (vnc-server-command
           (file-append tigervnc-server "/bin/Xvnc"
                        "  -SecurityTypes None"))
          (seats
           (list (lightdm-seat-configuration
                  (name "*")
                  (user-session "ratpoison"))))))
@end lisp
@end defvr

@c The LightDM service documentation can be auto-generated via the
@c 'generate-doc' procedure at the bottom of the (gnu services lightdm)
@c module.
@c %start of fragment
@deftp {Data Type} lightdm-configuration
Available @code{lightdm-configuration} fields are:

@table @asis
@item @code{lightdm} (default: @code{lightdm}) (type: file-like)
The lightdm package to use.

@item @code{allow-empty-passwords?} (default: @code{#f}) (type: boolean)
Whether users not having a password set can login.

@item @code{debug?} (default: @code{#f}) (type: boolean)
Enable verbose output.

@item @code{xorg-configuration} (type: xorg-configuration)
The default Xorg server configuration to use to generate the Xorg server
start script.  It can be refined per seat via the @code{xserver-command} of
the @code{<lightdm-seat-configuration>} record, if desired.

@item @code{greeters} (type: list-of-greeter-configurations)
The LightDM greeter configurations specifying the greeters to use.

@item @code{seats} (type: list-of-seat-configurations)
The seat configurations to use.  A LightDM seat is akin to a user.

@item @code{xdmcp?} (default: @code{#f}) (type: boolean)
Whether a XDMCP server should listen on port UDP 177.

@item @code{xdmcp-listen-address} (type: maybe-string)
The host or IP address the XDMCP server listens for incoming connections.
When unspecified, listen on for any hosts/IP addresses.

@item @code{vnc-server?} (default: @code{#f}) (type: boolean)
Whether a VNC server is started.

@item @code{vnc-server-command} (type: file-like)
The Xvnc command to use for the VNC server, it's possible to provide extra
options not otherwise exposed along the command, for example to disable
security:

@lisp
(vnc-server-command (file-append tigervnc-server "/bin/Xvnc"
                                 " -SecurityTypes None" ))
@end lisp

Or to set a PasswordFile for the classic (unsecure) VncAuth mecanism:

@lisp
(vnc-server-command (file-append tigervnc-server "/bin/Xvnc"
                                 " -PasswordFile /var/lib/lightdm/.vnc/passwd"))
@end lisp

The password file should be manually created using the @command{vncpasswd}
command.  Note that LightDM will create new sessions for VNC users, which
means they need to authenticate in the same way as local users would.

@item @code{vnc-server-listen-address} (type: maybe-string)
The host or IP address the VNC server listens for incoming connections.
When unspecified, listen for any hosts/IP addresses.

@item @code{vnc-server-port} (default: @code{5900}) (type: number)
The TCP port the VNC server should listen to.

@item @code{extra-config} (default: @code{()}) (type: list-of-strings)
Extra configuration values to append to the LightDM configuration file.

@end table
@end deftp


@c %end of fragment
@c %start of fragment

@deftp {Data Type} lightdm-gtk-greeter-configuration
Available @code{lightdm-gtk-greeter-configuration} fields are:

@table @asis
@item @code{lightdm-gtk-greeter} (default: @code{lightdm-gtk-greeter}) (type: file-like)
The lightdm-gtk-greeter package to use.

@item @code{assets} @
(default: @code{(adwaita-icon-theme gnome-themes-extrahicolor-icon-theme)})
@ (type: list-of-file-likes)  The list of packages complementing the
greeter, such as package providing icon themes.

@item @code{theme-name} (default: @code{"Adwaita"}) (type: string)
The name of the theme to use.

@item @code{icon-theme-name} (default: @code{"Adwaita"}) (type: string)
The name of the icon theme to use.

@item @code{cursor-theme-name} (default: @code{"Adwaita"}) (type: string)
The name of the cursor theme to use.

@item @code{cursor-theme-size} (default: @code{16}) (type: number)
The size to use for the cursor theme.

@item @code{allow-debugging?} (type: maybe-boolean)
Set to #t to enable debug log level.

@item @code{background} (type: file-like)
The background image to use.

@item @code{at-spi-enabled?} (default: @code{#f}) (type: boolean)
Enable accessibility support through the Assistive Technology Service
Provider Interface (AT-SPI).

@item @code{a11y-states} @
(default: @code{(contrast font keyboard reader)}) (type:
list-of-a11y-states)  The accessibility features to enable, given as list of
symbols.

@item @code{reader} (type: maybe-file-like)
The command to use to launch a screen reader.

@item @code{extra-config} (default: @code{()}) (type: list-of-strings)
Extra configuration values to append to the LightDM GTK Greeter
configuration file.

@end table
@end deftp

@c %end of fragment
@c %start of fragment

@deftp {Data Type} lightdm-seat-configuration
Available @code{lightdm-seat-configuration} fields are:

@table @asis
@item @code{name} (type: seat-name)
The name of the seat.  An asterisk (*) can be used in the name to apply the
seat configuration to all the seat names it matches.

@item @code{user-session} (type: maybe-string)
The session to use by default.  The session name must be provided as a
lowercase string, such as @code{"gnome"}, @code{"ratpoison"}, etc.

@item @code{type} (default: @code{local}) (type: seat-type)
The type of the seat, either the @code{local} or @code{xremote} symbol.

@item @code{autologin-user} (type: maybe-string)
The username to automatically log in with by default.

@item @code{greeter-session} @
(default: @code{lightdm-gtk-greeter}) (type: greeter-session)  The greeter
session to use, specified as a symbol.  Currently, only
@code{lightdm-gtk-greeter} is supported.

@item @code{xserver-command} (type: maybe-file-like)
The Xorg server command to run.

@item @code{session-wrapper} (type: file-like)
The xinitrc session wrapper to use.

@item @code{extra-config} (default: @code{()}) (type: list-of-strings)
Extra configuration values to append to the seat configuration section.

@end table
@end deftp
@c %end of fragment


@cindex Xorg, configuración
@deftp {Tipo de datos} xorg-configuration
This data type represents the configuration of the Xorg graphical display
server.  Note that there is no Xorg service; instead, the X server is
started by a ``display manager'' such as GDM, SDDM, LightDM or SLiM@.  Thus,
the configuration of these display managers aggregates an
@code{xorg-configuration} record.

@table @asis
@item @code{modules} (predeterminados: @code{%default-xorg-modules})
Esta es la lista de @dfn{paquetes de módulos} cargados por el servidor
Xorg---por ejemplo, @code{xf86-video-vesa}, @code{xf86-input-keyboard},
etcétera.

@item @code{fonts} (predeterminadas: @code{%default-xorg-fonts})
Es una lista de directorios de tipografías a añadir a la @dfn{ruta de
tipografías} del servidor.

@item @code{drivers} (predeterminados: @code{'()})
Debe ser o bien la lista vacía, en cuyo caso Xorg selecciona el controlador
gráfico automáticamente, o una lista de nombres de controladores que se
intentarán en el orden especificado---por ejemplo, @code{("modesetting"
"vesa")}.

@item @code{resolutions} (predeterminadas: @code{'()})
Cuando @code{resolutions} es la lista vacía, Xorg selecciona una resolución
de pantalla adecuada. En otro caso, debe ser una lista de resoluciones---por
ejemplo, @code{((1024 768) (640 480))}.

@cindex distribución de teclado, para Xorg
@cindex mapa de teclas, para Xorg
@item @code{keyboard-layout} (predeterminada: @code{#f})
Si es @code{#f}, Xorg usa la distribución de teclado
predeterminada---normalmente inglés de EEUU (``qwerty'') para un teclado de
PC de 105 teclas.

En otro caso, debe ser un objeto @code{keyboard-layout} que especifique la
distribución de teclado usada para la ejecución de Xorg. @xref{Distribución de teclado}, para más información sobre cómo especificar la distribución de
teclado.

@item @code{extra-config} (predeterminada: @code{'()})
Es una lista de cadenas u objetos añadida al final del archivo de
configuración. Se usa para proporcionar texto adicional para ser introducido
de forma literal en el archivo de configuración.

@item @code{server} (predeterminado: @code{xorg-server})
Este es el paquete que proporciona el servidor Xorg.

@item @code{server-arguments} (predeterminados: @code{%default-xorg-server-arguments})
Es la lista de parámetros de línea de órdenes que se proporcionarán al
servidor X. El valor predeterminado es @code{-nolisten tcp}.
@end table
@end deftp

@deffn {Procedimiento Scheme} set-xorg-configuration @var{config} @
  [@var{tipo-de-servicio-del-gestor-de-pantalla}]

Le dice al gestor de pantalla (de tipo
@var{tipo-de-servicio-del-gestor-de-pantalla}) que use @var{config}, un
registro @code{<xorg-configuration>}.

Debido a que la configuración de Xorg se embebe en la configuración del
gestor de ingreso en el sistema---por ejemplo,
@code{gdm-configuration}---este procedimiento proporciona un atajo para
establecer la configuración de Xorg.
@end deffn

@deffn {Procedimiento Scheme} xorg-start-command [@var{config}]
Devuelve un script @code{startx} en el que los módulos, las tipografías,
etcétera, especificadas en @var{config} están disponibles. El resultado debe
usarse en lugar de @code{startx}.

Habitualmente el servidor X es iniciado por un gestor de ingreso al sistema.
@end deffn


@deffn {Procedimiento Scheme} screen-locker-service @var{paquete} [@var{programa}]
Añade @var{paquete}, un paquete para un bloqueador de sesión o un
salvapantallas cuya orden es @var{programa}, al conjunto de programas setuid
y añade una entrada PAM para él. Por ejemplo:

@lisp
(screen-locker-service xlockmore "xlock")
@end lisp

permite usar el viejo XlockMore.
@end deffn


@node Servicios de impresión
@subsection Servicios de impresión

@cindex uso de impresoras mediante CUPS
El módulo @code{(gnu services cups)} proporciona una definición de servicio
Guix para el servicio de impresión CUPS. Para usar impresoras en un sistema
Guix, añada un servicio @code{cups-service} en su definición de sistema
operativo:

@deffn {Variable Scheme} cups-service-type
El tipo de servicio para el servidor de impresión CUPS. Su valor debe ser
una configuración de CUPS válida (véase a continuación). Para usar la
configuración predeterminada, simplemente escriba:
@lisp
(service cups-service-type)
@end lisp
@end deffn

La configuración de CUPS controla los aspectos básicos de su instalación de
CUPS: sobre qué interfaces se escuchará, qué hacer si falla un trabajo de
impresión, cuanta información registrar, etcétera. Para realmente añadir una
impresora, debe visitar la URL @url{http://localhost:631}, o usar una
herramienta como los servicios de configuración de impresión de GNOME. De
manera predeterminada, la configuración de un servicio CUPS generará un
certificado auto-firmado en caso de ser necesario, para ofrecer conexiones
seguras con el servidor de impresión.

Suppose you want to enable the Web interface of CUPS and also add support
for Epson printers @i{via} the @code{epson-inkjet-printer-escpr} package and
for HP printers @i{via} the @code{hplip-minimal} package.  You can do that
directly, like this (you need to use the @code{(gnu packages cups)} module):

@lisp
(service cups-service-type
         (cups-configuration
           (web-interface? #t)
           (extensions
             (list cups-filters epson-inkjet-printer-escpr hplip-minimal))))
@end lisp

@quotation Nota
If you wish to use the Qt5 based GUI which comes with the hplip package then
it is suggested that you install the @code{hplip} package, either in your OS
configuration file or as your user.
@end quotation

A continuación se encuentran los parámetros de configuración disponibles. El
tipo de cada parámetro antecede la definición del mismo; por ejemplo,
@samp{string-list foo} indica que el parámetro @code{foo} debe especificarse
como una lista de cadenas. También existe la posibilidad de especificar la
configuración como una cadena, si tiene un archivo @code{cupsd.conf} antiguo
que quiere trasladar a otro sistema; véase el final para más detalles.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services cups).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as CUPS updates.


Los campos disponibles de @code{cups-configuration} son:

@deftypevr {parámetro de @code{cups-configuration}} package cups
El paquete CUPS.
@end deftypevr

@deftypevr {@code{cups-configuration} parameter} package-list extensions (default: @code{(list brlaser cups-filters epson-inkjet-printer-escpr foomatic-filters hplip-minimal splix)})
Controladores y otras extensiones al paquete CUPS.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} archivos-conf files-configuration
Configuración sobre dónde escribir los registros, qué directorios usar para
las colas de impresión y parámetros de configuración privilegiados
relacionados.

Los campos disponibles de @code{files-configuration} son:

@deftypevr {parámetro de @code{files-configuration}} ruta-registro access-log
Define el nombre de archivo del registro de acceso. La especificación de un
nombre de archivo en blanco desactiva la generación de registros de
acceso. El valor @code{stderr} hace que las entradas de registro se envíen
al archivo de la salida estándar de error cuando el planificador se ejecute
en primer plano, o al daemon de registro del sistema cuando se ejecute en
segundo plano. El valor @code{syslog} envía las entradas de registro al
daemon de registro del sistema. El nombre de servidor puede incluirse en los
nombres de archivo mediante el uso de la cadena @code{%s}, como en
@code{/var/log/cups/%s-access_log}.

El valor predeterminado es @samp{"/var/log/cups/access_log"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} nombre-archivo cache-dir
Donde CUPS debe almacenar los datos de la caché.

El valor predeterminado es @samp{"/var/cache/cups"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string config-file-perm
Especifica los permisos para todos los archivos de configuración que escriba
el planficador.

Tenga en cuenta que los permisos para el archivo printers.conf están
configurados actualmente de modo que únicamente la usuaria del planificador
(habitualmente root) tenga acceso. Se hace de esta manera debido a que las
URI de las impresoras a veces contienen información sensible sobre la
identificación que no debería conocerse de manera general en el sistema. No
hay forma de desactivar esta característica de seguridad.

El valor predeterminado es @samp{"0640"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} ruta-registro error-log
Define el nombre de archivo del registro de error. La especificación de un
nombre de archivo en blanco desactiva la generación de registros de
error. El valor @code{stderr} hace que las entradas del registro se envíen
al archivo de la salida de error estándar cuando el planificador se ejecute
en primer plano, o al daemon de registro del sistema cuando se ejecute en
segundo plano. El valor @code{syslog} provoca que las entradas del registro
se envíen al daemon de registro del sistema. El nombre del servidor puede
incluirse en los nombres de archivo mediante el uso de la cadena @code{%s},
como en @code{/var/log/cups/%s-error_log}.

El valor predeterminado es @samp{"/var/log/cups/error_log"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string fatal-errors
Especifica qué errores son fatales, los cuales provocan la salida del
planificador. El tipo de cadenas son:

@table @code
@item none
Ningún error es fatal.

@item all
Todos los errores a continuación son fatales.

@item browse
Los errores de la inicialización de exploración son fatales, por ejemplo las
conexiones fallidas al daemon DNS-SD.

@item config
Los errores de sintaxis en el archivo de configuración son fatales.

@item listen
Los errores de escucha o de puertos son fatales, excepto fallos IPv6 en la
red local o en direcciones @code{any}.

@item log
Los errores de creación o escritura en el archivo de registros son fatales.

@item permissions
La mala configuración de los permisos de los archivos al inicio son fatales,
por ejemplo certificados TLS compartidos y archivos de claves con permisos
de escritura para todo el mundo.
@end table

El valor predeterminado es @samp{"all -browse"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} boolean file-device?
Especifica si el pseudo-dispositivo del archivo puede usarse para nuevas
colas de impresión. Siempre se permite la URI @uref{file:///dev/null}.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string group
Especifica el nombre de grupo o ID usado para la ejecución de programas
externos.

El valor predeterminado es @samp{"lp"}.
@end deftypevr

@deftypevr {@code{files-configuration} parameter} string log-file-group
Specifies the group name or ID that will be used for log files.

Defaults to @samp{"lpadmin"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string log-file-perm
Especifica los permisos para todos los archivos de registro que el
planificador escriba.

El valor predeterminado es @samp{"0644"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} ruta-registro page-log
Define el nombre de archivo del registro de páginas. La especificación de un
nombre de archivo en blanco desactiva la generación de registro de
páginas. El valor @code{stderr} hace que las entradas del registro se envíen
al archivo de la salida de error cuando el planificador se ejecute en primer
plano, o al daemon de registro del sistema cuando se ejecuten en segundo
plano. El valor @code{syslog} provoca que las entradas del registro se
envíen al daemon de registro del sistema. El nombre del servidor puede
incluirse en los nombres de archivo mediante el uso de la cadena @code{%s},
como en @code{/var/log/cups/%s-page_log}.

El valor predeterminado es @samp{"/var/log/cups/page_log"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string remote-root
Especifica el nombre de la usuaria asociado con accesos sin identificación
por parte de clientes que digan ser la usuaria root. La usuaria
predeterminada es @code{remroot}.

El valor predeterminado es @samp{"remroot"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} nombre-archivo request-root
Especifica el directorio que contiene los trabajos de impresión y otros
datos de peticiones HTTP.

El valor predeterminado es @samp{"/var/spool/cups"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} aislamiento sandboxing
Especifica el nivel de seguridad del aislamiento (sandbox) que se aplica
sobre los filtros de impresión, motores y otros procesos lanzados por el
planificador; o bien @code{relaxed} o bien @code{strict}. Esta directiva
únicamente tiene uso actualmente en macOS.

El valor predeterminado es @samp{strict}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} nombre-archivo server-keychain
Especifica la localización de los certificados TLS y las claves
privadas. CUPS buscará claves públicas y privadas en este directorio: un
archivo @file{.crt} para certificados codificados con PEM y los
correspondientes archivo @file{.key} para las claves privadas codificadas
con PEM.

El valor predeterminado es @samp{"/etc/cups/ssl"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} nombre-archivo server-root
Especifica el directorio que contiene los archivos de configuración del
servidor.

El valor predeterminado es @samp{"/etc/cups"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} boolean sync-on-close?
Especifica si el planificador llama fsync(2) tras la escritura de los
archivos de configuración o estado.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} cadenas-separadas-por-espacios system-group
Especifica el o los grupos usados para la identificación del grupo
@code{@@SYSTEM}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} nombre-archivo temp-dir
Especifica el directorio donde se escriben los archivos temporales.

El valor predeterminado es @samp{"/var/spool/cups/tmp"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string user
Especifica el nombre de usuaria o ID usado para la ejecución de programas
externos.

El valor predeterminado es @samp{"lp"}.
@end deftypevr

@deftypevr {parámetro de @code{files-configuration}} string set-env
Establece el valor de la variable de entorno especificada que se
proporcionará a los procesos lanzados.

El valor predeterminado es @samp{"variable value"}.
@end deftypevr
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} nivel-registro-acceso access-log-level
Especifica el nivel de registro para el archivo AccessLog. El nivel
@code{config} registra la adición, borrado o modificación de impresoras y
clases, y el acceso y modificación de los archivos de configuración. El
nivel @code{actions} registra cuando los trabajos de impresión se envían,
mantienen a la espera, liberan, modifican o cancelan, además de todas las
condiciones de @code{config}. El nivel @code{all} registra todas las
peticiones.

El valor predeterminado es @samp{actions}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean auto-purge-jobs?
Especifica si se purgan los datos del histórico de trabajos de manera
automática cuando ya no son necesarios para las cuotas.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-cadenas-separada-comas browse-dns-sd-sub-types
Especifica una lista de subtipos de DNS-SD anunciados por cada impresora
compartida. Por ejemplo, @samp{"_cups" "_print"} le dirá a los clientes de
red que se implementa tanto la compartición con CUPS como IPP Everywhere.

El valor predeterminado es @samp{"_cups"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} protocolos browse-local-protocols
Especifica qué protocolos deben usarse para compartir las impresoras
locales.

El valor predeterminado es @samp{dnssd}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean browse-web-if?
Especifica si se anuncia la interfaz web de CUPS.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean browsing?
Especifica si se anuncian las impresoras compartidas.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string classification
Especifica la clasificación de seguridad del servidor. Se puede usar
cualquier nombre válido para anunciar la identificación del nivel de
seguridad, incluyendo @samp{"classified"}, @samp{"confidential"},
@samp{"secret"}, @samp{"topsecret"} y @samp{"unclassified"}, o el anuncio
puede omitirse para desactivar las funciones de impresión segura.

El valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean classify-override?
Especifica si las usuarias pueden modificar la clasificación (página de
portada) de trabajos de impresión individuales mediante el uso de la opción
@code{job-sheets}.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} tipo-id-pred default-auth-type
Especifica el tipo de identificación usado por omisión.

El valor predeterminado es @samp{Basic}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} cifrado-pred default-encryption
Especifica si se usará cifrado para peticiones con identificación.

El valor predeterminado es @samp{Required}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string default-language
Especifica el idioma predeterminado usado para el texto y contenido de la
web.

El valor predeterminado es @samp{"en"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} cadena default-paper-size
Especifica el tamaño predeterminado del papel para colas de impresión
nuevas. @samp{"Auto"} usa el valor predeterminado de la localización,
mientras que @samp{"None"} especifica que no hay un tamaño de papel
predeterminado. Los nombres de tamaños específicos habitualmente son
@samp{"Letter"} o @samp{"A4"}@footnote{NdT: @samp{Letter} es el formato
estándar de ANSI, de 215,9x279,4 milímetros de tamaño, mientras que A4 es el
formato estándar de ISO, de 210x297 milímetros de tamaño.}.

El valor predeterminado es @samp{"Auto"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string default-policy
Especifica la política de acceso usada por omisión.

El valor predeterminado es @samp{"default"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean default-shared?
Especifica si las impresoras locales se comparten de manera predeterminada.

El valor predeterminado es @samp{#t}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo dirty-clean-interval
Especifica el retraso para la actualización de los archivos de configuración
y estado, en segundo. Un valor de 0 hace que la actualización se lleve a
cabo tan pronto sea posible, en algunos milisegundos habitualmente.

El valor predeterminado es @samp{30}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} política-error error-policy
Especifica qué hacer cuando ocurra un error. Los valores posibles son
@code{abort-job}, que descartará el trabajo de impresión fallido;
@code{retry-job}, que intentará llevar de nuevo a cabo el trabajo en un
momento posterior; @code{retry-current-job}, que reintenta el trabajo que
falló de manera inmediata; y @code{stop-printer}, que para la impresora.

El valor predeterminado es @samp{stop-printer}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo filter-limit
Especifica el coste máximo de filtros que se ejecutan de manera concurrente,
lo que puede usarse para minimizar problemas de recursos de disco, memoria y
procesador. Un límite de 0 desactiva la limitación del filtrado. Una
impresión media con una impresora no-PostScript necesita una limitación del
filtrado de 200 más o menos. Una impresora PostScript necesita cerca de la
mitad (100). Establecer un límite por debajo de estos valores limitará de
forma efectiva al planificador a la ejecución de un único trabajo de
impresión en cualquier momento.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo filter-nice
Especifica la prioridad de planificación de los filtros que se ejecuten para
la impresión de un trabajo. El valor de ``nice'' va desde 0, la mayor
prioridad, a 19, la menor prioridad.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} búsqueda-nombres-máquina host-name-lookups
Especifica si se realizarán las búsquedas inversas en las conexiones de
clientes. La opción @code{double} instruye a @code{cupsd} para que verifique
que el nombre de máquina al que resuelve la dirección corresponde con la
dirección devuelta por dicho nombre de máquina. Las búsquedas dobles también
evitan que clientes con direcciones sin registrar se conecten a su
servidor. Configure esta opción con @code{#t} o @code{double} únicamente si
es absolutamente necesario.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo job-kill-delay
Especifica el número de segundos a esperar antes de terminar los filtros y
el motor asociados con un trabajo cancelado o puesto en espera.

El valor predeterminado es @samp{30}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo job-retry-interval
Especifica el intervalo entre los reintentos de trabajos en segundos. Se usa
de manera habitual en colas de fax pero también puede usarse con colas de
impresión normales cuya política de error sea @code{retry-job} o
@code{retry-current-job}.

El valor predeterminado es @samp{30}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo job-retry-limit
Especifica el número de reintentos que se llevan a cabo con los trabajos. De
manera habitual se usa con colas de fax pero también puede usarse con colas
de impresión normal cuya política de error sea @code{retry-job} o
@code{retry-current-job}.

El valor predeterminado es @samp{5}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean keep-alive?
Especifica si se permiten conexiones ``keep-alive'' de HTTP.

El valor predeterminado es @samp{#t}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo limit-request-body
Especifica el tamaño máximo de los archivos de impresión, peticiones IPP y
datos de formularios HTTP. Un límite de 0 desactiva la comprobación del
límite.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-cadenas-multilínea listen
Escucha a la espera de conexiones en las interfaces especificadas. Se
aceptan valores con la forma @var{dirección}:@var{puerto}, donde
@var{dirección} es o bien una dirección IPv6 entre corchetes, una dirección
IPv4 o @code{*} para indicar todas las direcciones. Los valores también
pueden ser nombres de archivo de sockets de dominio de UNIX locales. La
directiva ``Listen'' es similar a la directiva ``Port'', pero le permite la
restricción del acceso a interfaces o redes específicas.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo listen-back-log
Especifica el número de conexiones pendientes permitidas. Habitualmente
afecta de manera exclusiva a servidores con mucha carga de trabajo que han
alcanzado el límite de clientes ``MaxClients'', pero también puede ser
provocado por grandes números de conexiones simultaneas. Cuando se alcanza
el límite, el sistema operativo rechaza conexiones adicionales hasta que el
planificador pueda aceptar las pendientes.

El valor predeterminado es @samp{128}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-location-access-control location-access-controls
Especifica un conjunto adicional de controles de acceso.

Los campos disponibles de @code{location-access-controls} son:

@deftypevr {parámetro de @code{location-access-controls}} nombre-archivo path
Especifica la ruta URI sobre la que el control de acceso tendrá efecto.
@end deftypevr

@deftypevr {parámetro de @code{location-access-controls}} lista-access-control access-controls
Controles de acceso para todos los accesos a esta ruta, en el mismo formato
que @code{access-controls} de @code{operation-access-control}.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{location-access-controls}} lista-method-access-control method-access-controls
Controles de acceso para accesos con métodos específicos para esta ruta.

El valor predeterminado es @samp{()}.

Los campos disponibles de @code{method-access-controls} son:

@deftypevr {parámetro de @code{method-access-controls}} boolean reverse?
Si es @code{#t}, los controles de acceso son efectivos con todos los métodos
excepto los métodos listados. En otro caso, son efectivos únicamente con los
métodos listados.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{method-access-controls}} lista-métodos methods
Métodos con los cuales este control de acceso es efectivo.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{method-access-controls}} lista-control-acceso access-controls
Directivas de control de acceso, como una lista de cadenas. Cada cadena debe
ser una directiva, como @samp{"Order allow,deny"}.

El valor predeterminado es @samp{()}.
@end deftypevr
@end deftypevr
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo log-debug-history
Especifica el número de mensajes de depuración que se retienen para el
registro si sucede un error en un trabajo de impresión. Los mensajes de
depuración se registran independientemente de la configuración de
``LogLevel''.

El valor predeterminado es @samp{100}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} nivel-registro log-level
Especifica el nivel de depuración del archivo ``ErrorLog''. El valor
@code{none} inhibe todos los registros mientras que @code{debug2} registra
todo.

El valor predeterminado es @samp{info}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} formato-tiempo-registro log-time-format
Especifica el formato de la fecha y el tiempo en los archivos de
registro. El valor @code{standard} registra con segundos completos mientras
que @code{usecs} registra con microsegundos.

El valor predeterminado es @samp{standard}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-clients
Especifica el número de clientes simultáneos máximo que son admitidos por el
planificador.

El valor predeterminado es @samp{100}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-clients-per-host
Especifica el número de clientes simultáneos máximo que se permiten desde
una única dirección.

El valor predeterminado es @samp{100}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-copies
Especifica el número de copias máximo que una usuaria puede imprimir con
cada trabajo.

El valor predeterminado es @samp{9999}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-hold-time
Especifica el tiempo máximo que un trabajo puede permanecer en el estado de
espera @code{indefinite} antes de su cancelación. Un valor de 0 desactiva la
cancelación de trabajos en espera.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-jobs
Especifica el número de trabajos simultáneos máximo permitido. El valor 0
permite un número ilimitado de trabajos.

El valor predeterminado es @samp{500}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-jobs-per-printer
Especifica el número de trabajos simultáneos máximo que se permite por
impresora. Un valor de 0 permite hasta ``MaxJobs'' por impresora.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-jobs-per-user
Especifica el número de trabajos simultáneos máximo que se permite por
usuaria. Un valor de 0 permite hasta ``MaxJobs'' por usuaria.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-job-time
Especifica el tiempo de duración de la impresión máximo que un trabajo puede
tomar antes de ser cancelado, en segundos. El valor 0 desactiva la
cancelación de trabajos ``atascados''.

El valor predeterminado es @samp{10800}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo max-log-size
Especifica el tamaño máximo de los archivos de registro antes de su
rotación, en bytes. El valor 0 desactiva la rotación de registros.

El valor predeterminado es @samp{1048576}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo multiple-operation-timeout
Especifica el tiempo máximo permitido entre archivos en un trabajo de
impresión con múltiples archivos, en segundos.

Defaults to @samp{900}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string page-log-format
Especifica el formato de las líneas PageLog. Las secuencias de caracteres
que comiencen con el signo de porcentaje (@samp{%}) se reemplazan con la
información correspondiente, mientras que el resto de caracteres se copia de
manera literal. Se reconocen las siguientes secuencias:

@table @samp
@item %%
inserta literalmente un símbolo de porcentaje

@item %@{nombre@}
inserta el valor del atributo IPP especificado

@item %C
inserta el número de copias para la página actual

@item %P
inserta el número de página actual

@item %T
inserta la fecha y hora actuales en el formato común de registro

@item %j
introduce el ID del trabajo

@item %p
inserta el nombre de impresora

@item %u
inserta el nombre de usuaria
@end table

La cadena vacía desactiva el registro de página. La cadena @code{%p %u %j %T
%P %C %@{job-billing@} %@{job-originating-host-name@} %@{job-name@}
%@{media@} %@{sides@}} crea un registro de página con los elementos
estándar.

El valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} variables-entorno environment-variables
Proporciona la o las variables de entorno especificadas a los procesos
iniciados; una lista de cadenas.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-policy-configuration policies
Especifica las políticas de control de acceso con nombre.

Los campos disponibles de @code{policy-configuration} son:

@deftypevr {parámetro de @code{policy-configuration}} string name
El nombre de la política.
@end deftypevr

@deftypevr {parámetro de @code{policy-configuration}} string job-private-access
Specifies an access list for a job's private values.  @code{@@ACL} maps to
the printer's requesting-user-name-allowed or requesting-user-name-denied
values.  @code{@@OWNER} maps to the job's owner.  @code{@@SYSTEM} maps to
the groups listed for the @code{system-group} field of the
@code{files-configuration}, which is reified into the
@code{cups-files.conf(5)} file.  Other possible elements of the access list
include specific user names, and @code{@@@var{group}} to indicate members of
a specific group.  The access list may also be simply @code{all} or
@code{default}.

El valor predeterminado es @samp{"@@OWNER @@SYSTEM"}.
@end deftypevr

@deftypevr {parámetro de @code{policy-configuration}} string job-private-values
Especifica la lista de valores de trabajos a hacer privados, o bien
@code{all}, @code{default}, o @code{none}.

El valor predeterminado es @samp{"job-name job-originating-host-name
job-originating-user-name phone"}.
@end deftypevr

@deftypevr {parámetro de @code{policy-configuration}} string subscription-private-access
Specifies an access list for a subscription's private values.  @code{@@ACL}
maps to the printer's requesting-user-name-allowed or
requesting-user-name-denied values.  @code{@@OWNER} maps to the job's
owner.  @code{@@SYSTEM} maps to the groups listed for the
@code{system-group} field of the @code{files-configuration}, which is
reified into the @code{cups-files.conf(5)} file.  Other possible elements of
the access list include specific user names, and @code{@@@var{group}} to
indicate members of a specific group.  The access list may also be simply
@code{all} or @code{default}.

El valor predeterminado es @samp{"@@OWNER @@SYSTEM"}.
@end deftypevr

@deftypevr {parámetro de @code{policy-configuration}} string subscription-private-values
Especifica la lista de valores de trabajos a hacer privados, o bien
@code{all}, @code{default}, o @code{none}.

El valor predeterminado es @samp{"notify-events notify-pull-method
notify-recipient-uri notify-subscriber-user-name notify-user-data"}.
@end deftypevr

@deftypevr {parámetro de @code{policy-configuration}} lista-operation-access-control access-controls
Control de acceso para operaciones de IPP.

El valor predeterminado es @samp{()}.
@end deftypevr
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean-o-entero-no-negativo preserve-job-files
Especifica si los archivos del trabajo (documentos) se preservan tras la
impresión de un trabajo. Si se especifica un valor numérico, los archivos
del trabajo se preservan durante el número indicado de segundos tras la
impresión. En otro caso, el valor booleano determina la conservación de
manera indefinida.

El valor predeterminado es @samp{86400}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean-o-entero-no-negativo preserve-job-history
Especifica si la historia del trabajo se preserva tras la impresión de un
trabajo. Si se especifica un valor numérico, la historia del trabajo se
conserva tras la impresión el número de segundos indicado. Si es @code{#t},
la historia del trabajo se conserva hasta que se alcance el límite de
trabajos ``MaxJobs''.

El valor predeterminado es @samp{#t}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo reload-timeout
Especifica el tiempo a esperar hasta la finalización del trabajo antes de
reiniciar el planificador.

El valor predeterminado es @samp{30}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string rip-cache
Especifica la cantidad máxima de memoria usada durante la conversión de
documentos en imágenes para una impresora.

El valor predeterminado es @samp{"128m"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string server-admin
Especifica la dirección de correo electrónico de la administradora del
servidor.

El valor predeterminado es @samp{"root@@localhost.localdomain"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-nombres-máquina-o-* server-alias
La directiva ServerAlias se usa para la validación de la cabecera HTTP Host
cuando los clientes se conecten al planificador desde interfaces
externas. El uso del nombre especial @code{*} puede exponer su sistema a
ataques basados en el navegador web de reenlazado DNS ya conocidos, incluso
cuando se accede a páginas a través de un cortafuegos. Si el descubrimiento
automático de nombres alternativos no funcionase, le recomendamos enumerar
cada nombre alternativo con una directiva ServerAlias en vez del uso de
@code{*}.

El valor predeterminado es @samp{*}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} string server-name
Especifica el nombre de máquina completamente cualificado del servidor.

El valor predeterminado es @samp{"localhost"}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} server-tokens server-tokens
Especifica qué información se incluye en la cabecera Server de las
respuestas HTTP. @code{None} desactiva la cabecera
Server. @code{ProductOnly} proporciona @code{CUPS}. @code{Major} proporciona
@code{CUPS 2}. @code{Minor} proporciona @code{CUPS 2.0}. @code{Minimap}
proporciona @code{CUPS 2.0.0}. @code{OS} proporciona @code{CUPS 2.0.0
(@var{uname})} donde @var{uname} es la salida de la orden
@code{uname}. @code{Full} proporciona @code{CUPS 2.0.0 (@var{uname})
IPP/2.0}.

El valor predeterminado es @samp{Minimal}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} lista-cadenas-multilínea ssl-listen
Escucha en las interfaces especificadas a la espera de conexiones
cifradas. Se aceptan valores con la forma @var{dirección}:@var{puerto},
siendo @var{dirección} o bien una dirección IPv6 entre corchetes, o bien una
dirección IPv4, o bien @code{*} que representa todas las direcciones.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} opciones-ssl ssl-options
Determina las opciones de cifrado. De manera predeterminada, CUPS permite
únicamente el cifrado mediante TLS v1.0 o superior mediante el uso de
modelos de cifrado de conocida seguridad. La seguridad se reduce cuando se
usan opciones @code{Allow} y se aumenta cuando se usan opciones
@code{Deny}. La opción @code{AllowRC4} permite el cifrado RC4 de 128 bits,
necesario para algunos clientes antiguos que no implementan los modelos más
modernos. La opción @code{AllowSSL3} desactiva SSL v3.0, necesario para
algunos clientes antiguos que no implementan TLS v1.0. La opción
@code{DenyCBC} desactiva todos los modelos de cifrado CBC. La opción
@code{DenyTLS1.0} desactiva TLS v1.0---esto fuerza la versión mínima del
protocolo a TLS v1.1.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean strict-conformance?
Especifica si el planificador exige que los clientes se adhieran de manera
estricta a las especificaciones IPP.

El valor predeterminado es @samp{#f}
@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} entero-no-negativo timeout
Especifica el plazo de las peticiones HTTP, en segundos.

Defaults to @samp{900}.

@end deftypevr

@deftypevr {parámetro de @code{cups-configuration}} boolean web-interface?
Especifica si se debe activar la interfaz web.

El valor predeterminado es @samp{#f}
@end deftypevr

En este punto probablemente esté pensando, ``querido manual de Guix, me
gusta todo esto, pero... ¡¿cuando se acaban las opciones de
configuración?!''. De hecho ya terminan. No obstante, hay un punto más:
puede ser que ya tenga un archivo @code{cupsd.conf} que desee usar. En ese
caso, puede proporcionar un objeto @code{opaque-cups-configuration} como la
configuración de @code{cups-service-type}.

Los campos disponibles de @code{opaque-cups-configuration} son:

@deftypevr {parámetro de @code{opaque-cups-configuration}} paquete cups
El paquete CUPS.
@end deftypevr

@deftypevr {parámetro de @code{opaque-cups-configuration}} string cupsd.conf
El contenido de @code{cupsd.conf}, como una cadena.
@end deftypevr

@deftypevr {parámetro de @code{opaque-cups-configuration}} string cups-files.conf
El contenido del archivo @code{cups-files.conf}, como una cadena.
@end deftypevr

Por ejemplo, si el contenido de sus archivos @code{cupsd.conf} y
@code{cups-files.conf} estuviese en cadenas del mismo nombre, podría
instanciar un servicio CUPS de esta manera:

@lisp
(service cups-service-type
         (opaque-cups-configuration
           (cupsd.conf cupsd.conf)
           (cups-files.conf cups-files.conf)))
@end lisp


@node Servicios de escritorio
@subsection Servicios de escritorio

El módulo @code{(gnu services desktop)} proporciona servicios que son útiles
habitualmente en el contexto de una configuración de ``escritorio''---es
decir, en una máquina que ejecute un servidor gráfico, posiblemente con
interfaces gráficas, etcétera. También define servicios que proporcionan
entornos de escritorio específicos como GNOME, Xfce o MATE.

Para simplificar las cosas, el módulo define una variable que contiene el
conjunto de servicios que las usuarias esperarían de manera habitual junto a
un entorno gráfico y de red:

@defvr {Variable Scheme} %desktop-services
Es una lista de servicios que se construye en base a @code{%base-services} y
añade o ajusta servicios para una configuración de ``escritorio'' típica.

En particular, añade un gestor de ingreso al sistema gráfico (@pxref{Sistema X Window, @code{gdm-service-type}}), herramientas para el bloqueo de la
pantalla, una herramienta de gestión de redes (@pxref{Servicios de red,
@code{network-manager-service-type}}) y gestión de modem (@pxref{Servicios de red, @code{modem-manager-service-type}}), servicios de gestión de la
energía y el color, el gestor de asientos e ingresos al sistema
@code{elogind}, el servicio de privilegios Polkit, el servicio de
geolocalización GeoClue, el daemon AccountsService que permite a las
usuarias autorizadas el cambio de contraseñas del sistema, un cliente NTP
(@pxref{Servicios de red}), el daemon Avahi y configura el servicio del
selector de servicios de nombres para que pueda usar @code{nss-mdns}
(@pxref{Selector de servicios de nombres, mDNS}). 
@end defvr

La variable @code{%desktop-services} puede usarse como el campo
@code{services} de una declaración @code{operating-system}
(@pxref{Referencia de operating-system, @code{services}}).

De manera adicional, los procedimientos @code{gnome-desktop-service-type},
@code{xfce-desktop-service}, @code{mate-desktop-service-type},
@code{lxqt-desktop-service-type} y @code{enlightenment-desktop-service-type}
pueden añadir GNOME, Xfce, MATE y/o Enlightenment al sistema. ``Añadir
GNOME'' significa que servicios a nivel de sistema como las herramientas de
ayuda para el ajuste de la intensidad de luz de la pantalla y de gestión de
energía se añaden al sistema, extendiendo @code{polkit} y @code{dbus} de
manera apropiada, y permitiendo a GNOME operar con privilegios elevados en
un número de interfaces del sistema de propósito especial. Además, la
adición de un servicio generado por @code{gnome-desktop-service-type} añade
el metapaquete GNOME al perfil del sistema. Del mismo modo, la adición del
servicio Xfde no añade únicamente el metapaquete @code{xfce} al perfil del
sistema, sino que también le proporciona al gestor de archivos Thunar la
posibilidad de abrir una ventana de gestión de archivos en ``modo root'', si
la usuaria se identifica mediante la contraseña de administración a través
de la interfaz gráfica estándar polkit. ``Añadir MATE'' significa que
@code{polkit} y @code{dbus} se extienden de manera apropiada, permitiendo a
MATE operar con privilegios elevados en un número de interfaces del sistema
de propósito especial. De manera adicional, la adición de un servicio de
tipo @code{mate-desktop-service-type} añade el metapaquete MATE al perfil
del sistema. ``Añadir Enlightenment'' significa que @code{dbus} se extiende
de manera apropiada y varios ejecutables de Enlightenment se marcan como
``setuid'', para permitir el funcionamiento esperado del sistema bloqueo de
pantalla de Enlightenment entre otras funcionalidades.

The desktop environments in Guix use the Xorg display server by default.  If
you'd like to use the newer display server protocol called Wayland, you need
to enable Wayland support in GDM (@pxref{wayland-gdm}).  Another solution is
to use the @code{sddm-service} instead of GDM as the graphical login
manager.  You should then select the ``GNOME (Wayland)'' session in SDDM@.
Alternatively you can also try starting GNOME on Wayland manually from a TTY
with the command ``XDG_SESSION_TYPE=wayland exec dbus-run-session
gnome-session``.  Currently only GNOME has support for Wayland.

@defvr {Variable Scheme} gnome-desktop-service-type
Es el tipo del servicio que añade el entorno de escritorio
@uref{https://www.gnome.org, GNOME}. Su valor es un objeto
@code{gnome-desktop-configuration} (véase a continuación).

Este servicio añade el paquete @code{gnome} al perfil del sistema, y
extiende polkit con las acciones de @code{gnome-settings-daemon}.
@end defvr

@deftp {Tipo de datos} gnome-desktop-configuration
Registro de configuración para el entorno de escritorio GNOME.

@table @asis
@item @code{gnome} (predeterminado: @code{gnome})
El paquete GNOME usado.
@end table
@end deftp

@defvr {Variable Scheme} xfce-desktop-service-type
Este es el tipo de un servicio para ejecutar el entorno de escritorio
@uref{Xfce, https://xfce.org}. Su valor es un objeto
@code{xfce-desktop-configuration} (véase a continuación).

Este servicio añade el paquete @code{xfce} al perfil del sistema, y extiende
polkit con la capacidad de @code{thunar} para manipular el sistema de
archivos como root dentro de una sesión de usuaria, tras la identificación
de la usuaria con la contraseña de administración.

Note that @code{xfce4-panel} and its plugin packages should be installed in
the same profile to ensure compatibility.  When using this service, you
should add extra plugins (@code{xfce4-whiskermenu-plugin},
@code{xfce4-weather-plugin}, etc.) to the @code{packages} field of your
@code{operating-system}.
@end defvr

@deftp {Tipo de datos} xfce-desktop-configuration
Registro de configuración para el entorno de escritorio Xfce.

@table @asis
@item @code{xfce} (predeterminado: @code{xfce})
El paquete Xfce usado.
@end table
@end deftp

@deffn {Variable Scheme} mate-desktop-service-type
Es el tipo del servicio que ejecuta el @uref{https://mate-desktop.org/,
entorno de escritorio MATE}. Su valor es un objeto
@code{mate-desktop-configuration} (véase a continuación).

Este servicio añade el paquete @code{mate} al perfil del sistema, y extiende
polkit con acciones de @code{mate-settings-daemon}.
@end deffn

@deftp {Tipo de datos} mate-desktop-configuration
Registro de configuración para el entorno de escritorio MATE.

@table @asis
@item @code{mate} (predeterminado: @code{mate})
El paquete MATE usado.
@end table
@end deftp

@deffn {Variable Scheme} lxqt-desktop-service-type
This is the type of the service that runs the
@uref{https://lxqt-project.org, LXQt desktop environment}.  Its value is a
@code{lxqt-desktop-configuration} object (see below).

Este servicio añade el paquete @code{lxqt} al perfil del sistema.
@end deffn

@deftp {Tipo de datos} lxqt-desktop-configuration
Registro de configuración para el entorno de escritorio LXQt.

@table @asis
@item @code{lxqt} (predeterminado: @code{lxqt})
El paquete LXQT usado.
@end table
@end deftp

@deffn {Variable Scheme} enlightenment-desktop-service-type
Devuelve un servicio que añade el paquete @code{enlightenment} al perfil del
sistema, y extiende dbus con acciones de @code{efl}.
@end deffn

@deftp {Tipo de datos} enlightenment-desktop-service-configuration
@table @asis
@item @code{enlightenment} (predeterminado: @code{enlightenment})
El paquete enlightenment usado.
@end table
@end deftp

Debido a que los servicios de escritorio GNOME, Xfce y MATE incorporan
tantos paquetes, la variable @code{%desktop-services} no incluye ninguno de
manera predeterminada. Para añadir GNOME, Xfce o MATE, simplemente use
@code{cons} junto a @code{%desktop-services} en el campo @code{services} de
su declaración @code{operating-system}:

@lisp
(use-modules (gnu))
(use-service-modules desktop)
(operating-system
  ...
  ;; cons* añade elementos a la lista proporcionada en el último
  ;; parámetro.
  (services (cons* (service gnome-desktop-service-type)
                   (service xfce-desktop-service)
                   %desktop-services))
  ...)
@end lisp

Una vez realizado, estos entornos de escritorio se encontrarán como opciones
disponibles en la ventana del gestor gráfico de ingreso al sistema.

Las definiciones de servicio incluidas realmente en @code{%desktop-services}
y proporcionadas por @code{(gnu services dbus)} y @code{(gnu services
desktop)} se describen a continuación.

@deffn {Scheme Procedure} dbus-service [#:dbus @var{dbus}] [#:services '()] @
                                       [#:verbose?] Return a service that runs the ``system bus'', using
@var{dbus}, with support for @var{services}.  When @var{verbose?} is true,
it causes the @samp{DBUS_VERBOSE} environment variable to be set to
@samp{1}; a verbose-enabled D-Bus package such as @code{dbus-verbose} should
be provided as @var{dbus} in this scenario.  The verbose output is logged to
@file{/var/log/dbus-daemon.log}.

@uref{https://dbus.freedesktop.org/, D-Bus} es una herramienta para la
facilitación de intercomunicación entre procesos. Su bus del sistema se usa
para permitir la comunicación entre y la notificación de eventos a nivel de
sistema a los servicios.

@var{services} debe ser una lista de paquetes que proporcionen un directorio
@file{etc/dbus-1/system.d} que contenga archivos de configuración y
políticas adicionales de D-Bus. Por ejemplo, para permitir a avahi-daemon el
uso del bus del sistema, @var{services} debe tener el valor @code{(list
avahi)}.
@end deffn

@deffn {Procedimiento Scheme} elogind-service [#:config @var{config}]
Devuelve un servicio que ejecuta el daemon de gestión de ingreso al sistema
y de asientos @code{elogind}. @uref{https://github.com/elogind/elogind,
Elogind} expone una interfaz D-Bus que puede usarse para conocer las
usuarias que han ingresado en el sistema, conocer qué tipo de sesiones
tienen abiertas, suspender el sistema o inhibir su suspensión, reiniciar el
sistema y otras tareas.

Elogind maneja la mayor parte de los eventos a nivel de sistema de
alimentación de su máquina, por ejemplo mediante la suspensión del sistema
cuando se cierre la tapa, o mediante el apagado al pulsar la tecla
correspondiente.

El parámetro @var{config} especifica la configuración de elogind, y debería
resultar en una invocación @code{(elogind-configuration (@var{parámetro}
@var{valor})...)}. Los parámetros disponibles y sus valores predeterminados
son:

@table @code
@item kill-user-processes?
@code{#f}
@item kill-only-users
@code{()}
@item kill-exclude-users
@code{("root")}
@item inhibit-delay-max-seconds
@code{5}
@item handle-power-key
@code{poweroff}
@item handle-suspend-key
@code{suspend}
@item handle-hibernate-key
@code{hibernate}
@item handle-lid-switch
@code{suspend}
@item handle-lid-switch-docked
@code{ignore}
@item handle-lid-switch-external-power
@code{*unspecified*}
@item power-key-ignore-inhibited?
@code{#f}
@item suspend-key-ignore-inhibited?
@code{#f}
@item hibernate-key-ignore-inhibited?
@code{#f}
@item lid-switch-ignore-inhibited?
@code{#t}
@item holdoff-timeout-seconds
@code{30}
@item idle-action
@code{ignore}
@item idle-action-seconds
@code{(* 30 60)}
@item runtime-directory-size-percent
@code{10}
@item runtime-directory-size
@code{#f}
@item remove-ipc?
@code{#t}
@item suspend-state
@code{("mem" "standby" "freeze")}
@item suspend-mode
@code{()}
@item hibernate-state
@code{("disk")}
@item hibernate-mode
@code{("platform" "shutdown")}
@item hybrid-sleep-state
@code{("disk")}
@item hybrid-sleep-mode
@code{("suspend" "platform" "shutdown")}
@end table
@end deffn

@deffn {Procedimiento Scheme} accountsservice-service @
       [#:accountsservice @var{accountsservice}]
Devuelve un servicio que ejecuta AccountsService, un servicio del sistema
para la enumeración de cuentas disponibles, el cambio de sus contraseñas,
etcétera. AccountsService se integra con PolicyKit para permitir a las
usuarias sin privilegios la adquisición de la capacidad de modificar la
configuración de su sistema. Véase
@uref{https://www.freedesktop.org/wiki/Software/AccountsService/, la página
web de AccountsService} para más información.

El parámetro @var{accountsservice} es el paquete @code{accountsservice} que
se expondrá como un servicio.
@end deffn

@deffn {Procedimiento Scheme} polkit-service @
                         [#:polkit @var{polkit}]
Devuelve un servicio que ejecuta el
@uref{https://www.freedesktop.org/wiki/Software/polkit/, servicio de gestión
de privilegios Polkit}, que permite a las administradoras del sistema la
concesión de permisos sobre operaciones privilegiadas de manera
estructurada. Mediante las consultas al servicio Polkit, un componente del
sistema con privilegios puede conocer cuando debe conceder capacidades
adicionales a usuarias ordinarias. Por ejemplo, se le puede conceder la
capacidad a una usuaria ordinaria de suspender el sistema si la usuaria
ingresó de forma local.
@end deffn

@defvr {Variable Scheme} polkit-wheel-service
Servicio que añade a las usuarias del grupo @code{wheel} como
administradoras del servicio Polkit. Esto hace que se solicite su propia
contraseña a las usuarias del grupo @code{wheel} cuando realicen acciones
administrativas en vez de la contraseña de @code{root}, de manera similar al
comportamiento de @code{sudo}.
@end defvr

@defvr {Variable Scheme} upower-service-type
Servicio que ejecuta @uref{https://upower.freedesktop.org/},
@command{upowerd}, un monitor a nivel de sistema de consumo de energía y
niveles de batería, con las opciones de configuración proporcionadas.

Implementa la interfaz D-Bus @code{org.freedesktop.UPower}, y se usa de
forma notable en GNOME.
@end defvr

@deftp {Tipo de datos} upower-configuration
Tipo de datos que representa la configuración de UPower.

@table @asis

@item @code{upower} (predeterminado: @var{upower})
Paquete usado para @code{upower}.

@item @code{watts-up-pro?} (predeterminado: @code{#f})
Permite el uso del dispositivo Watts Up Pro.

@item @code{poll-batteries?} (predeterminado: @code{#t})
Usa el servicio de consulta del núcleo para los cambios en niveles de
batería.

@item @code{ignore-lid?} (predeterminado: @code{#f})
Ignora el estado de la tapa, puede ser útil en caso de ser incorrecto un
dispositivo determinado.

@item @code{use-percentage-for-policy?} (default: @code{#t})
Whether to use a policy based on battery percentage rather than on estimated
time left.  A policy based on battery percentage is usually more reliable.

@item @code{percentage-low} (default: @code{20})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el
porcentaje en el que la carga de la batería se considera baja.

@item @code{percentage-critical} (default: @code{5})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el
porcentaje en el que la carga de la batería se considera crítica.

@item @code{percentage-action} (predeterminado: @code{2})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el
porcentaje en el que se tomará la acción.

@item @code{time-low} (predeterminado: @code{1200})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el tiempo
restante en segundos con el que carga de la batería se considera baja.

@item @code{time-critical} (predeterminado: @code{300})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el tiempo
restante en segundos con el que carga de la batería se considera crítica.

@item @code{time-action} (predeterminado: @code{120})
Cuando @code{use-percentaje-for-policy?} es @code{#t}, determina el tiempo
restante en segundos con el que se tomará la acción.

@item @code{critical-power-action} (predeterminada: @code{'hybrid-sleep})
La acción tomada cuando se alcanza @code{percentage-action} o
@code{time-action} (dependiendo de la configuración de
@code{use-percentage-for-policy?}).

Los valores posibles son:

@itemize @bullet
@item
@code{'power-off}

@item
@code{'hibernate}

@item
@code{'hybrid-sleep}.
@end itemize

@end table
@end deftp

@deffn {Procedimiento Scheme} udisks-service [#:udisks @var{udisks}]
Devuelve un servicio para @uref{https://udisks.freedesktop.org/docs/latest/,
UDisks}, un daemon de @dfn{gestión de discos} que proporciona interfaces de
usuaria con notificaciones y formas de montar/desmontar discos.  Los
programas que se comunican con UDisk incluyen la orden @command{udisksctl},
parte de UDisks, y la utilidad ``Discos'' de GNOME. Tenga en cuenta que
Udisks depende de la orden @command{mount}, de modo que únicamente será
capaz de usar utilidades para sistemas de archivos instaladas en el perfil
del sistema. Si quiere, por ejemplo, poder montar sistemas de archivos NTFS
en modo lectura/escritura, debe instalar @code{ntfs-3g} en su sistema
operativo.
@end deffn

@deffn {Variable Scheme} colord-service-type
Devuelve un servicio que ejecuta @command{colord}, un servicio del sistema
con una interfaz D-Bus para la gestión de perfiles de dispositivos de
entrada y salida como la pantalla y el escáner. Se usa de forma notable por
parte de la herramienta gráfica de ``Gestión de color'' de GNOME. Véase
@uref{https://www.freedesktop.org/software/colord/, la página web de colord}
para más información.
@end deffn

@cindex acceso al escáner
@defvr {Scheme Variable} sane-service-type
This service provides access to scanners @i{via}
@uref{http://www.sane-project.org, SANE} by installing the necessary udev
rules.  It is included in @code{%desktop-services} (@pxref{Servicios de escritorio}) and relies by default on @code{sane-backends-minimal} package
(see below) for hardware support.
@end defvr

@defvr {Scheme Variable} sane-backends-minimal
The default package which the @code{sane-service-type} installs.  It
supports many recent scanners.
@end defvr

@defvr {Scheme Variable} sane-backends
This package includes support for all scanners that
@code{sane-backends-minimal} supports, plus older Hewlett-Packard scanners
supported by @code{hplip} package.  In order to use this on a system which
relies on @code{%desktop-services}, you may use @code{modify-services}
(@pxref{Referencia de servicios, @code{modify-services}}) as illustrated below:

@lisp
(use-modules (gnu))
(use-service-modules
  @dots{}
  desktop)
(use-package-modules
  @dots{}
  scanner)

(define %my-desktop-services
  ;; List of desktop services that supports a broader range of scanners.
  (modify-services %desktop-services
    (sane-service-type _ => sane-backends)))

(operating-system
  @dots{}
  (services %my-desktop-services))
@end lisp
@end defvr

@deffn {Procedimiento Scheme} geoclue-application-name [#:allowed? #t] [#:system? #f] [#:users '()]
Devuelve una configuración que permite a una aplicación el acceso a los
datos de posicionamiento de GeoClue. @var{nombre} es el Desktop ID de la
aplicación, sin la parte @code{.desktop}. Si el valor de @var{allowed?} es
verdadero, la aplicación tendrá acceso a la información de posicionamiento
de manera predeterminada. El valor booleano @var{system?} indica si una
aplicación es un componente de sistema o no. Por último, @var{users} es una
lista de UID de todas las usuarias para las que esta aplicación tiene
permitido el acceso de información. Una lista de usuarias vacía significa
que se permiten todas las usuarias.
@end deffn

@defvr {Variable Scheme} %standard-geoclue-applications
La lista estándar de configuraciones de GeoClue de aplicaciones conocidas,
proporcionando autoridad a la utilidad de fecha y hora de GNOME para obtener
la localización actual para ajustar la zona horaria, y permitiendo que los
navegadores Icecat y Epiphany puedan solicitar información de
localización. Tanto IceCat como Epiphany solicitan permiso a la usuaria
antes de permitir a una página web conocer la ubicación de la usuaria.
@end defvr

@deffn {Procedimiento Scheme} geoclue-service [#:colord @var{colord}] @
                         [#:whitelist '()] @ [#:wifi-geolocation-url
"https://location.services.mozilla.com/v1/geolocate?key=geoclue"] @
[#:submit-data? #f] [#:wifi-submission-url
"https://location.services.mozilla.com/v1/submit?key=geoclue"] @
[#:submission-nick "geoclue"] @ [#:applications
%standard-geoclue-applications]
Devuelve un servicio que ejecuta el servicio de posicionamiento GeoClue.
Proporciona una interfaz D-Bus que permite a las aplicaciones solicitar una
posición física de la usuaria, y de manera opcional añadir información a
bases de datos de posicionamiento en línea.  Véase
@uref{https://wiki.freedesktop.org/www/Software/GeoClue/, la página web de
GeoClue} para obtener más información.
@end deffn

@deffn {Procedimiento Scheme} bluetooth-service [#:bluez @var{bluez}] @
       [@w{#:auto-enable? #f}]
Devuelve un servicio que ejecuta el daemon @command{bluetoothd} que gestiona
todos los dispositivos Bluetooth y proporciona cierto número de interfaces
D-Bus. Cuando @var{auto-enable?} es verdadero, el controlador bluetooth
tendrá alimentación automáticamente tras el arranque, lo que puede ser útil
si se posee un teclado o un ratón bluetooth.

Las usuarias necesitan la pertenencia al grupo @code{lp} para el acceso al
servicio D-Bus.
@end deffn

@deffn {Scheme Variable} bluetooth-service-type
This is the type for the @uref{https://bluez.org/, Linux Bluetooth Protocol
Stack} (BlueZ) system, which generates the @file{/etc/bluetooth/main.conf}
configuration file.  The value for this type is a
@command{bluetooth-configuration} record as in this example:

@lisp
(service bluetooth-service-type)
@end lisp

See below for details about @code{bluetooth-configuration}.
@end deffn

@deftp {Data Type} bluetooth-configuration
Data type representing the configuration for @code{bluetooth-service}.

@table @asis
@item @code{bluez} (default: @code{bluez})
@code{bluez} package to use.

@item @code{name} (default: @code{"BlueZ"})
Default adapter name.

@item @code{class} (default: @code{#x000000})
Default device class. Only the major and minor device class bits are
considered.

@item @code{discoverable-timeout} (default: @code{180})
How long to stay in discoverable mode before going back to
non-discoverable. The value is in seconds.

@item @code{always-pairable?} (default: @code{#f})
Always allow pairing even if there are no agents registered.

@item @code{pairable-timeout} (default: @code{0})
How long to stay in pairable mode before going back to non-discoverable. The
value is in seconds.

@item @code{device-id} (default: @code{#f})
Use vendor id source (assigner), vendor, product and version information for
DID profile support. The values are separated by ":" and @var{assigner},
@var{VID}, @var{PID} and @var{version}.

Los valores posibles son:

@itemize @bullet
@item
@code{#f} to disable it,

@item
@code{"assigner:1234:5678:abcd"}, where @var{assigner} is either @code{usb}
(default)  or @code{bluetooth}.

@end itemize

@item @code{reverse-service-discovery?} (default: @code{#t})
Do reverse service discovery for previously unknown devices that connect to
us. For BR/EDR this option is really only needed for qualification since the
BITE tester doesn't like us doing reverse SDP for some test cases, for LE
this disables the GATT client functionally so it can be used in system which
can only operate as peripheral.

@item @code{name-resolving?} (default: @code{#t})
Enable name resolving after inquiry. Set it to @code{#f} if you don't need
remote devices name and want shorter discovery cycle.

@item @code{debug-keys?} (default: @code{#f})
Enable runtime persistency of debug link keys. Default is false which makes
debug link keys valid only for the duration of the connection that they were
created for.

@item @code{controller-mode} (default: @code{'dual})
Restricts all controllers to the specified transport. @code{'dual} means
both BR/EDR and LE are enabled (if supported by the hardware).

Los valores posibles son: 

@itemize @bullet
@item
@code{'dual}

@item
@code{'bredr}

@item
@code{'le}

@end itemize

@item @code{multi-profile} (default: @code{'off})
Enables Multi Profile Specification support. This allows to specify if
system supports only Multiple Profiles Single Device (MPSD) configuration or
both Multiple Profiles Single Device (MPSD) and Multiple Profiles Multiple
Devices (MPMD) configurations.

Los valores posibles son:

@itemize @bullet
@item
@code{'off}

@item
@code{'single}

@item
@code{'multiple}

@end itemize

@item @code{fast-connectable?} (default: @code{#f})
Permanently enables the Fast Connectable setting for adapters that support
it. When enabled other devices can connect faster to us, however the
tradeoff is increased power consumptions. This feature will fully work only
on kernel version 4.1 and newer.

@item @code{privacy} (default: @code{'off})
Default privacy settings.

@itemize @bullet
@item
@code{'off}: Disable local privacy

@item
@code{'network/on}: A device will only accept advertising packets from peer
devices that contain private addresses. It may not be compatible with some
legacy devices since it requires the use of RPA(s) all the time

@item
@code{'device}: A device in device privacy mode is only concerned about the
privacy of the device and will accept advertising packets from peer devices
that contain their Identity Address as well as ones that contain a private
address, even if the peer device has distributed its IRK in the past

@end itemize

and additionally, if @var{controller-mode} is set to @code{'dual}:

@itemize @bullet
@item
@code{'limited-network}: Apply Limited Discoverable Mode to advertising,
which follows the same policy as to BR/EDR that publishes the identity
address when discoverable, and Network Privacy Mode for scanning

@item
@code{'limited-device}: Apply Limited Discoverable Mode to advertising,
which follows the same policy as to BR/EDR that publishes the identity
address when discoverable, and Device Privacy Mode for scanning.

@end itemize

@item @code{just-works-repairing} (default: @code{'never})
Specify the policy to the JUST-WORKS repairing initiated by peer.

Possible values:
@itemize @bullet
@item
@code{'never}

@item
@code{'confirm}

@item
@code{'always}

@end itemize

@item @code{temporary-timeout} (default: @code{30})
How long to keep temporary devices around. The value is in seconds. @code{0}
disables the timer completely.

@item @code{refresh-discovery?} (default: @code{#t})
Enables the device to issue an SDP request to update known services when
profile is connected.

@item @code{experimental} (default: @code{#f})
Enables experimental features and interfaces, alternatively a list of UUIDs
can be given.

Possible values:

@itemize @bullet
@item
@code{#t}

@item
@code{#f}

@item
@code{(list (uuid <uuid-1>) (uuid <uuid-2>) ...)}.
@end itemize

List of possible UUIDs:
@itemize @bullet
@item
@code{d4992530-b9ec-469f-ab01-6c481c47da1c}: BlueZ Experimental Debug,

@item
@code{671b10b5-42c0-4696-9227-eb28d1b049d6}: BlueZ Experimental Simultaneous
Central and Peripheral,

@item
@code{"15c0a148-c273-11ea-b3de-0242ac130004}: BlueZ Experimental LL privacy,

@item
@code{330859bc-7506-492d-9370-9a6f0614037f}: BlueZ Experimental Bluetooth
Quality Report,

@item
@code{a6695ace-ee7f-4fb9-881a-5fac66c629af}: BlueZ Experimental Offload
Codecs.
@end itemize

@item @code{remote-name-request-retry-delay} (default: @code{300})
The duration to avoid retrying to resolve a peer's name, if the previous try
failed.

@item @code{page-scan-type} (default: @code{#f})
BR/EDR Page scan activity type.

@item @code{page-scan-interval} (default: @code{#f})
BR/EDR Page scan activity interval.

@item @code{page-scan-window} (default: @code{#f})
BR/EDR Page scan activity window.

@item @code{inquiry-scan-type} (default: @code{#f})
BR/EDR Inquiry scan activity type.

@item @code{inquiry-scan-interval} (default: @code{#f})
BR/EDR Inquiry scan activity interval.

@item @code{inquiry-scan-window} (default: @code{#f})
BR/EDR Inquiry scan activity window.

@item @code{link-supervision-timeout} (default: @code{#f})
BR/EDR Link supervision timeout.

@item @code{page-timeout} (default: @code{#f})
BR/EDR Page timeout.

@item @code{min-sniff-interval} (default: @code{#f})
BR/EDR minimum sniff interval.

@item @code{max-sniff-interval} (default: @code{#f})
BR/EDR maximum sniff interval.

@item @code{min-advertisement-interval} (default: @code{#f})
LE minimum advertisement interval (used for legacy advertisement only).

@item @code{max-advertisement-interval} (default: @code{#f})
LE maximum advertisement interval (used for legacy advertisement only).

@item @code{multi-advertisement-rotation-interval} (default: @code{#f})
LE multiple advertisement rotation interval.

@item @code{scan-interval-auto-connect} (default: @code{#f})
LE scanning interval used for passive scanning supporting auto connect.

@item @code{scan-window-auto-connect} (default: @code{#f})
LE scanning window used for passive scanning supporting auto connect.

@item @code{scan-interval-suspend} (default: @code{#f})
LE scanning interval used for active scanning supporting wake from suspend.

@item @code{scan-window-suspend} (default: @code{#f})
LE scanning window used for active scanning supporting wake from suspend.

@item @code{scan-interval-discovery} (default: @code{#f})
LE scanning interval used for active scanning supporting discovery.

@item @code{scan-window-discovery} (default: @code{#f})
LE scanning window used for active scanning supporting discovery.

@item @code{scan-interval-adv-monitor} (default: @code{#f})
LE scanning interval used for passive scanning supporting the advertisement
monitor APIs.

@item @code{scan-window-adv-monitor} (default: @code{#f})
LE scanning window used for passive scanning supporting the advertisement
monitor APIs.

@item @code{scan-interval-connect} (default: @code{#f})
LE scanning interval used for connection establishment.

@item @code{scan-window-connect} (default: @code{#f})
LE scanning window used for connection establishment.

@item @code{min-connection-interval} (default: @code{#f})
LE default minimum connection interval. This value is superseded by any
specific value provided via the Load Connection Parameters interface.

@item @code{max-connection-interval} (default: @code{#f})
LE default maximum connection interval. This value is superseded by any
specific value provided via the Load Connection Parameters interface.

@item @code{connection-latency} (default: @code{#f})
LE default connection latency. This value is superseded by any specific
value provided via the Load Connection Parameters interface.

@item @code{connection-supervision-timeout} (default: @code{#f})
LE default connection supervision timeout. This value is superseded by any
specific value provided via the Load Connection Parameters interface.

@item @code{autoconnect-timeout} (default: @code{#f})
LE default autoconnect timeout. This value is superseded by any specific
value provided via the Load Connection Parameters interface.

@item @code{adv-mon-allowlist-scan-duration} (default: @code{300})
Allowlist scan duration during interleaving scan. Only used when scanning
for ADV monitors. The units are msec.

@item @code{adv-mon-no-filter-scan-duration} (default: @code{500})
No filter scan duration during interleaving scan. Only used when scanning
for ADV monitors. The units are msec.

@item @code{enable-adv-mon-interleave-scan?} (default: @code{#t})
Enable/Disable Advertisement Monitor interleave scan for power saving.

@item @code{cache} (default: @code{'always})
GATT attribute cache.

Los valores posibles son:
@itemize @bullet
@item
@code{'always}: Always cache attributes even for devices not paired, this is
recommended as it is best for interoperability, with more consistent
reconnection times and enables proper tracking of notifications for all
devices

@item
@code{'yes}: Only cache attributes of paired devices

@item
@code{'no}: Never cache attributes.
@end itemize

@item @code{key-size} (default: @code{0})
Minimum required Encryption Key Size for accessing secured characteristics.

Los valores posibles son:
@itemize @bullet
@item
@code{0}: Don't care

@item
@code{7 <= N <= 16}
@end itemize

@item @code{exchange-mtu} (default: @code{517})
Exchange MTU size. Possible values are:

@itemize @bullet
@item
@code{23 <= N <= 517}
@end itemize

@item @code{att-channels} (default: @code{3})
Number of ATT channels. Possible values are:

@itemize @bullet
@item
@code{1}: Disables EATT

@item
@code{2 <= N <= 5}
@end itemize

@item @code{session-mode} (default: @code{'basic})
AVDTP L2CAP signalling channel mode.

Los valores posibles son:

@itemize @bullet
@item
@code{'basic}: Use L2CAP basic mode

@item
@code{'ertm}: Use L2CAP enhanced retransmission mode.
@end itemize

@item @code{stream-mode} (default: @code{'basic})
AVDTP L2CAP transport channel mode.

Los valores posibles son:

@itemize @bullet
@item
@code{'basic}: Use L2CAP basic mode

@item
@code{'streaming}: Use L2CAP streaming mode.
@end itemize

@item @code{reconnect-uuids} (default: @code{'()})
The ReconnectUUIDs defines the set of remote services that should try to be
reconnected to in case of a link loss (link supervision timeout). The policy
plugin should contain a sane set of values by default, but this list can be
overridden here. By setting the list to empty the reconnection feature gets
disabled.

Possible values:

@itemize @bullet
@item
@code{'()}

@item
@code{(list (uuid <uuid-1>) (uuid <uuid-2>) ...)}.
@end itemize

@item @code{reconnect-attempts} (default: @code{7})
Defines the number of attempts to reconnect after a link lost. Setting the
value to 0 disables reconnecting feature.

@item @code{reconnect-intervals} (default: @code{'(1 2 4 8 16 32 64)})
Defines a list of intervals in seconds to use in between attempts. If the
number of attempts defined in @var{reconnect-attempts} is bigger than the
list of intervals the last interval is repeated until the last attempt.

@item @code{auto-enable?} (default: @code{#f})
Defines option to enable all controllers when they are found. This includes
adapters present on start as well as adapters that are plugged in later on.

@item @code{resume-delay} (default: @code{2})
Audio devices that were disconnected due to suspend will be reconnected on
resume. @var{resume-delay} determines the delay between when the controller
resumes from suspend and a connection attempt is made. A longer delay is
better for better co-existence with Wi-Fi. The value is in seconds.

@item @code{rssi-sampling-period} (default: @code{#xFF})
Default RSSI Sampling Period. This is used when a client registers an
advertisement monitor and leaves the RSSISamplingPeriod unset.

Los valores posibles son:
@itemize @bullet
@item
@code{#x0}: Report all advertisements

@item
@code{N = #xXX}: Report advertisements every N x 100 msec (range: #x01 to
#xFE)

@item
@code{#xFF}: Report only one advertisement per device during monitoring
period.
@end itemize

@end table
@end deftp

@defvr {Variable Scheme} gnome-keyring-service-type
Es el tipo del servicio que añade el entorno de escritorio el
@uref{https://wiki.gnome.org/Projects/GnomeKeyring, anillo de claves de
GNOME}. Su valor es un objeto @code{gnome-keyring-configuration} (véase a
continuación).

Este servicio añade el paquete @code{gnome-keyring} al perfil del sistema y
extiende PAM con entradas que usan @code{pam_gnome_keyring.so}, las cuales
desbloquean el anillo de claves del sistema de la usuaria cuando ingrese en
el sistema o cambie su contraseña con passwd.
@end defvr

@deftp {Tipo de datos} gnome-keyring-configuration
Registro de configuración para el servicio del anillo de claves de GNOME.

@table @asis
@item @code{keyring} (predeterminado: @code{gnome-keyring})
El paquete GNOME keyring usado.

@item @code{pam-services}
Una lista de pares @code{(@var{servicio} . @var{tipo})} que denotan los
servicios de PAM que deben extenderse, donde @var{servicio} es el nombre de
un servicio existente que debe extenderse y @var{tipo} es @code{login} o
@code{passwd}.

Si se proporciona @code{login}, añade un campo opcional
@code{pam_gnome_keyring.so} al bloque de identificación sin parámetros y al
bloque de sesión con @code{auto_start}. Si se proporciona @code{passwd},
añade un campo opcional @code{pam_gnome_keyring.so} al bloque de contraseña
sin parámetros.

De manera predeterminada, este campo contiene ``gdm-password'' con el valor
@code{login} y ``passwd'' tiene valor @code{passwd}.
@end table
@end deftp

@defvr {Scheme Variable} seatd-service-type
@uref{https://sr.ht/~kennylevinsen/seatd/, seatd} is a minimal seat
management daemon.

Seat management takes care of mediating access to shared devices (graphics,
input), without requiring the applications needing access to be root.

@lisp
(append
  (list
   ;; make sure seatd is running
   (service seatd-service-type))

  ;; normally one would want %base-services
  %base-services)

@end lisp

@code{seatd} operates over a UNIX domain socket, with @code{libseat}
providing the client side of the protocol.  Applications that acquire access
to the shared resources via @code{seatd} (e.g. @code{sway})  need to be able
to talk to this socket.  This can be achieved by adding the user they run
under to the group owning @code{seatd}'s socket (usually ``seat''), like so:

@lisp
(user-account
  (name "alice")
  (group "users")
  (supplementary-groups '("wheel"   ; allow use of sudo, etc.
                          "seat"    ; seat management
                          "audio"   ; sound card
                          "video"   ; video devices such as webcams
                          "cdrom")) ; the good ol' CD-ROM
  (comment "Bob's sister"))
@end lisp

Depending on your setup, you will have to not only add regular users, but
also system users to this group.  For instance, some greetd greeters require
graphics and therefore also need to negotiate with seatd.

@end defvr

@deftp {Data Type} seatd-configuration
Configuration record for the seatd daemon service.

@table @asis
@item @code{seatd} (default: @code{seatd})
The seatd package to use.

@item @code{group} (default: @samp{"seat"})
Group to own the seatd socket.

@item @code{socket} (default: @samp{"/run/seatd.sock"})
Where to create the seatd socket.

@item @code{logfile} (default: @samp{"/var/log/seatd.log"})
Log file to write to.

@item @code{loglevel} (default: @samp{"error"})
Log level to output logs. Possible values: @samp{"silent"}, @samp{"error"},
@samp{"info"} and @samp{"debug"}.

@end table
@end deftp


@node Servicios de sonido
@subsection Servicios de sonido

@cindex sonido
@cindex ALSA
@cindex PulseAudio, sonido

El módulo @code{(gnu services sound)} proporciona un servicio para la
configuración del sistema ALSA (arquitectura avanzada de sonido de Linux),
el cual establece PulseAudio como el controlador de ALSA preferido para
salida de sonido.

@deffn {Variable Scheme} alsa-service-type
Es el tipo para el sistema @uref{https://alsa-project.org/, ALSA}
(Arquitectura de sonido avanzada de Linux), que genera el archivo de
configuración @file{/etc/asound.conf}. El valor para este tipo es un
registro @command{alsa-configuration} como en el ejemplo:

@lisp
(service alsa-service-type)
@end lisp

Véase a continuación más detalles sobre @code{alsa-configuration}.
@end deffn

@deftp {Tipo de datos} alsa-configuration
Tipo de datos que representa la configuración para @code{alsa-service}.

@table @asis
@item @code{alsa-plugins} (predeterminados: @var{alsa-plugins})
El paquete @code{alsa-plugins} usado.

@item @code{pulseaudio?} (predeterminado: @var{#t})
Determina si las aplicaciones ALSA deben usar el servidor de sonido
@uref{https://www.pulseaudio.org/, PulseAudio} de manera transparente.

El uso de PulseAudio le permite la ejecución de varias aplicaciones que
produzcan sonido al mismo tiempo y su control individual mediante
@command{pavucontrol}, entre otras opciones.

@item @code{extra-options} (predeterminado: @var{""})
Cadena a añadir al final del archivo @file{/etc/asound.conf}.

@end table
@end deftp

Las usuarias individuales que deseen forzar la configuración de ALSA en el
sistema para sus cuentas pueden hacerlo con el archivo @file{~/.asoundrc}:

@example
# En guix tenemos que especificar la ruta absoluta del módulo.
pcm_type.jack @{
  lib "/home/alicia/.guix-profile/lib/alsa-lib/libasound_module_pcm_jack.so"
@}

# Redirección de ALSA a jack:
# <http://jackaudio.org/faq/routing_alsa.html>.
pcm.rawjack @{
  type jack
  playback_ports @{
    0 system:playback_1
    1 system:playback_2
  @}

  capture_ports @{
    0 system:capture_1
    1 system:capture_2
  @}
@}

pcm.!default @{
  type plug
  slave @{
    pcm "rawjack"
  @}
@}
@end example

Véase @uref{https://www.alsa-project.org/main/index.php/Asoundrc} para
obtener más detalles.

@deffn {Variable Scheme} pulseaudio-service-type
Tipo de servicio del servidor de sonido @url{https://www.pulseaudio.org/,
PulseAudio/,PulseAudio}. Existe para permitir los cambios a nivel de sistema
de la configuración predeterminada a través de
@code{pulseaudio-configuration}, véase a continuación.

@quotation Aviso
Este servicio hace que se ignoren los archivos de configuración de cada
usuaria. Si desea que PulseAudio respete los archivos de configuración en
@file{~/.config/pulse} tiene que eliminar del entorno (con @code{unset}) las
variables @env{PULSE_CONFIG} y @env{PULSE_CLIENTCONFIG} en su archivo
@file{~/.bash_profile}.
@end quotation

@quotation Aviso
Este servicio no asegura en sí que el paquete @code{pulseaudio} exista en su
máquina. Únicamente añade los archivos de configuración, como se detalla a
continuación. En el caso (ciertamente poco probable), de que se encuentre si
un paquete pulseaudio @code{pulseaudio}, considere activarlo a través del
tipo @code{alsa-service-type} mostrado previamente.
@end quotation
@end deffn

@deftp {Tipo de datos} pulseaudio-configuration
Tipo de datos que representa la configuración para
@code{pulseaudio-service}.

@table @asis
@item @code{client-conf} (predeterminada: @code{'()})
List of settings to set in @file{client.conf}.  Accepts a list of strings or
symbol-value pairs.  A string will be inserted as-is with a newline added.
A pair will be formatted as ``key = value'', again with a newline added.

@item @code{daemon-conf} (predeterminada: @code{'((flat-volumes . no))})
Lista de opciones de configuración de @file{daemon.conf}, con el mismo
formato que @var{client-conf}.

@item @code{script-file} (predeterminado: @code{(file-append pulseaudio "/etc/pulse/default.pa")})
Script file to use as @file{default.pa}.  In case the
@code{extra-script-files} field below is used, an @code{.include} directive
pointing to @file{/etc/pulse/default.pa.d} is appended to the provided
script.

@item @code{extra-script-files} (default: @code{'()})
A list of file-like objects defining extra PulseAudio scripts to run at the
initialization of the @command{pulseaudio} daemon, after the main
@code{script-file}.  The scripts are deployed to the
@file{/etc/pulse/default.pa.d} directory; they should have the @samp{.pa}
file name extension.  For a reference of the available commands, refer to
@command{man pulse-cli-syntax}.

@item @code{system-script-file} (predeterminado: @code{(file-append pulseaudio "/etc/pulse/system.pa")})
Archivo del guión usado como @file{system.pa}
@end table

The example below sets the default PulseAudio card profile, the default sink
and the default source to use for a old SoundBlaster Audigy sound card:
@lisp
(pulseaudio-configuration
 (extra-script-files
  (list (plain-file "audigy.pa"
                    (string-append "\
set-card-profile alsa_card.pci-0000_01_01.0 \
  output:analog-surround-40+input:analog-mono
set-default-source alsa_input.pci-0000_01_01.0.analog-mono
set-default-sink alsa_output.pci-0000_01_01.0.analog-surround-40\n")))))
@end lisp

Note that @code{pulseaudio-service-type} is part of
@code{%desktop-services}; if your operating system declaration was derived
from one of the desktop templates, you'll want to adjust the above example
to modify the existing @code{pulseaudio-service-type} via
@code{modify-services} (@pxref{Referencia de servicios, @code{modify-services}}),
instead of defining a new one.

@end deftp

@deffn {Variable Scheme} ladspa-service-type
Este servicio proporciona valor a la variable @var{LADSPA_PATH}, de manera
que los programas que lo tengan en cuenta, por ejemplo PulseAudio, puedan
cargar módulos LADSPA.

El siguiente ejemplo configura el servicio para permitir la activación de
los módulos del paquete @code{swh-plugins}:

@lisp
(service ladspa-service-type
         (ladspa-configuration (plugins (list swh-plugins))))
@end lisp

Véase @uref{http://plugin.org.uk/ladspa-swh/docs/ladspa-swh.html} para
obtener más detalles.

@end deffn

@node Servicios de bases de datos
@subsection Servicios de bases de datos

@cindex base de datos
@cindex SQL
El módulo @code{(gnu services databases)} proporciona los siguientes
servicios.

@subsubheading PostgreSQL

El ejemplo siguiente describe un servicio PostgreSQL con su configuración
predeterminada.

@lisp
(service postgresql-service-type
         (postgresql-configuration
          (postgresql postgresql-10)))
@end lisp

Si los servicios fallan al arrancar puede deberse a que ya se encuentra
presente otro cluster incompatible en @var{data-directory}. Puede modificar
el valor (o, si no necesita más dicho cluster, borrar @var{data-directory}),
y reiniciar el servicio.

La identificación de pares se usa de manera predeterminada y la cuenta de
usuaria @code{postgres} no tiene intérprete predeterminado, lo que evita la
ejecución directa de órdenes @code{psql} bajo dicha cuenta.  Para usar
@code{psql}, puede ingresar temporalmente al sistema como @code{postgres}
usando un intérprete de órdenes, crear una cuenta de administración de
PostgreSQL con el mismo nombre de una de las usuarias del sistema y, tras
esto, crear la base de datos asociada.

@example
sudo -u postgres -s /bin/sh
createuser --interactive
createdb $MI_CUENTA_DE_USUARIA  # Sustituir por el valor apropiado.
@end example

@deftp {Tipo de datos} postgresql-configuration
Tipo de datos que representa la configuración de
@code{postgresql-service-type}.

@table @asis
@item @code{postgresql}
El paquete PostgreSQL usado para este servicio.

@item @code{port} (predeterminado: @code{5432})
Puerto en el que debe escuchar PostgreSQL.

@item @code{locale} (predeterminado: @code{"en_US.utf8"})
Localización predeterminada cuando se crea el cluster de la base de datos.

@item @code{config-file} (predeterminado: @code{(postgresql-config-file)})
The configuration file to use when running PostgreSQL@.  The default
behaviour uses the postgresql-config-file record with the default values for
the fields.

@item @code{log-directory} (default: @code{"/var/log/postgresql"})
The directory where @command{pg_ctl} output will be written in a file named
@code{"pg_ctl.log"}.  This file can be useful to debug PostgreSQL
configuration errors for instance.

@item @code{data-directory} (predeterminado: @code{"/var/lib/postgresql/data"})
Directorio en el que se almacenan los datos.

@item @code{extension-packages} (predeterminado: @code{'()})
@cindex paquetes de extensión de postgresql (extension-packages)
Las extensiones adicionales se cargan de paquetes enumerados en
@var{extension-packages}. Las extensiones están disponibles en tiempo de
ejecución. Por ejemplo, para crear una base de datos geográfica con la
extensión @code{postgis}, una usuaria podría configurar el servicio
postgresql-service como en este ejemplo:

@cindex postgis
@lisp
(use-package-modules databases geo)

(operating-system
  ...
  ;; postgresql es necesario para ejecutar `psql' pero no se necesita
  ;; postgis para un funcionamiento correcto.
  (packages (cons* postgresql %base-packages))
  (services
    (cons*
      (service postgresql-service-type
               (postgresql-configuration
                (postgresql postgresql-10)
                (extension-packages (list postgis))))
      %base-services)))
@end lisp

Una vez hecho, la extensión estará visible y podrá inicializar una base de
datos geográfica de este modo:

@example
psql -U postgres
> create database pruebapostgis;
> \connect pruebapostgis;
> create extension postgis;
> create extension postgis_topology;
@end example

No es necesaria la adición de este campo para extensiones incluidas en la
distribución oficial@footnote{NdT: ``contrib'' de ``contributed'' en inglés,
``contribuciones'' podría entenderse en castellano.} como hstore o dblink,
puesto que ya pueden cargarse en postgresql. Este campo únicamente es
necesario para extensiones proporcionadas por otros paquetes.

@end table
@end deftp

@deftp {Tipo de datos} postgresql-config-file
Data type representing the PostgreSQL configuration file.  As shown in the
following example, this can be used to customize the configuration of
PostgreSQL@.  Note that you can use any G-expression or filename in place of
this record, if you already have a configuration file you'd like to use for
example.

@lisp
(service postgresql-service-type
         (postgresql-configuration
          (config-file
           (postgresql-config-file
            (log-destination "stderr")
            (hba-file
             (plain-file "pg_hba.conf"
                         "
local	all	all			trust
host	all	all	127.0.0.1/32 	md5
host	all	all	::1/128 	md5"))
            (extra-config
             '(("session_preload_libraries"     "auto_explain")
               ("random_page_cost"              2)
               ("auto_explain.log_min_duration" "100 ms")
               ("work_mem"                      "500 MB")
               ("logging_collector"             #t)
               ("log_directory"                 "/var/log/postgresql")))))))
@end lisp

@table @asis
@item @code{log-destination} (predeterminado: @code{"syslog"})
The logging method to use for PostgreSQL@.  Multiple values are accepted,
separated by commas.

@item @code{hba-file} (predeterminado: @code{%default-postgres-hba})
Nombre de archivo o expresión-G para la configuración de identificación
basada en nombres de máquina.

@item @code{ident-file} (predeterminado: @code{%default-postgres-ident})
Nombre de archivo o expresión-G para la configuración de asociación de
nombres de usuaria.

@item @code{socket-directory} (default: @code{"/var/run/postgresql"})
Specifies the directory of the Unix-domain socket(s) on which PostgreSQL is
to listen for connections from client applications. If set to @code{""}
PostgreSQL does not listen on any Unix-domain sockets, in which case only
TCP/IP sockets can be used to connect to the server.

By default, the @code{#false} value means the PostgreSQL default value will
be used, which is currently @samp{/tmp}.

@item @code{extra-config} (predeterminada: @code{'()})
Claves y valores adicionales que se incluirán en el archivo de configuración
de PostgreSQL. Cada entrada en la lista debe ser una lista cuyo primer
elemento sea la clave y los elementos restantes son los valores.

The values can be numbers, booleans or strings and will be mapped to
PostgreSQL parameters types @code{Boolean}, @code{String}, @code{Numeric},
@code{Numeric with Unit} and @code{Enumerated} described
@uref{https://www.postgresql.org/docs/current/config-setting.html, here}.

@end table
@end deftp

@deffn {Scheme Variable} postgresql-role-service-type
This service allows to create PostgreSQL roles and databases after
PostgreSQL service start.  Here is an example of its use.

@lisp
(service postgresql-role-service-type
            (postgresql-role-configuration
             (roles
              (list (postgresql-role
                     (name "test")
                     (create-database? #t))))))
@end lisp

This service can be extended with extra roles, as in this example:

@lisp
(service-extension postgresql-role-service-type
                   (const (postgresql-role
                           (name "alice")
                           (create-database? #t))))
@end lisp
@end deffn

@deftp {Data Type} postgresql-role
PostgreSQL manages database access permissions using the concept of roles.
A role can be thought of as either a database user, or a group of database
users, depending on how the role is set up.  Roles can own database objects
(for example, tables) and can assign privileges on those objects to other
roles to control who has access to which objects.

@table @asis
@item @code{name}
The role name.

@item @code{permissions} (default: @code{'(createdb login)})
The role permissions list.  Supported permissions are @code{bypassrls},
@code{createdb}, @code{createrole}, @code{login}, @code{replication} and
@code{superuser}.

@item @code{create-database?} (default: @code{#f})
Whether to create a database with the same name as the role.

@end table
@end deftp

@deftp {Data Type} postgresql-role-configuration
Data type representing the configuration of
@var{postgresql-role-service-type}.

@table @asis
@item @code{host} (default: @code{"/var/run/postgresql"})
The PostgreSQL host to connect to.

@item @code{log} (default: @code{"/var/log/postgresql_roles.log"})
File name of the log file.

@item @code{roles} (default: @code{'()})
The initial PostgreSQL roles to create.
@end table
@end deftp

@subsubheading MariaDB/MySQL

@defvr {Scheme Variable} mysql-service-type
This is the service type for a MySQL or MariaDB database server.  Its value
is a @code{mysql-configuration} object that specifies which package to use,
as well as various settings for the @command{mysqld} daemon.
@end defvr

@deftp {Tipo de datos} mysql-configuration
Data type representing the configuration of @var{mysql-service-type}.

@table @asis
@item @code{mysql} (predeterminado: @var{mariadb})
Objeto de paquete del servidor de bases de datos MySQL, puede ser tanto
@var{mariadb} como @var{mysql}.

Para MySQL, se mostrará una contraseña de root temporal durante el tiempo de
activación.  Para MariaDB, la contraseña de root está vacía.

@item @code{bind-address} (predeterminada: @code{"127.0.0.1"})
The IP on which to listen for network connections.  Use @code{"0.0.0.0"} to
bind to all available network interfaces.

@item @code{port} (predeterminado: @code{3306})
Puerto TCP en el que escucha el servidor de bases de datos a la espera de
conexiones entrantes.

@item @code{socket} (default: @code{"/run/mysqld/mysqld.sock"})
Socket file to use for local (non-network) connections.

@item @code{extra-content} (predeterminado: @code{""})
Additional settings for the @file{my.cnf} configuration file.

@item @code{extra-environment} (default: @code{#~'()})
List of environment variables passed to the @command{mysqld} process.

@item @code{auto-upgrade?} (default: @code{#t})
Whether to automatically run @command{mysql_upgrade} after starting the
service.  This is necessary to upgrade the @dfn{system schema} after
``major'' updates (such as switching from MariaDB 10.4 to 10.5), but can be
disabled if you would rather do that manually.

@end table
@end deftp

@subsubheading Memcached

@defvr {Variable Scheme} memcached-service-type
Este es el tipo de servicio para el servicio @uref{https://memcached.org/,
Memcached}, que proporciona caché distribuida en memoria.  El valor para
este tipo de servicio es un objeto @code{memcached-configuration}.
@end defvr

@lisp
(service memcached-service-type)
@end lisp

@deftp {Tipo de datos} memcached-configuration
Tipo de datos que representa la configuración de memcached.

@table @asis
@item @code{memcached} (predeterminado: @code{memcached})
El paquete de Memcached usado.

@item @code{interfaces} (predeterminadas: @code{'("0.0.0.0")})
Interfaces de red por las que se esperan conexiones.

@item @code{tcp-port} (predeterminado: @code{11211})
Port on which to accept connections.

@item @code{udp-port} (predeterminado: @code{11211})
Puerto en el que se deben aceptar conexiones UDP, el valor 0 desactiva la
escucha en un socket UDP.

@item @code{additional-options} (predeterminadas: @code{'()})
Opciones de línea de órdenes adicionales que se le proporcionarán a
@code{memcached}.
@end table
@end deftp

@subsubheading Redis

@defvr {Variable Scheme} redis-service-type
Es el tipo de servicio para el almacén de clave/valor
@uref{https://redis.io/, Redis}, cuyo valor es un objeto
@code{redis-configuration}.
@end defvr

@deftp {Tipo de datos} redis-configuration
Tipo de datos que representa la configuración de redis.

@table @asis
@item @code{redis} (predeterminado: @code{redis})
El paquete Redis usado.

@item @code{bind} (predeterminada: @code{"127.0.0.1"})
La interfaz de red en la que se escucha.

@item @code{port} (predeterminado: @code{6379})
Puerto en el que se aceptan conexiones, el valor 0 desactiva la escucha en
un socket TCP.

@item @code{working-directory} (predeterminado: @code{"/var/lib/redis"})
Directorio en el que se almacena los archivos de base de datos y
relacionados.
@end table
@end deftp

@node Servicios de correo
@subsection Servicios de correo

@cindex correo
@cindex correo electrónico (email)
El módulo @code{(gnu services mail)} proporciona definiciones de servicios
Guix para servicios de correo electrónico: servidores IMAP, POP3 y LMTP, así
como agentes de transporte de correo (MTA). ¡Muchos acrónimos! Estos
servicios se detallan en las subsecciones a continuación.

@subsubheading Servicio Dovecot

@deffn {Procedimiento Scheme} dovecot-service [#:config (dovecot-configuration)]
Devuelve un servicio que ejecuta el servidor de correo IMAP/POP3/LMTP
Dovecot.
@end deffn

Habitualmente Dovecot no necesita mucha configuración; el objeto de
configuración predeterminado creado por @code{(dovecot-configuration)} es
suficiente si su correo se entrega en @code{~/Maildir}. Un certificado
auto-firmado se generará para las conexiones protegidas por TLS, aunque
Dovecot también escuchará en puertos sin cifrar de manera
predeterminada. Existe un amplio número de opciones no obstante, las cuales
las administradoras del correo puede que deban cambiar, y como en el caso de
otros servicios, Guix permite a la administradora del sistema la
especificación de dichos parámetros a través de una interfaz Scheme
uniforme.

Por ejemplo, para especificar que el correo se encuentra en
@code{maildir:~/.correo}, se debe instanciar el servicio de Dovecot de esta
manera:

@lisp
(dovecot-service #:config
                 (dovecot-configuration
                  (mail-location "maildir:~/.correo")))
@end lisp

A continuación se encuentran los parámetros de configuración disponibles. El
tipo de cada parámetro antecede la definición del mismo; por ejemplo,
@samp{string-list foo} indica que el parámetro @code{foo} debe especificarse
como una lista de cadenas. También existe la posibilidad de especificar la
configuración como una cadena, si tiene un archivo @code{dovecot.conf}
antiguo que quiere trasladar a otro sistema; véase el final para más
detalles.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services mail).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as dovecot updates.

Los campos disponibles de @code{dovecot-configuration} son:

@deftypevr {parámetro de @code{dovecot-configuration}} package dovecot
El paquete dovecot.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-comas listen
Una lista de direcciones IP o nombres de máquina donde se escucharán
conexiones. @samp{*} escucha en todas las interfaces IPv4, @samp{::} escucha
en todas las interfaces IPv6. Si desea especificar puertos distintos a los
predefinidos o algo más complejo, personalice los campos de dirección y
puerto del @samp{inet-listener} de los servicios específicos en los que
tenga interés.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-protocol-configuration protocols
Lista de protocolos que se desea ofrecer. Los protocolos disponibles
incluyen @samp{imap}, @samp{pop3} y @samp{lmtp}.

Los campos disponibles de @code{protocol-configuration} son:

@deftypevr {parámetro de @code{protocol-configuration}} string name
El nombre del protocolo.
@end deftypevr

@deftypevr {parámetro de @code{protocol-configuration}} string auth-socket-path
Ruta del socket de UNIX del servidor de identificación maestro para la
búsqueda de usuarias. Se usa por parte de imap (para usuarias compartidas) y
lda. Su valor predeterminado es @samp{"/var/run/dovecot/auth-userdb"}.
@end deftypevr

@deftypevr {@code{protocol-configuration} parameter} boolean imap-metadata?
Whether to enable the @code{IMAP METADATA} extension as defined in
@uref{https://tools.ietf.org/html/rfc5464,RFC@tie{}5464}, which provides a
means for clients to set and retrieve per-mailbox, per-user metadata and
annotations over IMAP.

If this is @samp{#t}, you must also specify a dictionary @i{via} the
@code{mail-attribute-dict} setting.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{protocol-configuration} parameter} space-separated-string-list managesieve-notify-capabilities
Which NOTIFY capabilities to report to clients that first connect to the
ManageSieve service, before authentication.  These may differ from the
capabilities offered to authenticated users.  If this field is left empty,
report what the Sieve interpreter supports by default.

El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {@code{protocol-configuration} parameter} space-separated-string-list managesieve-sieve-capability
Which SIEVE capabilities to report to clients that first connect to the
ManageSieve service, before authentication.  These may differ from the
capabilities offered to authenticated users.  If this field is left empty,
report what the Sieve interpreter supports by default.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{protocol-configuration}} list-cadenas-separada-espacios mail-plugins
Lista separada por espacios de módulos a cargar.
@end deftypevr

@deftypevr {parámetro de @code{protocol-configuration}} entero-no-negativo mail-max-userip-connections
Número máximo de conexiones IMAP permitido para una usuaria desde cada
dirección IP. ATENCIÓN: El nombre de usuaria es sensible a las mayúsculas.
Su valor predeterminado es @samp{10}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-service-configuration services
Lista de servicios activados. Los servicios disponibles incluyen
@samp{imap}, @samp{imap-login}, @samp{pop3}, @samp{pop3-login}, @samp{auth}
y @samp{lmtp}.

Los campos disponibles de @code{service-configuration} son:

@deftypevr {parámetro de @code{service-configuration}} string kind
El tipo del servicio. Entre los valores aceptados se incluye
@code{director}, @code{imap-login}, @code{pop3-login}, @code{lmtp},
@code{imap}, @code{pop3}, @code{auth}, @code{auth-worker}, @code{dict},
@code{tcpwrap}, @code{quota-warning} o cualquier otro.
@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} lista-listener-configuration listeners
Procesos de escucha para el servicio.  Un proceso de escucha es un objeto
@code{unix-listener-configuration}, un objeto
@code{fifo-listener-configuration} o un objeto
@code{inet-listener-configuration}.
Su valor predeterminado es @samp{()}.

Los campos disponibles de @code{unix-listener-configuration} son:

@deftypevr {parámetro de @code{unix-listener-configuration}} string path
Ruta al archivo, relativa al campo @code{base-dir}. También se usa como
nombre de la sección.
@end deftypevr

@deftypevr {parámetro de @code{unix-listener-configuration}} string mode
Modo de acceso del socket.
Su valor predeterminado es @samp{"0600"}.
@end deftypevr

@deftypevr {parámetro de @code{unix-listener-configuration}} string user
Usuaria que posee el socket.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{unix-listener-configuration}} string group
Grupo que posee el socket.
Su valor predeterminado es @samp{""}.
@end deftypevr


Los campos disponibles de @code{fifo-listener-configuration} son:

@deftypevr {parámetro de @code{fifo-listener-configuration}} string path
Ruta al archivo, relativa al campo @code{base-dir}. También se usa como
nombre de la sección.
@end deftypevr

@deftypevr {parámetro de @code{fifo-listener-configuration}} string mode
Modo de acceso del socket.
Su valor predeterminado es @samp{"0600"}.
@end deftypevr

@deftypevr {parámetro de @code{fifo-listener-configuration}} string user
Usuaria que posee el socket.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{fifo-listener-configuration}} string group
Grupo que posee el socket.
Su valor predeterminado es @samp{""}.
@end deftypevr


Los campos disponibles de @code{inet-listener-configuration} son:

@deftypevr {parámetro de @code{inet-listener-configuration}} string protocol
El protocolo con el que se esperan las conexiones.
@end deftypevr

@deftypevr {parámetro de @code{inet-listener-configuration}} string address
La dirección en la que se escuchará, o vacío para escuchar en todas las
direcciones.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{inet-listener-configuration}} entero-no-negativo port
El puerto en el que esperarán conexiones.
@end deftypevr

@deftypevr {parámetro de @code{inet-listener-configuration}} boolean ssl?
Si se usará SSL para este servicio; @samp{yes} (sí), @samp{no} o
@samp{required} (necesario).
Su valor predeterminado es @samp{#t}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} entero-no-negativo client-limit
Número máximo de conexiones simultáneas por cliente por proceso. Una vez se
reciba este número de conexiones, la siguiente conexión entrante solicitará
a Dovecot el inicio de un nuevo proceso. Si se proporciona el valor 0, se
usa @code{default-client-limit}.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} entero-no-negativo service-count
Número de conexiones a manejar antes de iniciar un nuevo
proceso. Habitualmente los únicos valores útiles son 0 (ilimitadas) o 1. 1
es más seguro, pero 0 es más rápido. <doc/wiki/LoginProcess.txt>.
Su valor predeterminado es @samp{1}.

@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} entero-no-negativo process-limit
Número máximo de procesos que pueden existir para este servicio. Si se
proporciona el valor 0, se usa @code{default-process-limit}.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} entero-no-negativo process-min-avail
Número de procesos que siempre permanecerán a la espera de más
conexiones. Su valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{service-configuration}} entero-no-negativo vsz-limit
Si proporciona @samp{service-count 0}, probablemente necesitará incrementar
este valor. Su valor predeterminado es @samp{256000000}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} dict-configuration dict
Configuración de Dict, como la creada por el constructor
@code{dict-configuration}.

Los campos disponibles de @code{dict-configuration} son:

@deftypevr {parámetro de @code{dict-configuration}} campos-libres entries
Una lista de pares clave-valor que este diccionario debe incorporar.
Su valor predeterminado es @samp{()}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-passdb-configuration passdbs
Una lista de configuraciones de passdb, cada una creada por el constructor
@code{passdb-configuration}.

Los campos disponibles de @code{passdb-configuration} son:

@deftypevr {parámetro de @code{passdb-configuration}} string driver
El controlador que passdb debe usar. Entre los valores aceptados se incluye
@samp{pam}, @samp{passwd}, @samp{shadow}, @samp{bsdauth} y @samp{static}.
Su valor predeterminado es @samp{"pam"}.
@end deftypevr

@deftypevr {parámetro de @code{passdb-configuration}} lista-cadenas-separada-espacios args
Lista de parámetros separados por espacios para proporcionar al controlador
passdb.
Su valor predeterminado es @samp{""}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-userdb-configuration userdbs
Lista de configuraciones userdb, cada una creada por el constructor
@code{userdb-configuration}.

Los campos disponibles de @code{userdb-configuration} son:

@deftypevr {parámetro de @code{userdb-configuration}} string driver
El controlador que userdb debe usar. Entre los valores aceptados se incluye
@samp{passwd} y @samp{static}.
Su valor predeterminado es @samp{"passwd"}.
@end deftypevr

@deftypevr {parámetro de @code{userdb-configuration}} lista-cadenas-separada-espacios args
Lista separada por espacios de parámetros usados para el controlador userdb.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{userdb-configuration}} parámetros-libres override-fields
Sustituye los valores de campos de passwd.
Su valor predeterminado es @samp{()}.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} plugin-configuration plugin-configuration
Configuración del módulo, creada por el constructor
@code{plugin-configuration}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-namespace-configuration namespaces
Lista de espacios de nombres. Cada elemento de la lista debe crearse con el
constructor @code{namespace-configuration}.

Los campos disponibles de @code{namespace-configuration} son:

@deftypevr {parámetro de @code{namespace-configuration}} string name
Nombre para este espacio de nombres.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} string type
Tipo del espacio de nombres: @samp{private}, @samp{shared} o @samp{public}.
Su valor predeterminado es @samp{"private"}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} string separator
Hierarchy separator to use.  You should use the same separator for all
namespaces or some clients get confused.  @samp{/} is usually a good one.
The default however depends on the underlying mail storage format.  Defaults
to @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} string prefix
Prefix required to access this namespace.  This needs to be different for
all namespaces.  For example @samp{Public/}.  Defaults to @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} string location
Localización física de la bandeja de correo. En el mismo formato que la
localización del correo, que también es su valor predeterminado.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} boolean inbox?
Únicamente puede existir una bandeja de entrada (INBOX), y esta
configuración define qué espacio de nombres la posee.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} boolean hidden?
If namespace is hidden, it's not advertised to clients via NAMESPACE
extension.  You'll most likely also want to set @samp{list? #f}.  This is
mostly useful when converting from another server with different namespaces
which you want to deprecate but still keep working.  For example you can
create hidden namespaces with prefixes @samp{~/mail/}, @samp{~%u/mail/} and
@samp{mail/}.  Defaults to @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} boolean list?
Show the mailboxes under this namespace with the LIST command.  This makes
the namespace visible for clients that do not support the NAMESPACE
extension.  The special @code{children} value lists child mailboxes, but
hides the namespace prefix.  Defaults to @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} boolean subscriptions?
El espacio de nombres maneja sus propias subscripciones. Si es @code{#f}, el
espacio de nombres superior las maneja. El prefijo vacío siempre debe tener
este valor como @code{#t}.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{namespace-configuration}} lista-mailbox-configuration mailboxes
Lista de bandejas de correo predefinidas en este espacio de nombres.
Su valor predeterminado es @samp{()}.

Los campos disponibles de @code{mailbox-configuration} son:

@deftypevr {parámetro de @code{mailbox-configuration}} string name
Nombre de esta bandeja de correo.
@end deftypevr

@deftypevr {parámetro de @code{mailbox-configuration}} string auto
Con @samp{create} se crea de forma automática esta bandeja de correo. Con
@samp{subscribe} se crea y se suscribe a la bandeja de correo.
Su valor predeterminado es @samp{"no"}.
@end deftypevr

@deftypevr {parámetro de @code{mailbox-configuration}} lista-cadenas-separada-espacios special-use
Lista de atributos @code{SPECIAL-USE} de IMAP como se especifican en el RFC
6154. Entre los valores aceptados se incluye @code{\All}, @code{\Archive},
@code{\Drafts}, @code{\Flagged}, @code{\Junk}, @code{\Sent} y @code{\Trash}.
Su valor predeterminado es @samp{()}.
@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo base-dir
Directorio base donde se almacenan los datos de tiempo de ejecución.
Su valor predeterminado es @samp{"/var/run/dovecot/"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string login-greeting
Mensaje de saludo para clientes.
Su valor predeterminado es @samp{"Dovecot ready."}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios login-trusted-networks
Lista de rangos de red en los que se confía. Las conexiones desde estas IP
tienen permitido forzar sus direcciones IP y puertos (para el registro y las
comprobaciones de identidad). @samp{disable-plaintext-auth} también se
ignora en estas redes. Habitualmente aquí se especificarían los servidores
proxy IMAP.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios login-access-sockets
Lista de sockets para la comprobación de acceso al sistema (por ejemplo
tcpwrap).
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean verbose-proctitle?
Muestra títulos de procesamiento más detallados (en la
postdata). Actualmente muestra el nombre de la usuaria y su dirección IP. Es
útil para ver quién está usando procesos IMAP realmente (por ejemplo
bandejas de correo compartidas o si el mismo identificador numérico de
usuaria se usa para varias cuentas).
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean shutdown-clients?
Determina si se deben finalizar todos los procesos cuando el proceso maestro
de Dovecot termine su ejecución. El valor @code{#f} significa que Dovecot
puede actualizarse sin forzar el cierre de las conexiones existentes (aunque
esto puede ser un problema si la actualización se debe, por ejemplo, a la
corrección de una vulnerabilidad).
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo doveadm-worker-count
Si no es cero, ejecuta las ordenes del correo a través de este número de
conexiones al servidor doveadm, en vez de ejecutarlas directamente en el
mismo proceso.
Su valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string doveadm-socket-path
Socket UNIX o máquina:puerto usados para la conexión al servidor doveadm.
Su valor predeterminado es @samp{"doveadm-server"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios import-environment
Lista de variables de entorno que se preservan al inicio de Dovecot y se
proporcionan a los procesos iniciados. También puede proporcionar pares
clave=valor para proporcionar siempre dicha configuración específica.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean disable-plaintext-auth?
Desactiva la orden LOGIN y todas las otras identificaciones en texto plano a
menos que se use SSL/TLS (capacidad LOGINDISABLED). Tenga en cuenta que si
la IP remota coincide con la IP local (es decir, se ha conectado desde la
misma máquina), la conexión se considera segura y se permite la
identificación en texto plano. Véase también la configuración ssl=required.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo auth-cache-size
Tamaño de la caché de identificaciones (por ejemplo, @samp{#e10e6}. 0
significa que está desactivada. Tenga en cuenta que bsdauth, PAM y vpopmail
necesitan un valor en @samp{cache-key} para que se use la caché.
Su valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-cache-ttl
Tiempo de vida de los datos almacenados en caché. Los registros de caché no
se usan tras su expiración, *excepto* si la base de datos principal devuelve
un fallo interno. También se intentan manejar los cambios de contraseña de
manera automática: si la identificación previa de la usuaria fue
satisfactoria, pero no esta última, la caché no se usa. En estos momentos
únicamente funciona con identificación en texto plano.
Su valor predeterminado es @samp{"1 hour"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-cache-negative-ttl
Tiempo de vida para fallos de búsqueda en la caché (usuaria no encontrada,
la contraseña no coincide). 0 desactiva completamente su almacenamiento en
caché.
Su valor predeterminado es @samp{"1 hour"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios auth-realms
Lista de dominios para los mecanismos de identificación de SASL que
necesite. Puede dejarla vacía si no desea permitir múltiples
dominios. Muchos clientes simplemente usarán el primero de la lista, por lo
que debe mantener el dominio predeterminado en primera posición.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-default-realm
Dominio predeterminado usado en caso de no especificar ninguno. Esto se usa
tanto en dominios SASL y como al añadir @@dominio al nombre de usuaria en
los ingresos al sistema a través de texto en claro.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-username-chars
Lista de caracteres permitidos en los nombres de usuaria. Si el nombre de
usuaria proporcionado contiene un carácter no enumerado aquí, el login falla
automáticamente. Es únicamente una comprobación adicional para asegurarse de
que las usuarias no pueden explotar ninguna potencial vulnerabilidad con el
escape de comillas en bases de datos SQL/LDAP. Si desea permitir todos los
caracteres, establezca este valor a la cadena vacía.
Su valor predeterminado es
@samp{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@@"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-username-translation
Traducciones de caracteres de nombres de usuaria antes de que se busque en
las bases de datos. El valor contiene series de caracteres "original ->
transformado". Por ejemplo @samp{#@@/@@} significa que @samp{#} y @samp{/}
se traducen en @samp{@@}.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-username-format
Formato proporcionado al nombre de usuaria antes de buscarlo en las bases de
datos. Puede usar variables estándar aquí, por ejemplo %Lu transformará el
nombre a minúsculas, %n eliminará el fragmento del dominio si se
proporcionó, o @samp{%n-AT-%d} cambiaría @samp{@@} en @samp{-AT-}. Esta
traducción se realiza tras los cambios de @samp{auth-username-translation}.
Su valor predeterminado es @samp{"%Lu"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-master-user-separator
Si desea permitir que usuarias maestras ingresen mediante la especificación
del nombre de usuaria maestra dentro de la cadena de nombre de usuaria
normal (es decir, sin usar el mecanismo para ello implementado por SASL),
puede especificar aquí el carácter separador. El formato es entonces
<usuaria><separador><usuaria maestra>. UW-IMAP usa @samp{*} como separador,
por lo que esa puede ser una buena elección.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-anonymous-username
Usuaria usada para las usuarias que ingresen al sistema con el mecanismo de
SASL ANONYMOUS.
Su valor predeterminado es @samp{"anonymous"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo auth-worker-max-count
Número máximo de procesos de trabajo dovecot-auth. Se usan para la ejecución
de consultas bloqueantes a passdb y userdb (por ejemplo MySQL y PAM). Se
crean y destruyen bajo demanda de manera automática.
Su valor predeterminado es @samp{30}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-gssapi-hostname
Nombre de máquina usado en los nombres de GSSAPI principales. Por omisión se
usa el nombre devuelto por gethostname(). Use @samp{$ALL} (con comillas)
para permitir todas las entradas keytab.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-krb5-keytab
Keytab de Kerberos usado para el mecanismo GSSAPI. Si no se especifica
ninguno, se usa el predeterminado del sistema (habitualmente
@file{/etc/krb5.keytab}). Puede ser necesario cambiar el servicio auth para
que se ejecute como root y tenga permisos de lectura sobre este archivo.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-use-winbind?
Se identifica con NTLM y GSS-SPNEGO mediante el uso del daemon winbind de
Samba y la herramienta auxiliar
@samp{ntlm-auth}. <doc/wiki/Authentication/Mechanisms/Winbind.txt>.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo auth-winbind-helper-path
Ruta al binario de la herramienta auxiliar @samp{ntlm-auth} de Samba.
Su valor predeterminado es @samp{"/usr/bin/ntlm_auth"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-failure-delay
Tiempo de espera antes de responder a identificaciones fallidas.
Su valor predeterminado es @samp{"2 secs"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-ssl-require-client-cert?
Es necesario un certificado de cliente SSL válido o falla la identificación.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-ssl-username-from-cert?
Toma el nombre de usuaria del certificado de cliente SSL, mediante el uso de
@code{X509_NAME_get_text_by_NID()}, que devuelve el nombre común
(CommonName) del nombre de dominio (DN) del sujeto del certificado.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios auth-mechanisms
Lista de mecanismos de identificación deseados. Los mecanismos permitidos
son: @samp{plain}, @samp{login}, @samp{digest-md5}, @samp{cram-md5},
@samp{ntlm}, @samp{rpa}, @samp{apop}, @samp{anonymous}, @samp{gssapi},
@samp{otp}, @samp{key}, and @samp{gss-spnego}.  ATENCIÓN: Véase también la
opción de configuración @samp{disable-plaintext-auth}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios director-servers
Lista de IP o nombres de máquina de los servidores directores, incluyendo
este mismo. Los puertos se pueden especificar como ip:puerto. El puerto
predeterminado es el mismo que el usado por el servicio director
@samp{inet-listener}.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios director-mail-servers
Lista de IP o nombres de máquina de los servidores motores de correo. Se
permiten también rangos, como 10.0.0.10-10.0.0.30.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string director-user-expire
Por cuanto tiempo se redirige a las usuarias a un servidor específico tras
pasar ese tiempo sin conexiones.
Su valor predeterminado es @samp{"15 min"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string director-username-hash
Cómo se traduce el nombre de usuaria antes de aplicar el hash. Entre los
valores útiles se incluye %Ln si la usuaria puede ingresar en el sistema con
o sin @@dominio, %Ld si las bandejas de correo se comparten dentro del
dominio.
Su valor predeterminado es @samp{"%Lu"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string log-path
Archivo de registro usado para los mensajes de error. @samp{syslog} los
envía a syslog, @samp{"/dev/stderr"} a la salida de error estándar.
Su valor predeterminado es @samp{"syslog"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string info-log-path
Archivo de registro usado para los mensajes informativos. Por omisión se usa
@samp{log-path}.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string debug-log-path
Archivo de registro usado para los mensajes de depuración. Por omisión se
usa @samp{info-log-path}.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string syslog-facility
Subsistema de syslog (facility) usado si se envía el registro a syslog. De
manera habitual, si desea que no se use @samp{mail}, se usará
local0..local7. Otros subsistemas estándar también están implementados.
Su valor predeterminado es @samp{"mail"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-verbose?
Registra los intentos de identificación infructuosos y las razones por los
que fallaron.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string auth-verbose-passwords
En caso de no coincidir la contraseña, registra la contraseña que se
intentó. Los valores aceptados son ``no'', ``plain'' y ``sha1''. ``sha1''
puede ser útil para diferenciar intentos de descubrir la contraseña por
fuerza bruta frente a una usuaria simplemente intentando la misma contraseña
una y otra vez. También puede recortar el valor a n caracteres mediante la
adición de ":n" (por ejemplo ``sha1:6'').
Su valor predeterminado es @samp{"no"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-debug?
Registros aún más detallados para facilitar la depuración. Muestra, por
ejemplo, las consultas SQL.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean auth-debug-passwords?
En caso de no coincidir la contraseña, registra las contraseñas y esquema
usadas de manera que el problema se pueda depurar. La activación de este
valor también provoca la activación de @samp{auth-debug}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mail-debug?
Permite la depuración de los procesos de correo. Puede ayudarle a comprender
los motivos en caso de que Dovecot no encuentre sus correos.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean verbose-ssl?
Muestra los errores a nivel de protocolo SSL.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string log-timestamp
Prefijo de cada línea registrada en el archivo. Los códigos % tienen el
formato de strftime(3).
Su valor predeterminado es @samp{"\"%b %d %H:%M:%S \""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadenas-separada-espacios login-log-format-elements
Lista de elementos que se desea registrar. Los elementos que tengan valor de
variable no-vacía se unen para la formación de una cadena separada por
comas.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string login-log-format
Formato del registro de ingresos al sistema. %s contiene la cadena
@samp{login-log-format-elements}, %$ contiene los datos que se desean
registrar.
Su valor predeterminado es @samp{"%$: %s"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-log-prefix
Prefijo de los registros de procesos de correo. Véase doc/wiki/Variables.txt
para obtener una lista de variables que puede usar.
Su valor predeterminado es @samp{"\"%s(%u)<%@{pid@}><%@{session@}>: \""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string deliver-log-format
Formato usado para el registro de las entregas de correo. Puede usar las
variables:
@table @code
@item %$
Mensaje de estado de entrega (por ejemplo: @samp{saved to INBOX})
@item %m
Message-ID
@item %s
Asunto
@item %f
De (dirección)
@item %p
Tamaño físico
@item %w
Tamaño virtual.
@end table
El valor predeterminado es @samp{"msgid=%m: %$"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-location
Localización de las bandejas de correo de las usuarias. El valor
predeterminado está vacío, lo que significa que Dovecot intenta encontrar
las bandejas de correo de manera automática. Esto no funciona si la usuaria
no tiene todavía ningún correo, por lo que debe proporcionarle a Dovecot la
ruta completa.

Si usa mbox, proporcionar una ruta al archivo de la bandeja entrada
``INBOX'' (por ejemplo @file{/var/mail/%u}) no es suficiente. También debe
proporcionarle a Dovecot la ruta de otras bandejas de correo. Este es el
llamado @emph{directorio de correo raíz}, y debe ser la primera ruta
proporcionada en la opción @samp{mail-location}. 

Existen algunas variables especiales que puede usar, por ejemplo:

@table @samp
@item %u
nombre de usuaria
@item %n
parte de la usuaria en usuaria@@dominio, idéntica a %u si no existe dominio
@item %d
parte del dominio en usuaria@@dominio, vacía si no existe dominio
@item %h
directorio de la usuaria
@end table

Véase doc/wiki/Variables.txt para obtener una lista completa. Algunos
ejemplos:
@table @samp
@item maildir:~/Correo
@item mbox:~/correo:INBOX=/var/mail/%u
@item mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%
@end table
El valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-uid
Usuaria del sistema y grupo que realizan el acceso al correo. Si se usan
varias, userdb puede forzar su valor al devolver campos uid o gid. Se pueden
usar tanto identificadores numéricos como nominales. <doc/wiki/UserIds.txt>.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-gid

El valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-privileged-group
Grupo para permitir de forma temporal operaciones privilegiadas. Actualmente
esto se usa únicamente con la bandeja de entrada (INBOX), cuando su creación
inicial o el bloqueo con archivo @file{.lock} falle. Habitualmente se le
proporciona el valor @samp{"mail"} para tener acceso a @file{/var/mail}.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-access-groups
Proporciona acceso a estos grupos suplementarios a los procesos de
correo. Habitualmente se usan para configurar el acceso a bandejas de correo
compartidas. Tenga en cuenta que puede ser peligroso establecerlos si las
usuarias pueden crear enlaces simbólicos (por ejemplo si se configura el
grupo @samp{mail} aquí, @code{ln -s /var/mail ~/mail/var} puede permitir a
una usuaria borrar las bandejas de correo de otras usuarias, o @code{ln -s
/bandeja/compartida/secreta ~/mail/mibandeja} permitiría su lectura).
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration} parameter} string mail-attribute-dict
The location of a dictionary used to store @code{IMAP METADATA} as defined
by @uref{https://tools.ietf.org/html/rfc5464, RFC@tie{}5464}.

The IMAP METADATA commands are available only if the ``imap'' protocol
configuration's @code{imap-metadata?} field is @samp{#t}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mail-full-filesystem-access?
Allow full file system access to clients.  There's no access checks other
than what the operating system does for the active UID/GID@.  It works with
both maildir and mboxes, allowing you to prefix mailboxes names with e.g.@:
@file{/path/} or @file{~user/}.  Defaults to @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mmap-disable?
No usa @code{mmap()} en absoluto. Es necesario si almacena índices en
sistemas de archivos compartidos (NFS o sistemas de archivos en cluster).
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean dotlock-use-excl?
Confía en el correcto funcionamiento de @samp{O_EXCL} para la creación de
archivos de bloqueo dotlock. NFS implementa @samp{O_EXCL} desde la versión
3, por lo que debería ser seguro usarlo hoy en día de manera predeterminada.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-fsync
Cuando se usarán las llamadas fsync() o fdatasync():
@table @code
@item optimized
Cuando sea necesario para evitar la perdida de datos importantes
@item always
Útil con, por ejemplo, NFS, donde las escrituras con @code{write()} se
aplazan
@item never
Nunca se usa (mejor rendimiento, pero los fallos pueden producir pérdida de
datos)
@end table
Su valor predeterminado es @samp{"optimized"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mail-nfs-storage?
Mail storage exists in NFS@.  Set this to yes to make Dovecot flush NFS
caches whenever needed.  If you're using only a single mail server this
isn't needed.  Defaults to @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mail-nfs-index?
Mail index files also exist in NFS@.  Setting this to yes requires
@samp{mmap-disable? #t} and @samp{fsync-disable? #f}.  Defaults to
@samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string lock-method
Método de bloqueo para los archivos de índice. Las alternativas son fcntl,
flock y dotlock. Dotlock utiliza técnicas que pueden provocar un consumo de
E/S mayor que otros métodos de bloqueo. Usuarias de NFS: flock no funciona,
recuerde que se debe cambiar @samp{mmap-disable}.
Su valor predeterminado es @samp{"fcntl"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo mail-temp-dir
Directorio en el que LDA/LMTP almacena de manera temporal correos entrantes
de de más de 128 kB.
Su valor predeterminado es @samp{"/tmp"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo first-valid-uid
Rango de UID aceptado para las usuarias. Principalmente es para asegurarse
de que las usuarias no pueden ingresar en el sistema como un daemon u otras
usuarias del sistema. Tenga en cuenta que el binario de dovecot tiene código
que impide el ingreso al sistema como root y no puede llevarse a cabo
incluso aunque @samp{first-valid-uid} tenga el valor 0.
Su valor predeterminado es @samp{500}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo last-valid-uid

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo first-valid-gid
Rango de GID aceptado para las usuarias. Las usuarias que no posean GID
válido como ID primario de grupo no tienen permitido el ingreso al
sistema. Si la usuaria es miembro de grupos suplementarios con GID no
válido, no se activan dichos grupos.
Su valor predeterminado es @samp{1}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo last-valid-gid

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo mail-max-keyword-length
Longitud máxima permitida para nombres de palabras clave del correo. El
límite actúa únicamente en la creación de nuevas palabras clave.
Su valor predeterminado es @samp{50}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-archivos-sep-dos-puntos valid-chroot-dirs
Lista de directorios bajo los que se permite realizar la llamada al sistema
chroot a procesos de correo (es decir, @file{/var/mail} permitiría realizar
la llamada también en @file{/var/mail/sub/directorio}).  Esta configuración
no afecta a la configuración de @samp{login-chroot}, @samp{mail-chroot} o la
de chroot para identificación. En caso de estar vacía, se ignora
@samp{"/./"} en los directorios de usuarias. AVISO: Nunca añada directorios
que las usuarias locales puedan modificar, puesto que podría permitir
vulnerar el control de acceso como ``root''.  Habitualmente esta opción se
activa únicamente si no permite a las usuarias acceder a un intérprete de
órdenes.  <doc/wiki/Chrooting.txt>.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-chroot
Directorio predeterminado de la llamada al sistema chroot para los procesos
de correo. El valor puede forzarse para usuarias específicas en la base de
datos proporcionando @samp{/./} en el directorio de la usuaria (por ejemplo,
@samp{/home/./usuaria} llama a chroot con @file{/home}). Tenga en cuenta que
habitualmente no es necesario llamar a chroot, Dovecot no permite a las
usuarias el acceso a archivos más allá de su directorio de correo en
cualquier caso. Si sus directorios de usuaria contienen el directorio de
chroot como prefijo, agregue @samp{/.} al final de
@samp{mail-chroot}. <doc/wiki/Chrooting.txt>.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo auth-socket-path
Ruta al socket de UNIX al servidor maestro de identificación para la
búsqueda de usuarias. Se usa por parte de imap (para usuarias compartidas) y
lda.
Su valor predeterminado es @samp{"/var/run/dovecot/auth-userdb"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo mail-plugin-dir
Directorio en el que se buscarán módulos de correo.
Su valor predeterminado es @samp{"/usr/lib/dovecot"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadena-separada-espacios mail-plugins
Lista de módulos cargados en todos los servicios. Los módulos específicos
para IMAP, LDA, etc.@: se añaden en esta lista en sus propios archivos
.conf.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo mail-cache-min-mail-count
El número mínimo de correos en una bandeja antes de que las actualizaciones
se realicen en un archivo de caché. Permite optimizar el comportamiento de
Dovecot para reducir la tasa de escritura en el disco, lo que produce un
aumento de la tasa de lectura.
Su valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mailbox-idle-check-interval
Cuando se ejecute la orden IDLE, la bandeja de correo se comprueba de vez en
cuando para comprobar si existen nuevos correos o se han producido otros
cambios. Esta configuración define el tiempo mínimo entre dichas
comprobaciones. Dovecot también puede usar dnotify, inotify y kqueue para
recibir información inmediata sobre los cambios que ocurran.
Su valor predeterminado es @samp{"30 secs"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mail-save-crlf?
Save mails with CR+LF instead of plain LF@.  This makes sending those mails
take less CPU, especially with sendfile() syscall with Linux and FreeBSD@.
But it also creates a bit more disk I/O which may just make it slower.  Also
note that if other software reads the mboxes/maildirs, they may handle the
extra CRs wrong and cause problems.  Defaults to @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean maildir-stat-dirs?
De manera predeterminada la orden LIST devuelve todas las entradas en
maildir cuyo nombre empiece en punto. La activación de esta opción hace que
Dovecot únicamente devuelva las entradas que sean directorios. Esto se lleva
a cabo llamando a stat() con cada entrada, lo que causa mayor E/S del
disco. (En sistemas que proporcionen valor a @samp{dirent->d_type} esta
comprobación no tiene coste alguno y se realiza siempre independientemente
del valor configurado aquí).
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean maildir-copy-with-hardlinks?
Cuando se copia un mensaje, se usan enlaces duros cuando sea posible. Esto
mejora mucho el rendimiento, y es difícil que produzca algún efecto
secundario.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean maildir-very-dirty-syncs?
Asume que Dovecot es el único MUA que accede a maildir: Recorre el
directorio cur/ únicamente cuando cambie su mtime de manera inesperada o
cuando no se pueda encontrar el correo de otra manera.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadena-separada-espacios mbox-read-locks
Qué métodos de bloqueo deben usarse para el bloque de mbox. Hay cuatro
disponibles:

@table @code
@item dotlock
Crea un archivo <bandeja>.lock. Esta es la solución más antigua y más segura
con NFS. Si desea usar un directorio como /var/mail/, las usuarias
necesitarán acceso de escritura a dicho directorio.
@item dotlock-try
Lo mismo que dotlock, pero si se produce un fallo debido a los permisos o a
que no existe suficiente espacio en disco, simplemente se omite el bloqueo.
@item fcntl
Use este a ser posible. Funciona también con NFS si se usa lockd.
@item flock
Puede no existir en todos los sistemas. No funciona con NFS.
@item lockf
Puede no existir en todos los sistemas. No funciona con NFS.
@end table

Puede usar múltiples métodos de bloqueo; en ese caso el orden en el que se
declaran es importante para evitar situaciones de bloqueo mutuo en caso de
que otros MTA/MUA usen también múltiples métodos de bloqueo. Algunos
sistemas operativos no permiten el uso de varios de ellos de manera
simultánea.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadena-separada-espacios mbox-write-locks

@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mbox-lock-timeout
Tiempo máximo esperado hasta el bloqueo (de todos los archivos) antes de
interrumpir la operación.
Su valor predeterminado es @samp{"5 mins"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mbox-dotlock-change-timeout
Si existe el archivo dotlock pero la bandeja no se ha modificado de ninguna
manera, ignora el archivo de bloqueo tras este tiempo.
Su valor predeterminado es @samp{"2 mins"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mbox-dirty-syncs?
Cuando el archivo mbox cambie de manera inesperada, se tiene que leer
completamente para encontrar los cambios. Si es grande puede tardar bastante
tiempo. Deido a que el cambio habitualmente es un nuevo correo añadido al
final, sería más rápido únicamente leer los correos nuevos. Si se activa
esta opción, Dovecot hace esto pero de todos modos vuelve a leer el archivo
mbox al completo cuando algo en la bandeja no se encuentra como se
esperaba. La única desventaja real de esta configuración es que si otro MUA
cambia las opciones de los mensajes, Dovecot no tiene constancia de ello de
manera inmediata. Tenga en cuenta que una sincronización completa se lleva a
cabo con las órdenes SELECT, EXAMINE, EXPUNGE y CHECK.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mbox-very-dirty-syncs?
Como @samp{mbox-dirty-syncs}, pero no realiza sincronizaciones completas
tampoco con las órdenes SELECT, EXAMINE, EXPUNGE o CHECK. Si se configura
este valor, @samp{mbox-dirty-syncs} se ignora.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mbox-lazy-writes?
Retrasa la escritura de las cabeceras de mbox hasta que se realice una
escritura completa sincronizada (con las órdenes EXPUNGE y CHECK, y al
cerrar la bandeja de correo). Es útil especialmente con POP3, donde el
cliente habitualmente borra todos los correos. La desventaja es que nuestros
cambios no son visibles para otros MUA de manera inmediata.
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo mbox-min-index-size
Si el tamaño del archivo mbox es menor que este valor (por ejemplo, 100k),
no escribe archivos de índice. Si el archivo de índice ya existe, todavía se
usa para la lectura, pero no se actualiza.
Su valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo mdbox-rotate-size
Tamaño máximo del archivo dbox hasta su rotación.
Su valor predeterminado es @samp{10000000}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mdbox-rotate-interval
Antigüedad máxima del archivo dbox hasta que se produce su
rotación. Habitualmente en días. El día comienza a medianoche, por lo que 1d
= hoy, 2d = ayer, etcétera. 0 = comprobación desactivada.
Su valor predeterminado es @samp{"1d"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean mdbox-preallocate-space?
Cuando se crean nuevos archivos mdbox, reserva inmediatamente un tamaño de
@samp{mbox-rotate-size}. Actualmente esta configuración funciona únicamente
en Linux con determinados sistemas de archivos (ext4, xfs).
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-attachment-dir
sdbox y mdbox permiten el almacenamiento de adjuntos en archivos externos,
lo que permite también su almacenamiento único. Otros motores no lo permiten
por el momento.

AVISO: Esta característica todavía no se ha probado mucho. Su uso queda bajo
su propia responsabilidad.

Directorio raíz donde almacenar los adjuntos de los correos. Se desactiva en
caso de estar vacío.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo mail-attachment-min-size
Los adjuntos de menor tamaño que este valor no se almacenan
externamente. También es posible la escritura de un módulo que deshabilite
el almacenamiento externo de adjuntos específicos.
Su valor predeterminado es @samp{128000}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-attachment-fs
Motor del sistema de archivos usado para el almacenamiento de adjuntos:
@table @code
@item posix
Dovecot no lleva a cabo el SiS (aunque esto puede ayudar a la deduplicación
del propio sistema de archivos)
@item sis posix
SiS con comparación inmediata byte-por-byte durante el almacenamiento.
@item sis-queue posix
SiS mediante comparación retrasada y deduplicación.
@end table
El valor predeterminado es @samp{"sis posix"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string mail-attachment-hash
Formato del hash usado en los archivos adjuntos. Puede añadir cualquier
texto y variables: @code{%@{md4@}}, @code{%@{md5@}}, @code{%@{sha1@}},
@code{%@{sha256@}}, @code{%@{sha512@}}, @code{%@{size@}}.  Las variables
pueden reducirse, por ejemplo @code{%@{sha256:80@}} devuelve únicamente los
primeros 80 bits.
Su valor predeterminado es @samp{"%@{sha1@}"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo default-process-limit

El valor predeterminado es @samp{100}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo default-client-limit

El valor predeterminado es @samp{1000}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo default-vsz-limit
Límite predeterminado del tamaño de memoria virtual (VSZ) para procesos del
servicio. Esta principalmente orientado a la captura y parada de procesos
que pierden memoria antes de que utilicen toda la disponible.
Su valor predeterminado es @samp{256000000}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string default-login-user
Usuaria de ingreso al sistema para los procesos de ingreso al sistema. Es la
usuaria en la que menos se confía en el sistema Dovecot. No debería tener
acceso a nada en absoluto.
Su valor predeterminado es @samp{"dovenull"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string default-internal-user
Usuaria interna usada por procesos sin privilegios. Debería ser distinta a
la usuaria de ingreso, de modo que los procesos de ingreso al sistema no
interfieran con otros procesos.
Su valor predeterminado es @samp{"dovecot"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl?
Si se permite SSL/TLS: @samp{yes} (sí), @samp{no}, @samp{required}
(necesario). <doc/wiki/SSL.txt>.
Su valor predeterminado es @samp{"required"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-cert
Certificado X.509 de SSL/TLS codificado con PEM (clave pública).
Su valor predeterminado es @samp{"</etc/dovecot/default.pem"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-key
Clave privada de SSL/TLS codificada con PEM. La clave se abre antes de
renunciar a los privilegios de root, por lo que debe mantenerse legible
únicamente para root.
Su valor predeterminado es @samp{"</etc/dovecot/private/default.pem"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-key-password
Si el archivo de la clave está protegido por contraseña, introduzca dicha
contraseña aquí. De manera alternativa, puede proporcionarla al iniciar
dovecot con el parámetro -p. Como este archivo es habitualmente legible por
todo el mundo, puede que desee desplazar esta opción a un archivo diferente.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-ca
Certificado usado como autoridad de certificación de confianza codificado en
PEM. Configure este valor únicamente si tiene intención de usar
@samp{ssl-verify-client-cert? #t}. El archivo debe contener el archivo de la
o las AC seguido de las CRL correspondientes (por ejemplo, @samp{ssl-ca
</etc/ssl/certs/ca.pem}).
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean ssl-require-crl?
Es necesario que la comprobación de CRL sea satisfactoria para certificados
de clientes..
Su valor predeterminado es @samp{#t}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean ssl-verify-client-cert?
Solicita al cliente el envío de un certificado. Si también desea que sea un
requisito, proporcione @samp{auth-ssl-require-client-cert? #t} en la sección
de identificación.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-cert-username-field
Cual es el campo del certificado que determina el nombre de
usuaria. ``commonName'' y ``x500UniqueIdentifier'' son las opciones
habituales. También tendrá proporcionar @samp{auth-ssl-username-from-cert?
#t}.
Su valor predeterminado es @samp{"commonName"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-min-protocol
Versión mínima aceptada del protocolo SSL.
Su valor predeterminado es @samp{"TLSv1"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-cipher-list
Protocolos de cifrado de SSL usados.
Su valor predeterminado es
@samp{"ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@@STRENGTH"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string ssl-crypto-device
Dispositivo de cifrado de SSL usado, ejecute "openssl engine" para obtener
los valores aceptados.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string postmaster-address
Dirección usada cuando se notifiquen correos rechazados. %d expande al
dominio receptor.
Su valor predeterminado es @samp{"postmaster@@%d"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string hostname
Nombre de máquina usado en diversas partes de los correos enviados (por
ejemplo, en Message-Id) y en las respuestas LMTP. Su valor predeterminado es
<el nombre real de la máquina>@@dominio.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean quota-full-tempfail?
Si la usuaria supera la cuota, devuelve un fallo temporal en vez de rechazar
el correo.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} nombre-archivo sendmail-path
Binario usado para el envío de correos.
Su valor predeterminado es @samp{"/usr/sbin/sendmail"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string submission-host
Si no está vacío, envía el correo a través de esta máquina[:puerto] SMTP en
vez de usar sendmail
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string rejection-subject
Asunto: cabecera usada en el rechazo de correos. Puede usar las mismas
variables que las indicadas en @samp{rejection-reason} a continuación.
Su valor predeterminado es @samp{"Rejected: %s"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string rejection-reason
Mensaje de error legible por personas para el rechazo de correos. Puede usar
variables:

@table @code
@item %n
CRLF
@item %r
razón
@item %s
asunto original
@item %t
receptora
@end table
El valor predeterminado es @samp{"Your message to <%t> was automatically
rejected:%n%r"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string recipient-delimiter
Carácter delimitador entre la parte local y el detalle en las direcciones de
correo. Su valor predeterminado es @samp{"+"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string lda-original-recipient-header
Cabecera de donde se obtiene la dirección receptora original (la dirección
de SMTP RCPT TO:) en caso de no estar disponible en otro lugar. El parámetro
-a de dovecot-lda reemplaza este valor. Una cabecera usada para esto de
manera común es X-Original-To.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean lda-mailbox-autocreate?
¿Se debe crear una bandeja de correo no existente de manera automática al
almacenar un correo?
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} boolean lda-mailbox-autosubscribe?
¿También Se deben crear suscripciones de manera automática a las bandejas de
correo creadas?
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} entero-no-negativo imap-max-line-length
Longitud máxima de la línea de órdenes de IMAP. Algunos clientes generan
líneas de órdenes muy largas con bandejas de correo enormes, por lo que debe
incrementarlo si recibe los errores ``Too long argument'' (parámetro
demasiado largo) o "IMAP command line too large" (línea de órdenes de IMAP
demasiado grande).
Su valor predeterminado es @samp{64000}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-logout-format
Formato de la cadena de IMAP de salida del sistema:
@table @code
@item %i
número total de bytes leídos del cliente
@item %o
número total de bytes enviados al cliente.
@end table
Véase @file{doc/wiki/Variables.txt} para obtener una lista completa de todas
las variables que puede usar.
Su valor predeterminado es @samp{"in=%i out=%o deleted=%@{deleted@}
expunged=%@{expunged@} trashed=%@{trashed@} hdr_count=%@{fetch_hdr_count@}
hdr_bytes=%@{fetch_hdr_bytes@} body_count=%@{fetch_body_count@}
body_bytes=%@{fetch_body_bytes@}"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-capability
Fuerza el valor de la respuesta de IMAP CAPABILITY. Si el valor comienza con
'+', añade las capacidades especificadas sobre las predeterminadas (por
ejemplo, +XFOO XBAR).
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-idle-notify-interval
Durante cuanto tiempo se espera entre notificaciones "OK Still here" cuando
el cliente se encuentre en estado IDLE.
Su valor predeterminado es @samp{"2 mins"}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-id-send
Nombres y valores de campos de identificación (ID) que se enviarán a los
clientes. El uso de * como un valor hace que Dovecot utilice el valor
predeterminado. Los siguientes campos tienen actualmente valores
predeterminados: name, version, os, os-version, support-url, support-email.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-id-log
Campos de identificación (ID) enviados para su registro por
cliente. @code{*} significa todos.
Su valor predeterminado es @samp{""}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} lista-cadena-separada-espacios imap-client-workarounds
Soluciones temporales para varios errores de clientes:

@table @code
@item delay-newmail
Envía notificaciones de nuevo correo EXISTS/RECENT únicamente en respuesta a
ordenes NOOP o CHECK. Algunos clientes las ignoran en otro caso, por ejemplo
OSX Mail (<v2.1). Outlook Express tiene problemas mayores no obstante, sin
esto puede mostrar a la usuaria errores "Message no longer in server". Tenga
en cuenta que OE6 también falla con esta solución temporal si la
sincronización se establece como "Headers Only".

@item tb-extra-mailbox-sep
Thunderbird se confunde de algún modo con LAYOUT=fs (mbox y dbox) y añade
sufijos @samp{/} adicionales a los nombres de las bandejas de correo. Esta
opción hace que Dovecot ignore el carácter @samp{/} adicional en vez de
tratarlo como un nombre de bandeja de correo no válido.

@item tb-lsub-flags
Muestra las opciones \Noselect para respuestas LSUB con LAYOUT=fs (por
ejemplo mbox). Esto permite a Thunderbird ser consciente de que no se pueden
seleccionar y mostrarlas en gris, en vez de únicamente mostrar después el
mensaje de error "no seleccionable".
@end table
El valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{dovecot-configuration}} string imap-urlauth-host
Máquina permitida en las URL URLAUTH enviadas por el cliente. "*" permite
todas. Su valor predeterminado es @samp{""}.
@end deftypevr


¡Miau! Muchas opciones de configuración. Lo bueno es que Guix tiene una
interfaz completa al lenguage de configuración de Dovecot. Esto no permite
únicamente declarar configuraciones de forma bonita, sino que también ofrece
capacidades reflexivas: las usuarias pueden escribir código en Scheme para
inspeccionar y transformar configuraciones.

No obstante, puede ser que únicamente desee usar un archivo
@code{dovecot.conf} existente. En ese caso, puede proporcionar un objeto
@code{opaque-dovecot-configuration} como parámetro @code{#:config} a
@code{dovecot-service}. Como su nombre en inglés indica, una configuración
opaca no tiene gran capacidad reflexiva.

Los campos disponibles de @code{opaque-dovecot-configuration} son:

@deftypevr {parámetro de @code{opaque-dovecot-configuration}} package dovecot
El paquete dovecot.
@end deftypevr

@deftypevr {parámetro de @code{opaque-dovecot-configuration}} string string
El contenido de @code{dovecot.conf}, como una cadena.
@end deftypevr

Por ejemplo, si su @code{dovecot.conf} fuese simplemente la cadena vacía,
podría instanciar un servicio dovecot de esta manera:

@lisp
(dovecot-service #:config
                 (opaque-dovecot-configuration
                  (string "")))
@end lisp

@subsubheading Servicio OpenSMTPD

@deffn {Variable Scheme} opensmtpd-service-type
Es el tipo del servicio @uref{https://www.opensmtpd.org, OpenSMTPD}, cuyo
valor debe ser un objeto @code{opensmtpd-configuration} como en este
ejemplo:

@lisp
(service opensmtpd-service-type
         (opensmtpd-configuration
           (config-file (local-file "./mi-smtpd.conf"))))
@end lisp
@end deffn

@deftp {Tipo de datos} opensmtpd-configuration
Tipo de datos que representa la configuración de opensmtpd.

@table @asis
@item @code{package} (predeterminado: @var{opensmtpd})
El objeto paquete del servidor SMTP OpenSMTPD.

@item @code{config-file} (default: @code{%default-opensmtpd-config-file})
Objeto ``tipo-archivo'' del archivo de configuración de OpenSMTPD usado. De
manera predeterminada escucha en la interfaz de red local, y pone a
disposición de usuarias y daemon de la máquina local el servicio de correo,
así como el envío de correo a servidores remotos. Ejecute @command{man
smtpd.conf} para obtener más información.

@item @code{setgid-commands?} (default: @code{#t})
Make the following commands setgid to @code{smtpq} so they can be executed:
@command{smtpctl}, @command{sendmail}, @command{send-mail},
@command{makemap}, @command{mailq}, and @command{newaliases}.  @xref{Programas con setuid}, for more information on setgid programs.
@end table
@end deftp

@subsubheading Servicio Exim

@cindex agente para el envío de correo (MTA)
@cindex MTA (agente para el envío de correo)
@cindex SMTP

@deffn {Variable Scheme} exim-service-type
Este es el tipo del agente de transferencia de correo (MTA)
@uref{https://exim.org, Exim}, cuyo valor debe ser un objeto
@code{exim-configuration} como en este ejemplo:

@lisp
(service exim-service-type
         (exim-configuration
           (config-file (local-file "./mi-exim.conf"))))
@end lisp
@end deffn

Para usar un servicio @code{exim-service-type} debe tener también un
servicio @code{mail-aliases-service-type} presente en su declaración
@code{operating-system} (incluso aunque no exista ningún alias).

@deftp {Tipo de datos} exim-configuration
Tipo de datos que representa la configuración de exim.

@table @asis
@item @code{package} (predeterminado: @var{exim})
El objeto paquete del servidor Exim.

@item @code{config-file} (predeterminado: @code{#f})
File-like object of the Exim configuration file to use.  If its value is
@code{#f} then use the default configuration file from the package provided
in @code{package}.  The resulting configuration file is loaded after setting
the @code{exim_user} and @code{exim_group} configuration variables.

@end table
@end deftp

@subsubheading Servicio Getmail

@cindex IMAP
@cindex POP

@deffn {Variable Scheme} getmail-service-type
El tipo del receptor de correo @uref{http://pyropus.ca/software/getmail/,
Getmail}, cuyo valor debe ser un objeto @code{getmail-configuration}.
@end deffn

Los campos disponibles de @code{getmail-configuration} son:

@deftypevr {parámetro de @code{getmail-configuration}} símbolo name
Un símbolo que identifique el servicio getmail.

El valor predeterminado es @samp{"unset"}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} package package
El paquete getmail usado.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} string user
Usuaria que ejecuta getmail.

El valor predeterminado es @samp{"getmail"}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} string group
Grupo que ejecuta getmail.

El valor predeterminado es @samp{"getmail"}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} string directory
El directorio usado para getmail.

El valor predeterminado es @samp{"/var/lib/getmail/default"}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} getmail-configuration-file rcfile
El archivo de configuración de getmail usado.

Los campos disponibles de @code{getmail-configuration-file} son:

@deftypevr {parámetro de @code{getmail-configuration-file}} getmail-retriever-configuration retriever
De qué cuenta de correo obtener el correo, y cómo acceder a dicha cuenta.

Los campos disponibles de @code{getmail-retriever-configuration} son:

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string type
El controlador que userdb debe usar. Entre los valores aceptados se incluye
@samp{passwd} y @samp{static}.

El valor predeterminado es @samp{"SimpleIMAPSSLRetriever"}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string server
Usuaria que ejecutará el servidor de correo.

El valor predeterminado es @samp{unset}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string username
Usuaria que ejecutará el servidor de correo.

El valor predeterminado es @samp{unset}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} entero-no-negativo port
Número de puerto al que conectarse.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string password
Sustituye los valores de campos de passwd.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} list password-command
Sustituye los valores de campos de passwd.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string keyfile
Archivo de claves con formato PEM usado para la negociación TLS.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string certfile
Archivo de certificado con formato PEM usado para la negociación TLS.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} string ca-certs
Certificados de autoridad de certificación (CA) usados.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-retriever-configuration}} parameter-alist extra-parameters
Parámetros adicionales del receptor de correo.

El valor predeterminado es @samp{()}.

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration-file}} getmail-destination-configuration destination
Qué hacer con los mensajes obtenidos.

Los campos disponibles de @code{getmail-destination-configuration} son:

@deftypevr {parámetro de @code{getmail-destination-configuration}} string type
Tipo de destino del correo. Entre los valores válidos se incluye
@samp{Maildir}, @samp{Mboxrd} y @samp{MDA_external}.

El valor predeterminado es @samp{unset}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-destination-configuration}} string-or-filelike path
Opción de ruta para el destino del correo. El comportamiento depende del
tipo seleccionado.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-destination-configuration}} parameter-alist extra-parameters
Parámetros adicionales del destino.

El valor predeterminado es @samp{()}.

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration-file}} getmail-options-configuration options
Configuración de getmail.

Los campos disponibles de @code{getmail-options-configuration} son:

@deftypevr {parámetro de @code{getmail-options-configuration}} entero-no-negativo verbose
If set to @samp{0}, getmail will only print warnings and errors.  A value of
@samp{1} means that messages will be printed about retrieving and deleting
messages.  If set to @samp{2}, getmail will print messages about each of its
actions.

El valor predeterminado es @samp{1}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean read-all
Si es verdadero, getmail obtendrá todos los mensajes disponibles. En otro
caso, únicamente recupera mensajes que no se hayan visto previamente.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean delete
Si se proporciona un valor verdadero, los mensajes se borrarán del servidor
tras su recuperación y entrega posterior satisfactoria. En otro caso, los
mensajes permanecerán en el servidor.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} entero-no-negativo delete-after
Getmail borrará los mensajes tras este número de días después de haberlos
visto, si han sido entregados. Esto significa que los mensajes se mantendrán
en el servidor este número de días tras entregarlos. El valor @samp{0}
desactiva esta característica.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} entero-no-negativo delete-bigger-than
Borra los mensajes de tamaño mayor que estos bytes tras recibirlos, incluso
si las opciones ``delete'' y ``delete-after'' están desactivadas. El valor
@samp{0} desactiva esta característica.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} entero-no-negativo max-bytes-per-session
Obtiene mensajes hasta este número de bytes en total antes de cerrar la
sesión con el servidor. El valor @samp{0} desactiva esta característica.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} entero-no-negativo max-message-size
No obtiene mensajes con mayor tamaño que este número de bytes. El valor
@samp{0} desactiva esta característica.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean delivered-to
Si es verdadero, getmail añadirá una cabecera ``Delivered-To'' a los
mensajes.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean received
Si es verdadero, getmail añadirá una cabecera ``Received'' a los mensajes.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} string message-log
Getmail generará un registro de sus acciones en el archivo nombrado. El
valor @samp{""} desactiva esta característica.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean message-log-syslog
Si es verdadero, getmail registrará sus acciones a través del registro del
sistema.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} boolean message-log-verbose
Si es verdadero, getmail registrará información sobre los mensajes que no se
hayan podido recuperar y la razón para no hacerlo, así como líneas de inicio
y fin informativas.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{getmail-options-configuration}} parameter-alist extra-parameters
Opciones adicionales a incluir.

El valor predeterminado es @samp{()}.

@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} lista idle
Una lista de bandejas de correo en las que getmail debe esperar en el
servidor nuevas notificaciones de correo. Esto depende de que el servidor
implemente la extensión IDLE.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{getmail-configuration}} lista environment-variables
Variables de entorno proporcionadas a getmail.

El valor predeterminado es @samp{()}.

@end deftypevr

@subsubheading Servicios de alias de correo

@cindex correo electrónico, alias
@cindex alias, para direcciones de correo electrónico

@deffn {Variable Scheme} mail-aliases-service-type
Este es el tipo del servicio que proporciona @code{/etc/aliases}, donde se
especifica cómo entregar el correo a las usuarias de este sistema.

@lisp
(service mail-aliases-service-type
         '(("postmaster" "rober")
           ("rober" "rober@@example.com" "rober@@example2.com")))
@end lisp
@end deffn

The configuration for a @code{mail-aliases-service-type} service is an
association list denoting how to deliver mail that comes to this system.
Each entry is of the form @code{(alias addresses ...)}, with @code{alias}
specifying the local alias and @code{addresses} specifying where to deliver
this user's mail.

The aliases aren't required to exist as users on the local system.  In the
above example, there doesn't need to be a @code{postmaster} entry in the
@code{operating-system}'s @code{user-accounts} in order to deliver the
@code{postmaster} mail to @code{bob} (which subsequently would deliver mail
to @code{bob@@example.com} and @code{bob@@example2.com}).

@subsubheading daemon de IMAP3 de GNU Mailutils
@cindex daemon de IMAP3 de GNU Mailutils

@deffn {Variable Scheme} imap4d-service-type
Es el tipo del daemon IMAP4 de GNU Mailutils (@pxref{imap4d,,, mailutils,
GNU Mailutils Manual}), cuyo valor debe ser un objeto
@code{imap4d-configuration} como en este ejemplo:

@lisp
(service imap4d-service-type
         (imap4d-configuration
           (config-file (local-file "imap4d.conf"))))
@end lisp
@end deffn

@deftp {Tipo de datos} imap4d-configuration
Tipo de datos que representa la configuración de @command{imap4d}.

@table @asis
@item @code{package} (predeterminado: @code{mailutils})
El paquete que proporciona @command{imap4d}.

@item @code{config-file} (predeterminado: @code{%default-imap4d-config-file})
Objeto ``tipo-archivo'' con el archivo de configuración usado, de manera
predeterminada escucha en el puerto TCP 143 de
@code{localhost}. @xref{Conf-imap4d,,, mailutils, GNU Mailutils Manual},
para más detalles.

@end table
@end deftp

@subsubheading Radicale Service
@cindex CalDAV
@cindex CardDAV

@deffn {Scheme Variable} radicale-service-type
This is the type of the @uref{https://radicale.org, Radicale} CalDAV/CardDAV
server whose value should be a @code{radicale-configuration}.
@end deffn

@deftp {Data Type} radicale-configuration
Data type representing the configuration of @command{radicale}.

@table @asis
@item @code{package} (default: @code{radicale})
The package that provides @command{radicale}.

@item @code{config-file} (default: @code{%default-radicale-config-file})
File-like object of the configuration file to use, by default it will listen
on TCP port 5232 of @code{localhost} and use the @code{htpasswd} file at
@file{/var/lib/radicale/users} with no (@code{plain}) encryption.

@end table
@end deftp

@node Servicios de mensajería
@subsection Servicios de mensajería

@cindex mensajería
@cindex jabber
@cindex XMPP
El módulo @code{(gnu services messaging)} proporciona definiciones de
servicios Guix para servicios de mensajería. Actualmente proporciona los
siguientes servicios:

@subsubheading Servicio Prosody

@deffn {Variable Scheme} prosody-service-type
Este es el tipo para el @uref{https://prosody.im, servidor de comunicaciones
XMPP Prosody}. Su valor debe ser un registro @code{prosody-configuration}
como en este ejemplo:

@lisp
(service prosody-service-type
         (prosody-configuration
          (modules-enabled (cons* "groups" "mam" %default-modules-enabled))
          (int-components
           (list
            (int-component-configuration
             (hostname "conference.ejemplo.net")
             (plugin "muc")
             (mod-muc (mod-muc-configuration)))))
          (virtualhosts
           (list
            (virtualhost-configuration
             (domain "ejemplo.net"))))))
@end lisp

Véase a continuación detalles acerca de @code{prosody-configuration}.

@end deffn

De manera predeterminada, Prosody no necesita demasiada
configuración. Únicamente un campo @code{virtualhost} es necesario:
especifica el dominio en el que se desea que Prosody proporcione el
servicio.

Puede realizar varias comprobaciones preliminares sobre la configuración
generada con la orden @code{prosodyctl check}.

Prosodyctl también le ayudará con la importación de certificados del
directorio @code{letsencrypt} de modo que la usuaria @code{prosody} puede
acceder a ellos. Véase @url{https://prosody.im/doc/letsencrypt}.

@example
prosodyctl --root cert import /etc/letsencrypt/live
@end example

The available configuration parameters follow.  Each parameter definition is
preceded by its type; for example, @samp{string-list foo} indicates that the
@code{foo} parameter should be specified as a list of strings.  Types
starting with @code{maybe-} denote parameters that won't show up in
@code{prosody.cfg.lua} when their value is left unspecified.

También existe la posibilidad de especificar la configuración como una
cadena, por si tiene un archivo @code{prosody.cfg.lua} antiguo que desea
transportar desde otro sistema; véase más detalles al final.

El tipo @code{file-object} designa o bien un objeto ``tipo-archivo''
(@pxref{Expresiones-G, objetos ``tipo-archivo''}) o un nombre de archivo.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services messaging).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as Prosody updates.

Los campos disponibles de @code{prosody-configuration} son:

@deftypevr {parámetro de @code{prosody-configuration}} package prosody
El paquete Prosody.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} nombre-archivo data-path
Ruta del directorio de almacenamiento de datos de Prosody. Véase
@url{https://prosody.im/doc/configure}.
Su valor predeterminado es @samp{"/var/lib/prosody"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-file-object plugin-paths
Directorios de módulos adicionales. Los módulos se buscan en orden en todas
las rutas especificadas. Véase
@url{https://prosody.im/doc/plugins_directory}.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} nombre-archivo certificates
Cada máquina virtual y componente necesitan un certificado de manera que los
clientes y servidores puedan verificar su identidad de manera
segura. Prosody cargará de manera automática certificados/claves del
directorio especificado aquí.
Su valor predeterminado es @samp{"/etc/prosody/certs"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-string admins
Es una lista de cuentas con permisos de administración en el servidor. Tenga
en cuenta que debe crear las cuentas de manera separada. Véase
@url{https://prosody.im/doc/admins} y
@url{https://prosody.im/doc/creating_accounts}.  Ejemplo: @code{(admins
'("usuaria1@@example.com" "usuaria2@@example.net"))}
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} boolean use-libevent?
Activa el uso de libevent para mejorar el rendimiento bajo altas cargas de
trabajo. Véase @url{https://prosody.im/doc/libevent}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-módulos modules-enabled
La lista de módulos de Prosody cargada durante el arranque. Busca en el
archivo de módulos @code{mod_nombremodulo.lua}, por lo que asegúrese de que
también exista. La documentación de los módulos puede encontrarse en:
@url{https://prosody.im/doc/modules}.
Su valor predeterminado es @samp{("roster" "saslauth" "tls" "dialback"
"disco" "carbons" "private" "blocklist" "vcard" "version" "uptime" "time"
"ping" "pep" "register" "admin_adhoc")}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-string modules-disabled
@samp{"offline"}, @samp{"c2s"} y @samp{"s2s"} se cargan de manera
automática, pero puede desactivarlos si los añade a esta lista.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} file-object groups-file
Ruta a un archivo de texto donde se definan los grupos compartidos. Si esta
ruta está vacía, @samp{mod_groups} no hace nada. Véase
@url{https://prosody.im/doc/modules/mod_groups}.
Su valor predeterminado es @samp{"/var/lib/prosody/sharedgroups.txt"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} boolean allow-registration?
Desactiva la creación de cuentas de manera predeterminada, por
seguridad. Véase @url{https://prosody.im/doc/creating_accounts}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} maybe-ssl-configuration ssl
Estas opciones de configuración están relacionadas con SSL/TLS. La mayor
parte no se proporcionan para usar los valores predeterminados de
Prosody. Si no entiende completamente estas opciones, no las añada a su
configuración, es fácil aumentar la vulnerabilidad de su servidor si las
usa. Véase @url{https://prosody.im/doc/advanced_ssl_config}.

Los campos disponibles de @code{ssl-configuration} son:

@deftypevr {parámetro de @code{ssl-configuration}} maybe-string protocol
Determina el inicio del protocolo usado (handshake).
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-nombre-archivo key
Ruta a su archivo de clave privada.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-nombre-archivo certificate
Ruta al archivo de su certificado.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} file-object capath
Ruta al directorio que contiene los certificados raíz en los que desea que
Prosody confíe al verificar los certificados de servidores remotos.
Su valor predeterminado es @samp{"/etc/ssl/certs"}.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-file-object cafile
Ruta al archivo que contiene los certificados raíz en los que desea que
Prosody confíe. Es similar a @code{capath} pero con todos los certificados
concatenados en el mismo archivo.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-lista-string verify
Una lista de opciones de verificación (son de manera prácticamente directa
las opciones de @code{set_verify()} de OpenSSL).
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-lista-string options
A list of general options relating to SSL/TLS@.  These map to OpenSSL's
@code{set_options()}.  For a full list of options available in LuaSec, see
the LuaSec source.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-entero-no-negativo depth
Cómo de larga puede ser la cadena de autoridades de certificación a
comprobar cuando se busque un certificado de confianza.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-string ciphers
Una cadena de algoritmos de cifrado de OpenSSL. Selecciona que algoritmos
ofrecerá Prosody a los clientes, y en qué orden.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-nombre-archivo dhparam
Una ruta a un archivo que contenga parámetros para el intercambio de claves
Diffie-Hellman. Puede crear un archivo de este tipo con: @code{openssl
dhparam -out /etc/prosody/certs/dh-2048.pem 2048}
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-string curve
Curva para el protocolo Diffie-Hellman de curva elíptica. El valor
predeterminado de Prosody es @samp{"secp384r1"}.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-string-list verifyext
Una lista de opciones de verificación adicionales.
@end deftypevr

@deftypevr {parámetro de @code{ssl-configuration}} maybe-string password
Contraseña para claves privadas cifradas.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} boolean c2s-require-encryption?
Determina si se fuerza que todas las conexiones cliente-servidor vayan
cifradas o no. Véase @url{https://prosody.im/doc/modules/mod_tls}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-string disable-sasl-mechanisms
Conjunto de mecanismos que no se ofrecerán nunca. Véase
@url{https://prosody.im/doc/modules/mod_saslauth}.
Su valor predeterminado es @samp{("DIGEST-MD5")}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} boolean s2s-require-encryption?
Determina si se fuerza que todas las conexiones servidor-servidor vayan
cifradas o no. Véase @url{https://prosody.im/doc/modules/mod_tls}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} boolean s2s-secure-auth?
Determina si el cifrado y la identificación mediante certificado son
necesarias. Esto proporciona una seguridad ideal, pero necesita que los
servidores con los que se comunique permitan cifrado y tengan presentes
certificados válidos en los que se tenga confianza. Véase
@url{https://prosody.im/doc/s2s#security}.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-string s2s-insecure-domains
Many servers don't support encryption or have invalid or self-signed
certificates.  You can list domains here that will not be required to
authenticate using certificates.  They will be authenticated using DNS@.
See @url{https://prosody.im/doc/s2s#security}.  Defaults to @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-string s2s-secure-domains
Aún en el caso de mantener @code{s2s-secure-auth?}, puede exigir
certificados válidos para algunos dominios especificando una lista
aquí. Véase @url{https://prosody.im/doc/s2s#security}.
Su valor predeterminado es @samp{()}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} string authentication
Selecciona el motor de identificación usado. La implementación
predeterminada almacena las contraseñas en texto claro y usa el
almacenamiento de datos configurado en Prosody para los datos de
identificación. Si no confía en su servidor le recomendamos que visite
@url{https://prosody.im/doc/modules/mod_auth_internal_hashed} para obtener
información sobre el motor de almacenamiento tras hash. Véase también
@url{https://prosody.im/doc/authentication}.
Su valor predeterminado es @samp{"internal_plain"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} maybe-string log
Determina las opciones del registro. La configuración avanzada del registro
no está implementada todavía para el servicio Prosody. Véase
@url{https://prosody.im/doc/logging}.
Su valor predeterminado es @samp{"*syslog"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} nombre-archivo pidfile
Archivo en el que se escribirá el PID. Véase
@url{https://prosody.im/doc/modules/mod_posix}.
Su valor predeterminado es @samp{"/var/run/prosody/prosody.pid"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} maybe-entero-no-negativo http-max-content-size
Tamaño máximo permitido del cuerpo (body) HTTP (en bytes)
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} maybe-string http-external-url
Algunos módulos exponen sus propias URL de diversas maneras. Esta URL se
construye en base al protocolo, máquina y puerto usados. Si Prosody se
encuentra tras un proxy, se usara @code{http-external-url} como URL
pública. Véase @url{https://prosody.im/doc/http#external_url}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-virtualhost-configuration virtualhosts
Una máquina (host) en Prosody es un dominio en el que se pueden crear
cuentas de usuaria. Por ejemplo, si desea que sus usuarias tengan
direcciones como @samp{"juan.herrero@@example.com"} necesitará añadir una
máquina @samp{"example.com"}. Todas las opciones en esta lista son efectivas
únicamente en esa máquina.

@quotation Nota
The name @emph{virtual} host is used in configuration to avoid confusion
with the actual physical host that Prosody is installed on.  A single
Prosody instance can serve many domains, each one defined as a VirtualHost
entry in Prosody's configuration.  Conversely a server that hosts a single
domain would have just one VirtualHost entry.

Véase @url{https://prosody.im/doc/configure#virtual_host_settings}.
@end quotation

Los campos disponibles de @code{virtualhost-configuration} son:

todos estos campos de @code{prosody-configuration}: @code{admins},
@code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled},
@code{groups-file}, @code{allow-registration?}, @code{ssl},
@code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{s2s-require-encryption?}, @code{s2s-secure-auth?},
@code{s2s-insecure-domains}, @code{s2s-secure-domains},
@code{authentication}, @code{log}, @code{http-max-content-size},
@code{http-external-url}, @code{raw-content}, además de:
@deftypevr {parámetro de @code{virtualhost-configuration}} string domain
Dominio en el que desea que Prosody proporcione servicio.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-int-component-configuration int-components
Los componentes son servicios adicionales en un servidor que están
disponibles a los clientes, habitualmente en un subdominio del servidor
principal (como por ejemplo @samp{"micomponente.example.com"}). Algunos
ejemplos de componentes pueden ser los servidores de salas de conversación,
los directorios de usuarias o las pasarelas a otros protocolos.

Los componentes internos se implementan con módulos específicos de
Prosody. Para añadir un componente interno, simplemente rellene el campo del
nombre de máquina, y el módulo que desea usar para el componente.

Véase @url{https://prosody.im/doc/components}.
Su valor predeterminado es @samp{()}.

Los campos disponibles de @code{int-component-configuration} son:

todos estos campos de @code{prosody-configuration}: @code{admins},
@code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled},
@code{groups-file}, @code{allow-registration?}, @code{ssl},
@code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{s2s-require-encryption?}, @code{s2s-secure-auth?},
@code{s2s-insecure-domains}, @code{s2s-secure-domains},
@code{authentication}, @code{log}, @code{http-max-content-size},
@code{http-external-url}, @code{raw-content}, además de:
@deftypevr {parámetro de @code{int-component-configuration}} string hostname
Nombre de máquina del componente.
@end deftypevr

@deftypevr {parámetro de @code{int-component-configuration}} string plugin
Módulo que desea usar para el componente.
@end deftypevr

@deftypevr {parámetro de @code{int-component-configuration}} maybe-mod-muc-configuration mod-muc
Multi-user chat (MUC) es el módulo de Prosody que permite la creación de
salas de conversación/conferencias para usuarias XMPP. 

Información general sobre la configuración y el uso de las salas de
conversación multi-usuaria puede encontrarse en la documentación
``Chatrooms'' (@url{https://prosody.im/doc/chatrooms}), que debería leer si
no conoce las salas de conversación de XMPP.

Véase también @url{https://prosody.im/doc/modules/mod_muc}.

Los campos disponibles de @code{mod-muc-configuration} son:

@deftypevr {parámetro de @code{mod-muc-configuration}} string name
El nombre devuelto en las respuestas de descubrimiento de servicios.
Su valor predeterminado es @samp{"Prosody Chatrooms"}.
@end deftypevr

@deftypevr {parámetro de @code{mod-muc-configuration}} string-o-boolean restrict-room-creation
Si es @samp{#t}, únicamente se permitirá a las administradoras la creación
de nuevas salas de conversación. En otro caso cualquiera puede crear una
sala. El valor @samp{"local"} restringe la creación a usuarias en el dominio
superior del servicio. Por ejemplo @samp{usuaria@@example.com} puede crear
grupos en @samp{rooms.example.com}. El valor @samp{"admin"} restringe el
servicio a las administradoras únicamente.
Su valor predeterminado es @samp{#f}.
@end deftypevr

@deftypevr {parámetro de @code{mod-muc-configuration}} entero-no-negativo max-history-messages
Número máximo de mensajes históricos que se enviarán a quien se acabe de
unir a la sala.
Su valor predeterminado es @samp{20}.
@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-ext-component-configuration ext-components
Los componentes externos usan XEP-0114, el cual se implementa en la mayor
parte de componentes independientes. Para añadir un componente externo,
simplemente rellene el campo de nombre de máquina (hostname). Véase
@url{httos://prosody.im/doc/components}.
Su valor predeterminado es @samp{()}.

Los campos disponibles de @code{ext-component-configuration} son:

todos estos campos de @code{prosody-configuration}: @code{admins},
@code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled},
@code{groups-file}, @code{allow-registration?}, @code{ssl},
@code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{s2s-require-encryption?}, @code{s2s-secure-auth?},
@code{s2s-insecure-domains}, @code{s2s-secure-domains},
@code{authentication}, @code{log}, @code{http-max-content-size},
@code{http-external-url}, @code{raw-content}, además de:
@deftypevr {parámetro de @code{ext-component-configuration}} string component-secret
Contraseña usada por el componente para el ingreso al sistema.
@end deftypevr

@deftypevr {parámetro de @code{ext-component-configuration}} string hostname
Nombre de máquina del componente.
@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} lista-entero-no-negativo component-ports
Puerto o puertos en los que prosody escucha conexiones de componentes.
Su valor predeterminado es @samp{(5347)}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} string component-interface
Interfaz en la que Prosody escucha conexiones de componentes.
Su valor predeterminado es @samp{"127.0.0.1"}.
@end deftypevr

@deftypevr {parámetro de @code{prosody-configuration}} maybe-raw-content raw-content
Contenido que se añadirá directamente al archivo de configuración.
@end deftypevr

Puede ser que únicamente desee usar un archivo @code{prosody.cfg.lua} ya
creado. En ese caso, puede proporcionar un registro
@code{opaque-prosody-configuration} como el valor de
@code{prosody-service-type}. Como su nombre en inglés indica, una
configuración opaca no tiene gran capacidad reflexiva. Los campos
disponibles de @code{opaque-prosody-configuration} son:

@deftypevr {parámetro de @code{opaque-prosody-configuration}} package prosody
El paquete prosody.
@end deftypevr

@deftypevr {parámetro de @code{opaque-prosody-configuration}} string prosody.cfg.lua
El contenido usado para @code{prosody.cfg.lua}.
@end deftypevr

Por ejemplo, si su @code{prosody.cfg.lua} es simplemente la cadena vacía,
podría instanciar el servicio de Prosody de esta manera:

@lisp
(service prosody-service-type
         (opaque-prosody-configuration
          (prosody.cfg.lua "")))
@end lisp

@c end of Prosody auto-generated documentation

@subsubheading Servicio BitlBee

@cindex IRC (Internet Relay Chat)
@cindex pasarela IRC
@url{https://bitlbee.org,BitlBee} es una pasarela que proporciona una
interfaz IRC a una variedad de protocolos como XMPP.

@defvr {Variable Scheme} bitlbee-service-type
Este es el tipo de servicio para el daemon de pasarela IRC
@url{https://bitlbee.org,BitlBee}.  Su valor es un
@code{bitlbee-configuration} (véase a continuación).

Para que BitlBee escuche en el puerto 6667 de localhost, añada esta línea a
sus servicios:

@lisp
(service bitlbee-service-type)
@end lisp
@end defvr

@deftp {Tipo de datos} bitlbee-configuration
Esta es la configuración para BitlBee, con los siguientes campos:

@table @asis
@item @code{interface} (predeterminada: @code{"127.0.0.1"})
@itemx @code{port} (predeterminado: @code{6667})
Escucha en la interfaz de red correspondiente a la dirección IP especificada
en @var{interface}, en el puerto @var{port}.

Cuando @var{interface} es @code{127.0.0.1}, únicamente se permite la
conexión de clientes locales; cuando es @code{0.0.0.0}, las conexiones
pueden venir de cualquier interfaz de red.

@item @code{bitlbee} (predeterminado: @code{bitlbee})
El paquete BitlBee usado.

@item @code{plugins} (predeterminados: @code{'()})
Lista de paquetes de módulos usados---por ejemplo, @code{bitlbee-discord}.

@item @code{extra-settings} (predeterminado: @code{""})
Fragmento de configuración añadido tal cual al archivo de configuración de
BitlBee.
@end table
@end deftp

@subsubheading Servicio Quassel

@cindex IRC (Internet Relay Chat)
@url{https://quassel-irc.org/,Quassel} es un cliente IRC distribuido, lo que
significa que uno o más clientes se pueden conectar y desconectar del núcleo
central.

@defvr {Variable Scheme} quassel-service-type
Es el tipo de servicio del daemon del motor IRC de
@url{https://quassel-irc.org/,Quassel}.  Su valor es un
@code{quassel-configuration} (véase a continuación).
@end defvr

@deftp {Tipo de datos} quassel-configuration
Es la configuración para Quassel, con los siguientes campos:

@table @asis
@item @code{quassel} (predeterminado: @code{quassel})
El paquete Quassel usado.

@item @code{interface} (predeterminada: @code{"::,0.0.0.0"})
@item @code{port} (predeterminado: @code{4242})
Escucha en la o las interfaces de red que correspondan con las direcciones
IPv4 o IPv6 delimitadas por comas especificadas en @var{interface}, en el
puerto @var{port}.

@item @code{loglevel} (predeterminado: @code{"Info"})
El nivel de registro deseado. Los valores aceptados son Debug, Info, Warning
y Error.
@end table
@end deftp

@node Servicios de telefonía
@subsection Servicios de telefonía

@cindex telephony, services
The @code{(gnu services telephony)} module contains Guix service definitions
for telephony services.  Currently it provides the following services:

@subsubheading Jami

@cindex jami, service

This section describes how to configure a Jami server that can be used to
host video (or audio) conferences, among other uses.  The following example
demonstrates how to specify Jami account archives (backups) to be
provisioned automatically:

@lisp
(service jami-service-type
         (jami-configuration
          (accounts
           (list (jami-account
                  (archive "/etc/jami/unencrypted-account-1.gz"))
                 (jami-account
                  (archive "/etc/jami/unencrypted-account-2.gz"))))))
@end lisp

When the accounts field is specified, the Jami account files of the service
found under @file{/var/lib/jami} are recreated every time the service
starts.

Jami accounts and their corresponding backup archives can be generated using
the @code{jami} or @code{jami-gnome} Jami clients.  The accounts should not
be password-protected, but it is wise to ensure their files are only
readable by @samp{root}.

The next example shows how to declare that only some contacts should be
allowed to communicate with a given account:

@lisp
(service jami-service-type
         (jami-configuration
          (accounts
           (list (jami-account
                  (archive "/etc/jami/unencrypted-account-1.gz")
                  (peer-discovery? #t)
                  (rendezvous-point? #t)
                  (allowed-contacts
                   '("1dbcb0f5f37324228235564b79f2b9737e9a008f"
                     "2dbcb0f5f37324228235564b79f2b9737e9a008f")))))))
@end lisp

In this mode, only the declared @code{allowed-contacts} can initiate
communication with the Jami account.  This can be used, for example, with
rendezvous point accounts to create a private video conferencing space.

To put the system administrator in full control of the conferences hosted on
their system, the Jami service supports the following actions:

@example sh
# herd doc jami list-actions
(list-accounts
 list-account-details
 list-banned-contacts
 list-contacts
 list-moderators
 add-moderator
 ban-contact
 enable-account
 disable-account)
@end example

The above actions aim to provide the most valuable actions for moderation
purposes, not to cover the whole Jami API.  Users wanting to interact with
the Jami daemon from Guile may be interested in experimenting with the
@code{(gnu build jami-service)} module, which powers the above Shepherd
actions.

@c TODO: This should be auto-generated from the doc already defined on
@c the shepherd-actions themselves in (gnu services telephony).
The @code{add-moderator} and @code{ban-contact} actions accept a contact
@emph{fingerprint} (40 characters long hash) as first argument and an
account fingerprint or username as second argument:

@example sh
# herd add-moderator jami 1dbcb0f5f37324228235564b79f2b9737e9a008f \
  f3345f2775ddfe07a4b0d95daea111d15fbc1199

# herd list-moderators jami
Moderators for account f3345f2775ddfe07a4b0d95daea111d15fbc1199:
  - 1dbcb0f5f37324228235564b79f2b9737e9a008f

@end example

In the case of @code{ban-contact}, the second username argument is optional;
when omitted, the account is banned from all Jami accounts:

@example sh
# herd ban-contact jami 1dbcb0f5f37324228235564b79f2b9737e9a008f

# herd list-banned-contacts jami
Banned contacts for account f3345f2775ddfe07a4b0d95daea111d15fbc1199:
  - 1dbcb0f5f37324228235564b79f2b9737e9a008f

@end example

Banned contacts are also stripped from their moderation privileges.

The @code{disable-account} action allows to completely disconnect an account
from the network, making it unreachable, while @code{enable-account} does
the inverse.  They accept a single account username or fingerprint as first
argument:

@example sh
# herd disable-account jami f3345f2775ddfe07a4b0d95daea111d15fbc1199

# herd list-accounts jami
The following Jami accounts are available:
  - f3345f2775ddfe07a4b0d95daea111d15fbc1199 (dummy) [disabled]

@end example

The @code{list-account-details} action prints the detailed parameters of
each accounts in the Recutils format, which means the @command{recsel}
command can be used to select accounts of interest (@pxref{Selection Expressions,,,recutils, GNU recutils manual}).  Note that period characters
(@samp{.}) found in the account parameter keys are mapped to underscores
(@samp{_}) in the output, to meet the requirements of the Recutils format.
The following example shows how to print the account fingerprints for all
accounts operating in the rendezvous point mode:

@example sh
# herd list-account-details jami | \
  recsel -p Account.username -e 'Account.rendezVous ~ "true"'
Account_username: f3345f2775ddfe07a4b0d95daea111d15fbc1199
@end example

The remaining actions should be self-explanatory.

The complete set of available configuration options is detailed below.

@c TODO: Ideally, the following fragments would be auto-generated at
@c build time, so that they needn't be manually duplicated.
@c Auto-generated via (configuration->documentation 'jami-configuration)
@deftp {Data Type} jami-configuration
Available @code{jami-configuration} fields are:

@table @asis
@item @code{libjami} (default: @code{libjami}) (type: package)
The Jami daemon package to use.

@item @code{dbus} (default: @code{dbus-for-jami}) (type: package)
The D-Bus package to use to start the required D-Bus session.

@item @code{nss-certs} (default: @code{nss-certs}) (type: package)
The nss-certs package to use to provide TLS certificates.

@item @code{enable-logging?} (default: @code{#t}) (type: boolean)
Whether to enable logging to syslog.

@item @code{debug?} (default: @code{#f}) (type: boolean)
Whether to enable debug level messages.

@item @code{auto-answer?} (default: @code{#f}) (type: boolean)
Whether to force automatic answer to incoming calls.

@item @code{accounts} (type: maybe-jami-account-list)
A list of Jami accounts to be (re-)provisioned every time the Jami daemon
service starts.  When providing this field, the account directories under
@file{/var/lib/jami/} are recreated every time the service starts, ensuring
a consistent state.

@end table

@end deftp

@c Auto-generated via (configuration->documentation 'jami-account)
@deftp {Data Type} jami-account
Available @code{jami-account} fields are:

@table @asis
@item @code{archive} (type: string-or-computed-file)
The account archive (backup) file name of the account.  This is used to
provision the account when the service starts.  The account archive should
@emph{not} be encrypted.  It is highly recommended to make it readable only
to the @samp{root} user (i.e., not in the store), to guard against leaking
the secret key material of the Jami account it contains.

@item @code{allowed-contacts} (type: maybe-account-fingerprint-list)
The list of allowed contacts for the account, entered as their 40 characters
long fingerprint.  Messages or calls from accounts not in that list will be
rejected.  When left specified, the configuration of the account archive is
used as-is with respect to contacts and public inbound calls/messaging
allowance, which typically defaults to allow any contact to communicate with
the account.

@item @code{moderators} (type: maybe-account-fingerprint-list)
The list of contacts that should have moderation privileges (to ban, mute,
etc.  other users) in rendezvous conferences, entered as their 40 characters
long fingerprint.  When left unspecified, the configuration of the account
archive is used as-is with respect to moderation, which typically defaults
to allow anyone to moderate.

@item @code{rendezvous-point?} (type: maybe-boolean)
Whether the account should operate in the rendezvous mode.  In this mode,
all the incoming audio/video calls are mixed into a conference.  When left
unspecified, the value from the account archive prevails.

@item @code{peer-discovery?} (type: maybe-boolean)
Whether peer discovery should be enabled.  Peer discovery is used to
discover other OpenDHT nodes on the local network, which can be useful to
maintain communication between devices on such network even when the
connection to the Internet has been lost.  When left unspecified, the value
from the account archive prevails.

@item @code{bootstrap-hostnames} (type: maybe-string-list)
A list of hostnames or IPs pointing to OpenDHT nodes, that should be used to
initially join the OpenDHT network.  When left unspecified, the value from
the account archive prevails.

@item @code{name-server-uri} (type: maybe-string)
The URI of the name server to use, that can be used to retrieve the account
fingerprint for a registered username.

@end table

@end deftp

@subsubheading Mumble server

@cindex Mumble
@cindex Murmur
@cindex servidor VoIP
This section describes how to set up and run a @uref{https://mumble.info,
Mumble} server (formerly known as Murmur).

@deftp {Data Type} mumble-server-configuration
The service type for the Mumble server.  An example configuration can look
like this:

@lisp
(service mumble-server-service-type
         (mumble-server-configuration
          (welcome-text
            "Welcome to this Mumble server running on Guix!")
          (cert-required? #t) ;disallow text password logins
          (ssl-cert "/etc/letsencrypt/live/mumble.example.com/fullchain.pem")
          (ssl-key "/etc/letsencrypt/live/mumble.example.com/privkey.pem")))
@end lisp

After reconfiguring your system, you can manually set the mumble-server
@code{SuperUser} password with the command that is printed during the
activation phase.

Se recomienda el registro de una cuenta de usuaria normal de Mumble y la
concesión de permisos de administración o moderación. Puede usar el cliente
@code{mumble} para ingresar como una nueva usuaria normal, registrarse usted
misma, y salir del sistema. En el siguiente paso ingrese en el sistema con
el nombre @code{SuperUser}, use la contraseña de @code{SuperUser} que fue
establecida con anterioridad, y conceda los permisos de administración o
moderación a su usuaria de nombre creada anteriormente y cree algunos
canales.

Available @code{mumble-server-configuration} fields are:

@table @asis
@item @code{package} (predeterminado: @code{mumble})
Package that contains @code{bin/mumble-server}.

@item @code{user} (default: @code{"mumble-server"})
User who will run the Mumble-Server server.

@item @code{group} (default: @code{"mumble-server"})
Group of the user who will run the mumble-server server.

@item @code{port} (predeterminado: @code{64738})
Puerto en el que escucha el servidor.

@item @code{welcome-text} (predeterminado: @code{""})
Mensaje de bienvenida enviado a clientes tras su conexión.

@item @code{server-password} (predeterminada: @code{""})
Contraseña que debe introducirse para poder conectarse.

@item @code{max-users} (predeterminados: @code{100})
Número máximo de usuarias que pueden estar conectadas a la vez al servidor.

@item @code{max-user-bandwidth} (predeterminado: @code{#f})
Tráfico de voz máximo que una usuaria puede mandar por segundo.

@item @code{database-file} (default: @code{"/var/lib/mumble-server/db.sqlite"})
Nombre de archivo de la base de datos sqlite. La usuaria del servicio se
convertirá en propietaria del directorio.

@item @code{log-file} (default: @code{"/var/log/mumble-server/mumble-server.log"})
Nombre de archivo del archivo de registro. La usuaria del servicio se
convertirá en propietaria del directorio.

@item @code{autoban-attempts} (predeterminados: @code{10})
Número máximo de ingresos al sistema que una usuaria puede llevar a cabo en
@code{autoban-timeframe} sin bloquearse su acceso durante
@code{autoban-time}.

@item @code{autoban-timeframe} (predeterminado: @code{120})
Marco de tiempo del bloqueo automático en segundos.

@item @code{autoban-time} (predeterminado: @code{300})
Duración en segundos del periodo que permanecerá bloqueado un cliente cuando
viole los límites de bloqueo automático.

@item @code{opus-threshold} (predeterminado: @code{100})
Porcentaje de clientes que tienen que permitir opus antes de cambiar al
algoritmo de sonido opus.

@item @code{channel-nesting-limit} (predeterminado: @code{10})
Cual puede ser el nivel de recursión de los canales.

@item @code{channelname-regex} (predeterminado: @code{#f})
Una cadena en forma de expresión regular Qt que deben cumplir los nombres de
canal.

@item @code{username-regex} (predeterminado: @code{#f})
Una cadena en forma de expresión regular Qt que deben cumplir los nombres de
usuaria.

@item @code{text-message-length} (predeterminado: @code{5000})
Número máximo de bytes que una usuaria puede enviar en un mensaje de texto.

@item @code{image-message-length} (predeterminado: @code{(* 128 1024)})
Número máximo de bytes que una usuaria puede enviar en un mensaje de imagen.

@item @code{cert-required?} (predeterminado: @code{#f})
If it is set to @code{#t} clients that use weak password authentication will
not be accepted.  Users must have completed the certificate wizard to join.

@item @code{remember-channel?} (predeterminado: @code{#f})
Should mumble-server remember the last channel each user was in when they
disconnected and put them into the remembered channel when they rejoin.

@item @code{allow-html?} (predeterminado: @code{#f})
Si se permite html en mensajes de texto, comentarios de usuaria y
descripciones de canal.

@item @code{allow-ping?} (predeterminado: @code{#f})
Setting to true exposes the current user count, the maximum user count, and
the server's maximum bandwidth per client to unauthenticated users.  In the
Mumble client, this information is shown in the Connect dialog.

Desactivar esta opción impedirá la escucha pública en el servidor.

@item @code{bonjour?} (predeterminado: @code{#f})
Si el servidor debe anunciarse a sí mismo en la red local a través del
protocolo ``bonjour''.

@item @code{send-version?} (predeterminado: @code{#f})
Should the mumble-server server version be exposed in ping requests.

@item @code{log-days} (predeterminado: @code{31})
Mumble also stores logs in the database, which are accessible via RPC.  The
default is 31 days of months, but you can set this setting to 0 to keep logs
forever, or -1 to disable logging to the database.

@item @code{obfuscate-ips?} (predeterminado: @code{#t})
Si las IP registradas deben ofuscarse para proteger la privacidad de las
usuarias.

@item @code{ssl-cert} (predeterminado: @code{#f})
Nombre del archivo del certificado SSL/TLS usado para conexiones cifradas.

@lisp
(ssl-cert "/etc/letsencrypt/live/example.com/fullchain.pem")
@end lisp
@item @code{ssl-key} (predeterminada: @code{#f})
Ruta de archivo de la clave privada de ssl usada para las conexiones
cifradas.
@lisp
(ssl-key "/etc/letsencrypt/live/example.com/privkey.pem")
@end lisp

@item @code{ssl-dh-params} (predeterminado: @code{#f})
Nombre del archivo codificado con PEM con parámetros Diffie-Hellman para el
cifrado SSL/TLS. De manera alternativa puede establecer su valor a
@code{"@@ffdhe2048"}, @code{"@@ffdhe3072"}, @code{"@@ffdhe4096"},
@code{"@@ffdhe6144"} o @code{"@@ffdhe8192"} para usar los parámetros
contenidos en el RFC 7919.

@item @code{ssl-ciphers} (predeterminado: @code{#f})
La opción @code{ssl-ciphers} selecciona los protocolos de cifrado
disponibles para su uso en SSL/TLS.

Esta opción se especifica mediante el uso de la
@uref{https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT,
notación de listas de prot. de cifrado de OpenSSL}.

It is recommended that you try your cipher string using 'openssl ciphers
<string>' before setting it here, to get a feel for which cipher suites you
will get.  After setting this option, it is recommend that you inspect your
Mumble server log to ensure that Mumble is using the cipher suites that you
expected it to.

@quotation Nota
Changing this option may impact the backwards compatibility of your
Mumble-Server server, and can remove the ability for older Mumble clients to
be able to connect to it.
@end quotation

@item @code{public-registration} (predeterminado: @code{#f})
Must be a @code{<mumble-server-public-registration-configuration>} record or
@code{#f}.

Puede registrar de manera opcional su servidor en la lista pública de
servidores que el cliente @code{mumble} muestra al inicio. No puede
registrar su servidor si tiene establecida una contraseña para el servidor
(@code{server-password}), o establece @code{allow-ping} como @code{#f}.

Puede tomar algunas horas hasta que se muestre en la lista pública.

@item @code{file} (predeterminado: @code{#f})
Forma opcional alternativa de forzar el valor de esta configuración.
@end table
@end deftp

@deftp {Data Type} mumble-server-public-registration-configuration
Configuration for public registration of a mumble-server service.

@table @asis
@item @code{name}
This is a display name for your server.  Not to be confused with the
hostname.

@item @code{password}
A password to identify your registration.  Subsequent updates will need the
same password.  Don't lose your password.

@item @code{url}
Debe ser un enlace @code{http://} o @code{https://} a su página web.

@item @code{hostname} (predeterminado: @code{#f})
De manera predeterminada su servidor se enumerará por sus direcciones IP. Si
se usa esta opción, en vez de eso se enlazará a través de este nombre de
máquina.
@end table
@end deftp

@quotation Deprecation notice
Due to historical reasons, all of the above @code{mumble-server-} procedures
are also exported with the @code{murmur-} prefix.  It is recommended that
you switch to using @code{mumble-server-} going forward.
@end quotation

@node File-Sharing Services
@subsection File-Sharing Services

The @code{(gnu services file-sharing)} module provides services that assist
with transferring files over peer-to-peer file-sharing networks.

@subsubheading Transmission Daemon Service

@uref{https://transmissionbt.com/, Transmission} is a flexible BitTorrent
client that offers a variety of graphical and command-line interfaces.  A
@code{transmission-daemon-service-type} service provides Transmission's
headless variant, @command{transmission-daemon}, as a system service,
allowing users to share files via BitTorrent even when they are not logged
in.

@deffn {Scheme Variable} transmission-daemon-service-type
The service type for the Transmission Daemon BitTorrent client. Its value
must be a @code{transmission-daemon-configuration} object as in this
example:

@lisp
(service transmission-daemon-service-type
         (transmission-daemon-configuration
          ;; Restrict access to the RPC ("control") interface
          (rpc-authentication-required? #t)
          (rpc-username "transmission")
          (rpc-password
           (transmission-password-hash
            "transmission" ; desired password
            "uKd1uMs9"))   ; arbitrary salt value

          ;; Accept requests from this and other hosts on the
          ;; local network
          (rpc-whitelist-enabled? #t)
          (rpc-whitelist '("::1" "127.0.0.1" "192.168.0.*"))

          ;; Limit bandwidth use during work hours
          (alt-speed-down (* 1024 2)) ;   2 MB/s
          (alt-speed-up 512)          ; 512 kB/s

          (alt-speed-time-enabled? #t)
          (alt-speed-time-day 'weekdays)
          (alt-speed-time-begin
           (+ (* 60 8) 30))           ; 8:30 am
          (alt-speed-time-end
           (+ (* 60 (+ 12 5)) 30))))  ; 5:30 pm
@end lisp
@end deffn

Once the service is started, users can interact with the daemon through its
Web interface (at @code{http://localhost:9091/}) or by using the
@command{transmission-remote} command-line tool, available in the
@code{transmission} package.  (Emacs users may want to also consider the
@code{emacs-transmission} package.)  Both communicate with the daemon
through its remote procedure call (RPC) interface, which by default is
available to all users on the system; you may wish to change this by
assigning values to the @code{rpc-authentication-required?},
@code{rpc-username} and @code{rpc-password} settings, as shown in the
example above and documented further below.

The value for @code{rpc-password} must be a password hash of the type
generated and used by Transmission clients.  This can be copied verbatim
from an existing @file{settings.json} file, if another Transmission client
is already being used.  Otherwise, the @code{transmission-password-hash} and
@code{transmission-random-salt} procedures provided by this module can be
used to obtain a suitable hash value.

@deffn {Scheme Procedure} transmission-password-hash @var{password} @var{salt}
Returns a string containing the result of hashing @var{password} together
with @var{salt}, in the format recognized by Transmission clients for their
@code{rpc-password} configuration setting.

@var{salt} must be an eight-character string.  The
@code{transmission-random-salt} procedure can be used to generate a suitable
salt value at random.
@end deffn

@deffn {Scheme Procedure} transmission-random-salt
Returns a string containing a random, eight-character salt value of the type
generated and used by Transmission clients, suitable for passing to the
@code{transmission-password-hash} procedure.
@end deffn

These procedures are accessible from within a Guile REPL started with the
@command{guix repl} command (@pxref{Invocación de guix repl}).  This is useful
for obtaining a random salt value to provide as the second parameter to
`transmission-password-hash`, as in this example session:

@example
$ guix repl
scheme@@(guix-user)> ,use (gnu services file-sharing)
scheme@@(guix-user)> (transmission-random-salt)
$1 = "uKd1uMs9"
@end example

Alternatively, a complete password hash can generated in a single step:

@example
scheme@@(guix-user)> (transmission-password-hash "transmission"
(transmission-random-salt))
$2 = "@{c8bbc6d1740cd8dc819a6e25563b67812c1c19c9VtFPfdsX"
@end example

The resulting string can be used as-is for the value of @code{rpc-password},
allowing the password to be kept hidden even in the operating-system
configuration.

Torrent files downloaded by the daemon are directly accessible only to users
in the ``transmission'' user group, who receive read-only access to the
directory specified by the @code{download-dir} configuration setting (and
also the directory specified by @code{incomplete-dir}, if
@code{incomplete-dir-enabled?} is @code{#t}).  Downloaded files can be moved
to another directory or deleted altogether using
@command{transmission-remote} with its @code{--move} and
@code{--remove-and-delete} options.

If the @code{watch-dir-enabled?} setting is set to @code{#t}, users in the
``transmission'' group are able also to place @file{.torrent} files in the
directory specified by @code{watch-dir} to have the corresponding torrents
added by the daemon.  (The @code{trash-original-torrent-files?} setting
controls whether the daemon deletes these files after processing them.)

Some of the daemon's configuration settings can be changed temporarily by
@command{transmission-remote} and similar tools. To undo these changes, use
the service's @code{reload} action to have the daemon reload its settings
from disk:

@example
# herd reload transmission-daemon
@end example

The full set of available configuration settings is defined by the
@code{transmission-daemon-configuration} data type.

@deftp {Data Type} transmission-daemon-configuration
The data type representing configuration settings for Transmission Daemon.
These correspond directly to the settings recognized by Transmission clients
in their @file{settings.json} file.
@end deftp

@c The following documentation was initially generated by
@c (generate-transmission-daemon-documentation) in (gnu services
@c file-sharing).  Manually maintained documentation is better, so we
@c shouldn't hesitate to edit below as needed.  However if the change
@c you want to make to this documentation can be done in an automated
@c way, it's probably easier to change (generate-documentation) than to
@c make it below and have to deal with the churn as Transmission Daemon
@c updates.

@c %start of fragment

Available @code{transmission-daemon-configuration} fields are:

@deftypevr {@code{transmission-daemon-configuration} parameter} package transmission
The Transmission package to use.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer stop-wait-period
The period, in seconds, to wait when stopping the service for
@command{transmission-daemon} to exit before killing its process.  This
allows the daemon time to complete its housekeeping and send a final update
to trackers as it shuts down.  On slow hosts, or hosts with a slow network
connection, this value may need to be increased.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string download-dir
The directory to which torrent files are downloaded.

Defaults to @samp{"/var/lib/transmission-daemon/downloads"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean incomplete-dir-enabled?
If @code{#t}, files will be held in @code{incomplete-dir} while their
torrent is being downloaded, then moved to @code{download-dir} once the
torrent is complete.  Otherwise, files for all torrents (including those
still being downloaded) will be placed in @code{download-dir}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-string incomplete-dir
The directory in which files from incompletely downloaded torrents will be
held when @code{incomplete-dir-enabled?} is @code{#t}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} umask umask
The file mode creation mask used for downloaded files.  (See the
@command{umask} man page for more information.)

Defaults to @samp{18}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean rename-partial-files?
When @code{#t}, ``.part'' is appended to the name of partially downloaded
files.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} preallocation-mode preallocation
The mode by which space should be preallocated for downloaded files, one of
@code{none}, @code{fast} (or @code{sparse}) and @code{full}.  Specifying
@code{full} will minimize disk fragmentation at a cost to file-creation
speed.

Defaults to @samp{fast}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean watch-dir-enabled?
If @code{#t}, the directory specified by @code{watch-dir} will be watched
for new @file{.torrent} files and the torrents they describe added
automatically (and the original files removed, if
@code{trash-original-torrent-files?} is @code{#t}).

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-string watch-dir
The directory to be watched for @file{.torrent} files indicating new
torrents to be added, when @code{watch-dir-enabled} is @code{#t}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean trash-original-torrent-files?
When @code{#t}, @file{.torrent} files will be deleted from the watch
directory once their torrent has been added (see
@code{watch-directory-enabled?}).

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean speed-limit-down-enabled?
When @code{#t}, the daemon's download speed will be limited to the rate
specified by @code{speed-limit-down}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer speed-limit-down
The default global-maximum download speed, in kilobytes per second.

El valor predeterminado es @samp{100}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean speed-limit-up-enabled?
When @code{#t}, the daemon's upload speed will be limited to the rate
specified by @code{speed-limit-up}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer speed-limit-up
The default global-maximum upload speed, in kilobytes per second.

El valor predeterminado es @samp{100}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean alt-speed-enabled?
When @code{#t}, the alternate speed limits @code{alt-speed-down} and
@code{alt-speed-up} are used (in place of @code{speed-limit-down} and
@code{speed-limit-up}, if they are enabled) to constrain the daemon's
bandwidth usage.  This can be scheduled to occur automatically at certain
times during the week; see @code{alt-speed-time-enabled?}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer alt-speed-down
The alternate global-maximum download speed, in kilobytes per second.

El valor predeterminado es @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer alt-speed-up
The alternate global-maximum upload speed, in kilobytes per second.

El valor predeterminado es @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean alt-speed-time-enabled?
When @code{#t}, the alternate speed limits @code{alt-speed-down} and
@code{alt-speed-up} will be enabled automatically during the periods
specified by @code{alt-speed-time-day}, @code{alt-speed-time-begin} and
@code{alt-time-speed-end}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} day-list alt-speed-time-day
The days of the week on which the alternate-speed schedule should be used,
specified either as a list of days (@code{sunday}, @code{monday}, and so on)
or using one of the symbols @code{weekdays}, @code{weekends} or @code{all}.

Defaults to @samp{all}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer alt-speed-time-begin
The time of day at which to enable the alternate speed limits, expressed as
a number of minutes since midnight.

Defaults to @samp{540}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer alt-speed-time-end
The time of day at which to disable the alternate speed limits, expressed as
a number of minutes since midnight.

Defaults to @samp{1020}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string bind-address-ipv4
The IP address at which to listen for peer connections, or ``0.0.0.0'' to
listen at all available IP addresses.

El valor predeterminado es @samp{"0.0.0.0"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string bind-address-ipv6
The IPv6 address at which to listen for peer connections, or ``::'' to
listen at all available IPv6 addresses.

Defaults to @samp{"::"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean peer-port-random-on-start?
If @code{#t}, when the daemon starts it will select a port at random on
which to listen for peer connections, from the range specified (inclusively)
by @code{peer-port-random-low} and @code{peer-port-random-high}.  Otherwise,
it listens on the port specified by @code{peer-port}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} port-number peer-port-random-low
The lowest selectable port number when @code{peer-port-random-on-start?} is
@code{#t}.

Defaults to @samp{49152}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} port-number peer-port-random-high
The highest selectable port number when @code{peer-port-random-on-start} is
@code{#t}.

Defaults to @samp{65535}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} port-number peer-port
The port on which to listen for peer connections when
@code{peer-port-random-on-start?} is @code{#f}.

Defaults to @samp{51413}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean port-forwarding-enabled?
If @code{#t}, the daemon will attempt to configure port-forwarding on an
upstream gateway automatically using @acronym{UPnP} and @acronym{NAT-PMP}.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} encryption-mode encryption
The encryption preference for peer connections, one of
@code{prefer-unencrypted-connections}, @code{prefer-encrypted-connections}
or @code{require-encrypted-connections}.

Defaults to @samp{prefer-encrypted-connections}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-string peer-congestion-algorithm
The TCP congestion-control algorithm to use for peer connections, specified
using a string recognized by the operating system in calls to
@code{setsockopt}.  When left unspecified, the operating-system default is
used.

Note that on GNU/Linux systems, the kernel must be configured to allow
processes to use a congestion-control algorithm not in the default set;
otherwise, it will deny these requests with ``Operation not permitted''.  To
see which algorithms are available on your system and which are currently
permitted for use, look at the contents of the files
@file{tcp_available_congestion_control} and
@file{tcp_allowed_congestion_control} in the @file{/proc/sys/net/ipv4}
directory.

As an example, to have Transmission Daemon use
@uref{http://www-ece.rice.edu/networks/TCP-LP/,the TCP Low Priority
congestion-control algorithm}, you'll need to modify your kernel
configuration to build in support for the algorithm, then update your
operating-system configuration to allow its use by adding a
@code{sysctl-service-type} service (or updating the existing one's
configuration) with lines like the following:

@lisp
(service sysctl-service-type
         (sysctl-configuration
          (settings
           ("net.ipv4.tcp_allowed_congestion_control" .
            "reno cubic lp"))))
@end lisp

The Transmission Daemon configuration can then be updated with

@lisp
(peer-congestion-algorithm "lp")
@end lisp

and the system reconfigured to have the changes take effect.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} tcp-type-of-service peer-socket-tos
The type of service to request in outgoing @acronym{TCP} packets, one of
@code{default}, @code{low-cost}, @code{throughput}, @code{low-delay} and
@code{reliability}.

Defaults to @samp{default}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer peer-limit-global
The global limit on the number of connected peers.

Defaults to @samp{200}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer peer-limit-per-torrent
The per-torrent limit on the number of connected peers.

El valor predeterminado es @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer upload-slots-per-torrent
The maximum number of peers to which the daemon will upload data
simultaneously for each torrent.

Defaults to @samp{14}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer peer-id-ttl-hours
The maximum lifespan, in hours, of the peer ID associated with each public
torrent before it is regenerated.

Defaults to @samp{6}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean blocklist-enabled?
When @code{#t}, the daemon will ignore peers mentioned in the blocklist it
has most recently downloaded from @code{blocklist-url}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-string blocklist-url
The URL of a peer blocklist (in @acronym{P2P}-plaintext or eMule @file{.dat}
format) to be periodically downloaded and applied when
@code{blocklist-enabled?} is @code{#t}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean download-queue-enabled?
If @code{#t}, the daemon will be limited to downloading at most
@code{download-queue-size} non-stalled torrents simultaneously.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer download-queue-size
The size of the daemon's download queue, which limits the number of
non-stalled torrents it will download at any one time when
@code{download-queue-enabled?} is @code{#t}.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean seed-queue-enabled?
If @code{#t}, the daemon will be limited to seeding at most
@code{seed-queue-size} non-stalled torrents simultaneously.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer seed-queue-size
The size of the daemon's seed queue, which limits the number of non-stalled
torrents it will seed at any one time when @code{seed-queue-enabled?} is
@code{#t}.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean queue-stalled-enabled?
When @code{#t}, the daemon will consider torrents for which it has not
shared data in the past @code{queue-stalled-minutes} minutes to be stalled
and not count them against its @code{download-queue-size} and
@code{seed-queue-size} limits.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer queue-stalled-minutes
The maximum period, in minutes, a torrent may be idle before it is
considered to be stalled, when @code{queue-stalled-enabled?} is @code{#t}.

El valor predeterminado es @samp{30}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean ratio-limit-enabled?
When @code{#t}, a torrent being seeded will automatically be paused once it
reaches the ratio specified by @code{ratio-limit}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-rational ratio-limit
The ratio at which a torrent being seeded will be paused, when
@code{ratio-limit-enabled?} is @code{#t}.

Defaults to @samp{2.0}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean idle-seeding-limit-enabled?
When @code{#t}, a torrent being seeded will automatically be paused once it
has been idle for @code{idle-seeding-limit} minutes.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer idle-seeding-limit
The maximum period, in minutes, a torrent being seeded may be idle before it
is paused, when @code{idle-seeding-limit-enabled?} is @code{#t}.

El valor predeterminado es @samp{30}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean dht-enabled?
Enable @uref{http://bittorrent.org/beps/bep_0005.html,the distributed hash
table (@acronym{DHT}) protocol}, which supports the use of trackerless
torrents.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean lpd-enabled?
Enable @uref{https://en.wikipedia.org/wiki/Local_Peer_Discovery,local peer
discovery} (@acronym{LPD}), which allows the discovery of peers on the local
network and may reduce the amount of data sent over the public Internet.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean pex-enabled?
Enable @uref{https://en.wikipedia.org/wiki/Peer_exchange,peer exchange}
(@acronym{PEX}), which reduces the daemon's reliance on external trackers
and may improve its performance.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean utp-enabled?
Enable @uref{http://bittorrent.org/beps/bep_0029.html,the micro transport
protocol} (@acronym{uTP}), which aims to reduce the impact of BitTorrent
traffic on other users of the local network while maintaining full
utilization of the available bandwidth.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean rpc-enabled?
If @code{#t}, enable the remote procedure call (@acronym{RPC})  interface,
which allows remote control of the daemon via its Web interface, the
@command{transmission-remote} command-line client, and similar tools.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string rpc-bind-address
The IP address at which to listen for @acronym{RPC} connections, or
``0.0.0.0'' to listen at all available IP addresses.

El valor predeterminado es @samp{"0.0.0.0"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} port-number rpc-port
The port on which to listen for @acronym{RPC} connections.

Defaults to @samp{9091}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string rpc-url
The path prefix to use in the @acronym{RPC}-endpoint @acronym{URL}.

Defaults to @samp{"/transmission/"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean rpc-authentication-required?
When @code{#t}, clients must authenticate (see @code{rpc-username} and
@code{rpc-password}) when using the @acronym{RPC} interface.  Note this has
the side effect of disabling host-name whitelisting (see
@code{rpc-host-whitelist-enabled?}.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-string rpc-username
The username required by clients to access the @acronym{RPC} interface when
@code{rpc-authentication-required?} is @code{#t}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-transmission-password-hash rpc-password
The password required by clients to access the @acronym{RPC} interface when
@code{rpc-authentication-required?} is @code{#t}.  This must be specified
using a password hash in the format recognized by Transmission clients,
either copied from an existing @file{settings.json} file or generated using
the @code{transmission-password-hash} procedure.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean rpc-whitelist-enabled?
When @code{#t}, @acronym{RPC} requests will be accepted only when they
originate from an address specified in @code{rpc-whitelist}.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string-list rpc-whitelist
The list of IP and IPv6 addresses from which @acronym{RPC} requests will be
accepted when @code{rpc-whitelist-enabled?} is @code{#t}.  Wildcards may be
specified using @samp{*}.

Defaults to @samp{("127.0.0.1" "::1")}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean rpc-host-whitelist-enabled?
When @code{#t}, @acronym{RPC} requests will be accepted only when they are
addressed to a host named in @code{rpc-host-whitelist}.  Note that requests
to ``localhost'' or ``localhost.'', or to a numeric address, are always
accepted regardless of these settings.

Note also this functionality is disabled when
@code{rpc-authentication-required?} is @code{#t}.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} string-list rpc-host-whitelist
The list of host names recognized by the @acronym{RPC} server when
@code{rpc-host-whitelist-enabled?} is @code{#t}.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} message-level message-level
The minimum severity level of messages to be logged (to
@file{/var/log/transmission.log}) by the daemon, one of @code{none} (no
logging), @code{error}, @code{info} and @code{debug}.

El valor predeterminado es @samp{info}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean start-added-torrents?
When @code{#t}, torrents are started as soon as they are added; otherwise,
they are added in ``paused'' state.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean script-torrent-done-enabled?
When @code{#t}, the script specified by @code{script-torrent-done-filename}
will be invoked each time a torrent completes.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} maybe-file-object script-torrent-done-filename
A file name or file-like object specifying a script to run each time a
torrent completes, when @code{script-torrent-done-enabled?} is @code{#t}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean scrape-paused-torrents-enabled?
When @code{#t}, the daemon will scrape trackers for a torrent even when the
torrent is paused.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} non-negative-integer cache-size-mb
The amount of memory, in megabytes, to allocate for the daemon's in-memory
cache.  A larger value may increase performance by reducing the frequency of
disk I/O.

Defaults to @samp{4}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration} parameter} boolean prefetch-enabled?
When @code{#t}, the daemon will try to improve I/O performance by hinting to
the operating system which data is likely to be read next from disk to
satisfy requests from peers.

El valor predeterminado es @samp{#t}

@end deftypevr


@c %end of fragment



@node Servicios de monitorización
@subsection Servicios de monitorización

@subsubheading Servicio Tailon

@uref{https://tailon.readthedocs.io/, Tailon} es una aplicación web para la
visualización y búsqueda en archivos de registro.

El ejemplo siguiente configura el servicio con los valores
predeterminados. Por omisión, se puede acceder a Tailon en el puerto 8080
(@code{http://localhost:8080}).

@lisp
(service tailon-service-type)
@end lisp

El ejemplo siguiente personaliza más la configuración de Tailon, añadiendo
@command{sed} a la lista de órdenes permitidas.

@lisp
(service tailon-service-type
         (tailon-configuration
           (config-file
             (tailon-configuration-file
               (allowed-commands '("tail" "grep" "awk" "sed"))))))
@end lisp


@deftp {Tipo de datos} tailon-configuration
Tipo de datos que representa la configuración de Tailon. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{config-file} (predeterminado: @code{(tailon-configuration-file)})
The configuration file to use for Tailon.  This can be set to a
@dfn{tailon-configuration-file} record value, or any gexp
(@pxref{Expresiones-G}).

Por ejemplo, para usar un archivo local, se puede usar la función
@code{local-file}:

@lisp
(service tailon-service-type
         (tailon-configuration
           (config-file (local-file "./mi-tailon.conf"))))
@end lisp

@item @code{package} (predeterminado: @code{tailon})
El paquete tailon usado.

@end table
@end deftp

@deftp {Tipo de datos} tailon-configuration-file
Tipo de datos que representa las opciones de configuración de Tailon. Este
tipo tiene los siguientes parámetros:

@table @asis
@item @code{files} (predeterminados: @code{(list "/var/log")})
List of files to display.  The list can include strings for a single file or
directory, or a list, where the first item is the name of a subsection, and
the remaining items are the files or directories in that subsection.

@item @code{bind} (predeterminado: @code{"localhost:8080"})
Dirección y puerto al que Tailon debe asociarse.

@item @code{relative-root} (predeterminado: @code{#f})
Ruta URL usada por Tailon, use @code{#f} para no usar una ruta.

@item @code{allow-transfers?} (predeterminado: @code{#t})
Permite la descarga de archivos de registro en la interfaz web.

@item @code{follow-names?} (predeterminado: @code{#t})
Permite la lectura de archivos todavía no existentes.

@item @code{tail-lines} (predeterminado: @code{200})
Número de líneas a leer inicialmente de cada archivo.

@item @code{allowed-commands} (predeterminadas: @code{(list "tail" "grep" "awk")})
Commands to allow running.  By default, @code{sed} is disabled.

@item @code{debug?} (predeterminado: @code{#f})
Proporcione el valor @code{#t} en @code{debug?} para mostrar mensajes de
depuración.

@item @code{wrap-lines} (predeterminado: @code{#t})
Initial line wrapping state in the web interface.  Set to @code{#t} to
initially wrap lines (the default), or to @code{#f} to initially not wrap
lines.

@item @code{http-auth} (predeterminado: @code{#f})
HTTP authentication type to use.  Set to @code{#f} to disable authentication
(the default).  Supported values are @code{"digest"} or @code{"basic"}.

@item @code{users} (predeterminado: @code{#f})
If HTTP authentication is enabled (see @code{http-auth}), access will be
restricted to the credentials provided here.  To configure users, use a list
of pairs, where the first element of the pair is the username, and the 2nd
element of the pair is the password.

@lisp
(tailon-configuration-file
  (http-auth "basic")
  (users     '(("usuaria1" . "contraseña1")
               ("usuaria2" . "contraseña2"))))
@end lisp

@end table
@end deftp


@subsubheading Servicio Darkstat
@cindex darkstat
Darkstat es un programa de interceptación de paquetes que captura el tráfico
de la red, calcula estadísticas sobre su uso y proporciona informes a través
de HTTP.

@defvar {Variable Scheme} darkstat-service-type
Este es el tipo de servicio del servicio
@uref{https://unix4lyfe.org/darkstat/, darkstat}, su valor debe ser un
registro @code{darkstat-configuration} como en este ejemplo:

@lisp
(service darkstat-service-type
         (darkstat-configuration
           (interface "eno1")))
@end lisp
@end defvar

@deftp {Tipo de datos} darkstat-configuration
Tipo de datos que representa la configuración de @command{darkstat}.

@table @asis
@item @code{package} (predeterminado: @code{darkstat})
El paquete darkstat usado.

@item @code{interface}
Captura el tráfico en la interfaz de red especificada.

@item @code{port} (predeterminado: @code{"667"})
Asocia la interfaz web al puerto especificado.

@item @code{bind-address} (predeterminada: @code{"127.0.0.1"})
Asocia la interfaz web a la dirección especificada.

@item @code{base} (predeterminada: @code{"/"})
Specify the path of the base URL@.  This can be useful if @command{darkstat}
is accessed via a reverse proxy.

@end table
@end deftp

@anchor{prometheus-node-exporter}
@subsubheading Servicio del exportador de nodos Prometheus
@cindex prometheus-node-exporter

El ``exportador de nodos'' Prometheus pone a disposición del sistema de
monitorización Prometheus las estadísticas de hardware y el sistema
operativo proporcionadas por el núcleo Linux. Este servicio debe desplegarse
en todos los nodos físicos y máquinas virtuales, donde la monitorización de
estas estadísticas sea deseable.

@defvar {Variable Scheme} prometheus-node-exporter-service-type
This is the service type for the
@uref{https://github.com/prometheus/node_exporter/,
prometheus-node-exporter} service, its value must be a
@code{prometheus-node-exporter-configuration}.

@lisp
(service prometheus-node-exporter-service-type)
@end lisp
@end defvar

@deftp {Tipo de datos} prometheus-node-exporter-configuration
Tipo de datos que representa la configuración de @command{node_exporter}.

@table @asis
@item @code{package} (predeterminado: @code{go-github-com-prometheus-node-exporter})
El paquete prometheus-node-exporter usado.

@item @code{web-listen-address} (predeterminada: @code{":9100"})
Asocia la interfaz web a la dirección especificada.

@item @code{textfile-directory} (default: @code{"/var/lib/prometheus/node-exporter"})
This directory can be used to export metrics specific to this machine.
Files containing metrics in the text format, with the filename ending in
@code{.prom} should be placed in this directory.

@item @code{extra-options} (predeterminadas: @code{'()})
Extra options to pass to the Prometheus node exporter.

@end table
@end deftp

@subsubheading Servidor Zabbix
@cindex zabbix zabbix-server
Zabbix is a high performance monitoring system that can collect data from a
variety of sources and provide the results in a web-based interface.
Alerting and reporting is built-in, as well as @dfn{templates} for common
operating system metrics such as network utilization, CPU load, and disk
space consumption.

This service provides the central Zabbix monitoring service; you also need
@ref{zabbix-front-end,@code{zabbix-front-end-service-type}} to configure
Zabbix and display results, and optionally @ref{zabbix-agent,
@code{zabbix-agent-service-type}} on machines that should be monitored
(other data sources are supported, such as @ref{prometheus-node-exporter,
Prometheus Node Exporter}).

@defvar {Scheme variable} zabbix-server-service-type
This is the service type for the Zabbix server service.  Its value must be a
@code{zabbix-server-configuration} record, shown below.
@end defvar

@c %start of fragment

@deftp {Data Type} zabbix-server-configuration
Los campos disponibles de @code{zabbix-server-configuration} son:

@table @asis
@item @code{zabbix-server} (default: @code{zabbix-server}) (type: file-like)
El paquete zabbix-server.

@item @code{user} (default: @code{"zabbix"}) (type: string)
Usuaria que ejecutará el servidor Zabbix.

@item @code{group} (default: @code{"zabbix"}) (type: group)
Grupo que ejecutará el servidor Zabbix.

@item @code{db-host} (default: @code{"127.0.0.1"}) (type: string)
El nombre de máquina de la base de datos.

@item @code{db-name} (default: @code{"zabbix"}) (type: string)
Nombre de la base de datos.

@item @code{db-user} (default: @code{"zabbix"}) (type: string)
Usuaria de la base de datos.

@item @code{db-password} (default: @code{""}) (type: string)
Contraseña de la base de datos. Por favor, en vez de esto use
@code{include-files} con @code{DBPassword=SECRET} dentro de un archivo
especificado.

@item @code{db-port} (default: @code{5432}) (type: number)
Puerto de la base de datos.

@item @code{log-type} (default: @code{""}) (type: string)
Especifica donde se escriben los mensajes de registro:

@itemize @bullet

@item @code{system} - syslog.

@item @code{file} - archivo especificado con el parámetro @code{log-file}.

@item @code{console} - salida estándar.

@end itemize

@item @code{log-file} (default: @code{"/var/log/zabbix/server.log"}) (type: string)
Nombre del archivo de registro para el parámetro @code{file} de
@code{log-type}.

@item @code{pid-file} (default: @code{"/var/run/zabbix/zabbix_server.pid"}) (type: string)
Nombre del archivo de PID.

@item @code{ssl-ca-location} (default: @code{"/etc/ssl/certs/ca-certificates.crt"}) (type: string)
La localización de los archivos de autoridades de certificación (CA) para la
verificación de certificados SSL de los servidores.

@item @code{ssl-cert-location} (default: @code{"/etc/ssl/certs"}) (type: string)
Localización de los certificados SSL de los clientes.

@item @code{extra-options} (default: @code{""}) (type: extra-options)
Opciones adicionales que se añadirán al final del archivo de configuración
de Zabbix.

@item @code{include-files} (default: @code{()}) (type: include-files)
Puede incluir archivos individuales o todos los archivos en un directorio en
el archivo de configuración.

@end table

@end deftp


@c %end of fragment

@anchor{zabbix-agent}
@subsubheading Agente Zabbix
@cindex zabbix zabbix-agent

The Zabbix agent gathers information about the running system for the Zabbix
monitoring server.  It has a variety of built-in checks, and can be extended
with custom
@uref{https://www.zabbix.com/documentation/current/en/manual/config/items/userparameters,
@dfn{user parameters}}.

@defvar {Scheme variable} zabbix-agent-service-type
This is the service type for the Zabbix agent service.  Its value must be a
@code{zabbix-agent-configuration} record, shown below.
@end defvar

@c %start of fragment

@deftp {Data Type} zabbix-agent-configuration
Los campos disponibles de @code{zabbix-agent-configuration} son:

@table @asis
@item @code{zabbix-agent} (default: @code{zabbix-agentd}) (type: file-like)
El paquete zabbix-agent.

@item @code{user} (default: @code{"zabbix"}) (type: string)
Usuaria que ejecutará el agente Zabbix.

@item @code{group} (default: @code{"zabbix"}) (type: group)
Grupo que ejecutará el agente Zabbix.

@item @code{hostname} (default: @code{""}) (type: string)
Nombre de máquina único y sensible a mayúsculas que es necesario para la
comprobaciones activas y debe corresponder con el nombre de máquina
configurado en el servidor.

@item @code{log-type} (default: @code{""}) (type: string)
Especifica donde se escriben los mensajes de registro:

@itemize @bullet
@item
@code{system} - syslog.

@item @code{file} - file specified with
@code{log-file} parameter.

@item @code{console} - salida estándar.

@end itemize

@item @code{log-file} (default: @code{"/var/log/zabbix/agent.log"}) (type: string)
Nombre del archivo de registro para el parámetro @code{file} de
@code{log-type}.

@item @code{pid-file} (default: @code{"/var/run/zabbix/zabbix_agent.pid"}) (type: string)
Nombre del archivo de PID.

@item @code{server} (default: @code{("127.0.0.1")}) (type: list)
Lista de direcciones IP, opcionalmente en notación CIDR, o nombres de
máquina de servidores y proxy Zabbix. Se aceptarán conexiones entrantes
únicamente desde las máquinas proporcionadas aquí.

@item @code{server-active} (default: @code{("127.0.0.1")}) (type: list)
Lista de pares IP:puerto (o máquina:puerto) de servidores Zabbix y
servidores Zabbix para las comprobaciones activas. Si no se especifica un
puerto, se usa el puerto predeterminado. Si no se especifica este parámetro,
las comprobaciones activas se desactivan.

@item @code{extra-options} (default: @code{""}) (type: extra-options)
Opciones adicionales que se añadirán al final del archivo de configuración
de Zabbix.

@item @code{include-files} (default: @code{()}) (type: include-files)
Puede incluir archivos individuales o todos los archivos en un directorio en
el archivo de configuración.

@end table

@end deftp


@c %end of fragment

@anchor{zabbix-front-end}
@subsubheading Motor de visualización de Zabbix
@cindex zabbix zabbix-front-end

The Zabbix front-end provides a web interface to Zabbix.  It does not need
to run on the same machine as the Zabbix server.  This service works by
extending the @ref{PHP-FPM} and @ref{NGINX} services with the configuration
necessary for loading the Zabbix user interface.

@defvar {Scheme variable} zabbix-front-end-service-type
This is the service type for the Zabbix web frontend.  Its value must be a
@code{zabbix-front-end-configuration} record, shown below.
@end defvar

@c %start of fragment

@deftp {Data Type} zabbix-front-end-configuration
Los campos disponibles de @code{zabbix-front-end-configuration} son:

@table @asis
@item @code{zabbix-server} (default: @code{zabbix-server}) (type: file-like)
The Zabbix server package to use.

@item @code{nginx} (default: @code{()}) (type: list)
List of @ref{nginx-server-configuration,@code{nginx-server-configuration}}
blocks for the Zabbix front-end.  When empty, a default that listens on port
80 is used.

@item @code{db-host} (default: @code{"localhost"}) (type: string)
El nombre de máquina de la base de datos.

@item @code{db-port} (default: @code{5432}) (type: number)
Puerto de la base de datos.

@item @code{db-name} (default: @code{"zabbix"}) (type: string)
Nombre de la base de datos.

@item @code{db-user} (default: @code{"zabbix"}) (type: string)
Usuaria de la base de datos.

@item @code{db-password} (default: @code{""}) (type: string)
Contraseña de la base de datos. Por favor, en vez de esto use
@code{db-secret-file}.

@item @code{db-secret-file} (default: @code{""}) (type: string)
Archivo secreto que se añadirá al final del archivo
@file{zabbix.conf.php}. Este archivo contiene las credenciales usadas por el
motor de visualización de Zabbix. Se espera que usted lo cree manualmente.

@item @code{zabbix-host} (default: @code{"localhost"}) (type: string)
Nombre de máquina del servidor Zabbix.

@item @code{zabbix-port} (default: @code{10051}) (type: number)
Puerto del servidor Zabbix.

@end table

@end deftp


@c %end of fragment

@node Servicios Kerberos
@subsection Servicios Kerberos
@cindex Kerberos

El módulo @code{(gnu services kerberos)} proporciona servicios relacionados
con el protocolo de identificación @dfn{Kerberos}.

@subsubheading Servicio Krb5

Los programas que usan una biblioteca cliente de Kerberos habitualmente
esperan un archivo de configuración en la ruta @file{/etc/krb5.conf}. Este
servicio genera dicho archivo desde una definición proporcionada en la
declaración de sistema operativo. Esto no causa el inicio de ningún daemon.

Este servicio no crea ningún archivo ``keytab''---debe crearlos
explícitamente usted. Se ha comprobado que este servicio funciona con la
biblioteca de cliente @code{mit-krb5} del MIT. No se han probado otras
implementaciones.

@defvr {Variable Scheme} krb5-service-type
Un tipo de servicio para clientes Kerberos 5.
@end defvr

@noindent
Este es un ejemplo de su uso:
@lisp
(service krb5-service-type
         (krb5-configuration
          (default-realm "EXAMPLE.COM")
          (allow-weak-crypto? #t)
          (realms (list
                   (krb5-realm
                    (name "EXAMPLE.COM")
                    (admin-server "groucho.example.com")
                    (kdc "karl.example.com"))
                   (krb5-realm
                    (name "ARGRX.EDU")
                    (admin-server "kerb-admin.argrx.edu")
                    (kdc "keys.argrx.edu"))))))
@end lisp

@noindent
Este ejemplo proporciona una configuración de cliente Kerberos@tie{}5 que:
@itemize
@item Reconoce dos dominios, @i{sean:} ``EXAMPLE.COM'' y ``ARGRX.EDU'', los cuales
tienen distintos servidores administrativos y centros de distribución de
claves;
@item El valor predeterminado será ``EXAMPLE.COM'' si no se especifica el dominio
explícitamente por parte del cliente.
@item Acepta servicios cuyos únicos tipos de cifrado implementados se sabe que son débiles.
@end itemize

Los tipos @code{krb5-realm} y @code{krb5-configuration} contienen muchos
campos.  Aquí se describen únicamente los más habitualmente usados.  Para
obtener una lista complete y una explicación detallada de cada campo, véase
la documentación de
@uref{https://web.mit.edu/kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html,,krb5.conf}.


@deftp {Tipo de datos} krb5-realm
@cindex dominio (realm), kerberos
@table @asis
@item @code{name}
Este campo es una cadena que identifica el nombre del dominio. Una
convención habitual es el uso del nombre completo de DNS de su organización,
convertido a mayúsculas.

@item @code{admin-server}
Este campo es una cadena que identifica la máquina donde se ejecuta el
servidor administrativo.

@item @code{kdc}
Este campo es una cadena que identifica el centro de distribución de claves
para el dominio.
@end table
@end deftp

@deftp {Tipo de datos} krb5-configuration

@table @asis
@item @code{allow-weak-crypto?} (predeterminado: @code{#f})
Si esta opción es @code{#t} se aceptarán los servicios que únicamente
ofrezcan algoritmos de cifrado que se conozca que son débiles.

@item @code{default-realm} (predeterminado: @code{#f})
Este campo debe ser una cadena que identifique el dominio predeterminado de
Kerberos para los clientes. Debería proporcionar el nombre de su dominio
Kerberos. Si este valor es @code{#f}, el dominio debe especificarse en cada
principal de Kerberos cuando se invoquen programas como @command{kinit}.

@item @code{realms}
Debe ser una lista no vacía de objetos @code{krb5-realm}, accesibles por los
clientes. Normalmente, uno de ellos tendrá un campo @code{name} que
corresponda con el campo @code{default-realm}.
@end table
@end deftp


@subsubheading Servicio krb5 de PAM
@cindex pam-krb5

El servicio @code{pam-krb5} le permite la identificación para el ingreso al
sistema y la gestión de contraseñas mediante Kerberos. Este servicio es
necesario si desea que aplicaciones que permiten PAM lleven a cabo la
identificación de usuarias mediante el uso de Kerberos.

@defvr {Variable Scheme} pam-krb5-service-type
Un tipo de servicio para el módulo PAM de Kerberos 5.
@end defvr

@deftp {Tipo de datos} pam-krb5-configuration
Tipo de datos que representa la configuración del módulo PAM de Kerberos
5. Este tipo tiene los siguientes parámetros:
@table @asis
@item @code{pam-krb5} (predeterminado: @code{pam-krb5})
El paquete pam-krb5 usado.

@item @code{minimum-uid} (predeterminado: @code{1000})
El ID de usuaria mínimo con el que se permitirán los intentos de
identificación con Kerberos. El proceso de identificación de las cuentas
locales con valores menores fallará de manera silenciosa.
@end table
@end deftp


@node Servicios LDAP
@subsection Servicios LDAP
@cindex LDAP
@cindex nslcd, servicio LDAP

El módulo @code{(gnu services authentication)} proporciona el tipo
@code{nslcd-service-type}, que puede usarse para la identificación a través
de un servidor LDAP. Además de la configuración del servicio en sí, puede
desear añadir @code{ldap} como servicio de nombres en el selector de
servicios de nombres (NSS). @xref{Selector de servicios de nombres} para información
detallada.

Aquí se encuentra una declaración simple de sistema operativo con la
configuración predeterminada de @code{nslcd-service-type} y una
configuración del selector de servicios de nombre que consulta en último
lugar al servicios de nombres @code{ldap}:

@lisp
(use-service-modules authentication)
(use-modules (gnu system nss))
...
(operating-system
  ...
  (services
    (cons*
      (service nslcd-service-type)
      (service dhcp-client-service-type)
      %base-services))
  (name-service-switch
   (let ((services (list (name-service (name "db"))
                         (name-service (name "files"))
                         (name-service (name "ldap")))))
     (name-service-switch
      (inherit %mdns-host-lookup-nss)
      (password services)
      (shadow   services)
      (group    services)
      (netgroup services)
      (gshadow  services)))))
@end lisp

@c %start of generated documentation for nslcd-configuration

Los campos disponibles de @code{nslcd-configuration} son:

@deftypevr {parámetro de @code{nslcd-configuration}} package nss-pam-ldapd
El paquete @code{nss-pam-ldapd} usado.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number threads
El número de hilos a iniciar que pueden gestionar peticiones y realizar
consultas en LDAP. Cada hilo abre una conexión separada al servidor LDAP. Se
inician 5 hilos de manera predeterminada.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} string uid
Especifica el id de usuaria con el que debe ejecutarse el daemon.

El valor predeterminado es @samp{"nslcd"}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} string gid
Especifica el id de grupo con el que debe ejecutarse el daemon.

El valor predeterminado es @samp{"nslcd"}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} opción-registro log
This option controls the way logging is done via a list containing SCHEME
and LEVEL@.  The SCHEME argument may either be the symbols @samp{none} or
@samp{syslog}, or an absolute file name.  The LEVEL argument is optional and
specifies the log level.  The log level may be one of the following symbols:
@samp{crit}, @samp{error}, @samp{warning}, @samp{notice}, @samp{info} or
@samp{debug}.  All messages with the specified log level or higher are
logged.

El valor predeterminado es @samp{("/var/log/nslcd" info)}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} lista uri
La lista de URI de servidores LDAP. Normalmente, únicamente se usará el
primer servidor y los siguientes se usan en caso de fallo.

El valor predeterminado es @samp{"ldap://localhost:389/"}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string ldap-version
La versión del protocolo LDAP usada. El valor predeterminado usa la versión
máxima implementada por la biblioteca LDAP.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string binddn
Especifica el nombre distinguido con el que enlazarse en el servidor de
directorio para las búsquedas. El valor predeterminado se enlaza de forma
anónima.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string bindpw
Especifica las credenciales usadas para el enlace. Esta opción tiene
utilidad únicamente cuando se usa con binddn.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string rootpwmoddn
Especifica el nombre distinguido usado cuando la usuaria root intenta
modificar la contraseña de una usuaria mediante el módulo de PAM.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string rootpwmodpw
Especifica las credenciales con las que enlazarse si la usuaria root intenta
cambiar la contraseña de una usuaria. Esta opción tiene utilidad únicamente
cuando se usa con rootpwmoddn.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string sasl-mech
Especifica el mecanismo de SASL usado cuando se realice la identificación
con SASL.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string sasl-realm
Especifica el dominio de SASL usado cuando se realice la identificación con
SASL.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string sasl-authcid
Especifica la identidad de verificación usada cuando se realice la
identificación con SASL.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string sasl-authzid
Especifica la identidad de autorización usada cuando se realice la
identificación con SASL.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean sasl-canonicalize?
Determina si el nombre de máquina del servidor LDAP debe transformarse a su
forma canónica. Si se activa, la librería LDAP realizará una búsqueda
inversa de nombre de máquina. De manera predeterminada, se delega en la
biblioteca la decisión de realizar esta comprobación o no.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string krb5-ccname
Establece el nombre para la caché de credenciales GSS-API de Kerberos.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} string base
El directorio de búsqueda base.

El valor predeterminado es @samp{"dc=example,dc=com"}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} opción-de-ámbito scope
Especifica el ámbito de búsqueda (subtree, oneleve, base o children). El
ámbito predeterminado es subtree; el ámbito base casi nunca es útil para
búsquedas del servicio de nombres; el ámbito children no está implementado
en todos los servidores.

El valor predeterminado es @samp{(subtree)}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-deref-option deref
Especifica la política para seguir las referencias de los alias. La política
predeterminada es nunca seguir las referencias de los alias.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean referrals
Especifica si el seguimiento automático de referencias debe activarse. El
seguimiento de referencias es comportamiento predeterminado.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} lista-asociación-entrada maps
Esta opción permite que se busquen atributos personalizados en vez de los
atributos predeterminados de RFC 2307. Es una lista de asociaciones, de las
que cada una consiste en el nombre de la asociación, el atributo de RFC 2307
al que corresponde y la expresión de búsqueda del atributo en la forma que
esté disponible en el directorio.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} lista-asociación-entrada filters
Una lista de filtros que consiste en el nombre de una asociación a la que se
aplica el filtro y una expresión de filtrado de búsqueda de LDAP.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number bind-timelimit
Especifica el tiempo límite usado en segundos durante la conexión al
servidor de directorio. El valor predeterminado son 10 segundos.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number timelimit
Especifica el tiempo límite (en segundos) durante el que se esperará una
respuesta del servidor LDAP. Un valor de cero, por omisión, hace que se
espere de manera indefinida hasta que las búsquedas se completen.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number idle-timelimit
Especifica el periodo de inactividad (en segundos) tras el cual se cerrará
la conexión con el servidor LDAP. El valor predeterminado no cierra las
conexiones por inactividad.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number reconnect-sleeptime
Especifica en número de segundos que se dormirá cuando falle la conexión a
todos los servidores LDAP. De manera predeterminada se espera un segundo
entre el primer fallo y el primer reintento.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number reconnect-retrytime
Especifica el tiempo tras el cual el servidor LDAP se considera no
disponible de manera permanente. Una vez se alcance este tiempo, los
reintentos se realizarán una vez en cada periodo de tiempo igual al
especificado. El valor predeterminado es 10 segundos.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-ssl-option ssl
Determina si se usa SSL/TLS o no (el comportamiento predeterminado es no
hacerlo). Si se especifica 'start-tls, se usa StartTLS en vez de la
transmisión del protocolo LDAP en crudo sobre SSL.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-tls-reqcert-option tls-reqcert
Especifica las comprobaciones que se deben realizar con un certificado
proporcionado por el servidor. El significado de los valores se describe en
la página de manual de ldap.conf(5). 

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-cacertdir
Especifica el directorio que contiene los certificados X.509 para la
identificación de pares. Este parámetro se ignora si se usa GnuTLS.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-cacertfile
Especifica la ruta al certificado X.509 para la identificación de pares.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-randfile
Especifica la ruta de la fuente de entropía. Este parámetro se ignora si se
usa GnuTLS.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-ciphers
Especifica como una cadena los algoritmos de cifrado usados para TLS.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-cert
Especifica la ruta al archivo que contiene el certificado local para la
identificación de clientes con TLS.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string tls-key
Especifica la ruta al archivo que contiene la clave privada para la
identificación de clientes con TLS.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number pagesize
Proporcione un valor superior a 0 para solicitar al servidor LDAP que
proporcione los resultados divididos en páginas de acuerdo con el
RFC2696. El valor predeterminado (0) no solicita resultados divididos en
páginas.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-ignore-users-option nss-initgroups-ignoreusers
Esta opción previene las búsquedas de pertenencia a grupos a través de LDAP
sobre las usuarias especificadas. De manera alternativa, se puede usar el
valor 'all-local. Con dicho valor nslcd construye al inicio una lista
completa de usuarias que no se encuentren en LDAP.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number nss-min-uid
Esta opción hace que se ignoren las usuarias de LDAP con un identificador
numérico inferior al valor especificado.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number nss-uid-offset
Esta opción especifica un desplazamiento que se añade a todos los
identificadores numéricos de usuaria de LDAP. Puede usarse para evitar
colisiones de identificadores con usuarias locales.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-number nss-gid-offset
Esta opción especifica un desplazamiento que se añade a todos los
identificadores numéricos de grupos de LDAP. Puede usarse para evitar
colisiones de identificadores con grupos locales.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean nss-nested-groups
Cuando se activa esta opción, un grupo puede contener como atributo la
pertenencia a otro grupo. Los miembros de grupos anidados se devuelven en el
grupo superior y los grupos superiores se devuelven cuando se busquen los
grupos de una usuaria específica. El valor predeterminado determina que no
se realicen búsquedas adicionales para grupos anidados.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean nss-getgrent-skipmembers
Cuando se activa esta opción, la lista de miembros de un grupo no se obtiene
en las búsquedas de grupos. Las búsquedas que busquen los grupos de los que
una usuaria es miembro continuarán funcionando de manera que probablemente a
la usuaria se le asignen los grupos correctos durante el ingreso al sistema.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean nss-disable-enumeration
Cuando se activa esta opción, las funciones que provocan la carga de todas
las entradas usuaria/grupo del directorio no tendrán éxito al
realizarlo. Esto puede reducir de forma dramática la carga del servidor LDAP
cuando existe un gran número de usuarias y/o grupos. Esta opción no se
recomienda para la mayoría de las configuraciones.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string validnames
Esta opción puede usarse para especificar cómo se verifican en el sistema
los nombres de usuaria y grupo. Este patrón se usa para comprobar todos los
nombres de usuarias y grupos que se soliciten y proporcionen a través de
LDAP.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean ignorecase
Especifica si se realizarán las búsquedas sin diferenciar mayúsculas y
minúsculas o no. Su activación puede abrir puntos vulnerables que permitan
la omisión de las comprobaciones de autorización e introducir
vulnerabilidades que permitan el envenenamiento de la caché de nscd, lo que
puede provocar la denegación del servicio.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-boolean pam-authc-ppolicy
Esta opción determina si los controles de la política de contraseñas se
solicitan y manejan desde el servidor LDAP cuando se realice la
identificación de usuarias.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string pam-authc-search
De manera predeterminada nslcd realiza una búsqueda LDAP con las
credenciales de la usuaria tras la orden BIND (identificación) para
asegurarse de que la opción BIND fue satisfactoria. La búsqueda
predeterminada es una simple comprobación de la existencia del DN de la
usuaria. Se puede especificar un filtro de búsqueda que se usará en vez de
dicha búsqueda. Debe devolver al menos una entrada.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string pam-authz-search
Esta opción permite la configuración detallada de las comprobaciones de
autorización que deben realizarse. El filtro de búsqueda especificado es
ejecutado, y si cualquier entrada corresponde se permite el acceso, el cual
se deniega en caso contrario.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} maybe-string pam-password-prohibit-message
Si se proporciona esta opción, se denegará la modificación de contraseñas a
través de pam_ldap y en vez de ello el mensaje especificado se presentará a
la usuaria. El mensaje puede usarse para redirigir a la usuaria a un medio
alternativo para el cambio de su contraseña.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{nslcd-configuration}} lista pam-services
Lista de nombres de servicio de PAM para los que la identificación de LDAP
debería ser suficiente.

El valor predeterminado es @samp{()}.

@end deftypevr

@c %end of generated documentation for nslcd-configuration


@node Servicios Web
@subsection Servicios Web

@cindex web
@cindex www
@cindex HTTP
El módulo @code{(gnu services web)} proporciona el servidor HTTP Apache, el
servidor web nginx y también un recubrimiento del daemon de fastcgi.

@subsubheading Servidor HTTP Apache

@deffn {Variable Scheme} httpd-service-type
Tipo de servicio para el servidor @uref{https://httpd.apache.org/, Apache
HTTP} (@dfn{httpd}).  El valor para este tipo de servicio es un registro
@code{httpd-configuration}.

Un ejemplo de configuración simple se proporciona a continuación.

@lisp
(service httpd-service-type
         (httpd-configuration
           (config
             (httpd-config-file
               (server-name "www.example.com")
               (document-root "/srv/http/www.example.com")))))
@end lisp

Otros servicios también pueden extender el tipo @code{httpd-service-type}
para añadir su contribución a la configuración.

@lisp
(simple-service 'servidor-www.example.com httpd-service-type
                (list
                  (httpd-virtualhost
                    "*:80"
                    (list (string-join '("ServerName "www.example.com"
                                         "DocumentRoot /srv/http/www.example.com")
                                       "\n")))))
@end lisp
@end deffn

Los detalles de los tipos de registro @code{httpd-configuration},
@code{httpd-module}, @code{httpd-config-file} y @code{httpd-virtualhost} se
proporcionan a continuación.

@deffn {Tipo de datos} httpd-configuration
Este tipo de datos representa la configuración del servicio httpd.

@table @asis
@item @code{package} (predeterminado: @code{httpd})
El paquete httpd usado.

@item @code{pid-file} (predeterminado: @code{"/var/run/httpd"})
El archivo pid usado por el servicio de Shepherd.

@item @code{config} (predeterminado: @code{(httpd-config-file)})
The configuration file to use with the httpd service.  The default value is
a @code{httpd-config-file} record, but this can also be a different
G-expression that generates a file, for example a @code{plain-file}.  A file
outside of the store can also be specified through a string.

@end table
@end deffn

@deffn {Tipo de datos} httpd-module
Este es el tipo de datos que representa un módulo para el servicio httpd.

@table @asis
@item @code{name}
El nombre del módulo.

@item @code{file}
The file for the module.  This can be relative to the httpd package being
used, the absolute location of a file, or a G-expression for a file within
the store, for example @code{(file-append mod-wsgi "/modules/mod_wsgi.so")}.

@end table
@end deffn

@defvr {Variable Scheme} %default-httpd-modules
Una lista de objetos @code{httpd-module} predeterminados.
@end defvr

@deffn {Tipo de datos} httpd-config-file
Este tipo de datos representa un archivo de configuración para el servicio
httpd.

@table @asis
@item @code{modules} (predeterminados: @code{%default-httpd-modules})
The modules to load.  Additional modules can be added here, or loaded by
additional configuration.

Por ejemplo, para manejar las peticiones de archivos PHP, puede usar el
módulo @code{mod_proxy_fcgi} de Apache junto con
@code{php-fpm-service-type}:

@lisp
(service httpd-service-type
         (httpd-configuration
          (config
           (httpd-config-file
            (modules (cons*
                      (httpd-module
                       (name "modulo_proxy")
                       (file "modules/mod_proxy.so"))
                      (httpd-module
                       (name "module_proxy_fcgi")
                       (file "modules/mod_proxy_fcgi.so"))
                      %default-httpd-modules))
            (extra-config (list "\
<FilesMatch \\.php$>
    SetHandler \"proxy:unix:/var/run/php-fpm.sock|fcgi://localhost/\"
</FilesMatch>"))))))
(service php-fpm-service-type
         (php-fpm-configuration
          (socket "/var/run/php-fpm.sock")
          (socket-group "httpd")))
@end lisp

@item @code{server-root} (predeterminado: @code{httpd})
The @code{ServerRoot} in the configuration file, defaults to the httpd
package.  Directives including @code{Include} and @code{LoadModule} are
taken as relative to the server root.

@item @code{server-name} (predeterminado: @code{#f})
El campo @code{ServerName} (nombre del servidor) en el archivo de
configuración, el cual se usa para especificar el esquema de peticiones,
nombre de máquina y puerto que el servidor usa para su propia
identificación.

This doesn't need to be set in the server config, and can be specified in
virtual hosts.  The default is @code{#f} to not specify a @code{ServerName}.

@item @code{document-root} (predeterminado: @code{"/srv/http"})
La raíz (@code{DocumentRoot}) desde la que se proporcionan los archivos.

@item @code{listen} (predeterminado: @code{'("80")})
The list of values for the @code{Listen} directives in the config file.  The
value should be a list of strings, when each string can specify the port
number to listen on, and optionally the IP address and protocol to use.

@item @code{pid-file} (predeterminado: @code{"/var/run/httpd"})
The @code{PidFile} to use.  This should match the @code{pid-file} set in the
@code{httpd-configuration} so that the Shepherd service is configured
correctly.

@item @code{error-log} (predeterminado: @code{"/var/log/httpd/error_log"})
El archivo @code{ErrorLog} en el que el servidor registrará los errores.

@item @code{user} (predeterminada: @code{"httpd"})
La usuaria como la que el servidor responderá a las peticiones.

@item @code{group} (predeterminado: @code{"httpd"})
El grupo como el que el servidor responderá a las peticiones.

@item @code{extra-config} (predeterminadas: @code{(list "TypesConfig etc/httpd/mime.types")})
Una lista de cadenas y expresiones-G que se añadirán al final del archivo de
configuración.

Los valores con los que se extiende el servicio se añaden al final de esta
lista.

@end table
@end deffn

@deffn {Tipo de datos} httpd-virtualhost
Este tipo de datos representa un bloque de configuración de máquina virtual
del servicio httpd.

Se deben añadir a la configuración adicional extra-config del servicio
httpd-service.

@lisp
(simple-service 'servidor-www.example.com httpd-service-type
                (list
                  (httpd-virtualhost
                    "*:80"
                    (list (string-join '("ServerName "www.example.com"
                                         "DocumentRoot /srv/http/www.example.com")
                                       "\n")))))
@end lisp

@table @asis
@item @code{addresses-and-ports}
Las direcciones y puertos de la directiva @code{VirtualHost}.

@item @code{contents}
El contenido de la directiva @code{VirtualHost}; debe ser una lista de
cadenas y expresiones-G.

@end table
@end deffn

@anchor{NGINX}
@subsubheading NGINX

@deffn {Variable Scheme} nginx-service-type
Tipo de servicio para el servidor web @uref{https://nginx.org/,NGinx}. El
valor para este tipo de servicio es un registro
@code{<nginx-configuration>}.

Un ejemplo de configuración simple se proporciona a continuación.

@lisp
(service nginx-service-type
         (nginx-configuration
           (server-blocks
             (list (nginx-server-configuration
                     (server-name '("www.example.com"))
                     (root "/srv/http/www.example.com"))))))
@end lisp

Además de añadiendo bloques de servidor a la configuración del servicio de
manera directa, este servicio puede extenderse con otros servicios para
añadir bloques de servidor, como en este ejemplo:

@lisp
(simple-service 'mi-servidor-adicional nginx-service-type
                (list (nginx-server-configuration
                        (root "/srv/http/sitio-adicional")
                        (try-files (list "$uri" "$uri/index.html")))))
@end lisp
@end deffn

Durante su inicio, @command{nginx} no ha leído todavía su archivo de
configuración, por lo que usa un archivo predeterminado para registrar los
mensajes de error. Si se produce algún fallo al cargar su archivo de
configuración, allí es donde se registran los mensajes de error. Tras la
carga del archivo de configuración, el archivo de registro de errores
predeterminado cambia al especificado allí. En nuestro caso, los mensajes de
error durante el inicio se pueden encontrar en
@file{/var/run/nginx/logs/error.log}, y tras la configuración en
@file{/var/log/nginx/error.log}. La segunda ruta puede cambiarse con las
opciones de configuración @var{log-directory}.

@deffn {Tipo de datos} nginx-configuration
This data type represents the configuration for NGinx.  Some configuration
can be done through this and the other provided record types, or
alternatively, a config file can be provided.

@table @asis
@item @code{nginx} (predeterminado: @code{nginx})
El paquete nginx usado.

@item @code{shepherd-requirement} (default: @code{'()})
This is a list of symbols naming Shepherd services the nginx service will
depend on.

This is useful if you would like @command{nginx} to be started after a
back-end web server or a logging service such as Anonip has been started.

@item @code{log-directory} (predeterminado: @code{"/var/log/nginx"})
Directorio en el que NGinx escribirá los archivos de registro.

@item @code{run-directory} (predeterminado: @code{"/var/run/nginx"})
Directorio en el que NGinx crea el archivo de PID, y escribe archivos
temporales.

@item @code{server-blocks} (predeterminados: @code{'()})
Una lista de @dfn{bloques de servidor} que se crearán en el archivo de
configuración generado; los elementos deben ser del tipo
@code{<nginx-server-configuration>}.

El ejemplo siguiente configura NGinx para proporcionar
@code{www.example.com} a partir del directorio
@code{/srv/http/www.example.com}, sin usar HTTPS.
@lisp
(service nginx-service-type
         (nginx-configuration
           (server-blocks
             (list (nginx-server-configuration
                     (server-name '("www.example.com"))
                     (root "/srv/http/www.example.com"))))))
@end lisp

@item @code{upstream-blocks} (predeterminados: @code{'()})
Una lista de @dfn{bloques upstream} creada en el archivo de configuración
generado, los elementos deben ser del tipo
@code{<nginx-upstream-configuration>}.

La configuración de proveedores a través de @code{upstream-blocks} puede ser
útil al combinarse con @code{location} en los registros
@code{<nginx-server-configuration>}. El siguiente ejemplo crea la
configuración de un servidor con una configuración de ruta, que hará de
intermediaria en las peticiones a la configuración de proveedores, que
delegarán las peticiones en dos servidores.

@lisp
(service
  nginx-service-type
  (nginx-configuration
    (server-blocks
      (list (nginx-server-configuration
              (server-name '("www.example.com"))
              (root "/srv/http/www.example.com")
              (locations
                (list
                  (nginx-location-configuration
                  (uri "/ruta1")
                  (body '("proxy_pass http://servidor-proxy;"))))))))
    (upstream-blocks
      (list (nginx-upstream-configuration
              (name "servidor-proxy")
              (servers (list "servidor1.example.com"
                             "servidor2.example.com")))))))
@end lisp

@item @code{file} (predeterminado: @code{#f})
Si se proporciona un archivo de configuración con @var{file}, se usará este,
en vez de generar un archivo de configuración a partir de los parámetros
@code{log-directory}, @code{run-directory}, @code{server-blocks} y
@code{upstream-blocks} proporcionados. Para conseguir un funcionamiento
adecuado, estos parámetros deben corresponder con el contenido de
@var{file}, lo que asegura que los directorios se hayan creado durante la
activación del servicio.

Esto puede ser útil si ya dispone de un archivo de configuración, o no es
posible hacer lo que necesita con el resto de opciones del registro
nginx-configuration.

@item @code{server-names-hash-bucket-size} (predeterminado: @code{#f})
Tamaño del cubo para las tablas hash de los nombres de servidor, cuyo valor
predeterminado es @code{#f} para que se use el tamaño de la línea de caché
de los procesadores.

@item @code{server-names-hash-bucket-max-size} (predeterminado: @code{#f})
Tamaño máximo del cubo para las tablas hash de nombres de servidor.

@item @code{modules} (predeterminados: @code{'()})
Lista de módulos dinámicos de nginx cargados. Debe ser una lista de nombres
de archivo de módulos cargables, como en este ejemplo:

@lisp
(modules
 (list
  (file-append nginx-accept-language-module "\
/etc/nginx/modules/ngx_http_accept_language_module.so")
  (file-append nginx-lua-module "\
/etc/nginx/modules/ngx_http_lua_module.so")))
@end lisp

@item @code{lua-package-path} (predeterminada: @code{'()})
Lista de paquetes de lua para nginx cargados. Debe ser una lista de nombres
de archivo de módulos cargables, como en este ejemplo:

@lisp
(lua-package-path (list lua-resty-core
                        lua-resty-lrucache
                        lua-resty-signal
                        lua-tablepool
                        lua-resty-shell))
@end lisp

@item @code{lua-package-cpath} (predeterminada: @code{'()})
Lista de paquetes C de lua para nginx cargados. Debe ser una lista de
nombres de archivo de módulos cargables, como en este ejemplo:

@lisp
(lua-package-cpath (list lua-resty-signal))
@end lisp

@item @code{global-directives} (predeterminadas: @code{'((events . ()))})
Lista asociativa de directivas globales para el nivel superior de la
configuración de nginx. Los valores en sí mismos pueden ser listas
asociativas.

@lisp
(global-directives
 `((worker_processes . 16)
   (pcre_jit . on)
   (events . ((worker_connections . 1024)))))
@end lisp

@item @code{extra-content} (predeterminado: @code{""})
Contenido adicional para el bloque @code{http}. Debe ser una cadena o una
expresión-G que evalúe a una cadena.

@end table
@end deffn

@anchor{nginx-server-configuration}
@deftp {Tipo de datos} nginx-server-configuration
Tipo de datos que representa la configuración de un bloque de servidor
nginx. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{listen} (predeterminadas: @code{'("80" "443 ssl")})
Cada directiva @code{listen} establece la dirección y el puerto para IP, o
la ruta para un socket de dominio de UNIX sobre el que el servidor acepta
peticiones. Se puede especificar tanto dirección y puerto como únicamente la
dirección o únicamente el puerto. Una dirección puede ser también un nombre
de máquina, por ejemplo:

@lisp
'("127.0.0.1:8000" "127.0.0.1" "8000" "*:8000" "localhost:8000")
@end lisp

@item @code{server-name} (predeterminados: @code{(list 'default)})
Una lista de nombres de servidor que este servidor
representa. @code{'default} representa el servidor predeterminado para
conexiones que no correspondan a otro servidor.

@item @code{root} (predeterminada: @code{"/srv/http"})
Raíz del sitio web que nginx proporcionará.

@item @code{locations} (predeterminado: @code{'()})
Una lista de registros @dfn{nginx-location-configuration} o
@dfn{nginx-named-location-configuration} usados dentro de este bloque de
servidor.

@item @code{index} (predeterminado: @code{(list "index.html")})
Archivos de índice buscados cuando los clientes solicitan un directorio. Si
no se encuentra ninguno, Nginx enviará la lista de archivos del directorio.

@item @code{try-files} (predeterminado: @code{'()})
Una lista de archivos cuya existencia se comprueba en el orden
especificado. @code{nginx} usará el primer archivo que encuentre para
procesar la petición.

@item @code{ssl-certificate} (predeterminado: @code{#f})
Lugar donde se encuentra el certificado para conexiones seguras. Proporcione
@code{#f} si no dispone de un certificado o no desea usar HTTPS.

@item @code{ssl-certificate-key} (predeterminado: @code{#f})
Lugar donde se encuentra la clave privada para conexiones
seguras. Proporcione @code{#f} si no dispone de una clave o no desea usar
HTTPS.

@item @code{server-tokens?} (predeterminado: @code{#f})
Determina si el servidor debe añadir su configuración a las respuestas.

@item @code{raw-content} (predeterminado: @code{'()})
Una lista de líneas que se añadirán literalmente al bloque del servidor.

@end table
@end deftp

@deftp {Tipo de datos} nginx-upstream-configuration
Tipo de datos que representa la configuración de un bloque @code{upstream}
de nginx. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{name}
Nombre para este grupo de servidores.

@item @code{servers}
Especifica las direcciones de los servidores en el grupo. Las direcciones se
pueden proporcionar mediante direcciones IP (por ejemplo @samp{127.0.0.1}),
nombres de dominio (por ejemplo @samp{maquina1.example.com}) o rutas de
socket de UNIX mediante el prefijo @samp{unix:}. El puerto predeterminado
para las direcciones IP o nombres de dominio es el 80, y se puede
proporcionar un puerto de manera explícita.

@item @code{extra-content}
A string or list of strings to add to the upstream block.

@end table
@end deftp

@deftp {Tipo de datos} nginx-location-configuration
Tipo de datos que representa la configuración de un bloque @code{location}
de nginx. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{uri}
URI a la que corresponde este bloque de location.

@anchor{cuerpo de nginx-location-configuration}
@item @code{body}
Body of the location block, specified as a list of strings.  This can
contain many configuration directives.  For example, to pass requests to a
upstream server group defined using an @code{nginx-upstream-configuration}
block, the following directive would be specified in the body @samp{(list
"proxy_pass http://upstream-name;")}.

@end table
@end deftp

@deftp {Tipo de datos} nginx-named-location-configuration
Tipo de datos que representa la configuración de un bloque de localización
con nombre de nginx. Los bloques de localizaciones con nombre se usan para
la redirección de peticiones, y no se usan para el procesamiento regular de
peticiones. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{name}
Nombre que identifica este bloque de dirección @code{location}.

@item @code{body}
@xref{cuerpo de nginx-location-configuration}, como el cuerpo de los bloques
de localizaciones con nombre puede usarse de manera similar al @code{cuerpo
de nginx-location-configuration}. Una restricción es que el cuerpo de una
localización con nombre no puede contener bloques de localizaciones.

@end table
@end deftp

@subsubheading Caché Varnish
@cindex Varnish
Varnish es un servidor de caché rápida que se coloca entre aplicaciones web
y usuarios finales. Redirige peticiones a los clientes y almacena en caché
las URL a las que se accede de manera que múltiples peticiones al mismo
recurso únicamente creen una petición al motor.

@defvr {Variable Scheme} varnish-service-type
Tipo de servicio para el daemon Varnish.
@end defvr

@deftp {Tipo de datos} varnish-configuration
Tipo de datos que representa la configuración del servicio
@code{varnish}. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{package} (predeterminado: @code{varnish})
El paquete Varnish usado.

@item @code{name} (predeterminado: @code{"default"})
Un nombre para esta instancia de Varnish. Varnish creará un directorio en
@file{/var/varnish} con este nombre y mantendrá allí los archivos
temporales. Si el nombre comienza con una barra, se interpreta como un
nombre absoluto de directorio.

Proporcione el parámetro @code{-n} a otros programas de Varnish para que se
conecten a la instancia de dicho nombre, por ejemplo @command{varnishncsa -n
default}.

@item @code{backend} (predeterminado: @code{"localhost:8080"})
Motor usado. Esta opción no tiene efecto si se usa @code{vcl}.

@item @code{vcl} (predeterminado: #f)
El programa @dfn{VCL} (lenguaje de configuración de Varnish) ejecutado. Si
se proporciona @code{#f}, Varnish llevará a cabo las redirecciones al motor
(@code{backend}) usando la configuración predeterminada. En otro caso debe
ser un objeto ``tipo-archivo'' con sintaxis válida para VCL.

@c Varnish does not support HTTPS, so keep this URL to avoid confusion.
Por ejemplo, para proporcionar un espejo de
@url{https://www.gnu.org,www.gnu.org} con VCL podría escribir algo parecido
a esto:

@lisp
(define %espejo-gnu
  (plain-file "gnu.vcl"
              "vcl 4.1;
backend gnu @{ .host = \"www.gnu.org\"; @}"))

(operating-system
  ;; @dots{}
  (services (cons (service varnish-service-type
                           (varnish-configuration
                            (listen '(":80"))
                            (vcl %espejo-gnu)))
                  %base-services)))
@end lisp

La configuración de una instancia de Varnish ya en ejecución se puede
inspeccionar y cambiar mediante el uso de la orden @command{varnishadm}.

Consulte la @url{https://varnish-cache.org/docs/,guía de usuaria de Varnish}
y @url{https://book.varnish-software.com/4.0/,el libro de Varnish} para
obtener la documentación completa de Varnish y su lenguaje de configuración.

@item @code{listen} (predeterminada: @code{'("localhost:80")})
Lista de direcciones en las que Varnish escucha.

@item @code{storage} (predeterminado: @code{'("malloc,128m")})
Lista de motores de almacenamiento que estarán disponibles en VCL.

@item @code{parameters} (predeterminados: @code{'()})
Lista de parámetros de tiempo de ejecución con la forma @code{'(("parámetro"
. "valor"))}.

@item @code{extra-options} (predeterminadas: @code{'()})
Parámetros adicionales a proporcional al proceso @command{varnishd}.

@end table
@end deftp

@subsubheading Patchwork
@cindex Patchwork
Patchwork es un sistema de seguimiento de parches. Puede recolectar parches
enviados a listas de correo y mostrarlos en una interfaz web.

@defvr {Variable Scheme} patchwork-service-type
Tipo de servicio para Patchwork.
@end defvr

El siguiente ejemplo muestra un servicio mínimo para Patchwork, para el
dominio @code{patchwork.example.com}.

@lisp
(service patchwork-service-type
         (patchwork-configuration
          (domain "patchwork.example.com")
          (settings-module
           (patchwork-settings-module
            (allowed-hosts (list domain))
            (default-from-email "patchwork@@patchwork.example.com")))
          (getmail-retriever-config
           (getmail-retriever-configuration
            (type "SimpleIMAPSSLRetriever")
            (server "imap.example.com")
            (port 993)
            (username "patchwork")
            (password-command
             (list (file-append coreutils "/bin/cat")
                   "/etc/getmail-patchwork-imap-password"))
            (extra-parameters
            '((mailboxes . ("Parches"))))))))

@end lisp

Existen tres registros para la configuración del servicio de Patchwork. El
registro @code{<patchwork-configuration>} está relacionado con la
configuración de Patchwork dentro del servicio HTTPD.

El campo @code{settings-module} dentro del registro
@code{<patchwork-configuration>} puede rellenarse con un registro
@code{<patchwork-settings-module>}, que describe un módulo de configuración
generado dentro del almacén de Guix.

En el campo @code{database-configuration} dentro del registro
@code{<patchwork-settings-module>}, debe usarse
@code{<patchwork-database-configuration>}.

@deftp {Tipo de datos} patchwork-configuration
Tipo de datos que representa la configuración del servicio Patchwok. Este
tipo tiene los siguientes parámetros:

@table @asis
@item @code{patchwork} (predeterminado: @code{patchwork})
El paquete Patchwork usado.

@item @code{domain}
Dominio usado por Patchwork, se usa en el servicio HTTPD como ``virtual
host''.

@item @code{settings-module}
The settings module to use for Patchwork.  As a Django application,
Patchwork is configured with a Python module containing the settings.  This
can either be an instance of the @code{<patchwork-settings-module>} record,
any other record that represents the settings in the store, or a directory
outside of the store.

@item @code{static-path}  (predeterminada: @code{"/static/"})
Ruta bajo la cual el servicio HTTPD proporciona archivos estáticos.

@item @code{getmail-retriever-config}
The getmail-retriever-configuration record value to use with Patchwork.
Getmail will be configured with this value, the messages will be delivered
to Patchwork.

@end table
@end deftp

@deftp {Tipo de datos} patchwork-settings-module
Tipo de datos que representa un módulo de configuración de
Patchwork. Algunas de estas opciones están directamente relacionadas con
Patchwork, pero otras son relativas a Django, el entorno web usado
Patchwork, o la biblioteca Django Rest Framework. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{database-configuration} (predeterminada: @code{(patchwork-database-configuration)})
La configuración de la conexión a la base de datos usada para
Patchwork. Véase el tipo de registro
@code{<patchwork-database-configuration>} para más información.

@item @code{secret-key-file} (predeterminado: @code{"/etc/patchwork/django-secret-key"})
Patchwork, como una aplicación web Django, usa una clave secreta para firmar
criptográficamente valores. Este archivo debe contener un valor único e
impredecible.

Si este archivo no existe, el servicio de Shepherd patchwork-setup lo creará
y rellenará con un valor aleatorio.

Esta configuración está relacionada con Django.

@item @code{allowed-hosts}
A list of valid hosts for this Patchwork service.  This should at least
include the domain specified in the @code{<patchwork-configuration>} record.

Esta es una opción de configuración de Django.

@item @code{default-from-email}
La dirección de correo desde de la que Patchwork debe enviar el correo de
manera predeterminada.

Esta es una opción de configuración de Patchwork.

@item @code{static-url} (predeterminada: @code{#f})
The URL to use when serving static assets.  It can be part of a URL, or a
full URL, but must end in a @code{/}.

Si se usa el valor predeterminado, se usará el valor de @code{static-path}
del registro @code{<patchwork-configuration>}.

Esta es una opción de configuración de Django.

@item @code{admins} (predeterminadas: @code{'()})
Direcciones de correo electrónico a las que enviar los detalles de los
errores que ocurran. Cada valor debe ser una lista que contenga dos
elementos, el nombre y la dirección de correo electrónico en dicho orden.

Esta es una opción de configuración de Django.

@item @code{debug?} (predeterminado: @code{#f})
Determina si se ejecuta Patchwork en modo de depuración. Si se proporciona
@code{#t}, se mostrarán mensajes de error detallados.

Esta es una opción de configuración de Django.

@item @code{enable-rest-api?} (predeterminado: @code{#t})
Determina si se activa el API REST de Patchwork.

Esta es una opción de configuración de Patchwork.

@item @code{enable-xmlrpc?} (predeterminado: @code{#t})
Determina si se activa el API XML RPC.

Esta es una opción de configuración de Patchwork.

@item @code{force-https-links?} (predeterminado: @code{#t})
Determina si se usan enlaces HTTPS en las páginas de Patchwork.

Esta es una opción de configuración de Patchwork.

@item @code{extra-settings} (predeterminado: @code{""})
Código adicional que colocar al final del módulo de configuración de
Patchwork.

@end table
@end deftp

@deftp {Tipo de datos} patchwork-database-configuration
Tipo de datos que representa la configuración de base de datos de Patchwork.

@table @asis
@item @code{engine} (predeterminado: @code{"django.db.backends.postgresql_psycopg2"})
Motor de base de datos usado.

@item @code{name} (predeterminado: @code{"patchwork"})
Nombre de la base de datos usada.

@item @code{user} (predeterminada: @code{"httpd"})
Usuaria usada para la conexión a la base de datos.

@item @code{password} (predeterminada: @code{""})
Contraseña usada para la conexión a la base de datos.

@item @code{host} (predeterminada: @code{""})
Máquina usada para la conexión a la base de datos.

@item @code{port} (predeterminado: @code{""})
Puerto en el que se conecta a la base de datos.

@end table
@end deftp

@subsubheading Mumi

@cindex Mumi, interfaz web de Debbugs
@cindex Debbugs, interfaz web Mumi
@uref{https://git.elephly.net/gitweb.cgi?p=software/mumi.git, Mumi} es una
interfaz web al gestor de incidencias Debbugs, de manera predeterminada
apunta a @uref{https://bugs.gnu.org, la instancia de GNU}.  Mumi es un
servidor web, pero también obtiene e indexa los correos recibidos de
Debbugs.

@defvr {Variable Scheme} mumi-service-type
El tipo de servicio para Mumi.
@end defvr

@deftp {Tipo de datos} mumi-configuration
Tipo de datos que representa la configuración del servicio Mumi. Este tipo
tiene los siguientes campos:

@table @asis
@item @code{mumi} (predeterminado: @code{mumi})
El paquete Mumi usado.

@item @code{mailer?} (predeterminado: @code{#true})
Determina si se activa o desactiva el componente de correo @code{mailer}.

@item @code{mumi-configuration-sender}
La dirección de correo usada como remitente para los comentarios.

@item @code{mumi-configuration-smtp}
Una URI para las opciones de configuración de SMTP de Mailutils. Puede ser
algo parecido a @code{sendmail:///ruta/de/bin/msmtp} o cualquier otra URI
implementada por Mailutils.  @xref{SMTP Mailboxes, SMTP Mailboxes,,
mailutils, GNU@tie{}Mailutils}.

@end table
@end deftp


@subsubheading FastCGI
@cindex fastcgi
@cindex fcgiwrap
FastCGI es una interfaz entre la presentación (front-end) y el motor
(back-end) de un servicio web. Es en cierto modo una característica antigua;
los nuevos servicios web generalmente únicamente se comunican con HTTP entre
ambas partes. No obstante, existe cierto número de servicios de motor como
PHP o el acceso HTTP optimizado para repositorios Git que usan FastCGI, por
lo que debemos incluirlo en Guix.

Para usar FastCGI debe configurar el servidor web de entrada@footnote{NdT:
Front-end en inglés.} (por ejemplo, ngnix) para delegar un subconjunto de
sus peticiones al motor fastcgi, que escucha en un puerto TCP local o en un
socket de UNIX. Existe un programa de intermediación llamado @code{fcgiwrap}
que se posiciona entre el proceso del motor y el servidor web. El servidor
indica el programa del motor usado, proporcionando dicha información al
proceso @code{fcgiwrap}.

@defvr {Variable Scheme} fcgiwrap-service-type
El tipo de servicio para la pasarela FastCGI @code{fcgiwrap}.
@end defvr

@deftp {Tipo de datos} fcgiwrap-configuration
Tipo de datos que representa la configuración del servicio
@code{fcgiwrap}. Este tipo tiene los siguientes parámetros:
@table @asis
@item @code{package} (predeterminado: @code{fcgiwrap})
El paquete fcgiwrap usado.

@item @code{socket} (predeterminado: @code{tcp:127.0.0.1:9000})
El socket donde el proceso @code{fcgiwrap} deba escuchar, como una cadena.
Los valores adecuados para @var{socket} socket incluyen
@code{unix:@var{/ruta/al/socket/unix}},
@code{tcp:@var{dirección.ip.con.puntos}:@var{puerto}} and
@code{tcp6:[@var{dirección_ipv6}]:puerto}.

@item @code{user} (predeterminado: @code{fcgiwrap})
@itemx @code{group} (predeterminado: @code{fcgiwrap})
Los nombres de usuaria y grupo, como cadenas, con los que se ejecutará el
proceso @code{fcgiwrap}. El servicio @code{fastcgi} se asegura, en caso de
solicitar específicamente el uso de nombres de usuaria o grupo
@code{fcgiwrap}, que la usuaria y/o grupo correspondientes se encuentren
presentes en el sistema.

Es posible configurar un servicio web proporcionado por FastCGI para que el
servidor de fachada proporcione la información de identificación HTTP al
motor, y para permitir que @code{fcgiwrap} se ejecute en el proceso del
motor como la usuaria local correspondiente. Para activar esta funcionalidad
en el motor, ejecute @code{fcgiwrap} mediante la usuaria y grupo
@code{root}. Tenga en cuenta de que esta funcionalidad debe configurarse del
mismo modo en el servidor de fachada.
@end table
@end deftp

@anchor{PHP-FPM}
@subsubheading PHP-FPM
@cindex php-fpm
PHP-FPM (FastCGI Process Manager) es una implementación alternativa de
FastCGI en PHP con algunas características adicionales útiles para sitios de
cualquier tamaño.

Estas características incluyen:
@itemize @bullet
@item Lanzamiento adaptativo de procesos
@item Estadísticas básicas (similares a mod_status de Apache)
@item Gestión avanzada de procesos con parada/arranque coordinados
@item Capacidad de iniciar procesos de trbajo con diferentes uid/gid/chroor/entorno
y diferentes php.ini (reemplaza a safe_mode)
@item Registro a través de la salida estándar y de error
@item Reinicio de emergencia en caso de destrucción accidental de la caché de opcode
@item Posibilidad de subida acelerada
@item Posibilidad de un "slowlog"
@item Mejoras a FastCGI, como fastcgi_finish_request() -
una función especial para terminar una petición y enviar todos los datos
mientras que se continua haciendo una tarea de alto consumo de tiempo
(conversión de datos audiovisuales, procesamiento de estadísticas,
etcétera).
@end itemize
...@: y muchas más.

@defvr {Variable Scheme} php-fpm-service-type
Un tipo de servicio para @code{php-fpm}.
@end defvr

@deftp {Tipo de datos} php-fpm-configuration
Tipo de datos para la configuración del servicio php-fpm.
@table @asis
@item @code{php} (predeterminado: @code{php})
El paquete php usado.
@item @code{socket} (predeterminado: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.sock")})
La dirección desde la que FastCGI acepta peticiones. Las sintaxis válidas
son:
@table @asis
@item @code{"dir.ecc.ión.ip:puerto"}
Escucha con un socket TCP en la dirección especificada en un puerto
específico.
@item @code{"puerto"}
Escucha en un socket TCP en todas las direcciones sobre un puerto
específico.
@item @code{"/ruta/a/socket/unix"}
Escucha en un socket Unix.
@end table

@item @code{user} (predeterminada: @code{php-fpm})
Usuaria que poseerá los procesos de trabajo de php.
@item @code{group} (predeterminado: @code{php-fpm})
Grupo de los procesos de trabajo.
@item @code{socket-user} (predeterminado: @code{php-fpm})
Usuaria que puede comunicarse con el socket de php-fpm.
@item @code{socket-group} (predeterminado: @code{nginx})
Grupo que puede comunicarse con el socket de php-fpm.
@item @code{pid-file} (predeterminado: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.pid")})
El identificador de proceso del proceso de php-fpm se escribe en este
archivo cuando se ha iniciado el servicio.
@item @code{log-file} (predeterminado: @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.log")})
Registro del proceso maestro de php-fpm.
@item @code{process-manager} (predeterminado: @code{(php-fpm-dynamic-process-manager-configuration)})
Configuración detallada para el gestor de procesos php-fpm. Debe ser uno de
los siguientes tipos:
@table @asis
@item @code{<php-fpm-dynamic-process-manager-configuration>}
@item @code{<php-fpm-static-process-manager-configuration>}
@item @code{<php-fpm-on-demand-process-manager-configuration>}
@end table
@item @code{display-errors} (predeterminado @code{#f})
Determina si los errores y avisos de php deben enviarse a los clientes para
que se muestren en sus navegadores. Esto es útil para la programación local
con php, pero un riesgo para la seguridad de sitios públicos, ya que los
mensajes de error pueden revelar contraseñas y datos personales.
@item @code{timezone} (predeterminado: @code{#f})
Especifica el parámetro @code{php_admin_value[date.timezone]}.
@item @code{workers-logfile} (predeterminado @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.www.log")})
Este archivo registrará las salidas por @code{stderr} de los procesos de
trabajo de php. Puede proporcionarse @code{#f} para desactivar el registro.
@item @code{file} (predeterminado @code{#f})
Sustituye opcionalmente la configuración al completo. Puede usar la función
@code{mixed-text-file} o una ruta absoluta de un archivo para hacerlo.
@item @code{php-ini-file} (predeterminado: @code{#f})
Sustituye opcionalmente la configuración predeterminada de php. Puede ser
cualquier objeto ``tipo-archivo'' (@pxref{Expresiones-G, file-like
objects}). Puede usar la función @code{mixed-text-file} o una ruta absoluta
de un archivo para hacerlo.

Para el desarrollo local es útil proporcionar valores mayores para los
plazos y límites de memoria de los procesos php lanzados. Esto puede
obtenerse con el siguiente fragmento de la configuración de sistema
operativo:
@lisp
(define %php-ini-local
  (plain-file "php.ini"
              "memory_limit = 2G
max_execution_time = 1800"))

(operating-system
  ;; @dots{}
  (services (cons (service php-fpm-service-type
                           (php-fpm-configuration
                            (php-ini-file %php-ini-local)))
                  %base-services)))
@end lisp

Consulte las @url{https://www.php.net/manual/en/ini.core.php,directivas
principales de php.ini} para obtener una documentación extensa de las
directivas aceptables en el archivo @file{php.ini}.
@end table
@end deftp

@deftp {Tipo de datos} php-fpm-dynamic-process-manager-configuration
Data Type for the @code{dynamic} php-fpm process manager.  With the
@code{dynamic} process manager, spare worker processes are kept around based
on its configured limits.
@table @asis
@item @code{max-children} (predeterminados: @code{5})
Número máximo de procesos de trabajo.
@item @code{start-servers} (predeterminados: @code{2})
Cuantos procesos de trabajo deben ejecutarse al inicio.
@item @code{min-spare-servers} (predeterminado: @code{1})
Cuantos procesos de trabajo deben mantenerse disponibles como mínimo.
@item @code{max-spare-servers} (predeterminados: @code{3})
Cuantos procesos de trabajo deben mantenerse disponibles como máximo.
@end table
@end deftp

@deftp {Tipo de datos} php-fpm-static-process-manager-configuration
Tipo de datos para el gestor de procesos @code{static} de php-fpm. Con el
gestor de procesos @code{static}, se crea un número fijo de procesos de
trabajo.
@table @asis
@item @code{max-children} (predeterminados: @code{5})
Número máximo de procesos de trabajo.
@end table
@end deftp

@deftp {Tipo de datos} php-fpm-on-demand-process-manager-configuration
Tipo de datos para el gestor de procesos @code{on-demand} de php-fpm. Con el
gestor de procesos @code{on-demand}, se crean procesos de trabajo únicamente
cuando se reciben peticiones.
@table @asis
@item @code{max-children} (predeterminados: @code{5})
Número máximo de procesos de trabajo.
@item @code{process-idle-timeout} (predeterminado: @code{10})
El tiempo en segundos tras el cual un proceso sin peticiones será eliminado.
@end table
@end deftp


@deffn {Procedimiento Scheme} nginx-php-location @
       [#:nginx-package nginx] @ [socket (string-append "/var/run/php" @
(version-major (package-version php)) @ "-fpm.sock")]
Función auxiliar para añadir php a una configuración
@code{nginx-server-configuration} rápidamente.
@end deffn

Una configuración simple de servicios para nginx con php puede ser más o
menos así:
@lisp
(services (cons* (service dhcp-client-service-type)
                 (service php-fpm-service-type)
                 (service nginx-service-type
                          (nginx-server-configuration
                           (server-name '("example.com"))
                           (root "/srv/http/")
                           (locations
                            (list (nginx-php-location)))
                           (listen '("80"))
                           (ssl-certificate #f)
                           (ssl-certificate-key #f)))
                 %base-services))
@end lisp

@cindex cat-avatar-generator
El generadores de avatares de gato es un servicio simple para demostrar el
uso de php-fpm en @code{Nginx}. Se usa para generar un avatar de gato desde
una semilla, por ejemplo el hash de la dirección de correo de la usuaria.

@deffn {Procedimiento Scheme} cat-avatar-generator-service @
       [#:cache-dir "/var/cache/cat-avatar-generator"] @ [#:package
cat-avatar-generator] @ [#:configuration (nginx-server-configuration)]
Devuelve una configuración de nginx-server-configuration que hereda de
@code{configuration}.  Extiende la configuración de nginx para añadir un
bloque de servidor que proporciona @code{package}, una versión de
cat-avatar-generator. Durante su ejecución, cat-avatar-generator podrá usar
@code{cache-dir} como su directorio de caché.
@end deffn

Una configuración simple para cat-avatar-generator puede ser más o menos
así:
@lisp
(services (cons* (cat-avatar-generator-service
                  #:configuration
                  (nginx-server-configuration
                    (server-name '("example.com"))))
                 ...
                 %base-services))
@end lisp

@subsubheading Hpcguix-web

@cindex hpcguix-web
El programa @uref{https://github.com/UMCUGenetics/hpcguix-web/, hpcguix-web}
es una interfaz web personalizable para buscar paquetes de Guix, diseñado
inicialmente para usuarias de clusters de computación de alto rendimiento
(HPC).

@defvr {Variable Scheme} hpcguix-web-service-type
El tipo de servicio para @code{hpcguix-web}.
@end defvr

@deftp {Tipo de datos} hpcguix-web-configuration
El tipo de datos para la configuración del servicio hpcguix-web.

@table @asis
@item @code{specs}
Una expresión-G (@pxref{Expresiones-G}) que especifica la configuración del
servicio hpcguix-web. Los elementos principales en esta especificación son:

@table @asis
@item @code{title-prefix} (predeterminado: @code{"hpcguix | "})
El prefijo del título de la página.

@item @code{guix-command} (predeterminada: @code{"guix"})
La orden @command{guix}.

@item @code{package-filter-proc} (predeterminado: @code{(const #t)})
Un procedimiento que especifica cómo filtrar los paquetes mostrados.

@item @code{package-page-extension-proc} (predeterminado: @code{(const '())})
Paquete de extensión para @code{hpcguix-web}.

@item @code{menu} (predeterminadas: @code{'()})
Entradas adicionales en el menú de la página.

@item @code{channels} (predeterminados: @code{%default-channels})
Lista de canales desde los que se construye la lista de paquetes
(@pxref{Canales}).

@item @code{package-list-expiration} (predeterminado: @code{(* 12 3600)})
El tiempo de expiración, en segundos, tras el cual la lista de paquetes se
reconstruye desde las últimas instancias de los canales proporcionados.
@end table

Véase el repositorio de hpcguix-web para un
@uref{https://github.com/UMCUGenetics/hpcguix-web/blob/master/hpcweb-configuration.scm,
ejemplo completo}.

@item @code{package} (predeterminado: @code{hpcguix-web})
El paquete hpcguix-web usado.

@item @code{address} (default: @code{"127.0.0.1"})
The IP address to listen to.

@item @code{port} (default: @code{5000})
The port number to listen to.
@end table
@end deftp

Una declaración típica del servicio hpcguix-web es más o menos así:

@lisp
(service hpcguix-web-service-type
         (hpcguix-web-configuration
          (specs
           #~(define site-config
               (hpcweb-configuration
                (title-prefix "Guix-HPC - ")
                (menu '(("/about" "ABOUT"))))))))
@end lisp

@quotation Nota
El servicio hpcguix-web actualiza periódicamente la lista de paquetes que
publica obteniendo canales con Git. Para ello, necesita acceder a
certificados X.509 de manera que pueda validar los servidores Git durante la
comunicación con HTTPS, y asume que @file{/etc/ssl/certs} contiene dichos
certificados.

Por lo tanto, asegúrese de añadir @code{nss-certs} u otro paquete de
certificados al campo @code{packages} de su configuración. @ref{Certificados X.509}, para más información sobre certificados X.509.
@end quotation

@subsubheading gmnisrv

@cindex gmnisrv
El programa @uref{https://git.sr.ht/~sircmpwn/gmnisrv, gmnisrv} es un
servidor simple del protocolo @uref{https://gemini.circumlunar.space/,
Gemini}.

@deffn {Variable Scheme} gmnisrv-service-type
Es el tipo del servicio gmnisrv, cuyo valor debe ser un objeto
@code{gmniserv-configuration} como en este ejemplo:

@lisp
(service gmnisrv-service-type
         (gmnisrv-configuration
           (config-file (local-file "./mi-gmnisrv.ini"))))
@end lisp
@end deffn

@deftp {Tipo de datos} gmnisrv-configuration
Tipo de datos que representa la configuración de gmnisrv.

@table @asis
@item @code{package} (predeterminado: @var{gmnisrv})
El objeto paquete del servidor gmnisrv.

@item @code{config-file} (predeterminado: @code{%default-gmnisrv-config-file})
Objeto tipo-archivo del archivo de configuración de gmnisrv usado. La
configuración predeterminada escucha en el puerto 1965 y proporciona
archivos desde @file{/srv/gemini}. Los certificados se almacenan en
@file{/var/lib/gemini/certs}. Puede ejecutar las ordenes @command{man
gmnisrv} y @command{man gmnisrv.ini} para obtener más información.

@end table
@end deftp

@subsubheading Agate

@cindex agate
The @uref{gemini://qwertqwefsday.eu/agate.gmi, Agate}
(@uref{https://github.com/mbrubeck/agate, GitHub page over HTTPS})  program
is a simple @uref{https://gemini.circumlunar.space/, Gemini} protocol server
written in Rust.

@deffn {Scheme Variable} agate-service-type
This is the type of the agate service, whose value should be an
@code{agate-service-type} object, as in this example:

@lisp
(service agate-service-type
	 (agate-configuration
	   (content "/srv/gemini")
	   (cert "/srv/cert.pem")
	   (key "/srv/key.rsa")))
@end lisp

The example above represents the minimal tweaking necessary to get Agate up
and running.  Specifying the path to the certificate and key is always
necessary, as the Gemini protocol requires TLS by default.

To obtain a certificate and a key, you could, for example, use OpenSSL,
running a command similar to the following example:

@example
openssl req -x509 -newkey rsa:4096 -keyout key.rsa -out cert.pem \
    -days 3650 -nodes -subj "/CN=example.com"
@end example

Of course, you'll have to replace @i{example.com} with your own domain name,
and then point the Agate configuration towards the path of the generated key
and certificate.

@end deffn

@deftp {Data Type} agate-configuration
Data type representing the configuration of Agate.

@table @asis
@item @code{package} (default: @code{agate})
The package object of the Agate server.

@item @code{content} (default: @file{"/srv/gemini"})
The directory from which Agate will serve files.

@item @code{cert} (default: @code{#f})
The path to the TLS certificate PEM file to be used for encrypted
connections.  Must be filled in with a value from the user.

@item @code{key} (predeterminada: @code{#f})
The path to the PKCS8 private key file to be used for encrypted
connections.  Must be filled in with a value from the user.

@item @code{addr} (default: @code{'("0.0.0.0:1965" "[::]:1965")})
A list of the addresses to listen on.

@item @code{hostname} (predeterminado: @code{#f})
The domain name of this Gemini server.  Optional.

@item @code{lang} (default: @code{#f})
RFC 4646 language code(s) for text/gemini documents.  Optional.

@item @code{silent?} (default: @code{#f})
Set to @code{#t} to disable logging output.

@item @code{serve-secret?} (default: @code{#f})
Set to @code{#t} to serve secret files (files/directories starting with a
dot).

@item @code{log-ip?} (default: @code{#t})
Whether or not to output IP addresses when logging.

@item @code{user} (default: @code{"agate"})
Owner of the @code{agate} process.

@item @code{group} (default: @code{"agate"})
Owner's group of the @code{agate} process.

@item @code{log-file} (default: @file{"/var/log/agate.log"})
The file which should store the logging output of Agate.

@end table
@end deftp

@node Servicios de certificados
@subsection Servicios de certificados

@cindex Web
@cindex HTTP, HTTPS
@cindex Let's Encrypt
@cindex certificados TLS
El módulo @code{(gnu services certbot)} proporciona un servicio para la
obtención automática de un certificado TLS válido de la autoridad de
certificación Let's Encrypt. Estos certificados pueden usarse para
proporcionar contenido de forma segura sobre HTTPS u otros protocolos
basados en TLS, con el conocimiento de que el cliente podrá verificar la
autenticidad del servidor.

@url{https://letsencrypt.org/, Let's Encrypt} provides the @code{certbot}
tool to automate the certification process.  This tool first securely
generates a key on the server.  It then makes a request to the Let's Encrypt
certificate authority (CA) to sign the key.  The CA checks that the request
originates from the host in question by using a challenge-response protocol,
requiring the server to provide its response over HTTP@.  If that protocol
completes successfully, the CA signs the key, resulting in a certificate.
That certificate is valid for a limited period of time, and therefore to
continue to provide TLS services, the server needs to periodically ask the
CA to renew its signature.

El servicio certbot automatiza este proceso: la generación inicial de la
clave, la petición inicial de certificación al servicio Let's Encrypt, la
integración del desafío/respuesta en el servidor web, la escritura del
certificado en disco, las renovaciones periódicas automáticas y el
despliegue de tareas asociadas con la renovación (por ejemplo la recarga de
servicios y la copia de claves con diferentes permisos).

Certbot se ejecuta dos veces al día, en un minuto aleatorio dentro de la
hora. No hará nada hasta que sus certificados estén pendientes de renovación
o sean revocados, pero su ejecución regular propociona a su servicio la
oportunidad de permanecer en línea en caso de que se produzca una revocación
iniciada por Let's Encrypt por alguna razón.

Mediante el uso de este servicio, usted acepta el acuerdo de suscripción
ACME, que se puede encontrar aquí:
@url{https://acme-v01.api.letsencrypt.org/directory}.

@defvr {Variable Scheme} certbot-service-type
Un tipo de servicio para el cliente de Let's Encrypt @code{certbot}. Su
valor debe ser un registro @code{certbot-configuration} como en este
ejemplo:

@lisp
(define %procedimiento-de-despliegue-nginx
  (program-file
   "procedimiento-de-despliegue-nginx"
   #~(let ((pid (call-with-input-file "/var/run/nginx/pid" read)))
       (kill pid SIGHUP))))

(service certbot-service-type
         (certbot-configuration
          (email "foo@@example.net")
          (certificates
           (list
            (certificate-configuration
             (domains '("example.net" "www.example.net"))
             (deploy-hook %procedimiento-de-despliegue-nginx))
            (certificate-configuration
             (domains '("bar.example.net")))))))
@end lisp

Véase a continuación los detalles de @code{certbot-configuration}.
@end defvr

@deftp {Tipo de datos} certbot-configuration
Tipo de datos que representa la configuración del servicio
@code{certbot}. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{package} (predeterminado: @code{certbot})
El paquete certbot usado.

@item @code{webroot} (predeterminado: @code{/var/www})
Directorio desde el que se proporcionan los archivos de desafío/respuesta de
Let's Encrypt.

@item @code{certificates} (predeterminados: @code{()})
Una lista de configuraciones @code{certificates-configuration} para los
cuales se generan certificados y se solicitan firmas. Cada certificado tiene
un nombre (@code{name}) y varios dominios (@code{domains}).

@item @code{email} (predeterminado: @code{#f})
Dirección de correo electrónico opcional usada para el registro y el
contacto de recuperación. Se recomienda que proporcione un valor ya que le
permite recibir importantes notificaciones acerca de la cuenta y los
certificados emitidos.

@item @code{server} (predeterminada: @code{#f})
URL opcional del servidor ACME. Esta configuración cambia el valor
predeterminado de certbot, que es el servidor de Let's Encrypt.

@item @code{rsa-key-size} (predeterminado: @code{2048})
Tamaño de la clave RSA.

@item @code{default-location} (predeterminada: @i{véase a continuación})
La configuración @code{nginx-location-configuration} predeterminada. Debido
a que @code{certbot} necesita proporcionar desafíos y respuestas, necesita
ser capaz de ejecutar un servidor web. Se lleva a cabo extendiendo el
servicio web @code{nginx} con una configuración
@code{nginx-server-configuration} que escucha en los dominios @var{domains}
en el puerto 80, y que contiene una configuración
@code{nginx-location-configuration} para el subespacio de rutas URI
@code{/.well-known/} usado por Let's Encrypt. @xref{Servicios Web}, para más
información sobre estos tipos de datos de configuración de nginx.

Las peticiones a otras rutas URL se compararán contra la dirección
predeterminada @code{default-location}, la cual, en caso de estar presente,
se añade a todas las configuraciones @code{nginx-server-configuration}.

De manera predeterminada, la dirección predeterminada
@code{default-location} emitirá una redirección
@code{http://@var{dominio}/...} a @code{https://@var{dominio}/...}, lo que
le permite definir qué proporcionará en su sitio web a través de
@code{https}.

Proporcione @code{#f} para no emitir una dirección predeterminada.
@end table
@end deftp

@deftp {Tipo de datos} certificate-configuration
Tipo de datos que representa la configuración de un certificado. Este tipo
tiene los siguientes parámetros:

@table @asis
@item @code{name} (predeterminado: @i{vea a continuación})
Este nombre se usa por Certbot para su mantenimiento interno y en las rutas
de archivos; no afecta al contenido del certificado en sí mismo. Para ver
los nombres de certificados, ejecute @code{certbot certificates}.

Su valor predeterminado es el primer dominio proporcionado.

@item @code{domains} (predeterminado: @code{()})
El primer dominio proporcionado será el sujeto del nombre común (CN) del
certificado, y todos los dominios serán nombres alternativos (Subject
Alternative Names) en el certificado.

@item @code{challenge} (predeterminado: @code{#f})
El tipo de desafío que debe ejecutar certbot. Si se especifica @code{#f}, el
valor por omisión es desafío HTTP. Si se especifica un valor, el valor por
omisión es el módulo manual (véase @code{authentication-hook},
@code{cleanup-hook} y la documentación en
@url{https://certbot.eff.org/docs/using.html#hooks}), y concede permiso a
Let's Encrypt para registrar la IP pública de la máquina que realiza la
petición.

@item @code{csr} (default: @code{#f})
File name of Certificate Signing Request (CSR) in DER or PEM format.  If
@code{#f} is specified, this argument will not be passed to certbot.  If a
value is specified, certbot will use it to obtain a certificate, instead of
using a self-generated CSR.  The domain-name(s) mentioned in @code{domains},
must be consistent with the domain-name(s) mentioned in CSR file.

@item @code{authentication-hook} (predeterminado: @code{#t})
Orden ejecutada en un shell una vez por cada desafío de certificado que debe
contestarse. Durante su ejecución, la variable del shell
@code{$CERTBOT_DOMAIN} contiene el dominio que se está validando,
@code{$CERTBOT_VALIDATION} contiene la cadena de validación y
@code{$CERTBOT_TOKEN} contiene el nombre de archivo del recurso solicitado
cuando se realiza el desafío HTTP-01.

@item @code{cleanup-hook} (predeterminado: @code{#f})
Orden ejecutada en un shell una vez por cada desafío de certificado que haya
sido contestado por @code{auth-hook}. Durante su ejecución, las variables
del shell disponibles en el script @code{auth-hook} todavía están
disponibles, y adicionalmente @code{$CERTBOT_AUTH_OUTPUT} contendrá la
salida estándar que produjo @code{auth-hook}.

@item @code{deploy-hook} (predeterminado: @code{#f})
Orden ejecutada en un shell una vez por cada certificado emitido
satisfactoriamente. Durante su ejecución, la variable del shell
@code{$RENEWED_LINEAGE} apuntará al subdirectorio live de configuración (por
ejemplo, @samp{"/etc/letsencrypt/live/example.com"}) que contiene las nuevas
claves y certificados; la variable del shell @code{$RENEWED_DOMAINS}
contendrá una lista delimitada por espacios de certificados de dominio
renovados (por ejemplo, @samp{"example.com www.example.com"}).

@end table
@end deftp

Para cada configuración @code{certificate-configuration}, el certificado se
almacena @code{/etc/letsencrypt/live/@var{name}/fullchain.pem} y la clave se
almacena en @code{/etc/letsencrypt/live/@var{name}/privkey.pem}.
@node Servicios DNS
@subsection Servicios DNS
@cindex DNS (sistema de nombres de dominio)
@cindex sistema de nombres de dominio (DNS)

El módulo @code{(gnu services dns)} proporciona servicios relacionados con
el @dfn{sistema de nombres de dominio} (DNS). Proporciona un servicio de
servidor para el alojamiento de un servidor @emph{autorizado} DNS para
múltiples zonas, esclavo o maestro. Este servicio usa
@uref{https://www.knot-dns.cz/, Knot DNS}. Y también un servidor de caché y
reenvío de DNS para la red local, que usa
@uref{http://www.thekelleys.org.uk/dnsmasq/doc.html, dnsmasq}.

@subsubheading Servicio Knot

Esta es una configuración de ejemplo de un servidor de autoridad para dos
zonas, una maestra y otra esclava:

@lisp
(define-zone-entries example.org.zone
;; Name TTL Class Type Data
  ("@@"  ""  "IN"  "A"  "127.0.0.1")
  ("@@"  ""  "IN"  "NS" "ns")
  ("ns" ""  "IN"  "A"  "127.0.0.1"))

(define master-zone
  (knot-zone-configuration
    (domain "example.org")
    (zone (zone-file
            (origin "example.org")
            (entries example.org.zone)))))

(define slave-zone
  (knot-zone-configuration
    (domain "plop.org")
    (dnssec-policy "default")
    (master (list "plop-master"))))

(define plop-master
  (knot-remote-configuration
    (id "plop-master")
    (address (list "208.76.58.171"))))

(operating-system
  ;; ...
  (services (cons* (service knot-service-type
                     (knot-configuration
                       (remotes (list plop-master))
                       (zones (list master-zone slave-zone))))
                   ;; ...
                   %base-services)))
@end lisp

@deffn {Variable Scheme} knot-service-type
Este es el tipo de datos para el servidor DNS Knot.

Knot DNS es un servidor de autoridad de DNS, lo que significa que puede
servir múltiples zonas, es decir, nombres de dominio que compraría a una
autoridad de registro de nombres. Este servidor no es un resolvedor, lo que
significa que sólo puede resolver nombres para los que tiene autoridad. Este
servidor puede configurarse para servir zonas como servidor maestro o como
servidor esclavo con una granularidad al nivel de zona. Las zonas esclavas
obtendrán sus datos de los servidores maestros, y las proporcionarán como un
servidor de autoridad. Desde el punto de vista de un resolvedor, no hay
diferencia entre servidor maestro y esclavo.

Los siguientes tipos de datos se usan para configurar el servidor DNS Knot:
@end deffn

@deftp {Tipo de datos} knot-key-configuration
Tipo de datos que representa una clave. Este tipo tiene los siguientes
parámetros:

@table @asis
@item @code{id} (predeterminado: @code{""})
An identifier for other configuration fields to refer to this key.  IDs must
be unique and must not be empty.

@item @code{algorithm} (predeterminado: @code{#f})
El algoritmo usado. Debe seleccionarse entre @code{#f}, @code{'hmac-md5},
@code{'hmac-sha1}, @code{'hmac-sha224}, @code{'hmac-sha256},
@code{'hmac-sha384} y @code{'hmac-sha512}.

@item @code{secret} (predeterminado: @code{""})
La clave secreta en sí.

@end table
@end deftp

@deftp {Tipo de datos} knot-acl-configuration
Tipo de datos que representa una configuración de lista de control de acceso
(ACL). Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{id} (predeterminado: @code{""})
An identifier for other configuration fields to refer to this key.  IDs must
be unique and must not be empty.

@item @code{address} (predeterminada: @code{'()})
Lista ordenada de direcciones IP, subredes o rangos de red representadas
como cadenas. La búsqueda debe corresponder con alguna. El valor vacío
significa que la comprobación de correspondencia de la dirección no es
necesaria.

@item @code{key} (predeterminada: @code{'()})
Lista ordenada de referencias a claves representadas como cadenas. La cadena
debe corresponder con un ID de clave definido en
@code{knot-key-configuration}. Ninguna clave significa que la comprobación
de claves no es necesaria para este control de acceso (ACL).

@item @code{action} (predeterminada: @code{'()})
An ordered list of actions that are permitted or forbidden by this ACL@.
Possible values are lists of zero or more elements from @code{'transfer},
@code{'notify} and @code{'update}.

@item @code{deny?} (predeterminado: @code{#f})
Cuando es verdadero, este ACL define restricciones. Las acciones enumeradas
no se permiten. Cuando es falso, las acciones enumeradas se permiten.

@end table
@end deftp

@deftp {Tipo de datos} zone-entry
Tipo de datos que representa una entrada de registro en un archivo de
zona. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{name} (predeterminado: @code{"@@"})
El nombre del registro.  @code{"@@"} hace referencia al origen de la
zona. Los nombres son relativos al origen de la zona. Por ejemplo, en la
zona @code{example.org}, @code{"ns.example.org"} en realidad hace referencia
a @code{ns.example.org.example.org}. Los nombres que terminan en un punto se
consideran absolutos, lo que significa que @code{"ns.example.org."} hace
referencia a @code{ns.example.org}.

@item @code{ttl} (predeterminado: @code{""})
El tiempo de vida (TTL) de este registro. Si no se proporciona, se usa el
TTL predeterminado.

@item @code{class} (predeterminada: @code{"IN"})
La clase del registro. Actualmente Knot implementa únicamente @code{"IN"} y
parcialmente @code{"CH"}.

@item @code{type} (predeterminado: @code{"A"})
El tipo del registro. Los tipos comunes incluyen A (dirección IPv4), AAAA
(dirección IPv6), NS (servidor de nombres@footnote{Name Server en inglés.})
y MX (pasarela de correo@footnote{Mail eXchange en inglés}). Otros muchos
tipos distintos se encuentran definidos.

@item @code{data} (predeterminados: @code{""})
Los datos que contiene el registro. Por ejemplo, una dirección IP asociada
con un registro A, o un nombre de dominio asociado con un registro
NS. Recuerde que los nombres de dominio son relativos al origen a menos que
terminen con punto.

@end table
@end deftp

@deftp {Tipo de datos} zone-file
Tipo de datos que representa el contenido de un archivo de zona. Este tipo
tiene los siguientes parámetros:

@table @asis
@item @code{entries} (predeterminadas: @code{'()})
La lista de entradas. El registro SOA se genera automáticamente, por lo que
no necesita ponerlo en la lista de entradas. Esta lista probablemente
debería contener una entrada apuntando a su servidor DNS de autoridad. En
vez de usar una lista de entradas directamente, puede usar
@code{define-zone-entries} para definir un objeto que contenga la lista de
entradas más fácilmente, que posteriormente puede proporcionar en el campo
@code{entries} del archivo @code{zone-file}.

@item @code{origin} (predeterminado: @code{""})
El nombre de su zona. Este parámetro no puede estar vacío.

@item @code{ns} (predeterminado: @code{"ns"})
El dominio de su servidor DNS primario de autoridad. El nombre es relativo
al origen, a menos que termine en punto. Es obligatorio que este servidor
DNS primario corresponda con un registro NS en la zona y que esté asociado a
una dirección IP en la lista de entradas.

@item @code{mail} (predeterminado: @code{"hostmaster"})
Dirección de correo a través de la cual la gente puede contactar con usted,
como propietaria de la zona. Se traduce a @code{<mail>@@<origin>}.

@item @code{serial} (predeterminado: @code{1})
Número serie de la zona. Como se usa para tener constancia de los cambios
tanto en servidores esclavos como en resolvedores, es obligatorio que
@emph{nunca} decremente. Incremente su valor siempre que haga cambios en su
zona.

@item @code{refresh} (predeterminado: @code{(* 2 24 3600)})
La frecuencia con la que los servidores esclavos realizarán una
transferencia de zona. Este valor es un número de segundos. Puede calcularse
con multiplicaciones o con @code{(string->duration)}.

@item @code{retry} (predeterminado: @code{(* 15 60)})
El periodo tras el cual un servidor esclavo reintentará el contacto con su
maestro cuando falle al intentarlo la primera vez.

@item @code{expiry} (predeterminado: @code{(* 14 24 3600)})
Tiempo de vida (TTL) predeterminado de los registros. Los registros
existentes se consideran correctos durante al menos este periodo de
tiempo. Tras este periodo, los resolvedores invalidarán su caché y
comprobarán de nuevo que todavía exista.

@item @code{nx} (predeterminado: @code{3600})
Default TTL of inexistent records.  This delay is usually short because you
want your new domains to reach everyone quickly.

@end table
@end deftp

@deftp {Tipo de datos} knot-remote-configuration
Tipo de datos que representa una configuración remota. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{id} (predeterminado: @code{""})
An identifier for other configuration fields to refer to this remote.  IDs
must be unique and must not be empty.

@item @code{address} (predeterminada: @code{'()})
Una lista ordenada de direcciones IP de destino. Las direcciones se prueban
en secuencia. Opcionalmente se puede proporcionar el puerto con el separador
@@. Por ejemplo: @code{(list "1.2.3.4" "2.3.4.5@@53")}. El puerto
predeterminado es el 53.

@item @code{via} (predeterminada: @code{'()})
An ordered list of source IP addresses.  An empty list will have Knot choose
an appropriate source IP@.  An optional port can be given with the @@
separator.  The default is to choose at random.

@item @code{key} (predeterminada: @code{#f})
Referencia a una clave, esto es una cadena que contiene el identificador de
una clave definida en el campo @code{knot-key-configuration}.

@end table
@end deftp

@deftp {Tipo de datos} knot-keystore-configuration
Tipo de datos que representa un almacén de claves para alojar claves de
dnssec. Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{id} (predeterminado: @code{""})
El identificador del almacén de claves. No debe estar vacío.

@item @code{backend} (predeterminado: @code{'pem})
El motor en el que se almacenan las claves. Puede ser @code{'pem} o
@code{'pkcs11}.

@item @code{config} (predeterminada: @code{"/var/lib/knot/keys/keys"})
La cadena de configuración del motor.  Un ejemplo para PKCS#11 es:
@code{"pkcs11:token=knot;pin-value=1234
/gnu/store/.../lib/pkcs11/libsofthsm2.so"}. La cadena representa una ruta en
el sistema de archivos para el motor pem.

@end table
@end deftp

@deftp {Tipo de datos} knot-policy-configuration
Tipo de datos que representa una política de dnssec. El DNS Knot es capaz de
firmar automáticamente sus zonas. Puede generar y gestionar sus claves de
manera automática o usar las claves que usted genere.

Dnssec se implementa habitualmente usando dos claves: una clave para firma
de claves (KSK) que se usa para firmar la segunda, y una clave para firma de
zona (ZSK) que se usa para firmar la zona. Para establecer la confianza, la
KSK necesita estar presente en la zona padre (habitualmente un dominio de
nivel superior). Si su entidad de registro permite dnssec, debe mandarle el
hash de su KSK de manera que puedan añadir un registro DS en su zona. No es
automático y debe realizarse cada vez que cambie su KSK.

La política también define el tiempo de vida de las claves. Habitualmente,
la ZSK puede cambiarse fácilmente y usa funciones criptográficas más débiles
(usa parámetros de menor magnitud) para firmar los registros rápidamente, ya
que cambian habitualmente. No obstante, la KSK requiere interacción manual
con la entidad de registro, por lo que se cambia menos habitualmente y usa
parámetros más fuertes debido a que únicamente firma un registro.

Este tipo tiene los siguientes parámetros:

@table @asis
@item @code{id} (predeterminado: @code{""})
El identificador de la política. No debe estar vacío.

@item @code{keystore} (predeterminado: @code{"default"})
Referencia a un almacén de claves, es decir una cadena que contiene el
identificador de un almacén de claves definido en un campo de
@code{knot-keystore-configuration}. El identificador predeterminado
@code{"default"} implica el uso del almacén de claves predeterminado (una
base de datos kasp que se configura para este servicio).

@item @code{manual?} (predeterminado: @code{#f})
Si la gestión de claves es manual o automática.

@item @code{single-type-signing?} (predeterminado: @code{#f})
Cuando sea @code{#t}, usa el esquema de firma de tipo único (Single-Type
Signing Scheme).

@item @code{algorithm} (predeterminado: @code{"ecdsap256sha256"})
Algoritmo para las claves de firma y las firmas emitidas.

@item @code{ksk-size} (predeterminado: @code{256})
The length of the KSK@.  Note that this value is correct for the default
algorithm, but would be unsecure for other algorithms.

@item @code{zsk-size} (predeterminado: @code{256})
The length of the ZSK@.  Note that this value is correct for the default
algorithm, but would be unsecure for other algorithms.

@item @code{dnskey-ttl} (predeterminado: @code{'default})
El valor del tiempo de vida (TTL) de los registros DNSKEY añadidos al
``apex'' de la zona. El valor especial @code{'default} significa el mismo
valor que el TTL del SOA de la zona.

@item @code{zsk-lifetime} (predeterminado: @code{(* 30 24 3600)})
El periodo entre la publicación de la ZSK y el inicio del siguiente ciclo de
renovación.

@item @code{propagation-delay} (predeterminado: @code{(* 24 3600)})
Retraso adicional añadido por cada paso del ciclo de renovación de
clave. Este valor debe ser suficientemente alto para cubrir la propagación
de datos del servidor maestro a todos los esclavos.

@item @code{rrsig-lifetime} (predeterminado: @code{(* 14 24 3600)})
Periodo de validez para las nuevas firmas emitidas.

@item @code{rrsig-refresh} (predeterminado: @code{(* 7 24 3600)})
Periodo de antelación con el que se realiza el refresco de la firma antes de
una expiración de la misma.

@item @code{nsec3?} (predeterminado: @code{#f})
Si es @code{#t}, se usa NSEC3 en vez de NSEC.

@item @code{nsec3-iterations} (predeterminado: @code{5})
Número de ejecuciones adicionales de la operación de hash.

@item @code{nsec3-salt-length} (predeterminado: @code{8})
La longitud del campo ``salt'' en octetos, que se añade al nombre de la
propietaria original antes de ejecutar la operación de hash.

@item @code{nsec3-salt-lifetime} (predeterminado: @code{(* 30 24 3600)})
El periodo de validez de los campos ``salt'' que se generen.

@end table
@end deftp

@deftp {Tipo de datos} knot-zone-configuration
Tipo de datos que representa una zona ofrecida por Knot. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{domain} (predeterminado: @code{""})
El dominio ofrecido con esta configuración. No debe estar vacío.

@item @code{file} (predeterminado: @code{""})
El archivo donde se almacena esta zona. Este parámetro se ignora para zonas
maestras. Vacío significa la ruta predeterminada que depende del nombre del
dominio.

@item @code{zone} (predeterminado: @code{(zone-file)})
El contenido del archivo de zona. Este parámetro se ignora para zonas
esclavas. Debe contener un registro de archivo de zona.

@item @code{master} (predeterminado: @code{'()})
Lista de maestros remotos. Cuando está vacía, esta zona es maestra. Cuando
tiene contenido, esta zona es esclava. Es una lista de identificadores
remotos.

@item @code{ddns-master} (predeterminado: @code{#f})
Maestro principal. Cuando está vacío, apunta de manera predeterminada al
primer maestro en la lista de maestros.

@item @code{notify} (predeterminado: @code{'()})
Una lista de identificadores remotos de esclavos.

@item @code{acl} (predeterminado: @code{'()})
Lista de identificadores acl.

@item @code{semantic-checks?} (predeterminado: @code{#f})
Cuando es verdadero, añade más comprobaciones semánticas a la zona.

@item @code{zonefile-sync} (predeterminado: @code{0})
El retraso entre una modificación en memoria y en disco. 0 significa
sincronización inmediata.

@item @code{zonefile-load} (predeterminado: @code{#f})
La forma en la que los contenidos del archivo de zona se aplican durante la
carga de la zona. Los valores posibles son:

@itemize
@item @code{#f} para obtener el valor predeterminado de Knot,
@item @code{'none} para no usar el archivo de zona en absoluto,
@item @code{'difference} para calcular la diferencia entre los contenidos disponibles
actualmente y los contenidos de la zona y los aplica a los contenidos
actuales de la zona actual,
@item @code{'difference-no-serial} es igual que @code{'difference}, pero
ignora el código serie SOA en el archivo de zona, mientras que el servidor
se hace cargo de él de manera automática.
@item @code{'whole} para cargar los contenidos de la zona del archivo de zona.
@end itemize

@item @code{journal-content} (predeterminado: @code{'()})
La forma en la que se usa el diario para almacenar la zona y sus
cambios. Los posibles valores son @code{'none} para no usarlo en absoluto,
@code{'changes} para almacenar los cambios y @code{'all} para almacenar los
contenidos. @code{#f} proporciona un valor a esta opción, por lo que se usa
el valor predeterminado de Knot.

@item @code{max-journal-usage} (predeterminado: @code{#f})
Tamaño máximo del diario en disco. @code{#f} no proporciona un valor a esta
opción, por lo que se usa el valor predeterminado de Knot.

@item @code{max-journal-depth} (predeterminado: @code{#f})
Tamaño máximo de la historia. @code{#f} proporciona un valor a esta opción,
por lo que se usa el valor predeterminado de Knot.

@item @code{max-zone-size} (predeterminado: @code{#f})
Tamaño máximo del archivo de zona. Este límite se usa para transferencias
entrantes y actualizaciones. @code{#f} no proporciona un valor a esta
opción, por lo que se usa el valor predeterminado de Knot.

@item @code{dnssec-policy} (predeterminado: @code{#f})
Una referencia a un registro de @code{knot-policy-configuration}, o el
nombre especial @code{"default"}. Si el valor es @code{#f}, no se realiza
firma dnssec en esta zona.

@item @code{serial-policy} (predeterminado: @code{'increment})
Una política entre @code{'increment} y @code{'unixtime}.

@end table
@end deftp

@deftp {Tipo de datos} knot-configuration
Tipo de datos que representa la configuración Knot. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{knot} (predeterminado: @code{knot})
El paquete Knot.

@item @code{run-directory} (predeterminado: @code{"/var/run/knot"})
El directorio de ejecución. Este directorio se usará para los archivos de
PID y de sockets.

@item @code{includes} (predeterminada: @code{'()})
Una lista de cadenas u objetos ``tipo-archivo'' que denota otros archivos
que deben incluirse al inicio del archivo de configuración.

@cindex secretos, servicio Knot
Puede usarse para gestionar secretos en un canal separado. Por ejemplo, las
claves secretas pueden almacenarse en un archivo fuera de banda no
gestionado por Guix, y por tanto no visible en @file{/gnu/store}---por
ejemplo, puede almacenar su configuración de clave secreta en
@file{/etc/knot/secrets.conf} e incluir este archivo en la lista
@code{includes}.

Se puede generar una clave secreta tsig (para nsupdate y transferencias de
zona) con la orden keymgr del paquete knot. Tenga en cuenta que el paquete
no se instala automáticamente con el servicio. El ejemplo siguiente muestra
como generar una clave tsig nueva:

@example
keymgr -t misecreto > /etc/knot/secrets.conf
chmod 600 /etc/knot/secrets.conf
@end example

Tenga también en cuenta que la clave generada se llamará @var{misecreto}, de
modo que ese nombre es el que debe usarse en el campo @var{key} del registro
@code{knot-acl-configuration} y en otros lugares que hagan referencia a esa
clave.

También puede usarse para añadir configuración no implementada por esta
interfaz.

@item @code{listen-v4} (predeterminada: @code{"0.0.0.0"})
La dirección IP en la que escuchar.

@item @code{listen-v6} (predeterminada: @code{"::"})
La dirección IP en la que escuchar.

@item @code{listen-port} (predeterminado: @code{53})
El puerto en el que escuchar.

@item @code{keys} (predeterminada: @code{'()})
La lista de configuraciones knot-key-configuration usadas por esta
configuración.

@item @code{acls} (predeterminado: @code{'()})
La lista de configuraciones knot-acl-configuration usadas por esta
configuración.

@item @code{remotes} (predeterminada: @code{'()})
La lista de configuraciones knot-remote-configuration usadas por esta
configuración.

@item @code{zones} (predeterminada: @code{'()})
La lista de configuraciones knot-zone-configuration usadas por esta
configuración.

@end table
@end deftp

@subsubheading Servicio de resolución de Knot

@deffn {Variable Scheme} knot-resolver-service-type
El tipo del servicio de resolución de knot, cuyo valor debe ser un objeto
@code{knot-resolver-configuration} como en este ejemplo:

@lisp
(service knot-resolver-service-type
         (knot-resolver-configuration
           (kresd-config-file (plain-file "kresd.conf" "
net.listen('192.168.0.1', 5353)
user('knot-resolver', 'knot-resolver')
modules = @{ 'hints > iterate', 'stats', 'predict' @}
cache.size = 100 * MB
"))))
@end lisp

Para más información, véase su
@url{https://knot-resolver.readthedocs.org/en/stable/daemon.html#configuration,
manual}.
@end deffn

@deftp {Tipo de datos} knot-resolver-configuration
Tipo de datos que representa la configuración de knot-resolver.

@table @asis
@item @code{package} (predeterminado: @var{knot-resolver})
El objeto paquete de la resolución de DNS de knot.

@item @code{kresd-config-file} (predeterminado: %kresd.conf)
Objeto ``tipo-archivo'' con el archivo de configuración de kresd usado, de
manera predeterminada escucha en @code{127.0.0.1} y @code{::1}.

@item @code{garbage-collection-interval} (predeterminado: 1000)
Número de milisegundos tras los que @code{kres-cache-gc} realiza una
limpieza periódica de la caché.

@end table
@end deftp


@subsubheading Servicio Dnsmasq

@deffn {Variable Scheme} dnsmasq-service-type
Es el tipo del servicio dnsmasq, cuyo valor debe ser un objeto
@code{dnsmasq-configuration} como en este ejemplo:

@lisp
(service dnsmasq-service-type
         (dnsmasq-configuration
           (no-resolv? #t)
           (servers '("192.168.1.1"))))
@end lisp
@end deffn

@deftp {Tipo de datos} dnsmasq-configuration
Tipo de datos que representa la configuración de dnsmasq.

@table @asis
@item @code{package} (predeterminado: @var{dnsmasq})
El objeto paquete del servidor dnsmasq.

@item @code{no-hosts?} (predeterminado: @code{#f})
Cuando es verdadero, no lee los nombres de máquina en /etc/hosts.

@item @code{port} (predeterminado: @code{53})
El puerto sobre el que se escucha. Proporcionar el valor cero deshabilita
las respuestas DNS completamente, dejando las funciones DHCP y/o TFTP
únicamente.

@item @code{local-service?} (predeterminado: @code{#t})
Acepta peticiones DNS únicamente de máquinas cuya dirección esté en una
subred local, es decir, subred para la que existe una interfaz en el
servidor.

@item @code{listen-addresses} (predeterminadas: @code{'()})
Escucha en las direcciones IP proporcionadas.

@item @code{resolv-file} (predeterminado: @code{"/etc/resolv.conf"})
Archivo en el que se obtienen las direcciones IP de los servidores de
nombres desde los que se obtienen datos.

@item @code{no-resolv?} (predeterminado: @code{#f})
Cuando tiene valor verdadero, no se lee @var{resolv-file}.

@item @code{forward-private-reverse-lookup?} (default: @code{#t})
When false, all reverse lookups for private IP ranges are answered with "no
such domain" rather than being forwarded upstream.

@item @code{query-servers-in-order?} (default: @code{#f})
When true, dnsmasq queries the servers in the same order as they appear in
@var{servers}.

@item @code{servers} (predeterminados: @code{'()})
Especifica directamente la dirección IP de los servidores proveedores.

@item @code{addresses} (predeterminado: @code{'()})
Cada entrada especifica una dirección IP devuelta por cualquiera de las
máquinas en los dominios proporcionados. Las búsquedas dentro de los
dominios nunca se redirigen y siempre se devuelve la dirección IP
especificada.

Es útil para redirigir máquinas localmente, como en este ejemplo:

@lisp
(service dnsmasq-service-type
         (dnsmasq-configuration
           (addresses
             '(; Redirecciona a un servidor web local.
               "/example.org/127.0.0.1"
               ; Redirecciona un dominio a una IP específica.
               "/subdomain.example.org/192.168.1.42"))))
@end lisp

Tenga en cuenta que las reglas en el archivo @file{/etc/hosts} tienen
precedencia sobre esto.

@item @code{cache-size} (predeterminado: @code{150})
Establece el tamaño de la caché de dnsmasq. Proporcionar el valor cero
desactiva el almacenamiento en caché.

@item @code{negative-cache?} (predeterminado: @code{#t})
Cuando es falso, desactiva la caché negativa.

@item @code{cpe-id} (default: @code{#f})
If set, add a CPE (Customer-Premises Equipment) identifier to DNS queries
which are forwarded upstream.

@item @code{tftp-enable?} (predeterminado: @code{#f})
Determina si se activa el servidor TFTP incluido.

@item @code{tftp-no-fail?} (predeterminado: @code{#f})
Si es verdadero, dnsmasq no falla si el servidor TFTP no se ha podido
arrancar.

@item @code{tftp-single-port?} (predeterminado: @code{#f})
Determina si se un único puerto para TFTP.

@item @code{tftp-secure?} (predeterminado: @code{#f})
Si es verdadero, únicamente los archivos propiedad de la cuenta que ejecuta
el proceso dnsmasq están accesibles.

Si se ejecuta dnsmasq como ``root'', se aplican diferentes reglas:
@code{tftp-secure?} no tiene efecto, únicamente los archivos que tengan
permiso de lectura global el mundo serán accesibles.

@item @code{tftp-max} (predeterminado: @code{#f})
Cuando se proporciona un valor indica el número máximo de conexiones
simultáneas permitidas.

@item @code{tftp-mtu} (predeterminado: @code{#f})
Si se proporciona un valor, establece el tamaño de la unidad de transmisión
de mensajes (MTU) para los paquetes TFTP a dicho valor.

@item @code{tftp-no-blocksize?} (predeterminado: @code{#f})
Si es verdadero, impide al servidor TFTP la negociación del tamaño del
bloque con un cliente.

@item @code{tftp-lowercase?} (predeterminado: @code{#f})
Determina si se convierten a minúsculas todos los nombres de archivo en
peticiones TFTP.

@item @code{tftp-port-range} (predeterminado: @code{#f})
Si se proporciona un valor, este establece el rango
(@code{"<inicio>,<fin>"}) de puertos dinámicos (uno por cliente) usados.

@item @code{tftp-root} (predeterminado: @code{/var/empty,lo})
Look for files to transfer using TFTP relative to the given directory.  When
this is set, TFTP paths which include @samp{..} are rejected, to stop
clients getting outside the specified root.  Absolute paths (starting with
@samp{/}) are allowed, but they must be within the TFTP-root.  If the
optional interface argument is given, the directory is only used for TFTP
requests via that interface.

@item @code{tftp-unique-root} (predeterminado: @code{#f})
Si se proporciona un valor, añade la dirección IP o hardware del cliente
TFTP como un componente de la ruta tras el final de @code{tftp-root}. Es
válido únicamente si se proporciona una raíz para TFTP y el directorio
existe. El valor predeterminado añade la dirección IP (en el formato
estándar de cuatro cifras separadas por puntos).

For instance, if @option{--tftp-root} is @samp{/tftp} and client
@samp{1.2.3.4} requests file @file{myfile} then the effective path will be
@file{/tftp/1.2.3.4/myfile} if @file{/tftp/1.2.3.4} exists or
@file{/tftp/myfile} otherwise.  When @samp{=mac} is specified it will append
the MAC address instead, using lowercase zero padded digits separated by
dashes, e.g.: @samp{01-02-03-04-aa-bb}.  Note that resolving MAC addresses
is only possible if the client is in the local network or obtained a DHCP
lease from dnsmasq.

@end table
@end deftp

@subsubheading Servicio ddclient

@cindex ddclient
El servicio de ddclient descrito a continuación ejecuta el daemon ddclient,
que se encarga de actualizar automáticamente entradas DNS para proveedores
de servicio como @uref{https://dyn.com/dns/, Dyn}.

El ejemplo siguiente muestra como instanciar el servicio con su
configuración predeterminada.

@lisp
(service ddclient-service-type)
@end lisp

Fíjese que ddclient necesita acceder a las credenciales que se almacenan en
un @dfn{archivo de secretos}, de manera predeterminada
@file{/etc/ddclient/secrets} (véase @code{secret-file} a continuación). Se
espera que genere este archivo manualmente, ``fuera de banda'' (@emph{puede}
incluir este archivo en la configuración del servicio, por ejemplo mediante
el uso de @code{plain-file}, pero sera legible por todo el mundo a través de
@file{/gnu/store}). Véase los ejemplos en el directorio
@file{share/ddclient} del paquete @code{ddclient}.

@c %start of fragment

Los campos disponibles de @code{ddclient-configuration} son:

@deftypevr {parámetro de @code{ddclient-configuration}} package ddclient
El paquete ddclient.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} integer daemon
Periodo tras el cual ddclient reintentará la comprobación de IP y de nombre
de dominio.

El valor predeterminado es @samp{300}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} boolean syslog
Usa syslog para la salida.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string mail
Envía por correo a la usuaria.

El valor predeterminado es @samp{"root"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string mail-failure
Envía por correo las actualizaciones fallidas a la usuaria.

El valor predeterminado es @samp{"root"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string pid
El archivo de PID de ddclient.

El valor predeterminado es @samp{"/var/run/ddclient/ddclient.pid"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} boolean ssl
Permite el uso de SSL.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string user
Especifica el nombre de usuaria o ID usado para la ejecución del programa
ddclient.

El valor predeterminado es @samp{"ddclient"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string group
Grupo de la usuaria que ejecutará el servidor ddclient.

El valor predeterminado es @samp{"ddclient"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} string secret-file
Archivo secreto que se añadirá al final del archivo
@file{ddclient.conf}. Este archivo contiene las credenciales usadas por
ddclient. Se espera que usted lo cree manualmente.

El valor predeterminado es @samp{"/etc/ddclient/secrets.conf"}.

@end deftypevr

@deftypevr {parámetro de @code{ddclient-configuration}} lista extra-options
Opciones adicionales a agregar al final del archivo @file{ddclient.conf}.

El valor predeterminado es @samp{()}.

@end deftypevr


@c %end of fragment

@node VNC Services
@subsection VNC Services
@cindex VNC (virtual network computing)
@cindex XDMCP (x display manager control protocol)

The @code{(gnu services vnc)} module provides services related to
@dfn{Virtual Network Computing} (VNC), which makes it possible to locally
use graphical Xorg applications running on a remote machine.  Combined with
a graphical manager that supports the @dfn{X Display Manager Control
Protocol}, such as GDM (@pxref{gdm}) or LightDM (@pxref{lightdm}), it is
possible to remote an entire desktop for a multi-user environment.

@subsubheading Xvnc

Xvnc is a VNC server that spawns its own X window server; which means it can
run on headless servers.  The Xvnc implementations provided by the
@code{tigervnc-server} and @code{turbovnc} aim to be fast and efficient.

@defvar {Scheme Variable} xvnc-service-type

The @code{xvnc-server-type} service can be configured via the
@code{xvnc-configuration} record, documented below.  A second virtual
display could be made available on a remote machine via the following
configuration:
@end defvar

@lisp
(service xvnc-service-type
         (xvnc-configuration (display-number 10)))
@end lisp

As a demonstration, the @command{xclock} command could then be started on
the remote machine on display number 10, and it could be displayed locally
via the @command{vncviewer} command:
@example
# Start xclock on the remote machine.
ssh -L5910:localhost:5910 -- guix shell xclock -- env DISPLAY=:10 xclock
# Access it via VNC.
guix shell tigervnc-client -- vncviewer localhost:5910
@end example

The following configuration combines XDMCP and Inetd to allow multiple users
to concurrently use the remote system, login in graphically via the GDM
display manager:

@lisp
(operating-system
  [...]
  (services (cons*
             [...]
             (service xvnc-service-type (xvnc-configuration
                                         (display-number 5)
                                         (localhost? #f)
                                         (xdmcp? #t)
                                         (inetd? #t)))
             (modify-services %desktop-services
               (gdm-service-type config => (gdm-configuration
                                            (inherit config)
                                            (auto-suspend? #f)
                                            (xdmcp? #t)))))))
@end lisp

A remote user could then connect to it by using the @command{vncviewer}
command or a compatible VNC client and start a desktop session of their
choosing:
@example
vncviewer remote-host:5905
@end example

@quotation Aviso
Unless your machine is in a controlled environment, for security reasons,
the @code{localhost?} configuration of the @code{xvnc-configuration} record
should be left to its default @code{#t} value and exposed via a secure means
such as an SSH port forward.  The XDMCP port, UDP 177 should also be blocked
from the outside by a firewall, as it is not a secure protocol and can
expose login credentials in clear.
@end quotation

@c Use (configuration->documentation 'xvnc-configuration) to regenerate
@c the documentation.
@c %start of fragment
@deftp {Data Type} xvnc-configuration
Available @code{xvnc-configuration} fields are:

@table @asis
@item @code{xvnc} (default: @code{tigervnc-server}) (type: file-like)
The package that provides the Xvnc binary.

@item @code{display-number} (default: @code{0}) (type: number)
The display number used by Xvnc.  You should set this to a number not
already used a Xorg server.

@item @code{geometry} (default: @code{"1024x768"}) (type: string)
The size of the desktop to be created.

@item @code{depth} (default: @code{24}) (type: color-depth)
The pixel depth in bits of the desktop to be created.  Accepted values are
16, 24 or 32.

@item @code{port} (type: maybe-port)
The port on which to listen for connections from viewers.  When left
unspecified, it defaults to 5900 plus the display number.

@item @code{ipv4?} (default: @code{#t}) (type: boolean)
Use IPv4 for incoming and outgoing connections.

@item @code{ipv6?} (default: @code{#t}) (type: boolean)
Use IPv6 for incoming and outgoing connections.

@item @code{password-file} (type: maybe-string)
The password file to use, if any.  Refer to vncpasswd(1) to learn how to
generate such a file.

@item @code{xdmcp?} (default: @code{#f}) (type: boolean)
Query the XDMCP server for a session.  This enables users to log in a
desktop session from the login manager screen.  For a multiple users
scenario, you'll want to enable the @code{inetd?} option as well, so that
each connection to the VNC server is handled separately rather than shared.

@item @code{inetd?} (default: @code{#f}) (type: boolean)
Use an Inetd-style service, which runs the Xvnc server on demand.

@item @code{frame-rate} (default: @code{60}) (type: number)
The maximum number of updates per second sent to each client.

@item @code{security-types} (default: @code{("None")}) (type: security-types)
The allowed security schemes to use for incoming connections.  The default
is "None", which is safe given that Xvnc is configured to authenticate the
user via the display manager, and only for local connections.  Accepted
values are any of the following: ("None" "VncAuth" "Plain" "TLSNone"
"TLSVnc" "TLSPlain" "X509None" "X509Vnc")

@item @code{localhost?} (default: @code{#t}) (type: boolean)
Only allow connections from the same machine.  It is set to #true by default
for security, which means SSH or another secure means should be used to
expose the remote port.

@item @code{log-level} (default: @code{30}) (type: log-level)
The log level, a number between 0 and 100, 100 meaning most verbose output.
The log messages are output to syslog.

@item @code{extra-options} (default: @code{()}) (type: strings)
This can be used to provide extra Xvnc options not exposed via this
<xvnc-configuration> record.

@end table

@end deftp
@c %end of fragment

@node Servicios VPN
@subsection Servicios VPN
@cindex VPN (red privada virtual)
@cindex red privada virtual (VPN)

The @code{(gnu services vpn)} module provides services related to
@dfn{virtual private networks} (VPNs).

@subsubheading Bitmask

@defvr {Scheme Variable} bitmask-service-type
A service type for the @uref{https://bitmask.net, Bitmask} VPN client.  It
makes the client available in the system and loads its polkit policy.
Please note that the client expects an active polkit-agent, which is either
run by your desktop-environment or should be run manually.
@end defvr

@subsubheading OpenVPN

It provides a @emph{client} service for your machine to connect to a VPN,
and a @emph{server} service for your machine to host a VPN@.

@deffn {Procedimiento Scheme} openvpn-client-service @
       [#:config (openvpn-client-configuration)]

Devuelve un servicio que ejecuta @command{openvpn}, un daemon VPN, como
cliente.
@end deffn

@deffn {Procedimiento Scheme} openvpn-server-service @
       [#:config (openvpn-server-configuration)]

Devuelve un servicio que ejecuta @command{openvpn}, un daemon VPN, como
servidor.

Pueden ejecutarse simultáneamente.
@end deffn

@c %automatically generated documentation

@deftp {Data Type} openvpn-client-configuration
Los campos disponibles de @code{openvpn-client-configuration} son:

@table @asis
@item @code{openvpn} (default: @code{openvpn}) (type: file-like)
El paquete OpenVPN.

@item @code{pid-file} (default: @code{"/var/run/openvpn/openvpn.pid"}) (type: string)
El archivo de pid de OpenVPN.

@item @code{proto} (default: @code{udp}) (type: proto)
El protocolo (UDP o TCP) usado para la apertura del canal entre clientes y
servidores.

@item @code{dev} (default: @code{tun}) (type: dev)
El tipo de dispositivo usado para representar la conexión VPN.

@item @code{ca} (default: @code{"/etc/openvpn/ca.crt"}) (type: maybe-string)
La autoridad de certificación contra la que se comprueban las conexiones.

@item @code{cert} (default: @code{"/etc/openvpn/client.crt"}) (type: maybe-string)
El certificado de la máquina en la que se ejecuta el daemon. Debe estar
firmado por la autoridad proporcionada en @code{ca}.

@item @code{key} (default: @code{"/etc/openvpn/client.key"}) (type: maybe-string)
La clave de la máquina en la que se ejecuta el daemon. Debe ser la clave
cuyo certificado es @code{cert}.

@item @code{comp-lzo?} (default: @code{#t}) (type: boolean)
Determina si se usa el algoritmo de compresión lzo.

@item @code{persist-key?} (default: @code{#t}) (type: boolean)
No vuelve a leer los archivos de claves tras la señal SIGUSR1 o
--ping-restart.

@item @code{persist-tun?} (default: @code{#t}) (type: boolean)
No cierra y reabre el dispositivo TUN/TAP o ejecuta los guiones de parada e
inicio tras el reinicio provocado por SIGUSR1 o --ping-restart.

@item @code{fast-io?} (default: @code{#f}) (type: boolean)
(Experimental) Optimiza las escrituras de E/S de TUN/TAP/UDP evitando llamar
poll/epoll/select antes de la operación de escritura (@code{write}).

@item @code{verbosity} (default: @code{3}) (type: number)
Nivel de detalle en los mensajes.

@item @code{tls-auth} (default: @code{#f}) (type: tls-auth-client)
Añade una capa adicional de verificación HMAC sobre el canal de control TLS
para protección contra ataques de denegación de servicio (DoS).

@item @code{auth-user-pass} (type: maybe-string)
Activa la identificación con el servidor mediante el uso de
usuaria/contraseña. La opción es un archivo que contiene en dos líneas el
nombre de usuaria y la contraseña. No use un objeto tipo-archivo, ya que se
añadiría al almacén y sería legible para cualquier usuaria.

@item @code{verify-key-usage?} (default: @code{#t}) (type: key-usage)
Si se comprueba que el certificado del servidor tenga la extensión de uso de
servidor.

@item @code{bind?} (default: @code{#f}) (type: bind)
Asociación a un número específico de puerto local.

@item @code{resolv-retry?} (default: @code{#t}) (type: resolv-retry)
Reintentos de resolución de la dirección del servidor.

@item @code{remote} (default: @code{()}) (type: openvpn-remote-list)
Una lista de servidores remotos a los que conectarse.

@deftp {Data Type} openvpn-remote-configuration
Los campos disponibles de @code{openvpn-remote-configuration} son:

@table @asis
@item @code{name} (default: @code{"my-server"}) (type: string)
Nombre del servidor.

@item @code{port} (default: @code{1194}) (type: number)
Puerto en el que escucha el servidor.

@end table

@end deftp

@end table

@end deftp

@c %end of automatic openvpn-client documentation

@c %automatically generated documentation

@deftp {Data Type} openvpn-server-configuration
Los campos disponibles de @code{openvpn-server-configuration} son:

@table @asis
@item @code{openvpn} (default: @code{openvpn}) (type: file-like)
El paquete OpenVPN.

@item @code{pid-file} (default: @code{"/var/run/openvpn/openvpn.pid"}) (type: string)
El archivo de pid de OpenVPN.

@item @code{proto} (default: @code{udp}) (type: proto)
El protocolo (UDP o TCP) usado para la apertura del canal entre clientes y
servidores.

@item @code{dev} (default: @code{tun}) (type: dev)
El tipo de dispositivo usado para representar la conexión VPN.

@item @code{ca} (default: @code{"/etc/openvpn/ca.crt"}) (type: maybe-string)
La autoridad de certificación contra la que se comprueban las conexiones.

@item @code{cert} (default: @code{"/etc/openvpn/client.crt"}) (type: maybe-string)
El certificado de la máquina en la que se ejecuta el daemon. Debe estar
firmado por la autoridad proporcionada en @code{ca}.

@item @code{key} (default: @code{"/etc/openvpn/client.key"}) (type: maybe-string)
La clave de la máquina en la que se ejecuta el daemon. Debe ser la clave
cuyo certificado es @code{cert}.

@item @code{comp-lzo?} (default: @code{#t}) (type: boolean)
Determina si se usa el algoritmo de compresión lzo.

@item @code{persist-key?} (default: @code{#t}) (type: boolean)
No vuelve a leer los archivos de claves tras la señal SIGUSR1 o
--ping-restart.

@item @code{persist-tun?} (default: @code{#t}) (type: boolean)
No cierra y reabre el dispositivo TUN/TAP o ejecuta los guiones de parada e
inicio tras el reinicio provocado por SIGUSR1 o --ping-restart.

@item @code{fast-io?} (default: @code{#f}) (type: boolean)
(Experimental) Optimiza las escrituras de E/S de TUN/TAP/UDP evitando llamar
poll/epoll/select antes de la operación de escritura (@code{write}).

@item @code{verbosity} (default: @code{3}) (type: number)
Nivel de detalle en los mensajes.

@item @code{tls-auth} (default: @code{#f}) (type: tls-auth-server)
Añade una capa adicional de verificación HMAC sobre el canal de control TLS
para protección contra ataques de denegación de servicio (DoS).

@item @code{port} (default: @code{1194}) (type: number)
Especifica el número de puerto en el que escucha el servidor.

@item @code{server} (default: @code{"10.8.0.0 255.255.255.0"}) (type: ip-mask)
Una IP y una máscara que especifiquen la subred dentro de la red virtual.

@item @code{server-ipv6} (default: @code{#f}) (type: cidr6)
La especificación de una subred IPv6 dentro de la red virtual en notación
CIDR.

@item @code{dh} (default: @code{"/etc/openvpn/dh2048.pem"}) (type: string)
El archivo de parámetros Diffie-Hellman.

@item @code{ifconfig-pool-persist} (default: @code{"/etc/openvpn/ipp.txt"}) (type: string)
El archivo que registra IP de clientes.

@item @code{redirect-gateway?} (default: @code{#f}) (type: gateway)
Cuando sea verdadero, el servidor actuará como una pasarela para sus
clientes.

@item @code{client-to-client?} (default: @code{#f}) (type: boolean)
Cuando es verdadero, se permite la comunicación entre clientes dentro de la
VPN.

@item @code{keepalive} (default: @code{(10 120)}) (type: keepalive)
Hace que se envíen mensajes tipo-ping en ambas direcciones a través del
enlace de modo que cada extremo conozca si el otro extremo no está
disponible. @code{keepalive} necesita un par. El primer elemento es el
periodo de envío de ping, y el segundo elemento es el plazo máximo antes de
considerar que el otro extremo no está disponible.

@item @code{max-clients} (default: @code{100}) (type: number)
Número máximo de clientes.

@item @code{status} (default: @code{"/var/run/openvpn/status"}) (type: string)
El archivo de estado. Este archivo muestra un pequeño informe sobre la
conexión actual. Su contenido se borra y se reescribe cada minuto.

@item @code{client-config-dir} (default: @code{()}) (type: openvpn-ccd-list)
Lista de configuración para algunos clientes.

@end table

@end deftp

@c %end of automatic openvpn-server documentation

@subheading strongSwan

Currently, the strongSwan service only provides legacy-style configuration
with @file{ipsec.conf} and @file{ipsec.secrets} files.

@defvr {Scheme Variable} strongswan-service-type
A service type for configuring strongSwan for IPsec @acronym{VPN, Virtual
Private Networking}.  Its value must be a @code{strongswan-configuration}
record as in this example:

@lisp
(service strongswan-service-type
         (strongswan-configuration
          (ipsec-conf "/etc/ipsec.conf")
          (ipsec-secrets "/etc/ipsec.secrets")))
@end lisp

@end defvr

@deftp {Data Type} strongswan-configuration
Data type representing the configuration of the StrongSwan service.

@table @asis
@item @code{strongswan}
The strongSwan package to use for this service.

@item @code{ipsec-conf} (default: @code{#f})
The file name of your @file{ipsec.conf}.  If not @code{#f}, then this and
@code{ipsec-secrets} must both be strings.

@item @code{ipsec-secrets} (default @code{#f})
The file name of your @file{ipsec.secrets}.  If not @code{#f}, then this and
@code{ipsec-conf} must both be strings.

@end table
@end deftp

@subsubheading Wireguard

@defvr {Scheme Variable} wireguard-service-type
A service type for a Wireguard tunnel interface.  Its value must be a
@code{wireguard-configuration} record as in this example:

@lisp
(service wireguard-service-type
         (wireguard-configuration
          (peers
           (list
            (wireguard-peer
             (name "my-peer")
             (endpoint "my.wireguard.com:51820")
             (public-key "hzpKg9X1yqu1axN6iJp0mWf6BZGo8m1wteKwtTmDGF4=")
             (allowed-ips '("10.0.0.2/32")))))))
@end lisp

@end defvr

@deftp {Data Type} wireguard-configuration
Data type representing the configuration of the Wireguard service.

@table @asis
@item @code{wireguard}
The wireguard package to use for this service.

@item @code{interface} (default: @code{"wg0"})
The interface name for the VPN.

@item @code{addresses} (default: @code{'("10.0.0.1/32")})
The IP addresses to be assigned to the above interface.

@item @code{port} (default: @code{51820})
The port on which to listen for incoming connections.

@item @code{dns} (default: @code{#f})
The DNS server(s) to announce to VPN clients via DHCP.

@item @code{private-key} (default: @code{"/etc/wireguard/private.key"})
The private key file for the interface.  It is automatically generated if
the file does not exist.

@item @code{peers} (default: @code{'()})
The authorized peers on this interface.  This is a list of
@var{wireguard-peer} records.

@item @code{pre-up} (default: @code{'()})
The script commands to be run before setting up the interface.

@item @code{post-up} (default: @code{'()})
The script commands to be run after setting up the interface.

@item @code{pre-down} (default: @code{'()})
The script commands to be run before tearing down the interface.

@item @code{post-down} (default: @code{'()})
The script commands to be run after tearing down the interface.

@item @code{table} (default: @code{"auto"})
The routing table to which routes are added, as a string.  There are two
special values: @code{"off"} that disables the creation of routes
altogether, and @code{"auto"} (the default) that adds routes to the default
table and enables special handling of default routes.

@end table
@end deftp

@deftp {Data Type} wireguard-peer
Data type representing a Wireguard peer attached to a given interface.

@table @asis
@item @code{name}
The peer name.

@item @code{endpoint} (default: @code{#f})
The optional endpoint for the peer, such as
@code{"demo.wireguard.com:51820"}.

@item @code{public-key}
The peer public-key represented as a base64 string.

@item @code{allowed-ips}
A list of IP addresses from which incoming traffic for this peer is allowed
and to which incoming traffic for this peer is directed.

@item @code{keep-alive} (default: @code{#f})
An optional time interval in seconds.  A packet will be sent to the server
endpoint once per time interval.  This helps receiving incoming connections
from this peer when you are behind a NAT or a firewall.

@end table
@end deftp

@node Sistema de archivos en red
@subsection Sistema de archivos en red
@cindex NFS

El módulo @code{(gnu services nfs)} proporciona los siguientes servicios,
que se usan habitualmente en relación con el montado o la exportación de
árboles de directorios como @dfn{sistemas de archivos en red} (NFS).

Mientras que es posible usar los componentes individuales de forma conjunta
para proporcionar un servicio del sistema de archivos en red NFS,
recomendamos la configuración de un servidor NFS mediante
@code{nfs-service-type}.

@subsubheading Servicio NFS
@cindex NFS, servidor

El servicio NFS se hace cargo de configurar todos los servicios de
componentes de NFS, la configuración del núcleo de sistemas de archivos e
instala los archivos de configuración en las rutas que NFS espera.

@defvr {Variable Scheme} nfs-service-type
Este es el tipo de datos para un servidor NFS completo.
@end defvr

@deftp {Tipo de datos} nfs-configuration
Este tipo de datos representa la configuración del servicio NFS y todos sus
subsistemas.

Tiene los siguientes parámetros:
@table @asis
@item @code{nfs-utils} (predeterminado: @code{nfs-utils})
El paquete nfs-utils usado.

@item @code{nfs-versions} (predeterminadas: @code{'("4.2" "4.1" "4.0")})
Si se proporciona como valor una lista de cadenas, el daemon
@command{rpc.nfsd} se limitará a la implementación de las versiones del
protocolo NFS proporcionadas.

@item @code{exports} (predeterminada: @code{'()})
Una lista de directorios que el servidor NFS debe exportar. Cada entrada es
una lista que consiste en dos elementos: un nombre de directorio y una
cadena que contiene todas las opciones. Este es un ejemplo en el que el
directorio @file{/exportado} se proporciona a todos los clientes NFS en modo
de solo-lectura:

@lisp
(nfs-configuration
 (exports
  '(("/exportado"
     "*(ro,insecure,no_subtree_check,crossmnt,fsid=0)"))))
@end lisp

@item @code{rpcmountd-port} (predeterminado: @code{#f})
El puerto de red que el daemon @command{rpc.mountd} debe usar.

@item @code{rpcstatd-port} (predeterminado: @code{#f})
El puerto de red que el daemon @command{rpc.statd} debe usar.

@item @code{rpcbind} (predeterminado: @code{rpcbind})
El paquete rpcbind usado.

@item @code{idmap-domain} (predeterminado: @code{"localdomain"})
El nombre de dominio local de NFSv4.

@item @code{nfsd-port} (predeterminado: @code{2049})
El puerto de red que el daemon @command{nfsd} debe usar.

@item @code{nfsd-threads} (predeterminado: @code{8})
Número de hilos usados en el daemon @command{nfsd}.

@item @code{nfsd-tcp?} (predeterminado: @code{#t})
Determina si el daemon @command{nfsd} debe escuchar en un puerto TCP.

@item @code{nfsd-udp?} (predeterminado: @code{#f})
Determina si el daemon @command{nfsd} debe escuchar en un puerto UDP.

@item @code{pipefs-directory} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
El directorio donde el sistema de archivos pipefs debe montarse.

@item @code{debug} (predeterminada: @code{'()"})
Una lista de subsistemas para los cuales debe activarse la salida de
depuración. Es una lista de símbolos. Cualquiera de estos símbolos son
válidos: @code{nfsd}, @code{nfs}, @code{rpc}, @code{idmap}, @code{statd} o
@code{mountd}.
@end table
@end deftp

Si no necesita un servicio NFS completo o prefiere construirlo por su cuenta
puede usar los componentes individuales que se documentan a continuación.

@subsubheading Servicio RPC Bind
@cindex rpcbind

El servicio RPC Bind proporciona una forma de asociar números de programa
con direcciones universales. Muchos servicios relacionados con NFS usan esta
característica. De ahí que se inicie automáticamente cuando un servicio
dependiente se inicia.

@defvr {Variable Scheme} rpcbind-service-type
Un tipo de servicio para el daemon de asignación de puertos RPC.
@end defvr


@deftp {Tipo de datos} rpcbind-configuration
Tipo de datos que representa la configuración del servicio RPC Bind. Este
tipo tiene los siguientes parámetros:
@table @asis
@item @code{rpcbind} (predeterminado: @code{rpcbind})
El paquete rpcbind usado.

@item @code{warm-start?} (predeterminado: @code{#t})
Si este parámetro es @code{#t}, el daemon leerá el archivo de estado durante
el arranche, por tanto recargando la información del estado almacenada por
la instancia previa.
@end table
@end deftp


@subsubheading Pseudo-sistema de archivos pipefs
@cindex pipefs
@cindex rpc_pipefs

El sistema de archivos pipefs se usa para transferir datos relacionados con
NFS entre el núcleo y los programas de espacio de usuaria.

@defvr {Variable Scheme} pipefs-service-type
Un tipo de servicio para el pseudo-sistema de archivos pipefs.
@end defvr

@deftp {Tipo de datos} pipefs-configuration
Tipo de datos que representa la configuración del servicio del
pseudo-sistema de archivos pipefs. Este tipo tiene los siguientes
parámetros:
@table @asis
@item @code{mount-point} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
El directorio al que se debe asociar el sistema de archivos.
@end table
@end deftp


@subsubheading Servicio del daemon GSS
@cindex GSSD
@cindex GSS
@cindex sistema de seguridad global (GSS)

El daemon @dfn{sistema de seguridad global} (GSS) proporciona fuertes
garantías de seguridad para protocolos basados en RPC. Antes de intercambiar
peticiones RPC el cliente debe establecer un contexto de
seguridad. Habitualmente esto se lleva a cabo con el uso de la orden
@command{kinit}o automáticamente durante el ingreso al sistema mediante el
uso de servicios PAM (@pxref{Servicios Kerberos}).

@defvr {Variable Scheme} gss-service-type
Un tipo de servicio para el daemon del sistema de seguridad global (GSS).
@end defvr

@deftp {Tipo de datos} gss-configuration
Tipo de datos que representa la configuración del servicio del daemon
GSS. Este tipo tiene los siguientes parámetros:
@table @asis
@item @code{nfs-utils} (predeterminado: @code{nfs-utils})
Paquete en el que se encuentra la orden @command{rpc.gssd}.

@item @code{pipefs-directory} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
El directorio donde el sistema de archivos pipefs debe montarse.

@end table
@end deftp


@subsubheading Servicio del daemon IDMAP
@cindex idmapd
@cindex servicio de asociación de nombres

El servicio del daemon idmap proporciona una asociación entre
identificadores de usuaria y nombres de usuaria. Habitualmente es necesario
para acceder sistemas de archivos montados con NFSv4.

@defvr {Variable Scheme} idmap-service-type
Un tipo de servicio para el daemon de asociación de identidades (IDMAP).
@end defvr

@deftp {Tipo de datos} idmap-configuration
Tipo de datos que representa la configuración del servicio del daemon
IDMAP. Este tipo tiene los siguientes parámetros:
@table @asis
@item @code{nfs-utils} (predeterminado: @code{nfs-utils})
Paquete en el que se encuentra la orden @command{rpc.idmapd}.

@item @code{pipefs-directory} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
El directorio donde el sistema de archivos pipefs debe montarse.

@item @code{domain} (predeterminado: @code{#f})
El nombre de dominio local de NFSv4. Debe ser una cadena o @code{#f}. Si es
@code{#f} el daemon usará el nombre de dominio totalmente cualificado de la
máquina.

@item @code{verbosity} (predeterminado: @code{0})
El nivel de información de los mensajes del daemon.

@end table
@end deftp

@node Samba Services, Integración continua, Sistema de archivos en red, Servicios
@subsection Samba Services

@cindex Samba
@cindex SMB
The @code{(gnu services samba)} module provides service definitions for
Samba as well as additional helper services.  Currently it provides the
following services.

@subsubheading Samba

@uref{https://www.samba.org, Samba} provides network shares for folders and
printers using the SMB/CIFS protocol commonly used on Windows.  It can also
act as an Active Directory Domain Controller (AD DC) for other hosts in an
heterougenious network with different types of Computer systems.

@defvar {Scheme variable} samba-service-type

The service type to enable the samba services @code{samba}, @code{nmbd},
@code{smbd} and @code{winbindd}.  By default this service type does not run
any of the Samba daemons; they must be enabled individually.

Below is a basic example that configures a simple, anonymous
(unauthenticated) Samba file share exposing the @file{/public} directory.

@quotation Tip
The @file{/public} directory and its contents must be world
readable/writable, so you'll want to run @samp{chmod -R 777 /public} on it.
@end quotation

@quotation Caution
Such a Samba configuration should only be used in controlled environments,
and you should not share any private files using it, as anyone connecting to
your network would be able to access them.
@end quotation

@lisp
(service samba-service-type (samba-configuration
                             (enable-smbd? #t)
                             (config-file (plain-file "smb.conf" "\
[global]
map to guest = Bad User
logging = syslog@@1

[public]
browsable = yes
path = /public
read only = no
guest ok = yes
guest only = yes\n"))))
@end lisp

@end defvar

@deftp{Data Type} samba-service-configuration Configuration record for the
Samba suite.

@table @asis
@item @code{package} (default: @code{samba})
The samba package to use.

@item @code{config-file} (predeterminado: @code{#f})
The config file to use.  To learn about its syntax, run @samp{man smb.conf}.

@item @code{enable-samba?} (default: @code{#f})
Enable the @code{samba} daemon.

@item @code{enable-smbd?} (default: @code{#f})
Enable the @code{smbd} daemon.

@item @code{enable-nmbd?} (default: @code{#f})
Enable the @code{nmbd} daemon.

@item @code{enable-winbindd?} (default: @code{#f})
Enable the @code{winbindd} daemon.

@end table
@end deftp

@cindex wsdd, Web service discovery daemon
@subsubheading Web Service Discovery Daemon

The @acronym{WSDD, Web Service Discovery daemon} implements the
@uref{http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html,
Web Services Dynamic Discovery} protocol that enables host discovery over
Multicast DNS, similar to what Avahi does.  It is a drop-in replacement for
SMB hosts that have had SMBv1 disabled for security reasons.

@defvr {Scheme Variable} wsdd-service-type
Service type for the WSD host daemon.  The value for this service type is a
@code{wsdd-configuration} record.  The details for the
@code{wsdd-configuration} record type are given below.
@end defvr

@deftp {Data Type} wsdd-configuration
This data type represents the configuration for the wsdd service.

@table @asis

@item @code{package} (default: @code{wsdd})
The wsdd package to use.

@item @code{ipv4only?} (default: @code{#f})
Only listen to IPv4 addresses.

@item @code{ipv6only} (default: @code{#f})
Only listen to IPv6 addresses.  Please note: Activating both options is not
possible, since there would be no IP versions to listen to.

@item @code{chroot} (predeterminado: @code{#f})
Chroot into a separate directory to prevent access to other directories.
This is to increase security in case there is a vulnerability in
@command{wsdd}.

@item @code{hop-limit} (default: @code{1})
Limit to the level of hops for multicast packets.  The default is @var{1}
which should prevent packets from leaving the local network.

@item @code{interface} (default: @code{'()})
Limit to the given list of interfaces to listen to.  By default wsdd will
listen to all interfaces.  Except the loopback interface is never used.

@item @code{uuid-device} (default: @code{#f})
The WSD protocol requires a device to have a UUID.  Set this to manually
assign the service a UUID.

@item @code{domain} (predeterminado: @code{#f})
Notify this host is a member of an Active Directory.

@item @code{host-name} (predeterminado: @code{#f})
Manually set the hostname rather than letting @command{wsdd} inherit this
host's hostname.  Only the host name part of a possible FQDN will be used in
the default case.

@item @code{preserve-case?} (default: @code{#f})
By default @command{wsdd} will convert the hostname in workgroup to all
uppercase.  The opposite is true for hostnames in domains.  Setting this
parameter will preserve case.

@item @code{workgroup} (default: @var{"WORKGROUP"})
Change the name of the workgroup.  By default @command{wsdd} reports this
host being member of a workgroup.

@end table
@end deftp

@node Integración continua
@subsection Integración continua

@cindex integración continua
@uref{https://guix.gnu.org/cuirass/, Cuirass} is a continuous integration
tool for Guix.  It can be used both for development and for providing
substitutes to others (@pxref{Sustituciones}).

El módulo @code{(gnu services cuirass)} proporciona el siguiente servicio.

@defvr {Procedimiento Scheme} cuirass-service-type
El tipo del servicio Cuirass. Su valor debe ser un objeto
@code{cuirass-configuration}, como se describe a continuación.
@end defvr

To add build jobs, you have to set the @code{specifications} field of the
configuration.  For instance, the following example will build all the
packages provided by the @code{my-channel} channel.

@lisp
(define %cuirass-specs
  #~(list (specification
           (name "my-channel")
           (build '(channels my-channel))
           (channels
            (cons (channel
                   (name 'my-channel)
                   (url "https://my-channel.git"))
                  %default-channels)))))

(service cuirass-service-type
         (cuirass-configuration
          (specifications %especificacion-de-cuirass)))
@end lisp

To build the @code{linux-libre} package defined by the default Guix channel,
one can use the following configuration.

@lisp
(define %cuirass-specs
  #~(list (specification
           (name "my-linux")
           (build '(packages "linux-libre")))))

(service cuirass-service-type
         (cuirass-configuration
          (specifications %especificacion-de-cuirass)))
@end lisp

The other configuration possibilities, as well as the specification record
itself are described in the Cuirass manual (@pxref{Specifications,,,
cuirass, Cuirass}).

Mientras que la información de los trabajos de construcción se encuentra
directamente en las especificaciones, la configuración global del proceso
@command{cuirass} está accesible en otros campos de
@code{cuirass-configuration}.

@deftp {Tipo de datos} cuirass-configuration
Tipo de datos que representa la configuración de Cuirass.

@table @asis
@item @code{cuirass} (predeterminado: @code{cuirass})
El paquete Cuirass usado.

@item @code{log-file} (predeterminado: @code{"/var/log/cuirass.log"})
Localización del archivo de registro.

@item @code{web-log-file} (predeterminado: @code{"/var/log/cuirass-web.log"})
Localización del archivo de registro usado por la interfaz web.

@item @code{cache-directory} (predeterminado: @code{"/var/cache/cuirass"})
Localización de la caché del repositorio.

@item @code{user} (predeterminado: @code{"cuirass"})
Propietaria del proceso @code{cuirass}.

@item @code{group} (predeterminado: @code{"cuirass"})
Grupo propietario del proceso @code{cuirass}.

@item @code{interval} (predeterminado: @code{60})
Número de segundos entre las consulta de repositorios seguida de los
trabajos de Cuirass.

@item @code{parameters} (default: @code{#f})
Read parameters from the given @var{parameters} file.  The supported
parameters are described here (@pxref{Parameters,,, cuirass, Cuirass}).

@item @code{remote-server} (default: @code{#f})
A @code{cuirass-remote-server-configuration} record to use the build remote
mechanism or @code{#f} to use the default build mechanism.

@item @code{database} (default: @code{"dbname=cuirass host=/var/run/postgresql"})
Use @var{database} as the database containing the jobs and the past build
results. Since Cuirass uses PostgreSQL as a database engine, @var{database}
must be a string such as @code{"dbname=cuirass host=localhost"}.

@item @code{port} (predeterminado: @code{8081})
Número de puerto usado por el servidor HTTP.

@item @code{host} (predeterminado: @code{"localhost"})
Escucha en la interfaz de red de la dirección @var{host}. El comportamiento
predeterminado es aceptar conexiones desde la red local.

@item @code{specifications} (predeterminada: @code{#~'()})
A gexp (@pxref{Expresiones-G}) that evaluates to a list of specifications
records.  The specification record is described in the Cuirass manual
(@pxref{Specifications,,, cuirass, Cuirass}).

@item @code{use-substitutes?} (predeterminado: @code{#f})
Permite el uso de sustituciones para evitar la construcción desde las
fuentes de todas las dependencias de un trabajo.

@item @code{one-shot?} (predeterminado: @code{#f})
Evalúa las especificaciones y construye las derivaciones solo una vez.

@item @code{fallback?} (predeterminado: @code{#f})
Cuando la sustitución de un binario preconstruido falle, se intentará la
construcción local de los paquetes.

@item @code{extra-options} (predeterminadas: @code{'()})
Opciones adicionales proporcionadas a los procesos de Cuirass.

@end table
@end deftp

@cindex remote build
@subsubheading Cuirass remote building

Cuirass supports two mechanisms to build derivations.

@itemize
@item Using the local Guix daemon.
This is the default build mechanism.  Once the build jobs are evaluated,
they are sent to the local Guix daemon.  Cuirass then listens to the Guix
daemon output to detect the various build events.

@item Using the remote build mechanism.
The build jobs are not submitted to the local Guix daemon.  Instead, a
remote server dispatches build requests to the connect remote workers,
according to the build priorities.

@end itemize

To enable this build mode a @code{cuirass-remote-server-configuration}
record must be passed as @code{remote-server} argument of the
@code{cuirass-configuration} record.  The
@code{cuirass-remote-server-configuration} record is described below.

This build mode scales way better than the default build mode.  This is the
build mode that is used on the GNU Guix build farm at
@url{https://ci.guix.gnu.org}.  It should be preferred when using Cuirass to
build large amount of packages.

@deftp {Data Type} cuirass-remote-server-configuration
Data type representing the configuration of the Cuirass remote-server.

@table @asis
@item @code{backend-port} (default: @code{5555})
The TCP port for communicating with @code{remote-worker} processes using
ZMQ.  It defaults to @code{5555}.

@item @code{log-port} (default: @code{5556})
The TCP port of the log server.  It defaults to @code{5556}.

@item @code{publish-port} (default: @code{5557})
The TCP port of the publish server.  It defaults to @code{5557}.

@item @code{log-file} (default: @code{"/var/log/cuirass-remote-server.log"})
Localización del archivo de registro.

@item @code{cache} (default: @code{"/var/cache/cuirass/remote"})
Use @var{cache} directory to cache build log files.

@item @code{trigger-url} (default: @code{#f})
Once a substitute is successfully fetched, trigger substitute baking at
@var{trigger-url}.

@item @code{publish?} (predeterminado: @code{#t})
If set to false, do not start a publish server and ignore the
@code{publish-port} argument.  This can be useful if there is already a
standalone publish server standing next to the remote server.

@item @code{public-key}
@item @code{private-key}
Usa los @var{archivo}s específicos como el par de claves pública y privada
usadas para firmar los elementos del almacén publicados.

@end table
@end deftp

At least one remote worker must also be started on any machine of the local
network to actually perform the builds and report their status.

@deftp {Data Type} cuirass-remote-worker-configuration
Data type representing the configuration of the Cuirass remote-worker.

@table @asis
@item @code{cuirass} (predeterminado: @code{cuirass})
El paquete Cuirass usado.

@item @code{workers} (default: @code{1})
Start @var{workers} parallel workers.

@item @code{server} (predeterminada: @code{#f})
Do not use Avahi discovery and connect to the given @code{server} IP address
instead.

@item @code{systems} (default: @code{(list (%current-system))})
Only request builds for the given @var{systems}.

@item @code{log-file} (default: @code{"/var/log/cuirass-remote-worker.log"})
Localización del archivo de registro.

@item @code{publish-port} (default: @code{5558})
The TCP port of the publish server.  It defaults to @code{5558}.

@item @code{substitute-urls} (predeterminado: @code{%default-substitute-urls})
La lista de URLs donde se buscarán sustituciones por defecto.

@item @code{public-key}
@item @code{private-key}
Usa los @var{archivo}s específicos como el par de claves pública y privada
usadas para firmar los elementos del almacén publicados.

@end table
@end deftp

@subsubheading Laminar

@uref{https://laminar.ohwg.net/, Laminar} is a lightweight and modular
Continuous Integration service.  It doesn't have a configuration web UI
instead uses version-controllable configuration files and scripts.

Laminar encourages the use of existing tools such as bash and cron instead
of reinventing them.

@defvr {Scheme Procedure} laminar-service-type
The type of the Laminar service.  Its value must be a
@code{laminar-configuration} object, as described below.

All configuration values have defaults, a minimal configuration to get
Laminar running is shown below. By default, the web interface is available
on port 8080.

@lisp
(service laminar-service-type)
@end lisp
@end defvr

@deftp {Data Type} laminar-configuration
Data type representing the configuration of Laminar.

@table @asis
@item @code{laminar} (default: @code{laminar})
The Laminar package to use.

@item @code{home-directory} (default: @code{"/var/lib/laminar"})
The directory for job configurations and run directories.

@item @code{bind-http} (default: @code{"*:8080"})
The interface/port or unix socket on which laminard should listen for
incoming connections to the web frontend.

@item @code{bind-rpc} (default: @code{"unix-abstract:laminar"})
The interface/port or unix socket on which laminard should listen for
incoming commands such as build triggers.

@item @code{title} (default: @code{"Laminar"})
The page title to show in the web frontend.

@item @code{keep-rundirs} (default: @code{0})
Set to an integer defining how many rundirs to keep per job.  The
lowest-numbered ones will be deleted.  The default is 0, meaning all run
dirs will be immediately deleted.

@item @code{archive-url} (default: @code{#f})
The web frontend served by laminard will use this URL to form links to
artefacts archived jobs.

@item @code{base-url} (default: @code{#f})
Base URL to use for links to laminar itself.

@end table
@end deftp

@node Servicios de gestión de energía
@subsection Servicios de gestión de energía

@cindex tlp
@cindex gestión de energía con TLP
@subsubheading Daemon TLP

El módulo @code{(gnu services pm)} proporciona una definición de servicio
Guix para la herramienta de gestión de energía de Linux TLP.

TLP activa varios modos de ahorro de energía en el núcleo y en espacio de
usuaria. Al contrario que @code{upower-service}, no es una herramienta de
monitorización pasiva, puesto que aplicará una nueva configuración
personalizada cada vez que se detecte una nueva fuente de
energía/alimentación. Puede encontrar más información en
@uref{https://linrunner.de/en/tlp/tlp.html, la página de TLP}.

@deffn {Variable Scheme} tlp-service-type
EL tipo de servicio para la herramienta TLP. La configuración predeterminada
está optimizada para la vida de la batería en la mayoría de los sistemas,
pero puede modificarla al completo con las opciones que desee proporcionando
un objeto @code{tlp-configuration} válido:
@lisp
(service tlp-service-type
         (tlp-configuration
          (cpu-scaling-governor-on-ac (list "performance"))
          (sched-powersave-on-bat? #t)))
@end lisp
@end deffn

Each parameter definition is preceded by its type; for example,
@samp{boolean foo} indicates that the @code{foo} parameter should be
specified as a boolean.  Types starting with @code{maybe-} denote parameters
that won't show up in TLP config file when their value is left unset, or is
explicitly set to the @code{%unset-value} value.

@c The following documentation was initially generated by
@c (generate-tlp-documentation) in (gnu services pm).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as TLP updates.

Los campos disponibles de @code{tlp-configuration} son:

@deftypevr {parámetro de @code{tlp-configuration}} package tlp
El paquete TLP.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean tlp-enable?
Proporcione un valor verdadero si desea activar TLP.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string tlp-default-mode
Modo predeterminado cuando no se puede detectar una fuente de
alimentación. Las alternativas son AC (corriente alterna) y BAT (batería).

El valor predeterminado es @samp{"AC"} (corriente alterna).

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo disk-idle-secs-on-ac
Número de segundos que el núcleo Linux debe esperar desde que el disco se
queda en espera, antes de sincronizar en corriente alterna (AC).

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo disk-idle-secs-on-bat
Igual que @code{disk-idle-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{2}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo max-lost-work-secs-on-ac
Periodicidad de la evacuación de las páginas sucias, expresada en segundos.

El valor predeterminado es @samp{15}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo max-lost-work-secs-on-bat
Igual que @code{max-lost-work-secs-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{60}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios cpu-scaling-governor-on-ac
Gobernador de escalado de frecuencia del procesador en modo de corriente
alterna (AC). Con el controlador intel_pstate, las alternativas son
``powersave'' (ahorro de energía) y ``performance'' (rendimiento). Con el
controlador acpi-cpufreq, las alternativas son ``ondemand'' (bajo demanda),
``powersave'', ``performance'' y ``conservative'' (conservativo).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios cpu-scaling-governor-on-bat
Igual que @code{max-lost-work-secs-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-scaling-min-freq-on-ac
Establece la frecuencia mínima disponible para el controlador de escalado en
AC.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-scaling-max-freq-on-ac
Establece la frecuencia máxima disponible para el controlador de escalado en
AC.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-scaling-min-freq-on-bat
Establece la frecuencia mínima disponible para el controlador de escalado en
BAT.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-scaling-max-freq-on-bat
Establece la frecuencia máxima disponible para el controlador de escalado en
BAT.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-min-perf-on-ac
Limita el estado-P mínimo para controlar la disipación de potencia del
procesador en modo AC. Los valores se indican como un porcentaje de
rendimiento disponible.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-max-perf-on-ac
Limita el estado-P máximo para controlar la disipación de potencia del
procesador en modo AC. Los valores se indican como un porcentaje de
rendimiento disponible.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-min-perf-on-bat
Igual que @code{cpu-min-perf-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-entero-no-negativo cpu-max-perf-on-bat
Igual que @code{cpu-max-perf-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-boolean cpu-boost-on-ac?
Activa la característica ``turbo boost'' del procesador en modo AC
(corriente alterna).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-boolean cpu-boost-on-bat?
Igual que @code{cpu-boost-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean sched-powersave-on-ac?
Permite al núcleo Linux minimizar el número de núcleos/hyper-thread del
procesador usados bajo condiciones de baja carga.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean sched-powersave-on-bat?
Igual que @code{sched-powersave-on-ac?} pero en modo BAT (batería).

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean nmi-watchdog?
Activa el proceso guardián (watchdog) NMI del núcleo Linux.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-string phc-controls
Para núcleos Linux con el parche PHC aplicado, cambia los voltajes del
procesador. Un valor de ejemplo sería @samp{"F:V F:V F:V F:V"}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string energy-perf-policy-on-ac
Set CPU performance versus energy saving policy on AC@.  Alternatives are
performance, normal, powersave.

El valor predeterminado es @samp{"performance"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string energy-perf-policy-on-bat
Igual que @code{energy-perf-policy-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"powersave"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} lista-cadena-separada-espacios disks-devices
Dispositivos de disco duro.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} lista-cadena-separada-espacios disk-apm-level-on-ac
Nivel de APM (gestión avanzada de energía) del disco duro.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} lista-cadena-separada-espacios disk-apm-level-on-bat
Igual que @code{disk-apm-bat} pero en modo BAT (batería).

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios disk-spindown-timeout-on-ac
Plazo para la parada rotacional del disco duro. Se debe especificar un valor
por cada disco duro declarado.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios disk-spindown-timeout-on-bat
Igual que @code{disk-spindown-timeout-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios disk-iosched
Selecciona el planificador de E/S para dispositivos de disco. Se debe
especificar un valor por cada disco duro declarado. Ejemplos de alternativas
son ``cfq'', ``deadline'' y ``noop''.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string sata-linkpwr-on-ac
Nivel de gestión agresiva de energía del enlace (ALPM) de SATA. Las
alternativas son ``min_power'' (energía mínima), ``medium_power'' (energía
media) y ``max_performance'' (máximo rendimiento).

El valor predeterminado es @samp{"max_performance"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string sata-linkpwr-on-bat
Igual que @code{sata-linkpwr-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"min_power"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-string sata-linkpwr-blacklist
Excluye los dispositivos SATA especificados de la gestión de energía del
enlace.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-on-off-boolean ahci-runtime-pm-on-ac?
Activa la gestión de energía de tiempo de ejecución para controladores AHCI
y discos en modo AC.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-on-off-boolean ahci-runtime-pm-on-bat?
Igual que @code{ahci-runtime-pm-on-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo ahci-runtime-pm-timeout
Segundos de inactividad antes de suspender el disco.

El valor predeterminado es @samp{15}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string pcie-aspm-on-ac
Nivel de gestión de energía de estado activo de PCI Express. Las
alternativas son ``default'' (predeterminado), ``performance'' (rendimiento)
y ``powersave'' (ahorro de energía).

El valor predeterminado es @samp{"performance"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string pcie-aspm-on-bat
Igual que @code{pcie-aspm-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"powersave"}.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer start-charge-thresh-bat0
Percentage when battery 0 should begin charging.  Only supported on some
laptops.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer stop-charge-thresh-bat0
Percentage when battery 0 should stop charging.  Only supported on some
laptops.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer start-charge-thresh-bat1
Percentage when battery 1 should begin charging.  Only supported on some
laptops.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer stop-charge-thresh-bat1
Percentage when battery 1 should stop charging.  Only supported on some
laptops.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-power-profile-on-ac
Nivel de velocidad de reloj de gráficos Radeon. Las alternativas son ``low''
(bajo), ``mid'' (medio), ``high'' (alto), ``auto'' (automático) y
``default'' (predeterminado).

El valor predeterminado es @samp{"high"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-power-profile-on-bat
Igual que @code{radeon-power-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"low"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-dpm-state-on-ac
Método de gestión de energía dinámica (DPM) de Radeon. Las alternativas son
``battery'' (batería) y ``performance'' (rendimiento).

El valor predeterminado es @samp{"performance"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-dpm-state-on-bat
Igual que @code{radeon-dpm-state-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"battery"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-dpm-perf-level-on-ac
Nivel de rendimiento del DPM de Radeon. Las alternativas son ``auto''
(automático), ``low'' (bajo) y ``high'' (alto).

El valor predeterminado es @samp{"auto"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string radeon-dpm-perf-level-on-bat
Igual que @code{radeon-dpm-perf-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"auto"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} on-off-boolean wifi-pwr-on-ac?
Modo de ahorro de energía de Wifi.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} on-off-boolean wifi-pwr-on-bat?
Igual que @code{wifi-power-ac?} pero en modo BAT (batería).

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} y-n-boolean wol-disable?
Desactiva el encendido desde la red local (wake on LAN).

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo sound-power-save-on-ac
Duración en segundos del plazo antes de activar el ahorro de energía de
audio en dispositivos Intel HDA y AC97. El valor 0 desactiva el ahorro de
energía.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} entero-no-negativo sound-power-save-on-bat
Igual que @code{sound-powersave-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{1}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} y-n-boolean sound-power-save-controller?
Desactiva el controlador en modo de ahorro de energía en dispositivos Intel
HDA.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean bay-poweroff-on-bat?
Activa las unidades ópticas en UltraBay/MediaBay en modo BAT. La unidad
puede volver a alimentarse liberando (y reinsertando) la palanca de eyección
o presionando el botón de eyección de disco en modelos más modernos.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string bay-device
Nombre de la unidad de dispositivos ópticos a apagar.

El valor predeterminado es @samp{"sr0"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string runtime-pm-on-ac
Gestión de energía en tiempo de ejecución para dispositivos de bus
PCI(e). Las alternativas son ``on'' y ``auto''.

El valor predeterminado es @samp{"on"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} string runtime-pm-on-bat
Igual que @code{runtime-pm-ac} pero en modo BAT (batería).

El valor predeterminado es @samp{"auto"}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean runtime-pm-all?
Gestión de energía en tiempo de ejecución (Runtime Power Management) para
todos los dispositivos del bus PCI(e), excepto los excluidos.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-lista-cadena-separada-espacios runtime-pm-blacklist
Excluye las direcciones de dispositivo PCI(e) especificadas de la gestión de
energía en tiempo de ejecución (Runtime Power Management).

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} lista-cadena-separada-espacios runtime-pm-driver-blacklist
Excluye los dispositivos PCI(e) asignados a los controladores especificados
de la gestión de energía en tiempo de ejecución (Runtime Power Management).

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean usb-autosuspend?
Permite la suspensión automática de USB.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-string usb-blacklist
Excluye los dispositivos especificados de la suspensión automática de USB.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean usb-blacklist-wwan?
Excluye los dispositivos WWAN de la suspensión automática de USB.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-string usb-whitelist
Incluye los dispositivos especificados en la suspensión automática de USB,
incluso cuando están excluidos por el controlador o a través de
@code{usb-blacklist-wwan?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} maybe-boolean usb-autosuspend-disable-on-shutdown?
Activa la suspensión automática de USB antes del apagado.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{tlp-configuration}} boolean restore-device-state-on-startup?
Restablece el estado de los dispositivos de radio (bluetooth, wifi, wwan)
previo al apagado durante el arranque del sistema.

El valor predeterminado es @samp{#f}

@end deftypevr

@cindex thermald
@cindex escalado de frecuencia de la CPU con thermald
@subsubheading Daemon Thermald

El módulo @code{(gnu services pm)} proporciona una interfaz con thermald, un
servicio de escalado de frecuencia de la CPU que ayuda a prevenir el
sobrecalentamiento.

@defvr {Variable Scheme} thermald-service-type
Este es el tipo de servicio para @uref{https://01.org/linux-thermal-daemon/,
thermald}, el daemon Thermal de Linux, que es responsable del control del
estado térmico de los procesadores y la prevención del sobrecalentamiento.
@end defvr

@deftp {Tipo de datos} thermald-configuration
Tipo de datos que representa la configuración de
@code{thermald-service-type}.

@table @asis
@item @code{adaptive?} (default: @code{#f})
Use @acronym{DPTF, Dynamic Power and Thermal Framework} adaptive tables when
present.

@item @code{ignore-cpuid-check?} (predeterminado: @code{#f})
Ignora la comprobación de cpuid durante la comprobación de procesadores
permitidos.

@item @code{thermald} (predeterminado: @var{thermald})
El objeto paquete de thermald.

@end table
@end deftp

@node Servicios de audio
@subsection Servicios de audio

El módulo @code{(gnu services audio)} proporciona un servicio para iniciar
MPD (el daemon de reproducción de música).

@cindex mpd
@subsubheading Daemon de reproducción de música (MPD)

El daemon de reproducción de música (MPD) es un servicio que puede
reproducir música mientras se controla desde la máquina local o sobre una
red por una multitud de clientes.

El siguiente ejemplo muestra como se puede ejecutar @code{mpd} como
@code{"rober"} en el puerto @code{6666}. Usa pulseaudio para su salida.

@lisp
(service mpd-service-type
         (mpd-configuration
          (user "rober")
          (port "6666")))
@end lisp

@defvr {Variable Scheme} mpd-service-type
El tipo de servicio para @command{mpd}.
@end defvr

@deftp {Tipo de datos} mpd-configuration
Tipo de datos que representa la configuración de @command{mpd}.

@table @asis
@item @code{user} (predeterminada: @code{"mpd"})
Usuaria que ejecuta mpd.

@item @code{music-dir} (predeterminado: @code{"~/Music"})
El directorio para buscar archivos de música.

@item @code{playlist-dir} (predeterminado: @code{"~/.mpd/playlists"})
El directorio para almacenar listas de reproducción.

@item @code{db-file} (predeterminado: @code{"~/.mpd/tag_cache"})
La localización de la base de datos de música.

@item @code{state-file} (predeterminado: @code{"~/.mpd/state"})
La localización del archivo que almacena el estado actual de MPD.

@item @code{sticker-file} (predeterminado: @code{"~/.mpd/sticker.sql"})
La localización de la base de datos de pegatinas.

@item @code{port} (predeterminado: @code{"6600"})
Puerto sobre el que se ejecuta mpd.

@item @code{address} (predeterminada: @code{"any"})
Dirección a la que mpd se asociará. Para usar un socket de dominio de Unix
puede especificarse una ruta absoluta.

@item @code{outputs} (predeterminadas: @code{"(list (mpd-output))"})
Las salidas de audio que MPD puede usar. De manera predeterminada es una
salida de audio única usando pulseaudio.

@end table
@end deftp

@deftp {Tipo de datos} mpd-output
Tipo de datos que representa una salida de audio de @command{mpd}.

@table @asis
@item @code{name} (predeterminado: @code{"MPD"})
Nombre de la salida de audio.

@item @code{type} (predeterminado: @code{"pulse"})
Tipo de la salida de audio.

@item @code{enabled?} (predeterminado: @code{#t})
Especifica si esta salida de audio se activa cuando se inicia MPD. De manera
predeterminada se activan todas las salidas de audio. Esta es la
configuración predeterminada cuando no existe un archivo de estado; con un
archivo de estado se restaura el estado anterior.

@item @code{tags?} (predeterminado: @code{#t})
Si se proporciona el valor @code{#f} MPD no envia etiquetas a esta
salida. Es útil únicamente para módulos de salida que pueden recibir
etiquetas, por ejemplo el módulo de salida @code{httpd}.

@item @code{always-on?} (predeterminado: @code{#f})
If set to @code{#t}, then MPD attempts to keep this audio output always
open.  This may be useful for streaming servers, when you don’t want to
disconnect all listeners even when playback is accidentally stopped.

@item @code{mixer-type}
Este campo acepta un símbolo que especifica que mezclador debe usarse para
esta salida de audio: el mezclador @code{hardware}, el mezclador
@code{software}, el mezclador @code{null} (permite manejar el volumen pero
sin ningún efecto; puede usarse para implementar un mezclador externo) o
ningún mezclador (@code{none}).

@item @code{extra-options} (predeterminadas: @code{'()})
Una lista asociativa de símbolos de opción con valores de cadenas que se
añadirán al final de la configuración de las salidas de audio.

@end table
@end deftp

El ejemplo siguiente muestra una configuración de @code{mpd} que proporciona
una salida de retransmisión de audio por HTTP.

@lisp
(service mpd-service-type
         (mpd-configuration
           (outputs
             (list (mpd-output
                     (name "streaming")
                     (type "httpd")
                     (mixer-type 'null)
                     (extra-options
                      `((encoder . "vorbis")
                        (port    . "8080"))))))))
@end lisp


@node Servicios de virtualización
@subsection Servicios de virtualización

El módulo @code{(gnu services virtualization)} proporciona servicios para
los daemon libvirt y virtlog, así como otros servicios relacionados con la
virtualización.

@subsubheading Daemon de Libvirt

@code{libvirtd} is the server side daemon component of the libvirt
virtualization management system.  This daemon runs on host servers and
performs required management tasks for virtualized guests.

@deffn {Variable Scheme} libvirt-service-type
Este es el tipo para el @uref{https://libvirt.org, daemon de libvirt}. Su
valor debe ser un objeto @code{libvirt-configuration}.

@lisp
(service libvirt-service-type
         (libvirt-configuration
          (unix-sock-group "libvirt")
          (tls-port "16555")))
@end lisp
@end deffn

@c Auto-generated with (generate-libvirt-documentation)
Los campos disponibles de @code{libvirt-configuration} son:

@deftypevr {parámetro de @code{libvirt-configuration}} package libvirt
Paquete libvirt.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean listen-tls?
Opción para la escucha de conexiones seguras TLS en el puerto TCP/IP
público. Debe haberse proporcionado valor a @code{listen} para que tenga
algún efecto.

Es necesario configurar una autoridad de certificación (CA) y emitir
certificados de servidor antes de usar esta característica.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean listen-tcp?
Escucha de conexiones TCP sin cifrar en el puerto TCP/IP público. Debe
haberse proporcionado valor a @code{listen} para que tenga algún efecto.

El uso del socket TCP necesita de manera predeterminada identificación
SASL. Únicamente se permiten mecanismos SASL que implementen cifrado de
datos. Estos son DIGEST_MD5 y GSSAPI (Kerberos5).

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string tls-port
Puerto en el que se aceptan conexiones seguras. Puede ser un número de
puerto o un nombre de servicio.

El valor predeterminado es @samp{"16514"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string tcp-port
Puerto en el que se aceptan conexiones inseguras. Puede ser un número de
puerto o un nombre de servicio.

El valor predeterminado es @samp{"16509"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string listen-addr
Dirección IP o nombre de máquina usado para las conexiones de clientes.

El valor predeterminado es @samp{"0.0.0.0"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean mdns-adv?
Opción que determina el anuncio mDNS del servicio libvirt.

De manera alternativa puede desactivarse para todos los servicios en una
máquina parando el daemon Avahi.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string mdns-name
Nombre predeterminado del anuncio mDNS. Debe ser único en la red de
distribución inmediata.

El valor predeterminado es @samp{"Virtualization Host <hostname>"}.<

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string unix-sock-group
Grupo propietario del socket de dominio de UNIX. Puede usarse para permitir
a un conjunto de usuarias ``de confianza'' acceso a las funcionalidades de
gestión sin convertirse en root.

El valor predeterminado es @samp{"root"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string unix-sock-ro-perms
Permisos del socket UNIX de sólo lectura@footnote{R/O: Read-Only en
inglés.}. Se usa únicamente para monitorizar el estado de las máquinas
virtuales.

El valor predeterminado es @samp{"0777"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string unix-sock-rw-perms
Permisos del socket UNIX de lectura/escritura@footnote{R/W: Read-Write en
inglés.}. El valor predeterminado únicamente permite acceso a root. Si
PolicyKit se encuentra activo en el socket, el valor predeterminado cambiará
para permitir acceso universal (es decir, 0777).

El valor predeterminado es @samp{"0770"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string unix-sock-admin-perms
Permisos del socket UNIX de administración. El valor predeterminado
únicamente permite acceso a la propietaria (root), no lo cambie a menos que
esté completamente segura de a quién expone el acceso.

El valor predeterminado es @samp{"0777"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string unix-sock-dir
Directorio en el que los sockets se encuentran/crean.

El valor predeterminado es @samp{"/var/run/libvirt"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string auth-unix-ro
Esquema de identificación para los sockets de solo-lectura de UNIX. Los
permisos predeterminados del socket permiten la conexión de cualquier
usuaria.

El valor predeterminado es @samp{"polkit"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string auth-unix-rw
Esquema de identificación para los sockets de lectura/escritura de UNIX. Los
permisos predeterminados del socket permiten la conexión únicamente a
root. Si se activó en la compilación de libvirt la interoperabilidad con
PolicyKit, el valor predeterminado es usar la identificación ``policykit''.

El valor predeterminado es @samp{"polkit"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string auth-tcp
Esquema de identificación para los sockets TCP. Si no activa SASL, todo el
tráfico TCP estará en texto plano. No lo haga más allá de un escenario de
desarrollo/pruebas.

El valor predeterminado es @samp{"sasl"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string auth-tls
Esquema de identificación para los sockets TLS. Los sockets TLS ya se
encuentran cifrados gracias a la capa TLS, y una identificación limitada se
realiza con los certificados.

También es posible hacer uso de cualquier mecanismo de identificación SASL
proporcionando ``sasl'' en esta opción.

El valor predeterminado es @samp{"none"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} lista-opcional access-drivers
Esquema de la API de control de acceso.

De manera predeterminada una usuaria identificada puede acceder a todas las
API. Los controladores de acceso pueden incluir restricciones de acceso
sobre ello.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string key-file
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ninguna clave privada.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string cert-file
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ningún certificado.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string ca-file
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ningún certificado de CA.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string crl-file
Ruta de la lista de revocaciones de certificado. Si se proporciona una
cadena vacía, no se carga ninguna lista.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean tls-no-sanity-cert
Desactiva la verificación de los propios certificados del servidor.

Cuando libvirtd arranca, realiza algunas comprobaciones básicas sobre sus
propios certificados.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean tls-no-verify-cert
Desactiva la verificación de certificados de clientes.

La verificación de certificados de cliente es el mecanismo primario de
identificación. Se rechazará cualquier cliente que no presente un
certificado firmado por la autoridad de certificación (CA).

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} lista-opcional tls-allowed-dn-list
Lista de nombres distinguidos (DN) x509 permitidos.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} lista-opcional sasl-allowed-usernames
Lista de nombres de usuaria SASL permitidos. El formato para el nombre de la
usuaria depende del mecanismo de identificación SASL.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string tls-priority
Cambia el valor de la cadena de prioridad de TLS predeterminada en tiempo de
compilación. El valor predeterminado habitualmente es @samp{"NORMAL"} a
menos que se cambiase en tiempo de compilación. Proporcione este valor
únicamente si desea que libvirt se desvíe de la configuración global
predeterminada.

El valor predeterminado es @samp{"NORMAL"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-clients
Número máximo de conexiones concurrentes de clientes permitidas en todos los
sockets combinados.

El valor predeterminado es @samp{5000}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-queued-clients
Longitud máxima de la cola de conexiones a la espera de ser aceptadas por el
daemon. Fíjese que algunos protocolos que implementan la retransmisión
pueden obedecer esto de manera que un intento posterior de conexión tenga
éxito.

El valor predeterminado es @samp{1000}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-anonymous-clients
Longitud máxima de la cola de clientes aceptados pero no identificados
todavía. Proporcione el valor cero para desactivar esta característica.

El valor predeterminado es @samp{20}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer min-workers
Número de procesos de trabajo que se lanzarán inicialmente.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-workers
Número máximo de hilos de trabajo.

Si el número de clientes excede @code{min-workers}, se lanzan más hilos,
hasta el límite @code{max-workers}. Habitualmente se desea que
@code{max-workers} sea igual al número máximo de clientes permitido.

El valor predeterminado es @samp{20}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer prio-workers
Número de procesos de trabajo prioritarios. Si todos los hilos de trabajo
del conjunto previo se encuentran bloqueados, algunas llamadas marcadas como
de alta prioridad (notablemente domainDestroy) pueden ejecutarse en este
conjunto de hilos.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-requests
Límite global total de llamadas RPC concurrentes.

El valor predeterminado es @samp{20}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer max-client-requests
Límite de peticiones concurrentes desde una única conexión de cliente. Para
evitar que un cliente monopolice el servidor esto debe ser una pequeña
fracción de los parámetros globales ``max_requests'' y ``max_workers''.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-min-workers
Igual que @code{min-workers} pero para la interfaz de administración.

El valor predeterminado es @samp{1}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-max-workers
Igual que @code{max-workers} pero para la interfaz de administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-max-clients
Igual que @code{max-clients} pero para la interfaz de administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-max-queued-clients
Igual que @code{max-queued-clients} pero para la interfaz de administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-max-client-requests
Igual que @code{max-client-requests} pero para la interfaz de
administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer log-level
Nivel de registro.  4 errores, 3 avisos, 2 información, 1 depuración.

El valor predeterminado es @samp{3}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string log-filters
Filtros del registro.

Un filtro permite la selección de un nivel de registro diferente para una
categoría dada de registros. El formato del filtro es uno de los siguientes:

@itemize @bullet
@item
x:nombre

@item
x:+nombre

@end itemize

donde @code{nombre} es una cadena contra la que se compara la categoría
proporcionada en la llamada @code{VIR_LOG_INIT()} al principio de cada
archivo de fuentes de libvirt, por ejemplo @samp{"remote"}, @samp{"qemu"} o
@samp{"util.json"} (el nombre en el filtro puede ser una subcadena del
nombre completo de la categoría, para aceptar múltiples categorías con
nombres similares), el prefijo opcional @samp{"+"} indica a libvirt que
registre la pila de llamadas en cada mensaje con el nombre correspondiente,
y @code{x} es el nivel mínimo de los mensajes que deben registrarse:

@itemize @bullet
@item
1: DEBUG (depuración)

@item
2: INFO (información)

@item
3: WARNING (aviso)

@item
4: ERROR

@end itemize

Se pueden definir en una única sentencia múltiples filtros, únicamente hace
falta separarlos por espacios.

El valor predeterminado es @samp{"3:remote 4:event"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string log-outputs
Salidas de log.

Una salida es uno de esos lugares para almacenar información de logging. El
formato para una salida puede ser:

@table @code
@item x:stderr
la salida va a stderr

@item x:syslog:nombre
usa syslog para la salida y usa el nombre proporcionado como identificador

@item x:file:ruta_archivo
encamina la salida a un archivo, con la ruta proporcionada

@item x:journald
usa el sistema de logging journald

@end table

En todos los casos el prefijo x es el nivel mínimo, que actúa como filtro

@itemize @bullet
@item
1: DEBUG (depuración)

@item
2: INFO (información)

@item
3: WARNING (aviso)

@item
4: ERROR

@end itemize

Se pueden definir salidas múltiples, únicamente deben separarse por
espacios.

El valor predeterminado es @samp{"3:stderr"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer audit-level
Permite la alteración del uso del sistema de auditoría.

@itemize @bullet
@item
0: desactiva la auditoría

@item
1: activa la auditoría, únicamente si está activado en la máquina

@item
2: activa la auditoría, y sale si está desactivada en la máquina.

@end itemize

El valor predeterminado es @samp{1}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} boolean audit-logging
Envía los mensajes de auditoría a través de la infraestructura de registro
de libvirt.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string-opcional host-uuid
Host UUID@.  UUID must not have all digits be the same.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} string host-uuid-source
Fuente de lectura del UUID de la máquina anfitriona.

@itemize @bullet
@item
@code{smbios}: obtiene el UUID de @code{dmidecode -s system-uuid}

@item
@code{machine-id}: obtiene el UUID de @code{/etc/machine-id}

@end itemize

Si @code{dmidecode} no proporciona un UUID válido, se generará un UUID
temporal.

El valor predeterminado es @samp{"smbios"}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer keepalive-interval
Un mensaje ``keepalive'' se envía al cliente tras @code{keepalive_interval}
segundos de inactividad para comprobar si el cliente todavía responde. Si se
proporciona el valor -1, libvirtd nunca enviará peticiones ``keepalive''; no
obstante los clientes todavía pueden mandarlas y el daemon enviará las
respuestas.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer keepalive-count
Número máximo de mensajes ``keepalive'' que se permite enviar a un cliente
sin obtener respuesta antes de considerar que se ha roto la conexión.

En otras palabras, la conexión se cierra automáticamente tras
@code{keepalive_interval * (keepalive_count + 1)} segundos tras la última
recepción de un mensaje desde el cliente. Cuando @code{keepalive_count}
tiene valor 0, las conexiones se cerrarán automáticamente tras
@code{keepalive-interval} segundos de inactividad sin mandar ningún mensaje
``keepalive''.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-keepalive-interval
Igual que la opción anterior pero para la interfaz de administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer admin-keepalive-count
Igual que la opción anterior pero para la interfaz de administración.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{libvirt-configuration}} integer ovs-timeout
Plazo máximo para las llamadas a Open vSwitch.

La utilidad @code{ovs-vsctl} se usa para la configuración y su opción de
plazo máximo (timeout) tiene un valor de 5 segundos de manera predeterminada
para evitar que esperas potencialmente infinitas bloqueen libvirt.

El valor predeterminado es @samp{5}.

@end deftypevr

@c %end of autogenerated docs

@subsubheading Daemon Virtlog
El servicio virtlogd es un daemon del que se compone el lado servidor de
libvirt cuya finalidad es la gestión del registro de las consolas de las
máquinas virtuales.

This daemon is not used directly by libvirt client applications, rather it
is called on their behalf by @code{libvirtd}.  By maintaining the logs in a
standalone daemon, the main @code{libvirtd} daemon can be restarted without
risk of losing logs.  The @code{virtlogd} daemon has the ability to
re-exec()  itself upon receiving @code{SIGUSR1}, to allow live upgrades
without downtime.

@deffn {Variable Scheme} virtlog-service-type
Este es el tipo del daemon virtlog. Su valor debe ser un objeto
@code{virtlog-configuration}.

@lisp
(service virtlog-service-type
         (virtlog-configuration
          (max-clients 1000)))
@end lisp
@end deffn

@deftypevar {@code{libvirt} parameter} package libvirt
Paquete libvirt.
@end deftypevar

@deftypevr {parámetro de @code{virtlog-configuration}} integer log-level
Nivel de registro.  4 errores, 3 avisos, 2 información, 1 depuración.

El valor predeterminado es @samp{3}.

@end deftypevr

@deftypevr {parámetro de @code{virtlog-configuration}} string log-filters
Filtros del registro.

Un filtro permite la selección de un nivel de registro diferente para una
categoría dada de registros. El formato del filtro es uno de los siguientes:

@itemize @bullet
@item
x:nombre

@item
x:+nombre

@end itemize

donde @code{nombre} es una cadena contra la que se compara la categoría
proporcionada en la llamada @code{VIR_LOG_INIT()} al principio de cada
archivo de fuentes de libvirt, por ejemplo "remote", "qemu" o "util.json"
(el nombre en el filtro puede ser una subcadena del nombre completo de la
categoría, para aceptar múltiples categorías con nombres similares), el
prefijo opcional "+" indica a libvirt que registre la pila de llamadas en
cada mensaje con el nombre correspondiente, y @code{x} es el nivel mínimo de
los mensajes que deben registrarse:

@itemize @bullet
@item
1: DEBUG (depuración)

@item
2: INFO (información)

@item
3: WARNING (aviso)

@item
4: ERROR

@end itemize

Se pueden definir en una única sentencia múltiples filtros, únicamente hace
falta separarlos por espacios.

El valor predeterminado es @samp{"3:remote 4:event"}.

@end deftypevr

@deftypevr {parámetro de @code{virtlog-configuration}} string log-outputs
Salidas de log.

Una salida es uno de esos lugares para almacenar información de logging. El
formato para una salida puede ser:

@table @code
@item x:stderr
la salida va a stderr

@item x:syslog:nombre
usa syslog para la salida y usa el nombre proporcionado como identificador

@item x:file:ruta_archivo
encamina la salida a un archivo, con la ruta proporcionada

@item x:journald
usa el sistema de logging journald

@end table

En todos los casos el prefijo x es el nivel mínimo, que actúa como filtro

@itemize @bullet
@item
1: DEBUG (depuración)

@item
2: INFO (información)

@item
3: WARNING (aviso)

@item
4: ERROR

@end itemize

Se pueden definir salidas múltiples, únicamente deben separarse por
espacios.

El valor predeterminado es @samp{"3:stderr"}.

@end deftypevr

@deftypevr {parámetro de @code{virtlog-configuration}} integer max-clients
Número máximo de conexiones concurrentes de clientes permitidas en todos los
sockets combinados.

El valor predeterminado es @samp{1024}.

@end deftypevr

@deftypevr {parámetro de @code{virtlog-configuration}} integer max-size
Tamaño máximo del archivo antes de pasar al siguiente.

El valor predeterminado es @samp{2MB}.

@end deftypevr

@deftypevr {parámetro de @code{virtlog-configuration}} integer max-backups
Número máximo de archivos de backup que se deben mantener.

El valor predeterminado es @samp{3}.

@end deftypevr

@anchor{transparent-emulation-qemu}
@subsubheading Emulación transparente con QEMU

@cindex emulación
@cindex @code{binfmt_misc}
@code{qemu-binfmt-service-type} proporciona la capacidad de emular
transparentemente programas binarios construidos para arquitecturas
diferentes---por ejemplo, le permite ejecutar de manera transparente un
programa de ARMv7 en una máquina x86_64. Esto se consigue mediante la
combinación del emulador @uref{https://www.qemu.org, QEMU} y la
característica @code{binfmt_misc} del núcleo Linux. Esta característica
únicamente le permite emular GNU/Linux en una arquitectura diferente, pero
más adelante puede ver como implementar también GNU/Hurd.

@defvr {Variable Scheme} qemu-binfmt-service-type
Este es el tipo del servicio de emulación transparente QEMU/binfmt. Su valor
debe ser un objeto @code{qemu-binfmt-configuration}, que especifica el
paquete QEMU usado así como las arquitecturas que se desean emular:

@lisp
(service qemu-binfmt-service-type
         (qemu-binfmt-configuration
           (platforms (lookup-qemu-platforms "arm" "aarch64"))))
@end lisp

En este ejemplo se activa la emulación transparente para las plataformas ARM
y aarch64. La ejecución de @code{herd stop qemu-binfmt} la desactiva, y la
ejecución de @code{herd start qemu-binfmt} la vuelve a activar
(@pxref{Invoking herd, the @command{herd} command,, shepherd, The GNU
Shepherd Manual}).
@end defvr

@deftp {Tipo de datos} qemu-binfmt-configuration
Esta es la configuración para el servicio @code{qemu-binfmt}.

@table @asis
@item @code{platforms} (predeterminadas: @code{'()})
Lista de plataformas de QEMU emuladas. Cada elemento debe ser un @dfn{objeto
de plataforma} como los devueltos por @code{lookup-qemu-platforms} (véase a
continuación).

Por ejemplo, supongamos que está en una máquina x86_64 y tiene este
servicio:

@lisp
(service qemu-binfmt-service-type
         (qemu-binfmt-configuration
           (platforms (lookup-qemu-platforms "arm"))))
@end lisp

Puede ejecutar:

@example
guix build -s armhf-linux inkscape
@end example

@noindent
and it will build Inkscape for ARMv7 @emph{as if it were a native build},
transparently using QEMU to emulate the ARMv7 CPU@.  Pretty handy if you'd
like to test a package build for an architecture you don't have access to!

@item @code{qemu} (predeterminado: @code{qemu})
El paquete QEMU usado.
@end table
@end deftp

@deffn {Procedimiento Scheme} lookup-qemu-platforms @var{plataformas}@dots{}
Devuelve la lista de objetos de plataforma de QEMU que corresponden a
@var{plataformas}@dots{}. @var{plataformas} debe ser una lista de cadenas
que correspondan con nombres de plataforma, como @code{"arm"},
@code{"sparc"}, @code{"mips64el"}, etcétera.
@end deffn

@deffn {Procedimiento Scheme} qemu-platform? @var{obj}
Devuelve verdadero si @var{obj} es un objeto de plataforma.
@end deffn

@deffn {Procedimiento Scheme} qemu-platform-name @var{plataforma}
Devuelve el nombre de @var{plataforma}---una cadena como @code{"arm"}.
@end deffn


@subsubheading QEMU Guest Agent

@cindex emulación

The QEMU guest agent provides control over the emulated system to the host.
The @code{qemu-guest-agent} service runs the agent on Guix guests.  To
control the agent from the host, open a socket by invoking QEMU with the
following arguments:

@example
qemu-system-x86_64 \
	-chardev socket,path=/tmp/qga.sock,server=on,wait=off,id=qga0 \
	-device virtio-serial \
	-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \
	...
@end example

This creates a socket at @file{/tmp/qga.sock} on the host.  Once the guest
agent is running, you can issue commands with @code{socat}:

@example
$ guix shell socat -- socat unix-connect:/tmp/qga.sock stdio
@{"execute": "guest-get-host-name"@}
@{"return": @{"host-name": "guix"@}@}
@end example

See @url{https://wiki.qemu.org/Features/GuestAgent,QEMU guest agent
documentation} for more options and commands.

@defvr {Scheme Variable} qemu-guest-agent-service-type
Service type for the QEMU guest agent service.
@end defvr

@deftp {Data Type} qemu-guest-agent-configuration
Configuration for the @code{qemu-guest-agent} service.

@table @asis
@item @code{qemu} (predeterminado: @code{qemu-minimal})
El paquete QEMU usado.

@item @code{device} (default: @code{""})
File name of the device or socket the agent uses to communicate with the
host.  If empty, QEMU uses a default file name.
@end table
@end deftp


@subsubheading Hurd en una máquina virtual

@cindex @code{hurd}
@cindex Hurd
@cindex childhurd

El servicio @code{hurd-vm} implementa la ejecución de GNU/Hurd en una
máquina virtual (VM), llamado @dfn{childhurd}. Este servicio está destinado
para su uson GNU/Linux y la configuración de sistema operativo de GNU/Hurd
se compila de manera cruzada. La máquina virtual es un servicio de Shepherd
al que se puede hacer referencia a través de los nombres @code{hurd-vm} y
@code{childhurd} y se puede controlar mediante órdenes como las siguientes:

@example
herd start hurd-vm
herd stop childhurd
@end example

Cuando el servicio se encuentra en ejecución, puede ver su consola a través
de una conexión con un cliente VNC, por ejemplo con:

@example
guix shell tigervnc-client -- vncviewer localhost:5900
@end example

La configuración predeterminada (véase @code{hurd-vm-configuration} a
continuación) lanza un servidor del intérprete de órdenes seguro (SSH) en su
sistema GNU/Hurd, el cual QEMU (el emulador de máquina virtual) redirige al
puerto 10222 de la máquina anfitriona. Por tanto se puede conectar a Hurd a
través de SSH con:

@example
ssh root@@localhost -p 10022
@end example

childhurd es volátil y carece de estado: comienza con un sistema de archivos
raíz creado de cero cada vez que lo reinicia. No obstante de manera
predeterminada todos los archivos en la ruta @file{/etc/childhurd} de la
máquina anfitriona se copian al sistema de archivos raíz de childhurd cuando
arranca. Esto permite que configure ``secretos'' dentro de la máquina
virtual: claves de SSH de la máquina, claves de sustituciones autorizadas,
etcétera---véase la explicación de @code{secret-root} a continuación.

@defvr {Variable Scheme} hurd-vm-service-type
El tipo del servicio que ejecuta Hurd en una máquina virtual. Su valor debe
ser un objeto @code{hurd-vm-configuration}, que especifica el sistema
operativo (@pxref{Referencia de operating-system}) y el tamaño del disco para la
máquina virtual de Hurd, el paquete de QEMU usado así como las opciones de
ejecución.

Por ejemplo:

@lisp
(service hurd-vm-service-type
         (hurd-vm-configuration
          (disk-size (* 5000 (expt 2 20))) ;5G
          (memory-size 1024)))             ;1024MiB
@end lisp

crearía una imagen de disco suficientemente grande para construir
GNU@tie{}Hello, con algo de memoria adicional.
@end defvr

@deftp {Tipo de datos} hurd-vm-configuration
Tipo de datos que representa la configuración de
@code{hurd-vm-service-type}.

@table @asis
@item @code{os} (predeterminado: @var{%hurd-vm-operating-system})
El sistema operativo instanciado. El valor predeterminado es un sistema
mínimo con un daemon del intérprete de comandos seguro OpenSSH configurado
de forma permisiva asociado al puerto 2222 (@pxref{Servicios de red,
@code{openssh-service-type}}).

@item @code{qemu} (predeterminado: @code{qemu-minimal})
El paquete QEMU usado.

@item @code{image} (predeterminado: @var{hurd-vm-disk-image})
El procedimiento usado para construir la imagen de disco construida a partir
de esta configuración.

@item @code{disk-size} (predeterminado: @code{'guess})
El tamaño de la imagen de disco.

@item @code{memory-size} (predeterminado: @code{512})
El tamaño de la memoria de la máquina virtual en mebibytes.

@item @code{options} (predeterminadas: @code{'("--snapshot")})
Opciones adicionales para ejecutar QEMU.

@item @code{id} (predeterminado: @code{#f})
Si se proporciona un valor, debe ser un entero positivo no nulo usado para
parametrizar las instancias Childhurd. Se añade al nombre del servicio, por
ejemplo @code{childhurd1}.

@item @code{net-options} (predeterminado: @var{hurd-vm-net-options})
El procedimiento usado para producir la lista de opciones de red para QEMU.

De manera predeterminada produce

@lisp
'("--device" "rtl8139,netdev=net0"
  "--netdev" (string-append
              "user,id=net0,"
              "hostfwd=tcp:127.0.0.1:@var{secrets-port}-:1004,"
              "hostfwd=tcp:127.0.0.1:@var{ssh-port}-:2222,"
              "hostfwd=tcp:127.0.0.1:@var{vnc-port}-:5900"))
@end lisp

con los siguientes puertos redirigidos:

@example
@var{secrets-port}: @code{(+ 11004 (* 1000 @var{ID}))}
@var{ssh-port}: @code{(+ 10022 (* 1000 @var{ID}))}
@var{vnc-port}: @code{(+ 15900 (* 1000 @var{ID}))}
@end example

@item @code{secret-root} (predeterminado: @file{/etc/childhurd})
El directorio raíz que contiene los secretos fuera-de-banda que serán
instalados en childhurd cuando se ejecute. Los childhurd son volátiles lo
que significa que cada arranque los secretos como las claves de SSH de la
máquina y la clave de firma de Guix se regeneran.

Si el directorio @file{/etc/childhurd} no existe, el servicio
@code{secret-service} que se ejecuta en childhurd recibirá una lista vacía
de secretos.

De manera predeterminada el servicio crea @file{/etc/childhurd} con los
siguientes secretos no volátiles, a no ser que ya existan:

@example
/etc/childhurd/etc/guix/acl
/etc/childhurd/etc/guix/signing-key.pub
/etc/childhurd/etc/guix/signing-key.sec
/etc/childhurd/etc/ssh/ssh_host_ed25519_key
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key
/etc/childhurd/etc/ssh/ssh_host_ed25519_key.pub
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key.pub
@end example

Estos archivos se envían automáticamente a la máquina virtual de Hurd cuando
arranca, incluyendo sus permisos.

@cindex childhurd, delegación de trabajo
@cindex Hurd, delegación de trabajo
Tener todos estos archivos en un único lugar significa que únicamente faltan
un par de detalles para permitir a la máquina anfitriona delegar las
construcciones de @code{i586-gnu} en childhurd:

@enumerate
@item
Autorizar la clave de childhurd en la máquina anfitriona de modo que esta
acepte las construcciones que provengan de childhurd, lo que puede hacerse
de este modo:

@example
guix archive --authorize < \
  /etc/childhurd/etc/guix/signing-key.pub
@end example

@item
Añadir childhurd a @file{/etc/guix/machines.scm} (@pxref{Configuración de delegación del daemon}).
@end enumerate

Estamos trabajando para que esto se haga de forma automática---¡póngase en
contacto con nosotras a través de @email{guix-devel@@gnu.org} para hablar
sobre ello!
@end table
@end deftp

Tenga en cuenta que la imagen de la máquina virtual es volátil, es decir,
los contenidos se pierden cuando se para. Si desea una imagen que mantenga
el estado puede modificar la configuración de @code{image} y @code{options}
sin la opción @code{--snapshot} usando algo parecido a esto:

@lisp
(service hurd-vm-service-type
         (hurd-vm-configuration
          (image   (const "/no/almacen/y/perm/escritura/hurd.img"))
          (options '())))
@end lisp

@subsubheading Ganeti

@cindex ganeti

@quotation Nota
Este servicio se considera experimental. Las opciones de configuración
pueden cambiar de manera incompatible con versiones previas, y no todas las
características han sido probadas en profundidad. Se recomienda a quienes
usen este servicio que compartan su experiencia en
@email{guix-devel@@gnu.org}.
@end quotation

Ganeti es un sistema de gestión de máquinas virtuales. Está diseñado para
mantener máquinas virtuales ejecutándose en un cluster de servidores incluso
en casos de fallos de hardware, y para facilitar las tareas de mantenimiento
y recuperación. Consiste en múltiples servicios que se describen a lo largo
de esta sección. Además del servicio de Ganeti, necesitará el servicio
OpenSSH (@pxref{Servicios de red, @code{openssh-service-type}}), y
actualizar el archivo @file{/etc/hosts} (@pxref{Referencia de operating-system,
@code{hosts-file}}) con el nombre del cluster y su dirección (o usar un
servidor DNS).

Todos los nodos que participan en el cluster de Ganeti deben tener la misma
configuración de Ganeti y en el archivo @file{/etc/hosts}. A continuación se
encuentra un ejemplo de configuración para un nodo del cluster de Ganeti que
implementa varios motores de almacenamiento, e instala los @dfn{proveedores
de sistema operativo} @code{debootstrap} y @code{guix}:

@lisp
(use-package-modules virtualization)
(use-service-modules base ganeti networking ssh)
(operating-system
  ;; @dots{}
  (host-name "nodo1")
  (hosts-file (plain-file "hosts" (format #f "
127.0.0.1       localhost
::1             localhost

192.168.1.200   ganeti.example.com
192.168.1.201   nodo1.example.com nodo1
192.168.1.202   nodo2.example.com nodo2
")))

  ;; Install QEMU so we can use KVM-based instances, and LVM, DRBD and Ceph
  ;; in order to use the "plain", "drbd" and "rbd" storage backends.
  (packages (append (map specification->package
                         '("qemu" "lvm2" "drbd-utils" "ceph"
                           ;; Add the debootstrap and guix OS providers.
                           "ganeti-instance-guix" "ganeti-instance-debootstrap"))
                    %base-packages))
  (services
   (append (list (service static-networking-service-type
                          (list (static-networking
                                 (addresses
                                  (list (network-address
                                         (device "eth0")
                                         (value "192.168.1.201/24"))))
                                 (routes
                                  (list (network-route
                                         (destination "default")
                                         (gateway "192.168.1.254"))))
                                 (name-servers '("192.168.1.252"
                                                 "192.168.1.253")))))

                 ;; Ganeti uses SSH to communicate between nodes.
                 (service openssh-service-type
                          (openssh-configuration
                           (permit-root-login 'prohibit-password)))

                 (service ganeti-service-type
                          (ganeti-configuration
                           ;; Esta lista especifica las rutas del
                           ;; sistema de archivos permitidas para el
                           ;; almacenamiento de imágenes de máquinas
                           ;; viruales.
                           (file-storage-paths '("/srv/ganeti/almacenamiento"))
                           ;; Esta variable configura una única
                           ;; "variación" tanto para Debootstrap como
                           ;; Guix que funciona con KVM.
                           (os %default-ganeti-os))))
           %base-services)))
@end lisp

Users are advised to read the
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/admin.html,Ganeti
administrators guide} to learn about the various cluster options and
day-to-day operations.  There is also a
@url{https://guix.gnu.org/blog/2020/running-a-ganeti-cluster-on-guix/,blog
post} describing how to configure and initialize a small cluster.

@defvr {Variable Scheme} ganeti-service-type
Tipo de servicio que incluye todos los distintos servicios que los nodos
Ganeti deben ejecutar.

Su valor es un objeto @code{ganeti-configuration} que define usado para las
operaciones de línea de órdenes, así como la configuración para varios
daemon. Las rutas de almacenamiento permitidas y los sistemas operativos
disponibles para hospedar también se configuran a través de este tipo de
datos.
@end defvr

@deftp {Tipo de datos} ganeti-configuration
El servicio @code{ganeti} proporciona las siguientes opciones de
configuración:

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado. Dicho paquete se instala en el perfil del
sistema y hace que las órdenes @command{gnt-cluster},
@command{gnt-instance}, etcétera, estén disponibles. Tenga en cuenta que el
valor especificado aquí no afecta a otros servicios ya que cada uno hace
referencia a su paquete @code{ganeti} específico (véase a continuación).

@item @code{noded-configuration} (predeterminado: @code{(ganeti-noded-configuration)})
@itemx @code{confd-configuration} (predeterminado: @code{(ganeti-confd-configuration)})
@itemx @code{wconfd-configuration} (predeterminado: @code{(ganeti-wconfd-configuration)})
@itemx @code{luxid-configuration} (predeterminado: @code{(ganeti-luxid-configuration)})
@itemx @code{rapi-configuration} (predeterminado: @code{(ganeti-rapi-configuration)})
@itemx @code{kvmd-configuration} (predeterminado: @code{(ganeti-kvmd-configuration)})
@itemx @code{mond-configuration} (predeterminado: @code{(ganeti-mond-configuration)})
@itemx @code{metad-configuration} (predeterminado: @code{(ganeti-metad-configuration)})
@itemx @code{watcher-configuration} (predeterminado: @code{(ganeti-watcher-configuration)})
@itemx @code{cleaner-configuration} (predeterminado: @code{(ganeti-cleaner-configuration)})

Estas opciones controlan los distintos daemon y trabajos de cron que se
distribuyen con Ganeti. Los posibles valores se describen en detalle a
continuación.  Para modificar el valor de un elemento de la configuración se
debe usar el tipo de configuración para dicho servicio:

@lisp
(service ganeti-service-type
         (ganeti-configuration
          (rapi-configuration
           (ganeti-rapi-configuration
            (interface "eth1"))))
          (watcher-configuration
           (ganeti-watcher-configuration
            (rapi-ip "10.0.0.1"))))
@end lisp

@item @code{file-storage-paths} (predeterminada: @code{'()})
Lista de directorios permitidos para el motor de almacenamiento de archivos.

@item @code{os} (predeterminado: @code{%default-ganeti-os})
Lista de registros @code{<ganeti-os>}.
@end table

En esencia @code{ganeti-service-type} es una abreviación para declara cada
uno de los servicios individualmente:

@lisp
(service ganeti-noded-service-type)
(service ganeti-confd-service-type)
(service ganeti-wconfd-service-type)
(service ganeti-luxid-service-type)
(service ganeti-kvmd-service-type)
(service ganeti-mond-service-type)
(service ganeti-metad-service-type)
(service ganeti-watcher-service-type)
(service ganeti-cleaner-service-type)
@end lisp

Además de una extensión del servicio @code{etc-service-type} que configura
el motor de almacenamiento de archivos y las variantes de sistema operativo.

@end deftp

@deftp {Tipo de datos} ganeti-os
Tipo de datos adecuado para proporcionarse como parámetro @code{os} de
@code{ganeti-configuration}. Tiene los siguientes parámetros:

@table @asis
@item @code{name}
Nombre para este proveedor de sistema operativo. Solo se usa para
especificar dónde termina la configuración. Proporcionar el valor
``debootstrap'' indica la creación de
@file{/etc/ganeti/instance-debootstrap}.

@item @code{extension} (default: @code{#f})
The file extension for variants of this OS type.  For example @file{.conf}
or @file{.scm}.  It will be appended to the variant file name if set.

@item @code{variants} (predeterminadas: @code{'()})
This must be either a list of @code{ganeti-os-variant} objects for this OS,
or a ``file-like'' object (@pxref{Expresiones-G, file-like objects})
representing the variants directory.

To use the Guix OS provider with variant definitions residing in a local
directory instead of declaring individual variants (see @var{guix-variants}
below), you can do:

@lisp
(ganeti-os
 (name "guix")
 (variants (local-file "ganeti-guix-variants"
                       #:recursive? #true)))
@end lisp

Note that you will need to maintain the @file{variants.list} file (see
@code{@url{https://docs.ganeti.org/docs/ganeti/3.0/man/ganeti-os-interface.html,
ganeti-os-interface(7)}})  manually in this case.

@end table
@end deftp

@deftp {Tipo de datos} ganeti-os-variant
Tipo de datos que representa una variante de SO Ganeti. Este tipo tiene los
siguientes parámetros:

@table @asis
@item @code{name}
El nombre de esta variación.

@item @code{configuration}
Un archivo de configuración para esta variación.
@end table
@end deftp

@defvr {Variable Scheme} %default-debootstrap-hooks
Esta variable contiene extensiones (``hook'') para la configuración de la
red y el cargador de arranque GRUB.
@end defvr

@defvr {Variable Scheme} %default-debootstrap-extra-pkgs
Esta variable contiene una lista de paquetes adecuada para una máquina
completamente virtualizada.
@end defvr

@deftp {Tipo de datos} debootstrap-configuration

Este tipo de datos crea archivos de configuración adecuados para la orden de
generación de sistemas operativos debootstrap.

@table @asis
@item @code{hooks} (predeterminada: @code{%default-debootstrap-hooks})
Cuando no es @code{#f} debe ser una expresión-G que especifique el
directorio con los guiones que deberán ejecutarse cuando se instale el
sistema operativo. También puede ser una lista de pares @code{(nombre
. obj-tipo-archivo)}. Por ejemplo:

@lisp
`((99-hola-mundo . ,(plain-file "#!/bin/sh\necho '¡Hola mundo!'")))
@end lisp

Esto crea un directorio con un ejecutable que se llama @code{99-hola-mundo}
y se ejecuta cada vez que se instale esta variación. Si se proporciona
@code{#f}, se usarán los archivos del directorio
@file{/etc/ganeti/instance-debootstrap/hooks}, si existe alguno.
@item @code{proxy} (predeterminado: @code{#f})
Valor opcional de la pasarela HTTP usada.
@item @code{mirror} (predeterminado: @code{#f})
El servidor espejo de Debian. Habitualmente es algo como
@code{http://ftp.no.debian.org/debian}. El valor predeterminado cambia
dependiendo de la distribución.
@item @code{arch} (predeterminada: @code{#f})
La arquitectura de dpkg. Proporcione @code{armhf} para generar con
debootstrap una instancia de ARMv7 en una máquina AArch64. El valor
predeterminado corresponde a la arquitectura del sistema en uso.
@item @code{suite} (predeterminada: @code{"stable"})
Si se proporciona debe ser el identificador de una entrega o ``suite'' de
distribución de Debian, como por ejemplo @code{buster} o @code{focal}. Si se
proporciona @code{#f}, se usael valor predeterminado del proveedor de
sistema operativo.
@item @code{extra-pkgs} (predeterminados: @code{%default-debootstrap-extra-pkgs})
Lista de paquetes adicionales que dpkg instala junto al sistema mínimo.
@item @code{components} (predeterminado: @code{#f})
Si se proporciona un valor debe ser una lista de ``componentes'' de
repositorio de Debian. Por ejemplo @code{'("main" "contrib")}.
@item @code{generate-cache?} (predeterminado: @code{#t})
Determina si se almacena en caché de manera automática el archivo de
debootstrap que se haya generado.
@item @code{clean-cache} (predeterminado: @code{14})
Descarta el contenido de la caché tras este número de días. Use @code{#f}
para no descartar contenido de la caché nunca.
@item @code{partition-style} (predeterminado: @code{'msdos})
Tipo de partición creado. Cuando se proporciona un valor debe ser
@code{'msdos}, @code{'none} o una cadena.
@item @code{partition-alignment} (predeterminada: @code{2048})
Alineación de la partición en sectores.
@end table
@end deftp

@deffn {Procedimiento Scheme} debootstrap-variant @var{nombre} @var{configuración}
Procedimiento auxiliar que crea un registro @code{ganeti-os-variant}. Toma
dos parámetros: un nombre y un objeto @code{debootstrap-configuration}.
@end deffn

@deffn {Procedimiento Scheme} debootstrap-os @var{variantes}@dots{}
Procedimiento auxiliar que crea un registro @code{ganeti-os}. Toma como
parámetro una lista de variaciones creada con @code{debootstrap-variant}.
@end deffn

@deffn {Procedimiento Scheme} guix-variant @var{nombre} @var{configuración}
Procedimiento auxiliar que crea un registro @code{ganeti-os-variant} para
ser usado por el proveedor de sistema operativo Guix. Toma como parámetros
un nombre y una expresión-G que devuelve un objeto ``tipo-archivo''
(@pxref{Expresiones-G, objetos ``tipo-archivo''}) que contiene configuración
para el sistema Guix.
@end deffn

@deffn {Procedimiento Scheme} guix-os @var{variantes}@dots{}
Procedimiento auxiliar que crea un registro @code{ganeti-os}. Toma como
parámetros una lista de variaciones producida por @code{guix-variant}.
@end deffn

@defvr {Variable Scheme} %default-debootstrap-variants
Variable de conveniencia para que el proveedor debootstrap funcione
``automágicamente'' sin que quienes lo usan tengan que declarar variaciones
manualmente. Contiene una única variación de debootstrap con la
configuración predeterminada:

@lisp
(list (debootstrap-variant
       "default"
       (debootstrap-configuration)))
@end lisp
@end defvr

@defvr {Variable Scheme} %default-guix-variants
Variable de conveniencia para que el proveedor de sistema operativo Guix
funcione sin ninguna configuración adicional. Crea una máquina virtual que
tiene un servidor SSH, consola serie y autoriza las claves de SSH de las
máquinas de Ganeti.

@lisp
(list (guix-variant
       "default"
       (file-append ganeti-instance-guix
                    "/share/doc/ganeti-instance-guix/examples/dynamic.scm")))
@end lisp
@end defvr

Se pueden implementar proveedores de SO no disponibles en Guix mediante la
extensión de los registros @code{ganeti-os} y @code{ganeti-os-variant} de
manera apropiada. Por ejemplo:

@lisp
(ganeti-os
 (name "personalizado")
 (extension ".conf")
 (variants
  (list (ganeti-os-variant
         (name "cosa")
         (configuration (plain-file "archivo" "Esto va bien"))))))
@end lisp

Este ejemplo crearía
@file{/etc/ganeti/instance-personalizado/variants/cosa.conf}, el cual apunta
a un archivo en el almacén cuyo contenido es @code{esto va bien}. También se
crearía @file{/etc/ganeti/instance-personalizado/variants/variants.list} con
el contenido @code{cosa}.

Obviamente es posible que esto no funcione con todos los proveedores de
sistema operativo existentes. Si está interfaz le está limitando en su
implementación, por favor, contacte con @email{guix-devel@@gnu.org}.

El resto de esta sección documenta los distintos servicios incluidos en
@code{ganeti-service-type}.

@defvr {Variable Scheme} ganeti-noded-service-type
@command{ganeti-noded} es el daemon responsable de las funciones específicas
del nodo dentro del sistema Ganeti. El valor de este servicio debe ser un
objeto @code{ganeti-noded-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-noded-configuration
Esta es la configuración para el servicio @code{ganeti-noded}.

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{port} (predeterminado: @code{1811})
Puerto TCP en el que escucha el daemon del nodo a la espera de peticiones a
través de la red.

@item @code{address} (predeterminado: @code{"0.0.0.0"})
La dirección de red a la que el daemon se enlaza. La dirección
predeterminada significa que el daemon se enlaza a todas las direcciones
disponibles.

@item @code{interface} (predeterminado: @code{#f})
En caso de proporcionarse un valor, debe especificar el nombre de la
interfaz de red (por ejemplo, @code{eth0} a la que el daemon se enlaza.

@item @code{max-clients} (predeterminado: @code{20})
Establece un límite en el número máximo de conexiones simultaneas de
clientes que el daemon manejará. Las conexiones que excedan dicho número se
aceptan, pero no se envía respuesta hasta que hayan cerrado suficientes
conexiones.

@item @code{ssl?} (predeterminado: @code{#t})
Determina si se usa SSL/TLS para cifrar las comunicaciones a través de la
red. El cluster proporciona automáticamente el certificado y se puede rotar
con @command{gnt-cluster renew-crypto}.

@item @code{ssl-key} (predeterminado: @file{"/var/lib/ganeti/server.pem"})
Puede usarse para proporcionar una clave de cifrado específica para
comunicaciones TLS.

@item @code{ssl-cert} (predeterminado: @file{"/var/lib/ganeti/server.pem"})
Puede usarse para proporcionar un certificado específico para comunicaciones
TLS.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración. Tenga en cuenta que esto puede exponer detalles de cifrado en
los archivos de registro, por lo que debe usarse con precaución.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-confd-service-type
@command{ganeti-confd} responde a las consultas relacionadas con la
configuración del cluster Ganeti. El propósito de este daemon es tener una
forma rápida y con alta disponibilidad de consultar los valores de
configuración del cluster. Se activa de manera automática en todas las
máquinas @dfn{candidatas de ser coordinadoras}. El valor de este servicio
debe ser un objeto @code{ganeti-confd-configuration}.

@end defvr

@deftp {Tipo de datos} ganeti-confd-configuration
Esta es la configuración para el servicio @code{ganeti-confd}.

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{port} (predeterminado: @code{1814})
El puerto UDP en el que esperarán peticiones a través de la red.

@item @code{address} (predeterminado: @code{"0.0.0.0"})
Dirección de red a la que el daemon se asocia.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-wconfd-service-type
@command{ganeti-wconfd} es el daemon que proporciona una autoridad de
conocimiento sobre la configuración del cluster y es la única entidad que
puede aceptar cambios sobre ella. Todos las trabajos que necesiten modificar
la configuración deben hacerlo enviando las peticiones adecuadas a este
daemon. Únicamente se ejecuta en el @dfn{nodo coordinador} y se desactiva
automáticamente en otros nodos.

El valor de este servicio debe ser un objeto
@code{ganeti-wconfd-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-wconfd-configuration
Esta es la configuración para el servicio @code{ganeti-wconfd}.

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{no-voting?} (predeterminado: @code{#f})
El daemon se negará a arrancar si la mayoría de los nodos del cluster no
coinciden en que se está ejecutando en el nodo coordinador. Proporcione
@code{#t} para arrancar incluso cuando no se puede alcanzar dicha mayoría
(peligroso, úsese con precaución).

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-luxid-service-type
@command{ganeti-luxid} es un daemon que responde a las peticiones
relacionadas con la configuración del estado actual del cluster Ganeti. De
manera adicional, es el daemon que tiene el control sobre la cola de
trabajos de Ganeti. Los trabajos se pueden emitir a través de este daemon y
éste los planifica y arranca.

Recibe un objeto @code{ganeti-luxid-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-luxid-configuration
This is the configuration for the @code{ganeti-luxid} service.

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{no-voting?} (predeterminado: @code{#f})
El daemon se negará a arrancar si no puede verificar que la mayoría de los
nodos del cluster creen que éste se está ejecutando en el nodo
coordinador. Proporcione @code{#t} para ignorar dichas comprobaciones y
arrancar en cualquier caso (puede ser peligroso).

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-rapi-service-type
@command{ganeti-rapi} proporciona una API remota para cluster de Ganeti. Se
ejecuta en el nodo coordinador y se puede usar para realizar programática
acciones en el cluster a través de un protocolo de llamada de procedimientos
remotos (RPC) basado en JSON.

Most query operations are allowed without authentication (unless
@var{require-authentication?} is set), whereas write operations require
explicit authorization via the @file{/var/lib/ganeti/rapi/users} file.  See
the @url{https://docs.ganeti.org/docs/ganeti/3.0/html/rapi.html, Ganeti
Remote API documentation} for more information.

El valor de este servicio debe ser un objeto
@code{ganeti-rapi-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-rapi-configuration
Configuración para el servicio @code{ganeti-rapi}.

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{require-authentication?} (predeterminado: @code{#f})
Determina si se requiere identificación incluso para operaciones únicamente
de lectura.

@item @code{port} (predeterminado: @code{5080})
El puerto TCP en el que esperarán peticiones de la API.

@item @code{address} (predeterminado: @code{"0.0.0.0"})
La dirección de red a la que se asocia el servicio. De manera predeterminada
el servicio se asocia a todas las direcciones configuradas.

@item @code{interface} (predeterminado: @code{#f})
Si se proporciona un valor, debe especificar el nombre de la interfaz de
red, como por ejemplo @code{eth0}, a la que el daemon se asocia.

@item @code{max-clients} (predeterminado: @code{20})
Número máximo de conexiones simultaneas de clientes que se manejan. Las
conexiones que excedan dicho número se aceptan, pero no se envía respuesta
hasta que hayan cerrado suficientes conexiones.

@item @code{ssl?} (predeterminado: @code{#t})
Determina si se usa cifrado SSL/TLS en el puerto de la API remota.

@item @code{ssl-key} (predeterminado: @file{"/var/lib/ganeti/server.pem"})
Puede usarse para proporcionar una clave de cifrado específica para
comunicaciones TLS.

@item @code{ssl-cert} (predeterminado: @file{"/var/lib/ganeti/server.pem"})
Puede usarse para proporcionar un certificado específico para comunicaciones
TLS.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración. Tenga en cuenta que esto puede exponer detalles de cifrado en
los archivos de registro, por lo que debe usarse con precaución.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-kvmd-service-type
@command{ganeti-kvmd} es responsable de determinar si una instancia KVM
determinada ha sido apagada por una usuaria o una
administradora. Normalmente Ganeti reiniciará una instancia que no se haya
parado a través de Ganeti. Si la opción del cluster @code{user_shutdown} es
verdadera, este daemon monitoriza el puerto @code{QMP} que proporciona QEMU
y escucha eventos de apagado en él, y marca la instancia como
@dfn{USER_down} en vez de @dfn{ERROR_down} cuando el daemon la apaga de
manera adecuada.

Recibe un objeto @code{ganeti-kvmd-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-kvmd-configuration

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-mond-service-type
@command{ganeti-mond} es un daemon opcional que proporciona la funcionalidad
de monitorización de Ganeti. Es responsable de la ejecución de los
recolectores de datos y la publicación de la información obtenida a través
de una interfaz HTTP.

Recibe un objeto @code{ganeti-mond-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-mond-configuration

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{port} (predeterminado: @code{1815})
Puerto en el que el daemon espera conexiones.

@item @code{address} (predeterminado: @code{"0.0.0.0"})
La dirección de red a la que se asocia el daemon. De manera predeterminada
se asocia a todas las interfaces disponibles.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-metad-service-type
@command{ganeti-metad} es un daemon opcional que se puede usar para
proporcionar información del cluster a instancias o guiones de instalación
de sistema operativo.

Recibe un objeto @code{ganeti-metad-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-metad-configuration

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{port} (predeterminado: @code{80})
Puerto en el que el daemon espera conexiones.

@item @code{address} (predeterminada: @code{#f})
Si se proporciona un valor el daemon se asociará únicamente a esta
dirección. Si no se proporciona valor el comportamiento depende de la
configuración del cluster.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es verdadero, el daemon almacena registros adicionales con propósitos
de depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-watcher-service-type
@command{ganeti-watcher} es un guión diseñado para su ejecución periódica en
la que comprueba el estado la salud del cluster. Reinicia automáticamente
las instancias que se han parado sin el consentimiento de Ganeti, y repara
los enlaces DRBD en caso de que un nodo se haya reiniciado. También archiva
los trabajos antiguos del cluster y reinicia los daemon de Ganeti si no se
están ejecutando. Si se ha proporcionado valor al parámetro del cluster
@code{ensure_node_health}, este proceso también apagará las instancias y
dispositivos DRBD si el nodo que las ejecute se ha declarado fuera de línea
por alguna de las máquinas candidatas de coordinación conocidas.

Se puede pausar en todos los nodos con @command{gnt-cluster watcher pause}.

Este servicio toma como valor un objeto @code{ganeti-watcher-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-watcher-configuration

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para este servicio.

@item @code{schedule} (predeterminado: @code{'(next-second-from (next-minute (range 0 60 5)))})
Cada cuanto se ejecuta el guión. El valor predeterminado es cada 5 minutos.

@item @code{rapi-ip} (predeterminada: @code{#f})
Esta opción se debe especificar únicamente si el daemon de API remota se ha
configurado para usar una interfaz o dirección de red concreta. De manera
predeterminada se usa la dirección del cluster.

@item @code{job-age} (predeterminados: @code{(* 6 3600)})
Archiva los trabajos del cluster cuya antigüedad sea mayor que el el número
de segundos proporcionado. El valor predeterminado son 6 horas. Esto
mantiene la lista proporcionada @command{gnt-job list} dentro de límites
gestionables.

@item @code{verify-disks?} (predeterminado: @code{#t})
Si es @code{#f}, el proceso de vigilancia (``watcher'') no intentará reparar
los enlaces de DRBD rotos de manera automática. Esto significa que quienes
administren el sistema deberán usar @command{gnt-cluster verify-disks}
manualmente para realizar dicha tarea.

@item @code{debug?} (predeterminado: @code{#f})
Cuando es @code{#t}, el guión registra información adicional para facilitar
la depuración.

@end table
@end deftp

@defvr {Variable Scheme} ganeti-cleaner-service-type
@command{ganeti-cleaner} es un guión diseñado para su ejecución periódica en
la que elimina archivos antiguos del cluster. Este tipo de servicio controla
dos @dfn{trabajos de cron}: uno para el nodo coordinador que elimina de
manera permanente trabajos antiguos del cluster, y otro para todos los nodos
que elimina certificados X509 y claves que hayan expirado así como
información desactualizada de @command{ganeti-watcher}. Como todos los
servicios de Ganeti, se puede incluir también en los nodos que no son
coordinadores y se desactivará por si mismo si es necesario.

Recibe un objeto @code{ganeti-cleaner-configuration}.
@end defvr

@deftp {Tipo de datos} ganeti-cleaner-configuration

@table @asis
@item @code{ganeti} (predeterminado: @code{ganeti})
El paquete @code{ganeti} usado para la orden @command{gnt-cleaner}.

@item @code{master-schedule} (predeterminado: @code{"45 1 * * *"})
Cada cuanto se ejecuta el trabajo principal de limpieza. El valor
predeterminado representa su ejecución una vez al día, a las 01:45:00.

@item @code{node-schedule} (predeterminada: @code{"45 2 * * *"})
La frecuencia del trabajo de limpieza del nodo. El valor predeterminado es
una vez al día, a las 02:45:00.

@end table
@end deftp

@node Servicios de control de versiones
@subsection Servicios de control de versiones

El módulo @code{(gnu services version-control)} proporciona un servicio para
permitir el acceso remoto a repositorios Git locales. Existen tres opciones:
el servicio @code{git-daemon-service}, que proporciona acceso a repositorios
a través del protocolo inseguro basado en TCP @code{git://}, la extensión
del servidor web @code{nginx} para redirigir algunas peticiones al motor
@code{git-http-backend}, o una interfaz web proporcionada por el servicio
@code{cgit-service-type}.

@deffn {Procedimiento Scheme} git-daemon-service [#:config (git-daemon-configuration)]

Devuelve un servicio que ejecuta @command{git daemon}, un servidor TCP
simple para exponer repositorios con el protocolo Git para acceso anónimo.

El parámetro opcional @var{config} debe ser un objeto
@code{<git-daemon-configuration>}, de manera predeterminada permite acceso
de solo lectura a los repositorios exportados@footnote{Mediante la creación
del archivo mágico @file{git-daemon-export-ok} en el directorio del
repositorio.} bajo @file{/srv/git}.

@end deffn

@deftp {Tipo de datos} git-daemon-configuration
Tipo de datos que representa la configuración para
@code{git-daemon-service}.

@table @asis
@item @code{package} (predeterminado: @code{git})
El objeto paquete del sistema distribuido de control de versiones Git.

@item @code{export-all?} (predeterminado: @code{#f})
Determina si se permite el acceso a todos los repositorios Git, incluso si
no tienen el archivo @file{git-daemon-export-ok}.

@item @code{base-path} (predeterminado: @file{/srv/git})
Determina si se traducirán todas las rutas de las peticiones como relativas
a la ruta proporcionada. Si se encuentra en ejecución el daemon de git con
@code{(base-path "/srv/git"} en example.com, al realizar la solicitud de
@indicateurl{git://example.com/hello.git}, el daemon de git interpretará la
ruta como @file{/srv/git/hello.git}.

@item @code{user-path} (predeterminado: @code{#f})
Determina si se permite el uso de la notación @code{~user} en las
peticiones. Si se especifica una cadena vacía, una peticione de
@indicateurl{git://máquina/~alicia/algo} se tomará como una petición de
acceso al repositorio @code{algo} en el directorio de la usuaria
@code{alicia}. Si se especifica @code{(user-path "@var{ruta}")}, la misma
petición se traducirá en una petición de acceso al repositorio
@file{@var{ruta}/algo} en el directorio de la usuaria @code{alicia}.

@item @code{listen} (predeterminadas: @code{'()})
Determina si se debe escuchar en direcciones IP o nombres de máquina
específicos, de manera predeterminada escucha en cualquiera.

@item @code{port} (predeterminado: @code{#f})
Determina si se escucha en un puerto alternativo, cuyo valor predeterminado
es 9418.

@item @code{whitelist} (predeterminada: @code{'()})
Si no está vacío, únicamente permite el acceso a esta lista de directorios.

@item @code{extra-options} (predeterminadas: @code{'()})
Opciones adicionales que se proporcionan a @command{git daemon}, para
obtener más información le rogamos que ejecute @command{man git-daemon}.

@end table
@end deftp

El protocolo @code{git://} carece de verificación. Cuando se obtienen datos
de un repositorio a través del protocolo @code{git://}, no puede tener plena
confianza en que los datos que reciba procedan realmente de la máquina que
ha indicado, y su conexión puede estar sujeta a interceptaciones. Es mejor
usar un transporte verificado y cifrado, como @code{https}. Aunque Git le
permite servir repositorios usando servidores web poco sofisticados basados
en archivos, existe un protocolo más rápido implementado en el programa
@code{git-http-backend}. Este programa es el motor de un servicio web de Git
adecuado. Está diseñado para ejecutarse tras una pasarela FastCGI. @xref{Servicios Web}, para más información sobre la ejecución del daemon
@code{fcgiwrap} necesario.

Guix tiene un tipo de datos de configuración distinto para proporcionar
repositorios Git sobre HTTP.

@deftp {Tipo de datos} git-http-configuration
Data type representing the configuration for a future
@code{git-http-service-type}; can currently be used to configure Nginx
through @code{git-http-nginx-location-configuration}.

@table @asis
@item @code{package} (predeterminado: @var{git})
El objeto paquete del sistema distribuido de control de versiones Git.

@item @code{git-root} (predeterminada: @file{/srv/git})
Directorio que contiene los repositorios Git que se expondrán al mundo.

@item @code{export-all?} (predeterminado: @code{#f})
Determina si se expondrá el acceso a todos los repositorios en
@var{git-root}, incluso si no contienen el archivo
@file{git-daemon-export-ok}.

@item @code{uri-path} (predeterminada: @samp{/git/})
Prefijo de la ruta del acceso de Git. Con el prefijo predeterminado
@samp{/git/}, @indicateurl{http://@var{servidor}/git/@var{repositorio}.git}
se traducirá en @code{/srv/git/@var{repositorio}.git}. Las peticiones cuyas
rutas URI no comiencen con dicho prefijo no se pasan a esta instancia de
Git.

@item @code{fcgiwrap-socket} (predeterminado: @code{127.0.0.1:9000})
Socket en el que el daemon @code{fcgiwrap} escucha. @xref{Servicios Web}.
@end table
@end deftp

No existe actualmente @code{git-http-service-type}; en vez de eso puede
crear una configuración @code{nginx-location-configuration} desde
@code{git-http-configuration} y añadir dicha configuración al servidor web.

@deffn {Procedimiento Scheme} git-http-nginx-location-configuration @
       [config=(git-http-configuration)]
Calcula una configuración @code{nginx-location-configuration} que
corresponde con la configuración http de Git proporcionada. Un ejemplo de
definición de servicio nginx que ofrece el directorio predeterminado
@file{/srv/git} sobre HTTPS podría ser:

@lisp
(service nginx-service-type
         (nginx-configuration
          (server-blocks
           (list
            (nginx-server-configuration
             (listen '("443 ssl"))
             (server-name "git.mi-maquina.org")
             (ssl-certificate
              "/etc/letsencrypt/live/git.mi-maquina.org/fullchain.pem")
             (ssl-certificate-key
              "/etc/letsencrypt/live/git.mi-maquina.org/privkey.pem")
             (locations
              (list
               (git-http-nginx-location-configuration
                (git-http-configuration (uri-path "/"))))))))))
@end lisp

This example assumes that you are using Let's Encrypt to get your TLS
certificate.  @xref{Servicios de certificados}.  The default @code{certbot}
service will redirect all HTTP traffic on @code{git.my-host.org} to HTTPS@.
You will also need to add an @code{fcgiwrap} proxy to your system services.
@xref{Servicios Web}.
@end deffn

@subsubheading Servicio Cgit

@cindex servicio Cgit
@cindex Git, interfaz web
@uref{https://git.zx2c4.com/cgit/, Cgit} es un servidor de fachada para
repositiorios Git escrito en C.

El ejemplo siguiente configura el servicio con los valores
predeterminados. Por omisión, se puede acceder a Cgit en el puerto 80
(@code{http://localhost:80}).

@lisp
(service cgit-service-type)
@end lisp

El tipo @code{file-object} designa o bien un objeto ``tipo-archivo''
(@pxref{Expresiones-G, objetos ``tipo-archivo''}), o bien una cadena.

@c %start of fragment

Los campos disponibles de @code{cgit-configuration} son:

@deftypevr {parámetro de @code{cgit-configuration}} package package
El paquete CGIT.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista-nginx-server-configuration nginx
Configuración de NGINX.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object about-filter
Especifica una orden que se llamará para dar formato al contenido de las
páginas ``about'' (tanto al nivel superior como cada repositorio).

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string agefile
Especifica una ruta, relativa a cada ruta de repositorio, que puede usarse
para especificar una fecha y hora de la revisión más reciente del
repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object auth-filter
Especifica una orden que se invocará para la validación de acceso al
repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string branch-sort
Opción que, cuando tiene valor @samp{age}, activa la ordenación por fecha en
la lista de referencias de ramas, y cuando tiene valor @samp{name} activa la
ordenación por nombre de rama.

El valor predeterminado es @samp{"name"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string cache-root
Ruta usada para el almacenamiento de las entradas de caché de cgit.

El valor predeterminado es @samp{"/var/cache/cgit"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-static-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de las páginas del repositiorio accedidas mediante un hash SHA1 fijo.

El valor predeterminado es @samp{-1}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-dynamic-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de las páginas del repositorio accedidas sin un hash SHA1 fijo.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-repo-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de la página de resumen del repositorio.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-root-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de la página del índice de repositorios.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-scanrc-ttl
Número que especifica el tiempo de vida, en minutos, para el resultado de la
búsqueda en una ruta para repositorios Git.

El valor predeterminado es @samp{15}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-about-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de la página de información del repositorio.

El valor predeterminado es @samp{15}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-snapshot-ttl
Número que especifica el tiempo de vida, en minutos, de la versión en caché
de las instantáneas.

El valor predeterminado es @samp{5}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer cache-size
El número máximo de entradas en la caché de cgit. Cuando el valor es
@samp{0}, se desactiva el almacenamiento en caché.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean case-sensitive-sort?
Ordena los elementos en la lista del repositorio diferenciando las
mayúsculas.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista clone-prefix
Lista de prefijos comunes que, cuando se combinen con la URL de un
repositorio, generan una URL que permite el clonado del repositorio.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista clone-url
Lista de plantillas @code{clone-url}.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object commit-filter
Orden ejecutada para el formato de mensajes de revisión.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string commit-sort
Opción que, cuando tiene valor @samp{date}, activa la ordenación estricta
por fecha en el registro histórico de revisiones, y cuando tiene valor
@samp{topo} activa la ordenación estricta topológica.

El valor predeterminado es @samp{"git log"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object css
URL que especifica el documento css incluido en todas las páginas de cgit.

El valor predeterminado es @samp{"/share/cgit/cgit.css"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object email-filter
Especifica una orden que se llamará para dar formato a los nombres y las
direcciones de correo electrónico de las revisoras, autoras y etiquetadoras
con el que se representarán en varios lugares de la interfaz cgit.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean embedded?
Opción que, cuando tiene valor @samp{#t}, hace que cgit genere un fragmento
HTML adecuado para embeberse en otras páginas HTML.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-commit-graph?
Opción que, cuando tiene el valor @samp{#t}, hace que cgit imprima un grafo
histórico de la revisión de arte ASCII a la izquierda de los mensajes de
revisión en la página del histórico del repositorio.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-filter-overrides?
Opción que, cuando tiene valor @samp{#t}, permite que todas las
configuraciones de filtros se sustituyan en los archivos cgitrc específicos
del repositorio.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-follow-links?
Opción que, cuando tiene valor @samp{#t}, permite a las usuarias seguir un
archivo en la vista de registro (log).

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-http-clone?
Si se proporciona @samp{#t}, cgit actuará como un simple servidor HTTP para
los clones de Git.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-index-links?
Opción que, cuando tiene valor @samp{#t}, hace que cgit genere enlaces
adicionales "summary" (resumen), "commit" (revisión) y "tree" (árbol) para
cada repositorio en el índice de repositorios.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-index-owner?
Opción que, cuando tiene valor @samp{#t}, hace que cgit muestre la
propietaria de cada repositorio en el índice del repositorios.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-log-filecount?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit imprima
el número de archivos modificados por cada revisión en la página de registro
histórico del repositorio ("log").

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-log-linecount?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit imprima
el número de líneas añadidas y eliminadas en cada revisión en la página de
registro histórico ("log").

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-remote-branches?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit muestre
ramas remotas en las vistas de resumen ("summary") y de referencias
("refs").

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-subject-links?
Opción que, cuando se proporciona el valor @code{1}, hace que cgit use el
asunto de la revisión previa como texto del enlace cuando se generen enlaces
a revisiones previas en la vista de la revisión.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-html-serving?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit use el
asunto de la revisión previa como texto del enlace cuando se generen enlaces
a revisiones previas en la vista de la revisión.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-tree-linenumbers?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit genere
enlaces de números de línea para los archivos (blob) de texto plano impresos
en la vista de árbol.

El valor predeterminado es @samp{#t}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean enable-git-config?
Opción que, cuando tiene valor @samp{#f}, permite que cgit use la
configuración de Git para fijar el valor de cualquier opción específica del
repositorio.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object favicon
URL usada para icono de los enlaces a cgit.

El valor predeterminado es @samp{"/favicon.ico"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string footer
El contenido del archivo especificado con esta opción se incluirá
literalmente en la parte inferior de todas las páginas (es decir, sustituye
al mensaje estándar "generated by...").

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string head-include
El contenido del archivo especificado con esta opción se incluirá
literalmente en la sección HEAD de HTML en todas las páginas.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string header
El contenido del archivo especificado con esta opción se incluirá
literalmente en la parte superior de todas las páginas.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object include
Nombre de un archivo de configuración que debe incluirse antes de procesar
el resto del archivo de configuración actual.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string index-header
El contenido del archivo especificado en esta opción se incluirá
literalmente sobre el índice de repositorios.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string index-info
El contenido del archivo especificado con esta opción se incluirá de manera
literal bajo la cabecera en la página de índice del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean local-time?
Opción que, cuando tiene valor @samp{#t}, hace que cgit imprima las fechas
de revisión y etiqueta en la zona horaria del servidor.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object logo
URL que especifica la fuente de una imagen usada como logo en todas las
páginas de cgit.

El valor predeterminado es @samp{"/share/cgit/cgit.png"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string logo-link
URL que se carga al pulsar la imagen del logo de cgit.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object owner-filter
Orden que se ejecuta para dar formato a la columna de propietaria (Owner) de
la página principal.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-atom-items
Número de elementos a mostrar en la vista de ``atom feeds''.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-commit-count
Número de entradas a mostrar por página en la vista del registro histórico
("log").

El valor predeterminado es @samp{50}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-message-length
Número de caracteres del mensaje de la revisión a mostrar en la vista del
registro histórico ("log").

El valor predeterminado es @samp{80}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-repo-count
Especifica el número de entradas a mostrar por página en la página de índice
de repositorios.

El valor predeterminado es @samp{50}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-repodesc-length
Especifica el número máximo de caracteres mostrados en la descripción del
repositorio en la página del índice de repositorios.

El valor predeterminado es @samp{80}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer max-blob-size
Especifica el tamaño máximo de un archivo (blob) para mostrarlo en HTML en
kilobytes.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string max-stats
Periodo estadístico máximo. Son valores aceptados @samp{week}, @samp{month},
@samp{quarter} and @samp{year}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} mimetype-alist mimetype
Tipo MIME para la extensión de archivo especificada.

El valor predeterminado es @samp{((gif "image/gif") (html "text/html") (jpg
"image/jpeg") (jpeg "image/jpeg") (pdf "application/pdf") (png "image/png")
(svg "image/svg+xml"))}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object mimetype-file
Especifica el archivo usado para la búsqueda automática de tipos MIME.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string module-link
Texto que se usará como la cadena de formato para un enlace cuando un
submódulo se imprime en el listado del directorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean nocache?
Si se proporciona el valor @samp{#t}, se desactiva la caché.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean noplainemail?
Si se proporciona @samp{#t}, se desactiva la impresión de direcciones de
correo completas de las autoras.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean noheader?
Opción que, cuando tiene valor @samp{#t}, hace que cgit omita la cabecera
estándar en todas las páginas.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista-proyectos project-list
Una lista de subdirectorios dentro de @code{repository-directory}, relativa
a él, que debe cargarse como repositorios Git. La lista vacía significa que
se cargarán todos los subdirectorios.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object readme
Texto usado como valor predeterminado para @code{cgit-repo-readme}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean remove-suffix?
Si se proporciona @code{#t} y @code{repository-directory} está activo, si se
encuentra algún repositorio con el sufijo @code{.git}, se elimina dicho
sufijo de la URL y del nombre.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer renamelimit
Número máximo de archivos considerados durante la detección de renombrados.

El valor predeterminado es @samp{-1}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string repository-sort
La forma de ordenar los repositorios de cada sección.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista-robots robots
Texto usado como contenido de la meta-etiqueta @code{robots}.

El valor predeterminado es @samp{("noindex" "nofollow")}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string root-desc
Texto impreso bajo la cabecera en la página de índice del repositorio.

El valor predeterminado es @samp{"a fast webinterface for the git dscm"}.<

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string root-readme
El contenido del archivo especificado con esta opción se incluirá de manera
literal tras el enlace de información del repositorio (``about'') en la
página de índice del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string root-title
Texto impreso como cabecera en la página de índice del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean scan-hidden-path
Si se proporciona @samp{#t} y repository-directory está activo,
repository-directory recorrerá recursivamente los directorios cuyos nombres
comiencen por punto. En otro caso, repository-directory no tendrá en cuenta
dichos directorios, considerados ocultos (``hidden''). Tenga en cuenta que
esto no incluye al directorio @file{.git} en repositorios con una copia de
trabajo.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista snapshots
Texto que especifica el conjunto predeterminado de formatos de instantánea
para los que cgit genera enlaces.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} directorio-repositorio repository-directory
Nombre del directorio en el que se buscarán repositorios (representa
@code{scan-path}).

El valor predeterminado es @samp{"/srv/git"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string section
Nombre actual de la sección de repositorios - todos los repositorios
definidos tras esta opción heredarán el nombre actual de sección.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string section-sort
Opción que, cuando tiene valor @samp{1}, ordenará las secciones en el
listado de repositorios por nombre.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer section-from-path
Número que, si se define antes de repository-directory, especifica cuantos
elementos de ruta de cada ruta de repositorio se usarán como nombre de
sección predeterminado.

El valor predeterminado es @samp{0}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} boolean side-by-side-diffs?
Si se proporciona el valor @samp{#t} se muestran las diferencias lado a lado
en vez de usar el formato universal de manera predeterminada.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} file-object source-filter
Especifica la orden que se ejecutará para dar formato a los archivos (blob)
de texto plano en la vista de árbol.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer summary-branches
Especifica el número de ramas mostradas en la vista resumen (``summary'')
del repositorio.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer summary-log
Especifica el número de entradas del registro mostradas en la vista resumen
(``summary'') del repositorio.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} integer summary-tags
Especifica el número que etiquetas que se mostrarán en la vista resumen
(``summary'') del repositorio.

El valor predeterminado es @samp{10}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string strict-export
Nombre de archivo que, en caso de especificarse, debe estar presente en el
repositiorio para que se permita el acceso de cgit a dicho repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} string virtual-root
URL que, en caso de especificarse, se usará como raíz de todos los enlaces
de cgit.

El valor predeterminado es @samp{"/"}.

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista-repository-cgit-configuration repositories
Lista de registros @dfn{cgit-repo} usados con la configuración.

El valor predeterminado es @samp{()}.

Los campos disponibles de @code{repository-cgit-configuration} son:

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-list snapshots
Una máscara de los formatos de instantánea para este repositorio para los
que cgit genera enlaces, restringida por la opción de configuración global
@code{snapshots}.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object source-filter
Sustituye al valor predeterminado de @code{source-filter}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string url
La URL relativa usada para el acceso al repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object about-filter
Sustituye al valor predeterminado de @code{about-filter}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string branch-sort
Cuando se proporciona el valor @samp{age}, activa la ordenación por fecha en
la lista de referencias de ramas, y cuando se proporciona @samp{name} se
activa la ordenación por nombre de rama.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-list clone-url
Una lista de URL que se pueden usar para clonar el repositorio.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object commit-filter
Sustituye al valor predeterminado de @code{commit-filter}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string commit-sort
Opción que, cuando tiene valor @samp{date}, activa la ordenación estricta
por fecha en el registro histórico de revisiones, y cuando tiene valor
@samp{topo} activa la ordenación estricta topológica.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string defbranch
Nombre de la rama predeterminada de este repositorio. Si no existe dicha
rama en el repositorio, se usará como predeterminado el primer nombre de
rama encontrado (tras su ordenación). De manera predeterminada, la rama a la
que apunta HEAD, o ``master'' si no existe un valor adecuado para HEAD.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string desc
El valor a mostrar como descripción del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string homepage
El valor a mostrar como página web principal del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object email-filter
Sustituye al valor predeterminado de @code{email-filter}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-commit-graph?
Esta opción se puede usar para forzar el valor de la opción de configuración
global @code{enable-commit-graph?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-log-filecount?
Esta opción se puede usar para forzar el valor de la opción de configuración
global @code{enable-log-filecount?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-log-linecount?
Esta opción se puede usar para forzar el valor de la opción de configuración
global @code{enable-log-linecount?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-remote-branches?
Opción que, cuando se proporciona el valor @samp{#t}, hace que cgit muestre
ramas remotas en las vistas de resumen ("summary") y de referencias
("refs").

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-subject-links?
Esta opción se puede usar para forzar el valor de la opción de configuración
global @code{enable-subject-links?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} maybe-repo-boolean enable-html-serving?
Esta opción se puede usar para forzar el valor de la opción de configuración
global @code{enable-html-serving?}.

El valor predeterminado es @samp{disabled}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-boolean hide?
Opción que, cuando tiene valor @samp{#t}, oculta el repositorio en el
índice.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-boolean ignore?
Opción que, cuando tiene valor @samp{#t}, ignora el repositorio.

El valor predeterminado es @samp{#f}

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object logo
URL que especifica la fuente de una imagen que se usará como logo en las
páginas de este repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string logo-link
URL que se carga al pulsar la imagen del logo de cgit.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-file-object owner-filter
Sustituye al valor predeterminado de @code{owner-filter}.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string module-link
Texto que se usará como la cadena de formato de un enlace cuando un
submódulo se imprima en el listado de un directorio. Los parámetros para la
cadena de formato son la ruta y el SHA1 de la revisión del submódulo.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} ruta-enlace-módulo module-link
Texto que se usará como la cadena de formato de un enlace cuando un
submódulo con la ruta de subdirectorio especificada se imprima en el listado
de un directorio.

El valor predeterminado es @samp{()}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string max-stats
Sustituye al máximo periodo estadístico predeterminado.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string name
El valor a mostrar como nombre del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string owner
Un valor usado para identificar a la propietaria del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string path
La ruta absoluta al directorio del repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string readme
Una ruta (relativa al repositorio) que especifica un archivo que será
incluido literalmente como página de información (``About'') de este
repositorio.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-string section
Nombre actual de la sección de repositorios - todos los repositorios
definidos tras esta opción heredarán el nombre actual de sección.

El valor predeterminado es @samp{""}.

@end deftypevr

@deftypevr {parámetro de @code{repository-cgit-configuration}} repo-list extra-options
Opciones adicionales a agregar al final del archivo cgitrc.

El valor predeterminado es @samp{()}.

@end deftypevr

@end deftypevr

@deftypevr {parámetro de @code{cgit-configuration}} lista extra-options
Opciones adicionales a agregar al final del archivo cgitrc.

El valor predeterminado es @samp{()}.

@end deftypevr


@c %end of fragment

No obstante, puede ser que únicamente desee usar un archivo @code{cgitrc}
existente. En ese caso, puede proporcionar @code{opaque-cgit-configuration}
como un registro a @code{cgit-service-type}. Como su nombre en inglés
indica, una configuración opaca no tiene gran capacidad reflexiva.

Los campos disponibles de @code{opaque-cgit-configuration} son:

@deftypevr {parámetro de @code{opaque-cgit-configuration}} package cgit
El paquete cgit.
@end deftypevr

@deftypevr {parámetro de @code{opaque-cgit-configuration}} string string
El contenido de @code{cgitrc}, como una cadena.
@end deftypevr

Por ejemplo, si su @code{cgitrc} es simplemente la cadena vacía, puede
instanciar un servicio cgit de esta manera:

@lisp
(service cgit-service-type
         (opaque-cgit-configuration
          (cgitrc "")))
@end lisp

@subsubheading Servicio Gitolite

@cindex servicio Gitolite
@cindex Git, alojamiento
@uref{https://gitolite.com/gitolite/, Gitolite} es una herramienta para el
almacenamiento de repositorios Git en un servidor central.

Gitolite puede manejar múltiples repositorios y usuarias, y permite una
configuración flexible de los permisos de las usuarias sobre los
repositorios.

El siguiente ejemplo configuraría Gitolite con la usuaria predeterminada
@code{git} y la clave pública SSH proporcionada.

@lisp
(service gitolite-service-type
         (gitolite-configuration
           (admin-pubkey (plain-file
                           "sunombre.pub"
                           "ssh-rsa AAAA... guix@@example.com"))))
@end lisp

Gitolite se configura a través de un repositorio de administración especial
que puede clonar, por ejemplo, si configuró Gitolite en @code{example.org},
ejecutaría la siguiente orden para clonar el repositorio de administración.

@example
git clone git@@example.com:gitolite-admin
@end example

Cuando se activa el servicio Gitolite, la clave @code{admin-pubkey}
proporcionada se insertará en el directorio @file{keydir} en el repositorio
gitolite-admin. Si esto resultase en un cambio en el repositorio, la
revisión se almacenaría con el mensaje ``gitolite setup by GNU Guix''.

@deftp {Tipo de datos} gitolite-configuration
Tipo de datos que representa la configuración de
@code{gitolite-service-type}.

@table @asis
@item @code{package} (predeterminado: @var{gitolite})
Gitolite package to use.  There are optional Gitolite dependencies that are
not included in the default package, such as Redis and git-annex.  These
features can be made available by using the @code{make-gitolite} procedure
in the @code{(gnu packages version-control}) module to produce a variant of
Gitolite with the desired additional dependencies.

The following code returns a package in which the Redis and git-annex
programs can be invoked by Gitolite's scripts:

@example
(use-modules (gnu packages databases)
             (gnu packages haskell-apps)
             (gnu packages version-control))
(make-gitolite (list redis git-annex))
@end example

@item @code{user} (predeterminada: @var{git})
Usuaria usada por Gitolite. Esta será la usuaria a la que se conectará
cuando acceda a Gitolite a través de SSH.

@item @code{group} (predeterminado: @var{git})
Grupo usado por Gitolite.

@item @code{home-directory} (predeterminado: @var{"/var/lib/gitolite"})
Directorio en el que se almacenará la configuración y repositorios de
Gitolite.

@item @code{rc-file} (predeterminado: @var{(gitolite-rc-file)})
Un objeto ``tipo-archivo'' (@pxref{Expresiones-G, objetos
``tipo-archivo''}), que representa la configuración de Gitolite.

@item @code{admin-pubkey} (predeterminada: @var{#f})
Un objeto ``tipo-archivo'' (@pxref{Expresiones-G, objetos ``tipo-archivo''})
usado para la configuración de Gitolite. Se insertará en el directorio
@file{keydir} dentro del repositorio gitolite-admin.

Para especificar la clave SSH como una cadena, use la función
@code{plain-file}.

@lisp
(plain-file "sunombre.pub" "ssh-rsa AAAA... guix@@example.com")
@end lisp

@end table
@end deftp

@deftp {Tipo de datos} gitolite-rc-file
Tipo de datos que representa el archivo RC de Gitolite.

@table @asis
@item @code{umask} (predeterminada: @code{#o0077})
Controla los permisos que Gitolite establece en los repositorios y sus
contenidos.

A value like @code{#o0027} will give read access to the group used by
Gitolite (by default: @code{git}).  This is necessary when using Gitolite
with software like cgit or gitweb.

@item @code{local-code} (default: @code{"$rc@{GL_ADMIN_BASE@}/local"})
Allows you to add your own non-core programs, or even override the shipped
ones with your own.

Please supply the FULL path to this variable. By default, directory called
"local" in your gitolite clone is used, providing the benefits of versioning
them as well as making changes to them without having to log on to the
server.

@item @code{unsafe-pattern} (default: @code{#f})
An optional Perl regular expression for catching unsafe configurations in
the configuration file.  See
@uref{https://gitolite.com/gitolite/git-config.html#compensating-for-unsafe_patt,
Gitolite's documentation} for more information.

When the value is not @code{#f}, it should be a string containing a Perl
regular expression, such as @samp{"[`~#\$\&()|;<>]"}, which is the default
value used by gitolite.  It rejects any special character in configuration
that might be interpreted by a shell, which is useful when sharing the
administration burden with other people that do not otherwise have shell
access on the server.

@item @code{git-config-keys} (predeterminadas: @code{""})
Gitolite allows you to set git config values using the @samp{config}
keyword.  This setting allows control over the config keys to accept.

@item @code{roles} (predeterminados: @code{'(("READERS" . 1) ("WRITERS" . ))})
Establece los nombres de rol que se permite usar a las usuarias que ejecuten
la orden perms.

@item @code{enable} (predeterminados: @code{'("help" "desc" "info" "perms" "writable" "ssh-authkeys" "git-config" "daemon" "gitweb")})
Esta configuración controla las órdenes y características activadas dentro
de Gitolite.

@end table
@end deftp


@subsubheading Gitile Service

@cindex Gitile service
@cindex Git, forge
@uref{https://git.lepiller.eu/gitile, Gitile} is a Git forge for viewing
public git repository contents from a web browser.

Gitile works best in collaboration with Gitolite, and will serve the public
repositories from Gitolite by default.  The service should listen only on a
local port, and a webserver should be configured to serve static resources.
The gitile service provides an easy way to extend the Nginx service for that
purpose (@pxref{NGINX}).

The following example will configure Gitile to serve repositories from a
custom location, with some default messages for the home page and the
footers.

@lisp
(service gitile-service-type
         (gitile-configuration
           (repositories "/srv/git")
           (base-git-url "https://myweb.site/git")
           (index-title "My git repositories")
           (intro '((p "This is all my public work!")))
           (footer '((p "This is the end")))
           (nginx-server-block
             (nginx-server-configuration
               (ssl-certificate
                 "/etc/letsencrypt/live/myweb.site/fullchain.pem")
               (ssl-certificate-key
                 "/etc/letsencrypt/live/myweb.site/privkey.pem")
               (listen '("443 ssl http2" "[::]:443 ssl http2"))
               (locations
                 (list
                   ;; Allow for https anonymous fetch on /git/ urls.
                   (git-http-nginx-location-configuration
                     (git-http-configuration
                       (uri-path "/git/")
                       (git-root "/var/lib/gitolite/repositories")))))))))
@end lisp

In addition to the configuration record, you should configure your git
repositories to contain some optional information.  First, your public
repositories need to contain the @file{git-daemon-export-ok} magic file that
allows Git to export the repository.  Gitile uses the presence of this file
to detect public repositories it should make accessible.  To do so with
Gitolite for instance, modify your @file{conf/gitolite.conf} to include this
in the repositories you want to make public:

@example
repo foo
    R = daemon
@end example

In addition, Gitile can read the repository configuration to display more
information on the repository.  Gitile uses the gitweb namespace for its
configuration.  As an example, you can use the following in your
@file{conf/gitolite.conf}:

@example
repo foo
    R = daemon
    desc = A long description, optionally with <i>HTML</i>, shown on the index page
    config gitweb.name = The Foo Project
    config gitweb.synopsis = A short description, shown on the main page of the project
@end example

Do not forget to commit and push these changes once you are satisfied.  You
may need to change your gitolite configuration to allow the previous
configuration options to be set.  One way to do that is to add the following
service definition:

@lisp
(service gitolite-service-type
          (gitolite-configuration
            (admin-pubkey (local-file "key.pub"))
            (rc-file
              (gitolite-rc-file
                (umask #o0027)
                ;; Allow to set any configuration key
                (git-config-keys ".*")
                ;; Allow any text as a valid configuration value
                (unsafe-patt "^$")))))
@end lisp

@deftp {Data Type} gitile-configuration
Data type representing the configuration for @code{gitile-service-type}.

@table @asis
@item @code{package} (default: @var{gitile})
Gitile package to use.

@item @code{host} (predeterminado: @code{"localhost"})
The host on which gitile is listening.

@item @code{port} (default: @code{8080})
The port on which gitile is listening.

@item @code{database} (default: @code{"/var/lib/gitile/gitile-db.sql"})
The location of the database.

@item @code{repositories} (default: @code{"/var/lib/gitolite/repositories"})
The location of the repositories.  Note that only public repositories will
be shown by Gitile.  To make a repository public, add an empty
@file{git-daemon-export-ok} file at the root of that repository.

@item @code{base-git-url}
The base git url that will be used to show clone commands.

@item @code{index-title} (default: @code{"Index"})
The page title for the index page that lists all the available repositories.

@item @code{intro} (default: @code{'()})
The intro content, as a list of sxml expressions.  This is shown above the
list of repositories, on the index page.

@item @code{footer} (default: @code{'()})
The footer content, as a list of sxml expressions.  This is shown on every
page served by Gitile.

@item @code{nginx-server-block}
An nginx server block that will be extended and used as a reverse proxy by
Gitile to serve its pages, and as a normal web server to serve its assets.

You can use this block to add more custom URLs to your domain, such as a
@code{/git/} URL for anonymous clones, or serving any other files you would
like to serve.
@end table
@end deftp


@node Servicios de juegos
@subsection Servicios de juegos

@subsubheading El servicio de La batalla por Wesnoth
@cindex wesnothd
@uref{https://wesnoth.org, La batalla por Wesnoth} es un juego de estrategia
táctica, de fantasía y basado en turnos, con varias campañas de una
jugadora, y partidas para múltiples jugadoras (tanto en red como
localmente).

@defvar {Variable Scheme} wesnothd-service-type
Tipo de servicio para el servicio wesnothd. Su valor debe ser un objeto
@code{wesnothd-configuration}.  Puede instanciarlo de esta manera para
ejecutar wesnothd con la configuración predeterminada:

@lisp
(service wesnothd-service-type)
@end lisp
@end defvar

@deftp {Tipo de datos} wesnothd-configuration
Tipo de datos que representa la configuración de @command{wesnothd}.

@table @asis
@item @code{package} (predeterminado: @code{wesnoth-server})
El paquete del servidor wesnoth usado.

@item @code{port} (predeterminado: @code{15000})
Número de puerto usado por el servidor.
@end table
@end deftp


@node Servicio PAM Mount
@subsection Servicio PAM Mount
@cindex pam-mount

El módulo @code{(gnu services pam-mount)} proporciona un servicio que
permite a las usuarias montar volúmenes cuando ingresen al sistema. Debe ser
capaz de montar cualquier formato de volumen que el sistema permita.

@defvar {Variable Scheme} pam-mount-service-type
Tipo de servicio para la implementación de PAM Mount.
@end defvar

@deftp {Tipo de datos} pam-mount-configuration
Tipo de datos que representa la configuración de PAM Mount.

Toma los siguientes parámetros:

@table @asis
@item @code{rules}
Las reglas de configuración que se usarán para generar
@file{/etc/security/pam_mount.conf.xml}.

Las reglas de configuración son elementos SXML (@pxref{SXML,,, guile, GNU
Guile Reference Manual}), y las reglas predeterminadas no incluyen el
montado de ningún dispositivo para ningún usuario en el ingreso al sistema:

@lisp
`((debug (@@ (enable "0")))
  (mntoptions (@@ (allow ,(string-join
                          '("nosuid" "nodev" "loop"
                            "encryption" "fsck" "nonempty"
                            "allow_root" "allow_other")
                          ","))))
  (mntoptions (@@ (require "nosuid,nodev")))
  (logout (@@ (wait "0")
             (hup "0")
             (term "no")
             (kill "no")))
  (mkmountpoint (@@ (enable "1")
                   (remove "true"))))
@end lisp

Algunos elementos @code{volume} deben añadirse de manera automática para
montar volúmenes en el ingreso. El siguiente ejemplo permite a la usuaria
@code{alicia} montar su directorio @env{HOME} cifrado y permite al usuario
@code{rober} montar la partición donde almacena sus datos:

@lisp
(define reglas-pam-mount
`((debug (@@ (enable "0")))
            (volume (@@ (user "alicia")
                       (fstype "crypt")
                       (path "/dev/sda2")
                       (mountpoint "/home/alicia")))
            (volume (@@ (user "rober")
                       (fstype "auto")
                       (path "/dev/sdb3")
                       (mountpoint "/home/rober/data")
                       (options "defaults,autodefrag,compress")))
            (mntoptions (@@ (allow ,(string-join
                                    '("nosuid" "nodev" "loop"
                                      "encryption" "fsck" "nonempty"
                                      "allow_root" "allow_other")
                                    ","))))
            (mntoptions (@@ (require "nosuid,nodev")))
            (logout (@@ (wait "0")
                       (hup "0")
                       (term "no")
                       (kill "no")))
            (mkmountpoint (@@ (enable "1")
                             (remove "true")))))

(service pam-mount-service-type
         (pam-mount-configuration
           (rules reglas-pam-mount)))
@end lisp

La lista completa de opciones posibles se puede encontrar en la página de
@command{man} de
@uref{http://pam-mount.sourceforge.net/pam_mount.conf.5.html,
pam_mount.conf}.
@end table
@end deftp


@node Servicios de Guix
@subsection Servicios de Guix

@subsubheading Coordinador de construcciones de Guix
El @uref{https://git.cbaines.net/guix/build-coordinator/,coordinador de
construcciones de Guix} ayuda en la distribución de las construcciones de
derivaciones entre máquinas que ejecuten un @dfn{agente}. El daemon de
construcción se usa todavía para la construcción de las derivaciones, pero
el coordinador de construcciones de Guix gestiona su lanzamiento y trabaja
con los resultados.

The Guix Build Coordinator consists of one @dfn{coordinator}, and one or
more connected @dfn{agent} processes.  The coordinator process handles
clients submitting builds, and allocating builds to agents.  The agent
processes talk to a build daemon to actually perform the builds, then send
the results back to the coordinator.

Existe un guión para ejecutar el componente de coordinación del servicio de
coordinación de construcciones de Guix, pero el servicio de Guix utiliza un
guión Guile personalizado en vez de este, para mejorar la integración con
las expresiones-G usadas en la configuración.

@defvar {Variable Scheme} guix-build-coordinator-service-type
Tipo de servicio para la coordinación de construcciones de Guix. Su valor
debe ser un objeto @code{guix-build-coordinator-configuration}.
@end defvar

@deftp {Tipo de datos} guix-build-coordinator-configuration
Tipo de datos que representa la configuración del servicio de coordinación
de construcciones de Guix.

@table @asis
@item @code{package} (predeterminado: @code{guix-build-coordinator})
El paquete del servicio de coordinación de construcciones de Guix usado.

@item @code{user} (predeterminado: @code{"guix-build-coordinator"})
Usuaria del sistema que ejecuta el servicio.

@item @code{group} (predeterminado: @code{"guix-build-coordinator"})
Grupo del sistema que ejecuta el servicio.

@item @code{database-uri-string} (predeterminada: @code{"sqlite:///var/lib/guix-build-coordinator/guix_build_coordinator.db"})
URI usada para la conexión a la base de datos.

@item @code{agent-communication-uri} (predeterminada: @code{"http://0.0.0.0:8745"})
La URI que describe cómo escuchar peticiones de los procesos agentes.

@item @code{client-communication-uri} (predeterminada: @code{"http://127.0.0.1:8746"})
La URI que describe cómo escuchar peticiones de los clientes. La interfaz
para los clientes permite la emisión de construcciones y no implementa
identificación actualmente, por lo que tenga cuidado cuando configure este
valor.

@item @code{allocation-strategy} (predeterminada: @code{#~basic-build-allocation-strategy})
Una expresión-G para la estrategia de reservas usada. Es un procedimiento
que recibe la ruta del almacén como un parámetro y rellena la planificación
de reservas en la base de datos.

@item @code{hooks} (predeterminada: @var{'()})
Una lista asociativa de procedimientos de extensión@footnote{NdT: ``hook''
en inglés tiene el sentido del gancho donde se ``enganchan'' las
extensiones.}. Proporcionan una forma de ejecutar código arbitrario tras
ciertos eventos, como inicio del procesamiento del resultado de una
construcción.

@item @code{parallel-hooks} (default: @var{'()})
Hooks can be configured to run in parallel.  This parameter is an
association list of hooks to do in parallel, where the key is the symbol for
the hook and the value is the number of threads to run.

@item @code{guile} (predeterminado: @code{guile-3.0-latest})
El paquete Guile con el que se ejecuta la coordinación de construcciones de
Guix.

@end table
@end deftp

@defvar {Variable Scheme} guix-build-coordinator-agent-service-type
Tipo de servicio para un agente del coordinador de construcciones de
Guix. Su valor debe ser un objeto
@code{guix-build-coordinator-agent-configuration}.
@end defvar

@deftp {Tipo de datos} guix-build-coordinator-agent-configuration
Tipo de datos que representa la configuración de un agente del coordinador
de construcciones de Guix.

@table @asis
@item @code{package} (default: @code{guix-build-coordinator/agent-only})
El paquete del servicio de coordinación de construcciones de Guix usado.

@item @code{user} (predeterminado: @code{"guix-build-coordinator-agent"})
Usuaria del sistema que ejecuta el servicio.

@item @code{coordinator} (predeterminado: @code{"http://localhost:8745"})
URI usada para la conexión al nodo coordinador.

@item @code{authentication}
Record describing how this agent should authenticate with the coordinator.
Possible record types are described below.

@item @code{systems} (predeterminado: @code{#f})
Los sistemas para los cuales este agente debe obtener construcciones. Los
procesos agente usan el sistema sobre el que se ejecuten como valor
predeterminado.

@item @code{max-parallel-builds} (predeterminado: @code{1})
El número de construcciones que se ejecutan en paralelo.

@item @code{max-allocated-builds} (default: @code{#f})
The maximum number of builds this agent can be allocated.

@item @code{max-1min-load-average} (default: @code{#f})
Load average value to look at when considering starting new builds, if the 1
minute load average exceeds this value, the agent will wait before starting
new builds.

This will be unspecified if the value is @code{#f}, and the agent will use
the number of cores reported by the system as the max 1 minute load average.

@item @code{derivation-substitute-urls} (default: @code{#f})
Identificadores URL a partir de los cuales se intentará obtener
sustituciones para derivaciones, si las derivaciones no están ya
disponibles.

@item @code{non-derivation-substitute-urls} (default: @code{#f})
Identificadores URL a partir de los cuales se intentará obtener
sustituciones para las entradas de las construcciones, si los elementos de
entrada del almacén no están ya disponibles.

@end table
@end deftp

@deftp {Data Type} guix-build-coordinator-agent-password-auth
Data type representing an agent authenticating with a coordinator via a UUID
and password.

@table @asis
@item @code{uuid}
El identificador UUID del agente. Debe ser generado por el proceso de
coordinación, almacenarse en la base de datos de coordinación, y usarse por
parte del agente en cuestión.

@item @code{password}
The password to use when connecting to the coordinator.

@end table
@end deftp

@deftp {Data Type} guix-build-coordinator-agent-password-file-auth
Data type representing an agent authenticating with a coordinator via a UUID
and password read from a file.

@table @asis
@item @code{uuid}
El identificador UUID del agente. Debe ser generado por el proceso de
coordinación, almacenarse en la base de datos de coordinación, y usarse por
parte del agente en cuestión.

@item @code{password-file}
Un archivo que contiene la contraseña usada para la conexión a la máquina
coordinadora.

@end table
@end deftp

@deftp {Data Type} guix-build-coordinator-agent-dynamic-auth
Data type representing an agent authenticating with a coordinator via a
dynamic auth token and agent name.

@table @asis
@item @code{agent-name}
Name of an agent, this is used to match up to an existing entry in the
database if there is one.  When no existing entry is found, a new entry is
automatically added.

@item @code{token}
Dynamic auth token, this is created and stored in the coordinator database,
and is used by the agent to authenticate.

@end table
@end deftp

@deftp {Data Type} guix-build-coordinator-agent-dynamic-auth-with-file
Data type representing an agent authenticating with a coordinator via a
dynamic auth token read from a file and agent name.

@table @asis
@item @code{agent-name}
Name of an agent, this is used to match up to an existing entry in the
database if there is one.  When no existing entry is found, a new entry is
automatically added.

@item @code{token-file}
File containing the dynamic auth token, this is created and stored in the
coordinator database, and is used by the agent to authenticate.

@end table
@end deftp

El paquete del coordinador de construcciones de Guix contiene un guión para
consultar a una instancia del servicio de datos de Guix derivaciones que
deben construirse, y envía dichas derivaciones al proceso de
coordinación. El siguiente tipo de servicio sirve de asistencia para
ejecución de dicho guión. Se trata de una herramienta adicional que resultar
de utilidad cuando se construyan derivaciones contenidas dentro de una
instancia del servicio de datos de Guix.

@defvar {Variable Scheme} guix-build-coordinator-queue-builds-service-type
Tipo de servicio para el guión
@command{guix-build-coordinator-queue-builds-from-guix-data-service}. Su
valor debe ser un objeto
@code{guix-build-coordinator-queue-builds-configuration}.
@end defvar

@deftp {Tipo de datos} guix-build-coordinator-queue-builds-configuration
Tipo de datos que representa las opciones de la cola de construcciones del
guión del servicio de dados de Guix.

@table @asis
@item @code{package} (predeterminado: @code{guix-build-coordinator})
El paquete del servicio de coordinación de construcciones de Guix usado.

@item @code{user} (predeterminada: @code{"guix-build-coordinator-queue-builds"})
Usuaria del sistema que ejecuta el servicio.

@item @code{coordinator} (default: @code{"http://localhost:8746"})
URI usada para la conexión al nodo coordinador.

@item @code{systems} (predeterminado: @code{#f})
Los sistemas para los que se obtienen derivaciones que construir.

@item @code{systems-and-targets} (predeterminado: @code{#f})
Una lista asociativa que contiene pares de sistema y objetivo para los que
obtener derivaciones que construir.

@item @code{guix-data-service} (predeterminado: @code{"https://data.guix.gnu.org"})
La instancia del servicio de datos de Guix a la que se consulta para conocer
las derivaciones que deben construirse.

@item @code{guix-data-service-build-server-id} (default: @code{#f})
The Guix Data Service build server ID corresponding to the builds being
submitted.  Providing this speeds up the submitting of builds as derivations
that have already been submitted can be skipped before asking the
coordinator to build them.

@item @code{processed-commits-file} (predeterminado: @code{"/var/cache/guix-build-coordinator-queue-builds/processed-commits"})
Archivo en el que se registran las revisiones que se han procesado, para
evitar procesarlas de nuevo innecesariamente si se reinicia el servicio.

@end table
@end deftp

@subsubheading Servicio de datos de Guix
El @uref{http://data.guix.gnu.org,servicio de datos de Guix} procesa,
almacena y proporciona datos acerca de GNU Guix. Esto incluye información
sobre paquetes, derivaciones y avisos de ``lint''.

Los datos se almacenan en una base de datos PostgreSQL, y están disponibles
a través de una interfaz web.

@defvar {Variable Scheme} guix-data-service-type
Tipo de servicio para el servicio de datos de Guix. Su valor debe ser un
objeto @code{guix-data-service-configuration}. El servicio opcionalmente
extiende el servicio getmail, puesto que la lista de correo guix-commits se
usa para conocer los cambios del repositorio git de Guix.
@end defvar

@deftp {Tipo de datos} guix-data-service-configuration
Tipo de datos que representa la configuración del servicio de datos de Guix.

@table @asis
@item @code{package} (predeterminado: @code{guix-data-service})
El paquete del servicio de datos de Guix usado.

@item @code{user} (usuaria: @code{"guix-data-service"})
Usuaria del sistema que ejecuta el servicio.

@item @code{group} (predeterminado: @code{"guix-data-service"})
Grupo del sistema que ejecuta el servicio.

@item @code{port} (predeterminado: @code{8765})
El puerto al que se asociará el servicio web.

@item @code{host} (predeterminada: @code{"127.0.0.1"})
El nombre de máquina al que se asociará el servicio web.

@item @code{getmail-idle-mailboxes} (predeterminado: @code{#f})
Si se proporciona un valor, es la lista de bandejas de correo en las cuales
la configuración debe indicar su lectura al servicio getmail.

@item @code{commits-getmail-retriever-configuration} (predeterminado: @code{#f})
Si se proporciona un valor, es el objeto
@code{getmail-retriever-configuration} con el que se configura getmail para
obtener recibir el correo de la lista guix-commits.

@item @code{extra-options} (predeterminadas: @var{'()})
Opciones de línea de órdenes adicionales para @command{guix-data-service}.

@item @code{extra-process-jobs-options} (predeterminadas: @var{'()})
Opciones de línea de órdenes adicionales para
@command{guix-data-service-process-jobs}.

@end table
@end deftp

@subsubheading Nar Herder
The @uref{https://git.cbaines.net/guix/nar-herder/about/,Nar Herder} is a
utility for managing a collection of nars.

@defvar {Scheme Variable} nar-herder-type
Service type for the Guix Data Service.  Its value must be a
@code{nar-herder-configuration} object.  The service optionally extends the
getmail service, as the guix-commits mailing list is used to find out about
changes in the Guix git repository.
@end defvar

@deftp {Data Type} nar-herder-configuration
Tipo de datos que representa la configuración del servicio de datos de Guix.

@table @asis
@item @code{package} (default: @code{nar-herder})
The Nar Herder package to use.

@item @code{user} (default: @code{"nar-herder"})
Usuaria del sistema que ejecuta el servicio.

@item @code{group} (default: @code{"nar-herder"})
Grupo del sistema que ejecuta el servicio.

@item @code{port} (default: @code{8734})
Número de puerto usado por el servidor.

@item @code{host} (predeterminada: @code{"127.0.0.1"})
The host to bind the server to.

@item @code{mirror} (predeterminado: @code{#f})
Optional URL of the other Nar Herder instance which should be mirrored.
This means that this Nar Herder instance will download it's database, and
keep it up to date.

@item @code{database} (default: @code{"/var/lib/nar-herder/nar_herder.db"})
Location for the database.  If this Nar Herder instance is mirroring
another, the database will be downloaded if it doesn't exist.  If this Nar
Herder instance isn't mirroring another, an empty database will be created.

@item @code{database-dump} (default: @code{"/var/lib/nar-herder/nar_herder_dump.db"})
Location of the database dump.  This is created and regularly updated by
taking a copy of the database.  This is the version of the database that is
available to download.

@item @code{storage} (default: @code{#f})
Optional location in which to store nars.

@item @code{storage-limit} (default: @code{"none"})
Limit in bytes for the nars stored in the storage location.  This can also
be set to ``none'' so that there is no limit.

When the storage location exceeds this size, nars are removed according to
the nar removal criteria.

@item @code{storage-nar-removal-criteria} (default: @code{'()})
Criteria used to remove nars from the storage location.  These are used in
conjunction with the storage limit.

When the storage location exceeds the storage limit size, nars will be
checked against the nar removal criteria and if any of the criteria match,
they will be removed.  This will continue until the storage location is
below the storage limit size.

Each criteria is specified by a string, then an equals sign, then another
string. Currently, only one criteria is supported, checking if a nar is
stored on another Nar Herder instance.

@item @code{ttl} (predeterminado: @code{#f})
Produce cabeceras HTTP @code{Cache-Control} que anuncian un tiempo-de-vida
(TTL) de @var{ttl}. @var{ttl} debe indicar una duración: @code{5d} significa
5 días, @code{1m} significa un mes, etc.

This allows the user's Guix to keep substitute information in cache for
@var{ttl}.

@item @code{negative-ttl} (default: @code{#f})
Similarly produce @code{Cache-Control} HTTP headers to advertise the
time-to-live (TTL) of @emph{negative} lookups---missing store items, for
which the HTTP 404 code is returned.  By default, no negative TTL is
advertised.

@item @code{log-level} (default: @code{'DEBUG})
Log level to use, specify a log level like @code{'INFO} to stop logging
individual requests.

@end table
@end deftp

@node Servicios de Linux
@subsection Servicios de Linux

@cindex oom
@cindex gestor de llenado de la memoria (out of memory killer)
@cindex earlyoom
@cindex daemon Early OOM (early out of memory)
@subsubheading Servicio Early OOM

@uref{https://github.com/rfjakob/earlyoom,Early OOM}, también conocido como
Earlyoom, es un daemon minimalista de gestión del llenado de la
memoria@footnote{NdT: Del inglés Out Of Memory.} que se ejecuta en espacio
de usuaria y proporciona una alternativa al gestor del propio núcleo con una
respuesta más inmediata y más configurable. Es útil para prevenir que el
sistema no responda cuando se queda sin memoria.

@deffn {Variable Scheme} earlyoom-service-type
Tipo de servicio para el servicio @command{earlyoom}, el daemon Early
OOM. Su valor debe ser un objeto @code{earlyoom-configuration}, descrito a
continuación. El servicio se puede instanciar con su configuración
predeterminada de esta manera:

@lisp
(service earlyoom-service-type)
@end lisp
@end deffn

@deftp {Tipo de datos} earlyoom-configuration
Esta es el registro de configuración para el servicio
@code{earlyoom-service-type}.

@table @asis
@item @code{earlyoom} (predeterminado: @var{earlyoom})
El paquete Earlyoom usado.

@item @code{minimum-available-memory} (predeterminado: @code{10})
El límite inferior de memoria @emph{disponible}, en porcentaje.

@item @code{minimum-free-swap} (predeterminado: @code{10})
El límite inferior de memoria de intercambio libre, en porcentaje.

@item @code{prefer-regexp} (predeterminado: @code{#f})
Una expresión regular (como cadena) que corresponda con los nombres de los
procesos que preferiblemente deban pararse.

@item @code{avoid-regexp} (predeterminado: @code{#f})
Una expresión regular (como cadena) que corresponda con los nombres de los
procesos que @emph{no} deban pararse.

@item @code{memory-report-interval} (predeterminado: @code{0})
Intervalo en segundos con el cual se imprime el informe de memoria. No está
activo de manera predeterminada.

@item @code{ignore-positive-oom-score-adj?} (predeterminado: @code{#f})
Valor booleano que indica si se deben ignoran los ajustes positivos
realizados en @file{/proc/*/oom_score_adj}.

@item @code{show-debug-messages?} (predeterminado: @code{#f})
Valor booleano que indica si los mensajes de depuración deben
imprimirse. Los registros se almacenan en @file{/var/log/earlyoom.log}.

@item @code{send-notification-command} (predeterminada: @code{#f})
Puede usarse para proporcionar una orden personalizada para el envío de
notificaciones.
@end table
@end deftp

@cindex modprobe
@cindex cargador de módulos del núcleo
@subsubheading Servicio de carga de módulos del núcleo

The kernel module loader service allows one to load loadable kernel modules
at boot.  This is especially useful for modules that don't autoload and need
to be manually loaded, as is the case with @code{ddcci}.

@deffn {Variable Scheme} kernel-module-loader-service-type
Tipo de servicio para la carga de módulos del núcleo durante el arranque con
@command{modprobe}. Su valor debe ser una lista de cadenas que representan
nombres de módulo. Por ejemplo, la carga de los controladores proporcionados
por @code{ddcci-driver-linux} en modo de depuración proporcionando algunos
parámetros para el módulo puede realizarse de la siguiente manera:

@lisp
(use-modules (gnu) (gnu services))
(use-package-modules linux)
(use-service-modules linux)

(define ddcci-config
  (plain-file "ddcci.conf"
              "options ddcci dyndbg delay=120"))

(operating-system
  ...
  (services (cons* (service kernel-module-loader-service-type
                            '("ddcci" "ddcci_backlight"))
                   (simple-service 'ddcci-config etc-service-type
                                   (list `("modprobe.d/ddcci.conf"
                                           ,ddcci-config)))
                   %base-services))
  (kernel-loadable-modules (list ddcci-driver-linux)))
@end lisp
@end deffn

@cindex rasdaemon
@cindex Platform Reliability, Availability and Serviceability daemon
@subsubheading Rasdaemon Service

The Rasdaemon service provides a daemon which monitors platform
@acronym{RAS, Reliability@comma{} Availability@comma{} and Serviceability}
reports from Linux kernel trace events, logging them to syslogd.

Reliability, Availability and Serviceability is a concept used on servers
meant to measure their robustness.

@strong{Relability} is the probability that a system will produce correct
outputs:

@itemize @bullet
@item Generally measured as Mean Time Between Failures (MTBF), and
@item Enhanced by features that help to avoid, detect and repair hardware
faults
@end itemize

@strong{Availability} is the probability that a system is operational at a
given time:

@itemize @bullet
@item Generally measured as a percentage of downtime per a period of time, and
@item Often uses mechanisms to detect and correct hardware faults in runtime.
@end itemize

@strong{Serviceability} is the simplicity and speed with which a system can
be repaired or maintained:

@itemize @bullet
@item Generally measured on Mean Time Between Repair (MTBR).
@end itemize


Among the monitoring measures, the most usual ones include:

@itemize @bullet
@item CPU – detect errors at instruction execution and at L1/L2/L3 caches;
@item Memory – add error correction logic (ECC) to detect and correct errors;
@item I/O – add CRC checksums for transferred data;
@item Storage – RAID, journal file systems, checksums, Self-Monitoring,
Analysis and Reporting Technology (SMART).
@end itemize

By monitoring the number of occurrences of error detections, it is possible
to identify if the probability of hardware errors is increasing, and, on
such case, do a preventive maintenance to replace a degraded component while
those errors are correctable.

For detailed information about the types of error events gathered and how to
make sense of them, see the kernel administrator's guide at
@url{https://www.kernel.org/doc/html/latest/admin-guide/ras.html}.

@defvr {Scheme Variable} rasdaemon-service-type
Service type for the @command{rasdaemon} service.  It accepts a
@code{rasdaemon-configuration} object.  Instantiating like

@lisp
(service rasdaemon-service-type)
@end lisp

will load with a default configuration, which monitors all events and logs
to syslogd.
@end defvr

@deftp {Data Type} rasdaemon-configuration
The data type representing the configuration of @command{rasdaemon}.

@table @asis
@item @code{record?} (default: @code{#f})

A boolean indicating whether to record the events in an SQLite database.
This provides a more structured access to the information contained in the
log file.  The database location is hard-coded to
@file{/var/lib/rasdaemon/ras-mc_event.db}.

@end table
@end deftp

@cindex zram
@cindex memoria de intercambio comprimida
@cindex Dispositivos de bloques comprimidos basados en RAM
@subsubheading Servicio de dispositivo Zram

El servicio de dispositivo Zram proporciona un dispositivo comprimido de
intercambio en la memoria del sistema.  La documentación del núcleo Linux
contiene más información sobre dispositivos
@uref{https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html,zram}.

@deffn {Variable Scheme} zram-device-service-type
Este servicio crea el dispositivo de bloques zram, le proporciona el formato
de la memoria de intercambio y lo activa. El valor del servicio es un
registro @code{zram-device-configuration}.

@deftp {Tipo de datos} zram-device-configuration
Este tipo de datos representa la configuración del servicio zram-device.

@table @asis
@item @code{size} (predeterminado: @code{"1G"})
Es la cantidad de espacio que desea proporcionar al dispositivo zram. Acepta
una cadena y puede ser el número de bytes o usar un sufijo, como por ejemplo
@code{"512M"} o @code{1024000}.
@item @code{compression-algorithm} (predeterminado: @code{'lzo})
Algoritmo de compresión que desea usar. Es difícil enumerar todas las
opciones de compresión posibles, pero las más habituales entre las
implementadas por el núcleo Linux Libre usado por Guix incluyen @code{'lzo},
@code{'lz4} y @code{'zstd}.
@item @code{memory-limit} (predeterminado: @code{0})
Cantidad máxima de memoria que el dispositivo zram puede usar. Proporcionar
el valor '0' desactiva el límite. Mientras que generalmente se espera que la
compresión tenga una relación con los datos sin comprimir de 2:1, es posible
que se escriban datos en la memoria de intercambio que no se pueden
comprimir más, y esta es una forma de limitar cuanta memoria puede
usarse. Acepta una cadena y puede ser un número de bytes o un usar sufijo,
por ejemplo @code{"2G"}.
@item @code{priority} (default @code{#f})
This is the priority of the swap device created from the zram device.
@xref{Swap Space} for a description of swap priorities.  You might want to
set a specific priority for the zram device, otherwise it could end up not
being used much for the reasons described there.
@end table

@end deftp
@end deffn

@node Servicios de Hurd
@subsection Servicios de Hurd

@defvr {Variable Scheme} hurd-console-service-type
Este servicio inicia el cliente de consola @code{VGA} en Hurd.

El valor de este servicio es un registro @code{hurd-console-configuration}.
@end defvr

@deftp {Tipo de datos} hurd-console-configuration
Este tipo de datos representa la configuración del servicio
hurd-console-service.

@table @asis
@item @code{hurd} (predeterminado: @var{hurd})
El paquete de Hurd usado.
@end table
@end deftp

@defvr {Variable Scheme} hurd-getty-service-type
Este servicio inicia una interfaz de teletipo (``tty'') mediante el uso del
programa @code{getty} de Hurd.

El valor del servicio es un registro @code{hurd-getty-configuration}.
@end defvr

@deftp {Tipo de datos} hurd-getty-configuration
Este tipo de datos representa la configuración del servicio
hurd-getty-service.

@table @asis
@item @code{hurd} (predeterminado: @var{hurd})
El paquete de Hurd usado.

@item @code{tty}
El nombre de la consola en la que se ejecuta este Getty---por ejemplo,
@code{"tty1"}.

@item @code{baud-rate} (predeterminado: @code{38400})
Un entero que especifica la tasa de transmisión de interfaz de teletipo.

@end table
@end deftp

@node Servicios misceláneos
@subsection Servicios misceláneos

@cindex huella dactilar
@subsubheading Servicio de huella dactilar

El módulo @code{(gnu services authentication)} proporciona un servicio DBus
para leer e identificar huellas dactilares mediante un sensor de huellas.

@defvr {Variable Scheme} fprintd-service-type
El tipo de servicio para @command{fprintd}, que proporciona la capacidad de
lectura de huellas dactilares.

@lisp
(service fprintd-service-type)
@end lisp
@end defvr

@cindex sysctl
@subsubheading Servicios de control del sistema

El módulo @code{(gnu services sysctl)} proporciona servicios para configurar
parámetros del núcleo durante el arranque.

@defvr {Variable Scheme} sysctl-service-type
El tipo de servicio para @command{sysctl}, que modifica parámetros del
núcleo bajo @file{/proc/sys}. Para activar el encaminamiento de tráfico IPv4
se puede instanciar de esta manera:

@lisp
(service sysctl-service-type
         (sysctl-configuration
           (settings '(("net.ipv4.ip_forward" . "1")))))
@end lisp

Since @code{sysctl-service-type} is used in the default lists of services,
@code{%base-services} and @code{%desktop-services}, you can use
@code{modify-services} to change its configuration and add the kernel
parameters that you want (@pxref{Referencia de servicios,
@code{modify-services}}).

@lisp
(modify-services %base-services
  (sysctl-service-type config =>
                       (sysctl-configuration
                         (settings (append '(("net.ipv4.ip_forward" . "1"))
                                           %default-sysctl-settings)))))
@end lisp

@end defvr

@deftp {Tipo de datos} sysctl-configuration
Tipo de datos que representa la configuración de @command{sysctl}.

@table @asis
@item @code{sysctl} (predeterminado: @code{(file-append procps "/sbin/sysctl"})
El ejecutable @command{sysctl} usado.

@item @code{settings} (default: @code{%default-sysctl-settings})
Una lista asociativa que especifica parámetros del núcleo y sus valores.
@end table
@end deftp

@defvr {Scheme Variable} %default-sysctl-settings
An association list specifying the default @command{sysctl} parameters on
Guix System.
@end defvr

@cindex pcscd
@subsubheading Servicio del daemon de tarjetas inteligentes PC/SC

The @code{(gnu services security-token)} module provides the following
service to run @command{pcscd}, the PC/SC Smart Card Daemon.
@command{pcscd} is the daemon program for pcsc-lite and the MuscleCard
framework.  It is a resource manager that coordinates communications with
smart card readers, smart cards and cryptographic tokens that are connected
to the system.

@defvr {Variable Scheme} pcscd-service-type
Tipo de servicio para el servicio @command{pcscd}. Su valor debe ser un
objeto @code{pcscd-configuration}. Puede instanciarlo de esta manera para
ejecutar pcscd con la configuración predeterminada:

@lisp
(service pcscd-service-type)
@end lisp
@end defvr

@deftp {Tipo de datos} pcscd-configuration
Tipo de datos que representa la configuración de @command{pcscd}.

@table @asis
@item @code{pcsc-lite} (predeterminado: @code{pcsc-lite})
El paquete pcsc-lite que proporciona pcscd.
@item @code{usb-drivers} (predeterminado: @code{(list ccid)})
List of packages that provide USB drivers to pcscd.  Drivers are expected to
be under @file{pcsc/drivers} in the store directory of the package.
@end table
@end deftp

@cindex lirc
@subsubheading Servicio Lirc

El módulo @code{(gnu services lirc)} proporciona el siguiente servicio.

@deffn {Procedimiento Scheme} lirc-service [#:lirc lirc] @
       [#:device #f] [#:driver #f] [#:config-file #f] @ [#:extra-options '()]
Devuelve un servicio que ejecuta @url{http://www.lirc.org,LIRC}, un daemon
que decodifica señales infrarrojas de dispositivos de control remoto.

De manera opcional, se pueden especificar @var{device}, @var{driver} y
@var{config-file} (nombre del archivo de configuración) may be specified.
Véase el manual de @command{lircd} para obtener más detalles.

Por último, @var{extra-options} es una lista de opciones adicionales para la
línea de órdenes proporcionada a @command{lircd}.
@end deffn

@cindex spice
@subsubheading Servicio Spice

El módulo @code{(gnu services spice)} proporciona el siguiente servicio.

@deffn {Procedimiento Scheme} spice-vdagent-service [#:spice-vdagent]
Devuelve un servicio que ejecuta @url{https://www.spice-space.org,VDAGENT},
un daemon que permite compartir el portapapeles con una máquina virtual y la
configuración de la resolución de la pantalla de la máquina virtual cuando
la ventana de la consola gráfica cambia de tamaño.
@end deffn

@cindex inputattach
@subsubheading Servicio inputattach

@cindex entrada de tablet, para Xorg
@cindex entrada de pantalla táctil, para Xorg
El servicio @uref{https://linuxwacom.github.io/, inputattach} permite el uso
de dispositivos de entrada como tabletas Wacom, pantallas táctiles, o
joysticks con el servidor gráfico Xorg.

@deffn {Variable Scheme} inputattach-service-type
Tipo de un servicio que ejecuta @command{inputattach} con un dispositivo y
reenvía los eventos que produzca.
@end deffn

@deftp {Tipo de datos} inputattach-configuration
@table @asis
@item @code{device-type} (predeterminado: @code{"wacom"})
Tipo del dispositivo al que conectarse. Ejecute @command{inputattach
--help}, del paquete @code{inputattach}, para ver la lista de tipos de
dispositivo implementados.

@item @code{device} (predeterminado: @code{"/dev/ttyS0"})
El nombre de archivo para la conexión al dispositivo.

@item @code{baud-rate} (predeterminado: @code{#f})
Tasa de transmisión usada para las conexiones serie. Debe ser un número o
@code{#f}.

@item @code{log-file} (predeterminado: @code{#f})
Si es verdadero, debe ser el nombre de un archivo en el que registrar los
mensajes.
@end table
@end deftp

@subsubheading Servicio de diccionario
@cindex diccionario
El módulo @code{(gnu services dict)} proporciona el servicio siguiente:

@defvr {Variable Scheme} dicod-service-type
Tipo de servicio que ejecuta el daemon @command{dicod}, una implementación
del servidor DICT (@pxref{Dicod,,, dico, GNU Dico Manual}).
@end defvr

@deffn {Procedimiento Scheme} dicod-service [#:config (dicod-configuration)]
Devuelve un servicio que ejecuta el daemon @command{dicod}, una
implementación del servidor DICT (@pxref{Dicod,,, dico, GNU Dico Manual}).

El parámetro opcional @var{config} especifica la configuración para
@command{dicod}, que debe ser un objeto @code{<dicod-configuration>}, de
manera predeterminada proporciona el diccionario colaborativo internacional
de Inglés de GNU.

Puede añadir @command{open localhost} en su archivo @file{~/.dico} para
hacer que @code{localhost} sea el servidor predeterminado de su cliente
@command{dico} (@pxref{Initialization File,,, dico, GNU Dico Manual}).
@end deffn

@deftp {Tipo de datos} dicod-configuration
Tipo de datos que representa la configuración de dicod.

@table @asis
@item @code{dico} (predeterminado: @var{dico})
El objeto paquete del servidor de diccionario GNU Dico.

@item @code{interfaces} (predeterminada: @var{'("localhost")})
Es la lista de direcciones IP y puertos, y posiblemente nombres de archivo
de sockets, en los que se debe escuchar (@pxref{Server Settings,
@code{listen} directive,, dico, GNU Dico Manual}).

@item @code{handlers} (predeterminados: @var{'()})
Lista de objetos @code{<dicod-handler>} que identifican los controladores
(instancias de módulos).

@item @code{databases} (predeterminada: @var{(list %dicod-database:gcide)})
Lista de objetos @code{<dicod-database>} que identifican los diccionarios
proporcionados.
@end table
@end deftp

@deftp {Tipo de datos} dicod-handler
Tipo de datos que representa un controlador de diccionario (instancia de un
módulo).

@table @asis
@item @code{name}
Nombre del controlador (instancia de un módulo).

@item @code{module} (predeterminado: @var{#f})
Nombre del módulo del controlador de dicod (instancia). Si es @code{#f}, el
módulo tiene el mismo nombre que el controlador. (@pxref{Módulos,,, dico,
GNU Dico Manual}).

@item @code{options}
Lista de cadenas o expresiones-G que representan los parámetros al módulo de
control
@end table
@end deftp

@deftp {Tipo de datos} dicod-database
Tipo de datos que representa una base de datos de diccionario.

@table @asis
@item @code{name}
Nombre de la base de datos, será usada en las órdenes DICT.

@item @code{handler}
Nombre del controlador de dicod (instancia de un módulo) usado por esta base
de datos (@pxref{Handlers,,, dico, GNU Dico Manual}).

@item @code{complex?} (predeterminado: @var{#f})
Determina si se usará la configuración compleja. La configuración compleja
necesita un objeto @code{<dicod-handler>}, que no es necesario en otro caso.

@item @code{options}
Lista de cadenas o expresiones-g que representan los parámetros para la base
de datos (@pxref{Databases,,, dico, GNU Dico Manual}).
@end table
@end deftp

@defvr {Variable Scheme} %dicod-database:gcide
Un objeto @code{<dicod-service>} que ofrece el diccionario internacional
colaborativo de inglés de GNU usando el paquete @code{gcide}.
@end defvr

A continuación se encuentra un ejemplo de configuración de
@code{dicod-service}.

@lisp
(dicod-service #:config
  (dicod-configuration
   (handlers (list (dicod-handler
                    (name "wordnet")
                    (module "dictorg")
                    (options
                     (list #~(string-append "dbdir=" #$wordnet))))))
   (databases (list (dicod-database
                     (name "wordnet")
                     (complex? #t)
                     (handler "wordnet")
                     (options '("database=wn")))
                    %dicod-database:gcide))))
@end lisp

@cindex Docker
@subsubheading Servicio Docker

El módulo @code{(gnu services docker)} proporciona los siguientes servicios.

@defvr {Variable Scheme} docker-service-type

Este es el tipo del servicio que ejecuta @url{https://www.docker.com,
Docker}, un daemon que puede ejecutar empaquetados de aplicaciones (a los
que a veces nos referimos como ``contenedores'') en entornos aislados.

@end defvr

@deftp {Tipo de datos} docker-configuration
Este es el tipo de datos que representa la configuración de Docker y
Containerd.

@table @asis

@item @code{docker} (default: @code{docker})
El paquete de daemon de Docker usado.

@item @code{docker-cli} (default: @code{docker-cli})
El paquete de cliente de Docker usado.

@item @code{containerd} (predeterminado: @var{containerd})
El paquete Containerd usado.

@item @code{proxy} (predeterminado: @var{docker-libnetwork-cmd-proxy})
La pasarela de espacio de usuario para red de Docker usada.

@item @code{enable-proxy?} (predeterminado: @code{#t})
Activa o desactiva el uso de la pasarela de espacio de usuario para red de
Docker.

@item @code{debug?} (predeterminado: @code{#f})
Activa o desactiva la salida de depuración.

@item @code{enable-iptables?} (predeterminado: @code{#t})
Activa o desactiva la adición de reglas para iptables.

@item @code{environment-variables} (default: @code{()})
List of environment variables to set for @command{dockerd}.

This must be a list of strings where each string has the form
@samp{@var{key}=@var{value}} as in this example:

@lisp
(list "LANGUAGE=eo:ca:eu"
      "TMPDIR=/tmp/dockerd")
@end lisp

@end table
@end deftp

@cindex Singularity, servicio de contenedores
@defvr {Variable Scheme} singularity-service-type
Tipo de servicio que le permite ejecutar
@url{https://www.sylabs.io/singularity/, Singularity}, una herramienta
tipo-Docker para crear y ejecutar aplicaciones empaquetadas (también
conocidas como ``contenedores''). El valor para este servicio es el paquete
de Singularity usado.

El servicio no instala un daemon; en vez de ello, instala programas
auxiliares con con el bit setuid de root (@pxref{Programas con setuid}) de modo
que usuarias sin privilegios puedan ejecutar @command{singularity run} y
ordenes similares.
@end defvr

@cindex Audit
@subsubheading Servicio Auditd

El módulo @code{(gnu services auditd)} proporciona el servicio siguiente:

@defvr {Variable Scheme} auditd-service-type

Este es el tipo del servicio que ejecuta
@url{https://people.redhat.com/sgrubb/audit/,auditd}, un daemon que
recolecta información relevante a la seguridad en su sistema.

Ejemplos de cosas que se pueden recolectar:

@enumerate
@item
Acceso a archivos
@item
Llamadas al sistema
@item
Órdenes invocadas
@item
Intentos fallidos de ingreso en el sistema
@item
Activaciones de filtros en el cortafuegos
@item
Accesos de red
@end enumerate

Puede usarse @command{auditctl} del paquete @code{audit} para añadir o
eliminar eventos a recolectar (hasta el siguiente reinicio). Para hacer
permanente la recolección de dichos eventos, introduzca los parámetros de la
línea de órdenes de auditctl en un archivo llamado @file{audit.rules} del
directorio de configuración (véase a continuación). También se puede usar
@command{aureport} del paquete @code{audit} para ver un informe de todos los
eventos registrados. El daemon audit habitualmente registra los eventos en
el archivo @file{/var/log/audit}.

@end defvr

@deftp {Tipo de datos} auditd-configuration
Este es el tipo de datos que representa la configuración de auditd.

@table @asis

@item @code{audit} (predeterminado: @code{audit})
El paquete audit usado.

@item @code{configuration-directory} (predeterminado: @code{%default-auditd-configuration-directory})
Directorio que contiene el archivo de configuración para el paquete audit,
cuyo nombre debe ser @code{auditd.conf}, y de manera opcional reglas de
audit que se instanciarán en el arranque.

@end table
@end deftp

@cindex rshiny
@subsubheading servicio R-Shiny

El módulo @code{(gnu services science)} proporciona el siguiente servicio.

@defvr {Variable Scheme} rshiny-service-type

Tipo de servicio usado para ejecutar una aplicación web creada con
@code{r-shiny}. Este servicio proporciona el valor adecuado a la variable de
entorno @env{R_LIBS_USER} y ejecuta el guión proporcionado para llamar a
@code{runApp}.

@deftp {Tipo de datos} rshiny-configuration
Este es el tipo de datos que representa la configuración del rshiny.

@table @asis

@item @code{package} (predeterminado: @code{r-shiny})
El paquete usado.

@item @code{binary} (default @code{"rshiny"})
Nombre del binario o del guión en el directorio @code{paquete/bin/}
ejecutado cuando se arranca este servicio.

La manera habitual de crear este archivo es la siguiente:

@lisp
@dots{}
(let* ((out       (assoc-ref %outputs "out"))
       (targetdir (string-append out "/share/" ,name))
       (app       (string-append out "/bin/" ,name))
       (Rbin      (search-input-file %build-inputs "/bin/Rscript")))
  ;; @dots{}
  (mkdir-p (string-append out "/bin"))
  (call-with-output-file app
    (lambda (port)
      (format port
"#!~a
library(shiny)
setwd(\"~a\")
runApp(launch.browser=0, port=4202)~%\n"
      Rbin targetdir))))
@end lisp

@end table
@end deftp
@end defvr

@cindex Nix
@subsubheading Servicio Nix

El módulo @code{(gnu services nix)} proporciona el siguiente servicio.

@defvr {Variable Scheme} nix-service-type

Tipo del servicio que ejecuta el daemon de construcción del gestor de
paquetes @url{https://nixos.org/nix/, Nix}. Este es un ejemplo de cómo
usarlo:

@lisp
(use-modules (gnu))
(use-service-modules nix)
(use-package-modules package-management)

(operating-system
  ;; @dots{}
  (packages (append (list nix)
                    %base-packages))

  (services (append (list (service nix-service-type))
                    %base-services)))
@end lisp

Tras @command{guix system reconfigure}, configure Nix para su usuaria:

@itemize
@item Añada un canal Nix y lance una actualización. Véase
@url{https://nixos.org/nix/manual/, la guía del gestor de paquetes Nix}.

@item Cree un enlace simbólico a su perfil y active el perfil de Nix:
@end itemize

@example
$ ln -s "/nix/var/nix/profiles/per-user/$USER/profile" ~/.nix-profile
$ source /run/current-system/profile/etc/profile.d/nix.sh
@end example

@end defvr

@deftp {Tipo de datos} nix-configuration
Este tipo de datos representa la configuración del daemon de Nix.

@table @asis
@item @code{nix} (predeterminado: @code{nix})
El paquete Nix usado.

@item @code{sandbox} (predeterminado: @code{#t})
Especifica si las construcciones se ejecutan en un entorno aislado
(``sandbox'') de manera predeterminada.

@item @code{build-sandbox-items} (predeterminada: @code{'()})
Lista de cadenas u objetos añadida al final del campo
@code{build-sandbox-items} en el archivo de configuración.

@item @code{extra-config} (predeterminada: @code{'()})
Es una lista de cadenas u objetos añadida al final del archivo de
configuración. Se usa para proporcionar texto adicional para ser introducido
de forma literal en el archivo de configuración.

@item @code{extra-options} (predeterminadas: @code{'()})
Opciones de línea de órdenes adicionales para @command{nix-service-type}.
@end table
@end deftp

@cindex Fail2Ban
@subsubheading Fail2Ban service

@uref{http://www.fail2ban.org/, @code{fail2ban}} scans log files
(e.g. @code{/var/log/apache/error_log}) and bans IP addresses that show
malicious signs -- repeated password failures, attempts to make use of
exploits, etc.

@code{fail2ban-service-type} service type is provided by the @code{(gnu
services security)} module.

This service type runs the @code{fail2ban} daemon.  It can be configured in
various ways, which are:

@table @asis
@item Basic configuration
The basic parameters of the Fail2Ban service can be configured via its
@code{fail2ban} configuration, which is documented below.

@item User-specified jail extensions
The @code{fail2ban-jail-service} function can be used to add new Fail2Ban
jails.

@item Shepherd extension mechanism
Service developers can extend the @code{fail2ban-service-type} service type
itself via the usual service extension mechanism.
@end table

@defvr {Scheme Variable} fail2ban-service-type

This is the type of the service that runs @code{fail2ban} daemon.  Below is
an example of a basic, explicit configuration:

@lisp
(append
 (list
  (service fail2ban-service-type
           (fail2ban-configuration
            (extra-jails
             (list
              (fail2ban-jail-configuration
               (name "sshd")
               (enabled? #t))))))
  ;; There is no implicit dependency on an actual SSH
  ;; service, so you need to provide one.
  (service openssh-service-type))
 %base-services)
@end lisp
@end defvr

@deffn {Scheme Procedure} fail2ban-jail-service @var{svc-type} @var{jail}
Extend @var{svc-type}, a @code{<service-type>} object with @var{jail}, a
@code{fail2ban-jail-configuration} object.

Por ejemplo:

@lisp
(append
 (list
  (service
   ;; The 'fail2ban-jail-service' procedure can extend any service type
   ;; with a fail2ban jail.  This removes the requirement to explicitly
   ;; extend services with fail2ban-service-type.
   (fail2ban-jail-service
    openssh-service-type
    (fail2ban-jail-configuration
     (name "sshd")
     (enabled? #t)))
   (openssh-configuration ...))))
@end lisp
@end deffn

Below is the reference for the different @code{jail-service-type}
configuration records.

@c The documentation is to be auto-generated via
@c 'generate-documentation'.  See at the bottom of (gnu services
@c security).

@deftp {Data Type} fail2ban-configuration
Available @code{fail2ban-configuration} fields are:

@table @asis
@item @code{fail2ban} (default: @code{fail2ban}) (type: package)
The @code{fail2ban} package to use.  It is used for both binaries and as
base default configuration that is to be extended with
@code{<fail2ban-jail-configuration>} objects.

@item @code{run-directory} (default: @code{"/var/run/fail2ban"}) (type: string)
The state directory for the @code{fail2ban} daemon.

@item @code{jails} (default: @code{()}) (type: list-of-fail2ban-jail-configurations)
Instances of @code{<fail2ban-jail-configuration>} collected from extensions.

@item @code{extra-jails} (default: @code{()}) (type: list-of-fail2ban-jail-configurations)
Instances of @code{<fail2ban-jail-configuration>} explicitly provided.

@item @code{extra-content} (default: @code{()}) (type: text-config)
Extra raw content to add to the end of the @file{jail.local} file, provided
as a list of file-like objects.

@end table

@end deftp

@deftp {Data Type} fail2ban-ignore-cache-configuration
Available @code{fail2ban-ignore-cache-configuration} fields are:

@table @asis
@item @code{key} (type: string)
Cache key.

@item @code{max-count} (type: integer)
Cache size.

@item @code{max-time} (type: integer)
Cache time.

@end table

@end deftp

@deftp {Data Type} fail2ban-jail-action-configuration
Available @code{fail2ban-jail-action-configuration} fields are:

@table @asis
@item @code{name} (type: string)
Action name.

@item @code{arguments} (default: @code{()}) (type: list-of-arguments)
Action arguments.

@end table

@end deftp

@deftp {Data Type} fail2ban-jail-configuration
Available @code{fail2ban-jail-configuration} fields are:

@table @asis
@item @code{name} (type: string)
Required name of this jail configuration.

@item @code{enabled?} (default: @code{#t}) (type: boolean)
Whether this jail is enabled.

@item @code{backend} (type: maybe-symbol)
Backend to use to detect changes in the @code{log-path}.  The default is
'auto.  To consult the defaults of the jail configuration, refer to the
@file{/etc/fail2ban/jail.conf} file of the @code{fail2ban} package.

@item @code{max-retry} (type: maybe-integer)
The number of failures before a host get banned (e.g.  @code{(max-retry
5)}).

@item @code{max-matches} (type: maybe-integer)
The number of matches stored in ticket (resolvable via tag @code{<matches>})
in action.

@item @code{find-time} (type: maybe-string)
The time window during which the maximum retry count must be reached for an
IP address to be banned.  A host is banned if it has generated
@code{max-retry} during the last @code{find-time} seconds (e.g.
@code{(find-time "10m")}).  It can be provided in seconds or using
Fail2Ban's "time abbreviation format", as described in @command{man 5
jail.conf}.

@item @code{ban-time} (type: maybe-string)
The duration, in seconds or time abbreviated format, that a ban should
last.  (e.g.  @code{(ban-time "10m")}).

@item @code{ban-time-increment?} (type: maybe-boolean)
Whether to consider past bans to compute increases to the default ban time
of a specific IP address.

@item @code{ban-time-factor} (type: maybe-string)
The coefficient to use to compute an exponentially growing ban time.

@item @code{ban-time-formula} (type: maybe-string)
This is the formula used to calculate the next value of a ban time.

@item @code{ban-time-multipliers} (type: maybe-string)
Used to calculate next value of ban time instead of formula.

@item @code{ban-time-max-time} (type: maybe-string)
The maximum number of seconds a ban should last.

@item @code{ban-time-rnd-time} (type: maybe-string)
The maximum number of seconds a randomized ban time should last.  This can
be useful to stop ``clever'' botnets calculating the exact time an IP
address can be unbanned again.

@item @code{ban-time-overall-jails?} (type: maybe-boolean)
When true, it specifies the search of an IP address in the database should
be made across all jails.  Otherwise, only the current jail of the ban IP
address is considered.

@item @code{ignore-self?} (type: maybe-boolean)
Never ban the local machine's own IP address.

@item @code{ignore-ip} (default: @code{()}) (type: list-of-strings)
A list of IP addresses, CIDR masks or DNS hosts to ignore.  @code{fail2ban}
will not ban a host which matches an address in this list.

@item @code{ignore-cache} (type: maybe-fail2ban-ignore-cache-configuration)
Provide cache parameters for the ignore failure check.

@item @code{filter} (type: maybe-fail2ban-jail-filter-configuration)
The filter to use by the jail, specified via a
@code{<fail2ban-jail-filter-configuration>} object.  By default, jails have
names matching their filter name.

@item @code{log-time-zone} (type: maybe-string)
The default time zone for log lines that do not have one.

@item @code{log-encoding} (type: maybe-symbol)
The encoding of the log files handled by the jail.  Possible values are:
@code{'ascii}, @code{'utf-8} and @code{'auto}.

@item @code{log-path} (default: @code{()}) (type: list-of-strings)
The file names of the log files to be monitored.

@item @code{action} (default: @code{()}) (type: list-of-fail2ban-jail-actions)
A list of @code{<fail2ban-jail-action-configuration>}.

@item @code{extra-content} (default: @code{()}) (type: text-config)
Extra content for the jail configuration, provided as a list of file-like
objects.

@end table

@end deftp

@deftp {Data Type} fail2ban-jail-filter-configuration
Available @code{fail2ban-jail-filter-configuration} fields are:

@table @asis
@item @code{name} (type: string)
Filter to use.

@item @code{mode} (type: maybe-string)
Mode for filter.

@end table

@end deftp

@c End of auto-generated fail2ban documentation.

@node Programas con setuid
@section Programas con setuid

@cindex programas con setuid
@cindex setgid programs
Some programs need to run with elevated privileges, even when they are
launched by unprivileged users.  A notorious example is the @command{passwd}
program, which users can run to change their password, and which needs to
access the @file{/etc/passwd} and @file{/etc/shadow} files---something
normally restricted to root, for obvious security reasons.  To address that,
@command{passwd} should be @dfn{setuid-root}, meaning that it always runs
with root privileges (@pxref{How Change Persona,,, libc, The GNU C Library
Reference Manual}, for more info about the setuid mechanism).

The store itself @emph{cannot} contain setuid programs: that would be a
security issue since any user on the system can write derivations that
populate the store (@pxref{El almacén}).  Thus, a different mechanism is
used: instead of changing the setuid or setgid bits directly on files that
are in the store, we let the system administrator @emph{declare} which
programs should be entrusted with these additional privileges.

The @code{setuid-programs} field of an @code{operating-system} declaration
contains a list of @code{<setuid-program>} denoting the names of programs to
have a setuid or setgid bit set (@pxref{Uso de la configuración del sistema}).
For instance, the @command{mount.nfs} program, which is part of the
nfs-utils package, with a setuid root can be designated like this:

@lisp
(setuid-program
  (program (file-append nfs-utils "/sbin/mount.nfs")))
@end lisp

And then, to make @command{mount.nfs} setuid on your system, add the
previous example to your operating system declaration by appending it to
@code{%setuid-programs} like this:

@lisp
(operating-system
  ;; Some fields omitted...
  (setuid-programs
    (append (list (setuid-program
                    (program (file-append nfs-utils "/sbin/mount.nfs"))))
            %setuid-programs)))
@end lisp

@deftp {Data Type} setuid-program
This data type represents a program with a setuid or setgid bit set.

@table @asis
@item @code{program}
A file-like object having its setuid and/or setgid bit set.

@item @code{setuid?} (default: @code{#t})
Whether to set user setuid bit.

@item @code{setgid?} (default: @code{#f})
Whether to set group setgid bit.

@item @code{user} (default: @code{0})
UID (integer) or user name (string) for the user owner of the program,
defaults to root.

@item @code{group} (default: @code{0})
GID (integer) goup name (string) for the group owner of the program,
defaults to root.

@end table
@end deftp

Un conjunto predeterminado de programas con el bit setuid se define en la
variable @code{%setuid-programs} del módulo @code{(gnu system)}.

@defvr {Variable Scheme} %setuid-programs
A list of @code{<setuid-program>} denoting common programs that are
setuid-root.

La lista incluye órdenes como @command{passwd}, @command{ping}, @command{su}
y @command{sudo}.
@end defvr

Para su implementación, los programas con setuid reales se crean en el
directorio @file{/run/setuid-programs} durante la activación del
sistema. Los archivos en este directorio hacen referencia a los binarios
``reales'', que están en el almacén.

@node Certificados X.509
@section Certificados X.509

@cindex HTTPS, certificados
@cindex certificados X.509
@cindex TLS
En las conexiones HTTPS a servidores Web (esto es, HTTP sobre el mecanismo
de seguridad de la capa de transporte, TLS) se envía a los programas
clientes un @dfn{certificado X.509} que el cliente puede usar para
@emph{autentificar} al servidor. Para hacerlo, los clientes verifican que el
certificado del servidor está firmado por una de las llamadas
@dfn{autoridades de certificación} (AC, CA en inglés). Pero para verificar
la firma de una AC, los clientes deben haber obtenido previamente el
certificado de dicha AC.

Los navegadores Web como GNU@tie{}IceCat incluyen su propio conjunto de
certificados de AC, de manera que pueden verificar las firmas
independientemente.

No obstante, a la mayor parte de otros programas que pueden comunicarse a
través de HTTPS---@command{wget}, @command{git}, @command{w3m}, etc.---se
les debe informar de dónde pueden encontrar los certificados de CA.

@cindex @code{nss-certs}
En Guix, esto se lleva a cabo mediante la adición de un paquete que
proporcione certificados en el campo @code{packages} de la declaración
@code{operating-system} (@pxref{Referencia de operating-system}). Guix incluye
un paquete de este tipo, @code{nss-certs}, compuesto por un conjunto de
certificados de CA proporcionados como parte de los servicios de seguridad
de red de Mozilla (NSS).

Fíjese que @emph{no} es parte de @code{%base-packages}, por lo que debe ser
añadido explícitamente. El directorio @file{/etc/ssl/certs}, donde la mayor
parte de las aplicaciones y bibliotecas buscarán los certificados de manera
predeterminada, enlaza a los certificados instalados de manera global.

Las usuarias sin privilegios, incluyendo a usuarias de Guix en una
distribución distinta, pueden también instalar su propio paquete de
certificados en su perfil. Es necesario definir cierto número de variables
de entorno de manera que las aplicaciones y bibliotecas sepan dónde
encontrarlos. Por ejemplo, la biblioteca OpenSSL inspecciona las variables
@env{SSL_CERT_DIR} y @env{SSL_CERT_FILE}. Algunas aplicaciones añaden sus
variables de entorno propias; por ejemplo, el sistema de control de
versiones Git inspecciona el empaquetado de certificados al que apunta la
variable de entorno @env{GIT_SSL_CAINFO}. Por tanto, en el caso típico se
debe ejecutar algo parecido a esto:

@example
guix install nss-certs
export SSL_CERT_DIR="$HOME/.guix-profile/etc/ssl/certs"
export SSL_CERT_FILE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
export GIT_SSL_CAINFO="$SSL_CERT_FILE"
@end example

Como otro ejemplo, R necesita que la variable de entorno
@env{CURL_CA_BUNDLE} apunte al empaquetado de certificados, de manera que se
debe ejecutar algo parecido a esto:

@example
guix install nss-certs
export CURL_CA_BUNDLE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
@end example

Para otras aplicaciones puede tener que buscar la variable de entorno
necesaria en la documentación relevante.


@node Selector de servicios de nombres
@section Selector de servicios de nombres

@cindex selector de servicios de nombres
@cindex NSS
El módulo @code{(gnu system nss)} proporciona una interfaz con el archivo de
configuración del @dfn{selector de servicios de nombres} o @dfn{NSS}
(@pxref{NSS Configuration File,,, libc, The GNU C Library Reference
Manual}). En resumen, NSS es un mecanismo que permite la extensión de libc
con nuevos métodos de búsqueda de ``nombres'', lo que incluye nombres de
máquinas, nombres de servicios, cuentas de usuaria y más (@pxref{Selector de servicios de nombres, System Databases and Name Service Switch,, libc, The GNU C
Library Reference Manual}).

La configuración de NSS especifica, para cada base de datos del sistema, que
método de búsqueda debe ser usado, y cómo los varios métodos se enlazan
entre sí---por ejemplo, bajo qué circunstancias NSS deberá probar con el
siguiente método en la lista. La configuración de NSS se proporciona en el
campo @code{name-service-switch} de las declaraciones
@code{operating-system} (@pxref{Referencia de operating-system,
@code{name-service-switch}}).

@cindex nss-mdns
@cindex .local, búsqueda de nombres de máquina
Como ejemplo, la siguiente declaración configura NSS para que use el
@uref{https://0pointer.de/lennart/projects/nss-mdns/, motor
@code{nss-mdns}}, que permite las búsquedas de nombres de máquinas sobre DNS
multicast (mDNS) para nombres de máquinas terminados en @code{.local}:

@lisp
(name-service-switch
   (hosts (list %files    ;primero, comprueba /etc/hosts

                ;; Si lo anterior no funcionó, prueba
                ;; con 'mdns_minimal'.
                (name-service
                  (name "mdns_minimal")

                  ;; 'mdns_minimal' tiene autoridad sobre
                  ;; '.local'.  Cuando devuelve 'not-found,
                  ;; no es necesario intentarlo con los
                  ;; métodos siguientes.
                  (reaction (lookup-specification
                             (not-found => return))))

                ;; Si no, usa DNS.
                (name-service
                  (name "dns"))

                ;; Finalmente, prueba con 'mdns' "al completo".
                (name-service
                  (name "mdns")))))
@end lisp

No se preocupe: la variable @code{%mdns-host-lookup-nss} (véase a
continuación) contiene esta configuración, de manera que no tiene que
escribirla si todo lo que desea es que funcione la búsqueda de nombres de
máquina en @code{.local}.

Fíjese que, en este caso, además de establecer el valor de
@code{name-service-switch} en la declaración @code{operating-system}, es
necesario también usar el servicio @code{avahi-service-type}
(@pxref{Servicios de red, @code{avahi-service-type}}) o
@code{%desktop-services}, donde está incluido. Esto permite el acceso a
@code{nss-mdsn} desde el daemon de la caché del servicio de nombres
(@pxref{Servicios base, @code{nscd-service}}).

Por conveniencia, las siguientes variables proporcionan configuraciones NSS
típicas.

@defvr {Variable Scheme} %default-nss
Esta es la configuración predeterminada del selector de servicios de
nombres, un objeto @code{name-service-switch}.
@end defvr

@defvr {Variable Scheme} %mdns-host-lookup-nss
Esta es la configuración del selector de servicios de nombres que permite la
búsqueda de nombres de máquinas por DNS multicast (mDNS) para nombres de
máquinas terminados en @code{.local}.
@end defvr

La referencia de la configuración del selector de servicios de nombres se
proporciona a continuación. Tiene una asociación directa con el formato del
archivo de configuración de la biblioteca C, por lo que se recomienda el
manual de la biblioteca C para obtener más información (@pxref{NSS Configuration File,,, libc, The GNU C Library Reference Manual}). En
comparación con el formato del archivo de configuración del NSS de libc, no
solo tiene solo la ventaja de la cálida sensación proporcionada por la
adición de paréntesis que tanto nos gustan, sino que también tiene
comprobaciones estáticas: conocerá los errores sintácticos y tipográficos
con la ejecución de @command{guix system}.

@deftp {Tipo de datos} name-service-switch

El tipo de datos que representa la configuración del selector de servicios
de nombres (NSS). Cada campo a continuación representa una de las bases de
datos del sistema admitidas.

@table @code
@item aliases
@itemx ethers
@itemx group
@itemx gshadow
@itemx hosts
@itemx initgroups
@itemx netgroup
@itemx networks
@itemx password
@itemx public-key
@itemx rpc
@itemx services
@itemx shadow
The system databases handled by the NSS@.  Each of these fields must be a
list of @code{<name-service>} objects (see below).
@end table
@end deftp

@deftp {Tipo de datos} name-service

Este es el tipo de datos que representa un servicio de nombres real y la
acción de búsqueda asociada.

@table @code
@item name
Una cadena que denota el nombre de servicio (@pxref{Services in the NSS configuration,,, libc, The GNU C Library Reference Manual}).

Fíjese que los servicios de nombres enumerados aquí deben ser visibles para
nscd. Esto se consigue mediante la adición del parámetro
@code{#:name-services} a @code{nscd-service} con la lista de paquetes que
proporcionan los servicios de nombres necesarios (@pxref{Servicios base,
@code{nscd-service}}).

@item reaction
Una acción especificada mediante el uso del macro
@code{lookup-specification} (@pxref{Actions in the NSS configuration,,,
libc, The GNU C Library Reference Manual}). Por ejemplo:

@lisp
(lookup-specification (unavailable => continue)
                      (success => return))
@end lisp
@end table
@end deftp

@node Disco en RAM inicial
@section Disco en RAM inicial

@cindex initrd
@cindex disco inicial en RAM
Para el propósito del arranque inicial, se le proporciona al núcleo
Linux-libre un @dfn{disco inicial en RAM}, o @dfn{initrd}. Un initrd
contiene un sistema de archivos raíz temporal así como un guión de
inicialización. Este último es responsable del montaje del sistema de
archivos raíz real, así como de la carga de cualquier módulo del núcleo que
pueda ser necesario para esta tarea.

El campo @code{initrd-modules} de una declaración @code{operating-system} le
permite especificar qué módulos del núcleo Linux-libre deben estar
disponibles en el initrd. En particular, aquí es donde se debe enumerar los
módulos que controlen realmente el disco duro donde su partición raíz se
encuentre---aunque el valor predeterminado de @code{initrd-modules} debería
cubrir la mayor parte de casos de uso. Por ejemplo, en caso de necesitar el
módulo @code{megaraid_sas} además de los módulos predeterminados para poder
acceder a sistema de archivos raíz, se podría escribir:

@lisp
(operating-system
  ;; @dots{}
  (initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
@end lisp

@defvr {Variable Scheme} %base-initrd-modules
Esta es la lista de módulos del núcleo que se incluyen en el initrd
predeterminado.
@end defvr

Más allá, si necesita personalizaciones de un nivel más bajo, el campo
@code{initrd} de una declaración @code{operating-system} le permite
especificar qué initrd desea usar. El módulo @code{(gnu system
linux-initrd)} proporciona tres formas de construir un initrd: el
procedimiento de alto nivel @code{base-initrd} y los procedimientos de bajo
nivel @code{raw-initrd} y @code{expression->initrd}.

El procedimiento @code{base-initrd} está pensado para cubrir la mayor parte
de usos comunes. Por ejemplo, si desea añadir algunos módulos del núcleo que
deben cargarse durante el arranque, puede definir el campo @code{initrd} de
la declaración de sistema operativo de esta forma:

@lisp
(initrd (lambda (sistemas-de-archivos . resto)
          ;; Crea un initrd estándar pero configura la red
          ;; con los parámetros que QEMU espera por omisión.
          (apply base-initrd sistemas-de-archivos
                 #:qemu-networking? #t
                 resto)))
@end lisp

El procedimiento @code{base-initrd} también maneja casos de uso comunes que
implican el uso del sistema en un anfitrión QEMU, o como un sistema ``live''
con un sistema de archivos raíz volátil.

The @code{base-initrd} procedure is built from @code{raw-initrd} procedure.
Unlike @code{base-initrd}, @code{raw-initrd} doesn't do anything high-level,
such as trying to guess which kernel modules and packages should be included
to the initrd.  An example use of @code{raw-initrd} is when a user has a
custom Linux kernel configuration and default kernel modules included by
@code{base-initrd} are not available.

El disco inicial en RAM producido por @code{base-initrd} o @code{raw-initrd}
inspecciona varias opciones proporcionadas por la línea de órdenes al núcleo
Linux (esto es, argumentos pasados a través de la orden @code{linux} de
GRUB, o de la opción @code{-append} de QEMU), notablemente:

@table @code
@item gnu.load=@var{boot}
Indica al disco de RAM inicial que cargue @var{arranque}, un archivo que
contiene un programa Scheme, una vez haya montado el sistema de archivos
raíz.

Guix usa esta opción para proporcionar el control a un programa de arranque
que ejecuta los programas de activación de servicios y lanza
GNU@tie{}Shepherd, el sistema de inicialización.

@item root=@var{root}
Monta @var{raíz} como el sistema de archivos raíz. @var{raíz} puede ser un
nombre de dispositivo como @code{/dev/sda1}, una etiqueta del sistema de
archivos o un UUID del sistema de archivos. Si no se proporciona se usa el
nombre del sistema de archivos raíz de la declaración del sistema operativo.

@item rootfstype=@var{type}
Set the type of the root file system.  It overrides the @code{type} field of
the root file system specified via the @code{operating-system} declaration,
if any.

@item rootflags=@var{options}
Set the mount @emph{options} of the root file system.  It overrides the
@code{options} field of the root file system specified via the
@code{operating-system} declaration, if any.

@item fsck.mode=@var{mode}
Whether to check the @var{root} file system for errors before mounting it.
@var{mode} is one of @code{skip} (never check), @code{force} (always check),
or @code{auto} to respect the root @code{<file-system>} object's
@code{check?} setting (@pxref{Sistemas de archivos}) and run a full scan only if the
file system was not cleanly shut down.

@code{auto} is the default if this option is not present or if @var{mode} is
not one of the above.

@item fsck.repair=@var{level}
The level of repairs to perform automatically if errors are found in the
@var{root} file system.  @var{level} is one of @code{no} (do not write to
@var{root} at all if possible), @code{yes} (repair as much as possible), or
@code{preen} to repair problems considered safe to repair automatically.

@code{preen} is the default if this option is not present or if @var{level}
is not one of the above.

@item gnu.system=@var{system}
Hace que @file{/run/booted-system} y @file{/run/current-system} apunten a
@var{sistema}.

@item modprobe.blacklist=@var{módulos}@dots{}
@cindex módulo, lista negra
@cindex lista negra, de módulos del núcleo
Indica al disco inicial en RAM así como a la orden @command{modprobe} (del
paquete kmod) que deben negarse a cargar @var{módulos}. @var{módulos} debe
ser una lista separada por comas de nombres de módulos---por ejemplo,
@code{usbkbd,9pnet}.

@item gnu.repl
Inicia una sesión interactiva (REPL) desde el disco inicial en RAM antes de
que intente cargar los módulos del núcleo y del montaje del sistema de
archivos raíz. Nuestro departamento comercial lo llama
@dfn{arranca-en-Guile}. Como amante de Scheme, lo adorará. @xref{Using Guile Interactively,,, guile, GNU Guile Reference Manual}, para más información
sobre sesiones interactivas Guile.

@end table

Una vez conocidas todas las características que proporcionan los discos
iniciales en RAM que producen @code{base-initrd} y @code{raw-initrd}, a
continuación veremos cómo usarlas y personalizarlos más aún.

@cindex initrd
@cindex disco inicial en RAM
@deffn {Procedimiento Scheme} raw-initrd @var{sistemas-de-archivos} @
       [#:linux-modules '()] [#:pre-mount #t] [#:mapped-devices '()] @
[#:keyboard-layout #f] [#:helper-packages '()] @ [#:qemu-networking? #f]
[#:volatile-root? #f] Return a derivation that builds a raw initrd.
@var{file-systems} is a list of file systems to be mounted by the initrd,
possibly in addition to the root file system specified on the kernel command
line via @option{root}.  @var{linux-modules} is a list of kernel modules to
be loaded at boot time.  @var{mapped-devices} is a list of device mappings
to realize before @var{file-systems} are mounted (@pxref{Dispositivos traducidos}).
@var{pre-mount} is a G-expression to evaluate before realizing
@var{mapped-devices}.  @var{helper-packages} is a list of packages to be
copied in the initrd.  It may include @code{e2fsck/static} or other packages
needed by the initrd to check the root file system.

Cuando su valor es verdadero, @var{keyboard-layout} es un registro
@code{<keyboard-layout>} que denota la distribución de teclado en consola
deseada. Esto se realiza previamente a que los dispositivos configurados en
@var{mapped-devices} se inicien y antes de que los sistemas de archivos en
@var{file-systems} se monten, de manera que, en caso de que la usuaria
tuviese que introducir una contraseña o usar la sesión interactiva, esto
suceda usando la distribución de teclado deseada.

Cuando @var{qemu-networking?} es verdadero, configura la red con los
parámetros QEMU estándar. Cuando @var{virtio?} es verdadero, carga módulos
adicionales para que la imagen en RAM pueda ser usada como un sistema
virtualizado por QEMU con controladores paravirtualizados de E/S.

Cuando @var{volatile-root?} es verdadero, el sistema de archivos raíz tiene
permisos de escritura pero cualquier cambio realizado se perderá.
@end deffn

@deffn {Procedimiento Scheme} base-initrd @var{sistemas-de-archivos} @
       [#:mapped-devices '()] [#:keyboard-layout #f] @ [#:qemu-networking? #f]
[#:volatile-root? #f] @ [#:linux-modules '()] Return as a file-like object a
generic initrd, with kernel modules taken from @var{linux}.
@var{file-systems} is a list of file-systems to be mounted by the initrd,
possibly in addition to the root file system specified on the kernel command
line via @option{root}.  @var{mapped-devices} is a list of device mappings
to realize before @var{file-systems} are mounted.

Cuando su valor es verdadero, @var{keyboard-layout} es un registro
@code{<keyboard-layout>} que denota la distribución de teclado en consola
deseada. Esto se realiza previamente a que los dispositivos configurados en
@var{mapped-devices} se inicien y antes de que los sistemas de archivos en
@var{file-systems} se monten, de manera que, en caso de que la usuaria
tuviese que introducir una contraseña o usar la sesión interactiva, esto
suceda usando la distribución de teclado deseada.

@var{qemu-networking?} y @var{volatile-root?} funcionan como en
@code{raw-initrd}.

El initrd incorpora automáticamente todos los módulos del núcleo necesarios
para @var{sistemas-de-archivos} y para las opciones proporcionadas. Módulos
del núcleo adicionales pueden proporcionarse a través de
@var{linux-modules}. Se añadirán al initrd y se cargarán en tiempo de
arranque en el orden que aparezcan.
@end deffn

No es necesario decir que los initrd que producimos y usamos embeben un
Guile enlazado estáticamente, y que el programa de inicialización es un
programa Guile. Esto proporciona mucha flexibilidad. El procedimiento
@code{expression->initrd} construye un initrd de ese tipo, una vez
proporcionado el programa a ejecutar en dicho initrd.

@deffn {Procedimiento Scheme} expression->initrd @var{exp} @
       [#:guile %guile-static-stripped] [#:name "guile-initrd"] Return as a
file-like object a Linux initrd (a gzipped cpio archive)  containing
@var{guile} and that evaluates @var{exp}, a G-expression, upon booting.  All
the derivations referenced by @var{exp} are automatically copied to the
initrd.
@end deffn

@node Configuración del gestor de arranque
@section Configuración del gestor de arranque

@cindex bootloader
@cindex cargador de arranque

El sistema operativo permite varios cargadores de arranque. El cargador de
arranque se configura mediante el uso de la declaración
@code{bootloader-configuration}. Todos los campos de esta estructura son
independientes del cargador de arranque excepto uno, @code{bootloader}, que
indica el cargador de arranque a configurar e instalar.

Algunos de los cargadores de arranque no inspeccionan todos los campos de
@code{bootloader-configuration}. Por ejemplo, el cargador de arranque
extlinux no permite temas y por lo tanto ignora el campo @code{theme}.

@deftp {Tipo de datos} bootloader-configuration
El tipo de una declaración de configuración del cargador de arranque.

@table @asis

@item @code{bootloader}
@cindex EFI, cargador de arranque
@cindex UEFI, cargador de arranque
@cindex BIOS, cargador de arranque
The bootloader to use, as a @code{bootloader} object.  For now
@code{grub-bootloader}, @code{grub-efi-bootloader},
@code{grub-efi-netboot-bootloader}, @code{grub-efi-removable-bootloader},
@code{extlinux-bootloader} and @code{u-boot-bootloader} are supported.

@cindex ARM, cargadores de arranque
@cindex AArch64, cargadores de arranque
Los cargadores de arranque se describen en los módulos @code{(gnu bootloader
@dots{})}. En particular, @code{(gnu bootloader u-boot)} contiene
definiciones de cargadores de arranque para un amplio rango de sistemas ARM
y AArch64, mediante el uso del @uref{https://www.denx.de/wiki/U-Boot/,
cargador de arranque U-Boot}.

@vindex grub-efi-bootloader
@code{grub-efi-bootloader} permite el arranque en sistemas modernos que usan
la @dfn{interfaz extendida de firmware unificada} (UEFI). Es el que debería
ser usado si la imagen de instalación contiene un directorio
@file{/sys/firmware/efi} cuando la arranca en su sistema.

@vindex grub-bootloader
@code{grub-bootloader} permite el arranque en máquinas basadas en Intel en
modo ``antiguo'' BIOS.

@vindex grub-efi-netboot-bootloader
@code{grub-efi-netboot-bootloader} allows you to boot your system over
network through TFTP@.  In combination with an NFS root file system this
allows you to build a diskless Guix system.

The installation of the @code{grub-efi-netboot-bootloader} generates the
content of the TFTP root directory at @code{targets} (@pxref{Configuración del gestor de arranque, @code{targets}}), to be served by a TFTP server.  You may
want to mount your TFTP server directories onto the @code{targets} to move
the required files to the TFTP server automatically.

Si tiene pensado usar también un sistema de archivos raíz NFS (en realidad
si monta el almacén desde un directorio compartido con NFS) el servidor TFTP
también debe proporcionar el archivo @file{/boot/grub/grub.cfg} y otros
archivos desde el almacén (como las imágenes de fondo de GRUB, el núcleo
(@pxref{Referencia de operating-system, @code{kernel}}) y el disco en RAM para
el arranque (@pxref{Referencia de operating-system, @code{initrd}})). GRUB
accederá a todos estos archivos del almacén a través de TFTP con su ruta del
almacén habitual, como por ejemplo
@file{tftp://tftp-server/gnu/store/…-initrd/initrd.cpio.gz}.

Two symlinks are created to make this possible.  For each target in the
@code{targets} field, the first symlink is
@samp{target}@file{/efi/Guix/boot/grub/grub.cfg} pointing to
@file{../../../boot/grub/grub.cfg}, where @samp{target} may be
@file{/boot}.  In this case the link is not leaving the served TFTP root
directory, but otherwise it does.  The second link is
@samp{target}@file{/gnu/store} and points to @file{../gnu/store}.  This link
is leaving the served TFTP root directory.

The assumption behind all this is that you have an NFS server exporting the
root file system for your Guix system, and additionally a TFTP server
exporting your @code{targets} directories—usually a single @file{/boot}—from
that same root file system for your Guix system.  In this constellation the
symlinks will work.

For other constellations you will have to program your own bootloader
installer, which then takes care to make necessary files from the store
accessible through TFTP, for example by copying them into the TFTP root
directory to your @code{targets}.

It is important to note that symlinks pointing outside the TFTP root
directory may need to be allowed in the configuration of your TFTP server.
Further the store link exposes the whole store through TFTP@.  Both points
need to be considered carefully for security aspects.

Además de lo expresado anteriormente---@code{grub-efi-netboot-bootloader},
los servidores TFTP y NFS---también necesitará un servidor DHCP configurado
correctamente para hacer posible el arranque a través de la red. Para esto
únicamente podemos recomendarle por el momento que busque información sobre
@acronym{PXE, Preboot eXecution Environment}.

@vindex grub-efi-removable-bootloader
@code{grub-efi-removable-bootloader} allows you to boot your system from
removable media by writing the GRUB file to the UEFI-specification location
of @file{/EFI/BOOT/BOOTX64.efi} of the boot directory, usually
@file{/boot/efi}.  This is also useful for some UEFI firmwares that
``forget'' their configuration from their non-volatile storage. Like
@code{grub-efi-bootloader}, this can only be used if the
@file{/sys/firmware/efi} directory is available.

@quotation Nota
This @emph{will} overwrite the GRUB file from any other operating systems
that also place their GRUB file in the UEFI-specification location; making
them unbootable.
@end quotation

@item @code{targets}
This is a list of strings denoting the targets onto which to install the
bootloader.

The interpretation of targets depends on the bootloader in question.  For
@code{grub-bootloader}, for example, they should be device names understood
by the bootloader @command{installer} command, such as @code{/dev/sda} or
@code{(hd0)} (@pxref{Invoking grub-install,,, grub, GNU GRUB Manual}).  For
@code{grub-efi-bootloader} and @code{grub-efi-removable-bootloader} they
should be mount points of the EFI file system, usually @file{/boot/efi}.
For @code{grub-efi-netboot-bootloader}, @code{targets} should be the mount
points corresponding to TFTP root directories served by your TFTP server.

@item @code{menu-entries} (predeterminadas: @code{()})
Una lista posiblemente vacía de objetos @code{menu-entry} (véase a
continuación), que indican entradas que deben aparecer en el menú del
cargador de arranque, además de la entrada del sistema actual y la entrada
que apunta a generaciones previas del sistema.

@item @code{default-entry} (predeterminada: @code{0})
El índice de la entrada del menú de arranque por omisión. El índice 0 es
para la entrada del sistema actual.

@item @code{timeout} (predeterminado: @code{5})
El número de segundos que se esperará entrada por el teclado antes de
arrancar. El valor 0 indica que se debe arrancar de forma inmediata, y -1
que se debe esperar indefinidamente.

@cindex distribución de teclado, para el gestor de arranque
@item @code{keyboard-layout} (predeterminada: @code{#f})
Si es @code{#f}, el menú del cargador de arranque (si existe) usa la
distribución de teclado predeterminada, habitualmente inglés estadounidense
(``qwerty'').

En otro caso, debe ser un objeto @code{keyboard-layout} (@pxref{Distribución de teclado}).

@quotation Nota
Esta opción se ignora actualmente por todos los cargadores de arranque menos
@code{grub} y @code{grub-efi}.
@end quotation

@item @code{theme} (predeterminado: @var{#f})
El objeto del tema del cargador de arranque que describe el tema usado. Si
no se proporciona ningún tema, algunos cargadores de arranque pueden usar un
tema por omisión, lo cual es cierto en GRUB.

@item @code{terminal-outputs} (predeterminadas: @code{'(gfxterm)})
Los terminales de salida que se usarán para el menú de arranque, como una
lista de símbolos. GRUB acepta los valores: @code{console}, @code{serial},
@code{serial_@{0-3@}}, @code{gfxterm}, @code{vga_text}, @code{mda_text},
@code{morse} y @code{pkmodem}. Este campo corresponde con la variable
@code{GRUB_TERMINAL_OUTPUT} (@pxref{Simple configuration,,, grub, GNU GRUB
manual}).

@item @code{terminal-inputs} (predeterminadas: @code{'()})
Los terminales de entrada que se usarán para el menú de arranque, como una
lista de símbolos. Para GRUB, el valor predeterminado es el terminal nativo
de la plataforma determinado en tiempo de ejecución. GRUB acepta los
valores: @code{console}, @code{serial}, @code{serial@{0-3@}},
@code{at_keyboard} y @code{usb_keyboard}. Este campo corresponde a la
variable GRUB @code{GRUB_TERMINAL_INPUT} (@pxref{Simple configuration,,,
grub,GNU GRUB manual}).

@item @code{serial-unit} (predeterminada: @code{#f})
La unidad serie usada por el cargador de arranque, como un entero del 0 al
3. Para GRUB, se selecciona en tiempo de ejecución; actualmente GRUB
selecciona 0 lo que corresponde a COM1 (@pxref{Serial terminal,,, grub,GNU
GRUB manual}).

@item @code{serial-speed} (predeterminada: @code{#f})
La velocidad de la interfaz serie, como un entero. Para GRUB, el valor
predeterminado se selecciona en tiempo de ejecución, actualmente GRUB
selecciona 9600@tie{}bps (@pxref{Serial terminal,,, grub,GNU GRUB manual}).

@item @code{device-tree-support?} (default: @code{#t})
Whether to support Linux @uref{https://en.wikipedia.org/wiki/Devicetree,
device tree} files loading.

This option in enabled by default.  In some cases involving the
@code{u-boot} bootloader, where the device tree has already been loaded in
RAM, it can be handy to disable the option by setting it to @code{#f}.
@end table

@end deftp

@cindex arranque dual
@cindex menú de arranque
Si desease listar entradas adicionales para el menú de arranque a través del
campo @code{menu-entries} mostrado previamente, deberá crearlas con la forma
@code{menu-entry}. Por ejemplo, imagine que desea ser capaz de arrancar otra
distribución (¡difícil de imaginar!), puede definir una entrada de menú de
esta forma:

@lisp
(menu-entry
  (label "La otra distribución")
  (linux "/boot/old/vmlinux-2.6.32")
  (linux-arguments '("root=/dev/sda2"))
  (initrd "/boot/old/initrd"))
@end lisp

Los detalles se encuentran a continuación.

@deftp {Tipo de datos} menu-entry
El tipo de una entrada en el menú del cargador de arranque.

@table @asis

@item @code{label}
La etiqueta a mostrar en el menú---por ejemplo, @code{"GNU"}.

@item @code{linux} (predeterminado: @code{#f})
La imagen del núcleo Linux a arrancar, por ejemplo:

@lisp
(file-append linux-libre "/bzImage")
@end lisp

Con GRUB, también es posible especificar un dispositivo explícitamente
mediante el uso de la convención de nombres de dispositivo de GRUB
(@pxref{Naming convention,,, grub, GNU GRUB manual}), por ejemplo:

@example
"(hd0,msdos1)/boot/vmlinuz"
@end example

Si se especifica el dispositivo explícitamente como en el ejemplo anterior,
el campo @code{device} se ignora completamente.

@item @code{linux-arguments} (predeterminados: @code{()})
La lista de parámetros extra de línea de órdenes para el núcleo Linux---por
ejemplo, @code{("console=ttyS0")}.

@item @code{initrd} (predeterminado: @code{#f})
Una expresión-G o una cadena que contiene el nombre de archivo del disco
inicial en RAM usado (@pxref{Expresiones-G}).

@item @code{device} (predeterminado: @code{#f})
El dispositivo donde se encuentran el núcleo y el initrd---es decir, para
GRUB, @dfn{raíz} de esta entrada de menú (@pxref{root,,, grub, GNU GRUB
manual}).

Puede ser una etiqueta de sistema de archivos (una cadena), un UUID de
sistema de archivos (un vector de bytes, @pxref{Sistemas de archivos}), o @code{#f},
en cuyo caso el cargador de arranque buscará el dispositivo que contenga el
archivo especificado por el campo @code{linux} (@pxref{search,,, grub, GNU
GRUB manual}). @emph{No} debe ser un nombre de dispositivo del SO como
@file{/dev/sda1}.

@item @code{multiboot-kernel} (predeterminado: @code{#f})
El núcleo a arrancar en modo Multiboot (@pxref{multiboot,,, grub, GNU GRUB
manual}).  Cuando se proporciona este campo, se genera una entrada Multiboot
en el menú. Por ejemplo:

@lisp
(file-append mach "/boot/gnumach")
@end lisp

@item @code{multiboot-arguments} (predeterminados: @code{()})
Lista de parámetros adicionales que se proporcionan al núcleo Multiboot en
la línea de órdenes.

@item @code{multiboot-modules} (predeterminados: @code{()})
Lista de ordenes para cargar módulos de Multiboot. Por ejemplo:

@lisp
(list (list (file-append hurd "/hurd/ext2fs.static") "ext2fs"
             @dots{})
      (list (file-append libc "/lib/ld.so.1") "exec"
             @dots{}))
@end lisp

@item @code{chain-loader} (default: @code{#f})
A string that can be accepted by @code{grub}'s @code{chainloader}
directive. This has no effect if either @code{linux} or
@code{multiboot-kernel} fields are specified. The following is an example of
chainloading a different GNU/Linux system.

@lisp
(bootloader
 (bootloader-configuration
  ;; @dots{}
  (menu-entries
   (list
    (menu-entry
     (label "GNU/Linux")
     (device (uuid "1C31-A17C" 'fat))
     (chain-loader "/EFI/GNULinux/grubx64.efi"))))))
@end lisp

@end table
@end deftp

@cindex HDPI
@cindex HiDPI
@cindex resolución
@c FIXME: Write documentation once it's stable.
De momento únicamente GRUB permite el uso de temas. Los temas de GRUB se
crean mediante el uso de @code{grub-theme}, todavía no documentado
completamente.

@deftp {Tipo de datos} grub-theme
Tipo de datos que representa la configuración de un tema de GRUB.

@table @asis
@item @code{gfxmode} (predeterminado: @code{'("auto")})
El modo gráfico @code{gfxmode} de GRUB configurado (una lista de cadenas con
resoluciones de pantalla, @pxref{gfxmode,,, grub, GNU GRUB manual}).
@end table
@end deftp

@deffn {Procedimiento Scheme} grub-theme
Devuelve el tema predeterminado de GRUB que usa el sistema operativo si no
se especifica el campo @code{theme} en el registro
@code{bootloader-configuration}.

Viene con una bonita imagen de fondo que muestra los logos de GNU y Guix.
@end deffn

Por ejemplo, para usar una resolución distinta de la predeterminada, puede
usar algo como esto:

@lisp
(bootloader
 (bootloader-configuration
 ;; @dots{}
 (theme (grub-theme
         (inherit (grub-theme))
         (gfxmode '("1024x786x32" "auto"))))))
@end lisp

@node Invocación de guix system
@section Invoking @command{guix system}

@cindex @command{guix system}
Una vez haya escrito la declaración de sistema operativo como se ha visto en
la sección previa, puede @dfn{instanciarse} mediante el uso de la orden
@command{guix system}. Su sinopsis es:

@example
guix system @var{opciones}@dots{} @var{acción} @var{archivo}
@end example

@var{archivo} debe ser el nombre de un archivo que contenga una declaración
@code{operating-system}. @var{acción} especifica cómo se instancia el
sistema operativo. Actualmente se permiten los siguientes valores:

@table @code
@item search
Muestra las definiciones de tipos de servicio disponibles que corresponden
con las expresiones regulares proporcionadas, ordenadas por relevancia:

@cindex HDPI
@cindex HiDPI
@cindex resolución
@example
$ guix system search console
name: console-fonts
location: gnu/services/base.scm:806:2
extends: shepherd-root
description: Install the given fonts on the specified ttys (fonts are per
+ virtual console on GNU/Linux).  The value of this service is a list of
+ tty/font pairs.  The font can be the name of a font provided by the `kbd'
+ package or any valid argument to `setfont', as in this example:
+
+      '(("tty1" . "LatGrkCyr-8x16")
+        ("tty2" . (file-append
+                      font-tamzen
+                      "/share/kbd/consolefonts/TamzenForPowerline10x20.psf"))
+        ("tty3" . (file-append
+                      font-terminus
+                      "/share/consolefonts/ter-132n"))) ; for HDPI
relevance: 9

name: mingetty
location: gnu/services/base.scm:1190:2
extends: shepherd-root
description: Provide console login using the `mingetty' program.
relevance: 2

name: login
location: gnu/services/base.scm:860:2
extends: pam
description: Provide a console log-in service as specified by its
+ configuration value, a `login-configuration' object.
relevance: 2

@dots{}
@end example

Como con @command{guix package --search}, el resultado se obtiene en formato
@code{recutils}, lo que facilita el filtrado de la salida (@pxref{Top, GNU
recutils databases,, recutils, GNU recutils manual}).

@cindex service type definition, editing
@cindex editing, service type definition
@item edit
Edit or view the definition of the given service types.

For example, the command below opens your editor, as specified by the
@env{EDITOR} environment variable, on the definition of the @code{openssh}
service type:

@example
guix system edit openssh
@end example

@item reconfigure
Construye el sistema operativo descrito en @var{archivo}, lo activa, y se
constituye como estado actual@footnote{Esta acción (y las acciones
relacionadas @code{switch-generation} y @code{roll-back}) son usables
únicamente en sistemas que ya ejecuten el sistema Guix.}.

@quotation Nota
@c The paragraph below refers to the problem discussed at
@c <https://lists.gnu.org/archive/html/guix-devel/2014-08/msg00057.html>.
Es altamente recomendable ejecutar @command{guix pull} antes de la primera
ejecución de @command{guix system reconfigure} (@pxref{Invocación de guix pull}). No hacerlo puede ocasionar que se obtenga una versión más antigua de
Guix una vez que @command{reconfigure} se haya completado.
@end quotation

Lleva a efecto toda la configuración especificada en @var{archivo}: cuentas
de usuaria, servicios del sistema, lista de paquetes global, programas con
setuid, etc. La orden inicia los servicios del sistema especificados en
@var{archivo} que no estén actualmente en ejecución; si un servicio se
encuentra en ejecución esta orden prepara su actualización durante la
próxima parada (por ejemplo, con @code{herd stop X} o @code{herd restart
X}).

Esta orden crea una nueva generación cuyo número es el sucesor de la
siguiente generación (como lo muestra @command{guix system
list-generations}). Si esa generación ya existe, será sobreescrita. Este
comportamiento es el mismo que el de @command{guix package} (@pxref{Invocación de guix package}).

También añade una entrada al cargador de arranque para la nueva
configuración del sistema operativo---en caso de que no se proporcione la
opción @option{--no-bootloader}. Con GRUB, mueve las entradas de
configuraciones antiguas a un submenú, permitiendo la selección de una
generación previa del sistema en tiempo de arranque en caso necesario.

@cindex seguimiento de procedencia, del sistema operativo
Tras la finalización, el nuevo sistema se despliega en
@file{/run/current-system}. Este directorio contiene @dfn{metadatos de
procedencia}: la lista de canales usados (@pxref{Canales}) y el
@var{archivo} en sí, cuando esté disponible. Puede visualizar dichos
metadatos con la siguiente orden:

@example
guix system describe
@end example

Esta información es útil en caso de que desee inspeccionar posteriormente
cómo se construyó está generación en particular. De hecho, asumiendo que
@var{archivo} es autocontenido, puede construir de nuevo la generación
@var{n} de su sistema operativo con:

@example
guix time-machine \
  -C /var/guix/profiles/system-@var{n}-link/channels.scm -- \
  system reconfigure \
  /var/guix/profiles/system-@var{n}-link/configuration.scm
@end example

¡Puede pensar en ello como una especie de control de versiones incorporado
en Guix! Su sistema no es únicamente un artefacto binario: @emph{transporta
sus propias fuentes con él}. @xref{Referencia de servicios,
@code{provenance-service-type}}, para más información sobre el seguimiento
de procedencia.

De manera predeterminada, @command{reconfigure} @emph{evita que instale una
version anterior en su sistema operativo}, lo que podría (re)introducir
fallos de seguridad y también provocar problemas con servicios que mantienen
estado como los sistemas de gestión de bases de datos. Puede modificar este
comportamiento con el parámetro @option{--allow-downgrades}.

@item switch-generation
@cindex generaciones
Cambia a una generación existente del sistema. Esta acción cambia
atómicamente el perfil del sistema a la generación del sistema
especificada. También redistribuye las entradas de sistema del menú de
arranque existentes. Marca como predeterminada la entrada de la generación
de sistema especificada y mueve las entradas de otras generaciones a un
submenú, si el cargador de arranque lo permite. La próxima vez que se
arranque el sistema, se usará la generación de sistema especificada.

El cargador de arranque en sí no se reinstala durante esta orden. Por tanto,
el cargador de arranque instalado se usa con un archivo de configuración
actualizado.

La generación deseada puede especificarse explícitamente con su numero de
generación. Por ejemplo, la siguiente invocación cambiaría a la generación 7
del sistema:

@example
guix system switch-generation 7
@end example

La generación deseada puede especificarse también de forma relativa a la
generación actual con la forma @code{+N} o @code{-N}, donde @code{+3}
significa ``3 generaciones después de la generación actual'', y @code{-1}
significa ``1 generación antes de la generación actual''. Cuando se
especifica un valor negativo como @code{-1} debe ir precedido de @code{--}
para evitar que se analice como una opción. Por ejemplo:

@example
guix system switch-generation -- -1
@end example

Actualmente, el efecto de la invocación de esta acción es @emph{únicamente}
cambiar el perfil del sistema a una generación existente y redistribuir las
entradas del menú de arranque. Para realmente empezar a usar la generación
deseada del sistema, debe reiniciar tras esta acción. En el futuro, se
actualizará para hacer lo mismo que @command{reconfigure}, como activación y
desactivación de servicios.

Esta acción fallará si la generación especificada no existe.

@item roll-back
@cindex revertir (``roll back'')
Cambia a la generación de sistema previa. Tras el siguiente arranque del
sistema, usará la generación de sistema precedente. Es la operación inversa
de @command{reconfigure}, y es equivalente a la invocación de
@command{switch-generation} con @code{-1} como parámetro.

Actualmente, como con @command{switch-generation}, debe reiniciar tras la
ejecución de esta acción para realmente empezar a usar la generación de
sistema precedente.

@item delete-generations
@cindex borrado de generaciones del sistema
@cindex ahorro de espacio
Elimina generaciones del sistema, haciendo posible su recolección con la
basura (@pxref{Invocación de guix gc}, para información sobre como llevar a cabo
la ``recolección de basura'').

Esto funciona del mismo modo que @samp{guix package --delete-generations}
(@pxref{Invocación de guix package, @option{--delete-generations}}). Sin
parámetros, se eliminan todas las generaciones del sistema excepto la
actual:

@example
guix system delete-generations
@end example

You can also select the generations you want to delete.  The example below
deletes all the system generations that are more than two months old:

@example
guix system delete-generations 2m
@end example

La ejecución de esta orden reinstala automáticamente el cargador de arranque
con una lista de entradas del menú actualizada---por ejemplo, el submenú de
generaciones antiguas en GRUB no mostrará las generaciones que hayan sido
borradas.

@item build
Construye la derivación del sistema operativo, que incluye todos los
archivos de configuración y programas necesarios para el arranque y la
ejecución del sistema. Esta acción no instala nada en realidad.

@item init
Construye el directorio dado con todos los archivos necesarios para ejecutar
el sistema operativo especificado en @var{archivo}. Esto es útil para la
instalación inicial de Guix. Por ejemplo:

@example
guix system init mi-configuración-del-so.scm /mnt
@end example

copia a @file{/mnt} todos los elementos del almacén necesarios para la
configuración especificada en @file{mi-configuración-del-so.scm}. Esto
incluye los archivos de configuración, paquetes y demás. También crea otros
archivos esenciales necesarios para la correcta operación del sistema---por
ejemplo, los directorios @file{/etc}, @file{/var} y @file{/run}, y el
archivo @file{/bin/sh}.

This command also installs bootloader on the targets specified in
@file{my-os-config}, unless the @option{--no-bootloader} option was passed.

@item vm
@cindex máquina virtual
@cindex VM
@anchor{guix system vm}
Build a virtual machine (VM) that contains the operating system declared in
@var{file}, and return a script to run that VM.

@quotation Nota
La acción @code{vm} y otras presentadas a continuación pueden usar la
funcionalidad KVM del núcleo Linux-libre. Específicamente, si la máquina
permite la virtualización hardware, debe cargarse el correspondiente módulo
KVM del núcleo, debe existir el nodo del dispositivo @file{/dev/kvm} y tanto
la propia usuaria como las usuarias de construcción del daemon deben tener
acceso de lectura y escritura al mismo (@pxref{Configuración del entorno de construcción}).
@end quotation

Los parámetros proporcionados al guión se pasan a QEMU como en el siguiente
ejemplo, que activa la red y solicita 1@tie{}GiB de RAM para la máquina
emulada:

@example
$ /gnu/store/@dots{}-run-vm.sh -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example

It's possible to combine the two steps into one:

@example
$ $(guix system vm my-config.scm) -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example

La VM comparte su almacén con el sistema anfitrión.

By default, the root file system of the VM is mounted volatile; the
@option{--persistent} option can be provided to make it persistent instead.
In that case, the VM disk-image file will be copied from the store to the
@env{TMPDIR} directory to make it writable.

Sistemas de archivos adicionales pueden compartirse entre la máquina
anfitriona y la virtual mediante el uso de las opciones @option{--share} y
@option{--expose}: la primera especifica un directorio a compartir con
acceso de escritura, mientras que la última proporciona solo acceso de
lectura al directorio compartido.

El siguiente ejemplo crea una máquina virtual en la que el directorio de la
usuaria es accesible en modo solo-lecture, y donde el directorio
@file{/intercambio} esta asociado de forma lectura-escritura con
@file{$HOME/tmp} en el sistema anfitrión:

@example
guix system vm mi-configuración.scm \
   --expose=$HOME --share=$HOME/tmp=/intercambio
@end example

En GNU/Linux, lo predeterminado es arrancar directamente el núcleo; esto
posee la ventaja de necesitar únicamente una pequeña imagen del disco raíz
pequeña ya el el almacén de la anfitriona puede montarse.

The @option{--full-boot} option forces a complete boot sequence, starting
with the bootloader.  This requires more disk space since a root image
containing at least the kernel, initrd, and bootloader data files must be
created.

The @option{--image-size} option can be used to specify the size of the
image.

The @option{--no-graphic} option will instruct @command{guix system} to
spawn a headless VM that will use the invoking tty for IO.  Among other
things, this enables copy-pasting, and scrollback.  Use the @kbd{ctrl-a}
prefix to issue QEMU commands; e.g. @kbd{ctrl-a h} prints a help,
@kbd{ctrl-a x} quits the VM, and @kbd{ctrl-a c} switches between the QEMU
monitor and the VM.

@cindex Imágenes de sistema, creación en varios formatos
@cindex Creación de imágenes del sistema en varios formatos
@item image
@cindex image, creating disk images
The @code{image} command can produce various image types.  The image type
can be selected using the @option{--image-type} option.  It defaults to
@code{efi-raw}.  When its value is @code{iso9660}, the @option{--label}
option can be used to specify a volume ID with @code{image}.  By default,
the root file system of a disk image is mounted non-volatile; the
@option{--volatile} option can be provided to make it volatile instead.
When using @code{image}, the bootloader installed on the generated image is
taken from the provided @code{operating-system} definition.  The following
example demonstrates how to generate an image that uses the
@code{grub-efi-bootloader} bootloader and boot it with QEMU:

@example
image=$(guix system image --image-type=qcow2 \
        gnu/system/examples/lightweight-desktop.tmpl)
cp $image /tmp/my-image.qcow2
chmod +w /tmp/my-image.qcow2
qemu-system-x86_64 -enable-kvm -hda /tmp/my-image.qcow2 -m 1000 \
                   -bios $(guix build ovmf)/share/firmware/ovmf_x64.bin
@end example

When using the @code{efi-raw} image type, a raw disk image is produced; it
can be copied as is to a USB stick, for instance.  Assuming @code{/dev/sdc}
is the device corresponding to a USB stick, one can copy the image to it
using the following command:

@example
# dd if=$(guix system image my-os.scm) of=/dev/sdc status=progress
@end example

La orden @code{--list-image-types} muestra todos los tipos de imagen
disponibles.

@cindex creating virtual machine images
When using the @code{qcow2} image type, the returned image is in qcow2
format, which the QEMU emulator can efficiently use. @xref{Ejecutar Guix en una máquina virtual}, for more information on how to run the image in a virtual machine.  The
@code{grub-bootloader} bootloader is always used independently of what is
declared in the @code{operating-system} file passed as argument.  This is to
make it easier to work with QEMU, which uses the SeaBIOS BIOS by default,
expecting a bootloader to be installed in the Master Boot Record (MBR).

@cindex docker-image, creating docker images
When using the @code{docker} image type, a Docker image is produced.  Guix
builds the image from scratch, not from a pre-existing Docker base image.
As a result, it contains @emph{exactly} what you define in the operating
system configuration file.  You can then load the image and launch a Docker
container using commands like the following:

@example
image_id="$(docker load < guix-system-docker-image.tar.gz)"
container_id="$(docker create $image_id)"
docker start $container_id
@end example

Esta orden arranca un contenedor Docker nuevo a partir de la imagen
especificada. El sistema Guix se arrancará de la manera habitual, lo que
implica el inicio de cualquier servicio que se haya definido en la
configuración del sistema operativo. Puede iniciar una sesión de shell
interactiva en el contenedor mediante el uso de @command{docker exec}:

@example
docker exec -ti $container_id /run/current-system/profile/bin/bash --login
@end example

Dependiendo de lo que ejecute en el contenedor Docker, puede ser necesario
proporcionar permisos adicionales al contenedor. Por ejemplo, si pretende
construir software mediante el uso de Guix dentro del contenedor Docker,
puede tener que proporcionar la opción @option{--privileged} a @code{docker
create}.

Por último, la opción @option{--network} afecta a @command{guix system
docker-image}: produce una imagen donde la red supuestamente se comparte con
el sistema anfitrión, y por lo tanto no contiene servicios como nscd o
NetworkManager.

@item container
Devuelve un guión de la ejecución del sistema operativo declarado en
@var{archivo} dentro de un contenedor. Los contenedores son un conjunto de
mecanismos de aislamiento ligeros que proporciona el núcleo Linux-libre. Los
contenedores necesitan sustancialmente menos recursos que máquinas virtuales
completas debido a que el núcleo, los objetos compartidos y otros recursos
pueden compartirse con el sistema anfitrión; esto también significa que
proporcionan un menor aislamiento.

En este momento, el guión debe ejecutarse como root para permitir más de una
única usuaria y grupo. El contenedor comparte su almacén con la máquina
anfitriona.

Como con la acción @code{vm} (@pxref{guix system vm}), sistemas de archivos
adicionales a compartir entre la máquina anfitriona y el contenedor pueden
especificarse mediante el uso de las opciones @option{--share} y
@option{--expose}:

@example
guix system container mi-configuración.scm \
   --expose=$HOME --share=$HOME/tmp=/intercambio
@end example

The @option{--share} and @option{--expose} options can also be passed to the
generated script to bind-mount additional directories into the container.

@quotation Nota
Esta opción requiere Linux-libre 3.19 o posterior.
@end quotation

@end table

@var{opciones} puede contener cualquiera de las opciones de construcción
comunes (@pxref{Opciones comunes de construcción}). Además, @var{opciones} puede
contener una de las siguientes:

@table @option
@item --expression=@var{expr}
@itemx -e @var{expr}
Considera el sistema operativo al cual evalúa @var{expr}. Es una alternativa
a la especificación de un archivo que evalúe a un sistema operativo. Se usa
para la generación de la imagen de instalación de Guix (@pxref{Construcción de la imagen de instalación}).

@item --system=@var{sistema}
@itemx -s @var{sistema}
Intenta la construcción para @var{sistema} en vez de para el tipo de la
máquina anfitriona. Funciona como en @command{guix build} (@pxref{Invocación de guix build}).

@item --target=@var{tripleta}
Compilación cruzada para la @var{tripleta}, que debe ser una tripleta GNU
válida, cómo @code{"aarch64-linux-gnu"} (@pxref{Specifying target triplets,
GNU configuration triplets,, autoconf, Autoconf}).

@item --derivation
@itemx -d
Devuelve el nombre de archivo de la derivación del sistema operativo
proporcionado sin construir nada.

@cindex seguimiento de procedencia, del sistema operativo
@item --save-provenance
Como se ha mostrado previamente, @command{guix system init} y @command{guix
system reconfigure} siempre almacenan información de procedencia a través de
un servicio dedicado (@pxref{Referencia de servicios,
@code{provenance-service-type}}). No obstante, otras órdenes no hacen esto
de manera predeterminada. Si desea, digamos, crear una imagen de máquina
virtual que contenga información de procedencia, puede ejecutar:

@example
guix system image -t qcow2 --save-provenance config.scm
@end example

De este modo, la imagen resultante ``embeberá sus propias fuentes'' de
manera efectiva en forma de metadatos en @file{/run/current-system}. Con
dicha información se puede reconstruir la imagen para asegurarse de que
realmente contiene lo que dice contener; o se puede usar para derivar una
variante de la imagen.

@item --image-type=@var{tipo}
@itemx -t @var{tipo}
For the @code{image} action, create an image with given @var{type}.

When this option is omitted, @command{guix system} uses the @code{efi-raw}
image type.

@cindex ISO-9660, formato
@cindex CD, formato de imagen
@cindex DVD, formato de imagen
@option{--file-system-type=iso9660} produce una imagen ISO-9660, que puede
ser grabada en CD y DVD.

@item --image-size=@var{tamaño}
For the @code{image} action, create an image of the given @var{size}.
@var{size} may be a number of bytes, or it may include a unit as a suffix
(@pxref{Block size, size specifications,, coreutils, GNU Coreutils}).

Cuando se omite esta opción, @command{guix system} calcula una estimación
del tamaño de la imagen en función del tamaño del sistema declarado en
@var{archivo}.

@item --network
@itemx -N
Con la acción @code{container}, permite a los contenedores acceder a la red
de la máquina anfitriona, es decir, no crea un espacio de nombres de red.

@item --root=@var{archivo}
@itemx -r @var{archivo}
Hace que @var{archivo} sea un enlace simbólico al resultado, y lo registra
como una raíz del recolector de basura.

@item --skip-checks
Omite las comprobaciones de seguridad previas a la instalación.

Por omisión, @command{guix system init} y @command{guix system reconfigure}
realizan comprobaciones de seguridad: se aseguran de que los sistemas de
archivos que aparecen en la declaración @code{operating-system} realmente
existen (@pxref{Sistemas de archivos}) y que cualquier módulo del núcleo Linux que
pudiese necesitarse durante el arranque se encuentre en
@code{initrd-modules} (@pxref{Disco en RAM inicial}). El uso de esta opción
omite todas estas comprobaciones.

@item --allow-downgrades
Indica a @command{guix system reconfigure} que permita la instalación de
versiones más antiguas.

De manera predeterminada @command{reconfigure} evita que instale una versión
más antigua. Esto se consigue comparando la información de procedencia en su
sistema operativo (mostrada por @command{guix system describe}) con aquella
de la orden @command{guix} (mostrada por @command{guix describe}). Si las
revisiones de @command{guix} no son descendientes de las usadas en su
sistema, @command{guix system reconfigure} termina con un
error. Proporcionar la opción @option{--allow-downgrades} le permite evitar
estas comprobaciones.

@quotation Nota
Asegúrese de entender las implicaciones de seguridad antes de usar la opción
@option{--allow-downgrades}.
@end quotation

@cindex on-error
@cindex estrategia ``on-error''
@cindex estrategia en caso de error
@item --on-error=@var{estrategia}
Aplica @var{estrategia} cuando ocurre un error durante la lectura de
@var{archivo}. @var{estrategia} puede ser uno de los siguientes valores:

@table @code
@item nothing-special
Informa concisamente del error y termina la ejecución. Es la estrategia
predeterminada.

@item backtrace
Del mismo modo, pero también muestra la secuencia de llamadas.

@item debug
Informa del error y entra en el depurador de Guile. A partir de ahí, puede
ejecutar órdenes como @code{,bt} para obtener la secuencia de llamadas,
@code{,locals} para mostrar los valores de las variables locales, e
inspeccionar el estado del programa de forma más general. @xref{Debug Commands,,, guile, GNU Guile Reference Manual}, para una lista de órdenes de
depuración disponibles.
@end table
@end table

Una vez haya construido, configurado, reconfigurado y re-reconfigurado su
instalación de Guix, puede encontrar útil enumerar las generaciones del
sistema operativo disponibles en el disco---y que puede seleccionar en el
menú de arranque:

@table @code

@item describe
Describe the running system generation: its file name, the kernel and
bootloader used, etc., as well as provenance information when available.

The @code{--list-installed} flag is available, with the same syntax that is
used in @command{guix package --list-installed} (@pxref{Invocación de guix package}).  When the flag is used, the description will include a list of
packages that are currently installed in the system profile, with optional
filtering based on a regular expression.

@quotation Nota
The @emph{running} system generation---referred to by
@file{/run/current-system}---is not necessarily the @emph{current} system
generation---referred to by @file{/var/guix/profiles/system}: it differs
when, for instance, you chose from the bootloader menu to boot an older
generation.

It can also differ from the @emph{booted} system generation---referred to by
@file{/run/booted-system}---for instance because you reconfigured the system
in the meantime.
@end quotation

@item list-generations
Muestra un resumen de cada generación del sistema operativo disponible en el
disco, de manera legible por humanos. Es similar a la opción
@option{--list-generations} de @command{guix package} (@pxref{Invocación de guix package}).

De manera opcional, se puede especificar un patrón, con la misma sintaxis
que la usada en @command{guix package --list-generations}, para restringir
la lista de generaciones mostradas. Por ejemplo, la siguiente orden muestra
generaciones que tienen hasta 10 días de antigüedad:

@example
$ guix system list-generations 10d
@end example

The @code{--list-installed} flag may also be specified, with the same syntax
that is used in @command{guix package --list-installed}.  This may be
helpful if trying to determine when a package was added to the system.

@end table

¡La orden @command{guix system} tiene aún más que ofrecer! Las siguientes
ordenes le permiten visualizar cual es la relación entre los servicios del
sistema:

@anchor{system-extension-graph}
@table @code

@item extension-graph
Emit to standard output the @dfn{service extension graph} of the operating
system defined in @var{file} (@pxref{Composición de servicios}, for more
information on service extensions).  By default the output is in
Dot/Graphviz format, but you can choose a different format with
@option{--graph-backend}, as with @command{guix graph} (@pxref{Invocación de guix graph, @option{--backend}}):

La orden:

@example
$ guix system extension-graph @var{archivo} | xdot -
@end example

muestra las relaciones de extensión entre los servicios.

@quotation Nota
The @command{dot} program is provided by the @code{graphviz} package.
@end quotation

@anchor{system-shepherd-graph}
@item shepherd-graph
Emit to standard output the @dfn{dependency graph} of shepherd services of
the operating system defined in @var{file}.  @xref{Servicios de Shepherd}, for
more information and for an example graph.

Again, the default output format is Dot/Graphviz, but you can pass
@option{--graph-backend} to select a different one.

@end table

@node Invocación de guix deploy
@section Invoking @command{guix deploy}

@cindex @command{guix deploy}
Ya hemos visto como usar declaraciones @code{operating-system} para
gestionar la configuración de una máquina de manera local. Supongamos no
obstante que necesita configurar múltiples máquinas---quizá esté gestionando
un servicio en la web que se componga de varios servidores. @command{guix
deploy} le permite usar las mismas declaraciones @code{operating-system}
para gestionar múltiples máquinas remotas como un único ``despliegue''
lógico.

@quotation Nota
La funcionalidad descrita en esta sección está todavía en desarrollo y
sujeta a cambios. Puede ponerse en contacto con nosotras a través de
@email{guix-devel@@gnu.org}.
@end quotation

@example
guix deploy @var{archivo}
@end example

Dicha invocación llevará a cabo en las máquinas el despliegue al cual el
@var{archivo} evalúe. Como ejemplo, @var{archivo} puede contener una
definición como esta:

@lisp
;; Este es un despliegue de Guix con una configuración en
;; mínima ("en los huesos"), sin servidor gráfico X11,
;; en una máquina con un daemon SSH escuchando en
;; localhost:2222. Una configuración como esta puede ser
;; apropiada para máquinas virtuales con puertos redirigidos
;; a la interfaz local de la máquina anfitriona.
(use-service-modules networking ssh)
(use-package-modules bootloaders)

(define %system
  (operating-system
   (host-name "gnu-deployed")
   (timezone "Etc/UTC")
   (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (targets '("/dev/vda"))
                (terminal-outputs '(console))))
   (file-systems (cons (file-system
                        (mount-point "/")
                        (device "/dev/vda1")
                        (type "ext4"))
                       %base-file-systems))
   (services
    (append (list (service dhcp-client-service-type)
                  (service openssh-service-type
                           (openssh-configuration
                            (permit-root-login #t)
                            (allow-empty-passwords? #t))))
            %base-services))))

(list (machine
       (operating-system %sistema)
       (environment managed-host-environment-type)
       (configuration (machine-ssh-configuration
                       (host-name "localhost")
                       (system "x86_64-linux")
                       (user "alicia")
                       (identity "./id_rsa")
                       (port 2222)))))
@end lisp

El archivo debe evaluar a una lista de objetos @var{machine}. Este ejemplo,
durante el despliegue, creará una nueva generación en el sistema remoto que
implemente la declaración @code{operating-system}
@var{%system}. @code{environment} y @code{configuration} especifican cómo
debe aprovisionarse la máquina---es decir, cómo se crean y gestionan los
recursos computacionales. El ejemplo previo no crea ningún recurso, ya que
@code{'managed-host} es una máquina que ya está ejecutando el sistema Guix y
está disponible a través de la red. Este es un caso particularmente simple;
un despliegue más complejo puede implicar, por ejemplo, el arranque de
máquinas virtuales a través de un proveedor de servidores privados virtuales
(VPS). En dicho caso se usaría un tipo distinto en @var{environment}.

Tenga en cuenta que primero debe generar un par de claves en la máquina
coordinadora para permitir al daemon exportar archivos firmados de archivos
en el almacén (@pxref{Invocación de guix archive}), aunque este paso se realiza
de manera automática en el sistema Guix:

@example
# guix archive --generate-key
@end example

@noindent
Cada máquina de destino debe autorizar a la clave de la máquina maestra para
que acepte elementos del almacén que reciba de la coordinadora:

@example
# guix archive --authorize < clave-publica-coordinadora.txt
@end example

La usuaria proporcionada en @code{user}, en este ejemplo, especifica la
cuenta de la usuaria con la que ingresar en el sistema para realizar el
despliegue. Su valor predeterminado es @code{root}, pero el ingreso al
sistema como root a través de SSH en algunos casos puede no estar
permitido. Para solventar este problema, @command{guix deploy} puede
ingresar al sistema como una usuaria sin privilegios y ejecutar @code{sudo}
para escalar privilegios. Esto funciona únicamente si @code{sudo} está
instalado en el sistema remoto y se puede invocar de manera no interactiva
como @code{user}. Es decir: la línea de @code{sudoers} que permite a la
usuaria @code{user} la capacidad de usar @code{sudo} debe contener la
etiqueta @code{NOPASSWD}. Esto se puede conseguir con el siguiente fragmento
de la configuración de sistema operativo:

@lisp
(use-modules ...
             (gnu system))               ;para %sudoers-specification

(define %usuaria "nombre")

(operating-system
  ...
  (sudoers-file
     (plain-file "sudoers"
                 (string-append (plain-file-content %sudoers-specification)
                                (format #f "~a ALL = NOPASSWD: ALL~%"
                                        %usuaria)))))

@end lisp

Para obtener más información sobre el formato del archivo @file{sudoers}
consulte @command{man sudoers}.

Once you've deployed a system on a set of machines, you may find it useful
to run a command on all of them.  The @option{--execute} or @option{-x}
option lets you do that; the example below runs @command{uname -a} on all
the machines listed in the deployment file:

@example
guix deploy @var{file} -x -- uname -a
@end example

One thing you may often need to do after deployment is restart specific
services on all the machines, which you can do like so:

@example
guix deploy @var{file} -x -- herd restart @var{service}
@end example

The @command{guix deploy -x} command returns zero if and only if the command
succeeded on all the machines.

@c FIXME/TODO: Separate the API doc from the CLI doc.

Below are the data types you need to know about when writing a deployment
file.

@deftp {Tipo de datos} machine
Tipo de datos que representa una máquina individual en un despliegue
heterogéneo de Guix.

@table @asis
@item @code{operating-system}
El objeto de la configuración de sistema operativo a desplegar.

@item @code{environment}
Un objeto @code{environment-type} que describe como debe aprovisionarse la
máquina.

@item @code{configuration} (predeterminado: @code{#f})
Un objeto que describe la configuración para el entorno (@code{environment})
de la máquina. Si @code{environment} tiene una configuración predeterminada,
puede usarse @code{#f}. No obstante, si se usa @code{#f} para un entorno sin
configuración predeterminada se emitirá un error.
@end table
@end deftp

@deftp {Tipo de datos} machine-ssh-configuration
Tipo de datos que representa los parámetros del cliente SSH para una máquina
con un entorno (@code{environment}) de tipo gestionado
(@code{managed-host-environment-type}).

@table @asis
@item @code{host-name}
@item @code{build-locally?} (predeterminado: @code{#t})
Si es falso, las derivaciones del sistema se construirán en la máquina sobre
la que se realiza el despliegue.
@item @code{system}
El tipo de sistema que describe la arquitectura de la máquina sobre la que
se realiza el despliegue---por ejemplo, @code{"x86_64-linux"}.
@item @code{authorize?} (predeterminado: @code{#t})
Si es verdadero, la clave de firma de la máquina coordinadora debe añadirse
al anillo de claves del control de acceso (ACL) de la máquina remota.
@item @code{port} (predeterminado: @code{22})
@item @code{user} (predeterminada: @code{"root"})
@item @code{identity} (predeterminada: @code{#f})
Cuando se especifica, indica la ruta al archivo que contiene la clave
privada de SSH para la identificación con la máquina remota.

@item @code{host-key} (predeterminada: @code{#f})
Esta debería ser la clave SSH de la máquina, que puede ser más o menos así:

@example
ssh-ed25519 AAAAC3Nz@dots{} root@@example.org
@end example

Cuando @code{host-key} es @code{#f}, el servidor se identifica con el
archivo @file{~/.ssh/known_hosts}, igual que hace el cliente @command{ssh}
de OpenSSH.

@item @code{allow-downgrades?} (predeterminado: @code{#f})
Determina si se permiten instalaciones de versiones potencialmente
anteriores.

Al igual que @command{guix system reconfigure}, @command{guix deploy}
compara la revisión del canal desplegada actualmente en la máquina remota
(como muestra @command{guix system describe}) con aquella que se esté usando
en ese momento (como muestra @command{guix describe}) para determinar si las
revisiones que se despliegan son descendientes de aquellas en uso. Cuando no
es el caso y el valor de @code{allow-downgrades?} es falso, emite un
error. Esto le permite no instalar accidentalmente una versión anterior en
máquinas remotas.

@item @code{safety-checks?} (default: @code{#t})
Whether to perform ``safety checks'' before deployment.  This includes
verifying that devices and file systems referred to in the operating system
configuration actually exist on the target machine, and making sure that
Linux modules required to access storage devices at boot time are listed in
the @code{initrd-modules} field of the operating system.

These safety checks ensure that you do not inadvertently deploy a system
that would fail to boot.  Be careful before turning them off!
@end table
@end deftp

@deftp {Tipo de datos} digital-ocean-configuration
Tipo de datos que representa el Droplet que debe crearse para la máquina con
@code{environment} @code{digital-ocean-environment-type}.

@table @asis
@item @code{ssh-key}
The path to the SSH private key to use to authenticate with the remote
host.  In the future, this field may not exist.
@item @code{tags}
A list of string ``tags'' that uniquely identify the machine.  Must be given
such that no two machines in the deployment have the same set of tags.
@item @code{region}
Descriptor (slug) de región de Digital Ocean, como @code{"nyc3"}.
@item @code{size}
Descriptor (slug) de tamaño de Digital Ocean, como @code{"s-1vcpu-1gb"}
@item @code{enable-ipv6?}
Determina si droplet debe crearse con capacidad de usar redes IPv6 o no.
@end table
@end deftp

@node Ejecutar Guix en una máquina virtual
@section Ejecución de Guix en una máquina virtual

@cindex máquina virtual
To run Guix in a virtual machine (VM), one can use the pre-built Guix VM
image distributed at
@url{@value{BASE-URL}/guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2}.
This image is a compressed image in QCOW format.  You can pass it to an
emulator such as @uref{https://qemu.org/, QEMU} (see below for details).

Esta imagen arranca en el entorno gráfico Xfce y contiene algunas
herramientas usadas de forma común. Puede instalar más software en la imagen
mediante la ejecución de @command{guix package} en un terminal
(@pxref{Invocación de guix package}). También puede reconfigurar el sistema en
base a su archivo de configuración inicial, disponible como
@file{/run/current-system/configuration.scm} (@pxref{Uso de la configuración del sistema}).

Instead of using this pre-built image, one can also build their own image
using @command{guix system image} (@pxref{Invocación de guix system}).

@cindex QEMU
If you built your own image, you must copy it out of the store (@pxref{El almacén}) and give yourself permission to write to the copy before you can use
it.  When invoking QEMU, you must choose a system emulator that is suitable
for your hardware platform.  Here is a minimal QEMU invocation that will
boot the result of @command{guix system image -t qcow2} on x86_64 hardware:

@example
$ qemu-system-x86_64 \
   -nic user,model=virtio-net-pci \
   -enable-kvm -m 2048 \
   -device virtio-blk,drive=myhd \
   -drive if=none,file=guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2,id=myhd
@end example

Aquí está el significado de cada una de esas opciones:

@table @code
@item qemu-system-x86_64
Esto especifica la plataforma hardware a emular. Debe corresponder con el
anfitrión.

@item -nic user,model=virtio-net-pci
Activa la pila de red en espacio de usuaria sin privilegios. El SO anfitrión
puede acceder a la máquina virtualizada pero no al revés. Este es el modo
más simple de poner la máquina en red. @code{model} especifica que
dispositivo de red emular: @code{virtio-net-pci} es un dispositivo especial
para sistemas operativos virtualizados y recomendado para la mayor parte de
usos. Asumiendo que su plataforma de hardware es x86_64, puede obtener una
lista de adaptadores de red disponibles ejecutando
@command{qemu-system-x86_64 -nic model=help}.

@item -enable-kvm
Si su sistema tiene extensiones de virtualización por hardware, la
activación de la implementación de máquinas virtuales (KVM) del núcleo Linux
hará que la ejecución sea más rápida.

@c To run Xfce + 'guix pull', we need at least 1G of RAM.
@item -m 2048
RAM disponible para el sistema operativo virtualizado, en mebibytes. El
valor predeterminado es 128@tie{}MiB, que puede ser insuficiente para
algunas operaciones.

@item -device virtio-blk,drive=midisco
Crea un dispositivo @code{virtio-blk} llamado ``midisco''. @code{virtio-blk}
es un mecanismo de ``paravirtualización'' de dispositivos de bloques que
permite a QEMU obtener un mejor rendimiento que se emulase una unidad de
disco completa. Véase la documentación de QEMU y KVM para más información.

@item -drive if=none,file=/tmp/imagen-qemu,id=midisco
Usa nuestra imagen QCOW, el archivo @file{/tmp/imagen-qemu}, como
almacenamiento físico para la unidad ``midisco''.
@end table

The default @command{run-vm.sh} script that is returned by an invocation of
@command{guix system vm} does not add a @command{-nic user} flag by
default.  To get network access from within the vm add the
@code{(dhcp-client-service)} to your system definition and start the VM
using @command{$(guix system vm config.scm) -nic user}.  An important caveat
of using @command{-nic user} for networking is that @command{ping} will not
work, because it uses the ICMP protocol.  You'll have to use a different
command to check for network connectivity, for example @command{guix
download}.

@subsection Conexión a través de SSH

@cindex SSH
@cindex servidor SSH
Para activar SSH dentro de una máquina virtual debe añadir un servidor SSH
como @code{(openssh-service-type)} en su máquina virtual (@pxref{Servicios de red, @code{openssh-service-type}}). Además debe que redirigir el puerto
SSH, el 22 por omisión, a la máquina anfitriona. Puede hacerlo con

@example
$(guix system vm config.scm) -nic user,model=virtio-net-pci,hostfwd=tcp::10022-:22
@end example

Para conectarse a la máquina virtual puede ejecutar

@example
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 10022 localhost
@end example

La @command{-p} indica a @command{ssh} el puerto al que se debe
conectar. @command{-o UserKnownHostsFile=/dev/null} evita que @command{ssh}
se queje cada vez que modifique su archivo @command{config.scm} y la orden
@command{-o StrictHostKeyChecking=no} evita que tenga que autorizar la
conexión a una máquina desconocida cada vez que se conecte.

@quotation Nota
If you find the above @samp{hostfwd} example not to be working (e.g., your
SSH client hangs attempting to connect to the mapped port of your VM), make
sure that your Guix System VM has networking support, such as by using the
@code{dhcp-client-service-type} service type.
@end quotation

@subsection Uso de @command{virt-viewer} con Spice

Como alternativa al cliente gráfico predeterminado de @command{qemu} puede
usar @command{remote-viewer} del paquete @command{virt-viewer}. Para
conectarse proporcione la opción @command{-spice
port=5930,disable-ticketing} a @command{qemu}. Véase la sección previa para
más información sobre cómo hacer esto.

Spice also allows you to do some nice stuff like share your clipboard with
your VM@.  To enable that you'll also have to pass the following flags to
@command{qemu}:

@example
-device virtio-serial-pci,id=virtio-serial0,max_ports=16,bus=pci.0,addr=0x5
-chardev spicevmc,name=vdagent,id=vdagent
-device virtserialport,nr=1,bus=virtio-serial0.0,chardev=vdagent,\
name=com.redhat.spice.0
@end example

También deber añadir a su definición de sistema el servicio
@code{(spice-vdagent-service)} (@pxref{Servicios misceláneos, servicio
Spice}).

@node Definición de servicios
@section Definición de servicios

Las secciones anteriores muestran los servicios disponibles y cómo se pueden
combinar en una declaración @code{operating-system}. ¿Pero cómo las
definimos en primer lugar? ¿Y qué es un servicio en cualquier caso?

@menu
* Composición de servicios::  El modelo para la composición de servicios.
* Tipos de servicios y servicios::  Tipos y servicios
* Referencia de servicios::  Referencia de la API.
* Servicios de Shepherd::    Un tipo de servicio particular.
* Complex Configurations::   Defining bindings for complex configurations.
@end menu

@node Composición de servicios
@subsection Composición de servicios

@cindex services
@cindex daemons
Definimos un @dfn{servicio} como, de manera genérica, algo que extiende la
funcionalidad del sistema operativo. Habitualmente un servicio es un
proceso---un @dfn{daemon}---iniciado cuando el sistema arranca: un servidor
de shell seguro, un servidor Web, el daemon de construcción de Guix, etc. A
veces un servicio es un daemon cuya ejecución puede ser iniciada por otro
daemon---por ejemplo, un servidor FTP iniciado por @command{inetd} o un
servicio D-Bus activado por @command{dbus-daemon}. De manera ocasional, un
servicio no se puede asociar a un daemon. Por ejemplo, el servicio
``account'' recopila cuentas de usuaria y se asegura que existen cuando el
sistema se ejecuta; el servicio ``udev'' recopila reglas de gestión de
dispositivos y los pone a disposición del daemon eudev; el servicio
@file{/etc} genera el contenido del directorio @file{/etc} del sistema.

@cindex extensiones de servicios
Los servicios de Guix se conectan a través de @dfn{extensiones}. Por
ejemplo, el servicio de shell seguro @emph{extiende} Shepherd---el sistema
de inicio, el cual se ejecuta como PID@tie{}1---proporcionando las líneas de
órdenes para arrancar y parar el daemon de shell seguro (@pxref{Servicios de red, @code{lsh-service}}); el servicio UPower extiende el servicio
D-Bus proporcionando su especificación @file{.service}, y extiende el
servicio udev al que proporciona reglas de gestión de dispositivos
(@pxref{Servicios de escritorio, @code{upower-service}}); el servicio del daemon de
Guix extiende Shepherd proporcionando las líneas de órdenes para arrancar y
parar el daemon, y extiende el servicio de cuentas proporcionando una lista
de cuentas de usuarias de construcción que necesita (@pxref{Servicios base}).

Al fin y al cabo, los servicios y sus relaciones de ``extensión'' forman un
grafo acíclico dirigido (GAD). Si representamos los servicios como cajas y
las extensiones como flechas, un sistema típico puede proporcionar algo de
este estilo:

@image{images/service-graph,,5in,Grafo típico de extensiones de servicios.}

@cindex servicio del sistema
En la base, podemos ver el @dfn{servicio del sistema}, el cual produce el
directorio que contiene todo lo necesario para ejecutar y arrancar el
sistema, como es devuelto por la orden @command{guix system
build}. @xref{Referencia de servicios}, para aprender acerca de otros servicios
mostrados aquí. @xref{system-extension-graph, la orden @command{guix system
extension-graph}}, para información sobre cómo generar esta representación
para una definición particular de sistema operativo.

@cindex tipos de servicio
Técnicamente, las desarrolladoras pueden definir @dfn{tipos de servicio}
para expresar estas relaciones. Puede haber cualquier número de servicios de
un tipo dado en el sistema---por ejemplo, un sistema que ejecuta dos
instancias del shell seguro GNU (lsh) tiene dos instancias de
@var{lsh-service-type}, con parámetros diferentes.

La siguiente sección describe la interfaz programática para tipos de
servicio y servicios.

@node Tipos de servicios y servicios
@subsection Tipos de servicios y servicios

Un @dfn{tipo de servicio} es un nodo en el GAD descrito
previamente. Empecemos con un ejemplo simple, el tipo de servicio para el
daemon de construcción Guix (@pxref{Invocación de guix-daemon}):

@lisp
(define guix-service-type
  (service-type
   (name 'guix)
   (extensions
    (list (service-extension shepherd-root-service-type guix-shepherd-service)
          (service-extension account-service-type guix-accounts)
          (service-extension activation-service-type guix-activation)))
   (default-value (guix-configuration))))
@end lisp

@noindent
Define tres cosas:

@enumerate
@item
Un nombre, cuyo único propósito es facilitar la inspección y la depuración.

@item
Una lista de @dfn{extensiones de servicio}, donde cada extensión designa el
tipo de servicio a extender y un procedimiento que, dados los parámetros del
servicio, devuelve una lista de objetos para extender el servicio de dicho
tipo.

Cada tipo de servicio tiene al menos una extensión de servicio. La única
excepción es el @dfn{tipo de servicio de arranque}, que es el último
servicio.

@item
De manera opcional, un valor predeterminado para instancias de este tipo.
@end enumerate

En este ejemplo, @code{guix-service-type} extiende tres servicios:

@table @code
@item shepherd-root-service-type
El procedimiento @code{guix-shepherd-service} define cómo se extiende el
servicio de Shepherd. Es decir, devuelve un objeto @code{<shepherd-service>}
que define cómo se arranca y para @command{guix-daemon} (@pxref{Servicios de Shepherd}).

@item account-service-type
@code{guix-accounts} crea la implementación de esta extensión para este
servicio, la cual devuelve una lista de objetos @code{user-group} y
@code{user-account} que representan las cuentas de usuarias de construcción
(@pxref{Invocación de guix-daemon}).

@item activation-service-type
Aquí @code{guix-activation} es un procedimiento que devuelve una
expresión-G, que es un fragmento de código a ejecutar en ``tiempo de
activación''---por ejemplo, cuando el servicio se arranca.
@end table

Un servicio de este tipo se puede instanciar de esta manera:

@lisp
(service guix-service-type
         (guix-configuration
           (build-accounts 5)
           (extra-options '("--gc-keep-derivations"))))
@end lisp

El segundo parámetro a la forma @code{service} es un valor que representa
los parámetros de esta instancia específica del
servicio. @xref{guix-configuration-type, @code{guix-configuration}}, para
información acerca del tipo de datos @code{guix-configuration}. Cuando se
omite el valor, se usa el valor predeterminado por @code{guix-service-type}:

@lisp
(service guix-service-type)
@end lisp

@code{guix-service-type} es bastante simple puesto que extiende otros
servicios pero no es extensible a su vez.

@c @subsubsubsection Extensible Service Types

El tipo de servicio para un servicio @emph{extensible} puede tener esta
forma:

@lisp
(define udev-service-type
  (service-type (name 'udev)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          udev-shepherd-service)))

                (compose concatenate)       ;concatena la lista de reglas
                (extend (lambda (config rules)
                          (match config
                            (($ <udev-configuration> udev initial-rules)
                             (udev-configuration
                              (udev udev)   ;el paquete udev usado
                              (rules (append initial-rules rules)))))))))
@end lisp

Este es el tipo de servicio para el
@uref{https://wiki.gentoo.org/wiki/Project:Eudev, daemon de gestión de
dispositivos eudev}. En comparación con el ejemplo previo, además de una
extensión de @code{shepherd-root-service-type}, podemos ver dos nuevos
campos:

@table @code
@item compose
Este es el procedimiento para @dfn{componer} la lista de extensiones en
servicios de este tipo.

Los servicios pueden extender el servicio udev proporcionandole una lista de
reglas; componemos estas extensiones mediante una simple concatenación.

@item extend
Este procedimiento define cómo el valor del servicio se @dfn{extiende} con
la composición de la extensión.

Las extensiones de udev se componen en una lista de reglas, pero el valor
del servicio udev es en sí un registro @code{<udev-configuration>}. Por
tanto aquí extendemos el registro agregando la lista de reglas que contiene
al final de la lista de reglas que se contribuyeron.

@item description
Es una cadena que proporciona una descripción del tipo de servicio. Dicha
cadena puede contener lenguaje de marcado Texinfo (@pxref{Overview,,,
texinfo, GNU Texinfo}). La orden @command{guix system search} busca estas
cadenas y las muestra (@pxref{Invocación de guix system}).
@end table

Puede haber únicamente una instancia de un tipo de servicio extensible como
@code{udev-service-type}. Si hubiese más, las especificaciones
@code{service-extension} serían ambiguas.

¿Todavía aquí? La siguiente sección proporciona una referencia de la
interfaz programática de los servicios.

@node Referencia de servicios
@subsection Referencia de servicios

Ya hemos echado un vistazo a los tipos de servicio (@pxref{Tipos de servicios y servicios}). Esta sección proporciona referencias sobre cómo manipular
servicios y tipos de servicio. Esta interfaz se proporciona en el módulo
@code{(gnu services)}.

@deffn {Procedimiento Scheme} service @var{tipo} [@var{valor}]
Devuelve un nuevo servicio de @var{tipo}, un objeto @code{<service-type>}
(véase a continuación). @var{valor} puede ser cualquier objeto; representa
los parámetros de esta instancia de servicio particular.

Cuando se omite @var{valor}, se usa el valor predeterminado especificado por
@var{tipo}; si @var{type} no especifica ningún valor, se produce un error.

Por ejemplo, esto:

@lisp
(service openssh-service-type)
@end lisp

@noindent
es equivalente a esto:

@lisp
(service openssh-service-type
         (openssh-configuration))
@end lisp

En ambos casos el resultado es una instancia de @code{openssh-service-type}
con la configuración predeterminada.
@end deffn

@deffn {Procedimiento Scheme} service? @var{obj}
Devuelve verdadero si @var{obj} es un servicio.
@end deffn

@deffn {Procedimiento Scheme} service-kind @var{servicio}
Devuelve el tipo de @var{servicio}---es decir, un objeto
@code{<service-type>}.
@end deffn

@deffn {Procedimiento Scheme} service-value @var{servicio}
Devuelve el valor asociado con @var{servicio}. Representa sus parámetros.
@end deffn

Este es un ejemplo de creación y manipulación de un servicio:

@lisp
(define s
  (service nginx-service-type
           (nginx-configuration
            (nginx nginx)
            (log-directory log-directory)
            (run-directory run-directory)
            (file config-file))))

(service? s)
@result{} #t

(eq? (service-kind s) nginx-service-type)
@result{} #t
@end lisp

La forma @code{modify-services} proporciona una manera fácil de cambiar los
parámetros de algunos servicios de una lista como @code{%base-services}
(@pxref{Servicios base, @code{%base-services}}). Evalúa a una lista de
servicios. Por supuesto, siempre puede usar operaciones estándar sobre
listas como @code{map} y @code{fold} para hacerlo (@pxref{SRFI-1, List
Library,, guile, GNU Guile Reference Manual}); @code{modify-services}
proporciona simplemente una forma más concisa para este patrón común.

@deffn {Sintaxis Scheme} modify-services @var{servicios} @
  (@var{tipo} @var{variable} => @var{cuerpo}) @dots{}

Modifica los servicios listados en @var{servicios} de acuerdo a las
cláusulas proporcionadas. Cada cláusula tiene la forma:

@example
(@var{tipo} @var{variable} => @var{cuerpo})
@end example

donde @var{tipo} es un tipo de servicio---por ejemplo,
@code{guix-service-type}---y @var{variable} es un identificador que se
asocia dentro del @var{cuerpo} a los parámetros del servicio---por ejemplo,
una instancia @code{guix-configuration}---del servicio original de dicho
@var{ŧipo}.

El @var{cuerpo} deve evaluar a los nuevos parámetros del servicio, que serán
usados para configurar el nuevo servicio. Este nuevo servicio reemplaza el
original en la lista resultante. Debido a que los parámetros de servicio de
un servicio se crean mediante el uso de @code{define-record-type*}, puede
escribir un breve @var{cuerpo} que evalúe a los nuevos parámetros del
servicio mediante el uso de la característica @code{inherit} que proporciona
@code{define-record-type*} para heredar los valores antiguos.

Clauses can also have the following form:

@lisp
(delete @var{type})
@end lisp

Such a clause removes all services of the given @var{type} from
@var{services}.

@xref{Uso de la configuración del sistema}, para ejemplos de uso.

@end deffn

A continuación se procede con la interfaz programática de los tipos de
servicios. Es algo que debe conocer para escribir definiciones de nuevos
servicios, pero no es cuando busque formas de personalizar su declaración
@code{operating-system}.

@deftp {Tipo de datos} service-type
@cindex tipo de servicio
Esta es la representación de un @dfn{tipo de servicio} (@pxref{Tipos de servicios y servicios}).

@table @asis
@item @code{name}
Es un símbolo, usado únicamente para simplificar la inspección y la
depuración.

@item @code{extensions}
Una lista no vacía de objetos @code{<service-extension>} (véase a
continuación).

@item @code{compose} (predeterminado: @code{#f})
Si es @code{#f}, entonces el tipo de servicio denota servicios que no pueden
extenderse---es decir, servicios que no pueden recibir ``valores'' de otros
servicios.

En otro caso, debe ser un procedimiento de un único parámetro. El
procedimiento es invocado en @code{fold-services} y se le proporciona una
lista de valores recibidos de las extensiones. Puede devolver un valor
único.

@item @code{extend} (predeterminado: @code{#f})
Si es @code{#f}, los servicios de este tipo no pueden extenderse.

En otro caso, debe ser un procedimiento que acepte dos parámetros:
@code{fold-services} lo invoca, proporcionandole el valor inicial del
servicio como el primer parámetro y el resultado de aplicar @code{compose} a
los valores de las extensiones como segundo parámetro. Debe devolver un
valor que es un parámetro válido para la instancia del servicio.

@item @code{description}
Una cadena, que posiblemente usa el lenguaje de marcas Texinfo, que describe
en un par de frases el servicio. Esta cadena permite la búsqueda del
servicio a través de @command{guix system search} (@pxref{Invocación de guix system}).

@item @code{default-value} (predeterminado: @code{&no-default-value})
El valor predeterminado asociado a instancias de este tipo de servicio. Esto
permite a las usuarias usar @code{service} sin su segundo parámetro:

@lisp
(service @var{tipo})
@end lisp

El servicio devuelto en este caso tiene el valor predeterminado especificado
por @var{tipo}.
@end table

@xref{Tipos de servicios y servicios}, para ejemplos.
@end deftp

@deffn {Procedimiento Scheme} service-extension @var{tipo-deseado} @
                              @var{calcula}

Devuelve una nueva extensión para servicios del tipo
@var{tipo-deseado}. @var{calcula} debe ser un procedimiento de un único
parámetro: es llamado en @code{fold-services}, proporcionandole el valor
asociado con el servicio que proporciona la extensión; debe devolver un
valor válido para el servicio deseado.
@end deffn

@deffn {Procedimiento Scheme} service-extension? @var{obj}
Devuelve verdadero si @var{obj} es una expresión-G.
@end deffn

De manera ocasional, puede desear simplemente extender un servicio
existente. Esto implica la creación de un nuevo tipo de servicio y la
especificación de la extensión deseada, lo cual puede ser engorroso; el
procedimiento @code{simple-service} proporciona un atajo para ello.

@deffn {Procedimiento Scheme} simple-service @var{nombre} @var{deseado} @var{valor}
Devuelve un servicio que extiende @var{deseado} con @var{valor}. Esto
funciona creando una instancia única del tipo de servicio @var{nombre}, de
la cual el servicio devuelto es una instancia.

Por ejemplo, esto extiende mcron (@pxref{Ejecución de tareas programadas}) con una
tarea adicional:

@lisp
(simple-service 'mi-tarea-mcron mcron-service-type
                #~(job '(next-hour (3)) "guix gc -F 2G"))
@end lisp
@end deffn

En el núcleo de la abstracción de los servicios se encuentra el
procedimiento @code{fold-services}, que es responsable de la ``compilación''
de una lista de servicios en un único directorio que contiene todo lo
necesario para arrancar y ejecutar el sistema---el directorio mostrado por
la orden @command{guix system build} (@pxref{Invocación de guix system}). En
esencia, propaga las extensiones de servicios a través del grafo de
servicios, actualizando los parámetros de cada nodo en el camino, hasta que
alcanza el nodo raíz.

@deffn {Procedimiento Scheme} fold-services @var{servicios} @
                            [#:target-type @var{system-service-type}]
Recorre @var{servicios} propagando sus extensiones hasta la raíz del tipo
@var{target-type}; devuelve el servicio raíz tratado de la manera apropiada.
@end deffn

Por último, el módulo @code{(gnu services)} también define varios tipos
esenciales de servicios, algunos de los cuales se enumeran a continuación.

@defvr {Variable Scheme} system-service-type
Esta es la raíz del grafo de servicios. Produce el directorio del sistema
como lo devuelve la orden @code{guix system build}.
@end defvr

@defvr {Variable Scheme} boot-service-type
El tipo del ``servicio de arranque'', que produce un @dfn{guión de
arranque}. El guión de arranque es lo que ejecuta el disco inicial en RAM
cuando se arranca.
@end defvr

@defvr {Variable Scheme} etc-service-type
El tipo del servicio @file{/etc}. Este servicio se usa para crear los
archivos en @file{/etc} y puede extenderse proporcionandole pares
nombre/archivo como estas:

@lisp
(list `("issue" ,(plain-file "issue" "¡Bienvenida!\n")))
@end lisp

En este ejemplo, el efecto sería la adición de un archivo @file{/etc/issue}
que apunte al archivo proporcionado.
@end defvr

@defvr {Variable Scheme} setuid-program-service-type
Type for the ``setuid-program service''.  This service collects lists of
executable file names, passed as gexps, and adds them to the set of setuid
and setgid programs on the system (@pxref{Programas con setuid}).
@end defvr

@defvr {Variable Scheme} profile-service-type
Tipo del servicio que genera el @dfn{perfil del sistema}---es decir, los
programas en @file{/run/current-system/profile}. Otros servicios pueden
extenderlo proporcionandole listas de paquetes a añadir al perfil del
sistema.
@end defvr

@cindex seguimiento de procedencia, del sistema operativo
@anchor{provenance-service-type}
@defvr {Variable Scheme} provenance-service-type
Es el tipo del servicio que registra los @dfn{metadatos de procedencia} en
el sistema mismo. Crea varios archivos en @file{/run/current-system}:

@table @file
@item channels.scm
Es un ``archivo de canales'' que se le puede proporcionar a @command{guix
pull -C} o @command{guix time-machine -C}, y que describe los canales usados
para construir el sistema, si dicha información estaba disponible
(@pxref{Canales}).

@item configuration.scm
Est es el archivo que se proporciona como valor para el servicio
@code{provenance-service-type}. De manera predeterminada, @command{guix
system reconfigure} proporciona automáticamente el archivo de configuración
del SO que recibió en la línea de órdenes.

@item provenance
Contiene la misma información que los otros dos archivos, pero en un formato
que se puede procesar más fácilmente.
@end table

En general, estas dos piezas de información (canales y el archivo de
configuración) son suficientes para reproducir el sistema operativo ``desde
las fuentes''.

@quotation Advertencias
Esta información es necesaria para reconstruir su sistema operativo, pero no
siempre es suficiente. En particular, @file{configuration.scm} en sí es
insuficiente si no está autocontenido---si hace referencia a módulos
externos de Guile o a archivos adicionales. Si desea que
@file{configuration.scm} sea autocontenido, le recomendamos que los módulos
o archivos a los que haga referencia sean parte de un canal.

Además, la proveniencia de los metadatos es ``silenciosa'' en el sentido de
que no cambia los bits que contiene su sistema, @emph{excepto por los bits
de los metadatos en sí}. Dos configuraciones de SO diferentes o conjuntos de
canales pueden llevar al mismo sistema, bit a bit; cuando se usa
@code{provenance-service-type}, estos dos sistemas tendrán distintos
metadatos y por lo tanto distintos nombres de archivo en el almacén, lo que
hace no tan trivial dicha comparación.
@end quotation

Este servicio se añade automáticamente a la configuración de su sistema
operativo cuando usa @command{guix system reconfigure}, @command{guix system
init} o @command{guix deploy}.
@end defvr

@defvr {Scheme Variable} linux-loadable-module-service-type
Type of the service that collects lists of packages containing
kernel-loadable modules, and adds them to the set of kernel-loadable
modules.

This service type is intended to be extended by other service types, such as
below:

@lisp
(simple-service 'installing-module
                linux-loadable-module-service-type
                (list module-to-install-1
                      module-to-install-2))
@end lisp

This does not actually load modules at bootup, only adds it to the kernel
profile so that it @emph{can} be loaded by other means.
@end defvr

@node Servicios de Shepherd
@subsection Servicios de Shepherd

@cindex servicios de shepherd
@cindex PID 1
@cindex sistema de inicio
El módulo @code{(gnu services shepherd)} proporciona una forma de definir
servicios gestionados por GNU@tie{}Shepherd, que es el sistema de
inicio---el primer proceso que se inicia cuando el sistema arranca, también
conocido como PID@tie{}1 (@pxref{Introducción,,, shepherd, The GNU Shepherd
Manual}).

Los servicios en Shepherd pueden depender de otros servicios. Por ejemplo,
el daemon SSH puede tener que arrancarse tras el arranque del daemon syslog,
lo cual a su vez puede suceder únicamente tras el montaje de todos los
sistemas de archivos. El sistema operativo simple definido previamente
(@pxref{Uso de la configuración del sistema}) genera un grafo de servicios como
este:

@image{images/shepherd-graph,,5in,Grafo típico de servicios de shepherd.}

En realidad puede generar dicho grafo para cualquier definición de sistema
operativo mediante el uso de la orden @command{guix system shepherd-graph}
(@pxref{system-shepherd-graph, @command{guix system shepherd-graph}}).

@code{%shepherd-root-service} es un objeto de servicio que representa el
PID@tie{}1, del tipo @code{shepherd-root-service-type}; puede ser extendido
proporcionandole listas de objetos @code{<shepherd-service>}.

@deftp {Tipo de datos} shepherd-service
El tipo de datos que representa un servicio gestionado por Shepherd.

@table @asis
@item @code{provision}
Una lista de símbolos que indican lo que proporciona el servicio.

Esto son nombres que pueden proporcionarse a @command{herd start},
@command{herd status} y órdenes similares (@pxref{Invoking herd,,, shepherd,
The GNU Shepherd Manual}). @xref{Slots of services, the @code{provides}
slot,, shepherd, The GNU Shepherd Manual}, para más detalles.

@item @code{requirement} (predeterminada: @code{'()})
Lista de símbolos que indican los servicios Shepherd de los que este
depende.

@cindex servicios one-shot, para Shepherd
@item @code{one-shot?} (predeterminado: @code{#f})
Si este servicio es @dfn{one-shot}. Los servicios ``one-shot'' finalizan
inmediatamente después de que su acción @code{start} se
complete. @xref{Slots of services,,, shepherd, The GNU Shepherd Manual},
para más información.

@item @code{respawn?} (predeterminado: @code{#t})
Indica si se debe reiniciar el servicio cuando se para, por ejemplo cuando
el proceso subyacente muere.

@item @code{start}
@itemx @code{stop} (predeterminado: @code{#~(const #f)})
Los campos @code{start} y @code{stop} hacen referencia a las características
de Shepherd de arranque y parada de procesos respectivamente (@pxref{Service De- and Constructors,,, shepherd, The GNU Shepherd Manual}). Se proporcionan
como expresiones-G que se expandirán en el archivo de configuración de
Shepherd (@pxref{Expresiones-G}).

@item @code{actions} (predeterminadas: @code{'()})
@cindex acciones, de servicios de Shepherd
Esta es la lista de objetos @code{shepherd-action} (véase a continuación)
que definen las @dfn{acciones} permitidas por el servicio, además de las
acciones estándar @code{start} y @code{stop}. Las acciones que se listan
aquí estarán disponibles como ordenes de @command{herd}:

@example
herd @var{acción} @var{servicio} [@var{parámetros}@dots{}]
@end example

@item @code{auto-start?} (predeterminado: @code{#t})
Determina si Shepherd debe iniciar este servicio de manera automática. Si es
@code{#f} el servicio debe iniciarse manualmente con @code{herd start}.

@item @code{documentación}
Una cadena de documentación, que se mostrará al ejecutar:

@example
herd doc @var{nombre-del-servicio}
@end example

donde @var{nombre-del-servicio} es uno de los símbolos en @code{provision}
(@pxref{Invoking herd,,, shepherd, The GNU Shepherd Manual}).

@item @code{modules} (predeterminados: @code{%default-modules})
Esta es la lista de módulos que deben estar dentro del ámbito cuando
@code{start} y @code{stop} son evaluados.

@end table
@end deftp

The example below defines a Shepherd service that spawns @command{syslogd},
the system logger from the GNU Networking Utilities (@pxref{syslogd invocation, @command{syslogd},, inetutils, GNU Inetutils}):

@example
(let ((config (plain-file "syslogd.conf" "@dots{}")))
  (shepherd-service
    (documentation "Run the syslog daemon (syslogd).")
    (provision '(syslogd))
    (requirement '(user-processes))
    (start #~(make-forkexec-constructor
               (list #$(file-append inetutils "/libexec/syslogd")
                     "--rcfile" #$config)
               #:pid-file "/var/run/syslog.pid"))
    (stop #~(make-kill-destructor))))
@end example

Key elements in this example are the @code{start} and @code{stop} fields:
they are @dfn{staged} code snippets that use the
@code{make-forkexec-constructor} procedure provided by the Shepherd and its
dual, @code{make-kill-destructor} (@pxref{Service De- and Constructors,,,
shepherd, The GNU Shepherd Manual}).  The @code{start} field will have
@command{shepherd} spawn @command{syslogd} with the given option; note that
we pass @code{config} after @option{--rcfile}, which is a configuration file
declared above (contents of this file are omitted).  Likewise, the
@code{stop} field tells how this service is to be stopped; in this case, it
is stopped by making the @code{kill} system call on its PID@.  Code staging
is achieved using G-expressions: @code{#~} stages code, while @code{#$}
``escapes'' back to host code (@pxref{Expresiones-G}).

@deftp {Tipo de datos} shepherd-action
Este es el tipo de datos que define acciones adicionales implementadas por
un servicio Shepherd (vea previamente).

@table @code
@item name
Símbolo que nombra la acción.

@item documentación
Esta es una cadena de documentación para la acción. Puede verse ejecutando:

@example
herd doc @var{servicio} action @var{acción}
@end example

@item procedure
Debe ser una expresión-G que evalúa a un procedimiento de al menos un
parámetro, el cual es el ``valor de ejecución'' del servicio (@pxref{Slots of services,,, shepherd, The GNU Shepherd Manual}).
@end table

El siguiente ejemplo define una acción llamada @code{di-hola} que saluda
amablemente a la usuaria:

@lisp
(shepherd-action
  (name 'di-hola)
  (documentation "¡Di hola!")
  (procedure #~(lambda (running . args)
                 (format #t "¡Hola, compa! parámetros: ~s\n"
                         args)
                 #t)))
@end lisp

Asumiendo que esta acción se añade al servicio @code{ejemplo}, puede
ejecutar:

@example
# herd di-hola ejemplo
¡Hola, compa! parámetros: ()
# herd di-hola ejemplo a b c
¡Hola, compa! parámetros: ("a" "b" "c")
@end example

Esta, como puede ver, es una forma un tanto sofisticada de decir
hola. @xref{Service Convenience,,, shepherd, The GNU Shepherd Manual}, para
más información sobre acciones.
@end deftp

@cindex configuration file, of Shepherd services
@deffn {Scheme Procedure} shepherd-configuration-action
Return a @code{configuration} action to display @var{file}, which should be
the name of the service's configuration file.

It can be useful to equip services with that action.  For example, the
service for the Tor anonymous router (@pxref{Servicios de red,
@code{tor-service-type}}) is defined roughly like this:

@lisp
(let ((torrc (plain-file "torrc" @dots{})))
  (shepherd-service
    (provision '(tor))
    (requirement '(user-processes loopback syslogd))

    (start #~(make-forkexec-constructor
              (list #$(file-append tor "/bin/tor") "-f" #$torrc)
              #:user "tor" #:group "tor"))
    (stop #~(make-kill-destructor))
    (actions (list (shepherd-configuration-action torrc)))
    (documentation "Run the Tor anonymous network overlay.")))
@end lisp

Thanks to this action, administrators can inspect the configuration file
passed to @command{tor} with this shell command:

@example
cat $(herd configuration tor)
@end example

This can come in as a handy debugging tool!
@end deffn

@defvr {Variable Scheme} shepherd-root-service-type
El tipo de servicio para el ``servicio raíz'' de Shepherd---es decir,
PID@tie{}1.

This is the service type that extensions target when they want to create
shepherd services (@pxref{Tipos de servicios y servicios}, for an example).
Each extension must pass a list of @code{<shepherd-service>}.  Its value
must be a @code{shepherd-configuration}, as described below.
@end defvr

@deftp {Data Type} shepherd-configuration
This data type represents the Shepherd's configuration.

@table @code
@item shepherd (default: @code{shepherd})
The Shepherd package to use.

@item services (default: @code{'()})
A list of @code{<shepherd-service>} to start.  You should probably use the
service extension mechanism instead (@pxref{Servicios de Shepherd}).
@end table
@end deftp

The following example specifies the Shepherd package for the operating
system:

@lisp
(operating-system
  ;; ...
  (services (append (list openssh-service-type))
            ;; ...
            %desktop-services)
  ;; ...
  ;; Use own Shepherd package.
  (essential-services
   (modify-services (operating-system-default-essential-services
                     this-operating-system)
     (shepherd-root-service-type config => (shepherd-configuration
                                            (inherit config)
                                            (shepherd my-shepherd))))))
@end lisp

@defvr {Variable Scheme} %shepherd-root-service
Este servicio representa el PID@tie{}1.
@end defvr

@node Complex Configurations
@subsection Complex Configurations
@cindex complex configurations
Some programs might have rather complex configuration files or formats, and
to make it easier to create Scheme bindings for these configuration files,
you can use the utilities defined in the @code{(gnu services configuration)}
module.

The main utility is the @code{define-configuration} macro, which you will
use to define a Scheme record type (@pxref{Record Overview,,, guile, GNU
Guile Reference Manual}).  The Scheme record will be serialized to a
configuration file by using @dfn{serializers}, which are procedures that
take some kind of Scheme value and returns a G-expression
(@pxref{Expresiones-G}), which should, once serialized to the disk, return a
string.  More details are listed below.

@deffn {Scheme Syntax} define-configuration @var{name} @var{clause1} @
@var{clause2} ...  Create a record type named @code{@var{name}} that
contains the fields found in the clauses.

A clause can have one of the following forms:

@example
(@var{field-name}
 (@var{type} @var{default-value})
 @var{documentation})
 
(@var{field-name}
 (@var{type} @var{default-value})
 @var{documentation}
 @var{serializer})

(@var{field-name}
 (@var{type})
 @var{documentation})

(@var{field-name}
 (@var{type})
 @var{documentation}
 @var{serializer})
@end example

@var{field-name} is an identifier that denotes the name of the field in the
generated record.

@var{type} is the type of the value corresponding to @var{field-name}; since
Guile is untyped, a predicate procedure---@code{@var{type}?}---will be
called on the value corresponding to the field to ensure that the value is
of the correct type.  This means that if say, @var{type} is @code{package},
then a procedure named @code{package?} will be applied on the value to make
sure that it is indeed a @code{<package>} object.

@var{default-value} is the default value corresponding to the field; if none
is specified, the user is forced to provide a value when creating an object
of the record type.

@c XXX: Should these be full sentences or are they allow to be very
@c short like package synopses?
@var{documentation} is a string formatted with Texinfo syntax which should
provide a description of what setting this field does.

@var{serializer} is the name of a procedure which takes two arguments, the
first is the name of the field, and the second is the value corresponding to
the field.  The procedure should return a string or G-expression
(@pxref{Expresiones-G}) that represents the content that will be serialized
to the configuration file.  If none is specified, a procedure of the name
@code{serialize-@var{type}} will be used.

A simple serializer procedure could look like this:

@lisp
(define (serialize-boolean field-name value)
  (let ((value (if value "true" "false")))
    #~(string-append #$field-name #$value)))
@end lisp

In some cases multiple different configuration records might be defined in
the same file, but their serializers for the same type might have to be
different, because they have different configuration formats.  For example,
the @code{serialize-boolean} procedure for the Getmail service would have to
be different from the one for the Transmission service.  To make it easier
to deal with this situation, one can specify a serializer prefix by using
the @code{prefix} literal in the @code{define-configuration} form.  This
means that one doesn't have to manually specify a custom @var{serializer}
for every field.

@lisp
(define (foo-serialize-string field-name value)
  @dots{})

(define (bar-serialize-string field-name value)
  @dots{})
  
(define-configuration foo-configuration
  (label
   (string)
   "The name of label.")
  (prefix foo-))

(define-configuration bar-configuration
  (ip-address
   (string)
   "The IPv4 address for this device.")
  (prefix bar-))
@end lisp

However, in some cases you might not want to serialize any of the values of
the record, to do this, you can use the @code{no-serialization} literal.
There is also the @code{define-configuration/no-serialization} macro which
is a shorthand of this.

@lisp
;; Nothing will be serialized to disk.
(define-configuration foo-configuration
  (field
   (string "test")
   "Some documentation.")
  (no-serialization))

;; The same thing as above.
(define-configuration/no-serialization bar-configuration
  (field
   (string "test")
   "Some documentation."))
@end lisp
@end deffn

@deffn {Scheme Syntax} define-maybe @var{type}
Sometimes a field should not be serialized if the user doesn’t specify a
value.  To achieve this, you can use the @code{define-maybe} macro to define
a ``maybe type''; if the value of a maybe type is left unset, or is set to
the @code{%unset-value} value, then it will not be serialized.

When defining a ``maybe type'', the corresponding serializer for the regular
type will be used by default.  For example, a field of type
@code{maybe-string} will be serialized using the @code{serialize-string}
procedure by default, you can of course change this by specifying a custom
serializer procedure.  Likewise, the type of the value would have to be a
string, or left unspecified.

@lisp
(define-maybe string)

(define (serialize-string field-name value)
  @dots{})

(define-configuration baz-configuration
  (name
   ;; If set to a string, the `serialize-string' procedure will be used
   ;; to serialize the string.  Otherwise this field is not serialized.
   maybe-string
   "The name of this module."))
@end lisp

Like with @code{define-configuration}, one can set a prefix for the
serializer name by using the @code{prefix} literal.

@lisp
(define-maybe integer
  (prefix baz-))

(define (baz-serialize-integer field-name value)
  @dots{})
@end lisp

There is also the @code{no-serialization} literal, which when set means that
no serializer will be defined for the ``maybe type'', regardless of whether
its value is set or not.  @code{define-maybe/no-serialization} is a
shorthand for specifying the @code{no-serialization} literal.

@lisp
(define-maybe/no-serialization symbol)

(define-configuration/no-serialization test-configuration
  (mode
   maybe-symbol
   "Docstring."))
@end lisp
@end deffn

@deffn (Scheme Procedure) maybe-value-set? @var{value}
Predicate to check whether a user explicitly specified the value of a maybe
field.
@end deffn

@deffn {Scheme Procedure} serialize-configuration @var{configuration} @
@var{fields} Return a G-expression that contains the values corresponding to
the @var{fields} of @var{configuration}, a record that has been generated by
@code{define-configuration}.  The G-expression can then be serialized to
disk by using something like @code{mixed-text-file}.
@end deffn

@deffn {Scheme Procedure} empty-serializer @var{field-name} @var{value}
A serializer that just returns an empty string.  The
@code{serialize-package} procedure is an alias for this.
@end deffn

Once you have defined a configuration record, you will most likely also want
to document it so that other people know to use it.  To help with that,
there are two procedures, both of which are documented below.

@deffn {Scheme Procedure} generate-documentation @var{documentation} @
@var{documentation-name} Generate a Texinfo fragment from the docstrings in
@var{documentation}, a list of @code{(@var{label} @var{fields}
@var{sub-documentation} ...)}.  @var{label} should be a symbol and should be
the name of the configuration record.  @var{fields} should be a list of all
the fields available for the configuration record.

@var{sub-documentation} is a @code{(@var{field-name}
@var{configuration-name})} tuple.  @var{field-name} is the name of the field
which takes another configuration record as its value, and
@var{configuration-name} is the name of that configuration record.

@var{sub-documentation} is only needed if there are nested configuration
records.  For example, the @code{getmail-configuration} record (@pxref{Servicios de correo}) accepts a @code{getmail-configuration-file} record in one of its
@code{rcfile} field, therefore documentation for
@code{getmail-configuration-file} is nested in @code{getmail-configuration}.

@lisp
(generate-documentation
  `((getmail-configuration ,getmail-configuration-fields
     (rcfile getmail-configuration-file))
    @dots{})
  'getmail-configuration)
@end lisp

@var{documentation-name} should be a symbol and should be the name of the
configuration record.

@end deffn

@deffn {Scheme Procedure} configuration->documentation
@var{configuration-symbol} Take @var{configuration-symbol}, the symbol
corresponding to the name used when defining a configuration record with
@code{define-configuration}, and print the Texinfo documentation of its
fields.  This is useful if there aren’t any nested configuration records
since it only prints the documentation for the top-level fields.
@end deffn

As of right now, there is no automated way to generate documentation for
configuration records and put them in the manual.  Instead, every time you
make a change to the docstrings of a configuration record, you have to
manually call @code{generate-documentation} or
@code{configuration->documentation}, and paste the output into the
@file{doc/guix.texi} file.

@c TODO: Actually test this
Below is an example of a record type created using
@code{define-configuration} and friends.

@lisp
(use-modules (gnu services)
             (guix gexp)
             (gnu services configuration)
             (srfi srfi-26)
             (srfi srfi-1))

;; Turn field names, which are Scheme symbols into strings
(define (uglify-field-name field-name)
  (let ((str (symbol->string field-name)))
    ;; field? -> is-field
    (if (string-suffix? "?" str)
        (string-append "is-" (string-drop-right str 1))
        str)))

(define (serialize-string field-name value)
  #~(string-append #$(uglify-field-name field-name) " = " #$value "\n"))

(define (serialize-integer field-name value)
  (serialize-string field-name (number->string value)))

(define (serialize-boolean field-name value)
  (serialize-string field-name (if value "true" "false")))

(define (serialize-contact-name field-name value)
  #~(string-append "\n[" #$value "]\n"))

(define (list-of-contact-configurations? lst)
  (every contact-configuration? lst))

(define (serialize-list-of-contact-configurations field-name value)
  #~(string-append #$@@(map (cut serialize-configuration <>
                                contact-configuration-fields)
                           value)))

(define (serialize-contacts-list-configuration configuration)
  (mixed-text-file
   "contactrc"
   #~(string-append "[Owner]\n"
                    #$(serialize-configuration
                       configuration contacts-list-configuration-fields))))

(define-maybe integer)
(define-maybe string)

(define-configuration contact-configuration
  (name
   (string)
   "The name of the contact."
   serialize-contact-name)
  (phone-number
   maybe-integer
   "The person's phone number.")
  (email
   maybe-string
   "The person's email address.")
  (married?
   (boolean)
   "Whether the person is married."))

(define-configuration contacts-list-configuration
  (name
   (string)
   "The name of the owner of this contact list.")
  (email
   (string)
   "The owner's email address.")
  (contacts
   (list-of-contact-configurations '())
   "A list of @@code@{contact-configuation@} records which contain
information about all your contacts."))
@end lisp

A contacts list configuration could then be created like this:

@lisp
(define my-contacts
  (contacts-list-configuration
   (name "Alice")
   (email "alice@@example.org")
   (contacts
    (list (contact-configuration
           (name "Bob")
           (phone-number 1234)
           (email "bob@@gnu.org")
           (married? #f))
          (contact-configuration
           (name "Charlie")
           (phone-number 0000)
           (married? #t))))))
@end lisp

After serializing the configuration to disk, the resulting file would look
like this:

@example
[owner]
name = Alice
email = alice@@example.org

[Bob]
phone-number = 1234
email = bob@@gnu.org
is-married = false

[Charlie]
phone-number = 0
is-married = true
@end example


@node Home Configuration
@chapter Home Configuration
@cindex home configuration
@c Maybe later, it will be possible to make home configuration a part of
@c system configuration to make everything managed by guix system.
Guix supports declarative configuration of @dfn{home environments} by
utilizing the configuration mechanism described in the previous chapter
(@pxref{Definición de servicios}), but for user's dotfiles and packages.  It works
both on Guix System and foreign distros and allows users to declare all the
packages and services that should be installed and configured for the user.
Once a user has written a file containing @code{home-environment} record,
such a configuration can be @dfn{instantiated} by an unprivileged user with
the @command{guix home} command (@pxref{Invoking guix home}).

@quotation Nota
La funcionalidad descrita en esta sección está todavía en desarrollo y
sujeta a cambios. Puede ponerse en contacto con nosotras a través de
@email{guix-devel@@gnu.org}.
@end quotation

The user's home environment usually consists of three basic parts: software,
configuration, and state.  Software in mainstream distros are usually
installed system-wide, but with GNU Guix most software packages can be
installed on a per-user basis without needing root privileges, and are thus
considered part of the user’s @dfn{home environment}.  Packages on their own
are not very useful in many cases, because often they require some
additional configuration, usually config files that reside in
@env{XDG_CONFIG_HOME} (@file{~/.config} by default) or other directories.
Everything else can be considered state, like media files, application
databases, and logs.

Using Guix for managing home environments provides a number of advantages:

@itemize

@item All software can be configured in one language (Guile Scheme),
this gives users the ability to share values between configurations of
different programs.

@item A well-defined home environment is self-contained and can be
created in a declarative and reproducible way---there is no need to grab
external binaries or manually edit some configuration file.

@item After every @command{guix home reconfigure} invocation, a new home
environment generation will be created.  This means that users can rollback
to a previous home environment generation so they don’t have to worry about
breaking their configuration.

@item It is possible to manage stateful data with Guix Home, this
includes the ability to automatically clone Git repositories on the initial
setup of the machine, and periodically running commands like @command{rsync}
to sync data with another host.  This functionality is still in an
experimental stage, though.

@end itemize

@menu
* Declaring the Home Environment::  Customizing your Home.
* Configuring the Shell::    Enabling home environment.
* Home Services::            Specifying home services.
* Invoking guix home::       Instantiating a home configuration.
@end menu

@node Declaring the Home Environment
@section Declaring the Home Environment
The home environment is configured by providing a @code{home-environment}
declaration in a file that can be passed to the @command{guix home} command
(@pxref{Invoking guix home}).  The easiest way to get started is by
generating an initial configuration with @command{guix home import}:

@example
guix home import ~/src/guix-config
@end example

The @command{guix home import} command reads some of the ``dot files'' such
as @file{~/.bashrc} found in your home directory and copies them to the
given directory, @file{~/src/guix-config} in this case; it also reads the
contents of your profile, @file{~/.guix-profile}, and, based on that, it
populates @file{~/src/guix-config/home-configuration.scm} with a Home
configuration that resembles your current configuration.

A simple setup can include Bash and a custom text configuration, like in the
example below.  Don't be afraid to declare home environment parts, which
overlaps with your current dot files: before installing any configuration
files, Guix Home will back up existing config files to a separate place in
the home directory.

@quotation Nota
It is highly recommended that you manage your shell or shells with Guix
Home, because it will make sure that all the necessary scripts are sourced
by the shell configuration file.  Otherwise you will need to do it
manually. (@pxref{Configuring the Shell}).
@end quotation

@findex home-environment
@lisp
@include he-config-bare-bones.scm
@end lisp

The @code{packages} field should be self-explanatory, it will install the
list of packages into the user's profile.  The most important field is
@code{services}, it contains a list of @dfn{home services}, which are the
basic building blocks of a home environment.

There is no daemon (at least not necessarily) related to a home service, a
home service is just an element that is used to declare part of home
environment and extend other parts of it.  The extension mechanism discussed
in the previous chapter (@pxref{Definición de servicios}) should not be confused
with Shepherd services (@pxref{Servicios de Shepherd}).  Using this extension
mechanism and some Scheme code that glues things together gives the user the
freedom to declare their own, very custom, home environments.

@cindex container, for @command{guix home}
Once the configuration looks good, you can first test it in a throw-away
``container'':

@example
guix home container config.scm
@end example

The command above spawns a shell where your home environment is running.
The shell runs in a container, meaning it's isolated from the rest of the
system, so it's a good way to try out your configuration---you can see if
configuration bits are missing or misbehaving, if daemons get started, and
so on.  Once you exit that shell, you're back to the prompt of your original
shell ``in the real world''.

Once you have a configuration file that suits your needs, you can
reconfigure your home by running:

@example
guix home reconfigure config.scm
@end example

This ``builds'' your home environment and creates @file{~/.guix-home}
pointing to it.  Voilà!

@quotation Nota
Make sure the operating system has elogind, systemd, or a similar mechanism
to create the XDG run-time directory and has the @env{XDG_RUNTIME_DIR}
variable set.  Failing that, the @file{on-first-login} script will not
execute anything, and processes like user Shepherd and its descendants will
not start.
@end quotation

@node Configuring the Shell
@section Configuring the Shell
This section is safe to skip if your shell or shells are managed by Guix
Home.  Otherwise, read it carefully.

There are a few scripts that must be evaluated by a login shell to activate
the home environment.  The shell startup files only read by login shells
often have @code{profile} suffix.  For more information about login shells
see @ref{Invoking Bash,,, bash, The GNU Bash Reference Manual} and see
@ref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}.

The first script that needs to be sourced is @file{setup-environment}, which
sets all the necessary environment variables (including variables declared
by the user) and the second one is @file{on-first-login}, which starts
Shepherd for the current user and performs actions declared by other home
services that extends @code{home-run-on-first-login-service-type}.

Guix Home will always create @file{~/.profile}, which contains the following
lines:

@example
HOME_ENVIRONMENT=$HOME/.guix-home
. $HOME_ENVIRONMENT/setup-environment
$HOME_ENVIRONMENT/on-first-login
@end example

This makes POSIX compliant login shells activate the home environment.
However, in most cases this file won't be read by most modern shells,
because they are run in non POSIX mode by default and have their own
@file{*profile} startup files.  For example Bash will prefer
@file{~/.bash_profile} in case it exists and only if it doesn't will it
fallback to @file{~/.profile}.  Zsh (if no additional options are specified)
will ignore @file{~/.profile}, even if @file{~/.zprofile} doesn't exist.

To make your shell respect @file{~/.profile}, add @code{. ~/.profile} or
@code{source ~/.profile} to the startup file for the login shell.  In case
of Bash, it is @file{~/.bash_profile}, and in case of Zsh, it is
@file{~/.zprofile}.

@quotation Nota
This step is only required if your shell is @emph{not} managed by Guix
Home.  Otherwise, everything will be done automatically.
@end quotation

@node Home Services
@section Home Services
@cindex home services

A @dfn{home service} is not necessarily something that has a daemon and is
managed by Shepherd (@pxref{Jump Start,,, shepherd, The GNU Shepherd
Manual}), in most cases it doesn't.  It's a simple building block of the
home environment, often declaring a set of packages to be installed in the
home environment profile, a set of config files to be symlinked into
@env{XDG_CONFIG_HOME} (@file{~/.config} by default), and environment
variables to be set by a login shell.

There is a service extension mechanism (@pxref{Composición de servicios})  which
allows home services to extend other home services and utilize capabilities
they provide; for example: declare mcron jobs (@pxref{Top,,, mcron,
GNU@tie{}Mcron}) by extending @ref{Mcron Home Service}; declare daemons by
extending @ref{Shepherd Home Service}; add commands, which will be invoked
on by the Bash by extending @ref{Shells Home Services,
@code{home-bash-service-type}}.

A good way to discover available home services is using the @command{guix
home search} command (@pxref{Invoking guix home}).  After the required home
services are found, include its module with the @code{use-modules} form
(@pxref{use-modules,, Using Guile Modules, guile, The GNU Guile Reference
Manual}), or the @code{#:use-modules} directive (@pxref{define-module,,
Creating Guile Modules, guile, The GNU Guile Reference Manual}) and declare
a home service using the @code{service} function, or extend a service type
by declaring a new service with the @code{simple-service} procedure from
@code{(gnu services)}.

@menu
* Essential Home Services::  Environment variables, packages, on-* scripts.
* Shells: Shells Home Services.  POSIX shells, Bash, Zsh.
* Mcron: Mcron Home Service.  Scheduled User's Job Execution.
* Power Management: Power Management Home Services.  Services for battery 
                                                       power.
* Shepherd: Shepherd Home Service.  Managing User's Daemons.
* SSH: Secure Shell.         Setting up the secure shell client.
* Desktop: Desktop Home Services.  Services for graphical environments.
* Guix: Guix Home Services.  Services for Guix.
@end menu
@c In addition to that Home Services can provide

@node Essential Home Services
@subsection Essential Home Services
There are a few essential home services defined in @code{(gnu services)},
they are mostly for internal use and are required to build a home
environment, but some of them will be useful for the end user.

@cindex environment variables

@defvr {Scheme Variable} home-environment-variables-service-type
The service of this type will be instantiated by every home environment
automatically by default, there is no need to define it, but someone may
want to extend it with a list of pairs to set some environment variables.

@lisp
(list ("ENV_VAR1" . "value1")
      ("ENV_VAR2" . "value2"))
@end lisp

The easiest way to extend a service type, without defining a new service
type is to use the @code{simple-service} helper from @code{(gnu services)}.

@lisp
(simple-service 'some-useful-env-vars-service
		home-environment-variables-service-type
		`(("LESSHISTFILE" . "$XDG_CACHE_HOME/.lesshst")
                  ("SHELL" . ,(file-append zsh "/bin/zsh"))
                  ("USELESS_VAR" . #f)
                  ("_JAVA_AWT_WM_NONREPARENTING" . #t)))
@end lisp

If you include such a service in you home environment definition, it will
add the following content to the @file{setup-environment} script (which is
expected to be sourced by the login shell):

@example
export LESSHISTFILE=$XDG_CACHE_HOME/.lesshst
export SHELL=/gnu/store/2hsg15n644f0glrcbkb1kqknmmqdar03-zsh-5.8/bin/zsh
export _JAVA_AWT_WM_NONREPARENTING
@end example

@quotation Nota
Make sure that module @code{(gnu packages shells)} is imported with
@code{use-modules} or any other way, this namespace contains the definition
of the @code{zsh} package, which is used in the example above.
@end quotation

The association list (@pxref{Association Lists, alists, Association Lists,
guile, The GNU Guile Reference manual}) is a data structure containing
key-value pairs, for @code{home-environment-variables-service-type} the key
is always a string, the value can be a string, string-valued gexp
(@pxref{Expresiones-G}), file-like object (@pxref{Expresiones-G, file-like
object}) or boolean.  For gexps, the variable will be set to the value of
the gexp; for file-like objects, it will be set to the path of the file in
the store (@pxref{El almacén}); for @code{#t}, it will export the variable
without any value; and for @code{#f}, it will omit variable.

@end defvr

@defvr {Scheme Variable} home-profile-service-type
The service of this type will be instantiated by every home environment
automatically, there is no need to define it, but you may want to extend it
with a list of packages if you want to install additional packages into your
profile.  Other services, which need to make some programs available to the
user will also extend this service type.

The extension value is just a list of packages:

@lisp
(list htop vim emacs)
@end lisp

The same approach as @code{simple-service} (@pxref{Referencia de servicios,
simple-service}) for @code{home-environment-variables-service-type} can be
used here, too.  Make sure that modules containing the specified packages
are imported with @code{use-modules}.  To find a package or information
about its module use @command{guix search} (@pxref{Invocación de guix package}).
Alternatively, @code{specification->package} can be used to get the package
record from string without importing related module.
@end defvr

There are few more essential services, but users are not expected to extend
them.

@defvr {Scheme Variable} home-service-type
The root of home services DAG, it generates a folder, which later will be
symlinked to @file{~/.guix-home}, it contains configurations, profile with
binaries and libraries, and some necessary scripts to glue things together.
@end defvr

@defvr {Scheme Variable} home-run-on-first-login-service-type
The service of this type generates a Guile script, which is expected to be
executed by the login shell.  It is only executed if the special flag file
inside @env{XDG_RUNTIME_DIR} hasn't been created, this prevents redundant
executions of the script if multiple login shells are spawned.

It can be extended with a gexp.  However, to autostart an application, users
@emph{should not} use this service, in most cases it's better to extend
@code{home-shepherd-service-type} with a Shepherd service (@pxref{Servicios de Shepherd}), or extend the shell's startup file with the required command
using the appropriate service type.
@end defvr

@defvr {Scheme Variable} home-files-service-type
The service of this type allows to specify a list of files, which will go to
@file{~/.guix-home/files}, usually this directory contains configuration
files (to be more precise it contains symlinks to files in
@file{/gnu/store}), which should be placed in @file{$XDG_CONFIG_DIR} or in
rare cases in @file{$HOME}.  It accepts extension values in the following
format:

@lisp
`((".sway/config" ,sway-file-like-object)
  (".tmux.conf" ,(local-file "./tmux.conf")))
@end lisp

Each nested list contains two values: a subdirectory and file-like object.
After building a home environment @file{~/.guix-home/files} will be
populated with apropiate content and all nested directories will be created
accordingly, however, those files won't go any further until some other
service will do it.  By default a @code{home-symlink-manager-service-type},
which creates necessary symlinks in home folder to files from
@file{~/.guix-home/files} and backs up already existing, but clashing
configs and other things, is a part of essential home services (enabled by
default), but it's possible to use alternative services to implement more
advanced use cases like read-only home.  Feel free to experiment and share
your results.
@end defvr

@defvr {Scheme Variable} home-xdg-configuration-files-service-type
The service is very similiar to @code{home-files-service-type} (and actually
extends it), but used for defining files, which will go to
@file{~/.guix-home/files/.config}, which will be symlinked to
@file{$XDG_CONFIG_DIR} by @code{home-symlink-manager-service-type} (for
example) during activation.  It accepts extension values in the following
format:

@lisp
`(("sway/config" ,sway-file-like-object)
  ;; -> ~/.guix-home/files/.config/sway/config
  ;; -> $XDG_CONFIG_DIR/sway/config (by symlink-manager)
  ("tmux/tmux.conf" ,(local-file "./tmux.conf")))
@end lisp
@end defvr

@defvr {Scheme Variable} home-activation-service-type
The service of this type generates a guile script, which runs on every
@command{guix home reconfigure} invocation or any other action, which leads
to the activation of the home environment.
@end defvr

@defvr {Scheme Variable} home-symlink-manager-service-type
The service of this type generates a guile script, which will be executed
during activation of home environment, and do a few following steps:

@enumerate
@item
Reads the content of @file{files/} directory of current and pending home
environments.

@item
Cleans up all symlinks created by symlink-manager on previous activation.
Also, sub-directories, which become empty also will be cleaned up.

@item
Creates new symlinks the following way: It looks @file{files/} directory
(usually defined with @code{home-files-service-type},
@code{home-xdg-configuration-files-service-type} and maybe some others),
takes the files from @file{files/.config/} subdirectory and put respective
links in @env{XDG_CONFIG_DIR}.  For example symlink for
@file{files/.config/sway/config} will end up in
@file{$XDG_CONFIG_DIR/sway/config}.  The rest files in @file{files/} outside
of @file{files/.config/} subdirectory will be treated slightly different:
symlink will just go to @file{$HOME}.  @file{files/.some-program/config}
will end up in @file{$HOME/.some-program/config}.

@item
If some sub-directories are missing, they will be created.

@item
If there is a clashing files on the way, they will be backed up.

@end enumerate

symlink-manager is a part of essential home services and is enabled and used
by default.
@end defvr


@node Shells Home Services
@subsection Shells

@cindex shell
@cindex login shell
@cindex interactive shell
@cindex bash
@cindex zsh

Shells play a quite important role in the environment initialization
process, you can configure them manually as described in section
@ref{Configuring the Shell}, but the recommended way is to use home services
listed below.  It's both easier and more reliable.

Each home environment instantiates @code{home-shell-profile-service-type},
which creates a @file{~/.profile} startup file for all POSIX-compatible
shells.  This file contains all the necessary steps to properly initialize
the environment, but many modern shells like Bash or Zsh prefer their own
startup files, that's why the respective home services
(@code{home-bash-service-type} and @code{home-zsh-service-type}) ensure that
@file{~/.profile} is sourced by @file{~/.bash_profile} and
@file{~/.zprofile}, respectively.

@subsubheading Shell Profile Service

@deftp {Data Type} home-shell-profile-configuration
Available @code{home-shell-profile-configuration} fields are:

@table @asis
@item @code{profile} (default: @code{()}) (type: text-config)
@code{home-shell-profile} is instantiated automatically by
@code{home-environment}, DO NOT create this service manually, it can only be
extended.  @code{profile} is a list of file-like objects, which will go to
@file{~/.profile}.  By default @file{~/.profile} contains the initialization
code which must be evaluated by the login shell to make home-environment's
profile available to the user, but other commands can be added to the file
if it is really necessary.  In most cases shell's configuration files are
preferred places for user's customizations.  Extend home-shell-profile
service only if you really know what you do.

@end table

@end deftp

@subsubheading Bash Home Service

@anchor{home-bash-configuration}
@deftp {Data Type} home-bash-configuration
Available @code{home-bash-configuration} fields are:

@table @asis
@item @code{package} (default: @code{bash}) (type: package)
The Bash package to use.

@item @code{guix-defaults?} (default: @code{#t}) (type: boolean)
Add sane defaults like reading @file{/etc/bashrc} and coloring the output of
@command{ls} to the top of the @file{.bashrc} file.

@item @code{environment-variables} (default: @code{()}) (type: alist)
Association list of environment variables to set for the Bash session.  The
rules for the @code{home-environment-variables-service-type} apply here
(@pxref{Essential Home Services}).  The contents of this field will be added
after the contents of the @code{bash-profile} field.

@item @code{aliases} (default: @code{()}) (type: alist)
Association list of aliases to set for the Bash session.  The aliases will
be defined after the contents of the @code{bashrc} field has been put in the
@file{.bashrc} file.  The alias will automatically be quoted, so something
like this:

@lisp
'(("ls" . "ls -alF"))
@end lisp

turns into

@example
alias ls="ls -alF"
@end example

@item @code{bash-profile} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.bash_profile}.
Used for executing user's commands at start of login shell (In most cases
the shell started on tty just after login).  @file{.bash_login} won't be
ever read, because @file{.bash_profile} always present.

@item @code{bashrc} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.bashrc}.  Used for
executing user's commands at start of interactive shell (The shell for
interactive usage started by typing @code{bash} or by terminal app or any
other program).

@item @code{bash-logout} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.bash_logout}.  Used
for executing user's commands at the exit of login shell.  It won't be read
in some cases (if the shell terminates by exec'ing another process for
example).

@end table
@end deftp

You can extend the Bash service by using the @code{home-bash-extension}
configuration record, whose fields must mirror that of
@code{home-bash-configuration} (@pxref{home-bash-configuration}).  The
contents of the extensions will be added to the end of the corresponding
Bash configuration files (@pxref{Bash Startup Files,,, bash, The GNU Bash
Reference Manual}.

For example, here is how you would define a service that extends the Bash
service such that @file{~/.bash_profile} defines an additional environment
variable, @env{PS1}:

@lisp
(define bash-fancy-prompt-service
  (simple-service 'bash-fancy-prompt
                  home-bash-service-type
                  (home-bash-extension
                   (environment-variables
                    '(("PS1" . "\\u \\wλ "))))))
@end lisp

You would then add @code{bash-fancy-prompt-service} to the list in the
@code{services} field of your @code{home-environment}.  The reference of
@code{home-bash-extension} follows.

@deftp {Data Type} home-bash-extension
Available @code{home-bash-extension} fields are:

@table @asis
@item @code{environment-variables} (default: @code{()}) (type: alist)
Additional environment variables to set.  These will be combined with the
environment variables from other extensions and the base service to form one
coherent block of environment variables.

@item @code{aliases} (default: @code{()}) (type: alist)
Additional aliases to set.  These will be combined with the aliases from
other extensions and the base service.

@item @code{bash-profile} (default: @code{()}) (type: text-config)
Additional text blocks to add to @file{.bash_profile}, which will be
combined with text blocks from other extensions and the base service.

@item @code{bashrc} (default: @code{()}) (type: text-config)
Additional text blocks to add to @file{.bashrc}, which will be combined with
text blocks from other extensions and the base service.

@item @code{bash-logout} (default: @code{()}) (type: text-config)
Additional text blocks to add to @file{.bash_logout}, which will be combined
with text blocks from other extensions and the base service.

@end table
@end deftp

@subsubheading Zsh Home Service

@deftp {Data Type} home-zsh-configuration
Available @code{home-zsh-configuration} fields are:

@table @asis
@item @code{package} (default: @code{zsh}) (type: package)
The Zsh package to use.

@item @code{xdg-flavor?} (default: @code{#t}) (type: boolean)
Place all the configs to @file{$XDG_CONFIG_HOME/zsh}.  Makes
@file{~/.zshenv} to set @env{ZDOTDIR} to @file{$XDG_CONFIG_HOME/zsh}.  Shell
startup process will continue with @file{$XDG_CONFIG_HOME/zsh/.zshenv}.

@item @code{environment-variables} (default: @code{()}) (type: alist)
Association list of environment variables to set for the Zsh session.

@item @code{zshenv} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.zshenv}.  Used for
setting user's shell environment variables.  Must not contain commands
assuming the presence of tty or producing output.  Will be read always.
Will be read before any other file in @env{ZDOTDIR}.

@item @code{zprofile} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.zprofile}.  Used
for executing user's commands at start of login shell (In most cases the
shell started on tty just after login).  Will be read before @file{.zlogin}.

@item @code{zshrc} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.zshrc}.  Used for
executing user's commands at start of interactive shell (The shell for
interactive usage started by typing @code{zsh} or by terminal app or any
other program).

@item @code{zlogin} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.zlogin}.  Used for
executing user's commands at the end of starting process of login shell.

@item @code{zlogout} (default: @code{()}) (type: text-config)
List of file-like objects, which will be added to @file{.zlogout}.  Used for
executing user's commands at the exit of login shell.  It won't be read in
some cases (if the shell terminates by exec'ing another process for
example).

@end table

@end deftp

@node Mcron Home Service
@subsection Scheduled User's Job Execution

@cindex cron
@cindex mcron
@cindex planificación de trabajos

The @code{(gnu home services mcron)} module provides an interface to
GNU@tie{}mcron, a daemon to run jobs at scheduled times (@pxref{Top,,,
mcron, GNU@tie{}mcron}).  The information about system's mcron is applicable
here (@pxref{Ejecución de tareas programadas}), the only difference for home
services is that they have to be declared in a @code{home-environment}
record instead of an @code{operating-system} record.

@defvr {Scheme Variable} home-mcron-service-type
This is the type of the @code{mcron} home service, whose value is an
@code{home-mcron-configuration} object.  It allows to manage scheduled
tasks.

This service type can be the target of a service extension that provides
additional job specifications (@pxref{Composición de servicios}).  In other
words, it is possible to define services that provide additional mcron jobs
to run.
@end defvr

@deftp {Data Type} home-mcron-configuration
Available @code{home-mcron-configuration} fields are:

@c Auto-generated with (gnu home services mcron)'s
@c generate-documentation procedure.
@c %start of fragment
@table @asis
@item @code{mcron} (default: @code{mcron}) (type: file-like)
El paquete mcron usado.

@item @code{jobs} (default: @code{()}) (type: list-of-gexps)
This is a list of gexps (@pxref{Expresiones-G}), where each gexp corresponds
to an mcron job specification (@pxref{Syntax, mcron job specifications,,
mcron,GNU@tie{}mcron}).

@item @code{log?} (default: @code{#t}) (type: boolean)
Log messages to standard output.

@item @code{log-format} (default: @code{"~1@@*~a ~a: ~a~%"}) (type: string)
@code{(ice-9 format)} format string for log messages.  The default value
produces messages like "@samp{@var{pid} @var{name}: @var{message}"}
(@pxref{Invoking mcron, Invoking,, mcron,GNU@tie{}mcron}).  Each message is
also prefixed by a timestamp by GNU Shepherd.

@end table
@end deftp
@c %end of fragment

@node Power Management Home Services
@subsection Power Management Home Services

@cindex power management
The @code{(gnu home services pm)} module provides home services pertaining
to battery power.

@defvr {Scheme Variable} home-batsignal-service-type
Service for @code{batsignal}, a program that monitors battery levels and
warns the user through desktop notifications when their battery is getting
low.  You can also configure a command to be run when the battery level
passes a point deemed ``dangerous''.  This service is configured with the
@code{home-batsignal-configuration} record.
@end defvr

@deftp {Data Type} home-batsignal-configuration
Data type representing the configuration for batsignal.

@table @asis
@item @code{warning-level} (default: @code{15})
The battery level to send a warning message at.

@item @code{warning-message} (default: @code{#f})
The message to send as a notification when the battery level reaches the
@code{warning-level}.  Setting to @code{#f} uses the default message.

@item @code{critical-level} (default: @code{5})
The battery level to send a critical message at.

@item @code{critical-message} (default: @code{#f})
The message to send as a notification when the battery level reaches the
@code{critical-level}.  Setting to @code{#f} uses the default message.

@item @code{danger-level} (default: @code{2})
The battery level to run the @code{danger-command} at.

@item @code{danger-command} (default: @code{#f})
The command to run when the battery level reaches the @code{danger-level}.
Setting to @code{#f} disables running the command entirely.

@item @code{full-level} (default: @code{#f})
The battery level to send a full message at.  Setting to @code{#f} disables
sending the full message entirely.

@item @code{full-message} (default: @code{#f})
The message to send as a notification when the battery level reaches the
@code{full-level}.  Setting to @code{#f} uses the default message.

@item @code{batteries} (default: @code{'()})
The batteries to monitor.  Setting to @code{'()} tries to find batteries
automatically.

@item @code{poll-delay} (default: @code{60})
The time in seconds to wait before checking the batteries again.

@item @code{icon} (default: @code{#f})
A file-like object to use as the icon for battery notifications.  Setting to
@code{#f} disables notification icons entirely.

@item @code{notifications?} (default: @code{#t})
Whether to send any notifications.

@item @code{notifications-expire?} (default: @code{#f})
Whether notifications sent expire after a time.

@item @code{notification-command} (default: @code{#f})
Command to use to send messages.  Setting to @code{#f} sends a notification
through @code{libnotify}.

@item @code{ignore-missing?} (default: @code{#f})
Whether to ignore missing battery errors.
@end table
@end deftp

@node Shepherd Home Service
@subsection Managing User Daemons

@cindex shepherd services, for users
The @code{(gnu home services shepherd)} module supports the definitions of
per-user Shepherd services (@pxref{Introducción,,, shepherd, The GNU
Shepherd Manual}).  You extend @code{home-shepherd-service-type} with new
services; Guix Home then takes care of starting the @code{shepherd} daemon
for you when you log in, which in turns starts the services you asked for.

@defvr {Scheme Variable} home-shepherd-service-type
The service type for the userland Shepherd, which allows one to manage
long-running processes or one-shot tasks.  User's Shepherd is not an init
process (PID 1), but almost all other information described in
(@pxref{Servicios de Shepherd}) is applicable here too.

This is the service type that extensions target when they want to create
shepherd services (@pxref{Tipos de servicios y servicios}, for an example).
Each extension must pass a list of @code{<shepherd-service>}.  Its value
must be a @code{home-shepherd-configuration}, as described below.
@end defvr

@deftp {Data Type} home-shepherd-configuration
This data type represents the Shepherd's configuration.

@table @code
@item shepherd (default: @code{shepherd})
The Shepherd package to use.

@item auto-start? (default: @code{#t})
Whether or not to start Shepherd on first login.

@item services (default: @code{'()})
A list of @code{<shepherd-service>} to start.  You should probably use the
service extension mechanism instead (@pxref{Servicios de Shepherd}).
@end table
@end deftp

@node Secure Shell
@subsection Secure Shell

@cindex secure shell client, configuration
@cindex SSH client, configuration
The @uref{https://www.openssh.com, OpenSSH package} includes a client, the
@command{ssh} command, that allows you to connect to remote machines using
the @acronym{SSH, secure shell} protocol.  With the @code{(gnu home services
ssh)} module, you can set up OpenSSH so that it works in a predictable
fashion, almost independently of state on the local machine.  To do that,
you instantiate @code{home-openssh-service-type} in your Home configuration,
as explained below.

@defvr {Scheme Variable} home-openssh-service-type
This is the type of the service to set up the OpenSSH client.  It takes care
of several things:

@itemize
@item
providing a @file{~/.ssh/config} file based on your configuration so that
@command{ssh} knows about hosts you regularly connect to and their
associated parameters;

@item
providing a @file{~/.ssh/authorized_keys}, which lists public keys that the
local SSH server, @command{sshd}, may accept to connect to this user
account;

@item
optionally providing a @file{~/.ssh/known_hosts} file so that @file{ssh} can
authenticate hosts you connect to.
@end itemize

Here is an example of a service and its configuration that you could add to
the @code{services} field of your @code{home-environment}:

@lisp
(service home-openssh-service-type
         (home-openssh-configuration
          (hosts
           (list (openssh-host (name "ci.guix.gnu.org")
                               (user "charlie"))
                 (openssh-host (name "chbouib")
                               (host-name "chbouib.example.org")
                               (user "supercharlie")
                               (port 10022))))
          (authorized-keys (list (local-file "alice.pub")))))
@end lisp

The example above lists two hosts and their parameters.  For instance,
running @command{ssh chbouib} will automatically connect to
@code{chbouib.example.org} on port 10022, logging in as user
@samp{supercharlie}.  Further, it marks the public key in @file{alice.pub}
as authorized for incoming connections.

The value associated with a @code{home-openssh-service-type} instance must
be a @code{home-openssh-configuration} record, as describe below.
@end defvr

@deftp {Data Type} home-openssh-configuration
This is the datatype representing the OpenSSH client and server
configuration in one's home environment.  It contains the following fields:

@table @asis
@item @code{hosts} (default: @code{'()})
A list of @code{openssh-host} records specifying host names and associated
connection parameters (see below).  This host list goes into
@file{~/.ssh/config}, which @command{ssh} reads at startup.

@item @code{known-hosts} (default: @code{*unspecified*})
This must be either:

@itemize
@item
@code{*unspecified*}, in which case @code{home-openssh-service-type} leaves
it up to @command{ssh} and to the user to maintain the list of known hosts
at @file{~/.ssh/known_hosts}, or

@item
a list of file-like objects, in which case those are concatenated and
emitted as @file{~/.ssh/known_hosts}.
@end itemize

The @file{~/.ssh/known_hosts} contains a list of host name/host key pairs
that allow @command{ssh} to authenticate hosts you connect to and to detect
possible impersonation attacks.  By default, @command{ssh} updates it in a
@dfn{TOFU, trust-on-first-use} fashion, meaning that it records the host's
key in that file the first time you connect to it.  This behavior is
preserved when @code{known-hosts} is set to @code{*unspecified*}.

If you instead provide a list of host keys upfront in the @code{known-hosts}
field, your configuration becomes self-contained and stateless: it can be
replicated elsewhere or at another point in time.  Preparing this list can
be relatively tedious though, which is why @code{*unspecified*} is kept as a
default.

@item @code{authorized-keys} (predeterminadas: @code{'()})
This must be a list of file-like objects, each of which containing an SSH
public key that should be authorized to connect to this machine.

Concretely, these files are concatenated and made available as
@file{~/.ssh/authorized_keys}.  If an OpenSSH server, @command{sshd}, is
running on this machine, then it @emph{may} take this file into account:
this is what @command{sshd} does by default, but be aware that it can also
be configured to ignore it.
@end table
@end deftp

@c %start of fragment

@deftp {Data Type} openssh-host
Available @code{openssh-host} fields are:

@table @asis
@item @code{name} (type: string)
Name of this host declaration.

@item @code{host-name} (type: maybe-string)
Host name---e.g., @code{"foo.example.org"} or @code{"192.168.1.2"}.

@item @code{address-family} (type: address-family)
Address family to use when connecting to this host: one of @code{AF_INET}
(for IPv4 only), @code{AF_INET6} (for IPv6 only), or @code{*unspecified*}
(allowing any address family).

@item @code{identity-file} (type: maybe-string)
The identity file to use---e.g., @code{"/home/charlie/.ssh/id_ed25519"}.

@item @code{port} (type: maybe-natural-number)
TCP port number to connect to.

@item @code{user} (type: maybe-string)
User name on the remote host.

@item @code{forward-x11?} (default: @code{#f}) (type: boolean)
Whether to forward remote client connections to the local X11 graphical
display.

@item @code{forward-x11-trusted?} (default: @code{#f}) (type: boolean)
Whether remote X11 clients have full access to the original X11 graphical
display.

@item @code{forward-agent?} (default: @code{#f}) (type: boolean)
Whether the authentication agent (if any) is forwarded to the remote
machine.

@item @code{compression?} (default: @code{#f}) (type: boolean)
Whether to compress data in transit.

@item @code{proxy-command} (type: maybe-string)
The command to use to connect to the server.  As an example, a command to
connect via an HTTP proxy at 192.0.2.0 would be: @code{"nc -X connect -x
192.0.2.0:8080 %h %p"}.

@item @code{host-key-algorithms} (type: maybe-string-list)
The list of accepted host key algorithms---e.g., @code{'("ssh-ed25519")}.

@item @code{accepted-key-types} (type: maybe-string-list)
The list of accepted user public key types.

@item @code{extra-content} (default: @code{""}) (type: raw-configuration-string)
Extra content appended as-is to this @code{Host} block in
@file{~/.ssh/config}.

@end table

@end deftp


@c %end of fragment


@node Desktop Home Services
@subsection Desktop Home Services

The @code{(gnu home services desktop)} module provides services that you may
find useful on ``desktop'' systems running a graphical user environment such
as Xorg.

@defvr {Scheme Variable} home-redshift-service-type
This is the service type for @uref{https://github.com/jonls/redshift,
Redshift}, a program that adjusts the display color temperature according to
the time of day.  Its associated value must be a
@code{home-redshift-configuration} record, as shown below.

A typical configuration, where we manually specify the latitude and
longitude, might look like this:

@lisp
(service home-redshift-service-type
         (home-redshift-configuration
          (location-provider 'manual)
          (latitude 35.81)    ;northern hemisphere
          (longitude -0.80))) ;west of Greenwich
@end lisp
@end defvr

@deftp {Data Type} home-redshift-configuration
Available @code{home-redshift-configuration} fields are:

@table @asis
@item @code{redshift} (default: @code{redshift}) (type: file-like)
Redshift package to use.

@item @code{location-provider} (default: @code{geoclue2}) (type: symbol)
Geolocation provider---@code{'manual} or @code{'geoclue2}.  In the former
case, you must also specify the @code{latitude} and @code{longitude} fields
so Redshift can determine daytime at your place.  In the latter case, the
Geoclue system service must be running; it will be queried for location
information.

@item @code{adjustment-method} (default: @code{randr}) (type: symbol)
Color adjustment method.

@item @code{daytime-temperature} (default: @code{6500}) (type: integer)
Daytime color temperature (kelvins).

@item @code{nighttime-temperature} (default: @code{4500}) (type: integer)
Nighttime color temperature (kelvins).

@item @code{daytime-brightness} (type: maybe-inexact-number)
Daytime screen brightness, between 0.1 and 1.0, or left unspecified.

@item @code{nighttime-brightness} (type: maybe-inexact-number)
Nighttime screen brightness, between 0.1 and 1.0, or left unspecified.

@item @code{latitude} (type: maybe-inexact-number)
Latitude, when @code{location-provider} is @code{'manual}.

@item @code{longitude} (type: maybe-inexact-number)
Longitude, when @code{location-provider} is @code{'manual}.

@item @code{dawn-time} (type: maybe-string)
Custom time for the transition from night to day in the
morning---@code{"HH:MM"} format.  When specified, solar elevation is not
used to determine the daytime/nighttime period.

@item @code{dusk-time} (type: maybe-string)
Likewise, custom time for the transition from day to night in the evening.

@item @code{extra-content} (default: @code{""}) (type: raw-configuration-string)
Extra content appended as-is to the Redshift configuration file.  Run
@command{man redshift} for more information about the configuration file
format.

@end table

@end deftp

@defvr {Scheme Variable} home-dbus-service-type
This is the service type for running a session-specific D-Bus, for
unprivileged applications that require D-Bus to be running.
@end defvr

@deftp {Data Type} home-dbus-configuration
The configuration record for @code{home-dbus-service-type}.

@table @asis
@item @code{dbus} (default: @code{dbus})
The package providing the @code{/bin/dbus-daemon} command.
@end table
@end deftp

@node Guix Home Services
@subsection Guix Home Services

The @code{(gnu home services guix)} module provides services for
user-specific Guix configuration.

@defvr {Scheme Variable} home-channels-service-type
This is the service type for managing
@file{$XDG_CONFIG_HOME/guix/channels.scm}, the file that controls the
channels received on @command{guix pull} (@pxref{Canales}).  Its associated
value is a list of @code{channel} records, defined in the @code{(guix
channels)} module.

Generally, it is better to extend this service than to directly configure
it, as its default value is the default guix channel(s)  defined by
@code{%default-channels}.  If you configure this service directly, be sure
to include a guix channel.  @xref{Especificación de canales adicionales} and
@ref{Uso de un canal de Guix personalizado} for more details.

A typical extension for adding a channel might look like this:

@lisp
(simple-service 'variant-packages-service
                home-channels-service-type
                (list
                 (channel
                  (name 'variant-packages)
                  (url "https://example.org/variant-packages.git"))))
@end lisp
@end defvr

@node Invoking guix home
@section Invoking @command{guix home}

@cindex @command{guix home}

Once you have written a home environment declaration (@pxref{Declaring the Home Environment,,,,}, it can be @dfn{instantiated} using the @command{guix
home} command.  The synopsis is:

@example
guix home @var{options}@dots{} @var{action} @var{file}
@end example

@var{file} must be the name of a file containing a @code{home-environment}
declaration.  @var{action} specifies how the home environment is
instantiated, but there are few auxiliary actions which don't instantiate
it.  Currently the following values are supported:

@table @code
@item search
Display available home service type definitions that match the given regular
expressions, sorted by relevance:

@cindex shell
@cindex shell-profile
@cindex bash
@cindex zsh
@example
$ guix home search shell
name: home-shell-profile
location: gnu/home/services/shells.scm:100:2
extends: home-files
description: Create `~/.profile', which is used for environment initialization of POSIX compliant login shells.
+ This service type can be extended with a list of file-like objects.
relevance: 6

name: home-fish
location: gnu/home/services/shells.scm:640:2
extends: home-files home-profile
description: Install and configure Fish, the friendly interactive shell.
relevance: 3

name: home-zsh
location: gnu/home/services/shells.scm:290:2
extends: home-files home-profile
description: Install and configure Zsh.
relevance: 1

name: home-bash
location: gnu/home/services/shells.scm:508:2
extends: home-files home-profile
description: Install and configure GNU Bash.
relevance: 1

@dots{}
@end example

As for @command{guix search}, the result is written in @code{recutils}
format, which makes it easy to filter the output (@pxref{Top, GNU recutils
databases,, recutils, GNU recutils manual}).

@cindex container, for @command{guix home}
@item container
Spawn a shell in an isolated environment---a @dfn{container}---containing
your home as specified by @var{file}.

For example, this is how you would start an interactive shell in a container
with your home:

@example
guix home container config.scm
@end example

This is a throw-away container where you can lightheartedly fiddle with
files; any changes made within the container, any process started---all this
disappears as soon as you exit that shell.

As with @command{guix shell}, several options control that container:

@table @option
@item --network
@itemx -N
Enable networking within the container (it is disabled by default).

@item --expose=@var{fuente}[=@var{destino}]
@itemx --share=@var{fuente}[=@var{destino}]
As with @command{guix shell}, make directory @var{source} of the host system
available as @var{target} inside the container---read-only if you pass
@option{--expose}, and writable if you pass @option{--share}
(@pxref{Invoking guix shell, @option{--expose} and @option{--share}}).
@end table

Additionally, you can run a command in that container, instead of spawning
an interactive shell.  For instance, here is how you would check which
Shepherd services are started in a throw-away home container:

@example
guix home container config.scm -- herd status
@end example

The command to run in the container must come after @code{--} (double
hyphen).

@cindex service type definition, editing
@cindex editing, service type definition
@item edit
Edit or view the definition of the given Home service types.

For example, the command below opens your editor, as specified by the
@env{EDITOR} environment variable, on the definition of the
@code{home-mcron} service type:

@example
guix home edit home-mcron
@end example

@item reconfigure
Build the home environment described in @var{file}, and switch to it.
Switching means that the activation script will be evaluated and (in basic
scenario) symlinks to configuration files generated from
@code{home-environment} declaration will be created in @file{~}.  If the
file with the same path already exists in home folder it will be moved to
@file{~/@var{timestamp}-guix-home-legacy-configs-backup}, where
@var{timestamp} is a current UNIX epoch time.

@quotation Nota
It is highly recommended to run @command{guix pull} once before you run
@command{guix home reconfigure} for the first time (@pxref{Invocación de guix pull}).
@end quotation

This effects all the configuration specified in @var{file}.  The command
starts Shepherd services specified in @var{file} that are not currently
running; if a service is currently running, this command will arrange for it
to be upgraded the next time it is stopped (e.g.@: by @code{herd stop
@var{service}} or @code{herd restart @var{service}}).

This command creates a new generation whose number is one greater than the
current generation (as reported by @command{guix home list-generations}).
If that generation already exists, it will be overwritten.  This behavior
mirrors that of @command{guix package} (@pxref{Invocación de guix package}).

@cindex provenance tracking, of the home environment
Upon completion, the new home is deployed under @file{~/.guix-home}.  This
directory contains @dfn{provenance meta-data}: the list of channels in use
(@pxref{Canales}) and @var{file} itself, when available.  You can view the
provenance information by running:

@example
guix home describe
@end example

This information is useful should you later want to inspect how this
particular generation was built.  In fact, assuming @var{file} is
self-contained, you can later rebuild generation @var{n} of your home
environment with:

@example
guix time-machine \
  -C /var/guix/profiles/per-user/@var{USER}/guix-home-@var{n}-link/channels.scm -- \
  home reconfigure \
  /var/guix/profiles/per-user/@var{USER}/guix-home-@var{n}-link/configuration.scm

@end example

@c @xref{Referencia de servicios, @code{provenance-service-type}}, for more
@c information on provenance tracking.
You can think of it as some sort of built-in version control! Your home is
not just a binary artifact: @emph{it carries its own source}.

@c @footnote{This action (and the related actions
@c @code{switch-generation} and @code{roll-back}) are usable after the
@c home environment is initialized.}.

@item switch-generation
@cindex home generations
Switch to an existing home generation.  This action atomically switches the
home profile to the specified home generation.

The target generation can be specified explicitly by its generation number.
For example, the following invocation would switch to home generation 7:

@example
guix home switch-generation 7
@end example

La generación deseada puede especificarse también de forma relativa a la
generación actual con la forma @code{+N} o @code{-N}, donde @code{+3}
significa ``3 generaciones después de la generación actual'', y @code{-1}
significa ``1 generación antes de la generación actual''. Cuando se
especifica un valor negativo como @code{-1} debe ir precedido de @code{--}
para evitar que se analice como una opción. Por ejemplo:

@example
guix home switch-generation -- -1
@end example

Esta acción fallará si la generación especificada no existe.

@item roll-back
@cindex revertir (``roll back'')
Switch to the preceding home generation.  This is the inverse of
@command{reconfigure}, and it is exactly the same as invoking
@command{switch-generation} with an argument of @code{-1}.

@item delete-generations
@cindex deleting home generations
@cindex ahorro de espacio
Delete home generations, making them candidates for garbage collection
(@pxref{Invocación de guix gc}, for information on how to run the ``garbage
collector'').

This works in the same way as @samp{guix package --delete-generations}
(@pxref{Invocación de guix package, @option{--delete-generations}}).  With no
arguments, all home generations but the current one are deleted:

@example
guix home delete-generations
@end example

You can also select the generations you want to delete.  The example below
deletes all the home generations that are more than two months old:

@example
guix home delete-generations 2m
@end example

@item build
Build the derivation of the home environment, which includes all the
configuration files and programs needed.  This action does not actually
install anything.

@item describe
Describe the current home generation: its file name, as well as provenance
information when available.

To show installed packages in the current home generation's profile, the
@code{--list-installed} flag is provided, with the same syntax that is used
in @command{guix package --list-installed} (@pxref{Invocación de guix package}).
For instance, the following command shows a table of all the packages with
``emacs'' in their name that are installed in the current home generation's
profile:

@example
guix home describe --list-installed=emacs
@end example

@item list-generations
List a summary of each generation of the home environment available on disk,
in a human-readable way.  This is similar to the @option{--list-generations}
option of @command{guix package} (@pxref{Invocación de guix package}).

De manera opcional, se puede especificar un patrón, con la misma sintaxis
que la usada en @command{guix package --list-generations}, para restringir
la lista de generaciones mostradas. Por ejemplo, la siguiente orden muestra
generaciones que tienen hasta 10 días de antigüedad:

@example
guix home list-generations 10d
@end example

The @code{--list-installed} flag may also be specified, with the same syntax
that is used in @command{guix home describe}.  This may be helpful if trying
to determine when a package was added to the home profile.

@item import
Generate a @dfn{home environment} from the packages in the default profile
and configuration files found in the user's home directory.  The
configuration files will be copied to the specified directory, and a
@file{home-configuration.scm} will be populated with the home environment.
Note that not every home service that exists is supported (@pxref{Home Services}).

@example
$ guix home import ~/guix-config
guix home: '/home/alice/guix-config' populated with all the Home configuration files
@end example
@end table

And there's more! @command{guix home} also provides the following
sub-commands to visualize how the services of your home environment relate
to one another:

@table @code
@cindex service extension graph, of a home environment
@item extension-graph
Emit to standard output the @dfn{service extension graph} of the home
environment defined in @var{file} (@pxref{Composición de servicios}, for more
information on service extensions).  By default the output is in
Dot/Graphviz format, but you can choose a different format with
@option{--graph-backend}, as with @command{guix graph} (@pxref{Invocación de guix graph, @option{--backend}}):

La orden:

@example
guix home extension-graph @var{file} | xdot -
@end example

muestra las relaciones de extensión entre los servicios.

@cindex Shepherd dependency graph, for a home environment
@item shepherd-graph
Emit to standard output the @dfn{dependency graph} of shepherd services of
the home environment defined in @var{file}.  @xref{Servicios de Shepherd}, for
more information and for an example graph.

Again, the default output format is Dot/Graphviz, but you can pass
@option{--graph-backend} to select a different one.
@end table

@var{opciones} puede contener cualquiera de las opciones de construcción
comunes (@pxref{Opciones comunes de construcción}). Además, @var{opciones} puede
contener una de las siguientes:

@table @option

@item --expression=@var{expr}
@itemx -e @var{expr}
Consider the home-environment @var{expr} evaluates to.  This is an
alternative to specifying a file which evaluates to a home environment.

@item --allow-downgrades
Instruct @command{guix home reconfigure} to allow system downgrades.

Just like @command{guix system}, @command{guix home reconfigure}, by
default, prevents you from downgrading your home to older or unrelated
revisions compared to the channel revisions that were used to deploy
it---those shown by @command{guix home describe}.  Using
@option{--allow-downgrades} allows you to bypass that check, at the risk of
downgrading your home---be careful!

@end table

@node Documentación
@chapter Documentación

@cindex documentación, búsqueda
@cindex búsqueda de documentación
@cindex Info, formato de documentación
@cindex páginas man
@cindex páginas de manual
In most cases packages installed with Guix come with documentation.  There
are two main documentation formats: ``Info'', a browsable hypertext format
used for GNU software, and ``manual pages'' (or ``man pages''), the linear
documentation format traditionally found on Unix.  Info manuals are accessed
with the @command{info} command or with Emacs, and man pages are accessed
using @command{man}.

Puede buscar documentación de software instalado en su sistema por palabras
clave. Por ejemplo, la siguiente orden busca información sobre ``TLS'' en
manuales Info:

@example
$ info -k TLS
"(emacs)Network Security" -- STARTTLS
"(emacs)Network Security" -- TLS
"(gnutls)Core TLS API" -- gnutls_certificate_set_verify_flags
"(gnutls)Core TLS API" -- gnutls_certificate_set_verify_function
@dots{}
@end example

@noindent
The command below searches for the same keyword in man pages@footnote{The
database searched by @command{man -k} is only created in profiles that
contain the @code{man-db} package.}:

@example
$ man -k TLS
SSL (7)              - OpenSSL SSL/TLS library
certtool (1)         - GnuTLS certificate tool
@dots {}
@end example

Estas búsquedas son completamente locales en su máquina de modo que tiene la
garantía de que la documentación que encuentre corresponde con lo que está
realmente instalado, puede acceder a ella sin conexión a la red, y se
respeta su privacidad.

Una vez tenga estos resultados, puede ver la documentación relevante
mediante la ejecución de, digamos:

@example
$ info "(gnutls)Core TLS API"
@end example

@noindent
o:

@example
$ man certtool
@end example

Los manuales Info contienen secciones e índices, así como enlaces como
aquellos encontrados en páginas Web. El lector @command{info} (@pxref{Top,
Info reader,, info-stnd, Stand-alone GNU Info}) y su contraparte en Emacs
(@pxref{Misc Help,,, emacs, The GNU Emacs Manual}) proporcionan
combinaciones de teclas intuitivas para la navegación en los
manuales. @xref{Empezando,,, info, Info: An Introduction}, para una
introducción a la navegación en Info.

@node Platforms
@chapter Platforms

The packages and systems built by Guix are intended, like most computer
programs, to run on a CPU with a specific instruction set, and under a
specific operating system.  Those programs are often also targeting a
specific kernel and system library.  Those constraints are captured by Guix
in @code{platform} records.

@menu
* platform Reference::       Detail of platform declarations.
* Supported Platforms::      Description of the supported platforms.
@end menu

@node platform Reference
@section @code{platform} Reference

The @code{platform} data type describes a @dfn{platform}: an @acronym{ISA,
instruction set architecture}, combined with an operating system and
possibly additional system-wide settings such as the @acronym{ABI,
application binary interface}.

@deftp {Data Type} platform
This is the data type representing a platform.

@table @asis
@item @code{target}
This field specifies the platform's GNU triplet as a string
(@pxref{Specifying Target Triplets, GNU configuration triplets,, autoconf,
Autoconf}).

@item @code{system}
This string is the system type as it is known to Guix and passed, for
instance, to the @option{--system} option of most commands.

It usually has the form @code{"@var{cpu}-@var{kernel}"}, where @var{cpu} is
the target CPU and @var{kernel} the target operating system kernel.

It can be for instance @code{"aarch64-linux"} or @code{"armhf-linux"}.  You
will encounter system types when you perform native builds (@pxref{Native Builds}).

@item @code{linux-architecture} (default: @code{#false})
This optional string field is only relevant if the kernel is Linux.  In that
case, it corresponds to the ARCH variable used when building Linux,
@code{"mips"} for instance.

@item @code{glibc-dynamic-linker}
This field is the name of the GNU C Library dynamic linker for the
corresponding system, as a string.  It can be
@code{"/lib/ld-linux-armhf.so.3"}.

@end table
@end deftp

@node Supported Platforms
@section Supported Platforms

The @code{(guix platforms @dots{})} modules export the following variables,
each of which is bound to a @code{platform} record.

@defvr {Scheme Variable} armv7-linux
Platform targeting ARM v7 CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} aarch64-linux
Platform targeting ARM v8 CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} mips64-linux
Platform targeting MIPS little-endian 64-bit CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} powerpc-linux
Platform targeting PowerPC big-endian 32-bit CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} powerpc64le-linux
Platform targeting PowerPC little-endian 64-bit CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} riscv64-linux
Platform targeting RISC-V 64-bit CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} i686-linux
Platform targeting x86 CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} x86_64-linux
Platform targeting x86 64-bit CPU running GNU/Linux.
@end defvr

@defvr {Scheme Variable} i686-mingw
Platform targeting x86 CPU running Windows, with run-time support from
MinGW.
@end defvr

@defvr {Scheme Variable} x86_64-mingw
Platform targeting x86 64-bit CPU running Windows, with run-time support
from MinGW.
@end defvr

@defvr {Scheme Variable} i586-gnu
Platform targeting x86 CPU running GNU/Hurd (also referred to as ``GNU'').
@end defvr

@node System Images
@chapter Creating System Images

@cindex system images
When it comes to installing Guix System for the first time on a new machine,
you can basically proceed in three different ways.  The first one is to use
an existing operating system on the machine to run the @command{guix system
init} command (@pxref{Invocación de guix system}).  The second one, is to produce
an installation image (@pxref{Construcción de la imagen de instalación}). This is a
bootable system which role is to eventually run @command{guix system init}.
Finally, the third option would be to produce an image that is a direct
instantiation of the system you wish to run.  That image can then be copied
on a bootable device such as an USB drive or a memory card.  The target
machine would then directly boot from it, without any kind of installation
procedure.

The @command{guix system image} command is able to turn an operating system
definition into a bootable image.  This command supports different image
types, such as @code{efi-raw}, @code{iso9660} and @code{docker}.  Any modern
@code{x86_64} machine will probably be able to boot from an @code{iso9660}
image.  However, there are a few machines out there that require specific
image types.  Those machines, in general using @code{ARM} processors, may
expect specific partitions at specific offsets.

This chapter explains how to define customized system images and how to turn
them into actual bootable images.

@menu
* image Reference::          Detail of image declarations.
* Instantiate an Image::     How to instantiate an image record.
* image-type Reference::     Detail of image types declaration.
* Image Modules::            Definition of image modules.
@end menu

@node image Reference
@section @code{image} Reference

The @code{image} record, described right after, allows you to define a
customized bootable system image.

@deftp {Data Type} image
This is the data type representing a system image.

@table @asis
@item @code{name} (default: @code{#false})
The image name as a symbol, @code{'my-iso9660} for instance.  The name is
optional and it defaults to @code{#false}.

@item @code{format}
The image format as a symbol.  The following formats are supported:

@itemize
@item @code{disk-image}, a raw disk image composed of one or multiple
partitions.

@item @code{compressed-qcow2}, a compressed qcow2 image composed of
one or multiple partitions.

@item @code{docker}, a Docker image.

@item @code{iso9660}, an ISO-9660 image.

@item @code{tarball}, a tar.gz image archive.

@item @code{wsl2}, a WSL2 image.

@end itemize

@item @code{platform} (default: @code{#false})
The @code{platform} record the image is targeting (@pxref{Platforms}),
@code{aarch64-linux} for instance.  By default, this field is set to
@code{#false} and the image will target the host platform.

@item @code{size} (default: @code{'guess})
The image size in bytes or @code{'guess}.  The @code{'guess} symbol, which
is the default, means that the image size will be inferred based on the
image content.

@item @code{operating-system}
The image's @code{operating-system} record that is instanciated.

@item @code{partition-table-type} (default: @code{'mbr})
The image partition table type as a symbol.  Possible values are @code{'mbr}
and @code{'gpt}.  It default to @code{'mbr}.

@item @code{partitions} (default: @code{'()})
The image partitions as a list of @code{partition} records (@pxref{partition Reference}).

@item @code{compression?} (default: @code{#true})
Whether the image content should be compressed, as a boolean.  It defaults
to @code{#true} and only applies to @code{'iso9660} image formats.

@item @code{volatile-root?} (default: @code{#true})
Whether the image root partition should be made volatile, as a boolean.

This is achieved by using a RAM backed file system (overlayfs) that is
mounted on top of the root partition by the initrd.  It defaults to
@code{#true}.  When set to @code{#false}, the image root partition is
mounted as read-write partition by the initrd.

@item @code{shared-store?} (default: @code{#false})
Whether the image's store should be shared with the host system, as a
boolean.  This can be useful when creating images dedicated to virtual
machines.  When set to @code{#false}, which is the default, the image's
@code{operating-system} closure is copied to the image.  Otherwise, when set
to @code{#true}, it is assumed that the host store will be made available at
boot, using a @code{9p} mount for instance.

@item @code{shared-network?} (default: @code{#false})
Whether to use the host network interfaces within the image, as a boolean.
This is only used for the @code{'docker} image format.  It defaults to
@code{#false}.

@item @code{substitutable?} (default: @code{#true})
Whether the image derivation should be substitutable, as a boolean.  It
defaults to @code{true}.

@end table
@end deftp

@node partition Reference
@subsection @code{partition} Reference

In @code{image} record may contain some partitions.

@deftp {Data Type} partition
This is the data type representing an image partition.

@table @asis
@item @code{size} (default: @code{'guess})
The partition size in bytes or @code{'guess}.  The @code{'guess} symbol,
which is the default, means that the partition size will be inferred based
on the partition content.

@item @code{offset} (default: @code{0})
The partition's start offset in bytes, relative to the image start or the
previous partition end.  It defaults to @code{0} which means that there is
no offset applied.

@item @code{file-system} (default: @code{"ext4"})
The partition file system as a string, defaulting to @code{"ext4"}.  The
supported values are @code{"vfat"}, @code{"fat16"}, @code{"fat32"} and
@code{"ext4"}.

@item @code{file-system-options} (default: @code{'()})
The partition file system creation options that should be passed to the
partition creation tool, as a list of strings.  This is only supported when
creating @code{"ext4"} partitions.

See the @code{"extended-options"} man page section of the @code{"mke2fs"}
tool for a more complete reference.

@item @code{label}
The partition label as a mandatory string, @code{"my-root"} for instance.

@item @code{uuid} (default: @code{#false})
The partition UUID as an @code{uuid} record (@pxref{Sistemas de archivos}).  By
default it is @code{#false}, which means that the partition creation tool
will attribute a random UUID to the partition.

@item @code{flags} (predeterminadas: @code{'()})
The partition flags as a list of symbols.  Possible values are @code{'boot}
and @code{'esp}.  The @code{'boot} flags should be set if you want to boot
from this partition.  Exactly one partition should have this flag set,
usually the root one. The @code{'esp} flag identifies a UEFI System
Partition.

@item @code{initializer} (default: @code{#false})
The partition initializer procedure as a gexp.  This procedure is called to
populate a partition.  If no initializer is passed, the
@code{initialize-root-partition} procedure from the @code{(gnu build image)}
module is used.

@end table
@end deftp

@node Instantiate an Image
@section Instantiate an Image

Let's say you would like to create an MBR image with three distinct
partitions:

@itemize
@item The @acronym{ESP, EFI System Partition}, a partition of
40@tie{}MiB at offset 1024@tie{}KiB with a vfat file system.

@item an ext4 partition of 50@tie{}MiB data file, and labeled ``data''.

@item an ext4 bootable partition containing the @code{%simple-os}
operating-system.
@end itemize

You would then write the following image definition in a @code{my-image.scm}
file for instance.

@lisp
(use-modules (gnu)
             (gnu image)
             (gnu tests)
             (gnu system image)
             (guix gexp))

(define MiB (expt 2 20))

(image
 (format 'disk-image)
 (operating-system %simple-os)
 (partitions
  (list
   (partition
    (size (* 40 MiB))
    (offset (* 1024 1024))
    (label "GNU-ESP")
    (file-system "vfat")
    (flags '(esp))
    (initializer (gexp initialize-efi-partition)))
   (partition
    (size (* 50 MiB))
    (label "DATA")
    (file-system "ext4")
    (initializer #~(lambda* (root . rest)
                     (mkdir root)
                     (call-with-output-file
                         (string-append root "/data")
                       (lambda (port)
                         (format port "my-data"))))))
   (partition
    (size 'guess)
    (label root-label)
    (file-system "ext4")
    (flags '(boot))
    (initializer (gexp initialize-root-partition))))))
@end lisp

Note that the first and third partitions use generic initializers
procedures, initialize-efi-partition and initialize-root-partition
respectively.  The initialize-efi-partition installs a GRUB EFI loader that
is loading the GRUB bootloader located in the root partition.  The
initialize-root-partition instantiates a complete system as defined by the
@code{%simple-os} operating-system.

You can now run:

@example
guix system image my-image.scm
@end example

to instantiate the @code{image} definition.  That produces a disk image
which has the expected structure:

@example
$ parted $(guix system image my-image.scm) print
@dots{}
Model:  (file)
Disk /gnu/store/yhylv1bp5b2ypb97pd3bbhz6jk5nbhxw-disk-image: 1714MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  43.0MB  41.9MB  primary  fat16        esp
 2      43.0MB  95.4MB  52.4MB  primary  ext4
 3      95.4MB  1714MB  1619MB  primary  ext4         boot
@end example

The size of the @code{boot} partition has been inferred to @code{1619MB} so
that it is large enough to host the @code{%simple-os} operating-system.

You can also use existing @code{image} record definitions and inherit from
them to simplify the @code{image} definition.  The @code{(gnu system image)}
module provides the following @code{image} definition variables.

@defvr {Scheme Variable} efi-disk-image
A MBR disk-image composed of two partitions: a 64 bits ESP partition and a
ROOT boot partition.  This image can be used on most @code{x86_64} and
@code{i686} machines, supporting BIOS or UEFI booting.
@end defvr

@defvr {Scheme Variable} efi32-disk-image
Same as @code{efi-disk-image} but with a 32 bits EFI partition.
@end defvr

@defvr {Scheme Variable} iso9660-image
An ISO-9660 image composed of a single bootable partition.  This image can
also be used on most @code{x86_64} and @code{i686} machines.
@end defvr

@defvr {Scheme Variable} docker-image
A Docker image that can be used to spawn a Docker container.
@end defvr

Using the @code{efi-disk-image} we can simplify our previous @code{image}
declaration this way:

@lisp
(use-modules (gnu)
             (gnu image)
             (gnu tests)
             (gnu system image)
             (guix gexp)
             (ice-9 match))

(define MiB (expt 2 20))

(define data
  (partition
   (size (* 50 MiB))
   (label "DATA")
   (file-system "ext4")
   (initializer #~(lambda* (root . rest)
                    (mkdir root)
                    (call-with-output-file
                        (string-append root "/data")
                      (lambda (port)
                        (format port "my-data")))))))

(image
 (inherit efi-disk-image)
 (operating-system %simple-os)
 (partitions
  (match (image-partitions efi-disk-image)
    ((esp root)
     (list esp data root)))))
@end lisp

This will give the exact same @code{image} instantiation but the
@code{image} declaration is simpler.

@node image-type Reference
@section image-type Reference

The @command{guix system image} command can, as we saw above, take a file
containing an @code{image} declaration as argument and produce an actual
disk image from it.  The same command can also handle a file containing an
@code{operating-system} declaration as argument.  In that case, how is the
@code{operating-system} turned into an image?

That's where the @code{image-type} record intervenes.  This record defines
how to transform an @code{operating-system} record into an @code{image}
record.

@deftp {Data Type} image-type
This is the data type representing an image-type.

@table @asis
@item @code{name}
The image-type name as a mandatory symbol, @code{'efi32-raw} for instance.

@item @code{constructor}
The image-type constructor, as a mandatory procedure that takes an
@code{operating-system} record as argument and returns an @code{image}
record.

@end table
@end deftp

There are several @code{image-type} records provided by the @code{(gnu
system image)} and the @code{(gnu system images @dots{})} modules.

@defvr {Scheme Variable} efi-raw-image-type
Build an image based on the @code{efi-disk-image} image.
@end defvr

@defvr {Scheme Variable} efi32-raw-image-type
Build an image based on the @code{efi32-disk-image} image.
@end defvr

@defvr {Scheme Variable} qcow2-image-type
Build an image based on the @code{efi-disk-image} image but with the
@code{compressed-qcow2} image format.
@end defvr

@defvr {Scheme Variable} iso-image-type
Build a compressed image based on the @code{iso9660-image} image.
@end defvr

@defvr {Scheme Variable} uncompressed-iso-image-type
Build an image based on the @code{iso9660-image} image but with the
@code{compression?} field set to @code{#false}.
@end defvr

@defvr {Scheme Variable} docker-image-type
Build an image based on the @code{docker-image} image.
@end defvr

@defvr {Scheme Variable} raw-with-offset-image-type
Build an MBR image with a single partition starting at a @code{1024KiB}
offset.  This is useful to leave some room to install a bootloader in the
post-MBR gap.
@end defvr

@defvr {Scheme Variable} pinebook-pro-image-type
Build an image that is targeting the Pinebook Pro machine.  The MBR image
contains a single partition starting at a @code{9MiB} offset.  The
@code{u-boot-pinebook-pro-rk3399-bootloader} bootloader will be installed in
this gap.
@end defvr

@defvr {Scheme Variable} rock64-image-type
Build an image that is targeting the Rock64 machine.  The MBR image contains
a single partition starting at a @code{16MiB} offset.  The
@code{u-boot-rock64-rk3328-bootloader} bootloader will be installed in this
gap.
@end defvr

@defvr {Scheme Variable} novena-image-type
Build an image that is targeting the Novena machine.  It has the same
characteristics as @code{raw-with-offset-image-type}.
@end defvr

@defvr {Scheme Variable} pine64-image-type
Build an image that is targeting the Pine64 machine.  It has the same
characteristics as @code{raw-with-offset-image-type}.
@end defvr

@defvr {Scheme Variable} hurd-image-type
Build an image that is targeting a @code{i386} machine running the Hurd
kernel.  The MBR image contains a single ext2 partitions with specific
@code{file-system-options} flags.
@end defvr

@defvr {Scheme Variable} hurd-qcow2-image-type
Build an image similar to the one built by the @code{hurd-image-type} but
with the @code{format} set to @code{'compressed-qcow2}.
@end defvr

@defvr {Scheme Variable} wsl2-image-type
Build an image for the @acronym{WSL2, Windows Subsystem for Linux 2}.  It
can be imported by running:

@example
wsl --import Guix ./guix ./wsl2-image.tar.gz
wsl -d Guix
@end example

@end defvr

So, if we get back to the @code{guix system image} command taking an
@code{operating-system} declaration as argument.  By default, the
@code{efi-raw-image-type} is used to turn the provided
@code{operating-system} into an actual bootable image.

To use a different @code{image-type}, the @code{--image-type} option can be
used.  The @code{--list-image-types} option will list all the supported
image types.  It turns out to be a textual listing of all the
@code{image-types} variables described just above (@pxref{Invocación de guix system}).

@node Image Modules
@section Image Modules

Let's take the example of the Pine64, an ARM based machine.  To be able to
produce an image targeting this board, we need the following elements:

@itemize
@item An @code{operating-system} record containing at least
an appropriate kernel (@code{linux-libre-arm64-generic}) and bootloader
@code{u-boot-pine64-lts-bootloader}) for the Pine64.

@item Possibly, an @code{image-type} record providing a way to
turn an @code{operating-system} record to an @code{image} record suitable
for the Pine64.

@item An actual @code{image} that can be instantiated with the
@command{guix system image} command.

@end itemize

The @code{(gnu system images pine64)} module provides all those elements:
@code{pine64-barebones-os}, @code{pine64-image-type} and
@code{pine64-barebones-raw-image} respectively.

The module returns the @code{pine64-barebones-raw-image} in order for users
to be able to run:

@example
guix system image gnu/system/images/pine64.scm
@end example

Now, thanks to the @code{pine64-image-type} record declaring the
@code{'pine64-raw} @code{image-type}, one could also prepare a
@code{my-pine.scm} file with the following content:

@lisp
(use-modules (gnu system images pine64))
(operating-system
  (inherit pine64-barebones-os)
  (timezone "Europe/Athens"))
@end lisp

to customize the @code{pine64-barebones-os}, and run:

@example
$ guix system image --image-type=pine64-raw my-pine.scm
@end example

Note that there are other modules in the @code{gnu/system/images} directory
targeting @code{Novena}, @code{Pine64}, @code{PinebookPro} and @code{Rock64}
machines.

@node Instalación de archivos de depuración
@chapter Instalación de archivos de depuración

@cindex archivos de depuración
Los programas binarios, como los producidos por los compiladores GCC por
ejemplo, se escriben típicamente en el formato ELF, con una sección que
contiene @dfn{información de depuración}. La información de depuración es lo
que permite que el depurador, GDB, asocie código binario a código fuente; es
necesaria para depurar un programa compilado en condiciones adecuadas.

Este capítulo explica cómo usar la información de depuración separada cuando
los paquetes la proporcionan, y cómo reconstruir paquetes con información de
depuración cuando esta falte.

@menu
* Información separada para depuración::  Instalación de las salidas 
                                              'debug'.
* Reconstrucción de la información para depuración::  Construir la 
                                                           información de 
                                                           depuración 
                                                           necesaria.
@end menu

@node Información separada para depuración
@section Información separada para depuración

The problem with debugging information is that is takes up a fair amount of
disk space.  For example, debugging information for the GNU C Library weighs
in at more than 60 MiB@.  Thus, as a user, keeping all the debugging info of
all the installed programs is usually not an option.  Yet, space savings
should not come at the cost of an impediment to debugging---especially in
the GNU system, which should make it easier for users to exert their
computing freedom (@pxref{Distribución GNU}).

Afortunadamente, las utilidades binarias GNU (Binutils) y GDB proporcionan
un mecanismo que permite a las usuarias obtener lo mejor de ambos mundos: la
información de depuración puede extraerse de los binarios y almacenarse en
archivos separados. GDB es capaz entonces de cargar la información de
depuración desde esos archivos, cuando estén disponibles (@pxref{Separate Debug Files,,, gdb, Debugging with GDB}).

La distribución GNU toma ventaja de este hecho almacenando la información de
depuración en el subdirectorio @code{lib/debug} de una salida separada del
paquete llamada @code{debug} (@pxref{Paquetes con múltiples salidas}). Las
usuarias pueden elegir si instalan la salida @code{debug} de un paquete
cuando la necesitan. Por ejemplo, la siguiente orden instala la información
de depuración para la biblioteca C de GNU y para GNU Guile.

@example
guix install glibc:debug guile:debug
@end example

Se debe decir entonces a GDB que busque los archivos de depuración en el
perfil de la usuaria, proporcionando un valor a la variable
@code{debug-file-directory} (considere hacerlo en el archivo
@file{~/.gdbinit}, @pxref{Startup,,, gdb, Debugging with GDB}):

@example
(gdb) set debug-file-directory ~/.guix-profile/lib/debug
@end example

A partir de ese momento GDB obtendrá la información de depuración de los
archivos @file{.debug} dentro de la carpeta
@file{~/.guix-profile/lib/debug}.

Below is an alternative GDB script which is useful when working with other
profiles.  It takes advantage of the optional Guile integration in GDB.
This snippet is included by default on Guix System in the @file{~/.gdbinit}
file.

@example
guile
(use-modules (gdb))
(execute (string-append "set debug-file-directory "
                        (or (getenv "GDB_DEBUG_FILE_DIRECTORY")
                            "~/.guix-profile/lib/debug")))
end
@end example

Además, probablemente desee que GDB sea capaz de mostrar el código fuente
que está depurando. Para hacerlo, tiene que desempaquetar el código fuente
del paquete de su interés (obtenido con @code{guix build --source},
@pxref{Invocación de guix build}) e indicar a GDB cual es el directorio de
fuentes mediante el uso de la orden @code{directory} (@pxref{Source Path,
@code{directory},, gdb, Debugging with GDB}).

@c XXX: keep me up-to-date
El mecanismo de la salida @code{debug} en Guix se implementa por el sistema
de construcción @code{gnu-build-system} (@pxref{Sistemas de construcción}). Ahora mismo
necesita una activación explícita---la información de depuración está
disponible únicamente para paquetes con definiciones que declaren
explícitamente una salida @code{debug}. Para comprobar si un paquete tiene
una salida @code{debug}, use @command{guix package --list-available}
(@pxref{Invocación de guix package}).

Siga leyendo para ver cómo tratar con paquetes que carezcan de la salida
@code{debug}.

@node Reconstrucción de la información para depuración
@section Reconstrucción de la información para depuración

@cindex información de depuración, reconstrucción
Como vimos anteriormente, algunos paquetes, pero no todos, proporcionan
información de depuración en una salida llamada @code{debug}. ¿Qué puede
hacer cuando dicha información de depuración no está disponible? La opción
@option{--with-debug-info} proporciona una solución para ello: le permite
reconstruir uno o más paquetes para los que la información de depuración no
esté disponible---y únicamente esos---e injertarlos en la aplicación que
esté depurando. Por lo tanto, aunque no es tan rápido como instalar una
salida @code{debug}, no tiene un coste elevado.

Vamos a ilustrarlo con un ejemplo. Supongamos que está sufriendo un error en
Inkscape y desearía que está pasando en GLib, una biblioteca que se
encuentra enraizada profundamente en su grafo de dependencias. Además GLib
no tiene una salida @code{debug} y la pila de llamadas que GDB muestra es
completamente deprimente:

@example
(gdb) bt
#0  0x00007ffff5f92190 in g_getenv ()
   from /gnu/store/@dots{}-glib-2.62.6/lib/libglib-2.0.so.0
#1  0x00007ffff608a7d6 in gobject_init_ctor ()
   from /gnu/store/@dots{}-glib-2.62.6/lib/libgobject-2.0.so.0
#2  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=1, argv=argv@@entry=0x7fffffffcfd8, 
    env=env@@entry=0x7fffffffcfe8) at dl-init.c:72
#3  0x00007ffff7fe2866 in call_init (env=0x7fffffffcfe8, argv=0x7fffffffcfd8, argc=1, l=<optimized out>)
    at dl-init.c:118
@end example

Para hacer frente a esta situación debe instalar Inkscape enlazado con una
variante de GLib que contenga información de depuración:

@example
guix install inkscape --with-debug-info=glib
@end example

Esta vez la depuración será mucho más agradable:

@example
$ gdb --args sh -c 'exec inkscape'
@dots{}
(gdb) b g_getenv
Function "g_getenv" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (g_getenv) pending.
(gdb) r
Starting program: /gnu/store/@dots{}-profile/bin/sh -c exec\ inkscape
@dots{}
(gdb) bt
#0  g_getenv (variable=variable@@entry=0x7ffff60c7a2e "GOBJECT_DEBUG") at ../glib-2.62.6/glib/genviron.c:252
#1  0x00007ffff608a7d6 in gobject_init () at ../glib-2.62.6/gobject/gtype.c:4380
#2  gobject_init_ctor () at ../glib-2.62.6/gobject/gtype.c:4493
#3  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=3, argv=argv@@entry=0x7fffffffd088, 
    env=env@@entry=0x7fffffffd0a8) at dl-init.c:72
@dots{}
@end example

¡Así mejor!

Tenga en cuenta que puede haber paquetes en los que la opción
@option{--with-debug-info} no tenga el efecto deseado. @xref{Opciones de transformación de paquetes, @option{--with-debug-info}} para obtener más
información.

@node Using TeX and LaTeX
@chapter Using @TeX{} and @LaTeX{}

@cindex @TeX{} packages
@cindex @LaTeX{} packages
Guix provides packages for the @TeX{}, @LaTeX{}, ConTeXt, LuaTeX, and
related typesetting systems, taken from the
@uref{https://www.tug.org/texlive/, @TeX{} Live distribution}.  However,
because @TeX{} Live is so huge and because finding your way in this maze is
tricky, we thought that you, dear user, would welcome guidance on how to
deploy the relevant packages so you can compile your @TeX{} and @LaTeX{}
documents.

@TeX{} Live currently comes in two flavors in Guix:

@itemize
@item
The ``monolithic'' @code{texlive} package: it comes with @emph{every single
@TeX{} Live package} (more than 7,000 of them), but it is huge (more than
4@tie{}GiB for a single package!).

@item
The ``modular'' @code{texlive-} packages: you install @code{texlive-base},
which provides core functionality and the main
commands---@command{pdflatex}, @command{dvips}, @command{luatex},
@command{mf}, etc.---together with individual packages that provide just the
features you need---@code{texlive-listings} for the @code{listings} package,
@code{texlive-hyperref} for @code{hyperref}, @code{texlive-beamer} for
Beamer, @code{texlive-pgf} for PGF/TikZ, and so on.
@end itemize

We recommend using the modular package set because it is much less
resource-hungry.  To build your documents, you would use commands such as:

@example
guix shell texlive-base texlive-wrapfig \
  texlive-hyperref texlive-cm-super -- pdflatex doc.tex
@end example

You can quickly end up with unreasonably long command lines though.  The
solution is to instead write a manifest, for example like this one:

@lisp
(specifications->manifest
 '("rubber"

   "texlive-base"
   "texlive-wrapfig"

   "texlive-microtype"
   "texlive-listings" "texlive-hyperref"

   ;; PGF/TikZ
   "texlive-pgf"

   ;; Additional fonts.
   "texlive-cm-super" "texlive-amsfonts"
   "texlive-times" "texlive-helvetic" "texlive-courier"))
@end lisp

You can then pass it to any command with the @option{-m} option:

@example
guix shell -m manifest.scm -- pdflatex doc.tex
@end example

@xref{Writing Manifests}, for more on manifests.  In the future, we plan to
provide packages for @TeX{} Live @dfn{collections}---``meta-packages'' such
as @code{fontsrecommended}, @code{humanities}, or @code{langarabic} that
provide the set of packages needed in this particular domain.  That will
allow you to list fewer packages.

The main difficulty here is that using the modular package set forces you to
select precisely the packages that you need.  You can use @command{guix
search}, but finding the right package can prove to be tedious.  When a
package is missing, @command{pdflatex} and similar commands fail with an
obscure message along the lines of:

@example
doc.tex: File `tikz.sty' not found.
doc.tex:7: Emergency stop.
@end example

@noindent
or, for a missing font:

@example
kpathsea: Running mktexmf phvr7t
! I can't find file `phvr7t'.
@end example

How do you determine what the missing package is? In the first case, you'll
find the answer by running:

@example
$ guix search texlive tikz
name: texlive-pgf
version: 59745
@dots{}
@end example

In the second case, @command{guix search} turns up nothing.  Instead, you
can search the @TeX{} Live package database using the @command{tlmgr}
command:

@example
$ guix shell texlive-base -- tlmgr info phvr7t
tlmgr: cannot find package phvr7t, searching for other matches:

Packages containing `phvr7t' in their title/description:

Packages containing files matching `phvr7t':
helvetic:
        texmf-dist/fonts/tfm/adobe/helvetic/phvr7t.tfm
        texmf-dist/fonts/tfm/adobe/helvetic/phvr7tn.tfm
        texmf-dist/fonts/vf/adobe/helvetic/phvr7t.vf
        texmf-dist/fonts/vf/adobe/helvetic/phvr7tn.vf
tex4ht:
        texmf-dist/tex4ht/ht-fonts/alias/adobe/helvetic/phvr7t.htf
@end example

The file is available in the @TeX{} Live @code{helvetic} package, which is
known in Guix as @code{texlive-helvetic}.  Quite a ride, but we found it!

There is one important limitation though: Guix currently provides a subset
of the @TeX{} Live packages.  If you stumble upon a missing package, you can
try and import it (@pxref{Invocación de guix import}):

@example
guix import texlive @var{package}
@end example

La opciones adicionales incluyen:

@table @code
@item --recursive
@itemx -r
Recorre el grafo de dependencias del paquete original proporcionado
recursivamente y genera expresiones de paquete para todos aquellos paquetes
que no estén todavía en Guix.
@end table

@quotation Nota
@TeX{} Live packaging is still very much work in progress, but you can help!
@xref{Contribuir}, for more information.
@end quotation

@node Actualizaciones de seguridad
@chapter Actualizaciones de seguridad

@cindex actualizaciones de seguridad
@cindex vulnerabilidades de seguridad
De manera ocasional, vulnerabilidades importantes de seguridad se descubren
en los paquetes de software y deben aplicarse parches. Las desarrolladoras
de Guix tratan de seguir las vulnerabilidades conocidas y aplicar parches
tan pronto como sea posible en la rama @code{master} de Guix (todavía no
proporcionamos una rama ``estable'' que contenga únicamente actualizaciones
de seguridad). La herramienta @command{guix lint} ayuda a las
desarrolladoras a encontrar versiones vulnerables de paquetes de software en
la distribución:

@smallexample
$ guix lint -c cve
gnu/packages/base.scm:652:2: glibc@@2.21: probablemente vulnerable a CVE-2015-1781, CVE-2015-7547
gnu/packages/gcc.scm:334:2: gcc@@4.9.3: probablemente vulnerable a CVE-2015-5276
gnu/packages/image.scm:312:2: openjpeg@@2.1.0: probablemente vulnerable a CVE-2016-1923, CVE-2016-1924
@dots{}
@end smallexample

@xref{Invocación de guix lint}, para más información.

Guix sigue una disciplina funcional de gestión de paquetes
(@pxref{Introducción}), lo que implica que, cuando se cambia un paquete,
@emph{todos los paquetes que dependen de él} deben ser reconstruidos. Esto
puede ralentizar de manera significativa el despliegue de correcciones en
paquetes básicos como libc o Bash, ya que básicamente la distribución al
completo debe reconstruirse. El uso de binarios preconstruidos ayuda
(@pxref{Sustituciones}), pero el despliegue aún puede tomar más tiempo del
deseado.

@cindex injertos (grafts en inglés)
Para afrontar esto, Guix implementa @dfn{injertos}, un mecanismo que permite
un rápido despliegue de actualizaciones críticas sin los costes asociados
con una reconstrucción completa de la distribución. La idea es reconstruir
únicamente el paquete que hace falta parchear, y entonces ``injertarlo'' en
los paquetes explícitamente instalados por la usuaria y que previamente
hacían referencia al paquete original. El coste de realizar un injerto es
menor que una reconstrucción completa de la cadena de dependencias.

@cindex reemplazos de paquetes, para injertos
Por ejemplo, supongamos que es necesario incorporar una actualización de
seguridad en Bash. Las desarrolladoras de Guix proporcionarán una definición
de paquete para la versión ``corregida'' de Bash, digamos @code{bash-fixed},
de la manera habitual (@pxref{Definición de paquetes}). Una vez hecho, la
definición original del paquete es aumentada con un campo @code{replacement}
que apunta al paquete que contiene la corrección del error:

@lisp
(define bash
  (package
    (name "bash")
    ;; @dots{}
    (replacement bash-fixed)))
@end lisp

De ahí en adelante, cualquier paquete que dependa directa o indirectamente
de Bash---como informa de ello @command{guix gc --requisites}
(@pxref{Invocación de guix gc})---que se instale se ``reescribe'' automáticamente
para hacer referencia a @code{bash-fixed} en vez de @code{bash}. Este
proceso de injerto toma un tiempo proporcional al tamaño del paquete,
normalmente menos de un minuto para un paquete ``medio'' en una máquina
reciente. El injertado es recursivo: cuando una dependencia indirecta
requiere un injerto, el injerto se ``propagará'' hasta el paquete que la
usuaria esté instalando.

Actualmente, la longitud del nombre y la versión del injerto y aquella del
paquete que reemplaza (@var{bash-fixed} y @var{bash} en el ejemplo previo)
debe ser igual. Esta restricción viene principalmente del hecho de que el
injertado funciona mediante la aplicación de parches en archivos, incluyendo
archivos binarios, directamente. Otras restricciones pueden ser aplicables:
por ejemplo, durante la adición de un injerto a un paquete que proporciona
una biblioteca compartida, la biblioteca compartida y su reemplazo deben
tener el mismo @code{SONAME} y deben ser compatibles a nivel binario.

La opción de línea de órdenes @option{--no-grafts} le permite anular
voluntariamente el proceso de injerto (@pxref{Opciones comunes de construcción,
@option{--no-grafts}}). Por tanto, la orden:

@example
guix build bash --no-grafts
@end example

@noindent
devuelve el nombre de archivo del almacén de la versión original de Bash,
mientras que:

@example
guix build bash
@end example

@noindent
devuelve el nombre de archivo del almacén de la versión ``corregida'',
reemplazo de Bash. Esto le permite distinguir entre las dos variantes de
Bash.

Para verificar a qué Bash hace referencia su perfil al completo, puede
ejecutar (@pxref{Invocación de guix gc}):

@example
guix gc -R $(readlink -f ~/.guix-profile) | grep bash
@end example

@noindent
@dots{} y compare los nombres de archivo del almacén que obtendrá con los
ejemplos previos. Del mismo modo, para una generación completa del sistema
Guix:

@example
guix gc -R $(guix system build my-config.scm) | grep bash
@end example

Por último, para comprobar qué versión de Bash están usando los procesos en
ejecución, puede usar la orden @command{lsof}:

@example
lsof | grep /gnu/store/.*bash
@end example


@node Lanzamiento inicial
@chapter Lanzamiento inicial

@c Adapted from the ELS 2013 paper.

@cindex lanzamiento inicial

Bootstrapping in our context refers to how the distribution gets built
``from nothing''.  Remember that the build environment of a derivation
contains nothing but its declared inputs (@pxref{Introducción}).  So there's
an obvious chicken-and-egg problem: how does the first package get built?
How does the first compiler get compiled?

It is tempting to think of this question as one that only die-hard hackers
may care about.  However, while the answer to that question is technical in
nature, its implications are wide-ranging.  How the distribution is
bootstrapped defines the extent to which we, as individuals and as a
collective of users and hackers, can trust the software we run.  It is a
central concern from the standpoint of @emph{security} and from a @emph{user
freedom} viewpoint.

@cindex binarios del lanzamiento inicial
El sistema GNU está compuesto principalmente de código C, con libc en su
base. El sistema de construcción GNU en sí asume la disponibilidad del shell
Bourne y las herramientas de línea de órdenes proporcionadas por GNU
Coreutils, Awk, Findutils, `sed' y `grep'. Además, los programas de
construcción---programas que ejecutan @code{./configure}, @code{make},
etc.---están escritos en Scheme Guile
(@pxref{Derivaciones}). Consecuentemente, para ser capaz de construir
cualquier cosa, desde cero, Guix depende en binarios preconstruidos de
Guile, GCC, Binutils, libc y otros paquetes mencionados anteriormente---los
@dfn{binarios del lanzamiento inicial}.

Estos binarios del lanzamiento inicial se ``dan por supuestos'', aunque se
pueden volver a crear en caso de ser necesario (@pxref{Preparación para usar los binarios del lanzamiento inicial}).

@menu
* Lanzamiento inicial a partir de la semilla binaria reducida::  Un 
                                                                   lanzamiento 
                                                                   inicial a 
                                                                   la altura 
                                                                   de GNU.
* Preparación para usar los binarios del lanzamiento inicial::  Construcción 
                                                                   de lo que 
                                                                   más 
                                                                   importa.
@end menu

@node Lanzamiento inicial a partir de la semilla binaria reducida
@section El lanzamiento inicial a partir de la semilla binaria reducida

Guix---al igual que otras distribuciones de GNU/Linux---se lanza
inicialmente desde un conjunto de binarios de manera tradicional: un shell
Bourne, herramientas de línea de órdenes que proporcionan GNU Coreutils,
Awk, Findutils, `sed' y `grep' y Guile, GCC, Binutils y la biblioteca de C
de GNU (@pxref{Lanzamiento inicial}). Habitualmente dichos binarios se ``dan por
hecho''. 

El dar por hecho estos binarios significa que consideramos que son una
``semilla'' correcta y fiable para la construcción del sistema completo. En
esta asunción yace un problema: el tamaño combinado de dichos binarios
necesarios para el lanzamiento inicial es de alrededor de 250MB
(@pxref{Bootstrappable Builds,,, mes, GNU Mes}). Auditar o incluso la
inspeccionar de dichos binarios es prácticamente imposible.

En @code{i686-linux} y @code{x86_64-linux}, Guix basa su lanzamiento inicial
en una ``semilla binaria reducida''@footnote{Nos gustaría decir:
``lanzamiento inicial completamente desde las fuentes'' pero, aunque estamos
trabajando por alcanzar ese objetivo, sería una hipérbole usar dicho término
para describir el proceso que seguimos en la actualidad.}.

El lanzamiento inicial basado en la semilla binaria reducida elimina las
herramientas más críticas---desde una perspectiva de confianza---de los
binarios del lanzamiento inicial: GCC, Binutils y la biblioteca de C de GNU
se sustituyen por: @code{bootstrap-mescc-tools} (un pequeño ensamblador y
enlazador) y @code{bootstrap-mes} (un pequeño intérprete de Scheme, un
compilador de C escrito en Scheme y la biblioteca de C de Mes, construida
para TinyCC y para GCC).

Mediante el uso de estas nuevas semillas binarias, los paquetes Binutils,
GCC, y la biblioteca de C de GNU ``que faltan'' se construyen desde las
fuentes. De aquí en adelante se prosigue con el proceso del lanzamiento
inicial más tradicional. Esta aproximación redujo el tamaño de los binarios
del lanzamiento inicial a cerca de 145MB en la versión 1.1 de Guix.

El siguiente paso que Guix ha tomado es sustituir el intérprete de órdenes y
sus utilidades con implementaciones en el dialecto Guile de Scheme, el
@emph{lanzamiento inicial basado únicamente en Scheme}.  Gash
(@pxref{Gash,,, gash, The Gash manual}) es un intérprete de órdenes
compatible con POSIX que sustituye a Bash, y viene con Gash Utils que
contiene reemplazos minimalistas de Awk, las GNU Core Utilities, Grep, Gzip,
Sed y Tar. El resto de semillas binarias del lanzamiento inicial que se han
eliminado se construyen ahora desde las fuentes.

Building the GNU System from source is currently only possible by adding
some historical GNU packages as intermediate steps@footnote{Packages such as
@code{gcc-2.95.3}, @code{binutils-2.14}, @code{glibc-2.2.5},
@code{gzip-1.2.4}, @code{tar-1.22}, and some others.  For details, see
@file{gnu/packages/commencement.scm}.}.  As Gash and Gash Utils mature, and
GNU packages become more bootstrappable again (e.g., new releases of GNU Sed
will also ship as gzipped tarballs again, as alternative to the hard to
bootstrap @code{xz}-compression), this set of added packages can hopefully
be reduced again.

A continuación se encuentra el grafo de dependencias generado para
@code{gcc-core-mesboot0}, el compilador del lanzamiento inicial usado para
el lanzamiento inicial tradicional del resto del sistema Guix.

@c ./pre-inst-env guix graph -e '(@@ (gnu packages commencement) gcc-core-mesboot0)' | sed -re 's,((bootstrap-mescc-tools|bootstrap-mes|guile-bootstrap).*shape =) box,\1 ellipse,' > doc/images/gcc-core-mesboot0-graph.dot
@image{images/gcc-core-mesboot0-graph,6in,,Grafo de dependencias de
gcc-core-mesboot0}

The only significant binary bootstrap seeds that remain@footnote{ Ignoring
the 68KB @code{mescc-tools}; that will be removed later, together with
@code{mes}.} are a Scheme interpreter and a Scheme compiler: GNU Mes and GNU
Guile@footnote{Not shown in this graph are the static binaries for
@file{bash}, @code{tar}, and @code{xz} that are used to get Guile running.}.

Esta reducción adicional ha llevado el tamaño de la semilla de binarios
inicial a cerca de los 60MB para @code{i686-linux} y @code{x86_64-linux}.

Se está trabajando en eliminar todos los binarios de nuestra pila de
software libre del lanzamiento inicial, en pos de un lanzamiento inicial
basado completamente en fuentes. También se está trabajando en proporcionar
estos lanzamientos iniciales a las arquitecturas @code{arm-linux} y
@code{aarch64-linux} y a Hurd.

Si tiene interés, puede unirse a @samp{#bootstrappable} en la red de IRC de
Freenode o participar en las discusiones a través de
@email{bug-mes@@gnu.org} o @email{gash-devel@@nongnu.org}.

@node Preparación para usar los binarios del lanzamiento inicial
@section Preparación para usar los binarios del lanzamiento inicial

@c As of Emacs 24.3, Info-mode displays the image, but since it's a
@c large image, it's hard to scroll.  Oh well.
@image{images/bootstrap-graph,6in,,Grafo de dependencias de las derivaciones
del lanzamiento inicial temprano}

La figura previa muestra el auténtico inicio del grafo de dependencias de la
distribución, correspondiente a las definiciones de paquete del módulo
@code{(gnu packages bootstrap)}. Un gráfico similar puede generarse con
@command{guix graph} (@pxref{Invocación de guix graph}), más o menos así:

@example
guix graph -t derivation \
  -e '(@@@@ (gnu packages bootstrap) %bootstrap-gcc)' \
  | dot -Tps > gcc.ps
@end example

o, para la semilla binaria aún más reducida del lanzamiento inicial

@example
guix graph -t derivation \
  -e '(@@@@ (gnu packages bootstrap) %bootstrap-mes)' \
  | dot -Tps > mes.ps
@end example

En este nivel de detalle, las cosas son ligeramente complejas. Primero,
Guile en sí consiste en un ejecutable ELF, junto a muchas fuentes y archivos
compilados Scheme que se cargan dinámicamente durante la ejecución. Esto se
almacena en el archivador tar @file{guile-2.0.7.tar.xz} mostrado en este
grafo. Este archivador es parte de la distribución de ``fuentes'' de Guix, y
se inserta en el almacén con @code{add-to-store} (@pxref{El almacén}).

¿Pero cómo escribimos una derivación que extraiga este archivador y lo añada
al almacén? Para resolver este problema, la derivación
@code{guile-bootstrap-2.0.drv}---la primera en construirse---usa @code{bash}
como su constructor, que ejecuta @code{build-bootstrap-guile.sh}, que a su
vez llama a @code{tar} para extraer el archivador. Por tanto, @file{bash},
@file{tar}, @file{xz} y @file{mkdir} son binarios enlazados estáticamente,
también parte de la distribución de fuentes de Guix, cuyo único propósito es
permitir la extracción del archivador de Guile.

Una vez que@code{guile-bootstrap-2.0.drv} se ha construido, tenemos un Guile
funcional que se puede usar para ejecutar los programas de construcción
siguientes. Su primera tarea es descargar los archivadores qu contienen los
otros binarios preconstruidos---esto es lo que las derivaciones
@file{.tar.xz.drv} hacen. Módulos Guix como @code{ftp-client.scm} se usan
para este propósito. Las derivaciones @code{module-import.drv} importan esos
módulos en un directorio del almacén, manteniendo la distribución de
carpetas. Las derivaciones @code{module-import-compiled.drv} compilan esos
módulos, y los escriben en un directorio con la distribución de carpetas
correcta. Esto corresponde al parámetro @code{#:modules} de
@code{build-expression->derivation} (@pxref{Derivaciones}).

Finalmente, los archivadores tar son extraídos por las derivaciones
@code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv}, or
@code{bootstrap-mes-0.drv} y @code{bootstrap-mescc-tools-0.drv}, hasta el
punto en el que disponemos de una cadena de herramientas C funcional.

@unnumberedsec Construcción de las herramientas de construcción

El lanzamiento inicial está completo cuando tenemos una cadena de
herramientas completa que no depende en las herramientas preconstruidas del
lanzamiento inicial descritas previamente. Este requisito de no-dependencia
se verifica comprobando si los archivos de la cadena de herramientas final
contienen referencias a directorios de @file{/gnu/store} de las entradas del
lanzamiento. El proceso que lleva a esta cadena de herramientas ``final'' es
descrito por las definiciones de paquetes encontradas en el módulo
@code{(gnu packages commencement)}.

La orden @command{guix graph} nos permite ``distanciarnos'' en comparación
con el grafo previo, mirando al nivel de objetos de paquetes en vez de
derivaciones individuales---recuerde que un paquete puede traducirse en
varias derivaciones, típicamente una derivación para descargar sus fuentes,
una para construir los módulos Guile que necesita y uno para realmente
construir el paquete de las fuentes. La orden:

@example
guix graph -t bag \
  -e '(@@@@ (gnu packages commencement)
          glibc-final-with-bootstrap-bash)' | xdot -
@end example

@noindent
muestra el grafo de dependencias que lleva a la biblioteca C
``final''@footnote{Puede haberse dado cuenta de la etiqueta
@code{glibc-intermediate}, sugiriendo que no es @emph{completamente} final,
pero como es una buena aproximación, la consideraremos final.}, mostrado a
continuación.

@image{images/bootstrap-packages,6in,,Grafo de dependencias de los primeros
paquetes}

@c See <https://lists.gnu.org/archive/html/gnu-system-discuss/2012-10/msg00000.html>.
La primera herramienta que se construye con los binarios del lanzamiento
inicial es GNU@tie{}Make---marcado como @code{make-boot0} en el grafo---,
que es un pre-requisito para todos los paquetes siguientes. Una vez hecho se
construyen Findutils y Diffutils.

Después viene la primera fase de Binutils y GCC, construidas como
herramientas pseudo-cruzadas---es decir, con @option{--target} igual a
@option{--host}. Se usan para construir libc. Gracias a este truco de
compilación cruzada, se garantiza que esta libc no tendrá ninguna referencia
a la cadena de herramientas inicial.

Posteriormente se construyen las herramientas Binutils y GCC (no mostradas
previamente) finales. GCC usa @command{ld} de la construcción final de
Binutils y enlazan los programas contra la libc recién construía. Esta
cadena de herramientas se usa para construir otros paquetes usados por Guix
y el sistema de construcción GNU: Guile, Bash, Coreutils, etc.

¡Y voilà! En este punto tenemos un conjunto completo de herramientas de
construcción esperadas por el sistema de construcción GNU. Están en la
variable @code{%final-inputs} del módulo @code{(gnu packages commencement)},
y se usan implícitamente por cualquier paquete que use
@code{gnu-build-system} (@pxref{Sistemas de construcción, @code{gnu-build-system}}).


@unnumberedsec Construir los binarios de lanzamiento

@cindex binarios del lanzamiento inicial
Debido a que la cadena de herramientas final no depende de los binarios de
lanzamiento, estos rara vez necesitan ser actualizados. No obstante, es útil
tener una forma automatizada de producirlos en caso de que se dé una
actualización, y esto es lo que proporciona el módulo @code{(gnu packages
make-bootstrap)}.

La siguiente orden construye los archivadores que contienen los binarios de
lanzamiento (Binutils, GCC, glibc para el lanzamiento inicial tradicional y
linux-libre-headers, bootstrap-mescc-tools y bootstrap-mes para el
lanzamiento inicial basado en la semilla binaria reducida, y Guile y un
archivador que contiene una mezcla de Coreutils y otras herramientas básicas
de línea de órdenes):

@example
guix build bootstrap-tarballs
@end example

Los archivadores ``tar'' generados son aquellos a cuya referencia debe
encontrarse en el módulo @code{(gnu packages bootstrap)} mencionado al
inicio de esta sección.

¿Todavía aquí? Entonces quizá se habrá empezado a preguntar: ¿cuándo
llegamos a un punto fijo? ¡Esa es una pregunta interesante! La respuesta es
desconocida, pero si pudiese investigar más a fondo (y tiene unos recursos
computacionales y de almacenamiento significativos para hacerlo) háganoslo
saber.

@unnumberedsec Reducción del conjunto de binarios de lanzamiento

Nuestros binarios de lanzamiento actualmente incluyen GCC, GNU Libc, Guile,
etc. ¡Eso es mucho código binario! ¿Por qué es eso un problema? Es un
problema porque esos grandes fragmentos de código binario no son auditables
en la práctica, lo que hace difícil establecer qué código fuente los
produjo. Cada binario no-auditable también nos deja vulnerables a puertas
traseras en los compiladores, como describió Ken Thompson en su publicación
de 1984 @emph{Reflections on Trusting Trust}.

Esto se mitiga por el hecho de que nuestros binarios de lanzamiento fueron
generados por una revisión anterior de Guix. No obstante, esto no posee el
nivel de transparencia que obtenemos en el resto del grado de dependencias
de los paquetes, donde Guix siempre nos da una asociación de
fuente-a-binario. Por lo tanto, nuestro objetivo es reducir el conjunto de
binarios de lanzamiento al mínimo posible.

El @uref{https://bootstrappable.org, sitio web Bootstrappable.org} enumera
proyectos en activo realizándolo. Uno de ellos está a punto de sustituir el
GCC de lanzamiento con una secuencia de ensambladores, interpretes y
compiladores de complejidad incremental, que pueden ser construidos desde
las fuentes empezando con un código ensamblador simple y auditable.

Nuestro primer logro de importancia es la sustitución de GCC, la biblioteca
de C de GNU y Binutils por MesCC-Tools (un enlazador hexadecimal y un
macro-ensamblador) y Mes (@pxref{Top, GNU Mes Reference Manual,, mes, GNU
Mes}, un intérprete de Scheme y compilador de C en Scheme). Ni MesCC-Tools
ni Mes pueden lanzarse inicialmente a sí mismas completamente todavía y por
lo tanto se inyectan como semillas binarias. A esto es lo que llamamos la
semilla binaria reducida del lanzamiento inicial, ¡ya que ha reducido a la
mitad el tamaño de nuestros binarios del lanzamiento inicial! También ha
eliminado el binario del compilador de C; los paquetes de Guix en i686-linux
y x86_64-linux se generan a partir de un lanzamiento inicial sin ningún
binario que sea un compilador de C.

Se está trabajando en hacer que MesCC-Tools y Mes puedan lanzarse
inicialmente de manera completa, y también se buscan otros binarios para el
lanzamiento inicial. ¡Su ayuda es bienvenida!

@node Transportar
@chapter Transportar a una nueva plataforma

Como se explicó previamente, la distribución GNU es autocontenida, lo cual
se consigue dependiendo de unos ``binarios del lanzamiento inicial''
preconstruidos (@pxref{Lanzamiento inicial}). Estos binarios son específicos para
un núcleo del sistema operativo, arquitectura de la CPU e interfaz binaria
de aplicaciones (ABI). Por tanto, para transportar la distribución a una
nueva plataforma que no está soportada todavía, se deben construir estos
binarios del lanzamiento inicial, y actualizar el módulo @code{(gnu packages
bootstrap)} para usarlos en dicha plataforma.

Por suerte, Guix puede @emph{compilar de forma cruzada} esos binarios del
lanzamiento inicial. Cuando todo va bien, y asumiendo que la cadena de
herramientas GNU soporta para la plataforma deseada, esto puede ser tan
simple como ejecutar una orden así:

@example
guix build --target=armv5tel-linux-gnueabi bootstrap-tarballs
@end example

For this to work, it is first required to register a new platform as defined
in the @code{(guix platform)} module.  A platform is making the connection
between a GNU triplet (@pxref{Specifying Target Triplets, GNU configuration
triplets,, autoconf, Autoconf}), the equivalent @var{system} in Nix
notation, the name of the @var{glibc-dynamic-linker}, and the corresponding
Linux architecture name if applicable (@pxref{Platforms}).

Once the bootstrap tarball are built, the @code{(gnu packages bootstrap)}
module needs to be updated to refer to these binaries on the target
platform.  That is, the hashes and URLs of the bootstrap tarballs for the
new platform must be added alongside those of the currently supported
platforms.  The bootstrap Guile tarball is treated specially: it is expected
to be available locally, and @file{gnu/local.mk} has rules to download it
for the supported architectures; a rule for the new platform must be added
as well.

En la práctica puede haber algunas complicaciones. Primero, puede ser que la
tripleta extendida GNU que especifica un ABI (como el sufijo @code{eabi}
previamente) no es reconocida por todas las herramientas GNU. Típicamente,
glibc reconoce algunas de ellas, mientras que GCC usa una opción de
configuración extra @option{--with-abi} (vea @code{gcc.scm} para ejemplos de
como manejar este caso). En segundo lugar, algunos de los paquetes
necesarios pueden fallar en su construcción para dicha plataforma. Por
último, los binarios generados pueden estar defectuosos por alguna razón.

@c *********************************************************************
@include contributing.es.texi

@c *********************************************************************
@node Reconocimientos
@chapter Reconocimientos

Guix está basado en el @uref{https://nixos.org/nix/, gestor de paquetes
Nix}, que fue diseñado e implementado por Eelco Dolstra, con contribuciones
de otra gente (véase el archivo @file{nix/AUTHORS} en Guix). Nix fue pionero
en la gestión de paquetes funcional, y promovió características sin
precedentes, como las actualizaciones y reversiones de paquetes
transaccionales, perfiles por usuaria y un proceso de compilación
referencialmente transparente. Sin este trabajo, Guix no existiría.

Las distribuciones de software basadas en Nix, Nixpkgs y NixOS, también han
sido una inspiración para Guix.

GNU@tie{}Guix en sí es un trabajo colectivo con contribuciones de un número
de gente. Mire el archivo @file{AUTHORS} en Guix para más información sobre
esa gente maja. El archivo @file{THANKS} enumera personas que han ayudado
informando de errores, se han encargado de infraestructura, han
proporcionando arte y temas, han realizado sugerencias, y más---¡gracias!


@c *********************************************************************
@node Licencia de documentación libre GNU
@appendix Licencia de documentación libre GNU
@cindex licencia, GNU Free Documentation License
@include fdl-1.3.texi

@c *********************************************************************
@node Índice de conceptos
@unnumbered Índice de conceptos
@printindex cp

@node Índice programático
@unnumbered Índice programático
@syncodeindex tp fn
@syncodeindex vr fn
@printindex fn

@bye

@c Local Variables:
@c ispell-local-dictionary: "american";
@c End:
