Siguiente: , Subir: Configuración del sistema   [Índice general][Índice]


10.1 Uso de la configuración del sistema

El sistema operativo se configura proporcionando una declaración operating-system en un archivo que pueda ser proporcionado a la orden guix system (véase 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:

;; This is an operating system configuration template
;; for a "bare bones" setup, with no X11 display server.

(use-modules (gnu))
(use-service-modules networking ssh)
(use-package-modules screen ssh)

(operating-system
  (host-name "komputilo")
  (timezone "Europe/Berlin")
  (locale "en_US.utf8")

  ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
  ;; target hard disk, and "my-root" is the label of the target
  ;; root file system.
  (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (target "/dev/sdX")))
  (file-systems (cons (file-system
                        (device (file-system-label "my-root"))
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))

  ;; This is where user accounts are specified.  The "root"
  ;; account is implicit, and is initially created with the
  ;; empty password.
  (users (cons (user-account
                (name "alice")
                (comment "Bob's sister")
                (group "users")

                ;; Adding the account to the "wheel" group
                ;; makes it a sudoer.  Adding it to "audio"
                ;; and "video" allows the user to play sound
                ;; and access the webcam.
                (supplementary-groups '("wheel"
                                        "audio" "video")))
               %base-user-accounts))

  ;; Globally-installed packages.
  (packages (cons screen %base-packages))

  ;; Add services to the baseline: a DHCP client and
  ;; an SSH server.
  (services (append (list (service dhcp-client-service-type)
                          (service openssh-service-type
                                   (openssh-configuration
                                    (openssh openssh-sans-x)
                                    (port-number 2222))))
                    %base-services)))

Este ejemplo debería ser auto-descriptivo. Algunos de los campos definidos anteriormente, como host-name y bootloader, son necesarios. Otros como packages y 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 (véase Referencia de operating-system, para detalles acerca de todos los campos disponibles), y cómo instanciar el sistema operativo usando guix system.

Cargador de arranque

El campo 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 Interfaz Unificada Extensible de Firmware (UEFI) para arrancar. En ese caso, el capo bootloader debe contener algo parecido a esto:

(bootloader-configuration
  (bootloader grub-efi-bootloader)
  (target "/boot/efi"))

Véase Configuración del gestor de arranque, para más información sobre las opciones de configuración disponibles.

Paquetes visibles globalmente

El campo 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 PATH de cada usuaria—sin tener en cuenta los perfiles de cada usuaria (véase Invocación de guix package). La variable %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, find, grep, etc. El ejemplo previo se añade GNU Screen a estos, tomado del módulo (gnu packages screen) (véase Módulos de paquetes). La sintaxis (list package output) puede usarse para añadir una salida específica de un paquete:

(use-modules (gnu packages))
(use-modules (gnu packages dns))

(operating-system
  ;; ...
  (packages (cons (list bind "utils")
                  %base-packages)))

Referirse a los paquetes por nombre de variable, como antes a 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 use-package-modules. Para evitar esto, se puede usar el procedimiento specification->package del módulo (gnu packages), que devuelve el mejor paquete para un nombre dado, o nombre y versión:

(use-modules (gnu packages))

