\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
@documentlanguage es
@frenchspacing on
@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://ftpmirror.gnu.org/gnu/guix

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

@copying
Copyright @copyright{} 2012--2025 Ludovic Courtès@* Copyright @copyright{}
2013, 2014, 2016, 2024 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,
2023, 2025 Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018,
2019, 2020, 2021, 2022, 2023 Ricardo Wurmus@* Copyright @copyright{} 2016
Ben Woodcroft@* Copyright @copyright{} 2016, 2017, 2018, 2021 Chris
Marusich@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022,
2023, 2025 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@*
Copyright @copyright{} 2016, 2017 Nikita Gillmann@* Copyright @copyright{}
2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke
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, 2024,
2025 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--2025 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, 2023, 2024, 2025
Arun Isaac@* Copyright @copyright{} 2017 nee@* Copyright @copyright{} 2018
Rutger Helling@* Copyright @copyright{} 2018, 2021, 2023, 2025 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, 2023, 2024
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, 2023 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, 2022 Pierre Langlois@* Copyright @copyright{} 2020 pinoaffe@*
Copyright @copyright{} 2020, 2023 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-2023 Josselin Poiret@* Copyright
@copyright{} 2021, 2023 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@* Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@*
Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{}
2023-2025 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@*
Copyright @copyright{} 2023 Karl Hallsby@* Copyright @copyright{} 2023
Nathaniel Nicandro@* Copyright @copyright{} 2023 Tanguy Le Carrour@*
Copyright @copyright{} 2023-2024 Zheng Junjie@* Copyright @copyright{} 2023
Brian Cully@* Copyright @copyright{} 2023 Felix Lechner@* Copyright
@copyright{} 2023 Foundation Devices, Inc.@* Copyright @copyright{} 2023
Thomas Ieong@* Copyright @copyright{} 2023 Saku Laesvuori@* Copyright
@copyright{} 2023 Graham James Addis@* Copyright @copyright{} 2023-2025
Tomas Volf@* Copyright @copyright{} 2024, 2025 Herman Rimm@* Copyright
@copyright{} 2024 Matthew Trzcinski@* Copyright @copyright{} 2024 Richard
Sent@* Copyright @copyright{} 2024 Dariqq@* Copyright @copyright{} 2024
Denis 'GNUtoo' Carikli@* Copyright @copyright{} 2024 Fabio Natali@*
Copyright @copyright{} 2024 Arnaud Daby-Seesaram@* Copyright @copyright{}
2024-2025 Nigko Yerden@* Copyright @copyright{} 2024 Troy Figiel@* Copyright
@copyright{} 2024 Sharlatan Hellseher@* Copyright @copyright{} 2024 45mg@*
Copyright @copyright{} 2024 Greg Hogan@* Copyright @copyright{} 2025 Sören
Tempel@* Copyright @copyright{} 2025 Rostislav Svoboda@* Copyright
@copyright{} 2025 Zacchaeus@* Copyright @copyright{} 2025 Sergio Pastor
Pérez@* Copyright @copyright{} 2024 Evgeny Pisemsky@* Copyright @copyright{}
2025 jgart@* Copyright @copyright{} 2025 Artur Wroblewski@* Copyright
@copyright{} 2025 Edouard Klein@* Copyright @copyright{} 2025 Rodion
Goritskov@* Copyright @copyright{} 2025 dan@* Copyright @copyright{} 2025
Noé Lopez@*

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.es: (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.es)Invocación de guix shell.  Creación de entornos de 
                                                    software.
* 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.
Este manual también está disponible en chino simplificado (@pxref{Top,,,
guix.zh_CN, GNU Guix参考手册}), francés (@pxref{Top,,, guix.fr, Manuel de
référence de GNU Guix}), alemán (@pxref{Top,,, guix.de, Referenzhandbuch zu
GNU Guix}), italiano (@pxref{Top,,, guix.it, Manuale di riferimento di GNU
Guix}), portugués brasileño (@pxref{Top,,, guix.pt_BR, Manual de referência
do GNU Guix}), ruso (@pxref{Top,,, guix.ru, Руководство GNU Guix}) y la
versión original en inglés (@pxref{Top,,, guix, GNU Guix Reference
Manual}). Si desea traducirlo en su lengua nativa, considere unirse al
@uref{https://translate.codeberg.org/projects/guix/documentation-manual,
Weblate}.

Este manual se está traducido prácticamente al completo al castellano, pero
es posible que se ocasionalmente algún fragmento sin traducir aquí y allá,
debido a modificaciones al texto original en inglés del manual. Si encuentra
fallos en esta traducción, o simplemente quiere colaborar en su evolución y
mejora, le rogamos que nos contacte a través de
@uref{https://translationproject.org/team/es.html, la información de
contacto del equipo de traducción}.

@menu
* Introducción::             ¿Qué es esto de Guix?
* Instalación::              Instalar Guix.
* Instalación del sistema::  Instalar el sistema operativo completo.
* 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.
* System Troubleshooting Tips::  When things don't go as planned.
* Home Configuration::       Configuring the home environment.
* Documentación::            Navegar por los manuales de usuaria del 
                               software.
* Platforms::                Defining platforms.
* System Images::            Creación de imágenes del sistema.
* 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.
* Contribución::             ¡Se necesita su ayuda!

* Agradecimientos::          ¡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!
* 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.

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 locate::  Locating packages that provide a file.
* 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



* Servidores oficiales de sustituciones::  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.
* Opciones de 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.
* Customizing the System-Wide Guix::  Canales predeterminados en Sistema 
                                        Guix.
* Verificación de canales::  Cómo verifica Guix lo que obtiene.
* Canales con sustitutos::   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



* Invocación de guix shell::  Crear un entorno de software.
* 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.
* Escribir manifiestos::     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
* Utilizar interactivamente Guix::  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



* Getting Started with the System::  Sus primeros pasos.
* 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.
* Privileged Programs::      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.

Sistemas de archivos



* Sistema de archivos Btrfs::  Sistema de archivos Btrfs

Servicios



* Servicios base::           Servicios esenciales del sistema.
* Ejecución de tareas programadas::  El servicio mcron.
* Rotación del registro de mensajes::  Archiving and deleting old logs.
* Networking Setup::         Configurar interfaces de red.
* 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.
* File Search Services::     Tools to search for files.
* 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.
* High Availability Services::  High availability services.
* 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::           Servicios Samba.
* Integración continua::     Cuirass and Laminar services.
* Servicios de gestión de energía::  Extending battery life, etc.
* 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.

System Troubleshooting Tips



* Acceso a un sistema existente mediante chroot::  Acceso a un sistema 
                                                     existente mediante chroot

Home Configuration



* Declarar el entorno personal::  Customizing your Home.
* Configurar el intérprete::  Activando entorno personal
* Servicios personal::       Especificar los servicios personal.
* Invocación de guix home::  Instanciar una configuración personal.

Servicios personal



* Servicios personal esenciales::  Environment variables, packages, on-* 
                                     scripts.
* Intérprete: Servicios personal de intérprete.  Intérpretes POSIX, Bash, 
                                                   Zsh.
* Mcron: Servicio personal Mcron.  Ejecución de tareas de usuario 
                                     programadas.
* Gestión de energía: Servicios personal de gestión de energía.  Services 
                                                                   for battery 
                                                                   power.
* Shepherd: Servicio personal de Shepherd.  Managing User's Daemons.
* SSH: Secure Shell.         Setting up the secure shell client.
* GPG: GNU Privacy Guard.    Setting up GPG and related tools.
* Desktop: Desktop Home Services.  Servicios para entornos gráficos.
* Guix: Guix Home Services.  Servicios para Guix.
* Backup: Backup Home Services.  Services for backing up User's files.
* Fonts: Fonts Home Services.  Servicios para gestión de tipografías del 
                                 usuario.
* Sound: Sound Home Services.  Dealing with audio.
* Mail: Mail Home Services.  Servicios para gestionar correo.
* Messaging: Messaging Home Services.  Servicios para gestionar mensajes.
* Media: Media Home Services.  Servicios para gestionar medio.
* Sway: Sway window manager.  Setting up the Sway configuration.
* Networking: Networking Home Services.  Servicios de red.
* Secrets: Secrets Home Services.  Services for storing secrets.
* Miscellaneous: Miscellaneous Home Services.  More services.

Platforms



* platform Reference::       Detail of platform declarations.
* Plataformas mantenidas::   Description of the supported platforms.

Creación de imágenes del sistema



* 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.

@code{image} Reference



* partition Reference::      partition Reference

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



* Full-Source Bootstrap::    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 proporciona una interfaz de gestión de paquetes de línea de ordenes
(@pxref{Gestión de paquetes}), un conjunto de utilidades de línea de órdenes
(@pxref{Utilidades}), así como interfaces programáticas Scheme
(@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 pre-construidos 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{Agradecimientos}). 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 store
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{Contribución} para informarse sobre cómo ayudar!

@item x86_64-gnu
@uref{https://hurd.gnu.org, GNU/Hurd} on the @code{x86_64} Intel/AMD 64-bit
architecture.

This configuration is even more experimental and under heavy upstream
development.

@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 cambios}).  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 cambios}).  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{Introduction,,, shepherd, El
manual GNU Shepherd}), 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{Contribución}, para información sobre cómo puede
ayudar.


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

@cindex instalar Guix
@cindex distribución distinta
@cindex Sistema Guix
You can install the package management tool Guix on top of an existing
GNU/Linux or GNU/Hurd system@footnote{Hurd support is currently limited.},
referred to as a @dfn{foreign distro}.  If, instead, you want to install the
complete, standalone GNU system distribution, @dfn{Guix@tie{}System},
@pxref{Instalación del sistema}.  This section is concerned only with the
installation of Guix on a foreign distro.

@quotation Importante
This section only applies to systems without Guix.  Following it for
existing Guix installations will overwrite important system files.
@end quotation

@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}).

@menu
* Instalación binaria::      ¡Poner Guix en funcionamiento en nada de 
                               tiempo!
* 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
This section describes how to install Guix from a self-contained tarball
providing binaries for Guix and for all its dependencies.  This is often
quicker than installing from source, described later (@pxref{Construyendo desde Git}).

@quotation Importante
This section only applies to systems without Guix.  Following it for
existing Guix installations will overwrite important system files.
@end quotation

The @uref{https://guix.gnu.org/guix-install.sh, @file{guix-install.sh}}
shell script automates the binary installation process.  Use of
@file{guix-install.sh} requires Bash, GnuPG, GNU@tie{}tar, wget, and Xz.  On
systems where systemd is detected, the tool @command{newgidmap} from the
@code{uidmap} package is also required.

To install Guix on top of your GNU/Linux system, run the following commands
as root:

@example
cd /tmp
wget https://guix.gnu.org/guix-install.sh
chmod +x guix-install.sh
./guix-install.sh
@end example

When you're done installing Guix, @pxref{Configuración de la aplicación} for extra
configuration you might need, and @ref{Empezando} for your first
steps!

The script goes through the following steps:

@enumerate
@item
Downloading the binary tarball from
@indicateurl{@value{BASE-URL}/guix-binary-@value{VERSION}.x86_64-linux.tar.xz}
(where @code{x86_64-linux} can be replaced with @code{i686-linux} for an
@code{i686} (32-bits) machine already running the kernel Linux, and so
on---@pxref{Distribución GNU}) and extracting it.
@item
Setting up the build daemon (@pxref{Preparación del daemon}).
@item
Making the @command{guix} command available to non-root users.
@item
Configuring substitute servers (@pxref{Servidores oficiales de sustituciones}).
@end enumerate

@quotation Nota
By default, @file{guix-install.sh} will configure Guix to download pre-built
package binaries, called @dfn{substitutes} (@pxref{Sustituciones}), from the
project's build farms.  If you choose not to permit this, Guix will build
@emph{everything} from source, making each installation and upgrade very
expensive.  @xref{Sobre la confianza en binarios} for a discussion of why you may want
to build packages from source.

@cindex sustituciones, autorización de las mismas
To use substitutes from @code{@value{SUBSTITUTE-SERVER-1}},
@code{@value{SUBSTITUTE-SERVER-2}} or a mirror, you must authorize them.
For example,

@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
@end quotation

@quotation Nota
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.
@end quotation

@cindex uninstalling Guix
@cindex uninstallation, of Guix
Should you eventually want to uninstall Guix, run the same script with the
@option{--uninstall} flag:

@example
./guix-install.sh --uninstall
@end example

With @option{--uninstall}, the script irreversibly deletes all the Guix
files, configuration, and services.

Some GNU/Linux distributions, such as openSUSE, Alpine and NixOS provide
Guix through their own package managers.  The version of Guix may be older
than @value{VERSION} but you can update it afterwards by running
@command{guix pull}.

We advise system administrators who install Guix, both from the installation
script or @i{via} the native package manager of their foreign distribution,
to also regularly read and follow security notices, as shown by
@command{guix pull}.

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

@cindex daemon
@cindex daemon de construcción
During installation, the @dfn{build daemon} that must be running to use Guix
has already been set up and you can run @command{guix} commands in your
terminal program, @pxref{Empezando}:

@example
guix build hello
@end example

If this runs through without error, feel free to skip this section.  You
should continue with the following section, @ref{Configuración de la aplicación}.

However, now would be a good time to replace outdated daemon versions, tweak
it, perform builds on other machines (@pxref{Configuración de delegación del daemon}), or
start it manually in special environments like ``chroots'' (@pxref{Acceso a un sistema existente mediante chroot}) or WSL (not needed for WSL images created with
Guix, @pxref{System Images, @code{wsl2-image-type}}).  If you want to know
more or optimize your system, this section is worth reading.

Operaciones como la construcción de un paquete o la ejecución del recolector
de basura son realizadas por un proceso especializado, el 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 (por llamadas a
procedimientos remotos) para indicarle qué hacer.

The following sections explain how to prepare the build daemon's
environment.  @xref{Sustituciones} for how to allow the daemon to download
pre-built binaries.

@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.
* AppArmor Support::         Using an AppArmor profile for the daemon.
@end menu

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

@cindex entorno de construcción
In a standard multi-user setup, Guix and its daemon---the
@command{guix-daemon} program---are installed by the system administrator.
Unprivileged users may use Guix tools to build packages or otherwise access
the store, and the daemon will do it on their behalf, ensuring that the
store is kept in a consistent state, and allowing built packages to be
shared among users.

There are currently two ways to set up and run the build daemon:

@enumerate
@item
running @command{guix-daemon} as ``root'', letting it run build processes as
unprivileged users taken from a pool of build users---this is the historical
approach;

@item
running @command{guix-daemon} as a separate unprivileged user, relying on
Linux's @dfn{unprivileged user namespace} functionality to set up isolated
environments---this is the option chosen when installing Guix on a
systemd-based distribution with the installation script (@pxref{Instalación binaria}).
@end enumerate

The sections below describe each of these two configurations in more detail
and summarize the kind of build isolation they provide.

@unnumberedsubsubsec Daemon Running as Root

@cindex usuarias de construcción
When @command{guix-daemon} runs as @code{root}, you may not want package
build processes themselves to run as @code{root} too, for obvious security
reasons.  To avoid that, a special pool of @dfn{build users} should be
created for use by build processes started by the daemon.  Having several
such users allows the daemon to launch distinct build processes under
separate UIDs, which guarantees that they do not interfere with each
other---an essential feature since builds are regarded as pure functions
(@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

In this setup, @file{/gnu/store} is owned by @code{root}.

@unnumberedsubsubsec Daemon ejecutando sin privilegios

@cindex rootless build daemon
@cindex daemon de construcción sin privilegio
@cindex build daemon, unprivileged
The second and preferred option is to run @command{guix-daemon} @emph{as an
unprivileged user}.  It has the advantage of reducing the harm that can be
done should a build process manage to exploit a vulnerability in the
daemon.  This option requires the use of Linux's unprivileged user namespace
mechanism; today it is available and enabled by most GNU/Linux distributions
but can still be disabled.  The installation script automatically determines
whether this option is available on your system (@pxref{Instalación binaria}).

When using this option, you only need to create one user account, and
@command{guix-daemon} will run with the authority of that account:

@example
# groupadd --system guix-daemon
# useradd -g guix-daemon -G guix-daemon              \
          -d /var/empty -s $(which nologin)          \
          -c "Guix daemon privilege separation user" \
          --system guix-daemon
@end example

@quotation Aviso
If the @command{nologin} binary is not found by @command{which nologin}, you
may need to specify its path manually.  This will usually be
@file{/sbin/nologin} or @file{/usr/sbin/nologin}.
@end quotation

In this configuration, @file{/gnu/store} is owned by the @code{guix-daemon}
user.

@anchor{unprivileged-daemon-migration}
@unnumberedsubsubsec Migrating to the Unprivileged Daemon

@cindex daemon sin privilegio, migración
@cindex rootless daemon, migration
To switch an existing installation to the unprivileged execution mode, a
number of steps must be taken: creating a new dedicated @code{guix-daemon}
user account, changing ownership of the relevant files to
@code{guix-daemon}, and ensuring that the @command{guix-daemon} program runs
as @code{guix-daemon}.

On Guix System, these steps are carried out automatically when you set the
@code{privileged?} field of the @code{guix-configuration} record to
@code{#f} and reconfigure (@pxref{guix-configuration-type,
@code{guix-configuration}}).

However, on a foreign distribution, the process is manual.  The following
paragraphs describe what you need to do.

@quotation Aviso
Follow the instructions below only after making sure you have a recent
version of @command{guix-daemon} with support for unprivileged execution.
@end quotation

File ownership can be changed, after stopping the daemon, by running the
following commands as root (the @command{chown} can take a while if there
are many files in @file{/gnu/store}):

@example
groupadd --system guix-daemon
useradd -g guix-daemon -G guix-daemon,kvm               \
        -d /var/empty -s $(which nologin)               \
        -c "Guix daemon privilege separation user"      \
        --system guix-daemon

# Make the store writable, in case the systemd 'gnu-store.mount'
# unit made it read-only.
mount -o remount,rw /gnu/store

chown -R guix-daemon:guix-daemon                        \
  /gnu                                                  \
  /var/guix/@{gc.lock,daemon-socket,db,discover@}         \
  /var/guix/@{gcroots,offload,substitute,temproots@}      \
  /var/log/guix                                         \
  /etc/guix
@end example

If your system uses the systemd service manager, running the daemon as
@code{guix-daemon} will be a matter of copying the relevant configuration
files---make sure to review any changes you might have made in your own
@file{.service} files before overwriting them:

@example
cp /var/guix/profiles/per-user/root/current-guix/lib/systemd/system/*.service \
   /etc/systemd/system
systemctl daemon-reload
systemctl start guix-daemon
@end example

If your system has AppArmor enabled, @pxref{AppArmor Support}.

@quotation Aviso
The commands above assume that @command{guix pull} was run for the root
user.  You can check whether this is the case by running this command:

@example
grep User=guix-daemon \
  /var/guix/profiles/per-user/root/current-guix/lib/systemd/system/guix-daemon.service
@end example

If that command does not show the @code{User=guix-daemon} line, then run
@command{guix pull} as the root user.
@end quotation

@unnumberedsubsubsec El entorno de construcción aislado

@cindex chroot
@cindex build environment isolation
@cindex isolated build environment
@cindex hermetic build environment
In both cases, privileged and unprivileged, the daemon starts build
processes without privileges in an @emph{isolated} or @emph{hermetic} build
environment---a ``chroot''.  On GNU/Linux, by default, the build environment
contains nothing but:

@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.

All this is usually enough to ensure details of the environment do not
influence build processes.  In some exceptional cases where more control is
needed---typically over the date, kernel, or CPU---you can resort to a
virtual build machine (@pxref{build-vm, virtual build machines}).

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}).


@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
Disk space availability.  More than 100 MiB must be available.
@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{Introduction, 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
The user account on the remote machine to use when connecting over SSH.
Note that the SSH key pair must @emph{not} be passphrase-protected, to allow
non-interactive logins.

@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}.

@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

@quotation Nota
On Guix System, instead of managing @file{/etc/guix/machines.scm}
independently, you can choose to specify build machines directly in the
@code{operating-system} declaration, in the @code{build-machines} field of
@code{guix-configuration}.  @xref{guix-configuration-build-machines,
@code{build-machines} field of @code{guix-configuration}}.
@end quotation

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

@quotation Nota
This key pair is not related to the SSH key pair that was previously
mentioned in the description of the @code{build-machine} data type.
@end quotation

@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

@quotation Nota
The @code{guix-install.sh} binary installation script offers to perform the
steps below for you (@pxref{Instalación binaria}).
@end quotation

Para instalar la política ejecute esta orden como root:

@example
semodule -i /var/guix/profiles/per-user/root/current-guix/share/selinux/guix-daemon.cil
@end example

Then, as root, relabel the file system, possibly after making it writable:

@example
mount -o remount,rw /gnu/store
restorecon -R /gnu /var/guix
@end example

At this point you can start or restart @command{guix-daemon}; on a
distribution that uses systemd as its service manager, you can do that with:

@example
systemctl restart guix-daemon
@end example

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} cannot access arbitrary links to profiles.  By design, the
file label of the destination of a symlink is independent of the file label
of the link itself.  Although all profiles under @file{$localstatedir} are
labelled, the links to these profiles inherit the label of the directory
they are in.  For links in the user’s home directory this will be
@code{user_home_t}.  But for links from the root user’s home directory, or
@file{/tmp}, or the HTTP server’s working directory, etc, this won’t work.
@code{guix gc} would be prevented from reading and following these links.

@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 AppArmor Support
@subsection AppArmor Support

@cindex AppArmor

Guix includes an AppArmor profile for the build daemon in
@file{etc/apparmor.d/guix-daemon} that can be installed on systems with
strict AppArmor policies to allow it to run unprivileged (@pxref{Configuración del entorno de construcción}).  Indeed, the unprivileged daemon makes use of Linux
user namespaces but these are disallowed without an AppArmor policy on some
systems like Ubuntu.

To know if this applies to you, check if the
@code{kernel.apparmor_restrict_unprivileged_userns} kernel parameter is
enabled.

@subsubsection Installing the AppArmor profile
@cindex AppArmor, profile installation

@quotation Nota
The @code{guix-install.sh} binary installation script offers to perform the
steps below for you (@pxref{Instalación binaria}).
@end quotation

Run these commands as root to install the profile:

@example
export apparmor_sources=/var/guix/profiles/per-user/root/current-guix/etc/apparmor.d
cp -f -t /etc/apparmor.d/tunables "$apparmor_sources/tunables/guix"
cp -f -t /etc/apparmor.d "$apparmor_sources/guix-daemon"
cp -f -t /etc/apparmor.d "$apparmor_sources/guix"
apparmor_parser -r /etc/apparmor.d/guix-daemon
apparmor_parser -r /etc/apparmor.d/guix
@end example

After this, the build daemon will be able to function correctly.

@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 activación con socket, para @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.

The default value is @code{3600} (one hour).

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.

The default value is 24 hours.

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.

@quotation Aviso
Using this option is not recommended since it allows build processes to gain
access to undeclared dependencies, to interfere with one another, and more
generally to do anything that can be done with the authority of build users
or that of the daemon---which includes at least the ability to tamper with
any file in the store!

You may find it necessary, though, when support for Linux unprivileged user
namespaces is missing (@pxref{Configuración del entorno de construcción}).  Use at your own
risk!
@end quotation

@item --isolate-host-loopback
Prevent fixed-output chroot builds from accessing the host loopback.  When
this is used, fixed-output builds will have their own loopback interface,
and attempts to connect to 127.0.0.1 or ::1 will instead attempt to connect
to its local loopback interface.

@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 @abbr{nscd, name service cache daemon}
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{Name Service Switch,,, 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.

@cindex nsncd, replacement for nscd
Note that @command{nscd} is no longer provided on some GNU/Linux distros,
such as Arch Linux (as of Dec. 2024).  @command{nsncd} can be used as a
drop-in-replacement.  See @uref{https://github.com/twosigma/nsncd, the nsncd
repository} and @uref{https://flokli.de/posts/2022-11-18-nsncd/, this blog
post} for more information.

@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.

@cindex guix-emacs-autoload-packages, refreshing Emacs packages
Additionally, autoload definitions are automatically evaluated at the
initialization of Emacs, by the Guix-specific
@code{guix-emacs-autoload-packages} procedure.  This procedure can be
interactively invoked to have newly installed Emacs packages discovered,
without having to restart Emacs.  If, for some reason, you want to avoid
auto-loading the Emacs packages installed with Guix, you can do so by
running Emacs with the @option{--no-site-file} option (@pxref{Init File,,,
emacs, The GNU Emacs Manual}).

@quotation Nota
Most Emacs variants are now capable of doing native compilation.  The
approach taken by Guix Emacs however differs greatly from the approach taken
upstream.

Upstream Emacs compiles packages just-in-time and typically places shared
object files in a special folder within your @code{user-emacs-directory}.
These shared objects within said folder are organized in a flat hierarchy,
and their file names contain two hashes to verify the original file name and
contents of the source code.

Guix Emacs on the other hand prefers to compile packages ahead-of-time.
Shared objects retain much of the original file name and no hashes are added
to verify the original file name or the contents of the file.  Crucially,
this allows Guix Emacs and packages built against it to be grafted
(@pxref{Actualizaciones de seguridad, grafts}), but at the same time, Guix Emacs lacks
the hash-based verification of source code baked into upstream Emacs.  As
this naming schema is trivial to exploit, we disable just-in-time
compilation.

Further 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

If you installed Guix on a foreign distro with @file{guix-install.sh}, you
can upgrade the build daemon by running:

@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

While this works for @file{guix-install.sh}, it will most likely not work if
you installed Guix through the package manager of another distribution (for
instance with @command{sudo apt install guix}, @command{pacman -S guix}, or
similar commands)  because on many distributions @file{guix-daemon.service}
will only run the Guix daemon provided by the distribution.

Waiting for your distribution to provide security fixes sometimes work, but
fixing security issues in the Guix package takes times for distributions
because Guix doesn't backport the security fixes to the releases used by the
distributions. On some distribution versions, the Guix package is never
fixed.

However since Guix updates also comes with a new daemon, so you can simply
configure your distribution to use the guix-daemon provided by Guix
instead. The following will assume that your distribution uses systemd.

You first need to override @file{guix-daemon.service} with the following
command:

@example
sudo install -m 644 \
     /lib/systemd/system/guix-daemon.service \
     /etc/systemd/system/guix-daemon.service
@end example

You will then need to edit
@file{/etc/systemd/system/guix-daemon.service}. To do that open this file
with a text editor that has root permissions:

@example
sudo $EDITOR /etc/systemd/system/guix-daemon.service
@end example

Then try to find a line with @emph{ExecStart=}, it should look a bit like
that:
@example
...
[Service]
ExecStart=/usr/bin/guix-daemon --build-users-group=_guixbuild
...
@end example

Then change @emph{/usr/bin/guix-daemon} into
@emph{/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon} and
save the changes.

Once done you need to tell systemd that @emph{guix-daemon.service} was
overriden:

@example
sudo systemctl daemon-reload
@end example

Once done you can then update the Guix daemon in the same way than if you
installed Guix with @file{guix-install.sh}:

@example
sudo -i guix pull
sudo 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}}).

To migrate an existing installation to the @emph{unprivileged daemon} where
@command{guix-daemon} does not run as root,
@pxref{unprivileged-daemon-migration}.

@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.

More and more system services are provided (@pxref{Servicios}).

No obstante, antes de que proceda con la instalación, sea consciente que
algunos servicios qué dependes aún están ausentes desde la versión
@value{VERSION}.

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{Contribución}, 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}.

Sadly, on some machines, the installation medium cannot be properly booted
and you only see a black screen after booting even after you waited for ten
minutes.  This may indicate that your machine cannot run Guix System;
perhaps you instead want to install Guix on a foreign distro (@pxref{Instalación binaria}).  But don't give up just yet; a possible workaround is
pressing the @kbd{e} key in the GRUB boot menu and appending
@option{nomodeset} to the Linux bootline.  Sometimes the black screen issue
can also be resolved by connecting a different display.

@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
Si en vez de eso planea cifrar la partición raíz, puede usar las
herramientas Crypsetup/LUKS para hacerlo (véase @inlinefmtifelse{html,
@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}},
@code{man cryptsetup}} para más información).

Asumiendo que quiere almacenar la partición raíz en @file{/dev/sda2}, la
secuencia de ordenes sería más o menos así:

@example
cryptsetup luksFormat /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

Success, you've now booted into Guix System! Login to the system using the
non-@code{root} user that you created during installation.  You can upgrade
the system whenever you want by running:

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

@noindent
This builds a new system @dfn{generation} with the latest packages and
services.

Now, @pxref{Getting Started with the System}, 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,readonly=on,file=guix-system-install-@value{VERSION}.@var{system}.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 *********************************************************************
@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.

You can also manage the configuration of your entire @dfn{home
environment}---your user ``dot files'', services, and packages---using Guix
Home.  @xref{Home Configuration}, to learn more about it!
@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

Upon completion, the system runs the latest versions of its software
packages.  Just like for packages, you can always @emph{roll back} to a
previous generation @emph{of the whole system}.  @xref{Getting Started with the System}, to learn how to manage your system.

¡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.es, Libro de recetas de GNU Guix}, 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 locate::  Locating packages that provide a file.
* 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.

In addition, any package transaction may be @emph{rolled back}.  So, if, for
example, an upgrade installs a new version of a package that turns out to
have a serious bug, users may roll back to the previous instance of their
profile, which was known to work well.  Similarly, the global system
configuration on Guix is subject to transactional upgrades and roll-back
(@pxref{Getting Started with the System}).

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{Invocación de 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} must be a Scheme expression that evaluates to a @code{<package>}
object.  This option is notably useful to disambiguate between same-named
variants of a package, with expressions such as @code{(@@ (gnu packages
commencement) 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{Invocación de 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{Escribir manifiestos}, 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.

Por ejemplo, GCC necesita que las variables de entorno @env{CPATH} y
@env{LIBRARY_PATH} estén definidas para poder buscar cabeceras y bibliotecas
en el perfil de la usuaria (@pxref{Environment Variables,,, gcc, Using the
GNU Compiler Collection (GCC)}). Si GCC y, digamos, la biblioteca de C están
instaladas en el perfil, entonces @option{--search-paths} sugerirá fijar
dichas variables a @file{@var{perfil}/include} y @file{@var{perfil}/lib}
respectivamente. (@pxref{Search Paths}, para info en especificaciones de
ruta de búsqueda asociadas con paquetes.)

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 pinchando, revisiones de canal de un perfil
@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
* Servidores oficiales de sustituciones::  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.
* Opciones de 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 Servidores oficiales de sustituciones
@subsection Servidores oficiales de sustituciones

@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.

El uso de sustituciones de las granjas de construcción oficial se realiza de
manera predeterminada cuando se usa el sistema Guix (@pxref{Distribución GNU}). No obstante, no se realiza de manera predeterminada cuando
se usa Guix en una distribución anfitriona, a menos que las active
explícitamente via uno de los pasos recomendados de instalación
(@pxref{Instalación}). Los siguientes párrafos describen como activar o
desactivar las sustituciones para la granja oficial de construcción; el
mismo procedimiento puede usarse para activar las sustituciones desde
cualquier otro servidor que las proporcione.

@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
@c Note: This section name appears in a hint printed by 'guix weather'.

@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.

@quotation Troubleshooting
To diagnose problems, you can run @command{guix weather}.  For example,
running:

@example
guix weather coreutils
@end example

@noindent
not only tells you which of the currently-configured servers has substitutes
for the @code{coreutils} package, it also reports whether one of these
servers is unauthorized.  @xref{Invocación de guix weather}, for more
information.
@end quotation

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 Opciones de pasarela
@subsection Opciones de 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 has the foundations to maximize build reproducibility
(@pxref{Características}).  In most cases, independent builds of a given package or
derivation should yield bit-identical results.  Thus, through a diverse set
of independent package builds, we can strengthen the integrity of our
systems.  The @command{guix challenge} command aims to help users assess
substitute servers, and to assist developers in finding out about
non-deterministic package builds (@pxref{Invocación de guix challenge}).
Similarly, the @option{--check} option of @command{guix build} allows users
to check whether previously-installed substitutes are genuine by rebuilding
them locally (@pxref{build-check, @command{guix build --check}}).  To force
a full rebuild of a package (ignoring security updates via grafts
(@pxref{Actualizaciones de seguridad}), if any grafts exist—which is not always the
case), use @option{--check} together with @option{--no-grafts}
(@pxref{Opciones comunes de construcción, @option{--no-grafts}}).  Because grafts are
built as their own derivation, if the package you want to rebuild is subject
to being grafted, merely using @option{--check} will only rebuild the
grafting derivation, and not actually recompile the package.

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 documentation
La orden que instala su documentación es:

@example
guix install glib:doc
@end example

While the colon syntax works for command-line specification of package
outputs, it will not work when using a package @emph{variable} in Scheme
code.  For example, to add the documentation of @code{glib} to the globally
installed packages of an @code{operating-system} (see @ref{Referencia de operating-system}), a list of two items, the first one being the package
@emph{variable} and the second one the name of the output to select (a
string), must be used instead:

@lisp
(use-modules (gnu packages glib))
;; glib-with-documentation is the Guile symbol for the glib package
(operating-system
 ...
 (packages
  (append
   (list (list glib-with-documentation "doc"))
         %base-packages)))
@end lisp

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 locate
@section Invocación de @command{guix locate}

@cindex file, searching in packages
@cindex file search
@cindex buscar paquetes
There's so much free software out there that sooner or later, you will need
to search for packages.  The @command{guix search} command that we've seen
before (@pxref{Invocación de guix package}) lets you search by keywords:

@example
guix search video editor
@end example

@cindex searching for packages, by file name
Sometimes, you instead want to find which package provides a given file, and
this is where @command{guix locate} comes in.  Here is how you can find
which package provides the @command{ls} command:

@example
$ guix locate ls
coreutils@@9.1       /gnu/store/@dots{}-coreutils-9.1/bin/ls
@end example

Of course the command works for any file, not just commands:

@example
$ guix locate unistr.h
icu4c@@71.1          /gnu/store/@dots{}/include/unicode/unistr.h
libunistring@@1.0    /gnu/store/@dots{}/include/unistr.h
@end example

You may also specify @dfn{glob patterns} with wildcards.  For example, here
is how you would search for packages providing @file{.service} files:

@example
$ guix locate -g '*.service'
man-db@@2.11.1        @dots{}/lib/systemd/system/man-db.service
wpa-supplicant@@2.10  @dots{}/system-services/fi.w1.wpa_supplicant1.service
@end example

The @command{guix locate} command relies on a database that maps file names
to package names.  By default, it automatically creates that database if it
does not exist yet by traversing packages available @emph{locally}, which
can take a few minutes (depending on the size of your store and the speed of
your storage device).

@quotation Nota
For now, @command{guix locate} builds its database based on purely local
knowledge---meaning that you will not find packages that never reached your
store.  Eventually it will support downloading a pre-built database so you
can potentially find more packages.
@end quotation

By default, @command{guix locate} first tries to look for a system-wide
database, usually under @file{/var/cache/guix/locate}; if it does not exist
or is too old, it falls back to the per-user database, by default under
@file{~/.cache/guix/locate}.  On a multi-user system, administrators may
want to periodically update the system-wide database so that all users can
benefit from it, for instance by setting up
@code{package-database-service-type} (@pxref{File Search Services,
@code{package-database-service-type}}).

La sintaxis general es:

@example
guix locate [@var{options}@dots{}] @var{file}@dots{}
@end example

@noindent
... where @var{file} is the name of a file to search for (specifically, the
``base name'' of the file: files whose parent directories are called
@var{file} are not matched).

Las opciones disponibles son las siguientes:

@table @code
@item --glob
@item -g
Interpret @var{file}@dots{} as @dfn{glob patterns}---patterns that may
include wildcards, such as @samp{*.scm} to denote all files ending in
@samp{.scm}.

@item --stats
Display database statistics.

@item --update
@itemx -u
Update the file database.

By default, the database is automatically updated when it is too old.

@item --clear
Clear the database and re-populate it.

This option lets you start anew, ensuring old data is removed from the
database, which also avoids having an endlessly growing database.  By
default @command{guix locate} automatically does that periodically, though
infrequently.

@item --database=@var{file}
Use @var{file} as the database, creating it if necessary.

By default, @command{guix locate} picks the database under
@file{~/.cache/guix} or @file{/var/cache/guix}, whichever is the most recent
one.

@item --method=@var{method}
@itemx -m @var{method}
Use @var{method} to select the set of packages to index.  Possible values
are:

@table @code
@item manifests
This is the default method: it works by traversing profiles on the machine
and recording packages it encounters---packages you or other users of the
machine installed, directly or indirectly.  It is fast but it can miss other
packages available in the store but not referred to by any profile.

@item store
This is a slower but more exhaustive method: it checks among all the
existing packages those that are available in the store and records them.
@end table
@end table


@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 the store
(@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}
Los paquetes se instalan o actualizan con la última versión disponible en la
distribución disponible actualmente en su máquina local. Para actualizar
dicha distribución, junto a las herramientas de Guix, debe ejecutar
@command{guix pull}: esta orden descarga el último código fuente de Guix y
descripciones de paquetes, y lo despliega. El código fuente se descarga de
un repositorio @uref{https://git-scm.com/book/es/, Git}, por defecto el
repositorio oficial de GNU@tie{}Guix, lo que no obstante puede ser
personalizado.  @command{guix pull} se asegura que el código que descarga es
@emph{auténtico} verificando que revisiones están firmadas por
desarrolladoras de Guix.

Specifically, @command{guix pull} downloads code from the @dfn{channels}
(@pxref{Canales}) specified by one of the following, in this order:

@enumerate
@item
la opción @option{--channels};
@item
the user's @file{~/.config/guix/channels.scm} file, unless @option{-q} is
passed;
@item
the system-wide @file{/etc/guix/channels.scm} file, unless @option{-q} is
passed (on Guix System, this file can be declared in the operating system
configuration, @pxref{guix-configuration-channels, @code{channels} field of
@code{guix-configuration}});
@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.

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
Generation 1	Jun 10 2018 00:18:18
  guix 65956ad
    repository URL: https://git.guix.gnu.org/guix.git
    branch: origin/master
    commit: 65956ad3526ba09e1f7a40722c96c6ef7c0936fe

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

Generation 3	Jun 13 2018 23:31:07	(current)
  guix 844cc1c
    repository URL: https://git.guix.gnu.org/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.

@item --no-channel-files
@itemx -q
Inhibit loading of the user and system channel files,
@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.

@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 --no-check-certificate
No valida los certificados X.509 de los servidores HTTPS.

When using this option, you have @emph{absolutely no guarantee} that you are
communicating with the authentic server responsible for the given URL.
Unless the channel is authenticated, this makes you vulnerable to
``man-in-the-middle'' attacks.

@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 possibly other channels
specified by your @file{channels.scm} configuration files---see below) 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{Invocación de 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. (@uref{https://www.imdb.com/title/tt0088763/,
Back to the Future (1985)})}! 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.

As for @command{guix pull}, in the absence of any options,
@command{time-machine} fetches the latest commits of the channels specified
in @file{~/.config/guix/channels.scm}, @file{/etc/guix/channels.scm}, or the
default channels; the @option{-q} option lets you ignore these configuration
files.  The command:

@example
guix time-machine -q -- build hello
@end example

will thus build the package @code{hello} as defined in the main branch of
Guix, without any additional channel, which is in general a newer revision
of Guix than you have installed.  Time travel works in both directions!

@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

@c Keep this paragraph in sync with 'time-machine.scm'.
@command{guix time-machine} raises an error when attempting to travel to
commits older than ``v0.16.0'' (commit @samp{4a0b87f0}), dated Dec.@: 2018.
This is one of the oldest commits supporting the channel mechanism that
makes ``time travel'' possible.

@quotation Nota
Although it should technically be possible to travel to such an old commit,
the ease to do so will largely depend on the availability of binary
substitutes.  When traveling to a distant past, some packages may not easily
build from source anymore.  One such example are old versions of OpenSSL
whose tests would fail after a certain date.  This particular problem can be
worked around by running a @dfn{virtual build machine} with its clock set to
the right time (@pxref{build-vm, Virtual Build Machines}).
@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.

@item --no-channel-files
@itemx -q
Inhibit loading of the user and system channel files,
@file{~/.config/guix/channels.scm} and @file{/etc/guix/channels.scm}.

Thus, @command{guix time-machine -q} is equivalent to the following Bash
command, using the ``process substitution'' syntax (@pxref{Process
Substitution,,, bash, The GNU Bash Reference Manual}):

@example
guix time-machine -C <(echo %default-channels) @dots{}
@end example

@end table

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}).

If @command{guix time-machine} is executed without any command, it prints
the file name of the profile that would be used to execute the command.
This is sometimes useful if you need to get store file name of the
profile---e.g., when you want to @command{guix copy} it.

@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}.

Cuando se combina con los canales (@pxref{Canales}), los inferiores
proporcionan una forma simple de interactuar con una revisión separada de
Guix. Por ejemplo, asumamos que desea instalar en su perfil el paquete
@code{guile} actual, junto al paquete @code{guile-json} como existía en una
revisión más antigua de Guix---quizá porque las versiones nuevas de
@code{guile-json} tienen un API incompatible y quiere ejecutar su código
contra la API antigua. Para hacerlo, puede escribir un manifiesto para
usarlo con @code{guix package --manifest} (@pxref{Escribir manifiestos}); en
dicho manifiesto puede crear un inferior para esa versión antigua de Guix
que le interesa, y buscará el paquete @code{guile-json} en el inferior:

@lisp
(use-modules (guix inferior) (guix channels)
             (srfi srfi-1))   ;para 'first'

(define channels
  ;; This is the old revision from which we want to
  ;; extract guile-json.
  (list (channel
         (name 'guix)
         (url "https://git.guix.gnu.org/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} inferior-for-channels 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} open-inferior 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} inferior-packages inferior
Devuelve la lista de paquetes conocida por @var{inferior}.
@end deffn

@deffn {Procedimiento} lookup-inferior-packages inferior nombre [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} inferior-package? obj
Devuelve verdadero si @var{obj} es un paquete inferior.
@end deffn

@deffn {Procedimiento} inferior-package-name paquete
@deffnx {Procedimiento} inferior-package-version paquete
@deffnx {Procedimiento} inferior-package-synopsis paquete
@deffnx {Procedimiento} inferior-package-description paquete
@deffnx {Procedimiento} inferior-package-home-page paquete
@deffnx {Procedimiento} inferior-package-location paquete
@deffnx {Procedimiento} inferior-package-inputs paquete
@deffnx {Procedimiento} inferior-package-native-inputs paquete
@deffnx {Procedimiento} inferior-package-propagated-inputs paquete
@deffnx {Procedimiento} inferior-package-transitive-propagated-inputs paquete
@deffnx {Procedimiento} inferior-package-native-search-paths paquete
@deffnx {Procedimiento} inferior-package-transitive-native-search-paths paquete
@deffnx {Procedimiento} inferior-package-search-paths 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.guix.gnu.org/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.guix.gnu.org/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 importar archivos para el almacén
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 and its package collection are updated by running @command{guix pull}.
By default @command{guix pull} downloads and deploys Guix itself from the
official GNU@tie{}Guix repository.  This can be customized by providing a
file specifying the set of @dfn{channels} to pull from (@pxref{Invocación de guix pull}).  A channel specifies the URL and branch of a Git repository to be
deployed, and @command{guix pull} can be instructed to pull from one or more
channels.  In other words, channels can be used to @emph{customize} and to
@emph{extend} Guix, as we will see below.  Guix is able to take into account
security concerns and deal with authenticated updates.

@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.
* Customizing the System-Wide Guix::  Canales predeterminados en Sistema 
                                        Guix.
* Verificación de canales::  Cómo verifica Guix lo que obtiene.
* Canales con sustitutos::   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.guix.gnu.org/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-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}).

Note that you can specify a local directory on the @code{url} field above if
the channel that you intend to use resides on a local file system.  However,
in this case @command{guix} checks said directory for ownership before any
further processing.  This means that if the user is not the directory owner,
but wants to use it as their default, they will then need to set it as a
safe directory in their global git configuration file.  Otherwise,
@command{guix} will refuse to even read it.  Supposing your system-wide
local directory is at @code{/src/guix.git}, you would then create a git
configuration file at @code{~/.gitconfig} with the following contents:

@example
[safe]
        directory = /src/guix.git
@end example

@noindent
This also applies to the root user unless when called with @command{sudo} by
the directory owner.

@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
;; Deploy specific commits of my channels of interest.
(list (channel
       (name 'guix)
       (url "https://git.guix.gnu.org/guix.git")
       (commit "6298c3ffd9654d3231a6f25390b056483e8f407c"))
      (channel
       (name 'variant-packages)
       (url "https://example.org/variant-packages.git")
       (commit "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

El archivo resultante @file{channels.scm} puede ser aprobado para la opción
@option{-C} de @command{guix pull} (@pxref{Invocación de guix pull}) o
@command{guix time-machine} (@pxref{Invocación de guix time-machine}), como en
este ejemplo:

@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{Invocación de 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 Customizing the System-Wide Guix
@section Customizing the System-Wide Guix

@cindex system-wide Guix, customization
@cindex channels, for the default Guix
If you're running Guix System or building system images with it, maybe you
will want to customize the system-wide @command{guix} it
provides---specifically, @file{/run/current-system/profile/bin/guix}.  For
example, you might want to provide additional channels or to pin its
revision.

This can be done using the @code{guix-for-channels} procedure, which returns
a package for the given channels, and using it as part of your operating
system configuration, as in this example:

@lisp
(use-modules (gnu packages package-management)
             (guix channels))

(define my-channels
  ;; Channels that should be available to
  ;; /run/current-system/profile/bin/guix.
  (append
   (list (channel
          (name 'guix-science)
          (url "https://codeberg.org/guix-science/guix-science")
          (branch "master")))
   %default-channels))

(operating-system
  ;; @dots{}
  (services
    ;; Change the package used by 'guix-service-type'.
    (modify-services %base-services
      (guix-service-type
       config => (guix-configuration
                  (inherit config)
                  (channels my-channels)
                  (guix (guix-for-channels my-channels)))))))
@end lisp

The resulting operating system will have both the @code{guix} and the
@code{guix-science} channels visible by default.  The @code{channels} field
of @code{guix-configuration} above further ensures that
@file{/etc/guix/channels.scm}, which is used by @command{guix pull},
specifies the same set of channels (@pxref{guix-configuration-channels,
@code{channels} field of @code{guix-configuration}}).

The @code{(gnu packages package-management)} module exports the
@code{guix-for-channels} procedure, described below.

@deffn {Procedure} guix-for-channels @var{channels}
Return a package corresponding to @var{channels}.

The result is a ``regular'' package, which can be used in
@code{guix-configuration} as shown above or in any other place that expects
a package.
@end deffn

@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 Canales con sustitutos
@section Canales con sustitutos

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
Let's say you have a bunch of custom package variants or personal packages
that you think would make little sense to contribute to the Guix project,
but would like to have these packages transparently available to you at the
command line.  By creating a @dfn{channel}, you can use and publish such a
package collection.  This involves the following steps:

@enumerate
@item
A channel lives in a Git repository so the first step, when creating a
channel, is to create its repository:

@example
mkdir my-channel
cd my-channel
git init
@end example

@item
The next step is to create files containing package modules (@pxref{Módulos de paquetes}), each of which will contain one or more package definitions
(@pxref{Definición de paquetes}).  A channel can provide things other than
packages, such as build systems or services; we're using packages as it's
the most common use case.

For example, Alice might want to provide a module called @code{(alice
packages greetings)} that will provide her favorite ``hello world''
implementations.  To do that Alice will create a directory corresponding to
that module name.

@example
mkdir -p alice/packages
$EDITOR alice/packages/greetings.scm
git add alice/packages/greetings.scm
@end example

You can name your package modules however you like; the main constraint to
keep in mind is to avoid name clashes with other package collections, which
is why our hypothetical Alice wisely chose the @code{(alice packages
@dots{})} name space.

Note that you can also place modules in a sub-directory of the repository;
@pxref{Módulos de paquetes en un subdirectorio}, for more info on that.

@item
With this first module in place, the next step is to test the packages it
provides.  This can be done with @command{guix build}, which needs to be
told to look for modules in the Git checkout.  For example, assuming
@code{(alice packages greetings)} provides a package called
@code{hi-from-alice}, Alice will run this command from the Git checkout:

@example
guix build -L. hi-from-alice
@end example

@noindent
... where @code{-L.} adds the current directory to Guile's load path
(@pxref{Load Paths,,, guile, GNU Guile Reference Manual}).

@item
It might take Alice a few iterations to obtain satisfying package
definitions.  Eventually Alice will commit this file:

@example
git commit
@end example

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.

@item
To use Alice's channel, anyone can now add it to their channel file
(@pxref{Especificación de canales adicionales}) and run @command{guix pull}
(@pxref{Invocación de guix pull}):

@example
$EDITOR ~/.config/guix/channels.scm
guix pull
@end example

Guix will now behave as if the root directory of that channel's Git
repository had been permanently added to the Guile load path.  In this
example, @code{(alice packages greetings)} will automatically be found by
the @command{guix} command.
@end enumerate

Voilà!

@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.
@c Updated in 2025 to refer to the Deprecation Policy.
@quotation Aviso
Before you publish your channel, we would like to share a few words of
caution:

@itemize
@item
Antes de publicar un canal, por favor considere contribuir sus definiciones
de paquete al propio Guix (@pxref{Contribución}). 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
Package modules and package definitions are Scheme code that uses various
programming interfaces (APIs).  Those may occasionally change, in accordance
with our deprecation policy (@pxref{Política de amortización}), and it is your
responsibility as a channel author to adjust your code accordingly.

@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



@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

The modules must be @b{underneath} the specified directory, as the
@code{directory} changes Guile's @code{load-path}.  For example, if
@file{.guix-channel} has @code{(directory "base")}, then a module defined as
@code{(define-module (gnu packages fun))} must be located at
@code{base/gnu/packages/fun.scm}.

Doing this allows for only parts of a repository to be used as a channel, as
Guix expects valid Guile modules when pulling.  For instance, @command{guix
deploy} machine configuration files are not valid Guile modules, and
treating them as such would make @command{guix pull} fail.

@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

Before pushing to your public Git repository, you can run @command{guix git
authenticate} to verify that you did sign all the commits you are about to
push with an authorized key:

@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
* Invocación de guix shell::  Crear un entorno de software.
* 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 Invocación de guix shell
@section Invocación de @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

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.

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

Note that it is necessary to include the main @code{python} package in this
command even if it is already installed into your environment.  This is so
that the shell environment knows to set @env{PYTHONPATH} and other related
variables.  The shell environment cannot check the previously installed
environment, because then it would be non-deterministic.  This is true for
most libraries: their corresponding language package should be included in
the shell invocation.

@quotation Nota
@cindex shebang, for @command{guix shell}
@command{guix shell} can be also be used as a script interpreter, also known
as @dfn{shebang}.  Here is an example self-contained Python script making
use of this feature:

@example
#!/usr/bin/env -S guix shell python python-numpy -- python3
import numpy
print("This is numpy", numpy.version.version)
@end example

You may pass any @command{guix shell} option, but there's one caveat: the
Linux kernel has a limit of 127 bytes on shebang length.
@end quotation

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, which:
@itemize
@item comparte acceso de red con el host
@item inherits host's environment variables @code{DISPLAY} and @code{XAUTHORITY}
@item has access to host's authentication records from the @code{XAUTHORITY}
file
@item has no information about host's current directory
@end itemize

@example
guix shell --container --network --no-cwd ungoogled-chromium \
  --preserve='^XAUTHORITY$' --expose="$@{XAUTHORITY@}" \
  --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{Escribir manifiestos}, 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}
Crea un entorno conteniendo los paquetes instalados en @var{perfil}.
Utilice @command{guix package} (@pxref{Invocación de guix package}) para crear y
gestionar perfiles.

@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 --writable-root
When using @option{--container}, this option makes the root file system
writable (it is read-only by default).

@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.

@cindex nested containers, for @command{guix shell}
@cindex container nesting, for @command{guix shell}
@item --nesting
@itemx -W
When used with @option{--container}, provide Guix @emph{inside} the
container and arrange so that it can interact with the build daemon that
runs outside the container.  This is useful if you want, within your
isolated container, to create other containers, as in this sample session:

@example
$ guix shell -CW coreutils
[env]$ guix shell -C guile -- guile -c '(display "hello!\n")'
hello!
[env]$ exit
@end example

The session above starts a container with @code{coreutils} programs
available in @env{PATH}.  From there, we spawn @command{guix shell} to
create a @emph{nested} container that provides nothing but Guile.

Another example is evaluating a @file{guix.scm} file that is untrusted, as
shown here:

@example
guix shell -CW -- guix build -f guix.scm
@end example

The @command{guix build} command as executed above can only access the
current directory.

Under the hood, the @option{-W} option does several things:

@itemize
@item
map the daemon's socket (by default @file{/var/guix/daemon-socket/socket})
inside the container;
@item
map the whole store (by default @file{/gnu/store}) inside the container such
that store items made available by nested @command{guix} invocations are
visible;
@item
add the currently-used @command{guix} command to the profile in the
container, such that @command{guix describe} returns the same state inside
and outside the container;
@item
share the cache (by default @file{~/.cache/guix}) with the host, to speed up
operations such as @command{guix time-machine} and @command{guix shell}.
@end itemize

@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{Invocación de 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{Invocación de 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}
Crea un entorno conteniendo los paquetes instalados en @var{perfil}.
Utilice @command{guix package} (@pxref{Invocación de guix package}) para crear y
gestionar perfiles.

@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
where @var{file} is the image returned by @command{guix pack}, and
@code{guile-guile-readline} is its ``image tag''.  See the
@uref{https://docs.docker.com/engine/reference/commandline/load/, Docker
documentation} for more information.

@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}.

@cindex AppImage, create an AppImage file with @command{guix pack}
Another format internally based on SquashFS is @uref{https://appimage.org/,
AppImage}. An AppImage file can be created and executed without any special
privileges:

@example
file=$(guix pack -f appimage --entry-point=bin/guile guile)
$file --help
@end example

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
This produces a tarball that follows the
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
Docker Image Specification}.  By default, the ``repository name'' as it
appears in the output of the @command{docker images} command is computed
from package names passed on the command line or in the manifest file.
Alternatively, the ``repository name'' can also be configured via the
@option{--image-tag} option.  Refer to @option{--help-docker-format} for
more information on such advanced options.

@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
@cindex Debian, build a .deb package with guix pack
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.  You can nonetheless
pack as many Guix packages as you want in one such archive.
@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

@item rpm
@cindex RPM, build an RPM archive with guix pack
This produces an RPM archive (a package with the @samp{.rpm} file extension)
containing all the specified binaries and symbolic links, that can be
installed on top of any RPM-based GNU/Linux distribution.  The RPM format
embeds checksums for every file it contains, which the @command{rpm} command
uses to validate the integrity of the archive.

Advanced RPM-related options are revealed via the @option{--help-rpm-format}
option.  These options allow embedding maintainer scripts that can run
before or after the installation of the RPM archive, for example.

The RPM format supports relocatable packages via the @option{--prefix}
option of the @command{rpm} command, which can be handy to install an RPM
package to a specific prefix.

@example
guix pack -f rpm -R -C xz -S /usr/bin/hello=bin/hello hello
@end example

@example
sudo rpm --install --prefix=/opt /gnu/store/...-hello.rpm
@end example

@quotation Nota
Contrary to Debian packages, conflicting but @emph{identical} files in RPM
packages can be installed simultaneously, which means multiple @command{guix
pack}-produced RPM packages can usually be installed side by side without
any problem.
@end quotation

@quotation Aviso
@command{rpm} assumes ownership of any files contained in the pack, which
means it will remove @file{/gnu/store} upon uninstalling a Guix-generated
RPM package, unless the RPM package was installed with the @option{--prefix}
option of the @command{rpm} command.  It is unwise to install Guix-produced
@samp{.rpm} packages on a system where @file{/gnu/store} is shared by other
software, such as a Guix installation or other, non-rpm packs.
@end quotation

@item appimage
@cindex AppImage, create an AppImage file with @command{guix pack}
This produces an @uref{https://appimage.org/, AppImage file} with the
@samp{.AppImage} extension.  AppImage is a SquashFS volume prefixed with a
runtime that mounts the SquashFS file system and executes the binary
provided with @option{--entry-point}.  This results in a self-contained
archive that bundles the software and all its requirements into a single
file.  When the file is made executable it runs the packaged software.

@example
guix pack -f appimage --entry-point=bin/vlc vlc
@end example

The runtime used by AppImages invokes the @command{fusermount3} command to
mount the image quickly.  If that command is unavailable, the AppImage fails
to run, but it can still be started by passing the
@option{--appimage-extract-and-run} flag.

@quotation Aviso
When building an AppImage, always @emph{pass} the @option{--relocatable}
option (or @option{-R}, or @option{-RR}) to make sure the image can be used
on systems where Guix is not installed.  A warning is printed when this
option is not used.
@end quotation

@example
guix pack -f appimage --entry-point=bin/hello --relocatable hello
@end example

@quotation Nota
The resulting AppImage does not conform to the complete standard as it
currently does not contain a @file{.DirIcon} file.  This does not impact
functionality of the AppImage itself, but possibly that of software used to
manage AppImages.
@end quotation

@quotation Nota
As the generated AppImage packages the complete dependency graph, it will be
larger than comparable AppImage files found online, which depend on host
system libraries.
@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 entry point, for Docker and Singularity images
@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},
@code{appimage} 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

@cindex entry point arguments, for docker images
@item --entry-point-argument=@var{command}
@itemx -A @var{command}
Use @var{command} as an argument to @dfn{entry point} of the resulting
pack.  This option is only valid in conjunction with @code{--entry-point}
and can appear multiple times on the command line.

@example
guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
@end example

@cindex maximum layers argument, for docker images
@item --max-layers=@code{n}
Specifies the maximum number of Docker image layers allowed when building an
image.

@example
guix pack -f docker --max-layers=100 guile
@end example

This option allows you to limit the number of layers in a Docker image.
Docker images are comprised of multiple layers, and each layer adds to the
overall size and complexity of the image.  By setting a maximum number of
layers, you can control the following effects:

@itemize
@item Disk Usage:
Increasing the number of layers can help optimize the disk space required to
store multiple images built with a similar package graph.

@item Pulling:
When transferring images between different nodes or systems, having more
layers can reduce the time required to pull the image.
@end itemize

@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}}).

@item --file=@var{archivo}
Build a pack containing the package or other object the code within
@var{file} evaluates to.

This has the same purpose as the same-named option in @command{guix build}
(@pxref{Opciones de construcción adicionales, @option{--file} in @command{guix build}}),
but it has no shorthand, because @option{-f} already means
@option{--format}.

@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{Escribir manifiestos}, 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}
@cindex authentication, of Git checkouts
@cindex Git checkout authentication

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

@cindex introduction, for Git authentication
By default, this command authenticates the Git checkout in the current
directory; it outputs nothing and exits with exit code zero on success and
non-zero on failure.  @var{commit} above denotes the first commit where
authentication takes place, and @var{signer} is the OpenPGP fingerprint of
public key used to sign @var{commit}.  Together, they form a @dfn{channel
introduction} (@pxref{channel-authentication, channel introduction}).  On
your first successful run, the introduction is recorded in the
@file{.git/config} file of your checkout, allowing you to omit them from
subsequent invocations:

@example
guix git authenticate [@var{options}@dots{}]
@end example

Should you have branches that require different introductions, you can
specify them directly in @file{.git/config}.  For example, if the branch
called @code{personal-fork} has a different introduction than other
branches, you can extend @file{.git/config} along these lines:

@smallexample
[guix "authentication-personal-fork"]
	introduction-commit = cabba936fd807b096b48283debdcddccfea3900d
	introduction-signer = C0FF EECA BBA9 E6A8 0D1D  E643 A2A0 6DF2 A33A 54FA
	keyring = keyring
@end smallexample

The first run also attempts to install pre-push and post-merge hooks, such
that @command{guix git authenticate} is invoked as soon as you run
@command{git push}, @command{git pull}, and related commands; it does not
overwrite preexisting hooks though.

Las opciones de línea de comando descrita a continuación le permite ajuste
fino del 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 --end=@var{commit}
Autentica revisiones hasta @var{commit}.

@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.

This chapter describes all these APIs in turn, starting from high-level
package definitions.  @xref{Estructura del árbol de código fuente}, for a more general
overview of the source code.

@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.
* Escribir manifiestos::     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
* Utilizar interactivamente Guix::  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{Modules,
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
     (list #:configure-flags #~(list "--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 registro @code{<package>}
(@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"}.

@quotation Quick start
Impatient? With luck, you may be able to import part or all of the
definition of the package you are interested in from another repository,
using the @code{guix import} command (@pxref{Invocación de guix import}).

Alternatively, try out the
@uref{https://guix-hpc.gitlabpages.inria.fr/guix-packager/, Guix-Packager
interface} in your web browser to produce a preliminary package definition.
@end quotation

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}.

The value of the @code{arguments} field is a list of arguments passed to the
build system and that end up being applied, as with @code{apply} (@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile Reference Manual}).

@cindex keyword arguments, for build systems
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}).

@findex #~
@findex gexp
@cindex staging, for build system arguments
@cindex code staging, in package definitions
What about these hash-tilde (@code{#~}) characters? This is Guix-specific
syntax introducing a so-called @dfn{G-expression} (@pxref{Expresiones-G}),
which denotes code that is @dfn{staged} for eventual evaluation: this staged
code is only evaluated if and when attempting to build the package, by the
build daemon.  In this example, the staged code is the @code{(list @dots{})}
expression, which builds a list of one element, the configure flag.

@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} package-derivation almacén paquete [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} package-derivation almacén paquete [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{'()})
Los parámetros que deben ser pasados al sistema de construcción
(@pxref{Sistemas de construcción}).  Es una lista que normalmente contiene una
secuencia de pares de palabra clave y valor como en este ejemplo:

@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}).

The REPL has dedicated commands to interactively inspect values of some of
these arguments, as a convenient debugging aid (@pxref{Utilizar interactivamente Guix}).

@quotation Compatibility Note
Until version 1.3.0, the @code{arguments} field would typically use
@code{quote} (@code{'}) or @code{quasiquote} (@code{`}) and no
G-expressions, like so:

@lisp
(package
  ;; several fields omitted
  (arguments   ;old-style quoted arguments
   '(#:tests? #f
     #:configure-flags '("--enable-frobbing"))))
@end lisp

To convert from that style to the one shown above, you can run @code{guix
style -S arguments @var{package}} (@pxref{Invoking guix style}).
@end quotation

@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

@defmac 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 defmac

The following helper procedures are provided to help deal with package
inputs.

@deffn {Procedure} lookup-package-input package name
@deffnx {Procedure} lookup-package-native-input package name
@deffnx {Procedure} lookup-package-propagated-input package name
@deffnx {Procedure} lookup-package-direct-input package 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 or the file name of an origin 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}.

When looking up an origin, use the name that appears in the origin's
@code{file-name} field or its default file name---e.g.,
@code{"foo-1.2.tar.gz"}.
@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 {Procedure} package-development-inputs package [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} package-with-c-toolchain paquete 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. @xref{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}
Un proceimiento monádico que trata la URI proporcionada. El procedimiento
debe aceptar al menos tres parámetros: el valor del campo @code{uri}, el
algoritmo de hash y su valor especificados en el campo @code{hash}. Debe
devolver un elemento del almacén o una derivación en la mónada del almacén
(@pxref{La mónada del almacén}); la mayoría de los métodos devuelven una
derivación de salida fija (@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} url-fetch url algo-hash 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} git-fetch ref algo-hash hash [nombre]
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

@deffn {Procedimiento} git-fetch/lfs ref algo-hash hash [nombre]
This is a variant of the @code{git-fetch} procedure that supports the Git
@acronym{LFS, Large File Storage} extension.  This may be useful to pull
some binary test data to run the test suite of a package, for example.
@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 {Procedure} hg-fetch ref hash-algo 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{#f}.
@end deffn

@deftp {Data Type} hg-reference
This data type represents a Mercurial reference for @code{hg-fetch} to
retrieve.

@table @asis
@item @code{url}
The URL of the Mercurial repository to clone.

@item @code{changeset}
This string denotes the changeset to fetch.
@end table
@end deftp

For Subversion repositories, the module @code{(guix svn-download)} defines
the @code{svn-fetch} origin method and @code{svn-reference} data type for
support of the Subversion version control system.

@deffn {Procedure} svn-fetch ref hash-algo hash [name]
Devuelve una derivación de salida fija que obtiene @var{ref}, un objeto
@code{<svn-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 {Data Type} svn-reference
This data type represents a Subversion reference for @code{svn-fetch} to
retrieve.

@table @asis
@item @code{url}
The URL of the Subversion repository to clone.

@item @code{revision}
This string denotes the revision to fetch specified as a number.

@item @code{recursive?} (predeterminado: @code{#f})
This Boolean indicates whether to recursively fetch Subversion
``externals''.

@item @code{user-name} (default: @code{#f})
The name of an account that has read-access to the repository, if the
repository isn't public.

@item @code{password} (predeterminada: @code{#f})
Password to access the Subversion repository, if required.
@end table
@end deftp

For Bazaar repositories, the module @code{(guix bzr-download)} defines the
@code{bzr-fetch} origin method and @code{bzr-reference} data type for
support of the Bazaar version control system.

@deffn {Procedure} bzr-fetch ref hash-algo hash [name]
Devuelve una derivación de salida fija que obtiene @var{ref}, un objeto
@code{<bzr-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 {Data Type} bzr-reference
This data type represents a Bazaar reference for @code{bzr-fetch} to
retrieve.

@table @asis
@item @code{url}
The URL of the Bazaar repository to clone.

@item @code{revision}
This string denotes revision to fetch specified as a number.
@end table
@end deftp

For CVS repositories, the module @code{(guix cvs-download)} defines the
@code{cvs-fetch} origin method and @code{cvs-reference} data type for
support of the Concurrent Versions System (CVS).

@deffn {Procedure} cvs-fetch ref hash-algo hash [name]
Devuelve una derivación de salida fija que obtiene @var{ref}, un objeto
@code{<cvs-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 {Data Type} cvs-reference
This data type represents a CVS reference for @code{cvs-fetch} to retrieve.

@table @asis
@item @code{root-directory}
The CVS root directory.

@item @code{module}
Module to fetch.

@item @code{revision}
Revision to fetch.
@end table

The example below denotes a version of gnu-standards to fetch:

@lisp
(cvs-reference
  (root-directory ":pserver:anonymous@@cvs.savannah.gnu.org:/sources/gnustandards")
  (module "gnustandards")
  (revision "2020-11-25"))
@end lisp

@end deftp

@node Definición de variantes de paquetes
@section Definición de variantes de paquetes

@cindex personalización de paquetes
@cindex variantes de paquetes
Una de las ventajas de Guix es que, dada una definición de paquete, puede
@emph{derivar} fácilmente variantes de dicho paquete---para una versión
diferente del origen, con dependencias u opciones de compilación diferentes,
etcétera. Algunos de estos paquetes personalizados se pueden definir
directamente en la línea de ordenes (@pxref{Opciones de transformación de paquetes}). Esta sección describe cómo definir variantes de paquetes en
código. ¡Esto puede ser útil en «manifiestos» (@pxref{Escribir manifiestos}) y
con su propia colección de paquetes (@pxref{Creación de un canal}) entre otros
usos!

@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

The example above corresponds to what the @option{--with-version} or
@option{--with-source} package transformations option do.  Essentially
@code{hello-2.2} preserves all the fields of @code{hello}, except
@code{version} and @code{source}, which it overrides.  Note that the
original @code{hello} variable is still there, in the @code{(gnu packages
base)} module, unchanged.  When you define a custom package like this, you
are really @emph{adding} a new package definition; the original one remains
available.

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.

@defmac modify-inputs inputs 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.

@item (replace @var{name} @var{replacement})
Replace the package called @var{name} with @var{replacement}.
@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 defmac

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} options->transformation 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} package-input-rewriting reemplazos [nombre-reescrito] @
  [#:deep? #t] [#:recursive? #f]
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.

When @var{recursive?} is true, apply replacements to the right-hand sides of
@var{replacements} as well, recursively.

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} package-input-rewriting/spec @var{reemplazos} @
  [#:deep? #t] [#:replace-hidden? #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{replacements} is a list of spec/procedures pair; each spec is a package
specification such as @code{"gcc"} or @code{"guile@@2"}, and each procedure
takes a matching package and returns a replacement for that package.
Matching packages that have the @code{hidden?} property set are not replaced
unless @var{replace-hidden?} is set to true.
@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 {Procedimiento} package-mapping proc [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

@quotation Tips
Understanding what a variant really looks like can be difficult as one
starts combining the tools shown above.  There are several ways to inspect a
package before attempting to build it that can prove handy:

@itemize
@item
You can inspect the package interactively at the REPL, for instance to view
its inputs, the code of its build phases, or its configure flags
(@pxref{Utilizar interactivamente Guix}).

@item
When rewriting dependencies, @command{guix graph} can often help visualize
the changes that are made (@pxref{Invocación de guix graph}).
@end itemize
@end quotation

@node Escribir manifiestos
@section Escribir manifiestos

@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 14 today, but it might refer to
version 16 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 {Procedure} concatenate-manifests 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 {Procedure} package->manifest-entry package [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 {Procedure} packages->manifest 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 {Procedure} package->development-manifest package [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 {Procedure} specifications->manifest 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)}.

@defvar 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 defvar

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.

@defvar agda-build-system
This variable is exported by @code{(guix build-system agda)}.  It implements
a build procedure for Agda libraries.

It adds @code{agda} to the set of inputs.  A different Agda can be specified
with the @code{#:agda} key.

The @code{#:plan} key is a list of cons cells @code{(@var{regexp}
. @var{parameters})}, where @var{regexp} is a regexp that should match the
@code{.agda} files to build, and @var{parameters} is an optional list of
parameters that will be passed to @code{agda} when type-checking it.

When the library uses Haskell to generate a file containing all imports, the
convenience @code{#:gnu-and-haskell?} can be set to @code{#t} to add
@code{ghc} and the standard inputs of @code{gnu-build-system} to the input
list.  You will still need to manually add a phase or tweak the
@code{'build} phase, as in the definition of @code{agda-stdlib}.

@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar asdf-build-system/source
@defvarx asdf-build-system/sbcl
@defvarx asdf-build-system/ecl
@defvarx asdf-build-system/clasp

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 (@pxref{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 defvar

@defvar 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}.

@quotation Deprecation warning
Parameters @code{#:cargo-inputs} and @code{#:cargo-development-inputs},
previously used for specifying source inputs, are deprecated.  Their support
will be removed after Dec. 31, 2026.
@end quotation

It adds @code{rust} and @code{rust:cargo} to the set of inputs.  A different
Rust package can be specified with the @code{#:rust} parameter.

In its @code{unpack-rust-crates}, @code{configure} and
@code{patch-cargo-checksums} phases, this build system will make any source
inputs available to Cargo.  It will also remove an included
@code{Cargo.lock} file to be recreated by @command{cargo} during the
@code{build} phase.  The @code{package} phase will run @command{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.

This build system supports
@url{https://doc.rust-lang.org/cargo/reference/workspaces.html, Cargo
workspaces}.  Parameter @code{#:cargo-package-crates} (default: @code{''()})
allows specifying names of library crates to package in the @code{package}
phase.  Specified crates are packaged from left to right, in case there's
dependency among them.  For example, specifying @code{''("pcre2-sys"
"pcre2")} will package @code{"pcre2-sys"} first and then @code{"pcre2"}.
Parameter @code{#:cargo-install-paths} (default: @code{''()}) allows
specifying paths of binary crates to install in the @code{install} phase,
@code{''("crates/atuin")}, for example.

@xref{Crates de Rust}, for packaging guidelines.
@end defvar

@defvar 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.

Este sistema de construcción añade @code{chicken} para las entradas del
paquete, así como los paquetes de @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 defvar

@defvar 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
@item When a package has multiple outputs, the @code{#:output} argument
can be used to specify which output label the files should be installed to.
@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}.
@item @code{("foo/doc" "share/my-app/doc" #:output "doc")}: Install
@file{"foo/doc"} to @file{"share/my-app/doc"} within the @code{"doc"}
output.
@end itemize
@end defvar

@defvar vim-build-system
This variable is exported by @code{(guix build-system vim)}.  It is an
extension of the @code{copy-build-system}, installing Vim and Neovim plugins
into locations where these two text editors know to find their plugins,
using their packpaths.

Packages which are prefixed with @code{vim-} will be installed in Vim's
packpath, while those prefixed with @code{neovim-} will be installed in
Neovim's packpath.  If there is a @code{doc} directory with the plugin then
helptags will be generated automatically.

There are a couple of keywords added with the @code{vim-build-system}:
@itemize
@item With @code{plugin-name} it is possible to set the name of the plugin.
While by default this is set to the name and version of the package, it is
often more helpful to set this to name which the upstream author calls their
plugin.  This is the name used for @command{:packadd} from inside Vim.
@item With @code{install-plan} it is possible to augment the built-in
install-plan of the @code{vim-build-system}.  This is particularly helpful
if you have files which should be installed in other locations.  For more
information about using the @code{install-plan}, see the
@code{copy-build-system} (@pxref{Sistemas de construcción, @code{copy-build-system}}).
@item With @code{#:vim} it is possible to add this package to Vim's packpath,
in addition to if it is added automatically because of the @code{vim-}
prefix in the package's name.
@item With @code{#:neovim} it is possible to add this package to Neovim's
packpath, in addition to if it is added automatically because of the
@code{neovim-} prefix in the package's name.
@item With @code{#:mode} it is possible to adjust the path which the plugin is
installed into.  By default the plugin is installed into @code{start} and
other options are available, including @code{opt}.  Adding a plugin into
@code{opt} will mean you will need to run, for example, @command{:packadd
foo} to load the @code{foo} plugin from inside of Vim.
@end itemize
@end defvar

@cindex Clojure (lenguaje de programación)
@cindex sistema de construcción simple de Clojure
@defvar 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 defvar

@defvar 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}.

This build system adds the following keyword parameters to the ones defined
by @code{gnu-build-system}:

@table @code
@item #:cmake
The @code{cmake} package is added to the set of inputs. Which package is
used can be specified with the @code{#:cmake} parameter.

@item #:build-type
The @code{#:build-type} parameter specifies in abstract terms the flags
passed to the compiler; it defaults to @code{"RelWithDebInfo"} (short for
``release mode with debugging information''), which roughly means that code
is compiled with @code{-O2 -g}, as is the case for Autoconf-based packages
by default.

@item #:generator
This parameter specifies the
@url{https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html,
CMake generator} responsible for writing the input files for the native
build system.

@item #:test-exclude
Tests matching this regular expression are excluded from testing by
@url{https://cmake.org/cmake/help/latest/manual/ctest.1.html, ctest}.

@item #:test-repeat-until-pass?
Directs @url{https://cmake.org/cmake/help/latest/manual/ctest.1.html, ctest}
to
@url{https://cmake.org/cmake/help/latest/manual/ctest.1.html#cmdoption-ctest-repeat,
repeat} failed tests up to @code{#:test-repeat-until-pass-count} times and
is enabled by default.

@item #:test-repeat-until-pass-count
When @code{#:test-repeat-until-pass?} is enabled this parameter sets the
maximum number of failures for each test. The default is @code{5}.
@end table
@end defvar

@defvar composer-build-system
This variable is exported by @code{(guix build-system composer)}.  It
implements the build procedure for packages using
@url{https://getcomposer.org/, Composer}, the PHP package manager.

It automatically adds the @code{php} package to the set of inputs.  Which
package is used can be specified with the @code{#:php} parameter.

The @code{#:test-target} parameter is used to control which script is run
for the tests.  By default, the @code{test} script is run if it exists.  If
the script does not exist, the build system will run @code{phpunit} from the
source directory, assuming there is a @file{phpunit.xml} file.
@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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}.

The key @code{#:go} can be used to specify the Go compiler package with
which to build the package.

The phase @code{check} provides a wrapper for @code{go test} which builds a
test binary (or multiple binaries), vets the code and then runs the test
binary.  Build, test and test binary flags can be provided as
@code{#:test-flags} parameter, default is @code{'()}.  See @code{go help
test} and @code{go help testflag} for more details.

The key @code{#:embed-files}, default is @code{'()}, provides a list of
future embedded files or regexps matching files.  They will be copied to
build directory after @code{unpack} phase.  See
@url{https://pkg.go.dev/embed} for more details.

@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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") "\")\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 defvar

@defvar 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 construcció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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar mix-build-system
This is a variable exported by @code{guix build-system mix}.  It implements
the standard build procedure used by Elixr programs with
@url{https://hexdocs.pm/mix/Mix.html,Mix}, which consists of running
@command{mix compile}, thereby creating bytecode.

The API is similar to the @var{gnu-build-system}, with some specifics for
Elixir:
@itemize
@item
@code{#:tests?} is a boolean, @code{#true} by default, determining whether
tests for the current build have to be run or not.
@item
@code{#:test-flags} is a list of arguments append to the @command{mix test}
invocation.  It defaults to @code{'()}.
@item
@code{#:mix-exs}, changes the full path to the @code{mix.exs} file.  It
defaults to @code{"mix.exs"}.  Please refer to
@url{https://hexdocs.pm/mix/Mix.html#module-environment-variables,upstream}
documentation for more details.
@item
@code{#:mix-path}, appends extra code paths.  It defaults to @code{#f}.
Please refer to
@url{https://hexdocs.pm/mix/Mix.html#module-environment-variables,upstream}
documentation for more details.
@end itemize
@end defvar

@defvar mozilla-build-system
This variable is exported by @code{(guix build-system mozilla)}.  It sets
the @code{--target} and @code{--host} configuration flags to what software
developed by Mozilla expects -- due to historical reasons, Mozilla software
expects @code{--host} to be the system that is cross-compiled from and
@code{--target} to be the system that is cross-compiled to, contrary to the
standard Autotools conventions.
@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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{#:configure-flags} is changed. Instead of a list this option must be a
JSON object, whose interpretation depends on the build backend. For instance
the example from @url{https://peps.python.org/pep-0517/#config-settings,PEP
517} should be written as @code{'(@@ ("CC" "gcc") ("--global-option"
("--some-global-option")) ("--build-option" ("--build-option1"
"--build-option2")))}
@item
@code{#:backend-path} is added.  It defaults to @code{#false}, but when set
to a list it will be appended to Python’s search path and overrides the
definition in @file{pyproject.toml}.
@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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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.

By default it tries to run @code{luatex} on all @file{.ins} files, and if it
fails to find any, on all @file{.dtx} files.  A different engine and format
can be specified with, respectively, the @code{#:tex-engine} and
@code{#:tex-format} arguments.  Different build targets can be specified
with the @code{#:build-targets} argument, which expects a list of file
names.

It also generates font metrics (i.e., @file{.tfm} files) out of Metafont
files whenever possible.  Likewise, it can also create TeX formats (i.e.,
@file{.fmt} files) listed in the @code{#:create-formats} argument, and
generate a symbolic link from @file{bin/} directory to any script located in
@file{texmf-dist/scripts/}, provided its file name is listed in
@code{#:link-scripts} argument.

The build system adds @code{texlive-bin} from @code{(gnu packages tex)} to
the native inputs.  It can be overridden with the @code{#:texlive-bin}
argument.

The package @code{texlive-latex-bin}, from the same module, contains most of
the tools for building TeX Live packages; for convenience, it is also added
by default to the native inputs.  However, this can be troublesome when
building a dependency of @code{texlive-latex-bin} itself.  In this
particular situation, the @code{#:texlive-latex-bin?} argument should be set
to @code{#f}.
@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar zig-build-system
This variable is exported by @code{(guix build-system zig)}.  It implements
the build procedures for the @uref{https://ziglang.org/, Zig} build system
(@command{zig build} command).

Este sistema de construcción añade @code{zig} a las entradas del paquete,
así como los paquetes de @code{gnu-build-system}.

This build system by default installs package source to output.  This
behavior can be disabled by setting @code{#:install-source?} parameter to
@code{#f}.

For packages that don't install anything and don't come with a test suite
(likely library packages to be used by other Zig packages), you can set
@code{#:skip-build?} parameter to @code{#t}, which skips @code{build} and
@code{check} phases.

The @code{configure} phase sets up environment for @command{zig build}.  You
need to add custom phases after it if you want to invoke @command{zig}.

The @code{#:zig-build-flags} parameter is a list of flags that are passed to
@command{zig build} in @code{build} phase.  The @code{#:zig-test-flags}
parameter is a list of flags that are passed to @command{zig build test} in
@code{check} phase.  The default compiler package can be overridden with the
@code{#:zig} parameter.

The optional @code{#:zig-release-type} parameter declares the type of
release.  Possible values are: @code{"safe"}, @code{"fast"}, or
@code{"small"}.  The default value is @code{#f}, which causes the release
flag to be omitted from the @code{zig} command and results in a
@code{"debug"} build.
@end defvar

@defvar 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 defvar

@defvar hare-build-system
This variable is exported by @code{(guix build-system hare)}.  It implements
the Makefile build process typically used by Hare packages, removing the
@code{configure} phase used by @code{gnu-build-system} and modifying
existing phases to set the Hare architecture tag, module path, and package
install destinations appropriately.

This relies on the package's Makefile supporting, at minimum, the variables
@code{HAREFLAGS} and @code{THIRDPARTYDIR}.  Packages may set
@code{make-flags} to override or supplement these variables.

By default, Hare modules are installed to the @code{lib} output if it
exists, and all other files to the @code{bin} output. If an output does not
exist, the default @code{out} output is used instead. This behavior may be
overriden through the @code{#:binary-output} and @code{#:module-output}
keyword arguments.

@code{(guix build-system hare)} also provides utility definitions for
creating Hare packages.  The variable @code{%hare-supported-systems} is the
list of build targets currently supported by @code{hare}, for use in
@code{supported-systems} (@pxref{Referencia de package}).  The procedure
@code{target->hare-arch} may be used to get the Hare architecture tag for a
given (supported) Guix target or system.
@end defvar

@defvar 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 defvar

@defvar 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 defvar

@anchor{emacs-build-system}
@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar tree-sitter-build-system

This variable is exported by @code{(guix build-system tree-sitter)}.  It
implements procedures to compile grammars for the
@url{https://tree-sitter.github.io/tree-sitter/, Tree-sitter} parsing
library.  It essentially runs @code{tree-sitter generate} to translate
@code{grammar.js} grammars to JSON and then to C.  Which it then compiles to
native code.

Tree-sitter packages may support multiple grammars, so this build system
supports a @code{#:grammar-directories} keyword to specify a list of
locations where a @code{grammar.js} file may be found.

Grammars sometimes depend on each other, such as C++ depending on C and
TypeScript depending on JavaScript.  You may use inputs to declare such
dependencies.

@end defvar

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.

@defvar 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 defvar

@defvar 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).

Optionally, a @code{#:channels} argument specifying additional channels can
be provided.

The resulting package is a Guix instance of the given channel(s), similar to
how @command{guix time-machine} would build it.
@end defvar

@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
     (list
      #:phases
      #~(modify-phases %standard-phases
          (delete 'configure)
          (add-before 'build 'set-prefix-in-makefile
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Modify the makefile so that its
              ;; 'PREFIX' variable points to #$output and
              ;; 'XMLLINT' points to the correct path.
              (substitute* "Makefile"
                (("PREFIX =.*")
                 (string-append "PREFIX = " #$output "\n"))
                (("XMLLINT =.*")
                 (string-append "XMLLINT = "
                                (search-input-file inputs "/bin/xmllint")
                                "\n"))))))))))
@end lisp

The new phase that is inserted is written as an anonymous procedure,
introduced with @code{lambda*}; it looks for the @file{xmllint} executable
under a @file{/bin} directory among the package's inputs (@pxref{Referencia de package}).  It also honors the @code{outputs} parameter we have seen
before.  @xref{Utilidades de construcción}, for more about the helpers used by this
phase, and for more examples of @code{modify-phases}.

@quotation Tip
You can inspect the code associated with a package's @code{#:phases}
argument interactively, at the REPL (@pxref{Utilizar interactivamente Guix}).
@end quotation

@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{#~}, una almohadilla-tilde): 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} %store-directory
Devuelve el nombre del directorio del almacén.
@end deffn

@deffn {Procedimiento} store-file-name? archivo
Devuelve verdadero si @var{archivo} está en el almacén.
@end deffn

@deffn {Procedimiento} strip-store-file-name 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} package-name>name+version 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} directory-exists? dir
Devuelve @code{#t} si @var{dir} existe y es un directorio.
@end deffn

@deffn {Procedimiento} executable-file archivo
Devuelve @code{#t} si @var{archivo} existe y es ejecutable.
@end deffn

@deffn {Procedimiento} symbolic-link? archivo
Devuelve @code{#t} si @var{archivo} es enlace simbólico (``symlink'').
@end deffn

@deffn {Procedimiento} elf-file? archivo
@deffnx {Procedimiento} ar-file? archivo
@deffnx {Procedimiento} gzip-file? 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} reset-gzip-timestamp 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}).

@defmac with-directory-excursion directorio 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 defmac

@deffn {Procedimiento} mkdir-p dir
Crea el directorio @var{dir} y todos sus predecesores.
@end deffn

@deffn {Procedimiento} install-file file directorio
Crea @var{directorio} si no existe y copia @var{archivo} allí con el mismo
nombre.
@end deffn

@deffn {Procedimiento} make-file-writable archivo
Activa el permiso de escritura en @var{archivo} para su propietaria.
@end deffn

@deffn {Procedimiento} copy-recursively fuente destino @
  [#:log (current-output-port)] [#:follow-symlinks? #f] @ [#:copy-file
copy-file] [#:keep-mtime? #f] [#:keep-permissions? #t] @ [#:select? (const
#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.  Call @var{select?}, taking two
arguments, @var{file} and @var{stat}, for each entry in @var{source}, where
@var{file} is the entry's absolute file name and @var{stat} is the result of
@code{lstat} (or @code{stat} if @var{follow-symlinks?} is true); exclude
entries for which @var{select?} does not return true.  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} delete-file-recursively 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

@defmac substitute* archivo @
  ((expreg var-encontrada@dots{}) 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* archivo
  (("hola")
   "buenos días\n")
  (("algo([a-z]+)otro(.*)$" todo letras fin)
   (string-append "cosa" letras fin)))
@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.

Be careful about using @code{$} to match the end of a line; by itself it
won't match the terminating newline of a line.  For example, to match a
whole line ending with a backslash, one needs a regex like
@code{"(.*)\\\\\n$"}.
@end defmac

@subsection Búsqueda de archivos

@cindex archivo, buscar
Esta sección documenta procedimientos de búsqueda y filtrado de archivos.

@deffn {Procedimiento} file-name-predicate 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} find-files dir [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} which 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 {Procedure} search-input-file inputs name
@deffnx {Procedure} search-input-directory inputs 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 {Procedure} invoke program 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 {Procedure} invoke-error? c
Return true if @var{c} is an @code{&invoke-error} condition.
@end deffn

@deffn {Procedure} invoke-error-program c
@deffnx {Procedure} invoke-error-arguments c
@deffnx {Procedure} invoke-error-exit-status c
@deffnx {Procedure} invoke-error-term-signal c
@deffnx {Procedure} invoke-error-stop-signal c
Access specific fields of @var{c}, an @code{&invoke-error} condition.
@end deffn

@deffn {Procedure} report-invoke-error c [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 {Procedure} invoke/quiet program 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
@defmac modify-phases fases 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 defmac

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 {Procedure} wrap-program program [#:sh sh] [#:rest 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 {Procedure} wrap-script program [#:guile guile] [#:rest 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{Invocación de 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:

@c This is defined at (guix search-paths) as $XML_CATALOG_FILES.
@lisp
(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 @env{XML_CATALOG_FILES} 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 @env{XML_CATALOG_FILES} 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)}.

@defvar $SGML_CATALOG_FILES
@defvarx $XML_CATALOG_FILES
These two search paths indicate where the
@url{https://www.oasis-open.org/specs/a401.htm,TR9401 catalog}@footnote{
Alternatively known as SGML catalog.} or
@url{https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html,
XML catalog} files can be found.
@end defvar

@defvar $SSL_CERT_DIR
@defvarx $SSL_CERT_FILE
These two search paths indicate where X.509 certificates can be found
(@pxref{Certificados X.509}).
@end defvar

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 {Procedure} evaluate-search-paths search-paths directories [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 store
@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{Contribución}).
@end quotation
@end defvr

@deffn {Procedimiento} open-connection [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} close-connection servidor
Cierra la conexión al @var{servidor}.
@end deffn

@defvar 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 defvar

Los procedimientos que realizan RPCs toman todos como primer parámetro un
objeto servidor.

@cindex elementos del almacén no válidos
@deffn {Procedimiento} valid-path? servidor ruta
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} add-text-to-store servidor nombre texto [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} build-derivations almacén derivaciones [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
The inputs of the derivation---i.e., its build-time dependencies---which may
be other derivations or plain files in the store (patches, build scripts,
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} derivation almacén nombre constructor 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} build-expression->derivation almacén nombre 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{Utilizar interactivamente Guix}).  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{Utilizar interactivamente Guix}).

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.

@defmac with-monad monad body @dots{}
Evalúa cualquier forma @code{>>=} o @code{return} en @var{cuerpo} como
estando en @var{mónada}.
@end defmac

@defmac return val
Devuelve el valor monádico que encapsula @var{val}.
@end defmac

@defmac >>= mval mproc @dots{}
@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 defmac

@defmac mlet mónada ((var mval) @dots{}) cuerpo @dots{}
@defmacx mlet* mónada ((var mval) @dots{}) cuerpo @dots{}
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 defmac

@defmac mbegin monad mexp @dots{}
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 defmac

@defmac mwhen condition mexp0 mexp* @dots{}
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 defmac

@defmac munless condition mexp0 mexp* @dots{}
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 defmac

@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.

@defvar %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.  Eso devuelve el cuadrado de su argumento,
pero además incremente el valor de estado actual:

@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 defvar

@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} run-with-state mval [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.

@defvar %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 defvar

@deffn {Procedimiento} run-with-store almacén 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.

@defmac #~@var{exp}
@defmacx (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}).

Sometimes a gexp unconditionally refers to the @code{"out"} output, but the
user of that gexp would still like to insert a reference to another output.
The @code{gexp-input} procedure aims to address that.  @xref{gexp-input}.

@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 defmac

@defmac with-imported-modules módulos 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 defmac

@defmac with-extensions extensiones 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 defmac

@deffn {Procedimiento} gexp? 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{file-name} @var{obj})
(@var{file-name} @var{obj} @var{output})
(@var{file-name} @var{gexp-input})
(@var{file-name} @var{store-item})
@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} local-file archivo [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.

@findex assume-valid-file-name
@var{file} can be wrapped in the @code{assume-valid-file-name} syntactic
keyword. When this is done, there will not be a warning when
@code{local-file} is used with a non-literal path.  The path is still looked
up relative to the current working directory at run time.  Wrapping is done
like this:

@lisp
(define alice-key-file-path "alice.pub")
;; ...
(local-file (assume-valid-file-name alice-key-file-path))
@end lisp

@cindex relative file name, in @code{local-file}
@findex assume-source-relative-file-name
@var{file} can be wrapped in the @code{assume-source-relative-file-name}
syntactic keyword.  When this is done, the file name will be looked up
relative to the source file where it appears even when it is not a string
literal.

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} plain-file nombre 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} computed-file @var{nombre} @var{gexp} @
  [#:guile] [#: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 'current]
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} program-file nombre 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)] @
  [#:system (%current-system)] [#:target 'current]
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-file nombre exp [#:splice? #f] @
           [#:guile #f] [#:set-load-path? #t] Return an object representing the Scheme
file @var{name} that contains @var{exp}.  @var{guile} is the Guile package
used to produce that file.

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} mixed-text-file nombre 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} file-union nombre archivos [#:dangling-symlinks? #f]
Return a @code{<computed-file>} that builds a directory containing all of
@var{files}.  Each item in @var{files} must be a two-element list where the
first element is the file name to use in the new directory, and the second
element is a gexp denoting the target file.  @code{#:dangling-symlinks?}
controls if gexps must lower to an existing file.  Here's an example:

@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 {Procedure} symlink-to target
Return a @code{<computed-file>} that is a symbolic link to target.  Note,
that the target does not need to exist at the build time.  One of uses is to
put arbitrary symlinks into user's home:

@lisp
(service home-files-service-type
  `(("Sync" ,(symlink-to "/storage/Sync"))))
@end lisp
@end deffn

@deffn {Procedimiento} directory-union nombre 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} file-append obj 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

@defmac let-system sistema cuerpo@dots{}
@defmacx let-system (sistema objetivo) 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 defmac

@defmac with-parameters ((parámetro valor) @dots{}) 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 defmac

@anchor{gexp-input}
@deffn {Procedure} gexp-input @var{obj} [@var{output}] [#:native? #f]
Return a @dfn{gexp input} record for the given @var{output} of file-like
object @var{obj}, with @code{#:native?} determining whether this is a native
reference (as with @code{ungexp-native}) or not.

This procedure is helpful when you want to pass a reference to a specific
output of an object to some procedure that may not know about that output.
For example, assume you have this procedure, which takes one file-like
object:

@lisp
(define (make-symlink target)
  (computed-file "the-symlink"
                 #~(symlink #$target #$output)))
@end lisp

Here @code{make-symlink} can only ever refer to the default output of
@var{target}---the @code{"out"} output (@pxref{Paquetes con múltiples salidas}).  To have it refer to, say, the @code{"lib"} output of the
@code{hwloc} package, you can call it like so:

@lisp
(make-symlink (gexp-input hwloc "lib"))
@end lisp

You can also compose it like any other file-like object:

@lisp
(make-symlink
  (file-append (gexp-input hwloc "lib") "/lib/libhwloc.so"))
@end lisp
@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 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

To make a script that launches an interactive REPL directly from the shell,
use the @code{--interactive} flag:

@example
@code{#!/usr/bin/env -S guix repl --interactive}
@code{!#}
@end example

Without a file name argument, a Guile REPL is started, allowing for
interactive use (@pxref{Utilizar interactivamente Guix}):

@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 --list-types
Display the @var{TYPE} options for @command{guix repl --type=TYPE} and exit.

@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 --interactive
@itemx -i
Launch the interactive REPL after @var{file} is executed.

@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 Utilizar interactivamente Guix
@section Utilizar interactivamente Guix

@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

As a packager, you may be willing to inspect the build phases or flags of a
given package; this is particularly useful when relying a lot on inheritance
to define package variants (@pxref{Definición de variantes de paquetes}) or when
package arguments are a result of some computation, both of which can make
it harder to foresee what ends up in the package arguments.  Additional
commands let you inspect those package arguments:

@example
scheme@@(guix-user)> ,phases grep
$1 = (modify-phases %standard-phases
       (add-after 'install 'fix-egrep-and-fgrep
         (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")))))))
scheme@@(guix-user)> ,configure-flags findutils
$2 = (list "--localstatedir=/var")
scheme@@(guix-user)> ,make-flags binutils
$3 = '("MAKEINFO=true")
@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} build-options @var{options}
Set build options for rest of the REPL commands to @var{options}.  Must be a
list of keywords with values accepted by procedure @code{(@@ (guix store)
set-build-options)}.  An example would be:

@example
,build-options '(#:offload? #f)
@end example
@end deffn

@deffn {REPL command} graft? @var{graft?}
Set whether grafts should be performed as part of the build.  Equivalent to
@code{--no-grafts} argument to @code{guix build}.
@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}
Cambia verborrea de construcción para @var{nivel}

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} phases @var{package}
@deffnx {REPL command} configure-flags @var{package}
@deffnx {REPL command} make-flags @var{package}
These REPL commands return the value of one element of the @code{arguments}
field of @var{package} (@pxref{Referencia de package}): the first one show the
staged code associated with @code{#:phases} (@pxref{Fases de construcción}), the
second shows the code for @code{#:configure-flags}, and @code{,make-flags}
returns the code for @code{#:make-flags}.
@end deffn

@deffn {REPL command} run-in-store @var{exp}
Run @var{exp}, a monadic expression, 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}.

For instance, the following command builds Guix, but replaces its dependency
on the current stable version of Guile with a dependency on the legacy
version of Guile, @code{guile@@2.2}:

@example
guix build --with-input=guile=guile@@2.2 guix
@end example

This is a recursive, deep replacement.  So in this example, both @code{guix}
and its dependency @code{guile-json} (which also depends on @code{guile})
get rebuilt against @code{guile@@2.2}.

This is implemented using the @code{package-input-rewriting/spec} Scheme
procedure (@pxref{Definición de paquetes, @code{package-input-rewriting/spec}}).

@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 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
Build @var{package} from the latest commit of the @code{master} branch of
the Git repository at @var{url}.  Git sub-modules of the repository are
fetched, recursively, if @var{package} @code{source} is not a Git
repository, otherwise it depends on the inherited value of
@code{recursive?}.

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 configure flags, changing them
@item --with-configure-flag=@var{package}=@var{flag}
Append @var{flag} to the configure flags of @var{package}, where
@var{package} is a spec such as @code{guile@@3.0} or @code{glibc}.  The
build system of @var{package} must support the @code{#:configure-flags}
argument.

For example, the command below builds GNU@tie{}Hello with the configure flag
@code{--disable-nls}:

@example
guix build hello --with-configure-flag=hello=--disable-nls
@end example

The following command passes an extra flag to @command{cmake} as it builds
@code{lapack}:

@example
guix build lapack \
  --with-configure-flag=lapack=-DBUILD_SHARED_LIBS=OFF
@end example

@quotation Nota
Esta opción funciona en su implementación interna proporcionando
@samp{#:configure-flags} 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 se emite un
error.
@end quotation

@cindex upstream, latest version
@item --with-latest=@var{package}
@itemx --with-version=@var{package}=@var{version}
So you like living on the bleeding edge? The @option{--with-latest} 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

The @option{--with-version} works similarly except that it lets you specify
that you want precisely @var{version}, assuming that version exists
upstream.  For example, to spawn a development environment with SciPy built
against version 1.22.4 of NumPy (skipping its test suite because hey, we're
not gonna wait this long), you would run:

@example
guix shell python python-scipy --with-version=python-numpy=1.22.4
@end example

@quotation Aviso
Because they depend on source code published at a given point in time on
upstream servers, deployments made with @option{--with-latest} and
@option{--with-version} may be non-reproducible: source might disappear or
be modified in place on the servers.

To deploy old software versions without compromising on reproducibility,
@pxref{Invocación de guix time-machine, @command{guix time-machine}}.
@end quotation

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! When those limitations are acceptable, 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 with
@option{--with-latest} (@pxref{Contribución}).

@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 --development
@itemx -D
Build the ``development environment'' (build dependencies) of the following
package.

For example, the following command builds the inputs of @code{hello}, but
@emph{not} @code{hello} itself, and also builds @code{guile}:

@example
guix build -D hello guile
@end example

Notice that @option{-D} (or @option{--development}) only applies to the
immediately following package on the command line.  Under the hood, it uses
@code{package->development-manifest} (@pxref{package-development-manifest,
@code{package->development-manifest}}).

@quotation Nota
The effect of combining @option{--development} with @option{--target} (for
cross-compilation) may not be what you expect: it will cross-compile all the
dependencies of the given package when it is built natively.
@end quotation

@cindex dependents of a package, building them
@cindex building the dependents of a package
@anchor{build-dependents}
@item --dependents[=@var{depth}]
@itemx -P @var{depth}
Build the dependents of the following package.  By default, build all the
direct and indirect dependents; when @var{depth} is provided, limit to
dependents at that distance: 1 for direct dependents, 2 for dependents of
dependents, and so on.

For example, the command below builds @emph{all} the dependents of libgit2:

@example
guix build --dependents libgit2
@end example

To build all the packages that directly depend on NumPy, run:

@example
guix build -P1 python-numpy
@end example

The list of dependents is computed in the same way as with @command{guix
refresh --list-dependent} (@pxref{Invocación de guix refresh}).

@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.

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{Invocación de 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).

To get closer to a container like that used by the build daemon, we can
remove @file{/bin/sh} (you'll first need to pass the
@option{--writable-root} option to @command{guix shell}):

@example
[env]# rm /bin/sh
@end example

(No se preocupe, es inocuo: todo esto ocurre en el contenedor de usar y
tirar creado por @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{Construyendo 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}.

Alternatively, @command{guix download} can also retrieve a Git repository,
possibly a specific commit, tag, or branch.

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.

@item --git
@itemx -g
Checkout the Git repository at the latest commit on the default branch.

@item --commit=@var{revisión-o-etiqueta}
Cambia el repositorio Git en @var{revisión-o-etiqueta}.

@var{commit-or-tag} can be either a tag or a commit defined in the Git
repository.

@item --branch=@var{rama}
Cambia el repositorio Git en @var{rama}.

The repository will be checked out at the latest commit of @var{branch},
which must be a valid branch of the Git repository.

@item --recursive
@itemx -r
Recursively clone the Git repository.
@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{opciones-globales}@dots{}] @var{importador} @var{package} [@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}. @command{guix import} para sí
tiene el siguiente @var{opciones-globales}:

@table @code
@item --insert=@var{archivo}
@itemx -i @var{archivo}
Insert the package definition(s) that the @var{importer} generated into the
specified @var{file}, either in alphabetical order among existing package
definitions, or at the end of the file otherwise.
@end table

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

Like many other importers, the @code{cpan} importer supports recursive
imports:

@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 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}.

When @option{--prefix=license:} is added, the importer will prefix license
atoms with @code{license:}, allowing a prefixed import of @code{(guix
licenses)}.

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-scripts}
package.  The source code is downloaded from possibly multiple locations in
the SVN repository of the Tex Live project.  Note that therefore SVN must be
installed and in @code{$PATH}; run @code{guix install subversion} if needed.

La siguiente orden importa los metadatos del paquete de TeX @code{fontspec}:

@example
guix import texlive fontspec
@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 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 --allow-yanked
If no non-yanked version of a crate is available, use the latest yanked
version instead instead of aborting.
@item --lockfile=@var{file}
@itemx -f @var{archivo}
When @option{--lockfile} is specified, the importer will ignore other
options and won't output package expressions, instead importing source
expressions from @var{file}, a @file{Cargo.lock} file.

@xref{Packaging Rust Crates,,, guix-cookbook, GNU Guix Cookbook}, for
packaging workflow utilizing it.
@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 npm-binary
@cindex npm
@cindex Node.js
Importa metadatos desde el @uref{https://registry.npmjs.org, npm Registry},
como en este ejemplo:

@example
guix import npm-binary buffer-crc32
@end example

The npm-binary importer also allows you to specify a version string:

@example
guix import npm-binary buffer-crc32@@1.0.0
@end example

@quotation Nota
Generated package expressions skip the build step of the
@code{node-build-system}. As such, generated package expressions often refer
to transpiled or generated files, instead of being built from source.
@end quotation

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.
@end table

@item composer
@cindex Composer
@cindex PHP
Importa metadatos desde el repositorio de paquetes
@uref{https://getcomposer.org/, Composer} usado por la comunidad PHP, como
en este ejemplo:

@example
guix import composer phpunit/phpunit
@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.
@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 la URL de un repositorio como esperaba por la
      @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
      sub-directorio @file{packages/}).
@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{Contribución}).

@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!

If for some reason you don't want to update to the latest version, you can
update to a specific version by appending an equal sign and the desired
version number to the package specification.  Note that not all updaters
support this; an error is reported when an updater cannot refresh to the
specified version.

@example
$ guix refresh -u guile=3.0.4
@dots{}
gnu/packages/guile.scm:392:2: guile: updating from version 3.0.3 to version 3.0.4...
@dots{}
$ guix refresh -u guile@@2.0=2.0.12
@dots{}
gnu/packages/guile.scm:147:2: guile: updating from version 2.0.10 to version 2.0.12...
@dots{}
@end example

@cindex target version, guix refresh
In some specific cases, you may have many packages specified via a manifest
or a module selection which should all be updated together; for these cases,
the @option{--target-version} option can be provided to have them all
refreshed to the same version, as shown in the examples below:

@example
$ guix refresh qtbase qtdeclarative --target-version=6.5.2
gnu/packages/qt.scm:1248:13: qtdeclarative would be upgraded from 6.3.2 to 6.5.2
gnu/packages/qt.scm:584:2: qtbase would be upgraded from 6.3.2 to 6.5.2
@end example

@example
$ guix refresh --manifest=qt5-manifest.scm --target-version=5.15.10
gnu/packages/qt.scm:1173:13: qtxmlpatterns would be upgraded from 5.15.8 to 5.15.10
gnu/packages/qt.scm:1202:13: qtdeclarative would be upgraded from 5.15.8 to 5.15.10
gnu/packages/qt.scm:1762:13: qtserialbus would be upgraded from 5.15.8 to 5.15.10
gnu/packages/qt.scm:2070:13: qtquickcontrols2 would be upgraded from 5.15.8 to 5.15.10
@dots{}
@end example

@example
$ guix refresh -s module:kde-plasma --target-version=6.3.6
[@dots{}] plasma-systemmonitor would be upgraded from 6.3.4 to 6.3.6
[@dots{}] plasma-workspace-wallpapers would be upgraded from 6.3.4 to 6.3.6
[@dots{}] plasma-browser-integration would be upgraded from 6.3.4 to 6.3.6
@dots{}
@end example

@cindex partial target version, guix refresh
The @option{--target-version} option accepts partial version prefixes, which
can be useful to update to the latest major or major-minor prefixed version:

@example
$ guix refresh qtbase@@5 qtdeclarative@@5 --target-version=5
gnu/packages/qt.scm:1472:13: qtdeclarative would be upgraded from 5.15.8 to 5.15.10
gnu/packages/qt.scm:452:13: qtbase would be upgraded from 5.15.8 to 5.15.10
@end example

@cindex partial version specification, guix refresh
A per-package equivalent to --target-version is made available by prefixing
the version specification with the @samp{~} (tilde) character.  For example:

@example
$ guix refresh bash=~5 guile=~3
gnu/packages/guile.scm:354:13: guile would be upgraded from 3.0.9 to 3.0.10
gnu/packages/bash.scm:150:15: bash would be upgraded from 5.1.16 to 5.2.37
@end example

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

When passed @option{--update}, it modifies distribution source files to
update the version numbers and source code hashes of those package
definitions, as well as possibly their inputs (@pxref{Definición de paquetes}).
This is achieved by downloading each package's latest source tarball and its
associated OpenPGP signature, authenticating the downloaded tarball against
its signature using @command{gpgv}, and finally computing its hash---note
that GnuPG must be installed and in @code{$PATH}; run @code{guix install
gnupg} if needed.

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

When considering whether to upgrade a package, it is sometimes convenient to
know which packages would be affected by the upgrade and should be checked
for compatibility.  For this the @option{--list-dependent} option may be
used when passing @command{guix refresh} one or more package names.

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 --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

@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
Update distribution source files (package definitions) in place.  This is
usually run from a checkout of the Guix source tree (@pxref{Ejecutar Guix antes de instalarlo}):

@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.  Además puede ejecutarlo en paquetes desde un canal de terceras
partes:

@example
guix refresh -L /path/to/channel -u @var{package}
@end example

@xref{Creación de un canal}, on how to create a channel.

This command updates the version and source code hash of the package.
Depending on the updater being used, it can also update the various
@samp{inputs} fields of the package.  In some cases, the updater might get
inputs wrong---it might not know about an extra input that's necessary, or
it might add an input that should be avoided.

@cindex @code{updater-extra-inputs}, propiedad del paquete
@cindex @code{updater-ignored-inputs}, package property
To address that, packagers can add properties stating inputs that should be
added to those found by the updater or inputs that should be ignored: the
@code{updater-extra-inputs} and @code{updater-ignored-inputs} properties
pertain to ``regular'' inputs, and there are equivalent properties for
@samp{native} and @samp{propagated} inputs.  In the example below, we tell
the updater that we need @samp{openmpi} as an additional input:

@lisp
(define-public python-mpi4py
  (package
    (name "python-mpi4py")
    ;; @dots{}
    (inputs (list openmpi))
    (properties
     '((updater-extra-inputs . ("openmpi"))))))
@end lisp

That way, @command{guix refresh -u python-mpi4py} will leave the
@samp{openmpi} input, even if it is not among the inputs it would normally
add.

@item --select=[@var{subconjunto}]
@itemx -s @var{subconjunto}
Select all the packages in @var{subset}, one of @code{core}, @code{non-core}
or @code{module:@var{name}}.

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.

The @code{module:@var{name}} subset refers to all the packages in a
specified guile module.  The module can be specified as @code{module:guile}
or @code{module:(gnu packages guile)}, the former is a shorthand for the
later.

@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}.

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.
@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, by default, the HTML page where the source
tarball of the package is hosted, when applicable.  Behavior can be
customized with the following package properties:

@table @code
@item release-monitoring-url
an alternate URL to crawl;

@item release-file-regexp
an regular expression matching release file names, whose first subexpression
must correspond to the version string.
@end table

Here is an example package with a custom release monitoring URL and a regexp
matching an unconventional release file name (it's unconventional due to the
use of upper case letter and the lack of a hyphen before the version
string):

@lisp
(package
  ;; @dots{}
  (home-page "http://example.org/software/the-package.html")
  (properties
    `((release-monitoring-url . ,home-page)
      (release-file-regexp . "ThePackage([0-9\\.]+)\\.tgz"))))
@end lisp

@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.

@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.

@xref{build-dependents, @command{guix build --dependents}}, for a convenient
way to build all the dependents of a package.

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}.

@item --list-transitive
@itemx -T
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

La orden previa enumera un conjunto de paquetes que, en caso de cambiar,
causarían la reconstrucción de @code{flex}.

@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

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 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.

@item auto
Automatically selects the @code{interactive} policy when the standard input
is connected to a pseudo terminal (TTY), else @code{always}.  This is the
default behavior.
@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.

@end table

@node Invoking guix style
@section Invocación de @command{guix style}

@cindex @command{guix style}
@cindex styling rules
@cindex lint, code style
@cindex format, code style
@cindex convenciones de formato
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 --alphabetical-sort
@itemx -A
Place the top-level package definitions in the given files in alphabetical
order.  Package definitions with matching names are placed with versions in
descending order.  This option only has an effect in combination with
@option{--whole-file}.

@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{Ejecutar Guix antes de instalarlo}) 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.

@item arguments
Rewrite package arguments to use G-expressions (@pxref{Expresiones-G}).  For
example, consider this package definition:

@lisp
(define-public my-package
  (package
    ;; @dots{}
    (arguments      ;old-style quoted arguments
     '(#:make-flags '("V=1")
       #:phases (modify-phases %standard-phases
                  (delete 'build))))))
@end lisp

@noindent
Running @command{guix style -S arguments} on this package would rewrite its
@code{arguments} field like to:

@lisp
(define-public my-package
  (package
    ;; @dots{}
    (arguments
      (list #:make-flags #~'("V=1")
            #:phases #~(modify-phases %standard-phases
                         (delete 'build))))))
@end lisp

Note that changes made by the @code{arguments} rule do not entail a rebuild
of the affected packages.  Furthermore, if a package definition happens to
be using G-expressions already, @command{guix style} leaves it unchanged.

@item git-source
If the @code{home-page} is a Git repository (as per
@code{git-repository-url?}), and the actual Git repository is tagged with
@code{version} or @code{(string-append ``v'' version)}, change the package
origin to the @code{git-fetch} method (@pxref{Referencia de origin}).  Consider
this example:

@lisp
(define-public guile-json-4
  (package
    (inherit guile-json-3)
    (name "guile-json")
    (version "4.7.3")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://savannah/guile-json/guile-json-"
                                  version ".tar.gz"))
              (sha256
               (base32
                "127k2xc07w1gnyqs40z4865l8p3ra5xgpcn569dz04lxsa709fiq"))))))
@end lisp

@noindent
Running @command{guix style -S git-source} on this package would rewrite its
@code{source} field like to:

@lisp
(define-public guile-json-4
  (package
    (inherit guile-json-3)
    (name "guile-json")
    (version "4.7.3")
    (source (origin
              (method git-fetch)
              (uri (git-reference (url
                                   "https://github.com/aconchillo/guile-json")
                                  (commit version)))
              (file-name (git-file-name name version))
              (sha256 (base32
                       "0akhm8xjv8fl55fyq0w6c9c6hi5j7mifjx01w07np7qg1cjl9f06"))))))
@end lisp

@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 misplaced-flags
Parse the @code{make-flags} and @code{configure-flags} to check for any
flags which should be set with another flag as part of the build-system.
For example,

@lisp
(build-system cmake-build-system)
(arguments
 (list #:configure-flags #~(list "-DCMAKE_BUILD_TYPE=RELEASE"
                                 "-DTESTS=ON")))
@end lisp

should instead be written as:

@lisp
(build-system cmake-build-system)
(arguments
 (list #:build-type "RELEASE"
       #:configure-flags #~(list "-DTESTS=ON")))
@end lisp

@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

A CVE alert can be a false positive when its CPE name matches the one in
Guix, while actually referring to a distinct product.  These alerts can be
addressed by setting the correct CPE vendor, or when no vendors apply, by
ignoring alerts from irrelevant vendors, as in these examples:

@lisp
(package
  (name "halibut")
  ;; @dots{}
  (properties '((cpe-vendor . "halibut_project"))))

(package
  (name "cvs")
  ;; @dots{}
  (properties '((lint-hidden-cpe-vendors . ("jenkins"
                                            "vendor2")))))
@end lisp

@c See <https://www.openwall.com/lists/oss-security/2017/03/15/3>.
Finally, some entries in the CVE database do not specify which version of a
package they apply to, and would thus ``stick around'' forever.  Package
developers who found CVE alerts and verified they can be ignored can declare
them as in this example:

@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 self
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 activación con socket, para @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{Invocación de 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}
Occasionally you're grumpy because substitutes are lacking and you end up
building packages by yourself (@pxref{Sustituciones}).  The @command{guix
weather} command reports on substitute availability on the specified servers
so you can have an idea of whether you'll be grumpy today.  It can sometimes
be useful info as a user, but it is primarily useful to people running
@command{guix publish} (@pxref{Invocación de guix publish}).  Sometimes
substitutes @emph{are} available but they are not authorized on your system;
@command{guix weather} reports it so you can authorize them if you want
(@pxref{Obtención de sustiticiones desde otros servidores}).

@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} is the space-separated list of substitute server URLs to query.
When this option is omitted, the URLs specified with the
@option{--substitute-urls} option of @command{guix-daemon} are used or, as a
last resort, the default set of substitute URLs.

@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 --expression=@var{expr}
@itemx -e @var{expr}
Considera el paquete al que evalúa @var{expr}.

A typical use case for this option is specifying a package that is hidden
and thus cannot be referred to in the usual way, as in this example:

@example
guix weather -e '(@@@@ (gnu packages rust) rust-bootstrap)'
@end example

This option can be repeated.

@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 shell}, @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
   - avr
   - i586-pc-gnu
   - i686-linux-gnu
   - i686-w64-mingw32
   - loongarch64-linux-gnu
   - mips64el-linux-gnu
   - or1k-elf
   - powerpc-linux-gnu
   - powerpc64le-linux-gnu
   - riscv64-linux-gnu
   - x86_64-linux-gnu
   - x86_64-linux-gnux32
   - x86_64-w64-mingw32
   - xtensa-ath9k-elf
@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
penalty compared to emulation using QEMU.  There are however higher risks
that some packages fail to cross-compile because fewer 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
* Getting Started with the System::  Sus primeros pasos.
* 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.
* Privileged Programs::      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 Getting Started with the System
@section Empezando

@cindex system configuration file
@cindex configuration file, of the system
You're reading this section probably because you have just installed Guix
System (@pxref{Instalación del sistema}) and would like to know where to go from
here.  If you're already familiar with GNU/Linux system administration, the
way Guix System is configured is very different from what you're used to:
you won't install a system service by running @command{guix install}, you
won't configure services by modifying files under @file{/etc}, and you won't
create user accounts by invoking @command{useradd}; instead, all these
aspects are spelled out in a @dfn{system configuration file}.

The first step with Guix System is thus to write the @dfn{system
configuration file}; luckily, system installation already generated one for
you and stored it under @file{/etc/config.scm}.

@quotation Nota
You can store your system configuration file anywhere you like---it doesn't
have to be at @file{/etc/config.scm}.  It's a good idea to keep it under
version control, for instance in a @uref{https://git-scm.com/book/en/, Git
repository}.
@end quotation

The @emph{entire} configuration of the system---user accounts, system
services, timezone, locale settings---is declared in this file, which
follows this template:

@lisp
(use-modules (gnu))
(use-package-modules @dots{})
(use-service-modules @dots{})

(operating-system
  (host-name @dots{})
  (timezone @dots{})
  (locale @dots{})
  (bootloader @dots{})
  (file-systems @dots{})
  (users @dots{})
  (packages @dots{})
  (services @dots{}))
@end lisp

This configuration file is in fact a Scheme program; the first lines pull in
modules providing variables you might need in the rest of the file---e.g.,
packages, services, etc.  The @code{operating-system} form declares the
system configuration as a @dfn{record} with a number of @dfn{fields}.
@xref{Uso de la configuración del sistema}, to view complete examples and learn
what to put in there.

The second step, once you have this configuration file, is to test it.  Of
course, you can skip this step if you're feeling lucky---you choose! To do
that, pass your configuration file to @command{guix system vm} (no need to
be root, you can do that as a regular user):

@example
guix system vm /etc/config.scm
@end example

@noindent
This command returns the name of a shell script that starts a virtual
machine (VM) running the system @emph{as described in the configuration
file}:

@example
/gnu/store/@dots{}-run-vm.sh
@end example

@noindent
In this VM, you can log in as @code{root} with no password.  That's a good
way to check that your configuration file is correct and that it gives the
expected result, without touching your system.  @xref{Invocación de guix system},
for more information.

@quotation Nota
When using @command{guix system vm}, aspects tied to your hardware such as
file systems and mapped devices are overridden because they cannot be
meaningfully tested in the VM@.  Other aspects such as static network
configuration (@pxref{Networking Setup,
@code{static-networking-service-type}}) are @emph{not} overridden but they
may not work inside the VM@.
@end quotation

@cindex system instantiation
@cindex reconfigurar el sistema
The third step, once you're happy with your configuration, is to
@dfn{instantiate} it---make this configuration effective on your system.  To
do that, run:

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

@cindex actualiza servicios del sistema
@cindex system services, upgrading
@noindent
This operation is @dfn{transactional}: either it succeeds and you end up
with an upgraded system, or it fails and nothing has changed.  Note that it
does @emph{not} restart system services that were already running.  Thus, to
upgrade those services, you have to reboot or to explicitly restart them;
for example, to restart the secure shell (SSH) daemon, you would run:

@example
sudo herd restart sshd
@end example

@quotation Nota
System services are managed by the Shepherd (@pxref{Jump Start,,, shepherd,
The GNU Shepherd Manual}).  The @code{herd} command lets you inspect, start,
and stop services.  To view the status of services, run:

@example
sudo herd status
@end example

To view detailed information about a given service, add its name to the
command:

@example
sudo herd status sshd
@end example

@xref{Servicios}, for more information.
@end quotation

@cindex provenance, of the system
The system records its @dfn{provenance}---the configuration file and
channels that were used to deploy it.  You can view it like so:

@example
guix system describe
@end example

Additionally, @command{guix system reconfigure} preserves previous system
generations, which you can list:

@example
guix system list-generations
@end example

@noindent
@cindex roll back, for the system
Crucially, that means that you can always @emph{roll back} to an earlier
generation should something go wrong! When you eventually reboot, you'll
notice a sub-menu in the bootloader that reads ``Old system generations'':
it's what allows you to boot @emph{an older generation of your system},
should the latest generation be ``broken'' or otherwise unsatisfying.  You
can also ``permanently'' roll back, like so:

@example
sudo guix system roll-back
@end example

@noindent
Alternatively, you can use @command{guix system switch-generation} to switch
to a specific generation.

Once in a while, you'll want to delete old generations that you do not need
anymore to allow @dfn{garbage collection} to free space (@pxref{Invocación de guix gc}).  For example, to remove generations older than 4 months, run:

@example
sudo guix system delete-generations 4m
@end example

From there on, anytime you want to change something in the system
configuration, be it adding a user account or changing parameters of a
service, you will first update your configuration file and then run
@command{guix system reconfigure} as shown above.
@cindex upgrade, of the system
Likewise, to @emph{upgrade} system software, you first fetch an up-to-date
Guix and then reconfigure your system with that new Guix:

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

@noindent
We recommend doing that regularly so that your system includes the latest
security updates (@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}
@command{sudo guix} runs your user's @command{guix} command and @emph{not}
root's, because @command{sudo} leaves @env{PATH} unchanged.

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

That's it! If you're getting started with Guix entirely, @pxref{Empezando}.  The next sections dive in more detail into the crux of the
matter: system configuration.

@node Uso de la configuración del sistema
@section Uso de la configuración del sistema

The previous section showed the overall workflow you would follow when
administering a Guix System machine (@pxref{Getting Started with the System}).  Let's now see in more detail what goes into the system
configuration file.

The operating system is configured by providing an @code{operating-system}
declaration in a file that can then be passed to the @command{guix system}
command (@pxref{Invocación de guix system}), as we've seen before.  A simple
setup, with the default Linux-Libre kernel, initial RAM disk, and a couple
of system services added to those provided by default looks like this:

@findex operating-system
@lisp
@include os-config-bare-bones.texi
@end lisp

The configuration is declarative.  It is code in the Scheme programming
language; the whole @code{(operating-system @dots{})} expression produces a
@dfn{record} with a number of @dfn{fields}.  Some of the fields defined
above, such as @code{host-name} and @code{bootloader}, are mandatory.
Others, such as @code{packages} and @code{services}, can be omitted, in
which case they get a default value.  @xref{Referencia de operating-system}, for
details about all the available fields.

Below we discuss the meaning of some of the most important fields.

@quotation Troubleshooting
The configuration file is a Scheme program and you might get the syntax or
semantics wrong as you get started.  Syntactic issues such as misplaced
parentheses can often be identified by reformatting your file:

@example
guix style -f config.scm
@end example

The Cookbook has a short section to get started with the Scheme programming
language that explains the fundamentals, which you will find helpful when
hacking your configuration.  @xref{A Scheme Crash Course,,, guix-cookbook,
GNU Guix Cookbook}.
@end quotation

@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
El campo @code{packages} enumera los paquetes que serán visibles globalmente
en el sistema, para todas las cuentas de usuaria---es decir, en la variable
de entorno @env{PATH} de cada usuaria---sin tener en cuenta los perfiles de
cada usuaria (@pxref{Invocación de guix package}). La variable
@code{%base-packages} proporciona todas las herramientas esperadas para
tareas básicas y de administración---incluyendo las utilidades básicas GNU,
las herramientas de red GNU, el editor de texto ligero @command{mg},
@command{find}, @command{grep}, etc. El ejemplo previo se añade
GNU@tie{}Screen a estos, tomado del módulo @code{(gnu packages screen)}
(@pxref{Módulos de paquetes}). La sintaxis @code{(list paquete salida)} puede
usarse para añadir una salida específica de un paquete:

@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

@findex specifications->packages
When a package has more than one output it can be a challenge to refer to a
specific output instead of just to the standard @code{out} output.  For
these situations one can use the @code{specifications->packages} procedure
from the @code{(gnu packages)} module.  For example:

@lisp
(use-modules (gnu packages))

(operating-system
  ;; ...
  (packages (append (specifications->packages
                      '("git" "git:send-email"))
                    %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 %mis-servicios
  ;; Mi propia lista de servicios
  (modify-services %base-services
    (guix-service-type config =>
                       (guix-configuration
                        (inherit config)
                        ;; Obtenemos sustituciones desde example.org.
                        (substitute-urls
                          (list "https://example.org/guix"
                                "https://ci.guix.gnu.org"))))
    (mingetty-service-type config =>
                           (mingetty-configuration
                            (inherit config)
                            ;; Ingresamos automáticamente con
                            ;; la cuenta "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}, for the exact list of services provided by
@code{%desktop-services}.

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 Inspecting Services

@cindex troubleshooting, for system services
@cindex inspecciona servicios del sistema
@cindex system services, inspecting
As you work on your system configuration, you might wonder why some system
service doesn't show up or why the system is not as you expected.  There are
several ways to inspect and troubleshoot problems.

@cindex dependency graph, of Shepherd services
First, you can inspect the dependency graph of Shepherd services like so:

@example
guix system shepherd-graph /etc/config.scm | \
  guix shell xdot -- xdot -
@end example

This lets you visualize the Shepherd services as defined in
@file{/etc/config.scm}.  Each box is a service as would be shown by
@command{sudo herd status} on the running system, and each arrow denotes a
dependency (in the sense that if service @var{A} depends on @var{B}, then
@var{B} must be started before @var{A}).

@cindex extension graph, of services
Not all ``services'' are Shepherd services though, since Guix System uses a
broader definition of the term (@pxref{Servicios}).  To visualize system
services and their relations at a higher level, run:

@example
guix system extension-graph /etc/config.scm | \
  guix shell xdot -- xdot -
@end example

This lets you view the @dfn{service extension graph}: how services
``extend'' each other, for instance by contributing to their configuration.
@xref{Composición de servicios}, to understand the meaning of this graph.

Last, you may also find it useful to inspect your system configuration at
the REPL (@pxref{Utilizar interactivamente Guix}).  Here is an example session:

@example
$ guix repl
scheme@@(guix-user)> ,use (gnu)
scheme@@(guix-user)> (define os (load "config.scm"))
scheme@@(guix-user)> ,pp (map service-kind (operating-system-services os))
$1 = (#<service-type localed cabba93>
      @dots{})
@end example

@xref{Referencia de servicios}, to learn about the Scheme interface to manipulate
and inspect services.

@unnumberedsubsec Instanciación del sistema

@cindex system instantiation
@cindex reconfigurar el sistema
Assuming the @code{operating-system} declaration is stored in the
@file{config.scm} file, the @command{sudo guix system reconfigure
config.scm} command instantiates that configuration, and makes it the
default boot entry.  @xref{Getting Started with the System}, for an
overview.

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.

@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})
@c footnote duplicated in @pxref{Instalación}
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{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}.

@anchor{operating-system-essential-services}
@cindex servicios esenciales
@item @code{essential-services} (predeterminados: ...)
The list of ``essential services''---i.e., things like instances of
@code{system-service-type} (@pxref{Referencia de servicios}) and
@code{host-name-service-type}, which are derived from the operating system
definition itself.  As a user you should @emph{never} need to touch this
field.

@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{privileged-programs} (default: @code{%default-privileged-programs})
List of @code{<privileged-program>}.  @xref{Privileged Programs}, 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

@defmac 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 defmac

@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), @code{remount}
(remount a mounted file system), 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}).

@item @code{shepherd-requirements} (default: @code{'()})
This is a list of symbols denoting Shepherd requirements that must be met
before mounting the file system.

As an example, an NFS file system would typically have a requirement for
@code{networking}.  In some situations, requiring @code{networking} might
not be sufficient as @code{networking} being marked as started does
@emph{not} imply the network has already been configured and in working
order (for example, when using @code{dhcp-client-service-type}).  For such
cases, adding a requirement on a custom @code{network-online} service may be
necessary.  A sample @code{network-online} one-shot Shepherd service
implementation is provided below:

@lisp
(simple-service 'network-online shepherd-root-service-type
  (list
   (shepherd-service
    (requirement '(networking))
    (provision '(network-online))
    (documentation "Wait for the network to come up.")
    (start #~(lambda _
               (let* ((cmd
                       "set -eux
c=0
while ! /run/setuid-programs/ping -qc1 -W1 example.org; do
	sleep 1
	[ \"$((c += 1))\" -lt 30 ] || exit 1  # Limit the wait time
done
")
                    (status (system cmd)))
               (= 0 (status:exit-val status)))))
    (one-shot? #t))))
@end lisp

Typically, file systems are mounted before most other Shepherd services are
started.  However, file systems with a non-empty shepherd-requirements field
are mounted after Shepherd services have begun.  Any Shepherd service that
depends on a file system with a non-empty shepherd-requirements field must
depend on it directly and not on the generic symbol @code{file-systems}.
@end table
@end deftp

@deffn {Procedimiento} file-system-label 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.

@defvar %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 defvar

@defvar %pseudo-terminal-file-system
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 defvar

@defvar %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 defvar

@defvar %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 para sí es capaz aún de escribir en el almacén: vuelve a montar en
modo lectura-escritura en su propio ``espacio de nombres''.
@end defvar

@defvar %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 defvar

@defvar %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 defvar

El módulo @code{(gnu system uuid)} proporciona herramientas para tratar con
``identificadores únicos'' de sistemas de archivos (UUID).

@deffn {Procedimiento} uuid str [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


@menu
* Sistema de archivos Btrfs::  Sistema de archivos Btrfs
@end menu

@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
El núcleo Linux tiene una noción de @dfn{traducción de dispositivos}: un
dispositivo de bloques, como una partición de disco duro, puede
@dfn{traducirse} en otro dispositivo, habitualmente en @code{/dev/mapper/},
con un procesamiento adicional sobre los datos que fluyen a través de
ella@footnote{Fíjese que GNU@tie{}Hurd no diferencia entre el concepto de un
``dispositivo traducido'' y el de un sistema de archivos: ambos se reducen a
@emph{traducir} operaciones de entrada/salida realizadas en un archivo a
operaciones en su almacenamiento subyacente. Por tanto, Hurd implementa
dispositivos traducidos, como sistemas de archivos, usando el mecanismo
genérico de @dfn{traducción} (@pxref{Translators,,, hurd, The GNU Hurd
Reference Manual}).}. Un ejemplo típico es la traducción de dispositivos
para el cifrado: todas las escrituras en el dispositivo traducido se cifran,
y todas las lecturas se descifran, de forma transparente. Guix extiende esta
noción considerando cualquier dispositivo o conjunto de dispositivos que son
@dfn{transformados} de alguna manera para crear un nuevo dispositivo; por
ejemplo, los dispositivos RAID se obtienen @dfn{ensamblando} otros
dispositivos, como discos duros o particiones, en uno nuevo que se comporta
como una partición.

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}.

@item arguments
This is a list of arguments specific to @var{type} that are passed to its
@code{open}, @code{close}, and @code{check} procedures.

As an example, @code{luks-device-mapping} supports keyword arguments---see
below for details.
@end table
@end deftp

@defvar 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.

The following options may be passed @i{via} the @code{arguments} field of a
mapped device:

@table @code
@item #:key-file
If @code{file} is provided, unlocking is first attempted using that key
file.  This has an advantage of not requiring a password entry, so it can be
used (for example) to unlock RAID arrays automatically on boot.  If key file
unlock fails, password unlock is attempted as well.  Key file is not stored
in the store and needs to be available at the given location at the time of
the unlock attempt.

@lisp
;; Following definition would be equivalent to running:
;;   cryptsetup open --key-file /crypto.key /dev/sdb1 data
(mapped-device
 (source "/dev/sdb1")
 (target "data")
 (type luks-device-mapping)
 (arguments '(#:key-file "/crypto.key")))
@end lisp

@item #:allow-discards?
@code{allow-discards?} allows the use of discard (TRIM) requests for the
underlying device.  This is useful for solid state drives.  However, this
option can have a negative security impact because it can make file system
level operations visible on the physical device.  For more information,
refer to the description of the @code{--allow-discards} option in the
@code{cryptsetup-open(8)} man page.

@item #:extra-options
List of additional command-line options for the @code{cryptsetup open}
command.  See the @code{cryptsetup-open(8)} man page for a list of supported
options.

For example, here is how you could specify the
@option{--perf-no_read_workqueue} and @option{--perf-no_write_workqueue}
options, along with @option{--allow-discards}:

@lisp
(mapped-device
  (source "/dev/sdb1")
  (target "data")
  (type luks-device-mapping)
  (arguments '(#:allow-discards? #t
               #:extra-options
               ("--perf-no_read_workqueue"
                "--perf-no_write_workqueue"))))
@end lisp

@end table
@end defvar

@defvar 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 defvar

@cindex LVM, logical volume manager
@defvar 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 defvar

@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
También es deseable cifrar el espacio de intercambio, puesto que el espacio
de intercambio puede contener información sensible. Una forma de conseguirlo
es usar un archivo de intercambio en un sistema de archivos en un
dispositivo traducido a través del cifrado LUKS. @xref{Swap Space} o
@pxref{Preparación para la instalación,,Particionado del disco}, para un ejemplo.

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, @pxref{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.

@cindex hibernation
@cindex suspend to disk
Swap space is also required to put the system into @dfn{hibernation} (also
called @dfn{suspend to disk}), whereby memory is dumped to swap before
shutdown so it can be restored when the machine is eventually restarted.
Hibernation uses at most half the size of the RAM in the configured swap
space.  The Linux kernel needs to know about the swap space to be used to
resume from hibernation on boot (@i{via} a kernel argument).  When using a
swap file, its offset in the device holding it also needs to be given to the
kernel; that value has to be updated if the file is initialized again as
swap---e.g., because its size was changed.

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

Se utiliza el archivo @file{/btrfs/swapfile} como espacio de intercambio, el
cual depende en el sistema de archivo montado en @file{/btrfs}. Note como
utilizamos filtro Guile para seleccionar el sistema de archivo en un tema
elegante.

@lisp
(swap-devices
  (list
    (swap-space
      (target "/dev/mapper/my-swap")
      (dependencies mapped-devices))))

(kernel-arguments
  (cons* "resume=/dev/mapper/my-swap"
         %default-kernel-arguments))
@end lisp

The above snippet of an @code{operating-system} declaration enables the
mapped device @file{/dev/mapper/my-swap} (which may be part of an encrypted
device) as swap space, and tells the kernel to use it for hibernation via
the @code{resume} kernel argument (@pxref{Referencia de operating-system},
@code{kernel-arguments}).

@lisp
(swap-devices
  (list
    (swap-space
      (target "/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/")
                            file-systems)))))

(kernel-arguments
  (cons* "resume=/dev/sda3"        ;device that holds /swapfile
         "resume_offset=92514304"  ;offset of /swapfile on device
         %default-kernel-arguments))
@end lisp

This other snippet of @code{operating-system} enables the swap file
@file{/swapfile} for hibernation by telling the kernel about the partition
containing it (@code{resume} argument) and its offset on that partition
(@code{resume_offset} argument).  The latter value can be found in the
output of the command @command{filefrag -e} as the first number right under
the @code{physical_offset} column header (the second command extracts its
value directly):

@smallexample
$ sudo filefrag -e /swapfile
Filesystem type is: ef53
File size of /swapfile is 2463842304 (601524 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    2047:   92514304..  92516351:   2048:
@dots{}
$ sudo filefrag -e /swapfile | grep '^ *0:' | cut -d: -f3 | cut -d. -f1
   92514304
@end smallexample

@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:

@defvar %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 defvar

@defvar %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 defvar

@cindex containers, subordinate IDs
The Linux kernel also implements @dfn{subordinate user and group IDs}, or
``subids'', which are used to map the ID of a user and group to several IDs
inside separate name spaces---inside ``containers''.
@xref{subordinate-user-group-ids, the subordinate user and group ID
service}, for information on how to configure it.

@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} keyboard-layout nombre [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{Locales,,, 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

@defvar %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 defvar

@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::  Archiving and deleting old logs.
* Networking Setup::         Configurar interfaces de red.
* 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.
* File Search Services::     Tools to search for files.
* 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.
* High Availability Services::  High availability services.
* 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::           Servicios Samba.
* Integración continua::     Cuirass and Laminar services.
* Servicios de gestión de energía::  Extending battery life, etc.
* 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.

@defvar %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 defvar

@defvar special-files-service-type
El servicio que establece ``archivos especiales'' como @file{/bin/sh}; una
instancia suya es parte de @code{%base-services}.

The value associated with @code{special-files-service-type} services must be
a list of two-element lists where the first element is the ``special file''
and the second element is its target.  By default it is:

@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 defvar

@deffn {Procedimiento} extra-special-file archivo 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

This procedure is meant for @code{/bin/sh}, @code{/usr/bin/env} and similar
targets.  In particular, use for targets under @code{/etc} might not work as
expected if the target is managed by Guix in other ways.

The special files persist on your system even after the
@code{extra-special-file} call has been removed from your system config and
the system has been reconfigured.  The special files need to be removed
manually.
@end deffn

@defvar host-name-service-type
Type of the service that sets the system host name, whose value is a
string. This service is included in @code{operating-system} by default
(@pxref{operating-system-essential-services,@code{essential-services}}).
@end defvar

@defvar 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 defvar

@defvar hosts-service-type
Type of the service that populates the entries for (@file{/etc/hosts}).
This service type can be @emph{extended} by passing it a list of @code{host}
records.

The example below shows how to add two entries to @file{/etc/hosts}:

@c TRANSLATORS: The domain names below SHOULD NOT be translated.
@c They're domains reserved for use in documentation. (RFC6761 Section 6.5)
@c The addresses used are explained in RFC3849 and RFC5737.
@lisp
(simple-service 'add-extra-hosts
                hosts-service-type
                (list (host "192.0.2.1" "example.com"
                            '("example.net" "example.org"))
                      (host "2001:db8::1" "example.com"
                            '("example.net" "example.org"))))
@end lisp

@quotation Nota
@cindex @file{/etc/hosts} default entries
By default @file{/etc/hosts} comes with the following entries:
@example
127.0.0.1 localhost @var{host-name}
::1       localhost @var{host-name}
@end example

For most setups this is what you want though if you find yourself in the
situation where you want to change the default entries, you can do so in
@code{operating-system} via @code{modify-services} (@pxref{Referencia de servicios,@code{modify-services}}).

The following example shows how to unset @var{host-name} from being an alias
of @code{localhost}.
@lisp
(operating-system
  ;; @dots{}

  (essential-services
   (modify-services
     (operating-system-default-essential-services this-operating-system)
     (hosts-service-type config => (list
                                     (host "127.0.0.1" "localhost")
                                     (host "::1"       "localhost"))))))
@end lisp
@end quotation
@end defvar


@deffn {Procedure} host @var{address} @var{canonical-name} [@var{aliases}]
Return a new record for the host at @var{address} with the given
@var{canonical-name} and possibly @var{aliases}.

@var{address} must be a string denoting a valid IPv4 or IPv6 address, and
@var{canonical-name} and the strings listed in @var{aliases} must be valid
host names.
@end deffn

@defvar login-service-type
Type of the service that provides a console login service, whose value is a
@code{<login-configuration>} object.
@end defvar

@deftp {Tipo de datos} login-configuration
Tipo de datos que representa la configuración de acceso, el cual especifica
el @abbr{MOTD, mensaje del día}, entre otras cosas.

@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

@defvar mingetty-service-type
Type of the service that runs Mingetty, an implementation of the virtual
console log-in.  The value for this service is a
@code{<mingetty-configuration>} object.
@end defvar

@deftp {Tipo de datos} mingetty-configuration
Data type representing the configuration of Mingetty, which specifies the
tty to run, among other things.

@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 before showing the login
prompt.  The field name is bit unfortunate, since it controls clearing also
before the initial login, not just after a logout.

@item @code{delay} (predeterminado: @code{#f})
When set to a number, sleep that many seconds after startup.

@item @code{print-issue} (default: @code{#t})
When set to @code{#t}, write out a new line and the content of
@file{/etc/issue}.  Value of @code{'no-nl} can be used to suppress the new
line.

@item @code{print-hostname} (default: @code{#t})
When set to @code{#t}, print the host name before the login prompt.  The
host name is printed up to the first dot.  Can be set to @code{'long} to
print the full host name.

@item @code{nice} (predeterminado: @code{#f})
When set to a number, change the process priority using @code{nice}.

@item @code{working-directory} (default: @code{#f})
When set to a string, change into that directory before calling the login
program.

@item @code{root-directory} (default: @code{#f})
When set to a string, use this directory at the process's root directory.

@item @code{shepherd-requirement}
List of shepherd requirements.  Unless you know what you are doing, it is
recommended to extend the default list instead of overriding it.

As an example, when using auto-login on a system with elogind, it is
necessary to wait on the @code{'dbus-system} service:

@lisp
(modify-services %base-services
  (mingetty-service-type config =>
                         (mingetty-configuration
                          (inherit config)
                          ;; Ingresamos automáticamente con
                          ;; la cuenta "guest".
                          (auto-login "guest")
                          (shepherd-requirement
                           (cons 'dbus-system
                                 (mingetty-configuration-shepherd-requirement
                                  config))))))
@end lisp

@item @code{mingetty} (predeterminado: @var{mingetty})
El paquete Mingetty usado.

@end table
@end deftp

@defvar agetty-service-type
Type of the service that runs agetty, which implements virtual and serial
console log-in.  The value for this service is a
@code{<agetty-configuration>} object.
@end defvar

@deftp {Tipo de datos} agetty-configuration
Data type representing the configuration of agetty, which specifies the tty
to run, among other things@footnote{See the @code{agetty(8)} man page for
more information.}.

@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

@defvar kmscon-service-type
Type of the service that runs
@uref{https://www.freedesktop.org/wiki/Software/kmscon,kmscon}, which
implements virtual console log-in.  The value for this service is a
@code{<kmscon-configuration>} object.
@end defvar

@deftp {Tipo de datos} kmscon-configuration
Data type representing the configuration of Kmscon, which specifies the tty
to run, among other things.

@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 @abbr{nscd, name service cache daemon}
@defvar nscd-service-type
Type of the service that runs the libc @abbr{nscd, name service cache
daemon}, whose value is an @code{<nscd-configuration>} object.

Por conveniencia, el servicio ncsd de Shepherd proporciona las siguientes
acciones:

@table @code
@item invalidate
@cindex nscd, invalidación de caché
@cindex invalidación de caché, nscd
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 defvar

@deftp {Tipo de datos} nscd-configuration
Data type representing the @abbr{nscd, name service cache daemon}
configuration.

@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{#f})
Name of the nscd log file.  Debugging output goes to that file when
@code{debug-level} is strictly positive, or to standard error if it is
@code{#f}.  Regular messages are written to syslog when @code{debug-level}
is zero, regardless of the value of @code{log-file}.

@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

@defvar %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 defvar

@cindex syslog, with external syslogd
@cindex logging, syslog
@defvar syslog-service-type
Type of the service that runs the syslog daemon (@command{syslogd}), whose
value is a @code{<syslog-configuration>} object (see below).

@quotation Nota
This service is redundant with and for the most part superseded by
@code{shepherd-system-log-service-type} (@pxref{shepherd-system-log, the
Shepherd system log}).
@end quotation
@end defvar

To have a modified @code{syslog-configuration} come into effect after
reconfiguring your system, the @samp{reload} action should be preferred to
restarting the service, as many services such as the login manager depend on
it and would be restarted as well:

@example
# herd reload syslog
@end example

which will cause the running @command{syslogd} process to reload its
configuration.

@deftp {Tipo de datos} syslog-configuration
Data type representing the configuration of the syslog daemon.

@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})
The syslog configuration file to use.  @xref{syslogd invocation,,,
inetutils, GNU Inetutils}, for more information on the configuration file
syntax.

@item @code{extra-options} (predeterminadas: @code{'()})
List of extra command-line options for @command{syslog}.

@end table
@end deftp

@defvar 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 defvar

@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})
The Guix package to use.  @xref{Customizing the System-Wide Guix} to learn
how to provide a package with a pre-configured set of channels.

@cindex unprivileged @command{guix-daemon}
@cindex rootless @command{guix-daemon}
@item @code{privileged?} (default: @code{#t})
Whether to run @command{guix-daemon} as root.

When true, @command{guix-daemon} runs with root privileges and build
processes run under unprivileged user accounts as specified by
@code{build-group} and @code{build-accounts} (see below); when false,
@command{guix-daemon} run as the @code{guix-daemon} user, which is
unprivileged, and so do build processes.  The unprivileged or ``rootless''
mode can reduce the impact of some classes of vulnerabilities that could
affect the daemon.

The default is currently @code{#t} (@command{guix-daemon} runs with root
privileges) but may eventually be changed to @code{#f}.

@quotation Aviso
When changing this option, @file{/gnu/store}, @file{/var/guix}, and
@file{/etc/guix} have their ownership automatically changed by the
@code{guix-ownership} service to either the @code{guix-daemon} user or the
@code{root} user (@pxref{unprivileged-daemon-migration}).

This can take a while, especially if @file{/gnu/store} is big; it cannot be
interrupted and @command{guix-daemon} cannot be used until it has completed.
@end quotation

@xref{Configuración del entorno de construcción}, for more information on the two ways to run
@command{guix-daemon}.

@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{chroot?} (default: @code{'default})
The value should be one of @code{#t} or @code{#f}, in which case chroot is
enabled or disabled, respectively; or it should be @code{'default}, which
amounts to @code{#f} in Docker containers (so that they can be run in
non-privileged mode)  or @code{#t} otherwise.

@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})
La lista de archivos de claves autorizadas para importaciones de archivos,
como una lista de expresiones-G que evalúan a cadenas (@pxref{Invocación de guix archive}). Por defecto, contiene las de @code{@value{SUBSTITUTE-SERVER-1}} y
@code{@value{SUBSTITUTE-SERVER-2}} (@pxref{Sustituciones}). Véase
@code{substitute-urls} a continuación para obtener un ejemplo de cómo
cambiar este valor.

@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.

@anchor{guix-configuration-channels}
@item @code{channels} (default: @code{#f})
Listado de canales a ser especificados en @file{/etc/guix/channels.scm}, el
cual es que @command{guix pull} utiliza por defecto (@pxref{Invocación de guix pull}).

@quotation Nota
When reconfiguring a system, the existing @file{/etc/guix/channels.scm} file
is backed up as @file{/etc/guix/channels.scm.bak} if it was determined to be
a manually modified file.  This is to facilitate migration from earlier
versions, which allowed for in-place modifications to
@file{/etc/guix/channels.scm}.
@end quotation

@item @code{max-silent-time} (default: @code{3600})
@itemx @code{timeout} (default: @code{(* 3600 24)})
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.

@anchor{guix-configuration-build-machines}
@item @code{build-machines} (default: @code{#f})
This field must be either @code{#f} or a list of gexps evaluating to a
@code{build-machine} record or to a list of @code{build-machine} records
(@pxref{Configuración de delegación del daemon}).

When it is @code{#f}, the @file{/etc/guix/machines.scm} file is left
untouched.  Otherwise, the list of of gexps is written to
@file{/etc/guix/machines.scm}; if a previously-existing file is found, it is
backed up as @file{/etc/guix/machines.scm.bak}.  This allows you to declare
build machines for offloading directly in the operating system declaration,
like so:

@lisp
(guix-configuration
  (build-machines
    (list #~(build-machine (name "foo.example.org") @dots{})
          #~(build-machine (name "bar.example.org") @dots{}))))
@end lisp

Additional build machines may be added @i{via} the @code{guix-extension}
mechanism (see below).

@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.

@item @code{environment} (default: @code{'()})
Environment variables to be set before starting the daemon, as a list of
@code{key=value} strings.

@item @code{socket-directory-permissions} (default: @code{#o755})
Permissions to set for the directory @file{/var/guix/daemon-socket}.  This,
together with @code{socket-directory-group} and
@code{socket-directory-user}, determines who can connect to the build daemon
via its Unix socket.  TCP socket operation is unaffected by these.

@item @code{socket-directory-user} (default: @code{#f})
@itemx @code{socket-directory-group} (default: @code{#f})
User and group owning the @file{/var/guix/daemon-socket} directory or
@code{#f} to keep the user or group as root.

@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{build-machines} (default: @code{'()})
A list of gexps that evaluate to @code{build-machine} records or to a list
of @code{build-machine} records.  (@pxref{Configuración de delegación del daemon}).

Using this field, a service may add new build machines to receive builds
offloaded by the daemon.  This is useful for a service such as
@code{hurd-vm-service-type}, which can make a GNU/Hurd virtual machine
directly usable for offloading (@pxref{hurd-vm,
@code{hurd-vm-service-type}}).

@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

@defvar udev-service-type
Type of the service that runs udev, a service which populates the
@file{/dev} directory dynamically, whose value is a
@code{<udev-configuration>} object.

Since the file names for udev rules and hardware description files matter,
the configuration items for rules and hardware cannot simply be plain
file-like objects with the rules content, because the name would be
ignored.  Instead, they are directory file-like objects that contain
optional rules in @file{lib/udev/rules.d} and optional hardware files in
@file{lib/udev/hwdb.d}.  This way, the service can be configured with whole
packages from which to take rules and hwdb files.

The @code{udev-service-type} can be @emph{extended} with file-like
directories that respect this hierarchy.  For convenience, the
@code{udev-rule} and @code{file->udev-rule} can be used to construct udev
rules, while @code{udev-hardware} and @code{file->udev-hardware} can be used
to construct hardware description files.

In an @code{operating-system} declaration, this service type can be
@emph{extended} using procedures @code{udev-rules-service} and
@code{udev-hardware-service}.
@end defvar

@deftp {Data Type} udev-configuration
Data type representing the configuration of udev.

@table @code
@item udev (default: @code{eudev}) (type: file-like)
Package object of the udev service.  This package is used at run-time, when
compiled for the target system.  In order to generate the @file{hwdb.bin}
hardware index, it is also used when generating the system definition,
compiled for the current system.

@item debug? (default: @code{#f}) (type: boolean)
Whether to enable debug output.  The debug output is written to the system
log, @file{/var/log/messages}.

@item rules (default: @code{'()}) (type: list-of-file-like)
List of file-like objects denoting udev rule files under a sub-directory.

@item hardware (default: @code{'()}) (type: list-of-file-like)
List of file-like objects denoting udev hardware description files under a
sub-directory.

@end table
@end deftp

@deffn {Procedimiento} 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 {Procedure} udev-hardware @var{file-name} @var{contents}
Return a udev hardware description file named @var{file-name} containing the
hardware information @var{contents}.
@end deffn

@deffn {Procedure} udev-rules-service @var{name} @var{rules} [#:groups '()]
Return a service that extends @code{udev-service-type} with @var{rules} and
@code{account-service-type} with @var{groups} as system groups.  This works
by creating a singleton service type @code{@var{name}-udev-rules}, of which
the returned service is an instance.

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 {Procedure} udev-hardware-service @var{name} @var{hardware}
Return a service that extends @code{udev-service-type} with @var{hardware}.
The service name is @code{@var{name}-udev-hardware}.
@end deffn

@deffn {Procedimiento} file->udev-rule @var{nombre-archivo} @var{archivo}
Return a udev-rule file named @var{file-name} containing the rules defined
within @var{file}, a file-like object.

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

Since guix package definitions can be included in @var{rules} in order to
use all their rules under the @file{lib/udev/rules.d} sub-directory, then in
lieu of the previous @var{file->udev-rule} example, we could have used the
@var{android-udev-rules} package which exists in Guix in the @code{(gnu
packages android)} module.

@deffn {Procedure} file->udev-hardware @var{file-name} @var{file}
Return a udev hardware description file named @var{file-name} containing the
rules defined within @var{file}, a file-like object.
@end deffn

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

@defvar 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 defvar

@defvar %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 defvar

@cindex ratón
@cindex gpm
@defvar 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 defvar

@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}
@defvar 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 defvar

@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

@defvar rngd-service-type
Type of the service that runs rng-tools rngd, whose value is an
@code{<rngd-configuration>} object.
@end defvar

@deftp {Data Type} rngd-configuration
Data type representing the configuration of rngd.

@table @asis
@item @code{rng-tools} (default: @code{rng-tools}) (type: file-like)
Package object of the rng-tools rngd.

@item @code{device} (default: @var{"/dev/hwrng"}) (type: string)
Path of the device to add to the kernel's entropy pool.  The service will
fail if @var{device} does not exist.

@end table
@end deftp

@cindex límites por sesión
@cindex ulimit
@cindex prioridad
@cindex tiempo real
@cindex jackd
@cindex nofile
@cindex open file descriptors
@anchor{pam-limits-service-type}
@defvar pam-limits-service-type
Type of the 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 value for this service type is 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.  By default, the
value is the empty list.

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
(service pam-limits-service-type
         (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
(service pam-limits-service-type
         (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 defvar

@defvar 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 an 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
                    (command
                     (greetd-user-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
                     (greetd-user-session
                      (command (file-append zsh "/bin/zsh"))
                      (command-args '("-l"))
                      (extra-env '(("MY_VAR" . "1")))
                      (xdg-env? #f))))))
                ;; 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 defvar

@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{extra-shepherd-requirement} (default: @code{'()})
This option can be used to provide a list of @emph{additional} symbols
naming Shepherd services that this service will depend on, such as
@code{'seatd} or @code{'elogind} when the terminal session is a graphical
greeter.

@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{source-profile?} (default: @code{#t})
Whether to source @file{/etc/profile} and @file{~/.profile}, when they
exist.

@item @code{initial-session-user} (default: @samp{#f})
The user to use for running the initial session, if any.

@item @code{initial-session-command} (default: @code{#f})
The command to run the first time the greeter starts up, to auto-login.  For
that to be useful, you should also set @code{initial-session-user}.  Then,
greetd will automatically log in with that user and execute that command.
When you eventually log out again, the regular greeter will appear.

@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 @code{greetd-agreety-session},
@code{greetd-wlgreet-sway-session}, @code{greetd-gtkgreet-sway-session} or a
file-like object to use as greeter.

@end table
@end deftp

@deftp {Data Type} greetd-user-session
Configuration record for the user session command.  Greeters require the
user command to be specified in some or another way.
@code{greetd-user-session} provides a common command for that.  Users should
prefer POSIX shell commands like @command{bash}, which can start an actual
user terminal shell, window manager or desktop environment with their own
mechanism, for example via @file{~/.bashrc} in the case of Bash.

@table @asis
@item @code{command} (default: @code{(file-append bash "/bin/bash")})
Command to be started by @command{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-session-type} (default: @code{"tty"})
Specify the value of @code{XDG_SESSION_TYPE}.  The user environment may
adapt depending on its value (normally by using @file{.bashrc} or similar).

@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 overridden.

@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 providing the @command{agreety} command.

@item @code{command} (default: @code{(greetd-user-session)})
Command to be started by @command{agreety} on successful login, an instance
of @code{greetd-user-session}.

@end table
@end deftp

@deftp {Data Type} greetd-wlgreet-configuration
Generic configuration record for the wlgreet greetd greeter.

@table @asis
@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.

@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{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.

@item @code{wlgreet} (default: @code{wlgreet})
The package providing the @command{wlgreet} command.

@item @code{wlgreet-configuration} (default: @code{(greetd-wlgreet-configuration)})
Configuration of @code{wlgreet} represented by
@code{greetd-wlgreet-configuration}.

@item @code{command} (default: @code{(greetd-user-session)})
Command to be started by @command{wlgreet} on successful login, an instance
of @code{greetd-user-session}.

@end table

Here is an example of a greetd configuration that uses wlgreet and Sway:

@lisp
  (greetd-configuration
   ;; The graphical greeter requires additional group membership.
   (greeter-supplementary-groups (list "video" "input" "seat"))
   (terminals
    (list (greetd-terminal-configuration
           ;; Sway requires seatd service.
           (extra-shepherd-requirement '(seatd))
           (terminal-vt "1")
           (terminal-switch #t)
           (default-session-command
            (greetd-wlgreet-sway-session
             (sway-configuration
              ;; Optional extra sway configuration.
              (local-file "sway-greetd.conf"))))))))
@end lisp
@end deftp

@deftp {Data Type} greetd-gtkgreet-sway-session
Registro de configuración para gtkgreet greetd greeter. Puede ser utilizado
como sigue:

@lisp
  (greetd-configuration
   ;; The graphical greeter requires additional groups membership.
   (greeter-supplementary-groups (list "video" "input" "seat"))
   (terminals
    (list (greetd-terminal-configuration
           ;; Sway requires the seatd service.
           (extra-shepherd-requirement '(seatd))
           (terminal-vt "1")
           (terminal-switch #t)
           (default-session-command
            (greetd-gtkgreet-sway-session
             (command
              (greetd-user-session
               ;; Optionally signal to .bashrc that we want the Wayland
               ;; compositor.
               (xdg-session-type "wayland")))))))))
@end lisp

@table @asis
@item @code{sway} (default: @code{sway})
The package providing the @command{sway} and @command{swaymsg} commands.

@item @code{sway-configuration} (default: @code{#f})
Extra file-like configuration for sway to be included before executing the
greeter.

@item @code{gtkgreet} (default: @code{gtkgreet})
The package providing the @command{gtkgreet} command.

@item @code{gtkgreet-style} (default: @code{#f})
Extra file-like CSS stylesheet to customize the GTK look.

@item @code{command} (default: @code{(greetd-user-session)})
The command to be started by @command{gtkgreet} on successful login, an
instance of @code{greetd-user-session}.

@end table
@end deftp

@node Ejecución de tareas programadas
@subsection Ejecución de tareas programadas

@cindex cron
@cindex planificación de trabajos
It is often useful to have system tasks run periodically.  This can be
achieved by defining Shepherd @dfn{timers} or by using the historical and
somewhat less flexible mcron service.

@subsubsection Shepherd Timers

@cindex timers, Shepherd
@cindex Shepherd timers
The Shepherd supports running jobs periodically by defining @dfn{timers}, a
special kind of service.  A Shepherd timer can be defined like another
Shepherd service, but with specific @code{start} and @code{stop} methods
(@pxref{Servicios de Shepherd}):

@lisp
;; Defining a timer, verbosely.
(shepherd-service
 (provision '(updatedb))
 (requirement '(user-processes))
 (modules '((shepherd service timer)))
 (start #~(make-timer-constructor
           ;; Everyday at 3AM (using Vixie cron syntax).
           (cron-string->calendar-event "0 3 * * *")
           (command '(#$(file-append findutils "/bin/updatedb")))
           #:wait-for-termination? #t))
 (stop #~(make-timer-destructor))
 (documentation "Periodically run 'updatedb'.")
 (actions (list shepherd-trigger-action)))
@end lisp

This is quite some boilerplate so you can instead use this equivalent
shorthand notation:

@lisp
;; Equivalent timer definition, but shorter.
(shepherd-timer '(updatedb) "0 3 * * *"
                #~(#$(file-append findutils "/bin/updatedb"))
                #:requirement '(user-processes))
@end lisp

Este procedimiento está definido como sigue.

@anchor{shepherd-timer-procedure}
@deffn {Procedure} shepherd-timer @var{provision} @var{schedule} @
         @var{command} [#:requirement '()] @ [#:documentation
%default-timer-documentation] Return a Shepherd service with the given
@var{provision} periodically running @var{command}, a list-valued gexp,
according to @var{schedule}, a string in Vixie cron syntax or a gexp
providing a Shepherd calendar event.  @var{documentation} is the string that
appears when running @code{herd doc @var{service}}.
@end deffn

El ejemplo previo muestra cómo definir un temporizador y añadirlo a su
configuración del sistema operativo.

@lisp
(use-modules (gnu))
(use-service-modules shepherd)
(use-package-modules base)

(define updatedb-timer
  ;; Run 'updatedb' at 3AM everyday.
  (shepherd-timer '(updatedb)
                  "0 3 * * *"  ;Vixie cron syntax
                  #~(#$(file-append findutils "/bin/updatedb")
                     "--prunepaths=/tmp /var/tmp /gnu/store")
                  #:requirement '(user-processes)))

(define garbage-collection-timer
  ;; Run 'guix gc' everyday at 5AM.
  (shepherd-timer '(garbage-collection)
                  #~(calendar-event #:hours '(5) #:minutes '(0))
                  #~("/run/current-system/profile/bin/guix"
                     "gc" "-F" "10G")
                  #:requirement '(guix-daemon)))

(operating-system
  ;; @dots{}

  ;; Extend the Shepherd service with additional timers
  ;; using 'simple-service'.
  (services (cons (simple-service 'my-timers
                                   shepherd-root-service-type
                                   (list garbage-collection-timer
                                         updatedb-timer))
                  %base-services)))
@end lisp

The resulting system contains these two services, which can be inspected
with @command{herd status}.  They can also be triggered manually:

@example
herd trigger garbage-collection
@end example

@xref{Timers,,, shepherd, The GNU Shepherd Manual} for more information on
Shepherd timers.

@anchor{mcron-service}
@subsubsection Mcron

@cindex mcron
Alternatively, the @code{(gnu services mcron)} module provides an interface
to GNU@tie{}mcron, a daemon to run jobs at scheduled times (@pxref{Top,,,
mcron, GNU@tie{}mcron}).  GNU@tie{}mcron is similar to the traditional Unix
@command{cron} daemon; the main difference is that it is implemented in
Guile Scheme.  It is overall less convenient than Shepherd timers:
individual jobs cannot depend on specific Shepherd services, logging is
coarse-grain (one file for all the jobs), jobs may not be inspected,
updated, or triggered manually.

@quotation Nota
For the reasons given above, we recommend using Shepherd timers rather than
mcron for your periodic tasks.
@end quotation

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 ()
           (system* (string-append #$findutils "/bin/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

@quotation Tip
Avoid calling the Guile procedures @code{execl}, @code{execle} or
@code{execlp} inside a job specification, else mcron won't be able to output
the completion status of the job.
@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

@defvar 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 defvar

@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-file} (default: @code{"/var/log/mcron.log"}) (type: string)
Log file location.

@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.

@item @code{date-format} (type: maybe-string)
@code{(srfi srfi-19)} format string for date.

@end table
@end deftp
@c %end of fragment

@node Rotación del registro de mensajes
@subsection Rotación del registro de mensajes

@cindex rotación de logs
@cindex logging
Log files such as those found in @file{/var/log} tend to grow endlessly, so
it's a good idea to @dfn{rotate} them once in a while---i.e., archive their
contents in separate files, possibly compressed.  The @code{(gnu services
admin)} module provides an interface to the log rotation service provided by
the Shepherd (@pxref{Log Rotation Service,,, shepherd, The GNU Shepherd
Manual}).

This log rotation service is made available through
@code{log-rotation-service-type}, which takes a
@code{log-rotation-configuration} record as its value.  By default, this
provides @code{log-rotation}, a Shepherd ``timed service'' that runs
periodically---once a week by default.  It automatically knows about the log
files produced by Shepherd services and can be taught about external log
files.  You can inspect the service and see when it's going to run the usual
way:

@example
$ sudo herd status log-rotation
Status of log-rotation:
  It is running since Mon 09 Dec 2024 03:27:47 PM CET (2 days ago).
  @dots{}

Upcoming timer alarms:
  Sun 15 Dec 2024 10:00:00 PM CET (in 4 days)
  Sun 22 Dec 2024 10:00:00 PM CET (in 11 days)
  Sun 29 Dec 2024 10:00:00 PM CET (in 18 days)
@end example

You can also list files subject to rotation with @command{herd files
log-rotation} and trigger rotation manually with @command{herd trigger
log-rotation}.

This service is part of @code{%base-services}, and thus enabled by default,
with the default settings.

@defvar log-rotation-service-type
This is the type of the log rotation service.  Its associated value must be
a @code{log-rotation-configuration} record, as discussed below.
@end defvar

@c %start of fragment
@anchor{log-rotation-configuration}

@deftp {Data Type} log-rotation-configuration
Available @code{log-rotation-configuration} fields are:

@table @asis
@item @code{provision} (default: @code{(log-rotation)}) (type: list-of-symbols)
The name(s) of the log rotation Shepherd service.

@item @code{requirement} (default: @code{(user-processes)}) (type: list-of-symbols)
Dependencies of the log rotation Shepherd service.

@item @code{calendar-event} (type: gexp)
Gexp containing the @dfn{calendar event} when log rotation occurs.
@xref{Timers,,,shepherd,The GNU Shepherd Manual}, for more information on
calendar events.

@item @code{external-log-files} (default: @code{()}) (type: list-of-strings)
List of file names, external log files that should also be rotated.

@item @code{compression} (default: @code{zstd}) (type: gexp-or-symbol)
The compression method used for rotated log files, one of @code{'none},
@code{'gzip}, and @code{'zstd}.  Alternatively, it can be a gexp that
evaluates to a procedure; that procedure gets called with the file to be
rotated.

@item @code{expiry} (type: gexp-or-integer)
Age in seconds after which a log file is deleted.

@item @code{size-threshold} (type: gexp-or-integer)
Size in bytes below which a log file is @emph{not} rotated.

@end table

@end deftp


@c %end of fragment

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.

@defvar 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 defvar

@deftp {Data Type} log-cleanup-configuration
Tipo de datos que representa la configuración de purga del registro de
mensajes

@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 * *"})
Schedule of the log cleanup job written either as a string in traditional
cron syntax or as a gexp representing a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).
@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.  This file is subject to log
rotation @i{via} the Shepherd's log rotation service (@pxref{Rotación del registro de mensajes}).
@end table

The following optional settings may be provided:

@table @code
@item debug?
Print debug messages when @code{#true}.

@item skip-private?
When @code{#true} do not mask addresses in private ranges.

@item column
A 1-based indexed column number.  Assume IP address is in the specified
column (default is 1).

@item replacement
Replacement string in case address parsing fails, e.g. @code{"0.0.0.0"}.

@item ipv4mask
Number of bits to mask in IPv4 addresses.

@item ipv6mask
Number of bits to mask in IPv6 addresses.

@item increment
Increment the IP address by the given number.  By default this is zero.

@item delimiter
Log delimiter string.

@item 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.

@defvar 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 controlador de interfaz de red (NIC)
@cindex NIC, controlador de interfaz de red
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 defvar

@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{'()})
El listado de servicios Shepherd en el cual depende.
@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}).  During startup, network links are employed to construct or modify
existing or virtual ethernet links.  These ethernet links can be identified
by their @var{name} or @var{mac-address}.  If there is a need to create
virtual interface, @var{name} and @var{type} fields are required.

@table @code
@item name
The name of the link---e.g., @code{"v0p0"} (default: @code{#f}).

@item type
A symbol denoting the type of the link---e.g., @code{'veth} (default:
@code{#f}).

@item mac-address
The mac-address of the link---e.g., @code{"98:11:22:33:44:55"} (default:
@code{#f}).

@item arguments
List of arguments for this type of link.
@end table
@end deftp

Consider a scenario where a server equipped with a network interface which
has multiple ports.  These ports are connected to a switch, which supports
@uref{https://en.wikipedia.org/wiki/Link_aggregation, link aggregation}
(also known as bonding or NIC teaming).  The switch uses port channels to
consolidate multiple physical interfaces into one logical interface to
provide higher bandwidth, load balancing, and link redundancy.  When a port
is added to a LAG (or link aggregation group), it inherits the properties of
the port-channel.  Some of these properties are VLAN membership, trunk
status, and so on.

@uref{https://en.wikipedia.org/wiki/Virtual_LAN, VLAN} (or virtual local
area network) is a logical network that is isolated from other VLANs on the
same physical network.  This can be used to segregate traffic, improve
security, and simplify network management.

With all that in mind let's configure our static network for the server.  We
will bond two existing interfaces together using 802.3ad schema and on top
of it, build a VLAN interface with id 1055.  We assign a static ip to our
new VLAN interface.

@lisp
(static-networking
 (links (list (network-link
               (name "bond0")
               (type 'bond)
               (arguments '((mode . "802.3ad")
                            (miimon . 100)
                            (lacp-active . "on")
                            (lacp-rate . "fast"))))

              (network-link
               (mac-address "98:11:22:33:44:55")
               (arguments '((master . "bond0"))))

              (network-link
               (mac-address "98:11:22:33:44:56")
               (arguments '((master . "bond0"))))

              (network-link
               (name "bond0.1055")
               (type 'vlan)
               (arguments '((id . 1055)
                            (link . "bond0"))))))
 (addresses (list (network-address
                   (value "192.168.1.4/24")
                   (device "bond0.1055")))))
@end lisp

@cindex loopback device
@defvar %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 defvar

@cindex networking, with QEMU
@cindex QEMU, networking
@defvar %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 defvar

@cindex DHCP, servicio de red
@defvar dhcp-client-service-type
This is the type of services that run @var{dhclient}, the ISC Dynamic Host
Configuration Protocol (DHCP) client.
@end defvar

@deftp {Data Type} dhcp-client-configuration
Data type representing the configuration of the ISC DHCP client service.

@table @asis
@item @code{package} (predeterminado: @code{isc-dhcp})
The ISC DHCP client package to use.

@item @code{interfaces} (default: @code{'all})
Either @code{'all} or the list of interface names that the ISC DHCP client
should listen on---e.g., @code{'("eno1")}.

When set to @code{'all}, the ISC DHCP client listens on all the available
non-loopback interfaces that can be activated.  Otherwise the ISC DHCP
client listens only on the specified interfaces.

@item @code{config-file} (predeterminado: @code{#f})
The configuration file for the ISC DHCP client.

@item @code{version} (predeterminada: @code{"4"})
The DHCP protocol version to use, as a string.  Accepted values are
@code{"4"} or @code{"6"} for DHCPv4 or DHCPv6, respectively, as well as
@code{"4o6"}, for DHCPv4 over DHCPv6 (as specified by RFC 7341).

@item @code{shepherd-requirement} (default: @code{'()})
@itemx @code{shepherd-provision} (default: @code{'(networking)})
This option can be used to provide a list of symbols naming Shepherd
services that this service will depend on, such as @code{'wpa-supplicant} or
@code{'iwd} if you require authenticated access for encrypted WiFi or
Ethernet networks.

Likewise, @code{shepherd-provision} is a list of Shepherd service names
(symbols) provided by this service.  You might want to change the default
value if you intend to run several ISC DHCP clients, only one of which
provides the @code{networking} Shepherd service.
@end table
@end deftp

@cindex DHCPCD, networking service

@defvar dhcpcd-service-type
This the type for a service running @command{dhcpcd}, a @acronym{DHCP,
Dynamic Host Configuration Protocol} client that can be used as a
replacement for the historical ISC client supported by
@code{dhcp-client-service-type}.

Its value must be a @code{dhcpcd-configuration} record, as described below.
As an example, consider the following setup which runs @command{dhcpcd} with
a local @acronym{DNS, Domain Name System} resolver:

@lisp
(service dhcpcd-service-type
  (dhcpcd-configuration
    (option '("rapid_commit" "interface_mtu"))
    (no-option '("nd_rdnss"
                 "dhcp6_name_servers"
                 "domain_name_servers"
                 "domain_name"
                 "domain_search"))
    (static '("domain_name_servers=127.0.0.1"))
    (no-hook '("hostname"))))
@end lisp
@end defvar


@c %start of fragment

@deftp {Data Type} dhcpcd-configuration
Available @code{dhcpcd-configuration} fields are:

@table @asis
@item @code{interfaces} (default: @code{()}) (type: list)
List of networking interfaces---e.g., @code{"eth0"}---to start a DHCP client
for.  If no interface is specified (i.e., the list is empty) then
@command{dhcpcd} discovers available Ethernet interfaces, that can be
configured, automatically.

@item @code{command-arguments} (default: @code{("-q" "-q")}) (type: list)
List of additional command-line options.

@item @code{host-name} (default: @code{""}) (type: maybe-string)
Host name to send via DHCP, defaults to the current system host name.

@item @code{duid} (default: @code{""}) (type: maybe-string)
DHCPv4 clients require a unique client identifier, this option uses the
DHCPv6 Unique Identifier as a DHCPv4 client identifier as well.  For more
information, refer to @uref{https://www.rfc-editor.org/rfc/rfc4361,RFC 4361}
and @code{dhcpcd.conf(5)}.

@item @code{persistent?} (default: @code{#t}) (type: boolean)
When true, automatically de-configure the interface when @command{dhcpcd}
exits.

@item @code{option} (default: @code{("rapid_commit" "domain_name_servers" "domain_name" "domain_search" "host_name" "classless_static_routes" "interface_mtu")}) (type: list-of-strings)
List of options to request from the server.

@item @code{require} (default: @code{("dhcp_server_identifier")}) (type: list-of-strings)
List of options to require in responses.

@item @code{slaac} (default: @code{"private"}) (type: maybe-string)
Interface identifier used for SLAAC generated IPv6 addresses.

@item @code{no-option} (default: @code{()}) (type: list-of-strings)
List of options to remove from the message before it's processed.

@item @code{no-hook} (default: @code{()}) (type: list-of-strings)
List of hook script which should not be invoked.

@item @code{static} (default: @code{()}) (type: list-of-strings)
DHCP client can request different options from a DHCP server, through
@code{static} it is possible to configure static values for selected
options.  For example, @code{"domain_name_servers=127.0.0.1"}.

@item @code{vendor-class-id} (type: maybe-string)
Set the DHCP Vendor Class (e.g., @code{MSFT}).  For more information, refer
to @uref{https://www.rfc-editor.org/rfc/rfc2132#section-9.13,RFC 2132}.

@item @code{client-id} (type: maybe-string)
Use the interface hardware address or the given string as a client
identifier, this is mutually exclusive with the @code{duid} option.

@item @code{extra-content} (type: maybe-string)
Extra content to append to the configuration as-is.

@item @code{shepherd-provision} (default: @code{(networking)}) (type: list-of-symbols)
This is a list of symbols naming Shepherd services provided by this service.

@item @code{shepherd-requirement} (default: @code{()}) (type: list-of-symbols)
This is a list of symbols naming Shepherd services that this service will
depend on.

@end table

@end deftp


@c %end of fragment

@cindex NetworkManager

@defvar 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 defvar

@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{shepherd-requirement} (default: @code{'(wireless-daemon)})
This option can be used to provide a list of symbols naming Shepherd
services that this service will depend on. The default
@code{'wireless-daemon} is provided by @code{'wpa-supplicant-service-type}
and @code{'iwd-service-type}.  Make sure you have one of these
configured. Note, that @code{%desktop-services} already include
@code{wpa-supplicant-service-type}.

@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.

@item @code{extra-configuration-files} (default: @code{'()})
A list of two-element lists; the first element of each list is a file name
(as a string), and the second is a file-like object.  Used to specify
configuration files which will be added to the
@file{/etc/NetworkManager/conf.d}.  NetworkManager will read additional
configuration from this directory.  For details on configuration file
precedence and the configuration file format, see @samp{man 5
NetworkManager.conf}.

For example, to add two files named @file{001-basic.conf} and
@file{002-unmanaged.conf}:

@lisp
(service network-manager-service-type
         (network-manager-configuration
          (extra-configuration-files
           `(("001-basic.conf" ,(local-file "basic.conf"))
             ("002-unmanaged.conf" ,(plain-file "constructed-unmanaged.conf"
                                                "\
[keyfile]
unmanaged-devices=interface-name:wlo1_ap\n"))))))
@end lisp

@end table
@end deftp

@cindex Connman
@defvar 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 defvar

@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{shepherd-requirement} (default: @code{'()})
This option can be used to provide a list of symbols naming Shepherd
services that this service will depend on, such as @code{'wpa-supplicant} or
@code{'iwd} if you require authenticated access for encrypted WiFi or
Ethernet networks.

@item @code{disable-vpn?} (predeterminado: @code{#f})
Cuando es verdadero, desactiva el módulo vpn de connman.

@item @code{general-configuration} (default: @code{(connman-general-configuration)})
Configuration serialized to @file{main.conf} and passed as @option{--config}
to @command{connmand}.

@end table
@end deftp

@c %start of fragment

@deftp {Data Type} connman-general-configuration
Available @code{connman-general-configuration} fields are:

@table @asis
@item @code{input-request-timeout} (type: maybe-number)
Set input request timeout.  Default is 120 seconds.  The request for inputs
like passphrase will timeout after certain amount of time.  Use this setting
to increase the value in case of different user interface designs.

@item @code{browser-launch-timeout} (type: maybe-number)
Set browser launch timeout.  Default is 300 seconds.  The request for
launching a browser for portal pages will timeout after certain amount of
time.  Use this setting to increase the value in case of different user
interface designs.

@item @code{background-scanning?} (type: maybe-boolean)
Enable background scanning.  Default is true.  If wifi is disconnected, the
background scanning will follow a simple back off mechanism from 3s up to 5
minutes.  Then, it will stay in 5 minutes unless user specifically asks for
scanning through a D-Bus call.  If so, the mechanism will start again from
3s.  This feature activates also the background scanning while being
connected, which is required for roaming on wifi.  When
@code{background-scanning?} is false, ConnMan will not perform any scan
regardless of wifi is connected or not, unless it is requested by the user
through a D-Bus call.

@item @code{use-gateways-as-timeservers?} (type: maybe-boolean)
Assume that service gateways also function as timeservers.  Default is
false.

@item @code{fallback-timeservers} (type: maybe-list)
List of Fallback timeservers.  These timeservers are used for NTP sync when
there are no timeservers set by the user or by the service, and when
@code{use-gateways-as-timeservers?} is @code{#f}.  These can contain a mixed
combination of fully qualified domain names, IPv4 and IPv6 addresses.

@item @code{fallback-nameservers} (type: maybe-list)
List of fallback nameservers appended to the list of nameservers given by
the service.  The nameserver entries must be in numeric format, host names
are ignored.

@item @code{default-auto-connect-technologies} (type: maybe-list)
List of technologies that are marked autoconnectable by default.  The
default value for this entry when empty is @code{"ethernet"}, @code{"wifi"},
@code{"cellular"}.  Services that are automatically connected must have been
set up and saved to storage beforehand.

@item @code{default-favourite-technologies} (type: maybe-list)
List of technologies that are marked favorite by default.  The default value
for this entry when empty is @code{"ethernet"}.  Connects to services from
this technology even if not setup and saved to storage.

@item @code{always-connected-technologies} (type: maybe-list)
List of technologies which are always connected regardless of
preferred-technologies setting (@code{auto-connect?} @code{#t}).  The
default value is empty and this feature is disabled unless explicitly
enabled.

@item @code{preferred-technologies} (type: maybe-list)
List of preferred technologies from the most preferred one to the least
preferred one.  Services of the listed technology type will be tried one by
one in the order given, until one of them gets connected or they are all
tried.  A service of a preferred technology type in state 'ready' will get
the default route when compared to another preferred type further down the
list with state 'ready' or with a non-preferred type; a service of a
preferred technology type in state 'online' will get the default route when
compared to either a non-preferred type or a preferred type further down in
the list.

@item @code{network-interface-blacklist} (type: maybe-list)
List of blacklisted network interfaces.  Found interfaces will be compared
to the list and will not be handled by ConnMan, if their first characters
match any of the list entries.  Default value is @code{"vmnet"},
@code{"vboxnet"}, @code{"virbr"}, @code{"ifb"}.

@item @code{allow-hostname-updates?} (type: maybe-boolean)
Allow ConnMan to change the system hostname.  This can happen for example if
we receive DHCP hostname option.  Default value is @code{#t}.

@item @code{allow-domainname-updates?} (type: maybe-boolean)
Allow connman to change the system domainname.  This can happen for example
if we receive DHCP domainname option.  Default value is @code{#t}.

@item @code{single-connected-technology?} (type: maybe-boolean)
Keep only a single connected technology at any time.  When a new service is
connected by the user or a better one is found according to
preferred-technologies, the new service is kept connected and all the other
previously connected services are disconnected.  With this setting it does
not matter whether the previously connected services are in 'online' or
'ready' states, the newly connected service is the only one that will be
kept connected.  A service connected by the user will be used until going
out of network coverage.  With this setting enabled applications will notice
more network breaks than normal.  Note this options can't be used with
VPNs.  Default value is @code{#f}.

@item @code{tethering-technologies} (type: maybe-list)
List of technologies that are allowed to enable tethering.  The default
value is @code{"wifi"}, @code{"bluetooth"}, @code{"gadget"}.  Only those
technologies listed here are used for tethering.  If one wants to tether
ethernet, then add @code{"ethernet"} in the list.  Note that if ethernet
tethering is enabled, then a DHCP server is started on all ethernet
interfaces.  Tethered ethernet should never be connected to corporate or
home network as it will disrupt normal operation of these networks.  Due to
this ethernet is not tethered by default.  Do not activate ethernet
tethering unless you really know what you are doing.

@item @code{persistent-tethering-mode?} (type: maybe-boolean)
Restore earlier tethering status when returning from offline mode,
re-enabling a technology, and after restarts and reboots.  Default value is
@code{#f}.

@item @code{enable-6to4?} (type: maybe-boolean)
Automatically enable anycast 6to4 if possible.  This is not recommended, as
the use of 6to4 will generally lead to a severe degradation of connection
quality.  See RFC6343.  Default value is @code{#f} (as recommended by
RFC6343 section 4.1).

@item @code{vendor-class-id} (type: maybe-string)
Set DHCP option 60 (Vendor Class ID) to the given string.  This option can
be used by DHCP servers to identify specific clients without having to rely
on MAC address ranges, etc.

@item @code{enable-online-check?} (type: maybe-boolean)
Enable or disable use of HTTP GET as an online status check.  When a service
is in a READY state, and is selected as default, ConnMan will issue an HTTP
GET request to verify that end-to-end connectivity is successful.  Only then
the service will be transitioned to ONLINE state.  If this setting is false,
the default service will remain in READY state.  Default value is @code{#t}.

@item @code{online-check-ipv4-url} (type: maybe-string)
IPv4 URL used during the online status check.  Please refer to the README
for more detailed information.  Default value is
@uref{http://ipv4.connman.net/online/status.html}.

@item @code{online-check-ipv6-url} (type: maybe-string)
IPv6 URL used during the online status check.  Please refer to the README
for more detailed information.  Default value is
@uref{http://ipv6.connman.net/online/status.html}.

@item @code{online-check-initial-interval} (type: maybe-number)
Range of intervals between two online check requests.  Please refer to the
README for more detailed information.  Default value is @samp{1}.

@item @code{online-check-max-interval} (type: maybe-number)
Range of intervals between two online check requests.  Please refer to the
README for more detailed information.  Default value is @samp{1}.

@item @code{enable-online-to-ready-transition?} (type: maybe-boolean)
WARNING: This is an experimental feature.  In addition to
@code{enable-online-check} setting, enable or disable use of HTTP GET to
detect the loss of end-to-end connectivity.  If this setting is @code{#f},
when the default service transitions to ONLINE state, the HTTP GET request
is no more called until next cycle, initiated by a transition of the default
service to DISCONNECT state.  If this setting is @code{#t}, the HTTP GET
request keeps being called to guarantee that end-to-end connectivity is
still successful.  If not, the default service will transition to READY
state, enabling another service to become the default one, in replacement.
Default value is @code{#f}.

@item @code{auto-connect-roaming-services?} (type: maybe-boolean)
Automatically connect roaming services.  This is not recommended unless you
know you won't have any billing problem.  Default value is @code{#f}.

@item @code{address-conflict-detection?} (type: maybe-boolean)
Enable or disable the implementation of IPv4 address conflict detection
according to RFC5227.  ConnMan will send probe ARP packets to see if an IPv4
address is already in use before assigning the address to an interface.  If
an address conflict occurs for a statically configured address, an IPv4LL
address will be chosen instead (according to RFC3927).  If an address
conflict occurs for an address offered via DHCP, ConnMan sends a DHCP
DECLINE once and for the second conflict resorts to finding an IPv4LL
address.  Default value is @code{#f}.

@item @code{localtime} (type: maybe-string)
Path to localtime file.  Defaults to @file{/etc/localtime}.

@item @code{regulatory-domain-follows-timezone?} (type: maybe-boolean)
Enable regulatory domain to be changed along timezone changes.  With this
option set to true each time the timezone changes the first present ISO3166
country code is read from @file{/usr/share/zoneinfo/zone1970.tab} and set as
regulatory domain value.  Default value is @code{#f}.

@item @code{resolv-conf} (type: maybe-string)
Path to resolv.conf file.  If the file does not exist, but intermediate
directories exist, it will be created.  If this option is not set, it tries
to write into @file{/var/run/connman/resolv.conf} if it fails
(@file{/var/run/connman} does not exist or is not writeable).  If you do not
want to update resolv.conf, you can set @file{/dev/null}.

@end table

@end deftp

@cindex WPA Supplicant
@defvar 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 defvar

@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{shepherd-requirement} (default: @code{(user-processes loopback syslogd)}
Lista de servicios que deben iniciarse antes del arranque de WPA Supplicant.

@item @code{shepherd-provision} (default: @code{(wpa-supplicant wireless-daemon)}) (type: list-of-symbols)
The name(s) of the service.

@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 iwd, iNet Wireless Daemon
@defvar iwd-service-type
This is the service type to run iwd, the @uref{https://iwd.wiki.kernel.org/,
iNet Wireless Daemon}, a daemon required to authenticate against encrypted
WiFi networks.
@end defvar

@quotation Aviso
By default @code{iwd} removes and re-creates interfaces it manages.  It
doesn't play nicely with @code{dhcp-client-service-type} that enumerates
wireless interfaces before starting the Shepherd service.  Use either
@code{dhcpcd-service-type} or the @code{iwd}'s built-in DHCP client (see
@code{enable-network-configuration} option below).
@end quotation

@quotation Aviso
@code{iwd-service-type} conflicts with @code{wpa-supplicant-service-type}.
Make sure only one is configured.
@end quotation

@c %start of fragment

@deftp {Data Type} iwd-configuration
Available @code{iwd-configuration} fields are:

@table @asis
@item @code{iwd} (default: @code{iwd}) (type: file-like)
The IWD package to use.

@item @code{interfaces} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network
interfaces that IWD will control.

@item @code{ignored-interfaces} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network
interfaces that IWD will not manage.

@item @code{phys} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network PHYs
names that IWD will control.

@item @code{ignored-phys} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network PHYs
names that IWD will not manage.

@item @code{shepherd-requirement} (default: @code{()}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{shepherd-provision} (default: @code{(iwd wireless-daemon)}) (type: list-of-symbols)
The name(s) of the service.

@item @code{config} (type: iwd-settings)
Configuration settings.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-settings
Available @code{iwd-settings} fields are:

@table @asis
@item @code{general} (type: iwd-general-settings)
General settings.

@item @code{network} (default: @code{(iwd-network-settings)}) (type: maybe-iwd-network-settings)
Network settings.

@item @code{scan} (type: maybe-iwd-scan-settings)
Scan settings.

@item @code{extra-config} (default: @code{()}) (type: list-of-strings)
Extra configuration values to append to the IWD configuration file.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-general-settings
Available @code{iwd-general-settings} fields are:

@table @asis
@item @code{enable-network-configuration?} (default: @code{#f}) (type: boolean)
Setting this option to true enables @code{iwd} to configure the network
interfaces with the IP addresses.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the General settings group.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-network-settings
Available @code{iwd-network-settings} fields are:

@table @asis
@item @code{enable-ipv6?} (default: @code{#t}) (type: boolean)
Sets the global default that tells @code{iwd} whether it should configure
IPv6 addresses and routes

@item @code{name-resolving-service} (default: @code{none}) (type: resolving-service)
Configures a DNS resolution method used by the system.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the Network settings group.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-scan-settings
Available @code{iwd-scan-settings} fields are:

@table @asis
@item @code{disable-periodic-scan?} (default: @code{#f}) (type: boolean)
Setting this option to @code{#t} will prevent @code{iwd} from issuing the
periodic scans for the available networks while disconnected.

@item @code{initial-periodic-scan-interval} (default: @code{10}) (type: number)
The initial periodic scan interval upon disconnect (in seconds).

@item @code{maximum-periodic-scan-interval} (default: @code{300}) (type: number)
The maximum periodic scan interval (in seconds).

@item @code{disable-roaming-scan?} (default: @code{#f}) (type: boolean)
Setting this option to @code{#t} will prevent @code{iwd} from trying to scan
when roaming decisions are activated.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the Scan settings group.

@end table

@end deftp


@c %end of fragment

@cindex ModemManager
Some networking devices such as modems require special care, and this is
what the services below focus on.

@defvar 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 defvar

@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)

@defvar 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 defvar

@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.

@defvar 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 defvar

@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
@defvar 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 defvar

@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

@defvar 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 defvar


@cindex iptables
@defvar 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 defvar

@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
@cindex firewall, nftables
@defvar nftables-service-type
Es el tipo de servicio para levantar una configuración de nftables. nftables
es un proyecto de netfilter que quiere reemplazar los entornos iptables,
ip6tables, arptables y ebtables. Proporciona un entorno de filtrado de
paquetes nuevo, una utilidad @command{nft} de espacio de usuaria nueva y una
capa de compatibilidad con iptables. El servicio viene con un conjunto de
reglas predeterminado @code{%default-nftables-ruleset} que rechaza todas las
conexiones entrantes excepto las del puerto 22 (TCP) de SSH. Para usarlo,
simplemente escriba:

@lisp
(service nftables-service-type)
@end lisp
@end defvar

@c %start of fragment

@deftp {Tipo de datos} nftables-configuration
Available @code{nftables-configuration} fields are:

@table @asis
@item @code{package} (default: @code{nftables}) (type: file-like)
The @code{nftables} package to use.

@item @code{debug-levels} (type: maybe-list-of-debug-levels)
A list of debug levels, for enabling debugging output.  Valid debug level
values are the @samp{scanner}, @samp{parser}, @samp{eval}, @samp{netlink},
@samp{mnl}, @samp{proto-ctx}, @samp{segtree} or @samp{all} symbols.

@item @code{ruleset} (type: file-like)
A file-like object containing the complete nftables ruleset.  The default
ruleset rejects all incoming connections except those to TCP port 22, with
connections from the loopback interface are allowed.

@end table

@end deftp


@c %end of fragment

@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
@defvar 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 defvar

@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

@defvar %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 defvar

@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
@defvar 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 defvar

@defvar %openntpd-servers
Esta variable es una lista de las direcciones de servidores definidos en
@code{%ntp-servers}.
@end defvar

@deftp {Tipo de datos} openntpd-configuration
@table @asis
@item @code{openntpd} (default: @code{openntpd})
The openntpd package to use.
@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
@defvar 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 defvar

@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
@defvar 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 defvar

@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
@defvar tor-service-type
Type for a service that runs the @uref{https://torproject.org, Tor}
anonymous networking daemon.  The service is configured using a
@code{<tor-configuration>} record.  By default, the Tor daemon runs as the
@code{tor} unprivileged user, which is a member of the @code{tor} group.

@cindex onion services, for Tor
Services of this type can be extended by other services to specify
@dfn{onion services} (in addition to those already specified in
@code{tor-configuration}) as in this example:

@lisp
(simple-service 'my-extra-onion-service tor-service-type
                (list (tor-onion-service-configuration
                        (name "extra-onion-service")
                        (mapping '((80 "127.0.0.1:8080"))))))
@end lisp
@end defvar

@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{'()})
The list of @code{<tor-onion-service-configuration>} records to use.  For
any onion service you include in this list, appropriate configuration to
enable the onion service will be automatically added to the default
configuration file.

@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.

@item @code{transport-plugins} (default: @code{'()})
The list of @code{<tor-transport-plugin>} records to use.  For any transport
plugin you include in this list, appropriate configuration line to enable
transport plugin will be automatically added to the default configuration
file.

@item @code{auto-start?} (predeterminado: @code{#t})
Whether or not to start the Tor daemon on boot.

@end table
@end deftp

@cindex servicio cebolla, tor
@deftp {Data Type} tor-onion-service-configuration
Data Type representing a Tor @dfn{Onion Service} configuration.  See
@url{https://community.torproject.org/onion-services/, the Tor project's
documentation} for more information.  Available
@code{tor-onion-service-configuration} fields are:

@table @asis
@item @code{name} (type: string)
Name for this Onion Service.  This creates a
@file{/var/lib/tor/hidden-services/@var{name}} directory, where the
@file{hostname} file contains the @indicateurl{.onion} host name for this
Onion Service.

@item @code{mapping} (type: alist)
Association list of port to address mappings.  The following example:
@lisp
'((22 "127.0.0.1:22")
  (80 "127.0.0.1:8080"))
@end lisp
maps ports 22 and 80 of the Onion Service to the local ports 22 and 8080.

@end table
@end deftp

@cindex pluggable transports, tor
@deftp {Data Type} tor-transport-plugin
Data type representing a Tor pluggable transport plugin in
@code{tor-configuration}.  Plugguble transports are programs that disguise
Tor traffic, which can be useful in case Tor is censored.  See the the Tor
project's @url{https://tb-manual.torproject.org/circumvention/,
documentation} and @url{https://spec.torproject.org/pt-spec/index.html,
specification} for more information.

Each transport plugin corresponds either to @code{ClientTransportPlugin ...}
or to @code{ServerTransportPlugin ...} line in the default configuration
file, see @command{man tor}.  Available @code{tor-transport-plugin} fields
are:

@table @asis
@item @code{role} (default: @code{'client})
This must be either @code{'client} or @code{'server}.  Otherwise, an error
is raised.  Set the @code{'server} value if you want to run a bridge to help
censored users connect to the Tor network, see
@url{https://community.torproject.org/relay/setup/bridge/, the Tor project's
bridge guide}.  Set the @code{'client} value if you want to connect to
somebody else's bridge, see @url{https://bridges.torproject.org/, the Tor
project's ``Get Bridges'' page}.  In both cases the required additional
configuration should be provided via @code{#:config-file} option of
@code{tor-configuration}.
@item @code{protocol} (default: @code{"obfs4"})
A string that specifies a pluggable transport protocol.
@item @code{program}
This must be a ``file-like'' object or a string pointing to the pluggable
transport plugin executable.  This option allows the Tor daemon run inside
the container to access the executable and all the references (e.g. package
dependencies) attached to it.
@end table

Suppose you would like Tor daemon to use obfs4 type obfuscation and to
connect to Tor network via obfs4 bridge (a nonpublic Tor relay with support
for obfs4 type obfuscation). Then you may go to
@url{https://bridges.torproject.org/, https://bridges.torproject.org/} and
get there a couple of bridge lines (each starts with @code{obfs4 ...})  and
use these lines in tor-service-type configuration as follows:
@lisp
(service tor-service-type
	 (tor-configuration
	  (config-file (plain-file "torrc"
				   "\
UseBridges 1
Bridge obfs4 ...
Bridge obfs4 ..."))
	  (transport-plugins
	   (list (tor-transport-plugin
		  (program (file-append lyrebird "/bin/lyrebird")))))))
@end lisp
@end deftp

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.

@defvar 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 defvar

@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

@cindex Syncthing, file synchronization service
@cindex backup service, Syncthing
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.

@defvar syncthing-service-type
Éste es el tipo de servicio para el daemon @uref{https://syncthing.net/,
syncthing} El valor tipo de servicio es un registro
@command{syncthing-configuration} como en este ejemplo.

@lisp
(service syncthing-service-type
         (syncthing-configuration (user "alice")))
@end lisp

@quotation Nota
This service is also available for Guix Home, where it runs directly with
your user privileges (@pxref{Networking Home Services,
@code{home-syncthing-service-type}}).
@end quotation

See below for details about @code{syncthing-configuration}.
@end defvar

@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})
Sets the @code{HOME} variable for the Syncthing daemon.  The default is
@file{$HOME} of the specified Syncthing @code{user}.

@item @code{config-file} (default: @var{#f})
Either a file-like object that resolves to a Syncthing configuration XML
file, or a @code{syncthing-config-file} record (see below).  If set to
@code{#f}, Guix will not try to generate a config file, and Syncthing will
generate a default configuration which will not be touched on reconfigure.
Specifying this in a system service moves Syncthing's common configuration
and data directory (@code{--home} in
@uref{https://docs.syncthing.net/users/syncthing.html}) to
@file{/var/lib/syncthing-<user>}.

When used as a home service, syncthing configuration will be populated in
@file{~/.local/state/syncthing/}.  Old Syncthing installs may have files in
@file{$XDG_CONFIG_HOME/syncthing/} (usually @file{~/.config/syncthing/}),
which will override configuration in @file{~/.local/state/syncthing} managed
by this service.  In such cases, you should move the contents of
@file{$XDG_CONFIG_HOME/syncthing/} into @file{~/.local/state/syncthing/}.

@end table
@end deftp

This section documents a subset of the Syncthing configuration
options—specifically those related to Guix or those affecting how your
computer will connect to other computers over the network (such as Syncthing
relays or discovery servers).  The configuration is fully documented in the
upstream @uref{https://docs.syncthing.net/users/config.html, Syncthing
config documentation}; camelCase there is converted to kebab-case here.  If
you are migrating from a Syncthing-managed configuration to one managed by
Guix, you can check what changes were introduced by @code{diff}ing the
respective @file{config.xml} files.  Note that you will need to add
whitespace with 4-space indentation to the file generated by Guix, using the
@code{xmllint} program from the @code{libxml2} package like so:

@example
XMLLINT_INDENT="    " xmllint --format /path/to/new/config.xml | diff /path/to/old/config.xml -
@end example

When generating a configuration file through Guix, you can still temporarily
modify Syncthing from the GUI or through @code{introducer} and
@code{autoAcceptFolders} mechanisms, but such changes will be reset on
reconfigure.

@deftp {Data Type} syncthing-config-file
Data type representing the configuration file read by the Syncthing daemon.

@table @asis
@item @code{folders} (default: @code{(list (syncthing-folder (id "default") (label "Default Folder") (path "~/Sync")))}
The default here is the same as Syncthing's default.  The value should be a
list of @code{syncthing-folder}s.

@item @code{devices} (default: @code{'()}
This should be a list of @code{syncthing-device}s.  Guix will automatically
add any devices specified in any `folders' to this list.  There are
instances when you want to connect to a device despite not (initially)
sharing any folders (such as a device with autoAcceptFolders).  In such
instances, you should specify those devices here.  If multiple versions of
the same device (as determined by comparing device ID) are discovered, the
one in this list is prioritized.  Otherwise, the first instance in the first
folder is used.

@item @code{gui-enabled?} (default: @code{#t})
By default, any user on the computer can access the GUI and make changes to
Syncthing.  If you leave this enabled, you should probably set
@code{gui-user} and @code{gui-password} (see below).

@item @code{gui-tls?} (default: @code{#f})
@item @code{gui-debugging?} (default: @code{#f})
@item @code{gui-send-basic-authorization-prompt?} (default: @code{#f})
@item @code{gui-address} (default: @code{"127.0.0.1:8384"})
@item @code{gui-user} (default: @code{#f})
@item @code{gui-password} (default: @code{#f})
A bcrypt hash of the GUI password.  Remember that this will be globally
exposed in @file{/gnu/store}.

@item @code{gui-apikey} (default: @code{#f})
You must specify this to use the Syncthing REST interface.  This key is kept
in @file{/gnu/store} and is accessible to all users of the system.

@item @code{gui-theme} (default: @code{"default"})
@item @code{ldap-enabled?} (default: @code{#f})
@item @code{ldap-address} (default: @code{""})
@item @code{ldap-bind-dn} (default: @code{""})
@item @code{ldap-transport} (default: @code{""})
@item @code{ldap-insecure-skip-verify} (default: @code{""})
@item @code{ldap-search-base-dn} (default: @code{""})
@item @code{ldap-search-filter} (default: @code{""})
@item @code{listen-address} (default: @code{"default"})
@item @code{global-announce-server} (default: @code{"default"})
@item @code{global-announce-enabled?} (default: @code{#t})
Global discovery servers can be used to help connect devices at unknown IP
addresses by storing the last known IP address.

@item @code{local-announce-enabled?} (default: @code{#t})
This makes devices find each other very easily on the same LAN.  Often, this
will allow you to just plug an Ethernet between two devices, or connect one
device to the other's hotspot and start syncing.

@item @code{local-announce-port} (default: @code{21027})
@item @code{local-announce-mac-address} (default: @code{"[ff12::8384]:21027"})
@item @code{max-send-kbps} (default: @code{0})
@item @code{max-receive-kbps} (default: @code{0})
@item @code{reconnection-interval-seconds} (default: @code{60})
@item @code{relays-enabled?} (default: @code{#t})
This option allows your Syncthing instance to use a global network of
@uref{https://docs.syncthing.net/users/relaying.html, relays} to enable
syncing between devices when all other methods fail.  As always, Syncthing
traffic is encrypted in transport and the relays are unable to decrypt it.

@item @code{relay-reconnect-interval-minutes} (default: @code{10})
@item @code{start-browser?} (default: @code{#t})
@item @code{nat-enabled?} (default: @code{#t})
@item @code{nat-lease-minutes} (default: @code{60})
@item @code{nat-renewal-minutes} (default: @code{30})
@item @code{nat-timeout-seconds} (default: @code{10})
@item @code{usage-reporting-accepted} (default: @code{0})
Options whose names begin with `usage-reporting-' control usage reporting.
Set to -1 to disable, or to a positive value to enable.  The default (0)
disables reporting, but causes a usage reporting consent prompt to be
displayed in the Syncthing GUI.

@item @code{usage-reporting-seen} (default: @code{0})
@item @code{usage-reporting-unique-id} (default: @code{""})
@item @code{usage-reporting-url} (default: @code{"https://data.syncthing.net/newdata"})
@item @code{usage-reporting-post-insecurely?} (default: @code{#f})
@item @code{usage-reporting-initial-delay-seconds} (default: @code{1800})
@item @code{auto-upgrade-interval-hours} (default: @code{12})
@item @code{upgrade-to-pre-releases?} (default: @code{#f})
@item @code{keep-temporaries-hours} (default: @code{24})
@item @code{cache-ignored-files?} (default: @code{#f})
@item @code{progress-update-interval-seconds} (default: @code{5})
@item @code{limit-bandwidth-in-lan?} (default: @code{#f})
@item @code{min-home-disk-free-unit} (default: @code{"%"})
@item @code{min-home-disk-free} (default: @code{1})
@item @code{releases-url} (default: @code{"https://upgrades.syncthing.net/meta.json"})
@item @code{overwrite-remote-device-names-on-connect?} (default: @code{#f})
@item @code{temp-index-min-blocks} (default: @code{10})
@item @code{unacked-notification-id} (default: @code{"authenticationUserAndPassword"})
@item @code{traffic-class} (default: @code{0})
@item @code{set-low-priority?} (default: @code{#t})
@item @code{max-folder-concurrency} (default: @code{0})
@item @code{crash-reporting-url} (default: @code{"https://crash.syncthing.net/newcrash"})
@item @code{crash-reporting-enabled?} (default: @code{#t})
@item @code{stun-keepalive-start-seconds} (default: @code{180})
@item @code{stun-keepalive-min-seconds} (default: @code{20})
@item @code{stun-server} (default: @code{"default"})
@item @code{database-tuning} (default: @code{"auto"})
@item @code{max-concurrent-incoming-request-kib} (default: @code{0})
@item @code{announce-lan-addresses?} (default: @code{#t})
@item @code{send-full-index-on-upgrade?} (default: @code{#f})
@item @code{connection-limit-enough} (default: @code{0})
@item @code{connection-limit-max} (default: @code{0})
@item @code{insecure-allow-old-tls-versions?} (default: @code{#f})
@item @code{connection-priority-tcp-lan} (default: @code{10})
@item @code{connection-priority-quic-lan} (default: @code{20})
@item @code{connection-priority-tcp-wan} (default: @code{30})
@item @code{connection-priority-quic-wan} (default: @code{40})
@item @code{connection-priority-relay} (default: @code{50})
@item @code{connection-priority-upgrade-threshold} (default: @code{0})
@item @code{default-folder} (default: @code{(syncthing-folder (label ""))})
@itemx @code{default-device} (default: @code{(syncthing-device (id ""))})
@itemx @code{default-ignores} (default: @code{"")})
Options whose names begin with `default-' above do not affect folders and
devices added through the Guix configuration interface.  They will, however,
affect folders and devices that are added through the Syncthing GUI, by an
@code{introducer}, or a device with @code{auto-accept-folders}.
@end table
@end deftp

@deftp {Data Type} syncthing-folder
Data type representing a folder to be synchronized.

@table @asis
@item @code{id} (predeterminado: @code{#f})
This ID cannot match the ID of any other folder on this device.  If left
unspecified, it will default to the label (see below).

@item @code{label}
A human readable label for the folder.

@item @code{path}
The path at which to store this folder.

@item @code{type} (default: @code{"sendreceive"})
@item @code{rescan-interval-seconds} (default: @code{3600})
@item @code{file-system-watcher-enabled?} (default: @code{#t})
@item @code{file-system-watcher-delay-seconds} (default: @code{10})
@item @code{file-system-watcher-timeout-seconds} (default: @code{0})
@item @code{ignore-permissions?} (default: @code{#f})
@item @code{auto-normalize?} (default: @code{#t})
@item @code{devices} (default: @code{'()})
This should be a list of other Syncthing devices.  You do not need to
specify the current device.  Each device can be listed as a a
@code{syncthing-device} record or a @code{syncthing-folder-device} record if
you want files to be encrypted on disk.  See below.

@item @code{filesystem-type} (default: @code{"basic"})
@item @code{min-disk-free-unit} (default: @code{"%"})
@item @code{min-disk-free} (default: @code{1})
@item @code{versioning-type} (default: @code{#f})
@item @code{versioning-file-system-path} (default: @code{""})
@item @code{versioning-file-system-type} (default: @code{"basic"})
@item @code{versioning-cleanup-interval-seconds} (default: @code{3600})
@item @code{versioning-cleanout-days} (default: @code{#f})
@item @code{versioning-keep} (default: @code{#f})
@item @code{versioning-max-age} (default: @code{#f})
@item @code{versioning-command} (default: @code{#f})
@item @code{copiers} (default: @code{0})
@item @code{puller-max-pending-kib} (default: @code{0})
@item @code{hashers} (default: @code{0})
@item @code{order} (default: @code{"random"})
@item @code{ignore-delete?} (default: @code{#f})
@item @code{scan-progress-interval-seconds} (default: @code{0})
@item @code{puller-pause-seconds} (default: @code{0})
@item @code{max-conflicts} (default: @code{10})
@item @code{disable-sparse-files?} (default: @code{#f})
@item @code{disable-temp-indexes?} (default: @code{#f})
@item @code{paused?} (default: @code{#f})
@item @code{weak-hash-threshold-percentage} (default: @code{25})
@item @code{marker-name} (default: @code{".stfolder"})
@item @code{copy-ownership-from-parent?} (default: @code{#f})
@item @code{mod-time-window-seconds} (default: @code{0})
@item @code{max-concurrent-writes} (default: @code{2})
@item @code{disable-fsync?} (default: @code{#f})
@item @code{block-pull-order} (default: @code{"standard"})
@item @code{copy-range-method} (default: @code{"standard"})
@item @code{case-sensitive-file-system?} (default: @code{#f})
@item @code{junctions-as-dirs?} (default: @code{#f})
@item @code{sync-ownership?} (default: @code{#f})
@item @code{send-ownership?} (default: @code{#f})
@item @code{sync-xattrs?} (default: @code{#f})
@item @code{send-xattrs?} (default: @code{#f})
@item @code{xattr-filter-max-single-entry-size} (default: @code{1024})
@item @code{xattr-filter-max-total-size} (default: @code{4096})
@end table
@end deftp

@deftp {Data Type} syncthing-device
Data type representing a device to synchronize folders with.

@table @asis
@item @code{id}
A long hash representing the keys generated by Syncthing on the first
launch.  You can obtain this from the Syncthing GUI or by inspecting an
existing Syncthing configuration file.

@item @code{name} (default: @code{""})
A human readable device name for viewing in the GUI or in Scheme.

@item @code{compression} (default: @code{"metadata"})
@item @code{introducer?} (default: @code{#f})
@item @code{skip-introduction-removals?} (default: @code{#f})
@item @code{introduced-by} (default: @code{""})
@item @code{addresses} (default: @code{'("dynamic")})
List of addresses at which to search for this device.  When the special
value ``dynamic'' is included, Syncthing will search for the device locally
as well as via the Syncthing project's
@uref{https://docs.syncthing.net/users/security.html#global-discovery,
global discovery} servers.

@item @code{paused?} (default: @code{#f})
@item @code{auto-accept-folders?} (default: @code{#f})
@item @code{max-send-kbps} (default: @code{0})
@item @code{max-receive-kbps} (default: @code{0})
@item @code{max-request-kib} (default: @code{0})
@item @code{untrusted?} (default: @code{#f})
@item @code{remote-gui-port} (default: @code{0})
@item @code{num-connections} (default: @code{0})

@end table
@end deftp

@deftp {Data Type} syncthing-folder-device
This data type offers two folder-specific device options:
@code{introduced-by} and @code{encryption-password}.

@code{syncthing-folder-device} corresponds to the
@uref{https://docs.syncthing.net/users/config.html#config-option-folder.device,
`device'} option in the upstream `folder' element.

If you don't need to use these options, then you can just use
@code{syncthing-device} instead of @code{syncthing-folder-device} in the
@code{devices} field of a @code{syncthing-folder} instance.

@table @asis
@item @code{device}
El @code{syncthing-device} para el cual está configuración se aplica.

@item @code{introduced-by} (default: @code{""})
The name of the device that "introduced" our device to the device sharing
this folder.  This is only used when "introduced" devices are removed by the
introducer.  See @uref{https://docs.syncthing.net/users/introducer.html,
Syncthing introductions}.

@item @code{encryption-password} (default: @code{""})
The password used to encrypt data that is synchronized to untrusted devices.

Beware: specifying this field will include this password as plain text (not
encrypted) and globally visible in @file{/gnu/store/}.  If the
encryption-password is non-empty, then it will be used as a password to
encrypt file chunks as they are synchronized to untrusted devices.  For more
information on syncing to devices you don't totally trust, see Syncthing's
documentation on @uref{https://docs.syncthing.net/users/untrusted.html,
Untrusted (Encrypted) Devices}.  Note that data transfer is always encrypted
while in transport ("end-to-end encryption"), regardless of this setting.

@end table
@end deftp

Aquí está un ejemplo de configuración más complejo para propósito
ilustrativo:

@lisp
(service syncthing-service-type
         (let ((laptop (syncthing-device (id "VHOD2D6-...-7XRMDEN")))
               (desktop (syncthing-device (id "64SAZ37-...-FZJ5GUA")
                                          (addresses '("tcp://example.com"))))
               (bob-desktop (syncthing-device (id "KYIMEGO-...-FT77EAO"))))
           (syncthing-configuration
            (user "alice")
            (config-file
             (syncthing-config-file
               (folders (list (syncthing-folder
                               (label "some-files")
                               (path "~/data")
                               (devices (list desktop laptop)))
                              (syncthing-folder
                               (label "critical-files")
                               (path "~/secrets")
                               (devices
                                (list desktop
                                      laptop
                                      (syncthing-folder-device
                                       (device bob-desktop)
                                       (encryption-password "mypassword"))))))))))))
@end lisp


Es más, @code{(gnu services ssh)} proporciona los siguientes servicios.
@cindex SSH
@cindex servidor SSH
@defvar 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 defvar

@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

@defvar dropbear-service-type
Type of the service that runs the
@url{https://matt.ucc.asn.au/dropbear/dropbear.html, Dropbear SSH daemon},
whose value is a @code{<dropbear-configuration>} object.

For example, to specify a Dropbear service listening on port 1234:

@lisp
(service dropbear-service-type (dropbear-configuration
                                 (port-number 1234)))
@end lisp
@end defvar

@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
@defvar 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 defvar

@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
@defvar 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 defvar

@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

@defvar block-facebook-hosts-service-type
This service type adds a list of known Facebook hosts to the
@file{/etc/hosts} file.  (@pxref{Host Names,,, libc, The GNU C Library
Reference Manual})  Each line contains an entry that maps a known server
name of the Facebook on-line service---e.g., @code{www.facebook.com}---to
unroutable IPv4 and IPv6 addresses.

Este mecanismo puede impedir a los programas que se ejecutan localmente,
como navegadores Web, el acceso a Facebook.
@end defvar

El módulo @code{(gnu services avahi)} proporciona la siguiente definición.

@defvar avahi-service-type
Éste 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'', consulte @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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 private key. DO NOT share this with anyone!
  PrivateKey: 5c750...
@}
@end example
@end defvar

@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 a dynamic 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 PrivateKey option.

@end table
@end deftp

@cindex IPFS
@defvar 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 defvar

@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
@defvar 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 defvar

@node Actualizaciones no-atendidas
@subsection Actualizaciones no-atendidas

@cindex actualizaciones desatendidas
@cindex desatendidas, actualizaciones
El módulo @code{(gnu services admin)} 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).

@defvar unattended-upgrade-service-type
This is the service type for unattended upgrades.  It sets up a Shepherd
Timer (@pxref{Ejecución de tareas programadas}) that runs @command{guix system
reconfigure} from the latest version of the specified channels.

Su valor debe ser un registro @code{unattended-upgrade-configuration} (véase
a continuación).
@end defvar

@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"})
This is the schedule of upgrades, expressed as a string in traditional cron
syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@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{operating-system-expression} (default: @code{#f})
This field specifies an expression that evaluates to the operating system to
use for the upgrade.  If no value is provided the
@code{operating-system-file} field value is used.

@lisp
(unattended-upgrade-configuration
  (operating-system-expression
    #~(@@ (guix system install) installation-os)))
@end lisp

@item @code{reboot?} (default: @code{#f})
This field specifies whether the system should reboot after completing an
unattended upgrade.

When @code{reboot?} is @code{#t}, services are not restarted before
rebooting.  This means that the value for @code{services-to-restart} is
ignored.  The updated services will be started after the system reboots.

@item @code{services-to-restart} (default: @code{'(unattended-upgrade)})
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{unattended-upgrade}. 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}).

GDM also supports Wayland: it can itself use Wayland instead of X11 for its
user interface, and it can also start Wayland sessions.  Wayland support is
enabled by default.  To disable it, set @code{wayland?} to @code{#f} in
@code{gdm-configuration}.

@defvar gdm-service-type
Éste es el tipo para el @uref{https://wiki.gnome.org/Projects/GDM/, gestor
de acceso 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éas 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 defvar

@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.

@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{#t})
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

@defvar 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 defvar

@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

@defvar %default-theme
@defvarx %default-theme-name
El tema predeterminado de SLiM y su nombre.
@end defvar


@cindex gestor de ingreso en el sistema
@cindex X11, ingreso al sistema
@defvar 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 defvar

@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.

@quotation Nota
sddm has Qt6 enabled by default. If you want to still use a Qt5 theme, you
need to set it to @code{sddm-qt5}.
@end quotation

@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}
@defvar 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 defvar

@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 mechanism:

@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-extra hicolor-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-libinput},
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 {Procedure} set-xorg-configuration config [login-manager-service-type]
Tell the log-in manager (of type @var{login-manager-service-type}) to use
@var{config}, an @code{<xorg-configuration>} record.

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 {Procedure} xorg-start-command [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 {Procedure} xorg-start-command-xinit [config]
Return a @code{startx} script in which the modules, fonts, etc. specified in
@var{config} are available.  The result should be used in place of
@code{startx} and should be invoked by the user from a tty after login.
Unlike @code{xorg-start-command}, this script calls xinit.  Therefore it
works well when executed from a tty.  This script can be set up as
@code{startx} using @code{startx-command-service-type} or
@code{home-startx-command-service-type}.  If you are using a desktop
environment, you are unlikely to need this procedure.
@end deffn


@defvar screen-locker-service-type
Type for a service that adds a package for a screen locker or screen saver
to the set of privileged programs and/or add a PAM entry for it.  The value
for this service is a @code{<screen-locker-configuration>} object.

While the default behavior is to setup both a privileged program and PAM
entry, these two methods are redundant.  Screen locker programs may not
execute when PAM is configured and @code{setuid} is set on their
executable.  In this case, @code{using-setuid?} can be set to @code{#f}.

For example, to make XlockMore usable:

@lisp
(service screen-locker-service-type
         (screen-locker-configuration
           (name "xlock")
           (program (file-append xlockmore "/bin/xlock"))))
@end lisp

permite usar el viejo XlockMore.

For example, swaylock fails to execute when compiled with PAM support and
setuid enabled.  One can thus disable setuid:

@lisp
(service screen-locker-service-type
         (screen-locker-configuration
           (name "swaylock")
           (program (file-append swaylock "/bin/swaylock"))
           (using-pam? #t)
           (using-setuid? #f)))
@end lisp

@end defvar

@deftp {Data Type} screen-locker-configuration
Available @code{screen-locker-configuration} fields are:

@table @asis
@item @code{name} (type: string)
Name of the screen locker.

@item @code{program} (type: file-like)
Path to the executable for the screen locker as a G-Expression.

@item @code{allow-empty-password?} (default: @code{#f}) (type: boolean)
Si se permiten las contraseñas vacías.

@item @code{using-pam?} (default: @code{#t}) (type: boolean)
Whether to setup PAM entry.

@item @code{using-setuid?} (default: @code{#t}) (type: boolean)
Whether to setup program as setuid binary.

@end table

@end deftp

@defvar startx-command-service-type
Add @command{startx} to the system profile putting it onto @env{PATH}.

The value for this service is a @code{<xorg-configuration>} object which is
passed to the @code{xorg-start-command-xinit} procedure producing the
@command{startx} used.  Default value is @code{(xorg-configuration)}.
@end defvar


@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:

@defvar 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 defvar

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
Specifies a list of DNS-SD sub-types to advertise for each shared printer.

The default @samp{(list "_cups" "_print" "_universal")} tells clients that
CUPS sharing, IPP Everywhere, AirPrint, and Mopria are supported.
@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}} 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}} 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 @code{max-jobs} 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 @code{max-jobs} 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 {@code{cups-configuration} parameter} non-negative-integer max-subscriptions
Specifies the maximum number of simultaneous event subscriptions that are
allowed.  Set to @samp{0} to allow an unlimited number of subscriptions.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-subscriptions-per-job
Specifies the maximum number of simultaneous event subscriptions that are
allowed per job.  A value of @samp{0} allows up to @code{max-subscriptions}
per job.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-subscriptions-per-printer
Specifies the maximum number of simultaneous event subscriptions that are
allowed per printer.  A value of @samp{0} allows up to
@code{max-subscriptions} per printer.

El valor predeterminado es @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-subscriptions-per-user
Specifies the maximum number of simultaneous event subscriptions that are
allowed per user.  A value of @samp{0} allows up to @code{max-subscriptions}
per user.

El valor predeterminado es @samp{0}.
@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}} 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 {@code{cups-configuration} parameter} comma-separated-string-list-or-#f ready-paper-sizes
Specifies a list of potential paper sizes that are reported as ready, that
is: loaded.  The actual list will contain only the sizes that each printer
supports.

The default value of @code{#f} is a special case: CUPS will use @samp{(list
\"Letter\" \"Legal\" \"Tabloid\" \"4x6\" \"Env10\")} if the default paper
size is \"Letter\", and @samp{(list \"A3\" \"A4\" \"A5\" \"A6\" \"EnvDL\")}
otherwise.
@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 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:

@defvar %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}), y el daemon Avahi.
@end defvar

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}}).

Additionally, the following procedures add one (or more!) desktop
environments to a system.

@itemize
@item @code{gnome-desktop-service-type} adds GNOME,
@item @code{plasma-desktop-service-type} adds KDE Plasma,
@item @code{enlightenment-desktop-service-type} adds Enlightenment,
@item @code{lxqt-desktop-service-type} adds LXQt,
@item @code{mate-desktop-service-type} adds MATE, and
@item @code{xfce-desktop-service-type} añade Xfce.
@end itemize

These service types add ``metapackages'' such as @code{gnome} or
@code{plasma} to the system profile, but most of them also set up other
useful services that mere packages can't do.

For example, they may elevate privileges on a limited number of
special-purpose system interfaces and programs.  This allows backlight
adjustment helpers, power management utilities, screen lockers, and other
integrated functionality to work as expected.

@defvar 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 defvar

@deftp {Tipo de datos} gnome-desktop-configuration
Registro de configuración para el entorno de escritorio GNOME.  Campos
disponible de @code{gnome-desktop-configuration} son:

@table @asis
@item @code{core-services} (type: list-of-packages)
A list of packages that the GNOME Shell and applications may rely on.

@item @code{shell} (type: list-of-packages)
A list of packages that constitute the GNOME Shell, without applications.

@item @code{utilities} (type: list-of-packages)
A list of packages that serve as applications to use on top of the GNOME
Shell.

@item @code{gnome} (type: maybe-package)
This field used to be the only configuration point and specified a GNOME
meta-package to install system-wide.  Since the meta-package itself provides
neither sources nor the actual packages and is only used to propagate them,
this field is deprecated.

@item @code{extra-packages} (type: list-of-packages)
A list of GNOME-adjacent packages to also include.  This field is intended
for users to add their own packages to their GNOME experience.  Note, that
it already includes some packages that are considered essential by some
(most?) GNOME users.

@item @code{udev-ignorelist} (default: @code{()}) (type: list-of-strings)
A list of regular expressions denoting udev rules or hardware file names
provided by any package that should not be installed.  By default, every
udev rule and hardware file specified by any package referenced in the other
fields are installed.

@item @code{polkit-ignorelist} (default: @code{()}) (type: list-of-strings)
A list of regular expressions denoting polkit rules provided by any package
that should not be installed.  By default, every polkit rule added by any
package referenced in the other fields are installed.

@item @code{keyring} (type: gnome-keyring-configuration-or-#f)
A <gnome-keyring-configuration> record used to better integrate the GNOME
keyring with the system.  Refer to the documentation of the
@code{gnome-keyring-service-type} for more information.  If you'd rather
avoid integrating the GNOME keyring, you can set this to @code{#f}.

@end table
@end deftp

@defvar plasma-desktop-service-type
This is the type of the service that adds the
@uref{https://kde.org/plasma-desktop/, Plasma} desktop environment.  Its
value is a @code{plasma-desktop-configuration} object (see below).

This service adds the @code{plasma} package to the system profile.
@end defvar

@deftp {Data Type} plasma-desktop-configuration
Configuration record for the Plasma desktop environment.

@table @asis
@item @code{plasma} (default: @code{plasma})
The Plasma package to use.
@end table
@end deftp

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar sugar-desktop-service-type
This is the type of the service that runs the
@uref{https://www.sugarlabs.org, Sugar desktop environment}.  Its value is a
@code{sugar-desktop-configuration} object (see below).

This service adds the @code{sugar} package to the system profile, as well as
any selected Sugar activities.  By default it only includes a minimal set of
activities.
@end defvar

@deftp {Data Type} sugar-desktop-configuration
Configuration record for the Sugar desktop environment.

@table @asis
@item @code{sugar} (default: @code{sugar})
The Sugar package to use.
@item @code{gobject-introspection} (default: @code{gobject-introspection})
The @code{gobject-introspection} package to use.  This package is used to
access libraries installed as dependencies of Sugar activities.
@item @code{activities} (default: @code{(list sugar-help-activity)})
A list of Sugar activities to install.
@end table
@end deftp

The following example configures the Sugar desktop environment with a number
of useful activities:

@lisp
(use-modules (gnu))
(use-package-modules sugar)
(use-service-modules desktop)
(operating-system
  ...
  (services (cons* (service sugar-desktop-service-type
                            (sugar-desktop-configuration
                              (activities (list sugar-browse-activity
                                                sugar-help-activity
                                                sugar-jukebox-activity
                                                sugar-typing-turtle-activity))))
                   %desktop-services))
  ...)
@end lisp

@defvar 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 defvar

@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* adds items to the list given as its last argument.
  (services (cons* (service gnome-desktop-service-type)
                   (service xfce-desktop-service-type)
                   %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.

@defvar dbus-root-service-type
Tipo de un servicio que ejecuta el ``bus del sistema'' de
D-Bus.@footnote{@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.}

The value for this service type is a @code{<dbus-configuration>} record.
@end defvar

@deftp {Data Type} dbus-configuration
Data type representing the configuration for @code{dbus-root-service-type}.

@table @asis
@item @code{dbus} (default: @code{dbus}) (type: file-like)
Package object for dbus.

@item @code{services} (default: @code{'()}) (type: list)
List of packages that provide an @file{etc/dbus-1/system.d} directory
containing additional D-Bus configuration and policy files.  For example, to
allow avahi-daemon to use the system bus, @var{services} must be equal to
@code{(list avahi)}.

@item @code{verbose?} (default: @code{#f}) (type: boolean)
When @code{#t}, D-Bus is launched with environment variable
@samp{DBUS_VERBOSE} set to @samp{1}.  A verbose-enabled D-Bus package such
as @code{dbus-verbose} should be provided to @var{dbus} in this
scenario. The verbose output is logged to @file{/var/log/dbus-daemon.log}.

@end table
@end deftp

@subsubheading Elogind

@uref{https://github.com/elogind/elogind, Elogind} is a login and seat
management daemon that also handles most system-level power events for a
computer, for example suspending the system when a lid is closed, or
shutting it down when the power button is pressed.

It also provides a D-Bus interface that can be used to know which users are
logged in, know what kind of sessions they have open, suspend the system,
inhibit system suspend, reboot the system, and other tasks.

@defvar elogind-service-type
Type of the service that runs @command{elogind}, a login and seat management
daemon.  The value for this service is a @code{<elogind-configuration>}
object.
@end defvar

@c Auto-generated via (configuration->documentation 'elogind-configuration).
@c %start of fragment

@deftp {Data Type} elogind-configuration
Available @code{elogind-configuration} fields are:

@table @asis
@item @code{elogind} (default: @code{elogind}) (type: file-like)
The elogind package to use.

@item @code{system-sleep-hook-files} (default: @code{()}) (type: list-of-file-likes)
A list of executables (file-like objects) that will be installed into the
@file{/etc/elogind/system-sleep} hook directory.  See `Hook directories' in
the @samp{loginctl(1)} man page for more information.

@item @code{system-shutdown-hook-files} (default: @code{()}) (type: list-of-file-likes)
A list of executables (file-like objects) that will be installed into the
@file{/etc/elogind/system-shutdown/} hook directory.

@item @code{allow-power-off-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether the executables in elogind's hook directories (see above) can cause
a power-off action to be cancelled (interrupted) by printing an appropriate
error message to stdout.

@item @code{allow-suspend-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Likewise as the @code{allow-power-off-interrupts?} option, but for the
suspend action.

@item @code{broadcast-power-off-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether an interrupt of a power-off action is broadcasted.

@item @code{broadcast-suspend-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether an interrupt of a suspend action is broadcasted.

@item @code{kill-user-processes?} (default: @code{#f}) (type: maybe-boolean)
Whether the processes of a user should be killed when the user logs out.

@item @code{kill-only-users} (type: maybe-list-of-user-names)
Usernames whose processes should be killed, regardless the value of
@code{kill-user-processes?}.

@item @code{kill-exclude-users} (default: @code{("root")}) (type: maybe-list-of-user-names)
Usernames whose processes should @emph{not} be killed, regardless the value
of @code{kill-user-processes?}.

@item @code{inhibit-delay-max-seconds} (default: @code{5}) (type: maybe-non-negative-integer)
The maximum time a system shutdown or sleep request is delayed due to an
inhibitor lock of type delay being active before the inhibitor is ignored
and the operation executes anyway.

@item @code{handle-power-key} (default: @code{poweroff}) (type: maybe-action)
The action done when the power key is pressed.  The compiled default is
@code{'poweroff}.

@item @code{handle-suspend-key} (default: @code{suspend}) (type: maybe-action)
The action done when the suspend key is pressed.  The

@item @code{handle-hibernate-key} (default: @code{hibernate}) (type: maybe-action)
The action done when the hibernate key is pressed.

@item @code{handle-lid-switch} (default: @code{suspend}) (type: maybe-action)
The action done when the lid is closed.

@item @code{handle-lid-switch-docked} (default: @code{ignore}) (type: maybe-action)
The action done when the lid is closed and the device docked.

@item @code{handle-lid-switch-external-power} (default: @code{suspend}) (type: maybe-action)
The action done when the lid is closed and the device is externally powered.

@item @code{power-key-ignore-inhibited?} (default: @code{#f}) (type: maybe-boolean)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the power key is pressed.

@item @code{suspend-key-ignore-inhibited?} (default: @code{#f}) (type: maybe-boolean)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the suspend key is pressed.

@item @code{hibernate-key-ignore-inhibited?} (default: @code{#f}) (type: maybe-boolean)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the hibernate key is pressed.

@item @code{lid-switch-ignore-inhibited?} (default: @code{#f}) (type: maybe-boolean)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the lid is closed.

@item @code{holdoff-timeout-seconds} (default: @code{30}) (type: maybe-non-negative-integer)
Specifies the number of seconds after system startup or system resume during
which elogind will hold off on reacting to lid events.

@item @code{idle-action} (default: @code{ignore}) (type: maybe-action)
Action to take when the system is idle.

@item @code{idle-action-seconds} (type: maybe-non-negative-integer)
The delay after which the action configured in @code{idle-action} is taken
after the system is idle.

@item @code{runtime-directory-size-percent} (type: maybe-percent)
Set the size limit, in percent, on the @env{XDG_RUNTIME_DIR} runtime
directory for each user who logs in.  This specifies the per-user size limit
relative to the amount of physical @acronym{RAM,read access memory}.  This
value takes precedence over that specified via
@code{runtime-directory-size}.

@item @code{runtime-directory-size} (type: maybe-non-negative-integer)
Set the size limit, in bytes, on the @env{XDG_RUNTIME_DIR} runtime directory
for each user who logs in.

@item @code{remove-ipc?} (default: @code{#t}) (type: maybe-boolean)
Whether @acronym{IPC,inter-process communication} objects belonging to the
user shall be removed when the user fully logs out.

@item @code{suspend-state} (default: @code{(mem standby freeze)}) (type: maybe-list-of-suspend-states)
The suspend state values to be write to @file{/sys/power/state} by elogind
when suspending the system.  They will be tried in turn, until one is
written without error.

@item @code{suspend-mode} (type: maybe-list-of-suspend-modes)
The suspend mode values to write to @file{/sys/power/mem_sleep} by elogind
when suspending the system.

@item @code{suspend-estimation-seconds} (default: @code{3600}) (type: maybe-non-negative-integer)
Cause the RTC alarm to wake the system after the specified time span to
measure the system battery capacity level and estimate the battery
discharging rate, which is used for estimating the time span until the
system battery charge level goes down to 5%.  This option is only used by
elogind when using the @code{'suspend-then-hibernate} action.

@item @code{hibernate-mode} (default: @code{(platform shutdown)}) (type: maybe-list-of-hibernation-modes)
The hibernation mode values to write to @file{/sys/power/disk} by elogind
when hibernating the system.

@item @code{hibernate-delay-seconds} (type: maybe-non-negative-integer)
The amount of time the system spends in suspend mode before the system is
automatically put into hibernate mode.

@item @code{hibernate-state} (type: maybe-list-of-strings)
Opción obsoleta.

@item @code{hybrid-sleep-state} (type: maybe-list-of-strings)
Opción obsoleta.

@item @code{hybrid-sleep-mode} (type: maybe-list-of-strings)
Opción obsoleta.

@end table

@end deftp


@c %end of fragment

@defvar accountsservice-service-type
Type for the service that runs AccountsService, a system service that can
list available accounts, change their passwords, and so on.  AccountsService
integrates with PolicyKit to enable unprivileged users to acquire the
capability to modify their system configuration.  See
@url{https://www.freedesktop.org/wiki/Software/AccountsService/,
AccountsService} for more information.

The value for this service is a file-like object, by default it is set to
@code{accountsservice} (the package object for AccountsService).
@end defvar

@defvar polkit-service-type
Type for the service that runs the
@url{https://www.freedesktop.org/wiki/Software/polkit/, Polkit privilege
management service}, which allows system administrators to grant access to
privileged operations in a structured way.  By querying the Polkit service,
a privileged system component can know when it should grant additional
capabilities to ordinary users.  For example, an ordinary user can be
granted the capability to suspend the system if the user is logged in
locally.

The value for this service is a @code{<polkit-configuration>} object.
@end defvar

@c TODO: Document <polkit-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@defvar 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 defvar

@defvar 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 defvar

@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

@defvar udisks-service-type
Type for the service that runs
@uref{https://udisks.freedesktop.org/docs/latest/, UDisks}, a @dfn{disk
management} daemon that provides user interfaces with notifications and ways
to mount/unmount disks.  Programs that talk to UDisks include the
@command{udisksctl} command, part of UDisks, and GNOME Disks.  Note that
Udisks relies on the @command{mount} command, so it will only be able to use
the file-system utilities installed in the system profile.  For example if
you want to be able to mount NTFS file-systems in read and write fashion,
you'll need to have @code{ntfs-3g} installed system-wide.

The value for this service is a @code{<udisks-configuration>} object.
@end defvar

@deftp {Data Type} udisks-configuration
Data type representing the configuration for @code{udisks-service-type}.

@table @asis
@item @code{udisks} (default: @code{udisks}) (type: file-like)
Package object for UDisks.

@end table
@end deftp

@defvar gvfs-service-type
Type for the service that provides virtual file systems for GIO
applications, which enables support for @code{trash://}, @code{ftp://},
@code{sftp://} and many other location schemas in file managers like
Nautilus (GNOME Files) and Thunar.

The value for this service is a @code{<gvfs-configuration>} object.
@end defvar

@deftp {Data Type} gvfs-configuration
Data type representing the configuration for @code{gvfs-service-type}.

@table @asis
@item @code{gvfs} (default: @code{gvfs}) (type: file-like)
Package object for GVfs.

@end table
@end deftp

@defvar 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 defvar

@cindex acceso al escáner
@defvar sane-service-type
This service provides access to scanners @i{via}
@uref{http://www.sane-project.org, SANE} by installing the necessary udev
rules and pluggable backends.  It is included in @code{%desktop-services}
(@pxref{Servicios de escritorio}) and relies by default on @code{sane-backends}
package (see below) for hardware support.
@end defvar

@deftp {Data Type} sane-configuration
Data type representing the configuration for SANE.

@table @asis

@item @code{sane} (default: @code{sane})
Package containing SANE library.

@item @code{backends} (default: @code{(sane-backends)})
List of packages with pluggable SANE backends:

@itemize @bullet
@item
@code{sane-backends}: The default backend collection which supports many
recent scanners,

@item
@code{sane-airscan}: A backend that enables network scanners supporting eSCL
(Apple) or WSD, (Microsoft) protocols

@item
@code{hplip}: A backend containing drivers for older Hewlett-Packard
scanners,

@item
@code{utsushi}: A backend containing drivers for older Epson devices.

@end itemize

@end table
@end deftp

In order to use additional backends 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-configuration
        (backends (list sane-backends sane-airscan))))))

(operating-system
  @dots{}
  (services %my-desktop-services))
@end lisp

@deffn {Procedimiento} 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

@defvar %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 defvar

@defvar geoclue-service-type
Type for the service that runs the
@url{https://wiki.freedesktop.org/www/Software/GeoClue/, GeoClue} location
service.  This service provides a D-Bus interface to allow applications to
request access to a user's physical location, and optionally to add
information to online location databases.

The value for this service is a @code{<geoclue-configuration>} object.
@end defvar

@c TODO: Document <geoclue-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@defvar iio-sensor-proxy-service-type
Type for the service that runs
@uref{https://gitlab.freedesktop.org/hadess/iio-sensor-proxy, IIO sensor
proxy}, a daemon that proxies low-level sensor data from Industrial I/O
(IIO) devices into a D-Bus interface.  It enables user-space applications,
such as desktop environments like GNOME and KDE, and services like GeoClue,
to access data from various sensors commonly found in devices like
ultrabooks and 2-in-1s.  This allows for:

@itemize @bullet
@item
Automatic screen rotation based on accelerometer data.
@item
Ambient brightness adjustment using light sensor data.
@item
Compass/direction information for location services (via GeoClue).
@end itemize

The value for this service is a @code{<iio-sensor-proxy-configuration>}
object.
@end defvar

@deftp {Data Type} iio-sensor-proxy-configuration
Data type representing the configuration for
@code{iio-sensor-proxy-service-type}.

@table @asis
@item @code{iio-sensor-proxy} (default: @code{iio-sensor-proxy}) (type: file-like)
Package object of iio-sensor-proxy.

@end table
@end deftp

@defvar 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 defvar

@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} para desactivarlo,

@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

@defvar gnome-keyring-service-type
This is the type of the service that adds the
@uref{https://wiki.gnome.org/Projects/GnomeKeyring, GNOME Keyring}.  Its
value is a @code{gnome-keyring-configuration} object (see below).  Note that
there is no need to use this service when using
@code{gnome-desktop-service-type}, which includes it.

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 defvar

@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

@defvar kwallet-service-type
This is the type of the service that adds the
@uref{https://invent.kde.org/plasma/kwallet-pam, KWallet keyring}.  Its
value is a @code{kwallet-configuration} object (see below).  Note that,
contrary to @code{gnome-desktop-service-type}, which includes the respective
keyring for that service, @code{gnome-keyring-service-type},
@code{plasma-desktop-service-type} does not include
@code{kwallet-service-type}.

This service adds the @code{kwallet-pam} package to the system profile and
extends PAM with entries using @code{pam_kwallet5.so}.  It can unlock the
user's login keyring or set their password with @command{passwd} at the time
they log in.
@end defvar

@deftp {Data Type} kwallet-configuration
Configuration record for the KWallet Keyring service.

@table @asis
@item @code{keyring} (default: @code{kwallet-pam})
The KWallet keyring package to use.

@item @code{pam-services}
A list of @code{(@var{service} . @var{kind})} pairs denoting PAM services to
extend, where @var{service} is the name of an existing service to extend and
@var{kind} is one of @code{login} or @code{passwd} symbols.

If @code{login} is given, it adds an optional @code{pam_kwallet5.so} to the
auth block without arguments and to the session block with
@code{auto_start}.  If @code{passwd} is given, it adds an optional
@code{pam_kwallet5.so} to the password block without arguments.

By default, it takes for value an alist associating the @code{"sddm"} key
with the @code{'login} value, and the @code{"passwd"} key with the
@code{'passwd} value.
@end table
@end deftp

@defvar 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 defvar

@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.

@defvar 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 defvar

@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.

@defvar 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
This service overrides per-user configuration files.  If you want PulseAudio
to honor configuration files in @file{~/.config/pulse}, you have to unset
the environment variables @env{PULSE_CONFIG} and @env{PULSE_CLIENTCONFIG} in
your @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 defvar

@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 guion 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

@defvar ladspa-service-type
This service sets the @var{LADSPA_PATH} variable, so that programs, which
respect it, e.g.@: PulseAudio, can load LADSPA plugins.

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 defvar

@subsubheading Speaker Safety Daemon System Service

@uref{https://github.com/AsahiLinux/speakersafetyd, Speaker Safety Daemon}
is a user-space daemon that implements an analogue of the Texas Instruments
Smart Amp speaker protection model.  It can be used to protect the speakers
on Apple Silicon devices.

@defvar speakersafetyd-service-type
This is the type for the @code{speakersafetyd} system service, whose value
is a @command{speakersafetyd-configuration} record.

@lisp
(service speakersafetyd-service-type)
@end lisp

See below for details about @code{speakersafetyd-configuration}.
@end defvar

@c %start of fragment
@deftp {Data Type} speakersafetyd-configuration
Available @code{speakersafetyd-configuration} fields are:

@table @asis
@item @code{blackbox-directory} (default: @code{"/var/lib/speakersafetyd/blackbox"}) (type: string)
The directory to which blackbox files are written when the speakers are
getting too hot.  The blackbox files contain audio and debug information
which the developers of @code{speakersafetyd} might ask for when reporting
bugs.

@item @code{configuration-directory} (type: file-like)
The base directory as a G-expression (@pxref{Expresiones-G}) that contains
the configuration files of the speaker models.

@item @code{group} (default: @code{"speakersafetyd"}) (type: string)
The group to run the Speaker Safety Daemon as.

@item @code{log-file} (default: @code{"/var/log/speakersafetyd.log"}) (type: string)
The file name to the Speaker Safety Daemon log file.

@item @code{maximum-gain-reduction} (default: @code{7}) (type: integer)
Maximum gain reduction before panicking, useful for debugging.

@item @code{speakersafetyd} (default: @code{speakersafetyd}) (type: file-like)
The Speaker Safety Daemon package to use.

@item @code{user} (default: @code{"speakersafetyd"}) (type: string)
The user to run the Speaker Safety Daemon as.

@end table
@end deftp
@c %end of fragment

@node File Search Services
@subsection File Search Services

@cindex file search
@cindex searching for a file
The services in this section populate @dfn{file databases} that let you
search for files on your machine.  These services are provided by the
@code{(gnu services admin)} module.

The first one, @code{file-database-service-type}, periodically runs the
venerable @command{updatedb} command (@pxref{Invoking updatedb,,, find, GNU
Findutils}).  That command populates a database of file names that you can
then search with the @command{locate} command (@pxref{Invoking locate,,,
find, GNU Findutils}), as in this example:

@example
locate important-notes.txt
@end example

You can enable this service with its default settings by adding this snippet
to your operating system services:

@lisp
(service file-database-service-type)
@end lisp

This updates the database once a week, excluding files from
@file{/gnu/store}---these are more usefully handled by @command{guix locate}
(@pxref{Invocación de guix locate}).  You can of course provide a custom
configuration, as described below.

@defvar file-database-service-type
This is the type of the file database service, which runs @command{updatedb}
periodically.  Its associated value must be a
@code{file-database-configuration} record, as described below.
@end defvar

@deftp {Data Type} file-database-configuration
Record type for the @code{file-database-service-type} configuration, with
the following fields:

@table @asis
@item @code{package} (default: @code{findutils})
The package from which the @command{updatedb} command is taken.  Examples of
such packages are GNU@tie{}Findutils and Plocate.

@item @code{schedule} (default: @code{%default-file-database-update-schedule})
This is the schedule of database updates, expressed as a string in
traditional cron syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@item @code{excluded-directories} (default @code{%default-file-database-excluded-directories})
List of regular expressions of directories to ignore when building the file
database.  By default, this includes @file{/tmp} and @file{/gnu/store}; the
latter should instead be indexed by @command{guix locate} (@pxref{Invocación de guix locate}).  This list is passed to the @option{--prunepaths} option of
@command{updatedb} (@pxref{Invoking updatedb,,, find, GNU@tie{}Findutils}).
@end table
@end deftp

The second service, @code{package-database-service-type}, builds the
database used by @command{guix locate}, which lets you search for packages
that contain a given file (@pxref{Invocación de guix locate}).  The service
periodically updates a system-wide database, which will be readily available
to anyone running @command{guix locate} on the system.  To use this service
with its default settings, add this snippet to your service list:

@lisp
(service package-database-service-type)
@end lisp

This will run @command{guix locate --update} once a week.

@defvar package-database-service-type
This is the service type for periodic @command{guix locate} updates
(@pxref{Invocación de guix locate}).  Its value must be a
@code{package-database-configuration} record, as shown below.
@end defvar

@deftp {Data Type} package-database-configuration
Data type to configure periodic package database updates.  It has the
following fields:

@table @asis
@item @code{package} (default: @code{guix})
El paquete Guix usado.

@item @code{schedule} (default: @code{%default-package-database-update-schedule})
This is the schedule of the periodic @command{guix locate --update} job,
expressed as a string in traditional cron syntax or as a gexp evaluating to
a Shepherd calendar event (@pxref{Timers,,, shepherd, The GNU Shepherd
Manual}).

@item @code{method} (default: @code{'store})
Indexing method for @command{guix locate}.  The default value,
@code{'store}, yields a more complete database but is relatively expensive
in terms of CPU and input/output.

@item @code{channels} (predeterminada: @code{#~%default-channels})
G-exp denoting the channels to use when updating the database
(@pxref{Canales}).
@end table
@end deftp


@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

@defvar postgresql-service-type
El tipo del servicio para el servidor de la base de datos PostgreSQL. Su
valor sería un objeto válido @code{postgresql-configuration}, documentado a
continuación.  El ejemplo siguiente describe un servicio PostgreSQL con la
configuración predeterminada.

@lisp
(service postgresql-service-type
         (postgresql-configuration
          (postgresql postgresql)))
@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 (a menos que
@code{allow-login?} sea @code{#t}), 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
@end defvar

@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 is required to run `psql' but postgis is not required for
  ;; proper operation.
  (packages (cons* postgresql %base-packages))
  (services
    (cons*
      (service postgresql-service-type
               (postgresql-configuration
                (postgresql postgresql)
                (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.

@item @code{create-account?} (default: @code{#t})
Whether or not the @code{postgres} user and group should be created.

@item @code{allow-login?} (default: @code{#f})
Whether or not to allow login into the created account.

@item @code{home-directory} (default: @code{"/var/empty"})
The home directory of the user.  It is strongly advised to change this if
you set @code{allow-login?} to @code{#t}.

@item @code{uid} (predeterminado: @code{#f})
Explicitly specify the UID of the @code{postgres} daemon account.  You
normally do not need to specify this, in which case a free UID will be
automatically assigned.

One situation where this option might be useful is if the
@var{data-directory} is located on a mounted network share.

@item @code{gid} (default: @code{#f})
Explicitly specify the GID of the @code{postgres} group.

@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

@defvar 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 (list
                           (postgresql-role
                            (name "alice")
                            (create-database? #t)))))
@end lisp
@end defvar

@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.

@item @code{password-file} (default: @code{#f})
A string representing the path of a file that contains the password to be
set for the role.

@item @code{encoding} (default: @code{"UTF8"})
The character set to use for storing text in the database.

@item @code{collation} (default: @code{"en_US.utf8"})
The string sort order locale setting.

@item @code{ctype} (default: @code{"en_US.utf8"})
The character classification locale setting.

@item @code{template} (default: @code{"template1"})
The default template to copy the new database from when creating it.  Use
@code{"template0"} for a pristine database with no system-local
modifications.

@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{shepherd-requirement} (default: @code{'(user-processes postgres)})

The Shepherd services dependencies to use.  Add extra dependencies to
@code{%default-postgresql-role-shepherd-requirement} to extend its value.

@item @code{roles} (default: @code{'()})
The initial PostgreSQL roles to create.
@end table
@end deftp

@subsubheading MariaDB/MySQL

@defvar mysql-service-type
Este es el tipo del servicio de servidor de base de datos MySQL o MariaDB.
Su valor es un objeto @code{mysql-configuration} que especifica cual paquete
a utilizar, así como varias opciones para el daemon @command{mysqld}.
@end defvar

@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

@defvar 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 defvar

@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})
Puerto en el cual acepta conexiones.

@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

@uref{https://redis.io/, Redis} is an in-memory data store used by millions
of developers as a cache, vector database, document database, streaming
engine, and message broker. Redis has built-in replication and different
levels of on-disk persistence. It supports complex data types (for example,
strings, hashes, lists, sets, sorted sets, and JSON), with atomic operations
defined on those data types.

@defvar redis-service-type
Type of the service that runs @command{redis}, an in-memory data store.  The
value for this service is a @code{<redis-configuration>} object.
@end defvar

@c %start of fragment

@deftp {Tipo de datos} redis-configuration
Available @code{redis-configuration} fields are:

@table @asis
@item @code{redis} (default: @code{redis}) (type: package)
El paquete Redis usado.

@item @code{bind} (default: @code{"127.0.0.1"}) (type: string)
La interfaz de red en la que se escucha.

@item @code{port} (default: @code{6379}) (type: number)
Puerto en el que se aceptan conexiones, el valor 0 desactiva la escucha en
un socket TCP.

@item @code{working-directory} (default: @code{"/var/lib/redis"}) (type: string)
Directorio en el que se almacena los archivos de base de datos y
relacionados.

@item @code{config-file} (type: maybe-string)
Default location for config file.

@end table

@end deftp


@c %end of fragment

@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

@defvar dovecot-service-type
Type for the service that runs the Dovecot IMAP/POP3/LMTP mail server, whose
value is a @code{<dovecot-configuration>} object.
@end defvar

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
(service dovecot-service-type
         (dovecot-configuration
           (mail-location "maildir:~/.mail")))
@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 {@code{dovecot-configuration} parameter} package-list extensions
A list of additional Dovecot plugin packages to make available at
runtime. During service activation, the @file{lib/dovecot} directory from
each specified package is combined with Dovecot's core modules into a
unified module directory.

For example, to enable Sieve filtering:

@lisp
(extensions (list dovecot-pigeonhole))
@end lisp

Each package in the list must provide its modules at @file{lib/dovecot}, as
this is where @code{make-dovecot-moduledir} expects to find its
extensions. The service combines these directories to create a unified
module structure.

The default value is an empty list, providing only core Dovecot
functionality.
@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
@samp{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}.  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 otros buzones. 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 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. Debido 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

@defvar 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 defvar

@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{shepherd-requirement} (default: @code{'()})
This option can be used to provide a list of symbols naming Shepherd
services that this service will depend on, such as @code{'networking} if you
want to configure OpenSMTPD to listen on non-loopback interfaces.

@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{log-file} (default: @code{"/var/log/mail.log"})
The file location for the OpenSMTPD log file.  Logging occurs in the
foreground via the Shepherd, i.e. OpenSMTPD does not detach.  When set to
@code{#f} OpenSMTPD will instead detach and log to the syslog.

@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{Privileged Programs}, 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

@defvar 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 defvar

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

@defvar getmail-service-type
This is the type of the @uref{http://pyropus.ca/software/getmail/, Getmail}
mail retriever, whose value should be a @code{getmail-configuration}.
@end defvar

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

@defvar 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 defvar

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

@defvar 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 defvar

@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

@defvar 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}.  The default
configuration matches the @uref{https://radicale.org/v3.html#configuration,
upstream documentation}.
@end defvar

@deftp {Data Type} radicale-configuration
Data type representing the configuration of @command{radicale}.  Available
@code{radicale-configuration} fields are:

@table @asis
@item @code{package} (default: @code{radicale}) (type: package)
Package that provides @command{radicale}.

@item @code{auth} (default: @code{'()}) (type: radicale-auth-configuration)
Configuration for auth-related variables.

@deftp {Data Type} radicale-auth-configuration
Data type representing the @code{auth} section of a @command{radicale}
configuration file.  Available @code{radicale-auth-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'none}) (type: symbol)
The method to verify usernames and passwords.  Options are @code{none},
@code{htpasswd}, @code{remote-user}, and @code{http-x-remote-user}.  This
value is tied to @code{htpasswd-filename} and @code{htpasswd-encryption}.

@item @code{htpasswd-filename} (default: @code{"/etc/radicale/users"}) (type: file-name)
Path to the htpasswd file.  Use htpasswd or similar to generate this file.

@item @code{htpasswd-encryption} (default: @code{'md5}) (type: symbol)
Encryption method used in the htpasswd file.  Options are @code{plain},
@code{bcrypt}, and @code{md5}.

@item @code{delay} (default: @code{1}) (type: non-negative-integer)
Average delay after failed login attempts in seconds.

@item @code{realm} (default: @code{"Radicale - Password Required"}) (type: string)
Message displayed in the client when a password is needed.

@end table

@end deftp

@item @code{encoding} (default: @code{'()}) (type: radicale-encoding-configuration)
Configuration for encoding-related variables.

@deftp {Data Type} radicale-encoding-configuration
Data type representing the @code{encoding} section of a @command{radicale}
configuration file.  Available @code{radicale-encoding-configuration} fields
are:

@table @asis
@item @code{request} (default: @code{'utf-8}) (type: symbol)
Encoding for responding requests.

@item @code{stock} (default: @code{'utf-8}) (type: symbol)
Encoding for storing local collections.

@end table

@end deftp

@item @code{headers-file} (default: none) (type: file-like)
Custom HTTP headers.

@item @code{logging} (default: @code{'()}) (type: radicale-logging-configuration)
Configuration for logging-related variables.

@deftp {Data Type} radicale-logging-configuration
Data type representing the @code{logging} section of a @command{radicale}
configuration file.  Available @code{radicale-logging-configuration} fields
are:

@table @asis
@item @code{level} (default: @code{'warning}) (type: symbol)
Set the logging level.  One of @code{debug}, @code{info}, @code{warning},
@code{error}, or @code{critical}.

@item @code{mask-passwords?} (default: @code{#t}) (type: boolean)
Whether to include passwords in logs.

@end table

@end deftp

@item @code{rights} (default: @code{'()}) (type: radicale-rights-configuration)
Configuration for rights-related variables.  This should be a
@code{radicale-rights-configuration}.

@deftp {Data Type} radicale-rights-configuration
Data type representing the @code{rights} section of a @command{radicale}
configuration file.  Available @code{radicale-rights-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'owner-only}) (type: symbol)
Backend used to check collection access rights.  The recommended backend is
@code{owner-only}.  If access to calendars and address books outside the
home directory of users is granted, clients won't detect these collections
and will not show them to the user.  Choosing any other method is only
useful if you access calendars and address books directly via URL.  Options
are @code{authenticate}, @code{owner-only}, @code{owner-write}, and
@code{from-file}.

@item @code{file} (default: @code{""}) (type: file-name)
File for the rights backend @code{from-file}.

@end table

@end deftp

@item @code{server} (default: @code{'()}) (type: radicale-server-configuration)
Configuration for server-related variables.  Ignored if WSGI is used.

@deftp {Data Type} radicale-server-configuration
Data type representing the @code{server} section of a @command{radicale}
configuration file.  Available @code{radicale-server-configuration} fields
are:

@table @asis
@item @code{hosts} (default: @code{(list "localhost:5232")}) (type: list-of-ip-addresses)
List of IP addresses that the server will bind to.

@item @code{max-connections} (default: @code{8}) (type: non-negative-integer)
Maximum number of parallel connections.  Set to 0 to disable the limit.

@item @code{max-content-length} (default: @code{100000000}) (type: non-negative-integer)
Maximum size of the request body in bytes.

@item @code{timeout} (default: @code{30}) (type: non-negative-integer)
Socket timeout in seconds.

@item @code{ssl?} (default: @code{#f}) (type: boolean)
Whether to enable transport layer encryption.

@item @code{certificate} (default: @code{"/etc/ssl/radicale.cert.pem"}) (type: file-name)
Path of the SSL certificate.

@item @code{key} (default: @code{"/etc/ssl/radicale.key.pem"}) (type: file-name)
Path to the private key for SSL.  Only effective if @code{ssl?} is
@code{#t}.

@item @code{certificate-authority} (default: @code{""}) (type: file-name)
Path to CA certificate for validating client certificates.  This can be used
to secure TCP traffic between Radicale and a reverse proxy.  If you want to
authenticate users with client-side certificates, you also have to write an
authentication plugin that extracts the username from the certificate.

@end table

@end deftp

@item @code{storage} (default: @code{'()}) (type: radicale-storage-configuration)
Configuration for storage-related variables.

@deftp {Data Type} radicale-storage-configuration
Data type representing the @code{storage} section of a @command{radicale}
configuration file.  Available @code{radicale-storage-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'multifilesystem}) (type: symbol)
Backend used to store data.  Options are @code{multifilesystem} and
@code{multifilesystem-nolock}.

@item @code{filesystem-folder} (default: @code{"/var/lib/radicale/collections"}) (type: file-name)
Folder for storing local collections.  Created if not present.

@item @code{max-sync-token-age} (default: @code{2592000}) (type: non-negative-integer)
Delete sync-tokens that are older than the specified time in seconds.

@item @code{hook} (default: @code{""}) (type: string)
Command run after changes to storage.

@end table

@end deftp

@item @code{web-interface?} (default: @code{#t}) (type: boolean)
Whether to use Radicale's built-in web interface.

@end table

@end deftp

@subsubheading Rspamd Service
@cindex correo electrónico (email)
@cindex spam

@defvar rspamd-service-type
This is the type of the @uref{https://rspamd.com/, Rspamd} filtering system
whose value should be a @code{rspamd-configuration}.
@end defvar

@c %start of fragment

@deftp {Data Type} rspamd-configuration
Available @code{rspamd-configuration} fields are:

@table @asis
@item @code{package} (default: @code{rspamd}) (type: file-like)
The package that provides rspamd.

@item @code{config-file} (default: @code{%default-rspamd-config-file}) (type: file-like)
File-like object of the configuration file to use.  By default all workers
are enabled except fuzzy and they are bound to their usual ports, e.g
localhost:11334, localhost:11333 and so on

@item @code{local.d-files} (default: @code{()}) (type: directory-tree)
Configuration files in local.d, provided as a list of two element lists
where the first element is the filename and the second one is a file-like
object.  Settings in these files will be merged with the defaults.

@item @code{override.d-files} (default: @code{()}) (type: directory-tree)
Configuration files in override.d, provided as a list of two element lists
where the first element is the filename and the second one is a file-like
object.  Settings in these files will override the defaults.

@item @code{user} (default: @code{%default-rspamd-account}) (type: user-account)
The user to run rspamd as.

@item @code{group} (default: @code{%default-rspamd-group}) (type: user-group)
The group to run rspamd as.

@item @code{debug?} (default: @code{#f}) (type: boolean)
Force debug output.

@item @code{insecure?} (default: @code{#f}) (type: boolean)
Ignore running workers as privileged users.

@item @code{skip-template?} (default: @code{#f}) (type: boolean)
Do not apply Jinja templates.

@item @code{shepherd-requirements} (default: @code{(user-processes loopback)}) (type: list-of-symbols)
This is a list of symbols naming Shepherd services that this service will
depend on.

@end table

@end deftp


@c %end of fragment

@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

@defvar 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 defvar

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/certs
@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
Additional plugin directories.  They are searched in all the specified paths
in order.  See @url{https://prosody.im/doc/plugins_directory}.  Defaults to
@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 {@code{prosody-configuration} parameter} string-list insecure-sasl-mechanisms
Set of mechanisms that will not be offered on unencrypted connections.  See
@url{https://prosody.im/doc/modules/mod_saslauth}.  Defaults to
@samp{'("PLAIN" "LOGIN")}.
@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
Muchos servidores no permiten el cifrado o tienen certificados
auto-firmados. Puede proporcionar aquí una lista de dominios que no
necesitarán la identificación mediante certificado. Se identificarán
mediante DNS. Véase @url{https://prosody.im/doc/s2s#security}.
Su valor predeterminado es @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:

all these @code{prosody-configuration} fields: @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{insecure-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},
plus:
@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:

all these @code{prosody-configuration} fields: @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{insecure-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},
plus:
@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:

all these @code{prosody-configuration} fields: @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{insecure-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},
plus:
@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.

@defvar 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 defvar

@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 ngIRCd service

@cindex IRCd, Internet Relay Chat daemon
@cindex IRC daemon service
@cindex IRC server service
@cindex IRC (Internet Relay Chat)

@url{https://ngircd.barton.de/, ngIRCd}, is a lightweight @acronym{IRCd,
Internet Relay Chat daemon}, which can be used to host your own IRC server.

@defvar ngircd-service-type
The service type for ngIRCd.  Its value is a @code{ngircd-configuration}
object, documented below.

In its most simple form, the service can be used with its default
configuration, like this:

@lisp
(service ngircd-service-type)
@end lisp

A slightly more complex example configuration could look like:

@lisp
(service ngircd-service-type
         (ngircd-configuration
          (channels
           (list (ngircd-channel
                  (name "#fruits")
                  (topic "All things fruits -- veggies are off-topic"))))
          (operators
           (list (ngircd-operator
                  (name "mikan")
                  (password "tomatoes-are-fruits/carrots-are-not"))))))
@end lisp
@end defvar

@c To regenerate the rest of this section documentation, use the
@c `ngircd-generate-documentation' procedure in
@c (gnu services messaging).
@c %start of fragment

@deftp {Data Type} ngircd-configuration
Available @code{ngircd-configuration} fields are:

@table @asis
@item @code{ngircd} (default: @code{ngircd}) (type: file-like)
The @code{ngircd} package to use.

@item @code{debug?} (default: @code{#f}) (type: boolean)
Turn on debugging messages.

@item @code{shepherd-requirement} (default: @code{(user-processes networking)}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{global} (type: ngircd-global)
A ngircd-global record object used to specify global options.

@item @code{limits} (type: maybe-ngircd-limits)
The ngircd-limits record object used to specify limits options.

@item @code{options} (type: ngircd-options)
The ngircd-options record object used to specify optional features and
configuration options.

@item @code{ssl} (type: maybe-ngircd-ssl)
The ngircd-ssl record object used to specify the SSL-related options.

@item @code{operators} (type: maybe-list-of-ngircd-operators)
A list of ngircd-operator record objects used to specify the operators.

@item @code{servers} (type: maybe-list-of-ngircd-servers)
A list of ngircd-server record objects used to specify other remote servers
to connect to.

@item @code{channels} (type: maybe-list-of-ngircd-channels)
A list of ngircd-channels record objects specifying pre-defined channels to
be created by the server when starting up.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-global
Available @code{ngircd-global} fields are:

@table @asis
@item @code{name} (type: maybe-string)
Server name in the IRC network.  This is an individual name of the IRC
server, it is not related to the DNS host name.  It must be unique in the
IRC network and must contain at least one dot (@samp{.}) character.  When
not set, ngIRCd tries to deduce a valid IRC server name from the local host
name.

@item @code{admin-info-1} (type: maybe-string)
First administrator information.

@item @code{admin-info-2} (type: maybe-string)
Second administrator information.

@item @code{admin-email} (type: maybe-string)
Email to reach administrators.

@item @code{help-file} (type: maybe-file-like)
File-like containing the ngIRCd help text.

@item @code{info} (type: maybe-string)
Info text of the server.  This will be shown by WHOIS and LINKS requests for
example.

@item @code{listen} (default: @code{("::" "0.0.0.0")}) (type: list-of-strings)
A list of IP address on which the server should listen.  By default it
listens on all configured IP addresses and interfaces.

@item @code{motd-file} (type: file-like)
Text file with the @i{message of the day} (MOTD).  This message will be
shown to all users connecting to the server.

@item @code{motd-phrase} (type: maybe-string)
A simple phrase (<127 chars) to use if you don't want to use a MOTD file.

@item @code{network} (type: maybe-string)
The name of the IRC network to which this server belongs.  This name is
optional, should only contain ASCII characters, and can't contain spaces.
It is only used to inform clients.

@item @code{password} (type: maybe-string)
Global password or all users needed to connect to the server.  By default,
no password is required.  PAM must be disabled for this option to have an
effect.

@item @code{pid-file} (default: @code{"/run/ngircd/ngircd.pid"}) (type: string)
The file name where the PID of ngIRCd should be written after it starts.

@item @code{ports} (default: @code{(6667)}) (type: list-of-ports)
Port number(s) on which the server should listen for @emph{unencrypted}
connections.

@item @code{server-uid} (default: @code{"ngircd"}) (type: string-or-number)
The user that the @command{ngircd} command should run as.

@item @code{server-gid} (default: @code{"ngircd"}) (type: string-or-number)
The group that the @command{ngircd} command should run as.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-limits
Available @code{ngircd-limits} fields are:

@table @asis
@item @code{connect-retry} (default: @code{60}) (type: maybe-number)
The number of seconds the server should wait before re-attempting to
establish a link to not yet (or no longer) connected servers.

@item @code{max-connections} (default: @code{0}) (type: maybe-number)
Maximum number of simultaneous in- and outbound connections the server is
allowed to accept.  There is no limit by default.

@item @code{max-connections-ip} (default: @code{5}) (type: maybe-number)
Maximum number of simultaneous connections from a single IP address that the
server will accept.  This configuration options lowers the risk of denial of
service attacks (DoS).  Set to 0 to remove the limit.

@item @code{max-joins} (default: @code{10}) (type: maybe-number)
Maximum number of channels a user can be member of.  Set to 0 to remove the
limit.

@item @code{max-list-size} (default: @code{100}) (type: maybe-number)
Maximum number of channels returned in response to a LIST command.

@item @code{ping-timeout} (default: @code{120}) (type: maybe-number)
Number of seconds of inactivity after which the server will send a PING to
the peer to test whether it is alive or not.

@item @code{pong-timeout} (default: @code{20}) (type: maybe-number)
If a client fails to answer a PING with a PONG within this amount of
seconds, it will be disconnected by the server.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-options
Available @code{ngircd-options} fields are:

@table @asis
@item @code{allowed-channel-types} (default: @code{"#&+"}) (type: maybe-string)
List of allowed channel types (channel prefixes) for newly created channels
on the local server.  By default, all supported channel types are allowed.

@item @code{allow-remote-oper?} (default: @code{#f}) (type: maybe-boolean)
If this option is active, IRC operators connected to remote servers are
allowed to control this local server using administrative commands, for
example like CONNECT, DIE, SQUIT, etc.

@item @code{connect-ipv4?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to prevent ngIRCd from connecting to other IRC servers
using the IPv4 protocol, allowed by default.

@item @code{connect-ipv6?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to prevent ngIRCd from connecting to other IRC servers
using the IPv6 protocol, allowed by default.

@item @code{dns?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to disable DNS lookups when clients connect.  If you
configure the daemon to connect to other servers, ngIRCd may still perform a
DNS lookup if required.

@item @code{more-privacy?} (default: @code{#f}) (type: maybe-boolean)
Set this to @code{#t} to have ngIRCd censor user idle time, logon time as
well as the PART/QUIT messages (that sometimes used to inform everyone about
which client software is being used).  WHOWAS requests are also silently
ignored, and NAMES output doesn't list any clients for non-members.  This
option is most useful when ngIRCd is being used together with anonymizing
software such as TOR or I2P and one does not wish to make it too easy to
collect statistics on the users.

@item @code{notice-before-registration?} (default: @code{#f}) (type: maybe-boolean)
Normally ngIRCd doesn't send any messages to a client until it is
registered.  Enable this option to let the daemon send @samp{NOTICE *}
messages to clients while connecting.

@item @code{oper-can-use-mode?} (default: @code{#f}) (type: maybe-boolean)
Should IRC Operators be allowed to use the MODE command even if they are
not(!) channel-operators?

@item @code{oper-chan-p-auto-op?} (default: @code{#t}) (type: maybe-boolean)
Should IRC Operators get AutoOp (+o) in persistent (+P) channels?

@item @code{oper-server-mode?} (default: @code{#f}) (type: maybe-boolean)
If @code{open-can-use-mode?} is @code{#t}, this may lead the compatibility
problems with servers that run the ircd-irc2 software.  This option masks
mode requests by non-chanops as if they were coming from the server.  Only
enable this if you have ircd-irc2 servers in your IRC network.

@item @code{pam?} (default: @code{#f}) (type: boolean)
Set to @code{#t} to enable calls to the PAM library at runtime; all users
connecting without password are allowed to connect, all passwords given will
fail.  Users identified without PAM are registered with a tilde (@samp{~})
prepended to their user name.  This defaults to @code{#f} in Guix because
the service runs as an unprivileged user and thus cannot authenticate other
users via the @code{pam_unix} PAM module.

@item @code{pam-is-optional?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to make PAM authentication optional, causing clients not
sending a password to still be able to connect, but won't become identified
and keep the tilder (@samp{~}) character prepended to their supplied user
name.

@item @code{require-auth-ping?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to have ngIRCd send an authentication PING when a new
client connects, and register this client only after receiving the
corresponding PONG reply.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-ssl
Available @code{ngircd-ssl} fields are:

@table @asis
@item @code{cert-file} (type: maybe-string)
SSL certificate file of the private server key.

@item @code{key-file} (type: maybe-string)
File name of the SSL Server Key to be used for SSL connections, which is
required for SSL/TLS support.

@item @code{ca-file} (default: @code{"/etc/ssl/certs/ca-certificates.crt"}) (type: maybe-string)
A file listing all the certificates of the trusted Certificate Authorities.

@item @code{ports} (type: maybe-list-of-ports)
Like the global configuration's @code{port} option, except that ngIRCd will
expect incoming connections to be SSL/TLS encrypted.  Common port numbers
for SSL-encrypted IRC are 6669 and 6697.

@item @code{cipher-list} (type: maybe-string)
The GnuTLS cipher suites allowed for SSL/TLS connections, a value such as
@code{"SECURE128:-VERS-SSL3.0"}.  Refer to @samp{man 3 gnutls_priority_init}
for details.

@item @code{dh-file} (type: maybe-file-like)
A file-like containing the Diffie-Hellman parameters, which can be created
with GnuTLS via @samp{certtool --generate-dh-params}.  If this file is not
present, the Diffie-Hellman parameters will be computed on startup, which
may take some time.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-operator
Available @code{ngircd-operator} fields are:

@table @asis
@item @code{name} (type: string)
ID of the operator (may be different of the nickname).

@item @code{password} (type: string)
Password of the IRC operator.

@item @code{mask} (type: maybe-string)
Mask that is to be checked before an /OPER for this account is accepted, for
example: @code{"nick!ident@@*.example.com"}.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-server
Available @code{ngircd-server} fields are:

@table @asis
@item @code{name} (type: string)
IRC name of the remote server.

@item @code{host} (type: string)
Internet host name (or IP address) of the peer.

@item @code{my-password} (type: string)
Own password for this connection.  This password has to be configured as
@code{peer-password} on the other server and must not have @samp{:} as first
character.

@item @code{peer-password} (type: string)
Foreign password for this connection.  This password has to be configured as
@code{my-password} on the other server.

@item @code{bind} (type: maybe-string)
IP address to use as source IP for the outgoing connection.  The default is
to let the operating system decide.

@item @code{port} (type: maybe-port)
Port of the remote server to which ngIRCd should connect (active).  If no
port is assigned to a configured server, the daemon only waits for incoming
connections (passive, which is the default).

@item @code{group} (type: maybe-number)
Group of this server.

@item @code{passive?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to disable automatic connection even if the port value is
specified.

@item @code{ssl-connect?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to enforce the use of TLS to connect to the remote server.

@item @code{ssl-verify?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to disable the verification of the TLS certificate
presented by the remote server.  This can be useful if the remote server
uses a self-signed certificate.  Beware that this degrades security by
enabling man-in-the-middle attacks, as the @emph{remote site is not verified
at all}.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-channel
Available @code{ngircd-channel} fields are:

@table @asis
@item @code{name} (type: string)
Name of the channel, including channel prefix ("#" or "&").

@item @code{topic} (type: maybe-string)
Topic for this channel.

@item @code{modes} (type: maybe-list-of-strings)
Initial channel modes, as used in MODE commands.  Modifying lists (ban list,
invite list, exception list) is supported.  If multiple MODE strings are
specified, they are evaluated in the order listed (left to right).

@item @code{key-file} (type: maybe-file-like)
Path and file name of a ngIRCd key file containing individual channel keys
for different users.  Refer to @samp{man 5 ngircd.conf} for more details.

@end table

@end deftp


@c %end of fragment

@subsubheading Pounce Service

@cindex IRC (Internet Relay Chat)
@cindex bouncer, IRC
@cindex Bounced Network Connection, BNC
@url{https://git.causal.agency/pounce/about/, pounce} is a multi-client,
TLS-only IRC bouncer.  It maintains a persistent connection to an IRC
server, acting as a proxy and buffer for a number of clients.

@defvar pounce-service-type
This is the service type for the pounce IRC bouncer.  Its value is a
@code{pounce-configuration} configuration instance, which is documented
below.

@cindex IRC bouncer configuration for Libera.Chat
@cindex Libera.Chat, IRC bouncer configuration
The following example configures pounce to act as an IRC bouncer for the
@url{https://libera.chat, Libera.Chat} server, using @acronym{CertFP, client
certificate fingerprint} authentication to avoid leaking a sensitive
password to the publicly readable store.  The equally sensitive TLS
certificate file should be created in-place or transferred using a secure
means such as SSH, prior to deploying the service.  The service activation
will ensure the ownership and permissions of the certificate/key files are
set correctly.  In the below example, it is placed at
@file{/etc/pounce/libera.pem} on the target machine.  Pounce itself can be
used to generate a TLS certificate, using the @samp{pounce -g libera.pem}
command, which concatenates both the private key and the public certificate
in the specified file name.  For more information regarding CertFP
authentication, refer to @samp{man pounce} or the Libera.Chat guide at
@url{https://libera.chat/guides/certfp}.

@lisp
(service pounce-service-type
         (pounce-configuration
          (host "irc.libera.chat")
          (client-cert "/etc/pounce/libera.pem")
          (nick "hannah")
          (join (list "#gnu" "#guix" "#guile" "#hurd"))))
@end lisp

Once deployed on the target machine, pounce will act as an IRC server
listening for TLS connections on the 6697 TCP port of the @samp{localhost}
address of that machine.  By default, a self-signed certificate for pounce
is created at @file{/var/lib/pounce/.config/pounce/localhost.cert}.  If you
plan to expose the bouncer to the public Internet, it is advisable to use a
@acronym{CA, Certificate Authority}-signed certificate, as can be obtained
using a certificate service (@pxref{Servicios de certificados}), so that IRC
clients can verify the certificate out of the box.  If you instead plan to
connect to the bouncer strictly via a secure connection, for example using a
@acronym{VPN, Virtual Private Network} or @acronym{SSH, Secure Shell}, then
it is acceptable to simply let your IRC client trust the auto-generated,
self-signed pounce certificate or even disable TLS certificate verification
in your client.

@cindex IRC bouncer configuration for OFTC
@cindex OFTC, IRC bouncer configuration
To connect to a second server, a second pounce instance is needed, taking
care to specify the @code{provision} field of its
@code{pounce-configuration} to avoid a name clash with the previous service,
along with a distinct @code{local-port} and @code{log-file}.  The following
example shows how to configure another bouncer, this time for the
@url{https://www.oftc.net, OFTC} IRC server.  Like in the previous example,
CertFP authentication is used, which can be configured similarly.  For more
details about using CertFP with the OFTC IRC server, refer to
@url{https://www.oftc.net/NickServ/CertFP/}.

@lisp
(service pounce-service-type
         (pounce-configuration
          (shepherd-provision '(pounce-oftc))
          (local-port 6698)
          (log-file "/var/log/pounce-oftc.log")
          (host "irc.oftc.net")
          (client-cert "/etc/pounce/oftc.pem")
          (nick "sena")
          (join (list "#gcc" "#glibc"))))
@end lisp

@end defvar

@c Auto-generated via (configuration->documentation 'pounce-configuration).
@c %start of fragment

@deftp {Data Type} pounce-configuration
Available @code{pounce-configuration} fields are:

@table @asis
@item @code{pounce} (default: @code{pounce}) (type: file-like)
The @code{pounce} package to use.

@item @code{shepherd-provision} (default: @code{(pounce)}) (type: list-of-symbols)
The name(s) of the service.

@item @code{shepherd-requirement} (default: @code{(user-processes networking)}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{log-file} (default: @code{"/var/log/pounce.log"}) (type: string)
The log file name to use.

@item @code{verbose?} (type: maybe-boolean)
When true, log IRC messages to standard output.

@item @code{local-host} (default: @code{"localhost"}) (type: maybe-string)
The host to bind to.

@item @code{local-port} (default: @code{6697}) (type: maybe-port)
The port to bind to.

@item @code{local-ca} (type: maybe-string)
Require clients to authenticate using a TLS client certificate either
contained in or signed by a certificate in the file loaded from
@code{local-ca}, a file name.  The file is reloaded when the SIGUSR1 signal
is received.

@item @code{local-cert} (type: maybe-string)
File name of the TLS certificate to load.  The file is reloaded when the
SIGUSR1 signal is received.  Unless specified, a self-signed certificate is
generated at @file{/var/lib/pounce/.config/pounce/@var{host}.pem}, where
@var{host} corresponds to the value of the @code{local-host} field.

@item @code{local-priv} (type: maybe-string)
File name of the private TLS key to load.  Unless specified, a key is
generated at @file{/var/lib/pounce/.config/pounce/@var{host}.key}, where
@var{host} corresponds to the value of the @code{local-host} field.

@item @code{local-pass} (type: maybe-string)
Require the server password pass for clients to connect.  The pass string
must be hashed using @samp{pounce -x}.

@item @code{size} (default: @code{4096}) (type: maybe-power-of-two)
Set the number of messages contained in the buffer to @var{size}.  This sets
the maximum number of recent messages which can be relayed to a reconnecting
client.  The size must be a power of two.

@item @code{bind} (type: maybe-string)
Host to bind the @emph{source} address to when connecting to the server.  To
connect from any address over IPv4 only, use @samp{0.0.0.0}.  To connect
from any address over IPv6 only, use @samp{::}.

@item @code{host} (type: string)
The host name to connect to.

@item @code{port} (type: maybe-port)
The port number to connect to.

@item @code{pass} (type: maybe-string)
Password to use to log in with the server.  The password must have been
hashed via the @samp{pounce -x} command.

@item @code{join} (type: maybe-list-of-strings)
The list of channels to join.

@item @code{mode} (type: maybe-string)
The user mode.

@item @code{user} (type: maybe-string)
To set the username.  The default username is the same as the nickname.

@item @code{nick} (default: @code{"pounce"}) (type: maybe-string)
Set nickname to @var{nick}.

@item @code{real} (type: maybe-string)
Set the real name.  The default is @code{nick}.

@item @code{away} (type: maybe-string)
The away status to use when no clients are connected and no other away
status has been set.

@item @code{quit} (type: maybe-string)
The message to use when quitting.

@item @code{no-names?} (type: maybe-boolean)
Do not request @samp{NAMES} for each channel when a client connects.  This
avoids already connected clients receiving unsolicited responses but
prevents new clients from populating user lists.

@item @code{queue-interval} (default: @code{200}) (type: maybe-number)
Set the server send queue interval in milliseconds.  The queue is used to
send automated messages from pounce to the server.  Messages from clients
are sent to the server directly.

@item @code{trust} (type: maybe-string)
File name of a certificate to trust.  When used, server name verification is
disabled.

@item @code{client-cert} (type: maybe-string)
The file name of the TLS client.  If the private key is in a separate file,
it is loaded with @code{client-priv}.  With @code{sasl-external?},
authenticate using SASL EXTERNAL.  Certificates can be generated with
@samp{pounce -g}.  For more details, refer to ``Generating Client
Certificates'' in @samp{man 1 pounce}.

@item @code{client-priv} (type: maybe-string)
The file name of the TLS client private key.

@item @code{sasl-plain} (type: maybe-pair)
A pair of the username and password in plain text to authenticate using SASL
PLAIN.  Since this method requires the account password in plain text, it is
recommended to use CertFP instead with @code{sasl-external}.

@item @code{sasl-external?} (type: maybe-boolean)
Authenticate using SASL EXTERNAL, also known as CertFP.  The TLS client
certificate is loaded from @code{client-cert}.

@end table

@end deftp


@c %end of fragment

@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.

@defvar 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 defvar

@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

@subsubheading Snuik Service

@cindex irc-bot
@cindex snuik
The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as a
daemon to aid talking to users that are currently offline.  With the
@code{(gnu services messaging)} service, you can configure it by adding a
@code{snuik-service-type} service to the @code{services} field of your
operating system declaration.

@defvar snuik-service-type
This is the type of the Snuik service, whose value is a
@code{snuik-configuration} object.
@end defvar

Here is an example of a service and its configuration:

@lisp
(service snuik-service-type
         (snuik-configuration
          (password-file "/var/run/snuik/.password.snuik")
          (channels '("#bootstrappable"
                      "#dezyne"
                      "#guix-risc-v"
                      "#lilypond"))))
@end lisp

@deftp {Data Type} snuik-configuration
Available @code{snuik-configuration} fields are:

@table @asis
@item @code{snuik} (default: @code{snuik}) (type: package)
The Snuik package to use.

@item @code{server} (default: @code{"irc.libera.chat"})
The IRC server to connect to.

@item @code{port} (default: @code{6665}) (type: integer)
Port number used by the IRC server.

@item @code{nick} (default: @code{"snuik"}) (type: string)
The nickname for snuik to use.

@item @code{password} (default: @code{#f}) (type: string)
The password to use when logging in.

@item @code{password-file} (default: @code{".password.<nick>})
The file to read the password from to use when logging in.

@item @code{channels} (default: @code{'("##botchat")})
The channels for snuik to join, a list of strings.

@item @code{extra-options} (predeterminadas: @code{'()})
Extra options will be passed to @command{snuik}, please run @command{snuik
--help } for more information.

@end table
@end deftp

@subsubheading Mosquitto Service

@url{https://mosquitto.org/,Mosquitto} is a lightweight message broker that
implements the MQTT protocol versions 5.0, 3.1.1 and 3.1.  It is suitable
for use on all devices from low power single board computers to full
servers.

@defvar mosquitto-service-type
This is the service type for the @url{https://mosquitto.org/,Mosquitto} MQTT
broker.  Its value is a @code{mosquitto-configuration} (see below).
@end defvar

@deftp {Data Type} mosquitto-configuration
This is the configuration for Mosquitto, with the following fields:

@table @asis
@item @code{package} (default: @code{mosquitto})
The Mosquitto package to use.

@item @code{config-file} (predeterminado: @code{#f})
The Mosquitto configuration file as a file-like object or the value
@code{#f} to use the default configuration.

@item @code{user} (default: @code{"mosquitto"})
Owner of the broker process.

@item @code{group} (default: @code{"mosquitto"})
Owner's group of the broker process.
@end table
@end deftp

@subsubheading Mollysocket Service

@url{https://github.com/mollyim/mollysocket,Mollysocket} is a UnifiedPush
provider for the messaging app @url{https://molly.im,Molly}, a fork of
Signal.

@defvar mollysocket-service-type
The Mollysocket service.  Takes @code{mollysocket-configuration} as its
value.  By default, this service listens on port 8020 for any Molly client.
@end defvar

@deftp {Data Type} mollysocket-configuration
The configuration for Mollysocket, with the following fields:

@table @asis
@item @code{package} (default: @code{mollysocket})
The Mollysocket package to use.

@item @code{host} (default: @code{"0.0.0.0"})
Address for the webserver to listen on. It is recommended that this be set
to localhost, and instead configure a TLS-supporting reverse proxy in front
of it.

@item @code{port} (default: @code{8020})
Port for the webserver to listen on.

@item @code{webserver} (default: @code{#t})
Whether the webserver sould be enabled. If disabled, the server is
considered to be in airgapped mode, and clients must be configured likewise.

@item @code{allowed-endpoints} (default: @code{'("*")})
Allowlist of UnifiedPush distributor endpoints, represented as IP addresses
or domain names. Addresses on the local network must be specified
explicitly.

@item @code{allowed-uuids} (default: @code{'("*")})
Allowlist of Signal account UUIDs.

@item @code{db} (default: @code{"/var/lib/mollysocket/db.sqlite"})
Path to the Mollysocket database. Will be created if it doesn't exist.

@item @code{vapid-key-file} (default: @code{"/var/lib/mollysocket/vapid.key"})
Path to the VAPID key used to authorize requests to the UnifiedPush
distributor.  Will be created if it doesn't exist.
@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

@defvar jami-service-type
The service type for running Jami as a service.  It takes a
@code{jami-configuration} object as a value, documented below.  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.
@end defvar

@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-list-of-strings)
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).

@defvar mumble-server-service-type

This is the service to run a Mumble server.  It takes a
@code{mumble-server-configuration} object as its value, defined below.
@end defvar

@deftp {Data Type} mumble-server-configuration
The service type for the Mumble server.  An example configuration can look
like this:

@lisp
(service murmur-service-type
         (murmur-configuration
          (welcome-text
            "¡Bienvenida a este servidor Murmur que se ejecuta en Guix!")
          (cert-required? #t) ;no permite ingresos con una contraseña en texto
          (ssl-cert "/etc/certs/mumble.example.com/fullchain.pem")
          (ssl-key "/etc/certs/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/certs/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/certs/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.

@defvar 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 defvar

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 {Procedure} transmission-password-hash password 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 {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 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 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 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

@anchor{vnstat}
@subsubheading vnStat Network Traffic Monitor
@cindex vnstat

vnStat is a network traffic monitor that uses interface statistics provided
by the kernel rather than traffic sniffing.  This makes it a light resource
monitor, regardless of network traffic rate.

@defvar vnstat-service-type
This is the service type for the @uref{https://humdi.net/vnstat/,vnStat}
daemon and accepts a @code{vnstat-configuration} value.

The following example will configure the service with default values:

@lisp
(service vnstat-service-type)
@end lisp
@end defvar

@c %start of fragment
@deftp {Data Type} vnstat-configuration
Available @code{vnstat-configuration} fields are:

@table @asis
@item @code{package} (default: @code{vnstat}) (type: file-like)
The vnstat package.

@item @code{database-directory} (default: @code{"/var/lib/vnstat"}) (type: string)
Specifies the directory where the database is to be stored.  A full path
must be given and a leading '/' isn't required.

@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer)
Data retention duration for the 5 minute resolution entries.  The
configuration defines for how many past hours entries will be stored.  Set
to @code{-1} for unlimited entries or to @code{0} to disable the data
collection of this resolution.

@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer)
Select interface counter handling.  Set to @code{1} for defining that all
interfaces use 64-bit counters on the kernel side and @code{0} for defining
32-bit counter.  Set to @code{-1} for using the old style logic used in
earlier versions where counter values within 32-bits are assumed to be
32-bit and anything larger is assumed to be a 64-bit counter.  This may
produce false results if a 64-bit counter is reset within the 32-bits.  Set
to @code{-2} for using automatic detection based on available kernel
datastructures.

@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean)
Enable or disable automatic creation of new database entries for interfaces
not currently in the database even if the database file already exists when
the daemon is started.  New database entries will also get created for new
interfaces seen while the daemon is running.  Pseudo interfaces @samp{lo},
@samp{lo0} and @samp{sit0} are always excluded from getting added.

@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean)
Try to automatically detect @var{max-bandwidth} value for each monitored
interface.  Mostly only ethernet interfaces support this feature.
@var{max-bandwidth} will be used as fallback value if detection fails.  Any
interface specific @var{max-BW} configuration will disable the detection for
the specified interface.  In Linux, the detection is disabled for tun
interfaces due to the Linux kernel always reporting 10 Mbit regardless of
the used real interface.

@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer)
How often in minutes interface specific detection of @var{max-bandwidth} is
done for detecting possible changes when @var{bandwidth-detection} is
enabled.  Can be disabled by setting to @code{0}.  Value range:
@samp{0}..@samp{30}

@item @code{boot-variation} (default: @code{15}) (type: maybe-integer)
Time in seconds how much the boot time reported by system kernel can variate
between updates.  Value range: @samp{0}..@samp{300}

@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean)
Enable or disable the availability check of at least some free disk space
before a database write.

@item @code{create-directories?} (default: @code{#t}) (type: maybe-boolean)
Enable or disable the creation of directories when a configured path doesn't
exist.  This includes @var{database-directory}.

@item @code{daemon-group} (type: maybe-user-group)
Specify the group to which the daemon process should switch during startup.
Set to @code{%unset-value} to disable group switching.

@item @code{daemon-user} (type: maybe-user-account)
Specify the user to which the daemon process should switch during startup.
Set to @code{%unset-value} to disable user switching.

@item @code{daily-days} (default: @code{62}) (type: maybe-integer)
Data retention duration for the one day resolution entries.  The
configuration defines for how many past days entries will be stored.  Set to
@code{-1} for unlimited entries or to @code{0} to disable the data
collection of this resolution.

@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer)
Change the setting of the SQLite "synchronous" flag which controls how much
care is taken to ensure disk writes have fully completed when writing data
to the database before continuing other actions.  Higher values take extra
steps to ensure data safety at the cost of slower performance.  A value of
@code{0} will result in all handling being left to the filesystem itself.
Set to @code{-1} to select the default value according to database mode
controlled by @var{database-write-ahead-logging} setting.  See SQLite
documentation for more details regarding values from @code{1} to @code{3}.
Value range: @samp{-1}..@samp{3}

@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean)
Enable or disable SQLite Write-Ahead Logging mode for the database.  See
SQLite documentation for more details and note that support for read-only
operations isn't available in older SQLite versions.

@item @code{hourly-days} (default: @code{4}) (type: maybe-integer)
Data retention duration for the one hour resolution entries.  The
configuration defines for how many past days entries will be stored.  Set to
@code{-1} for unlimited entries or to @code{0} to disable the data
collection of this resolution.

@item @code{log-file} (type: maybe-string)
Specify log file path and name to be used if @var{use-logging} is set to
@code{1}.

@item @code{max-bandwidth} (type: maybe-integer)
Maximum bandwidth for all interfaces.  If the interface specific traffic
exceeds the given value then the data is assumed to be invalid and
rejected.  Set to 0 in order to disable the feature.  Value range:
@samp{0}..@samp{50000}

@item @code{max-bw} (type: maybe-alist)
Same as @var{max-bandwidth} but can be used for setting individual limits
for selected interfaces.  This is an association list of interfaces as
strings to integer values.  For example,
@lisp
(max-bw `(("eth0" .  15000)
          ("ppp0" .  10000)))
@end lisp
@var{bandwidth-detection} is disabled on an interface specific level for
each @var{max-bw} configuration.  Value range: @samp{0}..@samp{50000}

@item @code{monthly-months} (default: @code{25}) (type: maybe-integer)
Data retention duration for the one month resolution entries.  The
configuration defines for how many past months entries will be stored.  Set
to @code{-1} for unlimited entries or to @code{0} to disable the data
collection of this resolution.

@item @code{month-rotate} (default: @code{1}) (type: maybe-integer)
Day of month that months are expected to change.  Usually set to 1 but can
be set to alternative values for example for tracking monthly billed traffic
where the billing period doesn't start on the first day.  For example, if
set to 7, days of February up to and including the 6th will count for
January.  Changing this option will not cause existing data to be
recalculated.  Value range: @samp{1}..@samp{28}

@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean)
Enable or disable @var{month-rotate} also affecting yearly data.  Applicable
only when @var{month-rotate} has a value greater than one.

@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer)
How often in minutes cached interface data is saved to file when all
monitored interfaces are offline.  Value range:
@var{save-interval}..@samp{60}

@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string)
Specify pid file path and name to be used.

@item @code{poll-interval} (default: @code{5}) (type: maybe-integer)
How often in seconds interfaces are checked for status changes.  Value
range: @samp{2}..@samp{60}

@item @code{rescan-database-on-save?} (type: maybe-boolean)
Automatically discover added interfaces from the database and start
monitoring.  The rescan is done every @var{save-interval} or
@var{offline-save-interval} minutes depending on the current activity state.

@item @code{save-interval} (default: @code{5}) (type: maybe-integer)
How often in minutes cached interface data is saved to file.  Value range: (
@var{update-interval} / 60 )..@samp{60}

@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean)
Enable or disable the additional saving to file of cached interface data
when the availability of an interface changes, i.e., when an interface goes
offline or comes online.

@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer)
How many minutes to wait during daemon startup for system clock to sync if
most recent database update appears to be in the future.  This may be needed
in systems without a real-time clock (RTC) which require some time after
boot to query and set the correct time.  @code{0} = wait disabled.  Value
range: @samp{0}..@samp{60}

@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer)
Data retention duration for the top day entries.  The configuration defines
how many of the past top day entries will be stored.  Set to @code{-1} for
unlimited entries or to @code{0} to disable the data collection of this
resolution.

@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean)
Create database entries even when there is no traffic during the entry's
time period.

@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean)
Enable or disable the update of file ownership during daemon process
startup.  During daemon startup, only database, log and pid files will be
modified if the user or group change feature ( @var{daemon-user} or
@var{daemon-group} ) is enabled and the files don't match the requested user
or group.  During manual database creation, this option will cause file
ownership to be inherited from the database directory if the directory
already exists.  This option only has effect when the process is started as
root or via sudo.

@item @code{update-interval} (default: @code{20}) (type: maybe-integer)
How often in seconds the interface data is updated.  Value range:
@var{poll-interval}..@samp{300}

@item @code{use-logging} (default: @code{2}) (type: maybe-integer)
Enable or disable logging.  Accepted values are: @code{0} = disabled,
@code{1} = logfile and @code{2} = syslog.

@item @code{use-utc?} (type: maybe-boolean)
Enable or disable using UTC as timezone in the database for all entries.
When enabled, all entries added to the database will use UTC regardless of
the configured system timezone.  When disabled, the configured system
timezone will be used.  Changing this setting will not result in already
existing data to be modified.

@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer)
Data retention duration for the one year resolution entries.  The
configuration defines for how many past years entries will be stored.  Set
to @code{-1} for unlimited entries or to @code{0} to disable the data
collection of this resolution.

@end table
@end deftp
@c %end of fragment

@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 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: string)
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 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: string)
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 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.

@defvar krb5-service-type
Un tipo de servicio para clientes Kerberos 5.
@end defvar

@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.

@defvar pam-krb5-service-type
Un tipo de servicio para el módulo PAM de Kerberos 5.
@end defvar

@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

@subsubheading Authentication against LDAP with nslcd
@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.

Defaults to @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


@subsubheading LDAP Directory Server
@cindex LDAP, server

The @code{(gnu services ldap)} module provides the
@code{directory-server-service-type}, which can be used to create and launch
an LDAP server instance.

Here is an example configuration of the
@code{directory-server-service-type}:

@lisp
(use-service-modules ldap)

...
(operating-system
  ...
  (services
    (cons
      (service directory-server-service-type
               (directory-server-instance-configuration
                (slapd
                 (slapd-configuration
                  (root-password "@{PBKDF2_SHA256@}AAAgAG@dots{}ABSOLUTELYSECRET")))))
      %base-services)))
@end lisp

The root password should be generated with the @command{pwdhash} utility
that is provided by the @code{389-ds-base} package.

Note that changes to the directory server configuration will not be applied
to existing instances.  You will need to back up and restore server data
manually.  Only new directory server instances will be created upon system
reconfiguration.

@c %start of generated documentation for directory-server-instance-configuration
@deftp {Data Type} directory-server-instance-configuration
Available @code{directory-server-instance-configuration} fields are:

@table @asis
@item @code{package} (default: @code{389-ds-base}) (type: file-like)
The @code{389-ds-base} package.

@item @code{config-version} (default: @code{2}) (type: number)
Sets the format version of the configuration file.  To use the INF file with
@command{dscreate}, this parameter must be 2.

@item @code{full-machine-name} (default: @code{"localhost"}) (type: string)
Sets the fully qualified hostname (FQDN) of this system.

@item @code{selinux} (default: @code{#false}) (type: boolean)
Enables SELinux detection and integration during the installation of this
instance.  If set to @code{#true}, @command{dscreate} auto-detects whether
SELinux is enabled.

@item @code{strict-host-checking} (default: @code{#true}) (type: boolean)
Sets whether the server verifies the forward and reverse record set in the
@code{full-machine-name} parameter.  When installing this instance with
GSSAPI authentication behind a load balancer, set this parameter to
@code{#false}.

@item @code{systemd} (default: @code{#false}) (type: boolean)
Enables systemd platform features.  If set to @code{#true},
@command{dscreate} auto-detects whether systemd is installed.

@item @code{slapd} (type: slapd-configuration)
Configuration of slapd.

@deftp {Data Type} slapd-configuration
Available @code{slapd-configuration} fields are:

@table @asis
@item @code{instance-name} (default: @code{"localhost"}) (type: string)
Sets the name of the instance.  You can refer to this value in other
parameters of this INF file using the @code{@{instance_name@}} variable.
Note that this name cannot be changed after the installation!

@item @code{user} (default: @code{"dirsrv"}) (type: string)
Sets the user name the ns-slapd process will use after the service started.

@item @code{group} (default: @code{"dirsrv"}) (type: string)
Sets the group name the ns-slapd process will use after the service started.

@item @code{port} (default: @code{389}) (type: number)
Sets the TCP port the instance uses for LDAP connections.

@item @code{secure-port} (default: @code{636}) (type: number)
Sets the TCP port the instance uses for TLS-secured LDAP connections
(LDAPS).

@item @code{root-dn} (default: @code{"cn=Directory Manager"}) (type: string)
Sets the @dfn{Distinquished Name} (DN) of the administrator account for this
instance.

@item @code{root-password} (default: @code{"@{invalid@}YOU-SHOULD-CHANGE-THIS"}) (type: string)
Sets the password of the account specified in the @code{root-dn} parameter.
You can either set this parameter to a plain text password
@command{dscreate} hashes during the installation or to a
"@{algorithm@}hash" string generated by the @command{pwdhash} utility.  Note
that setting a plain text password can be a security risk if unprivileged
users can read this INF file!

@item @code{self-sign-cert} (default: @code{#true}) (type: boolean)
Sets whether the setup creates a self-signed certificate and enables TLS
encryption during the installation.  This is not suitable for production,
but it enables administrators to use TLS right after the installation.  You
can replace the self-signed certificate with a certificate issued by a
certificate authority.

@item @code{self-sign-cert-valid-months} (default: @code{24}) (type: number)
Set the number of months the issued self-signed certificate will be valid.

@item @code{backup-dir} (default: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/bak"}) (type: string)
Set the backup directory of the instance.

@item @code{cert-dir} (default: @code{"/etc/dirsrv/slapd-@{instance_name@}"}) (type: string)
Sets the directory of the instance's Network Security Services (NSS)
database.

@item @code{config-dir} (default: @code{"/etc/dirsrv/slapd-@{instance_name@}"}) (type: string)
Sets the configuration directory of the instance.

@item @code{db-dir} (default: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/db"}) (type: string)
Sets the database directory of the instance.

@item @code{initconfig-dir} (default: @code{"/etc/dirsrv/registry"}) (type: string)
Sets the directory of the operating system's rc configuration directory.

@item @code{ldif-dir} (default: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/ldif"}) (type: string)
Sets the LDIF export and import directory of the instance.

@item @code{lock-dir} (default: @code{"/var/lock/dirsrv/slapd-@{instance_name@}"}) (type: string)
Sets the lock directory of the instance.

@item @code{log-dir} (default: @code{"/var/log/dirsrv/slapd-@{instance_name@}"}) (type: string)
Sets the log directory of the instance.

@item @code{run-dir} (default: @code{"/run/dirsrv"}) (type: string)
Sets PID directory of the instance.

@item @code{schema-dir} (default: @code{"/etc/dirsrv/slapd-@{instance_name@}/schema"}) (type: string)
Sets schema directory of the instance.

@item @code{tmp-dir} (default: @code{"/tmp"}) (type: string)
Sets the temporary directory of the instance.
@end table
@end deftp

@item @code{backend-userroot} (type: backend-userroot-configuration)
Configuration of the userroot backend.

@deftp {Data Type} backend-userroot-configuration
Available @code{backend-userroot-configuration} fields are:

@table @asis
@item @code{create-suffix-entry?} (default: @code{#false}) (type: boolean)
Set this parameter to @code{#true} to create a generic root node entry for
the suffix in the database.

@item @code{require-index?} (default: @code{#false}) (type: boolean)
Set this parameter to @code{#true} to refuse unindexed searches in this
database.

@item @code{sample-entries} (default: @code{"no"}) (type: string)
Set this parameter to @code{"yes"} to add latest version of sample entries
to this database.  Or, use @code{"001003006"} to use the 1.3.6 version
sample entries.  Use this option, for example, to create a database for
testing purposes.

@item @code{suffix} (type: maybe-string)
Sets the root suffix stored in this database.  If you do not set the suffix
attribute the install process will not create the backend/suffix.  You can
also create multiple backends/suffixes by duplicating this section.

@end table
@end deftp
@end table
@end deftp
@c end of generated documentation for directory-server

@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

@defvar 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 'www.example.com-server httpd-service-type
                (list
                  (httpd-virtualhost
                    "*:80"
                    (list (string-join '("ServerName www.example.com"
                                         "DocumentRoot /srv/http/www.example.com")
                                       "\n")))))
@end lisp
@end defvar

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.

@deftp {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 deftp

@deftp {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 deftp

@defvar %default-httpd-modules
Una lista de objetos @code{httpd-module} predeterminados.
@end defvar

@deftp {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 deftp

@deftp {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 deftp

@anchor{NGINX}
@subsubheading NGINX

@defvar 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 defvar

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}.

@deftp {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{log-format} (default: @code{'combined}) (type: symbol)
Logging format for the access log. Nginx defaults to the httpd-like format
named @code{'combined}.  Other formats can be defined using
@code{log-formats}.

@item @code{log-formats} (default: @code{'()})
A list of additional @dfn{log formats} to define, the elements should be of
type @code{<nginx-log-format-configuration>}.

@item @code{log-level} (default: @code{'error}) (type: symbol)
Logging level for the error log, which can be any of the following values:
@code{'debug}, @code{'info}, @code{'notice}, @code{'warn}, @code{'error},
@code{'crit}, @code{'alert}, or @code{'emerg}.

@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{stream} (default: @code{#f})
@code{<nginx-stream-configuration>} object describing stream server
directives.

@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{""})
Additional content to be appended to the @code{http} block.  Can either be a
value that can be lowered into a string or a list of such values.  In the
former case, it is inserted directly.  In the latter, it is prefixed with
indentation and suffixed with a newline.  Nested lists are flattened into
one line.

@lisp
(extra-content "include /etc/nginx/custom-config.conf;")
(extra-content `("include /etc/nginx/custom-config.conf;"
                 ("include " ,%custom-config.conf ";")))
@end lisp

@end table
@end deftp

@deftp {Data Type} nginx-log-format-configuration
Data type representing the configuration of a custom Nginx log format.  This
type has the following parameters:

@table @asis
@item @code{name} (type: symbol)
The name of the log format as a symbol.

@item @code{escape} (default: @code{'default}) (type: symbol)
The mode used to escape values of variables in the format.  The supported
values are:

@itemize
@item @code{'default}, to escape all characters outside of the ASCII
      printable range.
@item @code{'json}, to escape all characters invalid in JSON strings.
@item @code{'none}, to disable escaping.
@end itemize

@item @code{format} (type: string)
The format as accepted by the @code{log_format} directive.

@end table
@end deftp

@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{'()})
A list of strings or file-like objects to be appended to the server block.
Each item is prefixed with indentation and suffixed with a new line.  Nested
lists are flattened.

@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}
Additional content to be appended to the upstream block.  Can be a string or
file-like object or list of thereof.  In case of list, each item is prefixed
with indentation and suffixed with a new line.  Nested lists are flattened.

@lisp
(extra-content "include /etc/nginx/custom-config.conf;")
(extra-content `("include /etc/nginx/custom-config.conf;"
                 ("include " ,%custom-config.conf ";")))
@end lisp

@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 or file-like
objects.  Each item is prefixed with indentation and suffixed with a new
line.  Nested lists are flattened.

Por ejemplo, para pasar las peticiones a un grupo de servidores proveedores
definido mediante el uso de un bloque @code{nginx-upstream-configuration},
se especificaría la siguiente directiva en el cuerpo @samp{(list
\"proxy_pass http://nombre-proveedor;\")}.

@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

@deftp {Data Type} nginx-stream-configuration
Data type representing the configuration file context in which stream
directives are specified.  This type has the following parameters:

@table @asis
@item @code{upstream-blocks} (predeterminados: @code{'()})
Una lista de bloques upstream creada en el archivo de configuración
generado, los elementos deben ser del tipo
@code{<nginx-upstream-configuration>}.

@item @code{server-blocks} (predeterminados: @code{'()})
Una lista de bloques de servidor que se crearán en el archivo de
configuración generado; los elementos deben ser del tipo
@code{<nginx-server-configuration>}.

@item @code{extra-content} (default: @code{'()})
Additional content to be appended to the @code{stream} block.  Can either be
a value that can be lowered into a string or a list of such values.  In the
former case, it is inserted directly.  In the latter, it is prefixed with
indentation and suffixed with a newline.  Nested lists are flattened into
one line.

@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.

@defvar varnish-service-type
Tipo de servicio para el daemon Varnish.
@end defvar

@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

@subheading Whoogle Search
@cindex Whoogle Search

@uref{https://github.com/benbusby/whoogle-search, Whoogle Search} is a
self-hosted, ad-free, privacy-respecting meta search engine that collects
and displays Google search results.  By default, you can configure it by
adding this line to the @code{services} field of your operating system
declaration:

@lisp
(service whoogle-service-type)
@end lisp

As a result, Whoogle Search runs as local Web server, which you can access
by opening @indicateurl{http://localhost:5000} in your browser.  The
configuration reference is given below.

@defvar whoogle-service-type
Service type for Whoogle Search.  Its value must be a
@code{whoogle-configuration} record---see below.
@end defvar

@deftp {Data Type} whoogle-configuration
Data type representing Whoogle Search service configuration.

@table @asis
@item @code{package} (default: @code{whoogle-search})
The Whoogle Search package to use.

@item @code{host} (predeterminada: @code{"127.0.0.1"})
The host address to run Whoogle on.

@item @code{port} (default: @code{5000})
The port where Whoogle will be exposed.

@item @code{environment-variables} (default: @code{'()})
A list of strings with the environment variables to configure Whoogle.  You
can consult
@uref{https://github.com/benbusby/whoogle-search/blob/main/whoogle.template.env,
its environment variables template} for the list of available options.

@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.

@defvar patchwork-service-type
Tipo de servicio para Patchwork.
@end defvar

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://codeberg.org/guix/mumi, 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.

@defvar mumi-service-type
El tipo de servicio para Mumi.
@end defvar

@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{data-directory} (default: @file{"/var/mumi/data"})
Data directory to store Debbugs data from upstream Debbugs instance.

@item @code{rsync-remote}
Remote rsync path from which to download Debbugs data.  The remote is polled
every 5 minutes, unless a previous instance of rsync is already running.

@item @code{rsync-flags} (default: @code{'()})
Additional flags to pass to @command{rsync}.

@item @code{mailer?} (predeterminado: @code{#true})
Determina si se activa o desactiva el componente de correo @code{mailer}.

@item @code{sender}
La dirección de correo usada como remitente para los comentarios.

@item @code{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}.

@item @code{paquetes}
List of @code{<mumi-package-configuration>} objects representing packages
configured on Mumi.

@end table
@end deftp

@deftp {Data Type} mumi-package-configuration
Data type representing the configuration of a package on Mumi.  This type
has the following fields:

@table @asis
@item @code{name}
Name of the package.

@item @code{display-name}
Display name used for this package in the web interface.

@item @code{debbugs-packages}
List of Debbugs packages this package refers to.

@item @code{bug-email-address}
Email address to send bug reports to.

@item @code{patch-email-address}
Email address to send patches to, if that is different from
@code{bug-email-address}.

@item @code{file-tags}
Association list mapping tags to filename regular expressions. Keys are tag
names, and values are lists of regular expressions.  For each entry of the
association list, the tag is applied if a filename referred to in a patch
matches any of the regular expressions.

@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}.

@defvar fcgiwrap-service-type
El tipo de servicio para la pasarela FastCGI @code{fcgiwrap}.
@end defvar

@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.

@defvar php-fpm-service-type
Un tipo de servicio para @code{php-fpm}.
@end defvar

@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} 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} 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).

@defvar hpcguix-web-service-type
El tipo de servicio para @code{hpcguix-web}.
@end defvar

@deftp {Tipo de datos} hpcguix-web-configuration
El tipo de datos para la configuración del servicio hpcguix-web.

@table @asis
@item @code{specs} (default: @code{#f})
Either @code{#f} or a gexp (@pxref{Expresiones-G}) specifying the
hpcguix-web service configuration as an @code{hpcguix-web-configuration}
record.  The main fields of that record type are:

@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"})
The @command{guix} command to use in examples that appear on HTML pages.

@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
           #~(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.

A certificate package, @code{nss-certs}, is provided by default as part of
@code{%base-packages}.  @ref{Certificados X.509}, for more information on
X.509 certificates.
@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}.

@defvar 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 defvar

@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.

@defvar 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")
	   (certificates "/srv/gemini-certs")))
@end lisp

The example above represents the minimal tweaking necessary to get Agate up
and running.  Specifying the path to the certificate and key directory is
always necessary, as the Gemini protocol requires TLS by default.

If the specified @code{certificates} path is writable by Agate, and contains
no valid pre-generated key and certificate, Agate will try to generate them
on the first start.  In this case you should pass at least one hostname
using the @code{hostnames} option.  If the specified directory is read-only,
key and certificate should be pre-generated by the user.

To obtain a certificate and a key in DER format, you could, for example, use
OpenSSL, running commands similar to the following example:

@example
openssl genpkey -out key.der -outform DER -algorithm RSA \
    -pkeyopt rsa_keygen_bits:4096
openssl req -x509 -key key.der -outform DER -days 3650 -out cert.der \
    -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 directory
with the generated key and certificate using the @code{certificates} option.

@end defvar

@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{certificates} (default: @file{"/srv/gemini-certs"})
Root of the certificate directory. Must be filled in with a value from the
user.

@item @code{addresses} (default: @code{'("[::]:1965" "0.0.0.0:1965")})
A list of the addresses to listen on.

@item @code{hostnames} (default: @code{'()})
Virtual hosts for the Gemini server. If multiple values are specified,
corresponding directory names should be present in the @code{content}
directory. Optional.

@item @code{languages} (default: @code{#f})
RFC 4646 language code(s) for text/gemini documents.  Optional.

@item @code{only-tls13?} (default: @code{#f})
Set to @code{#t} to disable support for TLSv1.2.

@item @code{serve-secret?} (default: @code{#f})
Set to @code{#t} to serve secret files (files/directories starting with a
dot).

@item @code{central-configuration?} (default: @code{#f})
Set to @code{#t} to look for the .meta configuration file in the
@code{content} root directory and will ignore @code{.meta} files in other
directories

@item @code{ed25519?} (default: @code{#f})
Set to @code{#t} to generate keys using the Ed25519 signature algorithm
instead of the default ECDSA.

@item @code{skip-port-check?} (default: @code{#f})
Set to @code{#t} to skip URL port check even when a @code{hostname} is
specified.

@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

@subsubheading Miniflux

@cindex miniflux
The @uref{https://miniflux.app/, Miniflux} is a minimalist RSS feed reader
with a web interface.

Depending on the configuration, an initial administrator user can be
pre-created on startup. To enable this, @code{create-admin?} should be set
to @code{#t}, and both @code{admin-username-file} and
@code{admin-password-file} should point to files containing the username and
password, respectively. However, it is recommended to manually change the
password to a secure one via the web UI after the initial service startup.

@defvar miniflux-service-type
This is the type of the Miniflux service. Its value must be a
@code{miniflux-configuration} record as in this example:

@lisp
(service miniflux-service-type
         (miniflux-configuration
          (listen-address "0.0.0.0:8080")
          (base-url "http://my-news-source.test")
          (create-administrator-account? #t)
          (administrator-account-name "/var/miniflux/initial-admin-username")
          (administrator-account-password "/var/miniflux/initial-admin-password")))
@end lisp

The details of the @code{miniflux-configuration} record type are given
below.

@end defvar

@deftp {Data Type} miniflux-configuration
Available @code{miniflux-configuration} fields are:

@table @asis
@item @code{listen-address} (default: @code{"127.0.0.1:8080"}) (type: string)
Address to listen on.  Use absolute path like
@code{"/var/run/miniflux/miniflux.sock"} for a Unix socket.

@item @code{base-url} (default: @code{"http://127.0.0.1/"}) (type: string)
Base URL to generate HTML links and base path for cookies.

@item @code{create-administrator-account?} (default: @code{#f}) (type: boolean)
Create an initial administrator account.

@item @code{administrator-account-name} (type: maybe-string-or-file-path)
Initial administrator account name as a string or an absolute path to a file
with an account name inside.

@item @code{administrator-account-password} (type: maybe-string-or-file-path)
Initial administrator account password as a string or an absolute path to a
file with a password inside.

@item @code{run-migrations?} (default: @code{#t}) (type: boolean)
Run database migrations during application startup.

@item @code{database-url} (default: @code{"host=/var/run/postgresql"}) (type: string)
PostgreSQL connection string.

@item @code{user} (default: @code{"miniflux"}) (type: string)
User name for Postgresql and system account.

@item @code{group} (default: @code{"miniflux"}) (type: string)
Group for the system account.

@item @code{log-file} (default: @code{"/var/log/miniflux.log"}) (type: string)
Path to the log file.

@item @code{extra-settings} (type: maybe-list)
Extra configuration parameters as a list of strings.

@end table
@end deftp

@node High Availability Services
@subsection High Availability Services

@cindex Message broker
@cindex Message streaming
The @code{(gnu services high-availability)} module provides RabbitMQ message
broker service.

@anchor{RabbitMQ}
@subsubheading RabbitMQ

@defvar rabbitmq-service-type
Service type for the @uref{https://www.rabbitmq.com/,RabbitMQ} web server.
The value for this service type is a @code{<rabbitmq-configuration>} record.

Un ejemplo de configuración simple se proporciona a continuación.

@lisp
(service rabbitmq-service-type
         (rabbitmq-configuration
           (rabbitmq-configuration
             (plugins '("rabbitmq_stream"
                        "rabbitmq_management"
                        "rabbitmq_prometheus")))))
@end lisp
@end defvar

At startup, RabbitMQ broker logs its initialization messages into
@file{/var/log/messages} file.  Once running, the logging messages can be
found in a logging file of a RabbitMQ node in @file{/var/log/rabbitmq}
directory.

@quotation Nota
The default configuration of the RabbitMQ service enables the RabbitMQ
broker to accept connections only on loopback interfaces.  However, enabling
certain plugins may open ports on all network interfaces.  See also
@url{https://www.rabbitmq.com/docs/networking#ports, RabbitMQ Port Access}.
@end quotation

@deftp {Data Type} rabbitmq-configuration
This data type represents the configuration for RabbitMQ.

@table @asis
@item @code{rabbitmq} (default: @code{rabbitmq})
The RabbitMQ package to use.

@item @code{config-file} (default: @code{%default-rabbitmq-config-file})
Configuration file for the RabbitMQ broker. See also
@url{https://www.rabbitmq.com/docs/configure, RabbitMQ Configuration}.

@item @code{data-directory} (default: @code{"/var/lib/rabbitmq/data"})
Directory with RabbitMQ broker data - a schema database, message stores,
cluster member information, and other persistent node state.

@item @code{plugins} (predeterminados: @code{'()})
A list of RabbitMQ plugins to enable.  View all available plugins using the
@command{rabbitmq-plugins list} command.

@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-v02.api.letsencrypt.org/directory}.

@defvar 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
(service certbot-service-type
         (certbot-configuration
          (email "foo@@example.net")
          (certificates
           (list
            (certificate-configuration
             (domains '("example.net" "www.example.net")))
            (certificate-configuration
             (domains '("bar.example.net")))))))
@end lisp

Véase a continuación los detalles de @code{certbot-configuration}.
@end defvar

@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})
Command to be run in a shell once for each certificate challenge that have
been answered by the @code{authentication-hook}.  For this command, the
shell variables available in the @code{authentication-hook} script are still
available, and additionally @code{$CERTBOT_AUTH_OUTPUT} will contain the
standard output of the @code{authentication-hook} script.

@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"}).

@item @code{dry-run?} (default: @code{#f})
Communicate with the ACME server but do not update certificates nor trigger
@code{deploy-hook}.  This is useful as a temporary setting to test the
challenge procedure, especially the @code{authentication-hook} and
@code{cleanup-hook} while working on them.  It's also a good idea to use the
Let's Encrypt staging server at
@url{https://acme-staging-v02.api.letsencrypt.org/directory} while testing,
which allows for higher rate limits, but with which @code{certbot} will
helpfully refuse to update certificates and recommend the @code{dry-run?}
option.  For example:

@lisp
(define %authentication-hook
  (program-file "authentication-hook"
    #~(let ((domain (getenv "CERTBOT_DOMAIN"))
            (token (getenv "CERTBOT_TOKEN")))
        (format #t "Hey, can you authenticate ~a with ~a for me?"
                domain token))))

(define %cleanup-hook
  (program-file "authentication-hook"
    #~(display "Bye")))

(service certbot-service-type
         (certbot-configuration
          (server "https://acme-staging-v02.api.letsencrypt.org/directory")
          (certificates
           (list
            (certificate-configuration
              (dry-run? #t)
              (authentication-hook %authentication-hook)
              (cleanup-hook %cleanup-hook)
              (domains '("example.net" "www.example.net")))))))
@end lisp

@item @code{start-self-signed?} (default: @code{#t})
Whether to generate an initial self-signed certificate during system
activation.  This option is particularly useful to allow @code{nginx} to
start before @code{certbot} has run, because @code{certbot} relies on
@code{nginx} running to perform HTTP challenges.

@end table
@end deftp

Para cada configuración @code{certificate-configuration}, el certificado se
almacena @code{/etc/certs/@var{name}/fullchain.pem} y la clave se almacena
en @code{/etc/certs/@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

@defvar 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 defvar

@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

@defvar knot-resolver-service-type
This is the type of the knot resolver service, whose value should be a
@code{knot-resolver-configuration} object as in this example:

@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

For more information, refer its
@url{https://knot-resolver.readthedocs.io/en/stable/config-overview.html,
manual}.
@end defvar

@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

@defvar dnsmasq-service-type
This is the type of the dnsmasq service, whose value should be a
@code{dnsmasq-configuration} object as in this example:

@lisp
(service dnsmasq-service-type
         (dnsmasq-configuration
           (no-resolv? #t)
           (servers '("192.168.1.1"))))
@end lisp

@code{dnsmasq-service-type} provides two actions:

@table @code
@item reload
Send a @code{SIGHUP} signal to @command{dnsmasq} to clear cache and reload
hosts files which triggers the following actions:

@itemize @bullet
@item
Clear the DNS cache
@item
Reload @file{/etc/hosts} and @file{/etc/ethers}
@item
Reload files specified by @option{--dhcp-hostsfile},
@option{--dhcp-hostsdir}, @option{--dhcp-optsfile}, @option{--dhcp-optsdir},
@option{--addn-hosts}, or @option{--hostsdir}
@item
Execute DHCP lease change scripts for all existing leases
@item
Reread @file{/etc/resolv.conf} (only if @option{--no-poll} is configured).
@end itemize

@quotation Nota
The @code{SIGHUP} signal does not trigger a reload of the main configuration
file.
@end quotation

Example usage:
@example
herd reload dnsmasq
@end example

@item stats
When @command{dnsmasq} receives a @code{SIGUSR1} signal, it writes
statistics to the system log including:

@itemize @bullet
@item
Cache size and number of evicted entries
@item
Cache hits, misses, and authoritative queries answered
@item
For each upstream server: queries sent and errors received
@item
TCP connection fork statistics.
@end itemize

Example usage:
@example
herd stats dnsmasq
@end example
@end table

@end defvar

@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{shepherd-provision} (default: @code{'(dnsmasq)})
@itemx @code{shepherd-requirement} (default: @code{'(user-processes networking)})
This option can be used to provide a list of Shepherd service names
(symbols) provided by this service.  You might want to change the default
value if you intend to run several @command{dnsmasq} instances.

Likewise, @code{shepherd-requirement} is a list of Shepherd service names
(symbols) that this service will depend on.

@item @code{pid-file} (default: @code{"/run/dnsmasq.pid"})
Specify an alternate path for dnsmasq to record its process-id in.

@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{servers-file} (default: @code{#f})
Specify file containing upstream servers. This file is re-read when dnsmasq
receives SIGHUP.  Could be either a string or a file-like object.

@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.

@item @code{conf-file} (default: @code{'()})
File names of configuration files to use.  Strings and file-like objects are
accepted.

@item @code{conf-dir} (default: @code{#f})
Read all the files in the given directory as configuration files.  Support
for @command{dnsmasq} field extensions is not implemented; users can use
@code{computed-file} to build a directory of files instead.  The
configuration files are loaded in alphabetical order of file name.

@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{dnsmasq}
como una lista de cadenas.

@end table
@end deftp

@subsubheading Unbound Service

@defvar unbound-service-type
This is the type of the service to run @uref{https://www.unbound.net,
Unbound}, a validating, recursive, and caching DNS resolver.  Its value must
be a @code{unbound-configuration} object as in this example:

@lisp
(service unbound-service-type
         (unbound-configuration
          (forward-zone
           (list
            (unbound-zone
             (name ".")
             (forward-addr '("149.112.112.112#dns.quad9.net"
                             "2620:fe::9#dns.quad9.net"))
             (forward-tls-upstream #t))))))
@end lisp
@end defvar

@deftp {Data Type} unbound-configuration
Available @code{unbound-configuration} fields are:

@table @asis
@item @code{server} (type: unbound-server)
General options for the Unbound server.

@item @code{remote-control} (type: unbound-remote)
Remote control options for the daemon.

@item @code{forward-zone} (default: @code{()}) (type: list-of-unbound-zone)
A zone for which queries should be forwarded to another resolver.

@item @code{extra-content} (type: maybe-string)
Raw content to add to the configuration file.

@end table
@end deftp

@deftp {Data Type} unbound-server
Available @code{unbound-server} fields are:

@table @asis
@item @code{interface} (type: maybe-list-of-strings)
Interfaces listened on for queries from clients.

@item @code{hide-version} (type: maybe-boolean)
Refuse the version.server and version.bind queries.

@item @code{hide-identity} (type: maybe-boolean)
Refuse the id.server and hostname.bind queries.

@item @code{tls-cert-bundle} (type: maybe-string)
Certificate bundle file, used for DNS over TLS.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@deftp {Data Type} unbound-remote
Available @code{unbound-remote} fields are:

@table @asis
@item @code{control-enable} (type: maybe-boolean)
Enable remote control.

@item @code{control-interface} (type: maybe-string)
IP address or local socket path to listen on for remote control.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@deftp {Data Type} unbound-zone
Available @code{unbound-zone} fields are:

@table @asis
@item @code{name} (type: string)
Zone name.

@item @code{forward-addr} (type: maybe-list-of-strings)
IP address of server to forward to.

@item @code{forward-tls-upstream} (type: maybe-boolean)
Whether the queries to this forwarder use TLS for transport.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@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 xvnc-service-type

The @code{xvnc-service-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 @var{your-host} -- 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 and login 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

@defvar 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 defvar

@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@.  Both
@code{openvpn-client-service-type} and @code{openvpn-server-service-type}
can be run simultaneously.

@defvar openvpn-client-service-type
Type of the service that runs @command{openvpn}, a VPN daemon, as a client.

The value for this service is a @code{<openvpn-client-configuration>}
object.
@end defvar

@defvar openvpn-server-service-type
Type of the service that runs @command{openvpn}, a VPN daemon, as a server.

The value for this service is a @code{<openvpn-server-configuration>}
object.
@end defvar

@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.

@defvar 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 defvar

@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

@defvar 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 defvar

@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")})
List of strings or G-expressions which represent 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{'())})
List of strings or G-expressions which represent the DNS server(s) to
announce to VPN clients via DHCP.

@item @code{monitor-ips?} (default: @code{#f})
@cindex Dynamic IP, with Wireguard
@cindex dyndns, usage with Wireguard
Whether to monitor the resolved Internet addresses (IPs) of the endpoints of
the configured peers, resetting the peer endpoints using an IP address that
no longer correspond to their freshly resolved host name.  Set this to
@code{#t} if one or more endpoints use host names provided by a dynamic DNS
service to keep the sessions alive.

@item @code{monitor-ips-interval} (default: @code{"*/5 * * * *"})
This is the monitoring schedule, expressed as a string in traditional cron
syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@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.  If this field is @code{#f}, a private key is not
automatically created and the path is not serialized to the configuration
file.

@item @code{bootstrap-private-key?} (default: @code{#t})
Whether or not the private key should be generated automatically if it does
not exist.

Setting this to @code{#f} allows one to set the private key using command
substitution.  One example shown in the @code{wg-quick(8)} manual is
retrieving a private key using @code{password-store}.  This can be achieved
with the following code:

@lisp
(wireguard-configuration
 (private-key
  #~(string-append "<("
                   #$(file-append password-store "/bin/pass")
                   ;; Wireguard replaces %i with the interface name.
                   " WireGuard/private-keys/%i)")))
@end lisp


@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{'()})
List of strings or G-expressions.  These are script snippets which will be
executed before setting up the interface.

@item @code{post-up} (default: @code{'()})
List of strings or G-expressions.  These are script snippets which will be
executed after setting up the interface.

@item @code{pre-down} (default: @code{'()})
List of strings or G-expressions.  These are script snippets which will be
executed before tearing down the interface.

@item @code{post-down} (default: @code{'()})
List of strings or G-expressions.  These are script snippets which will be
executed after tearing down the interface.

@item @code{shepherd-requirement} (default: @code{'()}) (type: list-of-symbols)
A list of symbols naming Shepherd services that this service will depend on.

@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.

@item @code{auto-start?} (default: @code{#t"})
Whether the Wireguard network should be started automatically by the
Shepherd.  If it is @code{#f} the service has to be started manually with
@code{herd start wireguard-$interface} (for example: @code{herd start
wireguard-wg0}).

@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{preshared-key} (default: @code{#f})
An optional pre-shared key file for this peer that can be either a string or
a G-expression.  The given file will not be autogenerated.

@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.

@defvar nfs-service-type
Este es el tipo de datos para un servidor NFS completo.
@end defvar

@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.

@defvar rpcbind-service-type
Un tipo de servicio para el daemon de asignación de puertos RPC.
@end defvar


@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.

@defvar pipefs-service-type
Un tipo de servicio para el pseudo-sistema de archivos pipefs.
@end defvar

@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}).

@defvar gss-service-type
Un tipo de servicio para el daemon del sistema de seguridad global (GSS).
@end defvar

@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.

@defvar idmap-service-type
Un tipo de servicio para el daemon de asociación de identidades (IDMAP).
@end defvar

@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



@subsubheading Autofs Service
@cindex autofs
@cindex automount

The autofs service automatically mounts and unmounts filesystems.  It can
mount both network and local storage, but is most often used to manage NFS
mounts.

A typical configuration might look like:

@lisp
(operating-system
  (services
   (append
    (list
     (service nfs-service-type (nfs-configuration))
     (service autofs-service-type
              (autofs-configuration
               (mounts
                (list
                 (autofs-indirect-map
                  (mount-point "/net/home")
                  (entries
                   (list
                    ;; Accessing /net/home/foo will mount
                    ;; big.network.server:/home/foo.
                    (autofs-map-entry
                     (type "nfs")
                     (device "big.network.server:/home/&")
                     (mount-point "*"))))))))))
    %base-services)))
@end lisp

@deftp {Data Type} autofs-indirect-map
Available @code{autofs-indirect-map} fields are:

@table @asis
@item @code{mount-point} (type: string)
Where to mount the indirect map.

@item @code{entries} (default: @code{()}) (type: autofs-map-entries)
Entries in this map.

@end table
@end deftp

@deftp {Data Type} autofs-map-entry
Available @code{autofs-map-entry} fields are:

@table @asis
@item @code{type} (default: @code{"auto"}) (type: string)
The type of the filesystem.

@item @code{device} (type: string)
Device or remote host to mount.  May contain special character @code{&},
which can be referenced in the @var{mount-point} field.

@item @code{mount-point} (type: string)
Directory to mount this device on.  Map entries come in two flavors: direct
and indirect.  Direct entries map a single device to a single mountpoint,
while indirect entries can map multiple devices to multiple mountpoints.  A
direct entry has a @var{mount-point} beginning with @code{/}, representing
the absolute path of the directory to mount the device on.  For example:

@lisp
(autofs-map-entry
 (type "ext4")
 (device "/dev/sdb1")
 (mount-point "/mnt/external-disk"))
@end lisp

An indirect entry has a @var{mount-point} not beginning with @code{/},
representing the subdirectory within the parent indirect map for this
entry.  Indirect maps may also use the special character @code{*}, which
will be replaced with the value of special character @code{&} in the
@var{device} field of this entry.  For example:

@lisp
(autofs-indirect-map
 (mount-point "/devices")
 (entries
  (list
   ;; Automount any block device r/o by ID.
   (autofs-map-entry
    (type "auto")
    (mount-point "ro/uuid/*")
    (device "/dev/disk/by-id/&")
    (options '(ro)))
   ;; Automount any block device by UUID.
   (autofs-map-entry
    (type "auto")
    (mount-point "rw/uuid/*")
    (device "/dev/disk/by-uuid/&")))))
@end lisp

@item @code{options} (default: @code{()}) (type: file-system-options)
List of mount options.  Some options are simple flags, such as ro, noexec,
nosuid, etc.  These may be expressed as strings or symbols.  Other options
also accept a value.  These are expressed as pairs of @code{(option .
value)}.  @code{option} may be a string or symbol, as with flags.
@code{value} may be a string, symbol, or number.  Example: @code{(ro (errors
.  remount-ro) noexec)}

@end table
@end deftp

@deftp {Data Type} autofs-configuration
Available @code{autofs-configuration} fields are:

@table @asis
@item @code{autofs} (default: @code{autofs}) (type: package)
The autofs package to use.

@item @code{mounts} (default: @code{()}) (type: autofs-mount-maps)
Mount maps to manage.  This is a list of either direct map entries or
indirect mount maps.

@item @code{timeout} (default: @code{300}) (type: conf-integer)
Sets the default mount timeout in seconds.

@item @code{master-wait} (default: @code{10}) (type: conf-integer)
Sets the default maximum number of retries (actual iterations is half this,
each is delayed by 2 seconds before retrying) waiting for the master map to
become available if it cannot be read at program start.  This can be longer
if the map source itself waits for availability (such as sss).

@item @code{negative-timeout} (default: @code{60}) (type: conf-integer)
Set the default timeout for caching failed key lookups.

@item @code{mount-verbose?} (default: @code{#f}) (type: conf-boolean)
Use the verbose flag when spawning mount(8), and log some process info about
the requestor and its parent.

@item @code{mount-wait} (default: @code{-1}) (type: conf-integer)
Set the default time to wait for a response from a spawned mount(8)  before
sending it a SIGTERM.  Note that we still need to wait for the RPC layer to
timeout before the sub-process exits so this isn't ideal but it is the best
we can do.  The default is to wait until mount(8)  returns without
intervention.

@item @code{umount-wait} (default: @code{12}) (type: conf-integer)
Set the default time to wait for a response from a spawned umount(8)  before
sending it a SIGTERM.  Note that we still need to wait for the RPC layer to
timeout before the sub-process exits so this isn't ideal but it is the best
we can do.

@item @code{browse-mode?} (default: @code{#t}) (type: conf-boolean)
Should maps be browsable by default?

@item @code{mount-nfs-default-protocol} (default: @code{3}) (type: conf-integer)
Set the default protocol that mount.nfs(8) uses when performing a mount.
Autofs needs to know the default NFS protocol that mount.nfs(8) uses so it
can do special case handling for its availability probe for different NFS
protocols.  Since we can't identify this default automatically we need to
set it in the autofs configuration.

@item @code{append-options?} (default: @code{#t}) (type: conf-boolean)
When #t, global options are appended to map entry options.  When #f, map
entry options replace the global options.

@item @code{logging} (type: conf-log-level)
Default log level.  May be #:none, #:verbose, or #:debug.

@item @code{force-standard-program-map-env?} (default: @code{#f}) (type: conf-boolean)
Override the use of a prefix with standard environment variables when a
program map is executed.  Since program maps are run as the privileged user
setting these standard environment variables opens automount(8) to potential
user privilege escalation when the program map is written in a language that
can load components from, for example, a user home directory.

@item @code{map-hash-table-size} (default: @code{1024}) (type: conf-integer)
This configuration option may be used to change the number of hash table
slots.  This configuration option affects the overhead of searching the map
entry cache for map entries when there are a large number of entries.  It
affects the number of entries that must be looked at to locate a map entry
in the map entry cache.  For example, the default of 1024 and a direct map
with 8000 entries would result in each slot containing an average of 8
entries, which should be acceptable.  However, if excessive CPU usage is
observed during automount lookups increasing this option can reduce the CPU
overhead considerably because it reduces the length of the search chains.
Note that the number of entries in a map doesn't necessarily relate to the
number of entries used in the map entry cache.  There are two distinct cases
where the map hash table can make a significant difference, direct maps and
indirect maps that use the "browse" option.  For indirect maps that do not
use the "browse" option entries are added to the map entry cache at lookup
so the number of active cache entries, in this case, is usually much less
than the number of entries in the map.  In this last case it would be
unusual for the map entry cache to grow large enough to warrant increasing
the default before an event that cleans stale entries, a map re-read for
example.

@item @code{use-hostname-for-mounts?} (default: @code{#f}) (type: conf-boolean)
NFS mounts where the host name resolves to more than one IP address are
probed for availability and to establish the order in which mounts to them
should be tried.  To ensure that mount attempts are made only to hosts that
are responding and are tried in the order of hosts with the quickest
response the IP address of the host needs to be used for the mount.  If it
is necessary to use the hostname given in the map entry for the mount
regardless, then set this option to #t.  Be aware that if this is done there
is no defense against the host name resolving to one that isn't responding
and while the number of attempts at a successful mount will correspond to
the number of addresses the host name resolves to the order will also not
correspond to fastest responding hosts.

@item @code{disable-not-found-message?} (default: @code{#f}) (type: conf-boolean)
The original request to add this log message needed it to be unconditional.
That produces, IMHO, unnecessary noise in the log so a configuration option
has been added to provide the ability to turn it off.

@item @code{use-ignore-mount-option?} (default: @code{#f}) (type: conf-boolean)
An option to enable the use of autofs pseudo option "disable".  This option
is used as a hint to user space that the mount entry should be omitted from
mount table listings.  The default is #f to avoid unexpected changes in
behaviour and so is an opt-in setting.

@item @code{sss-master-map-wait} (default: @code{0}) (type: conf-integer)
Set the time to wait and retry if sssd is unable to read the master map at
program start.  Default is 0 (don't wait) or 10 if sss supports returning
EHSTDOWN when the provider isn't available.  If the sss library upports
returning EHOSTDOWN when the provider is down then this value is how long to
wait between re‐ tries reading the master map.  When reading dependent maps
or looking up a map key this value is multiplied by the number of retries
that would be used when reading the master map.

@item @code{use-mount-request-log-id?} (default: @code{#f}) (type: conf-boolean)
Set whether to use a mount request log id so that log entries for specific
mount requests can be easily identified in logs that have multiple
concurrent requests.

@end table

@end deftp


@c %end of fragment



@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 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 Daemon de descubrimiento de servicios Web

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.

@defvar 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 defvar

@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} 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} (default: @code{300})
Number of seconds between the poll of the repositories followed by the
Cuirass jobs, by default.

Note that individual jobset specifications may override this in their
@code{period} field; the value specified here is only used for
specifications that use the default @code{period} value, which is zero.

@item @code{parallel-evaluations} (default: @code{#f})
Maximum number of jobset evaluations that may run concurrently.  If
@code{#f}, that number is determined based on a number of CPU cores, with an
upper bound of 8.

@item @code{ttl} (default: @code{2592000})
Duration to keep build results' GC roots alive, in seconds.

@item @code{evaluation-ttl} (default: 24 months)
Number of seconds after which an evaluation may be deleted from the
database.

@item @code{build-expiry} (default: 4 months)
Duration in seconds after which pending builds are canceled.  This helps
ensure that the backlog does not grow indefinitely.

@item @code{threads} (default: @code{#f})
@itemx @code{web-threads} (default: @code{#f})
Number of kernel threads to use for Cuirass (main process) and for the web
interface (the @command{cuirass web} program).  The default value should be
appropriate for most cases.

@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{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{'()})
Extra options to pass when running the @code{cuirass register} process.

@item @code{web-extra-options} (default: @code{'()})
Extra options to pass when running the @code{cuirass web} process.

@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{log-expiry} (default: 6 months)
The duration in seconds after which build logs collected by @command{cuirass
remote-worker} may be deleted.

@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.

@defvar 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 defvar

@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{supplementary-groups} (default: @code{()})
Supplementary groups for the Laminar user account.

@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

@subsubheading Forgejo Runner

@cindex continuous integration, Forgejo
@cindex Forgejo, continuous integration
The @code{(gnu services ci)} also provides a service for
@uref{https://code.forgejo.org/forgejo/runner, Forgejo Runner}, a daemon
that connects to an instance of the @uref{https://forgejo.org, Forgejo code
collaboration tool} and runs jobs for continuous integration.

A minimal configuration mostly with default values that can be added to the
@code{services} field of your operating system looks like this:

@lisp
(service forgejo-runner-service-type
         (forgejo-runner-configuration
          (name "my-runner")
          (labels '("guix" "linux"))))
@end lisp

This provides a @code{forgejo-runner} Shepherd service.  That service will
initially fail to start; you will have to manually @dfn{register} the runner
against the Forgejo server by running a command like:

@example
herd register forgejo-runner @var{url} @var{token}
@end example

@noindent
... where the arguments are as follows:

@table @var
@item url
the URL of the Forgejo server---e.g., @indicateurl{https://codeberg.org};
@item token
an access token
@uref{https://forgejo.org/docs/latest/admin/runner-installation/#standard-registration,
provided by the Forgejo server}.
@end table

Once registration has succeeded, you can start the runner:

@example
herd enable forgejo-runner
herd start forgejo-runner
@end example

The runner then receives orders from the Forgejo server to execute
@dfn{actions}.  Actions are commands and workflows specified by YAML files
in the @file{.forgejo/workflows} directory of source code repositories---see
@uref{https://forgejo.org/docs/v7.0/user/actions/, the Forgejo Action
documentation} for more info.

Note that at the moment @code{forgejo-runner-service-type} lets you run only
one runner.  Details about the configuration of this service follow.

@defvar forgejo-runner-service-type
This is the service type for Forgejo Runner.  Its value must be a
@code{forgejo-runner-configuration} record, documented below.
@end defvar

@deftp {Data Type} forgejo-runner-configuration
This data type represents the configuration of an instance of
@code{forgejo-runner-service-type}.  It contains the following fields:

@table @asis
@item @code{package} (default: @code{forgejo-runner})
The Forgejo Runner package to use.

@item @code{name} (default: @code{#~(gethostname)})
Name of the runner as will be shown in the runner management interface of
Forgejo.

@item @code{labels} (default: @code{'("guix")})
List of
@uref{https://forgejo.org/docs/latest/admin/actions/#choosing-labels,
labels} representing the type of environment the runner provides and that
actions may refer to.

@item @code{capacity} (default: @code{1})
Number of tasks to be executed concurrently.

@item @code{timeout} (default: @code{(* 3 3600)})
Maximum duration of a job, in seconds.

@item @code{fetch-timeout} (default: @code{5})
Maximum duration for fetching the job from the Forgejo server, in seconds.

@item @code{fetch-interval} (default: @code{2})
Interval (in seconds) for fetching the job from the Forgejo server.

@item @code{report-interval} (default: @code{1})
Interval (in seconds) for reporting the job status and log to the Forgejo
server.

@item @code{data-directory} (default: @code{"/var/lib/forgejo-runner"})
Directory where @command{forgejo-runner} will store persistent data such as
its configuration and access token.

@item @code{run-directory} (default: @code{"/var/run/forgejo-runner"})
Directory where @command{forgejo-runner} stores cached data.

@item @code{log-file} (default: @code{"/var/log/forgejo-runner.log"})
Name of the @command{forgejo-runner} log file.

@end table
@end deftp

@node Servicios de gestión de energía
@subsection Servicios de gestión de energía

@cindex power-profiles-daemon
@subsubheading Power Profiles Daemon

The @code{(gnu services pm)} module provides a Guix service definition for
the Linux Power Profiles Daemon, which makes power profiles handling
available over D-Bus.

The available profiles consist of the default @samp{balanced} mode, a
@samp{power-saver} mode and on supported systems a @samp{performance} mode.

@quotation Importante
The @code{power-profiles-daemon} conflicts with other power management tools
like @code{tlp}. Using both together is not recommended.
@end quotation

@defvar power-profiles-daemon-service-type
This is the service type for the
@uref{https://gitlab.freedesktop.org/upower/power-profiles-daemon/, Power
Profiles Daemon}.  The value for this service is a
@code{power-profiles-daemon-configuration}.

To enable the Power Profiles Daemon with default configuration add this line
to your services:

@lisp
(service power-profiles-daemon-service-type)
@end lisp
@end defvar

@deftp {Data Type} power-profiles-daemon-configuration
Data type representing the configuration of
@code{power-profiles-daemon-service-type}.

@table @asis
@item @code{power-profiles-daemon} (default: @code{power-profiles-daemon}) (type: file-like)
Package object of power-profiles-daemon.

@end table
@end deftp


@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}.

@defvar 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 defvar

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

@deftypevr {@code{tlp-configuration} parameter} string cpu-energy-perf-policy-on-ac
Set CPU energy/performance policy when on AC mode.  Possible values, in
order of increasing power saving, are performance, balance_performance,
default, balance_power and power.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} string cpu-energy-perf-policy-on-bat
Set CPU energy/performance policy when on BAT mode.  Possible values, in
order of increasing power saving, are performance, balance_performance,
default, balance_power and power.

@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.

@defvar 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 defvar

@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.

@cindex PowerTOP
@cindex power consumption tuning with PowerTOP
@subsubheading PowerTOP

The @code{(gnu services pm)} module also provides a service definition for
@uref{https://01.org/powertop/, PowerTOP}, a power consumption analysis and
tuning tool.  When started, it tunes Linux kernel settings to reduce power
consumption.

@defvar powertop-service-type
The service type for PowerTOP.  No configuration is necessary.  When the
service starts, it executes @code{powertop --auto-tune}.

@lisp
(service powertop-service-type)
@end lisp
@end defvar

Available @code{powertop-configuration} fields are:

@deftypevr {@code{powertop-configuration} parameter} package powertop
The PowerTOP package.  Defaults to @code{powertop} in the @code{(gnu
packages linux)} module

@end deftypevr

@end table
@end deftp

The @code{(gnu services power)} module provides a service definition for
@uref{http://www.apcupsd.org/, apcupsd}, a utility to interact with
@acronym{APC, APC by Schneider Electric or formerly American Power
Conversion Corporation} @acronym{UPS, Uninterruptible Power Supply}
devices.  Apcupsd also works with some @acronym{OEM, Original Equipment
Manufacturer}-branded products manufactured by APC.

@defvar apcupsd-service-type
The service type for apcupsd.  For USB UPSes no configuration is necessary,
however tweaking some fields to better suit your needs might be desirable.
The defaults are taken from the upstream configuration and they are not very
conservative (for example, the default @code{battery-level} of 5% may be
considered too low by some).

The default event handlers do send emails, read more in
@ref{apcupsd-event-handlers}.

@lisp
(service apcupsd-service-type)
@end lisp
@end defvar

@deftp {Data Type} apcupsd-configuration

Available @code{apcupsd-configuration} fields are:

@table @asis
@item @code{apcupsd} (default: @code{apcupsd}) (type: package)
The @code{apcupsd} package to use.

@item @code{shepherd-service-name} (default: @code{apcupsd}) (type: symbol)
The name of the shepherd service.  You can add the service multiple times
with different names to manage multiple UPSes.

@item @code{auto-start?} (default: @code{#t}) (type: boolean)
Should the shepherd service auto-start?

@item @code{pid-file} (default: @code{"/var/run/apcupsd.pid"}) (type: string)
The file name of the pid file.

@item @code{debug-level} (default: @code{0}) (type: integer)
The logging verbosity.  Bigger number means more logs.  The source code uses
up to @code{300} as debug level value, so a value of @code{999} seems
reasonable to enable all the logs.

@item @code{run-dir} (default: @code{"/var/run/apcupsd"}) (type: string)
The directory containing runtime information.  You need to change this if
you desire to run multiple instances of the daemon.

@item @code{name} (type: maybe-string)
Use this to give your UPS a name in log files and such.  This is
particularly useful if you have multiple UPSes.  This does not set the
EEPROM.  It should be 8 characters or less.

@item @code{cable} (default: @code{usb}) (type: enum-cable)
The type of a cable connecting the UPS to your computer.  Possible generic
choices are @code{'simple}, @code{'smart}, @code{'ether} and @code{'usb}.

Alternatively, a specific cable model number may be used: @code{'940-0119A},
@code{'940-0127A}, @code{'940-0128A}, @code{'940-0020B}, @code{'940-0020C},
@code{'940-0023A}, @code{'940-0024B}, @code{'940-0024C}, @code{'940-1524C},
@code{'940-0024G}, @code{'940-0095A}, @code{'940-0095B}, @code{'940-0095C},
@code{'940-0625A}, @code{'M-04-02-2000}.

@item @code{type} (default: @code{usb}) (type: enum-type)
The type of the UPS you have.

@table @code
@item apcsmart
Newer serial character device, appropriate for SmartUPS models using a
serial cable (not an USB).

@item usb
Most new UPSes are an USB.

@item net
Network link to a master apcupsd through apcupsd's Network Information
Server.  This is used if the UPS powering your computer is connected to a
different computer for monitoring.

@item snmp
SNMP network link to an SNMP-enabled UPS device.

@item netsnmp
Same as the SNMP above but requires use of the net-snmp library.  Unless you
have a specific need for this old driver, you should use the @code{'snmp}
instead.

@item dumb
An old serial character device for use with simple-signaling UPSes.

@item pcnet
A PowerChute Network Shutdown protocol which can be used as an alternative
to an SNMP with the AP9617 family of smart slot cards.

@item modbus
A serial device for use with newest SmartUPS models supporting the MODBUS
protocol.

@end table

@item @code{device} (default: @code{""}) (type: string)
For USB UPSes, usually you want to set this to an empty string (the
default).  For other UPS types, you must specify an appropriate port or
address.

@table @code
@item apcsmart
Set to the appropriate @file{/dev/tty**} device.

@item usb
A null string setting enables auto-detection, which is the best choice for
most installations.

@item net
Set to @code{@var{hostname}:@var{port}}.

@item snmp
Set to @code{@var{hostname}:@var{port}:@var{vendor}:@var{community}}.  The
@var{hostname} is the ip address or hostname of the UPS on the network.  The
@var{vendor} can be can be "APC" or "APC_NOTRAP".  "APC_NOTRAP" will disable
SNMP trap catching; you usually want "APC".  The @var{port} is usually 161.
The @var{community} is usually "private".

@item netsnmp
Same as the @code{'snmp}.

@item dumb
Set to the appropriate @file{/dev/tty**} device.

@item pcnet
Set to @code{@var{ipaddr}:@var{username}:@var{passphrase}:@var{port}}.  The
@var{ipaddr} is the IP address of the UPS management card.  The
@var{username} and the @var{passphrase} are the credentials for which the
card has been configured.  The @var{port} is the port number on which to
listen for messages from the UPS, normally 3052.  If this parameter is empty
or missing, the default of 3052 will be used.

@item modbus
Set to the appropriate @file{/dev/tty**} device.  You can also leave it
empty for MODBUS over USB or set to the serial number of the UPS.

@end table

@item @code{poll-time} (default: @code{60}) (type: integer)
The interval (in seconds) at which apcupsd polls the UPS for status.  This
setting applies both to directly-attached UPSes (apcsmart, usb, dumb) and
networked UPSes (net, snmp).  Lowering this setting will improve the
apcupsd's responsiveness to certain events at the cost of higher CPU
utilization.

@item @code{on-batery-delay} (default: @code{6}) (type: integer)
The time in seconds from when a power failure is detected until we react to
it with an onbattery event.  The @code{'powerout} event will be triggered
immediately when a power failure is detected.  However, the
@code{'onbattery} event will be trigger only after this delay.

@item @code{battery-level} (default: @code{5}) (type: integer)
If during a power failure, the remaining battery percentage (as reported by
the UPS) is below or equal to this value, the apcupsd will initiate a system
shutdown.

@quotation Nota
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{remaining-minutes} (default: @code{3}) (type: integer)
If during a power failure, the remaining runtime in minutes (as calculated
internally by the UPS) is below or equal to this value, apcupsd will
initiate a system shutdown.

@quotation Nota
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{timeout} (default: @code{0}) (type: integer)
If during a power failure, the UPS has run on batteries for this many
seconds or longer, apcupsd will initiate a system shutdown.  The value of 0
disables this timer.

@quotation Nota
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{annoy-interval} (default: @code{300}) (type: integer)
The time in seconds between annoying users (via the @code{'annoyme} event)
to sign off prior to system shutdown.  0 disables.

@item @code{annoy-delay} (default: @code{60}) (type: integer)
The initial delay in seconds after a power failure before warning users to
get off the system.

@item @code{no-logon} (default: @code{disable}) (type: enum-no-logon)
The condition which determines when users are prevented from logging in
during a power failure.

@item @code{kill-delay} (default: @code{0}) (type: integer)
If this is non-zero, the apcupsd will continue running after a shutdown has
been requested, and after the specified time in seconds attempt to kill the
power.  This is for use on systems where apcupsd cannot regain control after
a shutdown.

@item @code{net-server} (default: @code{#f}) (type: boolean)
If enabled, a network information server process will be started.

@item @code{net-server-ip} (default: @code{"127.0.0.1"}) (type: string)
An IP address on which the NIS server will listen for incoming connections.

@item @code{net-server-port} (default: @code{3551}) (type: integer)
An IP port on which the NIS server will listen for incoming connections.

@item @code{net-server-events-file} (type: maybe-string)
If you want the last few EVENTS to be available over the network by the
network information server, you must set this to a file name.

@item @code{net-server-events-file-max-size} (default: @code{10}) (type: integer)
The maximum size of the events file in kilobytes.

@item @code{class} (default: @code{standalone}) (type: enum-class)
Normally standalone unless you share an UPS using an APC ShareUPS card.

@item @code{mode} (default: @code{disable}) (type: enum-mode)
Normally disable unless you share an UPS using an APC ShareUPS card.

@item @code{stat-time} (default: @code{0}) (type: integer)
The time interval in seconds between writing the status file, 0 disables.

@item @code{log-stats} (default: @code{#f}) (type: boolean)
Also write the stats as a logs.  This generates a lot of output.

@item @code{data-time} (default: @code{0}) (type: integer)
The time interval in seconds between writing the data records to the log
file, 0 disables.

@item @code{facility} (type: maybe-string)
The logging facility for the syslog.

@item @code{event-handlers} (type: apcupsd-event-handlers)
Handlers for events produced by apcupsd.

@end table
@end deftp

@anchor{apcupsd-event-handlers}
@deftp {Data Type} apcupsd-event-handlers

For a description of the events please refer to @samp{man 8 apccontrol}.

Each handler shall be a gexp.  It is spliced into the control script for the
daemon.  In addition to the standard Guile programming environment, the
following procedures and variables are also available:

@table @code
@item conf
Variable containing the file name of the configuration file.

@item powerfail-file
Variable containing the file name of the powerfail file.

@item cmd
The event currently being handled.

@item name
The name of the UPS as specified in the configuration file.

@item connected?
Is @code{#t} if @command{apcupsd} is connected to the UPS via a serial port
(or a USB port).  In most configurations, this will be the case.  In the
case of a Slave machine where apcupsd is not directly connected to the UPS,
this value will be @code{#f}.

@item powered?
Is @code{#t} if the computer on which @command{apcupsd} is running is
powered by the UPS and @code{#f} if not.  At the moment, this value is
unimplemented and always @code{#f}.

@item (err @var{fmt} @var{args...})
Wrapper around @code{format} outputting to @code{(current-error-port)}.

@item (wall @var{fmt} @var{args...})
Wrapper around @code{format} outputting via @command{wall}.

@item (apcupsd @var{args...})
Call @command{apcupsd} while passing the correct configuration file and all
the arguments.

@item (mail-to-root @var{subject} @var{body})
Send an email to the local administrator.  This procedure assumes the
@command{sendmail} is located at @command{/run/privileged/bin/sendmail} (as
would be the case with @code{opensmtpd-service-type}).

@end table

Available @code{apcupsd-event-handlers} fields are:

@table @asis
@item @code{modules} (type: gexp)
Additional modules to import into the generated handler script.

@item @code{killpower} (type: gexp)
The handler for the killpower event.

@item @code{commfailure} (type: gexp)
The handler for the commfailure event.

@item @code{commok} (type: gexp)
The handler for the commfailure event.

@item @code{powerout} (type: gexp)
The handler for the powerout event.

@item @code{onbattery} (type: gexp)
The handler for the onbattery event.

@item @code{offbattery} (type: gexp)
The handler for the offbattery event.

@item @code{mainsback} (type: gexp)
The handler for the mainsback event.

@item @code{failing} (type: gexp)
The handler for the failing event.

@item @code{timeout} (type: gexp)
The handler for the timeout event.

@item @code{loadlimit} (type: gexp)
The handler for the loadlimit event.

@item @code{runlimit} (type: gexp)
The handler for the runlimit event.

@item @code{doreboot} (type: gexp)
The handler for the doreboot event.

@item @code{doshutdown} (type: gexp)
The handler for the doshutdown event.

@item @code{annoyme} (type: gexp)
The handler for the annoyme event.

@item @code{emergency} (type: gexp)
The handler for the emergency event.

@item @code{changeme} (type: gexp)
The handler for the changeme event.

@item @code{remotedown} (type: gexp)
The handler for the remotedown event.

@item @code{startselftest} (type: gexp)
The handler for the startselftest event.

@item @code{endselftest} (type: gexp)
The handler for the endselftest event.

@item @code{battdetach} (type: gexp)
The handler for the battdetach event.

@item @code{battattach} (type: gexp)
The handler for the battattach event.

@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 Music Player Daemon

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.

The following example shows the simplest configuration to locally expose,
via PulseAudio, a music collection kept at @file{/srv/music}, with
@command{mpd} running as the default @samp{mpd} user.  This user will spawn
its own PulseAudio daemon, which may compete for the sound card access with
that of your own user.  In this configuration, you may have to stop the
playback of your user audio applications to hear MPD's output and
vice-versa.

@lisp
(service mpd-service-type
         (mpd-configuration
          (music-directory "/srv/music")))
@end lisp

@quotation Importante
The music directory must be readable to the MPD user, by default,
@samp{mpd}.  Permission problems will be reported via @samp{Permission
denied} errors in the MPD logs, which appear in @file{/var/log/messages} by
default.
@end quotation

Most MPD clients will trigger a database update upon connecting, but you can
also use the @code{update} action do to so:

@example
herd update mpd
@end example

All the MPD configuration fields are documented below, and a more complex
example follows.

@defvar mpd-service-type
El tipo de servicio para @command{mpd}.
@end defvar

@c %start of fragment
@deftp {Tipo de datos} mpd-configuration
Available @code{mpd-configuration} fields are:

@table @asis
@item @code{package} (default: @code{mpd}) (type: file-like)
The MPD package.

@item @code{user} (type: user-account)
Usuaria que ejecuta mpd.

@item @code{group} (type: user-group)
The group to run mpd as.

The default @code{%mpd-group} is a system group with name ``mpd''.

@item @code{shepherd-requirement} (default: @code{'()}) (type: list-of-symbols)
A list of symbols naming Shepherd services that this service will depend on.

@item @code{environment-variables} (default: @code{'("PULSE_CLIENTCONFIG=/etc/pulse/client.conf" "PULSE_CONFIG=/etc/pulse/daemon.conf")}) (type: list-of-strings)
A list of strings specifying environment variables.

@item @code{log-file} (type: maybe-string)
The location of the log file.  Unless specified, logs are sent to the local
syslog daemon.  Alternatively, a log file name can be specified, for example
@file{/var/log/mpd.log}.

@item @code{log-level} (type: maybe-string)
Suppress any messages below this threshold.  The available values, in
decreasing order of verbosity, are: @code{verbose}, @code{info},
@code{notice}, @code{warning} and @code{error}.

@item @code{music-directory} (type: maybe-string)
El directorio para buscar archivos de música.

@item @code{music-dir} (type: maybe-string)
El directorio para buscar archivos de música.

@item @code{playlist-directory} (type: maybe-string)
El directorio para almacenar listas de reproducción.

@item @code{playlist-dir} (type: maybe-string)
El directorio para almacenar listas de reproducción.

@item @code{db-file} (type: maybe-string)
The location of the music database.  When left unspecified,
@file{~/.cache/db} is used.

@item @code{state-file} (type: maybe-string)
La localización del archivo que almacena el estado actual de MPD.

@item @code{sticker-file} (type: maybe-string)
La localización de la base de datos de pegatinas.

@item @code{default-port} (default: @code{6600}) (type: maybe-port)
The default port to run mpd on.

@item @code{endpoints} (type: maybe-list-of-strings)
The addresses that mpd will bind to.  A port different from
@var{default-port} may be specified, e.g.  @code{localhost:6602} and IPv6
addresses must be enclosed in square brackets when a different port is
used.  To use a Unix domain socket, an absolute path or a path starting with
@code{~} can be specified here.

@item @code{address} (type: maybe-string)
Dirección a la que mpd se asociará. Para usar un socket de dominio de Unix
puede especificarse una ruta absoluta.

@item @code{database} (type: maybe-mpd-plugin)
MPD database plugin configuration.

@item @code{partitions} (default: @code{'()}) (type: list-of-mpd-partition)
List of MPD "partitions".

@item @code{neighbors} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD neighbor plugin configurations.

@item @code{inputs} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD input plugin configurations.

@item @code{archive-plugins} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD archive plugin configurations.

@item @code{auto-update?} (type: maybe-boolean)
Whether to automatically update the music database when files are changed in
the @var{music-directory}.

@item @code{input-cache-size} (type: maybe-string)
MPD input cache size.

@item @code{decoders} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD decoder plugin configurations.

@item @code{resampler} (type: maybe-mpd-plugin)
MPD resampler plugin configuration.

@item @code{filters} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD filter plugin configurations.

@item @code{outputs} (type: list-of-mpd-plugin-or-output)
Las salidas de audio que MPD puede usar. De manera predeterminada es una
salida de audio única usando pulseaudio.

@item @code{playlist-plugins} (default: @code{'()}) (type: list-of-mpd-plugin)
List of MPD playlist plugin configurations.

@item @code{extra-options} (default: @code{'()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the configuration.

@end table
@end deftp
@c %end of fragment

@deftp {Data Type} mpd-plugin
Data type representing a @command{mpd} plugin.

@table @asis
@item @code{plugin} (type: maybe-string)
Plugin name.

@item @code{name} (type: maybe-string)
Name.

@item @code{enabled?} (type: maybe-boolean)
Whether the plugin is enabled/disabled.

@item @code{extra-options} (default: @code{'()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the plugin configuration.  See
@uref{https://mpd.readthedocs.io/en/latest/plugins.html,MPD plugin
reference} for available options.

@end table
@end deftp

@deftp {Data Type} mpd-partition
Data type representing a @command{mpd} partition.

@table @asis
@item @code{name} (type: string)
Partition name.

@item @code{extra-options} (default: @code{'()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the partition configuration.  See
@uref{https://mpd.readthedocs.io/en/latest/user.html#configuring-partitions,Configuring
Partitions} for available options.

@end table
@end deftp

@c %start of fragment
@deftp {Tipo de datos} mpd-output
Available @code{mpd-output} fields are:

@table @asis
@item @code{name} (default: @code{"MPD"}) (type: string)
Nombre de la salida de audio.

@item @code{type} (default: @code{"pulse"}) (type: string)
Tipo de la salida de audio.

@item @code{enabled?} (default: @code{#t}) (type: boolean)
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{format} (type: maybe-string)
Force a specific audio format on output.  See
@uref{https://mpd.readthedocs.io/en/latest/user.html#audio-output-format,Global
Audio Format} for a more detailed description.

@item @code{tags?} (default: @code{#t}) (type: boolean)
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?} (default: @code{#f}) (type: boolean)
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} (type: maybe-string)
This field accepts a string that specifies which mixer should be used for
this audio output: the @code{hardware} mixer, the @code{software} mixer, the
@code{null} mixer (allows setting the volume, but with no effect; this can
be used as a trick to implement an external mixer External Mixer) or no
mixer (@code{none}).  When left unspecified, a @code{hardware} mixer is used
for devices that support it.

@item @code{replay-gain-handler} (type: maybe-string)
This field accepts a string that specifies how
@uref{https://mpd.readthedocs.io/en/latest/user.html#replay-gain,Replay
Gain} is to be applied.  @code{software} uses an internal software volume
control, @code{mixer} uses the configured (hardware) mixer control and
@code{none} disables replay gain on this audio output.

@item @code{extra-options} (default: @code{'()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the audio output configuration.

@end table
@end deftp
@c %end of fragment

The following example shows a configuration of @command{mpd} that configures
some of its plugins and provides a HTTP audio streaming output.

@lisp
(service mpd-service-type
         (mpd-configuration
           (outputs
             (list (mpd-output
                     (name "streaming")
                     (type "httpd")
                     (mixer-type 'null)
                     (extra-options
                      `((encoder . "vorbis")
                        (port    . "8080"))))))
           (decoders
             (list (mpd-plugin
                     (plugin "mikmod")
                     (enabled? #f))
                   (mpd-plugin
                     (plugin "openmpt")
                     (enabled? #t)
                     (extra-options `((repeat-count . -1)
                                      (interpolation-filter . 1))))))
           (resampler (mpd-plugin
                        (plugin "libsamplerate")
                        (extra-options `((type . 0)))))))
@end lisp

@subsubheading myMPD

@cindex MPD, web interface
@cindex myMPD service

@uref{https://jcorporation.github.io/myMPD/, myMPD} is a web server frontend
for MPD that provides a mobile friendly web client for MPD.

The following example shows a myMPD instance listening on port 80, with
album cover caching disabled.

@lisp
(service mympd-service-type
         (mympd-configuration
          (port 80)
          (covercache-ttl 0)))
@end lisp

@defvar mympd-service-type
The service type for @command{mympd}.
@end defvar

@c %start of fragment
@deftp {Data Type} mympd-configuration
Available @code{mympd-configuration} fields are:

@table @asis
@item @code{package} (default: @code{mympd}) (type: file-like)
The package object of the myMPD server.

@item @code{shepherd-requirement} (default: @code{'()}) (type: list-of-symbols)
This is a list of symbols naming Shepherd services that this service will
depend on.

@item @code{user} (default: @code{%mympd-user}) (type: user-account)
Owner of the @command{mympd} process.

The default @code{%mympd-user} is a system user with the name ``mympd'', who
is a part of the group @var{group} (see below).

@item @code{group} (default: @code{%mympd-group}) (type: user-group)
Owner group of the @command{mympd} process.

The default @code{%mympd-group} is a system group with name ``mympd''.
@item @code{work-directory} (default: @code{"/var/lib/mympd"}) (type: string)
Where myMPD will store its data.

@item @code{cache-directory} (default: @code{"/var/cache/mympd"}) (type: string)
Where myMPD will store its cache.

@item @code{acl} (type: maybe-mympd-ip-acl)
ACL to access the myMPD webserver.

@item @code{covercache-ttl} (default: @code{31}) (type: maybe-integer)
How long to keep cached covers, @code{0} disables cover caching.

@item @code{http?} (default: @code{#t}) (type: boolean)
HTTP support.

@item @code{host} (default: @code{"[::]"}) (type: string)
Host name to listen on.

@item @code{port} (default: @code{80}) (type: maybe-port)
HTTP port to listen on.

@item @code{log-level} (default: @code{5}) (type: integer)
How much detail to include in logs, possible values: @code{0} to @code{7}.

@item @code{log-to} (type: maybe-string)
Where to send logs.  Unless specified, the service logs to the local syslog
service under the @samp{daemon} facility.  Alternatively, a log file name
can be specified, for example @file{/var/log/mympd.log}.

@item @code{lualibs} (default: @code{"all"}) (type: maybe-string)
See
@uref{https://jcorporation.github.io/myMPD/scripting/#lua-standard-libraries}.

@item @code{uri} (type: maybe-string)
Override URI to myMPD.  See
@uref{https://github.com/jcorporation/myMPD/issues/950}.

@item @code{script-acl} (default: @code{(mympd-ip-acl (allow '("127.0.0.1")))}) (type: maybe-mympd-ip-acl)
ACL to access the myMPD script backend.

@item @code{ssl?} (default: @code{#f}) (type: boolean)
SSL/TLS support.

@item @code{ssl-port} (default: @code{443}) (type: maybe-port)
Port to listen for HTTPS.

@item @code{ssl-cert} (type: maybe-string)
Path to PEM encoded X.509 SSL/TLS certificate (public key).

@item @code{ssl-key} (type: maybe-string)
Path to PEM encoded SSL/TLS private key.

@item @code{pin-hash} (type: maybe-string)
SHA-256 hashed pin used by myMPD to control settings access by prompting a
pin from the user.

@item @code{save-caches?} (type: maybe-boolean)
Whether to preserve caches between service restarts.

@end table
@end deftp
@c %end of fragment

@c %start of fragment
@deftp {Data Type} mympd-ip-acl
Available @code{mympd-ip-acl} fields are:

@table @asis
@item @code{allow} (default: @code{'()}) (type: list-of-strings)
Allowed IP addresses.

@item @code{deny} (default: @code{'()}) (type: list-of-strings)
Disallowed IP addresses.

@end table
@end deftp
@c %end of fragment

@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.  To connect to
the libvirt daemon as an unprivileged user, it must be added to the
@samp{libvirt} group, as shown in the example below.

@defvar 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
(users (cons (user-account
              (name "user")
              (group "users")
              (supplementary-groups '("libvirt"
                                      "audio" "video" "wheel")))
             %base-user-accounts))
(service libvirt-service-type
         (libvirt-configuration
          (tls-port "16555")))
@end lisp
@end defvar

@c Auto-generated with (configuration->documentation 'libvirt-configuration)
@c %start of fragment

@deftp {Data Type} libvirt-configuration
Los campos disponibles de @code{libvirt-configuration} son:

@table @asis
@item @code{libvirt} (default: @code{libvirt}) (type: file-like)
Paquete libvirt.

@item @code{qemu} (default: @code{qemu}) (type: file-like)
El paquete QEMU usado.

@item @code{dmidecode} (default: @code{dmidecode}) (type: file-like)
The Dmidecode package to use.

@item @code{requirement} (default: @code{'()}) (type: list-of-symbols)
Shepherd services dependencies to the provisioned Shepherd service.

@item @code{firmwares} (default: @code{(ovmf-x86-64)}) (type: list-of-file-likes)
List of UEFI/BIOS firmware packages to make available.  Each firmware
package should contain a @file{share/qemu/firmware/@var{NAME}.json} QEMU
firmware metadata file.

@item @code{listen-tls?} (default: @code{#t}) (type: boolean)
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.

@item @code{listen-tcp?} (default: @code{#f}) (type: boolean)
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).

@item @code{tls-port} (default: @code{"16514"}) (type: string)
Puerto en el que se aceptan conexiones seguras. Puede ser un número de
puerto o un nombre de servicio.

@item @code{tcp-port} (default: @code{"16509"}) (type: string)
Puerto en el que se aceptan conexiones inseguras. Puede ser un número de
puerto o un nombre de servicio.

@item @code{listen-addr} (default: @code{"0.0.0.0"}) (type: string)
Dirección IP o nombre de máquina usado para las conexiones de clientes.

@item @code{mdns-adv?} (default: @code{#f}) (type: boolean)
Opción que determina el anuncio mDNS del servicio libvirt.

@item @code{mdns-name} (default: @code{"Virtualization Host terra"}) (type: string)
Nombre predeterminado del anuncio mDNS. Debe ser único en la red de
distribución inmediata.

@item @code{unix-sock-group} (default: @code{"libvirt"}) (type: string)
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.

@item @code{unix-sock-ro-perms} (default: @code{"0777"}) (type: string)
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.

@item @code{unix-sock-rw-perms} (default: @code{"0770"}) (type: string)
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, @code{"0777"}).

@item @code{unix-sock-admin-perms} (default: @code{"0777"}) (type: string)
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.

@item @code{unix-sock-dir} (default: @code{"/var/run/libvirt"}) (type: string)
Directorio en el que los sockets se encuentran/crean.

@item @code{auth-unix-ro} (default: @code{"polkit"}) (type: string)
Esquema de identificación para los sockets de solo-lectura de UNIX. Los
permisos predeterminados del socket permiten la conexión de cualquier
usuaria.

@item @code{auth-unix-rw} (default: @code{"polkit"}) (type: string)
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''.

@item @code{auth-tcp} (default: @code{"sasl"}) (type: string)
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.

@item @code{auth-tls} (default: @code{"none"}) (type: string)
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 @code{"sasl"} en esta
opción.

@item @code{access-drivers} (default: @code{()}) (type: optional-list)
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.

@item @code{key-file} (default: @code{""}) (type: string)
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ninguna clave privada.

@item @code{cert-file} (default: @code{""}) (type: string)
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ningún certificado.

@item @code{ca-file} (default: @code{""}) (type: string)
Ruta del archivo con la clave del servidor. Si se proporciona una cadena
vacía, no se carga ningún certificado de CA.

@item @code{crl-file} (default: @code{""}) (type: string)
Ruta de la lista de revocaciones de certificado. Si se proporciona una
cadena vacía, no se carga ninguna lista.

@item @code{tls-no-sanity-cert} (default: @code{#f}) (type: boolean)
Desactiva la verificación de los propios certificados del servidor. Cuando
@command{libvirtd} arranca, realiza algunas comprobaciones básicas sobre sus
propios certificados.

@item @code{tls-no-verify-cert} (default: @code{#f}) (type: boolean)
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).

@item @code{tls-allowed-dn-list} (default: @code{()}) (type: optional-list)
Lista de nombres distinguidos (DN) x509 permitidos.

@item @code{sasl-allowed-usernames} (default: @code{()}) (type: optional-list)
Lista de nombres de usuaria SASL permitidos. El formato para el nombre de la
usuaria depende del mecanismo de identificación SASL.

@item @code{tls-priority} (default: @code{"NORMAL"}) (type: string)
Cambia el valor de la cadena de prioridad de TLS predeterminada en tiempo de
compilación. El valor predeterminado habitualmente es "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.

@item @code{max-clients} (default: @code{5000}) (type: integer)
Número máximo de conexiones concurrentes de clientes permitidas en todos los
sockets combinados.

@item @code{max-queued-clients} (default: @code{1000}) (type: integer)
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.

@item @code{max-anonymous-clients} (default: @code{20}) (type: integer)
Longitud máxima de la cola de clientes aceptados pero no identificados
todavía. Proporcione el valor cero para desactivar esta característica.

@item @code{min-workers} (default: @code{5}) (type: integer)
Número de procesos de trabajo que se lanzarán inicialmente.

@item @code{max-workers} (default: @code{20}) (type: integer)
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.

@item @code{prio-workers} (default: @code{5}) (type: integer)
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.

@item @code{max-requests} (default: @code{20}) (type: integer)
Límite global total de llamadas RPC concurrentes.

@item @code{max-client-requests} (default: @code{5}) (type: integer)
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''.

@item @code{admin-min-workers} (default: @code{1}) (type: integer)
Igual que @code{min-workers} pero para la interfaz de administración.

@item @code{admin-max-workers} (default: @code{5}) (type: integer)
Igual que @code{max-workers} pero para la interfaz de administración.

@item @code{admin-max-clients} (default: @code{5}) (type: integer)
Igual que @code{max-clients} pero para la interfaz de administración.

@item @code{admin-max-queued-clients} (default: @code{5}) (type: integer)
Igual que @code{max-queued-clients} pero para la interfaz de administración.

@item @code{admin-max-client-requests} (default: @code{5}) (type: integer)
Igual que @code{max-client-requests} pero para la interfaz de
administración.

@item @code{log-level} (default: @code{3}) (type: integer)
Semi-deprecated option for the logging level: using the @code{log-filters}
option instead is recommend, as it provides finer control.  The log level
can be set to @code{4} for errors, @code{3} for warnings, @code{2} for
information or @code{1} for debug.  Note that since @code{log-filters} and
@code{log-outputs} take precedence over this option, you will need to also
adjust their logging levels to avoid filtering out messages.

@item @code{log-filters} (default: @code{"3:remote 4:event"}) (type: string)
Logging filters.  A filter allows selecting a different logging level for a
given category of logs.  The format for a filter is either
@samp{@var{x}:@var{name}} or @samp{@var{x}:+@var{name}}, where name is a
string which is matched against the category given in the
@code{VIR_LOG_INIT()} at the top of each libvirt source file, e.g.,
@samp{"remote"}, @samp{"qemu"}, or @samp{"util.json"}.  @var{name} can be a
substring of the full category name, in order to match multiple similar
categories.  The optional @samp{+} prefix tells libvirt to log stack traces
for each message matching @var{name}.  @var{x} is the log level value used
to filter the associated message category.  @var{x} can be set to @samp{4}
for errors, @samp{3} for warnings, @samp{2} for information, or @samp{1} for
debug.  Multiple filters can be defined in a single filters statement, as
space-separated values.  Since @code{log-outputs} also include a level
filter, you may need to also adjust its value to see all the filtered
messages.

@item @code{log-outputs} (default: @code{"3:syslog:libvirtd"}) (type: string)
Logging outputs.  An output is one of the places to save logging
information.  The format for an output has the form
@code{"@var{x}:var@{output@}"}, where @var{output} can be @samp{stderr},
@samp{syslog:@var{name}}, where @var{name} is the syslog @code{ident} value
to use, or @samp{file:@var{file_name}}, where @var{file_name} is the file
name of the file to output to.  @var{x} is the minimal level, which acts as
a filter.  @var{x} can be set to @var{x} can be set to @samp{4} for errors,
@samp{3} for warnings, @samp{2} for information, or @samp{1} for debug.
Multiple filters can be defined in a single filters statement, as
space-separated values.

@item @code{audit-level} (default: @code{1}) (type: integer)
Modify the behavior of the auditing subsystem.  @samp{0} disables all
auditing, samp@{1@} enables auditing only if enabled on thehost and @samp{2}
enables auditing but exits if it is disabled on the host.

@item @code{audit-logging} (default: @code{#f}) (type: boolean)
Envía los mensajes de auditoría a través de la infraestructura de registro
de libvirt.

@item @code{host-uuid} (default: @code{""}) (type: optional-string)
UUID de la máquina anfitriona. No pueden ser iguales todos los dígitos del
UUID.

@item @code{host-uuid-source} (default: @code{"smbios"}) (type: string)
Source to read host UUID.  Use @code{"smbios"} to fetch the UUID via
@code{dmidecode -s system-uuid}, or @code{"machine-id"} to fetch the UUID
from @code{/etc/machine-id}.  If @code{dmidecode} does not provide a valid
UUID a temporary UUID will be generated.

@item @code{keepalive-interval} (default: @code{5}) (type: integer)
A keepalive message is sent to a client after @code{keepalive_interval}
seconds of inactivity to check if the client is still responding.  If set to
@code{-1}, libvirtd won't send keepalive requests; however clients can still
send them and the daemon will send responses.

@item @code{keepalive-count} (default: @code{5}) (type: integer)
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
@samp{keepalive_interval * (keepalive_count + 1)} segundos tras la última
recepción de un mensaje desde el cliente. Cuando @code{keepalive_count}
tiene valor @code{0}, las conexiones se cerrarán automáticamente tras
@code{keepalive-interval} segundos de inactividad sin mandar ningún mensaje
``keepalive''.

@item @code{admin-keepalive-interval} (default: @code{5}) (type: integer)
Igual que la opción anterior pero para la interfaz de administración.

@item @code{admin-keepalive-count} (default: @code{5}) (type: integer)
Igual que la opción anterior pero para la interfaz de administración.

@item @code{ovs-timeout} (default: @code{5}) (type: integer)
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.

@end table

@end deftp


@c %end of fragment

@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.

@defvar 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 defvar

@deftypevr {@code{libvirt} parameter} package libvirt
Paquete libvirt.
@end deftypevr

@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.

@defvar 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 defvar

@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} lookup-qemu-platforms 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} qemu-platform? obj
Devuelve verdadero si @var{obj} es un objeto de plataforma.
@end deffn

@deffn {Procedimiento} qemu-platform-name 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.

@defvar qemu-guest-agent-service-type
Service type for the QEMU guest agent service.
@end defvar

@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 Xen Guest Agent

@cindex Xen
@cindex Xen guest agent

The Xen guest agent allows a Xen host to control the emulated system.  The
@code{xe-guest-utilities} service runs the agent on Guix guests.

@url{https://github.com/xenserver/xe-guest-utilities, xe-guest-utilities}
collects information about the running virtualized guest. This includes:
@itemize
@item
static information
@itemize
@item
The operating system running
@item
The Linux kernel version
@end itemize

@item
dynamic information
@itemize
@item
Network interfaces (devices) being added/removed
@item
Network connections being unplugged/plugged-in
@item
CPUs being added or removed
@item
The guest migrating, being paused/resumed, etc.
@end itemize

@item
ephemeral information
@itemize
@item
The amount of memory currently in-use and free
@item
The amount of disk-space used
@end itemize
@end itemize

@quotation Nota
The default Linux-libre kernel that Guix ships already enables the necessary
paravirtualization features for a guest.  There is nothing you need to do
for the guest to support Xen's paravirtualization features.

The guest utilities are used to have the guest report information
@emph{back} to the virtualizing host and support tasks that require
cooperation between host and guest, like CPU hotplugging.
@end quotation

@defvar xe-guest-utilities-service-type
Service type for the Xen guest utilities service.
@end defvar

@deftp {Data Type} xe-guest-utilities-configuration
Configuration for the @code{xe-guest-utilities} service.

@table @asis
@item @code{package} (default: @code{xe-guest-utilities})
The Xen guest utilities package to use.

@item @code{pid-file} (default: @code{"/var/run/xe-daemon.pid"})
Name of the file holding the PID of @code{xe-deamon}.

@item @code{log-file} (default: @code{"/var/log/xe-guest-utilities.log"})
Name of the @code{xe-guest-utilities} log file.
@end table
@end deftp

@code{xe-guest-utilities} is the standard guest utilities used for Xen
guests.  More recently the Xen Project has been working to develop
@code{xen-guest-agent}, a modern drop-in replacement for
@code{xe-guest-utilities}.  While they nearly have feature-parity,
@code{xen-guest-agent} currently lacks some of the features of its
predecessor, namely disk metrics and ``PV drivers version''.

@defvar xen-guest-agent-service-type
Service type for the Xen guest agent service.
@end defvar

@deftp {Data Type} xen-guest-agent-configuration
Configuration for the @code{xen-guest-agent} service.

@table @asis
@item @code{package} (default: @code{xen-guest-agent})
The Xen guest agent package to use.
@end table
@end deftp

@quotation Aviso
@code{xe-guest-utilities} and @code{xen-guest-agent} are mutually exclusive.
@end quotation


@anchor{build-vm}
@subsubheading Virtual Build Machines

@cindex virtual build machines
@cindex build VMs
@cindex VMs, for offloading
@dfn{Virtual build machines} or ``build VMs'' let you offload builds to a
fully controlled environment.  ``How can it be more controlled than regular
builds? And why would it be useful?'', you ask.  Good questions.

Builds spawned by @code{guix-daemon} indeed run in a controlled environment;
specifically the daemon spawns build processes in separate namespaces and in
a chroot, such as that build processes only see their declared dependencies
and a well-defined subset of the file system tree (@pxref{Configuración del entorno de construcción}, for details).  A few aspects of the environments are not controlled
though: the operating system kernel, the CPU model, and the date.  Most of
the time, these aspects have no impact on the build process: the level of
isolation @code{guix-daemon} provides is ``good enough''.

@cindex time traps
However, there are occasionally cases where those aspects @emph{do}
influence the build process.  A typical example is @dfn{time traps}: build
processes that stop working after a certain date@footnote{The most
widespread example of time traps is test suites that involve checking the
expiration date of a certificate.  Such tests exists in TLS implementations
such as OpenSSL and GnuTLS, but also in high-level software such as
Python.}.  Another one is software that optimizes for the CPU
microarchitecture it is built on or, worse, bugs that manifest only on
specific CPUs.

To address that, @code{virtual-build-machine-service-type} lets you add a
virtual build machine on your system, as in this example:

@lisp
(use-modules (gnu services virtualization))

(operating-system
  ;; @dots{}
  (services (append (list (service virtual-build-machine-service-type))
                    %base-services)))
@end lisp

By default, you have to explicitly start the build machine when you need it,
at which point builds may be offloaded to it (@pxref{Configuración de delegación del daemon}):

@example
herd start build-vm
@end example

With the default setting shown above, the build VM runs with its clock set
to a date several years in the past, and on a CPU model that corresponds to
that date---a model possibly older than that of your machine.  This lets you
rebuild today software from the past that would otherwise fail to build due
to a time trap or other issues in its build process.  You can view the VM's
config like this:

@example
herd configuration build-vm
@end example

You can configure the build VM, as in this example:

@lisp
(service virtual-build-machine-service-type
         (virtual-build-machine
          (cpu "Westmere")
          (cpu-count 8)
          (memory-size (* 1 1024))
          (auto-start? #t)))
@end lisp

The available options are shown below.

@defvar virtual-build-machine-service-type
This is the service type to run @dfn{virtual build machines}.  Virtual build
machines are configured so that builds are offloaded to them when they are
running.
@end defvar

@deftp {Data Type} virtual-build-machine
This is the data type specifying the configuration of a build machine.  It
contains the fields below:

@table @asis
@item @code{name} (default: @code{'build-vm})
The name of this build VM.  It is used to construct the name of its Shepherd
service.

@item @code{image}
The image of the virtual machine (@pxref{System Images}).  This notably
specifies the virtual disk size and the operating system running into it
(@pxref{Referencia de operating-system}).  The default value is a minimal
operating system image.

@item @code{qemu} (predeterminado: @code{qemu-minimal})
The QEMU package to run the image.

@item @code{cpu}
The CPU model being emulated as a string denoting a model known to QEMU.

The default value is a model that matches @code{date} (see below).  To see
what CPU models are available, run, for example:

@example
qemu-system-x86_64 -cpu help
@end example

@item @code{cpu-count} (default: @code{4})
The number of CPUs emulated by the virtual machine.

@item @code{memory-size} (default: @code{2048})
Size in mebibytes (MiB) of the virtual machine's main memory (RAM).

@item @code{date} (default: a few years ago)
Date inside the virtual machine when it starts; this must be a SRFI-19 date
object (@pxref{SRFI-19 Date,,, guile, GNU Guile Reference Manual}).

@item @code{port-forwardings} (default: 11022 and 11004)
TCP ports of the virtual machine forwarded to the host.  By default, the SSH
and secrets ports are forwarded into the host.

@item @code{systems} (default: @code{(list (%current-system))})
List of system types supported by the build VM---e.g.,
@code{"x86_64-linux"}.

@item @code{auto-start?} (default: @code{#f})
Whether to start the virtual machine when the system boots.
@end table
@end deftp

In the next section, you'll find a variant on this theme: GNU/Hurd virtual
machines!

@anchor{hurd-vm}
@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

The default configuration (see @code{hurd-vm-configuration} below)  spawns a
secure shell (SSH) server in your GNU/Hurd system, which QEMU (the virtual
machine emulator) redirects to port 10022 on the host.  By default, the
service enables @dfn{offloading} such that the host @code{guix-daemon}
automatically offloads GNU/Hurd builds to the childhurd (@pxref{Configuración de delegación del daemon}).  This is what happens when running a command like the
following one, where @code{i586-gnu} is the system type of 32-bit GNU/Hurd:

@example
guix build emacs-minimal -s i586-gnu
@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.

You will probably find it useful to create an account for you in the
GNU/Hurd virtual machine and to authorize logins with your SSH key.  To do
that, you can define the GNU/Hurd system in the usual way (@pxref{Uso de la configuración del sistema}), and then pass that operating system as the @code{os}
field of @code{hurd-vm-configuration}, as in this example:

@lisp
(define childhurd-os
  ;; Definition of my GNU/Hurd system, derived from the default one.
  (operating-system
    (inherit %hurd-vm-operating-system)

    ;; Add a user account.
    (users (cons (user-account
                  (name "charlie")
                  (comment "This is me!")
                  (group "users")
                  (supplementary-groups '("wheel"))) ;for 'sudo'
                 %base-user-accounts))

    (services
     ;; Modify the SSH configuration to allow login as "root"
     ;; and as "charlie" using public key authentication.
     (modify-services (operating-system-user-services
                       %hurd-vm-operating-system)
       (openssh-service-type
        config => (openssh-configuration
                   (inherit config)
                   (authorized-keys
                    `(("root"
                       ,(local-file
                         "/home/charlie/.ssh/id_rsa.pub"))
                      ("charlie"
                       ,(local-file
                         "/home/charlie/.ssh/id_rsa.pub"))))))))))

(operating-system
  ;; @dots{}
  (services
    ;; Add the 'hurd-vm' service, configured to use the
    ;; operating system configuration above.
    (append (list (service hurd-vm-service-type
                           (hurd-vm-configuration
                             (os %childhurd-os))))
            %base-services)))
@end lisp

That's it! The remainder of this section provides the reference of the
service configuration.

@defvar 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 defvar

@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{type} (default: @code{'hurd-qcow2})
The image type name.  Use @code{'hurd-qcow2} for a 32-bit image or
@code{'hurd64-qcow2} for a 64-bit image.

@item @code{image} (predeterminado: @var{hurd-vm-disk-image})
The image object representing the disk image of this virtual machine
(@pxref{System Images}).

Alternatively, this can be the file name (a string) of an image, which is
useful if you want the image to persist across service restarts---see
example below.

@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

@cindex childhurd, delegación de trabajo
@cindex Hurd, delegación de trabajo
@item @code{offloading?} (default: @code{#t})
Whether to automatically set up offloading of builds to the childhurd.

When enabled, this lets you run GNU/Hurd builds on the host and have them
transparently offloaded to the VM, for instance when running a command like
this:

@example
guix build coreutils -s i586-gnu
@end example

This option automatically sets up offloading like so:

@enumerate
@item
Authorizing the childhurd's key on the host so that the host accepts build
results coming from the childhurd, which can be done like so
(@pxref{Invocación de guix archive, @command{guix archive --authorize}}, for more
on that).

@item
Creating a user account called @code{offloading} dedicated to offloading in
the childhurd.

@item
Creating an SSH key pair on the host and making it an authorized key of the
@code{offloading} account in the childhurd.

@item
Añadir childhurd a @file{/etc/guix/machines.scm} (@pxref{Configuración de delegación del daemon}).
@end enumerate

@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/authorized_keys.d/offloading
/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

@end table
@end deftp

Note that by default the VM image is volatile---i.e., once the service is
stopped, the contents are lost.  If you want a persistent image instead,
override the configuration's @code{image} and @code{options} without the
@option{--snapshot} flag using something along these lines:

@lisp
(service hurd-vm-service-type
         (hurd-vm-configuration
          ;; Specify an out-of-store, persistent image.
          (image "/out/of/store/writable/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 is a virtual machine management system.  It is designed to keep
virtual machines running on a cluster of servers even in the event of
hardware failures, and to make maintenance and recovery tasks easy.  It
consists of multiple services which are described later in this section.  In
addition to the Ganeti service, you will need the OpenSSH service
(@pxref{Servicios de red, @code{openssh-service-type}}), and update the
@file{/etc/hosts} file (@pxref{Referencia de servicios,
@code{hosts-service-type}}) with the cluster name and address (or use a DNS
server).

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 "node1")

  ;; 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)))

                 (simple-service 'ganeti-hosts-entries hosts-service-type
                                 (list
                                   (host "192.168.1.200" "ganeti.example.com")
                                   (host "192.168.1.201" "node1.example.com"
                                         '("node1"))
                                   (host "192.168.1.202" "node2.example.com"
                                         '("node2"))))

                 (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.

@defvar 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 defvar

@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{hooks} (default: @code{#f})
When set, this should be a file-like object containing a directory with
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/hooks.html,cluster
execution hooks}.

@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

@defvar %default-debootstrap-hooks
Esta variable contiene extensiones (``hook'') para la configuración de la
red y el cargador de arranque GRUB.
@end defvar

@defvar %default-debootstrap-extra-pkgs
Esta variable contiene una lista de paquetes adecuada para una máquina
completamente virtualizada.
@end defvar

@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} debootstrap-variant nombre 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} debootstrap-os 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} guix-variant nombre 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} guix-os 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

@defvar %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 defvar

@defvar %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 defvar

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}.

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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.

Se permiten la mayoría de las operaciones de consulta sin identificación (a
no ser que se especifique @var{require-authentication?}), mientras que las
operaciones de escritura necesitan autorización explícita a través del
archivo @file{/var/lib/ganeti/rapi/users}. Véase la
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/rapi.html, documentación
de la API remota de Ganeti} para obtener más información.

El valor de este servicio debe ser un objeto
@code{ganeti-rapi-configuration}.
@end defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar 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 defvar

@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} (default: @code{"*/5 * * * *"})
When to run the script, expressed either as a string in traditional cron
syntax or as a gexp representing a Shepherd calendar event (@pxref{Timers,,,
shepherd, The GNU Shepherd Manual}).  The default is every five minutes.

@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 clúster cuya antigüedad sea mayor que 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

@defvar 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 defvar

@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

The @code{(gnu services version-control)} module provides a service to allow
remote access to local Git repositories.  There are three options: the
@code{git-daemon-service-type}, which provides access to repositories via
the @code{git://} unsecured TCP-based protocol, extending the @code{nginx}
web server to proxy some requests to @code{git-http-backend}, or providing a
web interface with @code{cgit-service-type}.

@defvar git-daemon-service-type
Type for a service that runs @command{git daemon}, a simple TCP server to
expose repositories over the Git protocol for anonymous access.

The value for this service type is a @code{<git-daemon-configuration>}
record, by default it allows read-only access to exported@footnote{By
creating the magic file @file{git-daemon-export-ok} in the repository
directory.} repositories under @file{/srv/git}.
@end defvar

@deftp {Tipo de datos} git-daemon-configuration
Data type representing the configuration for @code{git-daemon-service-type}.

@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{'()})
Extra options that will be passed to @command{git daemon}.@footnote{Run
@command{man git-daemon} for more information.}

@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} 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/certs/git.mi-maquina.org/fullchain.pem")
             (ssl-certificate-key
              "/etc/certs/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
Text which will be used as default @code{repository-cgit-configuration}
@code{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
A list of @code{repository-cgit-configuration} records.

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} (default: @code{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} (default: @code{"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} (default: @code{"git"})
Grupo usado por Gitolite.

@item @code{home-directory} (predeterminado: @code{"/var/lib/gitolite"})
Directorio en el que se almacenará la configuración y repositorios de
Gitolite.

@item @code{rc-file} (default: @code{(gitolite-rc-file)})
Un objeto ``tipo-archivo'' (@pxref{Expresiones-G, objetos
``tipo-archivo''}), que representa la configuración de Gitolite.

@item @code{git-config} (default: @code{(gitolite-git-configuration)})
A ``file-like'' object (@pxref{Expresiones-G, file-like objects}),
representing the git configuration for Gitolite.

@item @code{admin-pubkey}
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

The file has to have @file{.pub} extension.

@item @code{admin-name} (default: @code{#f})
Usually the key name is derived by taking a base name of the
@code{admin-pubkey}.  The resulting file name is the name of the gitolite
user.  You can use this field to override the automatic name.

@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{log-extra} (default: @code{#f})
Whether gitolite should log extra details.

For historical reasons, this field defaults to @code{#f}.  The default value
from gitolite however is @code{1} (written as @code{#t} in this
configuration).

@item @code{host-name} (predeterminado: @code{#f})
The host name of this gitolite instance.  It is used by the mirroring
feature.

@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.

@item @code{extra-content} (predeterminado: @code{""})
Extra content to add verbatim into the @code{%RC} hash.

@end table
@end deftp

@deftp {Data Type} gitolite-git-configuration
Data type representing the git configuration file for gitolite.

@table @asis
@item @code{name} (default: @code{"GNU GNU"})
User name used for commits (e.g. during setting up the admin repository).

@item @code{email} (default: @code{"guix@@localhost"})
Email used for commits (e.g. during setting up the admin repository).

@item @code{default-branch} (default: @code{#f})
If true, set the @code{init.defaultBranch} option to that value.  Common
values are @code{"master"} and @code{"main"}.

@item @code{receive-fsck-objects} (default: @code{#f})
If it is set to true, git-receive-pack will check all received objects.

@item @code{extra-content} (predeterminado: @code{""})
Extra content to add verbatim into the git configuration file.

@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
             (nginx-server-configuration
               (ssl-certificate
                 "/etc/certs/myweb.site/fullchain.pem")
               (ssl-certificate-key
                 "/etc/certs/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{git-owner-validation?} (default: @code{#t})
Whether to check for the service user's ownership of repositories.  By
default, Git will refuse to process a repository owned by another user.

@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}
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 Joycond service
@cindex joycond
@cindex nintendo controllers
The joycond service allows the pairing of Nintendo joycon game controllers
over Bluetooth. (@pxref{Servicios de escritorio} for setting up Bluetooth.)

@deftp {Data Type} joycond-configuration
Data type representing the configuration of @command{joycond}.

@table @asis
@item @code{package} (default: @code{joycond})
The joycond package to use.
@end table
@end deftp

@defvar joycond-service-type
Service type for the joycond service.  It also extends the
@code{udev-service-type} with the @code{joycond} package (provided via the
@code{joycond-configuration} configuration), so that joycond controllers can
be detected and used by an unprivileged user.
@end defvar

@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 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 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

@subheading PAM Mount Volume Service
@cindex pam volume mounting

PAM mount volumes are automatically mounted at login by the PAM login
service according to a set of per-volume rules.  Because they are mounted by
PAM the password entered during login may be used directly to mount
authenticated volumes, such as @code{cifs}, using the same credentials.

These volumes will be added in addition to any volumes directly specified in
@code{pam-mount-rules}.

Here is an example of a rule which will mount a remote CIFS share from
@file{//remote-server/share} into a sub-directory of @file{/shares} named
after the user logging in:

@lisp
(simple-service 'pam-mount-remote-share pam-mount-volume-service-type
                (list (pam-mount-volume
                       (secondary-group "users")
                       (file-system-type "cifs")
                       (server "remote-server")
                       (file-name "share")
                       (mount-point "/shares/%(USER)")
                       (options "nosuid,nodev,seal,cifsacl"))))
@end lisp

@deftp {Data Type} pam-mount-volume-service-type
Configuration for a single volume to be mounted.  Any fields not specified
will be omitted from the run-time PAM configuration.  See
@uref{http://pam-mount.sourceforge.net/pam_mount.conf.5.html, the man page}
for the default values when unspecified.

@table @asis
@item @code{user-name} (type: maybe-string)
Mount the volume for the given user.

@item @code{user-id} (type: maybe-integer-or-range)
Mount the volume for the user with this ID.  This field may also be
specified as a pair of @code{(start . end)} indicating a range of user IDs
for whom to mount the volume.

@item @code{primary-group} (type: maybe-string)
Mount the volume for users with this primary group name.

@item @code{group-id} (type: maybe-integer-or-range)
Mount the volume for the users with this primary group ID.  This field may
also be specified as a cons cell of @code{(start . end)} indicating a range
of group ids for whom to mount the volume.

@item @code{secondary-group} (type: maybe-string)
Mount the volume for users who are members of this group as either a primary
or secondary group.

@item @code{file-system-type} (type: maybe-string)
The file system type for the volume being mounted (e.g., @code{cifs})

@item @code{no-mount-as-root?} (type: maybe-boolean)
Whether or not to mount the volume with root privileges.  This is normally
disabled, but may be enabled for mounts of type @code{fuse}, or other
user-level mounts.

@item @code{server} (type: maybe-string)
The name of the remote server to mount the volume from, when necessary.

@item @code{file-name} (type: maybe-string)
The location of the volume, either local or remote, depending on the
@code{file-system-type}.

@item @code{mount-point} (type: maybe-string)
Where to mount the volume in the local file-system.  This may be set to
@file{~} to indicate the home directory of the user logging in.  If this
field is omitted then @file{/etc/fstab} is consulted for the mount
destination.

@item @code{options} (type: maybe-string)
The options to be passed as-is to the underlying mount program.

@item @code{ssh?} (type: maybe-boolean)
Enable this option to pass the login password to SSH for use with mounts
involving SSH (e.g., @code{sshfs}).

@item @code{cipher} (type: maybe-string)
Cryptsetup cipher name for the volume.  To be used with the @code{crypt}
@code{file-system-type}.

@item @code{file-system-key-cipher} (type: maybe-string)
Cipher name used by the target volume.

@item @code{file-system-key-hash} (type: maybe-string)
SSL hash name used by the target volume.

@item @code{file-system-key-file-name} (type: maybe-string)
File name of the file system key for the target volume.

@end table
@end deftp


@node Servicios de Guix
@subsection Servicios de Guix

@subsubheading Shared Cache Service
@cindex shared cache
@cindex cache, sharing

Running @command{guix pull}, @command{guix time-machine}, @command{guix
system reconfigure}, and @command{guix home reconfigure} pulls the complete
Git version control history of your channels in
@file{$HOME/.cache/guix/checkouts}.  If you have multiple user accounts
(typically @code{root} and a main user account for your personal computer),
or if multiple users are using the system (typically on a shared server),
then this can quickly waste a lot of space.

The @code{shared-cache} service lets you prevent this waste by either
sharing or exposing a specific user's cache to the other users.

In the context of this service, @emph{sharing} and @emph{exposing} have the
same meaning as with @command{guix shell}: making the shared cache directory
read-only if you use mode @option{'expose} (the default), and writable if
you use mode @option{'share}, (@pxref{Invocación de guix shell, @option{--expose}
and @option{--share}}).

Whatever mode you choose, from the point of view of the user, the cache
appears writable.  With @option{'expose}, any write will be stored in a
user-owned overlay directory next to mountpoint, whereas with
@option{'share}, writes will be propagated back to the sharing user's cache.

@quotation Aviso
Use the @option{'share} option @emph{if and only if} users on the machine
trust each other.  This is a hard requirement since, with this option, any
user could ``poison'' the shared cache to indirectly gain access to other
user's data and privileges.
@end quotation

@quotation Aviso
Using @option{'share} is meant for a single-seat computer where the single
user has unprivileged user accounts---e.g. one for work and one for gaming.
Even then, channels from one will leak into the other's cache.  Use with
caution.
@end quotation

@quotation Aviso
@option{'share} will not work for multiple concurrent invocation of
@command{guix}, e.g. if two user accounts run @command{guix time machine} at
the same time, the results will be fun but not useful.
@end quotation

Here is an example configuration that exposes @code{root}'s guix checkout
cache to @code{alice} and @code{bob}:

@lisp
(operating-system
  ;; @dots{}
     (services
      (cons*
       (service shared-cache-service-type
             (shared-cache-configuration
               (users (list (user-cache (user "alice"))
                            (user-cache (user "bob"))))))
                    %desktop-services)))
@end lisp

The service can also be extended by providing a list of @code{user-cache},
allowing for easier splitting of configuration.

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (simple-service 'bob-shared-guix-cache shared-cache-service-type
                    (list (user-cache (user "bob"))))
    %desktop-services)))
@end lisp

@defvar shared-cache-service-type
Service type for sharing a subdirectory of @file{~/.cache/} between multiple
users.

This service allows different system users to share the contents of the user
cache, avoiding duplication and saving disk space.  It can be configured in
either ``share'' mode, where all users write to the same cache, or
``expose'' mode, where users get a read-only view with a writable overlay.
Its value must be a @code{shared-cache-configuration} object.
@end defvar

@deftp {Data Type} shared-cache-configuration
Data type representing the configuration of the shared cache.

@table @asis
@item @code{mode} (default: @code{'expose})
Either @code{'share} (read-write, dangerous) or @code{'expose} (read-only
with per-user overlay, the default).  In share mode, all writes go to the
shared directory.  In expose mode, only reads use the shared directory;
writes go to a user-owned overlay.

@item @code{shared-directory} (default: @code{"/root/.cache"})
The source cache directory that is shared between users.  Each user will see
some or all of its subdirectories mounted into their own @file{~/.cache}.

@item @code{users} (default: @code{'()})
The list of users that will benefit from the shared directory.  This must be
a list of @code{user-info} records.

@end table
@end deftp

@deftp {Data Type} user-info
Data type representing the configuration for a single user benefitting from
a shared cache.

@table @asis
@item @code{user}
The username of the user.

@item @code{location} (default: @code{"/home/@var{user}/.cache"})
The cache directory of the user.

@item @code{group} (default: @code{"users"})
The primary group of the user.

@item @code{directories} (default: @code{'("guix/checkouts")})
List of subdirectories of the @code{shared-cache-configuration}'s
@code{shared-directory} (whose default is @file{/root/.cache}) to mount
under @var{location} (whose default is @file{~/.cache/}) for the user.
@end table
@end deftp

@subsubheading Build Farm Front-End (BFFE)
The @uref{https://git.cbaines.net/guix/bffe/,Build Farm Front-End} assists
with building Guix packages in bulk.  It's responsible for submitting builds
and displaying the status of the build farm.

@defvar bffe-service-type
Service type for the Build Farm Front-End.  Its value must be a
@code{bffe-configuration} object.
@end defvar

@deftp {Data Type} bffe-configuration
Data type representing the configuration of the Build Farm Front-End.

@table @asis
@item @code{package} (default: @code{bffe})
The Build Farm Front-End package to use.

@item @code{user} (default: @code{"bffe"})
Usuaria del sistema que ejecuta el servicio.

@item @code{group} (default: @code{"bffe"})
Grupo del sistema que ejecuta el servicio.

@item @code{arguments}
A list of arguments to the Build Farm Front-End.  These are passed to the
@code{run-bffe-service} procedure when starting the service.

For example, the following value directs the Build Farm Front-End to submit
builds for derivations available from @code{data.guix.gnu.org} to the Build
Coordinator instance assumed to be running on the same machine.

@example
(list
 #:build
 (list
  (build-from-guix-data-service
   (data-service-url "https://data.guix.gnu.org")
   (build-coordinator-url "http://127.0.0.1:8746")
   (branches '("master"))
   (systems '("x86_64-linux" "i686-linux"))
   (systems-and-targets
    (map (lambda (target)
           (cons "x86_64-linux" target))
         '("aarch64-linux-gnu"
           "i586-pc-gnu")))))
 #:web-server-args
 '(#:event-source "https://example.com"
   #:controller-args
   (#:title "example.com build farm")))
@end example

@item @code{extra-environment-variables} (default: @var{'()})
Extra environment variables to set via the shepherd service.

@end table
@end deftp

@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 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{listen-repl} (default: @var{#f})
Port or filename to spawn a REPL listening on, pass @code{#t} to listen on
the default port or @code{#f} to disable.

@item @code{guile} (predeterminado: @code{guile-3.0-latest})
El paquete Guile con el que se ejecuta la coordinación de construcciones de
Guix.

@item @code{extra-environment-variables} (default: @var{'()})
Extra environment variables to set via the shepherd service.

@end table
@end deftp

@defvar 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} (default: @code{#f})
El número de construcciones que se ejecutan en paralelo.

@item @code{max-parallel-uploads} (default: @code{#f})
The number of uploads to perform in parallel.

@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.

@item @code{extra-options} (predeterminadas: @var{'()})
Extra command line options for @code{guix-build-coordinator-agent}.
@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

@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 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}.

@item @code{git-repositories} (default: @var{#f})
List of git-repository information to insert into the database.

@item @code{build-servers} (default: @var{#f})
List of build-server information to insert into the database.

@end table
@end deftp

@anchor{guix-home-service-type}
@subsubheading Guix Home Service

The Guix Home service is a way to let Guix System deploy the home
environment of one or more users (@pxref{Home Configuration}, for more on
Guix Home).  That way, the system configuration embeds declarations of the
home environment of those users and can be used to deploy everything
consistently at once, saving users the need to run @command{guix home
reconfigure} independently.

@command{guix home} can operate on the home environment configured for
current user via this service, but its effect won't last beyond the next
system activation.  This can be used for quick testing and may avoid the
need of keeping a separate home configuration.

@defvar guix-home-service-type
Service type for the Guix Home service.  Its value must be a list of lists
containing user and home environment pairs.  The key of each pair is a
string representing the user to deploy the configuration under and the value
is a home-environment configuration.

@lisp
(use-modules (gnu services guix))

(define my-home
  (home-environment
    @dots{}))

(operating-system
  (services (append (list (service guix-home-service-type
                                   `(("alice" ,my-home))))
                    %base-services)))
@end lisp

This service can be extended by other services to add additional home
environments, as in this example:

@lisp
(simple-service 'my-extra-home guix-home-service-type
                `(("bob" ,my-extra-home)))
@end lisp
@end defvar

@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 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{control-port} (default: @code{8734})
The port to bind the control server to.

@item @code{control-host} (default: @code{"127.0.0.1"})
The host to bind the control 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{new-ttl} (default: @code{#f})
If specified, this will override the @code{ttl} setting when used for the
@code{Cache-Control} headers, but this value will be used when scheduling
the removal of nars.

Use this setting when the TTL is being reduced to avoid removing nars while
clients still have cached narinfos.

@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.

@item @code{cached-compressions} (default: @code{'()})
Activate generating cached nars with different compression details from the
stored nars.  This is a list of nar-herder-cached-compression-configuration
records.

@item @code{min-uses} (default: @code{3})
When cached-compressions are enabled, generate cached nars when at least
this number of requests are made for a nar.

@item @code{workers} (default: @code{2})
Number of cached nars to generate at a time.

@item @code{nar-source} (default: @code{#f})
Location to fetch nars from when computing cached compressions.  By default,
the storage location will be used.

@item @code{extra-environment-variables} (default: @code{'()})
Extra environment variables to set via the shepherd service.

@end table
@end deftp

@deftp {Data Type} nar-herder-cached-compression-configuration
Data type representing the cached compression configuration.

@table @asis
@item @code{type}
Type of compression to use, e.g. @code{'zstd}.

@item @code{workers} (predeterminado: @code{#f})
Level of the compression to use.

@item @code{directory} (default: @code{#f})
Location to store the cached nars.  If unspecified, they will be stored in
/var/cache/nar-herder/nar/TYPE.

@item @code{directory-max-size} (default: @code{#f})
Maximum size in bytes of the directory.

@item @code{unused-removal-duration} (default: @code{#f})
If a cached nar isn't used for @code{unused-removal-duration}, it will be
scheduled for removal.

@var{unused-removal-duration} must denote a duration: @code{5d} means 5
days, @code{1m} means 1 month, and so on.

@item @code{ttl} (predeterminado: @code{#f})
If specified this overrides the @code{ttl} used for narinfos when this
cached compression is available.

@item @code{new-ttl} (default: @code{#f})
As with the @code{new-ttl} option for @code{nar-herder-configuration}, this
value will override the @code{ttl} when used for narinfo requests.

@end table
@end deftp

@node Servicios de Linux
@subsection Servicios de Linux

@subsubheading VFS Mapping Service
@cindex VFS mapping
@cindex Virtual File System mapping
@cindex bind mounts, service
@cindex overlay mounts, service

The VFS (Virtual File System) Mapping service allows you to bind a file name
under a different name in the global namespace.  For example, this is used
by the Shared Cache Service (@pxref{Servicios de Guix}) to bind the @samp{root}
user's cache over another user's cache.  Another use case may be to expose
game data from the store over your home directory, and apply modifications
there.

The service has three @emph{policies} to choose from with respect to access
rights on the bound over path:

@table @code
@item 'bind
Use a bind mount; the ownership and file permissions of the destination are
the same as the source.

@item 'translate
Use bindfs to make the destination appear as owned by the target user and
group.  Writes will be propagated back to the source as if made by the
original owner.

@item 'overlay
Use an overlay to make the destination appear as owned by the target user
and group. Writes will not appear in the source, but will be stored in a
target-user-owned @samp{-overlay} suffixed directory near the destination.
@end table

Here is an example configuration that exposes the default data directory of
@command{tuxpaint} under the home directory of @code{alice}.  Any
modification made by Alice to the brushes or stamps will not propagate back
to the store (which is read-only anyway).

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (service vfs-mapping-service-type
             (vfs-mapping-configuration
              (bindings (list (vfs-mapping
                               (source      #~(string-append #$tuxpaint
                                                             "/share/tuxpaint"))
                               (destination "/home/alice/.tuxpaint")
                               (user        "alice")
                               (policy      'overlay)
                               (name        "alice-tuxpaint-overlay"))))))
    %desktop-services)))
@end lisp

The service can also be extended by providing a list of @code{vfs-mapping},
allowing for easier splitting of configuration.

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (simple-service 'bob-too-wants-to-hack-on-tuxpaint
                    vfs-mapping-service-type
                    (list (vfs-mapping
                           (source      #~(string-append #$tuxpaint "/share/tuxpaint"))
                           (destination "/home/bob/.tuxpaint")
                           (user        "bob")
                           (policy      'overlay)
                           (name        "bob-tuxpaint-overlay"))))
    %desktop-services)))
@end lisp

The @code{source} file name must exist for the service to start.  The
@code{destination} directory will be created if it does not exist.

@defvar vfs-mapping-service-type
Service type for binding a directory in multiple places on the file system.

The access rights are either the same in source and destination
(@code{'bind}), or writes are translated back to the source as if made by
the source's owner (@code{'translate}), or kept in an overlay directory near
the destination (@code{'overlay}).  The service's value must be a
@code{vfs-mapping-configuration} object.
@end defvar

@deftp {Data Type} vfs-mapping-configuration
Data type representing the configuration of the vfs-mapping service.

@table @asis
@item @code{bindfs} (default: @code{#~(string-append #$bindfs "/bin/bindfs")})
The @command{bindfs} command to use for mounting.

@item @code{fusermount} (default: @code{#~(string-append #$fuse-2 "/bin/fusermount")})
The @command{fusermount} command to use.

@item @code{umount} (default: @code{#~(string-append #$util-linux+udev "/bin/umount")})
The @command{umount} command to use.

@item @code{bindings} (default: @code{'()})
A list of @code{vfs-mapping} records.

@end table
@end deftp

@deftp {Data Type} vfs-mapping
Data type representing the configuration for a single shared directory.

@table @asis
@item @code{source}
The source file name to be shared.

@item @code{destination}
The destination at which the contents of @code{source} will be exposed.

@item @code{policy} (default: @code{'translate})
Either @code{'bind} (same ownership and access rights for @code{source} and
@code{destination}), @code{'translate} (read-write, with writes translated
as if made by @code{source}'s owner), or @code{'overlay} (read-only with
@code{user}-owned writable overlay).

@item @code{user} (default: @code{#f})
The user that will own the @code{destination} directory, and appear to own
its content.  It must be kept at its default @code{#f} value when using the
@code{'bind} policy.

@item @code{group} (default: @code{"users"})
The group that will own the @code{destination} directory, and appear to own
its content.

@item @code{name} (default: @code{"<src>-[<policy>]-><dst>"})
The name of the shepherd service to mount and unmount the binding.

@item @code{requirement} (default: @code{'(file-systems user-homes)})
The list of services that Shepherd ought to provision before trying to
mount.

@end table
@end deftp

@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.

@defvar 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 defvar

@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

@subsubheading fstrim Service
@cindex fstrim service
@cindex solid state drives, periodic trim
@cindex solid state drives, trim

The command @command{fstrim} can be used to discard (or @dfn{trim})  unused
blocks on a mounted file system.

@c This was copied from the fstrim manpage, with some Texinfo touch-ups.
@quotation Aviso
Running @command{fstrim} frequently, or even using @command{mount -o
discard}, might negatively affect the lifetime of poor-quality SSD devices.
For most desktop and server systems a sufficient trimming frequency is once
a week.  Note that not all devices support a queued trim, so each trim
command incurs a performance penalty on whatever else might be trying to use
the disk at the time.
@end quotation

@defvar fstrim-service-type
Type for a service that periodically runs @command{fstrim}, whose value must
be an @code{<fstrim-configuration>} object.  The service can be instantiated
in its default configuration with:

@lisp
(service fstrim-service-type)
@end lisp
@end defvar

@c %start of fragment

@deftp {Data Type} fstrim-configuration
Available @code{fstrim-configuration} fields are:

@table @asis
@item @code{package} (default: @code{util-linux}) (type: file-like)
The package providing the @command{fstrim} command.

@item @code{schedule} (default: @code{"0 0 * * 0"}) (type: Shepherd calendar event)
Schedule for launching @command{fstrim}, expressed as a string in
traditional cron syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd,The GNU Shepherd Manual}).  By default this is
set to run weekly on Sunday at 00:00.

@item @code{listed-in} (default: @code{'("/etc/fstab" "/proc/self/mountinfo")}) (type: maybe-list-of-strings)
List of files in fstab or kernel mountinfo format.  All missing or empty
files are silently ignored.  The evaluation of the list @emph{stops} after
the first non-empty file.  File systems with @code{X-fstrim.notrim} mount
option in fstab are skipped.

@item @code{verbose?} (default: @code{#t}) (type: boolean)
Verbose execution.

@item @code{quiet-unsupported?} (default: @code{#t}) (type: boolean)
Suppress error messages if trim operation (ioctl) is unsupported.

@item @code{extra-arguments} (type: maybe-list-of-strings)
Extra options to append to @command{fstrim} (run @samp{man fstrim} for more
information).

@end table

@end deftp


@c %end of fragment

@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}.

@defvar 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 defvar

@subsubheading Cachefilesd Service

@cindex cachefilesd
@cindex fscache, file system caching (Linux)
The Cachefilesd service starts a daemon that caches network file system data
locally.  It is especially useful for NFS and AFS shares, where it reduces
latencies for repeated access when reading files.

The daemon can be configured as follows:

@lisp
(service cachefilesd-service-type
         (cachefilesd-configuration
           (cache-directory "/var/cache/fscache")))
@end lisp

@defvar cachefilesd-service-type
The service type for starting @command{cachefilesd}.  The value for this
service type is a @code{cachefilesd-configuration}, whose only required
field is @var{cache-directory}.

@end defvar

@c %start of fragment
@deftp {Data Type} cachefilesd-configuration
Available @code{cachefilesd-configuration} fields are:

@table @asis
@item @code{cachefilesd} (default: @code{cachefilesd}) (type: file-like)
The cachefilesd package to use.

@item @code{debug-output?} (default: @code{#f}) (type: boolean)
Print debugging output to stderr.

@item @code{use-syslog?} (default: @code{#t}) (type: boolean)
Log to syslog facility instead of stdout.

@item @code{scan?} (default: @code{#t}) (type: boolean)
Scan for cacheable objects.

@item @code{cache-directory} (type: maybe-string)
Location of the cache directory.

@item @code{cache-name} (default: @code{"CacheFiles"}) (type: maybe-string)
Name of cache (keep unique).

@item @code{security-context} (type: maybe-string)
SELinux security context.

@item @code{pause-culling-for-block-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
Pause culling when available blocks exceed this percentage.

@item @code{pause-culling-for-file-percentage} (default: @code{7}) (type: maybe-non-negative-integer)
Pause culling when available files exceed this percentage.

@item @code{resume-culling-for-block-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
Start culling when available blocks drop below this percentage.

@item @code{resume-culling-for-file-percentage} (default: @code{5}) (type: maybe-non-negative-integer)
Start culling when available files drop below this percentage.

@item @code{pause-caching-for-block-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
Pause further allocations when available blocks drop below this percentage.

@item @code{pause-caching-for-file-percentage} (default: @code{1}) (type: maybe-non-negative-integer)
Pause further allocations when available files drop below this percentage.

@item @code{log2-table-size} (default: @code{12}) (type: maybe-non-negative-integer)
Size of tables holding cullable objects in logarithm of base 2.

@item @code{cull?} (default: @code{#t}) (type: boolean)
Create free space by culling (consumes system load).

@item @code{trace-function-entry-in-kernel-module?} (default: @code{#f}) (type: boolean)
Trace function entry in the kernel module (for debugging).

@item @code{trace-function-exit-in-kernel-module?} (default: @code{#f}) (type: boolean)
Trace function exit in the kernel module (for debugging).

@item @code{trace-internal-checkpoints-in-kernel-module?} (default: @code{#f}) (type: boolean)
Trace internal checkpoints in the kernel module (for debugging).

@end table
@end deftp
@c %end of fragment

@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}.

@defvar 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 defvar

@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}.

@defvar 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 defvar

@node Servicios de Hurd
@subsection Servicios de Hurd

@defvar 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 defvar

@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

@defvar 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 defvar

@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.

@defvar 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 defvar

@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.

@defvar 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 defvar

@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

@defvar %default-sysctl-settings
An association list specifying the default @command{sysctl} parameters on
Guix System.
@end defvar

@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.

@defvar 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 defvar

@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 LIRC Service

El módulo @code{(gnu services lirc)} proporciona el siguiente servicio.

@defvar lirc-service-type
Type for a service that runs @url{http://www.lirc.org, LIRC}, a daemon that
decodes infrared signals from remote controls.

The value for this service is a @code{<lirc-configuration>} object.
@end defvar

@deftp {Data Type} lirc-configuration
Data type representing the configuration of @command{lircd}.

@table @asis
@item @code{lirc} (default: @code{lirc}) (type: file-like)
Package object for @command{lirc}.

@item @code{device} (default: @code{#f}) (type: string)
@itemx @code{driver} (default: @code{#f}) (type: string)
@itemx @code{config-file} (default: @code{#f}) (type: string-or-file-like)
TODO.  See @command{lircd} manual for details.

@item @code{extra-options} (default: @code{'()}) (type: list-of-string)
Additional command-line options to pass to @command{lircd}.

@end table
@end deftp

@c TODO: Document <lirc-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@cindex SPICE
@subsubheading SPICE Service

El módulo @code{(gnu services spice)} proporciona el siguiente servicio.

@defvar spice-vdagent-service-type
Type of the service that runs @url{https://www.spice-space.org, VDAGENT}, a
daemon that enables sharing the clipboard with a vm and setting the guest
display resolution when the graphical console window resizes.
@end defvar

@deftp {Data Type} spice-vdagent-configuration
Data type representing the configuration of
@code{spice-vdagent-service-type}.

@table @asis
@item @code{spice-vdagent} (default: @code{spice-vdagent}) (type: file-like)
Package object for VDAGENT.

@end table
@end deftp

@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.

@defvar inputattach-service-type
Tipo de un servicio que ejecuta @command{inputattach} con un dispositivo y
reenvía los eventos que produzca.
@end defvar

@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:

@defvar dicod-service-type
Tipo de servicio que ejecuta el daemon @command{dicod}, una implementación
del servidor DICT (@pxref{Dicod,,, dico, GNU Dico Manual}).

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}).

@quotation Nota
This service is also available for Guix Home, where it runs directly with
your user privileges (@pxref{Miscellaneous Home Services,
@code{home-dicod-service-type}}).
@end quotation
@end defvar

@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{Modules,,, 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

@defvar %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 defvar

@deffn {Procedure} dicod-freedict-database dictionary-name
Returns a record of type @code{dicod-database} for purpose of configuring a
database for the FreeDict multilingual dictionary named by
@var{dictionary-name}, a string such as @code{"kur-eng"} for the
Kurdish-to-English dictionary, into a service of type
@code{dicod-service-type}.
@end deffn

@defvar %dicod-databases:freedict
A relatively large list of records of type @code{dicod-database}, made
available for users who wish to configure all the FreeDict multilingual
dictionaries provided by the @code{freedict-dictionaries} package into a
service of type @code{dicod-service-type}.
@end defvar

The following is an example @code{dicod-service-type} configuration,
extending a @command{dicod} daemon serving databases for the wordnet and
gcide dictionaries, as well as a selection of FreeDict multilingual
dictionaries.

@lisp
(service dicod-service-type
         (dicod-configuration
          (handlers (list
                     (dicod-handler
                      (name "wordnet")
                      (module "wordnet")
                      (options
                       (list #~(string-append "wnhome=" #$wordnet))))))
          (databases (cons*
                      (dicod-database
                       (name "wordnet")
                       (complex? #t)
                       (handler "wordnet"))
                      %dicod-database:gcide
                      (map
                       dicod-freedict-database
                       '("fra-eng" "eng-fra" "eng-spa" "spa-eng"))))))
@end lisp

@cindex Docker
@subsubheading Servicio Docker

El módulo @code{(gnu services docker)} proporciona los siguientes servicios.

@cindex containerd, container runtime
@defvar containerd-service-type

This service type operates containerd
@url{https://containerd.io,containerd}, a daemon responsible for overseeing
the entire container lifecycle on its host system. This includes image
handling, storage management, container execution, supervision, low-level
storage operations, network connections, and more.

@end defvar

@deftp {Data Type} containerd-configuration
This is the data type representing the configuration of containerd.

@table @asis

@item @code{containerd} (default: @code{containerd})
The containerd daemon package to use.

@item @code{debug?} (predeterminado: @code{#f})
Activa o desactiva la salida de depuración.

@item @code{environment-variables} (default: @code{'()})
List of environment variables to set for @command{containerd}.

This must be a list of strings where each string has the form
@samp{@var{key}=@var{value}} as in this example:

@lisp
(list "HTTP_PROXY=socks5://127.0.0.1:9150"
      "HTTPS_PROXY=socks5://127.0.0.1:9150")
@end lisp

@end table
@end deftp

@defvar 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.

The @code{containerd-service-type} service need to be added to a system
configuration, otherwise a message about not any service provides
@code{containerd} will be displayed during @code{guix system reconfigure}.

@end defvar

@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})
This field is deprecated in favor of @code{containerd-service-type} service.

@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

@item @code{config-file} (type: maybe-file-like)
JSON configuration file pass to @command{dockerd}.

@end table
@end deftp

@cindex Singularity, servicio de contenedores
@defvar 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 el bit setuid de root (@pxref{Privileged Programs}) de modo
que usuarias sin privilegios puedan ejecutar @command{singularity run} y
ordenes similares.
@end defvar

@cindex Rootless Podman
@subsubheading Rootless Podman Service

@cindex rootless podman, container management tool
@cindex podman, rootless
@cindex container management, podman
The @code{(gnu services containers)} module provides the following service.


@defvar rootless-podman-service-type
This is the service type for @url{https://podman.io, Podman} is a container
management tool.

In addition to providing a drop-in replacement for Docker, Podman offers the
ability to run containers in ``root-less'' mode, meaning that regular users
can deploy containers without elevated privileges.  It does so mainly by
leveraging two Linux kernel features: unprivileged user namespaces, and
subordinate user and group IDs (@pxref{subordinate-user-group-ids, the
subordinate user and group ID service}).

The @code{rootless-podman-service-type} sets up the system to allow
unprivileged users to run @command{podman} commands:

@lisp
(use-service-modules containers dbus desktop networking @dots{})
(use-modules (gnu system accounts))  ;for 'subid-range'

(operating-system
  ;; @dots{}
  (users (cons (user-account
                (name "alice")
                (comment "Bob's sister")
                (group "users")

                ;; Adding the account to the "cgroup" group
                ;; makes it possible to run podman commands.
                (supplementary-groups '("cgroup" "wheel"
                                        "audio" "video")))
               %base-user-accounts))
  (services
    (cons* (service dbus-root-service-type)
           (service dhcpcd-service-type)
           (service elogind-service-type)
           (service iptables-service-type)
           (service rootless-podman-service-type
                    (rootless-podman-configuration
                      (subgids
                       (list (subid-range (name "alice"))))
                      (subuids
                       (list (subid-range (name "alice"))))))
           %base-services)))
@end lisp

The @code{iptables-service-type} is required for Podman to be able to setup
its own networks.  Due to the change in user groups and file systems it is
recommended to reboot (or at least logout), before trying to run Podman
commands.

To test your installation you can run:

@example
$ podman run -it --rm docker.io/alpine cat /etc/*release*
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.20.2
PRETTY_NAME="Alpine Linux v3.20"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
@end example

@end defvar

@c %start of fragment

@deftp {Data Type} rootless-podman-configuration
Available @code{rootless-podman-configuration} fields are:

@table @asis
@item @code{podman} (default: @code{podman}) (type: package-or-#f)
The Podman package that will be installed in the system profile.  Pass
@code{#f} to not install Podman.

@item @code{group-name} (default: @code{"cgroup"}) (type: string)
The name of the group that will own /sys/fs/cgroup resources.  Users that
want to use rootless Podman have to be in this group.

@item @code{containers-registries} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/registries.conf} configuration file.

@item @code{containers-storage} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/storage.conf} configuration file.

@item @code{containers-policy} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/policy.json} configuration file.

@item @code{pam-limits} (type: list-of-pam-limits-entries)
The PAM limits to be set for rootless Podman.

@item @code{subgids} (default: @code{()}) (type: list-of-subid-ranges)
A list of subid ranges representing the subgids that will be available for
each configured user.

@item @code{subuids} (default: @code{()}) (type: list-of-subid-ranges)
A list of subid ranges representing the subuids that will be available for
each configured user.

@end table

@end deftp


@c %end of fragment

@cindex OCI-backed, Shepherd services
@subsubheading OCI backed services

Should you wish to manage your @acronym{Open Container Initiative, OCI}
containers with the same consistent interface you use for your other
Shepherd services, @var{oci-service-type} is the tool to use: given an OCI
container image, it will run it in a Shepherd service.  One example where
this is useful: it lets you run services that are available as OCI images
but not yet packaged for Guix.

@defvar oci-service-type

This is a thin wrapper around Docker's or Podman's CLI that executes OCI
images backed processes as Shepherd Services.

@lisp
(simple-service 'oci-provisioning
                oci-service-type
                (oci-extension
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "host")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090"))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "host")
                      (volumes
                       '("/var/lib/grafana:/var/lib/grafana")))))))
@end lisp

In this example three different Shepherd services are going to be added to
the system.  Each @code{oci-container-configuration} record translates to a
@samp{docker run} or @samp{podman run} invocation and its fields directly
map to options.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html,Podman}
upstream documentation for semantics of each value.  If the images are not
found, they will be pulled.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/pull/,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-pull.1.html,Podman}
upstream documentation for semantics.  The services with @code{(network
"host")} are going to be attached to the host network and are supposed to
behave like native processes with regard to networking.

@end defvar

@c %start of fragment

@deftp {Data Type} oci-configuration
Available @code{oci-configuration} fields are:

@table @asis
@item @code{runtime} (default: @code{'docker}) (type: symbol)
The OCI runtime to use to run commands.  It can be either @code{'docker} or
@code{'podman}.

@item @code{runtime-cli} (type: maybe-package-or-string)
The OCI runtime command line to be installed in the system profile and used
to provision OCI resources, it can be either a package or a string
representing an absolute file name to the runtime binary entrypoint.  When
unset it will default to @code{docker-cli} package for the @code{'docker}
runtime or to @code{podman} package for the @code{'podman} runtime.

@item @code{runtime-extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be placed after each
@command{docker} or @command{podman} invokation.

@item @code{user} (type: maybe-string)
The user name under whose authority OCI commands will be run.  This field
will override the @code{user} field of @code{oci-configuration}.

@item @code{group} (type: maybe-string)
The group name under whose authority OCI commands will be run.  When using
the @code{'podman} OCI runtime, this field will be ignored and the default
group of the user configured in the @code{user} field will be used.  This
field will override the @code{group} field of @code{oci-configuration}.

@item @code{subuids-range} (type: maybe-subid-range)
An optional @code{subid-range} record allocating subuids for the user from
the @code{user} field.  When unset, with the rootless Podman OCI runtime, it
defaults to @code{(subid-range (name "oci-container"))}.

@item @code{subgids-range} (type: maybe-subid-range)
An optional @code{subid-range} record allocating subgids for the user from
the @code{user} field.  When unset, with the rootless Podman OCI runtime, it
defaults to @code{(subid-range (name "oci-container"))}.

@item @code{containers} (default: @code{'()}) (type: list-of-oci-containers)
The list of @code{oci-container-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{networks} (default: @code{'()}) (type: list-of-oci-networks)
The list of @code{oci-network-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{volumes} (default: @code{'()}) (type: list-of-oci-volumes)
The list of @code{oci-volumes-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{verbose?} (default: @code{#f}) (type: boolean)
When true, additional output will be printed, allowing to better follow the
flow of execution.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-extension
Available @code{oci-extension} fields are:

@table @asis
@item @code{containers} (default: @code{'()}) (type: list-of-oci-containers)
The list of @code{oci-container-configuration} records representing the
containers to provision.

@item @code{networks} (default: @code{'()}) (type: list-of-oci-networks)
The list of @code{oci-network-configuration} records representing the
containers to provision.

@item @code{volumes} (default: @code{'()}) (type: list-of-oci-volumes)
The list of @code{oci-volumes-configuration} records representing the
containers to provision.

@end table

@end deftp


@c %end of fragment


@c %start of fragment

@deftp {Data Type} oci-container-configuration
Available @code{oci-container-configuration} fields are:

@table @asis
@item @code{user} (default: @code{"oci-container"}) (type: string)
The user under whose authority docker commands will be run.

@item @code{group} (default: @code{"docker"}) (type: string)
The group under whose authority docker commands will be run.

@item @code{command} (default: @code{'()}) (type: list-of-strings)
Overwrite the default command (@code{CMD}) of the image.

@item @code{entrypoint} (default: @code{""}) (type: string)
Overwrite the default entrypoint (@code{ENTRYPOINT}) of the image.

@item @code{host-environment} (default: @code{'()}) (type: list)
Set environment variables in the host environment where @samp{docker run} or
@samp{podman run} are invoked.  This is especially useful to pass secrets
from the host to the container without having them on the OCI runtime
command line, for example: by setting the @code{MYSQL_PASSWORD} on the host
and by passing @code{--env MYSQL_PASSWORD} through the
@code{extra-arguments} field, it is possible to securely set values in the
container environment.  This field's value can be a list of pairs or
strings, even mixed:

@lisp
(list '("LANGUAGE" . "eo:ca:eu")
      "JAVA_HOME=/opt/java")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to @code{make-forkexec-constructor}.

@item @code{environment} (default: @code{'()}) (type: list)
Set environment variables inside the container.  This can be a list of pairs
or strings, even mixed:

@lisp
(list '("LANGUAGE" . "eo:ca:eu")
      "JAVA_HOME=/opt/java")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#env,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#env-e-env,Podman}
upstream documentation for semantics.

@item @code{image} (type: string-or-oci-image)
The image used to build the container.  It can be a string or an
@code{oci-image} record.  Strings are resolved by the OCI runtime, and
follow the usual format @code{myregistry.local:5000/testing/test-image:tag}.

@item @code{provision} (default: @code{""}) (type: string)
Set the name of the provisioned Shepherd service.

@item @code{requirement} (default: @code{'()}) (type: list-of-symbols)
Set additional Shepherd services dependencies to the provisioned Shepherd
service.

@item @code{log-file} (type: maybe-string)
When @code{log-file} is set, it names the file to which the service's
standard output and standard error are redirected.  @code{log-file} is
created if it does not exist, otherwise it is appended to.

@item @code{auto-start?} (default: @code{#t}) (type: boolean)
Whether this service should be started automatically by the Shepherd.  If it
is @code{#f}, the service has to be started manually with @command{herd
start}.

@item @code{respawn?} (default: @code{#f}) (type: boolean)
Whether to have Shepherd restart the service when it stops, for instance
when the underlying process dies.

@item @code{shepherd-actions} (default: @code{'()}) (type: list-of-shepherd-actions)
This is a list of @code{shepherd-action} records defining actions supported
by the service.

@item @code{network} (default: @code{""}) (type: string)
Set an OCI network for the spawned container.

@item @code{ports} (default: @code{'()}) (type: list)
Set the port or port ranges to expose from the spawned container.  This can
be a list of pairs or strings, even mixed:

@lisp
(list '("8080" . "80")
      "10443:443")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#publish,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#publish-p-ip-hostport-containerport-protocol,Podman}
upstream documentation for semantics.

@item @code{volumes} (default: @code{'()}) (type: list)
Set volume mappings for the spawned container.  This can be a list of pairs
or strings, even mixed:

@lisp
(list '("/root/data/grafana" . "/var/lib/grafana")
      "/gnu/store:/gnu/store")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#volume,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#volume-v-source-volume-host-dir-container-dir-options,Podman}
upstream documentation for semantics.

@item @code{container-user} (default: @code{""}) (type: string)
Set the current user inside the spawned container.  You can refer to the
@url{https://docs.docker.com/engine/reference/run/#user,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#user-u-user-group,Podman}
upstream documentation for semantics.

@item @code{workdir} (default: @code{""}) (type: string)
Set the current working directory for the spawned Shepherd service.  You can
refer to the
@url{https://docs.docker.com/engine/reference/run/#workdir,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#workdir-w-dir,Podman}
upstream documentation for semantics.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker run} or @samp{podman run} invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-network-configuration
Available @code{oci-network-configuration} fields are:

@table @asis
@item @code{name} (type: string)
The name of the OCI network to provision.

@item @code{driver} (type: maybe-string)
The driver to manage the network.

@item @code{gateway} (type: maybe-string)
IPv4 or IPv6 gateway for the subnet.

@item @code{internal?} (default: @code{#f}) (type: boolean)
Restrict external access to the network

@item @code{ip-range} (type: maybe-string)
Allocate container ip from a sub-range in CIDR format.

@item @code{ipam-driver} (type: maybe-string)
IP Address Management Driver.

@item @code{ipv6?} (default: @code{#f}) (type: boolean)
Enable IPv6 networking.

@item @code{subnet} (type: maybe-string)
Subnet in CIDR format that represents a network segment.

@item @code{labels} (default: @code{'()}) (type: list)
The list of labels that will be used to tag the current volume.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker network create} or @samp{podman network create}
invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-volume-configuration
Available @code{oci-volume-configuration} fields are:

@table @asis
@item @code{name} (type: string)
The name of the OCI volume to provision.

@item @code{labels} (default: @code{'()}) (type: list)
The list of labels that will be used to tag the current volume.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker volume create} or @samp{podman volume create}
invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-image
Available @code{oci-image} fields are:

@table @asis
@item @code{repository} (type: string)
A string like @code{myregistry.local:5000/testing/test-image} that names the
OCI image.

@item @code{tag} (default: @code{"latest"}) (type: string)
A string representing the OCI image tag.  Defaults to @code{latest}.

@item @code{value} (type: oci-lowerable-image)
A @code{manifest} or @code{operating-system} record that will be lowered
into an OCI compatible tarball.  Otherwise this field's value can be a
file-like object that evaluates to an OCI compatible tarball.

@item @code{pack-options} (default: @code{'()}) (type: list)
An optional set of keyword arguments that will be passed to the
@code{docker-image} procedure from @code{guix scripts pack}.  They can be
used to replicate @command{guix pack} behavior:

@lisp
(oci-image
  (repository "guile")
  (tag "3")
  (value
    (specifications->manifest '("guile")))
  (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                  #:max-layers 2)))
@end lisp

If the @code{value} field is an @code{operating-system} record, this field's
value will be ignored.

@item @code{system} (default: @code{""}) (type: string)
Attempt to build for a given system, e.g.@: "i686-linux"

@item @code{target} (default: @code{""}) (type: string)
Attempt to cross-build for a given triple, e.g.@: "aarch64-linux-gnu"

@item @code{grafts?} (default: @code{#f}) (type: boolean)
Whether to allow grafting or not in the pack build.

@end table

@end deftp


@c %end of fragment

@anchor{subordinate-user-group-ids}
@cindex subordinate user and group IDs
@cindex subid, subordinate user and group IDs
@subsubheading Subordinate User and Group ID Service

Among the virtualization facilities implemented by the Linux kernel is the
concept of @dfn{subordinate IDs}.  Subordinate IDs allow for mapping user
and group IDs inside process namespaces to user and group IDs of the host
system.  Subordinate user ID ranges (subuids) allow users to map virtual
user IDs inside containers to the user ID of an unprivileged user of the
host system.  Subordinate group ID ranges (subgids), instead map virtual
group IDs to the group ID of an unprivileged user on the host system.  You
can access @code{subuid(5)} and @code{subgid(5)} Linux man pages for more
details.

The @code{(gnu system shadow)} module exposes the
@code{subids-service-type}, its configuration record
@code{subids-configuration} and its extension record
@code{subids-extension}.

With @code{subids-service-type}, subuids and subgids ranges can be reserved
for users that desire so:

@lisp
(use-modules (gnu system shadow)     ;for 'subids-service-type'
             (gnu system accounts)   ;for 'subid-range'
             @dots{})

(operating-system
  ;; @dots{}
  (services
    (list
      (simple-service 'alice-bob-subids
                      subids-service-type
                      (subids-extension
                        (subgids
                         (list
                          (subid-range (name "alice"))))
                        (subuids
                         (list
                          (subid-range (name "alice"))
                          (subid-range (name "bob")
                                       (start 100700)))))))))
@end lisp

Users (definitely other services), usually, are supposed to extend the
service instead of adding subids directly to @code{subids-configuration},
unless the want to change the default behavior for root.  With default
settings the @code{subids-service-type} adds, if it's not already there, a
configuration for the root account to both @file{/etc/subuid} and
@file{/etc/subgid}, possibly starting at the minimum possible subid.
Otherwise the root subuids and subgids ranges are fitted wherever possible.

The above configuration will yield the following:

@example
# cat /etc/subgid
root:100000:65536
alice:165536:65536
# cat /etc/subuid
root:100000:700
bob:100700:65536
alice:166236:65536
@end example

@c %start of fragment

@deftp {Data Type} subids-configuration

With default settings the @code{subids-service-type} adds, if it's not
already there, a configuration for the root account to both
@file{/etc/subuid} and @file{/etc/subgid}, possibly starting at the minimum
possible subid.  To disable the default behavior and provide your own
definition for the root subid ranges you can set to @code{#f} the
@code{add-root?} field:

@lisp
(use-modules (gnu system shadow)     ;for 'subids-service-type'
             (gnu system accounts)   ;for 'subid-range'
             @dots{})

(operating-system
  ;; @dots{}
  (services
    (list
      (service subids-service-type
               (subids-configuration
                (add-root? #f)
                (subgids
                  (subid-range (name "root")
                               (start 120000)
                               (count 100)))
                (subuids
                  (subid-range (name "root")
                               (start 120000)
                               (count 100)))))
      (simple-service 'alice-bob-subids
                      subids-service-type
                      (subids-extension
                        (subgids
                         (list
                          (subid-range (name "alice"))))
                        (subuids
                         (list
                          (subid-range (name "alice"))
                          (subid-range (name "bob")
                                       (start 100700)))))))))
@end lisp

Available @code{subids-configuration} fields are:

@table @asis
@item @code{add-root?} (default: @code{#t}) (type: boolean)
Whether to automatically configure subuids and subgids for root.

@item @code{subgids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be serialized to
@code{/etc/subgid}.  If a range doesn't specify a start it will be fitted
based on its number of requested subids.  If a range doesn't specify a count
the default size of 65536 will be assumed.

@item @code{subuids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be serialized to
@code{/etc/subuid}.  If a range doesn't specify a start it will be fitted
based on its number of requested subids.  If a range doesn't specify a count
the default size of 65536 will be assumed.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} subids-extension

Available @code{subids-extension} fields are:

@table @asis

@item @code{subgids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be appended to
@code{subids-configuration-subgids}.  Entries with the same name are
deduplicated upon merging.

@item @code{subuids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be appended to
@code{subids-configuration-subuids}.  Entries with the same name are
deduplicated upon merging.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} subid-range

The @code{subid-range} record is defined at @code{(gnu system accounts)}.
Available fields are:

@table @asis

@item @code{name} (type: string)
The name of the user or group that will own this range.

@item @code{start} (default: @code{#f}) (type: integer)
The first requested subid.  When false the first available subid with enough
contiguous subids will be assigned.

@item @code{count} (default: @code{#f}) (type: integer)
The number of total allocated subids.  When #f the default of 65536 will be
assumed .

@end table

@end deftp

@c %end of fragment

@cindex Audit
@subsubheading Servicio Auditd

El módulo @code{(gnu services auditd)} proporciona el servicio siguiente:

@defvar 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 defvar

@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.

@defvar 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 defvar

@cindex Nix
@subsubheading Servicio Nix

El módulo @code{(gnu services nix)} proporciona el siguiente servicio.

@defvar 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://wiki.nixos.org/wiki/Nix_channels, Nix channels} for more
information about the available channels.  If you would like to use the
unstable Nix channel you can do this by running:

@example
$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
$ nix-channel --update
@end example

@item Create your Nix profile directory:

@example
$ sudo mkdir -p /nix/var/nix/profiles/per-user/$USER
$ sudo chown $USER:root /nix/var/nix/profiles/per-user/$USER
@end example

@item Cree un enlace simbólico a su perfil y active el perfil de Nix:

@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 itemize

@end defvar

@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-directory} (default: @code{"/tmp"})
The directory where build directory are stored during builds.  This is
useful to change if, for example, the default location does not have enough
space to hold build trees for big packages.

This is similar to setting the @env{TMPDIR} environment variable for
@command{guix-daemon}.  @ref{Configuración del entorno de construcción, @env{TMPDIR}}, for
more info.

@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

@defvar 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 defvar

@deffn {Procedure} fail2ban-jail-service svc-type 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 gets 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.

@cindex resize-file-system
@subsubheading Resize File System Service

This service type lets you resize a live file system during boot, which can
be convenient if a Guix image is flashed on an SD Card (e.g. for an embedded
device) or uploaded to a VPS.  In both cases the medium the image will
reside upon may be larger than the image you want to produce.

For an embedded device booting from an SD card you may use something like:
@lisp
(service resize-file-system-service-type
         (resize-file-system-configuration
          (file-system
           (file-system (device (file-system-label "root"))
                        (type "ext4")))))
@end lisp

@quotation Aviso
Be extra cautious to use the correct device and type.  The service has
little error handling of its own and relies on the underlying tools.  Wrong
use could end in loss of data or the corruption of the operating system.
@end quotation

Partitions and file systems are grown to the maximum size available.  File
systems can only grow when they are on the last partition on a device and
have empty space available.

This service supports the ext2, ext3, ext4, btrfs, and bcachefs file
systems.

@table @asis

@item @code{file-system} (type: file-system)
The file-system object to resize (@pxref{Sistemas de archivos}).  This object must
have the @code{device} and @code{type} fields set.  Other fields are
ignored.

@item @code{cloud-utils} (default: @code{cloud-utils}) (type: file-like)
The cloud-utils package to use.  This package is used for the
@code{growpart} command.

@item @code{e2fsprogs} (default: @code{e2fsprogs}) (type: file-like)
The e2fsprogs package to use, used for resizing ext2, ext3, and ext4 file
systems.

@item @code{btrfs-progs} (default: @code{btrfs-progs}) (type: file-like)
The btrfs-progs package to use, used for resizing the btrfs file system.

@item @code{bcachefs-tools} (default: @code{bcachefs-tools}) (type: file-like)
The bcachefs-tools package to use, used for resizing the bcachefs file
system.

@end table

@cindex Backup
@subsubheading Backup Services

The @code{(gnu services backup)} module offers services for backing up file
system trees.  For now, it provides the @code{restic-backup-service-type}.

With @code{restic-backup-service-type}, you can periodically back up
directories and files with @uref{https://restic.net/, Restic}, which
supports end-to-end encryption and deduplication.  Consider the following
configuration:

@lisp
(use-service-modules backup @dots{}) ;for 'restic-backup-service-type'
(use-package-modules sync @dots{})   ;for 'rclone'

(operating-system
  ;; @dots{}
  (packages (append (list rclone)    ;for use by restic
                    %base-packages))
  (services
    (list
      (service restic-backup-service-type
               (restic-backup-configuration
                 (jobs
                   (list (restic-backup-job
                           (name "remote-ftp")
                           (repository "rclone:remote-ftp:backup/restic")
                           (password-file "/root/.restic")
                           ;; Every day at 23.
                           (schedule "0 23 * * *")
                           (files '("/root/.restic"
                                    "/root/.config/rclone"
                                    "/etc/ssh/ssh_host_rsa_key"
                                    "/etc/ssh/ssh_host_rsa_key.pub"
                                    "/etc/guix/signing-key.pub"
                                    "/etc/guix/signing-key.sec"))))))))))
@end lisp

Each @code{restic-backup-job} translates to a Shepherd timer which sets the
@env{RESTIC_PASSWORD} environment variable by reading the first line of
@code{password-file} and runs @command{restic backup}, creating backups
using rclone of all the files listed in the @code{files} field.

The @code{restic-backup-service-type} provides the ability to
instantaneously trigger a backup with the @code{trigger} Shepherd action:

@example
sudo herd trigger remote-ftp
@end example

@c %start of fragment

@deftp {Data Type} restic-backup-configuration
Available @code{restic-backup-configuration} fields are:

@table @asis
@item @code{jobs} (default: @code{'()}) (type: list-of-restic-backup-jobs)
The list of backup jobs for the current system.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} restic-backup-job
Available @code{restic-backup-job} fields are:

@table @asis
@item @code{restic} (default: @code{restic}) (type: package)
The restic package to be used for the current job.

@item @code{user} (default: @code{"root"}) (type: string)
The user used for running the current job.

@item @code{group} (default: @code{"root"}) (type: string)
The group used for running the current job.

@item @code{log-file} (type: maybe-string)
The file system path to the log file for this job.  By default the file will
have be @file{/var/log/restic-backup/@var{job-name}.log}, where
@var{job-name} is the name defined in the @code{name} field.  For Guix Home
services it defaults to
@file{$XDG_STATE_HOME/shepherd/restic-backup/@var{job-name}.log}.

@item @code{max-duration} (type: maybe-number)
The maximum duration in seconds that a job may last.  Past
@code{max-duration} seconds, the job is forcefully terminated.

@item @code{wait-for-termination?} (default: @code{#f}) (type: boolean)
Wait until the job has finished before considering executing it again;
otherwise, perform it strictly on every occurrence of event, at the risk of
having multiple instances running concurrently.

@item @code{repository} (type: string)
The restic repository target of this job.

@item @code{name} (type: string)
A string denoting a name for this job.

@item @code{password-file} (type: string)
Name of the password file, readable by the configured @code{user}, that will
be used to set the @env{RESTIC_PASSWORD} environment variable for the
current job.

@item @code{schedule} (type: gexp-or-string)
A string or a gexp representing the frequency of the backup.  Gexp must
evaluate to @code{calendar-event} records or to strings.  Strings must
contain Vixie cron date lines.

@item @code{requirement} (type: maybe-list-of-symbols)
The list of Shepherd services that this backup job depends upon.  When unset
it defaults to @code{'()}, for Guix Home.  Otherwise to
@code{'(user-processes file-systems)}.

@item @code{files} (default: @code{'()}) (type: list-of-lowerables)
The list of files or directories to be backed up.  It must be a list of
values that can be lowered to strings.

@item @code{verbose?} (default: @code{#f}) (type: boolean)
Whether to enable verbose output for the current backup job.

@item @code{extra-flags} (default: @code{'()}) (type: list-of-lowerables)
A list of values that are lowered to strings.  These will be passed as
command-line arguments to the current job @command{restic backup}
invocation.

@end table

@end deftp

@c %end of fragment

@cindex DLNA/UPnP
@subsubheading DLNA/UPnP Services

The @code{(gnu services upnp)} module offers services related to
@acronym{UPnP, Universal Plug and Play} and @acronym{DLNA, Digital Living
Network Alliance}, networking protocols that can be used for media streaming
and device interoperability within a local network.  For now, this module
provides the @code{readymedia-service-type}.

@uref{https://minidlna.sourceforge.net/, ReadyMedia} (formerly known as
MiniDLNA) is a DLNA/UPnP-AV media server.  The project's daemon,
@code{minidlnad}, can serve media files (audio, pictures, and video) to
DLNA/UPnP-AV clients available on the network.
@code{readymedia-service-type} is a Guix service that wraps around
ReadyMedia's @code{minidlnad}.

Consider the following configuration:
@lisp
(use-service-modules upnp @dots{})

(operating-system
  @dots{}
  (services
   (list (service readymedia-service-type
                  (readymedia-configuration
                   (media-directories
                    (list (readymedia-media-directory
                           (path "/media/audio")
                           (types '(A)))
                          (readymedia-media-directory
                           (path "/media/video")
                           (types '(V)))
                          (readymedia-media-directory
                           (path "/media/misc"))))
                   (extra-config '(("notify_interval" . "60")))))
         @dots{})))
@end lisp

This sets up the ReadyMedia daemon to serve files from the media folders
specified in @code{media-directories}.  The @code{media-directories} field
is mandatory.  All other fields (such as network ports and the server name)
come with a predefined default and can be omitted.

@quotation Nota
This service is also available for Guix Home, where it runs directly with
your user privileges (@pxref{Miscellaneous Home Services,
@code{home-readymedia-service-type}}).
@end quotation

@c %start of fragment

@deftp {Data Type} readymedia-configuration
Available @code{readymedia-configuration} fields are:

@table @asis
@item @code{readymedia} (default: @code{readymedia}) (type: package)
The ReadyMedia package to be used for the service.

@item @code{friendly-name} (default: @code{#f}) (type: maybe-string)
A custom name that will be displayed on connected clients.

@item @code{media-directories} (type: list)
The list of media folders to serve content from.  Each item is a
@code{readymedia-media-directory}.

@item @code{cache-directory} (default: @code{"/var/cache/readymedia"}) (type: string)
A folder for ReadyMedia's cache files.  If not existing already, the folder
will be created as part of the service activation and the ReadyMedia user
will be assigned ownership.

@item @code{log-directory} (default: @code{"/var/log/readymedia"}) (type: string)
A folder for ReadyMedia's log files.  If not existing already, the folder
will be created as part of the service activation and the ReadyMedia user
will be assigned ownership.

@item @code{port} (default: @code{#f}) (type: maybe-integer)
A custom port that the service will be listening on.

@item @code{extra-config} (default: @code{'()}) (type: alist)
An association list of further options, as accepted by ReadyMedia.
@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} readymedia-media-directory
A @code{media-directories} entry includes a folder @code{path} and,
optionally, the @code{types} of media files included within the folder.

@table @asis
@item @code{path} (type: string)
The media folder location.

@item @code{types} (default: @code{'()}) (type: list)
A list indicating the types of file included in the media folder.  Valid
values are combinations of individual media types, i.e. symbol @code{A} for
audio, @code{P} for pictures, @code{V} for video.  An empty list means that
no type is specified.
@end table

@end deftp

@c %end of fragment

@node Privileged Programs
@section Privileged Programs

@cindex privileged programs
@cindex programas con setuid
@cindex setgid programs
@cindex capabilities, POSIX
@cindex setcap
Algunos programas necesitan ejecutarse con privilegios de administración,
incluso cuando se ejecutan por usuarias sin privilegios. Un ejemplo notable
es el programa @command{passwd}, que las usuarias ejecutan para cambiar su
contraseña, y que necesita acceso a los archivos @file{/etc/passwd} y
@file{/etc/shadow}---un acceso normalmente restringido a la cuenta de
administración, por razones de seguridad obvias. Para solventarlo,
@command{passwd} tiene una marca @dfn{setuid de ``root''}, lo que significa
que siempre se ejecuta con los privilegios de dicha cuenta (@pxref{How
Change Persona,,, libc, The GNU C Library Reference Manual}, para más
información sobre el mecanismo setuid).

The store itself @emph{cannot} contain privileged 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 directly granting permissions to files that are in the
store, we let the system administrator @emph{declare} which programs should
be entrusted with these additional privileges.

The @code{privileged-programs} field of an @code{operating-system}
declaration contains a list of @code{<privileged-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
(privileged-program
  (program (file-append nfs-utils "/sbin/mount.nfs"))
  (setuid? #t))
@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{%default-privileged-programs} like this:

@lisp
(operating-system
  ;; Some fields omitted...
  (privileged-programs
    (append (list (privileged-program
                    (program (file-append nfs-utils "/sbin/mount.nfs"))
                    (setuid? #t)))
            %default-privileged-programs)))
@end lisp

@deftp {Data Type} privileged-program
This data type represents a program with special privileges, such as setuid

@table @asis
@item @code{program}
A file-like object to which all given privileges should apply.

@item @code{setuid?} (default: @code{#f})
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) group name (string) for the group owner of the program,
defaults to root.

@item @code{capabilities} (default: @code{#f})
A string representing the program's POSIX capabilities, as described by the
@code{cap_to_text(3)} man page from the libcap package, or @code{#f} to make
no changes.

@end table
@end deftp

A default set of privileged programs is defined by the
@code{%default-privileged-programs} variable of the @code{(gnu system)}
module.

@defvar {Variable Scheme} %default-privileged-programs
A list of @code{<privileged-program>} denoting common programs with elevated
privileges.

La lista incluye órdenes como @command{passwd}, @command{ping}, @command{su}
y @command{sudo}.
@end defvar

Under the hood, the actual privileged programs are created in the
@file{/run/privileged/bin} directory at system activation time.  The files
in this directory refer to the ``real'' binaries, which are in the store.

@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}
For users of Guix System, this is done by adding a package that provides
certificates to the @code{packages} field of the @code{operating-system}
declaration (@pxref{Referencia de operating-system}).  Guix includes one such
package, @code{nss-certs}, which is a set of CA certificates provided as
part of Mozilla's Network Security Services.

This package is part of @code{%base-packages}, so there is no need to
explicitly add it.  The @file{/etc/ssl/certs} directory, which is where most
applications and libraries look for certificates by default, points to the
certificates installed globally.

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{Name
Service Switch, 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.

@defvar %default-nss
Esta es la configuración predeterminada del selector de servicios de
nombres, un objeto @code{name-service-switch}.
@end defvar

@defvar %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 defvar

Furthermore, mDNS lookups could be restricted to IPv4 or IPv6 protocols
using the procedure @code{mdns-host-lookup-nss}.

@deffn {Procedure} mdns-host-lookup-nss @
       [#:ipv6? #t] [#:ipv4? #t] Return a @code{name-service-switch} object with
mDNS lookup restricted to specified protocols.
@end deffn

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

@defvar %base-initrd-modules
Esta es la lista de módulos del núcleo que se incluyen en el initrd
predeterminado.
@end defvar

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} raw-initrd 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.

When @var{qemu-networking?} is true, set up networking with the standard
QEMU parameters.

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} base-initrd sistemas-de-archivos @
       [#:mapped-devices '()] [#:keyboard-layout #f] @
[#:qemu-networking? #f] [#:volatile-root? #f] @
[#:linux-modules '()]
Devuelve como un objeto tipo-archivo una imagen de inicio en RAM genérica,
con los módulos del núcleo tomados de
@var{linux}. @var{sistemas-de-archivos} es una lista de sistemas de archivos
listos para ser montados por la imagen, posiblemente en adición al sistema
de archivos raíz especificado en la línea de órdenes del núcleo via
@option{root}. @var{mapped-devices} es una lista de asociación de
dispositivos a realizar antes de montar los @var{sistemas-de-archivos}.

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} expression->initrd exp @
       [#:guile %guile-static-initrd] [#:name "guile-initrd"]
Devuelve como un objeto tipo-archivo el initrd de Linux (un archivador cpio
comprimido con gzip) que contiene @var{guile} y que evalúa a @var{exp}, una
expresión-G, al arranque. Todas las derivaciones a las que @var{exp} hace
referencia se copian automáticamente en el 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-removable-bootloader}, @code{grub-efi-netboot-bootloader},
@code{grub-efi-netboot-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-bootloader
@code{grub-bootloader} permite el arranque en máquinas basadas en Intel en
modo ``antiguo'' BIOS.

@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-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

@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}}) below the sub-directory @file{efi/Guix}, 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 during installation.

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 for 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.  It is advised to
disable any TFTP write access!

Please note, that this bootloader will not modify the ‘UEFI Boot Manager’ of
the system.

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}.

If a local EFI System Partition (ESP) or a similar partition with a FAT file
system is mounted in @code{targets}, then symlinks cannot be created.  In
this case everything will be prepared for booting from local storage,
matching the behavior of @code{grub-efi-bootloader}, with the difference
that all GRUB binaries are copied to @code{targets}, necessary for booting
over the network.

@vindex grub-efi-netboot-removable-bootloader
@code{grub-efi-netboot-removable-bootloader} is identical to
@code{grub-efi-netboot-bootloader} with the exception that the sub-directory
@file{efi/boot} will be used instead of @file{efi/Guix} to comply with the
UEFI specification for removable media.

@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}.

@item @code{extra-initrd} (default: @code{#f})
File name of an additional initrd to load during the boot.  It may or may
not point to a file in the store, but the main use case is for out-of-store
files containing secrets.

In order to be able to provide decryption keys for LUKS devices, they need
to be available in the initial RAM disk.  However they cannot be stored
inside the usual initrd, since it is stored in the store and being
world-readable (as files in the store are) is not a desired property for an
initrd containing decryption keys.  You can therefore use this field to
instruct GRUB to also load a manually created initrd not stored in the
store.

For any use case not involving secrets, you should use regular initrd
(@pxref{Referencia de operating-system, @code{initrd}}) instead.

Suitable image can be created for example like this:

@example
echo /key-file.bin | cpio -oH newc >/key-file.cpio
chmod 0000 /key-file.cpio
@end example

After it is created, you can use it in this manner:

@lisp
;; Operating system with encrypted boot partition
(operating-system
  @dots{}
  (bootloader (bootloader-configuration
               (bootloader grub-efi-bootloader)
               (targets '("/boot/efi"))
               ;; Load the initrd with a key file...
               (extra-initrd "/key-file.cpio")))
  (mapped-devices
   (list (mapped-device
          (source (uuid "12345678-1234-1234-1234-123456789abc"))
          (target "my-root")
          (type luks-device-mapping)
          ;; ... and use it to unlock the root device.
          (arguments '(#:key-file "/key-file.bin"))))))
@end lisp

Be careful when using this option, since pointing to a file that is not
readable by the grub while booting will cause the boot to fail and require a
manual edit of the initrd line in the grub menu.

Currently only supported by GRUB.
@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.

For example, when running in QEMU it can be useful to use a text-based
console (use options @option{--nographic} @option{--serial mon:stdio}):

@lisp
'("console=com0")
@end lisp

To use the new and still experimental
@uref{https://darnassus.sceen.net/~hurd-web/rump_kernel/, rumpdisk
user-level disk driver} instead of GNU@tie{}Mach's in-kernel IDE driver, set
@code{kernel-arguments} to:

@lisp
'("noide")
@end lisp

Of course, these options can be combined:

@lisp
'("console=com0" "noide")
@end lisp

@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} 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 Invocación de @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

This effects all the configuration specified in @var{file}: user accounts,
system services, global package list, privileged programs, etc.  The command
starts system 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 X} or
@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}).

It adds a bootloader menu entry for the new OS configuration, ---unless
@option{--no-bootloader} is passed.  For GRUB, it moves entries for older
configurations to a submenu, allowing you to choose an older system
generation at boot time should you need it.

@cindex kexec, for fast reboots
@cindex rebooting @i{via} Linux kexec
On Linux, @command{guix system reconfigure} also loads the new system for
fast reboot @i{via} kexec: running @command{reboot --kexec} will boot the
new system by directly executing its kernel, thus bypassing the BIOS
initialization phase and bootloader (@pxref{Invoking reboot,,, shepherd, The
GNU Shepherd Manual}).  You can avoid this behavior by passing the
@option{--no-kexec} option.

@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

También puede seleccionar las generaciones que desea eliminar. El siguiente
ejemplo elimina todas las generaciones del sistema que tienen más de dos
meses de antigüedad:

@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 installer
Run the installer.  Usually the installer is built as an @file{iso} image,
copied to a USB Stick or DVD, and booted from (@ref{Instalación desde memoria USB y DVD}).  If your machine already runs Guix and you still want to run
the installer, e.g., for testing purposes, you can skip the step of creating
an @file{iso} and run for instance:

@example
guix system installer --dry-run
@end example

@quotation Nota
If you do not use @option{--dry-run} then you need to run as root.  Be
@emph{very careful} when running the installer as root, it can cause data
loss or render your system unbootable!
@end quotation

@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 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{mbr-hybrid-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-x86-64)/share/firmware/ovmf_x64.bin
@end example

When using the @code{mbr-hybrid-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).  In
case the virtual machine is going to be AArch64, you might want to take a
look at @code{qcow2-gpt} image type that installs bootloader only in EFI.

@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.

The generated script also supports the @option{--pid-file} option to write
the container process ID to a file. This can be used, along with
@command{guix container exec} to execute scripts within the container
(@pxref{Invocación de guix container}).

@quotation Nota
The @code{container} action requires Linux-libre 3.19 or newer.
@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{mbr-hybrid-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
Emite por la salida estándar el @dfn{grafo de dependencias} de los servicios
shepherd del sistema operativo definido en @var{archivo}. @xref{Servicios de Shepherd}, para más información y un grafo de ejemplo.

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 Invocación de @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.

You may also wish to roll back configurations on machines to a previous
generation.  You can do that using the @option{--roll-back} or @option{-r}
option like so:

@example
guix deploy --roll-back @var{file}
@end example

@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

@deftp {Data Type} hetzner-configuration
This is the data type describing the server that should be created for a
machine with an @code{environment} of @code{hetzner-environment-type}. It
allows you to configure deployment to a @acronym{VPS, virtual private
server} hosted by @uref{https://www.hetzner.com, Hetzner}.

@table @asis

@item @code{allow-downgrades?} (predeterminado: @code{#f})
Determina si se permiten instalaciones de versiones potencialmente
anteriores.

@item @code{authorize?} (predeterminado: @code{#t})
If true, the public signing key @code{"/etc/guix/signing-key.pub"} of the
machine that invokes @command{guix deploy} will be added to the operating
system ACL keyring of the target machine.

@item @code{build-locally?} (predeterminado: @code{#t})
If true, system derivations will be built on the machine that invokes
@command{guix deploy}, otherwise derivations are build on the target
machine.  Set this to @code{#f} if the machine you are deploying from has a
different architecture than the target machine and you can't build
derivations for the target architecture by other means, like offloading
(@pxref{Configuración de delegación del daemon}) or emulation
(@pxref{transparent-emulation-qemu, Transparent Emulation with QEMU}).

@item @code{delete?} (default: @code{#t})
If true, the server will be deleted when an error happens in the
provisioning phase. If false, the server will be kept in order to debug any
issues.

@item @code{ipv4} (default: @code{#t})
@itemx @code{ipv6} (default: @code{#t})
When false, no public IP address is attached.  Specify the name of an
existing primary ip to attach it to the machine.  Other values would create
a new address automatically.

@item @code{labels} (default: @code{'()})
A user defined alist of key/value pairs attached to the SSH key and the
server on the Hetzner API.  Keys and values must be strings,
e.g. @code{'(("environment" . "development"))}.  For more information, see
@uref{https://docs.hetzner.cloud/#labels, Labels}.

@item @code{location} (default: @code{"fsn1"})
The name of a @uref{https://docs.hetzner.com/cloud/general/locations,
location} to create the server in.  For example, @code{"fsn1"} corresponds
to the Hetzner site in Falkenstein, Germany, while @code{"sin"} corresponds
to its site in Singapore.

@item @code{server-type} (default: @code{"cx42"})
The name of the
@uref{https://docs.hetzner.com/cloud/servers/overview#server-types, server
type} this virtual server should be created with.  For example,
@code{"cx42"} corresponds to a x86_64 server that has 8 VCPUs, 16 GB of
memory and 160 GB of storage, while @code{"cax31"} to the AArch64
equivalent.  Other server types and their current prices can be found
@uref{https://www.hetzner.com/cloud/#pricing, here}.  The @code{"cpx11"}
server type is currently not supported, since its rescue system is too small
to bootstrap a Guix system from.

@item @code{ssh-key} (default: @code{#f})
If specified, the file name of the SSH private key to use to authenticate
with the remote host.

@item @code{ssh-public-key} (default: extracted from @code{ssh-key})
If specified, either a public key as returned by @code{string->public-key}
or the path to the SSH public key to use to authenticate with the remote
host.

@end table

When deploying a machine for the first time, the following steps are taken
to provision a server for the machine on the
@uref{https://www.hetzner.com/cloud, Hetzner Cloud} service:

@itemize

@item
Create the SSH key of the machine on the Hetzner API.

@item
Create a server for the machine on the Hetzner API.

@item
Format the root partition of the disk using the file system of the machine's
operating system.  Supported file systems are btrfs and ext4.

@item
Install a minimal Guix operating system on the server using the
@uref{https://docs.hetzner.com/cloud/servers/getting-started/rescue-system,
rescue mode}.  This minimal system is used to install the machine's
operating system, after rebooting.

@item
Reboot the server and apply the machine's operating system on the server.

@end itemize

Once the server has been provisioned and SSH is available, deployment
continues by delegating it to the @code{managed-host-environment-type}.

Servers on the Hetzner Cloud service can be provisioned on the AArch64
architecture using UEFI boot mode, or on the x86_64 architecture using BIOS
boot mode.  The @code{(gnu machine hetzner)} module exports the
@code{%hetzner-os-arm} and @code{%hetzner-os-x86} operating systems that are
compatible with those two architectures, and can be used as a base for
defining your custom operating system.

The following example shows the definition of two machines that are deployed
on the Hetzner Cloud service.  The first one uses the @code{%hetzner-os-arm}
operating system to run a server with 16 shared vCPUs and 32 GB of RAM on
the @code{aarch64} architecture, the second one uses the
@code{%hetzner-os-x86} operating system on a server with 16 shared vCPUs and
32 GB of RAM on the @code{x86_64} architecture.

@lisp
(use-modules (gnu machine)
             (gnu machine hetzner))

(list (machine
       (operating-system %hetzner-os-arm)
       (environment hetzner-environment-type)
       (configuration (hetzner-configuration
                       (server-type "cax41")
                       (ssh-key "/home/charlie/.ssh/id_rsa"))))
      (machine
       (operating-system %hetzner-os-x86)
       (environment hetzner-environment-type)
       (configuration (hetzner-configuration
                       (server-type "cpx51")
                       (ssh-public-key "/home/charlie/.ssh/id_rsa.pub")))))
@end lisp

@vindex GUIX_HETZNER_API_TOKEN
Passing this file to @command{guix deploy} with the environment variable
@env{GUIX_HETZNER_API_TOKEN} set to a valid Hetzner
@uref{https://docs.hetzner.com/cloud/api/getting-started/generating-api-token,
API key} should provision two machines for you.

@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
Use our QCOW image, the
@file{guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2} file, as the
backing store of the ``myhd'' drive.
@end table

El guión @command{run-vm.sh} predeterminado que devuelve la invocación de
@command{guix system vm} no añade una opción @command{-nic user} de manera
predeterminada. Para obtener acceso a la red desde la máquina virtual añada
el servicio @code{(dhcp-client-service)} a su definición de sistema y
arranque la máquina virtual mediante el uso de @command{$(guix system vm
config.scm) -nic user}. Un punto importante a tener en cuenta del uso de
@command{-ni user} para la obtención de red es que @command{ping} no
funcionará, puesto que usa el protocolo ICMP. Deberá usar una orden
diferente para comprobar la conectividad a la red, por ejemplo @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
Technically, developers can define @dfn{service types} to express these
relations.  There can be any number of services of a given type on the
system, for instance when running two instances with different parameters.

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)       ;concatenate the list of rules
                (extend (lambda (config rules)
                          (udev-configuration
                           (inherit config)
                           (rules (append (udev-configuration-rules config)
                                          rules)))))))
@end lisp

This is the service type for the
@uref{https://github.com/eudev-project/eudev, eudev device management
daemon}.  Compared to the previous example, in addition to an extension of
@code{shepherd-root-service-type}, we see two new fields:

@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} service tipo [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} service? obj
Devuelve verdadero si @var{obj} es un servicio.
@end deffn

@deffn {Procedimiento} service-kind servicio
Devuelve el tipo de @var{servicio}---es decir, un objeto
@code{<service-type>}.
@end deffn

@deffn {Procedimiento} service-value 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.

@defspec modify-services servicios @
  (tipo variable => 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 defspec

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} service-extension tipo-deseado 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} service-extension? 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} simple-service nombre deseado 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} fold-services servicios [#:target-type 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.

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar etc-profile-d-service-type
The type of the @file{/etc/profile.d} service.  This service is used to
create files under @file{/etc/profile.d}.  It takes as value a list of
file-like objects, as can be produced with @code{local-file},
@code{plain-file}, etc.  Note that provided files whose file names do not
end with @file{.sh} are @emph{not} added to @file{/etc/profile.d/} and are
silently dropped.  Package objects can also be provided directly to have
their @file{etc/profile.d/*.sh} prefixed files added.  A simple usage may
look like:

@example
(simple-service 'my-important-profile-file etc-profile-d-service-type
                (list (plain-file "youppi.sh" "HOW_IMPORTANT=very")))
@end example
@end defvar

@defvar etc-bashrc-d-service-type
The type of the @file{/etc/bashrc.d} service.  This service is used to
create files under @file{/etc/bashrc.d}.  It takes as value a list of
file-like objects, as can be produced with @code{local-file},
@code{plain-file}, etc.  Note that provided files whose file names do not
end with @file{.sh} are @emph{not} added to @file{/etc/profile.d/} and are
silently dropped.  The default value is made available via the
@var{%default-etc-bashrc-d-files} variable for users to extended.  Package
objects can also be provided directly to have their @file{etc/bashrc.d/*.sh}
prefixed files added.  Since the service is part @code{%base-services}, it
can be extended via @code{simple-service} like so:

@example
(use-package-modules gnome)     ;for the `vte' package

(simple-service 'vte-integration etc-bashrc-d-service-type
                (list (file-append vte "/etc/profile.d/vte.sh")))
@end example
@end defvar

@defvar vte-integration-service-type
This services adds the @file{/etc/bashrc.d/vte.sh} to your system, which
improves the Bash and Zsh experience when using VTE-powered terminal
emulators.  This causes for example the current directory to be displayed in
the terminal emulator's tab title, and the current directory to be preserved
when creating a new tab, among other features.  The value of the service is
the @code{vte} package to use.

@example
(use-package-modules gnome)     ;for the `vte' package

(service vte-integration-service-type vte)
@end example
@end defvar

@defvar privileged-program-service-type
Type for the ``privileged-program service''.  This service collects lists of
executable file names, passed as gexps, and adds them to the set of
privileged programs on the system (@pxref{Privileged Programs}).
@end defvar

@defvar 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 defvar

@cindex seguimiento de procedencia, del sistema operativo
@anchor{provenance-service-type}
@defvar 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 defvar

@defvar 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 defvar

@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{Introduction,,, 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{Defining Services,,, 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 @code{user-processes} Shepherd service
With very few exceptions, services that start a daemon must depend at least
on the @code{user-processes} service; this ensures that these daemons are
started after all the file systems have been mounted and that, during
shutdown, they are stopped before attempting to terminate remaining user
processes.

Similarly, services that do make mounts during their startup or operation,
should have @code{user-file-systems} as a requirement. @code{user-processes}
does depend on @code{user-file-systems} as well.  So direct requirement only
on @code{user-processes} is sufficient.

@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{respawn-limit} (default: @code{#f})
Set a limit on how many times and how frequently a service may be restarted
by Shepherd before it is disabled.  @xref{Defining Services,,, shepherd, The
GNU Shepherd Manual}, for details.

@item @code{respawn-delay} (default: @code{#f})
When true, this is the delay in seconds before restarting a failed service.

@item @code{start} (default: @code{#~(const #t)})
@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{free-form} (default: @code{#f})
When set, this field replaces the @code{start}, @code{stop}, and
@code{actions} fields.  It is meant to be used when the service definition
comes from some other source, typically the service collection provided by
the Shepherd proper (@pxref{Service Collection,,, shepherd, The GNU Shepherd
Manual}).

@cindex REPL service, for shepherd
For example, the snippet below defines a service for the Shepherd's built-in
@acronym{REPL, read-eval-print loop} service (@pxref{REPL Service,,,
shepherd, The GNU Shepherd Manual}):

@lisp
(shepherd-service
  (provision '(repl))
  (modules '((shepherd service repl)))
  (free-form #~(repl-service)))
@end lisp

In this case, the service object is returned by the @code{repl-service}
procedure of the Shepherd, so all the @code{free-form} G-expression does is
call that procedure.  Note that the @code{provision} field must be
consistent with the actual service provision.

@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{documentation}
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 documentation
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{Defining Services,,, shepherd, The GNU Shepherd Manual}, para
más información sobre acciones.
@end deftp

@cindex configuration file, of Shepherd services
@deffn {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

@defvar 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 defvar

@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

@anchor{shepherd-transient-timer-services}
@cindex @code{transient} service, Shepherd
@defvar shepherd-transient-service-type
This service type represents the Shepherd's @code{transient} service, which
lets you spawn commands in the background and interact with them as regular
Shepherd services; it is similar to @command{systemd-run}.

For example, the command below spawns @command{rsync} in the background, in
an environment where the @env{SSH_AUTH_SOCK} environment variable has the
given value:

@example
herd spawn transient -E SSH_AUTH_SOCK=$SSH_AUTH_SOCK -- \
  rsync -e ssh -vur . backup.example.org:
@end example

@xref{Transient Service Maker,,, shepherd, The GNU Shepherd Manual}, for
more info on the @code{transient} service.
@end defvar

@cindex @code{timer} service, Shepherd
@defvar shepherd-timer-service-type
This is the service type representing the Shepherd's @code{timer} service,
which lets you schedule the execution of commands, similar to the venerable
@command{at} command.  Here is an example:

@example
herd schedule timer at 07:00 -- mpg123 Music/alarm.mp3
@end example

@xref{Timer Service,,, shepherd, The GNU Shepherd Manual}, for more info on
the @code{timer} service.
@end defvar

@anchor{shepherd-system-log}
@cindex system log service, from Shepherd
@cindex syslogd, Shepherd system log service
@defvar shepherd-system-log-service-type
This service implements a @dfn{system log}, reading messages applications
send to @file{/dev/log} and writing them to files or terminals according to
user-defined rules.  It provides functionality traditionally implemented by
@command{syslogd} programs.

The value of services of this type must be a @code{system-log-configuration}
record, as described below.

This service is part of @code{%base-services} (@pxref{Servicios base}).
@end defvar

@c %start of fragment

@deftp {Data Type} system-log-configuration
Available @code{system-log-configuration} fields are:

@table @asis
@item @code{provision} (default: @code{(system-log syslogd)}) (type: list-of-symbols)
The name(s) of the system log service.

@item @code{requirement} (default: @code{(root-file-system)}) (type: list-of-symbols)
Dependencies of the system log service.

@item @code{kernel-log-file} (type: gexp-or-string-or-false)
File from which kernel messages are read, @file{/dev/kmsg} by default.

@item @code{message-destination} (default: @code{#f}) (type: gexp-or-false)
This gexp must evaluate to a procedure that, when passed a log message,
returns the list of files to write it to; @code{#f} is equivalent to using
@code{(default-message-destination-procedure)}.  @xref{System Log
Service,,,shepherd,The GNU Shepherd Manual}, for information on how to write
that procedure.

@item @code{date-format} (type: gexp-or-string)
String or string-valued gexp specifying how to format timestamps in log
files.  It must be a valid string for @code{strftime} (@pxref{Time,,,
guile,GNU Guile Reference Manual}), including delimiting space---e.g.,
@code{"%c "} for a format identical to that of traditional syslogd
implementations.

@item @code{history-size} (type: gexp-or-integer)
Number of logging messages kept in memory for the purposes of making them
available to @command{herd status system-log}.

@item @code{max-silent-time} (type: gexp-or-integer-or-false)
Time after which a mark is written to log files if nothing was logged during
that time frame.  When set to @code{#f}, this feature is disabled.

@end table

@end deftp


@c %end of fragment

@defvar %shepherd-root-service
Este servicio representa el PID@tie{}1.
@end defvar

@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, a helper used to
define a Scheme record type (@pxref{Record Overview,,, guile, GNU Guile
Reference Manual}).  The fields from this Scheme record can be serialized
using @dfn{serializers}, which are procedures that take some kind of Scheme
value and translates them into another Scheme value or @ref{Expresiones-G}.

@defmac define-configuration name clause1 clause2 @dots{}
Create a record type named @code{@var{name}} that contains the fields found
in the clauses.

A clause has the following form:

@example
(@var{field-name}
 @var{type-decl}
 @var{documentation}
 @var{option*}
 @dots{})
@end example

@var{field-name} is an identifier that denotes the name of the field in the
generated record.

@var{type-decl} is either @code{@var{type}} for fields that require a value
to be set or @code{(@var{type} @var{default-value})} otherwise.

@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{option*} is one of the following subclauses:

@table @asis
@item @code{empty-serializer}
Exclude this field from serialization.

@item @code{(serializer @var{serializer})}
@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 @ref{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.

An example of a simple serializer procedure:
@lisp
(define (serialize-boolean field-name value)
  (let ((value (if value "true" "false")))
    #~(string-append '#$field-name " = " #$value)))
@end lisp

@item @code{(sanitizer @var{sanitizer})}
@var{sanitizer} is a procedure which takes one argument, a user-supplied
value, and returns a ``sanitized'' value for the field.  If no sanitizer is
specified, a default sanitizer is used, which raises an error if the value
is not of type @var{type}.

An example of a sanitizer for a field that accepts both strings and symbols
looks like this:
@lisp
(define (sanitize-foo value)
  (cond ((string? value) value)
        ((symbol? value) (symbol->string value))
        (else (error "bad value"))))
@end lisp
@end table

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 defmac

@defmac define-maybe 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 defmac

@deffn {Procedure} maybe-value-set? value
Predicate to check whether a user explicitly specified the value of a maybe
field.
@end deffn

@deffn {Procedure} serialize-configuration configuration 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

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 {Procedure} generate-documentation documentation 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.  The same
value may be used for multiple @var{field-name}s, in case a field accepts
different types of configurations.

@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 {Procedure} configuration->documentation 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-configuration@} 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


@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
@menu
* Acceso a un sistema existente mediante chroot::  Acceso a un sistema 
                                                     existente mediante chroot
@end menu

@node Acceso a un sistema existente mediante chroot
@section Acceso a un sistema existente mediante chroot

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 --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /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

@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 a @code{home-environment} record,
such a configuration can be @dfn{instantiated} by an unprivileged user with
the @command{guix home} command (@pxref{Invocación de guix home}).

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
* Declarar el entorno personal::  Customizing your Home.
* Configurar el intérprete::  Activando entorno personal
* Servicios personal::       Especificar los servicios personal.
* Invocación de guix home::  Instanciar una configuración personal.
@end menu

@node Declarar el entorno personal
@section Declarar el entorno personal
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{Invocación de 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{Configurar el intérprete}).
@end quotation

@findex home-environment
@vindex %base-home-services
@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

If you're using Guix System, you can embed your home configuration in your
system configuration such that @command{guix system reconfigure} will deploy
both the system @emph{and} your home at once! @xref{guix-home-service-type,
@code{guix-home-service-type}}, for how to do that.

@node Configurar el intérprete
@section Configurar el intérprete
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 Servicios personal
@section Servicios personal
@cindex servicios personal

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{Servicio personal Mcron}; declare daemons by
extending @ref{Servicio personal de Shepherd}; add commands, which will be invoked
on by the Bash by extending @ref{Servicios personal de intérprete,
@code{home-bash-service-type}}.

A good way to discover available home services is using the @command{guix
home search} command (@pxref{Invocación de 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
* Servicios personal esenciales::  Environment variables, packages, on-* 
                                     scripts.
* Intérprete: Servicios personal de intérprete.  Intérpretes POSIX, Bash, 
                                                   Zsh.
* Mcron: Servicio personal Mcron.  Ejecución de tareas de usuario 
                                     programadas.
* Gestión de energía: Servicios personal de gestión de energía.  Services 
                                                                   for battery 
                                                                   power.
* Shepherd: Servicio personal de Shepherd.  Managing User's Daemons.
* SSH: Secure Shell.         Setting up the secure shell client.
* GPG: GNU Privacy Guard.    Setting up GPG and related tools.
* Desktop: Desktop Home Services.  Servicios para entornos gráficos.
* Guix: Guix Home Services.  Servicios para Guix.
* Backup: Backup Home Services.  Services for backing up User's files.
* Fonts: Fonts Home Services.  Servicios para gestión de tipografías del 
                                 usuario.
* Sound: Sound Home Services.  Dealing with audio.
* Mail: Mail Home Services.  Servicios para gestionar correo.
* Messaging: Messaging Home Services.  Servicios para gestionar mensajes.
* Media: Media Home Services.  Servicios para gestionar medio.
* Niri: Niri window manager.  Setting up the Niri.
* Sway: Sway window manager.  Setting up the Sway configuration.
* Networking: Networking Home Services.  Servicios de red.
* Secrets: Secrets Home Services.  Services for storing secrets.
* Miscellaneous: Miscellaneous Home Services.  More services.
@end menu
@c In addition to that Home Services can provide

@node Servicios personal esenciales
@subsection Servicios personal esenciales
There are a few essential home services defined in @code{(gnu home
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

@defvar 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)}.

@findex literal-string
@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)
                  ("LITERAL_VALUE" . ,(literal-string "$@{abc@}"))))
@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
export LITERAL_VALUE='$@{abc@}'
@end example

Notice that @code{literal-string} above lets us declare that a value is to
be interpreted as a @dfn{literal string}, meaning that ``special
characters'' such as the dollar sign will not be interpreted by the shell.

@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 defvar

@defvar 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 a string without importing its related module.
@end defvar

There are few more essential services, but users are not expected to extend
them.

@defvar 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 defvar

@defvar 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 defvar

@defvar 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_HOME} 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 appropriate 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 defvar

@cindex dot files in Guix Home
It is often the case that Guix Home users already have a setup for
versioning their user configuration files (also known as @emph{dot files})
in a single directory, and some way of automatically deploy changes to their
user home.

@cindex Stow-like dot file management
The @code{home-dotfiles-service-type} from @code{(gnu home services
dotfiles)} is designed to ease the way into using Guix Home for this kind of
users, allowing them to point the service to their dotfiles directory
without migrating them to Guix native configurations.

Please keep in mind that it is advisable to keep your dotfiles directories
under version control, for example in the same repository where you'd track
your Guix Home configuration.

There are two supported dotfiles directory layouts, for now. The
@code{'plain} layout, which is structured as follows:

@example
~$ tree -a ./dotfiles/
dotfiles/
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .nix-channels
├── .tmux.conf
└── .vimrc
@end example

This tree structure is installed as is to the home directory upon
@command{guix home reconfigure}.

The @code{'stow} layout, which must follow the layout suggested by
@uref{https://www.gnu.org/software/stow/, GNU Stow} presents an additional
application specific directory layer, just like:

@example
~$ tree -a ./dotfiles/
dotfiles/
├── git
│   └── .gitconfig
├── gpg
│   └── .gnupg
│       ├── gpg-agent.conf
│       └── gpg.conf
├── guile
│   └── .guile
├── guix
│   └── .config
│       └── guix
│           └── channels.scm
├── nix
│   ├── .config
│   │   └── nixpkgs
│   │       └── config.nix
│   └── .nix-channels
├── tmux
│   └── .tmux.conf
└── vim
    └── .vimrc

13 directories, 10 files
@end example

For an informal specification please refer to the Stow manual
(@pxref{Introduction,,, stow, The GNU Stow Manual}). This tree structure is
installed following GNU Stow's logic to the home directory upon
@command{guix home reconfigure}.

A suitable configuration with a @code{'plain} layout could be:

@lisp
(home-environment
  ;; @dots{}
  (services
    (service home-dotfiles-service-type
             (home-dotfiles-configuration
               (directories '("./dotfiles"))))))
@end lisp

The expected home directory state would then be:

@example
.
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .nix-channels
├── .tmux.conf
└── .vimrc
@end example

@defvar home-dotfiles-service-type
Return a service which is very similar to @code{home-files-service-type}
(and actually extends it), but designed to ease the way into using Guix Home
for users that already track their dotfiles under some kind of version
control.  This service allows users to point Guix Home to their dotfiles
directory and have their files automatically provisioned to their home
directory, without migrating all of their dotfiles to Guix native
configurations.
@end defvar

@c %start of fragment

@deftp {Data Type} home-dotfiles-configuration
Available @code{home-dotfiles-configuration} fields are:

@table @asis
@item @code{source-directory} (default: @code{(current-source-directory)}) (type: string)
The path where dotfile directories are resolved.  By default dotfile
directories are resolved relative the source location where
@code{home-dotfiles-configuration} appears.

@item @code{layout} (default: @code{'plain}) (type: symbol)
The intended layout of the specified @code{directory}.  It can be either
@code{'stow} or @code{'plain}.

@item @code{directories} (default: @code{'()}) (type: list-of-strings)
The list of dotfiles directories where @code{home-dotfiles-service-type}
will look for application dotfiles.

@item @code{packages} (type: maybe-list-of-strings)
The names of a subset of the GNU Stow package layer directories.  When
provided the @code{home-dotfiles-service-type} will only provision dotfiles
from this subset of applications.  This field will be ignored if
@code{layout} is set to @code{'plain}.

@item @code{excluded} (default: @code{'(".*~" ".*\\.swp" "\\.git" "\\.gitignore")}) (type: list-of-strings)
The list of file patterns @code{home-dotfiles-service-type} will exclude
while visiting each one of the @code{directories}.

@end table

@end deftp


@c %end of fragment

@defvar home-xdg-configuration-files-service-type
The service is very similar 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_HOME} 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_HOME/sway/config (by symlink-manager)
  ("tmux/tmux.conf" ,(local-file "./tmux.conf")))
@end lisp
@end defvar

@defvar 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 defvar

@defvar 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_HOME}.  For example symlink for
@file{files/.config/sway/config} will end up in
@file{$XDG_CONFIG_HOME/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 defvar


@node Servicios personal de intérprete
@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{Configurar el intérprete}, 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

@c %start of fragment
@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 setting @env{PS1}, @env{SHELL}, and ensuring
@file{/etc/profile} is sourced for non-interactive SSH shells.  If you use
Guix System, is it safe to set this to @code{#f}, as in this case this is
already taken care of by the globally installed @file{/etc/bashrc}.

@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{Servicios personal esenciales}).  The contents of this field will be added
after the contents of the @code{bash-profile} field.

@item @code{variables} (default: @code{()}) (type: alist)
Bash variables (not to be confused with environment variables) to be set in
@file{.bashrc} for use by interactive shells.  A typical example of such
variables is @code{HISTSIZE} and related history variables (@pxref{Bash
Variables,,, bash,Bash Reference Manual}).

@item @code{aliases} (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


@c %end of fragment

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 shell
variable, @env{PS1}:

@lisp
(define bash-fancy-prompt-service
  (simple-service 'bash-fancy-prompt
                  home-bash-service-type
                  (home-bash-extension
                   (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.

@c %start of fragment

@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{variables} (default: @code{()}) (type: alist)
Extra Bash variables (not to be confused with environment variables) to be
set in @file{.bashrc} for use by interactive shells.

@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

@c %end of fragment

@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

@subsubheading Inputrc Profile Service
@cindex inputrc
@cindex readline

The @uref{https://tiswww.cwru.edu/php/chet/readline/rltop.html, GNU Readline
package} includes Emacs and vi editing modes, with the ability to customize
the configuration with settings in the @file{~/.inputrc} file.  With the
@code{gnu home services shells} module, you can setup your readline
configuration in a predictable manner, as shown below.  For more information
about configuring an @file{~/.inputrc} file, @pxref{Readline Init File,,,
readline, GNU Readline}.

@defvar home-inputrc-service-type

This is the service to setup various @file{.inputrc} configurations. The
settings in @file{.inputrc} are read by all programs which are linked with
GNU Readline.

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-inputrc-service-type
         (home-inputrc-configuration
           (key-bindings
            `(("Control-l" . "clear-screen")))
           (variables
            `(("bell-style" . "visible")
              ("colored-completion-prefix" . #t)
              ("editing-mode" . "vi")
              ("show-mode-in-prompt" . #t)))
           (conditional-constructs
            `(("$if mode=vi" .
               ,(home-inputrc-configuration
                  (variables
                   `(("colored-stats" . #t)
                     ("enable-bracketed-paste" . #t)))))
              ("$else" .
               ,(home-inputrc-configuration
                  (variables
                   `(("show-all-if-ambiguous" . #t)))))
              ("endif" . #t)
              ("$include" . "/etc/inputrc")
              ("$include" . ,(file-append
                               (specification->package "readline")
                               "/etc/inputrc"))))))
@end lisp

The example above starts with a combination of @code{key-bindings} and
@code{variables}.  The @code{conditional-constructs} show how it is possible
to add conditionals and includes.  In the example above @code{colored-stats}
is only enabled if the editing mode is @code{vi} style, and it also reads
any additional configuration located in @file{/etc/inputrc} or in
@file{/gnu/store/@dots{}-readline/etc/inputrc}.

The value associated with a @code{home-inputrc-service-type} instance must
be a @code{home-inputrc-configuration} record, as described below.

@end defvar

@anchor{home-inputrc-configuration}
@deftp {Data Type} home-inputrc-configuration
Available @code{home-inputrc-configuration} fields are:

@table @asis
@item @code{key-bindings} (default: @code{'()}) (type: alist)
Association list of readline key bindings to be added to the
@file{~/.inputrc} file.

@lisp
'((\"Control-l\" . \"clear-screen\"))
@end lisp

turns into

@example
Control-l: clear-screen
@end example

@item @code{variables} (default: @code{'()}) (type: alist)
Association list of readline variables to set.

@lisp
'((\"bell-style\" . \"visible\")
  (\"colored-completion-prefix\" . #t))
@end lisp

turns into

@example
set bell-style visible
set colored-completion-prefix on
@end example

@item @code{conditional-constructs} (default: @code{'()}) (type: alist)
Association list of conditionals to add to the initialization file.  This
includes @command{$if}, @command{else}, @command{endif} and
@command{include} and they receive a value of another
@command{home-inputrc-configuration}.

@lisp
(conditional-constructs
 `((\"$if mode=vi\" .
     ,(home-inputrc-configuration
        (variables
         `((\"show-mode-in-prompt\" . #t)))))
   (\"$else\" .
     ,(home-inputrc-configuration
        (key-bindings
         `((\"Control-l\" . \"clear-screen\")))))
   (\"$endif\" . #t)))
@end lisp

turns into

@example
$if mode=vi
set show-mode-in-prompt on
$else
Control-l: clear-screen
$endif
@end example

@item @code{extra-content} (default: @code{""}) (type: text-config)
Extra content appended as-is to the configuration file.  Run @command{man
readline} for more information about all the configuration options.

@end table
@end deftp

@node Servicio personal Mcron
@subsection Ejecución de tareas de usuario programadas

@cindex cron, per-user
@cindex mcron, per-user
@cindex scheduling jobs per-user
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{mcron-service, mcron reference}), 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.

@quotation Nota
We recommend defining periodic tasks as Shepherd timers, which provide more
flexibility than mcron.  @xref{Servicio personal de Shepherd}, for more info.
@end quotation

@defvar home-mcron-service-type
This is the type of the @code{mcron} home service, whose value is a
@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 defvar

@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 Servicios personal de gestión de energía
@subsection Servicios personal de gestión de energía

@cindex gestión de energía
The @code{(gnu home services pm)} module provides home services pertaining
to battery power.

@defvar 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 defvar

@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 Servicio personal de Shepherd
@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{Introduction,,, 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.

@defvar 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 defvar

@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 daemonize? (default: @code{#t})
Whether or not to run Shepherd in the background.

@item silent? (default: @code{#t})
When true, the @command{shepherd} process does not write anything to
standard output when started automatically.

@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

@cindex timers, per-user
The Shepherd allows you to define @dfn{timers}, a special type of service
that performs a given task periodically.  Just like you can define timers at
the system level (@pxref{Ejecución de tareas programadas}), you can do so in your
home environment.

The example below defines a home environment where a Shepherd timer runs the
@command{mkid} command twice per day (@pxref{mkid invocation,,, idutils, ID
Database Utilities}).  It does so by extending
@code{home-shepherd-service-type} with @code{simple-service}; the Shepherd
timer itself is produced by the @code{shepherd-timer} procedure
(@pxref{shepherd-timer-procedure, @code{shepherd-timer}}), which is given
the service name, a gexp specifying its schedule, and a gexp specifying the
command to run.

@lisp
(use-modules (gnu) (guix)
             (gnu home services shepherd)
             (gnu packages idutils))

(define idutils-service
  ;; Index my 'doc' directory everyday at 12:15PM and 7:15PM.
  (simple-service
   'update-idutils-database home-shepherd-service-type
   (list (shepherd-timer '(update-idutils-database)
                         #~(calendar-event #:hours '(12 19)
                                           #:minutes '(15))
                         #~(#$(file-append idutils "/bin/mkid")
                            "doc")))))

(home-environment
  ;; @dots{}
  (services (append (list idutils-service)
                    %base-home-services)))
@end lisp

@xref{Timers,,, shepherd, The GNU Shepherd Manual} for more information on
Shepherd timers.

@cindex log rotation, for user services
The Shepherd also comes with a @dfn{log rotation service}, which compresses
and then deletes old log files produced by services and daemons that it
runs.  This service is made available through
@code{home-log-rotation-service-type} as described below.

@defvar home-log-rotation-service-type
This is the service type for the user Shepherd log rotation service
(@pxref{Log Rotation Service,,, shepherd, The GNU Shepherd Manual}).  Its
value must be a @code{log-rotation-configuration} record, exactly as for its
system-wide counterpart.  @xref{log-rotation-configuration}, for its
reference.

This service is part of @code{%base-home-services}.
@end defvar

@defvar home-shepherd-transient-service-type
@defvarx home-shepherd-timer-service-type
These are the @code{timer} and @code{transient} Shepherd services.  The
former lets you schedule command execution for later, while the latter can
run commands in the background as a regular service.

@xref{shepherd-transient-timer-services, the system @code{timer} and
@code{transient} services}, which are their Guix System counterparts, for
more info.
@end defvar

@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.

@defvar 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 defvar

@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} (default: @code{#false})
The default @code{#false} value means: Leave any
@file{~/.ssh/authorized_keys} file alone.  Otherwise, 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.

@item @code{add-keys-to-agent} (default: @code{no})
This string specifies whether keys should be automatically added to a
running ssh-agent.  If this option is set to @code{yes} and a key is loaded
from a file, the key and its passphrase are added to the agent with the
default lifetime, as if by @code{ssh-add}.  If this option is set to
@code{ask}, @code{ssh} will require confirmation.  If this option is set to
@code{confirm}, each use of the key must be confirmed.  If this option is
set to @code{no}, no keys are added to the agent.  Alternately, this option
may be specified as a time interval to specify the key's lifetime in
@code{ssh-agent}, after which it will automatically be removed.  The
argument must be @code{no}, @code{yes}, @code{confirm} (optionally followed
by a time interval), @code{ask} or a time interval.
@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.  A @code{openssh-host} must define only
@code{name} or @code{match-criteria}.  Use host-name @code{\"*\"} for
top-level options.

@item @code{host-name} (type: maybe-string)
Host name---e.g., @code{"foo.example.org"} or @code{"192.168.1.2"}.

@item @code{match-criteria} (type: maybe-match-criteria)
When specified, this string denotes the set of hosts to which the entry
applies, superseding the @code{host-name} field.  Its first element must be
all or one of @code{ssh-match-keywords}.  The rest of the elements are
arguments for the keyword, or other criteria.  A @code{openssh-host} must
define only @code{name} or @code{match-criteria}.  Other host configuration
options will apply to all hosts matching @code{match-criteria}.

@item @code{address-family} (type: maybe-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).  Additionally, the field
can be left unset to allow 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?} (type: maybe-boolean)
Whether to forward remote client connections to the local X11 graphical
display.

@item @code{forward-x11-trusted?} (type: maybe-boolean)
Whether remote X11 clients have full access to the original X11 graphical
display.

@item @code{forward-agent?} (type: maybe-boolean)
Whether the authentication agent (if any) is forwarded to the remote
machine.

@item @code{compression?} (type: maybe-boolean)
Whether to compress data in transit.

@item @code{proxy} (type: maybe-proxy-command-or-jump-list)
The command to use to connect to the server or a list of SSH hosts to jump
through before connecting to the server.  The field may be set to either a
@code{proxy-command} or a list of @code{proxy-jump} records.

As an example, a @code{proxy-command} to connect via an HTTP proxy at
192.0.2.0 would be constructed with: @code{(proxy-command "nc -X connect -x
192.0.2.0:8080 %h %p")}.

@deftp {Data Type} proxy-jump
Available @code{proxy-jump} fields are:

@table @asis
@item @code{user} (type: maybe-string)
User name on the remote host.

@item @code{host-name} (type: string)
Host name---e.g., @code{foo.example.org} or @code{192.168.1.2}.

@item @code{port} (type: maybe-natural-number)
TCP port number to connect to.

@end table

@end deftp

@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

@cindex Parcimonie, Home service
The @code{parcimonie} service runs a daemon that slowly refreshes a GnuPG
public key from a keyserver.  It refreshes one key at a time; between every
key update parcimonie sleeps a random amount of time, long enough for the
previously used Tor circuit to expire.  This process is meant to make it
hard for an attacker to correlate the multiple key update.

As an example, here is how you would configure @code{parcimonie} to refresh
the keys in your GnuPG keyring, as well as those keyrings created by Guix,
such as when running @code{guix import}:

@lisp
(service home-parcimonie-service-type
         (home-parcimonie-configuration
           (refresh-guix-keyrings? #t)))
@end lisp

This assumes that the Tor anonymous routing daemon is already running on
your system.  On Guix System, this can be achieved by setting up
@code{tor-service-type} (@pxref{Servicios de red,
@code{tor-service-type}}).

The service reference is given below.

@defvar parcimonie-service-type
This is the service type for @command{parcimonie}
(@uref{https://salsa.debian.org/intrigeri/parcimonie, Parcimonie's web
site}).  Its value must be a @code{home-parcimonie-configuration}, as shown
below.
@end defvar

@c %start of fragment

@deftp {Data Table} home-parcimonie-configuration
Available @code{home-parcimonie-configuration} fields are:

@table @asis
@item @code{parcimonie} (default: @code{parcimonie}) (type: file-like)
The parcimonie package to use.

@item @code{verbose?} (default: @code{#f}) (type: boolean)
Whether to have more verbose logging from the service.

@item @code{gnupg-already-torified?} (default: @code{#f}) (type: boolean)
Whether GnuPG is already configured to pass all traffic through
@uref{https://torproject.org, Tor}.

@item @code{refresh-guix-keyrings?} (default: @code{#f}) (type: boolean)
Guix creates a few keyrings in the @var{$XDG_CONFIG_HOME}, such as when
running @code{guix import} (@pxref{Invocación de guix import}).  Setting this to
@code{#t} will also refresh any keyrings which Guix has created.

@item @code{extra-content} (default: @code{#f}) (type: raw-configuration-string)
Raw content to add to the parcimonie command.

@end table

@end deftp

@c %end of fragment

@cindex ssh-agent
The @uref{https://www.openssh.com, OpenSSH package} includes a daemon, the
@command{ssh-agent} command, that manages keys to connect to remote machines
using the @acronym{SSH, secure shell} protocol.  With the @code{(gnu home
services ssh)} service, you can configure the OpenSSH ssh-agent to run upon
login.  @xref{GNU Privacy Guard, @code{home-gpg-agent-service-type}}, for an
alternative to OpenSSH's @command{ssh-agent}.


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-ssh-agent-service-type
         (home-ssh-agent-configuration
          (extra-options '("-t" "1h30m"))))
@end lisp

@defvar home-ssh-agent-service-type
This is the type of the @code{ssh-agent} home service, whose value is a
@code{home-ssh-agent-configuration} object.
@end defvar

@deftp {Data Type} home-ssh-agent-configuration
Available @code{home-ssh-agent-configuration} fields are:

@table @asis
@item @code{openssh} (default: @code{openssh}) (type: file-like)
The OpenSSH package to use.

@item @code{socket-directory} (default: @code{@env{XDG_RUNTIME_DIR}/ssh-agent"}) (type: gexp)
The directory to write the ssh-agent's @file{socket} file.

@item @code{extra-options} (predeterminadas: @code{'()})
Extra options will be passed to @command{ssh-agent}, please run @command{man
ssh-agent} for more information.

@end table
@end deftp

@node GNU Privacy Guard
@subsection GNU Privacy Guard

@cindex GNU Privacy Guard, Home service
@cindex GPG, Home service
The @code{(gnu home services gnupg)} module provides services that help you
set up the GNU Privacy Guard, also known as GnuPG or GPG, in your home
environment.

@cindex gpg-agent, Home service
@cindex SSH agent, with gpg-agent
The @code{gpg-agent} service configures and sets up GPG's agent, the program
that is responsible for managing OpenPGP private keys and, optionally,
OpenSSH (secure shell) private keys (@pxref{Invoking GPG-AGENT,,, gnupg,
Using the GNU Privacy Guard}).

As an example, here is how you would configure @code{gpg-agent} with SSH
support such that it uses the Emacs-based Pinentry interface when prompting
for a passphrase:

@lisp
(service home-gpg-agent-service-type
         (home-gpg-agent-configuration
          (pinentry-program
           (file-append pinentry-emacs "/bin/pinentry-emacs"))
          (ssh-support? #t)))
@end lisp

The service reference is given below.

@defvar home-gpg-agent-service-type
This is the service type for @command{gpg-agent} (@pxref{Invoking
GPG-AGENT,,, gnupg, Using the GNU Privacy Guard}).  Its value must be a
@code{home-gpg-agent-configuration}, as shown below.
@end defvar

@c %start of fragment

@deftp {Data Type} home-gpg-agent-configuration
Available @code{home-gpg-agent-configuration} fields are:

@table @asis
@item @code{gnupg} (default: @code{gnupg}) (type: file-like)
The GnuPG package to use.

@item @code{pinentry-program} (type: file-like)
Pinentry program to use.  Pinentry is a small user interface that
@command{gpg-agent} delegates to anytime it needs user input for a
passphrase or @acronym{PIN,personal identification number} (@pxref{Top,,,
pinentry,Using the PIN-Entry}).

@item @code{ssh-support?} (default: @code{#f}) (type: boolean)
Whether to enable @acronym{SSH,secure shell} support.  When true,
@command{gpg-agent} acts as a drop-in replacement for OpenSSH's
@command{ssh-agent} program, taking care of OpenSSH secret keys and
directing passphrase requests to the chosen Pinentry program.

@item @code{default-cache-ttl} (default: @code{600}) (type: integer)
Time a cache entry is valid, in seconds.

@item @code{max-cache-ttl} (default: @code{7200}) (type: integer)
Maximum time a cache entry is valid, in seconds.  After this time a cache
entry will be expired even if it has been accessed recently.

@item @code{default-cache-ttl-ssh} (default: @code{1800}) (type: integer)
Time a cache entry for SSH keys is valid, in seconds.

@item @code{max-cache-ttl-ssh} (default: @code{7200}) (type: integer)
Maximum time a cache entry for SSH keys is valid, in seconds.

@item @code{extra-content} (default: @code{""}) (type: raw-configuration-string)
Raw content to add to the end of @file{~/.gnupg/gpg-agent.conf}.

@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.

@cindex X Window, for Guix Home services
@cindex X11, in Guix Home
@defvar home-x11-service-type
This is the service type representing the X Window graphical display server
(also referred to as ``X11'').

X Window is necessarily started by a system service; on Guix System,
starting it is the responsibility of @code{gdm-service-type} and similar
services (@pxref{Sistema X Window}).  At the level of Guix Home, as an unprivileged
user, we cannot start X Window; all we can do is check whether it is
running.  This is what this service does.

As a user, you probably don't need to worry or explicitly instantiate
@code{home-x11-service-type}.  Services that require an X Window graphical
display, such as @code{home-redshift-service-type} below, instantiate it and
depend on its corresponding @code{x11-display} Shepherd service
(@pxref{Servicio personal de Shepherd}).

When X Window is running, the @code{x11-display} Shepherd service starts and
sets the @env{DISPLAY} environment variable of the @command{shepherd}
process, using its original value if it was already set; otherwise, it fails
to start.

The service can also be forced to use a given value for @env{DISPLAY}, like
so:

@example
herd start x11-display :3
@end example

In the example above, @code{x11-display} is instructed to set @env{DISPLAY}
to @code{:3}.
@end defvar

@defvar 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 defvar

@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

@defvar 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 defvar

@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

@defvar home-unclutter-service-type
This is the service type for Unclutter, a program that runs on the
background of an X11 session and detects when the X pointer hasn't moved for
a specified idle timeout, after which it hides the cursor so that you can
focus on the text underneath.  Its associated value must be a
@code{home-unclutter-configuration} record, as shown below.

A typical configuration, where we manually specify the idle timeout (in
seconds), might look like this:

@lisp
(service home-unclutter-service-type
         (home-unclutter-configuration
          (idle-timeout 2)))
@end lisp
@end defvar

@deftp {Data Type} home-unclutter-configuration
The configuration record for @code{home-unclutter-service-type}.

@table @asis
@item @code{unclutter} (default: @code{unclutter}) (type: file-like)
Unclutter package to use.

@item @code{idle-timeout} (default: @code{5}) (type: integer)
A timeout in seconds after which to hide cursor.
@end table

@end deftp

@defvar home-xmodmap-service-type
This is the service type for the
@uref{https://gitlab.freedesktop.org/xorg/app/xmodmap,xmodmap} utility to
modify keymaps and pointer button mappings under the Xorg display server.
Its associated value must be a @code{home-xmodmap-configuration} record, as
shown below.

The @code{key-map} field takes a list of objects, each of which is either a
@dfn{statement} (a string) or an @dfn{assignment} (a pair of strings).  As
an example, the snippet below swaps around the @kbd{Caps_Lock} and the
@kbd{Control_L} keys, by first removing the keysyms (on the right-hand side)
from the corresponding modifier maps (on the left-hand side), re-assigning
them by swapping each other out, and finally adding back the keysyms to the
modifier maps.

@lisp
(service home-xmodmap-service-type
         (home-xmodmap-configuration
          (key-map '(("remove Lock" . "Caps_Lock")
                     ("remove Control" . "Control_L")
                     ("keysym Control_L" . "Caps_Lock")
                     ("keysym Caps_Lock" . "Control_L")
                     ("add Lock" . "Caps_Lock")
                     ("add Control" . "Control_L")))))
@end lisp
@end defvar

@deftp {Data Type} home-xmodmap-configuration
The configuration record for @code{home-xmodmap-service-type}.  Its
available fields are:

@table @asis
@item @code{xmodmap} (default: @code{xmodmap}) (type: file-like)
The @code{xmodmap} package to use.

@item @code{key-map} (default: @code{'()}) (type: list)
The list of expressions to be read by @code{xmodmap} on service startup.

@end table
@end deftp

@defvar home-startx-command-service-type
Add @command{startx} to the home profile putting it onto @env{PATH}.

The value for this service is a @code{<xorg-configuration>} object which is
passed to the @code{xorg-start-command-xinit} procedure producing the
@command{startx} used.  Default value is @code{(xorg-configuration)}.
@end defvar

@defvar home-darkman-service-type
This is the service type for the
@uref{https://gitlab.com/WhyNotHugo/darkman, Darkman}, a program for
dark-mode and light-mode transitions on Unix-like desktops.  It invokes
scripts in @code{$XDG_DATA_DIRS/dark-mode.d} at sundown, and invokes scripts
in @code{$XDG_DATA_DIRS/light-mode.d} at sunrise.  Darkman tries to
determine the user's current location from:
@itemize
@item The config file.
@item The cache file from last time it ran.
@item Using the system geoclue.
@end itemize
@end defvar

@deftp {Data Type} home-darkman-configuration
The configuration record for @code{home-darkman-service-type}.  Its
available fields are:

@table @asis
@item @code{darkman} (default: @code{darkman}) (type: file-like)
The @code{darkman} package to use.

@item @code{latitude} (type: maybe-number)
Latitude, used at startup or when @code{use-geoclue} is @code{#f}.  More
than one decimal point is generally not needed.

@item @code{longitude} (type: maybe-number)
Longitude, used at startup or when @code{use-geoclue} is @code{#f}.  More
than one decimal point is generally not needed.

@item @code{use-geoclue} (default: @code{#f}) (type: boolean)
Whether to use a local geoclue instance to determine the current location.
Setting this to false without explicitly setting latitude and longtitude
disables automatic transitions entirely.

@item @code{dbus-server} (default: @code{#t}) (type: boolean)
Whether to expose the current mode via darkman's own D-Bus API.

@item @code{portal} (default: @code{#t}) (type: boolean)
Whether to expose the current mode via the XDG settings portal D-Bus API.

@end table
@end deftp

@defvar home-gcr-ssh-agent-service-type

GNOME Keyring used to be able to act as a wrapper over @command{ssh-agent}.
It would display a graphical password entry dialog, including a checkbox to
remember the password, which, if selected, would allow fully passwordless
use of that key.

The SSH functionality is disabled by default in
@command{gnome-keyring-daemon} builds since version
@uref{https://gitlab.gnome.org/GNOME/gnome-keyring/-/commit25c5a1982467802fa12c6852b03c57924553ba73,
1.46}.  It has been
@uref{https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/67, moved} into
@command{gcr-ssh-agent}, which is part of the @code{gcr} package.

To enable the SSH agent functionality it is sufficient to add the following
to your Home configuration.

@lisp
(use-modules (gnu home services gnome) ;for 'home-gcr-ssh-agent-service-type'
             @dots{})

(home-environment
  (services
    (list
      @dots{}
      (service home-gcr-ssh-agent-service-type))))
@end lisp
@end defvar

@deftp {Data Type} gcr-ssh-agent-configuration
The configuration record for @code{home-gcr-ssh-agent-service-type}.  Its
available fields are:

@table @asis
@item @code{package} (default: @code{gcr}) (type: package)
The @code{gcr} package to use.

@item @code{log-file} (type: maybe-string)
Where the service will write its logs.  If unset, it defaults to
@file{$HOME/.local/state/shepherd/gcr-ssh-agent.log}.

@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.

@defvar 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 defvar

@node Backup Home Services
@subsection Backup Services

The @code{(gnu home services backup)} module offers services for backing up
file system trees.  For now, it provides the
@code{home-restic-backup-service-type}.

With @code{home-restic-backup-service-type}, you can periodically back up
directories and files with @uref{https://restic.net/, Restic}, which
supports end-to-end encryption and deduplication.  Consider the following
configuration:

@lisp
(use-modules (gnu home services backup) ;for 'restic-backup-job', 'home-restic-backup-service-type'
             (gnu packages sync)        ;for 'rclone'
             @dots{})

(home-environment

  (packages (list rclone    ;for use by restic
                  @dots{}))
  (services
    (list
      @dots{}
      (simple-service 'backup-jobs
                      home-restic-backup-service-type
                      (list (restic-backup-job
                              (name "remote-ftp")
                              (repository "rclone:remote-ftp:backup/restic")
                              (password-file "/home/alice/.restic")
                              ;; Every day at 23.
                              (schedule "0 23 * * *")
                              (files '("/home/alice/.restic"
                                       "/home/alice/.config/rclone"
                                       "/home/alice/Pictures"))))))))
@end lisp

In general it is preferable to extend the
@code{home-restic-backup-service-type}, as shown in the example above.  This
is because it takes care of wrapping everything with @code{for-home}, which
enables the @code{home-restic-backup-service-type} and
@code{restic-backup-service-type} to share the same codebase.

For a custom configuration, wrap your @code{restic-backup-configuration} in
@code{for-home}, as in this example:

@lisp
(use-modules (gnu services)             ;for 'for-home'
             (gnu services backup)      ;for 'restic-backup-job' and 'restic-backup-configuration'
             (gnu home services backup) ;for 'home-restic-backup-service-type'
             (gnu packages sync)        ;for 'rclone'
             @dots{})

(home-environment

  (packages (list rclone    ;for use by restic
                  @dots{}))
  (services
    (list
      @dots{}
      (service home-restic-backup-service-type
               (for-home
                (restic-backup-configuration
                 (jobs (list @dots{}))))))))
@end lisp

You can refer to @pxref{Servicios misceláneos,
@code{restic-backup-service-type}} for details about
@code{restic-backup-configuration} and @code{restic-backup-job}.  The only
difference is that the @code{home-restic-backup-service-type} will ignore
the @code{user} and @code{group} field of @code{restic-backup-job}.

@node Fonts Home Services
@subsection Fonts Home Services

The @code{(gnu home services fontutils)} module provides services for
user-specific Fontconfig setup.  The
@uref{https://www.freedesktop.org/wiki/Software/fontconfig,Fontconfig}
library is used by many applications to access fonts on the system.

@defvar home-fontconfig-service-type
This is the service type for generating configurations for Fontconfig.  Its
associated value is a list of either strings (or gexps) pointing to fonts
locations, or SXML (@pxref{SXML,,, guile, GNU Guile Reference Manual})
fragments to be converted into XML and put inside the main @code{fontconfig}
node.

Generally, it is better to extend this service than to directly configure
it, as its default value is the default Guix Home's profile font
installation path (@file{~/.guix-home/profile/share/fonts}).  If you
configure this service directly, be sure to include the above directory.

Here's how you'd extend it to include fonts installed with the Nix package
manager, and to prefer your favourite monospace font:

@lisp
(simple-service 'additional-fonts-service
                home-fontconfig-service-type
                (list "~/.nix-profile/share/fonts"
                      '(alias
                        (family "monospace")
                        (prefer
                         (family "Liberation Mono")))))
@end lisp
@end defvar

@node Sound Home Services
@subsection Sound Home Services

The @code{(gnu home services sound)} module provides services related to
sound support.

@cindex PulseAudio, home service
@cindex RTP, for PulseAudio
@subsubheading PulseAudio RTP Streaming Services

The following services dynamically reconfigure the
@uref{https://pulseaudio.org,PulseAudio sound server}: they let you toggle
broadcast of audio output over the network using the @acronym{RTP, real-time
transport protocol} and, correspondingly, playback of sound received over
RTP.  Once @code{home-pulseaudio-rtp-sink-service-type} is among your home
services, you can start broadcasting audio output by running this command:

@example
herd start pulseaudio-rtp-sink
@end example

You can then run a PulseAudio-capable mixer, such as @code{pavucontrol} or
@code{pulsemixer} (both from the same-named package) to control which audio
stream(s) should be sent to the RTP ``sink''.

By default, audio is broadcasted to a multicast address: any device on the
@acronym{LAN, local area network} receives it and may play it.  Using
multicast in this way puts a lot of pressure on the network and degrades its
performance, so you may instead prefer sending to specifically one device.
The first way to do that is by specifying the IP address of the target
device when starting the service:

@example
herd start pulseaudio-rtp-sink 192.168.1.42
@end example

The other option is to specify this IP address as the one to use by default
in your home environment configuration:

@lisp
(service home-pulseaudio-rtp-sink-service-type
         "192.168.1.42")
@end lisp

On the device where you intend to receive and play the RTP stream, you can
use @code{home-pulseaudio-rtp-source-service-type}, like so:

@lisp
(service home-pulseaudio-rtp-source-service-type)
@end lisp

This will then let you start the receiving module for PulseAudio:

@example
herd start pulseaudio-rtp-source
@end example

Again, by default it will listen on the multicast address.  If, instead,
you'd like it to listen for direct incoming connections, you can do that by
running:

@lisp
(service home-pulseaudio-rtp-source-service-type
         "0.0.0.0")
@end lisp

The reference of these services is given below.

@defvar home-pulseaudio-rtp-sink-service-type
@defvarx home-pulseaudio-rtp-source-service-type
This is the type of the service to send, respectively receive, audio streams
over @acronym{RTP, real-time transport protocol}.

The value associated with this service is the IP address (a string)  where
to send, respectively receive, the audio stream.  By default, audio is
sent/received on multicast address @code{%pulseaudio-rtp-multicast-address}.

This service defines one Shepherd service: @code{pulseaudio-rtp-sink},
respectively @code{pulseaudio-rtp-source}.  The service is not started by
default, so you have to explicitly start it when you want to turn it on, as
in this example:

@example
herd start pulseaudio-rtp-sink
@end example

Stopping the Shepherd service turns off broadcasting.
@end defvar

@defvar %pulseaudio-rtp-multicast-address
This is the multicast address used by default by the two services above.
@end defvar

@cindex PipeWire, home service
@subsubheading PipeWire Home Service

@uref{https://pipewire.org, PipeWire} provides a low-latency, graph-based
audio and video processing service.  In addition to its native protocol, it
can also be used as a replacement for both JACK and PulseAudio.

While PipeWire provides the media processing and API, it does not, directly,
know about devices such as sound cards, nor how you might want to connect
applications, hardware, and media processing filters.  Instead, PipeWire
relies on a @dfn{session manager} to specify all these relationships.  While
you may use any session manager you wish, for most people the
@url{https://pipewire.pages.freedesktop.org/wireplumber/, WirePlumber}
session manager, a reference implementation provided by the PipeWire project
itself, suffices, and that is the one @code{home-pipewire-service-type}
uses.

PipeWire can be used as a replacement for PulseAudio by setting
@code{enable-pulseaudio?} to @code{#t} in
@code{home-pipewire-configuration}, so that existing PulseAudio clients may
use it without any further configuration.

In addition, JACK clients may connect to PipeWire by using the
@command{pw-jack} program, which comes with PipeWire.  Simply prefix the
command with @command{pw-jack} when you run it, and audio data should go
through PipeWire:

@example
pw-jack mpv -ao=jack sound-file.wav
@end example

For more information on PulseAudio emulation, see
@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
for JACK, see
@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.

As PipeWire does not use @code{dbus} to start its services on demand (as
PulseAudio does), @code{home-pipewire-service-type} uses Shepherd to start
services when logged in, provisioning the @code{pipewire},
@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
services.  @xref{Servicio personal de Shepherd}.

@defvar home-pipewire-service-type
This provides the service definition for @command{pipewire}, which will run
on login.  Its value is a @code{home-pipewire-configuration} object.

To start the service, add it to the @code{service} field of your
@code{home-environment}, such as:

@lisp
(service home-pipewire-service-type)
@end lisp
@end defvar

@deftp {Data Type} home-pipewire-configuration
Available @code{home-pipewire-configuration} fields are:

@table @asis
@item @code{pipewire} (default: @code{pipewire}) (type: file-like)
The PipeWire package to use.

@item @code{wireplumber} (default: @code{wireplumber}) (type: file-like)
The WirePlumber package to use.

@item @code{enable-pulseaudio?} (default: @code{#t}) (type: boolean)
When true, enable PipeWire's PulseAudio emulation support, allowing
PulseAudio clients to use PipeWire transparently.

@item @code{extra-content} (default: @code{""}) (type: string)
Extra content to add to the end of @file{~/.config/alsa/asoundrc}.
@end table
@end deftp

@node Mail Home Services
@subsection Mail Home Services

The @code{(gnu home services mail)} module provides services that help you
set up the tools to work with emails in your home environment.

@cindex msmtp
@uref{https://marlam.de/msmtp, MSMTP} is a @acronym{SMTP, Simple Mail
Transfer Protocol} client.  It sends mail to a predefined SMTP server that
takes care of proper delivery.

The service reference is given below.

@defvar home-msmtp-service-type
This is the service type for @command{msmtp}.  Its value must be a
@code{home-msmtp-configuration}, as shown below.  It provides the
@file{~/.config/msmtp/config} file.

As an example, here is how you would configure @code{msmtp} for a single
account:

@lisp
(service home-msmtp-service-type
         (home-msmtp-configuration
          (accounts
           (list
            (msmtp-account
             (name "alice")
             (configuration
              (msmtp-configuration
               (host "mail.example.org")
               (port 587)
               (user "alice")
               (password-eval "pass Mail/alice"))))))))
@end lisp
@end defvar

@c %start of fragment

@deftp {Data Type} home-msmtp-configuration
Available @code{home-msmtp-configuration} fields are:

@table @asis
@item @code{defaults} (type: msmtp-configuration)
The configuration that will be set as default for all accounts.

@item @code{accounts} (default: @code{'()}) (type: list-of-msmtp-accounts)
A list of @code{msmtp-account} records which contain information about all
your accounts.

@item @code{default-account} (type: maybe-string)
Set the default account.

@item @code{extra-content} (default: @code{""}) (type: string)
Extra content appended as-is to the configuration file.  Run @command{man
msmtp} for more information about the configuration file format.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} msmtp-account
Available @code{msmtp-account} fields are:

@table @asis
@item @code{name} (type: string)
The unique name of the account.

@item @code{configuration} (type: msmtp-configuration)
The configuration for this given account.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} msmtp-configuration
Available @code{msmtp-configuration} fields are:

@table @asis
@item @code{auth?} (type: maybe-boolean)
Enable or disable authentication.

@item @code{tls?} (type: maybe-boolean)
Enable or disable TLS (also known as SSL) for secured connections.

@item @code{tls-starttls?} (type: maybe-boolean)
Choose the TLS variant: start TLS from within the session (‘on’, default),
or tunnel the session through TLS (‘off’).

@item @code{tls-trust-file} (type: maybe-string)
Activate server certificate verification using a list of trusted
Certification Authorities (CAs).

@item @code{log-file} (type: maybe-string)
Enable logging to the specified file.  An empty argument disables logging.
The file name ‘-’ directs the log information to standard output.

@item @code{host} (type: maybe-string)
The SMTP server to send the mail to.

@item @code{port} (type: maybe-integer)
The port that the SMTP server listens on.  The default is 25 ("smtp"),
unless TLS without STARTTLS is used, in which case it is 465 ("smtps").

@item @code{user} (type: maybe-string)
Set the user name for authentication.

@item @code{from} (type: maybe-string)
Set the envelope-from address.

@item @code{password-eval} (type: maybe-string)
Set the password for authentication to the output (stdout) of the command
cmd.

@item @code{extra-content} (default: @code{""}) (type: string)
Extra content appended as-is to the configuration block.  Run @command{man
msmtp} for more information about the configuration file format.

@end table

@end deftp

@c %end of fragment

@node Messaging Home Services
@subsection Messaging Home Services

@cindex znc
The @uref{https://znc.in, ZNC bouncer} can be run as a daemon to manage your
IRC presence.  With the @code{(gnu home services messaging)} service, you
can configure ZNC to run upon login.

You will have to provide a @file{~/.znc/configs/znc.conf} separately.

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-znc-service-type)
@end lisp

@defvar home-znc-service-type
This is the type of the ZNC home service, whose value is a
@code{home-znc-configuration} object.
@end defvar

@deftp {Data Type} home-znc-configuration
Available @code{home-znc-configuration} fields are:

@table @asis
@item @code{znc} (default: @code{znc}) (type: file-like)
The ZNC package to use.

@item @code{extra-options} (predeterminadas: @code{'()})
Extra options will be passed to @command{znc}, please run @command{man znc}
for more information.

@end table
@end deftp

@cindex irc-bot
@cindex snuik
The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as a
daemon to aid talking to users that are currently offline.  With the
@code{(gnu home services messaging)} service, you can configure Snuik to run
upon login.

@defvar home-snuik-service-type
This is the type of the Snuik home service, whose value is a
@code{home-snuik-configuration} object.
@end defvar

You may specify a custom configuration by providing a
@code{snuik-configuration} record, exactly like for
@code{snuik-service-type} and wrapping it in @code{for-home}.  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-snuik-service-type
         (for-home
          (snuik-configuration
           (server "irc.oftc.net")
           (nick "sneek")
           (password "snuik is sneeky")
           (channels '("#reproducible-builds")))))
@end lisp

@node Media Home Services
@subsection Media Home Services

@cindex kodi
The @uref{https://kodi.tv, Kodi media center} can be run as a daemon on a
media server.  With the @code{(gnu home services kodi)} service, you can
configure Kodi to run upon login.

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-kodi-service-type
  (home-kodi-configuration
   (extra-options '("--settings="<settings-file>"))))
@end lisp

@defvar home-kodi-service-type
This is the type of the Kodi home service, whose value is a
@code{home-kodi-configuration} object.
@end defvar

@deftp {Data Type} home-kodi-configuration
Available @code{home-kodi-configuration} fields are:

@table @asis
@item @code{kodi} (default: @code{kodi}) (type: file-like)
The Kodi package to use.

@item @code{extra-options} (predeterminadas: @code{'()})
Extra options will be passed to @command{kodi}, please run @command{man
kodi} for more information.

@end table
@end deftp

@c This is ugly, but upstream does *not* capitalize the ``m'' even when
@c at the beginning of a sentence.  So let us follow the branding.
@node mpv Media Player
@subsection mpv Media Player

@cindex mpv, Home Service
@cindex mpv, configuration
Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat
daunting task, due to the sheer amount of options available, especially if
one wants to be able to inherit the configuration in their code.  The
@code{home-mpv-service-type} is provided to help with that problem.  When
the service is added to your home environment, file based on the passed
configuration is generated and placed into the correct location.

Due to the bug #74748, it does not use Guix Records to represent the
configuration, but uses keyword arguments to achieve similar result.
Example follows:

@lisp
(service home-mpv-service-type
         (make-home-mpv-configuration
          #:global (make-mpv-profile-configuration
                    #:fullscreen? #t
                    #:alang '("jpn" "eng"))))
@end lisp

@defvar home-mpv-service-type
This is the type of the mpv home service, whose value is a
@code{home-mpv-configuration} object.
@end defvar

@deffn {Procedure} make-home-mpv-configuration
Return a new instance of @code{home-mpv-configuration}.  Available keyword
arguments are:

@table @asis
@item @code{inherit} (default: @code{#t})
Inherit fields from an another instance.

@item @code{global} (default: @code{(make-mpv-profile-configuration)})
The global configuration preceding all profiles.

@item @code{profiles} (default: @code{()})
An alist containing configuration for any additional profiles to include in
the configuration file.

@lisp
(make-home-mpv-configuration
 #:profiles `((fullscreen . ,(make-mpv-profile-configuration
                              #:fullscreen? #t))))
@end lisp

@item @code{extra-config} (default: @code{#f})
Additional content to include in the configuration file.  It is placed at
the end of the file.

@end table
@end deffn

@deffn {Procedure} make-mpv-profile-configuration
Return a new instance of @code{mpv-profile-configuration}.  As above, it
also supports the @code{#:inherit} argument.  Additionally it supports
keyword arguments named after the options of @command{mpv}.  Hence
@option{--fullscreen} (or @code{fullscreen} in the configuration file)
becomes @code{#:fullscreen?}.

Few options are using their aliases instead.  @option{audio} instead of
@option{aid}, @option{video} instead of @option{vid}, @option{sub} instead
of @option{sid}, @option{screenshot-directory} instead of
@option{screenshot-dir} and @option{watch-later-directory} instead of
@option{watch-later-dir}.

Valid values for the fields depend on their type.

@table @asis
@item Flags
The value should be @code{#f} or @code{#t}.

@item Numerical fields
Integer and integer64 fields are validated by @code{integer?}, float and
double fields by @code{real?}.  Ranges are checked when applicable.

@item Aspect
Same as integer.

@item ByteSize
Same as integer64.

@item Choice
The value should be a symbol representing member of the enumeration.  If the
choice has @samp{or ...} part, it can also be value of that alternative
type.

@item @var{type} list
The value should be a list of the @var{type}.

@end table

Other types accept strings, with validation of the values where possible
(e.g. type @samp{Color} is validated, but type @samp{Audio channels or
channel map} is not).  If an option is marked as taking a file, values
satisfying @code{file-like?} can also be used.

The full list of currently supported keyword arguments is below.  For the
types, allowed values and full description please refer to the @command{mpv
--list-options} and @uref{https://mpv.io/manual/stable/#options, mpv
manual}.

Only set fields are output to the configuration file.  Accessors are
provided for every field, returning either their value or a sentinel object
@code{%unset-value} (from @code{(gnu services configuration)}).

@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count},
@code{access-references?}, @code{ad}, @code{ad-lavc-ac3drc},
@code{ad-lavc-downmix?}, @code{ad-lavc-o}, @code{ad-lavc-threads},
@code{ad-queue-enable?}, @code{ad-queue-max-bytes},
@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af},
@code{audio}, @code{alang}, @code{allow-delayed-peak-detect?},
@code{alsa-buffer-time}, @code{alsa-ignore-chmap?},
@code{alsa-mixer-device}, @code{alsa-mixer-index}, @code{alsa-mixer-name},
@code{alsa-non-interleaved?}, @code{alsa-periods}, @code{alsa-resample?},
@code{ao}, @code{ao-null-broken-delay?}, @code{ao-null-broken-eof?},
@code{ao-null-buffer}, @code{ao-null-channel-layouts},
@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst},
@code{ao-null-speed}, @code{ao-null-untimed?}, @code{ao-pcm-append?},
@code{ao-pcm-file}, @code{ao-pcm-waveheader?}, @code{archive-exts},
@code{audio-backward-batch}, @code{audio-backward-overlap},
@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name},
@code{audio-delay}, @code{audio-demuxer}, @code{audio-device},
@code{audio-display}, @code{audio-exclusive?}, @code{audio-exts},
@code{audio-fallback-to-null?}, @code{audio-file-auto},
@code{audio-file-paths}, @code{audio-files}, @code{audio-format},
@code{audio-normalize-downmix?}, @code{audio-pitch-correction?},
@code{audio-resample-cutoff}, @code{audio-resample-filter-size},
@code{audio-resample-linear?}, @code{audio-resample-max-output-size},
@code{audio-resample-phase-shift}, @code{audio-reversal-buffer},
@code{audio-samplerate}, @code{audio-spdif}, @code{audio-stream-silence?},
@code{audio-swresample-o}, @code{audio-wait-open},
@code{auto-window-resize?}, @code{autocreate-playlist}, @code{autofit},
@code{autofit-larger}, @code{autofit-smaller}, @code{autoload-files?},
@code{autosync}, @code{background}, @code{background-color},
@code{blend-subtitles}, @code{bluray-device}, @code{border?},
@code{border-background}, @code{brightness}, @code{cache},
@code{cache-on-disk?}, @code{cache-pause?}, @code{cache-pause-initial?},
@code{cache-pause-wait}, @code{cache-secs}, @code{cdda-cdtext?},
@code{cdda-device}, @code{cdda-overlap}, @code{cdda-paranoia},
@code{cdda-sector-size}, @code{cdda-skip?}, @code{cdda-span-a},
@code{cdda-span-b}, @code{cdda-speed}, @code{cdda-toc-offset},
@code{chapter-merge-threshold}, @code{chapter-seek-threshold},
@code{chapters-file}, @code{clipboard-backends}, @code{clipboard-monitor?},
@code{config?}, @code{container-fps-override}, @code{contrast},
@code{cookies?}, @code{cookies-file}, @code{corner-rounding},
@code{correct-downscaling?}, @code{correct-pts?}, @code{cover-art-auto},
@code{cover-art-files}, @code{cover-art-whitelist}, @code{cscale},
@code{cscale-antiring}, @code{cscale-blur}, @code{cscale-clamp},
@code{cscale-param1}, @code{cscale-param2}, @code{cscale-radius},
@code{cscale-taper}, @code{cscale-window}, @code{cscale-wparam},
@code{cscale-wtaper}, @code{cursor-autohide},
@code{cursor-autohide-fs-only?}, @code{deband?}, @code{deband-grain},
@code{deband-iterations}, @code{deband-range}, @code{deband-threshold},
@code{deinterlace}, @code{deinterlace-field-parity}, @code{demuxer},
@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir},
@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait?},
@code{demuxer-donate-buffer?}, @code{demuxer-hysteresis-secs},
@code{demuxer-lavf-allow-mimetype?}, @code{demuxer-lavf-analyzeduration},
@code{demuxer-lavf-buffersize}, @code{demuxer-lavf-format},
@code{demuxer-lavf-hacks?}, @code{demuxer-lavf-linearize-timestamps},
@code{demuxer-lavf-o}, @code{demuxer-lavf-probe-info},
@code{demuxer-lavf-probescore}, @code{demuxer-lavf-probesize},
@code{demuxer-lavf-propagate-opts?}, @code{demuxer-max-back-bytes},
@code{demuxer-max-bytes}, @code{demuxer-mkv-crop-compat?},
@code{demuxer-mkv-probe-start-time?},
@code{demuxer-mkv-probe-video-duration},
@code{demuxer-mkv-subtitle-preroll},
@code{demuxer-mkv-subtitle-preroll-secs},
@code{demuxer-mkv-subtitle-preroll-secs-index},
@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format},
@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec},
@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps},
@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format},
@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w},
@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache},
@code{demuxer-termination-timeout}, @code{demuxer-thread?},
@code{directory-filter-types}, @code{directory-mode},
@code{display-fps-override}, @code{display-tags}, @code{dither},
@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop},
@code{dscale}, @code{dscale-antiring}, @code{dscale-blur},
@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2},
@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window},
@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats},
@code{dvbin-card}, @code{dvbin-channel-switch-offset}, @code{dvbin-file},
@code{dvbin-full-transponder?}, @code{dvbin-prog}, @code{dvbin-timeout},
@code{dvd-angle}, @code{dvd-device}, @code{dvd-speed}, @code{edition},
@code{egl-config-id}, @code{egl-output-format}, @code{embeddedfonts?},
@code{end}, @code{error-diffusion}, @code{external-files},
@code{fbo-format}, @code{focus-on}, @code{force-media-title},
@code{force-render?}, @code{force-rgba-osd-rendering?},
@code{force-seekable?}, @code{force-window}, @code{force-window-position?},
@code{framedrop}, @code{frames}, @code{fs-screen}, @code{fs-screen-name},
@code{fullscreen?}, @code{gamma}, @code{gamma-auto?}, @code{gamma-factor},
@code{gamut-mapping-mode}, @code{gapless-audio}, @code{geometry},
@code{glsl-shader-opts}, @code{glsl-shaders}, @code{gpu-api},
@code{gpu-context}, @code{gpu-debug?}, @code{gpu-dumb-mode},
@code{gpu-hwdec-interop}, @code{gpu-shader-cache?},
@code{gpu-shader-cache-dir}, @code{gpu-sw?}, @code{gpu-tex-pad-x},
@code{gpu-tex-pad-y}, @code{hdr-compute-peak}, @code{hdr-contrast-recovery},
@code{hdr-contrast-smoothness}, @code{hdr-peak-decay-rate},
@code{hdr-peak-percentile}, @code{hdr-scene-threshold-high},
@code{hdr-scene-threshold-low}, @code{hidpi-window-scale?},
@code{hls-bitrate}, @code{hr-seek}, @code{hr-seek-demuxer-offset},
@code{hr-seek-framedrop?}, @code{http-header-fields}, @code{http-proxy},
@code{hue}, @code{hwdec}, @code{hwdec-codecs}, @code{hwdec-extra-frames},
@code{hwdec-image-format}, @code{hwdec-software-fallback},
@code{icc-3dlut-size}, @code{icc-cache?}, @code{icc-cache-dir},
@code{icc-force-contrast}, @code{icc-intent}, @code{icc-profile},
@code{icc-profile-auto?}, @code{icc-use-luma?}, @code{idle},
@code{ignore-path-in-watch-later-config?}, @code{image-display-duration},
@code{image-exts}, @code{image-lut}, @code{image-lut-type},
@code{image-subs-video-resolution?}, @code{include}, @code{index},
@code{initial-audio-sync?}, @code{input-ar-delay}, @code{input-ar-rate},
@code{input-builtin-bindings?}, @code{input-builtin-dragging?},
@code{input-commands}, @code{input-conf}, @code{input-cursor?},
@code{input-cursor-passthrough?}, @code{input-default-bindings?},
@code{input-doubleclick-time}, @code{input-dragging-deadzone},
@code{input-ime?}, @code{input-ipc-client}, @code{input-ipc-server},
@code{input-key-fifo-size}, @code{input-media-keys?},
@code{input-preprocess-wheel?}, @code{input-right-alt-gr?},
@code{input-terminal?}, @code{input-test?},
@code{input-touch-emulate-mouse?}, @code{input-vo-keyboard?},
@code{interpolation?}, @code{interpolation-preserve?},
@code{interpolation-threshold}, @code{inverse-tone-mapping?},
@code{jack-autostart?}, @code{jack-connect?}, @code{jack-name},
@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open},
@code{keep-open-pause?}, @code{keepaspect?}, @code{keepaspect-window?},
@code{lavfi-complex}, @code{length}, @code{libplacebo-opts},
@code{linear-downscaling?}, @code{linear-upscaling?},
@code{load-auto-profiles}, @code{load-commands?}, @code{load-console?},
@code{load-positioning?}, @code{load-scripts?}, @code{load-select?},
@code{load-stats-overlay?}, @code{load-unsafe-playlists?}, @code{log-file},
@code{loop-file}, @code{loop-playlist}, @code{lut}, @code{lut-type},
@code{mc}, @code{media-controls?}, @code{merge-files?},
@code{metadata-codepage}, @code{mf-fps}, @code{mf-type},
@code{monitoraspect}, @code{monitorpixelaspect}, @code{msg-color?},
@code{msg-level}, @code{msg-module?}, @code{msg-time?}, @code{mute?},
@code{native-fs?}, @code{native-keyrepeat?}, @code{native-touch?},
@code{network-timeout}, @code{oac}, @code{oacopts}, @code{ocopy-metadata?},
@code{of}, @code{ofopts}, @code{on-all-workspaces?}, @code{ontop?},
@code{ontop-level}, @code{opengl-check-pattern-a},
@code{opengl-check-pattern-b}, @code{opengl-early-flush}, @code{opengl-es},
@code{opengl-glfinish?}, @code{opengl-pbo?},
@code{opengl-rectangle-textures?}, @code{opengl-swapinterval},
@code{opengl-waitvsync?}, @code{orawts?}, @code{ordered-chapters?},
@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc?},
@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color},
@code{osd-bar?}, @code{osd-bar-align-x}, @code{osd-bar-align-y},
@code{osd-bar-h}, @code{osd-bar-marker-min-size},
@code{osd-bar-marker-scale}, @code{osd-bar-marker-style},
@code{osd-bar-outline-size}, @code{osd-bar-w}, @code{osd-blur},
@code{osd-bold?}, @code{osd-border-style}, @code{osd-color},
@code{osd-duration}, @code{osd-font}, @code{osd-font-provider},
@code{osd-font-size}, @code{osd-fonts-dir}, @code{osd-fractions?},
@code{osd-italic?}, @code{osd-justify}, @code{osd-level},
@code{osd-margin-x}, @code{osd-margin-y}, @code{osd-msg1}, @code{osd-msg2},
@code{osd-msg3}, @code{osd-on-seek}, @code{osd-outline-color},
@code{osd-outline-size}, @code{osd-playing-msg},
@code{osd-playing-msg-duration}, @code{osd-playlist-entry},
@code{osd-scale}, @code{osd-scale-by-window?}, @code{osd-selected-color},
@code{osd-selected-outline-color}, @code{osd-shadow-offset},
@code{osd-spacing}, @code{osd-status-msg}, @code{oset-metadata}, @code{ovc},
@code{ovcopts}, @code{panscan}, @code{pause?}, @code{pipewire-buffer},
@code{pipewire-remote}, @code{pipewire-volume-mode}, @code{pitch},
@code{play-direction}, @code{player-operation-mode}, @code{playlist-exts},
@code{playlist-start}, @code{prefetch-playlist?}, @code{profile},
@code{pulse-allow-suspended?}, @code{pulse-buffer}, @code{pulse-host},
@code{pulse-latency-hacks?}, @code{quiet?}, @code{really-quiet?},
@code{rebase-start-time?}, @code{referrer}, @code{replaygain},
@code{replaygain-clip?}, @code{replaygain-fallback},
@code{replaygain-preamp}, @code{reset-on-next-file},
@code{resume-playback?}, @code{resume-playback-check-mtime?},
@code{rtsp-transport}, @code{saturation}, @code{save-position-on-quit?},
@code{save-watch-history?}, @code{scale}, @code{scale-antiring},
@code{scale-blur}, @code{scale-clamp}, @code{scale-param1},
@code{scale-param2}, @code{scale-radius}, @code{scale-taper},
@code{scale-window}, @code{scale-wparam}, @code{scale-wtaper},
@code{scaler-resizes-only?}, @code{screen}, @code{screen-name},
@code{screenshot-avif-encoder}, @code{screenshot-avif-opts},
@code{screenshot-avif-pixfmt}, @code{screenshot-directory},
@code{screenshot-format}, @code{screenshot-high-bit-depth?},
@code{screenshot-jpeg-quality}, @code{screenshot-jpeg-source-chroma?},
@code{screenshot-jxl-distance}, @code{screenshot-jxl-effort},
@code{screenshot-png-compression}, @code{screenshot-png-filter},
@code{screenshot-sw?}, @code{screenshot-tag-colorspace?},
@code{screenshot-template}, @code{screenshot-webp-compression},
@code{screenshot-webp-lossless?}, @code{screenshot-webp-quality},
@code{script-opts}, @code{scripts}, @code{secondary-sid},
@code{secondary-sub-ass-override}, @code{secondary-sub-delay},
@code{secondary-sub-pos}, @code{secondary-sub-visibility?}, @code{sharpen},
@code{show-in-taskbar?}, @code{shuffle?}, @code{sub}, @code{sigmoid-center},
@code{sigmoid-slope}, @code{sigmoid-upscaling?}, @code{slang},
@code{snap-window?}, @code{speed}, @code{spirv-compiler}, @code{sstep},
@code{start}, @code{stop-playback-on-init-failure?},
@code{stop-screensaver}, @code{stream-buffer-size}, @code{stream-dump},
@code{stream-lavf-o}, @code{stream-record}, @code{stretch-dvd-subs?},
@code{stretch-image-subs-to-screen?}, @code{sub-align-x},
@code{sub-align-y}, @code{sub-ass?}, @code{sub-ass-force-margins?},
@code{sub-ass-justify?}, @code{sub-ass-override},
@code{sub-ass-prune-delay}, @code{sub-ass-scale-with-window?},
@code{sub-ass-style-overrides}, @code{sub-ass-styles},
@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override},
@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, @code{sub-auto-exts},
@code{sub-back-color}, @code{sub-blur}, @code{sub-bold?},
@code{sub-border-style}, @code{sub-clear-on-seek?}, @code{sub-codepage},
@code{sub-color}, @code{sub-create-cc-track?}, @code{sub-delay},
@code{sub-demuxer}, @code{sub-file-paths}, @code{sub-files},
@code{sub-filter-jsre}, @code{sub-filter-regex},
@code{sub-filter-regex-enable?}, @code{sub-filter-regex-plain?},
@code{sub-filter-regex-warn?}, @code{sub-filter-sdh?},
@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder?},
@code{sub-fix-timing?}, @code{sub-font}, @code{sub-font-provider},
@code{sub-font-size}, @code{sub-fonts-dir}, @code{sub-forced-events-only?},
@code{sub-fps}, @code{sub-gauss}, @code{sub-gray?}, @code{sub-hinting},
@code{sub-italic?}, @code{sub-justify}, @code{sub-lavc-o},
@code{sub-line-spacing}, @code{sub-margin-x}, @code{sub-margin-y},
@code{sub-outline-color}, @code{sub-outline-size},
@code{sub-past-video-end?}, @code{sub-pos}, @code{sub-scale},
@code{sub-scale-by-window?}, @code{sub-scale-signs?},
@code{sub-scale-with-window?}, @code{sub-shadow-offset}, @code{sub-shaper},
@code{sub-spacing}, @code{sub-speed}, @code{sub-stretch-durations?},
@code{sub-use-margins?}, @code{sub-visibility?},
@code{sub-vsfilter-bidi-compat?}, @code{subs-fallback},
@code{subs-fallback-forced}, @code{subs-match-os-language?},
@code{subs-with-matching-audio}, @code{swapchain-depth},
@code{sws-allow-zimg?}, @code{sws-bitexact?}, @code{sws-cgb},
@code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, @code{sws-fast?},
@code{sws-lgb}, @code{sws-ls}, @code{sws-scaler},
@code{target-colorspace-hint}, @code{target-contrast}, @code{target-gamut},
@code{target-lut}, @code{target-peak}, @code{target-prim},
@code{target-trc}, @code{taskbar-progress?}, @code{teletext-page},
@code{temporal-dither?}, @code{temporal-dither-period}, @code{term-osd},
@code{term-osd-bar?}, @code{term-osd-bar-chars}, @code{term-playing-msg},
@code{term-status-msg}, @code{term-title}, @code{terminal?}, @code{title},
@code{title-bar?}, @code{tls-ca-file}, @code{tls-cert-file},
@code{tls-key-file}, @code{tls-verify?}, @code{tone-mapping},
@code{tone-mapping-max-boost}, @code{tone-mapping-param},
@code{tone-mapping-visualize?}, @code{track-auto-selection?}, @code{tscale},
@code{tscale-antiring}, @code{tscale-blur}, @code{tscale-clamp},
@code{tscale-param1}, @code{tscale-param2}, @code{tscale-radius},
@code{tscale-taper}, @code{tscale-window}, @code{tscale-wparam},
@code{tscale-wtaper}, @code{untimed?}, @code{use-embedded-icc-profile?},
@code{use-filedir-conf?}, @code{user-agent}, @code{vaapi-device}, @code{vd},
@code{vd-apply-cropping?}, @code{vd-lavc-assume-old-x264?},
@code{vd-lavc-bitexact?}, @code{vd-lavc-check-hw-profile?},
@code{vd-lavc-dr}, @code{vd-lavc-fast?}, @code{vd-lavc-film-grain},
@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all?},
@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct},
@code{vd-lavc-skiploopfilter}, @code{vd-lavc-threads},
@code{vd-queue-enable?}, @code{vd-queue-max-bytes},
@code{vd-queue-max-samples}, @code{vd-queue-max-secs}, @code{vf},
@code{video}, @code{video-align-x}, @code{video-align-y},
@code{video-aspect-method}, @code{video-aspect-override},
@code{video-backward-batch}, @code{video-backward-overlap},
@code{video-crop}, @code{video-exts}, @code{video-latency-hacks?},
@code{video-margin-ratio-bottom}, @code{video-margin-ratio-left},
@code{video-margin-ratio-right}, @code{video-margin-ratio-top},
@code{video-osd?}, @code{video-output-levels}, @code{video-pan-x},
@code{video-pan-y}, @code{video-recenter?}, @code{video-reversal-buffer},
@code{video-rotate}, @code{video-scale-x}, @code{video-scale-y},
@code{video-sync}, @code{video-sync-max-audio-change},
@code{video-sync-max-factor}, @code{video-sync-max-video-change},
@code{video-timing-offset}, @code{video-unscaled}, @code{video-zoom},
@code{vlang}, @code{vo}, @code{vo-image-avif-encoder},
@code{vo-image-avif-opts}, @code{vo-image-avif-pixfmt},
@code{vo-image-format}, @code{vo-image-high-bit-depth?},
@code{vo-image-jpeg-quality}, @code{vo-image-jpeg-source-chroma?},
@code{vo-image-jxl-distance}, @code{vo-image-jxl-effort},
@code{vo-image-outdir}, @code{vo-image-png-compression},
@code{vo-image-png-filter}, @code{vo-image-tag-colorspace?},
@code{vo-image-webp-compression}, @code{vo-image-webp-lossless?},
@code{vo-image-webp-quality}, @code{vo-kitty-alt-screen?},
@code{vo-kitty-cols}, @code{vo-kitty-config-clear?}, @code{vo-kitty-height},
@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top},
@code{vo-kitty-use-shm?}, @code{vo-kitty-width}, @code{vo-null-fps},
@code{vo-sixel-alt-screen?}, @code{vo-sixel-buffered?},
@code{vo-sixel-cols}, @code{vo-sixel-config-clear?}, @code{vo-sixel-dither},
@code{vo-sixel-fixedpalette?}, @code{vo-sixel-height}, @code{vo-sixel-left},
@code{vo-sixel-pad-x}, @code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors},
@code{vo-sixel-rows}, @code{vo-sixel-threshold}, @code{vo-sixel-top},
@code{vo-sixel-width}, @code{vo-tct-256?}, @code{vo-tct-algo},
@code{vo-tct-buffering}, @code{vo-tct-height}, @code{vo-tct-width},
@code{vo-vaapi-scaled-osd?}, @code{vo-vaapi-scaling},
@code{vo-vdpau-chroma-deint?}, @code{vo-vdpau-colorkey},
@code{vo-vdpau-composite-detect?}, @code{vo-vdpau-denoise},
@code{vo-vdpau-force-yuv?}, @code{vo-vdpau-fps}, @code{vo-vdpau-hqscaling},
@code{vo-vdpau-output-surfaces}, @code{vo-vdpau-pullup?},
@code{vo-vdpau-queuetime-fs}, @code{vo-vdpau-queuetime-windowed},
@code{vo-vdpau-sharpen}, @code{volume}, @code{volume-gain},
@code{volume-gain-max}, @code{volume-gain-min}, @code{volume-max},
@code{vulkan-async-compute?}, @code{vulkan-async-transfer?},
@code{vulkan-device}, @code{vulkan-display-display},
@code{vulkan-display-mode}, @code{vulkan-display-plane},
@code{vulkan-queue-count}, @code{vulkan-swap-mode},
@code{watch-history-path}, @code{watch-later-directory},
@code{watch-later-options}, @code{wayland-app-id},
@code{wayland-configure-bounds}, @code{wayland-content-type},
@code{wayland-disable-vsync?}, @code{wayland-edge-pixels-pointer},
@code{wayland-edge-pixels-touch}, @code{wayland-internal-vsync},
@code{wayland-present?}, @code{wid}, @code{window-dragging?},
@code{window-maximized?}, @code{window-minimized?}, @code{window-scale},
@code{write-filename-in-watch-later-config?}, @code{x11-bypass-compositor},
@code{x11-name}, @code{x11-netwm}, @code{x11-present},
@code{x11-wid-title?}, @code{xv-adaptor}, @code{xv-buffers}, @code{xv-ck},
@code{xv-ck-method}, @code{xv-colorkey}, @code{xv-port}, @code{ytdl?},
@code{ytdl-format}, @code{ytdl-raw-options}, @code{zimg-dither},
@code{zimg-fast?}, @code{zimg-scaler}, @code{zimg-scaler-chroma},
@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b},
@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and
@code{zimg-threads}.

@end deffn

@node Niri window manager
@subsection Niri window manager

@cindex niri, Home Service
@cindex niri, configuration
@cindex Wayland compositor
@cindex scrollable tiling window manager
The @code{(gnu home services niri)} module provides the
@code{home-niri-service-type} service, which installs and configures
@uref{https://github.com/YaLTeR/niri, Niri}, a scrollable tiling Wayland
compositor. Niri combines traditional tiling window management with smooth
scrolling between workspaces.

This service starts Niri as a user-level desktop session with proper
environment variables configured for Wayland compatibility, including
@code{XDG_CURRENT_DESKTOP}, @code{XDG_SESSION_DESKTOP}, and
@code{DESKTOP_SESSION}.

Here is a minimal example service declaration for your
@code{home-environment} configuration:

@example
(service home-niri-service-type)
@end example

For more advanced configurations, you can customize the service with a
@code{niri-configuration} record to specify additional environment
variables.

@node Sway window manager
@subsection Sway window manager

@cindex sway, Home Service
@cindex sway, configuration
The @code{(gnu home services sway)} module provides
@code{home-sway-service-type}, a home service to configure the
@uref{https://github.com/swaywm/sway,Sway window manager for Wayland} in a
declarative way.

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-sway-service-type
         (sway-configuration
          (gestures
           '((swipe:3:down . "move to scratchpad")
             (swipe:3:up   . "scratchpad show")))
          (outputs
           (list (sway-output
                  (identifier '*)
                  (background (file-append sway
                                           "\
/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png")))))))
@end lisp

The above example describes a Sway configuration in which
@itemize
@item
all monitors use a particular wallpaper whose @file{.png} is provided by the
@code{sway} package;
@item
swiping down (resp.@: up) with three fingers moves the active window to the
scratchpad (resp.@: shows/hides the scratchpad).
@end itemize

@quotation Nota
This home service only sets up the configuration file and profile packages
for Sway.  It does @emph{not} start Sway in any way.  If you want to do so,
you might be interested in using @code{greetd-wlgreet-sway-session} instead.

The procedure @code{sway-configuration->file} defined below can be used to
provide the value for the @emph{optional} @code{sway-configuration} field of
@code{greetd-wlgreet-sway-session}.
@end quotation

@deffn {Procedure} sway-configuration->file config
This procedure takes one argument @code{config}, which must be a
@code{sway-configuration} record (defined below), and returns a file-like
object representing the serialized configuration.
@end deffn

@defvar home-sway-service-type
This is a home service type to set up Sway.  It takes care of:
@itemize
@item
providing a @file{~/.config/sway/config} file,
@item
adding Sway-related packages to your profile.
@end itemize

It is possible to extend this service (@pxref{Composición de servicios}).  The
resulting configuration file contains the concatenation of keybindings,
modes, @i{etc.}@: found in all extensions.

@quotation Nota
At the moment, only one bar configuration is allowed.  If more are found, an
error will be raised.
@end quotation
@end defvar

@defvar %empty-sway-configuration
The variable @code{%empty-sway-configuration} contains an empty
@code{sway-configuration} record.  This value can help users write simple
service extensions.
@end defvar

@deftp {Data Type} sway-configuration
This configuration record describes the Sway configuration (see@
@cite{sway(5)}).  Available fields are:

@table @asis
@item @code{variables} (default: @code{%sway-default-variables})
The value of this field is an association list in which keys are symbols and
values are either strings, G-expressions or file-like objects
(@pxref{Expresiones-G}).

Example:
@lisp
(variables `((mod . "Mod4") ; string
             (term ; file-append
              . ,(file-append foot "/bin/foot"))
             (Term ; G-expression
              . ,#~(string-append #$foot "/bin/foot"))))
@end lisp

@quotation Nota
Default keybindings assume the existence of variables named @code{$mod},
@code{$left}, @code{$right}, @code{$up} and @code{$down}.  If you choose not
to define these variables, make sure to remove keybindings referring to
them.
@end quotation

@item @code{keybindings} (default: @code{%sway-default-keybindings})
This field describes keybindings for the @emph{default} mode.  The value is
an association list in which keys are symbols.  Values can either be:
@itemize
@item
strings or G-expressions,
@item
a cons-cell of a string or G-expression and a list of options.  Options must
be a string starting with ``input-device='' or strings among ``no-warn'',
``whole-window'', ``border'', ``exclude-titlebar'', ``release'', ``locked'',
``to-code'', ``inhibited'' and ``no-repeat''.
@end itemize

The following snippet launches the terminal when pressing @kbd{$mod+t} and
@kbd{$mod+Shift+t} (assuming that a variable @code{$term} is defined):
@lisp
`(($mod+t . ,#~(string-append "exec " #$foot "/bin/foot"))
  ($mod+Shift+t . "exec $term")
  ($mod+q "exec $term" . ("to-code"))) ;; passes the --to-code option.
@end lisp

@item @code{gestures} (default: @code{%sway-default-gestures})
Similar to the previous field, but for finger-gestures.  Options must start
with ``input-device='' or be among ``exact'' and ``no-warn''.

The following snippet allows to navigate through workspaces by swiping right
and left with three fingers:
@lisp
'((swipe:3:right . "workspace next_on_output")
  (swipe:3:left    "workspace prev_on_output" . ("exact")))
@end lisp

@item @code{packages} (default: @code{%sway-default-packages})
This field describes a list of packages to add to the user profile.  At the
moment, the default value only adds @code{sway} to the profile.

@item @code{inputs} (predeterminadas: @code{'()})
List of @code{sway-input} configuration records (described below).

@item @code{outputs} (default: @code{'()})
List of @code{sway-output} configuration records (described below).

@item @code{bar} (optional @code{sway-bar} record)
Optional @code{sway-bar} record (described below) to configure a Sway bar.

@item @code{modes} (default: @code{%sway-default-modes})
List of @code{sway-mode} records (described below) to add modes to the Sway
configuration.  The default value @code{%sway-default-modes} adds the
``resize'' mode of the default Sway configuration (as described below).

@item @code{startup+reload-programs} (default: @code{'()})
Programs to execute at startup time @emph{and} after every configuration
reload.  The value of this field is a list of strings, G-expressions or
file-like objects (@pxref{Expresiones-G}).

@item @code{startup-programs} (default: @code{%sway-default-startup-programs})
Programs to execute at startup time.  As above, values of this field are a
list of strings, G-expressions or file-like objects.

The default value, @code{%sway-default-startup-programs}, executes
@code{swayidle} in order to lock the screen after 5@ minutes of inactivity
(displaying a background distributed with Sway) and turn the screen off
after 10@ minutes of inactivity.

@item @code{extra-content} (default: @code{'()})
Lines to add to the configuration file.  The value of this field is a list
of strings or G-expressions.
@end table
@end deftp

@deftp {Data Type} sway-input
@code{sway-input} records describe input blocks (see@
@cite{sway-input(5)}).  For example, the following snippet makes all
keyboards use a French layout, in which @kbd{capslock} has been remapped to
@kbd{ctrl}:
@lisp
(sway-input (identifier "type:keyboard")
            (layout
              (keyboard-layout "fr" #:options '("ctrl:nocaps"))))
@end lisp

Available fields for @code{sway-input} configuration records are:

@table @asis
@item @code{identifier} (default: @code{'*})
Identifier of the input.  The field accepts symbols and strings.  If the
@code{identifier} is a symbol, it is inserted as is; if it is a string, it
will be quoted in the configuration file.

@item @code{layout} (optional @code{<keyboard-layout>} record)
Keyboard specific option.  Field specifying the layout to use for the
input.  The value must be a @code{<keyboard-layout>} record (@pxref{Distribución de teclado}).

@quotation Nota
@code{(gnu home services sway)} does not re-export the
@code{keyboard-layout} procedure.
@end quotation

@item @code{disable-while-typing} (optional boolean)
If @code{#t} (resp.@: @code{#f}) enables (resp.@: disables) the ``disable
while typing'' option for this input.

@item @code{disable-while-trackpointing} (optional boolean)
If @code{#t} (resp.@: @code{#f}), enables (resp.@: disables) the ``disable
while track-pointing'' option for this input.

@item @code{tap} (optional boolean)
Enables or disables the ``tap'' option, which allows clicking by tapping on
a touchpad.

@item @code{extra-content} (default: @code{'()})
Lines to add to the input block.  The value of this field must a list whose
elements are either strings or G-expressions.
@end table
@end deftp

@deftp {Data Type} sway-output
@code{sway-output} records describe Sway outputs (see@
@cite{sway-output(5)}).  Available fields are:

@table @asis
@item @code{identifier} (default: @code{'*})
Identifier of the monitor.  The field accepts symbols and strings.  If the
@code{identifier} is a symbol, it is inserted as is; if it is a string, it
will be quoted in the configuration file.

@item @code{resolution} (optional string)
This string defines the resolution of the monitor.

@item @code{position} (optional)
The (optional) value of this field must be a @code{point}.  Example:
@lisp
(position
 (point (x 1920)
        (y 0)))
@end lisp

@item @code{background} (optional)
The value of this field describes what wallpaper to use on this output.  The
field accepts the following types of values:
@itemize
@item
a string,
@item
a G-expression,
@item
a file-like object,
@item
a pair.  The first argument of this pair must be a string, a G-expression or
a file-like object.  The second element describes how the wallpaper will be
displayed.  It must be a symbol among @code{stretch}, @code{fill},
@code{fit}, @code{center} and @code{tile}.

If the second element is not specified (@i{i.e.}@: when the value is not a
pair), the @code{fill} mode will be used.
@end itemize

@quotation Nota
In order to use an SVG file, you must have @code{librsvg} in your profile
(@i{e.g.}@: by adding it in the @code{packages} field of
@code{sway-configuration}).
@end quotation

@item @code{extra-content} (default: @code{'()})
List defining additional lines to add to the output configuration block.
Elements of the list must be either strings or G-expressions.
@end table
@end deftp

@deftp {Data Type} sway-border-color
@table @code
@item border
Color of the border.
@item background
Color of the background.
@item text
Color of the text.
@end table
@end deftp

@deftp {Data Type} sway-color
@table @asis
@item @code{background} (optional string)
Background color of the bar.

@item @code{statusline} (optional string)
Text color of the status line.

@item @code{focused-background} (optional string)
Background color of the bar on the currently focused monitor.

@item @code{focused-statusline} (optional string)
Text color of the statusline on the currently focused monitor.

@item @code{focused-workspace} (optional @code{sway-border-color})
Color scheme for focused workspaces.

@item @code{active-workspace} (optional @code{sway-border-color})
Color scheme for active workspaces.

@item @code{inactive-workspace} (optional @code{sway-border-color})
Color scheme for inactive workspaces.

@item @code{urgent-workspace} (optional @code{sway-border-color})
Color scheme for workspaces containing ``urgent windows''.

@item @code{binding-mode} (optional @code{sway-border-color})
Color scheme for the binding mode indicator.
@end table
@end deftp

@deftp {Data Type} sway-bar
Describes the Sway bar (see@ @cite{sway-bar(5)}).

@table @asis
@item @code{identifier} (default: @code{'bar0})
Identifier of the bar.  The value must be a symbol.

@item @code{position} (optional)
Specify the position of the bar.  Accepted values are @code{'top} or
@code{'bottom}.

@item @code{hidden-state} (optional)
Specify the appearance of the bar when it is hidden.  Accepted values are
@code{'hide} or @code{'show}.

@item @code{binding-mode-indicator} (optional)
Boolean enabling or disabling the binding mode indicator.

@item @code{colors} (optional)
An optional @code{sway-color} configuration record.

@item @code{status-command} (optional)
This field accept strings, G-expressions and executable file-like values.
The default value is a command (string) that prints the date and time every
second.

Each line printed on @code{stdout} by this command (or script) will be
displayed on the status area of the bar.

Below are a few examples using:
@itemize
@item
a string: @code{"while date +'%Y-%m-%d %X'; do sleep 1; done"},
@item
a G-exp:
@lisp
#~(string-append "while "
                 #$coreutils "/bin/date"
                 " +'%Y-%m-%d %X'; do sleep 1; done")
@end lisp
@item
an executable file:
@lisp
(program-file
 "sway-bar-status"
 #~(begin
     (use-modules (ice-9 format)
                  (srfi srfi-19))
     (let loop ()
       (let* ((date (date->string
                     (current-date)
                     "~d/~m/~Y (~a) • ~H:~M:~S")))
         (format #t "~a~%~!" date)
         (sleep 1)
         (loop)))))
@end lisp
@end itemize

@item @code{mouse-bindings} (default: @code{'()})
This field accepts an associative list.  Keys are integers describing mouse
events.  Values are similar to that of key-bindings (except that ``to-code''
is not a valid option for mouse-bindings).

The module @code{(gnu home services sway)} exports constants
@code{%ev-code-mouse-left}, @code{%ev-code-mouse-right} and
@code{%ev-code-mouse-scroll-click} whose values are integers corresponding
to left, right and scroll click respectively.  For example, with
@code{(mouse-bindings `((,%ev-code-mouse-left . "exec $term")))}, left
clicks in the status bar open the terminal (assuming that the variable
@code{$term} is bound to a terminal).
@end table
@end deftp

@deftp {Data Type} sway-mode
Describes a Sway mode (see@ @cite{sway(5)}).  For example, the following
snippet defines the resize mode of the default Sway configuration:
@example
(sway-mode
 (mode-name "resize")
 (keybindings
  '(($left  . "resize shrink width 10px")
    ($right . "resize grow width 10px")
    ($down  . "resize grow height 10px")
    ($up    . "resize shrink height 10px")
    (Left   . "resize shrink width 10px")
    (Right  . "resize grow width 10px")
    (Down   . "resize grow height 10px")
    (Up     . "resize shrink height 10px")
    (Return . "mode \"default\"")
    (Escape . "mode \"default\""))))
@end example

@table @asis
@item @code{mode-name} (default: @code{"default"})
Name of the mode.  This field accepts strings.

@item @code{keybindings} (default: @code{'()})
This field describes keybindings.  The value is an association list.  As
above, keys are symbols and values are either strings, G-expressions or
cons-cells.

@item @code{mouse-bindings} (default: @code{'()})
Ditto, but keys are mouse events (integers).  Constants
@code{%ev-code-mouse-*} described above can be used as helpers to define
mouse bindings.
@end table
@end deftp

@node Networking Home Services
@subsection Networking Home Services

This section lists services somewhat networking-related that you may use
with Guix Home.

@subheading Syncthing Service

@cindex Syncthing, file synchronization service
@cindex backup service, Syncthing
The @code{(gnu home services syncthing)} module provides a service to set up
the @uref{Syncthing, https://syncthing.net} continuous file backup service.

@defvar home-syncthing-service-type
This is the service type for the @command{syncthing} daemon; it is the Home
counterpart of the @code{syncthing-service-type} system service
(@pxref{Servicios de red, @code{syncthing-service-type}}).  The value for
this service type is a @command{syncthing-configuration}.

Here is how you would set it up with the default configuration:

@lisp
(service home-syncthing-service-type)
@end lisp

For a custom configuration, wrap you @code{syncthing-configuration} in
@code{for-home}, as in this example:

@lisp
(service home-syncthing-service-type
         (for-home
          (syncthing-configuration (logflags 5))))
@end lisp

For details about @code{syncthing-configuration}, check out the
documentation of the system service (@pxref{Servicios de red,
@code{syncthing-service-type}}).
@end defvar

@node Secrets Home Services
@subsection Secrets Home Services

The @code{(gnu home services secrets)} module provides services pertaining
to storing secrets, notably including password managers.

@subsubheading Himitsu Services

@uref{https://himitsustore.org/, Himitsu} is a daemon for storing arbitrary
secrets encrypted by a single password.  The daemon operates alongside a
prompter, which asks the user for permission when an application requests a
secret, and for the store password on first use in a session.  Neither
Himitsu nor its underlying cryptography library have been indepednently
audited.

@defvar home-himitsu-service-type
This service provides the main Himitsu store daemon.  It will not launch
unless you have a store set up - run @code{himitsu-store -i} after the
service is added to your profile to create it, and then @code{herd start
himitsud} to restart the service. Configuration is as follows:
@end defvar

@deftp {Data Type} home-himitsu-configuration
@table @asis
@item @code{package} (default: @code{himitsu})
Package to find @code{himitsud} in.

@item @code{notify-reuse} (optional)
Interpreted shell command to run on application access to an
already-approved secret.

@item @code{prompter} (default: @code{(wrap-himitsu-prompter (file-append hiprompt-gtk "/bin/hiprompt-gtk"))})
Path to a prompter binary.  Defaults to @code{hiprompt-gtk}, the reference
implementation.  If your prompter is graphical, you should pass it through
the provided @code{wrap-himitsu-prompter} procedure, which will autodetect a
running display to prompt on, due to the Himitsu daemon starting before the
display server is online.

@item @code{extra-options} (optional)
List of extra strings or G-expressions to insert verbatim into the Himitsu
configuration file.  Each list element gets its own line.

@end table
@end deftp

Himitsu can be used through its command-line tool @code{hiq} or through any
number of supporting services, providing compatability to other
applications.  Git credential support may be provided simply by adding the
@code{himitsu-git} package to your profile, but other such supporting
services are listed below:

@defvar home-himitsu-ssh-service-type
This service provides an @code{ssh-agent} implementation that stores keys
through Himitsu.  You may interact with a running daemon through
@code{hissh-import} and @code{hissh-export}.
@end defvar

@deftp {Data Type} home-himitsu-ssh-configuration
@table @asis
@item @code{package} (default: @code{himitsu-ssh})
Package to find @code{hissh-agent} in.

@item @code{persist} (default: @code{'(session 300 refuse)})
List of options given when prompting to allow this service access to your
list of keys.  The option chosen decides how long @code{himitsu-ssh} has
this access.  Options can be either @code{'session} (access is retained
until the daemon closes), @code{'refuse} (access is declined and the
prompter will not ask again), @code{'skip} (ask again next use), or a
numerical access timeout in seconds.

@item @code{disclose} (default: @code{'(skip session 300)})
List of options given when prompting to allow this service use of your
secret keys.  Has the same format as @code{persist}.

@end table
@end deftp

@defvar home-himitsu-secret-service-type
This service provides a
@uref{https://specifications.freedesktop.org/secret-service/latest/,
freedesktop Secret Service} implementation, allowing Himitsu to replace
@pxref{Servicios de escritorio, gnome-keyring-service-type} and @pxref{Servicios de escritorio, kwallet-service-type}.
@end defvar

@deftp {Data Type} home-himitsu-secret-service-configuration
@table @asis
@item @code{package} (default: @code{himitsu-secret-service})
Package to find @code{hisecrets-agent} in.

@end table
@end deftp

@node Miscellaneous Home Services
@subsection Miscellaneous Home Services

This section lists Home services that lack a better place.

@subsubheading Beets Service

@cindex Beets service, for Home
The @code{(gnu home services music)} module provides the following service:

@defvar home-beets-service-type
@uref{https://beets.io, Beets} is a music file and metadata manager that can
be used via its command-line interface, @command{beet}. Beets requires a
YAML configuration file and this Guix Home service is to create such file.
@end defvar

The service can be used as follows:

@lisp
(service home-beets-service-type
         (home-beets-configuration (directory "/home/alice/music")))
@end lisp

Additional options can be specified via the service wild-card field
@code{extra-options}:

@lisp
(service home-beets-service-type
         (home-beets-configuration
          (directory "/home/alice/music")
          (extra-options '("
import:
  move: yes"))))
@end lisp

@subsubheading Servicio de diccionario

@cindex dictionary service, for Home
The @code{(gnu home services dict)} module provides the following service:

@defvar home-dicod-service-type
Tipo de servicio que ejecuta el daemon @command{dicod}, una implementación
del servidor DICT (@pxref{Dicod,,, dico, GNU Dico Manual}).

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 defvar

This service is a direct mapping of the @code{dicod-service-type} system
service (@pxref{Servicios misceláneos, Dictionary Service}).  You can use
it like this:

@lisp
(service home-dicod-service-type)
@end lisp

You may specify a custom configuration by providing a
@code{dicod-configuration} record, exactly like for
@code{dicod-service-type}, but wrapping it in @code{for-home}:

@lisp
(service home-dicod-service-type
         (for-home
          (dicod-configuration @dots{})))
@end lisp

@subheading ReadyMedia Service

@cindex ReadyMedia, DLNA/UPnP Service
The @code{(gnu home services upnp)} module provides a service to set up the
@uref{https://minidlna.sourceforge.net/, ReadyMedia} @acronym{DLNA, Digital
Living Network Alliance} @acronym{UPnP, Universal Plug and Play} media
server.

@defvar home-readymedia-service-type
This is the service type for the @command{minidlnad} daemon; it is the Home
counterpart of the @code{readymedia-service-type} system service
(@pxref{Servicios misceláneos, @code{readymedia-service-type}}).  The value
for this service type is a @code{readymedia-configuration}.
@end defvar

The service can be used with a @code{readymedia-configuration} wrapped in
@code{for-home} like this:

@lisp
(service home-readymedia-service-type
         (for-home
          (readymedia-configuration
            (media-directories
             (list (readymedia-directory
                     (path "/path/to/media/audio")
                     (types '(A)))
                   (readymedia-directory
                     (path "/path/to/media/video")
                     (types '(V)))
                   (readymedia-directory
                     (path "/path/to/media/misc")))))))
@end lisp

For details about @code{readymedia-configuration}, check out the
documentation of the system service (@pxref{Servicios misceláneos,
@code{readymedia-service-type}}).

@subsubheading OCI backed services

@cindex OCI-backed, for Home
The @code{(gnu home services containers)} module provides the following
service:

@defvar home-oci-service-type
This is the type of the service that allows to manage your OCI containers
with the same consistent interface you use for your other Home Shepherd
services.
@end defvar

This service is a direct mapping of the @code{oci-service-type} system
service (@pxref{Servicios misceláneos, OCI backed services}).  You can use
it like this:

@lisp
(use-modules (gnu services containers)
             (gnu home services containers))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))

@end lisp

You may specify a custom configuration by providing a
@code{oci-configuration} record, exactly like for @code{oci-service-type},
but wrapping it in @code{for-home}:

@lisp
(use-modules (gnu services)
             (gnu services containers)
             (gnu home services containers))

(service home-oci-service-type
         (for-home
          (oci-configuration
           (runtime 'podman)
           (verbose? #t))))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))
@end lisp

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

@cindex @command{guix home}

Once you have written a home environment declaration (@pxref{Declarar el entorno personal,,,,}, 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{Invocación de 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

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}.

@quotation Nota
If you're using Guix System, @ref{guix-home-service-type,
@code{guix-home-service-type}}, on how to embed your home configuration in
your system configuration such that @command{guix system reconfigure}
deploys both your system and your home.
@end quotation

@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{Servicios personal}).

@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{Getting Started,,, 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.
* Plataformas mantenidas::   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{rust-target} (default: @code{#false})
This optional string field is used to determine which rust target is best
supported by this platform.  For example, the base level system targeted by
@code{armhf-linux} system is closest to
@code{armv7-unknown-linux-gnueabihf}.

@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 Plataformas mantenidas
@section Plataformas mantenidas

The @code{(guix platforms @dots{})} modules export the following variables,
each of which is bound to a @code{platform} record.

@defvar armv7-linux
Platform targeting ARM v7 CPU running GNU/Linux.
@end defvar

@defvar aarch64-linux
Platform targeting ARM v8 CPU running GNU/Linux.
@end defvar

@defvar loongarch64-linux
Platform targeting loongarch 64-bit CPU running GNU/Linux.
@end defvar

@defvar mips64-linux
Platform targeting MIPS little-endian 64-bit CPU running GNU/Linux.
@end defvar

@defvar powerpc-linux
Platform targeting PowerPC big-endian 32-bit CPU running GNU/Linux.
@end defvar

@defvar powerpc64le-linux
Platform targeting PowerPC little-endian 64-bit CPU running GNU/Linux.
@end defvar

@defvar riscv64-linux
Platform targeting RISC-V 64-bit CPU running GNU/Linux.
@end defvar

@defvar i686-linux
Platform targeting x86 CPU running GNU/Linux.
@end defvar

@defvar x86_64-linux
Platform targeting x86 64-bit CPU running GNU/Linux.
@end defvar

@defvar x86_64-linux-x32
Platform targeting x86 64-bit CPU running GNU/Linux with the run-time using
the X32 ABI.
@end defvar

@defvar i686-mingw
Platform targeting x86 CPU running Windows, with run-time support from
MinGW.
@end defvar

@defvar x86_64-mingw
Platform targeting x86 64-bit CPU running Windows, with run-time support
from MinGW.
@end defvar

@defvar i586-gnu
Platform targeting x86 CPU running GNU/Hurd (also referred to as ``GNU'').
@end defvar

@defvar avr
Platform targeting AVR CPUs without an operating system, with run-time
support from AVR Libc.
@end defvar

@defvar or1k-elf
Platform targeting OpenRISC 1000 CPU without an operating system and without
a C standard library.
@end defvar

@defvar xtensa-ath9k-elf
Platform targeting Xtensa CPU used in the Qualcomm Atheros AR7010 and AR9271
USB 802.11n @acronym{NICs, Network Interface Controllers}.
@end defvar

@node System Images
@chapter Creación de imágenes del sistema

@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{mbr-hybrid-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 instantiated.

@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

@menu
* partition Reference::      partition Reference
@end menu

@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{"btrfs"}, @code{"ext4"}, @code{"fat16"},
@code{"f2fs"}, @code{"fat32"}, @code{"vfat"}, and @code{"swap"}.

@code{"vfat"}, @code{"fat16"}, and @code{"fat32"} partitions without the
@code{'esp} flag are by default LBA compatible.

@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{"vfat"}, @code{"fat16"}, @code{"fat32"} or @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.

@defvar mbr-disk-image
An MBR disk-image composed of a single ROOT partition.  The ROOT partition
starts at a 1@tie{}MiB offset so that the bootloader can install itself in
the post-MBR gap.
@end defvar

@defvar mbr-hybrid-disk-image
An MBR disk-image composed of two partitions: a 64 bits ESP partition and a
ROOT boot partition.  The ESP partition starts at a 1@tie{}MiB offset so
that a BIOS compatible bootloader can install itself in the post-MBR gap.
The image can be used by @code{x86_64} and @code{i686} machines supporting
only legacy BIOS booting.  The ESP partition ensures that it can also be
used by newer machines relying on UEFI booting, hence the @emph{hybrid}
denomination.
@end defvar

@defvar efi-disk-image
A GPT 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 defvar

@defvar efi32-disk-image
Same as @code{efi-disk-image} but with a 32 bits EFI partition.
@end defvar

@defvar 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 defvar

@defvar docker-image
A Docker image that can be used to spawn a Docker container.
@end defvar

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.

@defvar mbr-raw-image-type
Build an image based on the @code{mbr-disk-image} image.
@end defvar

@defvar mbr-hybrid-raw-image-type
Build an image based on the @code{mbr-hybrid-disk-image} image.
@end defvar

@defvar efi-raw-image-type
Build an image based on the @code{efi-disk-image} image.
@end defvar

@defvar efi32-raw-image-type
Build an image based on the @code{efi32-disk-image} image.
@end defvar

@defvar qcow2-image-type
Build an image based on the @code{mbr-disk-image} image but with the
@code{compressed-qcow2} image format. The resulting image will have an MBR
embedded bootloader as well as an EFI bootloader. This image is not suitable
for architectures that do not support `grub-pc`, such as AArch64. See
@code{qcow2-gpt-image-type} for an alternative.
@end defvar

@defvar qcow2-gpt-image-type
Build an image based on the @code{efi-disk-image} image but with the
@code{compressed-qcow2} image format. The resulting image will have only EFI
bootloader, unlike @code{qcow2-image-type}. This image is suitable for
architectures that do not support `grub-pc`, such as AArch64.
@end defvar

@defvar iso-image-type
Build a compressed image based on the @code{iso9660-image} image.
@end defvar

@defvar 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 defvar

@defvar docker-image-type
Build an image based on the @code{docker-image} image.
@end defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

@defvar 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 defvar

So, if we get back to the @code{guix system image} command taking an
@code{operating-system} declaration as argument.  By default, the
@code{mbr-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

El problema con la información de depuración es que ocupa un espacio
considerable en el disco. Por ejemplo, la información de depuración de la
biblioteca C de GNU ocupa más de 60 MiB. Por tanto, como usuaria, mantener
toda la información de depuración de todos los programas instalados no es
habitualmente una opción. No obstante, el ahorro de espacio no debe ser
impedir la depuración---especialmente en el sistema GNU, que debería
facilitar a sus usuarias ejercitar su libertad de computación (@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}.  Because
@TeX{} Live is so huge and because finding one's way in this maze is tricky,
this section provides some guidance on how to deploy the relevant packages
to compile @TeX{} and @LaTeX{} documents.

@TeX{} Live currently comes in two mutually exclusive flavors in Guix:

@itemize
@item
The ``monolithic'' @code{texlive} package: it comes with @emph{every single
@TeX{} Live package} (roughly 4,200), but it is huge---more than 4@tie{}GiB
for a single package!

@item
A ``modular'' @TeX{} Live distribution, in which you only install the
packages you need, whose name is always prefixed with @samp{texlive-}.
@end itemize

To insist, these two flavors cannot be combined@footnote{No rule without
exception! As the monolithic @TeX{} Live does not contain the
@command{biber} executable, it is okay to combine it with
@code{texlive-biber}, which does.}.  If in the modular setting your document
does not compile, the solution is not to add the monolithic @code{texlive}
package, but to add the set of missing packages from the modular
distribution.

Building a coherent system that provides all the essential tools and, at the
same time, satisfies all of its internal dependencies can be a difficult
task.  It is therefore recommended to start with sets of packages, called
@dfn{collections}, and @dfn{schemes}, the name for collections of
collections.  The following command lists available schemes and collections
(@pxref{guix-search,, Invoking guix package}):

@example
guix search texlive-\(scheme\|collection\) | recsel -p name,description
@end example

If needed, you may then complete your system with individual packages,
particularly when they belong to a large collection you're not otherwise
interested in.

For instance, the following manifest is a reasonable, yet frugal starting
point for a French @LaTeX{} user:

@lisp
(specifications->manifest
 '("rubber"

   "texlive-scheme-basic"
   "texlive-collection-latexrecommended"
   "texlive-collection-fontsrecommended"
   "texlive-babel-french"

   ;; From "latexextra" collection.
   "texlive-tabularray"
   ;; From "binextra" collection.
   "texlive-texdoc"))
@end lisp

If you come across a document that does not compile in such a basic setting,
the main difficulty is finding the missing packages.  In this case,
@command{pdflatex} and similar commands tend to fail with obscure error
messages 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
will 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
$ 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

@noindent
The file is available in the @TeX{} Live @code{helvetic} package, which is
known in Guix as @code{texlive-helvetic}.  Quite a ride, but you found it!

@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
* Full-Source Bootstrap::    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 Full-Source Bootstrap
@section The Full-Source Bootstrap

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.

@c XXX TODO: update to savannah url, once accepted there
For @code{i686-linux} and @code{x86_64-linux}, Guix now features a
@dfn{full-source bootstrap}.  This bootstrap is rooted in @file{hex0-seed}
from the @url{https://savannah.gnu.org/projects/stage0, Stage0} package.
The hex0 program is minimalist assembler: it reads space-separated
hexadecimal digits (nibbles) from a file, possibly including comments, and
emits on standard output the bytes corresponding to those hexadecimal
numbers.  The source code of this initial hex0 program is a file called
@url{https://github.com/oriansj/bootstrap-seeds/blob/master/POSIX/x86/hex0_x86.hex0,@file{hex0_x86.hex0}}
and is written in the @code{hex0} language.

Hex0 is self-hosting, which means that it can build itself:

@example
./hex0-seed hex0_x86.hex0 hex0
@end example

Hex0 it is the ASCII-equivalent of the binary program and can be produced by
doing something much like:

@example
sed 's/[;#].*$//g' hex0_x86.hex0 | xxd -r -p > hex0
chmod +x hex0
@end example

It is because of this ASCII-binary equivalence that we can bless this
initial 357-byte binary as source, and hence `full-source bootstrap''.

The bootstrap then continues: @code{hex0} builds @code{hex1} and then on to
@code{M0}, @code{hex2}, @code{M1}, @code{mescc-tools} and finally
@code{M2-Planet}.  Then, using @code{mescc-tools}, @code{M2-Planet} we build
Mes (@pxref{Top, GNU Mes Reference Manual,, mes, GNU Mes}, a Scheme
interpreter and C compiler in Scheme).  From here on starts the more
traditional @code{C}-based bootstrap of the GNU System.

Another step that Guix has taken is to replace the shell and all its
utilities with implementations in Guile Scheme, the @emph{Scheme-only
bootstrap}.  Gash (@pxref{Gash,,, gash, The Gash manual}) is a
POSIX-compatible shell that replaces Bash, and it comes with Gash Utils
which has minimalist replacements for Awk, the GNU Core Utilities, Grep,
Gzip, Sed, and Tar.

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 \
@c   -e '(@@ (gnu packages commencement) gcc-core-mesboot0)' \
@c   | sed -r \
@c     -e 's,((bootstrap-seeds|guile-bootstrap).*shape =) box,\1 ellipse,' \
@c     -e 's,fontname = sans,fontname = "dejavu sans",' \
@c   > doc/images/gcc-core-mesboot0-graph.dot
@image{images/gcc-core-mesboot0-graph,6in,,Grafo de dependencias de
gcc-core-mesboot0}

Work is ongoing to bring these bootstraps to the @code{arm-linux} and
@code{aarch64-linux} architectures and to the Hurd.

If you are interested, join us on @samp{#bootstrappable} on the Libera.Chat
IRC network or discuss on @email{bug-mes@@gnu.org} or
@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 Agradecimientos
@chapter Agradecimientos

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:
