26015 lines
994 KiB
Text
26015 lines
994 KiB
Text
\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 KEY-SERVER pool.sks-keyservers.net
|
||
|
||
@c The official substitute server used by default.
|
||
@set SUBSTITUTE-SERVER ci.guix.es.info
|
||
|
||
@copying
|
||
Copyright @copyright{} 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019
|
||
Ludovic Courtès@* Copyright @copyright{} 2013, 2014, 2016 Andreas Enge@*
|
||
Copyright @copyright{} 2013 Nikita Karetnikov@* Copyright @copyright{} 2014,
|
||
2015, 2016 Alex Kost@* Copyright @copyright{} 2015, 2016 Mathieu Lirzin@*
|
||
Copyright @copyright{} 2014 Pierre-Antoine Rault@* Copyright @copyright{}
|
||
2015 Taylan Ulrich Bayırlı/Kammer@* Copyright @copyright{} 2015, 2016, 2017
|
||
Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018, 2019 Ricardo
|
||
Wurmus@* Copyright @copyright{} 2016 Ben Woodcroft@* Copyright @copyright{}
|
||
2016, 2017, 2018 Chris Marusich@* Copyright @copyright{} 2016, 2017, 2018,
|
||
2019 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@*
|
||
Copyright @copyright{} 2016, 2017 ng0@* Copyright @copyright{} 2016, 2017,
|
||
2018, 2019 Jan Nieuwenhuizen@* Copyright @copyright{} 2016 Julien Lepiller@*
|
||
Copyright @copyright{} 2016 Alex ter Weele@* Copyright @copyright{} 2016,
|
||
2017, 2018, 2019 Christopher Baines@* Copyright @copyright{} 2017, 2018
|
||
Clément Lassieur@* Copyright @copyright{} 2017, 2018 Mathieu Othacehe@*
|
||
Copyright @copyright{} 2017 Federico Beffa@* Copyright @copyright{} 2017,
|
||
2018 Carlo Zancanaro@* Copyright @copyright{} 2017 Thomas Danckaert@*
|
||
Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017
|
||
Christopher Allan Webber@* Copyright @copyright{} 2017, 2018 Marius Bakke@*
|
||
Copyright @copyright{} 2017 Hartmut Goebel@* Copyright @copyright{} 2017
|
||
Maxim Cournoyer@* Copyright @copyright{} 2017, 2018 Tobias Geerinckx-Rice@*
|
||
Copyright @copyright{} 2017 George Clemmer@* Copyright @copyright{} 2017
|
||
Andy Wingo@* Copyright @copyright{} 2017, 2018, 2019 Arun Isaac@* Copyright
|
||
@copyright{} 2017 nee@* Copyright @copyright{} 2018 Rutger Helling@*
|
||
Copyright @copyright{} 2018 Oleg Pykhalov@* Copyright @copyright{} 2018 Mike
|
||
Gerwitz@* Copyright @copyright{} 2018 Pierre-Antoine Rouby@* Copyright
|
||
@copyright{} 2018 Gábor Boskovits@* Copyright @copyright{} 2018 Florian
|
||
Pelz@* Copyright @copyright{} 2018 Laura Lazzati@* Copyright @copyright{}
|
||
2018 Alex Vong@* Copyright @copyright{} 2019 Miguel Ángel Arruga Vivas
|
||
(traducción)@*
|
||
|
||
Se garantiza el permiso de copia, distribución y/o modificación de este
|
||
documento bajo los términos de la licencia de documentación libre de GNU
|
||
(GNU Free Documentation License), versión 1.3 o cualquier versión posterior
|
||
publicada por la Free Software Foundation; sin secciones invariantes, sin
|
||
textos de cubierta delantera ni trasera. Una copia de la licencia está
|
||
incluida en la sección titulada ``GNU Free Documentation License''.
|
||
@end copying
|
||
|
||
@dircategory Administración del sistema
|
||
@direntry
|
||
* Guix: (guix.es). Gestión del software instalado y la
|
||
configuración del sistema.
|
||
* guix package: (guix.es)Llamar a guix package. Instalación, borrado y
|
||
actualización de paquetes.
|
||
* guix gc: (guix.es)Llamar a guix gc. Reclamar espacio de disco sin usar.
|
||
* guix pull: (guix.es)Llamar a guix pull. Actualización de la lista
|
||
disponible de paquetes.
|
||
* guix system: (guix.es)Llamar a guix system. Gestión de la configuración
|
||
del sistema operativo.
|
||
@end direntry
|
||
|
||
@dircategory Desarrollo de software
|
||
@direntry
|
||
* guix environment: (guix.es)Llamar a guix environment. Construcción de
|
||
entornos de
|
||
desarrollo con
|
||
Guix.
|
||
* guix build: (guix.es)Llamar a guix build. Construcción de paquetes.
|
||
* guix pack: (guix.es)Llamar a 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 Las desarrolladoras 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 Inglés (@pxref{Top,,, guix, GNU Guix
|
||
Reference Manual}), en Francés (@pxref{Top,,, guix.fr, Manuel de référence
|
||
de GNU Guix}) y Alemán (@pxref{Top,,, guix.de, Referenzhandbuch zu GNU
|
||
Guix}). Si quiere traducirlo a su lengua nativa, considere unirse a
|
||
@uref{https://translationproject.org/domain/guix-manual.html, Translation
|
||
Project}.
|
||
|
||
@menu
|
||
* Introducción:: ¿Qué es esto de Guix?
|
||
* Instalación:: Instalar Guix.
|
||
* Instalación del sistema:: Instalar el sistema operativo completo.
|
||
* Gestión de paquetes:: Instalación de paquetes, actualización, etc.
|
||
* Desarrollo:: Desarrollo de software asistido por Guix
|
||
* Interfaz programática:: Uso de Guix en Scheme.
|
||
* Utilidades:: Órdenes de gestión de paquetes.
|
||
* Configuración del sistema:: Configurar el sistema operativo.
|
||
* Documentación:: Navegar por los manuales de usuaria del
|
||
software.
|
||
* Instalación de ficheros de depuración:: Alimentación del depurador.
|
||
* Actualizaciones de seguridad:: Desplegar correcciones de seguridad
|
||
rápidamente.
|
||
* Lanzamiento inicial:: GNU/Linux construido de cero.
|
||
* Transportar:: Adaptación para otra plataforma o núcleo.
|
||
* Contribuir:: ¡Se necesita su ayuda!
|
||
|
||
* Reconocimientos:: ¡Gracias!
|
||
* Licencia de documentación libre GNU:: La licencia de este manual.
|
||
* Índice de conceptos:: Conceptos.
|
||
* Índice programático:: Tipos de datos, funciones y variables.
|
||
|
||
@detailmenu
|
||
--- La lista detallada de nodos ---
|
||
|
||
|
||
|
||
Introducción
|
||
|
||
|
||
|
||
* La forma de gestión de software de Guix:: Qué es especial.
|
||
* Distribución GNU:: Los paquetes y herramientas.
|
||
|
||
Instalación
|
||
|
||
|
||
|
||
* Instalación binaria:: ¡Poner Guix en funcionamiento en nada de
|
||
tiempo!
|
||
* Requisitos:: Software necesario para construir y ejecutar
|
||
Guix.
|
||
* Ejecución de la batería de pruebas:: Probar Guix.
|
||
* Preparación del daemon:: Preparar el entorno del daemon de
|
||
construcción.
|
||
* Invocación de guix-daemon:: Ejecutar el daemon de construcción.
|
||
* Configuración de la aplicación:: Configuración específica de la
|
||
aplicación.
|
||
|
||
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 gc:: Ejecutar el recolector de basura.
|
||
* Invocación de guix pull:: Obtener la última versión de Guix y la
|
||
distribución.
|
||
* Canales:: Personalizar el recolector de basura.
|
||
* 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 ficheros del almacén.
|
||
|
||
Sustituciones
|
||
|
||
|
||
|
||
* Servidor oficial de sustituciones.:: Una fuente particular de
|
||
sustituciones.
|
||
* Autorización de servidores de sustituciones:: Cómo habilitar o
|
||
deshabilitar
|
||
sustituciones.
|
||
* Verificación de sustituciones:: Cómo verifica las sustituciones Guix.
|
||
* Configuración de la pasarela.:: Cómo obtener sustituciones a través de
|
||
una pasarela.
|
||
* Fallos en las sustituciones:: Qué pasa cuando una sustitución falla.
|
||
* Sobre la confianza en binarios:: ¿Cómo puede usted confiar en esa masa
|
||
informe de datos binarios?
|
||
|
||
Desarrollo
|
||
|
||
|
||
|
||
* Invocación de guix environment:: Configurar entornos de desarrollo.
|
||
* Invocación de guix pack:: Creación de empaquetados de software.
|
||
|
||
Interfaz programática
|
||
|
||
|
||
|
||
* Módulos de paquetes:: Paquetes bajo el punto de vista del
|
||
programador.
|
||
* Definición de paquetes:: Definir nuevos paquetes.
|
||
* Sistemas de construcción:: Especificar como se construyen los paquetes.
|
||
* 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:: Enredar con Guix interactivamente.
|
||
|
||
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 fichero e imprimir su hash.
|
||
* Invocación de guix hash:: Calcular el hash criptográfico de un fichero.
|
||
* Invocación de guix import:: Importar definiciones de paquetes.
|
||
* Invocación de guix refresh:: Actualizar definiciones de paquetes.
|
||
* 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.
|
||
|
||
Configuración del sistema
|
||
|
||
|
||
|
||
* Uso de la configuración del sistema:: Personalizar su sistema GNU.
|
||
* Referencia de ``operating-system'':: Detalle de las declaraciones de
|
||
sistema operativo.
|
||
* Sistemas de ficheros:: Configurar el montaje de sistemas de ficheros.
|
||
* Dispositivos traducidos:: Procesamiento extra de dispositivos de bloques.
|
||
* Cuentas de usuaria:: Especificar las cuentas de usuaria.
|
||
* Distribución de teclado:: Cómo interpreta el sistema las pulsaciones
|
||
del teclado.
|
||
* Localizaciones:: Configuración de idioma y convenciones
|
||
culturales.
|
||
* Servicios:: Especificar los servicios del sistema.
|
||
* Programas con setuid:: Programas que se ejecutan con privilegios de
|
||
root.
|
||
* 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.
|
||
* 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.
|
||
|
||
Servicios
|
||
|
||
|
||
|
||
* Servicios base:: Servicios esenciales del sistema.
|
||
* Ejecución de tareas programadas:: El servicio mcron.
|
||
* Rotación de logs:: El servicio rottlog.
|
||
* Servicios de red:: Configuración de red, daemon SSH, etc.
|
||
* Sistema X Window:: Interfaz gráfica.
|
||
* Servicios de impresión:: Soporte de impresoras locales y remotas.
|
||
* Servicios de escritorio:: D-Bus y servicios de escritorio.
|
||
* Servicios de sonido:: Servicios de ALSA y Pulseaudio.
|
||
* Servicios de bases de datos:: Bases de datos SQL, almacenes de
|
||
clave-valor, etc.
|
||
* Servicios de correo:: IMAP, POP3, SMTP y todo eso.
|
||
* Servicios de mensajería:: Servicios de mensajería.
|
||
* Servicios de telefonía:: Servicios de telefonía.
|
||
* Servicios de monitorización:: Servicios de monitorización.
|
||
* Servicios Kerberos:: Servicios Kerberos.
|
||
* Servicios Web:: Servidores Web.
|
||
* Servicios de certificados:: Certificados TLS via Let's Encrypt.
|
||
* Servicios DNS:: Demonios DNS.
|
||
* Servicios VPN:: Demonios VPN.
|
||
* Sistema de ficheros en red:: Servicios relacionados con NFS.
|
||
* Integración continua:: El servicio Cuirass.
|
||
* Servicios de gestión de energía:: Extender la vida de la batería.
|
||
* Servicios de audio:: El MPD.
|
||
* Servicios de virtualización:: Servicios de virtualización.
|
||
* Servicios de control de versiones:: Proporcionar acceso remoto a
|
||
repositorios Git.
|
||
* Servicios de juegos:: Servidores de juegos.
|
||
* 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.
|
||
|
||
@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,
|
||
``gi:ks'' en el alfabeto fonético internacional (IPA).} es una herramienta
|
||
de gestión de paquetes y una distribucion 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
|
||
* La forma de gestión de software de Guix:: Qué es especial.
|
||
* Distribución GNU:: Los paquetes y herramientas.
|
||
@end menu
|
||
|
||
@node La forma de gestión de software de Guix
|
||
@section La forma de gestión de software de 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 preconstruidos de fuentes autorizadas
|
||
(@pxref{Sustituciones})
|
||
|
||
@cindex extensibilidad de la distribución
|
||
@cindex personalización, de paquetes
|
||
Guix incluye definiciones de paquetes para muchos paquetes GNU y no-GNU,
|
||
todos los cuales @uref{https://www.gnu.org/philosophy/free-sw.html, respetan
|
||
la libertad de computación de la usuaria}. Es @emph{extensible}: las
|
||
usuarias pueden escribir sus propias definiciones de paquetes
|
||
(@pxref{Definición de paquetes}) y hacerlas disponibles como módulos
|
||
independientes de paquetes (@pxref{Módulos de paquetes}). También es
|
||
@emph{personalizable}: las usuarias pueden @emph{derivar} definiciones de
|
||
paquetes especializadas de las existentes, inclusive desde la línea de
|
||
órdenes (@pxref{Opciones de transformación de paquetes}).
|
||
|
||
@cindex gestión de paquetes funcional
|
||
@cindex aislamiento
|
||
En su implementación, Guix utiliza la disciplina de @dfn{gestión de paquetes
|
||
funcional} en la que Nix fue pionero (@pxref{Reconocimientos}). En Guix, el
|
||
proceso de construcción e instalación es visto como una @emph{función}, en
|
||
el sentido matemático. Dicha función toma entradas, como los guiones de
|
||
construcción, un compilador, unas bibliotecas y devuelve el paquete
|
||
instalado. Como función pura, su resultado únicamente depende de sus
|
||
entradas---por ejemplo, no puede hacer referencia a software o guiones que
|
||
no fuesen pasados explícitamente como entrada. Una función de construcción
|
||
siempre produce el mismo resultado cuando se le proporciona un conjunto de
|
||
entradas dado. No puede modificar el entorno del sistema que la ejecuta de
|
||
ninguna forma; por ejemplo, no puede crear, modificar o borrar archivos
|
||
fuera de sus directorios de construcción e instalación. Esto se consigue
|
||
ejecutando los procesos de construcción en entornos aislados (o
|
||
@dfn{contenedores}), donde únicamente sus entradas explícitas son visibles.
|
||
|
||
@cindex almacén
|
||
El resultado de las funciones de construcción de paquetes es @dfn{almacenado
|
||
en la caché} en el sistema de ficheros, 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{http://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 puede navegarse
|
||
@url{http://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, núcleo Linux-Libre;
|
||
|
||
@item i686-linux
|
||
arquitectura de 32-bits Intel (IA32), 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 el
|
||
núcleo Linux-Libre.
|
||
|
||
@item aarch64-linux
|
||
procesadores de 64-bits ARMv8 little-endian, núcleo Linux-Libre. Está
|
||
actualmente en una fase experimental, con soporte
|
||
limitado. @xref{Contribuir}, para cómo ayudar.
|
||
|
||
@item mips64el-linux
|
||
procesadores MIPS 64-bits little-endian, específicamente las series
|
||
Loongson, n32 ABI, y núcleo Linux-Libre.
|
||
|
||
@end table
|
||
|
||
Con el sistema@tie{}Guix, @emph{declara} todos los aspectos de la
|
||
configuración del sistema y Guix se hace cargo de instanciar la
|
||
configuración de manera transaccional, reproducible y sin estado global
|
||
(@pxref{Configuración del sistema}). El sistema Guix usa el núcleo Linux-libre,
|
||
el sistema de inicialización Shepherd (@pxref{Introducción,,, shepherd, The
|
||
GNU Shepherd Manual}), las conocidas utilidades y herramientas de
|
||
compilación GNU, así como el entorno gráfico o servicios del sistema de su
|
||
elección.
|
||
|
||
El sistema Guix está disponible en todas las plataformas previas excepto
|
||
@code{mips64el-linux}.
|
||
|
||
@noindent
|
||
Para información sobre el transporte a otras arquitecturas o núcleos,
|
||
@pxref{Transportar}.
|
||
|
||
La construcción de esta distribución es un esfuerzo cooperativo, ¡y esta
|
||
invitada a unirse! @xref{Contribuir}, para información sobre cómo puede
|
||
ayudar.
|
||
|
||
|
||
@c *********************************************************************
|
||
@node Instalación
|
||
@chapter Instalación
|
||
|
||
@cindex instalar Guix
|
||
|
||
@quotation Nota
|
||
Recomendamos el uso de este @uref{https://git.savannah.gnu.org/cgit/guix."
|
||
"git/plain/etc/guix-install.sh, guión de shell de instalación} para instalar
|
||
Guix sobre un sistema GNU/Linux en ejecución, de aquí en adelante referido
|
||
como una @dfn{distribución distinta}.@footnote{Esta sección está dedicada a
|
||
la instalación del gestor de paquetes, que puede realizarse sobre un sistema
|
||
GNU/Linux ya en ejecución. Si, en vez de eso, desdea instalar el sistema
|
||
operativo GNU completo, @pxref{Instalación del sistema}.} El guión automatiza la
|
||
descarga, instalación y configuración inicial de Guix. Debe ejecutarse como
|
||
la usuaria de administración root.
|
||
@end quotation
|
||
|
||
@cindex distribución distinta
|
||
@cindex directorios relacionados con una distribución distinta
|
||
Cuando está instalado sobre una distribución distinta, GNU@tie{}Guix
|
||
complementa las herramientas disponibles sin interferencias. Sus datos
|
||
radican exclusivamente en dos directorios, normalmente @file{/gnu/store} y
|
||
@file{/var/guix}; otros ficheros en su sistema, como @file{/etc}, permanecen
|
||
intactos.
|
||
|
||
Una vez instalado, Guix puede ser actualizado ejecutando @command{guix pull}
|
||
(@pxref{Invocación de guix pull}.
|
||
|
||
Si prefiere realizar los pasos de instalación manualmente o desea
|
||
personalizarlos, puede encontrar útiles las siguientes
|
||
instrucciones. Describen los requisitos de software de Guix, así como su
|
||
instalación manual y la preparación para su uso.
|
||
|
||
@menu
|
||
* Instalación binaria:: ¡Poner Guix en funcionamiento en nada de
|
||
tiempo!
|
||
* Requisitos:: Software necesario para construir y ejecutar
|
||
Guix.
|
||
* Ejecución de la batería de pruebas:: Probar Guix.
|
||
* Preparación del daemon:: Preparar el entorno del daemon de
|
||
construcción.
|
||
* Invocación de guix-daemon:: Ejecutar el daemon de construcción.
|
||
* Configuración de la aplicación:: Configuración específica de la
|
||
aplicación.
|
||
@end menu
|
||
|
||
@node Instalación binaria
|
||
@section Instalación binaria
|
||
|
||
@cindex instalar Guix desde binarios
|
||
@cindex guión del instalador
|
||
Esta sección describe cómo instalar Guix en un sistema arbitrario desde un
|
||
archivador autocontenido que proporciona los binarios para Guix y todas sus
|
||
dependencias. Esto es normalmente más rápido que una instalación desde las
|
||
fuentes, la cual es descrita en las siguientes secciones. El único requisito
|
||
es tener GNU@tie{}tar y Xz.
|
||
|
||
La instalación consiste más o menos en los siguientes pasos:
|
||
|
||
@enumerate
|
||
@item
|
||
@cindex descargar el binario de Guix
|
||
Descargue el archivador con los binarios de
|
||
@indicateurl{https://alpha.gnu.org/gnu/guix/guix-binary-@value{VERSION}.@var{sistema}.tar.xz},
|
||
donde @var{sistema} es @code{x86_64-linux} para una máquina @code{x86_64}
|
||
que ejecute el núcleo Linux, etcétera.
|
||
|
||
@c The following is somewhat duplicated in ``System Installation''.
|
||
Asegurese de descargar el fichero @file{.sig} asociado y de verificar la
|
||
autenticidad del archivador con él, más o menos así:
|
||
|
||
@example
|
||
$ wget https://alpha.gnu.org/gnu/guix/guix-binary-@value{VERSION}.@var{sistema}.tar.xz.sig
|
||
$ gpg --verify guix-binary-@value{VERSION}.@var{sistema}.tar.xz.sig
|
||
@end example
|
||
|
||
Si la orden falla porque no dispone de la clave pública necesaria, entonces
|
||
ejecute esta otra orden para importarla:
|
||
|
||
@example
|
||
$ gpg --keyserver @value{KEY-SERVER} \
|
||
--recv-keys @value{OPENPGP-SIGNING-KEY-ID}
|
||
@end example
|
||
|
||
@noindent
|
||
@c end authentication part
|
||
y vuelva a ejecutar la orden @code{gpg --verify}.
|
||
|
||
@item
|
||
Ahora necesita convertirse en la usuaria @code{root}. Dependiendo de su
|
||
distribución, puede que tenga que ejecutar @code{su -} o @code{sudo
|
||
-i}. Como @code{root}, ejecute:
|
||
|
||
@example
|
||
# cd /tmp
|
||
# tar --warning=no-timestamp -xf \
|
||
guix-binary-@value{VERSION}.@var{sistema}.tar.xz
|
||
# mv var/guix /var/ && mv gnu /
|
||
@end example
|
||
|
||
Esto crea @file{/gnu/store} (@pxref{El almacén}) y @file{/var/guix}. El
|
||
último contiene un perfil listo para usar para @code{root} (vea el siguiente
|
||
paso).
|
||
|
||
@emph{No} extraiga el archivador en un sistema Guix ya funcionando ya que
|
||
sobreescribiría sus propios ficheros esenciales.
|
||
|
||
La opción @code{--warning=no-timestamp} asegura que GNU@tie{}tar no emite
|
||
avisos sobre ``marcas de tiempo imposibles'' (dichos avisos eran emitidos
|
||
por GNU@tie{}tar 1.26 y anteriores; las versiones recientes están
|
||
bien). Parten del hecho de que todos los ficheros en el archivador tienen su
|
||
tiempo de modificación fijado a cero (que significa el 1 de enero de
|
||
1970). Esto es hecho voluntariamente para asegurarse de que el contenido del
|
||
archivador es independiente de su fecha de creación, haciendolo por tanto
|
||
reproducible.
|
||
|
||
@item
|
||
Ponga disponible el perfil en @file{~root/.config/guix/current}, que es
|
||
donde @command{guix pull} instalará las actualizaciones (@pxref{Invocación de guix pull}):
|
||
|
||
@example
|
||
# mkdir -p ~root/.config/guix
|
||
# ln -sf /var/guix/profiles/per-user/root/current-guix \
|
||
~root/.config/guix/current
|
||
@end example
|
||
|
||
Cargue @file{etc/profile} para aumentar @code{PATH} y otras variables de
|
||
entorno relevantes:
|
||
|
||
@example
|
||
# GUIX_PROFILE="`echo ~root`/.config/guix/current" ; \
|
||
source $GUIX_PROFILE/etc/profile
|
||
@end example
|
||
|
||
@item
|
||
Cree el grupo y las cuentas de usuaria para las usuarias de construcción
|
||
como se explica a continuación (@pxref{Configuración del entorno de construcción}).
|
||
|
||
@item
|
||
Ejecute el daemon, y configurelo para iniciarse automáticamente al arranque.
|
||
|
||
Si su distribución anfitriona usa el sistema de inicio systemd, puede
|
||
conseguirlo con estas órdenes:
|
||
|
||
@c Versions of systemd that supported symlinked service files are not
|
||
@c yet widely deployed, so we should suggest that users copy the service
|
||
@c files into place.
|
||
@c
|
||
@c See this thread for more information:
|
||
@c http://lists.gnu.org/archive/html/guix-devel/2017-01/msg01199.html
|
||
|
||
@example
|
||
# cp ~root/.config/guix/current/lib/systemd/system/guix-daemon.service \
|
||
/etc/systemd/system/
|
||
# systemctl start guix-daemon && systemctl enable guix-daemon
|
||
@end example
|
||
|
||
Si su distribución anfitriona usa el sistema de inicio Upstart:
|
||
|
||
@example
|
||
# initctl reload-configuration
|
||
# cp ~root/.config/guix/current/lib/upstart/system/guix-daemon.conf \
|
||
/etc/init/
|
||
# start guix-daemon
|
||
@end example
|
||
|
||
En otro caso, todavía puede iniciar el daemon manualmente con:
|
||
|
||
@example
|
||
# ~root/.config/guix/current/bin/guix-daemon \
|
||
--build-users-group=guixbuild
|
||
@end example
|
||
|
||
@item
|
||
Haga accesible la orden @command{guix} a otras usuarias de la máquina, por
|
||
ejemplo con:
|
||
|
||
@example
|
||
# mkdir -p /usr/local/bin
|
||
# cd /usr/local/bin
|
||
# ln -s /var/guix/profiles/per-user/root/current-guix/bin/guix
|
||
@end example
|
||
|
||
Es también una buena idea poner disponible la versión Info de este manual
|
||
ahí:
|
||
|
||
@example
|
||
# mkdir -p /usr/local/share/info
|
||
# cd /usr/local/share/info
|
||
# for i in /var/guix/profiles/per-user/root/current-guix/share/info/* ;
|
||
do ln -s $i ; done
|
||
@end example
|
||
|
||
De este modo, asumiendo que @file{/usr/local/share/info} está en la ruta de
|
||
búsqueda, ejecutar @command{info guix.es} abrirá este manual (@pxref{Other
|
||
Info Directories,,, texinfo, GNU Texinfo}, para más detalles sobre cómo
|
||
cambiar la ruta de búsqueda de Info).
|
||
|
||
@item
|
||
@cindex sustituciones, autorización de las mismas
|
||
Para usar sustituciones de @code{@value{SUBSTITUTE-SERVER}} o uno de sus
|
||
espejos (@pxref{Sustituciones}), debe autorizarlas:
|
||
|
||
@example
|
||
# guix archive --authorize < \
|
||
~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER}.pub
|
||
@end example
|
||
|
||
@item
|
||
Cada usuaria puede necesitar dar algunos pasos adicionales para prepar su
|
||
entorno de Guix para el uso, @pxref{Configuración de la aplicación}.
|
||
@end enumerate
|
||
|
||
Voilà, ¡la instalación está completa!
|
||
|
||
Puede confirmar que Guix está funcionando instalando un paquete de ejemplo
|
||
en su perfil de root:
|
||
|
||
@example
|
||
# guix package -i hello
|
||
@end example
|
||
|
||
El paquete @code{guix} debe permanecer disponible en el perfil de
|
||
@code{root}, o podría verse sujeto a la recolección de basura---en cuyo caso
|
||
se encontraría seriamente lastrada por la falta de la orden
|
||
@command{guix}. En otras palabras, no borre @code{guix} ejecutando
|
||
@code{guix package -r guix}.
|
||
|
||
El archivador de la instalación binaria puede ser (re)producido y verificado
|
||
simplemente ejecutando la siguiente orden en el árbol de fuentes de Guix:
|
||
|
||
@example
|
||
make guix-binary.@var{sistema}.tar.xz
|
||
@end example
|
||
|
||
@noindent
|
||
...@: que a su vez ejecuta:
|
||
|
||
@example
|
||
guix pack -s @var{sistema} --localstatedir \
|
||
--profile-name=current-guix guix
|
||
@end example
|
||
|
||
@xref{Invocación de guix pack}, para más información sobre esta útil herramienta.
|
||
|
||
@node Requisitos
|
||
@section Requisitos
|
||
|
||
Esta sección enumera los requisitos para construir Guix desde las
|
||
fuentes. El procedimiento de construcción de Guix es el mismo que el de otro
|
||
software GNU, y no está cubierto aquí. Por favor, eche un vistazo a los
|
||
ficheros @file{README} y @file{INSTALL} en el árbol de fuentes de Guix para
|
||
obtener detalles adicionales.
|
||
|
||
@cindex página web oficial
|
||
GNU Guix está disponible para descarga desde su página web en
|
||
@url{http://www.gnu.org/software/guix/}.
|
||
|
||
GNU Guix depende de los siguientes paquetes:
|
||
|
||
@itemize
|
||
@item @url{http://gnu.org/software/guile/, GNU Guile}, versión 2.2.x;
|
||
@item @url{https://notabug.org/cwebber/guile-gcrypt, Guile-Gcrypt}, versión
|
||
0.1.0 o posterior;
|
||
@item
|
||
@uref{http://gnutls.org/, GnuTLS}, específicamente su API Guile
|
||
(@pxref{Guile Preparations, how to install the GnuTLS bindings for Guile,,
|
||
gnutls-guile, GnuTLS-Guile});
|
||
@item
|
||
@uref{https://notabug.org/guile-sqlite3/guile-sqlite3, Guile-SQLite3},
|
||
versión 0.1.0 o posterior;
|
||
@item
|
||
@c FIXME: Specify a version number once a release has been made.
|
||
@uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, de agosto de 2017
|
||
o posterior;
|
||
@item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON};
|
||
@item @url{http://zlib.net, zlib};
|
||
@item @url{http://www.gnu.org/software/make/, GNU Make}.
|
||
@end itemize
|
||
|
||
Las siguientes dependencias son opcionales:
|
||
|
||
@itemize
|
||
@item
|
||
@c Note: We need at least 0.10.2 for 'channel-send-eof'.
|
||
Las características de delegación de construcciones (@pxref{Configuración de delegación del daemon}) y de @command{guix copy} (@pxref{Invocación de guix copy}) dependen de
|
||
@uref{https://github.com/artyom-poptsov/guile-ssh, Guile-SSH}, versión
|
||
0.10.2 o posterior.
|
||
|
||
@item
|
||
Cuando @url{http://www.bzip.org, libbz2} está disponible, @command{guix
|
||
daemon} puede usarla para comprimir los log de construcción.
|
||
@end itemize
|
||
|
||
A menos que se pasase @code{--disable-daemon} a @command{configure}, los
|
||
siguientes paquetes también son necesarios:
|
||
|
||
@itemize
|
||
@item @url{http://gnupg.org/, GNU libgcrypt};
|
||
@item @url{http://sqlite.org, SQLite 3};
|
||
@item @url{http://gcc.gnu.org, g++ de GCC} con soporte para el
|
||
estándar C++11
|
||
@end itemize
|
||
|
||
@cindex directorio de estado
|
||
Cuando se configura Guix en un sistema que ya tiene una instalación de Guix,
|
||
asegurese de especificar el mismo directorio de estado que el de la
|
||
instalación existente usando la opción @code{--localstatedir} al guión
|
||
@command{configure} (@pxref{Directory Variables, @code{localstatedir},,
|
||
standards, GNU Coding Standards}). El guión @command{configure} le proteje
|
||
ante una mala configuración no deseada de @var{localstatedir} de modo que no
|
||
pueda corromper inadvertidamente su almacén (@pxref{El almacén}).
|
||
|
||
@cindex Nix, compatibilidad
|
||
Cuando está disponible una instalación en funcionamiento del
|
||
@url{http://nixos.org/nix/, gestor de paquetes Nix}, puede a su vez
|
||
configurar Guix con @code{--disable-daemon}. En ese caso, Nix reemplaza las
|
||
tres dependencias anteriores.
|
||
|
||
Guix es compatible con Nix, así que es posible compartir el mismo almacén
|
||
entre ambos. Para hacerlo debe pasar a @command{configure} no solo el mismo
|
||
valor de @code{--with-store-dir}, sino también el mismo valor de
|
||
@code{--localstatedir}. El último es esencial debido a que especifica la
|
||
base de datos donde se encuentran almacenados los metadatos del almacén,
|
||
entre otras cosas. Los valores predeterminados para Nix son
|
||
@code{--with-store-dir=/nix/store} y @code{--localstatedir=/nix/var}. Fíjese
|
||
que no se requiere @code{--disable-daemon} si su objetivo es compartir el
|
||
almacén con Nix.
|
||
|
||
@node Ejecución de la batería de pruebas
|
||
@section Ejecución de la batería de pruebas
|
||
|
||
@cindex batería de pruebas
|
||
Después de una ejecución exitosa de @command{configure} y @code{make}, es
|
||
una buena idea ejecutar la batería de pruebas. Puede ayudar a encontrar
|
||
problemas con la configuración o el entorno, o errores en el mismo Guix---e
|
||
informar de fallos en las pruebas es realmente una buena forma de ayudar a
|
||
mejorar el software. Para ejecutar la batería de pruebas, teclee:
|
||
|
||
@example
|
||
make check
|
||
@end example
|
||
|
||
Los casos de prueba pueden ejecutarse en paralelo: puede usar la opción
|
||
@code{-j} de GNU@tie{}make para acelerar las cosas. La primera ejecución
|
||
puede tomar algunos minutos en una máquina reciente; las siguientes
|
||
ejecuciones serán más rápidas puesto que el almacén creado para las pruebas
|
||
ya tendrá varias cosas en la caché.
|
||
|
||
Tambien es posible ejecutar un subconjunto de las pruebas definiendo la
|
||
variable de makefile @code{TESTS} como en el ejemplo:
|
||
|
||
@example
|
||
make check TESTS="tests/store.scm tests/cpio.scm"
|
||
@end example
|
||
|
||
Por defecto, los resultados de las pruebas se muestran a nivel de
|
||
fichero. Para ver los detalles de cada caso de prueba individual, es posible
|
||
definir la variable de makefile @code{SCM_LOG_DRIVER_FLAGS} como en el
|
||
ejemplo:
|
||
|
||
@example
|
||
make check TESTS="tests/base64.scm" SCM_LOG_DRIVER_FLAGS="--brief=no"
|
||
@end example
|
||
|
||
En caso de fallo, le rogamos que envíe un correo a @email{bug-guix@@gnu.org}
|
||
y adjunte el fichero @file{test-suite.log}. Por favor, especifique la
|
||
versión de Guix usada así como los números de versión de las dependencias
|
||
(@pxref{Requisitos}) en su mensaje.
|
||
|
||
Guix también viene como una batería de pruebas del sistema completo que
|
||
prueban instancias completas del sistema Guix. Se puede ejecutar únicamente
|
||
en sistemas donde Guix ya está instalado, usando:
|
||
|
||
@example
|
||
make check-system
|
||
@end example
|
||
|
||
@noindent
|
||
o, de nuevo, definiendo @code{TESTS} para seleccionar un subconjunto de las
|
||
pruebas a ejecutar:
|
||
|
||
@example
|
||
make check-system TESTS="basic mcron"
|
||
@end example
|
||
|
||
Estas pruebas de sistema están definidas en los módulos @code{(gnu tests
|
||
@dots{})}. Funcionan ejecutando el sistema operativo con una instrumentación
|
||
ligera en una máquina virtual (VM). Pueden ser computacionalmente intensivas
|
||
o bastante baratas, dependiendo de si hay sustituciones disponibles para sus
|
||
dependencias (@pxref{Sustituciones}). Algunas requieren mucho espacio de
|
||
almacenamiento para alojar las imágenes de la máquina virtual.
|
||
|
||
De nuevo, en caso de fallos en las pruebas, le rogamos que envíe a
|
||
@email{bug-guix@@gnu.org} todos los detalles.
|
||
|
||
@node Preparación del daemon
|
||
@section Preparación del daemon
|
||
|
||
@cindex daemon
|
||
Operaciones como la construcción de un paquete o la ejecución del recolector
|
||
de basura son realizadas por un proceso especializado, el @dfn{daemon de
|
||
construcción}, en delegación de sus clientes. Únicamente el daemon puede
|
||
acceder al almacén y su base de datos asociada. Por tanto, cualquier
|
||
operación que manipula el almacén se realiza a través del daemon. Por
|
||
ejemplo, las herramientas de línea de órdenes como @command{guix package} y
|
||
@command{guix build} se comunican con el daemon (@i{via} llamadas a
|
||
procedimientos remotos) para indicarle qué hacer.
|
||
|
||
Las siguientes secciones explican cómo preparar el entorno del daemon de
|
||
construcción. Véase tambien @ref{Sustituciones}, para información sobre cómo
|
||
permitir al daemon descargar binarios pre-construidos.
|
||
|
||
@menu
|
||
* Configuración del entorno de construcción:: Preparar el entorno aislado
|
||
de construcción.
|
||
* Configuración de delegación del daemon:: Delegar construcciones a
|
||
máquinas remotas.
|
||
* Soporte de SELinux:: Uso de una política SELinux para el daemon.
|
||
@end menu
|
||
|
||
@node Configuración del entorno de construcción
|
||
@subsection Configuración del entorno de construcción
|
||
|
||
@cindex entorno de construcción
|
||
En una configuración multiusuaria estándar, Guix y su daemon---el programa
|
||
@command{guix-daemon}---son instalados por la administradora del sistema;
|
||
@file{/gnu/store} pertenece a @code{root} y @command{guix-daemon} se ejecuta
|
||
como @code{root}. Usuarias sin privilegios pueden usar las herramientas de
|
||
Guix para construir paquetes o acceder al almacén de otro modo, y el daemon
|
||
lo hará en delegación suya, asegurando que el almacén permanece en un estado
|
||
consistente, y permitiendo compartir entre usuarias los paquetes
|
||
construidos.
|
||
|
||
@cindex usuarias de construcción
|
||
Mientras que @command{guix-daemon} se ejecuta como @code{root}, puede que no
|
||
desee que los procesos de construcción de paquetes se ejecuten como
|
||
@code{root} también, por razones de seguridad obvias. Para evitarlo, una
|
||
reserva especial de @dfn{usuarias de construcción} debe ser creada para ser
|
||
usada por los procesos de construcción iniciados por el daemon. Estas
|
||
usuarias de construcción no necesitan tener un shell ni un directorio home:
|
||
simplemente serán usadas cuando el daemon se deshaga de los privilegios de
|
||
@code{root} en los procesos de construcción. Tener varias de dichas usuarias
|
||
permite al daemon lanzar distintos procesos de construcción bajo UID
|
||
separados, lo que garantiza que no interferirán entre ellos---una
|
||
característica esencial ya que las construcciones se caracterizan como
|
||
funciones puras (@pxref{Introducción}).
|
||
|
||
En un sistema GNU/Linux, una reserva de usuarias de construcción puede ser
|
||
creada así (usando la sintaxis de Bash y las órdenes de @code{shadow}):
|
||
|
||
@c See http://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 "Usuaria de construcción Guix $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}).
|
||
|
||
El programa @code{guix-daemon} puede ser ejecutado entonces como @code{root}
|
||
con la siguiente orden@footnote{Si su máquina usa el sistema de inicio
|
||
systemd, copiando el fichero
|
||
@file{@var{prefix}/lib/systemd/system/guix-daemon.service} en
|
||
@file{/etc/systemd/system} asegurará que @command{guix-daemon} se arranca
|
||
automáticamente. De igual modo, si su máquina usa el sistema de inicio
|
||
Upstart, copie el fichero
|
||
@file{@var{prefix}/lib/upstart/system/guix-daemon.conf} en
|
||
@file{/etc/init}.}:
|
||
|
||
@example
|
||
# guix-daemon --build-users-group=guixbuild
|
||
@end example
|
||
|
||
@cindex chroot
|
||
@noindent
|
||
De este modo, el daemon inicia los procesos de construcción en un
|
||
``chroot'', bajo una de las usuarias @code{guixbuilder}. En GNU/Linux, por
|
||
defecto, el entorno ``chroot'' contiene únicamente:
|
||
|
||
@c Keep this list in sync with libstore/build.cc! -----------------------
|
||
@itemize
|
||
@item
|
||
un directorio @code{/dev} mínimo, creado en su mayor parte
|
||
independientemente del @code{/dev} del sistema anfitrión@footnote{``En su
|
||
mayor parte'', porque mientras el conjunto de ficheros que aparecen en
|
||
@code{/dev} es fijo, la mayor parte de estos ficheros 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
|
||
|
||
Puede influir en el directorio que el daemon utiliza para almacenar los
|
||
árboles de construcción @i{via} la variable de entorno @code{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 @code{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
|
||
El daemon también respeta la variable de entorno @code{http_proxy} para las
|
||
descargas HTTP que realiza, sea para derivaciones de salida fija
|
||
(@pxref{Derivaciones}) o para sustituciones (@pxref{Sustituciones}).
|
||
|
||
Si está instalando Guix como una usuaria sin privilegios, es posible todavía
|
||
ejecutar @command{guix-daemon} siempre que pase @code{--disable-chroot}. No
|
||
obstante, los procesos de construcción no estarán aislados entre sí ni del
|
||
resto del sistema. Por tanto, los procesos de construcción pueden interferir
|
||
entre ellos y pueden acceder a programas, bibliotecas y otros ficheros
|
||
disponibles en el sistema---haciendo mucho más difícil verlos como funciones
|
||
@emph{puras}.
|
||
|
||
|
||
@node Configuración de delegación del daemon
|
||
@subsection Uso de la facilidad de descarga de trabajo
|
||
|
||
@cindex delegando trabajo
|
||
@cindex hook 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{hook 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, una lista de máquinas
|
||
de construcción especificadas por la usuaria es leída de
|
||
@file{/etc/guix/machines.scm}; cada vez que se solicita una construcción,
|
||
por ejemplo via @code{guix build}, el daemon intenta delegarla a una de las
|
||
máquinas que satisfaga las condiciones de la derivación, en particular su
|
||
tipo de sistema---por ejemplo, @file{x86_64-linux}. Los prerrequisitos
|
||
restantes para la construcción son copiados por SSH a la máquina objetivo,
|
||
la cual procede con la construcción; con un resultado satisfactorio la(s)
|
||
salida(s) de la construcción son copiadas de vuelta a la máquina inicial.
|
||
|
||
El fichero @file{/etc/guix/machines.scm} normalmente tiene un contenido de
|
||
este estilo:
|
||
|
||
@example
|
||
(list (build-machine
|
||
(name "ochentayseis.example.org")
|
||
(system "x86_64-linux")
|
||
(host-key "ssh-ed25519 AAAAC3Nza@dots{}")
|
||
(user "rober")
|
||
(speed 2.)) ;¡increíblemente rápida!
|
||
|
||
(build-machine
|
||
(name "mimips.example.org")
|
||
(system "mips64el-linux")
|
||
(host-key "ssh-rsa AAAAB3Nza@dots{}")
|
||
(user "alicia")
|
||
(private-key
|
||
(string-append (getenv "HOME")
|
||
"/.ssh/identidad-para-guix"))))
|
||
@end example
|
||
|
||
@noindent
|
||
En el ejemplo anterior se especifica una lista de dos máquinas de
|
||
construcción, una para la arquitectura @code{x86_64} y otra para la
|
||
arquitectura @code{mips64el}.
|
||
|
||
De hecho, este fichero es---¡sin sorpresa ninguna!---un fichero Scheme que
|
||
se evalúa cuando el hook @code{offload} se inicia. El valor que devuelve
|
||
debe ser una lista de objetos @code{build-machine}. Mientras que este
|
||
ejemplo muestra una lista fija de máquinas de construcción, una puede
|
||
imaginarse, digamos, el uso de DNS-SD para devolver una lista de máquinas de
|
||
construcción potenciales descubierta en la red local (@pxref{Introducción,
|
||
Guile-Avahi,, guile-avahi, Using Avahi in Guile Scheme Programs}). El tipo
|
||
de datos @code{build-machine} se detalla a continuación.
|
||
|
||
@deftp {Tipo de datos} build-machine
|
||
Este tipo de datos representa las máquinas de construcción a las cuales el
|
||
daemon puede delegar construcciones. Los campos importantes son:
|
||
|
||
@table @code
|
||
|
||
@item name
|
||
El nombre de red de la máquina remota.
|
||
|
||
@item system
|
||
El sistema de la máquina remota---por ejemplo, @code{"x86_64-linux"}.
|
||
|
||
@item user
|
||
La cuenta de usuaria a usar cuando se conecte a la máquina remota por
|
||
SSH. Tenga en cuenta que el par de claves SSH @emph{no} debe estar protegido
|
||
por contraseña, para permitir ingresos al sistema no interactivos.
|
||
|
||
@item host-key
|
||
Este campo debe contener la @dfn{clave pública de la máquina} de SSH en
|
||
formato OpenSSH. Es usado para autentificar la máquina cuando nos conectamos
|
||
a ella. Es una cadena larga más o menos así:
|
||
|
||
@example
|
||
ssh-ed25519 AAAAC3NzaC@dots{}mde+UhL recordatorio@@example.org
|
||
@end example
|
||
|
||
Si la máquina está ejecutando el daemon OpenSSH, @command{sshd}, la clave
|
||
pública de la máquina puede encontrarse en un fichero como
|
||
@file{/etc/ssh/ssh_host_ed25519_key.pub}.
|
||
|
||
Si la máquina está ejecutando el daemon SSH GNU@tie{}lsh, @command{lshd}, la
|
||
clave de la máquina está en @file{/etc/lsh/host-key.pub} o un fichero
|
||
similar. Puede convertirse a formato OpenSSH usando @command{lsh-export-key}
|
||
(@pxref{Converting keys,,, lsh, LSH Manual}):
|
||
|
||
@example
|
||
$ lsh-export-key --openssh < /etc/lsh/host-key.pub
|
||
ssh-rsa AAAAB3NzaC1yc2EAAAAEOp8FoQAAAQEAs1eB46LV@dots{}
|
||
@end example
|
||
|
||
@end table
|
||
|
||
Ciertos número de campos opcionales pueden ser especificados:
|
||
|
||
@table @asis
|
||
|
||
@item @code{port} (predeterminado: @code{22})
|
||
Número de puerto del servidor SSH en la máquina.
|
||
|
||
@item @code{private-key} (predeterminada: @file{~root/.ssh/id_rsa})
|
||
El fichero 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}. Asegurese 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 ficheros hacia y desde
|
||
máquinas de construcción.
|
||
|
||
@item @code{daemon-socket} (predeterminado: @code{"/var/guix/daemon-socket/socket"})
|
||
Nombre de fichero del socket de dominio Unix en el que @command{guix-daemon}
|
||
escucha en esa máquina.
|
||
|
||
@item @code{parallel-builds} (predeterminadas: @code{1})
|
||
El número de construcciones que pueden ejecutarse en paralelo en la máquina.
|
||
|
||
@item @code{speed} (predeterminado: @code{1.0})
|
||
Un ``factor de velocidad relativa''. El planificador de delegaciones tenderá
|
||
a preferir máquinas con un factor de velocidad mayor.
|
||
|
||
@item @code{features} (predeterminadas: @code{'()})
|
||
Una lista de cadenas denotando las características específicas permitidas
|
||
por la máquina. Un ejemplo es @code{"kvm"} para máquinas que tienen los
|
||
módulos KVM de Linux y las correspondientes características hardware. Las
|
||
derivaciones pueden solicitar las características por nombre, y entonces se
|
||
planificarán en las máquinas adecuadas.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
El ejecutable @code{guix} debe estar en la ruta de búsqueda de las máquinas
|
||
de construcción. Puede comprobar si es el caso ejecutando:
|
||
|
||
@example
|
||
ssh build-machine guix repl --version
|
||
@end example
|
||
|
||
Hay una última cosa por hacer una vez @file{machines.scm} está en su
|
||
lugar. Como se ha explicado anteriormente, cuando se delega, los ficheros 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 ficheros en el
|
||
almacén (@pxref{Invocación de guix archive}):
|
||
|
||
@example
|
||
# guix archive --generate-key
|
||
@end example
|
||
|
||
@noindent
|
||
Cada máquina de construcción debe autorizar a la clave de la máquina maestra
|
||
para que acepte elementos del almacén que reciba de la maestra:
|
||
|
||
@example
|
||
# guix archive --authorize < clave-publica-maestra.txt
|
||
@end example
|
||
|
||
@noindent
|
||
Del mismo podo, la máquina maestra debe autorizar la clave de cada máquina
|
||
de construcción.
|
||
|
||
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 ficheros 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
|
||
|
||
Esto intentará conectar con cada una de las máquinas de construcción
|
||
especificadas en @file{/etc/guix/machines.scm}, comprobará que GUile y los
|
||
módulos Guix están disponibles en cada máquina, intentará exportar a la
|
||
máquina e importar de ella, e informará de cualquier error en el proceso.
|
||
|
||
Si quiere probar un fichero de máquinas diferente, simplemente especifiquelo
|
||
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 fichero de política SELinux en @file{etc/guix-daemon.cil}
|
||
que puede ser instalado en un sistema donde SELinux está activado, para
|
||
etiquetar los ficheros Guix y especificar el comportamiento esperado del
|
||
daemon. Ya que el sistema Guix no proporciona una política base de SELinux,
|
||
la política del daemon no puede usarse en el sistema Guix.
|
||
|
||
@subsubsection Instalación de la política de SELinux
|
||
@cindex SELinux, instalación de la política
|
||
Para instalar la política ejecute esta orden como root:
|
||
|
||
@example
|
||
semodule -i etc/guix-daemon.cil
|
||
@end example
|
||
|
||
Una vez hecho, vuelva a etiquetar el sistema de ficheros con
|
||
@code{restorecon} o con un mecanismo distinto que proporcione su sistema.
|
||
|
||
Una vez la política está instalada, el sistema de ficheros 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 ficheros 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} no se usa realmente. Ninguna de las operaciones
|
||
del socket implica contextos que tengan algo que ver con
|
||
@code{guix_daemon_socket_t}. No hace daño tener esta etiqueta sin usar, pero
|
||
sería preferible definir reglas del socket únicamente para esta etiqueta.
|
||
|
||
@item
|
||
@code{guix gc} no puede acceder enlaces arbitrarios a los perfiles. Por
|
||
diseño, la etiqueta del fichero del destino de un enlace simbólico es
|
||
independiente de la etiqueta de fichero del fichero en sí. Aunque todos los
|
||
perfiles bajo $localstatedir se etiquetan, los enlaces para estos perfiles
|
||
heredan la etiqueta del directorio en el que están. Para enlaces en el
|
||
directorio de la usuaria esto será @code{user_home_t}. Pero para los enlaces
|
||
del directorio de root, o @file{/tmp}, o del directorio del servidor HTTP,
|
||
etc., esto no funcionará. @code{guix gc} se verá incapacitado para leer y
|
||
seguir dichos enlaces.
|
||
|
||
@item
|
||
La característica del daemon de esperar conexiones TCP puede que no funcione
|
||
más. Esto puede requerir reglas extra, ya que SELinux trata los sockets de
|
||
red de forma diferente a los ficheros.
|
||
|
||
@item
|
||
Actualmente todos los ficheros 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}
|
||
fichero 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 ficheros permitidos para los procesos en dicho dominio.
|
||
|
||
Podríamos generar una política mucho más restrictiva en tiempo de
|
||
instalación, de modo que solo el nombre @emph{exacto} del fichero del
|
||
ejecutable de @code{guix-daemon} actualmente instalado sea marcado como
|
||
@code{guix_daemon_exec_t}, en vez de usar una expresión regular amplia. La
|
||
desventaja es que root tendría que instalar o actualizar la política en
|
||
tiempo de instalación cada vez que se actualizase el paquete de Guix que
|
||
proporcione el ejecutable de @code{guix-daemon} realmente en ejecución.
|
||
@end enumerate
|
||
|
||
@node Invocación de guix-daemon
|
||
@section Invocación de @command{guix-daemon}
|
||
|
||
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
|
||
|
||
@noindent
|
||
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
|
||
@code{--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 ficheros, 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 @code{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}.
|
||
|
||
El directorio de construcción se borra automáticamente una vez completado el
|
||
proceso, a menos que la construcción fallase y se especificase en el cliente
|
||
@option{--keep-failed} (@pxref{Invocación de guix build,
|
||
@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 ejecuta con @code{--no-substitutes}, los clientes aún
|
||
pueden activar explícitamente las sustituciones @i{via} la llamada de
|
||
procedimiento remoto @code{set-build-options} (@pxref{El almacén}).
|
||
|
||
@item --substitute-urls=@var{urls}
|
||
@anchor{daemon-substitute-urls}
|
||
Considera @var{urls} la lista separada por espacios predeterminada de URLs
|
||
de sustituciones de fuentes. Cuando se omite esta opción, se usa
|
||
@indicateurl{https://@value{SUBSTITUTE-SERVER}}.
|
||
|
||
Esto significa que las sustituciones puede ser descargadas de @var{urls},
|
||
mientras estén firmadas por una firma de confianza (@pxref{Sustituciones}).
|
||
|
||
@cindex hook de construcción
|
||
@item --no-build-hook
|
||
No usa el @dfn{hook de construcción}.
|
||
|
||
El hook de construcción es un programa auxiliar que el daemon puede lanzar y
|
||
al cual envía las peticiones de construcción. Este mecanismo se utiliza para
|
||
delegar construcciones a otras máquinas (@pxref{Configuración de delegación del daemon}).
|
||
|
||
@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 @code{--cores} de @command{guix build}
|
||
(@pxref{Invocación de guix build}).
|
||
|
||
El efecto es definir la variable de entorno @code{NIX_BUILD_CORES} en el
|
||
proceso de construcción, el cual puede usarla para explotar el paralelismo
|
||
interno---por ejemplo, ejecutando @code{make -j$NIX_BUILD_CORES}.
|
||
|
||
@item --max-jobs=@var{n}
|
||
@itemx -M @var{n}
|
||
Permite como máximo @var{n} trabajos de construcción en paralelo. El valor
|
||
predeterminado es @code{1}. Fijarlo a @code{0} significa que ninguna
|
||
construcción se realizará localmente; en vez de eso, el daemon delegará las
|
||
construcciones (@pxref{Configuración de delegación del daemon}), o simplemente fallará.
|
||
|
||
@item --max-silent-time=@var{segundos}
|
||
Cuando la construcción o sustitución permanece en silencio más de
|
||
@var{segundos}, la finaliza e informa de un fallo de construcción.
|
||
|
||
El valor predeterminado es @code{0}, que deshabilita el plazo.
|
||
|
||
El valor especificado aquí puede ser sobreescrito por clientes
|
||
(@pxref{Opciones comunes de construcción, @code{--max-silent-time}}).
|
||
|
||
@item --timeout=@var{segundos}
|
||
Del mismo modo, cuando el proceso de construcción o sustitución dura más de
|
||
@var{segundos}, lo termina e informa un fallo de construcción.
|
||
|
||
El valor predeterminado es @code{0}, que deshabilita el plazo.
|
||
|
||
El valor especificado aquí puede ser sobreescrito por los clientes
|
||
(@pxref{Opciones comunes de construcción, @code{--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 entonces
|
||
puede ser cambiado el comportamiento por los clientes, por ejemplo la opción
|
||
@code{--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, asegurese que cada derivación declara
|
||
todas las entradas que necesita.
|
||
|
||
@item --disable-chroot
|
||
Deshabilita las construcciones en un chroot.
|
||
|
||
No se recomienda el uso de esta opción ya que, de nuevo, podría permitir a
|
||
los procesos de construcción ganar acceso a dependencias no declaradas. Es
|
||
necesario, no obstante, cuando @command{guix-daemon} se ejecuta bajo una
|
||
cuenta de usuaria sin privilegios.
|
||
|
||
@item --log-compression=@var{tipo}
|
||
Comprime los logs de construcción de acuerdo a @var{tipo}, que puede ser
|
||
@code{gzip}, @code{bzip2} o @code{none}.
|
||
|
||
A menos que se use @code{--lose-logs}, todos los log de construcción se
|
||
mantienen en @var{localstatedir}. Para ahorrar espacio, el daemon
|
||
automáticamente los comprime con bzip2 por defecto.
|
||
|
||
@item --disable-deduplication
|
||
@cindex deduplicación
|
||
Deshabilita la ``deduplicación'' automática en el almacén.
|
||
|
||
Por defecto, los ficheros se añaden al almacén ``deduplicados''
|
||
automáticamente: si un nuevo fichero añadido es idéntico a otro que ya se
|
||
encuentra en el almacén, el daemon introduce el nuevo fichero como un enlace
|
||
duro al otro fichero. 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 deshabilita esta
|
||
optimización.
|
||
|
||
@item --gc-keep-outputs[=yes|no]
|
||
Determina si el recolector de basura (GC) debe mantener salidas de las
|
||
derivaciones vias.
|
||
|
||
@cindex GC, raíces del recolector de basura
|
||
@cindex raíces del recolector de basura
|
||
Cuando se usa ``yes'', el recolector de basura mantendrá las salidas de
|
||
cualquier derivación viva disponible en el almacén---los ficheros
|
||
@code{.drv}. El valor predeterminado es ``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 raices 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 ``yes'', como es el caso predeterminado, el recolector de
|
||
basura mantiene derivaciones---es decir, ficheros @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 ``no'' aquí
|
||
ahorra un poco de espacio en disco.
|
||
|
||
De este modo, usar @code{--gc-keep-derivations} con valor ``yes'' provoca
|
||
que la vitalidad fluya de salidas a derivaciones, y usar
|
||
@code{--gc-keep-outputs} con valor ``yes'' provoca que la vitalidad fluya de
|
||
derivaciones a salidas. Cuando ambas tienen valor ``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 ahorra
|
||
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 @code{uname} del kernel indicará 2.6 como el número de
|
||
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. Por defecto se almacenan bajo
|
||
@code{@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}
|
||
Escucha conexiones en @var{destino}. @var{destino} se interpreta como el
|
||
nombre del fichero 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
|
||
Escucha por conexiones en el socket de dominio Unix @file{/gnu/var/daemon},
|
||
creandolo 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
|
||
Escucha conexiones TCP en la interfaz de red correspondiente a
|
||
@code{localhost}, en el puerto 44146.
|
||
|
||
@item --listen=128.0.0.42:1234
|
||
Escucha 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 fijando la variable de entorno @code{GUIX_DAEMON_SOCKET}
|
||
(@pxref{El almacén, @code{GUIX_DAEMON_SOCKET}}).
|
||
|
||
@quotation Nota
|
||
El protocolo del daemon @code{no está autentificado ni cifrado}. El uso de
|
||
@code{--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 @code{--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 @i{via} Guix no usarán los datos de localización del
|
||
sistema anfitrión. En vez de eso, debe primero instalar uno de los paquetes
|
||
de localización disponibles con Guix y después definir la variable de
|
||
entorno @code{GUIX_LOCPATH}:
|
||
|
||
@example
|
||
$ guix package -i glibc-locales
|
||
$ export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale
|
||
@end example
|
||
|
||
Fíjese que el paquete @code{glibc-locales} contiene datos para todas las
|
||
localizaciones que ofrece GNU@tie{}libc y pesa alrededor de
|
||
110@tie{}MiB. Alternativamente, @code{glibc-utf8-locales} es más pequeño
|
||
pero limitado a localizaciones UTF-8.
|
||
|
||
La variable @code{GUIX_LOCPATH} juega un rol similar a @code{LOCPATH}
|
||
(@pxref{Locale Names, @code{LOCPATH},, libc, The GNU C Library Reference
|
||
Manual}). No obstante, hay dos diferencias importantes:
|
||
|
||
@enumerate
|
||
@item
|
||
@code{GUIX_LOCPATH} es respetada únicamente por la libc dentro de Guix, y no
|
||
por la libc que proporcionan las distribuciones distintas. Por tanto, usar
|
||
@code{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 @code{GUIX_LOCPATH} con @code{/X.Y},
|
||
donde @code{X.Y} es la versión de libc---por ejemplo, @code{2.22}. Esto
|
||
significa que, en caso que su perfil Guix contenga una mezcla de programas
|
||
enlazados contra diferentes versiones de libc, cada versión de libc
|
||
únicamente intentará cargar datos de localización en el formato correcto.
|
||
@end enumerate
|
||
|
||
Esto es importante porque el formato de datos de localización usado por
|
||
diferentes versiones de libc puede ser incompatible.
|
||
|
||
@subsection Selector de servicios de nombres
|
||
|
||
@cindex selector de servicios de nombres, glibc
|
||
@cindex NSS (selector de servicios de nombres), glibc
|
||
@cindex ncsd (daemon de caché del servicio de nombres)
|
||
@cindex daemon de caché del servicio de nombres (ncsd)
|
||
Cuando se usa Guix en una distribución distinta, @emph{recomendamos
|
||
encarecidamente} que el sistema ejecute el @dfn{daemon de caché del servicio
|
||
de nombres} de la biblioteca de C de GNU, @command{ncsd}, que debe escuchar
|
||
en el socket @file{/var/run/nscd/socket}. En caso de no hacerlo, las
|
||
aplicaciones instaladas con Guix pueden fallar al buscar nombres de máquinas
|
||
o cuentas de usuaria, o incluso pueden terminar abruptamente. Los siguientes
|
||
párrafos explican por qué.
|
||
|
||
@cindex @file{nsswitch.conf}
|
||
La biblioteca de C de GNU implementa un @dfn{selector de servicios de
|
||
nombres} (NSS), que es un mecanismo extensible para ``búsquedas de nombres''
|
||
en general: resolución de nombres de máquinas, cuentas de usuaria y más
|
||
(@pxref{Selector de servicios de nombres,,, libc, The GNU C Library Reference Manual}).
|
||
|
||
@cindex Servicio de información de red (NIS)
|
||
@cindex NIS (servicio de información de red)
|
||
Al ser extensible, NSS permite el uso de @dfn{módulos}, los cuales
|
||
proporcionan nuevas implementaciones de búsqueda de nombres: por ejemplo, el
|
||
módulo @code{nss-mdns} permite la resolución de nombres de máquina
|
||
@code{.local}, el módulo @code{nis} permite la búsqueda de cuentas de
|
||
usuaria usando el servicio de información de red (NIS), etc. Estos
|
||
``servicios de búsqueda'' extra se configuran para todo el sistema en
|
||
@file{/etc/nsswitch.conf}, y todos los programas en ejecución respetan esta
|
||
configuración (@pxref{NSS Configuration File,,, libc, The GNU C Reference
|
||
Manual}).
|
||
|
||
Cuando se realiza una búsqueda de nombres---por ejemplo, llamando a la
|
||
función @code{getaddrinfo} en C---las aplicaciones primero intentarán
|
||
conectar con nscd; en caso satisfactorio, nscd realiza la búsqueda de
|
||
nombres en delegación suya. Si nscd no está ejecutándose, entonces realizan
|
||
la búsqueda por ellas mismas, cargando los servicios de búsqueda de nombres
|
||
en su propio espacio de direcciones y ejecutándola. Estos servicios de
|
||
búsqueda de nombres---los ficheros @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 ficheros @code{libnss_*.so}
|
||
se cargan en el proceso @command{nscd}, no en la aplicación misma.
|
||
|
||
@subsection Tipografías X11
|
||
|
||
@cindex tipografías
|
||
La mayoría de aplicaciones gráficas usan Fontconfig para encontrar y cargar
|
||
tipografías y realizar la renderización del lado del cliente X11. El paquete
|
||
@code{fontconfig} en Guix busca tipografías en @file{$HOME/.guix-profile}
|
||
por defecto. Por tanto, para permitir a aplicaciones gráficas instaladas con
|
||
Guix mostrar tipografías, tiene que instalar las tipografías también con
|
||
Guix. Paquetes esenciales de tipografías incluyen @code{gs-fonts},
|
||
@code{font-dejavu} y @code{font-gnu-freefont-ttf}.
|
||
|
||
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 package -i 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í.
|
||
|
||
@cindex @code{fc-cache}
|
||
@cindex caché de tipografías
|
||
Después de instalar tipografías puede tener que refrescar la caché de
|
||
tipografías para usarlas en las aplicaciones. Lo mismo aplica cuando las
|
||
aplicaciones instaladas vía Guix no parecen encontrar tipografías. Para
|
||
forzar la reconstrucción de la caché de tipografías ejecute @code{fc-cache
|
||
-f}. La orden @code{fc-cache} es proporcionada por el paquete
|
||
@code{fontconfig}.
|
||
|
||
@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 instala paquetes Emacs con Guix, los ficheros elisp pueden estar
|
||
tanto en @file{$HOME/.guix-profile/share/emacs/site-lisp/} o en
|
||
subdirectorios de
|
||
@file{$HOME/.guix-profile/share/emacs/site-lisp/guix.d/}. El último
|
||
directorio existe porque potencialmente pueden existir miles de paquetes
|
||
Emacs, y almacenar todos sus ficheros en un directorio único puede no ser
|
||
confiable (por conflictos de nombres). Por lo que pensamos que usar un
|
||
directorio separado por cada paquete es una buena idea. Es muy similar a
|
||
cómo el sistema de paquetes de Emacs organiza la estructura de ficheros
|
||
(@pxref{Package Files,,, emacs, The GNU Emacs Manual}).
|
||
|
||
Por defecto, Emacs (el instalado con Guix) ``sabe'' donde se alojan estos
|
||
paquetes, para que usted no tenga que realizar ninguna configuración. Si,
|
||
por alguna razón, desea evitar la carga automática de paquetes Emacs
|
||
instalados con Guix, puede hacerlo ejecutando Emacs con la opción
|
||
@code{--no-site-file} (@pxref{Init File,,, emacs, The GNU Emacs Manual}).
|
||
|
||
@subsection La cadena de herramientas de GCC
|
||
|
||
@cindex GCC
|
||
@cindex ld-wrapper
|
||
|
||
Guix ofrece paquetes de compiladores individuales como @code{gcc}, pero si
|
||
necesita una cadena de herramientas completa para compilar y enlazar código
|
||
fuente lo que realmente desea es el paquete @code{gcc-toolchain}. Este
|
||
paquete proporciona una cadena de herramientas GCC para desarrollo C/C++,
|
||
incluyendo el mismo GCC, la biblioteca de C GNU (cabeceras y binarios, más
|
||
símbolos de desarrollo en 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 fijando el valor de la
|
||
variable de entorno @code{GUIX_LD_WRAPPER_ALLOW_IMPURITIES} a @code{no}.
|
||
|
||
@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
|
||
|
||
We consider Guix System to be ready for a wide range of ``desktop'' and
|
||
server use cases. The reliability guarantees it provides---transactional
|
||
upgrades and rollbacks, reproducibility---make it a solid foundation.
|
||
|
||
Nevertheless, before you proceed with the installation, be aware of the
|
||
following noteworthy limitations applicable to version @value{VERSION}:
|
||
|
||
@itemize
|
||
@item
|
||
No está implementada la funcionalidad del gestor de volúmenes lógicos (LVM).
|
||
|
||
@item
|
||
Se proporcionan más y más servicios del sistema (@pxref{Servicios}), pero
|
||
pueden faltar algunos.
|
||
|
||
@item
|
||
GNOME, Xfce, LXDE, and Enlightenment are available (@pxref{Servicios de escritorio}), as well as a number of X11 window managers. However, KDE is
|
||
currently missing.
|
||
@end itemize
|
||
|
||
More than a disclaimer, this is an invitation to report issues (and success
|
||
stories!), and to join us in improving it. @xref{Contribuir}, for more
|
||
info.
|
||
|
||
|
||
@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
|
||
One of the main areas where free drivers or firmware are lacking is WiFi
|
||
devices. WiFi devices known to work include those using Atheros chips
|
||
(AR9271 and AR7010), which corresponds to the @code{ath9k} Linux-libre
|
||
driver, and those using Broadcom/AirForce chips (BCM43xx with Wireless-Core
|
||
Revision 5), which corresponds to the @code{b43-open} Linux-libre driver.
|
||
Free firmware exists for both and is available out-of-the-box on Guix
|
||
System, as part of @code{%base-firmware} (@pxref{Referencia de ``operating-system'',
|
||
@code{firmware}}).
|
||
|
||
@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{https://alpha.gnu.org/gnu/guix/guix-system-install-@value{VERSION}.@var{sistema}.iso.xz},
|
||
donde @var{sistema} es 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''
|
||
Asegurese de descargar el fichero @file{.sig} asociado y de verificar la
|
||
autenticidad de la imagen contra él, más o menos así:
|
||
|
||
@example
|
||
$ wget https://alpha.gnu.org/gnu/guix/guix-system-install-@value{VERSION}.@var{sistema}.iso.xz.sig
|
||
$ gpg --verify guix-system-install-@value{VERSION}.@var{sistema}.iso.xz.sig
|
||
@end example
|
||
|
||
Si la orden falla porque no dispone de la clave pública necesaria, entonces
|
||
ejecute esta otra orden para importarla:
|
||
|
||
@example
|
||
$ gpg --keyserver @value{KEY-SERVER} \
|
||
--recv-keys @value{OPENPGP-SIGNING-KEY-ID}
|
||
@end example
|
||
|
||
@noindent
|
||
@c end duplication
|
||
y vuelva a ejecutar la orden @code{gpg --verify}.
|
||
|
||
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
|
||
|
||
Para copiar la imagen en una memoria USB, siga estos pasos:
|
||
|
||
@enumerate
|
||
@item
|
||
Descomprima la imagen usando la orden @command{xz}:
|
||
|
||
@example
|
||
xz -d guix-system-install-@value{VERSION}.@var{sistema}.iso.xz
|
||
@end example
|
||
|
||
@item
|
||
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}.@var{sistema}.iso of=/dev/sdX
|
||
sync
|
||
@end example
|
||
|
||
El acceso a @file{/dev/sdX} normalmente necesita privilegios de root.
|
||
@end enumerate
|
||
|
||
@unnumberedsubsec Grabación en un DVD
|
||
|
||
Para copiar la imagen a un DVD, siga estos pasos:
|
||
|
||
@enumerate
|
||
@item
|
||
Descomprima la imagen usando la orden @command{xz}:
|
||
|
||
@example
|
||
xz -d guix-system-install-@value{VERSION}.@var{sistema}.iso.xz
|
||
@end example
|
||
|
||
@item
|
||
Introduzca un DVD escribible en su máquina, 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}.@var{sistema}.iso
|
||
@end example
|
||
|
||
El acceso a @file{/dev/srX} normalmente necesita privilegios de root.
|
||
@end enumerate
|
||
|
||
@unnumberedsubsec Arranque
|
||
|
||
Una vez hecho esto, debe ser capaz de reiniciar el sistema y arrancar desde
|
||
la memoria USB o el DVD. Lo primero habitualmente requiere que introducirse
|
||
en la BIOS o en el menú de arranque UEFI, donde se puede seleccionar el
|
||
arranque desde la memoria USB.
|
||
|
||
@xref{Instalación de Guix en una máquina virtual}, si, en vez de esto, desea instalar el
|
||
sistema Guix en una máquina virtual (VM).
|
||
|
||
|
||
@node Preparación para la instalación
|
||
@section Preparación para la instalación
|
||
|
||
Una vez que haya arrancado, puede usar el instalador gráfico guiado, el cual
|
||
facilita la introducción al sistema (@pxref{Instalación gráfica guiada}). Alternativamente, si ya es está familiarizada con GNU/Linux
|
||
y desea más control que el que proporciona el instalador gráfico, puede
|
||
seleccionar el proceso de instalación ``manual'' (@pxref{Instalación manual}).
|
||
|
||
El instalador gráfico está disponible en TTY1. Puede obtener consolas de
|
||
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
|
||
ficheros 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 shell y con las herramientas de administración comunes. Si
|
||
puensa que no es para usted, considere el uso del instalador gráfico guiado
|
||
(@pxref{Instalación gráfica guiada}).
|
||
|
||
El sistema de instalación proporciona consolas de root en los terminales
|
||
virtuales (TTY) 3 a 6; pulse @kbd{ctrl-alt-f3}, @kbd{ctrl-alt-f4} y
|
||
sucesivas teclas para abrirlas. Incluye muchas herramientas comunes
|
||
necesarias para la instalación del sistema. Pero es también un sistema Guix
|
||
completo, lo que significa que puede instalar paquetes adicionales, en caso
|
||
de necesitarlos, mediante el uso de @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 ficheros 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.
|
||
|
||
@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 a
|
||
@end example
|
||
|
||
@c http://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
|
||
|
||
@item Conexión sin cable
|
||
@cindex sin cables
|
||
@cindex WiFi
|
||
Para configurar una red inalámbrica, puede crear un fichero 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 fichero 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 ejecutelo 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 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
|
||
|
||
Asegurese de fijar una contraseña con @command{passwd}, o configurar la
|
||
verificación de clave pública de OpenSSH para la introducción en el 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}. Ejecutelo 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), asegurese
|
||
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
|
||
|
||
Una vez haya terminado con el particionado de la unidad de disco deseada,
|
||
tiene que crear un sistema de ficheros en la o las particiónes
|
||
relevantes@footnote{Actualmente el sistema Guix únicamente permite sistemas
|
||
de ficheros ext4 y btrfs. En particular, el código que lee UUIDs del sistema
|
||
de ficheros y etiquetas únicamente funciona para dichos sistemas de
|
||
ficheros.}. Para la ESP, si tiene una y asumiendo que es @file{/dev/sda1},
|
||
ejecute:
|
||
|
||
@example
|
||
mkfs.fat -F32 /dev/sda1
|
||
@end example
|
||
|
||
Preferentemente, asigne una etiqueta a los sistemas de ficheros de modo que
|
||
pueda referirse a ellos de forma fácil y precisa en las declaraciones
|
||
@code{file-system} (@pxref{Sistemas de ficheros}). 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 ficheros 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 --type luks /dev/sda1 mi-particion
|
||
mkfs.ext4 -L mi-raiz /dev/mapper/mi-particion
|
||
@end example
|
||
|
||
Una vez hecho esto, monte el sistema de ficheros deseado bajo @file{/mnt}
|
||
con una orden como (de nuevo, asumiendo que @code{mi-raiz} es la etiqueta
|
||
del sistema de ficheros raíz):
|
||
|
||
@example
|
||
mount LABEL=mi-raiz /mnt
|
||
@end example
|
||
|
||
Monte también cualquier otro sistema de ficheros 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.
|
||
|
||
Finalmente, si planea usar una o más particiones de intercambio
|
||
(@pxref{Memory Concepts, swap space,, libc, The GNU C Library Reference
|
||
Manual}), asegurese de inicializarla con @command{mkswap}. Asumiendo que
|
||
tuviese una partición de intercambio en @file{/dev/sda3}, ejecutaría:
|
||
|
||
@example
|
||
mkswap /dev/sda3
|
||
swapon /dev/sda3
|
||
@end example
|
||
|
||
De manera alternativa, puede usar un fichero de intercambio. Por ejemplo,
|
||
asumiendo que en el nuevo sistema desea usar el fichero
|
||
@file{/fichero-de-intercambio} como tal, ejecutaría@footnote{Este ejemplo
|
||
funcionará para muchos tipos de sistemas de ficheros (por ejemplo, ext4). No
|
||
obstante, para los sistemas de ficheros con mecanismos de
|
||
copia-durante-escritura (por ejemplo, btrfs) los pasos pueden diferir. 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 mantiene el fichero únicamente legible y
|
||
# escribible por root.
|
||
chmod 600 /mnt/swapfile
|
||
mkswap /mnt/swapfile
|
||
swapon /mnt/swapfile
|
||
@end example
|
||
|
||
Fijese que si ha cifrado la partición raíz y creado un fichero de
|
||
intercambio en su sistema de ficheros como se ha descrito anteriormente, el
|
||
cifrado también protege al fichero de intercambio, como a cualquier fichero
|
||
en dicho sistema de ficheros.
|
||
|
||
@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 ficheros en
|
||
memoria.
|
||
|
||
Después debe editar un fichero y proporcionar la declaración de sistema
|
||
operativo a instalar. Para dicho fin, el sistema de instalación viene con
|
||
tres editores de texto. Recomendamos GNU nano (@pxref{Top,,, nano, GNU nano
|
||
Manual}), que permite el resaltado de sintaxis y correspondencia de
|
||
paréntesis; los otros editores son GNU Zile (un clon de Emacs) y nvi (un
|
||
clon del editor @command{vi} original de BSD). Le recomendamos
|
||
encarecidamente almacenar ese fichero en el sistema de ficheros raíz,
|
||
digamos, como @file{/mnt/etc/config.scm}. En caso de no hacerlo, habrá
|
||
perdido su configuración del sistema una vez arranque en el sistema recién
|
||
instalado.
|
||
|
||
@xref{Uso de la configuración del sistema}, para hacerse una idea del fichero 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 fichero de configuración contiene, y en
|
||
particular:
|
||
|
||
@itemize
|
||
@item
|
||
Asegurese que la forma @code{bootloader-configuration} especifica la
|
||
localización deseada de la instalación de GRUB. Debe mencionar
|
||
@code{grub-bootloader} si está usando GRUB con el arranque antiguo, o
|
||
@code{grub-efi-bootloader} para sistemas más nuevos UEFI. Para los sistemas
|
||
antiguos, el campo @code{target} denomina un dispositivo, como
|
||
@code{/dev/sda}; para los sistemas UEFI denomina la ruta de una partición
|
||
EFI montada, como @code{/boot/efi}; asegurese de que la ruta está
|
||
actualmente montada y haya una entrada @code{file-system} especificada en su
|
||
configuración.
|
||
|
||
@item
|
||
Asegurese que las etiquetas de su sistema de ficheros 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, asegurese de añadir un campo
|
||
@code{mapped-devices} para describirlas (@pxref{Dispositivos traducidos}).
|
||
@end itemize
|
||
|
||
Una vez haya terminado de preparar el fichero de configuración, el nuevo
|
||
sistema debe ser inicializado (recuerde que el sistema de ficheros raíz
|
||
deseado está montado bajo @file{/mnt}):
|
||
|
||
@example
|
||
guix system init /mnt/etc/config.scm /mnt
|
||
@end example
|
||
|
||
@noindent
|
||
Esto copia todos los ficheros necesarios e instala GRUB en @file{/dev/sdX},
|
||
a menos que proporcione la opción @option{--no-bootloader}. Para más
|
||
información, @pxref{Invocación de guix system}. Esta orden puede desencadenar
|
||
descargas o construcciones de paquetes no encontrados, lo cual puede tomar
|
||
algún tiempo.
|
||
|
||
Una vez que la orden se complete---¡y, deseablemente, de forma
|
||
satisfactoria!---puede ejecutar @command{reboot} y arrancar con el nuevo
|
||
sistema. La contraseña de @code{root} en el nuevo sistema está vacía
|
||
inicialmente; otras contraseñas de usuarias tienen que ser inicializadas
|
||
ejecutando la orden @command{passwd} como @code{root}, a menos que en su
|
||
configuración se especifique de otra manera (@pxref{user-account-password,
|
||
contraseñas de cuentas de usuaria}). ¡@xref{Tras la instalación del sistema} para
|
||
proceder a continuación!
|
||
|
||
|
||
@node Tras la instalación del sistema
|
||
@section Tras la instalación del sistema
|
||
|
||
¡Éxito! ¡Ha arrancado en el sistema Guix! De ahora en adelante, puede
|
||
actualizar el sistema cuando quiera mediante la ejecución de, digamos:
|
||
|
||
@example
|
||
guix pull
|
||
sudo guix system reconfigure /etc/config.scm
|
||
@end example
|
||
|
||
@noindent
|
||
Esto construye una nueva generación del sistema con los últimos paquetes y
|
||
servicios (@pxref{Invocación de guix system}). Recomendamos realizarlo de manera
|
||
regular de modo que su sistema incluya las últimas actualizaciones de
|
||
seguridad (@pxref{Actualizaciones de seguridad}).
|
||
|
||
@c See <https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00268.html>.
|
||
@quotation Nota
|
||
@cindex sudo y @command{guix pull}
|
||
Tenga en cuenta que @command{sudo guix} ejecuta el ejecutable @command{guix}
|
||
de su usuaria y @emph{no} el de root, ya que @command{sudo} no altera
|
||
@code{PATH}. Para ejecutar explícitamente el ejecutable @command{guix} de
|
||
root, escriba @command{sudo -i guix @dots{}}.
|
||
@end quotation
|
||
|
||
¡Unase a nosotras en @code{#guix} en la red IRC Freenode o en
|
||
@file{guix-devel@@gnu.org} para compartir su experiencia!
|
||
|
||
|
||
@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{http://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 guixsd.img 50G
|
||
@end example
|
||
|
||
El fichero 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 \
|
||
-net user -net nic,model=virtio -boot menu=on \
|
||
-drive file=guix-system-install-@value{VERSION}.@var{sistema}.iso \
|
||
-drive file=guixsd.img
|
||
@end example
|
||
|
||
El orden de las unidades importa.
|
||
|
||
En la consola de la VM, pulse rápidamente la tecla @kbd{F12} para entrar al
|
||
menú de arranque. Pulse la tecla @kbd{2} y la tecla @kbd{RET} para confirmar
|
||
su selección.
|
||
|
||
@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{guixsd.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 disk-image --file-system-type=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
|
||
|
||
Muchas placas ARM necesitan una variante específica del cargador de arranque
|
||
@uref{http://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 disk-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 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 package -i emacs-guix
|
||
@end example
|
||
|
||
@menu
|
||
* Características:: Cómo Guix dará brillo a su vida.
|
||
* Invocación de guix package:: Instalación de paquetes, borrado, etc.
|
||
* Sustituciones:: Descargar binarios pre-construidos.
|
||
* Paquetes con múltiples salidas:: Un único paquete de fuentes,
|
||
múltiples salidas.
|
||
* Invocación de guix gc:: Ejecutar el recolector de basura.
|
||
* Invocación de guix pull:: Obtener la última versión de Guix y la
|
||
distribución.
|
||
* Canales:: Personalizar el recolector de basura.
|
||
* 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 ficheros del almacén.
|
||
@end menu
|
||
|
||
@node Características
|
||
@section Características
|
||
|
||
Cuando se usa Guix, cada paquete se encuentra en el @dfn{almacén de
|
||
paquetes}, en su propio directorio---algo que se asemeja a
|
||
@file{/gnu/store/xxx-paquete-1.2}, donde @code{xxx} es una cadena en base32.
|
||
|
||
En vez de referirse a estos directorios, las usuarias tienen su propio
|
||
@dfn{perfil}, el cual apunta a los paquetes que realmente desean usar. Estos
|
||
perfiles se almacenan en el directorio de cada usuaria, en
|
||
@code{$HOME/.guix-profile}.
|
||
|
||
Por ejemplo, @code{alicia} instala GCC 4.7.2. Como resultado,
|
||
@file{/home/alicia/.guix-profile/bin/gcc} apunta a
|
||
@file{/gnu/store/@dots{}-gcc-4.7.2/bin/gcc}. Ahora, en la misma máquina,
|
||
@code{rober} ha instalado ya GCC 4.8.0. El perfil de @code{rober}
|
||
simplemente sigue apuntando a
|
||
@file{/gnu/store/@dots{}-gcc-4.8.0/bin/gcc}---es decir, ambas versiones de
|
||
GCC pueden coexistir en el mismo sistema sin ninguna interferencia.
|
||
|
||
La orden @command{guix package} es la herramienta central para gestión de
|
||
paquetes (@pxref{Invocación de guix package}). Opera en los perfiles de usuaria,
|
||
y puede ser usada @emph{con privilegios de usuaria normal}.
|
||
|
||
@cindex transacciones
|
||
La orden proporciona las operaciones obvias de instalación, borrado y
|
||
actualización. Cada invocación es en realidad una @emph{transacción}: o bien
|
||
la operación especificada se realiza satisfactoriamente, o bien nada
|
||
sucede. Por tanto, si el proceso @command{guix package} es finalizado
|
||
durante una transacción, o un fallo eléctrico ocurre durante la transacción,
|
||
el perfil de usuaria permanece en su estado previo, y permanece usable.
|
||
|
||
Además, cualquier transacción de paquetes puede ser @emph{vuelta atrás}. Si,
|
||
por ejemplo, una actualización instala una nueva versión de un paquete que
|
||
resulta tener un error importante, las usuarias pueden volver a la instancia
|
||
previa de su perfil, de la cual se tiene constancia que funcionaba bien. De
|
||
igual modo, la configuración global del sistema en Guix está sujeta a
|
||
actualizaciones transaccionales y vuelta atrás (@pxref{Uso de la configuración del sistema}).
|
||
|
||
Todos los paquetes en el almacén de paquetes pueden ser @emph{eliminados por
|
||
el recolector de basura}. Guix puede determinar qué paquetes están siendo
|
||
todavía referenciados por los perfiles de usuarias, y eliminar aquellos que,
|
||
de forma demostrable, no están referenciados (@pxref{Invocación de guix gc}). Las
|
||
usuarias pueden también borrar explícitamente generaciones antiguas de su
|
||
perfil para que los paquetes referenciados en ellas puedan ser recolectadas.
|
||
|
||
@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á ficheros 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}).
|
||
|
||
El control sobre el entorno de construcción es una característica que
|
||
también es útil para desarrolladoras. La orden @command{guix environment}
|
||
permite a desarrolladoras de un paquete configurar rápidamente el entorno de
|
||
desarrollo correcto para su paquete, sin tener que instalar manualmente las
|
||
dependencias del paquete en su perfil (@pxref{Invocación de guix environment}).
|
||
|
||
@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
|
||
La orden @command{guix package} es la herramienta que permite a las usuarias
|
||
instalar, actualizar y borrar paquetes, así como volver a configuraciones
|
||
previas. Opera únicamente en el perfil propio de la usuaria, y funciona con
|
||
privilegios de usuaria normal (@pxref{Características}). Su sintaxis es:
|
||
|
||
@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
|
||
|
||
@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 @code{PATH}, y
|
||
demás.
|
||
@cindex rutas de búsqueda
|
||
Si no está usando la Distribución de Sistema Guix, considere añadir las
|
||
siguientes líneas a su @file{~/.bash_profile} (@pxref{Bash Startup Files,,,
|
||
bash, The GNU Bash Reference Manual}) de modo que los shell lanzados a
|
||
partir de entonces obtengan todas las definiciones de variables de entorno
|
||
correctas:
|
||
|
||
@example
|
||
GUIX_PROFILE="$HOME/.guix-profile" ; \
|
||
source "$HOME/.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 ficheros}, 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
|
||
@code{--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.
|
||
|
||
Cada @var{paquete} puede especificar un nombre simple de paquete, como por
|
||
ejemplo @code{guile}, o un nombre de paquete seguido por una arroba y el
|
||
número de versión, como por ejemplo @code{guile@@1.8.8} o simplemente
|
||
@code{guile@@1.8} (en el último caso la última versión con @code{1.8} como
|
||
prefijo es seleccionada).
|
||
|
||
Si no se especifica un número de versión, la última versión disponible será
|
||
seleccionada. Además, @var{paquete} puede contener dos puntos, seguido por
|
||
el nombre de una de las salidas del paquete, como en @code{gcc:doc} o
|
||
@code{binutils@@2.22:lib} (@pxref{Paquetes con múltiples salidas}). Los
|
||
paquetes con el nombre correspondiente (y opcionalmente la versión) se
|
||
buscan entre los módulos de la distribución GNU (@pxref{Módulos de paquetes}).
|
||
|
||
@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 ficheros 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 @code{--seach-paths}). Cualquier definición de variable de entorno que
|
||
falte o sea posiblemente incorrecta se informa aquí.
|
||
|
||
@item --install-from-expression=@var{exp}
|
||
@itemx -e @var{exp}
|
||
Instala el paquete al que @var{exp} evalúa.
|
||
|
||
@var{exp} debe ser una expresión Scheme que evalue a un objeto
|
||
@code{<package>}. Esta opción es notablemente útil para desambiguar entre
|
||
variantes con el mismo nombre que un paquete, con expresiones como @code{(@@
|
||
(gnu packages base) guile-final)}.
|
||
|
||
Fíjese que esta opción instala la primera salida del paquete especificado,
|
||
lo cual puede ser insuficiente cuando se necesita una salida específica de
|
||
un paquete con múltiples salidas.
|
||
|
||
@item --install-from-file=@var{fichero}
|
||
@itemx -f @var{fichero}
|
||
Instala el paquete que resulta de evaluar el código en @var{fichero}.
|
||
|
||
Como un ejemplo, @var{fichero} puede contener una definición como esta
|
||
(@pxref{Definición de paquetes}):
|
||
|
||
@example
|
||
@verbatiminclude package-hello.scm
|
||
@end example
|
||
|
||
Las desarrolladoras pueden encontrarlo útil para incluir un fichero
|
||
@file{guix.scm} in la raíz del árbol de fuentes de su proyecto que puede ser
|
||
usado para probar imágenes de desarrollo y crear entornos de desarrollo
|
||
reproducibles (@pxref{Invocación de guix environment}).
|
||
|
||
@item --remove=@var{paquete} @dots{}
|
||
@itemx -r @var{paquete} @dots{}
|
||
Borra los @var{paquete}s especificados.
|
||
|
||
Como en @code{--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
|
||
@code{--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}).
|
||
|
||
@item --do-not-upgrade[=@var{regexp} @dots{}]
|
||
Cuando se usa junto a la opción @code{--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{fichero}
|
||
@itemx -m @var{fichero}
|
||
@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{fichero}.
|
||
|
||
Esto le permite @emph{declarar} los contenidos del perfil en vez de
|
||
construirlo a través de una secuencia de @code{--install} y órdenes
|
||
similares. La ventaja es que @var{fichero} puede ponerse bajo control de
|
||
versiones, copiarse a máquinas diferentes para reproducir el mismo perfil, y
|
||
demás.
|
||
|
||
@c FIXME: Add reference to (guix profile) documentation when available.
|
||
@var{fichero} debe devolver un objeto @dfn{manifest}, que es básicamente una
|
||
lista de paquetes:
|
||
|
||
@findex packages->manifest
|
||
@example
|
||
(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 example
|
||
|
||
@findex specifications->manifest
|
||
En este ejemplo tenemos que conocer qué módulos definen las variables
|
||
@code{emacs} y @code{guile-2.0} para proporcionar la línea
|
||
@code{use-package-modules} correcta, lo cual puede ser complicado. En cambio
|
||
podemos proporcionar especificaciones regulares de paquetes y dejar a
|
||
@code{specifications->manifest} buscar los objetos de paquete
|
||
correspondientes así:
|
||
|
||
@example
|
||
(specifications->manifest
|
||
'("emacs" "guile@@2.2" "guile@@2.2:debug"))
|
||
@end example
|
||
|
||
@item --roll-back
|
||
@cindex vuelta atrás
|
||
@cindex deshacer transacciones
|
||
@cindex transacciones, deshaciendo
|
||
Vuelve a la @dfn{generación} previa del perfil---es decir, deshace la última
|
||
transacción.
|
||
|
||
Cuando se combina con opciones como @code{--install}, la vuelta 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 fichero 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 @code{--roll-back}, use
|
||
@code{--switch-generation=+1}.
|
||
|
||
La diferencia entre @code{--roll-back} y @code{--switch-generation=-1} es
|
||
que @code{--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 ficheros usadas por
|
||
algunos de los paquetes.
|
||
|
||
Por ejemplo, GCC necesita que las variables de entorno @code{CPATH} y
|
||
@code{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 @code{--search-paths} sugerirá
|
||
fijar dichas variables a @code{@var{perfil}/include} y
|
||
@code{@var{perfil}/lib} respectivamente.
|
||
|
||
El caso de uso típico es para definir estas variables de entorno en el
|
||
shell:
|
||
|
||
@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 @code{GUILE_LOAD_PATH}, aunque,
|
||
tomada individualmente, ni @file{foo} ni @file{bar} hubieran llevado a esa
|
||
recomendación.
|
||
|
||
|
||
@item --profile=@var{perfil}
|
||
@itemx -p @var{perfil}
|
||
Usa @var{perfil} en vez del perfil predeterminado de la usuaria.
|
||
|
||
@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}
|
||
@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
|
||
|
||
Es también posible refinar los resultados de búsqueda usando varias opciones
|
||
@code{-s}. Por ejemplo, la siguiente orden devuelve un lista de juegos de
|
||
mesa (board en inglés):
|
||
|
||
@example
|
||
$ guix package -s '\<board\>' -s 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 package -s crypto -s 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=python | recsel -p name,version
|
||
name: python
|
||
version: 2.7.6
|
||
|
||
name: python
|
||
version: 3.3.5
|
||
@end example
|
||
|
||
Tambien puede especificar el nombre completo de un paquete para únicamente
|
||
obtener detalles sobre una versión específica:
|
||
@example
|
||
$ guix package --show=python@@3.4 | recsel -p name,version
|
||
name: python
|
||
version: 3.4.3
|
||
@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 instalados 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. Patrones válidos incluyen:
|
||
|
||
@itemize
|
||
@item @emph{Enteros y enteros separados por comas}. Ambos patrones denotan
|
||
números de generación. Por ejemplo, @code{--list-generations=1} devuelve la
|
||
primera.
|
||
|
||
Y @code{--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}. @code{--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,
|
||
@code{--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, @code{--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, @code{--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.
|
||
|
||
Fíjese que borrar generaciones previene volver atrás a
|
||
ellas. Consecuentemente esta orden debe ser usada con cuidado.
|
||
|
||
@end table
|
||
|
||
Finalmente, ya que @command{guix package} puede lanzar procesos de
|
||
construcción en realidad, acepta todas las opciones comunes de construcción
|
||
(@pxref{Opciones comunes de construcción}). También acepta opciones de transformación de
|
||
paquetes, como @option{--with-source} (@pxref{Opciones de transformación de paquetes}). No obstante, fíjese que las transformaciones del paquete se
|
||
pierden al actualizar; para preservar las transformaciones entre
|
||
actualizaciones, debe definir su propia variante del paquete en un módulo
|
||
Guile y añadirlo a @code{GUIX_PACKAGE_PATH} (@pxref{Definició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
|
||
* Servidor oficial de sustituciones.:: Una fuente particular de
|
||
sustituciones.
|
||
* Autorización de servidores de sustituciones:: Cómo habilitar o
|
||
deshabilitar
|
||
sustituciones.
|
||
* Verificación de sustituciones:: Cómo verifica las sustituciones Guix.
|
||
* Configuración de la pasarela.:: Cómo obtener sustituciones a través de
|
||
una pasarela.
|
||
* Fallos en las sustituciones:: Qué pasa cuando una sustitución falla.
|
||
* Sobre la confianza en binarios:: ¿Cómo puede usted confiar en esa masa
|
||
informe de datos binarios?
|
||
@end menu
|
||
|
||
@node Servidor oficial de sustituciones.
|
||
@subsection Servidor oficial de sustituciones.
|
||
|
||
@cindex hydra
|
||
@cindex granja de construcción
|
||
El servidor @code{@value{SUBSTITUTE-SERVER}} es una fachada a una granja de
|
||
construcción oficial que construye paquetes de Guix continuamente para
|
||
algunas arquitecturas, y los pone disponibles como sustituciones. Esta es la
|
||
fuente predeterminada de sustituciones; puede ser forzada a cambiar pasando
|
||
la opción @option{--substitute-urls} bien a @command{guix-daemon}
|
||
(@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}}) o
|
||
bien a herramientas cliente como @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.
|
||
|
||
Las sustituciones de la granja de construcción oficial están habilitadas por
|
||
defecto cuando se usa la Distribución de sistema Guix (@pxref{Distribución GNU}). No obstante, están deshabilitadas por defecto cuando se usa
|
||
Guix en una distribución anfitriona, a menos que las haya habilitado
|
||
explícitamente via uno de los pasos recomendados de instalación
|
||
(@pxref{Instalación}). Los siguientes párrafos describen como habilitar o
|
||
deshabilitar sustituciones para la granja oficial de construcción; el mismo
|
||
procedimiento puede usarse para habilitar sustituciones de 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
|
||
Para permitir a Guix descargar sustituciones de
|
||
@code{@value{SUBSTITUTE-SERVER}} o un espejo suyo, debe añadir su clave
|
||
pública a la lista de control de acceso (ACL) de las importaciones de
|
||
archivos, mediante el uso de la orden @command{guix archive}
|
||
(@pxref{Invocación de guix archive}). Hacerlo implica que confía que
|
||
@code{@value{SUBSTITUTE-SERVER}} no ha sido comprometido y proporciona
|
||
sustituciones genuinas.
|
||
|
||
La clave pública para @code{@value{SUBSTITUTE-SERVER}} se instala junto a
|
||
Guix, en @code{@var{prefijo}/share/guix/@value{SUBSTITUTE-SERVER}.pub},
|
||
donde @var{prefijo} es el prefij de instalación de Guix. Si ha instalado
|
||
Guix desde las fuentes, debe asegurarse de que comprobó la firma GPG de
|
||
@file{guix-@value{VERSION}.tar.gz}, el cual contiene el fichero de clave
|
||
pública. Una vez hecho, puede ejecutar algo así:
|
||
|
||
@example
|
||
# guix archive --authorize < @var{prefijo}/share/guix/@value{SUBSTITUTE-SERVER}.pub
|
||
@end example
|
||
|
||
@quotation Nota
|
||
De manera similar, el fichero @file{hydra.gnu.org.pub} contiene la clave
|
||
pública para una granja de construcción independiente que también es parte
|
||
del proyecto, la cual se puede encontrar en
|
||
@indicateurl{https://mirror.hydra.gnu.org}.
|
||
@end quotation
|
||
|
||
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
|
||
The following derivations would be built:
|
||
/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
|
||
112.3 MB would be downloaded:
|
||
/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
|
||
Esto indica que las sustituciones de @code{@value{SUBSTITUTE-SERVER}} son
|
||
usables y serán descargadas, cuando sea posible, para construcciones
|
||
futuras.
|
||
|
||
@cindex sustituciones, cómo deshabilitarlas
|
||
El mecanismo de sustituciones puede ser deshabilitado globalmente ejecutando
|
||
@code{guix-daemon} con @code{--no-subsitutes} (@pxref{Invocación de guix-daemon}). También puede ser deshabilitado temporalmente pasando la
|
||
opción @code{--no-substitutes} a @command{guix package}, @command{guix
|
||
build} y otras herramientas de línea de órdenes.
|
||
|
||
@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 @code{b.example.org}, y si
|
||
@code{a.example.org} resulta que proporciona @emph{exactamente las mismas}
|
||
sustituciones, Guix descargará sustituciones de @code{a.example.org} porque
|
||
viene primero en la lista y puede ser considerado un espejo de
|
||
@code{b.example.org}. En la práctica, máquinas de construcción
|
||
independientes producen habitualmente los mismos binarios, gracias a las
|
||
construcciones reproducibles bit-a-bit (véase a continuación).
|
||
|
||
Cuando se usa HTTPS, el certificado X.509 del servidor @emph{no} se valida
|
||
(en otras palabras, el servidor no está verificado), lo contrario del
|
||
comportamiento habitual de los navegadores Web. Esto es debido a que Guix
|
||
verifica la información misma de las sustituciones, como se ha explicado
|
||
anteriormente, lo cual nos concierne (mientras que los certificados X.509
|
||
tratan de verificar las conexiones entre nombres de dominio y claves
|
||
públicas).
|
||
|
||
@node Configuración de la pasarela.
|
||
@subsection Configuración de la pasarela.
|
||
|
||
@vindex http_proxy
|
||
Las sustituciones se descargan por HTTP o HTTPS. La variable de entorno
|
||
@code{http_proxy} puede ser incluida en el entorno de @command{guix-daemon}
|
||
y la respeta para las descargas de sustituciones. Fíjese que el valor de
|
||
@code{http_proxy} en el entorno en que @command{guix build}, @command{guix
|
||
package} y otras aplicaciones cliente se ejecuten @emph{no tiene ningún
|
||
efecto}.
|
||
|
||
@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 @code{--fallback} (@pxref{fallback-option,, common build option
|
||
@code{--fallback}}). Específicamente, si no se pasó @code{--fallback}, no se
|
||
realizarán construcciones locales, y la derivación se considera se considera
|
||
fallida. No obstante, si se pasó @code{--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 deshabilitadas 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
|
||
@code{--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
|
||
Hoy en día, el control individual sobre nuestra propia computación está a
|
||
merced de instituciones, empresas y grupos con suficiente poder y
|
||
determinación para subvertir la infraestructura de computación y explotar
|
||
sus vulnerabilidades. Mientras que usar las sustituciones de
|
||
@code{@value{SUBSTITUTE-SERVER}} puede ser conveniente, recomendamos a las
|
||
usuarias también construir sus paquetes, o incluso mantener su propia granja
|
||
de construcción, de modo que @code{@value{SUBSTITUTE-SERVER}} sea un
|
||
objetivo menos interesante. Una manera de ayudar es publicando el software
|
||
que construya usando @command{guix publish} de modo que otras tengan otro
|
||
servidor más como opción para descargar sustituciones (@pxref{Invocación de guix publish}).
|
||
|
||
Guix tiene los cimientos para maximizar la reproducibilidad de las
|
||
construcciones (@pxref{Características}). En la mayor parte de los casos,
|
||
construcciones independientes de un paquete o derivación dada deben emitir
|
||
resultados idénticos bit a bit. Por tanto, a través de un conjunto diverso
|
||
de construcciones independientes de paquetes, podemos reforzar la integridad
|
||
de nuestros sistemas. La orden @command{guix challenge} intenta ayudar a las
|
||
usuarias en comprobar servidores de sustituciones, y asiste a las
|
||
desarrolladoras encontrando construcciones no deterministas de paquetes
|
||
(@pxref{Invocación de guix challenge}). Similarmente, la opción @option{--check}
|
||
de @command{guix build} permite a las usuarias si las sustituciones
|
||
previamente instaladas son genuinas reconstruyendolas localmente
|
||
(@pxref{build-check, @command{guix build --check}}).
|
||
|
||
En el futuro, queremos que Guix permita la publicación y obtención de
|
||
binarios hacia/desde otras usuarias, entre pares (P2P). En caso de
|
||
interesarle hablar sobre este proyecto, unase a nosotras en
|
||
@email{guix-devel@@gnu.org}.
|
||
|
||
@node Paquetes con múltiples salidas
|
||
@section Paquetes con múltiples salidas
|
||
|
||
@cindex paquetes de salida múltiple
|
||
@cindex salidas del paquete
|
||
@cindex salidas
|
||
|
||
Habitualmente, los paquetes definidos en Guix tienen una @dfn{salida}
|
||
única---es decir, el paquete de fuentes proporcionará exactamente un
|
||
directorio en el almacén. Cuando se ejecuta @command{guix package -i 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 ficheros de cabecera C, bibliotecas dinámicas,
|
||
bibliotecas estáticas, documentación Info y otros ficheros auxiliares.
|
||
|
||
A veces es más apropiado separar varios tipos de ficheros 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 package -i glib
|
||
@end example
|
||
|
||
@cindex documentación
|
||
La orden que instala su documentación es:
|
||
|
||
@example
|
||
guix package -i glib:doc
|
||
@end example
|
||
|
||
Algunos paquetes instalan programas con diferentes ``huellas de
|
||
dependencias''. Por ejemplo, el paquete WordNet instala tanto herramientas
|
||
de línea de órdenes como interfaces gráficas de usuaria (IGU). Las primeras
|
||
dependen únicamente de la biblioteca de C, mientras que las últimas dependen
|
||
en Tcl/Tk y las bibliotecas de X subyacentes. En este caso, dejamos las
|
||
herramientas de línea de órdenes en la salida predeterminada, mientras que
|
||
las IGU están en una salida separada. Esto permite a las usuarias que no
|
||
necesitan una IGU ahorrar espacio. La orden @command{guix size} puede ayudar
|
||
a exponer estas situaciones (@pxref{Invocación de guix size}). @command{guix
|
||
graph} también puede ser útil (@pxref{Invocación de guix graph}).
|
||
|
||
Hay varios de estos paquetes con salida múltiple en la distribución
|
||
GNU. Otros nombres de salida convencionales incluyen @code{lib} para
|
||
bibliotecas y posiblemente ficheros de cabecera, @code{bin} para programas
|
||
independientes y @code{debug} para información de depuración
|
||
(@pxref{Instalación de ficheros de depuración}). La salida de los paquetes se enumera
|
||
en la tercera columna del resultado de @command{guix package
|
||
--list-available} (@pxref{Invocación de guix package}).
|
||
|
||
|
||
@node Invocación de guix gc
|
||
@section Invocación de @command{guix gc}
|
||
|
||
@cindex recolector de basura
|
||
@cindex espacio en disco
|
||
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 ficheros 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 fichero en @file{/gnu/store} alcanzable desde una raíz se
|
||
considera @dfn{vivo} y no puede ser borrado; cualquier otro fichero 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 referenciadas
|
||
por dichas generaciones puede ser reclamada. 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 ficheros muertos (predeterminado), para borrar ficheros
|
||
específicos (la opción @code{--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, ficheros 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}]
|
||
Antes de comenzar el proceso de recolección de basura, borra todas las
|
||
generaciones anteriores a @var{duración}, para todos los perfiles de la
|
||
usuaria; cuando se ejecuta como root esto aplica a los perfiles de
|
||
@emph{todas las usuarias}.
|
||
|
||
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 ficheros del almacén y directorios especificados
|
||
como parámetros. Esto falla si alguno de los ficheros 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 raices del recolector de basura poseidas por la usuaria; cuando
|
||
se ejecuta como root, enumera @emph{todas} las raices del recolector de
|
||
basura.
|
||
|
||
@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 ficheros y directorios muertos todavía presentes en el
|
||
almacén---es decir, ficheros y directorios que ya no se pueden alcanzar
|
||
desde ninguna raíz.
|
||
|
||
@item --list-live
|
||
Muestra la lista de ficheros y directorios del almacén vivos.
|
||
|
||
@end table
|
||
|
||
Además, las referencias entre los ficheros 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 ficheros
|
||
del almacén pasados como parámetros.
|
||
|
||
@item --requisites
|
||
@itemx -R
|
||
@cindex clausura
|
||
Enumera los requistos los ficheros del almacén pasados como parámetros. Los
|
||
requisitos incluyen los mismos ficheros del almacén, sus referencias, las
|
||
referencias de estas, recursivamente. En otras palabras, la lista devuelta
|
||
es la @dfn{clausura transitiva} de los ficheros 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 derivación
|
||
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 fichero/s @file{.drv} que conducen al paquete @code{emacs}
|
||
instalado en su perfil.
|
||
|
||
Fíjese que puede haber cero ficheros @file{.drv} encontrados, por ejemplo
|
||
porque estos ficheros han sido recolectados. Puede haber más de un fichero
|
||
@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 ficheros 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 ficheros 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 iniciase con
|
||
@code{--disable-deduplication} (@pxref{Invocación de guix-daemon,
|
||
@code{--disable-deduplication}}). Por tanto, esta opción es útil
|
||
primariamente cuando el daemon se estaba ejecutando con
|
||
@code{--disable-deduplication}.
|
||
|
||
@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
|
||
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, Git}, por defecto el repositorio
|
||
oficial de GNU@tie{}Guix, lo que no obstante puede ser personalizado.
|
||
|
||
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 ejecutó @command{guix
|
||
pull}. Por ejemplo, cuando la usuaria @code{root} ejecuta @command{guix
|
||
pull}, esto no tiene ningún efecto en la versión del Guix que la usuaria
|
||
@code{alicia} ve, y viceversa.
|
||
|
||
El resultado de ejecutar @command{guix pull} es un @dfn{perfil} disponible
|
||
bajo @file{~/.config/guix/current} conteniendo el último Guix. Por tanto,
|
||
asegurese de añadirlo al inicio de sus rutas de búsqueda de modo que use la
|
||
última versión, de modo similar para el manual Info(@pxref{Documentación}).
|
||
|
||
@example
|
||
export PATH="$HOME/.config/guix/current/bin:$PATH"
|
||
export INFOPATH="$HOME/.config/guix/current/share/info:$INFOPATH"
|
||
@end example
|
||
|
||
Las opciones @code{--list-generations} o @code{-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.savannah.gnu.org/git/guix.git
|
||
branch: origin/master
|
||
commit: 65956ad3526ba09e1f7a40722c96c6ef7c0936fe
|
||
|
||
Generation 2 Jun 11 2018 11:02:49
|
||
guix e0cc7f6
|
||
repository URL: https://git.savannah.gnu.org/git/guix.git
|
||
branch: origin/master
|
||
commit: e0cc7f669bec22c37481dd03a7941c7d11a64f1d
|
||
2 new packages: keepalived, libnfnetlink
|
||
6 packages upgraded: emacs-nix-mode@@2.0.4,
|
||
guile2.0-guix@@0.14.0-12.77a1aac, guix@@0.14.0-12.77a1aac,
|
||
heimdal@@7.5.0, milkytracker@@1.02.00, nix@@2.0.4
|
||
|
||
Generation 3 Jun 13 2018 23:31:07 (current)
|
||
guix 844cc1c
|
||
repository URL: https://git.savannah.gnu.org/git/guix.git
|
||
branch: origin/master
|
||
commit: 844cc1c8f394f03b404c5bb3aee086922373490c
|
||
28 new packages: emacs-helm-ls-git, emacs-helm-mu, @dots{}
|
||
69 packages upgraded: borg@@1.1.6, cheese@@3.28.0, @dots{}
|
||
@end example
|
||
|
||
@ref{Invocación de guix describe, @command{guix describe}}, para otras formas de
|
||
describir el estado actual de Guix.
|
||
|
||
El perfil @code{~/.config/guix/current} funciona como cualquier otro perfil
|
||
creado por @command{guix package} (@pxref{Invocación de guix package}). Esto es,
|
||
puede enumerar generaciones, volver a una generación previa---es decir, el
|
||
Guix anterior---y más:
|
||
|
||
@example
|
||
$ guix package -p ~/.config/guix/current --roll-back
|
||
switched from generation 3 to 2
|
||
$ guix package -p ~/.config/guix/current --delete-generations=1
|
||
deleting /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 @var{branch}.
|
||
|
||
@cindex @file{channels.scm}, fichero de configuración
|
||
@cindex fichero de configuración de canales
|
||
Estas opciones se proporcionan por conveniencia, pero también puede
|
||
especificar su configuración en el fichero
|
||
@file{~/.config/guix/channels.scm} o usando la opción @option{--channels}
|
||
(vea más adelante).
|
||
|
||
@item --channels=@var{fichero}
|
||
@itemx -C @var{fichero}
|
||
Lee la lista de canales de @var{fichero} en vez de
|
||
@file{~/.config/guix/channels.scm}. @var{fichero} debe contener código
|
||
Scheme que evalue a una lista de objetos channel. @xref{Canales}, para más
|
||
información.
|
||
|
||
@item --news
|
||
@itemx -N
|
||
Display the list of packages added or upgraded since the previous
|
||
generation.
|
||
|
||
This is the same information as displayed upon @command{guix pull}
|
||
completion, but without ellipses; it is also similar to the output of
|
||
@command{guix pull -l} for the last generation (see below).
|
||
|
||
@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}).
|
||
|
||
@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 --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 --verbose
|
||
Produce salida prolija, escribiendo los logs de construcción por la salida
|
||
de error estándar.
|
||
|
||
@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 Canales
|
||
@section Canales
|
||
|
||
@cindex channels
|
||
@cindex @file{channels.scm}, fichero de configuración
|
||
@cindex fichero de configuración de canales
|
||
@cindex @command{guix pull}, fichero de configuración
|
||
@cindex configuración de @command{guix pull}
|
||
Guix y su colección de paquetes son actualizados ejecutando @command{guix
|
||
pull} (@pxref{Invocación de guix pull}). Por defecto @command{guix pull} descarga
|
||
y despliega el mismo Guix del repositorio oficial de GNU@tie{}Guix. Esto
|
||
puede ser personalizado definiendo @dfn{canales} en el fichero
|
||
@file{~/.config/guix/channels.scm}. Un canal especifica una URL y una rama
|
||
de un repositorio Git para ser desplegado, y @command{guix pull} puede ser
|
||
instruido para tomar los datos de uno o más canales. En otras palabras, los
|
||
canales se pueden usar para @emph{personalizar} y para @emph{extender} Guix,
|
||
como vemos a continuación.
|
||
|
||
@subsection Uso de un canal de Guix personalizado
|
||
|
||
El canal llamado @code{guix} especifica de donde el mismo Guix---sus
|
||
herramientas de línea de órdenes y su colección de paquetes---debe ser
|
||
descargado. Por ejemplo, suponga que quiere actualizar de su propia 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/mi-guix.git")
|
||
(branch "super-hacks")))
|
||
@end lisp
|
||
|
||
@noindent
|
||
De aquí en adelante, @command{guix pull} obtendrá el código de la rama
|
||
@code{super-hacks} del repositorio en @code{example.org}.
|
||
|
||
@subsection Especificación de canales adicionales
|
||
|
||
@cindex extender la colección de paquetes (canales)
|
||
@cindex paquetes personales (canales)
|
||
@cindex canales, para paquetes personales
|
||
También puede especificar @emph{canales adicionales} de los que obtener
|
||
datos. Digamos que tiene un montón de variaciones personalizadas de paquetes
|
||
que piensa que no tiene mucho sentido contribuir al proyecto Guix, pero
|
||
quiere tener esos paquetes disponibles transparentemente en su línea de
|
||
órdenes. Primero escribiría módulos que contengan esas definiciones de
|
||
paquete (@pxref{Módulos de paquetes}), los mantendría en un repositorio Git, y
|
||
entonces usted y cualquier otra persona podría usarlos como un canal
|
||
adicional del que obtener paquetes. Limpio, ¿no?
|
||
|
||
@c What follows stems from discussions at
|
||
@c <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22629#134> as well as
|
||
@c earlier discussions on guix-devel@gnu.org.
|
||
@quotation Aviso
|
||
Antes de que, querida usuaria, grite---``¡Guau, esto es @emph{la
|
||
caña}!''---y publique su canal personal al mundo, nos gustaría compartir
|
||
algunas palabras de precaución:
|
||
|
||
@itemize
|
||
@item
|
||
Antes de publicar un canal, por favor considere contribuir sus definiciones
|
||
de paquete al propio Guix (@pxref{Contribuir}). Guix como proyecto es
|
||
abierto a software libre de todo tipo, y los paquetes en el propio Guix
|
||
están disponibles para todas las usuarias de Guix y se benefician del
|
||
proceso de gestión de calidad del proyecto.
|
||
|
||
@item
|
||
Cuando mantiene definiciones de paquete fuera de Guix, nosotras, las
|
||
desarrolladoras de Guix, consideramos que @emph{la carga de la
|
||
compatibilidad cae de su lado}. Recuerde que los módulos y definiciones de
|
||
paquetes son solo código Scheme que usa varias interfaces programáticas
|
||
(APIs). Queremos mantener la libertad de cambiar dichas interfaces para
|
||
seguir mejorando Guix, posiblemente en formas que pueden romper su
|
||
canal. Nunca cambiamos las interfaces gratuitamente, pero @emph{no} vamos
|
||
tampoco a congelar las interfaces.
|
||
|
||
@item
|
||
Corolario: si está usando un canal externo y el canal se rompe, por favor
|
||
@emph{informe del problema a las autoras del canal}, no al proyecto Guix.
|
||
@end itemize
|
||
|
||
¡Ha quedado advertida! Habiendo dicho esto, creemos que los canales externos
|
||
son una forma práctica de ejercitar su libertad para aumentar la colección
|
||
de paquetes de Guix y compartir su mejoras, que son pilares básicos del
|
||
@uref{https://www.gnu.org/philosophy/free-sw.html, software libre}. Por
|
||
favor, envíenos un correo a @email{guix-devel@@gnu.org} si quiere hablar
|
||
sobre esto.
|
||
@end quotation
|
||
|
||
Para usar un canal, escriba en @code{~/.config/guix/channels.scm} para
|
||
instruir a @command{guix pull} para obtener datos de él @emph{además} de los
|
||
canales Guix predeterminados:
|
||
|
||
@vindex %default-channels
|
||
@lisp
|
||
;; Añade mis paquetes personales a aquellos que Guix provee.
|
||
(cons (channel
|
||
(name 'mis-paquetes-personales)
|
||
(url "https://example.org/paquetes-personales.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 fichero 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 pull --list-generations
|
||
@dots{}
|
||
Generation 19 Aug 27 2018 16:20:48
|
||
guix d894ab8
|
||
repository URL: https://git.savannah.gnu.org/git/guix.git
|
||
branch: master
|
||
commit: d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300
|
||
mis-paquetes-personales dd3df5e
|
||
repository URL: https://example.org/paquetes-personales.git
|
||
branch: master
|
||
commit: dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb
|
||
11 new packages: mi-gimp, mi-emacs-con-cosas, @dots{}
|
||
4 packages upgraded: emacs-racket-mode@@0.0.2-2.1b78827, @dots{}
|
||
@end example
|
||
|
||
@noindent
|
||
La salida de @command{guix pull} previa muestra que la generación@tie{}19
|
||
incluye tanto Guix como paquetes del canal
|
||
@code{mis-paquetes-personales}. Entre los paquetes nuevos y actualizados que
|
||
son enumerados, algunos como @code{mi-gimp} y @code{mi-emacs-con-cosas}
|
||
pueden venir de @code{mis-paquetes-personales}, mientras que otros vienen
|
||
del canal predeterminado de Guix.
|
||
|
||
Para crear uncanal, cree un repositorio Git que contenga sus propios módulos
|
||
de paquetes y haga que esté disponible. El repositorio puede contener
|
||
cualquier cosa, pero un canal útil contendrá módulos Guile que exportan
|
||
paquetes. Una vez comience a usar un canal, Guix se comportará como si el
|
||
directorio raíz del repositorio Git de dicho canal hubiese sido añadido a la
|
||
ruta de carga de Guile (@pxref{Load Paths,,, guile, GNU Guile Reference
|
||
Manual}). Por ejemplo, si su canal contiene un fichero en
|
||
@file{mis-paquetes/mis-herramientas.scm} que define un módulo, entonces
|
||
dicho módulo estará disponible bajo el nombre @code{(mis-paquetes
|
||
mis-herramientas)}, y podrá usarlo como cualquier otro módulo
|
||
(@pxref{Módulos,,, guile, GNU Guile Reference Manual}).
|
||
|
||
@cindex dependencias, canales
|
||
@cindex metadatos, canales
|
||
@subsection Declaración de dependencias de 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 fichero de metadatos @file{.guix-channel}, que debe
|
||
encontrarse en la raíz del repositorio del canal.
|
||
|
||
Este fichero de metadatos debe contener una expresión-S simple como esta:
|
||
|
||
@lisp
|
||
(channel
|
||
(version 0)
|
||
(dependencies
|
||
(channel
|
||
(name una-coleccion)
|
||
(url "https://example.org/primera-coleccion.git"))
|
||
(channel
|
||
(name otra-coleccion)
|
||
(url "https://example.org/segunda-coleccion.git")
|
||
(branch "pruebas"))))
|
||
@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.
|
||
|
||
@subsection Replicación de Guix
|
||
|
||
@cindex clavar, canales
|
||
@cindex replicar Guix
|
||
@cindex reproducibilidad, de Guix
|
||
La salida de @command{guix pull --list-generations} previa muestra
|
||
precisamente qué revisiones se usaron para construir esta instancia de
|
||
Guix. Por tanto podemos replicarla, digamos, en otra máquina, proporcionando
|
||
una especificaciones de canales en @file{~/.config/guix/channels.scm} que
|
||
está ``clavada'' en estas revisiones:
|
||
|
||
@lisp
|
||
;; Despliega unas revisiones específicas de mis canales de interés.
|
||
(list (channel
|
||
(name 'guix)
|
||
(url "https://git.savannah.gnu.org/git/guix.git")
|
||
(commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300"))
|
||
(channel
|
||
(name 'mis-paquetes-personales)
|
||
(url "https://example.org/paquetes-personales.git")
|
||
(branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb")))
|
||
@end lisp
|
||
|
||
La orden @command{guix describe --format=channels} puede incluso generar
|
||
esta lista de canales directamente (@pxref{Invocación de guix describe}).
|
||
|
||
En este punto las dos máquinas ejecutan @emph{exactamente el mismo Guix},
|
||
con acceso a @emph{exactamente los mismos paquetes}. La salida de
|
||
@command{guix build gimp} en una máquina debe ser exactamente la misma, bit
|
||
a bit, que la salida de la misma orden en la otra máquina. Esto también
|
||
significa que ambas máquinas tienen acceso a todo el código fuente de Guix
|
||
y, transitiamente, a todo el código fuente de cada paquete que define.
|
||
|
||
Esto le proporciona superpoderes, permitiendole 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 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{Invocación de guix package});
|
||
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
|
||
;; Esta es la revisión antigua de donde queremos
|
||
;; extraer guile-json.
|
||
(list (channel
|
||
(name 'guix)
|
||
(url "https://git.savannah.gnu.org/git/guix.git")
|
||
(commit
|
||
"65956ad3526ba09e1f7a40722c96c6ef7c0936fe"))))
|
||
|
||
(define inferior
|
||
;; Un inferior que representa la revisión previa.
|
||
(inferior-for-channels channels))
|
||
|
||
;; Ahora crea un manifiesto con el paquete "guile" actual
|
||
;; y el antiguo paquete "guile-json".
|
||
(packages->manifest
|
||
(list (first (lookup-inferior-packages inferior "guile-json"))
|
||
(specification->package "guile")))
|
||
@end lisp
|
||
|
||
En su primera ejecución, @command{guix package --manifest} puede tener que
|
||
construir el canal que especificó antes de crear el inferior; las siguientes
|
||
ejecuciones serán mucho más rápidas porque la revisión de Guix estará en la
|
||
caché.
|
||
|
||
El módulo @code{(guix inferior)} proporciona los siguientes procedimientos
|
||
para abrir un inferior:
|
||
|
||
@deffn {Procedimiento Scheme} inferior-for-channels @var{canales} @
|
||
[#:cache-directory] [#:ttl]
|
||
Devuelve un inferior para @var{canales}, una lista de canales. Usa la caché
|
||
en @var{cache-directory}, donde las entradas pueden ser reclamadas después
|
||
de @var{ttl} segundos. Este procedimiento abre una nueva conexión al daemon
|
||
de construcción.
|
||
|
||
Como efecto secundario, este procedimiento puede construir o sustituir
|
||
binarios para @var{canales}, lo cual puede tomar cierto tiempo.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} open-inferior @var{directorio} @
|
||
[#:command "bin/guix"]
|
||
Abre el Guix inferior en @var{directorio}, ejecutando
|
||
@code{@var{directorio}/@var{command} repl} o su equivalente. Devuelve
|
||
@code{#f} si el inferior no pudo ser ejecutado.
|
||
@end deffn
|
||
|
||
@cindex paquetes inferiores
|
||
Los procedimientos enumerados a continuación le permiten obtener y manipular
|
||
paquetes de inferiores.
|
||
|
||
@deffn {Procedimiento Scheme} inferior-packages @var{inferior}
|
||
Devuelve la lista de paquetes conocida por @var{inferior}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} lookup-inferior-packages @var{inferior} @var{nombre} @
|
||
[@var{versión}]
|
||
Devuelve la lista ordenada de paquetes del inferior que corresponden con
|
||
@var{nombre} en @var{inferior}, con los números de versión más altos
|
||
primero. Si @var{versión} tiene un valor verdadero, devuelve únicamente
|
||
paquetes con un número de versión cuyo prefijo es @var{versión}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} inferior-package? @var{obj}
|
||
Devuelve verdadero si @var{obj} es un paquete inferior.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} inferior-package-name @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-version @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-synopsis @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-description @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-home-page @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-location @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-inputs @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-native-inputs @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-propagated-inputs @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-transitive-propagated-inputs @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-native-search-paths @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-transitive-native-search-paths @var{paquete}
|
||
@deffnx {Procedimiento Scheme} inferior-package-search-paths @var{paquete}
|
||
Estos procedimientos son la contraparte de los accesos a los registros de
|
||
pquete (@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
|
||
|
||
Los paquetes de inferiores pueden ser usados transparentemente como
|
||
cualquier otro paquete u objeto-tipo-fichero en expresiones-G
|
||
(@pxref{Expresiones-G}). También se manejan transparentemente por el
|
||
procedimiento @code{packages->manifest}, el cual se usa habitualmente en los
|
||
manifiestos (@pxref{Invocación de guix package, the @option{--manifest} option of
|
||
@command{guix package}}). Por tanto puede insertar un paquete de inferior
|
||
prácticamente en cualquier lugar que pueda insertar un paquete normal: en
|
||
manifiestos, en el campo @code{packages} de su declaración
|
||
@code{operating-system}, etcétera.
|
||
|
||
@node Invocación de guix describe
|
||
@section Invocación de @command{guix describe}
|
||
|
||
@cindex reproducibilidad
|
||
@cindex replicar Guix
|
||
A menudo desea responder a preguntas como: ``¿Qué revisión de Guix estoy
|
||
usando?'' o ``¿Qué canales estoy usando?'' Esto es una información muy útil
|
||
en muchas situaciones: si quiere @emph{replicar} un entorno en una máquina
|
||
diferente o cuenta de usuaria, si desea informar de un error o determinar
|
||
qué cambio en los canales que usa lo causó, o si quiere almacenar el estado
|
||
de su sistema por razones de reproducibilidad. La orden @command{guix
|
||
describe} responde a estas preguntas.
|
||
|
||
Cuando se ejecuta desde un @command{guix} bajado con @command{guix pull},
|
||
@command{guix describe} muestra el/los canal/es desde el/los que se
|
||
construyó, incluyendo la URL de su repositorio y los IDs de las revisiones
|
||
(@pxref{Canales}):
|
||
|
||
@example
|
||
$ guix describe
|
||
Generation 10 Sep 03 2018 17:32:44 (current)
|
||
guix e0fa68c
|
||
repository URL: https://git.savannah.gnu.org/git/guix.git
|
||
branch: master
|
||
commit: e0fa68c7718fffd33d81af415279d6ddb518f727
|
||
@end example
|
||
|
||
Si está familiarizado con el sistema de control de versiones Git, esto es
|
||
similar a @command{git describe}; la salida también es similar a la de
|
||
@command{guix pull --list-generations}, pero limitada a la generación actual
|
||
(@pxref{Invocación de guix pull, the @option{--list-generations} option}). Debido
|
||
a que el ID de revisión Git mostrado antes refiere sin ambigüedades al
|
||
estado de Guix, esta información es todo lo necesario para describir la
|
||
revisión de Guix que usa, y también para replicarla.
|
||
|
||
Para facilitar la replicación de Guix, también se le puede solicitar a
|
||
@command{guix describe} devolver una lista de canales en vez de la
|
||
descripción legible por humanos mostrada antes:
|
||
|
||
@example
|
||
$ guix describe -f channels
|
||
(list (channel
|
||
(name 'guix)
|
||
(url "https://git.savannah.gnu.org/git/guix.git")
|
||
(commit
|
||
"e0fa68c7718fffd33d81af415279d6ddb518f727")))
|
||
@end example
|
||
|
||
@noindent
|
||
Puede almacenar esto en un fichero y pasarselo a @command{guix pull -C} en
|
||
otra máquina o en un momento futuro, lo cual 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 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 --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 archive
|
||
La orden @command{guix archive} permite a las usuarias @dfn{exportar}
|
||
ficheros del almacén en un único archivador, e @dfn{importarlos}
|
||
posteriormente en una máquina que ejecute Guix. En particular, permite que
|
||
los ficheros 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 ficheros 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 ficheros 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
|
||
@code{-r}), independiente de lo que estuviese ya disponible en el almacén de
|
||
la máquina objetivo. La opción @code{--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)
|
||
Los archivos se almacenan en el formato de ``archivo normalizado'' o
|
||
``nar'', el cual 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 fichero, el formato nar solo
|
||
menciona el tipo de fichero (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 ficheros de acuerdo a la ordenación de cadenas en la
|
||
localización C. Esto hace la producción del archivo completamente
|
||
determinista.
|
||
|
||
@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 ficheros 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
|
||
@code{--recursive}.
|
||
|
||
@item -r
|
||
@itemx --recursive
|
||
Cuando se combina con @code{--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 ficheros 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 @code{--authorize} más adelante).
|
||
|
||
@item --missing
|
||
Lee una lista de nombres de ficheros del almacén de la entrada estándar, uno
|
||
por línea, y escribe en la salida estándar el subconjunto de estos ficheros
|
||
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 @code{--export}. Tenga en
|
||
cuenta que esta operación normalmente toma tiempo, ya que se necesita
|
||
obtener suficiente entropía para generar un par de claves.
|
||
|
||
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 fichero
|
||
@file{signing-key.pub}.
|
||
|
||
La lista de claves autorizadas se mantiene en el fichero editable por
|
||
personas @file{/etc/guix/acl}. El fichero contiene
|
||
@url{http://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{http://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.
|
||
|
||
Por ejemplo, la siguiente orden extrae la sustitución de Emacs ofrecida por
|
||
@code{@value{SUBSTITUTE-SERVER}} en @file{/tmp/emacs}:
|
||
|
||
@example
|
||
$ wget -O - \
|
||
https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-emacs-24.5 \
|
||
| bunzip2 | 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.
|
||
|
||
@end table
|
||
|
||
|
||
@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.
|
||
|
||
La orden @command{guix environment} proporciona una manera conveniente de
|
||
configurar un @dfn{entorno de desarrollo} que contenga todas las
|
||
dependencias y herramientas necesarias para trabajar en el paquete de
|
||
software de su elección. La orden @command{guix pack} le permite crear
|
||
@dfn{aplicaciones empaquetadas} que pueden ser distribuidas con facilidad a
|
||
usuarias que no usen Guix.
|
||
|
||
@menu
|
||
* Invocación de guix environment:: Configurar entornos de desarrollo.
|
||
* Invocación de guix pack:: Creación de empaquetados de software.
|
||
@end menu
|
||
|
||
@node Invocación de guix environment
|
||
@section Invocación de @command{guix environment}
|
||
|
||
@cindex entornos de construcción reproducibles
|
||
@cindex entornos de desarrollo
|
||
@cindex @command{guix environment}
|
||
@cindex entorno, entorno de construcción de paquetes
|
||
El propósito de @command{guix environment} es ayudar a las hackers en la
|
||
creación de entornos de desarrollo reproducibles sin modificar los paquetes
|
||
de su perfil. La herramienta @command{guix environment} toma uno o más
|
||
paquetes, construye todas sus entradas y crea un entorno shell para usarlos.
|
||
|
||
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 @code{--pure}@footnote{Las usuarias habitualmente aumentan de forma
|
||
incorrecta las variables de entorno como @code{PATH} en su fichero
|
||
@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 ficheros de inicio de Bash.}.
|
||
|
||
@vindex GUIX_ENVIRONMENT
|
||
@command{guix environment} define la variable @code{GUIX_ENVIRONMENT} en el
|
||
shell que lanza; su valor es el nombre de fichero 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
|
||
puede invorcarse usando el valor @code{--} para separar la orden del resto
|
||
de los parámetros:
|
||
|
||
@example
|
||
guix environment guile -- make -j4
|
||
@end example
|
||
|
||
En otras situaciones, es más conveniente especificar una lista de paquetes
|
||
necesarios en el entorno. Por ejemplo, la siguiente orden ejecuta
|
||
@command{python} desde un entorno que contiene Python@tie{}2.7 y NumPy:
|
||
|
||
@example
|
||
guix environment --ad-hoc python2-numpy python-2.7 -- python
|
||
@end example
|
||
|
||
Más allá, 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 @code{--ad-hoc} es posicional. Los paquetes que aparecen
|
||
antes de @code{--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 guix --ad-hoc git strace
|
||
@end example
|
||
|
||
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 @code{--container} requiere Linux-libre 3.19 o más nuevo.
|
||
@end quotation
|
||
|
||
Las opciones disponibles se resumen a continuación.
|
||
|
||
@table @code
|
||
@item --root=@var{fichero}
|
||
@itemx -r @var{fichero}
|
||
@cindex entorno persistente
|
||
@cindex raíz del recolector de basura, para entornos
|
||
Hace que @var{fichero} 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 raices 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{fichero}
|
||
@itemx -l @var{fichero}
|
||
Crea un entorno para el paquete o la lista de paquetes a la que el código en
|
||
@var{fichero} evalúa.
|
||
|
||
Como un ejemplo, @var{fichero} puede contener una definición como esta
|
||
(@pxref{Definición de paquetes}):
|
||
|
||
@example
|
||
@verbatiminclude environment-gdb.scm
|
||
@end example
|
||
|
||
@item --manifest=@var{fichero}
|
||
@itemx -m @var{fichero}
|
||
Crea un entorno para los paquetes contenidos en el objeto manifest devuelto
|
||
por el código Scheme en @var{file}.
|
||
|
||
Esto es similar a la opción del mismo nombre en @command{guix package}
|
||
(@pxref{profile-manifest, @option{--manifest}}) y usa los mismos ficheros de
|
||
manifiesto.
|
||
|
||
@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
|
||
@code{--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 --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 @code{PATH}, variables de entorno cuyo
|
||
nombre empiece con @code{SLURM}, así como las variables ``preciosas''
|
||
habituales (@code{HOME}, @code{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 @code{--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. Es equivalente a la ejecución de @command{ln -s
|
||
$GUIX_ENVIRONMENT ~/.guix-profile} 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 @code{~/.guix-profile}
|
||
ficheros de configuración y datos;@footnote{Por ejemplo, el paquete
|
||
@code{fontconfig} inspecciona @file{~/.guix-profile/share/fonts} en busca de
|
||
nuevas tipografías.} @code{--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 @code{--share}
|
||
y @code{--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 --expose=@var{fuente}[=@var{destino}]
|
||
Para contenedores, expone el sistema de ficheros @var{fuente} del sistema
|
||
anfitrión como un sistema de ficheros de solo-lectura @var{destino} dentro
|
||
del contenedor. 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 --share=@var{fuente}[=@var{destino}]
|
||
Para contenedores, comparte el sistema de ficheros @var{fuente} del sistema
|
||
anfitrión como el sistema de ficheros @var{destino} con permisos de
|
||
escritura dentro del contenedor. Si no se especifica @var{destino},
|
||
@var{fuente} se usa como punto de montaje en el contenedor.
|
||
|
||
El siguiente ejemplo lanza un entorno interactivo Guile en un contenedor en
|
||
el que el directorio principal de la usuaria está disponible para tanto
|
||
lectura como escritura via el directorio @file{/intercambio}:
|
||
|
||
@example
|
||
guix environment --container --share=$HOME=/intercambio --ad-hoc guile -- guile
|
||
@end example
|
||
@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}
|
||
|
||
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 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 geiser
|
||
@end example
|
||
|
||
@noindent
|
||
De este modo, las usuarias pueden escribir alegremente
|
||
@file{/opt/gnu/bin/guile} y disfrutar.
|
||
|
||
@cindex binarios relocalizables, 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
|
||
ficheros? En ese caso, lo que usted desea es usar la opción
|
||
@code{--relocatable} (véase a continuación). Esta opción produce
|
||
@dfn{binarios relocalizables}, significando que pueden ser colocados en
|
||
cualquier lugar de la jerarquía del sistema de ficheros: 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 guile emacs geiser
|
||
@end example
|
||
|
||
@noindent
|
||
El resultado es un archivador tar que puede ser pasado a la orden
|
||
@command{docker load}. Véase la
|
||
@uref{https://docs.docker.com/engine/reference/commandline/load/,
|
||
documentación de Docker} para más información.
|
||
|
||
@cindex Singularity, construir una imagen con guix pack
|
||
@cindex SquashFS, construir una imagen con guix pack
|
||
Otra opción más es producir una imagen SquashFS con la siguiente orden:
|
||
|
||
@example
|
||
guix pack -f squashfs guile emacs geiser
|
||
@end example
|
||
|
||
@noindent
|
||
El resultado es una imagen de sistema de ficheros SquashFS que puede ser o
|
||
bien montada, o bien usada directamente como una imagen contenedora de
|
||
sistemas de ficheros con el @uref{http://singularity.lbl.gov, entorno de
|
||
ejecución de contenedores Singularity}, usando órdenes como
|
||
@command{singularity shell} o @command{singularity exec}.
|
||
|
||
Varias opciones de la línea de órdenes le permiten personalizar su
|
||
empaquetado:
|
||
|
||
@table @code
|
||
@item --format=@var{formato}
|
||
@itemx -f @var{formato}
|
||
Produce un empaquetado en el @var{formato} específico.
|
||
|
||
Los formatos disponibles son:
|
||
|
||
@table @code
|
||
@item tarball
|
||
Es el formato predeterminado. Produce un archivador que contiene todos los
|
||
binarios y enlaces simbólicos especificados.
|
||
|
||
@item docker
|
||
Produce un archivador que sigue la
|
||
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
|
||
especificación de imágenes Docker}.
|
||
|
||
@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
|
||
ficheros virtuales como procfs.
|
||
@end table
|
||
|
||
@cindex binarios reposicionables
|
||
@item --relocatable
|
||
@itemx -R
|
||
Produce @dfn{binarios reposicionables}---es decir, binarios que se pueden
|
||
posicionar en cualquier lugar de la jerarquía del sistema de ficheros, y
|
||
ejecutarse desde allí.
|
||
|
||
When this option is passed once, the resulting binaries require support for
|
||
@dfn{user namespaces} in the kernel Linux; when passed
|
||
@emph{twice}@footnote{Here's a trick to memorize it: @code{-RR}, which adds
|
||
PRoot support, can be thought of as the abbreviation of ``Really
|
||
Relocatable''. Neat, isn't it?}, relocatable binaries fall to back to PRoot
|
||
if user namespaces are unavailable, and essentially work anywhere---see
|
||
below for the implications.
|
||
|
||
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
|
||
deshabilitan.
|
||
|
||
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 PRoot si no es posible.
|
||
|
||
El programa @uref{https://proot-me.github.io/, PRoot} proporciona el soporte
|
||
necesario para la virtualización del sistema de ficheros. 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.
|
||
@end quotation
|
||
|
||
@item --expression=@var{expr}
|
||
@itemx -e @var{expr}
|
||
Considera el paquete al que evalúa @var{expr}
|
||
|
||
Esto tiene el mismo propósito que la opción del mismo nombre en
|
||
@command{guix build} (@pxref{Opciones de construcción adicionales, @code{--expression}
|
||
in @command{guix build}}).
|
||
|
||
@item --manifest=@var{fichero}
|
||
@itemx -m @var{fichero}
|
||
Usa los paquetes contenidos en el objeto manifest devuelto por el código
|
||
Scheme en @var{file}.
|
||
|
||
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 ficheros 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 fichero de manifiesto @emph{o bien} una lista de paquetes,
|
||
pero no ambas.
|
||
|
||
@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{"mips64el-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{bzip2}, @code{xz}, @code{lzip} o @code{none}
|
||
para no usar compresión.
|
||
|
||
@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
|
||
Save provenance information for the packages passed on the command line.
|
||
Provenance information includes the URL and commit of the channels in use
|
||
(@pxref{Canales}).
|
||
|
||
Provenance information is saved in the
|
||
@file{/gnu/store/@dots{}-profile/manifest} file in the pack, along with the
|
||
usual package metadata---the name and version of each package, their
|
||
propagated inputs, and so on. It is useful information to the recipient of
|
||
the pack, who then knows how the pack was (supposedly) obtained.
|
||
|
||
This option is not enabled by default because, like timestamps, provenance
|
||
information contributes nothing to the build process. In other words, there
|
||
is an infinity of channel URLs and commit IDs that can lead to the same
|
||
pack. Recording such ``silent'' metadata in the output thus potentially
|
||
breaks the source-to-binary bitwise reproducibility property.
|
||
|
||
@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 --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}).
|
||
|
||
|
||
@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 derivación
|
||
Las APIs de nivel más bajo están disponibles para interactuar con el daemon
|
||
y el almacén. Para instruir al daemon para realizar una acción de
|
||
construcción, las usuarias realmente proporcionan una @dfn{derivación}. Una
|
||
derivación es una representación de bajo nivel de las acciones de
|
||
construcción a tomar, y el entorno en el que deberían suceder---las
|
||
derivaciones son a las definiciones de paquetes lo que es el ensamblador a
|
||
los programas en C. El término ``derivación'' viene del hecho de que los
|
||
resultados de la construcción @emph{derivan} de ellas.
|
||
|
||
Este capítulo describe todas estas APIs en orden, empezando por las
|
||
definiciones de alto nivel de paquetes.
|
||
|
||
@menu
|
||
* Módulos de paquetes:: Paquetes bajo el punto de vista del
|
||
programador.
|
||
* Definición de paquetes:: Definir nuevos paquetes.
|
||
* Sistemas de construcción:: Especificar como se construyen los paquetes.
|
||
* 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:: Enredar con Guix interactivamente.
|
||
@end menu
|
||
|
||
@node Módulos de paquetes
|
||
@section Módulos de paquetes
|
||
|
||
Desde un punto de vista programático, las definiciones de paquetes de la
|
||
distribución GNU se proporcionan por módulos Guile en el espacio de nombres
|
||
@code{(gnu packages @dots{})}@footnote{Fíjese que los paquetes bajo el
|
||
espacio de nombres de módulo @code{(gnu packages @dots{})} no son
|
||
necesariamente ``paquetes GNU''. Este esquema de nombrado de módulos sigue
|
||
la convención habitual de Guile para el nombrado de módulos: @code{gnu}
|
||
significa que estos módulos se distribuyen como parte del sistema GNU, y
|
||
@code{packages} identifica módulos que definen paquetes.} (@pxref{Módulos,
|
||
Guile modules,, guile, GNU Guile Reference Manual}). Por ejemplo, el módulo
|
||
@code{(gnu packages emacs)} exporta una variable con nombre @code{emacs},
|
||
que está asociada a un objeto @code{<package>} (@pxref{Definición de paquetes}).
|
||
|
||
El espacio de nombres de módulos @code{(gnu packages @dots{})} se recorre
|
||
automáticamente en busca de paquetes en las herramientas de línea de
|
||
ordenes. Por ejemplo, cuando se ejecuta @code{guix package -i 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 fichero y el nombre de módulo deben
|
||
coincidir. Por ejemplo, el módulo @code{(mis-paquetes emacs)} debe
|
||
almacenarse en el fichero @file{mis-paquetes/emacs.scm} en relación con la
|
||
ruta de carga especificada con @option{--load-path} o
|
||
@code{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
|
||
@code{GUIX_PACKAGE_PATH} descrita más adelante.
|
||
|
||
@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
|
||
|
||
@code{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:
|
||
|
||
@example
|
||
(define-module (gnu packages hello)
|
||
#:use-module (guix packages)
|
||
#:use-module (guix download)
|
||
#:use-module (guix build-system gnu)
|
||
#:use-module (guix licenses)
|
||
#:use-module (gnu packages gawk))
|
||
|
||
(define-public hello
|
||
(package
|
||
(name "hello")
|
||
(version "2.10")
|
||
(source (origin
|
||
(method url-fetch)
|
||
(uri (string-append "mirror://gnu/hello/hello-" version
|
||
".tar.gz"))
|
||
(sha256
|
||
(base32
|
||
"0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
|
||
(build-system gnu-build-system)
|
||
(arguments '(#:configure-flags '("--enable-silent-rules")))
|
||
(inputs `(("gawk" ,gawk)))
|
||
(synopsis "Hello, GNU world: An example GNU package")
|
||
(description "Guess what GNU Hello prints!")
|
||
(home-page "http://www.gnu.org/software/hello/")
|
||
(license gpl3+)))
|
||
@end example
|
||
|
||
@noindent
|
||
Sin ser una experta en Scheme---pero conociendo un poco de inglés---, la
|
||
lectora puede haber supuesto el significado de varios campos aquí. Esta
|
||
expresión asocia la variable @code{hello} al objeto @code{<package>}, que
|
||
esencialmente es un registro (@pxref{SRFI-9, Scheme records,, guile, GNU
|
||
Guile Reference Manual}). Este objeto de paquete puede ser inspeccionado
|
||
usando los procedimientos encontrados en el módulo @code{(guix packages)};
|
||
por ejemplo, @code{(package-name hello)}
|
||
devuelve---¡sorpresa!---@code{"hello"}.
|
||
|
||
Con suerte, puede que sea capaz de importar parte o toda la definición del
|
||
paquete de su interés de otro repositorio, usando la orden @code{guix
|
||
import} (@pxref{Invocación de guix import}).
|
||
|
||
En el ejemplo previo, @var{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 fichero 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 fichero
|
||
descargado. Es obligatorio, y permite a Guix comprobar la integridad del
|
||
fichero. 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í, @var{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}.
|
||
|
||
@item
|
||
El campo @code{arguments} especifica las opciones para el sistema de
|
||
construcción (@pxref{Sistemas de construcción}). Aquí son interpretadas por
|
||
@var{gnu-build-system} como una petición de ejecutar @file{configure} con la
|
||
opción @code{--enable-silent-rules}.
|
||
|
||
@cindex quote
|
||
@cindex creación de literales
|
||
@findex '
|
||
@findex quote
|
||
¿Qué son estas comillas simples (@code{'})? Son sintaxis Scheme para
|
||
introducir una lista literal; @code{'} es sinónimo de
|
||
@code{quote}. @xref{Expression Syntax, quoting,, guile, GNU Guile Reference
|
||
Manual}, para más detalles. Aquí el valor del campo @code{arguments} es una
|
||
lista de parámetros pasada al sistema de construcción, como con @code{apply}
|
||
(@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile Reference Manual}).
|
||
|
||
La secuencia almohadilla-dos puntos (@code{#:}) define una @dfn{palabra
|
||
clave} Scheme (@pxref{Keywords,,, guile, GNU Guile Reference Manual}), y
|
||
@code{#:configure-flags} es una palabra clave usada para pasar un parámetro
|
||
nominal al sistema de construcción (@pxref{Coding With Keywords,,, guile,
|
||
GNU Guile Reference Manual}).
|
||
|
||
@item
|
||
El campo @code{inputs} especifica las entradas al proceso de
|
||
construcción---es decir, dependencias de tiempo de construcción o ejecución
|
||
del paquete. Aquí, definimos una entrada llamada @code{"gawk"}, cuyo valor
|
||
es el de la variable @var{gawk}; @var{gawk} en sí apunta a un objeto
|
||
@code{<package>}.
|
||
|
||
@cindex acento grave (quasiquote)
|
||
@findex `
|
||
@findex quasiquote
|
||
@cindex coma (unquote)
|
||
@findex ,
|
||
@findex unquote
|
||
@findex ,@@
|
||
@findex unquote-splicing
|
||
De nuevo, @code{`} (un acento grave, sinónimo de @code{quasiquote}) nos
|
||
permite introducir una lista literal en el campo @code{inputs}, mientras que
|
||
@code{,} (una coma, sinónimo de @code{unquote}) nos permite insertar un
|
||
valor en dicha lista (@pxref{Expression Syntax, unquote,, guile, GNU Guile
|
||
Reference Manual}).
|
||
|
||
Fíjese que no hace falta que GCC, Coreutils, Bash y otras herramientas
|
||
esenciales se especifiquen como entradas aquí. En vez de eso,
|
||
@var{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.
|
||
|
||
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{Guías 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>} es
|
||
calculada mediante el procedimiento @code{package-derivation}. Esta
|
||
derivación es almacenada en un fichero @code{.drv} bajo
|
||
@file{/gnu/store}. Las acciones de construcción que prescribe pueden
|
||
entonces llevarse a cabo usando el procedimiento @code{build-derivations}
|
||
(@pxref{El almacén}).
|
||
|
||
@deffn {Procedimiento Scheme} package-derivation @var{almacén} @var{paquete} [@var{sistema}]
|
||
Devuelve el objeto @code{<derivation>} del @var{paquete} pra el
|
||
@var{sistema} (@pxref{Derivaciones}).
|
||
|
||
@var{paquete} debe ser un objeto @code{<package>} válido, y @var{sistema}
|
||
debe ser una cadena que denote el tipo de sistema objetivo---por ejemplo,
|
||
@code{"x86_64-linux"} para un sistema GNU x86_64 basado en
|
||
Linux. @var{almacén} debe ser una conexión al daemon, que opera en el
|
||
almacén (@pxref{El almacén}).
|
||
@end deffn
|
||
|
||
@noindent
|
||
@cindex compilación cruzada
|
||
De manera similar, es posible calcular una derivación que construye de forma
|
||
cruzada un paquete para otro sistema:
|
||
|
||
@deffn {Procedimiento Scheme} package-cross-derivation @var{almacén} @
|
||
@var{paquete} @var{plataforma} [@var{sistema}]
|
||
Devuelve el objeto @code{<derivation>} de @var{paquete} compilado de forma
|
||
cruzada desde @var{sistema} a @var{plataforma}.
|
||
|
||
@var{plataforma} debe ser una tripleta GNU válida que denote el hardware y
|
||
sistema operativo objetivo, como @code{"mips64el-linux-gnu"}
|
||
(@pxref{Configuration Names, GNU configuration triplets,, configure, GNU
|
||
Configure and Build System}).
|
||
@end deffn
|
||
|
||
@cindex transformación de paquetes
|
||
@cindex reescritura de la entrada
|
||
@cindex reescritura del árbol de dependencias
|
||
Los paquetes se pueden manipular de forma arbitraria. Un ejemplo de
|
||
transformación útil es la @dfn{reescritura de entradas}, donde el árbol de
|
||
dependencias de un paquete se reescribe reemplazando entradas específicas
|
||
por otras:
|
||
|
||
@deffn {Procedimiento Scheme} package-input-rewriting @var{reemplazos} @
|
||
[@var{nombre-reescrito}]
|
||
Devuelve un procedimiento que, cuando se le pasa un paquete, reemplaza sus
|
||
dependencias directas e indirectas (pero no sus entradas implícitas) de
|
||
acuerdo a @var{reemplazos}. @var{reemplazos} es una lista de pares de
|
||
paquetes; el primer elemento de cada par es el paquete a reemplazar, el
|
||
segundo es el reemplazo.
|
||
|
||
Opcionalmente, @var{nombre-reescrito} es un procedimiento de un parámetro
|
||
que toma el nombre del paquete y devuelve su nuevo nombre tras la
|
||
reescritura.
|
||
@end deffn
|
||
|
||
@noindent
|
||
Considere este ejemplo:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@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}}).
|
||
|
||
The following variant of @code{package-input-rewriting} can match packages
|
||
to be replaced by name rather than by identity.
|
||
|
||
@deffn {Procedimiento Scheme} package-input-rewriting/spec @var{reemplazos}
|
||
Return a procedure that, given a package, applies the given
|
||
@var{replacements} to all the package graph (excluding implicit inputs).
|
||
@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.
|
||
@end deffn
|
||
|
||
The example above could be rewritten this way:
|
||
|
||
@example
|
||
(define libressl-en-vez-de-openssl
|
||
;; Reemplaza todos los paquetes llamados "openssl" con LibreSSL.
|
||
(package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
|
||
@end example
|
||
|
||
The key difference here is that, this time, packages are matched by spec and
|
||
not by identity. In other words, any package in the graph that is called
|
||
@code{openssl} will be replaced.
|
||
|
||
Un procedimiento más genérico para reescribir el grafo de dependencias de un
|
||
paquete es @code{package-mapping}: acepta cambios arbitrarios sobre nodos
|
||
del grafo.
|
||
|
||
@deffn {Scheme Procedure} package-mapping @var{proc} [@var{cortar?}]
|
||
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.
|
||
@end deffn
|
||
|
||
@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}
|
||
La versión del paquete, como una cadena.
|
||
|
||
@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 fichero obtenido de Internet (@pxref{Referencia de ``origin''}). También puede
|
||
ser cualquier otro objeto ``tipo-fichero'' como @code{local-file}, que
|
||
denota un fichero del sistema local de ficheros (@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. Es una
|
||
lista que normalmente contiene una secuencia de pares de palabra clave y
|
||
valor.
|
||
|
||
@item @code{inputs} (predeterminadas: @code{'()})
|
||
@itemx @code{native-inputs} (predeterminadas: @code{'()})
|
||
@itemx @code{propagated-inputs} (predeterminadas: @code{'()})
|
||
@cindex entradas, de paquetes
|
||
Estos campos enumeran las dependencias del paquete. Cada uno es una lista de
|
||
tuplas, donde cada tupla tiene una etiqueta para la entrada (una cadena)
|
||
como su primer elemento, un paquete, origen o derivación como su segundo
|
||
elemento, y opcionalmente el nombre de la salida que debe ser usada, cuyo
|
||
valor predeterminado es @code{"out"} (@pxref{Paquetes con múltiples salidas}, para más información sobre salidas de paquetes). Por ejemplo, la
|
||
lista siguiente especifica tres entradas:
|
||
|
||
@example
|
||
`(("libffi" ,libffi)
|
||
("libunistring" ,libunistring)
|
||
("glib:bin" ,glib "bin")) ;la salida "bin" de Glib
|
||
@end example
|
||
|
||
@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 cruzadamente, 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 junto al paquete al que
|
||
pertenecen (@pxref{package-cmd-propagated-inputs, @command{guix package}},
|
||
para información sobre cómo @command{guix package} maneja las entradas
|
||
propagadas).
|
||
|
||
Por ejemplo esto es necesario cuando una biblioteca C/C++ necesita cabeceras
|
||
de otra biblioteca para compilar, o cuando un fichero pkg-config se refiere
|
||
a otro @i{via} 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 ficheros
|
||
ELF; esto incluye Guile, Python, Perl y más. Para asegurarse que las
|
||
bibliotecas escritas en esos lenguajes puedan encontrar en tiempo de
|
||
ejecución el código de las bibliotecas de las que dependen, las dependencias
|
||
de tiempo de ejecución deben enumerarse en @code{propagated-inputs} en vez
|
||
de en @code{inputs}.
|
||
|
||
@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{'()})
|
||
Una lista de objetos @code{search-path-specification} describiendo las
|
||
variables de entorno de rutas de búsqueda respetadas por el paquete.
|
||
|
||
@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}
|
||
Una descripción más elaborada del paquete.
|
||
|
||
@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{maintainers} (predeterminadas: @code{'()})
|
||
La lista de responsables del paquete, como objetos @code{maintainer}.
|
||
|
||
@item @code{location} (predeterminada: la localización de los fuentes de la forma @code{package})
|
||
La localización de las fuentes del paquete. Es útil forzar su valor cuando
|
||
se hereda de otro paquete, en cuyo caso este campo no se corrige
|
||
automáticamente.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Scheme Syntax} this-package
|
||
When used in the @emph{lexical scope} of a package field definition, this
|
||
identifier resolves to the package being defined.
|
||
|
||
The example below shows how to add a package as a native input of itself
|
||
when cross-compiling:
|
||
|
||
@example
|
||
(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)
|
||
`(("self" ,this-package))
|
||
'())))
|
||
@end example
|
||
|
||
It is an error to refer to @code{this-package} outside a package definition.
|
||
@end deffn
|
||
|
||
@node Referencia de ``origin''
|
||
@subsection Referencia de @code{origin}
|
||
|
||
Esta sección resume todas las opciones disponibles en declaraciones
|
||
@code{origin} (@pxref{Definición de paquetes}).
|
||
|
||
@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 válidos de
|
||
@code{uri} son: una cadena que contiene una URL, o una lista de cadenas.
|
||
|
||
@item @code{method}
|
||
Un procedimiento que maneja el URI.
|
||
|
||
Algunos ejemplos son:
|
||
|
||
@table @asis
|
||
@item @var{url-fetch} de @code{(guix download)}
|
||
descarga un fichero de la URL HTTP, HTTPS o FTP especificada en el campo
|
||
@code{uri};
|
||
|
||
@vindex git-fetch
|
||
@item @var{git-fetch} de @code{(guix git-download)}
|
||
clona el repositorio de control de versiones Git, y prepara la revisión
|
||
especificada en el campo @code{uri} como un objeto @code{git-reference}; una
|
||
referencia @code{git-reference} tiene esta forma:
|
||
|
||
@example
|
||
(git-reference
|
||
(url "git://git.debian.org/git/pkg-shadow/shadow")
|
||
(commit "v4.1.5.1"))
|
||
@end example
|
||
@end table
|
||
|
||
@item @code{sha256}
|
||
Un vector de bytes que contiene el hash SHA-256 de las fuentes. Típicamente
|
||
la forma @code{base32} se usa aquí para generar el vector de bytes de una
|
||
cadena en base-32.
|
||
|
||
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 fichero 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
|
||
fichero de la URL se usará. Para copias de trabajo de sistemas de control de
|
||
versiones, se recomienda proporcionar el nombre de fichero explícitamente ya
|
||
que el predeterminado no es muy descriptivo.
|
||
|
||
@item @code{patches} (predeterminados: @code{'()})
|
||
Una lista de nombres de ficheros, orígenes u objetos tipo-fichero
|
||
(@pxref{Expresiones-G, objetos tipo-fichero}) apuntando a parches que deben
|
||
ser aplicados a las fuentes.
|
||
|
||
La lista de parches debe ser incondicional. En particular, no puede depender
|
||
del varlo 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
|
||
|
||
|
||
@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}).
|
||
|
||
Los sistemas de construcción aceptan una lista opcional de
|
||
@dfn{parámetros}. En las definiciones de paquete, estos son pasados @i{vía}
|
||
el campo @code{arguments} (@pxref{Definición de paquetes}). Normalmente son
|
||
parámetros con palabras clave (@pxref{Optional Arguments, keyword arguments
|
||
in Guile,, guile, GNU Guile Reference Manual}). El valor de estos parámetros
|
||
normalmente se evalúa en la @dfn{capa de construcción}---es decir, por un
|
||
proceso Guile lanzado por el daemon (@pxref{Derivaciones}).
|
||
|
||
El sistema de construcción principal es @var{gnu-build-system}, el cual
|
||
implementa el procedimiento estándar de construcción para GNU y muchos otros
|
||
paquetes. Se proporciona por el módulo @code{(guix build-system gnu)}.
|
||
|
||
@defvr {Variable Scheme} gnu-build-system
|
||
@var{gnu-build-system} representa el sistema de construcción GNU y sus
|
||
variantes (@pxref{Configuration, configuration and makefile conventions,,
|
||
standards, GNU Coding Standards}).
|
||
|
||
@cindex fases de construcción
|
||
En resumen, los paquetes que lo usan se configuran, construyen e instalan
|
||
con la habitual secuencia de órdenes @code{./configure && make && make check
|
||
&& make install}. En la práctica, algunos pasos adicionales son necesarios
|
||
habitualmente. Todos estos pasos se dividen en @dfn{fases} separadas,
|
||
notablemente@footnote{Rogamos que se inspeccionen los módulos @code{(guix
|
||
build gnu-build-system)} para más detalles sobre las fases de construcción}:
|
||
|
||
@table @code
|
||
@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 ficheros de fuentes
|
||
para que hagan referencia a los nombres correctos de ficheros 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
|
||
@code{--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 ficheros ejecutables instalados.
|
||
|
||
@item strip
|
||
Extrae los símbolos de depuración de ficheros ELF (a menos que el valor de
|
||
@code{#:strip-binaries?} sea falso), copiandolos a la salida @code{debug}
|
||
cuando esté disponible (@pxref{Instalación de ficheros de depuración}).
|
||
@end table
|
||
|
||
@vindex %standard-phases
|
||
El módulo del lado de construcción @code{(guix build gnu-build-system)}
|
||
define @var{%standard-phases} como la lista predeterminada de fases de
|
||
construcción. @var{%standard-phases} es una lista de pares
|
||
símbolo/procedimiento, donde el procedimiento implementa la fase real.
|
||
|
||
La lista de fases usadas para un paquete particular se puede cambiar con el
|
||
parámetro @code{#:phases}. Por ejemplo, pasar:
|
||
|
||
@example
|
||
#:phases (modify-phases %standard-phases (delete 'configure))
|
||
@end example
|
||
|
||
significa que todas las fases descritas anteriormente serán usadas, excepto
|
||
la fase @code{configure}.
|
||
|
||
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.
|
||
@end defvr
|
||
|
||
Se han definido otros objetos @code{<build-system>} para implementar otras
|
||
convenciones y herramientas usadas por paquetes de software libre. Heredan
|
||
la mayor parte de @var{gnu-build-system}, y se diferencian principalmente en
|
||
el conjunto de entradas implícitamente añadidas al proceso de construcción,
|
||
y en la lista de fases ejecutadas. Algunos de estos sistemas de construcción
|
||
se enumeran a continuación.
|
||
|
||
@defvr {Variable Scheme} ant-build-system
|
||
@code{(guix build-system ant)} exporta esta variable. Implementa el
|
||
procedimiento de construcción de paquetes Java que pueden construirse con
|
||
@url{http://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 fichero Ant apropiado, el
|
||
parámetro @code{#:jar-name} puede usarse para generar un fichero 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.
|
||
|
||
El parámetro @code{#:main-class} puede usarse con el fichero de construcción
|
||
Ant mínimo para especificar la clase main del archivo jar producido. Esto
|
||
permite ejecutar el archivo jar. El parámetro @code{#:test-include} puede
|
||
usarse para especificar la lista de tests junit a ejecutar. El valor
|
||
predeterminado es @code{(list "**/*Test.java")}. @code{#:test-exclude} puede
|
||
usarse para desactivar algunas pruebas. Su valor predeterminado es
|
||
@code{(list "**/Abstract*.java")} ya que las clases abstractas no se pueden
|
||
ejecutar como pruebas.
|
||
|
||
El parámetro @code{#:build-target} se puede usar para especificar la tarea
|
||
Ant que debe ser ejecutada durante la fase @code{build}. Por defecto se
|
||
ejecuta la tarea ``jar''.
|
||
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} androd-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 ficheros de
|
||
interfaz pública (cabeceras) en el subdirectorio "include" de la salida
|
||
"out" y sus bibliotecas en el subdirectorio "lib" de la salida "out".
|
||
|
||
También se asume que la unión de todas las dependencias de un paquete no
|
||
tiene ficheros en conflicto.
|
||
|
||
En este momento no funciona la compilación cruzada - por lo que las
|
||
bibliotecas y los ficheros de cabecera se asumen que son locales.
|
||
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} asdf-build-system/source
|
||
@defvrx {Variable Scheme} asdf-build-system/sbcl
|
||
@defvrx {Variable Scheme} asdf-build-system/ecl
|
||
|
||
Estas variables, exportadas por @code{(guix build-system asdf)}, implementan
|
||
procedimientos de construcción para paquetes Common Lisp usando
|
||
@url{https://common-lisp.net/project/asdf, ``ASDF'''}. ASDF es una utilidad
|
||
de definición de sistema para programas y bibliotecas Common Lisp.
|
||
|
||
El sistema @code{asdf-build-system/source} instala los paquetes en forma de
|
||
fuentes, y puede ser cargado usando cualquier implementación common lisp,
|
||
vía ASDF. Los otros, como @code{asdf-build-system/sbcl}, instalan sistemas
|
||
binarios en el formato entendido por una implementación particular. Estos
|
||
sistemas de construcción también pueden usarse para producir programas
|
||
ejecutables, o imágenes lisp que contengan un conjunto precargado de
|
||
paquetes.
|
||
|
||
El sistema de construcción usa convenciones de nombres. Para paquetes
|
||
binarios, el paquete debería estar prefijado con la implementación lisp,
|
||
como @code{sbcl-} para @code{asdf-build-system/sbcl}.
|
||
|
||
Adicionalmente, el paquete de fuentes correspondiente debe etiquetarse
|
||
usando la misma convención que los paquetes python (vea @ref{Módulos Python}), usando el prefijo @code{cl-}.
|
||
|
||
Para paquetes binarios, cada sistema debe definirse como un paquete Guix. Si
|
||
el campo @code{origin} de un paquete contiene varios sistemas, las
|
||
variaciones del paquete pueden crearse para construir todos los
|
||
sistemas. Los paquetes de fuentes, los cuales usan
|
||
@code{asdf-build-system/source}, pueden contener varios sistemas.
|
||
|
||
Para crear programa ejecutables e imágenes, se pueden usar los
|
||
procedimientos del lado de construcción @code{build-program} y
|
||
@code{build-image}. Deben llamarse en la fase de construcción después de la
|
||
fase @code{create-symlinks}, de modo que el sistema recién construido pueda
|
||
ser usado dentro de la imagen resultante. @code{build-program} necesita una
|
||
lista de expresiones Common Lisp a través del parámetro
|
||
@code{#:entry-prgogram}.
|
||
|
||
Si el sistema no está definido en su propio fichero @code{.asd} del mismo
|
||
nombre, entonces se debe usar el parámetro @code{#:asd-file} para
|
||
especificar el fichero en el que se define el sistema. Más allá, si el
|
||
paquete define un sistema para sus pruebas en su fichero separado, se
|
||
cargará antes de la ejecución de las pruebas si se especifica el parámetro
|
||
@code{#:test-asd-file}. Si no se especifica, se probarán si existen los
|
||
ficheros @code{<sistema>-tests.asd}, @code{<system>-test.asd},
|
||
@code{tests.asd} y @code{test.asd}.
|
||
|
||
Si por alguna razón el paquete debe ser nombrado de una forma diferente a la
|
||
sugerida por las convenciones de nombres, el parámetro
|
||
@code{#:asd-system-name} puede usarse para especificar el nombre del
|
||
sistema.
|
||
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} cargo-build-system
|
||
@cindex lenguaje de programación Rust
|
||
@cindex Cargo (sistema de construcción de Rust)
|
||
Esta variable se exporta en @code{(guix build-system cargo)}. Permite la
|
||
construcción de paquetes usando Cargo, la herramienta de construcción del
|
||
@uref{https://www.rust-lang.org, lenguaje de programación Rust}.
|
||
|
||
En su fase @code{configure}, este sistema de construcción substituye las
|
||
dependencias especificadas en el fichero @file{Cargo.toml} con entradas a
|
||
los paquetes Guix. La fase @code{install} instala los binarios, y también
|
||
instala el código fuente y el fichero @file{Cargo.toml}.
|
||
@end defvr
|
||
|
||
@cindex Clojure (lenguaje de programación)
|
||
@cindex sistema de construcción simple de Clojure
|
||
@defvr {Variable Scheme} clojure-build-system
|
||
Esta variable se exporta en @code{(guix build-system clojure)}. Implementa
|
||
un procedimiento de construcción simple para paquetes
|
||
@uref{https://clojure.org/, Clojure} usando directamente @code{compile} en
|
||
Clojure. La compilación cruzada no está disponible todavía.
|
||
|
||
Añade @code{clojure}, @code{icedtea} y @code{zip} al conjunto de
|
||
entradas. Se pueden especificar paquetes diferentes con los parámetros
|
||
@code{#:clojure}, @code{#:jdk} y @code{#:zip}, respectivamente.
|
||
|
||
Una lista de directorios de fuentes, directorios de pruebas y nombres de jar
|
||
pueden especificarse con los parámetros @code{#:source-dirs},
|
||
@code{#:test-dirs} y @code{#:jar-names}, respectivamente. El directorio de
|
||
compilación y la clase principal pueden especificarse con los parámetros
|
||
@code{#:compile-dir} y @code{#:main-class}, respectivamente. Otros
|
||
parámetros se documentan más adelante.
|
||
|
||
Este sistema de construcción es una extensión de @var{ant-build-system},
|
||
pero con las siguientes fases cambiadas:
|
||
|
||
@table @code
|
||
|
||
@item build
|
||
Esta fase llama @code{compile} en Clojure para compilar los ficheros de
|
||
fuentes y ejecuta @command{jar} para crear archivadores jar tanto de
|
||
ficheros 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 ficheros 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 ficheros dentro
|
||
(recursivamente) de los directorios de documentación especificados en
|
||
@code{#:doc-dirs} se instalan también.
|
||
@end table
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} cmake-build-system
|
||
Esta variable se exporta en @code{(guix build-system cmake)}. Implementa el
|
||
procedimiento de construcción para paquetes que usen la
|
||
@url{http://www.cmake.org, herramienta de construcción CMake}.
|
||
|
||
Automáticamente añade el paquete @code{cmake} al conjunto de entradas. El
|
||
paquete usado se puede especificar con el parámetro @code{#:cmake}.
|
||
|
||
El parámetro @code{#:configure-flags} se toma como una lista de opciones a
|
||
pasar a @command{cmake}. El parámetro @code{#:build-type} especifica en
|
||
términos abstractos las opciones pasadas al compilador; su valor
|
||
predeterminado es @code{"RelWithDebInfo"} (quiere decir ``modo de entrega
|
||
con información de depuración''), lo que aproximadamente significa que el
|
||
código se compila con @code{-O2 -g}, lo cual es el caso predeterminado en
|
||
paquetes basados en Autoconf.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} dune-build-system
|
||
This variable is exported by @code{(guix build-system dune)}. It supports
|
||
builds of packages using @uref{https://dune.build/, Dune}, a build tool for
|
||
the OCaml programming language. It is implemented as an extension of the
|
||
@code{ocaml-build-system} which is described below. As such, the
|
||
@code{#:ocaml} and @code{#:findlib} parameters can be passed to this build
|
||
system.
|
||
|
||
Automáticamente añade el paquete @code{dune} al conjunto de entradas. El
|
||
paquete usado se puede especificar con el parámetro @code{#:dune}.
|
||
|
||
There is no @code{configure} phase because dune packages typically don't
|
||
need to be configured. The @code{#:build-flags} parameter is taken as a
|
||
list of flags passed to the @code{dune} command during the build.
|
||
|
||
The @code{#:jbuild?} parameter can be passed to use the @code{jbuild}
|
||
command instead of the more recent @code{dune} command while building a
|
||
package. Its default value is @code{#f}.
|
||
|
||
The @code{#:package} parameter can be passed to specify a package name,
|
||
which is useful when a package contains multiple packages and you want to
|
||
build only one of them. This is equivalent to passing the @code{-p}
|
||
argument to @code{dune}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} go-build-system
|
||
Esta variable se exporta en @code{(guix build-system go)}. Implementa el
|
||
procedimiento de construcción para paquetes Go usando los
|
||
@url{https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies,
|
||
mecanismos de construcción de Go} estándares.
|
||
|
||
Se espera que la usuaria proporcione un valor para el parámetro
|
||
@code{#:import-path} y, en algunos caso, @code{#:unpack-path}. La
|
||
@url{https://golang.org/doc/code.html#ImportPaths, ruta de importación}
|
||
corresponde a la ruta del sistema de ficheros esperada por los guiones de
|
||
construcción del paquete y los paquetes referenciados, y proporciona una
|
||
forma de referenciar un paquete Go unívocamente. Está basado típicamente en
|
||
una combinación de la URI remota del paquete de ficheros de fuente y la
|
||
estructura jerárquica del sistema de ficheros. 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 ficheros ejecutables.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} glib-or-gtk-build-system
|
||
Esta variable se exporta en @code{(guix build-system glib-or-gtk)}. Está
|
||
pensada para usarse con paquetes que usan GLib o GTK+.
|
||
|
||
Este sistema de construcción añade las siguientes dos fases 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 establecen apropiadamente las variables de entorno @code{GTK_PATH}.
|
||
|
||
Es posible excluir salidas específicas del paquete del proceso de
|
||
recubrimiento enumerando sus nombres en el parámetro
|
||
@code{#:glib-org-gtk-wrap-excluded-outputs}. Esto es útil cuando se sabe que
|
||
una salida no contiene binarios GLib o GTK+, y cuando empaquetar
|
||
gratuitamente añadiría una dependencia de dicha salida en GLib y GTK+.
|
||
|
||
@item glib-or-gtk-compile-schemas
|
||
La fase @code{glib-or-gtk-compile-schemas} se asegura que todos los
|
||
@uref{https://developer.gnome.org/gio/stable/glib-compile-schemas.html,
|
||
esquemas GSettings} o GLib se compilan. La compilación la realiza el
|
||
programa @command{glib-compile-schemas}. Lo proporciona el paquete
|
||
@code{glib:bin} que se importa automáticamente por el sistema de
|
||
construcción. El paquete @code{glib} que proporciona
|
||
@command{glib-compile-schemas} puede especificarse con el parámetro
|
||
@code{#:glib}.
|
||
@end table
|
||
|
||
Ambas fases se ejecutan tras la fase @code{install}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} guile-build-system
|
||
Este sistema de construcción es para paquetes Guile que consisten
|
||
exclusivamente en código Scheme y son tan simples que no tienen ni siquiera
|
||
un fichero 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 ficheros @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
|
||
@code{--target} de @command{guild compile}.
|
||
|
||
Los paquetes construidos con @code{guile-build-system} deben proporcionar un
|
||
paquete Guile en su campo @code{native-inputs}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} 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 ficheros 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 ficheros 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 fichero que proporcionar al minificador.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} ocaml-build-system
|
||
Esta variable se exporta en @code{(guix build-system ocaml)}. Implementa un
|
||
procedimiento de construcción para paquetes @uref{https://ocaml.org, OCaml},
|
||
que consiste en seleccionar el conjunto correcto de órdenes a ejecutar para
|
||
cada paquete. Los paquetes OCaml pueden esperar la ejecución de muchas
|
||
ordenes diferentes. Este sistema de construcción probará algunas de ellas.
|
||
|
||
Cuando el paquete tiene un fichero @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 fichero se generó con @uref{http://oasis.forge.ocamlcore.org/
|
||
OASIS} y se encargará de establecer el prefijo y la habilitación de las
|
||
pruebas si no están deshabilitadas. 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 fichero @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 fichero @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 ficheros 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, que no es el comportamiento deseado en guix. En
|
||
particular, intentarán instalar ficheros @file{.so} en su directorio de
|
||
módulos, normalmente lo adecuado puesto que es el directorio del compilador
|
||
de OCaml. No obstante, en guix estas bibliotecas no se pueden encontrar allí
|
||
y usamos @code{CAML_LD_LIBRARY_PATH}. Esta variable apunta a
|
||
@file{lib/ocaml/site-lib/stubslibs} y allí es donde las bibliotecas
|
||
@file{.so} deben instalarse.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} python-build-system
|
||
Esta variable se exporta en @code{(guix build-system python)}. Implementa el
|
||
procedimiento más o menos estándar de construcción usado por paquetes
|
||
Python, que consiste en la ejecución de @code{python setup.py build} y
|
||
@code{python setup.py install --prefix=/gnu/store/@dots{}}.
|
||
|
||
Para que instalan programas independientes Python bajo @code{bin/}, se
|
||
encarga de envolver dichos programas de modo que su variable de entorno
|
||
@code{PYTHONPATH} apunte a las bibliotecas Python de las que dependen.
|
||
|
||
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.
|
||
|
||
Por defecto guix llama a @code{setup.py} bajo el control de
|
||
@code{setuptools} de manera similar a @command{pip}. Algunos paquetes no son
|
||
compatibles con setuptools (y pip), por lo que puede deshabilitar esta
|
||
configuración estableciendo el parámetro @code{#:use-setuptools} a
|
||
@code{#f}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} perl-build-system
|
||
Esta variable se exporta en @code{(guix build-system perl)}. Implementa el
|
||
procedimiento de construcción estándar para paquetes Perl, lo que o bien
|
||
consiste en la ejecución de @code{perl Build.PL
|
||
--prefix=/gnu/store/@dots{}}, seguido de @code{Build} y @code{Build
|
||
install}; o en la ejecución de @code{perl Makefile.PL
|
||
PREFIX=/gnu/store/@dots{}}, seguida de @code{make} y @code{make install},
|
||
dependiendo de si @code{Build.PL} o @code{Makefile.PL} están presentes en la
|
||
distribución del paquete. El primero tiene preferencia si existen tanto
|
||
@code{Build.PL} como @code{Makefile.PL} en la distribución del paquete. Esta
|
||
preferencia puede invertirse especificando @code{#t} en el parámetro
|
||
@code{#:make-maker?}.
|
||
|
||
La invocación inicial de @code{perl Makefile.PL} o @code{perl Build.PL} pasa
|
||
a su vez las opciones especificadas por los parámetros
|
||
@code{#:make-maker-flags} o @code{#:module-build-flags}, respectivamente.
|
||
|
||
El paquete Perl usado puede especificarse con @code{#:perl}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} r-build-system
|
||
Esta variable se exporta en @code{(guix build-system r)}. Implementa el
|
||
procedimiento de construcción usados por paquetes
|
||
@uref{http://r-project.org, R}, lo que esencialmente es poco más que la
|
||
ejecución de @code{R CMD INSTALL --library=/gnu/store/@dots{}} en un entorno
|
||
donde @code{R_LIBS_SITE} contiene las rutas de todos los paquetes R de
|
||
entrada. Las pruebas se ejecutan tras la instalación usando la función R
|
||
@code{tools::testInstalledPackage}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} rakudo-build-system
|
||
This variable is exported by @code{(guix build-system rakudo)} It implements
|
||
the build procedure used by @uref{https://rakudo.org/, Rakudo} for
|
||
@uref{https://perl6.org/, Perl6} packages. It installs the package to
|
||
@code{/gnu/store/@dots{}/NAME-VERSION/share/perl6} and installs the
|
||
binaries, library files and the resources, as well as wrap the files under
|
||
the @code{bin/} directory. Tests can be skipped by passing @code{#f} to the
|
||
@code{tests?} parameter.
|
||
|
||
Which rakudo package is used can be specified with @code{rakudo}. Which
|
||
perl6-tap-harness package used for the tests can be specified with
|
||
@code{#:prove6} or removed by passing @code{#f} to the @code{with-prove6?}
|
||
parameter. Which perl6-zef package used for tests and installing can be
|
||
specified with @code{#:zef} or removed by passing @code{#f} to the
|
||
@code{with-zef?} parameter.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} texlive-build-system
|
||
Esta variable se exporta en @code{(guix build-system texlive)}. Se usa para
|
||
construir paquetes TeX en modo de procesamiento de lotes con el motor
|
||
especificado. El sistema de construcción fija la variable @code{TEXINPUTS}
|
||
para encontrar todos los ficheros de fuentes TeX en las entradas.
|
||
|
||
Por defecto ejecuta @code{luatex} en todos los ficheros que terminan en
|
||
@code{ins}. Un motor y formato diferente puede especificarse con el
|
||
parámetro @code{#:tex-format}. Los diferentes objetivos de construcción
|
||
pueden especificarse con el parámetro @code{#:build-targets}, que espera una
|
||
lista de nombres de fichero. El sistema de construcción añade únicamente
|
||
@code{texlive-bin} y @code{texlive-latex-base} (ambos desde @code{(gnu
|
||
packages tex)} a las entradas. Ambos pueden forzarse con los parámetros
|
||
@code{#:texlive-bin} y @code{#:texlive-latex-base} respectivamente.
|
||
|
||
El parámetro @code{#:tex-directory} le dice al sistema de construcción dónde
|
||
instalar los ficheros construidos bajo el árbol texmf.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} ruby-build-system
|
||
Esta variable se exporta en @code{(guix build-system ruby)}. Implementa el
|
||
procedimiento de construcción de RubyGems usado por los paquetes Ruby, que
|
||
implica la ejecución de @code{gem build} seguida de @code{gem install}.
|
||
|
||
El campo @code{source} de un paquete que usa este sistema de construcción
|
||
típicamente se refiere a un archivo gem, ya que este es el formato usado por
|
||
las desarrolladoras Ruby cuando publican su software. El sistema de
|
||
construcción desempaqueta el archivo gem, potencialmente parchea las
|
||
fuentes, ejecuta la batería de pruebas, vuelve a empaquetar el archivo gem y
|
||
lo instala. Adicionalmente, directorios y archivadores tar pueden
|
||
referenciarse para permitir la construcción de archivos gem no publicados
|
||
desde Git o un archivador tar de publicación de fuentes tradicional.
|
||
|
||
Se puede especificar el paquete Ruby usado mediante el parámetro
|
||
@code{#:ruby}. Una lista de opciones adicionales pueden pasarse a la orden
|
||
@command{gem} en el parámetro @code{#:gem-flags}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} waf-build-system
|
||
Esta variable se exporta en @code{(guix build-system waf)}. Implementa un
|
||
procedimiento de construcción alrededor del guión @code{waf}. Las fases
|
||
comunes---@code{configure}, @code{build} y @code{install}---se implementan
|
||
pasando sus nombres como parámetros al guión @code{waf}.
|
||
|
||
El guión @code{waf} es ejecutado por el intérprete Python. El paquete Python
|
||
usado para la ejecución puede ser especificado con el parámetro
|
||
@code{#:python}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} scons-build-system
|
||
Esta variable se exporta en @code{(guix build-system scons)}. Implementa en
|
||
procedimiento de construcción usado por la herramienta de construcción de
|
||
software SCons. Este sistema de construcción ejecuta @code{scons} para
|
||
construir el paquete, @code{scons test} para ejecutar las pruebas y después
|
||
@code{scons install} para instalar el paquete.
|
||
|
||
Las opciones adicionales a pasar a @code{scons} se pueden especificar con el
|
||
parámetro @code{#:scons-flags}. La versión de Python usada para ejecutar
|
||
SCons puede especificarse seleccionando el paquete SCons apropiado con el
|
||
parámetro @code{#:scons}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} haskell-build-system
|
||
Esta variable se exporta en @code{(guix build-system haskell)}. Implementa
|
||
el procedimiento de construcción Cabal usado por paquetes Haskell, el cual
|
||
implica la ejecución de @code{runhaskell Setup.hs configure
|
||
--prefix=/gnu/store/@dots{}} y @code{runhaskell Setup.hs build}. En vez de
|
||
instalar el paquete ejecutando @code{runhaskell Setup.hs install}, para
|
||
evitar el intento de registro de bibliotecas en el directorio de
|
||
solo-lectura del compilador en el almacén, el sistema de construcción usa
|
||
@code{runhaskell Setup.hs copy}, seguido de @code{runhaskell Setup.hs
|
||
register}. Además, el sistema de construcción genera la documentación del
|
||
paquete ejecutando @code{runhaskell Setup.hs haddock}, a menos que se pasase
|
||
@code{#:haddock? #f}. Parámetros opcionales de Haddock pueden proporcionarse
|
||
con la ayuda del parámetro @code{#:haddock-flags}. Si el fichero
|
||
@code{Setup.hs} no es encontrado, el sistema de construcción busca
|
||
@code{Setup.lhs} a su vez.
|
||
|
||
El compilador Haskell usado puede especificarse con el parámetro
|
||
@code{#:haskell} cuyo valor predeterminado es @code{ghc}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} dub-build-system
|
||
Esta variable se exporta en @code{(guix build-system dub)}. Implementa el
|
||
procedimiento de construcción Dub usado por los paquetes D, que implica la
|
||
ejecución de @code{dub build} y @code{dub run}. La instalación se lleva a
|
||
cabo con la copia manual de los ficheros.
|
||
|
||
El compilador D usado puede ser especificado con el parámetro @code{#:ldc}
|
||
cuyo valor predeterminado es @code{ldc}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} emacs-build-system
|
||
Esta variable se exporta en @code{(guix build-system emacs)}. Implementa un
|
||
procedimiento de instalación similar al propio sistema de empaquetado de
|
||
Emacs (@pxref{Packages,,, emacs, The GNU Emacs Manual}).
|
||
|
||
Primero crea el fichero @code{@var{paquete}-autoloads.el}, tras lo que
|
||
compila todos los ficheros Emacs Lisp. De manera diferente al sistema de
|
||
paquetes de Emacs, los ficheros de documentación Info se mueven al
|
||
directorio estándar de documentación y se borra el fichero @file{dir}. Cada
|
||
paquete se instala en su propio directorio bajo
|
||
@file{share/emacs/site-lisp/guix.d}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} font-build-system
|
||
Esta variable se exporta en @code{(guix build-system font)}. Implementa un
|
||
procedimiento de instalación para paquetes de fuentes donde las proveedoras
|
||
originales proporcionan ficheros de tipografía TrueType, OpenType, etc.@:
|
||
precompilados que simplemente necesitan copiarse en su lugar. Copia los
|
||
ficheros de tipografías a las localizaciones estándar en el directorio de
|
||
salida.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} meson-build-system
|
||
Esta variable se exporta en @code{(guix build-system meson)}. Implementa el
|
||
procedimiento de construcción para paquetes que usan
|
||
@url{http://mesonbuild.com, Meson} como su sistema de construcción.
|
||
|
||
Añade Meson y @uref{https://ninja-build.org/, Ninja} al conjunto de
|
||
entradas, y pueden cambiarse con los parámetros @code{#:meson} y
|
||
@code{#:ninja} en caso necesario. La versión de Meson predeterminada es
|
||
@code{meson-for-build}, la cual es especial puesto que no limpia el
|
||
@code{RUNPATH} de los binarios y bibliotecas durante la instalación.
|
||
|
||
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 @code{--build-type} siempre se fija a
|
||
@code{plain} a menos que 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
|
||
Esta fase ejecuta @code{ninja} con el objetivo especificado en
|
||
@code{#:test-target}, cuyo valor predeterminado es @code{"test"}.
|
||
|
||
@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
|
||
Esta fase se asegura de que todos los binarios pueden encontrar las
|
||
bibliotecas que necesitan. Busca las bibliotecas necesarias en
|
||
subdirectorios del paquete en construcción, y añade estas a @code{RUNPATH}
|
||
en caso necesario. También elimina referencias a bibliotecas introducidas en
|
||
la fase de construcción por @code{meson-for-build}, como las dependencias de
|
||
las pruebas, que no se necesitan realmente para la ejecución del programa.
|
||
|
||
@item glib-or-gtk-wrap
|
||
Esta fase es la fase proporcionada por @code{glib-or-gtk-build-system}, y no
|
||
está activa por defecto. Puede activarse con @code{#:glib-or-gtk}.
|
||
|
||
@item glib-or-gtk-compile-schemas
|
||
Esta fase es la fase proporcionada por @code{glib-or-gtk-build-system}, y no
|
||
está activa por defecto. Puede activarse con @code{#:glib-or-gtk}.
|
||
@end table
|
||
@end defvr
|
||
|
||
@defvr {Scheme Variable} linux-module-build-system
|
||
@var{linux-module-build-system} allows building Linux kernel modules.
|
||
|
||
@cindex fases de construcción
|
||
This build system is an extension of @var{gnu-build-system}, but with the
|
||
following phases changed:
|
||
|
||
@table @code
|
||
|
||
@item configure
|
||
This phase configures the environment so that the Linux kernel's Makefile
|
||
can be used to build the external kernel module.
|
||
|
||
@item build
|
||
This phase uses the Linux kernel's Makefile in order to build the external
|
||
kernel module.
|
||
|
||
@item install
|
||
This phase uses the Linux kernel's Makefile in order to install the external
|
||
kernel module.
|
||
@end table
|
||
|
||
It is possible and useful to specify the Linux kernel to use for building
|
||
the module (in the "arguments" form of a package using the
|
||
linux-module-build-system, use the key #:linux to specify it).
|
||
@end defvr
|
||
|
||
Por último, para paquetes que no necesiten nada tan sofisticado se
|
||
proporciona un sistema de construcción ``trivial''. Es trivial en el sentido
|
||
de que no proporciona prácticamente funcionalidad: no incorpora entradas
|
||
implícitas y no tiene una noción de fases de construcción.
|
||
|
||
@defvr {Variable Scheme} trivial-build-system
|
||
Esta variable se exporta en @code{(guix build-system trivial)}.
|
||
|
||
Este sistema de construcción necesita un parámetro @code{#:builder}. Este
|
||
parámetro debe ser una expresión Scheme que construya la(s) salida(s) del
|
||
paquete---como en @code{build-expression->derivation} (@pxref{Derivaciones,
|
||
@code{build-expression->derivation}}).
|
||
@end defvr
|
||
|
||
@node El almacén
|
||
@section El almacén
|
||
|
||
@cindex almacén
|
||
@cindex elementos del almacén
|
||
@cindex rutas del almacén
|
||
|
||
Conceptualmente, el @dfn{almacén} es el lugar donde se almacenan las
|
||
derivaciones cuya construcción fue satisfactoria---por defecto,
|
||
@file{/gnu/store}. Los subdirectorios en el almacén se denominan
|
||
@dfn{elementos del almacén} o @dfn{rutas del almacén} en ocasiones. El
|
||
almacén tiene una base de datos asociada que contiene información como las
|
||
rutas del almacén a las que referencia cada ruta del almacén, y la lista de
|
||
elementos @emph{válidos} del almacén---los resultados de las construcciones
|
||
satisfactorias. Esta base de datos reside en
|
||
@file{@var{localstatedir}/guix/db}, donde @var{localstatedir} es el
|
||
directorio de estado especificado @i{vía} @option{--localstatedir} en tiempo
|
||
de configuración, normalmente @file{/var}.
|
||
|
||
El almacén @emph{siempre} es accedido a través del daemon en delegación de
|
||
sus clientes (@pxref{Invocación de guix-daemon}). Para manipular el almacén, los
|
||
clientes se conectan al daemon por un socket de dominio Unix, le envían
|
||
peticiones y leen el resultado---esto son llamadas a procedimientos remotos,
|
||
o RPC.
|
||
|
||
@quotation Nota
|
||
Las usuarias @emph{nunca} deben modificar ficheros 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
|
||
@code{GUIX_DAEMON_SOCKET}.
|
||
|
||
@defvr {Variable de entorno} GUIX_DAEMON_SOCKET
|
||
Cuando se ha definido, el valor de esta variable debe ser un nombre de
|
||
fichero o una URI designando el punto de conexión del daemon. Cuando es un
|
||
nombre de fichero, denota un socket de dominio Unix al que
|
||
conectarse. Además de nombres de ficheros, 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 @code{--listen} de @command{guix-daemon} puede usarse para
|
||
indicarle que escuche conexiones TCP (@pxref{Invocación de guix-daemon,
|
||
@code{--listen}}).
|
||
|
||
@item ssh
|
||
@cindex acceso SSH a los daemons de construcción
|
||
Estas URI le permiten conectarse a un daemon remoto sobre SSH@footnote{Esta
|
||
característica necesita Guile-SSH (@pxref{Requisitos}).}. Una URL típica
|
||
debería ser algo así:
|
||
|
||
@example
|
||
ssh://carlos@@guix.example.org:22
|
||
@end example
|
||
|
||
Como con @command{guix copy}, se tienen en cuenta los ficheros habituales de
|
||
configuración del cliente OpenSSH (@pxref{Invocación de guix copy}).
|
||
@end table
|
||
|
||
Esquemas URI adicionales pueden ser aceptados en el futuro.
|
||
|
||
@c XXX: Remove this note when the protocol incurs fewer round trips
|
||
@c and when (guix derivations) no longer relies on file system access.
|
||
@quotation Nota
|
||
La conexión con daemon de construcción remotos se considera experimental en
|
||
@value{VERSION}. Por favor, contacte con nosotras para compartir cualquier
|
||
problema o sugerencias que pueda tener (@pxref{Contribuir}).
|
||
@end quotation
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} open-connection [@var{uri}] [#:reserve-space? #t]
|
||
Abre una conexión al daemon a través del socket de dominio Unix apuntado por
|
||
@var{uri} (una cadena). Cuando @var{reserve-space?} es verdadero, le indica
|
||
que reserve un poco de espacio extra en el sistema de ficheros 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 @var{%default-socket-path}, que ese la
|
||
ruta esperada según las opciones pasadas a @code{configure}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} close-connection @var{servidor}
|
||
Cierra la conexión al @var{servidor}.
|
||
@end deffn
|
||
|
||
@defvr {Variable Scheme} current-build-output-port
|
||
Esta variable está enlazada a un parámetro SRFI-39, que referencia al puerto
|
||
donde los logs de construcción y error enviados por el daemon deben
|
||
escribirse.
|
||
@end defvr
|
||
|
||
Los procedimientos que realizan RPCs toman todos como primer parámetro un
|
||
objeto servidor.
|
||
|
||
@deffn {Procedimiento Scheme} valid-path? @var{servidor} @var{ruta}
|
||
@cindex elementos inválidos del almacén
|
||
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 ejemlo debido a que es el resultado de una
|
||
construcción interumpida o fallida).
|
||
|
||
Una condición @code{&store-protocol-error} se eleva si @var{ruta} no
|
||
contiene como prefijo el directorio del almacén (@file{/gnu/store}).
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} add-text-to-store @var{servidor} @var{nombre} @var{texto} [@var{referencias}]
|
||
Añade @var{texto} bajo el fichero @var{nombre} en el almacén, y devuelve su
|
||
ruta en el almacén. @var{referencias} es la lista de rutas del almacén
|
||
referenciadas por la ruta del almacén resultante.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} build-derivations @var{servidor} @var{derivaciones}
|
||
Construye @var{derivaciones} (una lista de objetos @code{<derivation>} o
|
||
rutas de derivaciones) y devuelve el control cuando se termina de
|
||
construirlas. Devuelve @code{#t} en caso de éxito.
|
||
@end deffn
|
||
|
||
Fijese 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 fichero
|
||
o directorio en el almacén, pero pueden producir más.
|
||
|
||
@item
|
||
@cindex tiempo de construcción, dependencias
|
||
@cindex dependencias, tiempo de construcción
|
||
Las entradas de las derivaciones---es decir, sus dependencias de tiempo de
|
||
construcción---, que pueden ser otras derivaciones o simples ficheros en el
|
||
almacén (parches, guiones de construcción, etc.).
|
||
|
||
@item
|
||
El tipo de sistema objetivo de la derivación---por ejemplo,
|
||
@code{x86_64-linux}.
|
||
|
||
@item
|
||
El nombre de fichero 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 ficheros en
|
||
el almacén cuyo nombre termina en @code{.drv}---estos ficheros se conocen
|
||
como @dfn{rutas de derivación}. Las rutas de derivación pueden pasarse al
|
||
procedimiento @code{build-derivations} para realizar las acciones de
|
||
construcción que prescriben (@pxref{El almacén}).
|
||
|
||
@cindex derivaciones de salida fija
|
||
Operaciones como la descarga de ficheros 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
|
||
The outputs of derivations---i.e., the build results---have a set of
|
||
@dfn{references}, as reported by the @code{references} RPC or the
|
||
@command{guix gc --references} command (@pxref{Invocación de guix gc}).
|
||
References are the set of run-time dependencies of the build results.
|
||
References are a subset of the inputs of the derivation; this subset is
|
||
automatically computed by the build daemon by scanning all the files in the
|
||
outputs.
|
||
|
||
El módulo @code{(guix derivations)} proporciona una representación de
|
||
derivaciones como objetos Scheme, junto a procedimientos para crear y
|
||
manipular de otras formas derivaciones. La primitiva de más bajo nivel para
|
||
crear una derivación es el procedimiento @code{derivation}:
|
||
|
||
@deffn {Procedimiento Scheme} derivation @var{almacén} @var{nombre} @var{constructor} @
|
||
@var{args} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @
|
||
[#:recursive? #f] [#:inputs '()] [#:env-vars '()] @
|
||
[#:system (%current-system)] [#:references-graphs #f] @
|
||
[#:allowed-references #f] [#:disallowed-references #f] @
|
||
[#:leaked-env-vars #f] [#:local-build? #f] @
|
||
[#:substitutable? #t] [#:properties '()]
|
||
Construye una derivación con los parámetros proporcionados, y devuelve el
|
||
objeto @code{<derivation>} resultante.
|
||
|
||
Cuando se proporcionan @var{hash} y @var{hash-algo}, una @dfn{derivación de
|
||
salida fija} se crea---es decir, una cuyo resultado se conoce de antemano,
|
||
como la descarga de un fichero. Si, además, @var{recursive?} es verdadero,
|
||
entonces la salida fijada puede ser un fichero 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 fichero/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 fichero
|
||
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 ficheros.
|
||
|
||
Cuando @var{local-build?} es verdadero, declara que la derivación no es una
|
||
buena candidata para delegación y debe ser construida localmente
|
||
(@pxref{Configuración de delegación del daemon}). Este es el caso para pequeñas derivaciones
|
||
donde los costes de transferencia de datos sobrepasarían los beneficios.
|
||
|
||
Cuando @var{substitutable?} es falso, declara que las sustituciones de la
|
||
salida de la derivación no deben usarse (@pxref{Sustituciones}). Esto es útil,
|
||
por ejemplo, cuando se construyen paquetes que capturan detalles sobre el
|
||
conjunto de instrucciones de la CPU anfitriona.
|
||
|
||
@var{properties} debe ser una lista asociada que describe ``propiedades'' de
|
||
la derivación. Debe mantenerse tal cual, sin interpretar, en la derivación.
|
||
@end deffn
|
||
|
||
@noindent
|
||
Esto es un ejemplo con un guión de shell como constructor, asumiendo que
|
||
@var{almacén} es una conexión abierta al daemon, @var{bash} apunta al
|
||
ejecutable Bash en el almacén:
|
||
|
||
@lisp
|
||
(use-modules (guix utils)
|
||
(guix store)
|
||
(guix derivations))
|
||
|
||
(let ((constructor ; añade el guión de Bash al almacén
|
||
(add-text-to-store store "mi-constructor.sh"
|
||
"echo hola mundo > $out\n" '())))
|
||
(derivation almacen "foo"
|
||
bash `("-e" ,builder)
|
||
#:inputs `((,bash) (,constructor))
|
||
#:env-vars '(("HOME" . "/sindirectorio"))))
|
||
@result{} #<derivation /gnu/store/@dots{}-foo.drv => /gnu/store/@dots{}-foo>
|
||
@end lisp
|
||
|
||
Como puede suponerse, el uso directo de esta primitiva es algo
|
||
enrevesado. Una mejor aproximación es escribir guiones de construcción en
|
||
Scheme, ¡por supuesto! La mejor forma de hacerlo es escribir el código de
|
||
construcción como una ``expresión-G'', y pasarla a
|
||
@code{gexp->derivation}. Para más información, @pxref{Expresiones-G}.
|
||
|
||
En otros tiempos, @code{gexp->derivation} no existía y la creación de
|
||
derivaciones con código de construcción escrito en Scheme se conseguía con
|
||
@code{build-expression->derivation}, documentada más adelante. Este
|
||
procedimiento está ahora obsoleto en favor del procedimiento
|
||
@code{gexp->derivation} mucho más conveniente.
|
||
|
||
@deffn {Procedimiento Scheme} build-expression->derivation @var{almacén} @
|
||
@var{nombre} @var{exp} @
|
||
[#:system (%current-system)] [#:inputs '()] @
|
||
[#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @
|
||
[#:recursive? #f] [#:env-vars '()] [#:modules '()] @
|
||
[#:references-graphs #f] [#:allowed-references #f] @
|
||
[#:disallowed-references #f] @
|
||
[#:local-build? #f] [#:substitutable? #t] [#:guile-for-build #f]
|
||
Devuelve una derivación que ejecuta la expresión Scheme @var{exp} como un
|
||
constructor para la derivación @var{nombre}. @var{inputs} debe ser una lista
|
||
de tupletas @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 fichero:
|
||
|
||
@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'':
|
||
|
||
@example
|
||
(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 example
|
||
|
||
Mediante el uso de @code{(guix monads)} y @code{(guix gexp)}, puede
|
||
reescribirse como una función monádica:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
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}):
|
||
|
||
@example
|
||
(define (enlace-sh)
|
||
(gexp->derivation "sh"
|
||
#~(symlink (string-append #$bash "/bin/bash")
|
||
#$output)))
|
||
@end example
|
||
|
||
@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}:
|
||
|
||
@example
|
||
(run-with-store (open-connection) (enlace-sh))
|
||
@result{} /gnu/store/...-enlace-para-sh
|
||
@end example
|
||
|
||
Fíjese que el módulo @code{(guix monad-repl)} extiende la sesión interactiva
|
||
de Guile con nuevos ``meta-comandos'' para facilitar el trabajo con
|
||
procedimientos monádicos: @code{run-in-store} y @code{enter-store-monad}. El
|
||
primero se usa para ``ejecutar'' un valor monádico único a través del
|
||
almacén:
|
||
|
||
@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
|
||
Fijese que los valores no-monádicos no pueden devolverse en el entorno
|
||
interactivo @code{store-monad}.
|
||
|
||
Las formas sintácticas principales para tratar con mónadas en general se
|
||
proporcionan por el módulo @code{(guix monads)} y se describen a
|
||
continuación.
|
||
|
||
@deffn {Sintaxis Scheme} with-monad @var{mónada} @var{cuerpo} ...
|
||
Evalua cualquier forma @code{>>=} o @code{return} en @var{cuerpo} como
|
||
estando en @var{mónada}.
|
||
@end deffn
|
||
|
||
@deffn {Sintaxis Scheme} return @var{val}
|
||
Devuelve el valor monádico que encapsula @var{val}.
|
||
@end deffn
|
||
|
||
@deffn {Sintaxis Scheme} >>= @var{mval} @var{mproc} ...
|
||
@dfn{Asocia} el valor monádico @var{mval}, pasando su ``contenido'' a los
|
||
procedimientos monádicos @var{mproc}@dots{}@footnote{Esta operación es
|
||
habitualmente conocida como ``bind'' (asociación), pero ese nombre denota un
|
||
procedimiento no relacionado en Guile. Por tanto usamos este símbolo en
|
||
cierto modo críptico heredado del lenguaje Haskell.}. Puede haber un
|
||
@var{mproc} o varios, como en este ejemplo:
|
||
|
||
@example
|
||
(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 example
|
||
@end deffn
|
||
|
||
@deffn {Sintaxis Scheme} mlet @var{mónada} ((@var{var} @var{mval}) ...) @
|
||
@var{cuerpo} ...
|
||
@deffnx {Sintaxis Scheme} mlet* @var{mónada} ((@var{var} @var{mval}) ...) @
|
||
@var{cuerpo} ... Asocia las variables @var{var} a los valores monádicos
|
||
@var{mval} en @var{cuerpo}, el cual es una secuencia de expresiones. Como
|
||
con el operador bind, esto puede pensarse como el ``desempaquetado'' del
|
||
valor crudo no-monádico dentro del ámbito del @var{cuerpo}. La forma
|
||
(@var{var} -> @var{val}) asocia @var{var} al valor ``normal'' @var{val},
|
||
como en @code{let}. Las operaciones de asociación ocurren en secuencia de
|
||
izquierda a derecha. La última expresión de @var{cuerpo} debe ser una
|
||
expresión monádica, y su resultado se convertirá en el resultado de
|
||
@code{mlet} o @code{mlet*} cuando se ejecute en la @var{mónada}.
|
||
|
||
@code{mlet*} es a @code{mlet} lo que @code{let*} es a @code{let}
|
||
(@pxref{Local Bindings,,, guile, GNU Guile Reference Manual}).
|
||
@end deffn
|
||
|
||
@deffn {Sistema Scheme} mbegin @var{mónada} @var{mexp} ...
|
||
Asocia @var{mexp} y las siguientes expresiones monádicas en secuencia,
|
||
devolviendo el resultado de la última expresión. Cada expresión en la
|
||
secuencia debe ser una expresión monádica.
|
||
|
||
Esto es similar a @code{mlet}, excepto que los valores devueltos por las
|
||
expresiones monádicas se ignoran. En ese sentido el funcionamiento es
|
||
análogo a @code{begin} pero aplicado a expresiones monádicas.
|
||
@end deffn
|
||
|
||
@deffn {Sistema Scheme} mwhen @var{condición} @var{mexp0} @var{mexp*} ...
|
||
Cuando @var{condición} es verdadero, evalúa la secuencia de expresiones
|
||
monádicas @var{mexp0}..@var{mexp*} como dentro de @code{mbegin}. Cuando
|
||
@var{condición} es falso, devuelve @code{*unespecified*} en la mónada
|
||
actual. Todas las expresiones en la secuencia deben ser expresiones
|
||
monádicas.
|
||
@end deffn
|
||
|
||
@deffn {Sistema Scheme} munless @var{condición} @var{mexp0} @var{mexp*} ...
|
||
Cuando @var{condición} es falso, evalúa la secuencia de expresiones
|
||
monádicas @var{mexp0}..@var{mexp*} como dentro de @code{mbegin}. Cuando
|
||
@var{condición} es verdadero, devuelve @code{*unespecified*} en la mónada
|
||
actual. Todas las expresiones en la secuencia deben ser expresiones
|
||
monádicas.
|
||
@end deffn
|
||
|
||
@cindex mónada de estado
|
||
El módulo @code{(guix monads)} proporciona la @dfn{mónada de estado}, que
|
||
permite que un valor adicional---el estado---sea @emph{hilado} a través de
|
||
las llamadas a procedimientos monádicos.
|
||
|
||
@defvr {Variable Scheme} %state-monad
|
||
La mónada de estado. Procedimientos en la mónada de estado pueden acceder y
|
||
cambiar el estado hilado.
|
||
|
||
Considere el siguiente ejemplo. El procedimiento @code{cuadrado} devuelve un
|
||
valor en la mónada de estado.
|
||
|
||
@example
|
||
(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 example
|
||
|
||
Cuando se ``ejecuta'' a través de @var{%state-monad}, obtenemos un valor
|
||
adicional de estado, que ese el número de llamadas a @code{cuadrado}.
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento monádico} current-state
|
||
Devuelve el estado actual como un valor monádico.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} set-current-state @var{valor}
|
||
Establece el estado actual a @var{valor} y devuelve el estado previo como un
|
||
valor monádico.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} state-push @var{valor}
|
||
Apila @var{valor} al estado actual, que se asume que es una lista, y
|
||
devuelve el estado previo como un valor monádico.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} state-pop
|
||
Desapila un valor del estado actual y lo devuelve como un valor monádico. El
|
||
estado se asume que es una lista.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} run-with-state @var{mval} [@var{estado}]
|
||
Ejecuta un valor monádico @var{mval} comenzando con @var{estado} como el
|
||
estado inicial. Devuelve dos valores: el valor resultante y el estado
|
||
resultante.
|
||
@end deffn
|
||
|
||
La interfaz principal a la mónada del almacén, proporcionada por el módulo
|
||
@code{(guix store)}, es como sigue.
|
||
|
||
@defvr {Variable Scheme} %store-monad
|
||
La mónada del almacén---un alias para @var{%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'' pasandolo al procedimiento @code{run-with-store} (vea más
|
||
adelante).
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} run-with-store @var{almacén} @var{mval} [#:guile-for-build] [#:system (%current-system)]
|
||
Ejecuta @var{mval}, un valor monádico en la mónada del almacén, en
|
||
@var{almacén}, una conexión abierta al almacén.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} text-file @var{nombre} @var{texto} [@var{referencias}]
|
||
Devuelve como un valor monádico el nombre absoluto del fichero en el almacén
|
||
del fichero que contiene @var{ŧexto}, una cadena. @var{referencias} es una
|
||
lista de elementos del almacén a los que el fichero 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 fichero en el almacén
|
||
del fichero que contiene @var{datos}, un vector de bytes. @var{referencias}
|
||
es una lista de elementos del almacén a los que el fichero binario
|
||
referencia; su valor predeterminado es la lista vacía.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} interned-file @var{fichero} [@var{nombre}] @
|
||
[#:recursive? #t] [#:select? (const #t)]
|
||
Devuelve el nombre del @var{fichero} una vez internado en el almacén. Usa
|
||
@var{nombre} como su nombre del almacén, o el nombre base de @var{fichero}
|
||
si @var{nombre} se omite.
|
||
|
||
Cuando @var{recursive?} es verdadero, los contenidos del @var{fichero} se
|
||
añaden recursivamente; si @var{fichero} designa un fichero 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{fichero} @var{stat})} por cada entrada del directorio, donde
|
||
@var{fichero} es el nombre absoluto de fichero 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 fichero al almacén, bajo dos nombres
|
||
diferentes:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@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{fichero}] @
|
||
[#:system (%current-system)] [#:target #f] @
|
||
[#:output "out"]
|
||
Devuelve como un valor monádico el nombre absoluto de fichero de
|
||
@var{fichero} dentro del directorio de salida @var{output} del
|
||
@var{paquete}. Cuando se omite @var{fichero}, 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.
|
||
@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 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.
|
||
|
||
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 fichero 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 fichero 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 ficheros 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-fichero'', los cuales facilitan la adición de ficheros 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:
|
||
|
||
@example
|
||
(define exp-construccion
|
||
#~(begin
|
||
(mkdir #$output)
|
||
(chdir #$output)
|
||
(symlink (string-append #$coreutils "/bin/ls")
|
||
"enumera-ficheros")))
|
||
@end example
|
||
|
||
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}:
|
||
|
||
@example
|
||
(gexp->derivation "la-cosa" exp-construccion)
|
||
@end example
|
||
|
||
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:
|
||
|
||
@example
|
||
(gexp->derivation "vi"
|
||
#~(begin
|
||
(mkdir #$output)
|
||
(system* (string-append #+coreutils "/bin/ln")
|
||
"-s"
|
||
(string-append #$emacs "/bin/emacs")
|
||
(string-append #$output "/bin/vi")))
|
||
#:target "mips64el-linux-gnu")
|
||
@end example
|
||
|
||
@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:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@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 ficheros de fuentes, lo que es útil en este caso:
|
||
|
||
@example
|
||
(use-modules (guix modules)) ;para 'source-module-closure'
|
||
|
||
(with-imported-modules (source-module-closure
|
||
'((guix build utils)
|
||
(gnu build vm)))
|
||
(gexp->derivation "algo-con-maq-virtuales"
|
||
#~(begin
|
||
(use-modules (guix build utils)
|
||
(gnu build vm))
|
||
@dots{})))
|
||
@end example
|
||
|
||
@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:
|
||
|
||
@example
|
||
(use-modules (gnu packages guile)) ;para 'guile-json'
|
||
|
||
(with-extensions (list guile-json)
|
||
(gexp->derivation "algo-con-json"
|
||
#~(begin
|
||
(use-modules (json))
|
||
@dots{})))
|
||
@end example
|
||
|
||
La forma sintáctica para construir expresiones-G se resume a continuación.
|
||
|
||
@deffn {Sintaxis Scheme} #~@var{exp}
|
||
@deffnx {Sintaxis Scheme} (gexp @var{exp})
|
||
Devuelve una expresión-G que contiene @var{exp}. @var{exp} puede contener
|
||
una o más de las siguientes formas:
|
||
|
||
@table @code
|
||
@item #$@var{obj}
|
||
@itemx (ungexp @var{obj})
|
||
Introduce una referencia a @var{obj}. @var{obj} puede tener uno de los tipos
|
||
permitidos, por ejemplo un paquete o derivación, en cuyo caso la forma
|
||
@code{ungexp} se substituye por el nombre de fichero de su salida---por
|
||
ejemplo, @code{"/gnu/store/@dots{}-coreutils-8.22}.
|
||
|
||
Si @var{obj} es una lista, se recorre y las referencias a objetos permitidos
|
||
se substituyen de manera similar.
|
||
|
||
Si @var{obj} es otra expresión-G, su contenido se inserta y sus dependencias
|
||
se añaden a aquellas de la expresión-G que la contiene.
|
||
|
||
Si @var{obj} es otro tipo de objeto, se inserta tal cual es.
|
||
|
||
@item #$@var{obj}:@var{salida}
|
||
@itemx (ungexp @var{obj} @var{salida})
|
||
Como la forma previa, pero referenciando explícitamente la @var{salida} de
|
||
@var{obj}---esto es útil cuando @var{obj} produce múltiples salidas
|
||
(@pxref{Paquetes con múltiples salidas}).
|
||
|
||
@item #+@var{obj}
|
||
@itemx #+@var{obj}:salida
|
||
@itemx (ungexp-native @var{obj})
|
||
@itemx (ungexp-native @var{obj} @var{salida})
|
||
Lo mismo 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 (vea más adelante).
|
||
@end deffn
|
||
|
||
@deffn {Sintaxis Scheme} with-imported-modules @var{módulos} @var{cuerpo}@dots{}
|
||
Marca las expresiones-G definidas en el @var{cuerpo}@dots{} como si
|
||
requiriesen @var{módulos} en su entorno de ejecución.
|
||
|
||
Cada elemento en @var{módulos} puede ser el nombre de un módulo, como
|
||
@code{(guix build utils)}, o puede ser el nombre de un módulo, seguido de
|
||
una flecha, seguido de un objeto tipo-fichero:
|
||
|
||
@example
|
||
`((guix build utils)
|
||
(guix gcrypt)
|
||
((guix config) => ,(scheme-file "config.scm"
|
||
#~(define-module @dots{}))))
|
||
@end example
|
||
|
||
@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-fichero proporcionado.
|
||
|
||
Esta forma tiene ámbito @emph{léxico}: tiene efecto en las expresiones-G
|
||
definidas en @var{cuerpo}@dots{}, pero no en aquellas definidas, digamos, en
|
||
procedimientos llamados por @var{cuerpo}@dots{}.
|
||
@end deffn
|
||
|
||
@deffn {Sintaxis Scheme} with-extensions @var{extensiones} @var{cuerpo}@dots{}
|
||
Marca que las expresiones definidas en @var{cuerpo}@dots{} requieren
|
||
@var{extensiones} en su entorno de construcción y
|
||
ejecución. @var{extensiones} es típicamente una lista de objetos de paquetes
|
||
como los que se definen en el módulo @code{(gnu packages guile)}.
|
||
|
||
De manera concreta, los paquetes listados en @var{extensiones} se añaden a
|
||
la ruta de carga mientras se compilan los módulos importados en
|
||
@var{cuerpo}@dots{}; también se añaden a la ruta de carga en la expresión-G
|
||
devuelta por @var{cuerpo}@dots{}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} gexp? @var{obj}
|
||
Devuelve @code{#t} si @var{obj} es una expresión-G.
|
||
@end deffn
|
||
|
||
Las expresiones-G están destinadas a escribirse en disco, tanto en código
|
||
que construye alguna derivación, como en ficheros 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 @var{%load-path}] @
|
||
[#:effective-version "2.2"] @
|
||
[#:references-graphs #f] [#:allowed-references #f] @
|
||
[#:disallowed-references #f] @
|
||
[#:leaked-env-vars #f] @
|
||
[#:script-name (string-append @var{name} "-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 fichero llamado @var{script-name}. Cuando
|
||
@var{target} es verdadero, se usa como la 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 a usar cuando se añaden las
|
||
extensiones de @var{exp} (vea @code{with-extensions}) a la ruta de
|
||
búsqueda---por ejemplo, @code{"2.2"}.
|
||
|
||
@var{graft?} determina si los paquetes a los que @var{exp} hace referencia
|
||
deben ser injertados cuando sea posible.
|
||
|
||
Cuando @var{references-graphs} es verdadero, debe ser una lista de tuplas de
|
||
una de las formas siguientes:
|
||
|
||
@example
|
||
(@var{nombre-fichero} @var{paquete})
|
||
(@var{nombre-fichero} @var{paquete} @var{salida})
|
||
(@var{nombre-fichero} @var{derivación})
|
||
(@var{nombre-fichero} @var{derivación} @var{salida})
|
||
(@var{nombre-fichero} @var{elemento-almacén})
|
||
@end example
|
||
|
||
El lado derecho de cada elemento de @var{references-graphs} se convierte
|
||
automáticamente en una entrada del proceso de construcción de @var{exp}. En
|
||
el entorno de construcción, cada @var{nombre-fichero} 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-fichero
|
||
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-fichero}. Esto es, cuando se
|
||
expanden en una expresión-G, estos objetos dirigen a un fichero en el
|
||
almacén. Considere esta expresión-G:
|
||
|
||
@example
|
||
#~(system* #$(file-append glibc "/sbin/nscd") "-f"
|
||
#$(local-file "/tmp/mi-nscd.conf"))
|
||
@end example
|
||
|
||
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 fichero 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 fichero se proporciona directamente como una cadena.
|
||
|
||
@deffn {Procedimiento Scheme} local-file @var{fichero} [@var{nombre}] @
|
||
[#:recursive? #f] [#:select? (const #t)]
|
||
Devuelve un objeto que representa el fichero local @var{fichero} a añadir al
|
||
almacén; este objeto puede usarse en una expresión-G. Si @var{fichero} es un
|
||
nombre de fichero relativo, se busca de forma relativa al fichero fuente
|
||
donde esta forma aparece. @var{fichero} se añadirá al almacén bajo
|
||
@var{nombre}---por defecto el nombre base de @var{fichero}.
|
||
|
||
Cuando @var{recursive?} es verdadero, los contenidos del @var{fichero} se
|
||
añaden recursivamente; si @var{fichero} designa un fichero 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{fichero} @var{stat})} por cada entrada del directorio, donde
|
||
@var{fichero} es el nombre absoluto de fichero de la entrada y @var{stat} es
|
||
el resultado de @code{lstat}; excluyendo las entradas para las cuales
|
||
@var{select?} no devuelve verdadero.
|
||
|
||
Esta es la contraparte declarativa del procedimiento monádico
|
||
@code{interned-file} (@pxref{La mónada del almacén, @code{interned-file}}).
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} plain-file @var{nombre} @var{contenido}
|
||
Devuelve un objeto que representa un fichero de texto llamado @var{nombre}
|
||
con el @var{contenido} proporcionado (una cadena o un vector de bytes) para
|
||
ser añadido al almacén.
|
||
|
||
Esta es la contraparte declarativa de @code{text-file}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} computed-file @var{nombre} @var{gexp} @
|
||
[#:options '(#:local-build? #t)]
|
||
Devuelve un objeto que representa el elemento del almacén @var{nombre}, un
|
||
fichero o un directorio computado por @var{gexp}. @var{options} es una lista
|
||
de parámetros adicionales a pasar 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]
|
||
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}:
|
||
|
||
@example
|
||
(use-modules (guix gexp) (gnu packages base))
|
||
|
||
(gexp->script "enumera-ficheros"
|
||
#~(execl #$(file-append coreutils "/bin/ls")
|
||
"ls"))
|
||
@end example
|
||
|
||
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 fichero
|
||
ejecutable @file{/gnu/store/@dots{}-enumera-ficheros} más o menos así:
|
||
|
||
@example
|
||
#!/gnu/store/@dots{}-guile-2.0.11/bin/guile -ds
|
||
!#
|
||
(execl "/gnu/store/@dots{}-coreutils-8.22"/bin/ls" "ls")
|
||
@end example
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} program-file @var{nombre} @var{exp} @
|
||
[#:guile #f] [#:module-path %load-path]
|
||
Devuelve un objeto que representa el elemento ejecutable del almacén
|
||
@var{nombre} que ejecuta @var{gexp}. @var{guile} es el paquete Guile usado
|
||
para ejecutar el guión. Los módulos importados por @var{gexp} se buscan en
|
||
@var{module-path}.
|
||
|
||
Esta es la contraparte declarativa de @code{gexp->script}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} gexp->file @var{nombre} @var{exp} @
|
||
[#:set-load-path? #t] [#:module-path %load-path] @
|
||
[#:splice? #f] @
|
||
[#:guile (default-guile)]
|
||
Devuelve una derivación que construye un fichero @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 fichero resultante.
|
||
|
||
Cuando @var{set-load-path} es verdadero, emite código en el fichero
|
||
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 fichero resultante hace referencia a todas las dependencias de @var{exp}
|
||
o a un subconjunto de ellas.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} scheme-file @var{nombre} @var{exp} [#:splice? #f]
|
||
Devuelve un objeto que representa el fichero Scheme @var{nombre} que
|
||
contiene @var{exp}.
|
||
|
||
Esta es la contraparte declarativa de @code{gexp->file}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento monádico} text-file* @var{nombre} @var{texto} @dots{}
|
||
Devuelve como un valor monádico una derivación que construye un fichero 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, ficheros locales, objetos, etc. El
|
||
fichero del almacén resultante hace referencia a todos ellos.
|
||
|
||
Esta variante debe preferirse sobre @code{text-file} cuando el fichero a
|
||
crear haga referencia a elementos del almacén. Esto es el caso típico cuando
|
||
se construye un fichero de configuración que embebe nombres de ficheros del
|
||
almacén, como este:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
En este ejemplo, el fichero @file{/gnu/store/@dots{}-perfil.sh} resultante
|
||
hará referencia a @var{coreutils}, @var{grep} y @var{sed}, por tanto
|
||
evitando que se recolecten como basura durante su tiempo de vida.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} mixed-text-file @var{nombre} @var{texto} @dots{}
|
||
Devuelve un objeto que representa el fichero del almacén @var{nombre} que
|
||
contiene @var{texto}. @var{texto} es una secuencia de cadenas y objetos
|
||
tipo-fichero, como en:
|
||
|
||
@example
|
||
(mixed-text-file "perfil"
|
||
"export PATH=" coreutils "/bin:" grep "/bin")
|
||
@end example
|
||
|
||
Esta es la contraparte declarativa de @code{text-file*}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} file-union @var{nombre} @var{ficheros}
|
||
Devuelve un @code{<computed-file>} que construye un directorio que contiene
|
||
todos los @var{ficheros}. Cada elemento en @var{ficheros} debe ser una lista
|
||
de dos elementos donde el primer elemento es el nombre de fichero a usar en
|
||
el nuevo directorio y el segundo elemento es una expresión-G que denota el
|
||
fichero de destino. Aquí está un ejemplo:
|
||
|
||
@example
|
||
(file-union "etc"
|
||
`(("hosts" ,(plain-file "hosts"
|
||
"127.0.0.1 localhost"))
|
||
("bashrc" ,(plain-file "bashrc"
|
||
"alias ls='ls --color=auto'"))))
|
||
@end example
|
||
|
||
Esto emite un directorio @code{etc} que contiene estos dos ficheros.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} directory-union @var{nombre} @var{cosas}
|
||
Devuelve un directorio que es la unión de @var{cosas}, donde @var{cosas} es
|
||
una lista de objetos tipo-fichero que denotan directorios. Por ejemplo:
|
||
|
||
@example
|
||
(directory-union "guile+emacs" (list guile emacs))
|
||
@end example
|
||
|
||
emite un directorio que es la unión de los paquetes @code{guile} y
|
||
@code{emacs}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimientos Scheme} file-append @var{obj} @var{sufijo} @dots{}
|
||
Devuelve un objeto tipo-fichero 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:
|
||
|
||
@example
|
||
(gexp->script "ejecuta-uname"
|
||
#~(system* #$(file-append coreutils
|
||
"/bin/uname")))
|
||
@end example
|
||
|
||
El mismo efecto podría conseguirse con:
|
||
|
||
@example
|
||
(gexp->script "ejecuta-uname"
|
||
#~(system* (string-append #$coreutils
|
||
"/bin/uname")))
|
||
@end example
|
||
|
||
Hay una diferencia no obstante: en el caso de @code{file-append}, el guión
|
||
resultante contiene una ruta absoluta de fichero 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 fichero @emph{en
|
||
tiempo de ejecución}.
|
||
@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 @var{%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
|
||
@code{<package>}.
|
||
@end deffn
|
||
|
||
@node Invocación de guix repl
|
||
@section Invocación de @command{guix repl}
|
||
|
||
@cindex REPL, bucle de lectura-evaluación-impresión
|
||
La orden @command{guix repl} lanza un @dfn{bucle de
|
||
lectura-evaluación-impresión} Guile (REPL) para programación interactiva
|
||
(@pxref{Using Guile Interactively,,, guile, GNU Guile Reference
|
||
Manual}). 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. Puede usarla de esta
|
||
manera:
|
||
|
||
@example
|
||
$ guix repl
|
||
scheme@@(guile-user)> ,use (gnu packages base)
|
||
scheme@@(guile-user)> coreutils
|
||
$1 = #<package coreutils@@8.29 gnu/packages/base.scm:327 3e28300>
|
||
@end example
|
||
|
||
@cindex inferiores
|
||
Además, @command{guix repl} implementa un protocolo del REPL simple legible
|
||
por máquinas para su uso por @code{(guix inferior)}, una facilidad para
|
||
interactuar con @dfn{inferiores}, procesos separados que ejecutan una
|
||
revisión de Guix potencialmente distinta.
|
||
|
||
Las opciones disponibles son las siguientes:
|
||
|
||
@table @code
|
||
@item --type=@var{tipo}
|
||
@itemx -t @var{tipo}
|
||
Inicia un REPL del @var{TIPO} dado, que puede ser uno de los siguientes:
|
||
|
||
@table @code
|
||
@item guile
|
||
Es el predeterminado, y lanza una sesión interactiva Guile estándar con
|
||
todas las características.
|
||
@item machine
|
||
Lanza un REPL que usa el protocolo legible por máquinas. Este es el
|
||
protocolo con el que el módulo @code{(guix inferior)} se comunica.
|
||
@end table
|
||
|
||
@item --listen=@var{destino}
|
||
Por defecto, @command{guix repl} lee de la entrada estándar y escribe en la
|
||
salida estándar. Cuando se pasa esta opción, en vez de eso escuchará las
|
||
conexiones en @var{destino}. Estos son ejemplos de opciones válidas:
|
||
|
||
@table @code
|
||
@item --listen=tcp:37146
|
||
Acepta conexiones locales por el puerto 37146.
|
||
|
||
@item --listen=unix:/tmp/socket
|
||
Acepta conexiones a través del socket de dominio Unix @file{/tmp/socket}.
|
||
@end table
|
||
@end table
|
||
|
||
@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 fichero e imprimir su hash.
|
||
* Invocación de guix hash:: Calcular el hash criptográfico de un fichero.
|
||
* Invocación de guix import:: Importar definiciones de paquetes.
|
||
* Invocación de guix refresh:: Actualizar definiciones de paquetes.
|
||
* 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 | cut -f1,2 --output-delimiter=@@`
|
||
@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 @code{--expression} puede ser usada para
|
||
especificar una expresión Scheme que evalúa a un paquete; esto es útil para
|
||
la desambiguación entre varios paquetes del 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 no tiene efecto cuando se conecta a un daemon remoto con una URI
|
||
@code{guix://} (@pxref{El almacén, the @code{GUIX_DAEMON_SOCKET} variable}).
|
||
|
||
@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
|
||
deshabilitadas.
|
||
|
||
@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.
|
||
|
||
Fíjese que, actualmente, los resultados de las construcciones discordantes
|
||
no se mantienen, por lo que debe que investigar manualmente en caso de un
|
||
error---por ejemplo, mediante la extracción de uno de los resultados con
|
||
@code{guix archive --export} (@pxref{Invocación de guix archive}), seguida de una
|
||
reconstrucción, y finalmente la comparación de los dos resultados.
|
||
|
||
@item --no-build-hook
|
||
No intenta delegar construcciones a través del ``hook de construcción'' del
|
||
daemon (@pxref{Configuración de delegación del daemon}). Es decir, siempre realiza las
|
||
construcciones de manera local en vez de delegando 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, @code{--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, @code{--timeout}}).
|
||
|
||
@c Note: This option is actually not part of %standard-build-options but
|
||
@c most programs honor it.
|
||
@cindex verbosity, of the command-line tools
|
||
@cindex logs 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, and 2 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, @code{--max-jobs}}, para detalles
|
||
acerca de esta opción y la opción equivalente de @command{guix-daemon}.
|
||
|
||
@item --debug=@var{nivel}
|
||
Produce debugging output coming from the build daemon. @var{level} must be
|
||
an integer between 0 and 5; higher means more verbose output. Setting a
|
||
level of 4 or more may be helpful when debugging setup issues with the build
|
||
daemon.
|
||
|
||
@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
|
||
@code{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}).
|
||
|
||
@table @code
|
||
|
||
@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 fichero 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.7.tar.gz
|
||
@end example
|
||
|
||
Como desarrolladora, @code{--with-source} facilita la prueba de versiones
|
||
candidatas para la publicación:
|
||
|
||
@example
|
||
guix build guile --with-source=../guile-2.0.9.219-e1bb7.tar.xz
|
||
@end example
|
||
|
||
@dots{} o la construcción desde una revisión en un entorno limpio:
|
||
|
||
@example
|
||
$ git clone git://git.sv.gnu.org/guix.git
|
||
$ guix build guix --with-source=guix@@1.0=./guix
|
||
@end example
|
||
|
||
@item --with-input=@var{paquete}=@var{reemplazo}
|
||
Substituye dependencias de @var{paquete} por dependencias de
|
||
@var{reemplazo}. @var{paquete} debe ser un nombre de paquete, y
|
||
@var{reemplazo} debe ser una especificación de paquete como @code{guile} o
|
||
@code{guile@@1.8}.
|
||
|
||
Por ejemplo, la orden siguiente construye Guix, pero substituye su
|
||
dependencia de la versión estable actual de Guile con una dependencia en la
|
||
versión antigua de Guile, @code{guile@@2.0}:
|
||
|
||
@example
|
||
guix build --with-input=guile=guile@@2.0 guix
|
||
@end example
|
||
|
||
Esta sustitución se realiza de forma recursiva y en profundidad. Por lo que
|
||
en este ejemplo, tanto @code{guix} como su dependencia @code{guile-json}
|
||
(que también depende de @code{guile}) se reconstruyen contra
|
||
@code{guile@@2.0}.
|
||
|
||
Se implementa usando el procedimiento Scheme @code{package-input-rewriting}
|
||
(@pxref{Definición de paquetes, @code{package-input-rewriting}}).
|
||
|
||
@item --with-graft=@var{paquete}=@var{reemplazo}
|
||
Es similar a @code{--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!
|
||
|
||
@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.
|
||
|
||
For example, the following command builds the NumPy Python library against
|
||
the latest commit of the master branch of Python itself:
|
||
|
||
@example
|
||
guix build python-numpy \
|
||
--with-git-url=python=https://github.com/python/cpython
|
||
@end example
|
||
|
||
This option can also be combined with @code{--with-branch} or
|
||
@code{--with-commit} (see below).
|
||
|
||
@cindex integración continua
|
||
Obviously, since it uses the latest commit of the given branch, the result
|
||
of such a command varies over time. Nevertheless it is a convenient way to
|
||
rebuild entire software stacks against the latest commit of one or more
|
||
packages. This is particularly useful in the context of continuous
|
||
integration (CI).
|
||
|
||
Checkouts are kept in a cache under @file{~/.cache/guix/checkouts} to speed
|
||
up consecutive accesses to the same repository. You may want to clean it up
|
||
once in a while to save disk space.
|
||
|
||
@item --with-branch=@var{paquete}=@var{rama}
|
||
Build @var{package} from the latest commit of @var{branch}. If the
|
||
@code{source} field of @var{package} is an origin with the @code{git-fetch}
|
||
method (@pxref{Referencia de ``origin''}) or a @code{git-checkout} object, the
|
||
repository URL is taken from that @code{source}. Otherwise you have to use
|
||
@code{--with-git-url} to specify the URL of the Git repository.
|
||
|
||
For instance, the following command builds @code{guile-sqlite3} from the
|
||
latest commit of its @code{master} branch, and then builds @code{guix}
|
||
(which depends on it) and @code{cuirass} (which depends on @code{guix})
|
||
against this specific @code{guile-sqlite3} build:
|
||
|
||
@example
|
||
guix build --with-branch=guile-sqlite3=master cuirass
|
||
@end example
|
||
|
||
@item --with-commit=@var{paquete}=@var{revisión}
|
||
This is similar to @code{--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.
|
||
@end table
|
||
|
||
@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
|
||
Build quietly, without displaying the build log; this is equivalent to
|
||
@code{--verbosity=0}. Upon completion, the build log is kept in @file{/var}
|
||
(or similar) and can always be retrieved using the @option{--log-file}
|
||
option.
|
||
|
||
@item --file=@var{fichero}
|
||
@itemx -f @var{fichero}
|
||
Construye el paquete, derivación u otro objeto tipo-fichero al que evalúa el
|
||
código en @var{fichero} (@pxref{Expresiones-G, file-like objects}).
|
||
|
||
Como un ejemplo, @var{fichero} puede contener una definición como esta
|
||
(@pxref{Definición de paquetes}):
|
||
|
||
@example
|
||
@verbatiminclude package-hello.scm
|
||
@end example
|
||
|
||
@item --expression=@var{expr}
|
||
@itemx -e @var{expr}
|
||
Construye el paquete o derivación al que @var{expr} evaulua.
|
||
|
||
Por ejemplo, @var{expr} puede ser @code{(@@ (gnu packages guile)
|
||
guile-1.8)}, que designa sin ambigüedad a esta variante específica de la
|
||
versión 1.8 de Guile.
|
||
|
||
De manera alternativa, @var{expr} puede ser una expresión-G, en cuyo caso se
|
||
usa como un programa de construcción pasado a @code{gexp->derivation}
|
||
(@pxref{Expresiones-G}).
|
||
|
||
Por último, @var{expr} puede hacer referencia a un procedimiento mónadico
|
||
sin parámetros (@pxref{La mónada del almacén}). El procedimiento debe devolver una
|
||
derivación como un valor monádico, el cual después se pasa a través de
|
||
@code{run-with-store}.
|
||
|
||
@item --source
|
||
@itemx -S
|
||
Construye las derivaciones de las fuentes de los paquetes, en vez de los
|
||
paquetes mismos.
|
||
|
||
Por ejemplo, @code{guix build -S gcc} devuelve algo como
|
||
@file{/gnu/store/@dots{}-gcc-4.7.2.tar.bz2}, el cual es el archivador tar de
|
||
fuentes de GCC.
|
||
|
||
El archivador tar devuelto es el resultado de aplicar cualquier parche y
|
||
fragmento de código en el origen (campo @code{origin}) del paquete
|
||
(@pxref{Definición de paquetes}).
|
||
|
||
@item --sources
|
||
Obtiene y devuelve las fuentes de @var{paquete-o-derivación} y todas sus
|
||
dependencias, recursivamente. Esto es útil para obtener una copia local de
|
||
todo el código fuente necesario para construir los @var{paquetes},
|
||
permitiendole construirlos llegado el momento sin acceso a la red. Es una
|
||
extensión de la opción @code{--source} y puede aceptar uno de los siguientes
|
||
valores opcionales como parámetro:
|
||
|
||
@table @code
|
||
@item package
|
||
Este valor hace que la opción @code{--sources} se comporte de la misma
|
||
manera que la opción @code{--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}
|
||
Attempt to build for @var{system}---e.g., @code{i686-linux}---instead of the
|
||
system type of the build host. The @command{guix build} command allows you
|
||
to repeat this option several times, in which case it builds for all the
|
||
specified systems; other commands ignore extraneous @option{-s} options.
|
||
|
||
@quotation Nota
|
||
La opción @code{--system} es para compilación @emph{nativa} y no debe
|
||
confundirse con la compilación cruzada. Véase @code{--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, pasar
|
||
@code{--system=i686-linux} en un sistema @code{x86_64-linux} o
|
||
@code{--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á habilitada
|
||
incondicionalmente en máquinas @code{aarch64-linux}, aunque determinados
|
||
procesadores aarch64 no permiten esta funcionalidad, notablemente el
|
||
ThunderX.
|
||
@end quotation
|
||
|
||
De manera similar, cuando la emulación transparente con QEMU y
|
||
@code{binfmt_misc} está habilitada (@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 pueden
|
||
delegarse 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{"mips64el-linux-gnu"} (@pxref{Specifying target triplets,
|
||
GNU configuration triplets,, autoconf, Autoconf}).
|
||
|
||
@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 reconstruyendolos.
|
||
|
||
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{fichero}
|
||
@itemx -r @var{fichero}
|
||
@cindex GC, añadir raíces
|
||
@cindex raíces del recolector de basura, añadir
|
||
Hace que @var{fichero} 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{fichero} 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 ficheros 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 un log no está disponible localmente, y a menos que se proporcione
|
||
@code{--no-substitutes}, la orden busca el log correspondiente en uno de los
|
||
servidores de sustituciones (como se especificaron con
|
||
@code{--substitute-urls}).
|
||
|
||
Por lo que dado el caso, imaginese que desea ver el log de construcción de
|
||
GDB en MIPS, pero realmente está en una máquina @code{x86_64}:
|
||
|
||
@example
|
||
$ guix build --log-file gdb -s mips64el-linux
|
||
https://@value{SUBSTITUTE-SERVER}/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.
|
||
|
||
Para ello, la primera cosa a hacer es usar la opción @option{--keep-failed}
|
||
o @option{-K} de @command{guix build}, lo que mantiene el árbol de la
|
||
construcción fallida en @file{/tmp} o el directorio que especificase con
|
||
@code{TMPDIR} (@pxref{Invocación de guix build, @code{--keep-failed}}).
|
||
|
||
De ahí en adelante, puede usar @command{cd} para ir al árbol de la
|
||
construcción fallida y cargar el fichero @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 environment --no-grafts -C foo --ad-hoc strace gdb
|
||
[env]# source ./environment-variables
|
||
[env]# cd foo-1.2
|
||
@end example
|
||
|
||
Aquí, @command{guix environment -C} crea un contenedor y lanza un shell
|
||
nuevo en él (@pxref{Invocación de guix environment}). El fragmento
|
||
@command{--ad-hoc strace gdb} añade las ordenes @command{strace} y
|
||
@command{gdb} al contenedor, las cuales pueden resultar útiles durante la
|
||
depuración. La opción @option{--no-grafts} asegura que obtenemos exactamente
|
||
el mismo entorno, con paquetes sin injertos (@pxref{Actualizaciones de seguridad}, para
|
||
más información sobre los injertos).
|
||
|
||
Para acercarnos más al contenedor usado por el daemon de construcción,
|
||
podemos eliminar @file{/bin/sh}:
|
||
|
||
@example
|
||
[env]# rm /bin/sh
|
||
@end example
|
||
|
||
(No se preocupe, es inocuo: todo esto ocurre en el contenedor de usar y
|
||
tirar creado por @command{guix environment}).
|
||
|
||
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 ficheros de fuentes! La orden @command{guix edit}
|
||
facilita la vida de las usuarias y empaquetadoras apuntando su editor al
|
||
fichero de fuentes que contiene la definición de los paquetes
|
||
especificados. Por ejemplo:
|
||
|
||
@example
|
||
guix edit gcc@@4.9 vim
|
||
@end example
|
||
|
||
@noindent
|
||
lanza el programa especificado en la variable de entorno @code{VISUAL} o en
|
||
@code{EDITOR} para ver la receta de GCC@tie{}4.9.3 y la de Vim.
|
||
|
||
Si está usando una copia de trabajo de Git de Guix (@pxref{Construcción desde Git}), o ha creado sus propios paquetes en @code{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.
|
||
|
||
|
||
@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 fichero de la URI proporcionada, lo añade al
|
||
almacén e imprime tanto su nombre de fichero en el almacén como su hash
|
||
SHA256.
|
||
|
||
El hecho de que el fichero 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 ficheros 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 @code{SSL_CERT_DIR} (@pxref{Certificados X.509}), a menos que se use
|
||
@option{--no-check-certificate}.
|
||
|
||
Las siguientes opciones están disponibles:
|
||
|
||
@table @code
|
||
@item --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 intercepción (``man-in-the-middle'').
|
||
|
||
@item --output=@var{fichero}
|
||
@itemx -o @var{fichero}
|
||
Almacena el fichero descargado en @var{fichero} en vez de añadirlo al
|
||
almacén.
|
||
@end table
|
||
|
||
@node Invocación de guix hash
|
||
@section Invocación de @command{guix hash}
|
||
|
||
@cindex @command{guix hash}
|
||
La orden @command{guix hash} calcula el hash SHA256 de un fichero. Es
|
||
principalmente una conveniente herramienta para cualquiera que contribuya a
|
||
la distribución: calcula el hash criptográfico de un fichero, que puede
|
||
usarse en la definición de un paquete (@pxref{Definición de paquetes}).
|
||
|
||
La sintaxis general es:
|
||
|
||
@example
|
||
guix hash @var{opciones} @var{fichero}
|
||
@end example
|
||
|
||
Cuando @var{fichero} 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 --format=@var{fmt}
|
||
@itemx -f @var{fmt}
|
||
Escribe el hash en el formato especificado por @var{fmt}.
|
||
|
||
Los formatos disponibles son: @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
|
||
Calcula el hash de @var{fichero} recursivamente.
|
||
|
||
@c FIXME: Replace xref above with xref to an ``Archive'' section when
|
||
@c it exists.
|
||
Es este caso el hash se calcula en un archivador que contiene @var{fichero},
|
||
incluyendo su contenido si es un directorio. Algunos de los metadatos de
|
||
@var{fichero} son parte del archivador; por ejemplo, cuando @var{fichero} es
|
||
un fichero normal, el hash es diferente dependiendo de si @var{fichero} es
|
||
ejecutable o no. Los metadatos como las marcas de tiempo no influyen en el
|
||
hash (@pxref{Invocación de guix archive}).
|
||
|
||
@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 -rx .
|
||
@end example
|
||
@end table
|
||
|
||
@node Invocación de guix import
|
||
@section Invocación de @command{guix import}
|
||
|
||
@cindex importar paquetes
|
||
@cindex importación de un paquete
|
||
@cindex conversión de un paquete
|
||
@cindex Invocación de @command{guix import}
|
||
La orden @command{guix import} es útil para quienes desean añadir un paquete
|
||
a la distribución con el menor trabajo posible---una demanda legítima. La
|
||
orden conoce algunos repositorios de los que puede ``importar'' metadatos de
|
||
paquetes. El resultado es una definición de paquete, o una plantilla de
|
||
ella, en el formato que conocemos (@pxref{Definición de paquetes}).
|
||
|
||
La sintaxis general es:
|
||
|
||
@example
|
||
guix import @var{importador} @var{opciones}@dots{}
|
||
@end example
|
||
|
||
@var{importador} especifica la fuente de la que se importan los metadatos
|
||
del paquete, @var{opciones} especifica un identificador de paquete y otras
|
||
opciones específicas del @var{importador}. 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 @code{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, @code{--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.
|
||
|
||
La siguiente orden importa los meta-datos para el paquete de Python
|
||
@code{itsdangerous}:
|
||
|
||
@example
|
||
guix import pypi itsdangerous
|
||
@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
|
||
|
||
@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
|
||
@code{Acme::Boolean}:
|
||
|
||
@example
|
||
guix import cpan Acme::Boolean
|
||
@end example
|
||
|
||
@item cran
|
||
@cindex CRAN
|
||
@cindex Bioconductor
|
||
Importa metadatos desde @uref{https://cran.r-project.org/, CRAN}, el
|
||
repositorio central para el @uref{http://r-project.org, entorno estadístico
|
||
y gráfico GNU@tie{}R}.
|
||
|
||
La información se extrae del fichero @code{DESCRIPTION} del paquete.
|
||
|
||
La siguiente orden importa los metadatos del paquete de R @code{Cairo}:
|
||
|
||
@example
|
||
guix import cran Cairo
|
||
@end example
|
||
|
||
Cuando se añade @code{--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.
|
||
|
||
Cuando se agrega @code{--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 fichero @code{DESCRIPTION} del paquete
|
||
publicado en la interfaz web del repositorio SVN de Bioconductor.
|
||
|
||
La siguiente orden importa los metadatos del paquete de R
|
||
@code{GenomicRanges}:
|
||
|
||
@example
|
||
guix import cran --archive=bioconductor GenomicRanges
|
||
@end example
|
||
|
||
@item texlive
|
||
@cindex Tex Live
|
||
@cindex CTAN
|
||
Importa metadatos desde @uref{http://www.ctan.org/, CTAN}, la completa red
|
||
de archivos TeX para paquetes TeX que son parte de la
|
||
@uref{https://www.tug.org/texlive/, distribución TeX Live}.
|
||
|
||
La información del paquete se obtiene a través del API XML proporcionado por
|
||
CTAN, mientras que el código fuente se descarga del repositorio SVN del
|
||
proyecto TeX Live. Se hace porque CTAN no guarda archivos con versiones.
|
||
|
||
La siguiente orden importa los metadatos del paquete de TeX @code{fontspec}:
|
||
|
||
@example
|
||
guix import texlive fontspec
|
||
@end example
|
||
|
||
Cuando se añade @code{--archive=DIRECTORIO}, el código fuente no se descarga
|
||
del subdirectorio @file{latex} del árbol @file{texmf-dist/source} en el
|
||
repositorio SVN de Tex Live, sino de el directorio especificado bajo la
|
||
misma raíz.
|
||
|
||
La siguiente orden importa los metadatos del paquete @code{ifxetex} de CTAN
|
||
mientras que obtiene las fuentes del directorio @file{texmf/source/generic}:
|
||
|
||
@example
|
||
guix import texlive --archive=generic ifxetex
|
||
@end example
|
||
|
||
@item json
|
||
@cindex JSON, importación
|
||
Importa metadatos de paquetes desde un fichero 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": ["gcc@@6"]
|
||
@}
|
||
@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 fichero JSON
|
||
@code{hello.json} y devuelve una expresión de ``package'':
|
||
|
||
@example
|
||
guix import json hello.json
|
||
@end example
|
||
|
||
@item nix
|
||
Importa metadatos desde una copia local de las fuentes de la
|
||
@uref{http://nixos.org/nixpkgs/, distribución Nixpkgs}@footnote{Esto depende
|
||
de la orden @command{nix-instantiate} de @uref{http://nixos.org/nix/,
|
||
Nix}.}. Las definiciones de paquete en Nixpkgs típicamente están escritas en
|
||
una mezcla de lenguaje Nix y código Bash. Esta orden únicamente importa la
|
||
estructura de alto nivel del paquete escrita en lenguaje Nix. Normalmente
|
||
incluye todos los campos básicos de una definición de paquete.
|
||
|
||
Cuando se importa un paquete GNU, la sinopsis y la descripción se
|
||
substituyen por la variante canónica oficial.
|
||
|
||
Habitualmente, tendrá que ejecutar primero:
|
||
|
||
@example
|
||
export NIX_REMOTE=daemon
|
||
@end example
|
||
|
||
@noindent
|
||
de modo que @command{nix-instantiate} no intente abrir la base de datos Nix.
|
||
|
||
Como un ejemplo, la orden siguiente importa la definición de paquete de
|
||
LibreOffice (más precisamente, importa la definición del paquete asociado al
|
||
atributo de nivel superior @code{libreoffice}):
|
||
|
||
@example
|
||
guix import nix ~/path/to/nixpkgs libreoffice
|
||
@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 ficheros 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 fichero 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 @code{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 @code{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{http://elpa.gnu.org/packages, GNU}, seleccionado con el identificador
|
||
@code{gnu}. Es el predeterminado.
|
||
|
||
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{http://stable.melpa.org/packages, MELPA-Stable}, seleccionado con el
|
||
identificador @code{melpa-stable}.
|
||
|
||
@item
|
||
@uref{http://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}.
|
||
|
||
@item opam
|
||
@cindex OPAM
|
||
@cindex OCaml
|
||
Importa metadatos desde el repositorio de paquetes
|
||
@uref{https://opam.ocaml.org/, OPAM} usado por la comunidad OCaml.
|
||
@end table
|
||
|
||
La estructura del código de @command{guix import} es modular. Sería útil
|
||
tener más importadores para otros formatos de paquetes, y su ayuda es
|
||
bienvenida aquí (@pxref{Contribuir}).
|
||
|
||
@node Invocación de guix refresh
|
||
@section Invocación de @command{guix refresh}
|
||
|
||
@cindex @command{guix refresh}
|
||
La principal audiencia de @command{guix refresh} son desarrolladoras de la
|
||
distribución de software GNU. Por defecto, informa de cualquier paquete
|
||
proporcionado por la distribución que esté anticuado comparado con la última
|
||
versión oficial, de esta manera:
|
||
|
||
@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 contactarnos
|
||
para añadir un método nuevo!
|
||
|
||
@table @code
|
||
|
||
@item --recursive
|
||
Consider the packages specified, and all the packages upon which they
|
||
depend.
|
||
|
||
@example
|
||
$ guix refresh --recursive coreutils
|
||
gnu/packages/acl.scm:35:2: warning: no updater for acl
|
||
gnu/packages/m4.scm:30:12: info: 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: info: 6.1.2 is already the latest version of gmp
|
||
@dots{}
|
||
@end example
|
||
|
||
@end table
|
||
|
||
A veces el nombre oficial es diferente al nombre de paquete usado en Guix, y
|
||
@command{guix refresh} necesita un poco de ayuda. La mayor parte de los
|
||
actualizadores utilizan la propiedad @code{upstream-name} en las
|
||
definiciones de paquetes, que puede usarse para obtener dicho efecto:
|
||
|
||
@example
|
||
(define-public network-manager
|
||
(package
|
||
(name "network-manager")
|
||
;; @dots{}
|
||
(properties '((upstream-name . "NetworkManager")))))
|
||
@end example
|
||
|
||
Cuando se proporciona @code{--update}, modifica los ficheros de fuentes de
|
||
la distribución para actualizar los números de versión y hash de los
|
||
archivadores tar de fuentes en las recetas de los paquetes (@pxref{Definición de paquetes}). Esto se consigue con la descarga del último archivador de
|
||
fuentes del paquete y su firma OpenPGP asociada, seguida de la verificación
|
||
del archivador descargado y su firma mediante el uso de @command{gpg}, y
|
||
finalmente con el cálculo de su hash. Cuando la clave pública usada para
|
||
firmar el archivador no se encuentra en el anillo de claves de la usuaria,
|
||
se intenta automáticamente su obtención desde un servidor de claves
|
||
públicas; cuando se encuentra, la clave se añade al anillo de claves de la
|
||
usuaria; en otro caso, @command{guix refresh} informa de un error.
|
||
|
||
Se aceptan las siguientes opciones:
|
||
|
||
@table @code
|
||
|
||
@item --expression=@var{expr}
|
||
@itemx -e @var{expr}
|
||
Considera el paquete al que evalúa @var{expr}
|
||
|
||
Es útil para hacer una referencia precisa de un paquete concreto, como en
|
||
este ejemplo:
|
||
|
||
@example
|
||
guix refresh -l -e '(@@@@ (gnu packages commencement) glibc-final)'
|
||
@end example
|
||
|
||
Esta orden enumera los paquetes que dependen de la libc ``final''
|
||
(esencialmente todos los paquetes).
|
||
|
||
@item --update
|
||
@itemx -u
|
||
Actualiza los ficheros fuente de la distribución (recetas de paquetes) en su
|
||
lugar. Esto se ejecuta habitualmente desde una copia de trabajo del árbol de
|
||
fuentes de Guix (@pxref{Ejecución de Guix antes de estar instalado}):
|
||
|
||
@example
|
||
$ ./pre-inst-env guix refresh -s non-core -u
|
||
@end example
|
||
|
||
@xref{Definición de paquetes}, para más información sobre la definición de
|
||
paquetes.
|
||
|
||
@item --select=[@var{subconjunto}]
|
||
@itemx -s @var{subconjunto}
|
||
Selecciona todos los paquetes en @var{subconjunto}, o bien @code{core} o
|
||
bien @code{non-core}.
|
||
|
||
El subconjunto @code{core} hace referencia a todos los paquetes en el núcleo
|
||
de la distribución---es decir, paquetes que se usan para construir ``todo lo
|
||
demás''. Esto incluye GCC, libc, Binutils, Bash, etc. Habitualmente, cambiar
|
||
uno de esos paquetes en la distribución conlleva la reconstrucción de todos
|
||
los demás. Por tanto, esas actualizaciones son una inconveniencia para las
|
||
usuarias en términos de tiempo de construcción o ancho de banda usado por la
|
||
actualización.
|
||
|
||
El subconjunto @code{non-core} hace referencia a los paquetes restantes. Es
|
||
típicamente útil en casos donde una actualización de paquetes básicos no
|
||
sería conveniente.
|
||
|
||
@item --manifest=@var{fichero}
|
||
@itemx -m @var{fichero}
|
||
Selecciona todos los paquetes del manifiesto en @var{fichero}. Es útil para
|
||
comprobar si algún paquete del manifiesto puede actualizarse.
|
||
|
||
@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 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 elpa
|
||
el actualizador para paquetes @uref{http://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{http://www.cpan.org/, CPAN};
|
||
@item pypi
|
||
el actualizador para paquetes @uref{https://pypi.python.org, PyPI}.
|
||
@item gem
|
||
el actualizador para paquetes @uref{https://rubygems.org, RubyGems}.
|
||
@item github
|
||
el actualizador para paquetes @uref{https://github.com, GitHub}.
|
||
@item hackage
|
||
el actualizador para paquetes @uref{https://hackage.haskell.org, Hackage}.
|
||
@item stackage
|
||
el actualizador para paquetes @uref{https://www.stackage.org, Stackage}.
|
||
@item crate
|
||
el actualizador para paquetes @uref{https://crates.io, Crates}.
|
||
@item launchpad
|
||
el actualizador para paquetes @uref{https://launchpad.net, Launchpad}.
|
||
@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
|
||
|
||
@end table
|
||
|
||
Además, @command{guix refresh} puede recibir uno o más nombres de paquetes,
|
||
como en este ejemplo:
|
||
|
||
@example
|
||
$ ./pre-inst-env guix refresh -u emacs idutils gcc@@4.8
|
||
@end example
|
||
|
||
@noindent
|
||
La orden previa actualiza específicamente los paquetes @code{emacs} y
|
||
@code{idutils}. La opción @code{--select} no tendría efecto en este caso.
|
||
|
||
Cuando se considera la actualización de un paquete, a veces es conveniente
|
||
conocer cuantos paquetes se verían afectados por la actualización y su
|
||
compatibilidad debería comprobarse. Para ello la siguiente opción puede
|
||
usarse cuando se proporcionan uno o más nombres de paquete a @command{guix
|
||
refresh}:
|
||
|
||
@table @code
|
||
|
||
@item --list-updaters
|
||
@itemx -L
|
||
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.
|
||
|
||
@end table
|
||
|
||
Sea consciente de que la opción @code{--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 geiser@@0.4 notmuch@@0.18 mu@@0.9.9.5 cflow@@1.4 idutils@@4.6 @dots{}
|
||
@end example
|
||
|
||
La orden previa enumera un conjunto de paquetes que puede ser construido
|
||
para comprobar la compatibilidad con una versión actualizada del paquete
|
||
@code{flex}.
|
||
|
||
@table @code
|
||
|
||
@item --list-transitive
|
||
Enumera todos los paquetes de los que uno o más paquetes dependen.
|
||
|
||
@example
|
||
$ guix refresh --list-transitive flex
|
||
flex@@2.6.4 depends on the following 25 packages: perl@@5.28.0 help2man@@1.47.6
|
||
bison@@3.0.5 indent@@2.2.10 tar@@1.30 gzip@@1.9 bzip2@@1.0.6 xz@@5.2.4 file@@5.33 @dots{}
|
||
@end example
|
||
|
||
@end table
|
||
|
||
La orden previa enumera un conjunto de paquetes que, en caso de cambiar,
|
||
causarían la reconstrucción de @code{flex}.
|
||
|
||
Las siguientes opciones pueden usarse para personalizar la operación de
|
||
GnuPG:
|
||
|
||
@table @code
|
||
|
||
@item --gpg=@var{orden}
|
||
Use @var{orden} como la orden de GnuPG 2.x. Se busca @var{orden} en
|
||
@code{PATH}.
|
||
|
||
@item --keyring=@var{fichero}
|
||
Usa @var{fichero} como el anillo de claves para claves de
|
||
proveedoras. @var{fichero} debe estar en el @dfn{formato keybox}. Los
|
||
ficheros Keybox normalmente tienen un nombre terminado en @file{.kbx} y
|
||
GNU@tie{}Privacy Guard (GPG) puede manipular estos ficheros (@pxref{kbxutil,
|
||
@command{kbxutil},, gnupg, Using the GNU Privacy Guard}, para información
|
||
sobre una herramienta para manipular ficheros keybox).
|
||
|
||
Cuando se omite esta opción, @command{guix refresh} usa
|
||
@file{~/.config/guix/upstream/trustedkeys.kbx} como el anillo de claves para
|
||
las firmas de proveedoras. Las firmas OpenPGP son comprobadas contra claves
|
||
de este anillo; las claves que falten son descargadas a este anillo de
|
||
claves también (véase @option{--key-download} a continuación).
|
||
|
||
Puede exportar claves de su anillo de claves GPG predeterminado en un
|
||
fichero keybox usando órdenes como esta:
|
||
|
||
@example
|
||
gpg --export rms@@gnu.org | kbxutil --import-openpgp >> mianillo.kbx
|
||
@end example
|
||
|
||
Del mismo modo, puede obtener claves de un archivo keybox específico así:
|
||
|
||
@example
|
||
gpg --no-default-keyring --keyring mianillo.kbx \
|
||
--recv-keys @value{OPENPGP-SIGNING-KEY-ID}
|
||
@end example
|
||
|
||
@ref{GPG Configuration Options, @option{--keyring},, gnupg, Using the GNU
|
||
Privacy Guard}, para más información sobre la opción @option{--keyring} de
|
||
GPG.
|
||
|
||
@item --key-download=@var{política}
|
||
Maneja las claves no encontradas de acuerdo a la @var{política}, que puede
|
||
ser una de:
|
||
|
||
@table @code
|
||
@item always
|
||
Siempre descarga las claves OpenPGP no encontradas del servidor de claves, y
|
||
las añade al anillo de claves GnuPG de la usuaria.
|
||
|
||
@item never
|
||
Nunca intenta descargar claves OpenPGP no encontradas. Simplemente propaga
|
||
el error.
|
||
|
||
@item interactive
|
||
Cuando se encuentra un paquete firmado por una clave OpenPGP desconocida,
|
||
pregunta a la usuaria si descargarla o no. Este es el comportamiento
|
||
predeterminado.
|
||
@end table
|
||
|
||
@item --key-server=@var{dirección}
|
||
Use @var{dirección} como el servidor de claves OpenPGP cuando se importa una
|
||
clave pública.
|
||
|
||
@end table
|
||
|
||
The @code{github} updater uses the @uref{https://developer.github.com/v3/,
|
||
GitHub API} to query for new releases. When used repeatedly e.g.@: when
|
||
refreshing all packages, GitHub will eventually refuse to answer any further
|
||
API requests. By default 60 API requests per hour are allowed, and a full
|
||
refresh on all GitHub packages in Guix requires more than this.
|
||
Authentication with GitHub through the use of an API token alleviates these
|
||
limits. To use an API token, set the environment variable
|
||
@code{GUIX_GITHUB_TOKEN} to a token procured from
|
||
@uref{https://github.com/settings/tokens} or otherwise.
|
||
|
||
|
||
@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. Los @dfn{comprobadores}
|
||
disponibles incluyen (véase @code{--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
|
||
Comprueba las URL @code{home-page} y @code{source} e informa aquellas que no
|
||
sean válidas. Sugiere una URL @code{mirror://} cuando sea aplicable. Si la
|
||
URL @code{source} redirecciona a una URL GitHub, recomienda el uso de la URL
|
||
GitHub. Comprueba que el nombre de fichero de las fuentes es significativo,
|
||
por ejemplo que no es simplemente un número de versión o revisión git, sin
|
||
un nombre @code{file-name} declarado (@pxref{Referencia de ``origin''}).
|
||
|
||
@item source-unstable-tarball
|
||
Parse the @code{source} URL to determine if a tarball from GitHub is
|
||
autogenerated or if it is a release tarball. Unfortunately GitHub's
|
||
autogenerated tarballs are sometimes regenerated.
|
||
|
||
@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/download.cfm#CVE_FEED, 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 difieren del
|
||
nombre o versión que usa Guix, como en este ejemplo:
|
||
|
||
@example
|
||
(package
|
||
(name "grub")
|
||
;; @dots{}
|
||
;; CPE llama a este paquete "grub2".
|
||
(properties '((cpe-name . "grub2")
|
||
(cpe-version . "2.3")))
|
||
@end example
|
||
|
||
@c See <http://www.openwall.com/lists/oss-security/2017/03/15/3>.
|
||
Algunas entradas en la base de datos CVE no especifican a qué versión del
|
||
paquete hacen referencia, y por lo tanto ``permanecen visibles'' para
|
||
siempre. Las desarrolladoras de paquetes que encuentren alertas CVE y
|
||
verifiquen que pueden ignorarse, pueden declararlas como en este ejemplo:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@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.
|
||
@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 todos los comprobadores disponibles que se ejecutarán
|
||
sobre los paquetes y finaliza.
|
||
|
||
@item --checkers
|
||
@itemx -c
|
||
Habilita únicamente los comprobadores especificados en una lista separada
|
||
por comas que use los nombres devueltos por @code{--list-checkers}.
|
||
|
||
@end table
|
||
|
||
@node Invocación de guix size
|
||
@section Invocación de @command{guix size}
|
||
|
||
@cindex tamaño
|
||
@cindex tamaño del paquete
|
||
@cindex clausura
|
||
@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 fichero 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 clausura
|
||
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).
|
||
|
||
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.
|
||
|
||
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 clausura
|
||
el tamaño total de la clausura del elemento.
|
||
@end table
|
||
|
||
@item --map-file=@var{fichero}
|
||
Escribe un mapa gráfico del uso del disco en formato PNG en el
|
||
@var{fichero}.
|
||
|
||
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{http://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}.
|
||
|
||
@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
|
||
Los paquetes y sus dependencias forman un @dfn{grafo}, específicamente un
|
||
grafo acíclico dirigido (GAD, DAG en Inglés). Puede hacerse difícil
|
||
rápidamente tener un modelo mental del GAD del paquete, por lo que la orden
|
||
@command{guix graph} proporciona una representación virtual del GAD. Por
|
||
defecto, @command{guix graph} emite una representación en GAD en el formato
|
||
de entrada de @uref{http://graphviz.org/,Graphviz}, por lo que su salida
|
||
puede ser pasada directamente a la herramienta @command{dot} de
|
||
Graphviz. También puede emitir una página HTMP con código JavaScript
|
||
embebido para mostrar un ``diagrama de acorde'' en un navegador Web, usando
|
||
la biblioteca @uref{https://d3js.org/, d3.js}, o emitir consultas Cypher
|
||
para construir un grafo en una base de datos de grafos que acepte el
|
||
lenguaje de consultas @uref{http://www.opencypher.org/, openCypher}. La
|
||
sintaxis general es:
|
||
|
||
@example
|
||
guix graph @var{opciones} @var{paquete}@dots{}
|
||
@end example
|
||
|
||
Por ejemplo, la siguiente orden genera un fichero 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?
|
||
|
||
¡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, permitiendole 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
|
||
|
||
...@: yields the graph of packages that @emph{explicitly} depend on OCaml
|
||
(if you are also interested in cases where OCaml is an implicit dependency,
|
||
see @code{reverse-bag} below.)
|
||
|
||
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 | dot -Tpdf > gad.pdf
|
||
@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, fijese 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
|
||
This shows the @emph{reverse} DAG of packages. Unlike
|
||
@code{reverse-package}, it also takes implicit dependencies into account.
|
||
For example:
|
||
|
||
@example
|
||
guix graph -t reverse-bag dune
|
||
@end example
|
||
|
||
@noindent
|
||
...@: yields the graph of all packages that depend on Dune, directly or
|
||
indirectly. Since Dune is an @emph{implicit} dependency of many packages
|
||
@i{via} @code{dune-build-system}, this shows a large number of packages,
|
||
whereas @code{reverse-package} would show very few if any.
|
||
|
||
@item derivación
|
||
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 fichero
|
||
@file{.drv} en vez del nombre del paquete, como en:
|
||
|
||
@example
|
||
guix graph -t derivation `guix system build -d mi-configuracion.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 | dot -Tpdf > grafo-del-modulo.pdf
|
||
@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 fichero 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
|
||
|
||
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 --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.
|
||
@end table
|
||
|
||
|
||
|
||
@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}).
|
||
|
||
Cuando @command{guix publish} se ejecuta, lanza un servidor HTTP que permite
|
||
a cualquiera que tenga acceso a través de la red obtener sustituciones de
|
||
él. Esto significa que cualquier máquina que ejecute Guix puede actuar como
|
||
si fuese una granja de construcción, ya que la interfaz HTTP es compatible
|
||
con Hydra, el software detrás de la granja de construcción
|
||
@code{@value{SUBSTITUTE-SERVER}}.
|
||
|
||
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 @code{--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}).
|
||
|
||
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
|
||
|
||
Una vez el servidor de publicación ha sido autorizado (@pxref{Invocación de guix archive}), el daemon puede descargar sustituciones de él:
|
||
|
||
@example
|
||
guix-daemon --substitute-urls=http://example.org:8080
|
||
@end example
|
||
|
||
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 habilita 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 ficheros 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 fichero @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 ficheros 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
|
||
@code{--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{nivel}]
|
||
@itemx -C [@var{nivel}]
|
||
Comprime los datos con el @var{nivel} dado. Cuando el @var{nivel} es cero,
|
||
deshabilita 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.
|
||
|
||
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 un proxy 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.
|
||
|
||
@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á habilitada, 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}) devuelve 404 e
|
||
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.
|
||
|
||
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 --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{fichero}
|
||
@itemx --private-key=@var{fichero}
|
||
Usa los @var{fichero}s específicos como el par de claves pública y privada
|
||
usadas para firmar los elementos del almacén publicados.
|
||
|
||
Los ficheros 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
|
||
|
||
Habilitar @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 fichero en
|
||
@file{/gnu/store} es el hash de todas las entradas del proceso que construyó
|
||
el fichero o directorio---compiladores, bibliotecas, guiones de
|
||
construcción, etc. (@pxref{Introducción}). Asumiendo procesos de
|
||
construcción deterministas, un nombre de fichero 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} https://guix.example.org"
|
||
updating list of substitutes from 'https://@value{SUBSTITUTE-SERVER}'... 100.0%
|
||
updating list of substitutes from 'https://guix.example.org'... 100.0%
|
||
/gnu/store/@dots{}-openssl-1.0.2d contents differ:
|
||
local hash: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
|
||
https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
|
||
https://guix.example.org/nar/@dots{}-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
|
||
/gnu/store/@dots{}-git-2.5.0 contents differ:
|
||
local hash: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
|
||
https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
|
||
https://guix.example.org/nar/@dots{}-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
|
||
/gnu/store/@dots{}-pius-2.1.1 contents differ:
|
||
local hash: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
|
||
https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
|
||
https://guix.example.org/nar/@dots{}-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
|
||
|
||
@dots{}
|
||
|
||
6,406 store items were analyzed:
|
||
- 4,749 (74.1%) were identical
|
||
- 525 (8.2%) differed
|
||
- 1,132 (17.7%) were inconclusive
|
||
@end smallexample
|
||
|
||
@noindent
|
||
En este ejemplo, @command{guix challenge} primero recorre el almacén para
|
||
determinar el conjunto de derivaciones construidas localmente---en oposición
|
||
a elementos del almacén que fueron descargados de un servidor de
|
||
sustituciones---y consulta a todos los servidores de sustituciones. Una vez
|
||
hecho informa de los elementos del almacén para los cuales los servidores
|
||
obtuvieron un resultado diferente de el obtenido en la construcción local.
|
||
|
||
@cindex no-determinismo, en la construcción de paquetes
|
||
Como un ejemplo, @code{guix.example.org} siempre obtiene una respuesta
|
||
diferente. Por otro modo, @code{@value{SUBSTITUTE-SERVER}} coincide con las
|
||
construcciones locales, excepto en el caso de Git. Esto puede indicar que el
|
||
proceso de construcción de Git no es determinista, lo que significa que su
|
||
salida varia en función de varias cosas que Guix no controla completamente,
|
||
aunque la construcción de paquetes se realice en entornos aislados
|
||
(@pxref{Características}). Las fuentes más comunes de indeterminismo incluyen la
|
||
adición de marcas de tiempo en los resultados de la construcción, la
|
||
inclusión de números aleatorios y las enumeraciones de directorios ordenadas
|
||
por número de nodos-i. Véase @uref{https://reproducible-builds.org/docs/}
|
||
para más información.
|
||
|
||
Para encontrar cuál es el problema con este binario Git, podemos hacer algo
|
||
parecido a esto (@pxref{Invocación de guix archive}):
|
||
|
||
@example
|
||
$ wget -q -O - https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-git-2.5.0 \
|
||
| guix archive -x /tmp/git
|
||
$ diff -ur --no-dereference /gnu/store/@dots{}-git.2.5.0 /tmp/git
|
||
@end example
|
||
|
||
Esta orden muestra la diferencia entre los ficheros resultantes de la
|
||
construcción local y los ficheros resultantes de la construcción en
|
||
@code{@value{SUBSTITUTE-SERVER}} (@pxref{Overview, Comparing and Merging
|
||
Files,, diffutils, Comparing and Merging Files}). La orden @command{diff}
|
||
funciona muy bien en ficheros de texto. Cuando ficheros binarios difieren,
|
||
una opción mejor es @uref{https://diffoscope.org/,Diffoscope}, una
|
||
herramienta que ayuda en la visualización de diferencias en todo tipo de
|
||
ficheros.
|
||
|
||
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.
|
||
|
||
Si esta escribiendo paquetes para Guix, le recomendamos que compruebe si
|
||
@code{@value{SUBSTITUTE-SERVER}} y otros servidores de sustituciones
|
||
obtienen el mismo resultado de construcción que el obtenido por usted:
|
||
|
||
@example
|
||
$ guix challenge @var{paquete}
|
||
@end example
|
||
|
||
@noindent
|
||
donde @var{paquete} es una especificación de paquete como @code{guile@@2.0}
|
||
o @code{glibc:debug}.
|
||
|
||
La sintaxis general es:
|
||
|
||
@example
|
||
guix challenge @var{opciones} [@var{paquetes}@dots{}]
|
||
@end example
|
||
|
||
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 valor de salida es 2 (otros valores no-cero de la
|
||
salida 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 --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 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{usuaria}@@@var{dirección} \
|
||
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
|
||
|
||
El propósito de @command{guix container} es la manipulación de procesos en
|
||
ejecución dentro de entornos aislados, normalmente conocido como un
|
||
``contenedor'', típicamente creado por las órdenes @command{guix
|
||
environment} (@pxref{Invocación de guix environment}) y @command{guix system
|
||
container} (@pxref{Invocación de guix system}).
|
||
|
||
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 fichero ejecutable dentro
|
||
del sistema de ficheros 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}
|
||
|
||
De manera ocasional tendrá un mal día al no estar las sustituciones
|
||
disponibles y le toque construir los paquetes a usted misma
|
||
(@pxref{Sustituciones}). La orden @command{guix weather} informa de la
|
||
disponibilidad de sustituciones en los servidores especificados de modo que
|
||
pueda tener una idea sobre cómo será su día hoy. A veces puede ser una
|
||
información útil como usuaria, pero es principalmente útil para quienes
|
||
ejecuten @command{guix publish} (@pxref{Invocación de guix publish}).
|
||
|
||
@cindex estadísticas, para sustituciones
|
||
@cindex disponibilidad de sustituciones
|
||
@cindex disponibilidad de sustituciones
|
||
@cindex weather, disponibilidad de sustituciones
|
||
Esta es una ejecución de ejemplo:
|
||
|
||
@example
|
||
$ guix weather --substitute-urls=https://guix.example.org
|
||
computing 5,872 package derivations for x86_64-linux...
|
||
looking for 6,128 store items on https://guix.example.org..
|
||
updating list of 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
|
||
As you can see, it reports the fraction of all the packages for which
|
||
substitutes are available on the server---regardless of whether substitutes
|
||
are enabled, and regardless of whether this server's signing key is
|
||
authorized. It also reports the size of the compressed archives (``nars'')
|
||
provided by the server, the size the corresponding store items occupy in the
|
||
store (assuming deduplication is turned off), and the server's throughput.
|
||
The second part gives continuous integration (CI) statistics, if the server
|
||
supports it. In addition, using the @option{--coverage} option,
|
||
@command{guix weather} can list ``important'' package substitutes missing on
|
||
the server (see below).
|
||
|
||
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.
|
||
|
||
Entre otras cosas, es posible consultar tipos específicos de sistema y
|
||
conjuntos específicos de paquetes. Las opciones disponibles se enumeran a
|
||
continuación.
|
||
|
||
@table @code
|
||
@item --substitute-urls=@var{urls}
|
||
@var{urls} es la lista separada por espacios de URL de servidores de
|
||
sustituciones a consultar. Cuando se omite esta opción, el conjunto
|
||
predeterminado de servidores de sustituciones es el consultado.
|
||
|
||
@item --system=@var{sistema}
|
||
@itemx -s @var{sistema}
|
||
Consulta sustituciones para @var{sistema}---por ejemplo,
|
||
@code{aarch64-linux}. Esta opción se puede repetir, en cuyo caso
|
||
@command{guix weather} consultará las sustituciones para varios tipos de
|
||
sistema.
|
||
|
||
@item --manifest=@var{fichero}
|
||
En vez de consultar las sustituciones de todos los paquetes, consulta
|
||
únicamente los especificados en @var{fichero}. @var{fichero} debe contener
|
||
un @dfn{manifiesto}, como el usado en la opción @code{-m} de @command{guix
|
||
package} (@pxref{Invocación de guix package}).
|
||
|
||
@item --coverage[=@var{numero}]
|
||
@itemx -c [@var{numero}]
|
||
Report on substitute coverage for packages: list packages with at least
|
||
@var{count} dependents (zero by default) for which substitutes are
|
||
unavailable. Dependent packages themselves are not listed: if @var{b}
|
||
depends on @var{a} and @var{a} has no substitutes, only @var{a} is listed,
|
||
even though @var{b} usually lacks substitutes as well. The result looks
|
||
like this:
|
||
|
||
@example
|
||
$ guix weather --substitute-urls=https://ci.guix.es.info -c 10
|
||
computing 8,983 package derivations for x86_64-linux...
|
||
looking for 9,343 store items on https://ci.guix.es.info...
|
||
updating substitutes from 'https://ci.guix.es.info'... 100.0%
|
||
https://ci.guix.es.info
|
||
64.7% substitutes available (6,047 out of 9,343)
|
||
@dots{}
|
||
2502 packages are missing from 'https://ci.guix.es.info' 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{ci.guix.es.info};
|
||
likewise for @code{qgpgme} and the 46 packages that depend on it.
|
||
|
||
If you are a Guix developer, or if you are taking care of this build farm,
|
||
you'll probably want to have a closer look at these packages: they may
|
||
simply fail to build.
|
||
@end table
|
||
|
||
@node Invocación de guix processes
|
||
@section Invocación de @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 environment --ad-hoc 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
|
||
ChildProcess: 20495: guix offload x86_64-linux 7200 1 28800
|
||
ChildProcess: 27733: guix offload x86_64-linux 7200 1 28800
|
||
ChildProcess: 27793: guix offload x86_64-linux 7200 1 28800
|
||
@end example
|
||
|
||
En este ejemplo vemos que @command{guix-daemon} tiene tres clientes:
|
||
@command{guix environment}, @command{guix publish} y la herramienta de
|
||
integración continua Cuirass; sus identificadores de proceso (PID) se
|
||
muestran en el campo @code{ClientPID}. El campo @code{SessionPID}
|
||
proporciona el PID del subproceso de @command{guix-daemon} de cada sesión en
|
||
particular.
|
||
|
||
El campo @code{LockHeld} muestra qué elementos del almacén están bloqueados
|
||
actualmente por cada sesión, lo que corresponde a elementos del almacén en
|
||
construcción o sustitución (el campo @code{LockHeld} no se muestra cuando
|
||
@command{guix processes} no se ejecutó como root). Por último, mediante el
|
||
campo @code{ChildProcess} entendemos que esas tres construcciones están
|
||
siendo delegadas (@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
|
||
|
||
|
||
@node Configuración del sistema
|
||
@chapter Configuración del sistema
|
||
|
||
@cindex configuración del sistema
|
||
La Distribución de Sistema Guix permite un mecanismo de configuración del
|
||
sistema completo consistente. Con esto queremos decir que todos los aspectos
|
||
de la configuración global del sistema---como los servicios disponibles, la
|
||
zona horaria y la configuración de localización, las cuentas de
|
||
usuarias---se declaran en un lugar único. Dicha @dfn{configuración del
|
||
sistema} puede ser @dfn{instanciada}---es decir, hecha efectiva.
|
||
|
||
@c Yes, we're talking of Puppet, Chef, & co. here. ↑
|
||
Una de las ventajas de poner toda la configuración del sistema bajo el
|
||
control de Guix es que permite actualizaciones transaccionales del sistema,
|
||
y hace posible volver a una instanciación previa del sistema, en caso de que
|
||
haya algún problema con la nueva (@pxref{Características}). Otra ventaja es que
|
||
hace fácil replicar exactamente la misma configuración entre máquinas
|
||
diferentes, o en diferentes momentos, sin tener que utilizar herramientas de
|
||
administración adicionales sobre las propias herramientas del sistema.
|
||
|
||
Esta sección describe este mecanismo. Primero nos enfocaremos en el punto de
|
||
vista de la administradora del sistema---explicando cómo se configura e
|
||
instancia el sistema. Después mostraremos cómo puede extenderse este
|
||
mecanismo, por ejemplo para añadir nuevos servicios del sistema.
|
||
|
||
@menu
|
||
* Uso de la configuración del sistema:: Personalizar su sistema GNU.
|
||
* Referencia de ``operating-system'':: Detalle de las declaraciones de
|
||
sistema operativo.
|
||
* Sistemas de ficheros:: Configurar el montaje de sistemas de ficheros.
|
||
* Dispositivos traducidos:: Procesamiento extra de dispositivos de bloques.
|
||
* Cuentas de usuaria:: Especificar las cuentas de usuaria.
|
||
* Distribución de teclado:: Cómo interpreta el sistema las pulsaciones
|
||
del teclado.
|
||
* Localizaciones:: Configuración de idioma y convenciones
|
||
culturales.
|
||
* Servicios:: Especificar los servicios del sistema.
|
||
* Programas con setuid:: Programas que se ejecutan con privilegios de
|
||
root.
|
||
* 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.
|
||
* Ejecutar Guix en una máquina virtual:: Cómo ejecutar el sistema Guix en
|
||
una máquina virtual.
|
||
* Definición de servicios:: Añadir nuevas definiciones de servicios.
|
||
@end menu
|
||
|
||
@node Uso de la configuración del sistema
|
||
@section Uso de la configuración del sistema
|
||
|
||
El sistema operativo se configura proporcionando una declaración
|
||
@code{operating-system} en un fichero que pueda ser proporcionado a la orden
|
||
@command{guix system} (@pxref{Invocación de guix system}). Una configuración
|
||
simple, con los servicios predeterminados del sistema, el núcleo Linux-Libre
|
||
predeterminado, un disco de RAM inicial y un cargador de arranque puede ser
|
||
como sigue:
|
||
|
||
@findex operating-system
|
||
@lisp
|
||
@include os-config-bare-bones.texi
|
||
@end lisp
|
||
|
||
Este ejemplo debería ser auto-descriptivo. Algunos de los campos definidos
|
||
anteriormente, como @code{host-name} y @code{bootloader}, son
|
||
necesarios. Otros como @code{packages} y @code{services}, pueden omitirse,
|
||
en cuyo caso obtienen un valor por defecto.
|
||
|
||
Más adelante se muestran los efectos de algunos de los campos más
|
||
importantes (@pxref{Referencia de ``operating-system''}, para detalles acerca de
|
||
todos los campos disponibles), y cómo @dfn{instanciar} el sistema operativo
|
||
usando @command{guix system}.
|
||
|
||
@unnumberedsubsec Cargador de arranque
|
||
|
||
@cindex arranque obsoleto, en máquinas Intel
|
||
@cindex arranque por BIOS, en máquinas Intel
|
||
@cindex arranque UEFI
|
||
@cindex arranque EFI
|
||
El campo @code{bootloader} describe el método que será usado para arrancar
|
||
su sistema. Las máquinas basadas en procesadores Intel pueden arrancar en el
|
||
``obsoleto'' modo BIOS, como en el ejemplo previo. No obstante, máquinas más
|
||
recientes usan la @dfn{Interfaz Unificada Extensible de Firmware} (UEFI)
|
||
para arrancar. En ese caso, el capo @code{bootloader} debe contener algo
|
||
parecido a esto:
|
||
|
||
@example
|
||
(bootloader-configuration
|
||
(bootloader grub-efi-bootloader)
|
||
(target "/boot/efi"))
|
||
@end example
|
||
|
||
@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 @code{PATH} de cada usuaria---además de los perfiles por usuaria
|
||
(@pxref{Invocación de guix package}). La variable @var{%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 GNU Zile, @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 package output)} 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 bind "utils")
|
||
%base-packages)))
|
||
@end lisp
|
||
|
||
@findex specification->package
|
||
Referirse a los paquetes por nombre de variable, como antes a @code{bind},
|
||
tiene la ventaja de evitar ambigüedades; también permite que errores
|
||
tipográficos y demás obtengan un diagnóstico directo como ``variables sin
|
||
definir''. La parte problemática es que se necesita conocer qué módulo
|
||
define qué paquete, y aumentar adecuadamente la línea de
|
||
@code{use-package-modules}. Para evitar esto, se puede usar el procedimiento
|
||
@code{specification->package} del módulo @code{(gnu packages)}, que devuelve
|
||
el mejor paquete para un nombre dado, o nombre y versión:
|
||
|
||
@lisp
|
||
(use-modules (gnu packages))
|
||
|
||
(operating-system
|
||
;; ...
|
||
(packages (append (map specification->package
|
||
'("tcpdump" "htop" "gnupg@@2.0"))
|
||
%base-packages)))
|
||
@end lisp
|
||
|
||
@unnumberedsubsec Servicios del sistema
|
||
|
||
@cindex services
|
||
@vindex %base-services
|
||
The @code{services} field lists @dfn{system services} to be made available
|
||
when the system starts (@pxref{Servicios}). The @code{operating-system}
|
||
declaration above specifies that, in addition to the basic services, we want
|
||
the OpenSSH secure shell daemon listening on port 2222 (@pxref{Servicios de red, @code{openssh-service-type}}). Under the hood,
|
||
@code{openssh-service-type} arranges so that @command{sshd} is started with
|
||
the right command-line options, possibly with supporting configuration files
|
||
generated as needed (@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.
|
||
|
||
Por ejemplo, supongamos que quiere modificar @code{guix-daemon} y Mingetty
|
||
(el punto de acceso al sistema por consola) en la lista @var{%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)
|
||
(use-substitutes? #f)
|
||
(extra-options '("--gc-keep-derivations"))))
|
||
(mingetty-service-type config =>
|
||
(mingetty-configuration
|
||
(inherit config)))))
|
||
|
||
(operating-system
|
||
;; @dots{}
|
||
(services %mis-servicios))
|
||
@end lisp
|
||
|
||
Esto modifica la configuración---es decir, los parámetros de los
|
||
servicios---de la instancia @code{guix-service-type}, y de todas las
|
||
instancias de @code{mingetty-service-type} en la lista
|
||
@var{%base-services}. Observe cómo se consigue: primero, enlazamos la
|
||
configuración actual al identificador @code{config} en el @var{cuerpo}, y
|
||
entonces escribimos el @var{cuerpo} de manera que evalue a la configuración
|
||
deseada. En particular, fíjese como se usa @code{inherit} para crear una
|
||
nueva configuración que tiene los mismos valores que la configuración
|
||
antigua, pero con unas pocas modificaciones.
|
||
|
||
@cindex disco cifrado
|
||
La configuración para un uso típico de ``escritorio'', con una partición de
|
||
raíz cifrada, el servidor gráfico X11, GNOME y Xfce (las usuarias pueden
|
||
escoger cual de estos entornos de escritorio usarán en la pantalla de inicio
|
||
de sesión pulsando @kbd{F1}), gestión de red, gestión de energía y más,
|
||
podría ser así:
|
||
|
||
@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 ficheros @file{/boot/efi} por su UUID
|
||
@code{1234-ABCD}. Substituya este UUID con el UUID correcto en su sistema,
|
||
como el devuelto por la orden @command{blkid}.
|
||
|
||
@xref{Servicios de escritorio}, para la lista exacta de servicios proporcionados
|
||
por @var{%desktop-services}. @xref{Certificados X.509}, para información
|
||
sobre el paquete @code{nss-certs} usado aquí.
|
||
|
||
De nuevo, @var{%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
|
||
@var{%desktop-services} excepto el servicio Avahi:
|
||
|
||
@example
|
||
(remove (lambda (service)
|
||
(eq? (service-kind service) avahi-service-type))
|
||
%desktop-services)
|
||
@end example
|
||
|
||
@unnumberedsubsec Instanciación del sistema
|
||
|
||
Asumiendo que la declaración de @code{operating-system} se encuentra en el
|
||
fichero @file{my-conf-del-sistema.scm}, la orden @command{guix system
|
||
mi-conf-del-sistema.scm} instancia esa configuración, y la convierte en la
|
||
entrada predeterminada de GRUB en el arranque (@pxref{Invocación de guix system}).
|
||
|
||
La manera habitual de cambiar la configuración del sistema es actualizar
|
||
este fichero y volver a ejecutar @command{guix system reconfigure}. Nunca se
|
||
deberían tocar los ficheros en @file{/etc} o ejecutar órdenes que modifiquen
|
||
el estado del sistema como @command{useradd} o @command{grub-install}. De
|
||
hecho, debe evitarlo ya que no únicamente anularía su garantía sino que
|
||
también le impediría volver a una versión previa de su sistema, en caso de
|
||
necesitarlo.
|
||
|
||
@cindex vuelta-atrás, del sistema operativo
|
||
Hablando de vuelta atrás, cada vez que ejecuta @command{guix system
|
||
reconfigure} se crea una nueva @dfn{generación} del sistema---sin modificar
|
||
o borrar generaciones previas. Las generaciones previas tienen una entrada
|
||
en el menú del cargador de arranque, permitiendole arrancarlas en caso de
|
||
que algo funcionase mal en las últimas generaciones. Tranquilizador, ¿no? La
|
||
orden @command{guix system list-generations} enumera las generaciones del
|
||
sistema disponibles en el disco. Es también posible volver a una versión
|
||
previa con las órdenes @command{guix system roll-back} y @command{guix
|
||
system switch-generation}.
|
||
|
||
Aunque la orden @command{guix system reconfigure} no modificará las
|
||
generaciones previas, debe tener cuidado cuando la generación actual no es
|
||
la última (por ejemplo, después de invocar @command{guix system roll-back}),
|
||
ya que la operación puede sobreescribir una generación posterior
|
||
(@pxref{Invocación de guix system}).
|
||
|
||
@unnumberedsubsec La interfaz programática
|
||
|
||
A nivel Scheme, el grueso de una declaración @code{operating-system} se
|
||
instancia con el siguiente procedimiento monádico (@pxref{La mónada del almacén}):
|
||
|
||
@deffn {Procedimiento monádico} operating-system-derivation so
|
||
Devuelve una derivación que construye @var{so}, un objeto
|
||
@code{operating-system} (@pxref{Derivaciones}).
|
||
|
||
La salida de la derivación es un único directorio que hace referencia a
|
||
todos los paquetes, ficheros de configuración y otros ficheros auxiliares
|
||
necesarios para instanciar @var{so}.
|
||
@end deffn
|
||
|
||
This procedure is provided by the @code{(gnu system)} module. Along with
|
||
@code{(gnu services)} (@pxref{Servicios}), this module contains the guts of
|
||
Guix System. Make sure to visit it!
|
||
|
||
|
||
@node Referencia de ``operating-system''
|
||
@section Referencia de @code{operating-system}
|
||
|
||
Esta sección resume todas las opciones disponibles en las declaraciones de
|
||
@code{operating-system} (@pxref{Uso de la configuración del sistema}).
|
||
|
||
@deftp {Tipo de datos} operating-system
|
||
Este es el tipo de datos que representa la configuración del sistema
|
||
operativo. Con ello queremos decir toda la configuración global del sistema,
|
||
no la configuración específica de las usuarias (@pxref{Uso de la configuración del sistema}).
|
||
|
||
@table @asis
|
||
@item @code{kernel} (predeterminado: @code{linux-libre})
|
||
El objeto del paquete del núcleo del sistema operativo
|
||
usado@footnote{Actualmente únicamente está disponible el núcleo
|
||
Linux-libre. En el futuro será posible usar GNU@tie{}Hurd.}.
|
||
|
||
@item @code{kernel-arguments} (default: @code{'("quiet")})
|
||
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}
|
||
This is the label (a string) as it appears in the bootloader's menu entry.
|
||
The default label includes the kernel name and version.
|
||
|
||
@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.
|
||
|
||
This keyboard layout is in effect as soon as the kernel has booted. For
|
||
instance, it is the keyboard layout in effect when you type a passphrase if
|
||
your root file system is on a @code{luks-device-mapping} mapped device
|
||
(@pxref{Dispositivos traducidos}).
|
||
|
||
@quotation Nota
|
||
This does @emph{not} specify the keyboard layout used by the bootloader, nor
|
||
that used by the graphical display server. @xref{Configuración del gestor de arranque},
|
||
for information on how to specify the bootloader's keyboard layout. @xref{Sistema X Window}, for information on how to specify the keyboard layout used by the X
|
||
Window System.
|
||
@end quotation
|
||
|
||
@item @code{initrd-modules} (predeterminados: @code{%base-initrd-modules})
|
||
@cindex initrd
|
||
@cindex disco inicial de RAM
|
||
La lista de módulos del núcleo Linux que deben estar disponibles en el disco
|
||
inicial de RAM. @xref{Disco en RAM inicial}.
|
||
|
||
@item @code{initrd} (predeterminado: @code{base-initrd})
|
||
Un procedimiento que devuelve un disco inicial de RAM para el núcleo
|
||
Linux. Este campo se proporciona para permitir personalizaciones de bajo
|
||
nivel y no debería ser necesario para un uso habitual. @xref{Disco en RAM inicial}.
|
||
|
||
@item @code{firmware} (predeterminado: @code{%base-firmware})
|
||
@cindex firmware
|
||
Lista de paquetes de firmware que pueden ser cargados por el núcleo del
|
||
sistema operativo.
|
||
|
||
El valor predeterminado incluye el firmware necesario para dispositivos WiFi
|
||
basados en Atheros y Broadcom (módulos Linux-libre @code{ath9k} y
|
||
@code{b43-open}, respectivamente). @xref{Consideraciones sobre el hardware}, para más
|
||
información sobre hardware soportado.
|
||
|
||
@item @code{host-name}
|
||
El nombre de la máquina.
|
||
|
||
@item @code{hosts-file}
|
||
@cindex el fichero hosts
|
||
Un objeto tipo-fichero (@pxref{Expresiones-G, objetos tipo-fichero}) para
|
||
ser usado como @file{/etc/hosts} (@pxref{Host Names,,, libc, The GNU C
|
||
Library Reference Manual}). El predeterminado es un fichero con entradas
|
||
para @code{localhost} y @var{host-name}.
|
||
|
||
@item @code{mapped-devices} (predeterminados: @code{'()})
|
||
Una lista de dispositivos traducidos. @xref{Dispositivos traducidos}.
|
||
|
||
@item @code{file-systems}
|
||
Una lista de sistemas de ficheros. @xref{Sistemas de ficheros}.
|
||
|
||
@item @code{swap-devices} (predeterminados: @code{'()})
|
||
@cindex dispositivos de intercambio
|
||
Una lista de cadenas que identifiquen dispositivos o ficheros a usar como
|
||
``espacio de intercambio'' (@pxref{Memory Concepts,,, libc, The GNU C
|
||
Library Reference Manual}). Por ejemplo @code{'("/dev/sda3")} o
|
||
@code{'("/fichero-intercambio")}. Es posible especificar un fichero de
|
||
intercambio en un sistema de ficheros en un dispositivo traducido, siempre
|
||
que la traducción y el sistema de ficheros se especifiquen
|
||
también. @xref{Dispositivos traducidos} y @ref{Sistemas de ficheros}.
|
||
|
||
@item @code{users} (predeterminadas: @code{%base-user-accounts})
|
||
@itemx @code{groups} (predeterminados: @var{%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 fichero de destino/objeto tipo-fichero
|
||
(@pxref{Expresiones-G, objetos tipo-fichero}). Estos son los ficheros 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í:
|
||
|
||
@example
|
||
`((".bashrc" ,(plain-file "bashrc" "echo Hola\n"))
|
||
(".guile" ,(plain-file "guile"
|
||
"(use-modules (ice-9 readline))
|
||
(activate-readline)")))
|
||
@end example
|
||
|
||
@item @code{issue} (predeterminado: @var{%default-issue})
|
||
Una cadena que denota el contenido del fichero @file{/etc/issue}, que se
|
||
muestra cuando las usuarias ingresan al sistema en una consola de texto.
|
||
|
||
@item @code{packages} (predeterminados: @var{%base-packages})
|
||
El conjunto de paquetes instalados en el perfil global, que es accesible en
|
||
@file{/run/current-system/profile}.
|
||
|
||
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}
|
||
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: @var{%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: @var{%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 considera
|
||
Una lista de objetos service denotando los servicios del
|
||
sistema. @xref{Servicios}.
|
||
|
||
@cindex servicios esenciales
|
||
@item @code{essential-services} (predeterminados: ...)
|
||
The list of ``essential services''---i.e., things like instances of
|
||
@code{system-service-type} and @code{host-name-service-type} (@pxref{Referencia de servicios}), 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 verificación conectables
|
||
@c FIXME: Add xref to PAM services section.
|
||
Servicios de los @dfn{módulos de verificación conectables} (PAM) de Linux.
|
||
|
||
@item @code{setuid-programs} (predeterminados: @var{%setuid-programs})
|
||
Lista de expresiones-G con valores de cadena que denotan los programas
|
||
setuid. @xref{Programas con setuid}.
|
||
|
||
@item @code{sudoers-file} (predeterminado: @var{%sudoers-specification})
|
||
@cindex fichero sudoers
|
||
El contenido de @file{/etc/sudoers} como un objeto tipo-fichero
|
||
(@pxref{Expresiones-G, @code{local-file} y @code{plain-file}}).
|
||
|
||
Este fichero especifica qué usuarias pueden usar la orden @command{sudo}, lo
|
||
que se les permite hacer y qué privilegios pueden obtener. El comportamiento
|
||
predefinido es que únicamente @code{root} y los miembros del grupo
|
||
@code{wheel} pueden usar @code{sudo}.
|
||
|
||
@end table
|
||
|
||
@deffn {Scheme Syntax} this-operating-system
|
||
When used in the @emph{lexical scope} of an operating system field
|
||
definition, this identifier resolves to the operating system being defined.
|
||
|
||
The example below shows how to refer to the operating system being defined
|
||
in the definition of the @code{label} field:
|
||
|
||
@example
|
||
(use-modules (gnu) (guix))
|
||
|
||
(operating-system
|
||
;; ...
|
||
(label (package-full-name
|
||
(operating-system-kernel this-operating-system))))
|
||
@end example
|
||
|
||
It is an error to refer to @code{this-operating-system} outside an operating
|
||
system definition.
|
||
@end deffn
|
||
|
||
@end deftp
|
||
|
||
@node Sistemas de ficheros
|
||
@section Sistemas de ficheros
|
||
|
||
La lista de sistemas de ficheros 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 ficheros se
|
||
declara usando la forma @code{file-system}, como en el siguiente ejemplo:
|
||
|
||
@example
|
||
(file-system
|
||
(mount-point "/home")
|
||
(device "/dev/sda3")
|
||
(type "ext4"))
|
||
@end example
|
||
|
||
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 ficheros a
|
||
montar. Contienen los siguientes campos:
|
||
|
||
@table @asis
|
||
@item @code{type}
|
||
Este campo es una cadena que especifica el tipo de sistema de ficheros---por
|
||
ejemplo, @code{"ext4"}.
|
||
|
||
@item @code{mount-point}
|
||
Designa la ruta donde el sistema de ficheros debe montarse.
|
||
|
||
@item @code{device}
|
||
Nombra la ``fuente'' del sistema de ficheros. Puede ser una de estas tres
|
||
opciones: una etiqueta de sistema de ficheros, un UUID de sistema de
|
||
ficheros o el nombre de un nodo @file{/dev}. Las etiquetas y UUID ofrecen
|
||
una forma de hacer referencia a sistemas de ficheros sin codificar su nombre
|
||
de dispositivo actual@footnote{Fijese 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 ficheros 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 ficheros al que se hace referencia
|
||
mediante su etiqueta, como es mostrada por la orden @command{e2label}:
|
||
|
||
@example
|
||
(file-system
|
||
(mount-point "/home")
|
||
(type "ext4")
|
||
(device (file-system-label "mi-home")))
|
||
@end example
|
||
|
||
@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 ficheros ext2 y
|
||
otros, pero es diferente de los ``UUID'' de los sistemas de ficheros FAT,
|
||
por ejemplo.}, como sigue:
|
||
|
||
@example
|
||
(file-system
|
||
(mount-point "/home")
|
||
(type "ext4")
|
||
(device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
|
||
@end example
|
||
|
||
Cuando la fuente de un sistema de ficheros 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 ficheros depende del establecimiento de
|
||
la traducción de dispositivos correspondiente.
|
||
|
||
@item @code{flags} (predeterminadas: @code{'()})
|
||
Una lista de símbolos que denotan opciones del montaje. Las opciones
|
||
reconocidas incluyen @code{read-only} (modo de sólo lectura),
|
||
@code{bind-mount} (montaje enlazado), @code{no-dev} (prohibición del acceso
|
||
a ficheros especiales), @code{no-suid} (ignora los bits setuid y setgid) y
|
||
@code{no-exec} (prohibición de la ejecución de programas).
|
||
|
||
@item @code{options} (predeterminadas: @code{#f})
|
||
Esto es o bien @code{#f}, o bien una cadena que contiene opciones de
|
||
montaje.
|
||
|
||
@item @code{mount?} (predeterminado: @code{#t})
|
||
Este valor indica si debe montarse el sistema de ficheros automáticamente al
|
||
iniciar el sistema. Cuando se establece como @code{#f}, el sistema de
|
||
ficheros 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 ficheros es necesario para el
|
||
arranque. Si es verdadero, el sistema de ficheros se monta al cargar el
|
||
disco inicial de RAM (initrd). Este es siempre el caso, por ejemplo, para el
|
||
sistema de ficheros raíz.
|
||
|
||
@item @code{check?} (predeterminado: @code{#t})
|
||
Este valor lógico indica si el sistema de ficheros se debe comprobar en
|
||
busca de errores antes de montarse.
|
||
|
||
@item @code{create-mount-point?} (predeterminado: @code{#f})
|
||
Cuando es verdadero, el punto de montaje es creado si no existía
|
||
previamente.
|
||
|
||
@item @code{dependencies} (predeterminadas: @code{'()})
|
||
Una lista de objetos @code{<file-system>} o @code{<mapped-device>} que
|
||
representan sistemas de ficheros que deben montarse o dispositivos
|
||
traducidos que deben abrirse antes (y desmontarse o cerrarse 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 ficheros que depende de un dispositivo
|
||
traducido, por ejemplo una partición cifrada (@pxref{Dispositivos traducidos}).
|
||
@end table
|
||
@end deftp
|
||
|
||
El módulo @code{(gnu system file-systems)} exporta las siguientes variables
|
||
útiles.
|
||
|
||
@defvr {Variable Scheme} %base-file-systems
|
||
Estos son los sistemas de ficheros esenciales que se necesitan en sistemas
|
||
normales, como @var{%pseudo-terminal-file-system} y @var{%immutable-store}
|
||
(véase a continuación). Las declaraciones de sistemas operativos deben
|
||
contener siempre estos al menos.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %pseudo-terminal-file-systems
|
||
El sistema de ficheros que debe montarse como @file{/dev/pts}. Permite la
|
||
creación de @dfn{pseudoterminales} a través de @code{openpty} y funciones
|
||
similares (@pxref{Pseudo-Terminals,,, libc, The GNU C Library Reference
|
||
Manual}). Los pseudoterminales son usados por emuladores de terminales como
|
||
@command{xterm}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %shared-memory-file-system
|
||
Este sistema de ficheros se monta como @file{/dev/shm} y se usa para
|
||
permitir el uso de memoria compartida entre procesos (@pxref{Memory-mapped
|
||
I/O, @code{shm_open},, libc, The GNU C Library Reference Manual}).
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %immutable-store
|
||
Este sistema de ficheros crea un montaje enlazado (``bind-mount'') de
|
||
@file{/gnu/store}, permitiendo solo el acceso de lectura para todas las
|
||
usuarias incluyendo a @code{root}. Esto previene modificaciones accidentales
|
||
por software que se ejecuta como @code{root} o por las administradoras del
|
||
sistema.
|
||
|
||
El daemon sí es capaz de escribir en el almacén: vuelve a montar
|
||
@file{/gnu/store} en modo lectura-escritura en su propio ``espacio de
|
||
nombres''.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %binary-format-file-system
|
||
El sistema de ficheros @code{binfmt_misc}, que permite que el manejo de
|
||
tipos de ficheros ejecutables arbitrarios se delegue al espacio de
|
||
usuaria. Necesita la carga del módulo del núcleo @code{binfmt.ko}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %fuse-control-file-system
|
||
El sistema de ficheros @code{fusectl}, que permite a usuarias sin
|
||
privilegios montar y desmontar sistemas de ficheros de espacio de usuaria
|
||
FUSE. Necesita la carga del módulo del núcleo @code{fuse.ko}.
|
||
@end defvr
|
||
|
||
@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 ficheros: ambos se reducen a
|
||
@emph{traducir} operaciones de entrada/salida realizadas en un fichero a
|
||
operaciones en su almacenamiento subyacente. Por tanto, Hurd implementa
|
||
dispositivos traducidos, como sistemas de ficheros, 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. Otros ejemplos, todavía no implementados, son los
|
||
volúmenes lógicos LVM.
|
||
|
||
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
|
||
Puede ser tanto una cadena que especifica el nombre de un dispositivo de
|
||
bloques a traducir, como @code{"/dev/sda3"}, o una lista de dichas cadenas
|
||
cuando varios dispositivos necesitan ser ensamblados para crear uno nuevo.
|
||
|
||
@item target
|
||
Esta cadena especifica el nombre del dispositivo traducido resultante. Para
|
||
traductores del núcleo como dispositivos de cifrado del tipo
|
||
@code{luks-device-mapping}, especificar @code{"mi-particion"} produce la
|
||
creación del dispositivo @code{"/dev/mapper/mi-particion"}. Para
|
||
dispositivos RAID de tipo @code{raid-device-mapping}, el nombre del
|
||
dispositivo completo como @code{"/dev/md0"} debe ser proporcionado.
|
||
|
||
@item type
|
||
Debe ser un objeto @code{mapped-device-kind}, que especifica cómo
|
||
@var{source} se traduce a @var{target}.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} luks-device-mapping
|
||
Define el cifrado de bloques LUKS mediante el uso de la orden
|
||
@command{cryptsetup} del paquete del mismo nombre. Depende del módulo
|
||
@code{dm-crypt} del núcleo Linux.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} raid-device-mapping
|
||
Define un dispositivo RAID, el cual se ensambla mediante el uso de la orden
|
||
@code{mdadm} del paquete del mismo nombre. Requiere la carga del módulo del
|
||
núcleo Linux para el nivel RAID apropiado, como @code{raid456} para RAID-4,
|
||
RAID-5 o RAID-6, o @code{raid10} para RAID-10.
|
||
@end defvr
|
||
|
||
@cindex 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 ficheros}).
|
||
|
||
@example
|
||
(mapped-device
|
||
(source "/dev/sda3")
|
||
(target "home")
|
||
(type luks-device-mapping))
|
||
@end example
|
||
|
||
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:
|
||
|
||
@example
|
||
(mapped-device
|
||
(source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
|
||
(target "home")
|
||
(type luks-device-mapping))
|
||
@end example
|
||
|
||
@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 fichero de intercambio en un sistema de ficheros en un
|
||
dispositivo traducido a través del cifrado LUKS. @xref{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:
|
||
|
||
@example
|
||
(mapped-device
|
||
(source (list "/dev/sda1" "/dev/sdb1"))
|
||
(target "/dev/md0")
|
||
(type raid-device-mapping))
|
||
@end example
|
||
|
||
El dispositivo @file{/dev/md0} puede usarse entonces como el campo
|
||
@code{device} de una declaración @code{file-system} (@pxref{Sistemas de ficheros}). 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.
|
||
|
||
|
||
@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}:
|
||
|
||
@example
|
||
(user-account
|
||
(name "alicia")
|
||
(group "users")
|
||
(supplementary-groups '("wheel" ;permite usar sudo, etc.
|
||
"audio" ;tarjeta de sonido
|
||
"video" ;dispositivos de vídeo como cámaras
|
||
"cdrom")) ;el veterano CD-ROM
|
||
(comment "hermana de Roberto")
|
||
(home-directory "/home/alicia"))
|
||
@end example
|
||
|
||
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.
|
||
|
||
@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 fichero de un programa que
|
||
será usado como shell (@pxref{Expresiones-G}).
|
||
|
||
@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 reinicios y
|
||
reconfiguraciones.
|
||
|
||
If you @emph{do} want to set an initial password for an account, then this
|
||
field must contain the encrypted password, as a string. You can use the
|
||
@code{crypt} procedure for this purpose:
|
||
|
||
@example
|
||
(user-account
|
||
(name "charlie")
|
||
(group "users")
|
||
|
||
;; Specify a SHA-512-hashed initial password.
|
||
(password (crypt "InitialPassword!" "$6$abc")))
|
||
@end example
|
||
|
||
@quotation Nota
|
||
The hash of this initial password will be available in a file in
|
||
@file{/gnu/store}, readable by all the users, so this method must be used
|
||
with care.
|
||
@end quotation
|
||
|
||
@xref{Passphrase Storage,,, libc, The GNU C Library Reference Manual}, for
|
||
more information on password encryption, and @ref{Encryption,,, guile, GNU
|
||
Guile Reference Manual}, for information on Guile's @code{crypt} procedure.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex grupos
|
||
Las declaraciones de grupos son más simples incluso:
|
||
|
||
@example
|
||
(user-group (name "estudiantes"))
|
||
@end example
|
||
|
||
@deftp {Tipo de datos} user-group
|
||
Este tipo es para grupos de usuarias. Hay únicamente unos pocos campos:
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
En nombre del grupo.
|
||
|
||
@item @code{id} (predeterminado: @code{#f})
|
||
El identificador del grupo (un número). Si es @code{#f}, un nuevo número es
|
||
reservado automáticamente cuando se crea el grupo.
|
||
|
||
@item @code{system?} (predeterminado: @code{#f})
|
||
Este valor booleano indica si el grupo es un grupo ``del sistema''. Los
|
||
grupos del sistema tienen identificadores numéricos bajos.
|
||
|
||
@item @code{password} (predeterminada: @code{#f})
|
||
¿Qué? ¿Los grupos de usuarias pueden tener una contraseña? Bueno,
|
||
aparentemente sí. A menos que sea @code{#f}, este campo especifica la
|
||
contraseña del grupo.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
Por conveniencia, una variable contiene una lista con todos los grupos de
|
||
usuarias básicos que se puede esperar:
|
||
|
||
@defvr {Variable Scheme} %base-groups
|
||
Esta es la lista de grupos de usuarias básicos que las usuarias y/o los
|
||
paquetes esperan que estén presentes en el sistema. Esto incluye grupos como
|
||
``root'', ``wheel'' y ``users'', así como grupos usados para controlar el
|
||
acceso a dispositivos específicos como ``audio'', ``disk'' y ``cdrom''.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %base-user-accounts
|
||
Esta es la lista de cuentas de usuaria básicas que los programas pueden
|
||
esperar encontrar en un sistema GNU/Linux, como la cuenta ``nobody''.
|
||
|
||
Fíjese que la cuenta de ``root'' no se incluye aquí. Es un caso especial y
|
||
se añade automáticamente esté o no especificada.
|
||
@end defvr
|
||
|
||
@node Distribución de teclado
|
||
@section Distribución de teclado
|
||
|
||
@cindex distribución de teclado
|
||
@cindex mapa del teclas
|
||
To specify what each key of your keyboard does, you need to tell the
|
||
operating system what @dfn{keyboard layout} you want to use. The default,
|
||
when nothing is specified, is the US English QWERTY layout for 105-key PC
|
||
keyboards. However, German speakers will usually prefer the German QWERTZ
|
||
layout, French speakers will want the AZERTY layout, and so on; hackers
|
||
might prefer Dvorak or bépo, and they might even want to further customize
|
||
the effect of some of the keys. This section explains how to get that done.
|
||
|
||
@cindex distribución de teclado, definición
|
||
There are three components that will want to know about your keyboard
|
||
layout:
|
||
|
||
@itemize
|
||
@item
|
||
The @emph{bootloader} may want to know what keyboard layout you want to use
|
||
(@pxref{Configuración del gestor de arranque, @code{keyboard-layout}}). This is useful
|
||
if you want, for instance, to make sure that you can type the passphrase of
|
||
your encrypted root partition using the right layout.
|
||
|
||
@item
|
||
The @emph{operating system kernel}, Linux, will need that so that the
|
||
console is properly configured (@pxref{Referencia de ``operating-system'',
|
||
@code{keyboard-layout}}).
|
||
|
||
@item
|
||
The @emph{graphical display server}, usually Xorg, also has its own idea of
|
||
the keyboard layout (@pxref{Sistema X Window, @code{keyboard-layout}}).
|
||
@end itemize
|
||
|
||
Guix allows you to configure all three separately but, fortunately, it
|
||
allows you to share the same keyboard layout for all three components.
|
||
|
||
@cindex XKB, distribuciones de teclado
|
||
Keyboard layouts are represented by records created by the
|
||
@code{keyboard-layout} procedure of @code{(gnu system keyboard)}. Following
|
||
the X Keyboard extension (XKB), each layout has four attributes: a name
|
||
(often a language code such as ``fi'' for Finnish or ``jp'' for Japanese),
|
||
an optional variant name, an optional keyboard model name, and a possibly
|
||
empty list of additional options. In most cases the layout name is all you
|
||
care about. Here are a few example:
|
||
|
||
@example
|
||
;; The German QWERTZ layout. Here we assume a standard
|
||
;; "pc105" keyboard model.
|
||
(keyboard-layout "de")
|
||
|
||
;; The bépo variant of the French layout.
|
||
(keyboard-layout "fr" "bepo")
|
||
|
||
;; The Catalan layout.
|
||
(keyboard-layout "es" "cat")
|
||
|
||
;; The Latin American Spanish layout. In addition, the
|
||
;; "Caps Lock" key is used as an additional "Ctrl" key,
|
||
;; and the "Menu" key is used as a "Compose" key to enter
|
||
;; accented letters.
|
||
(keyboard-layout "latam"
|
||
#:options '("ctrl:nocaps" "compose:menu"))
|
||
|
||
;; The Russian layout for a ThinkPad keyboard.
|
||
(keyboard-layout "ru" #:model "thinkpad")
|
||
|
||
;; The "US international" layout, which is the US layout plus
|
||
;; dead keys to enter accented characters. This is for an
|
||
;; Apple MacBook keyboard.
|
||
(keyboard-layout "us" "intl" #:model "macbook78")
|
||
@end example
|
||
|
||
See the @file{share/X11/xkb} directory of the @code{xkeyboard-config}
|
||
package for a complete list of supported layouts, variants, and models.
|
||
|
||
@cindex distribución de teclado, configuración
|
||
Let's say you want your system to use the Turkish keyboard layout throughout
|
||
your system---bootloader, console, and Xorg. Here's what your system
|
||
configuration would look like:
|
||
|
||
@findex set-xorg-configuration
|
||
@lisp
|
||
;; Using the Turkish layout for the bootloader, the console,
|
||
;; and for Xorg.
|
||
|
||
(operating-system
|
||
;; ...
|
||
(keyboard-layout (keyboard-layout "tr")) ;for the console
|
||
(bootloader (bootloader-configuration
|
||
(bootloader grub-efi-bootloader)
|
||
(target "/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
|
||
|
||
In the example above, for GRUB and for Xorg, we just refer to the
|
||
@code{keyboard-layout} field defined above, but we could just as well refer
|
||
to a different layout. The @code{set-xorg-configuration} procedure
|
||
communicates the desired Xorg configuration to the graphical log-in manager,
|
||
by default GDM.
|
||
|
||
We've discussed how to specify the @emph{default} keyboard layout of your
|
||
system when it starts, but you can also adjust it at run time:
|
||
|
||
@itemize
|
||
@item
|
||
If you're using GNOME, its settings panel has a ``Region & Language'' entry
|
||
where you can select one or more keyboard layouts.
|
||
|
||
@item
|
||
Under Xorg, the @command{setxkbmap} command (from the same-named package)
|
||
allows you to change the current layout. For example, this is how you would
|
||
change the layout to US Dvorak:
|
||
|
||
@example
|
||
setxkbmap us dvorak
|
||
@end example
|
||
|
||
@item
|
||
The @code{loadkeys} command changes the keyboard layout in effect in the
|
||
Linux console. However, note that @code{loadkeys} does @emph{not} use the
|
||
XKB keyboard layout categorization described above. The command below loads
|
||
the French bépo layout:
|
||
|
||
@example
|
||
loadkeys fr-bepo
|
||
@end example
|
||
@end itemize
|
||
|
||
@node Localizaciones
|
||
@section Localizaciones
|
||
|
||
@cindex localización
|
||
Una @dfn{localización} define convenciones culturales para una lengua y
|
||
región del mundo particular (@pxref{Localizaciones,,, libc, The GNU C Library
|
||
Reference Manual}). Cada localización tiene un nombre que típicamente tiene
|
||
la forma de @code{@var{lengua}_@var{territorio}.@var{codificación}}---por
|
||
ejemplo, @code{fr_LU.utf8} designa la localización para la lengua francesa,
|
||
con las convenciones culturales de Luxemburgo, usando la codificación UTF-8.
|
||
|
||
@cindex definición de localización
|
||
Normalmente deseará especificar la localización predeterminada para la
|
||
máquina usando el campo @code{locale} de la declaración
|
||
@code{operating-system} (@pxref{Referencia de ``operating-system'', @code{locale}}).
|
||
|
||
La localización seleccionada es automáticamente añadida a las
|
||
@dfn{definiciones de localización} conocidas en el sistema si es necesario,
|
||
con su codificación inferida de su nombre---por ejemplo, se asume que
|
||
@code{bo_CN.utf8} usa la codificación @code{UTF-8}. Definiciones de
|
||
localización adicionales pueden ser especificadas en el campo
|
||
@code{locale-definitions} de @code{operating-system}---esto es util, por
|
||
ejemplo, si la codificación no puede ser inferida del nombre de la
|
||
localización. El conjunto predeterminado de definiciones de localización
|
||
incluye algunas localizaciones ampliamente usadas, pero no todas las
|
||
disponibles, para ahorrar espacio.
|
||
|
||
Por ejemplo, para añadir la localización del frisio del norte para Alemania,
|
||
el valor de dicho campo puede ser:
|
||
|
||
@example
|
||
(cons (locale-definition
|
||
(name "fy_DE.utf8") (source "fy_DE"))
|
||
%default-locale-definitions)
|
||
@end example
|
||
|
||
De mismo modo, para ahorrar espacio, se puede desear que
|
||
@code{locale-definitions} contenga únicamente las localizaciones que son
|
||
realmente usadas, como en:
|
||
|
||
@example
|
||
(list (locale-definition
|
||
(name "ja_JP.eucjp") (source "ja_JP")
|
||
(charset "EUC-JP")))
|
||
@end example
|
||
|
||
@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 @code{LOCPATH} (@pxref{locales-and-locpath, @code{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. Esto típicamente 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{http://www.iana.org/assignments/character-sets, como se
|
||
define por IANA}.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %default-locale-definitions
|
||
Una lista de localizaciones UTF-8 usadas de forma común, usada como valor
|
||
predeterminado del campo @code{locale-definitions} en las declaraciones
|
||
@code{operating-system}.
|
||
|
||
@cindex nombre de localización
|
||
@cindex codificación normalizada en los nombres de localizaciones
|
||
Estas definiciones de localizaciones usan la @dfn{codificación normalizada}
|
||
para el fragmento tras el punto en el nombre (@pxref{Using gettextized
|
||
software, normalized codeset,, libc, The GNU C Library Reference
|
||
Manual}). Por lo que por ejemplo es válido @code{uk_UA.utf8} pero @emph{no},
|
||
digamos, @code{uk_UA.UTF-8}.
|
||
@end defvr
|
||
|
||
@subsection Consideraciones sobre la compatibilidad de datos de localización
|
||
|
||
@cindex incompatibilidad, de datos de localización
|
||
Las declaraciones @code{operating-system} proporcionan un campo
|
||
@code{locale-libcs} para especificar los paquetes GNU@tie{}libc que se
|
||
usarán para compilar las declaraciones de localizaciones
|
||
(@pxref{Referencia de ``operating-system''}). ``¿Por qué debo preocuparme?'', puede
|
||
preguntarse. Bueno, sucede que el formato binario de los datos de
|
||
localización es ocasionalmente incompatible de una versión de libc a otra.
|
||
|
||
@c See <https://sourceware.org/ml/libc-alpha/2015-09/msg00575.html>
|
||
@c and <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
|
||
Por ejemplo, un programa enlazado con la versión 2.21 de libc no puede leer
|
||
datos de localización producidos con libc 2.22; peor aún, ese programa
|
||
@emph{aborta} en vez de simplemente ignorar los datos de localización
|
||
incompatibles@footnote{Las versiones 2.23 y posteriores de GNU@tie{}libc
|
||
simplemente ignorarán los datos de localización incompatibles, lo cual ya es
|
||
un avance.}. De manera similar, un programa enlazado con libc 2.22 puede
|
||
leer la mayor parte, pero no todo, de los datos de localización de libc 2.21
|
||
(específicamente, los datos @code{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 @var{GUIX_LOCPATH} adecuadamente
|
||
(@pxref{locales-and-locpath, @code{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}:
|
||
|
||
@example
|
||
(use-package-modules base)
|
||
|
||
(operating-system
|
||
;; @dots{}
|
||
(locale-libcs (list glibc-2.21 (canonical-package glibc))))
|
||
@end example
|
||
|
||
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 has a broad definition of ``service'' (@pxref{Composición de servicios}),
|
||
but many services are managed by the GNU@tie{}Shepherd (@pxref{Servicios de Shepherd}). On a running system, the @command{herd} command allows you to
|
||
list the available services, show their status, start and stop them, or do
|
||
other specific operations (@pxref{Jump Start,,, shepherd, The GNU Shepherd
|
||
Manual}). For example:
|
||
|
||
@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
|
||
|
||
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 de logs:: El servicio rottlog.
|
||
* Servicios de red:: Configuración de red, daemon SSH, etc.
|
||
* Sistema X Window:: Interfaz gráfica.
|
||
* Servicios de impresión:: Soporte de impresoras locales y remotas.
|
||
* Servicios de escritorio:: D-Bus y servicios de escritorio.
|
||
* Servicios de sonido:: Servicios de ALSA y Pulseaudio.
|
||
* Servicios de bases de datos:: Bases de datos SQL, almacenes de
|
||
clave-valor, etc.
|
||
* Servicios de correo:: IMAP, POP3, SMTP y todo eso.
|
||
* Servicios de mensajería:: Servicios de mensajería.
|
||
* Servicios de telefonía:: Servicios de telefonía.
|
||
* Servicios de monitorización:: Servicios de monitorización.
|
||
* Servicios Kerberos:: Servicios Kerberos.
|
||
* Servicios LDAP:: Servicios LDAP.
|
||
* Servicios Web:: Servidores Web.
|
||
* Servicios de certificados:: Certificados TLS via Let's Encrypt.
|
||
* Servicios DNS:: Demonios DNS.
|
||
* Servicios VPN:: Demonios VPN.
|
||
* Sistema de ficheros en red:: Servicios relacionados con NFS.
|
||
* Integración continua:: El servicio Cuirass.
|
||
* Servicios de gestión de energía:: Extender la vida de la batería.
|
||
* Servicios de audio:: El MPD.
|
||
* Servicios de virtualización:: Servicios de virtualización.
|
||
* Servicios de control de versiones:: Proporcionar acceso remoto a
|
||
repositorios Git.
|
||
* Servicios de juegos:: Servidores de juegos.
|
||
* Servicios misceláneos:: Otros servicios.
|
||
@end menu
|
||
|
||
@node Servicios base
|
||
@subsection Servicios base
|
||
|
||
El módulo @code{(gnu services base)} proporciona definiciones para los
|
||
servicios básicos que se esperan en el sistema. Los servicios exportados por
|
||
este módulo se enumeran a continuación.
|
||
|
||
@defvr {Variable Scheme} %base-services
|
||
Esta variable contiene una lista de servicios básicos (@pxref{Tipos de servicios y servicios}, para más información sobre los objetos servicio) que se
|
||
pueden esperar en el sistema: un servicio de ingreso al sistema (mingetty)
|
||
en cada tty, syslogd, el daemon de la caché del servicio de nombres (nscd),
|
||
el gestor de dispositivos udev, y más.
|
||
|
||
Este es el valor predeterminado del campo @code{services} de las
|
||
declaraciones @code{operating-system}. De manera habitual, cuando se
|
||
personaliza el sistema, es deseable agregar servicios a
|
||
@var{%base-services}, de esta forma:
|
||
|
||
@example
|
||
(append (list (service avahi-service-type)
|
||
(service openssh-service-type))
|
||
%base-services)
|
||
@end example
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} special-files-service-type
|
||
El servicio que establece ``ficheros especiales'' como @file{/bin/sh}; una
|
||
instancia suya es parte de @code{%base-services}.
|
||
|
||
El valor asociado con servicios @code{special-file-service-type} debe ser
|
||
una lista de tuplas donde el primer elemento es el ``fichero especial'' y el
|
||
segundo elemento es su destino. El valor predeterminado es:
|
||
|
||
@cindex @file{/bin/sh}
|
||
@cindex @file{sh}, en @file{/bin}
|
||
@example
|
||
`(("/bin/sh" ,(file-append @var{bash} "/bin/sh")))
|
||
@end example
|
||
|
||
@cindex @file{/usr/bin/env}
|
||
@cindex @file{env}, en @file{/usr/bin}
|
||
Si quiere añadir, digamos, @code{/usr/bin/env} a su sistema, puede cambiar
|
||
su valor por:
|
||
|
||
@example
|
||
`(("/bin/sh" ,(file-append @var{bash} "/bin/sh"))
|
||
("/usr/bin/env" ,(file-append @var{coreutils} "/bin/env")))
|
||
@end example
|
||
|
||
Ya que es parte de @code{%base-services}, puede usar @code{modify-services}
|
||
para personalizar el conjunto de ficheros especiales (@pxref{Referencia de servicios, @code{modify-services}}). Pero una forma simple de añadir un
|
||
fichero especial es usar el procedimiento @code{extra-special-file} (véase a
|
||
continuación).
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} extra-special-file @var{fichero} @var{destino}
|
||
Usa @var{destino} como el ``fichero especial'' @var{fichero}.
|
||
|
||
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:
|
||
|
||
@example
|
||
(extra-special-file "/usr/bin/env"
|
||
(file-append coreutils "/bin/env"))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} host-name-service @var{nombre}
|
||
Devuelve un servicio que establece el nombre de máquina a @var{nombre}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} login-service @var{config}
|
||
Devuelve un servicio para ejecutar el ingreso al sistema de acuerdo con
|
||
@var{config}, un objeto @code{<login-configuration>}, que especifica el
|
||
mensaje del día, entre otras cosas.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} login-configuration
|
||
Este es el tipo de datos que representa la configuración del ingreso al
|
||
sistema.
|
||
|
||
@table @asis
|
||
|
||
@item @code{motd}
|
||
@cindex mensaje del día
|
||
Un objeto tipo-fichero que contiene el ``mensaje del día''.
|
||
|
||
@item @code{allow-empty-passwords?} (predeterminado: @code{#t})
|
||
Permite contraseñas vacías por defecto para que las primeras usuarias puedan
|
||
ingresar en el sistema cuando la cuenta de ``root'' está recién creada.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} mingetty-service @var{config}
|
||
Devuelve un servicio para ejecutar mingetty de acuerdo con @var{config}, un
|
||
objeto @code{<mingetty-configuration>}, que especifica el tty a ejecutar
|
||
entre otras cosas.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} mingetty-configuration
|
||
Este es el tipo de datos que representa la configuración de Mingetty, el
|
||
cual proporciona la implementación predeterminada de ingreso al sistema en
|
||
las consolas virtuales.
|
||
|
||
@table @asis
|
||
|
||
@item @code{tty}
|
||
El sistema 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{mingetty} (predeterminado: @var{mingetty})
|
||
El paquete Mingetty usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedure Scheme} agetty-service @var{config}
|
||
Devuelve un servicio para ejecutar agetty de acuerdo con @var{config}, un
|
||
objeto @code{<agetty-configuration>}, que especifica el tty a ejecutar entre
|
||
otras cosas.<
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} agetty-configuration
|
||
Este es el tipo de datos que representa la configuración de agetty, que
|
||
implementa el ingreso al sistema en las consolas virtuales y serie. Véase la
|
||
página de manual @code{agetty(8)} para más información.
|
||
|
||
@table @asis
|
||
|
||
@item @code{tty}
|
||
The name of the console this agetty runs on, as a string---e.g.,
|
||
@code{"ttyS0"}. This argument is optional, it will default to a reasonable
|
||
default serial port used by the kernel Linux.
|
||
|
||
For this, if there is a value for an option @code{agetty.tty} in the kernel
|
||
command line, agetty will extract the device name of the serial port from it
|
||
and use that.
|
||
|
||
If not and if there is a value for an option @code{console} with a tty in
|
||
the Linux command line, agetty will extract the device name of the serial
|
||
port from it and use that.
|
||
|
||
In both cases, agetty will leave the other serial device settings (baud rate
|
||
etc.)@: alone---in the hope that Linux pinned them to the correct values.
|
||
|
||
@item @code{baud-rate} (predeterminado: @code{#f})
|
||
A string containing a comma-separated list of one or more baud rates, in
|
||
descending order.
|
||
|
||
@item @code{term} (predeterminado: @code{#f})
|
||
A string containing the value used for the @code{TERM} environment variable.
|
||
|
||
@item @code{eight-bits?} (predeterminado: @code{#f})
|
||
When @code{#t}, the tty is assumed to be 8-bit clean, and parity detection
|
||
is disabled.
|
||
|
||
@item @code{auto-login} (predeterminado: @code{#f})
|
||
When passed a login name, as a string, the specified user will be logged in
|
||
automatically without prompting for their login name or password.
|
||
|
||
@item @code{no-reset?} (predeterminado: @code{#f})
|
||
When @code{#t}, don't reset terminal cflags (control modes).
|
||
|
||
@item @code{host} (predeterminado: @code{#f})
|
||
This accepts a string containing the "login_host", which will be written
|
||
into the @file{/var/run/utmpx} file.
|
||
|
||
@item @code{remote?} (predeterminado: @code{#f})
|
||
When set to @code{#t} in conjunction with @var{host}, this will add an
|
||
@code{-r} fakehost option to the command line of the login program specified
|
||
in @var{login-program}.
|
||
|
||
@item @code{flow-control?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, enable hardware (RTS/CTS) flow control.
|
||
|
||
@item @code{no-issue?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, the contents of the @file{/etc/issue} file will not
|
||
be displayed before presenting the login prompt.
|
||
|
||
@item @code{init-string} (predeterminada: @code{#f})
|
||
This accepts a string that will be sent to the tty or modem before sending
|
||
anything else. It can be used to initialize a modem.
|
||
|
||
@item @code{no-clear?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, agetty will not clear the screen before showing the
|
||
login prompt.
|
||
|
||
@item @code{login-program} (predeterminado: (file-append shadow "/bin/login"))
|
||
This must be either a gexp denoting the name of a log-in program, or unset,
|
||
in which case the default value is the @command{login} from the Shadow tool
|
||
suite.
|
||
|
||
@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})
|
||
When set to @code{#t}, instruct agetty to try to extract the baud rate from
|
||
the status messages produced by certain types of modems.
|
||
|
||
@item @code{skip-login?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, do not prompt the user for a login name. This can be
|
||
used with @var{login-program} field to use non-standard login systems.
|
||
|
||
@item @code{no-newline?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, do not print a newline before printing the
|
||
@file{/etc/issue} file.
|
||
|
||
@c Is this dangerous only when used with login-program, or always?
|
||
@item @code{login-options} (predeterminadas: @code{#f})
|
||
This option accepts a string containing options that are passed to the login
|
||
program. When used with the @var{login-program}, be aware that a malicious
|
||
user could try to enter a login name containing embedded options that could
|
||
be parsed by the login program.
|
||
|
||
@item @code{login-pause} (predeterminada: @code{#f})
|
||
When set to @code{#t}, wait for any key before showing the login prompt.
|
||
This can be used in conjunction with @var{auto-login} to save memory by
|
||
lazily spawning shells.
|
||
|
||
@item @code{chroot} (predeterminado: @code{#f})
|
||
Change root to the specified directory. This option accepts a directory
|
||
path as a string.
|
||
|
||
@item @code{hangup?} (predeterminado: @code{#f})
|
||
Use the Linux system call @code{vhangup} to do a virtual hangup of the
|
||
specified terminal.
|
||
|
||
@item @code{keep-baud?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, try to keep the existing baud rate. The baud rates
|
||
from @var{baud-rate} are used when agetty receives a @key{BREAK} character.
|
||
|
||
@item @code{timeout} (predeterminado: @code{#f})
|
||
When set to an integer value, terminate if no user name could be read within
|
||
@var{timeout} seconds.
|
||
|
||
@item @code{detect-case?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, turn on support for detecting an uppercase-only
|
||
terminal. This setting will detect a login name containing only uppercase
|
||
letters as indicating an uppercase-only terminal and turn on some
|
||
upper-to-lower case conversions. Note that this will not support Unicode
|
||
characters.
|
||
|
||
@item @code{wait-cr?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, wait for the user or modem to send a carriage-return
|
||
or linefeed character before displaying @file{/etc/issue} or login prompt.
|
||
This is typically used with the @var{init-string} option.
|
||
|
||
@item @code{no-hints?} (predeterminado: @code{#f})
|
||
When set to @code{#t}, do not print hints about Num, Caps, and Scroll locks.
|
||
|
||
@item @code{no-hostname?} (predeterminado: @code{#f})
|
||
By default, the hostname is printed. When this option is set to @code{#t},
|
||
no hostname will be shown at all.
|
||
|
||
@item @code{long-hostname?} (predeterminado: @code{#f})
|
||
By default, the hostname is only printed until the first dot. When this
|
||
option is set to @code{#t}, the fully qualified hostname by
|
||
@code{gethostname} or @code{getaddrinfo} is shown.
|
||
|
||
@item @code{erase-characters} (predeterminado: @code{#f})
|
||
This option accepts a string of additional characters that should be
|
||
interpreted as backspace when the user types their login name.
|
||
|
||
@item @code{kill-characters} (predeterminado: @code{#f})
|
||
This option accepts a string that should be interpreted to mean "ignore all
|
||
previous characters" (also called a "kill" character) when the types their
|
||
login name.
|
||
|
||
@item @code{chdir} (predeterminado: @code{#f})
|
||
This option accepts, as a string, a directory path that will be changed to
|
||
before login.
|
||
|
||
@item @code{delay} (predeterminado: @code{#f})
|
||
This options accepts, as an integer, the number of seconds to sleep before
|
||
opening the tty and displaying the login prompt.
|
||
|
||
@item @code{nice} (predeterminado: @code{#f})
|
||
This option accepts, as an integer, the nice value with which to run the
|
||
@command{login} program.
|
||
|
||
@item @code{extra-options} (predeterminadas: @code{'()})
|
||
This option provides an "escape hatch" for the user to provide arbitrary
|
||
command-line arguments to @command{agetty} as a list of strings.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} kmscon-service-type @var{config}
|
||
Return a service to run
|
||
@uref{https://www.freedesktop.org/wiki/Software/kmscon,kmscon} according to
|
||
@var{config}, a @code{<kmscon-configuration>} object, which specifies the
|
||
tty to run, among other things.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} kmscon-configuration
|
||
Este es el tipo de datos que representa la configuración de Kmscon, que
|
||
implementa el ingreso al sistema en consolas virtuales.
|
||
|
||
@table @asis
|
||
|
||
@item @code{virtual-terminal}
|
||
El sistema 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")})
|
||
A list of arguments to pass to @command{login}.
|
||
|
||
@item @code{auto-login} (predeterminado: @code{#f})
|
||
When passed a login name, as a string, the specified user will be logged in
|
||
automatically without prompting for their login name or password.
|
||
|
||
@item @code{hardware-acceleration?} (predeterminado: #f)
|
||
Determina si se usará aceleración hardware.
|
||
|
||
@item @code{kmscon} (predeterminado: @var{kmscon})
|
||
El paquete Kmscon usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex daemon de caché del servicio de nombres
|
||
@cindex nscd
|
||
@deffn {Procedimiento Scheme} nscd-service [@var{configuración}] [#:glibc glibc] @
|
||
[#:name-services '()]
|
||
Devuelve un servicio que ejecuta el daemon de la caché del servicio de
|
||
nombres (nscd) con la @var{configuración} proporcionada---un objeto
|
||
@code{<nscd-configuration>}. @xref{Selector de servicios de nombres}, para un ejemplo.
|
||
|
||
Por conveniencia, el servicio ncsd de Shepherd proporciona las siguientes
|
||
acciones:
|
||
|
||
@table @code
|
||
@item invalidate
|
||
@cindex invalidación de caché, nscd
|
||
@cindex nscd, invalidación de caché
|
||
Esto invalida la caché dada. Por ejemplo, ejecutar:
|
||
|
||
@example
|
||
herd invalidate nscd hosts
|
||
@end example
|
||
|
||
@noindent
|
||
invalida la caché de búsqueda de nombres de máquinas de nscd.
|
||
|
||
@item statistics
|
||
Ejecutar @command{herd statistics nscd} muestra información del uso nscd y
|
||
la caché.
|
||
@end table
|
||
|
||
@end deffn
|
||
|
||
@defvr {Variable Scheme} %nscd-default-configuration
|
||
This is the default @code{<nscd-configuration>} value (see below) used by
|
||
@code{nscd-service}. It uses the caches defined by
|
||
@var{%nscd-default-caches}; see below.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} nscd-configuration
|
||
Este tipo de datos representa la configuración del daemon de caché del
|
||
servicio de nombres (nscd).
|
||
|
||
@table @asis
|
||
|
||
@item @code{name-services} (predeterminados: @code{'()})
|
||
List of packages denoting @dfn{name services} that must be visible to the
|
||
nscd---e.g., @code{(list @var{nss-mdns})}.
|
||
|
||
@item @code{glibc} (predeterminada: @var{glibc})
|
||
Package object denoting the GNU C Library providing the @command{nscd}
|
||
command.
|
||
|
||
@item @code{log-file} (predeterminado: @code{"/var/log/nscd.log"})
|
||
Name of the nscd log file. This is where debugging output goes when
|
||
@code{debug-level} is strictly positive.
|
||
|
||
@item @code{debug-level} (predeterminado: @code{0})
|
||
Integer denoting the debugging levels. Higher numbers mean that more
|
||
debugging output is logged.
|
||
|
||
@item @code{caches} (predeterminadas: @var{%nscd-default-caches})
|
||
List of @code{<nscd-cache>} objects denoting things to be cached; see below.
|
||
|
||
@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}
|
||
This is a symbol representing the name of the database to be cached. Valid
|
||
values are @code{passwd}, @code{group}, @code{hosts}, and @code{services},
|
||
which designate the corresponding NSS database (@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})
|
||
A number representing the number of seconds during which a positive or
|
||
negative lookup result remains in cache.
|
||
|
||
@item @code{check-files?} (predeterminado: @code{#t})
|
||
Whether to check for updates of the files corresponding to @var{database}.
|
||
|
||
For instance, when @var{database} is @code{hosts}, setting this flag
|
||
instructs nscd to check for updates in @file{/etc/hosts} and to take them
|
||
into account.
|
||
|
||
@item @code{persistent?} (predeterminada: @code{#t})
|
||
Whether the cache should be stored persistently on disk.
|
||
|
||
@item @code{shared?} (predeterminado: @code{#t})
|
||
Whether the cache should be shared among users.
|
||
|
||
@item @code{max-database-size} (predeterminado: 32@tie{}MiB)
|
||
Maximum size in bytes of the database cache.
|
||
|
||
@c XXX: 'suggested-size' and 'auto-propagate?' seem to be expert
|
||
@c settings, so leave them out.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %nscd-default-caches
|
||
List of @code{<nscd-cache>} objects used by default by
|
||
@code{nscd-configuration} (see above).
|
||
|
||
It enables persistent and aggressive caching of service and host name
|
||
lookups. The latter provides better host name lookup performance,
|
||
resilience in the face of unreliable name servers, and also better
|
||
privacy---often the result of host name lookups is in local cache, so
|
||
external name servers do not even need to be queried.
|
||
@end defvr
|
||
|
||
@anchor{syslog-configuration-type}
|
||
@cindex syslog
|
||
@cindex logging
|
||
@deftp {Tipo de datos} syslog-configuration
|
||
Este tipo de datos representa la configuración del daemon syslog.
|
||
|
||
@table @asis
|
||
@item @code{syslogd} (predeterminado: @code{#~(string-append #$inetutils "/libexec/syslogd")})
|
||
El daemon syslog usado.
|
||
|
||
@item @code{config-file} (predeterminado: @code{%default-syslog.conf})
|
||
El fichero de configuración de syslog usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@anchor{syslog-service}
|
||
@cindex syslog
|
||
@deffn {Procedimiento Scheme} syslog-service @var{config}
|
||
Return a service that runs a syslog daemon according to @var{config}.
|
||
|
||
@xref{syslogd invocation,,, inetutils, GNU Inetutils}, para más información
|
||
sobre la sintaxis del fichero de configuración.
|
||
@end deffn
|
||
|
||
@defvr {Variable Scheme} guix-service-type
|
||
This is the type of the service that runs the build daemon,
|
||
@command{guix-daemon} (@pxref{Invocación de guix-daemon}). Its value must be a
|
||
@code{guix-configuration} record as described below.
|
||
@end defvr
|
||
|
||
@anchor{guix-configuration-type}
|
||
@deftp {Tipo de datos} guix-configuration
|
||
This data type represents the configuration of the Guix build daemon.
|
||
@xref{Invocación de guix-daemon}, for more information.
|
||
|
||
@table @asis
|
||
@item @code{guix} (predeterminado: @var{guix})
|
||
El paquete Guix usado.
|
||
|
||
@item @code{build-group} (predeterminado: @code{"guixbuild"})
|
||
El nombre del grupo de las cuentas de usuarias de construcción.
|
||
|
||
@item @code{build-accounts} (predeterminadas: @code{10})
|
||
Número de cuentas de usuarias de construcción a crear.
|
||
|
||
@item @code{authorize-key?} (predeterminado: @code{#t})
|
||
@cindex sustituciones, autorización de las mismas
|
||
Determina si se autoriza las claves de sustituciones listadas en
|
||
@code{authorized-keys}---predeterminada la de
|
||
@code{@value{SUBSTITUTE-SERVER}} (@pxref{Sustituciones}).
|
||
|
||
@vindex %default-authorized-guix-keys
|
||
@item @code{authorized-keys} (predeterminadas: @var{%default-authorized-guix-keys})
|
||
La lista de ficheros 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}}
|
||
(@pxref{Sustituciones}).
|
||
|
||
@item @code{use-substitutes?} (predeterminado: @code{#t})
|
||
Determina si se usarán sustituciones.
|
||
|
||
@item @code{substitute-urls} (predeterminado: @var{%default-substitute-urls})
|
||
La lista de URLs donde se buscarán sustituciones por defecto.
|
||
|
||
@item @code{max-silent-time} (predeterminado: @code{0})
|
||
@itemx @code{timeout} (predeterminado: @code{0})
|
||
The number of seconds of silence and the number of seconds of activity,
|
||
respectively, after which a build process times out. A value of zero
|
||
disables the timeout.
|
||
|
||
@item @code{log-compression} (predeterminado: @code{'bzip2})
|
||
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{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"})
|
||
Fichero al que se escriben la salida estándar y la salida estándar de error
|
||
de @command{guix-daemon}.
|
||
|
||
@item @code{http-proxy} (predeterminado: @code{#f})
|
||
El proxy HTTP que se usa para la descarga de derivaciones de salida fija y
|
||
sustituciones.
|
||
|
||
@item @code{tmpdir} (predeterminado: @code{#f})
|
||
Una ruta de directorio donde @command{guix-daemon} realiza las
|
||
construcciones.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} udev-service [#:udev @var{eudev} #:rules @code{'()}]
|
||
Run @var{udev}, which populates the @file{/dev} directory dynamically. udev
|
||
rules can be provided as a list of files through the @var{rules} variable.
|
||
The procedures @var{udev-rule} and @var{file->udev-rule} from @code{(gnu
|
||
services base)} simplify the creation of such rule files.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} udev-rule [@var{nombre-fichero} @var{contenido}]
|
||
Devuelve un fichero de reglas de udev con nombre @var{nombre-fichero} 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 fichero @file{90-usb-cosa.rules}. Esta regla ejecuta un
|
||
script cuando se detecta un dispositivo USB con un identificador de producto
|
||
dado.
|
||
|
||
@example
|
||
(define %regla-ejemplo-udev
|
||
(udev-rule
|
||
"90-usb-cosa.rules"
|
||
(string-append "ACTION==\"add\", SUBSYSTEM==\"usb\", "
|
||
"ATTR@{product@}==\"Ejemplo\", "
|
||
"RUN+=\"/ruta/al/ejecutable\"")))
|
||
@end example
|
||
|
||
The @command{herd rules udev} command, as root, returns the name of the
|
||
directory containing all the active udev rules.
|
||
@end deffn
|
||
|
||
Here we show how the default @var{udev-service} can be extended with it.
|
||
|
||
@example
|
||
(operating-system
|
||
;; @dots{}
|
||
(services
|
||
(modify-services %desktop-services
|
||
(udev-service-type config =>
|
||
(udev-configuration (inherit config)
|
||
(rules (append (udev-configuration-rules config)
|
||
(list %regla-ejemplo-udev))))))))
|
||
@end example
|
||
|
||
@deffn {Procedimiento Scheme} file->udev-rule [@var{nombre-fichero} @var{fichero}]
|
||
Devuelve un fichero de udev con nombre @var{nombre-fichero} que contiene las
|
||
reglas definidas en @var{fichero}, un objeto tipo-fichero.
|
||
|
||
El ejemplo siguiente muestra cómo podemos usar un fichero de reglas
|
||
existente.
|
||
|
||
@example
|
||
(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 example
|
||
@end deffn
|
||
|
||
Adicionalmente, las definiciones de paquete Gui pueden ser incluidas en
|
||
@var{rules} para extender las reglas udev con las definiciones encontradas
|
||
bajo su subdirectorio @file{lib/udev/rules.d}. En vez del ejemplo previo de
|
||
@var{file->udev-rule}, podíamos haber usado el paquete
|
||
@var{android-udev-rules} que existe en Guix en el módulo @code{(gnu packages
|
||
android)}.
|
||
|
||
El siguiente ejemplo muestra cómo usar el paquete @var{android-udev-rules}
|
||
para que la herramienta de Android @command{adb} pueda detectar dispositivos
|
||
sin privilegios de root. También detalla como crear el grupo
|
||
@code{adbusers}, el cual se requiere para el funcionamiento correcto de las
|
||
reglas definidas dentro del paquete @var{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 @var{user-account}, así como en
|
||
el campo @var{groups} del registro @var{operating-system}.
|
||
|
||
@example
|
||
(use-modules (gnu packages android) ;para android-udev-rules
|
||
(gnu system shadow) ;para user-group
|
||
;; @dots{})
|
||
|
||
(operating-system
|
||
;; @dots{}
|
||
(users (cons (user-acount
|
||
;; @dots{}
|
||
(supplementary-groups
|
||
'("adbusers" ;para adb
|
||
"wheel" "netdev" "audio" "video"))
|
||
;; @dots{})))
|
||
|
||
(groups (cons (user-group (system? #t) (name "adbusers"))
|
||
%base-groups))
|
||
|
||
;; @dots{}
|
||
|
||
(services
|
||
(modify-services %desktop-services
|
||
(udev-service-type
|
||
config =>
|
||
(udev-configuration (inherit config)
|
||
(rules (cons android-udev-rules
|
||
(udev-configuration-rules config))))))))
|
||
@end example
|
||
|
||
@defvr {Variable Scheme} urandom-seed-service-type
|
||
Save some entropy in @var{%random-seed-file} to seed @file{/dev/urandom}
|
||
when rebooting. It also tries to seed @file{/dev/urandom} from
|
||
@file{/dev/hwrng} while booting, if @file{/dev/hwrng} exists and is
|
||
readable.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %random-seed-file
|
||
This is the name of the file where some random bytes are saved by
|
||
@var{urandom-seed-service} to seed @file{/dev/urandom} when rebooting. It
|
||
defaults to @file{/var/lib/random-seed}.
|
||
@end defvr
|
||
|
||
@cindex ratón
|
||
@cindex gpm
|
||
@defvr {Variable Scheme} gpm-service-type
|
||
This is the type of the service that runs GPM, the @dfn{general-purpose
|
||
mouse daemon}, which provides mouse support to the Linux console. GPM
|
||
allows users to use the mouse in the console, notably to select, copy, and
|
||
paste text.
|
||
|
||
The value for services of this type must be a @code{gpm-configuration} (see
|
||
below). This service is not part of @var{%base-services}.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} gpm-configuration
|
||
Tipo de datos que representa la configuración de GPM.
|
||
|
||
@table @asis
|
||
@item @code{opciones} (predeterminadas: @code{%default-gpm-options})
|
||
Command-line options passed to @command{gpm}. The default set of options
|
||
instruct @command{gpm} to listen to mouse events on @file{/dev/input/mice}.
|
||
@xref{Command Line,,, gpm, gpm manual}, for more information.
|
||
|
||
@item @code{gpm} (predeterminado: @code{gpm})
|
||
El paquete GPM usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@anchor{guix-publish-service-type}
|
||
@deffn {Variable Scheme} guix-publish-service-type
|
||
This is the service type for @command{guix publish} (@pxref{Invocación de guix publish}). Its value must be a @code{guix-configuration} object, as
|
||
described below.
|
||
|
||
This assumes that @file{/etc/guix} already contains a signing key pair as
|
||
created by @command{guix archive --generate-key} (@pxref{Invocación de guix archive}). If that is not the case, the service will fail to start.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} guix-publish-configuration
|
||
Tipo de datos que representa la configuración del servicio @code{guix
|
||
publish}.
|
||
|
||
@table @asis
|
||
@item @code{guix} (predeterminado: @code{guix})
|
||
El paquete Guix usado.
|
||
|
||
@item @code{port} (predeterminado: @code{80})
|
||
El puerto TCP en el que se esperan conexiones.
|
||
|
||
@item @code{host} (predeterminado: @code{"localhost"})
|
||
The host (and thus, network interface) to listen to. Use @code{"0.0.0.0"}
|
||
to listen on all the network interfaces.
|
||
|
||
@item @code{compression-level} (predeterminado: @code{3})
|
||
The gzip compression level at which substitutes are compressed. Use
|
||
@code{0} to disable compression altogether, and @code{9} to get the best
|
||
compression ratio at the expense of increased CPU usage.
|
||
|
||
@item @code{nar-path} (predeterminado: @code{"nar"})
|
||
The URL path at which ``nars'' can be fetched. @xref{Invocación de guix publish,
|
||
@code{--nar-path}}, for details.
|
||
|
||
@item @code{cache} (predeterminado: @code{#f})
|
||
When it is @code{#f}, disable caching and instead generate archives on
|
||
demand. Otherwise, this should be the name of a directory---e.g.,
|
||
@code{"/var/cache/guix/publish"}---where @command{guix publish} caches
|
||
archives and meta-data ready to be sent. @xref{Invocación de guix publish,
|
||
@option{--cache}}, for more information on the tradeoffs involved.
|
||
|
||
@item @code{workers} (predeterminado: @code{#f})
|
||
When it is an integer, this is the number of worker threads used for
|
||
caching; when @code{#f}, the number of processors is used. @xref{Invocación de guix publish, @option{--workers}}, for more information.
|
||
|
||
@item @code{ttl} (predeterminado: @code{#f})
|
||
When it is an integer, this denotes the @dfn{time-to-live} in seconds of the
|
||
published archives. @xref{Invocación de guix publish, @option{--ttl}}, for more
|
||
information.
|
||
@end table
|
||
@end deftp
|
||
|
||
@anchor{rngd-service}
|
||
@deffn {Procedimiento Scheme} rngd-service [#:rng-tools @var{rng-tools}] @
|
||
[#:device "/dev/hwrng"] Return a service that runs the @command{rngd}
|
||
program from @var{rng-tools} to add @var{device} to the kernel's entropy
|
||
pool. The service will fail if @var{device} does not exist.
|
||
@end deffn
|
||
|
||
@anchor{pam-limits-service}
|
||
@cindex límites por sesión
|
||
@cindex ulimit
|
||
@cindex prioridad
|
||
@cindex tiempo real
|
||
@cindex jackd
|
||
@deffn {Procedimiento Scheme} pam-limits-service [#:limits @code{'()}]
|
||
|
||
Return a service that installs a configuration file for the
|
||
@uref{http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html,
|
||
@code{pam_limits} module}. The procedure optionally takes a list of
|
||
@code{pam-limits-entry} values, which can be used to specify @code{ulimit}
|
||
limits and nice priority limits to user sessions.
|
||
|
||
The following limits definition sets two hard and soft limits for all login
|
||
sessions of users in the @code{realtime} group:
|
||
|
||
@example
|
||
(pam-limits-service
|
||
(list
|
||
(pam-limits-entry "@@realtime" 'both 'rtprio 99)
|
||
(pam-limits-entry "@@realtime" 'both 'memlock 'unlimited)))
|
||
@end example
|
||
|
||
The first entry increases the maximum realtime priority for non-privileged
|
||
processes; the second entry lifts any restriction of the maximum address
|
||
space that can be locked in memory. These settings are commonly used for
|
||
real-time audio systems.
|
||
@end deffn
|
||
|
||
@node Ejecución de tareas programadas
|
||
@subsection Ejecución de tareas programadas
|
||
|
||
@cindex cron
|
||
@cindex mcron
|
||
@cindex scheduling jobs
|
||
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, which provides a lot of flexibility when specifying the
|
||
scheduling of jobs and their actions.
|
||
|
||
The example below defines an operating system that runs the
|
||
@command{updatedb} (@pxref{Invoking updatedb,,, find, Finding Files}) and
|
||
the @command{guix gc} commands (@pxref{Invocación de guix gc}) daily, as well as
|
||
the @command{mkid} command on behalf of an unprivileged user (@pxref{mkid
|
||
invocation,,, idutils, ID Database Utilities}). It uses gexps to introduce
|
||
job definitions that are passed to mcron (@pxref{Expresiones-G}).
|
||
|
||
@lisp
|
||
(use-modules (guix) (gnu) (gnu services mcron))
|
||
(use-package-modules base idutils)
|
||
|
||
(define trabajo-updatedb
|
||
;; Ejecuta 'updatedb' a las 3AM cada día. Aquí escribimos
|
||
;; las acciones del trabajo como un procedimiento Scheme.
|
||
#~(job '(next-hour '(3))
|
||
(lambda ()
|
||
(execl (string-append #$findutils "/bin/updatedb")
|
||
"updatedb"
|
||
"--prunepaths=/tmp /var/tmp /gnu/store"))))
|
||
|
||
(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{}
|
||
(services (cons (service mcron-service-type
|
||
(mcron-configuration
|
||
(jobs (list trabajo-recolector-basura
|
||
trabajo-updatedb
|
||
trabajo-idutils))))
|
||
%base-services)))
|
||
@end lisp
|
||
|
||
@xref{Guile Syntax, mcron job specifications,, mcron, GNU@tie{}mcron}, for
|
||
more information on mcron job specifications. Below is the reference of the
|
||
mcron service.
|
||
|
||
On a running system, you can use the @code{schedule} action of the service
|
||
to visualize the mcron jobs that will be executed next:
|
||
|
||
@example
|
||
# herd schedule mcron
|
||
@end example
|
||
|
||
@noindent
|
||
The example above lists the next five tasks that will be executed, but you
|
||
can also specify the number of tasks to display:
|
||
|
||
@example
|
||
# herd schedule mcron 10
|
||
@end example
|
||
|
||
@defvr {Variable Scheme} mcron-service-type
|
||
This is the type of the @code{mcron} service, whose value is an
|
||
@code{mcron-configuration} object.
|
||
|
||
This service type can be the target of a service extension that provides it
|
||
additional job specifications (@pxref{Composición de servicios}). In other
|
||
words, it is possible to define services that provide additional mcron jobs
|
||
to run.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} mcron-configuration
|
||
Tipo de datos que representa la configuración de mcron.
|
||
|
||
@table @asis
|
||
@item @code{mcron} (predeterminado: @var{mcron})
|
||
El paquete mcron usado.
|
||
|
||
@item @code{jobs}
|
||
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}).
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@node Rotación de logs
|
||
@subsection Rotación de logs
|
||
|
||
@cindex rottlog
|
||
@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 GNU@tie{}Rot[t]log, a log rotation
|
||
tool (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}).
|
||
|
||
The example below defines an operating system that provides log rotation
|
||
with the default settings, for commonly encountered log files.
|
||
|
||
@lisp
|
||
(use-modules (guix) (gnu))
|
||
(use-service-modules admin mcron)
|
||
(use-package-modules base idutils)
|
||
|
||
(operating-system
|
||
;; @dots{}
|
||
(services (cons (service rottlog-service-type)
|
||
%base-services)))
|
||
@end lisp
|
||
|
||
@defvr {Variable Scheme} rottlog-service-type
|
||
This is the type of the Rottlog service, whose value is a
|
||
@code{rottlog-configuration} object.
|
||
|
||
Other services can extend this one with new @code{log-rotation} objects (see
|
||
below), thereby augmenting the set of files to be rotated.
|
||
|
||
This service type can define mcron jobs (@pxref{Ejecución de tareas programadas}) to
|
||
run the rottlog service.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} rottlog-configuration
|
||
Tipo de datos que representa la configuración de rottlog.
|
||
|
||
@table @asis
|
||
@item @code{rottlog} (predeterminado: @code{rottlog})
|
||
El paquete Rottlog usado.
|
||
|
||
@item @code{rc-file} (predeterminado: @code{(file-append rottlog "/etc/rc")})
|
||
The Rottlog configuration file to use (@pxref{Mandatory RC Variables,,,
|
||
rottlog, GNU Rot[t]log Manual}).
|
||
|
||
@item @code{rotations} (predeterminadas: @code{%default-rotations})
|
||
A list of @code{log-rotation} objects as defined below.
|
||
|
||
@item @code{jobs}
|
||
This is a list of gexps where each gexp corresponds to an mcron job
|
||
specification (@pxref{Ejecución de tareas programadas}).
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} log-rotation
|
||
Tipo de datos que representa la rotación de un grupo de ficheros de log.
|
||
|
||
Taking an example from the Rottlog manual (@pxref{Period Related File
|
||
Examples,,, rottlog, GNU Rot[t]log Manual}), a log rotation might be defined
|
||
like this:
|
||
|
||
@example
|
||
(log-rotation
|
||
(frequency 'daily)
|
||
(files '("/var/log/apache/*"))
|
||
(options '("storedir apache-archives"
|
||
"rotate 6"
|
||
"notifempty"
|
||
"nocompress")))
|
||
@end example
|
||
|
||
La lista de campos es como sigue:
|
||
|
||
@table @asis
|
||
@item @code{frequency} (predeterminada: @code{'weekly})
|
||
La frecuencia de rotación de logs, un símbolo.
|
||
|
||
@item @code{files}
|
||
La lista de ficheros o patrones extendidos de fichero a rotar.
|
||
|
||
@item @code{options} (predeterminadas: @code{'()})
|
||
The list of rottlog options for this rotation (@pxref{Configuration
|
||
parameters,,, rottlog, GNU Rot[t]lg Manual}).
|
||
|
||
@item @code{post-rotate} (predeterminado: @code{#f})
|
||
Either @code{#f} or a gexp to execute once the rotation has completed.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %default-rotations
|
||
Specifies weekly rotation of @var{%rotated-files} and a couple of other
|
||
files.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %rotated-files
|
||
The list of syslog-controlled files to be rotated. By default it is:
|
||
@code{'("/var/log/messages" "/var/log/secure")}.
|
||
@end defvr
|
||
|
||
@node Servicios de red
|
||
@subsection Servicios de red
|
||
|
||
El módulo @code{(gnu services networking)} proporciona servicios para
|
||
configurar la interfaz de red.
|
||
|
||
@cindex DHCP, servicio de red
|
||
@defvr {Variable Scheme} dhcp-client-service-type
|
||
This is the type of services that run @var{dhcp}, a Dynamic Host
|
||
Configuration Protocol (DHCP) client, on all the non-loopback network
|
||
interfaces. Its value is the DHCP client package to use, @code{isc-dhcp} by
|
||
default.
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} dhcpd-service-type
|
||
This type defines a service that runs a DHCP daemon. To create a service of
|
||
this type, you must supply a @code{<dhcpd-configuration>}. For example:
|
||
|
||
@example
|
||
(service dhcpd-service-type
|
||
(dhcpd-configuration
|
||
(config-file (local-file "mi-dhcpd.conf"))
|
||
(interfaces '("enp0s25"))))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} dhcpd-configuration
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{isc-dhcp})
|
||
The package that provides the DHCP daemon. This package is expected to
|
||
provide the daemon at @file{sbin/dhcpd} relative to its output directory.
|
||
The default package is the @uref{http://www.isc.org/products/DHCP, ISC's
|
||
DHCP server}.
|
||
@item @code{config-file} (predeterminado: @code{#f})
|
||
The configuration file to use. This is required. It will be passed to
|
||
@code{dhcpd} via its @code{-cf} option. This may be any ``file-like''
|
||
object (@pxref{Expresiones-G, file-like objects}). See @code{man
|
||
dhcpd.conf} for details on the configuration file syntax.
|
||
@item @code{version} (predeterminada: @code{"4"})
|
||
The DHCP version to use. The ISC DHCP server supports the values ``4'',
|
||
``6'', and ``4o6''. These correspond to the @code{dhcpd} program options
|
||
@code{-4}, @code{-6}, and @code{-4o6}. See @code{man dhcpd} for details.
|
||
@item @code{run-directory} (predeterminado: @code{"/run/dhcpd"})
|
||
The run directory to use. At service activation time, this directory will
|
||
be created if it does not exist.
|
||
@item @code{pid-file} (predeterminado: @code{"/run/dhcpd/dhcpd.pid"})
|
||
The PID file to use. This corresponds to the @code{-pf} option of
|
||
@code{dhcpd}. See @code{man dhcpd} for details.
|
||
@item @code{interfaces} (predeterminadas: @code{'()})
|
||
The names of the network interfaces on which dhcpd should listen for
|
||
broadcasts. If this list is not empty, then its elements (which must be
|
||
strings) will be appended to the @code{dhcpd} invocation when starting the
|
||
daemon. It may not be necessary to explicitly specify any interfaces here;
|
||
see @code{man dhcpd} for details.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} static-networking-service-type
|
||
@c TODO Document <static-networking> data structures.
|
||
This is the type for statically-configured network interfaces.
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} static-networking-service @var{interfaz} @var{ip} @
|
||
[#:netmask #f] [#:gateway #f] [#:name-servers @code{'()}] @ [#:requirement
|
||
@code{'(udev)}] Return a service that starts @var{interface} with address
|
||
@var{ip}. If @var{netmask} is true, use it as the network mask. If
|
||
@var{gateway} is true, it must be a string specifying the default network
|
||
gateway. @var{requirement} can be used to declare a dependency on another
|
||
service before configuring the interface.
|
||
|
||
This procedure can be called several times, one for each network interface
|
||
of interest. Behind the scenes what it does is extend
|
||
@code{static-networking-service-type} with additional network interfaces to
|
||
handle.
|
||
|
||
Por ejemplo:
|
||
|
||
@example
|
||
(static-networking-service "eno1" "192.168.1.82"
|
||
#:gateway "192.168.1.2"
|
||
#:name-servers '("192.168.1.2"))
|
||
@end example
|
||
@end deffn
|
||
|
||
@cindex wicd
|
||
@cindex sin cables
|
||
@cindex WiFi
|
||
@cindex gestión de red
|
||
@deffn {Procedimiento Scheme} wicd-service [#:wicd @var{wicd}]
|
||
Return a service that runs @url{https://launchpad.net/wicd,Wicd}, a network
|
||
management daemon that aims to simplify wired and wireless networking.
|
||
|
||
This service adds the @var{wicd} package to the global profile, providing
|
||
several commands to interact with the daemon and configure networking:
|
||
@command{wicd-client}, a graphical user interface, and the
|
||
@command{wicd-cli} and @command{wicd-curses} user interfaces.
|
||
@end deffn
|
||
|
||
@cindex ModemManager
|
||
|
||
@defvr {Variable Scheme} modem-manager-service-type
|
||
This is the service type for the
|
||
@uref{https://wiki.gnome.org/Projects/ModemManager, ModemManager}
|
||
service. The value for this service type is a
|
||
@code{modem-manager-configuration} record.
|
||
|
||
Este servicio es parte de @code{%desktop-services} (@pxref{Servicios de escritorio}).
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} modem-manager-configuration
|
||
Tipo de datos que representa la configuración de ModemManager.
|
||
|
||
@table @asis
|
||
@item @code{modem-manager} (predeterminado: @code{modem-manager})
|
||
El paquete de ModemManager usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex NetworkManager
|
||
|
||
@defvr {Variable Scheme} network-manager-service-type
|
||
This is the service type for the
|
||
@uref{https://wiki.gnome.org/Projects/NetworkManager, NetworkManager}
|
||
service. The value for this service type is a
|
||
@code{network-manager-configuration} record.
|
||
|
||
Este servicio es parte de @code{%desktop-services} (@pxref{Servicios de escritorio}).
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} network-manager-configuration
|
||
Tipo de datos que representa la configuración de NetworkManager.
|
||
|
||
@table @asis
|
||
@item @code{network-manager} (predeterminado: @code{network-manager})
|
||
El paquete de NetworkManager usado.
|
||
|
||
@item @code{dns} (predeterminado: @code{"default"})
|
||
Processing mode for DNS, which affects how NetworkManager uses the
|
||
@code{resolv.conf} configuration file.
|
||
|
||
@table @samp
|
||
@item default
|
||
NetworkManager will update @code{resolv.conf} to reflect the nameservers
|
||
provided by currently active connections.
|
||
|
||
@item dnsmasq
|
||
NetworkManager will run @code{dnsmasq} as a local caching nameserver, using
|
||
a "split DNS" configuration if you are connected to a VPN, and then update
|
||
@code{resolv.conf} to point to the local nameserver.
|
||
|
||
@item none
|
||
NetworkManager will not modify @code{resolv.conf}.
|
||
@end table
|
||
|
||
@item @code{vpn-plugins} (predeterminados: @code{'()})
|
||
This is the list of available plugins for virtual private networks (VPNs).
|
||
An example of this is the @code{network-manager-openvpn} package, which
|
||
allows NetworkManager to manage VPNs @i{via} OpenVPN.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex Connman
|
||
@deffn {Variable Scheme} connman-service-type
|
||
This is the service type to run @url{https://01.org/connman,Connman}, a
|
||
network connection manager.
|
||
|
||
Its value must be an @code{connman-configuration} record as in this example:
|
||
|
||
@example
|
||
(service connman-service-type
|
||
(connman-configuration
|
||
(disable-vpn? #t)))
|
||
@end example
|
||
|
||
See below for details about @code{connman-configuration}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} connman-configuration
|
||
Tipo de datos que representa la configuración de connman.
|
||
|
||
@table @asis
|
||
@item @code{connman} (predeterminado: @var{connman})
|
||
El paquete connman usado.
|
||
|
||
@item @code{disable-vpn?} (predeterminado: @code{#f})
|
||
Cuando es verdadero, deshabilita el módulo vpn de connman.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex WPA Supplicant
|
||
@defvr {Variable Scheme} wpa-supplicant-service-type
|
||
This is the service type to run @url{https://w1.fi/wpa_supplicant/,WPA
|
||
supplicant}, an authentication daemon required to authenticate against
|
||
encrypted WiFi or ethernet networks.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} wpa-supplicant-configuration
|
||
Tipo de datos que representa la configuración de WPA Supplicant.
|
||
|
||
Toma los siguientes parámetros:
|
||
|
||
@table @asis
|
||
@item @code{wpa-supplicant} (predeterminado: @code{wpa-supplicant})
|
||
El paquete de WPA Supplicant usado.
|
||
|
||
@item @code{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 fichero con el PID.
|
||
|
||
@item @code{interface} (predeterminado: @code{#f})
|
||
If this is set, it must specify the name of a network interface that WPA
|
||
supplicant will control.
|
||
|
||
@item @code{config-file} (predeterminado: @code{#f})
|
||
Fichero 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 iptables
|
||
@defvr {Variable Scheme} iptables-service-type
|
||
This is the service type to set up an iptables configuration. iptables is a
|
||
packet filtering framework supported by the Linux kernel. This service
|
||
supports configuring iptables for both IPv4 and IPv6. A simple example
|
||
configuration rejecting all incoming connections except those to the ssh
|
||
port 22 is shown below.
|
||
|
||
@lisp
|
||
(service iptables-service-type
|
||
(iptables-configuration
|
||
(ipv4-rules (plain-file "iptables.rules" "*filter
|
||
:INPUT ACCEPT
|
||
:FORWARD ACCEPT
|
||
:OUTPUT 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 -p tcp --dport 22 -j ACCEPT
|
||
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
|
||
COMMIT
|
||
"))))
|
||
@end lisp
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} iptables-configuration
|
||
El tipo de datos que representa la configuración de iptables.
|
||
|
||
@table @asis
|
||
@item @code{iptables} (predeterminado: @code{iptables})
|
||
The iptables package that provides @code{iptables-restore} and
|
||
@code{ip6tables-restore}.
|
||
@item @code{ipv4-rules} (predeterminado: @code{%iptables-accept-all-rules})
|
||
The iptables rules to use. It will be passed to @code{iptables-restore}.
|
||
This may be any ``file-like'' object (@pxref{Expresiones-G, file-like
|
||
objects}).
|
||
@item @code{ipv6-rules} (predeterminadas: @code{%iptables-accept-all-rules})
|
||
The ip6tables rules to use. It will be passed to @code{ip6tables-restore}.
|
||
This may be any ``file-like'' object (@pxref{Expresiones-G, file-like
|
||
objects}).
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex NTP (protocolo de tiempo de red), servicio
|
||
@cindex reloj de tiempo real
|
||
@defvr {Variable Scheme} ntp-service-type
|
||
This is the type of the service running the @uref{http://www.ntp.org,
|
||
Network Time Protocol (NTP)} daemon, @command{ntpd}. The daemon will keep
|
||
the system clock synchronized with that of the specified NTP servers.
|
||
|
||
The value of this service is an @code{ntpd-configuration} object, as
|
||
described below.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} ntp-configuration
|
||
Este es el tipo de datos para la configuración del servicio NTP.
|
||
|
||
@table @asis
|
||
@item @code{servers} (predeterminados: @code{%ntp-servers})
|
||
This is the list of servers (host names) with which @command{ntpd} will be
|
||
synchronized.
|
||
|
||
@item @code{allow-large-adjustment?} (predeterminado: @code{#f})
|
||
This determines whether @command{ntpd} is allowed to make an initial
|
||
adjustment of more than 1,000 seconds.
|
||
|
||
@item @code{ntp} (predeterminado: @code{ntp})
|
||
El paquete NTP usado.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %ntp-servers
|
||
List of host names used as the default NTP servers. These are servers of
|
||
the @uref{https://www.ntppool.org/en/, NTP Pool Project}.
|
||
@end defvr
|
||
|
||
@cindex OpenNTPD
|
||
@deffn {Procedimiento Scheme} openntpd-service-type
|
||
Run the @command{ntpd}, the Network Time Protocol (NTP) daemon, as
|
||
implemented by @uref{http://www.openntpd.org, OpenNTPD}. The daemon will
|
||
keep the system clock synchronized with that of the given servers.
|
||
|
||
@example
|
||
(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/"))
|
||
(allow-large-adjustment? #t)))
|
||
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} openntpd-configuration
|
||
@table @asis
|
||
@item @code{openntpd} (predeterminado: @code{(file-append openntpd "/sbin/ntpd")})
|
||
El ejecutable openntpd usado.
|
||
@item @code{listen-on} (predeterminadas: @code{'("127.0.0.1" "::1")})
|
||
Una lista de direcciones IP o nombres de máquina en los que el daemon ntpd
|
||
debe escuchar conexiones.
|
||
@item @code{query-from} (predeterminadas: @code{'()})
|
||
Una lista de direcciones IP locales que el daemon ntpd debe usar para
|
||
consultas salientes.
|
||
@item @code{sensor} (predeterminados: @code{'()})
|
||
Specify a list of timedelta sensor devices ntpd should use. @code{ntpd}
|
||
will listen to each sensor that acutally exists and ignore non-existant
|
||
ones. See @uref{https://man.openbsd.org/ntpd.conf, upstream documentation}
|
||
for more information.
|
||
@item @code{server} (predeterminadas: @var{%ntp-servers})
|
||
Specify a list of IP addresses or hostnames of NTP servers to synchronize
|
||
to.
|
||
@item @code{servers} (predeterminados: @code{'()})
|
||
Specify a list of IP addresses or hostnames of NTP pools to synchronize to.
|
||
@item @code{constraint-from} (predeterminado: @code{'()})
|
||
@code{ntpd} can be configured to query the ‘Date’ from trusted HTTPS servers
|
||
via TLS. This time information is not used for precision but acts as an
|
||
authenticated constraint, thereby reducing the impact of unauthenticated NTP
|
||
man-in-the-middle attacks. Specify a list of URLs, IP addresses or
|
||
hostnames of HTTPS servers to provide a constraint.
|
||
@item @code{constraints-from} (predeterminadas: @code{'()})
|
||
As with constraint from, specify a list of URLs, IP addresses or hostnames
|
||
of HTTPS servers to provide a constraint. Should the hostname resolve to
|
||
multiple IP addresses, @code{ntpd} will calculate a median constraint from
|
||
all of them.
|
||
@item @code{allow-large-adjustment?} (predeterminado: @code{#f})
|
||
Determines if @code{ntpd} is allowed to make an initial adjustment of more
|
||
than 180 seconds.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex inetd
|
||
@deffn {Variable Scheme} inetd-service-type
|
||
This service runs the @command{inetd} (@pxref{inetd invocation,,, inetutils,
|
||
GNU Inetutils}) daemon. @command{inetd} listens for connections on internet
|
||
sockets, and lazily starts the specified server program when a connection is
|
||
made on one of these sockets.
|
||
|
||
The value of this service is an @code{inetd-configuration} object. The
|
||
following example configures the @command{inetd} daemon to provide the
|
||
built-in @command{echo} service, as well as an smtp service which forwards
|
||
smtp traffic over ssh to a server @code{smtp-server} behind a gateway
|
||
@code{hostname}:
|
||
|
||
@example
|
||
(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/a/la/clave_ssh"
|
||
"-W" "smtp-server:25" "usuaria@@máquina")))))
|
||
@end example
|
||
|
||
See below for more details about @code{inetd-configuration}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} inetd-configuration
|
||
Tipo de datos que representa la configuración de @command{inetd}.
|
||
|
||
@table @asis
|
||
@item @code{program} (predeterminado: @code{(file-append inetutils "/libexec/inetd")})
|
||
El ejecutable @command{inetd} usado.
|
||
|
||
@item @code{entries} (predeterminadas: @code{'()})
|
||
A list of @command{inetd} service entries. Each entry should be created by
|
||
the @code{inetd-entry} constructor.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} inetd-entry
|
||
Data type representing an entry in the @command{inetd} configuration. Each
|
||
entry corresponds to a socket where @command{inetd} will listen for
|
||
requests.
|
||
|
||
@table @asis
|
||
@item @code{node} (predeterminado: @code{#f})
|
||
Optional string, a comma-separated list of local addresses @command{inetd}
|
||
should use when listening for this service. @xref{Configuration file,,,
|
||
inetutils, GNU Inetutils} for a complete description of all options.
|
||
@item @code{name}
|
||
A string, the name must correspond to an entry in @code{/etc/services}.
|
||
@item @code{socket-type}
|
||
One of @code{'stream}, @code{'dgram}, @code{'raw}, @code{'rdm} or
|
||
@code{'seqpacket}.
|
||
@item @code{protocol}
|
||
A string, must correspond to an entry in @code{/etc/protocols}.
|
||
@item @code{wait?} (predeterminado: @code{#t})
|
||
Whether @command{inetd} should wait for the server to exit before listening
|
||
to new service requests.
|
||
@item @code{user}
|
||
A string containing the user (and, optionally, group) name of the user as
|
||
whom the server should run. The group name can be specified in a suffix,
|
||
separated by a colon or period, i.e.@: @code{"user"}, @code{"user:group"} or
|
||
@code{"user.group"}.
|
||
@item @code{program} (predeterminado: @code{"internal"})
|
||
The server program which will serve the requests, or @code{"internal"} if
|
||
@command{inetd} should use a built-in service.
|
||
@item @code{arguments} (predeterminados: @code{'()})
|
||
A list strings or file-like objects, which are the server program's
|
||
arguments, starting with the zeroth argument, i.e.@: the name of the program
|
||
itself. For @command{inetd}'s internal services, this entry must be
|
||
@code{'()} or @code{'("internal")}.
|
||
@end table
|
||
|
||
@xref{Configuration file,,, inetutils, GNU Inetutils} for a more detailed
|
||
discussion of each configuration field.
|
||
@end deftp
|
||
|
||
@cindex Tor
|
||
@defvr {Variable Scheme} tor-service-type
|
||
This is the 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.
|
||
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} tor-configuration
|
||
@table @asis
|
||
@item @code{tor} (predeterminado: @code{tor})
|
||
The package that provides the Tor daemon. This package is expected to
|
||
provide the daemon at @file{bin/tor} relative to its output directory. The
|
||
default package is the @uref{https://www.torproject.org, Tor Project's}
|
||
implementation.
|
||
|
||
@item @code{config-file} (predeterminado: @code{(plain-file "empty" "")})
|
||
The configuration file to use. It will be appended to a default
|
||
configuration file, and the final configuration file will be passed to
|
||
@code{tor} via its @code{-f} option. This may be any ``file-like'' object
|
||
(@pxref{Expresiones-G, file-like objects}). See @code{man tor} for details
|
||
on the configuration file syntax.
|
||
|
||
@item @code{hidden-services} (predeterminados: @code{'()})
|
||
The list of @code{<hidden-service>} records to use. For any hidden service
|
||
you include in this list, appropriate configuration to enable the hidden
|
||
service will be automatically added to the default configuration file. You
|
||
may conveniently create @code{<hidden-service>} records using the
|
||
@code{tor-hidden-service} procedure described below.
|
||
|
||
@item @code{socks-socket-type} (predeterminado: @code{'tcp})
|
||
The default socket type that Tor should use for its SOCKS socket. This must
|
||
be either @code{'tcp} or @code{'unix}. If it is @code{'tcp}, then by
|
||
default Tor will listen on TCP port 9050 on the loopback interface (i.e.,
|
||
localhost). If it is @code{'unix}, then Tor will listen on the UNIX domain
|
||
socket @file{/var/run/tor/socks-sock}, which will be made writable by
|
||
members of the @code{tor} group.
|
||
|
||
If you want to customize the SOCKS socket in more detail, leave
|
||
@code{socks-socket-type} at its default value of @code{'tcp} and use
|
||
@code{config-file} to override the default by providing your own
|
||
@code{SocksPort} option.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex servicio oculto
|
||
@deffn {Procedimiento Scheme} tor-hidden-service @var{nombre} @var{relación}
|
||
Define un @dfn{servicio oculto} Tor llamado @var{nombre} y que implementa la
|
||
@var{¶elación}. @var{relación} es una lista de tuplas puerto/máquina, como:
|
||
|
||
@example
|
||
'((22 "127.0.0.1:22")
|
||
(80 "127.0.0.1:8080"))
|
||
@end example
|
||
|
||
En este ejemplo, el puerto 22 del servicio oculto se asocia con el puerto 22
|
||
local, y el puerto 80 se asocia con el puerto 8080 local.
|
||
|
||
Esto crea un directorio @file{/var/lib/tor/hidden-services/@var{nombre}},
|
||
donde el fichero @file{hostname} contiene el nombre de máquina @code{.onion}
|
||
para el servicio oculto.
|
||
|
||
Véase @uref{https://www.torproject.org/docs/tor-hidden-service.html.en, la
|
||
documentación del proyecto Tor} para más información.
|
||
@end deffn
|
||
|
||
El módulo @code{(gnu services rsync)} proporciona los siguientes servicios:
|
||
|
||
You might want an rsync daemon if you have files that you want available so
|
||
anyone (or just yourself) can download existing files or upload new files.
|
||
|
||
@deffn {Variable Scheme} rsync-service-type
|
||
This is the type for the @uref{https://rsync.samba.org, rsync} rsync daemon,
|
||
@command{rsync-configuration} record as in this example:
|
||
|
||
@example
|
||
(service rsync-service-type)
|
||
@end example
|
||
|
||
See below for details about @code{rsync-configuration}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} rsync-configuration
|
||
Tipo de datos que representa la configuración para @code{rsync-service}.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{rsync})
|
||
Paquete @code{rsync} usado.
|
||
|
||
@item @code{port-number} (predeterminado: @code{873})
|
||
TCP port on which @command{rsync} listens for incoming connections. If port
|
||
is less than @code{1024} @command{rsync} needs to be started as the
|
||
@code{root} user and group.
|
||
|
||
@item @code{pid-file} (predeterminado: @code{"/var/run/rsyncd/rsyncd.pid"})
|
||
Name of the file where @command{rsync} writes its PID.
|
||
|
||
@item @code{lock-file} (predeterminado: @code{"/var/run/rsyncd/rsyncd.lock"})
|
||
Name of the file where @command{rsync} writes its lock file.
|
||
|
||
@item @code{log-file} (predeterminado: @code{"/var/log/rsyncd.log"})
|
||
Name of the file where @command{rsync} writes its log file.
|
||
|
||
@item @code{use-chroot?} (predeterminado: @var{#t})
|
||
Whether to use chroot for @command{rsync} shared directory.
|
||
|
||
@item @code{share-path} (predeterminado: @file{/srv/rsync})
|
||
Location of the @command{rsync} shared directory.
|
||
|
||
@item @code{share-comment} (predeterminado: @code{"Rsync share"})
|
||
Comment of the @command{rsync} shared directory.
|
||
|
||
@item @code{read-only?} (predeterminado: @var{#f})
|
||
Read-write permissions to shared directory.
|
||
|
||
@item @code{timeout} (predeterminado: @code{300})
|
||
I/O timeout in seconds.
|
||
|
||
@item @code{user} (predeterminada: @var{"root"})
|
||
Propietaria del proceso @code{rsync}.
|
||
|
||
@item @code{group} (predeterminado: @var{"root"})
|
||
Grupo del proceso @code{rsync}.
|
||
|
||
@item @code{uid} (predeterminado: @var{"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} (predeterminado: @var{"rsyncd"})
|
||
Nombre o ID de grupo que se usa cuando se accede al módulo.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
Es más, @code{(gnu services ssh)} proporciona los siguientes servicios.
|
||
@cindex SSH
|
||
@cindex servidor SSH
|
||
|
||
@deffn {Procedimiento Scheme} lsh-service [#:host-key "/etc/lsh/host-key"] @
|
||
[#:daemonic? #t] [#:interfaces '()] [#:port-number 22] @
|
||
[#:allow-empty-passwords? #f] [#:root-login? #f] @
|
||
[#:syslog-output? #t] [#:x11-forwarding? #t] @
|
||
[#:tcp/ip-forwarding? #t] [#:password-authentication? #t] @
|
||
[#:public-key-authentication? #t] [#:initialize? #t]
|
||
Ejecuta el programa @command{lshd} de @var{lsh} para escuchar en el puerto
|
||
@var{port-number}. @var{host-key} debe designar a un fichero que contiene la
|
||
clave de la máquina, y que sea legible únicamente por root.
|
||
|
||
When @var{daemonic?} is true, @command{lshd} will detach from the
|
||
controlling terminal and log its output to syslogd, unless one sets
|
||
@var{syslog-output?} to false. Obviously, it also makes lsh-service depend
|
||
on existence of syslogd service. When @var{pid-file?} is true,
|
||
@command{lshd} writes its PID to the file called @var{pid-file}.
|
||
|
||
When @var{initialize?} is true, automatically create the seed and host key
|
||
upon service activation if they do not exist yet. This may take long and
|
||
require interaction.
|
||
|
||
When @var{initialize?} is false, it is up to the user to initialize the
|
||
randomness generator (@pxref{lsh-make-seed,,, lsh, LSH Manual}), and to
|
||
create a key pair with the private key stored in file @var{host-key}
|
||
(@pxref{lshd basics,,, lsh, LSH Manual}).
|
||
|
||
When @var{interfaces} is empty, lshd listens for connections on all the
|
||
network interfaces; otherwise, @var{interfaces} must be a list of host names
|
||
or addresses.
|
||
|
||
@var{allow-empty-passwords?} specifies whether to accept log-ins with empty
|
||
passwords, and @var{root-login?} specifies whether to accept log-ins as
|
||
root.
|
||
|
||
The other options should be self-descriptive.
|
||
@end deffn
|
||
|
||
@cindex SSH
|
||
@cindex servidor SSH
|
||
@deffn {Variable Scheme} openssh-service-type
|
||
This is the type for the @uref{http://www.openssh.org, OpenSSH} secure shell
|
||
daemon, @command{sshd}. Its value must be an @code{openssh-configuration}
|
||
record as in this example:
|
||
|
||
@example
|
||
(service openssh-service-type
|
||
(openssh-configuration
|
||
(x11-forwarding? #t)
|
||
(permit-root-login 'without-password)
|
||
(authorized-keys
|
||
`(("alicia" ,(local-file "alicia.pub"))
|
||
("rober" ,(local-file "rober.pub"))))))
|
||
@end example
|
||
|
||
See below for details about @code{openssh-configuration}.
|
||
|
||
This service can be extended with extra authorized keys, as in this example:
|
||
|
||
@example
|
||
(service-extension openssh-service-type
|
||
(const `(("carlos"
|
||
,(local-file "carlos.pub")))))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} openssh-configuration
|
||
Este es el registro de configuración para @command{sshd} de OpenSSH.
|
||
|
||
@table @asis
|
||
@item @code{pid-file} (predeterminado: @code{"/var/run/sshd.pid"})
|
||
Name of the file where @command{sshd} writes its PID.
|
||
|
||
@item @code{port-number} (predeterminado: @code{22})
|
||
TCP port on which @command{sshd} listens for incoming connections.
|
||
|
||
@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{'without-password}, then root logins are permitted but
|
||
not with password-based authentication.
|
||
|
||
@item @code{allow-empty-passwords?} (predeterminado: @code{#f})
|
||
When true, users with empty passwords may log in. When false, they may not.
|
||
|
||
@item @code{password-authentication?} (predeterminado: @code{#t})
|
||
When true, users may log in with their password. When false, they have
|
||
other authentication methods.
|
||
|
||
@item @code{public-key-authentication?} (predeterminado: @code{#t})
|
||
When true, users may log in using public key authentication. When false,
|
||
users have to use other authentication method.
|
||
|
||
Authorized public keys are stored in @file{~/.ssh/authorized_keys}. This is
|
||
used only by protocol version 2.
|
||
|
||
@item @code{x11-forwarding?} (predeterminado: @code{#f})
|
||
When true, forwarding of X11 graphical client connections is enabled---in
|
||
other words, @command{ssh} options @option{-X} and @option{-Y} will work.
|
||
|
||
@item @code{allow-agent-forwarding?} (predeterminado: @code{#t})
|
||
Whether to allow agent forwarding.
|
||
|
||
@item @code{allow-tcp-forwarding?} (predeterminado: @code{#t})
|
||
Whether to allow TCP forwarding.
|
||
|
||
@item @code{gateway-ports?} (predeterminado: @code{#f})
|
||
Whether to allow gateway ports.
|
||
|
||
@item @code{challenge-response-authentication?} (predeterminado: @code{#f})
|
||
Specifies whether challenge response authentication is allowed (e.g.@: via
|
||
PAM).
|
||
|
||
@item @code{use-pam?} (predeterminado: @code{#t})
|
||
Enables the Pluggable Authentication Module interface. If set to @code{#t},
|
||
this will enable PAM authentication using
|
||
@code{challenge-response-authentication?} and
|
||
@code{password-authentication?}, in addition to PAM account and session
|
||
module processing for all authentication types.
|
||
|
||
Because PAM challenge response authentication usually serves an equivalent
|
||
role to password authentication, you should disable either
|
||
@code{challenge-response-authentication?} or
|
||
@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"))})
|
||
Configures external subsystems (e.g.@: file transfer daemon).
|
||
|
||
This is a list of two-element lists, each of which containing the subsystem
|
||
name and a command (with optional arguments) to execute upon subsystem
|
||
request.
|
||
|
||
The command @command{internal-sftp} implements an in-process SFTP server.
|
||
Alternately, one can specify the @command{sftp-server} command:
|
||
@example
|
||
(service openssh-service-type
|
||
(openssh-configuration
|
||
(subsystems
|
||
`(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))
|
||
@end example
|
||
|
||
@item @code{accepted-environment} (predeterminado: @code{'()})
|
||
List of strings describing which environment variables may be exported.
|
||
|
||
Each string gets on its own line. See the @code{AcceptEnv} option in
|
||
@code{man sshd_config}.
|
||
|
||
This example allows ssh-clients to export the @code{COLORTERM} variable. It
|
||
is set by terminal emulators, which support colors. You can use it in your
|
||
shell's ressource file to enable colors for the prompt and commands if this
|
||
variable is set.
|
||
|
||
@example
|
||
(service openssh-service-type
|
||
(openssh-configuration
|
||
(accepted-environment '("COLORTERM"))))
|
||
@end example
|
||
|
||
@item @code{authorized-keys} (predeterminadas: @code{'()})
|
||
@cindex claves autorizadas, SSH
|
||
@cindex SSH, claves autorizadas
|
||
This is the list of authorized keys. Each element of the list is a user
|
||
name followed by one or more file-like objects that represent SSH public
|
||
keys. For example:
|
||
|
||
@example
|
||
(openssh-configuration
|
||
(authorized-keys
|
||
`(("rekado" ,(local-file "rekado.pub"))
|
||
("chris" ,(local-file "chris.pub"))
|
||
("root" ,(local-file "rekado.pub") ,(local-file "chris.pub")))))
|
||
@end example
|
||
|
||
@noindent
|
||
registers the specified public keys for user accounts @code{rekado},
|
||
@code{chris}, and @code{root}.
|
||
|
||
Additional authorized keys can be specified @i{via}
|
||
@code{service-extension}.
|
||
|
||
Note that this does @emph{not} interfere with the use of
|
||
@file{~/.ssh/authorized_keys}.
|
||
|
||
@item @code{log-level} (predeterminado: @code{'info})
|
||
This is a symbol specifying the logging level: @code{quiet}, @code{fatal},
|
||
@code{error}, @code{info}, @code{verbose}, @code{debug}, etc. See the man
|
||
page for @file{sshd_config} for the full list of level names.
|
||
|
||
@item @code{extra-content} (predeterminado: @code{""})
|
||
This field can be used to append arbitrary text to the configuration file.
|
||
It is especially useful for elaborate configurations that cannot be
|
||
expressed otherwise. This configuration, for example, would generally
|
||
disable root logins, but permit them from one specific IP address:
|
||
|
||
@example
|
||
(openssh-configuration
|
||
(extra-content "\
|
||
Match Address 192.168.0.1
|
||
PermitRootLogin yes"))
|
||
@end example
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} dropbear-service [@var{config}]
|
||
Run the @uref{https://matt.ucc.asn.au/dropbear/dropbear.html,Dropbear SSH
|
||
daemon} with the given @var{config}, a @code{<dropbear-configuration>}
|
||
object.
|
||
|
||
For example, to specify a Dropbear service listening on port 1234, add this
|
||
call to the operating system's @code{services} field:
|
||
|
||
@example
|
||
(dropbear-service (dropbear-configuration
|
||
(port-number 1234)))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} dropbear-configuration
|
||
This data type represents the configuration of a Dropbear SSH daemon.
|
||
|
||
@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})
|
||
Whether to enable syslog output.
|
||
|
||
@item @code{pid-file} (predeterminado: @code{"/var/run/dropbear.pid"})
|
||
File name of the daemon's PID file.
|
||
|
||
@item @code{root-login?} (predeterminado: @code{#f})
|
||
Whether to allow @code{root} logins.
|
||
|
||
@item @code{allow-empty-passwords?} (predeterminado: @code{#f})
|
||
Whether to allow empty passwords.
|
||
|
||
@item @code{password-authentication?} (predeterminado: @code{#t})
|
||
Whether to enable password-based authentication.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %facebook-host-aliases
|
||
This variable contains a string for use in @file{/etc/hosts} (@pxref{Host
|
||
Names,,, libc, The GNU C Library Reference Manual}). Each line contains a
|
||
entry that maps a known server name of the Facebook on-line service---e.g.,
|
||
@code{www.facebook.com}---to the local host---@code{127.0.0.1} or its IPv6
|
||
equivalent, @code{::1}.
|
||
|
||
This variable is typically used in the @code{hosts-file} field of an
|
||
@code{operating-system} declaration (@pxref{Referencia de ``operating-system'',
|
||
@file{/etc/hosts}}):
|
||
|
||
@example
|
||
(use-modules (gnu) (guix))
|
||
|
||
(operating-system
|
||
(host-name "micompu")
|
||
;; ...
|
||
(hosts-file
|
||
;; Crea un fichero /etc/hosts file con alias para "localhost"
|
||
;; y "micompu", así como los servidores de facebook.
|
||
(plain-file "hosts"
|
||
(string-append (local-host-aliases host-name)
|
||
%facebook-host-aliases))))
|
||
@end example
|
||
|
||
Este mecanismo puede impedir a los programas que se ejecutan localmente,
|
||
como navegadores Web, el acceso a Facebook.
|
||
@end defvr
|
||
|
||
El módulo @code{(gnu services avahi)} proporciona la siguiente definición.
|
||
|
||
@defvr {Scheme Variable} avahi-service-type
|
||
This is the service that runs @command{avahi-daemon}, a system-wide
|
||
mDNS/DNS-SD responder that allows for service discovery and
|
||
``zero-configuration'' host name lookups (see @uref{http://avahi.org/}).
|
||
Its value must be a @code{zero-configuration} record---see below.
|
||
|
||
This service extends the name service cache daemon (nscd) so that it can
|
||
resolve @code{.local} host names using
|
||
@uref{http://0pointer.de/lennart/projects/nss-mdns/, nss-mdns}. @xref{Selector de servicios de nombres}, for information on host name resolution.
|
||
|
||
Additionally, add the @var{avahi} package to the system profile so that
|
||
commands such as @command{avahi-browse} are directly usable.
|
||
@end defvr
|
||
|
||
@deftp {Data Type} avahi-configuration
|
||
Data type representation the configuration for Avahi.
|
||
|
||
@table @asis
|
||
|
||
@item @code{host-name} (default: @code{#f})
|
||
If different from @code{#f}, use that as the host name to publish for this
|
||
machine; otherwise, use the machine's actual host name.
|
||
|
||
@item @code{publish?} (default: @code{#t})
|
||
When true, allow host names and services to be published (broadcast) over
|
||
the network.
|
||
|
||
@item @code{publish-workstation?} (default: @code{#t})
|
||
When true, @command{avahi-daemon} publishes the machine's host name and IP
|
||
address via mDNS on the local network. To view the host names published on
|
||
your local network, you can run:
|
||
|
||
@example
|
||
avahi-browse _workstation._tcp
|
||
@end example
|
||
|
||
@item @code{wide-area?} (default: @code{#f})
|
||
When true, DNS-SD over unicast DNS is enabled.
|
||
|
||
@item @code{ipv4?} (default: @code{#t})
|
||
@itemx @code{ipv6?} (default: @code{#t})
|
||
These fields determine whether to use IPv4/IPv6 sockets.
|
||
|
||
@item @code{domains-to-browse} (default: @code{'()})
|
||
This is a list of domains to browse.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Variable Scheme} openvswitch-service-type
|
||
This is the type of the @uref{http://www.openvswitch.org, Open vSwitch}
|
||
service, whose value should be an @code{openvswitch-configuration} object.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} openvswitch-configuration
|
||
Data type representing the configuration of Open vSwitch, a multilayer
|
||
virtual switch which is designed to enable massive network automation
|
||
through programmatic extension.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{openvswitch})
|
||
Package object of the Open vSwitch.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Sistema X Window
|
||
@subsection Sistema X Window
|
||
|
||
@cindex X11
|
||
@cindex Sistema de ventanas X
|
||
@cindex gestor de ingreso en el sistema
|
||
Support for the X Window graphical display system---specifically Xorg---is
|
||
provided by the @code{(gnu services xorg)} module. Note that there is no
|
||
@code{xorg-service} procedure. Instead, the X server is started by the
|
||
@dfn{login manager}, by default the GNOME Display Manager (GDM).
|
||
|
||
@cindex GDM
|
||
@cindex GNOME, login manager
|
||
GDM of course allows users to log in into window managers and desktop
|
||
environments other than GNOME; for those using GNOME, GDM is required for
|
||
features such as automatic screen locking.
|
||
|
||
@cindex gestor de ventanas
|
||
To use X11, you must install at least one @dfn{window manager}---for example
|
||
the @code{windowmaker} or @code{openbox} packages---preferably by adding it
|
||
to the @code{packages} field of your operating system definition
|
||
(@pxref{Referencia de ``operating-system'', system-wide packages}).
|
||
|
||
@defvr {Scheme Variable} gdm-service-type
|
||
This is the type for the @uref{https://wiki.gnome.org/Projects/GDM/, GNOME
|
||
Desktop Manager} (GDM), a program that manages graphical display servers and
|
||
handles graphical user logins. Its value must be a @code{gdm-configuration}
|
||
(see below.)
|
||
|
||
@cindex tipos de sesión (X11)
|
||
@cindex X11, tipos de sesión
|
||
GDM looks for @dfn{session types} described by the @file{.desktop} files in
|
||
@file{/run/current-system/profile/share/xsessions} and allows users to
|
||
choose a session from the log-in screen. Packages such as @code{gnome},
|
||
@code{xfce}, and @code{i3} provide @file{.desktop} files; adding them to the
|
||
system-wide set of packages automatically makes them available at the log-in
|
||
screen.
|
||
|
||
In addition, @file{~/.xsession} files are honored. When available,
|
||
@file{~/.xsession} must be an executable that starts a window manager and/or
|
||
other X clients.
|
||
@end defvr
|
||
|
||
@deftp {Data Type} gdm-configuration
|
||
@table @asis
|
||
@item @code{auto-login?} (predeterminado: @code{#f})
|
||
@itemx @code{default-user} (default: @code{#f})
|
||
When @code{auto-login?} is false, GDM presents a log-in screen.
|
||
|
||
When @code{auto-login?} is true, GDM logs in directly as
|
||
@code{default-user}.
|
||
|
||
@item @code{gnome-shell-assets} (default: ...)
|
||
List of GNOME Shell assets needed by GDM: icon theme, fonts, etc.
|
||
|
||
@item @code{xorg-configuration} (default: @code{(xorg-configuration)})
|
||
Configuration of the Xorg graphical server.
|
||
|
||
@item @code{xsession} (default: @code{(xinitrc)})
|
||
Script to run before starting a X session.
|
||
|
||
@item @code{dbus-daemon} (default: @code{dbus-daemon-wrapper})
|
||
File name of the @code{dbus-daemon} executable.
|
||
|
||
@item @code{gdm} (default: @code{gdm})
|
||
The GDM package to use.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} slim-service-type
|
||
Este es el tipo para el gestor de ingreso al sistema gráfico para X11 SLiM.
|
||
|
||
Like GDM, SLiM looks for session types described by @file{.desktop} files
|
||
and allows users to choose a session from the log-in screen using @kbd{F1}.
|
||
It also honors @file{~/.xsession} files.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} slim-configuration
|
||
Data type representing the configuration of @code{slim-service-type}.
|
||
|
||
@table @asis
|
||
@item @code{allow-empty-passwords?} (predeterminado: @code{#t})
|
||
Whether to allow logins with empty passwords.
|
||
|
||
@item @code{auto-login?} (predeterminado: @code{#f})
|
||
@itemx @code{default-user} (predeterminado: @code{""})
|
||
When @code{auto-login?} is false, SLiM presents a log-in screen.
|
||
|
||
When @code{auto-login?} is true, SLiM logs in directly as
|
||
@code{default-user}.
|
||
|
||
@item @code{theme} (predeterminado: @code{%default-slim-theme})
|
||
@itemx @code{theme-name} (predeterminado: @code{%default-slim-theme-name})
|
||
The graphical theme to use and its name.
|
||
|
||
@item @code{auto-login-session} (predeterminado: @code{#f})
|
||
If true, this must be the name of the executable to start as the default
|
||
session---e.g., @code{(file-append windowmaker "/bin/windowmaker")}.
|
||
|
||
If false, a session described by one of the available @file{.desktop} files
|
||
in @code{/run/current-system/profile} and @code{~/.guix-profile} will be
|
||
used.
|
||
|
||
@quotation Nota
|
||
You must install at least one window manager in the system profile or in
|
||
your user profile. Failing to do that, if @code{auto-login-session} is
|
||
false, you will be unable to log in.
|
||
@end quotation
|
||
|
||
@item @code{xorg-configuration} (default @code{(xorg-configuration)})
|
||
Configuration of the Xorg graphical server.
|
||
|
||
@item @code{xauth} (predeterminado: @code{xauth})
|
||
El paquete XAuth usado.
|
||
|
||
@item @code{shepherd} (predeterminado: @code{shepherd})
|
||
The Shepherd package used when invoking @command{halt} and @command{reboot}.
|
||
|
||
@item @code{sessreg} (predeterminado: @code{sessreg})
|
||
The sessreg package used in order to register the session.
|
||
|
||
@item @code{slim} (predeterminado: @code{slim})
|
||
El paquete SLiM usado.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %default-theme
|
||
@defvrx {Variable Scheme} %default-theme-name
|
||
The default SLiM theme and its name.
|
||
@end defvr
|
||
|
||
|
||
@deftp {Tipo de datos} sddm-configuration
|
||
This is the data type representing the sddm service configuration.
|
||
|
||
@table @asis
|
||
@item @code{display-server} (predeterminado: "x11")
|
||
Select display server to use for the greeter. Valid values are "x11" or
|
||
"wayland".
|
||
|
||
@item @code{numlock} (predeterminado: "on")
|
||
Valid values are "on", "off" or "none".
|
||
|
||
@item @code{halt-command} (predeterminado @code{#~(string-apppend #$shepherd "/sbin/halt")})
|
||
Command to run when halting.
|
||
|
||
@item @code{reboot-command} (predeterminado @code{#~(string-append #$shepherd "/sbin/reboot")})
|
||
Command to run when rebooting.
|
||
|
||
@item @code{theme} (predeterminado "maldives")
|
||
Theme to use. Default themes provided by SDDM are "elarun" or "maldives".
|
||
|
||
@item @code{themes-directory} (predeterminado "/run/current-system/profile/share/sddm/themes")
|
||
Directory to look for themes.
|
||
|
||
@item @code{faces-directory} (predeterminado "/run/current-system/profile/share/sddm/faces")
|
||
Directory to look for faces.
|
||
|
||
@item @code{default-path} (predeterminado "/run/current-system/profile/bin")
|
||
Default PATH to use.
|
||
|
||
@item @code{minimum-uid} (predeterminado 1000)
|
||
Minimum UID to display in SDDM.
|
||
|
||
@item @code{maximum-uid} (predeterminado 2000)
|
||
Maximum UID to display in SDDM
|
||
|
||
@item @code{remember-last-user?} (predeterminado #t)
|
||
Remember last user.
|
||
|
||
@item @code{remember-last-session?} (predeterminado #t)
|
||
Remember last session.
|
||
|
||
@item @code{hide-users} (predeterminado "")
|
||
Usernames to hide from SDDM greeter.
|
||
|
||
@item @code{hide-shells} (predeterminado @code{#~(string-append #$shadow "/sbin/nologin")})
|
||
Users with shells listed will be hidden from the SDDM greeter.
|
||
|
||
@item @code{session-command} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/wayland-session")})
|
||
Script to run before starting a wayland session.
|
||
|
||
@item @code{sessions-directory} (predeterminado "/run/current-system/profile/share/wayland-sessions")
|
||
Directory to look for desktop files starting wayland sessions.
|
||
|
||
@item @code{xorg-configuration} (default @code{(xorg-configuration)})
|
||
Configuration of the Xorg graphical server.
|
||
|
||
@item @code{xauth-path} (predeterminado @code{#~(string-append #$xauth "/bin/xauth")})
|
||
Path to xauth.
|
||
|
||
@item @code{xephyr-path} (predeterminado @code{#~(string-append #$xorg-server "/bin/Xephyr")})
|
||
Path to Xephyr.
|
||
|
||
@item @code{xdisplay-start} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/Xsetup")})
|
||
Script to run after starting xorg-server.
|
||
|
||
@item @code{xdisplay-stop} (predeterminado @code{#~(string-append #$sddm "/share/sddm/scripts/Xstop")})
|
||
Script to run before stopping xorg-server.
|
||
|
||
@item @code{xsession-command} (predeterminado: @code{xinitrc})
|
||
Script to run before starting a X session.
|
||
|
||
@item @code{xsessions-directory} (predeterminado: "/run/current-system/profile/share/xsessions")
|
||
Directory to look for desktop files starting X sessions.
|
||
|
||
@item @code{minimum-vt} (predeterminado: 7)
|
||
Minimum VT to use.
|
||
|
||
@item @code{auto-login-user} (predeterminado "")
|
||
User to use for auto-login.
|
||
|
||
@item @code{auto-login-session} (predeterminado "")
|
||
Desktop file to use for auto-login.
|
||
|
||
@item @code{relogin?} (predeterminado #f)
|
||
Relogin after logout.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex gestor de ingreso en el sistema
|
||
@cindex X11, ingreso al sistema
|
||
@deffn {Procedimiento Scheme} sddm-service config
|
||
Return a service that spawns the SDDM graphical login manager for config of
|
||
type @code{<sddm-configuration>}.
|
||
|
||
@example
|
||
(sddm-service (sddm-configuration
|
||
(auto-login-user "Alicia")
|
||
(auto-login-session "xfce.desktop")))
|
||
@end example
|
||
@end deffn
|
||
|
||
@cindex Xorg, configuration
|
||
@deftp {Data Type} xorg-configuration
|
||
This data type represents the configuration of the Xorg graphical display
|
||
server. Note that there is not Xorg service; instead, the X server is
|
||
started by a ``display manager'' such as GDM, SDDM, and SLiM. Thus, the
|
||
configuration of these display managers aggregates an
|
||
@code{xorg-configuration} record.
|
||
|
||
@table @asis
|
||
@item @code{modules} (default: @code{%default-xorg-modules})
|
||
This is a list of @dfn{module packages} loaded by the Xorg server---e.g.,
|
||
@code{xf86-video-vesa}, @code{xf86-input-keyboard}, and so on.
|
||
|
||
@item @code{fonts} (default: @code{%default-xorg-fonts})
|
||
This is a list of font directories to add to the server's @dfn{font path}.
|
||
|
||
@item @code{drivers} (default: @code{'()})
|
||
This must be either the empty list, in which case Xorg chooses a graphics
|
||
driver automatically, or a list of driver names that will be tried in this
|
||
order---e.g., @code{("modesetting" "vesa")}.
|
||
|
||
@item @code{resolutions} (default: @code{'()})
|
||
When @code{resolutions} is the empty list, Xorg chooses an appropriate
|
||
screen resolution. Otherwise, it must be a list of resolutions---e.g.,
|
||
@code{((1024 768) (640 480))}.
|
||
|
||
@cindex keyboard layout, for Xorg
|
||
@cindex keymap, for Xorg
|
||
@item @code{keyboard-layout} (predeterminada: @code{#f})
|
||
If this is @code{#f}, Xorg 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 in use when Xorg is running. @xref{Distribución de teclado}, for
|
||
more information on how to specify the keyboard layout.
|
||
|
||
@item @code{extra-config} (default: @code{'()})
|
||
This is a list of strings or objects appended to the configuration file. It
|
||
is used to pass extra text to be added verbatim to the configuration file.
|
||
|
||
@item @code{server} (default: @code{xorg-server})
|
||
This is the package providing the Xorg server.
|
||
|
||
@item @code{server-arguments} (default: @code{%default-xorg-server-arguments})
|
||
This is the list of command-line arguments to pass to the X server. The
|
||
default is @code{-nolisten tcp}.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Scheme Procedure} set-xorg-configuration @var{config} @
|
||
[@var{login-manager-service-type}] Tell the log-in manager (of type
|
||
@var{login-manager-service-type}) to use @var{config}, an
|
||
<xorg-configuration> record.
|
||
|
||
Since the Xorg configuration is embedded in the log-in manager's
|
||
configuration---e.g., @code{gdm-configuration}---this procedure provides a
|
||
shorthand to set the Xorg configuration.
|
||
@end deffn
|
||
|
||
@deffn {Scheme Procedure} xorg-start-command [@var{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}.
|
||
|
||
Usually the X server is started by a login manager.
|
||
@end deffn
|
||
|
||
|
||
@deffn {Procedimiento Scheme} screen-locker-service @var{paquete} [@var{programa}]
|
||
Añade @var{paquete}, un paquete para un bloqueador de sesión o un
|
||
salvapantallas cuya orden es @var{programa}, al conjunto de programas setuid
|
||
y añade una entrada PAM para él. Por ejemplo:
|
||
|
||
@lisp
|
||
(screen-locker-service xlockmore "xlock")
|
||
@end lisp
|
||
|
||
permite usar el viejo XlockMore.
|
||
@end deffn
|
||
|
||
|
||
@node Servicios de impresión
|
||
@subsection Servicios de impresión
|
||
|
||
@cindex printer support with CUPS
|
||
The @code{(gnu services cups)} module provides a Guix service definition for
|
||
the CUPS printing service. To add printer support to a Guix system, add a
|
||
@code{cups-service} to the operating system definition:
|
||
|
||
@deffn {Variable Scheme} cups-service-type
|
||
The service type for the CUPS print server. Its value should be a valid
|
||
CUPS configuration (see below). To use the default settings, simply write:
|
||
@example
|
||
(service cups-service-type)
|
||
@end example
|
||
@end deffn
|
||
|
||
The CUPS configuration controls the basic things about your CUPS
|
||
installation: what interfaces it listens on, what to do if a print job
|
||
fails, how much logging to do, and so on. To actually add a printer, you
|
||
have to visit the @url{http://localhost:631} URL, or use a tool such as
|
||
GNOME's printer configuration services. By default, configuring a CUPS
|
||
service will generate a self-signed certificate if needed, for secure
|
||
connections to the print server.
|
||
|
||
Suppose you want to enable the Web interface of CUPS and also add support
|
||
for Epson printers @i{via} the @code{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):
|
||
|
||
@example
|
||
(service cups-service-type
|
||
(cups-configuration
|
||
(web-interface? #t)
|
||
(extensions
|
||
(list cups-filters escpr hplip-minimal))))
|
||
@end example
|
||
|
||
Note: 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.
|
||
|
||
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. There is
|
||
also a way to specify the configuration as a string, if you have an old
|
||
@code{cupsd.conf} file that you want to port over from some other system;
|
||
see the end for more details.
|
||
|
||
@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.
|
||
|
||
|
||
Available @code{cups-configuration} fields are:
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} package cups
|
||
El paquete CUPS.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} package-list extensions
|
||
Drivers and other extensions to the CUPS package.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} files-configuration files-configuration
|
||
Configuration of where to write logs, what directories to use for print
|
||
spools, and related privileged configuration parameters.
|
||
|
||
Available @code{files-configuration} fields are:
|
||
|
||
@deftypevr {@code{files-configuration} parameter} log-location access-log
|
||
Defines the access log filename. Specifying a blank filename disables
|
||
access log generation. The value @code{stderr} causes log entries to be
|
||
sent to the standard error file when the scheduler is running in the
|
||
foreground, or to the system log daemon when run in the background. The
|
||
value @code{syslog} causes log entries to be sent to the system log daemon.
|
||
The server name may be included in filenames using the string @code{%s}, as
|
||
in @code{/var/log/cups/%s-access_log}.
|
||
|
||
Defaults to @samp{"/var/log/cups/access_log"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} file-name cache-dir
|
||
Where CUPS should cache data.
|
||
|
||
Defaults to @samp{"/var/cache/cups"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string config-file-perm
|
||
Specifies the permissions for all configuration files that the scheduler
|
||
writes.
|
||
|
||
Note that the permissions for the printers.conf file are currently masked to
|
||
only allow access from the scheduler user (typically root). This is done
|
||
because printer device URIs sometimes contain sensitive authentication
|
||
information that should not be generally known on the system. There is no
|
||
way to disable this security feature.
|
||
|
||
Defaults to @samp{"0640"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} log-location error-log
|
||
Defines the error log filename. Specifying a blank filename disables access
|
||
log generation. The value @code{stderr} causes log entries to be sent to
|
||
the standard error file when the scheduler is running in the foreground, or
|
||
to the system log daemon when run in the background. The value
|
||
@code{syslog} causes log entries to be sent to the system log daemon. The
|
||
server name may be included in filenames using the string @code{%s}, as in
|
||
@code{/var/log/cups/%s-error_log}.
|
||
|
||
Defaults to @samp{"/var/log/cups/error_log"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string fatal-errors
|
||
Specifies which errors are fatal, causing the scheduler to exit. The kind
|
||
strings are:
|
||
|
||
@table @code
|
||
@item none
|
||
No errors are fatal.
|
||
|
||
@item all
|
||
All of the errors below are fatal.
|
||
|
||
@item browse
|
||
Browsing initialization errors are fatal, for example failed connections to
|
||
the DNS-SD daemon.
|
||
|
||
@item config
|
||
Configuration file syntax errors are fatal.
|
||
|
||
@item listen
|
||
Listen or Port errors are fatal, except for IPv6 failures on the loopback or
|
||
@code{any} addresses.
|
||
|
||
@item log
|
||
Log file creation or write errors are fatal.
|
||
|
||
@item permissions
|
||
Bad startup file permissions are fatal, for example shared TLS certificate
|
||
and key files with world-read permissions.
|
||
@end table
|
||
|
||
Defaults to @samp{"all -browse"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} boolean file-device?
|
||
Specifies whether the file pseudo-device can be used for new printer
|
||
queues. The URI @uref{file:///dev/null} is always allowed.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string group
|
||
Specifies the group name or ID that will be used when executing external
|
||
programs.
|
||
|
||
Defaults to @samp{"lp"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string log-file-perm
|
||
Specifies the permissions for all log files that the scheduler writes.
|
||
|
||
Defaults to @samp{"0644"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} log-location page-log
|
||
Defines the page log filename. Specifying a blank filename disables access
|
||
log generation. The value @code{stderr} causes log entries to be sent to
|
||
the standard error file when the scheduler is running in the foreground, or
|
||
to the system log daemon when run in the background. The value
|
||
@code{syslog} causes log entries to be sent to the system log daemon. The
|
||
server name may be included in filenames using the string @code{%s}, as in
|
||
@code{/var/log/cups/%s-page_log}.
|
||
|
||
Defaults to @samp{"/var/log/cups/page_log"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string remote-root
|
||
Specifies the username that is associated with unauthenticated accesses by
|
||
clients claiming to be the root user. The default is @code{remroot}.
|
||
|
||
Defaults to @samp{"remroot"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} file-name request-root
|
||
Specifies the directory that contains print jobs and other HTTP request
|
||
data.
|
||
|
||
Defaults to @samp{"/var/spool/cups"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} sandboxing sandboxing
|
||
Specifies the level of security sandboxing that is applied to print filters,
|
||
backends, and other child processes of the scheduler; either @code{relaxed}
|
||
or @code{strict}. This directive is currently only used/supported on macOS.
|
||
|
||
Defaults to @samp{strict}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} file-name server-keychain
|
||
Specifies the location of TLS certificates and private keys. CUPS will look
|
||
for public and private keys in this directory: a @code{.crt} files for
|
||
PEM-encoded certificates and corresponding @code{.key} files for PEM-encoded
|
||
private keys.
|
||
|
||
Defaults to @samp{"/etc/cups/ssl"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} file-name server-root
|
||
Specifies the directory containing the server configuration files.
|
||
|
||
Defaults to @samp{"/etc/cups"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} boolean sync-on-close?
|
||
Specifies whether the scheduler calls fsync(2) after writing configuration
|
||
or state files.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} space-separated-string-list system-group
|
||
Specifies the group(s) to use for @code{@@SYSTEM} group authentication.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} file-name temp-dir
|
||
Specifies the directory where temporary files are stored.
|
||
|
||
Defaults to @samp{"/var/spool/cups/tmp"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{files-configuration} parameter} string user
|
||
Specifies the user name or ID that is used when running external programs.
|
||
|
||
Defaults to @samp{"lp"}.
|
||
@end deftypevr
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} access-log-level access-log-level
|
||
Specifies the logging level for the AccessLog file. The @code{config} level
|
||
logs when printers and classes are added, deleted, or modified and when
|
||
configuration files are accessed or updated. The @code{actions} level logs
|
||
when print jobs are submitted, held, released, modified, or canceled, and
|
||
any of the conditions for @code{config}. The @code{all} level logs all
|
||
requests.
|
||
|
||
Defaults to @samp{actions}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean auto-purge-jobs?
|
||
Specifies whether to purge job history data automatically when it is no
|
||
longer required for quotas.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} browse-local-protocols browse-local-protocols
|
||
Specifies which protocols to use for local printer sharing.
|
||
|
||
Defaults to @samp{dnssd}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean browse-web-if?
|
||
Specifies whether the CUPS web interface is advertised.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean browsing?
|
||
Specifies whether shared printers are advertised.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string classification
|
||
Specifies the security classification of the server. Any valid banner name
|
||
can be used, including "classified", "confidential", "secret", "topsecret",
|
||
and "unclassified", or the banner can be omitted to disable secure printing
|
||
functions.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean classify-override?
|
||
Specifies whether users may override the classification (cover page) of
|
||
individual print jobs using the @code{job-sheets} option.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} default-auth-type default-auth-type
|
||
Specifies the default type of authentication to use.
|
||
|
||
Defaults to @samp{Basic}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} default-encryption default-encryption
|
||
Specifies whether encryption will be used for authenticated requests.
|
||
|
||
Defaults to @samp{Required}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string default-language
|
||
Specifies the default language to use for text and web content.
|
||
|
||
Defaults to @samp{"en"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string default-paper-size
|
||
Specifies the default paper size for new print queues. @samp{"Auto"} uses a
|
||
locale-specific default, while @samp{"None"} specifies there is no default
|
||
paper size. Specific size names are typically @samp{"Letter"} or
|
||
@samp{"A4"}.
|
||
|
||
Defaults to @samp{"Auto"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string default-policy
|
||
Specifies the default access policy to use.
|
||
|
||
Defaults to @samp{"default"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean default-shared?
|
||
Specifies whether local printers are shared by default.
|
||
|
||
Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer dirty-clean-interval
|
||
Specifies the delay for updating of configuration and state files, in
|
||
seconds. A value of 0 causes the update to happen as soon as possible,
|
||
typically within a few milliseconds.
|
||
|
||
El valor predeterminado es @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} error-policy error-policy
|
||
Specifies what to do when an error occurs. Possible values are
|
||
@code{abort-job}, which will discard the failed print job; @code{retry-job},
|
||
which will retry the job at a later time; @code{retry-this-job}, which
|
||
retries the failed job immediately; and @code{stop-printer}, which stops the
|
||
printer.
|
||
|
||
Defaults to @samp{stop-printer}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer filter-limit
|
||
Specifies the maximum cost of filters that are run concurrently, which can
|
||
be used to minimize disk, memory, and CPU resource problems. A limit of 0
|
||
disables filter limiting. An average print to a non-PostScript printer
|
||
needs a filter limit of about 200. A PostScript printer needs about half
|
||
that (100). Setting the limit below these thresholds will effectively limit
|
||
the scheduler to printing a single job at any time.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer filter-nice
|
||
Specifies the scheduling priority of filters that are run to print a job.
|
||
The nice value ranges from 0, the highest priority, to 19, the lowest
|
||
priority.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} host-name-lookups host-name-lookups
|
||
Specifies whether to do reverse lookups on connecting clients. The
|
||
@code{double} setting causes @code{cupsd} to verify that the hostname
|
||
resolved from the address matches one of the addresses returned for that
|
||
hostname. Double lookups also prevent clients with unregistered addresses
|
||
from connecting to your server. Only set this option to @code{#t} or
|
||
@code{double} if absolutely required.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer job-kill-delay
|
||
Specifies the number of seconds to wait before killing the filters and
|
||
backend associated with a canceled or held job.
|
||
|
||
El valor predeterminado es @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer job-retry-interval
|
||
Specifies the interval between retries of jobs in seconds. This is
|
||
typically used for fax queues but can also be used with normal print queues
|
||
whose error policy is @code{retry-job} or @code{retry-current-job}.
|
||
|
||
El valor predeterminado es @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer job-retry-limit
|
||
Specifies the number of retries that are done for jobs. This is typically
|
||
used for fax queues but can also be used with normal print queues whose
|
||
error policy is @code{retry-job} or @code{retry-current-job}.
|
||
|
||
Defaults to @samp{5}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean keep-alive?
|
||
Specifies whether to support HTTP keep-alive connections.
|
||
|
||
Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer keep-alive-timeout
|
||
Specifies how long an idle client connection remains open, in seconds.
|
||
|
||
El valor predeterminado es @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer limit-request-body
|
||
Specifies the maximum size of print files, IPP requests, and HTML form
|
||
data. A limit of 0 disables the limit check.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} multiline-string-list listen
|
||
Listens on the specified interfaces for connections. Valid values are of
|
||
the form @var{address}:@var{port}, where @var{address} is either an IPv6
|
||
address enclosed in brackets, an IPv4 address, or @code{*} to indicate all
|
||
addresses. Values can also be file names of local UNIX domain sockets. The
|
||
Listen directive is similar to the Port directive but allows you to restrict
|
||
access to specific interfaces or networks.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer listen-back-log
|
||
Specifies the number of pending connections that will be allowed. This
|
||
normally only affects very busy servers that have reached the MaxClients
|
||
limit, but can also be triggered by large numbers of simultaneous
|
||
connections. When the limit is reached, the operating system will refuse
|
||
additional connections until the scheduler can accept the pending ones.
|
||
|
||
Defaults to @samp{128}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} location-access-control-list location-access-controls
|
||
Specifies a set of additional access controls.
|
||
|
||
Available @code{location-access-controls} fields are:
|
||
|
||
@deftypevr {@code{location-access-controls} parameter} file-name path
|
||
Specifies the URI path to which the access control applies.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{location-access-controls} parameter} access-control-list access-controls
|
||
Access controls for all access to this path, in the same format as the
|
||
@code{access-controls} of @code{operation-access-control}.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{location-access-controls} parameter} method-access-control-list method-access-controls
|
||
Access controls for method-specific access to this path.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
Available @code{method-access-controls} fields are:
|
||
|
||
@deftypevr {@code{method-access-controls} parameter} boolean reverse?
|
||
If @code{#t}, apply access controls to all methods except the listed
|
||
methods. Otherwise apply to only the listed methods.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{method-access-controls} parameter} method-list methods
|
||
Methods to which this access control applies.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{method-access-controls} parameter} access-control-list access-controls
|
||
Access control directives, as a list of strings. Each string should be one
|
||
directive, such as "Order allow,deny".
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
@end deftypevr
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer log-debug-history
|
||
Specifies the number of debugging messages that are retained for logging if
|
||
an error occurs in a print job. Debug messages are logged regardless of the
|
||
LogLevel setting.
|
||
|
||
Defaults to @samp{100}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} log-level log-level
|
||
Specifies the level of logging for the ErrorLog file. The value @code{none}
|
||
stops all logging while @code{debug2} logs everything.
|
||
|
||
Defaults to @samp{info}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} log-time-format log-time-format
|
||
Specifies the format of the date and time in the log files. The value
|
||
@code{standard} logs whole seconds while @code{usecs} logs microseconds.
|
||
|
||
Defaults to @samp{standard}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-clients
|
||
Specifies the maximum number of simultaneous clients that are allowed by the
|
||
scheduler.
|
||
|
||
Defaults to @samp{100}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-clients-per-host
|
||
Specifies the maximum number of simultaneous clients that are allowed from a
|
||
single address.
|
||
|
||
Defaults to @samp{100}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-copies
|
||
Specifies the maximum number of copies that a user can print of each job.
|
||
|
||
Defaults to @samp{9999}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-hold-time
|
||
Specifies the maximum time a job may remain in the @code{indefinite} hold
|
||
state before it is canceled. A value of 0 disables cancellation of held
|
||
jobs.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-jobs
|
||
Specifies the maximum number of simultaneous jobs that are allowed. Set to
|
||
0 to allow an unlimited number of jobs.
|
||
|
||
Defaults to @samp{500}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-jobs-per-printer
|
||
Specifies the maximum number of simultaneous jobs that are allowed per
|
||
printer. A value of 0 allows up to MaxJobs jobs per printer.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-jobs-per-user
|
||
Specifies the maximum number of simultaneous jobs that are allowed per
|
||
user. A value of 0 allows up to MaxJobs jobs per user.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-job-time
|
||
Specifies the maximum time a job may take to print before it is canceled, in
|
||
seconds. Set to 0 to disable cancellation of "stuck" jobs.
|
||
|
||
Defaults to @samp{10800}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer max-log-size
|
||
Specifies the maximum size of the log files before they are rotated, in
|
||
bytes. The value 0 disables log rotation.
|
||
|
||
Defaults to @samp{1048576}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer multiple-operation-timeout
|
||
Specifies the maximum amount of time to allow between files in a multiple
|
||
file print job, in seconds.
|
||
|
||
Defaults to @samp{300}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string page-log-format
|
||
Specifies the format of PageLog lines. Sequences beginning with percent
|
||
(@samp{%}) characters are replaced with the corresponding information, while
|
||
all other characters are copied literally. The following percent sequences
|
||
are recognized:
|
||
|
||
@table @samp
|
||
@item %%
|
||
insert a single percent character
|
||
|
||
@item %@{name@}
|
||
insert the value of the specified IPP attribute
|
||
|
||
@item %C
|
||
insert the number of copies for the current page
|
||
|
||
@item %P
|
||
insert the current page number
|
||
|
||
@item %T
|
||
insert the current date and time in common log format
|
||
|
||
@item %j
|
||
insert the job ID
|
||
|
||
@item %p
|
||
insert the printer name
|
||
|
||
@item %u
|
||
insert the username
|
||
@end table
|
||
|
||
A value of the empty string disables page logging. The string @code{%p %u
|
||
%j %T %P %C %@{job-billing@} %@{job-originating-host-name@} %@{job-name@}
|
||
%@{media@} %@{sides@}} creates a page log with the standard items.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} environment-variables environment-variables
|
||
Passes the specified environment variable(s) to child processes; a list of
|
||
strings.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} policy-configuration-list policies
|
||
Specifies named access control policies.
|
||
|
||
Available @code{policy-configuration} fields are:
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} string name
|
||
Name of the policy.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} 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-config} 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}.
|
||
|
||
Defaults to @samp{"@@OWNER @@SYSTEM"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} string job-private-values
|
||
Specifies the list of job values to make private, or @code{all},
|
||
@code{default}, or @code{none}.
|
||
|
||
Defaults to @samp{"job-name job-originating-host-name
|
||
job-originating-user-name phone"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} 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-config} 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}.
|
||
|
||
Defaults to @samp{"@@OWNER @@SYSTEM"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} string subscription-private-values
|
||
Specifies the list of job values to make private, or @code{all},
|
||
@code{default}, or @code{none}.
|
||
|
||
Defaults to @samp{"notify-events notify-pull-method notify-recipient-uri
|
||
notify-subscriber-user-name notify-user-data"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{policy-configuration} parameter} operation-access-control-list access-controls
|
||
Access control by IPP operation.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean-or-non-negative-integer preserve-job-files
|
||
Specifies whether job files (documents) are preserved after a job is
|
||
printed. If a numeric value is specified, job files are preserved for the
|
||
indicated number of seconds after printing. Otherwise a boolean value
|
||
applies indefinitely.
|
||
|
||
Defaults to @samp{86400}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean-or-non-negative-integer preserve-job-history
|
||
Specifies whether the job history is preserved after a job is printed. If a
|
||
numeric value is specified, the job history is preserved for the indicated
|
||
number of seconds after printing. If @code{#t}, the job history is
|
||
preserved until the MaxJobs limit is reached.
|
||
|
||
Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer reload-timeout
|
||
Specifies the amount of time to wait for job completion before restarting
|
||
the scheduler.
|
||
|
||
El valor predeterminado es @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string rip-cache
|
||
Specifies the maximum amount of memory to use when converting documents into
|
||
bitmaps for a printer.
|
||
|
||
Defaults to @samp{"128m"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string server-admin
|
||
Specifies the email address of the server administrator.
|
||
|
||
Defaults to @samp{"root@@localhost.localdomain"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} host-name-list-or-* server-alias
|
||
The ServerAlias directive is used for HTTP Host header validation when
|
||
clients connect to the scheduler from external interfaces. Using the
|
||
special name @code{*} can expose your system to known browser-based DNS
|
||
rebinding attacks, even when accessing sites through a firewall. If the
|
||
auto-discovery of alternate names does not work, we recommend listing each
|
||
alternate name with a ServerAlias directive instead of using @code{*}.
|
||
|
||
Defaults to @samp{*}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string server-name
|
||
Specifies the fully-qualified host name of the server.
|
||
|
||
Defaults to @samp{"localhost"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} server-tokens server-tokens
|
||
Specifies what information is included in the Server header of HTTP
|
||
responses. @code{None} disables the Server header. @code{ProductOnly}
|
||
reports @code{CUPS}. @code{Major} reports @code{CUPS 2}. @code{Minor}
|
||
reports @code{CUPS 2.0}. @code{Minimal} reports @code{CUPS 2.0.0}.
|
||
@code{OS} reports @code{CUPS 2.0.0 (@var{uname})} where @var{uname} is the
|
||
output of the @code{uname} command. @code{Full} reports @code{CUPS 2.0.0
|
||
(@var{uname}) IPP/2.0}.
|
||
|
||
Defaults to @samp{Minimal}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} string set-env
|
||
Set the specified environment variable to be passed to child processes.
|
||
|
||
Defaults to @samp{"variable value"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} multiline-string-list ssl-listen
|
||
Listens on the specified interfaces for encrypted connections. Valid values
|
||
are of the form @var{address}:@var{port}, where @var{address} is either an
|
||
IPv6 address enclosed in brackets, an IPv4 address, or @code{*} to indicate
|
||
all addresses.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} ssl-options ssl-options
|
||
Sets encryption options. By default, CUPS only supports encryption using
|
||
TLS v1.0 or higher using known secure cipher suites. The @code{AllowRC4}
|
||
option enables the 128-bit RC4 cipher suites, which are required for some
|
||
older clients that do not implement newer ones. The @code{AllowSSL3} option
|
||
enables SSL v3.0, which is required for some older clients that do not
|
||
support TLS v1.0.
|
||
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean strict-conformance?
|
||
Specifies whether the scheduler requires clients to strictly adhere to the
|
||
IPP specifications.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} non-negative-integer timeout
|
||
Specifies the HTTP request timeout, in seconds.
|
||
|
||
Defaults to @samp{300}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cups-configuration} parameter} boolean web-interface?
|
||
Specifies whether the web interface is enabled.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
@end deftypevr
|
||
|
||
At this point you're probably thinking ``oh dear, Guix manual, I like you
|
||
but you can stop already with the configuration options''. Indeed.
|
||
However, one more point: it could be that you have an existing
|
||
@code{cupsd.conf} that you want to use. In that case, you can pass an
|
||
@code{opaque-cups-configuration} as the configuration of a
|
||
@code{cups-service-type}.
|
||
|
||
Available @code{opaque-cups-configuration} fields are:
|
||
|
||
@deftypevr {@code{opaque-cups-configuration} parameter} package cups
|
||
El paquete CUPS.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{opaque-cups-configuration} parameter} string cupsd.conf
|
||
The contents of the @code{cupsd.conf}, as a string.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{opaque-cups-configuration} parameter} string cups-files.conf
|
||
The contents of the @code{cups-files.conf} file, as a string.
|
||
@end deftypevr
|
||
|
||
For example, if your @code{cupsd.conf} and @code{cups-files.conf} are in
|
||
strings of the same name, you could instantiate a CUPS service like this:
|
||
|
||
@example
|
||
(service cups-service-type
|
||
(opaque-cups-configuration
|
||
(cupsd.conf cupsd.conf)
|
||
(cups-files.conf cups-files.conf)))
|
||
@end example
|
||
|
||
|
||
@node Servicios de escritorio
|
||
@subsection Servicios de escritorio
|
||
|
||
The @code{(gnu services desktop)} module provides services that are usually
|
||
useful in the context of a ``desktop'' setup---that is, on a machine running
|
||
a graphical display server, possibly with graphical user interfaces, etc.
|
||
It also defines services that provide specific desktop environments like
|
||
GNOME, Xfce or MATE.
|
||
|
||
To simplify things, the module defines a variable containing the set of
|
||
services that users typically expect on a machine with a graphical
|
||
environment and networking:
|
||
|
||
@defvr {Variable Scheme} %desktop-services
|
||
This is a list of services that builds upon @var{%base-services} and adds or
|
||
adjusts services for a typical ``desktop'' setup.
|
||
|
||
In particular, it adds a graphical login manager (@pxref{Sistema X Window,
|
||
@code{gdm-service-type}}), screen lockers, a network management tool
|
||
(@pxref{Servicios de red, @code{network-manager-service-type}}), energy
|
||
and color management services, the @code{elogind} login and seat manager,
|
||
the Polkit privilege service, the GeoClue location service, the
|
||
AccountsService daemon that allows authorized users change system passwords,
|
||
an NTP client (@pxref{Servicios de red}), the Avahi daemon, and has the
|
||
name service switch service configured to be able to use @code{nss-mdns}
|
||
(@pxref{Selector de servicios de nombres, mDNS}).
|
||
@end defvr
|
||
|
||
The @var{%desktop-services} variable can be used as the @code{services}
|
||
field of an @code{operating-system} declaration (@pxref{Referencia de ``operating-system'', @code{services}}).
|
||
|
||
Additionally, the @code{gnome-desktop-service-type},
|
||
@code{xfce-desktop-service}, @code{mate-desktop-service-type} and
|
||
@code{enlightenment-desktop-service-type} procedures can add GNOME, Xfce,
|
||
MATE and/or Enlightenment to a system. To ``add GNOME'' means that
|
||
system-level services like the backlight adjustment helpers and the power
|
||
management utilities are added to the system, extending @code{polkit} and
|
||
@code{dbus} appropriately, allowing GNOME to operate with elevated
|
||
privileges on a limited number of special-purpose system interfaces.
|
||
Additionally, adding a service made by @code{gnome-desktop-service-type}
|
||
adds the GNOME metapackage to the system profile. Likewise, adding the Xfce
|
||
service not only adds the @code{xfce} metapackage to the system profile, but
|
||
it also gives the Thunar file manager the ability to open a ``root-mode''
|
||
file management window, if the user authenticates using the administrator's
|
||
password via the standard polkit graphical interface. To ``add MATE'' means
|
||
that @code{polkit} and @code{dbus} are extended appropriately, allowing MATE
|
||
to operate with elevated privileges on a limited number of special-purpose
|
||
system interfaces. Additionally, adding a service of type
|
||
@code{mate-desktop-service-type} adds the MATE metapackage to the system
|
||
profile. ``Adding Enlightenment'' means that @code{dbus} is extended
|
||
appropriately, and several of Enlightenment's binaries are set as setuid,
|
||
allowing Enlightenment's screen locker and other functionality to work as
|
||
expetected.
|
||
|
||
The desktop environments in Guix use the Xorg display server by default. If
|
||
you'd like to use the newer display server protocol called Wayland, you need
|
||
to use the @code{sddm-service} instead of GDM as the graphical login
|
||
manager. You should then select the ``GNOME (Wayland)'' session in SDDM.
|
||
Alternatively you can also try starting GNOME on Wayland manually from a TTY
|
||
with the command ``XDG_SESSION_TYPE=wayland exec dbus-run-session
|
||
gnome-session``. Currently only GNOME has support for Wayland.
|
||
|
||
@defvr {Scheme Variable} gnome-desktop-service-type
|
||
This is the type of the service that adds the @uref{https://www.gnome.org,
|
||
GNOME} desktop environment. Its value is a
|
||
@code{gnome-desktop-configuration} object (see below.)
|
||
|
||
This service adds the @code{gnome} package to the system profile, and
|
||
extends polkit with the actions from @code{gnome-settings-daemon}.
|
||
@end defvr
|
||
|
||
@deftp {Data Type} gnome-desktop-configuration
|
||
Configuration record for the GNOME desktop environment.
|
||
|
||
@table @asis
|
||
@item @code{gnome} (default @code{gnome})
|
||
The GNOME package to use.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Scheme Variable} xfce-desktop-service-type
|
||
This is the type of a service to run the @uref{Xfce, https://xfce.org/}
|
||
desktop environment. Its value is an @code{xfce-desktop-configuration}
|
||
object (see below.)
|
||
|
||
This service that adds the @code{xfce} package to the system profile, and
|
||
extends polkit with the ability for @code{thunar} to manipulate the file
|
||
system as root from within a user session, after the user has authenticated
|
||
with the administrator's password.
|
||
@end defvr
|
||
|
||
@deftp {Data Type} xfce-desktop-configuration
|
||
Configuration record for the Xfce desktop environment.
|
||
|
||
@table @asis
|
||
@item @code{xfce} (default @code{xfce})
|
||
The Xfce package to use.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Scheme Variable} mate-desktop-service-type
|
||
This is the type of the service that runs the
|
||
@uref{https://mate-desktop.org/, MATE desktop environment}. Its value is a
|
||
@code{mate-desktop-configuration} object (see below.)
|
||
|
||
This service adds the @code{mate} package to the system profile, and extends
|
||
polkit with the actions from @code{mate-settings-daemon}.
|
||
@end deffn
|
||
|
||
@deftp {Data Type} mate-desktop-configuration
|
||
Configuration record for the MATE desktop environment.
|
||
|
||
@table @asis
|
||
@item @code{mate} (default @code{mate})
|
||
The MATE package to use.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Scheme Variable} enlightenment-desktop-service-type
|
||
Return a service that adds the @code{enlightenment} package to the system
|
||
profile, and extends dbus with actions from @code{efl}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} enlightenment-desktop-service-configuration
|
||
@table @asis
|
||
@item @code{enlightenment} (predeterminado @code{enlightenment})
|
||
El paquete enlightenment usado.
|
||
@end table
|
||
@end deftp
|
||
|
||
Because the GNOME, Xfce and MATE desktop services pull in so many packages,
|
||
the default @code{%desktop-services} variable doesn't include any of them by
|
||
default. To add GNOME, Xfce or MATE, just @code{cons} them onto
|
||
@code{%desktop-services} in the @code{services} field of your
|
||
@code{operating-system}:
|
||
|
||
@example
|
||
(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)
|
||
%desktop-services))
|
||
...)
|
||
@end example
|
||
|
||
These desktop environments will then be available as options in the
|
||
graphical login window.
|
||
|
||
The actual service definitions included in @code{%desktop-services} and
|
||
provided by @code{(gnu services dbus)} and @code{(gnu services desktop)} are
|
||
described below.
|
||
|
||
@deffn {Procedimiento Scheme} dbus-service [#:dbus @var{dbus}] [#:services '()]
|
||
Return a service that runs the ``system bus'', using @var{dbus}, with
|
||
support for @var{services}.
|
||
|
||
@uref{http://dbus.freedesktop.org/, D-Bus} is an inter-process communication
|
||
facility. Its system bus is used to allow system services to communicate
|
||
and to be notified of system-wide events.
|
||
|
||
@var{services} must be a 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)}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} elogind-service [#:config @var{config}]
|
||
Return a service that runs the @code{elogind} login and seat management
|
||
daemon. @uref{https://github.com/elogind/elogind, Elogind} exposes 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.
|
||
|
||
Elogind 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.
|
||
|
||
The @var{config} keyword argument specifies the configuration for elogind,
|
||
and should be the result of an @code{(elogind-configuration (@var{parameter}
|
||
@var{value})...)} invocation. Available parameters and their default values
|
||
are:
|
||
|
||
@table @code
|
||
@item kill-user-processes?
|
||
@code{#f}
|
||
@item kill-only-users
|
||
@code{()}
|
||
@item kill-exclude-users
|
||
@code{("root")}
|
||
@item inhibit-delay-max-seconds
|
||
@code{5}
|
||
@item handle-power-key
|
||
@code{poweroff}
|
||
@item handle-suspend-key
|
||
@code{suspend}
|
||
@item handle-hibernate-key
|
||
@code{hibernate}
|
||
@item handle-lid-switch
|
||
@code{suspend}
|
||
@item handle-lid-switch-docked
|
||
@code{ignore}
|
||
@item power-key-ignore-inhibited?
|
||
@code{#f}
|
||
@item suspend-key-ignore-inhibited?
|
||
@code{#f}
|
||
@item hibernate-key-ignore-inhibited?
|
||
@code{#f}
|
||
@item lid-switch-ignore-inhibited?
|
||
@code{#t}
|
||
@item holdoff-timeout-seconds
|
||
@code{30}
|
||
@item idle-action
|
||
@code{ignore}
|
||
@item idle-action-seconds
|
||
@code{(* 30 60)}
|
||
@item runtime-directory-size-percent
|
||
@code{10}
|
||
@item runtime-directory-size
|
||
@code{#f}
|
||
@item remove-ipc?
|
||
@code{#t}
|
||
@item suspend-state
|
||
@code{("mem" "standby" "freeze")}
|
||
@item suspend-mode
|
||
@code{()}
|
||
@item hibernate-state
|
||
@code{("disk")}
|
||
@item hibernate-mode
|
||
@code{("platform" "shutdown")}
|
||
@item hybrid-sleep-state
|
||
@code{("disk")}
|
||
@item hybrid-sleep-mode
|
||
@code{("suspend" "platform" "shutdown")}
|
||
@end table
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} accountsservice-service @
|
||
[#:accountsservice @var{accountsservice}] Return a 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.
|
||
@uref{https://www.freedesktop.org/wiki/Software/AccountsService/, the
|
||
accountsservice web site} for more information.
|
||
|
||
The @var{accountsservice} keyword argument is the @code{accountsservice}
|
||
package to expose as a service.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} polkit-service @
|
||
[#:polkit @var{polkit}] Return a service that runs the
|
||
@uref{http://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.
|
||
@end deffn
|
||
|
||
@defvr {Scheme Variable} upower-service-type
|
||
Service that runs @uref{http://upower.freedesktop.org/, @command{upowerd}},
|
||
a system-wide monitor for power consumption and battery levels, with the
|
||
given configuration settings.
|
||
|
||
It implements the @code{org.freedesktop.UPower} D-Bus interface, and is
|
||
notably used by GNOME.
|
||
@end defvr
|
||
|
||
@deftp {Data Type} upower-configuration
|
||
Data type representation the configuration for UPower.
|
||
|
||
@table @asis
|
||
|
||
@item @code{upower} (default: @var{upower})
|
||
Package to use for @code{upower}.
|
||
|
||
@item @code{watts-up-pro?} (default: @code{#f})
|
||
Enable the Watts Up Pro device.
|
||
|
||
@item @code{poll-batteries?} (default: @code{#t})
|
||
Enable polling the kernel for battery level changes.
|
||
|
||
@item @code{ignore-lid?} (default: @code{#f})
|
||
Ignore the lid state, this can be useful if it's incorrect on a device.
|
||
|
||
@item @code{use-percentage-for-policy?} (default: @code{#f})
|
||
Whether battery percentage based policy should be used. The default is to
|
||
use the time left, change to @code{#t} to use the percentage.
|
||
|
||
@item @code{percentage-low} (default: @code{10})
|
||
When @code{use-percentage-for-policy?} is @code{#t}, this sets the
|
||
percentage at which the battery is considered low.
|
||
|
||
@item @code{percentage-critical} (default: @code{3})
|
||
When @code{use-percentage-for-policy?} is @code{#t}, this sets the
|
||
percentage at which the battery is considered critical.
|
||
|
||
@item @code{percentage-action} (default: @code{2})
|
||
When @code{use-percentage-for-policy?} is @code{#t}, this sets the
|
||
percentage at which action will be taken.
|
||
|
||
@item @code{time-low} (default: @code{1200})
|
||
When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining
|
||
in seconds at which the battery is considered low.
|
||
|
||
@item @code{time-critical} (default: @code{300})
|
||
When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining
|
||
in seconds at which the battery is considered critical.
|
||
|
||
@item @code{time-action} (default: @code{120})
|
||
When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining
|
||
in seconds at which action will be taken.
|
||
|
||
@item @code{critical-power-action} (default: @code{'hybrid-sleep})
|
||
The action taken when @code{percentage-action} or @code{time-action} is
|
||
reached (depending on the configuration of
|
||
@code{use-percentage-for-policy?}).
|
||
|
||
Possible values are:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{'power-off}
|
||
|
||
@item
|
||
@code{'hibernate}
|
||
|
||
@item
|
||
@code{'hybrid-sleep}.
|
||
@end itemize
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} udisks-service [#:udisks @var{udisks}]
|
||
Return a service for @uref{http://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.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} colord-service [#:colord @var{colord}]
|
||
Return a service that runs @command{colord}, a system service with a D-Bus
|
||
interface to manage the color profiles of input and output devices such as
|
||
screens and scanners. It is notably used by the GNOME Color Manager
|
||
graphical tool. See @uref{http://www.freedesktop.org/software/colord/, the
|
||
colord web site} for more information.
|
||
@end deffn
|
||
|
||
@deffn {Scheme Procedure} geoclue-application name [#:allowed? #t] [#:system? #f] [#:users '()]
|
||
Return a configuration allowing an application to access GeoClue location
|
||
data. @var{name} is the Desktop ID of the application, without the
|
||
@code{.desktop} part. If @var{allowed?} is true, the application will have
|
||
access to location information by default. The boolean @var{system?} value
|
||
indicates whether an application is a system component or not. Finally
|
||
@var{users} is a list of UIDs of all users for which this application is
|
||
allowed location info access. An empty users list means that all users are
|
||
allowed.
|
||
@end deffn
|
||
|
||
@defvr {Variable Scheme} %standard-geoclue-applications
|
||
The standard list of well-known GeoClue application configurations, granting
|
||
authority to the GNOME date-and-time utility to ask for the current location
|
||
in order to set the time zone, and allowing the IceCat and Epiphany web
|
||
browsers to request location information. IceCat and Epiphany both query
|
||
the user before allowing a web page to know the user's location.
|
||
@end defvr
|
||
|
||
@deffn {Procedimiento Scheme} geoclue-service [#:colord @var{colord}] @
|
||
[#:whitelist '()] @ [#:wifi-geolocation-url
|
||
"https://location.services.mozilla.com/v1/geolocate?key=geoclue"] @
|
||
[#:submit-data? #f] [#:wifi-submission-url
|
||
"https://location.services.mozilla.com/v1/submit?key=geoclue"] @
|
||
[#:submission-nick "geoclue"] @ [#:applications
|
||
%standard-geoclue-applications] Return a service that runs the 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. See
|
||
@uref{https://wiki.freedesktop.org/www/Software/GeoClue/, the GeoClue web
|
||
site} for more information.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} bluetooth-service [#:bluez @var{bluez}] @
|
||
[@w{#:auto-enable? #f}] Return a service that runs the @command{bluetoothd}
|
||
daemon, which manages all the Bluetooth devices and provides a number of
|
||
D-Bus interfaces. When AUTO-ENABLE? is true, the bluetooth controller is
|
||
powered automatically at boot, which can be useful when using a bluetooth
|
||
keyboard or mouse.
|
||
|
||
Users need to be in the @code{lp} group to access the D-Bus service.
|
||
@end deffn
|
||
|
||
@node Servicios de sonido
|
||
@subsection Servicios de sonido
|
||
|
||
@cindex sound support
|
||
@cindex ALSA
|
||
@cindex PulseAudio, sound support
|
||
|
||
The @code{(gnu services sound)} module provides a service to configure the
|
||
Advanced Linux Sound Architecture (ALSA) system, which makes PulseAudio the
|
||
preferred ALSA output driver.
|
||
|
||
@deffn {Variable Scheme} alsa-service-type
|
||
This is the type for the @uref{https://alsa-project.org/, Advanced Linux
|
||
Sound Architecture} (ALSA) system, which generates the
|
||
@file{/etc/asound.conf} configuration file. The value for this type is a
|
||
@command{alsa-configuration} record as in this example:
|
||
|
||
@example
|
||
(service alsa-service-type)
|
||
@end example
|
||
|
||
See below for details about @code{alsa-configuration}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} alsa-configuration
|
||
Data type representing the configuration for @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})
|
||
Whether ALSA applications should transparently be made to use the
|
||
@uref{http://www.pulseaudio.org/, PulseAudio} sound server.
|
||
|
||
Using PulseAudio allows you to run several sound-producing applications at
|
||
the same time and to individual control them @i{via} @command{pavucontrol},
|
||
among other things.
|
||
|
||
@item @code{extra-options} (predeterminado: @var{""})
|
||
String to append to the @file{/etc/asound.conf} file.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
Individual users who want to override the system configuration of ALSA can
|
||
do it with the @file{~/.asoundrc} file:
|
||
|
||
@example
|
||
# In guix, we have to specify the absolute path for plugins.
|
||
pcm_type.jack @{
|
||
lib "/home/alice/.guix-profile/lib/alsa-lib/libasound_module_pcm_jack.so"
|
||
@}
|
||
|
||
# Routing ALSA to 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
|
||
|
||
See @uref{https://www.alsa-project.org/main/index.php/Asoundrc} for the
|
||
details.
|
||
|
||
|
||
@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.
|
||
|
||
@deffn {Procedimiento Scheme} postgresql-service [#:postgresql postgresql] @
|
||
[#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @ [#:port
|
||
5432] [#:locale ``en_US.utf8''] [#:extension-packages '()] Return a service
|
||
that runs @var{postgresql}, the PostgreSQL database server.
|
||
|
||
The PostgreSQL daemon loads its runtime configuration from
|
||
@var{config-file}, creates a database cluster with @var{locale} as the
|
||
default locale, stored in @var{data-directory}. It then listens on
|
||
@var{port}.
|
||
|
||
@cindex postgresql extension-packages
|
||
Additional extensions are loaded from packages listed in
|
||
@var{extension-packages}. Extensions are available at runtime. For
|
||
instance, to create a geographic database using the @code{postgis}
|
||
extension, a user can configure the postgresql-service as in this example:
|
||
|
||
@cindex postgis
|
||
@example
|
||
(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*
|
||
(postgresql-service #:extension-packages (list postgis))
|
||
%base-services)))
|
||
@end example
|
||
|
||
Then the extension becomes visible and you can initialise an empty
|
||
geographic database in this way:
|
||
|
||
@example
|
||
psql -U postgres
|
||
> create database postgistest;
|
||
> \connect postgistest;
|
||
> create extension postgis;
|
||
> create extension postgis_topology;
|
||
@end example
|
||
|
||
There is no need to add this field for contrib extensions such as hstore or
|
||
dblink as they are already loadable by postgresql. This field is only
|
||
required to add extensions provided by other packages.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} mysql-service [#:config (mysql-configuration)]
|
||
Return a service that runs @command{mysqld}, the MySQL or MariaDB database
|
||
server.
|
||
|
||
El parámetro opcional @var{config} especifica la configuración para
|
||
@command{mysqld}, que debe ser un objeto @code{<mysql-configuration>}.
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} mysql-configuration
|
||
Data type representing the configuration of @var{mysql-service}.
|
||
|
||
@table @asis
|
||
@item @code{mysql} (predeterminado: @var{mariadb})
|
||
Package object of the MySQL database server, can be either @var{mariadb} or
|
||
@var{mysql}.
|
||
|
||
For MySQL, a temporary root password will be displayed at activation time.
|
||
For MariaDB, the root password is empty.
|
||
|
||
@item @code{port} (predeterminado: @code{3306})
|
||
TCP port on which the database server listens for incoming connections.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} memcached-service-type
|
||
This is the service type for the @uref{https://memcached.org/, Memcached}
|
||
service, which provides a distributed in memory cache. The value for the
|
||
service type is a @code{memcached-configuration} object.
|
||
@end defvr
|
||
|
||
@example
|
||
(service memcached-service-type)
|
||
@end example
|
||
|
||
@deftp {Tipo de datos} memcached-configuration
|
||
Data type representing the configuration of memcached.
|
||
|
||
@table @asis
|
||
@item @code{memcached} (predeterminado: @code{memcached})
|
||
El paquete de Memcached usado.
|
||
|
||
@item @code{interfaces} (predeterminadas: @code{'("0.0.0.0")})
|
||
Network interfaces on which to listen.
|
||
|
||
@item @code{tcp-port} (predeterminado: @code{11211})
|
||
Port on which to accept connections on,
|
||
|
||
@item @code{udp-port} (predeterminado: @code{11211})
|
||
Port on which to accept UDP connections on, a value of 0 will disable
|
||
listening on a UDP socket.
|
||
|
||
@item @code{additional-options} (predeterminadas: @code{'()})
|
||
Additional command line options to pass to @code{memcached}.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} mongodb-service-type
|
||
This is the service type for @uref{https://www.mongodb.com/, MongoDB}. The
|
||
value for the service type is a @code{mongodb-configuration} object.
|
||
@end defvr
|
||
|
||
@example
|
||
(service mongodb-service-type)
|
||
@end example
|
||
|
||
@deftp {Tipo de datos} mongodb-configuration
|
||
Tipo de datos que representa la configuración de GPM.
|
||
|
||
@table @asis
|
||
@item @code{mongodb} (predeterminado: @code{mongodb})
|
||
El paquete MongoDB usado.
|
||
|
||
@item @code{config-file} (predeterminado: @code{%default-mongodb-configuration-file})
|
||
The configuration file for MongoDB.
|
||
|
||
@item @code{data-directory} (predeterminado: @code{"/var/lib/mongodb"})
|
||
This value is used to create the directory, so that it exists and is owned
|
||
by the mongodb user. It should match the data-directory which MongoDB is
|
||
configured to use through the configuration file.
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} redis-service-type
|
||
This is the service type for the @uref{https://redis.io/, Redis} key/value
|
||
store, whose value is a @code{redis-configuration} object.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} redis-configuration
|
||
Data type representing the configuration of redis.
|
||
|
||
@table @asis
|
||
@item @code{redis} (predeterminado: @code{redis})
|
||
The Redis package to use.
|
||
|
||
@item @code{bind} (predeterminada: @code{"127.0.0.1"})
|
||
La interfaz de red en la que se escucha.
|
||
|
||
@item @code{port} (predeterminado: @code{6379})
|
||
Port on which to accept connections on, a value of 0 will disable listening
|
||
on a TCP socket.
|
||
|
||
@item @code{working-directory} (predeterminado: @code{"/var/lib/redis"})
|
||
Directory in which to store the database and related files.
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de correo
|
||
@subsection Servicios de correo
|
||
|
||
@cindex mail
|
||
@cindex email
|
||
The @code{(gnu services mail)} module provides Guix service definitions for
|
||
email services: IMAP, POP3, and LMTP servers, as well as mail transport
|
||
agents (MTAs). Lots of acronyms! These services are detailed in the
|
||
subsections below.
|
||
|
||
@subsubheading Servicio Dovecot
|
||
|
||
@deffn {Procedimiento Scheme} dovecot-service [#:config (dovecot-configuration)]
|
||
Return a service that runs the Dovecot IMAP/POP3/LMTP mail server.
|
||
@end deffn
|
||
|
||
By default, Dovecot does not need much configuration; the default
|
||
configuration object created by @code{(dovecot-configuration)} will suffice
|
||
if your mail is delivered to @code{~/Maildir}. A self-signed certificate
|
||
will be generated for TLS-protected connections, though Dovecot will also
|
||
listen on cleartext ports by default. There are a number of options,
|
||
though, which mail administrators might need to change, and as is the case
|
||
with other services, Guix allows the system administrator to specify these
|
||
parameters via a uniform Scheme interface.
|
||
|
||
Por ejemplo, para especificar que el correo se encuentra en
|
||
@code{maildir:~/.correo}, se debe instanciar el servicio de Dovecot de esta
|
||
manera:
|
||
|
||
@example
|
||
(dovecot-service #:config
|
||
(dovecot-configuration
|
||
(mail-location "maildir:~/.correo")))
|
||
@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. There is
|
||
also a way to specify the configuration as a string, if you have an old
|
||
@code{dovecot.conf} file that you want to port over from some other system;
|
||
see the end for more details.
|
||
|
||
@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.
|
||
|
||
Available @code{dovecot-configuration} fields are:
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} package dovecot
|
||
El paquete dovecot.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} comma-separated-string-list listen
|
||
A list of IPs or hosts where to listen for connections. @samp{*} listens on
|
||
all IPv4 interfaces, @samp{::} listens on all IPv6 interfaces. If you want
|
||
to specify non-default ports or anything more complex, customize the address
|
||
and port fields of the @samp{inet-listener} of the specific services you are
|
||
interested in.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} protocol-configuration-list protocols
|
||
List of protocols we want to serve. Available protocols include
|
||
@samp{imap}, @samp{pop3}, and @samp{lmtp}.
|
||
|
||
Available @code{protocol-configuration} fields are:
|
||
|
||
@deftypevr {@code{protocol-configuration} parameter} string name
|
||
El nombre del protocolo.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{protocol-configuration} parameter} string auth-socket-path
|
||
UNIX socket path to the master authentication server to find users. This is
|
||
used by imap (for shared users) and lda. It defaults to
|
||
@samp{"/var/run/dovecot/auth-userdb"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{protocol-configuration} parameter} space-separated-string-list mail-plugins
|
||
Space separated list of plugins to load.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{protocol-configuration} parameter} non-negative-integer mail-max-userip-connections
|
||
Maximum number of IMAP connections allowed for a user from each IP address.
|
||
NOTE: The username is compared case-sensitively. Defaults to @samp{10}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} service-configuration-list services
|
||
List of services to enable. Available services include @samp{imap},
|
||
@samp{imap-login}, @samp{pop3}, @samp{pop3-login}, @samp{auth}, and
|
||
@samp{lmtp}.
|
||
|
||
Available @code{service-configuration} fields are:
|
||
|
||
@deftypevr {@code{service-configuration} parameter} string kind
|
||
The service kind. Valid values include @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}, or
|
||
anything else.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} listener-configuration-list listeners
|
||
Listeners for the service. A listener is either a
|
||
@code{unix-listener-configuration}, a @code{fifo-listener-configuration}, or
|
||
an @code{inet-listener-configuration}. Defaults to @samp{()}.
|
||
|
||
Available @code{unix-listener-configuration} fields are:
|
||
|
||
@deftypevr {@code{unix-listener-configuration} parameter} string path
|
||
Path to the file, relative to @code{base-dir} field. This is also used as
|
||
the section name.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{unix-listener-configuration} parameter} string mode
|
||
The access mode for the socket. Defaults to @samp{"0600"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{unix-listener-configuration} parameter} string user
|
||
The user to own the socket. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{unix-listener-configuration} parameter} string group
|
||
The group to own the socket. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
|
||
Available @code{fifo-listener-configuration} fields are:
|
||
|
||
@deftypevr {@code{fifo-listener-configuration} parameter} string path
|
||
Path to the file, relative to @code{base-dir} field. This is also used as
|
||
the section name.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{fifo-listener-configuration} parameter} string mode
|
||
The access mode for the socket. Defaults to @samp{"0600"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{fifo-listener-configuration} parameter} string user
|
||
The user to own the socket. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{fifo-listener-configuration} parameter} string group
|
||
The group to own the socket. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
|
||
Available @code{inet-listener-configuration} fields are:
|
||
|
||
@deftypevr {@code{inet-listener-configuration} parameter} string protocol
|
||
The protocol to listen for.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{inet-listener-configuration} parameter} string address
|
||
The address on which to listen, or empty for all addresses. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{inet-listener-configuration} parameter} non-negative-integer port
|
||
The port on which to listen.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{inet-listener-configuration} parameter} boolean ssl?
|
||
Whether to use SSL for this service; @samp{yes}, @samp{no}, or
|
||
@samp{required}. Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} non-negative-integer client-limit
|
||
Maximum number of simultaneous client connections per process. Once this
|
||
number of connections is received, the next incoming connection will prompt
|
||
Dovecot to spawn another process. If set to 0, @code{default-client-limit}
|
||
is used instead.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} non-negative-integer service-count
|
||
Number of connections to handle before starting a new process. Typically
|
||
the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0 is
|
||
faster. <doc/wiki/LoginProcess.txt>. Defaults to @samp{1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} non-negative-integer process-limit
|
||
Maximum number of processes that can exist for this service. If set to 0,
|
||
@code{default-process-limit} is used instead.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} non-negative-integer process-min-avail
|
||
Number of processes to always keep waiting for more connections. Defaults
|
||
to @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{service-configuration} parameter} non-negative-integer vsz-limit
|
||
If you set @samp{service-count 0}, you probably need to grow this. Defaults
|
||
to @samp{256000000}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} dict-configuration dict
|
||
Dict configuration, as created by the @code{dict-configuration} constructor.
|
||
|
||
Available @code{dict-configuration} fields are:
|
||
|
||
@deftypevr {@code{dict-configuration} parameter} free-form-fields entries
|
||
A list of key-value pairs that this dict should hold. Defaults to
|
||
@samp{()}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} passdb-configuration-list passdbs
|
||
A list of passdb configurations, each one created by the
|
||
@code{passdb-configuration} constructor.
|
||
|
||
Available @code{passdb-configuration} fields are:
|
||
|
||
@deftypevr {@code{passdb-configuration} parameter} string driver
|
||
The driver that the passdb should use. Valid values include @samp{pam},
|
||
@samp{passwd}, @samp{shadow}, @samp{bsdauth}, and @samp{static}. Defaults
|
||
to @samp{"pam"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{passdb-configuration} parameter} space-separated-string-list args
|
||
Space separated list of arguments to the passdb driver. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} userdb-configuration-list userdbs
|
||
List of userdb configurations, each one created by the
|
||
@code{userdb-configuration} constructor.
|
||
|
||
Available @code{userdb-configuration} fields are:
|
||
|
||
@deftypevr {@code{userdb-configuration} parameter} string driver
|
||
The driver that the userdb should use. Valid values include @samp{passwd}
|
||
and @samp{static}. Defaults to @samp{"passwd"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{userdb-configuration} parameter} space-separated-string-list args
|
||
Space separated list of arguments to the userdb driver. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{userdb-configuration} parameter} free-form-args override-fields
|
||
Override fields from passwd. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} plugin-configuration plugin-configuration
|
||
Plug-in configuration, created by the @code{plugin-configuration}
|
||
constructor.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} list-of-namespace-configuration namespaces
|
||
List of namespaces. Each item in the list is created by the
|
||
@code{namespace-configuration} constructor.
|
||
|
||
Available @code{namespace-configuration} fields are:
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} string name
|
||
Name for this namespace.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} string type
|
||
Namespace type: @samp{private}, @samp{shared} or @samp{public}. Defaults to
|
||
@samp{"private"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} 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 {@code{namespace-configuration} parameter} 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 {@code{namespace-configuration} parameter} string location
|
||
Physical location of the mailbox. This is in the same format as
|
||
mail_location, which is also the default for it. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} boolean inbox?
|
||
There can be only one INBOX, and this setting defines which namespace has
|
||
it. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} 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 {@code{namespace-configuration} parameter} 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 {@code{namespace-configuration} parameter} boolean subscriptions?
|
||
Namespace handles its own subscriptions. If set to @code{#f}, the parent
|
||
namespace handles them. The empty prefix should always have this as
|
||
@code{#t}). Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{namespace-configuration} parameter} mailbox-configuration-list mailboxes
|
||
List of predefined mailboxes in this namespace. Defaults to @samp{()}.
|
||
|
||
Available @code{mailbox-configuration} fields are:
|
||
|
||
@deftypevr {@code{mailbox-configuration} parameter} string name
|
||
Name for this mailbox.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{mailbox-configuration} parameter} string auto
|
||
@samp{create} will automatically create this mailbox. @samp{subscribe} will
|
||
both create and subscribe to the mailbox. Defaults to @samp{"no"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{mailbox-configuration} parameter} space-separated-string-list special-use
|
||
List of IMAP @code{SPECIAL-USE} attributes as specified by RFC 6154. Valid
|
||
values are @code{\All}, @code{\Archive}, @code{\Drafts}, @code{\Flagged},
|
||
@code{\Junk}, @code{\Sent}, and @code{\Trash}. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name base-dir
|
||
Base directory where to store runtime data. Defaults to
|
||
@samp{"/var/run/dovecot/"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string login-greeting
|
||
Greeting message for clients. Defaults to @samp{"Dovecot ready."}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list login-trusted-networks
|
||
List of trusted network ranges. Connections from these IPs are allowed to
|
||
override their IP addresses and ports (for logging and for authentication
|
||
checks). @samp{disable-plaintext-auth} is also ignored for these networks.
|
||
Typically you would specify your IMAP proxy servers here. Defaults to
|
||
@samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list login-access-sockets
|
||
List of login access check sockets (e.g.@: tcpwrap). Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean verbose-proctitle?
|
||
Show more verbose process titles (in ps). Currently shows user name and IP
|
||
address. Useful for seeing who is actually using the IMAP processes (e.g.@:
|
||
shared mailboxes or if the same uid is used for multiple accounts).
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean shutdown-clients?
|
||
Should all processes be killed when Dovecot master process shuts down.
|
||
Setting this to @code{#f} means that Dovecot can be upgraded without forcing
|
||
existing client connections to close (although that could also be a problem
|
||
if the upgrade is e.g.@: due to a security fix). Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer doveadm-worker-count
|
||
If non-zero, run mail commands via this many connections to doveadm server,
|
||
instead of running them directly in the same process. Defaults to @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string doveadm-socket-path
|
||
UNIX socket or host:port used for connecting to doveadm server. Defaults to
|
||
@samp{"doveadm-server"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list import-environment
|
||
List of environment variables that are preserved on Dovecot startup and
|
||
passed down to all of its child processes. You can also give key=value
|
||
pairs to always set specific settings.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean disable-plaintext-auth?
|
||
Disable LOGIN command and all other plaintext authentications unless SSL/TLS
|
||
is used (LOGINDISABLED capability). Note that if the remote IP matches the
|
||
local IP (i.e.@: you're connecting from the same computer), the connection
|
||
is considered secure and plaintext authentication is allowed. See also
|
||
ssl=required setting. Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer auth-cache-size
|
||
Authentication cache size (e.g.@: @samp{#e10e6}). 0 means it's disabled.
|
||
Note that bsdauth, PAM and vpopmail require @samp{cache-key} to be set for
|
||
caching to be used. Defaults to @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-cache-ttl
|
||
Time to live for cached data. After TTL expires the cached record is no
|
||
longer used, *except* if the main database lookup returns internal failure.
|
||
We also try to handle password changes automatically: If user's previous
|
||
authentication was successful, but this one wasn't, the cache isn't used.
|
||
For now this works only with plaintext authentication. Defaults to @samp{"1
|
||
hour"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-cache-negative-ttl
|
||
TTL for negative hits (user not found, password mismatch). 0 disables
|
||
caching them completely. Defaults to @samp{"1 hour"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list auth-realms
|
||
List of realms for SASL authentication mechanisms that need them. You can
|
||
leave it empty if you don't want to support multiple realms. Many clients
|
||
simply use the first one listed here, so keep the default realm first.
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-default-realm
|
||
Default realm/domain to use if none was specified. This is used for both
|
||
SASL realms and appending @@domain to username in plaintext logins.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-username-chars
|
||
List of allowed characters in username. If the user-given username contains
|
||
a character not listed in here, the login automatically fails. This is just
|
||
an extra check to make sure user can't exploit any potential quote escaping
|
||
vulnerabilities with SQL/LDAP databases. If you want to allow all
|
||
characters, set this value to empty. Defaults to
|
||
@samp{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@@"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-username-translation
|
||
Username character translations before it's looked up from databases. The
|
||
value contains series of from -> to characters. For example @samp{#@@/@@}
|
||
means that @samp{#} and @samp{/} characters are translated to @samp{@@}.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-username-format
|
||
Username formatting before it's looked up from databases. You can use the
|
||
standard variables here, e.g.@: %Lu would lowercase the username, %n would
|
||
drop away the domain if it was given, or @samp{%n-AT-%d} would change the
|
||
@samp{@@} into @samp{-AT-}. This translation is done after
|
||
@samp{auth-username-translation} changes. Defaults to @samp{"%Lu"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-master-user-separator
|
||
If you want to allow master users to log in by specifying the master
|
||
username within the normal username string (i.e.@: not using SASL
|
||
mechanism's support for it), you can specify the separator character here.
|
||
The format is then <username><separator><master username>. UW-IMAP uses
|
||
@samp{*} as the separator, so that could be a good choice. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-anonymous-username
|
||
Username to use for users logging in with ANONYMOUS SASL mechanism.
|
||
Defaults to @samp{"anonymous"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer auth-worker-max-count
|
||
Maximum number of dovecot-auth worker processes. They're used to execute
|
||
blocking passdb and userdb queries (e.g.@: MySQL and PAM). They're
|
||
automatically created and destroyed as needed. Defaults to @samp{30}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-gssapi-hostname
|
||
Host name to use in GSSAPI principal names. The default is to use the name
|
||
returned by gethostname(). Use @samp{$ALL} (with quotes) to allow all
|
||
keytab entries. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-krb5-keytab
|
||
Kerberos keytab to use for the GSSAPI mechanism. Will use the system
|
||
default (usually @file{/etc/krb5.keytab}) if not specified. You may need to
|
||
change the auth service to run as root to be able to read this file.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-use-winbind?
|
||
Do NTLM and GSS-SPNEGO authentication using Samba's winbind daemon and
|
||
@samp{ntlm-auth} helper. <doc/wiki/Authentication/Mechanisms/Winbind.txt>.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name auth-winbind-helper-path
|
||
Path for Samba's @samp{ntlm-auth} helper binary. Defaults to
|
||
@samp{"/usr/bin/ntlm_auth"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string auth-failure-delay
|
||
Time to delay before replying to failed authentications. Defaults to
|
||
@samp{"2 secs"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-ssl-require-client-cert?
|
||
Require a valid SSL client certificate or the authentication fails.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-ssl-username-from-cert?
|
||
Take the username from client's SSL certificate, using
|
||
@code{X509_NAME_get_text_by_NID()} which returns the subject's DN's
|
||
CommonName. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list auth-mechanisms
|
||
List of wanted authentication mechanisms. Supported mechanisms are:
|
||
@samp{plain}, @samp{login}, @samp{digest-md5}, @samp{cram-md5}, @samp{ntlm},
|
||
@samp{rpa}, @samp{apop}, @samp{anonymous}, @samp{gssapi}, @samp{otp},
|
||
@samp{skey}, and @samp{gss-spnego}. NOTE: See also
|
||
@samp{disable-plaintext-auth} setting.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list director-servers
|
||
List of IPs or hostnames to all director servers, including ourself. Ports
|
||
can be specified as ip:port. The default port is the same as what director
|
||
service's @samp{inet-listener} is using. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list director-mail-servers
|
||
List of IPs or hostnames to all backend mail servers. Ranges are allowed
|
||
too, like 10.0.0.10-10.0.0.30. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string director-user-expire
|
||
How long to redirect users to a specific server after it no longer has any
|
||
connections. Defaults to @samp{"15 min"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string director-username-hash
|
||
How the username is translated before being hashed. Useful values include
|
||
%Ln if user can log in with or without @@domain, %Ld if mailboxes are shared
|
||
within domain. Defaults to @samp{"%Lu"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string log-path
|
||
Log file to use for error messages. @samp{syslog} logs to syslog,
|
||
@samp{/dev/stderr} logs to stderr. Defaults to @samp{"syslog"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string info-log-path
|
||
Log file to use for informational messages. Defaults to @samp{log-path}.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string debug-log-path
|
||
Log file to use for debug messages. Defaults to @samp{info-log-path}.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string syslog-facility
|
||
Syslog facility to use if you're logging to syslog. Usually if you don't
|
||
want to use @samp{mail}, you'll use local0..local7. Also other standard
|
||
facilities are supported. Defaults to @samp{"mail"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-verbose?
|
||
Log unsuccessful authentication attempts and the reasons why they failed.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-verbose-passwords?
|
||
In case of password mismatches, log the attempted password. Valid values
|
||
are no, plain and sha1. sha1 can be useful for detecting brute force
|
||
password attempts vs. user simply trying the same password over and over
|
||
again. You can also truncate the value to n chars by appending ":n" (e.g.@:
|
||
sha1:6). Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-debug?
|
||
Even more verbose logging for debugging purposes. Shows for example SQL
|
||
queries. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean auth-debug-passwords?
|
||
In case of password mismatches, log the passwords and used scheme so the
|
||
problem can be debugged. Enabling this also enables @samp{auth-debug}.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mail-debug?
|
||
Enable mail process debugging. This can help you figure out why Dovecot
|
||
isn't finding your mails. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean verbose-ssl?
|
||
Show protocol level SSL errors. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string log-timestamp
|
||
Prefix for each line written to log file. % codes are in strftime(3)
|
||
format. Defaults to @samp{"\"%b %d %H:%M:%S \""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list login-log-format-elements
|
||
List of elements we want to log. The elements which have a non-empty
|
||
variable value are joined together to form a comma-separated string.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string login-log-format
|
||
Login log format. %s contains @samp{login-log-format-elements} string, %$
|
||
contains the data we want to log. Defaults to @samp{"%$: %s"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-log-prefix
|
||
Log prefix for mail processes. See doc/wiki/Variables.txt for list of
|
||
possible variables you can use. Defaults to
|
||
@samp{"\"%s(%u)<%@{pid@}><%@{session@}>: \""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string deliver-log-format
|
||
Format to use for logging mail deliveries. You can use variables:
|
||
@table @code
|
||
@item %$
|
||
Delivery status message (e.g.@: @samp{saved to INBOX})
|
||
@item %m
|
||
Message-ID
|
||
@item %s
|
||
Subject
|
||
@item %f
|
||
From address
|
||
@item %p
|
||
Tamaño físico
|
||
@item %w
|
||
Tamaño virtual.
|
||
@end table
|
||
Defaults to @samp{"msgid=%m: %$"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-location
|
||
Location for users' mailboxes. The default is empty, which means that
|
||
Dovecot tries to find the mailboxes automatically. This won't work if the
|
||
user doesn't yet have any mail, so you should explicitly tell Dovecot the
|
||
full location.
|
||
|
||
If you're using mbox, giving a path to the INBOX file (e.g.@: /var/mail/%u)
|
||
isn't enough. You'll also need to tell Dovecot where the other mailboxes
|
||
are kept. This is called the "root mail directory", and it must be the
|
||
first path given in the @samp{mail-location} setting.
|
||
|
||
There are a few special variables you can use, eg.:
|
||
|
||
@table @samp
|
||
@item %u
|
||
username
|
||
@item %n
|
||
user part in user@@domain, same as %u if there's no domain
|
||
@item %d
|
||
domain part in user@@domain, empty if there's no domain
|
||
@item %h
|
||
home director
|
||
@end table
|
||
|
||
See doc/wiki/Variables.txt for full list. Some examples:
|
||
@table @samp
|
||
@item maildir:~/Maildir
|
||
@item mbox:~/mail: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 {@code{dovecot-configuration} parameter} string mail-uid
|
||
System user and group used to access mails. If you use multiple, userdb can
|
||
override these by returning uid or gid fields. You can use either numbers
|
||
or names. <doc/wiki/UserIds.txt>. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-gid
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-privileged-group
|
||
Group to enable temporarily for privileged operations. Currently this is
|
||
used only with INBOX when either its initial creation or dotlocking fails.
|
||
Typically this is set to "mail" to give access to /var/mail. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-access-groups
|
||
Grant access to these supplementary groups for mail processes. Typically
|
||
these are used to set up access to shared mailboxes. Note that it may be
|
||
dangerous to set these if users can create symlinks (e.g.@: if "mail" group
|
||
is set here, ln -s /var/mail ~/mail/var could allow a user to delete others'
|
||
mailboxes, or ln -s /secret/shared/box ~/mail/mybox would allow reading
|
||
it). Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} 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.@:
|
||
/path/ or ~user/. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mmap-disable?
|
||
Don't use mmap() at all. This is required if you store indexes to shared
|
||
file systems (NFS or clustered file system). Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean dotlock-use-excl?
|
||
Rely on @samp{O_EXCL} to work when creating dotlock files. NFS supports
|
||
@samp{O_EXCL} since version 3, so this should be safe to use nowadays by
|
||
default. Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-fsync
|
||
When to use fsync() or fdatasync() calls:
|
||
@table @code
|
||
@item optimized
|
||
Whenever necessary to avoid losing important data
|
||
@item always
|
||
Useful with e.g.@: NFS when write()s are delayed
|
||
@item never
|
||
Never use it (best performance, but crashes can lose data).
|
||
@end table
|
||
Defaults to @samp{"optimized"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} 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 {@code{dovecot-configuration} parameter} 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 {@code{dovecot-configuration} parameter} string lock-method
|
||
Locking method for index files. Alternatives are fcntl, flock and dotlock.
|
||
Dotlocking uses some tricks which may create more disk I/O than other
|
||
locking methods. NFS users: flock doesn't work, remember to change
|
||
@samp{mmap-disable}. Defaults to @samp{"fcntl"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name mail-temp-dir
|
||
Directory in which LDA/LMTP temporarily stores incoming mails >128 kB.
|
||
Defaults to @samp{"/tmp"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer first-valid-uid
|
||
Valid UID range for users. This is mostly to make sure that users can't log
|
||
in as daemons or other system users. Note that denying root logins is
|
||
hardcoded to dovecot binary and can't be done even if @samp{first-valid-uid}
|
||
is set to 0. Defaults to @samp{500}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer last-valid-uid
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer first-valid-gid
|
||
Valid GID range for users. Users having non-valid GID as primary group ID
|
||
aren't allowed to log in. If user belongs to supplementary groups with
|
||
non-valid GIDs, those groups are not set. Defaults to @samp{1}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer last-valid-gid
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer mail-max-keyword-length
|
||
Maximum allowed length for mail keyword name. It's only forced when trying
|
||
to create new keywords. Defaults to @samp{50}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} colon-separated-file-name-list valid-chroot-dirs
|
||
List of directories under which chrooting is allowed for mail processes
|
||
(i.e.@: /var/mail will allow chrooting to /var/mail/foo/bar too). This
|
||
setting doesn't affect @samp{login-chroot} @samp{mail-chroot} or auth chroot
|
||
settings. If this setting is empty, "/./" in home dirs are ignored.
|
||
WARNING: Never add directories here which local users can modify, that may
|
||
lead to root exploit. Usually this should be done only if you don't allow
|
||
shell access for users. <doc/wiki/Chrooting.txt>. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-chroot
|
||
Default chroot directory for mail processes. This can be overridden for
|
||
specific users in user database by giving /./ in user's home directory
|
||
(e.g.@: /home/./user chroots into /home). Note that usually there is no
|
||
real need to do chrooting, Dovecot doesn't allow users to access files
|
||
outside their mail directory anyway. If your home directories are prefixed
|
||
with the chroot directory, append "/."@: to @samp{mail-chroot}.
|
||
<doc/wiki/Chrooting.txt>. Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name auth-socket-path
|
||
UNIX socket path to master authentication server to find users. This is
|
||
used by imap (for shared users) and lda. Defaults to
|
||
@samp{"/var/run/dovecot/auth-userdb"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name mail-plugin-dir
|
||
Directory where to look up mail plugins. Defaults to
|
||
@samp{"/usr/lib/dovecot"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list mail-plugins
|
||
List of plugins to load for all services. Plugins specific to IMAP, LDA,
|
||
etc.@: are added to this list in their own .conf files. Defaults to
|
||
@samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer mail-cache-min-mail-count
|
||
The minimum number of mails in a mailbox before updates are done to cache
|
||
file. This allows optimizing Dovecot's behavior to do less disk writes at
|
||
the cost of more disk reads. Defaults to @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mailbox-idle-check-interval
|
||
When IDLE command is running, mailbox is checked once in a while to see if
|
||
there are any new mails or other changes. This setting defines the minimum
|
||
time to wait between those checks. Dovecot can also use dnotify, inotify
|
||
and kqueue to find out immediately when changes occur. Defaults to
|
||
@samp{"30 secs"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} 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 {@code{dovecot-configuration} parameter} boolean maildir-stat-dirs?
|
||
By default LIST command returns all entries in maildir beginning with a
|
||
dot. Enabling this option makes Dovecot return only entries which are
|
||
directories. This is done by stat()ing each entry, so it causes more disk
|
||
I/O. (For systems setting struct @samp{dirent->d_type} this check is free
|
||
and it's done always regardless of this setting). Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean maildir-copy-with-hardlinks?
|
||
When copying a message, do it with hard links whenever possible. This makes
|
||
the performance much better, and it's unlikely to have any side effects.
|
||
Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean maildir-very-dirty-syncs?
|
||
Assume Dovecot is the only MUA accessing Maildir: Scan cur/ directory only
|
||
when its mtime changes unexpectedly or when we can't find the mail
|
||
otherwise. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list mbox-read-locks
|
||
Which locking methods to use for locking mbox. There are four available:
|
||
|
||
@table @code
|
||
@item dotlock
|
||
Create <mailbox>.lock file. This is the oldest and most NFS-safe solution.
|
||
If you want to use /var/mail/ like directory, the users will need write
|
||
access to that directory.
|
||
@item dotlock-try
|
||
Same as dotlock, but if it fails because of permissions or because there
|
||
isn't enough disk space, just skip it.
|
||
@item fcntl
|
||
Use this if possible. Works with NFS too if lockd is used.
|
||
@item flock
|
||
May not exist in all systems. Doesn't work with NFS.
|
||
@item lockf
|
||
May not exist in all systems. Doesn't work with NFS.
|
||
@end table
|
||
|
||
You can use multiple locking methods; if you do the order they're declared
|
||
in is important to avoid deadlocks if other MTAs/MUAs are using multiple
|
||
locking methods as well. Some operating systems don't allow using some of
|
||
them simultaneously.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list mbox-write-locks
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mbox-lock-timeout
|
||
Maximum time to wait for lock (all of them) before aborting. Defaults to
|
||
@samp{"5 mins"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mbox-dotlock-change-timeout
|
||
If dotlock exists but the mailbox isn't modified in any way, override the
|
||
lock file after this much time. Defaults to @samp{"2 mins"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mbox-dirty-syncs?
|
||
When mbox changes unexpectedly we have to fully read it to find out what
|
||
changed. If the mbox is large this can take a long time. Since the change
|
||
is usually just a newly appended mail, it'd be faster to simply read the new
|
||
mails. If this setting is enabled, Dovecot does this but still safely
|
||
fallbacks to re-reading the whole mbox file whenever something in mbox isn't
|
||
how it's expected to be. The only real downside to this setting is that if
|
||
some other MUA changes message flags, Dovecot doesn't notice it
|
||
immediately. Note that a full sync is done with SELECT, EXAMINE, EXPUNGE
|
||
and CHECK commands. Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mbox-very-dirty-syncs?
|
||
Like @samp{mbox-dirty-syncs}, but don't do full syncs even with SELECT,
|
||
EXAMINE, EXPUNGE or CHECK commands. If this is set, @samp{mbox-dirty-syncs}
|
||
is ignored. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mbox-lazy-writes?
|
||
Delay writing mbox headers until doing a full write sync (EXPUNGE and CHECK
|
||
commands and when closing the mailbox). This is especially useful for POP3
|
||
where clients often delete all mails. The downside is that our changes
|
||
aren't immediately visible to other MUAs. Defaults to @samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer mbox-min-index-size
|
||
If mbox size is smaller than this (e.g.@: 100k), don't write index files.
|
||
If an index file already exists it's still read, just not updated. Defaults
|
||
to @samp{0}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer mdbox-rotate-size
|
||
Maximum dbox file size until it's rotated. Defaults to @samp{10000000}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mdbox-rotate-interval
|
||
Maximum dbox file age until it's rotated. Typically in days. Day begins
|
||
from midnight, so 1d = today, 2d = yesterday, etc. 0 = check disabled.
|
||
Defaults to @samp{"1d"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean mdbox-preallocate-space?
|
||
When creating new mdbox files, immediately preallocate their size to
|
||
@samp{mdbox-rotate-size}. This setting currently works only in Linux with
|
||
some file systems (ext4, xfs). Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-attachment-dir
|
||
sdbox and mdbox support saving mail attachments to external files, which
|
||
also allows single instance storage for them. Other backends don't support
|
||
this for now.
|
||
|
||
WARNING: This feature hasn't been tested much yet. Use at your own risk.
|
||
|
||
Directory root where to store mail attachments. Disabled, if empty.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer mail-attachment-min-size
|
||
Attachments smaller than this aren't saved externally. It's also possible
|
||
to write a plugin to disable saving specific attachments externally.
|
||
Defaults to @samp{128000}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-attachment-fs
|
||
File system backend to use for saving attachments:
|
||
@table @code
|
||
@item posix
|
||
No SiS done by Dovecot (but this might help FS's own deduplication)
|
||
@item sis posix
|
||
SiS with immediate byte-by-byte comparison during saving
|
||
@item sis-queue posix
|
||
SiS with delayed comparison and deduplication.
|
||
@end table
|
||
Defaults to @samp{"sis posix"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string mail-attachment-hash
|
||
Hash format to use in attachment filenames. You can add any text and
|
||
variables: @code{%@{md4@}}, @code{%@{md5@}}, @code{%@{sha1@}},
|
||
@code{%@{sha256@}}, @code{%@{sha512@}}, @code{%@{size@}}. Variables can be
|
||
truncated, e.g.@: @code{%@{sha256:80@}} returns only first 80 bits.
|
||
Defaults to @samp{"%@{sha1@}"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer default-process-limit
|
||
|
||
Defaults to @samp{100}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer default-client-limit
|
||
|
||
Defaults to @samp{1000}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer default-vsz-limit
|
||
Default VSZ (virtual memory size) limit for service processes. This is
|
||
mainly intended to catch and kill processes that leak memory before they eat
|
||
up everything. Defaults to @samp{256000000}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string default-login-user
|
||
Login user is internally used by login processes. This is the most
|
||
untrusted user in Dovecot system. It shouldn't have access to anything at
|
||
all. Defaults to @samp{"dovenull"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string default-internal-user
|
||
Internal user is used by unprivileged processes. It should be separate from
|
||
login user, so that login processes can't disturb other processes. Defaults
|
||
to @samp{"dovecot"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl?
|
||
SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>. Defaults to
|
||
@samp{"required"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-cert
|
||
PEM encoded X.509 SSL/TLS certificate (public key). Defaults to
|
||
@samp{"</etc/dovecot/default.pem"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-key
|
||
PEM encoded SSL/TLS private key. The key is opened before dropping root
|
||
privileges, so keep the key file unreadable by anyone but root. Defaults to
|
||
@samp{"</etc/dovecot/private/default.pem"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-key-password
|
||
If key file is password protected, give the password here. Alternatively
|
||
give it when starting dovecot with -p parameter. Since this file is often
|
||
world-readable, you may want to place this setting instead to a different.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-ca
|
||
PEM encoded trusted certificate authority. Set this only if you intend to
|
||
use @samp{ssl-verify-client-cert? #t}. The file should contain the CA
|
||
certificate(s) followed by the matching CRL(s). (e.g.@: @samp{ssl-ca
|
||
</etc/ssl/certs/ca.pem}). Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean ssl-require-crl?
|
||
Require that CRL check succeeds for client certificates. Defaults to
|
||
@samp{#t}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean ssl-verify-client-cert?
|
||
Request client to send a certificate. If you also want to require it, set
|
||
@samp{auth-ssl-require-client-cert? #t} in auth section. Defaults to
|
||
@samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-cert-username-field
|
||
Which field from certificate to use for username. commonName and
|
||
x500UniqueIdentifier are the usual choices. You'll also need to set
|
||
@samp{auth-ssl-username-from-cert? #t}. Defaults to @samp{"commonName"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-min-protocol
|
||
Minimum SSL protocol version to accept. Defaults to @samp{"TLSv1"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-cipher-list
|
||
SSL ciphers to use. Defaults to
|
||
@samp{"ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@@STRENGTH"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string ssl-crypto-device
|
||
SSL crypto device to use, for valid values run "openssl engine". Defaults
|
||
to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string postmaster-address
|
||
Address to use when sending rejection mails. %d expands to recipient
|
||
domain. Defaults to @samp{"postmaster@@%d"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string hostname
|
||
Hostname to use in various parts of sent mails (e.g.@: in Message-Id) and
|
||
in LMTP replies. Default is the system's real hostname@@domain. Defaults
|
||
to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean quota-full-tempfail?
|
||
If user is over quota, return with temporary failure instead of bouncing the
|
||
mail. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} file-name sendmail-path
|
||
Binary to use for sending mails. Defaults to @samp{"/usr/sbin/sendmail"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string submission-host
|
||
If non-empty, send mails via this SMTP host[:port] instead of sendmail.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string rejection-subject
|
||
Subject: header to use for rejection mails. You can use the same variables
|
||
as for @samp{rejection-reason} below. Defaults to @samp{"Rejected: %s"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string rejection-reason
|
||
Human readable error message for rejection mails. You can use variables:
|
||
|
||
@table @code
|
||
@item %n
|
||
CRLF
|
||
@item %r
|
||
reason
|
||
@item %s
|
||
original subject
|
||
@item %t
|
||
recipient
|
||
@end table
|
||
Defaults to @samp{"Your message to <%t> was automatically rejected:%n%r"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string recipient-delimiter
|
||
Delimiter character between local-part and detail in email address.
|
||
Defaults to @samp{"+"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string lda-original-recipient-header
|
||
Header where the original recipient address (SMTP's RCPT TO: address) is
|
||
taken from if not available elsewhere. With dovecot-lda -a parameter
|
||
overrides this. A commonly used header for this is X-Original-To. Defaults
|
||
to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean lda-mailbox-autocreate?
|
||
Should saving a mail to a nonexistent mailbox automatically create it?.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} boolean lda-mailbox-autosubscribe?
|
||
Should automatically created mailboxes be also automatically subscribed?.
|
||
Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} non-negative-integer imap-max-line-length
|
||
Maximum IMAP command line length. Some clients generate very long command
|
||
lines with huge mailboxes, so you may need to raise this if you get "Too
|
||
long argument" or "IMAP command line too large" errors often. Defaults to
|
||
@samp{64000}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string imap-logout-format
|
||
IMAP logout format string:
|
||
@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
|
||
See @file{doc/wiki/Variables.txt} for a list of all the variables you can
|
||
use. Defaults to @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 {@code{dovecot-configuration} parameter} string imap-capability
|
||
Override the IMAP CAPABILITY response. If the value begins with '+', add
|
||
the given capabilities on top of the defaults (e.g.@: +XFOO XBAR). Defaults
|
||
to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string imap-idle-notify-interval
|
||
How long to wait between "OK Still here" notifications when client is
|
||
IDLEing. Defaults to @samp{"2 mins"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string imap-id-send
|
||
ID field names and values to send to clients. Using * as the value makes
|
||
Dovecot use the default value. The following fields have default values
|
||
currently: name, version, os, os-version, support-url, support-email.
|
||
Defaults to @samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string imap-id-log
|
||
ID fields sent by client to log. * means everything. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} space-separated-string-list imap-client-workarounds
|
||
Workarounds for various client bugs:
|
||
|
||
@table @code
|
||
@item delay-newmail
|
||
Send EXISTS/RECENT new mail notifications only when replying to NOOP and
|
||
CHECK commands. Some clients ignore them otherwise, for example OSX Mail
|
||
(<v2.1). Outlook Express breaks more badly though, without this it may show
|
||
user "Message no longer in server" errors. Note that OE6 still breaks even
|
||
with this workaround if synchronization is set to "Headers Only".
|
||
|
||
@item tb-extra-mailbox-sep
|
||
Thunderbird gets somehow confused with LAYOUT=fs (mbox and dbox) and adds
|
||
extra @samp{/} suffixes to mailbox names. This option causes Dovecot to
|
||
ignore the extra @samp{/} instead of treating it as invalid mailbox name.
|
||
|
||
@item tb-lsub-flags
|
||
Show \Noselect flags for LSUB replies with LAYOUT=fs (e.g.@: mbox). This
|
||
makes Thunderbird realize they aren't selectable and show them greyed out,
|
||
instead of only later giving "not selectable" popup error.
|
||
@end table
|
||
Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{dovecot-configuration} parameter} string imap-urlauth-host
|
||
Host allowed in URLAUTH URLs sent by client. "*" allows all. Defaults to
|
||
@samp{""}.
|
||
@end deftypevr
|
||
|
||
|
||
Whew! Lots of configuration options. The nice thing about it though is that
|
||
Guix has a complete interface to Dovecot's configuration language. This
|
||
allows not only a nice way to declare configurations, but also offers
|
||
reflective capabilities as well: users can write code to inspect and
|
||
transform configurations from within Scheme.
|
||
|
||
However, it could be that you just want to get a @code{dovecot.conf} up and
|
||
running. In that case, you can pass an @code{opaque-dovecot-configuration}
|
||
as the @code{#:config} parameter to @code{dovecot-service}. As its name
|
||
indicates, an opaque configuration does not have easy reflective
|
||
capabilities.
|
||
|
||
Available @code{opaque-dovecot-configuration} fields are:
|
||
|
||
@deftypevr {@code{opaque-dovecot-configuration} parameter} package dovecot
|
||
El paquete dovecot.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{opaque-dovecot-configuration} parameter} string string
|
||
The contents of the @code{dovecot.conf}, as a string.
|
||
@end deftypevr
|
||
|
||
For example, if your @code{dovecot.conf} is just the empty string, you could
|
||
instantiate a dovecot service like this:
|
||
|
||
@example
|
||
(dovecot-service #:config
|
||
(opaque-dovecot-configuration
|
||
(string "")))
|
||
@end example
|
||
|
||
@subsubheading Servicio OpenSMTPD
|
||
|
||
@deffn {Variable Scheme} opensmtpd-service-type
|
||
This is the type of the @uref{https://www.opensmtpd.org, OpenSMTPD} service,
|
||
whose value should be an @code{opensmtpd-configuration} object as in this
|
||
example:
|
||
|
||
@example
|
||
(service opensmtpd-service-type
|
||
(opensmtpd-configuration
|
||
(config-file (local-file "./mi-smtpd.conf"))))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} opensmtpd-configuration
|
||
Data type representing the configuration of opensmtpd.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{opensmtpd})
|
||
El objeto paquete del servidor SMTP OpenSMTPD.
|
||
|
||
@item @code{config-file} (predeterminado: @var{%default-opensmtpd-file})
|
||
File-like object of the OpenSMTPD configuration file to use. By default it
|
||
listens on the loopback network interface, and allows for mail from users
|
||
and daemons on the local machine, as well as permitting email to remote
|
||
servers. Run @command{man smtpd.conf} for more information.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Servicio Exim
|
||
|
||
@cindex mail transfer agent (MTA)
|
||
@cindex MTA (mail transfer agent)
|
||
@cindex SMTP
|
||
|
||
@deffn {Variable Scheme} exim-service-type
|
||
This is the type of the @uref{https://exim.org, Exim} mail transfer agent
|
||
(MTA), whose value should be an @code{exim-configuration} object as in this
|
||
example:
|
||
|
||
@example
|
||
(service exim-service-type
|
||
(exim-configuration
|
||
(config-file (local-file "./mi-exim.conf"))))
|
||
@end example
|
||
@end deffn
|
||
|
||
In order to use an @code{exim-service-type} service you must also have a
|
||
@code{mail-aliases-service-type} service present in your
|
||
@code{operating-system} (even if it has no aliases).
|
||
|
||
@deftp {Tipo de datos} exim-configuration
|
||
Tipo de datos que representa la configuración de exim.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{exim})
|
||
Package object of the Exim server.
|
||
|
||
@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 Servicios de alias de correo
|
||
|
||
@cindex correo electrónico, alias
|
||
@cindex alias, para direcciones de correo electrónico
|
||
|
||
@deffn {Variable Scheme} mail-aliases-service-type
|
||
This is the type of the service which provides @code{/etc/aliases},
|
||
specifying how to deliver mail to users on this system.
|
||
|
||
@example
|
||
(service mail-aliases-service-type
|
||
'(("postmaster" "rober")
|
||
("rober" "rober@@example.com" "rober@@example2.com")))
|
||
@end example
|
||
@end deffn
|
||
|
||
The configuration for a @code{mail-aliases-service-type} service is an
|
||
association list denoting how to deliver mail that comes to this
|
||
system. Each entry is of the form @code{(alias addresses ...)}, with
|
||
@code{alias} specifying the local alias and @code{addresses} specifying
|
||
where to deliver this user's mail.
|
||
|
||
The aliases aren't required to exist as users on the local system. In the
|
||
above example, there doesn't need to be a @code{postmaster} entry in the
|
||
@code{operating-system}'s @code{user-accounts} in order to deliver the
|
||
@code{postmaster} mail to @code{bob} (which subsequently would deliver mail
|
||
to @code{bob@@example.com} and @code{bob@@example2.com}).
|
||
|
||
@subsubheading GNU Mailutils IMAP4 Daemon
|
||
@cindex GNU Mailutils IMAP4 Daemon
|
||
|
||
@deffn {Scheme Variable} imap4d-service-type
|
||
This is the type of the GNU Mailutils IMAP4 Daemon (@pxref{imap4d,,,
|
||
mailutils, GNU Mailutils Manual}), whose value should be an
|
||
@code{imap4d-configuration} object as in this example:
|
||
|
||
@example
|
||
(service imap4d-service-type
|
||
(imap4d-configuration
|
||
(config-file (local-file "imap4d.conf"))))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Data Type} imap4d-configuration
|
||
Data type representing the configuration of @command{imap4d}.
|
||
|
||
@table @asis
|
||
@item @code{package} (default: @code{mailutils})
|
||
The package that provides @command{imap4d}.
|
||
|
||
@item @code{config-file} (default: @code{%default-imap4d-config-file})
|
||
File-like object of the configuration file to use, by default it will listen
|
||
on TCP port 143 of @code{localhost}. @xref{Conf-imap4d,,, mailutils, GNU
|
||
Mailutils Manual}, for details.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de mensajería
|
||
@subsection Servicios de mensajería
|
||
|
||
@cindex messaging
|
||
@cindex jabber
|
||
@cindex XMPP
|
||
The @code{(gnu services messaging)} module provides Guix service definitions
|
||
for messaging services: currently only Prosody is supported.
|
||
|
||
@subsubheading Servicio Prosody
|
||
|
||
@deffn {Variable Scheme} prosody-service-type
|
||
This is the type for the @uref{https://prosody.im, Prosody XMPP
|
||
communication server}. Its value must be a @code{prosody-configuration}
|
||
record as in this example:
|
||
|
||
@example
|
||
(service prosody-service-type
|
||
(prosody-configuration
|
||
(modules-enabled (cons "groups" "mam" %default-modules-enabled))
|
||
(int-components
|
||
(list
|
||
(int-component-configuration
|
||
(hostname "conference.example.net")
|
||
(plugin "muc")
|
||
(mod-muc (mod-muc-configuration)))))
|
||
(virtualhosts
|
||
(list
|
||
(virtualhost-configuration
|
||
(domain "example.net"))))))
|
||
@end example
|
||
|
||
See below for details about @code{prosody-configuration}.
|
||
|
||
@end deffn
|
||
|
||
By default, Prosody does not need much configuration. Only one
|
||
@code{virtualhosts} field is needed: it specifies the domain you wish
|
||
Prosody to serve.
|
||
|
||
You can perform various sanity checks on the generated configuration with
|
||
the @code{prosodyctl check} command.
|
||
|
||
Prosodyctl will also help you to import certificates from the
|
||
@code{letsencrypt} directory so that the @code{prosody} user can access
|
||
them. See @url{https://prosody.im/doc/letsencrypt}.
|
||
|
||
@example
|
||
prosodyctl --root cert import /etc/letsencrypt/live
|
||
@end example
|
||
|
||
The available configuration parameters follow. Each parameter definition is
|
||
preceded by its type; for example, @samp{string-list foo} indicates that the
|
||
@code{foo} parameter should be specified as a list of strings. Types
|
||
starting with @code{maybe-} denote parameters that won't show up in
|
||
@code{prosody.cfg.lua} when their value is @code{'disabled}.
|
||
|
||
There is also a way to specify the configuration as a string, if you have an
|
||
old @code{prosody.cfg.lua} file that you want to port over from some other
|
||
system; see the end for more details.
|
||
|
||
The @code{file-object} type designates either a file-like object
|
||
(@pxref{Expresiones-G, file-like objects}) or a file name.
|
||
|
||
@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.
|
||
|
||
Available @code{prosody-configuration} fields are:
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} package prosody
|
||
El paquete Prosody.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} file-name data-path
|
||
Location of the Prosody data storage directory. See
|
||
@url{https://prosody.im/doc/configure}. Defaults to
|
||
@samp{"/var/lib/prosody"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} file-object-list 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 {@code{prosody-configuration} parameter} file-name certificates
|
||
Every virtual host and component needs a certificate so that clients and
|
||
servers can securely verify its identity. Prosody will automatically load
|
||
certificates/keys from the directory specified here. Defaults to
|
||
@samp{"/etc/prosody/certs"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string-list admins
|
||
This is a list of accounts that are admins for the server. Note that you
|
||
must create the accounts separately. See
|
||
@url{https://prosody.im/doc/admins} and
|
||
@url{https://prosody.im/doc/creating_accounts}. Example: @code{(admins
|
||
'("user1@@example.com" "user2@@example.net"))} Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} boolean use-libevent?
|
||
Enable use of libevent for better performance under high load. See
|
||
@url{https://prosody.im/doc/libevent}. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} module-list modules-enabled
|
||
This is the list of modules Prosody will load on startup. It looks for
|
||
@code{mod_modulename.lua} in the plugins folder, so make sure that exists
|
||
too. Documentation on modules can be found at:
|
||
@url{https://prosody.im/doc/modules}. Defaults to @samp{("roster"
|
||
"saslauth" "tls" "dialback" "disco" "carbons" "private" "blocklist" "vcard"
|
||
"version" "uptime" "time" "ping" "pep" "register" "admin_adhoc")}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string-list modules-disabled
|
||
@samp{"offline"}, @samp{"c2s"} and @samp{"s2s"} are auto-loaded, but should
|
||
you want to disable them then add them to this list. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} file-object groups-file
|
||
Path to a text file where the shared groups are defined. If this path is
|
||
empty then @samp{mod_groups} does nothing. See
|
||
@url{https://prosody.im/doc/modules/mod_groups}. Defaults to
|
||
@samp{"/var/lib/prosody/sharedgroups.txt"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} boolean allow-registration?
|
||
Disable account creation by default, for security. See
|
||
@url{https://prosody.im/doc/creating_accounts}. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} maybe-ssl-configuration ssl
|
||
These are the SSL/TLS-related settings. Most of them are disabled so to use
|
||
Prosody's defaults. If you do not completely understand these options, do
|
||
not add them to your config, it is easy to lower the security of your server
|
||
using them. See @url{https://prosody.im/doc/advanced_ssl_config}.
|
||
|
||
Available @code{ssl-configuration} fields are:
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string protocol
|
||
This determines what handshake to use.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-file-name key
|
||
Path to your private key file.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-file-name certificate
|
||
Path to your certificate file.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} file-object capath
|
||
Path to directory containing root certificates that you wish Prosody to
|
||
trust when verifying the certificates of remote servers. Defaults to
|
||
@samp{"/etc/ssl/certs"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-file-object cafile
|
||
Path to a file containing root certificates that you wish Prosody to trust.
|
||
Similar to @code{capath} but with all certificates concatenated together.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string-list verify
|
||
A list of verification options (these mostly map to OpenSSL's
|
||
@code{set_verify()} flags).
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string-list 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 {@code{ssl-configuration} parameter} maybe-non-negative-integer depth
|
||
How long a chain of certificate authorities to check when looking for a
|
||
trusted root certificate.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string ciphers
|
||
An OpenSSL cipher string. This selects what ciphers Prosody will offer to
|
||
clients, and in what order.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-file-name dhparam
|
||
A path to a file containing parameters for Diffie-Hellman key exchange. You
|
||
can create such a file with: @code{openssl dhparam -out
|
||
/etc/prosody/certs/dh-2048.pem 2048}
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string curve
|
||
Curve for Elliptic curve Diffie-Hellman. Prosody's default is
|
||
@samp{"secp384r1"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string-list verifyext
|
||
A list of "extra" verification options.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ssl-configuration} parameter} maybe-string password
|
||
Password for encrypted private keys.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} boolean c2s-require-encryption?
|
||
Whether to force all client-to-server connections to be encrypted or not.
|
||
See @url{https://prosody.im/doc/modules/mod_tls}. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string-list disable-sasl-mechanisms
|
||
Set of mechanisms that will never be offered. See
|
||
@url{https://prosody.im/doc/modules/mod_saslauth}. Defaults to
|
||
@samp{("DIGEST-MD5")}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} boolean s2s-require-encryption?
|
||
Whether to force all server-to-server connections to be encrypted or not.
|
||
See @url{https://prosody.im/doc/modules/mod_tls}. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} boolean s2s-secure-auth?
|
||
Whether to require encryption and certificate authentication. This provides
|
||
ideal security, but requires servers you communicate with to support
|
||
encryption AND present valid, trusted certificates. See
|
||
@url{https://prosody.im/doc/s2s#security}. Defaults to @samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string-list s2s-insecure-domains
|
||
Many servers don't support encryption or have invalid or self-signed
|
||
certificates. You can list domains here that will not be required to
|
||
authenticate using certificates. They will be authenticated using DNS. See
|
||
@url{https://prosody.im/doc/s2s#security}. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string-list s2s-secure-domains
|
||
Even if you leave @code{s2s-secure-auth?} disabled, you can still require
|
||
valid certificates for some domains by specifying a list here. See
|
||
@url{https://prosody.im/doc/s2s#security}. Defaults to @samp{()}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string authentication
|
||
Select the authentication backend to use. The default provider stores
|
||
passwords in plaintext and uses Prosody's configured data storage to store
|
||
the authentication data. If you do not trust your server please see
|
||
@url{https://prosody.im/doc/modules/mod_auth_internal_hashed} for
|
||
information about using the hashed backend. See also
|
||
@url{https://prosody.im/doc/authentication} Defaults to
|
||
@samp{"internal_plain"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} maybe-string log
|
||
Set logging options. Advanced logging configuration is not yet supported by
|
||
the Prosody service. See @url{https://prosody.im/doc/logging}. Defaults to
|
||
@samp{"*syslog"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} file-name pidfile
|
||
File to write pid in. See @url{https://prosody.im/doc/modules/mod_posix}.
|
||
Defaults to @samp{"/var/run/prosody/prosody.pid"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} maybe-non-negative-integer http-max-content-size
|
||
Maximum allowed size of the HTTP body (in bytes).
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} maybe-string http-external-url
|
||
Some modules expose their own URL in various ways. This URL is built from
|
||
the protocol, host and port used. If Prosody sits behind a proxy, the
|
||
public URL will be @code{http-external-url} instead. See
|
||
@url{https://prosody.im/doc/http#external_url}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} virtualhost-configuration-list virtualhosts
|
||
A host in Prosody is a domain on which user accounts can be created. For
|
||
example if you want your users to have addresses like
|
||
@samp{"john.smith@@example.com"} then you need to add a host
|
||
@samp{"example.com"}. All options in this list will apply only to this
|
||
host.
|
||
|
||
Note: the name "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.
|
||
|
||
See @url{https://prosody.im/doc/configure#virtual_host_settings}.
|
||
|
||
Available @code{virtualhost-configuration} fields are:
|
||
|
||
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{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 {@code{virtualhost-configuration} parameter} string domain
|
||
Domain you wish Prosody to serve.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} int-component-configuration-list int-components
|
||
Components are extra services on a server which are available to clients,
|
||
usually on a subdomain of the main server (such as
|
||
@samp{"mycomponent.example.com"}). Example components might be chatroom
|
||
servers, user directories, or gateways to other protocols.
|
||
|
||
Internal components are implemented with Prosody-specific plugins. To add
|
||
an internal component, you simply fill the hostname field, and the plugin
|
||
you wish to use for the component.
|
||
|
||
See @url{https://prosody.im/doc/components}. Defaults to @samp{()}.
|
||
|
||
Available @code{int-component-configuration} fields are:
|
||
|
||
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{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 {@code{int-component-configuration} parameter} string hostname
|
||
Hostname of the component.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{int-component-configuration} parameter} string plugin
|
||
Plugin you wish to use for the component.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{int-component-configuration} parameter} maybe-mod-muc-configuration mod-muc
|
||
Multi-user chat (MUC) is Prosody's module for allowing you to create hosted
|
||
chatrooms/conferences for XMPP users.
|
||
|
||
General information on setting up and using multi-user chatrooms can be
|
||
found in the "Chatrooms" documentation
|
||
(@url{https://prosody.im/doc/chatrooms}), which you should read if you are
|
||
new to XMPP chatrooms.
|
||
|
||
See also @url{https://prosody.im/doc/modules/mod_muc}.
|
||
|
||
Available @code{mod-muc-configuration} fields are:
|
||
|
||
@deftypevr {@code{mod-muc-configuration} parameter} string name
|
||
The name to return in service discovery responses. Defaults to
|
||
@samp{"Prosody Chatrooms"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{mod-muc-configuration} parameter} string-or-boolean restrict-room-creation
|
||
If @samp{#t}, this will only allow admins to create new chatrooms.
|
||
Otherwise anyone can create a room. The value @samp{"local"} restricts room
|
||
creation to users on the service's parent domain. E.g.@:
|
||
@samp{user@@example.com} can create rooms on @samp{rooms.example.com}. The
|
||
value @samp{"admin"} restricts to service administrators only. Defaults to
|
||
@samp{#f}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{mod-muc-configuration} parameter} non-negative-integer max-history-messages
|
||
Maximum number of history messages that will be sent to the member that has
|
||
just joined the room. Defaults to @samp{20}.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} ext-component-configuration-list ext-components
|
||
External components use XEP-0114, which most standalone components support.
|
||
To add an external component, you simply fill the hostname field. See
|
||
@url{https://prosody.im/doc/components}. Defaults to @samp{()}.
|
||
|
||
Available @code{ext-component-configuration} fields are:
|
||
|
||
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{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 {@code{ext-component-configuration} parameter} string component-secret
|
||
Password which the component will use to log in.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ext-component-configuration} parameter} string hostname
|
||
Hostname of the component.
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} non-negative-integer-list component-ports
|
||
Port(s) Prosody listens on for component connections. Defaults to
|
||
@samp{(5347)}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} string component-interface
|
||
Interface Prosody listens on for component connections. Defaults to
|
||
@samp{"127.0.0.1"}.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{prosody-configuration} parameter} maybe-raw-content raw-content
|
||
Raw content that will be added to the configuration file.
|
||
@end deftypevr
|
||
|
||
It could be that you just want to get a @code{prosody.cfg.lua} up and
|
||
running. In that case, you can pass an @code{opaque-prosody-configuration}
|
||
record as the value of @code{prosody-service-type}. As its name indicates,
|
||
an opaque configuration does not have easy reflective capabilities.
|
||
Available @code{opaque-prosody-configuration} fields are:
|
||
|
||
@deftypevr {@code{opaque-prosody-configuration} parameter} package prosody
|
||
El paquete prosody.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{opaque-prosody-configuration} parameter} string prosody.cfg.lua
|
||
The contents of the @code{prosody.cfg.lua} to use.
|
||
@end deftypevr
|
||
|
||
For example, if your @code{prosody.cfg.lua} is just the empty string, you
|
||
could instantiate a prosody service like this:
|
||
|
||
@example
|
||
(service prosody-service-type
|
||
(opaque-prosody-configuration
|
||
(prosody.cfg.lua "")))
|
||
@end example
|
||
|
||
@c end of Prosody auto-generated documentation
|
||
|
||
@subsubheading Servicio BitlBee
|
||
|
||
@cindex IRC (Internet Relay Chat)
|
||
@cindex pasarela IRC
|
||
@url{http://bitlbee.org,BitlBee} is a gateway that provides an IRC interface
|
||
to a variety of messaging protocols such as XMPP.
|
||
|
||
@defvr {Variable Scheme} bitlbee-service-type
|
||
This is the service type for the @url{http://bitlbee.org,BitlBee} IRC
|
||
gateway daemon. Its value is a @code{bitlbee-configuration} (see below).
|
||
|
||
To have BitlBee listen on port 6667 on localhost, add this line to your
|
||
services:
|
||
|
||
@example
|
||
(service bitlbee-service-type)
|
||
@end example
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} bitlbee-configuration
|
||
This is the configuration for BitlBee, with the following fields:
|
||
|
||
@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}.
|
||
|
||
When @var{interface} is @code{127.0.0.1}, only local clients can connect;
|
||
when it is @code{0.0.0.0}, connections can come from any networking
|
||
interface.
|
||
|
||
@item @code{package} (predeterminado: @code{bitlbee})
|
||
El paquete BitlBee usado.
|
||
|
||
@item @code{plugins} (predeterminados: @code{'()})
|
||
List of plugin packages to use---e.g., @code{bitlbee-discord}.
|
||
|
||
@item @code{extra-settings} (predeterminado: @code{""})
|
||
Configuration snippet added as-is to the BitlBee configuration file.
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Quassel Service
|
||
|
||
@cindex IRC (Internet Relay Chat)
|
||
@url{https://quassel-irc.org/,Quassel} is a distributed IRC client, meaning
|
||
that one or more clients can attach to and detach from the central core.
|
||
|
||
@defvr {Scheme Variable} quassel-service-type
|
||
This is the service type for the @url{https://quassel-irc.org/,Quassel} IRC
|
||
backend daemon. Its value is a @code{quassel-configuration} (see below).
|
||
@end defvr
|
||
|
||
@deftp {Data Type} quassel-configuration
|
||
This is the configuration for Quassel, with the following fields:
|
||
|
||
@table @asis
|
||
@item @code{quassel} (default: @code{quassel})
|
||
The Quassel package to use.
|
||
|
||
@item @code{interface} (default: @code{"::,0.0.0.0"})
|
||
@item @code{port} (default: @code{4242})
|
||
Listen on the network interface(s) corresponding to the IPv4 or IPv6
|
||
interfaces specified in the comma delimited @var{interface}, on @var{port}.
|
||
|
||
@item @code{loglevel} (default: @code{"Info"})
|
||
The level of logging desired. Accepted values are Debug, Info, Warning and
|
||
Error.
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de telefonía
|
||
@subsection Servicios de telefonía
|
||
|
||
@cindex Murmur (servidor VoIP)
|
||
@cindex servidor VoIP
|
||
This section describes how to set up and run a Murmur server. Murmur is the
|
||
server of the @uref{https://mumble.info, Mumble} voice-over-IP (VoIP) suite.
|
||
|
||
@deftp {Tipo de datos} murmur-configuration
|
||
The service type for the Murmur server. An example configuration can look
|
||
like this:
|
||
|
||
@example
|
||
(service murmur-service-type
|
||
(murmur-configuration
|
||
(welcome-text
|
||
"Welcome to this Mumble server running on Guix!")
|
||
(cert-required? #t) ;disallow text password logins
|
||
(ssl-cert "/etc/letsencrypt/live/mumble.example.com/fullchain.pem")
|
||
(ssl-key "/etc/letsencrypt/live/mumble.example.com/privkey.pem")))
|
||
@end example
|
||
|
||
After reconfiguring your system, you can manually set the murmur
|
||
@code{SuperUser} password with the command that is printed during the
|
||
activation phase.
|
||
|
||
It is recommended to register a normal Mumble user account and grant it
|
||
admin or moderator rights. You can use the @code{mumble} client to login as
|
||
new normal user, register yourself, and log out. For the next step login
|
||
with the name @code{SuperUser} use the @code{SuperUser} password that you
|
||
set previously, and grant your newly registered mumble user administrator or
|
||
moderator rights and create some channels.
|
||
|
||
Available @code{murmur-configuration} fields are:
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{mumble})
|
||
Package that contains @code{bin/murmurd}.
|
||
|
||
@item @code{user} (predeterminado: @code{"murmur"})
|
||
User who will run the Murmur server.
|
||
|
||
@item @code{group} (predeterminado: @code{"murmur"})
|
||
Group of the user who will run the murmur server.
|
||
|
||
@item @code{port} (predeterminado: @code{64738})
|
||
Puerto en el que escucha el servidor.
|
||
|
||
@item @code{welcome-text} (predeterminado: @code{""})
|
||
Welcome text sent to clients when they connect.
|
||
|
||
@item @code{server-password} (predeterminada: @code{""})
|
||
Password the clients have to enter in order to connect.
|
||
|
||
@item @code{max-users} (predeterminados: @code{100})
|
||
Maximum of users that can be connected to the server at once.
|
||
|
||
@item @code{max-user-bandwidth} (predeterminado: @code{#f})
|
||
Maximum voice traffic a user can send per second.
|
||
|
||
@item @code{database-file} (predeterminado: @code{"/var/lib/murmur/db.sqlite"})
|
||
File name of the sqlite database. The service's user will become the owner
|
||
of the directory.
|
||
|
||
@item @code{log-file} (predeterminado: @code{"/var/log/murmur/murmur.log"})
|
||
File name of the log file. The service's user will become the owner of the
|
||
directory.
|
||
|
||
@item @code{autoban-attempts} (predeterminados: @code{10})
|
||
Maximum number of logins a user can make in @code{autoban-timeframe} without
|
||
getting auto banned for @code{autoban-time}.
|
||
|
||
@item @code{autoban-timeframe} (predeterminado: @code{120})
|
||
Timeframe for autoban in seconds.
|
||
|
||
@item @code{autoban-time} (predeterminado: @code{300})
|
||
Amount of time in seconds for which a client gets banned when violating the
|
||
autoban limits.
|
||
|
||
@item @code{opus-threshold} (predeterminado: @code{100})
|
||
Percentage of clients that need to support opus before switching over to
|
||
opus audio codec.
|
||
|
||
@item @code{channel-nesting-limit} (predeterminado: @code{10})
|
||
How deep channels can be nested at maximum.
|
||
|
||
@item @code{channelname-regex} (predeterminado: @code{#f})
|
||
A string in form of a Qt regular expression that channel names must conform
|
||
to.
|
||
|
||
@item @code{username-regex} (predeterminado: @code{#f})
|
||
A string in form of a Qt regular expression that user names must conform to.
|
||
|
||
@item @code{text-message-length} (predeterminado: @code{5000})
|
||
Maximum size in bytes that a user can send in one text chat message.
|
||
|
||
@item @code{image-message-length} (predeterminado: @code{(* 128 1024)})
|
||
Maximum size in bytes that a user can send in one image message.
|
||
|
||
@item @code{cert-required?} (predeterminado: @code{#f})
|
||
If it is set to @code{#t} clients that use weak password authentification
|
||
will not be accepted. Users must have completed the certificate wizard to
|
||
join.
|
||
|
||
@item @code{remember-channel?} (predeterminado: @code{#f})
|
||
Should murmur 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})
|
||
Should html be allowed in text messages, user comments, and channel
|
||
descriptions.
|
||
|
||
@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.
|
||
|
||
Disabling this setting will prevent public listing of the server.
|
||
|
||
@item @code{bonjour?} (predeterminado: @code{#f})
|
||
Should the server advertise itself in the local network through the bonjour
|
||
protocol.
|
||
|
||
@item @code{send-version?} (predeterminado: @code{#f})
|
||
Should the murmur server version be exposed in ping requests.
|
||
|
||
@item @code{log-days} (predeterminado: @code{31})
|
||
Murmur 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})
|
||
Should logged ips be obfuscated to protect the privacy of users.
|
||
|
||
@item @code{ssl-cert} (predeterminado: @code{#f})
|
||
File name of the SSL/TLS certificate used for encrypted connections.
|
||
|
||
@example
|
||
(ssl-cert "/etc/letsencrypt/live/example.com/fullchain.pem")
|
||
@end example
|
||
@item @code{ssl-key} (predeterminada: @code{#f})
|
||
Filepath to the ssl private key used for encrypted connections.
|
||
@example
|
||
(ssl-key "/etc/letsencrypt/live/example.com/privkey.pem")
|
||
@end example
|
||
|
||
@item @code{ssl-dh-params} (predeterminado: @code{#f})
|
||
File name of a PEM-encoded file with Diffie-Hellman parameters for the
|
||
SSL/TLS encryption. Alternatively you set it to @code{"@@ffdhe2048"},
|
||
@code{"@@ffdhe3072"}, @code{"@@ffdhe4096"}, @code{"@@ffdhe6144"} or
|
||
@code{"@@ffdhe8192"} to use bundled parameters from RFC 7919.
|
||
|
||
@item @code{ssl-ciphers} (predeterminado: @code{#f})
|
||
The @code{ssl-ciphers} option chooses the cipher suites to make available
|
||
for use in SSL/TLS.
|
||
|
||
This option is specified using
|
||
@uref{https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT,
|
||
OpenSSL cipher list notation}.
|
||
|
||
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
|
||
Murmur log to ensure that Murmur is using the cipher suites that you
|
||
expected it to.
|
||
|
||
Note: Changing this option may impact the backwards compatibility of your
|
||
Murmur server, and can remove the ability for older Mumble clients to be
|
||
able to connect to it.
|
||
|
||
@item @code{public-registration} (predeterminado: @code{#f})
|
||
Must be a @code{<murmur-public-registration-configuration>} record or
|
||
@code{#f}.
|
||
|
||
You can optionally register your server in the public server list that the
|
||
@code{mumble} client shows on startup. You cannot register your server if
|
||
you have set a @code{server-password}, or set @code{allow-ping} to
|
||
@code{#f}.
|
||
|
||
It might take a few hours until it shows up in the public list.
|
||
|
||
@item @code{file} (predeterminado: @code{#f})
|
||
Optional alternative override for this configuration.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} murmur-public-registration-configuration
|
||
Configuration for public registration of a murmur 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}
|
||
This should be a @code{http://} or @code{https://} link to your web site.
|
||
|
||
@item @code{hostname} (predeterminado: @code{#f})
|
||
By default your server will be listed by its IP address. If it is set your
|
||
server will be linked by this host name instead.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
|
||
@node Servicios de monitorización
|
||
@subsection Servicios de monitorización
|
||
|
||
@subsubheading Servicio Tailon
|
||
|
||
@uref{https://tailon.readthedocs.io/, Tailon} is a web application for
|
||
viewing and searching log files.
|
||
|
||
The following example will configure the service with default values. By
|
||
default, Tailon can be accessed on port 8080 (@code{http://localhost:8080}).
|
||
|
||
@example
|
||
(service tailon-service-type)
|
||
@end example
|
||
|
||
The following example customises more of the Tailon configuration, adding
|
||
@command{sed} to the list of allowed commands.
|
||
|
||
@example
|
||
(service tailon-service-type
|
||
(tailon-configuration
|
||
(config-file
|
||
(tailon-configuration-file
|
||
(allowed-commands '("tail" "grep" "awk" "sed"))))))
|
||
@end example
|
||
|
||
|
||
@deftp {Tipo de datos} tailon-configuration
|
||
Data type representing the configuration of Tailon. This type has the
|
||
following parameters:
|
||
|
||
@table @asis
|
||
@item @code{config-file} (predeterminado: @code{(tailon-configuration-file)})
|
||
The configuration file to use for Tailon. This can be set to a
|
||
@dfn{tailon-configuration-file} record value, or any gexp
|
||
(@pxref{Expresiones-G}).
|
||
|
||
For example, to instead use a local file, the @code{local-file} function can
|
||
be used:
|
||
|
||
@example
|
||
(service tailon-service-type
|
||
(tailon-configuration
|
||
(config-file (local-file "./mi-tailon.conf"))))
|
||
@end example
|
||
|
||
@item @code{package} (predeterminado: @code{tailon})
|
||
El paquete tailon usado.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} tailon-configuration-file
|
||
Tipo de datos que representa las opciones de configuración de Tailon. Este
|
||
tipo tiene los siguientes parámetros:
|
||
|
||
@table @asis
|
||
@item @code{files} (predeterminados: @code{(list "/var/log")})
|
||
List of files to display. The list can include strings for a single file or
|
||
directory, or a list, where the first item is the name of a subsection, and
|
||
the remaining items are the files or directories in that subsection.
|
||
|
||
@item @code{bind} (predeterminado: @code{"localhost:8080"})
|
||
Address and port to which Tailon should bind on.
|
||
|
||
@item @code{relative-root} (predeterminado: @code{#f})
|
||
URL path to use for Tailon, set to @code{#f} to not use a path.
|
||
|
||
@item @code{allow-transfers?} (predeterminado: @code{#t})
|
||
Allow downloading the log files in the web interface.
|
||
|
||
@item @code{follow-names?} (predeterminado: @code{#t})
|
||
Allow tailing of not-yet existent files.
|
||
|
||
@item @code{tail-lines} (predeterminado: @code{200})
|
||
Number of lines to read initially from each file.
|
||
|
||
@item @code{allowed-commands} (predeterminadas: @code{(list "tail" "grep" "awk")})
|
||
Órdenes cuya ejecución está permitida. Por defecto, @code{sed} está
|
||
deshabilitado.
|
||
|
||
@item @code{debug?} (predeterminado: @code{#f})
|
||
Set @code{debug?} to @code{#t} to show debug messages.
|
||
|
||
@item @code{wrap-lines} (predeterminado: @code{#t})
|
||
Initial line wrapping state in the web interface. Set to @code{#t} to
|
||
initially wrap lines (the default), or to @code{#f} to initially not wrap
|
||
lines.
|
||
|
||
@item @code{http-auth} (predeterminado: @code{#f})
|
||
HTTP authentication type to use. Set to @code{#f} to disable authentication
|
||
(the default). Supported values are @code{"digest"} or @code{"basic"}.
|
||
|
||
@item @code{users} (predeterminado: @code{#f})
|
||
If HTTP authentication is enabled (see @code{http-auth}), access will be
|
||
restricted to the credentials provided here. To configure users, use a list
|
||
of pairs, where the first element of the pair is the username, and the 2nd
|
||
element of the pair is the password.
|
||
|
||
@example
|
||
(tailon-configuration-file
|
||
(http-auth "basic")
|
||
(users '(("usuaria1" . "contraseña1")
|
||
("usuaria2" . "contraseña2"))))
|
||
@end example
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@subsubheading Servicio Darkstat
|
||
@cindex darkstat
|
||
Darkstat is a packet sniffer that captures network traffic, calculates
|
||
statistics about usage, and serves reports over HTTP.
|
||
|
||
@defvar {Variable Scheme} darkstat-service-type
|
||
This is the service type for the @uref{https://unix4lyfe.org/darkstat/,
|
||
darkstat} service, its value must be a @code{darkstat-configuration} record
|
||
as in this example:
|
||
|
||
@example
|
||
(service darkstat-service-type
|
||
(darkstat-configuration
|
||
(interface "eno1")))
|
||
@end example
|
||
@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"})
|
||
Bind the web interface to the specified port.
|
||
|
||
@item @code{bind-address} (predeterminada: @code{"127.0.0.1"})
|
||
Bind the web interface to the specified address.
|
||
|
||
@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
|
||
|
||
@subsubheading Servicio del exportador de nodos Prometheus
|
||
|
||
@cindex prometheus-node-exporter
|
||
The Prometheus ``node exporter'' makes hardware and operating system
|
||
statistics provided by the Linux kernel available for the Prometheus
|
||
monitoring system. This service should be deployed on all physical nodes
|
||
and virtual machines, where monitoring these statistics is desirable.
|
||
|
||
@defvar {Variable Scheme} prometheus-node-exporter-service-type
|
||
This is the service type for the
|
||
@uref{https://github.com/prometheus/node_exporter/,
|
||
prometheus-node-exporter} service, its value must be a
|
||
@code{prometheus-node-exporter-configuration} record as in this example:
|
||
|
||
@example
|
||
(service prometheus-node-exporter-service-type
|
||
(prometheus-node-exporter-configuration
|
||
(web-listen-address ":9100")))
|
||
@end example
|
||
@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"})
|
||
Bind the web interface to the specified address.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Zabbix server
|
||
@cindex zabbix zabbix-server
|
||
Zabbix provides monitoring metrics, among others network utilization, CPU
|
||
load and disk space consumption:
|
||
|
||
@itemize
|
||
@item High performance, high capacity (able to monitor hundreds of thousands of devices).
|
||
@item Auto-discovery of servers and network devices and interfaces.
|
||
@item Low-level discovery, allows to automatically start monitoring new items, file systems or network interfaces among others.
|
||
@item Distributed monitoring with centralized web administration.
|
||
@item Native high performance agents.
|
||
@item SLA, and ITIL KPI metrics on reporting.
|
||
@item High-level (business) view of monitored resources through user-defined visual console screens and dashboards.
|
||
@item Remote command execution through Zabbix proxies.
|
||
@end itemize
|
||
|
||
@c %start of fragment
|
||
|
||
Available @code{zabbix-server-configuration} fields are:
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} package zabbix-server
|
||
The zabbix-server package.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string user
|
||
User who will run the Zabbix server.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} group group
|
||
Group who will run the Zabbix server.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string db-host
|
||
Database host name.
|
||
|
||
Defaults to @samp{"127.0.0.1"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string db-name
|
||
Database name.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string db-user
|
||
Database user.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string db-password
|
||
Database password. Please, use @code{include-files} with
|
||
@code{DBPassword=SECRET} inside a specified file instead.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} number db-port
|
||
Database port.
|
||
|
||
Defaults to @samp{5432}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string log-type
|
||
Specifies where log messages are written to:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{system} - syslog.
|
||
|
||
@item
|
||
@code{file} - file specified with @code{log-file} parameter.
|
||
|
||
@item
|
||
@code{console} - standard output.
|
||
|
||
@end itemize
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string log-file
|
||
Log file name for @code{log-type} @code{file} parameter.
|
||
|
||
Defaults to @samp{"/var/log/zabbix/server.log"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string pid-file
|
||
Name of PID file.
|
||
|
||
Defaults to @samp{"/var/run/zabbix/zabbix_server.pid"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string ssl-ca-location
|
||
The location of certificate authority (CA) files for SSL server certificate
|
||
verification.
|
||
|
||
Defaults to @samp{"/etc/ssl/certs/ca-certificates.crt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string ssl-cert-location
|
||
Location of SSL client certificates.
|
||
|
||
Defaults to @samp{"/etc/ssl/certs"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} string extra-options
|
||
Extra options will be appended to Zabbix server configuration file.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-server-configuration} parameter} include-files include-files
|
||
You may include individual files or all files in a directory in the
|
||
configuration file.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@c %end of fragment
|
||
|
||
@subsubheading Zabbix agent
|
||
@cindex zabbix zabbix-agent
|
||
|
||
Zabbix agent gathers information for Zabbix server.
|
||
|
||
@c %start of fragment
|
||
|
||
Available @code{zabbix-agent-configuration} fields are:
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} package zabbix-agent
|
||
The zabbix-agent package.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string user
|
||
User who will run the Zabbix agent.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} group group
|
||
Group who will run the Zabbix agent.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string hostname
|
||
Unique, case sensitive hostname which is required for active checks and must
|
||
match hostname as configured on the server.
|
||
|
||
Defaults to @samp{"Zabbix server"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string log-type
|
||
Specifies where log messages are written to:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{system} - syslog.
|
||
|
||
@item
|
||
@code{file} - file specified with @code{log-file} parameter.
|
||
|
||
@item
|
||
@code{console} - standard output.
|
||
|
||
@end itemize
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string log-file
|
||
Log file name for @code{log-type} @code{file} parameter.
|
||
|
||
Defaults to @samp{"/var/log/zabbix/agent.log"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string pid-file
|
||
Name of PID file.
|
||
|
||
Defaults to @samp{"/var/run/zabbix/zabbix_agent.pid"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} list server
|
||
List of IP addresses, optionally in CIDR notation, or hostnames of Zabbix
|
||
servers and Zabbix proxies. Incoming connections will be accepted only from
|
||
the hosts listed here.
|
||
|
||
Defaults to @samp{("127.0.0.1")}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} list server-active
|
||
List of IP:port (or hostname:port) pairs of Zabbix servers and Zabbix
|
||
proxies for active checks. If port is not specified, default port is used.
|
||
If this parameter is not specified, active checks are disabled.
|
||
|
||
Defaults to @samp{("127.0.0.1")}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} string extra-options
|
||
Extra options will be appended to Zabbix server configuration file.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-agent-configuration} parameter} include-files include-files
|
||
You may include individual files or all files in a directory in the
|
||
configuration file.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@c %end of fragment
|
||
|
||
@subsubheading Zabbix front-end
|
||
@cindex zabbix zabbix-front-end
|
||
|
||
This service provides a WEB interface to Zabbix server.
|
||
|
||
@c %start of fragment
|
||
|
||
Available @code{zabbix-front-end-configuration} fields are:
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} nginx-server-configuration-list nginx
|
||
Configuración de NGINX.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-host
|
||
Database host name.
|
||
|
||
Defaults to @samp{"localhost"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} number db-port
|
||
Database port.
|
||
|
||
Defaults to @samp{5432}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-name
|
||
Database name.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-user
|
||
Database user.
|
||
|
||
Defaults to @samp{"zabbix"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-password
|
||
Database password. Please, use @code{db-secret-file} instead.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-secret-file
|
||
Secret file which will be appended to @file{zabbix.conf.php} file. This
|
||
file contains credentials for use by Zabbix front-end. You are expected to
|
||
create it manually.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} string zabbix-host
|
||
Zabbix server hostname.
|
||
|
||
Defaults to @samp{"localhost"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{zabbix-front-end-configuration} parameter} number zabbix-port
|
||
Zabbix server port.
|
||
|
||
Defaults to @samp{10051}.
|
||
|
||
@end deftypevr
|
||
|
||
|
||
@c %end of fragment
|
||
|
||
@node Servicios Kerberos
|
||
@subsection Servicios Kerberos
|
||
@cindex Kerberos
|
||
|
||
The @code{(gnu services kerberos)} module provides services relating to the
|
||
authentication protocol @dfn{Kerberos}.
|
||
|
||
@subsubheading Servicio Krb5
|
||
|
||
Programs using a Kerberos client library normally expect a configuration
|
||
file in @file{/etc/krb5.conf}. This service generates such a file from a
|
||
definition provided in the operating system declaration. It does not cause
|
||
any daemon to be started.
|
||
|
||
No ``keytab'' files are provided by this service---you must explicitly
|
||
create them. This service is known to work with the MIT client library,
|
||
@code{mit-krb5}. Other implementations have not been tested.
|
||
|
||
@defvr {Variable Scheme} krb5-service-type
|
||
A service type for Kerberos 5 clients.
|
||
@end defvr
|
||
|
||
@noindent
|
||
Este es un ejemplo de su uso:
|
||
@lisp
|
||
(service krb5-service-type
|
||
(krb5-configuration
|
||
(default-realm "EXAMPLE.COM")
|
||
(allow-weak-crypto? #t)
|
||
(realms (list
|
||
(krb5-realm
|
||
(name "EXAMPLE.COM")
|
||
(admin-server "groucho.example.com")
|
||
(kdc "karl.example.com"))
|
||
(krb5-realm
|
||
(name "ARGRX.EDU")
|
||
(admin-server "kerb-admin.argrx.edu")
|
||
(kdc "keys.argrx.edu"))))))
|
||
@end lisp
|
||
|
||
@noindent
|
||
This example provides a Kerberos@tie{}5 client configuration which:
|
||
@itemize
|
||
@item Recognizes two realms, @i{viz:} ``EXAMPLE.COM'' and ``ARGRX.EDU'', both
|
||
of which have distinct administration servers and key distribution centers;
|
||
@item Will default to the realm ``EXAMPLE.COM'' if the realm is not explicitly
|
||
specified by clients;
|
||
@item Accepts services which only support encryption types known to be weak.
|
||
@end itemize
|
||
|
||
The @code{krb5-realm} and @code{krb5-configuration} types have many fields.
|
||
Only the most commonly used ones are described here. For a full list, and
|
||
more detailed explanation of each, see the MIT
|
||
@uref{http://web.mit.edu/kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html,,krb5.conf}
|
||
documentation.
|
||
|
||
|
||
@deftp {Tipo de datos} krb5-realm
|
||
@cindex realm, kerberos
|
||
@table @asis
|
||
@item @code{name}
|
||
This field is a string identifying the name of the realm. A common
|
||
convention is to use the fully qualified DNS name of your organization,
|
||
converted to upper case.
|
||
|
||
@item @code{admin-server}
|
||
This field is a string identifying the host where the administration server
|
||
is running.
|
||
|
||
@item @code{kdc}
|
||
This field is a string identifying the key distribution center for the
|
||
realm.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} krb5-configuration
|
||
|
||
@table @asis
|
||
@item @code{allow-weak-crypto?} (predeterminado: @code{#f})
|
||
If this flag is @code{#t} then services which only offer encryption
|
||
algorithms known to be weak will be accepted.
|
||
|
||
@item @code{default-realm} (predeterminado: @code{#f})
|
||
This field should be a string identifying the default Kerberos realm for the
|
||
client. You should set this field to the name of your Kerberos realm. If
|
||
this value is @code{#f} then a realm must be specified with every Kerberos
|
||
principal when invoking programs such as @command{kinit}.
|
||
|
||
@item @code{realms}
|
||
This should be a non-empty list of @code{krb5-realm} objects, which clients
|
||
may access. Normally, one of them will have a @code{name} field matching
|
||
the @code{default-realm} field.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@subsubheading Servicio PAM krb5
|
||
@cindex pam-krb5
|
||
|
||
The @code{pam-krb5} service allows for login authentication and password
|
||
management via Kerberos. You will need this service if you want PAM enabled
|
||
applications to authenticate users using Kerberos.
|
||
|
||
@defvr {Variable Scheme} pam-krb5-service-type
|
||
A service type for the Kerberos 5 PAM module.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} pam-krb5-configuration
|
||
Data type representing the configuration of the Kerberos 5 PAM module This
|
||
type has the following parameters:
|
||
@table @asis
|
||
@item @code{pam-krb5} (predeterminado: @code{pam-krb5})
|
||
El paquete pam-krb5 usado.
|
||
|
||
@item @code{minimum-uid} (predeterminado: @code{1000})
|
||
The smallest user ID for which Kerberos authentications should be
|
||
attempted. Local accounts with lower values will silently fail to
|
||
authenticate.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@node Servicios LDAP
|
||
@subsection Servicios LDAP
|
||
@cindex LDAP
|
||
@cindex nslcd, LDAP service
|
||
|
||
The @code{(gnu services authentication)} module provides the
|
||
@code{nslcd-service-type}, which can be used to authenticate against an LDAP
|
||
server. In addition to configuring the service itself, you may want to add
|
||
@code{ldap} as a name service to the Name Service Switch. @xref{Selector de servicios de nombres} for detailed information.
|
||
|
||
Here is a simple operating system declaration with a default configuration
|
||
of the @code{nslcd-service-type} and a Name Service Switch configuration
|
||
that consults the @code{ldap} name service last:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@c %start of generated documentation for nslcd-configuration
|
||
|
||
Available @code{nslcd-configuration} fields are:
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} package nss-pam-ldapd
|
||
The @code{nss-pam-ldapd} package to use.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number threads
|
||
The number of threads to start that can handle requests and perform LDAP
|
||
queries. Each thread opens a separate connection to the LDAP server. The
|
||
default is to start 5 threads.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} string uid
|
||
This specifies the user id with which the daemon should be run.
|
||
|
||
Defaults to @samp{"nslcd"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} string gid
|
||
This specifies the group id with which the daemon should be run.
|
||
|
||
Defaults to @samp{"nslcd"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} log-option log
|
||
This option controls the way logging is done via a list containing SCHEME
|
||
and LEVEL. The SCHEME argument may either be the symbols "none" or
|
||
"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:
|
||
"crit", "error", "warning", "notice", "info" or "debug". All messages with
|
||
the specified log level or higher are logged.
|
||
|
||
Defaults to @samp{("/var/log/nslcd" info)}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} list uri
|
||
The list of LDAP server URIs. Normally, only the first server will be used
|
||
with the following servers as fall-back.
|
||
|
||
Defaults to @samp{("ldap://localhost:389/")}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string ldap-version
|
||
The version of the LDAP protocol to use. The default is to use the maximum
|
||
version supported by the LDAP library.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string binddn
|
||
Specifies the distinguished name with which to bind to the directory server
|
||
for lookups. The default is to bind anonymously.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string bindpw
|
||
Specifies the credentials with which to bind. This option is only
|
||
applicable when used with binddn.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string rootpwmoddn
|
||
Specifies the distinguished name to use when the root user tries to modify a
|
||
user's password using the PAM module.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string rootpwmodpw
|
||
Specifies the credentials with which to bind if the root user tries to
|
||
change a user's password. This option is only applicable when used with
|
||
rootpwmoddn
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string sasl-mech
|
||
Specifies the SASL mechanism to be used when performing SASL authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string sasl-realm
|
||
Specifies the SASL realm to be used when performing SASL authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string sasl-authcid
|
||
Specifies the authentication identity to be used when performing SASL
|
||
authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string sasl-authzid
|
||
Specifies the authorization identity to be used when performing SASL
|
||
authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean sasl-canonicalize?
|
||
Determines whether the LDAP server host name should be canonicalised. If
|
||
this is enabled the LDAP library will do a reverse host name lookup. By
|
||
default, it is left up to the LDAP library whether this check is performed
|
||
or not.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string krb5-ccname
|
||
Set the name for the GSS-API Kerberos credentials cache.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} string base
|
||
The directory search base.
|
||
|
||
Defaults to @samp{"dc=example,dc=com"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} scope-option scope
|
||
Specifies the search scope (subtree, onelevel, base or children). The
|
||
default scope is subtree; base scope is almost never useful for name service
|
||
lookups; children scope is not supported on all servers.
|
||
|
||
Defaults to @samp{(subtree)}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-deref-option deref
|
||
Specifies the policy for dereferencing aliases. The default policy is to
|
||
never dereference aliases.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean referrals
|
||
Specifies whether automatic referral chasing should be enabled. The default
|
||
behaviour is to chase referrals.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} list-of-map-entries maps
|
||
This option allows for custom attributes to be looked up instead of the
|
||
default RFC 2307 attributes. It is a list of maps, each consisting of the
|
||
name of a map, the RFC 2307 attribute to match and the query expression for
|
||
the attribute as it is available in the directory.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} list-of-filter-entries filters
|
||
A list of filters consisting of the name of a map to which the filter
|
||
applies and an LDAP search filter expression.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number bind-timelimit
|
||
Specifies the time limit in seconds to use when connecting to the directory
|
||
server. The default value is 10 seconds.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number timelimit
|
||
Specifies the time limit (in seconds) to wait for a response from the LDAP
|
||
server. A value of zero, which is the default, is to wait indefinitely for
|
||
searches to be completed.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number idle-timelimit
|
||
Specifies the period if inactivity (in seconds) after which the con‐ nection
|
||
to the LDAP server will be closed. The default is not to time out
|
||
connections.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number reconnect-sleeptime
|
||
Specifies the number of seconds to sleep when connecting to all LDAP servers
|
||
fails. By default one second is waited between the first failure and the
|
||
first retry.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number reconnect-retrytime
|
||
Specifies the time after which the LDAP server is considered to be
|
||
permanently unavailable. Once this time is reached retries will be done
|
||
only once per this time period. The default value is 10 seconds.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-ssl-option ssl
|
||
Specifies whether to use SSL/TLS or not (the default is not to). If
|
||
'start-tls is specified then StartTLS is used rather than raw LDAP over SSL.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-tls-reqcert-option tls-reqcert
|
||
Specifies what checks to perform on a server-supplied certificate. The
|
||
meaning of the values is described in the ldap.conf(5) manual page.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-cacertdir
|
||
Specifies the directory containing X.509 certificates for peer authen‐
|
||
tication. This parameter is ignored when using GnuTLS.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-cacertfile
|
||
Specifies the path to the X.509 certificate for peer authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-randfile
|
||
Specifies the path to an entropy source. This parameter is ignored when
|
||
using GnuTLS.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-ciphers
|
||
Specifies the ciphers to use for TLS as a string.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-cert
|
||
Specifies the path to the file containing the local certificate for client
|
||
TLS authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string tls-key
|
||
Specifies the path to the file containing the private key for client TLS
|
||
authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number pagesize
|
||
Set this to a number greater than 0 to request paged results from the LDAP
|
||
server in accordance with RFC2696. The default (0) is to not request paged
|
||
results.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-ignore-users-option nss-initgroups-ignoreusers
|
||
This option prevents group membership lookups through LDAP for the specified
|
||
users. Alternatively, the value 'all-local may be used. With that value
|
||
nslcd builds a full list of non-LDAP users on startup.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number nss-min-uid
|
||
This option ensures that LDAP users with a numeric user id lower than the
|
||
specified value are ignored.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number nss-uid-offset
|
||
This option specifies an offset that is added to all LDAP numeric user ids.
|
||
This can be used to avoid user id collisions with local users.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-number nss-gid-offset
|
||
This option specifies an offset that is added to all LDAP numeric group
|
||
ids. This can be used to avoid user id collisions with local groups.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean nss-nested-groups
|
||
If this option is set, the member attribute of a group may point to another
|
||
group. Members of nested groups are also returned in the higher level group
|
||
and parent groups are returned when finding groups for a specific user. The
|
||
default is not to perform extra searches for nested groups.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean nss-getgrent-skipmembers
|
||
If this option is set, the group member list is not retrieved when looking
|
||
up groups. Lookups for finding which groups a user belongs to will remain
|
||
functional so the user will likely still get the correct groups assigned on
|
||
login.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean nss-disable-enumeration
|
||
If this option is set, functions which cause all user/group entries to be
|
||
loaded from the directory will not succeed in doing so. This can
|
||
dramatically reduce LDAP server load in situations where there are a great
|
||
number of users and/or groups. This option is not recommended for most
|
||
configurations.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string validnames
|
||
This option can be used to specify how user and group names are verified
|
||
within the system. This pattern is used to check all user and group names
|
||
that are requested and returned from LDAP.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean ignorecase
|
||
This specifies whether or not to perform searches using case-insensitive
|
||
matching. Enabling this could open up the system to authorization bypass
|
||
vulnerabilities and introduce nscd cache poisoning vulnerabilities which
|
||
allow denial of service.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-boolean pam-authc-ppolicy
|
||
This option specifies whether password policy controls are requested and
|
||
handled from the LDAP server when performing user authentication.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string pam-authc-search
|
||
By default nslcd performs an LDAP search with the user's credentials after
|
||
BIND (authentication) to ensure that the BIND operation was successful. The
|
||
default search is a simple check to see if the user's DN exists. A search
|
||
filter can be specified that will be used instead. It should return at
|
||
least one entry.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string pam-authz-search
|
||
This option allows flexible fine tuning of the authorisation check that
|
||
should be performed. The search filter specified is executed and if any
|
||
entries match, access is granted, otherwise access is denied.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} maybe-string pam-password-prohibit-message
|
||
If this option is set password modification using pam_ldap will be denied
|
||
and the specified message will be presented to the user instead. The
|
||
message can be used to direct the user to an alternative means of changing
|
||
their password.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{nslcd-configuration} parameter} list pam-services
|
||
List of pam service names for which LDAP authentication should suffice.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@c %end of generated documentation for nslcd-configuration
|
||
|
||
|
||
@node Servicios Web
|
||
@subsection Servicios Web
|
||
|
||
@cindex web
|
||
@cindex www
|
||
@cindex HTTP
|
||
El módulo @code{(gnu services web)} proporciona el servidor HTTP Apache, el
|
||
servidor web nginx y también un recubrimiento del daemon de fastcgi.
|
||
|
||
@subsubheading Servidor HTTP Apache
|
||
|
||
@deffn {Variable Scheme} httpd-service-type
|
||
Service type for the @uref{https://httpd.apache.org/,Apache HTTP} server
|
||
(@dfn{httpd}). The value for this service type is a
|
||
@code{httpd-configuration} record.
|
||
|
||
A simple example configuration is given below.
|
||
|
||
@example
|
||
(service httpd-service-type
|
||
(httpd-configuration
|
||
(config
|
||
(httpd-config-file
|
||
(server-name "www.example.com")
|
||
(document-root "/srv/http/www.example.com")))))
|
||
@end example
|
||
|
||
Other services can also extend the @code{httpd-service-type} to add to the
|
||
configuration.
|
||
|
||
@example
|
||
(simple-service 'mi-servidor-extra httpd-service-type
|
||
(list
|
||
(httpd-virtualhost
|
||
"*:80"
|
||
(list (string-append
|
||
"ServerName "www.example.com
|
||
DocumentRoot \"/srv/http/www.example.com\"")))))
|
||
@end example
|
||
@end deffn
|
||
|
||
The details for the @code{httpd-configuration}, @code{httpd-module},
|
||
@code{httpd-config-file} and @code{httpd-virtualhost} record types are given
|
||
below.
|
||
|
||
@deffn {Tipo de datos} httpd-configuration
|
||
This data type represents the configuration for the httpd service.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{httpd})
|
||
El paquete httpd usado.
|
||
|
||
@item @code{pid-file} (predeterminado: @code{"/var/run/httpd"})
|
||
El fichero pid usado por el servicio de Shepherd.
|
||
|
||
@item @code{config} (predeterminado: @code{(httpd-config-file)})
|
||
The configuration file to use with the httpd service. The default value is a
|
||
@code{httpd-config-file} record, but this can also be a different
|
||
G-expression that generates a file, for example a @code{plain-file}. A file
|
||
outside of the store can also be specified through a string.
|
||
|
||
@end table
|
||
@end deffn
|
||
|
||
@deffn {Tipo de datos} httpd-module
|
||
This data type represents a module for the httpd service.
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
The name of the module.
|
||
|
||
@item @code{file}
|
||
The file for the module. This can be relative to the httpd package being
|
||
used, the absolute location of a file, or a G-expression for a file within
|
||
the store, for example @code{(file-append mod-wsgi "/modules/mod_wsgi.so")}.
|
||
|
||
@end table
|
||
@end deffn
|
||
|
||
@defvr {Variable Scheme} %default-httpd-modules
|
||
A default list of @code{httpd-module} objects.
|
||
@end defvr
|
||
|
||
@deffn {Tipo de datos} httpd-config-file
|
||
This data type represents a configuration file for the httpd service.
|
||
|
||
@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.
|
||
|
||
For example, in order to handle requests for PHP files, you can use Apache’s
|
||
@code{mod_proxy_fcgi} module along with @code{php-fpm-service-type}:
|
||
|
||
@example
|
||
(service httpd-service-type
|
||
(httpd-configuration
|
||
(config
|
||
(httpd-config-file
|
||
(modules (cons*
|
||
(httpd-module
|
||
(name "proxy_module")
|
||
(file "modules/mod_proxy.so"))
|
||
(httpd-module
|
||
(name "proxy_fcgi_module")
|
||
(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 example
|
||
|
||
@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})
|
||
The @code{ServerName} in the configuration file, used to specify the request
|
||
scheme, hostname and port that the server uses to identify itself.
|
||
|
||
This doesn't need to be set in the server config, and can be specifyed in
|
||
virtual hosts. The default is @code{#f} to not specify a @code{ServerName}.
|
||
|
||
@item @code{document-root} (predeterminado: @code{"/srv/http"})
|
||
The @code{DocumentRoot} from which files will be served.
|
||
|
||
@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"})
|
||
The @code{ErrorLog} to which the server will log errors.
|
||
|
||
@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")})
|
||
A flat list of strings and G-expressions which will be added to the end of
|
||
the configuration file.
|
||
|
||
Any values which the service is extended with will be appended to this list.
|
||
|
||
@end table
|
||
@end deffn
|
||
|
||
@deffn {Tipo de datos} httpd-virtualhost
|
||
This data type represents a virtualhost configuration block for the httpd
|
||
service.
|
||
|
||
These should be added to the extra-config for the httpd-service.
|
||
|
||
@example
|
||
(simple-service 'mi-servidor-extra httpd-service-type
|
||
(list
|
||
(httpd-virtualhost
|
||
"*:80"
|
||
(list (string-append
|
||
"ServerName "www.example.com
|
||
DocumentRoot \"/srv/http/www.example.com\"")))))
|
||
@end example
|
||
|
||
@table @asis
|
||
@item @code{addresses-and-ports}
|
||
The addresses and ports for the @code{VirtualHost} directive.
|
||
|
||
@item @code{contents}
|
||
The contents of the @code{VirtualHost} directive, this should be a list of
|
||
strings and G-expressions.
|
||
|
||
@end table
|
||
@end deffn
|
||
|
||
@subsubheading NGINX
|
||
|
||
@deffn {Variable Scheme} nginx-service-type
|
||
Service type for the @uref{https://nginx.org/,NGinx} web server. The value
|
||
for this service type is a @code{<nginx-configuration>} record.
|
||
|
||
A simple example configuration is given below.
|
||
|
||
@example
|
||
(service nginx-service-type
|
||
(nginx-configuration
|
||
(server-blocks
|
||
(list (nginx-server-configuration
|
||
(server-name '("www.example.com"))
|
||
(root "/srv/http/www.example.com"))))))
|
||
@end example
|
||
|
||
In addition to adding server blocks to the service configuration directly,
|
||
this service can be extended by other services to add server blocks, as in
|
||
this example:
|
||
|
||
@example
|
||
(simple-service 'mi-servidor-extra nginx-service-type
|
||
(list (nginx-server-configuration
|
||
(root "/srv/http/sitio-extra")
|
||
(try-files (list "$uri" "$uri/index.html")))))
|
||
@end example
|
||
@end deffn
|
||
|
||
At startup, @command{nginx} has not yet read its configuration file, so it
|
||
uses a default file to log error messages. If it fails to load its
|
||
configuration file, that is where error messages are logged. After the
|
||
configuration file is loaded, the default error log file changes as per
|
||
configuration. In our case, startup error messages can be found in
|
||
@file{/var/run/nginx/logs/error.log}, and after configuration in
|
||
@file{/var/log/nginx/error.log}. The second location can be changed with
|
||
the @var{log-directory} configuration option.
|
||
|
||
@deffn {Tipo de datos} nginx-configuration
|
||
This data type represents the configuration for NGinx. Some configuration
|
||
can be done through this and the other provided record types, or
|
||
alternatively, a config file can be provided.
|
||
|
||
@table @asis
|
||
@item @code{nginx} (predeterminado: @code{nginx})
|
||
El paquete nginx usado.
|
||
|
||
@item @code{log-directory} (predeterminado: @code{"/var/log/nginx"})
|
||
The directory to which NGinx will write log files.
|
||
|
||
@item @code{run-directory} (predeterminado: @code{"/var/run/nginx"})
|
||
The directory in which NGinx will create a pid file, and write temporary
|
||
files.
|
||
|
||
@item @code{server-blocks} (predeterminados: @code{'()})
|
||
A list of @dfn{server blocks} to create in the generated configuration file,
|
||
the elements should be of type @code{<nginx-server-configuration>}.
|
||
|
||
The following example would setup NGinx to serve @code{www.example.com} from
|
||
the @code{/srv/http/www.example.com} directory, without using HTTPS.
|
||
@example
|
||
(service nginx-service-type
|
||
(nginx-configuration
|
||
(server-blocks
|
||
(list (nginx-server-configuration
|
||
(server-name '("www.example.com"))
|
||
(root "/srv/http/www.example.com"))))))
|
||
@end example
|
||
|
||
@item @code{upstream-blocks} (predeterminados: @code{'()})
|
||
A list of @dfn{upstream blocks} to create in the generated configuration
|
||
file, the elements should be of type @code{<nginx-upstream-configuration>}.
|
||
|
||
Configuring upstreams through the @code{upstream-blocks} can be useful when
|
||
combined with @code{locations} in the @code{<nginx-server-configuration>}
|
||
records. The following example creates a server configuration with one
|
||
location configuration, that will proxy requests to a upstream
|
||
configuration, which will handle requests with two servers.
|
||
|
||
@example
|
||
(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 "/path1")
|
||
(body '("proxy_pass http://server-proxy;"))))))))
|
||
(upstream-blocks
|
||
(list (nginx-upstream-configuration
|
||
(name "server-proxy")
|
||
(servers (list "server1.example.com"
|
||
"server2.example.com")))))))
|
||
@end example
|
||
|
||
@item @code{file} (predeterminado: @code{#f})
|
||
If a configuration @var{file} is provided, this will be used, rather than
|
||
generating a configuration file from the provided @code{log-directory},
|
||
@code{run-directory}, @code{server-blocks} and @code{upstream-blocks}. For
|
||
proper operation, these arguments should match what is in @var{file} to
|
||
ensure that the directories are created when the service is activated.
|
||
|
||
This can be useful if you have an existing configuration file, or it's not
|
||
possible to do what is required through the other parts of the
|
||
nginx-configuration record.
|
||
|
||
@item @code{server-names-hash-bucket-size} (predeterminado: @code{#f})
|
||
Bucket size for the server names hash tables, defaults to @code{#f} to use
|
||
the size of the processors cache line.
|
||
|
||
@item @code{server-names-hash-bucket-max-size} (predeterminado: @code{#f})
|
||
Maximum bucket size for the server names hash tables.
|
||
|
||
@item @code{extra-content} (predeterminado: @code{""})
|
||
Extra content for the @code{http} block. Should be string or a string
|
||
valued G-expression.
|
||
|
||
@end table
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} nginx-server-configuration
|
||
Data type representing the configuration of an nginx server block. This
|
||
type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{listen} (predeterminadas: @code{'("80" "443 ssl")})
|
||
Each @code{listen} directive sets the address and port for IP, or the path
|
||
for a UNIX-domain socket on which the server will accept requests. Both
|
||
address and port, or only address or only port can be specified. An address
|
||
may also be a hostname, for example:
|
||
|
||
@example
|
||
'("127.0.0.1:8000" "127.0.0.1" "8000" "*:8000" "localhost:8000")
|
||
@end example
|
||
|
||
@item @code{server-name} (predeterminados: @code{(list 'default)})
|
||
A list of server names this server represents. @code{'default} represents
|
||
the default server for connections matching no other server.
|
||
|
||
@item @code{root} (predeterminada: @code{"/srv/http"})
|
||
Raíz del sitio web que nginx proporcionará.
|
||
|
||
@item @code{locations} (predeterminado: @code{'()})
|
||
A list of @dfn{nginx-location-configuration} or
|
||
@dfn{nginx-named-location-configuration} records to use within this server
|
||
block.
|
||
|
||
@item @code{index} (predeterminado: @code{(list "index.html")})
|
||
Index files to look for when clients ask for a directory. If it cannot be
|
||
found, Nginx will send the list of files in the directory.
|
||
|
||
@item @code{try-files} (predeterminado: @code{'()})
|
||
A list of files whose existence is checked in the specified order.
|
||
@code{nginx} will use the first file it finds to process the request.
|
||
|
||
@item @code{ssl-certificate} (predeterminado: @code{#f})
|
||
Where to find the certificate for secure connections. Set it to @code{#f}
|
||
if you don't have a certificate or you don't want to use HTTPS.
|
||
|
||
@item @code{ssl-certificate-key} (predeterminado: @code{#f})
|
||
Where to find the private key for secure connections. Set it to @code{#f}
|
||
if you don't have a key or you don't want to use HTTPS.
|
||
|
||
@item @code{server-tokens?} (predeterminado: @code{#f})
|
||
Whether the server should add its configuration to response.
|
||
|
||
@item @code{raw-content} (predeterminado: @code{'()})
|
||
A list of raw lines added to the server block.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} nginx-upstream-configuration
|
||
Data type representing the configuration of an nginx @code{upstream} block.
|
||
This type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
Name for this group of servers.
|
||
|
||
@item @code{servers}
|
||
Specify the addresses of the servers in the group. The address can be
|
||
specified as a IP address (e.g.@: @samp{127.0.0.1}), domain name (e.g.@:
|
||
@samp{backend1.example.com}) or a path to a UNIX socket using the prefix
|
||
@samp{unix:}. For addresses using an IP address or domain name, the default
|
||
port is 80, and a different port can be specified explicitly.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} nginx-location-configuration
|
||
Data type representing the configuration of an nginx @code{location} block.
|
||
This type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{uri}
|
||
URI which this location block matches.
|
||
|
||
@anchor{nginx-location-configuration body}
|
||
@item @code{body}
|
||
Body of the location block, specified as a list of strings. This can contain
|
||
many configuration directives. For example, to pass requests to a upstream
|
||
server group defined using an @code{nginx-upstream-configuration} block, the
|
||
following directive would be specified in the body @samp{(list "proxy_pass
|
||
http://upstream-name;")}.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} nginx-named-location-configuration
|
||
Data type representing the configuration of an nginx named location block.
|
||
Named location blocks are used for request redirection, and not used for
|
||
regular request processing. This type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
Name to identify this location block.
|
||
|
||
@item @code{body}
|
||
@xref{nginx-location-configuration body}, as the body for named location
|
||
blocks can be used in a similar way to the
|
||
@code{nginx-location-configuration body}. One restriction is that the body
|
||
of a named location block cannot contain location blocks.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Varnish Cache
|
||
@cindex Varnish
|
||
Varnish is a fast cache server that sits in between web applications and end
|
||
users. It proxies requests from clients and caches the accessed URLs such
|
||
that multiple requests for the same resource only creates one request to the
|
||
back-end.
|
||
|
||
@defvr {Variable Scheme} varnish-service-type
|
||
Service type for the Varnish daemon.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} varnish-configuration
|
||
Data type representing the @code{varnish} service configuration. This type
|
||
has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{varnish})
|
||
El paquete Varnish usado.
|
||
|
||
@item @code{name} (predeterminado: @code{"default"})
|
||
A name for this Varnish instance. Varnish will create a directory in
|
||
@file{/var/varnish/} with this name and keep temporary files there. If the
|
||
name starts with a forward slash, it is interpreted as an absolute directory
|
||
name.
|
||
|
||
Pass the @code{-n} argument to other Varnish programs to connect to the
|
||
named instance, e.g.@: @command{varnishncsa -n default}.
|
||
|
||
@item @code{backend} (predeterminado: @code{"localhost:8080"})
|
||
The backend to use. This option has no effect if @code{vcl} is set.
|
||
|
||
@item @code{vcl} (predeterminado: #f)
|
||
The @dfn{VCL} (Varnish Configuration Language) program to run. If this is
|
||
@code{#f}, Varnish will proxy @code{backend} using the default
|
||
configuration. Otherwise this must be a file-like object with valid VCL
|
||
syntax.
|
||
|
||
@c Varnish does not support HTTPS, so keep this URL to avoid confusion.
|
||
For example, to mirror @url{http://www.gnu.org,www.gnu.org} with VCL you can
|
||
do something along these lines:
|
||
|
||
@example
|
||
(define %espejo-gnu
|
||
(plain-file
|
||
"gnu.vcl"
|
||
"vcl 4.1;
|
||
backend gnu @{ .host = "www.gnu.org"; @}"))
|
||
|
||
(operating-system
|
||
...
|
||
(services (cons (service varnish-service-type
|
||
(varnish-configuration
|
||
(listen '(":80"))
|
||
(vcl %espejo-gnu)))
|
||
%base-services)))
|
||
@end example
|
||
|
||
The configuration of an already running Varnish instance can be inspected
|
||
and changed using the @command{varnishadm} program.
|
||
|
||
Consult the @url{https://varnish-cache.org/docs/,Varnish User Guide} and
|
||
@url{https://book.varnish-software.com/4.0/,Varnish Book} for comprehensive
|
||
documentation on Varnish and its configuration language.
|
||
|
||
@item @code{listen} (predeterminada: @code{'("localhost:80")})
|
||
Lista de direcciones en las que Varnish escucha.
|
||
|
||
@item @code{storage} (predeterminado: @code{'("malloc,128m")})
|
||
List of storage backends that will be available in VCL.
|
||
|
||
@item @code{parameters} (predeterminados: @code{'()})
|
||
List of run-time parameters in the form @code{'(("parameter" . "value"))}.
|
||
|
||
@item @code{extra-options} (predeterminadas: @code{'()})
|
||
Additional arguments to pass to the @command{varnishd} process.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading FastCGI
|
||
@cindex fastcgi
|
||
@cindex fcgiwrap
|
||
FastCGI is an interface between the front-end and the back-end of a web
|
||
service. It is a somewhat legacy facility; new web services should
|
||
generally just talk HTTP between the front-end and the back-end. However
|
||
there are a number of back-end services such as PHP or the optimized HTTP
|
||
Git repository access that use FastCGI, so we have support for it in Guix.
|
||
|
||
To use FastCGI, you configure the front-end web server (e.g., nginx) to
|
||
dispatch some subset of its requests to the fastcgi backend, which listens
|
||
on a local TCP or UNIX socket. There is an intermediary @code{fcgiwrap}
|
||
program that sits between the actual backend process and the web server.
|
||
The front-end indicates which backend program to run, passing that
|
||
information to the @code{fcgiwrap} process.
|
||
|
||
@defvr {Variable Scheme} fcgiwrap-service-type
|
||
A service type for the @code{fcgiwrap} FastCGI proxy.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} fcgiwrap-configuration
|
||
Data type representing the configuration of the @code{fcgiwrap} service.
|
||
This type has the following parameters:
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{fcgiwrap})
|
||
El paquete fcgiwrap usado.
|
||
|
||
@item @code{socket} (predeterminado: @code{tcp:127.0.0.1:9000})
|
||
The socket on which the @code{fcgiwrap} process should listen, as a string.
|
||
Valid @var{socket} values include @code{unix:@var{/path/to/unix/socket}},
|
||
@code{tcp:@var{dot.ted.qu.ad}:@var{port}} and
|
||
@code{tcp6:[@var{ipv6_addr}]:port}.
|
||
|
||
@item @code{user} (predeterminado: @code{fcgiwrap})
|
||
@itemx @code{group} (predeterminado: @code{fcgiwrap})
|
||
The user and group names, as strings, under which to run the @code{fcgiwrap}
|
||
process. The @code{fastcgi} service will ensure that if the user asks for
|
||
the specific user or group names @code{fcgiwrap} that the corresponding user
|
||
and/or group is present on the system.
|
||
|
||
It is possible to configure a FastCGI-backed web service to pass HTTP
|
||
authentication information from the front-end to the back-end, and to allow
|
||
@code{fcgiwrap} to run the back-end process as a corresponding local user.
|
||
To enable this capability on the back-end., run @code{fcgiwrap} as the
|
||
@code{root} user and group. Note that this capability also has to be
|
||
configured on the front-end as well.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex php-fpm
|
||
PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
|
||
implementation with some additional features useful for sites of any size.
|
||
|
||
These features include:
|
||
@itemize @bullet
|
||
@item Adaptive process spawning
|
||
@item Basic statistics (similar to Apache's mod_status)
|
||
@item Advanced process management with graceful stop/start
|
||
@item Ability to start workers with different uid/gid/chroot/environment
|
||
and different php.ini (replaces safe_mode)
|
||
@item Stdout & stderr logging
|
||
@item Emergency restart in case of accidental opcode cache destruction
|
||
@item Accelerated upload support
|
||
@item Support for a "slowlog"
|
||
@item Enhancements to FastCGI, such as fastcgi_finish_request() -
|
||
a special function to finish request & flush all data while continuing to do
|
||
something time-consuming (video converting, stats processing, etc.)
|
||
@end itemize
|
||
...@: and much more.
|
||
|
||
@defvr {Variable Scheme} php-fpm-service-type
|
||
Un tipo de servicio para @code{php-fpm}.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} php-fpm-configuration
|
||
Tipo de datos para la configuración del servicio php-fpm.
|
||
@table @asis
|
||
@item @code{php} (predeterminado: @code{php})
|
||
El paquete php usado.
|
||
@item @code{socket} (predeterminado: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.sock")})
|
||
La dirección desde la que FastCGI acepta peticiones. Las sintaxis válidas
|
||
son:
|
||
@table @asis
|
||
@item @code{"dir.ecc.ión.ip:puerto"}
|
||
Escucha con un socket TCP en la dirección especificada en un puerto
|
||
específico.
|
||
@item @code{"puerto"}
|
||
Escucha en un socket TCP en todas las direcciones sobre un puerto
|
||
específico.
|
||
@item @code{"/ruta/a/socket/unix"}
|
||
Escucha en un socket Unix.
|
||
@end table
|
||
|
||
@item @code{user} (predeterminada: @code{php-fpm})
|
||
User who will own the php worker processes.
|
||
@item @code{group} (predeterminado: @code{php-fpm})
|
||
Group of the worker processes.
|
||
@item @code{socket-user} (predeterminado: @code{php-fpm})
|
||
User who can speak to the php-fpm socket.
|
||
@item @code{socket-group} (predeterminado: @code{php-fpm})
|
||
Group that can speak to the php-fpm socket.
|
||
@item @code{pid-file} (predeterminado: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.pid")})
|
||
The process id of the php-fpm process is written to this file once the
|
||
service has started.
|
||
@item @code{log-file} (predeterminado: @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.log")})
|
||
Log for the php-fpm master process.
|
||
@item @code{process-manager} (predeterminado: @code{(php-fpm-dynamic-process-manager-configuration)})
|
||
Detailed settings for the php-fpm process manager. Must be either:
|
||
@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})
|
||
Determines whether php errors and warning should be sent to clients and
|
||
displayed in their browsers. This is useful for local php development, but
|
||
a security risk for public sites, as error messages can reveal passwords and
|
||
personal data.
|
||
@item @code{timezone} (default @code{#f})
|
||
Specifies @code{php_admin_value[date.timezone]} parameter.
|
||
@item @code{workers-logfile} (predeterminado @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.www.log")})
|
||
This file will log the @code{stderr} outputs of php worker processes. Can
|
||
be set to @code{#f} to disable logging.
|
||
@item @code{file} (predeterminado @code{#f})
|
||
An optional override of the whole configuration. You can use the
|
||
@code{mixed-text-file} function or an absolute filepath for it.
|
||
@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 it's configured limits.
|
||
@table @asis
|
||
@item @code{max-children} (predeterminados: @code{5})
|
||
Maximum of worker processes.
|
||
@item @code{start-servers} (predeterminados: @code{2})
|
||
How many worker processes should be started on start-up.
|
||
@item @code{min-spare-servers} (predeterminado: @code{1})
|
||
How many spare worker processes should be kept around at minimum.
|
||
@item @code{max-spare-servers} (predeterminados: @code{3})
|
||
How many spare worker processes should be kept around at maximum.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} php-fpm-static-process-manager-configuration
|
||
Data Type for the @code{static} php-fpm process manager. With the
|
||
@code{static} process manager, an unchanging number of worker processes are
|
||
created.
|
||
@table @asis
|
||
@item @code{max-children} (predeterminados: @code{5})
|
||
Maximum of worker processes.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} php-fpm-on-demand-process-manager-configuration
|
||
Data Type for the @code{on-demand} php-fpm process manager. With the
|
||
@code{on-demand} process manager, worker processes are only created as
|
||
requests arrive.
|
||
@table @asis
|
||
@item @code{max-children} (predeterminados: @code{5})
|
||
Maximum of worker processes.
|
||
@item @code{process-idle-timeout} (predeterminado: @code{10})
|
||
The time in seconds after which a process with no requests is killed.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@deffn {Procedimiento Scheme} nginx-php-fpm-location @
|
||
[#:nginx-package nginx] @ [socket (string-append "/var/run/php" @
|
||
(version-major (package-version php)) @ "-fpm.sock")] A helper function to
|
||
quickly add php to an @code{nginx-server-configuration}.
|
||
@end deffn
|
||
|
||
A simple services setup for nginx with php can look like this:
|
||
@example
|
||
(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 example
|
||
|
||
@cindex cat-avatar-generator
|
||
The cat avatar generator is a simple service to demonstrate the use of
|
||
php-fpm in @code{Nginx}. It is used to generate cat avatar from a seed, for
|
||
instance the hash of a user's email address.
|
||
|
||
@deffn {Scheme Procedure} cat-avatar-generator-service @
|
||
[#:cache-dir "/var/cache/cat-avatar-generator"] @ [#:package
|
||
cat-avatar-generator] @ [#:configuration (nginx-server-configuration)]
|
||
Returns an nginx-server-configuration that inherits @code{configuration}.
|
||
It extends the nginx configuration to add a server block that serves
|
||
@code{package}, a version of cat-avatar-generator. During execution,
|
||
cat-avatar-generator will be able to use @code{cache-dir} as its cache
|
||
directory.
|
||
@end deffn
|
||
|
||
A simple setup for cat-avatar-generator can look like this:
|
||
@example
|
||
(services (cons* (cat-avatar-generator-service
|
||
#:configuration
|
||
(nginx-server-configuration
|
||
(server-name '("example.com"))))
|
||
...
|
||
%base-services))
|
||
@end example
|
||
|
||
@subsubheading Hpcguix-web
|
||
|
||
@cindex hpcguix-web
|
||
The @uref{hpcguix-web, https://github.com/UMCUGenetics/hpcguix-web/} program
|
||
is a customizable web interface to browse Guix packages, initially designed
|
||
for users of high-performance computing (HPC) clusters.
|
||
|
||
@defvr {Variable Scheme} hpcguix-web-service-type
|
||
El tipo de servicio para @code{hpcguix-web}.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} hpcguix-web-configuration
|
||
El tipo de datos para la configuración del servicio hpcguix-web.
|
||
|
||
@table @asis
|
||
@item @code{specs}
|
||
A gexp (@pxref{Expresiones-G}) specifying the hpcguix-web service
|
||
configuration. The main items available in this spec 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"})
|
||
La orden @command{guix}.
|
||
|
||
@item @code{package-filter-proc} (predeterminado: @code{(const #t)})
|
||
A procedure specifying how to filter packages that are displayed.
|
||
|
||
@item @code{package-page-extension-proc} (predeterminado: @code{(const '())})
|
||
Extension package for @code{hpcguix-web}.
|
||
|
||
@item @code{menu} (predeterminadas: @code{'()})
|
||
Entradas adicionales en el menú de la página.
|
||
|
||
@item @code{channels} (predeterminados: @code{%default-channels})
|
||
List of channels from which the package list is built (@pxref{Canales}).
|
||
|
||
@item @code{package-list-expiration} (predeterminado: @code{(* 12 3600)})
|
||
The expiration time, in seconds, after which the package list is rebuilt
|
||
from the latest instances of the given channels.
|
||
@end table
|
||
|
||
See the hpcguix-web repository for a
|
||
@uref{https://github.com/UMCUGenetics/hpcguix-web/blob/master/hpcweb-configuration.scm,
|
||
complete example}.
|
||
|
||
@item @code{package} (predeterminado: @code{hpcguix-web})
|
||
The hpcguix-web package to use.
|
||
@end table
|
||
@end deftp
|
||
|
||
A typical hpcguix-web service declaration looks like this:
|
||
|
||
@example
|
||
(service hpcguix-web-service-type
|
||
(hpcguix-web-configuration
|
||
(specs
|
||
#~(define site-config
|
||
(hpcweb-configuration
|
||
(title-prefix "Guix-HPC - ")
|
||
(menu '(("/about" "ABOUT"))))))))
|
||
@end example
|
||
|
||
@quotation Nota
|
||
The hpcguix-web service periodically updates the package list it publishes
|
||
by pulling channels from Git. To that end, it needs to access X.509
|
||
certificates so that it can authenticate Git servers when communicating over
|
||
HTTPS, and it assumes that @file{/etc/ssl/certs} contains those
|
||
certificates.
|
||
|
||
Thus, make sure to add @code{nss-certs} or another certificate package to
|
||
the @code{packages} field of your configuration. @ref{Certificados X.509},
|
||
for more information on X.509 certificates.
|
||
@end quotation
|
||
|
||
@node Servicios de certificados
|
||
@subsection Servicios de certificados
|
||
|
||
@cindex Web
|
||
@cindex HTTP, HTTPS
|
||
@cindex Let's Encrypt
|
||
@cindex certificados TLS
|
||
The @code{(gnu services certbot)} module provides a service to automatically
|
||
obtain a valid TLS certificate from the Let's Encrypt certificate
|
||
authority. These certificates can then be used to serve content securely
|
||
over HTTPS or other TLS-based protocols, with the knowledge that the client
|
||
will be able to verify the server's authenticity.
|
||
|
||
@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.
|
||
|
||
The certbot service automates this process: the initial key generation, the
|
||
initial certification request to the Let's Encrypt service, the web server
|
||
challenge/response integration, writing the certificate to disk, the
|
||
automated periodic renewals, and the deployment tasks associated with the
|
||
renewal (e.g.@: reloading services, copying keys with different
|
||
permissions).
|
||
|
||
Certbot is run twice a day, at a random minute within the hour. It won't do
|
||
anything until your certificates are due for renewal or revoked, but running
|
||
it regularly would give your service a chance of staying online in case a
|
||
Let's Encrypt-initiated revocation happened for some reason.
|
||
|
||
By using this service, you agree to the ACME Subscriber Agreement, which can
|
||
be found there: @url{https://acme-v01.api.letsencrypt.org/directory}.
|
||
|
||
@defvr {Variable Scheme} certbot-service-type
|
||
A service type for the @code{certbot} Let's Encrypt client. Its value must
|
||
be a @code{certbot-configuration} record as in this example:
|
||
|
||
@example
|
||
(define %nginx-deploy-hook
|
||
(program-file
|
||
"nginx-deploy-hook"
|
||
#~(let ((pid (call-with-input-file "/var/run/nginx/pid" read)))
|
||
(kill pid SIGHUP))))
|
||
|
||
(service certbot-service-type
|
||
(certbot-configuration
|
||
(email "foo@@example.net")
|
||
(certificates
|
||
(list
|
||
(certificate-configuration
|
||
(domains '("example.net" "www.example.net"))
|
||
(deploy-hook %nginx-deploy-hook))
|
||
(certificate-configuration
|
||
(domains '("bar.example.net")))))))
|
||
@end example
|
||
|
||
See below for details about @code{certbot-configuration}.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} certbot-configuration
|
||
Data type representing the configuration of the @code{certbot} service.
|
||
This type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @code{certbot})
|
||
El paquete certbot usado.
|
||
|
||
@item @code{webroot} (predeterminado: @code{/var/www})
|
||
The directory from which to serve the Let's Encrypt challenge/response
|
||
files.
|
||
|
||
@item @code{certificates} (predeterminados: @code{()})
|
||
A list of @code{certificates-configuration}s for which to generate
|
||
certificates and request signatures. Each certificate has a @code{name} and
|
||
several @code{domains}.
|
||
|
||
@item @code{email}
|
||
Mandatory email used for registration, recovery contact, and important
|
||
account notifications.
|
||
|
||
@item @code{rsa-key-size} (predeterminado: @code{2048})
|
||
Tamaño de la clave RSA.
|
||
|
||
@item @code{default-location} (predeterminada: @i{vea a continuación})
|
||
The default @code{nginx-location-configuration}. Because @code{certbot}
|
||
needs to be able to serve challenges and responses, it needs to be able to
|
||
run a web server. It does so by extending the @code{nginx} web service with
|
||
an @code{nginx-server-configuration} listening on the @var{domains} on port
|
||
80, and which has a @code{nginx-location-configuration} for the
|
||
@code{/.well-known/} URI path subspace used by Let's Encrypt. @xref{Servicios Web}, for more on these nginx configuration data types.
|
||
|
||
Requests to other URL paths will be matched by the @code{default-location},
|
||
which if present is added to all @code{nginx-server-configuration}s.
|
||
|
||
By default, the @code{default-location} will issue a redirect from
|
||
@code{http://@var{domain}/...} to @code{https://@var{domain}/...}, leaving
|
||
you to define what to serve on your site via @code{https}.
|
||
|
||
Pass @code{#f} to not issue a default location.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} certificate-configuration
|
||
Data type representing the configuration of a certificate. This type has
|
||
the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{name} (predeterminado: @i{vea a continuación})
|
||
This name is used by Certbot for housekeeping and in file paths; it doesn't
|
||
affect the content of the certificate itself. To see certificate names, run
|
||
@code{certbot certificates}.
|
||
|
||
Its default is the first provided domain.
|
||
|
||
@item @code{domains} (predeterminado: @code{()})
|
||
The first domain provided will be the subject CN of the certificate, and all
|
||
domains will be Subject Alternative Names on the certificate.
|
||
|
||
@item @code{deploy-hook} (predeterminado: @code{#f})
|
||
Command to be run in a shell once for each successfully issued certificate.
|
||
For this command, the shell variable @code{$RENEWED_LINEAGE} will point to
|
||
the config live subdirectory (for example,
|
||
@samp{"/etc/letsencrypt/live/example.com"}) containing the new certificates
|
||
and keys; the shell variable @code{$RENEWED_DOMAINS} will contain a
|
||
space-delimited list of renewed certificate domains (for example,
|
||
@samp{"example.com www.example.com"}.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
For each @code{certificate-configuration}, the certificate is saved to
|
||
@code{/etc/letsencrypt/live/@var{name}/fullchain.pem} and the key is saved
|
||
to @code{/etc/letsencrypt/live/@var{name}/privkey.pem}.
|
||
@node Servicios DNS
|
||
@subsection Servicios DNS
|
||
@cindex DNS (domain name system)
|
||
@cindex domain name system (DNS)
|
||
|
||
The @code{(gnu services dns)} module provides services related to the
|
||
@dfn{domain name system} (DNS). It provides a server service for hosting an
|
||
@emph{authoritative} DNS server for multiple zones, slave or master. This
|
||
service uses @uref{https://www.knot-dns.cz/, Knot DNS}. And also a caching
|
||
and forwarding DNS server for the LAN, which uses
|
||
@uref{http://www.thekelleys.org.uk/dnsmasq/doc.html, dnsmasq}.
|
||
|
||
@subsubheading Servicio Knot
|
||
|
||
An example configuration of an authoritative server for two zones, one
|
||
master and one slave, is:
|
||
|
||
@lisp
|
||
(define-zone-entries example.org.zone
|
||
;; Name TTL Class Type Data
|
||
("@@" "" "IN" "A" "127.0.0.1")
|
||
("@@" "" "IN" "NS" "ns")
|
||
("ns" "" "IN" "A" "127.0.0.1"))
|
||
|
||
(define master-zone
|
||
(knot-zone-configuration
|
||
(domain "example.org")
|
||
(zone (zone-file
|
||
(origin "example.org")
|
||
(entries example.org.zone)))))
|
||
|
||
(define slave-zone
|
||
(knot-zone-configuration
|
||
(domain "plop.org")
|
||
(dnssec-policy "default")
|
||
(master (list "plop-master"))))
|
||
|
||
(define plop-master
|
||
(knot-remote-configuration
|
||
(id "plop-master")
|
||
(address (list "208.76.58.171"))))
|
||
|
||
(operating-system
|
||
;; ...
|
||
(services (cons* (service knot-service-type
|
||
(knot-configuration
|
||
(remotes (list plop-master))
|
||
(zones (list master-zone slave-zone))))
|
||
;; ...
|
||
%base-services)))
|
||
@end lisp
|
||
|
||
@deffn {Variable Scheme} knot-service-type
|
||
This is the type for the Knot DNS server.
|
||
|
||
Knot DNS is an authoritative DNS server, meaning that it can serve multiple
|
||
zones, that is to say domain names you would buy from a registrar. This
|
||
server is not a resolver, meaning that it can only resolve names for which
|
||
it is authoritative. This server can be configured to serve zones as a
|
||
master server or a slave server as a per-zone basis. Slave zones will get
|
||
their data from masters, and will serve it as an authoritative server. From
|
||
the point of view of a resolver, there is no difference between master and
|
||
slave.
|
||
|
||
The following data types are used to configure the Knot DNS server:
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} knot-key-configuration
|
||
Data type representing a key. This type has the following parameters:
|
||
|
||
@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})
|
||
The algorithm to use. Choose between @code{#f}, @code{'hmac-md5},
|
||
@code{'hmac-sha1}, @code{'hmac-sha224}, @code{'hmac-sha256},
|
||
@code{'hmac-sha384} and @code{'hmac-sha512}.
|
||
|
||
@item @code{secret} (predeterminado: @code{""})
|
||
The secret key itself.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} knot-acl-configuration
|
||
Data type representing an Access Control List (ACL) configuration. This
|
||
type has the following parameters:
|
||
|
||
@table @asis
|
||
@item @code{id} (predeterminado: @code{""})
|
||
An identifier for ether configuration fields to refer to this key. IDs must
|
||
be unique and must not be empty.
|
||
|
||
@item @code{address} (predeterminada: @code{'()})
|
||
An ordered list of IP addresses, network subnets, or network ranges
|
||
represented with strings. The query must match one of them. Empty value
|
||
means that address match is not required.
|
||
|
||
@item @code{key} (predeterminada: @code{'()})
|
||
An ordered list of references to keys represented with strings. The string
|
||
must match a key ID defined in a @code{knot-key-configuration}. No key
|
||
means that a key is not require to match that 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})
|
||
When true, the ACL defines restrictions. Listed actions are forbidden.
|
||
When false, listed actions are allowed.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} zone-entry
|
||
Data type represnting a record entry in a zone file. This type has the
|
||
following parameters:
|
||
|
||
@table @asis
|
||
@item @code{name} (predeterminado: @code{"@@"})
|
||
The name of the record. @code{"@@"} refers to the origin of the zone.
|
||
Names are relative to the origin of the zone. For example, in the
|
||
@code{example.org} zone, @code{"ns.example.org"} actually refers to
|
||
@code{ns.example.org.example.org}. Names ending with a dot are absolute,
|
||
which means that @code{"ns.example.org."} refers to @code{ns.example.org}.
|
||
|
||
@item @code{ttl} (predeterminado: @code{""})
|
||
The Time-To-Live (TTL) of this record. If not set, the default TTL is used.
|
||
|
||
@item @code{class} (predeterminada: @code{"IN"})
|
||
The class of the record. Knot currently supports only @code{"IN"} and
|
||
partially @code{"CH"}.
|
||
|
||
@item @code{type} (predeterminado: @code{"A"})
|
||
The type of the record. Common types include A (IPv4 address), AAAA (IPv6
|
||
address), NS (Name Server) and MX (Mail eXchange). Many other types are
|
||
defined.
|
||
|
||
@item @code{data} (predeterminados: @code{""})
|
||
The data contained in the record. For instance an IP address associated
|
||
with an A record, or a domain name associated with an NS record. Remember
|
||
that domain names are relative to the origin unless they end with a dot.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} zone-file
|
||
Data type representing the content of a zone file. This type has the
|
||
following parameters:
|
||
|
||
@table @asis
|
||
@item @code{entries} (predeterminadas: @code{'()})
|
||
The list of entries. The SOA record is taken care of, so you don't need to
|
||
put it in the list of entries. This list should probably contain an entry
|
||
for your primary authoritative DNS server. Other than using a list of
|
||
entries directly, you can use @code{define-zone-entries} to define a object
|
||
containing the list of entries more easily, that you can later pass to the
|
||
@code{entries} field of the @code{zone-file}.
|
||
|
||
@item @code{origin} (predeterminado: @code{""})
|
||
The name of your zone. This parameter cannot be empty.
|
||
|
||
@item @code{ns} (predeterminado: @code{"ns"})
|
||
The domain of your primary authoritative DNS server. The name is relative
|
||
to the origin, unless it ends with a dot. It is mandatory that this primary
|
||
DNS server corresponds to an NS record in the zone and that it is associated
|
||
to an IP address in the list of entries.
|
||
|
||
@item @code{mail} (predeterminado: @code{"hostmaster"})
|
||
An email address people can contact you at, as the owner of the zone. This
|
||
is translated as @code{<mail>@@<origin>}.
|
||
|
||
@item @code{serial} (predeterminado: @code{1})
|
||
The serial number of the zone. As this is used to keep track of changes by
|
||
both slaves and resolvers, it is mandatory that it @emph{never} decreases.
|
||
Always increment it when you make a change in your zone.
|
||
|
||
@item @code{refresh} (predeterminado: @code{(* 2 24 3600)})
|
||
The frequency at which slaves will do a zone transfer. This value is a
|
||
number of seconds. It can be computed by multiplications or with
|
||
@code{(string->duration)}.
|
||
|
||
@item @code{retry} (predeterminado: @code{(* 15 60)})
|
||
The period after which a slave will retry to contact its master when it
|
||
fails to do so a first time.
|
||
|
||
@item @code{expiry} (predeterminado: @code{(* 14 24 3600)})
|
||
Default TTL of records. Existing records are considered correct for at most
|
||
this amount of time. After this period, resolvers will invalidate their
|
||
cache and check again that it still exists.
|
||
|
||
@item @code{nx} (predeterminado: @code{3600})
|
||
Default TTL of inexistant 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
|
||
Data type representing a remote configuration. This type has the following
|
||
parameters:
|
||
|
||
@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{'()})
|
||
An ordered list of destination IP addresses. Addresses are tried in
|
||
sequence. An optional port can be given with the @@ separator. For
|
||
instance: @code{(list "1.2.3.4" "2.3.4.5@@53")}. Default port is 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})
|
||
A reference to a key, that is a string containing the identifier of a key
|
||
defined in a @code{knot-key-configuration} field.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} knot-keystore-configuration
|
||
Data type representing a keystore to hold dnssec keys. This type has the
|
||
following parameters:
|
||
|
||
@table @asis
|
||
@item @code{id} (predeterminado: @code{""})
|
||
The id of the keystore. It must not be empty.
|
||
|
||
@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"})
|
||
The configuration string of the backend. An example for the PKCS#11 is:
|
||
@code{"pkcs11:token=knot;pin-value=1234
|
||
/gnu/store/.../lib/pkcs11/libsofthsm2.so"}. For the pem backend, the string
|
||
reprensents a path in the file system.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} knot-policy-configuration
|
||
Data type representing a dnssec policy. Knot DNS is able to automatically
|
||
sign your zones. It can either generate and manage your keys automatically
|
||
or use keys that you generate.
|
||
|
||
Dnssec is usually implemented using two keys: a Key Signing Key (KSK) that
|
||
is used to sign the second, and a Zone Signing Key (ZSK) that is used to
|
||
sign the zone. In order to be trusted, the KSK needs to be present in the
|
||
parent zone (usually a top-level domain). If your registrar supports
|
||
dnssec, you will have to send them your KSK's hash so they can add a DS
|
||
record in their zone. This is not automated and need to be done each time
|
||
you change your KSK.
|
||
|
||
The policy also defines the lifetime of keys. Usually, ZSK can be changed
|
||
easily and use weaker cryptographic functions (they use lower parameters) in
|
||
order to sign records quickly, so they are changed often. The KSK however
|
||
requires manual interaction with the registrar, so they are changed less
|
||
often and use stronger parameters because they sign only one record.
|
||
|
||
Este tipo tiene los siguientes parámetros:
|
||
|
||
@table @asis
|
||
@item @code{id} (predeterminado: @code{""})
|
||
The id of the policy. It must not be empty.
|
||
|
||
@item @code{keystore} (predeterminado: @code{"default"})
|
||
A reference to a keystore, that is a string containing the identifier of a
|
||
keystore defined in a @code{knot-keystore-configuration} field. The
|
||
@code{"default"} identifier means the default keystore (a kasp database that
|
||
was setup by this service).
|
||
|
||
@item @code{manual?} (predeterminado: @code{#f})
|
||
Whether the key management is manual or automatic.
|
||
|
||
@item @code{single-type-signing?} (predeterminado: @code{#f})
|
||
When @code{#t}, use the Single-Type Signing Scheme.
|
||
|
||
@item @code{algorithm} (predeterminado: @code{"ecdsap256sha256"})
|
||
An algorithm of signing keys and issued signatures.
|
||
|
||
@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})
|
||
The TTL value for DNSKEY records added into zone apex. The special
|
||
@code{'default} value means same as the zone SOA TTL.
|
||
|
||
@item @code{zsk-lifetime} (predeterminado: @code{(* 30 24 3600)})
|
||
The period between ZSK publication and the next rollover initiation.
|
||
|
||
@item @code{propagation-delay} (predeterminado: @code{(* 24 3600)})
|
||
An extra delay added for each key rollover step. This value should be high
|
||
enough to cover propagation of data from the master server to all slaves.
|
||
|
||
@item @code{rrsig-lifetime} (predeterminado: @code{(* 14 24 3600)})
|
||
A validity period of newly issued signatures.
|
||
|
||
@item @code{rrsig-refresh} (predeterminado: @code{(* 7 24 3600)})
|
||
A period how long before a signature expiration the signature will be
|
||
refreshed.
|
||
|
||
@item @code{nsec3?} (predeterminado: @code{#f})
|
||
When @code{#t}, NSEC3 will be used instead of NSEC.
|
||
|
||
@item @code{nsec3-iterations} (predeterminado: @code{5})
|
||
The number of additional times the hashing is performed.
|
||
|
||
@item @code{nsec3-salt-length} (predeterminado: @code{8})
|
||
The length of a salt field in octets, which is appended to the original
|
||
owner name before hashing.
|
||
|
||
@item @code{nsec3-salt-lifetime} (predeterminado: @code{(* 30 24 3600)})
|
||
The validity period of newly issued salt field.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} knot-zone-configuration
|
||
Data type representing a zone served by Knot. This type has the following
|
||
parameters:
|
||
|
||
@table @asis
|
||
@item @code{domain} (predeterminado: @code{""})
|
||
The domain served by this configuration. It must not be empty.
|
||
|
||
@item @code{file} (predeterminado: @code{""})
|
||
The file where this zone is saved. This parameter is ignored by master
|
||
zones. Empty means default location that depends on the domain name.
|
||
|
||
@item @code{zone} (predeterminado: @code{(zone-file)})
|
||
The content of the zone file. This parameter is ignored by slave zones. It
|
||
must contain a zone-file record.
|
||
|
||
@item @code{master} (predeterminado: @code{'()})
|
||
A list of master remotes. When empty, this zone is a master. When set,
|
||
this zone is a slave. This is a list of remotes identifiers.
|
||
|
||
@item @code{ddns-master} (predeterminado: @code{#f})
|
||
The main master. When empty, it defaults to the first master in the list of
|
||
masters.
|
||
|
||
@item @code{notify} (predeterminado: @code{'()})
|
||
A list of slave remote identifiers.
|
||
|
||
@item @code{acl} (predeterminado: @code{'()})
|
||
A list of acl identifiers.
|
||
|
||
@item @code{semantic-checks?} (predeterminado: @code{#f})
|
||
When set, this adds more semantic checks to the zone.
|
||
|
||
@item @code{disable-any?} (predeterminado: @code{#f})
|
||
When set, this forbids queries of the ANY type.
|
||
|
||
@item @code{zonefile-sync} (predeterminado: @code{0})
|
||
The delay between a modification in memory and on disk. 0 means immediate
|
||
synchronization.
|
||
|
||
@item @code{serial-policy} (predeterminado: @code{'increment})
|
||
A policy between @code{'increment} and @code{'unixtime}.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} knot-configuration
|
||
Data type representing the Knot configuration. This type has the following
|
||
parameters:
|
||
|
||
@table @asis
|
||
@item @code{knot} (predeterminado: @code{knot})
|
||
El paquete Knot.
|
||
|
||
@item @code{run-directory} (predeterminado: @code{"/var/run/knot"})
|
||
The run directory. This directory will be used for pid file and sockets.
|
||
|
||
@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{'()})
|
||
The list of knot-key-configuration used by this configuration.
|
||
|
||
@item @code{acls} (predeterminado: @code{'()})
|
||
The list of knot-acl-configuration used by this configuration.
|
||
|
||
@item @code{remotes} (predeterminada: @code{'()})
|
||
The list of knot-remote-configuration used by this configuration.
|
||
|
||
@item @code{zones} (predeterminada: @code{'()})
|
||
The list of knot-zone-configuration used by this configuration.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Servicio Dnsmasq
|
||
|
||
@deffn {Variable Scheme} dnsmasq-service-type
|
||
This is the type of the dnsmasq service, whose value should be an
|
||
@code{dnsmasq-configuration} object as in this example:
|
||
|
||
@example
|
||
(service dnsmasq-service-type
|
||
(dnsmasq-configuration
|
||
(no-resolv? #t)
|
||
(servers '("192.168.1.1"))))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} dnsmasq-configuration
|
||
Data type representing the configuration of dnsmasq.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{dnsmasq})
|
||
Package object of the dnsmasq server.
|
||
|
||
@item @code{no-hosts?} (predeterminado: @code{#f})
|
||
When true, don't read the hostnames in /etc/hosts.
|
||
|
||
@item @code{port} (predeterminado: @code{53})
|
||
The port to listen on. Setting this to zero completely disables DNS
|
||
responses, leaving only DHCP and/or TFTP functions.
|
||
|
||
@item @code{local-service?} (predeterminado: @code{#t})
|
||
Accept DNS queries only from hosts whose address is on a local subnet, ie a
|
||
subnet for which an interface exists on the server.
|
||
|
||
@item @code{listen-addresses} (predeterminadas: @code{'()})
|
||
Escucha en las direcciones IP proporcionadas.
|
||
|
||
@item @code{resolv-file} (predeterminado: @code{"/etc/resolv.conf"})
|
||
The file to read the IP address of the upstream nameservers from.
|
||
|
||
@item @code{no-resolv?} (predeterminado: @code{#f})
|
||
When true, don't read @var{resolv-file}.
|
||
|
||
@item @code{servers} (predeterminados: @code{'()})
|
||
Specify IP address of upstream servers directly.
|
||
|
||
@item @code{cache-size} (predeterminado: @code{150})
|
||
Set the size of dnsmasq's cache. Setting the cache size to zero disables
|
||
caching.
|
||
|
||
@item @code{negative-cache?} (predeterminado: @code{#t})
|
||
When false, disable negative caching.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsubheading Servicio ddclient
|
||
|
||
@cindex ddclient
|
||
The ddclient service described below runs the ddclient daemon, which takes
|
||
care of automatically updating DNS entries for service providers such as
|
||
@uref{https://dyn.com/dns/, Dyn}.
|
||
|
||
The following example show instantiates the service with its default
|
||
configuration:
|
||
|
||
@example
|
||
(service ddclient-service-type)
|
||
@end example
|
||
|
||
Note that ddclient needs to access credentials that are stored in a
|
||
@dfn{secret file}, by default @file{/etc/ddclient/secrets} (see
|
||
@code{secret-file} below.) You are expected to create this file manually,
|
||
in an ``out-of-band'' fashion (you @emph{could} make this file part of the
|
||
service configuration, for instance by using @code{plain-file}, but it will
|
||
be world-readable @i{via} @file{/gnu/store}.) See the examples in the
|
||
@file{share/ddclient} directory of the @code{ddclient} package.
|
||
|
||
@c %start of fragment
|
||
|
||
Los campos disponibles de @code{ddclient-configuration} son:
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} package ddclient
|
||
El paquete ddclient.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} integer daemon
|
||
The period after which ddclient will retry to check IP and domain name.
|
||
|
||
Defaults to @samp{300}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} boolean syslog
|
||
Use syslog for the output.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string mail
|
||
Mail to user.
|
||
|
||
Defaults to @samp{"root"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string mail-failure
|
||
Mail failed update to user.
|
||
|
||
Defaults to @samp{"root"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string pid
|
||
The ddclient PID file.
|
||
|
||
Defaults to @samp{"/var/run/ddclient/ddclient.pid"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} boolean ssl
|
||
Enable SSL support.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string user
|
||
Specifies the user name or ID that is used when running ddclient program.
|
||
|
||
Defaults to @samp{"ddclient"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string group
|
||
Group of the user who will run the ddclient program.
|
||
|
||
Defaults to @samp{"ddclient"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} string secret-file
|
||
Secret file which will be appended to @file{ddclient.conf} file. This file
|
||
contains credentials for use by ddclient. You are expected to create it
|
||
manually.
|
||
|
||
Defaults to @samp{"/etc/ddclient/secrets.conf"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{ddclient-configuration} parameter} list extra-options
|
||
Extra options will be appended to @file{ddclient.conf} file.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
|
||
@c %end of fragment
|
||
|
||
|
||
@node Servicios VPN
|
||
@subsection Servicios VPN
|
||
@cindex VPN (red virtual privada)
|
||
@cindex red virtual privada (VPN)
|
||
|
||
The @code{(gnu services vpn)} module provides services related to
|
||
@dfn{virtual private networks} (VPNs). It provides a @emph{client} service
|
||
for your machine to connect to a VPN, and a @emph{servire} service for your
|
||
machine to host a VPN. Both services use @uref{https://openvpn.net/,
|
||
OpenVPN}.
|
||
|
||
@deffn {Procedimiento Scheme} openvpn-client-service @
|
||
[#:config (openvpn-client-configuration)]
|
||
|
||
Devuelve un servicio que ejecuta @command{openvpn}, un daemon VPN, como
|
||
cliente.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} openvpn-server-service @
|
||
[#:config (openvpn-server-configuration)]
|
||
|
||
Devuelve un servicio que ejecuta @command{openvpn}, un daemon VPN, como
|
||
servidor.
|
||
|
||
Pueden ejecutarse simultáneamente.
|
||
@end deffn
|
||
|
||
@c %automatically generated documentation
|
||
|
||
Los campos disponibles de @code{openvpn-client-configuration} son:
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} package openvpn
|
||
El paquete OpenVPN.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} string pid-file
|
||
The OpenVPN pid file.
|
||
|
||
Defaults to @samp{"/var/run/openvpn/openvpn.pid"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} proto proto
|
||
The protocol (UDP or TCP) used to open a channel between clients and
|
||
servers.
|
||
|
||
Defaults to @samp{udp}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} dev dev
|
||
The device type used to represent the VPN connection.
|
||
|
||
Defaults to @samp{tun}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} string ca
|
||
The certificate authority to check connections against.
|
||
|
||
Defaults to @samp{"/etc/openvpn/ca.crt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} string cert
|
||
The certificate of the machine the daemon is running on. It should be
|
||
signed by the authority given in @code{ca}.
|
||
|
||
Defaults to @samp{"/etc/openvpn/client.crt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} string key
|
||
The key of the machine the daemon is running on. It must be the key whose
|
||
certificate is @code{cert}.
|
||
|
||
Defaults to @samp{"/etc/openvpn/client.key"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} boolean comp-lzo?
|
||
Whether to use the lzo compression algorithm.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} boolean persist-key?
|
||
Don't re-read key files across SIGUSR1 or --ping-restart.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} boolean persist-tun?
|
||
Don't close and reopen TUN/TAP device or run up/down scripts across SIGUSR1
|
||
or --ping-restart restarts.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} number verbosity
|
||
Verbosity level.
|
||
|
||
Defaults to @samp{3}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} tls-auth-client tls-auth
|
||
Add an additional layer of HMAC authentication on top of the TLS control
|
||
channel to protect against DoS attacks.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} key-usage verify-key-usage?
|
||
Whether to check the server certificate has server usage extension.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} bind bind?
|
||
Bind to a specific local port number.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} resolv-retry resolv-retry?
|
||
Retry resolving server address.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-client-configuration} parameter} openvpn-remote-list remote
|
||
A list of remote servers to connect to.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
Los campos disponibles de @code{openvpn-remote-configuration} son:
|
||
|
||
@deftypevr {@code{openvpn-remote-configuration} parameter} string name
|
||
Nombre del servidor.
|
||
|
||
Defaults to @samp{"my-server"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-remote-configuration} parameter} number port
|
||
Port number the server listens to.
|
||
|
||
Defaults to @samp{1194}.
|
||
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
@c %end of automatic openvpn-client documentation
|
||
|
||
@c %automatically generated documentation
|
||
|
||
Available @code{openvpn-server-configuration} fields are:
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} package openvpn
|
||
El paquete OpenVPN.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string pid-file
|
||
The OpenVPN pid file.
|
||
|
||
Defaults to @samp{"/var/run/openvpn/openvpn.pid"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} proto proto
|
||
The protocol (UDP or TCP) used to open a channel between clients and
|
||
servers.
|
||
|
||
Defaults to @samp{udp}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} dev dev
|
||
The device type used to represent the VPN connection.
|
||
|
||
Defaults to @samp{tun}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string ca
|
||
The certificate authority to check connections against.
|
||
|
||
Defaults to @samp{"/etc/openvpn/ca.crt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string cert
|
||
The certificate of the machine the daemon is running on. It should be
|
||
signed by the authority given in @code{ca}.
|
||
|
||
Defaults to @samp{"/etc/openvpn/client.crt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string key
|
||
The key of the machine the daemon is running on. It must be the key whose
|
||
certificate is @code{cert}.
|
||
|
||
Defaults to @samp{"/etc/openvpn/client.key"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} boolean comp-lzo?
|
||
Whether to use the lzo compression algorithm.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} boolean persist-key?
|
||
Don't re-read key files across SIGUSR1 or --ping-restart.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} boolean persist-tun?
|
||
Don't close and reopen TUN/TAP device or run up/down scripts across SIGUSR1
|
||
or --ping-restart restarts.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} number verbosity
|
||
Verbosity level.
|
||
|
||
Defaults to @samp{3}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} tls-auth-server tls-auth
|
||
Add an additional layer of HMAC authentication on top of the TLS control
|
||
channel to protect against DoS attacks.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} number port
|
||
Specifies the port number on which the server listens.
|
||
|
||
Defaults to @samp{1194}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} ip-mask server
|
||
An ip and mask specifying the subnet inside the virtual network.
|
||
|
||
Defaults to @samp{"10.8.0.0 255.255.255.0"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} cidr6 server-ipv6
|
||
A CIDR notation specifying the IPv6 subnet inside the virtual network.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string dh
|
||
The Diffie-Hellman parameters file.
|
||
|
||
Defaults to @samp{"/etc/openvpn/dh2048.pem"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string ifconfig-pool-persist
|
||
The file that records client IPs.
|
||
|
||
Defaults to @samp{"/etc/openvpn/ipp.txt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} gateway redirect-gateway?
|
||
When true, the server will act as a gateway for its clients.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} boolean client-to-client?
|
||
When true, clients are allowed to talk to each other inside the VPN.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} keepalive keepalive
|
||
Causes ping-like messages to be sent back and forth over the link so that
|
||
each side knows when the other side has gone down. @code{keepalive}
|
||
requires a pair. The first element is the period of the ping sending, and
|
||
the second element is the timeout before considering the other side down.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} number max-clients
|
||
The maximum number of clients.
|
||
|
||
Defaults to @samp{100}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} string status
|
||
The status file. This file shows a small report on current connection. It
|
||
is truncated and rewritten every minute.
|
||
|
||
Defaults to @samp{"/var/run/openvpn/status"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-server-configuration} parameter} openvpn-ccd-list client-config-dir
|
||
The list of configuration for some clients.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
Available @code{openvpn-ccd-configuration} fields are:
|
||
|
||
@deftypevr {@code{openvpn-ccd-configuration} parameter} string name
|
||
Nombre del cliente.
|
||
|
||
Defaults to @samp{"client"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-ccd-configuration} parameter} ip-mask iroute
|
||
Client own network
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{openvpn-ccd-configuration} parameter} ip-mask ifconfig-push
|
||
Client VPN IP.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
|
||
@c %end of automatic openvpn-server documentation
|
||
|
||
|
||
@node Sistema de ficheros en red
|
||
@subsection Sistema de ficheros en red
|
||
@cindex NFS
|
||
|
||
The @code{(gnu services nfs)} module provides the following services, which
|
||
are most commonly used in relation to mounting or exporting directory trees
|
||
as @dfn{network file systems} (NFS).
|
||
|
||
@subsubheading RPC Bind Service
|
||
@cindex rpcbind
|
||
|
||
The RPC Bind service provides a facility to map program numbers into
|
||
universal addresses. Many NFS related services use this facility. Hence it
|
||
is automatically started when a dependent service starts.
|
||
|
||
@defvr {Variable Scheme} rpcbind-service-type
|
||
A service type for the RPC portmapper daemon.
|
||
@end defvr
|
||
|
||
|
||
@deftp {Tipo de datos} rpcbind-configuration
|
||
Data type representing the configuration of the RPC Bind Service. This type
|
||
has the following parameters:
|
||
@table @asis
|
||
@item @code{rpcbind} (default: @code{rpcbind})
|
||
The rpcbind package to use.
|
||
|
||
@item @code{warm-start?} (default: @code{#t})
|
||
If this parameter is @code{#t}, then the daemon will read a state file on
|
||
startup thus reloading state information saved by a previous instance.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@subsubheading Pipefs Pseudo File System
|
||
@cindex pipefs
|
||
@cindex rpc_pipefs
|
||
|
||
The pipefs file system is used to transfer NFS related data between the
|
||
kernel and user space programs.
|
||
|
||
@defvr {Variable Scheme} pipefs-service-type
|
||
A service type for the pipefs pseudo file system.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} pipefs-configuration
|
||
Data type representing the configuration of the pipefs pseudo file system
|
||
service. This type has the following parameters:
|
||
@table @asis
|
||
@item @code{mount-point} (default: @code{"/var/lib/nfs/rpc_pipefs"})
|
||
The directory to which the file system is to be attached.
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@subsubheading Servicio del daemon GSS
|
||
@cindex GSSD
|
||
@cindex GSS
|
||
@cindex global security system
|
||
|
||
The @dfn{global security system} (GSS) daemon provides strong security for
|
||
RPC based protocols. Before exchanging RPC requests an RPC client must
|
||
establish a security context. Typically this is done using the Kerberos
|
||
command @command{kinit} or automatically at login time using PAM services
|
||
(@pxref{Servicios Kerberos}).
|
||
|
||
@defvr {Variable Scheme} gss-service-type
|
||
Un tipo de servicio para el daemon del sistema de seguridad global (GSS).
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} gss-configuration
|
||
Data type representing the configuration of the GSS daemon service. This
|
||
type has the following parameters:
|
||
@table @asis
|
||
@item @code{nfs-utils} (predeterminado: @code{nfs-utils})
|
||
The package in which the @command{rpc.gssd} command is to be found.
|
||
|
||
@item @code{pipefs-directory} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
|
||
The directory where the pipefs file system is mounted.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@subsubheading Servicio del daemon IDMAP
|
||
@cindex idmapd
|
||
@cindex name mapper
|
||
|
||
The idmap daemon service provides mapping between user IDs and user names.
|
||
Typically it is required in order to access file systems mounted via NFSv4.
|
||
|
||
@defvr {Variable Scheme} idmap-service-type
|
||
A service type for the Identity Mapper (IDMAP) daemon.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} idmap-configuration
|
||
Data type representing the configuration of the IDMAP daemon service. This
|
||
type has the following parameters:
|
||
@table @asis
|
||
@item @code{nfs-utils} (predeterminado: @code{nfs-utils})
|
||
The package in which the @command{rpc.idmapd} command is to be found.
|
||
|
||
@item @code{pipefs-directory} (predeterminado: @code{"/var/lib/nfs/rpc_pipefs"})
|
||
The directory where the pipefs file system is mounted.
|
||
|
||
@item @code{domain} (predeterminado: @code{#f})
|
||
The local NFSv4 domain name. This must be a string or @code{#f}. If it is
|
||
@code{#f} then the daemon will use the host's fully qualified domain name.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Integración continua
|
||
@subsection Integración continua
|
||
|
||
@cindex integración continua
|
||
@uref{https://git.savannah.gnu.org/cgit/guix/guix-cuirass.git, Cuirass} is a
|
||
continuous integration tool for Guix. It can be used both for development
|
||
and for providing substitutes to others (@pxref{Sustituciones}).
|
||
|
||
El módulo @code{(gnu services cuirass)} proporciona el siguiente servicio.
|
||
|
||
@defvr {Procedimiento Scheme} cuirass-service-type
|
||
The type of the Cuirass service. Its value must be a
|
||
@code{cuirass-configuration} object, as described below.
|
||
@end defvr
|
||
|
||
To add build jobs, you have to set the @code{specifications} field of the
|
||
configuration. Here is an example of a service that polls the Guix
|
||
repository and builds the packages from a manifest. Some of the packages
|
||
are defined in the @code{"custom-packages"} input, which is the equivalent
|
||
of @code{GUIX_PACKAGE_PATH}.
|
||
|
||
@example
|
||
(define %cuirass-specs
|
||
#~(list
|
||
'((#:name . "my-manifest")
|
||
(#:load-path-inputs . ("guix"))
|
||
(#:package-path-inputs . ("custom-packages"))
|
||
(#:proc-input . "guix")
|
||
(#:proc-file . "build-aux/cuirass/gnu-system.scm")
|
||
(#:proc . cuirass-jobs)
|
||
(#:proc-args . ((subset . "manifests")
|
||
(systems . ("x86_64-linux"))
|
||
(manifests . (("config" . "guix/manifest.scm")))))
|
||
(#:inputs . (((#:name . "guix")
|
||
(#:url . "git://git.savannah.gnu.org/guix.git")
|
||
(#:load-path . ".")
|
||
(#:branch . "master")
|
||
(#:no-compile? . #t))
|
||
((#:name . "config")
|
||
(#:url . "git://git.example.org/config.git")
|
||
(#:load-path . ".")
|
||
(#:branch . "master")
|
||
(#:no-compile? . #t))
|
||
((#:name . "custom-packages")
|
||
(#:url . "git://git.example.org/custom-packages.git")
|
||
(#:load-path . ".")
|
||
(#:branch . "master")
|
||
(#:no-compile? . #t)))))))
|
||
|
||
(service cuirass-service-type
|
||
(cuirass-configuration
|
||
(specifications %cuirass-specs)))
|
||
@end example
|
||
|
||
While information related to build jobs is located directly in the
|
||
specifications, global settings for the @command{cuirass} process are
|
||
accessible in other @code{cuirass-configuration} fields.
|
||
|
||
@deftp {Tipo de datos} cuirass-configuration
|
||
Data type representing the configuration of Cuirass.
|
||
|
||
@table @asis
|
||
@item @code{log-file} (predeterminado: @code{"/var/log/cuirass.log"})
|
||
Location of the log file.
|
||
|
||
@item @code{cache-directory} (predeterminado: @code{"/var/cache/cuirass"})
|
||
Location of the repository cache.
|
||
|
||
@item @code{user} (predeterminado: @code{"cuirass"})
|
||
Owner of the @code{cuirass} process.
|
||
|
||
@item @code{group} (predeterminado: @code{"cuirass"})
|
||
Owner's group of the @code{cuirass} process.
|
||
|
||
@item @code{interval} (predeterminado: @code{60})
|
||
Number of seconds between the poll of the repositories followed by the
|
||
Cuirass jobs.
|
||
|
||
@item @code{database} (predeterminada: @code{"/var/lib/cuirass/cuirass.db"})
|
||
Location of sqlite database which contains the build results and previously
|
||
added specifications.
|
||
|
||
@item @code{ttl} (predeterminado: @code{(* 30 24 3600)})
|
||
Specifies the time-to-live (TTL) in seconds of garbage collector roots that
|
||
are registered for build results. This means that build results are
|
||
protected from garbage collection for at least @var{ttl} seconds.
|
||
|
||
@item @code{port} (predeterminado: @code{8081})
|
||
Número de puerto usado por el servidor HTTP.
|
||
|
||
@item --listen=@var{dirección}
|
||
Listen on the network interface for @var{host}. The default is to accept
|
||
connections from localhost.
|
||
|
||
@item @code{specifications} (predeterminada: @code{#~'()})
|
||
A gexp (@pxref{Expresiones-G}) that evaluates to a list of specifications,
|
||
where a specification is an association list (@pxref{Associations Lists,,,
|
||
guile, GNU Guile Reference Manual}) whose keys are keywords
|
||
(@code{#:keyword-example}) as shown in the example above.
|
||
|
||
@item @code{use-substitutes?} (predeterminado: @code{#f})
|
||
This allows using substitutes to avoid building every dependencies of a job
|
||
from source.
|
||
|
||
@item @code{one-shot?} (predeterminado: @code{#f})
|
||
Only evaluate specifications and build derivations once.
|
||
|
||
@item @code{fallback?} (predeterminado: @code{#f})
|
||
When substituting a pre-built binary fails, fall back to building packages
|
||
locally.
|
||
|
||
@item @code{cuirass} (predeterminado: @code{cuirass})
|
||
El paquete Cuirass usado.
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de gestión de energía
|
||
@subsection Servicios de gestión de energía
|
||
|
||
@cindex tlp
|
||
@cindex gestión de energía con TLP
|
||
@subsubheading Daemon TLP
|
||
|
||
El módulo @code{(gnu services pm)} proporciona una definición de servicio
|
||
Guix para la herramienta de gestión de energía de Linux TLP.
|
||
|
||
TLP enables various powersaving modes in userspace and kernel. Contrary to
|
||
@code{upower-service}, it is not a passive, monitoring tool, as it will
|
||
apply custom settings each time a new power source is detected. More
|
||
information can be found at @uref{http://linrunner.de/en/tlp/tlp.html, TLP
|
||
home page}.
|
||
|
||
@deffn {Variable Scheme} tlp-service-type
|
||
The service type for the TLP tool. Its value should be a valid TLP
|
||
configuration (see below). To use the default settings, simply write:
|
||
@example
|
||
(service tlp-service-type)
|
||
@end example
|
||
@end deffn
|
||
|
||
By default TLP does not need much configuration but most TLP parameters can
|
||
be tweaked using @code{tlp-configuration}.
|
||
|
||
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 @code{'disabled}.
|
||
|
||
@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.
|
||
|
||
Available @code{tlp-configuration} fields are:
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} package tlp
|
||
El paquete TLP.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean tlp-enable?
|
||
Set to true if you wish to enable TLP.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string tlp-default-mode
|
||
Default mode when no power supply can be detected. Alternatives are AC and
|
||
BAT.
|
||
|
||
Defaults to @samp{"AC"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer disk-idle-secs-on-ac
|
||
Number of seconds Linux kernel has to wait after the disk goes idle, before
|
||
syncing on AC.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer disk-idle-secs-on-bat
|
||
Same as @code{disk-idle-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{2}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer max-lost-work-secs-on-ac
|
||
Dirty pages flushing periodicity, expressed in seconds.
|
||
|
||
Defaults to @samp{15}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer max-lost-work-secs-on-bat
|
||
Same as @code{max-lost-work-secs-on-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{60}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list cpu-scaling-governor-on-ac
|
||
CPU frequency scaling governor on AC mode. With intel_pstate driver,
|
||
alternatives are powersave and performance. With acpi-cpufreq driver,
|
||
alternatives are ondemand, powersave, performance and conservative.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list cpu-scaling-governor-on-bat
|
||
Same as @code{cpu-scaling-governor-on-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-scaling-min-freq-on-ac
|
||
Set the min available frequency for the scaling governor on AC.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-scaling-max-freq-on-ac
|
||
Set the max available frequency for the scaling governor on AC.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-scaling-min-freq-on-bat
|
||
Set the min available frequency for the scaling governor on BAT.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-scaling-max-freq-on-bat
|
||
Set the max available frequency for the scaling governor on BAT.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-min-perf-on-ac
|
||
Limit the min P-state to control the power dissipation of the CPU, in AC
|
||
mode. Values are stated as a percentage of the available performance.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-max-perf-on-ac
|
||
Limit the max P-state to control the power dissipation of the CPU, in AC
|
||
mode. Values are stated as a percentage of the available performance.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-min-perf-on-bat
|
||
Same as @code{cpu-min-perf-on-ac} on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-non-negative-integer cpu-max-perf-on-bat
|
||
Same as @code{cpu-max-perf-on-ac} on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-boolean cpu-boost-on-ac?
|
||
Enable CPU turbo boost feature on AC mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-boolean cpu-boost-on-bat?
|
||
Same as @code{cpu-boost-on-ac?} on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean sched-powersave-on-ac?
|
||
Allow Linux kernel to minimize the number of CPU cores/hyper-threads used
|
||
under light load conditions.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean sched-powersave-on-bat?
|
||
Same as @code{sched-powersave-on-ac?} but on BAT mode.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean nmi-watchdog?
|
||
Enable Linux kernel NMI watchdog.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-string phc-controls
|
||
For Linux kernels with PHC patch applied, change CPU voltages. An example
|
||
value would be @samp{"F:V F:V F:V F:V"}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string energy-perf-policy-on-ac
|
||
Set CPU performance versus energy saving policy on AC. Alternatives are
|
||
performance, normal, powersave.
|
||
|
||
Defaults to @samp{"performance"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string energy-perf-policy-on-bat
|
||
Same as @code{energy-perf-policy-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"powersave"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} space-separated-string-list disks-devices
|
||
Dispositivos de disco duro.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} space-separated-string-list disk-apm-level-on-ac
|
||
Hard disk advanced power management level.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} space-separated-string-list disk-apm-level-on-bat
|
||
Same as @code{disk-apm-bat} but on BAT mode.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list disk-spindown-timeout-on-ac
|
||
Hard disk spin down timeout. One value has to be specified for each
|
||
declared hard disk.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list disk-spindown-timeout-on-bat
|
||
Same as @code{disk-spindown-timeout-on-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list disk-iosched
|
||
Select IO scheduler for disk devices. One value has to be specified for
|
||
each declared hard disk. Example alternatives are cfq, deadline and noop.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string sata-linkpwr-on-ac
|
||
SATA aggressive link power management (ALPM) level. Alternatives are
|
||
min_power, medium_power, max_performance.
|
||
|
||
Defaults to @samp{"max_performance"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string sata-linkpwr-on-bat
|
||
Same as @code{sata-linkpwr-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"min_power"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-string sata-linkpwr-blacklist
|
||
Exclude specified SATA host devices for link power management.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-on-off-boolean ahci-runtime-pm-on-ac?
|
||
Enable Runtime Power Management for AHCI controller and disks on AC mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-on-off-boolean ahci-runtime-pm-on-bat?
|
||
Same as @code{ahci-runtime-pm-on-ac} on BAT mode.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer ahci-runtime-pm-timeout
|
||
Seconds of inactivity before disk is suspended.
|
||
|
||
Defaults to @samp{15}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string pcie-aspm-on-ac
|
||
PCI Express Active State Power Management level. Alternatives are default,
|
||
performance, powersave.
|
||
|
||
Defaults to @samp{"performance"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string pcie-aspm-on-bat
|
||
Same as @code{pcie-aspm-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"powersave"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-power-profile-on-ac
|
||
Radeon graphics clock speed level. Alternatives are low, mid, high, auto,
|
||
default.
|
||
|
||
Defaults to @samp{"high"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-power-profile-on-bat
|
||
Same as @code{radeon-power-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"low"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-dpm-state-on-ac
|
||
Radeon dynamic power management method (DPM). Alternatives are battery,
|
||
performance.
|
||
|
||
Defaults to @samp{"performance"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-dpm-state-on-bat
|
||
Same as @code{radeon-dpm-state-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"battery"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-dpm-perf-level-on-ac
|
||
Radeon DPM performance level. Alternatives are auto, low, high.
|
||
|
||
Defaults to @samp{"auto"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string radeon-dpm-perf-level-on-bat
|
||
Same as @code{radeon-dpm-perf-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"auto"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} on-off-boolean wifi-pwr-on-ac?
|
||
Wifi power saving mode.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} on-off-boolean wifi-pwr-on-bat?
|
||
Same as @code{wifi-power-ac?} but on BAT mode.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} y-n-boolean wol-disable?
|
||
Disable wake on LAN.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer sound-power-save-on-ac
|
||
Timeout duration in seconds before activating audio power saving on Intel
|
||
HDA and AC97 devices. A value of 0 disables power saving.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} non-negative-integer sound-power-save-on-bat
|
||
Same as @code{sound-powersave-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} y-n-boolean sound-power-save-controller?
|
||
Disable controller in powersaving mode on Intel HDA devices.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean bay-poweroff-on-bat?
|
||
Enable optical drive in UltraBay/MediaBay on BAT mode. Drive can be powered
|
||
on again by releasing (and reinserting) the eject lever or by pressing the
|
||
disc eject button on newer models.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string bay-device
|
||
Name of the optical drive device to power off.
|
||
|
||
Defaults to @samp{"sr0"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string runtime-pm-on-ac
|
||
Runtime Power Management for PCI(e) bus devices. Alternatives are on and
|
||
auto.
|
||
|
||
Defaults to @samp{"on"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} string runtime-pm-on-bat
|
||
Same as @code{runtime-pm-ac} but on BAT mode.
|
||
|
||
Defaults to @samp{"auto"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean runtime-pm-all?
|
||
Runtime Power Management for all PCI(e) bus devices, except blacklisted
|
||
ones.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-space-separated-string-list runtime-pm-blacklist
|
||
Exclude specified PCI(e) device addresses from Runtime Power Management.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} space-separated-string-list runtime-pm-driver-blacklist
|
||
Exclude PCI(e) devices assigned to the specified drivers from Runtime Power
|
||
Management.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean usb-autosuspend?
|
||
Enable USB autosuspend feature.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-string usb-blacklist
|
||
Exclude specified devices from USB autosuspend.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean usb-blacklist-wwan?
|
||
Exclude WWAN devices from USB autosuspend.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-string usb-whitelist
|
||
Include specified devices into USB autosuspend, even if they are already
|
||
excluded by the driver or via @code{usb-blacklist-wwan?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} maybe-boolean usb-autosuspend-disable-on-shutdown?
|
||
Enable USB autosuspend before shutdown.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{tlp-configuration} parameter} boolean restore-device-state-on-startup?
|
||
Restore radio device state (bluetooth, wifi, wwan) from previous shutdown on
|
||
system startup.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@cindex thermald
|
||
@cindex escalado de frecuencia de la CPU con thermald
|
||
@subsubheading Daemon Thermald
|
||
|
||
El módulo @code{(gnu services pm)} proporciona una interfaz con thermald, un
|
||
servicio de escalado de frecuencia de la CPU que ayuda a prevenir el
|
||
sobrecalentamiento.
|
||
|
||
@defvr {Variable Scheme} thermald-service-type
|
||
This is the service type for @uref{https://01.org/linux-thermal-daemon/,
|
||
thermald}, the Linux Thermal Daemon, which is responsible for controlling
|
||
the thermal state of processors and preventing overheating.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} thermald-configuration
|
||
Tipo de datos que representa la configuración de
|
||
@code{thermald-service-type}.
|
||
|
||
@table @asis
|
||
@item @code{ignore-cpuid-check?} (predeterminado: @code{#f})
|
||
Ignore cpuid check for supported CPU models.
|
||
|
||
@item @code{thermald} (predeterminado: @var{thermald})
|
||
Package object of thermald.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de audio
|
||
@subsection Servicios de audio
|
||
|
||
El módulo @code{(gnu services audio)} proporciona un servicio para iniciar
|
||
MPD (el daemon de reproducción de música).
|
||
|
||
@cindex mpd
|
||
@subsubheading Daemon de reproducción de música (MPD)
|
||
|
||
El daemon de reproducción de música (MPD) es un servicio que puede
|
||
reproducir música mientras se controla desde la máquina local o sobre una
|
||
red por una multitud de clientes.
|
||
|
||
El siguiente ejemplo muestra como se puede ejecutar @code{mpd} como
|
||
@code{"rober"} en el puerto @code{6666}. Usa pulseaudio para su salida.
|
||
|
||
@example
|
||
(service mpd-service-type
|
||
(mpd-configuration
|
||
(user "rober")
|
||
(port "6666")))
|
||
@end example
|
||
|
||
@defvr {Variable Scheme} mpd-service-type
|
||
El tipo de servicio para @command{mpd}.
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} mpd-configuration
|
||
Data type representing the configuration of @command{mpd}.
|
||
|
||
@table @asis
|
||
@item @code{user} (predeterminada: @code{"mpd"})
|
||
Usuaria que ejecuta mpd.
|
||
|
||
@item @code{music-dir} (predeterminado: @code{"~/Music"})
|
||
The directory to scan for music files.
|
||
|
||
@item @code{playlist-dir} (predeterminado: @code{"~/.mpd/playlists"})
|
||
The directory to store playlists.
|
||
|
||
@item @code{db-file} (default: @code{"~/.mpd/tag_cache"})
|
||
The location of the music database.
|
||
|
||
@item @code{state-file} (default: @code{"~/.mpd/state"})
|
||
The location of the file that stores current MPD's state.
|
||
|
||
@item @code{sticker-file} (default: @code{"~/.mpd/sticker.sql"})
|
||
The location of the sticker database.
|
||
|
||
@item @code{port} (predeterminado: @code{"6600"})
|
||
Puerto sobre el que se ejecuta mpd.
|
||
|
||
@item @code{address} (predeterminada: @code{"any"})
|
||
The address that mpd will bind to. To use a Unix domain socket, an absolute
|
||
path can be specified here.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Servicios de virtualización
|
||
@subsection Servicios de virtualización
|
||
|
||
The @code{(gnu services virtualization)} module provides services for the
|
||
libvirt and virtlog daemons, as well as other virtualization-related
|
||
services.
|
||
|
||
@subsubheading Demonio Libvirt
|
||
@code{libvirtd} is the server side daemon component of the libvirt
|
||
virtualization management system. This daemon runs on host servers and
|
||
performs required management tasks for virtualized guests.
|
||
|
||
@deffn {Variable Scheme} libvirt-service-type
|
||
This is the type of the @uref{https://libvirt.org, libvirt daemon}. Its
|
||
value must be a @code{libvirt-configuration}.
|
||
|
||
@example
|
||
(service libvirt-service-type
|
||
(libvirt-configuration
|
||
(unix-sock-group "libvirt")
|
||
(tls-port "16555")))
|
||
@end example
|
||
@end deffn
|
||
|
||
@c Auto-generated with (generate-libvirt-documentation)
|
||
Available @code{libvirt-configuration} fields are:
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} package libvirt
|
||
Paquete libvirt.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean listen-tls?
|
||
Flag listening for secure TLS connections on the public TCP/IP port. must
|
||
set @code{listen} for this to have any effect.
|
||
|
||
It is necessary to setup a CA and issue server certificates before using
|
||
this capability.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean listen-tcp?
|
||
Listen for unencrypted TCP connections on the public TCP/IP port. must set
|
||
@code{listen} for this to have any effect.
|
||
|
||
Using the TCP socket requires SASL authentication by default. Only SASL
|
||
mechanisms which support data encryption are allowed. This is DIGEST_MD5
|
||
and GSSAPI (Kerberos5)
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string tls-port
|
||
Port for accepting secure TLS connections This can be a port number, or
|
||
service name
|
||
|
||
Defaults to @samp{"16514"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string tcp-port
|
||
Port for accepting insecure TCP connections This can be a port number, or
|
||
service name
|
||
|
||
Defaults to @samp{"16509"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string listen-addr
|
||
IP address or hostname used for client connections.
|
||
|
||
Defaults to @samp{"0.0.0.0"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean mdns-adv?
|
||
Flag toggling mDNS advertisement of the libvirt service.
|
||
|
||
Alternatively can disable for all services on a host by stopping the Avahi
|
||
daemon.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string mdns-name
|
||
Default mDNS advertisement name. This must be unique on the immediate
|
||
broadcast network.
|
||
|
||
Defaults to @samp{"Virtualization Host <hostname>"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string unix-sock-group
|
||
UNIX domain socket group ownership. This can be used to allow a 'trusted'
|
||
set of users access to management capabilities without becoming root.
|
||
|
||
Defaults to @samp{"root"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string unix-sock-ro-perms
|
||
UNIX socket permissions for the R/O socket. This is used for monitoring VM
|
||
status only.
|
||
|
||
Defaults to @samp{"0777"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string unix-sock-rw-perms
|
||
UNIX socket permissions for the R/W socket. Default allows only root. If
|
||
PolicyKit is enabled on the socket, the default will change to allow
|
||
everyone (eg, 0777)
|
||
|
||
Defaults to @samp{"0770"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string unix-sock-admin-perms
|
||
UNIX socket permissions for the admin socket. Default allows only owner
|
||
(root), do not change it unless you are sure to whom you are exposing the
|
||
access to.
|
||
|
||
Defaults to @samp{"0777"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string unix-sock-dir
|
||
The directory in which sockets will be found/created.
|
||
|
||
Defaults to @samp{"/var/run/libvirt"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string auth-unix-ro
|
||
Authentication scheme for UNIX read-only sockets. By default socket
|
||
permissions allow anyone to connect
|
||
|
||
Defaults to @samp{"polkit"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string auth-unix-rw
|
||
Authentication scheme for UNIX read-write sockets. By default socket
|
||
permissions only allow root. If PolicyKit support was compiled into
|
||
libvirt, the default will be to use 'polkit' auth.
|
||
|
||
Defaults to @samp{"polkit"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string auth-tcp
|
||
Authentication scheme for TCP sockets. If you don't enable SASL, then all
|
||
TCP traffic is cleartext. Don't do this outside of a dev/test scenario.
|
||
|
||
Defaults to @samp{"sasl"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string auth-tls
|
||
Authentication scheme for TLS sockets. TLS sockets already have encryption
|
||
provided by the TLS layer, and limited authentication is done by
|
||
certificates.
|
||
|
||
It is possible to make use of any SASL authentication mechanism as well, by
|
||
using 'sasl' for this option
|
||
|
||
Defaults to @samp{"none"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} optional-list access-drivers
|
||
API access control scheme.
|
||
|
||
By default an authenticated user is allowed access to all APIs. Access
|
||
drivers can place restrictions on this.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string key-file
|
||
Server key file path. If set to an empty string, then no private key is
|
||
loaded.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string cert-file
|
||
Server key file path. If set to an empty string, then no certificate is
|
||
loaded.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string ca-file
|
||
Server key file path. If set to an empty string, then no CA certificate is
|
||
loaded.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string crl-file
|
||
Certificate revocation list path. If set to an empty string, then no CRL is
|
||
loaded.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean tls-no-sanity-cert
|
||
Disable verification of our own server certificates.
|
||
|
||
When libvirtd starts it performs some sanity checks against its own
|
||
certificates.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean tls-no-verify-cert
|
||
Disable verification of client certificates.
|
||
|
||
Client certificate verification is the primary authentication mechanism.
|
||
Any client which does not present a certificate signed by the CA will be
|
||
rejected.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} optional-list tls-allowed-dn-list
|
||
Whitelist of allowed x509 Distinguished Name.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} optional-list sasl-allowed-usernames
|
||
Whitelist of allowed SASL usernames. The format for username depends on the
|
||
SASL authentication mechanism.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string tls-priority
|
||
Override the compile time default TLS priority string. The default is
|
||
usually "NORMAL" unless overridden at build time. Only set this is it is
|
||
desired for libvirt to deviate from the global default settings.
|
||
|
||
Defaults to @samp{"NORMAL"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-clients
|
||
Maximum number of concurrent client connections to allow over all sockets
|
||
combined.
|
||
|
||
Defaults to @samp{5000}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-queued-clients
|
||
Maximum length of queue of connections waiting to be accepted by the
|
||
daemon. Note, that some protocols supporting retransmission may obey this
|
||
so that a later reattempt at connection succeeds.
|
||
|
||
Defaults to @samp{1000}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-anonymous-clients
|
||
Maximum length of queue of accepted but not yet authenticated clients. Set
|
||
this to zero to turn this feature off
|
||
|
||
Defaults to @samp{20}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer min-workers
|
||
Number of workers to start up initially.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-workers
|
||
Maximum number of worker threads.
|
||
|
||
If the number of active clients exceeds @code{min-workers}, then more
|
||
threads are spawned, up to max_workers limit. Typically you'd want
|
||
max_workers to equal maximum number of clients allowed.
|
||
|
||
Defaults to @samp{20}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer prio-workers
|
||
Number of priority workers. If all workers from above pool are stuck, some
|
||
calls marked as high priority (notably domainDestroy) can be executed in
|
||
this pool.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-requests
|
||
Total global limit on concurrent RPC calls.
|
||
|
||
Defaults to @samp{20}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer max-client-requests
|
||
Limit on concurrent requests from a single client connection. To avoid one
|
||
client monopolizing the server this should be a small fraction of the global
|
||
max_requests and max_workers parameter.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-min-workers
|
||
Same as @code{min-workers} but for the admin interface.
|
||
|
||
Defaults to @samp{1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-max-workers
|
||
Same as @code{max-workers} but for the admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-max-clients
|
||
Same as @code{max-clients} but for the admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-max-queued-clients
|
||
Same as @code{max-queued-clients} but for the admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-max-client-requests
|
||
Same as @code{max-client-requests} but for the admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer log-level
|
||
Logging level. 4 errors, 3 warnings, 2 information, 1 debug.
|
||
|
||
Defaults to @samp{3}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string log-filters
|
||
Filtros de log.
|
||
|
||
A filter allows to select a different logging level for a given category of
|
||
logs The format for a filter is one of:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
x:nombre
|
||
|
||
@item
|
||
x:+nombre
|
||
|
||
@end itemize
|
||
|
||
where @code{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.,
|
||
"remote", "qemu", or "util.json" (the name in the filter can be a substring
|
||
of the full category name, in order to match multiple similar categories),
|
||
the optional "+" prefix tells libvirt to log stack trace for each message
|
||
matching name, and @code{x} is the minimal level where matching messages
|
||
should be logged:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
1: DEBUG
|
||
|
||
@item
|
||
2: INFO
|
||
|
||
@item
|
||
3: WARNING
|
||
|
||
@item
|
||
4: ERROR
|
||
|
||
@end itemize
|
||
|
||
Multiple filters can be defined in a single filters statement, they just
|
||
need to be separated by spaces.
|
||
|
||
Defaults to @samp{"3:remote 4:event"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string log-outputs
|
||
Logging outputs.
|
||
|
||
An output is one of the places to save logging information The format for an
|
||
output can be:
|
||
|
||
@table @code
|
||
@item x:stderr
|
||
output goes to stderr
|
||
|
||
@item x:syslog:name
|
||
use syslog for the output and use the given name as the ident
|
||
|
||
@item x:file:file_path
|
||
output to a file, with the given filepath
|
||
|
||
@item x:journald
|
||
output to journald logging system
|
||
|
||
@end table
|
||
|
||
In all case the x prefix is the minimal level, acting as a filter
|
||
|
||
@itemize @bullet
|
||
@item
|
||
1: DEBUG
|
||
|
||
@item
|
||
2: INFO
|
||
|
||
@item
|
||
3: WARNING
|
||
|
||
@item
|
||
4: ERROR
|
||
|
||
@end itemize
|
||
|
||
Multiple outputs can be defined, they just need to be separated by spaces.
|
||
|
||
Defaults to @samp{"3:stderr"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer audit-level
|
||
Allows usage of the auditing subsystem to be altered
|
||
|
||
@itemize @bullet
|
||
@item
|
||
0: disable all auditing
|
||
|
||
@item
|
||
1: enable auditing, only if enabled on host
|
||
|
||
@item
|
||
2: enable auditing, and exit if disabled on host.
|
||
|
||
@end itemize
|
||
|
||
Defaults to @samp{1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} boolean audit-logging
|
||
Send audit messages via libvirt logging infrastructure.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} optional-string host-uuid
|
||
Host UUID. UUID must not have all digits be the same.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} string host-uuid-source
|
||
Source to read host UUID.
|
||
|
||
@itemize @bullet
|
||
@item
|
||
@code{smbios}: fetch the UUID from @code{dmidecode -s system-uuid}
|
||
|
||
@item
|
||
@code{machine-id}: fetch the UUID from @code{/etc/machine-id}
|
||
|
||
@end itemize
|
||
|
||
If @code{dmidecode} does not provide a valid UUID a temporary UUID will be
|
||
generated.
|
||
|
||
Defaults to @samp{"smbios"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer keepalive-interval
|
||
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
|
||
-1, libvirtd will never send keepalive requests; however clients can still
|
||
send them and the daemon will send responses.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer keepalive-count
|
||
Maximum number of keepalive messages that are allowed to be sent to the
|
||
client without getting any response before the connection is considered
|
||
broken.
|
||
|
||
In other words, the connection is automatically closed approximately after
|
||
@code{keepalive_interval * (keepalive_count + 1)} seconds since the last
|
||
message received from the client. When @code{keepalive-count} is set to 0,
|
||
connections will be automatically closed after @code{keepalive-interval}
|
||
seconds of inactivity without sending any keepalive messages.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-keepalive-interval
|
||
Same as above but for admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer admin-keepalive-count
|
||
Same as above but for admin interface.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{libvirt-configuration} parameter} integer ovs-timeout
|
||
Timeout for Open vSwitch calls.
|
||
|
||
The @code{ovs-vsctl} utility is used for the configuration and its timeout
|
||
option is set by default to 5 seconds to avoid potential infinite waits
|
||
blocking libvirt.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@c %end of autogenerated docs
|
||
|
||
@subsubheading Daemon Virtlog
|
||
The virtlogd service is a server side daemon component of libvirt that is
|
||
used to manage logs from virtual machine consoles.
|
||
|
||
This daemon is not used directly by libvirt client applications, rather it
|
||
is called on their behalf by @code{libvirtd}. By maintaining the logs in a
|
||
standalone daemon, the main @code{libvirtd} daemon can be restarted without
|
||
risk of losing logs. The @code{virtlogd} daemon has the ability to re-exec()
|
||
itself upon receiving @code{SIGUSR1}, to allow live upgrades without
|
||
downtime.
|
||
|
||
@deffn {Variable Scheme} virtlog-service-type
|
||
This is the type of the virtlog daemon. Its value must be a
|
||
@code{virtlog-configuration}.
|
||
|
||
@example
|
||
(service virtlog-service-type
|
||
(virtlog-configuration
|
||
(max-clients 1000)))
|
||
@end example
|
||
@end deffn
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} integer log-level
|
||
Logging level. 4 errors, 3 warnings, 2 information, 1 debug.
|
||
|
||
Defaults to @samp{3}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} string log-filters
|
||
Filtros de log.
|
||
|
||
A filter allows to select a different logging level for a given category of
|
||
logs The format for a filter is one of:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
x:nombre
|
||
|
||
@item
|
||
x:+nombre
|
||
|
||
@end itemize
|
||
|
||
where @code{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.,
|
||
"remote", "qemu", or "util.json" (the name in the filter can be a substring
|
||
of the full category name, in order to match multiple similar categories),
|
||
the optional "+" prefix tells libvirt to log stack trace for each message
|
||
matching name, and @code{x} is the minimal level where matching messages
|
||
should be logged:
|
||
|
||
@itemize @bullet
|
||
@item
|
||
1: DEBUG
|
||
|
||
@item
|
||
2: INFO
|
||
|
||
@item
|
||
3: WARNING
|
||
|
||
@item
|
||
4: ERROR
|
||
|
||
@end itemize
|
||
|
||
Multiple filters can be defined in a single filters statement, they just
|
||
need to be separated by spaces.
|
||
|
||
Defaults to @samp{"3:remote 4:event"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} string log-outputs
|
||
Logging outputs.
|
||
|
||
An output is one of the places to save logging information The format for an
|
||
output can be:
|
||
|
||
@table @code
|
||
@item x:stderr
|
||
output goes to stderr
|
||
|
||
@item x:syslog:name
|
||
use syslog for the output and use the given name as the ident
|
||
|
||
@item x:file:file_path
|
||
output to a file, with the given filepath
|
||
|
||
@item x:journald
|
||
output to journald logging system
|
||
|
||
@end table
|
||
|
||
In all case the x prefix is the minimal level, acting as a filter
|
||
|
||
@itemize @bullet
|
||
@item
|
||
1: DEBUG
|
||
|
||
@item
|
||
2: INFO
|
||
|
||
@item
|
||
3: WARNING
|
||
|
||
@item
|
||
4: ERROR
|
||
|
||
@end itemize
|
||
|
||
Multiple outputs can be defined, they just need to be separated by spaces.
|
||
|
||
Defaults to @samp{"3:stderr"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} integer max-clients
|
||
Maximum number of concurrent client connections to allow over all sockets
|
||
combined.
|
||
|
||
Defaults to @samp{1024}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} integer max-size
|
||
Maximum file size before rolling over.
|
||
|
||
Defaults to @samp{2MB}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{virtlog-configuration} parameter} integer max-backups
|
||
Maximum number of backup files to keep.
|
||
|
||
Defaults to @samp{3}
|
||
|
||
@end deftypevr
|
||
|
||
@subsubheading Transparent Emulation with QEMU
|
||
|
||
@cindex emulación
|
||
@cindex @code{binfmt_misc}
|
||
@code{qemu-binfmt-service-type} provides support for transparent emulation
|
||
of program binaries built for different architectures---e.g., it allows you
|
||
to transparently execute an ARMv7 program on an x86_64 machine. It achieves
|
||
this by combining the @uref{https://www.qemu.org, QEMU} emulator and the
|
||
@code{binfmt_misc} feature of the kernel Linux.
|
||
|
||
@defvr {Variable Scheme} qemu-binfmt-service-type
|
||
This is the type of the QEMU/binfmt service for transparent emulation. Its
|
||
value must be a @code{qemu-binfmt-configuration} object, which specifies the
|
||
QEMU package to use as well as the architecture we want to emulated:
|
||
|
||
@example
|
||
(service qemu-binfmt-service-type
|
||
(qemu-binfmt-configuration
|
||
(platforms (lookup-qemu-platforms "arm" "aarch64" "mips64el"))))
|
||
@end example
|
||
|
||
In this example, we enable transparent emulation for the ARM and aarch64
|
||
platforms. Running @code{herd stop qemu-binfmt} turns it off, and running
|
||
@code{herd start qemu-binfmt} turns it back on (@pxref{Invoking herd, the
|
||
@command{herd} command,, shepherd, The GNU Shepherd Manual}).
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} qemu-binfmt-configuration
|
||
This is the configuration for the @code{qemu-binfmt} service.
|
||
|
||
@table @asis
|
||
@item @code{platforms} (predeterminadas: @code{'()})
|
||
The list of emulated QEMU platforms. Each item must be a @dfn{platform
|
||
object} as returned by @code{lookup-qemu-platforms} (see below).
|
||
|
||
@item @code{guix-support?} (predeterminado: @code{#f})
|
||
When it is true, QEMU and all its dependencies are added to the build
|
||
environment of @command{guix-daemon} (@pxref{Invocación de guix-daemon,
|
||
@code{--chroot-directory} option}). This allows the @code{binfmt_misc}
|
||
handlers to be used within the build environment, which in turn means that
|
||
you can transparently build programs for another architecture.
|
||
|
||
For example, let's suppose you're on an x86_64 machine and you have this
|
||
service:
|
||
|
||
@example
|
||
(service qemu-binfmt-service-type
|
||
(qemu-binfmt-configuration
|
||
(platforms (lookup-qemu-platforms "arm"))
|
||
(guix-support? #t)))
|
||
@end example
|
||
|
||
You can run:
|
||
|
||
@example
|
||
guix build -s armhf-linux inkscape
|
||
@end example
|
||
|
||
@noindent
|
||
and it will build Inkscape for ARMv7 @emph{as if it were a native build},
|
||
transparently using QEMU to emulate the ARMv7 CPU. Pretty handy if you'd
|
||
like to test a package build for an architecture you don't have access to!
|
||
|
||
@item @code{qemu} (predeterminado: @code{qemu})
|
||
El paquete QEMU usado.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} lookup-qemu-platforms @var{plataformas}@dots{}
|
||
Return the list of QEMU platform objects corresponding to
|
||
@var{platforms}@dots{}. @var{platforms} must be a list of strings
|
||
corresponding to platform names, such as @code{"arm"}, @code{"sparc"},
|
||
@code{"mips64el"}, and so on.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} qemu-platform? @var{obj}
|
||
Devuelve verdadero si @var{obj} es un objeto plataforma.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} qemu-platform-name @var{plataforma}
|
||
Devuelve el nombre de @var{plataforma}---una cadena como @code{"arm"}.
|
||
@end deffn
|
||
|
||
@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}, 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}.
|
||
|
||
@deffn {Procedimiento Scheme} git-daemon-service [#:config (git-daemon-configuration)]
|
||
|
||
Devuelve un servicio que ejecuta @command{git daemon}, un servidor TCP
|
||
simple para exponer repositorios con el protocolo Git para acceso anónimo.
|
||
|
||
The optional @var{config} argument should be a
|
||
@code{<git-daemon-configuration>} object, by default it allows read-only
|
||
access to exported@footnote{By creating the magic file
|
||
"git-daemon-export-ok" in the repository directory.} repositories under
|
||
@file{/srv/git}.
|
||
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} git-daemon-configuration
|
||
Tipo de datos que representa la configuración para
|
||
@code{git-daemon-service}.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{git})
|
||
Package object of the Git distributed version control system.
|
||
|
||
@item @code{export-all?} (predeterminado: @var{#f})
|
||
Whether to allow access for all Git repositories, even if they do not have
|
||
the @file{git-daemon-export-ok} file.
|
||
|
||
@item @code{base-path} (predeterminado: @file{/srv/git})
|
||
Whether to remap all the path requests as relative to the given path. If
|
||
you run git daemon with @var{(base-path "/srv/git")} on example.com, then if
|
||
you later try to pull @code{git://example.com/hello.git}, git daemon will
|
||
interpret the path as @code{/srv/git/hello.git}.
|
||
|
||
@item @code{user-path} (predeterminado: @var{#f})
|
||
Whether to allow @code{~user} notation to be used in requests. When
|
||
specified with empty string, requests to @code{git://host/~alice/foo} is
|
||
taken as a request to access @code{foo} repository in the home directory of
|
||
user @code{alice}. If @var{(user-path "path")} is specified, the same
|
||
request is taken as a request to access @code{path/foo} repository in the
|
||
home directory of user @code{alice}.
|
||
|
||
@item @code{listen} (predeterminado: @var{'()})
|
||
Whether to listen on specific IP addresses or hostnames, defaults to all.
|
||
|
||
@item @code{port} (predeterminado: @var{#f})
|
||
Whether to listen on an alternative port, which defaults to 9418.
|
||
|
||
@item @code{whitelist} (predeterminado: @var{'()})
|
||
If not empty, only allow access to this list of directories.
|
||
|
||
@item @code{extra-options} (predeterminadas: @var{'()})
|
||
Extra options will be passed to @code{git daemon}, please run @command{man
|
||
git-daemon} for more information.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
The @code{git://} protocol lacks authentication. When you pull from a
|
||
repository fetched via @code{git://}, you don't know that the data you
|
||
receive was modified is really coming from the specified host, and you have
|
||
your connection is subject to eavesdropping. It's better to use an
|
||
authenticated and encrypted transport, such as @code{https}. Although Git
|
||
allows you to serve repositories using unsophisticated file-based web
|
||
servers, there is a faster protocol implemented by the
|
||
@code{git-http-backend} program. This program is the back-end of a proper
|
||
Git web service. It is designed to sit behind a FastCGI proxy. @xref{Servicios Web}, for more on running the necessary @code{fcgiwrap} daemon.
|
||
|
||
Guix has a separate configuration data type for serving Git repositories
|
||
over HTTP.
|
||
|
||
@deftp {Tipo de datos} git-http-configuration
|
||
Data type representing the configuration for @code{git-http-service}.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{git})
|
||
Package object of the Git distributed version control system.
|
||
|
||
@item @code{git-root} (predeterminada: @file{/srv/git})
|
||
Directory containing the Git repositories to expose to the world.
|
||
|
||
@item @code{export-all?} (predeterminado: @var{#f})
|
||
Whether to expose access for all Git repositories in @var{git-root}, even if
|
||
they do not have the @file{git-daemon-export-ok} file.
|
||
|
||
@item @code{uri-path} (predeterminada: @file{/git/})
|
||
Path prefix for Git access. With the default @code{/git/} prefix, this will
|
||
map @code{http://@var{server}/git/@var{repo}.git} to
|
||
@code{/srv/git/@var{repo}.git}. Requests whose URI paths do not begin with
|
||
this prefix are not passed on to this Git instance.
|
||
|
||
@item @code{fcgiwrap-socket} (predeterminado: @code{127.0.0.1:9000})
|
||
The socket on which the @code{fcgiwrap} daemon is listening. @xref{Servicios Web}.
|
||
@end table
|
||
@end deftp
|
||
|
||
There is no @code{git-http-service-type}, currently; instead you can create
|
||
an @code{nginx-location-configuration} from a @code{git-http-configuration}
|
||
and then add that location to a web server.
|
||
|
||
@deffn {Procedimiento Scheme} git-http-nginx-location-configuration @
|
||
[config=(git-http-configuration)] Compute an
|
||
@code{nginx-location-configuration} that corresponds to the given Git http
|
||
configuration. An example nginx service definition to serve the default
|
||
@file{/srv/git} over HTTPS might be:
|
||
|
||
@example
|
||
(service nginx-service-type
|
||
(nginx-configuration
|
||
(server-blocks
|
||
(list
|
||
(nginx-server-configuration
|
||
(listen '("443 ssl"))
|
||
(server-name "git.my-host.org")
|
||
(ssl-certificate
|
||
"/etc/letsencrypt/live/git.my-host.org/fullchain.pem")
|
||
(ssl-certificate-key
|
||
"/etc/letsencrypt/live/git.my-host.org/privkey.pem")
|
||
(locations
|
||
(list
|
||
(git-http-nginx-location-configuration
|
||
(git-http-configuration (uri-path "/"))))))))))
|
||
@end example
|
||
|
||
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, web interface
|
||
@uref{https://git.zx2c4.com/cgit/, Cgit} is a web frontend for Git
|
||
repositories written in C.
|
||
|
||
The following example will configure the service with default values. By
|
||
default, Cgit can be accessed on port 80 (@code{http://localhost:80}).
|
||
|
||
@example
|
||
(service cgit-service-type)
|
||
@end example
|
||
|
||
The @code{file-object} type designates either a file-like object
|
||
(@pxref{Expresiones-G, file-like objects}) or a string.
|
||
|
||
@c %start of fragment
|
||
|
||
Available @code{cgit-configuration} fields are:
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} package package
|
||
El paquete CGIT.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} nginx-server-configuration-list nginx
|
||
Configuración de NGINX.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object about-filter
|
||
Specifies a command which will be invoked to format the content of about
|
||
pages (both top-level and for each repository).
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string agefile
|
||
Specifies a path, relative to each repository path, which can be used to
|
||
specify the date and time of the youngest commit in the repository.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object auth-filter
|
||
Specifies a command that will be invoked for authenticating repository
|
||
access.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string branch-sort
|
||
Flag which, when set to @samp{age}, enables date ordering in the branch ref
|
||
list, and when set @samp{name} enables ordering by branch name.
|
||
|
||
Defaults to @samp{"name"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string cache-root
|
||
Path used to store the cgit cache entries.
|
||
|
||
Defaults to @samp{"/var/cache/cgit"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-static-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of repository pages accessed with a fixed SHA1.
|
||
|
||
Defaults to @samp{-1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-dynamic-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of repository pages accessed without a fixed SHA1.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-repo-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of the repository summary page.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-root-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of the repository index page.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-scanrc-ttl
|
||
Number which specifies the time-to-live, in minutes, for the result of
|
||
scanning a path for Git repositories.
|
||
|
||
Defaults to @samp{15}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-about-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of the repository about page.
|
||
|
||
Defaults to @samp{15}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-snapshot-ttl
|
||
Number which specifies the time-to-live, in minutes, for the cached version
|
||
of snapshots.
|
||
|
||
Defaults to @samp{5}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer cache-size
|
||
The maximum number of entries in the cgit cache. When set to @samp{0},
|
||
caching is disabled.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean case-sensitive-sort?
|
||
Sort items in the repo list case sensitively.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} list clone-prefix
|
||
List of common prefixes which, when combined with a repository URL,
|
||
generates valid clone URLs for the repository.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} list clone-url
|
||
List of @code{clone-url} templates.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object commit-filter
|
||
Command which will be invoked to format commit messages.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string commit-sort
|
||
Flag which, when set to @samp{date}, enables strict date ordering in the
|
||
commit log, and when set to @samp{topo} enables strict topological ordering.
|
||
|
||
Defaults to @samp{"git log"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object css
|
||
URL which specifies the css document to include in all cgit pages.
|
||
|
||
Defaults to @samp{"/share/cgit/cgit.css"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object email-filter
|
||
Specifies a command which will be invoked to format names and email address
|
||
of committers, authors, and taggers, as represented in various places
|
||
throughout the cgit interface.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean embedded?
|
||
Flag which, when set to @samp{#t}, will make cgit generate a HTML fragment
|
||
suitable for embedding in other HTML pages.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-commit-graph?
|
||
Flag which, when set to @samp{#t}, will make cgit print an ASCII-art commit
|
||
history graph to the left of the commit messages in the repository log page.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-filter-overrides?
|
||
Flag which, when set to @samp{#t}, allows all filter settings to be
|
||
overridden in repository-specific cgitrc files.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-follow-links?
|
||
Flag which, when set to @samp{#t}, allows users to follow a file in the log
|
||
view.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-http-clone?
|
||
If set to @samp{#t}, cgit will act as an dumb HTTP endpoint for Git clones.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-index-links?
|
||
Flag which, when set to @samp{#t}, will make cgit generate extra links
|
||
"summary", "commit", "tree" for each repo in the repository index.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-index-owner?
|
||
Flag which, when set to @samp{#t}, will make cgit display the owner of each
|
||
repo in the repository index.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-log-filecount?
|
||
Flag which, when set to @samp{#t}, will make cgit print the number of
|
||
modified files for each commit on the repository log page.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-log-linecount?
|
||
Flag which, when set to @samp{#t}, will make cgit print the number of added
|
||
and removed lines for each commit on the repository log page.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-remote-branches?
|
||
Flag which, when set to @code{#t}, will make cgit display remote branches in
|
||
the summary and refs views.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-subject-links?
|
||
Flag which, when set to @code{1}, will make cgit use the subject of the
|
||
parent commit as link text when generating links to parent commits in commit
|
||
view.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-html-serving?
|
||
Flag which, when set to @samp{#t}, will make cgit use the subject of the
|
||
parent commit as link text when generating links to parent commits in commit
|
||
view.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-tree-linenumbers?
|
||
Flag which, when set to @samp{#t}, will make cgit generate linenumber links
|
||
for plaintext blobs printed in the tree view.
|
||
|
||
Defaults to @samp{#t}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean enable-git-config?
|
||
Flag which, when set to @samp{#f}, will allow cgit to use Git config to set
|
||
any repo specific settings.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object favicon
|
||
URL used as link to a shortcut icon for cgit.
|
||
|
||
Defaults to @samp{"/favicon.ico"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string footer
|
||
The content of the file specified with this option will be included verbatim
|
||
at the bottom of all pages (i.e.@: it replaces the standard "generated
|
||
by..."@: message).
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string head-include
|
||
The content of the file specified with this option will be included verbatim
|
||
in the HTML HEAD section on all pages.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string header
|
||
The content of the file specified with this option will be included verbatim
|
||
at the top of all pages.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object include
|
||
Name of a configfile to include before the rest of the current config- file
|
||
is parsed.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string index-header
|
||
The content of the file specified with this option will be included verbatim
|
||
above the repository index.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string index-info
|
||
The content of the file specified with this option will be included verbatim
|
||
below the heading on the repository index page.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean local-time?
|
||
Flag which, if set to @samp{#t}, makes cgit print commit and tag times in
|
||
the servers timezone.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object logo
|
||
URL which specifies the source of an image which will be used as a logo on
|
||
all cgit pages.
|
||
|
||
Defaults to @samp{"/share/cgit/cgit.png"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string logo-link
|
||
URL loaded when clicking on the cgit logo image.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object owner-filter
|
||
Command which will be invoked to format the Owner column of the main page.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-atom-items
|
||
Number of items to display in atom feeds view.
|
||
|
||
Defaults to @samp{10}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-commit-count
|
||
Number of entries to list per page in "log" view.
|
||
|
||
Defaults to @samp{50}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-message-length
|
||
Number of commit message characters to display in "log" view.
|
||
|
||
Defaults to @samp{80}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-repo-count
|
||
Specifies the number of entries to list per page on the repository index
|
||
page.
|
||
|
||
Defaults to @samp{50}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-repodesc-length
|
||
Specifies the maximum number of repo description characters to display on
|
||
the repository index page.
|
||
|
||
Defaults to @samp{80}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer max-blob-size
|
||
Specifies the maximum size of a blob to display HTML for in KBytes.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string max-stats
|
||
Maximum statistics period. Valid values are @samp{week},@samp{month},
|
||
@samp{quarter} and @samp{year}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} mimetype-alist mimetype
|
||
Mimetype for the specified filename extension.
|
||
|
||
Defaults to @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 {@code{cgit-configuration} parameter} file-object mimetype-file
|
||
Specifies the file to use for automatic mimetype lookup.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string module-link
|
||
Text which will be used as the formatstring for a hyperlink when a submodule
|
||
is printed in a directory listing.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean nocache?
|
||
If set to the value @samp{#t} caching will be disabled.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean noplainemail?
|
||
If set to @samp{#t} showing full author email addresses will be disabled.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean noheader?
|
||
Flag which, when set to @samp{#t}, will make cgit omit the standard header
|
||
on all pages.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} project-list project-list
|
||
A list of subdirectories inside of @code{repository-directory}, relative to
|
||
it, that should loaded as Git repositories. An empty list means that all
|
||
subdirectories will be loaded.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object readme
|
||
Text which will be used as default value for @code{cgit-repo-readme}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean remove-suffix?
|
||
If set to @code{#t} and @code{repository-directory} is enabled, if any
|
||
repositories are found with a suffix of @code{.git}, this suffix will be
|
||
removed for the URL and name.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer renamelimit
|
||
Maximum number of files to consider when detecting renames.
|
||
|
||
Defaults to @samp{-1}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string repository-sort
|
||
The way in which repositories in each section are sorted.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} robots-list robots
|
||
Text used as content for the @code{robots} meta-tag.
|
||
|
||
Defaults to @samp{("noindex" "nofollow")}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string root-desc
|
||
Text printed below the heading on the repository index page.
|
||
|
||
Defaults to @samp{"a fast webinterface for the git dscm"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string root-readme
|
||
The content of the file specified with this option will be included verbatim
|
||
below thef "about" link on the repository index page.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string root-title
|
||
Text printed as heading on the repository index page.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean scan-hidden-path
|
||
If set to @samp{#t} and repository-directory is enabled,
|
||
repository-directory will recurse into directories whose name starts with a
|
||
period. Otherwise, repository-directory will stay away from such
|
||
directories, considered as "hidden". Note that this does not apply to the
|
||
".git" directory in non-bare repos.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} list snapshots
|
||
Text which specifies the default set of snapshot formats that cgit generates
|
||
links for.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} repository-directory repository-directory
|
||
Name of the directory to scan for repositories (represents
|
||
@code{scan-path}).
|
||
|
||
Defaults to @samp{"/srv/git"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string section
|
||
The name of the current repository section - all repositories defined after
|
||
this option will inherit the current section name.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string section-sort
|
||
Flag which, when set to @samp{1}, will sort the sections on the repository
|
||
listing by name.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer section-from-path
|
||
A number which, if defined prior to repository-directory, specifies how many
|
||
path elements from each repo path to use as a default section name.
|
||
|
||
El valor predeterminado es @samp{0}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} boolean side-by-side-diffs?
|
||
If set to @samp{#t} shows side-by-side diffs instead of unidiffs per
|
||
default.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} file-object source-filter
|
||
Specifies a command which will be invoked to format plaintext blobs in the
|
||
tree view.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer summary-branches
|
||
Specifies the number of branches to display in the repository "summary"
|
||
view.
|
||
|
||
Defaults to @samp{10}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer summary-log
|
||
Specifies the number of log entries to display in the repository "summary"
|
||
view.
|
||
|
||
Defaults to @samp{10}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} integer summary-tags
|
||
Specifies the number of tags to display in the repository "summary" view.
|
||
|
||
Defaults to @samp{10}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string strict-export
|
||
Filename which, if specified, needs to be present within the repository for
|
||
cgit to allow access to that repository.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} string virtual-root
|
||
URL which, if specified, will be used as root for all cgit links.
|
||
|
||
Defaults to @samp{"/"}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} repository-cgit-configuration-list repositories
|
||
A list of @dfn{cgit-repo} records to use with config.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
Available @code{repository-cgit-configuration} fields are:
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-list snapshots
|
||
A mask of snapshot formats for this repo that cgit generates links for,
|
||
restricted by the global @code{snapshots} setting.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object source-filter
|
||
Override the default @code{source-filter}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string url
|
||
The relative URL used to access the repository.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object about-filter
|
||
Override the default @code{about-filter}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string branch-sort
|
||
Flag which, when set to @samp{age}, enables date ordering in the branch ref
|
||
list, and when set to @samp{name} enables ordering by branch name.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-list clone-url
|
||
A list of URLs which can be used to clone repo.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object commit-filter
|
||
Override the default @code{commit-filter}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string commit-sort
|
||
Flag which, when set to @samp{date}, enables strict date ordering in the
|
||
commit log, and when set to @samp{topo} enables strict topological ordering.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string defbranch
|
||
The name of the default branch for this repository. If no such branch
|
||
exists in the repository, the first branch name (when sorted) is used as
|
||
default instead. By default branch pointed to by HEAD, or "master" if there
|
||
is no suitable HEAD.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string desc
|
||
The value to show as repository description.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string homepage
|
||
The value to show as repository homepage.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object email-filter
|
||
Override the default @code{email-filter}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-commit-graph?
|
||
A flag which can be used to disable the global setting
|
||
@code{enable-commit-graph?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-log-filecount?
|
||
A flag which can be used to disable the global setting
|
||
@code{enable-log-filecount?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-log-linecount?
|
||
A flag which can be used to disable the global setting
|
||
@code{enable-log-linecount?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-remote-branches?
|
||
Flag which, when set to @code{#t}, will make cgit display remote branches in
|
||
the summary and refs views.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-subject-links?
|
||
A flag which can be used to override the global setting
|
||
@code{enable-subject-links?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} maybe-repo-boolean enable-html-serving?
|
||
A flag which can be used to override the global setting
|
||
@code{enable-html-serving?}.
|
||
|
||
Defaults to @samp{disabled}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-boolean hide?
|
||
Flag which, when set to @code{#t}, hides the repository from the repository
|
||
index.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-boolean ignore?
|
||
Flag which, when set to @samp{#t}, ignores the repository.
|
||
|
||
El valor predeterminado es @samp{#f}
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object logo
|
||
URL which specifies the source of an image which will be used as a logo on
|
||
this repo’s pages.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string logo-link
|
||
URL loaded when clicking on the cgit logo image.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-file-object owner-filter
|
||
Override the default @code{owner-filter}.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string module-link
|
||
Text which will be used as the formatstring for a hyperlink when a submodule
|
||
is printed in a directory listing. The arguments for the formatstring are
|
||
the path and SHA1 of the submodule commit.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} module-link-path module-link-path
|
||
Text which will be used as the formatstring for a hyperlink when a submodule
|
||
with the specified subdirectory path is printed in a directory listing.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string max-stats
|
||
Override the default maximum statistics period.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string name
|
||
El valor a mostrar como nombre del repositorio.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string owner
|
||
A value used to identify the owner of the repository.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string path
|
||
La ruta absoluta al directorio del repositorio.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string readme
|
||
A path (relative to repo) which specifies a file to include verbatim as the
|
||
"About" page for this repo.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-string section
|
||
The name of the current repository section - all repositories defined after
|
||
this option will inherit the current section name.
|
||
|
||
El valor predeterminado es @samp{""}.
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{repository-cgit-configuration} parameter} repo-list extra-options
|
||
Extra options will be appended to cgitrc file.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{cgit-configuration} parameter} list extra-options
|
||
Extra options will be appended to cgitrc file.
|
||
|
||
Defaults to @samp{()}.
|
||
|
||
@end deftypevr
|
||
|
||
|
||
@c %end of fragment
|
||
|
||
However, it could be that you just want to get a @code{cgitrc} up and
|
||
running. In that case, you can pass an @code{opaque-cgit-configuration} as
|
||
a record to @code{cgit-service-type}. As its name indicates, an opaque
|
||
configuration does not have easy reflective capabilities.
|
||
|
||
Available @code{opaque-cgit-configuration} fields are:
|
||
|
||
@deftypevr {@code{opaque-cgit-configuration} parameter} package cgit
|
||
El paquete cgit.
|
||
@end deftypevr
|
||
|
||
@deftypevr {@code{opaque-cgit-configuration} parameter} string string
|
||
The contents of the @code{cgitrc}, as a string.
|
||
@end deftypevr
|
||
|
||
For example, if your @code{cgitrc} is just the empty string, you could
|
||
instantiate a cgit service like this:
|
||
|
||
@example
|
||
(service cgit-service-type
|
||
(opaque-cgit-configuration
|
||
(cgitrc "")))
|
||
@end example
|
||
|
||
@subsubheading Servicio Gitolite
|
||
|
||
@cindex servicio Gitolite
|
||
@cindex Git, alojamiento
|
||
@uref{http://gitolite.com/gitolite/, Gitolite} is a tool for hosting Git
|
||
repositories on a central server.
|
||
|
||
Gitolite can handle multiple repositories and users, and supports flexible
|
||
configuration of the permissions for the users on the repositories.
|
||
|
||
The following example will configure Gitolite using the default @code{git}
|
||
user, and the provided SSH public key.
|
||
|
||
@example
|
||
(service gitolite-service-type
|
||
(gitolite-configuration
|
||
(admin-pubkey (plain-file
|
||
"sunombre.pub"
|
||
"ssh-rsa AAAA... guix@@example.com"))))
|
||
@end example
|
||
|
||
Gitolite is configured through a special admin repository which you can
|
||
clone, for example, if you setup Gitolite on @code{example.com}, you would
|
||
run the following command to clone the admin repository.
|
||
|
||
@example
|
||
git clone git@@example.com:gitolite-admin
|
||
@end example
|
||
|
||
When the Gitolite service is activated, the provided @code{admin-pubkey}
|
||
will be inserted in to the @file{keydir} directory in the gitolite-admin
|
||
repository. If this results in a change in the repository, it will be
|
||
committed using the message ``gitolite setup by GNU Guix''.
|
||
|
||
@deftp {Tipo de datos} gitolite-configuration
|
||
Tipo de datos que representa la configuración de
|
||
@code{gitolite-service-type}.
|
||
|
||
@table @asis
|
||
@item @code{package} (predeterminado: @var{gitolite})
|
||
Paquete Gitolite usado.
|
||
|
||
@item @code{user} (predeterminado: @var{git})
|
||
User to use for Gitolite. This will be user that you use when accessing
|
||
Gitolite over SSH.
|
||
|
||
@item @code{group} (predeterminado: @var{git})
|
||
Grupo usado por Gitolite.
|
||
|
||
@item @code{home-directory} (predeterminado: @var{"/var/lib/gitolite"})
|
||
Directory in which to store the Gitolite configuration and repositories.
|
||
|
||
@item @code{rc-file} (predeterminado: @var{(gitolite-rc-file)})
|
||
A ``file-like'' object (@pxref{Expresiones-G, file-like objects}),
|
||
representing the configuration for Gitolite.
|
||
|
||
@item @code{admin-pubkey} (predeterminada: @var{#f})
|
||
A ``file-like'' object (@pxref{Expresiones-G, file-like objects}) used to
|
||
setup Gitolite. This will be inserted in to the @file{keydir} directory
|
||
within the gitolite-admin repository.
|
||
|
||
To specify the SSH key as a string, use the @code{plain-file} function.
|
||
|
||
@example
|
||
(plain-file "yourname.pub" "ssh-rsa AAAA... guix@@example.com")
|
||
@end example
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} gitolite-rc-file
|
||
Tipo de datos que representa el fichero RC de Gitolite.
|
||
|
||
@table @asis
|
||
@item @code{umask} (predeterminada: @code{#o0077})
|
||
This controls the permissions Gitolite sets on the repositories and their
|
||
contents.
|
||
|
||
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{git-config-keys} (predeterminadas: @code{""})
|
||
Gitolite allows you to set git config values using the "config"
|
||
keyword. This setting allows control over the config keys to accept.
|
||
|
||
@item @code{roles} (predeterminados: @code{'(("READERS" . 1) ("WRITERS" . ))})
|
||
Set the role names allowed to be used by users running the perms command.
|
||
|
||
@item @code{enable} (default: @code{'("help" "desc" "info" "perms" "writable" "ssh-authkeys" "git-config" "daemon" "gitweb")})
|
||
This setting controls the commands and features to enable within Gitolite.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
|
||
@node Servicios de juegos
|
||
@subsection Servicios de juegos
|
||
|
||
@subsubheading El servicio de La batalla por Wesnoth
|
||
@cindex wesnothd
|
||
@uref{https://wesnoth.org, La batalla por Wesnoth} es un juego de estrategia
|
||
táctica, de fantasía y basado en turnos, con varias campañas de una
|
||
jugadora, y partidas para múltiples jugadoras (tanto en red como
|
||
localmente).
|
||
|
||
@defvar {Variable Scheme} wesnothd-service-type
|
||
Service type for the wesnothd service. Its value must be a
|
||
@code{wesnothd-configuration} object. To run wesnothd in the default
|
||
configuration, instantiate it as:
|
||
|
||
@example
|
||
(service wesnothd-service-type)
|
||
@end example
|
||
@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 Servicios misceláneos
|
||
@subsection Servicios misceláneos
|
||
|
||
@cindex huella dactilar
|
||
@subsubheading Servicios de huella dactilar
|
||
|
||
The @code{(gnu services authentication)} module provides a DBus service to
|
||
read and identify fingerprints via a fingerprint sensor.
|
||
|
||
@defvr {Variable Scheme} fprintd-service-type
|
||
The service type for @command{fprintd}, which provides the fingerprint
|
||
reading capability.
|
||
|
||
@example
|
||
(service fprintd-service-type)
|
||
@end example
|
||
@end defvr
|
||
|
||
@cindex sysctl
|
||
@subsubheading Servicios de control del sistema
|
||
|
||
The @code{(gnu services sysctl)} provides a service to configure kernel
|
||
parameters at boot.
|
||
|
||
@defvr {Variable Scheme} sysctl-service-type
|
||
The service type for @command{sysctl}, which modifies kernel parameters
|
||
under @file{/proc/sys/}. To enable IPv4 forwarding, it can be instantiated
|
||
as:
|
||
|
||
@example
|
||
(service sysctl-service-type
|
||
(sysctl-configuration
|
||
(settings '(("net.ipv4.ip_forward" . "1")))))
|
||
@end example
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} sysctl-configuration
|
||
Tipo de datos que representa la configuración de @command{sysctl}.
|
||
|
||
@table @asis
|
||
@item @code{sysctl} (predeterminado: @code{(file-append procps "/sbin/sysctl"})
|
||
El ejecutable @command{sysctl} usado.
|
||
|
||
@item @code{settings} (predeterminados: @code{'()})
|
||
An association list specifies kernel parameters and their values.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex pcscd
|
||
@subsubheading Servicio del daemon de tarjetas inteligentes PC/SC
|
||
|
||
The @code{(gnu services security-token)} module provides the following
|
||
service to run @command{pcscd}, the PC/SC Smart Card Daemon.
|
||
@command{pcscd} is the daemon program for pcsc-lite and the MuscleCard
|
||
framework. It is a resource manager that coordinates communications with
|
||
smart card readers, smart cards and cryptographic tokens that are connected
|
||
to the system.
|
||
|
||
@defvr {Variable Scheme} pcscd-service-type
|
||
Service type for the @command{pcscd} service. Its value must be a
|
||
@code{pcscd-configuration} object. To run pcscd in the default
|
||
configuration, instantiate it as:
|
||
|
||
@example
|
||
(service pcscd-service-type)
|
||
@end example
|
||
@end defvr
|
||
|
||
@deftp {Tipo de datos} pcscd-configuration
|
||
The data type representing the configuration of @command{pcscd}.
|
||
|
||
@table @asis
|
||
@item @code{pcsc-lite} (predeterminado: @code{pcsc-lite})
|
||
The pcsc-lite package that provides pcscd.
|
||
@item @code{usb-drivers} (predeterminado: @code{(list ccid)})
|
||
List of packages that provide USB drivers to pcscd. Drivers are expected to
|
||
be under @file{pcsc/drivers} in the store directory of the package.
|
||
@end table
|
||
@end deftp
|
||
|
||
@cindex lirc
|
||
@subsubheading Servicio Lirc
|
||
|
||
El módulo @code{(gnu services lirc)} proporciona el siguiente servicio.
|
||
|
||
@deffn {Procedimiento Scheme} lirc-service [#:lirc lirc] @
|
||
[#:device #f] [#:driver #f] [#:config-file #f] @ [#:extra-options '()]
|
||
Return a service that runs @url{http://www.lirc.org,LIRC}, a daemon that
|
||
decodes infrared signals from remote controls.
|
||
|
||
Optionally, @var{device}, @var{driver} and @var{config-file} (configuration
|
||
file name) may be specified. See @command{lircd} manual for details.
|
||
|
||
Finally, @var{extra-options} is a list of additional command-line options
|
||
passed to @command{lircd}.
|
||
@end deffn
|
||
|
||
@cindex spice
|
||
@subsubheading Servicio Spice
|
||
|
||
El módulo @code{(gnu services spice)} proporciona el siguiente servicio.
|
||
|
||
@deffn {Procedimiento Scheme} spice-vdagent-service [#:spice-vdagent]
|
||
Returns a service that runs @url{http://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 deffn
|
||
|
||
@cindex inputattach
|
||
@subsubheading inputattach Service
|
||
|
||
@cindex tablet input, for Xorg
|
||
@cindex touchscreen input, for Xorg
|
||
The @uref{https://linuxwacom.github.io/, inputattach} service allows you to
|
||
use input devices such as Wacom tablets, touchscreens, or joysticks with the
|
||
Xorg display server.
|
||
|
||
@deffn {Scheme Variable} inputattach-service-type
|
||
Type of a service that runs @command{inputattach} on a device and dispatches
|
||
events from it.
|
||
@end deffn
|
||
|
||
@deftp {Data Type} inputattach-configuration
|
||
@table @asis
|
||
@item @code{device-type} (default: @code{"wacom"})
|
||
The type of device to connect to. Run @command{inputattach --help}, from
|
||
the @code{inputattach} package, to see the list of supported device types.
|
||
|
||
@item @code{device} (default: @code{"/dev/ttyS0"})
|
||
The device file to connect to the device.
|
||
|
||
@item @code{log-file} (default: @code{#f})
|
||
If true, this must be the name of a file to log messages to.
|
||
@end table
|
||
@end deftp
|
||
|
||
@subsection Servicios de diccionario
|
||
@cindex diccionario
|
||
El módulo @code{(gnu services dict)} proporciona el servicio siguiente:
|
||
|
||
@deffn {Procedimiento Scheme} dicod-service [#:config (dicod-configuration)]
|
||
Devuelve un servicio que ejecuta el daemon @command{dicod}, una
|
||
implementación del servidor DICT (@pxref{Dicod,,, dico, GNU Dico Manual}).
|
||
|
||
El parámetro opcional @var{config} especifica la configuración para
|
||
@command{dicod}, que debe ser un objeto @code{<dicod-configuration>}, por
|
||
defecto proporciona el diccionario colaborativo internacional de Inglés de
|
||
GNU.
|
||
|
||
You can add @command{open localhost} to your @file{~/.dico} file to make
|
||
@code{localhost} the default server for @command{dico} client
|
||
(@pxref{Initialization File,,, dico, GNU Dico Manual}).
|
||
@end deffn
|
||
|
||
@deftp {Tipo de datos} dicod-configuration
|
||
Tipo de datos que representa la configuración de dicod.
|
||
|
||
@table @asis
|
||
@item @code{dico} (predeterminado: @var{dico})
|
||
Package object of the GNU Dico dictionary server.
|
||
|
||
@item @code{interfaces} (predeterminada: @var{'("localhost")})
|
||
This is the list of IP addresses and ports and possibly socket file names to
|
||
listen to (@pxref{Server Settings, @code{listen} directive,, dico, GNU Dico
|
||
Manual}).
|
||
|
||
@item @code{handlers} (predeterminados: @var{'()})
|
||
List of @code{<dicod-handler>} objects denoting handlers (module instances).
|
||
|
||
@item @code{databases} (predeterminada: @var{(list %dicod-database:gcide)})
|
||
List of @code{<dicod-database>} objects denoting dictionaries to be served.
|
||
@end table
|
||
@end deftp
|
||
|
||
@deftp {Tipo de datos} dicod-handler
|
||
Data type representing a dictionary handler (module instance).
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
Name of the handler (module instance).
|
||
|
||
@item @code{module} (predeterminado: @var{#f})
|
||
Name of the dicod module of the handler (instance). If it is @code{#f}, the
|
||
module has the same name as the handler. (@pxref{Módulos,,, dico, GNU Dico
|
||
Manual}).
|
||
|
||
@item @code{options}
|
||
List of strings or gexps representing the arguments for the module handler
|
||
@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}
|
||
Name of the dicod handler (module instance) used by this database
|
||
(@pxref{Handlers,,, dico, GNU Dico Manual}).
|
||
|
||
@item @code{complex?} (predeterminado: @var{#f})
|
||
Whether the database configuration complex. The complex configuration will
|
||
need a corresponding @code{<dicod-handler>} object, otherwise not.
|
||
|
||
@item @code{options}
|
||
List of strings or gexps representing the arguments for the database
|
||
(@pxref{Databases,,, dico, GNU Dico Manual}).
|
||
@end table
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} %dicod-database:gcide
|
||
A @code{<dicod-database>} object serving the GNU Collaborative International
|
||
Dictionary of English using the @code{gcide} package.
|
||
@end defvr
|
||
|
||
The following is an example @code{dicod-service} configuration.
|
||
|
||
@example
|
||
(dicod-service #:config
|
||
(dicod-configuration
|
||
(handlers (list (dicod-handler
|
||
(name "wordnet")
|
||
(module "dictorg")
|
||
(options
|
||
(list #~(string-append "dbdir=" #$wordnet))))))
|
||
(databases (list (dicod-database
|
||
(name "wordnet")
|
||
(complex? #t)
|
||
(handler "wordnet")
|
||
(options '("database=wn")))
|
||
%dicod-database:gcide))))
|
||
@end example
|
||
|
||
@cindex Docker
|
||
@subsubheading Docker Service
|
||
|
||
The @code{(gnu services docker)} module provides the following service.
|
||
|
||
@defvr {Scheme Variable} docker-service-type
|
||
|
||
This is the type of the service that runs
|
||
@url{http://www.docker.com,Docker}, a daemon that can execute application
|
||
bundles (sometimes referred to as ``containers'') in isolated environments.
|
||
|
||
@end defvr
|
||
|
||
@deftp {Data Type} docker-configuration
|
||
This is the data type representing the configuration of Docker and
|
||
Containerd.
|
||
|
||
@table @asis
|
||
|
||
@item @code{package} (default: @code{docker})
|
||
The Docker package to use.
|
||
|
||
@item @code{containerd} (default: @var{containerd})
|
||
The Containerd package to use.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Programas con setuid
|
||
@section Programas con setuid
|
||
|
||
@cindex programas con setuid
|
||
Algunos programas necesitan ejecutarse con privilegios de ``root'', 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 ficheros @file{/etc/passwd} y
|
||
@file{/etc/shadow}---algo normalmente restringido a root, por razones de
|
||
seguridad obvias. Para solventarlo, estos ejecutables tienen @dfn{setuid de
|
||
root}, lo que significa que siempre se ejecutan con privilegios de root
|
||
(@pxref{How Change Persona,,, libc, The GNU C Library Reference Manual},
|
||
para más información sobre el mecanismo setuid).
|
||
|
||
El almacén en sí @emph{no puede} contener programas setuid: sería un
|
||
problema de seguridad puesto que cualquier usuaria del sistema puede
|
||
escribir derivaciones que pueblen el almacén (@pxref{El almacén}). Por tanto,
|
||
se usa un mecanismo diferente: en vez de cambiar el bit de setuid
|
||
directamente en los ficheros que se encuentran en el almacén, se permite que
|
||
la administradora del sistema @emph{declare} qué programas deberían tener
|
||
setuid de root.
|
||
|
||
El campo @code{setuid-programs} de una declaración @code{operating-system}
|
||
contiene una lista de expresiones-G que denotan nombres de programas que
|
||
tendrán setuid de root (@pxref{Uso de la configuración del sistema}). Por
|
||
ejemplo, el programa @command{passwd}, que es parte del paquete Shadow,
|
||
puede designarse con esta expresión-G (@pxref{Expresiones-G}):
|
||
|
||
@example
|
||
#~(string-append #$shadow "/bin/passwd")
|
||
@end example
|
||
|
||
Un conjunto predeterminado de programas con el bit setuid se define en la
|
||
variable @code{%setuid-programs} del módulo @code{(gnu system)}.
|
||
|
||
@defvr {Variable Scheme} %setuid-programs
|
||
Una lista de expresiones-G que denotan programas comunes que se marcan con
|
||
setuid de root.
|
||
|
||
La lista incluye órdenes como @command{passwd}, @command{ping}, @command{su}
|
||
y @command{sudo}.
|
||
@end defvr
|
||
|
||
Para su implementación, los programas con setuid reales se crean en el
|
||
directorio @file{/run/setuid-programs} durante la activación del
|
||
sistema. Los ficheros en este directorio hacen referencia a los binarios
|
||
``reales'', que estan en el almacén.
|
||
|
||
@node Certificados X.509
|
||
@section Certificados X.509
|
||
|
||
@cindex HTTPS, certificados
|
||
@cindex certificados X.509
|
||
@cindex TLS
|
||
En las conexiones HTTPS a servidores Web (esto es, HTTP sobre el mecanismo
|
||
de seguridad de la capa de transporte, TLS) se envía a los programas
|
||
clientes un @dfn{certificado X.509} que el cliente puede usar para
|
||
@emph{autentificar} al servidor. Para hacerlo, los clientes verifican que el
|
||
certificado del servidor está firmado por una de las llamadas
|
||
@dfn{autoridades de certificación} (AC, CA en inglés). Pero para verificar
|
||
la firma de una AC, los clientes deben haber obtenido previamente el
|
||
certificado de dicha AC.
|
||
|
||
Los navegadores Web como GNU@tie{}IceCat incluyen su propio conjunto de
|
||
certificados de AC, de manera que pueden verificar las firmas
|
||
independientemente.
|
||
|
||
No obstante, a la mayor parte de otros programas que pueden comunicarse a
|
||
través de HTTPS---@command{wget}, @command{git}, @command{w3m}, etc.---se
|
||
les debe informar de dónde pueden encontrar los certificados de CA.
|
||
|
||
@cindex @code{nss-certs}
|
||
In Guix, 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.
|
||
|
||
Fíjese que @emph{no} es parte de @var{%base-packages}, por lo que debe ser
|
||
añadido explícitamente. El directorio @file{/etc/ssl/certs}, donde la mayor
|
||
parte de las aplicaciones y bibliotecas buscarán los certificados de manera
|
||
predeterminada, enlaza a los certificados instalados de manera global.
|
||
|
||
Las usuarias sin privilegios, incluyendo a usuarias de Guix en una
|
||
distribución distinta, pueden también instalar su propio paquete de
|
||
certificados en su perfil. Es necesario definir cierto número de variables
|
||
de entorno de manera que las aplicaciones y bibliotecas sepan dónde
|
||
encontrarlos. Por ejemplo, la biblioteca OpenSSL inspecciona las variables
|
||
@code{SSL_CERT_DIR} y @code{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 @code{GIT_SSL_CAINFO}. Por tanto, en el caso típico se
|
||
debe ejecutar algo parecido a esto:
|
||
|
||
@example
|
||
$ guix package -i 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
|
||
@code{CURL_CA_BUNDLE} apunte al empaquetado de certificados, de manera que
|
||
se debe ejecutar algo parecido a esto:
|
||
|
||
@example
|
||
$ guix package -i 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 name service switch
|
||
@cindex NSS
|
||
El módulo @code{(gnu system nss)} proporciona una interfaz con el fichero de
|
||
configuración del @dfn{selector de servicios de nombres} o @dfn{NSS}
|
||
(@pxref{NSS Configuration File,,, libc, The GNU C Library Reference
|
||
Manual}). En resumen, NSS es un mecanismo que permite la extensión de libc
|
||
con nuevos métodos de búsqueda de ``nombres'', lo que incluye nombres de
|
||
máquinas, nombres de servicios, cuentas de usuaria y más (@pxref{Selector de servicios de nombres, System Databases and Name Service Switch,, libc, The GNU C
|
||
Library Reference Manual}).
|
||
|
||
La configuración de NSS especifica, para cada base de datos del sistema, que
|
||
método de búsqueda debe ser usado, y cómo los varios métodos se enlazan
|
||
entre sí---por ejemplo, bajo qué circunstancias NSS deberá probar con el
|
||
siguiente método en la lista. La configuración de NSS se proporciona en el
|
||
campo @code{name-service-switch} de las declaraciones
|
||
@code{operating-system} (@pxref{Referencia de ``operating-system'',
|
||
@code{name-service-switch}}).
|
||
|
||
@cindex nss-mdns
|
||
@cindex .local, búsqueda de nombres de máquina
|
||
Como ejemplo, la siguiente declaración configura NSS para usar el
|
||
@uref{http://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}:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
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}.
|
||
|
||
Note that, in this case, in addition to setting the
|
||
@code{name-service-switch} of the @code{operating-system} declaration, you
|
||
also need to use @code{avahi-service-type} (@pxref{Servicios de red,
|
||
@code{avahi-service-type}}), or @var{%desktop-services}, which includes it
|
||
(@pxref{Servicios de escritorio}). Doing this makes @code{nss-mdns} accessible to
|
||
the name service cache daemon (@pxref{Servicios base, @code{nscd-service}}).
|
||
|
||
Por conveniencia, las siguientes variables proporcionan configuraciones NSS
|
||
típicas.
|
||
|
||
@defvr {Variable Scheme} %default-nss
|
||
Esta es la configuración predeterminada del selector de servicios de
|
||
nombres, un objeto @code{name-service-switch}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %mdns-host-lookup-nss
|
||
Esta es la configuración del selector de servicios de nombres que permite la
|
||
búsqueda de nombres de máquinas por DNS multicast (mDNS) para nombres de
|
||
máquinas terminados en @code{.local}.
|
||
@end defvr
|
||
|
||
La referencia de la configuración del selector de servicios de nombres se
|
||
proporciona a continuación. Tiene una asociación directa con el formato del
|
||
fichero 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 fichero 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
|
||
Las bases de datos del sistema que maneja el NSS. Cada uno de estos campos
|
||
debe ser una lista de objetos @code{<name-service>} (véase a continuación).
|
||
@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}).
|
||
|
||
Fijese 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:
|
||
|
||
@example
|
||
(lookup-specification (unavailable => continue)
|
||
(success => return))
|
||
@end example
|
||
@end table
|
||
@end deftp
|
||
|
||
@node Disco en RAM inicial
|
||
@section Disco en RAM inicial
|
||
|
||
@cindex initrd
|
||
@cindex disco inicial de RAM
|
||
Para el propósito del arranque inicial, se le proporciona al núcleo
|
||
Linux-libre un @dfn{disco inicial de RAM}, o @dfn{initrd}. Un initrd
|
||
contiene un sistema de ficheros raíz temporal así como un guión de
|
||
inicialización. Este último es responsable del montaje del sistema de
|
||
ficheros 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 nucleo Linux-libre deben estar
|
||
disponibles en el initrd. En particular, aquñi es donde se debe enumerar los
|
||
módulos que controlen realmente el disco duro deonde 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 ficheros raíz, se podría escribir:
|
||
|
||
@example
|
||
(operating-system
|
||
;; @dots{}
|
||
(initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
|
||
@end example
|
||
|
||
@defvr {Variable Scheme} %base-initrd-modules
|
||
Esta es la lista de módulos del nucleo que se incluyen en el initrd
|
||
predeterminado.
|
||
@end defvr
|
||
|
||
Más allá, si necesita personalizaciones de un nivel más bajo, el campo
|
||
@code{initrd} de una declaración @code{operating-system} le permite
|
||
especificar qué initrd desea usar. El módulo @code{(gnu system
|
||
linux-initrd)} proporciona tres formas de construir un initrd: el
|
||
procedimiento de alto nivel @code{base-initrd} y los procedimientos de bajo
|
||
nivel @code{raw-initrd} y @code{expression->initrd}.
|
||
|
||
El procedimiento @code{base-initrd} está pensado para cubrir la mayor parte
|
||
de usos comunes. Por ejemplo, si desea añadir algunos módulos del nucleo que
|
||
deben cargarse durante el arranque, puede definir el campo @code{initrd} de
|
||
la declaración de sistema operativo de esta forma:
|
||
|
||
@example
|
||
(initrd (lambda (sistemas-de-ficheros . 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-ficheros
|
||
#:qemu-networking? #t
|
||
resto)))
|
||
@end example
|
||
|
||
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 ficheros raíz volátil.
|
||
|
||
El procedimiento @code{base-initrd} se construye sobre el procedimiento
|
||
@code{raw-initrd}. Al contrario que @code{base-initrd}, @code{raw-initrd} no
|
||
funciona a alto nivel, como sería intentar deducir qué módulos del nucleo y
|
||
paquetes deben incluirse en el initrd. Un ejemplo de uso de
|
||
@code{raw-initrd} es cuando una usuaria tiene personalizada una
|
||
configuración del nucleo Linux y los módulos predeterminados del núcleo que
|
||
incluye @code{base-initrd} no están disponibles.
|
||
|
||
El disco inicial de 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 --load=@var{arranque}
|
||
Indica al disco de RAM inicial que cargue @var{arranque}, un fichero que
|
||
contiene un programa Scheme, una vez haya montado el sistema de ficheros
|
||
raíz.
|
||
|
||
Guix uses this option to yield control to a boot program that runs the
|
||
service activation programs and then spawns the GNU@tie{}Shepherd, the
|
||
initialization system.
|
||
|
||
@item --root=@var{raíz}
|
||
Monta @var{raíz} como el sistema de ficheros raíz. @var{raíz} puede ser un
|
||
nombre de dispositivo como @code{/dev/sda1}, una etiqueta del sistema de
|
||
ficheros o un UUID del sistema de ficheros.
|
||
|
||
@item --system=@var{sistema}
|
||
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 de 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 --repl
|
||
Inicia una sesión interactiva (REPL) desde el disco inicial de RAM antes de
|
||
que intente cargar los módulos del núcleo y del montaje del sistema de
|
||
ficheros 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
|
||
|
||
Now that you know all the features that initial RAM disks produced by
|
||
@code{base-initrd} and @code{raw-initrd} provide, here is how to use it and
|
||
customize it further.
|
||
|
||
@cindex initrd
|
||
@cindex disco inicial de RAM
|
||
@deffn {Procedimiento Scheme} raw-initrd @var{sistemas-de-ficheros} @
|
||
[#:linux-modules '()] [#: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 @code{--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{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.
|
||
|
||
When true, @var{keyboard-layout} is a @code{<keyboard-layout>} record
|
||
denoting the desired console keyboard layout. This is done before
|
||
@var{mapped-devices} are set up and before @var{file-systems} are mounted
|
||
such that, should the user need to enter a passphrase or use the REPL, this
|
||
happens using the intended keyboard layout.
|
||
|
||
Cuando @var{qemu-networking?} es verdadero, configura la red con los
|
||
parámetros QEMU estándar. Cuando @var{virtio?} es verdadero, carga módulos
|
||
adicionales para que la imagen en RAM pueda ser usada como un sistema
|
||
virtualizado por QEMU con controladores paravirtualizados de E/S.
|
||
|
||
Cuando @var{volatile-root?} es verdadero, el sistema de ficheros raíz tiene
|
||
permisos de escritura pero cualquier cambio realizado se perderá.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} base-initrd @var{sistemas-de-ficheros} @
|
||
[#:mapped-devices '()] [#:keyboard-layout #f] @ [#:qemu-networking? #f]
|
||
[#:volatile-root? #f] @ [#:linux-modules '()] Return as a file-like object a
|
||
generic initrd, with kernel modules taken from @var{linux}.
|
||
@var{file-systems} is a list of file-systems to be mounted by the initrd,
|
||
possibly in addition to the root file system specified on the kernel command
|
||
line via @code{--root}. @var{mapped-devices} is a list of device mappings
|
||
to realize before @var{file-systems} are mounted.
|
||
|
||
When true, @var{keyboard-layout} is a @code{<keyboard-layout>} record
|
||
denoting the desired console keyboard layout. This is done before
|
||
@var{mapped-devices} are set up and before @var{file-systems} are mounted
|
||
such that, should the user need to enter a passphrase or use the REPL, this
|
||
happens using the intended keyboard layout.
|
||
|
||
@var{qemu-networking?} y @var{volatile-root?} funcionan como en
|
||
@code{raw-initrd}.
|
||
|
||
El initrd incorpora automáticamente todos los módulos del nucleo necesarios
|
||
para @var{sistemas-de-ficheros} y para las opciones proporcionadas. Módulos
|
||
del nucleo adicionales pueden proporcionarse a través de
|
||
@var{linux-modules}. Se añadirán al initrd y se cargarán en tiempo de
|
||
arranque en el orden que aparezcan.
|
||
@end deffn
|
||
|
||
No es necesario decir que los initrd que producimos y usamos embeben un
|
||
Guile enlazado estáticamente, y que el programa de inicialización es un
|
||
programa Guile. Esto proporciona mucha flexibilidad. El procedimiento
|
||
@code{expression->initrd} construye un initrd de ese tipo, una vez
|
||
proporcionado el programa a ejecutar en dicho initrd.
|
||
|
||
@deffn {Procedimiento Scheme} expression->initrd @var{exp} @
|
||
[#:guile %guile-static-stripped] [#:name "guile-initrd"]
|
||
Devuelve como un objeto tipo-fichero el initrd de Linux (un archivador cpio
|
||
comprimido con gzip) que contiene @var{guile} y que evalua 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
|
||
El cargador de arranque a usar, como un objeto @code{bootloader}. De momento
|
||
se aceptan @code{grub-bootloader}, @code{grub-efi-bootloader},
|
||
@code{extlinux-bootloader} y @code{u-boot-bootloader}.
|
||
|
||
@vindex grub-efi-bootloader
|
||
@code{grub-efi-bootloader} permite el arranque en sistemas modernos que usan
|
||
la @dfn{interfaz extendida de firmware unificada} (UEFI). Es el que debería
|
||
ser usado si la imagen de instalación contiene un directorio
|
||
@file{/sys/firmware/efi} cuando la arranca en su sistema.
|
||
|
||
@vindex grub-bootloader
|
||
@code{grub-bootloader} permite el arranque en máquinas basadas en Intel en
|
||
modo ``antiguo'' BIOS.
|
||
|
||
@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{http://www.denx.de/wiki/U-Boot/,
|
||
cargador de arranque U-Boot}.
|
||
|
||
@item @code{target}
|
||
Una cadena que indica donde se instalará el cargador de arranque.
|
||
|
||
La interpretación depende del cargador de arranque en cuestión. Para
|
||
@code{grub-bootloader}, por ejemplo, debe ser un nombre de dispositivo que
|
||
entienda la orden @command{install} del cargador de arranque, como
|
||
@code{/dev/sda} o @code{(hd0)} (@pxref{Invoking grub-install,,, grub, GNU
|
||
GRUB Manual}). Para @code{grub-efi-bootloader}, debe apuntar al punto de
|
||
montaje del sistema de ficheros EFI, habitualmente @file{/boot/efi}.
|
||
|
||
@item @code{menu-entries} (predeterminadas: @code{()})
|
||
Una lista posiblemente vacia 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 keyboard layout, for the bootloader
|
||
@item @code{keyboard-layout} (predeterminada: @code{#f})
|
||
If this is @code{#f}, the bootloader's menu (if any) uses the default
|
||
keyboard layout, usually US@tie{}English (``qwerty'').
|
||
|
||
Otherwise, this must be a @code{keyboard-layout} object (@pxref{Distribución de teclado}).
|
||
|
||
@quotation Nota
|
||
This option is currently ignored by bootloaders other than @code{grub} and
|
||
@code{grub-efi}.
|
||
@end quotation
|
||
|
||
@item @code{theme} (predeterminado: @var{#f})
|
||
El objeto del tema del cargador de arranque que describa el tema a usar. 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} (predeterminada: @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 platafroma 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}).
|
||
@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:
|
||
|
||
@example
|
||
(menu-entry
|
||
(label "La otra distribución")
|
||
(linux "/boot/old/vmlinux-2.6.32")
|
||
(linux-arguments '("root=/dev/sda2"))
|
||
(initrd "/boot/old/initrd"))
|
||
@end example
|
||
|
||
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}
|
||
La imagen del núcleo Linux a arrancar, por ejemplo:
|
||
|
||
@example
|
||
(file-append linux-libre "/bzImage")
|
||
@end example
|
||
|
||
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}
|
||
Una expresión-G o una cadena que contiene el nombre de fichero del disco
|
||
inicial en RAM a usar (@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 ficheros (una cadena), un UUID de
|
||
sistema de ficheros (un vector de bytes, @pxref{Sistemas de ficheros}), o @code{#f},
|
||
en cuyo caso el cargador de arranque buscará el dispositivo que contenga el
|
||
fichero 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}.
|
||
|
||
@end table
|
||
@end deftp
|
||
|
||
@c FIXME: Write documentation once it's stable.
|
||
For now only GRUB has theme support. GRUB themes are created using the
|
||
@code{grub-theme} form, which is not documented yet.
|
||
|
||
@defvr {Variable Scheme} %default-theme
|
||
Este es 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 defvr
|
||
|
||
|
||
@node Invocación de guix system
|
||
@section Invocación de @code{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{fichero}
|
||
@end example
|
||
|
||
@var{fichero} debe ser el nombre de un fichero 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:
|
||
|
||
@example
|
||
$ guix system search console font
|
||
name: console-fonts
|
||
location: gnu/services/base.scm:729: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 like:
|
||
+
|
||
+ '(("tty1" . "LatGrkCyr-8x16"))
|
||
relevance: 20
|
||
|
||
name: mingetty
|
||
location: gnu/services/base.scm:1048:2
|
||
extends: shepherd-root
|
||
description: Provide console login using the `mingetty' program.
|
||
relevance: 2
|
||
|
||
name: login
|
||
location: gnu/services/base.scm:775: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}).
|
||
|
||
@item reconfigure
|
||
Build the operating system described in @var{file}, activate it, and switch
|
||
to it@footnote{This action (and the related actions @code{switch-generation}
|
||
and @code{roll-back}) are usable only on systems already running Guix
|
||
System.}.
|
||
|
||
This effects all the configuration specified in @var{file}: user accounts,
|
||
system services, global package list, setuid 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}).
|
||
|
||
También añade una entrada al cargador de arranque para la nueva
|
||
configuración del sistema operativo---en caso de que no se proporcione la
|
||
opción @option{--no-bootloader}. Con GRUB, mueve las entradas de
|
||
configuraciones antiguas a un submenú, permitiendo la selección de una
|
||
generación previa del sistema en tiempo de arranque en caso necesario.
|
||
|
||
@quotation Nota
|
||
@c The paragraph below refers to the problem discussed at
|
||
@c <http://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
|
||
|
||
@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 fichero 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 vuelta atrás
|
||
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 deleting system generations
|
||
@cindex saving space
|
||
Delete system 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 @command{guix package --delete-generations}
|
||
(@pxref{Invocación de guix package, @code{--delete-generations}}). With no
|
||
arguments, all system generations but the current one are deleted:
|
||
|
||
@example
|
||
guix system delete-generations
|
||
@end example
|
||
|
||
You can also select the generations you want to delete. The example below
|
||
deletes all the system generations that are more than two month old:
|
||
|
||
@example
|
||
guix system delete-generations 2m
|
||
@end example
|
||
|
||
Running this command automatically reinstalls the bootloader with an updated
|
||
list of menu entries---e.g., the ``old generations'' sub-menu in GRUB no
|
||
longer lists the generations that have been deleted.
|
||
|
||
@item build
|
||
Construye la derivación del sistema operativo, que incluye todos los
|
||
ficheros 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
|
||
Populate the given directory with all the files necessary to run the
|
||
operating system specified in @var{file}. This is useful for first-time
|
||
installations of Guix System. For instance:
|
||
|
||
@example
|
||
guix system init mi-conf-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-conf-del-so.scm}. Esto incluye los
|
||
ficheros de configuración, paquetes y demás. También crea otros ficheros
|
||
esenciales necesarios para la correcta operación del sistema---por ejemplo,
|
||
los directorios @file{/etc}, @file{/var} y @file{/run}, y el fichero
|
||
@file{/bin/sh}.
|
||
|
||
Esta orden también instala el cargador de arranque en el destino
|
||
especificado en @file{mi-conf-del-so.scm}, siempre que no se proporcione la
|
||
opción @option{--no-bootloader}.
|
||
|
||
@item vm
|
||
@cindex máquina virtual
|
||
@cindex VM
|
||
@anchor{guix system vm}
|
||
Build a virtual machine that contains the operating system declared in
|
||
@var{file}, and return a script to run that virtual machine (VM).
|
||
|
||
@quotation Nota
|
||
The @code{vm} action and others below can use KVM support in the Linux-libre
|
||
kernel. Specifically, if the machine has hardware virtualization support,
|
||
the corresponding KVM kernel module should be loaded, and the
|
||
@file{/dev/kvm} device node must exist and be readable and writable by the
|
||
user and by the build users of the daemon (@pxref{Configuración del entorno de construcción}).
|
||
@end quotation
|
||
|
||
Arguments given to the script are passed to QEMU as in the example below,
|
||
which enables networking and requests 1@tie{}GiB of RAM for the emulated
|
||
machine:
|
||
|
||
@example
|
||
$ /gnu/store/@dots{}-run-vm.sh -m 1024 -net user
|
||
@end example
|
||
|
||
La VM comparte su almacén con el sistema anfitrión.
|
||
|
||
Sistemas de ficheros adicionales pueden compartirse entre la máquina
|
||
anfitriona y la virtual mediante el uso de las opciones @code{--share} y
|
||
@code{--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-configuracion.scm \
|
||
--expose=$HOME --share=$HOME/tmp=/intercambio
|
||
@end example
|
||
|
||
En GNU/Linux, lo predeterminado es arrancar directamente el núcleo; esto
|
||
posee la ventaja de necesitar únicamente una pequeña imagen del disco raíz
|
||
pequeña ya el el almacén de la anfitriona puede montarse.
|
||
|
||
La opción @code{--full-boot} fuerza una secuencia de arranque completa,
|
||
desde el cargador de arranque. Esto necesita más espacio en disco ya que la
|
||
imagen raíz que contiene el núcleo, initrd y los ficheros de datos del
|
||
cargador de arranque deben crearse. La opción @code{--image-size} puede
|
||
usarse para especificar el tamaño de la imagen.
|
||
|
||
@cindex Imágenes de sistema, creación en varios formatos
|
||
@cindex Creación de imágenes del sistema en varios formatos
|
||
@item vm-image
|
||
@itemx disk-image
|
||
@itemx docker-image
|
||
Devuelve una máquina virtual, imagen de disco o imagen Docker del sistema
|
||
operativo declarado en @var{fichero} que es independiente. Por omisión,
|
||
@command{guix system} estima el tamaño de la imagen necesario para almacenar
|
||
el sistema, pero puede usar la opción @option{--image-size} para especificar
|
||
un valor. Las imagenes Docker se construyen para que contengan exactamente
|
||
lo que necesitan, por lo que la opción @option{--image-size} se ignora en el
|
||
caso de @code{docker-image}.
|
||
|
||
Puede especificar el sistema de ficheros raíz mediante el uso de la opción
|
||
@option{--file-system-type}. Su valor predeterminado es @code{ext4}.
|
||
|
||
When using @code{vm-image}, 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.
|
||
|
||
Con @code{disk-image} se produce una imagen de disco cruda; puede copiarse
|
||
tal cual en una memoria USB, por ejemplo. Asumiendo que @code{/dev/sdc} es
|
||
el dispositivo que corresponde a la memoria USB, se podría copiar la imagen
|
||
con la siguiente orden:
|
||
|
||
@example
|
||
# dd if=$(guix system disk-image mi-so.scm) of=/dev/sdc
|
||
@end example
|
||
|
||
Con @code{docker-image} se produce una imagen Docker. Guix construye la
|
||
imagen de cero, no de una imagen Docker base preexistente. Como resultado,
|
||
contiene @emph{exactamente} lo definido en el fichero de configuración del
|
||
sistema operativo. Puede cargar la imagen y ejecutar un contenedor Docker
|
||
mediante el uso de ordenes como las siguientes:
|
||
|
||
@example
|
||
image_id="$(docker load < guix-system-docker-image.tar.gz)"
|
||
docker run -e GUIX_NEW_SYSTEM=/var/guix/profiles/system \\
|
||
--entrypoint /var/guix/profiles/system/profile/bin/guile \\
|
||
$image_id /var/guix/profiles/system/boot
|
||
@end example
|
||
|
||
This command starts a new Docker container from the specified image. It
|
||
will boot the Guix system in the usual manner, which means it will start any
|
||
services you have defined in the operating system configuration. Depending
|
||
on what you run in the Docker container, it may be necessary to give the
|
||
container additional permissions. For example, if you intend to build
|
||
software using Guix inside of the Docker container, you may need to pass the
|
||
@option{--privileged} option to @code{docker run}.
|
||
|
||
@item container
|
||
Devuelve un guión de la ejecución del sistema operativo declarado en
|
||
@var{fichero} 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 ficheros
|
||
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-configuracion.scm \
|
||
--expose=$HOME --share=$HOME/tmp=/intercambio
|
||
@end example
|
||
|
||
@quotation Nota
|
||
Esta opción requiere Linux-libre 3.19 o posterior.
|
||
@end quotation
|
||
|
||
@end table
|
||
|
||
@var{opciones} puede contener cualquiera de las opciones de construcción
|
||
comunes (@pxref{Opciones comunes de construcción}). Además, @var{opciones} puede
|
||
contener una de las siguientes:
|
||
|
||
@table @option
|
||
@item --expression=@var{expr}
|
||
@itemx -e @var{expr}
|
||
Consider the operating-system @var{expr} evaluates to. This is an
|
||
alternative to specifying a file which evaluates to an operating system.
|
||
This is used to generate the Guix system installer @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 --derivation
|
||
@itemx -d
|
||
Devuelve el nombre de fichero de la derivación del sistema operativo
|
||
proporcionado sin construir nada.
|
||
|
||
@item --file-system-type=@var{tipo}
|
||
@itemx -t @var{tipo}
|
||
Para la acción @code{disk-image}, crea un sistema de ficheros del @var{tipo}
|
||
proporcionado en la imagen.
|
||
|
||
Cuando se omite esta opción, @command{guix system} usa @code{ext4}.
|
||
|
||
@cindex ISO-9660, formato
|
||
@cindex CD, formato de imagen
|
||
@cindex DVD, formato de imagen
|
||
@code{--file-system-type=iso9660} produce una imagen ISO-9660, que puede ser
|
||
grabada en CD y DVD.
|
||
|
||
@item --image-size=@var{tamaño}
|
||
Junto a las acciones @code{vm-image} y @code{disk-image}, crea una imagen
|
||
del @var{ŧamaño} proporcionado. @var{tamaño} debe ser un número de bytes o
|
||
puede incluir una unidad como sufijo (@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{fichero}.
|
||
|
||
@item --root=@var{fichero}
|
||
@itemx -r @var{fichero}
|
||
Hace que @var{fichero} 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
|
||
ficheros que aparecen en la declaración @code{operating-system} realmente
|
||
existen (@pxref{Sistemas de ficheros}) 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.
|
||
|
||
@cindex on-error
|
||
@cindex on-error strategy
|
||
@cindex error strategy
|
||
@item --on-error=@var{estrategia}
|
||
Aplica @var{estrategia} cuando ocurre un error durante la lectura de
|
||
@var{fichero}. @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 llamads,
|
||
@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
|
||
|
||
Once you have built, configured, re-configured, and re-re-configured your
|
||
Guix installation, you may find it useful to list the operating system
|
||
generations available on disk---and that you can choose from the bootloader
|
||
boot menu:
|
||
|
||
@table @code
|
||
|
||
@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
|
||
|
||
@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
|
||
Emite en formato Dot/Graphviz por la salida estándar el @dfn{grafo de
|
||
extensiones de servicio} del sistema operativo definido en @var{fichero}
|
||
(@pxref{Composición de servicios}, para más información sobre extensiones de
|
||
servicio).
|
||
|
||
La orden:
|
||
|
||
@example
|
||
$ guix system extension-graph @var{fichero} | dot -Tpdf > servicios.pdf
|
||
@end example
|
||
|
||
produce un fichero PDF que muestra las relaciones de extensiones entre los
|
||
servicios.
|
||
|
||
@anchor{system-shepherd-graph}
|
||
@item shepherd-graph
|
||
Emite en formato Dot/Graphviz por la salida estándar el @dfn{grafo de
|
||
dependencias} de los servicios shepherd del sistema operativo definido en
|
||
@var{fichero}. @xref{Servicios de Shepherd}, para más información y un grafo de
|
||
ejemplo.
|
||
|
||
@end table
|
||
|
||
@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 either use the pre-built Guix
|
||
VM image distributed at
|
||
@indicateurl{https://alpha.gnu.org/gnu/guix/guix-system-vm-image-@value{VERSION}.@var{system}.xz}
|
||
, or build their own virtual machine image using @command{guix system
|
||
vm-image} (@pxref{Invocación de guix system}). The returned image is in qcow2
|
||
format, which the @uref{http://qemu.org/, QEMU emulator} can efficiently
|
||
use.
|
||
|
||
@cindex QEMU
|
||
Si ha construido su propia imagen, debe copiarla fuera del almacén y
|
||
proporcionarse a sí misma permisos de escritura sobre dicha copia antes de
|
||
usarla. En la invocación de QEMU debe elegir un emulador de sistema que sea
|
||
adecuado para su plataforma hardware. Esta es una invocación de QEMU mínima
|
||
que arrancará el resultado de @command{guix system vm-image} en hardware
|
||
x86_64:
|
||
|
||
@example
|
||
$ qemu-system-x86_64 \
|
||
-net user -net nic,model=virtio \
|
||
-enable-kvm -m 256 /tmp/imagen-qemu
|
||
@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 -net user
|
||
Habilita la pila de red en modo de usuaria sin privilegios. El SO
|
||
virtualizado puede acceder al anfitrión pero no al revés. Esta es la forma
|
||
más simple de poner en línea un SO virtualizado.
|
||
|
||
@item -net nic,model=virtio
|
||
Debe crear una interfaz de red del modelo proporcionado. Si la crea, el
|
||
arranque fallará. Asumiendo que su plataforma hardware sea x86_64, puede
|
||
obtener una lista de modelos de interfaz de red disponibles ejecutando
|
||
@command{qemu-system-x86_64 -net 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.
|
||
|
||
@item -m 256
|
||
RAM disponible para el sistema operativo virtualizado, en mebibytes. El
|
||
valor predeterminado es 128@tie{}MiB, que puede ser insuficiente para
|
||
algunas operaciones.
|
||
|
||
@item /tmp/imagen-qemu
|
||
El nombre de fichero de la imagen qcow2.
|
||
@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{-net user} por
|
||
defecto. 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`
|
||
-net user}. Un punto importante a tener en cuenta del uso de @command{-net
|
||
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{(dropbear-service)} o @code{(lsh-service)} en su máquina
|
||
virtual. El servicio @code{(lsh-service)} no arranca actualmente sin
|
||
supervisión, ya que precisa de entrada para inicializar el generador de
|
||
aleatoriedad. Además tiene que redirigir el puerto SSH, 22 el
|
||
predeterminado, a la máquina anfitriona. Puede hacerlo con
|
||
|
||
@example
|
||
`guix system vm config.scm` -net user,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
|
||
@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 fichero @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.
|
||
|
||
@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 también le permite hacer cosas como compartir su portapapeles con su
|
||
máquina virtual. Para activarlo debe proporcionar también las siguientes
|
||
opciones a @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 debe añadir el @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.
|
||
@end menu
|
||
|
||
@node Composición de servicios
|
||
@subsection Composición de servicios
|
||
|
||
@cindex services
|
||
@cindex daemons
|
||
Definimos un @dfn{servicio} como, @i{grosso modo}, 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
|
||
Guix system services are connected by @dfn{extensions}. For instance, the
|
||
secure shell service @emph{extends} the Shepherd---the initialization
|
||
system, running as PID@tie{}1---by giving it the command lines to start and
|
||
stop the secure shell daemon (@pxref{Servicios de red,
|
||
@code{openssh-service-type}}); the UPower service extends the D-Bus service
|
||
by passing it its @file{.service} specification, and extends the udev
|
||
service by passing it device management rules (@pxref{Servicios de escritorio,
|
||
@code{upower-service}}); the Guix daemon service extends the Shepherd by
|
||
passing it the command lines to start and stop the daemon, and extends the
|
||
account service by passing it a list of required build user accounts
|
||
(@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, a system running two instances of the GNU secure
|
||
shell server (lsh) has two instances of @code{lsh-service-type}, 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}):
|
||
|
||
@example
|
||
(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 example
|
||
|
||
@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
|
||
|
||
In this example, @code{guix-service-type} extends three services:
|
||
|
||
@table @code
|
||
@item shepherd-root-service-type
|
||
The @code{guix-shepherd-service} procedure defines how the Shepherd service
|
||
is extended. Namely, it returns a @code{<shepherd-service>} object that
|
||
defines how @command{guix-daemon} is started and stopped (@pxref{Servicios de Shepherd}).
|
||
|
||
@item account-service-type
|
||
This extension for this service is computed by @code{guix-accounts}, which
|
||
returns a list of @code{user-group} and @code{user-account} objects
|
||
representing the build user accounts (@pxref{Invocación de guix-daemon}).
|
||
|
||
@item activation-service-type
|
||
Here @code{guix-activation} is a procedure that returns a gexp, which is a
|
||
code snippet to run at ``activation time''---e.g., when the service is
|
||
booted.
|
||
@end table
|
||
|
||
Un servicio de este tipo se puede instanciar de esta manera:
|
||
|
||
@example
|
||
(service guix-service-type
|
||
(guix-configuration
|
||
(build-accounts 5)
|
||
(use-substitutes? #f)))
|
||
@end example
|
||
|
||
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}:
|
||
|
||
@example
|
||
(service guix-service-type)
|
||
@end example
|
||
|
||
@code{guix-service-type} is quite simple because it extends other services
|
||
but is not extensible itself.
|
||
|
||
@c @subsubsubsection Extensible Service Types
|
||
|
||
El tipo de servicio para un servicio @emph{extensible} puede tener esta
|
||
forma:
|
||
|
||
@example
|
||
(define udev-service-type
|
||
(service-type (name 'udev)
|
||
(extensions
|
||
(list (service-extension shepherd-root-service-type
|
||
udev-shepherd-service)))
|
||
|
||
(compose concatenate) ;concatena la lista de reglas
|
||
(extend (lambda (config rules)
|
||
(match config
|
||
(($ <udev-configuration> udev initial-rules)
|
||
(udev-configuration
|
||
(udev udev) ;el paquete udev a usar
|
||
(rules (append initial-rules rules)))))))))
|
||
@end example
|
||
|
||
This is the service type for the
|
||
@uref{https://wiki.gentoo.org/wiki/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 simplemente concatenandolas.
|
||
|
||
@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
|
||
|
||
There can be only one instance of an extensible service type such as
|
||
@code{udev-service-type}. If there were more, the @code{service-extension}
|
||
specifications would be ambiguous.
|
||
|
||
¿Todavía aquí? La siguiente sección proporciona una referencia de la
|
||
interfaz programática de los servicios.
|
||
|
||
@node Referencia de servicios
|
||
@subsection Referencia de servicios
|
||
|
||
Ya hemos echado un vistazo a los tipos de servicio (@pxref{Tipos de servicios y servicios}). Esta sección proporciona referencias sobre cómo manipular
|
||
servicios y tipos de servicio. Esta interfaz se proporciona en el módulo
|
||
@code{(gnu services)}.
|
||
|
||
@deffn {Procedimiento Scheme} service @var{tipo} [@var{valor}]
|
||
Devuelve un nuevo servicio de @var{tipo}, un objeto @code{<service-type>}
|
||
(véase a continuación). @var{valor} puede ser cualquier objeto; represental
|
||
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:
|
||
|
||
@example
|
||
(service openssh-service-type)
|
||
@end example
|
||
|
||
@noindent
|
||
es equivalente a esto:
|
||
|
||
@example
|
||
(service openssh-service-type
|
||
(openssh-configuration))
|
||
@end example
|
||
|
||
En ambos casos el resultado es una instancia de @code{openssh-service-type}
|
||
con la configuración predeterminada.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} service? @var{obj}
|
||
Devuelve verdadero si @var{obj} es un servicio.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} service-kind @var{servicio}
|
||
Devuelve el tipo de @var{servicio}---es decir, un objeto
|
||
@code{<service-type>}.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} service-value @var{servicio}
|
||
Devuelve el valor asociado con @var{servicio}. Representa sus parámetros.
|
||
@end deffn
|
||
|
||
Este es un ejemplo de creación y manipulación de un servicio:
|
||
|
||
@example
|
||
(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 example
|
||
|
||
The @code{modify-services} form provides a handy way to change the
|
||
parameters of some of the services of a list such as @code{%base-services}
|
||
(@pxref{Servicios base, @code{%base-services}}). It evaluates to a list of
|
||
services. Of course, you could always use standard list combinators such as
|
||
@code{map} and @code{fold} to do that (@pxref{SRFI-1, List Library,, guile,
|
||
GNU Guile Reference Manual}); @code{modify-services} simply provides a more
|
||
concise form for this common pattern.
|
||
|
||
@deffn {Sintaxis Scheme} modify-services @var{servicios} @
|
||
(@var{tipo} @var{variable} => @var{cuerpo}) @dots{}
|
||
|
||
Modifica los servicios listados en @var{servicios} de acuerdo a las
|
||
cláusulas proporcionadas. Cada cláusula tiene la forma:
|
||
|
||
@example
|
||
(@var{tipo} @var{variable} => @var{cuerpo})
|
||
@end example
|
||
|
||
donde @var{tipo} es un tipo de servicio---por ejemplo,
|
||
@code{guix-service-type}---y @var{variable} es un identificador que se
|
||
asocia dentro del @var{cuerpo} a los parámetros del servicio---por ejemplo,
|
||
una instancia @code{guix-configuration}---del servicio original de dicho
|
||
@var{ŧipo}.
|
||
|
||
El @var{cuerpo} deve evaluar a los nuevos parámetros del servicio, que serán
|
||
usados para configurar el nuevo servicio. Este nuevo servicio reemplaza el
|
||
original en la lista resultante. Debido a que los parámetros de servicio de
|
||
un servicio se crean mediante el uso de @code{define-record-type*}, puede
|
||
escribir un breve @var{cuerpo} que evalúe a los nuevos parámetros del
|
||
servicio mediante el uso de la característica @code{inherit} que proporciona
|
||
@code{define-record-type*} para heredar los valores antiguos.
|
||
|
||
@xref{Uso de la configuración del sistema}, para ejemplos de uso.
|
||
|
||
@end deffn
|
||
|
||
A continuación se procede con la interfaz programática de los tipos de
|
||
servicios. Es algo que debe conocer para escribir definiciones de nuevos
|
||
servicios, pero no es cuando busque formas de personalizar su declaración
|
||
@code{operating-system}.
|
||
|
||
@deftp {Tipo de datos} service-type
|
||
@cindex tipo de servicio
|
||
Esta es la representación de un @dfn{tipo de servicio} (@pxref{Tipos de servicios y servicios}).
|
||
|
||
@table @asis
|
||
@item @code{name}
|
||
Es un símbolo, usado únicamente para simplificar la inspección y la
|
||
depuración.
|
||
|
||
@item @code{extensions}
|
||
Una lista no vacía de objetos @code{<service-extension>} (véase a
|
||
continuación).
|
||
|
||
@item @code{compose} (predeterminado: @code{#f})
|
||
Si es @code{#f}, entonces el tipo de servicio denota servicios que no pueden
|
||
extenderse---es decir, servicios que no pueden recibir ``valores'' de otros
|
||
servicios.
|
||
|
||
En otro caso, debe ser un procedimiento de un único parámetro. El
|
||
procedimiento es invocado en @code{fold-services} y se le proporciona una
|
||
lista de valores recibidos de las extensiones. Puede devolver un valor
|
||
único.
|
||
|
||
@item @code{extend} (predeterminado: @code{#f})
|
||
Si es @code{#f}, los servicios de este tipo no pueden extenderse.
|
||
|
||
En otro caso, debe ser un procedimiento que acepte dos parámetros:
|
||
@code{fold-services} lo invoca, proporcionandole el valor inicial del
|
||
servicio como el primer parámetro y el resultado de aplicar @code{compose} a
|
||
los valores de las extensiones como segundo parámetro. Debe devolver un
|
||
valor que es un parámetro válido para la instancia del servicio.
|
||
@end table
|
||
|
||
@xref{Tipos de servicios y servicios}, para ejemplos.
|
||
@end deftp
|
||
|
||
@deffn {Procedimiento Scheme} service-extension @var{tipo-deseado} @
|
||
@var{calcula}
|
||
|
||
Devuelve una nueva extensión para servicios del tipo
|
||
@var{tipo-deseado}. @var{calcula} debe ser un procedimiento de un único
|
||
parámetro: es llamado en @code{fold-services}, proporcionandole el valor
|
||
asociado con el servicio que proporciona la extensión; debe devolver un
|
||
valor válido para el servicio deseado.
|
||
@end deffn
|
||
|
||
@deffn {Procedimiento Scheme} service-extension? @var{obj}
|
||
Devuelve verdadero si @var{obj} es una expresión-G.
|
||
@end deffn
|
||
|
||
De manera ocasional, puede desear simplemente extender un servicio
|
||
existente. Esto implica la creación de un nuevo tipo de servicio y la
|
||
especificación de la extensión deseada, lo cual puede ser engorroso; el
|
||
procedimiento @code{simple-service} proporciona un atajo para ello.
|
||
|
||
@deffn {Procedimiento Scheme} simple-service @var{nombre} @var{deseado} @var{valor}
|
||
Devuelve un servicio que extiende @var{deseado} con @var{valor}. Esto
|
||
funciona creando una instancia única del tipo de servicio @var{nombre}, de
|
||
la cual el servicio devuelto es una instancia.
|
||
|
||
Por ejemplo, esto extiende mcron (@pxref{Ejecución de tareas programadas}) con una
|
||
tarea adicional:
|
||
|
||
@example
|
||
(simple-service 'mi-tarea-mcron mcron-service-type
|
||
#~(job '(next-hour (3)) "guix gc -F 2G"))
|
||
@end example
|
||
@end deffn
|
||
|
||
En el núcleo de la abstracción de los servicios se encuentra el
|
||
procedimiento @code{fold-services}, que es responsable de la ``compilación''
|
||
de una lista de servicios en un único directorio que contiene todo lo
|
||
necesario para arrancar y ejecutar el sistema---el directorio mostrado por
|
||
la orden @command{guix system build} (@pxref{Invocación de guix system}). En
|
||
esencia, propaga las extensiones de servicios a través del grafo de
|
||
servicios, actualizando los parámetros de cada nodo en el camino, hasta que
|
||
alcanza el nodo raíz.
|
||
|
||
@deffn {Procedimiento Scheme} fold-services @var{servicios} @
|
||
[#:target-type @var{system-service-type}]
|
||
Recorre @var{servicios} propagando sus extensiones hasta la raíz del tipo
|
||
@var{target-type}; devuelve el servicio raíz tratado de la manera apropiada.
|
||
@end deffn
|
||
|
||
Por último, el módulo @code{(gnu services)} también define varios tipos
|
||
esenciales de servicios, algunos de los cuales se enumeran a continuación.
|
||
|
||
@defvr {Variable Scheme} system-service-type
|
||
Esta es la raíz del grafo de servicios. Produce el directorio del sistema
|
||
como lo devuelve la orden @code{guix system build}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} boot-service-type
|
||
El tipo del ``servicio de arranque'', que produce un @dfn{guión de
|
||
arranque}. El guión de arranque es lo que ejecuta el disco inicial de RAM
|
||
cuando se arranca.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} etc-service-type
|
||
El tipo del servicio @file{/etc}. Este servicio se usa para crear los
|
||
ficheros en @file{/etc} y puede extenderse proporcionandole pares
|
||
nombre/fichero como estas:
|
||
|
||
@example
|
||
(list `("issue" ,(plain-file "issue" "¡Bienvenida!\n")))
|
||
@end example
|
||
|
||
En este ejemplo, el ejecto sería la adición de un fichero @file{/etc/issue}
|
||
que apunta al fichero proporcionado.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} setuid-program-service-type
|
||
Tipo para el ``servicio de programas setuid''. Este servicio recopila listas
|
||
de nombres de ficheros ejecutables, proporcionados como expresiones-G, y los
|
||
añade al conjunto de programas con setuid de root en el sistema
|
||
(@pxref{Programas con setuid}).
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} profile-service-type
|
||
Tipo del servicio que genera el @dfn{perfil del sistema}---es decir, los
|
||
programas en @file{/run/current-system/profile}. Otros servicios pueden
|
||
extenderlo proporcionandole listas de paquetes a añadir al perfil del
|
||
sistema.
|
||
@end defvr
|
||
|
||
|
||
@node Servicios de Shepherd
|
||
@subsection Servicios de Shepherd
|
||
|
||
@cindex servicios de shepherd
|
||
@cindex PID 1
|
||
@cindex sistema de inicio
|
||
The @code{(gnu services shepherd)} module provides a way to define services
|
||
managed by the GNU@tie{}Shepherd, which is the initialization system---the
|
||
first process that is started when the system boots, also known as
|
||
PID@tie{}1 (@pxref{Introducción,,, shepherd, The GNU Shepherd Manual}).
|
||
|
||
Los servicios en Shepherd pueden depender de otros servicios. Por ejemplo,
|
||
el daemon SSH puede tener que arrancarse tras el arranque del daemon syslog,
|
||
lo cual a su vez puede suceder únicamente tras el montaje de todos los
|
||
sistemas de ficheros. 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}}).
|
||
|
||
The @code{%shepherd-root-service} is a service object representing
|
||
PID@tie{}1, of type @code{shepherd-root-service-type}; it can be extended by
|
||
passing it lists of @code{<shepherd-service>} objects.
|
||
|
||
@deftp {Tipo de datos} shepherd-service
|
||
El tipo de datos que representa un servicio gestionado por Shepherd.
|
||
|
||
@table @asis
|
||
@item @code{provision}
|
||
Una lista de símbolos que indican lo que proporciona el servicio.
|
||
|
||
Esto son nombres que pueden proporcionarse a @command{herd start},
|
||
@command{herd status} y órdenes similares (@pxref{Invoking herd,,, shepherd,
|
||
The GNU Shepherd Manual}). @xref{Slots of services, the @code{provides}
|
||
slot,, shepherd, The GNU Shepherd Manual}, para más detalles.
|
||
|
||
@item @code{requirements} (predeterminados: @code{'()})
|
||
Lista de símbolos que indican los servicios Shepherd de los que este
|
||
depende.
|
||
|
||
@cindex one-shot services, for the Shepherd
|
||
@item @code{one-shot?} (predeterminado: @code{#f})
|
||
Whether this service is @dfn{one-shot}. One-shot services stop immediately
|
||
after their @code{start} action has completed. @xref{Slots of services,,,
|
||
shepherd, The GNU Shepherd Manual}, for more info.
|
||
|
||
@item @code{respawn?} (predeterminado: @code{#t})
|
||
Indica si se debe reiniciar el servicio cuando se para, por ejemplo cuando
|
||
el proceso subyacente muere.
|
||
|
||
@item @code{start}
|
||
@itemx @code{stop} (predeterminado: @code{#~(const #f)})
|
||
Los campos @code{start} y @code{stop} hacen referencia a las características
|
||
de Shepherd de arranque y parada de procesos respectivamente (@pxref{Service
|
||
De- and Constructors,,, shepherd, The GNU Shepherd Manual}). Se proporcionan
|
||
como expresiones-G que se expandirán en el fichero 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{documentación}
|
||
Una cadena de documentación, que se mostrará al ejecutar:
|
||
|
||
@example
|
||
herd doc @var{nombre-del-servicio}
|
||
@end example
|
||
|
||
where @var{service-name} is one of the symbols in @code{provision}
|
||
(@pxref{Invoking herd,,, shepherd, The GNU Shepherd Manual}).
|
||
|
||
@item @code{modules} (default: @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
|
||
|
||
@deftp {Tipo de datos} shepherd-action
|
||
Este es el tipo de datos que define acciones adicionales implementadas por
|
||
un servicio Shepherd (vea previamente).
|
||
|
||
@table @code
|
||
@item name
|
||
Símbolo que nombra la acción.
|
||
|
||
@item documentación
|
||
Esta es una cadena de documentación para la acción. Puede verse ejecutando:
|
||
|
||
@example
|
||
herd doc @var{servicio} action @var{acción}
|
||
@end example
|
||
|
||
@item procedure
|
||
Debe ser una expresión-G que evalua 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:
|
||
|
||
@example
|
||
(shepherd-action
|
||
(name 'di-hola)
|
||
(documentation "¡Di hola!")
|
||
(procedure #~(lambda (running . args)
|
||
(format #t "¡Hola, compa! parámetros: ~s\n"
|
||
args)
|
||
#t)))
|
||
@end example
|
||
|
||
Asumiendo que esta acción se añade al servicio @code{ejemplo}, puede
|
||
ejecutar:
|
||
|
||
@example
|
||
# herd di-hola ejemplo
|
||
¡Hola, compa! parámetros: ()
|
||
# herd di-hola ejemplo a b c
|
||
¡Hola, compa! parámetros: ("a" "b" "c")
|
||
@end example
|
||
|
||
Esta, como puede ver, es una forma un tanto sofisticada de decir
|
||
hola. @xref{Service Convenience,,, shepherd, The GNU Shepherd Manual}, para
|
||
más información sobre acciones.
|
||
@end deftp
|
||
|
||
@defvr {Variable Scheme} shepherd-root-service-type
|
||
El tipo de servicio para el ``servicio raíz'' de Shepherd---es decir,
|
||
PID@tie{}1.
|
||
|
||
El tipo de servicio que las extensiones declaran cuando desean crear
|
||
servicios shepherd (@pxref{Tipos de servicios y servicios}, para un
|
||
ejemplo). Cada extensión debe pasar una lista de @code{<shepherd-service>}.
|
||
@end defvr
|
||
|
||
@defvr {Variable Scheme} %shepherd-root-service
|
||
Este servicio representa el PID@tie{}1.
|
||
@end defvr
|
||
|
||
|
||
@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
|
||
En la mayor parte de casos, los paquetes instalados con Guix contienen
|
||
documentación. Hay dos formatos principales de documentación: ``Info'', un
|
||
formato hipertextual navegable usado para software GNU, y ``páginas de
|
||
manual'' (o ``páginas man''), la documentación lineal encontrada
|
||
tradicionalmente en Unix. Se accede a los manuales Info con la orden
|
||
@command{info} o con Emacs, y las páginas man con @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
|
||
La orden siguiente busca por la misma palabra clave en páginas man:
|
||
|
||
@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 Instalación de ficheros de depuración
|
||
@chapter Instalación de ficheros de depuración
|
||
|
||
@cindex ficheros 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.
|
||
|
||
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
|
||
ficheros separados. GDB es capaz entonces de cargar la información de
|
||
depuración desde esos ficheros, 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 package -i glibc:debug guile:debug
|
||
@end example
|
||
|
||
Se debe decir entonces a GDB que busque los ficheros de depuración en el
|
||
perfil de la usuaria, proporcionando un valor a la variable
|
||
@code{debug-file-directory} (considere hacerlo en el fichero
|
||
@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
|
||
ficheros @code{.debug} bajo @file{~/.guix-profile/lib/debug}.
|
||
|
||
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}. Esto puede cambiarse por una
|
||
activación implícita en el futuro si nuestras granjas de construcción pueden
|
||
soportar la carga. Para comprobar si un paquete tiene una salida
|
||
@code{debug}, use @command{guix package --list-available} (@pxref{Invocación de guix package}).
|
||
|
||
|
||
@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 parchearse. 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: probably vulnerable to CVE-2015-1781, CVE-2015-7547
|
||
gnu/packages/gcc.scm:334:2: gcc@@4.9.3: probably vulnerable to CVE-2015-5276
|
||
gnu/packages/image.scm:312:2: openjpeg@@2.1.0: probably vulnerable to CVE-2016-1923, CVE-2016-1924
|
||
@dots{}
|
||
@end smallexample
|
||
|
||
@xref{Invocación de guix lint}, para más información.
|
||
|
||
@quotation Nota
|
||
En la versión @value{VERSION}, esta característica descrita a continuación
|
||
se considera en estado ``beta''.
|
||
@end quotation
|
||
|
||
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
|
||
For instance, suppose a security update needs to be applied to Bash. Guix
|
||
developers will provide a package definition for the ``fixed'' Bash, say
|
||
@code{bash-fixed}, in the usual way (@pxref{Definición de paquetes}). Then, the
|
||
original package definition is augmented with a @code{replacement} field
|
||
pointing to the package containing the bug fix:
|
||
|
||
@example
|
||
(define bash
|
||
(package
|
||
(name "bash")
|
||
;; @dots{}
|
||
(replacement bash-fixed)))
|
||
@end example
|
||
|
||
From there on, any package depending directly or indirectly on Bash---as
|
||
reported by @command{guix gc --requisites} (@pxref{Invocación de guix gc})---that
|
||
is installed is automatically ``rewritten'' to refer to @code{bash-fixed}
|
||
instead of @code{bash}. This grafting process takes time proportional to
|
||
the size of the package, usually less than a minute for an ``average''
|
||
package on a recent machine. Grafting is recursive: when an indirect
|
||
dependency requires grafting, then grafting ``propagates'' up to the package
|
||
that the user is installing.
|
||
|
||
Currently, the length of the name and version of the graft and that of the
|
||
package it replaces (@code{bash-fixed} and @code{bash} in the example above)
|
||
must be equal. This restriction mostly comes from the fact that grafting
|
||
works by patching files, including binary files, directly. Other
|
||
restrictions may apply: for instance, when adding a graft to a package
|
||
providing a shared library, the original shared library and its replacement
|
||
must have the same @code{SONAME} and be binary-compatible.
|
||
|
||
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 fichero del almacén de la versión original de Bash,
|
||
mientras que:
|
||
|
||
@example
|
||
guix build bash
|
||
@end example
|
||
|
||
@noindent
|
||
devuelve el nombre de fichero 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 fichero 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 mi-configuracion.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
|
||
|
||
El lanzamiento inicial en nuestro contexto hace referencia a cómo la
|
||
distribución se construye ``de la nada''. Recuerde que el entorno de
|
||
construcción de una derivación no contiene más que sus entradas declaradas
|
||
(@pxref{Introducción}). Por lo que hay un evidente problema ``del huevo y la
|
||
gallina'': ¿cómo se construye el primer paquete? ¿Cómo se compila el primer
|
||
compilador? Fíjese que esta es una cuestión de interés únicamente para la
|
||
hacker curiosa, no para la usuaria normal, así que puede pasar por encima
|
||
está sección sin ninguna vergüenza si se considera una ``usuaria normal''.
|
||
|
||
@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 si se necesita (más sobre esto más adelante).
|
||
|
||
@unnumberedsec 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 > t.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 ficheros
|
||
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
|
||
@code{.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}, etcétera, 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 ficheros 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)' | dot -Tps > t.ps
|
||
@end example
|
||
|
||
@noindent
|
||
produce 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 <http://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 @code{--target} igual a
|
||
@code{--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, 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 (Guile, Binutils, GCC, libc, 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 generados son aquellos que son referenciados 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, Guile, etc. ¡Eso
|
||
es un montón de código binario! ¿Por qué es eso un problema? Es un problema
|
||
porque esos chorros 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{http://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. ¡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
|
||
|
||
Para que esto funcione, el procedimiento @code{glibc-dynamic-linker} en
|
||
@code{(gnu packages bootstrap)} debe aumentarse para devolver el nombre de
|
||
fichero correcto para el enlazador dinámico de libc en dicha plataforma; de
|
||
igual manera, @code{system->linux-architecture} en @code{(gnu packages
|
||
linux)} debe modificarse para la nueva plataforma.
|
||
|
||
Una vez construidos, el módulo @code{(gnu packages bootstrap)} debe ser
|
||
actualizado para hacer referencia a estos binarios en la plataforma
|
||
deseada. Esto es, los hash y las URL de los archivadores del lanzamiento
|
||
inicial de la nueva plataforma deben añadirse junto a aquellos de las
|
||
plataformas disponibles actualmente. El archivador tar del Guile usado para
|
||
el lanzamiento inicial se trata de forma especial: se espera que esté
|
||
disponible localmente, y @file{gnu/local.mk} tiene reglas que lo descargan
|
||
para las arquitecturas disponibles; se debe añadir una regla para la nueva
|
||
plataforma también.
|
||
|
||
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 @code{--with-abi} (vea @code{gcc.scm} para ejemplos de
|
||
como manejar este caso). En segundo lugar, algunos de los paquetes
|
||
necesarios pueden fallar en su construcción para dicha plataforma. Por
|
||
último, los binarios generados pueden estar defectuosos por alguna razón.
|
||
|
||
@c *********************************************************************
|
||
@include contributing.es.texi
|
||
|
||
@c *********************************************************************
|
||
@node Reconocimientos
|
||
@chapter Reconocimientos
|
||
|
||
Guix está basado en el @uref{http://nixops.org/nix, gestor de paquetes Nix},
|
||
que fue diseñado e implementado por Eelco Dolstra, con contribuciones de
|
||
otra gente (véase el fichero @file{nix/AUTHORS} en Guix). Nix fue pionero en
|
||
la gestión de paquetes funcional, y promovió características sin
|
||
precedentes, como las actualizaciones de paquetes transaccionales y vuelta
|
||
atrás, 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 fichero @file{AUTHORS} en Guix para más información sobre
|
||
esa gente maja. El fichero @file{THANKS} enumera personas que han ayudado
|
||
informando de errores, haciendose cargo de la infraestructura,
|
||
proporcionando arte y temas, haciendo 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:
|