(operating-system
  ;; ...
  (packages (append (map specification->package
                         '("tcpdump" "htop" "gnupg@2.0"))
                    %base-packages)))

Servicios del sistema

El campo services enumera los servicios del sistema disponibles cuando el sistema arranque (véase Servicios). La declaración operating-system previa especifica que, además de los servicios básicos, queremos que el daemon de shell seguro OpenSSH espere conexiones por el puerto 2222 (véase openssh-service-type). En su implementación, openssh-service-type prepara todo para que sshd se inicie con las opciones de la línea de órdenes adecuadas, posiblemente generando bajo demanda los archivos de configuración necesarios (véase Definición de servicios).

De manera ocasional, en vez de usar los servicios básicos tal y como vienen, puede querer personalizarlos. Para hacerlo, use modify-services (véase modify-services) para modificar la lista.

Por ejemplo, supongamos que quiere modificar guix-daemon y Mingetty (el punto de acceso al sistema por consola) en la lista %base-services (véase %base-services). Para hacerlo, puede escribir lo siguiente en su declaración de sistema operativo:

(define %mis-servicios
  ;; Mi propia lista de servicios
  (modify-services %base-services
    (guix-service-type config =>
                       (guix-configuration
                        (inherit config)
                        ;; Obtenemos sustituciones desde example.org.
                        (substitute-urls
                          (list "https://example.org/guix"
                                "https://ci.guix.gnu.org"))))
    (mingetty-service-type config =>
                           (mingetty-configuration
                            (inherit config)
                            ;; Ingresamos automáticamente con
                            ;; la cuenta "guest".
                            (auto-login "guest")))))

(operating-system
  ;; …
  (services %mis-servicios))

Esto modifica la configuración—es decir, los parámetros de los servicios—de la instancia guix-service-type, y de todas las instancias de mingetty-service-type en la lista %base-services. Observe cómo se consigue: primero, enlazamos la configuración actual al identificador config en el cuerpo, y entonces escribimos el cuerpo de manera que evalúe a la configuración deseada. En particular, fíjese como se usa inherit para crear una nueva configuración que tiene los mismos valores que la configuración antigua, pero con unas pocas modificaciones.

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 F1), gestión de red, gestión de energía y más, podría ser así:

;; This is an operating system configuration template
;; for a "desktop" setup with GNOME and Xfce where the
;; root partition is encrypted with LUKS.

(use-modules (gnu) (gnu system nss))
(use-service-modules desktop xorg)
(use-package-modules certs gnome)

(operating-system
  (host-name "antelope")
  (timezone "Europe/Paris")
  (locale "en_US.utf8")

  ;; Choose US English keyboard layout.  The "altgr-intl"
  ;; variant provides dead keys for accented characters.
  (keyboard-layout (keyboard-layout "us" "altgr-intl"))

  ;; Use the UEFI variant of GRUB with the EFI System
  ;; Partition mounted on /boot/efi.
  (bootloader (bootloader-configuration
                (bootloader grub-efi-bootloader)
                (target "/boot/efi")
                (keyboard-layout keyboard-layout)))

  ;; Specify a mapped device for the encrypted root partition.
  ;; The UUID is that returned by 'cryptsetup luksUUID'.
  (mapped-devices
   (list (mapped-device
          (source (uuid "12345678-1234-1234-1234-123456789abc"))
          (target "my-root")
          (type luks-device-mapping))))

  (file-systems (append
                 (list (file-system
                         (device (file-system-label "my-root"))
                         (mount-point "/")
                         (type "ext4")
                         (dependencies mapped-devices))
                       (file-system
                         (device (uuid "1234-ABCD" 'fat))
                         (mount-point "/boot/efi")
                         (type "vfat")))
                 %base-file-systems))

  ;; Create user `bob' with `alice' as its initial password.
  (users (cons (user-account
                (name "bob")
                (comment "Alice's brother")
                (password (crypt "alice" "$6$abc"))
                (group "users")
                (supplementary-groups '("wheel" "netdev"
                                        "audio" "video")))
               %base-user-accounts))

  ;; This is where we specify system-wide packages.
  (packages (append (list
                     ;; for HTTPS access
                     nss-certs
                     ;; for user mounts
                     gvfs)
                    %base-packages))

  ;; Add GNOME and Xfce---we can choose at the log-in screen
  ;; by clicking the gear.  Use the "desktop" services, which
  ;; include the X11 log-in service, networking with
  ;; NetworkManager, and more.
  (services (append (list (service gnome-desktop-service-type)
                          (service xfce-desktop-service-type)
                          (set-xorg-configuration
                           (xorg-configuration
                            (keyboard-layout keyboard-layout))))
                    %desktop-services))

  ;; Allow resolution of '.local' host names with mDNS.
  (name-service-switch %mdns-host-lookup-nss))

Un sistema gráfico con una selección de gestores de ventanas ligeros en vez de entornos de escritorio completos podría ser así:

;; This is an operating system configuration template
;; for a "desktop" setup without full-blown desktop
;; environments.

(use-modules (gnu) (gnu system nss))
(use-service-modules desktop)
(use-package-modules bootloaders certs emacs emacs-xyz ratpoison suckless wm
                     xorg)

(operating-system
  (host-name "antelope")
  (timezone "Europe/Paris")
  (locale "en_US.utf8")

  ;; Use the UEFI variant of GRUB with the EFI System
  ;; Partition mounted on /boot/efi.
  (bootloader (bootloader-configuration
                (bootloader grub-efi-bootloader)
                (target "/boot/efi")))

  ;; Assume the target root file system is labelled "my-root",
  ;; and the EFI System Partition has UUID 1234-ABCD.
  (file-systems (append
                 (list (file-system
                         (device (file-system-label "my-root"))
                         (mount-point "/")
                         (type "ext4"))
                       (file-system
                         (device (uuid "1234-ABCD" 'fat))
                         (mount-point "/boot/efi")
                         (type "vfat")))
                 %base-file-systems))

  (users (cons (user-account
                (name "alice")
                (comment "Bob's sister")
                (group "users")
                (supplementary-groups '("wheel" "netdev"
                                        "audio" "video")))
               %base-user-accounts))

  ;; Add a bunch of window managers; we can choose one at
  ;; the log-in screen with F1.
  (packages (append (list
                     ;; window managers
                     ratpoison i3-wm i3status dmenu
                     emacs emacs-exwm emacs-desktop-environment
                     ;; terminal emulator
                     xterm
                     ;; for HTTPS access
                     nss-certs)
                    %base-packages))

  ;; Use the "desktop" services, which include the X11
  ;; log-in service, networking with NetworkManager, and more.
  (services %desktop-services)

  ;; Allow resolution of '.local' host names with mDNS.
  (name-service-switch %mdns-host-lookup-nss))

Este ejemplo se refiere al sistema de archivos /boot/efi por su UUID 1234-ABCD. Substituya este UUID con el UUID correcto en su sistema, como el devuelto por la orden blkid.

Véase Servicios de escritorio, para la lista exacta de servicios proporcionados por %desktop-services. Véase Certificados X.509, para información sobre el paquete nss-certs usado aquí.

De nuevo, %desktop-services es simplemente una lista de objetos de servicios. Si desea borrar servicios de aquí, puede hacerlo usando procedimientos de filtrado de listas (véase SRFI-1 Filtering and Partitioning en GNU Guile Reference Manual). Por ejemplo, la siguiente expresión devuelve una lista que contiene todos los servicios en %desktop-services excepto el servicio Avahi:

(remove (lambda (service)
          (eq? (service-kind service) avahi-service-type))
        %desktop-services)

Instanciación del sistema

Asumiendo que la declaración de operating-system se encuentra en el archivo mi-configuración-del-sistema.scm, la orden guix system mi-conf-del-sistema.scm instancia esa configuración, y la convierte en la entrada predeterminada de GRUB en el arranque (véase Invocación de guix system).

La manera habitual de cambiar la configuración del sistema es actualizar este archivo y volver a ejecutar guix system reconfigure. Nunca se deberían tocar los archivos en /etc o ejecutar órdenes que modifiquen el estado del sistema como useradd o 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.

Hablando de vuelta atrás, cada vez que ejecuta guix system reconfigure se crea una nueva generación del sistema—sin modificar o borrar generaciones previas. Las generaciones previas tienen una entrada en el menú del cargador de arranque, lo que permite arrancarlas en caso de que algo funcionase mal en las últimas generaciones. Tranquilizador, ¿no? La orden 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 guix system roll-back y guix system switch-generation.

Aunque la orden 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 guix system roll-back), ya que la operación puede sobreescribir una generación posterior (véase Invocación de guix system).

La interfaz programática

A nivel Scheme, el grueso de una declaración operating-system se instancia con el siguiente procedimiento monádico (véase La mónada del almacén):

Procedimiento monádico: operating-system-derivation so

Devuelve una derivación que construye so, un objeto operating-system (véase Derivaciones).

La salida de la derivación es un único directorio que hace referencia a todos los paquetes, archivos de configuración y otros archivos auxiliares necesarios para instanciar so.

Este procedimiento se proporciona por el módulo (gnu system). Junto con (gnu services) (véase Servicios), este módulo contiene los entresijos del sistema Guix. ¡Asegúrese de echarle un vistazo!


Siguiente: , Subir: Configuración del sistema   [Índice general][Índice]